diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index dea03329..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,166 +0,0 @@ -/**************************************************************************************************************************************************************** - * Grunt File Usage: - **************************************************************************************************************************************************************** - * - * Export Documentation, TypeScript and Minify: - * - * grunt - * - * Export TypeScript and Minify: - * - * grunt lib - * - ***************************************************************************************************************************************************************** - * Options - ***************************************************************************************************************************************************************** - * - * Export lib version, defaults to 'next' if not specified: - * - * grunt --libversion=0.0.1 - * - **************************************************************************************************************************************************************** - * Installing Dependencies: - **************************************************************************************************************************************************************** - * - * To install Grunt - * - * 1) install the grunt cli: - * - * npm install -g grunt-cli - * - * 2) install the dependencies used by the build script: - * - * OSX : sudo npm install - * Windows: npm install - * - ****************************************************************************************************************************************************************/ - -module.exports = function(grunt) { - - - var version = grunt.option('libversion') || 'next'; // Check for a version number | defaults to next if not specified - - //-------------------------------------------------------------------------------------------------------------- - // Plugins used by Grunt Script - //-------------------------------------------------------------------------------------------------------------- - - grunt.loadNpmTasks("grunt-ts"); - grunt.loadNpmTasks('grunt-contrib-yuidoc'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-concat'); - - //-------------------------------------------------------------------------------------------------------------- - // Grunt Config - //-------------------------------------------------------------------------------------------------------------- - - grunt.initConfig( { - - //-------------------------------------------------------------------------------------------------------------- - // Read the package.json - //-------------------------------------------------------------------------------------------------------------- - - pkg: grunt.file.readJSON('package.json'), - - //-------------------------------------------------------------------------------------------------------------- - // Metadata / Configuration - //-------------------------------------------------------------------------------------------------------------- - - meta: { - - tsFile: 'src/AwayJSCore.ts', // TypeScript export source - tsPath: 'src/', // TypeScript source folder - - tsExportFile: 'build/awayjs-core.' + version + '.js', // JavaScript export target - tsExportUglyFile: 'build/awayjs-core.' + version + '.min.js', // JavaScript minified target - - tsExportFolder: 'build/', // Export folder - docsPath: 'docs/' // Documentation export path - - }, - - //-------------------------------------------------------------------------------------------------------------- - // Export and compile TypeScript - //-------------------------------------------------------------------------------------------------------------- - - ts: { - - MainJsFile: { - src: ['<%= meta.tsFile %>'], - out: '<%= meta.tsExportFile %>', - options: { - target: 'es5', - sourcemap: true, - declaration: true, - comments: true - } - } - }, - - //-------------------------------------------------------------------------------------------------------------- - // Concatenate file ( currently not used ) - //-------------------------------------------------------------------------------------------------------------- - - concat: { - options: { - // define a string to put between each file in the concatenated output - separator: ';' - }, - dist: { - // the files to concatenate - src: [ '<%= meta.tsExportFile %>' ], - // the location of the resulting JS file - dest: '' - - } - }, - - //-------------------------------------------------------------------------------------------------------------- - // Minify JavaScript source - //-------------------------------------------------------------------------------------------------------------- - - uglify: { - - options: { - mangle: false - }, - my_target: { - files: { - '<%= meta.tsExportUglyFile %>': [ '<%= meta.tsExportFile %>' ] - } - } - - }, - - //-------------------------------------------------------------------------------------------------------------- - // Export Documentation ( using multi export JS files ) - //-------------------------------------------------------------------------------------------------------------- - - yuidoc: { - - compile: { - - name: '<%= pkg.name %>', - description: '<%= pkg.description %>', - version: '<%= pkg.version %>', - url: '<%= pkg.homepage %>', - - options: { - extension:'.ts', - paths: '<%= meta.tsPath %>', - outdir: '<%= meta.docsPath %>' - } - } - } - - } ); - - //-------------------------------------------------------------------------------------------------------------- - // Register Grunt tasks - //-------------------------------------------------------------------------------------------------------------- - - grunt.option.init(); - grunt.registerTask('default', ['ts' , 'uglify' , 'yuidoc' ]); // Default Tasks - grunt.registerTask('lib', ['ts' , 'uglify' ]); // Export TypeScript only - -}; - diff --git a/build/awayjs-core.d.ts b/build/awayjs-core.d.ts new file mode 100755 index 00000000..e8c4652c --- /dev/null +++ b/build/awayjs-core.d.ts @@ -0,0 +1,16386 @@ +declare module "awayjs-core/lib/animators/IAnimationSet" { + import AnimationNodeBase = require("awayjs-core/lib/animators/nodes/AnimationNodeBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + /** + * Provides an interface for data set classes that hold animation data for use in animator classes. + * + * @see away.animators.AnimatorBase + */ + interface IAnimationSet extends IAsset { + /** + * Check to determine whether a state is registered in the animation set under the given name. + * + * @param stateName The name of the animation state object to be checked. + */ + hasAnimation(name: string): boolean; + /** + * Retrieves the animation state object registered in the animation data set under the given name. + * + * @param stateName The name of the animation state object to be retrieved. + */ + getAnimation(name: string): AnimationNodeBase; + /** + * Indicates whether the properties of the animation data contained within the set combined with + * the vertex registers aslready in use on shading materials allows the animation data to utilise + * GPU calls. + */ + usesCPU: boolean; + /** + * Called by the material to reset the GPU indicator before testing whether register space in the shader + * is available for running GPU-based animation code. + * + * @private + */ + resetGPUCompatibility(): any; + /** + * Called by the animator to void the GPU indicator when register space in the shader + * is no longer available for running GPU-based animation code. + * + * @private + */ + cancelGPUCompatibility(): any; + } + export = IAnimationSet; + +} +declare module "awayjs-core/lib/animators/IAnimator" { + import IAnimationSet = require("awayjs-core/lib/animators/IAnimationSet"); + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * Provides an interface for animator classes that control animation output from a data set subtype of AnimationSetBase. + * + * @see away.animators.IAnimationSet + */ + interface IAnimator extends IAsset { + /** + * + */ + animationSet: IAnimationSet; + /** + * + */ + clone(): IAnimator; + /** + * + */ + dispose(): any; + /** + * Used by the entity object to which the animator is applied, registers the owner for internal use. + * + * @private + */ + addOwner(mesh: IEntity): any; + /** + * Used by the mesh object from which the animator is removed, unregisters the owner for internal use. + * + * @private + */ + removeOwner(mesh: IEntity): any; + /** + * //TODO + * + * @param sourceSubGeometry + */ + getRenderableSubGeometry(renderable: IRenderable, sourceSubGeometry: SubGeometryBase): SubGeometryBase; + } + export = IAnimator; + +} +declare module "awayjs-core/lib/bounds/AxisAlignedBoundingBox" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * AxisAlignedBoundingBox represents a bounding box volume that has its planes aligned to the local coordinate axes of the bounded object. + * This is useful for most meshes. + */ + class AxisAlignedBoundingBox extends BoundingVolumeBase { + private _centerX; + private _centerY; + private _centerZ; + private _halfExtentsX; + private _halfExtentsY; + private _halfExtentsZ; + /** + * Creates a new AxisAlignedBoundingBox object. + */ + constructor(); + /** + * @inheritDoc + */ + public nullify(): void; + /** + * @inheritDoc + */ + public isInFrustum(planes: Plane3D[], numPlanes: number): boolean; + public rayIntersection(position: Vector3D, direction: Vector3D, targetNormal: Vector3D): number; + /** + * @inheritDoc + */ + public containsPoint(position: Vector3D): boolean; + /** + * @inheritDoc + */ + public fromExtremes(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): void; + /** + * @inheritDoc + */ + public clone(): BoundingVolumeBase; + public halfExtentsX : number; + public halfExtentsY : number; + public halfExtentsZ : number; + /** + * Finds the closest point on the bounding volume to another given point. This can be used for maximum error calculations for content within a given bound. + * @param point The point for which to find the closest point on the bounding volume + * @param target An optional Vector3D to store the result to prevent creating a new object. + * @return + */ + public closestPointToPoint(point: Vector3D, target?: Vector3D): Vector3D; + public pUpdateBoundingRenderable(): void; + public pCreateBoundingEntity(): IEntity; + public classifyToPlane(plane: Plane3D): number; + public transformFrom(bounds: BoundingVolumeBase, matrix: Matrix3D): void; + } + export = AxisAlignedBoundingBox; + +} +declare module "awayjs-core/lib/bounds/BoundingSphere" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + class BoundingSphere extends BoundingVolumeBase { + private _radius; + private _centerX; + private _centerY; + private _centerZ; + constructor(); + public radius : number; + public nullify(): void; + public isInFrustum(planes: Plane3D[], numPlanes: number): boolean; + public fromSphere(center: Vector3D, radius: number): void; + public fromExtremes(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): void; + public clone(): BoundingVolumeBase; + public rayIntersection(position: Vector3D, direction: Vector3D, targetNormal: Vector3D): number; + public containsPoint(position: Vector3D): boolean; + public pUpdateBoundingEntity(): void; + public pCreateBoundingEntity(): IEntity; + public classifyToPlane(plane: Plane3D): number; + public transformFrom(bounds: BoundingVolumeBase, matrix: Matrix3D): void; + } + export = BoundingSphere; + +} +declare module "awayjs-core/lib/bounds/BoundingVolumeBase" { + import Geometry = require("awayjs-core/lib/core/base/Geometry"); + import Box = require("awayjs-core/lib/core/geom/Box"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + class BoundingVolumeBase { + public _aabb: Box; + public _pAabbPoints: number[]; + public _pAabbPointsDirty: boolean; + public _pBoundingEntity: IEntity; + constructor(); + public aabb : Box; + public aabbPoints : number[]; + public boundingEntity : IEntity; + public nullify(): void; + public disposeRenderable(): void; + public fromVertices(vertices: number[]): void; + /** + * Updates the bounds to fit a Geometry object. + * + * @param geometry The Geometry object to be bounded. + */ + public fromGeometry(geometry: Geometry): void; + public fromSphere(center: Vector3D, radius: number): void; + public fromExtremes(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): void; + public isInFrustum(planes: Plane3D[], numPlanes: number): boolean; + public overlaps(bounds: BoundingVolumeBase): boolean; + public clone(): BoundingVolumeBase; + public rayIntersection(position: Vector3D, direction: Vector3D, targetNormal: Vector3D): number; + public containsPoint(position: Vector3D): boolean; + public pUpdateAABBPoints(): void; + public pUpdateBoundingEntity(): void; + public pCreateBoundingEntity(): IEntity; + public classifyToPlane(plane: Plane3D): number; + public transformFrom(bounds: BoundingVolumeBase, matrix: Matrix3D): void; + } + export = BoundingVolumeBase; + +} +declare module "awayjs-core/lib/bounds/NullBounds" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + class NullBounds extends BoundingVolumeBase { + private _alwaysIn; + constructor(alwaysIn?: boolean); + public clone(): BoundingVolumeBase; + public pCreateBoundingEntity(): IEntity; + public isInFrustum(planes: Plane3D[], numPlanes: number): boolean; + public fromSphere(center: Vector3D, radius: number): void; + public fromExtremes(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): void; + public classifyToPlane(plane: Plane3D): number; + public transformFrom(bounds: BoundingVolumeBase, matrix: Matrix3D): void; + } + export = NullBounds; + +} +declare module "awayjs-core/lib/containers/DisplayObjectContainer" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Point = require("awayjs-core/lib/core/geom/Point"); + import Partition = require("awayjs-core/lib/core/partition/Partition"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + /** + * The DisplayObjectContainer class is the base class for all objects that can + * serve as display object containers on the display list. The display list + * manages all objects displayed in the Flash runtimes. Use the + * DisplayObjectContainer class to arrange the display objects in the display + * list. Each DisplayObjectContainer object has its own child list for + * organizing the z-order of the objects. The z-order is the front-to-back + * order that determines which object is drawn in front, which is behind, and + * so on. + * + *

DisplayObject is an abstract base class; therefore, you cannot call + * DisplayObject directly. Invoking new DisplayObject() throws an + * ArgumentError exception.

+ * The DisplayObjectContainer class is an abstract base class for all objects + * that can contain child objects. It cannot be instantiated directly; calling + * the new DisplayObjectContainer() constructor throws an + * ArgumentError exception. + * + *

For more information, see the "Display Programming" chapter of the + * ActionScript 3.0 Developer's Guide.

+ */ + class DisplayObjectContainer extends DisplayObject implements IAsset { + private _mouseChildren; + private _children; + public _iIsRoot: boolean; + /** + * + */ + public assetType : string; + /** + * Determines whether or not the children of the object are mouse, or user + * input device, enabled. If an object is enabled, a user can interact with + * it by using a mouse or user input device. The default is + * true. + * + *

This property is useful when you create a button with an instance of + * the Sprite class(instead of using the SimpleButton class). When you use a + * Sprite instance to create a button, you can choose to decorate the button + * by using the addChild() method to add additional Sprite + * instances. This process can cause unexpected behavior with mouse events + * because the Sprite instances you add as children can become the target + * object of a mouse event when you expect the parent instance to be the + * target object. To ensure that the parent instance serves as the target + * objects for mouse events, you can set the mouseChildren + * property of the parent instance to false.

+ * + *

No event is dispatched by setting this property. You must use the + * addEventListener() method to create interactive + * functionality.

+ */ + public mouseChildren : boolean; + /** + * Returns the number of children of this object. + */ + public numChildren : number; + /** + * Determines whether the children of the object are tab enabled. Enables or + * disables tabbing for the children of the object. The default is + * true. + * + *

Note: Do not use the tabChildren property with + * Flex. Instead, use the + * mx.core.UIComponent.hasFocusableChildren property.

+ * + * @throws IllegalOperationError Calling this property of the Stage object + * throws an exception. The Stage object does + * not implement this property. + */ + public tabChildren: boolean; + /** + * Calling the new DisplayObjectContainer() constructor throws + * an ArgumentError exception. You can, however, call + * constructors for the following subclasses of DisplayObjectContainer: + * + */ + constructor(); + /** + * Adds a child DisplayObject instance to this DisplayObjectContainer + * instance. The child is added to the front(top) of all other children in + * this DisplayObjectContainer instance.(To add a child to a specific index + * position, use the addChildAt() method.) + * + *

If you add a child object that already has a different display object + * container as a parent, the object is removed from the child list of the + * other display object container.

+ * + *

Note: The command stage.addChild() can cause + * problems with a published SWF file, including security problems and + * conflicts with other loaded SWF files. There is only one Stage within a + * Flash runtime instance, no matter how many SWF files you load into the + * runtime. So, generally, objects should not be added to the Stage, + * directly, at all. The only object the Stage should contain is the root + * object. Create a DisplayObjectContainer to contain all of the items on the + * display list. Then, if necessary, add that DisplayObjectContainer instance + * to the Stage.

+ * + * @param child The DisplayObject instance to add as a child of this + * DisplayObjectContainer instance. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child is the same as the parent. Also + * throws if the caller is a child(or grandchild etc.) + * of the child being added. + * @event added Dispatched when a display object is added to the display + * list. + */ + public addChild(child: DisplayObject): DisplayObject; + /** + * Adds a child DisplayObject instance to this DisplayObjectContainer + * instance. The child is added at the index position specified. An index of + * 0 represents the back(bottom) of the display list for this + * DisplayObjectContainer object. + * + *

For example, the following example shows three display objects, labeled + * a, b, and c, at index positions 0, 2, and 1, respectively:

+ * + *

If you add a child object that already has a different display object + * container as a parent, the object is removed from the child list of the + * other display object container.

+ * + * @param child The DisplayObject instance to add as a child of this + * DisplayObjectContainer instance. + * @param index The index position to which the child is added. If you + * specify a currently occupied index position, the child object + * that exists at that position and all higher positions are + * moved up one position in the child list. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child is the same as the parent. Also + * throws if the caller is a child(or grandchild etc.) + * of the child being added. + * @throws RangeError Throws if the index position does not exist in the + * child list. + * @event added Dispatched when a display object is added to the display + * list. + */ + public addChildAt(child: DisplayObject, index: number): DisplayObject; + public addChildren(...childarray: DisplayObject[]): void; + /** + * + */ + public clone(): DisplayObject; + /** + * Determines whether the specified display object is a child of the + * DisplayObjectContainer instance or the instance itself. The search + * includes the entire display list including this DisplayObjectContainer + * instance. Grandchildren, great-grandchildren, and so on each return + * true. + * + * @param child The child object to test. + * @return true if the child object is a child of + * the DisplayObjectContainer or the container itself; otherwise + * false. + */ + public contains(child: DisplayObject): boolean; + /** + * + */ + public disposeWithChildren(): void; + /** + * Returns the child display object instance that exists at the specified + * index. + * + * @param index The index position of the child object. + * @return The child display object at the specified index position. + * @throws RangeError Throws if the index does not exist in the child + * list. + */ + public getChildAt(index: number): DisplayObject; + /** + * Returns the child display object that exists with the specified name. If + * more that one child display object has the specified name, the method + * returns the first object in the child list. + * + *

The getChildAt() method is faster than the + * getChildByName() method. The getChildAt() method + * accesses a child from a cached array, whereas the + * getChildByName() method has to traverse a linked list to + * access a child.

+ * + * @param name The name of the child to return. + * @return The child display object with the specified name. + */ + public getChildByName(name: string): DisplayObject; + /** + * Returns the index position of a child DisplayObject instance. + * + * @param child The DisplayObject instance to identify. + * @return The index position of the child display object to identify. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + */ + public getChildIndex(child: DisplayObject): number; + /** + * Returns an array of objects that lie under the specified point and are + * children(or grandchildren, and so on) of this DisplayObjectContainer + * instance. Any child objects that are inaccessible for security reasons are + * omitted from the returned array. To determine whether this security + * restriction affects the returned array, call the + * areInaccessibleObjectsUnderPoint() method. + * + *

The point parameter is in the coordinate space of the + * Stage, which may differ from the coordinate space of the display object + * container(unless the display object container is the Stage). You can use + * the globalToLocal() and the localToGlobal() + * methods to convert points between these coordinate spaces.

+ * + * @param point The point under which to look. + * @return An array of objects that lie under the specified point and are + * children(or grandchildren, and so on) of this + * DisplayObjectContainer instance. + */ + public getObjectsUnderPoint(point: Point): DisplayObject[]; + /** + * Removes the specified child DisplayObject instance from the + * child list of the DisplayObjectContainer instance. The parent + * property of the removed child is set to null , and the object + * is garbage collected if no other references to the child exist. The index + * positions of any display objects above the child in the + * DisplayObjectContainer are decreased by 1. + * + *

The garbage collector reallocates unused memory space. When a variable + * or object is no longer actively referenced or stored somewhere, the + * garbage collector sweeps through and wipes out the memory space it used to + * occupy if no other references to it exist.

+ * + * @param child The DisplayObject instance to remove. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + */ + public removeChild(child: DisplayObject): DisplayObject; + /** + * Removes a child DisplayObject from the specified index + * position in the child list of the DisplayObjectContainer. The + * parent property of the removed child is set to + * null, and the object is garbage collected if no other + * references to the child exist. The index positions of any display objects + * above the child in the DisplayObjectContainer are decreased by 1. + * + *

The garbage collector reallocates unused memory space. When a variable + * or object is no longer actively referenced or stored somewhere, the + * garbage collector sweeps through and wipes out the memory space it used to + * occupy if no other references to it exist.

+ * + * @param index The child index of the DisplayObject to remove. + * @return The DisplayObject instance that was removed. + * @throws RangeError Throws if the index does not exist in the child + * list. + * @throws SecurityError This child display object belongs to a sandbox to + * which the calling object does not have access. You + * can avoid this situation by having the child movie + * call the Security.allowDomain() method. + */ + public removeChildAt(index: number): DisplayObject; + /** + * Removes all child DisplayObject instances from the child list + * of the DisplayObjectContainer instance. The parent property + * of the removed children is set to null, and the objects are + * garbage collected if no other references to the children exist. + * + * The garbage collector reallocates unused memory space. When a variable or + * object is no longer actively referenced or stored somewhere, the garbage + * collector sweeps through and wipes out the memory space it used to occupy + * if no other references to it exist. + * + * @param beginIndex The beginning position. A value smaller than 0 throws a RangeError. + * @param endIndex The ending position. A value smaller than 0 throws a RangeError. + * @throws RangeError Throws if the beginIndex or endIndex positions do + * not exist in the child list. + */ + public removeChildren(beginIndex?: number, endIndex?: number): void; + /** + * Changes the position of an existing child in the display object container. + * This affects the layering of child objects. For example, the following + * example shows three display objects, labeled a, b, and c, at index + * positions 0, 1, and 2, respectively: + * + *

When you use the setChildIndex() method and specify an + * index position that is already occupied, the only positions that change + * are those in between the display object's former and new position. All + * others will stay the same. If a child is moved to an index LOWER than its + * current index, all children in between will INCREASE by 1 for their index + * reference. If a child is moved to an index HIGHER than its current index, + * all children in between will DECREASE by 1 for their index reference. For + * example, if the display object container in the previous example is named + * container, you can swap the position of the display objects + * labeled a and b by calling the following code:

+ * + *

This code results in the following arrangement of objects:

+ * + * @param child The child DisplayObject instance for which you want to change + * the index number. + * @param index The resulting index number for the child display + * object. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + * @throws RangeError Throws if the index does not exist in the child + * list. + */ + public setChildIndex(child: DisplayObject, index: number): void; + /** + * Swaps the z-order (front-to-back order) of the two specified child + * objects. All other child objects in the display object container remain in + * the same index positions. + * + * @param child1 The first child object. + * @param child2 The second child object. + * @throws ArgumentError Throws if either child parameter is not a child of + * this object. + */ + public swapChildren(child1: DisplayObject, child2: DisplayObject): void; + /** + * Swaps the z-order(front-to-back order) of the child objects at the two + * specified index positions in the child list. All other child objects in + * the display object container remain in the same index positions. + * + * @param index1 The index position of the first child object. + * @param index2 The index position of the second child object. + * @throws RangeError If either index does not exist in the child list. + */ + public swapChildrenAt(index1: number, index2: number): void; + /** + * @protected + */ + public pInvalidateSceneTransform(): void; + /** + * @protected + */ + public _pUpdateScene(value: Scene): void; + /** + * @protected + */ + public _pUpdateImplicitMouseEnabled(value: boolean): void; + /** + * @protected + */ + public _pUpdateImplicitVisibility(value: boolean): void; + /** + * @protected + */ + public _pUpdateImplicitPartition(value: Partition): void; + /** + * @private + * + * @param child + */ + private removeChildInternal(child); + } + export = DisplayObjectContainer; + +} +declare module "awayjs-core/lib/containers/Loader" { + import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import LoaderInfo = require("awayjs-core/lib/core/base/LoaderInfo"); + import AssetLoaderContext = require("awayjs-core/lib/core/library/AssetLoaderContext"); + import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); + import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + /** + * The Loader class is used to load SWF files or image(JPG, PNG, or GIF) + * files. Use the load() method to initiate loading. The loaded + * display object is added as a child of the Loader object. + * + *

Use the URLLoader class to load text or binary data.

+ * + *

The Loader class overrides the following methods that it inherits, + * because a Loader object can only have one child display object - the + * display object that it loads. Calling the following methods throws an + * exception: addChild(), addChildAt(), + * removeChild(), removeChildAt(), and + * setChildIndex(). To remove a loaded display object, you must + * remove the Loader object from its parent DisplayObjectContainer + * child array.

+ * + *

Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes + * are not used in ActionScript 3.0. The Loader and URLLoader classes replace + * them.

+ * + *

When you use the Loader class, consider the Flash Player and Adobe AIR + * security model:

+ * + * + * + *

However, in AIR, content in the application security + * sandbox(content installed with the AIR application) are not restricted by + * these security limitations.

+ * + *

For more information related to security, see the Flash Player Developer + * Center Topic: Security.

+ * + *

When loading a SWF file from an untrusted source(such as a domain other + * than that of the Loader object's root SWF file), you may want to define a + * mask for the Loader object, to prevent the loaded content(which is a child + * of the Loader object) from drawing to portions of the Stage outside of that + * mask, as shown in the following code:

+ */ + class Loader extends DisplayObjectContainer { + private _loadingSessions; + private _useAssetLib; + private _assetLibId; + private _onResourceCompleteDelegate; + private _onAssetCompleteDelegate; + private _content; + private _contentLoaderInfo; + /** + * Contains the root display object of the SWF file or image(JPG, PNG, or + * GIF) file that was loaded by using the load() or + * loadBytes() methods. + * + * @throws SecurityError The loaded SWF file or image file belongs to a + * security sandbox to which you do not have access. + * For a loaded SWF file, you can avoid this situation + * by having the file call the + * Security.allowDomain() method or by + * having the loading file specify a + * loaderContext parameter with its + * securityDomain property set to + * SecurityDomain.currentDomain when you + * call the load() or + * loadBytes() method. + */ + public content : DisplayObject; + /** + * Returns a LoaderInfo object corresponding to the object being loaded. + * LoaderInfo objects are shared between the Loader object and the loaded + * content object. The LoaderInfo object supplies loading progress + * information and statistics about the loaded file. + * + *

Events related to the load are dispatched by the LoaderInfo object + * referenced by the contentLoaderInfo property of the Loader + * object. The contentLoaderInfo property is set to a valid + * LoaderInfo object, even before the content is loaded, so that you can add + * event listeners to the object prior to the load.

+ * + *

To detect uncaught errors that happen in a loaded SWF, use the + * Loader.uncaughtErrorEvents property, not the + * Loader.contentLoaderInfo.uncaughtErrorEvents property.

+ */ + public contentLoaderInfo : LoaderInfo; + /** + * Creates a Loader object that you can use to load files, such as SWF, JPEG, + * GIF, or PNG files. Call the load() method to load the asset + * as a child of the Loader instance. You can then add the Loader object to + * the display list(for instance, by using the addChild() + * method of a DisplayObjectContainer instance). The asset appears on the + * Stage as it loads. + * + *

You can also use a Loader instance "offlist," that is without adding it + * to a display object container on the display list. In this mode, the + * Loader instance might be used to load a SWF file that contains additional + * modules of an application.

+ * + *

To detect when the SWF file is finished loading, you can use the events + * of the LoaderInfo object associated with the + * contentLoaderInfo property of the Loader object. At that + * point, the code in the module SWF file can be executed to initialize and + * start the module. In the offlist mode, a Loader instance might also be + * used to load a SWF file that contains components or media assets. Again, + * you can use the LoaderInfo object event notifications to detect when the + * components are finished loading. At that point, the application can start + * using the components and media assets in the library of the SWF file by + * instantiating the ActionScript 3.0 classes that represent those components + * and assets.

+ * + *

To determine the status of a Loader object, monitor the following + * events that the LoaderInfo object associated with the + * contentLoaderInfo property of the Loader object:

+ * + * + */ + constructor(useAssetLibrary?: boolean, assetLibraryId?: string); + /** + * Cancels a load() method operation that is currently in + * progress for the Loader instance. + * + */ + public close(): void; + /** + * Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an + * object that is a child of this Loader object. If you load an animated GIF + * file, only the first frame is displayed. As the Loader object can contain + * only a single child, issuing a subsequent load() request + * terminates the previous request, if still pending, and commences a new + * load. + * + *

Note: In AIR 1.5 and Flash Player 10, the maximum size for a + * loaded image is 8,191 pixels in width or height, and the total number of + * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191 + * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and + * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height + * and 2,880 pixels in width.

+ * + *

A SWF file or image loaded into a Loader object inherits the position, + * rotation, and scale properties of the parent display objects of the Loader + * object.

+ * + *

Use the unload() method to remove movies or images loaded + * with this method, or to cancel a load operation that is in progress.

+ * + *

You can prevent a SWF file from using this method by setting the + * allowNetworking parameter of the the object and + * embed tags in the HTML page that contains the SWF + * content.

+ * + *

When you use this method, consider the Flash Player security model, + * which is described in the Loader class description.

+ * + *

In Flash Player 10 and later, if you use a multipart Content-Type(for + * example "multipart/form-data") that contains an upload(indicated by a + * "filename" parameter in a "content-disposition" header within the POST + * body), the POST operation is subject to the security rules applied to + * uploads:

+ * + * + * + *

Also, for any multipart Content-Type, the syntax must be valid + * (according to the RFC2046 standard). If the syntax appears to be invalid, + * the POST operation is subject to the security rules applied to + * uploads.

+ * + *

For more information related to security, see the Flash Player + * Developer Center Topic: Security.

+ * + * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG + * file to be loaded. A relative path must be relative to the + * main SWF file. Absolute URLs must include the protocol + * reference, such as http:// or file:///. Filenames cannot + * include disk drive specifications. + * @param context A LoaderContext object, which has properties that define + * the following: + * + * + *

If the context parameter is not specified + * or refers to a null object, the loaded content remains in + * its own security domain.

+ * + *

For complete details, see the description of the + * properties in the LoaderContext + * class.

+ * @param ns An optional namespace string under which the file is to be + * loaded, allowing the differentiation of two resources with + * identical assets. + * @param parser An optional parser object for translating the loaded data + * into a usable resource. If not provided, AssetLoader will + * attempt to auto-detect the file type. + * @throws IOError The digest property of the + * request object is not + * null. You should only set the + * digest property of a URLRequest + * object when calling the + * URLLoader.load() method when + * loading a SWZ file(an Adobe platform + * component). + * @throws IllegalOperationError If the requestedContentParent + * property of the context + * parameter is a Loader. + * @throws IllegalOperationError If the LoaderContext.parameters + * parameter is set to non-null and has some + * values which are not Strings. + * @throws SecurityError The value of + * LoaderContext.securityDomain + * must be either null or + * SecurityDomain.currentDomain. + * This reflects the fact that you can only + * place the loaded media in its natural + * security sandbox or your own(the latter + * requires a policy file). + * @throws SecurityError Local SWF files may not set + * LoaderContext.securityDomain to anything + * other than null. It is not + * permitted to import non-local media into a + * local sandbox, or to place other local media + * in anything other than its natural sandbox. + * @throws SecurityError You cannot connect to commonly reserved + * ports. For a complete list of blocked ports, + * see "Restricting Networking APIs" in the + * ActionScript 3.0 Developer's Guide. + * @throws SecurityError If the applicationDomain or + * securityDomain properties of + * the context parameter are from + * a disallowed domain. + * @throws SecurityError If a local SWF file is attempting to use the + * securityDomain property of the + * context parameter. + * @event asyncError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and it is not possible to + * add the loaded content as a child to the specified + * DisplayObjectContainer. This could happen if the + * loaded content is a + * flash.display.AVM1Movie or if the + * addChild() call to the + * requestedContentParent throws an error. + * @event complete Dispatched by the contentLoaderInfo + * object when the file has completed loading. The + * complete event is always dispatched + * after the init event. + * @event httpStatus Dispatched by the contentLoaderInfo + * object when a network request is made over HTTP and + * Flash Player can detect the HTTP status code. + * @event init Dispatched by the contentLoaderInfo + * object when the properties and methods of the loaded + * SWF file are accessible. The init event + * always precedes the complete event. + * @event ioError Dispatched by the contentLoaderInfo + * object when an input or output error occurs that + * causes a load operation to fail. + * @event open Dispatched by the contentLoaderInfo + * object when the loading operation starts. + * @event progress Dispatched by the contentLoaderInfo + * object as data is received while load operation + * progresses. + * @event securityError Dispatched by the contentLoaderInfo + * object if a SWF file in the local-with-filesystem + * sandbox attempts to load content in the + * local-with-networking sandbox, or vice versa. + * @event securityError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and the security sandbox + * of the + * LoaderContext.requestedContentParent + * does not have access to the loaded SWF. + * @event unload Dispatched by the contentLoaderInfo + * object when a loaded object is removed. + */ + public load(request: URLRequest, context?: AssetLoaderContext, ns?: string, parser?: ParserBase): AssetLoaderToken; + /** + * Loads from binary data stored in a ByteArray object. + * + *

The loadBytes() method is asynchronous. You must wait for + * the "init" event before accessing the properties of a loaded object.

+ * + *

When you use this method, consider the Flash Player security model, + * which is described in the Loader class description.

+ * + * @param bytes A ByteArray object. The contents of the ByteArray can be + * any of the file formats supported by the Loader class: SWF, + * GIF, JPEG, or PNG. + * @param context A LoaderContext object. Only the + * applicationDomain property of the + * LoaderContext object applies; the + * checkPolicyFile and + * securityDomain properties of the LoaderContext + * object do not apply. + * + *

If the context parameter is not specified + * or refers to a null object, the content is loaded into the + * current security domain - a process referred to as "import + * loading" in Flash Player security documentation. + * Specifically, if the loading SWF file trusts the remote SWF + * by incorporating the remote SWF into its code, then the + * loading SWF can import it directly into its own security + * domain.

+ * + *

For more information related to security, see the Flash + * Player Developer Center Topic: Security.

+ * @throws ArgumentError If the length property of the + * ByteArray object is not greater than 0. + * @throws IllegalOperationError If the checkPolicyFile or + * securityDomain property of the + * context parameter are non-null. + * @throws IllegalOperationError If the requestedContentParent + * property of the context + * parameter is a Loader. + * @throws IllegalOperationError If the LoaderContext.parameters + * parameter is set to non-null and has some + * values which are not Strings. + * @throws SecurityError If the provided + * applicationDomain property of + * the context property is from a + * disallowed domain. + * @throws SecurityError You cannot connect to commonly reserved + * ports. For a complete list of blocked ports, + * see "Restricting Networking APIs" in the + * ActionScript 3.0 Developer's Guide. + * @event asyncError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and it is not possible to + * add the loaded content as a child to the specified + * DisplayObjectContainer. This could happen if the + * loaded content is a + * flash.display.AVM1Movie or if the + * addChild() call to the + * requestedContentParent throws an error. + * @event complete Dispatched by the contentLoaderInfo + * object when the operation is complete. The + * complete event is always dispatched + * after the init event. + * @event init Dispatched by the contentLoaderInfo + * object when the properties and methods of the loaded + * data are accessible. The init event + * always precedes the complete event. + * @event ioError Dispatched by the contentLoaderInfo + * object when the runtime cannot parse the data in the + * byte array. + * @event open Dispatched by the contentLoaderInfo + * object when the operation starts. + * @event progress Dispatched by the contentLoaderInfo + * object as data is transfered in memory. + * @event securityError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and the security sandbox + * of the + * LoaderContext.requestedContentParent + * does not have access to the loaded SWF. + * @event unload Dispatched by the contentLoaderInfo + * object when a loaded object is removed. + */ + public loadData(data: any, context?: AssetLoaderContext, ns?: string, parser?: ParserBase): AssetLoaderToken; + /** + * Removes a child of this Loader object that was loaded by using the + * load() method. The property of the associated + * LoaderInfo object is reset to null. The child is not + * necessarily destroyed because other objects might have references to it; + * however, it is no longer a child of the Loader object. + * + *

As a best practice, before you unload a child SWF file, you should + * explicitly close any streams in the child SWF file's objects, such as + * LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise, + * audio in the child SWF file might continue to play, even though the child + * SWF file was unloaded. To close streams in the child SWF file, add an + * event listener to the child that listens for the unload + * event. When the parent calls Loader.unload(), the + * unload event is dispatched to the child. The following code + * shows how you might do this:

+ *
 public closeAllStreams(evt:Event) {
+	    * myNetStream.close(); mySound.close(); myNetConnection.close();
+	    * myLocalConnection.close(); }
+	    * myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,
+	    * closeAllStreams);
+ * + */ + public unload(): void; + /** + * Enables a specific parser. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parserClass The parser class to enable. + * @see away.parsers.Parsers + */ + static enableParser(parserClass: Object): void; + /** + * Enables a list of parsers. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parserClasses A Vector of parser classes to enable. + * @see away.parsers.Parsers + */ + static enableParsers(parserClasses: Object[]): void; + private removeListeners(dispatcher); + private onAssetComplete(event); + /** + * Called when an error occurs during loading + */ + private onLoadError(event); + /** + * Called when a an error occurs during parsing + */ + private onParseError(event); + /** + * Called when the resource and all of its dependencies was retrieved. + */ + private onResourceComplete(event); + } + export = Loader; + +} +declare module "awayjs-core/lib/containers/Scene" { + import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Partition = require("awayjs-core/lib/core/partition/Partition"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + class Scene extends EventDispatcher { + private _expandedPartitions; + private _partitions; + public _iSceneGraphRoot: DisplayObjectContainer; + public _iCollectionMark: number; + constructor(); + public traversePartitions(traverser: ICollector): void; + public partition : Partition; + public contains(child: DisplayObject): boolean; + public addChild(child: DisplayObject): DisplayObject; + public removeChild(child: DisplayObject): void; + public removeChildAt(index: number): void; + public getChildAt(index: number): DisplayObject; + public numChildren : number; + /** + * @internal + */ + public iRegisterEntity(displayObject: DisplayObject): void; + /** + * @internal + */ + public iRegisterPartition(partition: Partition): void; + /** + * @internal + */ + public iUnregisterEntity(displayObject: DisplayObject): void; + /** + * @internal + */ + public iUnregisterPartition(partition: Partition): void; + } + export = Scene; + +} +declare module "awayjs-core/lib/containers/View" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import IPicker = require("awayjs-core/lib/core/pick/IPicker"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import Camera = require("awayjs-core/lib/entities/Camera"); + class View { + public _pScene: Scene; + public _pCamera: Camera; + public _pEntityCollector: ICollector; + public _pRenderer: IRenderer; + private _aspectRatio; + private _width; + private _height; + private _time; + private _deltaTime; + private _backgroundColor; + private _backgroundAlpha; + private _viewportDirty; + private _scissorDirty; + private _onScenePartitionChangedDelegate; + private _onProjectionChangedDelegate; + private _onViewportUpdatedDelegate; + private _onScissorUpdatedDelegate; + private _mouseManager; + private _mousePicker; + private _htmlElement; + private _shareContext; + public _pMouseX: number; + public _pMouseY: number; + constructor(renderer: IRenderer, scene?: Scene, camera?: Camera); + /** + * + * @param e + */ + private onScenePartitionChanged(event); + public layeredView: boolean; + public mouseX : number; + public mouseY : number; + /** + * + */ + public htmlElement : HTMLDivElement; + /** + * + */ + public renderer : IRenderer; + /** + * + */ + public shareContext : boolean; + /** + * + */ + public backgroundColor : number; + /** + * + * @returns {number} + */ + /** + * + * @param value + */ + public backgroundAlpha : number; + /** + * + * @returns {Camera3D} + */ + /** + * Set camera that's used to render the scene for this viewport + */ + public camera : Camera; + /** + * + * @returns {away.containers.Scene3D} + */ + /** + * Set the scene that's used to render for this viewport + */ + public scene : Scene; + /** + * + * @returns {number} + */ + public deltaTime : number; + /** + * + */ + public width : number; + /** + * + */ + public height : number; + /** + * + */ + public mousePicker : IPicker; + /** + * + */ + public x : number; + /** + * + */ + public y : number; + /** + * + */ + public visible : boolean; + /** + * + * @returns {number} + */ + public renderedFacesCount : number; + /** + * Renders the view. + */ + public render(): void; + /** + * + */ + public pUpdateTime(): void; + /** + * + */ + public dispose(): void; + /** + * + */ + public iEntityCollector : ICollector; + /** + * + */ + private onProjectionChanged(event); + /** + * + */ + private onViewportUpdated(event); + /** + * + */ + private onScissorUpdated(event); + public project(point3d: Vector3D): Vector3D; + public unproject(sX: number, sY: number, sZ: number): Vector3D; + public getRay(sX: number, sY: number, sZ: number): Vector3D; + public forceMouseMove: boolean; + public updateCollider(): void; + } + export = View; + +} +declare module "awayjs-core/lib/controllers/ControllerBase" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + class ControllerBase { + public _pAutoUpdate: boolean; + public _pTargetObject: DisplayObject; + constructor(targetObject?: DisplayObject); + public pNotifyUpdate(): void; + public targetObject : DisplayObject; + public autoUpdate : boolean; + public update(interpolate?: boolean): void; + } + export = ControllerBase; + +} +declare module "awayjs-core/lib/controllers/FirstPersonController" { + import ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + /** + * Extended camera used to hover round a specified target object. + * + * @see away3d.containers.View3D + */ + class FirstPersonController extends ControllerBase { + public _iCurrentPanAngle: number; + public _iCurrentTiltAngle: number; + private _panAngle; + private _tiltAngle; + private _minTiltAngle; + private _maxTiltAngle; + private _steps; + private _walkIncrement; + private _strafeIncrement; + private _wrapPanAngle; + public fly: boolean; + /** + * Fractional step taken each time the hover() method is called. Defaults to 8. + * + * Affects the speed at which the tiltAngle and panAngle resolve to their targets. + * + * @see #tiltAngle + * @see #panAngle + */ + public steps : number; + /** + * Rotation of the camera in degrees around the y axis. Defaults to 0. + */ + public panAngle : number; + /** + * Elevation angle of the camera in degrees. Defaults to 90. + */ + public tiltAngle : number; + /** + * Minimum bounds for the tiltAngle. Defaults to -90. + * + * @see #tiltAngle + */ + public minTiltAngle : number; + /** + * Maximum bounds for the tiltAngle. Defaults to 90. + * + * @see #tiltAngle + */ + public maxTiltAngle : number; + /** + * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. + */ + public wrapPanAngle : boolean; + /** + * Creates a new HoverController object. + */ + constructor(targetObject?: DisplayObject, panAngle?: number, tiltAngle?: number, minTiltAngle?: number, maxTiltAngle?: number, steps?: number, wrapPanAngle?: boolean); + /** + * Updates the current tilt angle and pan angle values. + * + * Values are calculated using the defined tiltAngle, panAngle and steps variables. + * + * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. + * + * @see #tiltAngle + * @see #panAngle + * @see #steps + */ + public update(interpolate?: boolean): void; + public incrementWalk(val: number): void; + public incrementStrafe(val: number): void; + } + export = FirstPersonController; + +} +declare module "awayjs-core/lib/controllers/FollowController" { + import HoverController = require("awayjs-core/lib/controllers/HoverController"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + /** + * Controller used to follow behind an object on the XZ plane, with an optional + * elevation (tiltAngle). + * + * @see away3d.containers.View3D + */ + class FollowController extends HoverController { + constructor(targetObject?: DisplayObject, lookAtObject?: DisplayObject, tiltAngle?: number, distance?: number); + public update(interpolate?: boolean): void; + } + export = FollowController; + +} +declare module "awayjs-core/lib/controllers/HoverController" { + import LookAtController = require("awayjs-core/lib/controllers/LookAtController"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + /** + * Extended camera used to hover round a specified target object. + * + * @see away.containers.View + */ + class HoverController extends LookAtController { + public _iCurrentPanAngle: number; + public _iCurrentTiltAngle: number; + private _panAngle; + private _tiltAngle; + private _distance; + private _minPanAngle; + private _maxPanAngle; + private _minTiltAngle; + private _maxTiltAngle; + private _steps; + private _yFactor; + private _wrapPanAngle; + private _upAxis; + /** + * Fractional step taken each time the hover() method is called. Defaults to 8. + * + * Affects the speed at which the tiltAngle and panAngle resolve to their targets. + * + * @see #tiltAngle + * @see #panAngle + */ + public steps : number; + /** + * Rotation of the camera in degrees around the y axis. Defaults to 0. + */ + public panAngle : number; + /** + * Elevation angle of the camera in degrees. Defaults to 90. + */ + public tiltAngle : number; + /** + * Distance between the camera and the specified target. Defaults to 1000. + */ + public distance : number; + /** + * Minimum bounds for the panAngle. Defaults to -Infinity. + * + * @see #panAngle + */ + public minPanAngle : number; + /** + * Maximum bounds for the panAngle. Defaults to Infinity. + * + * @see #panAngle + */ + public maxPanAngle : number; + /** + * Minimum bounds for the tiltAngle. Defaults to -90. + * + * @see #tiltAngle + */ + public minTiltAngle : number; + /** + * Maximum bounds for the tiltAngle. Defaults to 90. + * + * @see #tiltAngle + */ + public maxTiltAngle : number; + /** + * Fractional difference in distance between the horizontal camera orientation and vertical camera orientation. Defaults to 2. + * + * @see #distance + */ + public yFactor : number; + /** + * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. + */ + public wrapPanAngle : boolean; + /** + * Creates a new HoverController object. + */ + constructor(targetObject?: DisplayObject, lookAtObject?: DisplayObject, panAngle?: number, tiltAngle?: number, distance?: number, minTiltAngle?: number, maxTiltAngle?: number, minPanAngle?: number, maxPanAngle?: number, steps?: number, yFactor?: number, wrapPanAngle?: boolean); + /** + * Updates the current tilt angle and pan angle values. + * + * Values are calculated using the defined tiltAngle, panAngle and steps variables. + * + * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. + * + * @see #tiltAngle + * @see #panAngle + * @see #steps + */ + public update(interpolate?: boolean): void; + } + export = HoverController; + +} +declare module "awayjs-core/lib/controllers/LookAtController" { + import ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + class LookAtController extends ControllerBase { + public _pLookAtPosition: Vector3D; + public _pLookAtObject: DisplayObject; + public _pOrigin: Vector3D; + private _onLookAtObjectChangedDelegate; + constructor(targetObject?: DisplayObject, lookAtObject?: DisplayObject); + public lookAtPosition : Vector3D; + public lookAtObject : DisplayObject; + public update(interpolate?: boolean): void; + private onLookAtObjectChanged(event); + } + export = LookAtController; + +} +declare module "awayjs-core/lib/controllers/SpringController" { + import LookAtController = require("awayjs-core/lib/controllers/LookAtController"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + /** + * Uses spring physics to animate the target object towards a position that is + * defined as the lookAtTarget object's position plus the vector defined by the + * positionOffset property. + */ + class SpringController extends LookAtController { + private _velocity; + private _dv; + private _stretch; + private _force; + private _acceleration; + private _desiredPosition; + /** + * Stiffness of the spring, how hard is it to extend. The higher it is, the more "fixed" the cam will be. + * A number between 1 and 20 is recommended. + */ + public stiffness: number; + /** + * Damping is the spring internal friction, or how much it resists the "boinggggg" effect. Too high and you'll lose it! + * A number between 1 and 20 is recommended. + */ + public damping: number; + /** + * Mass of the camera, if over 120 and it'll be very heavy to move. + */ + public mass: number; + /** + * Offset of spring center from target in target object space, ie: Where the camera should ideally be in the target object space. + */ + public positionOffset: Vector3D; + constructor(targetObject?: DisplayObject, lookAtObject?: DisplayObject, stiffness?: number, mass?: number, damping?: number); + public update(interpolate?: boolean): void; + } + export = SpringController; + +} +declare module "awayjs-core/lib/entities/Billboard" { + import IAnimator = require("awayjs-core/lib/animators/IAnimator"); + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * The Billboard class represents display objects that represent bitmap images. + * These can be images that you load with the flash.Assets or + * flash.display.Loader classes, or they can be images that you + * create with the Billboard() constructor. + * + *

The Billboard() constructor allows you to create a Billboard + * object that contains a reference to a BitmapData object. After you create a + * Billboard object, use the addChild() or addChildAt() + * method of the parent DisplayObjectContainer instance to place the bitmap on + * the display list.

+ * + *

A Billboard object can share its BitmapData reference among several Billboard + * objects, independent of translation or rotation properties. Because you can + * create multiple Billboard objects that reference the same BitmapData object, + * multiple display objects can use the same complex BitmapData object without + * incurring the memory overhead of a BitmapData object for each display + * object instance.

+ * + *

A BitmapData object can be drawn to the screen by a Billboard object in one + * of two ways: by using the default hardware renderer with a single hardware surface, + * or by using the slower software renderer when 3D acceleration is not available.

+ * + *

If you would prefer to perform a batch rendering command, rather than using a + * single surface for each Billboard object, you can also draw to the screen using the + * drawTiles() or drawTriangles() methods which are + * available to flash.display.Tilesheet and flash.display.Graphics + * objects.

+ * + *

Note: The Billboard class is not a subclass of the InteractiveObject + * class, so it cannot dispatch mouse events. However, you can use the + * addEventListener() method of the display object container that + * contains the Billboard object.

+ */ + class Billboard extends DisplayObject implements IEntity, IMaterialOwner { + private _animator; + private _billboardWidth; + private _billboardHeight; + private _material; + private _uvTransform; + private onSizeChangedDelegate; + /** + * Defines the animator of the mesh. Act on the mesh's geometry. Defaults to null + */ + public animator : IAnimator; + /** + * + */ + public assetType : string; + /** + * The BitmapData object being referenced. + */ + public bitmapData: BitmapData; + /** + * + */ + public billboardHeight : number; + /** + * + */ + public billboardWidth : number; + /** + * + */ + public material : MaterialBase; + /** + * Controls whether or not the Billboard object is snapped to the nearest pixel. + * This value is ignored in the native and HTML5 targets. + * The PixelSnapping class includes possible values: + * + */ + public pixelSnapping: string; + /** + * Controls whether or not the bitmap is smoothed when scaled. If + * true, the bitmap is smoothed when scaled. If + * false, the bitmap is not smoothed when scaled. + */ + public smoothing: boolean; + /** + * + */ + public uvTransform : UVTransform; + constructor(material: MaterialBase, pixelSnapping?: string, smoothing?: boolean); + /** + * @protected + */ + public pCreateEntityPartitionNode(): EntityNode; + /** + * @protected + */ + public pUpdateBounds(): void; + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + public _iTestCollision(shortestCollisionDistance: number, findClosest: boolean): boolean; + /** + * @private + */ + private onSizeChanged(event); + public _iCollectRenderables(renderer: IRenderer): void; + public _iCollectRenderable(renderer: IRenderer): void; + } + export = Billboard; + +} +declare module "awayjs-core/lib/entities/Camera" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import IProjection = require("awayjs-core/lib/projections/IProjection"); + class Camera extends DisplayObjectContainer implements IEntity { + private _viewProjection; + private _viewProjectionDirty; + private _projection; + private _frustumPlanes; + private _frustumPlanesDirty; + private _onProjectionMatrixChangedDelegate; + constructor(projection?: IProjection); + public pCreateDefaultBoundingVolume(): BoundingVolumeBase; + /** + * @protected + */ + public pCreateEntityPartitionNode(): EntityNode; + public assetType : string; + private onProjectionMatrixChanged(event); + public frustumPlanes : Plane3D[]; + private updateFrustum(); + /** + * @protected + */ + public pInvalidateSceneTransform(): void; + /** + * @protected + */ + public pUpdateBounds(): void; + /** + * + */ + public projection : IProjection; + /** + * + */ + public viewProjection : Matrix3D; + /** + * Calculates the ray in scene space from the camera to the given normalized coordinates in screen space. + * + * @param nX The normalised x coordinate in screen space, -1 corresponds to the left edge of the viewport, 1 to the right. + * @param nY The normalised y coordinate in screen space, -1 corresponds to the top edge of the viewport, 1 to the bottom. + * @param sZ The z coordinate in screen space, representing the distance into the screen. + * @return The ray from the camera to the scene space position of the given screen coordinates. + */ + public getRay(nX: number, nY: number, sZ: number): Vector3D; + /** + * Calculates the normalised position in screen space of the given scene position. + * + * @param point3d the position vector of the scene coordinates to be projected. + * @return The normalised screen position of the given scene coordinates. + */ + public project(point3d: Vector3D): Vector3D; + /** + * Calculates the scene position of the given normalized coordinates in screen space. + * + * @param nX The normalised x coordinate in screen space, minus the originX offset of the projection property. + * @param nY The normalised y coordinate in screen space, minus the originY offset of the projection property. + * @param sZ The z coordinate in screen space, representing the distance into the screen. + * @return The scene position of the given screen coordinates. + */ + public unproject(nX: number, nY: number, sZ: number): Vector3D; + public _iCollectRenderables(renderer: IRenderer): void; + public _iCollectRenderable(renderer: IRenderer): void; + } + export = Camera; + +} +declare module "awayjs-core/lib/entities/DirectionalLight" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import LightBase = require("awayjs-core/lib/core/base/LightBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + class DirectionalLight extends LightBase implements IEntity { + private _direction; + private _tmpLookAt; + private _sceneDirection; + private _projAABBPoints; + constructor(xDir?: number, yDir?: number, zDir?: number); + public sceneDirection : Vector3D; + public direction : Vector3D; + /** + * + * @returns {away.bounds.NullBounds} + */ + public pCreateDefaultBoundingVolume(): BoundingVolumeBase; + /** + * + */ + public pUpdateBounds(): void; + public pUpdateSceneTransform(): void; + public pCreateShadowMapper(): DirectionalShadowMapper; + /** + * @protected + */ + public pCreateEntityPartitionNode(): EntityNode; + public iGetObjectProjectionMatrix(entity: IEntity, camera: Camera, target?: Matrix3D): Matrix3D; + public _iCollectRenderables(renderer: IRenderer): void; + } + export = DirectionalLight; + +} +declare module "awayjs-core/lib/entities/IEntity" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import Scene = require("awayjs-core/lib/containers/Scene"); + import ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Transform = require("awayjs-core/lib/core/geom/Transform"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import Partition = require("awayjs-core/lib/core/partition/Partition"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import IPickingCollider = require("awayjs-core/lib/core/pick/IPickingCollider"); + import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Camera = require("awayjs-core/lib/entities/Camera"); + interface IEntity extends IAsset { + x: number; + y: number; + z: number; + rotationX: number; + rotationY: number; + rotationZ: number; + scaleX: number; + scaleY: number; + scaleZ: number; + /** + * + */ + bounds: BoundingVolumeBase; + /** + * + */ + castsShadows: boolean; + /** + * + */ + inverseSceneTransform: Matrix3D; + /** + * + */ + partitionNode: EntityNode; + /** + * + */ + pickingCollider: IPickingCollider; + /** + * + */ + transform: Transform; + /** + * + */ + scene: Scene; + /** + * + */ + scenePosition: Vector3D; + /** + * + */ + sceneTransform: Matrix3D; + /** + * + */ + worldBounds: BoundingVolumeBase; + /** + * + */ + zOffset: number; + /** + * + */ + isIntersectingRay(rayPosition: Vector3D, rayDirection: Vector3D): boolean; + /** + * + * + * @param target + * @param upAxis + */ + lookAt(target: Vector3D, upAxis?: Vector3D): any; + /** + * @internal + */ + _iPickingCollisionVO: PickingCollisionVO; + /** + * @internal + */ + _iController: ControllerBase; + /** + * @internal + */ + _iAssignedPartition: Partition; + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + _iTestCollision(shortestCollisionDistance: number, findClosest: boolean): boolean; + /** + * @internal + */ + _iIsMouseEnabled(): boolean; + /** + * @internal + */ + _iIsVisible(): boolean; + _iInternalUpdate(): any; + /** + * The transformation matrix that transforms from model to world space, adapted with any special operations needed to render. + * For example, assuring certain alignedness which is not inherent in the scene transform. By default, this would + * return the scene transform. + */ + getRenderSceneTransform(camera: Camera): Matrix3D; + /** + * + * @param renderer + * @private + */ + _iCollectRenderables(renderer: IRenderer): any; + } + export = IEntity; + +} +declare module "awayjs-core/lib/entities/LightProbe" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import LightBase = require("awayjs-core/lib/core/base/LightBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); + class LightProbe extends LightBase implements IEntity { + private _diffuseMap; + private _specularMap; + constructor(diffuseMap: CubeTextureBase, specularMap?: CubeTextureBase); + public diffuseMap : CubeTextureBase; + public specularMap : CubeTextureBase; + /** + * @protected + */ + public pCreateEntityPartitionNode(): EntityNode; + public pUpdateBounds(): void; + public pCreateDefaultBoundingVolume(): BoundingVolumeBase; + public iGetObjectProjectionMatrix(entity: IEntity, camera: Camera, target?: Matrix3D): Matrix3D; + public _iCollectRenderables(renderer: IRenderer): void; + } + export = LightProbe; + +} +declare module "awayjs-core/lib/entities/LineSegment" { + import IAnimator = require("awayjs-core/lib/animators/IAnimator"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * A Line Segment primitive. + */ + class LineSegment extends DisplayObject implements IEntity, IMaterialOwner { + private _animator; + private _material; + private _uvTransform; + private onSizeChangedDelegate; + public _startPosition: Vector3D; + public _endPosition: Vector3D; + public _halfThickness: number; + /** + * Defines the animator of the line segment. Act on the line segment's geometry. Defaults to null + */ + public animator : IAnimator; + /** + * + */ + public assetType : string; + /** + * + */ + public startPostion : Vector3D; + public startPosition : Vector3D; + /** + * + */ + public endPosition : Vector3D; + /** + * + */ + public material : MaterialBase; + /** + * + */ + public thickness : number; + /** + * + */ + public uvTransform : UVTransform; + /** + * Create a line segment + * + * @param startPosition Start position of the line segment + * @param endPosition Ending position of the line segment + * @param thickness Thickness of the line + */ + constructor(material: MaterialBase, startPosition: Vector3D, endPosition: Vector3D, thickness?: number); + public dispose(): void; + /** + * @protected + */ + public pCreateEntityPartitionNode(): EntityNode; + /** + * @protected + */ + public pUpdateBounds(): void; + /** + * @private + */ + private onSizeChanged(event); + /** + * @private + */ + private notifyRenderableUpdate(); + public _iCollectRenderables(renderer: IRenderer): void; + public _iCollectRenderable(renderer: IRenderer): void; + } + export = LineSegment; + +} +declare module "awayjs-core/lib/entities/Mesh" { + import IAnimator = require("awayjs-core/lib/animators/IAnimator"); + import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Geometry = require("awayjs-core/lib/core/base/Geometry"); + import ISubMesh = require("awayjs-core/lib/core/base/ISubMesh"); + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * Mesh is an instance of a Geometry, augmenting it with a presence in the scene graph, a material, and an animation + * state. It consists out of SubMeshes, which in turn correspond to SubGeometries. SubMeshes allow different parts + * of the geometry to be assigned different materials. + */ + class Mesh extends DisplayObjectContainer implements IEntity { + private _uvTransform; + private _subMeshes; + private _geometry; + private _material; + private _animator; + private _castsShadows; + private _shareAnimationGeometry; + private _onGeometryBoundsInvalidDelegate; + private _onSubGeometryAddedDelegate; + private _onSubGeometryRemovedDelegate; + /** + * Defines the animator of the mesh. Act on the mesh's geometry. Default value is null. + */ + public animator : IAnimator; + /** + * + */ + public assetType : string; + /** + * Indicates whether or not the Mesh can cast shadows. Default value is true. + */ + public castsShadows : boolean; + /** + * The geometry used by the mesh that provides it with its shape. + */ + public geometry : Geometry; + /** + * The material with which to render the Mesh. + */ + public material : MaterialBase; + /** + * Indicates whether or not the mesh share the same animation geometry. + */ + public shareAnimationGeometry : boolean; + /** + * The SubMeshes out of which the Mesh consists. Every SubMesh can be assigned a material to override the Mesh's + * material. + */ + public subMeshes : ISubMesh[]; + /** + * + */ + public uvTransform : UVTransform; + /** + * Create a new Mesh object. + * + * @param geometry The geometry used by the mesh that provides it with its shape. + * @param material [optional] The material with which to render the Mesh. + */ + constructor(geometry: Geometry, material?: MaterialBase); + /** + * + */ + public bakeTransformations(): void; + /** + * @inheritDoc + */ + public dispose(): void; + /** + * Disposes mesh including the animator and children. This is a merely a convenience method. + * @return + */ + public disposeWithAnimatorAndChildren(): void; + /** + * Clones this Mesh instance along with all it's children, while re-using the same + * material, geometry and animation set. The returned result will be a copy of this mesh, + * containing copies of all of it's children. + * + * Properties that are re-used (i.e. not cloned) by the new copy include name, + * geometry, and material. Properties that are cloned or created anew for the copy + * include subMeshes, children of the mesh, and the animator. + * + * If you want to copy just the mesh, reusing it's geometry and material while not + * cloning it's children, the simplest way is to create a new mesh manually: + * + * + * var clone : Mesh = new Mesh(original.geometry, original.material); + * + */ + public clone(): DisplayObject; + /** + * //TODO + * + * @param subGeometry + * @returns {SubMeshBase} + */ + public getSubMeshFromSubGeometry(subGeometry: SubGeometryBase): ISubMesh; + /** + * @protected + */ + public pCreateEntityPartitionNode(): EntityNode; + /** + * //TODO + * + * @protected + */ + public pUpdateBounds(): void; + /** + * //TODO + * + * @private + */ + private onGeometryBoundsInvalid(event); + /** + * Called when a SubGeometry was added to the Geometry. + * + * @private + */ + private onSubGeometryAdded(event); + /** + * Called when a SubGeometry was removed from the Geometry. + * + * @private + */ + private onSubGeometryRemoved(event); + /** + * Adds a SubMeshBase wrapping a SubGeometry. + * + * @param subGeometry + */ + private addSubMesh(subGeometry); + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + public _iTestCollision(shortestCollisionDistance: number, findClosest: boolean): boolean; + /** + * + * @param renderer + * + * @internal + */ + public _iCollectRenderables(renderer: IRenderer): void; + public _iInvalidateRenderableGeometries(): void; + } + export = Mesh; + +} +declare module "awayjs-core/lib/entities/PointLight" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import LightBase = require("awayjs-core/lib/core/base/LightBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import CubeMapShadowMapper = require("awayjs-core/lib/materials/shadowmappers/CubeMapShadowMapper"); + class PointLight extends LightBase implements IEntity { + public _pRadius: number; + public _pFallOff: number; + public _pFallOffFactor: number; + constructor(); + public pCreateShadowMapper(): CubeMapShadowMapper; + public radius : number; + public iFallOffFactor(): number; + public fallOff : number; + /** + * @protected + */ + public pCreateEntityPartitionNode(): EntityNode; + public pUpdateBounds(): void; + public pCreateDefaultBoundingVolume(): BoundingVolumeBase; + public iGetObjectProjectionMatrix(entity: IEntity, camera: Camera, target?: Matrix3D): Matrix3D; + public _iCollectRenderables(renderer: IRenderer): void; + } + export = PointLight; + +} +declare module "awayjs-core/lib/entities/Shape" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Graphics = require("awayjs-core/lib/core/base/Graphics"); + /** + * This class is used to create lightweight shapes using the ActionScript + * drawing application program interface(API). The Shape class includes a + * graphics property, which lets you access methods from the + * Graphics class. + * + *

The Sprite class also includes a graphicsproperty, and it + * includes other features not available to the Shape class. For example, a + * Sprite object is a display object container, whereas a Shape object is not + * (and cannot contain child display objects). For this reason, Shape objects + * consume less memory than Sprite objects that contain the same graphics. + * However, a Sprite object supports user input events, while a Shape object + * does not.

+ */ + class Shape extends DisplayObject { + private _graphics; + /** + * Specifies the Graphics object belonging to this Shape object, where vector + * drawing commands can occur. + */ + public graphics : Graphics; + /** + * Creates a new Shape object. + */ + constructor(); + } + export = Shape; + +} +declare module "awayjs-core/lib/entities/Skybox" { + import IAnimator = require("awayjs-core/lib/animators/IAnimator"); + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); + import SkyboxNode = require("awayjs-core/lib/core/partition/SkyboxNode"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * A Skybox class is used to render a sky in the scene. It's always considered static and 'at infinity', and as + * such it's always centered at the camera's position and sized to exactly fit within the camera's frustum, ensuring + * the sky box is always as large as possible without being clipped. + */ + class Skybox extends DisplayObject implements IEntity, IMaterialOwner { + private _uvTransform; + private _material; + private _animator; + public animator : IAnimator; + /** + * + */ + public uvTransform : UVTransform; + /** + * Create a new Skybox object. + * + * @param material The material with which to render the Skybox. + */ + constructor(material: MaterialBase); + /** + * The material with which to render the Skybox. + */ + public material : MaterialBase; + public assetType : string; + /** + * @protected + */ + public pInvalidateBounds(): void; + /** + * @protected + */ + public pCreateEntityPartitionNode(): SkyboxNode; + /** + * @protected + */ + public pCreateDefaultBoundingVolume(): BoundingVolumeBase; + /** + * @protected + */ + public pUpdateBounds(): void; + public castsShadows : boolean; + public _iCollectRenderables(renderer: IRenderer): void; + public _iCollectRenderable(renderer: IRenderer): void; + } + export = Skybox; + +} +declare module "awayjs-core/lib/entities/TextField" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + import AntiAliasType = require("awayjs-core/lib/core/text/AntiAliasType"); + import GridFitType = require("awayjs-core/lib/core/text/GridFitType"); + import TextFieldAutoSize = require("awayjs-core/lib/core/text/TextFieldAutoSize"); + import TextFieldType = require("awayjs-core/lib/core/text/TextFieldType"); + import TextFormat = require("awayjs-core/lib/core/text/TextFormat"); + import TextInteractionMode = require("awayjs-core/lib/core/text/TextInteractionMode"); + import TextLineMetrics = require("awayjs-core/lib/core/text/TextLineMetrics"); + /** + * The TextField class is used to create display objects for text display and + * input. You can use the TextField class to + * perform low-level text rendering. However, in Flex, you typically use the + * Label, Text, TextArea, and TextInput controls to process text. You can give a text field an instance name in the + * Property inspector and use the methods and properties of the TextField + * class to manipulate it with ActionScript. TextField instance names are + * displayed in the Movie Explorer and in the Insert Target Path dialog box in + * the Actions panel. + * + *

To create a text field dynamically, use the TextField() + * constructor.

+ * + *

The methods of the TextField class let you set, select, and manipulate + * text in a dynamic or input text field that you create during authoring or + * at runtime.

+ * + *

ActionScript provides several ways to format your text at runtime. The + * TextFormat class lets you set character and paragraph formatting for + * TextField objects. You can apply Cascading Style Sheets(CSS) styles to + * text fields by using the TextField.styleSheet property and the + * StyleSheet class. You can use CSS to style built-in HTML tags, define new + * formatting tags, or apply styles. You can assign HTML formatted text, which + * optionally uses CSS styles, directly to a text field. HTML text that you + * assign to a text field can contain embedded media(movie clips, SWF files, + * GIF files, PNG files, and JPEG files). The text wraps around the embedded + * media in the same way that a web browser wraps text around media embedded + * in an HTML document.

+ * + *

Flash Player supports a subset of HTML tags that you can use to format + * text. See the list of supported HTML tags in the description of the + * htmlText property.

+ * + * @event change Dispatched after a control value is + * modified, unlike the + * textInput event, which is + * dispatched before the value is modified. + * Unlike the W3C DOM Event Model version of + * the change event, which + * dispatches the event only after the + * control loses focus, the ActionScript 3.0 + * version of the change event + * is dispatched any time the control + * changes. For example, if a user types text + * into a text field, a change + * event is dispatched after every keystroke. + * @event link Dispatched when a user clicks a hyperlink + * in an HTML-enabled text field, where the + * URL begins with "event:". The remainder of + * the URL after "event:" is placed in the + * text property of the LINK event. + * + *

Note: The default behavior, + * adding the text to the text field, occurs + * only when Flash Player generates the + * event, which in this case happens when a + * user attempts to input text. You cannot + * put text into a text field by sending it + * textInput events.

+ * @event scroll Dispatched by a TextField object + * after the user scrolls. + * @event textInput Flash Player dispatches the + * textInput event when a user + * enters one or more characters of text. + * Various text input methods can generate + * this event, including standard keyboards, + * input method editors(IMEs), voice or + * speech recognition systems, and even the + * act of pasting plain text with no + * formatting or style information. + * @event textInteractionModeChange Flash Player dispatches the + * textInteractionModeChange + * event when a user changes the interaction + * mode of a text field. for example on + * Android, one can toggle from NORMAL mode + * to SELECTION mode using context menu + * options + */ + class TextField extends DisplayObject { + private _bottomScrollV; + private _caretIndex; + private _length; + private _maxScrollH; + private _maxScrollV; + private _numLines; + private _selectionBeginIndex; + private _selectionEndIndex; + private _text; + private _textHeight; + private _textInteractionMode; + private _textWidth; + private _charBoundaries; + private _charIndexAtPoint; + private _firstCharInParagraph; + private _imageReference; + private _lineIndexAtPoint; + private _lineIndexOfChar; + private _lineLength; + private _lineMetrics; + private _lineOffset; + private _lineText; + private _paragraphLength; + private _textFormat; + /** + * When set to true and the text field is not in focus, Flash + * Player highlights the selection in the text field in gray. When set to + * false and the text field is not in focus, Flash Player does + * not highlight the selection in the text field. + * + * @default false + */ + public alwaysShowSelection: boolean; + /** + * The type of anti-aliasing used for this text field. Use + * flash.text.AntiAliasType constants for this property. You can + * control this setting only if the font is embedded(with the + * embedFonts property set to true). The default + * setting is flash.text.AntiAliasType.NORMAL. + * + *

To set values for this property, use the following string values:

+ */ + public antiAliasType: AntiAliasType; + /** + * Controls automatic sizing and alignment of text fields. Acceptable values + * for the TextFieldAutoSize constants: + * TextFieldAutoSize.NONE(the default), + * TextFieldAutoSize.LEFT, TextFieldAutoSize.RIGHT, + * and TextFieldAutoSize.CENTER. + * + *

If autoSize is set to TextFieldAutoSize.NONE + * (the default) no resizing occurs.

+ * + *

If autoSize is set to TextFieldAutoSize.LEFT, + * the text is treated as left-justified text, meaning that the left margin + * of the text field remains fixed and any resizing of a single line of the + * text field is on the right margin. If the text includes a line break(for + * example, "\n" or "\r"), the bottom is also + * resized to fit the next line of text. If wordWrap is also set + * to true, only the bottom of the text field is resized and the + * right side remains fixed.

+ * + *

If autoSize is set to + * TextFieldAutoSize.RIGHT, the text is treated as + * right-justified text, meaning that the right margin of the text field + * remains fixed and any resizing of a single line of the text field is on + * the left margin. If the text includes a line break(for example, + * "\n" or "\r"), the bottom is also resized to fit the next + * line of text. If wordWrap is also set to true, + * only the bottom of the text field is resized and the left side remains + * fixed.

+ * + *

If autoSize is set to + * TextFieldAutoSize.CENTER, the text is treated as + * center-justified text, meaning that any resizing of a single line of the + * text field is equally distributed to both the right and left margins. If + * the text includes a line break(for example, "\n" or + * "\r"), the bottom is also resized to fit the next line of + * text. If wordWrap is also set to true, only the + * bottom of the text field is resized and the left and right sides remain + * fixed.

+ * + * @throws ArgumentError The autoSize specified is not a member + * of flash.text.TextFieldAutoSize. + */ + public autoSize: TextFieldAutoSize; + /** + * Specifies whether the text field has a background fill. If + * true, the text field has a background fill. If + * false, the text field has no background fill. Use the + * backgroundColor property to set the background color of a + * text field. + * + * @default false + */ + public background: boolean; + /** + * The color of the text field background. The default value is + * 0xFFFFFF(white). This property can be retrieved or set, even + * if there currently is no background, but the color is visible only if the + * text field has the background property set to + * true. + */ + public backgroundColor: number; + /** + * Specifies whether the text field has a border. If true, the + * text field has a border. If false, the text field has no + * border. Use the borderColor property to set the border color. + * + * @default false + */ + public border: boolean; + /** + * The color of the text field border. The default value is + * 0x000000(black). This property can be retrieved or set, even + * if there currently is no border, but the color is visible only if the text + * field has the border property set to true. + */ + public borderColor: number; + /** + * An integer(1-based index) that indicates the bottommost line that is + * currently visible in the specified text field. Think of the text field as + * a window onto a block of text. The scrollV property is the + * 1-based index of the topmost visible line in the window. + * + *

All the text between the lines indicated by scrollV and + * bottomScrollV is currently visible in the text field.

+ */ + public bottomScrollV : number; + /** + * The index of the insertion point(caret) position. If no insertion point + * is displayed, the value is the position the insertion point would be if + * you restored focus to the field(typically where the insertion point last + * was, or 0 if the field has not had focus). + * + *

Selection span indexes are zero-based(for example, the first position + * is 0, the second position is 1, and so on).

+ */ + public caretIndex : number; + /** + * A Boolean value that specifies whether extra white space(spaces, line + * breaks, and so on) in a text field with HTML text is removed. The default + * value is false. The condenseWhite property only + * affects text set with the htmlText property, not the + * text property. If you set text with the text + * property, condenseWhite is ignored. + * + *

If condenseWhite is set to true, use standard + * HTML commands such as
and

to place line + * breaks in the text field.

+ * + *

Set the condenseWhite property before setting the + * htmlText property.

+ */ + public condenseWhite: boolean; + /** + * Specifies the format applied to newly inserted text, such as text entered + * by a user or text inserted with the replaceSelectedText() + * method. + * + *

Note: When selecting characters to be replaced with + * setSelection() and replaceSelectedText(), the + * defaultTextFormat will be applied only if the text has been + * selected up to and including the last character. Here is an example:

+ *
 public my_txt:TextField new TextField();
+	    * my_txt.text = "Flash Macintosh version"; public my_fmt:TextFormat = new
+	    * TextFormat(); my_fmt.color = 0xFF0000; my_txt.defaultTextFormat = my_fmt;
+	    * my_txt.setSelection(6,15); // partial text selected - defaultTextFormat
+	    * not applied my_txt.setSelection(6,23); // text selected to end -
+	    * defaultTextFormat applied my_txt.replaceSelectedText("Windows version");
+	    * 
+ * + *

When you access the defaultTextFormat property, the + * returned TextFormat object has all of its properties defined. No property + * is null.

+ * + *

Note: You can't set this property if a style sheet is applied to + * the text field.

+ * + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + public defaultTextFormat: TextFormat; + /** + * Specifies whether the text field is a password text field. If the value of + * this property is true, the text field is treated as a + * password text field and hides the input characters using asterisks instead + * of the actual characters. If false, the text field is not + * treated as a password text field. When password mode is enabled, the Cut + * and Copy commands and their corresponding keyboard shortcuts will not + * function. This security mechanism prevents an unscrupulous user from using + * the shortcuts to discover a password on an unattended computer. + * + * @default false + */ + public displayAsPassword: boolean; + /** + * Specifies whether to render by using embedded font outlines. If + * false, Flash Player renders the text field by using device + * fonts. + * + *

If you set the embedFonts property to true + * for a text field, you must specify a font for that text by using the + * font property of a TextFormat object applied to the text + * field. If the specified font is not embedded in the SWF file, the text is + * not displayed.

+ * + * @default false + */ + public embedFonts: boolean; + /** + * The type of grid fitting used for this text field. This property applies + * only if the flash.text.AntiAliasType property of the text + * field is set to flash.text.AntiAliasType.ADVANCED. + * + *

The type of grid fitting used determines whether Flash Player forces + * strong horizontal and vertical lines to fit to a pixel or subpixel grid, + * or not at all.

+ * + *

For the flash.text.GridFitType property, you can use the + * following string values:

+ * + * @default pixel + */ + public gridFitType: GridFitType; + /** + * Contains the HTML representation of the text field contents. + * + *

Flash Player supports the following HTML tags:

+ * + *

Flash Player and AIR also support explicit character codes, such as + * &(ASCII ampersand) and €(Unicode € symbol).

+ */ + public htmlText: string; + /** + * The number of characters in a text field. A character such as tab + * (\t) counts as one character. + */ + public length : number; + /** + * The maximum number of characters that the text field can contain, as + * entered by a user. A script can insert more text than + * maxChars allows; the maxChars property indicates + * only how much text a user can enter. If the value of this property is + * 0, a user can enter an unlimited amount of text. + * + * @default 0 + */ + public maxChars: number; + /** + * The maximum value of scrollH. + */ + public maxScrollH(): number; + /** + * The maximum value of scrollV. + */ + public maxScrollV(): number; + /** + * A Boolean value that indicates whether Flash Player automatically scrolls + * multiline text fields when the user clicks a text field and rolls the + * mouse wheel. By default, this value is true. This property is + * useful if you want to prevent mouse wheel scrolling of text fields, or + * implement your own text field scrolling. + */ + public mouseWheelEnabled: boolean; + /** + * Indicates whether field is a multiline text field. If the value is + * true, the text field is multiline; if the value is + * false, the text field is a single-line text field. In a field + * of type TextFieldType.INPUT, the multiline value + * determines whether the Enter key creates a new line(a value + * of false, and the Enter key is ignored). If you + * paste text into a TextField with a multiline + * value of false, newlines are stripped out of the text. + * + * @default false + */ + public multiline: boolean; + /** + * Defines the number of text lines in a multiline text field. If + * wordWrap property is set to true, the number of + * lines increases when text wraps. + */ + public numLines : number; + /** + * Indicates the set of characters that a user can enter into the text field. + * If the value of the restrict property is null, + * you can enter any character. If the value of the restrict + * property is an empty string, you cannot enter any character. If the value + * of the restrict property is a string of characters, you can + * enter only characters in the string into the text field. The string is + * scanned from left to right. You can specify a range by using the hyphen + * (-) character. Only user interaction is restricted; a script can put any + * text into the text field. This property does + * not synchronize with the Embed font options in the Property inspector. + * + *

If the string begins with a caret(^) character, all characters are + * initially accepted and succeeding characters in the string are excluded + * from the set of accepted characters. If the string does not begin with a + * caret(^) character, no characters are initially accepted and succeeding + * characters in the string are included in the set of accepted + * characters.

+ * + *

The following example allows only uppercase characters, spaces, and + * numbers to be entered into a text field:

+ *
 my_txt.restrict = "A-Z 0-9"; 
+ * + *

The following example includes all characters, but excludes lowercase + * letters:

+ *
 my_txt.restrict = "^a-z"; 
+ * + *

You can use a backslash to enter a ^ or - verbatim. The accepted + * backslash sequences are \-, \^ or \\. The backslash must be an actual + * character in the string, so when specified in ActionScript, a double + * backslash must be used. For example, the following code includes only the + * dash(-) and caret(^):

+ *
 my_txt.restrict = "\\-\\^"; 
+ * + *

The ^ can be used anywhere in the string to toggle between including + * characters and excluding characters. The following code includes only + * uppercase letters, but excludes the uppercase letter Q:

+ *
 my_txt.restrict = "A-Z^Q"; 
+ * + *

You can use the \u escape sequence to construct + * restrict strings. The following code includes only the + * characters from ASCII 32(space) to ASCII 126(tilde).

+ *
 my_txt.restrict = "\u0020-\u007E"; 
+ * + * @default null + */ + public restrict: string; + /** + * The current horizontal scrolling position. If the scrollH + * property is 0, the text is not horizontally scrolled. This property value + * is an integer that represents the horizontal position in pixels. + * + *

The units of horizontal scrolling are pixels, whereas the units of + * vertical scrolling are lines. Horizontal scrolling is measured in pixels + * because most fonts you typically use are proportionally spaced; that is, + * the characters can have different widths. Flash Player performs vertical + * scrolling by line because users usually want to see a complete line of + * text rather than a partial line. Even if a line uses multiple fonts, the + * height of the line adjusts to fit the largest font in use.

+ * + *

Note: The scrollH property is zero-based, not + * 1-based like the scrollV vertical scrolling property.

+ */ + public scrollH: number; + /** + * The vertical position of text in a text field. The scrollV + * property is useful for directing users to a specific paragraph in a long + * passage, or creating scrolling text fields. + * + *

The units of vertical scrolling are lines, whereas the units of + * horizontal scrolling are pixels. If the first line displayed is the first + * line in the text field, scrollV is set to 1(not 0). Horizontal scrolling + * is measured in pixels because most fonts are proportionally spaced; that + * is, the characters can have different widths. Flash performs vertical + * scrolling by line because users usually want to see a complete line of + * text rather than a partial line. Even if there are multiple fonts on a + * line, the height of the line adjusts to fit the largest font in use.

+ */ + public scrollV: number; + /** + * A Boolean value that indicates whether the text field is selectable. The + * value true indicates that the text is selectable. The + * selectable property controls whether a text field is + * selectable, not whether a text field is editable. A dynamic text field can + * be selectable even if it is not editable. If a dynamic text field is not + * selectable, the user cannot select its text. + * + *

If selectable is set to false, the text in + * the text field does not respond to selection commands from the mouse or + * keyboard, and the text cannot be copied with the Copy command. If + * selectable is set to true, the text in the text + * field can be selected with the mouse or keyboard, and the text can be + * copied with the Copy command. You can select text this way even if the + * text field is a dynamic text field instead of an input text field.

+ * + * @default true + */ + public selectable: boolean; + /** + * The zero-based character index value of the first character in the current + * selection. For example, the first character is 0, the second character is + * 1, and so on. If no text is selected, this property is the value of + * caretIndex. + */ + public selectionBeginIndex : number; + /** + * The zero-based character index value of the last character in the current + * selection. For example, the first character is 0, the second character is + * 1, and so on. If no text is selected, this property is the value of + * caretIndex. + */ + public selectionEndIndex : number; + /** + * The sharpness of the glyph edges in this text field. This property applies + * only if the flash.text.AntiAliasType property of the text + * field is set to flash.text.AntiAliasType.ADVANCED. The range + * for sharpness is a number from -400 to 400. If you attempt to + * set sharpness to a value outside that range, Flash sets the + * property to the nearest value in the range(either -400 or 400). + * + * @default 0 + */ + public sharpness: number; + /** + * Attaches a style sheet to the text field. For information on creating + * style sheets, see the StyleSheet class and the ActionScript 3.0 + * Developer's Guide. + * + *

You can change the style sheet associated with a text field at any + * time. If you change the style sheet in use, the text field is redrawn with + * the new style sheet. You can set the style sheet to null or + * undefined to remove the style sheet. If the style sheet in + * use is removed, the text field is redrawn without a style sheet.

+ * + *

Note: If the style sheet is removed, the contents of both + * TextField.text and TextField.htmlText change to + * incorporate the formatting previously applied by the style sheet. To + * preserve the original TextField.htmlText contents without the + * formatting, save the value in a variable before removing the style + * sheet.

+ */ + public styleSheet: StyleSheet; + /** + * A string that is the current text in the text field. Lines are separated + * by the carriage return character('\r', ASCII 13). This + * property contains unformatted text in the text field, without HTML tags. + * + *

To get the text in HTML form, use the htmlText + * property.

+ */ + public text : string; + /** + * The color of the text in a text field, in hexadecimal format. The + * hexadecimal color system uses six digits to represent color values. Each + * digit has 16 possible values or characters. The characters range from 0-9 + * and then A-F. For example, black is 0x000000; white is + * 0xFFFFFF. + * + * @default 0(0x000000) + */ + public textColor: number; + /** + * The height of the text in pixels. + */ + public textHeight : number; + /** + * The interaction mode property, Default value is + * TextInteractionMode.NORMAL. On mobile platforms, the normal mode implies + * that the text can be scrolled but not selected. One can switch to the + * selectable mode through the in-built context menu on the text field. On + * Desktop, the normal mode implies that the text is in scrollable as well as + * selection mode. + */ + public textInteractionMode : TextInteractionMode; + /** + * The width of the text in pixels. + */ + public textWidth : number; + /** + * The thickness of the glyph edges in this text field. This property applies + * only when AntiAliasType is set to + * AntiAliasType.ADVANCED. + * + *

The range for thickness is a number from -200 to 200. If + * you attempt to set thickness to a value outside that range, + * the property is set to the nearest value in the range(either -200 or + * 200).

+ * + * @default 0 + */ + public thickness: number; + /** + * The type of the text field. Either one of the following TextFieldType + * constants: TextFieldType.DYNAMIC, which specifies a dynamic + * text field, which a user cannot edit, or TextFieldType.INPUT, + * which specifies an input text field, which a user can edit. + * + * @default dynamic + * @throws ArgumentError The type specified is not a member of + * flash.text.TextFieldType. + */ + public type: TextFieldType; + /** + * Specifies whether to copy and paste the text formatting along with the + * text. When set to true, Flash Player copies and pastes + * formatting(such as alignment, bold, and italics) when you copy and paste + * between text fields. Both the origin and destination text fields for the + * copy and paste procedure must have useRichTextClipboard set + * to true. The default value is false. + */ + public useRichTextClipboard: boolean; + /** + * A Boolean value that indicates whether the text field has word wrap. If + * the value of wordWrap is true, the text field + * has word wrap; if the value is false, the text field does not + * have word wrap. The default value is false. + */ + public wordWrap: boolean; + /** + * Creates a new TextField instance. After you create the TextField instance, + * call the addChild() or addChildAt() method of + * the parent DisplayObjectContainer object to add the TextField instance to + * the display list. + * + *

The default size for a text field is 100 x 100 pixels.

+ */ + constructor(); + /** + * Appends the string specified by the newText parameter to the + * end of the text of the text field. This method is more efficient than an + * addition assignment(+=) on a text property + * (such as someTextField.text += moreText), particularly for a + * text field that contains a significant amount of content. + * + * @param newText The string to append to the existing text. + */ + public appendText(newText: string): void; + /** + * Returns a rectangle that is the bounding box of the character. + * + * @param charIndex The zero-based index value for the character(for + * example, the first position is 0, the second position is + * 1, and so on). + * @return A rectangle with x and y minimum and + * maximum values defining the bounding box of the character. + */ + public getCharBoundaries(charIndex: number): Rectangle; + /** + * Returns the zero-based index value of the character at the point specified + * by the x and y parameters. + * + * @param x The x coordinate of the character. + * @param y The y coordinate of the character. + * @return The zero-based index value of the character(for example, the + * first position is 0, the second position is 1, and so on). Returns + * -1 if the point is not over any character. + */ + public getCharIndexAtPoint(x: number, y: number): number; + /** + * Given a character index, returns the index of the first character in the + * same paragraph. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return The zero-based index value of the first character in the same + * paragraph. + * @throws RangeError The character index specified is out of range. + */ + public getFirstCharInParagraph(charIndex: number): number; + /** + * Returns a DisplayObject reference for the given id, for an + * image or SWF file that has been added to an HTML-formatted text field by + * using an tag. The tag is in the + * following format: + * + *

 

+ * + * @param id The id to match(in the id attribute + * of the tag). + * @return The display object corresponding to the image or SWF file with the + * matching id attribute in the tag + * of the text field. For media loaded from an external source, this + * object is a Loader object, and, once loaded, the media object is a + * child of that Loader object. For media embedded in the SWF file, + * it is the loaded object. If no tag with the + * matching id exists, the method returns + * null. + */ + public getImageReference(id: string): DisplayObject; + /** + * Returns the zero-based index value of the line at the point specified by + * the x and y parameters. + * + * @param x The x coordinate of the line. + * @param y The y coordinate of the line. + * @return The zero-based index value of the line(for example, the first + * line is 0, the second line is 1, and so on). Returns -1 if the + * point is not over any line. + */ + public getLineIndexAtPoint(x: number, y: number): number; + /** + * Returns the zero-based index value of the line containing the character + * specified by the charIndex parameter. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return The zero-based index value of the line. + * @throws RangeError The character index specified is out of range. + */ + public getLineIndexOfChar(charIndex: number): number; + /** + * Returns the number of characters in a specific text line. + * + * @param lineIndex The line number for which you want the length. + * @return The number of characters in the line. + * @throws RangeError The line number specified is out of range. + */ + public getLineLength(lineIndex: number): number; + /** + * Returns metrics information about a given text line. + * + * @param lineIndex The line number for which you want metrics information. + * @return A TextLineMetrics object. + * @throws RangeError The line number specified is out of range. + */ + public getLineMetrics(lineIndex: number): TextLineMetrics; + /** + * Returns the character index of the first character in the line that the + * lineIndex parameter specifies. + * + * @param lineIndex The zero-based index value of the line(for example, the + * first line is 0, the second line is 1, and so on). + * @return The zero-based index value of the first character in the line. + * @throws RangeError The line number specified is out of range. + */ + public getLineOffset(lineIndex: number): number; + /** + * Returns the text of the line specified by the lineIndex + * parameter. + * + * @param lineIndex The zero-based index value of the line(for example, the + * first line is 0, the second line is 1, and so on). + * @return The text string contained in the specified line. + * @throws RangeError The line number specified is out of range. + */ + public getLineText(lineIndex: number): string; + /** + * Given a character index, returns the length of the paragraph containing + * the given character. The length is relative to the first character in the + * paragraph(as returned by getFirstCharInParagraph()), not to + * the character index passed in. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return Returns the number of characters in the paragraph. + * @throws RangeError The character index specified is out of range. + */ + public getParagraphLength(charIndex: number): number; + /** + * Returns a TextFormat object that contains formatting information for the + * range of text that the beginIndex and endIndex + * parameters specify. Only properties that are common to the entire text + * specified are set in the resulting TextFormat object. Any property that is + * mixed, meaning that it has different values at different points in + * the text, has a value of null. + * + *

If you do not specify values for these parameters, this method is + * applied to all the text in the text field.

+ * + *

The following table describes three possible usages:

+ * + * @return The TextFormat object that represents the formatting properties + * for the specified text. + * @throws RangeError The beginIndex or endIndex + * specified is out of range. + */ + public getTextFormat(beginIndex?: number, endIndex?: number): TextFormat; + /** + * Replaces the current selection with the contents of the value + * parameter. The text is inserted at the position of the current selection, + * using the current default character format and default paragraph format. + * The text is not treated as HTML. + * + *

You can use the replaceSelectedText() method to insert and + * delete text without disrupting the character and paragraph formatting of + * the rest of the text.

+ * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + * @param value The string to replace the currently selected text. + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + public replaceSelectedText(value: string): void; + /** + * Replaces the range of characters that the beginIndex and + * endIndex parameters specify with the contents of the + * newText parameter. As designed, the text from + * beginIndex to endIndex-1 is replaced. + * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + * @param beginIndex The zero-based index value for the start position of the + * replacement range. + * @param endIndex The zero-based index position of the first character + * after the desired text span. + * @param newText The text to use to replace the specified range of + * characters. + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + public replaceText(beginIndex: number, endIndex: number, newText: string): void; + /** + * Sets as selected the text designated by the index values of the first and + * last characters, which are specified with the beginIndex and + * endIndex parameters. If the two parameter values are the + * same, this method sets the insertion point, as if you set the + * caretIndex property. + * + * @param beginIndex The zero-based index value of the first character in the + * selection(for example, the first character is 0, the + * second character is 1, and so on). + * @param endIndex The zero-based index value of the last character in the + * selection. + */ + public setSelection(beginIndex: number, endIndex: number): void; + /** + * Applies the text formatting that the format parameter + * specifies to the specified text in a text field. The value of + * format must be a TextFormat object that specifies the desired + * text formatting changes. Only the non-null properties of + * format are applied to the text field. Any property of + * format that is set to null is not applied. By + * default, all of the properties of a newly created TextFormat object are + * set to null. + * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + *

The setTextFormat() method changes the text formatting + * applied to a range of characters or to the entire body of text in a text + * field. To apply the properties of format to all text in the text field, do + * not specify values for beginIndex and endIndex. + * To apply the properties of the format to a range of text, specify values + * for the beginIndex and the endIndex parameters. + * You can use the length property to determine the index + * values.

+ * + *

The two types of formatting information in a TextFormat object are + * character level formatting and paragraph level formatting. Each character + * in a text field can have its own character formatting settings, such as + * font name, font size, bold, and italic.

+ * + *

For paragraphs, the first character of the paragraph is examined for + * the paragraph formatting settings for the entire paragraph. Examples of + * paragraph formatting settings are left margin, right margin, and + * indentation.

+ * + *

Any text inserted manually by the user, or replaced by the + * replaceSelectedText() method, receives the default text field + * formatting for new text, and not the formatting specified for the text + * insertion point. To set the default formatting for new text, use + * defaultTextFormat.

+ * + * @param format A TextFormat object that contains character and paragraph + * formatting information. + * @throws Error This method cannot be used on a text field with a style + * sheet. + * @throws RangeError The beginIndex or endIndex + * specified is out of range. + */ + public setTextFormat(format: TextFormat, beginIndex?: number, endIndex?: number): void; + /** + * Returns true if an embedded font is available with the specified + * fontName and fontStyle where + * Font.fontType is flash.text.FontType.EMBEDDED. + * Starting with Flash Player 10, two kinds of embedded fonts can appear in a + * SWF file. Normal embedded fonts are only used with TextField objects. CFF + * embedded fonts are only used with the flash.text.engine classes. The two + * types are distinguished by the fontType property of the + * Font class, as returned by the enumerateFonts() + * function. + * + *

TextField cannot use a font of type EMBEDDED_CFF. If + * embedFonts is set to true and the only font + * available at run time with the specified name and style is of type + * EMBEDDED_CFF, Flash Player fails to render the text, as if no + * embedded font were available with the specified name and style.

+ * + *

If both EMBEDDED and EMBEDDED_CFF fonts are + * available with the same name and style, the EMBEDDED font is + * selected and text renders with the EMBEDDED font.

+ * + * @param fontName The name of the embedded font to check. + * @param fontStyle Specifies the font style to check. Use + * flash.text.FontStyle + * @return true if a compatible embedded font is available, + * otherwise false. + * @throws ArgumentError The fontStyle specified is not a member + * of flash.text.FontStyle. + */ + static isFontCompatible(fontName: string, fontStyle: string): boolean; + } + export = TextField; + +} +declare module "awayjs-core/lib/errors/AbstractMethodError" { + import Error = require("awayjs-core/lib/errors/Error"); + /** + * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden + * by a concrete subclass. + */ + class AbstractMethodError extends Error { + /** + * Create a new AbstractMethodError. + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + constructor(message?: string, id?: number); + } + export = AbstractMethodError; + +} +declare module "awayjs-core/lib/errors/ArgumentError" { + import Error = require("awayjs-core/lib/errors/Error"); + /** + * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden + * by a concrete subclass. + */ + class ArgumentError extends Error { + /** + * Create a new ArgumentError. + * + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + constructor(message?: string, id?: number); + } + export = ArgumentError; + +} +declare module "awayjs-core/lib/errors/CastError" { + import Error = require("awayjs-core/lib/errors/Error"); + class CastError extends Error { + constructor(message: string); + } + export = CastError; + +} +declare module "awayjs-core/lib/errors/DocumentError" { + import Error = require("awayjs-core/lib/errors/Error"); + class DocumentError extends Error { + static DOCUMENT_DOES_NOT_EXIST: string; + constructor(message?: string, id?: number); + } + export = DocumentError; + +} +declare module "awayjs-core/lib/errors/Error" { + class Error { + private _errorID; + private _messsage; + private _name; + constructor(message?: string, id?: number, _name?: string); + /** + * + * @returns {string} + */ + /** + * + * @param value + */ + public message : string; + /** + * + * @returns {string} + */ + /** + * + * @param value + */ + public name : string; + /** + * + * @returns {number} + */ + public errorID : number; + } + export = Error; + +} +declare module "awayjs-core/lib/errors/PartialImplementationError" { + import Error = require("awayjs-core/lib/errors/Error"); + /** + * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden + * by a concrete subclass. + */ + class PartialImplementationError extends Error { + /** + * Create a new AbstractMethodError. + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + constructor(dependency?: string, id?: number); + } + export = PartialImplementationError; + +} +declare module "awayjs-core/lib/errors/RangeError" { + import Error = require("awayjs-core/lib/errors/Error"); + /** + * RangeError is thrown when an index is accessed out of range of the number of + * available indices on an Array. + */ + class RangeError extends Error { + /** + * Create a new RangeError. + * + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + constructor(message?: string, id?: number); + } + export = RangeError; + +} +declare module "awayjs-core/lib/events/AssetEvent" { + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import Event = require("awayjs-core/lib/events/Event"); + /** + * @class away.events.AssetEvent + */ + class AssetEvent extends Event { + /** + * + */ + static ASSET_COMPLETE: string; + /** + * + */ + static ASSET_RENAME: string; + /** + * + */ + static ASSET_CONFLICT_RESOLVED: string; + /** + * + */ + static TEXTURE_SIZE_ERROR: string; + private _asset; + private _prevName; + /** + * + */ + constructor(type: string, asset?: IAsset, prevName?: string); + /** + * + */ + public asset : IAsset; + /** + * + */ + public assetPrevName : string; + /** + * + */ + public clone(): Event; + } + export = AssetEvent; + +} +declare module "awayjs-core/lib/events/CameraEvent" { + import Camera = require("awayjs-core/lib/entities/Camera"); + import Event = require("awayjs-core/lib/events/Event"); + /** + * @class away.events.CameraEvent + */ + class CameraEvent extends Event { + static PROJECTION_CHANGED: string; + private _camera; + constructor(type: string, camera: Camera); + public camera : Camera; + } + export = CameraEvent; + +} +declare module "awayjs-core/lib/events/DisplayObjectEvent" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Event = require("awayjs-core/lib/events/Event"); + class DisplayObjectEvent extends Event { + static VISIBLITY_UPDATED: string; + static SCENETRANSFORM_CHANGED: string; + static SCENE_CHANGED: string; + static POSITION_CHANGED: string; + static ROTATION_CHANGED: string; + static SCALE_CHANGED: string; + public object: DisplayObject; + constructor(type: string, object: DisplayObject); + } + export = DisplayObjectEvent; + +} +declare module "awayjs-core/lib/events/Event" { + class Event { + static COMPLETE: string; + static OPEN: string; + static ENTER_FRAME: string; + static EXIT_FRAME: string; + static RESIZE: string; + static ERROR: string; + static CHANGE: string; + /** + * Type of event + * @property type + * @type String + */ + public type: string; + /** + * Reference to target object + * @property target + * @type Object + */ + public target: any; + constructor(type: string); + /** + * Clones the current event. + * @return An exact duplicate of the current event. + */ + public clone(): Event; + } + export = Event; + +} +declare module "awayjs-core/lib/events/EventDispatcher" { + import Event = require("awayjs-core/lib/events/Event"); + /** + * Base class for dispatching events + * + * @class away.events.EventDispatcher + * + */ + class EventDispatcher { + private listeners; + private target; + constructor(target?: any); + /** + * Add an event listener + * @method addEventListener + * @param {String} Name of event to add a listener for + * @param {Function} Callback function + */ + public addEventListener(type: string, listener: Function): void; + /** + * Remove an event listener + * @method removeEventListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + public removeEventListener(type: string, listener: Function): void; + /** + * Dispatch an event + * @method dispatchEvent + * @param {Event} Event to dispatch + */ + public dispatchEvent(event: Event): void; + /** + * get Event Listener Index in array. Returns -1 if no listener is added + * @method getEventListenerIndex + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + private getEventListenerIndex(type, listener); + /** + * check if an object has an event listener assigned to it + * @method hasListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + public hasEventListener(type: string, listener?: Function): boolean; + } + export = EventDispatcher; + +} +declare module "awayjs-core/lib/events/GeometryEvent" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import Event = require("awayjs-core/lib/events/Event"); + /** + * Dispatched to notify changes in a geometry object's state. + * + * @class away.events.GeometryEvent + * @see away3d.core.base.Geometry + */ + class GeometryEvent extends Event { + /** + * Dispatched when a TriangleSubGeometry was added to the dispatching Geometry. + */ + static SUB_GEOMETRY_ADDED: string; + /** + * Dispatched when a TriangleSubGeometry was removed from the dispatching Geometry. + */ + static SUB_GEOMETRY_REMOVED: string; + static BOUNDS_INVALID: string; + private _subGeometry; + /** + * Create a new GeometryEvent + * @param type The event type. + * @param subGeometry An optional TriangleSubGeometry object that is the subject of this event. + */ + constructor(type: string, subGeometry?: SubGeometryBase); + /** + * The TriangleSubGeometry object that is the subject of this event, if appropriate. + */ + public subGeometry : SubGeometryBase; + /** + * Clones the event. + * @return An exact duplicate of the current object. + */ + public clone(): Event; + } + export = GeometryEvent; + +} +declare module "awayjs-core/lib/events/HTTPStatusEvent" { + import Event = require("awayjs-core/lib/events/Event"); + /** + * @class away.events.HTTPStatusEvent + */ + class HTTPStatusEvent extends Event { + static HTTP_STATUS: string; + public status: number; + constructor(type: string, status?: number); + } + export = HTTPStatusEvent; + +} +declare module "awayjs-core/lib/events/IEventDispatcher" { + import Event = require("awayjs-core/lib/events/Event"); + /** + * Base interface for dispatching events + * + * @interface away.events.IEventDispatcher + * + */ + interface IEventDispatcher { + /** + * Add an event listener + * @method addEventListener + * @param {String} Name of event to add a listener for + * @param {Function} Callback function + */ + addEventListener(type: string, listener: Function): any; + /** + * Remove an event listener + * @method removeEventListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + removeEventListener(type: string, listener: Function): any; + /** + * Dispatch an event + * @method dispatchEvent + * @param {Event} Event to dispatch + */ + dispatchEvent(event: Event): any; + /** + * check if an object has an event listener assigned to it + * @method hasListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + * @param {Object} Target object listener is added to + */ + hasEventListener(type: string, listener?: Function): boolean; + } + export = IEventDispatcher; + +} +declare module "awayjs-core/lib/events/IOErrorEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class IOErrorEvent extends Event { + static IO_ERROR: string; + constructor(type: string); + } + export = IOErrorEvent; + +} +declare module "awayjs-core/lib/events/LightEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class LightEvent extends Event { + static CASTS_SHADOW_CHANGE: string; + constructor(type: string); + public clone(): Event; + } + export = LightEvent; + +} +declare module "awayjs-core/lib/events/LoaderEvent" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import Event = require("awayjs-core/lib/events/Event"); + class LoaderEvent extends Event { + /** + * Dispatched when a resource and all of its dependencies is retrieved. + */ + static RESOURCE_COMPLETE: string; + private _url; + private _content; + private _assets; + /** + * Create a new LoaderEvent object. + * + * @param type The event type. + * @param url The url of the loaded resource. + * @param assets The assets of the loaded resource. + */ + constructor(type: string, url?: string, content?: DisplayObject, assets?: IAsset[]); + /** + * The content returned if the resource has been loaded inside a Loader object. + */ + public content : DisplayObject; + /** + * The url of the loaded resource. + */ + public url : string; + /** + * The error string on loadError. + */ + public assets : IAsset[]; + /** + * Clones the current event. + * @return An exact duplicate of the current event. + */ + public clone(): Event; + } + export = LoaderEvent; + +} +declare module "awayjs-core/lib/events/MaterialEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class MaterialEvent extends Event { + static SIZE_CHANGED: string; + constructor(type: string); + } + export = MaterialEvent; + +} +declare module "awayjs-core/lib/events/MouseEvent" { + import View = require("awayjs-core/lib/containers/View"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import Point = require("awayjs-core/lib/core/geom/Point"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import Event = require("awayjs-core/lib/events/Event"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * A MouseEvent is dispatched when a mouse event occurs over a mouseEnabled object in View. + * TODO: we don't have screenZ data, tho this should be easy to implement + */ + class MouseEvent extends Event { + public _iAllowedToPropagate: boolean; + public _iParentEvent: MouseEvent; + /** + * Defines the value of the type property of a mouseOver3d event object. + */ + static MOUSE_OVER: string; + /** + * Defines the value of the type property of a mouseOut3d event object. + */ + static MOUSE_OUT: string; + /** + * Defines the value of the type property of a mouseUp3d event object. + */ + static MOUSE_UP: string; + /** + * Defines the value of the type property of a mouseDown3d event object. + */ + static MOUSE_DOWN: string; + /** + * Defines the value of the type property of a mouseMove3d event object. + */ + static MOUSE_MOVE: string; + /** + * Defines the value of the type property of a click3d event object. + */ + static CLICK: string; + /** + * Defines the value of the type property of a doubleClick3d event object. + */ + static DOUBLE_CLICK: string; + /** + * Defines the value of the type property of a mouseWheel3d event object. + */ + static MOUSE_WHEEL: string; + /** + * The horizontal coordinate at which the event occurred in view coordinates. + */ + public screenX: number; + /** + * The vertical coordinate at which the event occurred in view coordinates. + */ + public screenY: number; + /** + * The view object inside which the event took place. + */ + public view: View; + /** + * The 3d object inside which the event took place. + */ + public object: DisplayObject; + /** + * The material owner inside which the event took place. + */ + public materialOwner: IMaterialOwner; + /** + * The material of the 3d element inside which the event took place. + */ + public material: MaterialBase; + /** + * The uv coordinate inside the draw primitive where the event took place. + */ + public uv: Point; + /** + * The index of the face where the event took place. + */ + public index: number; + /** + * The index of the subGeometry where the event took place. + */ + public subGeometryIndex: number; + /** + * The position in object space where the event took place + */ + public localPosition: Vector3D; + /** + * The normal in object space where the event took place + */ + public localNormal: Vector3D; + /** + * Indicates whether the Control key is active (true) or inactive (false). + */ + public ctrlKey: boolean; + /** + * Indicates whether the Alt key is active (true) or inactive (false). + */ + public altKey: boolean; + /** + * Indicates whether the Shift key is active (true) or inactive (false). + */ + public shiftKey: boolean; + /** + * Indicates how many lines should be scrolled for each unit the user rotates the mouse wheel. + */ + public delta: number; + /** + * Create a new MouseEvent object. + * @param type The type of the MouseEvent. + */ + constructor(type: string); + /** + * @inheritDoc + */ + public bubbles : boolean; + /** + * @inheritDoc + */ + public stopPropagation(): void; + /** + * @inheritDoc + */ + public stopImmediatePropagation(): void; + /** + * Creates a copy of the MouseEvent object and sets the value of each property to match that of the original. + */ + public clone(): Event; + /** + * The position in scene space where the event took place + */ + public scenePosition : Vector3D; + /** + * The normal in scene space where the event took place + */ + public sceneNormal : Vector3D; + } + export = MouseEvent; + +} +declare module "awayjs-core/lib/events/ParserEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class ParserEvent extends Event { + private _message; + /** + * Dispatched when parsing of an asset completed. + */ + static PARSE_COMPLETE: string; + /** + * Dispatched when an error occurs while parsing the data (e.g. because it's + * incorrectly formatted.) + */ + static PARSE_ERROR: string; + /** + * Dispatched when a parser is ready to have dependencies retrieved and resolved. + * This is an internal event that should rarely (if ever) be listened for by + * external classes. + */ + static READY_FOR_DEPENDENCIES: string; + constructor(type: string, message?: string); + /** + * Additional human-readable message. Usually supplied for ParserEvent.PARSE_ERROR events. + */ + public message : string; + public clone(): Event; + } + export = ParserEvent; + +} +declare module "awayjs-core/lib/events/ProgressEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class ProgressEvent extends Event { + static PROGRESS: string; + public bytesLoaded: number; + public bytesTotal: number; + constructor(type: string); + } + export = ProgressEvent; + +} +declare module "awayjs-core/lib/events/ProjectionEvent" { + import Event = require("awayjs-core/lib/events/Event"); + import IProjection = require("awayjs-core/lib/projections/IProjection"); + class ProjectionEvent extends Event { + static MATRIX_CHANGED: string; + private _projection; + constructor(type: string, projection: IProjection); + public projection : IProjection; + } + export = ProjectionEvent; + +} +declare module "awayjs-core/lib/events/RendererEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class RendererEvent extends Event { + static VIEWPORT_UPDATED: string; + static SCISSOR_UPDATED: string; + constructor(type: string); + } + export = RendererEvent; + +} +declare module "awayjs-core/lib/events/ResizeEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class ResizeEvent extends Event { + static RESIZE: string; + private _oldHeight; + private _oldWidth; + constructor(type: string, oldHeight?: number, oldWidth?: number); + public oldHeight : number; + public oldWidth : number; + } + export = ResizeEvent; + +} +declare module "awayjs-core/lib/events/SceneEvent" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Event = require("awayjs-core/lib/events/Event"); + class SceneEvent extends Event { + /** + * + */ + static ADDED_TO_SCENE: string; + /** + * + */ + static REMOVED_FROM_SCENE: string; + /** + * + */ + static PARTITION_CHANGED: string; + /** + * + */ + public displayObject: DisplayObject; + constructor(type: string, displayObject: DisplayObject); + } + export = SceneEvent; + +} +declare module "awayjs-core/lib/events/StageEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class StageEvent extends Event { + static CONTEXT_CREATED: string; + static CONTEXT_DISPOSED: string; + static CONTEXT_RECREATED: string; + static VIEWPORT_UPDATED: string; + constructor(type: string); + } + export = StageEvent; + +} +declare module "awayjs-core/lib/events/SubGeometryEvent" { + import Event = require("awayjs-core/lib/events/Event"); + /** + * Dispatched to notify changes in a sub geometry object's state. + * + * @class away.events.SubGeometryEvent + * @see away.core.base.Geometry + */ + class SubGeometryEvent extends Event { + /** + * Dispatched when a TriangleSubGeometry's index data has been updated. + */ + static INDICES_UPDATED: string; + /** + * Dispatched when a TriangleSubGeometry's vertex data has been updated. + */ + static VERTICES_UPDATED: string; + private _dataType; + /** + * Create a new GeometryEvent + * @param type The event type. + * @param dataType An optional data type of the vertex data being updated. + */ + constructor(type: string, dataType?: string); + /** + * The data type of the vertex data. + */ + public dataType : string; + /** + * Clones the event. + * + * @return An exact duplicate of the current object. + */ + public clone(): Event; + } + export = SubGeometryEvent; + +} +declare module "awayjs-core/lib/events/TimerEvent" { + import Event = require("awayjs-core/lib/events/Event"); + class TimerEvent extends Event { + static TIMER: string; + static TIMER_COMPLETE: string; + constructor(type: string); + } + export = TimerEvent; + +} +declare module "awayjs-core/lib/managers/MouseManager" { + import View = require("awayjs-core/lib/containers/View"); + import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + /** + * MouseManager enforces a singleton pattern and is not intended to be instanced. + * it provides a manager class for detecting mouse hits on scene objects and sending out mouse events. + */ + class MouseManager { + private static _instance; + private _viewLookup; + public _iActiveDiv: HTMLDivElement; + public _iUpdateDirty: boolean; + public _iCollidingObject: PickingCollisionVO; + private _nullVector; + private _previousCollidingObject; + private _queuedEvents; + private _mouseMoveEvent; + private _mouseUp; + private _mouseClick; + private _mouseOut; + private _mouseDown; + private _mouseMove; + private _mouseOver; + private _mouseWheel; + private _mouseDoubleClick; + private onClickDelegate; + private onDoubleClickDelegate; + private onMouseDownDelegate; + private onMouseMoveDelegate; + private onMouseUpDelegate; + private onMouseWheelDelegate; + private onMouseOverDelegate; + private onMouseOutDelegate; + /** + * Creates a new MouseManager object. + */ + constructor(); + static getInstance(): MouseManager; + public fireMouseEvents(forceMouseMove: boolean): void; + public registerView(view: View): void; + public unregisterView(view: View): void; + private queueDispatch(event, sourceEvent, collider?); + private onMouseMove(event); + private onMouseOut(event); + private onMouseOver(event); + private onClick(event); + private onDoubleClick(event); + private onMouseDown(event); + private onMouseUp(event); + private onMouseWheel(event); + private updateColliders(event); + } + export = MouseManager; + +} +declare module "awayjs-core/lib/materials/CSSMaterialBase" { + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); + /** + * MaterialBase forms an abstract base class for any material. + * A material consists of several passes, each of which constitutes at least one render call. Several passes could + * be used for special effects (render lighting for many lights in several passes, render an outline in a separate + * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space + * subsurface scattering, or rendering a depth map for specialized self-shadowing). + * + * Away3D provides default materials trough SinglePassMaterialBase and MultiPassMaterialBase, which use modular + * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom + * shaders, or entire new material frameworks. + */ + class CSSMaterialBase extends MaterialBase { + private _imageElement; + private _imageStyle; + public imageElement : HTMLImageElement; + public imageStyle : MSStyleCSSProperties; + /** + * The texture object to use for the albedo colour. + */ + public texture : Texture2DBase; + /** + * Creates a new MaterialBase object. + */ + constructor(texture?: Texture2DBase, smooth?: boolean, repeat?: boolean); + } + export = CSSMaterialBase; + +} +declare module "awayjs-core/lib/materials/LightSources" { + /** + * Enumeration class for defining which lighting types affect the specific material + * lighting component (diffuse and specular). This can be useful if, for example, you + * want to use light probes for diffuse global lighting, but want specular reflections from + * traditional light sources without those affecting the diffuse light. + * + * @see away.materials.ColorMaterial.diffuseLightSources + * @see away.materials.ColorMaterial.specularLightSources + * @see away.materials.TextureMaterial.diffuseLightSources + * @see away.materials.TextureMaterial.specularLightSources + */ + class LightSources { + /** + * Defines normal lights are to be used as the source for the lighting + * component. + */ + static LIGHTS: number; + /** + * Defines that global lighting probes are to be used as the source for the + * lighting component. + */ + static PROBES: number; + /** + * Defines that both normal and global lighting probes are to be used as the + * source for the lighting component. This is equivalent to LightSources.LIGHTS | LightSources.PROBES. + */ + static ALL: number; + } + export = LightSources; + +} +declare module "awayjs-core/lib/materials/MaterialBase" { + import IAnimationSet = require("awayjs-core/lib/animators/IAnimationSet"); + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import IStage = require("awayjs-core/lib/core/base/IStage"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import IMaterialData = require("awayjs-core/lib/core/pool/IMaterialData"); + import IMaterialPassData = require("awayjs-core/lib/core/pool/IMaterialPassData"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import LightPickerBase = require("awayjs-core/lib/materials/lightpickers/LightPickerBase"); + import IMaterialPass = require("awayjs-core/lib/materials/passes/IMaterialPass"); + import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); + /** + * MaterialBase forms an abstract base class for any material. + * A material consists of several passes, each of which constitutes at least one render call. Several passes could + * be used for special effects (render lighting for many lights in several passes, render an outline in a separate + * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space + * subsurface scattering, or rendering a depth map for specialized self-shadowing). + * + * Away3D provides default materials trough SinglePassMaterialBase and TriangleMaterial, which use modular + * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom + * shaders, or entire new material frameworks. + */ + class MaterialBase extends NamedAssetBase implements IAsset { + private _sizeChanged; + private _materialPassData; + private _materialData; + public _pAlphaThreshold: number; + public _pAnimateUVs: boolean; + private _enableLightFallOff; + private _specularLightSources; + private _diffuseLightSources; + /** + * An object to contain any extra data. + */ + public extra: Object; + /** + * A value that can be used by materials that only work with a given type of renderer. The renderer can test the + * classification to choose which render path to use. For example, a deferred material could set this value so + * that the deferred renderer knows not to take the forward rendering path. + * + * @private + */ + public _iClassification: string; + /** + * An id for this material used to sort the renderables by shader program, which reduces Program state changes. + * + * @private + */ + public _iMaterialId: number; + public _iBaseScreenPassIndex: number; + private _bothSides; + private _animationSet; + public _pScreenPassesInvalid: boolean; + /** + * A list of material owners, renderables or custom Entities. + */ + private _owners; + private _alphaPremultiplied; + public _pBlendMode: string; + private _numPasses; + private _passes; + private _mipmap; + private _smooth; + private _repeat; + private _color; + public _pTexture: Texture2DBase; + public _pLightPicker: LightPickerBase; + public _pHeight: number; + public _pWidth: number; + public _pRequiresBlending: boolean; + private _onPassChangeDelegate; + private _onLightChangeDelegate; + /** + * Creates a new MaterialBase object. + */ + constructor(); + /** + * @inheritDoc + */ + public assetType : string; + /** + * + */ + public height : number; + /** + * + */ + public animationSet : IAnimationSet; + /** + * The light picker used by the material to provide lights to the material if it supports lighting. + * + * @see LightPickerBase + * @see StaticLightPicker + */ + public lightPicker : LightPickerBase; + /** + * Indicates whether or not any used textures should use mipmapping. Defaults to true. + */ + public mipmap : boolean; + /** + * Indicates whether or not any used textures should use smoothing. + */ + public smooth : boolean; + /** + * Indicates whether or not any used textures should be tiled. If set to false, texture samples are clamped to + * the texture's borders when the uv coordinates are outside the [0, 1] interval. + */ + public repeat : boolean; + /** + * The diffuse reflectivity color of the surface. + */ + public color : number; + /** + * The texture object to use for the albedo colour. + */ + public texture : Texture2DBase; + /** + * Specifies whether or not the UV coordinates should be animated using a transformation matrix. + */ + public animateUVs : boolean; + /** + * Whether or not to use fallOff and radius properties for lights. This can be used to improve performance and + * compatibility for constrained mode. + */ + public enableLightFallOff : boolean; + /** + * Define which light source types to use for diffuse reflections. This allows choosing between regular lights + * and/or light probes for diffuse reflections. + * + * @see away3d.materials.LightSources + */ + public diffuseLightSources : number; + /** + * Define which light source types to use for specular reflections. This allows choosing between regular lights + * and/or light probes for specular reflections. + * + * @see away3d.materials.LightSources + */ + public specularLightSources : number; + /** + * Cleans up resources owned by the material, including passes. Textures are not owned by the material since they + * could be used by other materials and will not be disposed. + */ + public dispose(): void; + /** + * Defines whether or not the material should cull triangles facing away from the camera. + */ + public bothSides : boolean; + /** + * The blend mode to use when drawing this renderable. The following blend modes are supported: + *
    + *
  • BlendMode.NORMAL: No blending, unless the material inherently needs it
  • + *
  • BlendMode.LAYER: Force blending. This will draw the object the same as NORMAL, but without writing depth writes.
  • + *
  • BlendMode.MULTIPLY
  • + *
  • BlendMode.ADD
  • + *
  • BlendMode.ALPHA
  • + *
+ */ + public blendMode : string; + /** + * Indicates whether visible textures (or other pixels) used by this material have + * already been premultiplied. Toggle this if you are seeing black halos around your + * blended alpha edges. + */ + public alphaPremultiplied : boolean; + /** + * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either + * invisible or entirely opaque, often used with textures for foliage, etc. + * Recommended values are 0 to disable alpha, or 0.5 to create smooth edges. Default value is 0 (disabled). + */ + public alphaThreshold : number; + /** + * Indicates whether or not the material requires alpha blending during rendering. + */ + public requiresBlending : boolean; + /** + * + */ + public width : number; + /** + * Sets the render state for a pass that is independent of the rendered object. This needs to be called before + * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. + * @param pass The pass data to activate. + * @param stage The Stage object which is currently used for rendering. + * @param camera The camera from which the scene is viewed. + * @private + */ + public _iActivatePass(pass: IMaterialPassData, stage: IStage, camera: Camera): void; + /** + * Clears the render state for a pass. This needs to be called before activating another pass. + * @param pass The pass to deactivate. + * @param stage The Stage used for rendering + * + * @internal + */ + public _iDeactivatePass(pass: IMaterialPassData, stage: IStage): void; + /** + * Renders the current pass. Before calling renderPass, activatePass needs to be called with the same index. + * @param pass The pass used to render the renderable. + * @param renderable The IRenderable object to draw. + * @param stage The Stage object used for rendering. + * @param entityCollector The EntityCollector object that contains the visible scene data. + * @param viewProjection The view-projection matrix used to project to the screen. This is not the same as + * camera.viewProjection as it includes the scaling factors when rendering to textures. + * + * @internal + */ + public _iRenderPass(pass: IMaterialPassData, renderable: IRenderable, stage: IStage, camera: Camera, viewProjection: Matrix3D): void; + /** + * Mark an IMaterialOwner as owner of this material. + * Assures we're not using the same material across renderables with different animations, since the + * Programs depend on animation. This method needs to be called when a material is assigned. + * + * @param owner The IMaterialOwner that had this material assigned + * + * @internal + */ + public iAddOwner(owner: IMaterialOwner): void; + /** + * Removes an IMaterialOwner as owner. + * @param owner + * + * @internal + */ + public iRemoveOwner(owner: IMaterialOwner): void; + /** + * A list of the IMaterialOwners that use this material + * + * @private + */ + public iOwners : IMaterialOwner[]; + /** + * The amount of passes used by the material. + * + * @private + */ + public _iNumScreenPasses(): number; + /** + * A list of the screen passes used in this material + * + * @private + */ + public _iScreenPasses : IMaterialPass[]; + /** + * Marks the shader programs for all passes as invalid, so they will be recompiled before the next use. + * + * @private + */ + public _pInvalidatePasses(): void; + /** + * Flags that the screen passes have become invalid and need possible re-ordering / adding / deleting + */ + public _pInvalidateScreenPasses(): void; + /** + * Removes a pass from the material. + * @param pass The pass to be removed. + */ + public _pRemoveScreenPass(pass: IMaterialPass): void; + /** + * Removes all passes from the material + */ + public _pClearScreenPasses(): void; + /** + * Adds a pass to the material + * @param pass + */ + public _pAddScreenPass(pass: IMaterialPass): void; + public _iAddMaterialData(materialData: IMaterialData): IMaterialData; + public _iRemoveMaterialData(materialData: IMaterialData): IMaterialData; + /** + * Performs any processing that needs to occur before any of its passes are used. + * + * @private + */ + public _iUpdateMaterial(): void; + /** + * Listener for when a pass's shader code changes. It recalculates the render order id. + */ + private onPassChange(event); + private invalidateAnimation(); + private invalidateMaterial(); + /** + * Called when the light picker's configuration changed. + */ + private onLightsChange(event); + public _pNotifySizeChanged(): void; + public _iAddMaterialPassData(materialPassData: IMaterialPassData): IMaterialPassData; + public _iRemoveMaterialPassData(materialPassData: IMaterialPassData): IMaterialPassData; + } + export = MaterialBase; + +} +declare module "awayjs-core/lib/parsers/CubeTextureParser" { + import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + import ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); + /** + * CubeTextureParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into + * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without + * exception cases. + */ + class CubeTextureParser extends ParserBase { + private static posX; + private static negX; + private static posY; + private static negY; + private static posZ; + private static negZ; + private _imgDependencyDictionary; + /** + * Creates a new CubeTextureParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + constructor(); + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + static supportsType(extension: string): boolean; + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + static supportsData(data: any): boolean; + /** + * @inheritDoc + */ + public _iResolveDependency(resourceDependency: ResourceDependency): void; + /** + * @inheritDoc + */ + public _iResolveDependencyFailure(resourceDependency: ResourceDependency): void; + /** + * @inheritDoc + */ + public _pProceedParsing(): boolean; + private _validateCubeData(); + private _getHTMLImageElement(name); + } + export = CubeTextureParser; + +} +declare module "awayjs-core/lib/parsers/ParserBase" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + import TimerEvent = require("awayjs-core/lib/events/TimerEvent"); + import ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); + import ByteArray = require("awayjs-core/lib/utils/ByteArray"); + /** + * ParserBase provides an abstract base class for objects that convert blocks of data to data structures + * supported by away. + * + * If used by AssetLoader to automatically determine the parser type, two public static methods should + * be implemented, with the following signatures: + * + * public static supportsType(extension : string) : boolean + * Indicates whether or not a given file extension is supported by the parser. + * + * public static supportsData(data : *) : boolean + * Tests whether a data block can be parsed by the parser. + * + * Furthermore, for any concrete subtype, the method initHandle should be overridden to immediately + * create the object that will contain the parsed data. This allows ResourceManager to return an object + * handle regardless of whether the object was loaded or not. + * + * @see AssetLoader + */ + class ParserBase extends EventDispatcher { + public _iFileName: string; + private _dataFormat; + private _data; + private _frameLimit; + private _lastFrameTime; + private _pOnIntervalDelegate; + public _pContent: DisplayObject; + static supportsType(extension: string): boolean; + private _dependencies; + private _parsingPaused; + private _parsingComplete; + private _parsingFailure; + private _timer; + private _materialMode; + /** + * Returned by proceedParsing to indicate no more parsing is needed. + */ + static PARSING_DONE: boolean; + /** + * Returned by proceedParsing to indicate more parsing is needed, allowing asynchronous parsing. + */ + static MORE_TO_PARSE: boolean; + public content : DisplayObject; + /** + * Creates a new ParserBase object + * @param format The data format of the file data to be parsed. Can be either ParserDataFormat.BINARY or ParserDataFormat.PLAIN_TEXT, and should be provided by the concrete subtype. + * + * @see away.loading.parsers.ParserDataFormat + */ + constructor(format: string); + /** + * Validates a bitmapData loaded before assigning to a default BitmapMaterial + */ + public isBitmapDataValid(bitmapData: BitmapData): boolean; + public parsingFailure : boolean; + public parsingPaused : boolean; + public parsingComplete : boolean; + public materialMode : number; + public data : any; + /** + * The data format of the file data to be parsed. Options are URLLoaderDataFormat.BINARY, URLLoaderDataFormat.ARRAY_BUFFER, URLLoaderDataFormat.BLOB, URLLoaderDataFormat.VARIABLES or URLLoaderDataFormat.TEXT. + */ + public dataFormat : string; + /** + * Parse data (possibly containing bytearry, plain text or BitmapAsset) asynchronously, meaning that + * the parser will periodically stop parsing so that the AVM may proceed to the + * next frame. + * + * @param data The untyped data object in which the loaded data resides. + * @param frameLimit number of milliseconds of parsing allowed per frame. The + * actual time spent on a frame can exceed this number since time-checks can + * only be performed between logical sections of the parsing procedure. + */ + public parseAsync(data: any, frameLimit?: number): void; + /** + * A list of dependencies that need to be loaded and resolved for the object being parsed. + */ + public dependencies : ResourceDependency[]; + /** + * Resolve a dependency when it's loaded. For example, a dependency containing an ImageResource would be assigned + * to a Mesh instance as a BitmapMaterial, a scene graph object would be added to its intended parent. The + * dependency should be a member of the dependencies property. + * + * @param resourceDependency The dependency to be resolved. + */ + public _iResolveDependency(resourceDependency: ResourceDependency): void; + /** + * Resolve a dependency loading failure. Used by parser to eventually provide a default map + * + * @param resourceDependency The dependency to be resolved. + */ + public _iResolveDependencyFailure(resourceDependency: ResourceDependency): void; + /** + * Resolve a dependency name + * + * @param resourceDependency The dependency to be resolved. + */ + public _iResolveDependencyName(resourceDependency: ResourceDependency, asset: IAsset): string; + public _iResumeParsingAfterDependencies(): void; + public _pFinalizeAsset(asset: IAsset, name?: string): void; + /** + * Parse the next block of data. + * @return Whether or not more data needs to be parsed. Can be ParserBase.ParserBase.PARSING_DONE or + * ParserBase.ParserBase.MORE_TO_PARSE. + */ + public _pProceedParsing(): boolean; + public _pDieWithError(message?: string): void; + public _pAddDependency(id: string, req: URLRequest, retrieveAsRawData?: boolean, data?: any, suppressErrorEvents?: boolean): ResourceDependency; + public _pPauseAndRetrieveDependencies(): void; + /** + * Tests whether or not there is still time left for parsing within the maximum allowed time frame per session. + * @return True if there is still time left, false if the maximum allotted time was exceeded and parsing should be interrupted. + */ + public _pHasTime(): boolean; + /** + * Called when the parsing pause interval has passed and parsing can proceed. + */ + public _pOnInterval(event?: TimerEvent): void; + /** + * Initializes the parsing of data. + * @param frameLimit The maximum duration of a parsing session. + */ + public _pStartParsing(frameLimit: number): void; + /** + * Finish parsing the data. + */ + public _pFinishParsing(): void; + /** + * + * @returns {string} + * @private + */ + public _pGetTextData(): string; + /** + * + * @returns {string} + * @private + */ + public _pGetByteData(): ByteArray; + } + export = ParserBase; + +} +declare module "awayjs-core/lib/parsers/ParserDataFormat" { + /** + * An enumeration providing values to describe the data format of parsed data. + */ + class ParserDataFormat { + /** + * Describes the format of a binary file. + */ + static BINARY: string; + /** + * Describes the format of a plain text file. + */ + static PLAIN_TEXT: string; + /** + * Describes the format of an image file + */ + static IMAGE: string; + } + export = ParserDataFormat; + +} +declare module "awayjs-core/lib/parsers/ParserUtils" { + import ByteArray = require("awayjs-core/lib/utils/ByteArray"); + class ParserUtils { + /** + * Converts an ArrayBuffer to a base64 string + * + * @param image data as a ByteArray + * + * @return HTMLImageElement + * + */ + static arrayBufferToImage(data: ArrayBuffer): HTMLImageElement; + /** + * Converts an ByteArray to an Image - returns an HTMLImageElement + * + * @param image data as a ByteArray + * + * @return HTMLImageElement + * + */ + static byteArrayToImage(data: ByteArray): HTMLImageElement; + /** + * Converts an Blob to an Image - returns an HTMLImageElement + * + * @param image data as a Blob + * + * @return HTMLImageElement + * + */ + static blobToImage(data: Blob): HTMLImageElement; + /** + * Returns a object as ByteArray, if possible. + * + * @param data The object to return as ByteArray + * + * @return The ByteArray or null + * + */ + static toByteArray(data: any): ByteArray; + /** + * Returns a object as String, if possible. + * + * @param data The object to return as String + * @param length The length of the returned String + * + * @return The String or null + * + */ + static toString(data: any, length?: number): string; + } + export = ParserUtils; + +} +declare module "awayjs-core/lib/parsers/ResourceDependency" { + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); + import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + /** + * ResourceDependency represents the data required to load, parse and resolve additional files ("dependencies") + * required by a parser, used by ResourceLoadSession. + * + */ + class ResourceDependency { + private _id; + private _request; + private _assets; + private _parser; + private _parentParser; + private _data; + private _retrieveAsRawData; + private _suppressAssetEvents; + private _dependencies; + public _iLoader: URLLoader; + public _iSuccess: boolean; + constructor(id: string, request: URLRequest, data: any, parser: ParserBase, parentParser: ParserBase, retrieveAsRawData?: boolean, suppressAssetEvents?: boolean); + /** + * + */ + public id : string; + /** + * + */ + public request : URLRequest; + /** + * The data containing the dependency to be parsed, if the resource was already loaded. + */ + public data : any; + /** + * + */ + public parser : ParserBase; + /** + * The parser which is dependent on this ResourceDependency object. + */ + public parentParser : ParserBase; + /** + * + */ + public retrieveAsRawData : boolean; + /** + * + */ + public suppresAssetEvents : boolean; + /** + * + */ + public assets : IAsset[]; + /** + * + */ + public dependencies : ResourceDependency[]; + /** + * @private + * Method to set data after having already created the dependency object, e.g. after load. + */ + public _iSetData(data: any): void; + /** + * @private + * + */ + public _iSetParser(parser: ParserBase): void; + /** + * Resolve the dependency when it's loaded with the parent parser. For example, a dependency containing an + * ImageResource would be assigned to a Mesh instance as a BitmapMaterial, a scene graph object would be added + * to its intended parent. The dependency should be a member of the dependencies property. + */ + public resolve(): void; + /** + * Resolve a dependency failure. For example, map loading failure from a 3d file + */ + public resolveFailure(): void; + /** + * Resolve the dependencies name + */ + public resolveName(asset: IAsset): string; + } + export = ResourceDependency; + +} +declare module "awayjs-core/lib/parsers/Texture2DParser" { + import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + /** + * Texture2DParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into + * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without + * exception cases. + */ + class Texture2DParser extends ParserBase { + private _startedParsing; + private _doneParsing; + private _loadingImage; + private _htmlImageElement; + /** + * Creates a new Texture2DParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + constructor(); + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + static supportsType(extension: string): boolean; + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + static supportsData(data: any): boolean; + /** + * @inheritDoc + */ + public _pProceedParsing(): boolean; + public onLoadComplete(event: any): void; + } + export = Texture2DParser; + +} +declare module "awayjs-core/lib/prefabs/PrefabBase" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + /** + * PrefabBase is an abstract base class for prefabs, which are prebuilt display objects that allow easy cloning and updating + */ + class PrefabBase extends NamedAssetBase { + public _pObjects: DisplayObject[]; + /** + * Creates a new PrefabBase object. + */ + constructor(); + /** + * Returns a display object generated from this prefab + */ + public getNewObject(): DisplayObject; + public _pCreateObject(): DisplayObject; + public _iValidate(): void; + } + export = PrefabBase; + +} +declare module "awayjs-core/lib/prefabs/PrimitiveCapsulePrefab" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + /** + * A Capsule primitive mesh. + */ + class PrimitiveCapsulePrefab extends PrimitivePrefabBase implements IAsset { + private _radius; + private _height; + private _segmentsW; + private _segmentsH; + private _yUp; + private _numVertices; + /** + * The radius of the capsule. + */ + public radius : number; + /** + * The height of the capsule. + */ + public height : number; + /** + * Defines the number of horizontal segments that make up the capsule. Defaults to 16. + */ + public segmentsW : number; + /** + * Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven. + */ + public segmentsH : number; + /** + * Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + public yUp : boolean; + /** + * Creates a new Capsule object. + * @param radius The radius of the capsule. + * @param height The height of the capsule. + * @param segmentsW Defines the number of horizontal segments that make up the capsule. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven value. + * @param yUp Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius?: number, height?: number, segmentsW?: number, segmentsH?: number, yUp?: boolean); + /** + * @inheritDoc + */ + public _pBuildGeometry(target: SubGeometryBase, geometryType: string): void; + /** + * @inheritDoc + */ + public _pBuildUVs(target: SubGeometryBase, geometryType: string): void; + } + export = PrimitiveCapsulePrefab; + +} +declare module "awayjs-core/lib/prefabs/PrimitiveConePrefab" { + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import PrimitiveCylinderPrefab = require("awayjs-core/lib/prefabs/PrimitiveCylinderPrefab"); + /** + * A UV Cone primitive mesh. + */ + class PrimitiveConePrefab extends PrimitiveCylinderPrefab implements IAsset { + /** + * The radius of the bottom end of the cone. + */ + public radius : number; + /** + * Creates a new Cone object. + * @param radius The radius of the bottom end of the cone + * @param height The height of the cone + * @param segmentsW Defines the number of horizontal segments that make up the cone. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the cone. Defaults to 1. + * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius?: number, height?: number, segmentsW?: number, segmentsH?: number, closed?: boolean, yUp?: boolean); + } + export = PrimitiveConePrefab; + +} +declare module "awayjs-core/lib/prefabs/PrimitiveCubePrefab" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + /** + * A Cube primitive prefab. + */ + class PrimitiveCubePrefab extends PrimitivePrefabBase implements IAsset { + private _width; + private _height; + private _depth; + private _tile6; + private _segmentsW; + private _segmentsH; + private _segmentsD; + /** + * Creates a new Cube object. + * @param width The size of the cube along its X-axis. + * @param height The size of the cube along its Y-axis. + * @param depth The size of the cube along its Z-axis. + * @param segmentsW The number of segments that make up the cube along the X-axis. + * @param segmentsH The number of segments that make up the cube along the Y-axis. + * @param segmentsD The number of segments that make up the cube along the Z-axis. + * @param tile6 The type of uv mapping to use. When true, a texture will be subdivided in a 2x3 grid, each used for a single face. When false, the entire image is mapped on each face. + */ + constructor(width?: number, height?: number, depth?: number, segmentsW?: number, segmentsH?: number, segmentsD?: number, tile6?: boolean); + /** + * The size of the cube along its X-axis. + */ + public width : number; + /** + * The size of the cube along its Y-axis. + */ + public height : number; + /** + * The size of the cube along its Z-axis. + */ + public depth : number; + /** + * The type of uv mapping to use. When false, the entire image is mapped on each face. + * When true, a texture will be subdivided in a 3x2 grid, each used for a single face. + * Reading the tiles from left to right, top to bottom they represent the faces of the + * cube in the following order: bottom, top, back, left, front, right. This creates + * several shared edges (between the top, front, left and right faces) which simplifies + * texture painting. + */ + public tile6 : boolean; + /** + * The number of segments that make up the cube along the X-axis. Defaults to 1. + */ + public segmentsW : number; + /** + * The number of segments that make up the cube along the Y-axis. Defaults to 1. + */ + public segmentsH : number; + /** + * The number of segments that make up the cube along the Z-axis. Defaults to 1. + */ + public segmentsD : number; + /** + * @inheritDoc + */ + public _pBuildGeometry(target: SubGeometryBase, geometryType: string): void; + /** + * @inheritDoc + */ + public _pBuildUVs(target: SubGeometryBase, geometryType: string): void; + } + export = PrimitiveCubePrefab; + +} +declare module "awayjs-core/lib/prefabs/PrimitiveCylinderPrefab" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + /** + * A Cylinder primitive mesh. + */ + class PrimitiveCylinderPrefab extends PrimitivePrefabBase implements IAsset { + public _pBottomRadius: number; + public _pSegmentsW: number; + public _pSegmentsH: number; + private _topRadius; + private _height; + private _topClosed; + private _bottomClosed; + private _surfaceClosed; + private _yUp; + private _numVertices; + /** + * The radius of the top end of the cylinder. + */ + public topRadius : number; + /** + * The radius of the bottom end of the cylinder. + */ + public bottomRadius : number; + /** + * The radius of the top end of the cylinder. + */ + public height : number; + /** + * Defines the number of horizontal segments that make up the cylinder. Defaults to 16. + */ + public segmentsW : number; + public setSegmentsW(value: number): void; + /** + * Defines the number of vertical segments that make up the cylinder. Defaults to 1. + */ + public segmentsH : number; + public setSegmentsH(value: number): void; + /** + * Defines whether the top end of the cylinder is closed (true) or open. + */ + public topClosed : boolean; + /** + * Defines whether the bottom end of the cylinder is closed (true) or open. + */ + public bottomClosed : boolean; + /** + * Defines whether the cylinder poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + public yUp : boolean; + /** + * Creates a new Cylinder object. + * @param topRadius The radius of the top end of the cylinder. + * @param bottomRadius The radius of the bottom end of the cylinder + * @param height The radius of the bottom end of the cylinder + * @param segmentsW Defines the number of horizontal segments that make up the cylinder. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the cylinder. Defaults to 1. + * @param topClosed Defines whether the top end of the cylinder is closed (true) or open. + * @param bottomClosed Defines whether the bottom end of the cylinder is closed (true) or open. + * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(topRadius?: number, bottomRadius?: number, height?: number, segmentsW?: number, segmentsH?: number, topClosed?: boolean, bottomClosed?: boolean, surfaceClosed?: boolean, yUp?: boolean); + /** + * @inheritDoc + */ + public _pBuildGeometry(target: SubGeometryBase, geometryType: string): void; + /** + * @inheritDoc + */ + public _pBuildUVs(target: SubGeometryBase, geometryType: string): void; + } + export = PrimitiveCylinderPrefab; + +} +declare module "awayjs-core/lib/prefabs/PrimitivePlanePrefab" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + /** + * A Plane primitive mesh. + */ + class PrimitivePlanePrefab extends PrimitivePrefabBase implements IAsset { + private _segmentsW; + private _segmentsH; + private _yUp; + private _width; + private _height; + private _doubleSided; + /** + * Creates a new Plane object. + * @param width The width of the plane. + * @param height The height of the plane. + * @param segmentsW The number of segments that make up the plane along the X-axis. + * @param segmentsH The number of segments that make up the plane along the Y or Z-axis. + * @param yUp Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). + * @param doubleSided Defines whether the plane will be visible from both sides, with correct vertex normals. + */ + constructor(width?: number, height?: number, segmentsW?: number, segmentsH?: number, yUp?: boolean, doubleSided?: boolean); + /** + * The number of segments that make up the plane along the X-axis. Defaults to 1. + */ + public segmentsW : number; + /** + * The number of segments that make up the plane along the Y or Z-axis, depending on whether yUp is true or + * false, respectively. Defaults to 1. + */ + public segmentsH : number; + /** + * Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). Defaults to true. + */ + public yUp : boolean; + /** + * Defines whether the plane will be visible from both sides, with correct vertex normals (as opposed to bothSides on Material). Defaults to false. + */ + public doubleSided : boolean; + /** + * The width of the plane. + */ + public width : number; + /** + * The height of the plane. + */ + public height : number; + /** + * @inheritDoc + */ + public _pBuildGeometry(target: SubGeometryBase, geometryType: string): void; + /** + * @inheritDoc + */ + public _pBuildUVs(target: SubGeometryBase, geometryType: string): void; + } + export = PrimitivePlanePrefab; + +} +declare module "awayjs-core/lib/prefabs/PrimitivePolygonPrefab" { + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import PrimitiveCylinderPrefab = require("awayjs-core/lib/prefabs/PrimitiveCylinderPrefab"); + /** + * A UV RegularPolygon primitive mesh. + */ + class PrimitivePolygonPrefab extends PrimitiveCylinderPrefab implements IAsset { + /** + * The radius of the regular polygon. + */ + public radius : number; + /** + * The number of sides of the regular polygon. + */ + public sides : number; + /** + * The number of subdivisions from the edge to the center of the regular polygon. + */ + public subdivisions : number; + /** + * Creates a new RegularPolygon disc object. + * @param radius The radius of the regular polygon + * @param sides Defines the number of sides of the regular polygon. + * @param yUp Defines whether the regular polygon should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius?: number, sides?: number, yUp?: boolean); + } + export = PrimitivePolygonPrefab; + +} +declare module "awayjs-core/lib/prefabs/PrimitivePrefabBase" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import Geometry = require("awayjs-core/lib/core/base/Geometry"); + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + import PrefabBase = require("awayjs-core/lib/prefabs/PrefabBase"); + /** + * PrimitivePrefabBase is an abstract base class for polytope prefabs, which are simple pre-built geometric shapes + */ + class PrimitivePrefabBase extends PrefabBase { + public _geomDirty: boolean; + public _uvDirty: boolean; + private _material; + private _geometry; + private _subGeometry; + private _geometryType; + private _geometryTypeDirty; + /** + * + */ + public assetType : string; + /** + * + */ + public geometryType : string; + public geometry : Geometry; + /** + * The material with which to render the primitive. + */ + public material : MaterialBase; + /** + * Creates a new PrimitivePrefabBase object. + * + * @param material The material with which to render the object + */ + constructor(material?: MaterialBase, geometryType?: string); + /** + * Builds the primitive's geometry when invalid. This method should not be called directly. The calling should + * be triggered by the invalidateGeometry method (and in turn by updateGeometry). + */ + public _pBuildGeometry(target: SubGeometryBase, geometryType: string): void; + /** + * Builds the primitive's uv coordinates when invalid. This method should not be called directly. The calling + * should be triggered by the invalidateUVs method (and in turn by updateUVs). + */ + public _pBuildUVs(target: SubGeometryBase, geometryType: string): void; + /** + * Invalidates the primitive's geometry type, causing it to be updated when requested. + */ + public invalidateGeometryType(): void; + /** + * Invalidates the primitive's geometry, causing it to be updated when requested. + */ + public _pInvalidateGeometry(): void; + /** + * Invalidates the primitive's uv coordinates, causing them to be updated when requested. + */ + public _pInvalidateUVs(): void; + /** + * Updates the subgeometry when invalid. + */ + private updateGeometryType(); + /** + * Updates the geometry when invalid. + */ + private updateGeometry(); + /** + * Updates the uv coordinates when invalid. + */ + private updateUVs(); + public _iValidate(): void; + public _pCreateObject(): DisplayObject; + } + export = PrimitivePrefabBase; + +} +declare module "awayjs-core/lib/prefabs/PrimitiveSpherePrefab" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + /** + * A UV Sphere primitive mesh. + */ + class PrimitiveSpherePrefab extends PrimitivePrefabBase implements IAsset { + private _radius; + private _segmentsW; + private _segmentsH; + private _yUp; + /** + * The radius of the sphere. + */ + public radius : number; + /** + * Defines the number of horizontal segments that make up the sphere. Defaults to 16. + */ + public segmentsW : number; + /** + * Defines the number of vertical segments that make up the sphere. Defaults to 12. + */ + public segmentsH : number; + /** + * Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + public yUp : boolean; + /** + * Creates a new Sphere object. + * + * @param radius The radius of the sphere. + * @param segmentsW Defines the number of horizontal segments that make up the sphere. + * @param segmentsH Defines the number of vertical segments that make up the sphere. + * @param yUp Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius?: number, segmentsW?: number, segmentsH?: number, yUp?: boolean); + /** + * @inheritDoc + */ + public _pBuildGeometry(target: SubGeometryBase, geometryType: string): void; + /** + * @inheritDoc + */ + public _pBuildUVs(target: SubGeometryBase, geometryType: string): void; + } + export = PrimitiveSpherePrefab; + +} +declare module "awayjs-core/lib/prefabs/PrimitiveTorusPrefab" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + /** + * A UV Cylinder primitive mesh. + */ + class PrimitiveTorusPrefab extends PrimitivePrefabBase implements IAsset { + private _radius; + private _tubeRadius; + private _segmentsR; + private _segmentsT; + private _yUp; + private _numVertices; + /** + * The radius of the torus. + */ + public radius : number; + /** + * The radius of the inner tube of the torus. + */ + public tubeRadius : number; + /** + * Defines the number of horizontal segments that make up the torus. Defaults to 16. + */ + public segmentsR : number; + /** + * Defines the number of vertical segments that make up the torus. Defaults to 8. + */ + public segmentsT : number; + /** + * Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + public yUp : boolean; + /** + * Creates a new Torus object. + * @param radius The radius of the torus. + * @param tuebRadius The radius of the inner tube of the torus. + * @param segmentsR Defines the number of horizontal segments that make up the torus. + * @param segmentsT Defines the number of vertical segments that make up the torus. + * @param yUp Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius?: number, tubeRadius?: number, segmentsR?: number, segmentsT?: number, yUp?: boolean); + /** + * @inheritDoc + */ + public _pBuildGeometry(target: SubGeometryBase, geometryType: string): void; + /** + * @inheritDoc + */ + public _pBuildUVs(target: SubGeometryBase, geometryType: string): void; + } + export = PrimitiveTorusPrefab; + +} +declare module "awayjs-core/lib/projections/CoordinateSystem" { + /** + * Provides constant values for camera lens projection options use the the coordinateSystem property + * + * @see away.projections.PerspectiveLens#coordinateSystem + */ + class CoordinateSystem { + /** + * Default option, projects to a left-handed coordinate system + */ + static LEFT_HANDED: string; + /** + * Projects to a right-handed coordinate system + */ + static RIGHT_HANDED: string; + } + export = CoordinateSystem; + +} +declare module "awayjs-core/lib/projections/FreeMatrixProjection" { + import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + class FreeMatrixProjection extends ProjectionBase { + constructor(); + public near : number; + public far : number; + public iAspectRatio : number; + public clone(): ProjectionBase; + public pUpdateMatrix(): void; + } + export = FreeMatrixProjection; + +} +declare module "awayjs-core/lib/projections/IProjection" { + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); + /** + * IMaterialOwner provides an interface for objects that can use materials. + * + * @interface away.base.IMaterialOwner + */ + interface IProjection extends IEventDispatcher { + coordinateSystem: string; + frustumCorners: number[]; + matrix: Matrix3D; + near: number; + originX: number; + originY: number; + far: number; + _iAspectRatio: number; + project(point3d: Vector3D): Vector3D; + unproject(nX: number, nY: number, sZ: number): Vector3D; + _iUpdateScissorRect(x: number, y: number, width: number, height: number): any; + _iUpdateViewport(x: number, y: number, width: number, height: number): any; + } + export = IProjection; + +} +declare module "awayjs-core/lib/projections/ObliqueNearPlaneProjection" { + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import IProjection = require("awayjs-core/lib/projections/IProjection"); + import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + class ObliqueNearPlaneProjection extends ProjectionBase { + private _baseProjection; + private _plane; + private _onProjectionMatrixChangedDelegate; + constructor(baseProjection: IProjection, plane: Plane3D); + public frustumCorners : number[]; + public near : number; + public far : number; + public iAspectRatio : number; + public plane : Plane3D; + public baseProjection : IProjection; + private onProjectionMatrixChanged(event); + public pUpdateMatrix(): void; + } + export = ObliqueNearPlaneProjection; + +} +declare module "awayjs-core/lib/projections/OrthographicOffCenterProjection" { + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + class OrthographicOffCenterProjection extends ProjectionBase { + private _minX; + private _maxX; + private _minY; + private _maxY; + constructor(minX: number, maxX: number, minY: number, maxY: number); + public minX : number; + public maxX : number; + public minY : number; + public maxY : number; + public unproject(nX: number, nY: number, sZ: number): Vector3D; + public clone(): ProjectionBase; + public pUpdateMatrix(): void; + } + export = OrthographicOffCenterProjection; + +} +declare module "awayjs-core/lib/projections/OrthographicProjection" { + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + class OrthographicProjection extends ProjectionBase { + private _projectionHeight; + private _xMax; + private _yMax; + constructor(projectionHeight?: number); + public projectionHeight : number; + public unproject(nX: number, nY: number, sZ: number): Vector3D; + public clone(): ProjectionBase; + public pUpdateMatrix(): void; + } + export = OrthographicProjection; + +} +declare module "awayjs-core/lib/projections/PerspectiveProjection" { + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + class PerspectiveProjection extends ProjectionBase { + private _fieldOfView; + private _focalLength; + private _hFieldOfView; + private _hFocalLength; + private _preserveAspectRatio; + private _preserveFocalLength; + constructor(fieldOfView?: number, coordinateSystem?: string); + /** + * + */ + public preserveAspectRatio : boolean; + /** + * + */ + public preserveFocalLength : boolean; + /** + * + */ + public fieldOfView : number; + /** + * + */ + public focalLength : number; + /** + * + */ + public hFieldOfView : number; + /** + * + */ + public hFocalLength : number; + public unproject(nX: number, nY: number, sZ: number): Vector3D; + public clone(): ProjectionBase; + public pUpdateMatrix(): void; + } + export = PerspectiveProjection; + +} +declare module "awayjs-core/lib/projections/ProjectionBase" { + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + import IProjection = require("awayjs-core/lib/projections/IProjection"); + class ProjectionBase extends EventDispatcher implements IProjection { + public _pMatrix: Matrix3D; + public _pScissorRect: Rectangle; + public _pViewPort: Rectangle; + public _pNear: number; + public _pFar: number; + public _pAspectRatio: number; + public _pMatrixInvalid: boolean; + public _pFrustumCorners: number[]; + public _pCoordinateSystem: string; + public _pOriginX: number; + public _pOriginY: number; + private _unprojection; + private _unprojectionInvalid; + constructor(coordinateSystem?: string); + /** + * The handedness of the coordinate system projection. The default is LEFT_HANDED. + */ + public coordinateSystem : string; + public frustumCorners : number[]; + public matrix : Matrix3D; + public near : number; + public originX : number; + public originY : number; + public far : number; + public project(point3d: Vector3D): Vector3D; + public unprojectionMatrix : Matrix3D; + public unproject(nX: number, nY: number, sZ: number): Vector3D; + public clone(): ProjectionBase; + public _iAspectRatio : number; + public pInvalidateMatrix(): void; + public pUpdateMatrix(): void; + public _iUpdateScissorRect(x: number, y: number, width: number, height: number): void; + public _iUpdateViewport(x: number, y: number, width: number, height: number): void; + } + export = ProjectionBase; + +} +declare module "awayjs-core/lib/textures/BitmapCubeTexture" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); + class BitmapCubeTexture extends CubeTextureBase { + private _bitmapDatas; + /** + * The texture on the cube's right face. + */ + public positiveX : BitmapData; + /** + * The texture on the cube's left face. + */ + public negativeX : BitmapData; + /** + * The texture on the cube's top face. + */ + public positiveY : BitmapData; + /** + * The texture on the cube's bottom face. + */ + public negativeY : BitmapData; + /** + * The texture on the cube's far face. + */ + public positiveZ : BitmapData; + /** + * The texture on the cube's near face. + */ + public negativeZ : BitmapData; + constructor(posX: BitmapData, negX: BitmapData, posY: BitmapData, negY: BitmapData, posZ: BitmapData, negZ: BitmapData, generateMipmaps?: boolean); + /** + * + * @param value + * @private + */ + private _testSize(value); + public dispose(): void; + public _iGetTextureData(side: number): BitmapData; + } + export = BitmapCubeTexture; + +} +declare module "awayjs-core/lib/textures/BitmapTexture" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); + class BitmapTexture extends Texture2DBase { + public _bitmapData: BitmapData; + /** + * + * @returns {BitmapData} + */ + public bitmapData : BitmapData; + constructor(bitmapData: BitmapData, generateMipmaps?: boolean); + public dispose(): void; + public _iGetTextureData(): BitmapData; + } + export = BitmapTexture; + +} +declare module "awayjs-core/lib/textures/CubeTextureBase" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + class CubeTextureBase extends TextureProxyBase { + public _mipmapDataArray: BitmapData[][]; + public _mipmapDataDirtyArray: boolean[]; + constructor(generateMipmaps?: boolean); + /** + * + * @param width + * @param height + * @private + */ + public _pSetSize(size: number): void; + /** + * @inheritDoc + */ + public dispose(): void; + /** + * + */ + public invalidateContent(): void; + public _iGetMipmapData(side: number): BitmapData[]; + public _iGetTextureData(side: number): any; + } + export = CubeTextureBase; + +} +declare module "awayjs-core/lib/textures/ImageCubeTexture" { + import CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); + class ImageCubeTexture extends CubeTextureBase { + private _htmlImageElements; + /** + * The texture on the cube's right face. + */ + public positiveX : HTMLImageElement; + /** + * The texture on the cube's left face. + */ + public negativeX : HTMLImageElement; + /** + * The texture on the cube's top face. + */ + public positiveY : HTMLImageElement; + /** + * The texture on the cube's bottom face. + */ + public negativeY : HTMLImageElement; + /** + * The texture on the cube's far face. + */ + public positiveZ : HTMLImageElement; + /** + * The texture on the cube's near face. + */ + public negativeZ : HTMLImageElement; + constructor(posX: HTMLImageElement, negX: HTMLImageElement, posY: HTMLImageElement, negY: HTMLImageElement, posZ: HTMLImageElement, negZ: HTMLImageElement, generateMipmaps?: boolean); + private _testSize(value); + public _iGetTextureData(side: number): HTMLImageElement; + } + export = ImageCubeTexture; + +} +declare module "awayjs-core/lib/textures/ImageTexture" { + import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); + class ImageTexture extends Texture2DBase { + private _htmlImageElement; + /** + * + * @param htmlImageElement + * @param generateMipmaps + */ + constructor(htmlImageElement: HTMLImageElement, generateMipmaps?: boolean); + /** + * + */ + public htmlImageElement : HTMLImageElement; + public _iGetTextureData(): HTMLImageElement; + } + export = ImageTexture; + +} +declare module "awayjs-core/lib/textures/MipmapGenerator" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + /** + * MipmapGenerator is a helper class that uploads BitmapData to a Texture including mipmap levels. + */ + class MipmapGenerator { + private static _mipMaps; + private static _mipMapUses; + private static _matrix; + private static _rect; + private static _source; + /** + * Uploads a BitmapData with mip maps to a target Texture object. + * @param source The source to upload. + * @param target The target Texture to upload to. + * @param mipmap An optional mip map holder to avoids creating new instances for fe animated materials. + * @param alpha Indicate whether or not the uploaded bitmapData is transparent. + */ + static generateMipMaps(source: HTMLImageElement, output?: BitmapData[], alpha?: boolean): any; + static generateMipMaps(source: BitmapData, output?: BitmapData[], alpha?: boolean): any; + private static _getMipmapHolder(mipMapHolder, newW, newH); + static freeMipMapHolder(mipMapHolder: BitmapData): void; + } + export = MipmapGenerator; + +} +declare module "awayjs-core/lib/textures/RenderTexture" { + import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); + class RenderTexture extends Texture2DBase { + /** + * + * @returns {number} + */ + public width : number; + /** + * + * @returns {number} + */ + public height : number; + constructor(width: number, height: number); + } + export = RenderTexture; + +} +declare module "awayjs-core/lib/textures/SpecularBitmapTexture" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); + /** + * A convenience texture that encodes a specular map in the red channel, and the gloss map in the green channel, as expected by BasicSpecularMapMethod + */ + class SpecularBitmapTexture extends BitmapTexture { + private _specularMap; + private _glossMap; + constructor(specularMap?: BitmapData, glossMap?: BitmapData, generateMipmaps?: boolean); + public specularMap : BitmapData; + public glossMap : BitmapData; + private _testSize(); + public _iGetTextureData(): BitmapData; + } + export = SpecularBitmapTexture; + +} +declare module "awayjs-core/lib/textures/Texture2DBase" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + class Texture2DBase extends TextureProxyBase { + private _mipmapData; + private _mipmapDataDirty; + public _pWidth: number; + public _pHeight: number; + /** + * + * @returns {number} + */ + public width : number; + /** + * + * @returns {number} + */ + public height : number; + public size : number; + constructor(generateMipmaps?: boolean); + /** + * @inheritDoc + */ + public dispose(): void; + /** + * + */ + public invalidateContent(): void; + /** + * + * @param width + * @param height + * @private + */ + public _pSetSize(width: number, height: number): void; + public _iGetMipmapData(): BitmapData[]; + public _iGetTextureData(): any; + } + export = Texture2DBase; + +} +declare module "awayjs-core/lib/textures/TextureProxyBase" { + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + import ITextureData = require("awayjs-core/lib/core/pool/ITextureData"); + /** + * + */ + class TextureProxyBase extends NamedAssetBase implements IAsset { + public _pSize: number; + public _pFormat: string; + private _hasMipmaps; + private _generateMipmaps; + private _textureData; + /** + * + */ + constructor(generateMipmaps?: boolean); + public size : number; + public hasMipmaps : boolean; + /** + * + * @returns {string} + */ + public format : string; + /** + * + * @returns {boolean} + */ + public generateMipmaps : boolean; + /** + * + * @returns {string} + */ + public assetType : string; + /** + * + */ + public invalidateContent(): void; + /** + * + * @private + */ + public invalidateSize(): void; + /** + * @inheritDoc + */ + public dispose(): void; + public _iAddTextureData(textureData: ITextureData): ITextureData; + public _iRemoveTextureData(textureData: ITextureData): ITextureData; + } + export = TextureProxyBase; + +} +declare module "awayjs-core/lib/utils/ByteArray" { + import ByteArrayBase = require("awayjs-core/lib/utils/ByteArrayBase"); + class ByteArray extends ByteArrayBase { + public maxlength: number; + public arraybytes: any; + public unalignedarraybytestemp: any; + constructor(); + public ensureWriteableSpace(n: number): void; + public setArrayBuffer(aBuffer: ArrayBuffer): void; + public getBytesAvailable(): number; + public ensureSpace(n: number): void; + public writeByte(b: number): void; + public readByte(): number; + public readBytes(bytes: ByteArray, offset?: number, length?: number): void; + public writeUnsignedByte(b: number): void; + public readUnsignedByte(): number; + public writeUnsignedShort(b: number): void; + public readUTFBytes(len: number): string; + public readInt(): number; + public readShort(): number; + public readDouble(): number; + public readUnsignedShort(): number; + public writeUnsignedInt(b: number): void; + public readUnsignedInt(): number; + public writeFloat(b: number): void; + public readFloat(): number; + } + export = ByteArray; + +} +declare module "awayjs-core/lib/utils/ByteArrayBase" { + class ByteArrayBase { + public position: number; + public length: number; + public _mode: string; + static Base64Key: string; + constructor(); + public writeByte(b: number): void; + public readByte(): number; + public writeUnsignedByte(b: number): void; + public readUnsignedByte(): number; + public writeUnsignedShort(b: number): void; + public readUnsignedShort(): number; + public writeUnsignedInt(b: number): void; + public readUnsignedInt(): number; + public writeFloat(b: number): void; + public toFloatBits(x: number): void; + public readFloat(b: number): void; + public fromFloatBits(x: number): void; + public getBytesAvailable(): number; + public toString(): string; + public compareEqual(other: any, count: any): boolean; + public writeBase64String(s: string): void; + public dumpToConsole(): void; + public readBase64String(count: number): string; + static internalGetBase64String(count: any, getUnsignedByteFunc: any, self: any): string; + } + export = ByteArrayBase; + +} +declare module "awayjs-core/lib/utils/ByteArrayBuffer" { + import ByteArrayBase = require("awayjs-core/lib/utils/ByteArrayBase"); + class ByteArrayBuffer extends ByteArrayBase { + public _bytes: number[]; + constructor(); + public writeByte(b: number): void; + public readByte(): number; + public writeUnsignedByte(b: number): void; + public readUnsignedByte(): number; + public writeUnsignedShort(b: number): void; + public readUnsignedShort(): number; + public writeUnsignedInt(b: number): void; + public readUnsignedInt(): number; + public writeFloat(b: number): void; + public toFloatBits(x: number): number; + public readFloat(b: number): number; + public fromFloatBits(x: number): number; + } + export = ByteArrayBuffer; + +} +declare module "awayjs-core/lib/utils/CSS" { + class CSS { + static setElementSize(element: HTMLElement, width: number, height: number): void; + static setElementWidth(element: HTMLElement, width: number): void; + static setElementHeight(element: HTMLElement, height: number): void; + static setElementX(element: HTMLElement, x: number): void; + static setElementY(element: HTMLElement, y: number): void; + static getElementVisibility(element: HTMLElement): boolean; + static setElementVisibility(element: HTMLElement, visible: boolean): void; + static setElementAlpha(element: HTMLElement, alpha: number): void; + static setElementPosition(element: HTMLElement, x: number, y: number, absolute?: boolean): void; + } + export = CSS; + +} +declare module "awayjs-core/lib/utils/Cast" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); + import ByteArray = require("awayjs-core/lib/utils/ByteArray"); + /** + * Helper class for casting assets to usable objects + */ + class Cast { + private static _colorNames; + private static _hexChars; + private static _notClasses; + private static _classes; + static string(data: any): string; + static byteArray(data: any): ByteArray; + private static isHex(str); + static tryColor(data: any): number; + static color(data: any): number; + static tryClass(name: string): any; + static bitmapData(data: any): BitmapData; + static bitmapTexture(data: any): BitmapTexture; + } + export = Cast; + +} +declare module "awayjs-core/lib/utils/ColorUtils" { + /** + * + */ + class ColorUtils { + static float32ColorToARGB(float32Color: number): number[]; + private static componentToHex(c); + static RGBToHexString(argb: number[]): string; + static ARGBToHexString(argb: number[]): string; + } + export = ColorUtils; + +} +declare module "awayjs-core/lib/utils/Debug" { + /** + * + */ + class Debug { + static THROW_ERRORS: boolean; + static ENABLE_LOG: boolean; + static LOG_PI_ERRORS: boolean; + private static keyword; + static breakpoint(): void; + static throwPIROnKeyWordOnly(str: string, enable?: boolean): void; + static throwPIR(clss: string, fnc: string, msg: string): void; + private static logPIR(clss, fnc, msg?); + static log(...args: any[]): void; + } + export = Debug; + +} +declare module "awayjs-core/lib/utils/RequestAnimationFrame" { + class RequestAnimationFrame { + private _callback; + private _callbackContext; + private _active; + private _rafUpdateFunction; + private _prevTime; + private _dt; + private _currentTime; + private _argsArray; + private _getTimer; + constructor(callback: Function, callbackContext: Object); + /** + * + * @param callback + * @param callbackContext + */ + public setCallback(callback: Function, callbackContext: Object): void; + /** + * + */ + public start(): void; + /** + * + */ + public stop(): void; + /** + * + * @returns {boolean} + */ + public active : boolean; + /** + * + * @private + */ + private _tick(); + } + export = RequestAnimationFrame; + +} +declare module "awayjs-core/lib/utils/TextureUtils" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + class TextureUtils { + private static MAX_SIZE; + static isBitmapDataValid(bitmapData: BitmapData): boolean; + static isHTMLImageElementValid(image: HTMLImageElement): boolean; + static isDimensionValid(d: number): boolean; + static isPowerOfTwo(value: number): boolean; + static getBestPowerOf2(value: number): number; + } + export = TextureUtils; + +} +declare module "awayjs-core/lib/utils/Timer" { + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + class Timer extends EventDispatcher { + private _delay; + private _repeatCount; + private _currentCount; + private _iid; + private _running; + constructor(delay: number, repeatCount?: number); + public currentCount : number; + public delay : number; + public repeatCount : number; + public reset(): void; + public running : boolean; + public start(): void; + public stop(): void; + private tick(); + } + export = Timer; + +} +declare module "awayjs-core/lib/utils/getTimer" { + /** + * + * + * @returns {number} + */ + function getTimer(): number; + export = getTimer; + +} +declare module "awayjs-core/lib/animators/nodes/AnimationNodeBase" { + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + /** + * Provides an abstract base class for nodes in an animation blend tree. + */ + class AnimationNodeBase extends NamedAssetBase implements IAsset { + public _pStateClass: any; + public stateClass : any; + /** + * Creates a new AnimationNodeBase object. + */ + constructor(); + /** + * @inheritDoc + */ + public dispose(): void; + /** + * @inheritDoc + */ + public assetType : string; + } + export = AnimationNodeBase; + +} +declare module "awayjs-core/lib/core/display/ContextMode" { + class ContextMode { + static AUTO: string; + static WEBGL: string; + static FLASH: string; + static NATIVE: string; + } + export = ContextMode; + +} +declare module "awayjs-core/lib/core/display/IContext" { + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + /** + * + * @class away.base.IContext + */ + interface IContext { + container: HTMLElement; + clear(red?: number, green?: number, blue?: number, alpha?: number, depth?: number, stencil?: number, mask?: number): any; + configureBackBuffer(width: number, height: number, antiAlias: number, enableDepthAndStencil?: boolean): any; + dispose(): any; + present(): any; + setScissorRectangle(rect: Rectangle): any; + } + export = IContext; + +} +declare module "awayjs-core/lib/core/base/AlignmentMode" { + /** + * + */ + class AlignmentMode { + /** + * + */ + static REGISTRATION_POINT: string; + /** + * + */ + static PIVOT_POINT: string; + } + export = AlignmentMode; + +} +declare module "awayjs-core/lib/core/base/BitmapData" { + import ColorTransform = require("awayjs-core/lib/core/geom/ColorTransform"); + import Matrix = require("awayjs-core/lib/core/geom/Matrix"); + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + import Point = require("awayjs-core/lib/core/geom/Point"); + import ByteArray = require("awayjs-core/lib/utils/ByteArray"); + /** + * + */ + class BitmapData { + private _imageCanvas; + private _context; + private _imageData; + private _rect; + private _transparent; + private _alpha; + private _locked; + /** + * + * @param width + * @param height + * @param transparent + * @param fillColor + */ + constructor(width: number, height: number, transparent?: boolean, fillColor?: number); + /** + * + */ + public dispose(): void; + /** + * + */ + public lock(): void; + /** + * + */ + public unlock(): void; + /** + * + * @param x + * @param y + * @param color + */ + public getPixel(x: any, y: any): number; + /** + * + * @param x + * @param y + * @param color + */ + public setPixel(x: any, y: any, color: number): void; + /** + * + * @param rect + * @param inputByteArray + */ + public setPixels(rect: Rectangle, inputByteArray: ByteArray): void; + /** + * + * @param x + * @param y + * @param color + */ + public setPixel32(x: any, y: any, color: number): void; + public setVector(rect: Rectangle, inputVector: number[]): void; + /** + * Copy an HTMLImageElement or BitmapData object + * + * @param img {BitmapData} / {HTMLImageElement} + * @param sourceRect - source rectange to copy from + * @param destRect - destinatoin rectange to copy to + */ + public drawImage(img: BitmapData, sourceRect: Rectangle, destRect: Rectangle): any; + public drawImage(img: HTMLImageElement, sourceRect: Rectangle, destRect: Rectangle): any; + private _drawImage(img, sourceRect, destRect); + /** + * + * @param bmpd + * @param sourceRect + * @param destRect + */ + public copyPixels(bmpd: BitmapData, sourceRect: Rectangle, destRect: Rectangle): any; + public copyPixels(bmpd: HTMLImageElement, sourceRect: Rectangle, destRect: Rectangle): any; + private _copyPixels(bmpd, sourceRect, destRect); + /** + * + * @param rect + * @param color + */ + public fillRect(rect: Rectangle, color: number): void; + /** + * + * @param source + * @param matrix + */ + public draw(source: BitmapData, matrix?: Matrix): any; + public draw(source: HTMLImageElement, matrix?: Matrix): any; + private _draw(source, matrix); + public copyChannel(sourceBitmap: BitmapData, sourceRect: Rectangle, destPoint: Point, sourceChannel: number, destChannel: number): void; + public colorTransform(rect: Rectangle, colorTransform: ColorTransform): void; + /** + * + * @returns {ImageData} + */ + /** + * + * @param {ImageData} + */ + public imageData : ImageData; + /** + * + * @returns {number} + */ + /** + * + * @param {number} + */ + public width : number; + /** + * + * @returns {number} + */ + /** + * + * @param {number} + */ + public height : number; + /** + * + * @param {Rectangle} + */ + public rect : Rectangle; + /** + * + * @returns {HTMLCanvasElement} + */ + public canvas : HTMLCanvasElement; + /** + * + * @returns {HTMLCanvasElement} + */ + public context : CanvasRenderingContext2D; + /** + * convert decimal value to Hex + */ + private hexToRGBACSS(d); + } + export = BitmapData; + +} +declare module "awayjs-core/lib/core/base/BitmapDataChannel" { + class BitmapDataChannel { + static ALPHA: number; + static BLUE: number; + static GREEN: number; + static RED: number; + } + export = BitmapDataChannel; + +} +declare module "awayjs-core/lib/core/base/BlendMode" { + /** + * A class that provides constant values for visual blend mode effects. These + * constants are used in the following: + *
    + *
  • The blendMode property of the + * flash.display.DisplayObject class.
  • + *
  • The blendMode parameter of the draw() + * method of the flash.display.BitmapData class
  • + *
+ */ + class BlendMode { + /** + * Adds the values of the constituent colors of the display object to the + * colors of its background, applying a ceiling of 0xFF. This setting is + * commonly used for animating a lightening dissolve between two objects. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xAAA633, and the background pixel has an RGB value of 0xDD2200, the + * resulting RGB value for the displayed pixel is 0xFFC833(because 0xAA + + * 0xDD > 0xFF, 0xA6 + 0x22 = 0xC8, and 0x33 + 0x00 = 0x33).

+ */ + static ADD: string; + /** + * Applies the alpha value of each pixel of the display object to the + * background. This requires the blendMode property of the + * parent display object be set to + * away.base.BlendMode.LAYER. + * + *

Not supported under GPU rendering.

+ */ + static ALPHA: string; + /** + * Selects the darker of the constituent colors of the display object and the + * colors of the background(the colors with the smaller values). This + * setting is commonly used for superimposing type. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the + * resulting RGB value for the displayed pixel is 0xDDCC00(because 0xFF > + * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

+ * + *

Not supported under GPU rendering.

+ */ + static DARKEN: string; + /** + * Compares the constituent colors of the display object with the colors of + * its background, and subtracts the darker of the values of the two + * constituent colors from the lighter value. This setting is commonly used + * for more vibrant colors. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the + * resulting RGB value for the displayed pixel is 0x222C33(because 0xFF - + * 0xDD = 0x22, 0xF8 - 0xCC = 0x2C, and 0x33 - 0x00 = 0x33).

+ */ + static DIFFERENCE: string; + /** + * Erases the background based on the alpha value of the display object. This + * process requires that the blendMode property of the parent + * display object be set to flash.display.BlendMode.LAYER. + * + *

Not supported under GPU rendering.

+ */ + static ERASE: string; + /** + * Adjusts the color of each pixel based on the darkness of the display + * object. If the display object is lighter than 50% gray, the display object + * and background colors are screened, which results in a lighter color. If + * the display object is darker than 50% gray, the colors are multiplied, + * which results in a darker color. This setting is commonly used for shading + * effects. + * + *

Not supported under GPU rendering.

+ */ + static HARDLIGHT: string; + /** + * Inverts the background. + */ + static INVERT: string; + /** + * Forces the creation of a transparency group for the display object. This + * means that the display object is precomposed in a temporary buffer before + * it is processed further. The precomposition is done automatically if the + * display object is precached by means of bitmap caching or if the display + * object is a display object container that has at least one child object + * with a blendMode setting other than "normal". + * + *

Not supported under GPU rendering.

+ */ + static LAYER: string; + /** + * Selects the lighter of the constituent colors of the display object and + * the colors of the background(the colors with the larger values). This + * setting is commonly used for superimposing type. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the + * resulting RGB value for the displayed pixel is 0xFFF833(because 0xFF > + * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

+ * + *

Not supported under GPU rendering.

+ */ + static LIGHTEN: string; + /** + * Multiplies the values of the display object constituent colors by the + * constituent colors of the background color, and normalizes by dividing by + * 0xFF, resulting in darker colors. This setting is commonly used for + * shadows and depth effects. + * + *

For example, if a constituent color(such as red) of one pixel in the + * display object and the corresponding color of the pixel in the background + * both have the value 0x88, the multiplied result is 0x4840. Dividing by + * 0xFF yields a value of 0x48 for that constituent color, which is a darker + * shade than the color of the display object or the color of the + * background.

+ */ + static MULTIPLY: string; + /** + * The display object appears in front of the background. Pixel values of the + * display object override the pixel values of the background. Where the + * display object is transparent, the background is visible. + */ + static NORMAL: string; + /** + * Adjusts the color of each pixel based on the darkness of the background. + * If the background is lighter than 50% gray, the display object and + * background colors are screened, which results in a lighter color. If the + * background is darker than 50% gray, the colors are multiplied, which + * results in a darker color. This setting is commonly used for shading + * effects. + * + *

Not supported under GPU rendering.

+ */ + static OVERLAY: string; + /** + * Multiplies the complement(inverse) of the display object color by the + * complement of the background color, resulting in a bleaching effect. This + * setting is commonly used for highlights or to remove black areas of the + * display object. + */ + static SCREEN: string; + /** + * Uses a shader to define the blend between objects. + * + *

Setting the blendShader property to a Shader instance + * automatically sets the display object's blendMode property to + * BlendMode.SHADER. If the blendMode property is + * set to BlendMode.SHADER without first setting the + * blendShader property, the blendMode property is + * set to BlendMode.NORMAL instead. If the + * blendShader property is set(which sets the + * blendMode property to BlendMode.SHADER), then + * later the value of the blendMode property is changed, the + * blend mode can be reset to use the blend shader simply by setting the + * blendMode property to BlendMode.SHADER. The + * blendShader property does not need to be set again except to + * change the shader that's used to define the blend mode.

+ * + *

Not supported under GPU rendering.

+ */ + static SHADER: string; + /** + * Subtracts the values of the constituent colors in the display object from + * the values of the background color, applying a floor of 0. This setting is + * commonly used for animating a darkening dissolve between two objects. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xAA2233, and the background pixel has an RGB value of 0xDDA600, the + * resulting RGB value for the displayed pixel is 0x338400(because 0xDD - + * 0xAA = 0x33, 0xA6 - 0x22 = 0x84, and 0x00 - 0x33 < 0x00).

+ */ + static SUBTRACT: string; + } + export = BlendMode; + +} +declare module "awayjs-core/lib/core/base/CapsStyle" { + /** + * The CapsStyle class is an enumeration of constant values that specify the + * caps style to use in drawing lines. The constants are provided for use as + * values in the caps parameter of the + * flash.display.Graphics.lineStyle() method. You can specify the + * following three types of caps: + */ + class CapsStyle { + /** + * Used to specify round caps in the caps parameter of the + * flash.display.Graphics.lineStyle() method. + */ + static ROUND: string; + /** + * Used to specify no caps in the caps parameter of the + * flash.display.Graphics.lineStyle() method. + */ + static NONE: string; + /** + * Used to specify square caps in the caps parameter of the + * flash.display.Graphics.lineStyle() method. + */ + static SQUARE: string; + } + export = CapsStyle; + +} +declare module "awayjs-core/lib/core/base/DisplayObject" { + import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + import Scene = require("awayjs-core/lib/containers/Scene"); + import ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); + import BlendMode = require("awayjs-core/lib/core/base/BlendMode"); + import LoaderInfo = require("awayjs-core/lib/core/base/LoaderInfo"); + import IBitmapDrawable = require("awayjs-core/lib/core/base/IBitmapDrawable"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Point = require("awayjs-core/lib/core/geom/Point"); + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + import Transform = require("awayjs-core/lib/core/geom/Transform"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import Partition = require("awayjs-core/lib/core/partition/Partition"); + import IPickingCollider = require("awayjs-core/lib/core/pick/IPickingCollider"); + import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import PrefabBase = require("awayjs-core/lib/prefabs/PrefabBase"); + /** + * The DisplayObject class is the base class for all objects that can be + * placed on the display list. The display list manages all objects displayed + * in flash. Use the DisplayObjectContainer class to arrange the + * display objects in the display list. DisplayObjectContainer objects can + * have child display objects, while other display objects, such as Shape and + * TextField objects, are "leaf" nodes that have only parents and siblings, no + * children. + * + *

The DisplayObject class supports basic functionality like the x + * and y position of an object, as well as more advanced properties of + * the object such as its transformation matrix.

+ * + *

DisplayObject is an abstract base class; therefore, you cannot call + * DisplayObject directly. Invoking new DisplayObject() throws an + * ArgumentError exception.

+ * + *

All display objects inherit from the DisplayObject class.

+ * + *

The DisplayObject class itself does not include any APIs for rendering + * content onscreen. For that reason, if you want create a custom subclass of + * the DisplayObject class, you will want to extend one of its subclasses that + * do have APIs for rendering content onscreen, such as the Shape, Sprite, + * Bitmap, SimpleButton, TextField, or MovieClip class.

+ * + *

The DisplayObject class contains several broadcast events. Normally, the + * target of any particular event is a specific DisplayObject instance. For + * example, the target of an added event is the specific + * DisplayObject instance that was added to the display list. Having a single + * target restricts the placement of event listeners to that target and in + * some cases the target's ancestors on the display list. With broadcast + * events, however, the target is not a specific DisplayObject instance, but + * rather all DisplayObject instances, including those that are not on the + * display list. This means that you can add a listener to any DisplayObject + * instance to listen for broadcast events. In addition to the broadcast + * events listed in the DisplayObject class's Events table, the DisplayObject + * class also inherits two broadcast events from the EventDispatcher class: + * activate and deactivate.

+ * + *

Some properties previously used in the ActionScript 1.0 and 2.0 + * MovieClip, TextField, and Button classes(such as _alpha, + * _height, _name, _width, + * _x, _y, and others) have equivalents in the + * ActionScript 3.0 DisplayObject class that are renamed so that they no + * longer begin with the underscore(_) character.

+ * + *

For more information, see the "Display Programming" chapter of the + * ActionScript 3.0 Developer's Guide.

+ * + * @event added Dispatched when a display object is added to the + * display list. The following methods trigger this + * event: + * DisplayObjectContainer.addChild(), + * DisplayObjectContainer.addChildAt(). + * @event addedToStage Dispatched when a display object is added to the on + * stage display list, either directly or through the + * addition of a sub tree in which the display object + * is contained. The following methods trigger this + * event: + * DisplayObjectContainer.addChild(), + * DisplayObjectContainer.addChildAt(). + * @event enterFrame [broadcast event] Dispatched when the playhead is + * entering a new frame. If the playhead is not + * moving, or if there is only one frame, this event + * is dispatched continuously in conjunction with the + * frame rate. This event is a broadcast event, which + * means that it is dispatched by all display objects + * with a listener registered for this event. + * @event exitFrame [broadcast event] Dispatched when the playhead is + * exiting the current frame. All frame scripts have + * been run. If the playhead is not moving, or if + * there is only one frame, this event is dispatched + * continuously in conjunction with the frame rate. + * This event is a broadcast event, which means that + * it is dispatched by all display objects with a + * listener registered for this event. + * @event frameConstructed [broadcast event] Dispatched after the constructors + * of frame display objects have run but before frame + * scripts have run. If the playhead is not moving, or + * if there is only one frame, this event is + * dispatched continuously in conjunction with the + * frame rate. This event is a broadcast event, which + * means that it is dispatched by all display objects + * with a listener registered for this event. + * @event removed Dispatched when a display object is about to be + * removed from the display list. Two methods of the + * DisplayObjectContainer class generate this event: + * removeChild() and + * removeChildAt(). + * + *

The following methods of a + * DisplayObjectContainer object also generate this + * event if an object must be removed to make room for + * the new object: addChild(), + * addChildAt(), and + * setChildIndex().

+ * @event removedFromStage Dispatched when a display object is about to be + * removed from the display list, either directly or + * through the removal of a sub tree in which the + * display object is contained. Two methods of the + * DisplayObjectContainer class generate this event: + * removeChild() and + * removeChildAt(). + * + *

The following methods of a + * DisplayObjectContainer object also generate this + * event if an object must be removed to make room for + * the new object: addChild(), + * addChildAt(), and + * setChildIndex().

+ * @event render [broadcast event] Dispatched when the display list + * is about to be updated and rendered. This event + * provides the last opportunity for objects listening + * for this event to make changes before the display + * list is rendered. You must call the + * invalidate() method of the Stage + * object each time you want a render + * event to be dispatched. Render events + * are dispatched to an object only if there is mutual + * trust between it and the object that called + * Stage.invalidate(). This event is a + * broadcast event, which means that it is dispatched + * by all display objects with a listener registered + * for this event. + * + *

Note: This event is not dispatched if the + * display is not rendering. This is the case when the + * content is either minimized or obscured.

+ */ + class DisplayObject extends NamedAssetBase implements IBitmapDrawable { + private _loaderInfo; + private _mouseX; + private _mouseY; + private _root; + private _bounds; + private _boundsVisible; + private _depth; + private _height; + private _width; + public _pScene: Scene; + public _pParent: DisplayObjectContainer; + public _pSceneTransform: Matrix3D; + public _pSceneTransformDirty: boolean; + public _pIsEntity: boolean; + private _explicitPartition; + public _pImplicitPartition: Partition; + private _partitionNode; + private _sceneTransformChanged; + private _scenechanged; + private _transform; + private _matrix3D; + private _matrix3DDirty; + private _inverseSceneTransform; + private _inverseSceneTransformDirty; + private _scenePosition; + private _scenePositionDirty; + private _explicitVisibility; + public _pImplicitVisibility: boolean; + private _explicitMouseEnabled; + public _pImplicitMouseEnabled: boolean; + private _listenToSceneTransformChanged; + private _listenToSceneChanged; + private _positionDirty; + private _rotationDirty; + private _scaleDirty; + private _positionChanged; + private _rotationChanged; + private _scaleChanged; + private _rotationX; + private _rotationY; + private _rotationZ; + private _eulers; + private _flipY; + private _listenToPositionChanged; + private _listenToRotationChanged; + private _listenToScaleChanged; + private _zOffset; + public _pScaleX: number; + public _pScaleY: number; + public _pScaleZ: number; + private _x; + private _y; + private _z; + private _pivot; + private _orientationMatrix; + private _pivotZero; + private _pivotDirty; + private _pos; + private _rot; + private _sca; + private _transformComponents; + public _pIgnoreTransform: boolean; + private _shaderPickingDetails; + public _pPickingCollisionVO: PickingCollisionVO; + public _pBounds: BoundingVolumeBase; + public _pBoundsInvalid: boolean; + private _worldBounds; + private _worldBoundsInvalid; + public _pPickingCollider: IPickingCollider; + public _pRenderables: IRenderable[]; + public _iSourcePrefab: PrefabBase; + /** + * + */ + public alignmentMode: string; + /** + * Indicates the alpha transparency value of the object specified. Valid + * values are 0(fully transparent) to 1(fully opaque). The default value is + * 1. Display objects with alpha set to 0 are active, + * even though they are invisible. + */ + public alpha: number; + /** + * A value from the BlendMode class that specifies which blend mode to use. A + * bitmap can be drawn internally in two ways. If you have a blend mode + * enabled or an external clipping mask, the bitmap is drawn by adding a + * bitmap-filled square shape to the vector render. If you attempt to set + * this property to an invalid value, Flash runtimes set the value to + * BlendMode.NORMAL. + * + *

The blendMode property affects each pixel of the display + * object. Each pixel is composed of three constituent colors(red, green, + * and blue), and each constituent color has a value between 0x00 and 0xFF. + * Flash Player or Adobe AIR compares each constituent color of one pixel in + * the movie clip with the corresponding color of the pixel in the + * background. For example, if blendMode is set to + * BlendMode.LIGHTEN, Flash Player or Adobe AIR compares the red + * value of the display object with the red value of the background, and uses + * the lighter of the two as the value for the red component of the displayed + * color.

+ * + *

The following table describes the blendMode settings. The + * BlendMode class defines string values you can use. The illustrations in + * the table show blendMode values applied to a circular display + * object(2) superimposed on another display object(1).

+ */ + public blendMode: BlendMode; + /** + * + */ + public bounds : BoundingVolumeBase; + /** + * If set to true, NME will use the software renderer to cache + * an internal bitmap representation of the display object. For native targets, + * this is often much slower than the default hardware renderer. When you + * are using the Flash target, this caching may increase performance for display + * objects that contain complex vector content. + * + *

All vector data for a display object that has a cached bitmap is drawn + * to the bitmap instead of the main display. If + * cacheAsBitmapMatrix is null or unsupported, the bitmap is + * then copied to the main display as unstretched, unrotated pixels snapped + * to the nearest pixel boundaries. Pixels are mapped 1 to 1 with the parent + * object. If the bounds of the bitmap change, the bitmap is recreated + * instead of being stretched.

+ * + *

If cacheAsBitmapMatrix is non-null and supported, the + * object is drawn to the off-screen bitmap using that matrix and the + * stretched and/or rotated results of that rendering are used to draw the + * object to the main display.

+ * + *

No internal bitmap is created unless the cacheAsBitmap + * property is set to true.

+ * + *

After you set the cacheAsBitmap property to + * true, the rendering does not change, however the display + * object performs pixel snapping automatically. The animation speed can be + * significantly faster depending on the complexity of the vector content. + *

+ * + *

The cacheAsBitmap property is automatically set to + * true whenever you apply a filter to a display object(when + * its filter array is not empty), and if a display object has a + * filter applied to it, cacheAsBitmap is reported as + * true for that display object, even if you set the property to + * false. If you clear all filters for a display object, the + * cacheAsBitmap setting changes to what it was last set to.

+ * + *

A display object does not use a bitmap even if the + * cacheAsBitmap property is set to true and + * instead renders from vector data in the following cases:

+ * + *
    + *
  • The bitmap is too large. In AIR 1.5 and Flash Player 10, the maximum + * size for a bitmap image is 8,191 pixels in width or height, and the total + * number of pixels cannot exceed 16,777,215 pixels.(So, if a bitmap image + * is 8,191 pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 + * and earlier, the limitation is is 2880 pixels in height and 2,880 pixels + * in width.
  • + *
  • The bitmap fails to allocate(out of memory error).
  • + *
+ * + *

The cacheAsBitmap property is best used with movie clips + * that have mostly static content and that do not scale and rotate + * frequently. With such movie clips, cacheAsBitmap can lead to + * performance increases when the movie clip is translated(when its x + * and y position is changed).

+ */ + public cacheAsBitmap: boolean; + /** + * + */ + public castsShadows: boolean; + /** + * Indicates the depth of the display object, in pixels. The depth is + * calculated based on the bounds of the content of the display object. When + * you set the depth property, the scaleZ property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content (such as an empty sprite) has a depth of 0, even if you try to + * set depth to a different value.

+ */ + public depth : number; + /** + * Defines the rotation of the 3d object as a Vector3D object containing euler angles for rotation around x, y and z axis. + */ + public eulers : Vector3D; + /** + * An object that can contain any extra data. + */ + public extra: Object; + /** + * Indicates the height of the display object, in pixels. The height is + * calculated based on the bounds of the content of the display object. When + * you set the height property, the scaleY property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content (such as an empty sprite) has a height of 0, even if you try to + * set height to a different value.

+ */ + public height : number; + /** + * Indicates the instance container index of the DisplayObject. The object can be + * identified in the child list of its parent display object container by + * calling the getChildByIndex() method of the display object + * container. + * + *

If the DisplayObject has no parent container, index defaults to 0.

+ */ + public index : number; + /** + * + */ + public inverseSceneTransform : Matrix3D; + /** + * + */ + public ignoreTransform : boolean; + /** + * + */ + public isEntity : boolean; + /** + * Returns a LoaderInfo object containing information about loading the file + * to which this display object belongs. The loaderInfo property + * is defined only for the root display object of a SWF file or for a loaded + * Bitmap(not for a Bitmap that is drawn with ActionScript). To find the + * loaderInfo object associated with the SWF file that contains + * a display object named myDisplayObject, use + * myDisplayObject.root.loaderInfo. + * + *

A large SWF file can monitor its download by calling + * this.root.loaderInfo.addEventListener(Event.COMPLETE, + * func).

+ */ + public loaderInfo : LoaderInfo; + /** + * The calling display object is masked by the specified mask + * object. To ensure that masking works when the Stage is scaled, the + * mask display object must be in an active part of the display + * list. The mask object itself is not drawn. Set + * mask to null to remove the mask. + * + *

To be able to scale a mask object, it must be on the display list. To + * be able to drag a mask Sprite object(by calling its + * startDrag() method), it must be on the display list. To call + * the startDrag() method for a mask sprite based on a + * mouseDown event being dispatched by the sprite, set the + * sprite's buttonMode property to true.

+ * + *

When display objects are cached by setting the + * cacheAsBitmap property to true an the + * cacheAsBitmapMatrix property to a Matrix object, both the + * mask and the display object being masked must be part of the same cached + * bitmap. Thus, if the display object is cached, then the mask must be a + * child of the display object. If an ancestor of the display object on the + * display list is cached, then the mask must be a child of that ancestor or + * one of its descendents. If more than one ancestor of the masked object is + * cached, then the mask must be a descendent of the cached container closest + * to the masked object in the display list.

+ * + *

Note: A single mask object cannot be used to mask + * more than one calling display object. When the mask is + * assigned to a second display object, it is removed as the mask of the + * first object, and that object's mask property becomes + * null.

+ */ + public mask: DisplayObject; + /** + * Specifies whether this object receives mouse, or other user input, + * messages. The default value is true, which means that by + * default any InteractiveObject instance that is on the display list + * receives mouse events or other user input events. If + * mouseEnabled is set to false, the instance does + * not receive any mouse events(or other user input events like keyboard + * events). Any children of this instance on the display list are not + * affected. To change the mouseEnabled behavior for all + * children of an object on the display list, use + * flash.display.DisplayObjectContainer.mouseChildren. + * + *

No event is dispatched by setting this property. You must use the + * addEventListener() method to create interactive + * functionality.

+ */ + public mouseEnabled : boolean; + /** + * Indicates the x coordinate of the mouse or user input device position, in + * pixels. + * + *

Note: For a DisplayObject that has been rotated, the returned x + * coordinate will reflect the non-rotated object.

+ */ + public mouseX : number; + /** + * Indicates the y coordinate of the mouse or user input device position, in + * pixels. + * + *

Note: For a DisplayObject that has been rotated, the returned y + * coordinate will reflect the non-rotated object.

+ */ + public mouseY : number; + /** + * Indicates the instance name of the DisplayObject. The object can be + * identified in the child list of its parent display object container by + * calling the getChildByName() method of the display object + * container. + * + * @throws IllegalOperationError If you are attempting to set this property + * on an object that was placed on the timeline + * in the Flash authoring tool. + */ + public name: string; + /** + * + */ + public orientationMode: string; + /** + * Indicates the DisplayObjectContainer object that contains this display + * object. Use the parent property to specify a relative path to + * display objects that are above the current display object in the display + * list hierarchy. + * + *

You can use parent to move up multiple levels in the + * display list as in the following:

+ * + * @throws SecurityError The parent display object belongs to a security + * sandbox to which you do not have access. You can + * avoid this situation by having the parent movie call + * the Security.allowDomain() method. + */ + public parent : DisplayObjectContainer; + /** + * + */ + public partition : Partition; + /** + * + */ + public partitionNode : EntityNode; + /** + * + */ + public pickingCollider : IPickingCollider; + /** + * Defines the local point around which the object rotates. + */ + public pivot : Vector3D; + /** + * For a display object in a loaded SWF file, the root property + * is the top-most display object in the portion of the display list's tree + * structure represented by that SWF file. For a Bitmap object representing a + * loaded image file, the root property is the Bitmap object + * itself. For the instance of the main class of the first SWF file loaded, + * the root property is the display object itself. The + * root property of the Stage object is the Stage object itself. + * The root property is set to null for any display + * object that has not been added to the display list, unless it has been + * added to a display object container that is off the display list but that + * is a child of the top-most display object in a loaded SWF file. + * + *

For example, if you create a new Sprite object by calling the + * Sprite() constructor method, its root property + * is null until you add it to the display list(or to a display + * object container that is off the display list but that is a child of the + * top-most display object in a SWF file).

+ * + *

For a loaded SWF file, even though the Loader object used to load the + * file may not be on the display list, the top-most display object in the + * SWF file has its root property set to itself. The Loader + * object does not have its root property set until it is added + * as a child of a display object for which the root property is + * set.

+ */ + public root : DisplayObjectContainer; + /** + * Indicates the rotation of the DisplayObject instance, in degrees, from its + * original orientation. Values from 0 to 180 represent clockwise rotation; + * values from 0 to -180 represent counterclockwise rotation. Values outside + * this range are added to or subtracted from 360 to obtain a value within + * the range. For example, the statement my_video.rotation = 450 + * is the same as my_video.rotation = 90. + */ + public rotation: number; + /** + * Indicates the x-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + public rotationX : number; + /** + * Indicates the y-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + public rotationY : number; + /** + * Indicates the z-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + public rotationZ : number; + /** + * The current scaling grid that is in effect. If set to null, + * the entire display object is scaled normally when any scale transformation + * is applied. + * + *

When you define the scale9Grid property, the display + * object is divided into a grid with nine regions based on the + * scale9Grid rectangle, which defines the center region of the + * grid. The eight other regions of the grid are the following areas:

+ * + *
    + *
  • The upper-left corner outside of the rectangle
  • + *
  • The area above the rectangle
  • + *
  • The upper-right corner outside of the rectangle
  • + *
  • The area to the left of the rectangle
  • + *
  • The area to the right of the rectangle
  • + *
  • The lower-left corner outside of the rectangle
  • + *
  • The area below the rectangle
  • + *
  • The lower-right corner outside of the rectangle
  • + *
+ * + *

You can think of the eight regions outside of the center(defined by + * the rectangle) as being like a picture frame that has special rules + * applied to it when scaled.

+ * + *

When the scale9Grid property is set and a display object + * is scaled, all text and gradients are scaled normally; however, for other + * types of objects the following rules apply:

+ * + *
    + *
  • Content in the center region is scaled normally.
  • + *
  • Content in the corners is not scaled.
  • + *
  • Content in the top and bottom regions is scaled horizontally only. + * Content in the left and right regions is scaled vertically only.
  • + *
  • All fills(including bitmaps, video, and gradients) are stretched to + * fit their shapes.
  • + *
+ * + *

If a display object is rotated, all subsequent scaling is normal(and + * the scale9Grid property is ignored).

+ * + *

For example, consider the following display object and a rectangle that + * is applied as the display object's scale9Grid:

+ * + *

A common use for setting scale9Grid is to set up a display + * object to be used as a component, in which edge regions retain the same + * width when the component is scaled.

+ * + * @throws ArgumentError If you pass an invalid argument to the method. + */ + public scale9Grid: Rectangle; + /** + * Indicates the horizontal scale(percentage) of the object as applied from + * the registration point. The default registration point is(0,0). 1.0 + * equals 100% scale. + * + *

Scaling the local coordinate system changes the x and + * y property values, which are defined in whole pixels.

+ */ + public scaleX : number; + /** + * Indicates the vertical scale(percentage) of an object as applied from the + * registration point of the object. The default registration point is(0,0). + * 1.0 is 100% scale. + * + *

Scaling the local coordinate system changes the x and + * y property values, which are defined in whole pixels.

+ */ + public scaleY : number; + /** + * Indicates the depth scale(percentage) of an object as applied from the + * registration point of the object. The default registration point is(0,0). + * 1.0 is 100% scale. + * + *

Scaling the local coordinate system changes the x, + * y and z property values, which are defined in + * whole pixels.

+ */ + public scaleZ : number; + /** + * + */ + public scene : Scene; + /** + * + */ + public scenePosition : Vector3D; + public sceneTransform : Matrix3D; + /** + * The scroll rectangle bounds of the display object. The display object is + * cropped to the size defined by the rectangle, and it scrolls within the + * rectangle when you change the x and y properties + * of the scrollRect object. + * + *

The properties of the scrollRect Rectangle object use the + * display object's coordinate space and are scaled just like the overall + * display object. The corner bounds of the cropped window on the scrolling + * display object are the origin of the display object(0,0) and the point + * defined by the width and height of the rectangle. They are not centered + * around the origin, but use the origin to define the upper-left corner of + * the area. A scrolled display object always scrolls in whole pixel + * increments.

+ * + *

You can scroll an object left and right by setting the x + * property of the scrollRect Rectangle object. You can scroll + * an object up and down by setting the y property of the + * scrollRect Rectangle object. If the display object is rotated + * 90° and you scroll it left and right, the display object actually scrolls + * up and down.

+ */ + public scrollRect: Rectangle; + /** + * + */ + public shaderPickingDetails : boolean; + /** + * + */ + public boundsVisible : boolean; + /** + * An object with properties pertaining to a display object's matrix, color + * transform, and pixel bounds. The specific properties - matrix, + * colorTransform, and three read-only properties + * (concatenatedMatrix, concatenatedColorTransform, + * and pixelBounds) - are described in the entry for the + * Transform class. + * + *

Each of the transform object's properties is itself an object. This + * concept is important because the only way to set new values for the matrix + * or colorTransform objects is to create a new object and copy that object + * into the transform.matrix or transform.colorTransform property.

+ * + *

For example, to increase the tx value of a display + * object's matrix, you must make a copy of the entire matrix object, then + * copy the new object into the matrix property of the transform object:

+ *
 public myMatrix:Matrix =
+	    * myDisplayObject.transform.matrix; myMatrix.tx += 10;
+	    * myDisplayObject.transform.matrix = myMatrix; 
+ * + *

You cannot directly set the tx property. The following + * code has no effect on myDisplayObject:

+ *
 myDisplayObject.transform.matrix.tx +=
+	    * 10; 
+ * + *

You can also copy an entire transform object and assign it to another + * display object's transform property. For example, the following code + * copies the entire transform object from myOldDisplayObj to + * myNewDisplayObj:

+ * myNewDisplayObj.transform = myOldDisplayObj.transform; + * + *

The resulting display object, myNewDisplayObj, now has the + * same values for its matrix, color transform, and pixel bounds as the old + * display object, myOldDisplayObj.

+ * + *

Note that AIR for TV devices use hardware acceleration, if it is + * available, for color transforms.

+ */ + public transform : Transform; + /** + * Whether or not the display object is visible. Display objects that are not + * visible are disabled. For example, if visible=false for an + * InteractiveObject instance, it cannot be clicked. + */ + public visible : boolean; + /** + * Indicates the width of the display object, in pixels. The width is + * calculated based on the bounds of the content of the display object. When + * you set the width property, the scaleX property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content(such as an empty sprite) has a width of 0, even if you try to set + * width to a different value.

+ */ + public width : number; + /** + * + */ + public worldBounds : BoundingVolumeBase; + /** + * Indicates the x coordinate of the DisplayObject instance relative + * to the local coordinates of the parent DisplayObjectContainer. If the + * object is inside a DisplayObjectContainer that has transformations, it is + * in the local coordinate system of the enclosing DisplayObjectContainer. + * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the + * DisplayObjectContainer's children inherit a coordinate system that is + * rotated 90° counterclockwise. The object's coordinates refer to the + * registration point position. + */ + public x : number; + /** + * Indicates the y coordinate of the DisplayObject instance relative + * to the local coordinates of the parent DisplayObjectContainer. If the + * object is inside a DisplayObjectContainer that has transformations, it is + * in the local coordinate system of the enclosing DisplayObjectContainer. + * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the + * DisplayObjectContainer's children inherit a coordinate system that is + * rotated 90° counterclockwise. The object's coordinates refer to the + * registration point position. + */ + public y : number; + /** + * Indicates the z coordinate position along the z-axis of the DisplayObject + * instance relative to the 3D parent container. The z property is used for + * 3D coordinates, not screen or pixel coordinates. + * + *

When you set a z property for a display object to + * something other than the default value of 0, a corresponding + * Matrix3D object is automatically created. for adjusting a display object's + * position and orientation in three dimensions. When working with the + * z-axis, the existing behavior of x and y properties changes from screen or + * pixel coordinates to positions relative to the 3D parent container.

+ * + *

For example, a child of the _root at position x = 100, y = + * 100, z = 200 is not drawn at pixel location(100,100). The child is drawn + * wherever the 3D projection calculation puts it. The calculation is:

+ * + *

(x~~cameraFocalLength/cameraRelativeZPosition, + * y~~cameraFocalLength/cameraRelativeZPosition)

+ */ + public z : number; + /** + * + */ + public zOffset : number; + /** + * Creates a new DisplayObject instance. + */ + constructor(); + /** + * + */ + public addEventListener(type: string, listener: Function): void; + /** + * + */ + public clone(): DisplayObject; + /** + * + */ + public dispose(): void; + /** + * @inheritDoc + */ + public disposeAsset(): void; + /** + * Returns a rectangle that defines the area of the display object relative + * to the coordinate system of the targetCoordinateSpace object. + * Consider the following code, which shows how the rectangle returned can + * vary depending on the targetCoordinateSpace parameter that + * you pass to the method: + * + *

Note: Use the localToGlobal() and + * globalToLocal() methods to convert the display object's local + * coordinates to display coordinates, or display coordinates to local + * coordinates, respectively.

+ * + *

The getBounds() method is similar to the + * getRect() method; however, the Rectangle returned by the + * getBounds() method includes any strokes on shapes, whereas + * the Rectangle returned by the getRect() method does not. For + * an example, see the description of the getRect() method.

+ * + * @param targetCoordinateSpace The display object that defines the + * coordinate system to use. + * @return The rectangle that defines the area of the display object relative + * to the targetCoordinateSpace object's coordinate + * system. + */ + public getBounds(targetCoordinateSpace: DisplayObject): Rectangle; + /** + * Returns a rectangle that defines the boundary of the display object, based + * on the coordinate system defined by the targetCoordinateSpace + * parameter, excluding any strokes on shapes. The values that the + * getRect() method returns are the same or smaller than those + * returned by the getBounds() method. + * + *

Note: Use localToGlobal() and + * globalToLocal() methods to convert the display object's local + * coordinates to Stage coordinates, or Stage coordinates to local + * coordinates, respectively.

+ * + * @param targetCoordinateSpace The display object that defines the + * coordinate system to use. + * @return The rectangle that defines the area of the display object relative + * to the targetCoordinateSpace object's coordinate + * system. + */ + public getRect(targetCoordinateSpace: DisplayObject): Rectangle; + /** + * Converts the point object from the Stage(global) coordinates + * to the display object's(local) coordinates. + * + *

To use this method, first create an instance of the Point class. The + * x and y values that you assign represent global coordinates + * because they relate to the origin(0,0) of the main display area. Then + * pass the Point instance as the parameter to the + * globalToLocal() method. The method returns a new Point object + * with x and y values that relate to the origin of the display + * object instead of the origin of the Stage.

+ * + * @param point An object created with the Point class. The Point object + * specifies the x and y coordinates as + * properties. + * @return A Point object with coordinates relative to the display object. + */ + public globalToLocal(point: Point): Point; + /** + * Converts a two-dimensional point from the Stage(global) coordinates to a + * three-dimensional display object's(local) coordinates. + * + *

To use this method, first create an instance of the Point class. The x + * and y values that you assign to the Point object represent global + * coordinates because they are relative to the origin(0,0) of the main + * display area. Then pass the Point object to the + * globalToLocal3D() method as the point parameter. + * The method returns three-dimensional coordinates as a Vector3D object + * containing x, y, and z values that + * are relative to the origin of the three-dimensional display object.

+ * + * @param point A two dimensional Point object representing global x and y + * coordinates. + * @return A Vector3D object with coordinates relative to the + * three-dimensional display object. + */ + public globalToLocal3D(point: Point): Vector3D; + /** + * Evaluates the bounding box of the display object to see if it overlaps or + * intersects with the bounding box of the obj display object. + * + * @param obj The display object to test against. + * @return true if the bounding boxes of the display objects + * intersect; false if not. + */ + public hitTestObject(obj: DisplayObject): boolean; + /** + * Evaluates the display object to see if it overlaps or intersects with the + * point specified by the x and y parameters. The + * x and y parameters specify a point in the + * coordinate space of the Stage, not the display object container that + * contains the display object(unless that display object container is the + * Stage). + * + * @param x The x coordinate to test against this object. + * @param y The y coordinate to test against this object. + * @param shapeFlag Whether to check against the actual pixels of the object + * (true) or the bounding box + * (false). + * @return true if the display object overlaps or intersects + * with the specified point; false otherwise. + */ + public hitTestPoint(x: number, y: number, shapeFlag?: boolean): boolean; + /** + * @inheritDoc + */ + public isIntersectingRay(rayPosition: Vector3D, rayDirection: Vector3D): boolean; + /** + * Converts a three-dimensional point of the three-dimensional display + * object's(local) coordinates to a two-dimensional point in the Stage + * (global) coordinates. + * + *

For example, you can only use two-dimensional coordinates(x,y) to draw + * with the display.Graphics methods. To draw a + * three-dimensional object, you need to map the three-dimensional + * coordinates of a display object to two-dimensional coordinates. First, + * create an instance of the Vector3D class that holds the x-, y-, and z- + * coordinates of the three-dimensional display object. Then pass the + * Vector3D object to the local3DToGlobal() method as the + * point3d parameter. The method returns a two-dimensional Point + * object that can be used with the Graphics API to draw the + * three-dimensional object.

+ * + * @param point3d A Vector3D object containing either a three-dimensional + * point or the coordinates of the three-dimensional display + * object. + * @return A two-dimensional point representing a three-dimensional point in + * two-dimensional space. + */ + public local3DToGlobal(point3d: Vector3D): Point; + /** + * Rotates the 3d object around to face a point defined relative to the local coordinates of the parent ObjectContainer3D. + * + * @param target The vector defining the point to be looked at + * @param upAxis An optional vector used to define the desired up orientation of the 3d object after rotation has occurred + */ + public lookAt(target: Vector3D, upAxis?: Vector3D): void; + /** + * Converts the point object from the display object's(local) + * coordinates to the Stage(global) coordinates. + * + *

This method allows you to convert any given x and y + * coordinates from values that are relative to the origin(0,0) of a + * specific display object(local coordinates) to values that are relative to + * the origin of the Stage(global coordinates).

+ * + *

To use this method, first create an instance of the Point class. The + * x and y values that you assign represent local coordinates + * because they relate to the origin of the display object.

+ * + *

You then pass the Point instance that you created as the parameter to + * the localToGlobal() method. The method returns a new Point + * object with x and y values that relate to the origin of the + * Stage instead of the origin of the display object.

+ * + * @param point The name or identifier of a point created with the Point + * class, specifying the x and y coordinates as + * properties. + * @return A Point object with coordinates relative to the Stage. + */ + public localToGlobal(point: Point): Point; + /** + * Moves the 3d object directly to a point in space + * + * @param dx The amount of movement along the local x axis. + * @param dy The amount of movement along the local y axis. + * @param dz The amount of movement along the local z axis. + */ + public moveTo(dx: number, dy: number, dz: number): void; + /** + * Moves the local point around which the object rotates. + * + * @param dx The amount of movement along the local x axis. + * @param dy The amount of movement along the local y axis. + * @param dz The amount of movement along the local z axis. + */ + public movePivot(dx: number, dy: number, dz: number): void; + /** + * Rotates the 3d object around it's local x-axis + * + * @param angle The amount of rotation in degrees + */ + public pitch(angle: number): void; + /** + * + */ + public getRenderSceneTransform(camera: Camera): Matrix3D; + /** + * Rotates the 3d object around it's local z-axis + * + * @param angle The amount of rotation in degrees + */ + public roll(angle: number): void; + /** + * Rotates the 3d object around an axis by a defined angle + * + * @param axis The vector defining the axis of rotation + * @param angle The amount of rotation in degrees + */ + public rotate(axis: Vector3D, angle: number): void; + /** + * Rotates the 3d object directly to a euler angle + * + * @param ax The angle in degrees of the rotation around the x axis. + * @param ay The angle in degrees of the rotation around the y axis. + * @param az The angle in degrees of the rotation around the z axis. + */ + public rotateTo(ax: number, ay: number, az: number): void; + /** + * + */ + public removeEventListener(type: string, listener: Function): void; + /** + * Moves the 3d object along a vector by a defined length + * + * @param axis The vector defining the axis of movement + * @param distance The length of the movement + */ + public translate(axis: Vector3D, distance: number): void; + /** + * Moves the 3d object along a vector by a defined length + * + * @param axis The vector defining the axis of movement + * @param distance The length of the movement + */ + public translateLocal(axis: Vector3D, distance: number): void; + /** + * Rotates the 3d object around it's local y-axis + * + * @param angle The amount of rotation in degrees + */ + public yaw(angle: number): void; + /** + * @internal + */ + public _iController: ControllerBase; + /** + * @internal + */ + public _iAssignedPartition : Partition; + /** + * The transformation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + * + * @internal + */ + public _iMatrix3D : Matrix3D; + /** + * @internal + */ + public _iPickingCollisionVO : PickingCollisionVO; + /** + * @internal + */ + public iSetParent(value: DisplayObjectContainer): void; + /** + * @protected + */ + public pCreateDefaultBoundingVolume(): BoundingVolumeBase; + /** + * @protected + */ + public pCreateEntityPartitionNode(): EntityNode; + /** + * @protected + */ + public pInvalidateBounds(): void; + /** + * @protected + */ + public pInvalidateSceneTransform(): void; + /** + * @protected + */ + public pUpdateBounds(): void; + /** + * @protected + */ + public _pUpdateImplicitMouseEnabled(value: boolean): void; + /** + * @protected + */ + public _pUpdateImplicitPartition(value: Partition): void; + /** + * @protected + */ + public _pUpdateImplicitVisibility(value: boolean): void; + /** + * @protected + */ + public _pUpdateMatrix3D(): void; + /** + * @protected + */ + public pUpdateSceneTransform(): void; + public _iAddRenderable(renderable: IRenderable): IRenderable; + public _iRemoveRenderable(renderable: IRenderable): IRenderable; + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + public _iTestCollision(shortestCollisionDistance: number, findClosest: boolean): boolean; + /** + * + */ + public _iInternalUpdate(): void; + /** + * @internal + */ + public _iIsVisible(): boolean; + /** + * @internal + */ + public _iIsMouseEnabled(): boolean; + /** + * @internal + */ + public _iSetScene(value: Scene): void; + /** + * @protected + */ + public _pUpdateScene(value: Scene): void; + /** + * @private + */ + private notifyPositionChanged(); + /** + * @private + */ + private notifyRotationChanged(); + /** + * @private + */ + private notifyScaleChanged(); + /** + * @private + */ + private notifySceneChange(); + /** + * @private + */ + private notifySceneTransformChange(); + /** + * Invalidates the 3D transformation matrix, causing it to be updated upon the next request + * + * @private + */ + private invalidateMatrix3D(); + /** + * @private + */ + private invalidatePartition(); + /** + * @private + */ + private invalidatePivot(); + /** + * @private + */ + private invalidatePosition(); + /** + * @private + */ + private invalidateRotation(); + /** + * @private + */ + private invalidateScale(); + } + export = DisplayObject; + +} +declare module "awayjs-core/lib/core/base/Geometry" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + /** + * + * Geometry is a collection of SubGeometries, each of which contain the actual geometrical data such as vertices, + * normals, uvs, etc. It also contains a reference to an animation class, which defines how the geometry moves. + * A Geometry object is assigned to a Mesh, a scene graph occurence of the geometry, which in turn assigns + * the SubGeometries to its respective TriangleSubMesh objects. + * + * + * + * @see away.core.base.SubGeometry + * @see away.entities.Mesh + * + * @class Geometry + */ + class Geometry extends NamedAssetBase implements IAsset { + private _subGeometries; + public assetType : string; + /** + * A collection of TriangleSubGeometry objects, each of which contain geometrical data such as vertices, normals, etc. + */ + public subGeometries : SubGeometryBase[]; + public getSubGeometries(): SubGeometryBase[]; + /** + * Creates a new Geometry object. + */ + constructor(); + public applyTransformation(transform: Matrix3D): void; + /** + * Adds a new TriangleSubGeometry object to the list. + * @param subGeometry The TriangleSubGeometry object to be added. + */ + public addSubGeometry(subGeometry: SubGeometryBase): void; + /** + * Removes a new TriangleSubGeometry object from the list. + * @param subGeometry The TriangleSubGeometry object to be removed. + */ + public removeSubGeometry(subGeometry: SubGeometryBase): void; + /** + * Clones the geometry. + * @return An exact duplicate of the current Geometry object. + */ + public clone(): Geometry; + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + public scale(scale: number): void; + /** + * Clears all resources used by the Geometry object, including SubGeometries. + */ + public dispose(): void; + /** + * Scales the uv coordinates (tiling) + * @param scaleU The amount by which to scale on the u axis. Default is 1; + * @param scaleV The amount by which to scale on the v axis. Default is 1; + */ + public scaleUV(scaleU?: number, scaleV?: number): void; + public iInvalidateBounds(subGeom: SubGeometryBase): void; + } + export = Geometry; + +} +declare module "awayjs-core/lib/core/base/GradientType" { + /** + * The GradientType class provides values for the type parameter + * in the beginGradientFill() and + * lineGradientStyle() methods of the flash.display.Graphics + * class. + */ + class GradientType { + /** + * Value used to specify a linear gradient fill. + */ + static LINEAR: string; + /** + * Value used to specify a radial gradient fill. + */ + static RADIAL: string; + } + export = GradientType; + +} +declare module "awayjs-core/lib/core/base/Graphics" { + import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + import CapsStyle = require("awayjs-core/lib/core/base/CapsStyle"); + import GradientType = require("awayjs-core/lib/core/base/GradientType"); + import GraphicsPathWinding = require("awayjs-core/lib/core/base/GraphicsPathWinding"); + import IGraphicsData = require("awayjs-core/lib/core/base/IGraphicsData"); + import InterpolationMethod = require("awayjs-core/lib/core/base/InterpolationMethod"); + import JointStyle = require("awayjs-core/lib/core/base/JointStyle"); + import LineScaleMode = require("awayjs-core/lib/core/base/LineScaleMode"); + import TriangleCulling = require("awayjs-core/lib/core/base/TriangleCulling"); + import SpreadMethod = require("awayjs-core/lib/core/base/SpreadMethod"); + import Matrix = require("awayjs-core/lib/core/geom/Matrix"); + /** + * The Graphics class contains a set of methods that you can use to create a + * vector shape. Display objects that support drawing include Sprite and Shape + * objects. Each of these classes includes a graphics property + * that is a Graphics object. The following are among those helper functions + * provided for ease of use: drawRect(), + * drawRoundRect(), drawCircle(), and + * drawEllipse(). + * + *

You cannot create a Graphics object directly from ActionScript code. If + * you call new Graphics(), an exception is thrown.

+ * + *

The Graphics class is final; it cannot be subclassed.

+ */ + class Graphics { + /** + * Fills a drawing area with a bitmap image. The bitmap can be repeated or + * tiled to fill the area. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param bitmap A transparent or opaque bitmap image that contains the bits + * to be displayed. + * @param matrix A matrix object(of the flash.geom.Matrix class), which you + * can use to define transformations on the bitmap. For + * example, you can use the following matrix to rotate a bitmap + * by 45 degrees(pi/4 radians): + * @param repeat If true, the bitmap image repeats in a tiled + * pattern. If false, the bitmap image does not + * repeat, and the edges of the bitmap are used for any fill + * area that extends beyond the bitmap. + * + *

For example, consider the following bitmap(a 20 x + * 20-pixel checkerboard pattern):

+ * + *

When repeat is set to true(as + * in the following example), the bitmap fill repeats the + * bitmap:

+ * + *

When repeat is set to false, + * the bitmap fill uses the edge pixels for the fill area + * outside the bitmap:

+ * @param smooth If false, upscaled bitmap images are rendered + * by using a nearest-neighbor algorithm and look pixelated. If + * true, upscaled bitmap images are rendered by + * using a bilinear algorithm. Rendering by using the nearest + * neighbor algorithm is faster. + */ + public beginBitmapFill(bitmap: BitmapData, matrix?: Matrix, repeat?: boolean, smooth?: boolean): void; + /** + * Specifies a simple one-color fill that subsequent calls to other Graphics + * methods(such as lineTo() or drawCircle()) use + * when drawing. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param color The color of the fill(0xRRGGBB). + * @param alpha The alpha value of the fill(0.0 to 1.0). + */ + public beginFill(color: number, alpha?: number): void; + /** + * Specifies a gradient fill used by subsequent calls to other Graphics + * methods(such as lineTo() or drawCircle()) for + * the object. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param type A value from the GradientType class that + * specifies which gradient type to use: + * GradientType.LINEAR or + * GradientType.RADIAL. + * @param colors An array of RGB hexadecimal color values used + * in the gradient; for example, red is 0xFF0000, + * blue is 0x0000FF, and so on. You can specify + * up to 15 colors. For each color, specify a + * corresponding value in the alphas and ratios + * parameters. + * @param alphas An array of alpha values for the corresponding + * colors in the colors array; valid values are 0 + * to 1. If the value is less than 0, the default + * is 0. If the value is greater than 1, the + * default is 1. + * @param ratios An array of color distribution ratios; valid + * values are 0-255. This value defines the + * percentage of the width where the color is + * sampled at 100%. The value 0 represents the + * left position in the gradient box, and 255 + * represents the right position in the gradient + * box. + * @param matrix A transformation matrix as defined by the + * flash.geom.Matrix class. The flash.geom.Matrix + * class includes a + * createGradientBox() method, which + * lets you conveniently set up the matrix for use + * with the beginGradientFill() + * method. + * @param spreadMethod A value from the SpreadMethod class that + * specifies which spread method to use, either: + * SpreadMethod.PAD, + * SpreadMethod.REFLECT, or + * SpreadMethod.REPEAT. + * + *

For example, consider a simple linear + * gradient between two colors:

+ * + *

This example uses + * SpreadMethod.PAD for the spread + * method, and the gradient fill looks like the + * following:

+ * + *

If you use SpreadMethod.REFLECT + * for the spread method, the gradient fill looks + * like the following:

+ * + *

If you use SpreadMethod.REPEAT + * for the spread method, the gradient fill looks + * like the following:

+ * @param interpolationMethod A value from the InterpolationMethod class that + * specifies which value to use: + * InterpolationMethod.LINEAR_RGB or + * InterpolationMethod.RGB + * + *

For example, consider a simple linear + * gradient between two colors(with the + * spreadMethod parameter set to + * SpreadMethod.REFLECT). The + * different interpolation methods affect the + * appearance as follows:

+ * @param focalPointRatio A number that controls the location of the + * focal point of the gradient. 0 means that the + * focal point is in the center. 1 means that the + * focal point is at one border of the gradient + * circle. -1 means that the focal point is at the + * other border of the gradient circle. A value + * less than -1 or greater than 1 is rounded to -1 + * or 1. For example, the following example shows + * a focalPointRatio set to 0.75: + * @throws ArgumentError If the type parameter is not valid. + */ + public beginGradientFill(type: GradientType, colors: number[], alphas: number[], ratios: number[], matrix?: Matrix, spreadMethod?: string, interpolationMethod?: string, focalPointRatio?: number): void; + /** + * Clears the graphics that were drawn to this Graphics object, and resets + * fill and line style settings. + * + */ + public clear(): void; + /** + * Copies all of drawing commands from the source Graphics object into the + * calling Graphics object. + * + * @param sourceGraphics The Graphics object from which to copy the drawing + * commands. + */ + public copyFrom(sourceGraphics: Graphics): void; + /** + * Draws a cubic Bezier curve from the current drawing position to the + * specified anchor point. Cubic Bezier curves consist of two anchor points + * and two control points. The curve interpolates the two anchor points and + * curves toward the two control points. + * + * The four points you use to draw a cubic Bezier curve with the + * cubicCurveTo() method are as follows: + * + *
    + *
  • The current drawing position is the first anchor point.
  • + *
  • The anchorX and anchorY parameters specify the second anchor point. + *
  • + *
  • The controlX1 and controlY1 parameters + * specify the first control point.
  • + *
  • The controlX2 and controlY2 parameters + * specify the second control point.
  • + *
+ * + * If you call the cubicCurveTo() method before calling the + * moveTo() method, your curve starts at position (0, 0). + * + * If the cubicCurveTo() method succeeds, the Flash runtime sets + * the current drawing position to (anchorX, + * anchorY). If the cubicCurveTo() method fails, + * the current drawing position remains unchanged. + * + * If your movie clip contains content created with the Flash drawing tools, + * the results of calls to the cubicCurveTo() method are drawn + * underneath that content. + * + * @param controlX1 Specifies the horizontal position of the first control + * point relative to the registration point of the parent + * display object. + * @param controlY1 Specifies the vertical position of the first control + * point relative to the registration point of the parent + * display object. + * @param controlX2 Specifies the horizontal position of the second control + * point relative to the registration point of the parent + * display object. + * @param controlY2 Specifies the vertical position of the second control + * point relative to the registration point of the parent + * display object. + * @param anchorX Specifies the horizontal position of the anchor point + * relative to the registration point of the parent display + * object. + * @param anchorY Specifies the vertical position of the anchor point + * relative to the registration point of the parent display + * object. + */ + public cubicCurveTo(controlX1: number, controlY1: number, controlX2: number, controlY2: number, anchorX: number, anchorY: number): void; + /** + * Draws a curve using the current line style from the current drawing + * position to(anchorX, anchorY) and using the control point that + * (controlX, controlY) specifies. The current + * drawing position is then set to(anchorX, + * anchorY). If the movie clip in which you are drawing contains + * content created with the Flash drawing tools, calls to the + * curveTo() method are drawn underneath this content. If you + * call the curveTo() method before any calls to the + * moveTo() method, the default of the current drawing position + * is(0, 0). If any of the parameters are missing, this method fails and the + * current drawing position is not changed. + * + *

The curve drawn is a quadratic Bezier curve. Quadratic Bezier curves + * consist of two anchor points and one control point. The curve interpolates + * the two anchor points and curves toward the control point.

+ * + * @param controlX A number that specifies the horizontal position of the + * control point relative to the registration point of the + * parent display object. + * @param controlY A number that specifies the vertical position of the + * control point relative to the registration point of the + * parent display object. + * @param anchorX A number that specifies the horizontal position of the + * next anchor point relative to the registration point of + * the parent display object. + * @param anchorY A number that specifies the vertical position of the next + * anchor point relative to the registration point of the + * parent display object. + */ + public curveTo(controlX: number, controlY: number, anchorX: number, anchorY: number): void; + /** + * Draws a circle. Set the line style, fill, or both before you call the + * drawCircle() method, by calling the linestyle(), + * lineGradientStyle(), beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. + * + * @param x The x location of the center of the circle relative + * to the registration point of the parent display object(in + * pixels). + * @param y The y location of the center of the circle relative + * to the registration point of the parent display object(in + * pixels). + * @param radius The radius of the circle(in pixels). + */ + public drawCircle(x: number, y: number, radius: number): void; + /** + * Draws an ellipse. Set the line style, fill, or both before you call the + * drawEllipse() method, by calling the + * linestyle(), lineGradientStyle(), + * beginFill(), beginGradientFill(), or + * beginBitmapFill() method. + * + * @param x The x location of the top-left of the bounding-box of + * the ellipse relative to the registration point of the parent + * display object(in pixels). + * @param y The y location of the top left of the bounding-box of + * the ellipse relative to the registration point of the parent + * display object(in pixels). + * @param width The width of the ellipse(in pixels). + * @param height The height of the ellipse(in pixels). + */ + public drawEllipse(x: number, y: number, width: number, height: number): void; + /** + * Submits a series of IGraphicsData instances for drawing. This method + * accepts a Vector containing objects including paths, fills, and strokes + * that implement the IGraphicsData interface. A Vector of IGraphicsData + * instances can refer to a part of a shape, or a complex fully defined set + * of data for rendering a complete shape. + * + *

Graphics paths can contain other graphics paths. If the + * graphicsData Vector includes a path, that path and all its + * sub-paths are rendered during this operation.

+ * + */ + public drawGraphicsData(graphicsData: IGraphicsData[]): void; + /** + * Submits a series of commands for drawing. The drawPath() + * method uses vector arrays to consolidate individual moveTo(), + * lineTo(), and curveTo() drawing commands into a + * single call. The drawPath() method parameters combine drawing + * commands with x- and y-coordinate value pairs and a drawing direction. The + * drawing commands are values from the GraphicsPathCommand class. The x- and + * y-coordinate value pairs are Numbers in an array where each pair defines a + * coordinate location. The drawing direction is a value from the + * GraphicsPathWinding class. + * + *

Generally, drawings render faster with drawPath() than + * with a series of individual lineTo() and + * curveTo() methods.

+ * + *

The drawPath() method uses a uses a floating computation + * so rotation and scaling of shapes is more accurate and gives better + * results. However, curves submitted using the drawPath() + * method can have small sub-pixel alignment errors when used in conjunction + * with the lineTo() and curveTo() methods.

+ * + *

The drawPath() method also uses slightly different rules + * for filling and drawing lines. They are:

+ * + *
    + *
  • When a fill is applied to rendering a path: + *
      + *
    • A sub-path of less than 3 points is not rendered.(But note that the + * stroke rendering will still occur, consistent with the rules for strokes + * below.)
    • + *
    • A sub-path that isn't closed(the end point is not equal to the + * begin point) is implicitly closed.
    • + *
    + *
  • + *
  • When a stroke is applied to rendering a path: + *
      + *
    • The sub-paths can be composed of any number of points.
    • + *
    • The sub-path is never implicitly closed.
    • + *
    + *
  • + *
+ * + * @param winding Specifies the winding rule using a value defined in the + * GraphicsPathWinding class. + */ + public drawPath(commands: number[], data: number[], winding: GraphicsPathWinding): void; + /** + * Draws a rectangle. Set the line style, fill, or both before you call the + * drawRect() method, by calling the linestyle(), + * lineGradientStyle(), beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. + * + * @param x A number indicating the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number indicating the vertical position relative to the + * registration point of the parent display object(in pixels). + * @param width The width of the rectangle(in pixels). + * @param height The height of the rectangle(in pixels). + * @throws ArgumentError If the width or height + * parameters are not a number + * (Number.NaN). + */ + public drawRect(x: number, y: number, width: number, height: number): void; + /** + * Draws a rounded rectangle. Set the line style, fill, or both before you + * call the drawRoundRect() method, by calling the + * linestyle(), lineGradientStyle(), + * beginFill(), beginGradientFill(), or + * beginBitmapFill() method. + * + * @param x A number indicating the horizontal position relative + * to the registration point of the parent display + * object(in pixels). + * @param y A number indicating the vertical position relative to + * the registration point of the parent display object + * (in pixels). + * @param width The width of the round rectangle(in pixels). + * @param height The height of the round rectangle(in pixels). + * @param ellipseWidth The width of the ellipse used to draw the rounded + * corners(in pixels). + * @param ellipseHeight The height of the ellipse used to draw the rounded + * corners(in pixels). Optional; if no value is + * specified, the default value matches that provided + * for the ellipseWidth parameter. + * @throws ArgumentError If the width, height, + * ellipseWidth or + * ellipseHeight parameters are not a + * number(Number.NaN). + */ + public drawRoundRect(x: number, y: number, width: number, height: number, ellipseWidth: number, ellipseHeight?: number): void; + /** + * Renders a set of triangles, typically to distort bitmaps and give them a + * three-dimensional appearance. The drawTriangles() method maps + * either the current fill, or a bitmap fill, to the triangle faces using a + * set of(u,v) coordinates. + * + *

Any type of fill can be used, but if the fill has a transform matrix + * that transform matrix is ignored.

+ * + *

A uvtData parameter improves texture mapping when a + * bitmap fill is used.

+ * + * @param culling Specifies whether to render triangles that face in a + * specified direction. This parameter prevents the rendering + * of triangles that cannot be seen in the current view. This + * parameter can be set to any value defined by the + * TriangleCulling class. + */ + public drawTriangles(vertices: number[], indices?: number[], uvtData?: number[], culling?: TriangleCulling): void; + /** + * Applies a fill to the lines and curves that were added since the last call + * to the beginFill(), beginGradientFill(), or + * beginBitmapFill() method. Flash uses the fill that was + * specified in the previous call to the beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. If the current drawing position does not equal the previous + * position specified in a moveTo() method and a fill is + * defined, the path is closed with a line and then filled. + * + */ + public endFill(): void; + /** + * Specifies a bitmap to use for the line stroke when drawing lines. + * + *

The bitmap line style is used for subsequent calls to Graphics methods + * such as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineStyle() or lineGradientStyle() methods, or + * the lineBitmapStyle() method again with different parameters. + *

+ * + *

You can call the lineBitmapStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineBitmapStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param bitmap The bitmap to use for the line stroke. + * @param matrix An optional transformation matrix as defined by the + * flash.geom.Matrix class. The matrix can be used to scale or + * otherwise manipulate the bitmap before applying it to the + * line style. + * @param repeat Whether to repeat the bitmap in a tiled fashion. + * @param smooth Whether smoothing should be applied to the bitmap. + */ + public lineBitmapStyle(bitmap: BitmapData, matrix?: Matrix, repeat?: boolean, smooth?: boolean): void; + /** + * Specifies a gradient to use for the stroke when drawing lines. + * + *

The gradient line style is used for subsequent calls to Graphics + * methods such as the lineTo() methods or the + * drawCircle() method. The line style remains in effect until + * you call the lineStyle() or lineBitmapStyle() + * methods, or the lineGradientStyle() method again with + * different parameters.

+ * + *

You can call the lineGradientStyle() method in the middle + * of drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineGradientStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param type A value from the GradientType class that + * specifies which gradient type to use, either + * GradientType.LINEAR or GradientType.RADIAL. + * @param colors An array of RGB hexadecimal color values used + * in the gradient; for example, red is 0xFF0000, + * blue is 0x0000FF, and so on. You can specify + * up to 15 colors. For each color, specify a + * corresponding value in the alphas and ratios + * parameters. + * @param alphas An array of alpha values for the corresponding + * colors in the colors array; valid values are 0 + * to 1. If the value is less than 0, the default + * is 0. If the value is greater than 1, the + * default is 1. + * @param ratios An array of color distribution ratios; valid + * values are 0-255. This value defines the + * percentage of the width where the color is + * sampled at 100%. The value 0 represents the + * left position in the gradient box, and 255 + * represents the right position in the gradient + * box. + * @param matrix A transformation matrix as defined by the + * flash.geom.Matrix class. The flash.geom.Matrix + * class includes a + * createGradientBox() method, which + * lets you conveniently set up the matrix for use + * with the lineGradientStyle() + * method. + * @param spreadMethod A value from the SpreadMethod class that + * specifies which spread method to use: + * @param interpolationMethod A value from the InterpolationMethod class that + * specifies which value to use. For example, + * consider a simple linear gradient between two + * colors(with the spreadMethod + * parameter set to + * SpreadMethod.REFLECT). The + * different interpolation methods affect the + * appearance as follows: + * @param focalPointRatio A number that controls the location of the + * focal point of the gradient. The value 0 means + * the focal point is in the center. The value 1 + * means the focal point is at one border of the + * gradient circle. The value -1 means that the + * focal point is at the other border of the + * gradient circle. Values less than -1 or greater + * than 1 are rounded to -1 or 1. The following + * image shows a gradient with a + * focalPointRatio of -0.75: + */ + public lineGradientStyle(type: GradientType, colors: number[], alphas: number[], ratios: number[], matrix?: Matrix, spreadMethod?: SpreadMethod, interpolationMethod?: InterpolationMethod, focalPointRatio?: number): void; + /** + * Specifies a line style used for subsequent calls to Graphics methods such + * as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineGradientStyle() method, the + * lineBitmapStyle() method, or the lineStyle() + * method with different parameters. + * + *

You can call the lineStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within the path.

+ * + *

Note: Calls to the clear() method set the line + * style back to undefined.

+ * + *

Note: Flash Lite 4 supports only the first three parameters + * (thickness, color, and alpha).

+ * + * @param thickness An integer that indicates the thickness of the line in + * points; valid values are 0-255. If a number is not + * specified, or if the parameter is undefined, a line is + * not drawn. If a value of less than 0 is passed, the + * default is 0. The value 0 indicates hairline + * thickness; the maximum thickness is 255. If a value + * greater than 255 is passed, the default is 255. + * @param color A hexadecimal color value of the line; for example, + * red is 0xFF0000, blue is 0x0000FF, and so on. If a + * value is not indicated, the default is 0x000000 + * (black). Optional. + * @param alpha A number that indicates the alpha value of the color + * of the line; valid values are 0 to 1. If a value is + * not indicated, the default is 1(solid). If the value + * is less than 0, the default is 0. If the value is + * greater than 1, the default is 1. + * @param pixelHinting(Not supported in Flash Lite 4) A Boolean value that + * specifies whether to hint strokes to full pixels. This + * affects both the position of anchors of a curve and + * the line stroke size itself. With + * pixelHinting set to true, + * line widths are adjusted to full pixel widths. With + * pixelHinting set to false, + * disjoints can appear for curves and straight lines. + * For example, the following illustrations show how + * Flash Player or Adobe AIR renders two rounded + * rectangles that are identical, except that the + * pixelHinting parameter used in the + * lineStyle() method is set differently + * (the images are scaled by 200%, to emphasize the + * difference): + * + *

If a value is not supplied, the line does not use + * pixel hinting.

+ * @param scaleMode (Not supported in Flash Lite 4) A value from the + * LineScaleMode class that specifies which scale mode to + * use: + *
    + *
  • LineScaleMode.NORMAL - Always + * scale the line thickness when the object is scaled + * (the default).
  • + *
  • LineScaleMode.NONE - Never scale + * the line thickness.
  • + *
  • LineScaleMode.VERTICAL - Do not + * scale the line thickness if the object is scaled + * vertically only. For example, consider the + * following circles, drawn with a one-pixel line, and + * each with the scaleMode parameter set to + * LineScaleMode.VERTICAL. The circle on the + * left is scaled vertically only, and the circle on the + * right is scaled both vertically and horizontally: + *
  • + *
  • LineScaleMode.HORIZONTAL - Do not + * scale the line thickness if the object is scaled + * horizontally only. For example, consider the + * following circles, drawn with a one-pixel line, and + * each with the scaleMode parameter set to + * LineScaleMode.HORIZONTAL. The circle on + * the left is scaled horizontally only, and the circle + * on the right is scaled both vertically and + * horizontally:
  • + *
+ * @param caps (Not supported in Flash Lite 4) A value from the + * CapsStyle class that specifies the type of caps at the + * end of lines. Valid values are: + * CapsStyle.NONE, + * CapsStyle.ROUND, and + * CapsStyle.SQUARE. If a value is not + * indicated, Flash uses round caps. + * + *

For example, the following illustrations show the + * different capsStyle settings. For each + * setting, the illustration shows a blue line with a + * thickness of 30(for which the capsStyle + * applies), and a superimposed black line with a + * thickness of 1(for which no capsStyle + * applies):

+ * @param joints (Not supported in Flash Lite 4) A value from the + * JointStyle class that specifies the type of joint + * appearance used at angles. Valid values are: + * JointStyle.BEVEL, + * JointStyle.MITER, and + * JointStyle.ROUND. If a value is not + * indicated, Flash uses round joints. + * + *

For example, the following illustrations show the + * different joints settings. For each + * setting, the illustration shows an angled blue line + * with a thickness of 30(for which the + * jointStyle applies), and a superimposed + * angled black line with a thickness of 1(for which no + * jointStyle applies):

+ * + *

Note: For joints set to + * JointStyle.MITER, you can use the + * miterLimit parameter to limit the length + * of the miter.

+ * @param miterLimit (Not supported in Flash Lite 4) A number that + * indicates the limit at which a miter is cut off. Valid + * values range from 1 to 255(and values outside that + * range are rounded to 1 or 255). This value is only + * used if the jointStyle is set to + * "miter". The miterLimit + * value represents the length that a miter can extend + * beyond the point at which the lines meet to form a + * joint. The value expresses a factor of the line + * thickness. For example, with a + * miterLimit factor of 2.5 and a + * thickness of 10 pixels, the miter is cut + * off at 25 pixels. + * + *

For example, consider the following angled lines, + * each drawn with a thickness of 20, but + * with miterLimit set to 1, 2, and 4. + * Superimposed are black reference lines showing the + * meeting points of the joints:

+ * + *

Notice that a given miterLimit value + * has a specific maximum angle for which the miter is + * cut off. The following table lists some examples:

+ */ + public lineStyle(thickness?: number, color?: number, alpha?: number, pixelHinting?: boolean, scaleMode?: LineScaleMode, caps?: CapsStyle, joints?: JointStyle, miterLimit?: number): void; + /** + * Draws a line using the current line style from the current drawing + * position to(x, y); the current drawing position + * is then set to(x, y). If the display object in + * which you are drawing contains content that was created with the Flash + * drawing tools, calls to the lineTo() method are drawn + * underneath the content. If you call lineTo() before any calls + * to the moveTo() method, the default position for the current + * drawing is(0, 0). If any of the parameters are missing, this + * method fails and the current drawing position is not changed. + * + * @param x A number that indicates the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number that indicates the vertical position relative to the + * registration point of the parent display object(in pixels). + */ + public lineTo(x: number, y: number): void; + /** + * Moves the current drawing position to(x, y). If + * any of the parameters are missing, this method fails and the current + * drawing position is not changed. + * + * @param x A number that indicates the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number that indicates the vertical position relative to the + * registration point of the parent display object(in pixels). + */ + public moveTo(x: number, y: number): void; + } + export = Graphics; + +} +declare module "awayjs-core/lib/core/base/GraphicsPathWinding" { + /** + * The GraphicsPathWinding class provides values for the + * flash.display.GraphicsPath.winding property and the + * flash.display.Graphics.drawPath() method to determine the + * direction to draw a path. A clockwise path is positively wound, and a + * counter-clockwise path is negatively wound: + * + *

When paths intersect or overlap, the winding direction determines the + * rules for filling the areas created by the intersection or overlap:

+ */ + class GraphicsPathWinding { + static EVEN_ODD: string; + static NON_ZERO: string; + } + export = GraphicsPathWinding; + +} +declare module "awayjs-core/lib/core/base/IBitmapDrawable" { + /** + * The IBitmapDrawable interface is implemented by objects that can be passed as the + * source parameter of the draw() method of the BitmapData class. These + * objects are of type BitmapData or DisplayObject. + * + * @see away.base.BitmapData#draw() + * @see away.base.BitmapData + * @see away.base.DisplayObject + */ + interface IBitmapDrawable { + } + export = IBitmapDrawable; + +} +declare module "awayjs-core/lib/core/base/IGraphicsData" { + /** + * This interface is used to define objects that can be used as parameters in the + * away.base.Graphics methods, including fills, strokes, and paths. Use + * the implementor classes of this interface to create and manage drawing property + * data, and to reuse the same data for different instances. Then, use the methods of + * the Graphics class to render the drawing objects. + * + * @see away.base.Graphics.drawGraphicsData() + * @see away.base.Graphics.readGraphicsData() + */ + interface IGraphicsData { + } + export = IGraphicsData; + +} +declare module "awayjs-core/lib/core/base/IMaterialOwner" { + import IAnimator = require("awayjs-core/lib/animators/IAnimator"); + import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * IMaterialOwner provides an interface for objects that can use materials. + * + * @interface away.base.IMaterialOwner + */ + interface IMaterialOwner extends IAsset { + /** + * The animation used by the material owner to assemble the vertex code. + */ + animator: IAnimator; + /** + * The material with which to render the object. + */ + material: MaterialBase; + /** + * + */ + uvTransform: UVTransform; + /** + * + * @param renderable + * @private + */ + _iAddRenderable(renderable: IRenderable): IRenderable; + /** + * + * @param renderable + * @private + */ + _iRemoveRenderable(renderable: IRenderable): IRenderable; + /** + * + * @param renderer + * @private + */ + _iCollectRenderable(renderer: IRenderer): any; + } + export = IMaterialOwner; + +} +declare module "awayjs-core/lib/core/base/IStage" { + /** + * The IStage interface is implemented by objects that control the rendering context + * of the AwayJS Stage area + * + */ + interface IStage { + } + export = IStage; + +} +declare module "awayjs-core/lib/core/base/ISubMesh" { + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import Mesh = require("awayjs-core/lib/entities/Mesh"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * ISubMesh is an interface for object SubMesh that is used to + * apply a material to a SubGeometry class + * + * @class away.base.ISubMesh + */ + interface ISubMesh extends IMaterialOwner { + subGeometry: SubGeometryBase; + parentMesh: Mesh; + _iIndex: number; + _iInvalidateRenderableGeometry(): any; + _iGetExplicitMaterial(): MaterialBase; + } + export = ISubMesh; + +} +declare module "awayjs-core/lib/core/base/ISubMeshClass" { + import ISubMesh = require("awayjs-core/lib/core/base/ISubMesh"); + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import Mesh = require("awayjs-core/lib/entities/Mesh"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * ISubMeshClass is an interface for the constructable class definition ISubMesh that is used to + * apply a material to a SubGeometry class + * + * @class away.base.ISubMeshClass + */ + interface ISubMeshClass { + /** + * + */ + new(subGeometry: SubGeometryBase, parentMesh: Mesh, material?: MaterialBase): ISubMesh; + } + export = ISubMeshClass; + +} +declare module "awayjs-core/lib/core/base/InterpolationMethod" { + /** + * The InterpolationMethod class provides values for the + * interpolationMethod parameter in the + * Graphics.beginGradientFill() and + * Graphics.lineGradientStyle() methods. This parameter + * determines the RGB space to use when rendering the gradient. + */ + class InterpolationMethod { + /** + * Specifies that the RGB interpolation method should be used. This means + * that the gradient is rendered with exponential sRGB(standard RGB) space. + * The sRGB space is a W3C-endorsed standard that defines a non-linear + * conversion between red, green, and blue component values and the actual + * intensity of the visible component color. + * + *

For example, consider a simple linear gradient between two colors(with + * the spreadMethod parameter set to + * SpreadMethod.REFLECT). The different interpolation methods + * affect the appearance as follows:

+ */ + static LINEAR_RGB: string; + /** + * Specifies that the RGB interpolation method should be used. This means + * that the gradient is rendered with exponential sRGB(standard RGB) space. + * The sRGB space is a W3C-endorsed standard that defines a non-linear + * conversion between red, green, and blue component values and the actual + * intensity of the visible component color. + * + *

For example, consider a simple linear gradient between two colors(with + * the spreadMethod parameter set to + * SpreadMethod.REFLECT). The different interpolation methods + * affect the appearance as follows:

+ */ + static RGB: string; + } + export = InterpolationMethod; + +} +declare module "awayjs-core/lib/core/base/JointStyle" { + /** + * The JointStyle class is an enumeration of constant values that specify the + * joint style to use in drawing lines. These constants are provided for use + * as values in the joints parameter of the + * flash.display.Graphics.lineStyle() method. The method supports + * three types of joints: miter, round, and bevel, as the following example + * shows: + */ + class JointStyle { + /** + * Specifies beveled joints in the joints parameter of the + * flash.display.Graphics.lineStyle() method. + */ + static BEVEL: string; + /** + * Specifies mitered joints in the joints parameter of the + * flash.display.Graphics.lineStyle() method. + */ + static MITER: string; + /** + * Specifies round joints in the joints parameter of the + * flash.display.Graphics.lineStyle() method. + */ + static ROUND: string; + } + export = JointStyle; + +} +declare module "awayjs-core/lib/core/base/LightBase" { + import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); + class LightBase extends DisplayObjectContainer { + private _color; + private _colorR; + private _colorG; + private _colorB; + private _ambientColor; + private _ambient; + public _iAmbientR: number; + public _iAmbientG: number; + public _iAmbientB: number; + private _specular; + public _iSpecularR: number; + public _iSpecularG: number; + public _iSpecularB: number; + private _diffuse; + public _iDiffuseR: number; + public _iDiffuseG: number; + public _iDiffuseB: number; + private _castsShadows; + private _shadowMapper; + constructor(); + public castsShadows : boolean; + public pCreateShadowMapper(): ShadowMapperBase; + public specular : number; + public diffuse : number; + public color : number; + public ambient : number; + public ambientColor : number; + private updateAmbient(); + public iGetObjectProjectionMatrix(entity: IEntity, camera: Camera, target?: Matrix3D): Matrix3D; + public assetType : string; + private updateSpecular(); + private updateDiffuse(); + public shadowMapper : ShadowMapperBase; + } + export = LightBase; + +} +declare module "awayjs-core/lib/core/base/LineScaleMode" { + /** + * The LineScaleMode class provides values for the scaleMode + * parameter in the Graphics.lineStyle() method. + */ + class LineScaleMode { + /** + * With this setting used as the scaleMode parameter of the + * lineStyle() method, the thickness of the line scales + * only vertically. For example, consider the following circles, drawn + * with a one-pixel line, and each with the scaleMode parameter + * set to LineScaleMode.VERTICAL. The circle on the left is + * scaled only vertically, and the circle on the right is scaled both + * vertically and horizontally. + */ + static HORIZONTAL: string; + /** + * With this setting used as the scaleMode parameter of the + * lineStyle() method, the thickness of the line never scales. + */ + static NONE: string; + /** + * With this setting used as the scaleMode parameter of the + * lineStyle() method, the thickness of the line always scales + * when the object is scaled(the default). + */ + static NORMAL: string; + /** + * With this setting used as the scaleMode parameter of the + * lineStyle() method, the thickness of the line scales + * only horizontally. For example, consider the following circles, + * drawn with a one-pixel line, and each with the scaleMode + * parameter set to LineScaleMode.HORIZONTAL. The circle on the + * left is scaled only horizontally, and the circle on the right is scaled + * both vertically and horizontally. + */ + static VERTICAL: string; + } + export = LineScaleMode; + +} +declare module "awayjs-core/lib/core/base/LineSubGeometry" { + import Geometry = require("awayjs-core/lib/core/base/Geometry"); + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + /** + * @class LineSubGeometry + */ + class LineSubGeometry extends SubGeometryBase { + static VERTEX_DATA: string; + static START_POSITION_DATA: string; + static END_POSITION_DATA: string; + static THICKNESS_DATA: string; + static COLOR_DATA: string; + static POSITION_FORMAT: string; + static COLOR_FORMAT: string; + static THICKNESS_FORMAT: string; + private _positionsDirty; + private _boundingPositionDirty; + private _thicknessDirty; + private _colorsDirty; + private _startPositions; + private _endPositions; + private _boundingPositions; + private _thickness; + private _startColors; + private _endColors; + private _numSegments; + private _positionsUpdated; + private _thicknessUpdated; + private _colorUpdated; + public _pUpdateStrideOffset(): void; + /** + * + */ + public vertices : number[]; + /** + * + */ + public startPositions : number[]; + /** + * + */ + public endPositions : number[]; + /** + * + */ + public thickness : number[]; + /** + * + */ + public startColors : number[]; + /** + * + */ + public endColors : number[]; + /** + * The total amount of segments in the TriangleSubGeometry. + */ + public numSegments : number; + /** + * + */ + constructor(); + public getBoundingPositions(): number[]; + /** + * + */ + public updatePositions(startValues: number[], endValues: number[]): void; + /** + * Updates the thickness. + */ + public updateThickness(values: number[]): void; + /** + * + */ + public updateColors(startValues: number[], endValues: number[]): void; + /** + * + */ + public dispose(): void; + /** + * @protected + */ + public pInvalidateBounds(): void; + /** + * The Geometry object that 'owns' this TriangleSubGeometry object. + * + * @private + */ + public parentGeometry: Geometry; + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + public clone(): LineSubGeometry; + public _pNotifyVerticesUpdate(): void; + private notifyPositionsUpdate(); + private notifyThicknessUpdate(); + private notifyColorsUpdate(); + } + export = LineSubGeometry; + +} +declare module "awayjs-core/lib/core/base/LineSubMesh" { + import ISubMesh = require("awayjs-core/lib/core/base/ISubMesh"); + import LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); + import SubMeshBase = require("awayjs-core/lib/core/base/SubMeshBase"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Mesh = require("awayjs-core/lib/entities/Mesh"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * LineSubMesh wraps a LineSubGeometry as a scene graph instantiation. A LineSubMesh is owned by a Mesh object. + * + * + * @see away.base.LineSubGeometry + * @see away.entities.Mesh + * + * @class away.base.LineSubMesh + */ + class LineSubMesh extends SubMeshBase implements ISubMesh { + private _subGeometry; + /** + * + */ + public assetType : string; + /** + * The LineSubGeometry object which provides the geometry data for this LineSubMesh. + */ + public subGeometry : LineSubGeometry; + /** + * Creates a new LineSubMesh object + * @param subGeometry The LineSubGeometry object which provides the geometry data for this LineSubMesh. + * @param parentMesh The Mesh object to which this LineSubMesh belongs. + * @param material An optional material used to render this LineSubMesh. + */ + constructor(subGeometry: LineSubGeometry, parentMesh: Mesh, material?: MaterialBase); + /** + * + */ + public dispose(): void; + public _iCollectRenderable(renderer: IRenderer): void; + } + export = LineSubMesh; + +} +declare module "awayjs-core/lib/core/base/LoaderInfo" { + import Loader = require("awayjs-core/lib/containers/Loader"); + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + import ByteArray = require("awayjs-core/lib/utils/ByteArray"); + /** + * The LoaderInfo class provides information about a loaded SWF file or a + * loaded image file(JPEG, GIF, or PNG). LoaderInfo objects are available for + * any display object. The information provided includes load progress, the + * URLs of the loader and loaded content, the number of bytes total for the + * media, and the nominal height and width of the media. + * + *

You can access LoaderInfo objects in two ways:

+ * + *
    + *
  • The contentLoaderInfo property of a flash.display.Loader + * object - The contentLoaderInfo property is always available + * for any Loader object. For a Loader object that has not called the + * load() or loadBytes() method, or that has not + * sufficiently loaded, attempting to access many of the properties of the + * contentLoaderInfo property throws an error.
  • + *
  • The loaderInfo property of a display object.
  • + *
+ * + *

The contentLoaderInfo property of a Loader object provides + * information about the content that the Loader object is loading, whereas + * the loaderInfo property of a DisplayObject provides + * information about the root SWF file for that display object.

+ * + *

When you use a Loader object to load a display object(such as a SWF + * file or a bitmap), the loaderInfo property of the display + * object is the same as the contentLoaderInfo property of the + * Loader object(DisplayObject.loaderInfo = + * Loader.contentLoaderInfo). Because the instance of the main class of + * the SWF file has no Loader object, the loaderInfo property is + * the only way to access the LoaderInfo for the instance of the main class of + * the SWF file.

+ * + *

The following diagram shows the different uses of the LoaderInfo + * object - for the instance of the main class of the SWF file, for the + * contentLoaderInfo property of a Loader object, and for the + * loaderInfo property of a loaded object:

+ * + *

When a loading operation is not complete, some properties of the + * contentLoaderInfo property of a Loader object are not + * available. You can obtain some properties, such as + * bytesLoaded, bytesTotal, url, + * loaderURL, and applicationDomain. When the + * loaderInfo object dispatches the init event, you + * can access all properties of the loaderInfo object and the + * loaded image or SWF file.

+ * + *

Note: All properties of LoaderInfo objects are read-only.

+ * + *

The EventDispatcher.dispatchEvent() method is not + * applicable to LoaderInfo objects. If you call dispatchEvent() + * on a LoaderInfo object, an IllegalOperationError exception is thrown.

+ * + * @event complete Dispatched when data has loaded successfully. In other + * words, it is dispatched when all the content has been + * downloaded and the loading has finished. The + * complete event is always dispatched after + * the init event. The init event + * is dispatched when the object is ready to access, though + * the content may still be downloading. + * @event httpStatus Dispatched when a network request is made over HTTP and + * an HTTP status code can be detected. + * @event init Dispatched when the properties and methods of a loaded + * SWF file are accessible and ready for use. The content, + * however, can still be downloading. A LoaderInfo object + * dispatches the init event when the following + * conditions exist: + *
    + *
  • All properties and methods associated with the + * loaded object and those associated with the LoaderInfo + * object are accessible.
  • + *
  • The constructors for all child objects have + * completed.
  • + *
  • All ActionScript code in the first frame of the + * loaded SWF's main timeline has been executed.
  • + *
+ * + *

For example, an Event.INIT is dispatched + * when the first frame of a movie or animation is loaded. + * The movie is then accessible and can be added to the + * display list. The complete movie, however, can take + * longer to download. The Event.COMPLETE is + * only dispatched once the full movie is loaded.

+ * + *

The init event always precedes the + * complete event.

+ * @event ioError Dispatched when an input or output error occurs that + * causes a load operation to fail. + * @event open Dispatched when a load operation starts. + * @event progress Dispatched when data is received as the download + * operation progresses. + * @event unload Dispatched by a LoaderInfo object whenever a loaded + * object is removed by using the unload() + * method of the Loader object, or when a second load is + * performed by the same Loader object and the original + * content is removed prior to the load beginning. + */ + class LoaderInfo extends EventDispatcher { + private _bytes; + private _bytesLoaded; + private _bytesTotal; + private _content; + private _contentType; + private _loader; + private _url; + /** + * The bytes associated with a LoaderInfo object. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the loaded object due to security + * restrictions. This situation can occur, for + * instance, when a Loader object attempts to access + * the contentLoaderInfo.content property + * and it is not granted security permission to access + * the loaded content. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + public bytes : ByteArray; + /** + * The number of bytes that are loaded for the media. When this number equals + * the value of bytesTotal, all of the bytes are loaded. + */ + public bytesLoaded : number; + /** + * The number of compressed bytes in the entire media file. + * + *

Before the first progress event is dispatched by this + * LoaderInfo object's corresponding Loader object, bytesTotal + * is 0. After the first progress event from the Loader object, + * bytesTotal reflects the actual number of bytes to be + * downloaded.

+ */ + public bytesTotal : number; + /** + * The loaded object associated with this LoaderInfo object. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the loaded object due to security + * restrictions. This situation can occur, for + * instance, when a Loader object attempts to access + * the contentLoaderInfo.content property + * and it is not granted security permission to access + * the loaded content. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + public content : DisplayObject; + /** + * The MIME type of the loaded file. The value is null if not + * enough of the file has loaded in order to determine the type. The + * following list gives the possible values: + *
    + *
  • "application/x-shockwave-flash"
  • + *
  • "image/jpeg"
  • + *
  • "image/gif"
  • + *
  • "image/png"
  • + *
+ */ + public contentType : string; + /** + * The Loader object associated with this LoaderInfo object. If this + * LoaderInfo object is the loaderInfo property of the instance + * of the main class of the SWF file, no Loader object is associated. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the Loader object because of security + * restrictions. This can occur, for instance, when a + * loaded SWF file attempts to access its + * loaderInfo.loader property and it is + * not granted security permission to access the + * loading SWF file. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + public loader : Loader; + /** + * The URL of the media being loaded. + * + *

Before the first progress event is dispatched by this + * LoaderInfo object's corresponding Loader object, the value of the + * url property might reflect only the initial URL specified in + * the call to the load() method of the Loader object. After the + * first progress event, the url property reflects + * the media's final URL, after any redirects and relative URLs are + * resolved.

+ * + *

In some cases, the value of the url property is truncated; + * see the isURLInaccessible property for details.

+ */ + public url : string; + } + export = LoaderInfo; + +} +declare module "awayjs-core/lib/core/base/OrientationMode" { + class OrientationMode { + /** + * + */ + static DEFAULT: string; + /** + * + */ + static CAMERA_PLANE: string; + /** + * + */ + static CAMERA_POSITION: string; + } + export = OrientationMode; + +} +declare module "awayjs-core/lib/core/base/PixelSnapping" { + /** + * The PixelSnapping class is an enumeration of constant values for setting + * the pixel snapping options by using the pixelSnapping property + * of a Bitmap object. + */ + class PixelSnapping { + /** + * A constant value used in the pixelSnapping property of a + * Bitmap object to specify that the bitmap image is always snapped to the + * nearest pixel, independent of any transformation. + */ + static ALWAYS: string; + /** + * A constant value used in the pixelSnapping property of a + * Bitmap object to specify that the bitmap image is snapped to the nearest + * pixel if it is drawn with no rotation or skew and it is drawn at a scale + * factor of 99.9% to 100.1%. If these conditions are satisfied, the image is + * drawn at 100% scale, snapped to the nearest pixel. Internally, this + * setting allows the image to be drawn as fast as possible by using the + * vector renderer. + */ + static AUTO: string; + /** + * A constant value used in the pixelSnapping property of a + * Bitmap object to specify that no pixel snapping occurs. + */ + static NEVER: string; + } + export = PixelSnapping; + +} +declare module "awayjs-core/lib/core/base/SpreadMethod" { + /** + * The SpreadMethod class provides values for the spreadMethod + * parameter in the beginGradientFill() and + * lineGradientStyle() methods of the Graphics class. + * + *

The following example shows the same gradient fill using various spread + * methods:

+ */ + class SpreadMethod { + /** + * Specifies that the gradient use the pad spread method. + */ + static PAD: string; + /** + * Specifies that the gradient use the reflect spread method. + */ + static REFLECT: string; + /** + * Specifies that the gradient use the repeat spread method. + */ + static REPEAT: string; + } + export = SpreadMethod; + +} +declare module "awayjs-core/lib/core/base/SubGeometryBase" { + import Geometry = require("awayjs-core/lib/core/base/Geometry"); + import ISubMeshClass = require("awayjs-core/lib/core/base/ISubMeshClass"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + /** + * @class away.base.TriangleSubGeometry + */ + class SubGeometryBase extends NamedAssetBase { + static VERTEX_DATA: string; + public _pStrideOffsetDirty: boolean; + public _pIndices: number[]; + public _pVertices: number[]; + private _numIndices; + private _numTriangles; + public _pNumVertices: number; + public _pConcatenateArrays: boolean; + private _indicesUpdated; + public _pStride: Object; + public _pOffset: Object; + public _pUpdateStrideOffset(): void; + public _pSubMeshClass: ISubMeshClass; + public subMeshClass : ISubMeshClass; + /** + * + */ + public concatenateArrays : boolean; + /** + * The raw index data that define the faces. + */ + public indices : number[]; + /** + * + */ + public vertices : number[]; + /** + * The total amount of triangles in the TriangleSubGeometry. + */ + public numTriangles : number; + public numVertices : number; + /** + * + */ + constructor(concatenatedArrays: boolean); + /** + * + */ + public getStride(dataType: string): any; + /** + * + */ + public getOffset(dataType: string): any; + public updateVertices(): void; + /** + * + */ + public dispose(): void; + /** + * Updates the face indices of the TriangleSubGeometry. + * + * @param indices The face indices to upload. + */ + public updateIndices(indices: number[]): void; + /** + * @protected + */ + public pInvalidateBounds(): void; + /** + * The Geometry object that 'owns' this TriangleSubGeometry object. + * + * @private + */ + public parentGeometry: Geometry; + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + public clone(): SubGeometryBase; + public applyTransformation(transform: Matrix3D): void; + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + public scale(scale: number): void; + public scaleUV(scaleU?: number, scaleV?: number): void; + public getBoundingPositions(): number[]; + private notifyIndicesUpdate(); + public _pNotifyVerticesUpdate(): void; + } + export = SubGeometryBase; + +} +declare module "awayjs-core/lib/core/base/SubMeshBase" { + import IAnimator = require("awayjs-core/lib/animators/IAnimator"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import Mesh = require("awayjs-core/lib/entities/Mesh"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * SubMeshBase wraps a TriangleSubGeometry as a scene graph instantiation. A SubMeshBase is owned by a Mesh object. + * + * + * @see away.base.TriangleSubGeometry + * @see away.entities.Mesh + * + * @class away.base.SubMeshBase + */ + class SubMeshBase extends NamedAssetBase { + public _pParentMesh: Mesh; + public _uvTransform: UVTransform; + public _iIndex: number; + public _material: MaterialBase; + private _renderables; + /** + * The animator object that provides the state for the TriangleSubMesh's animation. + */ + public animator : IAnimator; + /** + * The material used to render the current TriangleSubMesh. If set to null, its parent Mesh's material will be used instead. + */ + public material : MaterialBase; + /** + * The scene transform object that transforms from model to world space. + */ + public sceneTransform : Matrix3D; + /** + * The entity that that initially provided the IRenderable to the render pipeline (ie: the owning Mesh object). + */ + public parentMesh : Mesh; + /** + * + */ + public uvTransform : UVTransform; + /** + * Creates a new SubMeshBase object + */ + constructor(); + /** + * + */ + public dispose(): void; + /** + * + * @param camera + * @returns {away.geom.Matrix3D} + */ + public getRenderSceneTransform(camera: Camera): Matrix3D; + public _iAddRenderable(renderable: IRenderable): IRenderable; + public _iRemoveRenderable(renderable: IRenderable): IRenderable; + public _iInvalidateRenderableGeometry(): void; + public _iCollectRenderable(renderer: IRenderer): void; + public _iGetExplicitMaterial(): MaterialBase; + } + export = SubMeshBase; + +} +declare module "awayjs-core/lib/core/base/TriangleCulling" { + /** + * Defines codes for culling algorithms that determine which triangles not to + * render when drawing triangle paths. + * + *

The terms POSITIVE and NEGATIVE refer to the + * sign of a triangle's normal along the z-axis. The normal is a 3D vector + * that is perpendicular to the surface of the triangle.

+ * + *

A triangle whose vertices 0, 1, and 2 are arranged in a clockwise order + * has a positive normal value. That is, its normal points in a positive + * z-axis direction, away from the current view point. When the + * TriangleCulling.POSITIVE algorithm is used, triangles with + * positive normals are not rendered. Another term for this is backface + * culling.

+ * + *

A triangle whose vertices are arranged in a counter-clockwise order has + * a negative normal value. That is, its normal points in a negative z-axis + * direction, toward the current view point. When the + * TriangleCulling.NEGATIVE algorithm is used, triangles with + * negative normals will not be rendered.

+ */ + class TriangleCulling { + /** + * Specifies culling of all triangles facing toward the current view point. + */ + static NEGATIVE: string; + /** + * Specifies no culling. All triangles in the path are rendered. + */ + static NONE: string; + /** + * Specifies culling of all triangles facing away from the current view + * point. This is also known as backface culling. + */ + static POSITIVE: string; + } + export = TriangleCulling; + +} +declare module "awayjs-core/lib/core/base/TriangleSubGeometry" { + import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + /** + * @class away.base.TriangleSubGeometry + */ + class TriangleSubGeometry extends SubGeometryBase { + static POSITION_DATA: string; + static NORMAL_DATA: string; + static TANGENT_DATA: string; + static UV_DATA: string; + static SECONDARY_UV_DATA: string; + static JOINT_INDEX_DATA: string; + static JOINT_WEIGHT_DATA: string; + static POSITION_FORMAT: string; + static NORMAL_FORMAT: string; + static TANGENT_FORMAT: string; + static UV_FORMAT: string; + static SECONDARY_UV_FORMAT: string; + private _positionsDirty; + private _faceNormalsDirty; + private _faceTangentsDirty; + private _vertexNormalsDirty; + private _vertexTangentsDirty; + private _uvsDirty; + private _secondaryUVsDirty; + private _jointIndicesDirty; + private _jointWeightsDirty; + private _positions; + private _vertexNormals; + private _vertexTangents; + private _uvs; + private _secondaryUVs; + private _jointIndices; + private _jointWeights; + private _useCondensedIndices; + private _condensedJointIndices; + private _condensedIndexLookUp; + private _numCondensedJoints; + private _jointsPerVertex; + private _concatenateArrays; + private _autoDeriveNormals; + private _autoDeriveTangents; + private _autoDeriveUVs; + private _useFaceWeights; + private _faceNormals; + private _faceTangents; + private _faceWeights; + private _scaleU; + private _scaleV; + private _positionsUpdated; + private _normalsUpdated; + private _tangentsUpdated; + private _uvsUpdated; + private _secondaryUVsUpdated; + private _jointIndicesUpdated; + private _jointWeightsUpdated; + /** + * + */ + public scaleU : number; + /** + * + */ + public scaleV : number; + /** + * Offers the option of enabling GPU accelerated animation on skeletons larger than 32 joints + * by condensing the number of joint index values required per mesh. Only applicable to + * skeleton animations that utilise more than one mesh object. Defaults to false. + */ + public useCondensedIndices : boolean; + public _pUpdateStrideOffset(): void; + /** + * + */ + public jointsPerVertex : number; + /** + * Defines whether a UV buffer should be automatically generated to contain dummy UV coordinates. + * Set to true if a geometry lacks UV data but uses a material that requires it, or leave as false + * in cases where UV data is explicitly defined or the material does not require UV data. + */ + public autoDeriveUVs : boolean; + /** + * True if the vertex normals should be derived from the geometry, false if the vertex normals are set + * explicitly. + */ + public autoDeriveNormals : boolean; + /** + * True if the vertex tangents should be derived from the geometry, false if the vertex normals are set + * explicitly. + */ + public autoDeriveTangents : boolean; + /** + * + */ + public vertices : number[]; + /** + * + */ + public positions : number[]; + /** + * + */ + public vertexNormals : number[]; + /** + * + */ + public vertexTangents : number[]; + /** + * The raw data of the face normals, in the same order as the faces are listed in the index list. + */ + public faceNormals : number[]; + /** + * The raw data of the face tangets, in the same order as the faces are listed in the index list. + */ + public faceTangents : number[]; + /** + * + */ + public uvs : number[]; + /** + * + */ + public secondaryUVs : number[]; + /** + * + */ + public jointIndices : number[]; + /** + * + */ + public jointWeights : number[]; + /** + * Indicates whether or not to take the size of faces into account when auto-deriving vertex normals and tangents. + */ + public useFaceWeights : boolean; + public numCondensedJoints : number; + public condensedIndexLookUp : number[]; + /** + * + */ + constructor(concatenatedArrays: boolean); + public getBoundingPositions(): number[]; + /** + * + */ + public updatePositions(values: number[]): void; + /** + * Updates the vertex normals based on the geometry. + */ + public updateVertexNormals(values: number[]): void; + /** + * Updates the vertex tangents based on the geometry. + */ + public updateVertexTangents(values: number[]): void; + /** + * Updates the uvs based on the geometry. + */ + public updateUVs(values: number[]): void; + /** + * Updates the secondary uvs based on the geometry. + */ + public updateSecondaryUVs(values: number[]): void; + /** + * Updates the joint indices + */ + public updateJointIndices(values: number[]): void; + /** + * Updates the joint weights. + */ + public updateJointWeights(values: number[]): void; + /** + * + */ + public dispose(): void; + /** + * Updates the face indices of the TriangleSubGeometry. + * + * @param indices The face indices to upload. + */ + public updateIndices(indices: number[]): void; + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + public clone(): TriangleSubGeometry; + public scaleUV(scaleU?: number, scaleV?: number): void; + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + public scale(scale: number): void; + public applyTransformation(transform: Matrix3D): void; + /** + * Updates the tangents for each face. + */ + private updateFaceTangents(); + /** + * Updates the normals for each face. + */ + private updateFaceNormals(); + public _pNotifyVerticesUpdate(): void; + private notifyPositionsUpdate(); + private notifyNormalsUpdate(); + private notifyTangentsUpdate(); + private notifyUVsUpdate(); + private notifySecondaryUVsUpdate(); + private notifyJointIndicesUpdate(); + private notifyJointWeightsUpdate(); + } + export = TriangleSubGeometry; + +} +declare module "awayjs-core/lib/core/base/TriangleSubMesh" { + import ISubMesh = require("awayjs-core/lib/core/base/ISubMesh"); + import SubMeshBase = require("awayjs-core/lib/core/base/SubMeshBase"); + import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Mesh = require("awayjs-core/lib/entities/Mesh"); + import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + /** + * TriangleSubMesh wraps a TriangleSubGeometry as a scene graph instantiation. A TriangleSubMesh is owned by a Mesh object. + * + * + * @see away.base.TriangleSubGeometry + * @see away.entities.Mesh + * + * @class away.base.TriangleSubMesh + */ + class TriangleSubMesh extends SubMeshBase implements ISubMesh { + private _subGeometry; + /** + * + */ + public assetType : string; + /** + * The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. + */ + public subGeometry : TriangleSubGeometry; + /** + * Creates a new TriangleSubMesh object + * @param subGeometry The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. + * @param parentMesh The Mesh object to which this TriangleSubMesh belongs. + * @param material An optional material used to render this TriangleSubMesh. + */ + constructor(subGeometry: TriangleSubGeometry, parentMesh: Mesh, material?: MaterialBase); + /** + * + */ + public dispose(): void; + public _iCollectRenderable(renderer: IRenderer): void; + } + export = TriangleSubMesh; + +} +declare module "awayjs-core/lib/core/geom/Box" { + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + /** + * A Box object is an area defined by its position, as indicated by its + * top-left-front corner point(x, y, z) and by its width, + * height and depth. + * + * + *

The x, y, z, width, + * height depth properties of the Box class are + * independent of each other; changing the value of one property has no effect + * on the others. However, the right, bottom and + * back properties are integrally related to those six + * properties. For example, if you change the value of the right + * property, the value of the width property changes; if you + * change the bottom property, the value of the + * height property changes.

+ * + *

The following methods and properties use Box objects:

+ * + *
    + *
  • The bounds property of the DisplayObject class
  • + *
+ * + *

You can use the new Box() constructor to create a + * Box object.

+ * + *

Note: The Box class does not define a cubic Shape + * display object. + */ + class Box { + private _size; + private _bottomRightBack; + private _topLeftFront; + /** + * The height of the box, in pixels. Changing the height value + * of a Box object has no effect on the x, y, + * z, depth and width properties. + */ + public height: number; + /** + * The width of the box, in pixels. Changing the width value + * of a Box object has no effect on the x, y, + * z, depth and height properties. + */ + public width: number; + /** + * The deoth of the box, in pixels. Changing the depth value + * of a Box object has no effect on the x, y, + * z, width and height properties. + */ + public depth: number; + /** + * The x coordinate of the top-left-front corner of the box. + * Changing the value of the x property of a Box object has no + * effect on the y, z, width, + * height and depth properties. + * + *

The value of the x property is equal to the value of the + * left property.

+ */ + public x: number; + /** + * The y coordinate of the top-left-front corner of the box. + * Changing the value of the y property of a Box object has no + * effect on the x, z, width, + * height and depth properties. + * + *

The value of the y property is equal to the value of the + * top property.

+ */ + public y: number; + /** + * The y coordinate of the top-left-front corner of the box. + * Changing the value of the z property of a Box object has no + * effect on the x, y, width, + * height and depth properties. + * + *

The value of the z property is equal to the value of the + * front property.

+ */ + public z: number; + /** + * The sum of the z and height properties. + */ + public back : number; + /** + * The sum of the y and height properties. + */ + public bottom : number; + /** + * The location of the Box object's bottom-right corner, determined by the + * values of the right and bottom properties. + */ + public bottomRightBack : Vector3D; + /** + * The z coordinate of the top-left-front corner of the box. Changing + * the front property of a Box object has no effect on the + * x, y, width and height + * properties. However it does affect the depth property, + * whereas changing the z value does not affect the + * depth property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + public front : number; + /** + * The x coordinate of the top-left corner of the box. Changing the + * left property of a Box object has no effect on the + * y and height properties. However it does affect + * the width property, whereas changing the x value + * does not affect the width property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + public left : number; + /** + * The sum of the x and width properties. + */ + public right : number; + /** + * The size of the Box object, expressed as a Vector3D object with the + * values of the width, height and + * depth properties. + */ + public size : Vector3D; + /** + * The y coordinate of the top-left-front corner of the box. Changing + * the top property of a Box object has no effect on the + * x and width properties. However it does affect + * the height property, whereas changing the y + * value does not affect the height property. + * + *

The value of the top property is equal to the value of the + * y property.

+ */ + public top : number; + /** + * The location of the Box object's top-left-front corner, determined by the + * x, y and z coordinates of the point. + */ + public topLeftFront : Vector3D; + /** + * Creates a new Box object with the top-left-front corner specified by the + * x, y and z parameters and with the + * specified width, height and depth + * parameters. If you call this public without parameters, a box with + * x, y, z, width, + * height and depth properties set to 0 is created. + * + * @param x The x coordinate of the top-left-front corner of the + * box. + * @param y The y coordinate of the top-left-front corner of the + * box. + * @param z The z coordinate of the top-left-front corner of the + * box. + * @param width The width of the box, in pixels. + * @param height The height of the box, in pixels. + * @param depth The depth of the box, in pixels. + */ + constructor(x?: number, y?: number, z?: number, width?: number, height?: number, depth?: number); + /** + * Returns a new Box object with the same values for the x, + * y, z, width, height + * and depth properties as the original Box object. + * + * @return A new Box object with the same values for the x, + * y, z, width, + * height and depth properties as the + * original Box object. + */ + public clone(): Box; + /** + * Determines whether the specified position is contained within the cubic + * region defined by this Box object. + * + * @param x The x coordinate(horizontal component) of the position. + * @param y The y coordinate(vertical component) of the position. + * @param z The z coordinate(longitudinal component) of the position. + * @return A value of true if the Box object contains the + * specified position; otherwise false. + */ + public contains(x: number, y: number, z: number): boolean; + /** + * Determines whether the specified position is contained within the cubic + * region defined by this Box object. This method is similar to the + * Box.contains() method, except that it takes a Vector3D + * object as a parameter. + * + * @param position The position, as represented by its x, y and + * z coordinates. + * @return A value of true if the Box object contains the + * specified position; otherwise false. + */ + public containsPoint(position: Vector3D): boolean; + /** + * Determines whether the Box object specified by the box + * parameter is contained within this Box object. A Box object is said to + * contain another if the second Box object falls entirely within the + * boundaries of the first. + * + * @param box The Box object being checked. + * @return A value of true if the Box object that you specify + * is contained by this Box object; otherwise false. + */ + public containsRect(box: Box): boolean; + /** + * Copies all of box data from the source Box object into the calling + * Box object. + * + * @param sourceBox The Box object from which to copy the data. + */ + public copyFrom(sourceBox: Box): void; + /** + * Determines whether the object specified in the toCompare + * parameter is equal to this Box object. This method compares the + * x, y, z, width, + * height and depth properties of an object against + * the same properties of this Box object. + * + * @param toCompare The box to compare to this Box object. + * @return A value of true if the object has exactly the same + * values for the x, y, z, + * width, height and depth + * properties as this Box object; otherwise false. + */ + public equals(toCompare: Box): boolean; + /** + * Increases the size of the Box object by the specified amounts, in + * pixels. The center point of the Box object stays the same, and its + * size increases to the left and right by the dx value, to + * the top and the bottom by the dy value, and to + * the front and the back by the dz value. + * + * @param dx The value to be added to the left and the right of the Box + * object. The following equation is used to calculate the new + * width and position of the box: + * @param dy The value to be added to the top and the bottom of the Box + * object. The following equation is used to calculate the new + * height and position of the box: + * @param dz The value to be added to the front and the back of the Box + * object. The following equation is used to calculate the new + * depth and position of the box: + */ + public inflate(dx: number, dy: number, dz: number): void; + /** + * Increases the size of the Box object. This method is similar to the + * Box.inflate() method except it takes a Vector3D object as + * a parameter. + * + *

The following two code examples give the same result:

+ * + * @param delta The x property of this Vector3D object is used to + * increase the horizontal dimension of the Box object. + * The y property is used to increase the vertical + * dimension of the Box object. + * The z property is used to increase the + * longitudinal dimension of the Box object. + */ + public inflatePoint(delta: Vector3D): void; + /** + * If the Box object specified in the toIntersect parameter + * intersects with this Box object, returns the area of intersection + * as a Box object. If the boxes do not intersect, this method returns an + * empty Box object with its properties set to 0. + * + * @param toIntersect The Box object to compare against to see if it + * intersects with this Box object. + * @return A Box object that equals the area of intersection. If the + * boxes do not intersect, this method returns an empty Box + * object; that is, a box with its x, y, + * z, width, height, and + * depth properties set to 0. + */ + public intersection(toIntersect: Box): Box; + /** + * Determines whether the object specified in the toIntersect + * parameter intersects with this Box object. This method checks the + * x, y, z, width, + * height, and depth properties of the specified + * Box object to see if it intersects with this Box object. + * + * @param toIntersect The Box object to compare against this Box object. + * @return A value of true if the specified object intersects + * with this Box object; otherwise false. + */ + public intersects(toIntersect: Box): boolean; + /** + * Determines whether or not this Box object is empty. + * + * @return A value of true if the Box object's width, height or + * depth is less than or equal to 0; otherwise false. + */ + public isEmpty(): boolean; + /** + * Adjusts the location of the Box object, as determined by its + * top-left-front corner, by the specified amounts. + * + * @param dx Moves the x value of the Box object by this amount. + * @param dy Moves the y value of the Box object by this amount. + * @param dz Moves the z value of the Box object by this amount. + */ + public offset(dx: number, dy: number, dz: number): void; + /** + * Adjusts the location of the Box object using a Vector3D object as a + * parameter. This method is similar to the Box.offset() + * method, except that it takes a Vector3D object as a parameter. + * + * @param position A Vector3D object to use to offset this Box object. + */ + public offsetPosition(position: Vector3D): void; + /** + * Sets all of the Box object's properties to 0. A Box object is empty if its + * width, height or depth is less than or equal to 0. + * + *

This method sets the values of the x, y, + * z, width, height, and + * depth properties to 0.

+ * + */ + public setEmpty(): void; + /** + * Sets the members of Box to the specified values + * + * @param xa The x coordinate of the top-left-front corner of the + * box. + * @param ya The y coordinate of the top-left-front corner of the + * box. + * @param yz The z coordinate of the top-left-front corner of the + * box. + * @param widtha The width of the box, in pixels. + * @param heighta The height of the box, in pixels. + * @param deptha The depth of the box, in pixels. + */ + public setTo(xa: number, ya: number, za: number, widtha: number, heighta: number, deptha: number): void; + /** + * Builds and returns a string that lists the horizontal, vertical and + * longitudinal positions and the width, height and depth of the Box object. + * + * @return A string listing the value of each of the following properties of + * the Box object: x, y, z, + * width, height, and depth. + */ + public toString(): string; + /** + * Adds two boxes together to create a new Box object, by filling + * in the horizontal, vertical and longitudinal space between the two boxes. + * + *

Note: The union() method ignores boxes with + * 0 as the height, width or depth value, such as: var + * box2:Box = new Box(300,300,300,50,50,0);

+ * + * @param toUnion A Box object to add to this Box object. + * @return A new Box object that is the union of the two boxes. + */ + public union(toUnion: Box): Box; + } + export = Box; + +} +declare module "awayjs-core/lib/core/geom/ColorTransform" { + /** + * The ColorTransform class lets you adjust the color values in a display + * object. The color adjustment or color transformation can be applied + * to all four channels: red, green, blue, and alpha transparency. + * + *

When a ColorTransform object is applied to a display object, a new value + * for each color channel is calculated like this:

+ * + *
    + *
  • New red value = (old red value * redMultiplier) + + * redOffset
  • + *
  • New green value = (old green value * greenMultiplier) + + * greenOffset
  • + *
  • New blue value = (old blue value * blueMultiplier) + + * blueOffset
  • + *
  • New alpha value = (old alpha value * alphaMultiplier) + + * alphaOffset
  • + *
+ * + *

If any of the color channel values is greater than 255 after the + * calculation, it is set to 255. If it is less than 0, it is set to 0.

+ * + *

You can use ColorTransform objects in the following ways:

+ * + *
    + *
  • In the colorTransform parameter of the + * colorTransform() method of the BitmapData class
  • + *
  • As the colorTransform property of a Transform object + * (which can be used as the transform property of a display + * object)
  • + *
+ * + *

You must use the new ColorTransform() constructor to create + * a ColorTransform object before you can call the methods of the + * ColorTransform object.

+ * + *

Color transformations do not apply to the background color of a movie + * clip(such as a loaded SWF object). They apply only to graphics and symbols + * that are attached to the movie clip.

+ */ + class ColorTransform { + /** + * A decimal value that is multiplied with the alpha transparency channel + * value. + * + *

If you set the alpha transparency value of a display object directly by + * using the alpha property of the DisplayObject instance, it + * affects the value of the alphaMultiplier property of that + * display object's transform.colorTransform property.

+ */ + public alphaMultiplier: number; + /** + * A number from -255 to 255 that is added to the alpha transparency channel + * value after it has been multiplied by the alphaMultiplier + * value. + */ + public alphaOffset: number; + /** + * A decimal value that is multiplied with the blue channel value. + */ + public blueMultiplier: number; + /** + * A number from -255 to 255 that is added to the blue channel value after it + * has been multiplied by the blueMultiplier value. + */ + public blueOffset: number; + /** + * A decimal value that is multiplied with the green channel value. + */ + public greenMultiplier: number; + /** + * A number from -255 to 255 that is added to the green channel value after + * it has been multiplied by the greenMultiplier value. + */ + public greenOffset: number; + /** + * A decimal value that is multiplied with the red channel value. + */ + public redMultiplier: number; + /** + * A number from -255 to 255 that is added to the red channel value after it + * has been multiplied by the redMultiplier value. + */ + public redOffset: number; + /** + * The RGB color value for a ColorTransform object. + * + *

When you set this property, it changes the three color offset values + * (redOffset, greenOffset, and + * blueOffset) accordingly, and it sets the three color + * multiplier values(redMultiplier, + * greenMultiplier, and blueMultiplier) to 0. The + * alpha transparency multiplier and offset values do not change.

+ * + *

When you pass a value for this property, use the format + * 0xRRGGBB. RR, GG, and BB each consist of two + * hexadecimal digits that specify the offset of each color component. The 0x + * tells the ActionScript compiler that the number is a hexadecimal + * value.

+ */ + public color : number; + /** + * Creates a ColorTransform object for a display object with the specified + * color channel values and alpha values. + * + * @param redMultiplier The value for the red multiplier, in the range from + * 0 to 1. + * @param greenMultiplier The value for the green multiplier, in the range + * from 0 to 1. + * @param blueMultiplier The value for the blue multiplier, in the range + * from 0 to 1. + * @param alphaMultiplier The value for the alpha transparency multiplier, in + * the range from 0 to 1. + * @param redOffset The offset value for the red color channel, in the + * range from -255 to 255. + * @param greenOffset The offset value for the green color channel, in + * the range from -255 to 255. + * @param blueOffset The offset for the blue color channel value, in the + * range from -255 to 255. + * @param alphaOffset The offset for alpha transparency channel value, in + * the range from -255 to 255. + */ + constructor(redMultiplier?: number, greenMultiplier?: number, blueMultiplier?: number, alphaMultiplier?: number, redOffset?: number, greenOffset?: number, blueOffset?: number, alphaOffset?: number); + /** + * Concatenates the ColorTranform object specified by the second + * parameter with the current ColorTransform object and sets the current + * object as the result, which is an additive combination of the two color + * transformations. When you apply the concatenated ColorTransform object, + * the effect is the same as applying the second color + * transformation after the original color transformation. + * + * @param second The ColorTransform object to be combined with the current + * ColorTransform object. + */ + public concat(second: ColorTransform): void; + } + export = ColorTransform; + +} +declare module "awayjs-core/lib/core/geom/MathConsts" { + /** + * MathConsts provides some commonly used mathematical constants + */ + class MathConsts { + /** + * The amount to multiply with when converting radians to degrees. + */ + static RADIANS_TO_DEGREES: number; + /** + * The amount to multiply with when converting degrees to radians. + */ + static DEGREES_TO_RADIANS: number; + } + export = MathConsts; + +} +declare module "awayjs-core/lib/core/geom/Matrix" { + import Point = require("awayjs-core/lib/core/geom/Point"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + /** + * The Matrix class represents a transformation matrix that determines how to + * map points from one coordinate space to another. You can perform various + * graphical transformations on a display object by setting the properties of + * a Matrix object, applying that Matrix object to the matrix + * property of a Transform object, and then applying that Transform object as + * the transform property of the display object. These + * transformation functions include translation(x and y + * repositioning), rotation, scaling, and skewing. + * + *

Together these types of transformations are known as affine + * transformations. Affine transformations preserve the straightness of + * lines while transforming, so that parallel lines stay parallel.

+ * + *

To apply a transformation matrix to a display object, you create a + * Transform object, set its matrix property to the + * transformation matrix, and then set the transform property of + * the display object to the Transform object. Matrix objects are also used as + * parameters of some methods, such as the following:

+ * + *
    + *
  • The draw() method of a BitmapData object
  • + *
  • The beginBitmapFill() method, + * beginGradientFill() method, or + * lineGradientStyle() method of a Graphics object
  • + *
+ * + *

A transformation matrix object is a 3 x 3 matrix with the following + * contents:

+ * + *

In traditional transformation matrixes, the u, + * v, and w properties provide extra capabilities. + * The Matrix class can only operate in two-dimensional space, so it always + * assumes that the property values u and v are 0.0, + * and that the property value w is 1.0. The effective values of + * the matrix are as follows:

+ * + *

You can get and set the values of all six of the other properties in a + * Matrix object: a, b, c, + * d, tx, and ty.

+ * + *

The Matrix class supports the four major types of transformations: + * translation, scaling, rotation, and skewing. You can set three of these + * transformations by using specialized methods, as described in the following + * table:

+ * + *

Each transformation function alters the current matrix properties so + * that you can effectively combine multiple transformations. To do this, you + * call more than one transformation function before applying the matrix to + * its display object target(by using the transform property of + * that display object).

+ * + *

Use the new Matrix() constructor to create a Matrix object + * before you can call the methods of the Matrix object.

+ */ + class Matrix { + /** + * The value that affects the positioning of pixels along the x axis + * when scaling or rotating an image. + */ + public a: number; + /** + * The value that affects the positioning of pixels along the y axis + * when rotating or skewing an image. + */ + public b: number; + /** + * The value that affects the positioning of pixels along the x axis + * when rotating or skewing an image. + */ + public c: number; + /** + * The value that affects the positioning of pixels along the y axis + * when scaling or rotating an image. + */ + public d: number; + /** + * The distance by which to translate each point along the x axis. + */ + public tx: number; + /** + * The distance by which to translate each point along the y axis. + */ + public ty: number; + /** + * Creates a new Matrix object with the specified parameters. In matrix + * notation, the properties are organized like this: + * + *

If you do not provide any parameters to the new Matrix() + * constructor, it creates an identity matrix with the following + * values:

+ * + *

In matrix notation, the identity matrix looks like this:

+ * + * @param a The value that affects the positioning of pixels along the + * x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the + * y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the + * x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the + * y axis when scaling or rotating an image.. + * @param tx The distance by which to translate each point along the x + * axis. + * @param ty The distance by which to translate each point along the y + * axis. + */ + constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); + /** + * Returns a new Matrix object that is a clone of this matrix, with an exact + * copy of the contained object. + * + * @return A Matrix object. + */ + public clone(): Matrix; + /** + * Concatenates a matrix with the current matrix, effectively combining the + * geometric effects of the two. In mathematical terms, concatenating two + * matrixes is the same as combining them using matrix multiplication. + * + *

For example, if matrix m1 scales an object by a factor of + * four, and matrix m2 rotates an object by 1.5707963267949 + * radians(Math.PI/2), then m1.concat(m2) + * transforms m1 into a matrix that scales an object by a factor + * of four and rotates the object by Math.PI/2 radians.

+ * + *

This method replaces the source matrix with the concatenated matrix. If + * you want to concatenate two matrixes without altering either of the two + * source matrixes, first copy the source matrix by using the + * clone() method, as shown in the Class Examples section.

+ * + * @param matrix The matrix to be concatenated to the source matrix. + */ + public concat(matrix: Matrix): void; + /** + * Copies a Vector3D object into specific column of the calling Matrix3D + * object. + * + * @param column The column from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + public copyColumnFrom(column: number, vector3D: Vector3D): void; + /** + * Copies specific column of the calling Matrix object into the Vector3D + * object. The w element of the Vector3D object will not be changed. + * + * @param column The column from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + public copyColumnTo(column: number, vector3D: Vector3D): void; + /** + * Copies all of the matrix data from the source Point object into the + * calling Matrix object. + * + * @param sourceMatrix The Matrix object from which to copy the data. + */ + public copyFrom(sourceMatrix: Matrix): void; + /** + * Copies a Vector3D object into specific row of the calling Matrix object. + * + * @param row The row from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + public copyRowFrom(row: number, vector3D: Vector3D): void; + /** + * Copies specific row of the calling Matrix object into the Vector3D object. + * The w element of the Vector3D object will not be changed. + * + * @param row The row from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + public copyRowTo(row: number, vector3D: Vector3D): void; + /** + * Includes parameters for scaling, rotation, and translation. When applied + * to a matrix it sets the matrix's values based on those parameters. + * + *

Using the createBox() method lets you obtain the same + * matrix as you would if you applied the identity(), + * rotate(), scale(), and translate() + * methods in succession. For example, mat1.createBox(2,2,Math.PI/4, + * 100, 100) has the same effect as the following:

+ * + * @param scaleX The factor by which to scale horizontally. + * @param scaleY The factor by which scale vertically. + * @param rotation The amount to rotate, in radians. + * @param tx The number of pixels to translate(move) to the right + * along the x axis. + * @param ty The number of pixels to translate(move) down along the + * y axis. + */ + public createBox(scaleX: number, scaleY: number, rotation?: number, tx?: number, ty?: number): void; + /** + * Creates the specific style of matrix expected by the + * beginGradientFill() and lineGradientStyle() + * methods of the Graphics class. Width and height are scaled to a + * scaleX/scaleY pair and the + * tx/ty values are offset by half the width and + * height. + * + *

For example, consider a gradient with the following + * characteristics:

+ * + *
    + *
  • GradientType.LINEAR
  • + *
  • Two colors, green and blue, with the ratios array set to [0, + * 255]
  • + *
  • SpreadMethod.PAD
  • + *
  • InterpolationMethod.LINEAR_RGB
  • + *
+ * + *

The following illustrations show gradients in which the matrix was + * defined using the createGradientBox() method with different + * parameter settings:

+ * + * @param width The width of the gradient box. + * @param height The height of the gradient box. + * @param rotation The amount to rotate, in radians. + * @param tx The distance, in pixels, to translate to the right along + * the x axis. This value is offset by half of the + * width parameter. + * @param ty The distance, in pixels, to translate down along the + * y axis. This value is offset by half of the + * height parameter. + */ + public createGradientBox(width: number, height: number, rotation?: number, tx?: number, ty?: number): void; + /** + * Given a point in the pretransform coordinate space, returns the + * coordinates of that point after the transformation occurs. Unlike the + * standard transformation applied using the transformPoint() + * method, the deltaTransformPoint() method's transformation + * does not consider the translation parameters tx and + * ty. + * + * @param point The point for which you want to get the result of the matrix + * transformation. + * @return The point resulting from applying the matrix transformation. + */ + public deltaTransformPoint(point: Point): Point; + /** + * Sets each matrix property to a value that causes a null transformation. An + * object transformed by applying an identity matrix will be identical to the + * original. + * + *

After calling the identity() method, the resulting matrix + * has the following properties: a=1, b=0, + * c=0, d=1, tx=0, + * ty=0.

+ * + *

In matrix notation, the identity matrix looks like this:

+ * + */ + public identity(): void; + /** + * Performs the opposite transformation of the original matrix. You can apply + * an inverted matrix to an object to undo the transformation performed when + * applying the original matrix. + */ + public invert(): void; + /** + * Returns a new Matrix object that is a clone of this matrix, with an exact + * copy of the contained object. + * + * @param matrix The matrix for which you want to get the result of the matrix + * transformation. + * @return A Matrix object. + */ + public multiply(matrix: Matrix): Matrix; + /** + * Applies a rotation transformation to the Matrix object. + * + *

The rotate() method alters the a, + * b, c, and d properties of the + * Matrix object. In matrix notation, this is the same as concatenating the + * current matrix with the following:

+ * + * @param angle The rotation angle in radians. + */ + public rotate(angle: number): void; + /** + * Applies a scaling transformation to the matrix. The x axis is + * multiplied by sx, and the y axis it is multiplied by + * sy. + * + *

The scale() method alters the a and + * d properties of the Matrix object. In matrix notation, this + * is the same as concatenating the current matrix with the following + * matrix:

+ * + * @param sx A multiplier used to scale the object along the x axis. + * @param sy A multiplier used to scale the object along the y axis. + */ + public scale(sx: number, sy: number): void; + /** + * Sets the members of Matrix to the specified values. + * + * @param a The value that affects the positioning of pixels along the + * x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the + * y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the + * x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the + * y axis when scaling or rotating an image.. + * @param tx The distance by which to translate each point along the x + * axis. + * @param ty The distance by which to translate each point along the y + * axis. + */ + public setTo(a: number, b: number, c: number, d: number, tx: number, ty: number): void; + /** + * Returns a text value listing the properties of the Matrix object. + * + * @return A string containing the values of the properties of the Matrix + * object: a, b, c, + * d, tx, and ty. + */ + public toString(): string; + /** + * Returns the result of applying the geometric transformation represented by + * the Matrix object to the specified point. + * + * @param point The point for which you want to get the result of the Matrix + * transformation. + * @return The point resulting from applying the Matrix transformation. + */ + public transformPoint(point: Point): Point; + /** + * Translates the matrix along the x and y axes, as specified + * by the dx and dy parameters. + * + * @param dx The amount of movement along the x axis to the right, in + * pixels. + * @param dy The amount of movement down along the y axis, in pixels. + */ + public translate(dx: number, dy: number): void; + } + export = Matrix; + +} +declare module "awayjs-core/lib/core/geom/Matrix3D" { + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + class Matrix3D { + /** + * A Vector of 16 Numbers, where every four elements is a column of a 4x4 matrix. + * + *

An exception is thrown if the rawData property is set to a matrix that is not invertible. The Matrix3D + * object must be invertible. If a non-invertible matrix is needed, create a subclass of the Matrix3D object.

+ */ + public rawData: number[]; + /** + * Creates a Matrix3D object. + */ + constructor(v?: number[]); + /** + * Appends the matrix by multiplying another Matrix3D object by the current Matrix3D object. + */ + public append(lhs: Matrix3D): void; + /** + * Appends an incremental rotation to a Matrix3D object. + */ + public appendRotation(degrees: number, axis: Vector3D): void; + /** + * Appends an incremental scale change along the x, y, and z axes to a Matrix3D object. + */ + public appendScale(xScale: number, yScale: number, zScale: number): void; + /** + * Appends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. + */ + public appendTranslation(x: number, y: number, z: number): void; + /** + * Returns a new Matrix3D object that is an exact copy of the current Matrix3D object. + */ + public clone(): Matrix3D; + /** + * Copies a Vector3D object into specific column of the calling Matrix3D object. + */ + public copyColumnFrom(column: number, vector3D: Vector3D): void; + /** + * Copies specific column of the calling Matrix3D object into the Vector3D object. + */ + public copyColumnTo(column: number, vector3D: Vector3D): void; + /** + * Copies all of the matrix data from the source Matrix3D object into the calling Matrix3D object. + */ + public copyFrom(sourceMatrix3D: Matrix3D): void; + public copyRawDataFrom(vector: number[], index?: number, transpose?: boolean): void; + public copyRawDataTo(vector: number[], index?: number, transpose?: boolean): void; + /** + * Copies a Vector3D object into specific row of the calling Matrix3D object. + */ + public copyRowFrom(row: number, vector3D: Vector3D): void; + /** + * Copies specific row of the calling Matrix3D object into the Vector3D object. + */ + public copyRowTo(row: number, vector3D: Vector3D): void; + /** + * Copies this Matrix3D object into a destination Matrix3D object. + */ + public copyToMatrix3D(dest: Matrix3D): void; + /** + * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector3D objects. + */ + public decompose(orientationStyle?: string): Vector3D[]; + /** + * Uses the transformation matrix without its translation elements to transform a Vector3D object from one space + * coordinate to another. + */ + public deltaTransformVector(v: Vector3D): Vector3D; + /** + * Converts the current matrix to an identity or unit matrix. + */ + public identity(): void; + /** + * [static] Interpolates the translation, rotation, and scale transformation of one matrix toward those of the target matrix. + */ + static interpolate(thisMat: Matrix3D, toMat: Matrix3D, percent: number): Matrix3D; + /** + * Interpolates this matrix towards the translation, rotation, and scale transformations of the target matrix. + */ + public interpolateTo(toMat: Matrix3D, percent: number): void; + /** + * Inverts the current matrix. + */ + public invert(): boolean; + /** + * Prepends a matrix by multiplying the current Matrix3D object by another Matrix3D object. + */ + public prepend(rhs: Matrix3D): void; + /** + * Prepends an incremental rotation to a Matrix3D object. + */ + public prependRotation(degrees: number, axis: Vector3D): void; + /** + * Prepends an incremental scale change along the x, y, and z axes to a Matrix3D object. + */ + public prependScale(xScale: number, yScale: number, zScale: number): void; + /** + * Prepends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. + */ + public prependTranslation(x: number, y: number, z: number): void; + /** + * Sets the transformation matrix's translation, rotation, and scale settings. + */ + public recompose(components: Vector3D[]): boolean; + public transformVector(v: Vector3D): Vector3D; + /** + * Uses the transformation matrix to transform a Vector of Numbers from one coordinate space to another. + */ + public transformVectors(vin: number[], vout: number[]): void; + /** + * Converts the current Matrix3D object to a matrix where the rows and columns are swapped. + */ + public transpose(): void; + static getAxisRotation(x: number, y: number, z: number, degrees: number): Matrix3D; + /** + * [read-only] A Number that determines whether a matrix is invertible. + */ + public determinant : number; + /** + * A Vector3D object that holds the position, the 3D coordinate (x,y,z) of a display object within the + * transformation's frame of reference. + */ + public position : Vector3D; + public toFixed(decimalPlace: number): string; + public toString(): string; + } + export = Matrix3D; + +} +declare module "awayjs-core/lib/core/geom/Matrix3DUtils" { + import Quaternion = require("awayjs-core/lib/core/geom/Quaternion"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + /** + * away.geom.Matrix3DUtils provides additional Matrix3D functions. + */ + class Matrix3DUtils { + /** + * A reference to a Vector to be used as a temporary raw data container, to prevent object creation. + */ + static RAW_DATA_CONTAINER: number[]; + static CALCULATION_MATRIX: Matrix3D; + /** + * Fills the 3d matrix object with values representing the transformation made by the given quaternion. + * + * @param quarternion The quarterion object to convert. + */ + static quaternion2matrix(quarternion: Quaternion, m?: Matrix3D): Matrix3D; + /** + * Returns a normalised Vector3D object representing the forward vector of the given matrix. + * @param m The Matrix3D object to use to get the forward vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The forward vector + */ + static getForward(m: Matrix3D, v?: Vector3D): Vector3D; + /** + * Returns a normalised Vector3D object representing the up vector of the given matrix. + * @param m The Matrix3D object to use to get the up vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The up vector + */ + static getUp(m: Matrix3D, v?: Vector3D): Vector3D; + /** + * Returns a normalised Vector3D object representing the right vector of the given matrix. + * @param m The Matrix3D object to use to get the right vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The right vector + */ + static getRight(m: Matrix3D, v?: Vector3D): Vector3D; + /** + * Returns a boolean value representing whether there is any significant difference between the two given 3d matrices. + */ + static compare(m1: Matrix3D, m2: Matrix3D): boolean; + static lookAt(matrix: Matrix3D, pos: Vector3D, dir: Vector3D, up: Vector3D): void; + static reflection(plane: Plane3D, target?: Matrix3D): Matrix3D; + static transformVector(matrix: Matrix3D, vector: Vector3D, result?: Vector3D): Vector3D; + static deltaTransformVector(matrix: Matrix3D, vector: Vector3D, result?: Vector3D): Vector3D; + static getTranslation(transform: Matrix3D, result?: Vector3D): Vector3D; + static deltaTransformVectors(matrix: Matrix3D, vin: number[], vout: number[]): void; + } + export = Matrix3DUtils; + +} +declare module "awayjs-core/lib/core/geom/Orientation3D" { + /** + * A Quaternion object which can be used to represent rotations. + */ + class Orientation3D { + /** + * The axis angle orientation uses a combination of an axis and an angle to determine the orientation. + * @type {string} + */ + static AXIS_ANGLE: string; + /** + * The default orientation for decompose() and recompose() methods, defines the orientation with three separate angles of rotation for each axis. + * @type {string} + */ + static EULER_ANGLES: string; + /** + * The quaternion orientation uses complex numbers. + * @type {string} + */ + static QUATERNION: string; + } + export = Orientation3D; + +} +declare module "awayjs-core/lib/core/geom/PerspectiveProjection" { + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Point = require("awayjs-core/lib/core/geom/Point"); + /** + *

The PerspectiveProjection class provides an easy way to assign or modify + * the perspective transformations of a display object and all of its + * children. For more complex or custom perspective transformations, use the + * Matrix3D class. While the PerspectiveProjection class provides basic + * three-dimensional presentation properties, the Matrix3D class provides more + * detailed control over the three-dimensional presentation of display objects. + *

+ * + *

Projection is a way of representing a three-dimensional object in a + * two-dimensional space, like a cube projected onto a computer screen. + * Perspective projection uses a viewing frustum (a rectangular pyramid) to + * model and project a three-dimensional world and its objects on the screen. + * The viewing frustum becomes increasingly wider as it moves further from the + * origin of the viewpoint. The origin of the viewpoint could be a camera or + * the eyes of an observer facing the screen. The projected perspective + * produces the illusion of three dimensions with depth and distance, where + * the objects closer to the screen appear larger than the objects farther + * from the screen.

+ * + *

A default PerspectiveProjection object is a framework defined for + * perspective transformation of the root object, based on the field of view + * and aspect ratio (dimensions) of the stage. The projection center, the + * vanishing point, is set to the center of the stage, which means the + * three-dimensional display objects disappear toward the center of the stage + * as they move back in the z axis. The default viewpoint is at point (0,0) + * looking down the positive z axis. The y-axis points down toward the bottom + * of the screen. You can gain access to the root display object's perspective + * projection settings and change the field of view and projection center + * properties of the perspectiveProjection property through the root object's + * DisplayObject.transform property.

+ * + *

You can also set a different perspective projection setting for a + * display object through the parent's perspective projection. First, create a + * PerspectiveProjection object and set its fieldOfView and + * projectionCenter properties. Next, assign the + * PerspectiveProjection object to the parent display object using the + * DisplayObject.transform property. The specified projection + * matrix and transformation will then apply to all the display object's + * three-dimensional children.

+ * + *

To modify a perspective projection of the stage or root object: use the + * transform.matrix property of the root display object to gain + * access to the PerspectiveProjection object. Or, apply different perspective + * projection properties to a display object by setting the perspective + * projection properties of the display object's parent. The child display + * object inherits the new properties. Specifically, create a + * PerspectiveProjection object and set its properties, then assign the + * PerspectiveProjection object to the perspectiveProjection + * property of the parent display object's transform property. + * The specified projection transformation then applies to all the display + * object's three-dimensional children.

+ * + *

Since both PerspectiveProjection and Matrix3D objects perform + * perspective transformations, do not assign both to a display object at the + * same time. Use the PerspectiveProjection object for focal length and + * projection center changes. For more control over the perspective + * transformation, create a perspective projection Matrix3D object.

+ */ + class PerspectiveProjection { + private _matrix3D; + /** + * Specifies an angle, as a degree between 0 and 180, for the field of + * view in three dimensions. This value determines how strong the + * perspective transformation and distortion apply to a + * three-dimensional display object with a non-zero z-coordinate. + * + *

A degree close to 0 means that the screen's two-dimensional x- + * and y-coordinates are roughly the same as the three-dimensional x-, + * y-, and z-coordinates with little or no distortion. In other words, + * for a small angle, a display object moving down the z axis appears + * to stay near the same size and moves little.

+ * + *

A value close to 180 degrees results in a fisheye projection effect: + * positions with a z value smaller than 0 are magnified, while + * positions with a z value larger than 0 are minimized. With a large + * angle, a display object moving down the z axis appears to change + * size quickly and moves a great distance. If the field of view is + * set to 0 or 180, nothing is seen on the screen.

+ */ + public fieldOfView: number; + /** + * The distance between the eye or the viewpoint's origin (0,0,0) and + * the display object located in the z axis. During the perspective + * transformation, the focalLength is calculated + * dynamically using the angle of the field of view and the stage's + * aspect ratio (stage width divided by stage height). + * + * @see away.geom.PerspectiveProjection#fieldOfView + */ + public focalLength: number; + /** + * A two-dimensional point representing the center of the projection, + * the vanishing point for the display object. + * + *

The projectionCenter property is an offset to the + * default registration point that is the upper left of the stage, + * point (0,0). The default projection transformation center is in the + * middle of the stage, which means the three-dimensional display + * objects disappear toward the center of the stage as they move + * backwards in the z axis.

+ */ + public projectionCenter: Point; + /** + * Creates an instance of a PerspectiveProjection object. + */ + constructor(); + /** + * Returns the underlying Matrix3D object of the display object. + * + *

A display object, like the root object, can have a + * PerspectiveProjection object without needing a Matrix3D property + * defined for its transformations. In fact, use either a + * PerspectiveProjection or a Matrix3D object to specify the + * perspective transformation. If when using the PerspectiveProjection + * object, a Matrix3D object was needed, the toMatrix3D() + * method can retrieve the underlying Matrix3D object of the display + * object. For example, the toMatrix3D() method can be + * used with the Utils3D.projectVectors() method.

+ * + * @see away.geom.Matrix3D + */ + public toMatrix3D(): Matrix3D; + } + export = PerspectiveProjection; + +} +declare module "awayjs-core/lib/core/geom/Plane3D" { + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + class Plane3D { + /** + * The A coefficient of this plane. (Also the x dimension of the plane normal) + */ + public a: number; + /** + * The B coefficient of this plane. (Also the y dimension of the plane normal) + */ + public b: number; + /** + * The C coefficient of this plane. (Also the z dimension of the plane normal) + */ + public c: number; + /** + * The D coefficient of this plane. (Also the inverse dot product between normal and point) + */ + public d: number; + public _iAlignment: number; + static ALIGN_ANY: number; + static ALIGN_XY_AXIS: number; + static ALIGN_YZ_AXIS: number; + static ALIGN_XZ_AXIS: number; + /** + * Create a Plane3D with ABCD coefficients + */ + constructor(a?: number, b?: number, c?: number, d?: number); + /** + * Fills this Plane3D with the coefficients from 3 points in 3d space. + * @param p0 Vector3D + * @param p1 Vector3D + * @param p2 Vector3D + */ + public fromPoints(p0: Vector3D, p1: Vector3D, p2: Vector3D): void; + /** + * Fills this Plane3D with the coefficients from the plane's normal and a point in 3d space. + * @param normal Vector3D + * @param point Vector3D + */ + public fromNormalAndPoint(normal: Vector3D, point: Vector3D): void; + /** + * Normalize this Plane3D + * @return Plane3D This Plane3D. + */ + public normalize(): Plane3D; + /** + * Returns the signed distance between this Plane3D and the point p. + * @param p Vector3D + * @returns Number + */ + public distance(p: Vector3D): number; + /** + * Classify a point against this Plane3D. (in front, back or intersecting) + * @param p Vector3D + * @return int Plane3.FRONT or Plane3D.BACK or Plane3D.INTERSECT + */ + public classifyPoint(p: Vector3D, epsilon?: number): number; + public toString(): string; + } + export = Plane3D; + +} +declare module "awayjs-core/lib/core/geom/PlaneClassification" { + class PlaneClassification { + static BACK: number; + static FRONT: number; + static IN: number; + static OUT: number; + static INTERSECT: number; + } + export = PlaneClassification; + +} +declare module "awayjs-core/lib/core/geom/Point" { + /** + * The Point object represents a location in a two-dimensional coordinate + * system, where x represents the horizontal axis and y + * represents the vertical axis. + * + *

The following code creates a point at(0,0):

+ * + *

Methods and properties of the following classes use Point objects:

+ * + *
    + *
  • BitmapData
  • + *
  • DisplayObject
  • + *
  • DisplayObjectContainer
  • + *
  • DisplacementMapFilter
  • + *
  • NativeWindow
  • + *
  • Matrix
  • + *
  • Rectangle
  • + *
+ * + *

You can use the new Point() constructor to create a Point + * object.

+ */ + class Point { + /** + * The horizontal coordinate of the point. The default value is 0. + */ + public x: number; + /** + * The vertical coordinate of the point. The default value is 0. + */ + public y: number; + /** + * The length of the line segment from(0,0) to this point. + */ + public length : number; + /** + * Creates a new point. If you pass no parameters to this method, a point is + * created at(0,0). + * + * @param x The horizontal coordinate. + * @param y The vertical coordinate. + */ + constructor(x?: number, y?: number); + /** + * Adds the coordinates of another point to the coordinates of this point to + * create a new point. + * + * @param v The point to be added. + * @return The new point. + */ + public add(v: Point): Point; + /** + * Creates a copy of this Point object. + * + * @return The new Point object. + */ + public clone(): Point; + public copyFrom(sourcePoint: Point): void; + /** + * Determines whether two points are equal. Two points are equal if they have + * the same x and y values. + * + * @param toCompare The point to be compared. + * @return A value of true if the object is equal to this Point + * object; false if it is not equal. + */ + public equals(toCompare: Point): boolean; + /** + * Scales the line segment between(0,0) and the current point to a set + * length. + * + * @param thickness The scaling value. For example, if the current point is + * (0,5), and you normalize it to 1, the point returned is + * at(0,1). + */ + public normalize(thickness?: number): void; + /** + * Offsets the Point object by the specified amount. The value of + * dx is added to the original value of x to create the + * new x value. The value of dy is added to the original + * value of y to create the new y value. + * + * @param dx The amount by which to offset the horizontal coordinate, + * x. + * @param dy The amount by which to offset the vertical coordinate, y. + */ + public offset(dx: number, dy: number): void; + public setTo(xa: number, ya: number): void; + /** + * Subtracts the coordinates of another point from the coordinates of this + * point to create a new point. + * + * @param v The point to be subtracted. + * @return The new point. + */ + public subtract(v: Point): Point; + /** + * Returns a string that contains the values of the x and y + * coordinates. The string has the form "(x=x, + * y=y)", so calling the toString() method for a + * point at 23,17 would return "(x=23, y=17)". + * + * @return The string representation of the coordinates. + */ + public toString(): string; + /** + * Returns the distance between pt1 and pt2. + * + * @param pt1 The first point. + * @param pt2 The second point. + * @return The distance between the first and second points. + */ + static distance(pt1: Point, pt2: Point): number; + /** + * Determines a point between two specified points. The parameter + * f determines where the new interpolated point is located + * relative to the two end points specified by parameters pt1 + * and pt2. The closer the value of the parameter f + * is to 1.0, the closer the interpolated point is to the first + * point(parameter pt1). The closer the value of the parameter + * f is to 0, the closer the interpolated point is to the second + * point(parameter pt2). + * + * @param pt1 The first point. + * @param pt2 The second point. + * @param f The level of interpolation between the two points. Indicates + * where the new point will be, along the line between + * pt1 and pt2. If f=1, + * pt1 is returned; if f=0, + * pt2 is returned. + * @return The new, interpolated point. + */ + static interpolate(pt1: Point, pt2: Point, f: number): Point; + /** + * Converts a pair of polar coordinates to a Cartesian point coordinate. + * + * @param len The length coordinate of the polar pair. + * @param angle The angle, in radians, of the polar pair. + * @return The Cartesian point. + */ + static polar(len: number, angle: number): Point; + } + export = Point; + +} +declare module "awayjs-core/lib/core/geom/PoissonLookup" { + class PoissonLookup { + static _distributions: number[][]; + static initDistributions(): void; + static getDistribution(n: number): number[]; + } + export = PoissonLookup; + +} +declare module "awayjs-core/lib/core/geom/Quaternion" { + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + /** + * A Quaternion object which can be used to represent rotations. + */ + class Quaternion { + /** + * The x value of the quaternion. + */ + public x: number; + /** + * The y value of the quaternion. + */ + public y: number; + /** + * The z value of the quaternion. + */ + public z: number; + /** + * The w value of the quaternion. + */ + public w: number; + /** + * Creates a new Quaternion object. + * @param x The x value of the quaternion. + * @param y The y value of the quaternion. + * @param z The z value of the quaternion. + * @param w The w value of the quaternion. + */ + constructor(x?: number, y?: number, z?: number, w?: number); + /** + * Returns the magnitude of the quaternion object. + */ + public magnitude : number; + /** + * Fills the quaternion object with the result from a multiplication of two quaternion objects. + * + * @param qa The first quaternion in the multiplication. + * @param qb The second quaternion in the multiplication. + */ + public multiply(qa: Quaternion, qb: Quaternion): void; + public multiplyVector(vector: Vector3D, target?: Quaternion): Quaternion; + /** + * Fills the quaternion object with values representing the given rotation around a vector. + * + * @param axis The axis around which to rotate + * @param angle The angle in radians of the rotation. + */ + public fromAxisAngle(axis: Vector3D, angle: number): void; + /** + * Spherically interpolates between two quaternions, providing an interpolation between rotations with constant angle change rate. + * @param qa The first quaternion to interpolate. + * @param qb The second quaternion to interpolate. + * @param t The interpolation weight, a value between 0 and 1. + */ + public slerp(qa: Quaternion, qb: Quaternion, t: number): void; + /** + * Linearly interpolates between two quaternions. + * @param qa The first quaternion to interpolate. + * @param qb The second quaternion to interpolate. + * @param t The interpolation weight, a value between 0 and 1. + */ + public lerp(qa: Quaternion, qb: Quaternion, t: number): void; + /** + * Fills the quaternion object with values representing the given euler rotation. + * + * @param ax The angle in radians of the rotation around the ax axis. + * @param ay The angle in radians of the rotation around the ay axis. + * @param az The angle in radians of the rotation around the az axis. + */ + public fromEulerAngles(ax: number, ay: number, az: number): void; + /** + * Fills a target Vector3D object with the Euler angles that form the rotation represented by this quaternion. + * @param target An optional Vector3D object to contain the Euler angles. If not provided, a new object is created. + * @return The Vector3D containing the Euler angles. + */ + public toEulerAngles(target?: Vector3D): Vector3D; + /** + * Normalises the quaternion object. + */ + public normalize(val?: number): void; + /** + * Used to trace the values of a quaternion. + * + * @return A string representation of the quaternion object. + */ + public toString(): string; + /** + * Converts the quaternion to a Matrix3D object representing an equivalent rotation. + * @param target An optional Matrix3D container to store the transformation in. If not provided, a new object is created. + * @return A Matrix3D object representing an equivalent rotation. + */ + public toMatrix3D(target?: Matrix3D): Matrix3D; + /** + * Extracts a quaternion rotation matrix out of a given Matrix3D object. + * @param matrix The Matrix3D out of which the rotation will be extracted. + */ + public fromMatrix(matrix: Matrix3D): void; + /** + * Converts the quaternion to a Vector.<Number> matrix representation of a rotation equivalent to this quaternion. + * @param target The Vector.<Number> to contain the raw matrix data. + * @param exclude4thRow If true, the last row will be omitted, and a 4x3 matrix will be generated instead of a 4x4. + */ + public toRawData(target: number[], exclude4thRow?: boolean): void; + /** + * Clones the quaternion. + * @return An exact duplicate of the current Quaternion. + */ + public clone(): Quaternion; + /** + * Rotates a point. + * @param vector The Vector3D object to be rotated. + * @param target An optional Vector3D object that will contain the rotated coordinates. If not provided, a new object will be created. + * @return A Vector3D object containing the rotated point. + */ + public rotatePoint(vector: Vector3D, target?: Vector3D): Vector3D; + /** + * Copies the data from a quaternion into this instance. + * @param q The quaternion to copy from. + */ + public copyFrom(q: Quaternion): void; + } + export = Quaternion; + +} +declare module "awayjs-core/lib/core/geom/Rectangle" { + import Point = require("awayjs-core/lib/core/geom/Point"); + /** + * A Rectangle object is an area defined by its position, as indicated by its + * top-left corner point(x, y) and by its width and its height. + * + * + *

The x, y, width, and + * height properties of the Rectangle class are independent of + * each other; changing the value of one property has no effect on the others. + * However, the right and bottom properties are + * integrally related to those four properties. For example, if you change the + * value of the right property, the value of the + * width property changes; if you change the bottom + * property, the value of the height property changes.

+ * + *

The following methods and properties use Rectangle objects:

+ * + *
    + *
  • The applyFilter(), colorTransform(), + * copyChannel(), copyPixels(), draw(), + * fillRect(), generateFilterRect(), + * getColorBoundsRect(), getPixels(), + * merge(), paletteMap(), + * pixelDisolve(), setPixels(), and + * threshold() methods, and the rect property of the + * BitmapData class
  • + *
  • The getBounds() and getRect() methods, and + * the scrollRect and scale9Grid properties of the + * DisplayObject class
  • + *
  • The getCharBoundaries() method of the TextField + * class
  • + *
  • The pixelBounds property of the Transform class
  • + *
  • The bounds parameter for the startDrag() + * method of the Sprite class
  • + *
  • The printArea parameter of the addPage() + * method of the PrintJob class
  • + *
+ * + *

You can use the new Rectangle() constructor to create a + * Rectangle object.

+ * + *

Note: The Rectangle class does not define a rectangular Shape + * display object. To draw a rectangular Shape object onscreen, use the + * drawRect() method of the Graphics class.

+ */ + class Rectangle { + private _size; + private _bottomRight; + private _topLeft; + /** + * The height of the rectangle, in pixels. Changing the height + * value of a Rectangle object has no effect on the x, + * y, and width properties. + */ + public height: number; + /** + * The width of the rectangle, in pixels. Changing the width + * value of a Rectangle object has no effect on the x, + * y, and height properties. + */ + public width: number; + /** + * The x coordinate of the top-left corner of the rectangle. Changing + * the value of the x property of a Rectangle object has no + * effect on the y, width, and height + * properties. + * + *

The value of the x property is equal to the value of the + * left property.

+ */ + public x: number; + /** + * The y coordinate of the top-left corner of the rectangle. Changing + * the value of the y property of a Rectangle object has no + * effect on the x, width, and height + * properties. + * + *

The value of the y property is equal to the value of the + * top property.

+ */ + public y: number; + /** + * The sum of the y and height properties. + */ + public bottom : number; + /** + * The location of the Rectangle object's bottom-right corner, determined by + * the values of the right and bottom properties. + */ + public bottomRight : Point; + /** + * The x coordinate of the top-left corner of the rectangle. Changing + * the left property of a Rectangle object has no effect on the + * y and height properties. However it does affect + * the width property, whereas changing the x value + * does not affect the width property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + public left : number; + /** + * The sum of the x and width properties. + */ + public right : number; + /** + * The size of the Rectangle object, expressed as a Point object with the + * values of the width and height properties. + */ + public size : Point; + /** + * The y coordinate of the top-left corner of the rectangle. Changing + * the top property of a Rectangle object has no effect on the + * x and width properties. However it does affect + * the height property, whereas changing the y + * value does not affect the height property. + * + *

The value of the top property is equal to the value of the + * y property.

+ */ + public top : number; + /** + * The location of the Rectangle object's top-left corner, determined by the + * x and y coordinates of the point. + */ + public topLeft : Point; + /** + * Creates a new Rectangle object with the top-left corner specified by the + * x and y parameters and with the specified + * width and height parameters. If you call this + * public without parameters, a rectangle with x, + * y, width, and height properties set + * to 0 is created. + * + * @param x The x coordinate of the top-left corner of the + * rectangle. + * @param y The y coordinate of the top-left corner of the + * rectangle. + * @param width The width of the rectangle, in pixels. + * @param height The height of the rectangle, in pixels. + */ + constructor(x?: number, y?: number, width?: number, height?: number); + /** + * Returns a new Rectangle object with the same values for the + * x, y, width, and + * height properties as the original Rectangle object. + * + * @return A new Rectangle object with the same values for the + * x, y, width, and + * height properties as the original Rectangle object. + */ + public clone(): Rectangle; + /** + * Determines whether the specified point is contained within the rectangular + * region defined by this Rectangle object. + * + * @param x The x coordinate(horizontal position) of the point. + * @param y The y coordinate(vertical position) of the point. + * @return A value of true if the Rectangle object contains the + * specified point; otherwise false. + */ + public contains(x: number, y: number): boolean; + /** + * Determines whether the specified point is contained within the rectangular + * region defined by this Rectangle object. This method is similar to the + * Rectangle.contains() method, except that it takes a Point + * object as a parameter. + * + * @param point The point, as represented by its x and y + * coordinates. + * @return A value of true if the Rectangle object contains the + * specified point; otherwise false. + */ + public containsPoint(point: Point): boolean; + /** + * Determines whether the Rectangle object specified by the rect + * parameter is contained within this Rectangle object. A Rectangle object is + * said to contain another if the second Rectangle object falls entirely + * within the boundaries of the first. + * + * @param rect The Rectangle object being checked. + * @return A value of true if the Rectangle object that you + * specify is contained by this Rectangle object; otherwise + * false. + */ + public containsRect(rect: Rectangle): boolean; + /** + * Copies all of rectangle data from the source Rectangle object into the + * calling Rectangle object. + * + * @param sourceRect The Rectangle object from which to copy the data. + */ + public copyFrom(sourceRect: Rectangle): void; + /** + * Determines whether the object specified in the toCompare + * parameter is equal to this Rectangle object. This method compares the + * x, y, width, and + * height properties of an object against the same properties of + * this Rectangle object. + * + * @param toCompare The rectangle to compare to this Rectangle object. + * @return A value of true if the object has exactly the same + * values for the x, y, width, + * and height properties as this Rectangle object; + * otherwise false. + */ + public equals(toCompare: Rectangle): boolean; + /** + * Increases the size of the Rectangle object by the specified amounts, in + * pixels. The center point of the Rectangle object stays the same, and its + * size increases to the left and right by the dx value, and to + * the top and the bottom by the dy value. + * + * @param dx The value to be added to the left and the right of the Rectangle + * object. The following equation is used to calculate the new + * width and position of the rectangle: + * @param dy The value to be added to the top and the bottom of the + * Rectangle. The following equation is used to calculate the new + * height and position of the rectangle: + */ + public inflate(dx: number, dy: number): void; + /** + * Increases the size of the Rectangle object. This method is similar to the + * Rectangle.inflate() method except it takes a Point object as + * a parameter. + * + *

The following two code examples give the same result:

+ * + * @param point The x property of this Point object is used to + * increase the horizontal dimension of the Rectangle object. + * The y property is used to increase the vertical + * dimension of the Rectangle object. + */ + public inflatePoint(point: Point): void; + /** + * If the Rectangle object specified in the toIntersect + * parameter intersects with this Rectangle object, returns the area of + * intersection as a Rectangle object. If the rectangles do not intersect, + * this method returns an empty Rectangle object with its properties set to + * 0. + * + * @param toIntersect The Rectangle object to compare against to see if it + * intersects with this Rectangle object. + * @return A Rectangle object that equals the area of intersection. If the + * rectangles do not intersect, this method returns an empty + * Rectangle object; that is, a rectangle with its x, + * y, width, and height + * properties set to 0. + */ + public intersection(toIntersect: Rectangle): Rectangle; + /** + * Determines whether the object specified in the toIntersect + * parameter intersects with this Rectangle object. This method checks the + * x, y, width, and + * height properties of the specified Rectangle object to see if + * it intersects with this Rectangle object. + * + * @param toIntersect The Rectangle object to compare against this Rectangle + * object. + * @return A value of true if the specified object intersects + * with this Rectangle object; otherwise false. + */ + public intersects(toIntersect: Rectangle): boolean; + /** + * Determines whether or not this Rectangle object is empty. + * + * @return A value of true if the Rectangle object's width or + * height is less than or equal to 0; otherwise false. + */ + public isEmpty(): boolean; + /** + * Adjusts the location of the Rectangle object, as determined by its + * top-left corner, by the specified amounts. + * + * @param dx Moves the x value of the Rectangle object by this amount. + * @param dy Moves the y value of the Rectangle object by this amount. + */ + public offset(dx: number, dy: number): void; + /** + * Adjusts the location of the Rectangle object using a Point object as a + * parameter. This method is similar to the Rectangle.offset() + * method, except that it takes a Point object as a parameter. + * + * @param point A Point object to use to offset this Rectangle object. + */ + public offsetPoint(point: Point): void; + /** + * Sets all of the Rectangle object's properties to 0. A Rectangle object is + * empty if its width or height is less than or equal to 0. + * + *

This method sets the values of the x, y, + * width, and height properties to 0.

+ * + */ + public setEmpty(): void; + /** + * Sets the members of Rectangle to the specified values + * + * @param xa The x coordinate of the top-left corner of the + * rectangle. + * @param ya The y coordinate of the top-left corner of the + * rectangle. + * @param widtha The width of the rectangle, in pixels. + * @param heighta The height of the rectangle, in pixels. + */ + public setTo(xa: number, ya: number, widtha: number, heighta: number): void; + /** + * Builds and returns a string that lists the horizontal and vertical + * positions and the width and height of the Rectangle object. + * + * @return A string listing the value of each of the following properties of + * the Rectangle object: x, y, + * width, and height. + */ + public toString(): string; + /** + * Adds two rectangles together to create a new Rectangle object, by filling + * in the horizontal and vertical space between the two rectangles. + * + *

Note: The union() method ignores rectangles with + * 0 as the height or width value, such as: var + * rect2:Rectangle = new Rectangle(300,300,50,0);

+ * + * @param toUnion A Rectangle object to add to this Rectangle object. + * @return A new Rectangle object that is the union of the two rectangles. + */ + public union(toUnion: Rectangle): Rectangle; + } + export = Rectangle; + +} +declare module "awayjs-core/lib/core/geom/Transform" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import ColorTransform = require("awayjs-core/lib/core/geom/ColorTransform"); + import Matrix = require("awayjs-core/lib/core/geom/Matrix"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); + /** + * The Transform class provides access to color adjustment properties and two- + * or three-dimensional transformation objects that can be applied to a + * display object. During the transformation, the color or the orientation and + * position of a display object is adjusted(offset) from the current values + * or coordinates to new values or coordinates. The Transform class also + * collects data about color and two-dimensional matrix transformations that + * are applied to a display object and all of its parent objects. You can + * access these combined transformations through the + * concatenatedColorTransform and concatenatedMatrix + * properties. + * + *

To apply color transformations: create a ColorTransform object, set the + * color adjustments using the object's methods and properties, and then + * assign the colorTransformation property of the + * transform property of the display object to the new + * ColorTransformation object.

+ * + *

To apply two-dimensional transformations: create a Matrix object, set + * the matrix's two-dimensional transformation, and then assign the + * transform.matrix property of the display object to the new + * Matrix object.

+ * + *

To apply three-dimensional transformations: start with a + * three-dimensional display object. A three-dimensional display object has a + * z property value other than zero. You do not need to create + * the Matrix3D object. For all three-dimensional objects, a Matrix3D object + * is created automatically when you assign a z value to a + * display object. You can access the display object's Matrix3D object through + * the display object's transform property. Using the methods of + * the Matrix3D class, you can add to or modify the existing transformation + * settings. Also, you can create a custom Matrix3D object, set the custom + * Matrix3D object's transformation elements, and then assign the new Matrix3D + * object to the display object using the transform.matrix + * property.

+ * + *

To modify a perspective projection of the stage or root object: use the + * transform.matrix property of the root display object to gain + * access to the PerspectiveProjection object. Or, apply different perspective + * projection properties to a display object by setting the perspective + * projection properties of the display object's parent. The child display + * object inherits the new properties. Specifically, create a + * PerspectiveProjection object and set its properties, then assign the + * PerspectiveProjection object to the perspectiveProjection + * property of the parent display object's transform property. + * The specified projection transformation then applies to all the display + * object's three-dimensional children.

+ * + *

Since both PerspectiveProjection and Matrix3D objects perform + * perspective transformations, do not assign both to a display object at the + * same time. Use the PerspectiveProjection object for focal length and + * projection center changes. For more control over the perspective + * transformation, create a perspective projection Matrix3D object.

+ */ + class Transform { + private _displayObject; + private _concatenatedColorTransform; + private _concatenatedMatrix; + private _pixelBounds; + public _position: Vector3D; + /** + * + */ + public backVector : Vector3D; + /** + * A ColorTransform object containing values that universally adjust the + * colors in the display object. + * + * @throws TypeError The colorTransform is null when being set + */ + public colorTransform: ColorTransform; + /** + * A ColorTransform object representing the combined color transformations + * applied to the display object and all of its parent objects, back to the + * root level. If different color transformations have been applied at + * different levels, all of those transformations are concatenated into one + * ColorTransform object for this property. + */ + public concatenatedColorTransform : ColorTransform; + /** + * A Matrix object representing the combined transformation matrixes of the + * display object and all of its parent objects, back to the root level. If + * different transformation matrixes have been applied at different levels, + * all of those matrixes are concatenated into one matrix for this property. + * Also, for resizeable SWF content running in the browser, this property + * factors in the difference between stage coordinates and window coordinates + * due to window resizing. Thus, the property converts local coordinates to + * window coordinates, which may not be the same coordinate space as that of + * the Stage. + */ + public concatenatedMatrix : Matrix; + /** + * + */ + public downVector : Vector3D; + /** + * + */ + public forwardVector : Vector3D; + /** + * + */ + public leftVector : Vector3D; + /** + * A Matrix object containing values that alter the scaling, rotation, and + * translation of the display object. + * + *

If the matrix property is set to a value(not + * null), the matrix3D property is + * null. And if the matrix3D property is set to a + * value(not null), the matrix property is + * null.

+ * + * @throws TypeError The matrix is null when being set + */ + public matrix: Matrix; + /** + * Provides access to the Matrix3D object of a three-dimensional display + * object. The Matrix3D object represents a transformation matrix that + * determines the display object's position and orientation. A Matrix3D + * object can also perform perspective projection. + * + *

If the matrix property is set to a value(not + * null), the matrix3D property is + * null. And if the matrix3D property is set to a + * value(not null), the matrix property is + * null.

+ */ + public matrix3D : Matrix3D; + /** + * Provides access to the PerspectiveProjection object of a three-dimensional + * display object. The PerspectiveProjection object can be used to modify the + * perspective transformation of the stage or to assign a perspective + * transformation to all the three-dimensional children of a display object. + * + *

Based on the field of view and aspect ratio(dimensions) of the stage, + * a default PerspectiveProjection object is assigned to the root object.

+ */ + public perspectiveProjection: PerspectiveProjection; + /** + * A Rectangle object that defines the bounding rectangle of the display + * object on the stage. + */ + public pixelBounds : Rectangle; + /** + * Defines the position of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + public position : Vector3D; + /** + * + */ + public rightVector : Vector3D; + /** + * Defines the rotation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + public rotation : Vector3D; + /** + * Defines the scale of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + public scale : Vector3D; + /** + * + */ + public upVector : Vector3D; + constructor(displayObject: DisplayObject); + /** + * Returns a Matrix3D object, which can transform the space of a specified + * display object in relation to the current display object's space. You can + * use the getRelativeMatrix3D() method to move one + * three-dimensional display object relative to another three-dimensional + * display object. + * + * @param relativeTo The display object relative to which the transformation + * occurs. To get a Matrix3D object relative to the stage, + * set the parameter to the root or + * stage object. To get the world-relative + * matrix of the display object, set the parameter to a + * display object that has a perspective transformation + * applied to it. + * @return A Matrix3D object that can be used to transform the space from the + * relativeTo display object to the current display + * object space. + */ + public getRelativeMatrix3D(relativeTo: DisplayObject): Matrix3D; + /** + * Moves the 3d object forwards along it's local z axis + * + * @param distance The length of the movement + */ + public moveForward(distance: number): void; + /** + * Moves the 3d object backwards along it's local z axis + * + * @param distance The length of the movement + */ + public moveBackward(distance: number): void; + /** + * Moves the 3d object backwards along it's local x axis + * + * @param distance The length of the movement + */ + public moveLeft(distance: number): void; + /** + * Moves the 3d object forwards along it's local x axis + * + * @param distance The length of the movement + */ + public moveRight(distance: number): void; + /** + * Moves the 3d object forwards along it's local y axis + * + * @param distance The length of the movement + */ + public moveUp(distance: number): void; + /** + * Moves the 3d object backwards along it's local y axis + * + * @param distance The length of the movement + */ + public moveDown(distance: number): void; + } + export = Transform; + +} +declare module "awayjs-core/lib/core/geom/UVTransform" { + import Matrix = require("awayjs-core/lib/core/geom/Matrix"); + class UVTransform { + private _uvMatrix; + private _uvMatrixDirty; + private _rotation; + private _scaleU; + private _scaleV; + private _offsetU; + private _offsetV; + /** + * + */ + public offsetU : number; + /** + * + */ + public offsetV : number; + /** + * + */ + public rotation : number; + /** + * + */ + public scaleU : number; + /** + * + */ + public scaleV : number; + /** + * + */ + public matrix : Matrix; + constructor(); + /** + * @private + */ + private updateUVMatrix(); + } + export = UVTransform; + +} +declare module "awayjs-core/lib/core/geom/Vector3D" { + /** + * The Vector3D class represents a point or a location in the three-dimensional + * space using the Cartesian coordinates x, y, and z. As in a two-dimensional + * space, the x property represents the horizontal axis and the y property + * represents the vertical axis. In three-dimensional space, the z property + * represents depth. The value of the x property increases as the object moves + * to the right. The value of the y property increases as the object moves + * down. The z property increases as the object moves farther from the point + * of view. Using perspective projection and scaling, the object is seen to be + * bigger when near and smaller when farther away from the screen. As in a + * right-handed three-dimensional coordinate system, the positive z-axis points + * away from the viewer and the value of the z property increases as the object + * moves away from the viewer's eye. The origin point (0,0,0) of the global + * space is the upper-left corner of the stage. + * + *

The Vector3D class can also represent a direction, an arrow pointing from + * the origin of the coordinates, such as (0,0,0), to an endpoint; or a + * floating-point component of an RGB (Red, Green, Blue) color model.

+ * + *

Quaternion notation introduces a fourth element, the w property, which + * provides additional orientation information. For example, the w property can + * define an angle of rotation of a Vector3D object. The combination of the + * angle of rotation and the coordinates x, y, and z can determine the display + * object's orientation. Here is a representation of Vector3D elements in + * matrix notation:

+ */ + class Vector3D { + /** + * The x axis defined as a Vector3D object with coordinates (1,0,0). + */ + static X_AXIS: Vector3D; + /** + * The y axis defined as a Vector3D object with coordinates (0,1,0). + */ + static Y_AXIS: Vector3D; + /** + * The z axis defined as a Vector3D object with coordinates (0,0,1). + */ + static Z_AXIS: Vector3D; + /** + * The first element of a Vector3D object, such as the x coordinate of + * a point in the three-dimensional space. The default value is 0. + */ + public x: number; + public y: number; + /** + * The third element of a Vector3D object, such as the y coordinate of + * a point in the three-dimensional space. The default value is 0. + */ + public z: number; + /** + * TThe fourth element of a Vector3D object (in addition to the x, y, + * and z properties) can hold data such as the angle of rotation. The + * default value is 0. + * + *

Quaternion notation employs an angle as the fourth element in + * its calculation of three-dimensional rotation. The w property can + * be used to define the angle of rotation about the Vector3D object. + * The combination of the rotation angle and the coordinates (x,y,z) + * determines the display object's orientation.

+ * + *

In addition, the w property can be used as a perspective warp + * factor for a projected three-dimensional position or as a projection + * transform value in representing a three-dimensional coordinate + * projected into the two-dimensional space. For example, you can + * create a projection matrix using the Matrix3D.rawData + * property, that, when applied to a Vector3D object, produces a + * transform value in the Vector3D object's fourth element (the w + * property). Dividing the Vector3D object's other elements by the + * transform value then produces a projected Vector3D object. You can + * use the Vector3D.project() method to divide the first + * three elements of a Vector3D object by its fourth element.

+ */ + public w: number; + /** + * The length, magnitude, of the current Vector3D object from the + * origin (0,0,0) to the object's x, y, and z coordinates. The w + * property is ignored. A unit vector has a length or magnitude of + * one. + */ + public length : number; + /** + * The square of the length of the current Vector3D object, calculated + * using the x, y, and z properties. The w property is ignored. Use the + * lengthSquared() method whenever possible instead of the + * slower Math.sqrt() method call of the + * Vector3D.length() method. + */ + public lengthSquared : number; + /** + * Creates an instance of a Vector3D object. If you do not specify a + * parameter for the constructor, a Vector3D object is created with + * the elements (0,0,0,0). + * + * @param x The first element, such as the x coordinate. + * @param y The second element, such as the y coordinate. + * @param z The third element, such as the z coordinate. + * @param w An optional element for additional data such as the angle + * of rotation. + */ + constructor(x?: number, y?: number, z?: number, w?: number); + /** + * Adds the value of the x, y, and z elements of the current Vector3D + * object to the values of the x, y, and z elements of another Vector3D + * object. The add() method does not change the current + * Vector3D object. Instead, it returns a new Vector3D object with + * the new values. + * + *

The result of adding two vectors together is a resultant vector. + * One way to visualize the result is by drawing a vector from the + * origin or tail of the first vector to the end or head of the second + * vector. The resultant vector is the distance between the origin + * point of the first vector and the end point of the second vector. + *

+ */ + public add(a: Vector3D): Vector3D; + /** + * Returns the angle in radians between two vectors. The returned angle + * is the smallest radian the first Vector3D object rotates until it + * aligns with the second Vector3D object. + * + *

The angleBetween() method is a static method. You + * can use it directly as a method of the Vector3D class.

+ * + *

To convert a degree to a radian, you can use the following + * formula:

+ * + *

radian = Math.PI/180 * degree

+ * + * @param a The first Vector3D object. + * @param b The second Vector3D object. + * @returns The angle between two Vector3D objects. + */ + static angleBetween(a: Vector3D, b: Vector3D): number; + /** + * Returns a new Vector3D object that is an exact copy of the current + * Vector3D object. + * + * @returns A new Vector3D object that is a copy of the current + * Vector3D object. + */ + public clone(): Vector3D; + /** + * Copies all of vector data from the source Vector3D object into the + * calling Vector3D object. + * + * @param src The Vector3D object from which to copy the data. + */ + public copyFrom(src: Vector3D): void; + /** + * Returns a new Vector3D object that is perpendicular (at a right + * angle) to the current Vector3D and another Vector3D object. If the + * returned Vector3D object's coordinates are (0,0,0), then the two + * Vector3D objects are parallel to each other. + * + *

You can use the normalized cross product of two vertices of a + * polygon surface with the normalized vector of the camera or eye + * viewpoint to get a dot product. The value of the dot product can + * identify whether a surface of a three-dimensional object is hidden + * from the viewpoint.

+ * + * @param a A second Vector3D object. + * @returns A new Vector3D object that is perpendicular to the current + * Vector3D object and the Vector3D object specified as the + * parameter. + */ + public crossProduct(a: Vector3D): Vector3D; + /** + * Decrements the value of the x, y, and z elements of the current + * Vector3D object by the values of the x, y, and z elements of + * specified Vector3D object. Unlike the + * Vector3D.subtract() method, the + * decrementBy() method changes the current Vector3D + * object and does not return a new Vector3D object. + * + * @param a The Vector3D object containing the values to subtract from + * the current Vector3D object. + */ + public decrementBy(a: Vector3D): void; + /** + * Returns the distance between two Vector3D objects. The + * distance() method is a static method. You can use it + * directly as a method of the Vector3D class to get the Euclidean + * distance between two three-dimensional points. + * + * @param pt1 A Vector3D object as the first three-dimensional point. + * @param pt2 A Vector3D object as the second three-dimensional point. + * @returns The distance between two Vector3D objects. + */ + static distance(pt1: Vector3D, pt2: Vector3D): number; + /** + * If the current Vector3D object and the one specified as the + * parameter are unit vertices, this method returns the cosine of the + * angle between the two vertices. Unit vertices are vertices that + * point to the same direction but their length is one. They remove the + * length of the vector as a factor in the result. You can use the + * normalize() method to convert a vector to a unit + * vector. + * + *

The dotProduct() method finds the angle between two + * vertices. It is also used in backface culling or lighting + * calculations. Backface culling is a procedure for determining which + * surfaces are hidden from the viewpoint. You can use the normalized + * vertices from the camera, or eye, viewpoint and the cross product of + * the vertices of a polygon surface to get the dot product. If the dot + * product is less than zero, then the surface is facing the camera or + * the viewer. If the two unit vertices are perpendicular to each + * other, they are orthogonal and the dot product is zero. If the two + * vertices are parallel to each other, the dot product is one.

+ * + * @param a The second Vector3D object. + * @returns A scalar which is the dot product of the current Vector3D + * object and the specified Vector3D object. + * + * @see away.geom.Vector3D#crossProduct() + * @see away.geom.Vector3D#normalize() + */ + public dotProduct(a: Vector3D): number; + /** + * Determines whether two Vector3D objects are equal by comparing the + * x, y, and z elements of the current Vector3D object with a + * specified Vector3D object. If the values of these elements are the + * same, the two Vector3D objects are equal. If the second optional + * parameter is set to true, all four elements of the Vector3D objects, + * including the w property, are compared. + */ + /** + * + * @param toCompare The Vector3D object to be compared with the current + * Vector3D object. + * @param allFour An optional parameter that specifies whether the w + * property of the Vector3D objects is used in the + * comparison. + * @returns A value of true if the specified Vector3D object is equal + * to the current Vector3D object; false if it is not equal. + */ + public equals(toCompare: Vector3D, allFour?: boolean): boolean; + /** + * Increments the value of the x, y, and z elements of the current + * Vector3D object by the values of the x, y, and z elements of a + * specified Vector3D object. Unlike the Vector3D.add() + * method, the incrementBy() method changes the current + * Vector3D object and does not return a new Vector3D object. + * + * @param a The Vector3D object to be added to the current Vector3D + * object. + */ + public incrementBy(a: Vector3D): void; + /** + * Compares the elements of the current Vector3D object with the + * elements of a specified Vector3D object to determine whether they + * are nearly equal. The two Vector3D objects are nearly equal if the + * value of all the elements of the two vertices are equal, or the + * result of the comparison is within the tolerance range. The + * difference between two elements must be less than the number + * specified as the tolerance parameter. If the third optional + * parameter is set to true, all four elements of the + * Vector3D objects, including the w property, are + * compared. Otherwise, only the x, y, and z elements are included in + * the comparison. + */ + /** + * + * @param toCompare The Vector3D object to be compared with the current + * Vector3D object. + * @param tolerance A number determining the tolerance factor. If the + * difference between the values of the Vector3D + * element specified in the toCompare parameter and + * the current Vector3D element is less than the + * tolerance number, the two values are considered + * nearly equal. + * @param allFour An optional parameter that specifies whether the w + * property of the Vector3D objects is used in the + * comparison. + * @returns A value of true if the specified Vector3D object is nearly + * equal to the current Vector3D object; false if it is not + * equal. + * + * @see away.geom.Vector3D#equals() + */ + public nearEquals(toCompare: Vector3D, tolerance: number, allFour?: boolean): boolean; + /** + * Sets the current Vector3D object to its inverse. The inverse object + * is also considered the opposite of the original object. The value of + * the x, y, and z properties of the current Vector3D object is changed + * to -x, -y, and -z. + */ + public negate(): void; + /** + * Converts a Vector3D object to a unit vector by dividing the first + * three elements (x, y, z) by the length of the vector. Unit vertices + * are vertices that have a direction but their length is one. They + * simplify vector calculations by removing length as a factor. + */ + /** + * Scales the line segment between(0,0) and the current point to a set + * length. + * + * @param thickness The scaling value. For example, if the current + * Vector3D object is (0,3,4), and you normalize it to + * 1, the point returned is at(0,0.6,0.8). + */ + public normalize(thickness?: number): void; + /** + * Divides the value of the x, y, and + * z properties of the current Vector3D object by the + * value of its w property. + * + *

If the current Vector3D object is the result of multiplying a + * Vector3D object by a projection Matrix3D object, the w property can + * hold the transform value. The project() method then can + * complete the projection by dividing the elements by the + * w property. Use the Matrix3D.rawData + * property to create a projection Matrix3D object.

+ */ + public project(): void; + /** + * Scales the current Vector3D object by a scalar, a magnitude. The + * Vector3D object's x, y, and z elements are multiplied by the scalar + * number specified in the parameter. For example, if the vector is + * scaled by ten, the result is a vector that is ten times longer. The + * scalar can also change the direction of the vector. Multiplying the + * vector by a negative number reverses its direction. + * + * @param s A multiplier (scalar) used to scale a Vector3D object. + + */ + public scaleBy(s: number): void; + /** + * Sets the members of Vector3D to the specified values + * + * @param xa The first element, such as the x coordinate. + * @param ya The second element, such as the y coordinate. + * @param za The third element, such as the z coordinate. + */ + public setTo(xa: number, ya: number, za: number): void; + /** + * Subtracts the value of the x, y, and z elements of the current + * Vector3D object from the values of the x, y, and z elements of + * another Vector3D object. The subtract() method does not + * change the current Vector3D object. Instead, this method returns a + * new Vector3D object with the new values. + * + * @param a The Vector3D object to be subtracted from the current + * Vector3D object. + * @returns A new Vector3D object that is the difference between the + * current Vector3D and the specified Vector3D object. + * + * @see away.geom.Vector3D#decrementBy() + */ + public subtract(a: Vector3D): Vector3D; + /** + * Returns a string representation of the current Vector3D object. The + * string contains the values of the x, y, and z properties. + */ + public toString(): string; + } + export = Vector3D; + +} +declare module "awayjs-core/lib/core/library/AssetLibrary" { + import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + import AssetLibraryBundle = require("awayjs-core/lib/core/library/AssetLibraryBundle"); + import AssetLibraryIterator = require("awayjs-core/lib/core/library/AssetLibraryIterator"); + import AssetLoaderContext = require("awayjs-core/lib/core/library/AssetLoaderContext"); + import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); + import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + /** + * AssetLibrary enforces a singleton pattern and is not intended to be instanced. + * It's purpose is to allow access to the default library bundle through a set of static shortcut methods. + * If you are interested in creating multiple library bundles, please use the getBundle() method. + */ + class AssetLibrary { + /** + * Creates a new AssetLibrary object. + * + */ + constructor(); + /** + * Returns an AssetLibrary bundle instance. If no key is given, returns the default bundle (which is + * similar to using the AssetLibraryBundle as a singleton). To keep several separated library bundles, + * pass a string key to this method to define which bundle should be returned. This is + * referred to as using the AssetLibraryBundle as a multiton. + * + * @param key Defines which multiton instance should be returned. + * @return An instance of the asset library + */ + static getBundle(key?: string): AssetLibraryBundle; + /** + * + */ + static enableParser(parserClass: any): void; + /** + * + */ + static enableParsers(parserClasses: Object[]): void; + /** + * Short-hand for conflictStrategy property on default asset library bundle. + * + * @see AssetLibraryBundle.conflictStrategy + */ + static conflictStrategy : ConflictStrategyBase; + /** + * Short-hand for conflictPrecedence property on default asset library bundle. + * + * @see AssetLibraryBundle.conflictPrecedence + */ + static conflictPrecedence : string; + /** + * Short-hand for createIterator() method on default asset library bundle. + * + * @see AssetLibraryBundle.createIterator() + */ + static createIterator(assetTypeFilter?: string, namespaceFilter?: string, filterFunc?: any): AssetLibraryIterator; + /** + * Short-hand for load() method on default asset library bundle. + * + * @see AssetLibraryBundle.load() + */ + static load(req: URLRequest, context?: AssetLoaderContext, ns?: string, parser?: ParserBase): AssetLoaderToken; + /** + * Short-hand for loadData() method on default asset library bundle. + * + * @see AssetLibraryBundle.loadData() + */ + static loadData(data: any, context?: AssetLoaderContext, ns?: string, parser?: ParserBase): AssetLoaderToken; + static stopLoad(): void; + /** + * Short-hand for getAsset() method on default asset library bundle. + * + * @see AssetLibraryBundle.getAsset() + */ + static getAsset(name: string, ns?: string): IAsset; + /** + * Short-hand for addEventListener() method on default asset library bundle. + */ + static addEventListener(type: string, listener: Function): void; + /** + * Short-hand for removeEventListener() method on default asset library bundle. + */ + static removeEventListener(type: string, listener: Function): void; + /** + * Short-hand for hasEventListener() method on default asset library bundle. + + public static hasEventListener(type:string):boolean + { + return AssetLibrary.getBundle().hasEventListener(type); + } + + public static willTrigger(type:string):boolean + { + return getBundle().willTrigger(type); + } + */ + /** + * Short-hand for addAsset() method on default asset library bundle. + * + * @see AssetLibraryBundle.addAsset() + */ + static addAsset(asset: IAsset): void; + /** + * Short-hand for removeAsset() method on default asset library bundle. + * + * @param asset The asset which should be removed from the library. + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAsset() + */ + static removeAsset(asset: IAsset, dispose?: boolean): void; + /** + * Short-hand for removeAssetByName() method on default asset library bundle. + * + * @param name The name of the asset to be removed. + * @param ns The namespace to which the desired asset belongs. + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAssetByName() + */ + static removeAssetByName(name: string, ns?: string, dispose?: boolean): IAsset; + /** + * Short-hand for removeAllAssets() method on default asset library bundle. + * + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAllAssets() + */ + static removeAllAssets(dispose?: boolean): void; + /** + * Short-hand for removeNamespaceAssets() method on default asset library bundle. + * + * @see AssetLibraryBundle.removeNamespaceAssets() + */ + static removeNamespaceAssets(ns?: string, dispose?: boolean): void; + } + export = AssetLibrary; + +} +declare module "awayjs-core/lib/core/library/AssetLibraryBundle" { + import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + import AssetLibraryIterator = require("awayjs-core/lib/core/library/AssetLibraryIterator"); + import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); + import AssetLoaderContext = require("awayjs-core/lib/core/library/AssetLoaderContext"); + import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + /** + * AssetLibraryBundle enforces a multiton pattern and is not intended to be instanced directly. + * Its purpose is to create a container for 3D data management, both before and after parsing. + * If you are interested in creating multiple library bundles, please use the getInstance() method. + */ + class AssetLibraryBundle extends EventDispatcher { + static _iInstances: Object; + private _loadingSessions; + private _strategy; + private _strategyPreference; + private _assets; + private _assetDictionary; + private _assetDictDirty; + private _loadingSessionsGarbage; + private _gcTimeoutIID; + private _onAssetRenameDelegate; + private _onAssetConflictResolvedDelegate; + private _onResourceCompleteDelegate; + private _onTextureSizeErrorDelegate; + private _onAssetCompleteDelegate; + private _onLoadErrorDelegate; + private _onParseErrorDelegate; + /** + * Creates a new AssetLibraryBundle object. + * + * @param me A multiton enforcer for the AssetLibraryBundle ensuring it cannnot be instanced. + */ + constructor(); + /** + * Returns an AssetLibraryBundle instance. If no key is given, returns the default bundle instance (which is + * similar to using the AssetLibraryBundle as a singleton.) To keep several separated library bundles, + * pass a string key to this method to define which bundle should be returned. This is + * referred to as using the AssetLibrary as a multiton. + * + * @param key Defines which multiton instance should be returned. + * @return An instance of the asset library + */ + static getInstance(key?: string): AssetLibraryBundle; + /** + * + */ + public enableParser(parserClass: Object): void; + /** + * + */ + public enableParsers(parserClasses: Object[]): void; + /** + * Defines which strategy should be used for resolving naming conflicts, when two library + * assets are given the same name. By default, ConflictStrategy.APPEND_NUM_SUFFIX + * is used which means that a numeric suffix is appended to one of the assets. The + * conflictPrecedence property defines which of the two conflicting assets will + * be renamed. + * + * @see naming.ConflictStrategy + * @see AssetLibrary.conflictPrecedence + */ + public conflictStrategy : ConflictStrategyBase; + /** + * Defines which asset should have precedence when resolving a naming conflict between + * two assets of which one has just been renamed by the user or by a parser. By default + * ConflictPrecedence.FAVOR_NEW is used, meaning that the newly renamed + * asset will keep it's new name while the older asset gets renamed to not conflict. + * + * This property is ignored for conflict strategies that do not actually rename an + * asset automatically, such as ConflictStrategy.IGNORE and ConflictStrategy.THROW_ERROR. + * + * @see away.library.ConflictPrecedence + * @see away.library.ConflictStrategy + */ + public conflictPrecedence : string; + /** + * Create an AssetLibraryIterator instance that can be used to iterate over the assets + * in this asset library instance. The iterator can filter assets on asset type and/or + * namespace. A "null" filter value means no filter of that type is used. + * + * @param assetTypeFilter Asset type to filter on (from the AssetType enum class.) Use + * null to not filter on asset type. + * @param namespaceFilter Namespace to filter on. Use null to not filter on namespace. + * @param filterFunc Callback function to use when deciding whether an asset should be + * included in the iteration or not. This needs to be a function that takes a single + * parameter of type IAsset and returns a boolean where true means it should be included. + * + * @see away.library.AssetType + */ + public createIterator(assetTypeFilter?: string, namespaceFilter?: string, filterFunc?: any): AssetLibraryIterator; + /** + * Loads a file and (optionally) all of its dependencies. + * + * @param req The URLRequest object containing the URL of the file to be loaded. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + * @return A handle to the retrieved resource. + */ + public load(req: URLRequest, context?: AssetLoaderContext, ns?: string, parser?: ParserBase): AssetLoaderToken; + /** + * Loads a resource from existing data in memory. + * + * @param data The data object containing all resource information. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + * @return A handle to the retrieved resource. + */ + public loadData(data: any, context?: AssetLoaderContext, ns?: string, parser?: ParserBase): AssetLoaderToken; + /** + * + */ + public getAsset(name: string, ns?: string): IAsset; + /** + * Adds an asset to the asset library, first making sure that it's name is unique + * using the method defined by the conflictStrategy and + * conflictPrecedence properties. + */ + public addAsset(asset: IAsset): void; + /** + * Removes an asset from the library, and optionally disposes that asset by calling + * it's disposeAsset() method (which for most assets is implemented as a default + * version of that type's dispose() method. + * + * @param asset The asset which should be removed from this library. + * @param dispose Defines whether the assets should also be disposed. + */ + public removeAsset(asset: IAsset, dispose?: boolean): void; + /** + * Removes an asset which is specified using name and namespace. + * + * @param name The name of the asset to be removed. + * @param ns The namespace to which the desired asset belongs. + * @param dispose Defines whether the assets should also be disposed. + * + * @see away.library.AssetLibrary.removeAsset() + */ + public removeAssetByName(name: string, ns?: string, dispose?: boolean): IAsset; + /** + * Removes all assets from the asset library, optionally disposing them as they + * are removed. + * + * @param dispose Defines whether the assets should also be disposed. + */ + public removeAllAssets(dispose?: boolean): void; + /** + * Removes all assets belonging to a particular namespace (null for default) + * from the asset library, and optionall disposes them by calling their + * disposeAsset() method. + * + * @param ns The namespace from which all assets should be removed. + * @param dispose Defines whether the assets should also be disposed. + * + * @see away.library.AssetLibrary.removeAsset() + */ + public removeNamespaceAssets(ns?: string, dispose?: boolean): void; + private removeAssetFromDict(asset, autoRemoveEmptyNamespace?); + public stopAllLoadingSessions(): void; + private rehashAssetDict(); + /** + * Called when a an error occurs during loading. + */ + private onLoadError(event); + /** + * Called when a an error occurs during parsing. + */ + private onParseError(event); + private onAssetComplete(event); + private onTextureSizeError(event); + /** + * Called when the resource and all of its dependencies was retrieved. + */ + private onResourceComplete(event); + private loadingSessionGC(); + private killLoadingSession(loader); + private onAssetRename(event); + private onAssetConflictResolved(event); + } + export = AssetLibraryBundle; + +} +declare module "awayjs-core/lib/core/library/AssetLibraryIterator" { + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + class AssetLibraryIterator { + private _assets; + private _filtered; + private _idx; + constructor(assets: IAsset[], assetTypeFilter: string, namespaceFilter: string, filterFunc: any); + public currentAsset : IAsset; + public numAssets : number; + public next(): IAsset; + public reset(): void; + public setIndex(index: number): void; + private filter(assetTypeFilter, namespaceFilter, filterFunc); + } + export = AssetLibraryIterator; + +} +declare module "awayjs-core/lib/core/library/AssetLoader" { + import AssetLoaderContext = require("awayjs-core/lib/core/library/AssetLoaderContext"); + import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); + import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + import ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); + /** + * AssetLoader can load any file format that away.supports (or for which a third-party parser + * has been plugged in) and it's dependencies. Events are dispatched when assets are encountered + * and for when the resource (or it's dependencies) have been loaded. + * + * The AssetLoader will not make assets available in any other way than through the dispatched + * events. To store assets and make them available at any point from any module in an application, + * use the AssetLibrary to load and manage assets. + * + * @see away.library.AssetLibrary + */ + class AssetLoader extends EventDispatcher { + private _context; + private _token; + private _uri; + private _content; + private _materialMode; + private _errorHandlers; + private _parseErrorHandlers; + private _stack; + private _baseDependency; + private _currentDependency; + private _namespace; + private _onReadyForDependenciesDelegate; + private _onParseCompleteDelegate; + private _onParseErrorDelegate; + private _onLoadCompleteDelegate; + private _onLoadErrorDelegate; + private _onTextureSizeErrorDelegate; + private _onAssetCompleteDelegate; + private static _parsers; + /** + * Enables a specific parser. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parser The parser class to enable. + * + * @see away.parsers.Parsers + */ + static enableParser(parser: any): void; + /** + * Enables a list of parsers. + * When no specific parser is set for a loading/parsing opperation, + * AssetLoader can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parsers A Vector of parser classes to enable. + * @see away.parsers.Parsers + */ + static enableParsers(parsers: Object[]): void; + /** + * Returns the base dependency of the loader + */ + public baseDependency : ResourceDependency; + /** + * Create a new ResourceLoadSession object. + */ + constructor(materialMode?: number); + /** + * Loads a file and (optionally) all of its dependencies. + * + * @param req The URLRequest object containing the URL of the file to be loaded. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + */ + public load(req: URLRequest, context?: AssetLoaderContext, ns?: string, parser?: ParserBase): AssetLoaderToken; + /** + * Loads a resource from already loaded data. + * + * @param data The data object containing all resource information. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + */ + public loadData(data: any, id: string, context?: AssetLoaderContext, ns?: string, parser?: ParserBase): AssetLoaderToken; + /** + * Recursively retrieves the next to-be-loaded and parsed dependency on the stack, or pops the list off the + * stack when complete and continues on the top set. + * @param parser The parser that will translate the data into a usable resource. + */ + private retrieveNext(parser?); + /** + * Retrieves a single dependency. + * @param parser The parser that will translate the data into a usable resource. + */ + private retrieveDependency(dependency); + private joinUrl(base, end); + private resolveDependencyUrl(dependency); + private retrieveParserDependencies(); + private resolveParserDependencies(); + /** + * Called when a single dependency loading failed, and pushes further dependencies onto the stack. + * @param event + */ + private onLoadError(event); + /** + * Called when a dependency parsing failed, and dispatches a ParserEvent.PARSE_ERROR + * @param event + */ + private onParseError(event); + private onAssetComplete(event); + private onReadyForDependencies(event); + /** + * Called when a single dependency was parsed, and pushes further dependencies onto the stack. + * @param event + */ + private onLoadComplete(event); + /** + * Called when parsing is complete. + */ + private onParseComplete(event); + /** + * Called when an image is too large or it's dimensions are not a power of 2 + * @param event + */ + private onTextureSizeError(event); + private addEventListeners(loader); + private removeEventListeners(loader); + public stop(): void; + private dispose(); + /** + * @private + * This method is used by other loader classes (e.g. Loader3D and AssetLibraryBundle) to + * add error event listeners to the AssetLoader instance. This system is used instead of + * the regular EventDispatcher system so that the AssetLibrary error handler can be sure + * that if hasEventListener() returns true, it's client code that's listening for the + * event. Secondly, functions added as error handler through this custom method are + * expected to return a boolean value indicating whether the event was handled (i.e. + * whether they in turn had any client code listening for the event.) If no handlers + * return true, the AssetLoader knows that the event wasn't handled and will throw an RTE. + */ + public _iAddParseErrorHandler(handler: any): void; + public _iAddErrorHandler(handler: any): void; + /** + * Guesses the parser to be used based on the file contents. + * @param data The data to be parsed. + * @param uri The url or id of the object to be parsed. + * @return An instance of the guessed parser. + */ + private getParserFromData(data); + /** + * Initiates parsing of the loaded dependency. + * + * @param The dependency to be parsed. + */ + private parseDependency(dependency); + /** + * Guesses the parser to be used based on the file extension. + * @return An instance of the guessed parser. + */ + private getParserFromSuffix(url); + } + export = AssetLoader; + +} +declare module "awayjs-core/lib/core/library/AssetLoaderContext" { + class AssetLoaderContext { + static UNDEFINED: number; + static SINGLEPASS_MATERIALS: number; + static MULTIPASS_MATERIALS: number; + private _includeDependencies; + private _dependencyBaseUrl; + private _embeddedDataByUrl; + private _remappedUrls; + private _materialMode; + private _overrideAbsPath; + private _overrideFullUrls; + /** + * AssetLoaderContext provides configuration for the AssetLoader load() and parse() operations. + * Use it to configure how (and if) dependencies are loaded, or to map dependency URLs to + * embedded data. + * + * @see away.loading.AssetLoader + */ + constructor(includeDependencies?: boolean, dependencyBaseUrl?: string); + /** + * Defines whether dependencies (all files except the one at the URL given to the load() or + * parseData() operations) should be automatically loaded. Defaults to true. + */ + public includeDependencies : boolean; + /** + * MaterialMode defines, if the Parser should create SinglePass or MultiPass Materials + * Options: + * 0 (Default / undefined) - All Parsers will create SinglePassMaterials, but the AWD2.1parser will create Materials as they are defined in the file + * 1 (Force SinglePass) - All Parsers create SinglePassMaterials + * 2 (Force MultiPass) - All Parsers will create MultiPassMaterials + * + */ + public materialMode : number; + /** + * A base URL that will be prepended to all relative dependency URLs found in a loaded resource. + * Absolute paths will not be affected by the value of this property. + */ + public dependencyBaseUrl : string; + /** + * Defines whether absolute paths (defined as paths that begin with a "/") should be overridden + * with the dependencyBaseUrl defined in this context. If this is true, and the base path is + * "base", /path/to/asset.jpg will be resolved as base/path/to/asset.jpg. + */ + public overrideAbsolutePaths : boolean; + /** + * Defines whether "full" URLs (defined as a URL that includes a scheme, e.g. http://) should be + * overridden with the dependencyBaseUrl defined in this context. If this is true, and the base + * path is "base", http://example.com/path/to/asset.jpg will be resolved as base/path/to/asset.jpg. + */ + public overrideFullURLs : boolean; + /** + * Map a URL to another URL, so that files that are referred to by the original URL will instead + * be loaded from the new URL. Use this when your file structure does not match the one that is + * expected by the loaded file. + * + * @param originalUrl The original URL which is referenced in the loaded resource. + * @param newUrl The URL from which away.should load the resource instead. + * + * @see mapUrlToData() + */ + public mapUrl(originalUrl: string, newUrl: string): void; + /** + * Map a URL to embedded data, so that instead of trying to load a dependency from the URL at + * which it's referenced, the dependency data will be retrieved straight from the memory instead. + * + * @param originalUrl The original URL which is referenced in the loaded resource. + * @param data The embedded data. Can be ByteArray or a class which can be used to create a bytearray. + */ + public mapUrlToData(originalUrl: string, data: any): void; + /** + * @private + * Defines whether embedded data has been mapped to a particular URL. + */ + public _iHasDataForUrl(url: string): boolean; + /** + * @private + * Returns embedded data for a particular URL. + */ + public _iGetDataForUrl(url: string): any; + /** + * @private + * Defines whether a replacement URL has been mapped to a particular URL. + */ + public _iHasMappingForUrl(url: string): boolean; + /** + * @private + * Returns new (replacement) URL for a particular original URL. + */ + public _iGetRemappedUrl(originalUrl: string): string; + } + export = AssetLoaderContext; + +} +declare module "awayjs-core/lib/core/library/AssetLoaderToken" { + import AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + /** + * Instances of this class are returned as tokens by loading operations + * to provide an object on which events can be listened for in cases where + * the actual asset loader is not directly available (e.g. when using the + * AssetLibrary to perform the load.) + * + * By listening for events on this class instead of directly on the + * AssetLibrary, one can distinguish different loads from each other. + * + * The token will dispatch all events that the original AssetLoader dispatches, + * while not providing an interface to obstruct the load and is as such a + * safer return value for loader wrappers than the loader itself. + */ + class AssetLoaderToken extends EventDispatcher { + public _iLoader: AssetLoader; + constructor(loader: AssetLoader); + public addEventListener(type: string, listener: Function): void; + public removeEventListener(type: string, listener: Function): void; + public hasEventListener(type: string, listener?: Function): boolean; + } + export = AssetLoaderToken; + +} +declare module "awayjs-core/lib/core/library/AssetType" { + class AssetType { + static ANIMATION_NODE: string; + static ANIMATION_SET: string; + static ANIMATION_STATE: string; + static ANIMATOR: string; + static BILLBOARD: string; + static CAMERA: string; + static CONTAINER: string; + static EFFECTS_METHOD: string; + static GEOMETRY: string; + static LINE_SEGMENT: string; + static LIGHT: string; + static LIGHT_PICKER: string; + static MATERIAL: string; + static MESH: string; + static TRIANGLE_SUB_MESH: string; + static LINE_SUB_MESH: string; + static PRIMITIVE_PREFAB: string; + static SHADOW_MAP_METHOD: string; + static SKELETON: string; + static SKELETON_POSE: string; + static SKYBOX: string; + static STATE_TRANSITION: string; + static TEXTURE: string; + static TEXTURE_PROJECTOR: string; + } + export = AssetType; + +} +declare module "awayjs-core/lib/core/library/ConflictPrecedence" { + /** + * Enumaration class for precedence when resolving naming conflicts in the library. + * + * @see away.library.AssetLibrary.conflictPrecedence + * @see away.library.AssetLibrary.conflictStrategy + * @see away.library.naming.ConflictStrategy + */ + class ConflictPrecedence { + /** + * Signals that in a conflict, the previous owner of the conflicting name + * should be favored (and keep it's name) and that the newly renamed asset + * is reverted to a non-conflicting name. + */ + static FAVOR_OLD: string; + /** + * Signales that in a conflict, the newly renamed asset is favored (and keeps + * it's newly defined name) and that the previous owner of that name gets + * renamed to a non-conflicting name. + */ + static FAVOR_NEW: string; + } + export = ConflictPrecedence; + +} +declare module "awayjs-core/lib/core/library/ConflictStrategy" { + import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + /** + * Enumeration class for bundled conflict strategies. Set one of these values (or an + * instance of a self-defined sub-class of ConflictStrategyBase) to the conflictStrategy + * property on an AssetLibrary to define how that library resolves naming conflicts. + * + * The value of the AssetLibrary.conflictPrecedence property defines which + * of the conflicting assets will get to keep it's name, and which is renamed (if any.) + * + * @see away.library.AssetLibrary.conflictStrategy + * @see away.library.naming.ConflictStrategyBase + */ + class ConflictStrategy { + /** + * Specifies that in case of a naming conflict, one of the assets will be renamed and + * a numeric suffix appended to the base name. + */ + static APPEND_NUM_SUFFIX: ConflictStrategyBase; + /** + * Specifies that naming conflicts should be ignored. This is not recommended in most + * cases, unless it can be 100% guaranteed that the application does not cause naming + * conflicts in the library (i.e. when an app-level system is in place to prevent this.) + */ + static IGNORE: ConflictStrategyBase; + /** + * Specifies that an error should be thrown if a naming conflict is discovered. Use this + * to be 100% sure that naming conflicts never occur unnoticed, and when it's undesirable + * to have the library automatically rename assets to avoid such conflicts. + */ + static THROW_ERROR: ConflictStrategyBase; + constructor(include?: ConflictStrategyBase); + } + export = ConflictStrategy; + +} +declare module "awayjs-core/lib/core/library/ConflictStrategyBase" { + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + /** + * Abstract base class for naming conflict resolution classes. Extend this to create a + * strategy class which the asset library can use to resolve asset naming conflicts, or + * use one of the bundled concrete strategy classes: + * + *
    + *
  • IgnoreConflictStrategy (ConflictStrategy.IGNORE)
  • + *
  • ErrorConflictStrategy (ConflictStrategy.THROW_ERROR)
  • + *
  • NumSuffixConflictStrategy (ConflictStrategy.APPEND_NUM_SUFFIX)
  • + *
+ * + * @see away.library.AssetLibrary.conflictStrategy + * @see away.library.ConflictStrategy + * @see away.library.IgnoreConflictStrategy + * @see away.library.ErrorConflictStrategy + * @see away.library.NumSuffixConflictStrategy + */ + class ConflictStrategyBase { + constructor(); + /** + * Resolve a naming conflict between two assets. Must be implemented by concrete strategy + * classes. + */ + public resolveConflict(changedAsset: IAsset, oldAsset: IAsset, assetsDictionary: Object, precedence: string): void; + /** + * Create instance of this conflict strategy. Used internally by the AssetLibrary to + * make sure the same strategy instance is not used in all AssetLibrary instances, which + * would break any state caching that happens inside the strategy class. + */ + public create(): ConflictStrategyBase; + /** + * Provided as a convenience method for all conflict strategy classes, as a way to finalize + * the conflict resolution by applying the new names and dispatching the correct events. + */ + public _pUpdateNames(ns: string, nonConflictingName: string, oldAsset: IAsset, newAsset: IAsset, assetsDictionary: Object, precedence: string): void; + } + export = ConflictStrategyBase; + +} +declare module "awayjs-core/lib/core/library/ErrorConflictStrategy" { + import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + class ErrorConflictStrategy extends ConflictStrategyBase { + constructor(); + public resolveConflict(changedAsset: IAsset, oldAsset: IAsset, assetsDictionary: Object, precedence: string): void; + public create(): ConflictStrategyBase; + } + export = ErrorConflictStrategy; + +} +declare module "awayjs-core/lib/core/library/IAsset" { + import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); + interface IAsset extends IEventDispatcher { + /** + * + */ + name: string; + /** + * + */ + id: number; + /** + * + */ + assetNamespace: string; + /** + * + */ + assetType: string; + /** + * + */ + assetFullPath: string[]; + /** + * + * @param name + * @param ns + */ + assetPathEquals(name: string, ns: string): boolean; + /** + * + * @param name + * @param ns + * @param overrideOriginal + */ + resetAssetPath(name: string, ns: string, overrideOriginal?: boolean): void; + /** + * + */ + dispose(): any; + } + export = IAsset; + +} +declare module "awayjs-core/lib/core/library/IDUtil" { + class IDUtil { + /** + * @private + * Char codes for 0123456789ABCDEF + */ + private static ALPHA_CHAR_CODES; + /** + * Generates a UID (unique identifier) based on ActionScript's + * pseudo-random number generator and the current time. + * + *

The UID has the form + * "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" + * where X is a hexadecimal digit (0-9, A-F).

+ * + *

This UID will not be truly globally unique; but it is the best + * we can do without player support for UID generation.

+ * + * @return The newly-generated UID. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + static createUID(): string; + } + export = IDUtil; + +} +declare module "awayjs-core/lib/core/library/IgnoreConflictStrategy" { + import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + class IgnoreConflictStrategy extends ConflictStrategyBase { + constructor(); + public resolveConflict(changedAsset: IAsset, oldAsset: IAsset, assetsDictionary: Object, precedence: string): void; + public create(): ConflictStrategyBase; + } + export = IgnoreConflictStrategy; + +} +declare module "awayjs-core/lib/core/library/NamedAssetBase" { + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + class NamedAssetBase extends EventDispatcher { + static ID_COUNT: number; + private _originalName; + private _namespace; + private _name; + private _id; + private _full_path; + static DEFAULT_NAMESPACE: string; + constructor(name?: string); + /** + * + */ + public assetType : string; + /** + * The original name used for this asset in the resource (e.g. file) in which + * it was found. This may not be the same as name, which may + * have changed due to of a name conflict. + */ + public originalName : string; + /** + * A unique id for the asset, used to identify assets in an associative array + */ + public id : number; + public name : string; + public dispose(): void; + public assetNamespace : string; + public assetFullPath : string[]; + public assetPathEquals(name: string, ns: string): boolean; + public resetAssetPath(name: string, ns?: string, overrideOriginal?: boolean): void; + private updateFullPath(); + } + export = NamedAssetBase; + +} +declare module "awayjs-core/lib/core/library/NumSuffixConflictStrategy" { + import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + class NumSuffixConflictStrategy extends ConflictStrategyBase { + private _separator; + private _next_suffix; + constructor(separator?: string); + public resolveConflict(changedAsset: IAsset, oldAsset: IAsset, assetsDictionary: Object, precedence: string): void; + public create(): ConflictStrategyBase; + } + export = NumSuffixConflictStrategy; + +} +declare module "awayjs-core/lib/core/net/CrossDomainPolicy" { + class CrossDomainPolicy { + static ANONYMOUS: string; + static USE_CREDENTIALS: string; + } + export = CrossDomainPolicy; + +} +declare module "awayjs-core/lib/core/net/URLLoader" { + import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + /** + * The URLLoader is used to load a single file, as part of a resource. + * + * While URLLoader can be used directly, e.g. to create a third-party asset + * management system, it's recommended to use any of the classes Loader3D, AssetLoader + * and AssetLibrary instead in most cases. + * + * @see AssetLoader + * @see away.library.AssetLibrary + */ + class URLLoader extends EventDispatcher { + private _XHR; + private _bytesLoaded; + private _bytesTotal; + private _dataFormat; + private _loadError; + private _request; + private _data; + private _loadStartEvent; + private _loadErrorEvent; + private _loadCompleteEvent; + private _progressEvent; + /** + * Creates a new URLLoader object. + */ + constructor(); + /** + * + */ + public url : string; + /** + * + */ + public data : any; + /** + * + * URLLoaderDataFormat.BINARY + * URLLoaderDataFormat.TEXT + * URLLoaderDataFormat.VARIABLES + * + * @param format + */ + public dataFormat : string; + /** + * + * @returns {number} + */ + public bytesLoaded : number; + /** + * + * @returns {number} + */ + public bytesTotal : number; + /** + * Load a resource from a file. + * + * @param request The URLRequest object containing the URL of the object to be loaded. + */ + public load(request: URLRequest): void; + /** + * + */ + public close(): void; + /** + * + */ + public dispose(): void; + /** + * + * @param xhr + * @param responseType + */ + private setResponseType(xhr, responseType); + /** + * + * @param request {URLRequest} + */ + private getRequest(request); + /** + * + * @param request {URLRequest} + */ + private postRequest(request); + /** + * + * @param error {XMLHttpRequestException} + */ + private handleXmlHttpRequestException(error); + /** + * + */ + private initXHR(); + /** + * + */ + private disposeXHR(); + /** + * + * @param source + */ + public decodeURLVariables(source: string): Object; + /** + * When XHR state changes + * @param event + */ + private onReadyStateChange(event); + /** + * When the request has completed, regardless of whether or not it was successful. + * @param event + */ + private onLoadEnd(event); + /** + * When the author specified timeout has passed before the request could complete. + * @param event + */ + private onTimeOut(event); + /** + * When the request has been aborted, either by invoking the abort() method or navigating away from the page. + * @param event + */ + private onAbort(event); + /** + * While loading and sending data. + * @param event + */ + private onProgress(event); + /** + * When the request starts. + * @param event + */ + private onLoadStart(event); + /** + * When the request has successfully completed. + * @param event + */ + private onLoadComplete(event); + /** + * When the request has failed. ( due to network issues ). + * @param event + */ + private onLoadError(event); + } + export = URLLoader; + +} +declare module "awayjs-core/lib/core/net/URLLoaderDataFormat" { + class URLLoaderDataFormat { + /** + * TEXT + * @type {string} + */ + static TEXT: string; + /** + * Variables / Value Pairs + * @type {string} + */ + static VARIABLES: string; + /** + * + * @type {string} + */ + static BLOB: string; + /** + * + * @type {string} + */ + static ARRAY_BUFFER: string; + /** + * + * @type {string} + */ + static BINARY: string; + } + export = URLLoaderDataFormat; + +} +declare module "awayjs-core/lib/core/net/URLRequest" { + class URLRequest { + /** + * Object containing data to be transmited with URL Request ( URL Variables / binary / string ) + * + */ + public data: any; + /** + * + * away.net.URLRequestMethod.GET + * away.net.URLRequestMethod.POST + * + * @type {string} + */ + public method: string; + /** + * Use asynchronous XMLHttpRequest + * @type {boolean} + */ + public async: boolean; + /** + * + */ + private _url; + /** + + * @param url + */ + constructor(url?: string); + /** + * + * @returns {string} + */ + /** + * + * @param value + */ + public url : string; + /** + * dispose + */ + public dispose(): void; + } + export = URLRequest; + +} +declare module "awayjs-core/lib/core/net/URLRequestMethod" { + class URLRequestMethod { + /** + * + * @type {string} + */ + static POST: string; + /** + * + * @type {string} + */ + static GET: string; + } + export = URLRequestMethod; + +} +declare module "awayjs-core/lib/core/net/URLVariables" { + class URLVariables { + private _variables; + /** + * + * @param source + */ + constructor(source?: string); + /** + * + * @param source + */ + public decode(source: string): void; + /** + * + * @returns {string} + */ + public toString(): string; + /** + * + * @returns {Object} + */ + /** + * + * @returns {Object} + */ + public variables : Object; + /** + * + * @returns {Object} + */ + public formData : FormData; + } + export = URLVariables; + +} +declare module "awayjs-core/lib/core/partition/CameraNode" { + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.partition.CameraNode + */ + class CameraNode extends EntityNode { + constructor(camera: IEntity); + /** + * @inheritDoc + */ + public acceptTraverser(traverser: ICollector): void; + } + export = CameraNode; + +} +declare module "awayjs-core/lib/core/partition/DirectionalLightNode" { + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.partition.DirectionalLightNode + */ + class DirectionalLightNode extends EntityNode { + private _directionalLight; + /** + * + * @param directionalLight + */ + constructor(directionalLight: IEntity); + /** + * @inheritDoc + */ + public acceptTraverser(traverser: ICollector): void; + /** + * + * @returns {boolean} + */ + public isCastingShadow(): boolean; + } + export = DirectionalLightNode; + +} +declare module "awayjs-core/lib/core/partition/EntityNode" { + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.partition.EntityNode + */ + class EntityNode extends NodeBase { + private _entity; + public _iUpdateQueueNext: EntityNode; + constructor(entity: IEntity); + public entity : IEntity; + public removeFromParent(): void; + /** + * + * @returns {boolean} + */ + public isCastingShadow(): boolean; + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + */ + public isInFrustum(planes: Plane3D[], numPlanes: number): boolean; + /** + * @inheritDoc + */ + public acceptTraverser(traverser: ICollector): void; + /** + * @inheritDoc + */ + public isIntersectingRay(rayPosition: Vector3D, rayDirection: Vector3D): boolean; + /** + * + * @protected + */ + public _pCreateBoundsPrimitive(): IEntity; + } + export = EntityNode; + +} +declare module "awayjs-core/lib/core/partition/LightProbeNode" { + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.partition.LightProbeNode + */ + class LightProbeNode extends EntityNode { + private _lightProbe; + /** + * + * @param lightProbe + */ + constructor(lightProbe: IEntity); + /** + * @inheritDoc + */ + public acceptTraverser(traverser: ICollector): void; + /** + * + * @returns {boolean} + */ + public isCastingShadow(): boolean; + } + export = LightProbeNode; + +} +declare module "awayjs-core/lib/core/partition/NodeBase" { + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.partition.NodeBase + */ + class NodeBase { + private _boundsChildrenVisible; + private _explicitBoundsVisible; + private _implicitBoundsVisible; + public _iParent: NodeBase; + public _pChildNodes: NodeBase[]; + public _pNumChildNodes: number; + public _pBoundsPrimitive: IEntity; + public _iNumEntities: number; + public _iCollectionMark: number; + /** + * + */ + public boundsVisible : boolean; + public boundsChildrenVisible : boolean; + /** + * + */ + public parent : NodeBase; + /** + * + * @protected + */ + public _pNumEntities : number; + /** + * + */ + constructor(); + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + * @internal + */ + public isInFrustum(planes: Plane3D[], numPlanes: number): boolean; + /** + * + * @param rayPosition + * @param rayDirection + * @returns {boolean} + */ + public isIntersectingRay(rayPosition: Vector3D, rayDirection: Vector3D): boolean; + /** + * + * @returns {boolean} + */ + public isCastingShadow(): boolean; + /** + * + * @param entity + * @returns {away.partition.NodeBase} + */ + public findPartitionForEntity(entity: IEntity): NodeBase; + /** + * + * @param traverser + */ + public acceptTraverser(traverser: ICollector): void; + /** + * + * @protected + */ + public _pCreateBoundsPrimitive(): IEntity; + /** + * + * @param node + * @internal + */ + public iAddNode(node: NodeBase): void; + /** + * + * @param node + * @internal + */ + public iRemoveNode(node: NodeBase): void; + private _iUpdateImplicitBoundsVisible(value); + /** + * @internal + */ + public _iIsBoundsVisible(): boolean; + public _iUpdateEntityBounds(): void; + } + export = NodeBase; + +} +declare module "awayjs-core/lib/core/partition/NullNode" { + /** + * @class away.partition.NullNode + */ + class NullNode { + constructor(); + } + export = NullNode; + +} +declare module "awayjs-core/lib/core/partition/Partition" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + /** + * @class away.partition.Partition + */ + class Partition { + public _rootNode: NodeBase; + private _updatesMade; + private _updateQueue; + constructor(rootNode: NodeBase); + public rootNode : NodeBase; + public traverse(traverser: ICollector): void; + public iMarkForUpdate(entity: DisplayObject): void; + public iRemoveEntity(entity: DisplayObject): void; + private updateEntities(); + } + export = Partition; + +} +declare module "awayjs-core/lib/core/partition/PointLightNode" { + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.partition.PointLightNode + */ + class PointLightNode extends EntityNode { + private _pointLight; + /** + * + * @param pointLight + */ + constructor(pointLight: IEntity); + /** + * @inheritDoc + */ + public acceptTraverser(traverser: ICollector): void; + /** + * + * @returns {boolean} + */ + public isCastingShadow(): boolean; + } + export = PointLightNode; + +} +declare module "awayjs-core/lib/core/partition/SkyboxNode" { + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * SkyboxNode is a space partitioning leaf node that contains a Skybox object. + * + * @class away.partition.SkyboxNode + */ + class SkyboxNode extends EntityNode { + private _skyBox; + /** + * Creates a new SkyboxNode object. + * @param skyBox The Skybox to be contained in the node. + */ + constructor(skyBox: IEntity); + /** + * @inheritDoc + */ + public acceptTraverser(traverser: ICollector): void; + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + */ + public isInFrustum(planes: Plane3D[], numPlanes: number): boolean; + } + export = SkyboxNode; + +} +declare module "awayjs-core/lib/core/pick/IPicker" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import View = require("awayjs-core/lib/containers/View"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + /** + * Provides an interface for picking objects that can pick 3d objects from a view or scene. + * + * @interface away.pick.IPicker + */ + interface IPicker { + /** + * Gets the collision object from the screen coordinates of the picking ray. + * + * @param x The x coordinate of the picking ray in screen-space. + * @param y The y coordinate of the picking ray in screen-space. + * @param view The view on which the picking object acts. + */ + getViewCollision(x: number, y: number, view: View): PickingCollisionVO; + /** + * Gets the collision object from the scene position and direction of the picking ray. + * + * @param position The position of the picking ray in scene-space. + * @param direction The direction of the picking ray in scene-space. + * @param scene The scene on which the picking object acts. + */ + getSceneCollision(position: Vector3D, direction: Vector3D, scene: Scene): PickingCollisionVO; + /** + * Determines whether the picker takes account of the mouseEnabled properties of entities. Defaults to true. + */ + onlyMouseEnabled: boolean; + /** + * Disposes memory used by the IPicker object + */ + dispose(): any; + } + export = IPicker; + +} +declare module "awayjs-core/lib/core/pick/IPickingCollider" { + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * Provides an interface for picking colliders that can be assigned to individual entities in a scene for specific picking behaviour. + * Used with the RaycastPicker picking object. + * + * @see away.entities.Entity#pickingCollider + * @see away.pick.RaycastPicker + * + * @interface away.pick.IPickingCollider + */ + interface IPickingCollider { + /** + * Sets the position and direction of a picking ray in local coordinates to the entity. + * + * @param localDirection The position vector in local coordinates + * @param localPosition The direction vector in local coordinates + */ + setLocalRay(localPosition: Vector3D, localDirection: Vector3D): any; + /** + * Tests a Billboard object for a collision with the picking ray. + * + * @param entity The entity instance to be tested. + * @param pickingCollisionVO The collision object used to store the collision results + * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray. + */ + testBillboardCollision(entity: IEntity, pickingCollisionVO: PickingCollisionVO, shortestCollisionDistance: number): boolean; + /** + * Tests a Mesh object for a collision with the picking ray. + * + * @param entity The entity instance to be tested. + * @param pickingCollisionVO The collision object used to store the collision results + * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray. + * @param findClosest + */ + testMeshCollision(entity: IEntity, pickingCollisionVO: PickingCollisionVO, shortestCollisionDistance: number, findClosest: boolean): boolean; + } + export = IPickingCollider; + +} +declare module "awayjs-core/lib/core/pick/PickingCollisionVO" { + import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import Point = require("awayjs-core/lib/core/geom/Point"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + /** + * Value object for a picking collision returned by a picking collider. Created as unique objects on display objects + * + * @see away.base.DisplayObject#pickingCollisionVO + * @see away.core.pick.IPickingCollider + * + * @class away.pick.PickingCollisionVO + */ + class PickingCollisionVO { + /** + * The display object to which this collision object belongs. + */ + public displayObject: DisplayObject; + /** + * The local position of the collision on the entity's surface. + */ + public localPosition: Vector3D; + /** + * The local normal vector at the position of the collision. + */ + public localNormal: Vector3D; + /** + * The uv coordinate at the position of the collision. + */ + public uv: Point; + /** + * The index of the face where the event took pl ace. + */ + public index: number; + /** + * The starting position of the colliding ray in local coordinates. + */ + public localRayPosition: Vector3D; + /** + * The direction of the colliding ray in local coordinates. + */ + public localRayDirection: Vector3D; + /** + * The starting position of the colliding ray in scene coordinates. + */ + public rayPosition: Vector3D; + /** + * The direction of the colliding ray in scene coordinates. + */ + public rayDirection: Vector3D; + /** + * Determines if the ray position is contained within the entity bounds. + * + * @see away3d.entities.Entity#bounds + */ + public rayOriginIsInsideBounds: boolean; + /** + * The distance along the ray from the starting position to the calculated intersection entry point with the entity. + */ + public rayEntryDistance: number; + /** + * The material ownwer associated with a collision. + */ + public materialOwner: IMaterialOwner; + /** + * Creates a new PickingCollisionVO object. + * + * @param entity The entity to which this collision object belongs. + */ + constructor(displayObject: DisplayObject); + } + export = PickingCollisionVO; + +} +declare module "awayjs-core/lib/core/pick/RaycastPicker" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import View = require("awayjs-core/lib/containers/View"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import IPicker = require("awayjs-core/lib/core/pick/IPicker"); + import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + /** + * Picks a 3d object from a view or scene by 3D raycast calculations. + * Performs an initial coarse boundary calculation to return a subset of entities whose bounding volumes intersect with the specified ray, + * then triggers an optional picking collider on individual entity objects to further determine the precise values of the picking ray collision. + * + * @class away.pick.RaycastPicker + */ + class RaycastPicker implements IPicker { + private _findClosestCollision; + private _raycastCollector; + private _ignoredEntities; + private _onlyMouseEnabled; + private _entities; + private _numEntities; + private _hasCollisions; + /** + * @inheritDoc + */ + public onlyMouseEnabled : boolean; + /** + * Creates a new RaycastPicker object. + * + * @param findClosestCollision Determines whether the picker searches for the closest bounds collision along the ray, + * or simply returns the first collision encountered. Defaults to false. + */ + constructor(findClosestCollision?: boolean); + /** + * @inheritDoc + */ + public getViewCollision(x: number, y: number, view: View): PickingCollisionVO; + /** + * @inheritDoc + */ + public getSceneCollision(rayPosition: Vector3D, rayDirection: Vector3D, scene: Scene): PickingCollisionVO; + public setIgnoreList(entities: any): void; + private isIgnored(entity); + private sortOnNearT(entity1, entity2); + private getPickingCollisionVO(collector); + private updateLocalPosition(pickingCollisionVO); + public dispose(): void; + } + export = RaycastPicker; + +} +declare module "awayjs-core/lib/core/pool/CSSBillboardRenderable" { + import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); + import Billboard = require("awayjs-core/lib/entities/Billboard"); + /** + * @class away.pool.RenderableListItem + */ + class CSSBillboardRenderable extends CSSRenderableBase { + static id: string; + constructor(pool: RenderablePool, billboard: Billboard); + } + export = CSSBillboardRenderable; + +} +declare module "awayjs-core/lib/core/pool/CSSLineSegmentRenderable" { + import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); + import LineSegment = require("awayjs-core/lib/entities/LineSegment"); + /** + * @class away.pool.RenderableListItem + */ + class CSSLineSegmentRenderable extends CSSRenderableBase { + static id: string; + constructor(pool: RenderablePool, lineSegment: LineSegment); + } + export = CSSLineSegmentRenderable; + +} +declare module "awayjs-core/lib/core/pool/CSSRenderableBase" { + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.pool.RenderableListItem + */ + class CSSRenderableBase implements IRenderable { + /** + * + */ + private _pool; + /** + * + */ + public next: CSSRenderableBase; + /** + * + */ + public materialId: number; + /** + * + */ + public renderOrderId: number; + /** + * + */ + public zIndex: number; + /** + * + */ + public cascaded: boolean; + /** + * + */ + public renderSceneTransform: Matrix3D; + /** + * + */ + public sourceEntity: IEntity; + /** + * + */ + public materialOwner: IMaterialOwner; + /** + * + */ + public htmlElement: HTMLElement; + /** + * + * @param sourceEntity + * @param material + * @param animator + */ + constructor(pool: RenderablePool, sourceEntity: IEntity, materialOwner: IMaterialOwner); + /** + * + */ + public dispose(): void; + /** + * + */ + public invalidateGeometry(): void; + /** + * + */ + public invalidateIndexData(): void; + /** + * + */ + public invalidateVertexData(dataType: string): void; + } + export = CSSRenderableBase; + +} +declare module "awayjs-core/lib/core/pool/CSSSkyboxRenderable" { + import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); + import Skybox = require("awayjs-core/lib/entities/Skybox"); + /** + * @class away.pool.CSSSkyboxRenderable + */ + class CSSSkyboxRenderable extends CSSRenderableBase { + static id: string; + constructor(pool: RenderablePool, skyBox: Skybox); + } + export = CSSSkyboxRenderable; + +} +declare module "awayjs-core/lib/core/pool/EntityListItem" { + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.pool.EntityListItem + */ + class EntityListItem { + /** + * + */ + public entity: IEntity; + /** + * + */ + public next: EntityListItem; + } + export = EntityListItem; + +} +declare module "awayjs-core/lib/core/pool/EntityListItemPool" { + import EntityListItem = require("awayjs-core/lib/core/pool/EntityListItem"); + /** + * @class away.pool.EntityListItemPool + */ + class EntityListItemPool { + private _pool; + private _index; + private _poolSize; + /** + * + */ + constructor(); + /** + * + */ + public getItem(): EntityListItem; + /** + * + */ + public freeAll(): void; + public dispose(): void; + } + export = EntityListItemPool; + +} +declare module "awayjs-core/lib/core/pool/IMaterialData" { + /** + * IMaterialData is an interface for classes that are used in the rendering pipeline to render the + * contents of a texture + * + * @class away.pool.IMaterialData + */ + interface IMaterialData { + /** + * + */ + dispose(): any; + /** + * + */ + invalidateMaterial(): any; + /** + * + */ + invalidateAnimation(): any; + } + export = IMaterialData; + +} +declare module "awayjs-core/lib/core/pool/IMaterialPassData" { + import IMaterialPass = require("awayjs-core/lib/materials/passes/IMaterialPass"); + /** + * IMaterialPassData is an interface for classes that are used in the rendering pipeline to render the + * contents of a material pass + * + * @class away.pool.IMaterialPassData + */ + interface IMaterialPassData { + /** + * + */ + materialPass: IMaterialPass; + /** + * + */ + dispose(): any; + /** + * + */ + invalidate(): any; + } + export = IMaterialPassData; + +} +declare module "awayjs-core/lib/core/pool/IRenderable" { + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * IRenderable is an interface for classes that are used in the rendering pipeline to render the + * contents of a partition + * + * @class away.render.IRenderable + */ + interface IRenderable { + /** + * + */ + next: IRenderable; + /** + * + */ + materialId: number; + /** + * + */ + materialOwner: IMaterialOwner; + /** + * + */ + sourceEntity: IEntity; + /** + * + */ + renderOrderId: number; + /** + * + */ + zIndex: number; + /** + * + */ + dispose(): any; + /** + * + */ + invalidateGeometry(): any; + /** + * + */ + invalidateIndexData(): any; + /** + * + */ + invalidateVertexData(dataType: string): any; + } + export = IRenderable; + +} +declare module "awayjs-core/lib/core/pool/IRenderableClass" { + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); + /** + * IRenderableClass is an interface for the constructable class definition IRenderable that is used to + * create renderable objects in the rendering pipeline to render the contents of a partition + * + * @class away.render.IRenderableClass + */ + interface IRenderableClass { + /** + * + */ + id: string; + /** + * + */ + new(pool: RenderablePool, materialOwner: IMaterialOwner): IRenderable; + } + export = IRenderableClass; + +} +declare module "awayjs-core/lib/core/pool/ITextureData" { + /** + * ITextureData is an interface for classes that are used in the rendering pipeline to render the + * contents of a texture + * + * @class away.pool.ITextureData + */ + interface ITextureData { + /** + * + */ + dispose(): any; + /** + * + */ + invalidate(): any; + } + export = ITextureData; + +} +declare module "awayjs-core/lib/core/pool/RenderablePool" { + import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import IRenderableClass = require("awayjs-core/lib/core/pool/IRenderableClass"); + /** + * @class away.pool.RenderablePool + */ + class RenderablePool { + private static _pools; + private _pool; + private _renderableClass; + /** + * //TODO + * + * @param renderableClass + */ + constructor(renderableClass: IRenderableClass); + /** + * //TODO + * + * @param materialOwner + * @returns IRenderable + */ + public getItem(materialOwner: IMaterialOwner): IRenderable; + /** + * //TODO + * + * @param materialOwner + */ + public disposeItem(materialOwner: IMaterialOwner): void; + /** + * //TODO + * + * @param renderableClass + * @returns RenderablePool + */ + static getPool(renderableClass: IRenderableClass): RenderablePool; + /** + * //TODO + * + * @param renderableClass + */ + static disposePool(renderableClass: any): void; + } + export = RenderablePool; + +} +declare module "awayjs-core/lib/core/render/CSSDefaultRenderer" { + import CSSRendererBase = require("awayjs-core/lib/core/render/CSSRendererBase"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import EntityCollector = require("awayjs-core/lib/core/traverse/EntityCollector"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + /** + * The DefaultRenderer class provides the default rendering method. It renders the scene graph objects using the + * materials assigned to them. + * + * @class away.render.DefaultRenderer + */ + class CSSDefaultRenderer extends CSSRendererBase implements IRenderer { + private _container; + private _context; + private _contextStyle; + private _contextMatrix; + private _activeMaterial; + private _skyboxProjection; + private _transform; + /** + * Creates a new CSSDefaultRenderer object. + */ + constructor(); + /** + * + * @param entityCollector + */ + public render(entityCollector: ICollector): void; + /** + * @inheritDoc + */ + public pDraw(entityCollector: EntityCollector): void; + /** + * Updates the backbuffer properties. + */ + public pUpdateBackBuffer(): void; + /** + * Draw the skybox if present. + * @param entityCollector The EntityCollector containing all potentially visible information. + */ + private drawSkybox(entityCollector); + /** + * Draw a list of renderables. + * @param renderables The renderables to draw. + * @param entityCollector The EntityCollector containing all potentially visible information. + */ + private drawRenderables(item, entityCollector); + public dispose(): void; + public _iCreateEntityCollector(): ICollector; + } + export = CSSDefaultRenderer; + +} +declare module "awayjs-core/lib/core/render/CSSRendererBase" { + import LineSubMesh = require("awayjs-core/lib/core/base/LineSubMesh"); + import TriangleSubMesh = require("awayjs-core/lib/core/base/TriangleSubMesh"); + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + import IEntitySorter = require("awayjs-core/lib/core/sort/IEntitySorter"); + import CSSEntityCollector = require("awayjs-core/lib/core/traverse/CSSEntityCollector"); + import EntityCollector = require("awayjs-core/lib/core/traverse/EntityCollector"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import Billboard = require("awayjs-core/lib/entities/Billboard"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import Skybox = require("awayjs-core/lib/entities/Skybox"); + import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + /** + * RendererBase forms an abstract base class for classes that are used in the rendering pipeline to render the + * contents of a partition + * + * @class away.render.RendererBase + */ + class CSSRendererBase extends EventDispatcher { + private _billboardRenderablePool; + private _lineSegmentRenderablePool; + public _pCamera: Camera; + public _iEntryPoint: Vector3D; + public _pCameraForward: Vector3D; + private _backgroundR; + private _backgroundG; + private _backgroundB; + private _backgroundAlpha; + private _shareContext; + public _pBackBufferInvalid: boolean; + public _depthTextureInvalid: boolean; + public _renderableHead: CSSRenderableBase; + public _width: number; + public _height: number; + private _viewPort; + private _viewportDirty; + private _scissorRect; + private _scissorDirty; + private _localPos; + private _globalPos; + private _scissorUpdated; + private _viewPortUpdated; + /** + * A viewPort rectangle equivalent of the StageGL size and position. + */ + public viewPort : Rectangle; + /** + * A scissor rectangle equivalent of the view size and position. + */ + public scissorRect : Rectangle; + /** + * + */ + public x : number; + /** + * + */ + public y : number; + /** + * + */ + public width : number; + /** + * + */ + public height : number; + /** + * + */ + public renderableSorter: IEntitySorter; + /** + * Creates a new RendererBase object. + */ + constructor(renderToTexture?: boolean, forceSoftware?: boolean, profile?: string); + /** + * The background color's red component, used when clearing. + * + * @private + */ + public _iBackgroundR : number; + /** + * The background color's green component, used when clearing. + * + * @private + */ + public _iBackgroundG : number; + /** + * The background color's blue component, used when clearing. + * + * @private + */ + public _iBackgroundB : number; + public shareContext : boolean; + /** + * Disposes the resources used by the RendererBase. + */ + public dispose(): void; + public render(entityCollector: ICollector): void; + /** + * Renders the potentially visible geometry to the back buffer or texture. + * @param entityCollector The EntityCollector object containing the potentially visible geometry. + * @param scissorRect + */ + public _iRender(entityCollector: EntityCollector, target?: TextureProxyBase, scissorRect?: Rectangle, surfaceSelector?: number): void; + public _iRenderCascades(entityCollector: ICollector, target: TextureProxyBase, numCascades: number, scissorRects: Rectangle[], cameras: Camera[]): void; + public pCollectRenderables(entityCollector: ICollector): void; + /** + * Renders the potentially visible geometry to the back buffer or texture. Only executed if everything is set up. + * @param entityCollector The EntityCollector object containing the potentially visible geometry. + * @param scissorRect + */ + public pExecuteRender(entityCollector: CSSEntityCollector, scissorRect?: Rectangle): void; + /** + * Performs the actual drawing of dom objects to the target. + * + * @param entityCollector The EntityCollector object containing the potentially visible dom objects. + */ + public pDraw(entityCollector: CSSEntityCollector): void; + public _iBackgroundAlpha : number; + /** + * + * @param billboard + */ + public applyBillboard(billboard: Billboard): void; + /** + * + * @param lineSubMesh + */ + public applyLineSubMesh(lineSubMesh: LineSubMesh): void; + /** + * + * @param skybox + */ + public applySkybox(skybox: Skybox): void; + /** + * + * @param triangleSubMesh + */ + public applyTriangleSubMesh(triangleSubMesh: TriangleSubMesh): void; + /** + * + * @param renderable + * @private + */ + private _applyRenderable(renderable); + /** + * @private + */ + private notifyScissorUpdate(); + /** + * @private + */ + private notifyViewportUpdate(); + /** + * + */ + public updateGlobalPos(): void; + public _iCreateEntityCollector(): ICollector; + } + export = CSSRendererBase; + +} +declare module "awayjs-core/lib/core/render/IRenderer" { + import LineSubMesh = require("awayjs-core/lib/core/base/LineSubMesh"); + import TriangleSubMesh = require("awayjs-core/lib/core/base/TriangleSubMesh"); + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + import IEntitySorter = require("awayjs-core/lib/core/sort/IEntitySorter"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import Billboard = require("awayjs-core/lib/entities/Billboard"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); + import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + /** + * IRenderer is an interface for classes that are used in the rendering pipeline to render the + * contents of a partition + * + * @class away.render.IRenderer + */ + interface IRenderer extends IEventDispatcher { + /** + * + */ + renderableSorter: IEntitySorter; + /** + * + */ + shareContext: boolean; + /** + * + */ + x: number; + /** + * + */ + y: number; + /** + * + */ + width: number; + /** + * + */ + height: number; + /** + * + */ + viewPort: Rectangle; + /** + * + */ + scissorRect: Rectangle; + /** + * + * @param billboard + */ + applyBillboard(billboard: Billboard): any; + /** + * + * @param triangleSubMesh + */ + applyLineSubMesh(triangleSubMesh: LineSubMesh): any; + /** + * + * @param triangleSubMesh + */ + applyTriangleSubMesh(triangleSubMesh: TriangleSubMesh): any; + /** + * + */ + dispose(): any; + /** + * + * @param entityCollector + */ + render(entityCollector: ICollector): any; + /** + * @internal + */ + _iBackgroundR: number; + /** + * @internal + */ + _iBackgroundG: number; + /** + * @internal + */ + _iBackgroundB: number; + /** + * @internal + */ + _iBackgroundAlpha: number; + /** + * @internal + */ + _iCreateEntityCollector(): ICollector; + _iRender(entityCollector: ICollector, target?: TextureProxyBase, scissorRect?: Rectangle, surfaceSelector?: number): any; + _iRenderCascades(entityCollector: ICollector, target: TextureProxyBase, numCascades: number, scissorRects: Rectangle[], cameras: Camera[]): any; + } + export = IRenderer; + +} +declare module "awayjs-core/lib/core/sort/IEntitySorter" { + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + /** + * @interface away.sort.IEntitySorter + */ + interface IEntitySorter { + sortBlendedRenderables(head: IRenderable): IRenderable; + sortOpaqueRenderables(head: IRenderable): IRenderable; + } + export = IEntitySorter; + +} +declare module "awayjs-core/lib/core/sort/RenderableMergeSort" { + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import IEntitySorter = require("awayjs-core/lib/core/sort/IEntitySorter"); + /** + * @class away.sort.RenderableMergeSort + */ + class RenderableMergeSort implements IEntitySorter { + public sortBlendedRenderables(head: IRenderable): IRenderable; + public sortOpaqueRenderables(head: IRenderable): IRenderable; + } + export = RenderableMergeSort; + +} +declare module "awayjs-core/lib/core/text/AntiAliasType" { + /** + * The AntiAliasType class provides values for anti-aliasing in the + * away.text.TextField class. + */ + class AntiAliasType { + /** + * Sets anti-aliasing to advanced anti-aliasing. Advanced anti-aliasing + * allows font faces to be rendered at very high quality at small sizes. It + * is best used with applications that have a lot of small text. Advanced + * anti-aliasing is not recommended for very large fonts(larger than 48 + * points). This constant is used for the antiAliasType property + * in the TextField class. Use the syntax + * AntiAliasType.ADVANCED. + */ + static ADVANCED: string; + /** + * Sets anti-aliasing to the anti-aliasing that is used in Flash Player 7 and + * earlier. This setting is recommended for applications that do not have a + * lot of text. This constant is used for the antiAliasType + * property in the TextField class. Use the syntax + * AntiAliasType.NORMAL. + */ + static NORMAL: string; + } + export = AntiAliasType; + +} +declare module "awayjs-core/lib/core/text/GridFitType" { + /** + * The GridFitType class defines values for grid fitting in the TextField class. + */ + class GridFitType { + /** + * Doesn't set grid fitting. Horizontal and vertical lines in the glyphs are + * not forced to the pixel grid. This constant is used in setting the + * gridFitType property of the TextField class. This is often a + * good setting for animation or for large font sizes. Use the syntax + * GridFitType.NONE. + */ + static NONE: string; + /** + * Fits strong horizontal and vertical lines to the pixel grid. This constant + * is used in setting the gridFitType property of the TextField + * class. This setting only works for left-justified text fields and acts + * like the GridFitType.SUBPIXEL constant in static text. This + * setting generally provides the best readability for left-aligned text. Use + * the syntax GridFitType.PIXEL. + */ + static PIXEL: string; + /** + * Fits strong horizontal and vertical lines to the sub-pixel grid on LCD + * monitors. (Red, green, and blue are actual pixels on an LCD screen.) This + * is often a good setting for right-aligned or center-aligned dynamic text, + * and it is sometimes a useful tradeoff for animation vs. text quality. This + * constant is used in setting the gridFitType property of the + * TextField class. Use the syntax GridFitType.SUBPIXEL. + */ + static SUBPIXEL: string; + } + export = GridFitType; + +} +declare module "awayjs-core/lib/core/text/TextFieldAutoSize" { + /** + * The TextFieldAutoSize class is an enumeration of constant values used in + * setting the autoSize property of the TextField class. + */ + class TextFieldAutoSize { + /** + * Specifies that the text is to be treated as center-justified text. Any + * resizing of a single line of a text field is equally distributed to both + * the right and left sides. + */ + static CENTER: string; + /** + * Specifies that the text is to be treated as left-justified text, meaning + * that the left side of the text field remains fixed and any resizing of a + * single line is on the right side. + */ + static LEFT: string; + /** + * Specifies that no resizing is to occur. + */ + static NONE: string; + /** + * Specifies that the text is to be treated as right-justified text, meaning + * that the right side of the text field remains fixed and any resizing of a + * single line is on the left side. + */ + static RIGHT: string; + } + export = TextFieldAutoSize; + +} +declare module "awayjs-core/lib/core/text/TextFieldType" { + /** + * The TextFieldType class is an enumeration of constant values used in setting the + * type property of the TextField class. + * + * @see away.entities.TextField#type + */ + class TextFieldType { + /** + * Used to specify a dynamic TextField. + */ + static DYNAMIC: string; + /** + * Used to specify an input TextField. + */ + static INPUT: string; + } + export = TextFieldType; + +} +declare module "awayjs-core/lib/core/text/TextFormat" { + /** + * The TextFormat class represents character formatting information. Use the + * TextFormat class to create specific text formatting for text fields. You + * can apply text formatting to both static and dynamic text fields. The + * properties of the TextFormat class apply to device and embedded fonts. + * However, for embedded fonts, bold and italic text actually require specific + * fonts. If you want to display bold or italic text with an embedded font, + * you need to embed the bold and italic variations of that font. + * + *

You must use the constructor new TextFormat() to create a + * TextFormat object before setting its properties. When you apply a + * TextFormat object to a text field using the + * TextField.defaultTextFormat property or the + * TextField.setTextFormat() method, only its defined properties + * are applied. Use the TextField.defaultTextFormat property to + * apply formatting BEFORE you add text to the TextField, and the + * setTextFormat() method to add formatting AFTER you add text to + * the TextField. The TextFormat properties are null + * by default because if you don't provide values for the properties, Flash + * Player uses its own default formatting. The default formatting that Flash + * Player uses for each property(if property's value is null) is + * as follows:

+ * + *

The default formatting for each property is also described in each + * property description.

+ */ + class TextFormat { + /** + * Indicates the alignment of the paragraph. Valid values are TextFormatAlign + * constants. + * + * @default TextFormatAlign.LEFT + * @throws ArgumentError The align specified is not a member of + * flash.text.TextFormatAlign. + */ + public align: string; + /** + * Indicates the block indentation in pixels. Block indentation is applied to + * an entire block of text; that is, to all lines of the text. In contrast, + * normal indentation(TextFormat.indent) affects only the first + * line of each paragraph. If this property is null, the + * TextFormat object does not specify block indentation(block indentation is + * 0). + */ + public blockIndent: number; + /** + * Specifies whether the text is boldface. The default value is + * null, which means no boldface is used. If the value is + * true, then the text is boldface. + */ + public bold: boolean; + /** + * Indicates that the text is part of a bulleted list. In a bulleted list, + * each paragraph of text is indented. To the left of the first line of each + * paragraph, a bullet symbol is displayed. The default value is + * null, which means no bulleted list is used. + */ + public bullet: boolean; + /** + * Indicates the color of the text. A number containing three 8-bit RGB + * components; for example, 0xFF0000 is red, and 0x00FF00 is green. The + * default value is null, which means that Flash Player uses the + * color black(0x000000). + */ + public color: boolean; + /** + * The name of the font for text in this text format, as a string. The + * default value is null, which means that Flash Player uses + * Times New Roman font for the text. + */ + public font: string; + /** + * Indicates the indentation from the left margin to the first character in + * the paragraph. The default value is null, which indicates + * that no indentation is used. + */ + public indent: number; + /** + * Indicates whether text in this text format is italicized. The default + * value is null, which means no italics are used. + */ + public italic: boolean; + /** + * A Boolean value that indicates whether kerning is enabled + * (true) or disabled(false). Kerning adjusts the + * pixels between certain character pairs to improve readability, and should + * be used only when necessary, such as with headings in large fonts. Kerning + * is supported for embedded fonts only. + * + *

Certain fonts such as Verdana and monospaced fonts, such as Courier + * New, do not support kerning.

+ * + *

The default value is null, which means that kerning is not + * enabled.

+ */ + public kerning: boolean; + /** + * An integer representing the amount of vertical space(called + * leading) between lines. The default value is null, + * which indicates that the amount of leading used is 0. + */ + public leading: number; + /** + * The left margin of the paragraph, in pixels. The default value is + * null, which indicates that the left margin is 0 pixels. + */ + public leftMargin: number; + /** + * A number representing the amount of space that is uniformly distributed + * between all characters. The value specifies the number of pixels that are + * added to the advance after each character. The default value is + * null, which means that 0 pixels of letter spacing is used. + * You can use decimal values such as 1.75. + */ + public letterSpacing: number; + /** + * The right margin of the paragraph, in pixels. The default value is + * null, which indicates that the right margin is 0 pixels. + */ + public rightMargin: number; + /** + * The size in pixels of text in this text format. The default value is + * null, which means that a size of 12 is used. + */ + public size: number; + /** + * Specifies custom tab stops as an array of non-negative integers. Each tab + * stop is specified in pixels. If custom tab stops are not specified + * (null), the default tab stop is 4(average character width). + */ + public tabStops: number[]; + /** + * Indicates the target window where the hyperlink is displayed. If the + * target window is an empty string, the text is displayed in the default + * target window _self. You can choose a custom name or one of + * the following four names: _self specifies the current frame + * in the current window, _blank specifies a new window, + * _parent specifies the parent of the current frame, and + * _top specifies the top-level frame in the current window. If + * the TextFormat.url property is an empty string or + * null, you can get or set this property, but the property will + * have no effect. + */ + public target: string; + /** + * Indicates whether the text that uses this text format is underlined + * (true) or not(false). This underlining is + * similar to that produced by the tag, but the latter is + * not true underlining, because it does not skip descenders correctly. The + * default value is null, which indicates that underlining is + * not used. + */ + public underline: boolean; + /** + * Indicates the target URL for the text in this text format. If the + * url property is an empty string, the text does not have a + * hyperlink. The default value is null, which indicates that + * the text does not have a hyperlink. + * + *

Note: The text with the assigned text format must be set with + * the htmlText property for the hyperlink to work.

+ */ + public url: string; + /** + * Creates a TextFormat object with the specified properties. You can then + * change the properties of the TextFormat object to change the formatting of + * text fields. + * + *

Any parameter may be set to null to indicate that it is + * not defined. All of the parameters are optional; any omitted parameters + * are treated as null.

+ * + * @param font The name of a font for text as a string. + * @param size An integer that indicates the size in pixels. + * @param color The color of text using this text format. A number + * containing three 8-bit RGB components; for example, + * 0xFF0000 is red, and 0x00FF00 is green. + * @param bold A Boolean value that indicates whether the text is + * boldface. + * @param italic A Boolean value that indicates whether the text is + * italicized. + * @param underline A Boolean value that indicates whether the text is + * underlined. + * @param url The URL to which the text in this text format + * hyperlinks. If url is an empty string, the + * text does not have a hyperlink. + * @param target The target window where the hyperlink is displayed. If + * the target window is an empty string, the text is + * displayed in the default target window + * _self. If the url parameter + * is set to an empty string or to the value + * null, you can get or set this property, + * but the property will have no effect. + * @param align The alignment of the paragraph, as a TextFormatAlign + * value. + * @param leftMargin Indicates the left margin of the paragraph, in pixels. + * @param rightMargin Indicates the right margin of the paragraph, in pixels. + * @param indent An integer that indicates the indentation from the left + * margin to the first character in the paragraph. + * @param leading A number that indicates the amount of leading vertical + * space between lines. + */ + constructor(font?: string, size?: number, color?: number, bold?: boolean, italic?: boolean, underline?: boolean, url?: string, target?: string, align?: string, leftMargin?: number, rightMargin?: number, indent?: number, leading?: number); + } + export = TextFormat; + +} +declare module "awayjs-core/lib/core/text/TextFormatAlign" { + /** + * The TextFormatAlign class provides values for text alignment in the + * TextFormat class. + */ + class TextFormatAlign { + /** + * Constant; centers the text in the text field. Use the syntax + * TextFormatAlign.CENTER. + */ + public CENTER: string; + /** + * Constant; justifies text within the text field. Use the syntax + * TextFormatAlign.JUSTIFY. + */ + public JUSTIFY: string; + /** + * Constant; aligns text to the left within the text field. Use the syntax + * TextFormatAlign.LEFT. + */ + public LEFT: string; + /** + * Constant; aligns text to the right within the text field. Use the syntax + * TextFormatAlign.RIGHT. + */ + public RIGHT: string; + } + export = TextFormatAlign; + +} +declare module "awayjs-core/lib/core/text/TextInteractionMode" { + /** + * A class that defines the Interactive mode of a text field object. + * + * @see away.entities.TextField#textInteractionMode + */ + class TextInteractionMode { + /** + * The text field's default interaction mode is NORMAL and it varies across + * platform. On Desktop, the normal mode implies that the text field is in + * scrollable + selection mode. On Mobile platforms like Android, normal mode + * implies that the text field can only be scrolled but the text can not be + * selected. + */ + static NORMAL: string; + /** + * On mobile platforms like Android, the text field starts in normal mode + * (which implies scroll and non-selectable mode). The user can switch to + * selection mode through the in-built context menu of the text field object. + */ + static SELECTION: string; + } + export = TextInteractionMode; + +} +declare module "awayjs-core/lib/core/text/TextLineMetrics" { + /** + * The TextLineMetrics class contains information about the text position and + * measurements of a line of text within a text field. All measurements are in + * pixels. Objects of this class are returned by the + * away.entities.TextField.getLineMetrics() method. + */ + class TextLineMetrics { + /** + * The ascent value of the text is the length from the baseline to the top of + * the line height in pixels. + */ + public ascent: number; + /** + * The descent value of the text is the length from the baseline to the + * bottom depth of the line in pixels. + */ + public descent: number; + /** + * The height value of the text of the selected lines (not necessarily the + * complete text) in pixels. The height of the text line does not include the + * gutter height. + */ + public height: number; + /** + * The leading value is the measurement of the vertical distance between the + * lines of text. + */ + public leading: number; + /** + * The width value is the width of the text of the selected lines (not + * necessarily the complete text) in pixels. The width of the text line is + * not the same as the width of the text field. The width of the text line is + * relative to the text field width, minus the gutter width of 4 pixels + * (2 pixels on each side). + */ + public width: number; + /** + * The x value is the left position of the first character in pixels. This + * value includes the margin, indent (if any), and gutter widths. + */ + public x: number; + /** + * Creates a TextLineMetrics object. The TextLineMetrics object contains + * information about the text metrics of a line of text in a text field. + * Objects of this class are returned by the + * away.entities.TextField.getLineMetrics() method. + * + * @param x The left position of the first character in pixels. + * @param width The width of the text of the selected lines (not + * necessarily the complete text) in pixels. + * @param height The height of the text of the selected lines (not + * necessarily the complete text) in pixels. + * @param ascent The length from the baseline to the top of the line + * height in pixels. + * @param descent The length from the baseline to the bottom depth of + * the line in pixels. + * @param leading The measurement of the vertical distance between the + * lines of text. + */ + constructor(x?: number, width?: number, height?: number, ascent?: number, descent?: number, leading?: number); + } + export = TextLineMetrics; + +} +declare module "awayjs-core/lib/core/traverse/CSSEntityCollector" { + import CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + /** + * @class away.traverse.CSSEntityCollector + */ + class CSSEntityCollector extends CollectorBase implements ICollector { + constructor(); + } + export = CSSEntityCollector; + +} +declare module "awayjs-core/lib/core/traverse/CollectorBase" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import EntityListItem = require("awayjs-core/lib/core/pool/EntityListItem"); + import EntityListItemPool = require("awayjs-core/lib/core/pool/EntityListItemPool"); + import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); + import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.traverse.CollectorBase + */ + class CollectorBase implements ICollector { + public scene: Scene; + public _pEntityHead: EntityListItem; + public _pEntityListItemPool: EntityListItemPool; + public _pCamera: Camera; + private _customCullPlanes; + private _cullPlanes; + private _numCullPlanes; + public _pNumEntities: number; + public _pNumInteractiveEntities: number; + constructor(); + /** + * + */ + public camera : Camera; + /** + * + */ + public cullPlanes : Plane3D[]; + /** + * + */ + public entityHead : EntityListItem; + /** + * + */ + public numEntities : number; + /** + * + */ + public numInteractiveEntities : number; + /** + * + */ + public clear(): void; + /** + * + * @param node + * @returns {boolean} + */ + public enterNode(node: NodeBase): boolean; + /** + * + * @param entity + */ + public applyDirectionalLight(entity: IEntity): void; + /** + * + * @param entity + */ + public applyEntity(entity: IEntity): void; + /** + * + * @param entity + */ + public applyLightProbe(entity: IEntity): void; + /** + * + * @param entity + */ + public applyPointLight(entity: IEntity): void; + /** + * + * @param entity + */ + public applySkybox(entity: IEntity): void; + } + export = CollectorBase; + +} +declare module "awayjs-core/lib/core/traverse/EntityCollector" { + import LightBase = require("awayjs-core/lib/core/base/LightBase"); + import CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + import DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + import LightProbe = require("awayjs-core/lib/entities/LightProbe"); + import PointLight = require("awayjs-core/lib/entities/PointLight"); + import Skybox = require("awayjs-core/lib/entities/Skybox"); + /** + * @class away.traverse.EntityCollector + */ + class EntityCollector extends CollectorBase { + public _pSkybox: Skybox; + public _pLights: LightBase[]; + private _directionalLights; + private _pointLights; + private _lightProbes; + public _pNumLights: number; + private _numDirectionalLights; + private _numPointLights; + private _numLightProbes; + /** + * + */ + public directionalLights : DirectionalLight[]; + /** + * + */ + public lightProbes : LightProbe[]; + /** + * + */ + public lights : LightBase[]; + /** + * + */ + public pointLights : PointLight[]; + /** + * + */ + public skyBox : Skybox; + constructor(); + /** + * + * @param entity + */ + public applyDirectionalLight(entity: IEntity): void; + /** + * + * @param entity + */ + public applyLightProbe(entity: IEntity): void; + /** + * + * @param entity + */ + public applyPointLight(entity: IEntity): void; + /** + * + * @param entity + */ + public applySkybox(entity: IEntity): void; + /** + * + */ + public clear(): void; + } + export = EntityCollector; + +} +declare module "awayjs-core/lib/core/traverse/ICollector" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import IEntity = require("awayjs-core/lib/entities/IEntity"); + /** + * @class away.traverse.ICollector + */ + interface ICollector { + /** + * + */ + camera: Camera; + /** + * + */ + scene: Scene; + /** + * + */ + numEntities: number; + /** + * + */ + numInteractiveEntities: number; + /** + * + */ + clear(): any; + /** + * + */ + entityHead: any; + /** + * + * @param node + */ + enterNode(node: NodeBase): boolean; + /** + * + * @param entity + */ + applyDirectionalLight(entity: IEntity): any; + /** + * + * @param entity + */ + applyEntity(entity: IEntity): any; + /** + * + * @param entity + */ + applyLightProbe(entity: IEntity): any; + /** + * + * @param entity + */ + applyPointLight(entity: IEntity): any; + /** + * + * @param entity + */ + applySkybox(entity: IEntity): any; + } + export = ICollector; + +} +declare module "awayjs-core/lib/core/traverse/RaycastCollector" { + import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); + import CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + /** + * The RaycastCollector class is a traverser for scene partitions that collects all scene graph entities that are + * considered intersecting with the defined ray. + * + * @see away.partition.Partition + * @see away.entities.IEntity + * + * @class away.traverse.RaycastCollector + */ + class RaycastCollector extends CollectorBase { + private _rayPosition; + private _rayDirection; + public _iCollectionMark: number; + /** + * Provides the starting position of the ray. + */ + public rayPosition : Vector3D; + /** + * Provides the direction vector of the ray. + */ + public rayDirection : Vector3D; + /** + * Creates a new RaycastCollector object. + */ + constructor(); + /** + * Returns true if the current node is at least partly in the frustum. If so, the partition node knows to pass on the traverser to its children. + * + * @param node The Partition3DNode object to frustum-test. + */ + public enterNode(node: NodeBase): boolean; + } + export = RaycastCollector; + +} +declare module "awayjs-core/lib/core/traverse/ShadowCasterCollector" { + import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); + import CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + /** + * @class away.traverse.ShadowCasterCollector + */ + class ShadowCasterCollector extends CollectorBase { + constructor(); + /** + * + */ + public enterNode(node: NodeBase): boolean; + } + export = ShadowCasterCollector; + +} +declare module "awayjs-core/lib/core/ui/Keyboard" { + class Keyboard { + /** + * Constant associated with the key code value for the A key (65). + */ + static A: number; + /** + * Constant associated with the key code value for the Alternate (Option) key (18). + */ + static ALTERNATE: number; + /** + * Select the audio mode + */ + static AUDIO: number; + /** + * Constant associated with the key code value for the B key (66). + */ + static B: number; + /** + * Return to previous page in application + */ + static BACK: number; + /** + * Constant associated with the key code value for the ` key (192). + */ + static BACKQUOTE: number; + /** + * Constant associated with the key code value for the \ key (220). + */ + static BACKSLASH: number; + /** + * Constant associated with the key code value for the Backspace key (8). + */ + static BACKSPACE: number; + /** + * Blue function key button + */ + static BLUE: number; + /** + * Constant associated with the key code value for the C key (67). + */ + static C: number; + /** + * Constant associated with the key code value for the Caps Lock key (20). + */ + static CAPS_LOCK: number; + /** + * Channel down + */ + static CHANNEL_DOWN: number; + /** + * Channel up + */ + static CHANNEL_UP: number; + /** + * Constant associated with the key code value for the , key (188). + */ + static COMMA: number; + /** + * Constant associated with the Mac command key (15). This constant is + * currently only used for setting menu key equivalents. + */ + static COMMAND: number; + /** + * Constant associated with the key code value for the Control key (17). + */ + static CONTROL: number; + /** + * An array containing all the defined key name constants. + */ + static CharCodeStrings: any[]; + /** + * Constant associated with the key code value for the D key (68). + */ + static D: number; + /** + * Constant associated with the key code value for the Delete key (46). + */ + static DELETE: number; + /** + * Constant associated with the key code value for the Down Arrow key (40). + */ + static DOWN: number; + /** + * Engage DVR application mode + */ + static DVR: number; + /** + * Constant associated with the key code value for the E key (69). + */ + static E: number; + /** + * Constant associated with the key code value for the End key (35). + */ + static END: number; + /** + * Constant associated with the key code value for the Enter key (13). + */ + static ENTER: number; + /** + * Constant associated with the key code value for the = key (187). + */ + static EQUAL: number; + /** + * Constant associated with the key code value for the Escape key (27). + */ + static ESCAPE: number; + /** + * Exits current application mode + */ + static EXIT: number; + /** + * Constant associated with the key code value for the F key (70). + */ + static F: number; + /** + * Constant associated with the key code value for the F1 key (112). + */ + static F1: number; + /** + * Constant associated with the key code value for the F10 key (121). + */ + static F10: number; + /** + * Constant associated with the key code value for the F11 key (122). + */ + static F11: number; + /** + * Constant associated with the key code value for the F12 key (123). + */ + static F12: number; + /** + * Constant associated with the key code value for the F13 key (124). + */ + static F13: number; + /** + * Constant associated with the key code value for the F14 key (125). + */ + static F14: number; + /** + * Constant associated with the key code value for the F15 key (126). + */ + static F15: number; + /** + * Constant associated with the key code value for the F2 key (113). + */ + static F2: number; + /** + * Constant associated with the key code value for the F3 key (114). + */ + static F3: number; + /** + * Constant associated with the key code value for the F4 key (115). + */ + static F4: number; + /** + * Constant associated with the key code value for the F5 key (116). + */ + static F5: number; + /** + * Constant associated with the key code value for the F6 key (117). + */ + static F6: number; + /** + * Constant associated with the key code value for the F7 key (118). + */ + static F7: number; + /** + * Constant associated with the key code value for the F8 key (119). + */ + static F8: number; + /** + * Constant associated with the key code value for the F9 key (120). + */ + static F9: number; + /** + * Engage fast-forward transport mode + */ + static FAST_FORWARD: number; + /** + * Constant associated with the key code value for the G key (71). + */ + static G: number; + /** + * Green function key button + */ + static GREEN: number; + /** + * Engage program guide + */ + static GUIDE: number; + /** + * Constant associated with the key code value for the H key (72). + */ + static H: number; + /** + * Engage help application or context-sensitive help + */ + static HELP: number; + /** + * Constant associated with the key code value for the Home key (36). + */ + static HOME: number; + /** + * Constant associated with the key code value for the I key (73). + */ + static I: number; + /** + * Info button + */ + static INFO: number; + /** + * Cycle input + */ + static INPUT: number; + /** + * Constant associated with the key code value for the Insert key (45). + */ + static INSERT: number; + /** + * Constant associated with the key code value for the J key (74). + */ + static J: number; + /** + * Constant associated with the key code value for the K key (75). + */ + static K: number; + /** + * The Begin key + */ + static KEYNAME_BEGIN: string; + /** + * The Break key + */ + static KEYNAME_BREAK: string; + /** + * The Clear Display key + */ + static KEYNAME_CLEARDISPLAY: string; + /** + * The Clear Line key + */ + static KEYNAME_CLEARLINE: string; + /** + * The Delete key + */ + static KEYNAME_DELETE: string; + /** + * The Delete Character key + */ + static KEYNAME_DELETECHAR: string; + /** + * The Delete Line key + */ + static KEYNAME_DELETELINE: string; + /** + * The down arrow + */ + static KEYNAME_DOWNARROW: string; + /** + * The End key + */ + static KEYNAME_END: string; + /** + * The Execute key + */ + static KEYNAME_EXECUTE: string; + /** + * The F1 key + */ + static KEYNAME_F1: string; + /** + * The F10 key + */ + static KEYNAME_F10: string; + /** + * The F11 key + */ + static KEYNAME_F11: string; + /** + * The F12 key + */ + static KEYNAME_F12: string; + /** + * The F13 key + */ + static KEYNAME_F13: string; + /** + * The F14 key + */ + static KEYNAME_F14: string; + /** + * The F15 key + */ + static KEYNAME_F15: string; + /** + * The F16 key + */ + static KEYNAME_F16: string; + /** + * The F17 key + */ + static KEYNAME_F17: string; + /** + * The F18 key + */ + static KEYNAME_F18: string; + /** + * The F19 key + */ + static KEYNAME_F19: string; + /** + * The F2 key + */ + static KEYNAME_F2: string; + /** + * The F20 key + */ + static KEYNAME_F20: string; + /** + * The F21 key + */ + static KEYNAME_F21: string; + /** + * The F22 key + */ + static KEYNAME_F22: string; + /** + * The F23 key + */ + static KEYNAME_F23: string; + /** + * The F24 key + */ + static KEYNAME_F24: string; + /** + * The F25 key + */ + static KEYNAME_F25: string; + /** + * The F26 key + */ + static KEYNAME_F26: string; + /** + * The F27 key + */ + static KEYNAME_F27: string; + /** + * The F28 key + */ + static KEYNAME_F28: string; + /** + * The F29 key + */ + static KEYNAME_F29: string; + /** + * The F3 key + */ + static KEYNAME_F3: string; + /** + * The F30 key + */ + static KEYNAME_F30: string; + /** + * The F31 key + */ + static KEYNAME_F31: string; + /** + * The F32 key + */ + static KEYNAME_F32: string; + /** + * The F33 key + */ + static KEYNAME_F33: string; + /** + * The F34 key + */ + static KEYNAME_F34: string; + /** + * The F35 key + */ + static KEYNAME_F35: string; + /** + * The F4 key + */ + static KEYNAME_F4: string; + /** + * The F5 key + */ + static KEYNAME_F5: string; + /** + * The F6 key + */ + static KEYNAME_F6: string; + /** + * The F7 key + */ + static KEYNAME_F7: string; + /** + * The F8 key + */ + static KEYNAME_F8: string; + /** + * The F9 key + */ + static KEYNAME_F9: string; + /** + * The Find key + */ + static KEYNAME_FIND: string; + /** + * The Help key + */ + static KEYNAME_HELP: string; + /** + * The Home key + */ + static KEYNAME_HOME: string; + /** + * The Insert key + */ + static KEYNAME_INSERT: string; + /** + * The Insert Character key + */ + static KEYNAME_INSERTCHAR: string; + /** + * The Insert Line key + */ + static KEYNAME_INSERTLINE: string; + /** + * The left arrow + */ + static KEYNAME_LEFTARROW: string; + /** + * The Menu key + */ + static KEYNAME_MENU: string; + /** + * The Mode Switch key + */ + static KEYNAME_MODESWITCH: string; + /** + * The Next key + */ + static KEYNAME_NEXT: string; + /** + * The Page Down key + */ + static KEYNAME_PAGEDOWN: string; + /** + * The Page Up key + */ + static KEYNAME_PAGEUP: string; + /** + * The Pause key + */ + static KEYNAME_PAUSE: string; + /** + * The Previous key + */ + static KEYNAME_PREV: string; + /** + * The PRINT key + */ + static KEYNAME_PRINT: string; + /** + * The PRINT Screen + */ + static KEYNAME_PRINTSCREEN: string; + /** + * The Redo key + */ + static KEYNAME_REDO: string; + /** + * The Reset key + */ + static KEYNAME_RESET: string; + /** + * The right arrow + */ + static KEYNAME_RIGHTARROW: string; + /** + * The Scroll Lock key + */ + static KEYNAME_SCROLLLOCK: string; + /** + * The Select key + */ + static KEYNAME_SELECT: string; + /** + * The Stop key + */ + static KEYNAME_STOP: string; + /** + * The System Request key + */ + static KEYNAME_SYSREQ: string; + /** + * The System key + */ + static KEYNAME_SYSTEM: string; + /** + * The Undo key + */ + static KEYNAME_UNDO: string; + /** + * The up arrow + */ + static KEYNAME_UPARROW: string; + /** + * The User key + */ + static KEYNAME_USER: string; + /** + * Constant associated with the key code value for the L key (76). + */ + static L: number; + /** + * Watch last channel or show watched + */ + static LAST: number; + /** + * Constant associated with the key code value for the Left Arrow key (37). + */ + static LEFT: number; + /** + * Constant associated with the key code value for the [ key (219). + */ + static LEFTBRACKET: number; + /** + * Return to live [position in broadcast] + */ + static LIVE: number; + /** + * Constant associated with the key code value for the M key (77). + */ + static M: number; + /** + * Engage "Master Shell" e.g. TiVo or other vendor button + */ + static MASTER_SHELL: number; + /** + * Engage menu + */ + static MENU: number; + /** + * Constant associated with the key code value for the - key (189). + */ + static MINUS: number; + /** + * Constant associated with the key code value for the N key (78). + */ + static N: number; + /** + * Skip to next track or chapter + */ + static NEXT: number; + /** + * Constant associated with the key code value for the 0 key (48). + */ + static NUMBER_0: number; + /** + * Constant associated with the key code value for the 1 key (49). + */ + static NUMBER_1: number; + /** + * Constant associated with the key code value for the 2 key (50). + */ + static NUMBER_2: number; + /** + * Constant associated with the key code value for the 3 key (51). + */ + static NUMBER_3: number; + /** + * Constant associated with the key code value for the 4 key (52). + */ + static NUMBER_4: number; + /** + * Constant associated with the key code value for the 5 key (53). + */ + static NUMBER_5: number; + /** + * Constant associated with the key code value for the 6 key (54). + */ + static NUMBER_6: number; + /** + * Constant associated with the key code value for the 7 key (55). + */ + static NUMBER_7: number; + /** + * Constant associated with the key code value for the 8 key (56). + */ + static NUMBER_8: number; + /** + * Constant associated with the key code value for the 9 key (57). + */ + static NUMBER_9: number; + /** + * Constant associated with the pseudo-key code for the the number pad (21). Use to set numpad modifier on key equivalents + */ + static NUMPAD: number; + /** + * Constant associated with the key code value for the number 0 key on the number pad (96). + */ + static NUMPAD_0: number; + /** + * Constant associated with the key code value for the number 1 key on the number pad (97). + */ + static NUMPAD_1: number; + /** + * Constant associated with the key code value for the number 2 key on the number pad (98). + */ + static NUMPAD_2: number; + /** + * Constant associated with the key code value for the number 3 key on the number pad (99). + */ + static NUMPAD_3: number; + /** + * Constant associated with the key code value for the number 4 key on the number pad (100). + */ + static NUMPAD_4: number; + /** + * Constant associated with the key code value for the number 5 key on the number pad (101). + */ + static NUMPAD_5: number; + /** + * Constant associated with the key code value for the number 6 key on the number pad (102). + */ + static NUMPAD_6: number; + /** + * Constant associated with the key code value for the number 7 key on the number pad (103). + */ + static NUMPAD_7: number; + /** + * Constant associated with the key code value for the number 8 key on the number pad (104). + */ + static NUMPAD_8: number; + /** + * Constant associated with the key code value for the number 9 key on the number pad (105). + */ + static NUMPAD_9: number; + /** + * Constant associated with the key code value for the addition key on the number pad (107). + */ + static NUMPAD_ADD: number; + /** + * Constant associated with the key code value for the decimal key on the number pad (110). + */ + static NUMPAD_DECIMAL: number; + /** + * Constant associated with the key code value for the division key on the number pad (111). + */ + static NUMPAD_DIVIDE: number; + /** + * Constant associated with the key code value for the Enter key on the number pad (108). + */ + static NUMPAD_ENTER: number; + /** + * Constant associated with the key code value for the multiplication key on the number pad (106). + */ + static NUMPAD_MULTIPLY: number; + /** + * Constant associated with the key code value for the subtraction key on the number pad (109). + */ + static NUMPAD_SUBTRACT: number; + /** + * Constant associated with the key code value for the O key (79). + */ + static O: number; + /** + * Constant associated with the key code value for the P key (80). + */ + static P: number; + /** + * Constant associated with the key code value for the Page Down key (34). + */ + static PAGE_DOWN: number; + /** + * Constant associated with the key code value for the Page Up key (33). + */ + static PAGE_UP: number; + /** + * Engage pause transport mode + */ + static PAUSE: number; + /** + * Constant associated with the key code value for the . key (190). + */ + static PERIOD: number; + /** + * Engage play transport mode + */ + static PLAY: number; + /** + * Skip to previous track or chapter + */ + static PREVIOUS: number; + /** + * Constant associated with the key code value for the Q key (81). + */ + static Q: number; + /** + * Constant associated with the key code value for the ' key (222). + */ + static QUOTE: number; + /** + * Constant associated with the key code value for the R key (82). + */ + static R: number; + /** + * Record item or engage record transport mode + */ + static RECORD: number; + /** + * Red function key button + */ + static RED: number; + /** + * Engage rewind transport mode + */ + static REWIND: number; + /** + * Constant associated with the key code value for the Right Arrow key (39). + */ + static RIGHT: number; + /** + * Constant associated with the key code value for the ] key (221). + */ + static RIGHTBRACKET: number; + /** + * Constant associated with the key code value for the S key (83). + */ + static S: number; + /** + * Search button + */ + static SEARCH: number; + /** + * Constant associated with the key code value for the ; key (186). + */ + static SEMICOLON: number; + /** + * Engage setup application or menu + */ + static SETUP: number; + /** + * Constant associated with the key code value for the Shift key (16). + */ + static SHIFT: number; + /** + * Quick skip backward (usually 7-10 seconds) + */ + static SKIP_BACKWARD: number; + /** + * Quick skip ahead (usually 30 seconds) + */ + static SKIP_FORWARD: number; + /** + * Constant associated with the key code value for the / key (191). + */ + static SLASH: number; + /** + * Constant associated with the key code value for the Spacebar (32). + */ + static SPACE: number; + /** + * Engage stop transport mode + */ + static STOP: number; + /** + * Toggle subtitles + */ + static SUBTITLE: number; + /** + * Constant associated with the key code value for the T key (84). + */ + static T: number; + /** + * Constant associated with the key code value for the Tab key (9). + */ + static TAB: number; + /** + * Constant associated with the key code value for the U key (85). + */ + static U: number; + /** + * Constant associated with the key code value for the Up Arrow key (38). + */ + static UP: number; + /** + * Constant associated with the key code value for the V key (86). + */ + static V: number; + /** + * Engage video-on-demand + */ + static VOD: number; + /** + * Constant associated with the key code value for the W key (87). + */ + static W: number; + /** + * Constant associated with the key code value for the X key (88). + */ + static X: number; + /** + * Constant associated with the key code value for the Y key (89). + */ + static Y: number; + /** + * Yellow function key button + */ + static YELLOW: number; + /** + * Constant associated with the key code value for the Z key (90). + */ + static Z: number; + } + export = Keyboard; + +} +declare module "awayjs-core/lib/materials/lightpickers/LightPickerBase" { + import LightBase = require("awayjs-core/lib/core/base/LightBase"); + import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + import IAsset = require("awayjs-core/lib/core/library/IAsset"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); + import LightProbe = require("awayjs-core/lib/entities/LightProbe"); + import PointLight = require("awayjs-core/lib/entities/PointLight"); + /** + * LightPickerBase provides an abstract base clase for light picker classes. These classes are responsible for + * feeding materials with relevant lights. Usually, StaticLightPicker can be used, but LightPickerBase can be + * extended to provide more application-specific dynamic selection of lights. + * + * @see StaticLightPicker + */ + class LightPickerBase extends NamedAssetBase implements IAsset { + public _pNumPointLights: number; + public _pNumDirectionalLights: number; + public _pNumCastingPointLights: number; + public _pNumCastingDirectionalLights: number; + public _pNumLightProbes: number; + public _pAllPickedLights: LightBase[]; + public _pPointLights: PointLight[]; + public _pCastingPointLights: PointLight[]; + public _pDirectionalLights: DirectionalLight[]; + public _pCastingDirectionalLights: DirectionalLight[]; + public _pLightProbes: LightProbe[]; + public _pLightProbeWeights: number[]; + /** + * Creates a new LightPickerBase object. + */ + constructor(); + /** + * Disposes resources used by the light picker. + */ + public dispose(): void; + /** + * @inheritDoc + */ + public assetType : string; + /** + * The maximum amount of directional lights that will be provided. + */ + public numDirectionalLights : number; + /** + * The maximum amount of point lights that will be provided. + */ + public numPointLights : number; + /** + * The maximum amount of directional lights that cast shadows. + */ + public numCastingDirectionalLights : number; + /** + * The amount of point lights that cast shadows. + */ + public numCastingPointLights : number; + /** + * The maximum amount of light probes that will be provided. + */ + public numLightProbes : number; + /** + * The collected point lights to be used for shading. + */ + public pointLights : PointLight[]; + /** + * The collected directional lights to be used for shading. + */ + public directionalLights : DirectionalLight[]; + /** + * The collected point lights that cast shadows to be used for shading. + */ + public castingPointLights : PointLight[]; + /** + * The collected directional lights that cast shadows to be used for shading. + */ + public castingDirectionalLights : DirectionalLight[]; + /** + * The collected light probes to be used for shading. + */ + public lightProbes : LightProbe[]; + /** + * The weights for each light probe, defining their influence on the object. + */ + public lightProbeWeights : number[]; + /** + * A collection of all the collected lights. + */ + public allPickedLights : LightBase[]; + /** + * Updates set of lights for a given renderable and EntityCollector. Always call super.collectLights() after custom overridden code. + */ + public collectLights(renderable: IRenderable): void; + /** + * Updates the weights for the light probes, based on the renderable's position relative to them. + * @param renderable The renderble for which to calculate the light probes' influence. + */ + private updateProbeWeights(renderable); + } + export = LightPickerBase; + +} +declare module "awayjs-core/lib/materials/lightpickers/StaticLightPicker" { + import LightPickerBase = require("awayjs-core/lib/materials/lightpickers/LightPickerBase"); + /** + * StaticLightPicker is a light picker that provides a static set of lights. The lights can be reassigned, but + * if the configuration changes (number of directional lights, point lights, etc), a material recompilation may + * occur. + */ + class StaticLightPicker extends LightPickerBase { + private _lights; + private _onCastShadowChangeDelegate; + /** + * Creates a new StaticLightPicker object. + * @param lights The lights to be used for shading. + */ + constructor(lights: any); + /** + * The lights used for shading. + */ + public lights : any[]; + /** + * Remove configuration change listeners on the lights. + */ + private clearListeners(); + /** + * Notifies the material of a configuration change. + */ + private onCastShadowChange(event); + /** + * Called when a directional light's shadow casting configuration changes. + */ + private updateDirectionalCasting(light); + /** + * Called when a point light's shadow casting configuration changes. + */ + private updatePointCasting(light); + } + export = StaticLightPicker; + +} +declare module "awayjs-core/lib/materials/passes/IMaterialPass" { + import IStage = require("awayjs-core/lib/core/base/IStage"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import IMaterialPassData = require("awayjs-core/lib/core/pool/IMaterialPassData"); + import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); + import LightPickerBase = require("awayjs-core/lib/materials/lightpickers/LightPickerBase"); + /** + * MaterialPassBase provides an abstract base class for material shader passes. A material pass constitutes at least + * a render call per required renderable. + */ + interface IMaterialPass extends IEventDispatcher { + /** + * Cleans up any resources used by the current object. + * @param deep Indicates whether other resources should be cleaned up, that could potentially be shared across different instances. + */ + dispose(): any; + /** + * Renders an object to the current render target. + * + * @private + */ + _iRender(pass: IMaterialPassData, renderable: IRenderable, stage: IStage, camera: Camera, viewProjection: Matrix3D): any; + /** + * Sets the render state for the pass that is independent of the rendered object. This needs to be called before + * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. + * @param stage The Stage object which is currently used for rendering. + * @param camera The camera from which the scene is viewed. + * @private + */ + _iActivate(pass: IMaterialPassData, stage: IStage, camera: Camera): any; + /** + * Clears the render state for the pass. This needs to be called before activating another pass. + * @param stage The Stage used for rendering + * + * @private + */ + _iDeactivate(pass: IMaterialPassData, stage: IStage): any; + /** + * The light picker used by the material to provide lights to the material if it supports lighting. + * + * @see away.materials.LightPickerBase + * @see away.materials.StaticLightPicker + */ + lightPicker: LightPickerBase; + } + export = IMaterialPass; + +} +declare module "awayjs-core/lib/materials/shadowmappers/CascadeShadowMapper" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import Event = require("awayjs-core/lib/events/Event"); + import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); + import DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + import RenderTexture = require("awayjs-core/lib/textures/RenderTexture"); + class CascadeShadowMapper extends DirectionalShadowMapper implements IEventDispatcher { + public _pScissorRects: Rectangle[]; + private _pScissorRectsInvalid; + private _splitRatios; + private _numCascades; + private _depthCameras; + private _depthLenses; + private _texOffsetsX; + private _texOffsetsY; + private _changeDispatcher; + private _nearPlaneDistances; + constructor(numCascades?: number); + public getSplitRatio(index: number): number; + public setSplitRatio(index: number, value: number): void; + public getDepthProjections(partition: number): Matrix3D; + private init(); + public _pSetDepthMapSize(value: number): void; + private invalidateScissorRects(); + public numCascades : number; + public pDrawDepthMap(target: RenderTexture, scene: Scene, renderer: IRenderer): void; + private updateScissorRects(); + public pUpdateDepthProjection(viewCamera: Camera): void; + private updateProjectionPartition(matrix, splitRatio, texOffsetX, texOffsetY); + public addEventListener(type: string, listener: Function): void; + public removeEventListener(type: string, listener: Function): void; + public dispatchEvent(event: Event): void; + public hasEventListener(type: string): boolean; + public _iNearPlaneDistances : number[]; + } + export = CascadeShadowMapper; + +} +declare module "awayjs-core/lib/materials/shadowmappers/CubeMapShadowMapper" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); + import RenderTexture = require("awayjs-core/lib/textures/RenderTexture"); + import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + class CubeMapShadowMapper extends ShadowMapperBase { + private _depthCameras; + private _projections; + private _needsRender; + constructor(); + private initCameras(); + private addCamera(rotationX, rotationY, rotationZ); + public pCreateDepthTexture(): TextureProxyBase; + public pUpdateDepthProjection(viewCamera: Camera): void; + public pDrawDepthMap(target: RenderTexture, scene: Scene, renderer: IRenderer): void; + } + export = CubeMapShadowMapper; + +} +declare module "awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); + import FreeMatrixProjection = require("awayjs-core/lib/projections/FreeMatrixProjection"); + import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + class DirectionalShadowMapper extends ShadowMapperBase { + public _pOverallDepthCamera: Camera; + public _pLocalFrustum: number[]; + public _pLightOffset: number; + public _pMatrix: Matrix3D; + public _pOverallDepthProjection: FreeMatrixProjection; + public _pSnap: number; + public _pCullPlanes: Plane3D[]; + public _pMinZ: number; + public _pMaxZ: number; + constructor(); + public snap : number; + public lightOffset : number; + public iDepthProjection : Matrix3D; + public depth : number; + public pDrawDepthMap(target: TextureProxyBase, scene: Scene, renderer: IRenderer): void; + public pUpdateCullPlanes(viewCamera: Camera): void; + public pUpdateDepthProjection(viewCamera: Camera): void; + public pUpdateProjectionFromFrustumCorners(viewCamera: Camera, corners: number[], matrix: Matrix3D): void; + } + export = DirectionalShadowMapper; + +} +declare module "awayjs-core/lib/materials/shadowmappers/NearDirectionalShadowMapper" { + import Camera = require("awayjs-core/lib/entities/Camera"); + import DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + class NearDirectionalShadowMapper extends DirectionalShadowMapper { + private _coverageRatio; + constructor(coverageRatio?: number); + /** + * A value between 0 and 1 to indicate the ratio of the view frustum that needs to be covered by the shadow map. + */ + public coverageRatio : number; + public pUpdateDepthProjection(viewCamera: Camera): void; + } + export = NearDirectionalShadowMapper; + +} +declare module "awayjs-core/lib/materials/shadowmappers/ShadowMapperBase" { + import Scene = require("awayjs-core/lib/containers/Scene"); + import LightBase = require("awayjs-core/lib/core/base/LightBase"); + import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); + import EntityCollector = require("awayjs-core/lib/core/traverse/EntityCollector"); + import ShadowCasterCollector = require("awayjs-core/lib/core/traverse/ShadowCasterCollector"); + import Camera = require("awayjs-core/lib/entities/Camera"); + import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + class ShadowMapperBase { + public _pCasterCollector: ShadowCasterCollector; + private _depthMap; + public _pDepthMapSize: number; + public _pLight: LightBase; + private _explicitDepthMap; + private _autoUpdateShadows; + public _iShadowsInvalid: boolean; + constructor(); + public pCreateCasterCollector(): ShadowCasterCollector; + public autoUpdateShadows : boolean; + public updateShadows(): void; + public iSetDepthMap(depthMap: TextureProxyBase): void; + public light : LightBase; + public depthMap : TextureProxyBase; + public depthMapSize : number; + public dispose(): void; + public pCreateDepthTexture(): TextureProxyBase; + public iRenderDepthMap(entityCollector: EntityCollector, renderer: IRenderer): void; + public pUpdateDepthProjection(viewCamera: Camera): void; + public pDrawDepthMap(target: TextureProxyBase, scene: Scene, renderer: IRenderer): void; + public _pSetDepthMapSize(value: any): void; + } + export = ShadowMapperBase; + +} \ No newline at end of file diff --git a/build/awayjs-core.js b/build/awayjs-core.js new file mode 100755 index 00000000..00db7c82 --- /dev/null +++ b/build/awayjs-core.js @@ -0,0 +1,34334 @@ +require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;oAnimationNodeBase object. + */ + function AnimationNodeBase() { + _super.call(this); + } + Object.defineProperty(AnimationNodeBase.prototype, "stateClass", { + get: function () { + return this._pStateClass; + }, + enumerable: true, + configurable: true + }); + + /** + * @inheritDoc + */ + AnimationNodeBase.prototype.dispose = function () { + }; + + Object.defineProperty(AnimationNodeBase.prototype, "assetType", { + /** + * @inheritDoc + */ + get: function () { + return AssetType.ANIMATION_NODE; + }, + enumerable: true, + configurable: true + }); + return AnimationNodeBase; +})(NamedAssetBase); + +module.exports = AnimationNodeBase; + + +},{"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/library/NamedAssetBase":undefined}],"awayjs-core/lib/bounds/AxisAlignedBoundingBox":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +var PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* AxisAlignedBoundingBox represents a bounding box volume that has its planes aligned to the local coordinate axes of the bounded object. +* This is useful for most meshes. +*/ +var AxisAlignedBoundingBox = (function (_super) { + __extends(AxisAlignedBoundingBox, _super); + /** + * Creates a new AxisAlignedBoundingBox object. + */ + function AxisAlignedBoundingBox() { + _super.call(this); + this._centerX = 0; + this._centerY = 0; + this._centerZ = 0; + this._halfExtentsX = 0; + this._halfExtentsY = 0; + this._halfExtentsZ = 0; + } + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.nullify = function () { + _super.prototype.nullify.call(this); + + this._centerX = this._centerY = this._centerZ = 0; + this._halfExtentsX = this._halfExtentsY = this._halfExtentsZ = 0; + }; + + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.isInFrustum = function (planes, numPlanes) { + for (var i = 0; i < numPlanes; ++i) { + var plane = planes[i]; + var a = plane.a; + var b = plane.b; + var c = plane.c; + var flippedExtentX = a < 0 ? -this._halfExtentsX : this._halfExtentsX; + var flippedExtentY = b < 0 ? -this._halfExtentsY : this._halfExtentsY; + var flippedExtentZ = c < 0 ? -this._halfExtentsZ : this._halfExtentsZ; + var projDist = a * (this._centerX + flippedExtentX) + b * (this._centerY + flippedExtentY) + c * (this._centerZ + flippedExtentZ) - plane.d; + + if (projDist < 0) + return false; + } + + return true; + }; + + AxisAlignedBoundingBox.prototype.rayIntersection = function (position, direction, targetNormal) { + if (this.containsPoint(position)) + return 0; + + var px = position.x - this._centerX; + var py = position.y - this._centerY; + var pz = position.z - this._centerZ; + + var vx = direction.x; + var vy = direction.y; + var vz = direction.z; + + var ix; + var iy; + var iz; + var rayEntryDistance; + + // ray-plane tests + var intersects; + if (vx < 0) { + rayEntryDistance = (this._halfExtentsX - px) / vx; + if (rayEntryDistance > 0) { + iy = py + rayEntryDistance * vy; + iz = pz + rayEntryDistance * vz; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 1; + targetNormal.y = 0; + targetNormal.z = 0; + + intersects = true; + } + } + } + if (!intersects && vx > 0) { + rayEntryDistance = (-this._halfExtentsX - px) / vx; + if (rayEntryDistance > 0) { + iy = py + rayEntryDistance * vy; + iz = pz + rayEntryDistance * vz; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = -1; + targetNormal.y = 0; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vy < 0) { + rayEntryDistance = (this._halfExtentsY - py) / vy; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance * vx; + iz = pz + rayEntryDistance * vz; + if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 0; + targetNormal.y = 1; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vy > 0) { + rayEntryDistance = (-this._halfExtentsY - py) / vy; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance * vx; + iz = pz + rayEntryDistance * vz; + if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 0; + targetNormal.y = -1; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vz < 0) { + rayEntryDistance = (this._halfExtentsZ - pz) / vz; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance * vx; + iy = py + rayEntryDistance * vy; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { + targetNormal.x = 0; + targetNormal.y = 0; + targetNormal.z = 1; + intersects = true; + } + } + } + if (!intersects && vz > 0) { + rayEntryDistance = (-this._halfExtentsZ - pz) / vz; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance * vx; + iy = py + rayEntryDistance * vy; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { + targetNormal.x = 0; + targetNormal.y = 0; + targetNormal.z = -1; + intersects = true; + } + } + } + + return intersects ? rayEntryDistance : -1; + }; + + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.containsPoint = function (position) { + var px = position.x - this._centerX, py = position.y - this._centerY, pz = position.z - this._centerZ; + return px <= this._halfExtentsX && px >= -this._halfExtentsX && py <= this._halfExtentsY && py >= -this._halfExtentsY && pz <= this._halfExtentsZ && pz >= -this._halfExtentsZ; + }; + + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { + this._centerX = (maxX + minX) * .5; + this._centerY = (maxY + minY) * .5; + this._centerZ = (maxZ + minZ) * .5; + this._halfExtentsX = (maxX - minX) * .5; + this._halfExtentsY = (maxY - minY) * .5; + this._halfExtentsZ = (maxZ - minZ) * .5; + + _super.prototype.fromExtremes.call(this, minX, minY, minZ, maxX, maxY, maxZ); + }; + + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.clone = function () { + var clone = new AxisAlignedBoundingBox(); + clone.fromExtremes(this._aabb.x, this._aabb.y + this._aabb.height, this._aabb.z, this._aabb.x + this._aabb.width, this._aabb.y, this._aabb.z + this._aabb.depth); + return clone; + }; + + Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsX", { + get: function () { + return this._halfExtentsX; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsY", { + get: function () { + return this._halfExtentsY; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsZ", { + get: function () { + return this._halfExtentsZ; + }, + enumerable: true, + configurable: true + }); + + /** + * Finds the closest point on the bounding volume to another given point. This can be used for maximum error calculations for content within a given bound. + * @param point The point for which to find the closest point on the bounding volume + * @param target An optional Vector3D to store the result to prevent creating a new object. + * @return + */ + AxisAlignedBoundingBox.prototype.closestPointToPoint = function (point, target) { + if (typeof target === "undefined") { target = null; } + var p; + + if (target == null) + target = new Vector3D(); + + p = point.x; + if (p < this._aabb.x) + p = this._aabb.x; + if (p > this._aabb.x + this._aabb.width) + p = this._aabb.x + this._aabb.width; + target.x = p; + + p = point.y; + if (p < this._aabb.y + this._aabb.height) + p = this._aabb.y + this._aabb.height; + if (p > this._aabb.y) + p = this._aabb.y; + target.y = p; + + p = point.z; + if (p < this._aabb.z) + p = this._aabb.z; + if (p > this._aabb.z + this._aabb.depth) + p = this._aabb.z + this._aabb.depth; + target.z = p; + + return target; + }; + + AxisAlignedBoundingBox.prototype.pUpdateBoundingRenderable = function () { + this._pBoundingEntity.transform.scale.x = Math.max(this._halfExtentsX * 2, 0.001); + this._pBoundingEntity.transform.scale.y = Math.max(this._halfExtentsY * 2, 0.001); + this._pBoundingEntity.transform.scale.z = Math.max(this._halfExtentsZ * 2, 0.001); + this._pBoundingEntity.transform.position.x = this._centerX; + this._pBoundingEntity.transform.position.y = this._centerY; + this._pBoundingEntity.transform.position.z = this._centerZ; + }; + + AxisAlignedBoundingBox.prototype.pCreateBoundingEntity = function () { + return null; + }; + + AxisAlignedBoundingBox.prototype.classifyToPlane = function (plane) { + var a = plane.a; + var b = plane.b; + var c = plane.c; + var centerDistance = a * this._centerX + b * this._centerY + c * this._centerZ - plane.d; + + if (a < 0) + a = -a; + + if (b < 0) + b = -b; + + if (c < 0) + c = -c; + + var boundOffset = a * this._halfExtentsX + b * this._halfExtentsY + c * this._halfExtentsZ; + + return centerDistance > boundOffset ? PlaneClassification.FRONT : centerDistance < -boundOffset ? PlaneClassification.BACK : PlaneClassification.INTERSECT; + }; + + AxisAlignedBoundingBox.prototype.transformFrom = function (bounds, matrix) { + var aabb = bounds; + var cx = aabb._centerX; + var cy = aabb._centerY; + var cz = aabb._centerZ; + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + + matrix.copyRawDataTo(raw); + + var m11 = raw[0], m12 = raw[4], m13 = raw[8], m14 = raw[12]; + var m21 = raw[1], m22 = raw[5], m23 = raw[9], m24 = raw[13]; + var m31 = raw[2], m32 = raw[6], m33 = raw[10], m34 = raw[14]; + + this._centerX = cx * m11 + cy * m12 + cz * m13 + m14; + this._centerY = cx * m21 + cy * m22 + cz * m23 + m24; + this._centerZ = cx * m31 + cy * m32 + cz * m33 + m34; + + if (m11 < 0) + m11 = -m11; + if (m12 < 0) + m12 = -m12; + if (m13 < 0) + m13 = -m13; + if (m21 < 0) + m21 = -m21; + if (m22 < 0) + m22 = -m22; + if (m23 < 0) + m23 = -m23; + if (m31 < 0) + m31 = -m31; + if (m32 < 0) + m32 = -m32; + if (m33 < 0) + m33 = -m33; + var hx = aabb._halfExtentsX; + var hy = aabb._halfExtentsY; + var hz = aabb._halfExtentsZ; + this._halfExtentsX = hx * m11 + hy * m12 + hz * m13; + this._halfExtentsY = hx * m21 + hy * m22 + hz * m23; + this._halfExtentsZ = hx * m31 + hy * m32 + hz * m33; + + this._aabb.width = this._aabb.height = this._aabb.depth = this._halfExtentsX * 2; + this._aabb.x = this._centerX - this._halfExtentsX; + this._aabb.y = this._centerY + this._halfExtentsY; + this._aabb.z = this._centerZ - this._halfExtentsZ; + }; + return AxisAlignedBoundingBox; +})(BoundingVolumeBase); + +module.exports = AxisAlignedBoundingBox; + + +},{"awayjs-core/lib/bounds/BoundingVolumeBase":undefined,"awayjs-core/lib/core/geom/Matrix3DUtils":undefined,"awayjs-core/lib/core/geom/PlaneClassification":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined}],"awayjs-core/lib/bounds/BoundingSphere":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + +var PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var BoundingSphere = (function (_super) { + __extends(BoundingSphere, _super); + function BoundingSphere() { + _super.call(this); + this._radius = 0; + this._centerX = 0; + this._centerY = 0; + this._centerZ = 0; + } + Object.defineProperty(BoundingSphere.prototype, "radius", { + get: function () { + return this._radius; + }, + enumerable: true, + configurable: true + }); + + BoundingSphere.prototype.nullify = function () { + _super.prototype.nullify.call(this); + this._centerX = this._centerY = this._centerZ = 0; + this._radius = 0; + }; + + BoundingSphere.prototype.isInFrustum = function (planes, numPlanes) { + for (var i = 0; i < numPlanes; ++i) { + var plane = planes[i]; + var flippedExtentX = plane.a < 0 ? -this._radius : this._radius; + var flippedExtentY = plane.b < 0 ? -this._radius : this._radius; + var flippedExtentZ = plane.c < 0 ? -this._radius : this._radius; + var projDist = plane.a * (this._centerX + flippedExtentX) + plane.b * (this._centerY + flippedExtentY) + plane.c * (this._centerZ + flippedExtentZ) - plane.d; + if (projDist < 0) { + return false; + } + } + return true; + }; + + BoundingSphere.prototype.fromSphere = function (center, radius) { + this._centerX = center.x; + this._centerY = center.y; + this._centerZ = center.z; + this._radius = radius; + this._aabb.width = this._aabb.height = this._aabb.depth = radius * 2; + this._aabb.x = this._centerX - radius; + this._aabb.y = this._centerY + radius; + this._aabb.z = this._centerZ - radius; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + }; + + BoundingSphere.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { + this._centerX = (maxX + minX) * .5; + this._centerY = (maxY + minY) * .5; + this._centerZ = (maxZ + minZ) * .5; + + var d = maxX - minX; + var y = maxY - minY; + var z = maxZ - minZ; + + if (y > d) + d = y; + + if (z > d) + d = z; + + this._radius = d * Math.sqrt(.5); + _super.prototype.fromExtremes.call(this, minX, minY, minZ, maxX, maxY, maxZ); + }; + + BoundingSphere.prototype.clone = function () { + var clone = new BoundingSphere(); + clone.fromSphere(new Vector3D(this._centerX, this._centerY, this._centerZ), this._radius); + return clone; + }; + + BoundingSphere.prototype.rayIntersection = function (position, direction, targetNormal) { + if (this.containsPoint(position)) { + return 0; + } + + var px = position.x - this._centerX, py = position.y - this._centerY, pz = position.z - this._centerZ; + var vx = direction.x, vy = direction.y, vz = direction.z; + var rayEntryDistance; + + var a = vx * vx + vy * vy + vz * vz; + var b = 2 * (px * vx + py * vy + pz * vz); + var c = px * px + py * py + pz * pz - this._radius * this._radius; + var det = b * b - 4 * a * c; + + if (det >= 0) { + var sqrtDet = Math.sqrt(det); + rayEntryDistance = (-b - sqrtDet) / (2 * a); + if (rayEntryDistance >= 0) { + targetNormal.x = px + rayEntryDistance * vx; + targetNormal.y = py + rayEntryDistance * vy; + targetNormal.z = pz + rayEntryDistance * vz; + targetNormal.normalize(); + + return rayEntryDistance; + } + } + + // ray misses sphere + return -1; + }; + + BoundingSphere.prototype.containsPoint = function (position) { + var px = position.x - this._centerX; + var py = position.y - this._centerY; + var pz = position.z - this._centerZ; + var distance = Math.sqrt(px * px + py * py + pz * pz); + return distance <= this._radius; + }; + + BoundingSphere.prototype.pUpdateBoundingEntity = function () { + var sc = this._radius; + if (sc == 0) + sc = 0.001; + + var transform = this._pBoundingEntity.transform; + transform.scale = new Vector3D(sc, sc, sc); + transform.position = new Vector3D(this._centerX, this._centerY, this._centerZ); + }; + + // TODO pCreateBoundingRenderable():WireframePrimitiveBase + BoundingSphere.prototype.pCreateBoundingEntity = function () { + return null; + }; + + //@override + BoundingSphere.prototype.classifyToPlane = function (plane) { + var a = plane.a; + var b = plane.b; + var c = plane.c; + var dd = a * this._centerX + b * this._centerY + c * this._centerZ - plane.d; + + if (a < 0) + a = -a; + + if (b < 0) + b = -b; + + if (c < 0) + c = -c; + + var rr = (a + b + c) * this._radius; + + return dd > rr ? PlaneClassification.FRONT : dd < -rr ? PlaneClassification.BACK : PlaneClassification.INTERSECT; + }; + + BoundingSphere.prototype.transformFrom = function (bounds, matrix) { + var sphere = bounds; + var cx = sphere._centerX; + var cy = sphere._centerY; + var cz = sphere._centerZ; + var raw = new Array(16); + + matrix.copyRawDataTo(raw); + + var m11 = raw[0], m12 = raw[4], m13 = raw[8], m14 = raw[12]; + var m21 = raw[1], m22 = raw[5], m23 = raw[9], m24 = raw[13]; + var m31 = raw[2], m32 = raw[6], m33 = raw[10], m34 = raw[14]; + + this._centerX = cx * m11 + cy * m12 + cz * m13 + m14; + this._centerY = cx * m21 + cy * m22 + cz * m23 + m24; + this._centerZ = cx * m31 + cy * m32 + cz * m33 + m34; + + if (m11 < 0) + m11 = -m11; + if (m12 < 0) + m12 = -m12; + if (m13 < 0) + m13 = -m13; + if (m21 < 0) + m21 = -m21; + if (m22 < 0) + m22 = -m22; + if (m23 < 0) + m23 = -m23; + if (m31 < 0) + m31 = -m31; + if (m32 < 0) + m32 = -m32; + if (m33 < 0) + m33 = -m33; + + var r = sphere._radius; + var rx = m11 + m12 + m13; + var ry = m21 + m22 + m23; + var rz = m31 + m32 + m33; + this._radius = r * Math.sqrt(rx * rx + ry * ry + rz * rz); + + this._aabb.width = this._aabb.height = this._aabb.depth = this._radius * 2; + this._aabb.x = this._centerX - this._radius; + this._aabb.y = this._centerY + this._radius; + this._aabb.z = this._centerZ - this._radius; + }; + return BoundingSphere; +})(BoundingVolumeBase); + +module.exports = BoundingSphere; + + +},{"awayjs-core/lib/bounds/BoundingVolumeBase":undefined,"awayjs-core/lib/core/geom/PlaneClassification":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined}],"awayjs-core/lib/bounds/BoundingVolumeBase":[function(require,module,exports){ +var Box = require("awayjs-core/lib/core/geom/Box"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var BoundingVolumeBase = (function () { + function BoundingVolumeBase() { + this._pAabbPoints = new Array(); + this._pAabbPointsDirty = true; + this._aabb = new Box(); + } + Object.defineProperty(BoundingVolumeBase.prototype, "aabb", { + get: function () { + return this._aabb; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BoundingVolumeBase.prototype, "aabbPoints", { + get: function () { + if (this._pAabbPointsDirty) + this.pUpdateAABBPoints(); + + return this._pAabbPoints; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BoundingVolumeBase.prototype, "boundingEntity", { + get: function () { + if (!this._pBoundingEntity) { + this._pBoundingEntity = this.pCreateBoundingEntity(); + this.pUpdateBoundingEntity(); + } + + return this._pBoundingEntity; + }, + enumerable: true, + configurable: true + }); + + BoundingVolumeBase.prototype.nullify = function () { + this._aabb.x = this._aabb.y = this._aabb.z = 0; + this._aabb.width = this._aabb.height = this._aabb.depth = 0; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + }; + + BoundingVolumeBase.prototype.disposeRenderable = function () { + if (this._pBoundingEntity) + this._pBoundingEntity.dispose(); + + this._pBoundingEntity = null; + }; + + BoundingVolumeBase.prototype.fromVertices = function (vertices) { + var i; + var len = vertices.length; + var minX, minY, minZ; + var maxX, maxY, maxZ; + + if (len == 0) { + this.nullify(); + return; + } + + var v; + + minX = maxX = vertices[i++]; + minY = maxY = vertices[i++]; + minZ = maxZ = vertices[i++]; + + while (i < len) { + v = vertices[i++]; + if (v < minX) + minX = v; + else if (v > maxX) + maxX = v; + v = vertices[i++]; + if (v < minY) + minY = v; + else if (v > maxY) + maxY = v; + v = vertices[i++]; + if (v < minZ) + minZ = v; + else if (v > maxZ) + maxZ = v; + } + + this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); + }; + + /** + * Updates the bounds to fit a Geometry object. + * + * @param geometry The Geometry object to be bounded. + */ + BoundingVolumeBase.prototype.fromGeometry = function (geometry) { + var i, j, p; + var subGeoms = geometry.subGeometries; + var subGeom; + var boundingPositions; + var numSubGeoms = subGeoms.length; + var minX, minY, minZ; + var maxX, maxY, maxZ; + + if (numSubGeoms > 0) { + i = 0; + subGeom = subGeoms[0]; + boundingPositions = subGeom.getBoundingPositions(); + minX = maxX = boundingPositions[i]; + minY = maxY = boundingPositions[i + 1]; + minZ = maxZ = boundingPositions[i + 2]; + + j = numSubGeoms; + while (j--) { + subGeom = subGeoms[j]; + boundingPositions = subGeom.getBoundingPositions(); + i = boundingPositions.length; + while (i--) { + p = boundingPositions[i]; + if (p < minX) + minX = p; + else if (p > maxX) + maxX = p; + + p = boundingPositions[i + 1]; + + if (p < minY) + minY = p; + else if (p > maxY) + maxY = p; + + p = boundingPositions[i + 2]; + + if (p < minZ) + minZ = p; + else if (p > maxZ) + maxZ = p; + } + } + + this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); + } else { + this.fromExtremes(0, 0, 0, 0, 0, 0); + } + }; + + BoundingVolumeBase.prototype.fromSphere = function (center, radius) { + this.fromExtremes(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius); + }; + + BoundingVolumeBase.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { + this._aabb.x = minX; + this._aabb.y = maxY; + this._aabb.z = minZ; + this._aabb.width = maxX - minX; + this._aabb.height = maxY - minY; + this._aabb.depth = maxZ - minZ; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + }; + + BoundingVolumeBase.prototype.isInFrustum = function (planes, numPlanes) { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.overlaps = function (bounds) { + return this._aabb.intersects(bounds.aabb); + }; + + BoundingVolumeBase.prototype.clone = function () { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.rayIntersection = function (position, direction, targetNormal) { + return -1; + }; + + BoundingVolumeBase.prototype.containsPoint = function (position) { + return false; + }; + + BoundingVolumeBase.prototype.pUpdateAABBPoints = function () { + var minX = this._aabb.x; + var minY = this._aabb.y - this._aabb.height; + var minZ = this._aabb.z; + var maxX = this._aabb.x + this._aabb.width; + var maxY = this._aabb.y; + var maxZ = this._aabb.z + this._aabb.depth; + + this._pAabbPoints[0] = minX; + this._pAabbPoints[1] = minY; + this._pAabbPoints[2] = minZ; + this._pAabbPoints[3] = maxX; + this._pAabbPoints[4] = minY; + this._pAabbPoints[5] = minZ; + this._pAabbPoints[6] = minX; + this._pAabbPoints[7] = maxY; + this._pAabbPoints[8] = minZ; + this._pAabbPoints[9] = maxX; + this._pAabbPoints[10] = maxY; + this._pAabbPoints[11] = minZ; + this._pAabbPoints[12] = minX; + this._pAabbPoints[13] = minY; + this._pAabbPoints[14] = maxZ; + this._pAabbPoints[15] = maxX; + this._pAabbPoints[16] = minY; + this._pAabbPoints[17] = maxZ; + this._pAabbPoints[18] = minX; + this._pAabbPoints[19] = maxY; + this._pAabbPoints[20] = maxZ; + this._pAabbPoints[21] = maxX; + this._pAabbPoints[22] = maxY; + this._pAabbPoints[23] = maxZ; + this._pAabbPointsDirty = false; + }; + + BoundingVolumeBase.prototype.pUpdateBoundingEntity = function () { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.pCreateBoundingEntity = function () { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.classifyToPlane = function (plane) { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.transformFrom = function (bounds, matrix) { + throw new AbstractMethodError(); + }; + return BoundingVolumeBase; +})(); + +module.exports = BoundingVolumeBase; + + +},{"awayjs-core/lib/core/geom/Box":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined}],"awayjs-core/lib/bounds/NullBounds":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + +var PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); + +var NullBounds = (function (_super) { + __extends(NullBounds, _super); + function NullBounds(alwaysIn) { + if (typeof alwaysIn === "undefined") { alwaysIn = true; } + _super.call(this); + + this._alwaysIn = alwaysIn; + + this._aabb.width = this._aabb.height = this._aabb.depth = Number.POSITIVE_INFINITY; + this._aabb.x = this._aabb.y = this._aabb.z = this._alwaysIn ? Number.NEGATIVE_INFINITY / 2 : Number.POSITIVE_INFINITY; + } + //@override + NullBounds.prototype.clone = function () { + return new NullBounds(this._alwaysIn); + }; + + //@override + NullBounds.prototype.pCreateBoundingEntity = function () { + //return this._renderable || new away.primitives.WireframeSphere( 100, 16, 12, 0xffffff, 0.5 ); + return null; + }; + + //@override + NullBounds.prototype.isInFrustum = function (planes, numPlanes) { + return this._alwaysIn; + }; + + // //@override + // public fromGeometry(geometry:away.base.Geometry) + // { + // } + //@override + NullBounds.prototype.fromSphere = function (center, radius) { + }; + + //@override + NullBounds.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { + }; + + NullBounds.prototype.classifyToPlane = function (plane) { + return PlaneClassification.INTERSECT; + }; + + //@override + NullBounds.prototype.transformFrom = function (bounds, matrix) { + this._alwaysIn = bounds._alwaysIn; + }; + return NullBounds; +})(BoundingVolumeBase); + +module.exports = NullBounds; + + +},{"awayjs-core/lib/bounds/BoundingVolumeBase":undefined,"awayjs-core/lib/core/geom/PlaneClassification":undefined}],"awayjs-core/lib/containers/DisplayObjectContainer":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); +var Error = require("awayjs-core/lib/errors/Error"); +var RangeError = require("awayjs-core/lib/errors/RangeError"); + +/** +* The DisplayObjectContainer class is the base class for all objects that can +* serve as display object containers on the display list. The display list +* manages all objects displayed in the Flash runtimes. Use the +* DisplayObjectContainer class to arrange the display objects in the display +* list. Each DisplayObjectContainer object has its own child list for +* organizing the z-order of the objects. The z-order is the front-to-back +* order that determines which object is drawn in front, which is behind, and +* so on. +* +*

DisplayObject is an abstract base class; therefore, you cannot call +* DisplayObject directly. Invoking new DisplayObject() throws an +* ArgumentError exception.

+* The DisplayObjectContainer class is an abstract base class for all objects +* that can contain child objects. It cannot be instantiated directly; calling +* the new DisplayObjectContainer() constructor throws an +* ArgumentError exception. +* +*

For more information, see the "Display Programming" chapter of the +* ActionScript 3.0 Developer's Guide.

+*/ +var DisplayObjectContainer = (function (_super) { + __extends(DisplayObjectContainer, _super); + /** + * Calling the new DisplayObjectContainer() constructor throws + * an ArgumentError exception. You can, however, call + * constructors for the following subclasses of DisplayObjectContainer: + *
    + *
  • new Loader()
  • + *
  • new Sprite()
  • + *
  • new MovieClip()
  • + *
+ */ + function DisplayObjectContainer() { + _super.call(this); + this._mouseChildren = true; + this._children = new Array(); + } + Object.defineProperty(DisplayObjectContainer.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.CONTAINER; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObjectContainer.prototype, "mouseChildren", { + /** + * Determines whether or not the children of the object are mouse, or user + * input device, enabled. If an object is enabled, a user can interact with + * it by using a mouse or user input device. The default is + * true. + * + *

This property is useful when you create a button with an instance of + * the Sprite class(instead of using the SimpleButton class). When you use a + * Sprite instance to create a button, you can choose to decorate the button + * by using the addChild() method to add additional Sprite + * instances. This process can cause unexpected behavior with mouse events + * because the Sprite instances you add as children can become the target + * object of a mouse event when you expect the parent instance to be the + * target object. To ensure that the parent instance serves as the target + * objects for mouse events, you can set the mouseChildren + * property of the parent instance to false.

+ * + *

No event is dispatched by setting this property. You must use the + * addEventListener() method to create interactive + * functionality.

+ */ + get: function () { + return this._mouseChildren; + }, + set: function (value) { + if (this._mouseChildren == value) + return; + + this._mouseChildren = value; + + this._pUpdateImplicitMouseEnabled(this._pParent ? this._pParent.mouseChildren : true); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObjectContainer.prototype, "numChildren", { + /** + * Returns the number of children of this object. + */ + get: function () { + return this._children.length; + }, + enumerable: true, + configurable: true + }); + + /** + * Adds a child DisplayObject instance to this DisplayObjectContainer + * instance. The child is added to the front(top) of all other children in + * this DisplayObjectContainer instance.(To add a child to a specific index + * position, use the addChildAt() method.) + * + *

If you add a child object that already has a different display object + * container as a parent, the object is removed from the child list of the + * other display object container.

+ * + *

Note: The command stage.addChild() can cause + * problems with a published SWF file, including security problems and + * conflicts with other loaded SWF files. There is only one Stage within a + * Flash runtime instance, no matter how many SWF files you load into the + * runtime. So, generally, objects should not be added to the Stage, + * directly, at all. The only object the Stage should contain is the root + * object. Create a DisplayObjectContainer to contain all of the items on the + * display list. Then, if necessary, add that DisplayObjectContainer instance + * to the Stage.

+ * + * @param child The DisplayObject instance to add as a child of this + * DisplayObjectContainer instance. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child is the same as the parent. Also + * throws if the caller is a child(or grandchild etc.) + * of the child being added. + * @event added Dispatched when a display object is added to the display + * list. + */ + DisplayObjectContainer.prototype.addChild = function (child) { + if (child == null) + throw new Error("Parameter child cannot be null."); + + //if child already has a parent, remove it. + if (child._pParent) + child._pParent.removeChildInternal(child); + + child.iSetParent(this); + + this._children.push(child); + + return child; + }; + + /** + * Adds a child DisplayObject instance to this DisplayObjectContainer + * instance. The child is added at the index position specified. An index of + * 0 represents the back(bottom) of the display list for this + * DisplayObjectContainer object. + * + *

For example, the following example shows three display objects, labeled + * a, b, and c, at index positions 0, 2, and 1, respectively:

+ * + *

If you add a child object that already has a different display object + * container as a parent, the object is removed from the child list of the + * other display object container.

+ * + * @param child The DisplayObject instance to add as a child of this + * DisplayObjectContainer instance. + * @param index The index position to which the child is added. If you + * specify a currently occupied index position, the child object + * that exists at that position and all higher positions are + * moved up one position in the child list. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child is the same as the parent. Also + * throws if the caller is a child(or grandchild etc.) + * of the child being added. + * @throws RangeError Throws if the index position does not exist in the + * child list. + * @event added Dispatched when a display object is added to the display + * list. + */ + DisplayObjectContainer.prototype.addChildAt = function (child, index /*int*/ ) { + return child; + }; + + DisplayObjectContainer.prototype.addChildren = function () { + var childarray = []; + for (var _i = 0; _i < (arguments.length - 0); _i++) { + childarray[_i] = arguments[_i + 0]; + } + var len = childarray.length; + for (var i = 0; i < len; i++) + this.addChild(childarray[i]); + }; + + /** + * + */ + DisplayObjectContainer.prototype.clone = function () { + var clone = new DisplayObjectContainer(); + clone.pivot = this.pivot; + clone._iMatrix3D = this._iMatrix3D; + clone.partition = this.partition; + clone.name = name; + + var len = this._children.length; + for (var i = 0; i < len; ++i) + clone.addChild(this._children[i].clone()); + + // todo: implement for all subtypes + return clone; + }; + + /** + * Determines whether the specified display object is a child of the + * DisplayObjectContainer instance or the instance itself. The search + * includes the entire display list including this DisplayObjectContainer + * instance. Grandchildren, great-grandchildren, and so on each return + * true. + * + * @param child The child object to test. + * @return true if the child object is a child of + * the DisplayObjectContainer or the container itself; otherwise + * false. + */ + DisplayObjectContainer.prototype.contains = function (child) { + return this._children.indexOf(child) >= 0; + }; + + /** + * + */ + DisplayObjectContainer.prototype.disposeWithChildren = function () { + this.dispose(); + + while (this.numChildren > 0) + this.getChildAt(0).dispose(); + }; + + /** + * Returns the child display object instance that exists at the specified + * index. + * + * @param index The index position of the child object. + * @return The child display object at the specified index position. + * @throws RangeError Throws if the index does not exist in the child + * list. + */ + DisplayObjectContainer.prototype.getChildAt = function (index /*int*/ ) { + var child = this._children[index]; + + if (child == null) + throw new RangeError("Index does not exist in the child list of the caller"); + + return child; + }; + + /** + * Returns the child display object that exists with the specified name. If + * more that one child display object has the specified name, the method + * returns the first object in the child list. + * + *

The getChildAt() method is faster than the + * getChildByName() method. The getChildAt() method + * accesses a child from a cached array, whereas the + * getChildByName() method has to traverse a linked list to + * access a child.

+ * + * @param name The name of the child to return. + * @return The child display object with the specified name. + */ + DisplayObjectContainer.prototype.getChildByName = function (name) { + var len = this._children.length; + for (var i = 0; i < len; ++i) + if (this._children[i].name == name) + return this._children[i]; + + return null; + }; + + /** + * Returns the index position of a child DisplayObject instance. + * + * @param child The DisplayObject instance to identify. + * @return The index position of the child display object to identify. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + */ + DisplayObjectContainer.prototype.getChildIndex = function (child) { + var childIndex = this._children.indexOf(child); + + if (childIndex == -1) + throw new ArgumentError("Child parameter is not a child of the caller"); + + return childIndex; + }; + + /** + * Returns an array of objects that lie under the specified point and are + * children(or grandchildren, and so on) of this DisplayObjectContainer + * instance. Any child objects that are inaccessible for security reasons are + * omitted from the returned array. To determine whether this security + * restriction affects the returned array, call the + * areInaccessibleObjectsUnderPoint() method. + * + *

The point parameter is in the coordinate space of the + * Stage, which may differ from the coordinate space of the display object + * container(unless the display object container is the Stage). You can use + * the globalToLocal() and the localToGlobal() + * methods to convert points between these coordinate spaces.

+ * + * @param point The point under which to look. + * @return An array of objects that lie under the specified point and are + * children(or grandchildren, and so on) of this + * DisplayObjectContainer instance. + */ + DisplayObjectContainer.prototype.getObjectsUnderPoint = function (point) { + return new Array(); + }; + + /** + * Removes the specified child DisplayObject instance from the + * child list of the DisplayObjectContainer instance. The parent + * property of the removed child is set to null , and the object + * is garbage collected if no other references to the child exist. The index + * positions of any display objects above the child in the + * DisplayObjectContainer are decreased by 1. + * + *

The garbage collector reallocates unused memory space. When a variable + * or object is no longer actively referenced or stored somewhere, the + * garbage collector sweeps through and wipes out the memory space it used to + * occupy if no other references to it exist.

+ * + * @param child The DisplayObject instance to remove. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + */ + DisplayObjectContainer.prototype.removeChild = function (child) { + if (child == null) + throw new Error("Parameter child cannot be null"); + + this.removeChildInternal(child); + + child.iSetParent(null); + + return child; + }; + + /** + * Removes a child DisplayObject from the specified index + * position in the child list of the DisplayObjectContainer. The + * parent property of the removed child is set to + * null, and the object is garbage collected if no other + * references to the child exist. The index positions of any display objects + * above the child in the DisplayObjectContainer are decreased by 1. + * + *

The garbage collector reallocates unused memory space. When a variable + * or object is no longer actively referenced or stored somewhere, the + * garbage collector sweeps through and wipes out the memory space it used to + * occupy if no other references to it exist.

+ * + * @param index The child index of the DisplayObject to remove. + * @return The DisplayObject instance that was removed. + * @throws RangeError Throws if the index does not exist in the child + * list. + * @throws SecurityError This child display object belongs to a sandbox to + * which the calling object does not have access. You + * can avoid this situation by having the child movie + * call the Security.allowDomain() method. + */ + DisplayObjectContainer.prototype.removeChildAt = function (index /*int*/ ) { + return this.removeChild(this._children[index]); + }; + + /** + * Removes all child DisplayObject instances from the child list + * of the DisplayObjectContainer instance. The parent property + * of the removed children is set to null, and the objects are + * garbage collected if no other references to the children exist. + * + * The garbage collector reallocates unused memory space. When a variable or + * object is no longer actively referenced or stored somewhere, the garbage + * collector sweeps through and wipes out the memory space it used to occupy + * if no other references to it exist. + * + * @param beginIndex The beginning position. A value smaller than 0 throws a RangeError. + * @param endIndex The ending position. A value smaller than 0 throws a RangeError. + * @throws RangeError Throws if the beginIndex or endIndex positions do + * not exist in the child list. + */ + DisplayObjectContainer.prototype.removeChildren = function (beginIndex, endIndex) { + if (typeof beginIndex === "undefined") { beginIndex = 0; } + if (typeof endIndex === "undefined") { endIndex = 2147483647; } + if (beginIndex < 0) + throw new RangeError("beginIndex is out of range of the child list"); + + if (endIndex > this._children.length) + throw new RangeError("endIndex is out of range of the child list"); + + for (var i = beginIndex; i < endIndex; i++) + this.removeChild(this._children[i]); + }; + + /** + * Changes the position of an existing child in the display object container. + * This affects the layering of child objects. For example, the following + * example shows three display objects, labeled a, b, and c, at index + * positions 0, 1, and 2, respectively: + * + *

When you use the setChildIndex() method and specify an + * index position that is already occupied, the only positions that change + * are those in between the display object's former and new position. All + * others will stay the same. If a child is moved to an index LOWER than its + * current index, all children in between will INCREASE by 1 for their index + * reference. If a child is moved to an index HIGHER than its current index, + * all children in between will DECREASE by 1 for their index reference. For + * example, if the display object container in the previous example is named + * container, you can swap the position of the display objects + * labeled a and b by calling the following code:

+ * + *

This code results in the following arrangement of objects:

+ * + * @param child The child DisplayObject instance for which you want to change + * the index number. + * @param index The resulting index number for the child display + * object. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + * @throws RangeError Throws if the index does not exist in the child + * list. + */ + DisplayObjectContainer.prototype.setChildIndex = function (child, index /*int*/ ) { + //TODO + }; + + /** + * Swaps the z-order (front-to-back order) of the two specified child + * objects. All other child objects in the display object container remain in + * the same index positions. + * + * @param child1 The first child object. + * @param child2 The second child object. + * @throws ArgumentError Throws if either child parameter is not a child of + * this object. + */ + DisplayObjectContainer.prototype.swapChildren = function (child1, child2) { + //TODO + }; + + /** + * Swaps the z-order(front-to-back order) of the child objects at the two + * specified index positions in the child list. All other child objects in + * the display object container remain in the same index positions. + * + * @param index1 The index position of the first child object. + * @param index2 The index position of the second child object. + * @throws RangeError If either index does not exist in the child list. + */ + DisplayObjectContainer.prototype.swapChildrenAt = function (index1 /*int*/ , index2 /*int*/ ) { + //TODO + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype.pInvalidateSceneTransform = function () { + _super.prototype.pInvalidateSceneTransform.call(this); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i].pInvalidateSceneTransform(); + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype._pUpdateScene = function (value) { + _super.prototype._pUpdateScene.call(this, value); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i]._pUpdateScene(value); + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype._pUpdateImplicitMouseEnabled = function (value) { + _super.prototype._pUpdateImplicitMouseEnabled.call(this, value); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i]._pUpdateImplicitMouseEnabled(this._mouseChildren); + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype._pUpdateImplicitVisibility = function (value) { + _super.prototype._pUpdateImplicitVisibility.call(this, value); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i]._pUpdateImplicitVisibility(this._pImplicitVisibility); + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype._pUpdateImplicitPartition = function (value) { + _super.prototype._pUpdateImplicitPartition.call(this, value); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i]._pUpdateImplicitPartition(this._pImplicitPartition); + }; + + /** + * @private + * + * @param child + */ + DisplayObjectContainer.prototype.removeChildInternal = function (child) { + this._children.splice(this.getChildIndex(child), 1); + + return child; + }; + return DisplayObjectContainer; +})(DisplayObject); + +module.exports = DisplayObjectContainer; + + +},{"awayjs-core/lib/core/base/DisplayObject":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/errors/ArgumentError":undefined,"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/errors/RangeError":undefined}],"awayjs-core/lib/containers/Loader":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + +var AssetLibraryBundle = require("awayjs-core/lib/core/library/AssetLibraryBundle"); +var AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); + +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); + +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); + +/** +* The Loader class is used to load SWF files or image(JPG, PNG, or GIF) +* files. Use the load() method to initiate loading. The loaded +* display object is added as a child of the Loader object. +* +*

Use the URLLoader class to load text or binary data.

+* +*

The Loader class overrides the following methods that it inherits, +* because a Loader object can only have one child display object - the +* display object that it loads. Calling the following methods throws an +* exception: addChild(), addChildAt(), +* removeChild(), removeChildAt(), and +* setChildIndex(). To remove a loaded display object, you must +* remove the Loader object from its parent DisplayObjectContainer +* child array.

+* +*

Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes +* are not used in ActionScript 3.0. The Loader and URLLoader classes replace +* them.

+* +*

When you use the Loader class, consider the Flash Player and Adobe AIR +* security model:

+* +*
    +*
  • You can load content from any accessible source.
  • +*
  • Loading is not allowed if the calling SWF file is in a network +* sandbox and the file to be loaded is local.
  • +*
  • If the loaded content is a SWF file written with ActionScript 3.0, it +* cannot be cross-scripted by a SWF file in another security sandbox unless +* that cross-scripting arrangement was approved through a call to the +* System.allowDomain() or the +* System.allowInsecureDomain() method in the loaded content +* file.
  • +*
  • If the loaded content is an AVM1 SWF file(written using ActionScript +* 1.0 or 2.0), it cannot be cross-scripted by an AVM2 SWF file(written using +* ActionScript 3.0). However, you can communicate between the two SWF files +* by using the LocalConnection class.
  • +*
  • If the loaded content is an image, its data cannot be accessed by a +* SWF file outside of the security sandbox, unless the domain of that SWF +* file was included in a URL policy file at the origin domain of the +* image.
  • +*
  • Movie clips in the local-with-file-system sandbox cannot script movie +* clips in the local-with-networking sandbox, and the reverse is also +* prevented.
  • +*
  • You cannot connect to commonly reserved ports. For a complete list of +* blocked ports, see "Restricting Networking APIs" in the ActionScript 3.0 +* Developer's Guide.
  • +*
+* +*

However, in AIR, content in the application security +* sandbox(content installed with the AIR application) are not restricted by +* these security limitations.

+* +*

For more information related to security, see the Flash Player Developer +* Center Topic: Security.

+* +*

When loading a SWF file from an untrusted source(such as a domain other +* than that of the Loader object's root SWF file), you may want to define a +* mask for the Loader object, to prevent the loaded content(which is a child +* of the Loader object) from drawing to portions of the Stage outside of that +* mask, as shown in the following code:

+*/ +var Loader = (function (_super) { + __extends(Loader, _super); + /** + * Creates a Loader object that you can use to load files, such as SWF, JPEG, + * GIF, or PNG files. Call the load() method to load the asset + * as a child of the Loader instance. You can then add the Loader object to + * the display list(for instance, by using the addChild() + * method of a DisplayObjectContainer instance). The asset appears on the + * Stage as it loads. + * + *

You can also use a Loader instance "offlist," that is without adding it + * to a display object container on the display list. In this mode, the + * Loader instance might be used to load a SWF file that contains additional + * modules of an application.

+ * + *

To detect when the SWF file is finished loading, you can use the events + * of the LoaderInfo object associated with the + * contentLoaderInfo property of the Loader object. At that + * point, the code in the module SWF file can be executed to initialize and + * start the module. In the offlist mode, a Loader instance might also be + * used to load a SWF file that contains components or media assets. Again, + * you can use the LoaderInfo object event notifications to detect when the + * components are finished loading. At that point, the application can start + * using the components and media assets in the library of the SWF file by + * instantiating the ActionScript 3.0 classes that represent those components + * and assets.

+ * + *

To determine the status of a Loader object, monitor the following + * events that the LoaderInfo object associated with the + * contentLoaderInfo property of the Loader object:

+ * + *
    + *
  • The open event is dispatched when loading begins.
  • + *
  • The ioError or securityError event is + * dispatched if the file cannot be loaded or if an error occured during the + * load process.
  • + *
  • The progress event fires continuously while the file is + * being loaded.
  • + *
  • The complete event is dispatched when a file completes + * downloading, but before the loaded movie clip's methods and properties are + * available.
  • + *
  • The init event is dispatched after the properties and + * methods of the loaded SWF file are accessible, so you can begin + * manipulating the loaded SWF file. This event is dispatched before the + * complete handler. In streaming SWF files, the + * init event can occur significantly earlier than the + * complete event. For most purposes, use the init + * handler.
  • + *
+ */ + function Loader(useAssetLibrary, assetLibraryId) { + if (typeof useAssetLibrary === "undefined") { useAssetLibrary = true; } + if (typeof assetLibraryId === "undefined") { assetLibraryId = null; } + var _this = this; + _super.call(this); + + this._loadingSessions = new Array(); + this._useAssetLib = useAssetLibrary; + this._assetLibId = assetLibraryId; + + this._onResourceCompleteDelegate = function (event) { + return _this.onResourceComplete(event); + }; + this._onAssetCompleteDelegate = function (event) { + return _this.onAssetComplete(event); + }; + } + Object.defineProperty(Loader.prototype, "content", { + /** + * Contains the root display object of the SWF file or image(JPG, PNG, or + * GIF) file that was loaded by using the load() or + * loadBytes() methods. + * + * @throws SecurityError The loaded SWF file or image file belongs to a + * security sandbox to which you do not have access. + * For a loaded SWF file, you can avoid this situation + * by having the file call the + * Security.allowDomain() method or by + * having the loading file specify a + * loaderContext parameter with its + * securityDomain property set to + * SecurityDomain.currentDomain when you + * call the load() or + * loadBytes() method. + */ + get: function () { + return this._content; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Loader.prototype, "contentLoaderInfo", { + /** + * Returns a LoaderInfo object corresponding to the object being loaded. + * LoaderInfo objects are shared between the Loader object and the loaded + * content object. The LoaderInfo object supplies loading progress + * information and statistics about the loaded file. + * + *

Events related to the load are dispatched by the LoaderInfo object + * referenced by the contentLoaderInfo property of the Loader + * object. The contentLoaderInfo property is set to a valid + * LoaderInfo object, even before the content is loaded, so that you can add + * event listeners to the object prior to the load.

+ * + *

To detect uncaught errors that happen in a loaded SWF, use the + * Loader.uncaughtErrorEvents property, not the + * Loader.contentLoaderInfo.uncaughtErrorEvents property.

+ */ + get: function () { + return this._contentLoaderInfo; + }, + enumerable: true, + configurable: true + }); + + /** + * Cancels a load() method operation that is currently in + * progress for the Loader instance. + * + */ + Loader.prototype.close = function () { + if (this._useAssetLib) { + var lib; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + lib.stopAllLoadingSessions(); + this._loadingSessions = null; + return; + } + var i; + var length = this._loadingSessions.length; + for (i = 0; i < length; i++) { + this.removeListeners(this._loadingSessions[i]); + this._loadingSessions[i].stop(); + this._loadingSessions[i] = null; + } + this._loadingSessions = null; + }; + + /** + * Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an + * object that is a child of this Loader object. If you load an animated GIF + * file, only the first frame is displayed. As the Loader object can contain + * only a single child, issuing a subsequent load() request + * terminates the previous request, if still pending, and commences a new + * load. + * + *

Note: In AIR 1.5 and Flash Player 10, the maximum size for a + * loaded image is 8,191 pixels in width or height, and the total number of + * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191 + * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and + * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height + * and 2,880 pixels in width.

+ * + *

A SWF file or image loaded into a Loader object inherits the position, + * rotation, and scale properties of the parent display objects of the Loader + * object.

+ * + *

Use the unload() method to remove movies or images loaded + * with this method, or to cancel a load operation that is in progress.

+ * + *

You can prevent a SWF file from using this method by setting the + * allowNetworking parameter of the the object and + * embed tags in the HTML page that contains the SWF + * content.

+ * + *

When you use this method, consider the Flash Player security model, + * which is described in the Loader class description.

+ * + *

In Flash Player 10 and later, if you use a multipart Content-Type(for + * example "multipart/form-data") that contains an upload(indicated by a + * "filename" parameter in a "content-disposition" header within the POST + * body), the POST operation is subject to the security rules applied to + * uploads:

+ * + *
    + *
  • The POST operation must be performed in response to a user-initiated + * action, such as a mouse click or key press.
  • + *
  • If the POST operation is cross-domain(the POST target is not on the + * same server as the SWF file that is sending the POST request), the target + * server must provide a URL policy file that permits cross-domain + * access.
  • + *
+ * + *

Also, for any multipart Content-Type, the syntax must be valid + * (according to the RFC2046 standard). If the syntax appears to be invalid, + * the POST operation is subject to the security rules applied to + * uploads.

+ * + *

For more information related to security, see the Flash Player + * Developer Center Topic: Security.

+ * + * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG + * file to be loaded. A relative path must be relative to the + * main SWF file. Absolute URLs must include the protocol + * reference, such as http:// or file:///. Filenames cannot + * include disk drive specifications. + * @param context A LoaderContext object, which has properties that define + * the following: + *
    + *
  • Whether or not to check for the existence of a policy + * file upon loading the object
  • + *
  • The ApplicationDomain for the loaded object
  • + *
  • The SecurityDomain for the loaded object
  • + *
  • The ImageDecodingPolicy for the loaded image + * object
  • + *
+ * + *

If the context parameter is not specified + * or refers to a null object, the loaded content remains in + * its own security domain.

+ * + *

For complete details, see the description of the + * properties in the LoaderContext + * class.

+ * @param ns An optional namespace string under which the file is to be + * loaded, allowing the differentiation of two resources with + * identical assets. + * @param parser An optional parser object for translating the loaded data + * into a usable resource. If not provided, AssetLoader will + * attempt to auto-detect the file type. + * @throws IOError The digest property of the + * request object is not + * null. You should only set the + * digest property of a URLRequest + * object when calling the + * URLLoader.load() method when + * loading a SWZ file(an Adobe platform + * component). + * @throws IllegalOperationError If the requestedContentParent + * property of the context + * parameter is a Loader. + * @throws IllegalOperationError If the LoaderContext.parameters + * parameter is set to non-null and has some + * values which are not Strings. + * @throws SecurityError The value of + * LoaderContext.securityDomain + * must be either null or + * SecurityDomain.currentDomain. + * This reflects the fact that you can only + * place the loaded media in its natural + * security sandbox or your own(the latter + * requires a policy file). + * @throws SecurityError Local SWF files may not set + * LoaderContext.securityDomain to anything + * other than null. It is not + * permitted to import non-local media into a + * local sandbox, or to place other local media + * in anything other than its natural sandbox. + * @throws SecurityError You cannot connect to commonly reserved + * ports. For a complete list of blocked ports, + * see "Restricting Networking APIs" in the + * ActionScript 3.0 Developer's Guide. + * @throws SecurityError If the applicationDomain or + * securityDomain properties of + * the context parameter are from + * a disallowed domain. + * @throws SecurityError If a local SWF file is attempting to use the + * securityDomain property of the + * context parameter. + * @event asyncError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and it is not possible to + * add the loaded content as a child to the specified + * DisplayObjectContainer. This could happen if the + * loaded content is a + * flash.display.AVM1Movie or if the + * addChild() call to the + * requestedContentParent throws an error. + * @event complete Dispatched by the contentLoaderInfo + * object when the file has completed loading. The + * complete event is always dispatched + * after the init event. + * @event httpStatus Dispatched by the contentLoaderInfo + * object when a network request is made over HTTP and + * Flash Player can detect the HTTP status code. + * @event init Dispatched by the contentLoaderInfo + * object when the properties and methods of the loaded + * SWF file are accessible. The init event + * always precedes the complete event. + * @event ioError Dispatched by the contentLoaderInfo + * object when an input or output error occurs that + * causes a load operation to fail. + * @event open Dispatched by the contentLoaderInfo + * object when the loading operation starts. + * @event progress Dispatched by the contentLoaderInfo + * object as data is received while load operation + * progresses. + * @event securityError Dispatched by the contentLoaderInfo + * object if a SWF file in the local-with-filesystem + * sandbox attempts to load content in the + * local-with-networking sandbox, or vice versa. + * @event securityError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and the security sandbox + * of the + * LoaderContext.requestedContentParent + * does not have access to the loaded SWF. + * @event unload Dispatched by the contentLoaderInfo + * object when a loaded object is removed. + */ + Loader.prototype.load = function (request, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + var token; + + if (this._useAssetLib) { + var lib; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + token = lib.load(request, context, ns, parser); + } else { + var loader = new AssetLoader(); + this._loadingSessions.push(loader); + token = loader.load(request, context, ns, parser); + } + + token.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + token.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + token._iLoader._iAddErrorHandler(this.onLoadError); + token._iLoader._iAddParseErrorHandler(this.onParseError); + + return token; + }; + + /** + * Loads from binary data stored in a ByteArray object. + * + *

The loadBytes() method is asynchronous. You must wait for + * the "init" event before accessing the properties of a loaded object.

+ * + *

When you use this method, consider the Flash Player security model, + * which is described in the Loader class description.

+ * + * @param bytes A ByteArray object. The contents of the ByteArray can be + * any of the file formats supported by the Loader class: SWF, + * GIF, JPEG, or PNG. + * @param context A LoaderContext object. Only the + * applicationDomain property of the + * LoaderContext object applies; the + * checkPolicyFile and + * securityDomain properties of the LoaderContext + * object do not apply. + * + *

If the context parameter is not specified + * or refers to a null object, the content is loaded into the + * current security domain - a process referred to as "import + * loading" in Flash Player security documentation. + * Specifically, if the loading SWF file trusts the remote SWF + * by incorporating the remote SWF into its code, then the + * loading SWF can import it directly into its own security + * domain.

+ * + *

For more information related to security, see the Flash + * Player Developer Center Topic: Security.

+ * @throws ArgumentError If the length property of the + * ByteArray object is not greater than 0. + * @throws IllegalOperationError If the checkPolicyFile or + * securityDomain property of the + * context parameter are non-null. + * @throws IllegalOperationError If the requestedContentParent + * property of the context + * parameter is a Loader. + * @throws IllegalOperationError If the LoaderContext.parameters + * parameter is set to non-null and has some + * values which are not Strings. + * @throws SecurityError If the provided + * applicationDomain property of + * the context property is from a + * disallowed domain. + * @throws SecurityError You cannot connect to commonly reserved + * ports. For a complete list of blocked ports, + * see "Restricting Networking APIs" in the + * ActionScript 3.0 Developer's Guide. + * @event asyncError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and it is not possible to + * add the loaded content as a child to the specified + * DisplayObjectContainer. This could happen if the + * loaded content is a + * flash.display.AVM1Movie or if the + * addChild() call to the + * requestedContentParent throws an error. + * @event complete Dispatched by the contentLoaderInfo + * object when the operation is complete. The + * complete event is always dispatched + * after the init event. + * @event init Dispatched by the contentLoaderInfo + * object when the properties and methods of the loaded + * data are accessible. The init event + * always precedes the complete event. + * @event ioError Dispatched by the contentLoaderInfo + * object when the runtime cannot parse the data in the + * byte array. + * @event open Dispatched by the contentLoaderInfo + * object when the operation starts. + * @event progress Dispatched by the contentLoaderInfo + * object as data is transfered in memory. + * @event securityError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and the security sandbox + * of the + * LoaderContext.requestedContentParent + * does not have access to the loaded SWF. + * @event unload Dispatched by the contentLoaderInfo + * object when a loaded object is removed. + */ + Loader.prototype.loadData = function (data, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + var token; + + if (this._useAssetLib) { + var lib; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + token = lib.loadData(data, context, ns, parser); + } else { + var loader = new AssetLoader(); + this._loadingSessions.push(loader); + token = loader.loadData(data, '', context, ns, parser); + } + + token.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + token.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + token._iLoader._iAddErrorHandler(this.onLoadError); + token._iLoader._iAddParseErrorHandler(this.onParseError); + + return token; + }; + + /** + * Removes a child of this Loader object that was loaded by using the + * load() method. The property of the associated + * LoaderInfo object is reset to null. The child is not + * necessarily destroyed because other objects might have references to it; + * however, it is no longer a child of the Loader object. + * + *

As a best practice, before you unload a child SWF file, you should + * explicitly close any streams in the child SWF file's objects, such as + * LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise, + * audio in the child SWF file might continue to play, even though the child + * SWF file was unloaded. To close streams in the child SWF file, add an + * event listener to the child that listens for the unload + * event. When the parent calls Loader.unload(), the + * unload event is dispatched to the child. The following code + * shows how you might do this:

+ *
 public closeAllStreams(evt:Event) {
+    * myNetStream.close(); mySound.close(); myNetConnection.close();
+    * myLocalConnection.close(); }
+    * myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,
+    * closeAllStreams);
+ * + */ + Loader.prototype.unload = function () { + //TODO + }; + + /** + * Enables a specific parser. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parserClass The parser class to enable. + * @see away.parsers.Parsers + */ + Loader.enableParser = function (parserClass) { + AssetLoader.enableParser(parserClass); + }; + + /** + * Enables a list of parsers. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parserClasses A Vector of parser classes to enable. + * @see away.parsers.Parsers + */ + Loader.enableParsers = function (parserClasses) { + AssetLoader.enableParsers(parserClasses); + }; + + Loader.prototype.removeListeners = function (dispatcher) { + dispatcher.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + dispatcher.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + }; + + Loader.prototype.onAssetComplete = function (event) { + this.dispatchEvent(event); + }; + + /** + * Called when an error occurs during loading + */ + Loader.prototype.onLoadError = function (event) { + if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + }; + + /** + * Called when a an error occurs during parsing + */ + Loader.prototype.onParseError = function (event) { + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + }; + + /** + * Called when the resource and all of its dependencies was retrieved. + */ + Loader.prototype.onResourceComplete = function (event) { + var content = event.content; + + this._content = content; + + if (content) + this.addChild(content); + + this.dispatchEvent(event); + }; + return Loader; +})(DisplayObjectContainer); + +module.exports = Loader; + + +},{"awayjs-core/lib/containers/DisplayObjectContainer":undefined,"awayjs-core/lib/core/library/AssetLibraryBundle":undefined,"awayjs-core/lib/core/library/AssetLoader":undefined,"awayjs-core/lib/events/AssetEvent":undefined,"awayjs-core/lib/events/IOErrorEvent":undefined,"awayjs-core/lib/events/LoaderEvent":undefined,"awayjs-core/lib/events/ParserEvent":undefined}],"awayjs-core/lib/containers/Scene":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + +var NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +var Partition = require("awayjs-core/lib/core/partition/Partition"); + +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var SceneEvent = require("awayjs-core/lib/events/SceneEvent"); + +var Scene = (function (_super) { + __extends(Scene, _super); + function Scene() { + _super.call(this); + this._expandedPartitions = new Array(); + this._partitions = new Array(); + this._iCollectionMark = 0; + + this._iSceneGraphRoot = new DisplayObjectContainer(); + + this._iSceneGraphRoot._iSetScene(this); + this._iSceneGraphRoot._iIsRoot = true; + this._iSceneGraphRoot.partition = new Partition(new NodeBase()); + } + Scene.prototype.traversePartitions = function (traverser) { + var i = 0; + var len = this._partitions.length; + + traverser.scene = this; + + while (i < len) { + this._iCollectionMark++; + this._partitions[i++].traverse(traverser); + } + }; + + Object.defineProperty(Scene.prototype, "partition", { + get: function () { + return this._iSceneGraphRoot.partition; + }, + set: function (value) { + this._iSceneGraphRoot.partition = value; + + this.dispatchEvent(new SceneEvent(SceneEvent.PARTITION_CHANGED, this._iSceneGraphRoot)); + }, + enumerable: true, + configurable: true + }); + + + Scene.prototype.contains = function (child) { + return this._iSceneGraphRoot.contains(child); + }; + + Scene.prototype.addChild = function (child) { + return this._iSceneGraphRoot.addChild(child); + }; + + Scene.prototype.removeChild = function (child) { + this._iSceneGraphRoot.removeChild(child); + }; + + Scene.prototype.removeChildAt = function (index) { + this._iSceneGraphRoot.removeChildAt(index); + }; + + Scene.prototype.getChildAt = function (index) { + return this._iSceneGraphRoot.getChildAt(index); + }; + + Object.defineProperty(Scene.prototype, "numChildren", { + get: function () { + return this._iSceneGraphRoot.numChildren; + }, + enumerable: true, + configurable: true + }); + + /** + * @internal + */ + Scene.prototype.iRegisterEntity = function (displayObject) { + if (displayObject.partition) + this.iRegisterPartition(displayObject.partition); + + if (displayObject.isEntity) + displayObject._iAssignedPartition.iMarkForUpdate(displayObject); + }; + + /** + * @internal + */ + Scene.prototype.iRegisterPartition = function (partition) { + this._expandedPartitions.push(partition); + + //ensure duplicates are not found in partitions array + if (this._partitions.indexOf(partition) == -1) + this._partitions.push(partition); + }; + + /** + * @internal + */ + Scene.prototype.iUnregisterEntity = function (displayObject) { + if (displayObject.partition) + this.iUnregisterPartition(displayObject.partition); + + if (displayObject.isEntity) + displayObject._iAssignedPartition.iRemoveEntity(displayObject); + }; + + /** + * @internal + */ + Scene.prototype.iUnregisterPartition = function (partition) { + this._expandedPartitions.splice(this._expandedPartitions.indexOf(partition), 1); + + //if no more partition references found, remove from partitions array + if (this._expandedPartitions.indexOf(partition) == -1) + this._partitions.splice(this._partitions.indexOf(partition), 1); + }; + return Scene; +})(EventDispatcher); + +module.exports = Scene; + + +},{"awayjs-core/lib/containers/DisplayObjectContainer":undefined,"awayjs-core/lib/core/partition/NodeBase":undefined,"awayjs-core/lib/core/partition/Partition":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/events/SceneEvent":undefined}],"awayjs-core/lib/containers/View":[function(require,module,exports){ +var Scene = require("awayjs-core/lib/containers/Scene"); + +var RaycastPicker = require("awayjs-core/lib/core/pick/RaycastPicker"); + +var Camera = require("awayjs-core/lib/entities/Camera"); +var CameraEvent = require("awayjs-core/lib/events/CameraEvent"); +var SceneEvent = require("awayjs-core/lib/events/SceneEvent"); +var RendererEvent = require("awayjs-core/lib/events/RendererEvent"); +var MouseManager = require("awayjs-core/lib/managers/MouseManager"); +var getTimer = require("awayjs-core/lib/utils/getTimer"); + +var View = (function () { + /* + *********************************************************************** + * Disabled / Not yet implemented + *********************************************************************** + * + * private _background:away.textures.Texture2DBase; + * + * public _pTouch3DManager:away.managers.Touch3DManager; + * + */ + function View(renderer, scene, camera) { + if (typeof scene === "undefined") { scene = null; } + if (typeof camera === "undefined") { camera = null; } + var _this = this; + this._width = 0; + this._height = 0; + this._time = 0; + this._deltaTime = 0; + this._backgroundColor = 0x000000; + this._backgroundAlpha = 1; + this._viewportDirty = true; + this._scissorDirty = true; + this._mousePicker = new RaycastPicker(); + this._onScenePartitionChangedDelegate = function (event) { + return _this.onScenePartitionChanged(event); + }; + this._onProjectionChangedDelegate = function (event) { + return _this.onProjectionChanged(event); + }; + this._onViewportUpdatedDelegate = function (event) { + return _this.onViewportUpdated(event); + }; + this._onScissorUpdatedDelegate = function (event) { + return _this.onScissorUpdated(event); + }; + + this.scene = scene || new Scene(); + this.camera = camera || new Camera(); + this.renderer = renderer; + + //make sure document border is zero + document.body.style.margin = "0px"; + + this._htmlElement = document.createElement("div"); + this._htmlElement.style.position = "absolute"; + + document.body.appendChild(this._htmlElement); + + this._mouseManager = MouseManager.getInstance(); + this._mouseManager.registerView(this); + // if (this._shareContext) + // this._mouse3DManager.addViewLayer(this); + } + /** + * + * @param e + */ + View.prototype.onScenePartitionChanged = function (event) { + if (this._pCamera) + this._pCamera.partition = this.scene.partition; + }; + + Object.defineProperty(View.prototype, "mouseX", { + get: function () { + return this._pMouseX; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(View.prototype, "mouseY", { + get: function () { + return this._pMouseY; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(View.prototype, "htmlElement", { + /** + * + */ + get: function () { + return this._htmlElement; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(View.prototype, "renderer", { + /** + * + */ + get: function () { + return this._pRenderer; + }, + set: function (value) { + if (this._pRenderer == value) + return; + + if (this._pRenderer) { + this._pRenderer.dispose(); + this._pRenderer.removeEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); + this._pRenderer.removeEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); + } + + this._pRenderer = value; + + this._pRenderer.addEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); + this._pRenderer.addEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); + + //reset entity collector + this._pEntityCollector = this._pRenderer._iCreateEntityCollector(); + + if (this._pCamera) + this._pEntityCollector.camera = this._pCamera; + + //reset back buffer + this._pRenderer._iBackgroundR = ((this._backgroundColor >> 16) & 0xff) / 0xff; + this._pRenderer._iBackgroundG = ((this._backgroundColor >> 8) & 0xff) / 0xff; + this._pRenderer._iBackgroundB = (this._backgroundColor & 0xff) / 0xff; + this._pRenderer._iBackgroundAlpha = this._backgroundAlpha; + this._pRenderer.width = this._width; + this._pRenderer.height = this._height; + this._pRenderer.shareContext = this._shareContext; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "shareContext", { + /** + * + */ + get: function () { + return this._shareContext; + }, + set: function (value) { + if (this._shareContext == value) + return; + + this._shareContext = value; + + if (this._pRenderer) + this._pRenderer.shareContext = this._shareContext; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "backgroundColor", { + /** + * + */ + get: function () { + return this._backgroundColor; + }, + set: function (value) { + if (this._backgroundColor == value) + return; + + this._backgroundColor = value; + + this._pRenderer._iBackgroundR = ((value >> 16) & 0xff) / 0xff; + this._pRenderer._iBackgroundG = ((value >> 8) & 0xff) / 0xff; + this._pRenderer._iBackgroundB = (value & 0xff) / 0xff; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "backgroundAlpha", { + /** + * + * @returns {number} + */ + get: function () { + return this._backgroundAlpha; + }, + /** + * + * @param value + */ + set: function (value) { + if (value > 1) + value = 1; + else if (value < 0) + value = 0; + + if (this._backgroundAlpha == value) + return; + + this._pRenderer._iBackgroundAlpha = this._backgroundAlpha = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "camera", { + /** + * + * @returns {Camera3D} + */ + get: function () { + return this._pCamera; + }, + /** + * Set camera that's used to render the scene for this viewport + */ + set: function (value) { + if (this._pCamera == value) + return; + + if (this._pCamera) + this._pCamera.removeEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); + + this._pCamera = value; + + if (this._pEntityCollector) + this._pEntityCollector.camera = this._pCamera; + + if (this._pScene) + this._pCamera.partition = this._pScene.partition; + + this._pCamera.addEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); + this._scissorDirty = true; + this._viewportDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "scene", { + /** + * + * @returns {away.containers.Scene3D} + */ + get: function () { + return this._pScene; + }, + /** + * Set the scene that's used to render for this viewport + */ + set: function (value) { + if (this._pScene == value) + return; + + if (this._pScene) + this._pScene.removeEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); + + this._pScene = value; + + this._pScene.addEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); + + if (this._pCamera) + this._pCamera.partition = this._pScene.partition; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "deltaTime", { + /** + * + * @returns {number} + */ + get: function () { + return this._deltaTime; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(View.prototype, "width", { + /** + * + */ + get: function () { + return this._width; + }, + set: function (value) { + if (this._width == value) + return; + + this._width = value; + this._aspectRatio = this._width / this._height; + this._pCamera.projection._iAspectRatio = this._aspectRatio; + this._pRenderer.width = value; + this._htmlElement.style.width = value + "px"; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "height", { + /** + * + */ + get: function () { + return this._height; + }, + set: function (value) { + if (this._height == value) + return; + + this._height = value; + this._aspectRatio = this._width / this._height; + this._pCamera.projection._iAspectRatio = this._aspectRatio; + this._pRenderer.height = value; + this._htmlElement.style.height = value + "px"; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "mousePicker", { + /** + * + */ + get: function () { + return this._mousePicker; + }, + set: function (value) { + if (this._mousePicker == value) + return; + + if (value == null) + this._mousePicker = new RaycastPicker(); + else + this._mousePicker = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "x", { + /** + * + */ + get: function () { + return this._pRenderer.x; + }, + set: function (value) { + if (this._pRenderer.x == value) + return; + + this._pRenderer.x == value; + this._htmlElement.style.left = value + "px"; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "y", { + /** + * + */ + get: function () { + return this._pRenderer.y; + }, + set: function (value) { + if (this._pRenderer.y == value) + return; + + this._pRenderer.y == value; + this._htmlElement.style.top = value + "px"; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "visible", { + /** + * + */ + get: function () { + return (this._htmlElement.style.visibility == "visible"); + }, + set: function (value) { + this._htmlElement.style.visibility = value ? "visible" : "hidden"; + //TODO transfer visible property to associated context (if one exists) + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "renderedFacesCount", { + /** + * + * @returns {number} + */ + get: function () { + return 0; + //return this._pEntityCollector._pNumTriangles;//numTriangles; + }, + enumerable: true, + configurable: true + }); + + /** + * Renders the view. + */ + View.prototype.render = function () { + this.pUpdateTime(); + + //update view and size data + this._pCamera.projection._iAspectRatio = this._aspectRatio; + + if (this._scissorDirty) { + this._scissorDirty = false; + this._pCamera.projection._iUpdateScissorRect(this._pRenderer.scissorRect.x, this._pRenderer.scissorRect.y, this._pRenderer.scissorRect.width, this._pRenderer.scissorRect.height); + } + + if (this._viewportDirty) { + this._viewportDirty = false; + this._pCamera.projection._iUpdateViewport(this._pRenderer.viewPort.x, this._pRenderer.viewPort.y, this._pRenderer.viewPort.width, this._pRenderer.viewPort.height); + } + + // update picking + if (!this._shareContext) { + if (this.forceMouseMove && this._htmlElement == this._mouseManager._iActiveDiv && !this._mouseManager._iUpdateDirty) + this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + + this._mouseManager.fireMouseEvents(this.forceMouseMove); + //_touch3DManager.fireTouchEvents(); + } + + //_touch3DManager.updateCollider(); + //clear entity collector ready for collection + this._pEntityCollector.clear(); + + // collect stuff to render + this._pScene.traversePartitions(this._pEntityCollector); + + //render the contents of the entity collector + this._pRenderer.render(this._pEntityCollector); + }; + + /** + * + */ + View.prototype.pUpdateTime = function () { + var time = getTimer(); + + if (this._time == 0) + this._time = time; + + this._deltaTime = time - this._time; + this._time = time; + }; + + /** + * + */ + View.prototype.dispose = function () { + this._pRenderer.dispose(); + + // TODO: imeplement mouseManager / touch3DManager + this._mouseManager.unregisterView(this); + + //this._touch3DManager.disableTouchListeners(this); + //this._touch3DManager.dispose(); + this._mouseManager = null; + + //this._touch3DManager = null; + this._pRenderer = null; + this._pEntityCollector = null; + }; + + Object.defineProperty(View.prototype, "iEntityCollector", { + /** + * + */ + get: function () { + return this._pEntityCollector; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + View.prototype.onProjectionChanged = function (event) { + this._scissorDirty = true; + this._viewportDirty = true; + }; + + /** + * + */ + View.prototype.onViewportUpdated = function (event) { + this._viewportDirty = true; + }; + + /** + * + */ + View.prototype.onScissorUpdated = function (event) { + this._scissorDirty = true; + }; + + View.prototype.project = function (point3d) { + var v = this._pCamera.project(point3d); + v.x = v.x * this._pRenderer.viewPort.width / 2 + this._width * this._pCamera.projection.originX; + v.y = v.y * this._pRenderer.viewPort.height / 2 + this._height * this._pCamera.projection.originY; + + return v; + }; + + View.prototype.unproject = function (sX, sY, sZ) { + return this._pCamera.unproject(2 * (sX - this._width * this._pCamera.projection.originX) / this._pRenderer.viewPort.width, 2 * (sY - this._height * this._pCamera.projection.originY) / this._pRenderer.viewPort.height, sZ); + }; + + View.prototype.getRay = function (sX, sY, sZ) { + return this._pCamera.getRay((sX * 2 - this._width) / this._width, (sY * 2 - this._height) / this._height, sZ); + }; + + /*TODO: implement Background + public get background():away.textures.Texture2DBase + { + return this._background; + } + */ + /*TODO: implement Background + public set background( value:away.textures.Texture2DBase ) + { + this._background = value; + this._renderer.background = _background; + } + */ + // TODO: required dependency stageGL + View.prototype.updateCollider = function () { + if (!this._shareContext) { + if (this._htmlElement == this._mouseManager._iActiveDiv) + this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + } else { + var collidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + + if (this.layeredView || this._mouseManager._iCollidingObject == null || collidingObject.rayEntryDistance < this._mouseManager._iCollidingObject.rayEntryDistance) + this._mouseManager._iCollidingObject = collidingObject; + } + }; + return View; +})(); + +module.exports = View; + + +},{"awayjs-core/lib/containers/Scene":undefined,"awayjs-core/lib/core/pick/RaycastPicker":undefined,"awayjs-core/lib/entities/Camera":undefined,"awayjs-core/lib/events/CameraEvent":undefined,"awayjs-core/lib/events/RendererEvent":undefined,"awayjs-core/lib/events/SceneEvent":undefined,"awayjs-core/lib/managers/MouseManager":undefined,"awayjs-core/lib/utils/getTimer":undefined}],"awayjs-core/lib/controllers/ControllerBase":[function(require,module,exports){ +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var ControllerBase = (function () { + function ControllerBase(targetObject) { + if (typeof targetObject === "undefined") { targetObject = null; } + this._pAutoUpdate = true; + this.targetObject = targetObject; + } + ControllerBase.prototype.pNotifyUpdate = function () { + if (this._pTargetObject && this._pTargetObject._iAssignedPartition && this._pAutoUpdate) { + this._pTargetObject._iAssignedPartition.iMarkForUpdate(this._pTargetObject); + } + }; + + Object.defineProperty(ControllerBase.prototype, "targetObject", { + get: function () { + return this._pTargetObject; + }, + set: function (val) { + if (this._pTargetObject == val) { + return; + } + + if (this._pTargetObject && this._pAutoUpdate) { + this._pTargetObject._iController = null; + } + this._pTargetObject = val; + + if (this._pTargetObject && this._pAutoUpdate) { + this._pTargetObject._iController = this; + } + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ControllerBase.prototype, "autoUpdate", { + get: function () { + return this._pAutoUpdate; + }, + set: function (val) { + if (this._pAutoUpdate == val) { + return; + } + this._pAutoUpdate = val; + + if (this._pTargetObject) { + if (this._pTargetObject) { + this._pTargetObject._iController = this; + } else { + this._pTargetObject._iController = null; + } + } + }, + enumerable: true, + configurable: true + }); + + + ControllerBase.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + throw new AbstractMethodError(); + }; + return ControllerBase; +})(); + +module.exports = ControllerBase; + + +},{"awayjs-core/lib/errors/AbstractMethodError":undefined}],"awayjs-core/lib/controllers/FirstPersonController":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); + +var MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); + +/** +* Extended camera used to hover round a specified target object. +* +* @see away3d.containers.View3D +*/ +var FirstPersonController = (function (_super) { + __extends(FirstPersonController, _super); + /** + * Creates a new HoverController object. + */ + function FirstPersonController(targetObject, panAngle, tiltAngle, minTiltAngle, maxTiltAngle, steps, wrapPanAngle) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof panAngle === "undefined") { panAngle = 0; } + if (typeof tiltAngle === "undefined") { tiltAngle = 90; } + if (typeof minTiltAngle === "undefined") { minTiltAngle = -90; } + if (typeof maxTiltAngle === "undefined") { maxTiltAngle = 90; } + if (typeof steps === "undefined") { steps = 8; } + if (typeof wrapPanAngle === "undefined") { wrapPanAngle = false; } + _super.call(this, targetObject); + this._iCurrentPanAngle = 0; + this._iCurrentTiltAngle = 90; + this._panAngle = 0; + this._tiltAngle = 90; + this._minTiltAngle = -90; + this._maxTiltAngle = 90; + this._steps = 8; + this._walkIncrement = 0; + this._strafeIncrement = 0; + this._wrapPanAngle = false; + this.fly = false; + + this.panAngle = panAngle; + this.tiltAngle = tiltAngle; + this.minTiltAngle = minTiltAngle; + this.maxTiltAngle = maxTiltAngle; + this.steps = steps; + this.wrapPanAngle = wrapPanAngle; + + //values passed in contrustor are applied immediately + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + Object.defineProperty(FirstPersonController.prototype, "steps", { + /** + * Fractional step taken each time the hover() method is called. Defaults to 8. + * + * Affects the speed at which the tiltAngle and panAngle resolve to their targets. + * + * @see #tiltAngle + * @see #panAngle + */ + get: function () { + return this._steps; + }, + set: function (val) { + val = (val < 1) ? 1 : val; + + if (this._steps == val) + return; + + this._steps = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "panAngle", { + /** + * Rotation of the camera in degrees around the y axis. Defaults to 0. + */ + get: function () { + return this._panAngle; + }, + set: function (val) { + if (this._panAngle == val) + return; + + this._panAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "tiltAngle", { + /** + * Elevation angle of the camera in degrees. Defaults to 90. + */ + get: function () { + return this._tiltAngle; + }, + set: function (val) { + val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); + + if (this._tiltAngle == val) + return; + + this._tiltAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "minTiltAngle", { + /** + * Minimum bounds for the tiltAngle. Defaults to -90. + * + * @see #tiltAngle + */ + get: function () { + return this._minTiltAngle; + }, + set: function (val) { + if (this._minTiltAngle == val) + return; + + this._minTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "maxTiltAngle", { + /** + * Maximum bounds for the tiltAngle. Defaults to 90. + * + * @see #tiltAngle + */ + get: function () { + return this._maxTiltAngle; + }, + set: function (val) { + if (this._maxTiltAngle == val) + return; + + this._maxTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "wrapPanAngle", { + /** + * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. + */ + get: function () { + return this._wrapPanAngle; + }, + set: function (val) { + if (this._wrapPanAngle == val) + return; + + this._wrapPanAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + /** + * Updates the current tilt angle and pan angle values. + * + * Values are calculated using the defined tiltAngle, panAngle and steps variables. + * + * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. + * + * @see #tiltAngle + * @see #panAngle + * @see #steps + */ + FirstPersonController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { + this.pNotifyUpdate(); + + if (this._wrapPanAngle) { + if (this._panAngle < 0) { + this._iCurrentPanAngle += this._panAngle % 360 + 360 - this._panAngle; + this._panAngle = this._panAngle % 360 + 360; + } else { + this._iCurrentPanAngle += this._panAngle % 360 - this._panAngle; + this._panAngle = this._panAngle % 360; + } + + while (this._panAngle - this._iCurrentPanAngle < -180) + this._iCurrentPanAngle -= 360; + + while (this._panAngle - this._iCurrentPanAngle > 180) + this._iCurrentPanAngle += 360; + } + + if (interpolate) { + this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle) / (this.steps + 1); + this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle) / (this.steps + 1); + } else { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + + //snap coords if angle differences are close + if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + } + + this.targetObject.rotationX = this._iCurrentTiltAngle; + this.targetObject.rotationY = this._iCurrentPanAngle; + + if (this._walkIncrement) { + if (this.fly) { + this.targetObject.transform.moveForward(this._walkIncrement); + } else { + this.targetObject.x += this._walkIncrement * Math.sin(this._panAngle * MathConsts.DEGREES_TO_RADIANS); + this.targetObject.z += this._walkIncrement * Math.cos(this._panAngle * MathConsts.DEGREES_TO_RADIANS); + } + this._walkIncrement = 0; + } + + if (this._strafeIncrement) { + this.targetObject.transform.moveRight(this._strafeIncrement); + this._strafeIncrement = 0; + } + }; + + FirstPersonController.prototype.incrementWalk = function (val) { + if (val == 0) + return; + + this._walkIncrement += val; + + this.pNotifyUpdate(); + }; + + FirstPersonController.prototype.incrementStrafe = function (val) { + if (val == 0) + return; + + this._strafeIncrement += val; + + this.pNotifyUpdate(); + }; + return FirstPersonController; +})(ControllerBase); + +module.exports = FirstPersonController; + + +},{"awayjs-core/lib/controllers/ControllerBase":undefined,"awayjs-core/lib/core/geom/MathConsts":undefined}],"awayjs-core/lib/controllers/FollowController":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var HoverController = require("awayjs-core/lib/controllers/HoverController"); + +/** +* Controller used to follow behind an object on the XZ plane, with an optional +* elevation (tiltAngle). +* +* @see away3d.containers.View3D +*/ +var FollowController = (function (_super) { + __extends(FollowController, _super); + function FollowController(targetObject, lookAtObject, tiltAngle, distance) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof lookAtObject === "undefined") { lookAtObject = null; } + if (typeof tiltAngle === "undefined") { tiltAngle = 45; } + if (typeof distance === "undefined") { distance = 700; } + _super.call(this, targetObject, lookAtObject, 0, tiltAngle, distance); + } + FollowController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + interpolate = interpolate; // unused: prevents warning + + if (!this.lookAtObject) + return; + + this.panAngle = this._pLookAtObject.rotationY - 180; + _super.prototype.update.call(this); + }; + return FollowController; +})(HoverController); + +module.exports = FollowController; + + +},{"awayjs-core/lib/controllers/HoverController":undefined}],"awayjs-core/lib/controllers/HoverController":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var LookAtController = require("awayjs-core/lib/controllers/LookAtController"); + +var MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* Extended camera used to hover round a specified target object. +* +* @see away.containers.View +*/ +var HoverController = (function (_super) { + __extends(HoverController, _super); + /** + * Creates a new HoverController object. + */ + function HoverController(targetObject, lookAtObject, panAngle, tiltAngle, distance, minTiltAngle, maxTiltAngle, minPanAngle, maxPanAngle, steps, yFactor, wrapPanAngle) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof lookAtObject === "undefined") { lookAtObject = null; } + if (typeof panAngle === "undefined") { panAngle = 0; } + if (typeof tiltAngle === "undefined") { tiltAngle = 90; } + if (typeof distance === "undefined") { distance = 1000; } + if (typeof minTiltAngle === "undefined") { minTiltAngle = -90; } + if (typeof maxTiltAngle === "undefined") { maxTiltAngle = 90; } + if (typeof minPanAngle === "undefined") { minPanAngle = null; } + if (typeof maxPanAngle === "undefined") { maxPanAngle = null; } + if (typeof steps === "undefined") { steps = 8; } + if (typeof yFactor === "undefined") { yFactor = 2; } + if (typeof wrapPanAngle === "undefined") { wrapPanAngle = false; } + _super.call(this, targetObject, lookAtObject); + this._iCurrentPanAngle = 0; + this._iCurrentTiltAngle = 90; + this._panAngle = 0; + this._tiltAngle = 90; + this._distance = 1000; + this._minPanAngle = -Infinity; + this._maxPanAngle = Infinity; + this._minTiltAngle = -90; + this._maxTiltAngle = 90; + this._steps = 8; + this._yFactor = 2; + this._wrapPanAngle = false; + this._upAxis = new Vector3D(); + + this.distance = distance; + this.panAngle = panAngle; + this.tiltAngle = tiltAngle; + this.minPanAngle = (minPanAngle != null) ? minPanAngle : -Infinity; + this.maxPanAngle = (maxPanAngle != null) ? maxPanAngle : Infinity; + this.minTiltAngle = minTiltAngle; + this.maxTiltAngle = maxTiltAngle; + this.steps = steps; + this.yFactor = yFactor; + this.wrapPanAngle = wrapPanAngle; + + //values passed in contrustor are applied immediately + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + Object.defineProperty(HoverController.prototype, "steps", { + /** + * Fractional step taken each time the hover() method is called. Defaults to 8. + * + * Affects the speed at which the tiltAngle and panAngle resolve to their targets. + * + * @see #tiltAngle + * @see #panAngle + */ + get: function () { + return this._steps; + }, + set: function (val) { + val = (val < 1) ? 1 : val; + + if (this._steps == val) + return; + + this._steps = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "panAngle", { + /** + * Rotation of the camera in degrees around the y axis. Defaults to 0. + */ + get: function () { + return this._panAngle; + }, + set: function (val) { + val = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, val)); + + if (this._panAngle == val) + return; + + this._panAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "tiltAngle", { + /** + * Elevation angle of the camera in degrees. Defaults to 90. + */ + get: function () { + return this._tiltAngle; + }, + set: function (val) { + val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); + + if (this._tiltAngle == val) + return; + + this._tiltAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "distance", { + /** + * Distance between the camera and the specified target. Defaults to 1000. + */ + get: function () { + return this._distance; + }, + set: function (val) { + if (this._distance == val) + return; + + this._distance = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "minPanAngle", { + /** + * Minimum bounds for the panAngle. Defaults to -Infinity. + * + * @see #panAngle + */ + get: function () { + return this._minPanAngle; + }, + set: function (val) { + if (this._minPanAngle == val) + return; + + this._minPanAngle = val; + + this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "maxPanAngle", { + /** + * Maximum bounds for the panAngle. Defaults to Infinity. + * + * @see #panAngle + */ + get: function () { + return this._maxPanAngle; + }, + set: function (val) { + if (this._maxPanAngle == val) + return; + + this._maxPanAngle = val; + + this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "minTiltAngle", { + /** + * Minimum bounds for the tiltAngle. Defaults to -90. + * + * @see #tiltAngle + */ + get: function () { + return this._minTiltAngle; + }, + set: function (val) { + if (this._minTiltAngle == val) + return; + + this._minTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "maxTiltAngle", { + /** + * Maximum bounds for the tiltAngle. Defaults to 90. + * + * @see #tiltAngle + */ + get: function () { + return this._maxTiltAngle; + }, + set: function (val) { + if (this._maxTiltAngle == val) + return; + + this._maxTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "yFactor", { + /** + * Fractional difference in distance between the horizontal camera orientation and vertical camera orientation. Defaults to 2. + * + * @see #distance + */ + get: function () { + return this._yFactor; + }, + set: function (val) { + if (this._yFactor == val) + return; + + this._yFactor = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "wrapPanAngle", { + /** + * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. + */ + get: function () { + return this._wrapPanAngle; + }, + set: function (val) { + if (this._wrapPanAngle == val) + return; + + this._wrapPanAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + /** + * Updates the current tilt angle and pan angle values. + * + * Values are calculated using the defined tiltAngle, panAngle and steps variables. + * + * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. + * + * @see #tiltAngle + * @see #panAngle + * @see #steps + */ + HoverController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { + this.pNotifyUpdate(); + + if (this._wrapPanAngle) { + if (this._panAngle < 0) { + this._iCurrentPanAngle += this._panAngle % 360 + 360 - this._panAngle; + this._panAngle = this._panAngle % 360 + 360; + } else { + this._iCurrentPanAngle += this._panAngle % 360 - this._panAngle; + this._panAngle = this._panAngle % 360; + } + + while (this._panAngle - this._iCurrentPanAngle < -180) + this._iCurrentPanAngle -= 360; + + while (this._panAngle - this._iCurrentPanAngle > 180) + this._iCurrentPanAngle += 360; + } + + if (interpolate) { + this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle) / (this.steps + 1); + this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle) / (this.steps + 1); + } else { + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + + //snap coords if angle differences are close + if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + } + + var pos = (this.lookAtObject) ? this.lookAtObject.transform.position : (this.lookAtPosition) ? this.lookAtPosition : this._pOrigin; + this.targetObject.x = pos.x + this.distance * Math.sin(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + this.targetObject.y = pos.y + this.distance * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS) * this.yFactor; + this.targetObject.z = pos.z + this.distance * Math.cos(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + + this._upAxis.x = -Math.sin(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + this._upAxis.y = Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + this._upAxis.z = -Math.cos(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + + if (this._pTargetObject) { + if (this._pLookAtPosition) + this._pTargetObject.lookAt(this._pLookAtPosition, this._upAxis); + else if (this._pLookAtObject) + this._pTargetObject.lookAt(this._pLookAtObject.scene ? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position, this._upAxis); + } + }; + return HoverController; +})(LookAtController); + +module.exports = HoverController; + + +},{"awayjs-core/lib/controllers/LookAtController":undefined,"awayjs-core/lib/core/geom/MathConsts":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined}],"awayjs-core/lib/controllers/LookAtController":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var DisplayObjectEvent = require("awayjs-core/lib/events/DisplayObjectEvent"); + +var LookAtController = (function (_super) { + __extends(LookAtController, _super); + function LookAtController(targetObject, lookAtObject) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof lookAtObject === "undefined") { lookAtObject = null; } + var _this = this; + _super.call(this, targetObject); + this._pOrigin = new Vector3D(0.0, 0.0, 0.0); + + this._onLookAtObjectChangedDelegate = function (event) { + return _this.onLookAtObjectChanged(event); + }; + + if (lookAtObject) + this.lookAtObject = lookAtObject; + else + this.lookAtPosition = new Vector3D(); + } + Object.defineProperty(LookAtController.prototype, "lookAtPosition", { + get: function () { + return this._pLookAtPosition; + }, + set: function (val) { + if (this._pLookAtObject) { + this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + this._pLookAtObject = null; + } + + this._pLookAtPosition = val; + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LookAtController.prototype, "lookAtObject", { + get: function () { + return this._pLookAtObject; + }, + set: function (val) { + if (this._pLookAtPosition) + this._pLookAtPosition = null; + + if (this._pLookAtObject == val) + return; + + if (this._pLookAtObject) + this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + + this._pLookAtObject = val; + + if (this._pLookAtObject) + this._pLookAtObject.addEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + //@override + LookAtController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + if (this._pTargetObject) { + if (this._pLookAtPosition) + this._pTargetObject.lookAt(this._pLookAtPosition); + else if (this._pLookAtObject) + this._pTargetObject.lookAt(this._pLookAtObject.scene ? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position); + } + }; + + LookAtController.prototype.onLookAtObjectChanged = function (event) { + this.pNotifyUpdate(); + }; + return LookAtController; +})(ControllerBase); + +module.exports = LookAtController; + + +},{"awayjs-core/lib/controllers/ControllerBase":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/events/DisplayObjectEvent":undefined}],"awayjs-core/lib/controllers/SpringController":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var LookAtController = require("awayjs-core/lib/controllers/LookAtController"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* Uses spring physics to animate the target object towards a position that is +* defined as the lookAtTarget object's position plus the vector defined by the +* positionOffset property. +*/ +var SpringController = (function (_super) { + __extends(SpringController, _super); + function SpringController(targetObject, lookAtObject, stiffness, mass, damping) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof lookAtObject === "undefined") { lookAtObject = null; } + if (typeof stiffness === "undefined") { stiffness = 1; } + if (typeof mass === "undefined") { mass = 40; } + if (typeof damping === "undefined") { damping = 4; } + _super.call(this, targetObject, lookAtObject); + /** + * Offset of spring center from target in target object space, ie: Where the camera should ideally be in the target object space. + */ + this.positionOffset = new Vector3D(0, 500, -1000); + + this.stiffness = stiffness; + this.damping = damping; + this.mass = mass; + + this._velocity = new Vector3D(); + this._dv = new Vector3D(); + this._stretch = new Vector3D(); + this._force = new Vector3D(); + this._acceleration = new Vector3D(); + this._desiredPosition = new Vector3D(); + } + SpringController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + var offs; + + if (!this._pLookAtObject || !this._pTargetObject) + return; + + offs = this._pLookAtObject.transform.matrix3D.deltaTransformVector(this.positionOffset); + this._desiredPosition.x = this._pLookAtObject.x + offs.x; + this._desiredPosition.y = this._pLookAtObject.y + offs.y; + this._desiredPosition.z = this._pLookAtObject.z + offs.z; + + this._stretch = this._pTargetObject.transform.position.add(this._desiredPosition); + this._stretch.scaleBy(-this.stiffness); + + this._dv.copyFrom(this._velocity); + this._dv.scaleBy(this.damping); + + this._force.x = this._stretch.x - this._dv.x; + this._force.y = this._stretch.y - this._dv.y; + this._force.z = this._stretch.z - this._dv.z; + + this._acceleration.copyFrom(this._force); + this._acceleration.scaleBy(1 / this.mass); + + this._velocity.incrementBy(this._acceleration); + + this._pTargetObject.transform.position = this._pTargetObject.transform.position.add(this._velocity); + + _super.prototype.update.call(this); + }; + return SpringController; +})(LookAtController); + +module.exports = SpringController; + + +},{"awayjs-core/lib/controllers/LookAtController":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined}],"awayjs-core/lib/core/base/AlignmentMode":[function(require,module,exports){ +/** +* +*/ +var AlignmentMode = (function () { + function AlignmentMode() { + } + AlignmentMode.REGISTRATION_POINT = "registrationPoint"; + + AlignmentMode.PIVOT_POINT = "pivot"; + return AlignmentMode; +})(); + +module.exports = AlignmentMode; + + +},{}],"awayjs-core/lib/core/base/BitmapDataChannel":[function(require,module,exports){ +var BitmapDataChannel = (function () { + function BitmapDataChannel() { + } + BitmapDataChannel.ALPHA = 8; + BitmapDataChannel.BLUE = 4; + BitmapDataChannel.GREEN = 2; + BitmapDataChannel.RED = 1; + return BitmapDataChannel; +})(); + +module.exports = BitmapDataChannel; + + +},{}],"awayjs-core/lib/core/base/BitmapData":[function(require,module,exports){ +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +var ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +/** +* +*/ +var BitmapData = (function () { + /** + * + * @param width + * @param height + * @param transparent + * @param fillColor + */ + function BitmapData(width, height, transparent, fillColor) { + if (typeof transparent === "undefined") { transparent = true; } + if (typeof fillColor === "undefined") { fillColor = null; } + this._alpha = 0; + this._locked = false; + this._transparent = transparent; + this._imageCanvas = document.createElement("canvas"); + this._imageCanvas.width = width; + this._imageCanvas.height = height; + this._context = this._imageCanvas.getContext("2d"); + this._rect = new Rectangle(0, 0, width, height); + + if (fillColor != null) { + if (this._transparent) { + this._alpha = ColorUtils.float32ColorToARGB(fillColor)[0] / 255; + } else { + this._alpha = 1; + } + + this.fillRect(this._rect, fillColor); + } + } + /** + * + */ + BitmapData.prototype.dispose = function () { + this._context = null; + this._imageCanvas = null; + this._imageData = null; + this._rect = null; + this._transparent = null; + this._locked = null; + }; + + /** + * + */ + BitmapData.prototype.lock = function () { + this._locked = true; + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + }; + + /** + * + */ + BitmapData.prototype.unlock = function () { + this._locked = false; + + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + this._imageData = null; + } + }; + + /** + * + * @param x + * @param y + * @param color + */ + BitmapData.prototype.getPixel = function (x, y) { + var r; + var g; + var b; + var a; + + if (!this._locked) { + var pixelData = this._context.getImageData(x, y, 1, 1); + + r = pixelData.data[0]; + g = pixelData.data[1]; + b = pixelData.data[2]; + a = pixelData.data[3]; + } else { + var index = (x + y * this._imageCanvas.width) * 4; + + if (!this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + r = this._imageData.data[index + 0]; + g = this._imageData.data[index + 1]; + b = this._imageData.data[index + 2]; + a = this._imageData.data[index + 3]; + } + + if (!this._locked) { + this._imageData = null; + } + + return (a << 24) | (r << 16) | (g << 8) | b; + }; + + /** + * + * @param x + * @param y + * @param color + */ + BitmapData.prototype.setPixel = function (x, y, color) { + var argb = ColorUtils.float32ColorToARGB(color); + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var index = (x + y * this._imageCanvas.width) * 4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = 255; + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + /** + * + * @param rect + * @param inputByteArray + */ + BitmapData.prototype.setPixels = function (rect, inputByteArray) { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + inputByteArray.position = 0; + var i, j, index; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + index = (i + rect.x + (j + rect.y) * this._imageCanvas.width) * 4; + + this._imageData.data[index + 0] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 1] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 2] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 3] = inputByteArray.readUnsignedInt(); + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + /** + * + * @param x + * @param y + * @param color + */ + BitmapData.prototype.setPixel32 = function (x, y, color) { + var argb = ColorUtils.float32ColorToARGB(color); + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var index = (x + y * this._imageCanvas.width) * 4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = argb[0]; + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + BitmapData.prototype.setVector = function (rect, inputVector) { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var i, j, index, argb; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + argb = ColorUtils.float32ColorToARGB(inputVector[i + j * rect.width]); + index = (i + rect.x + (j + rect.y) * this._imageCanvas.width) * 4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = argb[0]; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + BitmapData.prototype.drawImage = function (img, sourceRect, destRect) { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + } + + this._drawImage(img, sourceRect, destRect); + + if (this._imageData) { + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } + } else { + this._drawImage(img, sourceRect, destRect); + } + }; + + BitmapData.prototype._drawImage = function (img, sourceRect, destRect) { + if (img instanceof BitmapData) + this._context.drawImage(img.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + else if (img instanceof HTMLImageElement) + this._context.drawImage(img, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + }; + + BitmapData.prototype.copyPixels = function (bmpd, sourceRect, destRect) { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + } + + this._copyPixels(bmpd, sourceRect, destRect); + + if (this._imageData) { + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } + } else { + this._copyPixels(bmpd, sourceRect, destRect); + } + }; + + BitmapData.prototype._copyPixels = function (bmpd, sourceRect, destRect) { + if (bmpd instanceof BitmapData) { + this._context.drawImage(bmpd.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + } else if (bmpd instanceof HTMLImageElement) { + this._context.drawImage(bmpd, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + } + }; + + /** + * + * @param rect + * @param color + */ + BitmapData.prototype.fillRect = function (rect, color) { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) apply fill + // 3) read _imageData back out + if (this._imageData) + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + + this._context.fillStyle = this.hexToRGBACSS(color); + this._context.fillRect(rect.x, rect.y, rect.width, rect.height); + + if (this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } else { + this._context.fillStyle = this.hexToRGBACSS(color); + this._context.fillRect(rect.x, rect.y, rect.width, rect.height); + } + }; + + BitmapData.prototype.draw = function (source, matrix) { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + if (this._imageData) + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + + this._draw(source, matrix); + + if (this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } else { + this._draw(source, matrix); + } + }; + + BitmapData.prototype._draw = function (source, matrix) { + if (source instanceof BitmapData) { + this._context.save(); + + if (matrix != null) + this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); + + this._context.drawImage(source.canvas, 0, 0); + this._context.restore(); + } else if (source instanceof HTMLImageElement) { + this._context.save(); + + if (matrix != null) + this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); + + this._context.drawImage(source, 0, 0); + this._context.restore(); + } + }; + + BitmapData.prototype.copyChannel = function (sourceBitmap, sourceRect, destPoint, sourceChannel, destChannel) { + var imageData = sourceBitmap.imageData; + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var sourceData = sourceBitmap.imageData.data; + var destData = this._imageData.data; + + var sourceOffset = Math.round(Math.log(sourceChannel) / Math.log(2)); + var destOffset = Math.round(Math.log(destChannel) / Math.log(2)); + + var i, j, sourceIndex, destIndex; + for (i = 0; i < sourceRect.width; ++i) { + for (j = 0; j < sourceRect.height; ++j) { + sourceIndex = (i + sourceRect.x + (j + sourceRect.y) * sourceBitmap.width) * 4; + destIndex = (i + destPoint.x + (j + destPoint.y) * this.width) * 4; + + destData[destIndex + destOffset] = sourceData[sourceIndex + sourceOffset]; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + BitmapData.prototype.colorTransform = function (rect, colorTransform) { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var data = this._imageData.data; + + var i, j, index; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + index = (i + rect.x + (j + rect.y) * this.width) * 4; + + data[index] = data[index] * colorTransform.redMultiplier + colorTransform.redOffset; + data[index + 1] = data[index + 1] * colorTransform.greenMultiplier + colorTransform.greenOffset; + data[index + 2] = data[index + 2] * colorTransform.blueMultiplier + colorTransform.blueOffset; + data[index + 3] = data[index + 3] * colorTransform.alphaMultiplier + colorTransform.alphaOffset; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + + Object.defineProperty(BitmapData.prototype, "imageData", { + /** + * + * @returns {ImageData} + */ + get: function () { + return this._context.getImageData(0, 0, this._rect.width, this._rect.height); + }, + /** + * + * @param {ImageData} + */ + set: function (value) { + this._context.putImageData(value, 0, 0); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BitmapData.prototype, "width", { + /** + * + * @returns {number} + */ + get: function () { + return this._imageCanvas.width; + }, + /** + * + * @param {number} + */ + set: function (value) { + this._rect.width = value; + this._imageCanvas.width = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapData.prototype, "height", { + /** + * + * @returns {number} + */ + get: function () { + return this._imageCanvas.height; + }, + /** + * + * @param {number} + */ + set: function (value) { + this._rect.height = value; + this._imageCanvas.height = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapData.prototype, "rect", { + /** + * + * @param {Rectangle} + */ + get: function () { + return this._rect; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BitmapData.prototype, "canvas", { + /** + * + * @returns {HTMLCanvasElement} + */ + get: function () { + return this._imageCanvas; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BitmapData.prototype, "context", { + /** + * + * @returns {HTMLCanvasElement} + */ + get: function () { + return this._context; + }, + enumerable: true, + configurable: true + }); + + // Private + /** + * convert decimal value to Hex + */ + BitmapData.prototype.hexToRGBACSS = function (d) { + var argb = ColorUtils.float32ColorToARGB(d); + + if (this._transparent == false) { + argb[0] = 1; + + return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] + ')'; + } + + return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] / 255 + ')'; + }; + return BitmapData; +})(); + +module.exports = BitmapData; + + +},{"awayjs-core/lib/core/geom/Rectangle":undefined,"awayjs-core/lib/utils/ColorUtils":undefined}],"awayjs-core/lib/core/base/BlendMode":[function(require,module,exports){ +/** +* A class that provides constant values for visual blend mode effects. These +* constants are used in the following: +*
    +*
  • The blendMode property of the +* flash.display.DisplayObject class.
  • +*
  • The blendMode parameter of the draw() +* method of the flash.display.BitmapData class
  • +*
+*/ +var BlendMode = (function () { + function BlendMode() { + } + BlendMode.ADD = "add"; + + BlendMode.ALPHA = "alpha"; + + BlendMode.DARKEN = "darken"; + + BlendMode.DIFFERENCE = "difference"; + + BlendMode.ERASE = "erase"; + + BlendMode.HARDLIGHT = "hardlight"; + + BlendMode.INVERT = "invert"; + + BlendMode.LAYER = "layer"; + + BlendMode.LIGHTEN = "lighten"; + + BlendMode.MULTIPLY = "multiply"; + + BlendMode.NORMAL = "normal"; + + BlendMode.OVERLAY = "overlay"; + + BlendMode.SCREEN = "screen"; + + BlendMode.SHADER = "shader"; + + BlendMode.SUBTRACT = "subtract"; + return BlendMode; +})(); + +module.exports = BlendMode; + + +},{}],"awayjs-core/lib/core/base/CapsStyle":[function(require,module,exports){ +/** +* The CapsStyle class is an enumeration of constant values that specify the +* caps style to use in drawing lines. The constants are provided for use as +* values in the caps parameter of the +* flash.display.Graphics.lineStyle() method. You can specify the +* following three types of caps: +*/ +var CapsStyle = (function () { + function CapsStyle() { + } + CapsStyle.ROUND = "round"; + + CapsStyle.NONE = "none"; + + CapsStyle.SQUARE = "square"; + return CapsStyle; +})(); + +module.exports = CapsStyle; + + +},{}],"awayjs-core/lib/core/base/DisplayObject":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AxisAlignedBoundingBox = require("awayjs-core/lib/bounds/AxisAlignedBoundingBox"); + +var AlignmentMode = require("awayjs-core/lib/core/base/AlignmentMode"); + +var OrientationMode = require("awayjs-core/lib/core/base/OrientationMode"); + +var MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +var Point = require("awayjs-core/lib/core/geom/Point"); + +var Transform = require("awayjs-core/lib/core/geom/Transform"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var DisplayObjectEvent = require("awayjs-core/lib/events/DisplayObjectEvent"); +var SceneEvent = require("awayjs-core/lib/events/SceneEvent"); + +/** +* The DisplayObject class is the base class for all objects that can be +* placed on the display list. The display list manages all objects displayed +* in flash. Use the DisplayObjectContainer class to arrange the +* display objects in the display list. DisplayObjectContainer objects can +* have child display objects, while other display objects, such as Shape and +* TextField objects, are "leaf" nodes that have only parents and siblings, no +* children. +* +*

The DisplayObject class supports basic functionality like the x +* and y position of an object, as well as more advanced properties of +* the object such as its transformation matrix.

+* +*

DisplayObject is an abstract base class; therefore, you cannot call +* DisplayObject directly. Invoking new DisplayObject() throws an +* ArgumentError exception.

+* +*

All display objects inherit from the DisplayObject class.

+* +*

The DisplayObject class itself does not include any APIs for rendering +* content onscreen. For that reason, if you want create a custom subclass of +* the DisplayObject class, you will want to extend one of its subclasses that +* do have APIs for rendering content onscreen, such as the Shape, Sprite, +* Bitmap, SimpleButton, TextField, or MovieClip class.

+* +*

The DisplayObject class contains several broadcast events. Normally, the +* target of any particular event is a specific DisplayObject instance. For +* example, the target of an added event is the specific +* DisplayObject instance that was added to the display list. Having a single +* target restricts the placement of event listeners to that target and in +* some cases the target's ancestors on the display list. With broadcast +* events, however, the target is not a specific DisplayObject instance, but +* rather all DisplayObject instances, including those that are not on the +* display list. This means that you can add a listener to any DisplayObject +* instance to listen for broadcast events. In addition to the broadcast +* events listed in the DisplayObject class's Events table, the DisplayObject +* class also inherits two broadcast events from the EventDispatcher class: +* activate and deactivate.

+* +*

Some properties previously used in the ActionScript 1.0 and 2.0 +* MovieClip, TextField, and Button classes(such as _alpha, +* _height, _name, _width, +* _x, _y, and others) have equivalents in the +* ActionScript 3.0 DisplayObject class that are renamed so that they no +* longer begin with the underscore(_) character.

+* +*

For more information, see the "Display Programming" chapter of the +* ActionScript 3.0 Developer's Guide.

+* +* @event added Dispatched when a display object is added to the +* display list. The following methods trigger this +* event: +* DisplayObjectContainer.addChild(), +* DisplayObjectContainer.addChildAt(). +* @event addedToStage Dispatched when a display object is added to the on +* stage display list, either directly or through the +* addition of a sub tree in which the display object +* is contained. The following methods trigger this +* event: +* DisplayObjectContainer.addChild(), +* DisplayObjectContainer.addChildAt(). +* @event enterFrame [broadcast event] Dispatched when the playhead is +* entering a new frame. If the playhead is not +* moving, or if there is only one frame, this event +* is dispatched continuously in conjunction with the +* frame rate. This event is a broadcast event, which +* means that it is dispatched by all display objects +* with a listener registered for this event. +* @event exitFrame [broadcast event] Dispatched when the playhead is +* exiting the current frame. All frame scripts have +* been run. If the playhead is not moving, or if +* there is only one frame, this event is dispatched +* continuously in conjunction with the frame rate. +* This event is a broadcast event, which means that +* it is dispatched by all display objects with a +* listener registered for this event. +* @event frameConstructed [broadcast event] Dispatched after the constructors +* of frame display objects have run but before frame +* scripts have run. If the playhead is not moving, or +* if there is only one frame, this event is +* dispatched continuously in conjunction with the +* frame rate. This event is a broadcast event, which +* means that it is dispatched by all display objects +* with a listener registered for this event. +* @event removed Dispatched when a display object is about to be +* removed from the display list. Two methods of the +* DisplayObjectContainer class generate this event: +* removeChild() and +* removeChildAt(). +* +*

The following methods of a +* DisplayObjectContainer object also generate this +* event if an object must be removed to make room for +* the new object: addChild(), +* addChildAt(), and +* setChildIndex().

+* @event removedFromStage Dispatched when a display object is about to be +* removed from the display list, either directly or +* through the removal of a sub tree in which the +* display object is contained. Two methods of the +* DisplayObjectContainer class generate this event: +* removeChild() and +* removeChildAt(). +* +*

The following methods of a +* DisplayObjectContainer object also generate this +* event if an object must be removed to make room for +* the new object: addChild(), +* addChildAt(), and +* setChildIndex().

+* @event render [broadcast event] Dispatched when the display list +* is about to be updated and rendered. This event +* provides the last opportunity for objects listening +* for this event to make changes before the display +* list is rendered. You must call the +* invalidate() method of the Stage +* object each time you want a render +* event to be dispatched. Render events +* are dispatched to an object only if there is mutual +* trust between it and the object that called +* Stage.invalidate(). This event is a +* broadcast event, which means that it is dispatched +* by all display objects with a listener registered +* for this event. +* +*

Note: This event is not dispatched if the +* display is not rendering. This is the case when the +* content is either minimized or obscured.

+*/ +var DisplayObject = (function (_super) { + __extends(DisplayObject, _super); + /** + * Creates a new DisplayObject instance. + */ + function DisplayObject() { + _super.call(this); + this._pSceneTransform = new Matrix3D(); + this._pSceneTransformDirty = true; + this._matrix3D = new Matrix3D(); + this._matrix3DDirty = true; + this._inverseSceneTransform = new Matrix3D(); + this._inverseSceneTransformDirty = true; + this._scenePosition = new Vector3D(); + this._scenePositionDirty = true; + this._explicitVisibility = true; + this._pImplicitVisibility = true; + this._explicitMouseEnabled = true; + this._pImplicitMouseEnabled = true; + this._positionDirty = true; + this._rotationDirty = true; + this._scaleDirty = true; + this._rotationX = 0; + this._rotationY = 0; + this._rotationZ = 0; + this._eulers = new Vector3D(); + this._flipY = new Matrix3D(); + this._zOffset = 0; + this._pScaleX = 1; + this._pScaleY = 1; + this._pScaleZ = 1; + this._x = 0; + this._y = 0; + this._z = 0; + this._pivot = new Vector3D(); + this._orientationMatrix = new Matrix3D(); + this._pivotZero = true; + this._pivotDirty = true; + this._pos = new Vector3D(); + this._rot = new Vector3D(); + this._sca = new Vector3D(); + this._pIgnoreTransform = false; + this._pBoundsInvalid = true; + this._worldBoundsInvalid = true; + this._pRenderables = new Array(); + /** + * + */ + this.alignmentMode = AlignmentMode.REGISTRATION_POINT; + /** + * + */ + this.castsShadows = true; + /** + * + */ + this.orientationMode = OrientationMode.DEFAULT; + + // Cached vector of transformation components used when + // recomposing the transform matrix in updateTransform() + this._transformComponents = new Array(3); //_transformComponents = new Vector.(3, true); + + this._transformComponents[0] = this._pos; + this._transformComponents[1] = this._rot; + this._transformComponents[2] = this._sca; + + //creation of associated transform object + this._transform = new Transform(this); + + this._matrix3D.identity(); + + this._flipY.appendScale(1, -1, 1); + + this._pBounds = this.pCreateDefaultBoundingVolume(); + + this._worldBounds = this.pCreateDefaultBoundingVolume(); + } + Object.defineProperty(DisplayObject.prototype, "bounds", { + /** + * + */ + get: function () { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._pBounds; + }, + set: function (value) { + if (this._pBounds == value) + return; + + this._pBounds = value; + + this._worldBounds = value.clone(); + + this.pInvalidateBounds(); + + if (this._boundsVisible) + this._partitionNode._iUpdateEntityBounds(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "depth", { + /** + * Indicates the depth of the display object, in pixels. The depth is + * calculated based on the bounds of the content of the display object. When + * you set the depth property, the scaleZ property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content (such as an empty sprite) has a depth of 0, even if you try to + * set depth to a different value.

+ */ + get: function () { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._depth; + }, + set: function (val) { + if (this._depth == val) + return; + + this._depth == val; + + this._pScaleZ = val / this.bounds.aabb.depth; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "eulers", { + /** + * Defines the rotation of the 3d object as a Vector3D object containing euler angles for rotation around x, y and z axis. + */ + get: function () { + this._eulers.x = this._rotationX * MathConsts.RADIANS_TO_DEGREES; + this._eulers.y = this._rotationY * MathConsts.RADIANS_TO_DEGREES; + this._eulers.z = this._rotationZ * MathConsts.RADIANS_TO_DEGREES; + + return this._eulers; + }, + set: function (value) { + this._rotationX = value.x * MathConsts.DEGREES_TO_RADIANS; + this._rotationY = value.y * MathConsts.DEGREES_TO_RADIANS; + this._rotationZ = value.z * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "height", { + /** + * An indexed array that contains each filter object currently associated + * with the display object. The flash.filters package contains several + * classes that define specific filters you can use. + * + *

Filters can be applied in Flash Professional at design time, or at run + * time by using ActionScript code. To apply a filter by using ActionScript, + * you must make a temporary copy of the entire filters array, + * modify the temporary array, then assign the value of the temporary array + * back to the filters array. You cannot directly add a new + * filter object to the filters array.

+ * + *

To add a filter by using ActionScript, perform the following steps + * (assume that the target display object is named + * myDisplayObject):

+ * + *
    + *
  1. Create a new filter object by using the constructor method of your + * chosen filter class.
  2. + *
  3. Assign the value of the myDisplayObject.filters array + * to a temporary array, such as one named myFilters.
  4. + *
  5. Add the new filter object to the myFilters temporary + * array.
  6. + *
  7. Assign the value of the temporary array to the + * myDisplayObject.filters array.
  8. + *
+ * + *

If the filters array is undefined, you do not need to use + * a temporary array. Instead, you can directly assign an array literal that + * contains one or more filter objects that you create. The first example in + * the Examples section adds a drop shadow filter by using code that handles + * both defined and undefined filters arrays.

+ * + *

To modify an existing filter object, you must use the technique of + * modifying a copy of the filters array:

+ * + *
    + *
  1. Assign the value of the filters array to a temporary + * array, such as one named myFilters.
  2. + *
  3. Modify the property by using the temporary array, + * myFilters. For example, to set the quality property of the + * first filter in the array, you could use the following code: + * myFilters[0].quality = 1;
  4. + *
  5. Assign the value of the temporary array to the filters + * array.
  6. + *
+ * + *

At load time, if a display object has an associated filter, it is + * marked to cache itself as a transparent bitmap. From this point forward, + * as long as the display object has a valid filter list, the player caches + * the display object as a bitmap. This source bitmap is used as a source + * image for the filter effects. Each display object usually has two bitmaps: + * one with the original unfiltered source display object and another for the + * final image after filtering. The final image is used when rendering. As + * long as the display object does not change, the final image does not need + * updating.

+ * + *

The flash.filters package includes classes for filters. For example, to + * create a DropShadow filter, you would write:

+ * + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader output type is not compatible with + * this operation(the shader must specify a + * pixel4 output). + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader doesn't specify any image input or + * the first input is not an image4 input. + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader specifies an image input that isn't + * provided. + * @throws ArgumentError When filters includes a ShaderFilter, a + * ByteArray or Vector. instance as a shader + * input, and the width and + * height properties aren't specified for + * the ShaderInput object, or the specified values + * don't match the amount of data in the input data. + * See the ShaderInput.input property for + * more information. + */ + // public filters:Array; + /** + * Indicates the height of the display object, in pixels. The height is + * calculated based on the bounds of the content of the display object. When + * you set the height property, the scaleY property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content (such as an empty sprite) has a height of 0, even if you try to + * set height to a different value.

+ */ + get: function () { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._height; + }, + set: function (val) { + if (this._height == val) + return; + + this._height == val; + + this._pScaleY = val / this.bounds.aabb.height; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "index", { + /** + * Indicates the instance container index of the DisplayObject. The object can be + * identified in the child list of its parent display object container by + * calling the getChildByIndex() method of the display object + * container. + * + *

If the DisplayObject has no parent container, index defaults to 0.

+ */ + get: function () { + if (this._pParent) + return this._pParent.getChildIndex(this); + + return 0; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "inverseSceneTransform", { + /** + * + */ + get: function () { + if (this._inverseSceneTransformDirty) { + this._inverseSceneTransform.copyFrom(this.sceneTransform); + this._inverseSceneTransform.invert(); + this._inverseSceneTransformDirty = false; + } + return this._inverseSceneTransform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "ignoreTransform", { + /** + * + */ + get: function () { + return this._pIgnoreTransform; + }, + set: function (value) { + if (this._pIgnoreTransform == value) + return; + + this._pIgnoreTransform = value; + + if (value) { + this._pSceneTransform.identity(); + this._scenePosition.setTo(0, 0, 0); + } + + this.pInvalidateSceneTransform(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "isEntity", { + /** + * + */ + get: function () { + return this._pIsEntity; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "loaderInfo", { + /** + * Returns a LoaderInfo object containing information about loading the file + * to which this display object belongs. The loaderInfo property + * is defined only for the root display object of a SWF file or for a loaded + * Bitmap(not for a Bitmap that is drawn with ActionScript). To find the + * loaderInfo object associated with the SWF file that contains + * a display object named myDisplayObject, use + * myDisplayObject.root.loaderInfo. + * + *

A large SWF file can monitor its download by calling + * this.root.loaderInfo.addEventListener(Event.COMPLETE, + * func).

+ */ + get: function () { + return this._loaderInfo; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "mouseEnabled", { + /** + * Specifies whether this object receives mouse, or other user input, + * messages. The default value is true, which means that by + * default any InteractiveObject instance that is on the display list + * receives mouse events or other user input events. If + * mouseEnabled is set to false, the instance does + * not receive any mouse events(or other user input events like keyboard + * events). Any children of this instance on the display list are not + * affected. To change the mouseEnabled behavior for all + * children of an object on the display list, use + * flash.display.DisplayObjectContainer.mouseChildren. + * + *

No event is dispatched by setting this property. You must use the + * addEventListener() method to create interactive + * functionality.

+ */ + get: function () { + return this._explicitMouseEnabled; + }, + set: function (value) { + if (this._explicitMouseEnabled == value) + return; + + this._explicitMouseEnabled = value; + + this._pUpdateImplicitMouseEnabled(this._pParent ? this._pParent.mouseChildren : true); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "mouseX", { + /** + * Indicates the x coordinate of the mouse or user input device position, in + * pixels. + * + *

Note: For a DisplayObject that has been rotated, the returned x + * coordinate will reflect the non-rotated object.

+ */ + get: function () { + return this._mouseX; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "mouseY", { + /** + * Indicates the y coordinate of the mouse or user input device position, in + * pixels. + * + *

Note: For a DisplayObject that has been rotated, the returned y + * coordinate will reflect the non-rotated object.

+ */ + get: function () { + return this._mouseY; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "parent", { + /** + * Indicates the DisplayObjectContainer object that contains this display + * object. Use the parent property to specify a relative path to + * display objects that are above the current display object in the display + * list hierarchy. + * + *

You can use parent to move up multiple levels in the + * display list as in the following:

+ * + * @throws SecurityError The parent display object belongs to a security + * sandbox to which you do not have access. You can + * avoid this situation by having the parent movie call + * the Security.allowDomain() method. + */ + get: function () { + return this._pParent; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "partition", { + /** + * + */ + get: function () { + return this._explicitPartition; + }, + set: function (value) { + if (this._explicitPartition == value) + return; + + if (this._pScene && this._explicitPartition) + this._pScene.iUnregisterPartition(this._explicitPartition); + + this._explicitPartition = value; + + if (this._pScene && value) + this._pScene.iRegisterPartition(value); + + this._pUpdateImplicitPartition(this._pParent ? this._pParent._iAssignedPartition : null); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "partitionNode", { + /** + * + */ + get: function () { + if (!this._partitionNode) + this._partitionNode = this.pCreateEntityPartitionNode(); + + return this._partitionNode; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "pickingCollider", { + /** + * + */ + get: function () { + return this._pPickingCollider; + }, + set: function (value) { + this._pPickingCollider = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "pivot", { + /** + * Defines the local point around which the object rotates. + */ + get: function () { + return this._pivot; + }, + set: function (pivot) { + this._pivot = pivot.clone(); + + this.invalidatePivot(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "root", { + /** + * For a display object in a loaded SWF file, the root property + * is the top-most display object in the portion of the display list's tree + * structure represented by that SWF file. For a Bitmap object representing a + * loaded image file, the root property is the Bitmap object + * itself. For the instance of the main class of the first SWF file loaded, + * the root property is the display object itself. The + * root property of the Stage object is the Stage object itself. + * The root property is set to null for any display + * object that has not been added to the display list, unless it has been + * added to a display object container that is off the display list but that + * is a child of the top-most display object in a loaded SWF file. + * + *

For example, if you create a new Sprite object by calling the + * Sprite() constructor method, its root property + * is null until you add it to the display list(or to a display + * object container that is off the display list but that is a child of the + * top-most display object in a SWF file).

+ * + *

For a loaded SWF file, even though the Loader object used to load the + * file may not be on the display list, the top-most display object in the + * SWF file has its root property set to itself. The Loader + * object does not have its root property set until it is added + * as a child of a display object for which the root property is + * set.

+ */ + get: function () { + return this._root; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "rotationX", { + /** + * Indicates the x-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + get: function () { + return this._rotationX * MathConsts.RADIANS_TO_DEGREES; + }, + set: function (val) { + if (this.rotationX == val) + return; + + this._rotationX = val * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "rotationY", { + /** + * Indicates the y-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + get: function () { + return this._rotationY * MathConsts.RADIANS_TO_DEGREES; + }, + set: function (val) { + if (this.rotationY == val) + return; + + this._rotationY = val * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "rotationZ", { + /** + * Indicates the z-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + get: function () { + return this._rotationZ * MathConsts.RADIANS_TO_DEGREES; + }, + set: function (val) { + if (this.rotationZ == val) + return; + + this._rotationZ = val * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "scaleX", { + /** + * Indicates the horizontal scale(percentage) of the object as applied from + * the registration point. The default registration point is(0,0). 1.0 + * equals 100% scale. + * + *

Scaling the local coordinate system changes the x and + * y property values, which are defined in whole pixels.

+ */ + get: function () { + return this._pScaleX; + }, + set: function (val) { + if (this._pScaleX == val) + return; + + this._pScaleX = val; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "scaleY", { + /** + * Indicates the vertical scale(percentage) of an object as applied from the + * registration point of the object. The default registration point is(0,0). + * 1.0 is 100% scale. + * + *

Scaling the local coordinate system changes the x and + * y property values, which are defined in whole pixels.

+ */ + get: function () { + return this._pScaleY; + }, + set: function (val) { + if (this._pScaleY == val) + return; + + this._pScaleY = val; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "scaleZ", { + /** + * Indicates the depth scale(percentage) of an object as applied from the + * registration point of the object. The default registration point is(0,0). + * 1.0 is 100% scale. + * + *

Scaling the local coordinate system changes the x, + * y and z property values, which are defined in + * whole pixels.

+ */ + get: function () { + return this._pScaleZ; + }, + set: function (val) { + if (this._pScaleZ == val) + return; + + this._pScaleZ = val; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "scene", { + /** + * + */ + get: function () { + return this._pScene; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "scenePosition", { + /** + * + */ + get: function () { + if (this._scenePositionDirty) { + if (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) { + var pivotScale = new Vector3D(this._pivot.x / this._pScaleX, this._pivot.y / this._pScaleY, this._pivot.z / this._pScaleZ); + this._scenePosition = this.sceneTransform.transformVector(pivotScale); + //this._scenePosition.decrementBy(new Vector3D(this._pivot.x*this._pScaleX, this._pivot.y*this._pScaleY, this._pivot.z*this._pScaleZ)); + } else { + this.sceneTransform.copyColumnTo(3, this._scenePosition); + } + + this._scenePositionDirty = false; + } + return this._scenePosition; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "sceneTransform", { + get: function () { + if (this._pSceneTransformDirty) + this.pUpdateSceneTransform(); + + return this._pSceneTransform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "shaderPickingDetails", { + /** + * + */ + get: function () { + return this._shaderPickingDetails; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "boundsVisible", { + /** + * + */ + get: function () { + return this._boundsVisible; + }, + set: function (value) { + if (value == this._boundsVisible) + return; + + this._boundsVisible = value; + + this._partitionNode.boundsVisible = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "transform", { + /** + * An object with properties pertaining to a display object's matrix, color + * transform, and pixel bounds. The specific properties - matrix, + * colorTransform, and three read-only properties + * (concatenatedMatrix, concatenatedColorTransform, + * and pixelBounds) - are described in the entry for the + * Transform class. + * + *

Each of the transform object's properties is itself an object. This + * concept is important because the only way to set new values for the matrix + * or colorTransform objects is to create a new object and copy that object + * into the transform.matrix or transform.colorTransform property.

+ * + *

For example, to increase the tx value of a display + * object's matrix, you must make a copy of the entire matrix object, then + * copy the new object into the matrix property of the transform object:

+ *
 public myMatrix:Matrix =
+        * myDisplayObject.transform.matrix; myMatrix.tx += 10;
+        * myDisplayObject.transform.matrix = myMatrix; 
+ * + *

You cannot directly set the tx property. The following + * code has no effect on myDisplayObject:

+ *
 myDisplayObject.transform.matrix.tx +=
+        * 10; 
+ * + *

You can also copy an entire transform object and assign it to another + * display object's transform property. For example, the following code + * copies the entire transform object from myOldDisplayObj to + * myNewDisplayObj:

+ * myNewDisplayObj.transform = myOldDisplayObj.transform; + * + *

The resulting display object, myNewDisplayObj, now has the + * same values for its matrix, color transform, and pixel bounds as the old + * display object, myOldDisplayObj.

+ * + *

Note that AIR for TV devices use hardware acceleration, if it is + * available, for color transforms.

+ */ + get: function () { + return this._transform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "visible", { + /** + * Whether or not the display object is visible. Display objects that are not + * visible are disabled. For example, if visible=false for an + * InteractiveObject instance, it cannot be clicked. + */ + get: function () { + return this._explicitVisibility; + }, + set: function (value) { + if (this._explicitVisibility == value) + return; + + this._explicitVisibility = value; + + this._pUpdateImplicitVisibility(this._pParent ? this._pParent._iIsVisible() : true); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "width", { + /** + * Indicates the width of the display object, in pixels. The width is + * calculated based on the bounds of the content of the display object. When + * you set the width property, the scaleX property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content(such as an empty sprite) has a width of 0, even if you try to set + * width to a different value.

+ */ + get: function () { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._width; + }, + set: function (val) { + if (this._width == val) + return; + + this._width == val; + + this._pScaleX = val / this.bounds.aabb.width; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "worldBounds", { + /** + * + */ + get: function () { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the bounds of the entity, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + if (this._worldBoundsInvalid) { + this._worldBoundsInvalid = false; + this._worldBounds.transformFrom(this.bounds, this.sceneTransform); + } + + return this._worldBounds; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "x", { + /** + * Indicates the x coordinate of the DisplayObject instance relative + * to the local coordinates of the parent DisplayObjectContainer. If the + * object is inside a DisplayObjectContainer that has transformations, it is + * in the local coordinate system of the enclosing DisplayObjectContainer. + * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the + * DisplayObjectContainer's children inherit a coordinate system that is + * rotated 90° counterclockwise. The object's coordinates refer to the + * registration point position. + */ + get: function () { + return this._x; + }, + set: function (val) { + if (this._x == val) + return; + + this._x = val; + + this.invalidatePosition(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "y", { + /** + * Indicates the y coordinate of the DisplayObject instance relative + * to the local coordinates of the parent DisplayObjectContainer. If the + * object is inside a DisplayObjectContainer that has transformations, it is + * in the local coordinate system of the enclosing DisplayObjectContainer. + * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the + * DisplayObjectContainer's children inherit a coordinate system that is + * rotated 90° counterclockwise. The object's coordinates refer to the + * registration point position. + */ + get: function () { + return this._y; + }, + set: function (val) { + if (this._y == val) + return; + + this._y = val; + + this.invalidatePosition(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "z", { + /** + * Indicates the z coordinate position along the z-axis of the DisplayObject + * instance relative to the 3D parent container. The z property is used for + * 3D coordinates, not screen or pixel coordinates. + * + *

When you set a z property for a display object to + * something other than the default value of 0, a corresponding + * Matrix3D object is automatically created. for adjusting a display object's + * position and orientation in three dimensions. When working with the + * z-axis, the existing behavior of x and y properties changes from screen or + * pixel coordinates to positions relative to the 3D parent container.

+ * + *

For example, a child of the _root at position x = 100, y = + * 100, z = 200 is not drawn at pixel location(100,100). The child is drawn + * wherever the 3D projection calculation puts it. The calculation is:

+ * + *

(x~~cameraFocalLength/cameraRelativeZPosition, + * y~~cameraFocalLength/cameraRelativeZPosition)

+ */ + get: function () { + return this._z; + }, + set: function (val) { + if (this._z == val) + return; + + this._z = val; + + this.invalidatePosition(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "zOffset", { + /** + * + */ + get: function () { + return this._zOffset; + }, + set: function (value) { + this._zOffset = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * + */ + DisplayObject.prototype.addEventListener = function (type, listener) { + _super.prototype.addEventListener.call(this, type, listener); + + switch (type) { + case DisplayObjectEvent.POSITION_CHANGED: + this._listenToPositionChanged = true; + break; + case DisplayObjectEvent.ROTATION_CHANGED: + this._listenToRotationChanged = true; + break; + case DisplayObjectEvent.SCALE_CHANGED: + this._listenToScaleChanged = true; + break; + } + }; + + /** + * + */ + DisplayObject.prototype.clone = function () { + var clone = new DisplayObject(); + clone.pivot = this.pivot; + clone._iMatrix3D = this._iMatrix3D; + clone.name = name; + + // todo: implement for all subtypes + return clone; + }; + + /** + * + */ + DisplayObject.prototype.dispose = function () { + if (this.parent) + this.parent.removeChild(this); + + while (this._pRenderables.length) + this._pRenderables[0].dispose(); + }; + + /** + * @inheritDoc + */ + DisplayObject.prototype.disposeAsset = function () { + this.dispose(); + }; + + /** + * Returns a rectangle that defines the area of the display object relative + * to the coordinate system of the targetCoordinateSpace object. + * Consider the following code, which shows how the rectangle returned can + * vary depending on the targetCoordinateSpace parameter that + * you pass to the method: + * + *

Note: Use the localToGlobal() and + * globalToLocal() methods to convert the display object's local + * coordinates to display coordinates, or display coordinates to local + * coordinates, respectively.

+ * + *

The getBounds() method is similar to the + * getRect() method; however, the Rectangle returned by the + * getBounds() method includes any strokes on shapes, whereas + * the Rectangle returned by the getRect() method does not. For + * an example, see the description of the getRect() method.

+ * + * @param targetCoordinateSpace The display object that defines the + * coordinate system to use. + * @return The rectangle that defines the area of the display object relative + * to the targetCoordinateSpace object's coordinate + * system. + */ + DisplayObject.prototype.getBounds = function (targetCoordinateSpace) { + return this._bounds; + }; + + /** + * Returns a rectangle that defines the boundary of the display object, based + * on the coordinate system defined by the targetCoordinateSpace + * parameter, excluding any strokes on shapes. The values that the + * getRect() method returns are the same or smaller than those + * returned by the getBounds() method. + * + *

Note: Use localToGlobal() and + * globalToLocal() methods to convert the display object's local + * coordinates to Stage coordinates, or Stage coordinates to local + * coordinates, respectively.

+ * + * @param targetCoordinateSpace The display object that defines the + * coordinate system to use. + * @return The rectangle that defines the area of the display object relative + * to the targetCoordinateSpace object's coordinate + * system. + */ + DisplayObject.prototype.getRect = function (targetCoordinateSpace) { + return this._bounds; + }; + + /** + * Converts the point object from the Stage(global) coordinates + * to the display object's(local) coordinates. + * + *

To use this method, first create an instance of the Point class. The + * x and y values that you assign represent global coordinates + * because they relate to the origin(0,0) of the main display area. Then + * pass the Point instance as the parameter to the + * globalToLocal() method. The method returns a new Point object + * with x and y values that relate to the origin of the display + * object instead of the origin of the Stage.

+ * + * @param point An object created with the Point class. The Point object + * specifies the x and y coordinates as + * properties. + * @return A Point object with coordinates relative to the display object. + */ + DisplayObject.prototype.globalToLocal = function (point) { + return point; + }; + + /** + * Converts a two-dimensional point from the Stage(global) coordinates to a + * three-dimensional display object's(local) coordinates. + * + *

To use this method, first create an instance of the Point class. The x + * and y values that you assign to the Point object represent global + * coordinates because they are relative to the origin(0,0) of the main + * display area. Then pass the Point object to the + * globalToLocal3D() method as the point parameter. + * The method returns three-dimensional coordinates as a Vector3D object + * containing x, y, and z values that + * are relative to the origin of the three-dimensional display object.

+ * + * @param point A two dimensional Point object representing global x and y + * coordinates. + * @return A Vector3D object with coordinates relative to the + * three-dimensional display object. + */ + DisplayObject.prototype.globalToLocal3D = function (point) { + return new Vector3D(); + }; + + /** + * Evaluates the bounding box of the display object to see if it overlaps or + * intersects with the bounding box of the obj display object. + * + * @param obj The display object to test against. + * @return true if the bounding boxes of the display objects + * intersect; false if not. + */ + DisplayObject.prototype.hitTestObject = function (obj) { + return false; + }; + + /** + * Evaluates the display object to see if it overlaps or intersects with the + * point specified by the x and y parameters. The + * x and y parameters specify a point in the + * coordinate space of the Stage, not the display object container that + * contains the display object(unless that display object container is the + * Stage). + * + * @param x The x coordinate to test against this object. + * @param y The y coordinate to test against this object. + * @param shapeFlag Whether to check against the actual pixels of the object + * (true) or the bounding box + * (false). + * @return true if the display object overlaps or intersects + * with the specified point; false otherwise. + */ + DisplayObject.prototype.hitTestPoint = function (x, y, shapeFlag) { + if (typeof shapeFlag === "undefined") { shapeFlag = false; } + return false; + }; + + /** + * @inheritDoc + */ + DisplayObject.prototype.isIntersectingRay = function (rayPosition, rayDirection) { + var localRayPosition = this.inverseSceneTransform.transformVector(rayPosition); + var localRayDirection = this.inverseSceneTransform.deltaTransformVector(rayDirection); + var pickingCollisionVO = this._iPickingCollisionVO; + + if (!pickingCollisionVO.localNormal) + pickingCollisionVO.localNormal = new Vector3D(); + + var rayEntryDistance = this.bounds.rayIntersection(localRayPosition, localRayDirection, pickingCollisionVO.localNormal); + + if (rayEntryDistance < 0) + return false; + + pickingCollisionVO.rayEntryDistance = rayEntryDistance; + pickingCollisionVO.localRayPosition = localRayPosition; + pickingCollisionVO.localRayDirection = localRayDirection; + pickingCollisionVO.rayPosition = rayPosition; + pickingCollisionVO.rayDirection = rayDirection; + pickingCollisionVO.rayOriginIsInsideBounds = rayEntryDistance == 0; + + return true; + }; + + /** + * Converts a three-dimensional point of the three-dimensional display + * object's(local) coordinates to a two-dimensional point in the Stage + * (global) coordinates. + * + *

For example, you can only use two-dimensional coordinates(x,y) to draw + * with the display.Graphics methods. To draw a + * three-dimensional object, you need to map the three-dimensional + * coordinates of a display object to two-dimensional coordinates. First, + * create an instance of the Vector3D class that holds the x-, y-, and z- + * coordinates of the three-dimensional display object. Then pass the + * Vector3D object to the local3DToGlobal() method as the + * point3d parameter. The method returns a two-dimensional Point + * object that can be used with the Graphics API to draw the + * three-dimensional object.

+ * + * @param point3d A Vector3D object containing either a three-dimensional + * point or the coordinates of the three-dimensional display + * object. + * @return A two-dimensional point representing a three-dimensional point in + * two-dimensional space. + */ + DisplayObject.prototype.local3DToGlobal = function (point3d) { + return new Point(); + }; + + /** + * Rotates the 3d object around to face a point defined relative to the local coordinates of the parent ObjectContainer3D. + * + * @param target The vector defining the point to be looked at + * @param upAxis An optional vector used to define the desired up orientation of the 3d object after rotation has occurred + */ + DisplayObject.prototype.lookAt = function (target, upAxis) { + if (typeof upAxis === "undefined") { upAxis = null; } + var yAxis; + var zAxis; + var xAxis; + var raw; + + if (upAxis == null) + upAxis = Vector3D.Y_AXIS; + else + upAxis.normalize(); + + zAxis = target.subtract(this._iMatrix3D.position); + zAxis.normalize(); + + xAxis = upAxis.crossProduct(zAxis); + xAxis.normalize(); + + if (xAxis.length < 0.05) { + xAxis.x = upAxis.y; + xAxis.y = upAxis.x; + xAxis.z = 0; + xAxis.normalize(); + } + + yAxis = zAxis.crossProduct(xAxis); + + raw = Matrix3DUtils.RAW_DATA_CONTAINER; + + raw[0] = xAxis.x; + raw[1] = xAxis.y; + raw[2] = xAxis.z; + raw[3] = 0; + + raw[4] = yAxis.x; + raw[5] = yAxis.y; + raw[6] = yAxis.z; + raw[7] = 0; + + raw[8] = zAxis.x; + raw[9] = zAxis.y; + raw[10] = zAxis.z; + raw[11] = 0; + + var m = new Matrix3D(); + m.copyRawDataFrom(raw); + + var vec = m.decompose()[1]; + + this._rotationX = vec.x; + this._rotationY = vec.y; + this._rotationZ = vec.z; + + this.invalidateRotation(); + }; + + /** + * Converts the point object from the display object's(local) + * coordinates to the Stage(global) coordinates. + * + *

This method allows you to convert any given x and y + * coordinates from values that are relative to the origin(0,0) of a + * specific display object(local coordinates) to values that are relative to + * the origin of the Stage(global coordinates).

+ * + *

To use this method, first create an instance of the Point class. The + * x and y values that you assign represent local coordinates + * because they relate to the origin of the display object.

+ * + *

You then pass the Point instance that you created as the parameter to + * the localToGlobal() method. The method returns a new Point + * object with x and y values that relate to the origin of the + * Stage instead of the origin of the display object.

+ * + * @param point The name or identifier of a point created with the Point + * class, specifying the x and y coordinates as + * properties. + * @return A Point object with coordinates relative to the Stage. + */ + DisplayObject.prototype.localToGlobal = function (point) { + return new Point(); + }; + + /** + * Moves the 3d object directly to a point in space + * + * @param dx The amount of movement along the local x axis. + * @param dy The amount of movement along the local y axis. + * @param dz The amount of movement along the local z axis. + */ + DisplayObject.prototype.moveTo = function (dx, dy, dz) { + if (this._x == dx && this._y == dy && this._z == dz) + return; + + this._x = dx; + this._y = dy; + this._z = dz; + + this.invalidatePosition(); + }; + + /** + * Moves the local point around which the object rotates. + * + * @param dx The amount of movement along the local x axis. + * @param dy The amount of movement along the local y axis. + * @param dz The amount of movement along the local z axis. + */ + DisplayObject.prototype.movePivot = function (dx, dy, dz) { + if (this._pivot == null) + this._pivot = new Vector3D(); + + this._pivot.x += dx; + this._pivot.y += dy; + this._pivot.z += dz; + + this.invalidatePivot(); + }; + + /** + * Rotates the 3d object around it's local x-axis + * + * @param angle The amount of rotation in degrees + */ + DisplayObject.prototype.pitch = function (angle) { + this.rotate(Vector3D.X_AXIS, angle); + }; + + /** + * + */ + DisplayObject.prototype.getRenderSceneTransform = function (camera) { + if (this.orientationMode == OrientationMode.CAMERA_PLANE) { + var comps = camera.sceneTransform.decompose(); + var scale = comps[2]; + comps[0] = this.scenePosition; + scale.x = this._pScaleX; + scale.y = this._pScaleY; + scale.z = this._pScaleZ; + this._orientationMatrix.recompose(comps); + + //add in case of pivot + if (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) + this._orientationMatrix.prependTranslation(-this._pivot.x / this._pScaleX, -this._pivot.y / this._pScaleY, -this._pivot.z / this._pScaleZ); + + return this._orientationMatrix; + } + + return this.sceneTransform; + }; + + /** + * Rotates the 3d object around it's local z-axis + * + * @param angle The amount of rotation in degrees + */ + DisplayObject.prototype.roll = function (angle) { + this.rotate(Vector3D.Z_AXIS, angle); + }; + + /** + * Rotates the 3d object around an axis by a defined angle + * + * @param axis The vector defining the axis of rotation + * @param angle The amount of rotation in degrees + */ + DisplayObject.prototype.rotate = function (axis, angle) { + var m = new Matrix3D(); + m.prependRotation(angle, axis); + + var vec = m.decompose()[1]; + + this._rotationX += vec.x; + this._rotationY += vec.y; + this._rotationZ += vec.z; + + this.invalidateRotation(); + }; + + /** + * Rotates the 3d object directly to a euler angle + * + * @param ax The angle in degrees of the rotation around the x axis. + * @param ay The angle in degrees of the rotation around the y axis. + * @param az The angle in degrees of the rotation around the z axis. + */ + DisplayObject.prototype.rotateTo = function (ax, ay, az) { + this._rotationX = ax * MathConsts.DEGREES_TO_RADIANS; + this._rotationY = ay * MathConsts.DEGREES_TO_RADIANS; + this._rotationZ = az * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }; + + /** + * + */ + DisplayObject.prototype.removeEventListener = function (type, listener) { + _super.prototype.removeEventListener.call(this, type, listener); + + if (this.hasEventListener(type, listener)) + return; + + switch (type) { + case DisplayObjectEvent.POSITION_CHANGED: + this._listenToPositionChanged = false; + break; + + case DisplayObjectEvent.ROTATION_CHANGED: + this._listenToRotationChanged = false; + break; + + case DisplayObjectEvent.SCALE_CHANGED: + this._listenToScaleChanged = false; + break; + } + }; + + /** + * Moves the 3d object along a vector by a defined length + * + * @param axis The vector defining the axis of movement + * @param distance The length of the movement + */ + DisplayObject.prototype.translate = function (axis, distance) { + var x = axis.x, y = axis.y, z = axis.z; + var len = distance / Math.sqrt(x * x + y * y + z * z); + + this._x += x * len; + this._y += y * len; + this._z += z * len; + + this.invalidatePosition(); + }; + + /** + * Moves the 3d object along a vector by a defined length + * + * @param axis The vector defining the axis of movement + * @param distance The length of the movement + */ + DisplayObject.prototype.translateLocal = function (axis, distance) { + var x = axis.x, y = axis.y, z = axis.z; + var len = distance / Math.sqrt(x * x + y * y + z * z); + + this._iMatrix3D.prependTranslation(x * len, y * len, z * len); + + this._matrix3D.copyColumnTo(3, this._pos); + + this._x = this._pos.x; + this._y = this._pos.y; + this._z = this._pos.z; + + this.invalidatePosition(); + }; + + /** + * Rotates the 3d object around it's local y-axis + * + * @param angle The amount of rotation in degrees + */ + DisplayObject.prototype.yaw = function (angle) { + this.rotate(Vector3D.Y_AXIS, angle); + }; + + Object.defineProperty(DisplayObject.prototype, "_iAssignedPartition", { + /** + * @internal + */ + get: function () { + return this._pImplicitPartition; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "_iMatrix3D", { + /** + * The transformation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + * + * @internal + */ + get: function () { + if (this._matrix3DDirty) + this._pUpdateMatrix3D(); + + return this._matrix3D; + }, + set: function (val) { + // TODO: From AS3 - Do we still need this in JS ? + //ridiculous matrix error + /* + if (!val.rawData[0]) { + + var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + val.copyRawDataTo(raw); + raw[0] = this._smallestNumber; + val.copyRawDataFrom(raw); + } + //*/ + var elements = val.decompose(); + var vec; + + vec = elements[0]; + + if (this._x != vec.x || this._y != vec.y || this._z != vec.z) { + this._x = vec.x; + this._y = vec.y; + this._z = vec.z; + + this.invalidatePosition(); + } + + vec = elements[1]; + + if (this._rotationX != vec.x || this._rotationY != vec.y || this._rotationZ != vec.z) { + this._rotationX = vec.x; + this._rotationY = vec.y; + this._rotationZ = vec.z; + + this.invalidateRotation(); + } + + vec = elements[2]; + + if (this._pScaleX != vec.x || this._pScaleY != vec.y || this._pScaleZ != vec.z) { + this._pScaleX = vec.x; + this._pScaleY = vec.y; + this._pScaleZ = vec.z; + + this.invalidateScale(); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "_iPickingCollisionVO", { + /** + * @internal + */ + get: function () { + if (!this._pPickingCollisionVO) + this._pPickingCollisionVO = new PickingCollisionVO(this); + + return this._pPickingCollisionVO; + }, + enumerable: true, + configurable: true + }); + + /** + * @internal + */ + DisplayObject.prototype.iSetParent = function (value) { + this._pParent = value; + + if (value) { + this._pUpdateImplicitMouseEnabled(value.mouseChildren); + this._pUpdateImplicitVisibility(value._iIsVisible()); + this._pUpdateImplicitPartition(value._iAssignedPartition); + this._iSetScene(value._pScene); + } else { + this._pUpdateImplicitMouseEnabled(true); + this._pUpdateImplicitVisibility(true); + this._pUpdateImplicitPartition(null); + + this._iSetScene(null); + } + }; + + /** + * @protected + */ + DisplayObject.prototype.pCreateDefaultBoundingVolume = function () { + // point lights should be using sphere bounds + // directional lights should be using null bounds + return new AxisAlignedBoundingBox(); + }; + + /** + * @protected + */ + DisplayObject.prototype.pCreateEntityPartitionNode = function () { + throw new AbstractMethodError(); + }; + + /** + * @protected + */ + DisplayObject.prototype.pInvalidateBounds = function () { + this._pBoundsInvalid = true; + this._worldBoundsInvalid = true; + + if (this.isEntity) + this.invalidatePartition(); + }; + + /** + * @protected + */ + DisplayObject.prototype.pInvalidateSceneTransform = function () { + this._pSceneTransformDirty = !this._pIgnoreTransform; + this._inverseSceneTransformDirty = !this._pIgnoreTransform; + this._scenePositionDirty = !this._pIgnoreTransform; + + this._worldBoundsInvalid = !this._pIgnoreTransform; + + if (this.isEntity) + this.invalidatePartition(); + + if (this._listenToSceneTransformChanged) + this.notifySceneTransformChange(); + }; + + /** + * @protected + */ + DisplayObject.prototype.pUpdateBounds = function () { + this._width = this._pBounds.aabb.width * this._pScaleX; + this._height = this._pBounds.aabb.height * this._pScaleY; + this._depth = this._pBounds.aabb.depth * this._pScaleZ; + + this._pBoundsInvalid = false; + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateImplicitMouseEnabled = function (value) { + this._pImplicitMouseEnabled = this._explicitMouseEnabled && value; + + // If there is a parent and this child does not have a picking collider, use its parent's picking collider. + if (this._pImplicitMouseEnabled && this._pParent && !this._pPickingCollider) + this._pPickingCollider = this._pParent._pPickingCollider; + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateImplicitPartition = function (value) { + // assign parent implicit partition if no explicit one is given + this._pImplicitPartition = this._explicitPartition || value; + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateImplicitVisibility = function (value) { + this._pImplicitVisibility = this._explicitVisibility && value; + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateMatrix3D = function () { + this._pos.x = this._x; + this._pos.y = this._y; + this._pos.z = this._z; + + this._rot.x = this._rotationX; + this._rot.y = this._rotationY; + this._rot.z = this._rotationZ; + + this._sca.x = this._pScaleX; + this._sca.y = this._pScaleY; + this._sca.z = this._pScaleZ; + + this._matrix3D.recompose(this._transformComponents); + + if (!this._pivotZero) { + this._matrix3D.prependTranslation(-this._pivot.x / this._pScaleX, -this._pivot.y / this._pScaleY, -this._pivot.z / this._pScaleZ); + if (this.alignmentMode != AlignmentMode.PIVOT_POINT) + this._matrix3D.appendTranslation(this._pivot.x, this._pivot.y, this._pivot.z); + } + + this._matrix3DDirty = false; + this._positionDirty = false; + this._rotationDirty = false; + this._scaleDirty = false; + this._pivotDirty = false; + }; + + /** + * @protected + */ + DisplayObject.prototype.pUpdateSceneTransform = function () { + if (this._pParent && !this._pParent._iIsRoot) { + this._pSceneTransform.copyFrom(this._pParent.sceneTransform); + this._pSceneTransform.prepend(this._iMatrix3D); + } else { + this._pSceneTransform.copyFrom(this._iMatrix3D); + } + + this._pSceneTransformDirty = false; + }; + + DisplayObject.prototype._iAddRenderable = function (renderable) { + this._pRenderables.push(renderable); + + return renderable; + }; + + DisplayObject.prototype._iRemoveRenderable = function (renderable) { + var index = this._pRenderables.indexOf(renderable); + + this._pRenderables.splice(index, 1); + + return renderable; + }; + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + DisplayObject.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { + return false; + }; + + /** + * + */ + DisplayObject.prototype._iInternalUpdate = function () { + if (this._iController) + this._iController.update(); + }; + + /** + * @internal + */ + DisplayObject.prototype._iIsVisible = function () { + return this._pImplicitVisibility; + }; + + /** + * @internal + */ + DisplayObject.prototype._iIsMouseEnabled = function () { + return this._pImplicitMouseEnabled; + }; + + /** + * @internal + */ + DisplayObject.prototype._iSetScene = function (value) { + // test to see if we're switching roots while we're already using a scene partition + /* + if (value == null) + this._oldScene = this._pScene; + + if (this._explicitPartition && this._oldScene && this._oldScene != this._pScene) + this.partition = null; + + if (value) + this._oldScene = null; + + // end of stupid partition test code + //*/ + if (this._pScene == value) + return; + + this._pUpdateScene(value); + + if (!this._pSceneTransformDirty && !this._pIgnoreTransform) + this.pInvalidateSceneTransform(); + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateScene = function (value) { + if (this._pScene) { + this._pScene.dispatchEvent(new SceneEvent(SceneEvent.REMOVED_FROM_SCENE, this)); + + //unregister entity from current scene + this._pScene.iUnregisterEntity(this); + } + + this._pScene = value; + + if (value) { + value.dispatchEvent(new SceneEvent(SceneEvent.ADDED_TO_SCENE, this)); + + //register entity with new scene + value.iRegisterEntity(this); + } + + this.notifySceneChange(); + }; + + /** + * @private + */ + DisplayObject.prototype.notifyPositionChanged = function () { + if (!this._positionChanged) + this._positionChanged = new DisplayObjectEvent(DisplayObjectEvent.POSITION_CHANGED, this); + + this.dispatchEvent(this._positionChanged); + }; + + /** + * @private + */ + DisplayObject.prototype.notifyRotationChanged = function () { + if (!this._rotationChanged) + this._rotationChanged = new DisplayObjectEvent(DisplayObjectEvent.ROTATION_CHANGED, this); + + this.dispatchEvent(this._rotationChanged); + }; + + /** + * @private + */ + DisplayObject.prototype.notifyScaleChanged = function () { + if (!this._scaleChanged) + this._scaleChanged = new DisplayObjectEvent(DisplayObjectEvent.SCALE_CHANGED, this); + + this.dispatchEvent(this._scaleChanged); + }; + + /** + * @private + */ + DisplayObject.prototype.notifySceneChange = function () { + if (this._listenToSceneChanged) { + if (!this._scenechanged) + this._scenechanged = new DisplayObjectEvent(DisplayObjectEvent.SCENE_CHANGED, this); + + this.dispatchEvent(this._scenechanged); + } + }; + + /** + * @private + */ + DisplayObject.prototype.notifySceneTransformChange = function () { + if (!this._sceneTransformChanged) + this._sceneTransformChanged = new DisplayObjectEvent(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this); + + this.dispatchEvent(this._sceneTransformChanged); + }; + + /** + * Invalidates the 3D transformation matrix, causing it to be updated upon the next request + * + * @private + */ + DisplayObject.prototype.invalidateMatrix3D = function () { + if (this._matrix3DDirty) + return; + + this._matrix3DDirty = true; + + if (!this._pSceneTransformDirty && !this._pIgnoreTransform) + this.pInvalidateSceneTransform(); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidatePartition = function () { + if (this._iAssignedPartition) + this._iAssignedPartition.iMarkForUpdate(this); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidatePivot = function () { + this._pivotZero = (this._pivot.x == 0) && (this._pivot.y == 0) && (this._pivot.z == 0); + + if (this._pivotDirty) + return; + + this._pivotDirty = true; + + this.invalidateMatrix3D(); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidatePosition = function () { + if (this._positionDirty) + return; + + this._positionDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToPositionChanged) + this.notifyPositionChanged(); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidateRotation = function () { + if (this._rotationDirty) + return; + + this._rotationDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToRotationChanged) + this.notifyRotationChanged(); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidateScale = function () { + if (this._scaleDirty) + return; + + this._scaleDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToScaleChanged) + this.notifyScaleChanged(); + }; + return DisplayObject; +})(NamedAssetBase); + +module.exports = DisplayObject; + + +},{"awayjs-core/lib/bounds/AxisAlignedBoundingBox":undefined,"awayjs-core/lib/core/base/AlignmentMode":undefined,"awayjs-core/lib/core/base/OrientationMode":undefined,"awayjs-core/lib/core/geom/MathConsts":undefined,"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/geom/Matrix3DUtils":undefined,"awayjs-core/lib/core/geom/Point":undefined,"awayjs-core/lib/core/geom/Transform":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/core/library/NamedAssetBase":undefined,"awayjs-core/lib/core/pick/PickingCollisionVO":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/events/DisplayObjectEvent":undefined,"awayjs-core/lib/events/SceneEvent":undefined}],"awayjs-core/lib/core/base/Geometry":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +var GeometryEvent = require("awayjs-core/lib/events/GeometryEvent"); + +/** +* +* Geometry is a collection of SubGeometries, each of which contain the actual geometrical data such as vertices, +* normals, uvs, etc. It also contains a reference to an animation class, which defines how the geometry moves. +* A Geometry object is assigned to a Mesh, a scene graph occurence of the geometry, which in turn assigns +* the SubGeometries to its respective TriangleSubMesh objects. +* +* +* +* @see away.core.base.SubGeometry +* @see away.entities.Mesh +* +* @class Geometry +*/ +var Geometry = (function (_super) { + __extends(Geometry, _super); + /** + * Creates a new Geometry object. + */ + function Geometry() { + _super.call(this); + + this._subGeometries = new Array(); + } + Object.defineProperty(Geometry.prototype, "assetType", { + get: function () { + return AssetType.GEOMETRY; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Geometry.prototype, "subGeometries", { + /** + * A collection of TriangleSubGeometry objects, each of which contain geometrical data such as vertices, normals, etc. + */ + get: function () { + return this._subGeometries; + }, + enumerable: true, + configurable: true + }); + + Geometry.prototype.getSubGeometries = function () { + return this._subGeometries; + }; + + Geometry.prototype.applyTransformation = function (transform) { + var len = this._subGeometries.length; + for (var i = 0; i < len; ++i) + this._subGeometries[i].applyTransformation(transform); + }; + + /** + * Adds a new TriangleSubGeometry object to the list. + * @param subGeometry The TriangleSubGeometry object to be added. + */ + Geometry.prototype.addSubGeometry = function (subGeometry) { + this._subGeometries.push(subGeometry); + + subGeometry.parentGeometry = this; + + if (this.hasEventListener(GeometryEvent.SUB_GEOMETRY_ADDED)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.SUB_GEOMETRY_ADDED, subGeometry)); + + this.iInvalidateBounds(subGeometry); + }; + + /** + * Removes a new TriangleSubGeometry object from the list. + * @param subGeometry The TriangleSubGeometry object to be removed. + */ + Geometry.prototype.removeSubGeometry = function (subGeometry) { + this._subGeometries.splice(this._subGeometries.indexOf(subGeometry), 1); + + subGeometry.parentGeometry = null; + + if (this.hasEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.SUB_GEOMETRY_REMOVED, subGeometry)); + + this.iInvalidateBounds(subGeometry); + }; + + /** + * Clones the geometry. + * @return An exact duplicate of the current Geometry object. + */ + Geometry.prototype.clone = function () { + var clone = new Geometry(); + var len = this._subGeometries.length; + + for (var i = 0; i < len; ++i) + clone.addSubGeometry(this._subGeometries[i].clone()); + + return clone; + }; + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + Geometry.prototype.scale = function (scale) { + var numSubGeoms = this._subGeometries.length; + for (var i = 0; i < numSubGeoms; ++i) + this._subGeometries[i].scale(scale); + }; + + /** + * Clears all resources used by the Geometry object, including SubGeometries. + */ + Geometry.prototype.dispose = function () { + var numSubGeoms = this._subGeometries.length; + + for (var i = 0; i < numSubGeoms; ++i) { + var subGeom = this._subGeometries[0]; + this.removeSubGeometry(subGeom); + subGeom.dispose(); + } + }; + + /** + * Scales the uv coordinates (tiling) + * @param scaleU The amount by which to scale on the u axis. Default is 1; + * @param scaleV The amount by which to scale on the v axis. Default is 1; + */ + Geometry.prototype.scaleUV = function (scaleU, scaleV) { + if (typeof scaleU === "undefined") { scaleU = 1; } + if (typeof scaleV === "undefined") { scaleV = 1; } + var numSubGeoms = this._subGeometries.length; + + for (var i = 0; i < numSubGeoms; ++i) + this._subGeometries[i].scaleUV(scaleU, scaleV); + }; + + Geometry.prototype.iInvalidateBounds = function (subGeom) { + if (this.hasEventListener(GeometryEvent.BOUNDS_INVALID)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.BOUNDS_INVALID, subGeom)); + }; + return Geometry; +})(NamedAssetBase); + +module.exports = Geometry; + + +},{"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/library/NamedAssetBase":undefined,"awayjs-core/lib/events/GeometryEvent":undefined}],"awayjs-core/lib/core/base/GradientType":[function(require,module,exports){ +/** +* The GradientType class provides values for the type parameter +* in the beginGradientFill() and +* lineGradientStyle() methods of the flash.display.Graphics +* class. +*/ +var GradientType = (function () { + function GradientType() { + } + GradientType.LINEAR = "linear"; + + GradientType.RADIAL = "radial"; + return GradientType; +})(); + +module.exports = GradientType; + + +},{}],"awayjs-core/lib/core/base/GraphicsPathWinding":[function(require,module,exports){ +/** +* The GraphicsPathWinding class provides values for the +* flash.display.GraphicsPath.winding property and the +* flash.display.Graphics.drawPath() method to determine the +* direction to draw a path. A clockwise path is positively wound, and a +* counter-clockwise path is negatively wound: +* +*

When paths intersect or overlap, the winding direction determines the +* rules for filling the areas created by the intersection or overlap:

+*/ +var GraphicsPathWinding = (function () { + function GraphicsPathWinding() { + } + GraphicsPathWinding.EVEN_ODD = "evenOdd"; + GraphicsPathWinding.NON_ZERO = "nonZero"; + return GraphicsPathWinding; +})(); + +module.exports = GraphicsPathWinding; + + +},{}],"awayjs-core/lib/core/base/Graphics":[function(require,module,exports){ +/** +* The Graphics class contains a set of methods that you can use to create a +* vector shape. Display objects that support drawing include Sprite and Shape +* objects. Each of these classes includes a graphics property +* that is a Graphics object. The following are among those helper functions +* provided for ease of use: drawRect(), +* drawRoundRect(), drawCircle(), and +* drawEllipse(). +* +*

You cannot create a Graphics object directly from ActionScript code. If +* you call new Graphics(), an exception is thrown.

+* +*

The Graphics class is final; it cannot be subclassed.

+*/ +var Graphics = (function () { + function Graphics() { + } + /** + * Fills a drawing area with a bitmap image. The bitmap can be repeated or + * tiled to fill the area. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param bitmap A transparent or opaque bitmap image that contains the bits + * to be displayed. + * @param matrix A matrix object(of the flash.geom.Matrix class), which you + * can use to define transformations on the bitmap. For + * example, you can use the following matrix to rotate a bitmap + * by 45 degrees(pi/4 radians): + * @param repeat If true, the bitmap image repeats in a tiled + * pattern. If false, the bitmap image does not + * repeat, and the edges of the bitmap are used for any fill + * area that extends beyond the bitmap. + * + *

For example, consider the following bitmap(a 20 x + * 20-pixel checkerboard pattern):

+ * + *

When repeat is set to true(as + * in the following example), the bitmap fill repeats the + * bitmap:

+ * + *

When repeat is set to false, + * the bitmap fill uses the edge pixels for the fill area + * outside the bitmap:

+ * @param smooth If false, upscaled bitmap images are rendered + * by using a nearest-neighbor algorithm and look pixelated. If + * true, upscaled bitmap images are rendered by + * using a bilinear algorithm. Rendering by using the nearest + * neighbor algorithm is faster. + */ + Graphics.prototype.beginBitmapFill = function (bitmap, matrix, repeat, smooth) { + if (typeof matrix === "undefined") { matrix = null; } + if (typeof repeat === "undefined") { repeat = true; } + if (typeof smooth === "undefined") { smooth = false; } + }; + + /** + * Specifies a simple one-color fill that subsequent calls to other Graphics + * methods(such as lineTo() or drawCircle()) use + * when drawing. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param color The color of the fill(0xRRGGBB). + * @param alpha The alpha value of the fill(0.0 to 1.0). + */ + Graphics.prototype.beginFill = function (color /*int*/ , alpha) { + if (typeof alpha === "undefined") { alpha = 1; } + }; + + /** + * Specifies a gradient fill used by subsequent calls to other Graphics + * methods(such as lineTo() or drawCircle()) for + * the object. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param type A value from the GradientType class that + * specifies which gradient type to use: + * GradientType.LINEAR or + * GradientType.RADIAL. + * @param colors An array of RGB hexadecimal color values used + * in the gradient; for example, red is 0xFF0000, + * blue is 0x0000FF, and so on. You can specify + * up to 15 colors. For each color, specify a + * corresponding value in the alphas and ratios + * parameters. + * @param alphas An array of alpha values for the corresponding + * colors in the colors array; valid values are 0 + * to 1. If the value is less than 0, the default + * is 0. If the value is greater than 1, the + * default is 1. + * @param ratios An array of color distribution ratios; valid + * values are 0-255. This value defines the + * percentage of the width where the color is + * sampled at 100%. The value 0 represents the + * left position in the gradient box, and 255 + * represents the right position in the gradient + * box. + * @param matrix A transformation matrix as defined by the + * flash.geom.Matrix class. The flash.geom.Matrix + * class includes a + * createGradientBox() method, which + * lets you conveniently set up the matrix for use + * with the beginGradientFill() + * method. + * @param spreadMethod A value from the SpreadMethod class that + * specifies which spread method to use, either: + * SpreadMethod.PAD, + * SpreadMethod.REFLECT, or + * SpreadMethod.REPEAT. + * + *

For example, consider a simple linear + * gradient between two colors:

+ * + *

This example uses + * SpreadMethod.PAD for the spread + * method, and the gradient fill looks like the + * following:

+ * + *

If you use SpreadMethod.REFLECT + * for the spread method, the gradient fill looks + * like the following:

+ * + *

If you use SpreadMethod.REPEAT + * for the spread method, the gradient fill looks + * like the following:

+ * @param interpolationMethod A value from the InterpolationMethod class that + * specifies which value to use: + * InterpolationMethod.LINEAR_RGB or + * InterpolationMethod.RGB + * + *

For example, consider a simple linear + * gradient between two colors(with the + * spreadMethod parameter set to + * SpreadMethod.REFLECT). The + * different interpolation methods affect the + * appearance as follows:

+ * @param focalPointRatio A number that controls the location of the + * focal point of the gradient. 0 means that the + * focal point is in the center. 1 means that the + * focal point is at one border of the gradient + * circle. -1 means that the focal point is at the + * other border of the gradient circle. A value + * less than -1 or greater than 1 is rounded to -1 + * or 1. For example, the following example shows + * a focalPointRatio set to 0.75: + * @throws ArgumentError If the type parameter is not valid. + */ + Graphics.prototype.beginGradientFill = function (type, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio) { + if (typeof matrix === "undefined") { matrix = null; } + if (typeof spreadMethod === "undefined") { spreadMethod = "pad"; } + if (typeof interpolationMethod === "undefined") { interpolationMethod = "rgb"; } + if (typeof focalPointRatio === "undefined") { focalPointRatio = 0; } + }; + + /** + * Specifies a shader fill used by subsequent calls to other Graphics methods + * (such as lineTo() or drawCircle()) for the + * object. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + *

Shader fills are not supported under GPU rendering; filled areas will + * be colored cyan.

+ * + * @param shader The shader to use for the fill. This Shader instance is not + * required to specify an image input. However, if an image + * input is specified in the shader, the input must be provided + * manually. To specify the input, set the input + * property of the corresponding ShaderInput property of the + * Shader.data property. + * + *

When you pass a Shader instance as an argument the shader + * is copied internally. The drawing fill operation uses that + * internal copy, not a reference to the original shader. Any + * changes made to the shader, such as changing a parameter + * value, input, or bytecode, are not applied to the copied + * shader that's used for the fill.

+ * @param matrix A matrix object(of the flash.geom.Matrix class), which you + * can use to define transformations on the shader. For + * example, you can use the following matrix to rotate a shader + * by 45 degrees(pi/4 radians): + * + *

The coordinates received in the shader are based on the + * matrix that is specified for the matrix + * parameter. For a default(null) matrix, the + * coordinates in the shader are local pixel coordinates which + * can be used to sample an input.

+ * @throws ArgumentError When the shader output type is not compatible with + * this operation(the shader must specify a + * pixel3 or pixel4 output). + * @throws ArgumentError When the shader specifies an image input that isn't + * provided. + * @throws ArgumentError When a ByteArray or Vector. instance is used + * as an input and the width and + * height properties aren't specified for + * the ShaderInput, or the specified values don't match + * the amount of data in the input object. See the + * ShaderInput.input property for more + * information. + */ + // public beginShaderFill(shader:Shader, matrix:Matrix = null) + // { + // + // } + /** + * Clears the graphics that were drawn to this Graphics object, and resets + * fill and line style settings. + * + */ + Graphics.prototype.clear = function () { + }; + + /** + * Copies all of drawing commands from the source Graphics object into the + * calling Graphics object. + * + * @param sourceGraphics The Graphics object from which to copy the drawing + * commands. + */ + Graphics.prototype.copyFrom = function (sourceGraphics) { + }; + + /** + * Draws a cubic Bezier curve from the current drawing position to the + * specified anchor point. Cubic Bezier curves consist of two anchor points + * and two control points. The curve interpolates the two anchor points and + * curves toward the two control points. + * + * The four points you use to draw a cubic Bezier curve with the + * cubicCurveTo() method are as follows: + * + *
    + *
  • The current drawing position is the first anchor point.
  • + *
  • The anchorX and anchorY parameters specify the second anchor point. + *
  • + *
  • The controlX1 and controlY1 parameters + * specify the first control point.
  • + *
  • The controlX2 and controlY2 parameters + * specify the second control point.
  • + *
+ * + * If you call the cubicCurveTo() method before calling the + * moveTo() method, your curve starts at position (0, 0). + * + * If the cubicCurveTo() method succeeds, the Flash runtime sets + * the current drawing position to (anchorX, + * anchorY). If the cubicCurveTo() method fails, + * the current drawing position remains unchanged. + * + * If your movie clip contains content created with the Flash drawing tools, + * the results of calls to the cubicCurveTo() method are drawn + * underneath that content. + * + * @param controlX1 Specifies the horizontal position of the first control + * point relative to the registration point of the parent + * display object. + * @param controlY1 Specifies the vertical position of the first control + * point relative to the registration point of the parent + * display object. + * @param controlX2 Specifies the horizontal position of the second control + * point relative to the registration point of the parent + * display object. + * @param controlY2 Specifies the vertical position of the second control + * point relative to the registration point of the parent + * display object. + * @param anchorX Specifies the horizontal position of the anchor point + * relative to the registration point of the parent display + * object. + * @param anchorY Specifies the vertical position of the anchor point + * relative to the registration point of the parent display + * object. + */ + Graphics.prototype.cubicCurveTo = function (controlX1, controlY1, controlX2, controlY2, anchorX, anchorY) { + }; + + /** + * Draws a curve using the current line style from the current drawing + * position to(anchorX, anchorY) and using the control point that + * (controlX, controlY) specifies. The current + * drawing position is then set to(anchorX, + * anchorY). If the movie clip in which you are drawing contains + * content created with the Flash drawing tools, calls to the + * curveTo() method are drawn underneath this content. If you + * call the curveTo() method before any calls to the + * moveTo() method, the default of the current drawing position + * is(0, 0). If any of the parameters are missing, this method fails and the + * current drawing position is not changed. + * + *

The curve drawn is a quadratic Bezier curve. Quadratic Bezier curves + * consist of two anchor points and one control point. The curve interpolates + * the two anchor points and curves toward the control point.

+ * + * @param controlX A number that specifies the horizontal position of the + * control point relative to the registration point of the + * parent display object. + * @param controlY A number that specifies the vertical position of the + * control point relative to the registration point of the + * parent display object. + * @param anchorX A number that specifies the horizontal position of the + * next anchor point relative to the registration point of + * the parent display object. + * @param anchorY A number that specifies the vertical position of the next + * anchor point relative to the registration point of the + * parent display object. + */ + Graphics.prototype.curveTo = function (controlX, controlY, anchorX, anchorY) { + }; + + /** + * Draws a circle. Set the line style, fill, or both before you call the + * drawCircle() method, by calling the linestyle(), + * lineGradientStyle(), beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. + * + * @param x The x location of the center of the circle relative + * to the registration point of the parent display object(in + * pixels). + * @param y The y location of the center of the circle relative + * to the registration point of the parent display object(in + * pixels). + * @param radius The radius of the circle(in pixels). + */ + Graphics.prototype.drawCircle = function (x, y, radius) { + }; + + /** + * Draws an ellipse. Set the line style, fill, or both before you call the + * drawEllipse() method, by calling the + * linestyle(), lineGradientStyle(), + * beginFill(), beginGradientFill(), or + * beginBitmapFill() method. + * + * @param x The x location of the top-left of the bounding-box of + * the ellipse relative to the registration point of the parent + * display object(in pixels). + * @param y The y location of the top left of the bounding-box of + * the ellipse relative to the registration point of the parent + * display object(in pixels). + * @param width The width of the ellipse(in pixels). + * @param height The height of the ellipse(in pixels). + */ + Graphics.prototype.drawEllipse = function (x, y, width, height) { + }; + + /** + * Submits a series of IGraphicsData instances for drawing. This method + * accepts a Vector containing objects including paths, fills, and strokes + * that implement the IGraphicsData interface. A Vector of IGraphicsData + * instances can refer to a part of a shape, or a complex fully defined set + * of data for rendering a complete shape. + * + *

Graphics paths can contain other graphics paths. If the + * graphicsData Vector includes a path, that path and all its + * sub-paths are rendered during this operation.

+ * + */ + Graphics.prototype.drawGraphicsData = function (graphicsData) { + }; + + /** + * Submits a series of commands for drawing. The drawPath() + * method uses vector arrays to consolidate individual moveTo(), + * lineTo(), and curveTo() drawing commands into a + * single call. The drawPath() method parameters combine drawing + * commands with x- and y-coordinate value pairs and a drawing direction. The + * drawing commands are values from the GraphicsPathCommand class. The x- and + * y-coordinate value pairs are Numbers in an array where each pair defines a + * coordinate location. The drawing direction is a value from the + * GraphicsPathWinding class. + * + *

Generally, drawings render faster with drawPath() than + * with a series of individual lineTo() and + * curveTo() methods.

+ * + *

The drawPath() method uses a uses a floating computation + * so rotation and scaling of shapes is more accurate and gives better + * results. However, curves submitted using the drawPath() + * method can have small sub-pixel alignment errors when used in conjunction + * with the lineTo() and curveTo() methods.

+ * + *

The drawPath() method also uses slightly different rules + * for filling and drawing lines. They are:

+ * + *
    + *
  • When a fill is applied to rendering a path: + *
      + *
    • A sub-path of less than 3 points is not rendered.(But note that the + * stroke rendering will still occur, consistent with the rules for strokes + * below.)
    • + *
    • A sub-path that isn't closed(the end point is not equal to the + * begin point) is implicitly closed.
    • + *
    + *
  • + *
  • When a stroke is applied to rendering a path: + *
      + *
    • The sub-paths can be composed of any number of points.
    • + *
    • The sub-path is never implicitly closed.
    • + *
    + *
  • + *
+ * + * @param winding Specifies the winding rule using a value defined in the + * GraphicsPathWinding class. + */ + Graphics.prototype.drawPath = function (commands, data, winding) { + }; + + /** + * Draws a rectangle. Set the line style, fill, or both before you call the + * drawRect() method, by calling the linestyle(), + * lineGradientStyle(), beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. + * + * @param x A number indicating the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number indicating the vertical position relative to the + * registration point of the parent display object(in pixels). + * @param width The width of the rectangle(in pixels). + * @param height The height of the rectangle(in pixels). + * @throws ArgumentError If the width or height + * parameters are not a number + * (Number.NaN). + */ + Graphics.prototype.drawRect = function (x, y, width, height) { + }; + + /** + * Draws a rounded rectangle. Set the line style, fill, or both before you + * call the drawRoundRect() method, by calling the + * linestyle(), lineGradientStyle(), + * beginFill(), beginGradientFill(), or + * beginBitmapFill() method. + * + * @param x A number indicating the horizontal position relative + * to the registration point of the parent display + * object(in pixels). + * @param y A number indicating the vertical position relative to + * the registration point of the parent display object + * (in pixels). + * @param width The width of the round rectangle(in pixels). + * @param height The height of the round rectangle(in pixels). + * @param ellipseWidth The width of the ellipse used to draw the rounded + * corners(in pixels). + * @param ellipseHeight The height of the ellipse used to draw the rounded + * corners(in pixels). Optional; if no value is + * specified, the default value matches that provided + * for the ellipseWidth parameter. + * @throws ArgumentError If the width, height, + * ellipseWidth or + * ellipseHeight parameters are not a + * number(Number.NaN). + */ + Graphics.prototype.drawRoundRect = function (x, y, width, height, ellipseWidth, ellipseHeight) { + if (typeof ellipseHeight === "undefined") { ellipseHeight = NaN; } + }; + + //public drawRoundRectComplex(x:Float, y:Float, width:Float, height:Float, topLeftRadius:Float, topRightRadius:Float, bottomLeftRadius:Float, bottomRightRadius:Float):Void; + /** + * Renders a set of triangles, typically to distort bitmaps and give them a + * three-dimensional appearance. The drawTriangles() method maps + * either the current fill, or a bitmap fill, to the triangle faces using a + * set of(u,v) coordinates. + * + *

Any type of fill can be used, but if the fill has a transform matrix + * that transform matrix is ignored.

+ * + *

A uvtData parameter improves texture mapping when a + * bitmap fill is used.

+ * + * @param culling Specifies whether to render triangles that face in a + * specified direction. This parameter prevents the rendering + * of triangles that cannot be seen in the current view. This + * parameter can be set to any value defined by the + * TriangleCulling class. + */ + Graphics.prototype.drawTriangles = function (vertices, indices, uvtData, culling) { + if (typeof indices === "undefined") { indices = null; } + if (typeof uvtData === "undefined") { uvtData = null; } + if (typeof culling === "undefined") { culling = null; } + }; + + /** + * Applies a fill to the lines and curves that were added since the last call + * to the beginFill(), beginGradientFill(), or + * beginBitmapFill() method. Flash uses the fill that was + * specified in the previous call to the beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. If the current drawing position does not equal the previous + * position specified in a moveTo() method and a fill is + * defined, the path is closed with a line and then filled. + * + */ + Graphics.prototype.endFill = function () { + }; + + /** + * Specifies a bitmap to use for the line stroke when drawing lines. + * + *

The bitmap line style is used for subsequent calls to Graphics methods + * such as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineStyle() or lineGradientStyle() methods, or + * the lineBitmapStyle() method again with different parameters. + *

+ * + *

You can call the lineBitmapStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineBitmapStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param bitmap The bitmap to use for the line stroke. + * @param matrix An optional transformation matrix as defined by the + * flash.geom.Matrix class. The matrix can be used to scale or + * otherwise manipulate the bitmap before applying it to the + * line style. + * @param repeat Whether to repeat the bitmap in a tiled fashion. + * @param smooth Whether smoothing should be applied to the bitmap. + */ + Graphics.prototype.lineBitmapStyle = function (bitmap, matrix, repeat, smooth) { + if (typeof matrix === "undefined") { matrix = null; } + if (typeof repeat === "undefined") { repeat = true; } + if (typeof smooth === "undefined") { smooth = false; } + }; + + /** + * Specifies a gradient to use for the stroke when drawing lines. + * + *

The gradient line style is used for subsequent calls to Graphics + * methods such as the lineTo() methods or the + * drawCircle() method. The line style remains in effect until + * you call the lineStyle() or lineBitmapStyle() + * methods, or the lineGradientStyle() method again with + * different parameters.

+ * + *

You can call the lineGradientStyle() method in the middle + * of drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineGradientStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param type A value from the GradientType class that + * specifies which gradient type to use, either + * GradientType.LINEAR or GradientType.RADIAL. + * @param colors An array of RGB hexadecimal color values used + * in the gradient; for example, red is 0xFF0000, + * blue is 0x0000FF, and so on. You can specify + * up to 15 colors. For each color, specify a + * corresponding value in the alphas and ratios + * parameters. + * @param alphas An array of alpha values for the corresponding + * colors in the colors array; valid values are 0 + * to 1. If the value is less than 0, the default + * is 0. If the value is greater than 1, the + * default is 1. + * @param ratios An array of color distribution ratios; valid + * values are 0-255. This value defines the + * percentage of the width where the color is + * sampled at 100%. The value 0 represents the + * left position in the gradient box, and 255 + * represents the right position in the gradient + * box. + * @param matrix A transformation matrix as defined by the + * flash.geom.Matrix class. The flash.geom.Matrix + * class includes a + * createGradientBox() method, which + * lets you conveniently set up the matrix for use + * with the lineGradientStyle() + * method. + * @param spreadMethod A value from the SpreadMethod class that + * specifies which spread method to use: + * @param interpolationMethod A value from the InterpolationMethod class that + * specifies which value to use. For example, + * consider a simple linear gradient between two + * colors(with the spreadMethod + * parameter set to + * SpreadMethod.REFLECT). The + * different interpolation methods affect the + * appearance as follows: + * @param focalPointRatio A number that controls the location of the + * focal point of the gradient. The value 0 means + * the focal point is in the center. The value 1 + * means the focal point is at one border of the + * gradient circle. The value -1 means that the + * focal point is at the other border of the + * gradient circle. Values less than -1 or greater + * than 1 are rounded to -1 or 1. The following + * image shows a gradient with a + * focalPointRatio of -0.75: + */ + Graphics.prototype.lineGradientStyle = function (type, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio) { + if (typeof matrix === "undefined") { matrix = null; } + if (typeof spreadMethod === "undefined") { spreadMethod = null; } + if (typeof interpolationMethod === "undefined") { interpolationMethod = null; } + if (typeof focalPointRatio === "undefined") { focalPointRatio = 0; } + }; + + /** + * Specifies a shader to use for the line stroke when drawing lines. + * + *

The shader line style is used for subsequent calls to Graphics methods + * such as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineStyle() or lineGradientStyle() methods, or + * the lineBitmapStyle() method again with different parameters. + *

+ * + *

You can call the lineShaderStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineShaderStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param shader The shader to use for the line stroke. + * @param matrix An optional transformation matrix as defined by the + * flash.geom.Matrix class. The matrix can be used to scale or + * otherwise manipulate the bitmap before applying it to the + * line style. + */ + // public lineShaderStyle(shader:Shader, matrix:Matrix = null) + // { + // + // } + /** + * Specifies a line style used for subsequent calls to Graphics methods such + * as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineGradientStyle() method, the + * lineBitmapStyle() method, or the lineStyle() + * method with different parameters. + * + *

You can call the lineStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within the path.

+ * + *

Note: Calls to the clear() method set the line + * style back to undefined.

+ * + *

Note: Flash Lite 4 supports only the first three parameters + * (thickness, color, and alpha).

+ * + * @param thickness An integer that indicates the thickness of the line in + * points; valid values are 0-255. If a number is not + * specified, or if the parameter is undefined, a line is + * not drawn. If a value of less than 0 is passed, the + * default is 0. The value 0 indicates hairline + * thickness; the maximum thickness is 255. If a value + * greater than 255 is passed, the default is 255. + * @param color A hexadecimal color value of the line; for example, + * red is 0xFF0000, blue is 0x0000FF, and so on. If a + * value is not indicated, the default is 0x000000 + * (black). Optional. + * @param alpha A number that indicates the alpha value of the color + * of the line; valid values are 0 to 1. If a value is + * not indicated, the default is 1(solid). If the value + * is less than 0, the default is 0. If the value is + * greater than 1, the default is 1. + * @param pixelHinting(Not supported in Flash Lite 4) A Boolean value that + * specifies whether to hint strokes to full pixels. This + * affects both the position of anchors of a curve and + * the line stroke size itself. With + * pixelHinting set to true, + * line widths are adjusted to full pixel widths. With + * pixelHinting set to false, + * disjoints can appear for curves and straight lines. + * For example, the following illustrations show how + * Flash Player or Adobe AIR renders two rounded + * rectangles that are identical, except that the + * pixelHinting parameter used in the + * lineStyle() method is set differently + * (the images are scaled by 200%, to emphasize the + * difference): + * + *

If a value is not supplied, the line does not use + * pixel hinting.

+ * @param scaleMode (Not supported in Flash Lite 4) A value from the + * LineScaleMode class that specifies which scale mode to + * use: + *
    + *
  • LineScaleMode.NORMAL - Always + * scale the line thickness when the object is scaled + * (the default).
  • + *
  • LineScaleMode.NONE - Never scale + * the line thickness.
  • + *
  • LineScaleMode.VERTICAL - Do not + * scale the line thickness if the object is scaled + * vertically only. For example, consider the + * following circles, drawn with a one-pixel line, and + * each with the scaleMode parameter set to + * LineScaleMode.VERTICAL. The circle on the + * left is scaled vertically only, and the circle on the + * right is scaled both vertically and horizontally: + *
  • + *
  • LineScaleMode.HORIZONTAL - Do not + * scale the line thickness if the object is scaled + * horizontally only. For example, consider the + * following circles, drawn with a one-pixel line, and + * each with the scaleMode parameter set to + * LineScaleMode.HORIZONTAL. The circle on + * the left is scaled horizontally only, and the circle + * on the right is scaled both vertically and + * horizontally:
  • + *
+ * @param caps (Not supported in Flash Lite 4) A value from the + * CapsStyle class that specifies the type of caps at the + * end of lines. Valid values are: + * CapsStyle.NONE, + * CapsStyle.ROUND, and + * CapsStyle.SQUARE. If a value is not + * indicated, Flash uses round caps. + * + *

For example, the following illustrations show the + * different capsStyle settings. For each + * setting, the illustration shows a blue line with a + * thickness of 30(for which the capsStyle + * applies), and a superimposed black line with a + * thickness of 1(for which no capsStyle + * applies):

+ * @param joints (Not supported in Flash Lite 4) A value from the + * JointStyle class that specifies the type of joint + * appearance used at angles. Valid values are: + * JointStyle.BEVEL, + * JointStyle.MITER, and + * JointStyle.ROUND. If a value is not + * indicated, Flash uses round joints. + * + *

For example, the following illustrations show the + * different joints settings. For each + * setting, the illustration shows an angled blue line + * with a thickness of 30(for which the + * jointStyle applies), and a superimposed + * angled black line with a thickness of 1(for which no + * jointStyle applies):

+ * + *

Note: For joints set to + * JointStyle.MITER, you can use the + * miterLimit parameter to limit the length + * of the miter.

+ * @param miterLimit (Not supported in Flash Lite 4) A number that + * indicates the limit at which a miter is cut off. Valid + * values range from 1 to 255(and values outside that + * range are rounded to 1 or 255). This value is only + * used if the jointStyle is set to + * "miter". The miterLimit + * value represents the length that a miter can extend + * beyond the point at which the lines meet to form a + * joint. The value expresses a factor of the line + * thickness. For example, with a + * miterLimit factor of 2.5 and a + * thickness of 10 pixels, the miter is cut + * off at 25 pixels. + * + *

For example, consider the following angled lines, + * each drawn with a thickness of 20, but + * with miterLimit set to 1, 2, and 4. + * Superimposed are black reference lines showing the + * meeting points of the joints:

+ * + *

Notice that a given miterLimit value + * has a specific maximum angle for which the miter is + * cut off. The following table lists some examples:

+ */ + Graphics.prototype.lineStyle = function (thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit) { + if (typeof thickness === "undefined") { thickness = 0; } + if (typeof color === "undefined") { color = 0; } + if (typeof alpha === "undefined") { alpha = 1; } + if (typeof pixelHinting === "undefined") { pixelHinting = false; } + if (typeof scaleMode === "undefined") { scaleMode = null; } + if (typeof caps === "undefined") { caps = null; } + if (typeof joints === "undefined") { joints = null; } + if (typeof miterLimit === "undefined") { miterLimit = 3; } + }; + + /** + * Draws a line using the current line style from the current drawing + * position to(x, y); the current drawing position + * is then set to(x, y). If the display object in + * which you are drawing contains content that was created with the Flash + * drawing tools, calls to the lineTo() method are drawn + * underneath the content. If you call lineTo() before any calls + * to the moveTo() method, the default position for the current + * drawing is(0, 0). If any of the parameters are missing, this + * method fails and the current drawing position is not changed. + * + * @param x A number that indicates the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number that indicates the vertical position relative to the + * registration point of the parent display object(in pixels). + */ + Graphics.prototype.lineTo = function (x, y) { + }; + + /** + * Moves the current drawing position to(x, y). If + * any of the parameters are missing, this method fails and the current + * drawing position is not changed. + * + * @param x A number that indicates the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number that indicates the vertical position relative to the + * registration point of the parent display object(in pixels). + */ + Graphics.prototype.moveTo = function (x, y) { + }; + return Graphics; +})(); + +module.exports = Graphics; + + +},{}],"awayjs-core/lib/core/base/IBitmapDrawable":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/base/IGraphicsData":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/base/IMaterialOwner":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/base/IStage":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/base/ISubMeshClass":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/base/ISubMesh":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/base/InterpolationMethod":[function(require,module,exports){ +/** +* The InterpolationMethod class provides values for the +* interpolationMethod parameter in the +* Graphics.beginGradientFill() and +* Graphics.lineGradientStyle() methods. This parameter +* determines the RGB space to use when rendering the gradient. +*/ +var InterpolationMethod = (function () { + function InterpolationMethod() { + } + InterpolationMethod.LINEAR_RGB = "linearRGB"; + + InterpolationMethod.RGB = "rgb"; + return InterpolationMethod; +})(); + +module.exports = InterpolationMethod; + + +},{}],"awayjs-core/lib/core/base/JointStyle":[function(require,module,exports){ +/** +* The JointStyle class is an enumeration of constant values that specify the +* joint style to use in drawing lines. These constants are provided for use +* as values in the joints parameter of the +* flash.display.Graphics.lineStyle() method. The method supports +* three types of joints: miter, round, and bevel, as the following example +* shows: +*/ +var JointStyle = (function () { + function JointStyle() { + } + JointStyle.BEVEL = "bevel"; + + JointStyle.MITER = "miter"; + + JointStyle.ROUND = "round"; + return JointStyle; +})(); + +module.exports = JointStyle; + + +},{}],"awayjs-core/lib/core/base/LightBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var LightEvent = require("awayjs-core/lib/events/LightEvent"); + +var LightBase = (function (_super) { + __extends(LightBase, _super); + function LightBase() { + _super.call(this); + this._color = 0xffffff; + this._colorR = 1; + this._colorG = 1; + this._colorB = 1; + this._ambientColor = 0xffffff; + this._ambient = 0; + this._iAmbientR = 0; + this._iAmbientG = 0; + this._iAmbientB = 0; + this._specular = 1; + this._iSpecularR = 1; + this._iSpecularG = 1; + this._iSpecularB = 1; + this._diffuse = 1; + this._iDiffuseR = 1; + this._iDiffuseG = 1; + this._iDiffuseB = 1; + this._castsShadows = false; + } + Object.defineProperty(LightBase.prototype, "castsShadows", { + get: function () { + return this._castsShadows; + }, + set: function (value) { + if (this._castsShadows == value) + return; + + this._castsShadows = value; + + if (value) { + if (this._shadowMapper == null) + this._shadowMapper = this.pCreateShadowMapper(); + + this._shadowMapper.light = this; + } else { + this._shadowMapper.dispose(); + this._shadowMapper = null; + } + + //*/ + this.dispatchEvent(new LightEvent(LightEvent.CASTS_SHADOW_CHANGE)); + }, + enumerable: true, + configurable: true + }); + + + LightBase.prototype.pCreateShadowMapper = function () { + throw new AbstractMethodError(); + }; + + Object.defineProperty(LightBase.prototype, "specular", { + get: function () { + return this._specular; + }, + set: function (value) { + if (value < 0) + value = 0; + + this._specular = value; + this.updateSpecular(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightBase.prototype, "diffuse", { + get: function () { + return this._diffuse; + }, + set: function (value) { + if (value < 0) + value = 0; + + this._diffuse = value; + this.updateDiffuse(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightBase.prototype, "color", { + get: function () { + return this._color; + }, + set: function (value) { + this._color = value; + this._colorR = ((this._color >> 16) & 0xff) / 0xff; + this._colorG = ((this._color >> 8) & 0xff) / 0xff; + this._colorB = (this._color & 0xff) / 0xff; + + this.updateDiffuse(); + this.updateSpecular(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightBase.prototype, "ambient", { + get: function () { + return this._ambient; + }, + set: function (value) { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + this._ambient = value; + this.updateAmbient(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightBase.prototype, "ambientColor", { + get: function () { + return this._ambientColor; + }, + set: function (value) { + this._ambientColor = value; + this.updateAmbient(); + }, + enumerable: true, + configurable: true + }); + + + LightBase.prototype.updateAmbient = function () { + this._iAmbientR = ((this._ambientColor >> 16) & 0xff) / 0xff * this._ambient; + this._iAmbientG = ((this._ambientColor >> 8) & 0xff) / 0xff * this._ambient; + this._iAmbientB = (this._ambientColor & 0xff) / 0xff * this._ambient; + }; + + LightBase.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { + if (typeof target === "undefined") { target = null; } + throw new AbstractMethodError(); + }; + + Object.defineProperty(LightBase.prototype, "assetType", { + //@override + get: function () { + return AssetType.LIGHT; + }, + enumerable: true, + configurable: true + }); + + LightBase.prototype.updateSpecular = function () { + this._iSpecularR = this._colorR * this._specular; + this._iSpecularG = this._colorG * this._specular; + this._iSpecularB = this._colorB * this._specular; + }; + + LightBase.prototype.updateDiffuse = function () { + this._iDiffuseR = this._colorR * this._diffuse; + this._iDiffuseG = this._colorG * this._diffuse; + this._iDiffuseB = this._colorB * this._diffuse; + }; + + Object.defineProperty(LightBase.prototype, "shadowMapper", { + get: function () { + return this._shadowMapper; + }, + set: function (value) { + this._shadowMapper = value; + this._shadowMapper.light = this; + }, + enumerable: true, + configurable: true + }); + + return LightBase; +})(DisplayObjectContainer); + +module.exports = LightBase; + + +},{"awayjs-core/lib/containers/DisplayObjectContainer":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/events/LightEvent":undefined}],"awayjs-core/lib/core/base/LineScaleMode":[function(require,module,exports){ +/** +* The LineScaleMode class provides values for the scaleMode +* parameter in the Graphics.lineStyle() method. +*/ +var LineScaleMode = (function () { + function LineScaleMode() { + } + LineScaleMode.HORIZONTAL = "horizontal"; + + LineScaleMode.NONE = "none"; + + LineScaleMode.NORMAL = "normal"; + + LineScaleMode.VERTICAL = "vertical"; + return LineScaleMode; +})(); + +module.exports = LineScaleMode; + + +},{}],"awayjs-core/lib/core/base/LineSubGeometry":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var LineSubMesh = require("awayjs-core/lib/core/base/LineSubMesh"); +var SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +var TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +var SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** +* @class LineSubGeometry +*/ +var LineSubGeometry = (function (_super) { + __extends(LineSubGeometry, _super); + /** + * + */ + function LineSubGeometry() { + _super.call(this, true); + this._positionsDirty = true; + this._boundingPositionDirty = true; + this._thicknessDirty = true; + this._colorsDirty = true; + + this._pSubMeshClass = LineSubMesh; + } + LineSubGeometry.prototype._pUpdateStrideOffset = function () { + this._pOffset[LineSubGeometry.VERTEX_DATA] = 0; + + var stride = 0; + this._pOffset[LineSubGeometry.START_POSITION_DATA] = stride; + stride += 3; + + this._pOffset[LineSubGeometry.END_POSITION_DATA] = stride; + stride += 3; + + this._pOffset[LineSubGeometry.THICKNESS_DATA] = stride; + stride += 1; + + this._pOffset[LineSubGeometry.COLOR_DATA] = stride; + stride += 4; + + this._pStride[LineSubGeometry.VERTEX_DATA] = stride; + this._pStride[LineSubGeometry.START_POSITION_DATA] = stride; + this._pStride[LineSubGeometry.END_POSITION_DATA] = stride; + this._pStride[LineSubGeometry.THICKNESS_DATA] = stride; + this._pStride[LineSubGeometry.COLOR_DATA] = stride; + + var len = this._pNumVertices * stride; + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + + this._pStrideOffsetDirty = false; + }; + + Object.defineProperty(LineSubGeometry.prototype, "vertices", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + if (this._thicknessDirty) + this.updateThickness(this._thickness); + + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._pVertices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "startPositions", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + return this._startPositions; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "endPositions", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + return this._endPositions; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "thickness", { + /** + * + */ + get: function () { + if (this._thicknessDirty) + this.updateThickness(this._thickness); + + return this._thickness; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "startColors", { + /** + * + */ + get: function () { + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._startColors; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "endColors", { + /** + * + */ + get: function () { + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._endColors; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "numSegments", { + /** + * The total amount of segments in the TriangleSubGeometry. + */ + get: function () { + return this._numSegments; + }, + enumerable: true, + configurable: true + }); + + LineSubGeometry.prototype.getBoundingPositions = function () { + if (this._boundingPositionDirty) + this._boundingPositions = this.startPositions.concat(this.endPositions); + + return this._boundingPositions; + }; + + /** + * + */ + LineSubGeometry.prototype.updatePositions = function (startValues, endValues) { + var i; + var j; + var values; + var index; + var stride; + var positions; + var indices; + + this._startPositions = startValues; + + if (this._startPositions == null) + this._startPositions = new Array(); + + this._endPositions = endValues; + + if (this._endPositions == null) + this._endPositions = new Array(); + + this._boundingPositionDirty = true; + + this._numSegments = this._startPositions.length / 3; + + this._pNumVertices = this._numSegments * 4; + + var lenV = this._pNumVertices * this.getStride(LineSubGeometry.VERTEX_DATA); + + if (this._pVertices == null) + this._pVertices = new Array(lenV); + else if (this._pVertices.length != lenV) + this._pVertices.length = lenV; + + i = 0; + j = 0; + index = this.getOffset(LineSubGeometry.START_POSITION_DATA); + stride = this.getStride(LineSubGeometry.START_POSITION_DATA); + positions = this._pVertices; + indices = new Array(); + + while (i < startValues.length) { + values = (index / stride & 1) ? endValues : startValues; + positions[index] = values[i]; + positions[index + 1] = values[i + 1]; + positions[index + 2] = values[i + 2]; + + values = (index / stride & 1) ? startValues : endValues; + positions[index + 3] = values[i]; + positions[index + 4] = values[i + 1]; + positions[index + 5] = values[i + 2]; + + if (++j == 4) { + var o = index / stride - 3; + indices.push(o, o + 1, o + 2, o + 3, o + 2, o + 1); + j = 0; + i += 3; + } + + index += stride; + } + + this.updateIndices(indices); + + this.pInvalidateBounds(); + + this.notifyPositionsUpdate(); + + this._positionsDirty = false; + }; + + /** + * Updates the thickness. + */ + LineSubGeometry.prototype.updateThickness = function (values) { + var i; + var j; + var index; + var offset; + var stride; + var thickness; + + this._thickness = values; + + if (values != null) { + i = 0; + j = 0; + offset = this.getOffset(LineSubGeometry.THICKNESS_DATA); + stride = this.getStride(LineSubGeometry.THICKNESS_DATA); + thickness = this._pVertices; + + index = offset; + while (i < values.length) { + thickness[index] = (Math.floor(0.5 * (index - offset) / stride + 0.5) & 1) ? -values[i] : values[i]; + + if (++j == 4) { + j = 0; + i++; + } + index += stride; + } + } + + this.notifyThicknessUpdate(); + + this._thicknessDirty = false; + }; + + /** + * + */ + LineSubGeometry.prototype.updateColors = function (startValues, endValues) { + var i; + var j; + var values; + var index; + var offset; + var stride; + var colors; + + this._startColors = startValues; + + this._endColors = endValues; + + //default to white + if (this._startColors == null) { + this._startColors = new Array(this._numSegments * 4); + + i = 0; + while (i < this._startColors.length) + this._startColors[i++] = 1; + } + + if (this._endColors == null) { + this._endColors = new Array(this._numSegments * 4); + + i = 0; + while (i < this._endColors.length) + this._endColors[i++] = 1; + } + + i = 0; + j = 0; + offset = this.getOffset(LineSubGeometry.COLOR_DATA); + stride = this.getStride(LineSubGeometry.COLOR_DATA); + colors = this._pVertices; + + index = offset; + + while (i < this._startColors.length) { + values = ((index - offset) / stride & 1) ? this._endColors : this._startColors; + colors[index] = values[i]; + colors[index + 1] = values[i + 1]; + colors[index + 2] = values[i + 2]; + colors[index + 3] = values[i + 3]; + + if (++j == 4) { + j = 0; + i += 4; + } + + index += stride; + } + + this.notifyColorsUpdate(); + + this._colorsDirty = false; + }; + + /** + * + */ + LineSubGeometry.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + this._startPositions = null; + this._endPositions = null; + this._thickness = null; + this._startColors = null; + this._endColors = null; + }; + + /** + * @protected + */ + LineSubGeometry.prototype.pInvalidateBounds = function () { + if (this.parentGeometry) + this.parentGeometry.iInvalidateBounds(this); + }; + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + LineSubGeometry.prototype.clone = function () { + var clone = new LineSubGeometry(); + clone.updateIndices(this._pIndices.concat()); + clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); + clone.updateThickness(this._thickness.concat()); + clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); + + return clone; + }; + + LineSubGeometry.prototype._pNotifyVerticesUpdate = function () { + this._pStrideOffsetDirty = true; + + this.notifyPositionsUpdate(); + this.notifyThicknessUpdate(); + this.notifyColorsUpdate(); + }; + + LineSubGeometry.prototype.notifyPositionsUpdate = function () { + if (this._positionsDirty) + return; + + this._positionsDirty = true; + + if (!this._positionsUpdated) + this._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); + + this.dispatchEvent(this._positionsUpdated); + }; + + LineSubGeometry.prototype.notifyThicknessUpdate = function () { + if (this._thicknessDirty) + return; + + this._thicknessDirty = true; + + if (!this._thicknessUpdated) + this._thicknessUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.THICKNESS_DATA); + + this.dispatchEvent(this._thicknessUpdated); + }; + + LineSubGeometry.prototype.notifyColorsUpdate = function () { + if (this._colorsDirty) + return; + + this._colorsDirty = true; + + if (!this._colorUpdated) + this._colorUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.COLOR_DATA); + + this.dispatchEvent(this._colorUpdated); + }; + LineSubGeometry.VERTEX_DATA = "vertices"; + LineSubGeometry.START_POSITION_DATA = "startPositions"; + LineSubGeometry.END_POSITION_DATA = "endPositions"; + LineSubGeometry.THICKNESS_DATA = "thickness"; + LineSubGeometry.COLOR_DATA = "colors"; + + LineSubGeometry.POSITION_FORMAT = "float3"; + LineSubGeometry.COLOR_FORMAT = "float4"; + LineSubGeometry.THICKNESS_FORMAT = "float1"; + return LineSubGeometry; +})(SubGeometryBase); + +module.exports = LineSubGeometry; + + +},{"awayjs-core/lib/core/base/LineSubMesh":undefined,"awayjs-core/lib/core/base/SubGeometryBase":undefined,"awayjs-core/lib/core/base/TriangleSubGeometry":undefined,"awayjs-core/lib/events/SubGeometryEvent":undefined}],"awayjs-core/lib/core/base/LineSubMesh":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var SubMeshBase = require("awayjs-core/lib/core/base/SubMeshBase"); +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +/** +* LineSubMesh wraps a LineSubGeometry as a scene graph instantiation. A LineSubMesh is owned by a Mesh object. +* +* +* @see away.base.LineSubGeometry +* @see away.entities.Mesh +* +* @class away.base.LineSubMesh +*/ +var LineSubMesh = (function (_super) { + __extends(LineSubMesh, _super); + /** + * Creates a new LineSubMesh object + * @param subGeometry The LineSubGeometry object which provides the geometry data for this LineSubMesh. + * @param parentMesh The Mesh object to which this LineSubMesh belongs. + * @param material An optional material used to render this LineSubMesh. + */ + function LineSubMesh(subGeometry, parentMesh, material) { + if (typeof material === "undefined") { material = null; } + _super.call(this); + + this._pParentMesh = parentMesh; + this._subGeometry = subGeometry; + this.material = material; + } + Object.defineProperty(LineSubMesh.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.LINE_SUB_MESH; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubMesh.prototype, "subGeometry", { + /** + * The LineSubGeometry object which provides the geometry data for this LineSubMesh. + */ + get: function () { + return this._subGeometry; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + LineSubMesh.prototype.dispose = function () { + this.material = null; + + _super.prototype.dispose.call(this); + }; + + LineSubMesh.prototype._iCollectRenderable = function (renderer) { + renderer.applyLineSubMesh(this); + }; + return LineSubMesh; +})(SubMeshBase); + +module.exports = LineSubMesh; + + +},{"awayjs-core/lib/core/base/SubMeshBase":undefined,"awayjs-core/lib/core/library/AssetType":undefined}],"awayjs-core/lib/core/base/LoaderInfo":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +/** +* The LoaderInfo class provides information about a loaded SWF file or a +* loaded image file(JPEG, GIF, or PNG). LoaderInfo objects are available for +* any display object. The information provided includes load progress, the +* URLs of the loader and loaded content, the number of bytes total for the +* media, and the nominal height and width of the media. +* +*

You can access LoaderInfo objects in two ways:

+* +*
    +*
  • The contentLoaderInfo property of a flash.display.Loader +* object - The contentLoaderInfo property is always available +* for any Loader object. For a Loader object that has not called the +* load() or loadBytes() method, or that has not +* sufficiently loaded, attempting to access many of the properties of the +* contentLoaderInfo property throws an error.
  • +*
  • The loaderInfo property of a display object.
  • +*
+* +*

The contentLoaderInfo property of a Loader object provides +* information about the content that the Loader object is loading, whereas +* the loaderInfo property of a DisplayObject provides +* information about the root SWF file for that display object.

+* +*

When you use a Loader object to load a display object(such as a SWF +* file or a bitmap), the loaderInfo property of the display +* object is the same as the contentLoaderInfo property of the +* Loader object(DisplayObject.loaderInfo = +* Loader.contentLoaderInfo). Because the instance of the main class of +* the SWF file has no Loader object, the loaderInfo property is +* the only way to access the LoaderInfo for the instance of the main class of +* the SWF file.

+* +*

The following diagram shows the different uses of the LoaderInfo +* object - for the instance of the main class of the SWF file, for the +* contentLoaderInfo property of a Loader object, and for the +* loaderInfo property of a loaded object:

+* +*

When a loading operation is not complete, some properties of the +* contentLoaderInfo property of a Loader object are not +* available. You can obtain some properties, such as +* bytesLoaded, bytesTotal, url, +* loaderURL, and applicationDomain. When the +* loaderInfo object dispatches the init event, you +* can access all properties of the loaderInfo object and the +* loaded image or SWF file.

+* +*

Note: All properties of LoaderInfo objects are read-only.

+* +*

The EventDispatcher.dispatchEvent() method is not +* applicable to LoaderInfo objects. If you call dispatchEvent() +* on a LoaderInfo object, an IllegalOperationError exception is thrown.

+* +* @event complete Dispatched when data has loaded successfully. In other +* words, it is dispatched when all the content has been +* downloaded and the loading has finished. The +* complete event is always dispatched after +* the init event. The init event +* is dispatched when the object is ready to access, though +* the content may still be downloading. +* @event httpStatus Dispatched when a network request is made over HTTP and +* an HTTP status code can be detected. +* @event init Dispatched when the properties and methods of a loaded +* SWF file are accessible and ready for use. The content, +* however, can still be downloading. A LoaderInfo object +* dispatches the init event when the following +* conditions exist: +*
    +*
  • All properties and methods associated with the +* loaded object and those associated with the LoaderInfo +* object are accessible.
  • +*
  • The constructors for all child objects have +* completed.
  • +*
  • All ActionScript code in the first frame of the +* loaded SWF's main timeline has been executed.
  • +*
+* +*

For example, an Event.INIT is dispatched +* when the first frame of a movie or animation is loaded. +* The movie is then accessible and can be added to the +* display list. The complete movie, however, can take +* longer to download. The Event.COMPLETE is +* only dispatched once the full movie is loaded.

+* +*

The init event always precedes the +* complete event.

+* @event ioError Dispatched when an input or output error occurs that +* causes a load operation to fail. +* @event open Dispatched when a load operation starts. +* @event progress Dispatched when data is received as the download +* operation progresses. +* @event unload Dispatched by a LoaderInfo object whenever a loaded +* object is removed by using the unload() +* method of the Loader object, or when a second load is +* performed by the same Loader object and the original +* content is removed prior to the load beginning. +*/ +var LoaderInfo = (function (_super) { + __extends(LoaderInfo, _super); + function LoaderInfo() { + _super.apply(this, arguments); + } + Object.defineProperty(LoaderInfo.prototype, "bytes", { + /** + * The bytes associated with a LoaderInfo object. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the loaded object due to security + * restrictions. This situation can occur, for + * instance, when a Loader object attempts to access + * the contentLoaderInfo.content property + * and it is not granted security permission to access + * the loaded content. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + get: function () { + return this._bytes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "bytesLoaded", { + /** + * The number of bytes that are loaded for the media. When this number equals + * the value of bytesTotal, all of the bytes are loaded. + */ + get: function () { + return this._bytesLoaded; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "bytesTotal", { + /** + * The number of compressed bytes in the entire media file. + * + *

Before the first progress event is dispatched by this + * LoaderInfo object's corresponding Loader object, bytesTotal + * is 0. After the first progress event from the Loader object, + * bytesTotal reflects the actual number of bytes to be + * downloaded.

+ */ + get: function () { + return this._bytesTotal; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "content", { + /** + * The loaded object associated with this LoaderInfo object. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the loaded object due to security + * restrictions. This situation can occur, for + * instance, when a Loader object attempts to access + * the contentLoaderInfo.content property + * and it is not granted security permission to access + * the loaded content. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + get: function () { + return this._content; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "contentType", { + /** + * The MIME type of the loaded file. The value is null if not + * enough of the file has loaded in order to determine the type. The + * following list gives the possible values: + *
    + *
  • "application/x-shockwave-flash"
  • + *
  • "image/jpeg"
  • + *
  • "image/gif"
  • + *
  • "image/png"
  • + *
+ */ + get: function () { + return this._contentType; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "loader", { + /** + * The Loader object associated with this LoaderInfo object. If this + * LoaderInfo object is the loaderInfo property of the instance + * of the main class of the SWF file, no Loader object is associated. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the Loader object because of security + * restrictions. This can occur, for instance, when a + * loaded SWF file attempts to access its + * loaderInfo.loader property and it is + * not granted security permission to access the + * loading SWF file. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + get: function () { + return this._loader; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "url", { + /** + * The URL of the media being loaded. + * + *

Before the first progress event is dispatched by this + * LoaderInfo object's corresponding Loader object, the value of the + * url property might reflect only the initial URL specified in + * the call to the load() method of the Loader object. After the + * first progress event, the url property reflects + * the media's final URL, after any redirects and relative URLs are + * resolved.

+ * + *

In some cases, the value of the url property is truncated; + * see the isURLInaccessible property for details.

+ */ + get: function () { + return this._url; + }, + enumerable: true, + configurable: true + }); + return LoaderInfo; +})(EventDispatcher); + +module.exports = LoaderInfo; + + +},{"awayjs-core/lib/events/EventDispatcher":undefined}],"awayjs-core/lib/core/base/OrientationMode":[function(require,module,exports){ +var OrientationMode = (function () { + function OrientationMode() { + } + OrientationMode.DEFAULT = "default"; + + OrientationMode.CAMERA_PLANE = "cameraPlane"; + + OrientationMode.CAMERA_POSITION = "cameraPosition"; + return OrientationMode; +})(); + +module.exports = OrientationMode; + + +},{}],"awayjs-core/lib/core/base/PixelSnapping":[function(require,module,exports){ +/** +* The PixelSnapping class is an enumeration of constant values for setting +* the pixel snapping options by using the pixelSnapping property +* of a Bitmap object. +*/ +var PixelSnapping = (function () { + function PixelSnapping() { + } + PixelSnapping.ALWAYS = "always"; + + PixelSnapping.AUTO = "auto"; + + PixelSnapping.NEVER = "never"; + return PixelSnapping; +})(); + +module.exports = PixelSnapping; + + +},{}],"awayjs-core/lib/core/base/SpreadMethod":[function(require,module,exports){ +/** +* The SpreadMethod class provides values for the spreadMethod +* parameter in the beginGradientFill() and +* lineGradientStyle() methods of the Graphics class. +* +*

The following example shows the same gradient fill using various spread +* methods:

+*/ +var SpreadMethod = (function () { + function SpreadMethod() { + } + SpreadMethod.PAD = "pad"; + + SpreadMethod.REFLECT = "reflect"; + + SpreadMethod.REPEAT = "repeat"; + return SpreadMethod; +})(); + +module.exports = SpreadMethod; + + +},{}],"awayjs-core/lib/core/base/SubGeometryBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** +* @class away.base.TriangleSubGeometry +*/ +var SubGeometryBase = (function (_super) { + __extends(SubGeometryBase, _super); + /** + * + */ + function SubGeometryBase(concatenatedArrays) { + _super.call(this); + this._pStrideOffsetDirty = true; + this._pConcatenateArrays = true; + this._pStride = new Object(); + this._pOffset = new Object(); + + this._pConcatenateArrays = concatenatedArrays; + } + SubGeometryBase.prototype._pUpdateStrideOffset = function () { + throw new AbstractMethodError(); + }; + + Object.defineProperty(SubGeometryBase.prototype, "subMeshClass", { + get: function () { + return this._pSubMeshClass; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubGeometryBase.prototype, "concatenateArrays", { + /** + * + */ + get: function () { + return this._pConcatenateArrays; + }, + set: function (value) { + if (this._pConcatenateArrays == value) + return; + + this._pConcatenateArrays = value; + + this._pStrideOffsetDirty = true; + + if (value) + this._pNotifyVerticesUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(SubGeometryBase.prototype, "indices", { + /** + * The raw index data that define the faces. + */ + get: function () { + return this._pIndices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubGeometryBase.prototype, "vertices", { + /** + * + */ + get: function () { + this.updateVertices(); + + return this._pVertices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubGeometryBase.prototype, "numTriangles", { + /** + * The total amount of triangles in the TriangleSubGeometry. + */ + get: function () { + return this._numTriangles; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubGeometryBase.prototype, "numVertices", { + get: function () { + return this._pNumVertices; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + SubGeometryBase.prototype.getStride = function (dataType) { + if (this._pStrideOffsetDirty) + this._pUpdateStrideOffset(); + + return this._pStride[dataType]; + }; + + /** + * + */ + SubGeometryBase.prototype.getOffset = function (dataType) { + if (this._pStrideOffsetDirty) + this._pUpdateStrideOffset(); + + return this._pOffset[dataType]; + }; + + SubGeometryBase.prototype.updateVertices = function () { + throw new AbstractMethodError(); + }; + + /** + * + */ + SubGeometryBase.prototype.dispose = function () { + this._pIndices = null; + this._pVertices = null; + }; + + /** + * Updates the face indices of the TriangleSubGeometry. + * + * @param indices The face indices to upload. + */ + SubGeometryBase.prototype.updateIndices = function (indices) { + this._pIndices = indices; + this._numIndices = indices.length; + + this._numTriangles = this._numIndices / 3; + + this.notifyIndicesUpdate(); + }; + + /** + * @protected + */ + SubGeometryBase.prototype.pInvalidateBounds = function () { + if (this.parentGeometry) + this.parentGeometry.iInvalidateBounds(this); + }; + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + SubGeometryBase.prototype.clone = function () { + throw new AbstractMethodError(); + }; + + SubGeometryBase.prototype.applyTransformation = function (transform) { + }; + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + SubGeometryBase.prototype.scale = function (scale) { + }; + + SubGeometryBase.prototype.scaleUV = function (scaleU, scaleV) { + if (typeof scaleU === "undefined") { scaleU = 1; } + if (typeof scaleV === "undefined") { scaleV = 1; } + }; + + SubGeometryBase.prototype.getBoundingPositions = function () { + throw new AbstractMethodError(); + }; + + SubGeometryBase.prototype.notifyIndicesUpdate = function () { + if (!this._indicesUpdated) + this._indicesUpdated = new SubGeometryEvent(SubGeometryEvent.INDICES_UPDATED); + + this.dispatchEvent(this._indicesUpdated); + }; + + SubGeometryBase.prototype._pNotifyVerticesUpdate = function () { + throw new AbstractMethodError(); + }; + SubGeometryBase.VERTEX_DATA = "vertices"; + return SubGeometryBase; +})(NamedAssetBase); + +module.exports = SubGeometryBase; + + +},{"awayjs-core/lib/core/library/NamedAssetBase":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/events/SubGeometryEvent":undefined}],"awayjs-core/lib/core/base/SubMeshBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +/** +* SubMeshBase wraps a TriangleSubGeometry as a scene graph instantiation. A SubMeshBase is owned by a Mesh object. +* +* +* @see away.base.TriangleSubGeometry +* @see away.entities.Mesh +* +* @class away.base.SubMeshBase +*/ +var SubMeshBase = (function (_super) { + __extends(SubMeshBase, _super); + /** + * Creates a new SubMeshBase object + */ + function SubMeshBase() { + _super.call(this); + this._iIndex = 0; + this._renderables = new Array(); + } + Object.defineProperty(SubMeshBase.prototype, "animator", { + //TODO test shader picking + // public get shaderPickingDetails():boolean + // { + // + // return this.sourceEntity.shaderPickingDetails; + // } + /** + * The animator object that provides the state for the TriangleSubMesh's animation. + */ + get: function () { + return this._pParentMesh.animator; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubMeshBase.prototype, "material", { + /** + * The material used to render the current TriangleSubMesh. If set to null, its parent Mesh's material will be used instead. + */ + get: function () { + return this._material || this._pParentMesh.material; + }, + set: function (value) { + if (this.material) + this.material.iRemoveOwner(this); + + this._material = value; + + if (this.material) + this.material.iAddOwner(this); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(SubMeshBase.prototype, "sceneTransform", { + /** + * The scene transform object that transforms from model to world space. + */ + get: function () { + return this._pParentMesh.sceneTransform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubMeshBase.prototype, "parentMesh", { + /** + * The entity that that initially provided the IRenderable to the render pipeline (ie: the owning Mesh object). + */ + get: function () { + return this._pParentMesh; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubMeshBase.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform || this._pParentMesh.uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * + */ + SubMeshBase.prototype.dispose = function () { + this.material = null; + + var len = this._renderables.length; + for (var i = 0; i < len; i++) + this._renderables[i].dispose(); + }; + + /** + * + * @param camera + * @returns {away.geom.Matrix3D} + */ + SubMeshBase.prototype.getRenderSceneTransform = function (camera) { + return this._pParentMesh.getRenderSceneTransform(camera); + }; + + SubMeshBase.prototype._iAddRenderable = function (renderable) { + this._renderables.push(renderable); + + return renderable; + }; + + SubMeshBase.prototype._iRemoveRenderable = function (renderable) { + var index = this._renderables.indexOf(renderable); + + this._renderables.splice(index, 1); + + return renderable; + }; + + SubMeshBase.prototype._iInvalidateRenderableGeometry = function () { + var len = this._renderables.length; + for (var i = 0; i < len; i++) + this._renderables[i].invalidateGeometry(); + }; + + SubMeshBase.prototype._iCollectRenderable = function (renderer) { + throw new AbstractMethodError(); + }; + + SubMeshBase.prototype._iGetExplicitMaterial = function () { + return this._material; + }; + return SubMeshBase; +})(NamedAssetBase); + +module.exports = SubMeshBase; + + +},{"awayjs-core/lib/core/library/NamedAssetBase":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined}],"awayjs-core/lib/core/base/TriangleCulling":[function(require,module,exports){ +/** +* Defines codes for culling algorithms that determine which triangles not to +* render when drawing triangle paths. +* +*

The terms POSITIVE and NEGATIVE refer to the +* sign of a triangle's normal along the z-axis. The normal is a 3D vector +* that is perpendicular to the surface of the triangle.

+* +*

A triangle whose vertices 0, 1, and 2 are arranged in a clockwise order +* has a positive normal value. That is, its normal points in a positive +* z-axis direction, away from the current view point. When the +* TriangleCulling.POSITIVE algorithm is used, triangles with +* positive normals are not rendered. Another term for this is backface +* culling.

+* +*

A triangle whose vertices are arranged in a counter-clockwise order has +* a negative normal value. That is, its normal points in a negative z-axis +* direction, toward the current view point. When the +* TriangleCulling.NEGATIVE algorithm is used, triangles with +* negative normals will not be rendered.

+*/ +var TriangleCulling = (function () { + function TriangleCulling() { + } + TriangleCulling.NEGATIVE = "negative"; + + TriangleCulling.NONE = "none"; + + TriangleCulling.POSITIVE = "positive"; + return TriangleCulling; +})(); + +module.exports = TriangleCulling; + + +},{}],"awayjs-core/lib/core/base/TriangleSubGeometry":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +var TriangleSubMesh = require("awayjs-core/lib/core/base/TriangleSubMesh"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** +* @class away.base.TriangleSubGeometry +*/ +var TriangleSubGeometry = (function (_super) { + __extends(TriangleSubGeometry, _super); + /** + * + */ + function TriangleSubGeometry(concatenatedArrays) { + _super.call(this, concatenatedArrays); + this._positionsDirty = true; + this._faceNormalsDirty = true; + this._faceTangentsDirty = true; + this._vertexNormalsDirty = true; + this._vertexTangentsDirty = true; + this._uvsDirty = true; + this._secondaryUVsDirty = true; + this._jointIndicesDirty = true; + this._jointWeightsDirty = true; + this._concatenateArrays = true; + this._autoDeriveNormals = true; + this._autoDeriveTangents = true; + this._autoDeriveUVs = false; + this._useFaceWeights = false; + this._scaleU = 1; + this._scaleV = 1; + + this._pSubMeshClass = TriangleSubMesh; + } + Object.defineProperty(TriangleSubGeometry.prototype, "scaleU", { + /** + * + */ + get: function () { + return this._scaleU; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "scaleV", { + /** + * + */ + get: function () { + return this._scaleV; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "useCondensedIndices", { + /** + * Offers the option of enabling GPU accelerated animation on skeletons larger than 32 joints + * by condensing the number of joint index values required per mesh. Only applicable to + * skeleton animations that utilise more than one mesh object. Defaults to false. + */ + get: function () { + return this._useCondensedIndices; + }, + set: function (value) { + if (this._useCondensedIndices == value) + return; + + this._useCondensedIndices = value; + + this.notifyJointIndicesUpdate(); + }, + enumerable: true, + configurable: true + }); + + + TriangleSubGeometry.prototype._pUpdateStrideOffset = function () { + if (this._concatenateArrays) { + this._pOffset[TriangleSubGeometry.VERTEX_DATA] = 0; + + //always have positions + this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; + var stride = 3; + + if (this._vertexNormals != null) { + this._pOffset[TriangleSubGeometry.NORMAL_DATA] = stride; + stride += 3; + } + + if (this._vertexTangents != null) { + this._pOffset[TriangleSubGeometry.TANGENT_DATA] = stride; + stride += 3; + } + + if (this._uvs != null) { + this._pOffset[TriangleSubGeometry.UV_DATA] = stride; + stride += 2; + } + + if (this._secondaryUVs != null) { + this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; + stride += 2; + } + + if (this._jointIndices != null) { + this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; + stride += this._jointsPerVertex; + } + + if (this._jointWeights != null) { + this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; + stride += this._jointsPerVertex; + } + + this._pStride[TriangleSubGeometry.VERTEX_DATA] = stride; + this._pStride[TriangleSubGeometry.POSITION_DATA] = stride; + this._pStride[TriangleSubGeometry.NORMAL_DATA] = stride; + this._pStride[TriangleSubGeometry.TANGENT_DATA] = stride; + this._pStride[TriangleSubGeometry.UV_DATA] = stride; + this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; + this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; + this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; + + var len = this._pNumVertices * stride; + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + } else { + this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; + this._pOffset[TriangleSubGeometry.NORMAL_DATA] = 0; + this._pOffset[TriangleSubGeometry.TANGENT_DATA] = 0; + this._pOffset[TriangleSubGeometry.UV_DATA] = 0; + this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = 0; + this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = 0; + this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = 0; + + this._pStride[TriangleSubGeometry.POSITION_DATA] = 3; + this._pStride[TriangleSubGeometry.NORMAL_DATA] = 3; + this._pStride[TriangleSubGeometry.TANGENT_DATA] = 3; + this._pStride[TriangleSubGeometry.UV_DATA] = 2; + this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = 2; + this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = this._jointsPerVertex; + this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = this._jointsPerVertex; + } + + this._pStrideOffsetDirty = false; + }; + + Object.defineProperty(TriangleSubGeometry.prototype, "jointsPerVertex", { + /** + * + */ + get: function () { + return this._jointsPerVertex; + }, + set: function (value) { + if (this._jointsPerVertex == value) + return; + + this._jointsPerVertex = value; + + this._pStrideOffsetDirty = true; + + if (this._pConcatenateArrays) + this._pNotifyVerticesUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveUVs", { + /** + * Defines whether a UV buffer should be automatically generated to contain dummy UV coordinates. + * Set to true if a geometry lacks UV data but uses a material that requires it, or leave as false + * in cases where UV data is explicitly defined or the material does not require UV data. + */ + get: function () { + return this._autoDeriveUVs; + }, + set: function (value) { + if (this._autoDeriveUVs == value) + return; + + this._autoDeriveUVs = value; + + if (value) + this.notifyUVsUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveNormals", { + /** + * True if the vertex normals should be derived from the geometry, false if the vertex normals are set + * explicitly. + */ + get: function () { + return this._autoDeriveNormals; + }, + set: function (value) { + if (this._autoDeriveNormals == value) + return; + + this._autoDeriveNormals = value; + + if (value) + this.notifyNormalsUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveTangents", { + /** + * True if the vertex tangents should be derived from the geometry, false if the vertex normals are set + * explicitly. + */ + get: function () { + return this._autoDeriveTangents; + }, + set: function (value) { + if (this._autoDeriveTangents == value) + return; + + this._autoDeriveTangents = value; + + if (value) + this.notifyTangentsUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "vertices", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._positions); + + if (this._vertexNormalsDirty) + this.updateVertexNormals(this._vertexNormals); + + if (this._vertexTangentsDirty) + this.updateVertexTangents(this._vertexTangents); + + if (this._uvsDirty) + this.updateUVs(this._uvs); + + if (this._secondaryUVsDirty) + this.updateSecondaryUVs(this._secondaryUVs); + + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + if (this._jointWeightsDirty) + this.updateJointWeights(this._jointWeights); + + return this._pVertices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "positions", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._positions); + + return this._positions; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "vertexNormals", { + /** + * + */ + get: function () { + if (this._vertexNormalsDirty) + this.updateVertexNormals(this._vertexNormals); + + return this._vertexNormals; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "vertexTangents", { + /** + * + */ + get: function () { + if (this._vertexTangentsDirty) + this.updateVertexTangents(this._vertexTangents); + + return this._vertexTangents; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "faceNormals", { + /** + * The raw data of the face normals, in the same order as the faces are listed in the index list. + */ + get: function () { + if (this._faceNormalsDirty) + this.updateFaceNormals(); + + return this._faceNormals; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "faceTangents", { + /** + * The raw data of the face tangets, in the same order as the faces are listed in the index list. + */ + get: function () { + if (this._faceTangentsDirty) + this.updateFaceTangents(); + + return this._faceTangents; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "uvs", { + /** + * + */ + get: function () { + if (this._uvsDirty) + this.updateUVs(this._uvs); + + return this._uvs; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "secondaryUVs", { + /** + * + */ + get: function () { + if (this._secondaryUVsDirty) + this.updateSecondaryUVs(this._secondaryUVs); + + return this._secondaryUVs; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "jointIndices", { + /** + * + */ + get: function () { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + if (this._useCondensedIndices) + return this._condensedJointIndices; + + return this._jointIndices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "jointWeights", { + /** + * + */ + get: function () { + if (this._jointWeightsDirty) + this.updateJointWeights(this._jointWeights); + + return this._jointWeights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "useFaceWeights", { + /** + * Indicates whether or not to take the size of faces into account when auto-deriving vertex normals and tangents. + */ + get: function () { + return this._useFaceWeights; + }, + set: function (value) { + if (this._useFaceWeights == value) + return; + + this._useFaceWeights = value; + + if (this._autoDeriveNormals) + this.notifyNormalsUpdate(); + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + this._faceNormalsDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "numCondensedJoints", { + get: function () { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + return this._numCondensedJoints; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "condensedIndexLookUp", { + get: function () { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + return this._condensedIndexLookUp; + }, + enumerable: true, + configurable: true + }); + + TriangleSubGeometry.prototype.getBoundingPositions = function () { + if (this._positionsDirty) + this.updatePositions(this._positions); + + return this._positions; + }; + + /** + * + */ + TriangleSubGeometry.prototype.updatePositions = function (values) { + var i; + var index; + var stride; + var positions; + + this._positions = values; + + if (this._positions == null) + this._positions = new Array(); + + this._pNumVertices = this._positions.length / 3; + + if (this._concatenateArrays) { + var len = this._pNumVertices * this.getStride(TriangleSubGeometry.VERTEX_DATA); + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + + i = 0; + index = this.getOffset(TriangleSubGeometry.POSITION_DATA); + stride = this.getStride(TriangleSubGeometry.POSITION_DATA); + positions = this._pVertices; + + while (i < values.length) { + positions[index] = values[i++]; + positions[index + 1] = values[i++]; + positions[index + 2] = values[i++]; + index += stride; + } + } + + if (this._autoDeriveNormals) + this.notifyNormalsUpdate(); + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + if (this._autoDeriveUVs) + this.notifyUVsUpdate(); + + this.pInvalidateBounds(); + + this.notifyPositionsUpdate(); + + this._positionsDirty = false; + }; + + /** + * Updates the vertex normals based on the geometry. + */ + TriangleSubGeometry.prototype.updateVertexNormals = function (values) { + var i; + var index; + var offset; + var stride; + var normals; + + if (!this._autoDeriveNormals) { + if ((this._vertexNormals == null || values == null) && (this._vertexNormals != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + this._vertexNormals = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); + normals = this._pVertices; + + while (i < values.length) { + normals[index] = values[i++]; + normals[index + 1] = values[i++]; + normals[index + 2] = values[i++]; + index += stride; + } + } + } else { + if (this._vertexNormals == null) { + this._vertexNormals = new Array(this._positions.length); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + if (this._faceNormalsDirty) + this.updateFaceNormals(); + + offset = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); + + //autoderived normals + normals = this._concatenateArrays ? this._pVertices : this._vertexNormals; + + var f1 = 0; + var f2 = 1; + var f3 = 2; + + index = offset; + + //clear normal values + var lenV = normals.length; + while (index < lenV) { + normals[index] = 0; + normals[index + 1] = 0; + normals[index + 2] = 0; + index += stride; + } + + var k = 0; + var lenI = this._pIndices.length; + var weight; + + i = 0; + + while (i < lenI) { + weight = this._useFaceWeights ? this._faceWeights[k++] : 1; + index = offset + this._pIndices[i++] * stride; + normals[index] += this._faceNormals[f1] * weight; + normals[index + 1] += this._faceNormals[f2] * weight; + normals[index + 2] += this._faceNormals[f3] * weight; + index = offset + this._pIndices[i++] * stride; + normals[index] += this._faceNormals[f1] * weight; + normals[index + 1] += this._faceNormals[f2] * weight; + normals[index + 2] += this._faceNormals[f3] * weight; + index = offset + this._pIndices[i++] * stride; + normals[index] += this._faceNormals[f1] * weight; + normals[index + 1] += this._faceNormals[f2] * weight; + normals[index + 2] += this._faceNormals[f3] * weight; + f1 += 3; + f2 += 3; + f3 += 3; + } + + i = 0; + index = offset; + + while (index < lenV) { + var vx = normals[index]; + var vy = normals[index + 1]; + var vz = normals[index + 2]; + var d = 1.0 / Math.sqrt(vx * vx + vy * vy + vz * vz); + + if (this._concatenateArrays) { + this._vertexNormals[i++] = normals[index] = vx * d; + this._vertexNormals[i++] = normals[index + 1] = vy * d; + this._vertexNormals[i++] = normals[index + 2] = vz * d; + } else { + normals[index] = vx * d; + normals[index + 1] = vy * d; + normals[index + 2] = vz * d; + } + + index += stride; + } + } + + this.notifyNormalsUpdate(); + + this._vertexNormalsDirty = false; + }; + + /** + * Updates the vertex tangents based on the geometry. + */ + TriangleSubGeometry.prototype.updateVertexTangents = function (values) { + var i; + var index; + var offset; + var stride; + var tangents; + + if (!this._autoDeriveTangents) { + if ((this._vertexTangents == null || values == null) && (this._vertexTangents != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + this._vertexTangents = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); + tangents = this._pVertices; + + while (i < values.length) { + tangents[index] = values[i++]; + tangents[index + 1] = values[i++]; + tangents[index + 2] = values[i++]; + index += stride; + } + } + } else { + if (this._vertexTangents == null) { + this._vertexTangents = new Array(this._positions.length); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + if (this._faceTangentsDirty) + this.updateFaceTangents(); + + offset = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); + + //autoderived tangents + tangents = this._concatenateArrays ? this._pVertices : this._vertexTangents; + + index = offset; + + //clear tangent values + var lenV = tangents.length; + while (index < lenV) { + tangents[index] = 0; + tangents[index + 1] = 0; + tangents[index + 2] = 0; + + index += stride; + } + + var k = 0; + var weight; + var f1 = 0; + var f2 = 1; + var f3 = 2; + + i = 0; + + //collect face tangents + var lenI = this._pIndices.length; + while (i < lenI) { + weight = this._useFaceWeights ? this._faceWeights[k++] : 1; + index = offset + this._pIndices[i++] * stride; + tangents[index++] += this._faceTangents[f1] * weight; + tangents[index++] += this._faceTangents[f2] * weight; + tangents[index] += this._faceTangents[f3] * weight; + index = offset + this._pIndices[i++] * stride; + tangents[index++] += this._faceTangents[f1] * weight; + tangents[index++] += this._faceTangents[f2] * weight; + tangents[index] += this._faceTangents[f3] * weight; + index = offset + this._pIndices[i++] * stride; + tangents[index++] += this._faceTangents[f1] * weight; + tangents[index++] += this._faceTangents[f2] * weight; + tangents[index] += this._faceTangents[f3] * weight; + f1 += 3; + f2 += 3; + f3 += 3; + } + + i = 0; + index = offset; + + while (index < lenV) { + var vx = tangents[index]; + var vy = tangents[index + 1]; + var vz = tangents[index + 2]; + var d = 1.0 / Math.sqrt(vx * vx + vy * vy + vz * vz); + + if (this._concatenateArrays) { + this._vertexTangents[i++] = tangents[index] = vx * d; + this._vertexTangents[i++] = tangents[index + 1] = vy * d; + this._vertexTangents[i++] = tangents[index + 2] = vz * d; + } else { + tangents[index] = vx * d; + tangents[index + 1] = vy * d; + tangents[index + 2] = vz * d; + } + + index += stride; + } + } + + this.notifyTangentsUpdate(); + + this._vertexTangentsDirty = false; + }; + + /** + * Updates the uvs based on the geometry. + */ + TriangleSubGeometry.prototype.updateUVs = function (values) { + var i; + var index; + var offset; + var stride; + var uvs; + + if (!this._autoDeriveUVs) { + if ((this._uvs == null || values == null) && (this._uvs != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + this._uvs = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.UV_DATA); + stride = this.getStride(TriangleSubGeometry.UV_DATA); + uvs = this._pVertices; + + while (i < values.length) { + uvs[index] = values[i++]; + uvs[index + 1] = values[i++]; + index += stride; + } + } + } else { + if (this._uvs == null) { + this._uvs = new Array(this._positions.length * 2 / 3); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + offset = this.getOffset(TriangleSubGeometry.UV_DATA); + stride = this.getStride(TriangleSubGeometry.UV_DATA); + + //autoderived uvs + uvs = this._concatenateArrays ? this._pVertices : this._uvs; + + i = 0; + index = offset; + var uvIdx = 0; + + //clear uv values + var lenV = uvs.length; + while (index < lenV) { + if (this._concatenateArrays) { + this._uvs[i++] = uvs[index] = uvIdx * .5; + this._uvs[i++] = uvs[index + 1] = 1.0 - (uvIdx & 1); + } else { + uvs[index] = uvIdx * .5; + uvs[index + 1] = 1.0 - (uvIdx & 1); + } + + if (++uvIdx == 3) + uvIdx = 0; + + index += stride; + } + } + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + this.notifyUVsUpdate(); + + this._uvsDirty = false; + }; + + /** + * Updates the secondary uvs based on the geometry. + */ + TriangleSubGeometry.prototype.updateSecondaryUVs = function (values) { + var i; + var index; + var offset; + var stride; + var uvs; + + if (this._concatenateArrays && (this._secondaryUVs == null || values == null) && (this._secondaryUVs != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._secondaryUVs = values; + + if (values != null && this._concatenateArrays) { + offset = this.getOffset(TriangleSubGeometry.SECONDARY_UV_DATA); + stride = this.getStride(TriangleSubGeometry.SECONDARY_UV_DATA); + + i = 0; + index = offset; + uvs = this._pVertices; + + while (i < values.length) { + uvs[index] = values[i++]; + uvs[index + 1] = values[i++]; + index += stride; + } + } + + this.notifySecondaryUVsUpdate(); + + this._secondaryUVsDirty = false; + }; + + /** + * Updates the joint indices + */ + TriangleSubGeometry.prototype.updateJointIndices = function (values) { + var i; + var j; + var index; + var offset; + var stride; + var jointIndices; + + if (this._concatenateArrays && (this._jointIndices == null || values == null) && (this._jointIndices != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._jointIndices = values; + + if (values != null) { + offset = this.getOffset(TriangleSubGeometry.JOINT_INDEX_DATA); + stride = this.getStride(TriangleSubGeometry.JOINT_INDEX_DATA); + if (this._useCondensedIndices) { + i = 0; + j = 0; + index = offset; + jointIndices = this._concatenateArrays ? this._pVertices : this._condensedJointIndices; + var oldIndex; + var newIndex = 0; + var dic = new Object(); + + if (!this._concatenateArrays) + this._condensedJointIndices = new Array(values.length); + + this._condensedIndexLookUp = new Array(); + + while (i < values.length) { + for (j = 0; j < this._jointsPerVertex; j++) { + oldIndex = values[i++]; + + // if we encounter a new index, assign it a new condensed index + if (dic[oldIndex] == undefined) { + dic[oldIndex] = newIndex * 3; //3 required for the three vectors that store the matrix + this._condensedIndexLookUp[newIndex++] = oldIndex; + } + jointIndices[index + j] = dic[oldIndex]; + } + index += stride; + } + this._numCondensedJoints = newIndex; + } else if (this._concatenateArrays) { + i = 0; + index = offset; + jointIndices = this._pVertices; + + while (i < values.length) { + j = 0; + while (j < this._jointsPerVertex) + jointIndices[index + j++] = values[i++]; + index += stride; + } + } + } + + this.notifyJointIndicesUpdate(); + + this._jointIndicesDirty = false; + }; + + /** + * Updates the joint weights. + */ + TriangleSubGeometry.prototype.updateJointWeights = function (values) { + var i; + var j; + var index; + var offset; + var stride; + var jointWeights; + + if (this._concatenateArrays && (this._jointWeights == null || values == null) && (this._jointWeights != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._jointWeights = values; + + if (values != null && this._concatenateArrays) { + offset = this.getOffset(TriangleSubGeometry.JOINT_WEIGHT_DATA); + stride = this.getStride(TriangleSubGeometry.JOINT_WEIGHT_DATA); + + i = 0; + index = offset; + jointWeights = this._pVertices; + + while (i < values.length) { + j = 0; + while (j < this._jointsPerVertex) + jointWeights[index + j++] = values[i++]; + index += stride; + } + } + + this.notifyJointWeightsUpdate(); + + this._jointWeightsDirty = false; + }; + + /** + * + */ + TriangleSubGeometry.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + this._positions = null; + this._vertexNormals = null; + this._vertexTangents = null; + this._uvs = null; + this._secondaryUVs = null; + this._jointIndices = null; + this._jointWeights = null; + + this._faceNormals = null; + this._faceWeights = null; + this._faceTangents = null; + }; + + /** + * Updates the face indices of the TriangleSubGeometry. + * + * @param indices The face indices to upload. + */ + TriangleSubGeometry.prototype.updateIndices = function (indices) { + _super.prototype.updateIndices.call(this, indices); + + this._faceNormalsDirty = true; + + if (this._autoDeriveNormals) + this._vertexNormalsDirty = true; + + if (this._autoDeriveTangents) + this._vertexTangentsDirty = true; + + if (this._autoDeriveUVs) + this._uvsDirty = true; + }; + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + TriangleSubGeometry.prototype.clone = function () { + var clone = new TriangleSubGeometry(this._concatenateArrays); + clone.updateIndices(this._pIndices.concat()); + clone.updatePositions(this._positions.concat()); + + if (this._vertexNormals && !this._autoDeriveNormals) + clone.updateVertexNormals(this._vertexNormals.concat()); + else + clone.updateVertexNormals(null); + + if (this._uvs && !this._autoDeriveUVs) + clone.updateUVs(this._uvs.concat()); + else + clone.updateUVs(null); + + if (this._vertexTangents && !this._autoDeriveTangents) + clone.updateVertexTangents(this._vertexTangents.concat()); + else + clone.updateVertexTangents(null); + + if (this._secondaryUVs) + clone.updateSecondaryUVs(this._secondaryUVs.concat()); + + if (this._jointIndices) { + clone.jointsPerVertex = this._jointsPerVertex; + clone.updateJointIndices(this._jointIndices.concat()); + } + + if (this._jointWeights) + clone.updateJointWeights(this._jointWeights.concat()); + + return clone; + }; + + TriangleSubGeometry.prototype.scaleUV = function (scaleU, scaleV) { + if (typeof scaleU === "undefined") { scaleU = 1; } + if (typeof scaleV === "undefined") { scaleV = 1; } + var index; + var offset; + var stride; + var uvs; + + uvs = this._uvs; + + var ratioU = scaleU / this._scaleU; + var ratioV = scaleV / this._scaleV; + + this._scaleU = scaleU; + this._scaleV = scaleV; + + var len = uvs.length; + + offset = 0; + stride = 2; + + index = offset; + + while (index < len) { + uvs[index] *= ratioU; + uvs[index + 1] *= ratioV; + index += stride; + } + + this.notifyUVsUpdate(); + }; + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + TriangleSubGeometry.prototype.scale = function (scale) { + var i; + var index; + var offset; + var stride; + var positions; + + positions = this._positions; + + var len = positions.length; + + offset = 0; + stride = 3; + + i = 0; + index = offset; + while (i < len) { + positions[index] *= scale; + positions[index + 1] *= scale; + positions[index + 2] *= scale; + + i += 3; + index += stride; + } + + this.notifyPositionsUpdate(); + }; + + TriangleSubGeometry.prototype.applyTransformation = function (transform) { + var positions; + var normals; + var tangents; + + if (this._concatenateArrays) { + positions = this._pVertices; + normals = this._pVertices; + tangents = this._pVertices; + } else { + positions = this._positions; + normals = this._vertexNormals; + tangents = this._vertexTangents; + } + + var len = this._positions.length / 3; + var i; + var i1; + var i2; + var vector = new Vector3D(); + + var bakeNormals = this._vertexNormals != null; + var bakeTangents = this._vertexTangents != null; + var invTranspose; + + if (bakeNormals || bakeTangents) { + invTranspose = transform.clone(); + invTranspose.invert(); + invTranspose.transpose(); + } + + var vi0 = this.getOffset(TriangleSubGeometry.POSITION_DATA); + var ni0 = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + var ti0 = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + + var vStride = this.getStride(TriangleSubGeometry.POSITION_DATA); + var nStride = this.getStride(TriangleSubGeometry.NORMAL_DATA); + var tStride = this.getStride(TriangleSubGeometry.TANGENT_DATA); + + for (i = 0; i < len; ++i) { + i1 = vi0 + 1; + i2 = vi0 + 2; + + // bake position + vector.x = positions[vi0]; + vector.y = positions[i1]; + vector.z = positions[i2]; + vector = transform.transformVector(vector); + positions[vi0] = vector.x; + positions[i1] = vector.y; + positions[i2] = vector.z; + vi0 += vStride; + + // bake normal + if (bakeNormals) { + i1 = ni0 + 1; + i2 = ni0 + 2; + vector.x = normals[ni0]; + vector.y = normals[i1]; + vector.z = normals[i2]; + vector = invTranspose.deltaTransformVector(vector); + vector.normalize(); + normals[ni0] = vector.x; + normals[i1] = vector.y; + normals[i2] = vector.z; + ni0 += nStride; + } + + // bake tangent + if (bakeTangents) { + i1 = ti0 + 1; + i2 = ti0 + 2; + vector.x = tangents[ti0]; + vector.y = tangents[i1]; + vector.z = tangents[i2]; + vector = invTranspose.deltaTransformVector(vector); + vector.normalize(); + tangents[ti0] = vector.x; + tangents[i1] = vector.y; + tangents[i2] = vector.z; + ti0 += tStride; + } + } + + this.notifyPositionsUpdate(); + this.notifyNormalsUpdate(); + this.notifyTangentsUpdate(); + }; + + /** + * Updates the tangents for each face. + */ + TriangleSubGeometry.prototype.updateFaceTangents = function () { + var i = 0; + var index1; + var index2; + var index3; + var vi; + var v0; + var dv1; + var dv2; + var denom; + var x0, y0, z0; + var dx1, dy1, dz1; + var dx2, dy2, dz2; + var cx, cy, cz; + + var positions = this._positions; + var uvs = this._uvs; + + var len = this._pIndices.length; + + if (this._faceTangents == null) + this._faceTangents = new Array(len); + + while (i < len) { + index1 = this._pIndices[i]; + index2 = this._pIndices[i + 1]; + index3 = this._pIndices[i + 2]; + + v0 = uvs[index1 * 2 + 1]; + dv1 = uvs[index2 * 2 + 1] - v0; + dv2 = uvs[index3 * 2 + 1] - v0; + + vi = index1 * 3; + x0 = positions[vi]; + y0 = positions[vi + 1]; + z0 = positions[vi + 2]; + vi = index2 * 3; + dx1 = positions[vi] - x0; + dy1 = positions[vi + 1] - y0; + dz1 = positions[vi + 2] - z0; + vi = index3 * 3; + dx2 = positions[vi] - x0; + dy2 = positions[vi + 1] - y0; + dz2 = positions[vi + 2] - z0; + + cx = dv2 * dx1 - dv1 * dx2; + cy = dv2 * dy1 - dv1 * dy2; + cz = dv2 * dz1 - dv1 * dz2; + denom = 1 / Math.sqrt(cx * cx + cy * cy + cz * cz); + + this._faceTangents[i++] = denom * cx; + this._faceTangents[i++] = denom * cy; + this._faceTangents[i++] = denom * cz; + } + + this._faceTangentsDirty = false; + }; + + /** + * Updates the normals for each face. + */ + TriangleSubGeometry.prototype.updateFaceNormals = function () { + var i = 0; + var j = 0; + var k = 0; + var index; + var offset; + var stride; + + var x1, x2, x3; + var y1, y2, y3; + var z1, z2, z3; + var dx1, dy1, dz1; + var dx2, dy2, dz2; + var cx, cy, cz; + var d; + + var positions = this._positions; + + var len = this._pIndices.length; + + if (this._faceNormals == null) + this._faceNormals = new Array(len); + + if (this._useFaceWeights && this._faceWeights == null) + this._faceWeights = new Array(len / 3); + + while (i < len) { + index = this._pIndices[i++] * 3; + x1 = positions[index]; + y1 = positions[index + 1]; + z1 = positions[index + 2]; + index = this._pIndices[i++] * 3; + x2 = positions[index]; + y2 = positions[index + 1]; + z2 = positions[index + 2]; + index = this._pIndices[i++] * 3; + x3 = positions[index]; + y3 = positions[index + 1]; + z3 = positions[index + 2]; + dx1 = x3 - x1; + dy1 = y3 - y1; + dz1 = z3 - z1; + dx2 = x2 - x1; + dy2 = y2 - y1; + dz2 = z2 - z1; + cx = dz1 * dy2 - dy1 * dz2; + cy = dx1 * dz2 - dz1 * dx2; + cz = dy1 * dx2 - dx1 * dy2; + d = Math.sqrt(cx * cx + cy * cy + cz * cz); + + // length of cross product = 2*triangle area + if (this._useFaceWeights) { + var w = d * 10000; + + if (w < 1) + w = 1; + + this._faceWeights[k++] = w; + } + + d = 1 / d; + + this._faceNormals[j++] = cx * d; + this._faceNormals[j++] = cy * d; + this._faceNormals[j++] = cz * d; + } + + this._faceNormalsDirty = false; + }; + + TriangleSubGeometry.prototype._pNotifyVerticesUpdate = function () { + this._pStrideOffsetDirty = true; + + this.notifyPositionsUpdate(); + this.notifyNormalsUpdate(); + this.notifyTangentsUpdate(); + this.notifyUVsUpdate(); + this.notifySecondaryUVsUpdate(); + this.notifyJointIndicesUpdate(); + this.notifyJointWeightsUpdate(); + }; + + TriangleSubGeometry.prototype.notifyPositionsUpdate = function () { + if (this._positionsDirty) + return; + + this._positionsDirty = true; + + if (!this._positionsUpdated) + this._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); + + this.dispatchEvent(this._positionsUpdated); + }; + + TriangleSubGeometry.prototype.notifyNormalsUpdate = function () { + if (this._vertexNormalsDirty) + return; + + this._vertexNormalsDirty = true; + + if (!this._normalsUpdated) + this._normalsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.NORMAL_DATA); + + this.dispatchEvent(this._normalsUpdated); + }; + + TriangleSubGeometry.prototype.notifyTangentsUpdate = function () { + if (this._vertexTangentsDirty) + return; + + this._vertexTangentsDirty = true; + + if (!this._tangentsUpdated) + this._tangentsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.TANGENT_DATA); + + this.dispatchEvent(this._tangentsUpdated); + }; + + TriangleSubGeometry.prototype.notifyUVsUpdate = function () { + if (this._uvsDirty) + return; + + this._uvsDirty = true; + + if (!this._uvsUpdated) + this._uvsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.UV_DATA); + + this.dispatchEvent(this._uvsUpdated); + }; + + TriangleSubGeometry.prototype.notifySecondaryUVsUpdate = function () { + if (this._secondaryUVsDirty) + return; + + this._secondaryUVsDirty = true; + + if (!this._secondaryUVsUpdated) + this._secondaryUVsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.SECONDARY_UV_DATA); + + this.dispatchEvent(this._secondaryUVsUpdated); + }; + + TriangleSubGeometry.prototype.notifyJointIndicesUpdate = function () { + if (this._jointIndicesDirty) + return; + + this._jointIndicesDirty = true; + + if (!this._jointIndicesUpdated) + this._jointIndicesUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_INDEX_DATA); + + this.dispatchEvent(this._jointIndicesUpdated); + }; + + TriangleSubGeometry.prototype.notifyJointWeightsUpdate = function () { + if (this._jointWeightsDirty) + return; + + this._jointWeightsDirty = true; + + if (!this._jointWeightsUpdated) + this._jointWeightsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_WEIGHT_DATA); + + this.dispatchEvent(this._jointWeightsUpdated); + }; + TriangleSubGeometry.POSITION_DATA = "positions"; + TriangleSubGeometry.NORMAL_DATA = "vertexNormals"; + TriangleSubGeometry.TANGENT_DATA = "vertexTangents"; + TriangleSubGeometry.UV_DATA = "uvs"; + TriangleSubGeometry.SECONDARY_UV_DATA = "secondaryUVs"; + TriangleSubGeometry.JOINT_INDEX_DATA = "jointIndices"; + TriangleSubGeometry.JOINT_WEIGHT_DATA = "jointWeights"; + + TriangleSubGeometry.POSITION_FORMAT = "float3"; + TriangleSubGeometry.NORMAL_FORMAT = "float3"; + TriangleSubGeometry.TANGENT_FORMAT = "float3"; + TriangleSubGeometry.UV_FORMAT = "float2"; + TriangleSubGeometry.SECONDARY_UV_FORMAT = "float2"; + return TriangleSubGeometry; +})(SubGeometryBase); + +module.exports = TriangleSubGeometry; + + +},{"awayjs-core/lib/core/base/SubGeometryBase":undefined,"awayjs-core/lib/core/base/TriangleSubMesh":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/events/SubGeometryEvent":undefined}],"awayjs-core/lib/core/base/TriangleSubMesh":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var SubMeshBase = require("awayjs-core/lib/core/base/SubMeshBase"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +/** +* TriangleSubMesh wraps a TriangleSubGeometry as a scene graph instantiation. A TriangleSubMesh is owned by a Mesh object. +* +* +* @see away.base.TriangleSubGeometry +* @see away.entities.Mesh +* +* @class away.base.TriangleSubMesh +*/ +var TriangleSubMesh = (function (_super) { + __extends(TriangleSubMesh, _super); + /** + * Creates a new TriangleSubMesh object + * @param subGeometry The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. + * @param parentMesh The Mesh object to which this TriangleSubMesh belongs. + * @param material An optional material used to render this TriangleSubMesh. + */ + function TriangleSubMesh(subGeometry, parentMesh, material) { + if (typeof material === "undefined") { material = null; } + _super.call(this); + + this._pParentMesh = parentMesh; + this._subGeometry = subGeometry; + this.material = material; + } + Object.defineProperty(TriangleSubMesh.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.TRIANGLE_SUB_MESH; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubMesh.prototype, "subGeometry", { + /** + * The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. + */ + get: function () { + return this._subGeometry; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + TriangleSubMesh.prototype.dispose = function () { + _super.prototype.dispose.call(this); + }; + + TriangleSubMesh.prototype._iCollectRenderable = function (renderer) { + renderer.applyTriangleSubMesh(this); + }; + return TriangleSubMesh; +})(SubMeshBase); + +module.exports = TriangleSubMesh; + + +},{"awayjs-core/lib/core/base/SubMeshBase":undefined,"awayjs-core/lib/core/library/AssetType":undefined}],"awayjs-core/lib/core/display/ContextMode":[function(require,module,exports){ +var ContextMode = (function () { + function ContextMode() { + } + ContextMode.AUTO = "auto"; + ContextMode.WEBGL = "webgl"; + ContextMode.FLASH = "flash"; + ContextMode.NATIVE = "native"; + return ContextMode; +})(); + +module.exports = ContextMode; + + +},{}],"awayjs-core/lib/core/display/IContext":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/geom/Box":[function(require,module,exports){ +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* A Box object is an area defined by its position, as indicated by its +* top-left-front corner point(x, y, z) and by its width, +* height and depth. +* +* +*

The x, y, z, width, +* height depth properties of the Box class are +* independent of each other; changing the value of one property has no effect +* on the others. However, the right, bottom and +* back properties are integrally related to those six +* properties. For example, if you change the value of the right +* property, the value of the width property changes; if you +* change the bottom property, the value of the +* height property changes.

+* +*

The following methods and properties use Box objects:

+* +*
    +*
  • The bounds property of the DisplayObject class
  • +*
+* +*

You can use the new Box() constructor to create a +* Box object.

+* +*

Note: The Box class does not define a cubic Shape +* display object. +*/ +var Box = (function () { + /** + * Creates a new Box object with the top-left-front corner specified by the + * x, y and z parameters and with the + * specified width, height and depth + * parameters. If you call this public without parameters, a box with + * x, y, z, width, + * height and depth properties set to 0 is created. + * + * @param x The x coordinate of the top-left-front corner of the + * box. + * @param y The y coordinate of the top-left-front corner of the + * box. + * @param z The z coordinate of the top-left-front corner of the + * box. + * @param width The width of the box, in pixels. + * @param height The height of the box, in pixels. + * @param depth The depth of the box, in pixels. + */ + function Box(x, y, z, width, height, depth) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof z === "undefined") { z = 0; } + if (typeof width === "undefined") { width = 0; } + if (typeof height === "undefined") { height = 0; } + if (typeof depth === "undefined") { depth = 0; } + this.x = x; + this.y = y; + this.z = z; + this.width = width; + this.height = height; + this.depth = depth; + } + Object.defineProperty(Box.prototype, "back", { + /** + * The sum of the z and height properties. + */ + get: function () { + return this.z + this.depth; + }, + set: function (val) { + this.depth = val - this.z; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "bottom", { + /** + * The sum of the y and height properties. + */ + get: function () { + return this.y + this.height; + }, + set: function (val) { + this.height = val - this.y; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "bottomRightBack", { + /** + * The location of the Box object's bottom-right corner, determined by the + * values of the right and bottom properties. + */ + get: function () { + if (this._bottomRightBack == null) + this._bottomRightBack = new Vector3D(); + + this._bottomRightBack.x = this.x + this.width; + this._bottomRightBack.y = this.y + this.height; + this._bottomRightBack.z = this.z + this.depth; + + return this._bottomRightBack; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Box.prototype, "front", { + /** + * The z coordinate of the top-left-front corner of the box. Changing + * the front property of a Box object has no effect on the + * x, y, width and height + * properties. However it does affect the depth property, + * whereas changing the z value does not affect the + * depth property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + get: function () { + return this.z; + }, + set: function (val) { + this.depth += this.z - val; + this.z = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "left", { + /** + * The x coordinate of the top-left corner of the box. Changing the + * left property of a Box object has no effect on the + * y and height properties. However it does affect + * the width property, whereas changing the x value + * does not affect the width property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + get: function () { + return this.x; + }, + set: function (val) { + this.width += this.x - val; + this.x = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "right", { + /** + * The sum of the x and width properties. + */ + get: function () { + return this.x + this.width; + }, + set: function (val) { + this.width = val - this.x; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "size", { + /** + * The size of the Box object, expressed as a Vector3D object with the + * values of the width, height and + * depth properties. + */ + get: function () { + if (this._size == null) + this._size = new Vector3D(); + + this._size.x = this.width; + this._size.y = this.height; + this._size.z = this.depth; + + return this._size; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Box.prototype, "top", { + /** + * The y coordinate of the top-left-front corner of the box. Changing + * the top property of a Box object has no effect on the + * x and width properties. However it does affect + * the height property, whereas changing the y + * value does not affect the height property. + * + *

The value of the top property is equal to the value of the + * y property.

+ */ + get: function () { + return this.y; + }, + set: function (val) { + this.height += (this.y - val); + this.y = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "topLeftFront", { + /** + * The location of the Box object's top-left-front corner, determined by the + * x, y and z coordinates of the point. + */ + get: function () { + if (this._topLeftFront == null) + this._topLeftFront = new Vector3D(); + + this._topLeftFront.x = this.x; + this._topLeftFront.y = this.y; + this._topLeftFront.z = this.z; + + return this._topLeftFront; + }, + enumerable: true, + configurable: true + }); + + /** + * Returns a new Box object with the same values for the x, + * y, z, width, height + * and depth properties as the original Box object. + * + * @return A new Box object with the same values for the x, + * y, z, width, + * height and depth properties as the + * original Box object. + */ + Box.prototype.clone = function () { + return new Box(this.x, this.y, this.z, this.width, this.height, this.depth); + }; + + /** + * Determines whether the specified position is contained within the cubic + * region defined by this Box object. + * + * @param x The x coordinate(horizontal component) of the position. + * @param y The y coordinate(vertical component) of the position. + * @param z The z coordinate(longitudinal component) of the position. + * @return A value of true if the Box object contains the + * specified position; otherwise false. + */ + Box.prototype.contains = function (x, y, z) { + return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y && this.z <= z && this.z + this.depth >= z); + }; + + /** + * Determines whether the specified position is contained within the cubic + * region defined by this Box object. This method is similar to the + * Box.contains() method, except that it takes a Vector3D + * object as a parameter. + * + * @param position The position, as represented by its x, y and + * z coordinates. + * @return A value of true if the Box object contains the + * specified position; otherwise false. + */ + Box.prototype.containsPoint = function (position) { + return (this.x <= position.x && this.x + this.width >= position.x && this.y <= position.y && this.y + this.height >= position.y && this.z <= position.z && this.z + this.depth >= position.z); + }; + + /** + * Determines whether the Box object specified by the box + * parameter is contained within this Box object. A Box object is said to + * contain another if the second Box object falls entirely within the + * boundaries of the first. + * + * @param box The Box object being checked. + * @return A value of true if the Box object that you specify + * is contained by this Box object; otherwise false. + */ + Box.prototype.containsRect = function (box) { + return (this.x <= box.x && this.x + this.width >= box.x + box.width && this.y <= box.y && this.y + this.height >= box.y + box.height && this.z <= box.z && this.z + this.depth >= box.z + box.depth); + }; + + /** + * Copies all of box data from the source Box object into the calling + * Box object. + * + * @param sourceBox The Box object from which to copy the data. + */ + Box.prototype.copyFrom = function (sourceBox) { + //TODO + }; + + /** + * Determines whether the object specified in the toCompare + * parameter is equal to this Box object. This method compares the + * x, y, z, width, + * height and depth properties of an object against + * the same properties of this Box object. + * + * @param toCompare The box to compare to this Box object. + * @return A value of true if the object has exactly the same + * values for the x, y, z, + * width, height and depth + * properties as this Box object; otherwise false. + */ + Box.prototype.equals = function (toCompare) { + return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && this.width == toCompare.width && this.height == toCompare.height && this.depth == toCompare.depth); + }; + + /** + * Increases the size of the Box object by the specified amounts, in + * pixels. The center point of the Box object stays the same, and its + * size increases to the left and right by the dx value, to + * the top and the bottom by the dy value, and to + * the front and the back by the dz value. + * + * @param dx The value to be added to the left and the right of the Box + * object. The following equation is used to calculate the new + * width and position of the box: + * @param dy The value to be added to the top and the bottom of the Box + * object. The following equation is used to calculate the new + * height and position of the box: + * @param dz The value to be added to the front and the back of the Box + * object. The following equation is used to calculate the new + * depth and position of the box: + */ + Box.prototype.inflate = function (dx, dy, dz) { + this.x -= dx / 2; + this.y -= dy / 2; + this.z -= dz / 2; + this.width += dx / 2; + this.height += dy / 2; + this.depth += dz / 2; + }; + + /** + * Increases the size of the Box object. This method is similar to the + * Box.inflate() method except it takes a Vector3D object as + * a parameter. + * + *

The following two code examples give the same result:

+ * + * @param delta The x property of this Vector3D object is used to + * increase the horizontal dimension of the Box object. + * The y property is used to increase the vertical + * dimension of the Box object. + * The z property is used to increase the + * longitudinal dimension of the Box object. + */ + Box.prototype.inflatePoint = function (delta) { + this.x -= delta.x / 2; + this.y -= delta.y / 2; + this.z -= delta.z / 2; + this.width += delta.x / 2; + this.height += delta.y / 2; + this.depth += delta.z / 2; + }; + + /** + * If the Box object specified in the toIntersect parameter + * intersects with this Box object, returns the area of intersection + * as a Box object. If the boxes do not intersect, this method returns an + * empty Box object with its properties set to 0. + * + * @param toIntersect The Box object to compare against to see if it + * intersects with this Box object. + * @return A Box object that equals the area of intersection. If the + * boxes do not intersect, this method returns an empty Box + * object; that is, a box with its x, y, + * z, width, height, and + * depth properties set to 0. + */ + Box.prototype.intersection = function (toIntersect) { + if (this.intersects(toIntersect)) { + var i = new Box(); + + if (this.x > toIntersect.x) { + i.x = this.x; + i.width = toIntersect.x - this.x + toIntersect.width; + + if (i.width > this.width) + i.width = this.width; + } else { + i.x = toIntersect.x; + i.width = this.x - toIntersect.x + this.width; + + if (i.width > toIntersect.width) + i.width = toIntersect.width; + } + + if (this.y > toIntersect.y) { + i.y = this.y; + i.height = toIntersect.y - this.y + toIntersect.height; + + if (i.height > this.height) + i.height = this.height; + } else { + i.y = toIntersect.y; + i.height = this.y - toIntersect.y + this.height; + + if (i.height > toIntersect.height) + i.height = toIntersect.height; + } + + if (this.z > toIntersect.z) { + i.z = this.z; + i.depth = toIntersect.z - this.z + toIntersect.depth; + + if (i.depth > this.depth) + i.depth = this.depth; + } else { + i.z = toIntersect.z; + i.depth = this.z - toIntersect.z + this.depth; + + if (i.depth > toIntersect.depth) + i.depth = toIntersect.depth; + } + + return i; + } + + return new Box(); + }; + + /** + * Determines whether the object specified in the toIntersect + * parameter intersects with this Box object. This method checks the + * x, y, z, width, + * height, and depth properties of the specified + * Box object to see if it intersects with this Box object. + * + * @param toIntersect The Box object to compare against this Box object. + * @return A value of true if the specified object intersects + * with this Box object; otherwise false. + */ + Box.prototype.intersects = function (toIntersect) { + return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height && this.z + this.depth > toIntersect.z && this.z < toIntersect.z + toIntersect.depth); + }; + + /** + * Determines whether or not this Box object is empty. + * + * @return A value of true if the Box object's width, height or + * depth is less than or equal to 0; otherwise false. + */ + Box.prototype.isEmpty = function () { + return (this.x == 0 && this.y == 0 && this.z == 0 && this.width == 0 && this.height == 0 && this.depth == 0); + }; + + /** + * Adjusts the location of the Box object, as determined by its + * top-left-front corner, by the specified amounts. + * + * @param dx Moves the x value of the Box object by this amount. + * @param dy Moves the y value of the Box object by this amount. + * @param dz Moves the z value of the Box object by this amount. + */ + Box.prototype.offset = function (dx, dy, dz) { + this.x += dx; + this.y += dy; + this.z += dz; + }; + + /** + * Adjusts the location of the Box object using a Vector3D object as a + * parameter. This method is similar to the Box.offset() + * method, except that it takes a Vector3D object as a parameter. + * + * @param position A Vector3D object to use to offset this Box object. + */ + Box.prototype.offsetPosition = function (position) { + this.x += position.x; + this.y += position.y; + this.z += position.z; + }; + + /** + * Sets all of the Box object's properties to 0. A Box object is empty if its + * width, height or depth is less than or equal to 0. + * + *

This method sets the values of the x, y, + * z, width, height, and + * depth properties to 0.

+ * + */ + Box.prototype.setEmpty = function () { + this.x = 0; + this.y = 0; + this.z = 0; + this.width = 0; + this.height = 0; + this.depth = 0; + }; + + /** + * Sets the members of Box to the specified values + * + * @param xa The x coordinate of the top-left-front corner of the + * box. + * @param ya The y coordinate of the top-left-front corner of the + * box. + * @param yz The z coordinate of the top-left-front corner of the + * box. + * @param widtha The width of the box, in pixels. + * @param heighta The height of the box, in pixels. + * @param deptha The depth of the box, in pixels. + */ + Box.prototype.setTo = function (xa, ya, za, widtha, heighta, deptha) { + this.x = xa; + this.y = ya; + this.z = za; + this.width = widtha; + this.height = heighta; + this.depth = deptha; + }; + + /** + * Builds and returns a string that lists the horizontal, vertical and + * longitudinal positions and the width, height and depth of the Box object. + * + * @return A string listing the value of each of the following properties of + * the Box object: x, y, z, + * width, height, and depth. + */ + Box.prototype.toString = function () { + return "[Box] (x=" + this.x + ", y=" + this.y + ", z=" + this.z + ", width=" + this.width + ", height=" + this.height + ", depth=" + this.depth + ")"; + }; + + /** + * Adds two boxes together to create a new Box object, by filling + * in the horizontal, vertical and longitudinal space between the two boxes. + * + *

Note: The union() method ignores boxes with + * 0 as the height, width or depth value, such as: var + * box2:Box = new Box(300,300,300,50,50,0);

+ * + * @param toUnion A Box object to add to this Box object. + * @return A new Box object that is the union of the two boxes. + */ + Box.prototype.union = function (toUnion) { + var u = new Box(); + + if (this.x < toUnion.x) { + u.x = this.x; + u.width = toUnion.x - this.x + toUnion.width; + + if (u.width < this.width) + u.width = this.width; + } else { + u.x = toUnion.x; + u.width = this.x - toUnion.x + this.width; + + if (u.width < toUnion.width) + u.width = toUnion.width; + } + + if (this.y < toUnion.y) { + u.y = this.y; + u.height = toUnion.y - this.y + toUnion.height; + + if (u.height < this.height) + u.height = this.height; + } else { + u.y = toUnion.y; + u.height = this.y - toUnion.y + this.height; + + if (u.height < toUnion.height) + u.height = toUnion.height; + } + + if (this.z < toUnion.z) { + u.z = this.z; + u.depth = toUnion.z - this.z + toUnion.depth; + + if (u.depth < this.depth) + u.depth = this.depth; + } else { + u.z = toUnion.z; + u.depth = this.z - toUnion.z + this.depth; + + if (u.depth < toUnion.depth) + u.depth = toUnion.depth; + } + + return u; + }; + return Box; +})(); + +module.exports = Box; + + +},{"awayjs-core/lib/core/geom/Vector3D":undefined}],"awayjs-core/lib/core/geom/ColorTransform":[function(require,module,exports){ +var ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +/** +* The ColorTransform class lets you adjust the color values in a display +* object. The color adjustment or color transformation can be applied +* to all four channels: red, green, blue, and alpha transparency. +* +*

When a ColorTransform object is applied to a display object, a new value +* for each color channel is calculated like this:

+* +*
    +*
  • New red value = (old red value * redMultiplier) + +* redOffset
  • +*
  • New green value = (old green value * greenMultiplier) + +* greenOffset
  • +*
  • New blue value = (old blue value * blueMultiplier) + +* blueOffset
  • +*
  • New alpha value = (old alpha value * alphaMultiplier) + +* alphaOffset
  • +*
+* +*

If any of the color channel values is greater than 255 after the +* calculation, it is set to 255. If it is less than 0, it is set to 0.

+* +*

You can use ColorTransform objects in the following ways:

+* +*
    +*
  • In the colorTransform parameter of the +* colorTransform() method of the BitmapData class
  • +*
  • As the colorTransform property of a Transform object +* (which can be used as the transform property of a display +* object)
  • +*
+* +*

You must use the new ColorTransform() constructor to create +* a ColorTransform object before you can call the methods of the +* ColorTransform object.

+* +*

Color transformations do not apply to the background color of a movie +* clip(such as a loaded SWF object). They apply only to graphics and symbols +* that are attached to the movie clip.

+*/ +var ColorTransform = (function () { + /** + * Creates a ColorTransform object for a display object with the specified + * color channel values and alpha values. + * + * @param redMultiplier The value for the red multiplier, in the range from + * 0 to 1. + * @param greenMultiplier The value for the green multiplier, in the range + * from 0 to 1. + * @param blueMultiplier The value for the blue multiplier, in the range + * from 0 to 1. + * @param alphaMultiplier The value for the alpha transparency multiplier, in + * the range from 0 to 1. + * @param redOffset The offset value for the red color channel, in the + * range from -255 to 255. + * @param greenOffset The offset value for the green color channel, in + * the range from -255 to 255. + * @param blueOffset The offset for the blue color channel value, in the + * range from -255 to 255. + * @param alphaOffset The offset for alpha transparency channel value, in + * the range from -255 to 255. + */ + function ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier, redOffset, greenOffset, blueOffset, alphaOffset) { + if (typeof redMultiplier === "undefined") { redMultiplier = 1; } + if (typeof greenMultiplier === "undefined") { greenMultiplier = 1; } + if (typeof blueMultiplier === "undefined") { blueMultiplier = 1; } + if (typeof alphaMultiplier === "undefined") { alphaMultiplier = 1; } + if (typeof redOffset === "undefined") { redOffset = 0; } + if (typeof greenOffset === "undefined") { greenOffset = 0; } + if (typeof blueOffset === "undefined") { blueOffset = 0; } + if (typeof alphaOffset === "undefined") { alphaOffset = 0; } + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaMultiplier = alphaMultiplier; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + this.alphaOffset = alphaOffset; + } + Object.defineProperty(ColorTransform.prototype, "color", { + /** + * The RGB color value for a ColorTransform object. + * + *

When you set this property, it changes the three color offset values + * (redOffset, greenOffset, and + * blueOffset) accordingly, and it sets the three color + * multiplier values(redMultiplier, + * greenMultiplier, and blueMultiplier) to 0. The + * alpha transparency multiplier and offset values do not change.

+ * + *

When you pass a value for this property, use the format + * 0xRRGGBB. RR, GG, and BB each consist of two + * hexadecimal digits that specify the offset of each color component. The 0x + * tells the ActionScript compiler that the number is a hexadecimal + * value.

+ */ + get: function () { + return ((this.redOffset << 16) | (this.greenOffset << 8) | this.blueOffset); + }, + set: function (value) { + var argb = ColorUtils.float32ColorToARGB(value); + + this.redOffset = argb[1]; //(value >> 16) & 0xFF; + this.greenOffset = argb[2]; //(value >> 8) & 0xFF; + this.blueOffset = argb[3]; //value & 0xFF; + + this.redMultiplier = 0; + this.greenMultiplier = 0; + this.blueMultiplier = 0; + }, + enumerable: true, + configurable: true + }); + + + /** + * Concatenates the ColorTranform object specified by the second + * parameter with the current ColorTransform object and sets the current + * object as the result, which is an additive combination of the two color + * transformations. When you apply the concatenated ColorTransform object, + * the effect is the same as applying the second color + * transformation after the original color transformation. + * + * @param second The ColorTransform object to be combined with the current + * ColorTransform object. + */ + ColorTransform.prototype.concat = function (second) { + this.redMultiplier += second.redMultiplier; + this.greenMultiplier += second.greenMultiplier; + this.blueMultiplier += second.blueMultiplier; + this.alphaMultiplier += second.alphaMultiplier; + }; + return ColorTransform; +})(); + +module.exports = ColorTransform; + + +},{"awayjs-core/lib/utils/ColorUtils":undefined}],"awayjs-core/lib/core/geom/MathConsts":[function(require,module,exports){ +/** +* MathConsts provides some commonly used mathematical constants +*/ +var MathConsts = (function () { + function MathConsts() { + } + MathConsts.RADIANS_TO_DEGREES = 180 / Math.PI; + + MathConsts.DEGREES_TO_RADIANS = Math.PI / 180; + return MathConsts; +})(); + +module.exports = MathConsts; + + +},{}],"awayjs-core/lib/core/geom/Matrix3DUtils":[function(require,module,exports){ +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* away.geom.Matrix3DUtils provides additional Matrix3D functions. +*/ +var Matrix3DUtils = (function () { + function Matrix3DUtils() { + } + /** + * Fills the 3d matrix object with values representing the transformation made by the given quaternion. + * + * @param quarternion The quarterion object to convert. + */ + Matrix3DUtils.quaternion2matrix = function (quarternion, m) { + if (typeof m === "undefined") { m = null; } + var x = quarternion.x; + var y = quarternion.y; + var z = quarternion.z; + var w = quarternion.w; + + var xx = x * x; + var xy = x * y; + var xz = x * z; + var xw = x * w; + + var yy = y * y; + var yz = y * z; + var yw = y * w; + + var zz = z * z; + var zw = z * w; + + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + raw[0] = 1 - 2 * (yy + zz); + raw[1] = 2 * (xy + zw); + raw[2] = 2 * (xz - yw); + raw[4] = 2 * (xy - zw); + raw[5] = 1 - 2 * (xx + zz); + raw[6] = 2 * (yz + xw); + raw[8] = 2 * (xz + yw); + raw[9] = 2 * (yz - xw); + raw[10] = 1 - 2 * (xx + yy); + raw[3] = raw[7] = raw[11] = raw[12] = raw[13] = raw[14] = 0; + raw[15] = 1; + + if (m) { + m.copyRawDataFrom(raw); + return m; + } else + return new Matrix3D(raw); + }; + + /** + * Returns a normalised Vector3D object representing the forward vector of the given matrix. + * @param m The Matrix3D object to use to get the forward vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The forward vector + */ + Matrix3DUtils.getForward = function (m, v) { + if (typeof v === "undefined") { v = null; } + //v ||= new Vector3D(0.0, 0.0, 0.0); + if (v === null) { + v = new Vector3D(0.0, 0.0, 0.0); + } + + m.copyColumnTo(2, v); + v.normalize(); + + return v; + }; + + /** + * Returns a normalised Vector3D object representing the up vector of the given matrix. + * @param m The Matrix3D object to use to get the up vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The up vector + */ + Matrix3DUtils.getUp = function (m, v) { + //v ||= new Vector3D(0.0, 0.0, 0.0); + if (typeof v === "undefined") { v = null; } + if (v === null) { + v = new Vector3D(0.0, 0.0, 0.0); + } + + m.copyColumnTo(1, v); + v.normalize(); + + return v; + }; + + /** + * Returns a normalised Vector3D object representing the right vector of the given matrix. + * @param m The Matrix3D object to use to get the right vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The right vector + */ + Matrix3DUtils.getRight = function (m, v) { + if (typeof v === "undefined") { v = null; } + //v ||= new Vector3D(0.0, 0.0, 0.0); + if (v === null) { + v = new Vector3D(0.0, 0.0, 0.0); + } + + m.copyColumnTo(0, v); + v.normalize(); + + return v; + }; + + /** + * Returns a boolean value representing whether there is any significant difference between the two given 3d matrices. + */ + Matrix3DUtils.compare = function (m1, m2) { + var r1 = Matrix3DUtils.RAW_DATA_CONTAINER; + var r2 = m2.rawData; + m1.copyRawDataTo(r1); + + for (var i = 0; i < 16; ++i) { + if (r1[i] != r2[i]) + return false; + } + + return true; + }; + + Matrix3DUtils.lookAt = function (matrix, pos, dir, up) { + var dirN; + var upN; + var lftN; + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + + lftN = dir.crossProduct(up); + lftN.normalize(); + + upN = lftN.crossProduct(dir); + upN.normalize(); + dirN = dir.clone(); + dirN.normalize(); + + raw[0] = lftN.x; + raw[1] = upN.x; + raw[2] = -dirN.x; + raw[3] = 0.0; + + raw[4] = lftN.y; + raw[5] = upN.y; + raw[6] = -dirN.y; + raw[7] = 0.0; + + raw[8] = lftN.z; + raw[9] = upN.z; + raw[10] = -dirN.z; + raw[11] = 0.0; + + raw[12] = -lftN.dotProduct(pos); + raw[13] = -upN.dotProduct(pos); + raw[14] = dirN.dotProduct(pos); + raw[15] = 1.0; + + matrix.copyRawDataFrom(raw); + }; + + Matrix3DUtils.reflection = function (plane, target) { + if (typeof target === "undefined") { target = null; } + if (target === null) + target = new Matrix3D(); + + var a = plane.a, b = plane.b, c = plane.c, d = plane.d; + var rawData = Matrix3DUtils.RAW_DATA_CONTAINER; + var ab2 = -2 * a * b; + var ac2 = -2 * a * c; + var bc2 = -2 * b * c; + + // reflection matrix + rawData[0] = 1 - 2 * a * a; + rawData[4] = ab2; + rawData[8] = ac2; + rawData[12] = -2 * a * d; + rawData[1] = ab2; + rawData[5] = 1 - 2 * b * b; + rawData[9] = bc2; + rawData[13] = -2 * b * d; + rawData[2] = ac2; + rawData[6] = bc2; + rawData[10] = 1 - 2 * c * c; + rawData[14] = -2 * c * d; + rawData[3] = 0; + rawData[7] = 0; + rawData[11] = 0; + rawData[15] = 1; + target.copyRawDataFrom(rawData); + + return target; + }; + + Matrix3DUtils.transformVector = function (matrix, vector, result) { + if (typeof result === "undefined") { result = null; } + if (!result) + result = new Vector3D(); + + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a = raw[0]; + var e = raw[1]; + var i = raw[2]; + var m = raw[3]; + var b = raw[4]; + var f = raw[5]; + var j = raw[6]; + var n = raw[7]; + var c = raw[8]; + var g = raw[9]; + var k = raw[10]; + var o = raw[11]; + var d = raw[12]; + var h = raw[13]; + var l = raw[14]; + var p = raw[15]; + + var x = vector.x; + var y = vector.y; + var z = vector.z; + result.x = a * x + b * y + c * z + d; + result.y = e * x + f * y + g * z + h; + result.z = i * x + j * y + k * z + l; + result.w = m * x + n * y + o * z + p; + return result; + }; + + Matrix3DUtils.deltaTransformVector = function (matrix, vector, result) { + if (typeof result === "undefined") { result = null; } + if (!result) + result = new Vector3D(); + + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a = raw[0]; + var e = raw[1]; + var i = raw[2]; + var m = raw[3]; + var b = raw[4]; + var f = raw[5]; + var j = raw[6]; + var n = raw[7]; + var c = raw[8]; + var g = raw[9]; + var k = raw[10]; + var o = raw[11]; + var x = vector.x; + var y = vector.y; + var z = vector.z; + result.x = a * x + b * y + c * z; + result.y = e * x + f * y + g * z; + result.z = i * x + j * y + k * z; + result.w = m * x + n * y + o * z; + return result; + }; + + Matrix3DUtils.getTranslation = function (transform, result) { + if (typeof result === "undefined") { result = null; } + if (!result) + result = new Vector3D(); + + transform.copyColumnTo(3, result); + return result; + }; + + Matrix3DUtils.deltaTransformVectors = function (matrix, vin, vout) { + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a = raw[0]; + var e = raw[1]; + var i = raw[2]; + var m = raw[3]; + var b = raw[4]; + var f = raw[5]; + var j = raw[6]; + var n = raw[7]; + var c = raw[8]; + var g = raw[9]; + var k = raw[10]; + var o = raw[11]; + var outIndex = 0; + var length = vin.length; + for (var index = 0; index < length; index += 3) { + var x = vin[index]; + var y = vin[index + 1]; + var z = vin[index + 2]; + vout[outIndex++] = a * x + b * y + c * z; + vout[outIndex++] = e * x + f * y + g * z; + vout[outIndex++] = i * x + j * y + k * z; + } + }; + Matrix3DUtils.RAW_DATA_CONTAINER = new Array(16); + + Matrix3DUtils.CALCULATION_MATRIX = new Matrix3D(); + return Matrix3DUtils; +})(); + +module.exports = Matrix3DUtils; + + +},{"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined}],"awayjs-core/lib/core/geom/Matrix3D":[function(require,module,exports){ +var Orientation3D = require("awayjs-core/lib/core/geom/Orientation3D"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); + +var Matrix3D = (function () { + /** + * Creates a Matrix3D object. + */ + function Matrix3D(v) { + if (typeof v === "undefined") { v = null; } + if (v != null && v.length == 16) + this.rawData = v.concat(); + else + this.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + } + /** + * Appends the matrix by multiplying another Matrix3D object by the current Matrix3D object. + */ + Matrix3D.prototype.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; + }; + + /** + * Appends an incremental rotation to a Matrix3D object. + */ + Matrix3D.prototype.appendRotation = function (degrees, axis) { + var m = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); + + this.append(m); + }; + + /** + * Appends an incremental scale change along the x, y, and z axes to a Matrix3D object. + */ + Matrix3D.prototype.appendScale = function (xScale, yScale, zScale) { + this.append(new 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])); + }; + + /** + * Appends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. + */ + Matrix3D.prototype.appendTranslation = function (x, y, z) { + this.rawData[12] += x; + this.rawData[13] += y; + this.rawData[14] += z; + }; + + /** + * Returns a new Matrix3D object that is an exact copy of the current Matrix3D object. + */ + Matrix3D.prototype.clone = function () { + return new Matrix3D(this.rawData.slice(0)); + }; + + /** + * Copies a Vector3D object into specific column of the calling Matrix3D object. + */ + Matrix3D.prototype.copyColumnFrom = function (column, vector3D) { + switch (column) { + case 0: + this.rawData[0] = vector3D.x; + this.rawData[1] = vector3D.y; + this.rawData[2] = vector3D.z; + this.rawData[3] = vector3D.w; + break; + case 1: + this.rawData[4] = vector3D.x; + this.rawData[5] = vector3D.y; + this.rawData[6] = vector3D.z; + this.rawData[7] = vector3D.w; + break; + case 2: + this.rawData[8] = vector3D.x; + this.rawData[9] = vector3D.y; + this.rawData[10] = vector3D.z; + this.rawData[11] = vector3D.w; + break; + case 3: + this.rawData[12] = vector3D.x; + this.rawData[13] = vector3D.y; + this.rawData[14] = vector3D.z; + this.rawData[15] = vector3D.w; + break; + default: + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); + } + }; + + /** + * Copies specific column of the calling Matrix3D object into the Vector3D object. + */ + Matrix3D.prototype.copyColumnTo = function (column, vector3D) { + switch (column) { + case 0: + vector3D.x = this.rawData[0]; + vector3D.y = this.rawData[1]; + vector3D.z = this.rawData[2]; + vector3D.w = this.rawData[3]; + break; + case 1: + vector3D.x = this.rawData[4]; + vector3D.y = this.rawData[5]; + vector3D.z = this.rawData[6]; + vector3D.w = this.rawData[7]; + break; + case 2: + vector3D.x = this.rawData[8]; + vector3D.y = this.rawData[9]; + vector3D.z = this.rawData[10]; + vector3D.w = this.rawData[11]; + break; + case 3: + vector3D.x = this.rawData[12]; + vector3D.y = this.rawData[13]; + vector3D.z = this.rawData[14]; + vector3D.w = this.rawData[15]; + break; + default: + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); + } + }; + + /** + * Copies all of the matrix data from the source Matrix3D object into the calling Matrix3D object. + */ + Matrix3D.prototype.copyFrom = function (sourceMatrix3D) { + var len = sourceMatrix3D.rawData.length; + for (var c = 0; c < len; c++) + this.rawData[c] = sourceMatrix3D.rawData[c]; + }; + + Matrix3D.prototype.copyRawDataFrom = function (vector, index, transpose) { + if (typeof index === "undefined") { index = 0; } + if (typeof transpose === "undefined") { transpose = false; } + if (transpose) + this.transpose(); + + var len = vector.length - index; + for (var c = 0; c < len; c++) + this.rawData[c] = vector[c + index]; + + if (transpose) + this.transpose(); + }; + + Matrix3D.prototype.copyRawDataTo = function (vector, index, transpose) { + if (typeof index === "undefined") { index = 0; } + if (typeof transpose === "undefined") { transpose = false; } + if (transpose) + this.transpose(); + + var len = this.rawData.length; + for (var c = 0; c < len; c++) + vector[c + index] = this.rawData[c]; + + if (transpose) + this.transpose(); + }; + + /** + * Copies a Vector3D object into specific row of the calling Matrix3D object. + */ + Matrix3D.prototype.copyRowFrom = function (row, vector3D) { + switch (row) { + case 0: + this.rawData[0] = vector3D.x; + this.rawData[4] = vector3D.y; + this.rawData[8] = vector3D.z; + this.rawData[12] = vector3D.w; + break; + case 1: + this.rawData[1] = vector3D.x; + this.rawData[5] = vector3D.y; + this.rawData[9] = vector3D.z; + this.rawData[13] = vector3D.w; + break; + case 2: + this.rawData[2] = vector3D.x; + this.rawData[6] = vector3D.y; + this.rawData[10] = vector3D.z; + this.rawData[14] = vector3D.w; + break; + case 3: + this.rawData[3] = vector3D.x; + this.rawData[7] = vector3D.y; + this.rawData[11] = vector3D.z; + this.rawData[15] = vector3D.w; + break; + default: + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); + } + }; + + /** + * Copies specific row of the calling Matrix3D object into the Vector3D object. + */ + Matrix3D.prototype.copyRowTo = function (row, vector3D) { + switch (row) { + case 0: + vector3D.x = this.rawData[0]; + vector3D.y = this.rawData[4]; + vector3D.z = this.rawData[8]; + vector3D.w = this.rawData[12]; + break; + case 1: + vector3D.x = this.rawData[1]; + vector3D.y = this.rawData[5]; + vector3D.z = this.rawData[9]; + vector3D.w = this.rawData[13]; + break; + case 2: + vector3D.x = this.rawData[2]; + vector3D.y = this.rawData[6]; + vector3D.z = this.rawData[10]; + vector3D.w = this.rawData[14]; + break; + case 3: + vector3D.x = this.rawData[3]; + vector3D.y = this.rawData[7]; + vector3D.z = this.rawData[11]; + vector3D.w = this.rawData[15]; + break; + default: + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); + } + }; + + /** + * Copies this Matrix3D object into a destination Matrix3D object. + */ + Matrix3D.prototype.copyToMatrix3D = function (dest) { + dest.rawData = this.rawData.slice(0); + }; + + /** + * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector3D objects. + */ + Matrix3D.prototype.decompose = function (orientationStyle) { + if (typeof orientationStyle === "undefined") { orientationStyle = "eulerAngles"; } + var q; + + // Initial Tests - Not OK + var vec = []; + var m = this.clone(); + var mr = m.rawData; + + var pos = new Vector3D(mr[12], mr[13], mr[14]); + mr[12] = 0; + mr[13] = 0; + mr[14] = 0; + + var scale = new 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 Vector3D(); + + switch (orientationStyle) { + case Orientation3D.AXIS_ANGLE: + rot.w = Math.acos((mr[0] + mr[5] + mr[10] - 1) / 2); + + var len = Math.sqrt((mr[6] - mr[9]) * (mr[6] - mr[9]) + (mr[8] - mr[2]) * (mr[8] - mr[2]) + (mr[1] - mr[4]) * (mr[1] - mr[4])); + rot.x = (mr[6] - mr[9]) / len; + rot.y = (mr[8] - mr[2]) / len; + rot.z = (mr[1] - mr[4]) / len; + + break; + case Orientation3D.QUATERNION: + var tr = mr[0] + mr[5] + mr[10]; + + if (tr > 0) { + rot.w = Math.sqrt(1 + tr) / 2; + + rot.x = (mr[6] - mr[9]) / (4 * rot.w); + rot.y = (mr[8] - mr[2]) / (4 * rot.w); + rot.z = (mr[1] - mr[4]) / (4 * rot.w); + } else if ((mr[0] > mr[5]) && (mr[0] > mr[10])) { + rot.x = Math.sqrt(1 + mr[0] - mr[5] - mr[10]) / 2; + + rot.w = (mr[6] - mr[9]) / (4 * rot.x); + rot.y = (mr[1] + mr[4]) / (4 * rot.x); + rot.z = (mr[8] + mr[2]) / (4 * rot.x); + } else if (mr[5] > mr[10]) { + rot.y = Math.sqrt(1 + mr[5] - mr[0] - mr[10]) / 2; + + rot.x = (mr[1] + mr[4]) / (4 * rot.y); + rot.w = (mr[8] - mr[2]) / (4 * rot.y); + rot.z = (mr[6] + mr[9]) / (4 * rot.y); + } else { + rot.z = Math.sqrt(1 + mr[10] - mr[0] - mr[5]) / 2; + + rot.x = (mr[8] + mr[2]) / (4 * rot.z); + rot.y = (mr[6] + mr[9]) / (4 * rot.z); + rot.w = (mr[1] - mr[4]) / (4 * rot.z); + } + + break; + case Orientation3D.EULER_ANGLES: + rot.y = Math.asin(-mr[2]); + + //var cos:number = Math.cos(rot.y); + if (mr[2] != 1 && mr[2] != -1) { + 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]); + } + + break; + } + + vec.push(pos); + vec.push(rot); + vec.push(scale); + + return vec; + }; + + /** + * Uses the transformation matrix without its translation elements to transform a Vector3D object from one space + * coordinate to another. + */ + Matrix3D.prototype.deltaTransformVector = function (v) { + var x = v.x; + var y = v.y; + var z = v.z; + + return new Vector3D((x * this.rawData[0] + y * this.rawData[4] + z * this.rawData[8]), (x * this.rawData[1] + y * this.rawData[5] + z * this.rawData[9]), (x * this.rawData[2] + y * this.rawData[6] + z * this.rawData[10]), (x * this.rawData[3] + y * this.rawData[7] + z * this.rawData[11])); + }; + + /** + * Converts the current matrix to an identity or unit matrix. + */ + Matrix3D.prototype.identity = function () { + this.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + }; + + /** + * [static] Interpolates the translation, rotation, and scale transformation of one matrix toward those of the target matrix. + */ + Matrix3D.interpolate = function (thisMat, toMat, percent) { + var m = new Matrix3D(); + for (var i = 0; i < 16; ++i) + m.rawData[i] = thisMat.rawData[i] + (toMat.rawData[i] - thisMat.rawData[i]) * percent; + + return m; + }; + + /** + * Interpolates this matrix towards the translation, rotation, and scale transformations of the target matrix. + */ + Matrix3D.prototype.interpolateTo = function (toMat, percent) { + for (var i = 0; i < 16; ++i) + this.rawData[i] = this.rawData[i] + (toMat.rawData[i] - this.rawData[i]) * percent; + }; + + /** + * Inverts the current matrix. + */ + Matrix3D.prototype.invert = function () { + var d = this.determinant; + 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 invertable; + }; + + /* TODO implement pointAt + public pointAt( pos:Vector3D, at:Vector3D = null, up:Vector3D = null ) + { + } + */ + /** + * Prepends a matrix by multiplying the current Matrix3D object by another Matrix3D object. + */ + Matrix3D.prototype.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; + }; + + /** + * Prepends an incremental rotation to a Matrix3D object. + */ + Matrix3D.prototype.prependRotation = function (degrees, axis) { + var m = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); + + /* + if ( pivot != null ) + { + var p:Vector3D = pivot; + m.appendTranslation( p.x, p.y, p.z ); + } + */ + this.prepend(m); + }; + + /** + * Prepends an incremental scale change along the x, y, and z axes to a Matrix3D object. + */ + Matrix3D.prototype.prependScale = function (xScale, yScale, zScale) { + // Initial Tests - OK + this.prepend(new Matrix3D([xScale, 0, 0, 0, 0, yScale, 0, 0, 0, 0, zScale, 0, 0, 0, 0, 1])); + }; + + /** + * Prepends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. + */ + Matrix3D.prototype.prependTranslation = function (x, y, z) { + // Initial Tests - OK + var m = new Matrix3D(); + m.position = new Vector3D(x, y, z); + this.prepend(m); + }; + + // TODO orientationStyle + /** + * Sets the transformation matrix's translation, rotation, and scale settings. + */ + Matrix3D.prototype.recompose = function (components) { + // Initial Tests - OK + if (components.length < 3) + return false; + + //components[2].x == 0 || components[2].y == 0 || components[2].z == 0) return false; + this.identity(); + this.appendScale(components[2].x, components[2].y, components[2].z); + + var angle; + angle = -components[1].x; + this.append(new 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 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 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.position = components[0]; + this.rawData[15] = 1; + + return true; + }; + + Matrix3D.prototype.transformVector = function (v) { + var x = v.x; + var y = v.y; + var z = v.z; + + return new 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]), (x * this.rawData[3] + y * this.rawData[7] + z * this.rawData[11] + this.rawData[15])); + }; + + /** + * Uses the transformation matrix to transform a Vector of Numbers from one coordinate space to another. + */ + Matrix3D.prototype.transformVectors = function (vin, vout) { + // Initial Tests - OK + var i = 0; + var x = 0, y = 0, z = 0; + + while (i + 3 <= vin.length) { + 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; + } + }; + + /** + * Converts the current Matrix3D object to a matrix where the rows and columns are swapped. + */ + Matrix3D.prototype.transpose = function () { + // Initial Tests - OK + var oRawData = this.rawData.slice(0); + + 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]; + }; + + Matrix3D.getAxisRotation = function (x, y, z, degrees) { + // internal class use by rotations which have been tested + var m = new Matrix3D(); + + var rad = degrees * (Math.PI / 180); + var c = Math.cos(rad); + var s = Math.sin(rad); + var t = 1 - c; + var tmp1, tmp2; + + m.rawData[0] = c + x * x * t; + m.rawData[5] = c + y * y * t; + m.rawData[10] = c + z * z * t; + + tmp1 = x * y * t; + tmp2 = z * s; + m.rawData[1] = tmp1 + tmp2; + m.rawData[4] = tmp1 - tmp2; + tmp1 = x * z * t; + tmp2 = y * s; + m.rawData[8] = tmp1 + tmp2; + m.rawData[2] = tmp1 - tmp2; + tmp1 = y * z * t; + tmp2 = x * s; + m.rawData[9] = tmp1 - tmp2; + m.rawData[6] = tmp1 + tmp2; + + return m; + }; + + Object.defineProperty(Matrix3D.prototype, "determinant", { + /** + * [read-only] A Number that determines whether a matrix is invertible. + */ + get: function () { + return ((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])); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Matrix3D.prototype, "position", { + /** + * A Vector3D object that holds the position, the 3D coordinate (x,y,z) of a display object within the + * transformation's frame of reference. + */ + get: function () { + return new Vector3D(this.rawData[12], this.rawData[13], this.rawData[14]); + }, + set: function (value) { + this.rawData[12] = value.x; + this.rawData[13] = value.y; + this.rawData[14] = value.z; + }, + enumerable: true, + configurable: true + }); + + + Matrix3D.prototype.toFixed = function (decimalPlace) { + var magnitude = Math.pow(10, decimalPlace); + return "matrix3d(" + Math.round(this.rawData[0] * magnitude) / magnitude + "," + Math.round(this.rawData[1] * magnitude) / magnitude + "," + Math.round(this.rawData[2] * magnitude) / magnitude + "," + Math.round(this.rawData[3] * magnitude) / magnitude + "," + Math.round(this.rawData[4] * magnitude) / magnitude + "," + Math.round(this.rawData[5] * magnitude) / magnitude + "," + Math.round(this.rawData[6] * magnitude) / magnitude + "," + Math.round(this.rawData[7] * magnitude) / magnitude + "," + Math.round(this.rawData[8] * magnitude) / magnitude + "," + Math.round(this.rawData[9] * magnitude) / magnitude + "," + Math.round(this.rawData[10] * magnitude) / magnitude + "," + Math.round(this.rawData[11] * magnitude) / magnitude + "," + Math.round(this.rawData[12] * magnitude) / magnitude + "," + Math.round(this.rawData[13] * magnitude) / magnitude + "," + Math.round(this.rawData[14] * magnitude) / magnitude + "," + Math.round(this.rawData[15] * magnitude) / magnitude + ")"; + }; + + Matrix3D.prototype.toString = function () { + return "matrix3d(" + Math.round(this.rawData[0] * 1000) / 1000 + "," + Math.round(this.rawData[1] * 1000) / 1000 + "," + Math.round(this.rawData[2] * 1000) / 1000 + "," + Math.round(this.rawData[3] * 1000) / 1000 + "," + Math.round(this.rawData[4] * 1000) / 1000 + "," + Math.round(this.rawData[5] * 1000) / 1000 + "," + Math.round(this.rawData[6] * 1000) / 1000 + "," + Math.round(this.rawData[7] * 1000) / 1000 + "," + Math.round(this.rawData[8] * 1000) / 1000 + "," + Math.round(this.rawData[9] * 1000) / 1000 + "," + Math.round(this.rawData[10] * 1000) / 1000 + "," + Math.round(this.rawData[11] * 1000) / 1000 + "," + Math.round(this.rawData[12] * 1000) / 1000 + "," + Math.round(this.rawData[13] * 1000) / 1000 + "," + Math.round(this.rawData[14] * 1000) / 1000 + "," + Math.round(this.rawData[15] * 1000) / 1000 + ")"; + }; + return Matrix3D; +})(); + +module.exports = Matrix3D; + + +},{"awayjs-core/lib/core/geom/Orientation3D":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/errors/ArgumentError":undefined}],"awayjs-core/lib/core/geom/Matrix":[function(require,module,exports){ +var Point = require("awayjs-core/lib/core/geom/Point"); + +var ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); + +/** +* The Matrix class represents a transformation matrix that determines how to +* map points from one coordinate space to another. You can perform various +* graphical transformations on a display object by setting the properties of +* a Matrix object, applying that Matrix object to the matrix +* property of a Transform object, and then applying that Transform object as +* the transform property of the display object. These +* transformation functions include translation(x and y +* repositioning), rotation, scaling, and skewing. +* +*

Together these types of transformations are known as affine +* transformations. Affine transformations preserve the straightness of +* lines while transforming, so that parallel lines stay parallel.

+* +*

To apply a transformation matrix to a display object, you create a +* Transform object, set its matrix property to the +* transformation matrix, and then set the transform property of +* the display object to the Transform object. Matrix objects are also used as +* parameters of some methods, such as the following:

+* +*
    +*
  • The draw() method of a BitmapData object
  • +*
  • The beginBitmapFill() method, +* beginGradientFill() method, or +* lineGradientStyle() method of a Graphics object
  • +*
+* +*

A transformation matrix object is a 3 x 3 matrix with the following +* contents:

+* +*

In traditional transformation matrixes, the u, +* v, and w properties provide extra capabilities. +* The Matrix class can only operate in two-dimensional space, so it always +* assumes that the property values u and v are 0.0, +* and that the property value w is 1.0. The effective values of +* the matrix are as follows:

+* +*

You can get and set the values of all six of the other properties in a +* Matrix object: a, b, c, +* d, tx, and ty.

+* +*

The Matrix class supports the four major types of transformations: +* translation, scaling, rotation, and skewing. You can set three of these +* transformations by using specialized methods, as described in the following +* table:

+* +*

Each transformation function alters the current matrix properties so +* that you can effectively combine multiple transformations. To do this, you +* call more than one transformation function before applying the matrix to +* its display object target(by using the transform property of +* that display object).

+* +*

Use the new Matrix() constructor to create a Matrix object +* before you can call the methods of the Matrix object.

+*/ +var Matrix = (function () { + /** + * Creates a new Matrix object with the specified parameters. In matrix + * notation, the properties are organized like this: + * + *

If you do not provide any parameters to the new Matrix() + * constructor, it creates an identity matrix with the following + * values:

+ * + *

In matrix notation, the identity matrix looks like this:

+ * + * @param a The value that affects the positioning of pixels along the + * x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the + * y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the + * x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the + * y axis when scaling or rotating an image.. + * @param tx The distance by which to translate each point along the x + * axis. + * @param ty The distance by which to translate each point along the y + * axis. + */ + function Matrix(a, b, c, d, tx, ty) { + if (typeof a === "undefined") { a = 1; } + if (typeof b === "undefined") { b = 0; } + if (typeof c === "undefined") { c = 0; } + if (typeof d === "undefined") { d = 1; } + if (typeof tx === "undefined") { tx = 0; } + if (typeof ty === "undefined") { ty = 0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + /** + * Returns a new Matrix object that is a clone of this matrix, with an exact + * copy of the contained object. + * + * @return A Matrix object. + */ + Matrix.prototype.clone = function () { + return new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty); + }; + + /** + * Concatenates a matrix with the current matrix, effectively combining the + * geometric effects of the two. In mathematical terms, concatenating two + * matrixes is the same as combining them using matrix multiplication. + * + *

For example, if matrix m1 scales an object by a factor of + * four, and matrix m2 rotates an object by 1.5707963267949 + * radians(Math.PI/2), then m1.concat(m2) + * transforms m1 into a matrix that scales an object by a factor + * of four and rotates the object by Math.PI/2 radians.

+ * + *

This method replaces the source matrix with the concatenated matrix. If + * you want to concatenate two matrixes without altering either of the two + * source matrixes, first copy the source matrix by using the + * clone() method, as shown in the Class Examples section.

+ * + * @param matrix The matrix to be concatenated to the source matrix. + */ + Matrix.prototype.concat = function (matrix) { + var a1 = this.a * matrix.a + this.b * matrix.c; + this.b = this.a * matrix.b + this.b * matrix.d; + this.a = a1; + + var c1 = this.c * matrix.a + this.d * matrix.c; + this.d = this.c * matrix.b + this.d * matrix.d; + + this.c = c1; + + var tx1 = this.tx * matrix.a + this.ty * matrix.c + matrix.tx; + this.ty = this.tx * matrix.b + this.ty * matrix.d + matrix.ty; + this.tx = tx1; + }; + + /** + * Copies a Vector3D object into specific column of the calling Matrix3D + * object. + * + * @param column The column from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + Matrix.prototype.copyColumnFrom = function (column, vector3D) { + if (column > 2) { + throw "Column " + column + " out of bounds (2)"; + } else if (column == 0) { + this.a = vector3D.x; + this.c = vector3D.y; + } else if (column == 1) { + this.b = vector3D.x; + this.d = vector3D.y; + } else { + this.tx = vector3D.x; + this.ty = vector3D.y; + } + }; + + /** + * Copies specific column of the calling Matrix object into the Vector3D + * object. The w element of the Vector3D object will not be changed. + * + * @param column The column from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + Matrix.prototype.copyColumnTo = function (column, vector3D) { + if (column > 2) { + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 2]"); + } else if (column == 0) { + vector3D.x = this.a; + vector3D.y = this.c; + vector3D.z = 0; + } else if (column == 1) { + vector3D.x = this.b; + vector3D.y = this.d; + vector3D.z = 0; + } else { + vector3D.x = this.tx; + vector3D.y = this.ty; + vector3D.z = 1; + } + }; + + /** + * Copies all of the matrix data from the source Point object into the + * calling Matrix object. + * + * @param sourceMatrix The Matrix object from which to copy the data. + */ + Matrix.prototype.copyFrom = function (sourceMatrix) { + this.a = sourceMatrix.a; + this.b = sourceMatrix.b; + this.c = sourceMatrix.c; + this.d = sourceMatrix.d; + this.tx = sourceMatrix.tx; + this.ty = sourceMatrix.ty; + }; + + /** + * Copies a Vector3D object into specific row of the calling Matrix object. + * + * @param row The row from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + Matrix.prototype.copyRowFrom = function (row, vector3D) { + if (row > 2) { + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); + } else if (row == 0) { + this.a = vector3D.x; + this.c = vector3D.y; + } else if (row == 1) { + this.b = vector3D.x; + this.d = vector3D.y; + } else { + this.tx = vector3D.x; + this.ty = vector3D.y; + } + }; + + /** + * Copies specific row of the calling Matrix object into the Vector3D object. + * The w element of the Vector3D object will not be changed. + * + * @param row The row from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + Matrix.prototype.copyRowTo = function (row, vector3D) { + if (row > 2) { + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); + } else if (row == 0) { + vector3D.x = this.a; + vector3D.y = this.b; + vector3D.z = this.tx; + } else if (row == 1) { + vector3D.x = this.c; + vector3D.y = this.d; + vector3D.z = this.ty; + } else { + vector3D.setTo(0, 0, 1); + } + }; + + /** + * Includes parameters for scaling, rotation, and translation. When applied + * to a matrix it sets the matrix's values based on those parameters. + * + *

Using the createBox() method lets you obtain the same + * matrix as you would if you applied the identity(), + * rotate(), scale(), and translate() + * methods in succession. For example, mat1.createBox(2,2,Math.PI/4, + * 100, 100) has the same effect as the following:

+ * + * @param scaleX The factor by which to scale horizontally. + * @param scaleY The factor by which scale vertically. + * @param rotation The amount to rotate, in radians. + * @param tx The number of pixels to translate(move) to the right + * along the x axis. + * @param ty The number of pixels to translate(move) down along the + * y axis. + */ + Matrix.prototype.createBox = function (scaleX, scaleY, rotation, tx, ty) { + if (typeof rotation === "undefined") { rotation = 0; } + if (typeof tx === "undefined") { tx = 0; } + if (typeof ty === "undefined") { ty = 0; } + this.a = scaleX; + this.d = scaleY; + this.b = rotation; + this.tx = tx; + this.ty = ty; + }; + + /** + * Creates the specific style of matrix expected by the + * beginGradientFill() and lineGradientStyle() + * methods of the Graphics class. Width and height are scaled to a + * scaleX/scaleY pair and the + * tx/ty values are offset by half the width and + * height. + * + *

For example, consider a gradient with the following + * characteristics:

+ * + *
    + *
  • GradientType.LINEAR
  • + *
  • Two colors, green and blue, with the ratios array set to [0, + * 255]
  • + *
  • SpreadMethod.PAD
  • + *
  • InterpolationMethod.LINEAR_RGB
  • + *
+ * + *

The following illustrations show gradients in which the matrix was + * defined using the createGradientBox() method with different + * parameter settings:

+ * + * @param width The width of the gradient box. + * @param height The height of the gradient box. + * @param rotation The amount to rotate, in radians. + * @param tx The distance, in pixels, to translate to the right along + * the x axis. This value is offset by half of the + * width parameter. + * @param ty The distance, in pixels, to translate down along the + * y axis. This value is offset by half of the + * height parameter. + */ + Matrix.prototype.createGradientBox = function (width, height, rotation, tx, ty) { + if (typeof rotation === "undefined") { rotation = 0; } + if (typeof tx === "undefined") { tx = 0; } + if (typeof ty === "undefined") { ty = 0; } + this.a = width / 1638.4; + this.d = height / 1638.4; + + if (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 = this.c = 0; + } + + this.tx = tx + width / 2; + this.ty = ty + height / 2; + }; + + /** + * Given a point in the pretransform coordinate space, returns the + * coordinates of that point after the transformation occurs. Unlike the + * standard transformation applied using the transformPoint() + * method, the deltaTransformPoint() method's transformation + * does not consider the translation parameters tx and + * ty. + * + * @param point The point for which you want to get the result of the matrix + * transformation. + * @return The point resulting from applying the matrix transformation. + */ + Matrix.prototype.deltaTransformPoint = function (point) { + return new Point(point.x * this.a + point.y * this.c, point.x * this.b + point.y * this.d); + }; + + /** + * Sets each matrix property to a value that causes a null transformation. An + * object transformed by applying an identity matrix will be identical to the + * original. + * + *

After calling the identity() method, the resulting matrix + * has the following properties: a=1, b=0, + * c=0, d=1, tx=0, + * ty=0.

+ * + *

In matrix notation, the identity matrix looks like this:

+ * + */ + Matrix.prototype.identity = function () { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.tx = 0; + this.ty = 0; + }; + + /** + * Performs the opposite transformation of the original matrix. You can apply + * an inverted matrix to an object to undo the transformation performed when + * applying the original matrix. + */ + Matrix.prototype.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.tx = -this.tx; + this.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.ty = -this.b * this.tx - this.d * this.ty; + this.tx = tx1; + } + }; + + /** + * Returns a new Matrix object that is a clone of this matrix, with an exact + * copy of the contained object. + * + * @param matrix The matrix for which you want to get the result of the matrix + * transformation. + * @return A Matrix object. + */ + Matrix.prototype.multiply = function (matrix) { + var result = new Matrix(); + + result.a = this.a * matrix.a + this.b * matrix.c; + result.b = this.a * matrix.b + this.b * matrix.d; + result.c = this.c * matrix.a + this.d * matrix.c; + result.d = this.c * matrix.b + this.d * matrix.d; + + result.tx = this.tx * matrix.a + this.ty * matrix.c + matrix.tx; + result.ty = this.tx * matrix.b + this.ty * matrix.d + matrix.ty; + + return result; + }; + + /** + * Applies a rotation transformation to the Matrix object. + * + *

The rotate() method alters the a, + * b, c, and d properties of the + * Matrix object. In matrix notation, this is the same as concatenating the + * current matrix with the following:

+ * + * @param angle The rotation angle in radians. + */ + Matrix.prototype.rotate = function (angle) { + var cos = Math.cos(angle); + var sin = Math.sin(angle); + + 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.ty = this.tx * sin + this.ty * cos; + this.tx = tx1; + }; + + /** + * Applies a scaling transformation to the matrix. The x axis is + * multiplied by sx, and the y axis it is multiplied by + * sy. + * + *

The scale() method alters the a and + * d properties of the Matrix object. In matrix notation, this + * is the same as concatenating the current matrix with the following + * matrix:

+ * + * @param sx A multiplier used to scale the object along the x axis. + * @param sy A multiplier used to scale the object along the y axis. + */ + Matrix.prototype.scale = function (sx, sy) { + this.a *= sx; + this.b *= sy; + + this.c *= sx; + this.d *= sy; + + this.tx *= sx; + this.ty *= sy; + }; + + /** + * Sets the members of Matrix to the specified values. + * + * @param a The value that affects the positioning of pixels along the + * x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the + * y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the + * x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the + * y axis when scaling or rotating an image.. + * @param tx The distance by which to translate each point along the x + * axis. + * @param ty The distance by which to translate each point along the y + * axis. + */ + Matrix.prototype.setTo = function (a, b, c, d, tx, ty) { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + }; + + /** + * Returns a text value listing the properties of the Matrix object. + * + * @return A string containing the values of the properties of the Matrix + * object: a, b, c, + * d, tx, and ty. + */ + Matrix.prototype.toString = function () { + return "[Matrix] (a=" + this.a + ", b=" + this.b + ", c=" + this.c + ", d=" + this.d + ", tx=" + this.tx + ", ty=" + this.ty + ")"; + }; + + /** + * Returns the result of applying the geometric transformation represented by + * the Matrix object to the specified point. + * + * @param point The point for which you want to get the result of the Matrix + * transformation. + * @return The point resulting from applying the Matrix transformation. + */ + Matrix.prototype.transformPoint = function (point) { + return new Point(point.x * this.a + point.y * this.c + this.tx, point.x * this.b + point.y * this.d + this.ty); + }; + + /** + * Translates the matrix along the x and y axes, as specified + * by the dx and dy parameters. + * + * @param dx The amount of movement along the x axis to the right, in + * pixels. + * @param dy The amount of movement down along the y axis, in pixels. + */ + Matrix.prototype.translate = function (dx, dy) { + this.tx += dx; + this.ty += dy; + }; + return Matrix; +})(); + +module.exports = Matrix; + + +},{"awayjs-core/lib/core/geom/Point":undefined,"awayjs-core/lib/errors/ArgumentError":undefined}],"awayjs-core/lib/core/geom/Orientation3D":[function(require,module,exports){ +/** +* A Quaternion object which can be used to represent rotations. +*/ +var Orientation3D = (function () { + function Orientation3D() { + } + Orientation3D.AXIS_ANGLE = "axisAngle"; + + Orientation3D.EULER_ANGLES = "eulerAngles"; + + Orientation3D.QUATERNION = "quaternion"; + return Orientation3D; +})(); + +module.exports = Orientation3D; + + +},{}],"awayjs-core/lib/core/geom/PerspectiveProjection":[function(require,module,exports){ +/** +*

The PerspectiveProjection class provides an easy way to assign or modify +* the perspective transformations of a display object and all of its +* children. For more complex or custom perspective transformations, use the +* Matrix3D class. While the PerspectiveProjection class provides basic +* three-dimensional presentation properties, the Matrix3D class provides more +* detailed control over the three-dimensional presentation of display objects. +*

+* +*

Projection is a way of representing a three-dimensional object in a +* two-dimensional space, like a cube projected onto a computer screen. +* Perspective projection uses a viewing frustum (a rectangular pyramid) to +* model and project a three-dimensional world and its objects on the screen. +* The viewing frustum becomes increasingly wider as it moves further from the +* origin of the viewpoint. The origin of the viewpoint could be a camera or +* the eyes of an observer facing the screen. The projected perspective +* produces the illusion of three dimensions with depth and distance, where +* the objects closer to the screen appear larger than the objects farther +* from the screen.

+* +*

A default PerspectiveProjection object is a framework defined for +* perspective transformation of the root object, based on the field of view +* and aspect ratio (dimensions) of the stage. The projection center, the +* vanishing point, is set to the center of the stage, which means the +* three-dimensional display objects disappear toward the center of the stage +* as they move back in the z axis. The default viewpoint is at point (0,0) +* looking down the positive z axis. The y-axis points down toward the bottom +* of the screen. You can gain access to the root display object's perspective +* projection settings and change the field of view and projection center +* properties of the perspectiveProjection property through the root object's +* DisplayObject.transform property.

+* +*

You can also set a different perspective projection setting for a +* display object through the parent's perspective projection. First, create a +* PerspectiveProjection object and set its fieldOfView and +* projectionCenter properties. Next, assign the +* PerspectiveProjection object to the parent display object using the +* DisplayObject.transform property. The specified projection +* matrix and transformation will then apply to all the display object's +* three-dimensional children.

+* +*

To modify a perspective projection of the stage or root object: use the +* transform.matrix property of the root display object to gain +* access to the PerspectiveProjection object. Or, apply different perspective +* projection properties to a display object by setting the perspective +* projection properties of the display object's parent. The child display +* object inherits the new properties. Specifically, create a +* PerspectiveProjection object and set its properties, then assign the +* PerspectiveProjection object to the perspectiveProjection +* property of the parent display object's transform property. +* The specified projection transformation then applies to all the display +* object's three-dimensional children.

+* +*

Since both PerspectiveProjection and Matrix3D objects perform +* perspective transformations, do not assign both to a display object at the +* same time. Use the PerspectiveProjection object for focal length and +* projection center changes. For more control over the perspective +* transformation, create a perspective projection Matrix3D object.

+*/ +var PerspectiveProjection = (function () { + /** + * Creates an instance of a PerspectiveProjection object. + */ + function PerspectiveProjection() { + } + /** + * Returns the underlying Matrix3D object of the display object. + * + *

A display object, like the root object, can have a + * PerspectiveProjection object without needing a Matrix3D property + * defined for its transformations. In fact, use either a + * PerspectiveProjection or a Matrix3D object to specify the + * perspective transformation. If when using the PerspectiveProjection + * object, a Matrix3D object was needed, the toMatrix3D() + * method can retrieve the underlying Matrix3D object of the display + * object. For example, the toMatrix3D() method can be + * used with the Utils3D.projectVectors() method.

+ * + * @see away.geom.Matrix3D + */ + PerspectiveProjection.prototype.toMatrix3D = function () { + return this._matrix3D; + }; + return PerspectiveProjection; +})(); + +module.exports = PerspectiveProjection; + + +},{}],"awayjs-core/lib/core/geom/Plane3D":[function(require,module,exports){ +var PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); + +var Plane3D = (function () { + /** + * Create a Plane3D with ABCD coefficients + */ + function Plane3D(a, b, c, d) { + if (typeof a === "undefined") { a = 0; } + if (typeof b === "undefined") { b = 0; } + if (typeof c === "undefined") { c = 0; } + if (typeof d === "undefined") { d = 0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + + if (a == 0 && b == 0) { + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + } else if (b == 0 && c == 0) { + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + } else if (a == 0 && c == 0) { + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + } else { + this._iAlignment = Plane3D.ALIGN_ANY; + } + } + /** + * Fills this Plane3D with the coefficients from 3 points in 3d space. + * @param p0 Vector3D + * @param p1 Vector3D + * @param p2 Vector3D + */ + Plane3D.prototype.fromPoints = function (p0, p1, p2) { + var d1x = p1.x - p0.x; + var d1y = p1.y - p0.y; + var d1z = p1.z - p0.z; + + var d2x = p2.x - p0.x; + var d2y = p2.y - p0.y; + var d2z = p2.z - p0.z; + + this.a = d1y * d2z - d1z * d2y; + this.b = d1z * d2x - d1x * d2z; + this.c = d1x * d2y - d1y * d2x; + this.d = this.a * p0.x + this.b * p0.y + this.c * p0.z; + + // not using epsilon, since a plane is infinite and a small incorrection can grow very large + if (this.a == 0 && this.b == 0) { + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + } else if (this.b == 0 && this.c == 0) { + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + } else if (this.a == 0 && this.c == 0) { + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + } else { + this._iAlignment = Plane3D.ALIGN_ANY; + } + }; + + /** + * Fills this Plane3D with the coefficients from the plane's normal and a point in 3d space. + * @param normal Vector3D + * @param point Vector3D + */ + Plane3D.prototype.fromNormalAndPoint = function (normal, point) { + this.a = normal.x; + this.b = normal.y; + this.c = normal.z; + this.d = this.a * point.x + this.b * point.y + this.c * point.z; + if (this.a == 0 && this.b == 0) { + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + } else if (this.b == 0 && this.c == 0) { + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + } else if (this.a == 0 && this.c == 0) { + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + } else { + this._iAlignment = Plane3D.ALIGN_ANY; + } + }; + + /** + * Normalize this Plane3D + * @return Plane3D This Plane3D. + */ + Plane3D.prototype.normalize = function () { + var len = 1 / Math.sqrt(this.a * this.a + this.b * this.b + this.c * this.c); + this.a *= len; + this.b *= len; + this.c *= len; + this.d *= len; + return this; + }; + + /** + * Returns the signed distance between this Plane3D and the point p. + * @param p Vector3D + * @returns Number + */ + Plane3D.prototype.distance = function (p) { + if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) { + return this.a * p.x - this.d; + } else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) { + return this.b * p.y - this.d; + } else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) { + return this.c * p.z - this.d; + } else { + return this.a * p.x + this.b * p.y + this.c * p.z - this.d; + } + }; + + /** + * Classify a point against this Plane3D. (in front, back or intersecting) + * @param p Vector3D + * @return int Plane3.FRONT or Plane3D.BACK or Plane3D.INTERSECT + */ + Plane3D.prototype.classifyPoint = function (p, epsilon) { + if (typeof epsilon === "undefined") { epsilon = 0.01; } + // check NaN + if (this.d != this.d) + return PlaneClassification.FRONT; + + var len; + if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) + len = this.a * p.x - this.d; + else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) + len = this.b * p.y - this.d; + else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) + len = this.c * p.z - this.d; + else + len = this.a * p.x + this.b * p.y + this.c * p.z - this.d; + + if (len < -epsilon) + return PlaneClassification.BACK; + else if (len > epsilon) + return PlaneClassification.FRONT; + else + return PlaneClassification.INTERSECT; + }; + + Plane3D.prototype.toString = function () { + return "Plane3D [a:" + this.a + ", b:" + this.b + ", c:" + this.c + ", d:" + this.d + "]"; + }; + Plane3D.ALIGN_ANY = 0; + Plane3D.ALIGN_XY_AXIS = 1; + Plane3D.ALIGN_YZ_AXIS = 2; + Plane3D.ALIGN_XZ_AXIS = 3; + return Plane3D; +})(); + +module.exports = Plane3D; + + +},{"awayjs-core/lib/core/geom/PlaneClassification":undefined}],"awayjs-core/lib/core/geom/PlaneClassification":[function(require,module,exports){ +var PlaneClassification = (function () { + function PlaneClassification() { + } + PlaneClassification.BACK = 0; + PlaneClassification.FRONT = 1; + + PlaneClassification.IN = 0; + PlaneClassification.OUT = 1; + PlaneClassification.INTERSECT = 2; + return PlaneClassification; +})(); + +module.exports = PlaneClassification; + + +},{}],"awayjs-core/lib/core/geom/Point":[function(require,module,exports){ +/** +* The Point object represents a location in a two-dimensional coordinate +* system, where x represents the horizontal axis and y +* represents the vertical axis. +* +*

The following code creates a point at(0,0):

+* +*

Methods and properties of the following classes use Point objects:

+* +*
    +*
  • BitmapData
  • +*
  • DisplayObject
  • +*
  • DisplayObjectContainer
  • +*
  • DisplacementMapFilter
  • +*
  • NativeWindow
  • +*
  • Matrix
  • +*
  • Rectangle
  • +*
+* +*

You can use the new Point() constructor to create a Point +* object.

+*/ +var Point = (function () { + /** + * Creates a new point. If you pass no parameters to this method, a point is + * created at(0,0). + * + * @param x The horizontal coordinate. + * @param y The vertical coordinate. + */ + function Point(x, y) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + this.x = x; + this.y = y; + } + Object.defineProperty(Point.prototype, "length", { + /** + * The length of the line segment from(0,0) to this point. + */ + get: function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + enumerable: true, + configurable: true + }); + + /** + * Adds the coordinates of another point to the coordinates of this point to + * create a new point. + * + * @param v The point to be added. + * @return The new point. + */ + Point.prototype.add = function (v) { + return new Point(this.x + v.x, this.y + v.y); + }; + + /** + * Creates a copy of this Point object. + * + * @return The new Point object. + */ + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; + + Point.prototype.copyFrom = function (sourcePoint) { + }; + + /** + * Determines whether two points are equal. Two points are equal if they have + * the same x and y values. + * + * @param toCompare The point to be compared. + * @return A value of true if the object is equal to this Point + * object; false if it is not equal. + */ + Point.prototype.equals = function (toCompare) { + return (this.x == toCompare.x && this.y == toCompare.y); + }; + + /** + * Scales the line segment between(0,0) and the current point to a set + * length. + * + * @param thickness The scaling value. For example, if the current point is + * (0,5), and you normalize it to 1, the point returned is + * at(0,1). + */ + Point.prototype.normalize = function (thickness) { + if (typeof thickness === "undefined") { thickness = 1; } + if (this.length != 0) { + var invLength = thickness / this.length; + this.x *= invLength; + this.y *= invLength; + return; + } + throw "Cannot divide by zero length."; + }; + + /** + * Offsets the Point object by the specified amount. The value of + * dx is added to the original value of x to create the + * new x value. The value of dy is added to the original + * value of y to create the new y value. + * + * @param dx The amount by which to offset the horizontal coordinate, + * x. + * @param dy The amount by which to offset the vertical coordinate, y. + */ + Point.prototype.offset = function (dx, dy) { + this.x += dx; + this.y += dy; + }; + + Point.prototype.setTo = function (xa, ya) { + }; + + /** + * Subtracts the coordinates of another point from the coordinates of this + * point to create a new point. + * + * @param v The point to be subtracted. + * @return The new point. + */ + Point.prototype.subtract = function (v) { + return new Point(this.x - v.x, this.y - v.y); + }; + + /** + * Returns a string that contains the values of the x and y + * coordinates. The string has the form "(x=x, + * y=y)", so calling the toString() method for a + * point at 23,17 would return "(x=23, y=17)". + * + * @return The string representation of the coordinates. + */ + Point.prototype.toString = function () { + return "[Point] (x=" + this.x + ", y=" + this.y + ")"; + }; + + /** + * Returns the distance between pt1 and pt2. + * + * @param pt1 The first point. + * @param pt2 The second point. + * @return The distance between the first and second points. + */ + Point.distance = function (pt1, pt2) { + var dx = pt2.x - pt1.x; + var dy = pt2.y - pt1.y; + + return Math.sqrt(dx * dx + dy * dy); + }; + + /** + * Determines a point between two specified points. The parameter + * f determines where the new interpolated point is located + * relative to the two end points specified by parameters pt1 + * and pt2. The closer the value of the parameter f + * is to 1.0, the closer the interpolated point is to the first + * point(parameter pt1). The closer the value of the parameter + * f is to 0, the closer the interpolated point is to the second + * point(parameter pt2). + * + * @param pt1 The first point. + * @param pt2 The second point. + * @param f The level of interpolation between the two points. Indicates + * where the new point will be, along the line between + * pt1 and pt2. If f=1, + * pt1 is returned; if f=0, + * pt2 is returned. + * @return The new, interpolated point. + */ + Point.interpolate = function (pt1, pt2, f) { + return new Point(pt2.x + (pt1.x - pt2.x) * f, pt2.y + (pt1.y - pt2.y) * f); + }; + + /** + * Converts a pair of polar coordinates to a Cartesian point coordinate. + * + * @param len The length coordinate of the polar pair. + * @param angle The angle, in radians, of the polar pair. + * @return The Cartesian point. + */ + Point.polar = function (len, angle) { + return new Point(len * Math.cos(angle), len * Math.sin(angle)); + }; + return Point; +})(); + +module.exports = Point; + + +},{}],"awayjs-core/lib/core/geom/PoissonLookup":[function(require,module,exports){ +var PoissonLookup = (function () { + function PoissonLookup() { + } + PoissonLookup.initDistributions = function () { + // precalculated for best control + this._distributions = new Array(); + this._distributions[0] = new Array(0.3082841, 0.4320919); + this._distributions[1] = new Array(0.3082841, 0.4320919, -0.2274942, -0.6640266); + this._distributions[2] = new Array(0.8742689, 0.0009265686, -0.6864116, -0.5536607, -0.2325206, 0.7678371); + this._distributions[3] = new Array(0.3913446, -0.7084417, -0.7511101, -0.5935929, -0.2323436, 0.5320091, 0.8435315, 0.5035911); + this._distributions[4] = new Array(0.2122471, -0.5771395, -0.8543506, -0.1763534, 0.5189021, 0.8323698, -0.3616908, 0.5865368, 0.9523004, -0.04948437); + this._distributions[5] = new Array(0.5791035, 0.3496495, 0.2959551, -0.6006749, -0.2419119, -0.06879545, -0.7403072, 0.6110353, -0.04555973, 0.8059174, -0.5275017, -0.737129); + this._distributions[6] = new Array(0.06941478, 0.8519508, -0.7441907, 0.2426432, 0.6439992, -0.2405252, -0.1007523, -0.2327587, -0.6427067, -0.7248485, 0.8050759, 0.5492936, 0.3573822, -0.8824506); + this._distributions[7] = new Array(0.8509863, 0.4452587, -0.09507271, 0.2073005, 0.1706571, -0.6434793, 0.8029777, -0.2718274, -0.4401725, 0.8196304, 0.2715359, 0.8598521, -0.8121575, -0.006447683, -0.6486837, -0.7237598); + this._distributions[8] = new Array(0.6951686, -0.2680728, -0.04933243, 0.3710589, 0.6592212, 0.3661054, -0.01579228, -0.6909603, -0.3275101, -0.1756866, 0.3811549, 0.9218544, -0.216032, 0.9755028, -0.7065172, 0.3355389, -0.6579109, -0.6798355); + this._distributions[9] = new Array(0.6181276, -0.09790418, -0.2537868, -0.5570995, -0.1964931, 0.3459414, 0.3474613, -0.8885581, 0.5135743, 0.5753114, -0.9549091, 0.1480672, -0.8711916, -0.4293123, -0.6928071, 0.6190156, -0.13369, 0.8892705, 0.0548224, -0.1246777); + this._distributions[10] = new Array(0.4853027, -0.5080479, -0.1331675, -0.506597, 0.139575, 0.01316885, 0.803486, -0.07568797, 0.5240274, 0.4883182, -0.4334005, 0.1207938, -0.7794577, -0.3985141, 0.1576432, -0.9861221, -0.3712867, 0.6959021, 0.1517378, 0.9847429, -0.9762396, 0.1661073); + this._distributions[11] = new Array(-0.2790166, -0.01252619, 0.3389016, 0.3921154, 0.2408341, -0.313211, -0.8151779, -0.3898362, -0.6347761, 0.3486495, 0.09471484, -0.7722448, -0.1385674, 0.6364574, 0.2456331, 0.9295807, -0.3864306, -0.8247881, 0.6111673, -0.7164014, 0.8287669, 0.05466961, 0.837706, 0.5415626); + this._distributions[12] = new Array(0.056417, 0.3185693, -0.8245888, 0.1882799, 0.8575996, 0.1136829, 0.1070375, 0.875332, 0.4076743, -0.06000621, -0.4311306, 0.7239349, 0.2677574, -0.538472, -0.08486642, -0.2083647, -0.888989, -0.3906443, -0.4768958, -0.6664082, 0.09334993, -0.9861541, 0.808736, -0.455949, 0.5889823, 0.7660807); + this._distributions[13] = new Array(-0.2681346, -0.3955857, -0.1315102, -0.8852947, -0.5143692, 0.09551838, 0.4344836, -0.546945, -0.8620899, -0.3813288, 0.1650431, 0.02034803, -0.1543657, 0.3842218, -0.828457, 0.5376903, -0.6145, -0.7818927, -0.2639062, 0.8784655, 0.1912684, 0.9720125, 0.3135219, 0.5224229, 0.7850655, 0.4592297, 0.7465045, -0.1368916); + this._distributions[14] = new Array(0.4241029, 0.695281, 0.150511, -0.02304107, -0.2482675, 0.9120338, 0.8057325, 0.2622084, -0.2445909, 0.2765962, 0.8588713, -0.1772072, 0.3117845, -0.4385471, -0.3923851, -0.3298936, -0.1751254, -0.7405846, 0.6926506, -0.684163, -0.9304563, -0.3254691, -0.8533293, 0.1523024, 0.2510415, -0.917345, -0.6239773, -0.7105472, -0.6104624, 0.6041355); + this._distributions[15] = new Array(0.5844554, 0.06651045, 0.1343258, 0.6756578, 0.3799674, -0.6301104, 0.5590436, 0.7940555, 0.09574714, 0.02262517, 0.8697868, 0.393301, 0.003945862, -0.421735, 0.9043913, -0.2432393, -0.4844007, 0.7190998, -0.3201078, 0.2972371, -0.3852352, -0.6341155, -0.5413069, -0.09223081, -0.8468984, -0.5126905, 0.004156174, -0.8633173, -0.9681889, -0.03305046, -0.846509, 0.4414353); + this._distributions[16] = new Array(0.4506488, 0.657668, 0.4621297, 0.07441051, -0.2782125, 0.6201044, 0.9750003, 0.09110117, 0.1019436, 0.2986514, 0.03457398, 0.9631706, 0.542098, -0.5505635, 0.8675668, 0.4938077, -0.5414361, 0.2655292, -0.7941836, 0.6003053, -0.09847672, -0.1001604, -0.9316511, -0.08572888, 0.07286467, -0.611899, -0.5232627, -0.4082253, -0.5481608, -0.827938, -0.1551939, -0.9621193, 0.9220031, -0.3315949); + this._distributions[17] = new Array(0.197908, -0.4697656, -0.4474689, -0.3428435, 0.8529873, -0.2228634, 0.6022478, -0.5469642, 0.2545276, -0.931133, -0.1507547, -0.7855865, -0.07606658, 0.1011628, 0.3046715, 0.2785755, 0.4698432, -0.1064076, 0.6831254, 0.4152522, 0.1374381, 0.8363233, -0.2166121, 0.6682042, 0.5511393, 0.7996449, -0.4278994, 0.28836, -0.8875198, 0.2181732, -0.8772842, -0.2818254, -0.7000262, 0.5762185, -0.6062385, -0.7439126); + this._distributions[18] = new Array(0.6645703, -0.05678739, 0.5720971, 0.4533803, -0.07660709, 0.08802763, 0.5163431, -0.4426552, 0.1163455, -0.3404382, -0.4004807, -0.5046007, 0.2932099, -0.8201418, -0.5322125, 0.03834766, -0.1490209, -0.8817304, -0.8000439, -0.3509448, 0.5260983, 0.8421043, 0.1197811, 0.6963812, 0.9498612, 0.3122156, -0.9285746, 0.02120355, -0.6670724, 0.7217396, 0.9155889, -0.3510147, -0.271941, 0.4727852, 0.318879, 0.1634057, -0.2686755, 0.9253026); + this._distributions[19] = new Array(0.5064292, 0.422527, 0.8935515, -0.06610427, 0.1199719, 0.175568, 0.403388, -0.2003276, 0.1657927, 0.8154403, 0.9301245, 0.2929218, -0.1644068, 0.6201534, 0.7113559, -0.6589743, -0.3364046, -0.1799502, 0.02109996, -0.392765, -0.382213, 0.3219992, -0.9201946, 0.1207967, -0.726185, 0.4291916, -0.7443482, -0.2480059, -0.5147594, 0.7418784, 0.1935272, -0.7406143, -0.3643523, -0.5559214, -0.7147766, -0.6326278, -0.2524151, -0.9096627, 0.5161405, 0.7908453); + this._distributions[20] = new Array(0.7921003, -0.3032096, 0.5992879, -0.009052323, 0.2538549, -0.1872749, 0.7053444, 0.3677175, 0.5417761, -0.8170255, 0.9749611, 0.1210478, 0.1969143, -0.6117041, -0.1824499, -0.4634196, -0.1181338, -0.8668742, -0.3050112, -0.1352596, -0.4409327, -0.7082354, -0.03225285, 0.1171548, 0.3113096, 0.3250439, -0.8166144, -0.463995, -0.01014475, 0.4715334, -0.6868284, 0.05091889, -0.4011163, 0.2717285, -0.06756835, 0.8307694, -0.7938535, 0.4352129, -0.4663842, 0.7165329, 0.559729, 0.8093995); + this._distributions[21] = new Array(0.07832243, 0.426151, -0.3856795, 0.5799953, 0.01970797, 0.06706189, 0.4822682, 0.3014512, -0.1532982, 0.87485, -0.4959527, 0.07888043, 0.260601, -0.2304784, 0.4996209, 0.7167382, 0.585986, -0.04265174, -0.7679967, 0.5509416, -0.9041753, 0.1802134, -0.8407655, -0.4442826, -0.2058258, -0.2636995, -0.4984115, -0.5928579, 0.2926032, -0.7886473, -0.06933882, -0.621177, 0.578115, -0.4813387, 0.8981777, -0.3291056, 0.1942733, 0.9255584, 0.8084362, 0.5066984, 0.9920095, 0.03103104, -0.2403206, -0.9389018); + this._distributions[22] = new Array(-0.5691095, 0.1014316, -0.7788262, 0.384012, -0.8253665, -0.1645582, -0.1830993, 0.002997211, -0.2555013, -0.4177977, -0.6640869, -0.4794711, -0.2351242, 0.5850121, 0.02436554, 0.2825883, 0.006061143, -0.8200245, 0.1618791, -0.3063331, -0.3765897, -0.7249815, 0.6092919, -0.6769328, -0.5956934, 0.6957655, 0.5383642, 0.4522677, -0.1489165, 0.9125596, 0.4167473, 0.1335986, 0.1898309, 0.5874342, 0.2288171, 0.9624356, 0.7540846, -0.07672304, 0.8986252, 0.2788797, 0.3555991, -0.9262139, 0.8454325, -0.4027667, 0.4945236, -0.2935512); + this._distributions[23] = new Array(-0.4481403, -0.3758374, -0.8877251, 0.08739938, 0.05015831, -0.1339983, -0.4070427, -0.8534173, 0.1019274, -0.5503222, -0.445998, 0.1997541, -0.8686263, -0.2788867, -0.7695944, -0.6033704, -0.05515742, -0.885711, -0.7714347, 0.5790485, 0.3466263, -0.8799297, 0.4487582, -0.5321087, -0.2461368, 0.6053771, -0.05568117, 0.2457351, -0.4668669, 0.8523816, 0.8103387, -0.4255538, 0.4054182, -0.175663, -0.2802011, -0.08920153, 0.2665959, 0.382935, 0.555679, 0.1621837, 0.105246, 0.8420411, 0.6921161, 0.6902903, 0.880946, 0.2483067, 0.9699264, -0.1021767); + this._distributions[24] = new Array(-0.1703323, -0.3119385, 0.2916039, -0.2988263, -0.008472982, -0.9277695, -0.7730271, -0.3277904, 0.3440474, -0.6815342, -0.2910278, 0.03461745, -0.6764899, -0.657078, -0.3505501, -0.7311988, -0.03478927, 0.3258755, -0.6048835, 0.159423, 0.2035525, 0.02212214, 0.5116573, 0.2226856, 0.6664805, -0.2500189, 0.7147882, -0.6609634, 0.03030632, -0.5763278, -0.2516585, 0.6116219, -0.9434413, -0.0116792, 0.9061816, 0.2491155, 0.182867, 0.6076167, 0.286593, 0.9485695, -0.5992439, 0.6970096, -0.2082874, 0.9416641, 0.9880044, -0.1541709, -0.9122881, 0.331555, 0.7324886, 0.6725098); + this._distributions[25] = new Array(0.3869598, -0.04974834, 0.7168844, -0.0693711, -0.07166742, 0.1725325, 0.4599592, 0.3232779, 0.5872094, -0.4198674, 0.2442266, -0.625667, 0.1254557, 0.4500048, -0.2290154, -0.1803567, 0.890583, 0.3373493, 0.1256081, 0.7853789, -0.2676466, 0.5305805, -0.7063224, 0.252168, -0.3989835, 0.1189921, 0.09617215, -0.2451447, 0.6302541, 0.6085876, 0.9380925, -0.3234899, 0.5086241, -0.8573482, 0.03576187, -0.9876697, -0.0876712, -0.6365195, -0.5276513, 0.823456, -0.6935764, -0.2240411, -0.5212318, -0.5383121, -0.2116208, 0.9639363, -0.9840096, 0.02743555, -0.3991577, -0.8994547, -0.7830126, 0.614068); + this._distributions[26] = new Array(-0.8366601, 0.4464895, -0.5917366, -0.02073906, -0.9845258, 0.1635625, -0.3097973, 0.4379579, -0.5478154, 0.7173221, -0.1685888, 0.9261969, 0.01503595, 0.6046097, 0.4452421, 0.5449086, 0.0315687, 0.1944619, 0.3753404, 0.8688548, 0.4143643, 0.1396648, 0.8711032, 0.4304703, 0.7328773, 0.1461501, 0.6374492, -0.3521495, 0.145613, -0.1341466, 0.9040975, -0.135123, -0.7839059, -0.5450199, -0.516019, -0.3320859, -0.206158, -0.4431106, -0.9703014, -0.2368356, -0.2473119, -0.0864351, 0.2130725, -0.4604077, -0.003726701, -0.7122303, -0.4072131, -0.6833169, 0.1632999, -0.9776646, 0.4686888, -0.680495, -0.2293511, -0.9509777); + this._distributions[27] = new Array(0.107311, -0.1311369, -0.4194764, -0.3148777, 0.6171439, -0.2745973, 0.2796618, 0.1937153, -0.09106886, 0.4180236, 0.6044006, 0.05577846, 0.02927299, -0.6738263, -0.2580845, 0.1179939, -0.09023564, -0.3830024, 0.3570953, -0.5000587, 0.81591, -0.5518309, 0.9300217, -0.1257987, 0.4904627, -0.8381903, -0.3163182, -0.8632009, 0.1137595, -0.9875998, 0.8390043, 0.3538185, 0.2149114, 0.4993694, 0.5191584, 0.3833552, 0.5002763, 0.7061465, -0.2567276, 0.9068756, -0.5197366, 0.3467845, 0.03668867, 0.9734009, -0.5347553, 0.66747, -0.9028882, 0.1023768, -0.8967977, 0.412834, -0.5821944, 0.0426479, -0.8032165, -0.2397038, -0.5597343, -0.6358021); + this._distributions[28] = new Array(-0.6562496, -0.1781036, -0.9301494, 0.1185208, -0.3861143, -0.4153562, -0.1560799, -0.1099607, -0.5587025, 0.395218, -0.5322112, -0.699701, -0.5008639, 0.08726846, -0.970524, -0.1963461, -0.813577, -0.5185111, -0.1644458, 0.298, -0.3216791, 0.639982, 0.3315373, 0.3339162, 0.2383235, -0.00105722, 0.1137828, 0.5450742, -0.01899921, 0.8798413, 0.2849685, 0.8255596, 0.6974412, 0.2123175, 0.7588523, 0.5470437, 0.5102502, -0.1687844, 0.5853448, 0.8033476, 0.2590716, -0.5262504, 0.5607718, -0.6342825, 0.8666443, -0.1491841, 0.8341052, -0.4935003, -0.1568441, -0.6634066, 0.2512113, -0.8769391, -0.2559827, -0.9572457, -0.01928852, -0.3966542, -0.750667, 0.6409678); + this._distributions[29] = new Array(0.3454786, -0.04837726, 0.2649553, 0.2406852, 0.5599093, -0.3839145, -0.1111814, -0.05502108, 0.7586042, -0.05818377, 0.2519488, -0.4665135, -0.1264972, 0.2602723, -0.08766216, -0.3671907, 0.6428129, 0.3999204, -0.6105871, -0.1246869, -0.4589451, -0.7646643, -0.03021116, -0.7899352, -0.6036922, -0.4293956, -0.2481938, 0.6534185, 0.102798, 0.6784465, -0.6392644, 0.4821358, -0.6789002, 0.1779133, -0.9140783, -0.1989647, -0.9262617, 0.3381507, 0.4794891, -0.8093274, 0.3959447, 0.668478, 0.9602883, 0.2272305, -0.123672, 0.9210883, 0.2375148, 0.9523395, -0.52898, 0.7973378, -0.382433, 0.1228794, 0.695015, 0.6948439, 0.7530277, -0.6458191, 0.8777987, -0.3272956, 0.2318525, -0.962768); + this._distributions[30] = new Array(0.4518921, -0.1146195, 0.4720805, -0.4238748, 0.3655423, 0.1806341, 0.1589939, -0.23568, 0.7673324, -0.5149941, 0.01163658, 0.09045836, 0.7010971, 0.1245747, 0.7518286, -0.1855433, 0.4960719, 0.4601022, 0.2566979, -0.6308268, -0.0654714, -0.5126389, -0.1823319, -0.1343282, -0.1464312, 0.4883236, -0.3858738, 0.203523, 0.1484799, 0.4432284, -0.477109, -0.116241, 0.2719092, 0.7208626, 0.9104174, 0.3578536, -0.5956199, 0.7662588, -0.6996251, 0.3678654, -0.2514512, 0.9251933, 0.1275825, -0.9478135, -0.204608, -0.8611552, 0.4264838, -0.877443, 0.9854161, 0.05521112, 0.5912951, 0.7997434, 0.1140349, 0.982093, -0.9324368, -0.2094094, -0.42436, -0.6441524, -0.6722705, -0.3554261, -0.7844236, 0.08587621); + this._distributions[31] = new Array(-0.4206714, -0.5613642, -0.8733016, -0.3373051, -0.1046226, -0.2902999, -0.1318562, -0.8434365, 0.1145093, -0.5962623, -0.4965627, -0.1873259, -0.5011808, -0.8546229, -0.7165636, -0.5743566, 0.1090901, 0.2017643, 0.3404809, -0.220455, -0.1989015, 0.2372122, -0.4538706, 0.0979171, 0.4514146, -0.572846, 0.2314168, -0.8514503, -0.4247236, 0.5650803, -0.943347, 0.04514639, -0.1309718, 0.5221877, -0.7004157, 0.4561877, 0.6306441, 0.04448673, 0.4301621, 0.5766876, 0.1078042, 0.7245752, 0.3875354, 0.2794483, 0.702876, -0.2924213, 0.7360667, -0.6210318, 0.7486517, 0.6531103, 0.4898235, 0.8591025, 0.6549174, 0.3854057, -0.2596106, 0.7916998, 0.9251194, -0.05296265, -0.5620695, 0.820877, -0.01228026, 0.9937211, 0.9612103, 0.2628758); + }; + + PoissonLookup.getDistribution = function (n /*int*/ ) { + if (!this._distributions) + this.initDistributions(); + + if (n < 2 || n > 32) + return null; + + return this._distributions[n - 1]; + }; + return PoissonLookup; +})(); + +module.exports = PoissonLookup; + + +},{}],"awayjs-core/lib/core/geom/Quaternion":[function(require,module,exports){ +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +var Orientation3D = require("awayjs-core/lib/core/geom/Orientation3D"); +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* A Quaternion object which can be used to represent rotations. +*/ +var Quaternion = (function () { + /** + * Creates a new Quaternion object. + * @param x The x value of the quaternion. + * @param y The y value of the quaternion. + * @param z The z value of the quaternion. + * @param w The w value of the quaternion. + */ + function Quaternion(x, y, z, w) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof z === "undefined") { z = 0; } + if (typeof w === "undefined") { w = 1; } + /** + * The x value of the quaternion. + */ + this.x = 0; + /** + * The y value of the quaternion. + */ + this.y = 0; + /** + * The z value of the quaternion. + */ + this.z = 0; + /** + * The w value of the quaternion. + */ + this.w = 1; + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + Object.defineProperty(Quaternion.prototype, "magnitude", { + /** + * Returns the magnitude of the quaternion object. + */ + get: function () { + return Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); + }, + enumerable: true, + configurable: true + }); + + /** + * Fills the quaternion object with the result from a multiplication of two quaternion objects. + * + * @param qa The first quaternion in the multiplication. + * @param qb The second quaternion in the multiplication. + */ + Quaternion.prototype.multiply = function (qa, qb) { + var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; + var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; + + this.w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2; + this.x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2; + this.y = w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2; + this.z = w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2; + }; + + Quaternion.prototype.multiplyVector = function (vector, target) { + if (typeof target === "undefined") { target = null; } + //target ||= new Quaternion(); + if (target === null) { + target = new Quaternion(); + } + + var x2 = vector.x; + var y2 = vector.y; + var z2 = vector.z; + + target.w = -this.x * x2 - this.y * y2 - this.z * z2; + target.x = this.w * x2 + this.y * z2 - this.z * y2; + target.y = this.w * y2 - this.x * z2 + this.z * x2; + target.z = this.w * z2 + this.x * y2 - this.y * x2; + + return target; + }; + + /** + * Fills the quaternion object with values representing the given rotation around a vector. + * + * @param axis The axis around which to rotate + * @param angle The angle in radians of the rotation. + */ + Quaternion.prototype.fromAxisAngle = function (axis, angle) { + var sin_a = Math.sin(angle / 2); + var cos_a = Math.cos(angle / 2); + + this.x = axis.x * sin_a; + this.y = axis.y * sin_a; + this.z = axis.z * sin_a; + this.w = cos_a; + + this.normalize(); + }; + + /** + * Spherically interpolates between two quaternions, providing an interpolation between rotations with constant angle change rate. + * @param qa The first quaternion to interpolate. + * @param qb The second quaternion to interpolate. + * @param t The interpolation weight, a value between 0 and 1. + */ + Quaternion.prototype.slerp = function (qa, qb, t) { + var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; + var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; + var dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2; + + // shortest direction + if (dot < 0) { + dot = -dot; + w2 = -w2; + x2 = -x2; + y2 = -y2; + z2 = -z2; + } + + if (dot < 0.95) { + // interpolate angle linearly + var angle = Math.acos(dot); + var s = 1 / Math.sin(angle); + var s1 = Math.sin(angle * (1 - t)) * s; + var s2 = Math.sin(angle * t) * s; + this.w = w1 * s1 + w2 * s2; + this.x = x1 * s1 + x2 * s2; + this.y = y1 * s1 + y2 * s2; + this.z = z1 * s1 + z2 * s2; + } else { + // nearly identical angle, interpolate linearly + this.w = w1 + t * (w2 - w1); + this.x = x1 + t * (x2 - x1); + this.y = y1 + t * (y2 - y1); + this.z = z1 + t * (z2 - z1); + var len = 1.0 / Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); + this.w *= len; + this.x *= len; + this.y *= len; + this.z *= len; + } + }; + + /** + * Linearly interpolates between two quaternions. + * @param qa The first quaternion to interpolate. + * @param qb The second quaternion to interpolate. + * @param t The interpolation weight, a value between 0 and 1. + */ + Quaternion.prototype.lerp = function (qa, qb, t) { + var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; + var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; + var len; + + // shortest direction + if (w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2 < 0) { + w2 = -w2; + x2 = -x2; + y2 = -y2; + z2 = -z2; + } + + this.w = w1 + t * (w2 - w1); + this.x = x1 + t * (x2 - x1); + this.y = y1 + t * (y2 - y1); + this.z = z1 + t * (z2 - z1); + + len = 1.0 / Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); + this.w *= len; + this.x *= len; + this.y *= len; + this.z *= len; + }; + + /** + * Fills the quaternion object with values representing the given euler rotation. + * + * @param ax The angle in radians of the rotation around the ax axis. + * @param ay The angle in radians of the rotation around the ay axis. + * @param az The angle in radians of the rotation around the az axis. + */ + Quaternion.prototype.fromEulerAngles = function (ax, ay, az) { + var halfX = ax * .5, halfY = ay * .5, halfZ = az * .5; + var cosX = Math.cos(halfX), sinX = Math.sin(halfX); + var cosY = Math.cos(halfY), sinY = Math.sin(halfY); + var cosZ = Math.cos(halfZ), sinZ = Math.sin(halfZ); + + this.w = cosX * cosY * cosZ + sinX * sinY * sinZ; + this.x = sinX * cosY * cosZ - cosX * sinY * sinZ; + this.y = cosX * sinY * cosZ + sinX * cosY * sinZ; + this.z = cosX * cosY * sinZ - sinX * sinY * cosZ; + }; + + /** + * Fills a target Vector3D object with the Euler angles that form the rotation represented by this quaternion. + * @param target An optional Vector3D object to contain the Euler angles. If not provided, a new object is created. + * @return The Vector3D containing the Euler angles. + */ + Quaternion.prototype.toEulerAngles = function (target) { + if (typeof target === "undefined") { target = null; } + //target ||= new Vector3D(); + if (target === null) { + target = new Vector3D(); + } + + target.x = Math.atan2(2 * (this.w * this.x + this.y * this.z), 1 - 2 * (this.x * this.x + this.y * this.y)); + target.y = Math.asin(2 * (this.w * this.y - this.z * this.x)); + target.z = Math.atan2(2 * (this.w * this.z + this.x * this.y), 1 - 2 * (this.y * this.y + this.z * this.z)); + + return target; + }; + + /** + * Normalises the quaternion object. + */ + Quaternion.prototype.normalize = function (val) { + if (typeof val === "undefined") { val = 1; } + var mag = val / Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + + this.x *= mag; + this.y *= mag; + this.z *= mag; + this.w *= mag; + }; + + /** + * Used to trace the values of a quaternion. + * + * @return A string representation of the quaternion object. + */ + Quaternion.prototype.toString = function () { + return "{x:" + this.x + " y:" + this.y + " z:" + this.z + " w:" + this.w + "}"; + }; + + /** + * Converts the quaternion to a Matrix3D object representing an equivalent rotation. + * @param target An optional Matrix3D container to store the transformation in. If not provided, a new object is created. + * @return A Matrix3D object representing an equivalent rotation. + */ + Quaternion.prototype.toMatrix3D = function (target) { + if (typeof target === "undefined") { target = null; } + var rawData = Matrix3DUtils.RAW_DATA_CONTAINER; + var xy2 = 2.0 * this.x * this.y, xz2 = 2.0 * this.x * this.z, xw2 = 2.0 * this.x * this.w; + var yz2 = 2.0 * this.y * this.z, yw2 = 2.0 * this.y * this.w, zw2 = 2.0 * this.z * this.w; + var xx = this.x * this.x, yy = this.y * this.y, zz = this.z * this.z, ww = this.w * this.w; + + rawData[0] = xx - yy - zz + ww; + rawData[4] = xy2 - zw2; + rawData[8] = xz2 + yw2; + rawData[12] = 0; + rawData[1] = xy2 + zw2; + rawData[5] = -xx + yy - zz + ww; + rawData[9] = yz2 - xw2; + rawData[13] = 0; + rawData[2] = xz2 - yw2; + rawData[6] = yz2 + xw2; + rawData[10] = -xx - yy + zz + ww; + rawData[14] = 0; + rawData[3] = 0.0; + rawData[7] = 0.0; + rawData[11] = 0; + rawData[15] = 1; + + if (!target) + return new Matrix3D(rawData); + + target.copyRawDataFrom(rawData); + + return target; + }; + + /** + * Extracts a quaternion rotation matrix out of a given Matrix3D object. + * @param matrix The Matrix3D out of which the rotation will be extracted. + */ + Quaternion.prototype.fromMatrix = function (matrix) { + var v = matrix.decompose(Orientation3D.QUATERNION)[1]; + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = v.w; + }; + + /** + * Converts the quaternion to a Vector.<Number> matrix representation of a rotation equivalent to this quaternion. + * @param target The Vector.<Number> to contain the raw matrix data. + * @param exclude4thRow If true, the last row will be omitted, and a 4x3 matrix will be generated instead of a 4x4. + */ + Quaternion.prototype.toRawData = function (target, exclude4thRow) { + if (typeof exclude4thRow === "undefined") { exclude4thRow = false; } + var xy2 = 2.0 * this.x * this.y, xz2 = 2.0 * this.x * this.z, xw2 = 2.0 * this.x * this.w; + var yz2 = 2.0 * this.y * this.z, yw2 = 2.0 * this.y * this.w, zw2 = 2.0 * this.z * this.w; + var xx = this.x * this.x, yy = this.y * this.y, zz = this.z * this.z, ww = this.w * this.w; + + target[0] = xx - yy - zz + ww; + target[1] = xy2 - zw2; + target[2] = xz2 + yw2; + target[4] = xy2 + zw2; + target[5] = -xx + yy - zz + ww; + target[6] = yz2 - xw2; + target[8] = xz2 - yw2; + target[9] = yz2 + xw2; + target[10] = -xx - yy + zz + ww; + target[3] = target[7] = target[11] = 0; + + if (!exclude4thRow) { + target[12] = target[13] = target[14] = 0; + target[15] = 1; + } + }; + + /** + * Clones the quaternion. + * @return An exact duplicate of the current Quaternion. + */ + Quaternion.prototype.clone = function () { + return new Quaternion(this.x, this.y, this.z, this.w); + }; + + /** + * Rotates a point. + * @param vector The Vector3D object to be rotated. + * @param target An optional Vector3D object that will contain the rotated coordinates. If not provided, a new object will be created. + * @return A Vector3D object containing the rotated point. + */ + Quaternion.prototype.rotatePoint = function (vector, target) { + if (typeof target === "undefined") { target = null; } + var x1, y1, z1, w1; + var x2 = vector.x, y2 = vector.y, z2 = vector.z; + + //target ||= new Vector3D(); + if (target === null) { + target = new Vector3D(); + } + + // p*q' + w1 = -this.x * x2 - this.y * y2 - this.z * z2; + x1 = this.w * x2 + this.y * z2 - this.z * y2; + y1 = this.w * y2 - this.x * z2 + this.z * x2; + z1 = this.w * z2 + this.x * y2 - this.y * x2; + + target.x = -w1 * this.x + x1 * this.w - y1 * this.z + z1 * this.y; + target.y = -w1 * this.y + x1 * this.z + y1 * this.w - z1 * this.x; + target.z = -w1 * this.z - x1 * this.y + y1 * this.x + z1 * this.w; + + return target; + }; + + /** + * Copies the data from a quaternion into this instance. + * @param q The quaternion to copy from. + */ + Quaternion.prototype.copyFrom = function (q) { + this.x = q.x; + this.y = q.y; + this.z = q.z; + this.w = q.w; + }; + return Quaternion; +})(); + +module.exports = Quaternion; + + +},{"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/geom/Matrix3DUtils":undefined,"awayjs-core/lib/core/geom/Orientation3D":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined}],"awayjs-core/lib/core/geom/Rectangle":[function(require,module,exports){ +var Point = require("awayjs-core/lib/core/geom/Point"); + +/** +* A Rectangle object is an area defined by its position, as indicated by its +* top-left corner point(x, y) and by its width and its height. +* +* +*

The x, y, width, and +* height properties of the Rectangle class are independent of +* each other; changing the value of one property has no effect on the others. +* However, the right and bottom properties are +* integrally related to those four properties. For example, if you change the +* value of the right property, the value of the +* width property changes; if you change the bottom +* property, the value of the height property changes.

+* +*

The following methods and properties use Rectangle objects:

+* +*
    +*
  • The applyFilter(), colorTransform(), +* copyChannel(), copyPixels(), draw(), +* fillRect(), generateFilterRect(), +* getColorBoundsRect(), getPixels(), +* merge(), paletteMap(), +* pixelDisolve(), setPixels(), and +* threshold() methods, and the rect property of the +* BitmapData class
  • +*
  • The getBounds() and getRect() methods, and +* the scrollRect and scale9Grid properties of the +* DisplayObject class
  • +*
  • The getCharBoundaries() method of the TextField +* class
  • +*
  • The pixelBounds property of the Transform class
  • +*
  • The bounds parameter for the startDrag() +* method of the Sprite class
  • +*
  • The printArea parameter of the addPage() +* method of the PrintJob class
  • +*
+* +*

You can use the new Rectangle() constructor to create a +* Rectangle object.

+* +*

Note: The Rectangle class does not define a rectangular Shape +* display object. To draw a rectangular Shape object onscreen, use the +* drawRect() method of the Graphics class.

+*/ +var Rectangle = (function () { + /** + * Creates a new Rectangle object with the top-left corner specified by the + * x and y parameters and with the specified + * width and height parameters. If you call this + * public without parameters, a rectangle with x, + * y, width, and height properties set + * to 0 is created. + * + * @param x The x coordinate of the top-left corner of the + * rectangle. + * @param y The y coordinate of the top-left corner of the + * rectangle. + * @param width The width of the rectangle, in pixels. + * @param height The height of the rectangle, in pixels. + */ + function Rectangle(x, y, width, height) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof width === "undefined") { width = 0; } + if (typeof height === "undefined") { height = 0; } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + Object.defineProperty(Rectangle.prototype, "bottom", { + /** + * The sum of the y and height properties. + */ + get: function () { + return this.y + this.height; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "bottomRight", { + /** + * The location of the Rectangle object's bottom-right corner, determined by + * the values of the right and bottom properties. + */ + get: function () { + if (this._bottomRight == null) + this._bottomRight = new Point(); + + this._bottomRight.x = this.x + this.width; + this._bottomRight.y = this.y + this.height; + + return this._bottomRight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "left", { + /** + * The x coordinate of the top-left corner of the rectangle. Changing + * the left property of a Rectangle object has no effect on the + * y and height properties. However it does affect + * the width property, whereas changing the x value + * does not affect the width property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + get: function () { + return this.x; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "right", { + /** + * The sum of the x and width properties. + */ + get: function () { + return this.x + this.width; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "size", { + /** + * The size of the Rectangle object, expressed as a Point object with the + * values of the width and height properties. + */ + get: function () { + if (this._size == null) + this._size = new Point(); + + this._size.x = this.width; + this._size.y = this.height; + + return this._size; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "top", { + /** + * The y coordinate of the top-left corner of the rectangle. Changing + * the top property of a Rectangle object has no effect on the + * x and width properties. However it does affect + * the height property, whereas changing the y + * value does not affect the height property. + * + *

The value of the top property is equal to the value of the + * y property.

+ */ + get: function () { + return this.y; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "topLeft", { + /** + * The location of the Rectangle object's top-left corner, determined by the + * x and y coordinates of the point. + */ + get: function () { + if (this._topLeft == null) + this._topLeft = new Point(); + + this._topLeft.x = this.x; + this._topLeft.y = this.y; + + return this._topLeft; + }, + enumerable: true, + configurable: true + }); + + /** + * Returns a new Rectangle object with the same values for the + * x, y, width, and + * height properties as the original Rectangle object. + * + * @return A new Rectangle object with the same values for the + * x, y, width, and + * height properties as the original Rectangle object. + */ + Rectangle.prototype.clone = function () { + return new Rectangle(this.x, this.y, this.width, this.height); + }; + + /** + * Determines whether the specified point is contained within the rectangular + * region defined by this Rectangle object. + * + * @param x The x coordinate(horizontal position) of the point. + * @param y The y coordinate(vertical position) of the point. + * @return A value of true if the Rectangle object contains the + * specified point; otherwise false. + */ + Rectangle.prototype.contains = function (x, y) { + return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y); + }; + + /** + * Determines whether the specified point is contained within the rectangular + * region defined by this Rectangle object. This method is similar to the + * Rectangle.contains() method, except that it takes a Point + * object as a parameter. + * + * @param point The point, as represented by its x and y + * coordinates. + * @return A value of true if the Rectangle object contains the + * specified point; otherwise false. + */ + Rectangle.prototype.containsPoint = function (point) { + return (this.x <= point.x && this.x + this.width >= point.x && this.y <= point.y && this.y + this.height >= point.y); + }; + + /** + * Determines whether the Rectangle object specified by the rect + * parameter is contained within this Rectangle object. A Rectangle object is + * said to contain another if the second Rectangle object falls entirely + * within the boundaries of the first. + * + * @param rect The Rectangle object being checked. + * @return A value of true if the Rectangle object that you + * specify is contained by this Rectangle object; otherwise + * false. + */ + Rectangle.prototype.containsRect = function (rect) { + return (this.x <= rect.x && this.x + this.width >= rect.x + rect.width && this.y <= rect.y && this.y + this.height >= rect.y + rect.height); + }; + + /** + * Copies all of rectangle data from the source Rectangle object into the + * calling Rectangle object. + * + * @param sourceRect The Rectangle object from which to copy the data. + */ + Rectangle.prototype.copyFrom = function (sourceRect) { + }; + + /** + * Determines whether the object specified in the toCompare + * parameter is equal to this Rectangle object. This method compares the + * x, y, width, and + * height properties of an object against the same properties of + * this Rectangle object. + * + * @param toCompare The rectangle to compare to this Rectangle object. + * @return A value of true if the object has exactly the same + * values for the x, y, width, + * and height properties as this Rectangle object; + * otherwise false. + */ + Rectangle.prototype.equals = function (toCompare) { + return (this.x == toCompare.x && this.y == toCompare.y && this.width == toCompare.width && this.height == toCompare.height); + }; + + /** + * Increases the size of the Rectangle object by the specified amounts, in + * pixels. The center point of the Rectangle object stays the same, and its + * size increases to the left and right by the dx value, and to + * the top and the bottom by the dy value. + * + * @param dx The value to be added to the left and the right of the Rectangle + * object. The following equation is used to calculate the new + * width and position of the rectangle: + * @param dy The value to be added to the top and the bottom of the + * Rectangle. The following equation is used to calculate the new + * height and position of the rectangle: + */ + Rectangle.prototype.inflate = function (dx, dy) { + this.x -= dx / 2; + this.y -= dy / 2; + this.width += dx / 2; + this.height += dy / 2; + }; + + /** + * Increases the size of the Rectangle object. This method is similar to the + * Rectangle.inflate() method except it takes a Point object as + * a parameter. + * + *

The following two code examples give the same result:

+ * + * @param point The x property of this Point object is used to + * increase the horizontal dimension of the Rectangle object. + * The y property is used to increase the vertical + * dimension of the Rectangle object. + */ + Rectangle.prototype.inflatePoint = function (point) { + this.x -= point.x / 2; + this.y -= point.y / 2; + this.width += point.x / 2; + this.height += point.y / 2; + }; + + /** + * If the Rectangle object specified in the toIntersect + * parameter intersects with this Rectangle object, returns the area of + * intersection as a Rectangle object. If the rectangles do not intersect, + * this method returns an empty Rectangle object with its properties set to + * 0. + * + * @param toIntersect The Rectangle object to compare against to see if it + * intersects with this Rectangle object. + * @return A Rectangle object that equals the area of intersection. If the + * rectangles do not intersect, this method returns an empty + * Rectangle object; that is, a rectangle with its x, + * y, width, and height + * properties set to 0. + */ + Rectangle.prototype.intersection = function (toIntersect) { + if (this.intersects(toIntersect)) { + var i = new Rectangle(); + + if (this.x > toIntersect.x) { + i.x = this.x; + i.width = toIntersect.x - this.x + toIntersect.width; + + if (i.width > this.width) + i.width = this.width; + } else { + i.x = toIntersect.x; + i.width = this.x - toIntersect.x + this.width; + + if (i.width > toIntersect.width) + i.width = toIntersect.width; + } + + if (this.y > toIntersect.y) { + i.y = this.y; + i.height = toIntersect.y - this.y + toIntersect.height; + + if (i.height > this.height) + i.height = this.height; + } else { + i.y = toIntersect.y; + i.height = this.y - toIntersect.y + this.height; + + if (i.height > toIntersect.height) + i.height = toIntersect.height; + } + + return i; + } + + return new Rectangle(); + }; + + /** + * Determines whether the object specified in the toIntersect + * parameter intersects with this Rectangle object. This method checks the + * x, y, width, and + * height properties of the specified Rectangle object to see if + * it intersects with this Rectangle object. + * + * @param toIntersect The Rectangle object to compare against this Rectangle + * object. + * @return A value of true if the specified object intersects + * with this Rectangle object; otherwise false. + */ + Rectangle.prototype.intersects = function (toIntersect) { + return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height); + }; + + /** + * Determines whether or not this Rectangle object is empty. + * + * @return A value of true if the Rectangle object's width or + * height is less than or equal to 0; otherwise false. + */ + Rectangle.prototype.isEmpty = function () { + return (this.x == 0 && this.y == 0 && this.width == 0 && this.height == 0); + }; + + /** + * Adjusts the location of the Rectangle object, as determined by its + * top-left corner, by the specified amounts. + * + * @param dx Moves the x value of the Rectangle object by this amount. + * @param dy Moves the y value of the Rectangle object by this amount. + */ + Rectangle.prototype.offset = function (dx, dy) { + this.x += dx; + this.y += dy; + }; + + /** + * Adjusts the location of the Rectangle object using a Point object as a + * parameter. This method is similar to the Rectangle.offset() + * method, except that it takes a Point object as a parameter. + * + * @param point A Point object to use to offset this Rectangle object. + */ + Rectangle.prototype.offsetPoint = function (point) { + this.x += point.x; + this.y += point.y; + }; + + /** + * Sets all of the Rectangle object's properties to 0. A Rectangle object is + * empty if its width or height is less than or equal to 0. + * + *

This method sets the values of the x, y, + * width, and height properties to 0.

+ * + */ + Rectangle.prototype.setEmpty = function () { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + }; + + /** + * Sets the members of Rectangle to the specified values + * + * @param xa The x coordinate of the top-left corner of the + * rectangle. + * @param ya The y coordinate of the top-left corner of the + * rectangle. + * @param widtha The width of the rectangle, in pixels. + * @param heighta The height of the rectangle, in pixels. + */ + Rectangle.prototype.setTo = function (xa, ya, widtha, heighta) { + this.x = xa; + this.y = ya; + this.width = widtha; + this.height = heighta; + }; + + /** + * Builds and returns a string that lists the horizontal and vertical + * positions and the width and height of the Rectangle object. + * + * @return A string listing the value of each of the following properties of + * the Rectangle object: x, y, + * width, and height. + */ + Rectangle.prototype.toString = function () { + return "[Rectangle] (x=" + this.x + ", y=" + this.y + ", width=" + this.width + ", height=" + this.height + ")"; + }; + + /** + * Adds two rectangles together to create a new Rectangle object, by filling + * in the horizontal and vertical space between the two rectangles. + * + *

Note: The union() method ignores rectangles with + * 0 as the height or width value, such as: var + * rect2:Rectangle = new Rectangle(300,300,50,0);

+ * + * @param toUnion A Rectangle object to add to this Rectangle object. + * @return A new Rectangle object that is the union of the two rectangles. + */ + Rectangle.prototype.union = function (toUnion) { + var u = new Rectangle(); + + if (this.x < toUnion.x) { + u.x = this.x; + u.width = toUnion.x - this.x + toUnion.width; + + if (u.width < this.width) + u.width = this.width; + } else { + u.x = toUnion.x; + u.width = this.x - toUnion.x + this.width; + + if (u.width < toUnion.width) + u.width = toUnion.width; + } + + if (this.y < toUnion.y) { + u.y = this.y; + u.height = toUnion.y - this.y + toUnion.height; + + if (u.height < this.height) + u.height = this.height; + } else { + u.y = toUnion.y; + u.height = this.y - toUnion.y + this.height; + + if (u.height < toUnion.height) + u.height = toUnion.height; + } + + return u; + }; + return Rectangle; +})(); + +module.exports = Rectangle; + + +},{"awayjs-core/lib/core/geom/Point":undefined}],"awayjs-core/lib/core/geom/Transform":[function(require,module,exports){ +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* The Transform class provides access to color adjustment properties and two- +* or three-dimensional transformation objects that can be applied to a +* display object. During the transformation, the color or the orientation and +* position of a display object is adjusted(offset) from the current values +* or coordinates to new values or coordinates. The Transform class also +* collects data about color and two-dimensional matrix transformations that +* are applied to a display object and all of its parent objects. You can +* access these combined transformations through the +* concatenatedColorTransform and concatenatedMatrix +* properties. +* +*

To apply color transformations: create a ColorTransform object, set the +* color adjustments using the object's methods and properties, and then +* assign the colorTransformation property of the +* transform property of the display object to the new +* ColorTransformation object.

+* +*

To apply two-dimensional transformations: create a Matrix object, set +* the matrix's two-dimensional transformation, and then assign the +* transform.matrix property of the display object to the new +* Matrix object.

+* +*

To apply three-dimensional transformations: start with a +* three-dimensional display object. A three-dimensional display object has a +* z property value other than zero. You do not need to create +* the Matrix3D object. For all three-dimensional objects, a Matrix3D object +* is created automatically when you assign a z value to a +* display object. You can access the display object's Matrix3D object through +* the display object's transform property. Using the methods of +* the Matrix3D class, you can add to or modify the existing transformation +* settings. Also, you can create a custom Matrix3D object, set the custom +* Matrix3D object's transformation elements, and then assign the new Matrix3D +* object to the display object using the transform.matrix +* property.

+* +*

To modify a perspective projection of the stage or root object: use the +* transform.matrix property of the root display object to gain +* access to the PerspectiveProjection object. Or, apply different perspective +* projection properties to a display object by setting the perspective +* projection properties of the display object's parent. The child display +* object inherits the new properties. Specifically, create a +* PerspectiveProjection object and set its properties, then assign the +* PerspectiveProjection object to the perspectiveProjection +* property of the parent display object's transform property. +* The specified projection transformation then applies to all the display +* object's three-dimensional children.

+* +*

Since both PerspectiveProjection and Matrix3D objects perform +* perspective transformations, do not assign both to a display object at the +* same time. Use the PerspectiveProjection object for focal length and +* projection center changes. For more control over the perspective +* transformation, create a perspective projection Matrix3D object.

+*/ +var Transform = (function () { + function Transform(displayObject) { + this._position = new Vector3D(); + this._displayObject = displayObject; + } + Object.defineProperty(Transform.prototype, "backVector", { + /** + * + */ + get: function () { + var director = Matrix3DUtils.getForward(this._displayObject._iMatrix3D); + director.negate(); + + return director; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "concatenatedColorTransform", { + /** + * A ColorTransform object representing the combined color transformations + * applied to the display object and all of its parent objects, back to the + * root level. If different color transformations have been applied at + * different levels, all of those transformations are concatenated into one + * ColorTransform object for this property. + */ + get: function () { + return this._concatenatedColorTransform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "concatenatedMatrix", { + /** + * A Matrix object representing the combined transformation matrixes of the + * display object and all of its parent objects, back to the root level. If + * different transformation matrixes have been applied at different levels, + * all of those matrixes are concatenated into one matrix for this property. + * Also, for resizeable SWF content running in the browser, this property + * factors in the difference between stage coordinates and window coordinates + * due to window resizing. Thus, the property converts local coordinates to + * window coordinates, which may not be the same coordinate space as that of + * the Stage. + */ + get: function () { + return this._concatenatedMatrix; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "downVector", { + /** + * + */ + get: function () { + var director = Matrix3DUtils.getUp(this._displayObject._iMatrix3D); + director.negate(); + + return director; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "forwardVector", { + /** + * + */ + get: function () { + return Matrix3DUtils.getForward(this._displayObject._iMatrix3D); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "leftVector", { + /** + * + */ + get: function () { + var director = Matrix3DUtils.getRight(this._displayObject._iMatrix3D); + director.negate(); + + return director; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "matrix3D", { + /** + * Provides access to the Matrix3D object of a three-dimensional display + * object. The Matrix3D object represents a transformation matrix that + * determines the display object's position and orientation. A Matrix3D + * object can also perform perspective projection. + * + *

If the matrix property is set to a value(not + * null), the matrix3D property is + * null. And if the matrix3D property is set to a + * value(not null), the matrix property is + * null.

+ */ + get: function () { + return this._displayObject._iMatrix3D; + }, + set: function (val) { + this._displayObject._iMatrix3D = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Transform.prototype, "pixelBounds", { + /** + * A Rectangle object that defines the bounding rectangle of the display + * object on the stage. + */ + get: function () { + return this._pixelBounds; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "position", { + /** + * Defines the position of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + get: function () { + return this._displayObject._iMatrix3D.position; + }, + set: function (value) { + this._displayObject.x = value.x; + this._displayObject.y = value.y; + this._displayObject.z = value.z; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Transform.prototype, "rightVector", { + /** + * + */ + get: function () { + return Matrix3DUtils.getRight(this._displayObject._iMatrix3D); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "rotation", { + /** + * Defines the rotation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + get: function () { + return new Vector3D(this._displayObject.rotationX, this._displayObject.rotationY, this._displayObject.rotationZ); + }, + set: function (value) { + this._displayObject.rotationX = value.x; + this._displayObject.rotationY = value.y; + this._displayObject.rotationZ = value.z; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Transform.prototype, "scale", { + /** + * Defines the scale of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + get: function () { + return new Vector3D(this._displayObject.scaleX, this._displayObject.scaleY, this._displayObject.scaleZ); + }, + set: function (value) { + this._displayObject.scaleX = value.x; + this._displayObject.scaleY = value.y; + this._displayObject.scaleZ = value.z; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Transform.prototype, "upVector", { + /** + * + */ + get: function () { + return Matrix3DUtils.getUp(this._displayObject._iMatrix3D); + }, + enumerable: true, + configurable: true + }); + + /** + * Returns a Matrix3D object, which can transform the space of a specified + * display object in relation to the current display object's space. You can + * use the getRelativeMatrix3D() method to move one + * three-dimensional display object relative to another three-dimensional + * display object. + * + * @param relativeTo The display object relative to which the transformation + * occurs. To get a Matrix3D object relative to the stage, + * set the parameter to the root or + * stage object. To get the world-relative + * matrix of the display object, set the parameter to a + * display object that has a perspective transformation + * applied to it. + * @return A Matrix3D object that can be used to transform the space from the + * relativeTo display object to the current display + * object space. + */ + Transform.prototype.getRelativeMatrix3D = function (relativeTo) { + return new Matrix3D(); + }; + + /** + * Moves the 3d object forwards along it's local z axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveForward = function (distance) { + this._displayObject.translateLocal(Vector3D.Z_AXIS, distance); + }; + + /** + * Moves the 3d object backwards along it's local z axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveBackward = function (distance) { + this._displayObject.translateLocal(Vector3D.Z_AXIS, -distance); + }; + + /** + * Moves the 3d object backwards along it's local x axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveLeft = function (distance) { + this._displayObject.translateLocal(Vector3D.X_AXIS, -distance); + }; + + /** + * Moves the 3d object forwards along it's local x axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveRight = function (distance) { + this._displayObject.translateLocal(Vector3D.X_AXIS, distance); + }; + + /** + * Moves the 3d object forwards along it's local y axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveUp = function (distance) { + this._displayObject.translateLocal(Vector3D.Y_AXIS, distance); + }; + + /** + * Moves the 3d object backwards along it's local y axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveDown = function (distance) { + this._displayObject.translateLocal(Vector3D.Y_AXIS, -distance); + }; + return Transform; +})(); + +module.exports = Transform; + + +},{"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/geom/Matrix3DUtils":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined}],"awayjs-core/lib/core/geom/UVTransform":[function(require,module,exports){ +var Matrix = require("awayjs-core/lib/core/geom/Matrix"); + +var UVTransform = (function () { + function UVTransform() { + this._uvMatrix = new Matrix(); + this._rotation = 0; + this._scaleU = 1; + this._scaleV = 1; + this._offsetU = 0; + this._offsetV = 0; + } + Object.defineProperty(UVTransform.prototype, "offsetU", { + /** + * + */ + get: function () { + return this._offsetU; + }, + set: function (value) { + if (value == this._offsetU) + return; + + this._offsetU = value; + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "offsetV", { + /** + * + */ + get: function () { + return this._offsetV; + }, + set: function (value) { + if (value == this._offsetV) + return; + + this._offsetV = value; + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "rotation", { + /** + * + */ + get: function () { + return this._rotation; + }, + set: function (value) { + if (value == this._rotation) + return; + + this._rotation = value; + + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "scaleU", { + /** + * + */ + get: function () { + return this._scaleU; + }, + set: function (value) { + if (value == this._scaleU) + return; + + this._scaleU = value; + + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "scaleV", { + /** + * + */ + get: function () { + return this._scaleV; + }, + set: function (value) { + if (value == this._scaleV) + return; + + this._scaleV = value; + + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "matrix", { + /** + * + */ + get: function () { + if (this._uvMatrixDirty) + this.updateUVMatrix(); + + return this._uvMatrix; + }, + enumerable: true, + configurable: true + }); + + /** + * @private + */ + UVTransform.prototype.updateUVMatrix = function () { + this._uvMatrix.identity(); + + if (this._rotation != 0) + this._uvMatrix.rotate(this._rotation); + + if (this._scaleU != 1 || this._scaleV != 1) + this._uvMatrix.scale(this._scaleU, this._scaleV); + + this._uvMatrix.translate(this._offsetU, this._offsetV); + + this._uvMatrixDirty = false; + }; + return UVTransform; +})(); + +module.exports = UVTransform; + + +},{"awayjs-core/lib/core/geom/Matrix":undefined}],"awayjs-core/lib/core/geom/Vector3D":[function(require,module,exports){ +/** +* The Vector3D class represents a point or a location in the three-dimensional +* space using the Cartesian coordinates x, y, and z. As in a two-dimensional +* space, the x property represents the horizontal axis and the y property +* represents the vertical axis. In three-dimensional space, the z property +* represents depth. The value of the x property increases as the object moves +* to the right. The value of the y property increases as the object moves +* down. The z property increases as the object moves farther from the point +* of view. Using perspective projection and scaling, the object is seen to be +* bigger when near and smaller when farther away from the screen. As in a +* right-handed three-dimensional coordinate system, the positive z-axis points +* away from the viewer and the value of the z property increases as the object +* moves away from the viewer's eye. The origin point (0,0,0) of the global +* space is the upper-left corner of the stage. +* +*

The Vector3D class can also represent a direction, an arrow pointing from +* the origin of the coordinates, such as (0,0,0), to an endpoint; or a +* floating-point component of an RGB (Red, Green, Blue) color model.

+* +*

Quaternion notation introduces a fourth element, the w property, which +* provides additional orientation information. For example, the w property can +* define an angle of rotation of a Vector3D object. The combination of the +* angle of rotation and the coordinates x, y, and z can determine the display +* object's orientation. Here is a representation of Vector3D elements in +* matrix notation:

+*/ +var Vector3D = (function () { + /** + * Creates an instance of a Vector3D object. If you do not specify a + * parameter for the constructor, a Vector3D object is created with + * the elements (0,0,0,0). + * + * @param x The first element, such as the x coordinate. + * @param y The second element, such as the y coordinate. + * @param z The third element, such as the z coordinate. + * @param w An optional element for additional data such as the angle + * of rotation. + */ + function Vector3D(x, y, z, w) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof z === "undefined") { z = 0; } + if (typeof w === "undefined") { w = 0; } + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + Object.defineProperty(Vector3D.prototype, "length", { + /** + * The length, magnitude, of the current Vector3D object from the + * origin (0,0,0) to the object's x, y, and z coordinates. The w + * property is ignored. A unit vector has a length or magnitude of + * one. + */ + get: function () { + return Math.sqrt(this.lengthSquared); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Vector3D.prototype, "lengthSquared", { + /** + * The square of the length of the current Vector3D object, calculated + * using the x, y, and z properties. The w property is ignored. Use the + * lengthSquared() method whenever possible instead of the + * slower Math.sqrt() method call of the + * Vector3D.length() method. + */ + get: function () { + return this.x * this.x + this.y * this.y + this.z * this.z; + }, + enumerable: true, + configurable: true + }); + + /** + * Adds the value of the x, y, and z elements of the current Vector3D + * object to the values of the x, y, and z elements of another Vector3D + * object. The add() method does not change the current + * Vector3D object. Instead, it returns a new Vector3D object with + * the new values. + * + *

The result of adding two vectors together is a resultant vector. + * One way to visualize the result is by drawing a vector from the + * origin or tail of the first vector to the end or head of the second + * vector. The resultant vector is the distance between the origin + * point of the first vector and the end point of the second vector. + *

+ */ + Vector3D.prototype.add = function (a) { + return new Vector3D(this.x + a.x, this.y + a.y, this.z + a.z, this.w + a.w); + }; + + /** + * Returns the angle in radians between two vectors. The returned angle + * is the smallest radian the first Vector3D object rotates until it + * aligns with the second Vector3D object. + * + *

The angleBetween() method is a static method. You + * can use it directly as a method of the Vector3D class.

+ * + *

To convert a degree to a radian, you can use the following + * formula:

+ * + *

radian = Math.PI/180 * degree

+ * + * @param a The first Vector3D object. + * @param b The second Vector3D object. + * @returns The angle between two Vector3D objects. + */ + Vector3D.angleBetween = function (a, b) { + return Math.acos(a.dotProduct(b) / (a.length * b.length)); + }; + + /** + * Returns a new Vector3D object that is an exact copy of the current + * Vector3D object. + * + * @returns A new Vector3D object that is a copy of the current + * Vector3D object. + */ + Vector3D.prototype.clone = function () { + return new Vector3D(this.x, this.y, this.z, this.w); + }; + + /** + * Copies all of vector data from the source Vector3D object into the + * calling Vector3D object. + * + * @param src The Vector3D object from which to copy the data. + */ + Vector3D.prototype.copyFrom = function (src) { + this.x = src.x; + this.y = src.y; + this.z = src.z; + this.w = src.w; + }; + + /** + * Returns a new Vector3D object that is perpendicular (at a right + * angle) to the current Vector3D and another Vector3D object. If the + * returned Vector3D object's coordinates are (0,0,0), then the two + * Vector3D objects are parallel to each other. + * + *

You can use the normalized cross product of two vertices of a + * polygon surface with the normalized vector of the camera or eye + * viewpoint to get a dot product. The value of the dot product can + * identify whether a surface of a three-dimensional object is hidden + * from the viewpoint.

+ * + * @param a A second Vector3D object. + * @returns A new Vector3D object that is perpendicular to the current + * Vector3D object and the Vector3D object specified as the + * parameter. + */ + Vector3D.prototype.crossProduct = function (a) { + return new 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); + }; + + /** + * Decrements the value of the x, y, and z elements of the current + * Vector3D object by the values of the x, y, and z elements of + * specified Vector3D object. Unlike the + * Vector3D.subtract() method, the + * decrementBy() method changes the current Vector3D + * object and does not return a new Vector3D object. + * + * @param a The Vector3D object containing the values to subtract from + * the current Vector3D object. + */ + Vector3D.prototype.decrementBy = function (a) { + this.x -= a.x; + this.y -= a.y; + this.z -= a.z; + }; + + /** + * Returns the distance between two Vector3D objects. The + * distance() method is a static method. You can use it + * directly as a method of the Vector3D class to get the Euclidean + * distance between two three-dimensional points. + * + * @param pt1 A Vector3D object as the first three-dimensional point. + * @param pt2 A Vector3D object as the second three-dimensional point. + * @returns The distance between two Vector3D objects. + */ + Vector3D.distance = function (pt1, pt2) { + var x = (pt1.x - pt2.x); + var y = (pt1.y - pt2.y); + var z = (pt1.z - pt2.z); + return Math.sqrt(x * x + y * y + z * z); + }; + + /** + * If the current Vector3D object and the one specified as the + * parameter are unit vertices, this method returns the cosine of the + * angle between the two vertices. Unit vertices are vertices that + * point to the same direction but their length is one. They remove the + * length of the vector as a factor in the result. You can use the + * normalize() method to convert a vector to a unit + * vector. + * + *

The dotProduct() method finds the angle between two + * vertices. It is also used in backface culling or lighting + * calculations. Backface culling is a procedure for determining which + * surfaces are hidden from the viewpoint. You can use the normalized + * vertices from the camera, or eye, viewpoint and the cross product of + * the vertices of a polygon surface to get the dot product. If the dot + * product is less than zero, then the surface is facing the camera or + * the viewer. If the two unit vertices are perpendicular to each + * other, they are orthogonal and the dot product is zero. If the two + * vertices are parallel to each other, the dot product is one.

+ * + * @param a The second Vector3D object. + * @returns A scalar which is the dot product of the current Vector3D + * object and the specified Vector3D object. + * + * @see away.geom.Vector3D#crossProduct() + * @see away.geom.Vector3D#normalize() + */ + Vector3D.prototype.dotProduct = function (a) { + return this.x * a.x + this.y * a.y + this.z * a.z; + }; + + /** + * Determines whether two Vector3D objects are equal by comparing the + * x, y, and z elements of the current Vector3D object with a + * specified Vector3D object. If the values of these elements are the + * same, the two Vector3D objects are equal. If the second optional + * parameter is set to true, all four elements of the Vector3D objects, + * including the w property, are compared. + */ + /** + * + * @param toCompare The Vector3D object to be compared with the current + * Vector3D object. + * @param allFour An optional parameter that specifies whether the w + * property of the Vector3D objects is used in the + * comparison. + * @returns A value of true if the specified Vector3D object is equal + * to the current Vector3D object; false if it is not equal. + */ + Vector3D.prototype.equals = function (toCompare, allFour) { + if (typeof allFour === "undefined") { allFour = false; } + return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && (!allFour || this.w == toCompare.w)); + }; + + /** + * Increments the value of the x, y, and z elements of the current + * Vector3D object by the values of the x, y, and z elements of a + * specified Vector3D object. Unlike the Vector3D.add() + * method, the incrementBy() method changes the current + * Vector3D object and does not return a new Vector3D object. + * + * @param a The Vector3D object to be added to the current Vector3D + * object. + */ + Vector3D.prototype.incrementBy = function (a) { + this.x += a.x; + this.y += a.y; + this.z += a.z; + }; + + /** + * Compares the elements of the current Vector3D object with the + * elements of a specified Vector3D object to determine whether they + * are nearly equal. The two Vector3D objects are nearly equal if the + * value of all the elements of the two vertices are equal, or the + * result of the comparison is within the tolerance range. The + * difference between two elements must be less than the number + * specified as the tolerance parameter. If the third optional + * parameter is set to true, all four elements of the + * Vector3D objects, including the w property, are + * compared. Otherwise, only the x, y, and z elements are included in + * the comparison. + */ + /** + * + * @param toCompare The Vector3D object to be compared with the current + * Vector3D object. + * @param tolerance A number determining the tolerance factor. If the + * difference between the values of the Vector3D + * element specified in the toCompare parameter and + * the current Vector3D element is less than the + * tolerance number, the two values are considered + * nearly equal. + * @param allFour An optional parameter that specifies whether the w + * property of the Vector3D objects is used in the + * comparison. + * @returns A value of true if the specified Vector3D object is nearly + * equal to the current Vector3D object; false if it is not + * equal. + * + * @see away.geom.Vector3D#equals() + */ + Vector3D.prototype.nearEquals = function (toCompare, tolerance, allFour) { + if (typeof allFour === "undefined") { allFour = true; } + 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)); + }; + + /** + * Sets the current Vector3D object to its inverse. The inverse object + * is also considered the opposite of the original object. The value of + * the x, y, and z properties of the current Vector3D object is changed + * to -x, -y, and -z. + */ + Vector3D.prototype.negate = function () { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + }; + + /** + * Converts a Vector3D object to a unit vector by dividing the first + * three elements (x, y, z) by the length of the vector. Unit vertices + * are vertices that have a direction but their length is one. They + * simplify vector calculations by removing length as a factor. + */ + /** + * Scales the line segment between(0,0) and the current point to a set + * length. + * + * @param thickness The scaling value. For example, if the current + * Vector3D object is (0,3,4), and you normalize it to + * 1, the point returned is at(0,0.6,0.8). + */ + Vector3D.prototype.normalize = function (thickness) { + if (typeof thickness === "undefined") { thickness = 1; } + if (this.length != 0) { + var invLength = thickness / this.length; + this.x *= invLength; + this.y *= invLength; + this.z *= invLength; + return; + } + }; + + /** + * Divides the value of the x, y, and + * z properties of the current Vector3D object by the + * value of its w property. + * + *

If the current Vector3D object is the result of multiplying a + * Vector3D object by a projection Matrix3D object, the w property can + * hold the transform value. The project() method then can + * complete the projection by dividing the elements by the + * w property. Use the Matrix3D.rawData + * property to create a projection Matrix3D object.

+ */ + Vector3D.prototype.project = function () { + this.x /= this.w; + this.y /= this.w; + this.z /= this.w; + }; + + /** + * Scales the current Vector3D object by a scalar, a magnitude. The + * Vector3D object's x, y, and z elements are multiplied by the scalar + * number specified in the parameter. For example, if the vector is + * scaled by ten, the result is a vector that is ten times longer. The + * scalar can also change the direction of the vector. Multiplying the + * vector by a negative number reverses its direction. + * + * @param s A multiplier (scalar) used to scale a Vector3D object. + + */ + Vector3D.prototype.scaleBy = function (s) { + this.x *= s; + this.y *= s; + this.z *= s; + }; + + /** + * Sets the members of Vector3D to the specified values + * + * @param xa The first element, such as the x coordinate. + * @param ya The second element, such as the y coordinate. + * @param za The third element, such as the z coordinate. + */ + Vector3D.prototype.setTo = function (xa, ya, za) { + this.x = xa; + this.y = ya; + this.z = za; + }; + + /** + * Subtracts the value of the x, y, and z elements of the current + * Vector3D object from the values of the x, y, and z elements of + * another Vector3D object. The subtract() method does not + * change the current Vector3D object. Instead, this method returns a + * new Vector3D object with the new values. + * + * @param a The Vector3D object to be subtracted from the current + * Vector3D object. + * @returns A new Vector3D object that is the difference between the + * current Vector3D and the specified Vector3D object. + * + * @see away.geom.Vector3D#decrementBy() + */ + Vector3D.prototype.subtract = function (a) { + return new Vector3D(this.x - a.x, this.y - a.y, this.z - a.z); + }; + + /** + * Returns a string representation of the current Vector3D object. The + * string contains the values of the x, y, and z properties. + */ + Vector3D.prototype.toString = function () { + return "[Vector3D] (x:" + this.x + " ,y:" + this.y + ", z" + this.z + ", w:" + this.w + ")"; + }; + Vector3D.X_AXIS = new Vector3D(1, 0, 0); + + Vector3D.Y_AXIS = new Vector3D(0, 1, 0); + + Vector3D.Z_AXIS = new Vector3D(0, 0, 1); + return Vector3D; +})(); + +module.exports = Vector3D; + + +},{}],"awayjs-core/lib/core/library/AssetLibraryBundle":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetLibraryIterator = require("awayjs-core/lib/core/library/AssetLibraryIterator"); +var AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); + +var ConflictPrecedence = require("awayjs-core/lib/core/library/ConflictPrecedence"); +var ConflictStrategy = require("awayjs-core/lib/core/library/ConflictStrategy"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var Error = require("awayjs-core/lib/errors/Error"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); + +/** +* AssetLibraryBundle enforces a multiton pattern and is not intended to be instanced directly. +* Its purpose is to create a container for 3D data management, both before and after parsing. +* If you are interested in creating multiple library bundles, please use the getInstance() method. +*/ +var AssetLibraryBundle = (function (_super) { + __extends(AssetLibraryBundle, _super); + /** + * Creates a new AssetLibraryBundle object. + * + * @param me A multiton enforcer for the AssetLibraryBundle ensuring it cannnot be instanced. + */ + function AssetLibraryBundle() { + var _this = this; + _super.call(this); + this._loadingSessionsGarbage = new Array(); + + this._assets = new Array(); //new Vector.; + this._assetDictionary = new Object(); + this._loadingSessions = new Array(); + + this.conflictStrategy = ConflictStrategy.IGNORE.create(); + this.conflictPrecedence = ConflictPrecedence.FAVOR_NEW; + + this._onAssetRenameDelegate = function (event) { + return _this.onAssetRename(event); + }; + this._onAssetConflictResolvedDelegate = function (event) { + return _this.onAssetConflictResolved(event); + }; + this._onResourceCompleteDelegate = function (event) { + return _this.onResourceComplete(event); + }; + this._onTextureSizeErrorDelegate = function (event) { + return _this.onTextureSizeError(event); + }; + this._onAssetCompleteDelegate = function (event) { + return _this.onAssetComplete(event); + }; + this._onLoadErrorDelegate = function (event) { + return _this.onLoadError(event); + }; + this._onParseErrorDelegate = function (event) { + return _this.onParseError(event); + }; + } + /** + * Returns an AssetLibraryBundle instance. If no key is given, returns the default bundle instance (which is + * similar to using the AssetLibraryBundle as a singleton.) To keep several separated library bundles, + * pass a string key to this method to define which bundle should be returned. This is + * referred to as using the AssetLibrary as a multiton. + * + * @param key Defines which multiton instance should be returned. + * @return An instance of the asset library + */ + AssetLibraryBundle.getInstance = function (key) { + if (typeof key === "undefined") { key = 'default'; } + if (!key) + key = 'default'; + + if (!AssetLibraryBundle._iInstances.hasOwnProperty(key)) + AssetLibraryBundle._iInstances[key] = new AssetLibraryBundle(); + + return AssetLibraryBundle._iInstances[key]; + }; + + /** + * + */ + AssetLibraryBundle.prototype.enableParser = function (parserClass) { + AssetLoader.enableParser(parserClass); + }; + + /** + * + */ + AssetLibraryBundle.prototype.enableParsers = function (parserClasses) { + AssetLoader.enableParsers(parserClasses); + }; + + Object.defineProperty(AssetLibraryBundle.prototype, "conflictStrategy", { + /** + * Defines which strategy should be used for resolving naming conflicts, when two library + * assets are given the same name. By default, ConflictStrategy.APPEND_NUM_SUFFIX + * is used which means that a numeric suffix is appended to one of the assets. The + * conflictPrecedence property defines which of the two conflicting assets will + * be renamed. + * + * @see naming.ConflictStrategy + * @see AssetLibrary.conflictPrecedence + */ + get: function () { + return this._strategy; + }, + set: function (val) { + if (!val) + throw new Error('namingStrategy must not be null. To ignore naming, use AssetLibrary.IGNORE'); + + this._strategy = val.create(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLibraryBundle.prototype, "conflictPrecedence", { + /** + * Defines which asset should have precedence when resolving a naming conflict between + * two assets of which one has just been renamed by the user or by a parser. By default + * ConflictPrecedence.FAVOR_NEW is used, meaning that the newly renamed + * asset will keep it's new name while the older asset gets renamed to not conflict. + * + * This property is ignored for conflict strategies that do not actually rename an + * asset automatically, such as ConflictStrategy.IGNORE and ConflictStrategy.THROW_ERROR. + * + * @see away.library.ConflictPrecedence + * @see away.library.ConflictStrategy + */ + get: function () { + return this._strategyPreference; + }, + set: function (val) { + this._strategyPreference = val; + }, + enumerable: true, + configurable: true + }); + + + /** + * Create an AssetLibraryIterator instance that can be used to iterate over the assets + * in this asset library instance. The iterator can filter assets on asset type and/or + * namespace. A "null" filter value means no filter of that type is used. + * + * @param assetTypeFilter Asset type to filter on (from the AssetType enum class.) Use + * null to not filter on asset type. + * @param namespaceFilter Namespace to filter on. Use null to not filter on namespace. + * @param filterFunc Callback function to use when deciding whether an asset should be + * included in the iteration or not. This needs to be a function that takes a single + * parameter of type IAsset and returns a boolean where true means it should be included. + * + * @see away.library.AssetType + */ + AssetLibraryBundle.prototype.createIterator = function (assetTypeFilter, namespaceFilter, filterFunc) { + if (typeof assetTypeFilter === "undefined") { assetTypeFilter = null; } + if (typeof namespaceFilter === "undefined") { namespaceFilter = null; } + if (typeof filterFunc === "undefined") { filterFunc = null; } + return new AssetLibraryIterator(this._assets, assetTypeFilter, namespaceFilter, filterFunc); + }; + + /** + * Loads a file and (optionally) all of its dependencies. + * + * @param req The URLRequest object containing the URL of the file to be loaded. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + * @return A handle to the retrieved resource. + */ + AssetLibraryBundle.prototype.load = function (req, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + var loader = new AssetLoader(); + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + this._loadingSessions.push(loader); + + loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + loader._iAddErrorHandler(this._onLoadErrorDelegate); + loader._iAddParseErrorHandler(this._onParseErrorDelegate); + + return loader.load(req, context, ns, parser); + }; + + /** + * Loads a resource from existing data in memory. + * + * @param data The data object containing all resource information. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + * @return A handle to the retrieved resource. + */ + AssetLibraryBundle.prototype.loadData = function (data, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + var loader = new AssetLoader(); + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + this._loadingSessions.push(loader); + + loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + loader._iAddErrorHandler(this._onLoadErrorDelegate); + loader._iAddParseErrorHandler(this._onParseErrorDelegate); + + return loader.loadData(data, '', context, ns, parser); + }; + + /** + * + */ + AssetLibraryBundle.prototype.getAsset = function (name, ns) { + //var asset : IAsset; + if (typeof ns === "undefined") { ns = null; } + if (this._assetDictDirty) + this.rehashAssetDict(); + + if (ns == null) + ns = NamedAssetBase.DEFAULT_NAMESPACE; + + if (!this._assetDictionary.hasOwnProperty(ns)) + return null; + + return this._assetDictionary[ns][name]; + }; + + /** + * Adds an asset to the asset library, first making sure that it's name is unique + * using the method defined by the conflictStrategy and + * conflictPrecedence properties. + */ + AssetLibraryBundle.prototype.addAsset = function (asset) { + var ns; + var old; + + // Bail if asset has already been added. + if (this._assets.indexOf(asset) >= 0) + return; + + old = this.getAsset(asset.name, asset.assetNamespace); + ns = asset.assetNamespace || NamedAssetBase.DEFAULT_NAMESPACE; + + if (old != null) + this._strategy.resolveConflict(asset, old, this._assetDictionary[ns], this._strategyPreference); + + //create unique-id (for now this is used in AwayBuilder only + //asset.id = IDUtil.createUID(); + // Add it + this._assets.push(asset); + + if (!this._assetDictionary.hasOwnProperty(ns)) + this._assetDictionary[ns] = new Object(); + + this._assetDictionary[ns][asset.name] = asset; + + asset.addEventListener(AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); + asset.addEventListener(AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); + }; + + /** + * Removes an asset from the library, and optionally disposes that asset by calling + * it's disposeAsset() method (which for most assets is implemented as a default + * version of that type's dispose() method. + * + * @param asset The asset which should be removed from this library. + * @param dispose Defines whether the assets should also be disposed. + */ + AssetLibraryBundle.prototype.removeAsset = function (asset, dispose) { + if (typeof dispose === "undefined") { dispose = true; } + var idx; + + this.removeAssetFromDict(asset); + + asset.removeEventListener(AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); + asset.removeEventListener(AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); + + idx = this._assets.indexOf(asset); + + if (idx >= 0) + this._assets.splice(idx, 1); + + if (dispose) + asset.dispose(); + }; + + /** + * Removes an asset which is specified using name and namespace. + * + * @param name The name of the asset to be removed. + * @param ns The namespace to which the desired asset belongs. + * @param dispose Defines whether the assets should also be disposed. + * + * @see away.library.AssetLibrary.removeAsset() + */ + AssetLibraryBundle.prototype.removeAssetByName = function (name, ns, dispose) { + if (typeof ns === "undefined") { ns = null; } + if (typeof dispose === "undefined") { dispose = true; } + var asset = this.getAsset(name, ns); + + if (asset) + this.removeAsset(asset, dispose); + + return asset; + }; + + /** + * Removes all assets from the asset library, optionally disposing them as they + * are removed. + * + * @param dispose Defines whether the assets should also be disposed. + */ + AssetLibraryBundle.prototype.removeAllAssets = function (dispose) { + if (typeof dispose === "undefined") { dispose = true; } + if (dispose) { + var asset; + + for (var c = 0; c < this._assets.length; c++) { + asset = this._assets[c]; + asset.dispose(); + } + /* + for each (asset in _assets) + asset.dispose(); + */ + } + + this._assets.length = 0; + this.rehashAssetDict(); + }; + + /** + * Removes all assets belonging to a particular namespace (null for default) + * from the asset library, and optionall disposes them by calling their + * disposeAsset() method. + * + * @param ns The namespace from which all assets should be removed. + * @param dispose Defines whether the assets should also be disposed. + * + * @see away.library.AssetLibrary.removeAsset() + */ + AssetLibraryBundle.prototype.removeNamespaceAssets = function (ns, dispose) { + if (typeof ns === "undefined") { ns = null; } + if (typeof dispose === "undefined") { dispose = true; } + var idx = 0; + var asset; + var old_assets; + + // Empty the assets vector after having stored a copy of it. + // The copy will be filled with all assets which weren't removed. + old_assets = this._assets.concat(); + this._assets.length = 0; + + if (ns == null) + ns = NamedAssetBase.DEFAULT_NAMESPACE; + + for (var d = 0; d < old_assets.length; d++) { + asset = old_assets[d]; + + // Remove from dict if in the supplied namespace. If not, + // transfer over to the new vector. + if (asset.assetNamespace == ns) { + if (dispose) + asset.dispose(); + + // Remove asset from dictionary, but don't try to auto-remove + // the namespace, which will trigger an unnecessarily expensive + // test that is not needed since we know that the namespace + // will be empty when loop finishes. + this.removeAssetFromDict(asset, false); + } else { + this._assets[idx++] = asset; + } + } + + /* + for each (asset in old_assets) { + // Remove from dict if in the supplied namespace. If not, + // transfer over to the new vector. + if (asset.assetNamespace == ns) { + if (dispose) + asset.dispose(); + + // Remove asset from dictionary, but don't try to auto-remove + // the namespace, which will trigger an unnecessarily expensive + // test that is not needed since we know that the namespace + // will be empty when loop finishes. + removeAssetFromDict(asset, false); + } else + _assets[idx++] = asset; + + } + */ + // Remove empty namespace + if (this._assetDictionary.hasOwnProperty(ns)) + delete this._assetDictionary[ns]; + }; + + AssetLibraryBundle.prototype.removeAssetFromDict = function (asset, autoRemoveEmptyNamespace) { + if (typeof autoRemoveEmptyNamespace === "undefined") { autoRemoveEmptyNamespace = true; } + if (this._assetDictDirty) + this.rehashAssetDict(); + + if (this._assetDictionary.hasOwnProperty(asset.assetNamespace)) { + if (this._assetDictionary[asset.assetNamespace].hasOwnProperty(asset.name)) + delete this._assetDictionary[asset.assetNamespace][asset.name]; + + if (autoRemoveEmptyNamespace) { + var key; + var empty = true; + + for (key in this._assetDictionary[asset.assetNamespace]) { + empty = false; + break; + } + + if (empty) + delete this._assetDictionary[asset.assetNamespace]; + } + } + }; + + AssetLibraryBundle.prototype.stopAllLoadingSessions = function () { + var i; + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + var length = this._loadingSessions.length; + + for (i = 0; i < length; i++) + this.killLoadingSession(this._loadingSessions[i]); + + this._loadingSessions = null; + }; + + AssetLibraryBundle.prototype.rehashAssetDict = function () { + var asset; + + this._assetDictionary = {}; + + var l = this._assets.length; + + for (var c = 0; c < l; c++) { + asset = this._assets[c]; + + if (!this._assetDictionary.hasOwnProperty(asset.assetNamespace)) + this._assetDictionary[asset.assetNamespace] = {}; + + this._assetDictionary[asset.assetNamespace][asset.name] = asset; + } + + this._assetDictDirty = false; + }; + + /** + * Called when a an error occurs during loading. + */ + AssetLibraryBundle.prototype.onLoadError = function (event) { + if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + }; + + /** + * Called when a an error occurs during parsing. + */ + AssetLibraryBundle.prototype.onParseError = function (event) { + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + }; + + AssetLibraryBundle.prototype.onAssetComplete = function (event) { + // Only add asset to library the first time. + if (event.type == AssetEvent.ASSET_COMPLETE) + this.addAsset(event.asset); + + this.dispatchEvent(event); + }; + + AssetLibraryBundle.prototype.onTextureSizeError = function (event) { + this.dispatchEvent(event); + }; + + /** + * Called when the resource and all of its dependencies was retrieved. + */ + AssetLibraryBundle.prototype.onResourceComplete = function (event) { + var _this = this; + var loader = event.target; + + this.dispatchEvent(event); + + var index = this._loadingSessions.indexOf(loader); + this._loadingSessions.splice(index, 1); + + // Add loader to a garbage array - for a collection sweep and kill + this._loadingSessionsGarbage.push(loader); + this._gcTimeoutIID = setTimeout(function () { + _this.loadingSessionGC(); + }, 100); + }; + + AssetLibraryBundle.prototype.loadingSessionGC = function () { + var loader; + + while (this._loadingSessionsGarbage.length > 0) { + loader = this._loadingSessionsGarbage.pop(); + this.killLoadingSession(loader); + } + + clearTimeout(this._gcTimeoutIID); + this._gcTimeoutIID = null; + }; + + AssetLibraryBundle.prototype.killLoadingSession = function (loader) { + loader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + loader.stop(); + }; + + /** + * Called when unespected error occurs + */ + /* + private onResourceError() : void + { + var msg:string = "Unexpected parser error"; + if(hasEventListener(LoaderEvent.DEPENDENCY_ERROR)){ + var re:LoaderEvent = new LoaderEvent(LoaderEvent.DEPENDENCY_ERROR, ""); + dispatchEvent(re); + } else{ + throw new Error(msg); + } + } + */ + AssetLibraryBundle.prototype.onAssetRename = function (event) { + var asset = event.target; + var old = this.getAsset(asset.assetNamespace, asset.name); + + if (old != null) { + this._strategy.resolveConflict(asset, old, this._assetDictionary[asset.assetNamespace], this._strategyPreference); + } else { + var dict = this._assetDictionary[event.asset.assetNamespace]; + + if (dict == null) + return; + + dict[event.assetPrevName] = null; + dict[event.asset.name] = event.asset; + } + }; + + AssetLibraryBundle.prototype.onAssetConflictResolved = function (event) { + this.dispatchEvent(event.clone()); + }; + AssetLibraryBundle._iInstances = new Object(); + return AssetLibraryBundle; +})(EventDispatcher); + +module.exports = AssetLibraryBundle; + + +},{"awayjs-core/lib/core/library/AssetLibraryIterator":undefined,"awayjs-core/lib/core/library/AssetLoader":undefined,"awayjs-core/lib/core/library/ConflictPrecedence":undefined,"awayjs-core/lib/core/library/ConflictStrategy":undefined,"awayjs-core/lib/core/library/NamedAssetBase":undefined,"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/events/AssetEvent":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/events/IOErrorEvent":undefined,"awayjs-core/lib/events/LoaderEvent":undefined,"awayjs-core/lib/events/ParserEvent":undefined}],"awayjs-core/lib/core/library/AssetLibraryIterator":[function(require,module,exports){ +var AssetLibraryIterator = (function () { + function AssetLibraryIterator(assets, assetTypeFilter, namespaceFilter, filterFunc) { + this._assets = assets; + this.filter(assetTypeFilter, namespaceFilter, filterFunc); + } + Object.defineProperty(AssetLibraryIterator.prototype, "currentAsset", { + get: function () { + // Return current, or null if no current + return (this._idx < this._filtered.length) ? this._filtered[this._idx] : null; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(AssetLibraryIterator.prototype, "numAssets", { + get: function () { + return this._filtered.length; + }, + enumerable: true, + configurable: true + }); + + AssetLibraryIterator.prototype.next = function () { + var next = null; + + if (this._idx < this._filtered.length) + next = this._filtered[this._idx]; + + this._idx++; + + return next; + }; + + AssetLibraryIterator.prototype.reset = function () { + this._idx = 0; + }; + + AssetLibraryIterator.prototype.setIndex = function (index) { + this._idx = index; + }; + + AssetLibraryIterator.prototype.filter = function (assetTypeFilter, namespaceFilter, filterFunc) { + if (assetTypeFilter || namespaceFilter) { + var idx; + var asset; + + idx = 0; + this._filtered = new Array(); //new Vector.; + + var l = this._assets.length; + + for (var c = 0; c < l; c++) { + asset = this._assets[c]; + + // Skip this assets if filtering on type and this is wrong type + if (assetTypeFilter && asset.assetType != assetTypeFilter) + continue; + + // Skip this asset if filtering on namespace and this is wrong namespace + if (namespaceFilter && asset.assetNamespace != namespaceFilter) + continue; + + // Skip this asset if a filter func has been provided and it returns false + if (filterFunc != null && !filterFunc(asset)) + continue; + + this._filtered[idx++] = asset; + } + /* + for each (asset in _assets) { + // Skip this assets if filtering on type and this is wrong type + if (assetTypeFilter && asset.assetType != assetTypeFilter) + continue; + + // Skip this asset if filtering on namespace and this is wrong namespace + if (namespaceFilter && asset.assetNamespace != namespaceFilter) + continue; + + // Skip this asset if a filter func has been provided and it returns false + if (filterFunc != null && !filterFunc(asset)) + continue; + + _filtered[idx++] = asset; + } + */ + } else { + this._filtered = this._assets; + } + }; + return AssetLibraryIterator; +})(); + +module.exports = AssetLibraryIterator; + + +},{}],"awayjs-core/lib/core/library/AssetLibrary":[function(require,module,exports){ +var AssetLibraryBundle = require("awayjs-core/lib/core/library/AssetLibraryBundle"); + +var AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); + +/** +* AssetLibrary enforces a singleton pattern and is not intended to be instanced. +* It's purpose is to allow access to the default library bundle through a set of static shortcut methods. +* If you are interested in creating multiple library bundles, please use the getBundle() method. +*/ +var AssetLibrary = (function () { + /** + * Creates a new AssetLibrary object. + * + */ + function AssetLibrary() { + } + //*/ + /** + * Returns an AssetLibrary bundle instance. If no key is given, returns the default bundle (which is + * similar to using the AssetLibraryBundle as a singleton). To keep several separated library bundles, + * pass a string key to this method to define which bundle should be returned. This is + * referred to as using the AssetLibraryBundle as a multiton. + * + * @param key Defines which multiton instance should be returned. + * @return An instance of the asset library + */ + AssetLibrary.getBundle = function (key) { + if (typeof key === "undefined") { key = 'default'; } + return AssetLibraryBundle.getInstance(key); + }; + + /** + * + */ + AssetLibrary.enableParser = function (parserClass) { + AssetLoader.enableParser(parserClass); + }; + + /** + * + */ + AssetLibrary.enableParsers = function (parserClasses) { + AssetLoader.enableParsers(parserClasses); + }; + + Object.defineProperty(AssetLibrary, "conflictStrategy", { + /** + * Short-hand for conflictStrategy property on default asset library bundle. + * + * @see AssetLibraryBundle.conflictStrategy + */ + get: function () { + return AssetLibrary.getBundle().conflictStrategy; + }, + set: function (val) { + AssetLibrary.getBundle().conflictStrategy = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLibrary, "conflictPrecedence", { + /** + * Short-hand for conflictPrecedence property on default asset library bundle. + * + * @see AssetLibraryBundle.conflictPrecedence + */ + get: function () { + return AssetLibrary.getBundle().conflictPrecedence; + }, + set: function (val) { + AssetLibrary.getBundle().conflictPrecedence = val; + }, + enumerable: true, + configurable: true + }); + + + /** + * Short-hand for createIterator() method on default asset library bundle. + * + * @see AssetLibraryBundle.createIterator() + */ + AssetLibrary.createIterator = function (assetTypeFilter, namespaceFilter, filterFunc) { + if (typeof assetTypeFilter === "undefined") { assetTypeFilter = null; } + if (typeof namespaceFilter === "undefined") { namespaceFilter = null; } + if (typeof filterFunc === "undefined") { filterFunc = null; } + return AssetLibrary.getBundle().createIterator(assetTypeFilter, namespaceFilter, filterFunc); + }; + + /** + * Short-hand for load() method on default asset library bundle. + * + * @see AssetLibraryBundle.load() + */ + AssetLibrary.load = function (req, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + return AssetLibrary.getBundle().load(req, context, ns, parser); + }; + + /** + * Short-hand for loadData() method on default asset library bundle. + * + * @see AssetLibraryBundle.loadData() + */ + AssetLibrary.loadData = function (data, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + return AssetLibrary.getBundle().loadData(data, context, ns, parser); + }; + + AssetLibrary.stopLoad = function () { + AssetLibrary.getBundle().stopAllLoadingSessions(); + }; + + /** + * Short-hand for getAsset() method on default asset library bundle. + * + * @see AssetLibraryBundle.getAsset() + */ + AssetLibrary.getAsset = function (name, ns) { + if (typeof ns === "undefined") { ns = null; } + return AssetLibrary.getBundle().getAsset(name, ns); + }; + + /** + * Short-hand for addEventListener() method on default asset library bundle. + */ + AssetLibrary.addEventListener = function (type, listener) { + AssetLibrary.getBundle().addEventListener(type, listener); + }; + + /** + * Short-hand for removeEventListener() method on default asset library bundle. + */ + AssetLibrary.removeEventListener = function (type, listener) { + AssetLibrary.getBundle().removeEventListener(type, listener); + }; + + /** + * Short-hand for hasEventListener() method on default asset library bundle. + + public static hasEventListener(type:string):boolean + { + return AssetLibrary.getBundle().hasEventListener(type); + } + + public static willTrigger(type:string):boolean + { + return getBundle().willTrigger(type); + } + */ + /** + * Short-hand for addAsset() method on default asset library bundle. + * + * @see AssetLibraryBundle.addAsset() + */ + AssetLibrary.addAsset = function (asset) { + AssetLibrary.getBundle().addAsset(asset); + }; + + /** + * Short-hand for removeAsset() method on default asset library bundle. + * + * @param asset The asset which should be removed from the library. + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAsset() + */ + AssetLibrary.removeAsset = function (asset, dispose) { + if (typeof dispose === "undefined") { dispose = true; } + AssetLibrary.getBundle().removeAsset(asset, dispose); + }; + + /** + * Short-hand for removeAssetByName() method on default asset library bundle. + * + * @param name The name of the asset to be removed. + * @param ns The namespace to which the desired asset belongs. + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAssetByName() + */ + AssetLibrary.removeAssetByName = function (name, ns, dispose) { + if (typeof ns === "undefined") { ns = null; } + if (typeof dispose === "undefined") { dispose = true; } + return AssetLibrary.getBundle().removeAssetByName(name, ns, dispose); + }; + + /** + * Short-hand for removeAllAssets() method on default asset library bundle. + * + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAllAssets() + */ + AssetLibrary.removeAllAssets = function (dispose) { + if (typeof dispose === "undefined") { dispose = true; } + AssetLibrary.getBundle().removeAllAssets(dispose); + }; + + /** + * Short-hand for removeNamespaceAssets() method on default asset library bundle. + * + * @see AssetLibraryBundle.removeNamespaceAssets() + */ + AssetLibrary.removeNamespaceAssets = function (ns, dispose) { + if (typeof ns === "undefined") { ns = null; } + if (typeof dispose === "undefined") { dispose = true; } + AssetLibrary.getBundle().removeNamespaceAssets(ns, dispose); + }; + return AssetLibrary; +})(); + +module.exports = AssetLibrary; + + +},{"awayjs-core/lib/core/library/AssetLibraryBundle":undefined,"awayjs-core/lib/core/library/AssetLoader":undefined}],"awayjs-core/lib/core/library/AssetLoaderContext":[function(require,module,exports){ +var AssetLoaderContext = (function () { + /** + * AssetLoaderContext provides configuration for the AssetLoader load() and parse() operations. + * Use it to configure how (and if) dependencies are loaded, or to map dependency URLs to + * embedded data. + * + * @see away.loading.AssetLoader + */ + function AssetLoaderContext(includeDependencies, dependencyBaseUrl) { + if (typeof includeDependencies === "undefined") { includeDependencies = true; } + if (typeof dependencyBaseUrl === "undefined") { dependencyBaseUrl = null; } + this._includeDependencies = includeDependencies; + this._dependencyBaseUrl = dependencyBaseUrl || ''; + this._embeddedDataByUrl = {}; + this._remappedUrls = {}; + this._materialMode = AssetLoaderContext.UNDEFINED; + } + Object.defineProperty(AssetLoaderContext.prototype, "includeDependencies", { + /** + * Defines whether dependencies (all files except the one at the URL given to the load() or + * parseData() operations) should be automatically loaded. Defaults to true. + */ + get: function () { + return this._includeDependencies; + }, + set: function (val) { + this._includeDependencies = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLoaderContext.prototype, "materialMode", { + /** + * MaterialMode defines, if the Parser should create SinglePass or MultiPass Materials + * Options: + * 0 (Default / undefined) - All Parsers will create SinglePassMaterials, but the AWD2.1parser will create Materials as they are defined in the file + * 1 (Force SinglePass) - All Parsers create SinglePassMaterials + * 2 (Force MultiPass) - All Parsers will create MultiPassMaterials + * + */ + get: function () { + return this._materialMode; + }, + set: function (materialMode) { + this._materialMode = materialMode; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLoaderContext.prototype, "dependencyBaseUrl", { + /** + * A base URL that will be prepended to all relative dependency URLs found in a loaded resource. + * Absolute paths will not be affected by the value of this property. + */ + get: function () { + return this._dependencyBaseUrl; + }, + set: function (val) { + this._dependencyBaseUrl = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLoaderContext.prototype, "overrideAbsolutePaths", { + /** + * Defines whether absolute paths (defined as paths that begin with a "/") should be overridden + * with the dependencyBaseUrl defined in this context. If this is true, and the base path is + * "base", /path/to/asset.jpg will be resolved as base/path/to/asset.jpg. + */ + get: function () { + return this._overrideAbsPath; + }, + set: function (val) { + this._overrideAbsPath = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLoaderContext.prototype, "overrideFullURLs", { + /** + * Defines whether "full" URLs (defined as a URL that includes a scheme, e.g. http://) should be + * overridden with the dependencyBaseUrl defined in this context. If this is true, and the base + * path is "base", http://example.com/path/to/asset.jpg will be resolved as base/path/to/asset.jpg. + */ + get: function () { + return this._overrideFullUrls; + }, + set: function (val) { + this._overrideFullUrls = val; + }, + enumerable: true, + configurable: true + }); + + + /** + * Map a URL to another URL, so that files that are referred to by the original URL will instead + * be loaded from the new URL. Use this when your file structure does not match the one that is + * expected by the loaded file. + * + * @param originalUrl The original URL which is referenced in the loaded resource. + * @param newUrl The URL from which away.should load the resource instead. + * + * @see mapUrlToData() + */ + AssetLoaderContext.prototype.mapUrl = function (originalUrl, newUrl) { + this._remappedUrls[originalUrl] = newUrl; + }; + + /** + * Map a URL to embedded data, so that instead of trying to load a dependency from the URL at + * which it's referenced, the dependency data will be retrieved straight from the memory instead. + * + * @param originalUrl The original URL which is referenced in the loaded resource. + * @param data The embedded data. Can be ByteArray or a class which can be used to create a bytearray. + */ + AssetLoaderContext.prototype.mapUrlToData = function (originalUrl, data) { + this._embeddedDataByUrl[originalUrl] = data; + }; + + /** + * @private + * Defines whether embedded data has been mapped to a particular URL. + */ + AssetLoaderContext.prototype._iHasDataForUrl = function (url) { + return this._embeddedDataByUrl.hasOwnProperty(url); + }; + + /** + * @private + * Returns embedded data for a particular URL. + */ + AssetLoaderContext.prototype._iGetDataForUrl = function (url) { + return this._embeddedDataByUrl[url]; + }; + + /** + * @private + * Defines whether a replacement URL has been mapped to a particular URL. + */ + AssetLoaderContext.prototype._iHasMappingForUrl = function (url) { + return this._remappedUrls.hasOwnProperty(url); + }; + + /** + * @private + * Returns new (replacement) URL for a particular original URL. + */ + AssetLoaderContext.prototype._iGetRemappedUrl = function (originalUrl) { + return this._remappedUrls[originalUrl]; + }; + AssetLoaderContext.UNDEFINED = 0; + AssetLoaderContext.SINGLEPASS_MATERIALS = 1; + AssetLoaderContext.MULTIPASS_MATERIALS = 2; + return AssetLoaderContext; +})(); + +module.exports = AssetLoaderContext; + + +},{}],"awayjs-core/lib/core/library/AssetLoaderToken":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +/** +* Dispatched when any asset finishes parsing. Also see specific events for each +* individual asset type (meshes, materials et c.) +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="assetComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a full resource (including dependencies) finishes loading. +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] +/** +* Dispatched when a single dependency (which may be the main file of a resource) +* finishes loading. +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] +/** +* Dispatched when an error occurs during loading. I +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="loadError", type="away3d.events.LoaderEvent")] +/** +* Dispatched when an error occurs during parsing. +* +* @eventType away.events.ParserEvent +*/ +//[Event(name="parseError", type="away3d.events.ParserEvent")] +/** +* Dispatched when a skybox asset has been costructed from a ressource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="skyboxComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a camera3d asset has been costructed from a ressource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="cameraComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a mesh asset has been costructed from a ressource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="meshComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a geometry asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="geometryComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a skeleton asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="skeletonComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a skeleton pose asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="skeletonPoseComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a container asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="containerComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a texture asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="textureComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a texture projector asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="textureProjectorComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a material asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="materialComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a animator asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="animatorComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an animation set has been constructed from a group of animation state resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="animationSetComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an animation state has been constructed from a group of animation node resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="animationStateComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an animation node has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="animationNodeComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an animation state transition has been constructed from a group of animation node resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="stateTransitionComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an light asset has been constructed from a resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="lightComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an light picker asset has been constructed from a resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="lightPickerComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an effect method asset has been constructed from a resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="effectMethodComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an shadow map method asset has been constructed from a resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="shadowMapMethodComplete", type="away3d.events.AssetEvent")] +/** +* Instances of this class are returned as tokens by loading operations +* to provide an object on which events can be listened for in cases where +* the actual asset loader is not directly available (e.g. when using the +* AssetLibrary to perform the load.) +* +* By listening for events on this class instead of directly on the +* AssetLibrary, one can distinguish different loads from each other. +* +* The token will dispatch all events that the original AssetLoader dispatches, +* while not providing an interface to obstruct the load and is as such a +* safer return value for loader wrappers than the loader itself. +*/ +var AssetLoaderToken = (function (_super) { + __extends(AssetLoaderToken, _super); + function AssetLoaderToken(loader) { + _super.call(this); + + this._iLoader = loader; + } + AssetLoaderToken.prototype.addEventListener = function (type, listener) { + this._iLoader.addEventListener(type, listener); + }; + + AssetLoaderToken.prototype.removeEventListener = function (type, listener) { + this._iLoader.removeEventListener(type, listener); + }; + + AssetLoaderToken.prototype.hasEventListener = function (type, listener) { + if (typeof listener === "undefined") { listener = null; } + return this._iLoader.hasEventListener(type, listener); + }; + return AssetLoaderToken; +})(EventDispatcher); + +module.exports = AssetLoaderToken; + + +},{"awayjs-core/lib/events/EventDispatcher":undefined}],"awayjs-core/lib/core/library/AssetLoader":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); +var URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); + +var Error = require("awayjs-core/lib/errors/Error"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var Event = require("awayjs-core/lib/events/Event"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +var CubeTextureParser = require("awayjs-core/lib/parsers/CubeTextureParser"); + +var ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); +var Texture2DParser = require("awayjs-core/lib/parsers/Texture2DParser"); + +/** +* Dispatched when any asset finishes parsing. Also see specific events for each +* individual asset type (meshes, materials et c.) +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="assetComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a full resource (including dependencies) finishes loading. +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] +/** +* Dispatched when a single dependency (which may be the main file of a resource) +* finishes loading. +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] +/** +* Dispatched when an error occurs during loading. I +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="loadError", type="away3d.events.LoaderEvent")] +/** +* Dispatched when an error occurs during parsing. +* +* @eventType away.events.ParserEvent +*/ +//[Event(name="parseError", type="away3d.events.ParserEvent")] +/** +* Dispatched when an image asset dimensions are not a power of 2 +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="textureSizeError", type="away3d.events.AssetEvent")] +/** +* AssetLoader can load any file format that away.supports (or for which a third-party parser +* has been plugged in) and it's dependencies. Events are dispatched when assets are encountered +* and for when the resource (or it's dependencies) have been loaded. +* +* The AssetLoader will not make assets available in any other way than through the dispatched +* events. To store assets and make them available at any point from any module in an application, +* use the AssetLibrary to load and manage assets. +* +* @see away.library.AssetLibrary +*/ +var AssetLoader = (function (_super) { + __extends(AssetLoader, _super); + /** + * Create a new ResourceLoadSession object. + */ + function AssetLoader(materialMode) { + if (typeof materialMode === "undefined") { materialMode = 0; } + var _this = this; + _super.call(this); + + this._materialMode = materialMode; + + this._stack = new Array(); + this._errorHandlers = new Array(); + this._parseErrorHandlers = new Array(); + + this._onReadyForDependenciesDelegate = function (event) { + return _this.onReadyForDependencies(event); + }; + this._onParseCompleteDelegate = function (event) { + return _this.onParseComplete(event); + }; + this._onParseErrorDelegate = function (event) { + return _this.onParseError(event); + }; + this._onLoadCompleteDelegate = function (event) { + return _this.onLoadComplete(event); + }; + this._onLoadErrorDelegate = function (event) { + return _this.onLoadError(event); + }; + this._onTextureSizeErrorDelegate = function (event) { + return _this.onTextureSizeError(event); + }; + this._onAssetCompleteDelegate = function (event) { + return _this.onAssetComplete(event); + }; + } + /** + * Enables a specific parser. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parser The parser class to enable. + * + * @see away.parsers.Parsers + */ + AssetLoader.enableParser = function (parser) { + if (AssetLoader._parsers.indexOf(parser) < 0) + AssetLoader._parsers.push(parser); + }; + + /** + * Enables a list of parsers. + * When no specific parser is set for a loading/parsing opperation, + * AssetLoader can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parsers A Vector of parser classes to enable. + * @see away.parsers.Parsers + */ + AssetLoader.enableParsers = function (parsers) { + for (var c = 0; c < parsers.length; c++) + AssetLoader.enableParser(parsers[c]); + }; + + Object.defineProperty(AssetLoader.prototype, "baseDependency", { + /** + * Returns the base dependency of the loader + */ + get: function () { + return this._baseDependency; + }, + enumerable: true, + configurable: true + }); + + /** + * Loads a file and (optionally) all of its dependencies. + * + * @param req The URLRequest object containing the URL of the file to be loaded. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + */ + AssetLoader.prototype.load = function (req, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + if (!this._token) { + this._token = new AssetLoaderToken(this); + + this._uri = req.url = req.url.replace(/\\/g, "/"); + this._context = context; + this._namespace = ns; + + this._baseDependency = new ResourceDependency('', req, null, parser, null); + this.retrieveDependency(this._baseDependency); + + return this._token; + } + + // TODO: Throw error (already loading) + return null; + }; + + /** + * Loads a resource from already loaded data. + * + * @param data The data object containing all resource information. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + */ + AssetLoader.prototype.loadData = function (data, id, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + if (!this._token) { + this._token = new AssetLoaderToken(this); + + this._uri = id; + this._context = context; + this._namespace = ns; + + this._baseDependency = new ResourceDependency(id, null, data, parser, null); + this.retrieveDependency(this._baseDependency); + + return this._token; + } + + // TODO: Throw error (already loading) + return null; + }; + + /** + * Recursively retrieves the next to-be-loaded and parsed dependency on the stack, or pops the list off the + * stack when complete and continues on the top set. + * @param parser The parser that will translate the data into a usable resource. + */ + AssetLoader.prototype.retrieveNext = function (parser) { + if (typeof parser === "undefined") { parser = null; } + if (this._currentDependency.dependencies.length) { + var next = this._currentDependency.dependencies.pop(); + + this._stack.push(this._currentDependency); + this.retrieveDependency(next); + } else if (this._currentDependency.parser && this._currentDependency.parser.parsingPaused) { + this._currentDependency.parser._iResumeParsingAfterDependencies(); + this._stack.pop(); + } else if (this._stack.length) { + var prev = this._currentDependency; + + this._currentDependency = this._stack.pop(); + + if (prev._iSuccess) + prev.resolve(); + + this.retrieveNext(parser); + } else { + this.dispatchEvent(new LoaderEvent(LoaderEvent.RESOURCE_COMPLETE, this._uri, this._baseDependency.parser.content, this._baseDependency.assets)); + } + }; + + /** + * Retrieves a single dependency. + * @param parser The parser that will translate the data into a usable resource. + */ + AssetLoader.prototype.retrieveDependency = function (dependency) { + var data; + + if (this._context && this._context.materialMode != 0) + this._materialMode = this._context.materialMode; + + this._currentDependency = dependency; + + dependency._iLoader = new URLLoader(); + + this.addEventListeners(dependency._iLoader); + + // Get already loaded (or mapped) data if available + data = dependency.data; + + if (this._context && dependency.request && this._context._iHasDataForUrl(dependency.request.url)) + data = this._context._iGetDataForUrl(dependency.request.url); + + if (data) { + if (data.constructor === Function) + data = new data(); + + dependency._iSetData(data); + + if (dependency.retrieveAsRawData) { + // No need to parse. The parent parser is expecting this + // to be raw data so it can be passed directly. + dependency.resolve(); + + // Move on to next dependency + this.retrieveNext(); + } else { + this.parseDependency(dependency); + } + } else { + // Resolve URL and start loading + dependency.request.url = this.resolveDependencyUrl(dependency); + + if (dependency.retrieveAsRawData) { + // Always use binary for raw data loading + dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; + } else { + if (!dependency.parser) + dependency._iSetParser(this.getParserFromSuffix(dependency.request.url)); + + if (dependency.parser) { + dependency._iLoader.dataFormat = dependency.parser.dataFormat; + } else { + // Always use BINARY for unknown file formats. The thorough + // file type check will determine format after load, and if + // binary, a text load will have broken the file data. + dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; + } + } + + dependency._iLoader.load(dependency.request); + } + }; + + AssetLoader.prototype.joinUrl = function (base, end) { + if (end.charAt(0) == '/') + end = end.substr(1); + + if (base.length == 0) + return end; + + if (base.charAt(base.length - 1) == '/') + base = base.substr(0, base.length - 1); + + return base.concat('/', end); + }; + + AssetLoader.prototype.resolveDependencyUrl = function (dependency) { + var scheme_re; + var base; + var url = dependency.request.url; + + // Has the user re-mapped this URL? + if (this._context && this._context._iHasMappingForUrl(url)) + return this._context._iGetRemappedUrl(url); + + // This is the "base" dependency, i.e. the actual requested asset. + // We will not try to resolve this since the user can probably be + // thrusted to know this URL better than our automatic resolver. :) + if (url == this._uri) + return url; + + // Absolute URL? Check if starts with slash or a URL + // scheme definition (e.g. ftp://, http://, file://) + scheme_re = new RegExp('/^[a-zA-Z]{3,4}:\/\//'); + + if (url.charAt(0) == '/') { + if (this._context && this._context.overrideAbsolutePaths) + return this.joinUrl(this._context.dependencyBaseUrl, url); + else + return url; + } else if (scheme_re.test(url)) { + // If overriding full URLs, get rid of scheme (e.g. "http://") + // and replace with the dependencyBaseUrl defined by user. + if (this._context && this._context.overrideFullURLs) { + var noscheme_url = url.replace(scheme_re, ''); + return this.joinUrl(this._context.dependencyBaseUrl, noscheme_url); + } + } + + // Since not absolute, just get rid of base file name to find it's + // folder and then concatenate dynamic URL + if (this._context && this._context.dependencyBaseUrl) { + base = this._context.dependencyBaseUrl; + return this.joinUrl(base, url); + } else { + base = this._uri.substring(0, this._uri.lastIndexOf('/') + 1); + return this.joinUrl(base, url); + } + }; + + AssetLoader.prototype.retrieveParserDependencies = function () { + if (!this._currentDependency) + return; + + var parserDependancies = this._currentDependency.parser.dependencies; + var i, len = parserDependancies.length; + + for (i = 0; i < len; i++) + this._currentDependency.dependencies[i] = parserDependancies[i]; + + // Since more dependencies might be added eventually, empty this + // list so that the same dependency isn't retrieved more than once. + parserDependancies.length = 0; + + this._stack.push(this._currentDependency); + + this.retrieveNext(); + }; + + AssetLoader.prototype.resolveParserDependencies = function () { + this._currentDependency._iSuccess = true; + + // Retrieve any last dependencies remaining on this parser, or + // if none exists, just move on. + if (this._currentDependency.parser && this._currentDependency.parser.dependencies.length && (!this._context || this._context.includeDependencies)) + this.retrieveParserDependencies(); + else + this.retrieveNext(); + }; + + /** + * Called when a single dependency loading failed, and pushes further dependencies onto the stack. + * @param event + */ + AssetLoader.prototype.onLoadError = function (event) { + var handled; + var isDependency = (this._currentDependency != this._baseDependency); + var loader = event.target; + + this.removeEventListeners(loader); + + if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { + this.dispatchEvent(event); + handled = true; + } else { + // TODO: Consider not doing this even when AssetLoader does have it's own LOAD_ERROR listener + var i, len = this._errorHandlers.length; + for (i = 0; i < len; i++) + if (!handled) + handled = this._errorHandlers[i](event); + } + + if (handled) { + //if (isDependency && ! event.isDefaultPrevented()) { + if (isDependency) { + this._currentDependency.resolveFailure(); + this.retrieveNext(); + } else { + // Either this was the base file (last left in the stack) or + // default behavior was prevented by the handlers, and hence + // there is nothing more to do than clean up and bail. + this.dispose(); + return; + } + } else { + throw new Error(); + } + }; + + /** + * Called when a dependency parsing failed, and dispatches a ParserEvent.PARSE_ERROR + * @param event + */ + AssetLoader.prototype.onParseError = function (event) { + var handled; + + var isDependency = (this._currentDependency != this._baseDependency); + + var loader = event.target; + + this.removeEventListeners(loader); + + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + handled = true; + } else { + // TODO: Consider not doing this even when AssetLoader does + // have it's own LOAD_ERROR listener + var i, len = this._parseErrorHandlers.length; + + for (i = 0; i < len; i++) + if (!handled) + handled = this._parseErrorHandlers[i](event); + } + + if (handled) { + this.dispose(); + return; + } else { + throw new Error(event.message); + } + }; + + AssetLoader.prototype.onAssetComplete = function (event) { + // Add loaded asset to list of assets retrieved as part + // of the current dependency. This list will be inspected + // by the parent parser when dependency is resolved + if (this._currentDependency) + this._currentDependency.assets.push(event.asset); + + event.asset.resetAssetPath(event.asset.name, this._namespace); + + if (!this._currentDependency.suppresAssetEvents) + this.dispatchEvent(event); + }; + + AssetLoader.prototype.onReadyForDependencies = function (event) { + var parser = event.target; + + if (this._context && !this._context.includeDependencies) + parser._iResumeParsingAfterDependencies(); + else + this.retrieveParserDependencies(); + }; + + /** + * Called when a single dependency was parsed, and pushes further dependencies onto the stack. + * @param event + */ + AssetLoader.prototype.onLoadComplete = function (event) { + var loader = event.target; + + this.removeEventListeners(loader); + + // Resolve this dependency + this._currentDependency._iSetData(loader.data); + + if (this._currentDependency.retrieveAsRawData) { + // No need to parse this data, which should be returned as is + this.resolveParserDependencies(); + } else { + this.parseDependency(this._currentDependency); + } + }; + + /** + * Called when parsing is complete. + */ + AssetLoader.prototype.onParseComplete = function (event) { + var parser = event.target; + + this.resolveParserDependencies(); //resolve in front of removing listeners to allow any remaining asset events to propagate + + parser.removeEventListener(ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); + parser.removeEventListener(ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); + parser.removeEventListener(ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); + parser.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + parser.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + }; + + /** + * Called when an image is too large or it's dimensions are not a power of 2 + * @param event + */ + AssetLoader.prototype.onTextureSizeError = function (event) { + event.asset.name = this._currentDependency.resolveName(event.asset); + + this.dispatchEvent(event); + }; + + AssetLoader.prototype.addEventListeners = function (loader) { + loader.addEventListener(Event.COMPLETE, this._onLoadCompleteDelegate); + loader.addEventListener(IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); + }; + + AssetLoader.prototype.removeEventListeners = function (loader) { + loader.removeEventListener(Event.COMPLETE, this._onLoadCompleteDelegate); + loader.removeEventListener(IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); + }; + + AssetLoader.prototype.stop = function () { + this.dispose(); + }; + + AssetLoader.prototype.dispose = function () { + this._errorHandlers = null; + this._parseErrorHandlers = null; + this._context = null; + this._token = null; + this._stack = null; + + if (this._currentDependency && this._currentDependency._iLoader) + this.removeEventListeners(this._currentDependency._iLoader); + + this._currentDependency = null; + }; + + /** + * @private + * This method is used by other loader classes (e.g. Loader3D and AssetLibraryBundle) to + * add error event listeners to the AssetLoader instance. This system is used instead of + * the regular EventDispatcher system so that the AssetLibrary error handler can be sure + * that if hasEventListener() returns true, it's client code that's listening for the + * event. Secondly, functions added as error handler through this custom method are + * expected to return a boolean value indicating whether the event was handled (i.e. + * whether they in turn had any client code listening for the event.) If no handlers + * return true, the AssetLoader knows that the event wasn't handled and will throw an RTE. + */ + AssetLoader.prototype._iAddParseErrorHandler = function (handler) { + if (this._parseErrorHandlers.indexOf(handler) < 0) + this._parseErrorHandlers.push(handler); + }; + + AssetLoader.prototype._iAddErrorHandler = function (handler) { + if (this._errorHandlers.indexOf(handler) < 0) + this._errorHandlers.push(handler); + }; + + /** + * Guesses the parser to be used based on the file contents. + * @param data The data to be parsed. + * @param uri The url or id of the object to be parsed. + * @return An instance of the guessed parser. + */ + AssetLoader.prototype.getParserFromData = function (data) { + var len = AssetLoader._parsers.length; + + for (var i = len - 1; i >= 0; i--) + if (AssetLoader._parsers[i].supportsData(data)) + return new AssetLoader._parsers[i](); + + return null; + }; + + /** + * Initiates parsing of the loaded dependency. + * + * @param The dependency to be parsed. + */ + AssetLoader.prototype.parseDependency = function (dependency) { + var parser = dependency.parser; + + // If no parser has been defined, try to find one by letting + // all plugged in parsers inspect the actual data. + if (!parser) + dependency._iSetParser(parser = this.getParserFromData(dependency.data)); + + if (parser) { + parser.addEventListener(ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); + parser.addEventListener(ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); + parser.addEventListener(ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); + parser.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + parser.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + if (dependency.request && dependency.request.url) + parser._iFileName = dependency.request.url; + + parser.materialMode = this._materialMode; + + parser.parseAsync(dependency.data); + } else { + var message = "No parser defined. To enable all parsers for auto-detection, use Parsers.enableAllBundled()"; + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message)); + else + throw new Error(message); + } + }; + + /** + * Guesses the parser to be used based on the file extension. + * @return An instance of the guessed parser. + */ + AssetLoader.prototype.getParserFromSuffix = function (url) { + // Get rid of query string if any and extract extension + var base = (url.indexOf('?') > 0) ? url.split('?')[0] : url; + var fileExtension = base.substr(base.lastIndexOf('.') + 1).toLowerCase(); + + var len = AssetLoader._parsers.length; + + for (var i = len - 1; i >= 0; i--) { + var parserClass = AssetLoader._parsers[i]; + if (parserClass.supportsType(fileExtension)) + return new parserClass(); + } + + return null; + }; + AssetLoader._parsers = new Array(Texture2DParser, CubeTextureParser); + return AssetLoader; +})(EventDispatcher); + +module.exports = AssetLoader; + + +},{"awayjs-core/lib/core/library/AssetLoaderToken":undefined,"awayjs-core/lib/core/net/URLLoader":undefined,"awayjs-core/lib/core/net/URLLoaderDataFormat":undefined,"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/events/AssetEvent":undefined,"awayjs-core/lib/events/Event":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/events/IOErrorEvent":undefined,"awayjs-core/lib/events/LoaderEvent":undefined,"awayjs-core/lib/events/ParserEvent":undefined,"awayjs-core/lib/parsers/CubeTextureParser":undefined,"awayjs-core/lib/parsers/ResourceDependency":undefined,"awayjs-core/lib/parsers/Texture2DParser":undefined}],"awayjs-core/lib/core/library/AssetType":[function(require,module,exports){ +var AssetType = (function () { + function AssetType() { + } + AssetType.ANIMATION_NODE = 'animationNode'; + AssetType.ANIMATION_SET = 'animationSet'; + AssetType.ANIMATION_STATE = 'animationState'; + AssetType.ANIMATOR = 'animator'; + AssetType.BILLBOARD = 'billboard'; + AssetType.CAMERA = 'camera'; + AssetType.CONTAINER = 'container'; + AssetType.EFFECTS_METHOD = 'effectsMethod'; + AssetType.GEOMETRY = 'geometry'; + AssetType.LINE_SEGMENT = 'lineSegment'; + AssetType.LIGHT = 'light'; + AssetType.LIGHT_PICKER = 'lightPicker'; + AssetType.MATERIAL = 'material'; + AssetType.MESH = 'mesh'; + AssetType.TRIANGLE_SUB_MESH = 'triangleSubMesh'; + AssetType.LINE_SUB_MESH = 'lineSubMesh'; + AssetType.PRIMITIVE_PREFAB = 'primitivePrefab'; + AssetType.SHADOW_MAP_METHOD = 'shadowMapMethod'; + AssetType.SKELETON = 'skeleton'; + AssetType.SKELETON_POSE = 'skeletonPose'; + AssetType.SKYBOX = 'skybox'; + AssetType.STATE_TRANSITION = 'stateTransition'; + AssetType.TEXTURE = 'texture'; + AssetType.TEXTURE_PROJECTOR = 'textureProjector'; + return AssetType; +})(); + +module.exports = AssetType; + + +},{}],"awayjs-core/lib/core/library/ConflictPrecedence":[function(require,module,exports){ +/** +* Enumaration class for precedence when resolving naming conflicts in the library. +* +* @see away.library.AssetLibrary.conflictPrecedence +* @see away.library.AssetLibrary.conflictStrategy +* @see away.library.naming.ConflictStrategy +*/ +var ConflictPrecedence = (function () { + function ConflictPrecedence() { + } + ConflictPrecedence.FAVOR_OLD = 'favorOld'; + + ConflictPrecedence.FAVOR_NEW = 'favorNew'; + return ConflictPrecedence; +})(); + +module.exports = ConflictPrecedence; + + +},{}],"awayjs-core/lib/core/library/ConflictStrategyBase":[function(require,module,exports){ +var ConflictPrecedence = require("awayjs-core/lib/core/library/ConflictPrecedence"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); + +/** +* Abstract base class for naming conflict resolution classes. Extend this to create a +* strategy class which the asset library can use to resolve asset naming conflicts, or +* use one of the bundled concrete strategy classes: +* +*
    +*
  • IgnoreConflictStrategy (ConflictStrategy.IGNORE)
  • +*
  • ErrorConflictStrategy (ConflictStrategy.THROW_ERROR)
  • +*
  • NumSuffixConflictStrategy (ConflictStrategy.APPEND_NUM_SUFFIX)
  • +*
+* +* @see away.library.AssetLibrary.conflictStrategy +* @see away.library.ConflictStrategy +* @see away.library.IgnoreConflictStrategy +* @see away.library.ErrorConflictStrategy +* @see away.library.NumSuffixConflictStrategy +*/ +var ConflictStrategyBase = (function () { + function ConflictStrategyBase() { + } + /** + * Resolve a naming conflict between two assets. Must be implemented by concrete strategy + * classes. + */ + ConflictStrategyBase.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { + throw new AbstractMethodError(); + }; + + /** + * Create instance of this conflict strategy. Used internally by the AssetLibrary to + * make sure the same strategy instance is not used in all AssetLibrary instances, which + * would break any state caching that happens inside the strategy class. + */ + ConflictStrategyBase.prototype.create = function () { + throw new AbstractMethodError(); + }; + + /** + * Provided as a convenience method for all conflict strategy classes, as a way to finalize + * the conflict resolution by applying the new names and dispatching the correct events. + */ + ConflictStrategyBase.prototype._pUpdateNames = function (ns, nonConflictingName, oldAsset, newAsset, assetsDictionary, precedence) { + var loser_prev_name; + var winner; + var loser; + + winner = (precedence === ConflictPrecedence.FAVOR_NEW) ? newAsset : oldAsset; + loser = (precedence === ConflictPrecedence.FAVOR_NEW) ? oldAsset : newAsset; + + loser_prev_name = loser.name; + + assetsDictionary[winner.name] = winner; + assetsDictionary[nonConflictingName] = loser; + loser.resetAssetPath(nonConflictingName, ns, false); + + loser.dispatchEvent(new AssetEvent(AssetEvent.ASSET_CONFLICT_RESOLVED, loser, loser_prev_name)); + }; + return ConflictStrategyBase; +})(); + +module.exports = ConflictStrategyBase; + + +},{"awayjs-core/lib/core/library/ConflictPrecedence":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/events/AssetEvent":undefined}],"awayjs-core/lib/core/library/ConflictStrategy":[function(require,module,exports){ +var ErrorConflictStrategy = require("awayjs-core/lib/core/library/ErrorConflictStrategy"); +var IgnoreConflictStrategy = require("awayjs-core/lib/core/library/IgnoreConflictStrategy"); +var NumSuffixConflictStrategy = require("awayjs-core/lib/core/library/NumSuffixConflictStrategy"); + +/** +* Enumeration class for bundled conflict strategies. Set one of these values (or an +* instance of a self-defined sub-class of ConflictStrategyBase) to the conflictStrategy +* property on an AssetLibrary to define how that library resolves naming conflicts. +* +* The value of the AssetLibrary.conflictPrecedence property defines which +* of the conflicting assets will get to keep it's name, and which is renamed (if any.) +* +* @see away.library.AssetLibrary.conflictStrategy +* @see away.library.naming.ConflictStrategyBase +*/ +var ConflictStrategy = (function () { + function ConflictStrategy(include) { + //TODO: find out why typescript d.ts files do not include this class + } + ConflictStrategy.APPEND_NUM_SUFFIX = new NumSuffixConflictStrategy(); + + ConflictStrategy.IGNORE = new IgnoreConflictStrategy(); + + ConflictStrategy.THROW_ERROR = new ErrorConflictStrategy(); + return ConflictStrategy; +})(); + +module.exports = ConflictStrategy; + + +},{"awayjs-core/lib/core/library/ErrorConflictStrategy":undefined,"awayjs-core/lib/core/library/IgnoreConflictStrategy":undefined,"awayjs-core/lib/core/library/NumSuffixConflictStrategy":undefined}],"awayjs-core/lib/core/library/ErrorConflictStrategy":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + +var Error = require("awayjs-core/lib/errors/Error"); + +var ErrorConflictStrategy = (function (_super) { + __extends(ErrorConflictStrategy, _super); + function ErrorConflictStrategy() { + _super.call(this); + } + ErrorConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { + throw new Error('Asset name collision while AssetLibrary.namingStrategy set to AssetLibrary.THROW_ERROR. Asset path: ' + changedAsset.assetFullPath); + }; + + ErrorConflictStrategy.prototype.create = function () { + return new ErrorConflictStrategy(); + }; + return ErrorConflictStrategy; +})(ConflictStrategyBase); + +module.exports = ErrorConflictStrategy; + + +},{"awayjs-core/lib/core/library/ConflictStrategyBase":undefined,"awayjs-core/lib/errors/Error":undefined}],"awayjs-core/lib/core/library/IAsset":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/library/IDUtil":[function(require,module,exports){ +var IDUtil = (function () { + function IDUtil() { + } + /** + * Generates a UID (unique identifier) based on ActionScript's + * pseudo-random number generator and the current time. + * + *

The UID has the form + * "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" + * where X is a hexadecimal digit (0-9, A-F).

+ * + *

This UID will not be truly globally unique; but it is the best + * we can do without player support for UID generation.

+ * + * @return The newly-generated UID. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + IDUtil.createUID = function () { + var uid = new Array(36); + var index = 0; + + var i; + var j; + + for (i = 0; i < 8; i++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; + + for (i = 0; i < 3; i++) { + uid[index++] = 45; // charCode for "-" + + for (j = 0; j < 4; j++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; + } + + uid[index++] = 45; // charCode for "-" + + var time = new Date().getTime(); + + // Note: time is the number of milliseconds since 1970, + // which is currently more than one trillion. + // We use the low 8 hex digits of this number in the UID. + // Just in case the system clock has been reset to + // Jan 1-4, 1970 (in which case this number could have only + // 1-7 hex digits), we pad on the left with 7 zeros + // before taking the low digits. + var timeString = ("0000000" + time.toString(16).toUpperCase()).substr(-8); + + for (i = 0; i < 8; i++) + uid[index++] = timeString.charCodeAt(i); + + for (i = 0; i < 4; i++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; + + return String.fromCharCode.apply(null, uid); + }; + IDUtil.ALPHA_CHAR_CODES = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70]; + return IDUtil; +})(); + +module.exports = IDUtil; + + +},{}],"awayjs-core/lib/core/library/IgnoreConflictStrategy":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + +var IgnoreConflictStrategy = (function (_super) { + __extends(IgnoreConflictStrategy, _super); + function IgnoreConflictStrategy() { + _super.call(this); + } + IgnoreConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { + // Do nothing, ignore the fact that there is a conflict. + return; + }; + + IgnoreConflictStrategy.prototype.create = function () { + return new IgnoreConflictStrategy(); + }; + return IgnoreConflictStrategy; +})(ConflictStrategyBase); + +module.exports = IgnoreConflictStrategy; + + +},{"awayjs-core/lib/core/library/ConflictStrategyBase":undefined}],"awayjs-core/lib/core/library/NamedAssetBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +var NamedAssetBase = (function (_super) { + __extends(NamedAssetBase, _super); + function NamedAssetBase(name) { + if (typeof name === "undefined") { name = null; } + _super.call(this); + + this._id = NamedAssetBase.ID_COUNT++; + + if (name == null) + name = 'null'; + + this._name = name; + this._originalName = name; + + this.updateFullPath(); + } + Object.defineProperty(NamedAssetBase.prototype, "assetType", { + /** + * + */ + get: function () { + throw new AbstractMethodError(); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NamedAssetBase.prototype, "originalName", { + /** + * The original name used for this asset in the resource (e.g. file) in which + * it was found. This may not be the same as name, which may + * have changed due to of a name conflict. + */ + get: function () { + return this._originalName; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NamedAssetBase.prototype, "id", { + /** + * A unique id for the asset, used to identify assets in an associative array + */ + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NamedAssetBase.prototype, "name", { + get: function () { + return this._name; + }, + set: function (val) { + var prev; + + prev = this._name; + this._name = val; + + if (this._name == null) + this._name = 'null'; + + this.updateFullPath(); + + //if (hasEventListener(AssetEvent.ASSET_RENAME)) + this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_RENAME, this, prev)); + }, + enumerable: true, + configurable: true + }); + + + NamedAssetBase.prototype.dispose = function () { + throw new AbstractMethodError(); + }; + + Object.defineProperty(NamedAssetBase.prototype, "assetNamespace", { + get: function () { + return this._namespace; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NamedAssetBase.prototype, "assetFullPath", { + get: function () { + return this._full_path; + }, + enumerable: true, + configurable: true + }); + + NamedAssetBase.prototype.assetPathEquals = function (name, ns) { + return (this._name == name && (!ns || this._namespace == ns)); + }; + + NamedAssetBase.prototype.resetAssetPath = function (name, ns, overrideOriginal) { + if (typeof ns === "undefined") { ns = null; } + if (typeof overrideOriginal === "undefined") { overrideOriginal = true; } + this._name = name ? name : 'null'; + this._namespace = ns ? ns : NamedAssetBase.DEFAULT_NAMESPACE; + + if (overrideOriginal) + this._originalName = this._name; + + this.updateFullPath(); + }; + + NamedAssetBase.prototype.updateFullPath = function () { + this._full_path = [this._namespace, this._name]; + }; + NamedAssetBase.ID_COUNT = 0; + + NamedAssetBase.DEFAULT_NAMESPACE = 'default'; + return NamedAssetBase; +})(EventDispatcher); + +module.exports = NamedAssetBase; + + +},{"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/events/AssetEvent":undefined,"awayjs-core/lib/events/EventDispatcher":undefined}],"awayjs-core/lib/core/library/NumSuffixConflictStrategy":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + +var NumSuffixConflictStrategy = (function (_super) { + __extends(NumSuffixConflictStrategy, _super); + function NumSuffixConflictStrategy(separator) { + if (typeof separator === "undefined") { separator = '.'; } + _super.call(this); + + this._separator = separator; + this._next_suffix = {}; + } + NumSuffixConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { + var orig; + var new_name; + var base; + var suffix; + + orig = changedAsset.name; + + if (orig.indexOf(this._separator) >= 0) { + // Name has an ocurrence of the separator, so get base name and suffix, + // unless suffix is non-numerical, in which case revert to zero and + // use entire name as base + base = orig.substring(0, orig.lastIndexOf(this._separator)); + suffix = parseInt(orig.substring(base.length - 1)); + + if (isNaN(suffix)) { + base = orig; + suffix = 0; + } + } else { + base = orig; + suffix = 0; + } + + if (suffix == 0 && this._next_suffix.hasOwnProperty(base)) { + suffix = this._next_suffix[base]; + } + + do { + suffix++; + + new_name = base.concat(this._separator, suffix.toString()); + } while(assetsDictionary.hasOwnProperty(new_name)); + + this._next_suffix[base] = suffix; + this._pUpdateNames(oldAsset.assetNamespace, new_name, oldAsset, changedAsset, assetsDictionary, precedence); + }; + + NumSuffixConflictStrategy.prototype.create = function () { + return new NumSuffixConflictStrategy(this._separator); + }; + return NumSuffixConflictStrategy; +})(ConflictStrategyBase); + +module.exports = NumSuffixConflictStrategy; + + +},{"awayjs-core/lib/core/library/ConflictStrategyBase":undefined}],"awayjs-core/lib/core/net/CrossDomainPolicy":[function(require,module,exports){ +var CrossDomainPolicy = (function () { + function CrossDomainPolicy() { + } + CrossDomainPolicy.ANONYMOUS = 'anonymous'; + + CrossDomainPolicy.USE_CREDENTIALS = 'use-credentials'; + return CrossDomainPolicy; +})(); + +module.exports = CrossDomainPolicy; + + +},{}],"awayjs-core/lib/core/net/URLLoaderDataFormat":[function(require,module,exports){ +var URLLoaderDataFormat = (function () { + function URLLoaderDataFormat() { + } + URLLoaderDataFormat.TEXT = "text"; + + URLLoaderDataFormat.VARIABLES = "variables"; + + URLLoaderDataFormat.BLOB = "blob"; + + URLLoaderDataFormat.ARRAY_BUFFER = "arraybuffer"; + + URLLoaderDataFormat.BINARY = "binary"; + return URLLoaderDataFormat; +})(); + +module.exports = URLLoaderDataFormat; + + +},{}],"awayjs-core/lib/core/net/URLLoader":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); + +var URLRequestMethod = require("awayjs-core/lib/core/net/URLRequestMethod"); +var URLVariables = require("awayjs-core/lib/core/net/URLVariables"); +var AwayEvent = require("awayjs-core/lib/events/Event"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var HTTPStatusEvent = require("awayjs-core/lib/events/HTTPStatusEvent"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var AwayProgressEvent = require("awayjs-core/lib/events/ProgressEvent"); + +/** +* The URLLoader is used to load a single file, as part of a resource. +* +* While URLLoader can be used directly, e.g. to create a third-party asset +* management system, it's recommended to use any of the classes Loader3D, AssetLoader +* and AssetLibrary instead in most cases. +* +* @see AssetLoader +* @see away.library.AssetLibrary +*/ +var URLLoader = (function (_super) { + __extends(URLLoader, _super); + /** + * Creates a new URLLoader object. + */ + function URLLoader() { + _super.call(this); + this._bytesLoaded = 0; + this._bytesTotal = 0; + this._dataFormat = URLLoaderDataFormat.TEXT; + this._loadError = false; + } + Object.defineProperty(URLLoader.prototype, "url", { + /** + * + */ + get: function () { + return this._request ? this._request.url : ''; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(URLLoader.prototype, "data", { + /** + * + */ + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(URLLoader.prototype, "dataFormat", { + get: function () { + return this._dataFormat; + }, + /** + * + * URLLoaderDataFormat.BINARY + * URLLoaderDataFormat.TEXT + * URLLoaderDataFormat.VARIABLES + * + * @param format + */ + set: function (format) { + this._dataFormat = format; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(URLLoader.prototype, "bytesLoaded", { + /** + * + * @returns {number} + */ + get: function () { + return this._bytesLoaded; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(URLLoader.prototype, "bytesTotal", { + /** + * + * @returns {number} + */ + get: function () { + return this._bytesTotal; + }, + enumerable: true, + configurable: true + }); + + /** + * Load a resource from a file. + * + * @param request The URLRequest object containing the URL of the object to be loaded. + */ + URLLoader.prototype.load = function (request) { + this._request = request; + + this.initXHR(); + + if (request.method === URLRequestMethod.POST) + this.postRequest(request); + else + this.getRequest(request); + }; + + /** + * + */ + URLLoader.prototype.close = function () { + this._XHR.abort(); + this.disposeXHR(); + }; + + /** + * + */ + URLLoader.prototype.dispose = function () { + if (this._XHR) + this._XHR.abort(); + + this.disposeXHR(); + + this._data = null; + this._dataFormat = null; + this._bytesLoaded = null; + this._bytesTotal = null; + }; + + /** + * + * @param xhr + * @param responseType + */ + URLLoader.prototype.setResponseType = function (xhr, responseType) { + switch (responseType) { + case URLLoaderDataFormat.ARRAY_BUFFER: + case URLLoaderDataFormat.BLOB: + case URLLoaderDataFormat.TEXT: + xhr.responseType = responseType; + break; + + case URLLoaderDataFormat.VARIABLES: + xhr.responseType = URLLoaderDataFormat.TEXT; + break; + + case URLLoaderDataFormat.BINARY: + xhr.responseType = ''; + break; + + default: + } + }; + + /** + * + * @param request {URLRequest} + */ + URLLoader.prototype.getRequest = function (request) { + try { + this._XHR.open(request.method, request.url, request.async); + this.setResponseType(this._XHR, this._dataFormat); + this._XHR.send(); // No data to send + } catch (e) { + this.handleXmlHttpRequestException(e); + } + }; + + /** + * + * @param request {URLRequest} + */ + URLLoader.prototype.postRequest = function (request) { + this._loadError = false; + + this._XHR.open(request.method, request.url, request.async); + + if (request.data != null) { + if (request.data instanceof URLVariables) { + var urlVars = request.data; + + try { + this._XHR.responseType = 'text'; + this._XHR.send(urlVars.formData); + } catch (e) { + this.handleXmlHttpRequestException(e); + } + } else { + this.setResponseType(this._XHR, this._dataFormat); + + if (request.data) + this._XHR.send(request.data); // TODO: Test + else + this._XHR.send(); // no data to send + } + } else { + this._XHR.send(); // No data to send + } + }; + + /** + * + * @param error {XMLHttpRequestException} + */ + URLLoader.prototype.handleXmlHttpRequestException = function (error /* */ ) { + switch (error.code) { + case 101: + break; + } + }; + + /** + * + */ + URLLoader.prototype.initXHR = function () { + var _this = this; + if (!this._XHR) { + this._XHR = new XMLHttpRequest(); + + this._XHR.onloadstart = function (event) { + return _this.onLoadStart(event); + }; // loadstart - When the request starts. + this._XHR.onprogress = function (event) { + return _this.onProgress(event); + }; // progress - While loading and sending data. + this._XHR.onabort = function (event) { + return _this.onAbort(event); + }; // abort - When the request has been aborted, either by invoking the abort() method or navigating away from the page. + this._XHR.onerror = function (event) { + return _this.onLoadError(event); + }; // error - When the request has failed. + this._XHR.onload = function (event) { + return _this.onLoadComplete(event); + }; // load - When the request has successfully completed. + this._XHR.ontimeout = function (event) { + return _this.onTimeOut(event); + }; // timeout - When the author specified timeout has passed before the request could complete. + this._XHR.onloadend = function (event) { + return _this.onLoadEnd(event); + }; // loadend - When the request has completed, regardless of whether or not it was successful. + this._XHR.onreadystatechange = function (event) { + return _this.onReadyStateChange(event); + }; // onreadystatechange - When XHR state changes + } + }; + + /** + * + */ + URLLoader.prototype.disposeXHR = function () { + if (this._XHR !== null) { + this._XHR.onloadstart = null; + this._XHR.onprogress = null; + this._XHR.onabort = null; + this._XHR.onerror = null; + this._XHR.onload = null; + this._XHR.ontimeout = null; + this._XHR.onloadend = null; + this._XHR = null; + } + }; + + /** + * + * @param source + */ + URLLoader.prototype.decodeURLVariables = function (source) { + var result = new Object(); + + source = source.split("+").join(" "); + + var tokens, re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(source)) + result[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + + return result; + }; + + // XMLHttpRequest - Event Handlers + /** + * When XHR state changes + * @param event + */ + URLLoader.prototype.onReadyStateChange = function (event) { + if (this._XHR.readyState == 4) { + if (this._XHR.status == 404) { + this._loadError = true; + + if (!this._loadErrorEvent) + this._loadErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR); + + this.dispatchEvent(this._loadErrorEvent); + } + + this.dispatchEvent(new HTTPStatusEvent(HTTPStatusEvent.HTTP_STATUS, this._XHR.status)); + } + }; + + /** + * When the request has completed, regardless of whether or not it was successful. + * @param event + */ + URLLoader.prototype.onLoadEnd = function (event) { + if (this._loadError === true) + return; + }; + + /** + * When the author specified timeout has passed before the request could complete. + * @param event + */ + URLLoader.prototype.onTimeOut = function (event) { + //TODO: Timeout not currently implemented ( also not part of AS3 API ) + }; + + /** + * When the request has been aborted, either by invoking the abort() method or navigating away from the page. + * @param event + */ + URLLoader.prototype.onAbort = function (event) { + // TODO: investigate whether this needs to be an IOError + }; + + /** + * While loading and sending data. + * @param event + */ + URLLoader.prototype.onProgress = function (event) { + if (!this._progressEvent) + this._progressEvent = new AwayProgressEvent(AwayProgressEvent.PROGRESS); + + this._progressEvent.bytesTotal = event.total; + this._progressEvent.bytesLoaded = event.loaded; + + this.dispatchEvent(this._progressEvent); + }; + + /** + * When the request starts. + * @param event + */ + URLLoader.prototype.onLoadStart = function (event) { + if (!this._loadStartEvent) + this._loadStartEvent = new AwayEvent(AwayEvent.OPEN); + + this.dispatchEvent(this._loadStartEvent); + }; + + /** + * When the request has successfully completed. + * @param event + */ + URLLoader.prototype.onLoadComplete = function (event) { + if (this._loadError === true) + return; + + switch (this._dataFormat) { + case URLLoaderDataFormat.TEXT: + this._data = this._XHR.responseText; + break; + + case URLLoaderDataFormat.VARIABLES: + this._data = this.decodeURLVariables(this._XHR.responseText); + break; + + case URLLoaderDataFormat.BLOB: + case URLLoaderDataFormat.ARRAY_BUFFER: + case URLLoaderDataFormat.BINARY: + this._data = this._XHR.response; + break; + + default: + this._data = this._XHR.responseText; + break; + } + + if (!this._loadCompleteEvent) + this._loadCompleteEvent = new AwayEvent(AwayEvent.COMPLETE); + + this.dispatchEvent(this._loadCompleteEvent); + }; + + /** + * When the request has failed. ( due to network issues ). + * @param event + */ + URLLoader.prototype.onLoadError = function (event) { + this._loadError = true; + + if (!this._loadErrorEvent) + this._loadErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR); + + this.dispatchEvent(this._loadErrorEvent); + }; + return URLLoader; +})(EventDispatcher); + +module.exports = URLLoader; + + +},{"awayjs-core/lib/core/net/URLLoaderDataFormat":undefined,"awayjs-core/lib/core/net/URLRequestMethod":undefined,"awayjs-core/lib/core/net/URLVariables":undefined,"awayjs-core/lib/events/Event":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/events/HTTPStatusEvent":undefined,"awayjs-core/lib/events/IOErrorEvent":undefined,"awayjs-core/lib/events/ProgressEvent":undefined}],"awayjs-core/lib/core/net/URLRequestMethod":[function(require,module,exports){ +var URLRequestMethod = (function () { + function URLRequestMethod() { + } + URLRequestMethod.POST = 'POST'; + + URLRequestMethod.GET = 'GET'; + return URLRequestMethod; +})(); + +module.exports = URLRequestMethod; + + +},{}],"awayjs-core/lib/core/net/URLRequest":[function(require,module,exports){ +var URLRequestMethod = require("awayjs-core/lib/core/net/URLRequestMethod"); + +var URLRequest = (function () { + /** + + * @param url + */ + function URLRequest(url) { + if (typeof url === "undefined") { url = null; } + /** + * + * away.net.URLRequestMethod.GET + * away.net.URLRequestMethod.POST + * + * @type {string} + */ + this.method = URLRequestMethod.GET; + /** + * Use asynchronous XMLHttpRequest + * @type {boolean} + */ + this.async = true; + this._url = url; + } + Object.defineProperty(URLRequest.prototype, "url", { + /** + * + * @returns {string} + */ + get: function () { + return this._url; + }, + /** + * + * @param value + */ + set: function (value) { + this._url = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * dispose + */ + URLRequest.prototype.dispose = function () { + this.data = null; + this._url = null; + }; + return URLRequest; +})(); + +module.exports = URLRequest; + + +},{"awayjs-core/lib/core/net/URLRequestMethod":undefined}],"awayjs-core/lib/core/net/URLVariables":[function(require,module,exports){ +var URLVariables = (function () { + /** + * + * @param source + */ + function URLVariables(source) { + if (typeof source === "undefined") { source = null; } + this._variables = new Object(); + if (source !== null) + this.decode(source); + } + /** + * + * @param source + */ + URLVariables.prototype.decode = function (source) { + source = source.split("+").join(" "); + + var tokens, re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(source)) + this._variables[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + }; + + /** + * + * @returns {string} + */ + URLVariables.prototype.toString = function () { + return ''; + }; + + Object.defineProperty(URLVariables.prototype, "variables", { + /** + * + * @returns {Object} + */ + get: function () { + return this._variables; + }, + /** + * + * @returns {Object} + */ + set: function (obj) { + this._variables = obj; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(URLVariables.prototype, "formData", { + /** + * + * @returns {Object} + */ + get: function () { + var fd = new FormData(); + + for (var s in this._variables) + fd.append(s, this._variables[s]); + + return fd; + }, + enumerable: true, + configurable: true + }); + + return URLVariables; +})(); + +module.exports = URLVariables; + + +},{}],"awayjs-core/lib/core/partition/CameraNode":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* @class away.partition.CameraNode +*/ +var CameraNode = (function (_super) { + __extends(CameraNode, _super); + function CameraNode(camera) { + _super.call(this, camera); + } + /** + * @inheritDoc + */ + CameraNode.prototype.acceptTraverser = function (traverser) { + // todo: dead end for now, if it has a debug mesh, then sure accept that + }; + return CameraNode; +})(EntityNode); + +module.exports = CameraNode; + + +},{"awayjs-core/lib/core/partition/EntityNode":undefined}],"awayjs-core/lib/core/partition/DirectionalLightNode":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* @class away.partition.DirectionalLightNode +*/ +var DirectionalLightNode = (function (_super) { + __extends(DirectionalLightNode, _super); + /** + * + * @param directionalLight + */ + function DirectionalLightNode(directionalLight) { + _super.call(this, directionalLight); + + this._directionalLight = directionalLight; + } + /** + * @inheritDoc + */ + DirectionalLightNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applyDirectionalLight(this._directionalLight); + }; + + /** + * + * @returns {boolean} + */ + DirectionalLightNode.prototype.isCastingShadow = function () { + return false; + }; + return DirectionalLightNode; +})(EntityNode); + +module.exports = DirectionalLightNode; + + +},{"awayjs-core/lib/core/partition/EntityNode":undefined}],"awayjs-core/lib/core/partition/EntityNode":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); + +/** +* @class away.partition.EntityNode +*/ +var EntityNode = (function (_super) { + __extends(EntityNode, _super); + function EntityNode(entity) { + _super.call(this); + this._entity = entity; + this._iNumEntities = 1; + } + Object.defineProperty(EntityNode.prototype, "entity", { + get: function () { + return this._entity; + }, + enumerable: true, + configurable: true + }); + + EntityNode.prototype.removeFromParent = function () { + if (this._iParent) + this._iParent.iRemoveNode(this); + + this._iParent = null; + }; + + /** + * + * @returns {boolean} + */ + EntityNode.prototype.isCastingShadow = function () { + return this.entity.castsShadows; + }; + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + */ + EntityNode.prototype.isInFrustum = function (planes, numPlanes) { + if (!this._entity._iIsVisible()) + return false; + + return this._entity.worldBounds.isInFrustum(planes, numPlanes); + }; + + /** + * @inheritDoc + */ + EntityNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applyEntity(this._entity); + }; + + /** + * @inheritDoc + */ + EntityNode.prototype.isIntersectingRay = function (rayPosition, rayDirection) { + if (!this._entity._iIsVisible()) + return false; + + return this._entity.isIntersectingRay(rayPosition, rayDirection); + }; + + /** + * + * @protected + */ + EntityNode.prototype._pCreateBoundsPrimitive = function () { + return this._entity.bounds.boundingEntity; + }; + return EntityNode; +})(NodeBase); + +module.exports = EntityNode; + + +},{"awayjs-core/lib/core/partition/NodeBase":undefined}],"awayjs-core/lib/core/partition/LightProbeNode":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* @class away.partition.LightProbeNode +*/ +var LightProbeNode = (function (_super) { + __extends(LightProbeNode, _super); + /** + * + * @param lightProbe + */ + function LightProbeNode(lightProbe) { + _super.call(this, lightProbe); + + this._lightProbe = lightProbe; + } + /** + * @inheritDoc + */ + LightProbeNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applyLightProbe(this._lightProbe); + }; + + /** + * + * @returns {boolean} + */ + LightProbeNode.prototype.isCastingShadow = function () { + return false; + }; + return LightProbeNode; +})(EntityNode); + +module.exports = LightProbeNode; + + +},{"awayjs-core/lib/core/partition/EntityNode":undefined}],"awayjs-core/lib/core/partition/NodeBase":[function(require,module,exports){ +/** +* @class away.partition.NodeBase +*/ +var NodeBase = (function () { + /** + * + */ + function NodeBase() { + this._pNumChildNodes = 0; + this._iNumEntities = 0; + this._pChildNodes = new Array(); + } + Object.defineProperty(NodeBase.prototype, "boundsVisible", { + /** + * + */ + get: function () { + return this._explicitBoundsVisible; + }, + set: function (value) { + if (this._explicitBoundsVisible == value) + return; + + this._explicitBoundsVisible = value; + + this._iUpdateImplicitBoundsVisible(this._iParent ? this._iParent.boundsChildrenVisible : false); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(NodeBase.prototype, "boundsChildrenVisible", { + get: function () { + return this._boundsChildrenVisible; + }, + set: function (value) { + if (this._boundsChildrenVisible == value) + return; + + this._boundsChildrenVisible = value; + + for (var i = 0; i < this._pNumChildNodes; ++i) + this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(NodeBase.prototype, "parent", { + /** + * + */ + get: function () { + return this._iParent; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NodeBase.prototype, "_pNumEntities", { + /** + * + * @protected + */ + get: function () { + return this._iNumEntities; + }, + enumerable: true, + configurable: true + }); + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + * @internal + */ + NodeBase.prototype.isInFrustum = function (planes, numPlanes) { + return true; + }; + + /** + * + * @param rayPosition + * @param rayDirection + * @returns {boolean} + */ + NodeBase.prototype.isIntersectingRay = function (rayPosition, rayDirection) { + return true; + }; + + /** + * + * @returns {boolean} + */ + NodeBase.prototype.isCastingShadow = function () { + return true; + }; + + /** + * + * @param entity + * @returns {away.partition.NodeBase} + */ + NodeBase.prototype.findPartitionForEntity = function (entity) { + return this; + }; + + /** + * + * @param traverser + */ + NodeBase.prototype.acceptTraverser = function (traverser) { + if (this._pNumEntities == 0 && !this._implicitBoundsVisible) + return; + + if (traverser.enterNode(this)) { + var i = 0; + + while (i < this._pNumChildNodes) + this._pChildNodes[i++].acceptTraverser(traverser); + + if (this._implicitBoundsVisible) + this._pBoundsPrimitive.partitionNode.acceptTraverser(traverser); + } + }; + + /** + * + * @protected + */ + NodeBase.prototype._pCreateBoundsPrimitive = function () { + return null; + }; + + /** + * + * @param node + * @internal + */ + NodeBase.prototype.iAddNode = function (node) { + node._iParent = this; + this._iNumEntities += node._pNumEntities; + this._pChildNodes[this._pNumChildNodes++] = node; + + node._iUpdateImplicitBoundsVisible(this.boundsChildrenVisible); + + var numEntities = node._pNumEntities; + node = this; + + do { + node._iNumEntities += numEntities; + } while((node = node._iParent) != null); + }; + + /** + * + * @param node + * @internal + */ + NodeBase.prototype.iRemoveNode = function (node) { + var index = this._pChildNodes.indexOf(node); + this._pChildNodes[index] = this._pChildNodes[--this._pNumChildNodes]; + this._pChildNodes.pop(); + + node._iUpdateImplicitBoundsVisible(false); + + var numEntities = node._pNumEntities; + node = this; + + do { + node._pNumEntities -= numEntities; + } while((node = node._iParent) != null); + }; + + NodeBase.prototype._iUpdateImplicitBoundsVisible = function (value) { + if (this._implicitBoundsVisible == this._explicitBoundsVisible || value) + return; + + this._implicitBoundsVisible = this._explicitBoundsVisible || value; + + this._iUpdateEntityBounds(); + + for (var i = 0; i < this._pNumChildNodes; ++i) + this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); + }; + + /** + * @internal + */ + NodeBase.prototype._iIsBoundsVisible = function () { + return this._implicitBoundsVisible; + }; + + // public _pUpdateNumEntities(value:number) + // { + // var diff:number = value - this._pNumEntities; + // var node:NodeBase = this; + // + // do { + // node._pNumEntities += diff; + // } while ((node = node._iParent) != null); + // } + NodeBase.prototype._iUpdateEntityBounds = function () { + if (this._pBoundsPrimitive) { + this._pBoundsPrimitive.dispose(); + this._pBoundsPrimitive = null; + } + + if (this._implicitBoundsVisible) + this._pBoundsPrimitive = this._pCreateBoundsPrimitive(); + }; + return NodeBase; +})(); + +module.exports = NodeBase; + + +},{}],"awayjs-core/lib/core/partition/NullNode":[function(require,module,exports){ +/** +* @class away.partition.NullNode +*/ +var NullNode = (function () { + function NullNode() { + } + return NullNode; +})(); + +module.exports = NullNode; + + +},{}],"awayjs-core/lib/core/partition/Partition":[function(require,module,exports){ +var NullNode = require("awayjs-core/lib/core/partition/NullNode"); + +/** +* @class away.partition.Partition +*/ +var Partition = (function () { + function Partition(rootNode) { + this._updatesMade = false; + this._rootNode = rootNode || new NullNode(); + } + Object.defineProperty(Partition.prototype, "rootNode", { + get: function () { + return this._rootNode; + }, + enumerable: true, + configurable: true + }); + + Partition.prototype.traverse = function (traverser) { + if (this._updatesMade) + this.updateEntities(); + + this._rootNode.acceptTraverser(traverser); + }; + + Partition.prototype.iMarkForUpdate = function (entity) { + var node = entity.partitionNode; + var t = this._updateQueue; + + while (t) { + if (node == t) + return; + + t = t._iUpdateQueueNext; + } + + node._iUpdateQueueNext = this._updateQueue; + + this._updateQueue = node; + this._updatesMade = true; + }; + + Partition.prototype.iRemoveEntity = function (entity) { + var node = entity.partitionNode; + var t; + + node.removeFromParent(); + + if (node == this._updateQueue) { + this._updateQueue = node._iUpdateQueueNext; + } else { + t = this._updateQueue; + while (t && t._iUpdateQueueNext != node) + t = t._iUpdateQueueNext; + + if (t) + t._iUpdateQueueNext = node._iUpdateQueueNext; + } + + node._iUpdateQueueNext = null; + + if (!this._updateQueue) + this._updatesMade = false; + }; + + Partition.prototype.updateEntities = function () { + var node = this._updateQueue; + var targetNode; + var t; + this._updateQueue = null; + this._updatesMade = false; + + do { + targetNode = this._rootNode.findPartitionForEntity(node.entity); + + if (node.parent != targetNode) { + if (node) + node.removeFromParent(); + + targetNode.iAddNode(node); + } + + t = node._iUpdateQueueNext; + node._iUpdateQueueNext = null; + + //required for controllers with autoUpdate set to true + node.entity._iInternalUpdate(); + } while((node = t) != null); + }; + return Partition; +})(); + +module.exports = Partition; + + +},{"awayjs-core/lib/core/partition/NullNode":undefined}],"awayjs-core/lib/core/partition/PointLightNode":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* @class away.partition.PointLightNode +*/ +var PointLightNode = (function (_super) { + __extends(PointLightNode, _super); + /** + * + * @param pointLight + */ + function PointLightNode(pointLight) { + _super.call(this, pointLight); + + this._pointLight = pointLight; + } + /** + * @inheritDoc + */ + PointLightNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applyPointLight(this._pointLight); + }; + + /** + * + * @returns {boolean} + */ + PointLightNode.prototype.isCastingShadow = function () { + return false; + }; + return PointLightNode; +})(EntityNode); + +module.exports = PointLightNode; + + +},{"awayjs-core/lib/core/partition/EntityNode":undefined}],"awayjs-core/lib/core/partition/SkyboxNode":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* SkyboxNode is a space partitioning leaf node that contains a Skybox object. +* +* @class away.partition.SkyboxNode +*/ +var SkyboxNode = (function (_super) { + __extends(SkyboxNode, _super); + /** + * Creates a new SkyboxNode object. + * @param skyBox The Skybox to be contained in the node. + */ + function SkyboxNode(skyBox) { + _super.call(this, skyBox); + + this._skyBox = skyBox; + } + /** + * @inheritDoc + */ + SkyboxNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applySkybox(this._skyBox); + }; + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + */ + SkyboxNode.prototype.isInFrustum = function (planes, numPlanes) { + if (!this._skyBox._iIsVisible) + return false; + + //a skybox is always in view unless its visibility is set to false + return true; + }; + return SkyboxNode; +})(EntityNode); + +module.exports = SkyboxNode; + + +},{"awayjs-core/lib/core/partition/EntityNode":undefined}],"awayjs-core/lib/core/pick/IPicker":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/pick/IPickingCollider":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/pick/PickingCollisionVO":[function(require,module,exports){ +/** +* Value object for a picking collision returned by a picking collider. Created as unique objects on display objects +* +* @see away.base.DisplayObject#pickingCollisionVO +* @see away.core.pick.IPickingCollider +* +* @class away.pick.PickingCollisionVO +*/ +var PickingCollisionVO = (function () { + /** + * Creates a new PickingCollisionVO object. + * + * @param entity The entity to which this collision object belongs. + */ + function PickingCollisionVO(displayObject) { + this.displayObject = displayObject; + } + return PickingCollisionVO; +})(); + +module.exports = PickingCollisionVO; + + +},{}],"awayjs-core/lib/core/pick/RaycastPicker":[function(require,module,exports){ +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var RaycastCollector = require("awayjs-core/lib/core/traverse/RaycastCollector"); + +/** +* Picks a 3d object from a view or scene by 3D raycast calculations. +* Performs an initial coarse boundary calculation to return a subset of entities whose bounding volumes intersect with the specified ray, +* then triggers an optional picking collider on individual entity objects to further determine the precise values of the picking ray collision. +* +* @class away.pick.RaycastPicker +*/ +var RaycastPicker = (function () { + /** + * Creates a new RaycastPicker object. + * + * @param findClosestCollision Determines whether the picker searches for the closest bounds collision along the ray, + * or simply returns the first collision encountered. Defaults to false. + */ + function RaycastPicker(findClosestCollision) { + if (typeof findClosestCollision === "undefined") { findClosestCollision = false; } + this._ignoredEntities = []; + this._onlyMouseEnabled = true; + this._numEntities = 0; + this._raycastCollector = new RaycastCollector(); + + this._findClosestCollision = findClosestCollision; + this._entities = new Array(); + } + Object.defineProperty(RaycastPicker.prototype, "onlyMouseEnabled", { + /** + * @inheritDoc + */ + get: function () { + return this._onlyMouseEnabled; + }, + set: function (value) { + this._onlyMouseEnabled = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + RaycastPicker.prototype.getViewCollision = function (x, y, view) { + //update ray + var rayPosition = view.unproject(x, y, 0); + var rayDirection = view.unproject(x, y, 1).subtract(rayPosition); + + return this.getSceneCollision(rayPosition, rayDirection, view.scene); + }; + + /** + * @inheritDoc + */ + RaycastPicker.prototype.getSceneCollision = function (rayPosition, rayDirection, scene) { + //clear collector + this._raycastCollector.clear(); + + //setup ray vectors + this._raycastCollector.rayPosition = rayPosition; + this._raycastCollector.rayDirection = rayDirection; + + // collect entities to test + scene.traversePartitions(this._raycastCollector); + + this._numEntities = 0; + var node = this._raycastCollector.entityHead; + var entity; + + while (node) { + if (!this.isIgnored(entity = node.entity)) + this._entities[this._numEntities++] = entity; + + node = node.next; + } + + //early out if no collisions detected + if (!this._numEntities) + return null; + + return this.getPickingCollisionVO(this._raycastCollector); + }; + + // public getEntityCollision(position:Vector3D, direction:Vector3D, entities:Array):PickingCollisionVO + // { + // this._numEntities = 0; + // + // var entity:IEntity; + // var l:number = entities.length; + // + // for (var c:number = 0; c < l; c++) { + // entity = entities[c]; + // + // if (entity.isIntersectingRay(position, direction)) + // this._entities[this._numEntities++] = entity; + // } + // + // return this.getPickingCollisionVO(this._raycastCollector); + // } + RaycastPicker.prototype.setIgnoreList = function (entities) { + this._ignoredEntities = entities; + }; + + RaycastPicker.prototype.isIgnored = function (entity) { + if (this._onlyMouseEnabled && !entity._iIsMouseEnabled()) + return true; + + var len = this._ignoredEntities.length; + for (var i = 0; i < len; i++) + if (this._ignoredEntities[i] == entity) + return true; + + return false; + }; + + RaycastPicker.prototype.sortOnNearT = function (entity1, entity2) { + return entity1._iPickingCollisionVO.rayEntryDistance > entity2._iPickingCollisionVO.rayEntryDistance ? 1 : -1; + }; + + RaycastPicker.prototype.getPickingCollisionVO = function (collector) { + // trim before sorting + this._entities.length = this._numEntities; + + // Sort entities from closest to furthest. + this._entities = this._entities.sort(this.sortOnNearT); // TODO - test sort filter in JS + + // --------------------------------------------------------------------- + // Evaluate triangle collisions when needed. + // Replaces collision data provided by bounds collider with more precise data. + // --------------------------------------------------------------------- + var shortestCollisionDistance = Number.MAX_VALUE; + var bestCollisionVO; + var pickingCollisionVO; + var entity; + var i; + + for (i = 0; i < this._numEntities; ++i) { + entity = this._entities[i]; + pickingCollisionVO = entity._iPickingCollisionVO; + if (entity.pickingCollider) { + // If a collision exists, update the collision data and stop all checks. + if ((bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) && entity._iTestCollision(shortestCollisionDistance, this._findClosestCollision)) { + shortestCollisionDistance = pickingCollisionVO.rayEntryDistance; + bestCollisionVO = pickingCollisionVO; + if (!this._findClosestCollision) { + this.updateLocalPosition(pickingCollisionVO); + return pickingCollisionVO; + } + } + } else if (bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) { + // Note: a bounds collision with a ray origin inside its bounds is ONLY ever used + // to enable the detection of a corresponsding triangle collision. + // Therefore, bounds collisions with a ray origin inside its bounds can be ignored + // if it has been established that there is NO triangle collider to test + if (!pickingCollisionVO.rayOriginIsInsideBounds) { + this.updateLocalPosition(pickingCollisionVO); + return pickingCollisionVO; + } + } + } + + return bestCollisionVO; + }; + + RaycastPicker.prototype.updateLocalPosition = function (pickingCollisionVO) { + var collisionPos = (pickingCollisionVO.localPosition == null) ? new Vector3D() : pickingCollisionVO.localPosition; + + var rayDir = pickingCollisionVO.localRayDirection; + var rayPos = pickingCollisionVO.localRayPosition; + var t = pickingCollisionVO.rayEntryDistance; + collisionPos.x = rayPos.x + t * rayDir.x; + collisionPos.y = rayPos.y + t * rayDir.y; + collisionPos.z = rayPos.z + t * rayDir.z; + }; + + RaycastPicker.prototype.dispose = function () { + //TODO + }; + return RaycastPicker; +})(); + +module.exports = RaycastPicker; + + +},{"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/core/traverse/RaycastCollector":undefined}],"awayjs-core/lib/core/pool/CSSBillboardRenderable":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + +/** +* @class away.pool.RenderableListItem +*/ +var CSSBillboardRenderable = (function (_super) { + __extends(CSSBillboardRenderable, _super); + function CSSBillboardRenderable(pool, billboard) { + _super.call(this, pool, billboard, billboard); + + var div = document.createElement("div"); + div.onmousedown = function (event) { + return false; + }; + + this.htmlElement = div; + + var style = div.style; + + style.position = "absolute"; + style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; + + var img = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + billboard.material.id; + } + CSSBillboardRenderable.id = "billboard"; + return CSSBillboardRenderable; +})(CSSRenderableBase); + +module.exports = CSSBillboardRenderable; + + +},{"awayjs-core/lib/core/pool/CSSRenderableBase":undefined}],"awayjs-core/lib/core/pool/CSSLineSegmentRenderable":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + +/** +* @class away.pool.RenderableListItem +*/ +var CSSLineSegmentRenderable = (function (_super) { + __extends(CSSLineSegmentRenderable, _super); + function CSSLineSegmentRenderable(pool, lineSegment) { + _super.call(this, pool, lineSegment, lineSegment); + + var div = document.createElement("div"); + div.onmousedown = function (event) { + return false; + }; + + this.htmlElement = div; + + var style = div.style; + + style.position = "absolute"; + style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; + + var img = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + lineSegment.material.id; + } + CSSLineSegmentRenderable.id = "lineSegment"; + return CSSLineSegmentRenderable; +})(CSSRenderableBase); + +module.exports = CSSLineSegmentRenderable; + + +},{"awayjs-core/lib/core/pool/CSSRenderableBase":undefined}],"awayjs-core/lib/core/pool/CSSRenderableBase":[function(require,module,exports){ +/** +* @class away.pool.RenderableListItem +*/ +var CSSRenderableBase = (function () { + /** + * + * @param sourceEntity + * @param material + * @param animator + */ + function CSSRenderableBase(pool, sourceEntity, materialOwner) { + //store a reference to the pool for later disposal + this._pool = pool; + + this.sourceEntity = sourceEntity; + this.materialOwner = materialOwner; + } + /** + * + */ + CSSRenderableBase.prototype.dispose = function () { + this._pool.disposeItem(this.materialOwner); + }; + + /** + * + */ + CSSRenderableBase.prototype.invalidateGeometry = function () { + }; + + /** + * + */ + CSSRenderableBase.prototype.invalidateIndexData = function () { + }; + + /** + * + */ + CSSRenderableBase.prototype.invalidateVertexData = function (dataType) { + }; + return CSSRenderableBase; +})(); + +module.exports = CSSRenderableBase; + + +},{}],"awayjs-core/lib/core/pool/CSSSkyboxRenderable":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + +/** +* @class away.pool.CSSSkyboxRenderable +*/ +var CSSSkyboxRenderable = (function (_super) { + __extends(CSSSkyboxRenderable, _super); + function CSSSkyboxRenderable(pool, skyBox) { + _super.call(this, pool, skyBox, skyBox); + + var div = document.createElement("div"); + div.onmousedown = function (event) { + return false; + }; + + this.htmlElement = div; + + var style = div.style; + var img; + + //create the six images that make up the skybox + style.position = "absolute"; + style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; + + img = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + skyBox.material.id; + } + CSSSkyboxRenderable.id = "skybox"; + return CSSSkyboxRenderable; +})(CSSRenderableBase); + +module.exports = CSSSkyboxRenderable; + + +},{"awayjs-core/lib/core/pool/CSSRenderableBase":undefined}],"awayjs-core/lib/core/pool/EntityListItemPool":[function(require,module,exports){ +var EntityListItem = require("awayjs-core/lib/core/pool/EntityListItem"); + +/** +* @class away.pool.EntityListItemPool +*/ +var EntityListItemPool = (function () { + /** + * + */ + function EntityListItemPool() { + this._index = 0; + this._poolSize = 0; + this._pool = new Array(); + } + /** + * + */ + EntityListItemPool.prototype.getItem = function () { + var item; + if (this._index == this._poolSize) { + item = new EntityListItem(); + this._pool[this._index++] = item; + ++this._poolSize; + } else { + item = this._pool[this._index++]; + } + return item; + }; + + /** + * + */ + EntityListItemPool.prototype.freeAll = function () { + this._index = 0; + }; + + EntityListItemPool.prototype.dispose = function () { + this._pool.length = 0; + }; + return EntityListItemPool; +})(); + +module.exports = EntityListItemPool; + + +},{"awayjs-core/lib/core/pool/EntityListItem":undefined}],"awayjs-core/lib/core/pool/EntityListItem":[function(require,module,exports){ +/** +* @class away.pool.EntityListItem +*/ +var EntityListItem = (function () { + function EntityListItem() { + } + return EntityListItem; +})(); + +module.exports = EntityListItem; + + +},{}],"awayjs-core/lib/core/pool/IMaterialData":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/pool/IMaterialPassData":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/pool/IRenderableClass":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/pool/IRenderable":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/pool/ITextureData":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/pool/RenderablePool":[function(require,module,exports){ +/** +* @class away.pool.RenderablePool +*/ +var RenderablePool = (function () { + /** + * //TODO + * + * @param renderableClass + */ + function RenderablePool(renderableClass) { + this._pool = new Object(); + this._renderableClass = renderableClass; + } + /** + * //TODO + * + * @param materialOwner + * @returns IRenderable + */ + RenderablePool.prototype.getItem = function (materialOwner) { + return (this._pool[materialOwner.id] || (this._pool[materialOwner.id] = materialOwner._iAddRenderable(new this._renderableClass(this, materialOwner)))); + }; + + /** + * //TODO + * + * @param materialOwner + */ + RenderablePool.prototype.disposeItem = function (materialOwner) { + materialOwner._iRemoveRenderable(this._pool[materialOwner.id]); + + this._pool[materialOwner.id] = null; + }; + + /** + * //TODO + * + * @param renderableClass + * @returns RenderablePool + */ + RenderablePool.getPool = function (renderableClass) { + var pool = RenderablePool._pools[renderableClass.id]; + + if (pool != undefined) + return pool; + + return (RenderablePool._pools[renderableClass.id] = new RenderablePool(renderableClass)); + }; + + /** + * //TODO + * + * @param renderableClass + */ + RenderablePool.disposePool = function (renderableClass) { + if (RenderablePool._pools[renderableClass.id]) + RenderablePool._pools[renderableClass.id] = undefined; + }; + RenderablePool._pools = new Object(); + return RenderablePool; +})(); + +module.exports = RenderablePool; + + +},{}],"awayjs-core/lib/core/render/CSSDefaultRenderer":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + +var CSSRendererBase = require("awayjs-core/lib/core/render/CSSRendererBase"); + +var CSSEntityCollector = require("awayjs-core/lib/core/traverse/CSSEntityCollector"); + +var CoordinateSystem = require("awayjs-core/lib/projections/CoordinateSystem"); + +/** +* The DefaultRenderer class provides the default rendering method. It renders the scene graph objects using the +* materials assigned to them. +* +* @class away.render.DefaultRenderer +*/ +var CSSDefaultRenderer = (function (_super) { + __extends(CSSDefaultRenderer, _super); + /** + * Creates a new CSSDefaultRenderer object. + */ + function CSSDefaultRenderer() { + _super.call(this); + this._contextMatrix = new Matrix3D(); + this._skyboxProjection = new Matrix3D(); + this._transform = new Matrix3D(); + + //create container for the renderer + this._container = document.createElement("div"); + this._container.style.overflow = "hidden"; + this._container.style.position = "absolute"; + + //add container to body + document.body.appendChild(this._container); + + //create conxtext for the renderer + this._context = document.createElement("div"); + this._contextStyle = this._context.style; + this._contextStyle.position = "absolute"; + this._contextStyle.transformStyle = this._contextStyle["-webkit-transform-style"] = this._contextStyle["-moz-transform-style"] = this._contextStyle["-o-transform-style"] = this._contextStyle["-ms-transform-style"] = "preserve-3d"; + this._contextStyle.transformOrigin = this._contextStyle["-webkit-transform-origin"] = this._contextStyle["-moz-transform-origin"] = this._contextStyle["-o-transform-origin"] = this._contextStyle["-ms-transform-origin"] = "0% 0%"; + + //add context to container + this._container.appendChild(this._context); + } + /** + * + * @param entityCollector + */ + CSSDefaultRenderer.prototype.render = function (entityCollector) { + _super.prototype.render.call(this, entityCollector); + + if (this._pBackBufferInvalid) + this.pUpdateBackBuffer(); + + this._iRender(entityCollector); + + this._pBackBufferInvalid = false; + }; + + /** + * @inheritDoc + */ + CSSDefaultRenderer.prototype.pDraw = function (entityCollector) { + // if (entityCollector.skyBox) { + // if (this._activeMaterial) + // this._activeMaterial.iDeactivate(this._pStageGL); + // + // this._activeMaterial = null; + // + // this._pContext.setDepthTest(false, away.gl.ContextGLCompareMode.ALWAYS); + // this.drawSkybox(entityCollector); + // + // } + // + // var which:number = target? DefaultRenderer.SCREEN_PASSES : DefaultRenderer.ALL_PASSES; + var sheet = document.styleSheets[document.styleSheets.length - 1]; + + for (var i = 0; i < sheet.cssRules.length; i++) { + var style = sheet.cssRules[i].style; + style.transform = style["-webkit-transform"] = style["-moz-transform"] = style["-o-transform"] = style["-ms-transform"] = (entityCollector.camera.projection.coordinateSystem == CoordinateSystem.RIGHT_HANDED) ? "" : "scale3d(1, -1, 1) translateY(-" + style.height + ")"; + } + + this.drawRenderables(this._renderableHead, entityCollector); + + // if (this._activeMaterial) + // this._activeMaterial.iDeactivate(this._pStageGL); + this._activeMaterial = null; + }; + + /** + * Updates the backbuffer properties. + */ + CSSDefaultRenderer.prototype.pUpdateBackBuffer = function () { + this._container.style.width = this._width + "px"; + this._container.style.height = this._height + "px"; + this._container.style.clip = "rect(0px, " + this._width + "px, " + this._height + "px, 0px)"; + + //update context matrix + this._contextMatrix.rawData[0] = this._width / 2; + this._contextMatrix.rawData[5] = -this._height / 2; + this._contextMatrix.rawData[10] = -1; //fix for innaccurate z-sort + this._contextMatrix.rawData[12] = this._width / 2; + this._contextMatrix.rawData[13] = this._height / 2; + + //update context tranform + this._contextStyle.transform = this._contextStyle["-webkit-transform"] = this._contextStyle["-moz-transform"] = this._contextStyle["-o-transform"] = this._contextStyle["-ms-transform"] = this._contextMatrix.toString(); + + this._pBackBufferInvalid = false; + }; + + /** + * Draw the skybox if present. + * @param entityCollector The EntityCollector containing all potentially visible information. + */ + CSSDefaultRenderer.prototype.drawSkybox = function (entityCollector) { + //TODO + }; + + /** + * Draw a list of renderables. + * @param renderables The renderables to draw. + * @param entityCollector The EntityCollector containing all potentially visible information. + */ + CSSDefaultRenderer.prototype.drawRenderables = function (item, entityCollector) { + var viewProjection = entityCollector.camera.viewProjection.clone(); + + while (item) { + this._activeMaterial = item.materialOwner.material; + + //serialise transform and apply to html element + this._transform.copyRawDataFrom(item.renderSceneTransform.rawData); + this._transform.append(viewProjection); + + var style = item.htmlElement.style; + + style.transform = style["-webkit-transform"] = style["-moz-transform"] = style["-o-transform"] = style["-ms-transform"] = this._transform.toString(); + + style.transformStyle = style["-webkit-transform-style"] = style["-moz-transform-style"] = style["-o-transform-style"] = style["-ms-transform-style"] = "preserve-3d"; + + //check if child requires adding to the view + if (!this._context.contains(item.htmlElement)) + this._context.appendChild(item.htmlElement); + + item = item.next; + } + // var numPasses:number; + // var j:number; + // var camera:away.entities.Camera = entityCollector.camera; + // var item2:away.render.CSSRenderableBase; + // + // while (item) { + // this._activeMaterial = item.material; + // + // this._activeMaterial.iUpdateMaterial(this._pContext); + // + // numPasses = this._activeMaterial._iNumPasses; + // + // j = 0; + // + // do { + // item2 = item; + // + // var rttMask:number = this._activeMaterial.iPassRendersToTexture(j)? 1 : 2; + // + // if ((rttMask & which) != 0) { + // this._activeMaterial.iActivatePass(j, this._pStageGL, camera); + // + // do { + // this._activeMaterial.iRenderPass(j, item2, this._pStageGL, entityCollector); + // + // item2 = item2.next; + // + // } while (item2 && item2.material == this._activeMaterial); + // + // this._activeMaterial.iDeactivatePass(j, this._pStageGL); + // + // } else { + // do { + // item2 = item2.next; + // + // } while (item2 && item2.renderable.material == this._activeMaterial); + // } + // } while (++j < numPasses); + // + // item = item2; + // } + }; + + CSSDefaultRenderer.prototype.dispose = function () { + _super.prototype.dispose.call(this); + //TODO + }; + + CSSDefaultRenderer.prototype._iCreateEntityCollector = function () { + return new CSSEntityCollector(); + }; + return CSSDefaultRenderer; +})(CSSRendererBase); + +module.exports = CSSDefaultRenderer; + + +},{"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/render/CSSRendererBase":undefined,"awayjs-core/lib/core/traverse/CSSEntityCollector":undefined,"awayjs-core/lib/projections/CoordinateSystem":undefined}],"awayjs-core/lib/core/render/CSSRendererBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Point = require("awayjs-core/lib/core/geom/Point"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +var CSSBillboardRenderable = require("awayjs-core/lib/core/pool/CSSBillboardRenderable"); +var CSSLineSegmentRenderable = require("awayjs-core/lib/core/pool/CSSLineSegmentRenderable"); + +var RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var RendererEvent = require("awayjs-core/lib/events/RendererEvent"); + +/** +* RendererBase forms an abstract base class for classes that are used in the rendering pipeline to render the +* contents of a partition +* +* @class away.render.RendererBase +*/ +var CSSRendererBase = (function (_super) { + __extends(CSSRendererBase, _super); + /** + * Creates a new RendererBase object. + */ + function CSSRendererBase(renderToTexture, forceSoftware, profile) { + if (typeof renderToTexture === "undefined") { renderToTexture = false; } + if (typeof forceSoftware === "undefined") { forceSoftware = false; } + if (typeof profile === "undefined") { profile = "baseline"; } + _super.call(this); + this._backgroundR = 0; + this._backgroundG = 0; + this._backgroundB = 0; + this._backgroundAlpha = 1; + this._shareContext = false; + this._pBackBufferInvalid = true; + this._depthTextureInvalid = true; + this._viewPort = new Rectangle(); + this._scissorRect = new Rectangle(); + this._localPos = new Point(); + this._globalPos = new Point(); + + this._billboardRenderablePool = RenderablePool.getPool(CSSBillboardRenderable); + this._lineSegmentRenderablePool = RenderablePool.getPool(CSSLineSegmentRenderable); + + this._viewPort = new Rectangle(); + + if (this._width == 0) + this.width = window.innerWidth; + + if (this._height == 0) + this.height = window.innerHeight; + } + Object.defineProperty(CSSRendererBase.prototype, "viewPort", { + /** + * A viewPort rectangle equivalent of the StageGL size and position. + */ + get: function () { + return this._viewPort; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CSSRendererBase.prototype, "scissorRect", { + /** + * A scissor rectangle equivalent of the view size and position. + */ + get: function () { + return this._scissorRect; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CSSRendererBase.prototype, "x", { + /** + * + */ + get: function () { + return this._localPos.x; + }, + set: function (value) { + if (this.x == value) + return; + + this.updateGlobalPos(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "y", { + /** + * + */ + get: function () { + return this._localPos.y; + }, + set: function (value) { + if (this.y == value) + return; + + this._globalPos.y = this._localPos.y = value; + + this.updateGlobalPos(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "width", { + /** + * + */ + get: function () { + return this._width; + }, + set: function (value) { + if (this._width == value) + return; + + this._width = value; + this._scissorRect.width = value; + this._viewPort.width = value; + + this._pBackBufferInvalid = true; + this._depthTextureInvalid = true; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "height", { + /** + * + */ + get: function () { + return this._height; + }, + set: function (value) { + if (this._height == value) + return; + + this._height = value; + this._scissorRect.height = value; + this._viewPort.height = value; + + this._pBackBufferInvalid = true; + this._depthTextureInvalid = true; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundR", { + /** + * The background color's red component, used when clearing. + * + * @private + */ + get: function () { + return this._backgroundR; + }, + set: function (value) { + if (this._backgroundR == value) + return; + + this._backgroundR = value; + + this._pBackBufferInvalid = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundG", { + /** + * The background color's green component, used when clearing. + * + * @private + */ + get: function () { + return this._backgroundG; + }, + set: function (value) { + if (this._backgroundG == value) + return; + + this._backgroundG = value; + + this._pBackBufferInvalid = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundB", { + /** + * The background color's blue component, used when clearing. + * + * @private + */ + get: function () { + return this._backgroundB; + }, + set: function (value) { + if (this._backgroundB == value) + return; + + this._backgroundB = value; + + this._pBackBufferInvalid = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "shareContext", { + get: function () { + return this._shareContext; + }, + set: function (value) { + if (this._shareContext == value) + return; + + this._shareContext = value; + + this.updateGlobalPos(); + }, + enumerable: true, + configurable: true + }); + + + /** + * Disposes the resources used by the RendererBase. + */ + CSSRendererBase.prototype.dispose = function () { + /* + if (_backgroundImageRenderer) { + _backgroundImageRenderer.dispose(); + _backgroundImageRenderer = null; + } + */ + }; + + CSSRendererBase.prototype.render = function (entityCollector) { + this._viewportDirty = false; + this._scissorDirty = false; + }; + + /** + * Renders the potentially visible geometry to the back buffer or texture. + * @param entityCollector The EntityCollector object containing the potentially visible geometry. + * @param scissorRect + */ + CSSRendererBase.prototype._iRender = function (entityCollector, target, scissorRect, surfaceSelector) { + if (typeof target === "undefined") { target = null; } + if (typeof scissorRect === "undefined") { scissorRect = null; } + if (typeof surfaceSelector === "undefined") { surfaceSelector = 0; } + if (!entityCollector.entityHead) + return; + + this.pExecuteRender(entityCollector, scissorRect); + }; + + CSSRendererBase.prototype._iRenderCascades = function (entityCollector, target, numCascades, scissorRects, cameras) { + }; + CSSRendererBase.prototype.pCollectRenderables = function (entityCollector) { + //reset head values + this._renderableHead = null; + + //grab entity head + var item = entityCollector.entityHead; + + //set temp values for entry point and camera forward vector + this._pCamera = entityCollector.camera; + this._iEntryPoint = this._pCamera.scenePosition; + this._pCameraForward = this._pCamera.transform.forwardVector; + + while (item) { + item.entity._iCollectRenderables(this); + item = item.next; + } + }; + + /** + * Renders the potentially visible geometry to the back buffer or texture. Only executed if everything is set up. + * @param entityCollector The EntityCollector object containing the potentially visible geometry. + * @param scissorRect + */ + CSSRendererBase.prototype.pExecuteRender = function (entityCollector, scissorRect) { + if (typeof scissorRect === "undefined") { scissorRect = null; } + this.pCollectRenderables(entityCollector); + + this.pDraw(entityCollector); + }; + + /** + * Performs the actual drawing of dom objects to the target. + * + * @param entityCollector The EntityCollector object containing the potentially visible dom objects. + */ + CSSRendererBase.prototype.pDraw = function (entityCollector) { + throw new AbstractMethodError(); + }; + + Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundAlpha", { + get: function () { + return this._backgroundAlpha; + }, + set: function (value) { + if (this._backgroundAlpha == value) + return; + + this._backgroundAlpha = value; + + this._pBackBufferInvalid = true; + }, + enumerable: true, + configurable: true + }); + + + /** + * + * @param billboard + */ + CSSRendererBase.prototype.applyBillboard = function (billboard) { + this._applyRenderable(this._billboardRenderablePool.getItem(billboard)); + }; + + /** + * + * @param lineSubMesh + */ + CSSRendererBase.prototype.applyLineSubMesh = function (lineSubMesh) { + //this._applyRenderable( this._billboardRenderablePool.getItem(lineSegment)); + }; + + /** + * + * @param skybox + */ + CSSRendererBase.prototype.applySkybox = function (skybox) { + }; + + /** + * + * @param triangleSubMesh + */ + CSSRendererBase.prototype.applyTriangleSubMesh = function (triangleSubMesh) { + }; + + /** + * + * @param renderable + * @private + */ + CSSRendererBase.prototype._applyRenderable = function (renderable) { + var material = renderable.materialOwner.material; + var entity = renderable.sourceEntity; + var position = entity.scenePosition; + + if (material) { + //set ids for faster referencing + renderable.materialId = material._iMaterialId; + + // renderable.renderOrderId = material._iRenderOrderId; + renderable.cascaded = false; + + // project onto camera's z-axis + position = this._iEntryPoint.subtract(position); + renderable.zIndex = entity.zOffset - position.dotProduct(this._pCameraForward); + + //store reference to scene transform + renderable.renderSceneTransform = renderable.sourceEntity.getRenderSceneTransform(this._pCamera); + + //store reference to next item in list + renderable.next = this._renderableHead; + this._renderableHead = renderable; + } + }; + + /** + * @private + */ + CSSRendererBase.prototype.notifyScissorUpdate = function () { + if (this._scissorDirty) + return; + + this._scissorDirty = true; + + if (!this._scissorUpdated) + this._scissorUpdated = new RendererEvent(RendererEvent.SCISSOR_UPDATED); + + this.dispatchEvent(this._scissorUpdated); + }; + + /** + * @private + */ + CSSRendererBase.prototype.notifyViewportUpdate = function () { + if (this._viewportDirty) + return; + + this._viewportDirty = true; + + if (!this._viewPortUpdated) + this._viewPortUpdated = new RendererEvent(RendererEvent.VIEWPORT_UPDATED); + + this.dispatchEvent(this._viewPortUpdated); + }; + + /** + * + */ + CSSRendererBase.prototype.updateGlobalPos = function () { + this._viewPort.x = this._globalPos.x; + this._viewPort.y = this._globalPos.y; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + }; + + CSSRendererBase.prototype._iCreateEntityCollector = function () { + throw new AbstractMethodError(); + }; + return CSSRendererBase; +})(EventDispatcher); + +module.exports = CSSRendererBase; + + +},{"awayjs-core/lib/core/geom/Point":undefined,"awayjs-core/lib/core/geom/Rectangle":undefined,"awayjs-core/lib/core/pool/CSSBillboardRenderable":undefined,"awayjs-core/lib/core/pool/CSSLineSegmentRenderable":undefined,"awayjs-core/lib/core/pool/RenderablePool":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/events/RendererEvent":undefined}],"awayjs-core/lib/core/render/IRenderer":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/sort/IEntitySorter":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/sort/RenderableMergeSort":[function(require,module,exports){ +/** +* @class away.sort.RenderableMergeSort +*/ +var RenderableMergeSort = (function () { + function RenderableMergeSort() { + } + RenderableMergeSort.prototype.sortBlendedRenderables = function (head) { + var headB; + var fast; + var slow; + + if (!head || !head.next) { + return head; + } + + // split in two sublists + slow = head; + fast = head.next; + + while (fast) { + fast = fast.next; + if (fast) { + slow = slow.next; + fast = fast.next; + } + } + + headB = slow.next; + slow.next = null; + + // recurse + head = this.sortBlendedRenderables(head); + headB = this.sortBlendedRenderables(headB); + + // merge sublists while respecting order + var result; + var curr; + var l; + + if (!head) + return headB; + if (!headB) + return head; + + while (head && headB) { + if (head.zIndex < headB.zIndex) { + l = head; + head = head.next; + } else { + l = headB; + headB = headB.next; + } + + if (!result) + result = l; + else + curr.next = l; + + curr = l; + } + + if (head) + curr.next = head; + else if (headB) + curr.next = headB; + + return result; + }; + + RenderableMergeSort.prototype.sortOpaqueRenderables = function (head) { + var headB; + var fast, slow; + + if (!head || !head.next) { + return head; + } + + // split in two sublists + slow = head; + fast = head.next; + + while (fast) { + fast = fast.next; + if (fast) { + slow = slow.next; + fast = fast.next; + } + } + + headB = slow.next; + slow.next = null; + + // recurse + head = this.sortOpaqueRenderables(head); + headB = this.sortOpaqueRenderables(headB); + + // merge sublists while respecting order + var result; + var curr; + var l; + var cmp = 0; + + if (!head) + return headB; + if (!headB) + return head; + + while (head && headB && head != null && headB != null) { + // first sort per render order id (reduces program3D switches), + // then on material id (reduces setting props), + // then on zIndex (reduces overdraw) + var aid = head.renderOrderId; + var bid = headB.renderOrderId; + + if (aid == bid) { + var ma = head.materialId; + var mb = headB.materialId; + + if (ma == mb) { + if (head.zIndex < headB.zIndex) + cmp = 1; + else + cmp = -1; + } else if (ma > mb) { + cmp = 1; + } else { + cmp = -1; + } + } else if (aid > bid) { + cmp = 1; + } else { + cmp = -1; + } + + if (cmp < 0) { + l = head; + head = head.next; + } else { + l = headB; + headB = headB.next; + } + + if (!result) { + result = l; + curr = l; + } else { + curr.next = l; + curr = l; + } + } + + if (head) + curr.next = head; + else if (headB) + curr.next = headB; + + return result; + }; + return RenderableMergeSort; +})(); + +module.exports = RenderableMergeSort; + + +},{}],"awayjs-core/lib/core/text/AntiAliasType":[function(require,module,exports){ +/** +* The AntiAliasType class provides values for anti-aliasing in the +* away.text.TextField class. +*/ +var AntiAliasType = (function () { + function AntiAliasType() { + } + AntiAliasType.ADVANCED = "advanced"; + + AntiAliasType.NORMAL = "normal"; + return AntiAliasType; +})(); + +module.exports = AntiAliasType; + + +},{}],"awayjs-core/lib/core/text/GridFitType":[function(require,module,exports){ +/** +* The GridFitType class defines values for grid fitting in the TextField class. +*/ +var GridFitType = (function () { + function GridFitType() { + } + GridFitType.NONE = "none"; + + GridFitType.PIXEL = "pixel"; + + GridFitType.SUBPIXEL = "subpixel"; + return GridFitType; +})(); + +module.exports = GridFitType; + + +},{}],"awayjs-core/lib/core/text/TextFieldAutoSize":[function(require,module,exports){ +/** +* The TextFieldAutoSize class is an enumeration of constant values used in +* setting the autoSize property of the TextField class. +*/ +var TextFieldAutoSize = (function () { + function TextFieldAutoSize() { + } + TextFieldAutoSize.CENTER = "center"; + + TextFieldAutoSize.LEFT = "left"; + + TextFieldAutoSize.NONE = "none"; + + TextFieldAutoSize.RIGHT = "right"; + return TextFieldAutoSize; +})(); + +module.exports = TextFieldAutoSize; + + +},{}],"awayjs-core/lib/core/text/TextFieldType":[function(require,module,exports){ +/** +* The TextFieldType class is an enumeration of constant values used in setting the +* type property of the TextField class. +* +* @see away.entities.TextField#type +*/ +var TextFieldType = (function () { + function TextFieldType() { + } + TextFieldType.DYNAMIC = "dynamic"; + + TextFieldType.INPUT = "input"; + return TextFieldType; +})(); + +module.exports = TextFieldType; + + +},{}],"awayjs-core/lib/core/text/TextFormatAlign":[function(require,module,exports){ +/** +* The TextFormatAlign class provides values for text alignment in the +* TextFormat class. +*/ +var TextFormatAlign = (function () { + function TextFormatAlign() { + /** + * Constant; centers the text in the text field. Use the syntax + * TextFormatAlign.CENTER. + */ + this.CENTER = "center"; + /** + * Constant; justifies text within the text field. Use the syntax + * TextFormatAlign.JUSTIFY. + */ + this.JUSTIFY = "justify"; + /** + * Constant; aligns text to the left within the text field. Use the syntax + * TextFormatAlign.LEFT. + */ + this.LEFT = "left"; + /** + * Constant; aligns text to the right within the text field. Use the syntax + * TextFormatAlign.RIGHT. + */ + this.RIGHT = "right"; + } + return TextFormatAlign; +})(); + +module.exports = TextFormatAlign; + + +},{}],"awayjs-core/lib/core/text/TextFormat":[function(require,module,exports){ +/** +* The TextFormat class represents character formatting information. Use the +* TextFormat class to create specific text formatting for text fields. You +* can apply text formatting to both static and dynamic text fields. The +* properties of the TextFormat class apply to device and embedded fonts. +* However, for embedded fonts, bold and italic text actually require specific +* fonts. If you want to display bold or italic text with an embedded font, +* you need to embed the bold and italic variations of that font. +* +*

You must use the constructor new TextFormat() to create a +* TextFormat object before setting its properties. When you apply a +* TextFormat object to a text field using the +* TextField.defaultTextFormat property or the +* TextField.setTextFormat() method, only its defined properties +* are applied. Use the TextField.defaultTextFormat property to +* apply formatting BEFORE you add text to the TextField, and the +* setTextFormat() method to add formatting AFTER you add text to +* the TextField. The TextFormat properties are null +* by default because if you don't provide values for the properties, Flash +* Player uses its own default formatting. The default formatting that Flash +* Player uses for each property(if property's value is null) is +* as follows:

+* +*

The default formatting for each property is also described in each +* property description.

+*/ +var TextFormat = (function () { + /** + * Creates a TextFormat object with the specified properties. You can then + * change the properties of the TextFormat object to change the formatting of + * text fields. + * + *

Any parameter may be set to null to indicate that it is + * not defined. All of the parameters are optional; any omitted parameters + * are treated as null.

+ * + * @param font The name of a font for text as a string. + * @param size An integer that indicates the size in pixels. + * @param color The color of text using this text format. A number + * containing three 8-bit RGB components; for example, + * 0xFF0000 is red, and 0x00FF00 is green. + * @param bold A Boolean value that indicates whether the text is + * boldface. + * @param italic A Boolean value that indicates whether the text is + * italicized. + * @param underline A Boolean value that indicates whether the text is + * underlined. + * @param url The URL to which the text in this text format + * hyperlinks. If url is an empty string, the + * text does not have a hyperlink. + * @param target The target window where the hyperlink is displayed. If + * the target window is an empty string, the text is + * displayed in the default target window + * _self. If the url parameter + * is set to an empty string or to the value + * null, you can get or set this property, + * but the property will have no effect. + * @param align The alignment of the paragraph, as a TextFormatAlign + * value. + * @param leftMargin Indicates the left margin of the paragraph, in pixels. + * @param rightMargin Indicates the right margin of the paragraph, in pixels. + * @param indent An integer that indicates the indentation from the left + * margin to the first character in the paragraph. + * @param leading A number that indicates the amount of leading vertical + * space between lines. + */ + function TextFormat(font, size, color, bold, italic, underline, url, target, align, leftMargin, rightMargin, indent, leading) { + if (typeof font === "undefined") { font = "Times New Roman"; } + if (typeof size === "undefined") { size = 12; } + if (typeof color === "undefined") { color = 0x000000; } + if (typeof bold === "undefined") { bold = false; } + if (typeof italic === "undefined") { italic = false; } + if (typeof underline === "undefined") { underline = false; } + if (typeof url === "undefined") { url = ""; } + if (typeof target === "undefined") { target = ""; } + if (typeof align === "undefined") { align = "left"; } + if (typeof leftMargin === "undefined") { leftMargin = 0; } + if (typeof rightMargin === "undefined") { rightMargin = 0; } + if (typeof indent === "undefined") { indent = 0; } + if (typeof leading === "undefined") { leading = 0; } + /** + * Specifies custom tab stops as an array of non-negative integers. Each tab + * stop is specified in pixels. If custom tab stops are not specified + * (null), the default tab stop is 4(average character width). + */ + this.tabStops = new Array(); + this.font = font; + this.size = size; + this.bold = bold; + this.italic = italic; + this.underline = underline; + this.url = url; + this.target = target; + this.align = align; + this.leftMargin = leftMargin; + this.rightMargin = rightMargin; + this.indent = indent; + this.leading = leading; + } + return TextFormat; +})(); + +module.exports = TextFormat; + + +},{}],"awayjs-core/lib/core/text/TextInteractionMode":[function(require,module,exports){ +/** +* A class that defines the Interactive mode of a text field object. +* +* @see away.entities.TextField#textInteractionMode +*/ +var TextInteractionMode = (function () { + function TextInteractionMode() { + } + TextInteractionMode.NORMAL = "normal"; + + TextInteractionMode.SELECTION = "selection"; + return TextInteractionMode; +})(); + +module.exports = TextInteractionMode; + + +},{}],"awayjs-core/lib/core/text/TextLineMetrics":[function(require,module,exports){ +/** +* The TextLineMetrics class contains information about the text position and +* measurements of a line of text within a text field. All measurements are in +* pixels. Objects of this class are returned by the +* away.entities.TextField.getLineMetrics() method. +*/ +var TextLineMetrics = (function () { + /** + * Creates a TextLineMetrics object. The TextLineMetrics object contains + * information about the text metrics of a line of text in a text field. + * Objects of this class are returned by the + * away.entities.TextField.getLineMetrics() method. + * + * @param x The left position of the first character in pixels. + * @param width The width of the text of the selected lines (not + * necessarily the complete text) in pixels. + * @param height The height of the text of the selected lines (not + * necessarily the complete text) in pixels. + * @param ascent The length from the baseline to the top of the line + * height in pixels. + * @param descent The length from the baseline to the bottom depth of + * the line in pixels. + * @param leading The measurement of the vertical distance between the + * lines of text. + */ + function TextLineMetrics(x, width, height, ascent, descent, leading) { + if (typeof x === "undefined") { x = NaN; } + if (typeof width === "undefined") { width = NaN; } + if (typeof height === "undefined") { height = NaN; } + if (typeof ascent === "undefined") { ascent = NaN; } + if (typeof descent === "undefined") { descent = NaN; } + if (typeof leading === "undefined") { leading = NaN; } + } + return TextLineMetrics; +})(); + +module.exports = TextLineMetrics; + + +},{}],"awayjs-core/lib/core/traverse/CSSEntityCollector":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** +* @class away.traverse.CSSEntityCollector +*/ +var CSSEntityCollector = (function (_super) { + __extends(CSSEntityCollector, _super); + function CSSEntityCollector() { + _super.call(this); + } + return CSSEntityCollector; +})(CollectorBase); + +module.exports = CSSEntityCollector; + + +},{"awayjs-core/lib/core/traverse/CollectorBase":undefined}],"awayjs-core/lib/core/traverse/CollectorBase":[function(require,module,exports){ +var EntityListItemPool = require("awayjs-core/lib/core/pool/EntityListItemPool"); + +/** +* @class away.traverse.CollectorBase +*/ +var CollectorBase = (function () { + function CollectorBase() { + this._numCullPlanes = 0; + this._pNumEntities = 0; + this._pNumInteractiveEntities = 0; + this._pEntityListItemPool = new EntityListItemPool(); + } + Object.defineProperty(CollectorBase.prototype, "camera", { + /** + * + */ + get: function () { + return this._pCamera; + }, + set: function (value) { + this._pCamera = value; + this._cullPlanes = this._pCamera.frustumPlanes; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CollectorBase.prototype, "cullPlanes", { + /** + * + */ + get: function () { + return this._customCullPlanes; + }, + set: function (value) { + this._customCullPlanes = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CollectorBase.prototype, "entityHead", { + /** + * + */ + get: function () { + return this._pEntityHead; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CollectorBase.prototype, "numEntities", { + /** + * + */ + get: function () { + return this._pNumEntities; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CollectorBase.prototype, "numInteractiveEntities", { + /** + * + */ + get: function () { + return this._pNumInteractiveEntities; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + CollectorBase.prototype.clear = function () { + this._pNumEntities = this._pNumInteractiveEntities = 0; + this._cullPlanes = this._customCullPlanes ? this._customCullPlanes : (this._pCamera ? this._pCamera.frustumPlanes : null); + this._numCullPlanes = this._cullPlanes ? this._cullPlanes.length : 0; + this._pEntityHead = null; + this._pEntityListItemPool.freeAll(); + }; + + /** + * + * @param node + * @returns {boolean} + */ + CollectorBase.prototype.enterNode = function (node) { + var enter = this.scene._iCollectionMark != node._iCollectionMark && node.isInFrustum(this._cullPlanes, this._numCullPlanes); + + node._iCollectionMark = this.scene._iCollectionMark; + + return enter; + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applyDirectionalLight = function (entity) { + //don't do anything here + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applyEntity = function (entity) { + this._pNumEntities++; + + if (entity._iIsMouseEnabled()) + this._pNumInteractiveEntities++; + + var item = this._pEntityListItemPool.getItem(); + item.entity = entity; + + item.next = this._pEntityHead; + this._pEntityHead = item; + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applyLightProbe = function (entity) { + //don't do anything here + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applyPointLight = function (entity) { + //don't do anything here + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applySkybox = function (entity) { + //don't do anything here + }; + return CollectorBase; +})(); + +module.exports = CollectorBase; + + +},{"awayjs-core/lib/core/pool/EntityListItemPool":undefined}],"awayjs-core/lib/core/traverse/EntityCollector":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** +* @class away.traverse.EntityCollector +*/ +var EntityCollector = (function (_super) { + __extends(EntityCollector, _super); + function EntityCollector() { + _super.call(this); + this._pNumLights = 0; + this._numDirectionalLights = 0; + this._numPointLights = 0; + this._numLightProbes = 0; + + this._pLights = new Array(); + this._directionalLights = new Array(); + this._pointLights = new Array(); + this._lightProbes = new Array(); + } + Object.defineProperty(EntityCollector.prototype, "directionalLights", { + /** + * + */ + get: function () { + return this._directionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(EntityCollector.prototype, "lightProbes", { + /** + * + */ + get: function () { + return this._lightProbes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(EntityCollector.prototype, "lights", { + /** + * + */ + get: function () { + return this._pLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(EntityCollector.prototype, "pointLights", { + /** + * + */ + get: function () { + return this._pointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(EntityCollector.prototype, "skyBox", { + /** + * + */ + get: function () { + return this._pSkybox; + }, + enumerable: true, + configurable: true + }); + + /** + * + * @param entity + */ + EntityCollector.prototype.applyDirectionalLight = function (entity) { + this._directionalLights[this._numDirectionalLights++] = entity; + }; + + /** + * + * @param entity + */ + EntityCollector.prototype.applyLightProbe = function (entity) { + this._lightProbes[this._numLightProbes++] = entity; + }; + + /** + * + * @param entity + */ + EntityCollector.prototype.applyPointLight = function (entity) { + this._pointLights[this._numPointLights++] = entity; + }; + + /** + * + * @param entity + */ + EntityCollector.prototype.applySkybox = function (entity) { + this._pSkybox = entity; + }; + + /** + * + */ + EntityCollector.prototype.clear = function () { + _super.prototype.clear.call(this); + + this._pSkybox = null; + + if (this._pNumLights > 0) + this._pLights.length = this._pNumLights = 0; + + if (this._numDirectionalLights > 0) + this._directionalLights.length = this._numDirectionalLights = 0; + + if (this._numPointLights > 0) + this._pointLights.length = this._numPointLights = 0; + + if (this._numLightProbes > 0) + this._lightProbes.length = this._numLightProbes = 0; + }; + return EntityCollector; +})(CollectorBase); + +module.exports = EntityCollector; + + +},{"awayjs-core/lib/core/traverse/CollectorBase":undefined}],"awayjs-core/lib/core/traverse/ICollector":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/core/traverse/RaycastCollector":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** +* The RaycastCollector class is a traverser for scene partitions that collects all scene graph entities that are +* considered intersecting with the defined ray. +* +* @see away.partition.Partition +* @see away.entities.IEntity +* +* @class away.traverse.RaycastCollector +*/ +var RaycastCollector = (function (_super) { + __extends(RaycastCollector, _super); + /** + * Creates a new RaycastCollector object. + */ + function RaycastCollector() { + _super.call(this); + this._rayPosition = new Vector3D(); + this._rayDirection = new Vector3D(); + this._iCollectionMark = 0; + } + Object.defineProperty(RaycastCollector.prototype, "rayPosition", { + /** + * Provides the starting position of the ray. + */ + get: function () { + return this._rayPosition; + }, + set: function (value) { + this._rayPosition = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(RaycastCollector.prototype, "rayDirection", { + /** + * Provides the direction vector of the ray. + */ + get: function () { + return this._rayDirection; + }, + set: function (value) { + this._rayDirection = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * Returns true if the current node is at least partly in the frustum. If so, the partition node knows to pass on the traverser to its children. + * + * @param node The Partition3DNode object to frustum-test. + */ + RaycastCollector.prototype.enterNode = function (node) { + return node.isIntersectingRay(this._rayPosition, this._rayDirection); + }; + return RaycastCollector; +})(CollectorBase); + +module.exports = RaycastCollector; + + +},{"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/core/traverse/CollectorBase":undefined}],"awayjs-core/lib/core/traverse/ShadowCasterCollector":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** +* @class away.traverse.ShadowCasterCollector +*/ +var ShadowCasterCollector = (function (_super) { + __extends(ShadowCasterCollector, _super); + function ShadowCasterCollector() { + _super.call(this); + } + /** + * + */ + ShadowCasterCollector.prototype.enterNode = function (node) { + var enter = this.scene._iCollectionMark != node._iCollectionMark && node.isCastingShadow(); + + if (!enter) { + node._iCollectionMark = this.scene._iCollectionMark; + + return false; + } + + return _super.prototype.enterNode.call(this, node); + }; + return ShadowCasterCollector; +})(CollectorBase); + +module.exports = ShadowCasterCollector; + + +},{"awayjs-core/lib/core/traverse/CollectorBase":undefined}],"awayjs-core/lib/core/ui/Keyboard":[function(require,module,exports){ +var Keyboard = (function () { + function Keyboard() { + } + Keyboard.A = 65; + + Keyboard.ALTERNATE = 18; + + Keyboard.AUDIO = 0x01000017; + + Keyboard.B = 66; + + Keyboard.BACK = 0x01000016; + + Keyboard.BACKQUOTE = 192; + + Keyboard.BACKSLASH = 220; + + Keyboard.BACKSPACE = 8; + + Keyboard.BLUE = 0x01000003; + + Keyboard.C = 67; + + Keyboard.CAPS_LOCK = 20; + + Keyboard.CHANNEL_DOWN = 0x01000005; + + Keyboard.CHANNEL_UP = 0x01000005; + + Keyboard.COMMA = 188; + + Keyboard.COMMAND = 15; + + Keyboard.CONTROL = 17; + + Keyboard.D = 68; + + Keyboard.DELETE = 46; + + Keyboard.DOWN = 40; + + Keyboard.DVR = 0x01000019; + + Keyboard.E = 69; + + Keyboard.END = 35; + + Keyboard.ENTER = 13; + + Keyboard.EQUAL = 187; + + Keyboard.ESCAPE = 27; + + Keyboard.EXIT = 0x01000015; + + Keyboard.F = 70; + + Keyboard.F1 = 112; + + Keyboard.F10 = 121; + + Keyboard.F11 = 122; + + Keyboard.F12 = 123; + + Keyboard.F13 = 124; + + Keyboard.F14 = 125; + + Keyboard.F15 = 126; + + Keyboard.F2 = 113; + + Keyboard.F3 = 114; + + Keyboard.F4 = 115; + + Keyboard.F5 = 116; + + Keyboard.F6 = 117; + + Keyboard.F7 = 118; + + Keyboard.F8 = 119; + + Keyboard.F9 = 120; + + Keyboard.FAST_FORWARD = 0x0100000A; + + Keyboard.G = 71; + + Keyboard.GREEN = 0x01000001; + + Keyboard.GUIDE = 0x01000014; + + Keyboard.H = 72; + + Keyboard.HELP = 0x0100001D; + + Keyboard.HOME = 36; + + Keyboard.I = 73; + + Keyboard.INFO = 0x01000013; + + Keyboard.INPUT = 0x0100001B; + + Keyboard.INSERT = 45; + + Keyboard.J = 74; + + Keyboard.K = 75; + + Keyboard.KEYNAME_BEGIN = "Begin"; + + Keyboard.KEYNAME_BREAK = "Break"; + + Keyboard.KEYNAME_CLEARDISPLAY = "ClrDsp"; + + Keyboard.KEYNAME_CLEARLINE = "ClrLn"; + + Keyboard.KEYNAME_DELETE = "Delete"; + + Keyboard.KEYNAME_DELETECHAR = "DelChr"; + + Keyboard.KEYNAME_DELETELINE = "DelLn"; + + Keyboard.KEYNAME_DOWNARROW = "Down"; + + Keyboard.KEYNAME_END = "End"; + + Keyboard.KEYNAME_EXECUTE = "Exec"; + + Keyboard.KEYNAME_F1 = "F1"; + + Keyboard.KEYNAME_F10 = "F10"; + + Keyboard.KEYNAME_F11 = "F11"; + + Keyboard.KEYNAME_F12 = "F12"; + + Keyboard.KEYNAME_F13 = "F13"; + + Keyboard.KEYNAME_F14 = "F14"; + + Keyboard.KEYNAME_F15 = "F15"; + + Keyboard.KEYNAME_F16 = "F16"; + + Keyboard.KEYNAME_F17 = "F17"; + + Keyboard.KEYNAME_F18 = "F18"; + + Keyboard.KEYNAME_F19 = "F19"; + + Keyboard.KEYNAME_F2 = "F2"; + + Keyboard.KEYNAME_F20 = "F20"; + + Keyboard.KEYNAME_F21 = "F21"; + + Keyboard.KEYNAME_F22 = "F22"; + + Keyboard.KEYNAME_F23 = "F23"; + + Keyboard.KEYNAME_F24 = "F24"; + + Keyboard.KEYNAME_F25 = "F25"; + + Keyboard.KEYNAME_F26 = "F26"; + + Keyboard.KEYNAME_F27 = "F27"; + + Keyboard.KEYNAME_F28 = "F28"; + + Keyboard.KEYNAME_F29 = "F29"; + + Keyboard.KEYNAME_F3 = "F3"; + + Keyboard.KEYNAME_F30 = "F30"; + + Keyboard.KEYNAME_F31 = "F31"; + + Keyboard.KEYNAME_F32 = "F32"; + + Keyboard.KEYNAME_F33 = "F33"; + + Keyboard.KEYNAME_F34 = "F34"; + + Keyboard.KEYNAME_F35 = "F35"; + + Keyboard.KEYNAME_F4 = "F4"; + + Keyboard.KEYNAME_F5 = "F5"; + + Keyboard.KEYNAME_F6 = "F6"; + + Keyboard.KEYNAME_F7 = "F7"; + + Keyboard.KEYNAME_F8 = "F8"; + + Keyboard.KEYNAME_F9 = "F9"; + + Keyboard.KEYNAME_FIND = "Find"; + + Keyboard.KEYNAME_HELP = "Help"; + + Keyboard.KEYNAME_HOME = "Home"; + + Keyboard.KEYNAME_INSERT = "Insert"; + + Keyboard.KEYNAME_INSERTCHAR = "InsChr"; + + Keyboard.KEYNAME_INSERTLINE = "LnsLn"; + + Keyboard.KEYNAME_LEFTARROW = "Left"; + + Keyboard.KEYNAME_MENU = "Menu"; + + Keyboard.KEYNAME_MODESWITCH = "ModeSw"; + + Keyboard.KEYNAME_NEXT = "Next"; + + Keyboard.KEYNAME_PAGEDOWN = "PgDn"; + + Keyboard.KEYNAME_PAGEUP = "PgUp"; + + Keyboard.KEYNAME_PAUSE = "Pause"; + + Keyboard.KEYNAME_PREV = "Prev"; + + Keyboard.KEYNAME_PRINT = "Print"; + + Keyboard.KEYNAME_PRINTSCREEN = "PrntScrn"; + + Keyboard.KEYNAME_REDO = "Redo"; + + Keyboard.KEYNAME_RESET = "Reset"; + + Keyboard.KEYNAME_RIGHTARROW = "Right"; + + Keyboard.KEYNAME_SCROLLLOCK = "ScrlLck"; + + Keyboard.KEYNAME_SELECT = "Select"; + + Keyboard.KEYNAME_STOP = "Stop"; + + Keyboard.KEYNAME_SYSREQ = "SysReq"; + + Keyboard.KEYNAME_SYSTEM = "Sys"; + + Keyboard.KEYNAME_UNDO = "Undo"; + + Keyboard.KEYNAME_UPARROW = "Up"; + + Keyboard.KEYNAME_USER = "User"; + + Keyboard.L = 76; + + Keyboard.LAST = 0x01000011; + + Keyboard.LEFT = 37; + + Keyboard.LEFTBRACKET = 219; + + Keyboard.LIVE = 0x01000010; + + Keyboard.M = 77; + + Keyboard.MASTER_SHELL = 0x0100001E; + + Keyboard.MENU = 0x01000012; + + Keyboard.MINUS = 189; + + Keyboard.N = 78; + + Keyboard.NEXT = 0x0100000E; + + Keyboard.NUMBER_0 = 48; + + Keyboard.NUMBER_1 = 49; + + Keyboard.NUMBER_2 = 50; + + Keyboard.NUMBER_3 = 51; + + Keyboard.NUMBER_4 = 52; + + Keyboard.NUMBER_5 = 53; + + Keyboard.NUMBER_6 = 54; + + Keyboard.NUMBER_7 = 55; + + Keyboard.NUMBER_8 = 56; + + Keyboard.NUMBER_9 = 57; + + Keyboard.NUMPAD = 21; + + Keyboard.NUMPAD_0 = 96; + + Keyboard.NUMPAD_1 = 97; + + Keyboard.NUMPAD_2 = 98; + + Keyboard.NUMPAD_3 = 99; + + Keyboard.NUMPAD_4 = 100; + + Keyboard.NUMPAD_5 = 101; + + Keyboard.NUMPAD_6 = 102; + + Keyboard.NUMPAD_7 = 103; + + Keyboard.NUMPAD_8 = 104; + + Keyboard.NUMPAD_9 = 105; + + Keyboard.NUMPAD_ADD = 107; + + Keyboard.NUMPAD_DECIMAL = 110; + + Keyboard.NUMPAD_DIVIDE = 111; + + Keyboard.NUMPAD_ENTER = 108; + + Keyboard.NUMPAD_MULTIPLY = 106; + + Keyboard.NUMPAD_SUBTRACT = 109; + + Keyboard.O = 79; + + Keyboard.P = 80; + + Keyboard.PAGE_DOWN = 34; + + Keyboard.PAGE_UP = 33; + + Keyboard.PAUSE = 0x01000008; + + Keyboard.PERIOD = 190; + + Keyboard.PLAY = 0x01000007; + + Keyboard.PREVIOUS = 0x0100000F; + + Keyboard.Q = 81; + + Keyboard.QUOTE = 222; + + Keyboard.R = 82; + + Keyboard.RECORD = 0x01000006; + + Keyboard.RED = 0x01000000; + + Keyboard.REWIND = 0x0100000B; + + Keyboard.RIGHT = 39; + + Keyboard.RIGHTBRACKET = 221; + + Keyboard.S = 83; + + Keyboard.SEARCH = 0x0100001F; + + Keyboard.SEMICOLON = 186; + + Keyboard.SETUP = 0x0100001C; + + Keyboard.SHIFT = 16; + + Keyboard.SKIP_BACKWARD = 0x0100000D; + + Keyboard.SKIP_FORWARD = 0x0100000C; + + Keyboard.SLASH = 191; + + Keyboard.SPACE = 32; + + Keyboard.STOP = 0x01000009; + + Keyboard.SUBTITLE = 0x01000018; + + Keyboard.T = 84; + + Keyboard.TAB = 9; + + Keyboard.U = 85; + + Keyboard.UP = 38; + + Keyboard.V = 86; + + Keyboard.VOD = 0x0100001A; + + Keyboard.W = 87; + + Keyboard.X = 88; + + Keyboard.Y = 89; + + Keyboard.YELLOW = 0x01000002; + + Keyboard.Z = 90; + return Keyboard; +})(); + +module.exports = Keyboard; + + +},{}],"awayjs-core/lib/entities/Billboard":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +var MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); + +/** +* The Billboard class represents display objects that represent bitmap images. +* These can be images that you load with the flash.Assets or +* flash.display.Loader classes, or they can be images that you +* create with the Billboard() constructor. +* +*

The Billboard() constructor allows you to create a Billboard +* object that contains a reference to a BitmapData object. After you create a +* Billboard object, use the addChild() or addChildAt() +* method of the parent DisplayObjectContainer instance to place the bitmap on +* the display list.

+* +*

A Billboard object can share its BitmapData reference among several Billboard +* objects, independent of translation or rotation properties. Because you can +* create multiple Billboard objects that reference the same BitmapData object, +* multiple display objects can use the same complex BitmapData object without +* incurring the memory overhead of a BitmapData object for each display +* object instance.

+* +*

A BitmapData object can be drawn to the screen by a Billboard object in one +* of two ways: by using the default hardware renderer with a single hardware surface, +* or by using the slower software renderer when 3D acceleration is not available.

+* +*

If you would prefer to perform a batch rendering command, rather than using a +* single surface for each Billboard object, you can also draw to the screen using the +* drawTiles() or drawTriangles() methods which are +* available to flash.display.Tilesheet and flash.display.Graphics +* objects.

+* +*

Note: The Billboard class is not a subclass of the InteractiveObject +* class, so it cannot dispatch mouse events. However, you can use the +* addEventListener() method of the display object container that +* contains the Billboard object.

+*/ +var Billboard = (function (_super) { + __extends(Billboard, _super); + function Billboard(material, pixelSnapping, smoothing) { + if (typeof pixelSnapping === "undefined") { pixelSnapping = "auto"; } + if (typeof smoothing === "undefined") { smoothing = false; } + var _this = this; + _super.call(this); + + this._pIsEntity = true; + + this.onSizeChangedDelegate = function (event) { + return _this.onSizeChanged(event); + }; + + this.material = material; + + this._billboardWidth = material.width; + this._billboardHeight = material.height; + } + Object.defineProperty(Billboard.prototype, "animator", { + /** + * Defines the animator of the mesh. Act on the mesh's geometry. Defaults to null + */ + get: function () { + return this._animator; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Billboard.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.BILLBOARD; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Billboard.prototype, "billboardHeight", { + /** + * + */ + get: function () { + return this._billboardHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Billboard.prototype, "billboardWidth", { + /** + * + */ + get: function () { + return this._billboardWidth; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Billboard.prototype, "material", { + /** + * + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + if (this._material) { + this._material.iRemoveOwner(this); + this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + + this._material = value; + + if (this._material) { + this._material.iAddOwner(this); + this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Billboard.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * @protected + */ + Billboard.prototype.pCreateEntityPartitionNode = function () { + return new EntityNode(this); + }; + + /** + * @protected + */ + Billboard.prototype.pUpdateBounds = function () { + this._pBounds.fromExtremes(0, 0, 0, this._billboardWidth, this._billboardHeight, 0); + + _super.prototype.pUpdateBounds.call(this); + }; + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + Billboard.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { + return this._pPickingCollider.testBillboardCollision(this, this._pPickingCollisionVO, shortestCollisionDistance); + }; + + /** + * @private + */ + Billboard.prototype.onSizeChanged = function (event) { + this._billboardWidth = this._material.width; + this._billboardHeight = this._material.height; + + this._pBoundsInvalid = true; + + var len = this._pRenderables.length; + for (var i = 0; i < len; i++) + this._pRenderables[i].invalidateVertexData("vertices"); //TODO + }; + + Billboard.prototype._iCollectRenderables = function (renderer) { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + }; + + Billboard.prototype._iCollectRenderable = function (renderer) { + renderer.applyBillboard(this); + }; + return Billboard; +})(DisplayObject); + +module.exports = Billboard; + + +},{"awayjs-core/lib/core/base/DisplayObject":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/partition/EntityNode":undefined,"awayjs-core/lib/events/MaterialEvent":undefined}],"awayjs-core/lib/entities/Camera":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var CameraNode = require("awayjs-core/lib/core/partition/CameraNode"); + +var CameraEvent = require("awayjs-core/lib/events/CameraEvent"); +var ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); + +var PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); + +var Camera = (function (_super) { + __extends(Camera, _super); + function Camera(projection) { + if (typeof projection === "undefined") { projection = null; } + var _this = this; + _super.call(this); + this._viewProjection = new Matrix3D(); + this._viewProjectionDirty = true; + this._frustumPlanesDirty = true; + + this._pIsEntity = true; + + this._onProjectionMatrixChangedDelegate = function (event) { + return _this.onProjectionMatrixChanged(event); + }; + + this._projection = projection || new PerspectiveProjection(); + this._projection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + + this._frustumPlanes = []; + + for (var i = 0; i < 6; ++i) + this._frustumPlanes[i] = new Plane3D(); + + this.z = -1000; + } + Camera.prototype.pCreateDefaultBoundingVolume = function () { + return new NullBounds(); + }; + + /** + * @protected + */ + Camera.prototype.pCreateEntityPartitionNode = function () { + return new CameraNode(this); + }; + + Object.defineProperty(Camera.prototype, "assetType", { + //@override + get: function () { + return AssetType.CAMERA; + }, + enumerable: true, + configurable: true + }); + + Camera.prototype.onProjectionMatrixChanged = function (event) { + this._viewProjectionDirty = true; + this._frustumPlanesDirty = true; + this.dispatchEvent(event); + }; + + Object.defineProperty(Camera.prototype, "frustumPlanes", { + get: function () { + if (this._frustumPlanesDirty) + this.updateFrustum(); + + return this._frustumPlanes; + }, + enumerable: true, + configurable: true + }); + + Camera.prototype.updateFrustum = function () { + var a, b, c; + + //var d : Number; + var c11, c12, c13, c14; + var c21, c22, c23, c24; + var c31, c32, c33, c34; + var c41, c42, c43, c44; + var p; + var raw = new Array(16); + ; + var invLen; + this.viewProjection.copyRawDataTo(raw); + + c11 = raw[0]; + c12 = raw[4]; + c13 = raw[8]; + c14 = raw[12]; + c21 = raw[1]; + c22 = raw[5]; + c23 = raw[9]; + c24 = raw[13]; + c31 = raw[2]; + c32 = raw[6]; + c33 = raw[10]; + c34 = raw[14]; + c41 = raw[3]; + c42 = raw[7]; + c43 = raw[11]; + c44 = raw[15]; + + // left plane + p = this._frustumPlanes[0]; + a = c41 + c11; + b = c42 + c12; + c = c43 + c13; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = -(c44 + c14) * invLen; + + // right plane + p = this._frustumPlanes[1]; + a = c41 - c11; + b = c42 - c12; + c = c43 - c13; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = (c14 - c44) * invLen; + + // bottom + p = this._frustumPlanes[2]; + a = c41 + c21; + b = c42 + c22; + c = c43 + c23; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = -(c44 + c24) * invLen; + + // top + p = this._frustumPlanes[3]; + a = c41 - c21; + b = c42 - c22; + c = c43 - c23; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = (c24 - c44) * invLen; + + // near + p = this._frustumPlanes[4]; + a = c31; + b = c32; + c = c33; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = -c34 * invLen; + + // far + p = this._frustumPlanes[5]; + a = c41 - c31; + b = c42 - c32; + c = c43 - c33; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = (c34 - c44) * invLen; + + this._frustumPlanesDirty = false; + }; + + /** + * @protected + */ + Camera.prototype.pInvalidateSceneTransform = function () { + _super.prototype.pInvalidateSceneTransform.call(this); + + this._viewProjectionDirty = true; + this._frustumPlanesDirty = true; + }; + + /** + * @protected + */ + Camera.prototype.pUpdateBounds = function () { + this._pBoundsInvalid = false; + this._pBounds.nullify(); + }; + + Object.defineProperty(Camera.prototype, "projection", { + /** + * + */ + get: function () { + return this._projection; + }, + set: function (value) { + if (this._projection == value) + return; + + if (!value) + throw new Error("Projection cannot be null!"); + + this._projection.removeEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + this._projection = value; + this._projection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + this.dispatchEvent(new CameraEvent(CameraEvent.PROJECTION_CHANGED, this)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Camera.prototype, "viewProjection", { + /** + * + */ + get: function () { + if (this._viewProjectionDirty) { + this._viewProjection.copyFrom(this.inverseSceneTransform); + this._viewProjection.append(this._projection.matrix); + this._viewProjectionDirty = false; + } + + return this._viewProjection; + }, + enumerable: true, + configurable: true + }); + + /** + * Calculates the ray in scene space from the camera to the given normalized coordinates in screen space. + * + * @param nX The normalised x coordinate in screen space, -1 corresponds to the left edge of the viewport, 1 to the right. + * @param nY The normalised y coordinate in screen space, -1 corresponds to the top edge of the viewport, 1 to the bottom. + * @param sZ The z coordinate in screen space, representing the distance into the screen. + * @return The ray from the camera to the scene space position of the given screen coordinates. + */ + Camera.prototype.getRay = function (nX, nY, sZ) { + return this.sceneTransform.deltaTransformVector(this._projection.unproject(nX, nY, sZ)); + }; + + /** + * Calculates the normalised position in screen space of the given scene position. + * + * @param point3d the position vector of the scene coordinates to be projected. + * @return The normalised screen position of the given scene coordinates. + */ + Camera.prototype.project = function (point3d) { + return this._projection.project(this.inverseSceneTransform.transformVector(point3d)); + }; + + /** + * Calculates the scene position of the given normalized coordinates in screen space. + * + * @param nX The normalised x coordinate in screen space, minus the originX offset of the projection property. + * @param nY The normalised y coordinate in screen space, minus the originY offset of the projection property. + * @param sZ The z coordinate in screen space, representing the distance into the screen. + * @return The scene position of the given screen coordinates. + */ + Camera.prototype.unproject = function (nX, nY, sZ) { + return this.sceneTransform.transformVector(this._projection.unproject(nX, nY, sZ)); + }; + + Camera.prototype._iCollectRenderables = function (renderer) { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + }; + + Camera.prototype._iCollectRenderable = function (renderer) { + //nothing to do here + }; + return Camera; +})(DisplayObjectContainer); + +module.exports = Camera; + + +},{"awayjs-core/lib/bounds/NullBounds":undefined,"awayjs-core/lib/containers/DisplayObjectContainer":undefined,"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/geom/Plane3D":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/partition/CameraNode":undefined,"awayjs-core/lib/events/CameraEvent":undefined,"awayjs-core/lib/events/ProjectionEvent":undefined,"awayjs-core/lib/projections/PerspectiveProjection":undefined}],"awayjs-core/lib/entities/DirectionalLight":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +var LightBase = require("awayjs-core/lib/core/base/LightBase"); +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var DirectionalLightNode = require("awayjs-core/lib/core/partition/DirectionalLightNode"); + +var DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + +var DirectionalLight = (function (_super) { + __extends(DirectionalLight, _super); + function DirectionalLight(xDir, yDir, zDir) { + if (typeof xDir === "undefined") { xDir = 0; } + if (typeof yDir === "undefined") { yDir = -1; } + if (typeof zDir === "undefined") { zDir = 1; } + _super.call(this); + + this._pIsEntity = true; + + this.direction = new Vector3D(xDir, yDir, zDir); + + this._sceneDirection = new Vector3D(); + } + Object.defineProperty(DirectionalLight.prototype, "sceneDirection", { + get: function () { + if (this._pSceneTransformDirty) + this.pUpdateSceneTransform(); + + return this._sceneDirection; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DirectionalLight.prototype, "direction", { + get: function () { + return this._direction; + }, + set: function (value) { + this._direction = value; + + if (!this._tmpLookAt) + this._tmpLookAt = new Vector3D(); + + this._tmpLookAt.x = this.x + this._direction.x; + this._tmpLookAt.y = this.y + this._direction.y; + this._tmpLookAt.z = this.z + this._direction.z; + + this.lookAt(this._tmpLookAt); + }, + enumerable: true, + configurable: true + }); + + + /** + * + * @returns {away.bounds.NullBounds} + */ + DirectionalLight.prototype.pCreateDefaultBoundingVolume = function () { + //directional lights are to be considered global, hence always in view + return new NullBounds(); + }; + + /** + * + */ + DirectionalLight.prototype.pUpdateBounds = function () { + }; + + //@override + DirectionalLight.prototype.pUpdateSceneTransform = function () { + _super.prototype.pUpdateSceneTransform.call(this); + this.sceneTransform.copyColumnTo(2, this._sceneDirection); + this._sceneDirection.normalize(); + }; + + //@override + DirectionalLight.prototype.pCreateShadowMapper = function () { + return new DirectionalShadowMapper(); + }; + + /** + * @protected + */ + DirectionalLight.prototype.pCreateEntityPartitionNode = function () { + return new DirectionalLightNode(this); + }; + + //override + DirectionalLight.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { + if (typeof target === "undefined") { target = null; } + var raw = new Array(); + var bounds = entity.bounds; + var m = new Matrix3D(); + + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this.inverseSceneTransform); + + if (!this._projAABBPoints) + this._projAABBPoints = []; + + m.transformVectors(bounds.aabbPoints, this._projAABBPoints); + + var xMin = Infinity, xMax = -Infinity; + var yMin = Infinity, yMax = -Infinity; + var zMin = Infinity, zMax = -Infinity; + var d; + for (var i = 0; i < 24;) { + d = this._projAABBPoints[i++]; + + if (d < xMin) + xMin = d; + + if (d > xMax) + xMax = d; + + d = this._projAABBPoints[i++]; + + if (d < yMin) + yMin = d; + + if (d > yMax) + yMax = d; + + d = this._projAABBPoints[i++]; + + if (d < zMin) + zMin = d; + + if (d > zMax) + zMax = d; + } + + var invXRange = 1 / (xMax - xMin); + var invYRange = 1 / (yMax - yMin); + var invZRange = 1 / (zMax - zMin); + raw[0] = 2 * invXRange; + raw[5] = 2 * invYRange; + raw[10] = invZRange; + raw[12] = -(xMax + xMin) * invXRange; + raw[13] = -(yMax + yMin) * invYRange; + raw[14] = -zMin * invZRange; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + raw[15] = 1; + + if (!target) + target = new Matrix3D(); + + target.copyRawDataFrom(raw); + target.prepend(m); + + return target; + }; + + DirectionalLight.prototype._iCollectRenderables = function (renderer) { + //nothing to do here + }; + return DirectionalLight; +})(LightBase); + +module.exports = DirectionalLight; + + +},{"awayjs-core/lib/bounds/NullBounds":undefined,"awayjs-core/lib/core/base/LightBase":undefined,"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/core/partition/DirectionalLightNode":undefined,"awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper":undefined}],"awayjs-core/lib/entities/IEntity":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/entities/LightProbe":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +var LightBase = require("awayjs-core/lib/core/base/LightBase"); + +var LightProbeNode = require("awayjs-core/lib/core/partition/LightProbeNode"); + +var Error = require("awayjs-core/lib/errors/Error"); + +var LightProbe = (function (_super) { + __extends(LightProbe, _super); + function LightProbe(diffuseMap, specularMap) { + if (typeof specularMap === "undefined") { specularMap = null; } + _super.call(this); + + this._pIsEntity = true; + + this._diffuseMap = diffuseMap; + this._specularMap = specularMap; + } + Object.defineProperty(LightProbe.prototype, "diffuseMap", { + get: function () { + return this._diffuseMap; + }, + set: function (value) { + this._diffuseMap = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightProbe.prototype, "specularMap", { + get: function () { + return this._specularMap; + }, + set: function (value) { + this._specularMap = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * @protected + */ + LightProbe.prototype.pCreateEntityPartitionNode = function () { + return new LightProbeNode(this); + }; + + //@override + LightProbe.prototype.pUpdateBounds = function () { + this._pBoundsInvalid = false; + }; + + //@override + LightProbe.prototype.pCreateDefaultBoundingVolume = function () { + return new NullBounds(); + }; + + //@override + LightProbe.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { + if (typeof target === "undefined") { target = null; } + throw new Error("Object projection matrices are not supported for LightProbe objects!"); + }; + + LightProbe.prototype._iCollectRenderables = function (renderer) { + //nothing to do here + }; + return LightProbe; +})(LightBase); + +module.exports = LightProbe; + + +},{"awayjs-core/lib/bounds/NullBounds":undefined,"awayjs-core/lib/core/base/LightBase":undefined,"awayjs-core/lib/core/partition/LightProbeNode":undefined,"awayjs-core/lib/errors/Error":undefined}],"awayjs-core/lib/entities/LineSegment":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +var MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); + +/** +* A Line Segment primitive. +*/ +var LineSegment = (function (_super) { + __extends(LineSegment, _super); + /** + * Create a line segment + * + * @param startPosition Start position of the line segment + * @param endPosition Ending position of the line segment + * @param thickness Thickness of the line + */ + function LineSegment(material, startPosition, endPosition, thickness) { + if (typeof thickness === "undefined") { thickness = 1; } + var _this = this; + _super.call(this); + + this._pIsEntity = true; + + this.onSizeChangedDelegate = function (event) { + return _this.onSizeChanged(event); + }; + + this.material = material; + + this._startPosition = startPosition; + this._endPosition = endPosition; + this._halfThickness = thickness * 0.5; + } + Object.defineProperty(LineSegment.prototype, "animator", { + /** + * Defines the animator of the line segment. Act on the line segment's geometry. Defaults to null + */ + get: function () { + return this._animator; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSegment.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.LINE_SEGMENT; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSegment.prototype, "startPostion", { + /** + * + */ + get: function () { + return this._startPosition; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSegment.prototype, "startPosition", { + set: function (value) { + if (this._startPosition == value) + return; + + this._startPosition = value; + + this.notifyRenderableUpdate(); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSegment.prototype, "endPosition", { + /** + * + */ + get: function () { + return this._endPosition; + }, + set: function (value) { + if (this._endPosition == value) + return; + + this._endPosition = value; + + this.notifyRenderableUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LineSegment.prototype, "material", { + /** + * + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + if (this._material) { + this._material.iRemoveOwner(this); + this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + + this._material = value; + + if (this._material) { + this._material.iAddOwner(this); + this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LineSegment.prototype, "thickness", { + /** + * + */ + get: function () { + return this._halfThickness * 2; + }, + set: function (value) { + if (this._halfThickness == value) + return; + + this._halfThickness = value * 0.5; + + this.notifyRenderableUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LineSegment.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + LineSegment.prototype.dispose = function () { + this._startPosition = null; + this._endPosition = null; + }; + + /** + * @protected + */ + LineSegment.prototype.pCreateEntityPartitionNode = function () { + return new EntityNode(this); + }; + + /** + * @protected + */ + LineSegment.prototype.pUpdateBounds = function () { + this._pBounds.fromExtremes(this._startPosition.x, this._startPosition.y, this._startPosition.z, this._endPosition.x, this._endPosition.y, this._endPosition.z); + + _super.prototype.pUpdateBounds.call(this); + }; + + /** + * @private + */ + LineSegment.prototype.onSizeChanged = function (event) { + this.notifyRenderableUpdate(); + }; + + /** + * @private + */ + LineSegment.prototype.notifyRenderableUpdate = function () { + var len = this._pRenderables.length; + for (var i = 0; i < len; i++) + this._pRenderables[i].invalidateVertexData("vertices"); //TODO + }; + + LineSegment.prototype._iCollectRenderables = function (renderer) { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + }; + + LineSegment.prototype._iCollectRenderable = function (renderer) { + //TODO + }; + return LineSegment; +})(DisplayObject); + +module.exports = LineSegment; + + +},{"awayjs-core/lib/core/base/DisplayObject":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/partition/EntityNode":undefined,"awayjs-core/lib/events/MaterialEvent":undefined}],"awayjs-core/lib/entities/Mesh":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + +var Geometry = require("awayjs-core/lib/core/base/Geometry"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +var GeometryEvent = require("awayjs-core/lib/events/GeometryEvent"); + +/** +* Mesh is an instance of a Geometry, augmenting it with a presence in the scene graph, a material, and an animation +* state. It consists out of SubMeshes, which in turn correspond to SubGeometries. SubMeshes allow different parts +* of the geometry to be assigned different materials. +*/ +var Mesh = (function (_super) { + __extends(Mesh, _super); + /** + * Create a new Mesh object. + * + * @param geometry The geometry used by the mesh that provides it with its shape. + * @param material [optional] The material with which to render the Mesh. + */ + function Mesh(geometry, material) { + if (typeof material === "undefined") { material = null; } + var _this = this; + _super.call(this); + this._castsShadows = true; + this._shareAnimationGeometry = true; + + this._pIsEntity = true; + + this._subMeshes = new Array(); + + this._onGeometryBoundsInvalidDelegate = function (event) { + return _this.onGeometryBoundsInvalid(event); + }; + this._onSubGeometryAddedDelegate = function (event) { + return _this.onSubGeometryAdded(event); + }; + this._onSubGeometryRemovedDelegate = function (event) { + return _this.onSubGeometryRemoved(event); + }; + + //this should never happen, but if people insist on trying to create their meshes before they have geometry to fill it, it becomes necessary + this.geometry = geometry || new Geometry(); + + this.material = material; + } + Object.defineProperty(Mesh.prototype, "animator", { + /** + * Defines the animator of the mesh. Act on the mesh's geometry. Default value is null. + */ + get: function () { + return this._animator; + }, + set: function (value) { + if (this._animator) + this._animator.removeOwner(this); + + this._animator = value; + + var len = this._subMeshes.length; + var subMesh; + + for (var i = 0; i < len; ++i) { + subMesh = this._subMeshes[i]; + + // cause material to be unregistered and registered again to work with the new animation type (if possible) + if (subMesh.material) { + subMesh.material.iRemoveOwner(subMesh); + subMesh.material.iAddOwner(subMesh); + } + + //invalidate any existing renderables in case they need to pull new geometry + subMesh._iInvalidateRenderableGeometry(); + } + + if (this._animator) + this._animator.addOwner(this); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.MESH; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Mesh.prototype, "castsShadows", { + /** + * Indicates whether or not the Mesh can cast shadows. Default value is true. + */ + get: function () { + return this._castsShadows; + }, + set: function (value) { + this._castsShadows = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "geometry", { + /** + * The geometry used by the mesh that provides it with its shape. + */ + get: function () { + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + return this._geometry; + }, + set: function (value) { + var i; + + if (this._geometry) { + this._geometry.removeEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); + this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); + this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); + + for (i = 0; i < this._subMeshes.length; ++i) + this._subMeshes[i].dispose(); + + this._subMeshes.length = 0; + } + + this._geometry = value; + + if (this._geometry) { + this._geometry.addEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); + this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); + this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); + + var subGeoms = this._geometry.subGeometries; + + for (i = 0; i < subGeoms.length; ++i) + this.addSubMesh(subGeoms[i]); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "material", { + /** + * The material with which to render the Mesh. + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + var i; + var len = this._subMeshes.length; + var subMesh; + + for (i = 0; i < len; i++) + if (this._material && (subMesh = this._subMeshes[i]).material == this._material) + this._material.iRemoveOwner(subMesh); + + this._material = value; + + for (i = 0; i < len; i++) + if (this._material && (subMesh = this._subMeshes[i]).material == this._material) + this._material.iAddOwner(subMesh); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "shareAnimationGeometry", { + /** + * Indicates whether or not the mesh share the same animation geometry. + */ + get: function () { + return this._shareAnimationGeometry; + }, + set: function (value) { + this._shareAnimationGeometry = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "subMeshes", { + /** + * The SubMeshes out of which the Mesh consists. Every SubMesh can be assigned a material to override the Mesh's + * material. + */ + get: function () { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + return this._subMeshes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Mesh.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * + */ + Mesh.prototype.bakeTransformations = function () { + this.geometry.applyTransformation(this._iMatrix3D); + this._iMatrix3D.identity(); + }; + + /** + * @inheritDoc + */ + Mesh.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + this.material = null; + this.geometry = null; + }; + + /** + * Disposes mesh including the animator and children. This is a merely a convenience method. + * @return + */ + Mesh.prototype.disposeWithAnimatorAndChildren = function () { + this.disposeWithChildren(); + + if (this._animator) + this._animator.dispose(); + }; + + /** + * Clones this Mesh instance along with all it's children, while re-using the same + * material, geometry and animation set. The returned result will be a copy of this mesh, + * containing copies of all of it's children. + * + * Properties that are re-used (i.e. not cloned) by the new copy include name, + * geometry, and material. Properties that are cloned or created anew for the copy + * include subMeshes, children of the mesh, and the animator. + * + * If you want to copy just the mesh, reusing it's geometry and material while not + * cloning it's children, the simplest way is to create a new mesh manually: + * + * + * var clone : Mesh = new Mesh(original.geometry, original.material); + * + */ + Mesh.prototype.clone = function () { + var clone = new Mesh(this._geometry, this._material); + + clone._iMatrix3D = this._iMatrix3D; + clone.pivot = this.pivot; + clone.partition = this.partition; + clone.bounds = this.bounds.clone(); + + clone.name = this.name; + clone.castsShadows = this.castsShadows; + clone.shareAnimationGeometry = this.shareAnimationGeometry; + clone.mouseEnabled = this.mouseEnabled; + clone.mouseChildren = this.mouseChildren; + + //this is of course no proper cloning + //maybe use this instead?: http://blog.another-d-mention.ro/programming/how-to-clone-duplicate-an-object-in-actionscript-3/ + clone.extra = this.extra; + + var len = this._subMeshes.length; + for (var i = 0; i < len; ++i) + clone._subMeshes[i].material = this._subMeshes[i]._iGetExplicitMaterial(); + + len = this.numChildren; + var obj; + + for (i = 0; i < len; ++i) { + obj = this.getChildAt(i).clone(); + clone.addChild(obj); + } + + if (this._animator) + clone.animator = this._animator.clone(); + + return clone; + }; + + /** + * //TODO + * + * @param subGeometry + * @returns {SubMeshBase} + */ + Mesh.prototype.getSubMeshFromSubGeometry = function (subGeometry) { + return this._subMeshes[this._geometry.subGeometries.indexOf(subGeometry)]; + }; + + /** + * @protected + */ + Mesh.prototype.pCreateEntityPartitionNode = function () { + return new EntityNode(this); + }; + + /** + * //TODO + * + * @protected + */ + Mesh.prototype.pUpdateBounds = function () { + this._pBounds.fromGeometry(this._geometry); + + _super.prototype.pUpdateBounds.call(this); + }; + + /** + * //TODO + * + * @private + */ + Mesh.prototype.onGeometryBoundsInvalid = function (event) { + this.pInvalidateBounds(); + }; + + /** + * Called when a SubGeometry was added to the Geometry. + * + * @private + */ + Mesh.prototype.onSubGeometryAdded = function (event) { + this.addSubMesh(event.subGeometry); + }; + + /** + * Called when a SubGeometry was removed from the Geometry. + * + * @private + */ + Mesh.prototype.onSubGeometryRemoved = function (event) { + var subMesh; + var subGeom = event.subGeometry; + var len = this._subMeshes.length; + var i; + + for (i = 0; i < len; ++i) { + subMesh = this._subMeshes[i]; + + if (subMesh.subGeometry == subGeom) { + subMesh.dispose(); + + this._subMeshes.splice(i, 1); + + break; + } + } + + --len; + for (; i < len; ++i) + this._subMeshes[i]._iIndex = i; + }; + + /** + * Adds a SubMeshBase wrapping a SubGeometry. + * + * @param subGeometry + */ + Mesh.prototype.addSubMesh = function (subGeometry) { + var SubMeshClass = subGeometry.subMeshClass; + + var subMesh = new SubMeshClass(subGeometry, this, null); + var len = this._subMeshes.length; + + subMesh._iIndex = len; + + this._subMeshes[len] = subMesh; + + this.pInvalidateBounds(); + }; + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + Mesh.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { + return this._pPickingCollider.testMeshCollision(this, this._pPickingCollisionVO, shortestCollisionDistance, findClosest); + }; + + /** + * + * @param renderer + * + * @internal + */ + Mesh.prototype._iCollectRenderables = function (renderer) { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + var len = this._subMeshes.length; + for (var i = 0; i < len; i++) + this._subMeshes[i]._iCollectRenderable(renderer); + }; + + Mesh.prototype._iInvalidateRenderableGeometries = function () { + var len = this._subMeshes.length; + for (var i = 0; i < len; ++i) + this._subMeshes[i]._iInvalidateRenderableGeometry(); + }; + return Mesh; +})(DisplayObjectContainer); + +module.exports = Mesh; + + +},{"awayjs-core/lib/containers/DisplayObjectContainer":undefined,"awayjs-core/lib/core/base/Geometry":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/partition/EntityNode":undefined,"awayjs-core/lib/events/GeometryEvent":undefined}],"awayjs-core/lib/entities/PointLight":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BoundingSphere = require("awayjs-core/lib/bounds/BoundingSphere"); + +var LightBase = require("awayjs-core/lib/core/base/LightBase"); + +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var PointLightNode = require("awayjs-core/lib/core/partition/PointLightNode"); + +var CubeMapShadowMapper = require("awayjs-core/lib/materials/shadowmappers/CubeMapShadowMapper"); + +var PointLight = (function (_super) { + __extends(PointLight, _super); + function PointLight() { + _super.call(this); + this._pRadius = 90000; + this._pFallOff = 100000; + + this._pIsEntity = true; + + this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); + } + PointLight.prototype.pCreateShadowMapper = function () { + return new CubeMapShadowMapper(); + }; + + Object.defineProperty(PointLight.prototype, "radius", { + get: function () { + return this._pRadius; + }, + set: function (value) { + this._pRadius = value; + + if (this._pRadius < 0) { + this._pRadius = 0; + } else if (this._pRadius > this._pFallOff) { + this._pFallOff = this._pRadius; + this.pInvalidateBounds(); + } + this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); + }, + enumerable: true, + configurable: true + }); + + + PointLight.prototype.iFallOffFactor = function () { + return this._pFallOffFactor; + }; + + Object.defineProperty(PointLight.prototype, "fallOff", { + get: function () { + return this._pFallOff; + }, + set: function (value) { + this._pFallOff = value; + + if (this._pFallOff < 0) + this._pFallOff = 0; + + if (this._pFallOff < this._pRadius) + this._pRadius = this._pFallOff; + + this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); + this.pInvalidateBounds(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @protected + */ + PointLight.prototype.pCreateEntityPartitionNode = function () { + return new PointLightNode(this); + }; + + PointLight.prototype.pUpdateBounds = function () { + this._pBounds.fromSphere(new Vector3D(), this._pFallOff); + this._pBoundsInvalid = false; + }; + + PointLight.prototype.pCreateDefaultBoundingVolume = function () { + //point lights are culled based on their falloff radius + return new BoundingSphere(); + }; + + PointLight.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { + if (typeof target === "undefined") { target = null; } + var raw = new Array(16); + var bounds = entity.bounds; + var m = new Matrix3D(); + + // todo: do not use lookAt on Light + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this._pParent.inverseSceneTransform); + this.lookAt(m.position); + + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this.inverseSceneTransform); + + var box = bounds.aabb; + var v1 = m.deltaTransformVector(new Vector3D(box.left, box.bottom, box.front)); + var v2 = m.deltaTransformVector(new Vector3D(box.right, box.top, box.back)); + var d1 = v1.x * v1.x + v1.y * v1.y + v1.z * v1.z; + var d2 = v2.x * v2.x + v2.y * v2.y + v2.z * v2.z; + var d = Math.sqrt(d1 > d2 ? d1 : d2); + var zMin; + var zMax; + + var z = m.rawData[14]; + zMin = z - d; + zMax = z + d; + + raw[5] = raw[0] = zMin / d; + raw[10] = zMax / (zMax - zMin); + raw[11] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[12] = raw[13] = raw[15] = 0; + raw[14] = -zMin * raw[10]; + + if (!target) + target = new Matrix3D(); + + target.copyRawDataFrom(raw); + target.prepend(m); + + return target; + }; + + PointLight.prototype._iCollectRenderables = function (renderer) { + //nothing to do here + }; + return PointLight; +})(LightBase); + +module.exports = PointLight; + + +},{"awayjs-core/lib/bounds/BoundingSphere":undefined,"awayjs-core/lib/core/base/LightBase":undefined,"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/core/partition/PointLightNode":undefined,"awayjs-core/lib/materials/shadowmappers/CubeMapShadowMapper":undefined}],"awayjs-core/lib/entities/Shape":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +/** +* This class is used to create lightweight shapes using the ActionScript +* drawing application program interface(API). The Shape class includes a +* graphics property, which lets you access methods from the +* Graphics class. +* +*

The Sprite class also includes a graphicsproperty, and it +* includes other features not available to the Shape class. For example, a +* Sprite object is a display object container, whereas a Shape object is not +* (and cannot contain child display objects). For this reason, Shape objects +* consume less memory than Sprite objects that contain the same graphics. +* However, a Sprite object supports user input events, while a Shape object +* does not.

+*/ +var Shape = (function (_super) { + __extends(Shape, _super); + /** + * Creates a new Shape object. + */ + function Shape() { + _super.call(this); + } + Object.defineProperty(Shape.prototype, "graphics", { + /** + * Specifies the Graphics object belonging to this Shape object, where vector + * drawing commands can occur. + */ + get: function () { + return this._graphics; + }, + enumerable: true, + configurable: true + }); + return Shape; +})(DisplayObject); + +module.exports = Shape; + + +},{"awayjs-core/lib/core/base/DisplayObject":undefined}],"awayjs-core/lib/entities/Skybox":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var SkyboxNode = require("awayjs-core/lib/core/partition/SkyboxNode"); + +/** +* A Skybox class is used to render a sky in the scene. It's always considered static and 'at infinity', and as +* such it's always centered at the camera's position and sized to exactly fit within the camera's frustum, ensuring +* the sky box is always as large as possible without being clipped. +*/ +var Skybox = (function (_super) { + __extends(Skybox, _super); + /** + * Create a new Skybox object. + * + * @param material The material with which to render the Skybox. + */ + function Skybox(material) { + _super.call(this); + + this._pIsEntity = true; + + this.material = material; + } + Object.defineProperty(Skybox.prototype, "animator", { + get: function () { + return this._animator; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Skybox.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Skybox.prototype, "material", { + /** + * The material with which to render the Skybox. + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + if (this._material) + this._material.iRemoveOwner(this); + + this._material = value; + + if (this._material) + this._material.iAddOwner(this); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Skybox.prototype, "assetType", { + get: function () { + return AssetType.SKYBOX; + }, + enumerable: true, + configurable: true + }); + + /** + * @protected + */ + Skybox.prototype.pInvalidateBounds = function () { + // dead end + }; + + /** + * @protected + */ + Skybox.prototype.pCreateEntityPartitionNode = function () { + return new SkyboxNode(this); + }; + + /** + * @protected + */ + Skybox.prototype.pCreateDefaultBoundingVolume = function () { + return new NullBounds(); + }; + + /** + * @protected + */ + Skybox.prototype.pUpdateBounds = function () { + this._pBoundsInvalid = false; + }; + + Object.defineProperty(Skybox.prototype, "castsShadows", { + get: function () { + return false; + }, + enumerable: true, + configurable: true + }); + + Skybox.prototype._iCollectRenderables = function (renderer) { + //skybox do not get collected in the standard entity list + }; + + Skybox.prototype._iCollectRenderable = function (renderer) { + }; + return Skybox; +})(DisplayObject); + +module.exports = Skybox; + + +},{"awayjs-core/lib/bounds/NullBounds":undefined,"awayjs-core/lib/core/base/DisplayObject":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/partition/SkyboxNode":undefined}],"awayjs-core/lib/entities/TextField":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +/** +* The TextField class is used to create display objects for text display and +* input. You can use the TextField class to +* perform low-level text rendering. However, in Flex, you typically use the +* Label, Text, TextArea, and TextInput controls to process text. You can give a text field an instance name in the +* Property inspector and use the methods and properties of the TextField +* class to manipulate it with ActionScript. TextField instance names are +* displayed in the Movie Explorer and in the Insert Target Path dialog box in +* the Actions panel. +* +*

To create a text field dynamically, use the TextField() +* constructor.

+* +*

The methods of the TextField class let you set, select, and manipulate +* text in a dynamic or input text field that you create during authoring or +* at runtime.

+* +*

ActionScript provides several ways to format your text at runtime. The +* TextFormat class lets you set character and paragraph formatting for +* TextField objects. You can apply Cascading Style Sheets(CSS) styles to +* text fields by using the TextField.styleSheet property and the +* StyleSheet class. You can use CSS to style built-in HTML tags, define new +* formatting tags, or apply styles. You can assign HTML formatted text, which +* optionally uses CSS styles, directly to a text field. HTML text that you +* assign to a text field can contain embedded media(movie clips, SWF files, +* GIF files, PNG files, and JPEG files). The text wraps around the embedded +* media in the same way that a web browser wraps text around media embedded +* in an HTML document.

+* +*

Flash Player supports a subset of HTML tags that you can use to format +* text. See the list of supported HTML tags in the description of the +* htmlText property.

+* +* @event change Dispatched after a control value is +* modified, unlike the +* textInput event, which is +* dispatched before the value is modified. +* Unlike the W3C DOM Event Model version of +* the change event, which +* dispatches the event only after the +* control loses focus, the ActionScript 3.0 +* version of the change event +* is dispatched any time the control +* changes. For example, if a user types text +* into a text field, a change +* event is dispatched after every keystroke. +* @event link Dispatched when a user clicks a hyperlink +* in an HTML-enabled text field, where the +* URL begins with "event:". The remainder of +* the URL after "event:" is placed in the +* text property of the LINK event. +* +*

Note: The default behavior, +* adding the text to the text field, occurs +* only when Flash Player generates the +* event, which in this case happens when a +* user attempts to input text. You cannot +* put text into a text field by sending it +* textInput events.

+* @event scroll Dispatched by a TextField object +* after the user scrolls. +* @event textInput Flash Player dispatches the +* textInput event when a user +* enters one or more characters of text. +* Various text input methods can generate +* this event, including standard keyboards, +* input method editors(IMEs), voice or +* speech recognition systems, and even the +* act of pasting plain text with no +* formatting or style information. +* @event textInteractionModeChange Flash Player dispatches the +* textInteractionModeChange +* event when a user changes the interaction +* mode of a text field. for example on +* Android, one can toggle from NORMAL mode +* to SELECTION mode using context menu +* options +*/ +var TextField = (function (_super) { + __extends(TextField, _super); + /** + * Creates a new TextField instance. After you create the TextField instance, + * call the addChild() or addChildAt() method of + * the parent DisplayObjectContainer object to add the TextField instance to + * the display list. + * + *

The default size for a text field is 100 x 100 pixels.

+ */ + function TextField() { + _super.call(this); + this._text = ""; + } + Object.defineProperty(TextField.prototype, "bottomScrollV", { + /** + * An integer(1-based index) that indicates the bottommost line that is + * currently visible in the specified text field. Think of the text field as + * a window onto a block of text. The scrollV property is the + * 1-based index of the topmost visible line in the window. + * + *

All the text between the lines indicated by scrollV and + * bottomScrollV is currently visible in the text field.

+ */ + get: function () { + return this._bottomScrollV; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "caretIndex", { + /** + * The index of the insertion point(caret) position. If no insertion point + * is displayed, the value is the position the insertion point would be if + * you restored focus to the field(typically where the insertion point last + * was, or 0 if the field has not had focus). + * + *

Selection span indexes are zero-based(for example, the first position + * is 0, the second position is 1, and so on).

+ */ + get: function () { + return this._caretIndex; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "length", { + /** + * The number of characters in a text field. A character such as tab + * (\t) counts as one character. + */ + get: function () { + return this._length; + }, + enumerable: true, + configurable: true + }); + + /** + * The maximum value of scrollH. + */ + TextField.prototype.maxScrollH = function () { + return this._maxScrollH; + }; + + /** + * The maximum value of scrollV. + */ + TextField.prototype.maxScrollV = function () { + return this._maxScrollV; + }; + + Object.defineProperty(TextField.prototype, "numLines", { + /** + * Defines the number of text lines in a multiline text field. If + * wordWrap property is set to true, the number of + * lines increases when text wraps. + */ + get: function () { + return this._numLines; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "selectionBeginIndex", { + /** + * The zero-based character index value of the first character in the current + * selection. For example, the first character is 0, the second character is + * 1, and so on. If no text is selected, this property is the value of + * caretIndex. + */ + get: function () { + return this._selectionBeginIndex; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "selectionEndIndex", { + /** + * The zero-based character index value of the last character in the current + * selection. For example, the first character is 0, the second character is + * 1, and so on. If no text is selected, this property is the value of + * caretIndex. + */ + get: function () { + return this._selectionEndIndex; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "text", { + /** + * A string that is the current text in the text field. Lines are separated + * by the carriage return character('\r', ASCII 13). This + * property contains unformatted text in the text field, without HTML tags. + * + *

To get the text in HTML form, use the htmlText + * property.

+ */ + get: function () { + return this._text; + }, + set: function (value) { + if (this._text == value) + return; + + this._text = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TextField.prototype, "textHeight", { + /** + * The height of the text in pixels. + */ + get: function () { + return this._textHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "textInteractionMode", { + /** + * The interaction mode property, Default value is + * TextInteractionMode.NORMAL. On mobile platforms, the normal mode implies + * that the text can be scrolled but not selected. One can switch to the + * selectable mode through the in-built context menu on the text field. On + * Desktop, the normal mode implies that the text is in scrollable as well as + * selection mode. + */ + get: function () { + return this._textInteractionMode; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "textWidth", { + /** + * The width of the text in pixels. + */ + get: function () { + return this._textWidth; + }, + enumerable: true, + configurable: true + }); + + /** + * Appends the string specified by the newText parameter to the + * end of the text of the text field. This method is more efficient than an + * addition assignment(+=) on a text property + * (such as someTextField.text += moreText), particularly for a + * text field that contains a significant amount of content. + * + * @param newText The string to append to the existing text. + */ + TextField.prototype.appendText = function (newText) { + //TODO + }; + + /** + * Returns a rectangle that is the bounding box of the character. + * + * @param charIndex The zero-based index value for the character(for + * example, the first position is 0, the second position is + * 1, and so on). + * @return A rectangle with x and y minimum and + * maximum values defining the bounding box of the character. + */ + TextField.prototype.getCharBoundaries = function (charIndex) { + return this._charBoundaries; + }; + + /** + * Returns the zero-based index value of the character at the point specified + * by the x and y parameters. + * + * @param x The x coordinate of the character. + * @param y The y coordinate of the character. + * @return The zero-based index value of the character(for example, the + * first position is 0, the second position is 1, and so on). Returns + * -1 if the point is not over any character. + */ + TextField.prototype.getCharIndexAtPoint = function (x, y) { + return this._charIndexAtPoint; + }; + + /** + * Given a character index, returns the index of the first character in the + * same paragraph. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return The zero-based index value of the first character in the same + * paragraph. + * @throws RangeError The character index specified is out of range. + */ + TextField.prototype.getFirstCharInParagraph = function (charIndex /*int*/ ) { + return this._firstCharInParagraph; + }; + + /** + * Returns a DisplayObject reference for the given id, for an + * image or SWF file that has been added to an HTML-formatted text field by + * using an tag. The tag is in the + * following format: + * + *

 

+ * + * @param id The id to match(in the id attribute + * of the tag). + * @return The display object corresponding to the image or SWF file with the + * matching id attribute in the tag + * of the text field. For media loaded from an external source, this + * object is a Loader object, and, once loaded, the media object is a + * child of that Loader object. For media embedded in the SWF file, + * it is the loaded object. If no tag with the + * matching id exists, the method returns + * null. + */ + TextField.prototype.getImageReference = function (id) { + return this._imageReference; + }; + + /** + * Returns the zero-based index value of the line at the point specified by + * the x and y parameters. + * + * @param x The x coordinate of the line. + * @param y The y coordinate of the line. + * @return The zero-based index value of the line(for example, the first + * line is 0, the second line is 1, and so on). Returns -1 if the + * point is not over any line. + */ + TextField.prototype.getLineIndexAtPoint = function (x, y) { + return this._lineIndexAtPoint; + }; + + /** + * Returns the zero-based index value of the line containing the character + * specified by the charIndex parameter. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return The zero-based index value of the line. + * @throws RangeError The character index specified is out of range. + */ + TextField.prototype.getLineIndexOfChar = function (charIndex /*int*/ ) { + return this._lineIndexOfChar; + }; + + /** + * Returns the number of characters in a specific text line. + * + * @param lineIndex The line number for which you want the length. + * @return The number of characters in the line. + * @throws RangeError The line number specified is out of range. + */ + TextField.prototype.getLineLength = function (lineIndex /*int*/ ) { + return this._lineLength; + }; + + /** + * Returns metrics information about a given text line. + * + * @param lineIndex The line number for which you want metrics information. + * @return A TextLineMetrics object. + * @throws RangeError The line number specified is out of range. + */ + TextField.prototype.getLineMetrics = function (lineIndex /*int*/ ) { + return this._lineMetrics; + }; + + /** + * Returns the character index of the first character in the line that the + * lineIndex parameter specifies. + * + * @param lineIndex The zero-based index value of the line(for example, the + * first line is 0, the second line is 1, and so on). + * @return The zero-based index value of the first character in the line. + * @throws RangeError The line number specified is out of range. + */ + TextField.prototype.getLineOffset = function (lineIndex /*int*/ ) { + return this._lineOffset; + }; + + /** + * Returns the text of the line specified by the lineIndex + * parameter. + * + * @param lineIndex The zero-based index value of the line(for example, the + * first line is 0, the second line is 1, and so on). + * @return The text string contained in the specified line. + * @throws RangeError The line number specified is out of range. + */ + TextField.prototype.getLineText = function (lineIndex /*int*/ ) { + return this._lineText; + }; + + /** + * Given a character index, returns the length of the paragraph containing + * the given character. The length is relative to the first character in the + * paragraph(as returned by getFirstCharInParagraph()), not to + * the character index passed in. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return Returns the number of characters in the paragraph. + * @throws RangeError The character index specified is out of range. + */ + TextField.prototype.getParagraphLength = function (charIndex /*int*/ ) { + return this._paragraphLength; + }; + + /** + * Returns a TextFormat object that contains formatting information for the + * range of text that the beginIndex and endIndex + * parameters specify. Only properties that are common to the entire text + * specified are set in the resulting TextFormat object. Any property that is + * mixed, meaning that it has different values at different points in + * the text, has a value of null. + * + *

If you do not specify values for these parameters, this method is + * applied to all the text in the text field.

+ * + *

The following table describes three possible usages:

+ * + * @return The TextFormat object that represents the formatting properties + * for the specified text. + * @throws RangeError The beginIndex or endIndex + * specified is out of range. + */ + TextField.prototype.getTextFormat = function (beginIndex, endIndex) { + if (typeof beginIndex === "undefined") { beginIndex = -1; } + if (typeof endIndex === "undefined") { endIndex = -1; } + return this._textFormat; + }; + + /** + * Replaces the current selection with the contents of the value + * parameter. The text is inserted at the position of the current selection, + * using the current default character format and default paragraph format. + * The text is not treated as HTML. + * + *

You can use the replaceSelectedText() method to insert and + * delete text without disrupting the character and paragraph formatting of + * the rest of the text.

+ * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + * @param value The string to replace the currently selected text. + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + TextField.prototype.replaceSelectedText = function (value) { + }; + + /** + * Replaces the range of characters that the beginIndex and + * endIndex parameters specify with the contents of the + * newText parameter. As designed, the text from + * beginIndex to endIndex-1 is replaced. + * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + * @param beginIndex The zero-based index value for the start position of the + * replacement range. + * @param endIndex The zero-based index position of the first character + * after the desired text span. + * @param newText The text to use to replace the specified range of + * characters. + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + TextField.prototype.replaceText = function (beginIndex /*int*/ , endIndex /*int*/ , newText) { + }; + + /** + * Sets as selected the text designated by the index values of the first and + * last characters, which are specified with the beginIndex and + * endIndex parameters. If the two parameter values are the + * same, this method sets the insertion point, as if you set the + * caretIndex property. + * + * @param beginIndex The zero-based index value of the first character in the + * selection(for example, the first character is 0, the + * second character is 1, and so on). + * @param endIndex The zero-based index value of the last character in the + * selection. + */ + TextField.prototype.setSelection = function (beginIndex /*int*/ , endIndex /*int*/ ) { + }; + + /** + * Applies the text formatting that the format parameter + * specifies to the specified text in a text field. The value of + * format must be a TextFormat object that specifies the desired + * text formatting changes. Only the non-null properties of + * format are applied to the text field. Any property of + * format that is set to null is not applied. By + * default, all of the properties of a newly created TextFormat object are + * set to null. + * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + *

The setTextFormat() method changes the text formatting + * applied to a range of characters or to the entire body of text in a text + * field. To apply the properties of format to all text in the text field, do + * not specify values for beginIndex and endIndex. + * To apply the properties of the format to a range of text, specify values + * for the beginIndex and the endIndex parameters. + * You can use the length property to determine the index + * values.

+ * + *

The two types of formatting information in a TextFormat object are + * character level formatting and paragraph level formatting. Each character + * in a text field can have its own character formatting settings, such as + * font name, font size, bold, and italic.

+ * + *

For paragraphs, the first character of the paragraph is examined for + * the paragraph formatting settings for the entire paragraph. Examples of + * paragraph formatting settings are left margin, right margin, and + * indentation.

+ * + *

Any text inserted manually by the user, or replaced by the + * replaceSelectedText() method, receives the default text field + * formatting for new text, and not the formatting specified for the text + * insertion point. To set the default formatting for new text, use + * defaultTextFormat.

+ * + * @param format A TextFormat object that contains character and paragraph + * formatting information. + * @throws Error This method cannot be used on a text field with a style + * sheet. + * @throws RangeError The beginIndex or endIndex + * specified is out of range. + */ + TextField.prototype.setTextFormat = function (format, beginIndex, endIndex) { + if (typeof beginIndex === "undefined") { beginIndex = -1; } + if (typeof endIndex === "undefined") { endIndex = -1; } + }; + + /** + * Returns true if an embedded font is available with the specified + * fontName and fontStyle where + * Font.fontType is flash.text.FontType.EMBEDDED. + * Starting with Flash Player 10, two kinds of embedded fonts can appear in a + * SWF file. Normal embedded fonts are only used with TextField objects. CFF + * embedded fonts are only used with the flash.text.engine classes. The two + * types are distinguished by the fontType property of the + * Font class, as returned by the enumerateFonts() + * function. + * + *

TextField cannot use a font of type EMBEDDED_CFF. If + * embedFonts is set to true and the only font + * available at run time with the specified name and style is of type + * EMBEDDED_CFF, Flash Player fails to render the text, as if no + * embedded font were available with the specified name and style.

+ * + *

If both EMBEDDED and EMBEDDED_CFF fonts are + * available with the same name and style, the EMBEDDED font is + * selected and text renders with the EMBEDDED font.

+ * + * @param fontName The name of the embedded font to check. + * @param fontStyle Specifies the font style to check. Use + * flash.text.FontStyle + * @return true if a compatible embedded font is available, + * otherwise false. + * @throws ArgumentError The fontStyle specified is not a member + * of flash.text.FontStyle. + */ + TextField.isFontCompatible = function (fontName, fontStyle) { + return false; + }; + return TextField; +})(DisplayObject); + +module.exports = TextField; + + +},{"awayjs-core/lib/core/base/DisplayObject":undefined}],"awayjs-core/lib/errors/AbstractMethodError":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +/** +* AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden +* by a concrete subclass. +*/ +var AbstractMethodError = (function (_super) { + __extends(AbstractMethodError, _super); + /** + * Create a new AbstractMethodError. + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + function AbstractMethodError(message, id) { + if (typeof message === "undefined") { message = null; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, message || "An abstract method was called! Either an instance of an abstract class was created, or an abstract method was not overridden by the subclass.", id); + } + return AbstractMethodError; +})(Error); + +module.exports = AbstractMethodError; + + +},{"awayjs-core/lib/errors/Error":undefined}],"awayjs-core/lib/errors/ArgumentError":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +/** +* AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden +* by a concrete subclass. +*/ +var ArgumentError = (function (_super) { + __extends(ArgumentError, _super); + /** + * Create a new ArgumentError. + * + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + function ArgumentError(message, id) { + if (typeof message === "undefined") { message = null; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, message || "ArgumentError", id); + } + return ArgumentError; +})(Error); + +module.exports = ArgumentError; + + +},{"awayjs-core/lib/errors/Error":undefined}],"awayjs-core/lib/errors/CastError":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +var CastError = (function (_super) { + __extends(CastError, _super); + function CastError(message) { + _super.call(this, message); + } + return CastError; +})(Error); + +module.exports = CastError; + + +},{"awayjs-core/lib/errors/Error":undefined}],"awayjs-core/lib/errors/DocumentError":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +var DocumentError = (function (_super) { + __extends(DocumentError, _super); + function DocumentError(message, id) { + if (typeof message === "undefined") { message = "DocumentError"; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, message, id); + } + DocumentError.DOCUMENT_DOES_NOT_EXIST = "documentDoesNotExist"; + return DocumentError; +})(Error); + +module.exports = DocumentError; + + +},{"awayjs-core/lib/errors/Error":undefined}],"awayjs-core/lib/errors/Error":[function(require,module,exports){ +var Error = (function () { + function Error(message, id, _name) { + if (typeof message === "undefined") { message = ''; } + if (typeof id === "undefined") { id = 0; } + if (typeof _name === "undefined") { _name = ''; } + this._errorID = 0; + this._messsage = ''; + this._name = ''; + this._messsage = message; + this._name = name; + this._errorID = id; + } + Object.defineProperty(Error.prototype, "message", { + /** + * + * @returns {string} + */ + get: function () { + return this._messsage; + }, + /** + * + * @param value + */ + set: function (value) { + this._messsage = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Error.prototype, "name", { + /** + * + * @returns {string} + */ + get: function () { + return this._name; + }, + /** + * + * @param value + */ + set: function (value) { + this._name = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Error.prototype, "errorID", { + /** + * + * @returns {number} + */ + get: function () { + return this._errorID; + }, + enumerable: true, + configurable: true + }); + return Error; +})(); + +module.exports = Error; + + +},{}],"awayjs-core/lib/errors/PartialImplementationError":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +/** +* AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden +* by a concrete subclass. +*/ +var PartialImplementationError = (function (_super) { + __extends(PartialImplementationError, _super); + /** + * Create a new AbstractMethodError. + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + function PartialImplementationError(dependency, id) { + if (typeof dependency === "undefined") { dependency = ''; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, "PartialImplementationError - this function is in development. Required Dependency: " + dependency, id); + } + return PartialImplementationError; +})(Error); + +module.exports = PartialImplementationError; + + +},{"awayjs-core/lib/errors/Error":undefined}],"awayjs-core/lib/errors/RangeError":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +/** +* RangeError is thrown when an index is accessed out of range of the number of +* available indices on an Array. +*/ +var RangeError = (function (_super) { + __extends(RangeError, _super); + /** + * Create a new RangeError. + * + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + function RangeError(message, id) { + if (typeof message === "undefined") { message = null; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, message || "RangeError", id); + } + return RangeError; +})(Error); + +module.exports = RangeError; + + +},{"awayjs-core/lib/errors/Error":undefined}],"awayjs-core/lib/events/AssetEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* @class away.events.AssetEvent +*/ +var AssetEvent = (function (_super) { + __extends(AssetEvent, _super); + /** + * + */ + function AssetEvent(type, asset, prevName) { + if (typeof asset === "undefined") { asset = null; } + if (typeof prevName === "undefined") { prevName = null; } + _super.call(this, type); + + this._asset = asset; + this._prevName = prevName || (this._asset ? this._asset.name : null); + } + Object.defineProperty(AssetEvent.prototype, "asset", { + /** + * + */ + get: function () { + return this._asset; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(AssetEvent.prototype, "assetPrevName", { + /** + * + */ + get: function () { + return this._prevName; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + AssetEvent.prototype.clone = function () { + return new AssetEvent(this.type, this.asset, this.assetPrevName); + }; + AssetEvent.ASSET_COMPLETE = "assetComplete"; + + AssetEvent.ASSET_RENAME = 'assetRename'; + + AssetEvent.ASSET_CONFLICT_RESOLVED = 'assetConflictResolved'; + + AssetEvent.TEXTURE_SIZE_ERROR = 'textureSizeError'; + return AssetEvent; +})(Event); + +module.exports = AssetEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/CameraEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* @class away.events.CameraEvent +*/ +var CameraEvent = (function (_super) { + __extends(CameraEvent, _super); + function CameraEvent(type, camera) { + _super.call(this, type); + + this._camera = camera; + } + Object.defineProperty(CameraEvent.prototype, "camera", { + get: function () { + return this._camera; + }, + enumerable: true, + configurable: true + }); + CameraEvent.PROJECTION_CHANGED = "projectionChanged"; + return CameraEvent; +})(Event); + +module.exports = CameraEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/DisplayObjectEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var DisplayObjectEvent = (function (_super) { + __extends(DisplayObjectEvent, _super); + function DisplayObjectEvent(type, object) { + _super.call(this, type); + this.object = object; + } + DisplayObjectEvent.VISIBLITY_UPDATED = "visiblityUpdated"; + DisplayObjectEvent.SCENETRANSFORM_CHANGED = "scenetransformChanged"; + DisplayObjectEvent.SCENE_CHANGED = "sceneChanged"; + DisplayObjectEvent.POSITION_CHANGED = "positionChanged"; + DisplayObjectEvent.ROTATION_CHANGED = "rotationChanged"; + DisplayObjectEvent.SCALE_CHANGED = "scaleChanged"; + return DisplayObjectEvent; +})(Event); + +module.exports = DisplayObjectEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/EventDispatcher":[function(require,module,exports){ +/** +* Base class for dispatching events +* +* @class away.events.EventDispatcher +* +*/ +var EventDispatcher = (function () { + function EventDispatcher(target) { + if (typeof target === "undefined") { target = null; } + this.listeners = new Array(); + this.target = target || this; + } + /** + * Add an event listener + * @method addEventListener + * @param {String} Name of event to add a listener for + * @param {Function} Callback function + */ + EventDispatcher.prototype.addEventListener = function (type, listener) { + if (this.listeners[type] === undefined) + this.listeners[type] = new Array(); + + if (this.getEventListenerIndex(type, listener) === -1) + this.listeners[type].push(listener); + }; + + /** + * Remove an event listener + * @method removeEventListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + EventDispatcher.prototype.removeEventListener = function (type, listener) { + var index = this.getEventListenerIndex(type, listener); + + if (index !== -1) + this.listeners[type].splice(index, 1); + }; + + /** + * Dispatch an event + * @method dispatchEvent + * @param {Event} Event to dispatch + */ + EventDispatcher.prototype.dispatchEvent = function (event) { + var listenerArray = this.listeners[event.type]; + + if (listenerArray !== undefined) { + var l = listenerArray.length; + + event.target = this.target; + + for (var i = 0; i < l; i++) + listenerArray[i](event); + } + }; + + /** + * get Event Listener Index in array. Returns -1 if no listener is added + * @method getEventListenerIndex + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + EventDispatcher.prototype.getEventListenerIndex = function (type, listener) { + if (this.listeners[type] !== undefined) { + var a = this.listeners[type]; + var l = a.length; + + for (var i = 0; i < l; i++) + if (listener == a[i]) + return i; + } + + return -1; + }; + + /** + * check if an object has an event listener assigned to it + * @method hasListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + EventDispatcher.prototype.hasEventListener = function (type, listener) { + if (listener != null) { + return (this.getEventListenerIndex(type, listener) !== -1); + } else { + if (this.listeners[type] !== undefined) + return (this.listeners[type].length > 0); + + return false; + } + + return false; + }; + return EventDispatcher; +})(); + +module.exports = EventDispatcher; + + +},{}],"awayjs-core/lib/events/Event":[function(require,module,exports){ +var Event = (function () { + function Event(type) { + /** + * Type of event + * @property type + * @type String + */ + this.type = undefined; + /** + * Reference to target object + * @property target + * @type Object + */ + this.target = undefined; + this.type = type; + } + /** + * Clones the current event. + * @return An exact duplicate of the current event. + */ + Event.prototype.clone = function () { + return new Event(this.type); + }; + Event.COMPLETE = 'complete'; + Event.OPEN = 'open'; + + Event.ENTER_FRAME = 'enterFrame'; + Event.EXIT_FRAME = 'exitFrame'; + + Event.RESIZE = "resize"; + Event.ERROR = "error"; + Event.CHANGE = "change"; + return Event; +})(); + +module.exports = Event; + + +},{}],"awayjs-core/lib/events/GeometryEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* Dispatched to notify changes in a geometry object's state. +* +* @class away.events.GeometryEvent +* @see away3d.core.base.Geometry +*/ +var GeometryEvent = (function (_super) { + __extends(GeometryEvent, _super); + /** + * Create a new GeometryEvent + * @param type The event type. + * @param subGeometry An optional TriangleSubGeometry object that is the subject of this event. + */ + function GeometryEvent(type, subGeometry) { + if (typeof subGeometry === "undefined") { subGeometry = null; } + _super.call(this, type); + + this._subGeometry = subGeometry; + } + Object.defineProperty(GeometryEvent.prototype, "subGeometry", { + /** + * The TriangleSubGeometry object that is the subject of this event, if appropriate. + */ + get: function () { + return this._subGeometry; + }, + enumerable: true, + configurable: true + }); + + /** + * Clones the event. + * @return An exact duplicate of the current object. + */ + GeometryEvent.prototype.clone = function () { + return new GeometryEvent(this.type, this._subGeometry); + }; + GeometryEvent.SUB_GEOMETRY_ADDED = "SubGeometryAdded"; + + GeometryEvent.SUB_GEOMETRY_REMOVED = "SubGeometryRemoved"; + + GeometryEvent.BOUNDS_INVALID = "BoundsInvalid"; + return GeometryEvent; +})(Event); + +module.exports = GeometryEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/HTTPStatusEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* @class away.events.HTTPStatusEvent +*/ +var HTTPStatusEvent = (function (_super) { + __extends(HTTPStatusEvent, _super); + function HTTPStatusEvent(type, status) { + if (typeof status === "undefined") { status = null; } + _super.call(this, type); + + this.status = status; + } + HTTPStatusEvent.HTTP_STATUS = "httpStatus"; + return HTTPStatusEvent; +})(Event); + +module.exports = HTTPStatusEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/IEventDispatcher":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/events/IOErrorEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var IOErrorEvent = (function (_super) { + __extends(IOErrorEvent, _super); + function IOErrorEvent(type) { + _super.call(this, type); + } + IOErrorEvent.IO_ERROR = "ioError"; + return IOErrorEvent; +})(Event); + +module.exports = IOErrorEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/LightEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var LightEvent = (function (_super) { + __extends(LightEvent, _super); + function LightEvent(type) { + _super.call(this, type); + } + //@override + LightEvent.prototype.clone = function () { + return new LightEvent(this.type); + }; + LightEvent.CASTS_SHADOW_CHANGE = "castsShadowChange"; + return LightEvent; +})(Event); + +module.exports = LightEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/LoaderEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var LoaderEvent = (function (_super) { + __extends(LoaderEvent, _super); + /** + * Create a new LoaderEvent object. + * + * @param type The event type. + * @param url The url of the loaded resource. + * @param assets The assets of the loaded resource. + */ + function LoaderEvent(type, url, content, assets) { + if (typeof url === "undefined") { url = null; } + if (typeof content === "undefined") { content = null; } + if (typeof assets === "undefined") { assets = null; } + _super.call(this, type); + + this._url = url; + this._content = content; + this._assets = assets; + } + Object.defineProperty(LoaderEvent.prototype, "content", { + /** + * The content returned if the resource has been loaded inside a Loader object. + */ + get: function () { + return this._content; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderEvent.prototype, "url", { + /** + * The url of the loaded resource. + */ + get: function () { + return this._url; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderEvent.prototype, "assets", { + /** + * The error string on loadError. + */ + get: function () { + return this._assets; + }, + enumerable: true, + configurable: true + }); + + /** + * Clones the current event. + * @return An exact duplicate of the current event. + */ + LoaderEvent.prototype.clone = function () { + return new LoaderEvent(this.type, this._url, this._content, this._assets); + }; + LoaderEvent.RESOURCE_COMPLETE = "resourceComplete"; + return LoaderEvent; +})(Event); + +module.exports = LoaderEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/MaterialEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var MaterialEvent = (function (_super) { + __extends(MaterialEvent, _super); + function MaterialEvent(type) { + _super.call(this, type); + } + MaterialEvent.SIZE_CHANGED = "sizeChanged"; + return MaterialEvent; +})(Event); + +module.exports = MaterialEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/MouseEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* A MouseEvent is dispatched when a mouse event occurs over a mouseEnabled object in View. +* TODO: we don't have screenZ data, tho this should be easy to implement +*/ +var MouseEvent = (function (_super) { + __extends(MouseEvent, _super); + /** + * Create a new MouseEvent object. + * @param type The type of the MouseEvent. + */ + function MouseEvent(type) { + _super.call(this, type); + // Private. + this._iAllowedToPropagate = true; + } + Object.defineProperty(MouseEvent.prototype, "bubbles", { + /** + * @inheritDoc + */ + get: function () { + var doesBubble = this._iAllowedToPropagate; + this._iAllowedToPropagate = true; + + // Don't bubble if propagation has been stopped. + return doesBubble; + }, + enumerable: true, + configurable: true + }); + + /** + * @inheritDoc + */ + MouseEvent.prototype.stopPropagation = function () { + this._iAllowedToPropagate = false; + + if (this._iParentEvent) + this._iParentEvent.stopPropagation(); + }; + + /** + * @inheritDoc + */ + MouseEvent.prototype.stopImmediatePropagation = function () { + this._iAllowedToPropagate = false; + + if (this._iParentEvent) + this._iParentEvent.stopImmediatePropagation(); + }; + + /** + * Creates a copy of the MouseEvent object and sets the value of each property to match that of the original. + */ + MouseEvent.prototype.clone = function () { + var result = new MouseEvent(this.type); + + /* TODO: Debug / test - look into isDefaultPrevented + if (isDefaultPrevented()) + result.preventDefault(); + */ + result.screenX = this.screenX; + result.screenY = this.screenY; + + result.view = this.view; + result.object = this.object; + result.materialOwner = this.materialOwner; + result.material = this.material; + result.uv = this.uv; + result.localPosition = this.localPosition; + result.localNormal = this.localNormal; + result.index = this.index; + result.subGeometryIndex = this.subGeometryIndex; + result.delta = this.delta; + + result.ctrlKey = this.ctrlKey; + result.shiftKey = this.shiftKey; + + result._iParentEvent = this; + result._iAllowedToPropagate = this._iAllowedToPropagate; + + return result; + }; + + Object.defineProperty(MouseEvent.prototype, "scenePosition", { + /** + * The position in scene space where the event took place + */ + get: function () { + return this.object.sceneTransform.transformVector(this.localPosition); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MouseEvent.prototype, "sceneNormal", { + /** + * The normal in scene space where the event took place + */ + get: function () { + var sceneNormal = this.object.sceneTransform.deltaTransformVector(this.localNormal); + sceneNormal.normalize(); + + return sceneNormal; + }, + enumerable: true, + configurable: true + }); + MouseEvent.MOUSE_OVER = "mouseOver3d"; + + MouseEvent.MOUSE_OUT = "mouseOut3d"; + + MouseEvent.MOUSE_UP = "mouseUp3d"; + + MouseEvent.MOUSE_DOWN = "mouseDown3d"; + + MouseEvent.MOUSE_MOVE = "mouseMove3d"; + + MouseEvent.CLICK = "click3d"; + + MouseEvent.DOUBLE_CLICK = "doubleClick3d"; + + MouseEvent.MOUSE_WHEEL = "mouseWheel3d"; + return MouseEvent; +})(Event); + +module.exports = MouseEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/ParserEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var ParserEvent = (function (_super) { + __extends(ParserEvent, _super); + function ParserEvent(type, message) { + if (typeof message === "undefined") { message = ''; } + _super.call(this, type); + + this._message = message; + } + Object.defineProperty(ParserEvent.prototype, "message", { + /** + * Additional human-readable message. Usually supplied for ParserEvent.PARSE_ERROR events. + */ + get: function () { + return this._message; + }, + enumerable: true, + configurable: true + }); + + ParserEvent.prototype.clone = function () { + return new ParserEvent(this.type, this.message); + }; + ParserEvent.PARSE_COMPLETE = 'parseComplete'; + + ParserEvent.PARSE_ERROR = 'parseError'; + + ParserEvent.READY_FOR_DEPENDENCIES = 'readyForDependencies'; + return ParserEvent; +})(Event); + +module.exports = ParserEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/ProgressEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var ProgressEvent = (function (_super) { + __extends(ProgressEvent, _super); + function ProgressEvent(type) { + _super.call(this, type); + } + ProgressEvent.PROGRESS = "progress"; + return ProgressEvent; +})(Event); + +module.exports = ProgressEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/ProjectionEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var ProjectionEvent = (function (_super) { + __extends(ProjectionEvent, _super); + function ProjectionEvent(type, projection) { + _super.call(this, type); + this._projection = projection; + } + Object.defineProperty(ProjectionEvent.prototype, "projection", { + get: function () { + return this._projection; + }, + enumerable: true, + configurable: true + }); + ProjectionEvent.MATRIX_CHANGED = "matrixChanged"; + return ProjectionEvent; +})(Event); + +module.exports = ProjectionEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/RendererEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var RendererEvent = (function (_super) { + __extends(RendererEvent, _super); + function RendererEvent(type) { + _super.call(this, type); + } + RendererEvent.VIEWPORT_UPDATED = "viewportUpdated"; + RendererEvent.SCISSOR_UPDATED = "scissorUpdated"; + return RendererEvent; +})(Event); + +module.exports = RendererEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/ResizeEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var ResizeEvent = (function (_super) { + __extends(ResizeEvent, _super); + function ResizeEvent(type, oldHeight, oldWidth) { + if (typeof oldHeight === "undefined") { oldHeight = NaN; } + if (typeof oldWidth === "undefined") { oldWidth = NaN; } + _super.call(this, type); + + this._oldHeight = oldHeight; + this._oldWidth = oldWidth; + } + Object.defineProperty(ResizeEvent.prototype, "oldHeight", { + get: function () { + return this._oldHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResizeEvent.prototype, "oldWidth", { + get: function () { + return this._oldWidth; + }, + enumerable: true, + configurable: true + }); + ResizeEvent.RESIZE = "resize"; + return ResizeEvent; +})(Event); + +module.exports = ResizeEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/SceneEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var SceneEvent = (function (_super) { + __extends(SceneEvent, _super); + function SceneEvent(type, displayObject) { + _super.call(this, type); + + this.displayObject = displayObject; + } + SceneEvent.ADDED_TO_SCENE = "addedToScene"; + + SceneEvent.REMOVED_FROM_SCENE = "removedFromScene"; + + SceneEvent.PARTITION_CHANGED = "partitionChanged"; + return SceneEvent; +})(Event); + +module.exports = SceneEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/StageEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var StageEvent = (function (_super) { + __extends(StageEvent, _super); + function StageEvent(type) { + _super.call(this, type); + } + StageEvent.CONTEXT_CREATED = "contextCreated"; + StageEvent.CONTEXT_DISPOSED = "contextDisposed"; + StageEvent.CONTEXT_RECREATED = "contextRecreated"; + StageEvent.VIEWPORT_UPDATED = "viewportUpdated"; + return StageEvent; +})(Event); + +module.exports = StageEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/SubGeometryEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* Dispatched to notify changes in a sub geometry object's state. +* +* @class away.events.SubGeometryEvent +* @see away.core.base.Geometry +*/ +var SubGeometryEvent = (function (_super) { + __extends(SubGeometryEvent, _super); + /** + * Create a new GeometryEvent + * @param type The event type. + * @param dataType An optional data type of the vertex data being updated. + */ + function SubGeometryEvent(type, dataType) { + if (typeof dataType === "undefined") { dataType = ""; } + _super.call(this, type); + + this._dataType = dataType; + } + Object.defineProperty(SubGeometryEvent.prototype, "dataType", { + /** + * The data type of the vertex data. + */ + get: function () { + return this._dataType; + }, + enumerable: true, + configurable: true + }); + + /** + * Clones the event. + * + * @return An exact duplicate of the current object. + */ + SubGeometryEvent.prototype.clone = function () { + return new SubGeometryEvent(this.type, this._dataType); + }; + SubGeometryEvent.INDICES_UPDATED = "indicesUpdated"; + + SubGeometryEvent.VERTICES_UPDATED = "verticesUpdated"; + return SubGeometryEvent; +})(Event); + +module.exports = SubGeometryEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/events/TimerEvent":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var TimerEvent = (function (_super) { + __extends(TimerEvent, _super); + function TimerEvent(type) { + _super.call(this, type); + } + TimerEvent.TIMER = "timer"; + TimerEvent.TIMER_COMPLETE = "timerComplete"; + return TimerEvent; +})(Event); + +module.exports = TimerEvent; + + +},{"awayjs-core/lib/events/Event":undefined}],"awayjs-core/lib/managers/MouseManager":[function(require,module,exports){ +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var AwayMouseEvent = require("awayjs-core/lib/events/MouseEvent"); + +/** +* MouseManager enforces a singleton pattern and is not intended to be instanced. +* it provides a manager class for detecting mouse hits on scene objects and sending out mouse events. +*/ +var MouseManager = (function () { + /** + * Creates a new MouseManager object. + */ + function MouseManager() { + var _this = this; + this._viewLookup = new Array(); + this._nullVector = new Vector3D(); + this._queuedEvents = new Array(); + this._mouseUp = new AwayMouseEvent(AwayMouseEvent.MOUSE_UP); + this._mouseClick = new AwayMouseEvent(AwayMouseEvent.CLICK); + this._mouseOut = new AwayMouseEvent(AwayMouseEvent.MOUSE_OUT); + this._mouseDown = new AwayMouseEvent(AwayMouseEvent.MOUSE_DOWN); + this._mouseMove = new AwayMouseEvent(AwayMouseEvent.MOUSE_MOVE); + this._mouseOver = new AwayMouseEvent(AwayMouseEvent.MOUSE_OVER); + this._mouseWheel = new AwayMouseEvent(AwayMouseEvent.MOUSE_WHEEL); + this._mouseDoubleClick = new AwayMouseEvent(AwayMouseEvent.DOUBLE_CLICK); + this.onClickDelegate = function (event) { + return _this.onClick(event); + }; + this.onDoubleClickDelegate = function (event) { + return _this.onDoubleClick(event); + }; + this.onMouseDownDelegate = function (event) { + return _this.onMouseDown(event); + }; + this.onMouseMoveDelegate = function (event) { + return _this.onMouseMove(event); + }; + this.onMouseUpDelegate = function (event) { + return _this.onMouseUp(event); + }; + this.onMouseWheelDelegate = function (event) { + return _this.onMouseWheel(event); + }; + this.onMouseOverDelegate = function (event) { + return _this.onMouseOver(event); + }; + this.onMouseOutDelegate = function (event) { + return _this.onMouseOut(event); + }; + } + MouseManager.getInstance = function () { + if (this._instance) + return this._instance; + + return (this._instance = new MouseManager()); + }; + + MouseManager.prototype.fireMouseEvents = function (forceMouseMove) { + // If colliding object has changed, queue over/out events. + if (this._iCollidingObject != this._previousCollidingObject) { + if (this._previousCollidingObject) + this.queueDispatch(this._mouseOut, this._mouseMoveEvent, this._previousCollidingObject); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseOver, this._mouseMoveEvent); + } + + // Fire mouse move events here if forceMouseMove is on. + if (forceMouseMove && this._iCollidingObject) + this.queueDispatch(this._mouseMove, this._mouseMoveEvent); + + var event; + var dispatcher; + + // Dispatch all queued events. + var len = this._queuedEvents.length; + for (var i = 0; i < len; ++i) { + // Only dispatch from first implicitly enabled object ( one that is not a child of a mouseChildren = false hierarchy ). + event = this._queuedEvents[i]; + dispatcher = event.object; + + while (dispatcher && !dispatcher._iIsMouseEnabled()) + dispatcher = dispatcher.parent; + + if (dispatcher) + dispatcher.dispatchEvent(event); + } + + this._queuedEvents.length = 0; + + this._previousCollidingObject = this._iCollidingObject; + + this._iUpdateDirty = false; + }; + + // public addViewLayer(view:View) + // { + // var stg:Stage = view.stage; + // + // // Add instance to mouse3dmanager to fire mouse events for multiple views + // if (!view.stageGL.mouse3DManager) + // view.stageGL.mouse3DManager = this; + // + // if (!hasKey(view)) + // _view3Ds[view] = 0; + // + // _childDepth = 0; + // traverseDisplayObjects(stg); + // _viewCount = _childDepth; + // } + MouseManager.prototype.registerView = function (view) { + view.htmlElement.addEventListener("click", this.onClickDelegate); + view.htmlElement.addEventListener("dblclick", this.onDoubleClickDelegate); + view.htmlElement.addEventListener("mousedown", this.onMouseDownDelegate); + view.htmlElement.addEventListener("mousemove", this.onMouseMoveDelegate); + view.htmlElement.addEventListener("mouseup", this.onMouseUpDelegate); + view.htmlElement.addEventListener("mousewheel", this.onMouseWheelDelegate); + view.htmlElement.addEventListener("mouseover", this.onMouseOverDelegate); + view.htmlElement.addEventListener("mouseout", this.onMouseOutDelegate); + + this._viewLookup.push(view); + }; + + MouseManager.prototype.unregisterView = function (view) { + view.htmlElement.removeEventListener("click", this.onClickDelegate); + view.htmlElement.removeEventListener("dblclick", this.onDoubleClickDelegate); + view.htmlElement.removeEventListener("mousedown", this.onMouseDownDelegate); + view.htmlElement.removeEventListener("mousemove", this.onMouseMoveDelegate); + view.htmlElement.removeEventListener("mouseup", this.onMouseUpDelegate); + view.htmlElement.removeEventListener("mousewheel", this.onMouseWheelDelegate); + view.htmlElement.removeEventListener("mouseover", this.onMouseOverDelegate); + view.htmlElement.removeEventListener("mouseout", this.onMouseOutDelegate); + + this._viewLookup.slice(this._viewLookup.indexOf(view), 1); + }; + + // --------------------------------------------------------------------- + // Private. + // --------------------------------------------------------------------- + MouseManager.prototype.queueDispatch = function (event, sourceEvent, collider) { + if (typeof collider === "undefined") { collider = null; } + // 2D properties. + if (sourceEvent) { + event.ctrlKey = sourceEvent.ctrlKey; + event.altKey = sourceEvent.altKey; + event.shiftKey = sourceEvent.shiftKey; + event.screenX = sourceEvent.clientX; + event.screenY = sourceEvent.clientY; + } + + if (collider == null) + collider = this._iCollidingObject; + + // 3D properties. + if (collider) { + // Object. + event.object = collider.displayObject; + event.materialOwner = collider.materialOwner; + + // UV. + event.uv = collider.uv; + + // Position. + event.localPosition = collider.localPosition ? collider.localPosition.clone() : null; + + // Normal. + event.localNormal = collider.localNormal ? collider.localNormal.clone() : null; + + // Face index. + event.index = collider.index; + } else { + // Set all to null. + event.uv = null; + event.object = null; + event.localPosition = this._nullVector; + event.localNormal = this._nullVector; + event.index = 0; + event.subGeometryIndex = 0; + } + + // Store event to be dispatched later. + this._queuedEvents.push(event); + }; + + // --------------------------------------------------------------------- + // Listeners. + // --------------------------------------------------------------------- + MouseManager.prototype.onMouseMove = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseMove, this._mouseMoveEvent = event); + }; + + MouseManager.prototype.onMouseOut = function (event) { + this._iActiveDiv = null; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseOut, event); + }; + + MouseManager.prototype.onMouseOver = function (event) { + this._iActiveDiv = event.target; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseOver, event); + }; + + MouseManager.prototype.onClick = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseClick, event); + }; + + MouseManager.prototype.onDoubleClick = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseDoubleClick, event); + }; + + MouseManager.prototype.onMouseDown = function (event) { + this._iActiveDiv = event.target; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseDown, event); + }; + + MouseManager.prototype.onMouseUp = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseUp, event); + }; + + MouseManager.prototype.onMouseWheel = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseWheel, event); + }; + + MouseManager.prototype.updateColliders = function (event) { + if (this._iUpdateDirty) + return; + + var view; + var bounds; + var mouseX = event.clientX; + var mouseY = event.clientY; + var len = this._viewLookup.length; + for (var i = 0; i < len; i++) { + view = this._viewLookup[i]; + bounds = view.htmlElement.getBoundingClientRect(); + if (mouseX < bounds.left || mouseX > bounds.right || mouseY < bounds.top || mouseY > bounds.bottom) { + view._pMouseX = null; + view._pMouseY = null; + } else { + view._pMouseX = mouseX + bounds.left; + view._pMouseY = mouseY + bounds.top; + view.updateCollider(); + + if (view.layeredView && this._iCollidingObject) + break; + } + } + + this._iUpdateDirty = true; + }; + return MouseManager; +})(); + +module.exports = MouseManager; + + +},{"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/events/MouseEvent":undefined}],"awayjs-core/lib/materials/CSSMaterialBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); +var ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); + +/** +* MaterialBase forms an abstract base class for any material. +* A material consists of several passes, each of which constitutes at least one render call. Several passes could +* be used for special effects (render lighting for many lights in several passes, render an outline in a separate +* pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space +* subsurface scattering, or rendering a depth map for specialized self-shadowing). +* +* Away3D provides default materials trough SinglePassMaterialBase and MultiPassMaterialBase, which use modular +* methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom +* shaders, or entire new material frameworks. +*/ +var CSSMaterialBase = (function (_super) { + __extends(CSSMaterialBase, _super); + /** + * Creates a new MaterialBase object. + */ + function CSSMaterialBase(texture, smooth, repeat) { + if (typeof texture === "undefined") { texture = null; } + if (typeof smooth === "undefined") { smooth = true; } + if (typeof repeat === "undefined") { repeat = false; } + _super.call(this); + + this._iMaterialId = Number(this.id); + + this.texture = texture; + + this.smooth = smooth; + this.repeat = repeat; + } + Object.defineProperty(CSSMaterialBase.prototype, "imageElement", { + get: function () { + return this._imageElement; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CSSMaterialBase.prototype, "imageStyle", { + get: function () { + return this._imageStyle; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CSSMaterialBase.prototype, "texture", { + /** + * The texture object to use for the albedo colour. + */ + get: function () { + return this._pTexture; + }, + set: function (value) { + if (this._pTexture == value) + return; + + this._pTexture = value; + + if (value instanceof ImageTexture) { + this._imageElement = value.htmlImageElement; + + var node = document.createElement("style"); + node.type = "text/css"; + document.getElementsByTagName("head")[0].appendChild(node); + + var sheet = document.styleSheets[document.styleSheets.length - 1]; + sheet.insertRule(".material" + this.id + "{ }", 0); + var style = sheet.cssRules[0].style; + + style.backgroundImage = "url(" + this._imageElement.src + ")"; + style.backgroundSize = "100% 100%"; + style.position = "absolute"; + style.width = this._imageElement.width + "px"; + style.height = this._imageElement.height + "px"; + style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; + + this._pHeight = this._imageElement.height; + this._pWidth = this._imageElement.width; + + this._pNotifySizeChanged(); + } + }, + enumerable: true, + configurable: true + }); + + return CSSMaterialBase; +})(MaterialBase); + +module.exports = CSSMaterialBase; + + +},{"awayjs-core/lib/materials/MaterialBase":undefined,"awayjs-core/lib/textures/ImageTexture":undefined}],"awayjs-core/lib/materials/LightSources":[function(require,module,exports){ +/** +* Enumeration class for defining which lighting types affect the specific material +* lighting component (diffuse and specular). This can be useful if, for example, you +* want to use light probes for diffuse global lighting, but want specular reflections from +* traditional light sources without those affecting the diffuse light. +* +* @see away.materials.ColorMaterial.diffuseLightSources +* @see away.materials.ColorMaterial.specularLightSources +* @see away.materials.TextureMaterial.diffuseLightSources +* @see away.materials.TextureMaterial.specularLightSources +*/ +var LightSources = (function () { + function LightSources() { + } + LightSources.LIGHTS = 0x01; + + LightSources.PROBES = 0x02; + + LightSources.ALL = 0x03; + return LightSources; +})(); + +module.exports = LightSources; + + +},{}],"awayjs-core/lib/materials/MaterialBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BlendMode = require("awayjs-core/lib/core/base/BlendMode"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var Event = require("awayjs-core/lib/events/Event"); +var MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); + +/** +* MaterialBase forms an abstract base class for any material. +* A material consists of several passes, each of which constitutes at least one render call. Several passes could +* be used for special effects (render lighting for many lights in several passes, render an outline in a separate +* pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space +* subsurface scattering, or rendering a depth map for specialized self-shadowing). +* +* Away3D provides default materials trough SinglePassMaterialBase and TriangleMaterial, which use modular +* methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom +* shaders, or entire new material frameworks. +*/ +var MaterialBase = (function (_super) { + __extends(MaterialBase, _super); + /** + * Creates a new MaterialBase object. + */ + function MaterialBase() { + var _this = this; + _super.call(this); + this._materialPassData = new Array(); + this._materialData = new Array(); + this._pAlphaThreshold = 0; + this._pAnimateUVs = false; + this._enableLightFallOff = true; + this._specularLightSources = 0x01; + this._diffuseLightSources = 0x03; + /** + * An id for this material used to sort the renderables by shader program, which reduces Program state changes. + * + * @private + */ + this._iMaterialId = 0; + this._iBaseScreenPassIndex = 0; + this._bothSides = false; + this._pScreenPassesInvalid = true; + this._pBlendMode = BlendMode.NORMAL; + this._numPasses = 0; + this._mipmap = false; + this._smooth = true; + this._repeat = false; + this._color = 0xFFFFFF; + this._pHeight = 1; + this._pWidth = 1; + this._pRequiresBlending = false; + + this._iMaterialId = Number(this.id); + + this._owners = new Array(); + this._passes = new Array(); + + this._onPassChangeDelegate = function (event) { + return _this.onPassChange(event); + }; + this._onLightChangeDelegate = function (event) { + return _this.onLightsChange(event); + }; + + this.alphaPremultiplied = false; //TODO: work out why this is different for WebGL + } + Object.defineProperty(MaterialBase.prototype, "assetType", { + /** + * @inheritDoc + */ + get: function () { + return AssetType.MATERIAL; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MaterialBase.prototype, "height", { + /** + * + */ + get: function () { + return this._pHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MaterialBase.prototype, "animationSet", { + /** + * + */ + get: function () { + return this._animationSet; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MaterialBase.prototype, "lightPicker", { + /** + * The light picker used by the material to provide lights to the material if it supports lighting. + * + * @see LightPickerBase + * @see StaticLightPicker + */ + get: function () { + return this._pLightPicker; + }, + set: function (value) { + if (this._pLightPicker == value) + return; + + if (this._pLightPicker) + this._pLightPicker.removeEventListener(Event.CHANGE, this._onLightChangeDelegate); + + this._pLightPicker = value; + + if (this._pLightPicker) + this._pLightPicker.addEventListener(Event.CHANGE, this._onLightChangeDelegate); + + this._pInvalidateScreenPasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "mipmap", { + /** + * Indicates whether or not any used textures should use mipmapping. Defaults to true. + */ + get: function () { + return this._mipmap; + }, + set: function (value) { + if (this._mipmap == value) + return; + + this._mipmap = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "smooth", { + /** + * Indicates whether or not any used textures should use smoothing. + */ + get: function () { + return this._smooth; + }, + set: function (value) { + if (this._smooth == value) + return; + + this._smooth = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "repeat", { + /** + * Indicates whether or not any used textures should be tiled. If set to false, texture samples are clamped to + * the texture's borders when the uv coordinates are outside the [0, 1] interval. + */ + get: function () { + return this._repeat; + }, + set: function (value) { + if (this._repeat == value) + return; + + this._repeat = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "color", { + /** + * The diffuse reflectivity color of the surface. + */ + get: function () { + return this._color; + }, + set: function (value) { + if (this._color == value) + return; + + this._color = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "texture", { + /** + * The texture object to use for the albedo colour. + */ + get: function () { + return this._pTexture; + }, + set: function (value) { + if (this._pTexture == value) + return; + + this._pTexture = value; + + this._pInvalidatePasses(); + + this._pHeight = this._pTexture.height; + this._pWidth = this._pTexture.width; + + this._pNotifySizeChanged(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "animateUVs", { + /** + * Specifies whether or not the UV coordinates should be animated using a transformation matrix. + */ + get: function () { + return this._pAnimateUVs; + }, + set: function (value) { + if (this._pAnimateUVs == value) + return; + + this._pAnimateUVs = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "enableLightFallOff", { + /** + * Whether or not to use fallOff and radius properties for lights. This can be used to improve performance and + * compatibility for constrained mode. + */ + get: function () { + return this._enableLightFallOff; + }, + set: function (value) { + if (this._enableLightFallOff == value) + return; + + this._enableLightFallOff = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "diffuseLightSources", { + /** + * Define which light source types to use for diffuse reflections. This allows choosing between regular lights + * and/or light probes for diffuse reflections. + * + * @see away3d.materials.LightSources + */ + get: function () { + return this._diffuseLightSources; + }, + set: function (value) { + if (this._diffuseLightSources == value) + return; + + this._diffuseLightSources = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "specularLightSources", { + /** + * Define which light source types to use for specular reflections. This allows choosing between regular lights + * and/or light probes for specular reflections. + * + * @see away3d.materials.LightSources + */ + get: function () { + return this._specularLightSources; + }, + set: function (value) { + if (this._specularLightSources == value) + return; + + this._specularLightSources = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + /** + * Cleans up resources owned by the material, including passes. Textures are not owned by the material since they + * could be used by other materials and will not be disposed. + */ + MaterialBase.prototype.dispose = function () { + var i; + var len; + + this._pClearScreenPasses(); + + len = this._materialData.length; + for (i = 0; i < len; i++) + this._materialData[i].dispose(); + + this._materialData = new Array(); + + len = this._materialPassData.length; + for (i = 0; i < len; i++) + this._materialPassData[i].dispose(); + + this._materialPassData = new Array(); + }; + + Object.defineProperty(MaterialBase.prototype, "bothSides", { + /** + * Defines whether or not the material should cull triangles facing away from the camera. + */ + get: function () { + return this._bothSides; + }, + set: function (value) { + if (this._bothSides = value) + return; + + this._bothSides = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "blendMode", { + /** + * The blend mode to use when drawing this renderable. The following blend modes are supported: + *
    + *
  • BlendMode.NORMAL: No blending, unless the material inherently needs it
  • + *
  • BlendMode.LAYER: Force blending. This will draw the object the same as NORMAL, but without writing depth writes.
  • + *
  • BlendMode.MULTIPLY
  • + *
  • BlendMode.ADD
  • + *
  • BlendMode.ALPHA
  • + *
+ */ + get: function () { + return this._pBlendMode; + }, + set: function (value) { + if (this._pBlendMode == value) + return; + + this._pBlendMode = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "alphaPremultiplied", { + /** + * Indicates whether visible textures (or other pixels) used by this material have + * already been premultiplied. Toggle this if you are seeing black halos around your + * blended alpha edges. + */ + get: function () { + return this._alphaPremultiplied; + }, + set: function (value) { + if (this._alphaPremultiplied == value) + return; + + this._alphaPremultiplied = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "alphaThreshold", { + /** + * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either + * invisible or entirely opaque, often used with textures for foliage, etc. + * Recommended values are 0 to disable alpha, or 0.5 to create smooth edges. Default value is 0 (disabled). + */ + get: function () { + return this._pAlphaThreshold; + }, + set: function (value) { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + if (this._pAlphaThreshold == value) + return; + + this._pAlphaThreshold = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "requiresBlending", { + /** + * Indicates whether or not the material requires alpha blending during rendering. + */ + get: function () { + return this._pRequiresBlending; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MaterialBase.prototype, "width", { + /** + * + */ + get: function () { + return this._pWidth; + }, + enumerable: true, + configurable: true + }); + + /** + * Sets the render state for a pass that is independent of the rendered object. This needs to be called before + * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. + * @param pass The pass data to activate. + * @param stage The Stage object which is currently used for rendering. + * @param camera The camera from which the scene is viewed. + * @private + */ + MaterialBase.prototype._iActivatePass = function (pass, stage, camera) { + pass.materialPass._iActivate(pass, stage, camera); + }; + + /** + * Clears the render state for a pass. This needs to be called before activating another pass. + * @param pass The pass to deactivate. + * @param stage The Stage used for rendering + * + * @internal + */ + MaterialBase.prototype._iDeactivatePass = function (pass, stage) { + pass.materialPass._iDeactivate(pass, stage); + }; + + /** + * Renders the current pass. Before calling renderPass, activatePass needs to be called with the same index. + * @param pass The pass used to render the renderable. + * @param renderable The IRenderable object to draw. + * @param stage The Stage object used for rendering. + * @param entityCollector The EntityCollector object that contains the visible scene data. + * @param viewProjection The view-projection matrix used to project to the screen. This is not the same as + * camera.viewProjection as it includes the scaling factors when rendering to textures. + * + * @internal + */ + MaterialBase.prototype._iRenderPass = function (pass, renderable, stage, camera, viewProjection) { + if (this._pLightPicker) + this._pLightPicker.collectLights(renderable); + + pass.materialPass._iRender(pass, renderable, stage, camera, viewProjection); + }; + + // + // MATERIAL MANAGEMENT + // + /** + * Mark an IMaterialOwner as owner of this material. + * Assures we're not using the same material across renderables with different animations, since the + * Programs depend on animation. This method needs to be called when a material is assigned. + * + * @param owner The IMaterialOwner that had this material assigned + * + * @internal + */ + MaterialBase.prototype.iAddOwner = function (owner) { + this._owners.push(owner); + + var animationSet; + var animator = owner.animator; + + if (animator) + animationSet = animator.animationSet; + + if (owner.animator) { + if (this._animationSet && animationSet != this._animationSet) { + throw new Error("A Material instance cannot be shared across material owners with different animation sets"); + } else { + if (this._animationSet != animationSet) { + this._animationSet = animationSet; + + this.invalidateAnimation(); + } + } + } + }; + + /** + * Removes an IMaterialOwner as owner. + * @param owner + * + * @internal + */ + MaterialBase.prototype.iRemoveOwner = function (owner) { + this._owners.splice(this._owners.indexOf(owner), 1); + + if (this._owners.length == 0) { + this._animationSet = null; + + this.invalidateAnimation(); + } + }; + + Object.defineProperty(MaterialBase.prototype, "iOwners", { + /** + * A list of the IMaterialOwners that use this material + * + * @private + */ + get: function () { + return this._owners; + }, + enumerable: true, + configurable: true + }); + + /** + * The amount of passes used by the material. + * + * @private + */ + MaterialBase.prototype._iNumScreenPasses = function () { + return this._numPasses; + }; + + Object.defineProperty(MaterialBase.prototype, "_iScreenPasses", { + /** + * A list of the screen passes used in this material + * + * @private + */ + get: function () { + return this._passes; + }, + enumerable: true, + configurable: true + }); + + /** + * Marks the shader programs for all passes as invalid, so they will be recompiled before the next use. + * + * @private + */ + MaterialBase.prototype._pInvalidatePasses = function () { + var len = this._materialPassData.length; + for (var i = 0; i < len; i++) + this._materialPassData[i].invalidate(); + + this.invalidateMaterial(); + }; + + /** + * Flags that the screen passes have become invalid and need possible re-ordering / adding / deleting + */ + MaterialBase.prototype._pInvalidateScreenPasses = function () { + this._pScreenPassesInvalid = true; + }; + + /** + * Removes a pass from the material. + * @param pass The pass to be removed. + */ + MaterialBase.prototype._pRemoveScreenPass = function (pass) { + pass.removeEventListener(Event.CHANGE, this._onPassChangeDelegate); + this._passes.splice(this._passes.indexOf(pass), 1); + + this._numPasses--; + }; + + /** + * Removes all passes from the material + */ + MaterialBase.prototype._pClearScreenPasses = function () { + for (var i = 0; i < this._numPasses; ++i) + this._passes[i].removeEventListener(Event.CHANGE, this._onPassChangeDelegate); + + this._passes.length = this._numPasses = 0; + }; + + /** + * Adds a pass to the material + * @param pass + */ + MaterialBase.prototype._pAddScreenPass = function (pass) { + this._passes[this._numPasses++] = pass; + + pass.lightPicker = this._pLightPicker; + pass.addEventListener(Event.CHANGE, this._onPassChangeDelegate); + + this.invalidateMaterial(); + }; + + MaterialBase.prototype._iAddMaterialData = function (materialData) { + this._materialData.push(materialData); + + return materialData; + }; + + MaterialBase.prototype._iRemoveMaterialData = function (materialData) { + this._materialData.splice(this._materialData.indexOf(materialData), 1); + + return materialData; + }; + + /** + * Performs any processing that needs to occur before any of its passes are used. + * + * @private + */ + MaterialBase.prototype._iUpdateMaterial = function () { + }; + + /** + * Listener for when a pass's shader code changes. It recalculates the render order id. + */ + MaterialBase.prototype.onPassChange = function (event) { + this.invalidateMaterial(); + }; + + MaterialBase.prototype.invalidateAnimation = function () { + var len = this._materialData.length; + for (var i = 0; i < len; i++) + this._materialData[i].invalidateAnimation(); + }; + + MaterialBase.prototype.invalidateMaterial = function () { + var len = this._materialData.length; + for (var i = 0; i < len; i++) + this._materialData[i].invalidateMaterial(); + }; + + /** + * Called when the light picker's configuration changed. + */ + MaterialBase.prototype.onLightsChange = function (event) { + this._pInvalidateScreenPasses(); + }; + + MaterialBase.prototype._pNotifySizeChanged = function () { + if (!this._sizeChanged) + this._sizeChanged = new MaterialEvent(MaterialEvent.SIZE_CHANGED); + + this.dispatchEvent(this._sizeChanged); + }; + + MaterialBase.prototype._iAddMaterialPassData = function (materialPassData) { + this._materialPassData.push(materialPassData); + + return materialPassData; + }; + + MaterialBase.prototype._iRemoveMaterialPassData = function (materialPassData) { + this._materialPassData.splice(this._materialPassData.indexOf(materialPassData), 1); + + return materialPassData; + }; + return MaterialBase; +})(NamedAssetBase); + +module.exports = MaterialBase; + + +},{"awayjs-core/lib/core/base/BlendMode":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/library/NamedAssetBase":undefined,"awayjs-core/lib/events/Event":undefined,"awayjs-core/lib/events/MaterialEvent":undefined}],"awayjs-core/lib/materials/lightpickers/LightPickerBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +/** +* LightPickerBase provides an abstract base clase for light picker classes. These classes are responsible for +* feeding materials with relevant lights. Usually, StaticLightPicker can be used, but LightPickerBase can be +* extended to provide more application-specific dynamic selection of lights. +* +* @see StaticLightPicker +*/ +var LightPickerBase = (function (_super) { + __extends(LightPickerBase, _super); + /** + * Creates a new LightPickerBase object. + */ + function LightPickerBase() { + _super.call(this); + this._pNumPointLights = 0; + this._pNumDirectionalLights = 0; + this._pNumCastingPointLights = 0; + this._pNumCastingDirectionalLights = 0; + this._pNumLightProbes = 0; + } + /** + * Disposes resources used by the light picker. + */ + LightPickerBase.prototype.dispose = function () { + }; + + Object.defineProperty(LightPickerBase.prototype, "assetType", { + /** + * @inheritDoc + */ + get: function () { + return AssetType.LIGHT_PICKER; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numDirectionalLights", { + /** + * The maximum amount of directional lights that will be provided. + */ + get: function () { + return this._pNumDirectionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numPointLights", { + /** + * The maximum amount of point lights that will be provided. + */ + get: function () { + return this._pNumPointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numCastingDirectionalLights", { + /** + * The maximum amount of directional lights that cast shadows. + */ + get: function () { + return this._pNumCastingDirectionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numCastingPointLights", { + /** + * The amount of point lights that cast shadows. + */ + get: function () { + return this._pNumCastingPointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numLightProbes", { + /** + * The maximum amount of light probes that will be provided. + */ + get: function () { + return this._pNumLightProbes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "pointLights", { + /** + * The collected point lights to be used for shading. + */ + get: function () { + return this._pPointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "directionalLights", { + /** + * The collected directional lights to be used for shading. + */ + get: function () { + return this._pDirectionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "castingPointLights", { + /** + * The collected point lights that cast shadows to be used for shading. + */ + get: function () { + return this._pCastingPointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "castingDirectionalLights", { + /** + * The collected directional lights that cast shadows to be used for shading. + */ + get: function () { + return this._pCastingDirectionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "lightProbes", { + /** + * The collected light probes to be used for shading. + */ + get: function () { + return this._pLightProbes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "lightProbeWeights", { + /** + * The weights for each light probe, defining their influence on the object. + */ + get: function () { + return this._pLightProbeWeights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "allPickedLights", { + /** + * A collection of all the collected lights. + */ + get: function () { + return this._pAllPickedLights; + }, + enumerable: true, + configurable: true + }); + + /** + * Updates set of lights for a given renderable and EntityCollector. Always call super.collectLights() after custom overridden code. + */ + LightPickerBase.prototype.collectLights = function (renderable) { + this.updateProbeWeights(renderable); + }; + + /** + * Updates the weights for the light probes, based on the renderable's position relative to them. + * @param renderable The renderble for which to calculate the light probes' influence. + */ + LightPickerBase.prototype.updateProbeWeights = function (renderable) { + // todo: this will cause the same calculations to occur per TriangleSubMesh. See if this can be improved. + var objectPos = renderable.sourceEntity.scenePosition; + var lightPos; + + var rx = objectPos.x, ry = objectPos.y, rz = objectPos.z; + var dx, dy, dz; + var w, total = 0; + var i; + + for (i = 0; i < this._pNumLightProbes; ++i) { + lightPos = this._pLightProbes[i].scenePosition; + dx = rx - lightPos.x; + dy = ry - lightPos.y; + dz = rz - lightPos.z; + + // weight is inversely proportional to square of distance + w = dx * dx + dy * dy + dz * dz; + + // just... huge if at the same spot + w = w > .00001 ? 1 / w : 50000000; + this._pLightProbeWeights[i] = w; + total += w; + } + + // normalize + total = 1 / total; + + for (i = 0; i < this._pNumLightProbes; ++i) + this._pLightProbeWeights[i] *= total; + }; + return LightPickerBase; +})(NamedAssetBase); + +module.exports = LightPickerBase; + + +},{"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/library/NamedAssetBase":undefined}],"awayjs-core/lib/materials/lightpickers/StaticLightPicker":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); +var LightProbe = require("awayjs-core/lib/entities/LightProbe"); +var PointLight = require("awayjs-core/lib/entities/PointLight"); +var Event = require("awayjs-core/lib/events/Event"); +var LightEvent = require("awayjs-core/lib/events/LightEvent"); +var LightPickerBase = require("awayjs-core/lib/materials/lightpickers/LightPickerBase"); + +/** +* StaticLightPicker is a light picker that provides a static set of lights. The lights can be reassigned, but +* if the configuration changes (number of directional lights, point lights, etc), a material recompilation may +* occur. +*/ +var StaticLightPicker = (function (_super) { + __extends(StaticLightPicker, _super); + /** + * Creates a new StaticLightPicker object. + * @param lights The lights to be used for shading. + */ + function StaticLightPicker(lights) { + var _this = this; + _super.call(this); + + this._onCastShadowChangeDelegate = function (event) { + return _this.onCastShadowChange(event); + }; + + this.lights = lights; + } + Object.defineProperty(StaticLightPicker.prototype, "lights", { + /** + * The lights used for shading. + */ + get: function () { + return this._lights; + }, + set: function (value) { + var numPointLights = 0; + var numDirectionalLights = 0; + var numCastingPointLights = 0; + var numCastingDirectionalLights = 0; + var numLightProbes = 0; + var light; + + if (this._lights) + this.clearListeners(); + + this._lights = value; + this._pAllPickedLights = value; + this._pPointLights = new Array(); + this._pCastingPointLights = new Array(); + this._pDirectionalLights = new Array(); + this._pCastingDirectionalLights = new Array(); + this._pLightProbes = new Array(); + + var len = value.length; + + for (var i = 0; i < len; ++i) { + light = value[i]; + light.addEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); + + if (light instanceof PointLight) { + if (light.castsShadows) + this._pCastingPointLights[numCastingPointLights++] = light; + else + this._pPointLights[numPointLights++] = light; + } else if (light instanceof DirectionalLight) { + if (light.castsShadows) + this._pCastingDirectionalLights[numCastingDirectionalLights++] = light; + else + this._pDirectionalLights[numDirectionalLights++] = light; + } else if (light instanceof LightProbe) { + this._pLightProbes[numLightProbes++] = light; + } + } + + if (this._pNumDirectionalLights == numDirectionalLights && this._pNumPointLights == numPointLights && this._pNumLightProbes == numLightProbes && this._pNumCastingPointLights == numCastingPointLights && this._pNumCastingDirectionalLights == numCastingDirectionalLights) + return; + + this._pNumDirectionalLights = numDirectionalLights; + this._pNumCastingDirectionalLights = numCastingDirectionalLights; + this._pNumPointLights = numPointLights; + this._pNumCastingPointLights = numCastingPointLights; + this._pNumLightProbes = numLightProbes; + + // MUST HAVE MULTIPLE OF 4 ELEMENTS! + this._pLightProbeWeights = new Array(Math.ceil(numLightProbes / 4) * 4); + + // notify material lights have changed + this.dispatchEvent(new Event(Event.CHANGE)); + }, + enumerable: true, + configurable: true + }); + + + /** + * Remove configuration change listeners on the lights. + */ + StaticLightPicker.prototype.clearListeners = function () { + var len = this._lights.length; + for (var i = 0; i < len; ++i) + this._lights[i].removeEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); + }; + + /** + * Notifies the material of a configuration change. + */ + StaticLightPicker.prototype.onCastShadowChange = function (event) { + // TODO: Assign to special caster collections, just append it to the lights in SinglePass + // But keep seperated in multipass + var light = event.target; + + if (light instanceof PointLight) + this.updatePointCasting(light); + else if (light instanceof DirectionalLight) + this.updateDirectionalCasting(light); + + this.dispatchEvent(new Event(Event.CHANGE)); + }; + + /** + * Called when a directional light's shadow casting configuration changes. + */ + StaticLightPicker.prototype.updateDirectionalCasting = function (light) { + var dl = light; + + if (light.castsShadows) { + --this._pNumDirectionalLights; + ++this._pNumCastingDirectionalLights; + + this._pDirectionalLights.splice(this._pDirectionalLights.indexOf(dl), 1); + this._pCastingDirectionalLights.push(light); + } else { + ++this._pNumDirectionalLights; + --this._pNumCastingDirectionalLights; + + this._pCastingDirectionalLights.splice(this._pCastingDirectionalLights.indexOf(dl), 1); + this._pDirectionalLights.push(light); + } + }; + + /** + * Called when a point light's shadow casting configuration changes. + */ + StaticLightPicker.prototype.updatePointCasting = function (light) { + var pl = light; + + if (light.castsShadows) { + --this._pNumPointLights; + ++this._pNumCastingPointLights; + this._pPointLights.splice(this._pPointLights.indexOf(pl), 1); + this._pCastingPointLights.push(light); + } else { + ++this._pNumPointLights; + --this._pNumCastingPointLights; + + this._pCastingPointLights.splice(this._pCastingPointLights.indexOf(pl), 1); + this._pPointLights.push(light); + } + }; + return StaticLightPicker; +})(LightPickerBase); + +module.exports = StaticLightPicker; + + +},{"awayjs-core/lib/entities/DirectionalLight":undefined,"awayjs-core/lib/entities/LightProbe":undefined,"awayjs-core/lib/entities/PointLight":undefined,"awayjs-core/lib/events/Event":undefined,"awayjs-core/lib/events/LightEvent":undefined,"awayjs-core/lib/materials/lightpickers/LightPickerBase":undefined}],"awayjs-core/lib/materials/passes/IMaterialPass":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/materials/shadowmappers/CascadeShadowMapper":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +var Camera = require("awayjs-core/lib/entities/Camera"); +var Event = require("awayjs-core/lib/events/Event"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +var DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); +var FreeMatrixProjection = require("awayjs-core/lib/projections/FreeMatrixProjection"); + +var CascadeShadowMapper = (function (_super) { + __extends(CascadeShadowMapper, _super); + function CascadeShadowMapper(numCascades) { + if (typeof numCascades === "undefined") { numCascades = 3; } + _super.call(this); + this._pScissorRectsInvalid = true; + + if (numCascades < 1 || numCascades > 4) + throw new Error("numCascades must be an integer between 1 and 4"); + + this._numCascades = numCascades; + this._changeDispatcher = new EventDispatcher(this); + this.init(); + } + CascadeShadowMapper.prototype.getSplitRatio = function (index /*uint*/ ) { + return this._splitRatios[index]; + }; + + CascadeShadowMapper.prototype.setSplitRatio = function (index /*uint*/ , value) { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + if (index >= this._numCascades) + throw new Error("index must be smaller than the number of cascades!"); + + this._splitRatios[index] = value; + }; + + CascadeShadowMapper.prototype.getDepthProjections = function (partition /*uint*/ ) { + return this._depthCameras[partition].viewProjection; + }; + + CascadeShadowMapper.prototype.init = function () { + this._splitRatios = new Array(this._numCascades); + this._nearPlaneDistances = new Array(this._numCascades); + + var s = 1; + for (var i = this._numCascades - 1; i >= 0; --i) { + this._splitRatios[i] = s; + s *= .4; + } + + this._texOffsetsX = Array(-1, 1, -1, 1); + this._texOffsetsY = Array(1, 1, -1, -1); + this._pScissorRects = new Array(4); + this._depthLenses = new Array(); + this._depthCameras = new Array(); + + for (i = 0; i < this._numCascades; ++i) { + this._depthLenses[i] = new FreeMatrixProjection(); + this._depthCameras[i] = new Camera(this._depthLenses[i]); + } + }; + + CascadeShadowMapper.prototype._pSetDepthMapSize = function (value /*uint*/ ) { + _super.prototype._pSetDepthMapSize.call(this, value); + + this.invalidateScissorRects(); + }; + + CascadeShadowMapper.prototype.invalidateScissorRects = function () { + this._pScissorRectsInvalid = true; + }; + + Object.defineProperty(CascadeShadowMapper.prototype, "numCascades", { + get: function () { + return this._numCascades; + }, + set: function (value /*int*/ ) { + if (value == this._numCascades) + return; + + if (value < 1 || value > 4) + throw new Error("numCascades must be an integer between 1 and 4"); + + this._numCascades = value; + this.invalidateScissorRects(); + this.init(); + this.dispatchEvent(new Event(Event.CHANGE)); + }, + enumerable: true, + configurable: true + }); + + + CascadeShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { + if (this._pScissorRectsInvalid) + this.updateScissorRects(); + + this._pCasterCollector.cullPlanes = this._pCullPlanes; + this._pCasterCollector.camera = this._pOverallDepthCamera; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + + renderer._iRenderCascades(this._pCasterCollector, target, this._numCascades, this._pScissorRects, this._depthCameras); + }; + + CascadeShadowMapper.prototype.updateScissorRects = function () { + var half = this._pDepthMapSize * .5; + + this._pScissorRects[0] = new Rectangle(0, 0, half, half); + this._pScissorRects[1] = new Rectangle(half, 0, half, half); + this._pScissorRects[2] = new Rectangle(0, half, half, half); + this._pScissorRects[3] = new Rectangle(half, half, half, half); + + this._pScissorRectsInvalid = false; + }; + + CascadeShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { + var matrix; + var projection = viewCamera.projection; + var projectionNear = projection.near; + var projectionRange = projection.far - projectionNear; + + this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); + this._pMatrix.appendScale(.96, .96, 1); + this._pOverallDepthProjection.matrix = this._pMatrix; + this.pUpdateCullPlanes(viewCamera); + + for (var i = 0; i < this._numCascades; ++i) { + matrix = this._depthLenses[i].matrix; + + this._nearPlaneDistances[i] = projectionNear + this._splitRatios[i] * projectionRange; + this._depthCameras[i].transform = this._pOverallDepthCamera.transform; + + this.updateProjectionPartition(matrix, this._splitRatios[i], this._texOffsetsX[i], this._texOffsetsY[i]); + + this._depthLenses[i].matrix = matrix; + } + }; + + CascadeShadowMapper.prototype.updateProjectionPartition = function (matrix, splitRatio, texOffsetX, texOffsetY) { + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + var xN, yN, zN; + var xF, yF, zF; + var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, minZ; + var maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY, maxZ = Number.NEGATIVE_INFINITY; + var i = 0; + + while (i < 12) { + xN = this._pLocalFrustum[i]; + yN = this._pLocalFrustum[i + 1]; + zN = this._pLocalFrustum[i + 2]; + xF = xN + (this._pLocalFrustum[i + 12] - xN) * splitRatio; + yF = yN + (this._pLocalFrustum[i + 13] - yN) * splitRatio; + zF = zN + (this._pLocalFrustum[i + 14] - zN) * splitRatio; + if (xN < minX) + minX = xN; + if (xN > maxX) + maxX = xN; + if (yN < minY) + minY = yN; + if (yN > maxY) + maxY = yN; + if (zN > maxZ) + maxZ = zN; + if (xF < minX) + minX = xF; + if (xF > maxX) + maxX = xF; + if (yF < minY) + minY = yF; + if (yF > maxY) + maxY = yF; + if (zF > maxZ) + maxZ = zF; + i += 3; + } + + minZ = 1; + + var w = (maxX - minX); + var h = (maxY - minY); + var d = 1 / (maxZ - minZ); + + if (minX < 0) + minX -= this._pSnap; // because int() rounds up for < 0 + if (minY < 0) + minY -= this._pSnap; + minX = Math.floor(minX / this._pSnap) * this._pSnap; + minY = Math.floor(minY / this._pSnap) * this._pSnap; + + var snap2 = 2 * this._pSnap; + w = Math.floor(w / snap2 + 1) * snap2; + h = Math.floor(h / snap2 + 1) * snap2; + + maxX = minX + w; + maxY = minY + h; + + w = 1 / w; + h = 1 / h; + + raw[0] = 2 * w; + raw[5] = 2 * h; + raw[10] = d; + raw[12] = -(maxX + minX) * w; + raw[13] = -(maxY + minY) * h; + raw[14] = -minZ * d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + + matrix.copyRawDataFrom(raw); + matrix.appendScale(.96, .96, 1); + matrix.appendTranslation(texOffsetX, texOffsetY, 0); + matrix.appendScale(.5, .5, 1); + }; + + CascadeShadowMapper.prototype.addEventListener = function (type, listener) { + this._changeDispatcher.addEventListener(type, listener); + }; + + CascadeShadowMapper.prototype.removeEventListener = function (type, listener) { + this._changeDispatcher.removeEventListener(type, listener); + }; + + CascadeShadowMapper.prototype.dispatchEvent = function (event) { + return this._changeDispatcher.dispatchEvent(event); + }; + + CascadeShadowMapper.prototype.hasEventListener = function (type) { + return this._changeDispatcher.hasEventListener(type); + }; + + Object.defineProperty(CascadeShadowMapper.prototype, "_iNearPlaneDistances", { + get: function () { + return this._nearPlaneDistances; + }, + enumerable: true, + configurable: true + }); + return CascadeShadowMapper; +})(DirectionalShadowMapper); + +module.exports = CascadeShadowMapper; + + +},{"awayjs-core/lib/core/geom/Matrix3DUtils":undefined,"awayjs-core/lib/core/geom/Rectangle":undefined,"awayjs-core/lib/entities/Camera":undefined,"awayjs-core/lib/events/Event":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper":undefined,"awayjs-core/lib/projections/FreeMatrixProjection":undefined}],"awayjs-core/lib/materials/shadowmappers/CubeMapShadowMapper":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Camera = require("awayjs-core/lib/entities/Camera"); + +var PartialImplementationError = require("awayjs-core/lib/errors/PartialImplementationError"); +var ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); + +var CubeMapShadowMapper = (function (_super) { + __extends(CubeMapShadowMapper, _super); + function CubeMapShadowMapper() { + _super.call(this); + + this._pDepthMapSize = 512; + this._needsRender = new Array(); + this.initCameras(); + } + CubeMapShadowMapper.prototype.initCameras = function () { + this._depthCameras = new Array(); + this._projections = new Array(); + + // posX, negX, posY, negY, posZ, negZ + this.addCamera(0, 90, 0); + this.addCamera(0, -90, 0); + this.addCamera(-90, 0, 0); + this.addCamera(90, 0, 0); + this.addCamera(0, 0, 0); + this.addCamera(0, 180, 0); + }; + + CubeMapShadowMapper.prototype.addCamera = function (rotationX, rotationY, rotationZ) { + var cam = new Camera(); + cam.rotationX = rotationX; + cam.rotationY = rotationY; + cam.rotationZ = rotationZ; + cam.projection.near = .01; + + var projection = cam.projection; + projection.fieldOfView = 90; + this._projections.push(projection); + cam.projection._iAspectRatio = 1; + this._depthCameras.push(cam); + }; + + //@override + CubeMapShadowMapper.prototype.pCreateDepthTexture = function () { + throw new PartialImplementationError(); + /* + return new RenderCubeTexture( this._depthMapSize ); + */ + }; + + //@override + CubeMapShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { + var light = (this._pLight); + var maxDistance = light._pFallOff; + var pos = this._pLight.scenePosition; + + for (var i = 0; i < 6; ++i) { + this._projections[i].far = maxDistance; + this._depthCameras[i].transform.position = pos; + this._needsRender[i] = true; + } + }; + + //@override + CubeMapShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { + for (var i = 0; i < 6; ++i) { + if (this._needsRender[i]) { + this._pCasterCollector.camera = this._depthCameras[i]; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + renderer._iRender(this._pCasterCollector, target, null, i); + } + } + }; + return CubeMapShadowMapper; +})(ShadowMapperBase); + +module.exports = CubeMapShadowMapper; + + +},{"awayjs-core/lib/entities/Camera":undefined,"awayjs-core/lib/errors/PartialImplementationError":undefined,"awayjs-core/lib/materials/shadowmappers/ShadowMapperBase":undefined}],"awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + +var Camera = require("awayjs-core/lib/entities/Camera"); + +var ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); +var FreeMatrixProjection = require("awayjs-core/lib/projections/FreeMatrixProjection"); + +var DirectionalShadowMapper = (function (_super) { + __extends(DirectionalShadowMapper, _super); + function DirectionalShadowMapper() { + _super.call(this); + this._pLightOffset = 10000; + this._pSnap = 64; + + this._pCullPlanes = []; + this._pOverallDepthProjection = new FreeMatrixProjection(); + this._pOverallDepthCamera = new Camera(this._pOverallDepthProjection); + this._pLocalFrustum = []; + this._pMatrix = new Matrix3D(); + } + Object.defineProperty(DirectionalShadowMapper.prototype, "snap", { + get: function () { + return this._pSnap; + }, + set: function (value) { + this._pSnap = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DirectionalShadowMapper.prototype, "lightOffset", { + get: function () { + return this._pLightOffset; + }, + set: function (value) { + this._pLightOffset = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DirectionalShadowMapper.prototype, "iDepthProjection", { + //@arcane + get: function () { + return this._pOverallDepthCamera.viewProjection; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DirectionalShadowMapper.prototype, "depth", { + //@arcane + get: function () { + return this._pMaxZ - this._pMinZ; + }, + enumerable: true, + configurable: true + }); + + //@override + DirectionalShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { + this._pCasterCollector.camera = this._pOverallDepthCamera; + this._pCasterCollector.cullPlanes = this._pCullPlanes; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + renderer._iRender(this._pCasterCollector, target); + }; + + //@protected + DirectionalShadowMapper.prototype.pUpdateCullPlanes = function (viewCamera) { + var lightFrustumPlanes = this._pOverallDepthCamera.frustumPlanes; + var viewFrustumPlanes = viewCamera.frustumPlanes; + this._pCullPlanes.length = 4; + + this._pCullPlanes[0] = lightFrustumPlanes[0]; + this._pCullPlanes[1] = lightFrustumPlanes[1]; + this._pCullPlanes[2] = lightFrustumPlanes[2]; + this._pCullPlanes[3] = lightFrustumPlanes[3]; + + var light = this._pLight; + var dir = light.sceneDirection; + var dirX = dir.x; + var dirY = dir.y; + var dirZ = dir.z; + var j = 4; + for (var i = 0; i < 6; ++i) { + var plane = viewFrustumPlanes[i]; + if (plane.a * dirX + plane.b * dirY + plane.c * dirZ < 0) + this._pCullPlanes[j++] = plane; + } + }; + + //@override + DirectionalShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { + this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); + this._pOverallDepthProjection.matrix = this._pMatrix; + this.pUpdateCullPlanes(viewCamera); + }; + + DirectionalShadowMapper.prototype.pUpdateProjectionFromFrustumCorners = function (viewCamera, corners, matrix) { + var raw = new Array(); + var dir; + var x, y, z; + var minX, minY; + var maxX, maxY; + var i; + + var light = this._pLight; + dir = light.sceneDirection; + this._pOverallDepthCamera.transform.matrix3D = this._pLight.sceneTransform; + x = Math.floor((viewCamera.x - dir.x * this._pLightOffset) / this._pSnap) * this._pSnap; + y = Math.floor((viewCamera.y - dir.y * this._pLightOffset) / this._pSnap) * this._pSnap; + z = Math.floor((viewCamera.z - dir.z * this._pLightOffset) / this._pSnap) * this._pSnap; + this._pOverallDepthCamera.x = x; + this._pOverallDepthCamera.y = y; + this._pOverallDepthCamera.z = z; + + this._pMatrix.copyFrom(this._pOverallDepthCamera.inverseSceneTransform); + this._pMatrix.prepend(viewCamera.sceneTransform); + this._pMatrix.transformVectors(corners, this._pLocalFrustum); + + minX = maxX = this._pLocalFrustum[0]; + minY = maxY = this._pLocalFrustum[1]; + this._pMaxZ = this._pLocalFrustum[2]; + + i = 3; + while (i < 24) { + x = this._pLocalFrustum[i]; + y = this._pLocalFrustum[i + 1]; + z = this._pLocalFrustum[i + 2]; + if (x < minX) + minX = x; + if (x > maxX) + maxX = x; + if (y < minY) + minY = y; + if (y > maxY) + maxY = y; + if (z > this._pMaxZ) + this._pMaxZ = z; + i += 3; + } + + this._pMinZ = 1; + + var w = maxX - minX; + var h = maxY - minY; + var d = 1 / (this._pMaxZ - this._pMinZ); + + if (minX < 0) + minX -= this._pSnap; // because int() rounds up for < 0 + + if (minY < 0) + minY -= this._pSnap; + + minX = Math.floor(minX / this._pSnap) * this._pSnap; + minY = Math.floor(minY / this._pSnap) * this._pSnap; + + var snap2 = 2 * this._pSnap; + w = Math.floor(w / snap2 + 2) * snap2; + h = Math.floor(h / snap2 + 2) * snap2; + + maxX = minX + w; + maxY = minY + h; + + w = 1 / w; + h = 1 / h; + + raw[0] = 2 * w; + raw[5] = 2 * h; + raw[10] = d; + raw[12] = -(maxX + minX) * w; + raw[13] = -(maxY + minY) * h; + raw[14] = -this._pMinZ * d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + + matrix.copyRawDataFrom(raw); + }; + return DirectionalShadowMapper; +})(ShadowMapperBase); + +module.exports = DirectionalShadowMapper; + + +},{"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/entities/Camera":undefined,"awayjs-core/lib/materials/shadowmappers/ShadowMapperBase":undefined,"awayjs-core/lib/projections/FreeMatrixProjection":undefined}],"awayjs-core/lib/materials/shadowmappers/NearDirectionalShadowMapper":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + +var NearDirectionalShadowMapper = (function (_super) { + __extends(NearDirectionalShadowMapper, _super); + function NearDirectionalShadowMapper(coverageRatio) { + if (typeof coverageRatio === "undefined") { coverageRatio = .5; } + _super.call(this); + + this.coverageRatio = coverageRatio; + } + Object.defineProperty(NearDirectionalShadowMapper.prototype, "coverageRatio", { + /** + * A value between 0 and 1 to indicate the ratio of the view frustum that needs to be covered by the shadow map. + */ + get: function () { + return this._coverageRatio; + }, + set: function (value) { + if (value > 1) + value = 1; + else if (value < 0) + value = 0; + + this._coverageRatio = value; + }, + enumerable: true, + configurable: true + }); + + + NearDirectionalShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { + var corners = viewCamera.projection.frustumCorners; + + for (var i = 0; i < 12; ++i) { + var v = corners[i]; + this._pLocalFrustum[i] = v; + this._pLocalFrustum[i + 12] = v + (corners[i + 12] - v) * this._coverageRatio; + } + + this.pUpdateProjectionFromFrustumCorners(viewCamera, this._pLocalFrustum, this._pMatrix); + this._pOverallDepthProjection.matrix = this._pMatrix; + }; + return NearDirectionalShadowMapper; +})(DirectionalShadowMapper); + +module.exports = NearDirectionalShadowMapper; + + +},{"awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper":undefined}],"awayjs-core/lib/materials/shadowmappers/ShadowMapperBase":[function(require,module,exports){ +var ShadowCasterCollector = require("awayjs-core/lib/core/traverse/ShadowCasterCollector"); +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var RenderTexture = require("awayjs-core/lib/textures/RenderTexture"); + +var ShadowMapperBase = (function () { + function ShadowMapperBase() { + this._pDepthMapSize = 2048; + this._autoUpdateShadows = true; + this._pCasterCollector = this.pCreateCasterCollector(); + } + ShadowMapperBase.prototype.pCreateCasterCollector = function () { + return new ShadowCasterCollector(); + }; + + Object.defineProperty(ShadowMapperBase.prototype, "autoUpdateShadows", { + get: function () { + return this._autoUpdateShadows; + }, + set: function (value) { + this._autoUpdateShadows = value; + }, + enumerable: true, + configurable: true + }); + + + ShadowMapperBase.prototype.updateShadows = function () { + this._iShadowsInvalid = true; + }; + + ShadowMapperBase.prototype.iSetDepthMap = function (depthMap) { + if (this._depthMap == depthMap) + return; + + if (this._depthMap && !this._explicitDepthMap) + this._depthMap.dispose(); + + this._depthMap = depthMap; + + if (this._depthMap) { + this._explicitDepthMap = true; + this._pDepthMapSize = this._depthMap.size; + } else { + this._explicitDepthMap = false; + } + }; + + Object.defineProperty(ShadowMapperBase.prototype, "light", { + get: function () { + return this._pLight; + }, + set: function (value) { + this._pLight = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ShadowMapperBase.prototype, "depthMap", { + get: function () { + if (!this._depthMap) + this._depthMap = this.pCreateDepthTexture(); + + return this._depthMap; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ShadowMapperBase.prototype, "depthMapSize", { + get: function () { + return this._pDepthMapSize; + }, + set: function (value) { + if (value == this._pDepthMapSize) + return; + + this._pSetDepthMapSize(value); + }, + enumerable: true, + configurable: true + }); + + + ShadowMapperBase.prototype.dispose = function () { + this._pCasterCollector = null; + + if (this._depthMap && !this._explicitDepthMap) + this._depthMap.dispose(); + + this._depthMap = null; + }; + + ShadowMapperBase.prototype.pCreateDepthTexture = function () { + return new RenderTexture(this._pDepthMapSize, this._pDepthMapSize); + }; + + ShadowMapperBase.prototype.iRenderDepthMap = function (entityCollector, renderer) { + this._iShadowsInvalid = false; + + this.pUpdateDepthProjection(entityCollector.camera); + + if (!this._depthMap) + this._depthMap = this.pCreateDepthTexture(); + + this.pDrawDepthMap(this._depthMap, entityCollector.scene, renderer); + }; + + ShadowMapperBase.prototype.pUpdateDepthProjection = function (viewCamera) { + throw new AbstractMethodError(); + }; + + ShadowMapperBase.prototype.pDrawDepthMap = function (target, scene, renderer) { + throw new AbstractMethodError(); + }; + + ShadowMapperBase.prototype._pSetDepthMapSize = function (value) { + this._pDepthMapSize = value; + + if (this._explicitDepthMap) { + throw Error("Cannot set depth map size for the current renderer."); + } else if (this._depthMap) { + this._depthMap.dispose(); + this._depthMap = null; + } + }; + return ShadowMapperBase; +})(); + +module.exports = ShadowMapperBase; + + +},{"awayjs-core/lib/core/traverse/ShadowCasterCollector":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/textures/RenderTexture":undefined}],"awayjs-core/lib/parsers/CubeTextureParser":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + +var ImageCubeTexture = require("awayjs-core/lib/textures/ImageCubeTexture"); + +/** +* CubeTextureParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into +* a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without +* exception cases. +*/ +var CubeTextureParser = (function (_super) { + __extends(CubeTextureParser, _super); + /** + * Creates a new CubeTextureParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + function CubeTextureParser() { + _super.call(this, URLLoaderDataFormat.TEXT); + } + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + CubeTextureParser.supportsType = function (extension) { + extension = extension.toLowerCase(); + return extension == "cube"; + }; + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + CubeTextureParser.supportsData = function (data) { + try { + var obj = JSON.parse(data); + + if (obj) { + return true; + } + return false; + } catch (e) { + return false; + } + + return false; + }; + + /** + * @inheritDoc + */ + CubeTextureParser.prototype._iResolveDependency = function (resourceDependency) { + }; + + /** + * @inheritDoc + */ + CubeTextureParser.prototype._iResolveDependencyFailure = function (resourceDependency) { + }; + + /** + * @inheritDoc + */ + CubeTextureParser.prototype._pProceedParsing = function () { + if (this._imgDependencyDictionary != null) { + var asset = new ImageCubeTexture(this._getHTMLImageElement(CubeTextureParser.posX), this._getHTMLImageElement(CubeTextureParser.negX), this._getHTMLImageElement(CubeTextureParser.posY), this._getHTMLImageElement(CubeTextureParser.negY), this._getHTMLImageElement(CubeTextureParser.posZ), this._getHTMLImageElement(CubeTextureParser.negZ)); + + //clear dictionary + this._imgDependencyDictionary = null; + + asset.name = this._iFileName; + + this._pFinalizeAsset(asset, this._iFileName); + + return ParserBase.PARSING_DONE; + } + + try { + var json = JSON.parse(this.data); + var data = json.data; + var rec; + + if (data.length != 6) + this._pDieWithError('CubeTextureParser: Error - cube texture should have exactly 6 images'); + + if (json) { + this._imgDependencyDictionary = new Object(); + + for (var c = 0; c < data.length; c++) { + rec = data[c]; + this._imgDependencyDictionary[rec.id] = this._pAddDependency(rec.id, new URLRequest(rec.image.toString())); + } + + if (!this._validateCubeData()) { + this._pDieWithError("CubeTextureParser: JSON data error - cubes require id of: \n" + CubeTextureParser.posX + ', ' + CubeTextureParser.negX + ', \n' + CubeTextureParser.posY + ', ' + CubeTextureParser.negY + ', \n' + CubeTextureParser.posZ + ', ' + CubeTextureParser.negZ); + + return ParserBase.PARSING_DONE; + } + + this._pPauseAndRetrieveDependencies(); + + return ParserBase.MORE_TO_PARSE; + } + } catch (e) { + this._pDieWithError('CubeTexturePaser Error parsing JSON'); + } + + return ParserBase.PARSING_DONE; + }; + + CubeTextureParser.prototype._validateCubeData = function () { + return (this._imgDependencyDictionary[CubeTextureParser.posX] != null && this._imgDependencyDictionary[CubeTextureParser.negX] != null && this._imgDependencyDictionary[CubeTextureParser.posY] != null && this._imgDependencyDictionary[CubeTextureParser.negY] != null && this._imgDependencyDictionary[CubeTextureParser.posZ] != null && this._imgDependencyDictionary[CubeTextureParser.negZ] != null); + }; + + CubeTextureParser.prototype._getHTMLImageElement = function (name) { + var dependency = this._imgDependencyDictionary[name]; + + if (dependency) { + return dependency.assets[0].htmlImageElement; + } + + return null; + }; + CubeTextureParser.posX = 'posX'; + CubeTextureParser.negX = 'negX'; + CubeTextureParser.posY = 'posY'; + CubeTextureParser.negY = 'negY'; + CubeTextureParser.posZ = 'posZ'; + CubeTextureParser.negZ = 'negZ'; + return CubeTextureParser; +})(ParserBase); + +module.exports = CubeTextureParser; + + +},{"awayjs-core/lib/core/net/URLLoaderDataFormat":undefined,"awayjs-core/lib/core/net/URLRequest":undefined,"awayjs-core/lib/parsers/ParserBase":undefined,"awayjs-core/lib/textures/ImageCubeTexture":undefined}],"awayjs-core/lib/parsers/ParserBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +var TimerEvent = require("awayjs-core/lib/events/TimerEvent"); +var ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +var ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); + +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); +var Timer = require("awayjs-core/lib/utils/Timer"); +var getTimer = require("awayjs-core/lib/utils/getTimer"); + +/** +* ParserBase provides an abstract base class for objects that convert blocks of data to data structures +* supported by away. +* +* If used by AssetLoader to automatically determine the parser type, two public static methods should +* be implemented, with the following signatures: +* +* public static supportsType(extension : string) : boolean +* Indicates whether or not a given file extension is supported by the parser. +* +* public static supportsData(data : *) : boolean +* Tests whether a data block can be parsed by the parser. +* +* Furthermore, for any concrete subtype, the method initHandle should be overridden to immediately +* create the object that will contain the parsed data. This allows ResourceManager to return an object +* handle regardless of whether the object was loaded or not. +* +* @see AssetLoader +*/ +var ParserBase = (function (_super) { + __extends(ParserBase, _super); + /** + * Creates a new ParserBase object + * @param format The data format of the file data to be parsed. Can be either ParserDataFormat.BINARY or ParserDataFormat.PLAIN_TEXT, and should be provided by the concrete subtype. + * + * @see away.loading.parsers.ParserDataFormat + */ + function ParserBase(format) { + var _this = this; + _super.call(this); + + this._materialMode = 0; + this._dataFormat = format; + this._dependencies = new Array(); + + this._pOnIntervalDelegate = function (event) { + return _this._pOnInterval(event); + }; + } + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + // TODO: add error checking for the following ( could cause a problem if this function is not implemented ) + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + // Needs to be implemented in all Parsers ( + //public static supportsType(extension : string) : boolean + //* Indicates whether or not a given file extension is supported by the parser. + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + ParserBase.supportsType = function (extension) { + throw new AbstractMethodError(); + }; + + Object.defineProperty(ParserBase.prototype, "content", { + /* Protected */ + get: function () { + return this._pContent; + }, + enumerable: true, + configurable: true + }); + + /** + * Validates a bitmapData loaded before assigning to a default BitmapMaterial + */ + ParserBase.prototype.isBitmapDataValid = function (bitmapData) { + var isValid = TextureUtils.isBitmapDataValid(bitmapData); + + if (!isValid) { + console.log(">> Bitmap loaded is not having power of 2 dimensions or is higher than 2048"); + } + + return isValid; + }; + + + Object.defineProperty(ParserBase.prototype, "parsingFailure", { + get: function () { + return this._parsingFailure; + }, + set: function (b) { + this._parsingFailure = b; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ParserBase.prototype, "parsingPaused", { + get: function () { + return this._parsingPaused; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ParserBase.prototype, "parsingComplete", { + get: function () { + return this._parsingComplete; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ParserBase.prototype, "materialMode", { + get: function () { + return this._materialMode; + }, + set: function (newMaterialMode) { + this._materialMode = newMaterialMode; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ParserBase.prototype, "data", { + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ParserBase.prototype, "dataFormat", { + /** + * The data format of the file data to be parsed. Options are URLLoaderDataFormat.BINARY, URLLoaderDataFormat.ARRAY_BUFFER, URLLoaderDataFormat.BLOB, URLLoaderDataFormat.VARIABLES or URLLoaderDataFormat.TEXT. + */ + get: function () { + return this._dataFormat; + }, + enumerable: true, + configurable: true + }); + + /** + * Parse data (possibly containing bytearry, plain text or BitmapAsset) asynchronously, meaning that + * the parser will periodically stop parsing so that the AVM may proceed to the + * next frame. + * + * @param data The untyped data object in which the loaded data resides. + * @param frameLimit number of milliseconds of parsing allowed per frame. The + * actual time spent on a frame can exceed this number since time-checks can + * only be performed between logical sections of the parsing procedure. + */ + ParserBase.prototype.parseAsync = function (data, frameLimit) { + if (typeof frameLimit === "undefined") { frameLimit = 30; } + this._data = data; + this._pStartParsing(frameLimit); + }; + + Object.defineProperty(ParserBase.prototype, "dependencies", { + /** + * A list of dependencies that need to be loaded and resolved for the object being parsed. + */ + get: function () { + return this._dependencies; + }, + enumerable: true, + configurable: true + }); + + /** + * Resolve a dependency when it's loaded. For example, a dependency containing an ImageResource would be assigned + * to a Mesh instance as a BitmapMaterial, a scene graph object would be added to its intended parent. The + * dependency should be a member of the dependencies property. + * + * @param resourceDependency The dependency to be resolved. + */ + ParserBase.prototype._iResolveDependency = function (resourceDependency) { + throw new AbstractMethodError(); + }; + + /** + * Resolve a dependency loading failure. Used by parser to eventually provide a default map + * + * @param resourceDependency The dependency to be resolved. + */ + ParserBase.prototype._iResolveDependencyFailure = function (resourceDependency) { + throw new AbstractMethodError(); + }; + + /** + * Resolve a dependency name + * + * @param resourceDependency The dependency to be resolved. + */ + ParserBase.prototype._iResolveDependencyName = function (resourceDependency, asset) { + return asset.name; + }; + + ParserBase.prototype._iResumeParsingAfterDependencies = function () { + this._parsingPaused = false; + + if (this._timer) + this._timer.start(); + }; + + ParserBase.prototype._pFinalizeAsset = function (asset, name) { + if (typeof name === "undefined") { name = null; } + var type_event; + var type_name; + + if (name != null) + asset.name = name; + + // If the asset has no name, give it + // a per-type default name. + if (!asset.name) + asset.name = asset.assetType; + + this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_COMPLETE, asset)); + }; + + /** + * Parse the next block of data. + * @return Whether or not more data needs to be parsed. Can be ParserBase.ParserBase.PARSING_DONE or + * ParserBase.ParserBase.MORE_TO_PARSE. + */ + ParserBase.prototype._pProceedParsing = function () { + throw new AbstractMethodError(); + }; + + ParserBase.prototype._pDieWithError = function (message) { + if (typeof message === "undefined") { message = 'Unknown parsing error'; } + if (this._timer) { + this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.stop(); + this._timer = null; + } + + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message)); + }; + + ParserBase.prototype._pAddDependency = function (id, req, retrieveAsRawData, data, suppressErrorEvents) { + if (typeof retrieveAsRawData === "undefined") { retrieveAsRawData = false; } + if (typeof data === "undefined") { data = null; } + if (typeof suppressErrorEvents === "undefined") { suppressErrorEvents = false; } + var dependency = new ResourceDependency(id, req, data, null, this, retrieveAsRawData, suppressErrorEvents); + this._dependencies.push(dependency); + + return dependency; + }; + + ParserBase.prototype._pPauseAndRetrieveDependencies = function () { + if (this._timer) + this._timer.stop(); + + this._parsingPaused = true; + this.dispatchEvent(new ParserEvent(ParserEvent.READY_FOR_DEPENDENCIES)); + }; + + /** + * Tests whether or not there is still time left for parsing within the maximum allowed time frame per session. + * @return True if there is still time left, false if the maximum allotted time was exceeded and parsing should be interrupted. + */ + ParserBase.prototype._pHasTime = function () { + return ((getTimer() - this._lastFrameTime) < this._frameLimit); + }; + + /** + * Called when the parsing pause interval has passed and parsing can proceed. + */ + ParserBase.prototype._pOnInterval = function (event) { + if (typeof event === "undefined") { event = null; } + this._lastFrameTime = getTimer(); + + if (this._pProceedParsing() && !this._parsingFailure) + this._pFinishParsing(); + }; + + /** + * Initializes the parsing of data. + * @param frameLimit The maximum duration of a parsing session. + */ + ParserBase.prototype._pStartParsing = function (frameLimit) { + this._frameLimit = frameLimit; + this._timer = new Timer(this._frameLimit, 0); + this._timer.addEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.start(); + }; + + /** + * Finish parsing the data. + */ + ParserBase.prototype._pFinishParsing = function () { + if (this._timer) { + this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.stop(); + } + + this._timer = null; + this._parsingComplete = true; + + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_COMPLETE)); + }; + + /** + * + * @returns {string} + * @private + */ + ParserBase.prototype._pGetTextData = function () { + return ParserUtils.toString(this._data); + }; + + /** + * + * @returns {string} + * @private + */ + ParserBase.prototype._pGetByteData = function () { + return ParserUtils.toByteArray(this._data); + }; + ParserBase.PARSING_DONE = true; + + ParserBase.MORE_TO_PARSE = false; + return ParserBase; +})(EventDispatcher); + +module.exports = ParserBase; + + +},{"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/events/AssetEvent":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/events/ParserEvent":undefined,"awayjs-core/lib/events/TimerEvent":undefined,"awayjs-core/lib/parsers/ParserUtils":undefined,"awayjs-core/lib/parsers/ResourceDependency":undefined,"awayjs-core/lib/utils/TextureUtils":undefined,"awayjs-core/lib/utils/Timer":undefined,"awayjs-core/lib/utils/getTimer":undefined}],"awayjs-core/lib/parsers/ParserDataFormat":[function(require,module,exports){ +/** +* An enumeration providing values to describe the data format of parsed data. +*/ +var ParserDataFormat = (function () { + function ParserDataFormat() { + } + ParserDataFormat.BINARY = "binary"; + + ParserDataFormat.PLAIN_TEXT = "plainText"; + + ParserDataFormat.IMAGE = "image"; + return ParserDataFormat; +})(); + +module.exports = ParserDataFormat; + + +},{}],"awayjs-core/lib/parsers/ParserUtils":[function(require,module,exports){ +var ByteArray = require("awayjs-core/lib/utils/ByteArray"); + +var ParserUtils = (function () { + function ParserUtils() { + } + /** + * Converts an ArrayBuffer to a base64 string + * + * @param image data as a ByteArray + * + * @return HTMLImageElement + * + */ + ParserUtils.arrayBufferToImage = function (data) { + var byteStr = ''; + var bytes = new Uint8Array(data); + var len = bytes.byteLength; + + for (var i = 0; i < len; i++) + byteStr += String.fromCharCode(bytes[i]); + + var base64Image = window.btoa(byteStr); + var str = 'data:image/png;base64,' + base64Image; + var img = new Image(); + img.src = str; + + return img; + }; + + /** + * Converts an ByteArray to an Image - returns an HTMLImageElement + * + * @param image data as a ByteArray + * + * @return HTMLImageElement + * + */ + ParserUtils.byteArrayToImage = function (data) { + var byteStr = ''; + var bytes = new Uint8Array(data.arraybytes); + var len = bytes.byteLength; + + for (var i = 0; i < len; i++) + byteStr += String.fromCharCode(bytes[i]); + + var base64Image = window.btoa(byteStr); + var str = 'data:image/png;base64,' + base64Image; + var img = new Image(); + img.src = str; + + return img; + }; + + /** + * Converts an Blob to an Image - returns an HTMLImageElement + * + * @param image data as a Blob + * + * @return HTMLImageElement + * + */ + ParserUtils.blobToImage = function (data) { + var URLObj = window['URL'] || window['webkitURL']; + var src = URLObj.createObjectURL(data); + var img = new Image(); + img.src = src; + + return img; + }; + + /** + * Returns a object as ByteArray, if possible. + * + * @param data The object to return as ByteArray + * + * @return The ByteArray or null + * + */ + ParserUtils.toByteArray = function (data) { + var b = new ByteArray(); + b.setArrayBuffer(data); + return b; + }; + + /** + * Returns a object as String, if possible. + * + * @param data The object to return as String + * @param length The length of the returned String + * + * @return The String or null + * + */ + ParserUtils.toString = function (data, length) { + if (typeof length === "undefined") { length = 0; } + if (typeof data === 'string') { + var s = data; + + if (s['substr'] != null) + return s.substr(0, s.length); + } + + if (data instanceof ByteArray) { + var ba = data; + ba.position = 0; + return ba.readUTFBytes(Math.min(ba.getBytesAvailable(), length)); + } + + return null; + /* + var ba:ByteArray; + + length ||= uint.MAX_VALUE; + + if (data is String) + return String(data).substr(0, length); + + ba = toByteArray(data); + if (ba) { + ba.position = 0; + return ba.readUTFBytes(Math.min(ba.bytesAvailable, length)); + } + + return null; + + */ + }; + return ParserUtils; +})(); + +module.exports = ParserUtils; + + +},{"awayjs-core/lib/utils/ByteArray":undefined}],"awayjs-core/lib/parsers/ResourceDependency":[function(require,module,exports){ +/** +* ResourceDependency represents the data required to load, parse and resolve additional files ("dependencies") +* required by a parser, used by ResourceLoadSession. +* +*/ +var ResourceDependency = (function () { + function ResourceDependency(id, request, data, parser, parentParser, retrieveAsRawData, suppressAssetEvents) { + if (typeof retrieveAsRawData === "undefined") { retrieveAsRawData = false; } + if (typeof suppressAssetEvents === "undefined") { suppressAssetEvents = false; } + this._id = id; + this._request = request; + this._data = data; + this._parser = parser; + this._parentParser = parentParser; + this._retrieveAsRawData = retrieveAsRawData; + this._suppressAssetEvents = suppressAssetEvents; + + this._assets = new Array(); + this._dependencies = new Array(); + } + Object.defineProperty(ResourceDependency.prototype, "id", { + /** + * + */ + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "request", { + /** + * + */ + get: function () { + return this._request; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "data", { + /** + * The data containing the dependency to be parsed, if the resource was already loaded. + */ + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "parser", { + /** + * + */ + get: function () { + return this._parser; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "parentParser", { + /** + * The parser which is dependent on this ResourceDependency object. + */ + get: function () { + return this._parentParser; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "retrieveAsRawData", { + /** + * + */ + get: function () { + return this._retrieveAsRawData; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "suppresAssetEvents", { + /** + * + */ + get: function () { + return this._suppressAssetEvents; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "assets", { + /** + * + */ + get: function () { + return this._assets; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "dependencies", { + /** + * + */ + get: function () { + return this._dependencies; + }, + enumerable: true, + configurable: true + }); + + /** + * @private + * Method to set data after having already created the dependency object, e.g. after load. + */ + ResourceDependency.prototype._iSetData = function (data) { + this._data = data; + }; + + /** + * @private + * + */ + ResourceDependency.prototype._iSetParser = function (parser) { + this._parser = parser; + }; + + /** + * Resolve the dependency when it's loaded with the parent parser. For example, a dependency containing an + * ImageResource would be assigned to a Mesh instance as a BitmapMaterial, a scene graph object would be added + * to its intended parent. The dependency should be a member of the dependencies property. + */ + ResourceDependency.prototype.resolve = function () { + if (this._parentParser) + this._parentParser._iResolveDependency(this); + }; + + /** + * Resolve a dependency failure. For example, map loading failure from a 3d file + */ + ResourceDependency.prototype.resolveFailure = function () { + if (this._parentParser) + this._parentParser._iResolveDependencyFailure(this); + }; + + /** + * Resolve the dependencies name + */ + ResourceDependency.prototype.resolveName = function (asset) { + if (this._parentParser) + return this._parentParser._iResolveDependencyName(this, asset); + + return asset.name; + }; + return ResourceDependency; +})(); + +module.exports = ResourceDependency; + + +},{}],"awayjs-core/lib/parsers/Texture2DParser":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var Billboard = require("awayjs-core/lib/entities/Billboard"); +var CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); +var ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +var ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +var ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); + +var ByteArray = require("awayjs-core/lib/utils/ByteArray"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +/** +* Texture2DParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into +* a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without +* exception cases. +*/ +var Texture2DParser = (function (_super) { + __extends(Texture2DParser, _super); + /** + * Creates a new Texture2DParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + function Texture2DParser() { + _super.call(this, URLLoaderDataFormat.BLOB); + } + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + Texture2DParser.supportsType = function (extension) { + extension = extension.toLowerCase(); + return extension == "jpg" || extension == "jpeg" || extension == "png" || extension == "gif"; + }; + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + Texture2DParser.supportsData = function (data) { + if (data instanceof HTMLImageElement) + return true; + + if (!(data instanceof ByteArray)) + return false; + + var ba = data; + ba.position = 0; + + if (ba.readUnsignedShort() == 0xffd8) + return true; + + ba.position = 0; + if (ba.readShort() == 0x424D) + return true; + + ba.position = 1; + if (ba.readUTFBytes(3) == 'PNG') + return true; + + ba.position = 0; + if (ba.readUTFBytes(3) == 'GIF' && ba.readShort() == 0x3839 && ba.readByte() == 0x61) + return true; + + ba.position = 0; + if (ba.readUTFBytes(3) == 'ATF') + return true; + + return false; + }; + + /** + * @inheritDoc + */ + Texture2DParser.prototype._pProceedParsing = function () { + var _this = this; + var asset; + var sizeError = false; + + if (this._loadingImage) { + return ParserBase.MORE_TO_PARSE; + } else if (this._htmlImageElement) { + if (TextureUtils.isHTMLImageElementValid(this._htmlImageElement)) { + asset = new ImageTexture(this._htmlImageElement); + this._pFinalizeAsset(asset, this._iFileName); + } + } else if (this.data instanceof HTMLImageElement) { + if (TextureUtils.isHTMLImageElementValid(this.data)) { + asset = new ImageTexture(this.data); + this._pFinalizeAsset(asset, this._iFileName); + } else { + sizeError = true; + } + } else if (this.data instanceof ByteArray) { + var ba = this.data; + ba.position = 0; + var htmlImageElement = ParserUtils.byteArrayToImage(this.data); + + if (TextureUtils.isHTMLImageElementValid(htmlImageElement)) { + asset = new ImageTexture(htmlImageElement); + this._pFinalizeAsset(asset, this._iFileName); + } else { + sizeError = true; + } + } else if (this.data instanceof ArrayBuffer) { + this._htmlImageElement = ParserUtils.arrayBufferToImage(this.data); + + asset = new ImageTexture(this._htmlImageElement); + this._pFinalizeAsset(asset, this._iFileName); + } else if (this.data instanceof Blob) { + this._htmlImageElement = ParserUtils.blobToImage(this.data); + + this._htmlImageElement.onload = function (event) { + return _this.onLoadComplete(event); + }; + this._loadingImage = true; + + return ParserBase.MORE_TO_PARSE; + } + + if (sizeError == true) { + // asset = new BitmapTexture(DefaultMaterialManager.createCheckeredBitmapData(), false); + // this._pFinalizeAsset( asset, this._iFileName); + // this.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.TEXTURE_SIZE_ERROR, asset)); + } + + this._pContent = new Billboard(new CSSMaterialBase(asset)); + + return ParserBase.PARSING_DONE; + }; + + Texture2DParser.prototype.onLoadComplete = function (event) { + this._loadingImage = false; + }; + return Texture2DParser; +})(ParserBase); + +module.exports = Texture2DParser; + + +},{"awayjs-core/lib/core/net/URLLoaderDataFormat":undefined,"awayjs-core/lib/entities/Billboard":undefined,"awayjs-core/lib/materials/CSSMaterialBase":undefined,"awayjs-core/lib/parsers/ParserBase":undefined,"awayjs-core/lib/parsers/ParserUtils":undefined,"awayjs-core/lib/textures/ImageTexture":undefined,"awayjs-core/lib/utils/ByteArray":undefined,"awayjs-core/lib/utils/TextureUtils":undefined}],"awayjs-core/lib/prefabs/PrefabBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +/** +* PrefabBase is an abstract base class for prefabs, which are prebuilt display objects that allow easy cloning and updating +*/ +var PrefabBase = (function (_super) { + __extends(PrefabBase, _super); + // public _pBatchObjects:Array = new Array(); + /** + * Creates a new PrefabBase object. + */ + function PrefabBase() { + _super.call(this); + this._pObjects = new Array(); + } + /** + * Returns a display object generated from this prefab + */ + PrefabBase.prototype.getNewObject = function () { + var object = this._pCreateObject(); + + this._pObjects.push(object); + + return object; + }; + + // public getNewBatchObject():BatchObject + // { + // var object:BatchObject = this._pCreateBatchObject(); + // + // this._pBatchObjects.push(object); + // + // return object; + // } + PrefabBase.prototype._pCreateObject = function () { + throw new AbstractMethodError(); + }; + + PrefabBase.prototype._iValidate = function () { + // To be overridden when necessary + }; + return PrefabBase; +})(NamedAssetBase); + +module.exports = PrefabBase; + + +},{"awayjs-core/lib/core/library/NamedAssetBase":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined}],"awayjs-core/lib/prefabs/PrimitiveCapsulePrefab":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A Capsule primitive mesh. +*/ +var PrimitiveCapsulePrefab = (function (_super) { + __extends(PrimitiveCapsulePrefab, _super); + /** + * Creates a new Capsule object. + * @param radius The radius of the capsule. + * @param height The height of the capsule. + * @param segmentsW Defines the number of horizontal segments that make up the capsule. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven value. + * @param yUp Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveCapsulePrefab(radius, height, segmentsW, segmentsH, yUp) { + if (typeof radius === "undefined") { radius = 50; } + if (typeof height === "undefined") { height = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 16; } + if (typeof segmentsH === "undefined") { segmentsH = 15; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this); + this._numVertices = 0; + + this._radius = radius; + this._height = height; + this._segmentsW = segmentsW; + this._segmentsH = (segmentsH % 2 == 0) ? segmentsH + 1 : segmentsH; + this._yUp = yUp; + } + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "radius", { + /** + * The radius of the capsule. + */ + get: function () { + return this._radius; + }, + set: function (value) { + this._radius = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "height", { + /** + * The height of the capsule. + */ + get: function () { + return this._height; + }, + set: function (value) { + this._height = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "segmentsW", { + /** + * Defines the number of horizontal segments that make up the capsule. Defaults to 16. + */ + get: function () { + return this._segmentsW; + }, + set: function (value) { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "segmentsH", { + /** + * Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven. + */ + get: function () { + return this._segmentsH; + }, + set: function (value) { + this._segmentsH = (value % 2 == 0) ? value + 1 : value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "yUp", { + /** + * Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveCapsulePrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var i; + var j; + var triIndex = 0; + var index = 0; + var startIndex; + var comp1, comp2, t1, t2; + var numIndices = 0; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // evaluate target number of vertices, triangles and indices + this._numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of closure + numIndices = (this._segmentsH - 1) * this._segmentsW * 6; // each level has segmentH quads, each of 2 triangles + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(this._numVertices * 3); + normals = new Array(this._numVertices * 3); + tangents = new Array(this._numVertices * 3); + + this._pInvalidateUVs(); + } + + for (j = 0; j <= this._segmentsH; ++j) { + var horangle = Math.PI * j / this._segmentsH; + var z = -this._radius * Math.cos(horangle); + var ringradius = this._radius * Math.sin(horangle); + + startIndex = index; + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle = 2 * Math.PI * i / this._segmentsW; + var x = ringradius * Math.cos(verangle); + var offset = j > this._segmentsH / 2 ? this._height / 2 : -this._height / 2; + var y = ringradius * Math.sin(verangle); + var normLen = 1 / Math.sqrt(x * x + y * y + z * z); + var tanLen = Math.sqrt(y * y + x * x); + + if (this._yUp) { + t1 = 0; + t2 = tanLen > .007 ? x / tanLen : 0; + comp1 = -z; + comp2 = y; + } else { + t1 = tanLen > .007 ? x / tanLen : 0; + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsW) { + positions[index] = positions[startIndex]; + positions[index + 1] = positions[startIndex + 1]; + positions[index + 2] = positions[startIndex + 2]; + normals[index] = (normals[startIndex] + (x * normLen)) * .5; + normals[index + 1] = (normals[startIndex + 1] + (comp1 * normLen)) * .5; + normals[index + 2] = (normals[startIndex + 2] + (comp2 * normLen)) * .5; + tangents[index] = (tangents[startIndex] + (tanLen > .007 ? -y / tanLen : 1)) * .5; + tangents[index + 1] = (tangents[startIndex + 1] + t1) * .5; + tangents[index + 2] = (tangents[startIndex + 2] + t2) * .5; + } else { + // vertex + positions[index] = x; + positions[index + 1] = (this._yUp) ? comp1 - offset : comp1; + positions[index + 2] = (this._yUp) ? comp2 : comp2 + offset; + + // normal + normals[index] = x * normLen; + normals[index + 1] = comp1 * normLen; + normals[index + 2] = comp2 * normLen; + + // tangent + tangents[index] = tanLen > .007 ? -y / tanLen : 1; + tangents[index + 1] = t1; + tangents[index + 2] = t2; + } + + if (i > 0 && j > 0) { + var a = (this._segmentsW + 1) * j + i; + var b = (this._segmentsW + 1) * j + i - 1; + var c = (this._segmentsW + 1) * (j - 1) + i - 1; + var d = (this._segmentsW + 1) * (j - 1) + i; + + if (j == this._segmentsH) { + positions[index] = positions[startIndex]; + positions[index + 1] = positions[startIndex + 1]; + positions[index + 2] = positions[startIndex + 2]; + + indices[triIndex++] = a; + indices[triIndex++] = c; + indices[triIndex++] = d; + } else if (j == 1) { + indices[triIndex++] = a; + indices[triIndex++] = b; + indices[triIndex++] = c; + } else { + indices[triIndex++] = a; + indices[triIndex++] = b; + indices[triIndex++] = c; + indices[triIndex++] = a; + indices[triIndex++] = c; + indices[triIndex++] = d; + } + } + + index += 3; + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + //TODO + } + }; + + /** + * @inheritDoc + */ + PrimitiveCapsulePrefab.prototype._pBuildUVs = function (target, geometryType) { + var i, j; + var uvs; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices * 2); + } + + // current uv component index + var index = 0; + + for (j = 0; j <= this._segmentsH; ++j) { + for (i = 0; i <= this._segmentsW; ++i) { + // revolution vertex + uvs[index++] = (i / this._segmentsW) * triangleGeometry.scaleU; + uvs[index++] = (j / this._segmentsH) * triangleGeometry.scaleV; + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveCapsulePrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveCapsulePrefab; + + +},{"awayjs-core/lib/prefabs/PrimitivePrefabBase":undefined}],"awayjs-core/lib/prefabs/PrimitiveConePrefab":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitiveCylinderPrefab = require("awayjs-core/lib/prefabs/PrimitiveCylinderPrefab"); + +/** +* A UV Cone primitive mesh. +*/ +var PrimitiveConePrefab = (function (_super) { + __extends(PrimitiveConePrefab, _super); + /** + * Creates a new Cone object. + * @param radius The radius of the bottom end of the cone + * @param height The height of the cone + * @param segmentsW Defines the number of horizontal segments that make up the cone. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the cone. Defaults to 1. + * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveConePrefab(radius, height, segmentsW, segmentsH, closed, yUp) { + if (typeof radius === "undefined") { radius = 50; } + if (typeof height === "undefined") { height = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 16; } + if (typeof segmentsH === "undefined") { segmentsH = 1; } + if (typeof closed === "undefined") { closed = true; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this, 0, radius, height, segmentsW, segmentsH, false, closed, true, yUp); + } + Object.defineProperty(PrimitiveConePrefab.prototype, "radius", { + /** + * The radius of the bottom end of the cone. + */ + get: function () { + return this._pBottomRadius; + }, + set: function (value) { + this._pBottomRadius = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + return PrimitiveConePrefab; +})(PrimitiveCylinderPrefab); + +module.exports = PrimitiveConePrefab; + + +},{"awayjs-core/lib/prefabs/PrimitiveCylinderPrefab":undefined}],"awayjs-core/lib/prefabs/PrimitiveCubePrefab":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A Cube primitive prefab. +*/ +var PrimitiveCubePrefab = (function (_super) { + __extends(PrimitiveCubePrefab, _super); + /** + * Creates a new Cube object. + * @param width The size of the cube along its X-axis. + * @param height The size of the cube along its Y-axis. + * @param depth The size of the cube along its Z-axis. + * @param segmentsW The number of segments that make up the cube along the X-axis. + * @param segmentsH The number of segments that make up the cube along the Y-axis. + * @param segmentsD The number of segments that make up the cube along the Z-axis. + * @param tile6 The type of uv mapping to use. When true, a texture will be subdivided in a 2x3 grid, each used for a single face. When false, the entire image is mapped on each face. + */ + function PrimitiveCubePrefab(width, height, depth, segmentsW, segmentsH, segmentsD, tile6) { + if (typeof width === "undefined") { width = 100; } + if (typeof height === "undefined") { height = 100; } + if (typeof depth === "undefined") { depth = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 1; } + if (typeof segmentsH === "undefined") { segmentsH = 1; } + if (typeof segmentsD === "undefined") { segmentsD = 1; } + if (typeof tile6 === "undefined") { tile6 = true; } + _super.call(this); + + this._width = width; + this._height = height; + this._depth = depth; + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._segmentsD = segmentsD; + this._tile6 = tile6; + } + Object.defineProperty(PrimitiveCubePrefab.prototype, "width", { + /** + * The size of the cube along its X-axis. + */ + get: function () { + return this._width; + }, + set: function (value) { + this._width = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "height", { + /** + * The size of the cube along its Y-axis. + */ + get: function () { + return this._height; + }, + set: function (value) { + this._height = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "depth", { + /** + * The size of the cube along its Z-axis. + */ + get: function () { + return this._depth; + }, + set: function (value) { + this._depth = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "tile6", { + /** + * The type of uv mapping to use. When false, the entire image is mapped on each face. + * When true, a texture will be subdivided in a 3x2 grid, each used for a single face. + * Reading the tiles from left to right, top to bottom they represent the faces of the + * cube in the following order: bottom, top, back, left, front, right. This creates + * several shared edges (between the top, front, left and right faces) which simplifies + * texture painting. + */ + get: function () { + return this._tile6; + }, + set: function (value) { + this._tile6 = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsW", { + /** + * The number of segments that make up the cube along the X-axis. Defaults to 1. + */ + get: function () { + return this._segmentsW; + }, + set: function (value) { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsH", { + /** + * The number of segments that make up the cube along the Y-axis. Defaults to 1. + */ + get: function () { + return this._segmentsH; + }, + set: function (value) { + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsD", { + /** + * The number of segments that make up the cube along the Z-axis. Defaults to 1. + */ + get: function () { + return this._segmentsD; + }, + set: function (value) { + this._segmentsD = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveCubePrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var tl, tr, bl, br; + var i, j, inc = 0; + + var vidx, fidx; + var hw, hh, hd; + var dw, dh, dd; + + var outer_pos; + var numIndices; + var numVertices; + + // half cube dimensions + hw = this._width / 2; + hh = this._height / 2; + hd = this._depth / 2; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + numVertices = ((this._segmentsW + 1) * (this._segmentsH + 1) + (this._segmentsW + 1) * (this._segmentsD + 1) + (this._segmentsH + 1) * (this._segmentsD + 1)) * 2; + + numIndices = ((this._segmentsW * this._segmentsH + this._segmentsW * this._segmentsD + this._segmentsH * this._segmentsD) * 12); + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(numVertices * 3); + normals = new Array(numVertices * 3); + tangents = new Array(numVertices * 3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + // Segment dimensions + dw = this._width / this._segmentsW; + dh = this._height / this._segmentsH; + dd = this._depth / this._segmentsD; + + for (i = 0; i <= this._segmentsW; i++) { + outer_pos = -hw + i * dw; + + for (j = 0; j <= this._segmentsH; j++) { + // front + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh + j * dh; + positions[vidx + 2] = -hd; + normals[vidx] = 0; + normals[vidx + 1] = 0; + normals[vidx + 2] = -1; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // back + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh + j * dh; + positions[vidx + 2] = hd; + normals[vidx] = 0; + normals[vidx + 1] = 0; + normals[vidx + 2] = 1; + tangents[vidx] = -1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i && j) { + tl = 2 * ((i - 1) * (this._segmentsH + 1) + (j - 1)); + tr = 2 * (i * (this._segmentsH + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + inc += 2 * (this._segmentsW + 1) * (this._segmentsH + 1); + + for (i = 0; i <= this._segmentsW; i++) { + outer_pos = -hw + i * dw; + + for (j = 0; j <= this._segmentsD; j++) { + // top + positions[vidx] = outer_pos; + positions[vidx + 1] = hh; + positions[vidx + 2] = -hd + j * dd; + normals[vidx] = 0; + normals[vidx + 1] = 1; + normals[vidx + 2] = 0; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // bottom + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh; + positions[vidx + 2] = -hd + j * dd; + normals[vidx] = 0; + normals[vidx + 1] = -1; + normals[vidx + 2] = 0; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i && j) { + tl = inc + 2 * ((i - 1) * (this._segmentsD + 1) + (j - 1)); + tr = inc + 2 * (i * (this._segmentsD + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + inc += 2 * (this._segmentsW + 1) * (this._segmentsD + 1); + + for (i = 0; i <= this._segmentsD; i++) { + outer_pos = hd - i * dd; + + for (j = 0; j <= this._segmentsH; j++) { + // left + positions[vidx] = -hw; + positions[vidx + 1] = -hh + j * dh; + positions[vidx + 2] = outer_pos; + normals[vidx] = -1; + normals[vidx + 1] = 0; + normals[vidx + 2] = 0; + tangents[vidx] = 0; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = -1; + vidx += 3; + + // right + positions[vidx] = hw; + positions[vidx + 1] = -hh + j * dh; + positions[vidx + 2] = outer_pos; + normals[vidx] = 1; + normals[vidx + 1] = 0; + normals[vidx + 2] = 0; + tangents[vidx] = 0; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 1; + vidx += 3; + + if (i && j) { + tl = inc + 2 * ((i - 1) * (this._segmentsH + 1) + (j - 1)); + tr = inc + 2 * (i * (this._segmentsH + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + var lineGeometry = target; + + var numSegments = this._segmentsH * 4 + this._segmentsW * 4 + this._segmentsD * 4; + var startPositions; + var endPositions; + var thickness; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments * 3); + endPositions = new Array(numSegments * 3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + for (i = 0; i < this._segmentsH; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = i * this._height / this._segmentsH - hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = i * this._height / this._segmentsH - hh; + endPositions[vidx + 2] = -hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = hh - i * this._height / this._segmentsH; + startPositions[vidx + 2] = hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh - i * this._height / this._segmentsH; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsW; ++i) { + startPositions[vidx] = i * this._width / this._segmentsW - hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = i * this._width / this._segmentsW - hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = -hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = hw - i * this._width / this._segmentsW; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd; + + endPositions[vidx] = hw - i * this._width / this._segmentsW; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsH; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = i * this._height / this._segmentsH - hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = -hw; + endPositions[vidx + 1] = i * this._height / this._segmentsH - hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = hw; + startPositions[vidx + 1] = hh - i * this._height / this._segmentsH; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh - i * this._height / this._segmentsH; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsD; ++i) { + startPositions[vidx] = hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; + + endPositions[vidx] = -hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsD; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = -hh; + endPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = hh; + startPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsW; ++i) { + startPositions[vidx] = hw - i * this._width / this._segmentsW; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw - i * this._width / this._segmentsW; + endPositions[vidx + 1] = -hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = i * this._width / this._segmentsW - hw; + startPositions[vidx + 1] = hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = i * this._width / this._segmentsW - hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + }; + + /** + * @inheritDoc + */ + PrimitiveCubePrefab.prototype._pBuildUVs = function (target, geometryType) { + var i, j, index; + var uvs; + + var u_tile_dim, v_tile_dim; + var u_tile_step, v_tile_step; + var tl0u, tl0v; + var tl1u, tl1v; + var du, dv; + var numVertices; + + if (geometryType == "triangleSubGeometry") { + numVertices = ((this._segmentsW + 1) * (this._segmentsH + 1) + (this._segmentsW + 1) * (this._segmentsD + 1) + (this._segmentsH + 1) * (this._segmentsD + 1)) * 2; + + var triangleGeometry = target; + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices * 2); + } + + if (this._tile6) { + u_tile_dim = u_tile_step = 1 / 3; + v_tile_dim = v_tile_step = 1 / 2; + } else { + u_tile_dim = v_tile_dim = 1; + u_tile_step = v_tile_step = 0; + } + + // Create planes two and two, the same way that they were + // constructed in the buildGeometry() function. First calculate + // the top-left UV coordinate for both planes, and then loop + // over the points, calculating the UVs from these numbers. + // When tile6 is true, the layout is as follows: + // .-----.-----.-----. (1,1) + // | Bot | T | Bak | + // |-----+-----+-----| + // | L | F | R | + // (0,0)'-----'-----'-----' + index = 0; + + // FRONT / BACK + tl0u = 1 * u_tile_step; + tl0v = 1 * v_tile_step; + tl1u = 2 * u_tile_step; + tl1v = 0 * v_tile_step; + du = u_tile_dim / this._segmentsW; + dv = v_tile_dim / this._segmentsH; + for (i = 0; i <= this._segmentsW; i++) { + for (j = 0; j <= this._segmentsH; j++) { + uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; + uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + + uvs[index++] = (tl1u + (u_tile_dim - i * du)) * triangleGeometry.scaleU; + uvs[index++] = (tl1v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + } + } + + // TOP / BOTTOM + tl0u = 1 * u_tile_step; + tl0v = 0 * v_tile_step; + tl1u = 0 * u_tile_step; + tl1v = 0 * v_tile_step; + du = u_tile_dim / this._segmentsW; + dv = v_tile_dim / this._segmentsD; + for (i = 0; i <= this._segmentsW; i++) { + for (j = 0; j <= this._segmentsD; j++) { + uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; + uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + + uvs[index++] = (tl1u + i * du) * triangleGeometry.scaleU; + uvs[index++] = (tl1v + j * dv) * triangleGeometry.scaleV; + } + } + + // LEFT / RIGHT + tl0u = 0 * u_tile_step; + tl0v = 1 * v_tile_step; + tl1u = 2 * u_tile_step; + tl1v = 1 * v_tile_step; + du = u_tile_dim / this._segmentsD; + dv = v_tile_dim / this._segmentsH; + for (i = 0; i <= this._segmentsD; i++) { + for (j = 0; j <= this._segmentsH; j++) { + uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; + uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + + uvs[index++] = (tl1u + (u_tile_dim - i * du)) * triangleGeometry.scaleU; + uvs[index++] = (tl1v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + } + } + + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveCubePrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveCubePrefab; + + +},{"awayjs-core/lib/prefabs/PrimitivePrefabBase":undefined}],"awayjs-core/lib/prefabs/PrimitiveCylinderPrefab":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A Cylinder primitive mesh. +*/ +var PrimitiveCylinderPrefab = (function (_super) { + __extends(PrimitiveCylinderPrefab, _super); + /** + * Creates a new Cylinder object. + * @param topRadius The radius of the top end of the cylinder. + * @param bottomRadius The radius of the bottom end of the cylinder + * @param height The radius of the bottom end of the cylinder + * @param segmentsW Defines the number of horizontal segments that make up the cylinder. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the cylinder. Defaults to 1. + * @param topClosed Defines whether the top end of the cylinder is closed (true) or open. + * @param bottomClosed Defines whether the bottom end of the cylinder is closed (true) or open. + * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveCylinderPrefab(topRadius, bottomRadius, height, segmentsW, segmentsH, topClosed, bottomClosed, surfaceClosed, yUp) { + if (typeof topRadius === "undefined") { topRadius = 50; } + if (typeof bottomRadius === "undefined") { bottomRadius = 50; } + if (typeof height === "undefined") { height = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 16; } + if (typeof segmentsH === "undefined") { segmentsH = 1; } + if (typeof topClosed === "undefined") { topClosed = true; } + if (typeof bottomClosed === "undefined") { bottomClosed = true; } + if (typeof surfaceClosed === "undefined") { surfaceClosed = true; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this); + this._numVertices = 0; + + this._topRadius = topRadius; + this._pBottomRadius = bottomRadius; + this._height = height; + this._pSegmentsW = segmentsW; + this._pSegmentsH = segmentsH; + this._topClosed = topClosed; + this._bottomClosed = bottomClosed; + this._surfaceClosed = surfaceClosed; + this._yUp = yUp; + } + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "topRadius", { + /** + * The radius of the top end of the cylinder. + */ + get: function () { + return this._topRadius; + }, + set: function (value) { + this._topRadius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "bottomRadius", { + /** + * The radius of the bottom end of the cylinder. + */ + get: function () { + return this._pBottomRadius; + }, + set: function (value) { + this._pBottomRadius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "height", { + /** + * The radius of the top end of the cylinder. + */ + get: function () { + return this._height; + }, + set: function (value) { + this._height = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "segmentsW", { + /** + * Defines the number of horizontal segments that make up the cylinder. Defaults to 16. + */ + get: function () { + return this._pSegmentsW; + }, + set: function (value) { + this.setSegmentsW(value); + }, + enumerable: true, + configurable: true + }); + + + PrimitiveCylinderPrefab.prototype.setSegmentsW = function (value) { + this._pSegmentsW = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }; + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "segmentsH", { + /** + * Defines the number of vertical segments that make up the cylinder. Defaults to 1. + */ + get: function () { + return this._pSegmentsH; + }, + set: function (value) { + this.setSegmentsH(value); + }, + enumerable: true, + configurable: true + }); + + + PrimitiveCylinderPrefab.prototype.setSegmentsH = function (value) { + this._pSegmentsH = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }; + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "topClosed", { + /** + * Defines whether the top end of the cylinder is closed (true) or open. + */ + get: function () { + return this._topClosed; + }, + set: function (value) { + this._topClosed = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "bottomClosed", { + /** + * Defines whether the bottom end of the cylinder is closed (true) or open. + */ + get: function () { + return this._bottomClosed; + }, + set: function (value) { + this._bottomClosed = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "yUp", { + /** + * Defines whether the cylinder poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveCylinderPrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var i; + var j; + var x; + var y; + var z; + var vidx; + var fidx; + + var radius; + var revolutionAngle; + + var dr; + var latNormElev; + var latNormBase; + var numIndices = 0; + + var comp1; + var comp2; + var startIndex = 0; + var nextVertexIndex = 0; + + var t1; + var t2; + + // reset utility variables + this._numVertices = 0; + + // evaluate revolution steps + var revolutionAngleDelta = 2 * Math.PI / this._pSegmentsW; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // evaluate target number of vertices, triangles and indices + if (this._surfaceClosed) { + this._numVertices += (this._pSegmentsH + 1) * (this._pSegmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of UV unwrapping + numIndices += this._pSegmentsH * this._pSegmentsW * 6; // each level has segmentW quads, each of 2 triangles + } + if (this._topClosed) { + this._numVertices += 2 * (this._pSegmentsW + 1); // segmentsW + 1 because of unwrapping + numIndices += this._pSegmentsW * 3; // one triangle for each segment + } + if (this._bottomClosed) { + this._numVertices += 2 * (this._pSegmentsW + 1); + numIndices += this._pSegmentsW * 3; + } + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(this._numVertices * 3); + normals = new Array(this._numVertices * 3); + tangents = new Array(this._numVertices * 3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + // top + if (this._topClosed && this._topRadius > 0) { + z = -0.5 * this._height; + + for (i = 0; i <= this._pSegmentsW; ++i) { + // central vertex + if (this._yUp) { + t1 = 1; + t2 = 0; + comp1 = -z; + comp2 = 0; + } else { + t1 = 0; + t2 = -1; + comp1 = 0; + comp2 = z; + } + + positions[vidx] = 0; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // revolution vertex + revolutionAngle = i * revolutionAngleDelta; + x = this._topRadius * Math.cos(revolutionAngle); + y = this._topRadius * Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex + 3]; + positions[vidx + 1] = positions[startIndex + 4]; + positions[vidx + 2] = positions[startIndex + 5]; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i > 0) { + // add triangle + indices[fidx++] = nextVertexIndex; + indices[fidx++] = nextVertexIndex + 1; + indices[fidx++] = nextVertexIndex + 2; + + nextVertexIndex += 2; + } + } + + nextVertexIndex += 2; + } + + // bottom + if (this._bottomClosed && this._pBottomRadius > 0) { + z = 0.5 * this._height; + + startIndex = nextVertexIndex * 3; + + for (i = 0; i <= this._pSegmentsW; ++i) { + if (this._yUp) { + t1 = -1; + t2 = 0; + comp1 = -z; + comp2 = 0; + } else { + t1 = 0; + t2 = 1; + comp1 = 0; + comp2 = z; + } + + positions[vidx] = 0; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // revolution vertex + revolutionAngle = i * revolutionAngleDelta; + x = this._pBottomRadius * Math.cos(revolutionAngle); + y = this._pBottomRadius * Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex + 3]; + positions[vidx + 1] = positions[startIndex + 4]; + positions[vidx + 2] = positions[startIndex + 5]; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i > 0) { + // add triangle + indices[fidx++] = nextVertexIndex; + indices[fidx++] = nextVertexIndex + 2; + indices[fidx++] = nextVertexIndex + 1; + + nextVertexIndex += 2; + } + } + + nextVertexIndex += 2; + } + + // The normals on the lateral surface all have the same incline, i.e. + // the "elevation" component (Y or Z depending on yUp) is constant. + // Same principle goes for the "base" of these vectors, which will be + // calculated such that a vector [base,elev] will be a unit vector. + dr = (this._pBottomRadius - this._topRadius); + latNormElev = dr / this._height; + latNormBase = (latNormElev == 0) ? 1 : this._height / dr; + + // lateral surface + if (this._surfaceClosed) { + var a; + var b; + var c; + var d; + var na0, na1, naComp1, naComp2; + + for (j = 0; j <= this._pSegmentsH; ++j) { + radius = this._topRadius - ((j / this._pSegmentsH) * (this._topRadius - this._pBottomRadius)); + z = -(this._height / 2) + (j / this._pSegmentsH * this._height); + + startIndex = nextVertexIndex * 3; + + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + revolutionAngle = i * revolutionAngleDelta; + x = radius * Math.cos(revolutionAngle); + y = radius * Math.sin(revolutionAngle); + na0 = latNormBase * Math.cos(revolutionAngle); + na1 = latNormBase * Math.sin(revolutionAngle); + + if (this._yUp) { + t1 = 0; + t2 = -na0; + comp1 = -z; + comp2 = y; + naComp1 = latNormElev; + naComp2 = na1; + } else { + t1 = -na0; + t2 = 0; + comp1 = y; + comp2 = z; + naComp1 = na1; + naComp2 = latNormElev; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex]; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + normals[vidx] = na0; + normals[vidx + 1] = latNormElev; + normals[vidx + 2] = na1; + tangents[vidx] = na1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = na0; + normals[vidx + 1] = naComp1; + normals[vidx + 2] = naComp2; + tangents[vidx] = -na1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } + vidx += 3; + + // close triangle + if (i > 0 && j > 0) { + a = nextVertexIndex; // current + b = nextVertexIndex - 1; // previous + c = b - this._pSegmentsW - 1; // previous of last level + d = a - this._pSegmentsW - 1; // current of last level + + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + + nextVertexIndex++; + } + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + var lineGeometry = target; + + var numSegments = (this._pSegmentsH + 1) * (this._pSegmentsW) + this._pSegmentsW; + var startPositions; + var endPositions; + var thickness; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments * 3); + endPositions = new Array(numSegments * 3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + for (j = 0; j <= this._pSegmentsH; ++j) { + radius = this._topRadius - ((j / this._pSegmentsH) * (this._topRadius - this._pBottomRadius)); + z = this._height * (j / this._pSegmentsH - 0.5); + + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + revolutionAngle = i * revolutionAngleDelta; + x = radius * Math.cos(revolutionAngle); + y = radius * Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i > 0) { + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + + //vertical lines + startPositions[vidx] = endPositions[vidx - this._pSegmentsW * 6]; + startPositions[vidx + 1] = endPositions[vidx + 1 - this._pSegmentsW * 6]; + startPositions[vidx + 2] = endPositions[vidx + 2 - this._pSegmentsW * 6]; + + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + if (i < this._pSegmentsW) { + startPositions[vidx] = x; + startPositions[vidx + 1] = comp1; + startPositions[vidx + 2] = comp2; + } + } + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + }; + + /** + * @inheritDoc + */ + PrimitiveCylinderPrefab.prototype._pBuildUVs = function (target, geometryType) { + var i; + var j; + var x; + var y; + var revolutionAngle; + var uvs; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices * 2); + } + + // evaluate revolution steps + var revolutionAngleDelta = 2 * Math.PI / this._pSegmentsW; + + // current uv component index + var index = 0; + + // top + if (this._topClosed) { + for (i = 0; i <= this._pSegmentsW; ++i) { + revolutionAngle = i * revolutionAngleDelta; + x = 0.5 + 0.5 * -Math.cos(revolutionAngle); + y = 0.5 + 0.5 * Math.sin(revolutionAngle); + + uvs[index++] = 0.5 * triangleGeometry.scaleU; // central vertex + uvs[index++] = 0.5 * triangleGeometry.scaleV; + + uvs[index++] = x * triangleGeometry.scaleU; // revolution vertex + uvs[index++] = y * triangleGeometry.scaleV; + } + } + + // bottom + if (this._bottomClosed) { + for (i = 0; i <= this._pSegmentsW; ++i) { + revolutionAngle = i * revolutionAngleDelta; + x = 0.5 + 0.5 * Math.cos(revolutionAngle); + y = 0.5 + 0.5 * Math.sin(revolutionAngle); + + uvs[index++] = 0.5 * triangleGeometry.scaleU; // central vertex + uvs[index++] = 0.5 * triangleGeometry.scaleV; + + uvs[index++] = x * triangleGeometry.scaleU; // revolution vertex + uvs[index++] = y * triangleGeometry.scaleV; + } + } + + // lateral surface + if (this._surfaceClosed) { + for (j = 0; j <= this._pSegmentsH; ++j) { + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + uvs[index++] = (i / this._pSegmentsW) * triangleGeometry.scaleU; + uvs[index++] = (j / this._pSegmentsH) * triangleGeometry.scaleV; + } + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveCylinderPrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveCylinderPrefab; + + +},{"awayjs-core/lib/prefabs/PrimitivePrefabBase":undefined}],"awayjs-core/lib/prefabs/PrimitivePlanePrefab":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A Plane primitive mesh. +*/ +var PrimitivePlanePrefab = (function (_super) { + __extends(PrimitivePlanePrefab, _super); + /** + * Creates a new Plane object. + * @param width The width of the plane. + * @param height The height of the plane. + * @param segmentsW The number of segments that make up the plane along the X-axis. + * @param segmentsH The number of segments that make up the plane along the Y or Z-axis. + * @param yUp Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). + * @param doubleSided Defines whether the plane will be visible from both sides, with correct vertex normals. + */ + function PrimitivePlanePrefab(width, height, segmentsW, segmentsH, yUp, doubleSided) { + if (typeof width === "undefined") { width = 100; } + if (typeof height === "undefined") { height = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 1; } + if (typeof segmentsH === "undefined") { segmentsH = 1; } + if (typeof yUp === "undefined") { yUp = true; } + if (typeof doubleSided === "undefined") { doubleSided = false; } + _super.call(this); + + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._yUp = yUp; + this._width = width; + this._height = height; + this._doubleSided = doubleSided; + } + Object.defineProperty(PrimitivePlanePrefab.prototype, "segmentsW", { + /** + * The number of segments that make up the plane along the X-axis. Defaults to 1. + */ + get: function () { + return this._segmentsW; + }, + set: function (value) { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "segmentsH", { + /** + * The number of segments that make up the plane along the Y or Z-axis, depending on whether yUp is true or + * false, respectively. Defaults to 1. + */ + get: function () { + return this._segmentsH; + }, + set: function (value) { + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "yUp", { + /** + * Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). Defaults to true. + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "doubleSided", { + /** + * Defines whether the plane will be visible from both sides, with correct vertex normals (as opposed to bothSides on Material). Defaults to false. + */ + get: function () { + return this._doubleSided; + }, + set: function (value) { + this._doubleSided = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "width", { + /** + * The width of the plane. + */ + get: function () { + return this._width; + }, + set: function (value) { + this._width = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "height", { + /** + * The height of the plane. + */ + get: function () { + return this._height; + }, + set: function (value) { + this._height = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitivePlanePrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var x, y; + var numIndices; + var base; + var tw = this._segmentsW + 1; + var numVertices; + + var vidx, fidx; + + var xi; + var yi; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + var numVertices = (this._segmentsH + 1) * tw; + var positions; + var normals; + var tangents; + + if (this._doubleSided) + numVertices *= 2; + + numIndices = this._segmentsH * this._segmentsW * 6; + + if (this._doubleSided) + numIndices *= 2; + + if (triangleGeometry.indices != null && numIndices == triangleGeometry.indices.length) { + indices = triangleGeometry.indices; + } else { + indices = new Array(numIndices); + + this._pInvalidateUVs(); + } + + if (numVertices == triangleGeometry.numVertices) { + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + positions = new Array(numVertices * 3); + normals = new Array(numVertices * 3); + tangents = new Array(numVertices * 3); + + this._pInvalidateUVs(); + } + + fidx = 0; + + vidx = 0; + + for (yi = 0; yi <= this._segmentsH; ++yi) { + for (xi = 0; xi <= this._segmentsW; ++xi) { + x = (xi / this._segmentsW - .5) * this._width; + y = (yi / this._segmentsH - .5) * this._height; + + positions[vidx] = x; + if (this._yUp) { + positions[vidx + 1] = 0; + positions[vidx + 2] = y; + } else { + positions[vidx + 1] = y; + positions[vidx + 2] = 0; + } + + normals[vidx] = 0; + + if (this._yUp) { + normals[vidx + 1] = 1; + normals[vidx + 2] = 0; + } else { + normals[vidx + 1] = 0; + normals[vidx + 2] = -1; + } + + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + + vidx += 3; + + // add vertex with same position, but with inverted normal & tangent + if (this._doubleSided) { + for (var i = vidx; i < vidx + 3; ++i) { + positions[i] = positions[i - 3]; + normals[i] = -normals[i - 3]; + tangents[i] = -tangents[i - 3]; + } + + vidx += 3; + } + + if (xi != this._segmentsW && yi != this._segmentsH) { + base = xi + yi * tw; + var mult = this._doubleSided ? 2 : 1; + + indices[fidx++] = base * mult; + indices[fidx++] = (base + tw) * mult; + indices[fidx++] = (base + tw + 1) * mult; + indices[fidx++] = base * mult; + indices[fidx++] = (base + tw + 1) * mult; + indices[fidx++] = (base + 1) * mult; + + if (this._doubleSided) { + indices[fidx++] = (base + tw + 1) * mult + 1; + indices[fidx++] = (base + tw) * mult + 1; + indices[fidx++] = base * mult + 1; + indices[fidx++] = (base + 1) * mult + 1; + indices[fidx++] = (base + tw + 1) * mult + 1; + indices[fidx++] = base * mult + 1; + } + } + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + var lineGeometry = target; + + var numSegments = (this._segmentsH + 1) + tw; + var startPositions; + var endPositions; + var thickness; + + var hw = this._width / 2; + var hh = this._height / 2; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments * 3); + endPositions = new Array(numSegments * 3); + thickness = new Array(numSegments); + } + + fidx = 0; + + vidx = 0; + + for (yi = 0; yi <= this._segmentsH; ++yi) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = 0; + startPositions[vidx + 2] = yi * this._height - hh; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = 0; + endPositions[vidx + 2] = yi * this._height - hh; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (xi = 0; xi <= this._segmentsW; ++xi) { + startPositions[vidx] = xi * this._width - hw; + startPositions[vidx + 1] = 0; + startPositions[vidx + 2] = -hh; + + endPositions[vidx] = xi * this._width - hw; + endPositions[vidx + 1] = 0; + endPositions[vidx + 2] = hh; + + thickness[fidx++] = 1; + + vidx += 3; + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + }; + + /** + * @inheritDoc + */ + PrimitivePlanePrefab.prototype._pBuildUVs = function (target, geometryType) { + var uvs; + var numVertices; + + if (geometryType == "triangleSubGeometry") { + numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); + + if (this._doubleSided) + numVertices *= 2; + + var triangleGeometry = target; + + if (triangleGeometry.uvs && numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices * 2); + this._pInvalidateGeometry(); + } + + var index = 0; + + for (var yi = 0; yi <= this._segmentsH; ++yi) { + for (var xi = 0; xi <= this._segmentsW; ++xi) { + uvs[index] = (xi / this._segmentsW) * triangleGeometry.scaleU; + uvs[index + 1] = (1 - yi / this._segmentsH) * triangleGeometry.scaleV; + index += 2; + + if (this._doubleSided) { + uvs[index] = (xi / this._segmentsW) * triangleGeometry.scaleU; + uvs[index + 1] = (1 - yi / this._segmentsH) * triangleGeometry.scaleV; + index += 2; + } + } + } + + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitivePlanePrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitivePlanePrefab; + + +},{"awayjs-core/lib/prefabs/PrimitivePrefabBase":undefined}],"awayjs-core/lib/prefabs/PrimitivePolygonPrefab":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitiveCylinderPrefab = require("awayjs-core/lib/prefabs/PrimitiveCylinderPrefab"); + +/** +* A UV RegularPolygon primitive mesh. +*/ +var PrimitivePolygonPrefab = (function (_super) { + __extends(PrimitivePolygonPrefab, _super); + /** + * Creates a new RegularPolygon disc object. + * @param radius The radius of the regular polygon + * @param sides Defines the number of sides of the regular polygon. + * @param yUp Defines whether the regular polygon should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitivePolygonPrefab(radius, sides, yUp) { + if (typeof radius === "undefined") { radius = 100; } + if (typeof sides === "undefined") { sides = 16; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this, radius, 0, 0, sides, 1, true, false, false, yUp); + } + Object.defineProperty(PrimitivePolygonPrefab.prototype, "radius", { + /** + * The radius of the regular polygon. + */ + get: function () { + return this._pBottomRadius; + }, + set: function (value) { + this._pBottomRadius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePolygonPrefab.prototype, "sides", { + /** + * The number of sides of the regular polygon. + */ + get: function () { + return this._pSegmentsW; + }, + set: function (value) { + this.setSegmentsW(value); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePolygonPrefab.prototype, "subdivisions", { + /** + * The number of subdivisions from the edge to the center of the regular polygon. + */ + get: function () { + return this._pSegmentsH; + }, + set: function (value) { + this.setSegmentsH(value); + }, + enumerable: true, + configurable: true + }); + + return PrimitivePolygonPrefab; +})(PrimitiveCylinderPrefab); + +module.exports = PrimitivePolygonPrefab; + + +},{"awayjs-core/lib/prefabs/PrimitiveCylinderPrefab":undefined}],"awayjs-core/lib/prefabs/PrimitivePrefabBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Geometry = require("awayjs-core/lib/core/base/Geometry"); + +var TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +var LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var Mesh = require("awayjs-core/lib/entities/Mesh"); +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var PrefabBase = require("awayjs-core/lib/prefabs/PrefabBase"); + +/** +* PrimitivePrefabBase is an abstract base class for polytope prefabs, which are simple pre-built geometric shapes +*/ +var PrimitivePrefabBase = (function (_super) { + __extends(PrimitivePrefabBase, _super); + /** + * Creates a new PrimitivePrefabBase object. + * + * @param material The material with which to render the object + */ + function PrimitivePrefabBase(material, geometryType) { + if (typeof material === "undefined") { material = null; } + if (typeof geometryType === "undefined") { geometryType = "triangleSubGeometry"; } + _super.call(this); + this._geomDirty = true; + this._uvDirty = true; + this._geometryTypeDirty = true; + + this._geometry = new Geometry(); + this._material = material; + this._geometryType = geometryType; + } + Object.defineProperty(PrimitivePrefabBase.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.PRIMITIVE_PREFAB; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(PrimitivePrefabBase.prototype, "geometryType", { + /** + * + */ + get: function () { + return this._geometryType; + }, + set: function (value) { + if (this._geometryType == value) + return; + + this._geometryType = value; + + this.invalidateGeometryType(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePrefabBase.prototype, "geometry", { + get: function () { + this._iValidate(); + + return this._geometry; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(PrimitivePrefabBase.prototype, "material", { + /** + * The material with which to render the primitive. + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + this._material = value; + + var len = this._pObjects.length; + for (var i = 0; i < len; i++) + this._pObjects[i].material = this._material; + }, + enumerable: true, + configurable: true + }); + + + /** + * Builds the primitive's geometry when invalid. This method should not be called directly. The calling should + * be triggered by the invalidateGeometry method (and in turn by updateGeometry). + */ + PrimitivePrefabBase.prototype._pBuildGeometry = function (target, geometryType) { + throw new AbstractMethodError(); + }; + + /** + * Builds the primitive's uv coordinates when invalid. This method should not be called directly. The calling + * should be triggered by the invalidateUVs method (and in turn by updateUVs). + */ + PrimitivePrefabBase.prototype._pBuildUVs = function (target, geometryType) { + throw new AbstractMethodError(); + }; + + /** + * Invalidates the primitive's geometry type, causing it to be updated when requested. + */ + PrimitivePrefabBase.prototype.invalidateGeometryType = function () { + this._geometryTypeDirty = true; + this._geomDirty = true; + this._uvDirty = true; + }; + + /** + * Invalidates the primitive's geometry, causing it to be updated when requested. + */ + PrimitivePrefabBase.prototype._pInvalidateGeometry = function () { + this._geomDirty = true; + }; + + /** + * Invalidates the primitive's uv coordinates, causing them to be updated when requested. + */ + PrimitivePrefabBase.prototype._pInvalidateUVs = function () { + this._uvDirty = true; + }; + + /** + * Updates the subgeometry when invalid. + */ + PrimitivePrefabBase.prototype.updateGeometryType = function () { + //remove any existing sub geometry + if (this._subGeometry) + this._geometry.removeSubGeometry(this._subGeometry); + + if (this._geometryType == "triangleSubGeometry") { + var triangleGeometry = new TriangleSubGeometry(true); + triangleGeometry.autoDeriveNormals = false; + triangleGeometry.autoDeriveTangents = false; + triangleGeometry.autoDeriveUVs = false; + this._geometry.addSubGeometry(triangleGeometry); + this._subGeometry = triangleGeometry; + } else if (this._geometryType == "lineSubGeometry") { + this._geometry.addSubGeometry(this._subGeometry = new LineSubGeometry()); + } + + this._geometryTypeDirty = false; + }; + + /** + * Updates the geometry when invalid. + */ + PrimitivePrefabBase.prototype.updateGeometry = function () { + this._pBuildGeometry(this._subGeometry, this._geometryType); + + this._geomDirty = false; + }; + + /** + * Updates the uv coordinates when invalid. + */ + PrimitivePrefabBase.prototype.updateUVs = function () { + this._pBuildUVs(this._subGeometry, this._geometryType); + + this._uvDirty = false; + }; + + PrimitivePrefabBase.prototype._iValidate = function () { + if (this._geometryTypeDirty) + this.updateGeometryType(); + + if (this._geomDirty) + this.updateGeometry(); + + if (this._uvDirty) + this.updateUVs(); + }; + + PrimitivePrefabBase.prototype._pCreateObject = function () { + var mesh = new Mesh(this._geometry, this._material); + mesh._iSourcePrefab = this; + + return mesh; + }; + return PrimitivePrefabBase; +})(PrefabBase); + +module.exports = PrimitivePrefabBase; + + +},{"awayjs-core/lib/core/base/Geometry":undefined,"awayjs-core/lib/core/base/LineSubGeometry":undefined,"awayjs-core/lib/core/base/TriangleSubGeometry":undefined,"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/entities/Mesh":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/prefabs/PrefabBase":undefined}],"awayjs-core/lib/prefabs/PrimitiveSpherePrefab":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A UV Sphere primitive mesh. +*/ +var PrimitiveSpherePrefab = (function (_super) { + __extends(PrimitiveSpherePrefab, _super); + /** + * Creates a new Sphere object. + * + * @param radius The radius of the sphere. + * @param segmentsW Defines the number of horizontal segments that make up the sphere. + * @param segmentsH Defines the number of vertical segments that make up the sphere. + * @param yUp Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveSpherePrefab(radius, segmentsW, segmentsH, yUp) { + if (typeof radius === "undefined") { radius = 50; } + if (typeof segmentsW === "undefined") { segmentsW = 16; } + if (typeof segmentsH === "undefined") { segmentsH = 12; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this); + + this._radius = radius; + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._yUp = yUp; + } + Object.defineProperty(PrimitiveSpherePrefab.prototype, "radius", { + /** + * The radius of the sphere. + */ + get: function () { + return this._radius; + }, + set: function (value) { + this._radius = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveSpherePrefab.prototype, "segmentsW", { + /** + * Defines the number of horizontal segments that make up the sphere. Defaults to 16. + */ + get: function () { + return this._segmentsW; + }, + set: function (value) { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveSpherePrefab.prototype, "segmentsH", { + /** + * Defines the number of vertical segments that make up the sphere. Defaults to 12. + */ + get: function () { + return this._segmentsH; + }, + set: function (value) { + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveSpherePrefab.prototype, "yUp", { + /** + * Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveSpherePrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var i; + var j; + var vidx, fidx; + + var comp1; + var comp2; + var numVertices; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array((this._segmentsH - 1) * this._segmentsW * 6); + positions = new Array(numVertices * 3); + normals = new Array(numVertices * 3); + tangents = new Array(numVertices * 3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + var startIndex; + var t1; + var t2; + + for (j = 0; j <= this._segmentsH; ++j) { + startIndex = vidx; + + var horangle = Math.PI * j / this._segmentsH; + var z = -this._radius * Math.cos(horangle); + var ringradius = this._radius * Math.sin(horangle); + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle = 2 * Math.PI * i / this._segmentsW; + var x = ringradius * Math.cos(verangle); + var y = ringradius * Math.sin(verangle); + var normLen = 1 / Math.sqrt(x * x + y * y + z * z); + var tanLen = Math.sqrt(y * y + x * x); + + if (this._yUp) { + t1 = 0; + t2 = tanLen > .007 ? x / tanLen : 0; + comp1 = -z; + comp2 = y; + } else { + t1 = tanLen > .007 ? x / tanLen : 0; + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsW) { + positions[vidx] = positions[startIndex]; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + normals[vidx] = normals[startIndex] + (x * normLen) * .5; + normals[vidx + 1] = normals[startIndex + 1] + (comp1 * normLen) * .5; + normals[vidx + 2] = normals[startIndex + 2] + (comp2 * normLen) * .5; + tangents[vidx] = tanLen > .007 ? -y / tanLen : 1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = x * normLen; + normals[vidx + 1] = comp1 * normLen; + normals[vidx + 2] = comp2 * normLen; + tangents[vidx] = tanLen > .007 ? -y / tanLen : 1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } + + if (i > 0 && j > 0) { + var a = (this._segmentsW + 1) * j + i; + var b = (this._segmentsW + 1) * j + i - 1; + var c = (this._segmentsW + 1) * (j - 1) + i - 1; + var d = (this._segmentsW + 1) * (j - 1) + i; + + if (j == this._segmentsH) { + positions[vidx] = positions[startIndex]; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } else if (j == 1) { + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + } else { + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + } + + vidx += 3; + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + var lineGeometry = target; + + var numSegments = (this._segmentsH - 1) * this._segmentsW * 2; + var startPositions; + var endPositions; + var thickness; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments * 3); + endPositions = new Array(numSegments * 3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + for (j = 0; j <= this._segmentsH; ++j) { + var horangle = Math.PI * j / this._segmentsH; + var z = -this._radius * Math.cos(horangle); + var ringradius = this._radius * Math.sin(horangle); + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle = 2 * Math.PI * i / this._segmentsW; + var x = ringradius * Math.cos(verangle); + var y = ringradius * Math.sin(verangle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i > 0 && j > 0) { + //horizonal lines + if (j < this._segmentsH) { + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + //vertical lines + startPositions[vidx] = endPositions[vidx - this._segmentsW * 6]; + startPositions[vidx + 1] = endPositions[vidx + 1 - this._segmentsW * 6]; + startPositions[vidx + 2] = endPositions[vidx + 2 - this._segmentsW * 6]; + + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + if (i < this._segmentsW && j > 0 && j < this._segmentsH) { + startPositions[vidx] = x; + startPositions[vidx + 1] = comp1; + startPositions[vidx + 2] = comp2; + } + } + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + }; + + /** + * @inheritDoc + */ + PrimitiveSpherePrefab.prototype._pBuildUVs = function (target, geometryType) { + var i, j; + var numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); + var uvs; + + if (geometryType == "triangleSubGeometry") { + numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); + + var triangleGeometry = target; + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices * 2); + } + + var index = 0; + for (j = 0; j <= this._segmentsH; ++j) { + for (i = 0; i <= this._segmentsW; ++i) { + uvs[index++] = (i / this._segmentsW) * triangleGeometry.scaleU; + uvs[index++] = (j / this._segmentsH) * triangleGeometry.scaleV; + } + } + + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveSpherePrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveSpherePrefab; + + +},{"awayjs-core/lib/prefabs/PrimitivePrefabBase":undefined}],"awayjs-core/lib/prefabs/PrimitiveTorusPrefab":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A UV Cylinder primitive mesh. +*/ +var PrimitiveTorusPrefab = (function (_super) { + __extends(PrimitiveTorusPrefab, _super); + /** + * Creates a new Torus object. + * @param radius The radius of the torus. + * @param tuebRadius The radius of the inner tube of the torus. + * @param segmentsR Defines the number of horizontal segments that make up the torus. + * @param segmentsT Defines the number of vertical segments that make up the torus. + * @param yUp Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveTorusPrefab(radius, tubeRadius, segmentsR, segmentsT, yUp) { + if (typeof radius === "undefined") { radius = 50; } + if (typeof tubeRadius === "undefined") { tubeRadius = 50; } + if (typeof segmentsR === "undefined") { segmentsR = 16; } + if (typeof segmentsT === "undefined") { segmentsT = 8; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this); + this._numVertices = 0; + + this._radius = radius; + this._tubeRadius = tubeRadius; + this._segmentsR = segmentsR; + this._segmentsT = segmentsT; + this._yUp = yUp; + } + Object.defineProperty(PrimitiveTorusPrefab.prototype, "radius", { + /** + * The radius of the torus. + */ + get: function () { + return this._radius; + }, + set: function (value) { + this._radius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveTorusPrefab.prototype, "tubeRadius", { + /** + * The radius of the inner tube of the torus. + */ + get: function () { + return this._tubeRadius; + }, + set: function (value) { + this._tubeRadius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveTorusPrefab.prototype, "segmentsR", { + /** + * Defines the number of horizontal segments that make up the torus. Defaults to 16. + */ + get: function () { + return this._segmentsR; + }, + set: function (value) { + this._segmentsR = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveTorusPrefab.prototype, "segmentsT", { + /** + * Defines the number of vertical segments that make up the torus. Defaults to 8. + */ + get: function () { + return this._segmentsT; + }, + set: function (value) { + this._segmentsT = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveTorusPrefab.prototype, "yUp", { + /** + * Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveTorusPrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var i, j; + var x, y, z, nx, ny, nz, revolutionAngleR, revolutionAngleT; + var vidx; + var fidx; + var numIndices = 0; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // evaluate target number of vertices, triangles and indices + this._numVertices = (this._segmentsT + 1) * (this._segmentsR + 1); // segmentsT + 1 because of closure, segmentsR + 1 because of closure + numIndices = this._segmentsT * this._segmentsR * 6; // each level has segmentR quads, each of 2 triangles + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(this._numVertices * 3); + normals = new Array(this._numVertices * 3); + tangents = new Array(this._numVertices * 3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + // evaluate revolution steps + var revolutionAngleDeltaR = 2 * Math.PI / this._segmentsR; + var revolutionAngleDeltaT = 2 * Math.PI / this._segmentsT; + + var comp1, comp2; + var t1, t2, n1, n2; + var startIndex = 0; + var nextVertexIndex = 0; + + // surface + var a, b, c, d, length; + + for (j = 0; j <= this._segmentsT; ++j) { + startIndex = nextVertexIndex * 3; + + for (i = 0; i <= this._segmentsR; ++i) { + // revolution vertex + revolutionAngleR = i * revolutionAngleDeltaR; + revolutionAngleT = j * revolutionAngleDeltaT; + + length = Math.cos(revolutionAngleT); + nx = length * Math.cos(revolutionAngleR); + ny = length * Math.sin(revolutionAngleR); + nz = Math.sin(revolutionAngleT); + + x = this._radius * Math.cos(revolutionAngleR) + this._tubeRadius * nx; + y = this._radius * Math.sin(revolutionAngleR) + this._tubeRadius * ny; + z = (j == this._segmentsT) ? 0 : this._tubeRadius * nz; + + if (this._yUp) { + n1 = -nz; + n2 = ny; + t1 = 0; + t2 = (length ? nx / length : x / this._radius); + comp1 = -z; + comp2 = y; + } else { + n1 = ny; + n2 = nz; + t1 = (length ? nx / length : x / this._radius); + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsR) { + positions[vidx] = x; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = nx; + normals[vidx + 1] = n1; + normals[vidx + 2] = n2; + tangents[vidx] = -(length ? ny / length : y / this._radius); + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + + vidx += 3; + + // close triangle + if (i > 0 && j > 0) { + a = nextVertexIndex; // current + b = nextVertexIndex - 1; // previous + c = b - this._segmentsR - 1; // previous of last level + d = a - this._segmentsR - 1; // current of last level + + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + + nextVertexIndex++; + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + //TODO + } + }; + + /** + * @inheritDoc + */ + PrimitiveTorusPrefab.prototype._pBuildUVs = function (target, geometryType) { + var i, j; + var uvs; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices * 2); + } + + // current uv component index + var index = 0; + + for (j = 0; j <= this._segmentsT; ++j) { + for (i = 0; i <= this._segmentsR; ++i) { + // revolution vertex + uvs[index++] = (i / this._segmentsR) * triangleGeometry.scaleU; + uvs[index++] = (j / this._segmentsT) * triangleGeometry.scaleV; + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveTorusPrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveTorusPrefab; + + +},{"awayjs-core/lib/prefabs/PrimitivePrefabBase":undefined}],"awayjs-core/lib/projections/CoordinateSystem":[function(require,module,exports){ +/** +* Provides constant values for camera lens projection options use the the coordinateSystem property +* +* @see away.projections.PerspectiveLens#coordinateSystem +*/ +var CoordinateSystem = (function () { + function CoordinateSystem() { + } + CoordinateSystem.LEFT_HANDED = "leftHanded"; + + CoordinateSystem.RIGHT_HANDED = "rightHanded"; + return CoordinateSystem; +})(); + +module.exports = CoordinateSystem; + + +},{}],"awayjs-core/lib/projections/FreeMatrixProjection":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var FreeMatrixProjection = (function (_super) { + __extends(FreeMatrixProjection, _super); + function FreeMatrixProjection() { + _super.call(this); + + this._pMatrix.copyFrom(new PerspectiveProjection().matrix); + } + Object.defineProperty(FreeMatrixProjection.prototype, "near", { + //@override + set: function (value) { + this._pNear = value; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(FreeMatrixProjection.prototype, "far", { + //@override + set: function (value) { + this._pFar = value; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(FreeMatrixProjection.prototype, "iAspectRatio", { + //@override + set: function (value) { + this._pAspectRatio = value; + }, + enumerable: true, + configurable: true + }); + + //@override + FreeMatrixProjection.prototype.clone = function () { + var clone = new FreeMatrixProjection(); + clone._pMatrix.copyFrom(this._pMatrix); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone.pInvalidateMatrix(); + return clone; + }; + + //@override + FreeMatrixProjection.prototype.pUpdateMatrix = function () { + this._pMatrixInvalid = false; + }; + return FreeMatrixProjection; +})(ProjectionBase); + +module.exports = FreeMatrixProjection; + + +},{"awayjs-core/lib/projections/PerspectiveProjection":undefined,"awayjs-core/lib/projections/ProjectionBase":undefined}],"awayjs-core/lib/projections/IProjection":[function(require,module,exports){ + + + +},{}],"awayjs-core/lib/projections/ObliqueNearPlaneProjection":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); + +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var ObliqueNearPlaneProjection = (function (_super) { + __extends(ObliqueNearPlaneProjection, _super); + function ObliqueNearPlaneProjection(baseProjection, plane) { + var _this = this; + _super.call(this); + this.baseProjection = baseProjection; + this.plane = plane; + + this._onProjectionMatrixChangedDelegate = function (event) { + return _this.onProjectionMatrixChanged(event); + }; + } + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "frustumCorners", { + //@override + get: function () { + return this._baseProjection.frustumCorners; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "near", { + //@override + get: function () { + return this._baseProjection.near; + }, + //@override + set: function (value) { + this._baseProjection.near = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "far", { + //@override + get: function () { + return this._baseProjection.far; + }, + //@override + set: function (value) { + this._baseProjection.far = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "iAspectRatio", { + //@override + get: function () { + return this._baseProjection._iAspectRatio; + }, + //@override + set: function (value) { + this._baseProjection._iAspectRatio = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "plane", { + get: function () { + return this._plane; + }, + set: function (value) { + this._plane = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "baseProjection", { + set: function (value) { + if (this._baseProjection) { + this._baseProjection.removeEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + } + this._baseProjection = value; + + if (this._baseProjection) { + this._baseProjection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + } + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + ObliqueNearPlaneProjection.prototype.onProjectionMatrixChanged = function (event) { + this.pInvalidateMatrix(); + }; + + //@override + ObliqueNearPlaneProjection.prototype.pUpdateMatrix = function () { + this._pMatrix.copyFrom(this._baseProjection.matrix); + + var cx = this._plane.a; + var cy = this._plane.b; + var cz = this._plane.c; + var cw = -this._plane.d + .05; + var signX = cx >= 0 ? 1 : -1; + var signY = cy >= 0 ? 1 : -1; + var p = new Vector3D(signX, signY, 1, 1); + var inverse = this._pMatrix.clone(); + inverse.invert(); + var q = inverse.transformVector(p); + this._pMatrix.copyRowTo(3, p); + var a = (q.x * p.x + q.y * p.y + q.z * p.z + q.w * p.w) / (cx * q.x + cy * q.y + cz * q.z + cw * q.w); + this._pMatrix.copyRowFrom(2, new Vector3D(cx * a, cy * a, cz * a, cw * a)); + }; + return ObliqueNearPlaneProjection; +})(ProjectionBase); + +module.exports = ObliqueNearPlaneProjection; + + +},{"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/events/ProjectionEvent":undefined,"awayjs-core/lib/projections/ProjectionBase":undefined}],"awayjs-core/lib/projections/OrthographicOffCenterProjection":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var OrthographicOffCenterProjection = (function (_super) { + __extends(OrthographicOffCenterProjection, _super); + function OrthographicOffCenterProjection(minX, maxX, minY, maxY) { + _super.call(this); + this._minX = minX; + this._maxX = maxX; + this._minY = minY; + this._maxY = maxY; + } + Object.defineProperty(OrthographicOffCenterProjection.prototype, "minX", { + get: function () { + return this._minX; + }, + set: function (value) { + this._minX = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(OrthographicOffCenterProjection.prototype, "maxX", { + get: function () { + return this._maxX; + }, + set: function (value) { + this._maxX = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(OrthographicOffCenterProjection.prototype, "minY", { + get: function () { + return this._minY; + }, + set: function (value) { + this._minY = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(OrthographicOffCenterProjection.prototype, "maxY", { + get: function () { + return this._maxY; + }, + set: function (value) { + this._maxY = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + //@override + OrthographicOffCenterProjection.prototype.unproject = function (nX, nY, sZ) { + var v = new Vector3D(nX, -nY, sZ, 1.0); + v = this.unprojectionMatrix.transformVector(v); + + //z is unaffected by transform + v.z = sZ; + + return v; + }; + + //@override + OrthographicOffCenterProjection.prototype.clone = function () { + var clone = new OrthographicOffCenterProjection(this._minX, this._maxX, this._minY, this._maxY); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + return clone; + }; + + //@override + OrthographicOffCenterProjection.prototype.pUpdateMatrix = function () { + var raw = []; + var w = 1 / (this._maxX - this._minX); + var h = 1 / (this._maxY - this._minY); + var d = 1 / (this._pFar - this._pNear); + + raw[0] = 2 * w; + raw[5] = 2 * h; + raw[10] = d; + raw[12] = -(this._maxX + this._minX) * w; + raw[13] = -(this._maxY + this._minY) * h; + raw[14] = -this._pNear * d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + this._pMatrix.copyRawDataFrom(raw); + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._minX; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._maxX; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._minY; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._maxY; + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrixInvalid = false; + }; + return OrthographicOffCenterProjection; +})(ProjectionBase); + +module.exports = OrthographicOffCenterProjection; + + +},{"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/projections/ProjectionBase":undefined}],"awayjs-core/lib/projections/OrthographicProjection":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var OrthographicProjection = (function (_super) { + __extends(OrthographicProjection, _super); + function OrthographicProjection(projectionHeight) { + if (typeof projectionHeight === "undefined") { projectionHeight = 500; } + _super.call(this); + this._projectionHeight = projectionHeight; + } + Object.defineProperty(OrthographicProjection.prototype, "projectionHeight", { + get: function () { + return this._projectionHeight; + }, + set: function (value) { + if (value == this._projectionHeight) { + return; + } + this._projectionHeight = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + //@override + OrthographicProjection.prototype.unproject = function (nX, nY, sZ) { + var v = new Vector3D(nX + this.matrix.rawData[12], -nY + this.matrix.rawData[13], sZ, 1.0); + v = this.unprojectionMatrix.transformVector(v); + + //z is unaffected by transform + v.z = sZ; + + return v; + }; + + //@override + OrthographicProjection.prototype.clone = function () { + var clone = new OrthographicProjection(); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone.projectionHeight = this._projectionHeight; + return clone; + }; + + //@override + OrthographicProjection.prototype.pUpdateMatrix = function () { + var raw = []; + this._yMax = this._projectionHeight * .5; + this._xMax = this._yMax * this._pAspectRatio; + + var left; + var right; + var top; + var bottom; + + if (this._pScissorRect.x == 0 && this._pScissorRect.y == 0 && this._pScissorRect.width == this._pViewPort.width && this._pScissorRect.height == this._pViewPort.height) { + // assume symmetric frustum + left = -this._xMax; + right = this._xMax; + top = -this._yMax; + bottom = this._yMax; + + raw[0] = 2 / (this._projectionHeight * this._pAspectRatio); + raw[5] = 2 / this._projectionHeight; + raw[10] = 1 / (this._pFar - this._pNear); + raw[14] = this._pNear / (this._pNear - this._pFar); + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = raw[12] = raw[13] = 0; + raw[15] = 1; + } else { + var xWidth = this._xMax * (this._pViewPort.width / this._pScissorRect.width); + var yHgt = this._yMax * (this._pViewPort.height / this._pScissorRect.height); + var center = this._xMax * (this._pScissorRect.x * 2 - this._pViewPort.width) / this._pScissorRect.width + this._xMax; + var middle = -this._yMax * (this._pScissorRect.y * 2 - this._pViewPort.height) / this._pScissorRect.height - this._yMax; + + left = center - xWidth; + right = center + xWidth; + top = middle - yHgt; + bottom = middle + yHgt; + + raw[0] = 2 * 1 / (right - left); + raw[5] = -2 * 1 / (top - bottom); + raw[10] = 1 / (this._pFar - this._pNear); + + raw[12] = (right + left) / (right - left); + raw[13] = (bottom + top) / (bottom - top); + raw[14] = this._pNear / (this.near - this.far); + + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + raw[15] = 1; + } + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = left; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = right; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = top; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = bottom; + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrix.copyRawDataFrom(raw); + + this._pMatrixInvalid = false; + }; + return OrthographicProjection; +})(ProjectionBase); + +module.exports = OrthographicProjection; + + +},{"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/projections/ProjectionBase":undefined}],"awayjs-core/lib/projections/PerspectiveProjection":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var CoordinateSystem = require("awayjs-core/lib/projections/CoordinateSystem"); +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var PerspectiveProjection = (function (_super) { + __extends(PerspectiveProjection, _super); + function PerspectiveProjection(fieldOfView, coordinateSystem) { + if (typeof fieldOfView === "undefined") { fieldOfView = 60; } + if (typeof coordinateSystem === "undefined") { coordinateSystem = "leftHanded"; } + _super.call(this, coordinateSystem); + this._fieldOfView = 60; + this._focalLength = 1000; + this._hFieldOfView = 60; + this._hFocalLength = 1000; + this._preserveAspectRatio = true; + this._preserveFocalLength = false; + this.fieldOfView = fieldOfView; + } + Object.defineProperty(PerspectiveProjection.prototype, "preserveAspectRatio", { + /** + * + */ + get: function () { + return this._preserveAspectRatio; + }, + set: function (value) { + if (this._preserveAspectRatio == value) + return; + + this._preserveAspectRatio = value; + + if (this._preserveAspectRatio) + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "preserveFocalLength", { + /** + * + */ + get: function () { + return this._preserveFocalLength; + }, + set: function (value) { + if (this._preserveFocalLength == value) + return; + + this._preserveFocalLength = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "fieldOfView", { + /** + * + */ + get: function () { + return this._fieldOfView; + }, + set: function (value) { + if (this._fieldOfView == value) + return; + + this._fieldOfView = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "focalLength", { + /** + * + */ + get: function () { + return this._focalLength; + }, + set: function (value) { + if (this._focalLength == value) + return; + + this._focalLength = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "hFieldOfView", { + /** + * + */ + get: function () { + return this._hFieldOfView; + }, + set: function (value) { + if (this._hFieldOfView == value) + return; + + this._hFieldOfView = value; + + this._hFocalLength = 1 / Math.tan(this._hFieldOfView * Math.PI / 360); + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "hFocalLength", { + /** + * + */ + get: function () { + return this._hFocalLength; + }, + set: function (value) { + if (this._hFocalLength == value) + return; + + this._hFocalLength = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + //@override + PerspectiveProjection.prototype.unproject = function (nX, nY, sZ) { + var v = new Vector3D(nX, -nY, sZ, 1.0); + + v.x *= sZ; + v.y *= sZ; + + v = this.unprojectionMatrix.transformVector(v); + + //z is unaffected by transform + v.z = sZ; + + return v; + }; + + //@override + PerspectiveProjection.prototype.clone = function () { + var clone = new PerspectiveProjection(this._fieldOfView); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone._pCoordinateSystem = this._pCoordinateSystem; + return clone; + }; + + //@override + PerspectiveProjection.prototype.pUpdateMatrix = function () { + var raw = []; + + if (this._preserveFocalLength) { + if (this._preserveAspectRatio) + this._hFocalLength = this._focalLength; + + this._fieldOfView = Math.atan(0.5 * this._pScissorRect.height / this._focalLength) * 360 / Math.PI; + this._hFieldOfView = Math.atan(0.5 * this._pScissorRect.width / this._hFocalLength) * 360 / Math.PI; + } else { + this._focalLength = 0.5 * this._pScissorRect.height / Math.tan(this._fieldOfView * Math.PI / 360); + + if (this._preserveAspectRatio) + this._hFocalLength = this._focalLength; + else + this._hFocalLength = 0.5 * this._pScissorRect.width / Math.tan(this._hFieldOfView * Math.PI / 360); + } + + var tanMinX = -this._pOriginX / this._hFocalLength; + var tanMaxX = (1 - this._pOriginX) / this._hFocalLength; + var tanMinY = -this._pOriginY / this._focalLength; + var tanMaxY = (1 - this._pOriginY) / this._focalLength; + + var left; + var right; + var top; + var bottom; + + // assume scissored frustum + var center = -((tanMinX - tanMaxX) * this._pScissorRect.x + tanMinX * this._pScissorRect.width); + var middle = ((tanMinY - tanMaxY) * this._pScissorRect.y + tanMinY * this._pScissorRect.height); + + left = center - (tanMaxX - tanMinX) * this._pViewPort.width; + right = center; + top = middle; + bottom = middle + (tanMaxY - tanMinY) * this._pViewPort.height; + + raw[0] = 2 / (right - left); + raw[5] = 2 / (bottom - top); + raw[8] = (right + left) / (right - left); + raw[9] = (bottom + top) / (bottom - top); + raw[10] = (this._pFar + this._pNear) / (this._pFar - this._pNear); + raw[11] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[12] = raw[13] = raw[15] = 0; + raw[14] = -2 * this._pFar * this._pNear / (this._pFar - this._pNear); + + if (this._pCoordinateSystem == CoordinateSystem.RIGHT_HANDED) + raw[5] = -raw[5]; + + this._pMatrix.copyRawDataFrom(raw); + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pNear * left; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pNear * right; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pNear * top; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pNear * bottom; + + this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._pFar * left; + this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._pFar * right; + this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._pFar * top; + this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._pFar * bottom; + + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrixInvalid = false; + }; + return PerspectiveProjection; +})(ProjectionBase); + +module.exports = PerspectiveProjection; + + +},{"awayjs-core/lib/core/geom/Vector3D":undefined,"awayjs-core/lib/projections/CoordinateSystem":undefined,"awayjs-core/lib/projections/ProjectionBase":undefined}],"awayjs-core/lib/projections/ProjectionBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var ProjectionBase = (function (_super) { + __extends(ProjectionBase, _super); + function ProjectionBase(coordinateSystem) { + if (typeof coordinateSystem === "undefined") { coordinateSystem = "leftHanded"; } + _super.call(this); + this._pMatrix = new Matrix3D(); + this._pScissorRect = new Rectangle(); + this._pViewPort = new Rectangle(); + this._pNear = 20; + this._pFar = 3000; + this._pAspectRatio = 1; + this._pMatrixInvalid = true; + this._pFrustumCorners = []; + this._pOriginX = 0.5; + this._pOriginY = 0.5; + this._unprojectionInvalid = true; + + this.coordinateSystem = coordinateSystem; + } + Object.defineProperty(ProjectionBase.prototype, "coordinateSystem", { + /** + * The handedness of the coordinate system projection. The default is LEFT_HANDED. + */ + get: function () { + return this._pCoordinateSystem; + }, + set: function (value) { + if (this._pCoordinateSystem == value) + return; + + this._pCoordinateSystem = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "frustumCorners", { + get: function () { + return this._pFrustumCorners; + }, + set: function (frustumCorners) { + this._pFrustumCorners = frustumCorners; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "matrix", { + get: function () { + if (this._pMatrixInvalid) { + this.pUpdateMatrix(); + this._pMatrixInvalid = false; + } + return this._pMatrix; + }, + set: function (value) { + this._pMatrix = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "near", { + get: function () { + return this._pNear; + }, + set: function (value) { + if (value == this._pNear) { + return; + } + this._pNear = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "originX", { + get: function () { + return this._pOriginX; + }, + set: function (value) { + if (this._pOriginX == value) + return; + + this._pOriginX = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "originY", { + get: function () { + return this._pOriginY; + }, + set: function (value) { + if (this._pOriginY == value) + return; + + this._pOriginY = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "far", { + get: function () { + return this._pFar; + }, + set: function (value) { + if (value == this._pFar) { + return; + } + this._pFar = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + ProjectionBase.prototype.project = function (point3d) { + var v = this.matrix.transformVector(point3d); + v.x = v.x / v.w; + v.y = -v.y / v.w; + + //z is unaffected by transform + v.z = point3d.z; + + return v; + }; + + Object.defineProperty(ProjectionBase.prototype, "unprojectionMatrix", { + get: function () { + if (this._unprojectionInvalid) { + if (!this._unprojection) + this._unprojection = new Matrix3D(); + + this._unprojection.copyFrom(this.matrix); + this._unprojection.invert(); + this._unprojectionInvalid = false; + } + return this._unprojection; + }, + enumerable: true, + configurable: true + }); + + ProjectionBase.prototype.unproject = function (nX, nY, sZ) { + throw new AbstractMethodError(); + }; + + ProjectionBase.prototype.clone = function () { + throw new AbstractMethodError(); + }; + + Object.defineProperty(ProjectionBase.prototype, "_iAspectRatio", { + get: function () { + return this._pAspectRatio; + }, + set: function (value) { + if (this._pAspectRatio == value) + return; + + this._pAspectRatio = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + ProjectionBase.prototype.pInvalidateMatrix = function () { + this._pMatrixInvalid = true; + this._unprojectionInvalid = true; + this.dispatchEvent(new ProjectionEvent(ProjectionEvent.MATRIX_CHANGED, this)); + }; + + ProjectionBase.prototype.pUpdateMatrix = function () { + throw new AbstractMethodError(); + }; + + ProjectionBase.prototype._iUpdateScissorRect = function (x, y, width, height) { + this._pScissorRect.x = x; + this._pScissorRect.y = y; + this._pScissorRect.width = width; + this._pScissorRect.height = height; + this.pInvalidateMatrix(); + }; + + ProjectionBase.prototype._iUpdateViewport = function (x, y, width, height) { + this._pViewPort.x = x; + this._pViewPort.y = y; + this._pViewPort.width = width; + this._pViewPort.height = height; + this.pInvalidateMatrix(); + }; + return ProjectionBase; +})(EventDispatcher); + +module.exports = ProjectionBase; + + +},{"awayjs-core/lib/core/geom/Matrix3D":undefined,"awayjs-core/lib/core/geom/Rectangle":undefined,"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/events/ProjectionEvent":undefined}],"awayjs-core/lib/textures/BitmapCubeTexture":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var BitmapCubeTexture = (function (_super) { + __extends(BitmapCubeTexture, _super); + function BitmapCubeTexture(posX, negX, posY, negY, posZ, negZ, generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + this._bitmapDatas = new Array(6); + + this._testSize(this._bitmapDatas[0] = posX); + this._testSize(this._bitmapDatas[1] = negX); + this._testSize(this._bitmapDatas[2] = posY); + this._testSize(this._bitmapDatas[3] = negY); + this._testSize(this._bitmapDatas[4] = posZ); + this._testSize(this._bitmapDatas[5] = negZ); + + this.invalidateContent(); + + this._pSetSize(posX.width); + } + Object.defineProperty(BitmapCubeTexture.prototype, "positiveX", { + /** + * The texture on the cube's right face. + */ + get: function () { + return this._bitmapDatas[0]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[0] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "negativeX", { + /** + * The texture on the cube's left face. + */ + get: function () { + return this._bitmapDatas[1]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[1] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "positiveY", { + /** + * The texture on the cube's top face. + */ + get: function () { + return this._bitmapDatas[2]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[2] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "negativeY", { + /** + * The texture on the cube's bottom face. + */ + get: function () { + return this._bitmapDatas[3]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[3] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "positiveZ", { + /** + * The texture on the cube's far face. + */ + get: function () { + return this._bitmapDatas[4]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[4] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "negativeZ", { + /** + * The texture on the cube's near face. + */ + get: function () { + return this._bitmapDatas[5]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[5] = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * + * @param value + * @private + */ + BitmapCubeTexture.prototype._testSize = function (value) { + if (value.width != value.height) + throw new Error("BitmapData should have equal width and height!"); + if (!TextureUtils.isBitmapDataValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + }; + + BitmapCubeTexture.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + var len = this._bitmapDatas.length; + for (var i = 0; i < len; i++) { + this._bitmapDatas[i].dispose(); + this._bitmapDatas[i] = null; + } + + this._bitmapDatas = null; + }; + + BitmapCubeTexture.prototype._iGetTextureData = function (side) { + return this._bitmapDatas[side]; + }; + return BitmapCubeTexture; +})(CubeTextureBase); + +module.exports = BitmapCubeTexture; + + +},{"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/textures/CubeTextureBase":undefined,"awayjs-core/lib/utils/TextureUtils":undefined}],"awayjs-core/lib/textures/BitmapTexture":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var BitmapTexture = (function (_super) { + __extends(BitmapTexture, _super); + function BitmapTexture(bitmapData, generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + + this.bitmapData = bitmapData; + } + Object.defineProperty(BitmapTexture.prototype, "bitmapData", { + /** + * + * @returns {BitmapData} + */ + get: function () { + return this._bitmapData; + }, + set: function (value) { + if (this._bitmapData == value) + return; + + if (!TextureUtils.isBitmapDataValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + + this._bitmapData = value; + + this.invalidateContent(); + + this._pSetSize(value.width, value.height); + }, + enumerable: true, + configurable: true + }); + + + BitmapTexture.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + this._bitmapData.dispose(); + this._bitmapData = null; + }; + + BitmapTexture.prototype._iGetTextureData = function () { + return this._bitmapData; + }; + return BitmapTexture; +})(Texture2DBase); + +module.exports = BitmapTexture; + + +},{"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/textures/Texture2DBase":undefined,"awayjs-core/lib/utils/TextureUtils":undefined}],"awayjs-core/lib/textures/CubeTextureBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var MipmapGenerator = require("awayjs-core/lib/textures/MipmapGenerator"); +var TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +var CubeTextureBase = (function (_super) { + __extends(CubeTextureBase, _super); + function CubeTextureBase(generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + this._mipmapDataArray = new Array(6); + this._mipmapDataDirtyArray = new Array(6); + } + /** + * + * @param width + * @param height + * @private + */ + CubeTextureBase.prototype._pSetSize = function (size) { + if (this._pSize != size) + this.invalidateSize(); + + for (var i = 0; i < 6; i++) + this._mipmapDataDirtyArray[i] = true; + + this._pSize = size; + }; + + /** + * @inheritDoc + */ + CubeTextureBase.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + for (var i = 0; i < 6; i++) { + var mipmapData = this._mipmapDataArray[i]; + var len = mipmapData.length; + for (var j = 0; j < len; j++) + MipmapGenerator.freeMipMapHolder(mipmapData[j]); + } + }; + + /** + * + */ + CubeTextureBase.prototype.invalidateContent = function () { + _super.prototype.invalidateContent.call(this); + + for (var i = 0; i < 6; i++) + this._mipmapDataDirtyArray[i] = true; + }; + + CubeTextureBase.prototype._iGetMipmapData = function (side) { + if (this._mipmapDataDirtyArray[side]) { + this._mipmapDataDirtyArray[side] = false; + + var mipmapData = this._mipmapDataArray[side] || (this._mipmapDataArray[side] = new Array()); + MipmapGenerator.generateMipMaps(this._iGetTextureData(side), mipmapData, true); + } + + return this._mipmapDataArray[side]; + }; + + CubeTextureBase.prototype._iGetTextureData = function (side) { + throw new AbstractMethodError(); + }; + return CubeTextureBase; +})(TextureProxyBase); + +module.exports = CubeTextureBase; + + +},{"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/textures/MipmapGenerator":undefined,"awayjs-core/lib/textures/TextureProxyBase":undefined}],"awayjs-core/lib/textures/ImageCubeTexture":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var ImageCubeTexture = (function (_super) { + __extends(ImageCubeTexture, _super); + function ImageCubeTexture(posX, negX, posY, negY, posZ, negZ, generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + this._htmlImageElements = new Array(6); + + this._testSize(this._htmlImageElements[0] = posX); + this._testSize(this._htmlImageElements[1] = negX); + this._testSize(this._htmlImageElements[2] = posY); + this._testSize(this._htmlImageElements[3] = negY); + this._testSize(this._htmlImageElements[4] = posZ); + this._testSize(this._htmlImageElements[5] = negZ); + + this.invalidateContent(); + + this._pSetSize(posX.width); + } + Object.defineProperty(ImageCubeTexture.prototype, "positiveX", { + /** + * The texture on the cube's right face. + */ + get: function () { + return this._htmlImageElements[0]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[0] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "negativeX", { + /** + * The texture on the cube's left face. + */ + get: function () { + return this._htmlImageElements[1]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[1] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "positiveY", { + /** + * The texture on the cube's top face. + */ + get: function () { + return this._htmlImageElements[2]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[2] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "negativeY", { + /** + * The texture on the cube's bottom face. + */ + get: function () { + return this._htmlImageElements[3]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[3] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "positiveZ", { + /** + * The texture on the cube's far face. + */ + get: function () { + return this._htmlImageElements[4]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[4] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "negativeZ", { + /** + * The texture on the cube's near face. + */ + get: function () { + return this._htmlImageElements[5]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[5] = value; + }, + enumerable: true, + configurable: true + }); + + + ImageCubeTexture.prototype._testSize = function (value) { + if (value.width != value.height) + throw new Error("BitmapData should have equal width and height!"); + if (!TextureUtils.isHTMLImageElementValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + }; + + ImageCubeTexture.prototype._iGetTextureData = function (side) { + return this._htmlImageElements[side]; + }; + return ImageCubeTexture; +})(CubeTextureBase); + +module.exports = ImageCubeTexture; + + +},{"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/textures/CubeTextureBase":undefined,"awayjs-core/lib/utils/TextureUtils":undefined}],"awayjs-core/lib/textures/ImageTexture":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var ImageTexture = (function (_super) { + __extends(ImageTexture, _super); + /** + * + * @param htmlImageElement + * @param generateMipmaps + */ + function ImageTexture(htmlImageElement, generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + + this.htmlImageElement = htmlImageElement; + } + Object.defineProperty(ImageTexture.prototype, "htmlImageElement", { + /** + * + */ + get: function () { + return this._htmlImageElement; + }, + set: function (value) { + if (this._htmlImageElement == value) + return; + + if (!TextureUtils.isHTMLImageElementValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + + this._htmlImageElement = value; + + this.invalidateContent(); + this._pSetSize(value.width, value.height); + }, + enumerable: true, + configurable: true + }); + + + ImageTexture.prototype._iGetTextureData = function () { + return this._htmlImageElement; + }; + return ImageTexture; +})(Texture2DBase); + +module.exports = ImageTexture; + + +},{"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/textures/Texture2DBase":undefined,"awayjs-core/lib/utils/TextureUtils":undefined}],"awayjs-core/lib/textures/MipmapGenerator":[function(require,module,exports){ +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var Matrix = require("awayjs-core/lib/core/geom/Matrix"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +/** +* MipmapGenerator is a helper class that uploads BitmapData to a Texture including mipmap levels. +*/ +var MipmapGenerator = (function () { + function MipmapGenerator() { + } + MipmapGenerator.generateMipMaps = function (source, output, alpha) { + if (typeof alpha === "undefined") { alpha = false; } + var w = source.width; + var h = source.height; + var i = 0; + + var mipmap; + + MipmapGenerator._rect.width = w; + MipmapGenerator._rect.height = h; + + while (w >= 1 && h >= 1) { + mipmap = output[i] = MipmapGenerator._getMipmapHolder(output[i], w, h); + + if (alpha) + mipmap.fillRect(MipmapGenerator._rect, 0); + + MipmapGenerator._matrix.a = MipmapGenerator._rect.width / source.width; + MipmapGenerator._matrix.d = MipmapGenerator._rect.height / source.height; + + mipmap.draw(source, MipmapGenerator._matrix); //TODO: smoothing? + + w >>= 1; + h >>= 1; + + MipmapGenerator._rect.width = w > 1 ? w : 1; + MipmapGenerator._rect.height = h > 1 ? h : 1; + + i++; + } + }; + + MipmapGenerator._getMipmapHolder = function (mipMapHolder, newW, newH) { + if (mipMapHolder) { + if (mipMapHolder.width == newW && mipMapHolder.height == newH) + return mipMapHolder; + + MipmapGenerator.freeMipMapHolder(mipMapHolder); + } + + if (!MipmapGenerator._mipMaps[newW]) { + MipmapGenerator._mipMaps[newW] = []; + MipmapGenerator._mipMapUses[newW] = []; + } + + if (!MipmapGenerator._mipMaps[newW][newH]) { + mipMapHolder = MipmapGenerator._mipMaps[newW][newH] = new BitmapData(newW, newH, true); + MipmapGenerator._mipMapUses[newW][newH] = 1; + } else { + MipmapGenerator._mipMapUses[newW][newH] = MipmapGenerator._mipMapUses[newW][newH] + 1; + mipMapHolder = MipmapGenerator._mipMaps[newW][newH]; + } + + return mipMapHolder; + }; + + MipmapGenerator.freeMipMapHolder = function (mipMapHolder) { + var holderWidth = mipMapHolder.width; + var holderHeight = mipMapHolder.height; + + if (--MipmapGenerator._mipMapUses[holderWidth][holderHeight] == 0) { + MipmapGenerator._mipMaps[holderWidth][holderHeight].dispose(); + MipmapGenerator._mipMaps[holderWidth][holderHeight] = null; + } + }; + MipmapGenerator._mipMaps = []; + MipmapGenerator._mipMapUses = []; + + MipmapGenerator._matrix = new Matrix(); + MipmapGenerator._rect = new Rectangle(); + return MipmapGenerator; +})(); + +module.exports = MipmapGenerator; + + +},{"awayjs-core/lib/core/base/BitmapData":undefined,"awayjs-core/lib/core/geom/Matrix":undefined,"awayjs-core/lib/core/geom/Rectangle":undefined}],"awayjs-core/lib/textures/RenderTexture":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var RenderTexture = (function (_super) { + __extends(RenderTexture, _super); + function RenderTexture(width, height) { + _super.call(this, false); + + this._pSetSize(width, height); + } + Object.defineProperty(RenderTexture.prototype, "width", { + /** + * + * @returns {number} + */ + get: function () { + return this._pWidth; + }, + set: function (value) { + if (value == this._pWidth) + return; + + if (!TextureUtils.isDimensionValid(value)) + throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); + + this.invalidateContent(); + + this._pSetSize(value, this._pHeight); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(RenderTexture.prototype, "height", { + /** + * + * @returns {number} + */ + get: function () { + return this._pHeight; + }, + set: function (value) { + if (value == this._pHeight) + return; + + if (!TextureUtils.isDimensionValid(value)) + throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); + + this.invalidateContent(); + this._pSetSize(this._pWidth, value); + }, + enumerable: true, + configurable: true + }); + + return RenderTexture; +})(Texture2DBase); + +module.exports = RenderTexture; + + +},{"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/textures/Texture2DBase":undefined,"awayjs-core/lib/utils/TextureUtils":undefined}],"awayjs-core/lib/textures/SpecularBitmapTexture":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var BitmapDataChannel = require("awayjs-core/lib/core/base/BitmapDataChannel"); +var Point = require("awayjs-core/lib/core/geom/Point"); + +var BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); + +/** +* A convenience texture that encodes a specular map in the red channel, and the gloss map in the green channel, as expected by BasicSpecularMapMethod +*/ +var SpecularBitmapTexture = (function (_super) { + __extends(SpecularBitmapTexture, _super); + function SpecularBitmapTexture(specularMap, glossMap, generateMipmaps) { + if (typeof specularMap === "undefined") { specularMap = null; } + if (typeof glossMap === "undefined") { glossMap = null; } + if (typeof generateMipmaps === "undefined") { generateMipmaps = true; } + var bmd = specularMap ? specularMap : glossMap; + + bmd = bmd ? new BitmapData(bmd.width, bmd.height, false, 0xffffff) : new BitmapData(1, 1, false, 0xffffff); + + _super.call(this, bmd, generateMipmaps); + + this.specularMap = specularMap; + this.glossMap = glossMap; + } + Object.defineProperty(SpecularBitmapTexture.prototype, "specularMap", { + get: function () { + return this._specularMap; + }, + set: function (value) { + this._specularMap = value; + + this.invalidateContent(); + + this._testSize(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(SpecularBitmapTexture.prototype, "glossMap", { + get: function () { + return this._glossMap; + }, + set: function (value) { + this._glossMap = value; + this.invalidateContent(); + + this._testSize(); + }, + enumerable: true, + configurable: true + }); + + + SpecularBitmapTexture.prototype._testSize = function () { + var w, h; + + if (this._specularMap) { + w = this._specularMap.width; + h = this._specularMap.height; + } else if (this._glossMap) { + w = this._glossMap.width; + h = this._glossMap.height; + } else { + w = 1; + h = 1; + } + + if (w != this._bitmapData.width && h != this._bitmapData.height) { + var oldBitmap = this._bitmapData; + this.bitmapData = new BitmapData(this._specularMap.width, this._specularMap.height, false, 0xffffff); + oldBitmap.dispose(); + } + }; + + SpecularBitmapTexture.prototype._iGetTextureData = function () { + var rect = this._specularMap.rect; + var origin = new Point(); + + this._bitmapData.fillRect(rect, 0xffffff); + + if (this._glossMap) + this._bitmapData.copyChannel(this._glossMap, rect, origin, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); + + if (this._specularMap) + this._bitmapData.copyChannel(this._specularMap, rect, origin, BitmapDataChannel.RED, BitmapDataChannel.RED); + + return this._bitmapData; + }; + return SpecularBitmapTexture; +})(BitmapTexture); + +module.exports = SpecularBitmapTexture; + + +},{"awayjs-core/lib/core/base/BitmapData":undefined,"awayjs-core/lib/core/base/BitmapDataChannel":undefined,"awayjs-core/lib/core/geom/Point":undefined,"awayjs-core/lib/textures/BitmapTexture":undefined}],"awayjs-core/lib/textures/Texture2DBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var MipmapGenerator = require("awayjs-core/lib/textures/MipmapGenerator"); +var TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +var Texture2DBase = (function (_super) { + __extends(Texture2DBase, _super); + function Texture2DBase(generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + } + Object.defineProperty(Texture2DBase.prototype, "width", { + /** + * + * @returns {number} + */ + get: function () { + return this._pWidth; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Texture2DBase.prototype, "height", { + /** + * + * @returns {number} + */ + get: function () { + return this._pHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Texture2DBase.prototype, "size", { + get: function () { + return this._pWidth; + }, + enumerable: true, + configurable: true + }); + + /** + * @inheritDoc + */ + Texture2DBase.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + if (this._mipmapData) { + var len = this._mipmapData.length; + for (var i = 0; i < len; i++) + MipmapGenerator.freeMipMapHolder(this._mipmapData[i]); + } + }; + + /** + * + */ + Texture2DBase.prototype.invalidateContent = function () { + _super.prototype.invalidateContent.call(this); + + this._mipmapDataDirty = true; + }; + + /** + * + * @param width + * @param height + * @private + */ + Texture2DBase.prototype._pSetSize = function (width, height) { + if (this._pWidth != width || this._pHeight != height) + this.invalidateSize(); + + this._mipmapDataDirty = true; + + this._pWidth = width; + this._pHeight = height; + }; + + Texture2DBase.prototype._iGetMipmapData = function () { + if (this._mipmapDataDirty) { + this._mipmapDataDirty = false; + + if (!this._mipmapData) + this._mipmapData = new Array(); + + MipmapGenerator.generateMipMaps(this._iGetTextureData(), this._mipmapData, true); + } + + return this._mipmapData; + }; + + Texture2DBase.prototype._iGetTextureData = function () { + throw new AbstractMethodError(); + }; + return Texture2DBase; +})(TextureProxyBase); + +module.exports = Texture2DBase; + + +},{"awayjs-core/lib/errors/AbstractMethodError":undefined,"awayjs-core/lib/textures/MipmapGenerator":undefined,"awayjs-core/lib/textures/TextureProxyBase":undefined}],"awayjs-core/lib/textures/TextureProxyBase":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +/** +* +*/ +var TextureProxyBase = (function (_super) { + __extends(TextureProxyBase, _super); + /** + * + */ + function TextureProxyBase(generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this); + this._pFormat = "bgra"; + this._textureData = new Array(); + + this._generateMipmaps = this._hasMipmaps = generateMipmaps; + } + Object.defineProperty(TextureProxyBase.prototype, "size", { + get: function () { + return this._pSize; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextureProxyBase.prototype, "hasMipmaps", { + get: function () { + return this._hasMipmaps; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextureProxyBase.prototype, "format", { + /** + * + * @returns {string} + */ + get: function () { + return this._pFormat; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextureProxyBase.prototype, "generateMipmaps", { + /** + * + * @returns {boolean} + */ + get: function () { + return this._generateMipmaps; + }, + set: function (value) { + if (this._generateMipmaps == value) + return; + + this._generateMipmaps = this._hasMipmaps = value; + + this.invalidateContent(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TextureProxyBase.prototype, "assetType", { + /** + * + * @returns {string} + */ + get: function () { + return AssetType.TEXTURE; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + TextureProxyBase.prototype.invalidateContent = function () { + var len = this._textureData.length; + for (var i = 0; i < len; i++) + this._textureData[i].invalidate(); + }; + + /** + * + * @private + */ + TextureProxyBase.prototype.invalidateSize = function () { + while (this._textureData.length) + this._textureData[0].dispose(); + }; + + /** + * @inheritDoc + */ + TextureProxyBase.prototype.dispose = function () { + while (this._textureData.length) + this._textureData[0].dispose(); + }; + + TextureProxyBase.prototype._iAddTextureData = function (textureData) { + this._textureData.push(textureData); + + return textureData; + }; + + TextureProxyBase.prototype._iRemoveTextureData = function (textureData) { + this._textureData.splice(this._textureData.indexOf(textureData), 1); + + return textureData; + }; + return TextureProxyBase; +})(NamedAssetBase); + +module.exports = TextureProxyBase; + + +},{"awayjs-core/lib/core/library/AssetType":undefined,"awayjs-core/lib/core/library/NamedAssetBase":undefined}],"awayjs-core/lib/utils/ByteArrayBase":[function(require,module,exports){ +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var ByteArrayBase = (function () { + function ByteArrayBase() { + this.position = 0; + this.length = 0; + this._mode = ""; + } + ByteArrayBase.prototype.writeByte = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readByte = function () { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.writeUnsignedByte = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readUnsignedByte = function () { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.writeUnsignedShort = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readUnsignedShort = function () { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.writeUnsignedInt = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readUnsignedInt = function () { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.writeFloat = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.toFloatBits = function (x) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readFloat = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.fromFloatBits = function (x) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.getBytesAvailable = function () { + throw new AbstractMethodError('ByteArrayBase, getBytesAvailable() not implemented '); + }; + + ByteArrayBase.prototype.toString = function () { + return "[ByteArray] ( " + this._mode + " ) position=" + this.position + " length=" + this.length; + }; + + ByteArrayBase.prototype.compareEqual = function (other, count) { + if (count == undefined || count > this.length - this.position) + count = this.length - this.position; + if (count > other.length - other.position) + count = other.length - other.position; + var co0 = count; + var r = true; + while (r && count >= 4) { + count -= 4; + if (this.readUnsignedInt() != other.readUnsignedInt()) + r = false; + } + while (r && count >= 1) { + count--; + if (this.readUnsignedByte() != other.readUnsignedByte()) + r = false; + } + var c0; + this.position -= (c0 - count); + other.position -= (c0 - count); + return r; + }; + + ByteArrayBase.prototype.writeBase64String = function (s) { + for (var i = 0; i < s.length; i++) { + var v = s.charAt(i); + } + }; + + ByteArrayBase.prototype.dumpToConsole = function () { + var oldpos = this.position; + this.position = 0; + var nstep = 8; + + function asHexString(x, digits) { + var lut = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; + var sh = ""; + for (var d = 0; d < digits; d++) { + sh = lut[(x >> (d << 2)) & 0xf] + sh; + } + return sh; + } + + for (var i = 0; i < this.length; i += nstep) { + var s = asHexString(i, 4) + ":"; + for (var j = 0; j < nstep && i + j < this.length; j++) { + s += " " + asHexString(this.readUnsignedByte(), 2); + } + console.log(s); + } + this.position = oldpos; + }; + + ByteArrayBase.prototype.readBase64String = function (count) { + if (count == undefined || count > this.length - this.position) + count = this.length - this.position; + if (!(count > 0)) + return ""; + + return ByteArrayBase.internalGetBase64String(count, this.readUnsignedByte, this); + }; + + ByteArrayBase.internalGetBase64String = function (count, getUnsignedByteFunc, self) { + var r = ""; + var b0, b1, b2, enc1, enc2, enc3, enc4; + var base64Key = ByteArrayBase.Base64Key; + while (count >= 3) { + b0 = getUnsignedByteFunc.apply(self); + b1 = getUnsignedByteFunc.apply(self); + b2 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4) | (b1 >> 4); + enc3 = ((b1 & 15) << 2) | (b2 >> 6); + enc4 = b2 & 63; + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + base64Key.charAt(enc4); + count -= 3; + } + + // pad + if (count == 2) { + b0 = getUnsignedByteFunc.apply(self); + b1 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4) | (b1 >> 4); + enc3 = ((b1 & 15) << 2); + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + "="; + } else if (count == 1) { + b0 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4); + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + "=="; + } + return r; + }; + ByteArrayBase.Base64Key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + return ByteArrayBase; +})(); + +module.exports = ByteArrayBase; + + +},{"awayjs-core/lib/errors/AbstractMethodError":undefined}],"awayjs-core/lib/utils/ByteArrayBuffer":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ByteArrayBase = require("awayjs-core/lib/utils/ByteArrayBase"); + +var ByteArrayBuffer = (function (_super) { + __extends(ByteArrayBuffer, _super); + function ByteArrayBuffer() { + _super.call(this); + this._bytes = []; + this._mode = "Array"; + } + ByteArrayBuffer.prototype.writeByte = function (b) { + var bi = ~~b; + this._bytes[this.position++] = bi; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArrayBuffer.prototype.readByte = function () { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + return this._bytes[this.position++]; + }; + + ByteArrayBuffer.prototype.writeUnsignedByte = function (b) { + var bi = ~~b; + this._bytes[this.position++] = bi & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArrayBuffer.prototype.readUnsignedByte = function () { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + return this._bytes[this.position++]; + }; + + ByteArrayBuffer.prototype.writeUnsignedShort = function (b) { + var bi = ~~b; + this._bytes[this.position++] = bi & 0xff; + this._bytes[this.position++] = (bi >> 8) & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArrayBuffer.prototype.readUnsignedShort = function () { + if (this.position + 2 > this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + var r = this._bytes[this.position] | (this._bytes[this.position + 1] << 8); + this.position += 2; + return r; + }; + + ByteArrayBuffer.prototype.writeUnsignedInt = function (b) { + var bi = ~~b; + this._bytes[this.position++] = bi & 0xff; + this._bytes[this.position++] = (bi >>> 8) & 0xff; + this._bytes[this.position++] = (bi >>> 16) & 0xff; + this._bytes[this.position++] = (bi >>> 24) & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArrayBuffer.prototype.readUnsignedInt = function () { + if (this.position + 4 > this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + var r = this._bytes[this.position] | (this._bytes[this.position + 1] << 8) | (this._bytes[this.position + 2] << 16) | (this._bytes[this.position + 3] << 24); + this.position += 4; + return r >>> 0; + }; + + ByteArrayBuffer.prototype.writeFloat = function (b) { + // this is crazy slow and silly, but as a fallback... + this.writeUnsignedInt(this.toFloatBits(Number(b))); + }; + + ByteArrayBuffer.prototype.toFloatBits = function (x) { + // don't handle inf/nan yet + // special case zero + if (x == 0) { + return 0; + } + + // remove the sign, after this we only deal with positive numbers + var sign = 0; + if (x < 0) { + x = -x; + sign = 1; + } else { + sign = 0; + } + + // a float value is now defined as: x = (1+(mantissa*2^-23))*(2^(exponent-127)) + var exponent = Math.log(x) / Math.log(2); + exponent = Math.floor(exponent); + x = x * Math.pow(2, 23 - exponent); // normalize to 24 bits + var mantissa = Math.floor(x) - 0x800000; + exponent = exponent + 127; + return ((sign << 31) >>> 0) | (exponent << 23) | mantissa; + }; + + ByteArrayBuffer.prototype.readFloat = function (b) { + return this.fromFloatBits(this.readUnsignedInt()); + }; + + ByteArrayBuffer.prototype.fromFloatBits = function (x) { + if (x == 0) { + return 0; + } + var exponent = (x >>> 23) & 0xff; + var mantissa = (x & 0x7fffff) | 0x800000; + var y = Math.pow(2, (exponent - 127) - 23) * mantissa; + if (x >>> 31 != 0) { + y = -y; + } + return y; + }; + return ByteArrayBuffer; +})(ByteArrayBase); + +module.exports = ByteArrayBuffer; + + +},{"awayjs-core/lib/utils/ByteArrayBase":undefined}],"awayjs-core/lib/utils/ByteArray":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ByteArrayBase = require("awayjs-core/lib/utils/ByteArrayBase"); + +var ByteArray = (function (_super) { + __extends(ByteArray, _super); + function ByteArray() { + _super.call(this); + this.maxlength = 0; + this._mode = "Typed array"; + this.maxlength = 4; + this.arraybytes = new ArrayBuffer(this.maxlength); + this.unalignedarraybytestemp = new ArrayBuffer(16); + } + ByteArray.prototype.ensureWriteableSpace = function (n) { + this.ensureSpace(n + this.position); + }; + + ByteArray.prototype.setArrayBuffer = function (aBuffer) { + this.ensureSpace(aBuffer.byteLength); + + this.length = aBuffer.byteLength; + + var inInt8AView = new Int8Array(aBuffer); + var localInt8View = new Int8Array(this.arraybytes, 0, this.length); + + localInt8View.set(inInt8AView); + + this.position = 0; + }; + + ByteArray.prototype.getBytesAvailable = function () { + return (this.length) - (this.position); + }; + + ByteArray.prototype.ensureSpace = function (n) { + if (n > this.maxlength) { + var newmaxlength = (n + 255) & (~255); + var newarraybuffer = new ArrayBuffer(newmaxlength); + var view = new Uint8Array(this.arraybytes, 0, this.length); + var newview = new Uint8Array(newarraybuffer, 0, this.length); + newview.set(view); // memcpy + this.arraybytes = newarraybuffer; + this.maxlength = newmaxlength; + } + }; + + ByteArray.prototype.writeByte = function (b) { + this.ensureWriteableSpace(1); + var view = new Int8Array(this.arraybytes); + view[this.position++] = (~~b); // ~~ is cast to int in js... + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readByte = function () { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + var view = new Int8Array(this.arraybytes); + + return view[this.position++]; + }; + + ByteArray.prototype.readBytes = function (bytes, offset, length) { + if (typeof offset === "undefined") { offset = 0; } + if (typeof length === "undefined") { length = 0; } + if (length == null) { + length = bytes.length; + } + + bytes.ensureWriteableSpace(offset + length); + + var byteView = new Int8Array(bytes.arraybytes); + var localByteView = new Int8Array(this.arraybytes); + + byteView.set(localByteView.subarray(this.position, this.position + length), offset); + + this.position += length; + + if (length + offset > bytes.length) { + bytes.length += (length + offset) - bytes.length; + } + }; + + ByteArray.prototype.writeUnsignedByte = function (b) { + this.ensureWriteableSpace(1); + var view = new Uint8Array(this.arraybytes); + view[this.position++] = (~~b) & 0xff; // ~~ is cast to int in js... + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readUnsignedByte = function () { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + var view = new Uint8Array(this.arraybytes); + return view[this.position++]; + }; + + ByteArray.prototype.writeUnsignedShort = function (b) { + this.ensureWriteableSpace(2); + if ((this.position & 1) == 0) { + var view = new Uint16Array(this.arraybytes); + view[this.position >> 1] = (~~b) & 0xffff; // ~~ is cast to int in js... + } else { + var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); + view[0] = (~~b) & 0xffff; + var view2 = new Uint8Array(this.arraybytes, this.position, 2); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); + view2.set(view3); + } + this.position += 2; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readUTFBytes = function (len) { + var value = ""; + var max = this.position + len; + var data = new DataView(this.arraybytes); + + while (this.position < max) { + var c = data.getUint8(this.position++); + + if (c < 0x80) { + if (c == 0) + break; + value += String.fromCharCode(c); + } else if (c < 0xE0) { + value += String.fromCharCode(((c & 0x3F) << 6) | (data.getUint8(this.position++) & 0x7F)); + } else if (c < 0xF0) { + var c2 = data.getUint8(this.position++); + value += String.fromCharCode(((c & 0x1F) << 12) | ((c2 & 0x7F) << 6) | (data.getUint8(this.position++) & 0x7F)); + } else { + var c2 = data.getUint8(this.position++); + var c3 = data.getUint8(this.position++); + + value += String.fromCharCode(((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 << 6) & 0x7F) | (data.getUint8(this.position++) & 0x7F)); + } + } + + return value; + }; + + ByteArray.prototype.readInt = function () { + var data = new DataView(this.arraybytes); + var int = data.getInt32(this.position, true); + + this.position += 4; + + return int; + }; + + ByteArray.prototype.readShort = function () { + var data = new DataView(this.arraybytes); + var short = data.getInt16(this.position, true); + + this.position += 2; + return short; + }; + + ByteArray.prototype.readDouble = function () { + var data = new DataView(this.arraybytes); + var double = data.getFloat64(this.position, true); + + this.position += 8; + return double; + }; + + ByteArray.prototype.readUnsignedShort = function () { + if (this.position > this.length + 2) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + if ((this.position & 1) == 0) { + var view = new Uint16Array(this.arraybytes); + var pa = this.position >> 1; + this.position += 2; + return view[pa]; + } else { + var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 2); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); + view3.set(view2); + this.position += 2; + return view[0]; + } + }; + + ByteArray.prototype.writeUnsignedInt = function (b) { + this.ensureWriteableSpace(4); + if ((this.position & 3) == 0) { + var view = new Uint32Array(this.arraybytes); + view[this.position >> 2] = (~~b) & 0xffffffff; // ~~ is cast to int in js... + } else { + var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); + view[0] = (~~b) & 0xffffffff; + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view2.set(view3); + } + this.position += 4; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readUnsignedInt = function () { + if (this.position > this.length + 4) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + if ((this.position & 3) == 0) { + var view = new Uint32Array(this.arraybytes); + var pa = this.position >> 2; + this.position += 4; + return view[pa]; + } else { + var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view3.set(view2); + this.position += 4; + return view[0]; + } + }; + + ByteArray.prototype.writeFloat = function (b) { + this.ensureWriteableSpace(4); + if ((this.position & 3) == 0) { + var view = new Float32Array(this.arraybytes); + view[this.position >> 2] = b; + } else { + var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); + view[0] = b; + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view2.set(view3); + } + this.position += 4; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readFloat = function () { + if (this.position > this.length + 4) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + if ((this.position & 3) == 0) { + var view = new Float32Array(this.arraybytes); + var pa = this.position >> 2; + this.position += 4; + return view[pa]; + } else { + var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view3.set(view2); + this.position += 4; + return view[0]; + } + }; + return ByteArray; +})(ByteArrayBase); + +module.exports = ByteArray; + + +},{"awayjs-core/lib/utils/ByteArrayBase":undefined}],"awayjs-core/lib/utils/CSS":[function(require,module,exports){ +var CSS = (function () { + function CSS() { + } + CSS.setElementSize = function (element, width, height) { + element.style.width = width + "px"; + element.style.height = height + "px"; + element["width"] = width; + element["height"] = height; + }; + + CSS.setElementWidth = function (element, width) { + element.style.width = width + "px"; + element["width"] = width; + }; + + CSS.setElementHeight = function (element, height) { + element.style.height = height + "px"; + element["height"] = height; + }; + + CSS.setElementX = function (element, x) { + element.style.position = 'absolute'; + element.style.left = x + "px"; + }; + + CSS.setElementY = function (element, y) { + element.style.position = 'absolute'; + element.style.top = y + "px"; + }; + + CSS.getElementVisibility = function (element) { + return element.style.visibility == 'visible'; + }; + + CSS.setElementVisibility = function (element, visible) { + if (visible) { + element.style.visibility = 'visible'; + } else { + element.style.visibility = 'hidden'; + } + }; + + CSS.setElementAlpha = function (element, alpha) { + if (element instanceof HTMLCanvasElement) { + var context = element.getContext("2d"); + context.globalAlpha = alpha; + } + }; + + CSS.setElementPosition = function (element, x, y, absolute) { + if (typeof absolute === "undefined") { absolute = false; } + if (absolute) { + element.style.position = "absolute"; + } else { + element.style.position = "relative"; + } + + element.style.left = x + "px"; + element.style.top = y + "px"; + }; + return CSS; +})(); + +module.exports = CSS; + + +},{}],"awayjs-core/lib/utils/Cast":[function(require,module,exports){ +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var CastError = require("awayjs-core/lib/errors/CastError"); +var BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); +var ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); +var ByteArray = require("awayjs-core/lib/utils/ByteArray"); + +/** +* Helper class for casting assets to usable objects +*/ +var Cast = (function () { + function Cast() { + } + Cast.string = function (data) { + if (typeof (data) == 'function') + data = new data; + + if (typeof (data) == 'string') + return data; + + return data; + }; + + Cast.byteArray = function (data) { + if (typeof (data) == 'function') + data = new data; + + if (data instanceof ByteArray) + return data; + + return data; + }; + + // public static xml(data:any):XML + // { + // if (typeof(data) == 'function') + // data = new data; + // + // if (data is XML) + // return data; + // + // return XML(data); + // } + Cast.isHex = function (str) { + var length = str.length; + for (var i = 0; i < length; ++i) { + if (this._hexChars.indexOf(str.charAt(i)) == -1) + return false; + } + + return true; + }; + + Cast.tryColor = function (data) { + if (typeof (data) == 'number') + return Math.floor(data); + + if (typeof (data) == 'string') { + if (data == "random") + return Math.floor(Math.random() * 0x1000000); + + if (this._colorNames == null) { + this._colorNames = new Object(); + this._colorNames["steelblue"] = 0x4682B4; + this._colorNames["royalblue"] = 0x041690; + this._colorNames["cornflowerblue"] = 0x6495ED; + this._colorNames["lightsteelblue"] = 0xB0C4DE; + this._colorNames["mediumslateblue"] = 0x7B68EE; + this._colorNames["slateblue"] = 0x6A5ACD; + this._colorNames["darkslateblue"] = 0x483D8B; + this._colorNames["midnightblue"] = 0x191970; + this._colorNames["navy"] = 0x000080; + this._colorNames["darkblue"] = 0x00008B; + this._colorNames["mediumblue"] = 0x0000CD; + this._colorNames["blue"] = 0x0000FF; + this._colorNames["dodgerblue"] = 0x1E90FF; + this._colorNames["deepskyblue"] = 0x00BFFF; + this._colorNames["lightskyblue"] = 0x87CEFA; + this._colorNames["skyblue"] = 0x87CEEB; + this._colorNames["lightblue"] = 0xADD8E6; + this._colorNames["powderblue"] = 0xB0E0E6; + this._colorNames["azure"] = 0xF0FFFF; + this._colorNames["lightcyan"] = 0xE0FFFF; + this._colorNames["paleturquoise"] = 0xAFEEEE; + this._colorNames["mediumturquoise"] = 0x48D1CC; + this._colorNames["lightseagreen"] = 0x20B2AA; + this._colorNames["darkcyan"] = 0x008B8B; + this._colorNames["teal"] = 0x008080; + this._colorNames["cadetblue"] = 0x5F9EA0; + this._colorNames["darkturquoise"] = 0x00CED1; + this._colorNames["aqua"] = 0x00FFFF; + this._colorNames["cyan"] = 0x00FFFF; + this._colorNames["turquoise"] = 0x40E0D0; + this._colorNames["aquamarine"] = 0x7FFFD4; + this._colorNames["mediumaquamarine"] = 0x66CDAA; + this._colorNames["darkseagreen"] = 0x8FBC8F; + this._colorNames["mediumseagreen"] = 0x3CB371; + this._colorNames["seagreen"] = 0x2E8B57; + this._colorNames["darkgreen"] = 0x006400; + this._colorNames["green"] = 0x008000; + this._colorNames["forestgreen"] = 0x228B22; + this._colorNames["limegreen"] = 0x32CD32; + this._colorNames["lime"] = 0x00FF00; + this._colorNames["chartreuse"] = 0x7FFF00; + this._colorNames["lawngreen"] = 0x7CFC00; + this._colorNames["greenyellow"] = 0xADFF2F; + this._colorNames["yellowgreen"] = 0x9ACD32; + this._colorNames["palegreen"] = 0x98FB98; + this._colorNames["lightgreen"] = 0x90EE90; + this._colorNames["springgreen"] = 0x00FF7F; + this._colorNames["mediumspringgreen"] = 0x00FA9A; + this._colorNames["darkolivegreen"] = 0x556B2F; + this._colorNames["olivedrab"] = 0x6B8E23; + this._colorNames["olive"] = 0x808000; + this._colorNames["darkkhaki"] = 0xBDB76B; + this._colorNames["darkgoldenrod"] = 0xB8860B; + this._colorNames["goldenrod"] = 0xDAA520; + this._colorNames["gold"] = 0xFFD700; + this._colorNames["yellow"] = 0xFFFF00; + this._colorNames["khaki"] = 0xF0E68C; + this._colorNames["palegoldenrod"] = 0xEEE8AA; + this._colorNames["blanchedalmond"] = 0xFFEBCD; + this._colorNames["moccasin"] = 0xFFE4B5; + this._colorNames["wheat"] = 0xF5DEB3; + this._colorNames["navajowhite"] = 0xFFDEAD; + this._colorNames["burlywood"] = 0xDEB887; + this._colorNames["tan"] = 0xD2B48C; + this._colorNames["rosybrown"] = 0xBC8F8F; + this._colorNames["sienna"] = 0xA0522D; + this._colorNames["saddlebrown"] = 0x8B4513; + this._colorNames["chocolate"] = 0xD2691E; + this._colorNames["peru"] = 0xCD853F; + this._colorNames["sandybrown"] = 0xF4A460; + this._colorNames["darkred"] = 0x8B0000; + this._colorNames["maroon"] = 0x800000; + this._colorNames["brown"] = 0xA52A2A; + this._colorNames["firebrick"] = 0xB22222; + this._colorNames["indianred"] = 0xCD5C5C; + this._colorNames["lightcoral"] = 0xF08080; + this._colorNames["salmon"] = 0xFA8072; + this._colorNames["darksalmon"] = 0xE9967A; + this._colorNames["lightsalmon"] = 0xFFA07A; + this._colorNames["coral"] = 0xFF7F50; + this._colorNames["tomato"] = 0xFF6347; + this._colorNames["darkorange"] = 0xFF8C00; + this._colorNames["orange"] = 0xFFA500; + this._colorNames["orangered"] = 0xFF4500; + this._colorNames["crimson"] = 0xDC143C; + this._colorNames["red"] = 0xFF0000; + this._colorNames["deeppink"] = 0xFF1493; + this._colorNames["fuchsia"] = 0xFF00FF; + this._colorNames["magenta"] = 0xFF00FF; + this._colorNames["hotpink"] = 0xFF69B4; + this._colorNames["lightpink"] = 0xFFB6C1; + this._colorNames["pink"] = 0xFFC0CB; + this._colorNames["palevioletred"] = 0xDB7093; + this._colorNames["mediumvioletred"] = 0xC71585; + this._colorNames["purple"] = 0x800080; + this._colorNames["darkmagenta"] = 0x8B008B; + this._colorNames["mediumpurple"] = 0x9370DB; + this._colorNames["blueviolet"] = 0x8A2BE2; + this._colorNames["indigo"] = 0x4B0082; + this._colorNames["darkviolet"] = 0x9400D3; + this._colorNames["darkorchid"] = 0x9932CC; + this._colorNames["mediumorchid"] = 0xBA55D3; + this._colorNames["orchid"] = 0xDA70D6; + this._colorNames["violet"] = 0xEE82EE; + this._colorNames["plum"] = 0xDDA0DD; + this._colorNames["thistle"] = 0xD8BFD8; + this._colorNames["lavender"] = 0xE6E6FA; + this._colorNames["ghostwhite"] = 0xF8F8FF; + this._colorNames["aliceblue"] = 0xF0F8FF; + this._colorNames["mintcream"] = 0xF5FFFA; + this._colorNames["honeydew"] = 0xF0FFF0; + this._colorNames["lightgoldenrodyellow"] = 0xFAFAD2; + this._colorNames["lemonchiffon"] = 0xFFFACD; + this._colorNames["cornsilk"] = 0xFFF8DC; + this._colorNames["lightyellow"] = 0xFFFFE0; + this._colorNames["ivory"] = 0xFFFFF0; + this._colorNames["floralwhite"] = 0xFFFAF0; + this._colorNames["linen"] = 0xFAF0E6; + this._colorNames["oldlace"] = 0xFDF5E6; + this._colorNames["antiquewhite"] = 0xFAEBD7; + this._colorNames["bisque"] = 0xFFE4C4; + this._colorNames["peachpuff"] = 0xFFDAB9; + this._colorNames["papayawhip"] = 0xFFEFD5; + this._colorNames["beige"] = 0xF5F5DC; + this._colorNames["seashell"] = 0xFFF5EE; + this._colorNames["lavenderblush"] = 0xFFF0F5; + this._colorNames["mistyrose"] = 0xFFE4E1; + this._colorNames["snow"] = 0xFFFAFA; + this._colorNames["white"] = 0xFFFFFF; + this._colorNames["whitesmoke"] = 0xF5F5F5; + this._colorNames["gainsboro"] = 0xDCDCDC; + this._colorNames["lightgrey"] = 0xD3D3D3; + this._colorNames["silver"] = 0xC0C0C0; + this._colorNames["darkgrey"] = 0xA9A9A9; + this._colorNames["grey"] = 0x808080; + this._colorNames["lightslategrey"] = 0x778899; + this._colorNames["slategrey"] = 0x708090; + this._colorNames["dimgrey"] = 0x696969; + this._colorNames["darkslategrey"] = 0x2F4F4F; + this._colorNames["black"] = 0x000000; + this._colorNames["transparent"] = 0xFF000000; + } + + if (this._colorNames[data] != null) + return this._colorNames[data]; + + if ((data.length == 6) && this.isHex(data)) + return parseInt("0x" + data); + } + + return null; + }; + + Cast.color = function (data) { + var result = this.tryColor(data); + + if (result == null) + throw new CastError("Can't cast to color: " + data); + + return result; + }; + + Cast.tryClass = function (name) { + if (this._notClasses[name]) + return name; + + var result = this._classes[name]; + + if (result != null) + return result; + + try { + result = window[name]; + this._classes[name] = result; + return result; + } catch (e) { + } + + this._notClasses[name] = true; + + return name; + }; + + Cast.bitmapData = function (data) { + if (data == null) + return null; + + if (typeof (data) == 'string') + data = this.tryClass(data); + + if (typeof (data) == 'function') { + try { + data = new data(); + } catch (e) { + data = new data(0, 0); + } + } + + if (data instanceof BitmapData) + return data; + + if (data instanceof ImageTexture) + data = data.htmlImageElement; + + if (data instanceof HTMLImageElement) { + var imageElement = data; + var bitmapData = new BitmapData(imageElement.width, imageElement.height, true, 0x0); + bitmapData.draw(imageElement); + return bitmapData; + } + + throw new CastError("Can't cast to BitmapData: " + data); + }; + + Cast.bitmapTexture = function (data) { + if (data == null) + return null; + + if (typeof (data) == 'string') + data = this.tryClass(data); + + if (typeof (data) == 'function') { + try { + data = new data(); + } catch (e) { + data = new data(0, 0); + } + } + + if (data instanceof BitmapTexture) + return data; + + try { + var bmd = Cast.bitmapData(data); + return new BitmapTexture(bmd); + } catch (e) { + } + + throw new CastError("Can't cast to BitmapTexture: " + data); + }; + Cast._hexChars = "0123456789abcdefABCDEF"; + + Cast._notClasses = new Object(); + Cast._classes = new Object(); + return Cast; +})(); + +module.exports = Cast; + + +},{"awayjs-core/lib/core/base/BitmapData":undefined,"awayjs-core/lib/errors/CastError":undefined,"awayjs-core/lib/textures/BitmapTexture":undefined,"awayjs-core/lib/textures/ImageTexture":undefined,"awayjs-core/lib/utils/ByteArray":undefined}],"awayjs-core/lib/utils/ColorUtils":[function(require,module,exports){ +/** +* +*/ +var ColorUtils = (function () { + function ColorUtils() { + } + ColorUtils.float32ColorToARGB = function (float32Color) { + var a = (float32Color & 0xff000000) >>> 24; + var r = (float32Color & 0xff0000) >>> 16; + var g = (float32Color & 0xff00) >>> 8; + var b = float32Color & 0xff; + var result = [a, r, g, b]; + + return result; + }; + + ColorUtils.componentToHex = function (c) { + var hex = c.toString(16); + return hex.length == 1 ? "0" + hex : hex; + }; + + ColorUtils.RGBToHexString = function (argb) { + return "#" + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); + }; + + ColorUtils.ARGBToHexString = function (argb) { + return "#" + ColorUtils.componentToHex(argb[0]) + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); + }; + return ColorUtils; +})(); + +module.exports = ColorUtils; + + +},{}],"awayjs-core/lib/utils/Debug":[function(require,module,exports){ +var PartialImplementationError = require("awayjs-core/lib/errors/PartialImplementationError"); + +/** +* +*/ +var Debug = (function () { + function Debug() { + } + Debug.breakpoint = function () { + Debug['break'](); + }; + + Debug.throwPIROnKeyWordOnly = function (str, enable) { + if (typeof enable === "undefined") { enable = true; } + if (!enable) + Debug.keyword = null; + else + Debug.keyword = str; + }; + + Debug.throwPIR = function (clss, fnc, msg) { + Debug.logPIR('PartialImplementationError ' + clss, fnc, msg); + + if (Debug.THROW_ERRORS) { + if (Debug.keyword) { + var e = clss + fnc + msg; + + if (e.indexOf(Debug.keyword) == -1) + return; + } + + throw new PartialImplementationError(clss + '.' + fnc + ': ' + msg); + } + }; + + Debug.logPIR = function (clss, fnc, msg) { + if (typeof msg === "undefined") { msg = ''; } + if (Debug.LOG_PI_ERRORS) + console.log(clss + '.' + fnc + ': ' + msg); + }; + + Debug.log = function () { + var args = []; + for (var _i = 0; _i < (arguments.length - 0); _i++) { + args[_i] = arguments[_i + 0]; + } + if (Debug.ENABLE_LOG) + console.log(args); + }; + Debug.THROW_ERRORS = true; + Debug.ENABLE_LOG = true; + Debug.LOG_PI_ERRORS = true; + + Debug.keyword = null; + return Debug; +})(); + +module.exports = Debug; + + +},{"awayjs-core/lib/errors/PartialImplementationError":undefined}],"awayjs-core/lib/utils/RequestAnimationFrame":[function(require,module,exports){ +var getTimer = require("awayjs-core/lib/utils/getTimer"); + +var RequestAnimationFrame = (function () { + function RequestAnimationFrame(callback, callbackContext) { + var _this = this; + this._active = false; + this._argsArray = new Array(); + this._getTimer = getTimer; + + this.setCallback(callback, callbackContext); + + this._rafUpdateFunction = function () { + if (_this._active) + _this._tick(); + }; + + this._argsArray.push(this._dt); + } + // Public + /** + * + * @param callback + * @param callbackContext + */ + RequestAnimationFrame.prototype.setCallback = function (callback, callbackContext) { + this._callback = callback; + this._callbackContext = callbackContext; + }; + + /** + * + */ + RequestAnimationFrame.prototype.start = function () { + this._prevTime = this._getTimer(); + this._active = true; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(this._rafUpdateFunction); + } else { + if (window['mozRequestAnimationFrame']) + window.requestAnimationFrame = window['mozRequestAnimationFrame']; + else if (window['webkitRequestAnimationFrame']) + window.requestAnimationFrame = window['webkitRequestAnimationFrame']; + else if (window['oRequestAnimationFrame']) + window.requestAnimationFrame = window['oRequestAnimationFrame']; + } + }; + + /** + * + */ + RequestAnimationFrame.prototype.stop = function () { + this._active = false; + }; + + Object.defineProperty(RequestAnimationFrame.prototype, "active", { + // Get / Set + /** + * + * @returns {boolean} + */ + get: function () { + return this._active; + }, + enumerable: true, + configurable: true + }); + + // Private + /** + * + * @private + */ + RequestAnimationFrame.prototype._tick = function () { + this._currentTime = this._getTimer(); + this._dt = this._currentTime - this._prevTime; + this._argsArray[0] = this._dt; + this._callback.apply(this._callbackContext, this._argsArray); + + window.requestAnimationFrame(this._rafUpdateFunction); + + this._prevTime = this._currentTime; + }; + return RequestAnimationFrame; +})(); + +module.exports = RequestAnimationFrame; + + +},{"awayjs-core/lib/utils/getTimer":undefined}],"awayjs-core/lib/utils/TextureUtils":[function(require,module,exports){ +var TextureUtils = (function () { + function TextureUtils() { + } + TextureUtils.isBitmapDataValid = function (bitmapData) { + if (bitmapData == null) { + return true; + } + + return TextureUtils.isDimensionValid(bitmapData.width) && TextureUtils.isDimensionValid(bitmapData.height); + }; + + TextureUtils.isHTMLImageElementValid = function (image) { + if (image == null) + return true; + + return TextureUtils.isDimensionValid(image.width) && TextureUtils.isDimensionValid(image.height); + }; + + TextureUtils.isDimensionValid = function (d) { + return d >= 1 && d <= TextureUtils.MAX_SIZE && TextureUtils.isPowerOfTwo(d); + }; + + TextureUtils.isPowerOfTwo = function (value) { + return value ? ((value & -value) == value) : false; + }; + + TextureUtils.getBestPowerOf2 = function (value) { + var p = 1; + + while (p < value) + p <<= 1; + + if (p > TextureUtils.MAX_SIZE) + p = TextureUtils.MAX_SIZE; + + return p; + }; + TextureUtils.MAX_SIZE = 2048; + return TextureUtils; +})(); + +module.exports = TextureUtils; + + +},{}],"awayjs-core/lib/utils/Timer":[function(require,module,exports){ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var TimerEvent = require("awayjs-core/lib/events/TimerEvent"); + +var Timer = (function (_super) { + __extends(Timer, _super); + function Timer(delay, repeatCount) { + if (typeof repeatCount === "undefined") { repeatCount = 0; } + _super.call(this); + this._repeatCount = 0; + this._currentCount = 0; + this._running = false; + + this._delay = delay; + this._repeatCount = repeatCount; + + if (isNaN(delay) || delay < 0) { + throw new Error("Delay is negative or not a number"); + } + } + Object.defineProperty(Timer.prototype, "currentCount", { + get: function () { + return this._currentCount; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Timer.prototype, "delay", { + get: function () { + return this._delay; + }, + set: function (value) { + this._delay = value; + + if (this._running) { + this.stop(); + this.start(); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Timer.prototype, "repeatCount", { + get: function () { + return this._repeatCount; + }, + set: function (value) { + this._repeatCount = value; + }, + enumerable: true, + configurable: true + }); + + + Timer.prototype.reset = function () { + if (this._running) { + this.stop(); + } + + this._currentCount = 0; + }; + + Object.defineProperty(Timer.prototype, "running", { + get: function () { + return this._running; + }, + enumerable: true, + configurable: true + }); + + Timer.prototype.start = function () { + var _this = this; + this._running = true; + clearInterval(this._iid); + this._iid = setInterval(function () { + return _this.tick(); + }, this._delay); + }; + + Timer.prototype.stop = function () { + this._running = false; + clearInterval(this._iid); + }; + + Timer.prototype.tick = function () { + this._currentCount++; + + if ((this._repeatCount > 0) && this._currentCount >= this._repeatCount) { + this.stop(); + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER)); + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE)); + } else { + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER)); + } + }; + return Timer; +})(EventDispatcher); + +module.exports = Timer; + + +},{"awayjs-core/lib/errors/Error":undefined,"awayjs-core/lib/events/EventDispatcher":undefined,"awayjs-core/lib/events/TimerEvent":undefined}],"awayjs-core/lib/utils/getTimer":[function(require,module,exports){ +/** +* +* +* @returns {number} +*/ +function getTimer() { + // number milliseconds of 1970/01/01 + // this different to AS3 implementation which gets the number of milliseconds + // since instance of Flash player was initialised + return Date.now(); +} + +module.exports = getTimer; + + +},{}]},{},[]) + + +//# sourceMappingURL=awayjs-core.js.map \ No newline at end of file diff --git a/build/awayjs-core.js.map b/build/awayjs-core.js.map new file mode 100644 index 00000000..a0b53780 --- /dev/null +++ b/build/awayjs-core.js.map @@ -0,0 +1,475 @@ +{ + "version": 3, + "sources": [ + "node_modules/browserify/node_modules/browser-pack/_prelude.js", + "animators/IAnimationSet.ts", + "animators/IAnimator.ts", + "animators/nodes/AnimationNodeBase.ts", + "bounds/AxisAlignedBoundingBox.ts", + "bounds/BoundingSphere.ts", + "bounds/BoundingVolumeBase.ts", + "bounds/NullBounds.ts", + "containers/DisplayObjectContainer.ts", + "containers/Loader.ts", + "containers/Scene.ts", + "containers/View.ts", + "controllers/ControllerBase.ts", + "controllers/FirstPersonController.ts", + "controllers/FollowController.ts", + "controllers/HoverController.ts", + "controllers/LookAtController.ts", + "controllers/SpringController.ts", + "core/base/AlignmentMode.ts", + "core/base/BitmapDataChannel.ts", + "core/base/BitmapData.ts", + "core/base/BlendMode.ts", + "core/base/CapsStyle.ts", + "core/base/DisplayObject.ts", + "core/base/Geometry.ts", + "core/base/GradientType.ts", + "core/base/GraphicsPathWinding.ts", + "core/base/Graphics.ts", + "core/base/IBitmapDrawable.ts", + "core/base/IGraphicsData.ts", + "core/base/IMaterialOwner.ts", + "core/base/IStage.ts", + "core/base/ISubMeshClass.ts", + "core/base/ISubMesh.ts", + "core/base/InterpolationMethod.ts", + "core/base/JointStyle.ts", + "core/base/LightBase.ts", + "core/base/LineScaleMode.ts", + "core/base/LineSubGeometry.ts", + "core/base/LineSubMesh.ts", + "core/base/LoaderInfo.ts", + "core/base/OrientationMode.ts", + "core/base/PixelSnapping.ts", + "core/base/SpreadMethod.ts", + "core/base/SubGeometryBase.ts", + "core/base/SubMeshBase.ts", + "core/base/TriangleCulling.ts", + "core/base/TriangleSubGeometry.ts", + "core/base/TriangleSubMesh.ts", + "core/display/ContextMode.ts", + "core/display/IContext.ts", + "core/geom/Box.ts", + "core/geom/ColorTransform.ts", + "core/geom/MathConsts.ts", + "core/geom/Matrix3DUtils.ts", + "core/geom/Matrix3D.ts", + "core/geom/Matrix.ts", + "core/geom/Orientation3D.ts", + "core/geom/PerspectiveProjection.ts", + "core/geom/Plane3D.ts", + "core/geom/PlaneClassification.ts", + "core/geom/Point.ts", + "core/geom/PoissonLookup.ts", + "core/geom/Quaternion.ts", + "core/geom/Rectangle.ts", + "core/geom/Transform.ts", + "core/geom/UVTransform.ts", + "core/geom/Vector3D.ts", + "core/library/AssetLibraryBundle.ts", + "core/library/AssetLibraryIterator.ts", + "core/library/AssetLibrary.ts", + "core/library/AssetLoaderContext.ts", + "core/library/AssetLoaderToken.ts", + "core/library/AssetLoader.ts", + "core/library/AssetType.ts", + "core/library/ConflictPrecedence.ts", + "core/library/ConflictStrategyBase.ts", + "core/library/ConflictStrategy.ts", + "core/library/ErrorConflictStrategy.ts", + "core/library/IAsset.ts", + "core/library/IDUtil.ts", + "core/library/IgnoreConflictStrategy.ts", + "core/library/NamedAssetBase.ts", + "core/library/NumSuffixConflictStrategy.ts", + "core/net/CrossDomainPolicy.ts", + "core/net/URLLoaderDataFormat.ts", + "core/net/URLLoader.ts", + "core/net/URLRequestMethod.ts", + "core/net/URLRequest.ts", + "core/net/URLVariables.ts", + "core/partition/CameraNode.ts", + "core/partition/DirectionalLightNode.ts", + "core/partition/EntityNode.ts", + "core/partition/LightProbeNode.ts", + "core/partition/NodeBase.ts", + "core/partition/NullNode.ts", + "core/partition/Partition.ts", + "core/partition/PointLightNode.ts", + "core/partition/SkyboxNode.ts", + "core/pick/IPicker.ts", + "core/pick/IPickingCollider.ts", + "core/pick/PickingCollisionVO.ts", + "core/pick/RaycastPicker.ts", + "core/pool/CSSBillboardRenderable.ts", + "core/pool/CSSLineSegmentRenderable.ts", + "core/pool/CSSRenderableBase.ts", + "core/pool/CSSSkyboxRenderable.ts", + "core/pool/EntityListItemPool.ts", + "core/pool/EntityListItem.ts", + "core/pool/IMaterialData.ts", + "core/pool/IMaterialPassData.ts", + "core/pool/IRenderableClass.ts", + "core/pool/IRenderable.ts", + "core/pool/ITextureData.ts", + "core/pool/RenderablePool.ts", + "core/render/CSSDefaultRenderer.ts", + "core/render/CSSRendererBase.ts", + "core/render/IRenderer.ts", + "core/sort/IEntitySorter.ts", + "core/sort/RenderableMergeSort.ts", + "core/text/AntiAliasType.ts", + "core/text/GridFitType.ts", + "core/text/TextFieldAutoSize.ts", + "core/text/TextFieldType.ts", + "core/text/TextFormatAlign.ts", + "core/text/TextFormat.ts", + "core/text/TextInteractionMode.ts", + "core/text/TextLineMetrics.ts", + "core/traverse/CSSEntityCollector.ts", + "core/traverse/CollectorBase.ts", + "core/traverse/EntityCollector.ts", + "core/traverse/ICollector.ts", + "core/traverse/RaycastCollector.ts", + "core/traverse/ShadowCasterCollector.ts", + "core/ui/Keyboard.ts", + "entities/Billboard.ts", + "entities/Camera.ts", + "entities/DirectionalLight.ts", + "entities/IEntity.ts", + "entities/LightProbe.ts", + "entities/LineSegment.ts", + "entities/Mesh.ts", + "entities/PointLight.ts", + "entities/Shape.ts", + "entities/Skybox.ts", + "entities/TextField.ts", + "errors/AbstractMethodError.ts", + "errors/ArgumentError.ts", + "errors/CastError.ts", + "errors/DocumentError.ts", + "errors/Error.ts", + "errors/PartialImplementationError.ts", + "errors/RangeError.ts", + "events/AssetEvent.ts", + "events/CameraEvent.ts", + "events/DisplayObjectEvent.ts", + "events/EventDispatcher.ts", + "events/Event.ts", + "events/GeometryEvent.ts", + "events/HTTPStatusEvent.ts", + "events/IEventDispatcher.ts", + "events/IOErrorEvent.ts", + "events/LightEvent.ts", + "events/LoaderEvent.ts", + "events/MaterialEvent.ts", + "events/MouseEvent.ts", + "events/ParserEvent.ts", + "events/ProgressEvent.ts", + "events/ProjectionEvent.ts", + "events/RendererEvent.ts", + "events/ResizeEvent.ts", + "events/SceneEvent.ts", + "events/StageEvent.ts", + "events/SubGeometryEvent.ts", + "events/TimerEvent.ts", + "managers/MouseManager.ts", + "materials/CSSMaterialBase.ts", + "materials/LightSources.ts", + "materials/MaterialBase.ts", + "materials/lightpickers/LightPickerBase.ts", + "materials/lightpickers/StaticLightPicker.ts", + "materials/passes/IMaterialPass.ts", + "materials/shadowmappers/CascadeShadowMapper.ts", + "materials/shadowmappers/CubeMapShadowMapper.ts", + "materials/shadowmappers/DirectionalShadowMapper.ts", + "materials/shadowmappers/NearDirectionalShadowMapper.ts", + "materials/shadowmappers/ShadowMapperBase.ts", + "parsers/CubeTextureParser.ts", + "parsers/ParserBase.ts", + "parsers/ParserDataFormat.ts", + "parsers/ParserUtils.ts", + "parsers/ResourceDependency.ts", + "parsers/Texture2DParser.ts", + "prefabs/PrefabBase.ts", + "prefabs/PrimitiveCapsulePrefab.ts", + "prefabs/PrimitiveConePrefab.ts", + "prefabs/PrimitiveCubePrefab.ts", + "prefabs/PrimitiveCylinderPrefab.ts", + "prefabs/PrimitivePlanePrefab.ts", + "prefabs/PrimitivePolygonPrefab.ts", + "prefabs/PrimitivePrefabBase.ts", + "prefabs/PrimitiveSpherePrefab.ts", + "prefabs/PrimitiveTorusPrefab.ts", + "projections/CoordinateSystem.ts", + "projections/FreeMatrixProjection.ts", + "projections/IProjection.ts", + "projections/ObliqueNearPlaneProjection.ts", + "projections/OrthographicOffCenterProjection.ts", + "projections/OrthographicProjection.ts", + "projections/PerspectiveProjection.ts", + "projections/ProjectionBase.ts", + "textures/BitmapCubeTexture.ts", + "textures/BitmapTexture.ts", + "textures/CubeTextureBase.ts", + "textures/ImageCubeTexture.ts", + "textures/ImageTexture.ts", + "textures/MipmapGenerator.ts", + "textures/RenderTexture.ts", + "textures/SpecularBitmapTexture.ts", + "textures/Texture2DBase.ts", + "textures/TextureProxyBase.ts", + "utils/ByteArrayBase.ts", + "utils/ByteArrayBuffer.ts", + "utils/ByteArray.ts", + "utils/CSS.ts", + "utils/Cast.ts", + "utils/ColorUtils.ts", + "utils/Debug.ts", + "utils/RequestAnimationFrame.ts", + "utils/TextureUtils.ts", + "utils/Timer.ts", + "utils/getTimer.ts" + ], + "names": [], + "mappings": "AAAA;ACAA;AAgDuB;;;AChDvB;AAmDmB;;;;;;;;;ACnDnB,iEAAwE;;AAExE,2EAAiF;;AAEjF;;EAEG;AACH;IAAgC,oCAAc;IAY7C;;MADG;IACH;QAEC,WAAM,KAAA,CAAC;IACR,CAAC;IAXD;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAaD;;MADG;0CACH;IAEA,CAAC;;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,SAAS,CAAC,cAAc;QAChC,CAAC;;;;AAAA,IACF,yBAAC;AAAD,CAAC,EA/B+B,cAAc,EA+B7C;;AAED,kCAA2B,CAAA;;;;;;;;;;ACxC3B,6EAAmF;;AAEnF,sEAA6E;AAC7E,kFAAwF;;AAExF,4DAAqE;;AAGrE;;;EAGG;AACH;IAAqC,yCAAkB;IAYtD;;MADG;IACH;QAEC,WAAM,KAAA,CAAC;QAZR,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAC5B,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAC5B,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAC5B,KAAQ,aAAa,GAAU,CAAC,CAAC;QACjC,KAAQ,aAAa,GAAU,CAAC,CAAC;QACjC,KAAQ,aAAa,GAAU,CAAC,CAAC;IAQjC,CAAC;IAKD;;MADG;+CACH;QAEC,gBAAK,CAAC,OAAO,KAAC,KAAA,CAAC;;QAEf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;QACjD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC;IACjE,CAAC;;IAKD;;MADG;mDACH,UAAmB,MAAqB,EAAE,SAAgB;QAEzD,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,CAAE;YAE1C,IAAI,KAAK,GAAW,MAAM,CAAC,CAAC,CAAC;YAC7B,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;YACtB,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;YACtB,IAAI,cAAc,GAAU,CAAC,GAAG,CAAC,GAAE,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;YAC3E,IAAI,cAAc,GAAU,CAAC,GAAG,CAAC,GAAE,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;YAC3E,IAAI,cAAc,GAAU,CAAC,GAAG,CAAC,GAAE,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa;YAC3E,IAAI,QAAQ,GAAU,CAAC,GAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,GAAC,CAAC,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,GAAG,KAAK,CAAC,CAAC;;YAE5I,IAAI,QAAQ,GAAG,CAAC;gBACf,OAAO,KAAK,CAAC;SACd;;QAED,OAAO,IAAI;IACZ,CAAC;;IAED,mDAAA,UAAuB,QAAiB,EAAE,SAAkB,EAAE,YAAqB;QAGlF,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC;YAC/B,OAAO,CAAC,CAAC;;QAEV,IAAI,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1C,IAAI,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1C,IAAI,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;;QAE1C,IAAI,EAAE,GAAU,SAAS,CAAC,CAAC;QAC3B,IAAI,EAAE,GAAU,SAAS,CAAC,CAAC;QAC3B,IAAI,EAAE,GAAU,SAAS,CAAC,CAAC;;QAE3B,IAAI,EAAE;QACN,IAAI,EAAE;QACN,IAAI,EAAE;QACN,IAAI,gBAAgB;;QAEpB,kBAAkB;QAClB,IAAI,UAAU;QACd,IAAI,EAAE,GAAG,CAAC,CAAE;YACX,gBAAgB,GAAG,CAAE,IAAI,CAAC,aAAa,GAAG,EAAE,CAAE,GAAC,EAAE;YACjD,IAAI,gBAAgB,GAAG,CAAC,CAAE;gBACzB,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAE;oBAC/G,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC;;oBAElB,UAAU,GAAG,IAAI;iBACjB;aACD;SACD;QACD,IAAI,CAAC,UAAU,IAAI,EAAE,GAAG,CAAC,CAAE;YAC1B,gBAAgB,GAAG,CAAE,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAE,GAAC,EAAE;YAClD,IAAI,gBAAgB,GAAG,CAAC,CAAE;gBACzB,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAE;oBAC/G,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;oBACnB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,UAAU,GAAG,IAAI;iBACjB;aACD;SACD;QACD,IAAI,CAAC,UAAU,IAAI,EAAE,GAAG,CAAC,CAAE;YAC1B,gBAAgB,GAAG,CAAE,IAAI,CAAC,aAAa,GAAG,EAAE,CAAE,GAAC,EAAE;YACjD,IAAI,gBAAgB,GAAG,CAAC,CAAE;gBACzB,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAE;oBAC/G,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,UAAU,GAAG,IAAI;iBACjB;aACD;SACD;QACD,IAAI,CAAC,UAAU,IAAI,EAAE,GAAG,CAAC,CAAE;YAC1B,gBAAgB,GAAG,CAAE,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAE,GAAC,EAAE;YAClD,IAAI,gBAAgB,GAAG,CAAC,CAAE;gBACzB,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAE;oBAC/G,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;oBACnB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,UAAU,GAAG,IAAI;iBACjB;aACD;SACD;QACD,IAAI,CAAC,UAAU,IAAI,EAAE,GAAG,CAAC,CAAE;YAC1B,gBAAgB,GAAG,CAAE,IAAI,CAAC,aAAa,GAAG,EAAE,CAAE,GAAC,EAAE;YACjD,IAAI,gBAAgB,GAAG,CAAC,CAAE;gBACzB,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAE;oBAC/G,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,UAAU,GAAG,IAAI;iBACjB;aACD;SACD;QACD,IAAI,CAAC,UAAU,IAAI,EAAE,GAAG,CAAC,CAAE;YAC1B,gBAAgB,GAAG,CAAE,CAAC,IAAI,CAAC,aAAa,GAAG,EAAE,CAAE,GAAC,EAAE;YAClD,IAAI,gBAAgB,GAAG,CAAC,CAAE;gBACzB,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,IAAI,CAAC,aAAa,CAAE;oBAC/G,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC;oBAClB,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC;oBACnB,UAAU,GAAG,IAAI;iBACjB;aACD;SACD;;QAED,OAAO,UAAU,GAAE,gBAAgB,GAAG,CAAC,CAAC;IACzC,CAAC;;IAKD;;MADG;qDACH,UAAqB,QAAiB;QAErC,IAAI,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1H,OAAO,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,aAAa;IAC/K,CAAC;;IAKD;;MADG;oDACH,UAAoB,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW;QAG/F,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;QAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;QAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;QAChC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;QACrC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;QACrC,IAAI,CAAC,aAAa,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;;QAErC,gBAAK,CAAC,YAAY,KAAC,OAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IAEvD,CAAC;;IAKD;;MADG;6CACH;QAEC,IAAI,KAAK,GAA0B,IAAI,sBAAsB,CAAC,CAAC;QAC/D,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAChK,OAAO,KAAK;IACb,CAAC;;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAQD;;;;;MADG;2DACH,UAA2B,KAAc,EAAE,MAAsB;QAAtB,qCAAA,MAAM,GAAY,IAAI;AAAA,QAEhE,IAAI,CAAC;;QAEL,IAAI,MAAM,IAAI,IAAI;YACjB,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;QAEzB,CAAC,GAAG,KAAK,CAAC,CAAC;QACX,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;YACtC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACrC,MAAM,CAAC,CAAC,GAAG,CAAC;;QAEZ,CAAC,GAAG,KAAK,CAAC,CAAC;QACX,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;YACvC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACtC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB,MAAM,CAAC,CAAC,GAAG,CAAC;;QAEZ,CAAC,GAAG,KAAK,CAAC,CAAC;QACX,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAClB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;YACtC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACrC,MAAM,CAAC,CAAC,GAAG,CAAC;;QAEZ,OAAO,MAAM;IACd,CAAC;;IAED,6DAAA;QAEC,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAC,CAAC,EAAE,KAAK,CAAC;QAC/E,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAC,CAAC,EAAE,KAAK,CAAC;QAC/E,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,GAAC,CAAC,EAAE,KAAK,CAAC;QAC/E,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1D,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1D,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;IAC3D,CAAC;;IAED,yDAAA;QAEC,OAAO,IAAI;IACZ,CAAC;;IAED,mDAAA,UAAuB,KAAa;QAEnC,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;QACtB,IAAI,cAAc,GAAU,CAAC,GAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;;QAEzF,IAAI,CAAC,GAAG,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,CAAC;;QAER,IAAI,CAAC,GAAG,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,CAAC;;QAER,IAAI,CAAC,GAAG,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,CAAC;;QAER,IAAI,WAAW,GAAU,CAAC,GAAC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAC,IAAI,CAAC,aAAa,GAAG,CAAC,GAAC,IAAI,CAAC,aAAa;;QAE3F,OAAO,cAAc,GAAG,WAAW,GAAE,mBAAmB,CAAC,KAAK,GAAG,cAAc,GAAG,CAAC,WAAW,GAAE,mBAAmB,CAAC,IAAI,GAAG,mBAAmB,CAAC,SAAS;IACzJ,CAAC;;IAED,iDAAA,UAAqB,MAAyB,EAAE,MAAe;QAE9D,IAAI,IAAI,GAAmD,MAAM;QACjE,IAAI,EAAE,GAAU,IAAI,CAAC,QAAQ;QAC7B,IAAI,EAAE,GAAU,IAAI,CAAC,QAAQ;QAC7B,IAAI,EAAE,GAAU,IAAI,CAAC,QAAQ;QAC7B,IAAI,GAAG,GAAY,aAAa,CAAC,kBAAkB;;QAEnD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;;QAEzB,IAAI,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,EAAE,CAAC;QACvF,IAAI,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,EAAE,CAAC;QACvF,IAAI,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,EAAE,CAAC;;QAExF,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,GAAG;QAC9C,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,GAAG;QAC9C,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,GAAG;;QAE9C,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,EAAE,GAAU,IAAI,CAAC,aAAa;QAClC,IAAI,EAAE,GAAU,IAAI,CAAC,aAAa;QAClC,IAAI,EAAE,GAAU,IAAI,CAAC,aAAa;QAClC,IAAI,CAAC,aAAa,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG;QAC7C,IAAI,CAAC,aAAa,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG;QAC7C,IAAI,CAAC,aAAa,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG;;QAE7C,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,GAAC,CAAC;QAC9E,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa;QACjD,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa;QACjD,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,aAAa;IAClD,CAAC;IACF,8BAAC;AAAD,CAAC,EAvUoC,kBAAkB,EAuUtD;;AAED,uCAAgC,CAAA;;;;;;;;;;ACrVhC,6EAAmF;;AAGnF,kFAAwF;;AAGxF,4DAAqE;;AAGrE;IAA6B,iCAAkB;IAQ9C;QAEC,WAAM,KAAA,CAAC;QAPR,KAAQ,OAAO,GAAU,CAAC,CAAC;QAC3B,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAC5B,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAC5B,KAAQ,QAAQ,GAAU,CAAC,CAAC;IAK5B,CAAC;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;;;;AAAA;IAED,mCAAA;QAEC,gBAAK,CAAC,OAAO,KAAC,KAAA,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,CAAC;IACjB,CAAC;;IAED,uCAAA,UAAmB,MAAqB,EAAE,SAAgB;QAEzD,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,CAAE;YAC1C,IAAI,KAAK,GAAW,MAAM,CAAC,CAAC,CAAC;YAC7B,IAAI,cAAc,GAAU,KAAK,CAAC,CAAC,GAAG,CAAC,GAAE,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;YACrE,IAAI,cAAc,GAAU,KAAK,CAAC,CAAC,GAAG,CAAC,GAAE,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;YACrE,IAAI,cAAc,GAAU,KAAK,CAAC,CAAC,GAAG,CAAC,GAAE,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;YACrE,IAAI,QAAQ,GAAU,KAAK,CAAC,CAAC,GAAC,CAAE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAE,GAAG,KAAK,CAAC,CAAC,GAAC,CAAE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAC,GAAG,KAAK,CAAC,CAAC,GAAC,CAAE,IAAI,CAAC,QAAQ,GAAG,cAAc,CAAE,GAAG,KAAK,CAAC,CAAC;YACnK,IAAI,QAAQ,GAAG,CAAC,CAAE;gBACjB,OAAO,KAAK;aACZ;SACD;QACD,OAAO,IAAI;IACZ,CAAC;;IAED,sCAAA,UAAkB,MAAe,EAAE,MAAa;QAE/C,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM;QACrB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,GAAC,CAAC;QAClE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM;QACrC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM;QACrC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM;QACrC,IAAI,CAAC,iBAAiB,GAAG,IAAI;;QAE7B,IAAI,IAAI,CAAC,gBAAgB;YACxB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/B,CAAC;;IAED,wCAAA,UAAoB,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW;QAE/F,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;QAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;QAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAC,EAAE;;QAEhC,IAAI,CAAC,GAAU,IAAI,GAAG,IAAI;QAC1B,IAAI,CAAC,GAAU,IAAI,GAAG,IAAI;QAC1B,IAAI,CAAC,GAAU,IAAI,GAAG,IAAI;;QAE1B,IAAI,CAAC,GAAG,CAAC;YACR,CAAC,GAAG,CAAC,CAAC;;QAEP,IAAI,CAAC,GAAG,CAAC;YACR,CAAC,GAAG,CAAC,CAAC;;QAEP,IAAI,CAAC,OAAO,GAAG,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,gBAAK,CAAC,YAAY,KAAC,OAAA,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IACvD,CAAC;;IAED,iCAAA;QAEC,IAAI,KAAK,GAAkB,IAAI,cAAc,CAAC,CAAC;QAC/C,KAAK,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;QACzF,OAAO,KAAK;IACb,CAAC;;IAED,2CAAA,UAAuB,QAAiB,EAAE,SAAkB,EAAE,YAAqB;QAElF,IAAI,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAE;YACjC,OAAO,CAAC;SACR;;QAED,IAAI,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1H,IAAI,EAAE,GAAU,SAAS,CAAC,CAAC,EAAE,EAAE,GAAU,SAAS,CAAC,CAAC,EAAE,EAAE,GAAU,SAAS,CAAC,CAAC;QAC7E,IAAI,gBAAgB;;QAEpB,IAAI,CAAC,GAAU,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE;QACpC,IAAI,CAAC,GAAU,CAAC,GAAC,CAAE,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAE;QAC1C,IAAI,CAAC,GAAU,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,OAAO;QAChE,IAAI,GAAG,GAAU,CAAC,GAAC,CAAC,GAAG,CAAC,GAAC,CAAC,GAAC,CAAC;;QAE5B,IAAI,GAAG,IAAI,CAAC,CAAE;YACb,IAAI,OAAO,GAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YACnC,gBAAgB,GAAG,CAAE,CAAC,CAAC,GAAG,OAAO,CAAE,GAAC,CAAE,CAAC,GAAC,CAAC,CAAE;YAC3C,IAAI,gBAAgB,IAAI,CAAC,CAAE;gBAC1B,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBACzC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBACzC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,gBAAgB,GAAC,EAAE;gBACzC,YAAY,CAAC,SAAS,CAAC,CAAC;;gBAExB,OAAO,gBAAgB;aACvB;SACD;;QAED,oBAAoB;QACpB,OAAO,CAAC,CAAC;IACV,CAAC;;IAED,yCAAA,UAAqB,QAAiB;QAErC,IAAI,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1C,IAAI,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1C,IAAI,EAAE,GAAU,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC1C,IAAI,QAAQ,GAAU,IAAI,CAAC,IAAI,CAAC,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;QACtD,OAAO,QAAQ,IAAI,IAAI,CAAC,OAAO;IAChC,CAAC;;IAED,iDAAA;QAEC,IAAI,EAAE,GAAU,IAAI,CAAC,OAAO;QAC5B,IAAI,EAAE,IAAI,CAAC;YACV,EAAE,GAAG,KAAK,CAAC;;QAEZ,IAAI,SAAS,GAAa,IAAI,CAAC,gBAAgB,CAAC,SAAS;QACzD,SAAS,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC1C,SAAS,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;IAC/E,CAAC;;IAID,0DAF0D;qDAE1D;QAEC,OAAO,IAAI;IACZ,CAAC;;IAID,WADW;+CACX,UAAuB,KAAa;QAEnC,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC;QACtB,IAAI,EAAE,GAAU,CAAC,GAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC;;QAE7E,IAAI,CAAC,GAAG,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,CAAC;;QAER,IAAI,CAAC,GAAG,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,CAAC;;QAER,IAAI,CAAC,GAAG,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,CAAC;;QAER,IAAI,EAAE,GAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO;;QAExC,OAAO,EAAE,GAAG,EAAE,GAAE,mBAAmB,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,GAAE,mBAAmB,CAAC,IAAI,GAAG,mBAAmB,CAAC,SAAS;IAC/G,CAAC;;IAED,yCAAA,UAAqB,MAAyB,EAAE,MAAe;QAE9D,IAAI,MAAM,GAAmC,MAAM;QACnD,IAAI,EAAE,GAAU,MAAM,CAAC,QAAQ;QAC/B,IAAI,EAAE,GAAU,MAAM,CAAC,QAAQ;QAC/B,IAAI,EAAE,GAAU,MAAM,CAAC,QAAQ;QAC/B,IAAI,GAAG,GAAiB,IAAI,KAAK,CAAS,EAAE,CAAC;;QAE7C,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;;QAEzB,IAAI,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,EAAE,CAAC;QACvF,IAAI,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,EAAE,CAAC;QACvF,IAAI,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,EAAE,CAAC,EAAE,GAAG,GAAU,GAAG,CAAC,EAAE,CAAC;;QAExF,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,GAAG;QAC9C,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,GAAG;QAC9C,IAAI,CAAC,QAAQ,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,EAAE,GAAC,GAAG,GAAG,GAAG;;QAE9C,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;QACZ,IAAI,GAAG,GAAG,CAAC;YACV,GAAG,GAAG,CAAC,GAAG,CAAC;;QAEZ,IAAI,CAAC,GAAU,MAAM,CAAC,OAAO;QAC7B,IAAI,EAAE,GAAU,GAAG,GAAG,GAAG,GAAG,GAAG;QAC/B,IAAI,EAAE,GAAU,GAAG,GAAG,GAAG,GAAG,GAAG;QAC/B,IAAI,EAAE,GAAU,GAAG,GAAG,GAAG,GAAG,GAAG;QAC/B,IAAI,CAAC,OAAO,GAAG,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;;QAEjD,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,GAAC,CAAC;QACxE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO;QAC3C,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO;QAC3C,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO;IAC5C,CAAC;IACF,sBAAC;AAAD,CAAC,EArN4B,kBAAkB,EAqN9C;;AAED,+BAAwB,CAAA;;;;AChOxB,kDAE4D;;AAK5D,+EAAqF;;AAErF;IAOC;QAJA,KAAO,YAAY,GAAiB,IAAI,KAAK,CAAS,CAAC,CAAC;QACxD,KAAO,iBAAiB,GAAW,IAAI,CAAC;QAKvC,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC;IACvB,CAAC;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,KAAK;QAClB,CAAC;;;;AAAA;IAED;QAAA,KAAA;YAEC,IAAI,IAAI,CAAC,iBAAiB;gBACzB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;;YAE1B,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAED;QAAA,KAAA;YAEC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAE;gBAC3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACpD,IAAI,CAAC,qBAAqB,CAAC,CAAC;aAC5B;;YAED,OAAO,IAAI,CAAC,gBAAgB;QAC7B,CAAC;;;;AAAA;IAED,uCAAA;QAEC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC;QAC9C,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC;QAC3D,IAAI,CAAC,iBAAiB,GAAG,IAAI;;QAE7B,IAAI,IAAI,CAAC,gBAAgB;YACxB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/B,CAAC;;IAED,iDAAA;QAEC,IAAI,IAAI,CAAC,gBAAgB;YACxB,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;;QAEjC,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC7B,CAAC;;IAED,4CAAA,UAAoB,QAAsB;QAEzC,IAAI,CAAC;QACL,IAAI,GAAG,GAAU,QAAQ,CAAC,MAAM;QAChC,IAAI,IAAI,EAAS,IAAI,EAAS,IAAI;QAClC,IAAI,IAAI,EAAS,IAAI,EAAS,IAAI;;QAElC,IAAI,GAAG,IAAI,CAAC,CAAE;YACb,IAAI,CAAC,OAAO,CAAC,CAAC;YACd,MAAO;SACP;;QAED,IAAI,CAAC;;QAEL,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC3B,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC3B,IAAI,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;;QAE3B,OAAO,CAAC,GAAG,GAAG,CAAE;YACf,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,IAAI;gBACX,IAAI,GAAG,CAAC;iBAAO,IAAI,CAAC,GAAG,IAAI;gBAC3B,IAAI,GAAG,CAAC,CAAC;YACV,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,IAAI;gBACX,IAAI,GAAG,CAAC;iBAAO,IAAI,CAAC,GAAG,IAAI;gBAC3B,IAAI,GAAG,CAAC,CAAC;YACV,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,IAAI;gBACX,IAAI,GAAG,CAAC;iBAAO,IAAI,CAAC,GAAG,IAAI;gBAC3B,IAAI,GAAG,CAAC,CAAC;SACV;;QAED,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;IACtD,CAAC;;IAOD;;;;MADG;gDACH,UAAoB,QAAiB;QAEpC,IAAI,CAAC,EAAS,CAAC,EAAS,CAAC;QACzB,IAAI,QAAQ,GAA0B,QAAQ,CAAC,aAAa;QAC5D,IAAI,OAAO;QACX,IAAI,iBAAiB;QACrB,IAAI,WAAW,GAAU,QAAQ,CAAC,MAAM;QACxC,IAAI,IAAI,EAAS,IAAI,EAAS,IAAI;QAClC,IAAI,IAAI,EAAS,IAAI,EAAS,IAAI;;QAElC,IAAI,WAAW,GAAG,CAAC,CAAE;YACpB,CAAC,GAAG,CAAC;YACL,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;YACrB,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAClD,IAAI,GAAG,IAAI,GAAG,iBAAiB,CAAC,CAAC,CAAC;YAClC,IAAI,GAAG,IAAI,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,GAAG,IAAI,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;;YAEtC,CAAC,GAAG,WAAW;YACf,OAAO,CAAC,EAAE,CAAE;gBACX,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC;gBACrB,iBAAiB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;gBAClD,CAAC,GAAG,iBAAiB,CAAC,MAAM;gBAC5B,OAAO,CAAC,EAAE,CAAE;oBACX,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;oBACxB,IAAI,CAAC,GAAG,IAAI;wBACX,IAAI,GAAG,CAAC;yBACJ,IAAI,CAAC,GAAG,IAAI;wBAChB,IAAI,GAAG,CAAC,CAAC;;oBAEV,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;;oBAE5B,IAAI,CAAC,GAAG,IAAI;wBACX,IAAI,GAAG,CAAC;yBACJ,IAAI,CAAC,GAAG,IAAI;wBAChB,IAAI,GAAG,CAAC,CAAC;;oBAEV,CAAC,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,CAAC;;oBAE5B,IAAI,CAAC,GAAG,IAAI;wBACX,IAAI,GAAG,CAAC;yBACJ,IAAI,CAAC,GAAG,IAAI;wBAChB,IAAI,GAAG,CAAC,CAAC;iBACV;aACD;;YAED,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;SACrD,KAAM;YACN,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;SACnC;IACF,CAAC;;IAED,0CAAA,UAAkB,MAAe,EAAE,MAAa;QAE/C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;IACpI,CAAC;;IAED,4CAAA,UAAoB,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW;QAE/F,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI;QACnB,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI;QACnB,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI;QACnB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI;QAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,GAAG,IAAI;QAC/B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI;QAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI;;QAE7B,IAAI,IAAI,CAAC,gBAAgB;YACxB,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/B,CAAC;;IAED,2CAAA,UAAmB,MAAqB,EAAE,SAAgB;QAEzD,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED,wCAAA,UAAgB,MAAyB;QAExC,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;IAC1C,CAAC;;IAED,qCAAA;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED,+CAAA,UAAuB,QAAiB,EAAE,SAAkB,EAAE,YAAqB;QAElF,OAAO,CAAC,CAAC;IACV,CAAC;;IAED,6CAAA,UAAqB,QAAiB;QAErC,OAAO,KAAK;IACb,CAAC;;IAED,iDAAA;QAEC,IAAI,IAAI,GAAU,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,GAAU,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM;QAClD,IAAI,IAAI,GAAU,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,GAAU,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;QACjD,IAAI,IAAI,GAAU,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,IAAI,GAAU,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK;;QAEjD,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;QAC3B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,IAAI;QAC5B,IAAI,CAAC,iBAAiB,GAAG,KAAK;IAC/B,CAAC;;IAED,qDAAA;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED,qDAAA;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED,+CAAA,UAAuB,KAAa;QAEnC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED,6CAAA,UAAqB,MAAyB,EAAE,MAAe;QAE9D,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;IACF,0BAAC;AAAD,CAAC,IAAA;;AAED,mCAA4B,CAAA;;;;;;;;;;AChQ5B,6EAAmF;;AAEnF,kFAAwF;;AAKxF;IAAyB,6BAAkB;IAI1C,oBAAY,QAAuB;QAAvB,uCAAA,QAAQ,GAAW,IAAI;AAAA,QAElC,WAAM,KAAA,CAAC;;QAEP,IAAI,CAAC,SAAS,GAAG,QAAQ;;QAEzB,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM,CAAC,iBAAiB;QAClF,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,GAAE,MAAM,CAAC,iBAAiB,GAAC,CAAC,GAAG,MAAM,CAAC,iBAAiB;IACnH,CAAC;IAGD,WADW;iCACX;QAEC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;IACtC,CAAC;;IAGD,WADW;iDACX;QAEC,+FAA+F;QAC/F,OAAO,IAAI;IACZ,CAAC;;IAGD,WADW;uCACX,UAAmB,MAAqB,EAAE,SAAgB;QAEzD,OAAO,IAAI,CAAC,SAAS;IACtB,CAAC;;IAQD,eANc;IACf,oDAAoD;IACpD,KAAK;IACL,KAAK;IAEJ,WAAW;sCACX,UAAkB,MAAe,EAAE,MAAa;IAEhD,CAAC;;IAGD,WADW;wCACX,UAAoB,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW,EAAE,IAAW;IAEhG,CAAC;;IAED,uCAAA,UAAuB,KAAa;QAEnC,OAAO,mBAAmB,CAAC,SAAS;IACrC,CAAC;;IAGD,WADW;yCACX,UAAqB,MAAyB,EAAE,MAAe;QAE9D,IAAI,CAAC,SAAS,GAAG,MAAoB,CAAE,SAAS;IACjD,CAAC;IACF,kBAAC;AAAD,CAAC,EA1DwB,kBAAkB,EA0D1C;;AAED,2BAAoB,CAAA;;;;;;;;;;ACnEpB,sEAC6E;;AAG7E,iEAAyE;;AAEzE,mEAA0E;AAC1E,mDAA4D;AAC5D,6DAAqE;;AAErE;;;;;;;;;;;;;;;;;;;;EAoBG;AACH;IAAqC,yCAAa;IAmFjD;;;;;;;;;MADG;IACH;QAEC,WAAM,KAAA,CAAC;QAnFR,KAAQ,cAAc,GAAW,IAAI,CAAC;QACtC,KAAQ,SAAS,GAAwB,IAAI,KAAK,CAAgB,CAAC,CAAC;IAmFpE,CAAC;IA7ED;QAAA;;UADG;aACH;YAEC,OAAO,SAAS,CAAC,SAAS;QAC3B,CAAC;;;;AAAA;IAuBD;QAAA;;;;;;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;QAED,KAAA,UAAyB,KAAa;YAErC,IAAI,IAAI,CAAC,cAAc,IAAI,KAAK;gBAC/B,MAAO,CAAA;;YAER,IAAI,CAAC,cAAc,GAAG,KAAK;;YAE3B,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,GAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;QACrF,CAAC;;;;AAVA;;IAeD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM;QAC7B,CAAC;;;;AAAA;IA8DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;gDACH,UAAgB,KAAmB;QAElC,IAAI,KAAK,IAAI,IAAI;YAChB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;;QAEpD,2CAA2C;QAC3C,IAAI,KAAK,CAAC,QAAQ;YACjB,KAAK,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;;QAE3C,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;;QAEtB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;;QAE1B,OAAO,KAAK;IACb,CAAC;;IAgCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;kDACH,UAAkB,KAAmB,EAAE,KAAY,CAAC,OAAO;QAE1D,OAAO,KAAK;IACb,CAAC;;IAED,+CAAA;QAAmB,IAAG,UAAU;AAAqB,aAAlC,WAAkC,CAAlC,2BAAkC,EAAlC,IAAkC;YAAlC,mCAAkC;;QAEpD,IAAI,GAAG,GAAU,UAAU,CAAC,MAAM;QAClC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAI,GAAG,EAAE,CAAC,EAAE;YACnC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;;IAKD;;MADG;6CACH;QAEC,IAAI,KAAK,GAA0B,IAAI,sBAAsB,CAAC,CAAC;QAC/D,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;QACxB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAClC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;QAChC,KAAK,CAAC,IAAI,GAAG,IAAI;;QAEjB,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;QACtC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;QAE3C,mCAAmC;QACnC,OAAO,KAAK;IACb,CAAC;;IAcD;;;;;;;;;;;MADG;gDACH,UAAgB,KAAmB;QAElC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;IAC1C,CAAC;;IAKD;;MADG;2DACH;QAEC,IAAI,CAAC,OAAO,CAAC,CAAC;;QAEd,OAAO,IAAI,CAAC,WAAW,GAAG,CAAC;YAC1B,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/B,CAAC;;IAWD;;;;;;;;MADG;kDACH,UAAkB,KAAY,CAAC,OAAO;QAErC,IAAI,KAAK,GAAiB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;;QAE/C,IAAI,KAAK,IAAI,IAAI;YAChB,MAAM,IAAI,UAAU,CAAC,sDAAsD,CAAC,CAAC;;QAE9E,OAAO,KAAK;IACb,CAAC;;IAgBD;;;;;;;;;;;;;MADG;sDACH,UAAsB,IAAW;QAEhC,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;QACtC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI;gBACjC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;;QAE3B,OAAO,IAAI;IACZ,CAAC;;IAUD;;;;;;;MADG;qDACH,UAAqB,KAAmB;QAEvC,IAAI,UAAU,GAAU,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC;;QAErD,IAAI,UAAU,IAAI,CAAC,CAAC;YACnB,MAAM,IAAI,aAAa,CAAC,8CAA8C,CAAC,CAAC;;QAEzE,OAAO,UAAU;IAClB,CAAC;;IAqBD;;;;;;;;;;;;;;;;;;MADG;4DACH,UAA4B,KAAW;QAEtC,OAAO,IAAI,KAAK,CAAgB,CAAC;IAClC,CAAC;;IAqBD;;;;;;;;;;;;;;;;;;MADG;mDACH,UAAmB,KAAmB;QAErC,IAAI,KAAK,IAAI,IAAI;YAChB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;;QAEnD,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;;QAE/B,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;;QAEtB,OAAO,KAAK;IACb,CAAC;;IAwBD;;;;;;;;;;;;;;;;;;;;;MADG;qDACH,UAAqB,KAAY,CAAC,OAAO;QAExC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;;IAkBD;;;;;;;;;;;;;;;MADG;sDACH,UAAsB,UAA6B,EAAE,QAAoC;QAAnE,yCAAA,UAAU,GAAkB,CAAC;AAAA,QAAE,uCAAA,QAAQ,GAAkB,UAAU;AAAA,QAExF,IAAI,UAAU,GAAG,CAAC;YACjB,MAAM,IAAI,UAAU,CAAC,8CAA8C,CAAC,CAAC;;QAEtE,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM;YACnC,MAAM,IAAI,UAAU,CAAC,4CAA4C,CAAC,CAAC;;QAEpE,KAAI,IAAI,CAAC,GAAmB,UAAU,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE;YACxD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;;IA8BD;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;qDACH,UAAqB,KAAmB,EAAE,KAAY,CAAC,OAAO;QAE7D,MAAM;IACP,CAAC;;IAYD;;;;;;;;;MADG;oDACH,UAAoB,MAAoB,EAAE,MAAoB;QAE7D,MAAM;IACP,CAAC;;IAWD;;;;;;;;MADG;sDACH,UAAsB,MAAa,CAAC,OAAO,GAAE,MAAa,CAAC,OAAO;QAEjE,MAAM;IACP,CAAC;;IAKD;;MADG;iEACH;QAEC,gBAAK,CAAC,yBAAyB,KAAC,KAAA,CAAC;;QAEjC,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;QACtC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC;IAChD,CAAC;;IAKD;;MADG;qDACH,UAAqB,KAAW;QAE/B,gBAAK,CAAC,aAAa,KAAC,OAAA,KAAK,CAAC;;QAE1B,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;QACtC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;;IAKD;;MADG;oEACH,UAAoC,KAAa;QAEhD,gBAAK,CAAC,4BAA4B,KAAC,OAAA,KAAK,CAAC;;QAEzC,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;QACtC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtE,CAAC;;IAKD;;MADG;kEACH,UAAkC,KAAa;QAE9C,gBAAK,CAAC,0BAA0B,KAAC,OAAA,KAAK,CAAC;;QAEvC,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;QACtC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC1E,CAAC;;IAKD;;MADG;iEACH,UAAiC,KAAe;QAE/C,gBAAK,CAAC,yBAAyB,KAAC,OAAA,KAAK,CAAC;;QAEtC,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;QACtC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IACxE,CAAC;;IAOD;;;;MADG;2DACH,UAA4B,KAAmB;QAE9C,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;;QAEnD,OAAO,KAAK;IACb,CAAC;IACF,8BAAC;AAAD,CAAC,EA/gBoC,aAAa,EA+gBjD;;AAED,uCAAgC,CAAA;;;;;;;;;;AChjBhC,yFAA8F;;AAG9F,mFAAyF;AACzF,qEAA6E;;AAI7E,6DAAqE;;AAErE,iEAAyE;AACzE,+DAAuE;AACvE,+DAAuE;;AAGvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8DG;AACH;IAAqB,yBAAsB;IAsH1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;IACH,gBAAY,eAA8B,EAAE,cAA4B;QAA5D,8CAAA,eAAe,GAAW,IAAI;AAAA,QAAE,6CAAA,cAAc,GAAU,IAAI;AAAA,QAAxE,iBAUC;QARA,WAAM,KAAA,CAAC;;QAEP,IAAI,CAAC,gBAAgB,GAAG,IAAI,KAAK,CAAc,CAAC;QAChD,IAAI,CAAC,YAAY,GAAG,eAAe;QACnC,IAAI,CAAC,WAAW,GAAG,cAAc;;QAEjC,IAAI,CAAC,2BAA2B,GAAG,UAAC,KAAiB;mBAAK,KAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;QAA9B,CAA8B;QACxF,IAAI,CAAC,wBAAwB,GAAG,UAAC,KAAgB;mBAAK,KAAI,CAAC,eAAe,CAAC,KAAK,CAAC;QAA3B,CAA2B;IAClF,CAAC;IApFD;QAAA;;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;;;;AAAA;IAkBD;QAAA;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,kBAAkB;QAC/B,CAAC;;;;AAAA;IAmED;;;;MADG;6BACH;QAEC,IAAI,IAAI,CAAC,YAAY,CAAE;YACtB,IAAI,GAAG;YACP,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;YACtD,GAAG,CAAC,sBAAsB,CAAC,CAAC;YAC5B,IAAI,CAAC,gBAAgB,GAAG,IAAI;YAC5B,MAAM;SACN;QACD,IAAI,CAAC;QACL,IAAI,MAAM,GAAkB,IAAI,CAAC,gBAAgB,CAAC,MAAM;QACxD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,CAAE;YAC5B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;SAC/B;QACD,IAAI,CAAC,gBAAgB,GAAG,IAAI;IAC7B,CAAC;;IAyKD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;4BACH,UAAY,OAAkB,EAAE,OAAiC,EAAE,EAAgB,EAAE,MAAwB;QAA7E,sCAAA,OAAO,GAAsB,IAAI;AAAA,QAAE,iCAAA,EAAE,GAAU,IAAI;AAAA,QAAE,qCAAA,MAAM,GAAc,IAAI;AAAA,QAE5G,IAAI,KAAK;;QAET,IAAI,IAAI,CAAC,YAAY,CAAE;YACtB,IAAI,GAAG;YACP,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;YACtD,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC;SAC9C,KAAM;YACN,IAAI,MAAM,GAAe,IAAI,WAAW,CAAC,CAAC;YAC1C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC;SACjD;;QAED,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,2BAA2B,CAAC;QACvF,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,wBAAwB,CAAC;;QAEhF,uEAAuE;QACvE,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;QAClD,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC;;QAExD,OAAO,KAAK;IACb,CAAC;;IAwFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;gCACH,UAAgB,IAAQ,EAAE,OAAiC,EAAE,EAAgB,EAAE,MAAwB;QAA7E,sCAAA,OAAO,GAAsB,IAAI;AAAA,QAAE,iCAAA,EAAE,GAAU,IAAI;AAAA,QAAE,qCAAA,MAAM,GAAc,IAAI;AAAA,QAEtG,IAAI,KAAK;;QAET,IAAI,IAAI,CAAC,YAAY,CAAE;YACtB,IAAI,GAAG;YACP,GAAG,GAAG,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC;YACtD,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC;SAC/C,KAAM;YACN,IAAI,MAAM,GAAe,IAAI,WAAW,CAAC,CAAC;YAC1C,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;YAClC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC;SACtD;;QAED,KAAK,CAAC,gBAAgB,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,2BAA2B,CAAC;QACvF,KAAK,CAAC,gBAAgB,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,wBAAwB,CAAC;;QAEhF,uEAAuE;QACvE,KAAK,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;QAClD,KAAK,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,YAAY,CAAC;;QAExD,OAAO,KAAK;IACb,CAAC;;IAyBD;;;;;;;;;;;;;;;;;;;;;;MADG;8BACH;QAEC,MAAM;IACP,CAAC;;IAWD;;;;;;;;MADG;0BACH,UAA2B,WAAkB;QAE5C,WAAW,CAAC,YAAY,CAAC,WAAW,CAAC;IACtC,CAAC;;IAWD;;;;;;;;MADG;2BACH,UAA4B,aAA2B;QAEtD,WAAW,CAAC,aAAa,CAAC,aAAa,CAAC;IACzC,CAAC;;IAGD,mCAAA,UAAwB,UAA0B;QAEjD,UAAU,CAAC,mBAAmB,CAAC,WAAW,CAAC,iBAAiB,EAAE,IAAI,CAAC,2BAA2B,CAAC;QAC/F,UAAU,CAAC,mBAAmB,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,wBAAwB,CAAC;IACzF,CAAC;;IAED,mCAAA,UAAwB,KAAgB;QAEvC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1B,CAAC;;IAKD;;MADG;mCACH,UAAoB,KAAiB;QAEpC,IAAI,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAE;YACjD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YACzB,OAAO,IAAI;SACX,KAAM;YACN,OAAO,KAAK;SACZ;IACF,CAAC;;IAKD;;MADG;oCACH,UAAqB,KAAiB;QAErC,IAAI,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAE;YACnD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YACzB,OAAO,IAAI;SACX,KAAM;YACN,OAAO,KAAK;SACZ;IACF,CAAC;;IAKD;;MADG;0CACH,UAA2B,KAAiB;QAE3C,IAAI,OAAO,GAAiB,KAAK,CAAC,OAAO;;QAEzC,IAAI,CAAC,QAAQ,GAAG,OAAO;;QAEvB,IAAI,OAAO;YACV,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;;QAExB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;IAC1B,CAAC;IACF,cAAC;AAAD,CAAC,EAnjBoB,sBAAsB,EAmjB1C;;AAED,uBAAgB,CAAA;;;;;;;;;;ACnoBhB,yFAA8F;;AAE9F,iEAA0E;AAC1E,mEAA2E;;AAE3E,uEAA8E;AAC9E,6DAAqE;;AAErE;IAAoB,wBAAe;IAQlC;QAEC,WAAM,KAAA,CAAC;QARR,KAAQ,mBAAmB,GAAoB,IAAI,KAAK,CAAY,CAAC,CAAC;QACtE,KAAQ,WAAW,GAAoB,IAAI,KAAK,CAAY,CAAC,CAAC;QAG9D,KAAO,gBAAgB,GAAG,CAAC,CAAC;;QAM3B,IAAI,CAAC,gBAAgB,GAAG,IAAI,sBAAsB,CAAC,CAAC;;QAEpD,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,IAAI,CAAC;QACtC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,GAAG,IAAI;QACrC,IAAI,CAAC,gBAAgB,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,qCAAA,UAA0B,SAAoB;QAE7C,IAAI,CAAC,GAAU,CAAC;QAChB,IAAI,GAAG,GAAU,IAAI,CAAC,WAAW,CAAC,MAAM;;QAExC,SAAS,CAAC,KAAK,GAAG,IAAI;;QAEtB,OAAO,CAAC,GAAG,GAAG,CAAE;YACf,IAAI,CAAC,gBAAgB,EAAE;YACvB,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;SACzC;IACF,CAAC;;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS;QACvC,CAAC;QAED,KAAA,UAAqB,KAAe;YAEnC,IAAI,CAAC,gBAAgB,CAAC,SAAS,GAAG,KAAK;;YAEvC,IAAI,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACxF,CAAC;;;;AAPA;;IASD,2BAAA,UAAgB,KAAmB;QAElC,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7C,CAAC;;IAED,2BAAA,UAAgB,KAAmB;QAElC,OAAO,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC7C,CAAC;;IAED,8BAAA,UAAmB,KAAmB;QAErC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,KAAK,CAAC;IACzC,CAAC;;IAED,gCAAA,UAAqB,KAAY;QAEhC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,KAAK,CAAC;IAC3C,CAAC;;IAGD,6BAAA,UAAkB,KAAY;QAE7B,OAAO,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,KAAK,CAAC;IAC/C,CAAC;;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW;QACzC,CAAC;;;;AAAA;IAKD;;MADG;sCACH,UAAuB,aAA2B;QAEjD,IAAI,aAAa,CAAC,SAAS;YAC1B,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;;QAElD,IAAI,aAAa,CAAC,QAAQ;YACzB,aAAa,CAAC,mBAAmB,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;IAClE,CAAC;;IAKD;;MADG;yCACH,UAA0B,SAAmB;QAE5C,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;;QAExC,qDAAqD;QACrD,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;;IAKD;;MADG;wCACH,UAAyB,aAA2B;QAEnD,IAAI,aAAa,CAAC,SAAS;YAC1B,IAAI,CAAC,oBAAoB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;;QAEpD,IAAI,aAAa,CAAC,QAAQ;YACzB,aAAa,CAAC,mBAAmB,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;IACjE,CAAC;;IAKD;;MADG;2CACH,UAA4B,SAAmB;QAE9C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;;QAE/E,qEAAqE;QACrE,IAAI,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IACF,aAAC;AAAD,CAAC,EA1HmB,eAAe,EA0HlC;;AAED,sBAAe,CAAA;;;;ACpIf,uDAAgE;;AAOhE,sEAA6E;;AAI7E,uDAAgE;AAChE,+DAAuE;AACvE,6DAAqE;AACrE,mEAA0E;AAC1E,mEAA2E;AAC3E,wDAAiE;;AAEjE;IA0DC;;;;;;;;;MADG;IACH,cAAY,QAAkB,EAAE,KAAkB,EAAE,MAAoB;QAAxC,oCAAA,KAAK,GAAS,IAAI;AAAA,QAAE,qCAAA,MAAM,GAAU,IAAI;AAAA,QAAxE,iBAwBC;QAzDD,KAAQ,MAAM,GAAU,CAAC,CAAC;QAC1B,KAAQ,OAAO,GAAU,CAAC,CAAC;QAE3B,KAAQ,KAAK,GAAU,CAAC,CAAC;QACzB,KAAQ,UAAU,GAAU,CAAC,CAAC;QAC9B,KAAQ,gBAAgB,GAAU,QAAQ,CAAC;QAC3C,KAAQ,gBAAgB,GAAU,CAAC,CAAC;QAEpC,KAAQ,cAAc,GAAW,IAAI,CAAC;QACtC,KAAQ,aAAa,GAAW,IAAI,CAAC;QAOrC,KAAQ,YAAY,GAAW,IAAI,aAAa,CAAC,CAAC,CAAC;QAmBlD,IAAI,CAAC,gCAAgC,GAAG,UAAC,KAAgB;mBAAK,KAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;QAAnC,CAAmC;QACjG,IAAI,CAAC,4BAA4B,GAAG,UAAC,KAAiB;mBAAK,KAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC;QAA/B,CAA+B;QAC1F,IAAI,CAAC,0BAA0B,GAAG,UAAC,KAAmB;mBAAK,KAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAA7B,CAA6B;QACxF,IAAI,CAAC,yBAAyB,GAAG,UAAC,KAAmB;mBAAK,KAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;QAA5B,CAA4B;;QAEtF,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,QAAQ;;QAExB,mCAAmC;QACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;;QAElC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC;QACjD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;;QAE7C,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC;;QAE5C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC;QAEvC,4BAA4B;QAC5B,8CAA8C;IAC7C,CAAC;IAMD;;;MADG;6CACH,UAAgC,KAAgB;QAE/C,IAAI,IAAI,CAAC,QAAQ;YAChB,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;IACjD,CAAC;;IAID;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;;;;AAAA;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAID;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;QAED,KAAA,UAAoB,KAAe;YAElC,IAAI,IAAI,CAAC,UAAU,IAAI,KAAK;gBAC3B,MAAO,CAAA;;YAER,IAAI,IAAI,CAAC,UAAU,CAAE;gBACpB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;gBACzB,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,0BAA0B,CAAC;gBACpG,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,yBAAyB,CAAC;aAClG;;YAED,IAAI,CAAC,UAAU,GAAG,KAAK;;YAEvB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,gBAAgB,EAAE,IAAI,CAAC,0BAA0B,CAAC;YACjG,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,yBAAyB,CAAC;;YAE/F,wBAAwB;YACxB,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC,uBAAuB,CAAC,CAAC;;YAElE,IAAI,IAAI,CAAC,QAAQ;gBAChB,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;;YAE/C,mBAAmB;YACnB,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,GAAC,IAAI;YAC3E,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAC,IAAI;YAC1E,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAC,IAAI;YACnE,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB;YACzD,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM;YACnC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO;YACrC,IAAI,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa;QAClD,CAAC;;;;AAhCA;;IAqCD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,KAAa;YAEpC,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK;gBAC9B,MAAO,CAAA;;YAER,IAAI,CAAC,aAAa,GAAG,KAAK;;YAE1B,IAAI,IAAI,CAAC,UAAU;gBAClB,IAAI,CAAC,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;QACpD,CAAC;;;;AAXA;;IAgBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,gBAAgB;QAC7B,CAAC;QAED,KAAA,UAA2B,KAAY;YAEtC,IAAI,IAAI,CAAC,gBAAgB,IAAI,KAAK;gBACjC,MAAO,CAAA;;YAER,IAAI,CAAC,gBAAgB,GAAG,KAAK;;YAE7B,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,GAAC,IAAI;YAC3D,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAC,IAAI;YAC1D,IAAI,CAAC,UAAU,CAAC,aAAa,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAC,IAAI;QACpD,CAAC;;;;AAZA;;IAkBD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,gBAAgB;QAC7B,CAAC;QAMD;;;UADG;aACH,UAA2B,KAAY;YAEtC,IAAI,KAAK,GAAG,CAAC;gBACZ,KAAK,GAAG,CAAC;iBACL,IAAI,KAAK,GAAG,CAAC;gBACjB,KAAK,GAAG,CAAC,CAAC;;YAEX,IAAI,IAAI,CAAC,gBAAgB,IAAI,KAAK;gBACjC,MAAO,CAAA;;YAER,IAAI,CAAC,UAAU,CAAC,iBAAiB,GAAG,IAAI,CAAC,gBAAgB,GAAG,KAAK;QAClE,CAAC;;;;AAjBA;;IAuBD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAKD;;UADG;aACH,UAAkB,KAAY;YAE7B,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK;gBACzB,MAAO,CAAA;;YAER,IAAI,IAAI,CAAC,QAAQ;gBAChB,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;;YAEtG,IAAI,CAAC,QAAQ,GAAG,KAAK;;YAErB,IAAI,IAAI,CAAC,iBAAiB;gBACzB,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;;YAE/C,IAAI,IAAI,CAAC,OAAO;gBACf,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;;YAElD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,kBAAkB,EAAE,IAAI,CAAC,4BAA4B,CAAC;YACjG,IAAI,CAAC,aAAa,GAAG,IAAI;YACzB,IAAI,CAAC,cAAc,GAAG,IAAI;QAC3B,CAAC;;;;AAxBA;;IA8BD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;QAKD;;UADG;aACH,UAAiB,KAAW;YAE3B,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK;gBACxB,MAAO,CAAA;;YAER,IAAI,IAAI,CAAC,OAAO;gBACf,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,gCAAgC,CAAC,CAAC;;YAEvG,IAAI,CAAC,OAAO,GAAG,KAAK;;YAEpB,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,gCAAgC,CAAC;;YAElG,IAAI,IAAI,CAAC,QAAQ;gBAChB,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACnD,CAAC;;;;AAnBA;;IAyBD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,MAAM;QACnB,CAAC;QAED,KAAA,UAAiB,KAAY;YAE5B,IAAI,IAAI,CAAC,MAAM,IAAI,KAAK;gBACvB,MAAO,CAAA;;YAER,IAAI,CAAC,MAAM,GAAG,KAAK;YACnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,GAAC,IAAI,CAAC,OAAO;YAC5C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY;YAC1D,IAAI,CAAC,UAAU,CAAC,KAAK,GAAG,KAAK;YAC7B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,GAAG,IAAI;QAC7C,CAAC;;;;AAZA;;IAiBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;QAED,KAAA,UAAkB,KAAY;YAE7B,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK;gBACxB,MAAO,CAAA;;YAER,IAAI,CAAC,OAAO,GAAG,KAAK;YACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,GAAC,IAAI,CAAC,OAAO;YAC5C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY;YAC1D,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK;YAC9B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,GAAG,IAAI;QAC9C,CAAC;;;;AAZA;;IAiBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;QAED,KAAA,UAAuB,KAAa;YAEnC,IAAI,IAAI,CAAC,YAAY,IAAI,KAAK;gBAC7B,MAAO,CAAA;;YAER,IAAI,KAAK,IAAI,IAAI;gBAChB,IAAI,CAAC,YAAY,GAAG,IAAI,aAAa,CAAC,CAAC;;gBAEvC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B,CAAC;;;;AAXA;;IAgBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;QAED,KAAA,UAAa,KAAY;YAExB,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK;gBAC7B,MAAO,CAAA;;YAER,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK;YAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,IAAI;QAC5C,CAAC;;;;AATA;;IAcD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC;QACzB,CAAC;QAED,KAAA,UAAa,KAAY;YAExB,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK;gBAC7B,MAAO,CAAA;;YAER,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,KAAK;YAC1B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,GAAG,IAAI;QAC3C,CAAC;;;;AATA;;IAcD;QAAA;;UADG;aACH;YAEC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,IAAI,SAAS,CAAC;QACzD,CAAC;QAED,KAAA,UAAmB,KAAa;YAE/B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,UAAU,GAAG,KAAK,GAAE,SAAS,GAAG,QAAQ;YAChE,sEAAsE;QACvE,CAAC;;;;AANA;;IAYD;QAAA;;;UADG;aACH;YAEC,OAAO,CAAC;YACR,8DAA8D;QAC/D,CAAC;;;;AAAA;IAKD;;MADG;4BACH;QAEC,IAAI,CAAC,WAAW,CAAC,CAAC;;QAElB,2BAA2B;QAC3B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY;;QAE1D,IAAI,IAAI,CAAC,aAAa,CAAE;YACvB,IAAI,CAAC,aAAa,GAAG,KAAK;YAC1B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC;SACjL;;QAED,IAAI,IAAI,CAAC,cAAc,CAAE;YACxB,IAAI,CAAC,cAAc,GAAG,KAAK;YAC3B,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;SAClK;;QAED,iBAAiB;QACjB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAE;YACxB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,aAAa;gBAClH,IAAI,CAAC,aAAa,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;;YAE9G,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC;YACvD,oCAAoC;SACpC;;QACD,mCAAmC;QAEnC,6CAA6C;QAC7C,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;;QAE9B,0BAA0B;QAC1B,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,iBAAiB,CAAC;;QAEvD,6CAA6C;QAC7C,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC/C,CAAC;;IAKD;;MADG;iCACH;QAEC,IAAI,IAAI,GAAU,QAAQ,CAAC,CAAC;;QAE5B,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;YAClB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;;QAEnB,IAAI,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,KAAK;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI;IAClB,CAAC;;IAKD;;MADG;6BACH;QAEC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;;QAEzB,iDAAiD;QACjD,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC;;QAEvC,mDAAmD;QACnD,iCAAiC;QAEjC,IAAI,CAAC,aAAa,GAAG,IAAI;;QACzB,8BAA8B;QAE9B,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,iBAAiB,GAAG,IAAI;IAC9B,CAAC;;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,iBAAiB;QAC9B,CAAC;;;;AAAA;IAKD;;MADG;yCACH,UAA4B,KAAiB;QAE5C,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,cAAc,GAAG,IAAI;IAC3B,CAAC;;IAKD;;MADG;uCACH,UAA0B,KAAmB;QAE5C,IAAI,CAAC,cAAc,GAAG,IAAI;IAC3B,CAAC;;IAKD;;MADG;sCACH,UAAyB,KAAmB;QAE3C,IAAI,CAAC,aAAa,GAAG,IAAI;IAC1B,CAAC;;IAED,yBAAA,UAAe,OAAgB;QAE9B,IAAI,CAAC,GAAY,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;QAC/C,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,GAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO;QACzF,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAC,CAAC,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO;;QAE3F,OAAO,CAAC;IACT,CAAC;;IAED,2BAAA,UAAiB,EAAS,EAAE,EAAS,EAAE,EAAS;QAE/C,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,GAAC,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,GAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,GAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAC,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,GAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IAEjN,CAAC;;IAED,wBAAA,UAAc,EAAS,EAAE,EAAS,EAAE,EAAS;QAE5C,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,GAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,GAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;IACtG,CAAC;;IAgCD;;;;;MAVG;IACH;;;;;;MAMG;IAEH,oCAAoC;oCACpC;QAEC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAE;YACxB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW;gBACtD,IAAI,CAAC,aAAa,CAAC,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;SAC9G,KAAM;YACN,IAAI,eAAe,GAAsB,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC;;YAE9G,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,aAAa,CAAC,iBAAiB,IAAI,IAAI,IAAI,eAAe,CAAC,gBAAgB,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,gBAAgB;gBAC/J,IAAI,CAAC,aAAa,CAAC,iBAAiB,GAAG,eAAe,CAAC;SACxD;IACF,CAAC;IACF,YAAC;AAAD,CAAC,IAAA;;AAED,qBAAc,CAAA;;;;ACllBd,+EACoF;;AAEpF;IAMC,wBAAY,YAAiC;QAAjC,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAH7C,KAAO,YAAY,GAAW,IAAI,CAAC;QAKlC,IAAI,CAAC,YAAY,GAAG,YAAY;IACjC,CAAC;IAED,yCAAA;QAEC,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,mBAAmB,IAAI,IAAI,CAAC,YAAY,CAAE;YACxF,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC;SAC3E;IACF,CAAC;;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;QAED,KAAA,UAAwB,GAAiB;YAExC,IAAI,IAAI,CAAC,cAAc,IAAI,GAAG,CAAE;gBAC/B,MAAO;aACP;;YAED,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,YAAY,CAAE;gBAC7C,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,IAAI;aACvC;YACD,IAAI,CAAC,cAAc,GAAG,GAAG;;YAEzB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,YAAY,CAAE;gBAC7C,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,IAAI;aACvC;YACD,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAjBA;;IAmBD;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;QAED,KAAA,UAAsB,GAAW;YAEhC,IAAI,IAAI,CAAC,YAAY,IAAI,GAAG,CAAE;gBAC7B,MAAO;aACP;YACD,IAAI,CAAC,YAAY,GAAG,GAAG;;YAEvB,IAAI,IAAI,CAAC,cAAc,CAAE;gBACxB,IAAI,IAAI,CAAC,cAAc,CAAE;oBACxB,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,IAAI;iBACvC,KAAM;oBACN,IAAI,CAAC,cAAc,CAAC,YAAY,GAAG,IAAI;iBACvC;aACD;QACF,CAAC;;;;AAhBA;;IAkBD,kCAAA,UAAc,WAA0B;QAA1B,0CAAA,WAAW,GAAW,IAAI;AAAA,QAEvC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;IACF,sBAAC;AAAD,CAAC,IAAA;;AAED,+BAAwB,CAAA;;;;;;;;;;ACtExB,0EAAgF;;AAEhF,gEAAuE;;AAEvE;;;;EAIG;AACH;IAAoC,wCAAc;IA6IjD;;MADG;IACH,+BAAY,YAAiC,EAAE,QAAmB,EAAE,SAAqB,EAAE,YAAyB,EAAE,YAAwB,EAAE,KAAgB,EAAE,YAA4B;QAAlL,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAE,uCAAA,QAAQ,GAAU,CAAC;AAAA,QAAE,wCAAA,SAAS,GAAU,EAAE;AAAA,QAAE,2CAAA,YAAY,GAAU,CAAC,EAAE;AAAA,QAAE,2CAAA,YAAY,GAAU,EAAE;AAAA,QAAE,oCAAA,KAAK,GAAU,CAAC;AAAA,QAAE,2CAAA,YAAY,GAAW,KAAK;AAAA,QAE7L,WAAM,OAAA,YAAY,CAAC;QA7IpB,KAAO,iBAAiB,GAAU,CAAC,CAAC;QACpC,KAAQ,kBAAkB,GAAU,EAAE,CAAC;QAEvC,KAAQ,SAAS,GAAU,CAAC,CAAC;QAC7B,KAAQ,UAAU,GAAU,EAAE,CAAC;QAC/B,KAAQ,aAAa,GAAU,CAAC,EAAE,CAAC;QACnC,KAAQ,aAAa,GAAU,EAAE,CAAC;QAClC,KAAQ,MAAM,GAAU,CAAC,CAAC;QAC1B,KAAQ,cAAc,GAAU,CAAC,CAAC;QAClC,KAAQ,gBAAgB,GAAU,CAAC,CAAC;QACpC,KAAQ,aAAa,GAAW,KAAK,CAAC;QAEtC,KAAO,GAAG,GAAW,KAAK,CAAC;;QAmI1B,IAAI,CAAC,QAAQ,GAAG,QAAQ;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,CAAC,YAAY,GAAG,YAAY;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,YAAY,GAAG,YAAY;;QAEhC,qDAAqD;QACrD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS;QACvC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU;IAC1C,CAAC;IAnID;QAAA;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,MAAM;QACnB,CAAC;QAED,KAAA,UAAiB,GAAU;YAE1B,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAE,CAAC,GAAG,GAAG;;YAExB,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;gBACrB,MAAO,CAAA;;YAER,IAAI,CAAC,MAAM,GAAG,GAAG;;YAEjB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAZA;;IAiBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,SAAS;QACtB,CAAC;QAED,KAAA,UAAoB,GAAU;YAE7B,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG;gBACxB,MAAO,CAAA;;YAER,IAAI,CAAC,SAAS,GAAG,GAAG;;YAEpB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAVA;;IAeD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;QAED,KAAA,UAAqB,GAAU;YAE9B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;;YAErE,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG;gBACzB,MAAO,CAAA;;YAER,IAAI,CAAC,UAAU,GAAG,GAAG;;YAErB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAZA;;IAmBD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,GAAU;YAEjC,IAAI,IAAI,CAAC,aAAa,IAAI,GAAG;gBAC5B,MAAO,CAAA;;YAER,IAAI,CAAC,aAAa,GAAG,GAAG;;YAExB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7F,CAAC;;;;AAVA;;IAiBD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,GAAU;YAEjC,IAAI,IAAI,CAAC,aAAa,IAAI,GAAG;gBAC5B,MAAO,CAAA;;YAER,IAAI,CAAC,aAAa,GAAG,GAAG;;YAExB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7F,CAAC;;;;AAVA;;IAgBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,GAAW;YAElC,IAAI,IAAI,CAAC,aAAa,IAAI,GAAG;gBAC5B,MAAO,CAAA;;YAER,IAAI,CAAC,aAAa,GAAG,GAAG;;YAExB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAVA;;IA0CD;;;;;;;;;;MADG;6CACH,UAAc,WAA0B;QAA1B,0CAAA,WAAW,GAAW,IAAI;AAAA,QAEvC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAE;YAE3F,IAAI,CAAC,aAAa,CAAC,CAAC;;YAEpB,IAAI,IAAI,CAAC,aAAa,CAAE;gBACvB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAE;oBACvB,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,GAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS;oBACnE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAC,GAAG,GAAG,GAAG;iBACzC,KAAM;oBACN,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,GAAC,GAAG,GAAG,IAAI,CAAC,SAAS;oBAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAC,GAAG;iBACnC;;gBAED,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG;oBACpD,IAAI,CAAC,iBAAiB,IAAI,GAAG,CAAC;;gBAE/B,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,GAAG,GAAG;oBACnD,IAAI,CAAC,iBAAiB,IAAI,GAAG,CAAC;aAC/B;;YAED,IAAI,WAAW,CAAE;gBAChB,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBACvF,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;aACpF,KAAM;gBACN,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU;gBACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS;aACvC;;YAED,4CAA4C;YAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAE;gBAC9H,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU;gBACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS;aACvC;SACD;;QAED,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB;QACrD,IAAI,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB;;QAEpD,IAAI,IAAI,CAAC,cAAc,CAAE;YACxB,IAAI,IAAI,CAAC,GAAG,CAAE;gBACb,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC;aAC5D,KAAM;gBACN,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAC,UAAU,CAAC,kBAAkB,CAAC;gBACjG,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,IAAI,CAAC,cAAc,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAC,UAAU,CAAC,kBAAkB,CAAC;aACjG;YACD,IAAI,CAAC,cAAc,GAAG,CAAC;SACvB;;QAED,IAAI,IAAI,CAAC,gBAAgB,CAAE;YAC1B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC;YAC5D,IAAI,CAAC,gBAAgB,GAAG,CAAC;SACzB;IAEF,CAAC;;IAED,gDAAA,UAAqB,GAAU;QAE9B,IAAI,GAAG,IAAI,CAAC;YACX,MAAO,CAAA;;QAER,IAAI,CAAC,cAAc,IAAI,GAAG;;QAE1B,IAAI,CAAC,aAAa,CAAC,CAAC;IACrB,CAAC;;IAED,kDAAA,UAAuB,GAAU;QAEhC,IAAI,GAAG,IAAI,CAAC;YACX,MAAO,CAAA;;QAER,IAAI,CAAC,gBAAgB,IAAI,GAAG;;QAE5B,IAAI,CAAC,aAAa,CAAC,CAAC;IACrB,CAAC;IAEF,6BAAC;AAAD,CAAC,EArPmC,cAAc,EAqPjD;;AAED,sCAA+B,CAAA;;;;;;;;;;AChQ/B,4EAAkF;;AAGlF;;;;;EAKG;AACH;IAA+B,mCAAe;IAE7C,0BAAY,YAAiC,EAAE,YAAiC,EAAE,SAAqB,EAAE,QAAqB;QAAlH,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAE,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAE,wCAAA,SAAS,GAAU,EAAE;AAAA,QAAE,uCAAA,QAAQ,GAAU,GAAG;AAAA,QAE7H,WAAM,OAAA,YAAY,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,QAAQ,CAAC;IAC1D,CAAC;IAED,oCAAA,UAAc,WAA0B;QAA1B,0CAAA,WAAW,GAAW,IAAI;AAAA,QAEvC,WAAW,GAAG,WAAW,EAAE,2BAA2B;;QAEtD,IAAI,CAAC,IAAI,CAAC,YAAY;YACrB,MAAO,CAAA;;QAER,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,GAAG,GAAG;QACnD,gBAAK,CAAC,MAAM,KAAC,KAAA,CAAC;IACf,CAAC;IACF,wBAAC;AAAD,CAAC,EAjB8B,eAAe,EAiB7C;;AAED,iCAA0B,CAAA;;;;;;;;;;AC5B1B,8EAAoF;;AAEpF,gEAAuE;AACvE,4DAAoE;;AAEpE;;;;EAIG;AACH;IAA8B,kCAAgB;IA6N7C;;MADG;IACH,yBAAY,YAAiC,EAAE,YAAiC,EAAE,QAAmB,EAAE,SAAqB,EAAE,QAAsB,EAAE,YAAyB,EAAE,YAAwB,EAAE,WAAyB,EAAE,WAAyB,EAAE,KAAgB,EAAE,OAAkB,EAAE,YAA4B;QAAvT,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAE,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAE,uCAAA,QAAQ,GAAU,CAAC;AAAA,QAAE,wCAAA,SAAS,GAAU,EAAE;AAAA,QAAE,uCAAA,QAAQ,GAAU,IAAI;AAAA,QAAE,2CAAA,YAAY,GAAU,CAAC,EAAE;AAAA,QAAE,2CAAA,YAAY,GAAU,EAAE;AAAA,QAAE,0CAAA,WAAW,GAAU,IAAI;AAAA,QAAE,0CAAA,WAAW,GAAU,IAAI;AAAA,QAAE,oCAAA,KAAK,GAAU,CAAC;AAAA,QAAE,sCAAA,OAAO,GAAU,CAAC;AAAA,QAAE,2CAAA,YAAY,GAAW,KAAK;AAAA,QAElU,WAAM,OAAA,YAAY,EAAE,YAAY,CAAC;QA7NlC,KAAO,iBAAiB,GAAU,CAAC,CAAC;QACpC,KAAO,kBAAkB,GAAU,EAAE,CAAC;QAEtC,KAAQ,SAAS,GAAU,CAAC,CAAC;QAC7B,KAAQ,UAAU,GAAU,EAAE,CAAC;QAC/B,KAAQ,SAAS,GAAU,IAAI,CAAC;QAChC,KAAQ,YAAY,GAAU,CAAC,QAAQ,CAAC;QACxC,KAAQ,YAAY,GAAU,QAAQ,CAAC;QACvC,KAAQ,aAAa,GAAU,CAAC,EAAE,CAAC;QACnC,KAAQ,aAAa,GAAU,EAAE,CAAC;QAClC,KAAQ,MAAM,GAAU,CAAC,CAAC;QAC1B,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAC5B,KAAQ,aAAa,GAAW,KAAK,CAAC;QACtC,KAAQ,OAAO,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;;QAkNzC,IAAI,CAAC,QAAQ,GAAG,QAAQ;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,CAAC,WAAW,GAAG,CAAE,WAAW,IAAI,IAAI,CAAE,GAAE,WAAW,GAAG,CAAC,QAAQ;QACnE,IAAI,CAAC,WAAW,GAAG,CAAE,WAAW,IAAI,IAAI,CAAE,GAAE,WAAW,GAAG,QAAQ;QAClE,IAAI,CAAC,YAAY,GAAG,YAAY;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,OAAO,GAAG,OAAO;QACtB,IAAI,CAAC,YAAY,GAAG,YAAY;;QAEhC,qDAAqD;QACrD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS;QACvC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU;IAC1C,CAAC;IAtND;QAAA;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,MAAM;QACnB,CAAC;QAED,KAAA,UAAiB,GAAU;YAE1B,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAE,CAAC,GAAG,GAAG;;YAExB,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;gBACrB,MAAO,CAAA;;YAER,IAAI,CAAC,MAAM,GAAG,GAAG;;YAEjB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAZA;;IAiBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,SAAS;QACtB,CAAC;QAED,KAAA,UAAoB,GAAU;YAE7B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;;YAEnE,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG;gBACxB,MAAO,CAAA;;YAER,IAAI,CAAC,SAAS,GAAG,GAAG;;YAEpB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAZA;;IAiBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;QAED,KAAA,UAAqB,GAAU;YAE9B,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;;YAErE,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG;gBACzB,MAAO,CAAA;;YAER,IAAI,CAAC,UAAU,GAAG,GAAG;;YAErB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAZA;;IAiBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,SAAS;QACtB,CAAC;QAED,KAAA,UAAoB,GAAU;YAE7B,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG;gBACxB,MAAO,CAAA;;YAER,IAAI,CAAC,SAAS,GAAG,GAAG;;YAEpB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAVA;;IAiBD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;QAED,KAAA,UAAuB,GAAU;YAEhC,IAAI,IAAI,CAAC,YAAY,IAAI,GAAG;gBAC3B,MAAO,CAAA;;YAER,IAAI,CAAC,YAAY,GAAG,GAAG;;YAEvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;;;;AAVA;;IAiBD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;QAED,KAAA,UAAuB,GAAU;YAEhC,IAAI,IAAI,CAAC,YAAY,IAAI,GAAG;gBAC3B,MAAO,CAAA;;YAER,IAAI,CAAC,YAAY,GAAG,GAAG;;YAEvB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QACzF,CAAC;;;;AAVA;;IAiBD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,GAAU;YAEjC,IAAI,IAAI,CAAC,aAAa,IAAI,GAAG;gBAC5B,MAAO,CAAA;;YAER,IAAI,CAAC,aAAa,GAAG,GAAG;;YAExB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7F,CAAC;;;;AAVA;;IAiBD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,GAAU;YAEjC,IAAI,IAAI,CAAC,aAAa,IAAI,GAAG;gBAC5B,MAAO,CAAA;;YAER,IAAI,CAAC,aAAa,GAAG,GAAG;;YAExB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7F,CAAC;;;;AAVA;;IAiBD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAED,KAAA,UAAmB,GAAU;YAE5B,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG;gBACvB,MAAO,CAAA;;YAER,IAAI,CAAC,QAAQ,GAAG,GAAG;;YAEnB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAVA;;IAeD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,GAAW;YAElC,IAAI,IAAI,CAAC,aAAa,IAAI,GAAG;gBAC5B,MAAO,CAAA;;YAER,IAAI,CAAC,aAAa,GAAG,GAAG;;YAExB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAVA;;IA8CD;;;;;;;;;;MADG;uCACH,UAAc,WAA0B;QAA1B,0CAAA,WAAW,GAAW,IAAI;AAAA,QAEvC,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAE;YAE3F,IAAI,CAAC,aAAa,CAAC,CAAC;;YAEpB,IAAI,IAAI,CAAC,aAAa,CAAE;gBACvB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,CAAE;oBACvB,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,GAAC,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS;oBACnE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAC,GAAG,GAAG,GAAG;iBACzC,KAAM;oBACN,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,SAAS,GAAC,GAAG,GAAG,IAAI,CAAC,SAAS;oBAC7D,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,GAAC,GAAG;iBACnC;;gBAED,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,GAAG,CAAC,GAAG;oBACpD,IAAI,CAAC,iBAAiB,IAAI,GAAG,CAAC;;gBAE/B,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,GAAG,GAAG;oBACnD,IAAI,CAAC,iBAAiB,IAAI,GAAG,CAAC;aAC/B;;YAED,IAAI,WAAW,CAAE;gBAChB,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;gBACvF,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;aACpF,KAAM;gBACN,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS;gBACvC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU;aACzC;;YAED,4CAA4C;YAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,CAAE;gBAC9H,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,UAAU;gBACzC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS;aACvC;SACD;;QAED,IAAI,GAAG,GAAY,CAAC,IAAI,CAAC,YAAY,CAAC,GAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ;QACzI,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAC,UAAU,CAAC,kBAAkB,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAC,UAAU,CAAC,kBAAkB,CAAC;QAC1K,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAC,UAAU,CAAC,kBAAkB,CAAC,GAAC,IAAI,CAAC,OAAO;QACxH,IAAI,CAAC,YAAY,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAC,UAAU,CAAC,kBAAkB,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAC,UAAU,CAAC,kBAAkB,CAAC;;QAE1K,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAC,UAAU,CAAC,kBAAkB,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAC,UAAU,CAAC,kBAAkB,CAAC;QAChJ,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAC,UAAU,CAAC,kBAAkB,CAAC;QAChF,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,GAAC,UAAU,CAAC,kBAAkB,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,GAAC,UAAU,CAAC,kBAAkB,CAAC;;QAEhJ,IAAI,IAAI,CAAC,cAAc,CAAE;YACxB,IAAI,IAAI,CAAC,gBAAgB;gBACxB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC;iBAC3D,IAAI,IAAI,CAAC,cAAc;gBAC3B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,GAAE,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;SACjJ;IACF,CAAC;IACF,uBAAC;AAAD,CAAC,EAjT6B,gBAAgB,EAiT7C;;AAED,gCAAyB,CAAA;;;;;;;;;;AC7TzB,0EAAgF;;AAEhF,4DAAoE;AACpE,6EAAkF;;AAElF;IAA+B,mCAAc;IAQ5C,0BAAY,YAAiC,EAAE,YAAiC;QAApE,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAE,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAhF,iBAUC;QARA,WAAM,OAAA,YAAY,CAAC;QANpB,KAAO,QAAQ,GAAY,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;;QAQtD,IAAI,CAAC,8BAA8B,GAAG,UAAC,KAAwB;mBAAK,KAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAAjC,CAAiC;;QAErG,IAAI,YAAY;YACf,IAAI,CAAC,YAAY,GAAG,YAAY;;YAEhC,IAAI,CAAC,cAAc,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;IACvC,CAAC;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,gBAAgB;QAC7B,CAAC;QAED,KAAA,UAA0B,GAAY;YAErC,IAAI,IAAI,CAAC,cAAc,CAAE;gBACxB,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,IAAI,CAAC,8BAA8B,CAAC;gBACvH,IAAI,CAAC,cAAc,GAAG,IAAI;aAC1B;;YAED,IAAI,CAAC,gBAAgB,GAAG,GAAG;YAC3B,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAXA;;IAaD;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;QAED,KAAA,UAAwB,GAAiB;YAExC,IAAI,IAAI,CAAC,gBAAgB;gBACxB,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;;YAE9B,IAAI,IAAI,CAAC,cAAc,IAAI,GAAG;gBAC7B,MAAO,CAAA;;YAER,IAAI,IAAI,CAAC,cAAc;gBACtB,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;;YAEzH,IAAI,CAAC,cAAc,GAAG,GAAG;;YAEzB,IAAI,IAAI,CAAC,cAAc;gBACtB,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,IAAI,CAAC,8BAA8B,CAAC,CAAC;;YAEtH,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAnBA;;IAsBD,WADW;wCACX,UAAc,WAA0B;QAA1B,0CAAA,WAAW,GAAW,IAAI;AAAA,QAEvC,IAAI,IAAI,CAAC,cAAc,CAAE;YACxB,IAAI,IAAI,CAAC,gBAAgB;gBACxB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC;iBAC7C,IAAI,IAAI,CAAC,cAAc;gBAC3B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,GAAE,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;SACnI;IACF,CAAC;;IAED,mDAAA,UAA8B,KAAwB;QAErD,IAAI,CAAC,aAAa,CAAC,CAAC;IACrB,CAAC;IACF,wBAAC;AAAD,CAAC,EA3E8B,cAAc,EA2E5C;;AAED,iCAA0B,CAAA;;;;;;;;;;AClF1B,8EAAoF;;AAEpF,4DAAoE;;AAEpE;;;;EAIG;AACH;IAA+B,mCAAgB;IA+B9C,0BAAY,YAAiC,EAAE,YAAiC,EAAE,SAAoB,EAAE,IAAgB,EAAE,OAAkB;QAAhI,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAE,2CAAA,YAAY,GAAiB,IAAI;AAAA,QAAE,wCAAA,SAAS,GAAU,CAAC;AAAA,QAAE,mCAAA,IAAI,GAAU,EAAE;AAAA,QAAE,sCAAA,OAAO,GAAU,CAAC;AAAA,QAE3I,WAAM,OAAA,YAAY,EAAE,YAAY,CAAC;QAPlC;;UAEG;QACH,KAAO,cAAc,GAAY,IAAI,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;;QAM5D,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,CAAC,OAAO,GAAG,OAAO;QACtB,IAAI,CAAC,IAAI,GAAG,IAAI;;QAEhB,IAAI,CAAC,SAAS,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,IAAI,QAAQ,CAAC,CAAC;QACzB,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC,aAAa,GAAG,IAAI,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,gBAAgB,GAAG,IAAI,QAAQ,CAAC,CAAC;IAEvC,CAAC;IAED,oCAAA,UAAc,WAA0B;QAA1B,0CAAA,WAAW,GAAW,IAAI;AAAA,QAEvC,IAAI,IAAI;;QAER,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,cAAc;YAC/C,MAAO,CAAA;;QAER,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC;QACvF,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;;QAExD,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC;QACjF,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;;QAEtC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;;QAE9B,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;;QAE5C,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;QACxC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC;;QAEvC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC;;QAE9C,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;;QAEnG,gBAAK,CAAC,MAAM,KAAC,KAAA,CAAC;IACf,CAAC;IACF,wBAAC;AAAD,CAAC,EA/E8B,gBAAgB,EA+E9C;;AAED,iCAA0B,CAAA;;;;AC1F1B;;EAEG;AACH;IAAA;IAWA,CAAC;AAAA,IANA,mCAA0C,mBAAmB;;IAK7D,4BAAmC,OAAO;IAC3C,qBAAC;AAAD,CAAC,IAAA;;AAED,8BAAuB,CAAA;;;;AChBvB;IAAA;IAMA,CAAC;AAAA,IAJA,0BAAsC,CAAC;IACvC,yBAAqC,CAAC;IACtC,0BAAsC,CAAC;IACvC,wBAAoC,CAAC;IACtC,yBAAC;AAAD,CAAC,IAAA;;AAED,kCAA2B,CAAA;;;;ACR3B,8DAEqE;;AAGrE,4DAAmE;;AAEnE;;EAEG;AACH;IAkBC;;;;;;MADG;IACH,oBAAY,KAAY,EAAE,MAAa,EAAE,WAA0B,EAAE,SAAuB;QAAnD,0CAAA,WAAW,GAAW,IAAI;AAAA,QAAE,wCAAA,SAAS,GAAU,IAAI;AAAA,QAX5F,KAAQ,MAAM,GAAU,CAAC,CAAC;QAC1B,KAAQ,OAAO,GAAW,KAAK,CAAC;QAa/B,IAAI,CAAC,YAAY,GAAG,WAAW;QAC/B,IAAI,CAAC,YAAY,GAAuB,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC;QACxE,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,KAAK;QAC/B,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,MAAM;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC;;QAE/C,IAAI,SAAS,IAAI,IAAI,CAAE;YAEtB,IAAI,IAAI,CAAC,YAAY,CAAE;gBACtB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAC,GAAG;aAC7D,KAAM;gBACN,IAAI,CAAC,MAAM,GAAG,CAAC;aACf;;YAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;SAEpC;IAEF,CAAC;IAKD;;MADG;mCACH;QAEC,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI;IACpB,CAAC;;IAKD;;MADG;gCACH;QAEC,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IACxF,CAAC;;IAKD;;MADG;kCACH;QAEC,IAAI,CAAC,OAAO,GAAG,KAAK;;QAEpB,IAAI,IAAI,CAAC,UAAU,CAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB;YACnE,IAAI,CAAC,UAAU,GAAG,IAAI;SACtB;IACF,CAAC;;IAQD;;;;;MADG;oCACH,UAAgB,CAAC,EAAE,CAAC;QAEnB,IAAI,CAAC;QACL,IAAI,CAAC;QACL,IAAI,CAAC;QACL,IAAI,CAAC;;QAEL,IAAI,CAAC,IAAI,CAAC,OAAO,CAAE;YAClB,IAAI,SAAS,GAAa,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;;YAEhE,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACrB,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACrB,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YACrB,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;SAErB,KAAM;YACN,IAAI,KAAK,GAAU,CAAC,CAAC,GAAG,CAAC,GAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAC,CAAC;;YAEpD,IAAI,CAAC,IAAI,CAAC,UAAU;gBACnB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;YAEzF,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACnC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACnC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACnC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;SAEnC;;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAE;YAClB,IAAI,CAAC,UAAU,GAAG,IAAI;SACtB;;QAED,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;IAC5C,CAAC;;IAQD;;;;;MADG;oCACH,UAAgB,CAAC,EAAE,CAAC,EAAE,KAAY;QAEjC,IAAI,IAAI,GAAY,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC;;QAExD,IAAI,CAAC,IAAI,CAAC,OAAO;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;QAEzF,IAAI,IAAI,CAAC,UAAU,CAAE;YACpB,IAAI,KAAK,GAAU,CAAC,CAAC,GAAG,CAAC,GAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAC,CAAC;;YAEpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG;SACrC;;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI;SACtB;IACF,CAAC;;IAOD;;;;MADG;qCACH,UAAiB,IAAc,EAAE,cAAwB;QAExD,IAAI,CAAC,IAAI,CAAC,OAAO;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;QAEzF,IAAI,IAAI,CAAC,UAAU,CAAE;YACpB,cAAc,CAAC,QAAQ,GAAG,CAAC;YAC3B,IAAI,CAAC,EAAkB,CAAC,EAAkB,KAAK;YAC/C,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE;gBAChC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAE;oBACjC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAC,CAAC;;oBAE7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;oBAClE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;oBAClE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;oBAClE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,eAAe,CAAC,CAAC;iBAClE;aACD;SACD;;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI;SACtB;IACF,CAAC;;IAQD;;;;;MADG;sCACH,UAAkB,CAAC,EAAE,CAAC,EAAE,KAAY;QAEnC,IAAI,IAAI,GAAY,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC;;QAExD,IAAI,CAAC,IAAI,CAAC,OAAO;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;QAEzF,IAAI,IAAI,CAAC,UAAU,CAAE;YACpB,IAAI,KAAK,GAAU,CAAC,CAAC,GAAG,CAAC,GAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAC,CAAC;;YAEpD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;SACzC;;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI;SACtB;IACF,CAAC;;IAED,iCAAA,UAAiB,IAAc,EAAE,WAAyB;QAEzD,IAAI,CAAC,IAAI,CAAC,OAAO;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;QAEzF,IAAI,IAAI,CAAC,UAAU,CAAE;YACpB,IAAI,CAAC,EAAkB,CAAC,EAAkB,KAAK,EAAkB,IAAI;YACrE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE;gBAChC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAE;oBACjC,IAAI,GAAG,UAAU,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,CAAC;oBACnE,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,GAAC,CAAC;;oBAE7D,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;oBACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;oBACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;oBACzC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;iBACzC;aACD;SACD;;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI;SACtB;IACF,CAAC;;IAWD,iCAAA,UAAiB,GAAO,EAAE,UAAoB,EAAE,QAAkB;QAEjE,IAAI,IAAI,CAAC,OAAO,CAAE;YACjB,uBAAuB;YACvB,EAAE;YACF,yCAAyC;YACzC,sBAAsB;YACtB,mCAAmC;YAEnC,IAAI,IAAI,CAAC,UAAU,CAAE;gBACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB;aACnE;;YAED,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;;YAE1C,IAAI,IAAI,CAAC,UAAU,CAAE;gBACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;aACvF;SAED,KAAM;YACN,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;SAC1C;IACF,CAAC;;IAID,kCAAA,UAAmB,GAAO,EAAE,UAAoB,EAAE,QAAkB;QAEnE,IAAI,GAAG,YAAY,UAAU;YAC5B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;aACzJ,IAAI,GAAG,YAAY,gBAAgB;YACvC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACzJ,CAAC;;IAUD,kCAAA,UAAkB,IAAQ,EAAE,UAAoB,EAAE,QAAkB;QAGnE,IAAI,IAAI,CAAC,OAAO,CAAE;YAEjB,uBAAuB;YACvB,EAAE;YACF,yCAAyC;YACzC,sBAAsB;YACtB,mCAAmC;YAEnC,IAAI,IAAI,CAAC,UAAU,CAAE;gBACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB;aACnE;;YAED,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;;YAE5C,IAAI,IAAI,CAAC,UAAU,CAAE;gBACpB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;aACvF;SACD,KAAM;YACN,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,QAAQ,CAAC;SAC5C;IAEF,CAAC;;IAID,mCAAA,UAAoB,IAAQ,EAAE,UAAoB,EAAE,QAAkB;QAGrE,IAAI,IAAI,YAAY,UAAU,CAAE;YAC/B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;SAC9J,MAAM,IAAI,IAAI,YAAY,gBAAgB,CAAE;YAC5C,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC;SACvJ;IAEF,CAAC;;IAOD;;;;MADG;oCACH,UAAgB,IAAc,EAAE,KAAY;QAE3C,IAAI,IAAI,CAAC,OAAO,CAAE;YAEjB,uBAAuB;YACvB,EAAE;YACF,yCAAyC;YACzC,qBAAqB;YACrB,mCAAmC;YAEnC,IAAI,IAAI,CAAC,UAAU;gBAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB;AAAjB;YAEnD,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;;YAE/D,IAAI,IAAI,CAAC,UAAU;gBAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACzF,KAAM;YACN,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;SAC/D;IACF,CAAC;;IASD,4BAAA,UAAY,MAAU,EAAE,MAAc;QAErC,IAAI,IAAI,CAAC,OAAO,CAAE;YAEjB,uBAAuB;YACvB,EAAE;YACF,yCAAyC;YACzC,sBAAsB;YACtB,mCAAmC;YAEnC,IAAI,IAAI,CAAC,UAAU;gBAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,gBAAgB;AAAjB;YAEnD,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC;;YAE1B,IAAI,IAAI,CAAC,UAAU;gBAClB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;SACzF,KAAM;YACN,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC;SAC1B;IACF,CAAC;;IAID,6BAAA,UAAc,MAAU,EAAE,MAAa;QAEtC,IAAI,MAAM,YAAY,UAAU,CAAE;YACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;YAEpB,IAAI,MAAM,IAAI,IAAI;gBACjB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;;YAE1F,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAEvB,MAAM,IAAI,MAAM,YAAY,gBAAgB,CAAE;YAC9C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;YAEpB,IAAI,MAAM,IAAI,IAAI;gBACjB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;;YAE1F,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACvB;IAEF,CAAC;;IAED,mCAAA,UAAmB,YAAuB,EAAE,UAAoB,EAAE,SAAe,EAAE,aAAoB,EAAE,WAAkB;QAE1H,IAAI,SAAS,GAAa,YAAY,CAAC,SAAS;;QAEhD,IAAI,CAAC,IAAI,CAAC,OAAO;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;QAEzF,IAAI,IAAI,CAAC,UAAU,CAAE;YACpB,IAAI,UAAU,GAAc,YAAY,CAAC,SAAS,CAAC,IAAI;YACvD,IAAI,QAAQ,GAAc,IAAI,CAAC,UAAU,CAAC,IAAI;;YAE9C,IAAI,YAAY,GAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACzE,IAAI,UAAU,GAAU,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,GAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;;YAErE,IAAI,CAAC,EAAkB,CAAC,EAAkB,WAAW,EAAkB,SAAS;YAChF,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE;gBACtC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAE;oBACvC,WAAW,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAC,YAAY,CAAC,KAAK,CAAC,GAAC,CAAC;oBAC1E,SAAS,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,GAAC,CAAC;;oBAE9D,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC,WAAW,GAAG,YAAY,CAAC;iBACzE;aACD;SACD;;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI;SACtB;IACF,CAAC;;IAED,sCAAA,UAAsB,IAAc,EAAE,cAA6B;QAElE,IAAI,CAAC,IAAI,CAAC,OAAO;YAChB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;;QAEzF,IAAI,IAAI,CAAC,UAAU,CAAE;YACpB,IAAI,IAAI,GAAc,IAAI,CAAC,UAAU,CAAC,IAAI;;YAE1C,IAAI,CAAC,EAAkB,CAAC,EAAkB,KAAK;YAC/C,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAE;gBAChC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAE;oBACjC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,KAAK,CAAC,GAAC,CAAC;;oBAEhD,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAC,cAAc,CAAC,aAAa,GAAG,cAAc,CAAC,SAAS;oBACjF,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAC,cAAc,CAAC,eAAe,GAAG,cAAc,CAAC,WAAW;oBAC7F,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAC,cAAc,CAAC,cAAc,GAAG,cAAc,CAAC,UAAU;oBAC3F,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,GAAC,cAAc,CAAC,eAAe,GAAG,cAAc,CAAC,WAAW;iBAC7F;aACD;SACD;;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,CAAE;YAClB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI;SACtB;IACF,CAAC;;;IAeD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QAC7E,CAAC;QAZD;;;UADG;aACH,UAAqB,KAAe;YAEnC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACxC,CAAC;;;;AASA;IAMD;QAAA;;;UADG;aACH;YAEC,OAAgB,IAAI,CAAC,YAAY,CAAC,KAAK;QACxC,CAAC;QAMD;;;UADG;aACH,UAAiB,KAAY;YAE5B,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK;YACxB,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,KAAK;QAChC,CAAC;;;;AAVA;;IAgBD;QAAA;;;UADG;aACH;YAEC,OAAgB,IAAI,CAAC,YAAY,CAAC,MAAM;QACzC,CAAC;QAMD;;;UADG;aACH,UAAkB,KAAY;YAE7B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK;YACzB,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,KAAK;QACjC,CAAC;;;;AAVA;;IAgBD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,KAAK;QAClB,CAAC;;;;AAAA;IAMD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAMD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;;;;AAAA;IAOD,UALU;IAEV;;MAEG;wCACH,UAAqB,CAAQ;QAE5B,IAAI,IAAI,GAAY,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC;;QAEpD,IAAI,IAAI,CAAC,YAAY,IAAI,KAAK,CAAE;YAC/B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;;YAEX,OAAO,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG;SAC9E;;QAED,OAAO,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAC,GAAG,GAAG,GAAG;IACnF,CAAC;IACF,kBAAC;AAAD,CAAC,IAAA;;AAED,2BAAoB,CAAA;;;;AC9jBpB;;;;;;;;;EASG;AACH;IAAA;IAiLA,CAAC;AAAA,IArKA,gBAA2B,KAAK;;IAUhC,kBAA6B,OAAO;;IAcpC,mBAA8B,QAAQ;;IAatC,uBAAkC,YAAY;;IAS9C,kBAA6B,OAAO;;IAYpC,sBAAiC,WAAW;;IAK5C,mBAA8B,QAAQ;;IAYtC,kBAA6B,OAAO;;IAcpC,oBAA+B,SAAS;;IAexC,qBAAgC,UAAU;;IAO1C,mBAA8B,QAAQ;;IAYtC,oBAA+B,SAAS;;IAQxC,mBAA8B,QAAQ;;IAqBtC,mBAA8B,QAAQ;;IAYtC,qBAAgC,UAAU;IAC3C,iBAAC;AAAD,CAAC,IAAA;;AAED,0BAAmB,CAAA;;;;AC7LnB;;;;;;EAMG;AACH;IAAA;IAmBA,CAAC;AAAA,IAbA,kBAA6B,OAAO;;IAMpC,iBAA4B,MAAM;;IAMlC,mBAA8B,QAAQ;IACvC,iBAAC;AAAD,CAAC,IAAA;;AAED,0BAAmB,CAAA;;;;;;;;;;AC5BnB,qFAAyF;;AAKzF,sEAA4E;;AAG5E,0EAAgF;;AAEhF,gEAAuE;AACvE,4DAAoE;AACpE,sEAA4E;AAC5E,sDAA8D;;AAE9D,8DAAqE;AACrE,4DAAoE;;AAIpE,gFAAqF;;AAErF,2EAAiF;;AAEjF,+EAAoF;AACpF,6EAAkF;AAClF,6DAAoE;;AAGpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgIG;AACH;IAA4B,gCAAc;IA0pCzC;;MADG;IACH;QAEC,WAAM,KAAA,CAAC;QA9oCR,KAAO,gBAAgB,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QAClD,KAAO,qBAAqB,GAAW,IAAI,CAAC;QAU5C,KAAQ,SAAS,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QAC5C,KAAQ,cAAc,GAAW,IAAI,CAAC;QAEtC,KAAQ,sBAAsB,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QACzD,KAAQ,2BAA2B,GAAW,IAAI,CAAC;QACnD,KAAQ,cAAc,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QACjD,KAAQ,mBAAmB,GAAW,IAAI,CAAC;QAC3C,KAAQ,mBAAmB,GAAW,IAAI,CAAC;QAC3C,KAAO,oBAAoB,GAAW,IAAI,CAAC;QAC3C,KAAQ,qBAAqB,GAAW,IAAI,CAAC;QAC7C,KAAO,sBAAsB,GAAW,IAAI,CAAC;QAI7C,KAAQ,cAAc,GAAW,IAAI,CAAC;QACtC,KAAQ,cAAc,GAAW,IAAI,CAAC;QACtC,KAAQ,WAAW,GAAW,IAAI,CAAC;QAMnC,KAAQ,UAAU,GAAU,CAAC,CAAC;QAC9B,KAAQ,UAAU,GAAU,CAAC,CAAC;QAC9B,KAAQ,UAAU,GAAU,CAAC,CAAC;QAC9B,KAAQ,OAAO,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QAC1C,KAAQ,MAAM,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QAKzC,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAE5B,KAAO,QAAQ,GAAU,CAAC,CAAC;QAC3B,KAAO,QAAQ,GAAU,CAAC,CAAC;QAC3B,KAAO,QAAQ,GAAU,CAAC,CAAC;QAC3B,KAAQ,EAAE,GAAU,CAAC,CAAC;QACtB,KAAQ,EAAE,GAAU,CAAC,CAAC;QACtB,KAAQ,EAAE,GAAU,CAAC,CAAC;QACtB,KAAQ,MAAM,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QACzC,KAAQ,kBAAkB,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QACrD,KAAQ,UAAU,GAAW,IAAI,CAAC;QAClC,KAAQ,WAAW,GAAW,IAAI,CAAC;QACnC,KAAQ,IAAI,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QACvC,KAAQ,IAAI,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QACvC,KAAQ,IAAI,GAAY,IAAI,QAAQ,CAAC,CAAC,CAAC;QAGvC,KAAO,iBAAiB,GAAW,KAAK,CAAC;QAOzC,KAAO,eAAe,GAAW,IAAI,CAAC;QAEtC,KAAQ,mBAAmB,GAAW,IAAI,CAAC;QAI3C,KAAO,aAAa,GAAsB,IAAI,KAAK,CAAc,CAAC,CAAC;QAInE;;UAEG;QACH,KAAO,aAAa,GAAU,aAAa,CAAC,kBAAkB,CAAC;QAyH/D;;UAEG;QACH,KAAO,YAAY,GAAW,IAAI,CAAC;QA2VnC;;UAEG;QACH,KAAO,eAAe,GAAU,eAAe,CAAC,OAAO,CAAC;;QAumBvD,uDAAuD;QACvD,wDAAwD;QAExD,IAAI,CAAC,oBAAoB,GAAG,IAAI,KAAK,CAAW,CAAC,CAAC,EAAC,wDAAwD;;QAE3G,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;QACxC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;QACxC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI;;QAExC,yCAAyC;QACzC,IAAI,CAAC,UAAU,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC;;QAErC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;;QAEzB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;;QAEjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,4BAA4B,CAAC,CAAC;;QAEnD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACxD,CAAC;IA7iCD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;;YAEtB,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAED,KAAA,UAAkB,KAAwB;YAEzC,IAAI,IAAI,CAAC,QAAQ,IAAI,KAAK;gBACzB,MAAO,CAAA;;YAER,IAAI,CAAC,QAAQ,GAAG,KAAK;;YAErB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;;YAEjC,IAAI,CAAC,iBAAiB,CAAC,CAAC;;YAExB,IAAI,IAAI,CAAC,cAAc;gBACtB,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC7C,CAAC;;;;AAfA;;IA2FD;QAAA;;;;;;;;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;;YAEtB,OAAO,IAAI,CAAC,MAAM;QACnB,CAAC;QAED,KAAA,UAAiB,GAAU;YAE1B,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;gBACrB,MAAO,CAAA;;YAER,IAAI,CAAC,MAAM,IAAI,GAAG;;YAElB,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK;;YAE1C,IAAI,CAAC,eAAe,CAAC,CAAC;QACvB,CAAC;;;;AAZA;;IAiBD;QAAA;;UADG;aACH;YAEC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAC,UAAU,CAAC,kBAAkB;YAC9D,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAC,UAAU,CAAC,kBAAkB;YAC9D,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,GAAC,UAAU,CAAC,kBAAkB;;YAE9D,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;QAED,KAAA,UAAkB,KAAc;YAE/B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,GAAC,UAAU,CAAC,kBAAkB;YACvD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,GAAC,UAAU,CAAC,kBAAkB;YACvD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,GAAC,UAAU,CAAC,kBAAkB;;YAEvD,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1B,CAAC;;;;AATA;;IA2GD;QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAbG;QACJ,kCAAkC;QAEjC;;;;;;;;;UASG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;;YAEtB,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;QAED,KAAA,UAAkB,GAAU;YAE3B,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG;gBACtB,MAAO,CAAA;;YAER,IAAI,CAAC,OAAO,IAAI,GAAG;;YAEnB,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;;YAE3C,IAAI,CAAC,eAAe,CAAC,CAAC;QACvB,CAAC;;;;AAZA;;IAsBD;QAAA;;;;;;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,QAAQ;gBAChB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;;YAE1C,OAAO,CAAC;QACT,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,2BAA2B,CAAE;gBACrC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;gBACzD,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;gBACpC,IAAI,CAAC,2BAA2B,GAAG,KAAK;aACxC;YACD,OAAO,IAAI,CAAC,sBAAsB;QACnC,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,iBAAiB;QAC9B,CAAC;QAED,KAAA,UAA2B,KAAa;YAEvC,IAAI,IAAI,CAAC,iBAAiB,IAAI,KAAK;gBAClC,MAAO,CAAA;;YAER,IAAI,CAAC,iBAAiB,GAAG,KAAK;;YAE9B,IAAI,KAAK,CAAE;gBACV,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;gBAChC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aAClC;;YAED,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACjC,CAAC;;;;AAfA;;IAoBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAcD;QAAA;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,WAAW;QACxB,CAAC;;;;AAAA;IAmDD;QAAA;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,qBAAqB;QAClC,CAAC;QAED,KAAA,UAAwB,KAAa;YAEpC,IAAI,IAAI,CAAC,qBAAqB,IAAI,KAAK;gBACtC,MAAO,CAAA;;YAER,IAAI,CAAC,qBAAqB,GAAG,KAAK;;YAElC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,GAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC;QACrF,CAAC;;;;AAVA;;IAoBD;QAAA;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;;;;AAAA;IASD;QAAA;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;;;;AAAA;IAiCD;QAAA;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,kBAAkB;QAC/B,CAAC;QAED,KAAA,UAAqB,KAAe;YAEnC,IAAI,IAAI,CAAC,kBAAkB,IAAI,KAAK;gBACnC,MAAO,CAAA;;YAER,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,kBAAkB;gBAC1C,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;;YAE5D,IAAI,CAAC,kBAAkB,GAAG,KAAK;;YAE/B,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK;gBACxB,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;;YAExC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,GAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,GAAG,IAAI,CAAC;QACxF,CAAC;;;;AAhBA;;IAqBD;QAAA;;UADG;aACH;YAEC,IAAI,CAAC,IAAI,CAAC,cAAc;gBACvB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;;YAEzD,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,iBAAiB;QAC9B,CAAC;QAED,KAAA,UAA2B,KAAsB;YAEhD,IAAI,CAAC,iBAAiB,GAAG,KAAK;QAC/B,CAAC;;;;AALA;;IAUD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,MAAM;QACnB,CAAC;QAGD,KAAA,UAAiB,KAAc;YAE9B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;;YAE3B,IAAI,CAAC,eAAe,CAAC,CAAC;QACvB,CAAC;;;;AARA;;IAoCD;QAAA;;;;;;;;;;;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,KAAK;QAClB,CAAC;;;;AAAA;IAmBD;QAAA;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU,GAAC,UAAU,CAAC,kBAAkB;QACrD,CAAC;QAED,KAAA,UAAqB,GAAU;YAE9B,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG;gBACxB,MAAO,CAAA;;YAER,IAAI,CAAC,UAAU,GAAG,GAAG,GAAC,UAAU,CAAC,kBAAkB;;YAEnD,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1B,CAAC;;;;AAVA;;IAmBD;QAAA;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU,GAAC,UAAU,CAAC,kBAAkB;QACrD,CAAC;QAED,KAAA,UAAqB,GAAU;YAE9B,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG;gBACxB,MAAO,CAAA;;YAER,IAAI,CAAC,UAAU,GAAG,GAAG,GAAC,UAAU,CAAC,kBAAkB;;YAEnD,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1B,CAAC;;;;AAVA;;IAmBD;QAAA;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU,GAAC,UAAU,CAAC,kBAAkB;QACrD,CAAC;QAED,KAAA,UAAqB,GAAU;YAE9B,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG;gBACxB,MAAO,CAAA;;YAER,IAAI,CAAC,UAAU,GAAG,GAAG,GAAC,UAAU,CAAC,kBAAkB;;YAEnD,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1B,CAAC;;;;AAVA;;IAwED;QAAA;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAED,KAAA,UAAkB,GAAU;YAE3B,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG;gBACvB,MAAO,CAAA;;YAER,IAAI,CAAC,QAAQ,GAAG,GAAG;;YAEnB,IAAI,CAAC,eAAe,CAAC,CAAC;QACvB,CAAC;;;;AAVA;;IAoBD;QAAA;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAED,KAAA,UAAkB,GAAU;YAE3B,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG;gBACvB,MAAO,CAAA;;YAER,IAAI,CAAC,QAAQ,GAAG,GAAG;;YAEnB,IAAI,CAAC,eAAe,CAAC,CAAC;QACvB,CAAC;;;;AAVA;;IAqBD;QAAA;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAED,KAAA,UAAkB,GAAU;YAE3B,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG;gBACvB,MAAO,CAAA;;YAER,IAAI,CAAC,QAAQ,GAAG,GAAG;;YAEnB,IAAI,CAAC,eAAe,CAAC,CAAC;QACvB,CAAC;;;;AAVA;;IAeD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,mBAAmB,CAAE;gBAC7B,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,WAAW,CAAE;oBACxE,IAAI,UAAU,GAAY,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,CAAC;oBAC5H,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC;oBACtE,uIAAuI;iBACvI,KAAM;oBACN,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC;iBACxD;;gBAED,IAAI,CAAC,mBAAmB,GAAG,KAAK;aAChC;YACD,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;;;;AAAA;IAED;QAAA,KAAA;YAEC,IAAI,IAAI,CAAC,qBAAqB;gBAC7B,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;;YAE9B,OAAO,IAAI,CAAC,gBAAgB;QAC7B,CAAC;;;;AAAA;IA6BD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,qBAAqB;QAClC,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;QAED,KAAA,UAAyB,KAAa;YAErC,IAAI,KAAK,IAAI,IAAI,CAAC,cAAc;gBAC/B,MAAO,CAAA;;YAER,IAAI,CAAC,cAAc,GAAG,KAAK;;YAE3B,IAAI,CAAC,cAAc,CAAC,aAAa,GAAG,KAAK;QAC1C,CAAC;;;;AAVA;;IAkDD;QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAOD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,mBAAmB;QAChC,CAAC;QAED,KAAA,UAAmB,KAAa;YAE/B,IAAI,IAAI,CAAC,mBAAmB,IAAI,KAAK;gBACpC,MAAO,CAAA;;YAER,IAAI,CAAC,mBAAmB,GAAG,KAAK;;YAEhC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,QAAQ,GAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC;QACnF,CAAC;;;;AAVA;;IAsBD;QAAA;;;;;;;;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;;YAEtB,OAAO,IAAI,CAAC,MAAM;QACnB,CAAC;QAED,KAAA,UAAiB,GAAU;YAE1B,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;gBACrB,MAAO,CAAA;;YAER,IAAI,CAAC,MAAM,IAAI,GAAG;;YAElB,IAAI,CAAC,QAAQ,GAAG,GAAG,GAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK;;YAE1C,IAAI,CAAC,eAAe,CAAC,CAAC;QACvB,CAAC;;;;AAZA;;IAiBD;QAAA;;UADG;aACH;YAEC,uEAAuE;YACvE,4EAA4E;YAC5E,iDAAiD;YACjD,IAAI,IAAI,CAAC,cAAc;gBACtB,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;;YAElC,IAAI,IAAI,CAAC,mBAAmB,CAAE;gBAC7B,IAAI,CAAC,mBAAmB,GAAG,KAAK;gBAChC,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,cAAc,CAAC;aACjE;;YAED,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAYD;QAAA;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,EAAE;QACf,CAAC;QAED,KAAA,UAAa,GAAU;YAEtB,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG;gBACjB,MAAO,CAAA;;YAER,IAAI,CAAC,EAAE,GAAG,GAAG;;YAEb,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1B,CAAC;;;;AAVA;;IAsBD;QAAA;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,EAAE;QACf,CAAC;QAED,KAAA,UAAa,GAAU;YAEtB,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG;gBACjB,MAAO,CAAA;;YAER,IAAI,CAAC,EAAE,GAAG,GAAG;;YAEb,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1B,CAAC;;;;AAVA;;IA+BD;QAAA;;;;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,EAAE;QACf,CAAC;QAED,KAAA,UAAa,GAAU;YAEtB,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG;gBACjB,MAAO,CAAA;;YAER,IAAI,CAAC,EAAE,GAAG,GAAG;;YAEb,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC1B,CAAC;;;;AAVA;;IAeD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAED,KAAA,UAAmB,KAAY;YAE9B,IAAI,CAAC,QAAQ,GAAG,KAAK;QACtB,CAAC;;;;AALA;;IAsCD;;MADG;+CACH,UAAwB,IAAW,EAAE,QAAiB;QAErD,gBAAK,CAAC,gBAAgB,KAAC,OAAA,IAAI,EAAE,QAAQ,CAAC;;QAEtC,QAAQ,IAAI,CAAC;YACZ,KAAK,kBAAkB,CAAC,gBAAgB;gBACvC,IAAI,CAAC,wBAAwB,GAAG,IAAI;gBACpC,KAAM;AAAA,YACP,KAAK,kBAAkB,CAAC,gBAAgB;gBACvC,IAAI,CAAC,wBAAwB,GAAG,IAAI;gBACpC,KAAM;AAAA,YACP,KAAK,kBAAkB,CAAC,aAAa;gBACpC,IAAI,CAAC,qBAAqB,GAAG,IAAI;gBACjC,KAAM;AAAA,SACP;IACF,CAAC;;IAKD;;MADG;oCACH;QAEC,IAAI,KAAK,GAAiB,IAAI,aAAa,CAAC,CAAC;QAC7C,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;QACxB,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAClC,KAAK,CAAC,IAAI,GAAG,IAAI;;QAEjB,mCAAmC;QACnC,OAAO,KAAK;IACb,CAAC;;IAKD;;MADG;sCACH;QAEC,IAAI,IAAI,CAAC,MAAM;YACd,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;;QAE/B,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM;YAC/B,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAClC,CAAC;;IAKD;;MADG;2CACH;QAEC,IAAI,CAAC,OAAO,CAAC,CAAC;IACf,CAAC;;IA0BD;;;;;;;;;;;;;;;;;;;;;;;MADG;wCACH,UAAiB,qBAAmC;QAEnD,OAAO,IAAI,CAAC,OAAO;IACpB,CAAC;;IAoBD;;;;;;;;;;;;;;;;;MADG;sCACH,UAAe,qBAAmC;QAEjD,OAAO,IAAI,CAAC,OAAO;IACpB,CAAC;;IAmBD;;;;;;;;;;;;;;;;MADG;4CACH,UAAqB,KAAW;QAE/B,OAAO,KAAK;IACb,CAAC;;IAoBD;;;;;;;;;;;;;;;;;MADG;8CACH,UAAuB,KAAW;QAEjC,OAAO,IAAI,QAAQ,CAAC,CAAC;IACtB,CAAC;;IAUD;;;;;;;MADG;4CACH,UAAqB,GAAiB;QAErC,OAAO,KAAK;IACb,CAAC;;IAkBD;;;;;;;;;;;;;;;MADG;2CACH,UAAoB,CAAQ,EAAE,CAAQ,EAAE,SAAyB;QAAzB,wCAAA,SAAS,GAAW,KAAK;AAAA,QAEhE,OAAO,KAAK;IACb,CAAC;;IAKD;;MADG;gDACH,UAAyB,WAAoB,EAAE,YAAqB;QAEnE,IAAI,gBAAgB,GAAY,IAAI,CAAC,qBAAqB,CAAC,eAAe,CAAC,WAAW,CAAC;QACvF,IAAI,iBAAiB,GAAY,IAAI,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,YAAY,CAAC;QAC9F,IAAI,kBAAkB,GAAsB,IAAI,CAAC,oBAAoB;;QAErE,IAAI,CAAC,kBAAkB,CAAC,WAAW;YAClC,kBAAkB,CAAC,WAAW,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;QAEjD,IAAI,gBAAgB,GAAU,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,CAAC,WAAW,CAAC;;QAE9H,IAAI,gBAAgB,GAAG,CAAC;YACvB,OAAO,KAAK,CAAC;;QAEd,kBAAkB,CAAC,gBAAgB,GAAG,gBAAgB;QACtD,kBAAkB,CAAC,gBAAgB,GAAG,gBAAgB;QACtD,kBAAkB,CAAC,iBAAiB,GAAG,iBAAiB;QACxD,kBAAkB,CAAC,WAAW,GAAG,WAAW;QAC5C,kBAAkB,CAAC,YAAY,GAAG,YAAY;QAC9C,kBAAkB,CAAC,uBAAuB,GAAG,gBAAgB,IAAI,CAAC;;QAElE,OAAO,IAAI;IACZ,CAAC;;IAwBD;;;;;;;;;;;;;;;;;;;;;MADG;8CACH,UAAuB,OAAgB;QAEtC,OAAO,IAAI,KAAK,CAAC,CAAC;IACnB,CAAC;;IAQD;;;;;MADG;qCACH,UAAc,MAAe,EAAE,MAAsB;QAAtB,qCAAA,MAAM,GAAY,IAAI;AAAA,QAGpD,IAAI,KAAK;QACT,IAAI,KAAK;QACT,IAAI,KAAK;QACT,IAAI,GAAG;;QAEP,IAAI,MAAM,IAAI,IAAI;YACjB,MAAM,GAAG,QAAQ,CAAC,MAAM;;YAExB,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;;QAEpB,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QACjD,KAAK,CAAC,SAAS,CAAC,CAAC;;QAEjB,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;QAClC,KAAK,CAAC,SAAS,CAAC,CAAC;;QAEjB,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI,CAAE;YACxB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YAClB,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;YAClB,KAAK,CAAC,CAAC,GAAG,CAAC;YACX,KAAK,CAAC,SAAS,CAAC,CAAC;SACjB;;QAED,KAAK,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC;;QAEjC,GAAG,GAAG,aAAa,CAAC,kBAAkB;;QAEtC,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;;QAEV,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;;QAEV,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;QAChB,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;QACjB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;;QAEX,IAAI,CAAC,GAAY,IAAI,QAAQ,CAAC,CAAC;QAC/B,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;;QAEtB,IAAI,GAAG,GAAY,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;;QAEnC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;;QAEvB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;;IAyBD;;;;;;;;;;;;;;;;;;;;;;MADG;4CACH,UAAqB,KAAW;QAE/B,OAAO,IAAI,KAAK,CAAC,CAAC;IACnB,CAAC;;IAUD;;;;;;MAFG;qCAEH,UAAc,EAAS,EAAE,EAAS,EAAE,EAAS;QAE5C,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,IAAI,EAAE;YAClD,MAAO,CAAA;;QAER,IAAI,CAAC,EAAE,GAAG,EAAE;QACZ,IAAI,CAAC,EAAE,GAAG,EAAE;QACZ,IAAI,CAAC,EAAE,GAAG,EAAE;;QAEZ,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;;IASD;;;;;;MADG;wCACH,UAAiB,EAAS,EAAE,EAAS,EAAE,EAAS;QAE/C,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI;YACtB,IAAI,CAAC,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;QAE9B,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;QACnB,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE;;QAEnB,IAAI,CAAC,eAAe,CAAC,CAAC;IACvB,CAAC;;IAOD;;;;MADG;oCACH,UAAa,KAAY;QAExB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACpC,CAAC;;IAKD;;MADG;sDACH,UAA+B,MAAa;QAE3C,IAAI,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,YAAY,CAAE;YACzD,IAAI,KAAK,GAAmB,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,KAAK,GAAY,KAAK,CAAC,CAAC,CAAC;YAC7B,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,aAAa;YAC7B,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;YACvB,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;YACvB,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;YACvB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC;;YAExC,sBAAsB;YACtB,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,WAAW;gBACtE,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;;YAEtI,OAAO,IAAI,CAAC,kBAAkB;SAC9B;;QAED,OAAO,IAAI,CAAC,cAAc;IAC3B,CAAC;;IAOD;;;;MADG;mCACH,UAAY,KAAY;QAEvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACpC,CAAC;;IAQD;;;;;MADG;qCACH,UAAc,IAAa,EAAE,KAAY;QAExC,IAAI,CAAC,GAAY,IAAI,QAAQ,CAAC,CAAC;QAC/B,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC;;QAE9B,IAAI,GAAG,GAAY,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;;QAEnC,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;QACxB,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC;;QAExB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;;IASD;;;;;;MADG;uCACH,UAAgB,EAAS,EAAE,EAAS,EAAE,EAAS;QAE9C,IAAI,CAAC,UAAU,GAAG,EAAE,GAAC,UAAU,CAAC,kBAAkB;QAClD,IAAI,CAAC,UAAU,GAAG,EAAE,GAAC,UAAU,CAAC,kBAAkB;QAClD,IAAI,CAAC,UAAU,GAAG,EAAE,GAAC,UAAU,CAAC,kBAAkB;;QAElD,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;;IAKD;;MADG;kDACH,UAA2B,IAAW,EAAE,QAAiB;QAExD,gBAAK,CAAC,mBAAmB,KAAC,OAAA,IAAI,EAAE,QAAQ,CAAC;;QAEzC,IAAI,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC;YACxC,MAAO,CAAA;;QAER,QAAQ,IAAI,CAAC;YACZ,KAAK,kBAAkB,CAAC,gBAAgB;gBACvC,IAAI,CAAC,wBAAwB,GAAG,KAAK;gBACrC,KAAM;AAAA;YAEP,KAAK,kBAAkB,CAAC,gBAAgB;gBACvC,IAAI,CAAC,wBAAwB,GAAG,KAAK;gBACrC,KAAM;AAAA;YAEP,KAAK,kBAAkB,CAAC,aAAa;gBACpC,IAAI,CAAC,qBAAqB,GAAG,KAAK;gBAClC,KAAM;AAAA,SACP;IACF,CAAC;;IAQD;;;;;MADG;wCACH,UAAiB,IAAa,EAAE,QAAe;QAE9C,IAAI,CAAC,GAAU,IAAI,CAAC,CAAC,EAAE,CAAC,GAAU,IAAI,CAAC,CAAC,EAAE,CAAC,GAAU,IAAI,CAAC,CAAC;QAC3D,IAAI,GAAG,GAAU,QAAQ,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,CAAC,GAAC,CAAC,CAAC;;QAEpD,IAAI,CAAC,EAAE,IAAI,CAAC,GAAC,GAAG;QAChB,IAAI,CAAC,EAAE,IAAI,CAAC,GAAC,GAAG;QAChB,IAAI,CAAC,EAAE,IAAI,CAAC,GAAC,GAAG;;QAEhB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;;IAQD;;;;;MADG;6CACH,UAAsB,IAAa,EAAE,QAAe;QAEnD,IAAI,CAAC,GAAU,IAAI,CAAC,CAAC,EAAE,CAAC,GAAU,IAAI,CAAC,CAAC,EAAE,CAAC,GAAU,IAAI,CAAC,CAAC;QAC3D,IAAI,GAAG,GAAU,QAAQ,GAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAC,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,CAAC,GAAC,CAAC,CAAC;;QAEpD,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC,GAAC,GAAG,EAAE,CAAC,GAAC,GAAG,EAAE,CAAC,GAAC,GAAG,CAAC;;QAEvD,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;;QAEzC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;;QAErB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;;IAOD;;;;MADG;kCACH,UAAW,KAAY;QAEtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACpC,CAAC;;IAUD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,mBAAmB;QAChC,CAAC;;;;AAAA;IAOD;QAAA;;;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,cAAc;gBACtB,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;;YAEzB,OAAO,IAAI,CAAC,SAAS;QACtB,CAAC;QAED,KAAA,UAAsB,GAAY;YAGjC,iDAAiD;YACjD,yBAAyB;YACzB;;;;;;;;gBAQI;YACJ,IAAI,QAAQ,GAAmB,GAAG,CAAC,SAAS,CAAC,CAAC;YAC9C,IAAI,GAAG;;YAEP,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;;YAEjB,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAE;gBAC7D,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;gBACf,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;gBACf,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC;;gBAEf,IAAI,CAAC,kBAAkB,CAAC,CAAC;aACzB;;YAED,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;;YAEjB,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,CAAC,CAAE;gBACrF,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;gBACvB,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;;gBAEvB,IAAI,CAAC,kBAAkB,CAAC,CAAC;aACzB;;YAED,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC;;YAEjB,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,CAAE;gBAC/E,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;gBACrB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;;gBAErB,IAAI,CAAC,eAAe,CAAC,CAAC;aACtB;QACF,CAAC;;;;AAhDA;;IAqDD;QAAA;;UADG;aACH;YAEC,IAAI,CAAC,IAAI,CAAC,oBAAoB;gBAC7B,IAAI,CAAC,oBAAoB,GAAG,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;;YAE1D,OAAO,IAAI,CAAC,oBAAoB;QACjC,CAAC;;;;AAAA;IAKD;;MADG;yCACH,UAAkB,KAA4B;QAE7C,IAAI,CAAC,QAAQ,GAAG,KAAK;;QAErB,IAAI,KAAK,CAAE;YACV,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,aAAa,CAAC;YACtD,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,mBAAmB,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC;SAC9B,KAAM;YACN,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC;YACvC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC;YACrC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC;;YAEpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;SACrB;IACF,CAAC;;IAKD;;MADG;2DACH;QAEC,6CAA6C;QAC7C,iDAAiD;QACjD,OAAO,IAAI,sBAAsB,CAAC,CAAC;IACpC,CAAC;;IAKD;;MADG;yDACH;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAKD;;MADG;gDACH;QAEC,IAAI,CAAC,eAAe,GAAG,IAAI;QAC3B,IAAI,CAAC,mBAAmB,GAAG,IAAI;;QAG/B,IAAI,IAAI,CAAC,QAAQ;YAChB,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC7B,CAAC;;IAKD;;MADG;wDACH;QAEC,IAAI,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,iBAAiB;QACpD,IAAI,CAAC,2BAA2B,GAAG,CAAC,IAAI,CAAC,iBAAiB;QAC1D,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,iBAAiB;;QAElD,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,iBAAiB;;QAElD,IAAI,IAAI,CAAC,QAAQ;YAChB,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;;QAE5B,IAAI,IAAI,CAAC,8BAA8B;YACtC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACpC,CAAC;;IAKD;;MADG;4CACH;QAEC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAC,IAAI,CAAC,QAAQ;QACpD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,GAAC,IAAI,CAAC,QAAQ;QACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,GAAC,IAAI,CAAC,QAAQ;;QAEpD,IAAI,CAAC,eAAe,GAAG,KAAK;IAC7B,CAAC;;IAKD;;MADG;2DACH,UAAoC,KAAa;QAEhD,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,qBAAqB,IAAI,KAAK;;QAEjE,2GAA2G;QAC3G,IAAI,IAAI,CAAC,sBAAsB,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAC1E,IAAI,CAAC,iBAAiB,GAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IAC5D,CAAC;;IAKD;;MADG;wDACH,UAAiC,KAAe;QAE/C,+DAA+D;QAC/D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,kBAAkB,IAAI,KAAK;IAC5D,CAAC;;IAKD;;MADG;yDACH,UAAkC,KAAa;QAE9C,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,mBAAmB,IAAI,KAAK;IAC9D,CAAC;;IAKD;;MADG;+CACH;QAGC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;QACrB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;QACrB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;;QAErB,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU;QAC7B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU;QAC7B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU;;QAE7B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC3B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;QAC3B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ;;QAE3B,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC;;QAEnD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAE;YACrB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAC,IAAI,CAAC,QAAQ,CAAC;YAC3H,IAAI,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,WAAW;gBAClD,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;SAC/E;;QAED,IAAI,CAAC,cAAc,GAAG,KAAK;QAC3B,IAAI,CAAC,cAAc,GAAG,KAAK;QAC3B,IAAI,CAAC,cAAc,GAAG,KAAK;QAC3B,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,CAAC,WAAW,GAAG,KAAK;IACzB,CAAC;;IAKD;;MADG;oDACH;QAEC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAE;YAC7C,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC;YAC5D,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;SAC9C,KAAM;YACN,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC;SAC/C;;QAED,IAAI,CAAC,qBAAqB,GAAG,KAAK;IACnC,CAAC;;IAED,0CAAA,UAAuB,UAAsB;QAE5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC;;QAEnC,OAAO,UAAU;IAClB,CAAC;;IAGD,6CAAA,UAA0B,UAAsB;QAE/C,IAAI,KAAK,GAAU,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC;;QAEzD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;QAEnC,OAAO,UAAU;IAClB,CAAC;;IAWD;;;;;;;;MADG;8CACH,UAAuB,yBAAgC,EAAE,WAAmB;QAE3E,OAAO,KAAK;IACb,CAAC;;IAKD;;MADG;+CACH;QAEC,IAAI,IAAI,CAAC,YAAY;YACpB,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7B,CAAC;;IAKD;;MADG;0CACH;QAEC,OAAO,IAAI,CAAC,oBAAoB;IACjC,CAAC;;IAKD;;MADG;+CACH;QAEC,OAAO,IAAI,CAAC,sBAAsB;IACnC,CAAC;;IAKD;;MADG;yCACH,UAAkB,KAAW;QAE5B,mFAAmF;QACnF;;;;;;;;;;;YAWI;QAEJ,IAAI,IAAI,CAAC,OAAO,IAAI,KAAK;YACxB,MAAO,CAAA;;QAER,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;;QAEzB,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YACzD,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnC,CAAC;;IAKD;;MADG;4CACH,UAAqB,KAAW;QAE/B,IAAI,IAAI,CAAC,OAAO,CAAE;YACjB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAC;;YAE/E,sCAAsC;YACtC,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC;SACpC;;QAED,IAAI,CAAC,OAAO,GAAG,KAAK;;QAEpB,IAAI,KAAK,CAAE;YACV,KAAK,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;;YAEpE,gCAAgC;YAChC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC;SAC3B;;QAED,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACzB,CAAC;;IAKD;;MADG;oDACH;QAEC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACzB,IAAI,CAAC,gBAAgB,GAAG,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;;QAE3F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC1C,CAAC;;IAKD;;MADG;oDACH;QAEC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACzB,IAAI,CAAC,gBAAgB,GAAG,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;;QAE3F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC1C,CAAC;;IAKD;;MADG;iDACH;QAEC,IAAI,CAAC,IAAI,CAAC,aAAa;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;;QAErF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;IACvC,CAAC;;IAKD;;MADG;gDACH;QAEC,IAAI,IAAI,CAAC,qBAAqB,CAAE;YAC/B,IAAI,CAAC,IAAI,CAAC,aAAa;gBACtB,IAAI,CAAC,aAAa,GAAG,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;;YAErF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;SACtC;IACF,CAAC;;IAKD;;MADG;yDACH;QAEC,IAAI,CAAC,IAAI,CAAC,sBAAsB;YAC/B,IAAI,CAAC,sBAAsB,GAAG,IAAI,kBAAkB,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;;QAEvG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC;IAChD,CAAC;;IAOD;;;;MADG;iDACH;QAEC,IAAI,IAAI,CAAC,cAAc;YACtB,MAAO,CAAA;;QAER,IAAI,CAAC,cAAc,GAAG,IAAI;;QAE1B,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,iBAAiB;YACzD,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;IACnC,CAAC;;IAKD;;MADG;kDACH;QAEC,IAAI,IAAI,CAAC,mBAAmB;YAC3B,IAAI,CAAC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;;IAKD;;MADG;8CACH;QAEC,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;;QAEtF,IAAI,IAAI,CAAC,WAAW;YACnB,MAAO,CAAA;;QAER,IAAI,CAAC,WAAW,GAAG,IAAI;;QAEvB,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;;IAKD;;MADG;iDACH;QAEC,IAAI,IAAI,CAAC,cAAc;YACtB,MAAO,CAAA;;QAER,IAAI,CAAC,cAAc,GAAG,IAAI;;QAE1B,IAAI,CAAC,kBAAkB,CAAC,CAAC;;QAEzB,IAAI,IAAI,CAAC,wBAAwB;YAChC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/B,CAAC;;IAKD;;MADG;iDACH;QAEC,IAAI,IAAI,CAAC,cAAc;YACtB,MAAO,CAAA;;QAER,IAAI,CAAC,cAAc,GAAG,IAAI;;QAE1B,IAAI,CAAC,kBAAkB,CAAC,CAAC;;QAEzB,IAAI,IAAI,CAAC,wBAAwB;YAChC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;IAC/B,CAAC;;IAKD;;MADG;8CACH;QAEC,IAAI,IAAI,CAAC,WAAW;YACnB,MAAO,CAAA;;QAER,IAAI,CAAC,WAAW,GAAG,IAAI;;QAEvB,IAAI,CAAC,kBAAkB,CAAC,CAAC;;QAEzB,IAAI,IAAI,CAAC,qBAAqB;YAC7B,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5B,CAAC;IACF,qBAAC;AAAD,CAAC,EA/qE2B,cAAc,EA+qEzC;;AAED,8BAAuB,CAAA;;;;;;;;;;AC/0EvB,iEAEwE;;AAExE,2EAAiF;AACjF,mEAAyE;;AAEzE;;;;;;;;;;;;;EAaG;AACH;IAAuB,2BAAc;IAyBpC;;MADG;IACH;QAEC,WAAM,KAAA,CAAC;;QAEP,IAAI,CAAC,cAAc,GAAG,IAAI,KAAK,CAAkB,CAAC;IACnD,CAAC;IA1BD;QAAA,KAAA;YAEC,OAAO,SAAS,CAAC,QAAQ;QAC1B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;;;;AAAA;IAED,sCAAA;QAEC,OAAO,IAAI,CAAC,cAAc;IAC3B,CAAC;;IAYD,yCAAA,UAA2B,SAAkB;QAE5C,IAAI,GAAG,GAAU,IAAI,CAAC,cAAc,CAAC,MAAM;QAC3C,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACxD,CAAC;;IAMD;;;MADG;wCACH,UAAsB,WAA2B;QAEhD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;;QAErC,WAAW,CAAC,cAAc,GAAG,IAAI;;QAEjC,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,kBAAkB,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,aAAa,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC,CAAC;;QAEtF,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;IACpC,CAAC;;IAMD;;;MADG;2CACH,UAAyB,WAA2B;QAEnD,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;;QAEvE,WAAW,CAAC,cAAc,GAAG,IAAI;;QAEjC,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,oBAAoB,CAAC;YAC5D,IAAI,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,aAAa,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC,CAAC;;QAExF,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC;IACpC,CAAC;;IAMD;;;MADG;+BACH;QAEC,IAAI,KAAK,GAAY,IAAI,QAAQ,CAAC,CAAC;QACnC,IAAI,GAAG,GAAU,IAAI,CAAC,cAAc,CAAC,MAAM;;QAE3C,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC;YAClC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;;QAEtD,OAAO,KAAK;IACb,CAAC;;IAMD;;;MADG;+BACH,UAAa,KAAY;QAExB,IAAI,WAAW,GAAU,IAAI,CAAC,cAAc,CAAC,MAAM;QACnD,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;;IAKD;;MADG;iCACH;QAEC,IAAI,WAAW,GAAU,IAAI,CAAC,cAAc,CAAC,MAAM;;QAEnD,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,EAAE,CAAC,CAAE;YAC5C,IAAI,OAAO,GAAmB,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACpD,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;YAC/B,OAAO,CAAC,OAAO,CAAC,CAAC;SACjB;IACF,CAAC;;IAOD;;;;MADG;iCACH,UAAe,MAAiB,EAAE,MAAiB;QAApC,qCAAA,MAAM,GAAU,CAAC;AAAA,QAAE,qCAAA,MAAM,GAAU,CAAC;AAAA,QAElD,IAAI,WAAW,GAAU,IAAI,CAAC,cAAc,CAAC,MAAM;;QAEnD,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,EAAE,CAAC;YAC1C,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;;IAED,uCAAA,UAAyB,OAAuB;QAE/C,IAAI,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,cAAc,CAAC;YACtD,IAAI,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/E,CAAC;IACF,gBAAC;AAAD,CAAC,EAjIsB,cAAc,EAiIpC;;AAED,yBAAkB,CAAA;;;;ACxJlB;;;;;EAKG;AACH;IAAA;IAWA,CAAC;AAAA,IANA,sBAA8B,QAAQ;;IAKtC,sBAA8B,QAAQ;IACvC,oBAAC;AAAD,CAAC,IAAA;;AAED,6BAAsB,CAAA;;;;ACnBtB;;;;;;;;;EASG;AACH;IAAA;IAIA,CAAC;AAAA,IAFA,+BAAgC,SAAS;IACzC,+BAAgC,SAAS;IAC1C,2BAAC;AAAD,CAAC,IAAA;;AAED,oCAA6B,CAAA;;;;AChB7B;;;;;;;;;;;;;EAyBG;AACH;IAAA;IAw0BA,CAAC;AAAA,IAjyBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;yCACH,UAAuB,MAAiB,EAAE,MAAoB,EAAE,MAAqB,EAAE,MAAsB;QAAnE,qCAAA,MAAM,GAAU,IAAI;AAAA,QAAE,qCAAA,MAAM,GAAW,IAAI;AAAA,QAAE,qCAAA,MAAM,GAAW,KAAK;AAAA,IAG7G,CAAC;;IAgBD;;;;;;;;;;;;;MADG;mCACH,UAAiB,KAAY,CAAC,OAAO,GAAE,KAAgB;QAAhB,oCAAA,KAAK,GAAU,CAAC;AAAA,IAGvD,CAAC;;IAqFD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;2CACH,UAAyB,IAAiB,EAAE,MAA4B,EAAE,MAAoB,EAAE,MAA4B,EAAE,MAAoB,EAAE,YAA2B,EAAE,mBAAkC,EAAE,eAA0B;QAAjH,qCAAA,MAAM,GAAU,IAAI;AAAA,QAAE,2CAAA,YAAY,GAAU,KAAK;AAAA,QAAE,kDAAA,mBAAmB,GAAU,KAAK;AAAA,QAAE,8CAAA,eAAe,GAAU,CAAC;AAAA,IAG/O,CAAC;;IA8DD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAXG;IACJ,+DAA+D;IAC/D,KAAK;IACL,EAAE;IACF,KAAK;IAEJ;;;;MAIG;+BACH;IAGA,CAAC;;IASD;;;;;;MADG;kCACH,UAAgB,cAAuB;IAGvC,CAAC;;IAoDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;sCACH,UAAoB,SAAgB,EAAE,SAAgB,EAAE,SAAgB,EAAE,SAAgB,EAAE,OAAc,EAAE,OAAc;IAG1H,CAAC;;IAgCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;iCACH,UAAe,QAAe,EAAE,QAAe,EAAE,OAAc,EAAE,OAAc;IAG/E,CAAC;;IAiBD;;;;;;;;;;;;;;MADG;oCACH,UAAkB,CAAQ,EAAE,CAAQ,EAAE,MAAa;IAGnD,CAAC;;IAkBD;;;;;;;;;;;;;;;MADG;qCACH,UAAmB,CAAQ,EAAE,CAAQ,EAAE,KAAY,EAAE,MAAa;IAGlE,CAAC;;IAcD;;;;;;;;;;;MADG;0CACH,UAAwB,YAAiC;IAGzD,CAAC;;IA+CD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;kCACH,UAAgB,QAA8B,EAAE,IAAkB,EAAE,OAA2B;IAG/F,CAAC;;IAmBD;;;;;;;;;;;;;;;;MADG;kCACH,UAAgB,CAAQ,EAAE,CAAQ,EAAE,KAAY,EAAE,MAAa;IAG/D,CAAC;;IA4BD;;;;;;;;;;;;;;;;;;;;;;;;;MADG;uCACH,UAAqB,CAAQ,EAAE,CAAQ,EAAE,KAAY,EAAE,MAAa,EAAE,YAAmB,EAAE,aAA0B;QAA1B,4CAAA,aAAa,GAAU,GAAG;AAAA,IAGrH,CAAC;;IAsBD,4KApB4K;IAE5K;;;;;;;;;;;;;;;;;MAiBG;uCACH,UAAqB,QAAsB,EAAE,OAAoC,EAAE,OAA4B,EAAE,OAA8B;QAAlG,sCAAA,OAAO,GAAyB,IAAI;AAAA,QAAE,sCAAA,OAAO,GAAiB,IAAI;AAAA,QAAE,sCAAA,OAAO,GAAmB,IAAI;AAAA,IAG/I,CAAC;;IAaD;;;;;;;;;;MADG;iCACH;IAGA,CAAC;;IA+BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;yCACH,UAAuB,MAAiB,EAAE,MAAoB,EAAE,MAAqB,EAAE,MAAsB;QAAnE,qCAAA,MAAM,GAAU,IAAI;AAAA,QAAE,qCAAA,MAAM,GAAW,IAAI;AAAA,QAAE,qCAAA,MAAM,GAAW,KAAK;AAAA,IAG7G,CAAC;;IAwED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MADG;2CACH,UAAyB,IAAiB,EAAE,MAA4B,EAAE,MAAoB,EAAE,MAAoB,EAAE,MAAoB,EAAE,YAAgC,EAAE,mBAA8C,EAAE,eAA0B;QAAlI,qCAAA,MAAM,GAAU,IAAI;AAAA,QAAE,2CAAA,YAAY,GAAgB,IAAI;AAAA,QAAE,kDAAA,mBAAmB,GAAuB,IAAI;AAAA,QAAE,8CAAA,eAAe,GAAU,CAAC;AAAA,IAGxP,CAAC;;IA6KD;;;;;;;;;;;;;;;;;;;;;;;;;;MAjJG;IACJ,+DAA+D;IAC/D,KAAK;IACL,EAAE;IACF,KAAK;IAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA0IG;mCACH,UAAiB,SAAoB,EAAE,KAAwB,EAAE,KAAgB,EAAE,YAA4B,EAAE,SAA8B,EAAE,IAAqB,EAAE,MAAwB,EAAE,UAAqB;QAAtM,wCAAA,SAAS,GAAU,CAAC;AAAA,QAAE,oCAAA,KAAK,GAAkB,CAAC;AAAA,QAAE,oCAAA,KAAK,GAAU,CAAC;AAAA,QAAE,2CAAA,YAAY,GAAW,KAAK;AAAA,QAAE,wCAAA,SAAS,GAAiB,IAAI;AAAA,QAAE,mCAAA,IAAI,GAAa,IAAI;AAAA,QAAE,qCAAA,MAAM,GAAc,IAAI;AAAA,QAAE,yCAAA,UAAU,GAAU,CAAC;AAAA,IAGvN,CAAC;;IAkBD;;;;;;;;;;;;;;;MADG;gCACH,UAAc,CAAQ,EAAE,CAAQ;IAGhC,CAAC;;IAYD;;;;;;;;;MADG;gCACH,UAAc,CAAQ,EAAE,CAAQ;IAGhC,CAAC;IACF,gBAAC;AAAD,CAAC,IAAA;;AAED,yBAAkB,CAAA;;;;ACp2BlB;AAeA;;;ACfA;AAeuB;;;ACfvB;AAoDwB;;;ACpDxB;AAWA;;;ACXA;AAmBuB;;;ACnBvB;AAwBkB;;;ACxBlB;;;;;;EAMG;AACH;IAAA;IA8BA,CAAC;AAAA,IAfA,iCAAkC,WAAW;;IAc7C,0BAA2B,KAAK;IACjC,2BAAC;AAAD,CAAC,IAAA;;AAED,oCAA6B,CAAA;;;;ACvC7B;;;;;;;EAOG;AACH;IAAA;IAmBA,CAAC;AAAA,IAbA,mBAA6B,OAAO;;IAMpC,mBAA6B,OAAO;;IAMpC,mBAA6B,OAAO;IACrC,kBAAC;AAAD,CAAC,IAAA;;AAED,2BAAoB,CAAA;;;;;;;;;;AC7BpB,yFAA6F;AAC7F,iEAAwE;;AAIxE,+EAAoF;AACpF,6DAAoE;;AAGpE;IAAwB,4BAAsB;IA2B7C;QAEC,WAAM,KAAA,CAAC;QA3BR,KAAQ,MAAM,GAAU,QAAQ,CAAC;QACjC,KAAQ,OAAO,GAAU,CAAC,CAAC;QAC3B,KAAQ,OAAO,GAAU,CAAC,CAAC;QAC3B,KAAQ,OAAO,GAAU,CAAC,CAAC;QAE3B,KAAQ,aAAa,GAAU,QAAQ,CAAC;QACxC,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAC5B,KAAO,UAAU,GAAU,CAAC,CAAC;QAC7B,KAAO,UAAU,GAAU,CAAC,CAAC;QAC7B,KAAO,UAAU,GAAU,CAAC,CAAC;QAE7B,KAAQ,SAAS,GAAU,CAAC,CAAC;QAC7B,KAAO,WAAW,GAAU,CAAC,CAAC;QAC9B,KAAO,WAAW,GAAU,CAAC,CAAC;QAC9B,KAAO,WAAW,GAAU,CAAC,CAAC;QAE9B,KAAQ,QAAQ,GAAU,CAAC,CAAC;QAC5B,KAAO,UAAU,GAAU,CAAC,CAAC;QAC7B,KAAO,UAAU,GAAU,CAAC,CAAC;QAC7B,KAAO,UAAU,GAAU,CAAC,CAAC;QAE7B,KAAQ,aAAa,GAAW,KAAK,CAAC;IAOtC,CAAC;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,KAAa;YAEpC,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK;gBAC9B,MAAO,CAAA;;YAER,IAAI,CAAC,aAAa,GAAG,KAAK;;YAE1B,IAAI,KAAK,CAAE;gBACV,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;oBAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;;gBAEjD,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,IAAI;aAC/B,KAAM;gBACN,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;gBAC5B,IAAI,CAAC,aAAa,GAAG,IAAI;aACzB;;YACD,IAAI;YACJ,IAAI,CAAC,aAAa,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;QACnE,CAAC;;;;AApBA;;IAsBD,0CAAA;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,SAAS;QACtB,CAAC;QAED,KAAA,UAAoB,KAAY;YAE/B,IAAI,KAAK,GAAG,CAAC;gBACZ,KAAK,GAAG,CAAC,CAAC;;YAEX,IAAI,CAAC,SAAS,GAAG,KAAK;YACtB,IAAI,CAAC,cAAc,CAAC,CAAC;QACtB,CAAC;;;;AATA;;IAWD;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAED,KAAA,UAAmB,KAAY;YAE9B,IAAI,KAAK,GAAG,CAAC;gBACZ,KAAK,GAAG,CAAC,CAAC;;YAEX,IAAI,CAAC,QAAQ,GAAG,KAAK;YACrB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AATA;;IAWD;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,MAAM;QACnB,CAAC;QAED,KAAA,UAAiB,KAAY;YAE5B,IAAI,CAAC,MAAM,GAAG,KAAK;YACnB,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,GAAC,IAAI;YAChD,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAC,IAAI;YAC/C,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAC,IAAI;;YAExC,IAAI,CAAC,aAAa,CAAC,CAAC;YACpB,IAAI,CAAC,cAAc,CAAC,CAAC;QACtB,CAAC;;;;AAXA;;IAaD;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;QAED,KAAA,UAAmB,KAAY;YAE9B,IAAI,KAAK,GAAG,CAAC;gBACZ,KAAK,GAAG,CAAC;iBACL,IAAI,KAAK,GAAG,CAAC;gBACjB,KAAK,GAAG,CAAC,CAAC;;YAEX,IAAI,CAAC,QAAQ,GAAG,KAAK;YACrB,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AAXA;;IAaD;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,KAAY;YAEnC,IAAI,CAAC,aAAa,GAAG,KAAK;YAC1B,IAAI,CAAC,aAAa,CAAC,CAAC;QACrB,CAAC;;;;AANA;;IAQD,oCAAA;QAEC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,GAAC,IAAI,GAAC,IAAI,CAAC,QAAQ;QACxE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,GAAC,IAAI,GAAC,IAAI,CAAC,QAAQ;QACvE,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAC,IAAI,GAAC,IAAI,CAAC,QAAQ;IACjE,CAAC;;IAED,iDAAA,UAAkC,MAAc,EAAE,MAAa,EAAE,MAAsB;QAAtB,qCAAA,MAAM,GAAY,IAAI;AAAA,QAEtF,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAGD;QAAA,WADW;aACX;YAEC,OAAO,SAAS,CAAC,KAAK;QACvB,CAAC;;;;AAAA;IAED,qCAAA;QAEC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,SAAS;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,SAAS;QAC9C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,SAAS;IAC/C,CAAC;;IAED,oCAAA;QAEC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,QAAQ;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,QAAQ;QAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,GAAC,IAAI,CAAC,QAAQ;IAC7C,CAAC;;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;QAED,KAAA,UAAwB,KAAsB;YAE7C,IAAI,CAAC,aAAa,GAAG,KAAK;YAC1B,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,IAAI;QAChC,CAAC;;;;AANA;IAOF,iBAAC;AAAD,CAAC,EA/KuB,sBAAsB,EA+K7C;;AAED,0BAAmB,CAAA;;;;AC1LnB;;;EAGG;AACH;IAAA;IAoCA,CAAC;AAAA,IAzBA,2BAAkC,YAAY;;IAM9C,qBAA4B,MAAM;;IAOlC,uBAA8B,QAAQ;;IAWtC,yBAAgC,UAAU;IAC3C,qBAAC;AAAD,CAAC,IAAA;;AAED,8BAAuB,CAAA;;;;;;;;;;AC1CvB,kEAEyE;AACzE,0EAAgF;AAChF,kFAAuF;AACvF,yEAA+E;;AAE/E;;EAEG;AACH;IAA8B,kCAAe;IAmJ5C;;MADG;IACH;QAEC,WAAM,OAAA,IAAI,CAAC;QAxIZ,KAAQ,eAAe,GAAW,IAAI,CAAC;QACvC,KAAQ,sBAAsB,GAAG,IAAI,CAAC;QACtC,KAAQ,eAAe,GAAW,IAAI,CAAC;QACvC,KAAQ,YAAY,GAAW,IAAI,CAAC;;QAuInC,IAAI,CAAC,cAAc,GAAG,WAAW;IAClC,CAAC;IAzHD,iDAAA;QAEC,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC;;QAE9C,IAAI,MAAM,GAAU,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,mBAAmB,CAAC,GAAG,MAAM;QAC3D,MAAM,IAAI,CAAC;;QAEX,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,iBAAiB,CAAC,GAAG,MAAM;QACzD,MAAM,IAAI,CAAC;;QAEX,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,MAAM;QACtD,MAAM,IAAI,CAAC;;QAEX,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,MAAM;QAClD,MAAM,IAAI,CAAC;;QAEX,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,MAAM;QACnD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,mBAAmB,CAAC,GAAG,MAAM;QAC3D,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,iBAAiB,CAAC,GAAG,MAAM;QACzD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,cAAc,CAAC,GAAG,MAAM;QACtD,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,MAAM;;QAElD,IAAI,GAAG,GAAU,IAAI,CAAC,aAAa,GAAC,MAAM;;QAE1C,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;YAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC;aACpC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,GAAG;YACrC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;;QAE9B,IAAI,CAAC,mBAAmB,GAAG,KAAK;IACjC,CAAC;;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;;YAEhE,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEvC,IAAI,IAAI,CAAC,YAAY;gBACpB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEvD,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;;YAEhE,OAAO,IAAI,CAAC,eAAe;QAC5B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;;YAEhE,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEvC,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,YAAY;gBACpB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEvD,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,YAAY;gBACpB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEvD,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAYD,iDAAA;QAEC,IAAI,IAAI,CAAC,sBAAsB;YAC9B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;;QAEzE,OAAO,IAAI,CAAC,kBAAkB;IAC/B,CAAC;;IAKD;;MADG;gDACH,UAAuB,WAAyB,EAAE,SAAuB;QAExE,IAAI,CAAC;QACL,IAAI,CAAC;QACL,IAAI,MAAM;QACV,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,SAAS;QACb,IAAI,OAAO;;QAEX,IAAI,CAAC,eAAe,GAAG,WAAW;;QAElC,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI;YAC/B,IAAI,CAAC,eAAe,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC;;QAE5C,IAAI,CAAC,aAAa,GAAG,SAAS;;QAE9B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC;;QAE1C,IAAI,CAAC,sBAAsB,GAAG,IAAI;;QAElC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,GAAC,CAAC;;QAEjD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,GAAC,CAAC;;QAExC,IAAI,IAAI,GAAU,IAAI,CAAC,aAAa,GAAC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,WAAW,CAAC;;QAEhF,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;YAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC;aACrC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,IAAI;YACtC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;;QAE/B,CAAC,GAAG,CAAC;QACL,CAAC,GAAG,CAAC;QACL,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,mBAAmB,CAAC;QAC3D,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,mBAAmB,CAAC;QAC5D,SAAS,GAAG,IAAI,CAAC,UAAU;QAC3B,OAAO,GAAG,IAAI,KAAK,CAAC,CAAC;;QAErB,OAAO,CAAC,GAAG,WAAW,CAAC,MAAM,CAAE;YAC9B,MAAM,GAAG,CAAC,KAAK,GAAC,MAAM,GAAG,CAAC,CAAC,GAAE,SAAS,GAAG,WAAW;YACpD,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YAC5B,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;;YAEpC,MAAM,GAAG,CAAC,KAAK,GAAC,MAAM,GAAG,CAAC,CAAC,GAAE,WAAW,GAAG,SAAS;YACpD,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YAChC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;YACpC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;;YAEpC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAE;gBACb,IAAI,CAAC,GAAU,KAAK,GAAC,MAAM,GAAG,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;gBAClD,CAAC,GAAG,CAAC;gBACL,CAAC,IAAI,CAAC;aACN;;YAED,KAAK,IAAI,MAAM;SACf;;QAED,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;;QAE3B,IAAI,CAAC,iBAAiB,CAAC,CAAC;;QAExB,IAAI,CAAC,qBAAqB,CAAC,CAAC;;QAE5B,IAAI,CAAC,eAAe,GAAG,KAAK;IAC7B,CAAC;;IAKD;;MADG;gDACH,UAAuB,MAAoB;QAE1C,IAAI,CAAC;QACL,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,SAAS;;QAEb,IAAI,CAAC,UAAU,GAAG,MAAM;;QAExB,IAAI,MAAM,IAAI,IAAI,CAAE;YACnB,CAAC,GAAG,CAAC;YACL,CAAC,GAAG,CAAC;YACL,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,cAAc,CAAC;YACvD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,cAAc,CAAC;YACvD,SAAS,GAAG,IAAI,CAAC,UAAU;;YAE3B,KAAK,GAAG,MAAM;YACd,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;gBACzB,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAC,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAE,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;;gBAE9F,IAAI,EAAE,CAAC,IAAI,CAAC,CAAE;oBACb,CAAC,GAAG,CAAC;oBACL,CAAC,EAAE;iBACH;gBACD,KAAK,IAAI,MAAM;aACf;SACD;;QAED,IAAI,CAAC,qBAAqB,CAAC,CAAC;;QAE5B,IAAI,CAAC,eAAe,GAAG,KAAK;IAC7B,CAAC;;IAKD;;MADG;6CACH,UAAoB,WAAyB,EAAE,SAAuB;QAErE,IAAI,CAAC;QACL,IAAI,CAAC;QACL,IAAI,MAAM;QACV,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,MAAM;;QAEV,IAAI,CAAC,YAAY,GAAG,WAAW;;QAE/B,IAAI,CAAC,UAAU,GAAG,SAAS;;QAE3B,kBAAkB;QAClB,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAE;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,GAAC,CAAC,CAAC;;YAElD,CAAC,GAAG,CAAC;YACL,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;gBAClC,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;SAC5B;;QAED,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAE;YAC5B,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,GAAC,CAAC,CAAC;;YAEhD,CAAC,GAAG,CAAC;YACL,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM;gBAChC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;SAC1B;;QAED,CAAC,GAAG,CAAC;QACL,CAAC,GAAG,CAAC;QACL,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC;QACnD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,UAAU,CAAC;QACnD,MAAM,GAAG,IAAI,CAAC,UAAU;;QAExB,KAAK,GAAG,MAAM;;QAEd,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAE;YACpC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAC,MAAM,GAAG,CAAC,CAAC,GAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY;YAC3E,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YACzB,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;YACjC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;;YAEjC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAE;gBACb,CAAC,GAAG,CAAC;gBACL,CAAC,IAAI,CAAC;aACN;;YAED,KAAK,IAAI,MAAM;SACf;;QAED,IAAI,CAAC,kBAAkB,CAAC,CAAC;;QAEzB,IAAI,CAAC,YAAY,GAAG,KAAK;IAC1B,CAAC;;IAKD;;MADG;wCACH;QAEC,gBAAK,CAAC,OAAO,KAAC,KAAA,CAAC;;QAEf,IAAI,CAAC,eAAe,GAAG,IAAI;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,UAAU,GAAG,IAAI;IACvB,CAAC;;IAKD;;MADG;kDACH;QAEC,IAAI,IAAI,CAAC,cAAc;YACtB,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;;IAaD;;;MADG;sCACH;QAEC,IAAI,KAAK,GAAmB,IAAI,eAAe,CAAC,CAAC;QACjD,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;QACjF,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QAC/C,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;;QAEjF,OAAO,KAAK;IACb,CAAC;;IAED,mDAAA;QAEC,IAAI,CAAC,mBAAmB,GAAG,IAAI;;QAE/B,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5B,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5B,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC1B,CAAC;;IAED,kDAAA;QAEC,IAAI,IAAI,CAAC,eAAe;YACvB,MAAO,CAAA;;QAER,IAAI,CAAC,eAAe,GAAG,IAAI;;QAE3B,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;;QAErH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC3C,CAAC;;IAED,kDAAA;QAEC,IAAI,IAAI,CAAC,eAAe;YACvB,MAAO,CAAA;;QAER,IAAI,CAAC,eAAe,GAAG,IAAI;;QAE3B,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;;QAElH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC3C,CAAC;;IAED,+CAAA;QAEC,IAAI,IAAI,CAAC,YAAY;YACpB,MAAO,CAAA;;QAER,IAAI,CAAC,YAAY,GAAG,IAAI;;QAExB,IAAI,CAAC,IAAI,CAAC,aAAa;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;;QAE1G,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC;IACvC,CAAC;IAxaD,8BAAmC,UAAU;IAC7C,sCAA2C,gBAAgB;IAC3D,oCAAyC,cAAc;IACvD,iCAAsC,WAAW;IACjD,6BAAkC,QAAQ;;IAG1C,kCAAuC,QAAQ;IAC/C,+BAAoC,QAAQ;IAC5C,mCAAwC,QAAQ;IAgajD,uBAAC;AAAD,CAAC,EA3a6B,eAAe,EA2a5C;;AAED,gCAAyB,CAAA;;;;;;;;;;ACvbzB,kEAEyE;AACzE,iEAAwE;;AAKxE;;;;;;;;EAQG;AACH;IAA0B,8BAAW;IA0BpC;;;;;MADG;IACH,qBAAY,WAA2B,EAAE,UAAe,EAAE,QAA4B;QAA5B,uCAAA,QAAQ,GAAgB,IAAI;AAAA,QAErF,WAAM,KAAA,CAAC;;QAEP,IAAI,CAAC,YAAY,GAAG,UAAU;QAC9B,IAAI,CAAC,YAAY,GAAG,WAAW;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ;IACzB,CAAC;IA1BD;QAAA;;UADG;aACH;YAEC,OAAO,SAAS,CAAC,aAAa;QAC/B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAoBD;;MADG;oCACH;QAEC,IAAI,CAAC,QAAQ,GAAG,IAAI;;QAEpB,gBAAK,CAAC,OAAO,KAAC,KAAA,CAAC;IAChB,CAAC;;IAED,4CAAA,UAA2B,QAAkB;QAE5C,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC;IAChC,CAAC;IACF,mBAAC;AAAD,CAAC,EAjDyB,WAAW,EAiDpC;;AAED,4BAAqB,CAAA;;;;;;;;;;ACpErB,uEAE6E;;AAG7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgGG;AACH;IAAyB,6BAAe;IAAxC;QAAyB,6BAAe;IAmIxC,CAAC;AAAA,IA1GA;QAAA;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,MAAM;QACnB,CAAC;;;;AAAA;IAMD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAWD;QAAA;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,WAAW;QACxB,CAAC;;;;AAAA;IAkBD;QAAA;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,QAAQ;QACrB,CAAC;;;;AAAA;IAaD;QAAA;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAoBD;QAAA;;;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;;;;AAAA;IAgBD;QAAA;;;;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,IAAI;QACjB,CAAC;;;;AAAA,IACF,kBAAC;AAAD,CAAC,EAnIwB,eAAe,EAmIvC;;AAED,2BAAoB,CAAA;;;;AC3OpB;IAAA;IAgBA,CAAC;AAAA,IAXA,0BAA+B,SAAS;;IAKxC,+BAAoC,aAAa;;IAKjD,kCAAuC,gBAAgB;IACxD,uBAAC;AAAD,CAAC,IAAA;;AAED,gCAAyB,CAAA;;;;AClBzB;;;;EAIG;AACH;IAAA;IAyBA,CAAC;AAAA,IAlBA,uBAA8B,QAAQ;;IAWtC,qBAA4B,MAAM;;IAMlC,sBAA6B,OAAO;IACrC,qBAAC;AAAD,CAAC,IAAA;;AAED,8BAAuB,CAAA;;;;AChCvB;;;;;;;EAOG;AACH;IAAA;IAgBA,CAAC;AAAA,IAXA,mBAA2B,KAAK;;IAKhC,uBAA+B,SAAS;;IAKxC,sBAA8B,QAAQ;IACvC,oBAAC;AAAD,CAAC,IAAA;;AAED,6BAAsB,CAAA;;;;;;;;;;AC1BtB,2EAEiF;;AAGjF,+EAAoF;AACpF,yEAA+E;;AAE/E;;EAEG;AACH;IAA8B,kCAAc;IAuF3C;;MADG;IACH,yBAAY,kBAA0B;QAErC,WAAM,KAAA,CAAC;QArFR,KAAO,mBAAmB,GAAW,IAAI,CAAC;QAS1C,KAAO,mBAAmB,GAAW,IAAI,CAAC;QAI1C,KAAO,QAAQ,GAAU,IAAI,MAAM,CAAC,CAAC,CAAC;QACtC,KAAO,QAAQ,GAAU,IAAI,MAAM,CAAC,CAAC,CAAC;;QAyErC,IAAI,CAAC,mBAAmB,GAAG,kBAAkB;IAC9C,CAAC;IAxED,iDAAA;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAID;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,mBAAmB;QAChC,CAAC;QAED,KAAA,UAA6B,KAAa;YAEzC,IAAI,IAAI,CAAC,mBAAmB,IAAI,KAAK;gBACpC,MAAO,CAAA;;YAER,IAAI,CAAC,mBAAmB,GAAG,KAAK;;YAEhC,IAAI,CAAC,mBAAmB,GAAG,IAAI;;YAE/B,IAAI,KAAK;gBACR,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChC,CAAC;;;;AAbA;;IAkBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,SAAS;QACtB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,CAAC,cAAc,CAAC,CAAC;;YAErB,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAED;QAAA,KAAA;YAEC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAeD;;MADG;0CACH,UAAiB,QAAe;QAE/B,IAAI,IAAI,CAAC,mBAAmB;YAC3B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;;QAE7B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC/B,CAAC;;IAKD;;MADG;0CACH,UAAiB,QAAe;QAE/B,IAAI,IAAI,CAAC,mBAAmB;YAC3B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;;QAE7B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC/B,CAAC;;IAED,2CAAA;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAKD;;MADG;wCACH;QAEC,IAAI,CAAC,SAAS,GAAG,IAAI;QACrB,IAAI,CAAC,UAAU,GAAG,IAAI;IACvB,CAAC;;IAOD;;;;MADG;8CACH,UAAqB,OAAqB;QAEzC,IAAI,CAAC,SAAS,GAAG,OAAO;QACxB,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM;;QAEjC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,GAAC,CAAC;;QAEvC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC3B,CAAC;;IAKD;;MADG;kDACH;QAEC,IAAI,IAAI,CAAC,cAAc;YACtB,IAAI,CAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;;IAaD;;;MADG;sCACH;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED,gDAAA,UAA2B,SAAkB;IAG7C,CAAC;;IAMD;;;MADG;sCACH,UAAa,KAAY;IAGzB,CAAC;;IAED,oCAAA,UAAe,MAAiB,EAAE,MAAiB;QAApC,qCAAA,MAAM,GAAU,CAAC;AAAA,QAAE,qCAAA,MAAM,GAAU,CAAC;AAAA,IAGnD,CAAC;;IAED,iDAAA;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED,gDAAA;QAEC,IAAI,CAAC,IAAI,CAAC,eAAe;YACxB,IAAI,CAAC,eAAe,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,eAAe,CAAC,CAAC;;QAE/E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IACzC,CAAC;;IAED,mDAAA;QAEC,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;IA3MD,8BAAmC,UAAU;IA4M9C,uBAAC;AAAD,CAAC,EA9M6B,cAAc,EA8M3C;;AAED,gCAAyB,CAAA;;;;;;;;;;AC3NzB,2EAGiF;;AAKjF,+EAAoF;;AAGpF;;;;;;;;EAQG;AACH;IAA0B,8BAAc;IA4EvC;;MADG;IACH;QAEC,WAAM,KAAA,CAAC;QAzER,KAAO,OAAO,GAAU,CAAC,CAAC;QAG1B,KAAQ,YAAY,GAAsB,IAAI,KAAK,CAAc,CAAC,CAAC;IAuEnE,CAAC;IA3DD;QAAA,0BAV0B;QAC3B,6CAA6C;QAC7C,KAAK;QACL,EAAE;QACF,mDAAmD;QACnD,KAAK;QAEJ;;UAEG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ;QAClC,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ;QACpD,CAAC;QAED,KAAA,UAAoB,KAAkB;YAErC,IAAI,IAAI,CAAC,QAAQ;gBAChB,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;;YAElC,IAAI,CAAC,SAAS,GAAG,KAAK;;YAEtB,IAAI,IAAI,CAAC,QAAQ;gBAChB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC;;;;AAXA;;IAgBD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc;QACxC,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW;QAC1D,CAAC;QAED,KAAA,UAAuB,KAAiB;YAEvC,IAAI,CAAC,YAAY,GAAG,KAAK;QAC1B,CAAC;;;;AALA;;IAkBD;;MADG;oCACH;QAEC,IAAI,CAAC,QAAQ,GAAG,IAAI;;QAEpB,IAAI,GAAG,GAAU,IAAI,CAAC,YAAY,CAAC,MAAM;QACzC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;YAClC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACjC,CAAC;;IAOD;;;;MADG;oDACH,UAA+B,MAAa;QAE3C,OAAO,IAAI,CAAC,YAAY,CAAC,uBAAuB,CAAC,MAAM,CAAC;IACzD,CAAC;;IAED,wCAAA,UAAuB,UAAsB;QAE5C,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;;QAElC,OAAO,UAAU;IAClB,CAAC;;IAGD,2CAAA,UAA0B,UAAsB;QAE/C,IAAI,KAAK,GAAU,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC;;QAExD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;;QAElC,OAAO,UAAU;IAClB,CAAC;;IAED,uDAAA;QAEC,IAAI,GAAG,GAAU,IAAI,CAAC,YAAY,CAAC,MAAM;QACzC,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;YAClC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,CAAC;;IAED,4CAAA,UAA2B,QAAkB;QAE5C,MAAM,IAAI,mBAAmB,CAAC,CAAC;IAChC,CAAC;;IAED,8CAAA;QAEC,OAAO,IAAI,CAAC,SAAS;IACtB,CAAC;IACF,mBAAC;AAAD,CAAC,EAxIyB,cAAc,EAwIvC;;AAED,4BAAqB,CAAA;;;;AC9JrB;;;;;;;;;;;;;;;;;;;;EAoBG;AACH;IAAA;IAiBA,CAAC;AAAA,IAZA,2BAAgC,UAAU;;IAK1C,uBAA4B,MAAM;;IAMlC,2BAAgC,UAAU;IAC3C,uBAAC;AAAD,CAAC,IAAA;;AAED,gCAAyB,CAAA;;;;;;;;;;ACxCzB,0EAAgF;AAChF,0EAAgF;;AAEhF,4DAAoE;AACpE,yEAA+E;;AAE/E;;EAEG;AACH;IAAkC,sCAAe;IA+ahD;;MADG;IACH,6BAAY,kBAA0B;QAErC,WAAM,OAAA,kBAAkB,CAAC;QAha1B,KAAQ,eAAe,GAAW,IAAI,CAAC;QACvC,KAAQ,iBAAiB,GAAW,IAAI,CAAC;QACzC,KAAQ,kBAAkB,GAAW,IAAI,CAAC;QAC1C,KAAQ,mBAAmB,GAAW,IAAI,CAAC;QAC3C,KAAQ,oBAAoB,GAAW,IAAI,CAAC;QAC5C,KAAQ,SAAS,GAAW,IAAI,CAAC;QACjC,KAAQ,kBAAkB,GAAW,IAAI,CAAC;QAC1C,KAAQ,kBAAkB,GAAW,IAAI,CAAC;QAC1C,KAAQ,kBAAkB,GAAW,IAAI,CAAC;QAiB1C,KAAQ,kBAAkB,GAAW,IAAI,CAAC;QAC1C,KAAQ,kBAAkB,GAAW,IAAI,CAAC;QAC1C,KAAQ,mBAAmB,GAAW,IAAI,CAAC;QAC3C,KAAQ,cAAc,GAAW,KAAK,CAAC;QACvC,KAAQ,eAAe,GAAW,KAAK,CAAC;QAMxC,KAAQ,OAAO,GAAU,CAAC,CAAC;QAC3B,KAAQ,OAAO,GAAU,CAAC,CAAC;;QA8X1B,IAAI,CAAC,cAAc,GAAG,eAAe;IACtC,CAAC;IAlXD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,OAAO;QACpB,CAAC;;;;AAAA;IAOD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,oBAAoB;QACjC,CAAC;QAED,KAAA,UAA+B,KAAa;YAE3C,IAAI,IAAI,CAAC,oBAAoB,IAAI,KAAK;gBACrC,MAAO,CAAA;;YAER,IAAI,CAAC,oBAAoB,GAAG,KAAK;;YAEjC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAChC,CAAC;;;;AAVA;;IAYD,qDAAA;QAEC,IAAI,IAAI,CAAC,kBAAkB,CAAE;YAC5B,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC;;YAElD,uBAAuB;YACvB,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,CAAC;YACpD,IAAI,MAAM,GAAU,CAAC;;YAErB,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAE;gBAChC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,MAAM;gBACvD,MAAM,IAAI,CAAC;aACX;;YAED,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAE;gBACjC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,MAAM;gBACxD,MAAM,IAAI,CAAC;aACX;;YAED,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAE;gBACtB,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,MAAM;gBACnD,MAAM,IAAI,CAAC;aACX;;YAED,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAE;gBAC/B,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,MAAM;gBAC7D,MAAM,IAAI,CAAC;aACX;;YAED,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAE;gBAC/B,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG,MAAM;gBAC5D,MAAM,IAAI,IAAI,CAAC,gBAAgB;aAC/B;;YAED,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAE;gBAC/B,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,MAAM;gBAC7D,MAAM,IAAI,IAAI,CAAC,gBAAgB;aAC/B;;YAED,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,MAAM;YACvD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,MAAM;YACzD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,MAAM;YACvD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,MAAM;YACxD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,MAAM;YACnD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,MAAM;YAC7D,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG,MAAM;YAC5D,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,MAAM;;YAE7D,IAAI,GAAG,GAAU,IAAI,CAAC,aAAa,GAAC,MAAM;;YAE1C,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;gBAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC;iBACpC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,GAAG;gBACrC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;SAE9B,KAAM;YACN,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,CAAC;YACxD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG,CAAC;YACvD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,CAAC;;YAExD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,aAAa,CAAC,GAAG,CAAC;YACpD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,GAAG,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,GAAG,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,OAAO,CAAC,GAAG,CAAC;YAC9C,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,CAAC;YACxD,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,gBAAgB;YAC3E,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC,gBAAgB;SAC5E;;QAED,IAAI,CAAC,mBAAmB,GAAG,KAAK;IACjC,CAAC;;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,gBAAgB;QAC7B,CAAC;QAED,KAAA,UAA2B,KAAY;YAEtC,IAAI,IAAI,CAAC,gBAAgB,IAAI,KAAK;gBACjC,MAAO,CAAA;;YAER,IAAI,CAAC,gBAAgB,GAAG,KAAK;;YAE7B,IAAI,CAAC,mBAAmB,GAAG,IAAI;;YAE/B,IAAI,IAAI,CAAC,mBAAmB;gBAC3B,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAChC,CAAC;;;;AAbA;;IAoBD;QAAA;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;QAED,KAAA,UAAyB,KAAa;YAErC,IAAI,IAAI,CAAC,cAAc,IAAI,KAAK;gBAC/B,MAAO,CAAA;;YAER,IAAI,CAAC,cAAc,GAAG,KAAK;;YAE3B,IAAI,KAAK;gBACR,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;QACzB,CAAC;;;;AAXA;;IAiBD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,kBAAkB;QAC/B,CAAC;QAED,KAAA,UAA6B,KAAa;YAEzC,IAAI,IAAI,CAAC,kBAAkB,IAAI,KAAK;gBACnC,MAAO,CAAA;;YAER,IAAI,CAAC,kBAAkB,GAAG,KAAK;;YAE/B,IAAI,KAAK;gBACR,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;QAC7B,CAAC;;;;AAXA;;IAiBD;QAAA;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,mBAAmB;QAChC,CAAC;QAED,KAAA,UAA8B,KAAa;YAE1C,IAAI,IAAI,CAAC,mBAAmB,IAAI,KAAK;gBACpC,MAAO,CAAA;;YAER,IAAI,CAAC,mBAAmB,GAAG,KAAK;;YAEhC,IAAI,KAAK;gBACR,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QAC9B,CAAC;;;;AAXA;;IAgBD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEvC,IAAI,IAAI,CAAC,mBAAmB;gBAC3B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;;YAE/C,IAAI,IAAI,CAAC,oBAAoB;gBAC5B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;;YAEjD,IAAI,IAAI,CAAC,SAAS;gBACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YAE3B,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;YAE7C,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;YAE7C,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;YAE7C,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,eAAe;gBACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEvC,OAAO,IAAI,CAAC,UAAU;QACvB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,mBAAmB;gBAC3B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;;YAE/C,OAAO,IAAI,CAAC,cAAc;QAC3B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,oBAAoB;gBAC5B,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;;YAEjD,OAAO,IAAI,CAAC,eAAe;QAC5B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,iBAAiB;gBACzB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;;YAE1B,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;;YAE3B,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,SAAS;gBACjB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YAE3B,OAAO,IAAI,CAAC,IAAI;QACjB,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;YAE7C,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;YAE7C,IAAI,IAAI,CAAC,oBAAoB;gBAC5B,OAAO,IAAI,CAAC,sBAAsB,CAAC;;YAEpC,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;YAE7C,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,eAAe;QAC5B,CAAC;QAED,KAAA,UAA0B,KAAa;YAEtC,IAAI,IAAI,CAAC,eAAe,IAAI,KAAK;gBAChC,MAAO,CAAA;;YAER,IAAI,CAAC,eAAe,GAAG,KAAK;;YAE5B,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;;YAE5B,IAAI,IAAI,CAAC,mBAAmB;gBAC3B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;;YAE7B,IAAI,CAAC,iBAAiB,GAAG,IAAI;QAC9B,CAAC;;;;AAhBA;;IAkBD;QAAA,KAAA;YAEC,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;YAE7C,OAAO,IAAI,CAAC,mBAAmB;QAChC,CAAC;;;;AAAA;IAED;QAAA,KAAA;YAEC,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;;YAE7C,OAAO,IAAI,CAAC,qBAAqB;QAClC,CAAC;;;;AAAA;IAYD,qDAAA;QAEC,IAAI,IAAI,CAAC,eAAe;YACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;QAEvC,OAAO,IAAI,CAAC,UAAU;IACvB,CAAC;;IAKD;;MADG;oDACH,UAAuB,MAAoB;QAE1C,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,SAAS;;QAEb,IAAI,CAAC,UAAU,GAAG,MAAM;;QAExB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;YAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC;;QAEvC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAC,CAAC;;QAE7C,IAAI,IAAI,CAAC,kBAAkB,CAAE;YAC5B,IAAI,GAAG,GAAU,IAAI,CAAC,aAAa,GAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC;;YAEnF,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI;gBAC1B,IAAI,CAAC,UAAU,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC;iBACpC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,GAAG;gBACrC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC;;YAE9B,CAAC,GAAG,CAAC;YACL,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC;YACzD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC;YAC1D,SAAS,GAAG,IAAI,CAAC,UAAU;;YAE3B,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;gBACzB,SAAS,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC9B,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;gBAClC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;gBAClC,KAAK,IAAI,MAAM;aACf;SACD;;QAED,IAAI,IAAI,CAAC,kBAAkB;YAC1B,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC;;QAE5B,IAAI,IAAI,CAAC,mBAAmB;YAC3B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;;QAE7B,IAAI,IAAI,CAAC,cAAc;YACtB,IAAI,CAAC,eAAe,CAAC,CAAC,CAAA;;QAEvB,IAAI,CAAC,iBAAiB,CAAC,CAAC;;QAExB,IAAI,CAAC,qBAAqB,CAAC,CAAC;;QAE5B,IAAI,CAAC,eAAe,GAAG,KAAK;IAC7B,CAAC;;IAKD;;MADG;wDACH,UAA2B,MAAoB;QAE9C,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,OAAO;;QAEX,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAE;gBACvG,IAAI,IAAI,CAAC,kBAAkB;oBAC1B,IAAI,CAAC,sBAAsB,CAAC,CAAC;;oBAE7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACjC;;YAED,IAAI,CAAC,cAAc,GAAG,MAAM;;YAE5B,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAE;gBAC9C,CAAC,GAAG,CAAC;gBACL,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC;gBACvD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC;gBACxD,OAAO,GAAG,IAAI,CAAC,UAAU;;gBAEzB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;oBACzB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;oBAC5B,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;oBAChC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;oBAChC,KAAK,IAAI,MAAM;iBACf;aACD;SACD,KAAM;YACN,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAE;gBAChC,IAAI,CAAC,cAAc,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;;gBAE/D,IAAI,IAAI,CAAC,kBAAkB;oBAC1B,IAAI,CAAC,sBAAsB,CAAC,CAAC;;oBAE7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACjC;;YAED,IAAI,IAAI,CAAC,iBAAiB;gBACzB,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;;YAE1B,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC;YACxD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC;;YAExD,qBAAqB;YACrB,OAAO,GAAG,IAAI,CAAC,kBAAkB,GAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,cAAc;;YAExE,IAAI,EAAE,GAAU,CAAC;YACjB,IAAI,EAAE,GAAU,CAAC;YACjB,IAAI,EAAE,GAAU,CAAC;;YAEjB,KAAK,GAAG,MAAM;;YAEd,qBAAqB;YACrB,IAAI,IAAI,GAAU,OAAO,CAAC,MAAM;YAChC,OAAO,KAAK,GAAG,IAAI,CAAE;gBACpB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;gBAClB,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;gBACtB,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;gBACtB,KAAK,IAAI,MAAM;aACf;;YAED,IAAI,CAAC,GAAU,CAAC;YAChB,IAAI,IAAI,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;YACvC,IAAI,MAAM;;YAEV,CAAC,GAAG,CAAC;;YAGL,OAAO,CAAC,GAAG,IAAI,CAAE;gBAChB,MAAM,GAAG,IAAI,CAAC,eAAe,GAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBACzD,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC3C,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC9C,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC3C,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC9C,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC3C,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC9C,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,EAAE,IAAI,CAAC;gBACP,EAAE,IAAI,CAAC;gBACP,EAAE,IAAI,CAAC;aACP;;YAED,CAAC,GAAG,CAAC;YACL,KAAK,GAAG,MAAM;;YAGd,OAAO,KAAK,GAAG,IAAI,CAAE;gBACpB,IAAI,EAAE,GAAU,OAAO,CAAC,KAAK,CAAC;gBAC9B,IAAI,EAAE,GAAU,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;gBAClC,IAAI,EAAE,GAAU,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,GAAU,GAAG,GAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;;gBAEnD,IAAI,IAAI,CAAC,kBAAkB,CAAE;oBAC5B,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAC,CAAC;oBAChD,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAC,CAAC;oBACpD,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAC,CAAC;iBACpD,KAAM;oBACN,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAC,CAAC;oBACrB,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAC,CAAC;oBACzB,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAC,CAAC;iBACzB;;gBAED,KAAK,IAAI,MAAM;aACf;SACD;;QAED,IAAI,CAAC,mBAAmB,CAAC,CAAC;;QAE1B,IAAI,CAAC,mBAAmB,GAAG,KAAK;IACjC,CAAC;;IAKD;;MADG;yDACH,UAA4B,MAAoB;QAE/C,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,QAAQ;;QAEZ,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAE;YAC9B,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAE;gBACzG,IAAI,IAAI,CAAC,kBAAkB;oBAC1B,IAAI,CAAC,sBAAsB,CAAC,CAAC;;oBAE7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACjC;;YAGD,IAAI,CAAC,eAAe,GAAG,MAAM;;YAE7B,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAE;gBAC9C,CAAC,GAAG,CAAC;gBACL,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC;gBACxD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC;gBACzD,QAAQ,GAAG,IAAI,CAAC,UAAU;;gBAE1B,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;oBACzB,QAAQ,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;oBAC7B,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;oBACjC,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;oBACjC,KAAK,IAAI,MAAM;iBACf;aACD;SACD,KAAM;YACN,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAE;gBACjC,IAAI,CAAC,eAAe,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;;gBAEhE,IAAI,IAAI,CAAC,kBAAkB;oBAC1B,IAAI,CAAC,sBAAsB,CAAC,CAAC;;oBAE7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACjC;;YAED,IAAI,IAAI,CAAC,kBAAkB;gBAC1B,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;;YAE3B,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC;YACzD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC;;YAEzD,sBAAsB;YACtB,QAAQ,GAAG,IAAI,CAAC,kBAAkB,GAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,eAAe;;YAE1E,KAAK,GAAG,MAAM;;YAEd,sBAAsB;YACtB,IAAI,IAAI,GAAU,QAAQ,CAAC,MAAM;YACjC,OAAO,KAAK,GAAG,IAAI,CAAE;gBACpB,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;gBACnB,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;gBACvB,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC;;gBAEvB,KAAK,IAAI,MAAM;aACf;;YAED,IAAI,CAAC,GAAU,CAAC;YAChB,IAAI,MAAM;YACV,IAAI,EAAE,GAAU,CAAC;YACjB,IAAI,EAAE,GAAU,CAAC;YACjB,IAAI,EAAE,GAAU,CAAC;;YAEjB,CAAC,GAAG,CAAC;;YAEL,uBAAuB;YACvB,IAAI,IAAI,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;YACvC,OAAO,CAAC,GAAG,IAAI,CAAE;gBAChB,MAAM,GAAG,IAAI,CAAC,eAAe,GAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;gBACzD,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC3C,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAChD,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC3C,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAChD,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,MAAM;gBAC3C,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAClD,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,GAAC,MAAM;gBAChD,EAAE,IAAI,CAAC;gBACP,EAAE,IAAI,CAAC;gBACP,EAAE,IAAI,CAAC;aACP;;YAED,CAAC,GAAG,CAAC;YACL,KAAK,GAAG,MAAM;;YAGd,OAAO,KAAK,GAAG,IAAI,CAAE;gBACpB,IAAI,EAAE,GAAU,QAAQ,CAAC,KAAK,CAAC;gBAC/B,IAAI,EAAE,GAAU,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;gBACnC,IAAI,EAAE,GAAU,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;gBACnC,IAAI,CAAC,GAAU,GAAG,GAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;;gBAEnD,IAAI,IAAI,CAAC,kBAAkB,CAAE;oBAC5B,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAC,CAAC;oBAClD,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAC,CAAC;oBACtD,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAC,CAAC;iBACtD,KAAM;oBACN,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAC,CAAC;oBACtB,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAC,CAAC;oBAC1B,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,GAAC,CAAC;iBAC1B;;gBAED,KAAK,IAAI,MAAM;aACf;SACD;;QAED,IAAI,CAAC,oBAAoB,CAAC,CAAC;;QAE3B,IAAI,CAAC,oBAAoB,GAAG,KAAK;IAClC,CAAC;;IAKD;;MADG;8CACH,UAAiB,MAAoB;QAEpC,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,GAAG;;QAEP,IAAI,CAAC,IAAI,CAAC,cAAc,CAAE;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,CAAE;gBACnF,IAAI,IAAI,CAAC,kBAAkB;oBAC1B,IAAI,CAAC,sBAAsB,CAAC,CAAC;;oBAE7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACjC;;YAED,IAAI,CAAC,IAAI,GAAG,MAAM;;YAElB,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAE;gBAC9C,CAAC,GAAG,CAAC;gBACL,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBACnD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBACpD,GAAG,GAAG,IAAI,CAAC,UAAU;;gBAErB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;oBACzB,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;oBACxB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;oBAC5B,KAAK,IAAI,MAAM;iBACf;aACD;SAED,KAAM;YACN,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAE;gBACtB,IAAI,CAAC,IAAI,GAAG,IAAI,KAAK,CAAS,IAAI,CAAC,UAAU,CAAC,MAAM,GAAC,CAAC,GAAC,CAAC,CAAC;;gBAEzD,IAAI,IAAI,CAAC,kBAAkB;oBAC1B,IAAI,CAAC,sBAAsB,CAAC,CAAC;;oBAE7B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;aACjC;;YAED,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC;YACpD,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC;;YAEpD,iBAAiB;YACjB,GAAG,GAAG,IAAI,CAAC,kBAAkB,GAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI;;YAE1D,CAAC,GAAG,CAAC;YACL,KAAK,GAAG,MAAM;YACd,IAAI,KAAK,GAAU,CAAC;;YAEpB,iBAAiB;YACjB,IAAI,IAAI,GAAU,GAAG,CAAC,MAAM;YAC5B,OAAO,KAAK,GAAG,IAAI,CAAE;gBACpB,IAAI,IAAI,CAAC,kBAAkB,CAAE;oBAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,GAAC,EAAE;oBACtC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;iBACnD,KAAM;oBACN,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,GAAC,EAAE;oBACrB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;iBAClC;;gBAED,IAAI,EAAE,KAAK,IAAI,CAAC;oBACf,KAAK,GAAG,CAAC,CAAC;;gBAEX,KAAK,IAAI,MAAM;aACf;SACD;;QAED,IAAI,IAAI,CAAC,mBAAmB;YAC3B,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;;QAE7B,IAAI,CAAC,eAAe,CAAC,CAAC;;QAEtB,IAAI,CAAC,SAAS,GAAG,KAAK;IACvB,CAAC;;IAKD;;MADG;uDACH,UAA0B,MAAoB;QAE7C,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,GAAG;;QAEP,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;YAC9H,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;;QAE/B,IAAI,CAAC,aAAa,GAAG,MAAM;;QAE3B,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAE;YAC9C,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;YAC9D,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;;YAE9D,CAAC,GAAG,CAAC;YACL,KAAK,GAAG,MAAM;YACd,GAAG,GAAG,IAAI,CAAC,UAAU;;YAErB,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;gBACzB,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;gBACxB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;gBAC5B,KAAK,IAAI,MAAM;aACf;SACD;;QAED,IAAI,CAAC,wBAAwB,CAAC,CAAC;;QAE/B,IAAI,CAAC,kBAAkB,GAAG,KAAK;IAChC,CAAC;;IAKD;;MADG;uDACH,UAA0B,MAAoB;QAE7C,IAAI,CAAC;QACL,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,YAAY;;QAEhB,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;YAC9H,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;;QAE/B,IAAI,CAAC,aAAa,GAAG,MAAM;;QAE3B,IAAI,MAAM,IAAI,IAAI,CAAE;YACnB,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;YAC7D,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,gBAAgB,CAAC;YAC7D,IAAI,IAAI,CAAC,oBAAoB,CAAE;gBAC9B,CAAC,GAAG,CAAC;gBACL,CAAC,GAAG,CAAC;gBACL,KAAK,GAAG,MAAM;gBACd,YAAY,GAAG,IAAI,CAAC,kBAAkB,GAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,sBAAsB;gBACrF,IAAI,QAAQ;gBACZ,IAAI,QAAQ,GAAU,CAAC;gBACvB,IAAI,GAAG,GAAU,IAAI,MAAM,CAAC,CAAC;;gBAE7B,IAAI,CAAC,IAAI,CAAC,kBAAkB;oBAC3B,IAAI,CAAC,sBAAsB,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,MAAM,CAAC,CAAC;;gBAEhE,IAAI,CAAC,qBAAqB,GAAG,IAAI,KAAK,CAAS,CAAC;;gBAEhD,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;oBACzB,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC,EAAE,CAAE;wBAC3C,QAAQ,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC;;wBAEtB,+DAA+D;wBAC/D,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAE;4BAC/B,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAC,CAAC,EAAE,wDAAwD;4BACpF,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ;yBACjD;wBACD,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC;qBACvC;oBACD,KAAK,IAAI,MAAM;iBACf;gBACD,IAAI,CAAC,mBAAmB,GAAG,QAAQ;aACnC,MAAM,IAAI,IAAI,CAAC,kBAAkB,CAAE;gBAEnC,CAAC,GAAG,CAAC;gBACL,KAAK,GAAG,MAAM;gBACd,YAAY,GAAG,IAAI,CAAC,UAAU;;gBAE9B,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;oBACzB,CAAC,GAAG,CAAC;oBACL,OAAO,CAAC,GAAG,IAAI,CAAC,gBAAgB;wBAC/B,YAAY,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;oBACzC,KAAK,IAAI,MAAM;iBACf;aACD;SACD;;QAED,IAAI,CAAC,wBAAwB,CAAC,CAAC;;QAE/B,IAAI,CAAC,kBAAkB,GAAG,KAAK;IAChC,CAAC;;IAKD;;MADG;uDACH,UAA0B,MAAoB;QAE7C,IAAI,CAAC;QACL,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,YAAY;;QAEhB,IAAI,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,MAAM,IAAI,IAAI,CAAC;YAC9H,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC;;QAE/B,IAAI,CAAC,aAAa,GAAG,MAAM;;QAE3B,IAAI,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAE;YAC9C,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;YAC9D,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;;YAE9D,CAAC,GAAG,CAAC;YACL,KAAK,GAAG,MAAM;YACd,YAAY,GAAG,IAAI,CAAC,UAAU;;YAE9B,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,CAAE;gBACzB,CAAC,GAAG,CAAC;gBACL,OAAO,CAAC,GAAG,IAAI,CAAC,gBAAgB;oBAC/B,YAAY,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;gBACzC,KAAK,IAAI,MAAM;aACf;SACD;;QAED,IAAI,CAAC,wBAAwB,CAAC,CAAC;;QAE/B,IAAI,CAAC,kBAAkB,GAAG,KAAK;IAChC,CAAC;;IAKD;;MADG;4CACH;QAEC,gBAAK,CAAC,OAAO,KAAC,KAAA,CAAC;;QAEf,IAAI,CAAC,UAAU,GAAG,IAAI;QACtB,IAAI,CAAC,cAAc,GAAG,IAAI;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI;QAChB,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI;;QAEzB,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,YAAY,GAAG,IAAI;QACxB,IAAI,CAAC,aAAa,GAAG,IAAI;IAC1B,CAAC;;IAOD;;;;MADG;kDACH,UAAqB,OAAqB;QAEzC,gBAAK,CAAC,aAAa,KAAC,OAAA,OAAO,CAAC;;QAE5B,IAAI,CAAC,iBAAiB,GAAG,IAAI;;QAE7B,IAAI,IAAI,CAAC,kBAAkB;YAC1B,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;;QAEjC,IAAI,IAAI,CAAC,mBAAmB;YAC3B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;;QAElC,IAAI,IAAI,CAAC,cAAc;YACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;;IAMD;;;MADG;0CACH;QAEC,IAAI,KAAK,GAAuB,IAAI,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,CAAC;QAChF,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5C,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;;QAE/C,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAClD,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;;YAEvD,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;;QAEjC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc;YACpC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;;YAEnC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;;QAEvB,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,mBAAmB;YACpD,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;;YAEzD,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;;QAElC,IAAI,IAAI,CAAC,aAAa;YACrB,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;QAEvD,IAAI,IAAI,CAAC,aAAa,CAAE;YACvB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,gBAAgB;YAC7C,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;SACrD;;QAED,IAAI,IAAI,CAAC,aAAa;YACrB,KAAK,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;;QAEvD,OAAO,KAAK;IACb,CAAC;;IAED,wCAAA,UAAe,MAAiB,EAAE,MAAiB;QAApC,qCAAA,MAAM,GAAU,CAAC;AAAA,QAAE,qCAAA,MAAM,GAAU,CAAC;AAAA,QAElD,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,GAAG;;QAEP,GAAG,GAAG,IAAI,CAAC,IAAI;;QAEf,IAAI,MAAM,GAAU,MAAM,GAAC,IAAI,CAAC,OAAO;QACvC,IAAI,MAAM,GAAU,MAAM,GAAC,IAAI,CAAC,OAAO;;QAEvC,IAAI,CAAC,OAAO,GAAG,MAAM;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM;;QAErB,IAAI,GAAG,GAAU,GAAG,CAAC,MAAM;;QAE3B,MAAM,GAAG,CAAC;QACV,MAAM,GAAG,CAAC;;QAEV,KAAK,GAAG,MAAM;;QAEd,OAAO,KAAK,GAAG,GAAG,CAAE;YACnB,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM;YACpB,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,MAAM;YACxB,KAAK,IAAI,MAAM;SACf;;QAED,IAAI,CAAC,eAAe,CAAC,CAAC;IACvB,CAAC;;IAMD;;;MADG;0CACH,UAAa,KAAY;QAExB,IAAI,CAAC;QACL,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,SAAS;;QAEb,SAAS,GAAG,IAAI,CAAC,UAAU;;QAE3B,IAAI,GAAG,GAAU,SAAS,CAAC,MAAM;;QAEjC,MAAM,GAAG,CAAC;QACV,MAAM,GAAG,CAAC;;QAEV,CAAC,GAAG,CAAC;QACL,KAAK,GAAG,MAAM;QACd,OAAO,CAAC,GAAG,GAAG,CAAE;YACf,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK;YACzB,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK;YAC7B,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK;;YAE7B,CAAC,IAAI,CAAC;YACN,KAAK,IAAI,MAAM;SACf;;QAED,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC7B,CAAC;;IAED,oDAAA,UAA2B,SAAkB;QAE5C,IAAI,SAAS;QACb,IAAI,OAAO;QACX,IAAI,QAAQ;;QAEZ,IAAI,IAAI,CAAC,kBAAkB,CAAE;YAC5B,SAAS,GAAG,IAAI,CAAC,UAAU;YAC3B,OAAO,GAAG,IAAI,CAAC,UAAU;YACzB,QAAQ,GAAG,IAAI,CAAC,UAAU;SAC1B,KAAM;YACN,SAAS,GAAG,IAAI,CAAC,UAAU;YAC3B,OAAO,GAAG,IAAI,CAAC,cAAc;YAC7B,QAAQ,GAAG,IAAI,CAAC,eAAe;SAC/B;;QAED,IAAI,GAAG,GAAU,IAAI,CAAC,UAAU,CAAC,MAAM,GAAC,CAAC;QACzC,IAAI,CAAC;QACL,IAAI,EAAE;QACN,IAAI,EAAE;QACN,IAAI,MAAM,GAAY,IAAI,QAAQ,CAAC,CAAC;;QAEpC,IAAI,WAAW,GAAW,IAAI,CAAC,cAAc,IAAI,IAAI;QACrD,IAAI,YAAY,GAAW,IAAI,CAAC,eAAe,IAAI,IAAI;QACvD,IAAI,YAAY;;QAEhB,IAAI,WAAW,IAAI,YAAY,CAAE;YAChC,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;YAChC,YAAY,CAAC,MAAM,CAAC,CAAC;YACrB,YAAY,CAAC,SAAS,CAAC,CAAC;SACxB;;QAED,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC;QAClE,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC;QAChE,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC;;QAEjE,IAAI,OAAO,GAAU,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,aAAa,CAAC;QACtE,IAAI,OAAO,GAAU,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC;QACpE,IAAI,OAAO,GAAU,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,CAAC;;QAErE,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,EAAE,CAAC,CAAE;YACzB,EAAE,GAAG,GAAG,GAAG,CAAC;YACZ,EAAE,GAAG,GAAG,GAAG,CAAC;;YAEZ,gBAAgB;YAChB,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC;YACzB,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,SAAS,CAAC,eAAe,CAAC,MAAM,CAAC;YAC1C,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;YACzB,SAAS,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;YACxB,SAAS,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;YACxB,GAAG,IAAI,OAAO;;YAEd,cAAc;YACd,IAAI,WAAW,CAAE;gBAChB,EAAE,GAAG,GAAG,GAAG,CAAC;gBACZ,EAAE,GAAG,GAAG,GAAG,CAAC;gBACZ,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;gBACvB,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC;gBACtB,MAAM,GAAG,YAAY,CAAC,oBAAoB,CAAC,MAAM,CAAC;gBAClD,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClB,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;gBACvB,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;gBACtB,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;gBACtB,GAAG,IAAI,OAAO;aACd;;YAED,eAAe;YACf,IAAI,YAAY,CAAE;gBACjB,EAAE,GAAG,GAAG,GAAG,CAAC;gBACZ,EAAE,GAAG,GAAG,GAAG,CAAC;gBACZ,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC;gBACxB,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;gBACvB,MAAM,GAAG,YAAY,CAAC,oBAAoB,CAAC,MAAM,CAAC;gBAClD,MAAM,CAAC,SAAS,CAAC,CAAC;gBAClB,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;gBACxB,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;gBACvB,QAAQ,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;gBACvB,GAAG,IAAI,OAAO;aACd;SACD;;QAED,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC1B,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC5B,CAAC;;IAKD;;MADG;uDACH;QAEC,IAAI,CAAC,GAAU,CAAC;QAChB,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,MAAM;QACV,IAAI,EAAE;QACN,IAAI,EAAE;QACN,IAAI,GAAG;QACP,IAAI,GAAG;QACP,IAAI,KAAK;QACT,IAAI,EAAE,EAAS,EAAE,EAAS,EAAE;QAC5B,IAAI,GAAG,EAAS,GAAG,EAAS,GAAG;QAC/B,IAAI,GAAG,EAAS,GAAG,EAAS,GAAG;QAC/B,IAAI,EAAE,EAAS,EAAE,EAAS,EAAE;;QAE5B,IAAI,SAAS,GAAiB,IAAI,CAAC,UAAU;QAC7C,IAAI,GAAG,GAAiB,IAAI,CAAC,IAAI;;QAEjC,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;;QAEtC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;YAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC;;QAE7C,OAAO,CAAC,GAAG,GAAG,CAAE;YACf,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YAC1B,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;;YAE9B,EAAE,GAAG,GAAG,CAAC,MAAM,GAAC,CAAC,GAAG,CAAC,CAAC;YACtB,GAAG,GAAG,GAAG,CAAC,MAAM,GAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;YAC5B,GAAG,GAAG,GAAG,CAAC,MAAM,GAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;;YAE5B,EAAE,GAAG,MAAM,GAAC,CAAC;YACb,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC;YAClB,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;YACtB,EAAE,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;YACtB,EAAE,GAAG,MAAM,GAAC,CAAC;YACb,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE;YACxB,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;YAC5B,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;YAC5B,EAAE,GAAG,MAAM,GAAC,CAAC;YACb,GAAG,GAAG,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE;YACxB,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;YAC5B,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE;;YAE5B,EAAE,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG;YACtB,EAAE,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG;YACtB,EAAE,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG;YACtB,KAAK,GAAG,CAAC,GAAC,IAAI,CAAC,IAAI,CAAC,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;;YAE1C,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,GAAC,EAAE;YAClC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,GAAC,EAAE;YAClC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,GAAC,EAAE;SAClC;;QAED,IAAI,CAAC,kBAAkB,GAAG,KAAK;IAChC,CAAC;;IAKD;;MADG;sDACH;QAEC,IAAI,CAAC,GAAU,CAAC;QAChB,IAAI,CAAC,GAAU,CAAC;QAChB,IAAI,CAAC,GAAU,CAAC;QAChB,IAAI,KAAK;QACT,IAAI,MAAM;QACV,IAAI,MAAM;;QAEV,IAAI,EAAE,EAAS,EAAE,EAAS,EAAE;QAC5B,IAAI,EAAE,EAAS,EAAE,EAAS,EAAE;QAC5B,IAAI,EAAE,EAAS,EAAE,EAAS,EAAE;QAC5B,IAAI,GAAG,EAAS,GAAG,EAAS,GAAG;QAC/B,IAAI,GAAG,EAAS,GAAG,EAAS,GAAG;QAC/B,IAAI,EAAE,EAAS,EAAE,EAAS,EAAE;QAC5B,IAAI,CAAC;;QAEL,IAAI,SAAS,GAAiB,IAAI,CAAC,UAAU;;QAE7C,IAAI,GAAG,GAAU,IAAI,CAAC,SAAS,CAAC,MAAM;;QAEtC,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI;YAC5B,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,CAAS,GAAG,CAAC,CAAC;;QAE5C,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI;YACpD,IAAI,CAAC,YAAY,GAAG,IAAI,KAAK,CAAS,GAAG,GAAC,CAAC,CAAC,CAAC;;QAE9C,OAAO,CAAC,GAAG,GAAG,CAAE;YACf,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,CAAC;YAC7B,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;YACrB,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,CAAC;YAC7B,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;YACrB,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,GAAC,CAAC;YAC7B,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;YACrB,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB,EAAE,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;YACzB,GAAG,GAAG,EAAE,GAAG,EAAE;YACb,GAAG,GAAG,EAAE,GAAG,EAAE;YACb,GAAG,GAAG,EAAE,GAAG,EAAE;YACb,GAAG,GAAG,EAAE,GAAG,EAAE;YACb,GAAG,GAAG,EAAE,GAAG,EAAE;YACb,GAAG,GAAG,EAAE,GAAG,EAAE;YACb,EAAE,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG;YACtB,EAAE,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG;YACtB,EAAE,GAAG,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG;YACtB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,GAAG,EAAE,GAAC,EAAE,CAAC;;YACpC,4CAA4C;YAE5C,IAAI,IAAI,CAAC,eAAe,CAAE;gBACzB,IAAI,CAAC,GAAU,CAAC,GAAC,KAAK;;gBAEtB,IAAI,CAAC,GAAG,CAAC;oBACR,CAAC,GAAG,CAAC,CAAC;;gBAEP,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;aAC1B;;YAED,CAAC,GAAG,CAAC,GAAC,CAAC;;YAEP,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAC,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAC,CAAC;YAC7B,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAC,CAAC;SAC7B;;QAED,IAAI,CAAC,iBAAiB,GAAG,KAAK;IAC/B,CAAC;;IAED,uDAAA;QAEC,IAAI,CAAC,mBAAmB,GAAG,IAAI;;QAE/B,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC1B,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,CAAC;QACtB,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC/B,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC/B,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAChC,CAAC;;IAED,sDAAA;QAEC,IAAI,IAAI,CAAC,eAAe;YACvB,MAAO,CAAA;;QAER,IAAI,CAAC,eAAe,GAAG,IAAI;;QAE3B,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAC1B,IAAI,CAAC,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;;QAErH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC;IAC3C,CAAC;;IAED,oDAAA;QAEC,IAAI,IAAI,CAAC,mBAAmB;YAC3B,MAAO,CAAA;;QAER,IAAI,CAAC,mBAAmB,GAAG,IAAI;;QAE/B,IAAI,CAAC,IAAI,CAAC,eAAe;YACxB,IAAI,CAAC,eAAe,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;;QAEjH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC;IACzC,CAAC;;IAED,qDAAA;QAEC,IAAI,IAAI,CAAC,oBAAoB;YAC5B,MAAO,CAAA;;QAER,IAAI,CAAC,oBAAoB,GAAG,IAAI;;QAEhC,IAAI,CAAC,IAAI,CAAC,gBAAgB;YACzB,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAC;;QAEnH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;IAC1C,CAAC;;IAED,gDAAA;QAEC,IAAI,IAAI,CAAC,SAAS;YACjB,MAAO,CAAA;;QAER,IAAI,CAAC,SAAS,GAAG,IAAI;;QAErB,IAAI,CAAC,IAAI,CAAC,WAAW;YACpB,IAAI,CAAC,WAAW,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;;QAEzG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;IACrC,CAAC;;IAED,yDAAA;QAEC,IAAI,IAAI,CAAC,kBAAkB;YAC1B,MAAO,CAAA;;QAER,IAAI,CAAC,kBAAkB,GAAG,IAAI;;QAE9B,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAC7B,IAAI,CAAC,oBAAoB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;;QAE5H,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAC9C,CAAC;;IAED,yDAAA;QAEC,IAAI,IAAI,CAAC,kBAAkB;YAC1B,MAAO,CAAA;;QAER,IAAI,CAAC,kBAAkB,GAAG,IAAI;;QAE9B,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAC7B,IAAI,CAAC,oBAAoB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;;QAE3H,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAC9C,CAAC;;IAED,yDAAA;QAEC,IAAI,IAAI,CAAC,kBAAkB;YAC1B,MAAO,CAAA;;QAER,IAAI,CAAC,kBAAkB,GAAG,IAAI;;QAE9B,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAC7B,IAAI,CAAC,oBAAoB,GAAG,IAAI,gBAAgB,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;;QAE5H,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,oBAAoB,CAAC;IAC9C,CAAC;IA/5CD,oCAAqC,WAAW;IAChD,kCAAmC,eAAe;IAClD,mCAAoC,gBAAgB;IACpD,8BAA+B,KAAK;IACpC,wCAAyC,cAAc;IACvD,uCAAwC,cAAc;IACtD,wCAAyC,cAAc;;IAGvD,sCAAuC,QAAQ;IAC/C,oCAAqC,QAAQ;IAC7C,qCAAsC,QAAQ;IAC9C,gCAAiC,QAAQ;IACzC,0CAA2C,QAAQ;IAm5CpD,2BAAC;AAAD,CAAC,EAl6CiC,eAAe,EAk6ChD;;AAED,oCAA6B,CAAA;;;;;;;;;;AC76C7B,kEACyE;;AAEzE,iEAAwE;;AAKxE;;;;;;;;EAQG;AACH;IAA8B,kCAAW;IA0BxC;;;;;MADG;IACH,yBAAY,WAA+B,EAAE,UAAe,EAAE,QAA4B;QAA5B,uCAAA,QAAQ,GAAgB,IAAI;AAAA,QAEzF,WAAM,KAAA,CAAC;;QAEP,IAAI,CAAC,YAAY,GAAG,UAAU;QAC9B,IAAI,CAAC,YAAY,GAAG,WAAW;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ;IACzB,CAAC;IA1BD;QAAA;;UADG;aACH;YAEC,OAAO,SAAS,CAAC,iBAAiB;QACnC,CAAC;;;;AAAA;IAKD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,YAAY;QACzB,CAAC;;;;AAAA;IAoBD;;MADG;wCACH;QAEC,gBAAK,CAAC,OAAO,KAAC,KAAA,CAAC;IAChB,CAAC;;IAED,gDAAA,UAA2B,QAAkB;QAE5C,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC;IACpC,CAAC;IACF,uBAAC;AAAD,CAAC,EA/C6B,WAAW,EA+CxC;;AAED,gCAAyB,CAAA;;;;AClEzB;IAAA;IAMA,CAAC;AAAA,IAJA,mBAAqB,MAAM;IAC3B,oBAAsB,OAAO;IAC7B,oBAAsB,OAAO;IAC7B,qBAAuB,QAAQ;IAChC,mBAAC;AAAD,CAAC,IAAA;;AAED,4BAAqB,CAAA;;;;ACRrB;AAqBkB;;;ACrBlB,4DAAoE;;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BG;AACH;IAsOC;;;;;;;;;;;;;;;;;MADG;IACH,aAAY,CAAY,EAAE,CAAY,EAAE,CAAY,EAAE,KAAgB,EAAE,MAAiB,EAAE,KAAgB;QAA/F,gCAAA,CAAC,GAAU,CAAC;AAAA,QAAE,gCAAA,CAAC,GAAU,CAAC;AAAA,QAAE,gCAAA,CAAC,GAAU,CAAC;AAAA,QAAE,oCAAA,KAAK,GAAU,CAAC;AAAA,QAAE,qCAAA,MAAM,GAAU,CAAC;AAAA,QAAE,oCAAA,KAAK,GAAU,CAAC;AAAA,QAE1G,IAAI,CAAC,CAAC,GAAG,CAAC;QACV,IAAI,CAAC,CAAC,GAAG,CAAC;QACV,IAAI,CAAC,CAAC,GAAG,CAAC;QACV,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,MAAM,GAAG,MAAM;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK;IACnB,CAAC;IA/KD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;QAC3B,CAAC;QAED,KAAA,UAAgB,GAAU;YAEzB,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;QAC1B,CAAC;;;;AALA;;IAUD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;QAC5B,CAAC;QAED,KAAA,UAAkB,GAAU;YAE3B,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;;;;AALA;;IAWD;QAAA;;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI;gBAChC,IAAI,CAAC,gBAAgB,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;YAExC,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;YAC7C,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;YAC9C,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;;YAE7C,OAAO,IAAI,CAAC,gBAAgB;QAC7B,CAAC;;;;AAAA;IAaD;QAAA;;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,CAAC;QACd,CAAC;QAED,KAAA,UAAiB,GAAU;YAE1B,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG;YAC1B,IAAI,CAAC,CAAC,GAAG,GAAG;QACb,CAAC;;;;AANA;;IAkBD;QAAA;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,CAAC;QACd,CAAC;QAED,KAAA,UAAgB,GAAU;YAEzB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,GAAG;YAC1B,IAAI,CAAC,CAAC,GAAG,GAAG;QACb,CAAC;;;;AANA;;IAWD;QAAA;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;QAC3B,CAAC;QAED,KAAA,UAAiB,GAAU;YAE1B,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC;QAC1B,CAAC;;;;AALA;;IAYD;QAAA;;;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI;gBACrB,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;YAE7B,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;YACzB,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;YAC1B,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;;YAEzB,OAAO,IAAI,CAAC,KAAK;QAClB,CAAC;;;;AAAA;IAYD;QAAA;;;;;;;;;UADG;aACH;YAEC,OAAO,IAAI,CAAC,CAAC;QACd,CAAC;QAED,KAAA,UAAe,GAAU;YAExB,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;YAC7B,IAAI,CAAC,CAAC,GAAG,GAAG;QACb,CAAC;;;;AANA;;IAYD;QAAA;;;UADG;aACH;YAEC,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI;gBAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;YAErC,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;;YAE7B,OAAO,IAAI,CAAC,aAAa;QAC1B,CAAC;;;;AAAA;IAwCD;;;;;;;;;MADG;0BACH;QAEC,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;IAC5E,CAAC;;IAYD;;;;;;;;;MADG;6BACH,UAAgB,CAAQ,EAAE,CAAQ,EAAE,CAAQ;QAE3C,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IACxI,CAAC;;IAaD;;;;;;;;;;MADG;kCACH,UAAqB,QAAiB;QAErC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,QAAQ,CAAC,CAAC,CAAC;IAC9L,CAAC;;IAYD;;;;;;;;;MADG;iCACH,UAAoB,GAAO;QAE1B,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;IACrM,CAAC;;IAQD;;;;;MADG;6BACH,UAAgB,SAAa;QAE5B,MAAM;IACP,CAAC;;IAeD;;;;;;;;;;;;MADG;2BACH,UAAc,SAAa;QAE1B,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,KAAK,CAAC;IACtL,CAAC;;IAmBD;;;;;;;;;;;;;;;;MADG;4BACH,UAAe,EAAS,EAAE,EAAS,EAAE,EAAS;QAE7C,IAAI,CAAC,CAAC,IAAI,EAAE,GAAC,CAAC;QACd,IAAI,CAAC,CAAC,IAAI,EAAE,GAAC,CAAC;QACd,IAAI,CAAC,CAAC,IAAI,EAAE,GAAC,CAAC;QACd,IAAI,CAAC,KAAK,IAAI,EAAE,GAAC,CAAC;QAClB,IAAI,CAAC,MAAM,IAAI,EAAE,GAAC,CAAC;QACnB,IAAI,CAAC,KAAK,IAAI,EAAE,GAAC,CAAC;IACnB,CAAC;;IAgBD;;;;;;;;;;;;;MADG;iCACH,UAAoB,KAAc;QAEjC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAC,CAAC;QACnB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAC,CAAC;QACnB,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAC,CAAC;QACnB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,GAAC,CAAC;QACvB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,GAAC,CAAC;QACxB,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,GAAC,CAAC;IACxB,CAAC;;IAgBD;;;;;;;;;;;;;MADG;iCACH,UAAoB,WAAe;QAElC,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAE;YACjC,IAAI,CAAC,GAAO,IAAI,GAAG,CAAC,CAAC;;YAErB,IAAI,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAE;gBAC3B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACZ,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK;;gBAEpD,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;oBACvB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;aACtB,KAAM;gBACN,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;gBACnB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;;gBAE7C,IAAI,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK;oBAC9B,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;aAC7B;;YAED,IAAI,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAE;gBAC3B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACZ,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM;;gBAEtD,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;oBACzB,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;aACxB,KAAM;gBACN,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;gBACnB,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;;gBAE/C,IAAI,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM;oBAChC,CAAC,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;aAC/B;;YAGD,IAAI,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAE;gBAC3B,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBACZ,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK;;gBAEpD,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;oBACvB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;aACtB,KAAM;gBACN,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC;gBACnB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;;gBAE7C,IAAI,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK;oBAC9B,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;aAC7B;;YAED,OAAO,CAAC;SACR;;QAED,OAAO,IAAI,GAAG,CAAC,CAAC;IACjB,CAAC;;IAaD;;;;;;;;;;MADG;+BACH,UAAkB,WAAe;QAEhC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;IACvQ,CAAC;;IAQD;;;;;MADG;4BACH;QAEC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAC7G,CAAC;;IAUD;;;;;;;MADG;2BACH,UAAc,EAAS,EAAE,EAAS,EAAE,EAAS;QAE5C,IAAI,CAAC,CAAC,IAAI,EAAE;QACZ,IAAI,CAAC,CAAC,IAAI,EAAE;QACZ,IAAI,CAAC,CAAC,IAAI,EAAE;IACb,CAAC;;IASD;;;;;;MADG;mCACH,UAAsB,QAAiB;QAEtC,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;QACpB,IAAI,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC;IACrB,CAAC;;IAWD;;;;;;;;MADG;6BACH;QAEC,IAAI,CAAC,CAAC,GAAG,CAAC;QACV,IAAI,CAAC,CAAC,GAAG,CAAC;QACV,IAAI,CAAC,CAAC,GAAG,CAAC;QACV,IAAI,CAAC,KAAK,GAAG,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,CAAC;QACf,IAAI,CAAC,KAAK,GAAG,CAAC;IACf,CAAC;;IAeD;;;;;;;;;;;;MADG;0BACH,UAAa,EAAS,EAAE,EAAS,EAAE,EAAS,EAAE,MAAa,EAAE,OAAc,EAAE,MAAa;QAEzF,IAAI,CAAC,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,KAAK,GAAG,MAAM;QACnB,IAAI,CAAC,MAAM,GAAG,OAAO;QACrB,IAAI,CAAC,KAAK,GAAG,MAAM;IACpB,CAAC;;IAUD;;;;;;;MADG;6BACH;QAEC,OAAO,WAAW,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG;IACtJ,CAAC;;IAaD;;;;;;;;;;MADG;0BACH,UAAa,OAAW;QAEvB,IAAI,CAAC,GAAO,IAAI,GAAG,CAAC,CAAC;;QAErB,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE;YACvB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACZ,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK;;YAE5C,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;gBACvB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SACtB,KAAM;YACN,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;YACf,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;;YAEzC,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;gBAC1B,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB;;QAED,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE;YACvB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACZ,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM;;YAE9C,IAAI,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM;gBACzB,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;SACxB,KAAM;YACN,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;YACf,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;;YAE3C,IAAI,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM;gBAC5B,CAAC,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;SAC3B;;QAED,IAAI,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAE;YACvB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YACZ,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK;;YAE5C,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;gBACvB,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;SACtB,KAAM;YACN,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;YACf,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK;;YAEzC,IAAI,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK;gBAC1B,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;SACzB;;QAED,OAAO,CAAC;IACT,CAAC;IACF,WAAC;AAAD,CAAC,IAAA;;AAED,oBAAa,CAAA;;;;AC3oBb,4DAAmE;;AAEnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuCG;AACH;IA4GC;;;;;;;;;;;;;;;;;;;;MADG;IACH,wBAAY,aAAwB,EAAE,eAA0B,EAAE,cAAyB,EAAE,eAA0B,EAAE,SAAoB,EAAE,WAAsB,EAAE,UAAqB,EAAE,WAAsB;QAAxM,4CAAA,aAAa,GAAU,CAAC;AAAA,QAAE,8CAAA,eAAe,GAAU,CAAC;AAAA,QAAE,6CAAA,cAAc,GAAU,CAAC;AAAA,QAAE,8CAAA,eAAe,GAAU,CAAC;AAAA,QAAE,wCAAA,SAAS,GAAU,CAAC;AAAA,QAAE,0CAAA,WAAW,GAAU,CAAC;AAAA,QAAE,yCAAA,UAAU,GAAU,CAAC;AAAA,QAAE,0CAAA,WAAW,GAAU,CAAC;AAAA,QAEnN,IAAI,CAAC,aAAa,GAAG,aAAa;QAClC,IAAI,CAAC,eAAe,GAAG,eAAe;QACtC,IAAI,CAAC,cAAc,GAAG,cAAc;QACpC,IAAI,CAAC,eAAe,GAAG,eAAe;QACtC,IAAI,CAAC,SAAS,GAAG,SAAS;QAC1B,IAAI,CAAC,WAAW,GAAG,WAAW;QAC9B,IAAI,CAAC,UAAU,GAAG,UAAU;QAC5B,IAAI,CAAC,WAAW,GAAG,WAAW;IAC/B,CAAC;IAjDD;QAAA;;;;;;;;;;;;;;;UADG;aACH;YAEC,OAAM,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,GAAG,CAAE,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC;QAC5E,CAAC;QAED,KAAA,UAAiB,KAAY;YAE5B,IAAI,IAAI,GAAY,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC;;YAExD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,EAAG,uBAAuB;YAClD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,EAAG,sBAAsB;YACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,EAAG,eAAe;;YAE3C,IAAI,CAAC,aAAa,GAAG,CAAC;YACtB,IAAI,CAAC,eAAe,GAAG,CAAC;YACxB,IAAI,CAAC,cAAc,GAAG,CAAC;QACxB,CAAC;;;;AAbA;;IA2DD;;;;;;;;;;MADG;sCACH,UAAc,MAAqB;QAElC,IAAI,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa;QAC1C,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe;QAC9C,IAAI,CAAC,cAAc,IAAI,MAAM,CAAC,cAAc;QAC5C,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,eAAe;IAC/C,CAAC;IACF,sBAAC;AAAD,CAAC,IAAA;;AAED,+BAAwB,CAAA;;;;ACtLxB;;EAEE;AACF;IAAA;IAWA,CAAC;AAAA,IANA,gCAA0C,GAAG,GAAC,IAAI,CAAC,EAAE;;IAKrD,gCAA0C,IAAI,CAAC,EAAE,GAAC,GAAG;IACtD,kBAAC;AAAD,CAAC,IAAA;;AAED,2BAAoB,CAAA;;;;AChBpB,4DACoE;;AAEpE,4DAAoE;;AAGpE;;EAEG;AACH;IAAA;IAiTA,CAAC;AAAA,IAlSA;;;;MADG;sCACH,UAAgC,WAAsB,EAAE,CAAiB;QAAjB,gCAAA,CAAC,GAAY,IAAI;AAAA,QAExE,IAAI,CAAC,GAAU,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAU,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAU,WAAW,CAAC,CAAC;QAC5B,IAAI,CAAC,GAAU,WAAW,CAAC,CAAC;;QAE5B,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;QACnB,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;QACnB,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;QACnB,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;;QAEnB,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;QACnB,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;QACnB,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;;QAEnB,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;QACnB,IAAI,EAAE,GAAU,CAAC,GAAC,CAAC;;QAEnB,IAAI,GAAG,GAAY,aAAa,CAAC,kBAAkB;QACnD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACxB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACpB,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACpB,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAC,CAAC,EAAE,GAAG,EAAE,CAAC;QACzB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;QAC3D,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;;QAEX,IAAI,CAAC,CAAE;YACN,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC;YACtB,OAAO,CAAC;SACR;YACA,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;;IAQD;;;;;MADG;+BACH,UAAyB,CAAU,EAAE,CAAiB;QAAjB,gCAAA,CAAC,GAAY,IAAI;AAAA,QAErD,oCAAoC;QACpC,IAAI,CAAC,KAAK,IAAI,CAAE;YAEf,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAE/B;;QAED,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC,CAAC,SAAS,CAAC,CAAC;;QAEb,OAAO,CAAC;IACT,CAAC;;IAQD;;;;;MADG;0BACH,UAAoB,CAAU,EAAE,CAAiB;QAEhD,oCAAoC;QAFL,gCAAA,CAAC,GAAY,IAAI;AAAA,QAIhD,IAAI,CAAC,KAAK,IAAI,CAAE;YAEf,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAE/B;;QAED,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC,CAAC,SAAS,CAAC,CAAC;;QAEb,OAAO,CAAC;IACT,CAAC;;IAQD;;;;;MADG;6BACH,UAAuB,CAAU,EAAE,CAAiB;QAAjB,gCAAA,CAAC,GAAY,IAAI;AAAA,QAEnD,oCAAoC;QACpC,IAAI,CAAC,KAAK,IAAI,CAAE;YAEf,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;SAE/B;;QAED,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC,CAAC,SAAS,CAAC,CAAC;;QAEb,OAAO,CAAC;IACT,CAAC;;IAKD;;MADG;4BACH,UAAsB,EAAW,EAAE,EAAW;QAE7C,IAAI,EAAE,GAAY,aAAa,CAAC,kBAAkB;QAClD,IAAI,EAAE,GAAY,EAAE,CAAC,OAAO;QAC5B,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;;QAEpB,KAAK,IAAI,CAAC,GAAU,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAE;YACnC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBACjB,OAAO,KAAK,CAAC;SACd;;QAED,OAAO,IAAI;IACZ,CAAC;;IAED,uBAAA,UAAqB,MAAe,EAAE,GAAY,EAAE,GAAY,EAAE,EAAW;QAE5E,IAAI,IAAI;QACR,IAAI,GAAG;QACP,IAAI,IAAI;QACR,IAAI,GAAG,GAAY,aAAa,CAAC,kBAAkB;;QAEnD,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,CAAC;;QAEhB,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;QAC5B,GAAG,CAAC,SAAS,CAAC,CAAC;QACf,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC,SAAS,CAAC,CAAC;;QAEhB,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;;QAEZ,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;;QAEZ,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjB,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;QAEb,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC/B,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9B,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAC9B,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG;;QAEb,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC;IAC5B,CAAC;;IAED,2BAAA,UAAyB,KAAa,EAAE,MAAsB;QAAtB,qCAAA,MAAM,GAAY,IAAI;AAAA,QAE7D,IAAI,MAAM,KAAK,IAAI;YAClB,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;QAEzB,IAAI,CAAC,GAAU,KAAK,CAAC,CAAC,EAAE,CAAC,GAAU,KAAK,CAAC,CAAC,EAAE,CAAC,GAAU,KAAK,CAAC,CAAC,EAAE,CAAC,GAAU,KAAK,CAAC,CAAC;QAClF,IAAI,OAAO,GAAY,aAAa,CAAC,kBAAkB;QACvD,IAAI,GAAG,GAAU,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC;QACvB,IAAI,GAAG,GAAU,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC;QACvB,IAAI,GAAG,GAAU,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC;;QACvB,oBAAoB;QACpB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAC,CAAC,GAAC,CAAC;QACtB,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;QAChB,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;QAChB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC;QACpB,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;QAChB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAC,CAAC,GAAC,CAAC;QACtB,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;QAChB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC;QACpB,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;QAChB,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG;QAChB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAC,CAAC,GAAC,CAAC;QACvB,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAC,CAAC;QACpB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACd,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;QACd,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC;QACf,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC;QACf,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC;;QAE/B,OAAO,MAAM;IACd,CAAC;;IAGD,gCAAA,UAA8B,MAAe,EAAE,MAAe,EAAE,MAAsB;QAAtB,qCAAA,MAAM,GAAY,IAAI;AAAA,QAErF,IAAI,CAAC,MAAM;YACV,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;QAEzB,IAAI,GAAG,GAAiB,aAAa,CAAC,kBAAkB;QACxD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;QACzB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;;QAEtB,IAAI,CAAC,GAAU,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,GAAU,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,GAAU,MAAM,CAAC,CAAC;QACvB,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACpC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACpC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACpC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACpC,OAAO,MAAM;IACd,CAAC;;IAED,qCAAA,UAAmC,MAAe,EAAE,MAAe,EAAE,MAAsB;QAAtB,qCAAA,MAAM,GAAY,IAAI;AAAA,QAE1F,IAAI,CAAC,MAAM;YACV,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;QAEzB,IAAI,GAAG,GAAiB,aAAa,CAAC,kBAAkB;QACxD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;QACzB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAU,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,GAAU,MAAM,CAAC,CAAC;QACvB,IAAI,CAAC,GAAU,MAAM,CAAC,CAAC;QACvB,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QAChC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QAChC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QAChC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QAChC,OAAO,MAAM;IACd,CAAC;;IAED,+BAAA,UAA6B,SAAkB,EAAE,MAAsB;QAAtB,qCAAA,MAAM,GAAY,IAAI;AAAA,QAEtE,IAAG,CAAC,MAAM;YACT,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;;QAEzB,SAAS,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;QACjC,OAAO,MAAM;IACd,CAAC;;IAED,sCAAA,UAAoC,MAAe,EAAE,GAAiB,EAAE,IAAkB;QAEzF,IAAI,GAAG,GAAiB,aAAa,CAAC,kBAAkB;QACxD,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC;QACzB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,CAAC,GAAU,GAAG,CAAC,EAAE,CAAC;QACtB,IAAI,QAAQ,GAAU,CAAC;QACvB,IAAI,MAAM,GAAU,GAAG,CAAC,MAAM;QAC9B,KAAI,IAAI,KAAK,GAAU,CAAC,EAAE,KAAK,GAAC,MAAM,EAAE,KAAK,IAAE,CAAC,CAAE;YACjD,IAAI,CAAC,GAAU,GAAG,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,GAAU,GAAG,CAAC,KAAK,GAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,GAAU,GAAG,CAAC,KAAK,GAAC,CAAC,CAAC;YAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YACxC,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;SACxC;IACF,CAAC;IA3SD,mCAA4C,IAAI,KAAK,CAAS,EAAE,CAAC;;IAGjE,mCAA4C,IAAI,QAAQ,CAAC,CAAC;IAyS3D,qBAAC;AAAD,CAAC,IAAA;;AAED,8BAAuB,CAAA;;;;AC5TvB,sEAA4E;;AAE5E,4DAAoE;AACpE,mEAAyE;;AAEzE;IAaC;;MADG;IACH,kBAAY,CAAiB;QAAjB,gCAAA,CAAC,GAAY,IAAI;AAAA,QAE5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;YAC9B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;;YAEzB,IAAI,CAAC,OAAO,GAAG,CAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAE,CAAC;IACpE,CAAC;IAKD;;MADG;gCACH,UAAc,GAAY;QAEzB,IAAI,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC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CAAC;YACjG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YAClG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YAClG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YACjG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YAClG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YACjG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YACjG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YAClG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YAClG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YACnG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YACnG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YAClG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;YACnG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAC,CAAC,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,GAAG,GAAG,GAAC,CAAC,GAAG,GAAC,GAAG,GAAG,GAAG,GAAC,GAAG,CAAC,CAAC;SAClG;QACD,OAAO,UAAU;IAClB,CAAC;;IAWD;;;;MALG;IAEH;;MAEG;iCACH,UAAe,GAAY;QAE1B,IAAI,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,GAAU,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;;QAE99B,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;;QAE/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;;QAE/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAC/D,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI;QAChE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IAAI,GAAG,IAAI,GAAC,IA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AO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,OA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", + "file": "generated.js", + "sourceRoot": "", + "sourcesContent": [ + "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;oAnimationSetBase.\n *\n * @see away.animators.IAnimationSet\n */\ninterface IAnimator extends IAsset\n{\n\t/**\n\t *\n\t */\n\tanimationSet:IAnimationSet;\n\n\t/**\n\t *\n\t */\n\tclone():IAnimator;\n\n\t/**\n\t *\n\t */\n\tdispose();\n\n\t/**\n\t * Used by the entity object to which the animator is applied, registers the owner for internal use.\n\t *\n\t * @private\n\t */\n\taddOwner(mesh:IEntity);\n\n\t/**\n\t * Used by the mesh object from which the animator is removed, unregisters the owner for internal use.\n\t *\n\t * @private\n\t */\n\tremoveOwner(mesh:IEntity);\n\n\t/**\n\t * //TODO\n\t *\n\t * @param sourceSubGeometry\n\t */\n\tgetRenderableSubGeometry(renderable:IRenderable, sourceSubGeometry:SubGeometryBase):SubGeometryBase;\n}\n\nexport = IAnimator;", + "import AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\n\n/**\n * Provides an abstract base class for nodes in an animation blend tree.\n */\nclass AnimationNodeBase extends NamedAssetBase implements IAsset\n{\n\tpublic _pStateClass:any;\n\n\tpublic get stateClass():any\n\t{\n\t\treturn this._pStateClass;\n\t}\n\n\t/**\n\t * Creates a new AnimationNodeBase object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic dispose()\n\t{\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.ANIMATION_NODE;\n\t}\n}\n\nexport = AnimationNodeBase;", + "import BoundingVolumeBase\t\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Matrix3DUtils\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3DUtils\");\nimport PlaneClassification\t\t\t= require(\"awayjs-core/lib/core/geom/PlaneClassification\");\nimport Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * AxisAlignedBoundingBox represents a bounding box volume that has its planes aligned to the local coordinate axes of the bounded object.\n * This is useful for most meshes.\n */\nclass AxisAlignedBoundingBox extends BoundingVolumeBase\n{\n\tprivate _centerX:number = 0;\n\tprivate _centerY:number = 0;\n\tprivate _centerZ:number = 0;\n\tprivate _halfExtentsX:number = 0;\n\tprivate _halfExtentsY:number = 0;\n\tprivate _halfExtentsZ:number = 0;\n\n\t/**\n\t * Creates a new AxisAlignedBoundingBox object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic nullify()\n\t{\n\t\tsuper.nullify();\n\n\t\tthis._centerX = this._centerY = this._centerZ = 0;\n\t\tthis._halfExtentsX = this._halfExtentsY = this._halfExtentsZ = 0;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic isInFrustum(planes:Array, numPlanes:number):boolean\n\t{\n\t\tfor (var i:number = 0; i < numPlanes; ++i) {\n\n\t\t\tvar plane:Plane3D = planes[i];\n\t\t\tvar a:number = plane.a;\n\t\t\tvar b:number = plane.b;\n\t\t\tvar c:number = plane.c;\n\t\t\tvar flippedExtentX:number = a < 0? -this._halfExtentsX : this._halfExtentsX;\n\t\t\tvar flippedExtentY:number = b < 0? -this._halfExtentsY : this._halfExtentsY;\n\t\t\tvar flippedExtentZ:number = c < 0? -this._halfExtentsZ : this._halfExtentsZ;\n\t\t\tvar projDist:number = a*(this._centerX + flippedExtentX) + b*(this._centerY + flippedExtentY) + c*(this._centerZ + flippedExtentZ) - plane.d;\n\n\t\t\tif (projDist < 0)\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number\n\t{\n\n\t\tif (this.containsPoint(position))\n\t\t\treturn 0;\n\n\t\tvar px:number = position.x - this._centerX\n\t\tvar py:number = position.y - this._centerY\n\t\tvar pz:number = position.z - this._centerZ;\n\n\t\tvar vx:number = direction.x\n\t\tvar vy:number = direction.y\n\t\tvar vz:number = direction.z;\n\n\t\tvar ix:number;\n\t\tvar iy:number;\n\t\tvar iz:number;\n\t\tvar rayEntryDistance:number;\n\n\t\t// ray-plane tests\n\t\tvar intersects:boolean;\n\t\tif (vx < 0) {\n\t\t\trayEntryDistance = ( this._halfExtentsX - px )/vx;\n\t\t\tif (rayEntryDistance > 0) {\n\t\t\t\tiy = py + rayEntryDistance*vy;\n\t\t\t\tiz = pz + rayEntryDistance*vz;\n\t\t\t\tif (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) {\n\t\t\t\t\ttargetNormal.x = 1;\n\t\t\t\t\ttargetNormal.y = 0;\n\t\t\t\t\ttargetNormal.z = 0;\n\n\t\t\t\t\tintersects = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!intersects && vx > 0) {\n\t\t\trayEntryDistance = ( -this._halfExtentsX - px )/vx;\n\t\t\tif (rayEntryDistance > 0) {\n\t\t\t\tiy = py + rayEntryDistance*vy;\n\t\t\t\tiz = pz + rayEntryDistance*vz;\n\t\t\t\tif (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) {\n\t\t\t\t\ttargetNormal.x = -1;\n\t\t\t\t\ttargetNormal.y = 0;\n\t\t\t\t\ttargetNormal.z = 0;\n\t\t\t\t\tintersects = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!intersects && vy < 0) {\n\t\t\trayEntryDistance = ( this._halfExtentsY - py )/vy;\n\t\t\tif (rayEntryDistance > 0) {\n\t\t\t\tix = px + rayEntryDistance*vx;\n\t\t\t\tiz = pz + rayEntryDistance*vz;\n\t\t\t\tif (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) {\n\t\t\t\t\ttargetNormal.x = 0;\n\t\t\t\t\ttargetNormal.y = 1;\n\t\t\t\t\ttargetNormal.z = 0;\n\t\t\t\t\tintersects = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!intersects && vy > 0) {\n\t\t\trayEntryDistance = ( -this._halfExtentsY - py )/vy;\n\t\t\tif (rayEntryDistance > 0) {\n\t\t\t\tix = px + rayEntryDistance*vx;\n\t\t\t\tiz = pz + rayEntryDistance*vz;\n\t\t\t\tif (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) {\n\t\t\t\t\ttargetNormal.x = 0;\n\t\t\t\t\ttargetNormal.y = -1;\n\t\t\t\t\ttargetNormal.z = 0;\n\t\t\t\t\tintersects = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!intersects && vz < 0) {\n\t\t\trayEntryDistance = ( this._halfExtentsZ - pz )/vz;\n\t\t\tif (rayEntryDistance > 0) {\n\t\t\t\tix = px + rayEntryDistance*vx;\n\t\t\t\tiy = py + rayEntryDistance*vy;\n\t\t\t\tif (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) {\n\t\t\t\t\ttargetNormal.x = 0;\n\t\t\t\t\ttargetNormal.y = 0;\n\t\t\t\t\ttargetNormal.z = 1;\n\t\t\t\t\tintersects = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (!intersects && vz > 0) {\n\t\t\trayEntryDistance = ( -this._halfExtentsZ - pz )/vz;\n\t\t\tif (rayEntryDistance > 0) {\n\t\t\t\tix = px + rayEntryDistance*vx;\n\t\t\t\tiy = py + rayEntryDistance*vy;\n\t\t\t\tif (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) {\n\t\t\t\t\ttargetNormal.x = 0;\n\t\t\t\t\ttargetNormal.y = 0;\n\t\t\t\t\ttargetNormal.z = -1;\n\t\t\t\t\tintersects = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn intersects? rayEntryDistance : -1;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic containsPoint(position:Vector3D):boolean\n\t{\n\t\tvar px:number = position.x - this._centerX, py:number = position.y - this._centerY, pz:number = position.z - this._centerZ;\n\t\treturn px <= this._halfExtentsX && px >= -this._halfExtentsX && py <= this._halfExtentsY && py >= -this._halfExtentsY && pz <= this._halfExtentsZ && pz >= -this._halfExtentsZ;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number)\n\t{\n\n\t\tthis._centerX = (maxX + minX)*.5;\n\t\tthis._centerY = (maxY + minY)*.5;\n\t\tthis._centerZ = (maxZ + minZ)*.5;\n\t\tthis._halfExtentsX = (maxX - minX)*.5;\n\t\tthis._halfExtentsY = (maxY - minY)*.5;\n\t\tthis._halfExtentsZ = (maxZ - minZ)*.5;\n\n\t\tsuper.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ);\n\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic clone():BoundingVolumeBase\n\t{\n\t\tvar clone:AxisAlignedBoundingBox = new AxisAlignedBoundingBox();\n\t\tclone.fromExtremes(this._aabb.x, this._aabb.y + this._aabb.height, this._aabb.z, this._aabb.x + this._aabb.width, this._aabb.y, this._aabb.z + this._aabb.depth);\n\t\treturn clone;\n\t}\n\n\tpublic get halfExtentsX():number\n\t{\n\t\treturn this._halfExtentsX;\n\t}\n\n\tpublic get halfExtentsY():number\n\t{\n\t\treturn this._halfExtentsY;\n\t}\n\n\tpublic get halfExtentsZ():number\n\t{\n\t\treturn this._halfExtentsZ;\n\t}\n\n\t/**\n\t * Finds the closest point on the bounding volume to another given point. This can be used for maximum error calculations for content within a given bound.\n\t * @param point The point for which to find the closest point on the bounding volume\n\t * @param target An optional Vector3D to store the result to prevent creating a new object.\n\t * @return\n\t */\n\tpublic closestPointToPoint(point:Vector3D, target:Vector3D = null):Vector3D\n\t{\n\t\tvar p:number;\n\n\t\tif (target == null)\n\t\t\ttarget = new Vector3D();\n\n\t\tp = point.x;\n\t\tif (p < this._aabb.x)\n\t\t\tp = this._aabb.x;\n\t\tif (p > this._aabb.x + this._aabb.width)\n\t\t\tp = this._aabb.x + this._aabb.width;\n\t\ttarget.x = p;\n\n\t\tp = point.y;\n\t\tif (p < this._aabb.y + this._aabb.height)\n\t\t\tp = this._aabb.y + this._aabb.height;\n\t\tif (p > this._aabb.y)\n\t\t\tp = this._aabb.y;\n\t\ttarget.y = p;\n\n\t\tp = point.z;\n\t\tif (p < this._aabb.z)\n\t\t\tp = this._aabb.z;\n\t\tif (p > this._aabb.z + this._aabb.depth)\n\t\t\tp = this._aabb.z + this._aabb.depth;\n\t\ttarget.z = p;\n\n\t\treturn target;\n\t}\n\n\tpublic pUpdateBoundingRenderable()\n\t{\n\t\tthis._pBoundingEntity.transform.scale.x = Math.max(this._halfExtentsX*2, 0.001);\n\t\tthis._pBoundingEntity.transform.scale.y = Math.max(this._halfExtentsY*2, 0.001);\n\t\tthis._pBoundingEntity.transform.scale.z = Math.max(this._halfExtentsZ*2, 0.001);\n\t\tthis._pBoundingEntity.transform.position.x = this._centerX;\n\t\tthis._pBoundingEntity.transform.position.y = this._centerY;\n\t\tthis._pBoundingEntity.transform.position.z = this._centerZ;\n\t}\n\n\tpublic pCreateBoundingEntity():IEntity\n\t{\n\t\treturn null;// new away.primitives.WireframeCube(1, 1, 1, 0xffffff, 0.5);\n\t}\n\n\tpublic classifyToPlane(plane:Plane3D):number\n\t{\n\t\tvar a:number = plane.a;\n\t\tvar b:number = plane.b;\n\t\tvar c:number = plane.c;\n\t\tvar centerDistance:number = a*this._centerX + b*this._centerY + c*this._centerZ - plane.d;\n\n\t\tif (a < 0)\n\t\t\ta = -a;\n\n\t\tif (b < 0)\n\t\t\tb = -b;\n\n\t\tif (c < 0)\n\t\t\tc = -c;\n\n\t\tvar boundOffset:number = a*this._halfExtentsX + b*this._halfExtentsY + c*this._halfExtentsZ;\n\n\t\treturn centerDistance > boundOffset? PlaneClassification.FRONT : centerDistance < -boundOffset? PlaneClassification.BACK : PlaneClassification.INTERSECT;\n\t}\n\n\tpublic transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D)\n\t{\n\t\tvar aabb:AxisAlignedBoundingBox = bounds;\n\t\tvar cx:number = aabb._centerX;\n\t\tvar cy:number = aabb._centerY;\n\t\tvar cz:number = aabb._centerZ;\n\t\tvar raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER;\n\n\t\tmatrix.copyRawDataTo(raw);\n\n\t\tvar m11:number = raw[0], m12:number = raw[4], m13:number = raw[8], m14:number = raw[12];\n\t\tvar m21:number = raw[1], m22:number = raw[5], m23:number = raw[9], m24:number = raw[13];\n\t\tvar m31:number = raw[2], m32:number = raw[6], m33:number = raw[10], m34:number = raw[14];\n\n\t\tthis._centerX = cx*m11 + cy*m12 + cz*m13 + m14;\n\t\tthis._centerY = cx*m21 + cy*m22 + cz*m23 + m24;\n\t\tthis._centerZ = cx*m31 + cy*m32 + cz*m33 + m34;\n\n\t\tif (m11 < 0)\n\t\t\tm11 = -m11;\n\t\tif (m12 < 0)\n\t\t\tm12 = -m12;\n\t\tif (m13 < 0)\n\t\t\tm13 = -m13;\n\t\tif (m21 < 0)\n\t\t\tm21 = -m21;\n\t\tif (m22 < 0)\n\t\t\tm22 = -m22;\n\t\tif (m23 < 0)\n\t\t\tm23 = -m23;\n\t\tif (m31 < 0)\n\t\t\tm31 = -m31;\n\t\tif (m32 < 0)\n\t\t\tm32 = -m32;\n\t\tif (m33 < 0)\n\t\t\tm33 = -m33;\n\t\tvar hx:number = aabb._halfExtentsX;\n\t\tvar hy:number = aabb._halfExtentsY;\n\t\tvar hz:number = aabb._halfExtentsZ;\n\t\tthis._halfExtentsX = hx*m11 + hy*m12 + hz*m13;\n\t\tthis._halfExtentsY = hx*m21 + hy*m22 + hz*m23;\n\t\tthis._halfExtentsZ = hx*m31 + hy*m32 + hz*m33;\n\n\t\tthis._aabb.width = this._aabb.height = this._aabb.depth = this._halfExtentsX*2;\n\t\tthis._aabb.x = this._centerX - this._halfExtentsX;\n\t\tthis._aabb.y = this._centerY + this._halfExtentsY;\n\t\tthis._aabb.z = this._centerZ - this._halfExtentsZ;\n\t}\n}\n\nexport = AxisAlignedBoundingBox;", + "import BoundingVolumeBase\t\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Matrix3DUtils\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3DUtils\");\nimport PlaneClassification\t\t\t= require(\"awayjs-core/lib/core/geom/PlaneClassification\");\nimport Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Transform\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Transform\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\nclass BoundingSphere extends BoundingVolumeBase\n{\n\n\tprivate _radius:number = 0;\n\tprivate _centerX:number = 0;\n\tprivate _centerY:number = 0;\n\tprivate _centerZ:number = 0;\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tpublic get radius():number\n\t{\n\t\treturn this._radius;\n\t}\n\n\tpublic nullify()\n\t{\n\t\tsuper.nullify();\n\t\tthis._centerX = this._centerY = this._centerZ = 0;\n\t\tthis._radius = 0;\n\t}\n\n\tpublic isInFrustum(planes:Array, numPlanes:number):boolean\n\t{\n\t\tfor (var i:number = 0; i < numPlanes; ++i) {\n\t\t\tvar plane:Plane3D = planes[i];\n\t\t\tvar flippedExtentX:number = plane.a < 0? -this._radius : this._radius;\n\t\t\tvar flippedExtentY:number = plane.b < 0? -this._radius : this._radius;\n\t\t\tvar flippedExtentZ:number = plane.c < 0? -this._radius : this._radius;\n\t\t\tvar projDist:number = plane.a*( this._centerX + flippedExtentX ) + plane.b*( this._centerY + flippedExtentY) + plane.c*( this._centerZ + flippedExtentZ ) - plane.d;\n\t\t\tif (projDist < 0) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tpublic fromSphere(center:Vector3D, radius:number)\n\t{\n\t\tthis._centerX = center.x;\n\t\tthis._centerY = center.y;\n\t\tthis._centerZ = center.z;\n\t\tthis._radius = radius;\n\t\tthis._aabb.width = this._aabb.height = this._aabb.depth = radius*2;\n\t\tthis._aabb.x = this._centerX - radius;\n\t\tthis._aabb.y = this._centerY + radius;\n\t\tthis._aabb.z = this._centerZ - radius;\n\t\tthis._pAabbPointsDirty = true;\n\n\t\tif (this._pBoundingEntity)\n\t\t\tthis.pUpdateBoundingEntity();\n\t}\n\n\tpublic fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number)\n\t{\n\t\tthis._centerX = (maxX + minX)*.5;\n\t\tthis._centerY = (maxY + minY)*.5;\n\t\tthis._centerZ = (maxZ + minZ)*.5;\n\n\t\tvar d:number = maxX - minX;\n\t\tvar y:number = maxY - minY;\n\t\tvar z:number = maxZ - minZ;\n\n\t\tif (y > d)\n\t\t\td = y;\n\n\t\tif (z > d)\n\t\t\td = z;\n\n\t\tthis._radius = d*Math.sqrt(.5);\n\t\tsuper.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ);\n\t}\n\n\tpublic clone():BoundingVolumeBase\n\t{\n\t\tvar clone:BoundingSphere = new BoundingSphere();\n\t\tclone.fromSphere(new Vector3D(this._centerX, this._centerY, this._centerZ), this._radius);\n\t\treturn clone;\n\t}\n\n\tpublic rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number\n\t{\n\t\tif (this.containsPoint(position)) {\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar px:number = position.x - this._centerX, py:number = position.y - this._centerY, pz:number = position.z - this._centerZ;\n\t\tvar vx:number = direction.x, vy:number = direction.y, vz:number = direction.z;\n\t\tvar rayEntryDistance:number;\n\n\t\tvar a:number = vx*vx + vy*vy + vz*vz;\n\t\tvar b:number = 2*( px*vx + py*vy + pz*vz );\n\t\tvar c:number = px*px + py*py + pz*pz - this._radius*this._radius;\n\t\tvar det:number = b*b - 4*a*c;\n\n\t\tif (det >= 0) { // ray goes through sphere\n\t\t\tvar sqrtDet:number = Math.sqrt(det);\n\t\t\trayEntryDistance = ( -b - sqrtDet )/( 2*a );\n\t\t\tif (rayEntryDistance >= 0) {\n\t\t\t\ttargetNormal.x = px + rayEntryDistance*vx;\n\t\t\t\ttargetNormal.y = py + rayEntryDistance*vy;\n\t\t\t\ttargetNormal.z = pz + rayEntryDistance*vz;\n\t\t\t\ttargetNormal.normalize();\n\n\t\t\t\treturn rayEntryDistance;\n\t\t\t}\n\t\t}\n\n\t\t// ray misses sphere\n\t\treturn -1;\n\t}\n\n\tpublic containsPoint(position:Vector3D):boolean\n\t{\n\t\tvar px:number = position.x - this._centerX;\n\t\tvar py:number = position.y - this._centerY;\n\t\tvar pz:number = position.z - this._centerZ;\n\t\tvar distance:number = Math.sqrt(px*px + py*py + pz*pz);\n\t\treturn distance <= this._radius;\n\t}\n\n\tpublic pUpdateBoundingEntity()\n\t{\n\t\tvar sc:number = this._radius;\n\t\tif (sc == 0)\n\t\t\tsc = 0.001;\n\n\t\tvar transform:Transform = this._pBoundingEntity.transform;\n\t\ttransform.scale = new Vector3D(sc, sc, sc);\n\t\ttransform.position = new Vector3D(this._centerX, this._centerY, this._centerZ);\n\t}\n\n\t// TODO pCreateBoundingRenderable():WireframePrimitiveBase\n\n\tpublic pCreateBoundingEntity():IEntity\n\t{\n\t\treturn null;//new away.primitives.WireframeSphere(1, 16, 12, 0xffffff, 0.5);\n\t}\n\n\n\t//@override\n\tpublic classifyToPlane(plane:Plane3D):number\n\t{\n\t\tvar a:number = plane.a;\n\t\tvar b:number = plane.b;\n\t\tvar c:number = plane.c;\n\t\tvar dd:number = a*this._centerX + b*this._centerY + c*this._centerZ - plane.d;\n\n\t\tif (a < 0)\n\t\t\ta = -a;\n\n\t\tif (b < 0)\n\t\t\tb = -b;\n\n\t\tif (c < 0)\n\t\t\tc = -c;\n\n\t\tvar rr:Number = (a + b + c)*this._radius;\n\n\t\treturn dd > rr? PlaneClassification.FRONT : dd < -rr? PlaneClassification.BACK : PlaneClassification.INTERSECT;\n\t}\n\n\tpublic transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D)\n\t{\n\t\tvar sphere:BoundingSphere = bounds;\n\t\tvar cx:number = sphere._centerX;\n\t\tvar cy:number = sphere._centerY;\n\t\tvar cz:number = sphere._centerZ;\n\t\tvar raw:Array = new Array(16);\n\n\t\tmatrix.copyRawDataTo(raw);\n\n\t\tvar m11:number = raw[0], m12:number = raw[4], m13:number = raw[8], m14:number = raw[12];\n\t\tvar m21:number = raw[1], m22:number = raw[5], m23:number = raw[9], m24:number = raw[13];\n\t\tvar m31:number = raw[2], m32:number = raw[6], m33:number = raw[10], m34:number = raw[14];\n\n\t\tthis._centerX = cx*m11 + cy*m12 + cz*m13 + m14;\n\t\tthis._centerY = cx*m21 + cy*m22 + cz*m23 + m24;\n\t\tthis._centerZ = cx*m31 + cy*m32 + cz*m33 + m34;\n\n\t\tif (m11 < 0)\n\t\t\tm11 = -m11;\n\t\tif (m12 < 0)\n\t\t\tm12 = -m12;\n\t\tif (m13 < 0)\n\t\t\tm13 = -m13;\n\t\tif (m21 < 0)\n\t\t\tm21 = -m21;\n\t\tif (m22 < 0)\n\t\t\tm22 = -m22;\n\t\tif (m23 < 0)\n\t\t\tm23 = -m23;\n\t\tif (m31 < 0)\n\t\t\tm31 = -m31;\n\t\tif (m32 < 0)\n\t\t\tm32 = -m32;\n\t\tif (m33 < 0)\n\t\t\tm33 = -m33;\n\n\t\tvar r:number = sphere._radius;\n\t\tvar rx:number = m11 + m12 + m13;\n\t\tvar ry:number = m21 + m22 + m23;\n\t\tvar rz:number = m31 + m32 + m33;\n\t\tthis._radius = r*Math.sqrt(rx*rx + ry*ry + rz*rz);\n\n\t\tthis._aabb.width = this._aabb.height = this._aabb.depth = this._radius*2;\n\t\tthis._aabb.x = this._centerX - this._radius;\n\t\tthis._aabb.y = this._centerY + this._radius;\n\t\tthis._aabb.z = this._centerZ - this._radius;\n\t}\n}\n\nexport = BoundingSphere;", + "import Geometry\t\t\t\t\t\t= require(\"awayjs-core/lib/core/base/Geometry\");\nimport SubGeometryBase\t\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport Box\t\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Box\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport AbstractMethodError\t\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\n\nclass BoundingVolumeBase\n{\n\tpublic _aabb:Box;\n\tpublic _pAabbPoints:Array = new Array();\n\tpublic _pAabbPointsDirty:boolean = true;\n\tpublic _pBoundingEntity:IEntity;\n\n\tconstructor()\n\t{\n\t\tthis._aabb = new Box();\n\t}\n\n\tpublic get aabb():Box\n\t{\n\t\treturn this._aabb;\n\t}\n\n\tpublic get aabbPoints():Array\n\t{\n\t\tif (this._pAabbPointsDirty)\n\t\t\tthis.pUpdateAABBPoints();\n\n\t\treturn this._pAabbPoints;\n\t}\n\n\tpublic get boundingEntity():IEntity\n\t{\n\t\tif (!this._pBoundingEntity) {\n\t\t\tthis._pBoundingEntity = this.pCreateBoundingEntity();\n\t\t\tthis.pUpdateBoundingEntity();\n\t\t}\n\n\t\treturn this._pBoundingEntity;\n\t}\n\n\tpublic nullify()\n\t{\n\t\tthis._aabb.x = this._aabb.y = this._aabb.z = 0;\n\t\tthis._aabb.width = this._aabb.height = this._aabb.depth = 0;\n\t\tthis._pAabbPointsDirty = true;\n\n\t\tif (this._pBoundingEntity)\n\t\t\tthis.pUpdateBoundingEntity();\n\t}\n\n\tpublic disposeRenderable()\n\t{\n\t\tif (this._pBoundingEntity)\n\t\t\tthis._pBoundingEntity.dispose();\n\n\t\tthis._pBoundingEntity = null;\n\t}\n\n\tpublic fromVertices(vertices:Array)\n\t{\n\t\tvar i:number;\n\t\tvar len:number = vertices.length;\n\t\tvar minX:number, minY:number, minZ:number;\n\t\tvar maxX:number, maxY:number, maxZ:number;\n\n\t\tif (len == 0) {\n\t\t\tthis.nullify();\n\t\t\treturn;\n\t\t}\n\n\t\tvar v:number;\n\n\t\tminX = maxX = vertices[i++];\n\t\tminY = maxY = vertices[i++];\n\t\tminZ = maxZ = vertices[i++];\n\n\t\twhile (i < len) {\n\t\t\tv = vertices[i++];\n\t\t\tif (v < minX)\n\t\t\t\tminX = v; else if (v > maxX)\n\t\t\t\tmaxX = v;\n\t\t\tv = vertices[i++];\n\t\t\tif (v < minY)\n\t\t\t\tminY = v; else if (v > maxY)\n\t\t\t\tmaxY = v;\n\t\t\tv = vertices[i++];\n\t\t\tif (v < minZ)\n\t\t\t\tminZ = v; else if (v > maxZ)\n\t\t\t\tmaxZ = v;\n\t\t}\n\n\t\tthis.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ);\n\t}\n\n\t/**\n\t * Updates the bounds to fit a Geometry object.\n\t *\n\t * @param geometry The Geometry object to be bounded.\n\t */\n\tpublic fromGeometry(geometry:Geometry):void\n\t{\n\t\tvar i:number, j:number, p:number;\n\t\tvar subGeoms:Array = geometry.subGeometries;\n\t\tvar subGeom:SubGeometryBase;\n\t\tvar boundingPositions:Array;\n\t\tvar numSubGeoms:number = subGeoms.length;\n\t\tvar minX:number, minY:number, minZ:number;\n\t\tvar maxX:number, maxY:number, maxZ:number;\n\n\t\tif (numSubGeoms > 0) {\n\t\t\ti = 0;\n\t\t\tsubGeom = subGeoms[0];\n\t\t\tboundingPositions = subGeom.getBoundingPositions();\n\t\t\tminX = maxX = boundingPositions[i];\n\t\t\tminY = maxY = boundingPositions[i + 1];\n\t\t\tminZ = maxZ = boundingPositions[i + 2];\n\n\t\t\tj = numSubGeoms;\n\t\t\twhile (j--) {\n\t\t\t\tsubGeom = subGeoms[j];\n\t\t\t\tboundingPositions = subGeom.getBoundingPositions();\n\t\t\t\ti = boundingPositions.length;\n\t\t\t\twhile (i--) {\n\t\t\t\t\tp = boundingPositions[i];\n\t\t\t\t\tif (p < minX)\n\t\t\t\t\t\tminX = p;\n\t\t\t\t\telse if (p > maxX)\n\t\t\t\t\t\tmaxX = p;\n\n\t\t\t\t\tp = boundingPositions[i + 1];\n\n\t\t\t\t\tif (p < minY)\n\t\t\t\t\t\tminY = p;\n\t\t\t\t\telse if (p > maxY)\n\t\t\t\t\t\tmaxY = p;\n\n\t\t\t\t\tp = boundingPositions[i + 2];\n\n\t\t\t\t\tif (p < minZ)\n\t\t\t\t\t\tminZ = p;\n\t\t\t\t\telse if (p > maxZ)\n\t\t\t\t\t\tmaxZ = p;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ);\n\t\t} else {\n\t\t\tthis.fromExtremes(0, 0, 0, 0, 0, 0);\n\t\t}\n\t}\n\n\tpublic fromSphere(center:Vector3D, radius:number)\n\t{\n\t\tthis.fromExtremes(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius);\n\t}\n\n\tpublic fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number)\n\t{\n\t\tthis._aabb.x = minX;\n\t\tthis._aabb.y = maxY;\n\t\tthis._aabb.z = minZ;\n\t\tthis._aabb.width = maxX - minX;\n\t\tthis._aabb.height = maxY - minY;\n\t\tthis._aabb.depth = maxZ - minZ;\n\t\tthis._pAabbPointsDirty = true;\n\n\t\tif (this._pBoundingEntity)\n\t\t\tthis.pUpdateBoundingEntity();\n\t}\n\n\tpublic isInFrustum(planes:Array, numPlanes:number):boolean\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic overlaps(bounds:BoundingVolumeBase):boolean\n\t{\n\t\treturn this._aabb.intersects(bounds.aabb);\n\t}\n\n\tpublic clone():BoundingVolumeBase\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number\n\t{\n\t\treturn -1;\n\t}\n\n\tpublic containsPoint(position:Vector3D):boolean\n\t{\n\t\treturn false;\n\t}\n\n\tpublic pUpdateAABBPoints()\n\t{\n\t\tvar minX:number = this._aabb.x;\n\t\tvar minY:number = this._aabb.y - this._aabb.height;\n\t\tvar minZ:number = this._aabb.z;\n\t\tvar maxX:number = this._aabb.x + this._aabb.width;\n\t\tvar maxY:number = this._aabb.y;\n\t\tvar maxZ:number = this._aabb.z + this._aabb.depth;\n\n\t\tthis._pAabbPoints[0] = minX;\n\t\tthis._pAabbPoints[1] = minY;\n\t\tthis._pAabbPoints[2] = minZ;\n\t\tthis._pAabbPoints[3] = maxX;\n\t\tthis._pAabbPoints[4] = minY;\n\t\tthis._pAabbPoints[5] = minZ;\n\t\tthis._pAabbPoints[6] = minX;\n\t\tthis._pAabbPoints[7] = maxY;\n\t\tthis._pAabbPoints[8] = minZ;\n\t\tthis._pAabbPoints[9] = maxX;\n\t\tthis._pAabbPoints[10] = maxY;\n\t\tthis._pAabbPoints[11] = minZ;\n\t\tthis._pAabbPoints[12] = minX;\n\t\tthis._pAabbPoints[13] = minY;\n\t\tthis._pAabbPoints[14] = maxZ;\n\t\tthis._pAabbPoints[15] = maxX;\n\t\tthis._pAabbPoints[16] = minY;\n\t\tthis._pAabbPoints[17] = maxZ;\n\t\tthis._pAabbPoints[18] = minX;\n\t\tthis._pAabbPoints[19] = maxY;\n\t\tthis._pAabbPoints[20] = maxZ;\n\t\tthis._pAabbPoints[21] = maxX;\n\t\tthis._pAabbPoints[22] = maxY;\n\t\tthis._pAabbPoints[23] = maxZ;\n\t\tthis._pAabbPointsDirty = false;\n\t}\n\n\tpublic pUpdateBoundingEntity()\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic pCreateBoundingEntity():IEntity\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic classifyToPlane(plane:Plane3D):number\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n}\n\nexport = BoundingVolumeBase;", + "import BoundingVolumeBase\t\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport PlaneClassification\t\t\t= require(\"awayjs-core/lib/core/geom/PlaneClassification\");\nimport Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\nclass NullBounds extends BoundingVolumeBase\n{\n\tprivate _alwaysIn:boolean;\n\n\tconstructor(alwaysIn:boolean = true)\n\t{\n\t\tsuper();\n\n\t\tthis._alwaysIn = alwaysIn;\n\n\t\tthis._aabb.width = this._aabb.height = this._aabb.depth = Number.POSITIVE_INFINITY;\n\t\tthis._aabb.x = this._aabb.y = this._aabb.z = this._alwaysIn? Number.NEGATIVE_INFINITY/2 : Number.POSITIVE_INFINITY;\n\t}\n\n\t//@override\n\tpublic clone():BoundingVolumeBase\n\t{\n\t\treturn new NullBounds(this._alwaysIn);\n\t}\n\n\t//@override\n\tpublic pCreateBoundingEntity():IEntity\n\t{\n\t\t//return this._renderable || new away.primitives.WireframeSphere( 100, 16, 12, 0xffffff, 0.5 );\n\t\treturn null;\n\t}\n\n\t//@override\n\tpublic isInFrustum(planes:Array, numPlanes:number):boolean\n\t{\n\t\treturn this._alwaysIn;\n\t}\n\n//\t\t//@override\n//\t\tpublic fromGeometry(geometry:away.base.Geometry)\n//\t\t{\n//\t\t}\n\n\t//@override\n\tpublic fromSphere(center:Vector3D, radius:number)\n\t{\n\t}\n\n\t//@override\n\tpublic fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number)\n\t{\n\t}\n\n\tpublic classifyToPlane(plane:Plane3D):number\n\t{\n\t\treturn PlaneClassification.INTERSECT;\n\t}\n\n\t//@override\n\tpublic transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D)\n\t{\n\t\tthis._alwaysIn = ( bounds)._alwaysIn;\n\t}\n}\n\nexport = NullBounds;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Point\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport Partition\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/Partition\");\nimport AssetType\t\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport IAsset\t\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport ArgumentError\t\t\t\t= require(\"awayjs-core/lib/errors/ArgumentError\");\nimport Error\t\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport RangeError\t\t\t\t\t= require(\"awayjs-core/lib/errors/RangeError\");\n\n/**\n * The DisplayObjectContainer class is the base class for all objects that can\n * serve as display object containers on the display list. The display list\n * manages all objects displayed in the Flash runtimes. Use the\n * DisplayObjectContainer class to arrange the display objects in the display\n * list. Each DisplayObjectContainer object has its own child list for\n * organizing the z-order of the objects. The z-order is the front-to-back\n * order that determines which object is drawn in front, which is behind, and\n * so on.\n *\n *

DisplayObject is an abstract base class; therefore, you cannot call\n * DisplayObject directly. Invoking new DisplayObject() throws an\n * ArgumentError exception.

\n * The DisplayObjectContainer class is an abstract base class for all objects\n * that can contain child objects. It cannot be instantiated directly; calling\n * the new DisplayObjectContainer() constructor throws an\n * ArgumentError exception.\n *\n *

For more information, see the \"Display Programming\" chapter of the\n * ActionScript 3.0 Developer's Guide.

\n */\nclass DisplayObjectContainer extends DisplayObject implements IAsset\n{\n\tprivate _mouseChildren:boolean = true;\n\tprivate _children:Array = new Array();\n\tpublic _iIsRoot:boolean;\n\n\t/**\n\t *\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.CONTAINER;\n\t}\n\n\t/**\n\t * Determines whether or not the children of the object are mouse, or user\n\t * input device, enabled. If an object is enabled, a user can interact with\n\t * it by using a mouse or user input device. The default is\n\t * true.\n\t *\n\t *

This property is useful when you create a button with an instance of\n\t * the Sprite class(instead of using the SimpleButton class). When you use a\n\t * Sprite instance to create a button, you can choose to decorate the button\n\t * by using the addChild() method to add additional Sprite\n\t * instances. This process can cause unexpected behavior with mouse events\n\t * because the Sprite instances you add as children can become the target\n\t * object of a mouse event when you expect the parent instance to be the\n\t * target object. To ensure that the parent instance serves as the target\n\t * objects for mouse events, you can set the mouseChildren\n\t * property of the parent instance to false.

\n\t *\n\t *

No event is dispatched by setting this property. You must use the\n\t * addEventListener() method to create interactive\n\t * functionality.

\n\t */\n\tpublic get mouseChildren():boolean\n\t{\n\t\treturn this._mouseChildren;\n\t}\n\n\tpublic set mouseChildren(value:boolean)\n\t{\n\t\tif (this._mouseChildren == value)\n\t\t\treturn;\n\n\t\tthis._mouseChildren = value;\n\n\t\tthis._pUpdateImplicitMouseEnabled(this._pParent? this._pParent.mouseChildren : true);\n\t}\n\n\t/**\n\t * Returns the number of children of this object.\n\t */\n\tpublic get numChildren():number /*int*/\n\t{\n\t\treturn this._children.length;\n\t}\n\n\t/**\n\t * Determines whether the children of the object are tab enabled. Enables or\n\t * disables tabbing for the children of the object. The default is\n\t * true.\n\t *\n\t *

Note: Do not use the tabChildren property with\n\t * Flex. Instead, use the\n\t * mx.core.UIComponent.hasFocusableChildren property.

\n\t *\n\t * @throws IllegalOperationError Calling this property of the Stage object\n\t * throws an exception. The Stage object does\n\t * not implement this property.\n\t */\n\tpublic tabChildren:boolean;\n\n\t/**\n\t * Calling the new DisplayObjectContainer() constructor throws\n\t * an ArgumentError exception. You can, however, call\n\t * constructors for the following subclasses of DisplayObjectContainer:\n\t *
    \n\t *
  • new Loader()
  • \n\t *
  • new Sprite()
  • \n\t *
  • new MovieClip()
  • \n\t *
\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t * Adds a child DisplayObject instance to this DisplayObjectContainer\n\t * instance. The child is added to the front(top) of all other children in\n\t * this DisplayObjectContainer instance.(To add a child to a specific index\n\t * position, use the addChildAt() method.)\n\t *\n\t *

If you add a child object that already has a different display object\n\t * container as a parent, the object is removed from the child list of the\n\t * other display object container.

\n\t *\n\t *

Note: The command stage.addChild() can cause\n\t * problems with a published SWF file, including security problems and\n\t * conflicts with other loaded SWF files. There is only one Stage within a\n\t * Flash runtime instance, no matter how many SWF files you load into the\n\t * runtime. So, generally, objects should not be added to the Stage,\n\t * directly, at all. The only object the Stage should contain is the root\n\t * object. Create a DisplayObjectContainer to contain all of the items on the\n\t * display list. Then, if necessary, add that DisplayObjectContainer instance\n\t * to the Stage.

\n\t *\n\t * @param child The DisplayObject instance to add as a child of this\n\t * DisplayObjectContainer instance.\n\t * @return The DisplayObject instance that you pass in the child\n\t * parameter.\n\t * @throws ArgumentError Throws if the child is the same as the parent. Also\n\t * throws if the caller is a child(or grandchild etc.)\n\t * of the child being added.\n\t * @event added Dispatched when a display object is added to the display\n\t * list.\n\t */\n\tpublic addChild(child:DisplayObject):DisplayObject\n\t{\n\t\tif (child == null)\n\t\t\tthrow new Error(\"Parameter child cannot be null.\");\n\n\t\t//if child already has a parent, remove it.\n\t\tif (child._pParent)\n\t\t\tchild._pParent.removeChildInternal(child);\n\n\t\tchild.iSetParent(this);\n\n\t\tthis._children.push(child);\n\n\t\treturn child;\n\t}\n\n\n\t/**\n\t * Adds a child DisplayObject instance to this DisplayObjectContainer\n\t * instance. The child is added at the index position specified. An index of\n\t * 0 represents the back(bottom) of the display list for this\n\t * DisplayObjectContainer object.\n\t *\n\t *

For example, the following example shows three display objects, labeled\n\t * a, b, and c, at index positions 0, 2, and 1, respectively:

\n\t *\n\t *

If you add a child object that already has a different display object\n\t * container as a parent, the object is removed from the child list of the\n\t * other display object container.

\n\t *\n\t * @param child The DisplayObject instance to add as a child of this\n\t * DisplayObjectContainer instance.\n\t * @param index The index position to which the child is added. If you\n\t * specify a currently occupied index position, the child object\n\t * that exists at that position and all higher positions are\n\t * moved up one position in the child list.\n\t * @return The DisplayObject instance that you pass in the child\n\t * parameter.\n\t * @throws ArgumentError Throws if the child is the same as the parent. Also\n\t * throws if the caller is a child(or grandchild etc.)\n\t * of the child being added.\n\t * @throws RangeError Throws if the index position does not exist in the\n\t * child list.\n\t * @event added Dispatched when a display object is added to the display\n\t * list.\n\t */\n\tpublic addChildAt(child:DisplayObject, index:number /*int*/):DisplayObject\n\t{\n\t\treturn child;\n\t}\n\n\tpublic addChildren(...childarray:Array)\n\t{\n\t\tvar len:number = childarray.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis.addChild(childarray[i]);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic clone():DisplayObject\n\t{\n\t\tvar clone:DisplayObjectContainer = new DisplayObjectContainer();\n\t\tclone.pivot = this.pivot;\n\t\tclone._iMatrix3D = this._iMatrix3D;\n\t\tclone.partition = this.partition;\n\t\tclone.name = name;\n\n\t\tvar len:number = this._children.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tclone.addChild(this._children[i].clone());\n\n\t\t// todo: implement for all subtypes\n\t\treturn clone;\n\t}\n\n\t/**\n\t * Determines whether the specified display object is a child of the\n\t * DisplayObjectContainer instance or the instance itself. The search\n\t * includes the entire display list including this DisplayObjectContainer\n\t * instance. Grandchildren, great-grandchildren, and so on each return\n\t * true.\n\t *\n\t * @param child The child object to test.\n\t * @return true if the child object is a child of\n\t * the DisplayObjectContainer or the container itself; otherwise\n\t * false.\n\t */\n\tpublic contains(child:DisplayObject):boolean\n\t{\n\t\treturn this._children.indexOf(child) >= 0;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic disposeWithChildren()\n\t{\n\t\tthis.dispose();\n\n\t\twhile (this.numChildren > 0)\n\t\t\tthis.getChildAt(0).dispose();\n\t}\n\n\t/**\n\t * Returns the child display object instance that exists at the specified\n\t * index.\n\t *\n\t * @param index The index position of the child object.\n\t * @return The child display object at the specified index position.\n\t * @throws RangeError Throws if the index does not exist in the child\n\t * list.\n\t */\n\tpublic getChildAt(index:number /*int*/):DisplayObject\n\t{\n\t\tvar child:DisplayObject = this._children[index];\n\n\t\tif (child == null)\n\t\t\tthrow new RangeError(\"Index does not exist in the child list of the caller\");\n\n\t\treturn child;\n\t}\n\n\t/**\n\t * Returns the child display object that exists with the specified name. If\n\t * more that one child display object has the specified name, the method\n\t * returns the first object in the child list.\n\t *\n\t *

The getChildAt() method is faster than the\n\t * getChildByName() method. The getChildAt() method\n\t * accesses a child from a cached array, whereas the\n\t * getChildByName() method has to traverse a linked list to\n\t * access a child.

\n\t *\n\t * @param name The name of the child to return.\n\t * @return The child display object with the specified name.\n\t */\n\tpublic getChildByName(name:string):DisplayObject\n\t{\n\t\tvar len:number = this._children.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tif (this._children[i].name == name)\n\t\t\t\treturn this._children[i];\n\n\t\treturn null;\n\t}\n\n\t/**\n\t * Returns the index position of a child DisplayObject instance.\n\t *\n\t * @param child The DisplayObject instance to identify.\n\t * @return The index position of the child display object to identify.\n\t * @throws ArgumentError Throws if the child parameter is not a child of this\n\t * object.\n\t */\n\tpublic getChildIndex(child:DisplayObject):number /*int*/\n\t{\n\t\tvar childIndex:number = this._children.indexOf(child);\n\n\t\tif (childIndex == -1)\n\t\t\tthrow new ArgumentError(\"Child parameter is not a child of the caller\");\n\n\t\treturn childIndex;\n\t}\n\n\t/**\n\t * Returns an array of objects that lie under the specified point and are\n\t * children(or grandchildren, and so on) of this DisplayObjectContainer\n\t * instance. Any child objects that are inaccessible for security reasons are\n\t * omitted from the returned array. To determine whether this security\n\t * restriction affects the returned array, call the\n\t * areInaccessibleObjectsUnderPoint() method.\n\t *\n\t *

The point parameter is in the coordinate space of the\n\t * Stage, which may differ from the coordinate space of the display object\n\t * container(unless the display object container is the Stage). You can use\n\t * the globalToLocal() and the localToGlobal()\n\t * methods to convert points between these coordinate spaces.

\n\t *\n\t * @param point The point under which to look.\n\t * @return An array of objects that lie under the specified point and are\n\t * children(or grandchildren, and so on) of this\n\t * DisplayObjectContainer instance.\n\t */\n\tpublic getObjectsUnderPoint(point:Point):Array\n\t{\n\t\treturn new Array();\n\t}\n\n\t/**\n\t * Removes the specified child DisplayObject instance from the\n\t * child list of the DisplayObjectContainer instance. The parent\n\t * property of the removed child is set to null , and the object\n\t * is garbage collected if no other references to the child exist. The index\n\t * positions of any display objects above the child in the\n\t * DisplayObjectContainer are decreased by 1.\n\t *\n\t *

The garbage collector reallocates unused memory space. When a variable\n\t * or object is no longer actively referenced or stored somewhere, the\n\t * garbage collector sweeps through and wipes out the memory space it used to\n\t * occupy if no other references to it exist.

\n\t *\n\t * @param child The DisplayObject instance to remove.\n\t * @return The DisplayObject instance that you pass in the child\n\t * parameter.\n\t * @throws ArgumentError Throws if the child parameter is not a child of this\n\t * object.\n\t */\n\tpublic removeChild(child:DisplayObject):DisplayObject\n\t{\n\t\tif (child == null)\n\t\t\tthrow new Error(\"Parameter child cannot be null\");\n\n\t\tthis.removeChildInternal(child);\n\n\t\tchild.iSetParent(null);\n\n\t\treturn child;\n\t}\n\n\t/**\n\t * Removes a child DisplayObject from the specified index\n\t * position in the child list of the DisplayObjectContainer. The\n\t * parent property of the removed child is set to\n\t * null, and the object is garbage collected if no other\n\t * references to the child exist. The index positions of any display objects\n\t * above the child in the DisplayObjectContainer are decreased by 1.\n\t *\n\t *

The garbage collector reallocates unused memory space. When a variable\n\t * or object is no longer actively referenced or stored somewhere, the\n\t * garbage collector sweeps through and wipes out the memory space it used to\n\t * occupy if no other references to it exist.

\n\t *\n\t * @param index The child index of the DisplayObject to remove.\n\t * @return The DisplayObject instance that was removed.\n\t * @throws RangeError Throws if the index does not exist in the child\n\t * list.\n\t * @throws SecurityError This child display object belongs to a sandbox to\n\t * which the calling object does not have access. You\n\t * can avoid this situation by having the child movie\n\t * call the Security.allowDomain() method.\n\t */\n\tpublic removeChildAt(index:number /*int*/):DisplayObject\n\t{\n\t\treturn this.removeChild(this._children[index]);\n\t}\n\n\t/**\n\t * Removes all child DisplayObject instances from the child list\n\t * of the DisplayObjectContainer instance. The parent property\n\t * of the removed children is set to null, and the objects are\n\t * garbage collected if no other references to the children exist.\n\t *\n\t * The garbage collector reallocates unused memory space. When a variable or\n\t * object is no longer actively referenced or stored somewhere, the garbage\n\t * collector sweeps through and wipes out the memory space it used to occupy\n\t * if no other references to it exist.\n\t *\n\t * @param beginIndex The beginning position. A value smaller than 0 throws a RangeError.\n\t * @param endIndex The ending position. A value smaller than 0 throws a RangeError.\n\t * @throws RangeError Throws if the beginIndex or endIndex positions do\n\t * not exist in the child list.\n\t */\n\tpublic removeChildren(beginIndex:number /*int*/ = 0, endIndex:number /*int*/ = 2147483647)\n\t{\n\t\tif (beginIndex < 0)\n\t\t\tthrow new RangeError(\"beginIndex is out of range of the child list\");\n\n\t\tif (endIndex > this._children.length)\n\t\t\tthrow new RangeError(\"endIndex is out of range of the child list\");\n\n\t\tfor(var i:number /*uint*/ = beginIndex; i < endIndex; i++)\n\t\t\tthis.removeChild(this._children[i]);\n\t}\n\n\t/**\n\t * Changes the position of an existing child in the display object container.\n\t * This affects the layering of child objects. For example, the following\n\t * example shows three display objects, labeled a, b, and c, at index\n\t * positions 0, 1, and 2, respectively:\n\t *\n\t *

When you use the setChildIndex() method and specify an\n\t * index position that is already occupied, the only positions that change\n\t * are those in between the display object's former and new position. All\n\t * others will stay the same. If a child is moved to an index LOWER than its\n\t * current index, all children in between will INCREASE by 1 for their index\n\t * reference. If a child is moved to an index HIGHER than its current index,\n\t * all children in between will DECREASE by 1 for their index reference. For\n\t * example, if the display object container in the previous example is named\n\t * container, you can swap the position of the display objects\n\t * labeled a and b by calling the following code:

\n\t *\n\t *

This code results in the following arrangement of objects:

\n\t *\n\t * @param child The child DisplayObject instance for which you want to change\n\t * the index number.\n\t * @param index The resulting index number for the child display\n\t * object.\n\t * @throws ArgumentError Throws if the child parameter is not a child of this\n\t * object.\n\t * @throws RangeError Throws if the index does not exist in the child\n\t * list.\n\t */\n\tpublic setChildIndex(child:DisplayObject, index:number /*int*/)\n\t{\n\t\t//TODO\n\t}\n\n\t/**\n\t * Swaps the z-order (front-to-back order) of the two specified child\n\t * objects. All other child objects in the display object container remain in\n\t * the same index positions.\n\t *\n\t * @param child1 The first child object.\n\t * @param child2 The second child object.\n\t * @throws ArgumentError Throws if either child parameter is not a child of\n\t * this object.\n\t */\n\tpublic swapChildren(child1:DisplayObject, child2:DisplayObject)\n\t{\n\t\t//TODO\n\t}\n\n\t/**\n\t * Swaps the z-order(front-to-back order) of the child objects at the two\n\t * specified index positions in the child list. All other child objects in\n\t * the display object container remain in the same index positions.\n\t *\n\t * @param index1 The index position of the first child object.\n\t * @param index2 The index position of the second child object.\n\t * @throws RangeError If either index does not exist in the child list.\n\t */\n\tpublic swapChildrenAt(index1:number /*int*/, index2:number /*int*/)\n\t{\n\t\t//TODO\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pInvalidateSceneTransform()\n\t{\n\t\tsuper.pInvalidateSceneTransform();\n\n\t\tvar len:number = this._children.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tthis._children[i].pInvalidateSceneTransform();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateScene(value:Scene)\n\t{\n\t\tsuper._pUpdateScene(value);\n\n\t\tvar len:number = this._children.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tthis._children[i]._pUpdateScene(value);\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateImplicitMouseEnabled(value:boolean)\n\t{\n\t\tsuper._pUpdateImplicitMouseEnabled(value);\n\n\t\tvar len:number = this._children.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tthis._children[i]._pUpdateImplicitMouseEnabled(this._mouseChildren);\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateImplicitVisibility(value:boolean)\n\t{\n\t\tsuper._pUpdateImplicitVisibility(value);\n\n\t\tvar len:number = this._children.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tthis._children[i]._pUpdateImplicitVisibility(this._pImplicitVisibility);\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateImplicitPartition(value:Partition)\n\t{\n\t\tsuper._pUpdateImplicitPartition(value);\n\n\t\tvar len:number = this._children.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tthis._children[i]._pUpdateImplicitPartition(this._pImplicitPartition);\n\t}\n\n\t/**\n\t * @private\n\t *\n\t * @param child\n\t */\n\tprivate removeChildInternal(child:DisplayObject):DisplayObject\n\t{\n\t\tthis._children.splice(this.getChildIndex(child), 1);\n\n\t\treturn child;\n\t}\n}\n\nexport = DisplayObjectContainer;", + "import DisplayObjectContainer\t\t= require(\"awayjs-core/lib/containers/DisplayObjectContainer\");\nimport DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport LoaderInfo\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LoaderInfo\");\nimport AssetLibraryBundle\t\t\t= require(\"awayjs-core/lib/core/library/AssetLibraryBundle\");\nimport AssetLoader\t\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoader\");\nimport AssetLoaderContext\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoaderContext\");\nimport AssetLoaderToken\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoaderToken\");\nimport URLRequest\t\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequest\");\nimport AssetEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/AssetEvent\");\nimport EventDispatcher\t\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport IOErrorEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/IOErrorEvent\");\nimport LoaderEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/LoaderEvent\");\nimport ParserEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/ParserEvent\");\nimport ParserBase\t\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserBase\");\n\n/**\n * The Loader class is used to load SWF files or image(JPG, PNG, or GIF)\n * files. Use the load() method to initiate loading. The loaded\n * display object is added as a child of the Loader object.\n *\n *

Use the URLLoader class to load text or binary data.

\n *\n *

The Loader class overrides the following methods that it inherits,\n * because a Loader object can only have one child display object - the\n * display object that it loads. Calling the following methods throws an\n * exception: addChild(), addChildAt(),\n * removeChild(), removeChildAt(), and\n * setChildIndex(). To remove a loaded display object, you must\n * remove the Loader object from its parent DisplayObjectContainer\n * child array.

\n *\n *

Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes\n * are not used in ActionScript 3.0. The Loader and URLLoader classes replace\n * them.

\n *\n *

When you use the Loader class, consider the Flash Player and Adobe AIR\n * security model:

\n *\n *
    \n *
  • You can load content from any accessible source.
  • \n *
  • Loading is not allowed if the calling SWF file is in a network\n * sandbox and the file to be loaded is local.
  • \n *
  • If the loaded content is a SWF file written with ActionScript 3.0, it\n * cannot be cross-scripted by a SWF file in another security sandbox unless\n * that cross-scripting arrangement was approved through a call to the\n * System.allowDomain() or the\n * System.allowInsecureDomain() method in the loaded content\n * file.
  • \n *
  • If the loaded content is an AVM1 SWF file(written using ActionScript\n * 1.0 or 2.0), it cannot be cross-scripted by an AVM2 SWF file(written using\n * ActionScript 3.0). However, you can communicate between the two SWF files\n * by using the LocalConnection class.
  • \n *
  • If the loaded content is an image, its data cannot be accessed by a\n * SWF file outside of the security sandbox, unless the domain of that SWF\n * file was included in a URL policy file at the origin domain of the\n * image.
  • \n *
  • Movie clips in the local-with-file-system sandbox cannot script movie\n * clips in the local-with-networking sandbox, and the reverse is also\n * prevented.
  • \n *
  • You cannot connect to commonly reserved ports. For a complete list of\n * blocked ports, see \"Restricting Networking APIs\" in the ActionScript 3.0\n * Developer's Guide.
  • \n *
\n *\n *

However, in AIR, content in the application security\n * sandbox(content installed with the AIR application) are not restricted by\n * these security limitations.

\n *\n *

For more information related to security, see the Flash Player Developer\n * Center Topic: Security.

\n *\n *

When loading a SWF file from an untrusted source(such as a domain other\n * than that of the Loader object's root SWF file), you may want to define a\n * mask for the Loader object, to prevent the loaded content(which is a child\n * of the Loader object) from drawing to portions of the Stage outside of that\n * mask, as shown in the following code:

\n */\nclass Loader extends DisplayObjectContainer\n{\n\t/**\n\t * Dispatched when any asset finishes parsing. Also see specific events for each\n\t * individual asset type (meshes, materials et c.)\n\t *\n\t * @eventType AssetEvent\n\t */\n\t//[Event(name=\"assetComplete\", type=\"AssetEvent\")]\n\n\n\t/**\n\t * Dispatched when a full resource (including dependencies) finishes loading.\n\t *\n\t * @eventType LoaderEvent\n\t */\n\t//[Event(name=\"resourceComplete\", type=\"LoaderEvent\")]\n\n\tprivate _loadingSessions:Array;\n\tprivate _useAssetLib:boolean;\n\tprivate _assetLibId:string;\n\tprivate _onResourceCompleteDelegate:Function;\n\tprivate _onAssetCompleteDelegate:Function;\n\n\tprivate _content:DisplayObject;\n\tprivate _contentLoaderInfo:LoaderInfo;\n\n\t/**\n\t * Contains the root display object of the SWF file or image(JPG, PNG, or\n\t * GIF) file that was loaded by using the load() or\n\t * loadBytes() methods.\n\t *\n\t * @throws SecurityError The loaded SWF file or image file belongs to a\n\t * security sandbox to which you do not have access.\n\t * For a loaded SWF file, you can avoid this situation\n\t * by having the file call the\n\t * Security.allowDomain() method or by\n\t * having the loading file specify a\n\t * loaderContext parameter with its\n\t * securityDomain property set to\n\t * SecurityDomain.currentDomain when you\n\t * call the load() or\n\t * loadBytes() method.\n\t */\n\tpublic get content():DisplayObject\n\t{\n\t\treturn this._content;\n\t}\n\n\t/**\n\t * Returns a LoaderInfo object corresponding to the object being loaded.\n\t * LoaderInfo objects are shared between the Loader object and the loaded\n\t * content object. The LoaderInfo object supplies loading progress\n\t * information and statistics about the loaded file.\n\t *\n\t *

Events related to the load are dispatched by the LoaderInfo object\n\t * referenced by the contentLoaderInfo property of the Loader\n\t * object. The contentLoaderInfo property is set to a valid\n\t * LoaderInfo object, even before the content is loaded, so that you can add\n\t * event listeners to the object prior to the load.

\n\t *\n\t *

To detect uncaught errors that happen in a loaded SWF, use the\n\t * Loader.uncaughtErrorEvents property, not the\n\t * Loader.contentLoaderInfo.uncaughtErrorEvents property.

\n\t */\n\tpublic get contentLoaderInfo():LoaderInfo\n\t{\n\t\treturn this._contentLoaderInfo;\n\t}\n\n\t/**\n\t * Creates a Loader object that you can use to load files, such as SWF, JPEG,\n\t * GIF, or PNG files. Call the load() method to load the asset\n\t * as a child of the Loader instance. You can then add the Loader object to\n\t * the display list(for instance, by using the addChild()\n\t * method of a DisplayObjectContainer instance). The asset appears on the\n\t * Stage as it loads.\n\t *\n\t *

You can also use a Loader instance \"offlist,\" that is without adding it\n\t * to a display object container on the display list. In this mode, the\n\t * Loader instance might be used to load a SWF file that contains additional\n\t * modules of an application.

\n\t *\n\t *

To detect when the SWF file is finished loading, you can use the events\n\t * of the LoaderInfo object associated with the\n\t * contentLoaderInfo property of the Loader object. At that\n\t * point, the code in the module SWF file can be executed to initialize and\n\t * start the module. In the offlist mode, a Loader instance might also be\n\t * used to load a SWF file that contains components or media assets. Again,\n\t * you can use the LoaderInfo object event notifications to detect when the\n\t * components are finished loading. At that point, the application can start\n\t * using the components and media assets in the library of the SWF file by\n\t * instantiating the ActionScript 3.0 classes that represent those components\n\t * and assets.

\n\t *\n\t *

To determine the status of a Loader object, monitor the following\n\t * events that the LoaderInfo object associated with the\n\t * contentLoaderInfo property of the Loader object:

\n\t *\n\t *
    \n\t *
  • The open event is dispatched when loading begins.
  • \n\t *
  • The ioError or securityError event is\n\t * dispatched if the file cannot be loaded or if an error occured during the\n\t * load process.
  • \n\t *
  • The progress event fires continuously while the file is\n\t * being loaded.
  • \n\t *
  • The complete event is dispatched when a file completes\n\t * downloading, but before the loaded movie clip's methods and properties are\n\t * available.
  • \n\t *
  • The init event is dispatched after the properties and\n\t * methods of the loaded SWF file are accessible, so you can begin\n\t * manipulating the loaded SWF file. This event is dispatched before the\n\t * complete handler. In streaming SWF files, the\n\t * init event can occur significantly earlier than the\n\t * complete event. For most purposes, use the init\n\t * handler.
  • \n\t *
\n\t */\n\tconstructor(useAssetLibrary:boolean = true, assetLibraryId:string = null)\n\t{\n\t\tsuper();\n\n\t\tthis._loadingSessions = new Array();\n\t\tthis._useAssetLib = useAssetLibrary;\n\t\tthis._assetLibId = assetLibraryId;\n\n\t\tthis._onResourceCompleteDelegate = (event:LoaderEvent) => this.onResourceComplete(event);\n\t\tthis._onAssetCompleteDelegate = (event:AssetEvent) => this.onAssetComplete(event);\n\t}\n\n\t/**\n\t * Cancels a load() method operation that is currently in\n\t * progress for the Loader instance.\n\t *\n\t */\n\tpublic close()\n\t{\n\t\tif (this._useAssetLib) {\n\t\t\tvar lib:AssetLibraryBundle;\n\t\t\tlib = AssetLibraryBundle.getInstance(this._assetLibId);\n\t\t\tlib.stopAllLoadingSessions();\n\t\t\tthis._loadingSessions = null;\n\t\t\treturn\n\t\t}\n\t\tvar i:number /*int*/;\n\t\tvar length:number /*int*/ = this._loadingSessions.length;\n\t\tfor (i = 0; i < length; i++) {\n\t\t\tthis.removeListeners(this._loadingSessions[i]);\n\t\t\tthis._loadingSessions[i].stop();\n\t\t\tthis._loadingSessions[i] = null;\n\t\t}\n\t\tthis._loadingSessions = null;\n\t}\n\n\t/**\n\t * Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an\n\t * object that is a child of this Loader object. If you load an animated GIF\n\t * file, only the first frame is displayed. As the Loader object can contain\n\t * only a single child, issuing a subsequent load() request\n\t * terminates the previous request, if still pending, and commences a new\n\t * load.\n\t *\n\t *

Note: In AIR 1.5 and Flash Player 10, the maximum size for a\n\t * loaded image is 8,191 pixels in width or height, and the total number of\n\t * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191\n\t * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and\n\t * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height\n\t * and 2,880 pixels in width.

\n\t *\n\t *

A SWF file or image loaded into a Loader object inherits the position,\n\t * rotation, and scale properties of the parent display objects of the Loader\n\t * object.

\n\t *\n\t *

Use the unload() method to remove movies or images loaded\n\t * with this method, or to cancel a load operation that is in progress.

\n\t *\n\t *

You can prevent a SWF file from using this method by setting the\n\t * allowNetworking parameter of the the object and\n\t * embed tags in the HTML page that contains the SWF\n\t * content.

\n\t *\n\t *

When you use this method, consider the Flash Player security model,\n\t * which is described in the Loader class description.

\n\t *\n\t *

In Flash Player 10 and later, if you use a multipart Content-Type(for\n\t * example \"multipart/form-data\") that contains an upload(indicated by a\n\t * \"filename\" parameter in a \"content-disposition\" header within the POST\n\t * body), the POST operation is subject to the security rules applied to\n\t * uploads:

\n\t *\n\t *
    \n\t *
  • The POST operation must be performed in response to a user-initiated\n\t * action, such as a mouse click or key press.
  • \n\t *
  • If the POST operation is cross-domain(the POST target is not on the\n\t * same server as the SWF file that is sending the POST request), the target\n\t * server must provide a URL policy file that permits cross-domain\n\t * access.
  • \n\t *
\n\t *\n\t *

Also, for any multipart Content-Type, the syntax must be valid\n\t * (according to the RFC2046 standard). If the syntax appears to be invalid,\n\t * the POST operation is subject to the security rules applied to\n\t * uploads.

\n\t *\n\t *

For more information related to security, see the Flash Player\n\t * Developer Center Topic: Security.

\n\t *\n\t * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG\n\t * file to be loaded. A relative path must be relative to the\n\t * main SWF file. Absolute URLs must include the protocol\n\t * reference, such as http:// or file:///. Filenames cannot\n\t * include disk drive specifications.\n\t * @param context A LoaderContext object, which has properties that define\n\t * the following:\n\t *
    \n\t *
  • Whether or not to check for the existence of a policy\n\t * file upon loading the object
  • \n\t *
  • The ApplicationDomain for the loaded object
  • \n\t *
  • The SecurityDomain for the loaded object
  • \n\t *
  • The ImageDecodingPolicy for the loaded image\n\t * object
  • \n\t *
\n\t *\n\t *

If the context parameter is not specified\n\t * or refers to a null object, the loaded content remains in\n\t * its own security domain.

\n\t *\n\t *

For complete details, see the description of the\n\t * properties in the LoaderContext\n\t * class.

\n\t * @param ns An optional namespace string under which the file is to be\n\t * loaded, allowing the differentiation of two resources with\n\t * identical assets.\n\t * @param parser An optional parser object for translating the loaded data\n\t * into a usable resource. If not provided, AssetLoader will\n\t * attempt to auto-detect the file type.\n\t * @throws IOError The digest property of the\n\t * request object is not\n\t * null. You should only set the\n\t * digest property of a URLRequest\n\t * object when calling the\n\t * URLLoader.load() method when\n\t * loading a SWZ file(an Adobe platform\n\t * component).\n\t * @throws IllegalOperationError If the requestedContentParent\n\t * property of the context\n\t * parameter is a Loader.\n\t * @throws IllegalOperationError If the LoaderContext.parameters\n\t * parameter is set to non-null and has some\n\t * values which are not Strings.\n\t * @throws SecurityError The value of\n\t * LoaderContext.securityDomain\n\t * must be either null or\n\t * SecurityDomain.currentDomain.\n\t * This reflects the fact that you can only\n\t * place the loaded media in its natural\n\t * security sandbox or your own(the latter\n\t * requires a policy file).\n\t * @throws SecurityError Local SWF files may not set\n\t * LoaderContext.securityDomain to anything\n\t * other than null. It is not\n\t * permitted to import non-local media into a\n\t * local sandbox, or to place other local media\n\t * in anything other than its natural sandbox.\n\t * @throws SecurityError You cannot connect to commonly reserved\n\t * ports. For a complete list of blocked ports,\n\t * see \"Restricting Networking APIs\" in the\n\t * ActionScript 3.0 Developer's Guide.\n\t * @throws SecurityError If the applicationDomain or\n\t * securityDomain properties of\n\t * the context parameter are from\n\t * a disallowed domain.\n\t * @throws SecurityError If a local SWF file is attempting to use the\n\t * securityDomain property of the\n\t * context parameter.\n\t * @event asyncError Dispatched by the contentLoaderInfo\n\t * object if the\n\t * LoaderContext.requestedContentParent\n\t * property has been specified and it is not possible to\n\t * add the loaded content as a child to the specified\n\t * DisplayObjectContainer. This could happen if the\n\t * loaded content is a\n\t * flash.display.AVM1Movie or if the\n\t * addChild() call to the\n\t * requestedContentParent throws an error.\n\t * @event complete Dispatched by the contentLoaderInfo\n\t * object when the file has completed loading. The\n\t * complete event is always dispatched\n\t * after the init event.\n\t * @event httpStatus Dispatched by the contentLoaderInfo\n\t * object when a network request is made over HTTP and\n\t * Flash Player can detect the HTTP status code.\n\t * @event init Dispatched by the contentLoaderInfo\n\t * object when the properties and methods of the loaded\n\t * SWF file are accessible. The init event\n\t * always precedes the complete event.\n\t * @event ioError Dispatched by the contentLoaderInfo\n\t * object when an input or output error occurs that\n\t * causes a load operation to fail.\n\t * @event open Dispatched by the contentLoaderInfo\n\t * object when the loading operation starts.\n\t * @event progress Dispatched by the contentLoaderInfo\n\t * object as data is received while load operation\n\t * progresses.\n\t * @event securityError Dispatched by the contentLoaderInfo\n\t * object if a SWF file in the local-with-filesystem\n\t * sandbox attempts to load content in the\n\t * local-with-networking sandbox, or vice versa.\n\t * @event securityError Dispatched by the contentLoaderInfo\n\t * object if the\n\t * LoaderContext.requestedContentParent\n\t * property has been specified and the security sandbox\n\t * of the\n\t * LoaderContext.requestedContentParent\n\t * does not have access to the loaded SWF.\n\t * @event unload Dispatched by the contentLoaderInfo\n\t * object when a loaded object is removed.\n\t */\n\tpublic load(request:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken\n\t{\n\t\tvar token:AssetLoaderToken;\n\n\t\tif (this._useAssetLib) {\n\t\t\tvar lib:AssetLibraryBundle;\n\t\t\tlib = AssetLibraryBundle.getInstance(this._assetLibId);\n\t\t\ttoken = lib.load(request, context, ns, parser);\n\t\t} else {\n\t\t\tvar loader:AssetLoader = new AssetLoader();\n\t\t\tthis._loadingSessions.push(loader);\n\t\t\ttoken = loader.load(request, context, ns, parser);\n\t\t}\n\n\t\ttoken.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate);\n\t\ttoken.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);\n\n\t\t// Error are handled separately (see documentation for addErrorHandler)\n\t\ttoken._iLoader._iAddErrorHandler(this.onLoadError);\n\t\ttoken._iLoader._iAddParseErrorHandler(this.onParseError);\n\n\t\treturn token;\n\t}\n\n\t/**\n\t * Loads from binary data stored in a ByteArray object.\n\t *\n\t *

The loadBytes() method is asynchronous. You must wait for\n\t * the \"init\" event before accessing the properties of a loaded object.

\n\t *\n\t *

When you use this method, consider the Flash Player security model,\n\t * which is described in the Loader class description.

\n\t *\n\t * @param bytes A ByteArray object. The contents of the ByteArray can be\n\t * any of the file formats supported by the Loader class: SWF,\n\t * GIF, JPEG, or PNG.\n\t * @param context A LoaderContext object. Only the\n\t * applicationDomain property of the\n\t * LoaderContext object applies; the\n\t * checkPolicyFile and\n\t * securityDomain properties of the LoaderContext\n\t * object do not apply.\n\t *\n\t *

If the context parameter is not specified\n\t * or refers to a null object, the content is loaded into the\n\t * current security domain - a process referred to as \"import\n\t * loading\" in Flash Player security documentation.\n\t * Specifically, if the loading SWF file trusts the remote SWF\n\t * by incorporating the remote SWF into its code, then the\n\t * loading SWF can import it directly into its own security\n\t * domain.

\n\t *\n\t *

For more information related to security, see the Flash\n\t * Player Developer Center Topic: Security.

\n\t * @throws ArgumentError If the length property of the\n\t * ByteArray object is not greater than 0.\n\t * @throws IllegalOperationError If the checkPolicyFile or\n\t * securityDomain property of the\n\t * context parameter are non-null.\n\t * @throws IllegalOperationError If the requestedContentParent\n\t * property of the context\n\t * parameter is a Loader.\n\t * @throws IllegalOperationError If the LoaderContext.parameters\n\t * parameter is set to non-null and has some\n\t * values which are not Strings.\n\t * @throws SecurityError If the provided\n\t * applicationDomain property of\n\t * the context property is from a\n\t * disallowed domain.\n\t * @throws SecurityError You cannot connect to commonly reserved\n\t * ports. For a complete list of blocked ports,\n\t * see \"Restricting Networking APIs\" in the\n\t * ActionScript 3.0 Developer's Guide.\n\t * @event asyncError Dispatched by the contentLoaderInfo\n\t * object if the\n\t * LoaderContext.requestedContentParent\n\t * property has been specified and it is not possible to\n\t * add the loaded content as a child to the specified\n\t * DisplayObjectContainer. This could happen if the\n\t * loaded content is a\n\t * flash.display.AVM1Movie or if the\n\t * addChild() call to the\n\t * requestedContentParent throws an error.\n\t * @event complete Dispatched by the contentLoaderInfo\n\t * object when the operation is complete. The\n\t * complete event is always dispatched\n\t * after the init event.\n\t * @event init Dispatched by the contentLoaderInfo\n\t * object when the properties and methods of the loaded\n\t * data are accessible. The init event\n\t * always precedes the complete event.\n\t * @event ioError Dispatched by the contentLoaderInfo\n\t * object when the runtime cannot parse the data in the\n\t * byte array.\n\t * @event open Dispatched by the contentLoaderInfo\n\t * object when the operation starts.\n\t * @event progress Dispatched by the contentLoaderInfo\n\t * object as data is transfered in memory.\n\t * @event securityError Dispatched by the contentLoaderInfo\n\t * object if the\n\t * LoaderContext.requestedContentParent\n\t * property has been specified and the security sandbox\n\t * of the\n\t * LoaderContext.requestedContentParent\n\t * does not have access to the loaded SWF.\n\t * @event unload Dispatched by the contentLoaderInfo\n\t * object when a loaded object is removed.\n\t */\n\tpublic loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken\n\t{\n\t\tvar token:AssetLoaderToken;\n\n\t\tif (this._useAssetLib) {\n\t\t\tvar lib:AssetLibraryBundle;\n\t\t\tlib = AssetLibraryBundle.getInstance(this._assetLibId);\n\t\t\ttoken = lib.loadData(data, context, ns, parser);\n\t\t} else {\n\t\t\tvar loader:AssetLoader = new AssetLoader();\n\t\t\tthis._loadingSessions.push(loader);\n\t\t\ttoken = loader.loadData(data, '', context, ns, parser);\n\t\t}\n\n\t\ttoken.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate);\n\t\ttoken.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);\n\n\t\t// Error are handled separately (see documentation for addErrorHandler)\n\t\ttoken._iLoader._iAddErrorHandler(this.onLoadError);\n\t\ttoken._iLoader._iAddParseErrorHandler(this.onParseError);\n\n\t\treturn token;\n\t}\n\n\t/**\n\t * Removes a child of this Loader object that was loaded by using the\n\t * load() method. The property of the associated\n\t * LoaderInfo object is reset to null. The child is not\n\t * necessarily destroyed because other objects might have references to it;\n\t * however, it is no longer a child of the Loader object.\n\t *\n\t *

As a best practice, before you unload a child SWF file, you should\n\t * explicitly close any streams in the child SWF file's objects, such as\n\t * LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise,\n\t * audio in the child SWF file might continue to play, even though the child\n\t * SWF file was unloaded. To close streams in the child SWF file, add an\n\t * event listener to the child that listens for the unload\n\t * event. When the parent calls Loader.unload(), the\n\t * unload event is dispatched to the child. The following code\n\t * shows how you might do this:

\n\t *
 public closeAllStreams(evt:Event) {\n\t * myNetStream.close(); mySound.close(); myNetConnection.close();\n\t * myLocalConnection.close(); }\n\t * myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,\n\t * closeAllStreams);
\n\t *\n\t */\n\tpublic unload()\n\t{\n\t\t//TODO\n\t}\n\n\t/**\n\t * Enables a specific parser.\n\t * When no specific parser is set for a loading/parsing opperation,\n\t * loader3d can autoselect the correct parser to use.\n\t * A parser must have been enabled, to be considered when autoselecting the parser.\n\t *\n\t * @param parserClass The parser class to enable.\n\t * @see away.parsers.Parsers\n\t */\n\tpublic static enableParser(parserClass:Object)\n\t{\n\t\tAssetLoader.enableParser(parserClass);\n\t}\n\n\t/**\n\t * Enables a list of parsers.\n\t * When no specific parser is set for a loading/parsing opperation,\n\t * loader3d can autoselect the correct parser to use.\n\t * A parser must have been enabled, to be considered when autoselecting the parser.\n\t *\n\t * @param parserClasses A Vector of parser classes to enable.\n\t * @see away.parsers.Parsers\n\t */\n\tpublic static enableParsers(parserClasses:Array)\n\t{\n\t\tAssetLoader.enableParsers(parserClasses);\n\t}\n\n\n\tprivate removeListeners(dispatcher:EventDispatcher)\n\t{\n\t\tdispatcher.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate);\n\t\tdispatcher.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);\n\t}\n\n\tprivate onAssetComplete(event:AssetEvent)\n\t{\n\t\tthis.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Called when an error occurs during loading\n\t */\n\tprivate onLoadError(event:LoaderEvent):boolean\n\t{\n\t\tif (this.hasEventListener(IOErrorEvent.IO_ERROR)) {\n\t\t\tthis.dispatchEvent(event);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Called when a an error occurs during parsing\n\t */\n\tprivate onParseError(event:ParserEvent):boolean\n\t{\n\t\tif (this.hasEventListener(ParserEvent.PARSE_ERROR)) {\n\t\t\tthis.dispatchEvent(event);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Called when the resource and all of its dependencies was retrieved.\n\t */\n\tprivate onResourceComplete(event:LoaderEvent)\n\t{\n\t\tvar content:DisplayObject = event.content;\n\n\t\tthis._content = content;\n\n\t\tif (content)\n\t\t\tthis.addChild(content);\n\n\t\tthis.dispatchEvent(event);\n\t}\n}\n\nexport = Loader;", + "import DisplayObjectContainer\t\t= require(\"awayjs-core/lib/containers/DisplayObjectContainer\");\nimport DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport Partition\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/Partition\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport EventDispatcher\t\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport SceneEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/SceneEvent\");\n\nclass Scene extends EventDispatcher\n{\n\tprivate _expandedPartitions:Array = new Array();\n\tprivate _partitions:Array = new Array();\n\n\tpublic _iSceneGraphRoot:DisplayObjectContainer;\n\tpublic _iCollectionMark = 0;\n\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._iSceneGraphRoot = new DisplayObjectContainer();\n\n\t\tthis._iSceneGraphRoot._iSetScene(this);\n\t\tthis._iSceneGraphRoot._iIsRoot = true;\n\t\tthis._iSceneGraphRoot.partition = new Partition(new NodeBase());\n\t}\n\n\tpublic traversePartitions(traverser:ICollector)\n\t{\n\t\tvar i:number = 0;\n\t\tvar len:number = this._partitions.length;\n\n\t\ttraverser.scene = this;\n\n\t\twhile (i < len) {\n\t\t\tthis._iCollectionMark++;\n\t\t\tthis._partitions[i++].traverse(traverser);\n\t\t}\n\t}\n\n\tpublic get partition():Partition\n\t{\n\t\treturn this._iSceneGraphRoot.partition;\n\t}\n\n\tpublic set partition(value:Partition)\n\t{\n\t\tthis._iSceneGraphRoot.partition = value;\n\n\t\tthis.dispatchEvent(new SceneEvent(SceneEvent.PARTITION_CHANGED, this._iSceneGraphRoot));\n\t}\n\n\tpublic contains(child:DisplayObject):boolean\n\t{\n\t\treturn this._iSceneGraphRoot.contains(child);\n\t}\n\n\tpublic addChild(child:DisplayObject):DisplayObject\n\t{\n\t\treturn this._iSceneGraphRoot.addChild(child);\n\t}\n\n\tpublic removeChild(child:DisplayObject)\n\t{\n\t\tthis._iSceneGraphRoot.removeChild(child);\n\t}\n\n\tpublic removeChildAt(index:number)\n\t{\n\t\tthis._iSceneGraphRoot.removeChildAt(index);\n\t}\n\n\n\tpublic getChildAt(index:number):DisplayObject\n\t{\n\t\treturn this._iSceneGraphRoot.getChildAt(index);\n\t}\n\n\tpublic get numChildren():number\n\t{\n\t\treturn this._iSceneGraphRoot.numChildren;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic iRegisterEntity(displayObject:DisplayObject)\n\t{\n\t\tif (displayObject.partition)\n\t\t\tthis.iRegisterPartition(displayObject.partition);\n\n\t\tif (displayObject.isEntity)\n\t\t\tdisplayObject._iAssignedPartition.iMarkForUpdate(displayObject);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic iRegisterPartition(partition:Partition)\n\t{\n\t\tthis._expandedPartitions.push(partition);\n\n\t\t//ensure duplicates are not found in partitions array\n\t\tif (this._partitions.indexOf(partition) == -1)\n\t\t\tthis._partitions.push(partition);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic iUnregisterEntity(displayObject:DisplayObject)\n\t{\n\t\tif (displayObject.partition)\n\t\t\tthis.iUnregisterPartition(displayObject.partition);\n\n\t\tif (displayObject.isEntity)\n\t\t\tdisplayObject._iAssignedPartition.iRemoveEntity(displayObject);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic iUnregisterPartition(partition:Partition)\n\t{\n\t\tthis._expandedPartitions.splice(this._expandedPartitions.indexOf(partition), 1);\n\n\t\t//if no more partition references found, remove from partitions array\n\t\tif (this._expandedPartitions.indexOf(partition) == -1)\n\t\t\tthis._partitions.splice(this._partitions.indexOf(partition), 1);\n\t}\n}\n\nexport = Scene;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Point\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport Rectangle\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IPicker\t\t\t\t\t\t= require(\"awayjs-core/lib/core/pick/IPicker\");\nimport PickingCollisionVO\t\t\t= require(\"awayjs-core/lib/core/pick/PickingCollisionVO\");\nimport RaycastPicker\t\t\t\t= require(\"awayjs-core/lib/core/pick/RaycastPicker\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport CSSRendererBase\t\t\t\t= require(\"awayjs-core/lib/core/render/CSSRendererBase\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport CameraEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/CameraEvent\");\nimport SceneEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/SceneEvent\");\nimport RendererEvent\t\t\t\t= require(\"awayjs-core/lib/events/RendererEvent\");\nimport MouseManager\t\t\t\t\t= require(\"awayjs-core/lib/managers/MouseManager\");\nimport getTimer\t\t\t\t\t\t= require(\"awayjs-core/lib/utils/getTimer\");\n\nclass View\n{\n\n\t/*\n\t *************************************************************************************************************************\n\t * Development Notes\n\t *************************************************************************************************************************\n\t *\n\t * ShareContext - this is not being used at the moment integration with other frameworks is not yet implemented or tested\n\t * and ( _localPos / _globalPos ) position of viewport are the same for the moment\n\t *\n\t * Background\n\t * - this is currently not being included in our tests and is currently disabled\n\t *\n\t **************************************************************************************************************************\n\t */\n\n\t// Protected\n\tpublic _pScene:Scene;\n\tpublic _pCamera:Camera;\n\tpublic _pEntityCollector:ICollector;\n\tpublic _pRenderer:IRenderer;\n\n\t// Private\n\tprivate _aspectRatio:number;\n\tprivate _width:number = 0;\n\tprivate _height:number = 0;\n\n\tprivate _time:number = 0;\n\tprivate _deltaTime:number = 0;\n\tprivate _backgroundColor:number = 0x000000;\n\tprivate _backgroundAlpha:number = 1;\n\n\tprivate _viewportDirty:boolean = true;\n\tprivate _scissorDirty:boolean = true;\n\n\tprivate _onScenePartitionChangedDelegate:(event:SceneEvent) => void;\n\tprivate _onProjectionChangedDelegate:(event:CameraEvent) => void;\n\tprivate _onViewportUpdatedDelegate:(event:RendererEvent) => void;\n\tprivate _onScissorUpdatedDelegate:(event:RendererEvent) => void;\n\tprivate _mouseManager:MouseManager;\n\tprivate _mousePicker:IPicker = new RaycastPicker();\n\n\tprivate _htmlElement:HTMLDivElement;\n\tprivate _shareContext:boolean;\n\tpublic _pMouseX:number;\n\tpublic _pMouseY:number;\n\n\t/*\n\t ***********************************************************************\n\t * Disabled / Not yet implemented\n\t ***********************************************************************\n\t *\n\t * private _background:away.textures.Texture2DBase;\n\t *\n\t * public _pTouch3DManager:away.managers.Touch3DManager;\n\t *\n\t */\n\tconstructor(renderer:IRenderer, scene:Scene = null, camera:Camera = null)\n\t{\n\t\tthis._onScenePartitionChangedDelegate = (event:SceneEvent) => this.onScenePartitionChanged(event);\n\t\tthis._onProjectionChangedDelegate = (event:CameraEvent) => this.onProjectionChanged(event);\n\t\tthis._onViewportUpdatedDelegate = (event:RendererEvent) => this.onViewportUpdated(event);\n\t\tthis._onScissorUpdatedDelegate = (event:RendererEvent) => this.onScissorUpdated(event);\n\n\t\tthis.scene = scene || new Scene();\n\t\tthis.camera = camera || new Camera();\n\t\tthis.renderer = renderer;\n\n\t\t//make sure document border is zero\n\t\tdocument.body.style.margin = \"0px\";\n\n\t\tthis._htmlElement = document.createElement(\"div\");\n\t\tthis._htmlElement.style.position = \"absolute\";\n\n\t\tdocument.body.appendChild(this._htmlElement);\n\n\t\tthis._mouseManager = MouseManager.getInstance();\n\t\tthis._mouseManager.registerView(this);\n\n//\t\t\tif (this._shareContext)\n//\t\t\t\tthis._mouse3DManager.addViewLayer(this);\n\t}\n\n\t/**\n\t *\n\t * @param e\n\t */\n\tprivate onScenePartitionChanged(event:SceneEvent)\n\t{\n\t\tif (this._pCamera)\n\t\t\tthis._pCamera.partition = this.scene.partition;\n\t}\n\n\tpublic layeredView:boolean; //TODO: something to enable this correctly\n\n\tpublic get mouseX():number\n\t{\n\t\treturn this._pMouseX;\n\t}\n\n\tpublic get mouseY():number\n\t{\n\t\treturn this._pMouseY;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get htmlElement():HTMLDivElement\n\t{\n\t\treturn this._htmlElement;\n\t}\n\t/**\n\t *\n\t */\n\tpublic get renderer():IRenderer\n\t{\n\t\treturn this._pRenderer;\n\t}\n\n\tpublic set renderer(value:IRenderer)\n\t{\n\t\tif (this._pRenderer == value)\n\t\t\treturn;\n\n\t\tif (this._pRenderer) {\n\t\t\tthis._pRenderer.dispose();\n\t\t\tthis._pRenderer.removeEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate);\n\t\t\tthis._pRenderer.removeEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate);\n\t\t}\n\n\t\tthis._pRenderer = value;\n\n\t\tthis._pRenderer.addEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate);\n\t\tthis._pRenderer.addEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate);\n\n\t\t//reset entity collector\n\t\tthis._pEntityCollector = this._pRenderer._iCreateEntityCollector();\n\n\t\tif (this._pCamera)\n\t\t\tthis._pEntityCollector.camera = this._pCamera;\n\n\t\t//reset back buffer\n\t\tthis._pRenderer._iBackgroundR = ((this._backgroundColor >> 16) & 0xff)/0xff;\n\t\tthis._pRenderer._iBackgroundG = ((this._backgroundColor >> 8) & 0xff)/0xff;\n\t\tthis._pRenderer._iBackgroundB = (this._backgroundColor & 0xff)/0xff;\n\t\tthis._pRenderer._iBackgroundAlpha = this._backgroundAlpha;\n\t\tthis._pRenderer.width = this._width;\n\t\tthis._pRenderer.height = this._height;\n\t\tthis._pRenderer.shareContext = this._shareContext;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get shareContext():boolean\n\t{\n\t\treturn this._shareContext;\n\t}\n\n\tpublic set shareContext(value:boolean)\n\t{\n\t\tif (this._shareContext == value)\n\t\t\treturn;\n\n\t\tthis._shareContext = value;\n\n\t\tif (this._pRenderer)\n\t\t\tthis._pRenderer.shareContext = this._shareContext;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get backgroundColor():number\n\t{\n\t\treturn this._backgroundColor;\n\t}\n\n\tpublic set backgroundColor(value:number)\n\t{\n\t\tif (this._backgroundColor == value)\n\t\t\treturn;\n\n\t\tthis._backgroundColor = value;\n\n\t\tthis._pRenderer._iBackgroundR = ((value >> 16) & 0xff)/0xff;\n\t\tthis._pRenderer._iBackgroundG = ((value >> 8) & 0xff)/0xff;\n\t\tthis._pRenderer._iBackgroundB = (value & 0xff)/0xff;\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get backgroundAlpha():number\n\t{\n\t\treturn this._backgroundAlpha;\n\t}\n\n\t/**\n\t *\n\t * @param value\n\t */\n\tpublic set backgroundAlpha(value:number)\n\t{\n\t\tif (value > 1)\n\t\t\tvalue = 1;\n\t\telse if (value < 0)\n\t\t\tvalue = 0;\n\n\t\tif (this._backgroundAlpha == value)\n\t\t\treturn;\n\n\t\tthis._pRenderer._iBackgroundAlpha = this._backgroundAlpha = value;\n\t}\n\n\t/**\n\t *\n\t * @returns {Camera3D}\n\t */\n\tpublic get camera():Camera\n\t{\n\t\treturn this._pCamera;\n\t}\n\n\t/**\n\t * Set camera that's used to render the scene for this viewport\n\t */\n\tpublic set camera(value:Camera)\n\t{\n\t\tif (this._pCamera == value)\n\t\t\treturn;\n\n\t\tif (this._pCamera)\n\t\t\tthis._pCamera.removeEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate);\n\n\t\tthis._pCamera = value;\n\n\t\tif (this._pEntityCollector)\n\t\t\tthis._pEntityCollector.camera = this._pCamera;\n\n\t\tif (this._pScene)\n\t\t\tthis._pCamera.partition = this._pScene.partition;\n\n\t\tthis._pCamera.addEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate);\n\t\tthis._scissorDirty = true;\n\t\tthis._viewportDirty = true;\n\t}\n\n\t/**\n\t *\n\t * @returns {away.containers.Scene3D}\n\t */\n\tpublic get scene():Scene\n\t{\n\t\treturn this._pScene;\n\t}\n\n\t/**\n\t * Set the scene that's used to render for this viewport\n\t */\n\tpublic set scene(value:Scene)\n\t{\n\t\tif (this._pScene == value)\n\t\t\treturn;\n\n\t\tif (this._pScene)\n\t\t\tthis._pScene.removeEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate);\n\n\t\tthis._pScene = value;\n\n\t\tthis._pScene.addEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate);\n\n\t\tif (this._pCamera)\n\t\t\tthis._pCamera.partition = this._pScene.partition;\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get deltaTime():number\n\t{\n\t\treturn this._deltaTime;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get width():number\n\t{\n\t\treturn this._width;\n\t}\n\n\tpublic set width(value:number)\n\t{\n\t\tif (this._width == value)\n\t\t\treturn;\n\n\t\tthis._width = value;\n\t\tthis._aspectRatio = this._width/this._height;\n\t\tthis._pCamera.projection._iAspectRatio = this._aspectRatio;\n\t\tthis._pRenderer.width = value;\n\t\tthis._htmlElement.style.width = value + \"px\";\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._height;\n\t}\n\n\tpublic set height(value:number)\n\t{\n\t\tif (this._height == value)\n\t\t\treturn;\n\n\t\tthis._height = value;\n\t\tthis._aspectRatio = this._width/this._height;\n\t\tthis._pCamera.projection._iAspectRatio = this._aspectRatio;\n\t\tthis._pRenderer.height = value;\n\t\tthis._htmlElement.style.height = value + \"px\";\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get mousePicker():IPicker\n\t{\n\t\treturn this._mousePicker;\n\t}\n\n\tpublic set mousePicker(value:IPicker)\n\t{\n\t\tif (this._mousePicker == value)\n\t\t\treturn;\n\n\t\tif (value == null)\n\t\t\tthis._mousePicker = new RaycastPicker();\n\t\telse\n\t\t\tthis._mousePicker = value;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get x():number\n\t{\n\t\treturn this._pRenderer.x;\n\t}\n\n\tpublic set x(value:number)\n\t{\n\t\tif (this._pRenderer.x == value)\n\t\t\treturn;\n\n\t\tthis._pRenderer.x == value;\n\t\tthis._htmlElement.style.left = value + \"px\";\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get y():number\n\t{\n\t\treturn this._pRenderer.y;\n\t}\n\n\tpublic set y(value:number)\n\t{\n\t\tif (this._pRenderer.y == value)\n\t\t\treturn;\n\n\t\tthis._pRenderer.y == value;\n\t\tthis._htmlElement.style.top = value + \"px\";\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get visible():boolean\n\t{\n\t\treturn (this._htmlElement.style.visibility == \"visible\");\n\t}\n\n\tpublic set visible(value:boolean)\n\t{\n\t\tthis._htmlElement.style.visibility = value? \"visible\" : \"hidden\";\n\t\t//TODO transfer visible property to associated context (if one exists)\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get renderedFacesCount():number\n\t{\n\t\treturn 0; //TODO\n\t\t//return this._pEntityCollector._pNumTriangles;//numTriangles;\n\t}\n\n\t/**\n\t * Renders the view.\n\t */\n\tpublic render()\n\t{\n\t\tthis.pUpdateTime();\n\n\t\t//update view and size data\n\t\tthis._pCamera.projection._iAspectRatio = this._aspectRatio;\n\n\t\tif (this._scissorDirty) {\n\t\t\tthis._scissorDirty = false;\n\t\t\tthis._pCamera.projection._iUpdateScissorRect(this._pRenderer.scissorRect.x, this._pRenderer.scissorRect.y, this._pRenderer.scissorRect.width, this._pRenderer.scissorRect.height);\n\t\t}\n\n\t\tif (this._viewportDirty) {\n\t\t\tthis._viewportDirty = false;\n\t\t\tthis._pCamera.projection._iUpdateViewport(this._pRenderer.viewPort.x, this._pRenderer.viewPort.y, this._pRenderer.viewPort.width, this._pRenderer.viewPort.height);\n\t\t}\n\n\t\t// update picking\n\t\tif (!this._shareContext) {\n\t\t\tif (this.forceMouseMove && this._htmlElement == this._mouseManager._iActiveDiv && !this._mouseManager._iUpdateDirty)\n\t\t\t\tthis._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this);\n\n\t\t\tthis._mouseManager.fireMouseEvents(this.forceMouseMove);\n\t\t\t//_touch3DManager.fireTouchEvents();\n\t\t}\n\t\t//_touch3DManager.updateCollider();\n\n\t\t//clear entity collector ready for collection\n\t\tthis._pEntityCollector.clear();\n\n\t\t// collect stuff to render\n\t\tthis._pScene.traversePartitions(this._pEntityCollector);\n\n\t\t//render the contents of the entity collector\n\t\tthis._pRenderer.render(this._pEntityCollector);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic pUpdateTime():void\n\t{\n\t\tvar time:number = getTimer();\n\n\t\tif (this._time == 0)\n\t\t\tthis._time = time;\n\n\t\tthis._deltaTime = time - this._time;\n\t\tthis._time = time;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tthis._pRenderer.dispose();\n\n\t\t// TODO: imeplement mouseManager / touch3DManager\n\t\tthis._mouseManager.unregisterView(this);\n\n\t\t//this._touch3DManager.disableTouchListeners(this);\n\t\t//this._touch3DManager.dispose();\n\n\t\tthis._mouseManager = null;\n\t\t//this._touch3DManager = null;\n\n\t\tthis._pRenderer = null;\n\t\tthis._pEntityCollector = null;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get iEntityCollector():ICollector\n\t{\n\t\treturn this._pEntityCollector;\n\t}\n\n\t/**\n\t *\n\t */\n\tprivate onProjectionChanged(event:CameraEvent)\n\t{\n\t\tthis._scissorDirty = true;\n\t\tthis._viewportDirty = true;\n\t}\n\n\t/**\n\t *\n\t */\n\tprivate onViewportUpdated(event:RendererEvent)\n\t{\n\t\tthis._viewportDirty = true;\n\t}\n\n\t/**\n\t *\n\t */\n\tprivate onScissorUpdated(event:RendererEvent)\n\t{\n\t\tthis._scissorDirty = true;\n\t}\n\n\tpublic project(point3d:Vector3D):Vector3D\n\t{\n\t\tvar v:Vector3D = this._pCamera.project(point3d);\n\t\tv.x = v.x*this._pRenderer.viewPort.width/2 + this._width*this._pCamera.projection.originX;\n\t\tv.y = v.y*this._pRenderer.viewPort.height/2 + this._height*this._pCamera.projection.originY;\n\n\t\treturn v;\n\t}\n\n\tpublic unproject(sX:number, sY:number, sZ:number):Vector3D\n\t{\n\t\treturn this._pCamera.unproject(2*(sX - this._width*this._pCamera.projection.originX)/this._pRenderer.viewPort.width, 2*(sY - this._height*this._pCamera.projection.originY)/this._pRenderer.viewPort.height, sZ);\n\n\t}\n\n\tpublic getRay(sX:number, sY:number, sZ:number):Vector3D\n\t{\n\t\treturn this._pCamera.getRay((sX*2 - this._width)/this._width, (sY*2 - this._height)/this._height, sZ);\n\t}\n\n\t/* TODO: implement Touch3DManager\n\t public get touchPicker():IPicker\n\t {\n\t return this._touch3DManager.touchPicker;\n\t }\n\t */\n\t/* TODO: implement Touch3DManager\n\t public set touchPicker( value:IPicker)\n\t {\n\t this._touch3DManager.touchPicker = value;\n\t }\n\t */\n\n\tpublic forceMouseMove:boolean;\n\n\t/*TODO: implement Background\n\t public get background():away.textures.Texture2DBase\n\t {\n\t return this._background;\n\t }\n\t */\n\t/*TODO: implement Background\n\t public set background( value:away.textures.Texture2DBase )\n\t {\n\t this._background = value;\n\t this._renderer.background = _background;\n\t }\n\t */\n\n\t// TODO: required dependency stageGL\n\tpublic updateCollider()\n\t{\n\t\tif (!this._shareContext) {\n\t\t\tif (this._htmlElement == this._mouseManager._iActiveDiv)\n\t\t\t\tthis._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this);\n\t\t} else {\n\t\t\tvar collidingObject:PickingCollisionVO = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this);\n\n\t\t\tif (this.layeredView || this._mouseManager._iCollidingObject == null || collidingObject.rayEntryDistance < this._mouseManager._iCollidingObject.rayEntryDistance)\n\t\t\t\tthis._mouseManager._iCollidingObject = collidingObject;\n\t\t}\n\t}\n}\n\nexport = View;", + "import DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\n\nclass ControllerBase\n{\n\n\tpublic _pAutoUpdate:boolean = true;\n\tpublic _pTargetObject:DisplayObject;\n\n\tconstructor(targetObject:DisplayObject = null)\n\t{\n\t\tthis.targetObject = targetObject;\n\t}\n\n\tpublic pNotifyUpdate()\n\t{\n\t\tif (this._pTargetObject && this._pTargetObject._iAssignedPartition && this._pAutoUpdate) {\n\t\t\tthis._pTargetObject._iAssignedPartition.iMarkForUpdate(this._pTargetObject);\n\t\t}\n\t}\n\n\tpublic get targetObject():DisplayObject\n\t{\n\t\treturn this._pTargetObject;\n\t}\n\n\tpublic set targetObject(val:DisplayObject)\n\t{\n\t\tif (this._pTargetObject == val) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._pTargetObject && this._pAutoUpdate) {\n\t\t\tthis._pTargetObject._iController = null;\n\t\t}\n\t\tthis._pTargetObject = val;\n\n\t\tif (this._pTargetObject && this._pAutoUpdate) {\n\t\t\tthis._pTargetObject._iController = this;\n\t\t}\n\t\tthis.pNotifyUpdate();\n\t}\n\n\tpublic get autoUpdate():boolean\n\t{\n\t\treturn this._pAutoUpdate;\n\t}\n\n\tpublic set autoUpdate(val:boolean)\n\t{\n\t\tif (this._pAutoUpdate == val) {\n\t\t\treturn;\n\t\t}\n\t\tthis._pAutoUpdate = val;\n\n\t\tif (this._pTargetObject) {\n\t\t\tif (this._pTargetObject) {\n\t\t\t\tthis._pTargetObject._iController = this;\n\t\t\t} else {\n\t\t\t\tthis._pTargetObject._iController = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic update(interpolate:boolean = true)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n}\n\nexport = ControllerBase;", + "import ControllerBase\t\t\t= require(\"awayjs-core/lib/controllers/ControllerBase\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport MathConsts\t\t\t\t= require(\"awayjs-core/lib/core/geom/MathConsts\");\n\n/**\n * Extended camera used to hover round a specified target object.\n *\n * @see away3d.containers.View3D\n */\nclass FirstPersonController extends ControllerBase\n{\n\tpublic _iCurrentPanAngle:number = 0;\n\tpublic _iCurrentTiltAngle:number = 90;\n\n\tprivate _panAngle:number = 0;\n\tprivate _tiltAngle:number = 90;\n\tprivate _minTiltAngle:number = -90;\n\tprivate _maxTiltAngle:number = 90;\n\tprivate _steps:number = 8;\n\tprivate _walkIncrement:number = 0;\n\tprivate _strafeIncrement:number = 0;\n\tprivate _wrapPanAngle:boolean = false;\n\n\tpublic fly:boolean = false;\n\n\t/**\n\t * Fractional step taken each time the hover() method is called. Defaults to 8.\n\t *\n\t * Affects the speed at which the tiltAngle and panAngle resolve to their targets.\n\t *\n\t * @see #tiltAngle\n\t * @see #panAngle\n\t */\n\tpublic get steps():number\n\t{\n\t\treturn this._steps;\n\t}\n\n\tpublic set steps(val:number)\n\t{\n\t\tval = (val < 1)? 1 : val;\n\n\t\tif (this._steps == val)\n\t\t\treturn;\n\n\t\tthis._steps = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Rotation of the camera in degrees around the y axis. Defaults to 0.\n\t */\n\tpublic get panAngle():number\n\t{\n\t\treturn this._panAngle;\n\t}\n\n\tpublic set panAngle(val:number)\n\t{\n\t\tif (this._panAngle == val)\n\t\t\treturn;\n\n\t\tthis._panAngle = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Elevation angle of the camera in degrees. Defaults to 90.\n\t */\n\tpublic get tiltAngle():number\n\t{\n\t\treturn this._tiltAngle;\n\t}\n\n\tpublic set tiltAngle(val:number)\n\t{\n\t\tval = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val));\n\n\t\tif (this._tiltAngle == val)\n\t\t\treturn;\n\n\t\tthis._tiltAngle = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Minimum bounds for the tiltAngle. Defaults to -90.\n\t *\n\t * @see #tiltAngle\n\t */\n\tpublic get minTiltAngle():number\n\t{\n\t\treturn this._minTiltAngle;\n\t}\n\n\tpublic set minTiltAngle(val:number)\n\t{\n\t\tif (this._minTiltAngle == val)\n\t\t\treturn;\n\n\t\tthis._minTiltAngle = val;\n\n\t\tthis.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle));\n\t}\n\n\t/**\n\t * Maximum bounds for the tiltAngle. Defaults to 90.\n\t *\n\t * @see #tiltAngle\n\t */\n\tpublic get maxTiltAngle():number\n\t{\n\t\treturn this._maxTiltAngle;\n\t}\n\n\tpublic set maxTiltAngle(val:number)\n\t{\n\t\tif (this._maxTiltAngle == val)\n\t\t\treturn;\n\n\t\tthis._maxTiltAngle = val;\n\n\t\tthis.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle));\n\t}\n\n\n\t/**\n\t * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false.\n\t */\n\tpublic get wrapPanAngle():boolean\n\t{\n\t\treturn this._wrapPanAngle;\n\t}\n\n\tpublic set wrapPanAngle(val:boolean)\n\t{\n\t\tif (this._wrapPanAngle == val)\n\t\t\treturn;\n\n\t\tthis._wrapPanAngle = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Creates a new HoverController object.\n\t */\n\tconstructor(targetObject:DisplayObject = null, panAngle:number = 0, tiltAngle:number = 90, minTiltAngle:number = -90, maxTiltAngle:number = 90, steps:number = 8, wrapPanAngle:boolean = false)\n\t{\n\t\tsuper(targetObject);\n\n\t\tthis.panAngle = panAngle;\n\t\tthis.tiltAngle = tiltAngle;\n\t\tthis.minTiltAngle = minTiltAngle;\n\t\tthis.maxTiltAngle = maxTiltAngle;\n\t\tthis.steps = steps;\n\t\tthis.wrapPanAngle = wrapPanAngle;\n\n\t\t//values passed in contrustor are applied immediately\n\t\tthis._iCurrentPanAngle = this._panAngle;\n\t\tthis._iCurrentTiltAngle = this._tiltAngle;\n\t}\n\n\t/**\n\t * Updates the current tilt angle and pan angle values.\n\t *\n\t * Values are calculated using the defined tiltAngle, panAngle and steps variables.\n\t *\n\t * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true.\n\t *\n\t * @see #tiltAngle\n\t * @see #panAngle\n\t * @see #steps\n\t */\n\tpublic update(interpolate:boolean = true)\n\t{\n\t\tif (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) {\n\n\t\t\tthis.pNotifyUpdate();\n\n\t\t\tif (this._wrapPanAngle) {\n\t\t\t\tif (this._panAngle < 0) {\n\t\t\t\t\tthis._iCurrentPanAngle += this._panAngle%360 + 360 - this._panAngle;\n\t\t\t\t\tthis._panAngle = this._panAngle%360 + 360;\n\t\t\t\t} else {\n\t\t\t\t\tthis._iCurrentPanAngle += this._panAngle%360 - this._panAngle;\n\t\t\t\t\tthis._panAngle = this._panAngle%360;\n\t\t\t\t}\n\n\t\t\t\twhile (this._panAngle - this._iCurrentPanAngle < -180)\n\t\t\t\t\tthis._iCurrentPanAngle -= 360;\n\n\t\t\t\twhile (this._panAngle - this._iCurrentPanAngle > 180)\n\t\t\t\t\tthis._iCurrentPanAngle += 360;\n\t\t\t}\n\n\t\t\tif (interpolate) {\n\t\t\t\tthis._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle)/(this.steps + 1);\n\t\t\t\tthis._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle)/(this.steps + 1);\n\t\t\t} else {\n\t\t\t\tthis._iCurrentTiltAngle = this._tiltAngle;\n\t\t\t\tthis._iCurrentPanAngle = this._panAngle;\n\t\t\t}\n\n\t\t\t//snap coords if angle differences are close\n\t\t\tif ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) {\n\t\t\t\tthis._iCurrentTiltAngle = this._tiltAngle;\n\t\t\t\tthis._iCurrentPanAngle = this._panAngle;\n\t\t\t}\n\t\t}\n\n\t\tthis.targetObject.rotationX = this._iCurrentTiltAngle;\n\t\tthis.targetObject.rotationY = this._iCurrentPanAngle;\n\n\t\tif (this._walkIncrement) {\n\t\t\tif (this.fly) {\n\t\t\t\tthis.targetObject.transform.moveForward(this._walkIncrement);\n\t\t\t} else {\n\t\t\t\tthis.targetObject.x += this._walkIncrement*Math.sin(this._panAngle*MathConsts.DEGREES_TO_RADIANS);\n\t\t\t\tthis.targetObject.z += this._walkIncrement*Math.cos(this._panAngle*MathConsts.DEGREES_TO_RADIANS);\n\t\t\t}\n\t\t\tthis._walkIncrement = 0;\n\t\t}\n\n\t\tif (this._strafeIncrement) {\n\t\t\tthis.targetObject.transform.moveRight(this._strafeIncrement);\n\t\t\tthis._strafeIncrement = 0;\n\t\t}\n\n\t}\n\n\tpublic incrementWalk(val:number)\n\t{\n\t\tif (val == 0)\n\t\t\treturn;\n\n\t\tthis._walkIncrement += val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\tpublic incrementStrafe(val:number)\n\t{\n\t\tif (val == 0)\n\t\t\treturn;\n\n\t\tthis._strafeIncrement += val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n}\n\nexport = FirstPersonController;", + "import HoverController\t\t\t= require(\"awayjs-core/lib/controllers/HoverController\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\n\n/**\n * Controller used to follow behind an object on the XZ plane, with an optional\n * elevation (tiltAngle).\n *\n * @see away3d.containers.View3D\n */\nclass FollowController extends HoverController\n{\n\tconstructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, tiltAngle:number = 45, distance:number = 700)\n\t{\n\t\tsuper(targetObject, lookAtObject, 0, tiltAngle, distance);\n\t}\n\n\tpublic update(interpolate:boolean = true)\n\t{\n\t\tinterpolate = interpolate; // unused: prevents warning\n\n\t\tif (!this.lookAtObject)\n\t\t\treturn;\n\n\t\tthis.panAngle = this._pLookAtObject.rotationY - 180;\n\t\tsuper.update();\n\t}\n}\n\nexport = FollowController;", + "import LookAtController\t\t\t= require(\"awayjs-core/lib/controllers/LookAtController\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport MathConsts\t\t\t\t= require(\"awayjs-core/lib/core/geom/MathConsts\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\n\n/**\n * Extended camera used to hover round a specified target object.\n *\n * @see away.containers.View\n */\nclass HoverController extends LookAtController\n{\n\tpublic _iCurrentPanAngle:number = 0;\n\tpublic _iCurrentTiltAngle:number = 90;\n\n\tprivate _panAngle:number = 0;\n\tprivate _tiltAngle:number = 90;\n\tprivate _distance:number = 1000;\n\tprivate _minPanAngle:number = -Infinity;\n\tprivate _maxPanAngle:number = Infinity;\n\tprivate _minTiltAngle:number = -90;\n\tprivate _maxTiltAngle:number = 90;\n\tprivate _steps:number = 8;\n\tprivate _yFactor:number = 2;\n\tprivate _wrapPanAngle:boolean = false;\n\tprivate _upAxis:Vector3D = new Vector3D();\n\n\t/**\n\t * Fractional step taken each time the hover() method is called. Defaults to 8.\n\t *\n\t * Affects the speed at which the tiltAngle and panAngle resolve to their targets.\n\t *\n\t * @see #tiltAngle\n\t * @see #panAngle\n\t */\n\tpublic get steps():number\n\t{\n\t\treturn this._steps;\n\t}\n\n\tpublic set steps(val:number)\n\t{\n\t\tval = (val < 1)? 1 : val;\n\n\t\tif (this._steps == val)\n\t\t\treturn;\n\n\t\tthis._steps = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Rotation of the camera in degrees around the y axis. Defaults to 0.\n\t */\n\tpublic get panAngle():number\n\t{\n\t\treturn this._panAngle;\n\t}\n\n\tpublic set panAngle(val:number)\n\t{\n\t\tval = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, val));\n\n\t\tif (this._panAngle == val)\n\t\t\treturn;\n\n\t\tthis._panAngle = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Elevation angle of the camera in degrees. Defaults to 90.\n\t */\n\tpublic get tiltAngle():number\n\t{\n\t\treturn this._tiltAngle;\n\t}\n\n\tpublic set tiltAngle(val:number)\n\t{\n\t\tval = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val));\n\n\t\tif (this._tiltAngle == val)\n\t\t\treturn;\n\n\t\tthis._tiltAngle = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Distance between the camera and the specified target. Defaults to 1000.\n\t */\n\tpublic get distance():number\n\t{\n\t\treturn this._distance;\n\t}\n\n\tpublic set distance(val:number)\n\t{\n\t\tif (this._distance == val)\n\t\t\treturn;\n\n\t\tthis._distance = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Minimum bounds for the panAngle. Defaults to -Infinity.\n\t *\n\t * @see #panAngle\n\t */\n\tpublic get minPanAngle():number\n\t{\n\t\treturn this._minPanAngle;\n\t}\n\n\tpublic set minPanAngle(val:number)\n\t{\n\t\tif (this._minPanAngle == val)\n\t\t\treturn;\n\n\t\tthis._minPanAngle = val;\n\n\t\tthis.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle));\n\t}\n\n\t/**\n\t * Maximum bounds for the panAngle. Defaults to Infinity.\n\t *\n\t * @see #panAngle\n\t */\n\tpublic get maxPanAngle():number\n\t{\n\t\treturn this._maxPanAngle;\n\t}\n\n\tpublic set maxPanAngle(val:number)\n\t{\n\t\tif (this._maxPanAngle == val)\n\t\t\treturn;\n\n\t\tthis._maxPanAngle = val;\n\n\t\tthis.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle));\n\t}\n\n\t/**\n\t * Minimum bounds for the tiltAngle. Defaults to -90.\n\t *\n\t * @see #tiltAngle\n\t */\n\tpublic get minTiltAngle():number\n\t{\n\t\treturn this._minTiltAngle;\n\t}\n\n\tpublic set minTiltAngle(val:number)\n\t{\n\t\tif (this._minTiltAngle == val)\n\t\t\treturn;\n\n\t\tthis._minTiltAngle = val;\n\n\t\tthis.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle));\n\t}\n\n\t/**\n\t * Maximum bounds for the tiltAngle. Defaults to 90.\n\t *\n\t * @see #tiltAngle\n\t */\n\tpublic get maxTiltAngle():number\n\t{\n\t\treturn this._maxTiltAngle;\n\t}\n\n\tpublic set maxTiltAngle(val:number)\n\t{\n\t\tif (this._maxTiltAngle == val)\n\t\t\treturn;\n\n\t\tthis._maxTiltAngle = val;\n\n\t\tthis.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle));\n\t}\n\n\t/**\n\t * Fractional difference in distance between the horizontal camera orientation and vertical camera orientation. Defaults to 2.\n\t *\n\t * @see #distance\n\t */\n\tpublic get yFactor():number\n\t{\n\t\treturn this._yFactor;\n\t}\n\n\tpublic set yFactor(val:number)\n\t{\n\t\tif (this._yFactor == val)\n\t\t\treturn;\n\n\t\tthis._yFactor = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false.\n\t */\n\tpublic get wrapPanAngle():boolean\n\t{\n\t\treturn this._wrapPanAngle;\n\t}\n\n\tpublic set wrapPanAngle(val:boolean)\n\t{\n\t\tif (this._wrapPanAngle == val)\n\t\t\treturn;\n\n\t\tthis._wrapPanAngle = val;\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t/**\n\t * Creates a new HoverController object.\n\t */\n\tconstructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, panAngle:number = 0, tiltAngle:number = 90, distance:number = 1000, minTiltAngle:number = -90, maxTiltAngle:number = 90, minPanAngle:number = null, maxPanAngle:number = null, steps:number = 8, yFactor:number = 2, wrapPanAngle:boolean = false)\n\t{\n\t\tsuper(targetObject, lookAtObject);\n\n\t\tthis.distance = distance;\n\t\tthis.panAngle = panAngle;\n\t\tthis.tiltAngle = tiltAngle;\n\t\tthis.minPanAngle = ( minPanAngle != null )? minPanAngle : -Infinity;\n\t\tthis.maxPanAngle = ( maxPanAngle != null )? maxPanAngle : Infinity;\n\t\tthis.minTiltAngle = minTiltAngle;\n\t\tthis.maxTiltAngle = maxTiltAngle;\n\t\tthis.steps = steps;\n\t\tthis.yFactor = yFactor;\n\t\tthis.wrapPanAngle = wrapPanAngle;\n\n\t\t//values passed in contrustor are applied immediately\n\t\tthis._iCurrentPanAngle = this._panAngle;\n\t\tthis._iCurrentTiltAngle = this._tiltAngle;\n\t}\n\n\t/**\n\t * Updates the current tilt angle and pan angle values.\n\t *\n\t * Values are calculated using the defined tiltAngle, panAngle and steps variables.\n\t *\n\t * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true.\n\t *\n\t * @see #tiltAngle\n\t * @see #panAngle\n\t * @see #steps\n\t */\n\tpublic update(interpolate:boolean = true)\n\t{\n\t\tif (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) {\n\n\t\t\tthis.pNotifyUpdate();\n\n\t\t\tif (this._wrapPanAngle) {\n\t\t\t\tif (this._panAngle < 0) {\n\t\t\t\t\tthis._iCurrentPanAngle += this._panAngle%360 + 360 - this._panAngle;\n\t\t\t\t\tthis._panAngle = this._panAngle%360 + 360;\n\t\t\t\t} else {\n\t\t\t\t\tthis._iCurrentPanAngle += this._panAngle%360 - this._panAngle;\n\t\t\t\t\tthis._panAngle = this._panAngle%360;\n\t\t\t\t}\n\n\t\t\t\twhile (this._panAngle - this._iCurrentPanAngle < -180)\n\t\t\t\t\tthis._iCurrentPanAngle -= 360;\n\n\t\t\t\twhile (this._panAngle - this._iCurrentPanAngle > 180)\n\t\t\t\t\tthis._iCurrentPanAngle += 360;\n\t\t\t}\n\n\t\t\tif (interpolate) {\n\t\t\t\tthis._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle)/(this.steps + 1);\n\t\t\t\tthis._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle)/(this.steps + 1);\n\t\t\t} else {\n\t\t\t\tthis._iCurrentPanAngle = this._panAngle;\n\t\t\t\tthis._iCurrentTiltAngle = this._tiltAngle;\n\t\t\t}\n\n\t\t\t//snap coords if angle differences are close\n\t\t\tif ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) {\n\t\t\t\tthis._iCurrentTiltAngle = this._tiltAngle;\n\t\t\t\tthis._iCurrentPanAngle = this._panAngle;\n\t\t\t}\n\t\t}\n\n\t\tvar pos:Vector3D = (this.lookAtObject)? this.lookAtObject.transform.position : (this.lookAtPosition)? this.lookAtPosition : this._pOrigin;\n\t\tthis.targetObject.x = pos.x + this.distance*Math.sin(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS);\n\t\tthis.targetObject.y = pos.y + this.distance*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS)*this.yFactor;\n\t\tthis.targetObject.z = pos.z + this.distance*Math.cos(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS);\n\n\t\tthis._upAxis.x = -Math.sin(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS);\n\t\tthis._upAxis.y = Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS);\n\t\tthis._upAxis.z = -Math.cos(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS);\n\n\t\tif (this._pTargetObject) {\n\t\t\tif (this._pLookAtPosition)\n\t\t\t\tthis._pTargetObject.lookAt(this._pLookAtPosition, this._upAxis);\n\t\t\telse if (this._pLookAtObject)\n\t\t\t\tthis._pTargetObject.lookAt(this._pLookAtObject.scene? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position, this._upAxis);\n\t\t}\n\t}\n}\n\nexport = HoverController;", + "import ControllerBase\t\t\t= require(\"awayjs-core/lib/controllers/ControllerBase\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport DisplayObjectEvent\t\t= require(\"awayjs-core/lib/events/DisplayObjectEvent\");\n\nclass LookAtController extends ControllerBase\n{\n\tpublic _pLookAtPosition:Vector3D;\n\tpublic _pLookAtObject:DisplayObject;\n\tpublic _pOrigin:Vector3D = new Vector3D(0.0, 0.0, 0.0);\n\n\tprivate _onLookAtObjectChangedDelegate:(event:DisplayObjectEvent) => void;\n\n\tconstructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null)\n\t{\n\t\tsuper(targetObject);\n\n\t\tthis._onLookAtObjectChangedDelegate = (event:DisplayObjectEvent) => this.onLookAtObjectChanged(event);\n\n\t\tif (lookAtObject)\n\t\t\tthis.lookAtObject = lookAtObject;\n\t\telse\n\t\t\tthis.lookAtPosition = new Vector3D();\n\t}\n\n\tpublic get lookAtPosition():Vector3D\n\t{\n\t\treturn this._pLookAtPosition;\n\t}\n\n\tpublic set lookAtPosition(val:Vector3D)\n\t{\n\t\tif (this._pLookAtObject) {\n\t\t\tthis._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate);\n\t\t\tthis._pLookAtObject = null;\n\t\t}\n\n\t\tthis._pLookAtPosition = val;\n\t\tthis.pNotifyUpdate();\n\t}\n\n\tpublic get lookAtObject():DisplayObject\n\t{\n\t\treturn this._pLookAtObject;\n\t}\n\n\tpublic set lookAtObject(val:DisplayObject)\n\t{\n\t\tif (this._pLookAtPosition)\n\t\t\tthis._pLookAtPosition = null;\n\n\t\tif (this._pLookAtObject == val)\n\t\t\treturn;\n\n\t\tif (this._pLookAtObject)\n\t\t\tthis._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate);\n\n\t\tthis._pLookAtObject = val;\n\n\t\tif (this._pLookAtObject)\n\t\t\tthis._pLookAtObject.addEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate);\n\n\t\tthis.pNotifyUpdate();\n\t}\n\n\t//@override\n\tpublic update(interpolate:boolean = true)\n\t{\n\t\tif (this._pTargetObject) {\n\t\t\tif (this._pLookAtPosition)\n\t\t\t\tthis._pTargetObject.lookAt(this._pLookAtPosition);\n\t\t\telse if (this._pLookAtObject)\n\t\t\t\tthis._pTargetObject.lookAt(this._pLookAtObject.scene? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position);\n\t\t}\n\t}\n\n\tprivate onLookAtObjectChanged(event:DisplayObjectEvent)\n\t{\n\t\tthis.pNotifyUpdate();\n\t}\n}\n\nexport = LookAtController;", + "import LookAtController\t\t\t= require(\"awayjs-core/lib/controllers/LookAtController\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\n\n/**\n * Uses spring physics to animate the target object towards a position that is\n * defined as the lookAtTarget object's position plus the vector defined by the\n * positionOffset property.\n */\nclass SpringController extends LookAtController\n{\n\tprivate _velocity:Vector3D;\n\tprivate _dv:Vector3D;\n\tprivate _stretch:Vector3D;\n\tprivate _force:Vector3D;\n\tprivate _acceleration:Vector3D;\n\tprivate _desiredPosition:Vector3D;\n\n\t/**\n\t * Stiffness of the spring, how hard is it to extend. The higher it is, the more \"fixed\" the cam will be.\n\t * A number between 1 and 20 is recommended.\n\t */\n\tpublic stiffness:number;\n\n\t/**\n\t * Damping is the spring internal friction, or how much it resists the \"boinggggg\" effect. Too high and you'll lose it!\n\t * A number between 1 and 20 is recommended.\n\t */\n\tpublic damping:number;\n\n\t/**\n\t * Mass of the camera, if over 120 and it'll be very heavy to move.\n\t */\n\tpublic mass:number;\n\n\t/**\n\t * Offset of spring center from target in target object space, ie: Where the camera should ideally be in the target object space.\n\t */\n\tpublic positionOffset:Vector3D = new Vector3D(0, 500, -1000);\n\n\tconstructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, stiffness:number = 1, mass:number = 40, damping:number = 4)\n\t{\n\t\tsuper(targetObject, lookAtObject);\n\n\t\tthis.stiffness = stiffness;\n\t\tthis.damping = damping;\n\t\tthis.mass = mass;\n\n\t\tthis._velocity = new Vector3D();\n\t\tthis._dv = new Vector3D();\n\t\tthis._stretch = new Vector3D();\n\t\tthis._force = new Vector3D();\n\t\tthis._acceleration = new Vector3D();\n\t\tthis._desiredPosition = new Vector3D();\n\n\t}\n\n\tpublic update(interpolate:boolean = true)\n\t{\n\t\tvar offs:Vector3D;\n\n\t\tif (!this._pLookAtObject || !this._pTargetObject)\n\t\t\treturn;\n\n\t\toffs = this._pLookAtObject.transform.matrix3D.deltaTransformVector(this.positionOffset);\n\t\tthis._desiredPosition.x = this._pLookAtObject.x + offs.x;\n\t\tthis._desiredPosition.y = this._pLookAtObject.y + offs.y;\n\t\tthis._desiredPosition.z = this._pLookAtObject.z + offs.z;\n\n\t\tthis._stretch = this._pTargetObject.transform.position.add(this._desiredPosition);\n\t\tthis._stretch.scaleBy(-this.stiffness);\n\n\t\tthis._dv.copyFrom(this._velocity);\n\t\tthis._dv.scaleBy(this.damping);\n\n\t\tthis._force.x = this._stretch.x - this._dv.x;\n\t\tthis._force.y = this._stretch.y - this._dv.y;\n\t\tthis._force.z = this._stretch.z - this._dv.z;\n\n\t\tthis._acceleration.copyFrom(this._force);\n\t\tthis._acceleration.scaleBy(1/this.mass);\n\n\t\tthis._velocity.incrementBy(this._acceleration);\n\n\t\tthis._pTargetObject.transform.position = this._pTargetObject.transform.position.add(this._velocity);\n\n\t\tsuper.update();\n\t}\n}\n\nexport = SpringController;", + "/**\n *\n */\nclass AlignmentMode\n{\n\t/**\n\t *\n\t */\n\tpublic static REGISTRATION_POINT:string = \"registrationPoint\";\n\n\t/**\n\t *\n\t */\n\tpublic static PIVOT_POINT:string = \"pivot\";\n}\n\nexport = AlignmentMode;", + "class BitmapDataChannel\n{\n\tpublic static ALPHA:number /*uint*/ = 8;\n\tpublic static BLUE:number /*uint*/ = 4;\n\tpublic static GREEN:number /*uint*/ = 2;\n\tpublic static RED:number /*uint*/ = 1;\n}\n\nexport = BitmapDataChannel;", + "import ColorTransform\t\t\t= require(\"awayjs-core/lib/core/geom/ColorTransform\");\nimport Matrix\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix\");\nimport Rectangle\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport Point\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport ByteArray\t\t\t\t= require(\"awayjs-core/lib/utils/ByteArray\");\nimport ColorUtils\t\t\t\t= require(\"awayjs-core/lib/utils/ColorUtils\");\n\n/**\n *\n */\nclass BitmapData\n{\n\tprivate _imageCanvas:HTMLCanvasElement;\n\tprivate _context:CanvasRenderingContext2D;\n\tprivate _imageData:ImageData;\n\tprivate _rect:Rectangle;\n\tprivate _transparent:boolean;\n\tprivate _alpha:number = 0;\n\tprivate _locked:boolean = false;\n\n\n\t/**\n\t *\n\t * @param width\n\t * @param height\n\t * @param transparent\n\t * @param fillColor\n\t */\n\tconstructor(width:number, height:number, transparent:boolean = true, fillColor:number = null)\n\t{\n\n\t\tthis._transparent = transparent;\n\t\tthis._imageCanvas = document.createElement(\"canvas\");\n\t\tthis._imageCanvas.width = width;\n\t\tthis._imageCanvas.height = height;\n\t\tthis._context = this._imageCanvas.getContext(\"2d\");\n\t\tthis._rect = new Rectangle(0, 0, width, height);\n\n\t\tif (fillColor != null) {\n\n\t\t\tif (this._transparent) {\n\t\t\t\tthis._alpha = ColorUtils.float32ColorToARGB(fillColor)[0]/255;\n\t\t\t} else {\n\t\t\t\tthis._alpha = 1;\n\t\t\t}\n\n\t\t\tthis.fillRect(this._rect, fillColor);\n\n\t\t}\n\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tthis._context = null;\n\t\tthis._imageCanvas = null;\n\t\tthis._imageData = null;\n\t\tthis._rect = null;\n\t\tthis._transparent = null;\n\t\tthis._locked = null;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic lock()\n\t{\n\t\tthis._locked = true;\n\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic unlock()\n\t{\n\t\tthis._locked = false;\n\n\t\tif (this._imageData) {\n\t\t\tthis._context.putImageData(this._imageData, 0, 0); // at coords 0,0\n\t\t\tthis._imageData = null;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param x\n\t * @param y\n\t * @param color\n\t */\n\tpublic getPixel(x, y):number\n\t{\n\t\tvar r:number;\n\t\tvar g:number;\n\t\tvar b:number;\n\t\tvar a:number;\n\n\t\tif (!this._locked) {\n\t\t\tvar pixelData:ImageData = this._context.getImageData(x, y, 1, 1);\n\n\t\t\tr = pixelData.data[0];\n\t\t\tg = pixelData.data[1];\n\t\t\tb = pixelData.data[2];\n\t\t\ta = pixelData.data[3];\n\n\t\t} else {\n\t\t\tvar index:number = (x + y*this._imageCanvas.width)*4;\n\n\t\t\tif (!this._imageData)\n\t\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\n\t\t\tr = this._imageData.data[index + 0];\n\t\t\tg = this._imageData.data[index + 1];\n\t\t\tb = this._imageData.data[index + 2];\n\t\t\ta = this._imageData.data[index + 3];\n\n\t\t}\n\n\t\tif (!this._locked) {\n\t\t\tthis._imageData = null;\n\t\t}\n\n\t\treturn (a << 24) | (r << 16) | (g << 8) | b;\n\t}\n\n\t/**\n\t *\n\t * @param x\n\t * @param y\n\t * @param color\n\t */\n\tpublic setPixel(x, y, color:number)\n\t{\n\t\tvar argb:number[] = ColorUtils.float32ColorToARGB(color);\n\n\t\tif (!this._locked)\n\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\n\t\tif (this._imageData) {\n\t\t\tvar index:number = (x + y*this._imageCanvas.width)*4;\n\n\t\t\tthis._imageData.data[index + 0] = argb[1];\n\t\t\tthis._imageData.data[index + 1] = argb[2];\n\t\t\tthis._imageData.data[index + 2] = argb[3];\n\t\t\tthis._imageData.data[index + 3] = 255;\n\t\t}\n\n\t\tif (!this._locked) {\n\t\t\tthis._context.putImageData(this._imageData, 0, 0);\n\t\t\tthis._imageData = null;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param rect\n\t * @param inputByteArray\n\t */\n\tpublic setPixels(rect:Rectangle, inputByteArray:ByteArray)\n\t{\n\t\tif (!this._locked)\n\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\n\t\tif (this._imageData) {\n\t\t\tinputByteArray.position = 0;\n\t\t\tvar i:number /*uint*/, j:number /*uint*/, index:number /*uint*/;\n\t\t\tfor (i = 0; i < rect.width; ++i) {\n\t\t\t\tfor (j = 0; j < rect.height; ++j) {\n\t\t\t\t\tindex = (i + rect.x + (j + rect.y)*this._imageCanvas.width)*4;\n\n\t\t\t\t\tthis._imageData.data[index + 0] = inputByteArray.readUnsignedInt();\n\t\t\t\t\tthis._imageData.data[index + 1] = inputByteArray.readUnsignedInt();\n\t\t\t\t\tthis._imageData.data[index + 2] = inputByteArray.readUnsignedInt();\n\t\t\t\t\tthis._imageData.data[index + 3] = inputByteArray.readUnsignedInt();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this._locked) {\n\t\t\tthis._context.putImageData(this._imageData, 0, 0);\n\t\t\tthis._imageData = null;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param x\n\t * @param y\n\t * @param color\n\t */\n\tpublic setPixel32(x, y, color:number)\n\t{\n\t\tvar argb:number[] = ColorUtils.float32ColorToARGB(color);\n\n\t\tif (!this._locked)\n\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\n\t\tif (this._imageData) {\n\t\t\tvar index:number = (x + y*this._imageCanvas.width)*4;\n\n\t\t\tthis._imageData.data[index + 0] = argb[1];\n\t\t\tthis._imageData.data[index + 1] = argb[2];\n\t\t\tthis._imageData.data[index + 2] = argb[3];\n\t\t\tthis._imageData.data[index + 3] = argb[0];\n\t\t}\n\n\t\tif (!this._locked) {\n\t\t\tthis._context.putImageData(this._imageData, 0, 0);\n\t\t\tthis._imageData = null;\n\t\t}\n\t}\n\n\tpublic setVector(rect:Rectangle, inputVector:Array)\n\t{\n\t\tif (!this._locked)\n\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\n\t\tif (this._imageData) {\n\t\t\tvar i:number /*uint*/, j:number /*uint*/, index:number /*uint*/, argb:number[] /*uint*/;\n\t\t\tfor (i = 0; i < rect.width; ++i) {\n\t\t\t\tfor (j = 0; j < rect.height; ++j) {\n\t\t\t\t\targb = ColorUtils.float32ColorToARGB(inputVector[i + j*rect.width]);\n\t\t\t\t\tindex = (i + rect.x + (j + rect.y)*this._imageCanvas.width)*4;\n\n\t\t\t\t\tthis._imageData.data[index + 0] = argb[1];\n\t\t\t\t\tthis._imageData.data[index + 1] = argb[2];\n\t\t\t\t\tthis._imageData.data[index + 2] = argb[3];\n\t\t\t\t\tthis._imageData.data[index + 3] = argb[0];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this._locked) {\n\t\t\tthis._context.putImageData(this._imageData, 0, 0);\n\t\t\tthis._imageData = null;\n\t\t}\n\t}\n\n\t/**\n\t * Copy an HTMLImageElement or BitmapData object\n\t *\n\t * @param img {BitmapData} / {HTMLImageElement}\n\t * @param sourceRect - source rectange to copy from\n\t * @param destRect - destinatoin rectange to copy to\n\t */\n\tpublic drawImage(img:BitmapData, sourceRect:Rectangle, destRect:Rectangle);\n\tpublic drawImage(img:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle);\n\tpublic drawImage(img:any, sourceRect:Rectangle, destRect:Rectangle)\n\t{\n\t\tif (this._locked) {\n\t\t\t// If canvas is locked:\n\t\t\t//\n\t\t\t// 1) copy image data back to canvas\n\t\t\t// 2) draw object\n\t\t\t// 3) read _imageData back out\n\n\t\t\tif (this._imageData) {\n\t\t\t\tthis._context.putImageData(this._imageData, 0, 0); // at coords 0,0\n\t\t\t}\n\n\t\t\tthis._drawImage(img, sourceRect, destRect);\n\n\t\t\tif (this._imageData) {\n\t\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\t\t\t}\n\n\t\t} else {\n\t\t\tthis._drawImage(img, sourceRect, destRect)\n\t\t}\n\t}\n\n\tprivate _drawImage(img:BitmapData, sourceRect:Rectangle, destRect:Rectangle);\n\tprivate _drawImage(img:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle);\n\tprivate _drawImage(img:any, sourceRect:Rectangle, destRect:Rectangle)\n\t{\n\t\tif (img instanceof BitmapData)\n\t\t\tthis._context.drawImage(img.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height);\n\t\telse if (img instanceof HTMLImageElement)\n\t\t\tthis._context.drawImage(img, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height);\n\t}\n\n\t/**\n\t *\n\t * @param bmpd\n\t * @param sourceRect\n\t * @param destRect\n\t */\n\tpublic copyPixels(bmpd:BitmapData, sourceRect:Rectangle, destRect:Rectangle);\n\tpublic copyPixels(bmpd:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle);\n\tpublic copyPixels(bmpd:any, sourceRect:Rectangle, destRect:Rectangle)\n\t{\n\n\t\tif (this._locked) {\n\n\t\t\t// If canvas is locked:\n\t\t\t//\n\t\t\t// 1) copy image data back to canvas\n\t\t\t// 2) draw object\n\t\t\t// 3) read _imageData back out\n\n\t\t\tif (this._imageData) {\n\t\t\t\tthis._context.putImageData(this._imageData, 0, 0); // at coords 0,0\n\t\t\t}\n\n\t\t\tthis._copyPixels(bmpd, sourceRect, destRect);\n\n\t\t\tif (this._imageData) {\n\t\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._copyPixels(bmpd, sourceRect, destRect);\n\t\t}\n\n\t}\n\n\tprivate _copyPixels(bmpd:BitmapData, sourceRect:Rectangle, destRect:Rectangle);\n\tprivate _copyPixels(bmpd:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle);\n\tprivate _copyPixels(bmpd:any, sourceRect:Rectangle, destRect:Rectangle)\n\t{\n\n\t\tif (bmpd instanceof BitmapData) {\n\t\t\tthis._context.drawImage(bmpd.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height);\n\t\t} else if (bmpd instanceof HTMLImageElement) {\n\t\t\tthis._context.drawImage(bmpd, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height);\n\t\t}\n\n\t}\n\n\t/**\n\t *\n\t * @param rect\n\t * @param color\n\t */\n\tpublic fillRect(rect:Rectangle, color:number)\n\t{\n\t\tif (this._locked) {\n\n\t\t\t// If canvas is locked:\n\t\t\t//\n\t\t\t// 1) copy image data back to canvas\n\t\t\t// 2) apply fill\n\t\t\t// 3) read _imageData back out\n\n\t\t\tif (this._imageData)\n\t\t\t\tthis._context.putImageData(this._imageData, 0, 0); // at coords 0,0\n\n\t\t\tthis._context.fillStyle = this.hexToRGBACSS(color);\n\t\t\tthis._context.fillRect(rect.x, rect.y, rect.width, rect.height);\n\n\t\t\tif (this._imageData)\n\t\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\t\t} else {\n\t\t\tthis._context.fillStyle = this.hexToRGBACSS(color);\n\t\t\tthis._context.fillRect(rect.x, rect.y, rect.width, rect.height);\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param source\n\t * @param matrix\n\t */\n\tpublic draw(source:BitmapData, matrix?:Matrix);\n\tpublic draw(source:HTMLImageElement, matrix?:Matrix);\n\tpublic draw(source:any, matrix?:Matrix)\n\t{\n\t\tif (this._locked) {\n\n\t\t\t// If canvas is locked:\n\t\t\t//\n\t\t\t// 1) copy image data back to canvas\n\t\t\t// 2) draw object\n\t\t\t// 3) read _imageData back out\n\n\t\t\tif (this._imageData)\n\t\t\t\tthis._context.putImageData(this._imageData, 0, 0); // at coords 0,0\n\n\t\t\tthis._draw(source, matrix);\n\n\t\t\tif (this._imageData)\n\t\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\t\t} else {\n\t\t\tthis._draw(source, matrix);\n\t\t}\n\t}\n\n\tprivate _draw(source:BitmapData, matrix:Matrix);\n\tprivate _draw(source:HTMLImageElement, matrix:Matrix);\n\tprivate _draw(source:any, matrix:Matrix)\n\t{\n\t\tif (source instanceof BitmapData) {\n\t\t\tthis._context.save();\n\n\t\t\tif (matrix != null)\n\t\t\t\tthis._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n\n\t\t\tthis._context.drawImage(source.canvas, 0, 0)\n\t\t\tthis._context.restore();\n\n\t\t} else if (source instanceof HTMLImageElement) {\n\t\t\tthis._context.save();\n\n\t\t\tif (matrix != null)\n\t\t\t\tthis._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);\n\n\t\t\tthis._context.drawImage(source, 0, 0)\n\t\t\tthis._context.restore();\n\t\t}\n\n\t}\n\n\tpublic copyChannel(sourceBitmap:BitmapData, sourceRect:Rectangle, destPoint:Point, sourceChannel:number, destChannel:number)\n\t{\n\t\tvar imageData:ImageData = sourceBitmap.imageData;\n\n\t\tif (!this._locked)\n\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\n\t\tif (this._imageData) {\n\t\t\tvar sourceData:Uint8Array = sourceBitmap.imageData.data;\n\t\t\tvar destData:Uint8Array = this._imageData.data;\n\n\t\t\tvar sourceOffset:number = Math.round(Math.log(sourceChannel)/Math.log(2));\n\t\t\tvar destOffset:number = Math.round(Math.log(destChannel)/Math.log(2));\n\n\t\t\tvar i:number /*uint*/, j:number /*uint*/, sourceIndex:number /*uint*/, destIndex:number /*uint*/;\n\t\t\tfor (i = 0; i < sourceRect.width; ++i) {\n\t\t\t\tfor (j = 0; j < sourceRect.height; ++j) {\n\t\t\t\t\tsourceIndex = (i + sourceRect.x + (j + sourceRect.y)*sourceBitmap.width)*4;\n\t\t\t\t\tdestIndex = (i + destPoint.x + (j + destPoint.y)*this.width)*4;\n\n\t\t\t\t\tdestData[destIndex + destOffset] = sourceData[sourceIndex + sourceOffset];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this._locked) {\n\t\t\tthis._context.putImageData(this._imageData, 0, 0);\n\t\t\tthis._imageData = null;\n\t\t}\n\t}\n\n\tpublic colorTransform(rect:Rectangle, colorTransform:ColorTransform)\n\t{\n\t\tif (!this._locked)\n\t\t\tthis._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height);\n\n\t\tif (this._imageData) {\n\t\t\tvar data:Uint8Array = this._imageData.data;\n\n\t\t\tvar i:number /*uint*/, j:number /*uint*/, index:number /*uint*/;\n\t\t\tfor (i = 0; i < rect.width; ++i) {\n\t\t\t\tfor (j = 0; j < rect.height; ++j) {\n\t\t\t\t\tindex = (i + rect.x + (j + rect.y)*this.width)*4;\n\n\t\t\t\t\tdata[index] = data[index]*colorTransform.redMultiplier + colorTransform.redOffset;\n\t\t\t\t\tdata[index + 1] = data[index + 1]*colorTransform.greenMultiplier + colorTransform.greenOffset;\n\t\t\t\t\tdata[index + 2] = data[index + 2]*colorTransform.blueMultiplier + colorTransform.blueOffset;\n\t\t\t\t\tdata[index + 3] = data[index + 3]*colorTransform.alphaMultiplier + colorTransform.alphaOffset;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (!this._locked) {\n\t\t\tthis._context.putImageData(this._imageData, 0, 0);\n\t\t\tthis._imageData = null;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param {ImageData}\n\t */\n\tpublic set imageData(value:ImageData)\n\t{\n\t\tthis._context.putImageData(value, 0, 0);\n\t}\n\n\t/**\n\t *\n\t * @returns {ImageData}\n\t */\n\tpublic get imageData():ImageData\n\t{\n\t\treturn this._context.getImageData(0, 0, this._rect.width, this._rect.height)\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get width():number\n\t{\n\t\treturn this._imageCanvas.width;\n\t}\n\n\t/**\n\t *\n\t * @param {number}\n\t */\n\tpublic set width(value:number)\n\t{\n\t\tthis._rect.width = value;\n\t\tthis._imageCanvas.width = value;\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._imageCanvas.height;\n\t}\n\n\t/**\n\t *\n\t * @param {number}\n\t */\n\tpublic set height(value:number)\n\t{\n\t\tthis._rect.height = value;\n\t\tthis._imageCanvas.height = value;\n\t}\n\n\t/**\n\t *\n\t * @param {Rectangle}\n\t */\n\tpublic get rect():Rectangle\n\t{\n\t\treturn this._rect;\n\t}\n\n\t/**\n\t *\n\t * @returns {HTMLCanvasElement}\n\t */\n\tpublic get canvas()\n\t{\n\t\treturn this._imageCanvas;\n\t}\n\n\t/**\n\t *\n\t * @returns {HTMLCanvasElement}\n\t */\n\tpublic get context():CanvasRenderingContext2D\n\t{\n\t\treturn this._context;\n\t}\n\n\t// Private\n\n\t/**\n\t * convert decimal value to Hex\n\t */\n\tprivate hexToRGBACSS(d:number):string\n\t{\n\t\tvar argb:number[] = ColorUtils.float32ColorToARGB(d);\n\n\t\tif (this._transparent == false) {\n\t\t\targb[0] = 1;\n\n\t\t\treturn 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] + ')';\n\t\t}\n\n\t\treturn 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0]/255 + ')';\n\t}\n}\n\nexport = BitmapData;", + "/**\n * A class that provides constant values for visual blend mode effects. These\n * constants are used in the following:\n *
    \n *
  • The blendMode property of the\n * flash.display.DisplayObject class.
  • \n *
  • The blendMode parameter of the draw()\n * method of the flash.display.BitmapData class
  • \n *
\n */\nclass BlendMode\n{\n\t/**\n\t * Adds the values of the constituent colors of the display object to the\n\t * colors of its background, applying a ceiling of 0xFF. This setting is\n\t * commonly used for animating a lightening dissolve between two objects.\n\t *\n\t *

For example, if the display object has a pixel with an RGB value of\n\t * 0xAAA633, and the background pixel has an RGB value of 0xDD2200, the\n\t * resulting RGB value for the displayed pixel is 0xFFC833(because 0xAA +\n\t * 0xDD > 0xFF, 0xA6 + 0x22 = 0xC8, and 0x33 + 0x00 = 0x33).

\n\t */\n\tpublic static ADD:string = \"add\";\n\n\t/**\n\t * Applies the alpha value of each pixel of the display object to the\n\t * background. This requires the blendMode property of the\n\t * parent display object be set to\n\t * away.base.BlendMode.LAYER.\n\t *\n\t *

Not supported under GPU rendering.

\n\t */\n\tpublic static ALPHA:string = \"alpha\";\n\n\t/**\n\t * Selects the darker of the constituent colors of the display object and the\n\t * colors of the background(the colors with the smaller values). This\n\t * setting is commonly used for superimposing type.\n\t *\n\t *

For example, if the display object has a pixel with an RGB value of\n\t * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the\n\t * resulting RGB value for the displayed pixel is 0xDDCC00(because 0xFF >\n\t * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

\n\t *\n\t *

Not supported under GPU rendering.

\n\t */\n\tpublic static DARKEN:string = \"darken\";\n\n\t/**\n\t * Compares the constituent colors of the display object with the colors of\n\t * its background, and subtracts the darker of the values of the two\n\t * constituent colors from the lighter value. This setting is commonly used\n\t * for more vibrant colors.\n\t *\n\t *

For example, if the display object has a pixel with an RGB value of\n\t * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the\n\t * resulting RGB value for the displayed pixel is 0x222C33(because 0xFF -\n\t * 0xDD = 0x22, 0xF8 - 0xCC = 0x2C, and 0x33 - 0x00 = 0x33).

\n\t */\n\tpublic static DIFFERENCE:string = \"difference\";\n\n\t/**\n\t * Erases the background based on the alpha value of the display object. This\n\t * process requires that the blendMode property of the parent\n\t * display object be set to flash.display.BlendMode.LAYER.\n\t *\n\t *

Not supported under GPU rendering.

\n\t */\n\tpublic static ERASE:string = \"erase\";\n\n\t/**\n\t * Adjusts the color of each pixel based on the darkness of the display\n\t * object. If the display object is lighter than 50% gray, the display object\n\t * and background colors are screened, which results in a lighter color. If\n\t * the display object is darker than 50% gray, the colors are multiplied,\n\t * which results in a darker color. This setting is commonly used for shading\n\t * effects.\n\t *\n\t *

Not supported under GPU rendering.

\n\t */\n\tpublic static HARDLIGHT:string = \"hardlight\";\n\n\t/**\n\t * Inverts the background.\n\t */\n\tpublic static INVERT:string = \"invert\";\n\n\t/**\n\t * Forces the creation of a transparency group for the display object. This\n\t * means that the display object is precomposed in a temporary buffer before\n\t * it is processed further. The precomposition is done automatically if the\n\t * display object is precached by means of bitmap caching or if the display\n\t * object is a display object container that has at least one child object\n\t * with a blendMode setting other than \"normal\".\n\t *\n\t *

Not supported under GPU rendering.

\n\t */\n\tpublic static LAYER:string = \"layer\";\n\n\t/**\n\t * Selects the lighter of the constituent colors of the display object and\n\t * the colors of the background(the colors with the larger values). This\n\t * setting is commonly used for superimposing type.\n\t *\n\t *

For example, if the display object has a pixel with an RGB value of\n\t * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the\n\t * resulting RGB value for the displayed pixel is 0xFFF833(because 0xFF >\n\t * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

\n\t *\n\t *

Not supported under GPU rendering.

\n\t */\n\tpublic static LIGHTEN:string = \"lighten\";\n\n\t/**\n\t * Multiplies the values of the display object constituent colors by the\n\t * constituent colors of the background color, and normalizes by dividing by\n\t * 0xFF, resulting in darker colors. This setting is commonly used for\n\t * shadows and depth effects.\n\t *\n\t *

For example, if a constituent color(such as red) of one pixel in the\n\t * display object and the corresponding color of the pixel in the background\n\t * both have the value 0x88, the multiplied result is 0x4840. Dividing by\n\t * 0xFF yields a value of 0x48 for that constituent color, which is a darker\n\t * shade than the color of the display object or the color of the\n\t * background.

\n\t */\n\tpublic static MULTIPLY:string = \"multiply\";\n\n\t/**\n\t * The display object appears in front of the background. Pixel values of the\n\t * display object override the pixel values of the background. Where the\n\t * display object is transparent, the background is visible.\n\t */\n\tpublic static NORMAL:string = \"normal\";\n\n\t/**\n\t * Adjusts the color of each pixel based on the darkness of the background.\n\t * If the background is lighter than 50% gray, the display object and\n\t * background colors are screened, which results in a lighter color. If the\n\t * background is darker than 50% gray, the colors are multiplied, which\n\t * results in a darker color. This setting is commonly used for shading\n\t * effects.\n\t *\n\t *

Not supported under GPU rendering.

\n\t */\n\tpublic static OVERLAY:string = \"overlay\";\n\n\t/**\n\t * Multiplies the complement(inverse) of the display object color by the\n\t * complement of the background color, resulting in a bleaching effect. This\n\t * setting is commonly used for highlights or to remove black areas of the\n\t * display object.\n\t */\n\tpublic static SCREEN:string = \"screen\";\n\n\t/**\n\t * Uses a shader to define the blend between objects.\n\t *\n\t *

Setting the blendShader property to a Shader instance\n\t * automatically sets the display object's blendMode property to\n\t * BlendMode.SHADER. If the blendMode property is\n\t * set to BlendMode.SHADER without first setting the\n\t * blendShader property, the blendMode property is\n\t * set to BlendMode.NORMAL instead. If the\n\t * blendShader property is set(which sets the\n\t * blendMode property to BlendMode.SHADER), then\n\t * later the value of the blendMode property is changed, the\n\t * blend mode can be reset to use the blend shader simply by setting the\n\t * blendMode property to BlendMode.SHADER. The\n\t * blendShader property does not need to be set again except to\n\t * change the shader that's used to define the blend mode.

\n\t *\n\t *

Not supported under GPU rendering.

\n\t */\n\tpublic static SHADER:string = \"shader\";\n\n\t/**\n\t * Subtracts the values of the constituent colors in the display object from\n\t * the values of the background color, applying a floor of 0. This setting is\n\t * commonly used for animating a darkening dissolve between two objects.\n\t *\n\t *

For example, if the display object has a pixel with an RGB value of\n\t * 0xAA2233, and the background pixel has an RGB value of 0xDDA600, the\n\t * resulting RGB value for the displayed pixel is 0x338400(because 0xDD -\n\t * 0xAA = 0x33, 0xA6 - 0x22 = 0x84, and 0x00 - 0x33 < 0x00).

\n\t */\n\tpublic static SUBTRACT:string = \"subtract\";\n}\n\nexport = BlendMode;", + "/**\n * The CapsStyle class is an enumeration of constant values that specify the\n * caps style to use in drawing lines. The constants are provided for use as\n * values in the caps parameter of the\n * flash.display.Graphics.lineStyle() method. You can specify the\n * following three types of caps:\n */\nclass CapsStyle\n{\n\t/**\n\t * Used to specify round caps in the caps parameter of the\n\t * flash.display.Graphics.lineStyle() method.\n\t */\n\tpublic static ROUND:string = \"round\";\n\n\t/**\n\t * Used to specify no caps in the caps parameter of the\n\t * flash.display.Graphics.lineStyle() method.\n\t */\n\tpublic static NONE:string = \"none\";\n\n\t/**\n\t * Used to specify square caps in the caps parameter of the\n\t * flash.display.Graphics.lineStyle() method.\n\t */\n\tpublic static SQUARE:string = \"square\";\n}\n\nexport = CapsStyle;", + "import AxisAlignedBoundingBox\t= require(\"awayjs-core/lib/bounds/AxisAlignedBoundingBox\");\nimport BoundingVolumeBase\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport DisplayObjectContainer\t= require(\"awayjs-core/lib/containers/DisplayObjectContainer\");\nimport Scene\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport ControllerBase\t\t\t= require(\"awayjs-core/lib/controllers/ControllerBase\");\nimport AlignmentMode\t\t\t= require(\"awayjs-core/lib/core/base/AlignmentMode\");\nimport BlendMode\t\t\t\t= require(\"awayjs-core/lib/core/base/BlendMode\");\nimport LoaderInfo\t\t\t\t= require(\"awayjs-core/lib/core/base/LoaderInfo\");\nimport OrientationMode\t\t\t= require(\"awayjs-core/lib/core/base/OrientationMode\");\nimport IBitmapDrawable\t\t\t= require(\"awayjs-core/lib/core/base/IBitmapDrawable\");\nimport MathConsts\t\t\t\t= require(\"awayjs-core/lib/core/geom/MathConsts\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Matrix3DUtils\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3DUtils\");\nimport Point\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport Rectangle\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport Transform\t\t\t\t= require(\"awayjs-core/lib/core/geom/Transform\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport EntityNode\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport Partition\t\t\t\t= require(\"awayjs-core/lib/core/partition/Partition\");\nimport IPickingCollider\t\t\t= require(\"awayjs-core/lib/core/pick/IPickingCollider\");\nimport PickingCollisionVO\t\t= require(\"awayjs-core/lib/core/pick/PickingCollisionVO\");\nimport IRenderable\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport Camera\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport DisplayObjectEvent\t\t= require(\"awayjs-core/lib/events/DisplayObjectEvent\");\nimport SceneEvent\t\t\t\t= require(\"awayjs-core/lib/events/SceneEvent\");\nimport PrefabBase\t\t\t\t= require(\"awayjs-core/lib/prefabs/PrefabBase\");\n\n/**\n * The DisplayObject class is the base class for all objects that can be\n * placed on the display list. The display list manages all objects displayed\n * in flash. Use the DisplayObjectContainer class to arrange the\n * display objects in the display list. DisplayObjectContainer objects can\n * have child display objects, while other display objects, such as Shape and\n * TextField objects, are \"leaf\" nodes that have only parents and siblings, no\n * children.\n *\n *

The DisplayObject class supports basic functionality like the x\n * and y position of an object, as well as more advanced properties of\n * the object such as its transformation matrix.

\n *\n *

DisplayObject is an abstract base class; therefore, you cannot call\n * DisplayObject directly. Invoking new DisplayObject() throws an\n * ArgumentError exception.

\n *\n *

All display objects inherit from the DisplayObject class.

\n *\n *

The DisplayObject class itself does not include any APIs for rendering\n * content onscreen. For that reason, if you want create a custom subclass of\n * the DisplayObject class, you will want to extend one of its subclasses that\n * do have APIs for rendering content onscreen, such as the Shape, Sprite,\n * Bitmap, SimpleButton, TextField, or MovieClip class.

\n *\n *

The DisplayObject class contains several broadcast events. Normally, the\n * target of any particular event is a specific DisplayObject instance. For\n * example, the target of an added event is the specific\n * DisplayObject instance that was added to the display list. Having a single\n * target restricts the placement of event listeners to that target and in\n * some cases the target's ancestors on the display list. With broadcast\n * events, however, the target is not a specific DisplayObject instance, but\n * rather all DisplayObject instances, including those that are not on the\n * display list. This means that you can add a listener to any DisplayObject\n * instance to listen for broadcast events. In addition to the broadcast\n * events listed in the DisplayObject class's Events table, the DisplayObject\n * class also inherits two broadcast events from the EventDispatcher class:\n * activate and deactivate.

\n *\n *

Some properties previously used in the ActionScript 1.0 and 2.0\n * MovieClip, TextField, and Button classes(such as _alpha,\n * _height, _name, _width,\n * _x, _y, and others) have equivalents in the\n * ActionScript 3.0 DisplayObject class that are renamed so that they no\n * longer begin with the underscore(_) character.

\n *\n *

For more information, see the \"Display Programming\" chapter of the\n * ActionScript 3.0 Developer's Guide.

\n * \n * @event added Dispatched when a display object is added to the\n * display list. The following methods trigger this\n * event:\n * DisplayObjectContainer.addChild(),\n * DisplayObjectContainer.addChildAt().\n * @event addedToStage Dispatched when a display object is added to the on\n * stage display list, either directly or through the\n * addition of a sub tree in which the display object\n * is contained. The following methods trigger this\n * event:\n * DisplayObjectContainer.addChild(),\n * DisplayObjectContainer.addChildAt().\n * @event enterFrame [broadcast event] Dispatched when the playhead is\n * entering a new frame. If the playhead is not\n * moving, or if there is only one frame, this event\n * is dispatched continuously in conjunction with the\n * frame rate. This event is a broadcast event, which\n * means that it is dispatched by all display objects\n * with a listener registered for this event.\n * @event exitFrame [broadcast event] Dispatched when the playhead is\n * exiting the current frame. All frame scripts have\n * been run. If the playhead is not moving, or if\n * there is only one frame, this event is dispatched\n * continuously in conjunction with the frame rate.\n * This event is a broadcast event, which means that\n * it is dispatched by all display objects with a\n * listener registered for this event.\n * @event frameConstructed [broadcast event] Dispatched after the constructors\n * of frame display objects have run but before frame\n * scripts have run. If the playhead is not moving, or\n * if there is only one frame, this event is\n * dispatched continuously in conjunction with the\n * frame rate. This event is a broadcast event, which\n * means that it is dispatched by all display objects\n * with a listener registered for this event.\n * @event removed Dispatched when a display object is about to be\n * removed from the display list. Two methods of the\n * DisplayObjectContainer class generate this event:\n * removeChild() and\n * removeChildAt().\n *\n *

The following methods of a\n * DisplayObjectContainer object also generate this\n * event if an object must be removed to make room for\n * the new object: addChild(),\n * addChildAt(), and\n * setChildIndex().

\n * @event removedFromStage Dispatched when a display object is about to be\n * removed from the display list, either directly or\n * through the removal of a sub tree in which the\n * display object is contained. Two methods of the\n * DisplayObjectContainer class generate this event:\n * removeChild() and\n * removeChildAt().\n *\n *

The following methods of a\n * DisplayObjectContainer object also generate this\n * event if an object must be removed to make room for\n * the new object: addChild(),\n * addChildAt(), and\n * setChildIndex().

\n * @event render [broadcast event] Dispatched when the display list\n * is about to be updated and rendered. This event\n * provides the last opportunity for objects listening\n * for this event to make changes before the display\n * list is rendered. You must call the\n * invalidate() method of the Stage\n * object each time you want a render\n * event to be dispatched. Render events\n * are dispatched to an object only if there is mutual\n * trust between it and the object that called\n * Stage.invalidate(). This event is a\n * broadcast event, which means that it is dispatched\n * by all display objects with a listener registered\n * for this event.\n *\n *

Note: This event is not dispatched if the\n * display is not rendering. This is the case when the\n * content is either minimized or obscured.

\n */\nclass DisplayObject extends NamedAssetBase implements IBitmapDrawable\n{\n\tprivate _loaderInfo:LoaderInfo;\n\tprivate _mouseX:number;\n\tprivate _mouseY:number;\n\tprivate _root:DisplayObjectContainer;\n\tprivate _bounds:Rectangle;\n\tprivate _boundsVisible:boolean;\n\tprivate _depth:number;\n\tprivate _height:number;\n\tprivate _width:number;\n\n\tpublic _pScene:Scene;\n\tpublic _pParent:DisplayObjectContainer;\n\tpublic _pSceneTransform:Matrix3D = new Matrix3D();\n\tpublic _pSceneTransformDirty:boolean = true;\n\tpublic _pIsEntity:boolean;\n\n\tprivate _explicitPartition:Partition;\n\tpublic _pImplicitPartition:Partition;\n\tprivate _partitionNode:EntityNode;\n\n\tprivate _sceneTransformChanged:DisplayObjectEvent;\n\tprivate _scenechanged:DisplayObjectEvent;\n\tprivate _transform:Transform;\n\tprivate _matrix3D:Matrix3D = new Matrix3D();\n\tprivate _matrix3DDirty:boolean = true;\n\n\tprivate _inverseSceneTransform:Matrix3D = new Matrix3D();\n\tprivate _inverseSceneTransformDirty:boolean = true;\n\tprivate _scenePosition:Vector3D = new Vector3D();\n\tprivate _scenePositionDirty:boolean = true;\n\tprivate _explicitVisibility:boolean = true;\n\tpublic _pImplicitVisibility:boolean = true;\n\tprivate _explicitMouseEnabled:boolean = true;\n\tpublic _pImplicitMouseEnabled:boolean = true;\n\tprivate _listenToSceneTransformChanged:boolean;\n\tprivate _listenToSceneChanged:boolean;\n\n\tprivate _positionDirty:boolean = true;\n\tprivate _rotationDirty:boolean = true;\n\tprivate _scaleDirty:boolean = true;\n\n\tprivate _positionChanged:DisplayObjectEvent;\n\tprivate _rotationChanged:DisplayObjectEvent;\n\tprivate _scaleChanged:DisplayObjectEvent;\n\n\tprivate _rotationX:number = 0;\n\tprivate _rotationY:number = 0;\n\tprivate _rotationZ:number = 0;\n\tprivate _eulers:Vector3D = new Vector3D();\n\tprivate _flipY:Matrix3D = new Matrix3D();\n\n\tprivate _listenToPositionChanged:boolean;\n\tprivate _listenToRotationChanged:boolean;\n\tprivate _listenToScaleChanged:boolean;\n\tprivate _zOffset:number = 0;\n\n\tpublic _pScaleX:number = 1;\n\tpublic _pScaleY:number = 1;\n\tpublic _pScaleZ:number = 1;\n\tprivate _x:number = 0;\n\tprivate _y:number = 0;\n\tprivate _z:number = 0;\n\tprivate _pivot:Vector3D = new Vector3D();\n\tprivate _orientationMatrix:Matrix3D = new Matrix3D();\n\tprivate _pivotZero:boolean = true;\n\tprivate _pivotDirty:boolean = true;\n\tprivate _pos:Vector3D = new Vector3D();\n\tprivate _rot:Vector3D = new Vector3D();\n\tprivate _sca:Vector3D = new Vector3D();\n\tprivate _transformComponents:Array;\n\n\tpublic _pIgnoreTransform:boolean = false;\n\n\tprivate _shaderPickingDetails:boolean;\n\n\tpublic _pPickingCollisionVO:PickingCollisionVO;\n\n\tpublic _pBounds:BoundingVolumeBase;\n\tpublic _pBoundsInvalid:boolean = true;\n\tprivate _worldBounds:BoundingVolumeBase;\n\tprivate _worldBoundsInvalid:boolean = true;\n\n\tpublic _pPickingCollider:IPickingCollider;\n\n\tpublic _pRenderables:Array = new Array();\n\n\tpublic _iSourcePrefab:PrefabBase;\n\n\t/**\n\t *\n\t */\n\tpublic alignmentMode:string = AlignmentMode.REGISTRATION_POINT;\n\n\t/**\n\t * Indicates the alpha transparency value of the object specified. Valid\n\t * values are 0(fully transparent) to 1(fully opaque). The default value is\n\t * 1. Display objects with alpha set to 0 are active,\n\t * even though they are invisible.\n\t */\n\tpublic alpha:number;\n\n\t/**\n\t * A value from the BlendMode class that specifies which blend mode to use. A\n\t * bitmap can be drawn internally in two ways. If you have a blend mode\n\t * enabled or an external clipping mask, the bitmap is drawn by adding a\n\t * bitmap-filled square shape to the vector render. If you attempt to set\n\t * this property to an invalid value, Flash runtimes set the value to\n\t * BlendMode.NORMAL.\n\t *\n\t *

The blendMode property affects each pixel of the display\n\t * object. Each pixel is composed of three constituent colors(red, green,\n\t * and blue), and each constituent color has a value between 0x00 and 0xFF.\n\t * Flash Player or Adobe AIR compares each constituent color of one pixel in\n\t * the movie clip with the corresponding color of the pixel in the\n\t * background. For example, if blendMode is set to\n\t * BlendMode.LIGHTEN, Flash Player or Adobe AIR compares the red\n\t * value of the display object with the red value of the background, and uses\n\t * the lighter of the two as the value for the red component of the displayed\n\t * color.

\n\t *\n\t *

The following table describes the blendMode settings. The\n\t * BlendMode class defines string values you can use. The illustrations in\n\t * the table show blendMode values applied to a circular display\n\t * object(2) superimposed on another display object(1).

\n\t */\n\tpublic blendMode:BlendMode;\n\n\t/**\n\t *\n\t */\n\tpublic get bounds():BoundingVolumeBase\n\t{\n\t\tif (this._pBoundsInvalid)\n\t\t\tthis.pUpdateBounds();\n\n\t\treturn this._pBounds;\n\t}\n\n\tpublic set bounds(value:BoundingVolumeBase)\n\t{\n\t\tif (this._pBounds == value)\n\t\t\treturn;\n\n\t\tthis._pBounds = value;\n\n\t\tthis._worldBounds = value.clone();\n\n\t\tthis.pInvalidateBounds();\n\n\t\tif (this._boundsVisible)\n\t\t\tthis._partitionNode._iUpdateEntityBounds();\n\t}\n\n\t/**\n\t * If set to true, NME will use the software renderer to cache\n\t * an internal bitmap representation of the display object. For native targets,\n\t * this is often much slower than the default hardware renderer. When you\n\t * are using the Flash target, this caching may increase performance for display\n\t * objects that contain complex vector content.\n\t *\n\t *

All vector data for a display object that has a cached bitmap is drawn\n\t * to the bitmap instead of the main display. If\n\t * cacheAsBitmapMatrix is null or unsupported, the bitmap is\n\t * then copied to the main display as unstretched, unrotated pixels snapped\n\t * to the nearest pixel boundaries. Pixels are mapped 1 to 1 with the parent\n\t * object. If the bounds of the bitmap change, the bitmap is recreated\n\t * instead of being stretched.

\n\t *\n\t *

If cacheAsBitmapMatrix is non-null and supported, the\n\t * object is drawn to the off-screen bitmap using that matrix and the\n\t * stretched and/or rotated results of that rendering are used to draw the\n\t * object to the main display.

\n\t *\n\t *

No internal bitmap is created unless the cacheAsBitmap\n\t * property is set to true.

\n\t *\n\t *

After you set the cacheAsBitmap property to\n\t * true, the rendering does not change, however the display\n\t * object performs pixel snapping automatically. The animation speed can be\n\t * significantly faster depending on the complexity of the vector content.\n\t *

\n\t *\n\t *

The cacheAsBitmap property is automatically set to\n\t * true whenever you apply a filter to a display object(when\n\t * its filter array is not empty), and if a display object has a\n\t * filter applied to it, cacheAsBitmap is reported as\n\t * true for that display object, even if you set the property to\n\t * false. If you clear all filters for a display object, the\n\t * cacheAsBitmap setting changes to what it was last set to.

\n\t *\n\t *

A display object does not use a bitmap even if the\n\t * cacheAsBitmap property is set to true and\n\t * instead renders from vector data in the following cases:

\n\t *\n\t *
    \n\t *
  • The bitmap is too large. In AIR 1.5 and Flash Player 10, the maximum\n\t * size for a bitmap image is 8,191 pixels in width or height, and the total\n\t * number of pixels cannot exceed 16,777,215 pixels.(So, if a bitmap image\n\t * is 8,191 pixels wide, it can only be 2,048 pixels high.) In Flash Player 9\n\t * and earlier, the limitation is is 2880 pixels in height and 2,880 pixels\n\t * in width.
  • \n\t *
  • The bitmap fails to allocate(out of memory error).
  • \n\t *
\n\t *\n\t *

The cacheAsBitmap property is best used with movie clips\n\t * that have mostly static content and that do not scale and rotate\n\t * frequently. With such movie clips, cacheAsBitmap can lead to\n\t * performance increases when the movie clip is translated(when its x\n\t * and y position is changed).

\n\t */\n\tpublic cacheAsBitmap:boolean;\n\n\t/**\n\t *\n\t */\n\tpublic castsShadows:boolean = true;\n\n\t/**\n\t * Indicates the depth of the display object, in pixels. The depth is\n\t * calculated based on the bounds of the content of the display object. When\n\t * you set the depth property, the scaleZ property\n\t * is adjusted accordingly, as shown in the following code:\n\t *\n\t *

Except for TextField and Video objects, a display object with no\n\t * content (such as an empty sprite) has a depth of 0, even if you try to\n\t * set depth to a different value.

\n\t */\n\tpublic get depth():number\n\t{\n\t\tif (this._pBoundsInvalid)\n\t\t\tthis.pUpdateBounds();\n\n\t\treturn this._depth;\n\t}\n\n\tpublic set depth(val:number)\n\t{\n\t\tif (this._depth == val)\n\t\t\treturn;\n\n\t\tthis._depth == val;\n\n\t\tthis._pScaleZ = val/this.bounds.aabb.depth;\n\n\t\tthis.invalidateScale();\n\t}\n\n\t/**\n\t * Defines the rotation of the 3d object as a Vector3D object containing euler angles for rotation around x, y and z axis.\n\t */\n\tpublic get eulers():Vector3D\n\t{\n\t\tthis._eulers.x = this._rotationX*MathConsts.RADIANS_TO_DEGREES;\n\t\tthis._eulers.y = this._rotationY*MathConsts.RADIANS_TO_DEGREES;\n\t\tthis._eulers.z = this._rotationZ*MathConsts.RADIANS_TO_DEGREES;\n\n\t\treturn this._eulers;\n\t}\n\n\tpublic set eulers(value:Vector3D)\n\t{\n\t\tthis._rotationX = value.x*MathConsts.DEGREES_TO_RADIANS;\n\t\tthis._rotationY = value.y*MathConsts.DEGREES_TO_RADIANS;\n\t\tthis._rotationZ = value.z*MathConsts.DEGREES_TO_RADIANS;\n\n\t\tthis.invalidateRotation();\n\t}\n\n\t/**\n\t * An object that can contain any extra data.\n\t */\n\tpublic extra:Object;\n\n\t/**\n\t * An indexed array that contains each filter object currently associated\n\t * with the display object. The flash.filters package contains several\n\t * classes that define specific filters you can use.\n\t *\n\t *

Filters can be applied in Flash Professional at design time, or at run\n\t * time by using ActionScript code. To apply a filter by using ActionScript,\n\t * you must make a temporary copy of the entire filters array,\n\t * modify the temporary array, then assign the value of the temporary array\n\t * back to the filters array. You cannot directly add a new\n\t * filter object to the filters array.

\n\t *\n\t *

To add a filter by using ActionScript, perform the following steps\n\t * (assume that the target display object is named\n\t * myDisplayObject):

\n\t *\n\t *
    \n\t *
  1. Create a new filter object by using the constructor method of your\n\t * chosen filter class.
  2. \n\t *
  3. Assign the value of the myDisplayObject.filters array\n\t * to a temporary array, such as one named myFilters.
  4. \n\t *
  5. Add the new filter object to the myFilters temporary\n\t * array.
  6. \n\t *
  7. Assign the value of the temporary array to the\n\t * myDisplayObject.filters array.
  8. \n\t *
\n\t *\n\t *

If the filters array is undefined, you do not need to use\n\t * a temporary array. Instead, you can directly assign an array literal that\n\t * contains one or more filter objects that you create. The first example in\n\t * the Examples section adds a drop shadow filter by using code that handles\n\t * both defined and undefined filters arrays.

\n\t *\n\t *

To modify an existing filter object, you must use the technique of\n\t * modifying a copy of the filters array:

\n\t *\n\t *
    \n\t *
  1. Assign the value of the filters array to a temporary\n\t * array, such as one named myFilters.
  2. \n\t *
  3. Modify the property by using the temporary array,\n\t * myFilters. For example, to set the quality property of the\n\t * first filter in the array, you could use the following code:\n\t * myFilters[0].quality = 1;
  4. \n\t *
  5. Assign the value of the temporary array to the filters\n\t * array.
  6. \n\t *
\n\t *\n\t *

At load time, if a display object has an associated filter, it is\n\t * marked to cache itself as a transparent bitmap. From this point forward,\n\t * as long as the display object has a valid filter list, the player caches\n\t * the display object as a bitmap. This source bitmap is used as a source\n\t * image for the filter effects. Each display object usually has two bitmaps:\n\t * one with the original unfiltered source display object and another for the\n\t * final image after filtering. The final image is used when rendering. As\n\t * long as the display object does not change, the final image does not need\n\t * updating.

\n\t *\n\t *

The flash.filters package includes classes for filters. For example, to\n\t * create a DropShadow filter, you would write:

\n\t *\n\t * @throws ArgumentError When filters includes a ShaderFilter\n\t * and the shader output type is not compatible with\n\t * this operation(the shader must specify a\n\t * pixel4 output).\n\t * @throws ArgumentError When filters includes a ShaderFilter\n\t * and the shader doesn't specify any image input or\n\t * the first input is not an image4 input.\n\t * @throws ArgumentError When filters includes a ShaderFilter\n\t * and the shader specifies an image input that isn't\n\t * provided.\n\t * @throws ArgumentError When filters includes a ShaderFilter, a\n\t * ByteArray or Vector. instance as a shader\n\t * input, and the width and\n\t * height properties aren't specified for\n\t * the ShaderInput object, or the specified values\n\t * don't match the amount of data in the input data.\n\t * See the ShaderInput.input property for\n\t * more information.\n\t */\n//\t\tpublic filters:Array;\n\n\t/**\n\t * Indicates the height of the display object, in pixels. The height is\n\t * calculated based on the bounds of the content of the display object. When\n\t * you set the height property, the scaleY property\n\t * is adjusted accordingly, as shown in the following code:\n\t *\n\t *

Except for TextField and Video objects, a display object with no\n\t * content (such as an empty sprite) has a height of 0, even if you try to\n\t * set height to a different value.

\n\t */\n\tpublic get height():number\n\t{\n\t\tif (this._pBoundsInvalid)\n\t\t\tthis.pUpdateBounds();\n\n\t\treturn this._height;\n\t}\n\n\tpublic set height(val:number)\n\t{\n\t\tif (this._height == val)\n\t\t\treturn;\n\n\t\tthis._height == val;\n\n\t\tthis._pScaleY = val/this.bounds.aabb.height;\n\n\t\tthis.invalidateScale();\n\t}\n\n\t/**\n\t * Indicates the instance container index of the DisplayObject. The object can be\n\t * identified in the child list of its parent display object container by\n\t * calling the getChildByIndex() method of the display object\n\t * container.\n\t *\n\t *

If the DisplayObject has no parent container, index defaults to 0.

\n\t */\n\tpublic get index():number\n\t{\n\t\tif (this._pParent)\n\t\t\treturn this._pParent.getChildIndex(this);\n\n\t\treturn 0;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get inverseSceneTransform():Matrix3D\n\t{\n\t\tif (this._inverseSceneTransformDirty) {\n\t\t\tthis._inverseSceneTransform.copyFrom(this.sceneTransform);\n\t\t\tthis._inverseSceneTransform.invert();\n\t\t\tthis._inverseSceneTransformDirty = false;\n\t\t}\n\t\treturn this._inverseSceneTransform;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get ignoreTransform():boolean\n\t{\n\t\treturn this._pIgnoreTransform;\n\t}\n\n\tpublic set ignoreTransform(value:boolean)\n\t{\n\t\tif (this._pIgnoreTransform == value)\n\t\t\treturn;\n\n\t\tthis._pIgnoreTransform = value;\n\n\t\tif (value) {\n\t\t\tthis._pSceneTransform.identity();\n\t\t\tthis._scenePosition.setTo(0, 0, 0);\n\t\t}\n\n\t\tthis.pInvalidateSceneTransform();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get isEntity()\n\t{\n\t\treturn this._pIsEntity;\n\t}\n\t/**\n\t * Returns a LoaderInfo object containing information about loading the file\n\t * to which this display object belongs. The loaderInfo property\n\t * is defined only for the root display object of a SWF file or for a loaded\n\t * Bitmap(not for a Bitmap that is drawn with ActionScript). To find the\n\t * loaderInfo object associated with the SWF file that contains\n\t * a display object named myDisplayObject, use\n\t * myDisplayObject.root.loaderInfo.\n\t *\n\t *

A large SWF file can monitor its download by calling\n\t * this.root.loaderInfo.addEventListener(Event.COMPLETE,\n\t * func).

\n\t */\n\tpublic get loaderInfo():LoaderInfo\n\t{\n\t\treturn this._loaderInfo;\n\t}\n\n\t/**\n\t * The calling display object is masked by the specified mask\n\t * object. To ensure that masking works when the Stage is scaled, the\n\t * mask display object must be in an active part of the display\n\t * list. The mask object itself is not drawn. Set\n\t * mask to null to remove the mask.\n\t *\n\t *

To be able to scale a mask object, it must be on the display list. To\n\t * be able to drag a mask Sprite object(by calling its\n\t * startDrag() method), it must be on the display list. To call\n\t * the startDrag() method for a mask sprite based on a\n\t * mouseDown event being dispatched by the sprite, set the\n\t * sprite's buttonMode property to true.

\n\t *\n\t *

When display objects are cached by setting the\n\t * cacheAsBitmap property to true an the\n\t * cacheAsBitmapMatrix property to a Matrix object, both the\n\t * mask and the display object being masked must be part of the same cached\n\t * bitmap. Thus, if the display object is cached, then the mask must be a\n\t * child of the display object. If an ancestor of the display object on the\n\t * display list is cached, then the mask must be a child of that ancestor or\n\t * one of its descendents. If more than one ancestor of the masked object is\n\t * cached, then the mask must be a descendent of the cached container closest\n\t * to the masked object in the display list.

\n\t *\n\t *

Note: A single mask object cannot be used to mask\n\t * more than one calling display object. When the mask is\n\t * assigned to a second display object, it is removed as the mask of the\n\t * first object, and that object's mask property becomes\n\t * null.

\n\t */\n\tpublic mask:DisplayObject;\n\n\t/**\n\t * Specifies whether this object receives mouse, or other user input,\n\t * messages. The default value is true, which means that by\n\t * default any InteractiveObject instance that is on the display list\n\t * receives mouse events or other user input events. If\n\t * mouseEnabled is set to false, the instance does\n\t * not receive any mouse events(or other user input events like keyboard\n\t * events). Any children of this instance on the display list are not\n\t * affected. To change the mouseEnabled behavior for all\n\t * children of an object on the display list, use\n\t * flash.display.DisplayObjectContainer.mouseChildren.\n\t *\n\t *

No event is dispatched by setting this property. You must use the\n\t * addEventListener() method to create interactive\n\t * functionality.

\n\t */\n\tpublic get mouseEnabled():boolean\n\t{\n\t\treturn this._explicitMouseEnabled;\n\t}\n\n\tpublic set mouseEnabled(value:boolean)\n\t{\n\t\tif (this._explicitMouseEnabled == value)\n\t\t\treturn;\n\n\t\tthis._explicitMouseEnabled = value;\n\n\t\tthis._pUpdateImplicitMouseEnabled(this._pParent? this._pParent.mouseChildren : true);\n\t}\n\n\n\t/**\n\t * Indicates the x coordinate of the mouse or user input device position, in\n\t * pixels.\n\t *\n\t *

Note: For a DisplayObject that has been rotated, the returned x\n\t * coordinate will reflect the non-rotated object.

\n\t */\n\tpublic get mouseX():number\n\t{\n\t\treturn this._mouseX;\n\t}\n\n\t/**\n\t * Indicates the y coordinate of the mouse or user input device position, in\n\t * pixels.\n\t *\n\t *

Note: For a DisplayObject that has been rotated, the returned y\n\t * coordinate will reflect the non-rotated object.

\n\t */\n\tpublic get mouseY():number\n\t{\n\t\treturn this._mouseY;\n\t}\n\n\t/**\n\t * Indicates the instance name of the DisplayObject. The object can be\n\t * identified in the child list of its parent display object container by\n\t * calling the getChildByName() method of the display object\n\t * container.\n\t *\n\t * @throws IllegalOperationError If you are attempting to set this property\n\t * on an object that was placed on the timeline\n\t * in the Flash authoring tool.\n\t */\n\tpublic name:string;\n\n\t/**\n\t *\n\t */\n\tpublic orientationMode:string = OrientationMode.DEFAULT;\n\n\t/**\n\t * Indicates the DisplayObjectContainer object that contains this display\n\t * object. Use the parent property to specify a relative path to\n\t * display objects that are above the current display object in the display\n\t * list hierarchy.\n\t *\n\t *

You can use parent to move up multiple levels in the\n\t * display list as in the following:

\n\t *\n\t * @throws SecurityError The parent display object belongs to a security\n\t * sandbox to which you do not have access. You can\n\t * avoid this situation by having the parent movie call\n\t * the Security.allowDomain() method.\n\t */\n\tpublic get parent():DisplayObjectContainer\n\t{\n\t\treturn this._pParent;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get partition():Partition\n\t{\n\t\treturn this._explicitPartition;\n\t}\n\n\tpublic set partition(value:Partition)\n\t{\n\t\tif (this._explicitPartition == value)\n\t\t\treturn;\n\n\t\tif (this._pScene && this._explicitPartition)\n\t\t\tthis._pScene.iUnregisterPartition(this._explicitPartition);\n\n\t\tthis._explicitPartition = value;\n\n\t\tif (this._pScene && value)\n\t\t\tthis._pScene.iRegisterPartition(value);\n\n\t\tthis._pUpdateImplicitPartition(this._pParent? this._pParent._iAssignedPartition : null);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get partitionNode():EntityNode\n\t{\n\t\tif (!this._partitionNode)\n\t\t\tthis._partitionNode = this.pCreateEntityPartitionNode();\n\n\t\treturn this._partitionNode;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get pickingCollider():IPickingCollider\n\t{\n\t\treturn this._pPickingCollider;\n\t}\n\n\tpublic set pickingCollider(value:IPickingCollider)\n\t{\n\t\tthis._pPickingCollider = value;\n\t}\n\n\t/**\n\t * Defines the local point around which the object rotates.\n\t */\n\tpublic get pivot():Vector3D\n\t{\n\t\treturn this._pivot;\n\t}\n\n\n\tpublic set pivot(pivot:Vector3D)\n\t{\n\t\tthis._pivot = pivot.clone();\n\n\t\tthis.invalidatePivot();\n\t}\n\n\t/**\n\t * For a display object in a loaded SWF file, the root property\n\t * is the top-most display object in the portion of the display list's tree\n\t * structure represented by that SWF file. For a Bitmap object representing a\n\t * loaded image file, the root property is the Bitmap object\n\t * itself. For the instance of the main class of the first SWF file loaded,\n\t * the root property is the display object itself. The\n\t * root property of the Stage object is the Stage object itself.\n\t * The root property is set to null for any display\n\t * object that has not been added to the display list, unless it has been\n\t * added to a display object container that is off the display list but that\n\t * is a child of the top-most display object in a loaded SWF file.\n\t *\n\t *

For example, if you create a new Sprite object by calling the\n\t * Sprite() constructor method, its root property\n\t * is null until you add it to the display list(or to a display\n\t * object container that is off the display list but that is a child of the\n\t * top-most display object in a SWF file).

\n\t *\n\t *

For a loaded SWF file, even though the Loader object used to load the\n\t * file may not be on the display list, the top-most display object in the\n\t * SWF file has its root property set to itself. The Loader\n\t * object does not have its root property set until it is added\n\t * as a child of a display object for which the root property is\n\t * set.

\n\t */\n\tpublic get root():DisplayObjectContainer\n\t{\n\t\treturn this._root;\n\t}\n\n\t/**\n\t * Indicates the rotation of the DisplayObject instance, in degrees, from its\n\t * original orientation. Values from 0 to 180 represent clockwise rotation;\n\t * values from 0 to -180 represent counterclockwise rotation. Values outside\n\t * this range are added to or subtracted from 360 to obtain a value within\n\t * the range. For example, the statement my_video.rotation = 450\n\t * is the same as my_video.rotation = 90.\n\t */\n\tpublic rotation:number; //TODO\n\n\t/**\n\t * Indicates the x-axis rotation of the DisplayObject instance, in degrees,\n\t * from its original orientation relative to the 3D parent container. Values\n\t * from 0 to 180 represent clockwise rotation; values from 0 to -180\n\t * represent counterclockwise rotation. Values outside this range are added\n\t * to or subtracted from 360 to obtain a value within the range.\n\t */\n\tpublic get rotationX():number\n\t{\n\t\treturn this._rotationX*MathConsts.RADIANS_TO_DEGREES;\n\t}\n\n\tpublic set rotationX(val:number)\n\t{\n\t\tif (this.rotationX == val)\n\t\t\treturn;\n\n\t\tthis._rotationX = val*MathConsts.DEGREES_TO_RADIANS;\n\n\t\tthis.invalidateRotation();\n\t}\n\n\t/**\n\t * Indicates the y-axis rotation of the DisplayObject instance, in degrees,\n\t * from its original orientation relative to the 3D parent container. Values\n\t * from 0 to 180 represent clockwise rotation; values from 0 to -180\n\t * represent counterclockwise rotation. Values outside this range are added\n\t * to or subtracted from 360 to obtain a value within the range.\n\t */\n\tpublic get rotationY():number\n\t{\n\t\treturn this._rotationY*MathConsts.RADIANS_TO_DEGREES;\n\t}\n\n\tpublic set rotationY(val:number)\n\t{\n\t\tif (this.rotationY == val)\n\t\t\treturn;\n\n\t\tthis._rotationY = val*MathConsts.DEGREES_TO_RADIANS;\n\n\t\tthis.invalidateRotation();\n\t}\n\n\t/**\n\t * Indicates the z-axis rotation of the DisplayObject instance, in degrees,\n\t * from its original orientation relative to the 3D parent container. Values\n\t * from 0 to 180 represent clockwise rotation; values from 0 to -180\n\t * represent counterclockwise rotation. Values outside this range are added\n\t * to or subtracted from 360 to obtain a value within the range.\n\t */\n\tpublic get rotationZ():number\n\t{\n\t\treturn this._rotationZ*MathConsts.RADIANS_TO_DEGREES;\n\t}\n\n\tpublic set rotationZ(val:number)\n\t{\n\t\tif (this.rotationZ == val)\n\t\t\treturn;\n\n\t\tthis._rotationZ = val*MathConsts.DEGREES_TO_RADIANS;\n\n\t\tthis.invalidateRotation();\n\t}\n\n\t/**\n\t * The current scaling grid that is in effect. If set to null,\n\t * the entire display object is scaled normally when any scale transformation\n\t * is applied.\n\t *\n\t *

When you define the scale9Grid property, the display\n\t * object is divided into a grid with nine regions based on the\n\t * scale9Grid rectangle, which defines the center region of the\n\t * grid. The eight other regions of the grid are the following areas:

\n\t *\n\t *
    \n\t *
  • The upper-left corner outside of the rectangle
  • \n\t *
  • The area above the rectangle
  • \n\t *
  • The upper-right corner outside of the rectangle
  • \n\t *
  • The area to the left of the rectangle
  • \n\t *
  • The area to the right of the rectangle
  • \n\t *
  • The lower-left corner outside of the rectangle
  • \n\t *
  • The area below the rectangle
  • \n\t *
  • The lower-right corner outside of the rectangle
  • \n\t *
\n\t *\n\t *

You can think of the eight regions outside of the center(defined by\n\t * the rectangle) as being like a picture frame that has special rules\n\t * applied to it when scaled.

\n\t *\n\t *

When the scale9Grid property is set and a display object\n\t * is scaled, all text and gradients are scaled normally; however, for other\n\t * types of objects the following rules apply:

\n\t *\n\t *
    \n\t *
  • Content in the center region is scaled normally.
  • \n\t *
  • Content in the corners is not scaled.
  • \n\t *
  • Content in the top and bottom regions is scaled horizontally only.\n\t * Content in the left and right regions is scaled vertically only.
  • \n\t *
  • All fills(including bitmaps, video, and gradients) are stretched to\n\t * fit their shapes.
  • \n\t *
\n\t *\n\t *

If a display object is rotated, all subsequent scaling is normal(and\n\t * the scale9Grid property is ignored).

\n\t *\n\t *

For example, consider the following display object and a rectangle that\n\t * is applied as the display object's scale9Grid:

\n\t *\n\t *

A common use for setting scale9Grid is to set up a display\n\t * object to be used as a component, in which edge regions retain the same\n\t * width when the component is scaled.

\n\t *\n\t * @throws ArgumentError If you pass an invalid argument to the method.\n\t */\n\tpublic scale9Grid:Rectangle;\n\n\t/**\n\t * Indicates the horizontal scale(percentage) of the object as applied from\n\t * the registration point. The default registration point is(0,0). 1.0\n\t * equals 100% scale.\n\t *\n\t *

Scaling the local coordinate system changes the x and\n\t * y property values, which are defined in whole pixels.

\n\t */\n\tpublic get scaleX():number\n\t{\n\t\treturn this._pScaleX;\n\t}\n\n\tpublic set scaleX(val:number)\n\t{\n\t\tif (this._pScaleX == val)\n\t\t\treturn;\n\n\t\tthis._pScaleX = val;\n\n\t\tthis.invalidateScale();\n\t}\n\n\t/**\n\t * Indicates the vertical scale(percentage) of an object as applied from the\n\t * registration point of the object. The default registration point is(0,0).\n\t * 1.0 is 100% scale.\n\t *\n\t *

Scaling the local coordinate system changes the x and\n\t * y property values, which are defined in whole pixels.

\n\t */\n\tpublic get scaleY():number\n\t{\n\t\treturn this._pScaleY;\n\t}\n\n\tpublic set scaleY(val:number)\n\t{\n\t\tif (this._pScaleY == val)\n\t\t\treturn;\n\n\t\tthis._pScaleY = val;\n\n\t\tthis.invalidateScale();\n\t}\n\n\t/**\n\t * Indicates the depth scale(percentage) of an object as applied from the\n\t * registration point of the object. The default registration point is(0,0).\n\t * 1.0 is 100% scale.\n\t *\n\t *

Scaling the local coordinate system changes the x,\n\t * y and z property values, which are defined in\n\t * whole pixels.

\n\t */\n\tpublic get scaleZ():number\n\t{\n\t\treturn this._pScaleZ;\n\t}\n\n\tpublic set scaleZ(val:number)\n\t{\n\t\tif (this._pScaleZ == val)\n\t\t\treturn;\n\n\t\tthis._pScaleZ = val;\n\n\t\tthis.invalidateScale();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get scene():Scene\n\t{\n\t\treturn this._pScene;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get scenePosition():Vector3D\n\t{\n\t\tif (this._scenePositionDirty) {\n\t\t\tif (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) {\n\t\t\t\tvar pivotScale:Vector3D = new Vector3D(this._pivot.x/this._pScaleX, this._pivot.y/this._pScaleY, this._pivot.z/this._pScaleZ)\n\t\t\t\t\tthis._scenePosition = this.sceneTransform.transformVector(pivotScale);\n\t\t\t\t//this._scenePosition.decrementBy(new Vector3D(this._pivot.x*this._pScaleX, this._pivot.y*this._pScaleY, this._pivot.z*this._pScaleZ));\n\t\t\t} else {\n\t\t\t\tthis.sceneTransform.copyColumnTo(3, this._scenePosition);\n\t\t\t}\n\n\t\t\tthis._scenePositionDirty = false;\n\t\t}\n\t\treturn this._scenePosition;\n\t}\n\n\tpublic get sceneTransform():Matrix3D\n\t{\n\t\tif (this._pSceneTransformDirty)\n\t\t\tthis.pUpdateSceneTransform();\n\n\t\treturn this._pSceneTransform;\n\t}\n\n\t/**\n\t * The scroll rectangle bounds of the display object. The display object is\n\t * cropped to the size defined by the rectangle, and it scrolls within the\n\t * rectangle when you change the x and y properties\n\t * of the scrollRect object.\n\t *\n\t *

The properties of the scrollRect Rectangle object use the\n\t * display object's coordinate space and are scaled just like the overall\n\t * display object. The corner bounds of the cropped window on the scrolling\n\t * display object are the origin of the display object(0,0) and the point\n\t * defined by the width and height of the rectangle. They are not centered\n\t * around the origin, but use the origin to define the upper-left corner of\n\t * the area. A scrolled display object always scrolls in whole pixel\n\t * increments.

\n\t *\n\t *

You can scroll an object left and right by setting the x\n\t * property of the scrollRect Rectangle object. You can scroll\n\t * an object up and down by setting the y property of the\n\t * scrollRect Rectangle object. If the display object is rotated\n\t * 90° and you scroll it left and right, the display object actually scrolls\n\t * up and down.

\n\t */\n\tpublic scrollRect:Rectangle;\n\n\t/**\n\t *\n\t */\n\tpublic get shaderPickingDetails():boolean\n\t{\n\t\treturn this._shaderPickingDetails;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get boundsVisible():boolean\n\t{\n\t\treturn this._boundsVisible;\n\t}\n\n\tpublic set boundsVisible(value:boolean)\n\t{\n\t\tif (value == this._boundsVisible)\n\t\t\treturn;\n\n\t\tthis._boundsVisible = value;\n\n\t\tthis._partitionNode.boundsVisible = value;\n\t}\n\n\t/**\n\t * An object with properties pertaining to a display object's matrix, color\n\t * transform, and pixel bounds. The specific properties - matrix,\n\t * colorTransform, and three read-only properties\n\t * (concatenatedMatrix, concatenatedColorTransform,\n\t * and pixelBounds) - are described in the entry for the\n\t * Transform class.\n\t *\n\t *

Each of the transform object's properties is itself an object. This\n\t * concept is important because the only way to set new values for the matrix\n\t * or colorTransform objects is to create a new object and copy that object\n\t * into the transform.matrix or transform.colorTransform property.

\n\t *\n\t *

For example, to increase the tx value of a display\n\t * object's matrix, you must make a copy of the entire matrix object, then\n\t * copy the new object into the matrix property of the transform object:

\n\t *
 public myMatrix:Matrix =\n\t * myDisplayObject.transform.matrix; myMatrix.tx += 10;\n\t * myDisplayObject.transform.matrix = myMatrix; 
\n\t *\n\t *

You cannot directly set the tx property. The following\n\t * code has no effect on myDisplayObject:

\n\t *
 myDisplayObject.transform.matrix.tx +=\n\t * 10; 
\n\t *\n\t *

You can also copy an entire transform object and assign it to another\n\t * display object's transform property. For example, the following code\n\t * copies the entire transform object from myOldDisplayObj to\n\t * myNewDisplayObj:

\n\t * myNewDisplayObj.transform = myOldDisplayObj.transform;\n\t *\n\t *

The resulting display object, myNewDisplayObj, now has the\n\t * same values for its matrix, color transform, and pixel bounds as the old\n\t * display object, myOldDisplayObj.

\n\t *\n\t *

Note that AIR for TV devices use hardware acceleration, if it is\n\t * available, for color transforms.

\n\t */\n\tpublic get transform():Transform\n\t{\n\t\treturn this._transform;\n\t}\n\n\t/**\n\t * Whether or not the display object is visible. Display objects that are not\n\t * visible are disabled. For example, if visible=false for an\n\t * InteractiveObject instance, it cannot be clicked.\n\t */\n\tpublic get visible():boolean\n\t{\n\t\treturn this._explicitVisibility;\n\t}\n\n\tpublic set visible(value:boolean)\n\t{\n\t\tif (this._explicitVisibility == value)\n\t\t\treturn;\n\n\t\tthis._explicitVisibility = value;\n\n\t\tthis._pUpdateImplicitVisibility(this._pParent? this._pParent._iIsVisible() : true);\n\t}\n\n\t/**\n\t * Indicates the width of the display object, in pixels. The width is\n\t * calculated based on the bounds of the content of the display object. When\n\t * you set the width property, the scaleX property\n\t * is adjusted accordingly, as shown in the following code:\n\t *\n\t *

Except for TextField and Video objects, a display object with no\n\t * content(such as an empty sprite) has a width of 0, even if you try to set\n\t * width to a different value.

\n\t */\n\tpublic get width():number\n\t{\n\t\tif (this._pBoundsInvalid)\n\t\t\tthis.pUpdateBounds();\n\n\t\treturn this._width;\n\t}\n\n\tpublic set width(val:number)\n\t{\n\t\tif (this._width == val)\n\t\t\treturn;\n\n\t\tthis._width == val;\n\n\t\tthis._pScaleX = val/this.bounds.aabb.width;\n\n\t\tthis.invalidateScale();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get worldBounds():BoundingVolumeBase\n\t{\n\t\t// Since this getter is invoked every iteration of the render loop, and\n\t\t// the prefab construct could affect the bounds of the entity, the prefab is\n\t\t// validated here to give it a chance to rebuild.\n\t\tif (this._iSourcePrefab)\n\t\t\tthis._iSourcePrefab._iValidate();\n\n\t\tif (this._worldBoundsInvalid) {\n\t\t\tthis._worldBoundsInvalid = false;\n\t\t\tthis._worldBounds.transformFrom(this.bounds, this.sceneTransform);\n\t\t}\n\n\t\treturn this._worldBounds;\n\t}\n\n\t/**\n\t * Indicates the x coordinate of the DisplayObject instance relative\n\t * to the local coordinates of the parent DisplayObjectContainer. If the\n\t * object is inside a DisplayObjectContainer that has transformations, it is\n\t * in the local coordinate system of the enclosing DisplayObjectContainer.\n\t * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the\n\t * DisplayObjectContainer's children inherit a coordinate system that is\n\t * rotated 90° counterclockwise. The object's coordinates refer to the\n\t * registration point position.\n\t */\n\tpublic get x():number\n\t{\n\t\treturn this._x;\n\t}\n\n\tpublic set x(val:number)\n\t{\n\t\tif (this._x == val)\n\t\t\treturn;\n\n\t\tthis._x = val;\n\n\t\tthis.invalidatePosition();\n\t}\n\n\t/**\n\t * Indicates the y coordinate of the DisplayObject instance relative\n\t * to the local coordinates of the parent DisplayObjectContainer. If the\n\t * object is inside a DisplayObjectContainer that has transformations, it is\n\t * in the local coordinate system of the enclosing DisplayObjectContainer.\n\t * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the\n\t * DisplayObjectContainer's children inherit a coordinate system that is\n\t * rotated 90° counterclockwise. The object's coordinates refer to the\n\t * registration point position.\n\t */\n\tpublic get y():number\n\t{\n\t\treturn this._y;\n\t}\n\n\tpublic set y(val:number)\n\t{\n\t\tif (this._y == val)\n\t\t\treturn;\n\n\t\tthis._y = val;\n\n\t\tthis.invalidatePosition();\n\t}\n\n\t/**\n\t * Indicates the z coordinate position along the z-axis of the DisplayObject\n\t * instance relative to the 3D parent container. The z property is used for\n\t * 3D coordinates, not screen or pixel coordinates.\n\t *\n\t *

When you set a z property for a display object to\n\t * something other than the default value of 0, a corresponding\n\t * Matrix3D object is automatically created. for adjusting a display object's\n\t * position and orientation in three dimensions. When working with the\n\t * z-axis, the existing behavior of x and y properties changes from screen or\n\t * pixel coordinates to positions relative to the 3D parent container.

\n\t *\n\t *

For example, a child of the _root at position x = 100, y =\n\t * 100, z = 200 is not drawn at pixel location(100,100). The child is drawn\n\t * wherever the 3D projection calculation puts it. The calculation is:

\n\t *\n\t *

(x~~cameraFocalLength/cameraRelativeZPosition,\n\t * y~~cameraFocalLength/cameraRelativeZPosition)

\n\t */\n\tpublic get z():number\n\t{\n\t\treturn this._z;\n\t}\n\n\tpublic set z(val:number)\n\t{\n\t\tif (this._z == val)\n\t\t\treturn;\n\n\t\tthis._z = val;\n\n\t\tthis.invalidatePosition();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get zOffset():number\n\t{\n\t\treturn this._zOffset;\n\t}\n\n\tpublic set zOffset(value:number)\n\t{\n\t\tthis._zOffset = value;\n\t}\n\n\t/**\n\t * Creates a new DisplayObject instance.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\t// Cached vector of transformation components used when\n\t\t// recomposing the transform matrix in updateTransform()\n\n\t\tthis._transformComponents = new Array(3);//_transformComponents = new Vector.(3, true);\n\n\t\tthis._transformComponents[0] = this._pos;\n\t\tthis._transformComponents[1] = this._rot;\n\t\tthis._transformComponents[2] = this._sca;\n\n\t\t//creation of associated transform object\n\t\tthis._transform = new Transform(this);\n\n\t\tthis._matrix3D.identity();\n\n\t\tthis._flipY.appendScale(1, -1, 1);\n\n\t\tthis._pBounds = this.pCreateDefaultBoundingVolume();\n\n\t\tthis._worldBounds = this.pCreateDefaultBoundingVolume();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic addEventListener(type:string, listener:Function)\n\t{\n\t\tsuper.addEventListener(type, listener);\n\n\t\tswitch (type) {\n\t\t\tcase DisplayObjectEvent.POSITION_CHANGED:\n\t\t\t\tthis._listenToPositionChanged = true;\n\t\t\t\tbreak;\n\t\t\tcase DisplayObjectEvent.ROTATION_CHANGED:\n\t\t\t\tthis._listenToRotationChanged = true;\n\t\t\t\tbreak;\n\t\t\tcase DisplayObjectEvent.SCALE_CHANGED:\n\t\t\t\tthis._listenToScaleChanged = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic clone():DisplayObject\n\t{\n\t\tvar clone:DisplayObject = new DisplayObject();\n\t\tclone.pivot = this.pivot;\n\t\tclone._iMatrix3D = this._iMatrix3D;\n\t\tclone.name = name;\n\n\t\t// todo: implement for all subtypes\n\t\treturn clone;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tif (this.parent)\n\t\t\tthis.parent.removeChild(this);\n\n\t\twhile (this._pRenderables.length)\n\t\t\tthis._pRenderables[0].dispose();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic disposeAsset()\n\t{\n\t\tthis.dispose();\n\t}\n\n\t/**\n\t * Returns a rectangle that defines the area of the display object relative\n\t * to the coordinate system of the targetCoordinateSpace object.\n\t * Consider the following code, which shows how the rectangle returned can\n\t * vary depending on the targetCoordinateSpace parameter that\n\t * you pass to the method:\n\t *\n\t *

Note: Use the localToGlobal() and\n\t * globalToLocal() methods to convert the display object's local\n\t * coordinates to display coordinates, or display coordinates to local\n\t * coordinates, respectively.

\n\t *\n\t *

The getBounds() method is similar to the\n\t * getRect() method; however, the Rectangle returned by the\n\t * getBounds() method includes any strokes on shapes, whereas\n\t * the Rectangle returned by the getRect() method does not. For\n\t * an example, see the description of the getRect() method.

\n\t *\n\t * @param targetCoordinateSpace The display object that defines the\n\t * coordinate system to use.\n\t * @return The rectangle that defines the area of the display object relative\n\t * to the targetCoordinateSpace object's coordinate\n\t * system.\n\t */\n\tpublic getBounds(targetCoordinateSpace:DisplayObject):Rectangle\n\t{\n\t\treturn this._bounds; //TODO\n\t}\n\n\t/**\n\t * Returns a rectangle that defines the boundary of the display object, based\n\t * on the coordinate system defined by the targetCoordinateSpace\n\t * parameter, excluding any strokes on shapes. The values that the\n\t * getRect() method returns are the same or smaller than those\n\t * returned by the getBounds() method.\n\t *\n\t *

Note: Use localToGlobal() and\n\t * globalToLocal() methods to convert the display object's local\n\t * coordinates to Stage coordinates, or Stage coordinates to local\n\t * coordinates, respectively.

\n\t *\n\t * @param targetCoordinateSpace The display object that defines the\n\t * coordinate system to use.\n\t * @return The rectangle that defines the area of the display object relative\n\t * to the targetCoordinateSpace object's coordinate\n\t * system.\n\t */\n\tpublic getRect(targetCoordinateSpace:DisplayObject):Rectangle\n\t{\n\t\treturn this._bounds; //TODO\n\t}\n\n\t/**\n\t * Converts the point object from the Stage(global) coordinates\n\t * to the display object's(local) coordinates.\n\t *\n\t *

To use this method, first create an instance of the Point class. The\n\t * x and y values that you assign represent global coordinates\n\t * because they relate to the origin(0,0) of the main display area. Then\n\t * pass the Point instance as the parameter to the\n\t * globalToLocal() method. The method returns a new Point object\n\t * with x and y values that relate to the origin of the display\n\t * object instead of the origin of the Stage.

\n\t *\n\t * @param point An object created with the Point class. The Point object\n\t * specifies the x and y coordinates as\n\t * properties.\n\t * @return A Point object with coordinates relative to the display object.\n\t */\n\tpublic globalToLocal(point:Point):Point\n\t{\n\t\treturn point; //TODO\n\t}\n\n\t/**\n\t * Converts a two-dimensional point from the Stage(global) coordinates to a\n\t * three-dimensional display object's(local) coordinates.\n\t *\n\t *

To use this method, first create an instance of the Point class. The x\n\t * and y values that you assign to the Point object represent global\n\t * coordinates because they are relative to the origin(0,0) of the main\n\t * display area. Then pass the Point object to the\n\t * globalToLocal3D() method as the point parameter.\n\t * The method returns three-dimensional coordinates as a Vector3D object\n\t * containing x, y, and z values that\n\t * are relative to the origin of the three-dimensional display object.

\n\t *\n\t * @param point A two dimensional Point object representing global x and y\n\t * coordinates.\n\t * @return A Vector3D object with coordinates relative to the\n\t * three-dimensional display object.\n\t */\n\tpublic globalToLocal3D(point:Point):Vector3D\n\t{\n\t\treturn new Vector3D(); //TODO\n\t}\n\n\t/**\n\t * Evaluates the bounding box of the display object to see if it overlaps or\n\t * intersects with the bounding box of the obj display object.\n\t *\n\t * @param obj The display object to test against.\n\t * @return true if the bounding boxes of the display objects\n\t * intersect; false if not.\n\t */\n\tpublic hitTestObject(obj:DisplayObject):boolean\n\t{\n\t\treturn false; //TODO\n\t}\n\n\t/**\n\t * Evaluates the display object to see if it overlaps or intersects with the\n\t * point specified by the x and y parameters. The\n\t * x and y parameters specify a point in the\n\t * coordinate space of the Stage, not the display object container that\n\t * contains the display object(unless that display object container is the\n\t * Stage).\n\t *\n\t * @param x The x coordinate to test against this object.\n\t * @param y The y coordinate to test against this object.\n\t * @param shapeFlag Whether to check against the actual pixels of the object\n\t * (true) or the bounding box\n\t * (false).\n\t * @return true if the display object overlaps or intersects\n\t * with the specified point; false otherwise.\n\t */\n\tpublic hitTestPoint(x:number, y:number, shapeFlag:boolean = false):boolean\n\t{\n\t\treturn false; //TODO\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean\n\t{\n\t\tvar localRayPosition:Vector3D = this.inverseSceneTransform.transformVector(rayPosition);\n\t\tvar localRayDirection:Vector3D = this.inverseSceneTransform.deltaTransformVector(rayDirection);\n\t\tvar pickingCollisionVO:PickingCollisionVO = this._iPickingCollisionVO;\n\n\t\tif (!pickingCollisionVO.localNormal)\n\t\t\tpickingCollisionVO.localNormal = new Vector3D();\n\n\t\tvar rayEntryDistance:number = this.bounds.rayIntersection(localRayPosition, localRayDirection, pickingCollisionVO.localNormal);\n\n\t\tif (rayEntryDistance < 0)\n\t\t\treturn false;\n\n\t\tpickingCollisionVO.rayEntryDistance = rayEntryDistance;\n\t\tpickingCollisionVO.localRayPosition = localRayPosition;\n\t\tpickingCollisionVO.localRayDirection = localRayDirection;\n\t\tpickingCollisionVO.rayPosition = rayPosition;\n\t\tpickingCollisionVO.rayDirection = rayDirection;\n\t\tpickingCollisionVO.rayOriginIsInsideBounds = rayEntryDistance == 0;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Converts a three-dimensional point of the three-dimensional display\n\t * object's(local) coordinates to a two-dimensional point in the Stage\n\t * (global) coordinates.\n\t *\n\t *

For example, you can only use two-dimensional coordinates(x,y) to draw\n\t * with the display.Graphics methods. To draw a\n\t * three-dimensional object, you need to map the three-dimensional\n\t * coordinates of a display object to two-dimensional coordinates. First,\n\t * create an instance of the Vector3D class that holds the x-, y-, and z-\n\t * coordinates of the three-dimensional display object. Then pass the\n\t * Vector3D object to the local3DToGlobal() method as the\n\t * point3d parameter. The method returns a two-dimensional Point\n\t * object that can be used with the Graphics API to draw the\n\t * three-dimensional object.

\n\t *\n\t * @param point3d A Vector3D object containing either a three-dimensional\n\t * point or the coordinates of the three-dimensional display\n\t * object.\n\t * @return A two-dimensional point representing a three-dimensional point in\n\t * two-dimensional space.\n\t */\n\tpublic local3DToGlobal(point3d:Vector3D):Point\n\t{\n\t\treturn new Point(); //TODO\n\t}\n\n\t/**\n\t * Rotates the 3d object around to face a point defined relative to the local coordinates of the parent ObjectContainer3D.\n\t *\n\t * @param target The vector defining the point to be looked at\n\t * @param upAxis An optional vector used to define the desired up orientation of the 3d object after rotation has occurred\n\t */\n\tpublic lookAt(target:Vector3D, upAxis:Vector3D = null)\n\t{\n\n\t\tvar yAxis:Vector3D;\n\t\tvar zAxis:Vector3D;\n\t\tvar xAxis:Vector3D;\n\t\tvar raw:Array;\n\n\t\tif (upAxis == null)\n\t\t\tupAxis = Vector3D.Y_AXIS;\n\t\telse\n\t\t\tupAxis.normalize();\n\n\t\tzAxis = target.subtract(this._iMatrix3D.position);\n\t\tzAxis.normalize();\n\n\t\txAxis = upAxis.crossProduct(zAxis);\n\t\txAxis.normalize();\n\n\t\tif (xAxis.length < 0.05) {\n\t\t\txAxis.x = upAxis.y;\n\t\t\txAxis.y = upAxis.x;\n\t\t\txAxis.z = 0;\n\t\t\txAxis.normalize();\n\t\t}\n\n\t\tyAxis = zAxis.crossProduct(xAxis);\n\n\t\traw = Matrix3DUtils.RAW_DATA_CONTAINER;\n\n\t\traw[0] = xAxis.x;\n\t\traw[1] = xAxis.y;\n\t\traw[2] = xAxis.z;\n\t\traw[3] = 0;\n\n\t\traw[4] = yAxis.x;\n\t\traw[5] = yAxis.y;\n\t\traw[6] = yAxis.z;\n\t\traw[7] = 0;\n\n\t\traw[8] = zAxis.x;\n\t\traw[9] = zAxis.y;\n\t\traw[10] = zAxis.z;\n\t\traw[11] = 0;\n\n\t\tvar m:Matrix3D = new Matrix3D();\n\t\tm.copyRawDataFrom(raw);\n\n\t\tvar vec:Vector3D = m.decompose()[1];\n\n\t\tthis._rotationX = vec.x;\n\t\tthis._rotationY = vec.y;\n\t\tthis._rotationZ = vec.z;\n\n\t\tthis.invalidateRotation();\n\t}\n\n\t/**\n\t * Converts the point object from the display object's(local)\n\t * coordinates to the Stage(global) coordinates.\n\t *\n\t *

This method allows you to convert any given x and y\n\t * coordinates from values that are relative to the origin(0,0) of a\n\t * specific display object(local coordinates) to values that are relative to\n\t * the origin of the Stage(global coordinates).

\n\t *\n\t *

To use this method, first create an instance of the Point class. The\n\t * x and y values that you assign represent local coordinates\n\t * because they relate to the origin of the display object.

\n\t *\n\t *

You then pass the Point instance that you created as the parameter to\n\t * the localToGlobal() method. The method returns a new Point\n\t * object with x and y values that relate to the origin of the\n\t * Stage instead of the origin of the display object.

\n\t *\n\t * @param point The name or identifier of a point created with the Point\n\t * class, specifying the x and y coordinates as\n\t * properties.\n\t * @return A Point object with coordinates relative to the Stage.\n\t */\n\tpublic localToGlobal(point:Point):Point\n\t{\n\t\treturn new Point(); //TODO\n\t}\n\n\t/**\n\t * Moves the 3d object directly to a point in space\n\t *\n\t * @param dx The amount of movement along the local x axis.\n\t * @param dy The amount of movement along the local y axis.\n\t * @param dz The amount of movement along the local z axis.\n\t */\n\n\tpublic moveTo(dx:number, dy:number, dz:number)\n\t{\n\t\tif (this._x == dx && this._y == dy && this._z == dz)\n\t\t\treturn;\n\n\t\tthis._x = dx;\n\t\tthis._y = dy;\n\t\tthis._z = dz;\n\n\t\tthis.invalidatePosition();\n\t}\n\n\t/**\n\t * Moves the local point around which the object rotates.\n\t *\n\t * @param dx The amount of movement along the local x axis.\n\t * @param dy The amount of movement along the local y axis.\n\t * @param dz The amount of movement along the local z axis.\n\t */\n\tpublic movePivot(dx:number, dy:number, dz:number)\n\t{\n\t\tif (this._pivot == null)\n\t\t\tthis._pivot = new Vector3D();\n\n\t\tthis._pivot.x += dx;\n\t\tthis._pivot.y += dy;\n\t\tthis._pivot.z += dz;\n\n\t\tthis.invalidatePivot();\n\t}\n\n\t/**\n\t * Rotates the 3d object around it's local x-axis\n\t *\n\t * @param angle The amount of rotation in degrees\n\t */\n\tpublic pitch(angle:number)\n\t{\n\t\tthis.rotate(Vector3D.X_AXIS, angle);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic getRenderSceneTransform(camera:Camera):Matrix3D\n\t{\n\t\tif (this.orientationMode == OrientationMode.CAMERA_PLANE) {\n\t\t\tvar comps:Array = camera.sceneTransform.decompose();\n\t\t\tvar scale:Vector3D = comps[2];\n\t\t\tcomps[0] = this.scenePosition;\n\t\t\tscale.x = this._pScaleX;\n\t\t\tscale.y = this._pScaleY;\n\t\t\tscale.z = this._pScaleZ;\n\t\t\tthis._orientationMatrix.recompose(comps);\n\n\t\t\t//add in case of pivot\n\t\t\tif (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT)\n\t\t\t\tthis._orientationMatrix.prependTranslation(-this._pivot.x/this._pScaleX, -this._pivot.y/this._pScaleY, -this._pivot.z/this._pScaleZ);\n\n\t\t\treturn this._orientationMatrix;\n\t\t}\n\n\t\treturn this.sceneTransform;\n\t}\n\n\t/**\n\t * Rotates the 3d object around it's local z-axis\n\t *\n\t * @param angle The amount of rotation in degrees\n\t */\n\tpublic roll(angle:number)\n\t{\n\t\tthis.rotate(Vector3D.Z_AXIS, angle);\n\t}\n\n\t/**\n\t * Rotates the 3d object around an axis by a defined angle\n\t *\n\t * @param axis The vector defining the axis of rotation\n\t * @param angle The amount of rotation in degrees\n\t */\n\tpublic rotate(axis:Vector3D, angle:number)\n\t{\n\t\tvar m:Matrix3D = new Matrix3D();\n\t\tm.prependRotation(angle, axis);\n\n\t\tvar vec:Vector3D = m.decompose()[1];\n\n\t\tthis._rotationX += vec.x;\n\t\tthis._rotationY += vec.y;\n\t\tthis._rotationZ += vec.z;\n\n\t\tthis.invalidateRotation();\n\t}\n\n\t/**\n\t * Rotates the 3d object directly to a euler angle\n\t *\n\t * @param ax The angle in degrees of the rotation around the x axis.\n\t * @param ay The angle in degrees of the rotation around the y axis.\n\t * @param az The angle in degrees of the rotation around the z axis.\n\t */\n\tpublic rotateTo(ax:number, ay:number, az:number)\n\t{\n\t\tthis._rotationX = ax*MathConsts.DEGREES_TO_RADIANS;\n\t\tthis._rotationY = ay*MathConsts.DEGREES_TO_RADIANS;\n\t\tthis._rotationZ = az*MathConsts.DEGREES_TO_RADIANS;\n\n\t\tthis.invalidateRotation();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic removeEventListener(type:string, listener:Function)\n\t{\n\t\tsuper.removeEventListener(type, listener);\n\n\t\tif (this.hasEventListener(type, listener))\n\t\t\treturn;\n\n\t\tswitch (type) {\n\t\t\tcase DisplayObjectEvent.POSITION_CHANGED:\n\t\t\t\tthis._listenToPositionChanged = false;\n\t\t\t\tbreak;\n\n\t\t\tcase DisplayObjectEvent.ROTATION_CHANGED:\n\t\t\t\tthis._listenToRotationChanged = false;\n\t\t\t\tbreak;\n\n\t\t\tcase DisplayObjectEvent.SCALE_CHANGED:\n\t\t\t\tthis._listenToScaleChanged = false;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t * Moves the 3d object along a vector by a defined length\n\t *\n\t * @param axis The vector defining the axis of movement\n\t * @param distance The length of the movement\n\t */\n\tpublic translate(axis:Vector3D, distance:number)\n\t{\n\t\tvar x:number = axis.x, y:number = axis.y, z:number = axis.z;\n\t\tvar len:number = distance/Math.sqrt(x*x + y*y + z*z);\n\n\t\tthis._x += x*len;\n\t\tthis._y += y*len;\n\t\tthis._z += z*len;\n\n\t\tthis.invalidatePosition();\n\t}\n\n\t/**\n\t * Moves the 3d object along a vector by a defined length\n\t *\n\t * @param axis The vector defining the axis of movement\n\t * @param distance The length of the movement\n\t */\n\tpublic translateLocal(axis:Vector3D, distance:number)\n\t{\n\t\tvar x:number = axis.x, y:number = axis.y, z:number = axis.z;\n\t\tvar len:number = distance/Math.sqrt(x*x + y*y + z*z);\n\n\t\tthis._iMatrix3D.prependTranslation(x*len, y*len, z*len);\n\n\t\tthis._matrix3D.copyColumnTo(3, this._pos);\n\n\t\tthis._x = this._pos.x;\n\t\tthis._y = this._pos.y;\n\t\tthis._z = this._pos.z;\n\n\t\tthis.invalidatePosition();\n\t}\n\n\t/**\n\t * Rotates the 3d object around it's local y-axis\n\t *\n\t * @param angle The amount of rotation in degrees\n\t */\n\tpublic yaw(angle:number)\n\t{\n\t\tthis.rotate(Vector3D.Y_AXIS, angle);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic _iController:ControllerBase;\n\n\t/**\n\t * @internal\n\t */\n\tpublic get _iAssignedPartition():Partition\n\t{\n\t\treturn this._pImplicitPartition;\n\t}\n\n\t/**\n\t * The transformation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D.\n\t *\n\t * @internal\n\t */\n\tpublic get _iMatrix3D():Matrix3D\n\t{\n\t\tif (this._matrix3DDirty)\n\t\t\tthis._pUpdateMatrix3D();\n\n\t\treturn this._matrix3D;\n\t}\n\n\tpublic set _iMatrix3D(val:Matrix3D)\n\t{\n\n\t\t// TODO: From AS3 - Do we still need this in JS ?\n\t\t//ridiculous matrix error\n\t\t/*\n\t\tif (!val.rawData[0]) {\n\n\t\t\tvar raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\t\tval.copyRawDataTo(raw);\n\t\t\traw[0] = this._smallestNumber;\n\t\t\tval.copyRawDataFrom(raw);\n\t\t}\n\t\t//*/\n\t\tvar elements:Array = val.decompose();\n\t\tvar vec:Vector3D;\n\n\t\tvec = elements[0];\n\n\t\tif (this._x != vec.x || this._y != vec.y || this._z != vec.z) {\n\t\t\tthis._x = vec.x;\n\t\t\tthis._y = vec.y;\n\t\t\tthis._z = vec.z;\n\n\t\t\tthis.invalidatePosition();\n\t\t}\n\n\t\tvec = elements[1];\n\n\t\tif (this._rotationX != vec.x || this._rotationY != vec.y || this._rotationZ != vec.z) {\n\t\t\tthis._rotationX = vec.x;\n\t\t\tthis._rotationY = vec.y;\n\t\t\tthis._rotationZ = vec.z;\n\n\t\t\tthis.invalidateRotation();\n\t\t}\n\n\t\tvec = elements[2];\n\n\t\tif (this._pScaleX != vec.x || this._pScaleY != vec.y || this._pScaleZ != vec.z) {\n\t\t\tthis._pScaleX = vec.x;\n\t\t\tthis._pScaleY = vec.y;\n\t\t\tthis._pScaleZ = vec.z;\n\n\t\t\tthis.invalidateScale();\n\t\t}\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic get _iPickingCollisionVO():PickingCollisionVO\n\t{\n\t\tif (!this._pPickingCollisionVO)\n\t\t\tthis._pPickingCollisionVO = new PickingCollisionVO(this);\n\n\t\treturn this._pPickingCollisionVO;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic iSetParent(value:DisplayObjectContainer)\n\t{\n\t\tthis._pParent = value;\n\n\t\tif (value) {\n\t\t\tthis._pUpdateImplicitMouseEnabled(value.mouseChildren);\n\t\t\tthis._pUpdateImplicitVisibility(value._iIsVisible());\n\t\t\tthis._pUpdateImplicitPartition(value._iAssignedPartition);\n\t\t\tthis._iSetScene(value._pScene);\n\t\t} else {\n\t\t\tthis._pUpdateImplicitMouseEnabled(true);\n\t\t\tthis._pUpdateImplicitVisibility(true);\n\t\t\tthis._pUpdateImplicitPartition(null);\n\n\t\t\tthis._iSetScene(null);\n\t\t}\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateDefaultBoundingVolume():BoundingVolumeBase\n\t{\n\t\t// point lights should be using sphere bounds\n\t\t// directional lights should be using null bounds\n\t\treturn new AxisAlignedBoundingBox();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():EntityNode\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pInvalidateBounds()\n\t{\n\t\tthis._pBoundsInvalid = true;\n\t\tthis._worldBoundsInvalid = true;\n\n\n\t\tif (this.isEntity)\n\t\t\tthis.invalidatePartition();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pInvalidateSceneTransform()\n\t{\n\t\tthis._pSceneTransformDirty = !this._pIgnoreTransform;\n\t\tthis._inverseSceneTransformDirty = !this._pIgnoreTransform;\n\t\tthis._scenePositionDirty = !this._pIgnoreTransform;\n\n\t\tthis._worldBoundsInvalid = !this._pIgnoreTransform;\n\n\t\tif (this.isEntity)\n\t\t\tthis.invalidatePartition();\n\n\t\tif (this._listenToSceneTransformChanged)\n\t\t\tthis.notifySceneTransformChange();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pUpdateBounds()\n\t{\n\t\tthis._width = this._pBounds.aabb.width*this._pScaleX;\n\t\tthis._height = this._pBounds.aabb.height*this._pScaleY;\n\t\tthis._depth = this._pBounds.aabb.depth*this._pScaleZ;\n\n\t\tthis._pBoundsInvalid = false;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateImplicitMouseEnabled(value:boolean)\n\t{\n\t\tthis._pImplicitMouseEnabled = this._explicitMouseEnabled && value;\n\n\t\t// If there is a parent and this child does not have a picking collider, use its parent's picking collider.\n\t\tif (this._pImplicitMouseEnabled && this._pParent && !this._pPickingCollider)\n\t\t\tthis._pPickingCollider = this._pParent._pPickingCollider;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateImplicitPartition(value:Partition)\n\t{\n\t\t// assign parent implicit partition if no explicit one is given\n\t\tthis._pImplicitPartition = this._explicitPartition || value;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateImplicitVisibility(value:boolean)\n\t{\n\t\tthis._pImplicitVisibility = this._explicitVisibility && value;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateMatrix3D()\n\t{\n\n\t\tthis._pos.x = this._x;\n\t\tthis._pos.y = this._y;\n\t\tthis._pos.z = this._z;\n\n\t\tthis._rot.x = this._rotationX;\n\t\tthis._rot.y = this._rotationY;\n\t\tthis._rot.z = this._rotationZ;\n\n\t\tthis._sca.x = this._pScaleX;\n\t\tthis._sca.y = this._pScaleY;\n\t\tthis._sca.z = this._pScaleZ;\n\n\t\tthis._matrix3D.recompose(this._transformComponents);\n\n\t\tif (!this._pivotZero) {\n\t\t\tthis._matrix3D.prependTranslation(-this._pivot.x/this._pScaleX, -this._pivot.y/this._pScaleY, -this._pivot.z/this._pScaleZ);\n\t\t\tif (this.alignmentMode != AlignmentMode.PIVOT_POINT)\n\t\t\t\tthis._matrix3D.appendTranslation(this._pivot.x, this._pivot.y, this._pivot.z);\n\t\t}\n\n\t\tthis._matrix3DDirty = false;\n\t\tthis._positionDirty = false;\n\t\tthis._rotationDirty = false;\n\t\tthis._scaleDirty = false;\n\t\tthis._pivotDirty = false;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pUpdateSceneTransform()\n\t{\n\t\tif (this._pParent && !this._pParent._iIsRoot) {\n\t\t\tthis._pSceneTransform.copyFrom(this._pParent.sceneTransform);\n\t\t\tthis._pSceneTransform.prepend(this._iMatrix3D);\n\t\t} else {\n\t\t\tthis._pSceneTransform.copyFrom(this._iMatrix3D);\n\t\t}\n\n\t\tthis._pSceneTransformDirty = false;\n\t}\n\n\tpublic _iAddRenderable(renderable:IRenderable):IRenderable\n\t{\n\t\tthis._pRenderables.push(renderable);\n\n\t\treturn renderable;\n\t}\n\n\n\tpublic _iRemoveRenderable(renderable:IRenderable):IRenderable\n\t{\n\t\tvar index:number = this._pRenderables.indexOf(renderable);\n\n\t\tthis._pRenderables.splice(index, 1);\n\n\t\treturn renderable;\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @param shortestCollisionDistance\n\t * @param findClosest\n\t * @returns {boolean}\n\t *\n\t * @internal\n\t */\n\tpublic _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean\n\t{\n\t\treturn false;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic _iInternalUpdate()\n\t{\n\t\tif (this._iController)\n\t\t\tthis._iController.update();\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic _iIsVisible():boolean\n\t{\n\t\treturn this._pImplicitVisibility;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic _iIsMouseEnabled():boolean\n\t{\n\t\treturn this._pImplicitMouseEnabled;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic _iSetScene(value:Scene)\n\t{\n\t\t// test to see if we're switching roots while we're already using a scene partition\n\t\t/*\n\t\tif (value == null)\n\t\t\tthis._oldScene = this._pScene;\n\n\t\tif (this._explicitPartition && this._oldScene && this._oldScene != this._pScene)\n\t\t\tthis.partition = null;\n\n\t\tif (value)\n\t\t\tthis._oldScene = null;\n\n\t\t// end of stupid partition test code\n\t\t//*/\n\n\t\tif (this._pScene == value)\n\t\t\treturn;\n\n\t\tthis._pUpdateScene(value);\n\n\t\tif (!this._pSceneTransformDirty && !this._pIgnoreTransform)\n\t\t\tthis.pInvalidateSceneTransform();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic _pUpdateScene(value:Scene)\n\t{\n\t\tif (this._pScene) {\n\t\t\tthis._pScene.dispatchEvent(new SceneEvent(SceneEvent.REMOVED_FROM_SCENE, this));\n\n\t\t\t//unregister entity from current scene\n\t\t\tthis._pScene.iUnregisterEntity(this);\n\t\t}\n\n\t\tthis._pScene = value;\n\n\t\tif (value) {\n\t\t\tvalue.dispatchEvent(new SceneEvent(SceneEvent.ADDED_TO_SCENE, this));\n\n\t\t\t//register entity with new scene\n\t\t\tvalue.iRegisterEntity(this);\n\t\t}\n\n\t\tthis.notifySceneChange();\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate notifyPositionChanged()\n\t{\n\t\tif (!this._positionChanged)\n\t\t\tthis._positionChanged = new DisplayObjectEvent(DisplayObjectEvent.POSITION_CHANGED, this);\n\n\t\tthis.dispatchEvent(this._positionChanged);\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate notifyRotationChanged()\n\t{\n\t\tif (!this._rotationChanged)\n\t\t\tthis._rotationChanged = new DisplayObjectEvent(DisplayObjectEvent.ROTATION_CHANGED, this);\n\n\t\tthis.dispatchEvent(this._rotationChanged);\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate notifyScaleChanged()\n\t{\n\t\tif (!this._scaleChanged)\n\t\t\tthis._scaleChanged = new DisplayObjectEvent(DisplayObjectEvent.SCALE_CHANGED, this);\n\n\t\tthis.dispatchEvent(this._scaleChanged);\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate notifySceneChange()\n\t{\n\t\tif (this._listenToSceneChanged) {\n\t\t\tif (!this._scenechanged)\n\t\t\t\tthis._scenechanged = new DisplayObjectEvent(DisplayObjectEvent.SCENE_CHANGED, this);\n\n\t\t\tthis.dispatchEvent(this._scenechanged);\n\t\t}\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate notifySceneTransformChange()\n\t{\n\t\tif (!this._sceneTransformChanged)\n\t\t\tthis._sceneTransformChanged = new DisplayObjectEvent(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this);\n\n\t\tthis.dispatchEvent(this._sceneTransformChanged);\n\t}\n\n\t/**\n\t * Invalidates the 3D transformation matrix, causing it to be updated upon the next request\n\t *\n\t * @private\n\t */\n\tprivate invalidateMatrix3D():void\n\t{\n\t\tif (this._matrix3DDirty)\n\t\t\treturn;\n\n\t\tthis._matrix3DDirty = true;\n\n\t\tif (!this._pSceneTransformDirty && !this._pIgnoreTransform)\n\t\t\tthis.pInvalidateSceneTransform();\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate invalidatePartition()\n\t{\n\t\tif (this._iAssignedPartition)\n\t\t\tthis._iAssignedPartition.iMarkForUpdate(this);\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate invalidatePivot()\n\t{\n\t\tthis._pivotZero = (this._pivot.x == 0) && (this._pivot.y == 0) && (this._pivot.z == 0);\n\n\t\tif (this._pivotDirty)\n\t\t\treturn;\n\n\t\tthis._pivotDirty = true;\n\n\t\tthis.invalidateMatrix3D();\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate invalidatePosition()\n\t{\n\t\tif (this._positionDirty)\n\t\t\treturn;\n\n\t\tthis._positionDirty = true;\n\n\t\tthis.invalidateMatrix3D();\n\n\t\tif (this._listenToPositionChanged)\n\t\t\tthis.notifyPositionChanged();\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate invalidateRotation()\n\t{\n\t\tif (this._rotationDirty)\n\t\t\treturn;\n\n\t\tthis._rotationDirty = true;\n\n\t\tthis.invalidateMatrix3D();\n\n\t\tif (this._listenToRotationChanged)\n\t\t\tthis.notifyRotationChanged();\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate invalidateScale()\n\t{\n\t\tif (this._scaleDirty)\n\t\t\treturn;\n\n\t\tthis._scaleDirty = true;\n\n\t\tthis.invalidateMatrix3D();\n\n\t\tif (this._listenToScaleChanged)\n\t\t\tthis.notifyScaleChanged();\n\t}\n}\n\nexport = DisplayObject;", + "import SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport GeometryEvent\t\t\t= require(\"awayjs-core/lib/events/GeometryEvent\");\n\n/**\n *\n * Geometry is a collection of SubGeometries, each of which contain the actual geometrical data such as vertices,\n * normals, uvs, etc. It also contains a reference to an animation class, which defines how the geometry moves.\n * A Geometry object is assigned to a Mesh, a scene graph occurence of the geometry, which in turn assigns\n * the SubGeometries to its respective TriangleSubMesh objects.\n *\n *\n *\n * @see away.core.base.SubGeometry\n * @see away.entities.Mesh\n *\n * @class Geometry\n */\nclass Geometry extends NamedAssetBase implements IAsset\n{\n\tprivate _subGeometries:Array;\n\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.GEOMETRY;\n\t}\n\n\t/**\n\t * A collection of TriangleSubGeometry objects, each of which contain geometrical data such as vertices, normals, etc.\n\t */\n\tpublic get subGeometries():Array\n\t{\n\t\treturn this._subGeometries;\n\t}\n\n\tpublic getSubGeometries():Array\n\t{\n\t\treturn this._subGeometries;\n\t}\n\n\t/**\n\t * Creates a new Geometry object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._subGeometries = new Array();\n\t}\n\n\tpublic applyTransformation(transform:Matrix3D)\n\t{\n\t\tvar len:number = this._subGeometries.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tthis._subGeometries[i].applyTransformation(transform);\n\t}\n\n\t/**\n\t * Adds a new TriangleSubGeometry object to the list.\n\t * @param subGeometry The TriangleSubGeometry object to be added.\n\t */\n\tpublic addSubGeometry(subGeometry:SubGeometryBase)\n\t{\n\t\tthis._subGeometries.push(subGeometry);\n\n\t\tsubGeometry.parentGeometry = this;\n\n\t\tif (this.hasEventListener(GeometryEvent.SUB_GEOMETRY_ADDED))\n\t\t\tthis.dispatchEvent(new GeometryEvent(GeometryEvent.SUB_GEOMETRY_ADDED, subGeometry));\n\n\t\tthis.iInvalidateBounds(subGeometry);\n\t}\n\n\t/**\n\t * Removes a new TriangleSubGeometry object from the list.\n\t * @param subGeometry The TriangleSubGeometry object to be removed.\n\t */\n\tpublic removeSubGeometry(subGeometry:SubGeometryBase)\n\t{\n\t\tthis._subGeometries.splice(this._subGeometries.indexOf(subGeometry), 1);\n\n\t\tsubGeometry.parentGeometry = null;\n\n\t\tif (this.hasEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED))\n\t\t\tthis.dispatchEvent(new GeometryEvent(GeometryEvent.SUB_GEOMETRY_REMOVED, subGeometry));\n\n\t\tthis.iInvalidateBounds(subGeometry);\n\t}\n\n\t/**\n\t * Clones the geometry.\n\t * @return An exact duplicate of the current Geometry object.\n\t */\n\tpublic clone():Geometry\n\t{\n\t\tvar clone:Geometry = new Geometry();\n\t\tvar len:number = this._subGeometries.length;\n\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tclone.addSubGeometry(this._subGeometries[i].clone());\n\n\t\treturn clone;\n\t}\n\n\t/**\n\t * Scales the geometry.\n\t * @param scale The amount by which to scale.\n\t */\n\tpublic scale(scale:number)\n\t{\n\t\tvar numSubGeoms:number = this._subGeometries.length;\n\t\tfor (var i:number = 0; i < numSubGeoms; ++i)\n\t\t\tthis._subGeometries[i].scale(scale);\n\t}\n\n\t/**\n\t * Clears all resources used by the Geometry object, including SubGeometries.\n\t */\n\tpublic dispose()\n\t{\n\t\tvar numSubGeoms:number = this._subGeometries.length;\n\n\t\tfor (var i:number = 0; i < numSubGeoms; ++i) {\n\t\t\tvar subGeom:SubGeometryBase = this._subGeometries[0];\n\t\t\tthis.removeSubGeometry(subGeom);\n\t\t\tsubGeom.dispose();\n\t\t}\n\t}\n\n\t/**\n\t * Scales the uv coordinates (tiling)\n\t * @param scaleU The amount by which to scale on the u axis. Default is 1;\n\t * @param scaleV The amount by which to scale on the v axis. Default is 1;\n\t */\n\tpublic scaleUV(scaleU:number = 1, scaleV:number = 1)\n\t{\n\t\tvar numSubGeoms:number = this._subGeometries.length;\n\n\t\tfor (var i:number = 0; i < numSubGeoms; ++i)\n\t\t\tthis._subGeometries[i].scaleUV(scaleU, scaleV);\n\t}\n\n\tpublic iInvalidateBounds(subGeom:SubGeometryBase)\n\t{\n\t\tif (this.hasEventListener(GeometryEvent.BOUNDS_INVALID))\n\t\t\tthis.dispatchEvent(new GeometryEvent(GeometryEvent.BOUNDS_INVALID, subGeom));\n\t}\n}\n\nexport = Geometry;", + "/**\n * The GradientType class provides values for the type parameter\n * in the beginGradientFill() and\n * lineGradientStyle() methods of the flash.display.Graphics\n * class.\n */\nclass GradientType\n{\n\t/**\n\t * Value used to specify a linear gradient fill.\n\t */\n\tpublic static LINEAR:string = \"linear\";\n\n\t/**\n\t * Value used to specify a radial gradient fill.\n\t */\n\tpublic static RADIAL:string = \"radial\";\n}\n\nexport = GradientType;", + "/**\n * The GraphicsPathWinding class provides values for the\n * flash.display.GraphicsPath.winding property and the\n * flash.display.Graphics.drawPath() method to determine the\n * direction to draw a path. A clockwise path is positively wound, and a\n * counter-clockwise path is negatively wound:\n *\n *

When paths intersect or overlap, the winding direction determines the\n * rules for filling the areas created by the intersection or overlap:

\n */\nclass GraphicsPathWinding\n{\n\tpublic static EVEN_ODD:string = \"evenOdd\";\n\tpublic static NON_ZERO:string = \"nonZero\";\n}\n\nexport = GraphicsPathWinding;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport CapsStyle\t\t\t\t= require(\"awayjs-core/lib/core/base/CapsStyle\");\nimport GradientType\t\t\t\t= require(\"awayjs-core/lib/core/base/GradientType\");\nimport GraphicsPathWinding\t\t= require(\"awayjs-core/lib/core/base/GraphicsPathWinding\");\nimport IGraphicsData\t\t\t= require(\"awayjs-core/lib/core/base/IGraphicsData\");\nimport InterpolationMethod\t\t= require(\"awayjs-core/lib/core/base/InterpolationMethod\");\nimport JointStyle\t\t\t\t= require(\"awayjs-core/lib/core/base/JointStyle\");\nimport LineScaleMode\t\t\t= require(\"awayjs-core/lib/core/base/LineScaleMode\");\nimport TriangleCulling\t\t\t= require(\"awayjs-core/lib/core/base/TriangleCulling\");\nimport SpreadMethod\t\t\t\t= require(\"awayjs-core/lib/core/base/SpreadMethod\");\nimport Matrix\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix\");\n\n/**\n * The Graphics class contains a set of methods that you can use to create a\n * vector shape. Display objects that support drawing include Sprite and Shape\n * objects. Each of these classes includes a graphics property\n * that is a Graphics object. The following are among those helper functions\n * provided for ease of use: drawRect(),\n * drawRoundRect(), drawCircle(), and\n * drawEllipse().\n *\n *

You cannot create a Graphics object directly from ActionScript code. If\n * you call new Graphics(), an exception is thrown.

\n *\n *

The Graphics class is final; it cannot be subclassed.

\n */\nclass Graphics\n{\n\t/**\n\t * Fills a drawing area with a bitmap image. The bitmap can be repeated or\n\t * tiled to fill the area. The fill remains in effect until you call the\n\t * beginFill(), beginBitmapFill(),\n\t * beginGradientFill(), or beginShaderFill()\n\t * method. Calling the clear() method clears the fill.\n\t *\n\t *

The application renders the fill whenever three or more points are\n\t * drawn, or when the endFill() method is called.

\n\t *\n\t * @param bitmap A transparent or opaque bitmap image that contains the bits\n\t * to be displayed.\n\t * @param matrix A matrix object(of the flash.geom.Matrix class), which you\n\t * can use to define transformations on the bitmap. For\n\t * example, you can use the following matrix to rotate a bitmap\n\t * by 45 degrees(pi/4 radians):\n\t * @param repeat If true, the bitmap image repeats in a tiled\n\t * pattern. If false, the bitmap image does not\n\t * repeat, and the edges of the bitmap are used for any fill\n\t * area that extends beyond the bitmap.\n\t *\n\t *

For example, consider the following bitmap(a 20 x\n\t * 20-pixel checkerboard pattern):

\n\t *\n\t *

When repeat is set to true(as\n\t * in the following example), the bitmap fill repeats the\n\t * bitmap:

\n\t *\n\t *

When repeat is set to false,\n\t * the bitmap fill uses the edge pixels for the fill area\n\t * outside the bitmap:

\n\t * @param smooth If false, upscaled bitmap images are rendered\n\t * by using a nearest-neighbor algorithm and look pixelated. If\n\t * true, upscaled bitmap images are rendered by\n\t * using a bilinear algorithm. Rendering by using the nearest\n\t * neighbor algorithm is faster.\n\t */\n\tpublic beginBitmapFill(bitmap:BitmapData, matrix:Matrix = null, repeat:boolean = true, smooth:boolean = false)\n\t{\n\n\t}\n\n\t/**\n\t * Specifies a simple one-color fill that subsequent calls to other Graphics\n\t * methods(such as lineTo() or drawCircle()) use\n\t * when drawing. The fill remains in effect until you call the\n\t * beginFill(), beginBitmapFill(),\n\t * beginGradientFill(), or beginShaderFill()\n\t * method. Calling the clear() method clears the fill.\n\t *\n\t *

The application renders the fill whenever three or more points are\n\t * drawn, or when the endFill() method is called.

\n\t *\n\t * @param color The color of the fill(0xRRGGBB).\n\t * @param alpha The alpha value of the fill(0.0 to 1.0).\n\t */\n\tpublic beginFill(color:number /*int*/, alpha:number = 1)\n\t{\n\n\t}\n\n\t/**\n\t * Specifies a gradient fill used by subsequent calls to other Graphics\n\t * methods(such as lineTo() or drawCircle()) for\n\t * the object. The fill remains in effect until you call the\n\t * beginFill(), beginBitmapFill(),\n\t * beginGradientFill(), or beginShaderFill()\n\t * method. Calling the clear() method clears the fill.\n\t *\n\t *

The application renders the fill whenever three or more points are\n\t * drawn, or when the endFill() method is called.

\n\t *\n\t * @param type A value from the GradientType class that\n\t * specifies which gradient type to use:\n\t * GradientType.LINEAR or\n\t * GradientType.RADIAL.\n\t * @param colors An array of RGB hexadecimal color values used\n\t * in the gradient; for example, red is 0xFF0000,\n\t * blue is 0x0000FF, and so on. You can specify\n\t * up to 15 colors. For each color, specify a\n\t * corresponding value in the alphas and ratios\n\t * parameters.\n\t * @param alphas An array of alpha values for the corresponding\n\t * colors in the colors array; valid values are 0\n\t * to 1. If the value is less than 0, the default\n\t * is 0. If the value is greater than 1, the\n\t * default is 1.\n\t * @param ratios An array of color distribution ratios; valid\n\t * values are 0-255. This value defines the\n\t * percentage of the width where the color is\n\t * sampled at 100%. The value 0 represents the\n\t * left position in the gradient box, and 255\n\t * represents the right position in the gradient\n\t * box.\n\t * @param matrix A transformation matrix as defined by the\n\t * flash.geom.Matrix class. The flash.geom.Matrix\n\t * class includes a\n\t * createGradientBox() method, which\n\t * lets you conveniently set up the matrix for use\n\t * with the beginGradientFill()\n\t * method.\n\t * @param spreadMethod A value from the SpreadMethod class that\n\t * specifies which spread method to use, either:\n\t * SpreadMethod.PAD,\n\t * SpreadMethod.REFLECT, or\n\t * SpreadMethod.REPEAT.\n\t *\n\t *

For example, consider a simple linear\n\t * gradient between two colors:

\n\t *\n\t *

This example uses\n\t * SpreadMethod.PAD for the spread\n\t * method, and the gradient fill looks like the\n\t * following:

\n\t *\n\t *

If you use SpreadMethod.REFLECT\n\t * for the spread method, the gradient fill looks\n\t * like the following:

\n\t *\n\t *

If you use SpreadMethod.REPEAT\n\t * for the spread method, the gradient fill looks\n\t * like the following:

\n\t * @param interpolationMethod A value from the InterpolationMethod class that\n\t * specifies which value to use:\n\t * InterpolationMethod.LINEAR_RGB or\n\t * InterpolationMethod.RGB\n\t *\n\t *

For example, consider a simple linear\n\t * gradient between two colors(with the\n\t * spreadMethod parameter set to\n\t * SpreadMethod.REFLECT). The\n\t * different interpolation methods affect the\n\t * appearance as follows:

\n\t * @param focalPointRatio A number that controls the location of the\n\t * focal point of the gradient. 0 means that the\n\t * focal point is in the center. 1 means that the\n\t * focal point is at one border of the gradient\n\t * circle. -1 means that the focal point is at the\n\t * other border of the gradient circle. A value\n\t * less than -1 or greater than 1 is rounded to -1\n\t * or 1. For example, the following example shows\n\t * a focalPointRatio set to 0.75:\n\t * @throws ArgumentError If the type parameter is not valid.\n\t */\n\tpublic beginGradientFill(type:GradientType, colors:Array, alphas:Array, ratios:Array, matrix:Matrix = null, spreadMethod:string = \"pad\", interpolationMethod:string = \"rgb\", focalPointRatio:number = 0)\n\t{\n\n\t}\n\n\t/**\n\t * Specifies a shader fill used by subsequent calls to other Graphics methods\n\t * (such as lineTo() or drawCircle()) for the\n\t * object. The fill remains in effect until you call the\n\t * beginFill(), beginBitmapFill(),\n\t * beginGradientFill(), or beginShaderFill()\n\t * method. Calling the clear() method clears the fill.\n\t *\n\t *

The application renders the fill whenever three or more points are\n\t * drawn, or when the endFill() method is called.

\n\t *\n\t *

Shader fills are not supported under GPU rendering; filled areas will\n\t * be colored cyan.

\n\t *\n\t * @param shader The shader to use for the fill. This Shader instance is not\n\t * required to specify an image input. However, if an image\n\t * input is specified in the shader, the input must be provided\n\t * manually. To specify the input, set the input\n\t * property of the corresponding ShaderInput property of the\n\t * Shader.data property.\n\t *\n\t *

When you pass a Shader instance as an argument the shader\n\t * is copied internally. The drawing fill operation uses that\n\t * internal copy, not a reference to the original shader. Any\n\t * changes made to the shader, such as changing a parameter\n\t * value, input, or bytecode, are not applied to the copied\n\t * shader that's used for the fill.

\n\t * @param matrix A matrix object(of the flash.geom.Matrix class), which you\n\t * can use to define transformations on the shader. For\n\t * example, you can use the following matrix to rotate a shader\n\t * by 45 degrees(pi/4 radians):\n\t *\n\t *

The coordinates received in the shader are based on the\n\t * matrix that is specified for the matrix\n\t * parameter. For a default(null) matrix, the\n\t * coordinates in the shader are local pixel coordinates which\n\t * can be used to sample an input.

\n\t * @throws ArgumentError When the shader output type is not compatible with\n\t * this operation(the shader must specify a\n\t * pixel3 or pixel4 output).\n\t * @throws ArgumentError When the shader specifies an image input that isn't\n\t * provided.\n\t * @throws ArgumentError When a ByteArray or Vector. instance is used\n\t * as an input and the width and\n\t * height properties aren't specified for\n\t * the ShaderInput, or the specified values don't match\n\t * the amount of data in the input object. See the\n\t * ShaderInput.input property for more\n\t * information.\n\t */\n//\t\tpublic beginShaderFill(shader:Shader, matrix:Matrix = null)\n//\t\t{\n//\n//\t\t}\n\n\t/**\n\t * Clears the graphics that were drawn to this Graphics object, and resets\n\t * fill and line style settings.\n\t *\n\t */\n\tpublic clear()\n\t{\n\n\t}\n\n\t/**\n\t * Copies all of drawing commands from the source Graphics object into the\n\t * calling Graphics object.\n\t *\n\t * @param sourceGraphics The Graphics object from which to copy the drawing\n\t * commands.\n\t */\n\tpublic copyFrom(sourceGraphics:Graphics)\n\t{\n\n\t}\n\n\t/**\n\t * Draws a cubic Bezier curve from the current drawing position to the\n\t * specified anchor point. Cubic Bezier curves consist of two anchor points\n\t * and two control points. The curve interpolates the two anchor points and\n\t * curves toward the two control points.\n\t *\n\t * The four points you use to draw a cubic Bezier curve with the\n\t * cubicCurveTo() method are as follows:\n\t *\n\t *
    \n\t *
  • The current drawing position is the first anchor point.
  • \n\t *
  • The anchorX and anchorY parameters specify the second anchor point.\n\t *
  • \n\t *
  • The controlX1 and controlY1 parameters\n\t * specify the first control point.
  • \n\t *
  • The controlX2 and controlY2 parameters\n\t * specify the second control point.
  • \n\t *
\n\t *\n\t * If you call the cubicCurveTo() method before calling the\n\t * moveTo() method, your curve starts at position (0, 0).\n\t *\n\t * If the cubicCurveTo() method succeeds, the Flash runtime sets\n\t * the current drawing position to (anchorX,\n\t * anchorY). If the cubicCurveTo() method fails,\n\t * the current drawing position remains unchanged.\n\t *\n\t * If your movie clip contains content created with the Flash drawing tools,\n\t * the results of calls to the cubicCurveTo() method are drawn\n\t * underneath that content.\n\t *\n\t * @param controlX1 Specifies the horizontal position of the first control\n\t * point relative to the registration point of the parent\n\t * display object.\n\t * @param controlY1 Specifies the vertical position of the first control\n\t * point relative to the registration point of the parent\n\t * display object.\n\t * @param controlX2 Specifies the horizontal position of the second control\n\t * point relative to the registration point of the parent\n\t * display object.\n\t * @param controlY2 Specifies the vertical position of the second control\n\t * point relative to the registration point of the parent\n\t * display object.\n\t * @param anchorX Specifies the horizontal position of the anchor point\n\t * relative to the registration point of the parent display\n\t * object.\n\t * @param anchorY Specifies the vertical position of the anchor point\n\t * relative to the registration point of the parent display\n\t * object.\n\t */\n\tpublic cubicCurveTo(controlX1:number, controlY1:number, controlX2:number, controlY2:number, anchorX:number, anchorY:number)\n\t{\n\n\t}\n\n\t/**\n\t * Draws a curve using the current line style from the current drawing\n\t * position to(anchorX, anchorY) and using the control point that\n\t * (controlX, controlY) specifies. The current\n\t * drawing position is then set to(anchorX,\n\t * anchorY). If the movie clip in which you are drawing contains\n\t * content created with the Flash drawing tools, calls to the\n\t * curveTo() method are drawn underneath this content. If you\n\t * call the curveTo() method before any calls to the\n\t * moveTo() method, the default of the current drawing position\n\t * is(0, 0). If any of the parameters are missing, this method fails and the\n\t * current drawing position is not changed.\n\t *\n\t *

The curve drawn is a quadratic Bezier curve. Quadratic Bezier curves\n\t * consist of two anchor points and one control point. The curve interpolates\n\t * the two anchor points and curves toward the control point.

\n\t *\n\t * @param controlX A number that specifies the horizontal position of the\n\t * control point relative to the registration point of the\n\t * parent display object.\n\t * @param controlY A number that specifies the vertical position of the\n\t * control point relative to the registration point of the\n\t * parent display object.\n\t * @param anchorX A number that specifies the horizontal position of the\n\t * next anchor point relative to the registration point of\n\t * the parent display object.\n\t * @param anchorY A number that specifies the vertical position of the next\n\t * anchor point relative to the registration point of the\n\t * parent display object.\n\t */\n\tpublic curveTo(controlX:number, controlY:number, anchorX:number, anchorY:number)\n\t{\n\n\t}\n\n\t/**\n\t * Draws a circle. Set the line style, fill, or both before you call the\n\t * drawCircle() method, by calling the linestyle(),\n\t * lineGradientStyle(), beginFill(),\n\t * beginGradientFill(), or beginBitmapFill()\n\t * method.\n\t *\n\t * @param x The x location of the center of the circle relative\n\t * to the registration point of the parent display object(in\n\t * pixels).\n\t * @param y The y location of the center of the circle relative\n\t * to the registration point of the parent display object(in\n\t * pixels).\n\t * @param radius The radius of the circle(in pixels).\n\t */\n\tpublic drawCircle(x:number, y:number, radius:number)\n\t{\n\n\t}\n\n\t/**\n\t * Draws an ellipse. Set the line style, fill, or both before you call the\n\t * drawEllipse() method, by calling the\n\t * linestyle(), lineGradientStyle(),\n\t * beginFill(), beginGradientFill(), or\n\t * beginBitmapFill() method.\n\t *\n\t * @param x The x location of the top-left of the bounding-box of\n\t * the ellipse relative to the registration point of the parent\n\t * display object(in pixels).\n\t * @param y The y location of the top left of the bounding-box of\n\t * the ellipse relative to the registration point of the parent\n\t * display object(in pixels).\n\t * @param width The width of the ellipse(in pixels).\n\t * @param height The height of the ellipse(in pixels).\n\t */\n\tpublic drawEllipse(x:number, y:number, width:number, height:number)\n\t{\n\n\t}\n\n\t/**\n\t * Submits a series of IGraphicsData instances for drawing. This method\n\t * accepts a Vector containing objects including paths, fills, and strokes\n\t * that implement the IGraphicsData interface. A Vector of IGraphicsData\n\t * instances can refer to a part of a shape, or a complex fully defined set\n\t * of data for rendering a complete shape.\n\t *\n\t *

Graphics paths can contain other graphics paths. If the\n\t * graphicsData Vector includes a path, that path and all its\n\t * sub-paths are rendered during this operation.

\n\t *\n\t */\n\tpublic drawGraphicsData(graphicsData:Array)\n\t{\n\n\t}\n\n\t/**\n\t * Submits a series of commands for drawing. The drawPath()\n\t * method uses vector arrays to consolidate individual moveTo(),\n\t * lineTo(), and curveTo() drawing commands into a\n\t * single call. The drawPath() method parameters combine drawing\n\t * commands with x- and y-coordinate value pairs and a drawing direction. The\n\t * drawing commands are values from the GraphicsPathCommand class. The x- and\n\t * y-coordinate value pairs are Numbers in an array where each pair defines a\n\t * coordinate location. The drawing direction is a value from the\n\t * GraphicsPathWinding class.\n\t *\n\t *

Generally, drawings render faster with drawPath() than\n\t * with a series of individual lineTo() and\n\t * curveTo() methods.

\n\t *\n\t *

The drawPath() method uses a uses a floating computation\n\t * so rotation and scaling of shapes is more accurate and gives better\n\t * results. However, curves submitted using the drawPath()\n\t * method can have small sub-pixel alignment errors when used in conjunction\n\t * with the lineTo() and curveTo() methods.

\n\t *\n\t *

The drawPath() method also uses slightly different rules\n\t * for filling and drawing lines. They are:

\n\t *\n\t *
    \n\t *
  • When a fill is applied to rendering a path:\n\t *
      \n\t *
    • A sub-path of less than 3 points is not rendered.(But note that the\n\t * stroke rendering will still occur, consistent with the rules for strokes\n\t * below.)
    • \n\t *
    • A sub-path that isn't closed(the end point is not equal to the\n\t * begin point) is implicitly closed.
    • \n\t *
    \n\t *
  • \n\t *
  • When a stroke is applied to rendering a path:\n\t *
      \n\t *
    • The sub-paths can be composed of any number of points.
    • \n\t *
    • The sub-path is never implicitly closed.
    • \n\t *
    \n\t *
  • \n\t *
\n\t *\n\t * @param winding Specifies the winding rule using a value defined in the\n\t * GraphicsPathWinding class.\n\t */\n\tpublic drawPath(commands:Array, data:Array, winding:GraphicsPathWinding)\n\t{\n\n\t}\n\n\t/**\n\t * Draws a rectangle. Set the line style, fill, or both before you call the\n\t * drawRect() method, by calling the linestyle(),\n\t * lineGradientStyle(), beginFill(),\n\t * beginGradientFill(), or beginBitmapFill()\n\t * method.\n\t *\n\t * @param x A number indicating the horizontal position relative to the\n\t * registration point of the parent display object(in pixels).\n\t * @param y A number indicating the vertical position relative to the\n\t * registration point of the parent display object(in pixels).\n\t * @param width The width of the rectangle(in pixels).\n\t * @param height The height of the rectangle(in pixels).\n\t * @throws ArgumentError If the width or height\n\t * parameters are not a number\n\t * (Number.NaN).\n\t */\n\tpublic drawRect(x:number, y:number, width:number, height:number)\n\t{\n\n\t}\n\n\t/**\n\t * Draws a rounded rectangle. Set the line style, fill, or both before you\n\t * call the drawRoundRect() method, by calling the\n\t * linestyle(), lineGradientStyle(),\n\t * beginFill(), beginGradientFill(), or\n\t * beginBitmapFill() method.\n\t *\n\t * @param x A number indicating the horizontal position relative\n\t * to the registration point of the parent display\n\t * object(in pixels).\n\t * @param y A number indicating the vertical position relative to\n\t * the registration point of the parent display object\n\t * (in pixels).\n\t * @param width The width of the round rectangle(in pixels).\n\t * @param height The height of the round rectangle(in pixels).\n\t * @param ellipseWidth The width of the ellipse used to draw the rounded\n\t * corners(in pixels).\n\t * @param ellipseHeight The height of the ellipse used to draw the rounded\n\t * corners(in pixels). Optional; if no value is\n\t * specified, the default value matches that provided\n\t * for the ellipseWidth parameter.\n\t * @throws ArgumentError If the width, height,\n\t * ellipseWidth or\n\t * ellipseHeight parameters are not a\n\t * number(Number.NaN).\n\t */\n\tpublic drawRoundRect(x:number, y:number, width:number, height:number, ellipseWidth:number, ellipseHeight:number = NaN)\n\t{\n\n\t}\n\n\t//public drawRoundRectComplex(x:Float, y:Float, width:Float, height:Float, topLeftRadius:Float, topRightRadius:Float, bottomLeftRadius:Float, bottomRightRadius:Float):Void;\n\n\t/**\n\t * Renders a set of triangles, typically to distort bitmaps and give them a\n\t * three-dimensional appearance. The drawTriangles() method maps\n\t * either the current fill, or a bitmap fill, to the triangle faces using a\n\t * set of(u,v) coordinates.\n\t *\n\t *

Any type of fill can be used, but if the fill has a transform matrix\n\t * that transform matrix is ignored.

\n\t *\n\t *

A uvtData parameter improves texture mapping when a\n\t * bitmap fill is used.

\n\t *\n\t * @param culling Specifies whether to render triangles that face in a\n\t * specified direction. This parameter prevents the rendering\n\t * of triangles that cannot be seen in the current view. This\n\t * parameter can be set to any value defined by the\n\t * TriangleCulling class.\n\t */\n\tpublic drawTriangles(vertices:Array, indices:Array = null, uvtData:Array = null, culling:TriangleCulling = null)\n\t{\n\n\t}\n\n\t/**\n\t * Applies a fill to the lines and curves that were added since the last call\n\t * to the beginFill(), beginGradientFill(), or\n\t * beginBitmapFill() method. Flash uses the fill that was\n\t * specified in the previous call to the beginFill(),\n\t * beginGradientFill(), or beginBitmapFill()\n\t * method. If the current drawing position does not equal the previous\n\t * position specified in a moveTo() method and a fill is\n\t * defined, the path is closed with a line and then filled.\n\t *\n\t */\n\tpublic endFill()\n\t{\n\n\t}\n\n\t/**\n\t * Specifies a bitmap to use for the line stroke when drawing lines.\n\t *\n\t *

The bitmap line style is used for subsequent calls to Graphics methods\n\t * such as the lineTo() method or the drawCircle()\n\t * method. The line style remains in effect until you call the\n\t * lineStyle() or lineGradientStyle() methods, or\n\t * the lineBitmapStyle() method again with different parameters.\n\t *

\n\t *\n\t *

You can call the lineBitmapStyle() method in the middle of\n\t * drawing a path to specify different styles for different line segments\n\t * within a path.

\n\t *\n\t *

Call the lineStyle() method before you call the\n\t * lineBitmapStyle() method to enable a stroke, or else the\n\t * value of the line style is undefined.

\n\t *\n\t *

Calls to the clear() method set the line style back to\n\t * undefined.

\n\t *\n\t * @param bitmap The bitmap to use for the line stroke.\n\t * @param matrix An optional transformation matrix as defined by the\n\t * flash.geom.Matrix class. The matrix can be used to scale or\n\t * otherwise manipulate the bitmap before applying it to the\n\t * line style.\n\t * @param repeat Whether to repeat the bitmap in a tiled fashion.\n\t * @param smooth Whether smoothing should be applied to the bitmap.\n\t */\n\tpublic lineBitmapStyle(bitmap:BitmapData, matrix:Matrix = null, repeat:boolean = true, smooth:boolean = false)\n\t{\n\n\t}\n\n\t/**\n\t * Specifies a gradient to use for the stroke when drawing lines.\n\t *\n\t *

The gradient line style is used for subsequent calls to Graphics\n\t * methods such as the lineTo() methods or the\n\t * drawCircle() method. The line style remains in effect until\n\t * you call the lineStyle() or lineBitmapStyle()\n\t * methods, or the lineGradientStyle() method again with\n\t * different parameters.

\n\t *\n\t *

You can call the lineGradientStyle() method in the middle\n\t * of drawing a path to specify different styles for different line segments\n\t * within a path.

\n\t *\n\t *

Call the lineStyle() method before you call the\n\t * lineGradientStyle() method to enable a stroke, or else the\n\t * value of the line style is undefined.

\n\t *\n\t *

Calls to the clear() method set the line style back to\n\t * undefined.

\n\t *\n\t * @param type A value from the GradientType class that\n\t * specifies which gradient type to use, either\n\t * GradientType.LINEAR or GradientType.RADIAL.\n\t * @param colors An array of RGB hexadecimal color values used\n\t * in the gradient; for example, red is 0xFF0000,\n\t * blue is 0x0000FF, and so on. You can specify\n\t * up to 15 colors. For each color, specify a\n\t * corresponding value in the alphas and ratios\n\t * parameters.\n\t * @param alphas An array of alpha values for the corresponding\n\t * colors in the colors array; valid values are 0\n\t * to 1. If the value is less than 0, the default\n\t * is 0. If the value is greater than 1, the\n\t * default is 1.\n\t * @param ratios An array of color distribution ratios; valid\n\t * values are 0-255. This value defines the\n\t * percentage of the width where the color is\n\t * sampled at 100%. The value 0 represents the\n\t * left position in the gradient box, and 255\n\t * represents the right position in the gradient\n\t * box.\n\t * @param matrix A transformation matrix as defined by the\n\t * flash.geom.Matrix class. The flash.geom.Matrix\n\t * class includes a\n\t * createGradientBox() method, which\n\t * lets you conveniently set up the matrix for use\n\t * with the lineGradientStyle()\n\t * method.\n\t * @param spreadMethod A value from the SpreadMethod class that\n\t * specifies which spread method to use:\n\t * @param interpolationMethod A value from the InterpolationMethod class that\n\t * specifies which value to use. For example,\n\t * consider a simple linear gradient between two\n\t * colors(with the spreadMethod\n\t * parameter set to\n\t * SpreadMethod.REFLECT). The\n\t * different interpolation methods affect the\n\t * appearance as follows:\n\t * @param focalPointRatio A number that controls the location of the\n\t * focal point of the gradient. The value 0 means\n\t * the focal point is in the center. The value 1\n\t * means the focal point is at one border of the\n\t * gradient circle. The value -1 means that the\n\t * focal point is at the other border of the\n\t * gradient circle. Values less than -1 or greater\n\t * than 1 are rounded to -1 or 1. The following\n\t * image shows a gradient with a\n\t * focalPointRatio of -0.75:\n\t */\n\tpublic lineGradientStyle(type:GradientType, colors:Array, alphas:Array, ratios:Array, matrix:Matrix = null, spreadMethod:SpreadMethod = null, interpolationMethod:InterpolationMethod = null, focalPointRatio:number = 0)\n\t{\n\n\t}\n\n\t/**\n\t * Specifies a shader to use for the line stroke when drawing lines.\n\t *\n\t *

The shader line style is used for subsequent calls to Graphics methods\n\t * such as the lineTo() method or the drawCircle()\n\t * method. The line style remains in effect until you call the\n\t * lineStyle() or lineGradientStyle() methods, or\n\t * the lineBitmapStyle() method again with different parameters.\n\t *

\n\t *\n\t *

You can call the lineShaderStyle() method in the middle of\n\t * drawing a path to specify different styles for different line segments\n\t * within a path.

\n\t *\n\t *

Call the lineStyle() method before you call the\n\t * lineShaderStyle() method to enable a stroke, or else the\n\t * value of the line style is undefined.

\n\t *\n\t *

Calls to the clear() method set the line style back to\n\t * undefined.

\n\t *\n\t * @param shader The shader to use for the line stroke.\n\t * @param matrix An optional transformation matrix as defined by the\n\t * flash.geom.Matrix class. The matrix can be used to scale or\n\t * otherwise manipulate the bitmap before applying it to the\n\t * line style.\n\t */\n//\t\tpublic lineShaderStyle(shader:Shader, matrix:Matrix = null)\n//\t\t{\n//\n//\t\t}\n\n\t/**\n\t * Specifies a line style used for subsequent calls to Graphics methods such\n\t * as the lineTo() method or the drawCircle()\n\t * method. The line style remains in effect until you call the\n\t * lineGradientStyle() method, the\n\t * lineBitmapStyle() method, or the lineStyle()\n\t * method with different parameters.\n\t *\n\t *

You can call the lineStyle() method in the middle of\n\t * drawing a path to specify different styles for different line segments\n\t * within the path.

\n\t *\n\t *

Note: Calls to the clear() method set the line\n\t * style back to undefined.

\n\t *\n\t *

Note: Flash Lite 4 supports only the first three parameters\n\t * (thickness, color, and alpha).

\n\t *\n\t * @param thickness An integer that indicates the thickness of the line in\n\t * points; valid values are 0-255. If a number is not\n\t * specified, or if the parameter is undefined, a line is\n\t * not drawn. If a value of less than 0 is passed, the\n\t * default is 0. The value 0 indicates hairline\n\t * thickness; the maximum thickness is 255. If a value\n\t * greater than 255 is passed, the default is 255.\n\t * @param color A hexadecimal color value of the line; for example,\n\t * red is 0xFF0000, blue is 0x0000FF, and so on. If a\n\t * value is not indicated, the default is 0x000000\n\t * (black). Optional.\n\t * @param alpha A number that indicates the alpha value of the color\n\t * of the line; valid values are 0 to 1. If a value is\n\t * not indicated, the default is 1(solid). If the value\n\t * is less than 0, the default is 0. If the value is\n\t * greater than 1, the default is 1.\n\t * @param pixelHinting(Not supported in Flash Lite 4) A Boolean value that\n\t * specifies whether to hint strokes to full pixels. This\n\t * affects both the position of anchors of a curve and\n\t * the line stroke size itself. With\n\t * pixelHinting set to true,\n\t * line widths are adjusted to full pixel widths. With\n\t * pixelHinting set to false,\n\t * disjoints can appear for curves and straight lines.\n\t * For example, the following illustrations show how\n\t * Flash Player or Adobe AIR renders two rounded\n\t * rectangles that are identical, except that the\n\t * pixelHinting parameter used in the\n\t * lineStyle() method is set differently\n\t * (the images are scaled by 200%, to emphasize the\n\t * difference):\n\t *\n\t *

If a value is not supplied, the line does not use\n\t * pixel hinting.

\n\t * @param scaleMode (Not supported in Flash Lite 4) A value from the\n\t * LineScaleMode class that specifies which scale mode to\n\t * use:\n\t *
    \n\t *
  • LineScaleMode.NORMAL - Always\n\t * scale the line thickness when the object is scaled\n\t * (the default).
  • \n\t *
  • LineScaleMode.NONE - Never scale\n\t * the line thickness.
  • \n\t *
  • LineScaleMode.VERTICAL - Do not\n\t * scale the line thickness if the object is scaled\n\t * vertically only. For example, consider the\n\t * following circles, drawn with a one-pixel line, and\n\t * each with the scaleMode parameter set to\n\t * LineScaleMode.VERTICAL. The circle on the\n\t * left is scaled vertically only, and the circle on the\n\t * right is scaled both vertically and horizontally:\n\t *
  • \n\t *
  • LineScaleMode.HORIZONTAL - Do not\n\t * scale the line thickness if the object is scaled\n\t * horizontally only. For example, consider the\n\t * following circles, drawn with a one-pixel line, and\n\t * each with the scaleMode parameter set to\n\t * LineScaleMode.HORIZONTAL. The circle on\n\t * the left is scaled horizontally only, and the circle\n\t * on the right is scaled both vertically and\n\t * horizontally:
  • \n\t *
\n\t * @param caps (Not supported in Flash Lite 4) A value from the\n\t * CapsStyle class that specifies the type of caps at the\n\t * end of lines. Valid values are:\n\t * CapsStyle.NONE,\n\t * CapsStyle.ROUND, and\n\t * CapsStyle.SQUARE. If a value is not\n\t * indicated, Flash uses round caps.\n\t *\n\t *

For example, the following illustrations show the\n\t * different capsStyle settings. For each\n\t * setting, the illustration shows a blue line with a\n\t * thickness of 30(for which the capsStyle\n\t * applies), and a superimposed black line with a\n\t * thickness of 1(for which no capsStyle\n\t * applies):

\n\t * @param joints (Not supported in Flash Lite 4) A value from the\n\t * JointStyle class that specifies the type of joint\n\t * appearance used at angles. Valid values are:\n\t * JointStyle.BEVEL,\n\t * JointStyle.MITER, and\n\t * JointStyle.ROUND. If a value is not\n\t * indicated, Flash uses round joints.\n\t *\n\t *

For example, the following illustrations show the\n\t * different joints settings. For each\n\t * setting, the illustration shows an angled blue line\n\t * with a thickness of 30(for which the\n\t * jointStyle applies), and a superimposed\n\t * angled black line with a thickness of 1(for which no\n\t * jointStyle applies):

\n\t *\n\t *

Note: For joints set to\n\t * JointStyle.MITER, you can use the\n\t * miterLimit parameter to limit the length\n\t * of the miter.

\n\t * @param miterLimit (Not supported in Flash Lite 4) A number that\n\t * indicates the limit at which a miter is cut off. Valid\n\t * values range from 1 to 255(and values outside that\n\t * range are rounded to 1 or 255). This value is only\n\t * used if the jointStyle is set to\n\t * \"miter\". The miterLimit\n\t * value represents the length that a miter can extend\n\t * beyond the point at which the lines meet to form a\n\t * joint. The value expresses a factor of the line\n\t * thickness. For example, with a\n\t * miterLimit factor of 2.5 and a\n\t * thickness of 10 pixels, the miter is cut\n\t * off at 25 pixels.\n\t *\n\t *

For example, consider the following angled lines,\n\t * each drawn with a thickness of 20, but\n\t * with miterLimit set to 1, 2, and 4.\n\t * Superimposed are black reference lines showing the\n\t * meeting points of the joints:

\n\t *\n\t *

Notice that a given miterLimit value\n\t * has a specific maximum angle for which the miter is\n\t * cut off. The following table lists some examples:

\n\t */\n\tpublic lineStyle(thickness:number = 0, color:number /*int*/ = 0, alpha:number = 1, pixelHinting:boolean = false, scaleMode:LineScaleMode = null, caps:CapsStyle = null, joints:JointStyle = null, miterLimit:number = 3)\n\t{\n\n\t}\n\n\t/**\n\t * Draws a line using the current line style from the current drawing\n\t * position to(x, y); the current drawing position\n\t * is then set to(x, y). If the display object in\n\t * which you are drawing contains content that was created with the Flash\n\t * drawing tools, calls to the lineTo() method are drawn\n\t * underneath the content. If you call lineTo() before any calls\n\t * to the moveTo() method, the default position for the current\n\t * drawing is(0, 0). If any of the parameters are missing, this\n\t * method fails and the current drawing position is not changed.\n\t *\n\t * @param x A number that indicates the horizontal position relative to the\n\t * registration point of the parent display object(in pixels).\n\t * @param y A number that indicates the vertical position relative to the\n\t * registration point of the parent display object(in pixels).\n\t */\n\tpublic lineTo(x:number, y:number)\n\t{\n\n\t}\n\n\t/**\n\t * Moves the current drawing position to(x, y). If\n\t * any of the parameters are missing, this method fails and the current\n\t * drawing position is not changed.\n\t *\n\t * @param x A number that indicates the horizontal position relative to the\n\t * registration point of the parent display object(in pixels).\n\t * @param y A number that indicates the vertical position relative to the\n\t * registration point of the parent display object(in pixels).\n\t */\n\tpublic moveTo(x:number, y:number)\n\t{\n\n\t}\n}\n\nexport = Graphics;", + "/**\n * The IBitmapDrawable interface is implemented by objects that can be passed as the\n * source parameter of the draw() method of the BitmapData class. These\n * objects are of type BitmapData or DisplayObject.\n * \n * @see away.base.BitmapData#draw()\n * @see away.base.BitmapData\n * @see away.base.DisplayObject\n */\ninterface IBitmapDrawable\n{\n\n}\n\nexport = IBitmapDrawable;\n", + "/**\n * This interface is used to define objects that can be used as parameters in the\n * away.base.Graphics methods, including fills, strokes, and paths. Use\n * the implementor classes of this interface to create and manage drawing property\n * data, and to reuse the same data for different instances. Then, use the methods of\n * the Graphics class to render the drawing objects.\n * \n * @see away.base.Graphics.drawGraphicsData()\n * @see away.base.Graphics.readGraphicsData()\n */\ninterface IGraphicsData\n{\n\n}\n\nexport = IGraphicsData;", + "import IAnimator\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimator\");\nimport UVTransform\t\t\t\t= require(\"awayjs-core/lib/core/geom/UVTransform\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport IRenderable\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport IRenderer\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * IMaterialOwner provides an interface for objects that can use materials.\n *\n * @interface away.base.IMaterialOwner\n */\ninterface IMaterialOwner extends IAsset\n{\n\t/**\n\t * The animation used by the material owner to assemble the vertex code.\n\t */\n\tanimator:IAnimator;\n\n\t/**\n\t * The material with which to render the object.\n\t */\n\tmaterial:MaterialBase;\n\n\t/**\n\t *\n\t */\n\tuvTransform:UVTransform;\n\n\t/**\n\t *\n\t * @param renderable\n\t * @private\n\t */\n\t_iAddRenderable(renderable:IRenderable):IRenderable;\n\n\n\t/**\n\t *\n\t * @param renderable\n\t * @private\n\t */\n\t_iRemoveRenderable(renderable:IRenderable):IRenderable;\n\n\t/**\n\t *\n\t * @param renderer\n\t * @private\n\t */\n\t_iCollectRenderable(renderer:IRenderer)\n}\n\nexport = IMaterialOwner;", + "/**\n * The IStage interface is implemented by objects that control the rendering context\n * of the AwayJS Stage area\n *\n */\ninterface IStage\n{\n\n}\n\nexport = IStage;\n", + "import ISubMesh\t\t\t\t\t= require(\"awayjs-core/lib/core/base/ISubMesh\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport Mesh\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Mesh\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * ISubMeshClass is an interface for the constructable class definition ISubMesh that is used to\n * apply a material to a SubGeometry class\n *\n * @class away.base.ISubMeshClass\n */\ninterface ISubMeshClass\n{\n\t/**\n\t *\n\t */\n\tnew(subGeometry:SubGeometryBase, parentMesh:Mesh, material?:MaterialBase):ISubMesh;\n}\n\nexport = ISubMeshClass;", + "import IMaterialOwner\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport Mesh\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Mesh\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * ISubMesh is an interface for object SubMesh that is used to\n * apply a material to a SubGeometry class\n *\n * @class away.base.ISubMesh\n */\ninterface ISubMesh extends IMaterialOwner\n{\n\tsubGeometry:SubGeometryBase;\n\n\tparentMesh:Mesh;\n\n\t_iIndex:number;\n\n\t_iInvalidateRenderableGeometry();\n\n\t_iGetExplicitMaterial():MaterialBase;\n}\n\nexport = ISubMesh;", + "/**\n * The InterpolationMethod class provides values for the\n * interpolationMethod parameter in the\n * Graphics.beginGradientFill() and\n * Graphics.lineGradientStyle() methods. This parameter\n * determines the RGB space to use when rendering the gradient.\n */\nclass InterpolationMethod\n{\n\n\t/**\n\t * Specifies that the RGB interpolation method should be used. This means\n\t * that the gradient is rendered with exponential sRGB(standard RGB) space.\n\t * The sRGB space is a W3C-endorsed standard that defines a non-linear\n\t * conversion between red, green, and blue component values and the actual\n\t * intensity of the visible component color.\n\t *\n\t *

For example, consider a simple linear gradient between two colors(with\n\t * the spreadMethod parameter set to\n\t * SpreadMethod.REFLECT). The different interpolation methods\n\t * affect the appearance as follows:

\n\t */\n\tpublic static LINEAR_RGB:string = \"linearRGB\";\n\n\t/**\n\t * Specifies that the RGB interpolation method should be used. This means\n\t * that the gradient is rendered with exponential sRGB(standard RGB) space.\n\t * The sRGB space is a W3C-endorsed standard that defines a non-linear\n\t * conversion between red, green, and blue component values and the actual\n\t * intensity of the visible component color.\n\t *\n\t *

For example, consider a simple linear gradient between two colors(with\n\t * the spreadMethod parameter set to\n\t * SpreadMethod.REFLECT). The different interpolation methods\n\t * affect the appearance as follows:

\n\t */\n\tpublic static RGB:string = \"rgb\";\n}\n\nexport = InterpolationMethod;", + "/**\n * The JointStyle class is an enumeration of constant values that specify the\n * joint style to use in drawing lines. These constants are provided for use\n * as values in the joints parameter of the\n * flash.display.Graphics.lineStyle() method. The method supports\n * three types of joints: miter, round, and bevel, as the following example\n * shows:\n */\nclass JointStyle\n{\n\t/**\n\t * Specifies beveled joints in the joints parameter of the\n\t * flash.display.Graphics.lineStyle() method.\n\t */\n\tpublic static BEVEL:string = \"bevel\";\n\n\t/**\n\t * Specifies mitered joints in the joints parameter of the\n\t * flash.display.Graphics.lineStyle() method.\n\t */\n\tpublic static MITER:string = \"miter\";\n\n\t/**\n\t * Specifies round joints in the joints parameter of the\n\t * flash.display.Graphics.lineStyle() method.\n\t */\n\tpublic static ROUND:string = \"round\";\n}\n\nexport = JointStyle;", + "import DisplayObjectContainer\t= require(\"awayjs-core/lib/containers/DisplayObjectContainer\");\nimport AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Camera\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport IEntity\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport LightEvent\t\t\t\t= require(\"awayjs-core/lib/events/LightEvent\");\nimport ShadowMapperBase\t\t\t= require(\"awayjs-core/lib/materials/shadowmappers/ShadowMapperBase\");\n\nclass LightBase extends DisplayObjectContainer\n{\n\tprivate _color:number = 0xffffff;\n\tprivate _colorR:number = 1;\n\tprivate _colorG:number = 1;\n\tprivate _colorB:number = 1;\n\n\tprivate _ambientColor:number = 0xffffff;\n\tprivate _ambient:number = 0;\n\tpublic _iAmbientR:number = 0;\n\tpublic _iAmbientG:number = 0;\n\tpublic _iAmbientB:number = 0;\n\n\tprivate _specular:number = 1;\n\tpublic _iSpecularR:number = 1;\n\tpublic _iSpecularG:number = 1;\n\tpublic _iSpecularB:number = 1;\n\n\tprivate _diffuse:number = 1;\n\tpublic _iDiffuseR:number = 1;\n\tpublic _iDiffuseG:number = 1;\n\tpublic _iDiffuseB:number = 1;\n\n\tprivate _castsShadows:boolean = false;\n\n\tprivate _shadowMapper:ShadowMapperBase;\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tpublic get castsShadows():boolean\n\t{\n\t\treturn this._castsShadows;\n\t}\n\n\tpublic set castsShadows(value:boolean)\n\t{\n\t\tif (this._castsShadows == value)\n\t\t\treturn;\n\n\t\tthis._castsShadows = value;\n\n\t\tif (value) {\n\t\t\tif (this._shadowMapper == null)\n\t\t\t\tthis._shadowMapper = this.pCreateShadowMapper();\n\n\t\t\tthis._shadowMapper.light = this;\n\t\t} else {\n\t\t\tthis._shadowMapper.dispose();\n\t\t\tthis._shadowMapper = null;\n\t\t}\n\t\t//*/\n\t\tthis.dispatchEvent(new LightEvent(LightEvent.CASTS_SHADOW_CHANGE));\n\t}\n\n\tpublic pCreateShadowMapper():ShadowMapperBase\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic get specular():number\n\t{\n\t\treturn this._specular;\n\t}\n\n\tpublic set specular(value:number)\n\t{\n\t\tif (value < 0)\n\t\t\tvalue = 0;\n\n\t\tthis._specular = value;\n\t\tthis.updateSpecular();\n\t}\n\n\tpublic get diffuse():number\n\t{\n\t\treturn this._diffuse;\n\t}\n\n\tpublic set diffuse(value:number)\n\t{\n\t\tif (value < 0)\n\t\t\tvalue = 0;\n\n\t\tthis._diffuse = value;\n\t\tthis.updateDiffuse();\n\t}\n\n\tpublic get color():number\n\t{\n\t\treturn this._color;\n\t}\n\n\tpublic set color(value:number)\n\t{\n\t\tthis._color = value;\n\t\tthis._colorR = ((this._color >> 16) & 0xff)/0xff;\n\t\tthis._colorG = ((this._color >> 8) & 0xff)/0xff;\n\t\tthis._colorB = (this._color & 0xff)/0xff;\n\n\t\tthis.updateDiffuse();\n\t\tthis.updateSpecular();\n\t}\n\n\tpublic get ambient():number\n\t{\n\t\treturn this._ambient;\n\t}\n\n\tpublic set ambient(value:number)\n\t{\n\t\tif (value < 0)\n\t\t\tvalue = 0;\n\t\telse if (value > 1)\n\t\t\tvalue = 1;\n\n\t\tthis._ambient = value;\n\t\tthis.updateAmbient();\n\t}\n\n\tpublic get ambientColor():number\n\t{\n\t\treturn this._ambientColor;\n\t}\n\n\tpublic set ambientColor(value:number)\n\t{\n\t\tthis._ambientColor = value;\n\t\tthis.updateAmbient();\n\t}\n\n\tprivate updateAmbient()\n\t{\n\t\tthis._iAmbientR = ((this._ambientColor >> 16) & 0xff)/0xff*this._ambient;\n\t\tthis._iAmbientG = ((this._ambientColor >> 8) & 0xff)/0xff*this._ambient;\n\t\tthis._iAmbientB = (this._ambientColor & 0xff)/0xff*this._ambient;\n\t}\n\n\tpublic iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t//@override\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.LIGHT;\n\t}\n\n\tprivate updateSpecular()\n\t{\n\t\tthis._iSpecularR = this._colorR*this._specular;\n\t\tthis._iSpecularG = this._colorG*this._specular;\n\t\tthis._iSpecularB = this._colorB*this._specular;\n\t}\n\n\tprivate updateDiffuse()\n\t{\n\t\tthis._iDiffuseR = this._colorR*this._diffuse;\n\t\tthis._iDiffuseG = this._colorG*this._diffuse;\n\t\tthis._iDiffuseB = this._colorB*this._diffuse;\n\t}\n\n\tpublic get shadowMapper():ShadowMapperBase\n\t{\n\t\treturn this._shadowMapper;\n\t}\n\n\tpublic set shadowMapper(value:ShadowMapperBase)\n\t{\n\t\tthis._shadowMapper = value;\n\t\tthis._shadowMapper.light = this;\n\t}\n}\n\nexport = LightBase;", + "/**\n * The LineScaleMode class provides values for the scaleMode\n * parameter in the Graphics.lineStyle() method.\n */\nclass LineScaleMode\n{\n\t/**\n\t * With this setting used as the scaleMode parameter of the\n\t * lineStyle() method, the thickness of the line scales\n\t * only vertically. For example, consider the following circles, drawn\n\t * with a one-pixel line, and each with the scaleMode parameter\n\t * set to LineScaleMode.VERTICAL. The circle on the left is\n\t * scaled only vertically, and the circle on the right is scaled both\n\t * vertically and horizontally.\n\t */\n\tpublic static HORIZONTAL:string = \"horizontal\";\n\n\t/**\n\t * With this setting used as the scaleMode parameter of the\n\t * lineStyle() method, the thickness of the line never scales.\n\t */\n\tpublic static NONE:string = \"none\";\n\n\t/**\n\t * With this setting used as the scaleMode parameter of the\n\t * lineStyle() method, the thickness of the line always scales\n\t * when the object is scaled(the default).\n\t */\n\tpublic static NORMAL:string = \"normal\";\n\n\t/**\n\t * With this setting used as the scaleMode parameter of the\n\t * lineStyle() method, the thickness of the line scales\n\t * only horizontally. For example, consider the following circles,\n\t * drawn with a one-pixel line, and each with the scaleMode\n\t * parameter set to LineScaleMode.HORIZONTAL. The circle on the\n\t * left is scaled only horizontally, and the circle on the right is scaled\n\t * both vertically and horizontally.\n\t */\n\tpublic static VERTICAL:string = \"vertical\";\n}\n\nexport = LineScaleMode;", + "import DisplayObjectContainer\t= require(\"awayjs-core/lib/containers/DisplayObjectContainer\");\nimport Geometry\t\t\t\t\t= require(\"awayjs-core/lib/core/base/Geometry\");\nimport LineSubMesh\t\t\t\t= require(\"awayjs-core/lib/core/base/LineSubMesh\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport SubGeometryEvent\t\t\t= require(\"awayjs-core/lib/events/SubGeometryEvent\");\n\n/**\n * @class LineSubGeometry\n */\nclass LineSubGeometry extends SubGeometryBase\n{\n\tpublic static VERTEX_DATA:string = \"vertices\";\n\tpublic static START_POSITION_DATA:string = \"startPositions\";\n\tpublic static END_POSITION_DATA:string = \"endPositions\";\n\tpublic static THICKNESS_DATA:string = \"thickness\";\n\tpublic static COLOR_DATA:string = \"colors\";\n\n\t//TODO - move these to StageGL\n\tpublic static POSITION_FORMAT:string = \"float3\";\n\tpublic static COLOR_FORMAT:string = \"float4\";\n\tpublic static THICKNESS_FORMAT:string = \"float1\";\n\n\tprivate _positionsDirty:boolean = true;\n\tprivate _boundingPositionDirty = true;\n\tprivate _thicknessDirty:boolean = true;\n\tprivate _colorsDirty:boolean = true;\n\n\tprivate _startPositions:Array;\n\tprivate _endPositions:Array;\n\tprivate _boundingPositions:Array\n\tprivate _thickness:Array;\n\tprivate _startColors:Array;\n\tprivate _endColors:Array;\n\n\tprivate _numSegments:number;\n\n\tprivate _positionsUpdated:SubGeometryEvent;\n\tprivate _thicknessUpdated:SubGeometryEvent;\n\tprivate _colorUpdated:SubGeometryEvent;\n\n\tpublic _pUpdateStrideOffset()\n\t{\n\t\tthis._pOffset[LineSubGeometry.VERTEX_DATA] = 0;\n\n\t\tvar stride:number = 0;\n\t\tthis._pOffset[LineSubGeometry.START_POSITION_DATA] = stride;\n\t\tstride += 3;\n\n\t\tthis._pOffset[LineSubGeometry.END_POSITION_DATA] = stride;\n\t\tstride += 3;\n\n\t\tthis._pOffset[LineSubGeometry.THICKNESS_DATA] = stride;\n\t\tstride += 1;\n\n\t\tthis._pOffset[LineSubGeometry.COLOR_DATA] = stride;\n\t\tstride += 4;\n\n\t\tthis._pStride[LineSubGeometry.VERTEX_DATA] = stride;\n\t\tthis._pStride[LineSubGeometry.START_POSITION_DATA] = stride;\n\t\tthis._pStride[LineSubGeometry.END_POSITION_DATA] = stride;\n\t\tthis._pStride[LineSubGeometry.THICKNESS_DATA] = stride;\n\t\tthis._pStride[LineSubGeometry.COLOR_DATA] = stride;\n\n\t\tvar len:number = this._pNumVertices*stride;\n\n\t\tif (this._pVertices == null)\n\t\t\tthis._pVertices = new Array(len);\n\t\telse if (this._pVertices.length != len)\n\t\t\tthis._pVertices.length = len;\n\n\t\tthis._pStrideOffsetDirty = false;\n\t}\n\n\t/**\n\t * \n\t */\n\tpublic get vertices():Array\n\t{\n\t\tif (this._positionsDirty)\n\t\t\tthis.updatePositions(this._startPositions, this._endPositions);\n\n\t\tif (this._thicknessDirty)\n\t\t\tthis.updateThickness(this._thickness);\n\n\t\tif (this._colorsDirty)\n\t\t\tthis.updateColors(this._startColors, this._endColors);\n\n\t\treturn this._pVertices;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get startPositions():Array\n\t{\n\t\tif (this._positionsDirty)\n\t\t\tthis.updatePositions(this._startPositions, this._endPositions);\n\n\t\treturn this._startPositions;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get endPositions():Array\n\t{\n\t\tif (this._positionsDirty)\n\t\t\tthis.updatePositions(this._startPositions, this._endPositions);\n\n\t\treturn this._endPositions;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get thickness():Array\n\t{\n\t\tif (this._thicknessDirty)\n\t\t\tthis.updateThickness(this._thickness);\n\n\t\treturn this._thickness;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get startColors():Array\n\t{\n\t\tif (this._colorsDirty)\n\t\t\tthis.updateColors(this._startColors, this._endColors);\n\n\t\treturn this._startColors;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get endColors():Array\n\t{\n\t\tif (this._colorsDirty)\n\t\t\tthis.updateColors(this._startColors, this._endColors);\n\n\t\treturn this._endColors;\n\t}\n\n\t/**\n\t * The total amount of segments in the TriangleSubGeometry.\n\t */\n\tpublic get numSegments():number\n\t{\n\t\treturn this._numSegments;\n\t}\n\n\t/**\n\t *\n\t */\n\tconstructor()\n\t{\n\t\tsuper(true);\n\n\t\tthis._pSubMeshClass = LineSubMesh;\n\t}\n\n\tpublic getBoundingPositions():Array\n\t{\n\t\tif (this._boundingPositionDirty)\n\t\t\tthis._boundingPositions = this.startPositions.concat(this.endPositions);\n\n\t\treturn this._boundingPositions;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic updatePositions(startValues:Array, endValues:Array)\n\t{\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar values:Array\n\t\tvar index:number;\n\t\tvar stride:number;\n\t\tvar positions:Array;\n\t\tvar indices:Array;\n\n\t\tthis._startPositions = startValues;\n\n\t\tif (this._startPositions == null)\n\t\t\tthis._startPositions = new Array();\n\n\t\tthis._endPositions = endValues;\n\n\t\tif (this._endPositions == null)\n\t\t\tthis._endPositions = new Array();\n\n\t\tthis._boundingPositionDirty = true;\n\n\t\tthis._numSegments = this._startPositions.length/3;\n\n\t\tthis._pNumVertices = this._numSegments*4;\n\n\t\tvar lenV:number = this._pNumVertices*this.getStride(LineSubGeometry.VERTEX_DATA);\n\n\t\tif (this._pVertices == null)\n\t\t\tthis._pVertices = new Array(lenV);\n\t\telse if (this._pVertices.length != lenV)\n\t\t\tthis._pVertices.length = lenV;\n\n\t\ti = 0;\n\t\tj = 0;\n\t\tindex = this.getOffset(LineSubGeometry.START_POSITION_DATA);\n\t\tstride = this.getStride(LineSubGeometry.START_POSITION_DATA);\n\t\tpositions = this._pVertices;\n\t\tindices = new Array();\n\n\t\twhile (i < startValues.length) {\n\t\t\tvalues = (index/stride & 1)? endValues : startValues;\n\t\t\tpositions[index] = values[i];\n\t\t\tpositions[index + 1] = values[i + 1];\n\t\t\tpositions[index + 2] = values[i + 2];\n\n\t\t\tvalues = (index/stride & 1)? startValues : endValues;\n\t\t\tpositions[index + 3] = values[i];\n\t\t\tpositions[index + 4] = values[i + 1];\n\t\t\tpositions[index + 5] = values[i + 2];\n\n\t\t\tif (++j == 4) {\n\t\t\t\tvar o:number = index/stride - 3;\n\t\t\t\tindices.push(o, o + 1, o + 2, o + 3, o + 2, o + 1);\n\t\t\t\tj = 0;\n\t\t\t\ti += 3;\n\t\t\t}\n\n\t\t\tindex += stride;\n\t\t}\n\n\t\tthis.updateIndices(indices);\n\n\t\tthis.pInvalidateBounds();\n\n\t\tthis.notifyPositionsUpdate();\n\n\t\tthis._positionsDirty = false;\n\t}\n\n\t/**\n\t * Updates the thickness.\n\t */\n\tpublic updateThickness(values:Array)\n\t{\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar thickness:Array;\n\n\t\tthis._thickness = values;\n\n\t\tif (values != null) {\n\t\t\ti = 0;\n\t\t\tj = 0;\n\t\t\toffset = this.getOffset(LineSubGeometry.THICKNESS_DATA);\n\t\t\tstride = this.getStride(LineSubGeometry.THICKNESS_DATA);\n\t\t\tthickness = this._pVertices;\n\n\t\t\tindex = offset\n\t\t\twhile (i < values.length) {\n\t\t\t\tthickness[index] = (Math.floor(0.5*(index - offset)/stride + 0.5) & 1)? -values[i] : values[i];\n\n\t\t\t\tif (++j == 4) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\ti++;\n\t\t\t\t}\n\t\t\t\tindex += stride;\n\t\t\t}\n\t\t}\n\n\t\tthis.notifyThicknessUpdate();\n\n\t\tthis._thicknessDirty = false;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic updateColors(startValues:Array, endValues:Array)\n\t{\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar values:Array\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar colors:Array;\n\n\t\tthis._startColors = startValues;\n\n\t\tthis._endColors = endValues;\n\n\t\t//default to white\n\t\tif (this._startColors == null) {\n\t\t\tthis._startColors = new Array(this._numSegments*4);\n\n\t\t\ti = 0;\n\t\t\twhile (i < this._startColors.length)\n\t\t\t\tthis._startColors[i++] = 1;\n\t\t}\n\n\t\tif (this._endColors == null) {\n\t\t\tthis._endColors = new Array(this._numSegments*4);\n\n\t\t\ti = 0;\n\t\t\twhile (i < this._endColors.length)\n\t\t\t\tthis._endColors[i++] = 1;\n\t\t}\n\n\t\ti = 0;\n\t\tj = 0;\n\t\toffset = this.getOffset(LineSubGeometry.COLOR_DATA);\n\t\tstride = this.getStride(LineSubGeometry.COLOR_DATA);\n\t\tcolors = this._pVertices;\n\n\t\tindex = offset;\n\n\t\twhile (i < this._startColors.length) {\n\t\t\tvalues = ((index - offset)/stride & 1)? this._endColors : this._startColors;\n\t\t\tcolors[index] = values[i];\n\t\t\tcolors[index + 1] = values[i + 1];\n\t\t\tcolors[index + 2] = values[i + 2];\n\t\t\tcolors[index + 3] = values[i + 3];\n\n\t\t\tif (++j == 4) {\n\t\t\t\tj = 0;\n\t\t\t\ti += 4;\n\t\t\t}\n\n\t\t\tindex += stride;\n\t\t}\n\n\t\tthis.notifyColorsUpdate();\n\n\t\tthis._colorsDirty = false;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\n\t\tthis._startPositions = null;\n\t\tthis._endPositions = null;\n\t\tthis._thickness = null;\n\t\tthis._startColors = null;\n\t\tthis._endColors = null;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pInvalidateBounds()\n\t{\n\t\tif (this.parentGeometry)\n\t\t\tthis.parentGeometry.iInvalidateBounds(this);\n\t}\n\n\t/**\n\t * The Geometry object that 'owns' this TriangleSubGeometry object.\n\t *\n\t * @private\n\t */\n\tpublic parentGeometry:Geometry;\n\n\t/**\n\t * Clones the current object\n\t * @return An exact duplicate of the current object.\n\t */\n\tpublic clone():LineSubGeometry\n\t{\n\t\tvar clone:LineSubGeometry = new LineSubGeometry();\n\t\tclone.updateIndices(this._pIndices.concat());\n\t\tclone.updatePositions(this._startPositions.concat(), this._endPositions.concat());\n\t\tclone.updateThickness(this._thickness.concat());\n\t\tclone.updatePositions(this._startPositions.concat(), this._endPositions.concat());\n\n\t\treturn clone;\n\t}\n\n\tpublic _pNotifyVerticesUpdate()\n\t{\n\t\tthis._pStrideOffsetDirty = true;\n\n\t\tthis.notifyPositionsUpdate();\n\t\tthis.notifyThicknessUpdate();\n\t\tthis.notifyColorsUpdate();\n\t}\n\n\tprivate notifyPositionsUpdate()\n\t{\n\t\tif (this._positionsDirty)\n\t\t\treturn;\n\n\t\tthis._positionsDirty = true;\n\n\t\tif (!this._positionsUpdated)\n\t\t\tthis._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA);\n\n\t\tthis.dispatchEvent(this._positionsUpdated);\n\t}\n\n\tprivate notifyThicknessUpdate()\n\t{\n\t\tif (this._thicknessDirty)\n\t\t\treturn;\n\n\t\tthis._thicknessDirty = true;\n\n\t\tif (!this._thicknessUpdated)\n\t\t\tthis._thicknessUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.THICKNESS_DATA);\n\n\t\tthis.dispatchEvent(this._thicknessUpdated);\n\t}\n\n\tprivate notifyColorsUpdate()\n\t{\n\t\tif (this._colorsDirty)\n\t\t\treturn;\n\n\t\tthis._colorsDirty = true;\n\n\t\tif (!this._colorUpdated)\n\t\t\tthis._colorUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.COLOR_DATA);\n\n\t\tthis.dispatchEvent(this._colorUpdated);\n\t}\n}\n\nexport = LineSubGeometry;", + "import ISubMesh\t\t\t\t\t= require(\"awayjs-core/lib/core/base/ISubMesh\");\nimport LineSubGeometry\t\t\t= require(\"awayjs-core/lib/core/base/LineSubGeometry\");\nimport SubMeshBase\t\t\t\t= require(\"awayjs-core/lib/core/base/SubMeshBase\");\nimport AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport IRenderer\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Mesh\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Mesh\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * LineSubMesh wraps a LineSubGeometry as a scene graph instantiation. A LineSubMesh is owned by a Mesh object.\n *\n *\n * @see away.base.LineSubGeometry\n * @see away.entities.Mesh\n *\n * @class away.base.LineSubMesh\n */\nclass LineSubMesh extends SubMeshBase implements ISubMesh\n{\n\tprivate _subGeometry:LineSubGeometry;\n\n\t/**\n\t *\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.LINE_SUB_MESH;\n\t}\n\n\t/**\n\t * The LineSubGeometry object which provides the geometry data for this LineSubMesh.\n\t */\n\tpublic get subGeometry():LineSubGeometry\n\t{\n\t\treturn this._subGeometry;\n\t}\n\n\t/**\n\t * Creates a new LineSubMesh object\n\t * @param subGeometry The LineSubGeometry object which provides the geometry data for this LineSubMesh.\n\t * @param parentMesh The Mesh object to which this LineSubMesh belongs.\n\t * @param material An optional material used to render this LineSubMesh.\n\t */\n\tconstructor(subGeometry:LineSubGeometry, parentMesh:Mesh, material:MaterialBase = null)\n\t{\n\t\tsuper();\n\n\t\tthis._pParentMesh = parentMesh;\n\t\tthis._subGeometry = subGeometry;\n\t\tthis.material = material;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tthis.material = null;\n\n\t\tsuper.dispose();\n\t}\n\n\tpublic _iCollectRenderable(renderer:IRenderer)\n\t{\n\t\trenderer.applyLineSubMesh(this);\n\t}\n}\n\nexport = LineSubMesh;", + "import Loader\t\t\t\t\t= require(\"awayjs-core/lib/containers/Loader\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport EventDispatcher\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport ByteArray\t\t\t\t= require(\"awayjs-core/lib/utils/ByteArray\");\n\n/**\n * The LoaderInfo class provides information about a loaded SWF file or a\n * loaded image file(JPEG, GIF, or PNG). LoaderInfo objects are available for\n * any display object. The information provided includes load progress, the\n * URLs of the loader and loaded content, the number of bytes total for the\n * media, and the nominal height and width of the media.\n *\n *

You can access LoaderInfo objects in two ways:

\n *\n *
    \n *
  • The contentLoaderInfo property of a flash.display.Loader\n * object - The contentLoaderInfo property is always available\n * for any Loader object. For a Loader object that has not called the\n * load() or loadBytes() method, or that has not\n * sufficiently loaded, attempting to access many of the properties of the\n * contentLoaderInfo property throws an error.
  • \n *
  • The loaderInfo property of a display object.
  • \n *
\n *\n *

The contentLoaderInfo property of a Loader object provides\n * information about the content that the Loader object is loading, whereas\n * the loaderInfo property of a DisplayObject provides\n * information about the root SWF file for that display object.

\n *\n *

When you use a Loader object to load a display object(such as a SWF\n * file or a bitmap), the loaderInfo property of the display\n * object is the same as the contentLoaderInfo property of the\n * Loader object(DisplayObject.loaderInfo =\n * Loader.contentLoaderInfo). Because the instance of the main class of\n * the SWF file has no Loader object, the loaderInfo property is\n * the only way to access the LoaderInfo for the instance of the main class of\n * the SWF file.

\n *\n *

The following diagram shows the different uses of the LoaderInfo\n * object - for the instance of the main class of the SWF file, for the\n * contentLoaderInfo property of a Loader object, and for the\n * loaderInfo property of a loaded object:

\n *\n *

When a loading operation is not complete, some properties of the\n * contentLoaderInfo property of a Loader object are not\n * available. You can obtain some properties, such as\n * bytesLoaded, bytesTotal, url,\n * loaderURL, and applicationDomain. When the\n * loaderInfo object dispatches the init event, you\n * can access all properties of the loaderInfo object and the\n * loaded image or SWF file.

\n *\n *

Note: All properties of LoaderInfo objects are read-only.

\n *\n *

The EventDispatcher.dispatchEvent() method is not\n * applicable to LoaderInfo objects. If you call dispatchEvent()\n * on a LoaderInfo object, an IllegalOperationError exception is thrown.

\n * \n * @event complete Dispatched when data has loaded successfully. In other\n * words, it is dispatched when all the content has been\n * downloaded and the loading has finished. The\n * complete event is always dispatched after\n * the init event. The init event\n * is dispatched when the object is ready to access, though\n * the content may still be downloading.\n * @event httpStatus Dispatched when a network request is made over HTTP and\n * an HTTP status code can be detected.\n * @event init Dispatched when the properties and methods of a loaded\n * SWF file are accessible and ready for use. The content,\n * however, can still be downloading. A LoaderInfo object\n * dispatches the init event when the following\n * conditions exist:\n *
    \n *
  • All properties and methods associated with the\n * loaded object and those associated with the LoaderInfo\n * object are accessible.
  • \n *
  • The constructors for all child objects have\n * completed.
  • \n *
  • All ActionScript code in the first frame of the\n * loaded SWF's main timeline has been executed.
  • \n *
\n *\n *

For example, an Event.INIT is dispatched\n * when the first frame of a movie or animation is loaded.\n * The movie is then accessible and can be added to the\n * display list. The complete movie, however, can take\n * longer to download. The Event.COMPLETE is\n * only dispatched once the full movie is loaded.

\n *\n *

The init event always precedes the\n * complete event.

\n * @event ioError Dispatched when an input or output error occurs that\n * causes a load operation to fail.\n * @event open Dispatched when a load operation starts.\n * @event progress Dispatched when data is received as the download\n * operation progresses.\n * @event unload Dispatched by a LoaderInfo object whenever a loaded\n * object is removed by using the unload()\n * method of the Loader object, or when a second load is\n * performed by the same Loader object and the original\n * content is removed prior to the load beginning.\n */\nclass LoaderInfo extends EventDispatcher\n{\n\tprivate _bytes:ByteArray;\n\tprivate _bytesLoaded:number;\n\tprivate _bytesTotal:number;\n\tprivate _content:DisplayObject;\n\tprivate _contentType:string;\n\tprivate _loader:Loader;\n\tprivate _url:string;\n\t/**\n\t * The bytes associated with a LoaderInfo object.\n\t * \n\t * @throws SecurityError If the object accessing this API is prevented from\n\t * accessing the loaded object due to security\n\t * restrictions. This situation can occur, for\n\t * instance, when a Loader object attempts to access\n\t * the contentLoaderInfo.content property\n\t * and it is not granted security permission to access\n\t * the loaded content.\n\t *\n\t *

For more information related to security, see the\n\t * Flash Player Developer Center Topic: Security.

\n\t */\n\tpublic get bytes():ByteArray\n\t{\n\t\treturn this._bytes;\n\t}\n\n\t/**\n\t * The number of bytes that are loaded for the media. When this number equals\n\t * the value of bytesTotal, all of the bytes are loaded.\n\t */\n\tpublic get bytesLoaded():number /*int*/\n\t{\n\t\treturn this._bytesLoaded;\n\t}\n\n\t/**\n\t * The number of compressed bytes in the entire media file.\n\t *\n\t *

Before the first progress event is dispatched by this\n\t * LoaderInfo object's corresponding Loader object, bytesTotal\n\t * is 0. After the first progress event from the Loader object,\n\t * bytesTotal reflects the actual number of bytes to be\n\t * downloaded.

\n\t */\n\tpublic get bytesTotal():number /*int*/\n\t{\n\t\treturn this._bytesTotal;\n\t}\n\n\t/**\n\t * The loaded object associated with this LoaderInfo object.\n\t * \n\t * @throws SecurityError If the object accessing this API is prevented from\n\t * accessing the loaded object due to security\n\t * restrictions. This situation can occur, for\n\t * instance, when a Loader object attempts to access\n\t * the contentLoaderInfo.content property\n\t * and it is not granted security permission to access\n\t * the loaded content.\n\t *\n\t *

For more information related to security, see the\n\t * Flash Player Developer Center Topic: Security.

\n\t */\n\tpublic get content():DisplayObject\n\t{\n\t\treturn this._content;\n\t}\n\n\t/**\n\t * The MIME type of the loaded file. The value is null if not\n\t * enough of the file has loaded in order to determine the type. The\n\t * following list gives the possible values:\n\t *
    \n\t *
  • \"application/x-shockwave-flash\"
  • \n\t *
  • \"image/jpeg\"
  • \n\t *
  • \"image/gif\"
  • \n\t *
  • \"image/png\"
  • \n\t *
\n\t */\n\tpublic get contentType():string\n\t{\n\t\treturn this._contentType;\n\t}\n\n\t/**\n\t * The Loader object associated with this LoaderInfo object. If this\n\t * LoaderInfo object is the loaderInfo property of the instance\n\t * of the main class of the SWF file, no Loader object is associated.\n\t * \n\t * @throws SecurityError If the object accessing this API is prevented from\n\t * accessing the Loader object because of security\n\t * restrictions. This can occur, for instance, when a\n\t * loaded SWF file attempts to access its\n\t * loaderInfo.loader property and it is\n\t * not granted security permission to access the\n\t * loading SWF file.\n\t *\n\t *

For more information related to security, see the\n\t * Flash Player Developer Center Topic: Security.

\n\t */\n\tpublic get loader():Loader\n\t{\n\t\treturn this._loader;\n\t}\n\n\t/**\n\t * The URL of the media being loaded.\n\t *\n\t *

Before the first progress event is dispatched by this\n\t * LoaderInfo object's corresponding Loader object, the value of the\n\t * url property might reflect only the initial URL specified in\n\t * the call to the load() method of the Loader object. After the\n\t * first progress event, the url property reflects\n\t * the media's final URL, after any redirects and relative URLs are\n\t * resolved.

\n\t *\n\t *

In some cases, the value of the url property is truncated;\n\t * see the isURLInaccessible property for details.

\n\t */\n\tpublic get url():string\n\t{\n\t\treturn this._url;\n\t}\n}\n\nexport = LoaderInfo;", + "class OrientationMode\n{\n\t/**\n\t *\n\t */\n\tpublic static DEFAULT:string = \"default\";\n\n\t/**\n\t *\n\t */\n\tpublic static CAMERA_PLANE:string = \"cameraPlane\";\n\n\t/**\n\t *\n\t */\n\tpublic static CAMERA_POSITION:string = \"cameraPosition\";\n}\n\nexport = OrientationMode;", + "/**\n * The PixelSnapping class is an enumeration of constant values for setting\n * the pixel snapping options by using the pixelSnapping property\n * of a Bitmap object.\n */\nclass PixelSnapping\n{\n\t/**\n\t * A constant value used in the pixelSnapping property of a\n\t * Bitmap object to specify that the bitmap image is always snapped to the\n\t * nearest pixel, independent of any transformation.\n\t */\n\tpublic static ALWAYS:string = \"always\";\n\n\t/**\n\t * A constant value used in the pixelSnapping property of a\n\t * Bitmap object to specify that the bitmap image is snapped to the nearest\n\t * pixel if it is drawn with no rotation or skew and it is drawn at a scale\n\t * factor of 99.9% to 100.1%. If these conditions are satisfied, the image is\n\t * drawn at 100% scale, snapped to the nearest pixel. Internally, this\n\t * setting allows the image to be drawn as fast as possible by using the\n\t * vector renderer.\n\t */\n\tpublic static AUTO:string = \"auto\";\n\n\t/**\n\t * A constant value used in the pixelSnapping property of a\n\t * Bitmap object to specify that no pixel snapping occurs.\n\t */\n\tpublic static NEVER:string = \"never\";\n}\n\nexport = PixelSnapping;", + "/**\n * The SpreadMethod class provides values for the spreadMethod\n * parameter in the beginGradientFill() and\n * lineGradientStyle() methods of the Graphics class.\n *\n *

The following example shows the same gradient fill using various spread\n * methods:

\n */\nclass SpreadMethod\n{\n\t/**\n\t * Specifies that the gradient use the pad spread method.\n\t */\n\tpublic static PAD:string = \"pad\";\n\n\t/**\n\t * Specifies that the gradient use the reflect spread method.\n\t */\n\tpublic static REFLECT:string = \"reflect\";\n\n\t/**\n\t * Specifies that the gradient use the repeat spread method.\n\t */\n\tpublic static REPEAT:string = \"repeat\";\n}\n\nexport = SpreadMethod;", + "import Geometry\t\t\t\t\t= require(\"awayjs-core/lib/core/base/Geometry\");\nimport ISubMeshClass\t\t\t= require(\"awayjs-core/lib/core/base/ISubMeshClass\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Rectangle\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport SubGeometryEvent\t\t\t= require(\"awayjs-core/lib/events/SubGeometryEvent\");\n\n/**\n * @class away.base.TriangleSubGeometry\n */\nclass SubGeometryBase extends NamedAssetBase\n{\n\tpublic static VERTEX_DATA:string = \"vertices\";\n\n\tpublic _pStrideOffsetDirty:boolean = true;\n\n\tpublic _pIndices:Array /*uint*/;\n\tpublic _pVertices:Array;\n\n\tprivate _numIndices:number;\n\tprivate _numTriangles:number;\n\tpublic _pNumVertices:number;\n\n\tpublic _pConcatenateArrays:boolean = true;\n\n\tprivate _indicesUpdated:SubGeometryEvent;\n\n\tpublic _pStride:Object = new Object();\n\tpublic _pOffset:Object = new Object();\n\n\tpublic _pUpdateStrideOffset()\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic _pSubMeshClass:ISubMeshClass;\n\n\tpublic get subMeshClass():ISubMeshClass\n\t{\n\t\treturn this._pSubMeshClass;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get concatenateArrays():boolean\n\t{\n\t\treturn this._pConcatenateArrays;\n\t}\n\n\tpublic set concatenateArrays(value:boolean)\n\t{\n\t\tif (this._pConcatenateArrays == value)\n\t\t\treturn;\n\n\t\tthis._pConcatenateArrays = value;\n\n\t\tthis._pStrideOffsetDirty = true;\n\n\t\tif (value)\n\t\t\tthis._pNotifyVerticesUpdate();\n\t}\n\n\t/**\n\t * The raw index data that define the faces.\n\t */\n\tpublic get indices():Array\n\t{\n\t\treturn this._pIndices;\n\t}\n\n\t/**\n\t * \n\t */\n\tpublic get vertices():Array\n\t{\n\t\tthis.updateVertices();\n\n\t\treturn this._pVertices;\n\t}\n\n\t/**\n\t * The total amount of triangles in the TriangleSubGeometry.\n\t */\n\tpublic get numTriangles():number\n\t{\n\t\treturn this._numTriangles;\n\t}\n\n\tpublic get numVertices():number\n\t{\n\t\treturn this._pNumVertices;\n\t}\n\n\t/**\n\t *\n\t */\n\tconstructor(concatenatedArrays:boolean)\n\t{\n\t\tsuper();\n\n\t\tthis._pConcatenateArrays = concatenatedArrays;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic getStride(dataType:string)\n\t{\n\t\tif (this._pStrideOffsetDirty)\n\t\t\tthis._pUpdateStrideOffset();\n\n\t\treturn this._pStride[dataType];\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic getOffset(dataType:string)\n\t{\n\t\tif (this._pStrideOffsetDirty)\n\t\t\tthis._pUpdateStrideOffset();\n\n\t\treturn this._pOffset[dataType];\n\t}\n\n\tpublic updateVertices()\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tthis._pIndices = null;\n\t\tthis._pVertices = null;\n\t}\n\n\t/**\n\t * Updates the face indices of the TriangleSubGeometry.\n\t *\n\t * @param indices The face indices to upload.\n\t */\n\tpublic updateIndices(indices:Array)\n\t{\n\t\tthis._pIndices = indices;\n\t\tthis._numIndices = indices.length;\n\n\t\tthis._numTriangles = this._numIndices/3;\n\n\t\tthis.notifyIndicesUpdate();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pInvalidateBounds()\n\t{\n\t\tif (this.parentGeometry)\n\t\t\tthis.parentGeometry.iInvalidateBounds(this);\n\t}\n\n\t/**\n\t * The Geometry object that 'owns' this TriangleSubGeometry object.\n\t *\n\t * @private\n\t */\n\tpublic parentGeometry:Geometry;\n\n\t/**\n\t * Clones the current object\n\t * @return An exact duplicate of the current object.\n\t */\n\tpublic clone():SubGeometryBase\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic applyTransformation(transform:Matrix3D)\n\t{\n\n\t}\n\n\t/**\n\t * Scales the geometry.\n\t * @param scale The amount by which to scale.\n\t */\n\tpublic scale(scale:number)\n\t{\n\n\t}\n\n\tpublic scaleUV(scaleU:number = 1, scaleV:number = 1)\n\t{\n\n\t}\n\n\tpublic getBoundingPositions():Array\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tprivate notifyIndicesUpdate()\n\t{\n\t\tif (!this._indicesUpdated)\n\t\t\tthis._indicesUpdated = new SubGeometryEvent(SubGeometryEvent.INDICES_UPDATED);\n\n\t\tthis.dispatchEvent(this._indicesUpdated);\n\t}\n\n\tpublic _pNotifyVerticesUpdate()\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n}\n\nexport = SubGeometryBase;", + "import IAnimator\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimator\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport UVTransform\t\t\t\t= require(\"awayjs-core/lib/core/geom/UVTransform\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport IRenderable\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport IRenderer\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Camera\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport Mesh\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Mesh\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * SubMeshBase wraps a TriangleSubGeometry as a scene graph instantiation. A SubMeshBase is owned by a Mesh object.\n *\n *\n * @see away.base.TriangleSubGeometry\n * @see away.entities.Mesh\n *\n * @class away.base.SubMeshBase\n */\nclass SubMeshBase extends NamedAssetBase\n{\n\tpublic _pParentMesh:Mesh;\n\tpublic _uvTransform:UVTransform;\n\n\tpublic _iIndex:number = 0;\n\n\tpublic _material:MaterialBase;\n\tprivate _renderables:Array = new Array();\n\n\t//TODO test shader picking\n//\t\tpublic get shaderPickingDetails():boolean\n//\t\t{\n//\n//\t\t\treturn this.sourceEntity.shaderPickingDetails;\n//\t\t}\n\n\t/**\n\t * The animator object that provides the state for the TriangleSubMesh's animation.\n\t */\n\tpublic get animator():IAnimator\n\t{\n\t\treturn this._pParentMesh.animator;\n\t}\n\n\t/**\n\t * The material used to render the current TriangleSubMesh. If set to null, its parent Mesh's material will be used instead.\n\t */\n\tpublic get material():MaterialBase\n\t{\n\t\treturn this._material || this._pParentMesh.material;\n\t}\n\n\tpublic set material(value:MaterialBase)\n\t{\n\t\tif (this.material)\n\t\t\tthis.material.iRemoveOwner(this);\n\n\t\tthis._material = value;\n\n\t\tif (this.material)\n\t\t\tthis.material.iAddOwner(this);\n\t}\n\n\t/**\n\t * The scene transform object that transforms from model to world space.\n\t */\n\tpublic get sceneTransform():Matrix3D\n\t{\n\t\treturn this._pParentMesh.sceneTransform;\n\t}\n\n\t/**\n\t * The entity that that initially provided the IRenderable to the render pipeline (ie: the owning Mesh object).\n\t */\n\tpublic get parentMesh():Mesh\n\t{\n\t\treturn this._pParentMesh;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get uvTransform():UVTransform\n\t{\n\t\treturn this._uvTransform || this._pParentMesh.uvTransform;\n\t}\n\n\tpublic set uvTransform(value:UVTransform)\n\t{\n\t\tthis._uvTransform = value;\n\t}\n\n\t/**\n\t * Creates a new SubMeshBase object\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tthis.material = null;\n\n\t\tvar len:number = this._renderables.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis._renderables[i].dispose();\n\t}\n\n\t/**\n\t *\n\t * @param camera\n\t * @returns {away.geom.Matrix3D}\n\t */\n\tpublic getRenderSceneTransform(camera:Camera):Matrix3D\n\t{\n\t\treturn this._pParentMesh.getRenderSceneTransform(camera);\n\t}\n\n\tpublic _iAddRenderable(renderable:IRenderable):IRenderable\n\t{\n\t\tthis._renderables.push(renderable);\n\n\t\treturn renderable;\n\t}\n\n\n\tpublic _iRemoveRenderable(renderable:IRenderable):IRenderable\n\t{\n\t\tvar index:number = this._renderables.indexOf(renderable);\n\n\t\tthis._renderables.splice(index, 1);\n\n\t\treturn renderable;\n\t}\n\n\tpublic _iInvalidateRenderableGeometry()\n\t{\n\t\tvar len:number = this._renderables.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis._renderables[i].invalidateGeometry();\n\t}\n\n\tpublic _iCollectRenderable(renderer:IRenderer)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic _iGetExplicitMaterial():MaterialBase\n\t{\n\t\treturn this._material;\n\t}\n}\n\nexport = SubMeshBase;", + "/**\n * Defines codes for culling algorithms that determine which triangles not to\n * render when drawing triangle paths.\n *\n *

The terms POSITIVE and NEGATIVE refer to the\n * sign of a triangle's normal along the z-axis. The normal is a 3D vector\n * that is perpendicular to the surface of the triangle.

\n *\n *

A triangle whose vertices 0, 1, and 2 are arranged in a clockwise order\n * has a positive normal value. That is, its normal points in a positive\n * z-axis direction, away from the current view point. When the\n * TriangleCulling.POSITIVE algorithm is used, triangles with\n * positive normals are not rendered. Another term for this is backface\n * culling.

\n *\n *

A triangle whose vertices are arranged in a counter-clockwise order has\n * a negative normal value. That is, its normal points in a negative z-axis\n * direction, toward the current view point. When the\n * TriangleCulling.NEGATIVE algorithm is used, triangles with\n * negative normals will not be rendered.

\n */\nclass TriangleCulling\n{\n\t/**\n\t * Specifies culling of all triangles facing toward the current view point.\n\t */\n\tpublic static NEGATIVE:string = \"negative\";\n\n\t/**\n\t * Specifies no culling. All triangles in the path are rendered.\n\t */\n\tpublic static NONE:string = \"none\";\n\n\t/**\n\t * Specifies culling of all triangles facing away from the current view\n\t * point. This is also known as backface culling.\n\t */\n\tpublic static POSITIVE:string = \"positive\";\n}\n\nexport = TriangleCulling;", + "import SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubMesh\t\t\t= require(\"awayjs-core/lib/core/base/TriangleSubMesh\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport SubGeometryEvent\t\t\t= require(\"awayjs-core/lib/events/SubGeometryEvent\");\n\n/**\n * @class away.base.TriangleSubGeometry\n */\nclass TriangleSubGeometry extends SubGeometryBase\n{\n\tpublic static POSITION_DATA:string = \"positions\";\n\tpublic static NORMAL_DATA:string = \"vertexNormals\";\n\tpublic static TANGENT_DATA:string = \"vertexTangents\";\n\tpublic static UV_DATA:string = \"uvs\";\n\tpublic static SECONDARY_UV_DATA:string = \"secondaryUVs\";\n\tpublic static JOINT_INDEX_DATA:string = \"jointIndices\";\n\tpublic static JOINT_WEIGHT_DATA:string = \"jointWeights\";\n\n\t//TODO - move these to StageGL\n\tpublic static POSITION_FORMAT:string = \"float3\";\n\tpublic static NORMAL_FORMAT:string = \"float3\";\n\tpublic static TANGENT_FORMAT:string = \"float3\";\n\tpublic static UV_FORMAT:string = \"float2\";\n\tpublic static SECONDARY_UV_FORMAT:string = \"float2\";\n\n\tprivate _positionsDirty:boolean = true;\n\tprivate _faceNormalsDirty:boolean = true;\n\tprivate _faceTangentsDirty:boolean = true;\n\tprivate _vertexNormalsDirty:boolean = true;\n\tprivate _vertexTangentsDirty:boolean = true;\n\tprivate _uvsDirty:boolean = true;\n\tprivate _secondaryUVsDirty:boolean = true;\n\tprivate _jointIndicesDirty:boolean = true;\n\tprivate _jointWeightsDirty:boolean = true;\n\n\tprivate _positions:Array;\n\tprivate _vertexNormals:Array;\n\tprivate _vertexTangents:Array;\n\tprivate _uvs:Array;\n\tprivate _secondaryUVs:Array;\n\tprivate _jointIndices:Array;\n\tprivate _jointWeights:Array;\n\n\tprivate _useCondensedIndices:boolean;\n\tprivate _condensedJointIndices:Array;\n\tprivate _condensedIndexLookUp:Array;\n\tprivate _numCondensedJoints:number;\n\n\tprivate _jointsPerVertex:number;\n\n\tprivate _concatenateArrays:boolean = true;\n\tprivate _autoDeriveNormals:boolean = true;\n\tprivate _autoDeriveTangents:boolean = true;\n\tprivate _autoDeriveUVs:boolean = false;\n\tprivate _useFaceWeights:boolean = false;\n\n\tprivate _faceNormals:Array;\n\tprivate _faceTangents:Array;\n\tprivate _faceWeights:Array;\n\n\tprivate _scaleU:number = 1;\n\tprivate _scaleV:number = 1;\n\n\tprivate _positionsUpdated:SubGeometryEvent;\n\tprivate _normalsUpdated:SubGeometryEvent;\n\tprivate _tangentsUpdated:SubGeometryEvent;\n\tprivate _uvsUpdated:SubGeometryEvent;\n\tprivate _secondaryUVsUpdated:SubGeometryEvent;\n\tprivate _jointIndicesUpdated:SubGeometryEvent;\n\tprivate _jointWeightsUpdated:SubGeometryEvent;\n\n\t/**\n\t *\n\t */\n\tpublic get scaleU():number\n\t{\n\t\treturn this._scaleU;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get scaleV():number\n\t{\n\t\treturn this._scaleV;\n\t}\n\n\t/**\n\t * Offers the option of enabling GPU accelerated animation on skeletons larger than 32 joints\n\t * by condensing the number of joint index values required per mesh. Only applicable to\n\t * skeleton animations that utilise more than one mesh object. Defaults to false.\n\t */\n\tpublic get useCondensedIndices():boolean\n\t{\n\t\treturn this._useCondensedIndices;\n\t}\n\n\tpublic set useCondensedIndices(value:boolean)\n\t{\n\t\tif (this._useCondensedIndices == value)\n\t\t\treturn;\n\n\t\tthis._useCondensedIndices = value;\n\n\t\tthis.notifyJointIndicesUpdate();\n\t}\n\n\tpublic _pUpdateStrideOffset()\n\t{\n\t\tif (this._concatenateArrays) {\n\t\t\tthis._pOffset[TriangleSubGeometry.VERTEX_DATA] = 0;\n\n\t\t\t//always have positions\n\t\t\tthis._pOffset[TriangleSubGeometry.POSITION_DATA] = 0;\n\t\t\tvar stride:number = 3;\n\n\t\t\tif (this._vertexNormals != null) {\n\t\t\t\tthis._pOffset[TriangleSubGeometry.NORMAL_DATA] = stride;\n\t\t\t\tstride += 3;\n\t\t\t}\n\n\t\t\tif (this._vertexTangents != null) {\n\t\t\t\tthis._pOffset[TriangleSubGeometry.TANGENT_DATA] = stride;\n\t\t\t\tstride += 3;\n\t\t\t}\n\n\t\t\tif (this._uvs != null) {\n\t\t\t\tthis._pOffset[TriangleSubGeometry.UV_DATA] = stride;\n\t\t\t\tstride += 2;\n\t\t\t}\n\n\t\t\tif (this._secondaryUVs != null) {\n\t\t\t\tthis._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = stride;\n\t\t\t\tstride += 2;\n\t\t\t}\n\n\t\t\tif (this._jointIndices != null) {\n\t\t\t\tthis._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = stride;\n\t\t\t\tstride += this._jointsPerVertex;\n\t\t\t}\n\n\t\t\tif (this._jointWeights != null) {\n\t\t\t\tthis._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride;\n\t\t\t\tstride += this._jointsPerVertex;\n\t\t\t}\n\n\t\t\tthis._pStride[TriangleSubGeometry.VERTEX_DATA] = stride;\n\t\t\tthis._pStride[TriangleSubGeometry.POSITION_DATA] = stride;\n\t\t\tthis._pStride[TriangleSubGeometry.NORMAL_DATA] = stride;\n\t\t\tthis._pStride[TriangleSubGeometry.TANGENT_DATA] = stride;\n\t\t\tthis._pStride[TriangleSubGeometry.UV_DATA] = stride;\n\t\t\tthis._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = stride;\n\t\t\tthis._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = stride;\n\t\t\tthis._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride;\n\n\t\t\tvar len:number = this._pNumVertices*stride;\n\n\t\t\tif (this._pVertices == null)\n\t\t\t\tthis._pVertices = new Array(len);\n\t\t\telse if (this._pVertices.length != len)\n\t\t\t\tthis._pVertices.length = len;\n\n\t\t} else {\n\t\t\tthis._pOffset[TriangleSubGeometry.POSITION_DATA] = 0;\n\t\t\tthis._pOffset[TriangleSubGeometry.NORMAL_DATA] = 0;\n\t\t\tthis._pOffset[TriangleSubGeometry.TANGENT_DATA] = 0;\n\t\t\tthis._pOffset[TriangleSubGeometry.UV_DATA] = 0;\n\t\t\tthis._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = 0;\n\t\t\tthis._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = 0;\n\t\t\tthis._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = 0;\n\n\t\t\tthis._pStride[TriangleSubGeometry.POSITION_DATA] = 3;\n\t\t\tthis._pStride[TriangleSubGeometry.NORMAL_DATA] = 3;\n\t\t\tthis._pStride[TriangleSubGeometry.TANGENT_DATA] = 3;\n\t\t\tthis._pStride[TriangleSubGeometry.UV_DATA] = 2;\n\t\t\tthis._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = 2;\n\t\t\tthis._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = this._jointsPerVertex;\n\t\t\tthis._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = this._jointsPerVertex;\n\t\t}\n\n\t\tthis._pStrideOffsetDirty = false;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get jointsPerVertex():number\n\t{\n\t\treturn this._jointsPerVertex;\n\t}\n\n\tpublic set jointsPerVertex(value:number)\n\t{\n\t\tif (this._jointsPerVertex == value)\n\t\t\treturn;\n\n\t\tthis._jointsPerVertex = value;\n\n\t\tthis._pStrideOffsetDirty = true;\n\n\t\tif (this._pConcatenateArrays)\n\t\t\tthis._pNotifyVerticesUpdate();\n\t}\n\n\t/**\n\t * Defines whether a UV buffer should be automatically generated to contain dummy UV coordinates.\n\t * Set to true if a geometry lacks UV data but uses a material that requires it, or leave as false\n\t * in cases where UV data is explicitly defined or the material does not require UV data.\n\t */\n\tpublic get autoDeriveUVs():boolean\n\t{\n\t\treturn this._autoDeriveUVs;\n\t}\n\n\tpublic set autoDeriveUVs(value:boolean)\n\t{\n\t\tif (this._autoDeriveUVs == value)\n\t\t\treturn;\n\n\t\tthis._autoDeriveUVs = value;\n\n\t\tif (value)\n\t\t\tthis.notifyUVsUpdate();\n\t}\n\n\t/**\n\t * True if the vertex normals should be derived from the geometry, false if the vertex normals are set\n\t * explicitly.\n\t */\n\tpublic get autoDeriveNormals():boolean\n\t{\n\t\treturn this._autoDeriveNormals;\n\t}\n\n\tpublic set autoDeriveNormals(value:boolean)\n\t{\n\t\tif (this._autoDeriveNormals == value)\n\t\t\treturn;\n\n\t\tthis._autoDeriveNormals = value;\n\n\t\tif (value)\n\t\t\tthis.notifyNormalsUpdate();\n\t}\n\n\t/**\n\t * True if the vertex tangents should be derived from the geometry, false if the vertex normals are set\n\t * explicitly.\n\t */\n\tpublic get autoDeriveTangents():boolean\n\t{\n\t\treturn this._autoDeriveTangents;\n\t}\n\n\tpublic set autoDeriveTangents(value:boolean)\n\t{\n\t\tif (this._autoDeriveTangents == value)\n\t\t\treturn;\n\n\t\tthis._autoDeriveTangents = value;\n\n\t\tif (value)\n\t\t\tthis.notifyTangentsUpdate();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get vertices():Array\n\t{\n\t\tif (this._positionsDirty)\n\t\t\tthis.updatePositions(this._positions);\n\n\t\tif (this._vertexNormalsDirty)\n\t\t\tthis.updateVertexNormals(this._vertexNormals);\n\n\t\tif (this._vertexTangentsDirty)\n\t\t\tthis.updateVertexTangents(this._vertexTangents);\n\n\t\tif (this._uvsDirty)\n\t\t\tthis.updateUVs(this._uvs);\n\n\t\tif (this._secondaryUVsDirty)\n\t\t\tthis.updateSecondaryUVs(this._secondaryUVs);\n\n\t\tif (this._jointIndicesDirty)\n\t\t\tthis.updateJointIndices(this._jointIndices);\n\n\t\tif (this._jointWeightsDirty)\n\t\t\tthis.updateJointWeights(this._jointWeights);\n\n\t\treturn this._pVertices;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get positions():Array\n\t{\n\t\tif (this._positionsDirty)\n\t\t\tthis.updatePositions(this._positions);\n\n\t\treturn this._positions;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get vertexNormals():Array\n\t{\n\t\tif (this._vertexNormalsDirty)\n\t\t\tthis.updateVertexNormals(this._vertexNormals);\n\n\t\treturn this._vertexNormals;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get vertexTangents():Array\n\t{\n\t\tif (this._vertexTangentsDirty)\n\t\t\tthis.updateVertexTangents(this._vertexTangents);\n\n\t\treturn this._vertexTangents;\n\t}\n\n\t/**\n\t * The raw data of the face normals, in the same order as the faces are listed in the index list.\n\t */\n\tpublic get faceNormals():Array\n\t{\n\t\tif (this._faceNormalsDirty)\n\t\t\tthis.updateFaceNormals();\n\n\t\treturn this._faceNormals;\n\t}\n\n\t/**\n\t * The raw data of the face tangets, in the same order as the faces are listed in the index list.\n\t */\n\tpublic get faceTangents():Array\n\t{\n\t\tif (this._faceTangentsDirty)\n\t\t\tthis.updateFaceTangents();\n\n\t\treturn this._faceTangents;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get uvs():Array\n\t{\n\t\tif (this._uvsDirty)\n\t\t\tthis.updateUVs(this._uvs);\n\n\t\treturn this._uvs;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get secondaryUVs():Array\n\t{\n\t\tif (this._secondaryUVsDirty)\n\t\t\tthis.updateSecondaryUVs(this._secondaryUVs);\n\n\t\treturn this._secondaryUVs;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get jointIndices():Array\n\t{\n\t\tif (this._jointIndicesDirty)\n\t\t\tthis.updateJointIndices(this._jointIndices);\n\n\t\tif (this._useCondensedIndices)\n\t\t\treturn this._condensedJointIndices;\n\n\t\treturn this._jointIndices;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get jointWeights():Array\n\t{\n\t\tif (this._jointWeightsDirty)\n\t\t\tthis.updateJointWeights(this._jointWeights);\n\n\t\treturn this._jointWeights;\n\t}\n\n\t/**\n\t * Indicates whether or not to take the size of faces into account when auto-deriving vertex normals and tangents.\n\t */\n\tpublic get useFaceWeights():boolean\n\t{\n\t\treturn this._useFaceWeights;\n\t}\n\n\tpublic set useFaceWeights(value:boolean)\n\t{\n\t\tif (this._useFaceWeights == value)\n\t\t\treturn;\n\n\t\tthis._useFaceWeights = value;\n\n\t\tif (this._autoDeriveNormals)\n\t\t\tthis.notifyNormalsUpdate();\n\n\t\tif (this._autoDeriveTangents)\n\t\t\tthis.notifyTangentsUpdate();\n\n\t\tthis._faceNormalsDirty = true;\n\t}\n\n\tpublic get numCondensedJoints():number\n\t{\n\t\tif (this._jointIndicesDirty)\n\t\t\tthis.updateJointIndices(this._jointIndices);\n\n\t\treturn this._numCondensedJoints;\n\t}\n\n\tpublic get condensedIndexLookUp():Array\n\t{\n\t\tif (this._jointIndicesDirty)\n\t\t\tthis.updateJointIndices(this._jointIndices);\n\n\t\treturn this._condensedIndexLookUp;\n\t}\n\n\t/**\n\t *\n\t */\n\tconstructor(concatenatedArrays:boolean)\n\t{\n\t\tsuper(concatenatedArrays);\n\n\t\tthis._pSubMeshClass = TriangleSubMesh;\n\t}\n\n\tpublic getBoundingPositions():Array\n\t{\n\t\tif (this._positionsDirty)\n\t\t\tthis.updatePositions(this._positions);\n\n\t\treturn this._positions;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic updatePositions(values:Array)\n\t{\n\t\tvar i:number;\n\t\tvar index:number;\n\t\tvar stride:number;\n\t\tvar positions:Array;\n\n\t\tthis._positions = values;\n\n\t\tif (this._positions == null)\n\t\t\tthis._positions = new Array();\n\n\t\tthis._pNumVertices = this._positions.length/3;\n\n\t\tif (this._concatenateArrays) {\n\t\t\tvar len:number = this._pNumVertices*this.getStride(TriangleSubGeometry.VERTEX_DATA);\n\n\t\t\tif (this._pVertices == null)\n\t\t\t\tthis._pVertices = new Array(len);\n\t\t\telse if (this._pVertices.length != len)\n\t\t\t\tthis._pVertices.length = len;\n\n\t\t\ti = 0;\n\t\t\tindex = this.getOffset(TriangleSubGeometry.POSITION_DATA);\n\t\t\tstride = this.getStride(TriangleSubGeometry.POSITION_DATA);\n\t\t\tpositions = this._pVertices;\n\n\t\t\twhile (i < values.length) {\n\t\t\t\tpositions[index] = values[i++];\n\t\t\t\tpositions[index + 1] = values[i++];\n\t\t\t\tpositions[index + 2] = values[i++];\n\t\t\t\tindex += stride;\n\t\t\t}\n\t\t}\n\n\t\tif (this._autoDeriveNormals)\n\t\t\tthis.notifyNormalsUpdate();\n\n\t\tif (this._autoDeriveTangents)\n\t\t\tthis.notifyTangentsUpdate();\n\n\t\tif (this._autoDeriveUVs)\n\t\t\tthis.notifyUVsUpdate()\n\n\t\tthis.pInvalidateBounds();\n\n\t\tthis.notifyPositionsUpdate();\n\n\t\tthis._positionsDirty = false;\n\t}\n\n\t/**\n\t * Updates the vertex normals based on the geometry.\n\t */\n\tpublic updateVertexNormals(values:Array)\n\t{\n\t\tvar i:number;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar normals:Array;\n\n\t\tif (!this._autoDeriveNormals) {\n\t\t\tif ((this._vertexNormals == null || values == null) && (this._vertexNormals != null || values != null)) {\n\t\t\t\tif (this._concatenateArrays)\n\t\t\t\t\tthis._pNotifyVerticesUpdate();\n\t\t\t\telse\n\t\t\t\t\tthis._pStrideOffsetDirty = true;\n\t\t\t}\n\n\t\t\tthis._vertexNormals = values;\n\n\t\t\tif (values != null && this._concatenateArrays) {\n\t\t\t\ti = 0;\n\t\t\t\tindex = this.getOffset(TriangleSubGeometry.NORMAL_DATA);\n\t\t\t\tstride = this.getStride(TriangleSubGeometry.NORMAL_DATA);\n\t\t\t\tnormals = this._pVertices;\n\n\t\t\t\twhile (i < values.length) {\n\t\t\t\t\tnormals[index] = values[i++];\n\t\t\t\t\tnormals[index + 1] = values[i++];\n\t\t\t\t\tnormals[index + 2] = values[i++];\n\t\t\t\t\tindex += stride;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._vertexNormals == null) {\n\t\t\t\tthis._vertexNormals = new Array(this._positions.length);\n\n\t\t\t\tif (this._concatenateArrays)\n\t\t\t\t\tthis._pNotifyVerticesUpdate();\n\t\t\t\telse\n\t\t\t\t\tthis._pStrideOffsetDirty = true;\n\t\t\t}\n\n\t\t\tif (this._faceNormalsDirty)\n\t\t\t\tthis.updateFaceNormals();\n\n\t\t\toffset = this.getOffset(TriangleSubGeometry.NORMAL_DATA);\n\t\t\tstride = this.getStride(TriangleSubGeometry.NORMAL_DATA);\n\n\t\t\t//autoderived normals\n\t\t\tnormals = this._concatenateArrays? this._pVertices : this._vertexNormals;\n\n\t\t\tvar f1:number = 0;\n\t\t\tvar f2:number = 1;\n\t\t\tvar f3:number = 2;\n\n\t\t\tindex = offset;\n\n\t\t\t//clear normal values\n\t\t\tvar lenV:number = normals.length;\n\t\t\twhile (index < lenV) {\n\t\t\t\tnormals[index] = 0;\n\t\t\t\tnormals[index + 1] = 0;\n\t\t\t\tnormals[index + 2] = 0;\n\t\t\t\tindex += stride;\n\t\t\t}\n\n\t\t\tvar k:number = 0;\n\t\t\tvar lenI:number = this._pIndices.length;\n\t\t\tvar weight:number;\n\n\t\t\ti = 0;\n\n\t\t\t//collect face normals\n\t\t\twhile (i < lenI) {\n\t\t\t\tweight = this._useFaceWeights? this._faceWeights[k++] : 1;\n\t\t\t\tindex = offset + this._pIndices[i++]*stride;\n\t\t\t\tnormals[index] += this._faceNormals[f1]*weight;\n\t\t\t\tnormals[index + 1] += this._faceNormals[f2]*weight;\n\t\t\t\tnormals[index + 2] += this._faceNormals[f3]*weight;\n\t\t\t\tindex = offset + this._pIndices[i++]*stride;\n\t\t\t\tnormals[index] += this._faceNormals[f1]*weight;\n\t\t\t\tnormals[index + 1] += this._faceNormals[f2]*weight;\n\t\t\t\tnormals[index + 2] += this._faceNormals[f3]*weight;\n\t\t\t\tindex = offset + this._pIndices[i++]*stride;\n\t\t\t\tnormals[index] += this._faceNormals[f1]*weight;\n\t\t\t\tnormals[index + 1] += this._faceNormals[f2]*weight;\n\t\t\t\tnormals[index + 2] += this._faceNormals[f3]*weight;\n\t\t\t\tf1 += 3;\n\t\t\t\tf2 += 3;\n\t\t\t\tf3 += 3;\n\t\t\t}\n\n\t\t\ti = 0;\n\t\t\tindex = offset;\n\n\t\t\t//average normals collections\n\t\t\twhile (index < lenV) {\n\t\t\t\tvar vx:number = normals[index];\n\t\t\t\tvar vy:number = normals[index + 1];\n\t\t\t\tvar vz:number = normals[index + 2];\n\t\t\t\tvar d:number = 1.0/Math.sqrt(vx*vx + vy*vy + vz*vz);\n\n\t\t\t\tif (this._concatenateArrays) {\n\t\t\t\t\tthis._vertexNormals[i++] = normals[index] = vx*d;\n\t\t\t\t\tthis._vertexNormals[i++] = normals[index + 1] = vy*d;\n\t\t\t\t\tthis._vertexNormals[i++] = normals[index + 2] = vz*d;\n\t\t\t\t} else {\n\t\t\t\t\tnormals[index] = vx*d;\n\t\t\t\t\tnormals[index + 1] = vy*d;\n\t\t\t\t\tnormals[index + 2] = vz*d;\n\t\t\t\t}\n\n\t\t\t\tindex += stride;\n\t\t\t}\n\t\t}\n\n\t\tthis.notifyNormalsUpdate();\n\n\t\tthis._vertexNormalsDirty = false;\n\t}\n\n\t/**\n\t * Updates the vertex tangents based on the geometry.\n\t */\n\tpublic updateVertexTangents(values:Array)\n\t{\n\t\tvar i:number;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar tangents:Array;\n\n\t\tif (!this._autoDeriveTangents) {\n\t\t\tif ((this._vertexTangents == null || values == null) && (this._vertexTangents != null || values != null)) {\n\t\t\t\tif (this._concatenateArrays)\n\t\t\t\t\tthis._pNotifyVerticesUpdate();\n\t\t\t\telse\n\t\t\t\t\tthis._pStrideOffsetDirty = true;\n\t\t\t}\n\n\n\t\t\tthis._vertexTangents = values;\n\n\t\t\tif (values != null && this._concatenateArrays) {\n\t\t\t\ti = 0;\n\t\t\t\tindex = this.getOffset(TriangleSubGeometry.TANGENT_DATA);\n\t\t\t\tstride = this.getStride(TriangleSubGeometry.TANGENT_DATA);\n\t\t\t\ttangents = this._pVertices;\n\n\t\t\t\twhile (i < values.length) {\n\t\t\t\t\ttangents[index] = values[i++];\n\t\t\t\t\ttangents[index + 1] = values[i++];\n\t\t\t\t\ttangents[index + 2] = values[i++];\n\t\t\t\t\tindex += stride;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._vertexTangents == null) {\n\t\t\t\tthis._vertexTangents = new Array(this._positions.length);\n\n\t\t\t\tif (this._concatenateArrays)\n\t\t\t\t\tthis._pNotifyVerticesUpdate();\n\t\t\t\telse\n\t\t\t\t\tthis._pStrideOffsetDirty = true;\n\t\t\t}\n\n\t\t\tif (this._faceTangentsDirty)\n\t\t\t\tthis.updateFaceTangents();\n\n\t\t\toffset = this.getOffset(TriangleSubGeometry.TANGENT_DATA);\n\t\t\tstride = this.getStride(TriangleSubGeometry.TANGENT_DATA);\n\n\t\t\t//autoderived tangents\n\t\t\ttangents = this._concatenateArrays? this._pVertices : this._vertexTangents;\n\n\t\t\tindex = offset;\n\n\t\t\t//clear tangent values\n\t\t\tvar lenV:number = tangents.length;\n\t\t\twhile (index < lenV) {\n\t\t\t\ttangents[index] = 0;\n\t\t\t\ttangents[index + 1] = 0;\n\t\t\t\ttangents[index + 2] = 0;\n\n\t\t\t\tindex += stride;\n\t\t\t}\n\n\t\t\tvar k:number = 0;\n\t\t\tvar weight:number;\n\t\t\tvar f1:number = 0;\n\t\t\tvar f2:number = 1;\n\t\t\tvar f3:number = 2;\n\n\t\t\ti = 0;\n\n\t\t\t//collect face tangents\n\t\t\tvar lenI:number = this._pIndices.length;\n\t\t\twhile (i < lenI) {\n\t\t\t\tweight = this._useFaceWeights? this._faceWeights[k++] : 1;\n\t\t\t\tindex = offset + this._pIndices[i++]*stride;\n\t\t\t\ttangents[index++] += this._faceTangents[f1]*weight;\n\t\t\t\ttangents[index++] += this._faceTangents[f2]*weight;\n\t\t\t\ttangents[index] += this._faceTangents[f3]*weight;\n\t\t\t\tindex = offset + this._pIndices[i++]*stride;\n\t\t\t\ttangents[index++] += this._faceTangents[f1]*weight;\n\t\t\t\ttangents[index++] += this._faceTangents[f2]*weight;\n\t\t\t\ttangents[index] += this._faceTangents[f3]*weight;\n\t\t\t\tindex = offset + this._pIndices[i++]*stride;\n\t\t\t\ttangents[index++] += this._faceTangents[f1]*weight;\n\t\t\t\ttangents[index++] += this._faceTangents[f2]*weight;\n\t\t\t\ttangents[index] += this._faceTangents[f3]*weight;\n\t\t\t\tf1 += 3;\n\t\t\t\tf2 += 3;\n\t\t\t\tf3 += 3;\n\t\t\t}\n\n\t\t\ti = 0;\n\t\t\tindex = offset;\n\n\t\t\t//average tangents collections\n\t\t\twhile (index < lenV) {\n\t\t\t\tvar vx:number = tangents[index];\n\t\t\t\tvar vy:number = tangents[index + 1];\n\t\t\t\tvar vz:number = tangents[index + 2];\n\t\t\t\tvar d:number = 1.0/Math.sqrt(vx*vx + vy*vy + vz*vz);\n\n\t\t\t\tif (this._concatenateArrays) {\n\t\t\t\t\tthis._vertexTangents[i++] = tangents[index] = vx*d;\n\t\t\t\t\tthis._vertexTangents[i++] = tangents[index + 1] = vy*d;\n\t\t\t\t\tthis._vertexTangents[i++] = tangents[index + 2] = vz*d;\n\t\t\t\t} else {\n\t\t\t\t\ttangents[index] = vx*d;\n\t\t\t\t\ttangents[index + 1] = vy*d;\n\t\t\t\t\ttangents[index + 2] = vz*d;\n\t\t\t\t}\n\n\t\t\t\tindex += stride;\n\t\t\t}\n\t\t}\n\n\t\tthis.notifyTangentsUpdate();\n\n\t\tthis._vertexTangentsDirty = false;\n\t}\n\n\t/**\n\t * Updates the uvs based on the geometry.\n\t */\n\tpublic updateUVs(values:Array)\n\t{\n\t\tvar i:number;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar uvs:Array;\n\n\t\tif (!this._autoDeriveUVs) {\n\t\t\tif ((this._uvs == null || values == null) && (this._uvs != null || values != null)) {\n\t\t\t\tif (this._concatenateArrays)\n\t\t\t\t\tthis._pNotifyVerticesUpdate();\n\t\t\t\telse\n\t\t\t\t\tthis._pStrideOffsetDirty = true;\n\t\t\t}\n\n\t\t\tthis._uvs = values;\n\n\t\t\tif (values != null && this._concatenateArrays) {\n\t\t\t\ti = 0;\n\t\t\t\tindex = this.getOffset(TriangleSubGeometry.UV_DATA);\n\t\t\t\tstride = this.getStride(TriangleSubGeometry.UV_DATA);\n\t\t\t\tuvs = this._pVertices;\n\n\t\t\t\twhile (i < values.length) {\n\t\t\t\t\tuvs[index] = values[i++];\n\t\t\t\t\tuvs[index + 1] = values[i++];\n\t\t\t\t\tindex += stride;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\t\t\tif (this._uvs == null) {\n\t\t\t\tthis._uvs = new Array(this._positions.length*2/3);\n\n\t\t\t\tif (this._concatenateArrays)\n\t\t\t\t\tthis._pNotifyVerticesUpdate();\n\t\t\t\telse\n\t\t\t\t\tthis._pStrideOffsetDirty = true;\n\t\t\t}\n\n\t\t\toffset = this.getOffset(TriangleSubGeometry.UV_DATA);\n\t\t\tstride = this.getStride(TriangleSubGeometry.UV_DATA);\n\n\t\t\t//autoderived uvs\n\t\t\tuvs = this._concatenateArrays? this._pVertices : this._uvs;\n\n\t\t\ti = 0;\n\t\t\tindex = offset;\n\t\t\tvar uvIdx:number = 0;\n\n\t\t\t//clear uv values\n\t\t\tvar lenV:number = uvs.length;\n\t\t\twhile (index < lenV) {\n\t\t\t\tif (this._concatenateArrays) {\n\t\t\t\t\tthis._uvs[i++] = uvs[index] = uvIdx*.5;\n\t\t\t\t\tthis._uvs[i++] = uvs[index + 1] = 1.0 - (uvIdx & 1);\n\t\t\t\t} else {\n\t\t\t\t\tuvs[index] = uvIdx*.5;\n\t\t\t\t\tuvs[index + 1] = 1.0 - (uvIdx & 1);\n\t\t\t\t}\n\n\t\t\t\tif (++uvIdx == 3)\n\t\t\t\t\tuvIdx = 0;\n\n\t\t\t\tindex += stride;\n\t\t\t}\n\t\t}\n\n\t\tif (this._autoDeriveTangents)\n\t\t\tthis.notifyTangentsUpdate();\n\n\t\tthis.notifyUVsUpdate();\n\n\t\tthis._uvsDirty = false;\n\t}\n\n\t/**\n\t * Updates the secondary uvs based on the geometry.\n\t */\n\tpublic updateSecondaryUVs(values:Array)\n\t{\n\t\tvar i:number;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar uvs:Array;\n\n\t\tif (this._concatenateArrays && (this._secondaryUVs == null || values == null) && (this._secondaryUVs != null || values != null))\n\t\t\tthis._pNotifyVerticesUpdate();\n\n\t\tthis._secondaryUVs = values;\n\n\t\tif (values != null && this._concatenateArrays) {\n\t\t\toffset = this.getOffset(TriangleSubGeometry.SECONDARY_UV_DATA);\n\t\t\tstride = this.getStride(TriangleSubGeometry.SECONDARY_UV_DATA);\n\n\t\t\ti = 0;\n\t\t\tindex = offset;\n\t\t\tuvs = this._pVertices;\n\n\t\t\twhile (i < values.length) {\n\t\t\t\tuvs[index] = values[i++];\n\t\t\t\tuvs[index + 1] = values[i++];\n\t\t\t\tindex += stride;\n\t\t\t}\n\t\t}\n\n\t\tthis.notifySecondaryUVsUpdate();\n\n\t\tthis._secondaryUVsDirty = false;\n\t}\n\n\t/**\n\t * Updates the joint indices\n\t */\n\tpublic updateJointIndices(values:Array)\n\t{\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar jointIndices:Array;\n\n\t\tif (this._concatenateArrays && (this._jointIndices == null || values == null) && (this._jointIndices != null || values != null))\n\t\t\tthis._pNotifyVerticesUpdate();\n\n\t\tthis._jointIndices = values;\n\n\t\tif (values != null) {\n\t\t\toffset = this.getOffset(TriangleSubGeometry.JOINT_INDEX_DATA);\n\t\t\tstride = this.getStride(TriangleSubGeometry.JOINT_INDEX_DATA);\n\t\t\tif (this._useCondensedIndices) {\n\t\t\t\ti = 0;\n\t\t\t\tj = 0;\n\t\t\t\tindex = offset;\n\t\t\t\tjointIndices = this._concatenateArrays? this._pVertices : this._condensedJointIndices;\n\t\t\t\tvar oldIndex:number;\n\t\t\t\tvar newIndex:number = 0;\n\t\t\t\tvar dic:Object = new Object();\n\n\t\t\t\tif (!this._concatenateArrays)\n\t\t\t\t\tthis._condensedJointIndices = new Array(values.length);\n\n\t\t\t\tthis._condensedIndexLookUp = new Array();\n\n\t\t\t\twhile (i < values.length) {\n\t\t\t\t\tfor (j = 0; j < this._jointsPerVertex; j++) {\n\t\t\t\t\t\toldIndex = values[i++];\n\n\t\t\t\t\t\t// if we encounter a new index, assign it a new condensed index\n\t\t\t\t\t\tif (dic[oldIndex] == undefined) {\n\t\t\t\t\t\t\tdic[oldIndex] = newIndex*3; //3 required for the three vectors that store the matrix\n\t\t\t\t\t\t\tthis._condensedIndexLookUp[newIndex++] = oldIndex;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tjointIndices[index + j] = dic[oldIndex];\n\t\t\t\t\t}\n\t\t\t\t\tindex += stride;\n\t\t\t\t}\n\t\t\t\tthis._numCondensedJoints = newIndex;\n\t\t\t} else if (this._concatenateArrays) {\n\n\t\t\t\ti = 0;\n\t\t\t\tindex = offset;\n\t\t\t\tjointIndices = this._pVertices;\n\n\t\t\t\twhile (i < values.length) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile (j < this._jointsPerVertex)\n\t\t\t\t\t\tjointIndices[index + j++] = values[i++];\n\t\t\t\t\tindex += stride;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.notifyJointIndicesUpdate();\n\n\t\tthis._jointIndicesDirty = false;\n\t}\n\n\t/**\n\t * Updates the joint weights.\n\t */\n\tpublic updateJointWeights(values:Array)\n\t{\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar jointWeights:Array;\n\n\t\tif (this._concatenateArrays && (this._jointWeights == null || values == null) && (this._jointWeights != null || values != null))\n\t\t\tthis._pNotifyVerticesUpdate();\n\n\t\tthis._jointWeights = values;\n\n\t\tif (values != null && this._concatenateArrays) {\n\t\t\toffset = this.getOffset(TriangleSubGeometry.JOINT_WEIGHT_DATA);\n\t\t\tstride = this.getStride(TriangleSubGeometry.JOINT_WEIGHT_DATA);\n\n\t\t\ti = 0;\n\t\t\tindex = offset;\n\t\t\tjointWeights = this._pVertices;\n\n\t\t\twhile (i < values.length) {\n\t\t\t\tj = 0;\n\t\t\t\twhile (j < this._jointsPerVertex)\n\t\t\t\t\tjointWeights[index + j++] = values[i++];\n\t\t\t\tindex += stride;\n\t\t\t}\n\t\t}\n\n\t\tthis.notifyJointWeightsUpdate();\n\n\t\tthis._jointWeightsDirty = false;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\n\t\tthis._positions = null;\n\t\tthis._vertexNormals = null;\n\t\tthis._vertexTangents = null;\n\t\tthis._uvs = null;\n\t\tthis._secondaryUVs = null;\n\t\tthis._jointIndices = null;\n\t\tthis._jointWeights = null;\n\n\t\tthis._faceNormals = null;\n\t\tthis._faceWeights = null;\n\t\tthis._faceTangents = null;\n\t}\n\n\t/**\n\t * Updates the face indices of the TriangleSubGeometry.\n\t *\n\t * @param indices The face indices to upload.\n\t */\n\tpublic updateIndices(indices:Array)\n\t{\n\t\tsuper.updateIndices(indices);\n\n\t\tthis._faceNormalsDirty = true;\n\n\t\tif (this._autoDeriveNormals)\n\t\t\tthis._vertexNormalsDirty = true;\n\n\t\tif (this._autoDeriveTangents)\n\t\t\tthis._vertexTangentsDirty = true;\n\n\t\tif (this._autoDeriveUVs)\n\t\t\tthis._uvsDirty = true;\n\t}\n\n\t/**\n\t * Clones the current object\n\t * @return An exact duplicate of the current object.\n\t */\n\tpublic clone():TriangleSubGeometry\n\t{\n\t\tvar clone:TriangleSubGeometry = new TriangleSubGeometry(this._concatenateArrays);\n\t\tclone.updateIndices(this._pIndices.concat());\n\t\tclone.updatePositions(this._positions.concat());\n\n\t\tif (this._vertexNormals && !this._autoDeriveNormals)\n\t\t\tclone.updateVertexNormals(this._vertexNormals.concat());\n\t\telse\n\t\t\tclone.updateVertexNormals(null);\n\n\t\tif (this._uvs && !this._autoDeriveUVs)\n\t\t\tclone.updateUVs(this._uvs.concat());\n\t\telse\n\t\t\tclone.updateUVs(null);\n\n\t\tif (this._vertexTangents && !this._autoDeriveTangents)\n\t\t\tclone.updateVertexTangents(this._vertexTangents.concat());\n\t\telse\n\t\t\tclone.updateVertexTangents(null);\n\n\t\tif (this._secondaryUVs)\n\t\t\tclone.updateSecondaryUVs(this._secondaryUVs.concat());\n\n\t\tif (this._jointIndices) {\n\t\t\tclone.jointsPerVertex = this._jointsPerVertex;\n\t\t\tclone.updateJointIndices(this._jointIndices.concat());\n\t\t}\n\n\t\tif (this._jointWeights)\n\t\t\tclone.updateJointWeights(this._jointWeights.concat());\n\n\t\treturn clone;\n\t}\n\n\tpublic scaleUV(scaleU:number = 1, scaleV:number = 1)\n\t{\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar uvs:Array;\n\n\t\tuvs = this._uvs;\n\n\t\tvar ratioU:number = scaleU/this._scaleU;\n\t\tvar ratioV:number = scaleV/this._scaleV;\n\n\t\tthis._scaleU = scaleU;\n\t\tthis._scaleV = scaleV;\n\n\t\tvar len:number = uvs.length;\n\n\t\toffset = 0;\n\t\tstride = 2;\n\n\t\tindex = offset;\n\n\t\twhile (index < len) {\n\t\t\tuvs[index] *= ratioU;\n\t\t\tuvs[index + 1] *= ratioV;\n\t\t\tindex += stride;\n\t\t}\n\n\t\tthis.notifyUVsUpdate();\n\t}\n\n\t/**\n\t * Scales the geometry.\n\t * @param scale The amount by which to scale.\n\t */\n\tpublic scale(scale:number)\n\t{\n\t\tvar i:number;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\t\tvar positions:Array;\n\n\t\tpositions = this._positions;\n\n\t\tvar len:number = positions.length;\n\n\t\toffset = 0;\n\t\tstride = 3;\n\n\t\ti = 0;\n\t\tindex = offset;\n\t\twhile (i < len) {\n\t\t\tpositions[index] *= scale;\n\t\t\tpositions[index + 1] *= scale;\n\t\t\tpositions[index + 2] *= scale;\n\n\t\t\ti += 3;\n\t\t\tindex += stride;\n\t\t}\n\n\t\tthis.notifyPositionsUpdate();\n\t}\n\n\tpublic applyTransformation(transform:Matrix3D)\n\t{\n\t\tvar positions:Array;\n\t\tvar normals:Array;\n\t\tvar tangents:Array;\n\n\t\tif (this._concatenateArrays) {\n\t\t\tpositions = this._pVertices;\n\t\t\tnormals = this._pVertices;\n\t\t\ttangents = this._pVertices;\n\t\t} else {\n\t\t\tpositions = this._positions;\n\t\t\tnormals = this._vertexNormals;\n\t\t\ttangents = this._vertexTangents;\n\t\t}\n\n\t\tvar len:number = this._positions.length/3;\n\t\tvar i:number;\n\t\tvar i1:number;\n\t\tvar i2:number;\n\t\tvar vector:Vector3D = new Vector3D();\n\n\t\tvar bakeNormals:boolean = this._vertexNormals != null;\n\t\tvar bakeTangents:boolean = this._vertexTangents != null;\n\t\tvar invTranspose:Matrix3D;\n\n\t\tif (bakeNormals || bakeTangents) {\n\t\t\tinvTranspose = transform.clone();\n\t\t\tinvTranspose.invert();\n\t\t\tinvTranspose.transpose();\n\t\t}\n\n\t\tvar vi0:number = this.getOffset(TriangleSubGeometry.POSITION_DATA);\n\t\tvar ni0:number = this.getOffset(TriangleSubGeometry.NORMAL_DATA);\n\t\tvar ti0:number = this.getOffset(TriangleSubGeometry.TANGENT_DATA);\n\n\t\tvar vStride:number = this.getStride(TriangleSubGeometry.POSITION_DATA);\n\t\tvar nStride:number = this.getStride(TriangleSubGeometry.NORMAL_DATA);\n\t\tvar tStride:number = this.getStride(TriangleSubGeometry.TANGENT_DATA);\n\n\t\tfor (i = 0; i < len; ++i) {\n\t\t\ti1 = vi0 + 1;\n\t\t\ti2 = vi0 + 2;\n\n\t\t\t// bake position\n\t\t\tvector.x = positions[vi0];\n\t\t\tvector.y = positions[i1];\n\t\t\tvector.z = positions[i2];\n\t\t\tvector = transform.transformVector(vector);\n\t\t\tpositions[vi0] = vector.x;\n\t\t\tpositions[i1] = vector.y;\n\t\t\tpositions[i2] = vector.z;\n\t\t\tvi0 += vStride;\n\n\t\t\t// bake normal\n\t\t\tif (bakeNormals) {\n\t\t\t\ti1 = ni0 + 1;\n\t\t\t\ti2 = ni0 + 2;\n\t\t\t\tvector.x = normals[ni0];\n\t\t\t\tvector.y = normals[i1];\n\t\t\t\tvector.z = normals[i2];\n\t\t\t\tvector = invTranspose.deltaTransformVector(vector);\n\t\t\t\tvector.normalize();\n\t\t\t\tnormals[ni0] = vector.x;\n\t\t\t\tnormals[i1] = vector.y;\n\t\t\t\tnormals[i2] = vector.z;\n\t\t\t\tni0 += nStride;\n\t\t\t}\n\n\t\t\t// bake tangent\n\t\t\tif (bakeTangents) {\n\t\t\t\ti1 = ti0 + 1;\n\t\t\t\ti2 = ti0 + 2;\n\t\t\t\tvector.x = tangents[ti0];\n\t\t\t\tvector.y = tangents[i1];\n\t\t\t\tvector.z = tangents[i2];\n\t\t\t\tvector = invTranspose.deltaTransformVector(vector);\n\t\t\t\tvector.normalize();\n\t\t\t\ttangents[ti0] = vector.x;\n\t\t\t\ttangents[i1] = vector.y;\n\t\t\t\ttangents[i2] = vector.z;\n\t\t\t\tti0 += tStride;\n\t\t\t}\n\t\t}\n\n\t\tthis.notifyPositionsUpdate();\n\t\tthis.notifyNormalsUpdate();\n\t\tthis.notifyTangentsUpdate();\n\t}\n\n\t/**\n\t * Updates the tangents for each face.\n\t */\n\tprivate updateFaceTangents()\n\t{\n\t\tvar i:number = 0;\n\t\tvar index1:number;\n\t\tvar index2:number;\n\t\tvar index3:number;\n\t\tvar vi:number;\n\t\tvar v0:number;\n\t\tvar dv1:number;\n\t\tvar dv2:number;\n\t\tvar denom:number;\n\t\tvar x0:number, y0:number, z0:number;\n\t\tvar dx1:number, dy1:number, dz1:number;\n\t\tvar dx2:number, dy2:number, dz2:number;\n\t\tvar cx:number, cy:number, cz:number;\n\n\t\tvar positions:Array = this._positions\n\t\tvar uvs:Array = this._uvs;\n\n\t\tvar len:number = this._pIndices.length;\n\n\t\tif (this._faceTangents == null)\n\t\t\tthis._faceTangents = new Array(len);\n\n\t\twhile (i < len) {\n\t\t\tindex1 = this._pIndices[i];\n\t\t\tindex2 = this._pIndices[i + 1];\n\t\t\tindex3 = this._pIndices[i + 2];\n\n\t\t\tv0 = uvs[index1*2 + 1];\n\t\t\tdv1 = uvs[index2*2 + 1] - v0;\n\t\t\tdv2 = uvs[index3*2 + 1] - v0;\n\n\t\t\tvi = index1*3;\n\t\t\tx0 = positions[vi];\n\t\t\ty0 = positions[vi + 1];\n\t\t\tz0 = positions[vi + 2];\n\t\t\tvi = index2*3;\n\t\t\tdx1 = positions[vi] - x0;\n\t\t\tdy1 = positions[vi + 1] - y0;\n\t\t\tdz1 = positions[vi + 2] - z0;\n\t\t\tvi = index3*3;\n\t\t\tdx2 = positions[vi] - x0;\n\t\t\tdy2 = positions[vi + 1] - y0;\n\t\t\tdz2 = positions[vi + 2] - z0;\n\n\t\t\tcx = dv2*dx1 - dv1*dx2;\n\t\t\tcy = dv2*dy1 - dv1*dy2;\n\t\t\tcz = dv2*dz1 - dv1*dz2;\n\t\t\tdenom = 1/Math.sqrt(cx*cx + cy*cy + cz*cz);\n\n\t\t\tthis._faceTangents[i++] = denom*cx;\n\t\t\tthis._faceTangents[i++] = denom*cy;\n\t\t\tthis._faceTangents[i++] = denom*cz;\n\t\t}\n\n\t\tthis._faceTangentsDirty = false;\n\t}\n\n\t/**\n\t * Updates the normals for each face.\n\t */\n\tprivate updateFaceNormals()\n\t{\n\t\tvar i:number = 0;\n\t\tvar j:number = 0;\n\t\tvar k:number = 0;\n\t\tvar index:number;\n\t\tvar offset:number;\n\t\tvar stride:number;\n\n\t\tvar x1:number, x2:number, x3:number;\n\t\tvar y1:number, y2:number, y3:number;\n\t\tvar z1:number, z2:number, z3:number;\n\t\tvar dx1:number, dy1:number, dz1:number;\n\t\tvar dx2:number, dy2:number, dz2:number;\n\t\tvar cx:number, cy:number, cz:number;\n\t\tvar d:number;\n\n\t\tvar positions:Array = this._positions;\n\n\t\tvar len:number = this._pIndices.length;\n\n\t\tif (this._faceNormals == null)\n\t\t\tthis._faceNormals = new Array(len);\n\n\t\tif (this._useFaceWeights && this._faceWeights == null)\n\t\t\tthis._faceWeights = new Array(len/3);\n\n\t\twhile (i < len) {\n\t\t\tindex = this._pIndices[i++]*3;\n\t\t\tx1 = positions[index];\n\t\t\ty1 = positions[index + 1];\n\t\t\tz1 = positions[index + 2];\n\t\t\tindex = this._pIndices[i++]*3;\n\t\t\tx2 = positions[index];\n\t\t\ty2 = positions[index + 1];\n\t\t\tz2 = positions[index + 2];\n\t\t\tindex = this._pIndices[i++]*3;\n\t\t\tx3 = positions[index];\n\t\t\ty3 = positions[index + 1];\n\t\t\tz3 = positions[index + 2];\n\t\t\tdx1 = x3 - x1;\n\t\t\tdy1 = y3 - y1;\n\t\t\tdz1 = z3 - z1;\n\t\t\tdx2 = x2 - x1;\n\t\t\tdy2 = y2 - y1;\n\t\t\tdz2 = z2 - z1;\n\t\t\tcx = dz1*dy2 - dy1*dz2;\n\t\t\tcy = dx1*dz2 - dz1*dx2;\n\t\t\tcz = dy1*dx2 - dx1*dy2;\n\t\t\td = Math.sqrt(cx*cx + cy*cy + cz*cz);\n\t\t\t// length of cross product = 2*triangle area\n\n\t\t\tif (this._useFaceWeights) {\n\t\t\t\tvar w:number = d*10000;\n\n\t\t\t\tif (w < 1)\n\t\t\t\t\tw = 1;\n\n\t\t\t\tthis._faceWeights[k++] = w;\n\t\t\t}\n\n\t\t\td = 1/d;\n\n\t\t\tthis._faceNormals[j++] = cx*d;\n\t\t\tthis._faceNormals[j++] = cy*d;\n\t\t\tthis._faceNormals[j++] = cz*d;\n\t\t}\n\n\t\tthis._faceNormalsDirty = false;\n\t}\n\n\tpublic _pNotifyVerticesUpdate()\n\t{\n\t\tthis._pStrideOffsetDirty = true;\n\n\t\tthis.notifyPositionsUpdate();\n\t\tthis.notifyNormalsUpdate();\n\t\tthis.notifyTangentsUpdate();\n\t\tthis.notifyUVsUpdate();\n\t\tthis.notifySecondaryUVsUpdate();\n\t\tthis.notifyJointIndicesUpdate();\n\t\tthis.notifyJointWeightsUpdate();\n\t}\n\n\tprivate notifyPositionsUpdate()\n\t{\n\t\tif (this._positionsDirty)\n\t\t\treturn;\n\n\t\tthis._positionsDirty = true;\n\n\t\tif (!this._positionsUpdated)\n\t\t\tthis._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA);\n\n\t\tthis.dispatchEvent(this._positionsUpdated);\n\t}\n\n\tprivate notifyNormalsUpdate()\n\t{\n\t\tif (this._vertexNormalsDirty)\n\t\t\treturn;\n\n\t\tthis._vertexNormalsDirty = true;\n\n\t\tif (!this._normalsUpdated)\n\t\t\tthis._normalsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.NORMAL_DATA);\n\n\t\tthis.dispatchEvent(this._normalsUpdated);\n\t}\n\n\tprivate notifyTangentsUpdate()\n\t{\n\t\tif (this._vertexTangentsDirty)\n\t\t\treturn;\n\n\t\tthis._vertexTangentsDirty = true;\n\n\t\tif (!this._tangentsUpdated)\n\t\t\tthis._tangentsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.TANGENT_DATA);\n\n\t\tthis.dispatchEvent(this._tangentsUpdated);\n\t}\n\n\tprivate notifyUVsUpdate()\n\t{\n\t\tif (this._uvsDirty)\n\t\t\treturn;\n\n\t\tthis._uvsDirty = true;\n\n\t\tif (!this._uvsUpdated)\n\t\t\tthis._uvsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.UV_DATA);\n\n\t\tthis.dispatchEvent(this._uvsUpdated);\n\t}\n\n\tprivate notifySecondaryUVsUpdate()\n\t{\n\t\tif (this._secondaryUVsDirty)\n\t\t\treturn;\n\n\t\tthis._secondaryUVsDirty = true;\n\n\t\tif (!this._secondaryUVsUpdated)\n\t\t\tthis._secondaryUVsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.SECONDARY_UV_DATA);\n\n\t\tthis.dispatchEvent(this._secondaryUVsUpdated);\n\t}\n\n\tprivate notifyJointIndicesUpdate()\n\t{\n\t\tif (this._jointIndicesDirty)\n\t\t\treturn;\n\n\t\tthis._jointIndicesDirty = true;\n\n\t\tif (!this._jointIndicesUpdated)\n\t\t\tthis._jointIndicesUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_INDEX_DATA);\n\n\t\tthis.dispatchEvent(this._jointIndicesUpdated);\n\t}\n\n\tprivate notifyJointWeightsUpdate()\n\t{\n\t\tif (this._jointWeightsDirty)\n\t\t\treturn;\n\n\t\tthis._jointWeightsDirty = true;\n\n\t\tif (!this._jointWeightsUpdated)\n\t\t\tthis._jointWeightsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_WEIGHT_DATA);\n\n\t\tthis.dispatchEvent(this._jointWeightsUpdated);\n\t}\n}\n\nexport = TriangleSubGeometry;", + "import ISubMesh\t\t\t\t\t= require(\"awayjs-core/lib/core/base/ISubMesh\");\nimport SubMeshBase\t\t\t\t= require(\"awayjs-core/lib/core/base/SubMeshBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport IRenderer\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Mesh\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Mesh\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * TriangleSubMesh wraps a TriangleSubGeometry as a scene graph instantiation. A TriangleSubMesh is owned by a Mesh object.\n *\n *\n * @see away.base.TriangleSubGeometry\n * @see away.entities.Mesh\n *\n * @class away.base.TriangleSubMesh\n */\nclass TriangleSubMesh extends SubMeshBase implements ISubMesh\n{\n\tprivate _subGeometry:TriangleSubGeometry;\n\n\t/**\n\t *\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.TRIANGLE_SUB_MESH;\n\t}\n\n\t/**\n\t * The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh.\n\t */\n\tpublic get subGeometry():TriangleSubGeometry\n\t{\n\t\treturn this._subGeometry;\n\t}\n\n\t/**\n\t * Creates a new TriangleSubMesh object\n\t * @param subGeometry The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh.\n\t * @param parentMesh The Mesh object to which this TriangleSubMesh belongs.\n\t * @param material An optional material used to render this TriangleSubMesh.\n\t */\n\tconstructor(subGeometry:TriangleSubGeometry, parentMesh:Mesh, material:MaterialBase = null)\n\t{\n\t\tsuper();\n\n\t\tthis._pParentMesh = parentMesh;\n\t\tthis._subGeometry = subGeometry;\n\t\tthis.material = material;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\t}\n\n\tpublic _iCollectRenderable(renderer:IRenderer)\n\t{\n\t\trenderer.applyTriangleSubMesh(this);\n\t}\n}\n\nexport = TriangleSubMesh;", + "class ContextMode\n{\n\tstatic AUTO:string = \"auto\";\n\tstatic WEBGL:string = \"webgl\";\n\tstatic FLASH:string = \"flash\";\n\tstatic NATIVE:string = \"native\";\n}\n\nexport = ContextMode;", + "import Rectangle\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\n\n/**\n *\n * @class away.base.IContext\n */\ninterface IContext\n{\n\tcontainer:HTMLElement;\n\n\tclear(red?: number, green?: number, blue?: number, alpha?: number, depth?: number, stencil?: number, mask?: number);\n\n\tconfigureBackBuffer(width:number, height:number, antiAlias:number, enableDepthAndStencil?:boolean);\n\n\tdispose();\n\n\tpresent();\n\n\tsetScissorRectangle(rect:Rectangle);\n}\n\nexport = IContext;", + "import Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\n\n/**\n * A Box object is an area defined by its position, as indicated by its\n * top-left-front corner point(x, y, z) and by its width,\n * height and depth.\n *\n *\n *

The x, y, z, width,\n * height depth properties of the Box class are\n * independent of each other; changing the value of one property has no effect\n * on the others. However, the right, bottom and\n * back properties are integrally related to those six\n * properties. For example, if you change the value of the right\n * property, the value of the width property changes; if you\n * change the bottom property, the value of the\n * height property changes.

\n *\n *

The following methods and properties use Box objects:

\n *\n *
    \n *
  • The bounds property of the DisplayObject class
  • \n *
\n *\n *

You can use the new Box() constructor to create a\n * Box object.

\n *\n *

Note: The Box class does not define a cubic Shape\n * display object.\n */\nclass Box\n{\n\tprivate _size:Vector3D;\n\tprivate _bottomRightBack:Vector3D;\n\tprivate _topLeftFront:Vector3D;\n\n\t/**\n\t * The height of the box, in pixels. Changing the height value\n\t * of a Box object has no effect on the x, y,\n\t * z, depth and width properties.\n\t */\n\tpublic height:number;\n\n\t/**\n\t * The width of the box, in pixels. Changing the width value\n\t * of a Box object has no effect on the x, y,\n\t * z, depth and height properties.\n\t */\n\tpublic width:number;\n\n\t/**\n\t * The deoth of the box, in pixels. Changing the depth value\n\t * of a Box object has no effect on the x, y,\n\t * z, width and height properties.\n\t */\n\tpublic depth:number;\n\n\t/**\n\t * The x coordinate of the top-left-front corner of the box.\n\t * Changing the value of the x property of a Box object has no\n\t * effect on the y, z, width,\n\t * height and depth properties.\n\t *\n\t *

The value of the x property is equal to the value of the\n\t * left property.

\n\t */\n\tpublic x:number;\n\n\t/**\n\t * The y coordinate of the top-left-front corner of the box.\n\t * Changing the value of the y property of a Box object has no\n\t * effect on the x, z, width,\n\t * height and depth properties.\n\t *\n\t *

The value of the y property is equal to the value of the\n\t * top property.

\n\t */\n\tpublic y:number;\n\n\t/**\n\t * The y coordinate of the top-left-front corner of the box.\n\t * Changing the value of the z property of a Box object has no\n\t * effect on the x, y, width,\n\t * height and depth properties.\n\t *\n\t *

The value of the z property is equal to the value of the\n\t * front property.

\n\t */\n\tpublic z:number\n\n\t/**\n\t * The sum of the z and height properties.\n\t */\n\tpublic get back():number\n\t{\n\t\treturn this.z + this.depth;\n\t}\n\n\tpublic set back(val:number)\n\t{\n\t\tthis.depth = val - this.z;\n\t}\n\n\t/**\n\t * The sum of the y and height properties.\n\t */\n\tpublic get bottom():number\n\t{\n\t\treturn this.y + this.height;\n\t}\n\n\tpublic set bottom(val:number)\n\t{\n\t\tthis.height = val - this.y;\n\t}\n\n\t/**\n\t * The location of the Box object's bottom-right corner, determined by the\n\t * values of the right and bottom properties.\n\t */\n\tpublic get bottomRightBack():Vector3D\n\t{\n\t\tif (this._bottomRightBack == null)\n\t\t\tthis._bottomRightBack = new Vector3D();\n\n\t\tthis._bottomRightBack.x = this.x + this.width;\n\t\tthis._bottomRightBack.y = this.y + this.height;\n\t\tthis._bottomRightBack.z = this.z + this.depth;\n\n\t\treturn this._bottomRightBack;\n\t}\n\n\t/**\n\t * The z coordinate of the top-left-front corner of the box. Changing\n\t * the front property of a Box object has no effect on the\n\t * x, y, width and height\n\t * properties. However it does affect the depth property,\n\t * whereas changing the z value does not affect the\n\t * depth property.\n\t *\n\t *

The value of the left property is equal to the value of\n\t * the x property.

\n\t */\n\tpublic get front():number\n\t{\n\t\treturn this.z;\n\t}\n\n\tpublic set front(val:number)\n\t{\n\t\tthis.depth += this.z - val;\n\t\tthis.z = val;\n\t}\n\n\t/**\n\t * The x coordinate of the top-left corner of the box. Changing the\n\t * left property of a Box object has no effect on the\n\t * y and height properties. However it does affect\n\t * the width property, whereas changing the x value\n\t * does not affect the width property.\n\t *\n\t *

The value of the left property is equal to the value of\n\t * the x property.

\n\t */\n\tpublic get left():number\n\t{\n\t\treturn this.x;\n\t}\n\n\tpublic set left(val:number)\n\t{\n\t\tthis.width += this.x - val;\n\t\tthis.x = val;\n\t}\n\n\t/**\n\t * The sum of the x and width properties.\n\t */\n\tpublic get right():number\n\t{\n\t\treturn this.x + this.width;\n\t}\n\n\tpublic set right(val:number)\n\t{\n\t\tthis.width = val - this.x;\n\t}\n\n\t/**\n\t * The size of the Box object, expressed as a Vector3D object with the\n\t * values of the width, height and\n\t * depth properties.\n\t */\n\tpublic get size():Vector3D\n\t{\n\t\tif (this._size == null)\n\t\t\tthis._size = new Vector3D();\n\n\t\tthis._size.x = this.width;\n\t\tthis._size.y = this.height;\n\t\tthis._size.z = this.depth;\n\n\t\treturn this._size;\n\t}\n\n\t/**\n\t * The y coordinate of the top-left-front corner of the box. Changing\n\t * the top property of a Box object has no effect on the\n\t * x and width properties. However it does affect\n\t * the height property, whereas changing the y\n\t * value does not affect the height property.\n\t *\n\t *

The value of the top property is equal to the value of the\n\t * y property.

\n\t */\n\tpublic get top():number\n\t{\n\t\treturn this.y;\n\t}\n\n\tpublic set top(val:number)\n\t{\n\t\tthis.height += (this.y - val);\n\t\tthis.y = val;\n\t}\n\n\t/**\n\t * The location of the Box object's top-left-front corner, determined by the\n\t * x, y and z coordinates of the point.\n\t */\n\tpublic get topLeftFront():Vector3D\n\t{\n\t\tif (this._topLeftFront == null)\n\t\t\tthis._topLeftFront = new Vector3D();\n\n\t\tthis._topLeftFront.x = this.x;\n\t\tthis._topLeftFront.y = this.y;\n\t\tthis._topLeftFront.z = this.z;\n\n\t\treturn this._topLeftFront;\n\t}\n\n\t/**\n\t * Creates a new Box object with the top-left-front corner specified by the\n\t * x, y and z parameters and with the\n\t * specified width, height and depth\n\t * parameters. If you call this public without parameters, a box with\n\t * x, y, z, width,\n\t * height and depth properties set to 0 is created.\n\t *\n\t * @param x The x coordinate of the top-left-front corner of the\n\t * box.\n\t * @param y The y coordinate of the top-left-front corner of the\n\t * box.\n\t * @param z The z coordinate of the top-left-front corner of the\n\t * box.\n\t * @param width The width of the box, in pixels.\n\t * @param height The height of the box, in pixels.\n\t * @param depth The depth of the box, in pixels.\n\t */\n\tconstructor(x:number = 0, y:number = 0, z:number = 0, width:number = 0, height:number = 0, depth:number = 0)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = depth;\n\t}\n\n\t/**\n\t * Returns a new Box object with the same values for the x,\n\t * y, z, width, height\n\t * and depth properties as the original Box object.\n\t *\n\t * @return A new Box object with the same values for the x,\n\t * y, z, width,\n\t * height and depth properties as the\n\t * original Box object.\n\t */\n\tpublic clone():Box\n\t{\n\t\treturn new Box(this.x, this.y, this.z, this.width, this.height, this.depth);\n\t}\n\n\t/**\n\t * Determines whether the specified position is contained within the cubic\n\t * region defined by this Box object.\n\t *\n\t * @param x The x coordinate(horizontal component) of the position.\n\t * @param y The y coordinate(vertical component) of the position.\n\t * @param z The z coordinate(longitudinal component) of the position.\n\t * @return A value of true if the Box object contains the\n\t * specified position; otherwise false.\n\t */\n\tpublic contains(x:number, y:number, z:number):boolean\n\t{\n\t\treturn (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y && this.z <= z && this.z + this.depth >= z);\n\t}\n\n\t/**\n\t * Determines whether the specified position is contained within the cubic\n\t * region defined by this Box object. This method is similar to the\n\t * Box.contains() method, except that it takes a Vector3D\n\t * object as a parameter.\n\t *\n\t * @param position The position, as represented by its x, y and\n\t * z coordinates.\n\t * @return A value of true if the Box object contains the\n\t * specified position; otherwise false.\n\t */\n\tpublic containsPoint(position:Vector3D):boolean\n\t{\n\t\treturn (this.x <= position.x && this.x + this.width >= position.x && this.y <= position.y && this.y + this.height >= position.y && this.z <= position.z && this.z + this.depth >= position.z);\n\t}\n\n\t/**\n\t * Determines whether the Box object specified by the box\n\t * parameter is contained within this Box object. A Box object is said to\n\t * contain another if the second Box object falls entirely within the\n\t * boundaries of the first.\n\t *\n\t * @param box The Box object being checked.\n\t * @return A value of true if the Box object that you specify\n\t * is contained by this Box object; otherwise false.\n\t */\n\tpublic containsRect(box:Box):boolean\n\t{\n\t\treturn (this.x <= box.x && this.x + this.width >= box.x + box.width && this.y <= box.y && this.y + this.height >= box.y + box.height && this.z <= box.z && this.z + this.depth >= box.z + box.depth)\n\t}\n\n\t/**\n\t * Copies all of box data from the source Box object into the calling\n\t * Box object.\n\t *\n\t * @param sourceBox The Box object from which to copy the data.\n\t */\n\tpublic copyFrom(sourceBox:Box)\n\t{\n\t\t//TODO\n\t}\n\n\t/**\n\t * Determines whether the object specified in the toCompare\n\t * parameter is equal to this Box object. This method compares the\n\t * x, y, z, width,\n\t * height and depth properties of an object against\n\t * the same properties of this Box object.\n\t *\n\t * @param toCompare The box to compare to this Box object.\n\t * @return A value of true if the object has exactly the same\n\t * values for the x, y, z,\n\t * width, height and depth\n\t * properties as this Box object; otherwise false.\n\t */\n\tpublic equals(toCompare:Box):boolean\n\t{\n\t\treturn (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && this.width == toCompare.width && this.height == toCompare.height && this.depth == toCompare.depth)\n\t}\n\n\t/**\n\t * Increases the size of the Box object by the specified amounts, in\n\t * pixels. The center point of the Box object stays the same, and its\n\t * size increases to the left and right by the dx value, to\n\t * the top and the bottom by the dy value, and to\n\t * the front and the back by the dz value.\n\t *\n\t * @param dx The value to be added to the left and the right of the Box\n\t * object. The following equation is used to calculate the new\n\t * width and position of the box:\n\t * @param dy The value to be added to the top and the bottom of the Box\n\t * object. The following equation is used to calculate the new\n\t * height and position of the box:\n\t * @param dz The value to be added to the front and the back of the Box\n\t * object. The following equation is used to calculate the new\n\t * depth and position of the box:\n\t */\n\tpublic inflate(dx:number, dy:number, dz:number)\n\t{\n\t\tthis.x -= dx/2;\n\t\tthis.y -= dy/2;\n\t\tthis.z -= dz/2;\n\t\tthis.width += dx/2;\n\t\tthis.height += dy/2;\n\t\tthis.depth += dz/2;\n\t}\n\n\t/**\n\t * Increases the size of the Box object. This method is similar to the\n\t * Box.inflate() method except it takes a Vector3D object as\n\t * a parameter.\n\t *\n\t *

The following two code examples give the same result:

\n\t *\n\t * @param delta The x property of this Vector3D object is used to\n\t * increase the horizontal dimension of the Box object.\n\t * The y property is used to increase the vertical\n\t * dimension of the Box object.\n\t * The z property is used to increase the\n\t * longitudinal dimension of the Box object.\n\t */\n\tpublic inflatePoint(delta:Vector3D)\n\t{\n\t\tthis.x -= delta.x/2;\n\t\tthis.y -= delta.y/2;\n\t\tthis.z -= delta.z/2;\n\t\tthis.width += delta.x/2;\n\t\tthis.height += delta.y/2;\n\t\tthis.depth += delta.z/2;\n\t}\n\n\t/**\n\t * If the Box object specified in the toIntersect parameter\n\t * intersects with this Box object, returns the area of intersection\n\t * as a Box object. If the boxes do not intersect, this method returns an\n\t * empty Box object with its properties set to 0.\n\t *\n\t * @param toIntersect The Box object to compare against to see if it\n\t * intersects with this Box object.\n\t * @return A Box object that equals the area of intersection. If the\n\t * boxes do not intersect, this method returns an empty Box\n\t * object; that is, a box with its x, y,\n\t * z, width, height, and\n\t * depth properties set to 0.\n\t */\n\tpublic intersection(toIntersect:Box):Box\n\t{\n\t\tif (this.intersects(toIntersect)) {\n\t\t\tvar i:Box = new Box();\n\n\t\t\tif (this.x > toIntersect.x) {\n\t\t\t\ti.x = this.x;\n\t\t\t\ti.width = toIntersect.x - this.x + toIntersect.width;\n\n\t\t\t\tif (i.width > this.width)\n\t\t\t\t\ti.width = this.width;\n\t\t\t} else {\n\t\t\t\ti.x = toIntersect.x;\n\t\t\t\ti.width = this.x - toIntersect.x + this.width;\n\n\t\t\t\tif (i.width > toIntersect.width)\n\t\t\t\t\ti.width = toIntersect.width;\n\t\t\t}\n\n\t\t\tif (this.y > toIntersect.y) {\n\t\t\t\ti.y = this.y;\n\t\t\t\ti.height = toIntersect.y - this.y + toIntersect.height;\n\n\t\t\t\tif (i.height > this.height)\n\t\t\t\t\ti.height = this.height;\n\t\t\t} else {\n\t\t\t\ti.y = toIntersect.y;\n\t\t\t\ti.height = this.y - toIntersect.y + this.height;\n\n\t\t\t\tif (i.height > toIntersect.height)\n\t\t\t\t\ti.height = toIntersect.height;\n\t\t\t}\n\n\n\t\t\tif (this.z > toIntersect.z) {\n\t\t\t\ti.z = this.z;\n\t\t\t\ti.depth = toIntersect.z - this.z + toIntersect.depth;\n\n\t\t\t\tif (i.depth > this.depth)\n\t\t\t\t\ti.depth = this.depth;\n\t\t\t} else {\n\t\t\t\ti.z = toIntersect.z;\n\t\t\t\ti.depth = this.z - toIntersect.z + this.depth;\n\n\t\t\t\tif (i.depth > toIntersect.depth)\n\t\t\t\t\ti.depth = toIntersect.depth;\n\t\t\t}\n\n\t\t\treturn i;\n\t\t}\n\n\t\treturn new Box();\n\t}\n\n\t/**\n\t * Determines whether the object specified in the toIntersect\n\t * parameter intersects with this Box object. This method checks the\n\t * x, y, z, width,\n\t * height, and depth properties of the specified\n\t * Box object to see if it intersects with this Box object.\n\t *\n\t * @param toIntersect The Box object to compare against this Box object.\n\t * @return A value of true if the specified object intersects\n\t * with this Box object; otherwise false.\n\t */\n\tpublic intersects(toIntersect:Box):boolean\n\t{\n\t\treturn (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height && this.z + this.depth > toIntersect.z && this.z < toIntersect.z + toIntersect.depth);\n\t}\n\n\t/**\n\t * Determines whether or not this Box object is empty.\n\t *\n\t * @return A value of true if the Box object's width, height or\n\t * depth is less than or equal to 0; otherwise false.\n\t */\n\tpublic isEmpty():boolean\n\t{\n\t\treturn (this.x == 0 && this.y == 0 && this.z == 0 && this.width == 0 && this.height == 0 && this.depth == 0);\n\t}\n\n\t/**\n\t * Adjusts the location of the Box object, as determined by its\n\t * top-left-front corner, by the specified amounts.\n\t *\n\t * @param dx Moves the x value of the Box object by this amount.\n\t * @param dy Moves the y value of the Box object by this amount.\n\t * @param dz Moves the z value of the Box object by this amount.\n\t */\n\tpublic offset(dx:number, dy:number, dz:number)\n\t{\n\t\tthis.x += dx;\n\t\tthis.y += dy;\n\t\tthis.z += dz;\n\t}\n\n\t/**\n\t * Adjusts the location of the Box object using a Vector3D object as a\n\t * parameter. This method is similar to the Box.offset()\n\t * method, except that it takes a Vector3D object as a parameter.\n\t *\n\t * @param position A Vector3D object to use to offset this Box object.\n\t */\n\tpublic offsetPosition(position:Vector3D)\n\t{\n\t\tthis.x += position.x;\n\t\tthis.y += position.y;\n\t\tthis.z += position.z;\n\t}\n\n\t/**\n\t * Sets all of the Box object's properties to 0. A Box object is empty if its\n\t * width, height or depth is less than or equal to 0.\n\t *\n\t *

This method sets the values of the x, y,\n\t * z, width, height, and\n\t * depth properties to 0.

\n\t *\n\t */\n\tpublic setEmpty()\n\t{\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.z = 0;\n\t\tthis.width = 0;\n\t\tthis.height = 0;\n\t\tthis.depth = 0;\n\t}\n\n\t/**\n\t * Sets the members of Box to the specified values\n\t *\n\t * @param xa The x coordinate of the top-left-front corner of the\n\t * box.\n\t * @param ya The y coordinate of the top-left-front corner of the\n\t * box.\n\t * @param yz The z coordinate of the top-left-front corner of the\n\t * box.\n\t * @param widtha The width of the box, in pixels.\n\t * @param heighta The height of the box, in pixels.\n\t * @param deptha The depth of the box, in pixels.\n\t */\n\tpublic setTo(xa:number, ya:number, za:number, widtha:number, heighta:number, deptha:number)\n\t{\n\t\tthis.x = xa;\n\t\tthis.y = ya;\n\t\tthis.z = za;\n\t\tthis.width = widtha;\n\t\tthis.height = heighta;\n\t\tthis.depth = deptha;\n\t}\n\n\t/**\n\t * Builds and returns a string that lists the horizontal, vertical and\n\t * longitudinal positions and the width, height and depth of the Box object.\n\t *\n\t * @return A string listing the value of each of the following properties of\n\t * the Box object: x, y, z,\n\t * width, height, and depth.\n\t */\n\tpublic toString():string\n\t{\n\t\treturn \"[Box] (x=\" + this.x + \", y=\" + this.y + \", z=\" + this.z + \", width=\" + this.width + \", height=\" + this.height + \", depth=\" + this.depth + \")\";\n\t}\n\n\t/**\n\t * Adds two boxes together to create a new Box object, by filling\n\t * in the horizontal, vertical and longitudinal space between the two boxes.\n\t *\n\t *

Note: The union() method ignores boxes with\n\t * 0 as the height, width or depth value, such as: var\n\t * box2:Box = new Box(300,300,300,50,50,0);

\n\t *\n\t * @param toUnion A Box object to add to this Box object.\n\t * @return A new Box object that is the union of the two boxes.\n\t */\n\tpublic union(toUnion:Box):Box\n\t{\n\t\tvar u:Box = new Box();\n\n\t\tif (this.x < toUnion.x) {\n\t\t\tu.x = this.x;\n\t\t\tu.width = toUnion.x - this.x + toUnion.width;\n\n\t\t\tif (u.width < this.width)\n\t\t\t\tu.width = this.width;\n\t\t} else {\n\t\t\tu.x = toUnion.x;\n\t\t\tu.width = this.x - toUnion.x + this.width;\n\n\t\t\tif (u.width < toUnion.width)\n\t\t\t\tu.width = toUnion.width;\n\t\t}\n\n\t\tif (this.y < toUnion.y) {\n\t\t\tu.y = this.y;\n\t\t\tu.height = toUnion.y - this.y + toUnion.height;\n\n\t\t\tif (u.height < this.height)\n\t\t\t\tu.height = this.height;\n\t\t} else {\n\t\t\tu.y = toUnion.y;\n\t\t\tu.height = this.y - toUnion.y + this.height;\n\n\t\t\tif (u.height < toUnion.height)\n\t\t\t\tu.height = toUnion.height;\n\t\t}\n\n\t\tif (this.z < toUnion.z) {\n\t\t\tu.z = this.z;\n\t\t\tu.depth = toUnion.z - this.z + toUnion.depth;\n\n\t\t\tif (u.depth < this.depth)\n\t\t\t\tu.depth = this.depth;\n\t\t} else {\n\t\t\tu.z = toUnion.z;\n\t\t\tu.depth = this.z - toUnion.z + this.depth;\n\n\t\t\tif (u.depth < toUnion.depth)\n\t\t\t\tu.depth = toUnion.depth;\n\t\t}\n\n\t\treturn u;\n\t}\n}\n\nexport = Box;", + "import ColorUtils\t\t\t\t= require(\"awayjs-core/lib/utils/ColorUtils\");\n\n/**\n * The ColorTransform class lets you adjust the color values in a display\n * object. The color adjustment or color transformation can be applied\n * to all four channels: red, green, blue, and alpha transparency.\n *\n *

When a ColorTransform object is applied to a display object, a new value\n * for each color channel is calculated like this:

\n *\n *
    \n *
  • New red value = (old red value * redMultiplier) +\n * redOffset
  • \n *
  • New green value = (old green value * greenMultiplier) +\n * greenOffset
  • \n *
  • New blue value = (old blue value * blueMultiplier) +\n * blueOffset
  • \n *
  • New alpha value = (old alpha value * alphaMultiplier) +\n * alphaOffset
  • \n *
\n *\n *

If any of the color channel values is greater than 255 after the\n * calculation, it is set to 255. If it is less than 0, it is set to 0.

\n *\n *

You can use ColorTransform objects in the following ways:

\n *\n *
    \n *
  • In the colorTransform parameter of the\n * colorTransform() method of the BitmapData class
  • \n *
  • As the colorTransform property of a Transform object\n * (which can be used as the transform property of a display\n * object)
  • \n *
\n *\n *

You must use the new ColorTransform() constructor to create\n * a ColorTransform object before you can call the methods of the\n * ColorTransform object.

\n *\n *

Color transformations do not apply to the background color of a movie\n * clip(such as a loaded SWF object). They apply only to graphics and symbols\n * that are attached to the movie clip.

\n */\nclass ColorTransform\n{\n\t/**\n\t * A decimal value that is multiplied with the alpha transparency channel\n\t * value.\n\t *\n\t *

If you set the alpha transparency value of a display object directly by\n\t * using the alpha property of the DisplayObject instance, it\n\t * affects the value of the alphaMultiplier property of that\n\t * display object's transform.colorTransform property.

\n\t */\n\tpublic alphaMultiplier:number;\n\n\t/**\n\t * A number from -255 to 255 that is added to the alpha transparency channel\n\t * value after it has been multiplied by the alphaMultiplier\n\t * value.\n\t */\n\tpublic alphaOffset:number;\n\n\t/**\n\t * A decimal value that is multiplied with the blue channel value.\n\t */\n\tpublic blueMultiplier:number;\n\n\t/**\n\t * A number from -255 to 255 that is added to the blue channel value after it\n\t * has been multiplied by the blueMultiplier value.\n\t */\n\tpublic blueOffset:number;\n\n\t/**\n\t * A decimal value that is multiplied with the green channel value.\n\t */\n\tpublic greenMultiplier:number;\n\n\t/**\n\t * A number from -255 to 255 that is added to the green channel value after\n\t * it has been multiplied by the greenMultiplier value.\n\t */\n\tpublic greenOffset:number;\n\n\t/**\n\t * A decimal value that is multiplied with the red channel value.\n\t */\n\tpublic redMultiplier:number;\n\n\t/**\n\t * A number from -255 to 255 that is added to the red channel value after it\n\t * has been multiplied by the redMultiplier value.\n\t */\n\tpublic redOffset:number;\n\n\t/**\n\t * The RGB color value for a ColorTransform object.\n\t *\n\t *

When you set this property, it changes the three color offset values\n\t * (redOffset, greenOffset, and\n\t * blueOffset) accordingly, and it sets the three color\n\t * multiplier values(redMultiplier,\n\t * greenMultiplier, and blueMultiplier) to 0. The\n\t * alpha transparency multiplier and offset values do not change.

\n\t *\n\t *

When you pass a value for this property, use the format\n\t * 0xRRGGBB. RR, GG, and BB each consist of two\n\t * hexadecimal digits that specify the offset of each color component. The 0x\n\t * tells the ActionScript compiler that the number is a hexadecimal\n\t * value.

\n\t */\n\tpublic get color():number\n\t{\n\t\treturn((this.redOffset << 16) | ( this.greenOffset << 8) | this.blueOffset);\n\t}\n\n\tpublic set color(value:number)\n\t{\n\t\tvar argb:number[] = ColorUtils.float32ColorToARGB(value);\n\n\t\tthis.redOffset = argb[1]; //(value >> 16) & 0xFF;\n\t\tthis.greenOffset = argb[2]; //(value >> 8) & 0xFF;\n\t\tthis.blueOffset = argb[3]; //value & 0xFF;\n\n\t\tthis.redMultiplier = 0;\n\t\tthis.greenMultiplier = 0;\n\t\tthis.blueMultiplier = 0;\n\t}\n\n\t/**\n\t * Creates a ColorTransform object for a display object with the specified\n\t * color channel values and alpha values.\n\t *\n\t * @param redMultiplier The value for the red multiplier, in the range from\n\t * 0 to 1.\n\t * @param greenMultiplier The value for the green multiplier, in the range\n\t * from 0 to 1.\n\t * @param blueMultiplier The value for the blue multiplier, in the range\n\t * from 0 to 1.\n\t * @param alphaMultiplier The value for the alpha transparency multiplier, in\n\t * the range from 0 to 1.\n\t * @param redOffset The offset value for the red color channel, in the\n\t * range from -255 to 255.\n\t * @param greenOffset The offset value for the green color channel, in\n\t * the range from -255 to 255.\n\t * @param blueOffset The offset for the blue color channel value, in the\n\t * range from -255 to 255.\n\t * @param alphaOffset The offset for alpha transparency channel value, in\n\t * the range from -255 to 255.\n\t */\n\tconstructor(redMultiplier:number = 1, greenMultiplier:number = 1, blueMultiplier:number = 1, alphaMultiplier:number = 1, redOffset:number = 0, greenOffset:number = 0, blueOffset:number = 0, alphaOffset:number = 0)\n\t{\n\t\tthis.redMultiplier = redMultiplier;\n\t\tthis.greenMultiplier = greenMultiplier;\n\t\tthis.blueMultiplier = blueMultiplier;\n\t\tthis.alphaMultiplier = alphaMultiplier;\n\t\tthis.redOffset = redOffset;\n\t\tthis.greenOffset = greenOffset;\n\t\tthis.blueOffset = blueOffset;\n\t\tthis.alphaOffset = alphaOffset;\n\t}\n\n\t/**\n\t * Concatenates the ColorTranform object specified by the second\n\t * parameter with the current ColorTransform object and sets the current\n\t * object as the result, which is an additive combination of the two color\n\t * transformations. When you apply the concatenated ColorTransform object,\n\t * the effect is the same as applying the second color\n\t * transformation after the original color transformation.\n\t *\n\t * @param second The ColorTransform object to be combined with the current\n\t * ColorTransform object.\n\t */\n\tpublic concat(second:ColorTransform):void\n\t{\n\t\tthis.redMultiplier += second.redMultiplier;\n\t\tthis.greenMultiplier += second.greenMultiplier;\n\t\tthis.blueMultiplier += second.blueMultiplier;\n\t\tthis.alphaMultiplier += second.alphaMultiplier;\n\t}\n}\n\nexport = ColorTransform;", + "/**\n* MathConsts provides some commonly used mathematical constants\n*/\nclass MathConsts\n{\n\t/**\n\t * The amount to multiply with when converting radians to degrees.\n\t */\n\tpublic static RADIANS_TO_DEGREES:number = 180/Math.PI;\n\n\t/**\n\t * The amount to multiply with when converting degrees to radians.\n\t */\n\tpublic static DEGREES_TO_RADIANS:number = Math.PI/180;\n}\n\nexport = MathConsts;", + "import Quaternion\t\t\t\t= require(\"awayjs-core/lib/core/geom/Quaternion\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Plane3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\n\n\n/**\n * away.geom.Matrix3DUtils provides additional Matrix3D functions.\n */\nclass Matrix3DUtils\n{\n\t/**\n\t * A reference to a Vector to be used as a temporary raw data container, to prevent object creation.\n\t */\n\tpublic static RAW_DATA_CONTAINER:number[] = new Array(16);\n\t//public static RAW_DATA_CONTAINER:number[] = new Array(16);\n\n\tpublic static CALCULATION_MATRIX:Matrix3D = new Matrix3D();\n\n\t/**\n\t * Fills the 3d matrix object with values representing the transformation made by the given quaternion.\n\t *\n\t * @param quarternion The quarterion object to convert.\n\t */\n\tpublic static quaternion2matrix(quarternion:Quaternion, m:Matrix3D = null):Matrix3D\n\t{\n\t\tvar x:number = quarternion.x;\n\t\tvar y:number = quarternion.y;\n\t\tvar z:number = quarternion.z;\n\t\tvar w:number = quarternion.w;\n\n\t\tvar xx:number = x*x;\n\t\tvar xy:number = x*y;\n\t\tvar xz:number = x*z;\n\t\tvar xw:number = x*w;\n\n\t\tvar yy:number = y*y;\n\t\tvar yz:number = y*z;\n\t\tvar yw:number = y*w;\n\n\t\tvar zz:number = z*z;\n\t\tvar zw:number = z*w;\n\n\t\tvar raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\traw[0] = 1 - 2*(yy + zz);\n\t\traw[1] = 2*(xy + zw);\n\t\traw[2] = 2*(xz - yw);\n\t\traw[4] = 2*(xy - zw);\n\t\traw[5] = 1 - 2*(xx + zz);\n\t\traw[6] = 2*(yz + xw);\n\t\traw[8] = 2*(xz + yw);\n\t\traw[9] = 2*(yz - xw);\n\t\traw[10] = 1 - 2*(xx + yy);\n\t\traw[3] = raw[7] = raw[11] = raw[12] = raw[13] = raw[14] = 0;\n\t\traw[15] = 1;\n\n\t\tif (m) {\n\t\t\tm.copyRawDataFrom(raw);\n\t\t\treturn m;\n\t\t} else\n\t\t\treturn new Matrix3D(raw);\n\t}\n\n\t/**\n\t * Returns a normalised Vector3D object representing the forward vector of the given matrix.\n\t * @param m The Matrix3D object to use to get the forward vector\n\t * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null.\n\t * @return The forward vector\n\t */\n\tpublic static getForward(m:Matrix3D, v:Vector3D = null):Vector3D\n\t{\n\t\t//v ||= new Vector3D(0.0, 0.0, 0.0);\n\t\tif (v === null) {\n\n\t\t\tv = new Vector3D(0.0, 0.0, 0.0);\n\n\t\t}\n\n\t\tm.copyColumnTo(2, v);\n\t\tv.normalize();\n\n\t\treturn v;\n\t}\n\n\t/**\n\t * Returns a normalised Vector3D object representing the up vector of the given matrix.\n\t * @param m The Matrix3D object to use to get the up vector\n\t * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null.\n\t * @return The up vector\n\t */\n\tpublic static getUp(m:Matrix3D, v:Vector3D = null):Vector3D\n\t{\n\t\t//v ||= new Vector3D(0.0, 0.0, 0.0);\n\n\t\tif (v === null) {\n\n\t\t\tv = new Vector3D(0.0, 0.0, 0.0);\n\n\t\t}\n\n\t\tm.copyColumnTo(1, v);\n\t\tv.normalize();\n\n\t\treturn v;\n\t}\n\n\t/**\n\t * Returns a normalised Vector3D object representing the right vector of the given matrix.\n\t * @param m The Matrix3D object to use to get the right vector\n\t * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null.\n\t * @return The right vector\n\t */\n\tpublic static getRight(m:Matrix3D, v:Vector3D = null):Vector3D\n\t{\n\t\t//v ||= new Vector3D(0.0, 0.0, 0.0);\n\t\tif (v === null) {\n\n\t\t\tv = new Vector3D(0.0, 0.0, 0.0);\n\n\t\t}\n\n\t\tm.copyColumnTo(0, v);\n\t\tv.normalize();\n\n\t\treturn v;\n\t}\n\n\t/**\n\t * Returns a boolean value representing whether there is any significant difference between the two given 3d matrices.\n\t */\n\tpublic static compare(m1:Matrix3D, m2:Matrix3D):boolean\n\t{\n\t\tvar r1:number[] = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\tvar r2:number[] = m2.rawData;\n\t\tm1.copyRawDataTo(r1);\n\n\t\tfor (var i:number = 0; i < 16; ++i) {\n\t\t\tif (r1[i] != r2[i])\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic static lookAt(matrix:Matrix3D, pos:Vector3D, dir:Vector3D, up:Vector3D)\n\t{\n\t\tvar dirN:Vector3D;\n\t\tvar upN:Vector3D;\n\t\tvar lftN:Vector3D;\n\t\tvar raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER;\n\n\t\tlftN = dir.crossProduct(up);\n\t\tlftN.normalize();\n\n\t\tupN = lftN.crossProduct(dir);\n\t\tupN.normalize();\n\t\tdirN = dir.clone();\n\t\tdirN.normalize();\n\n\t\traw[0] = lftN.x;\n\t\traw[1] = upN.x;\n\t\traw[2] = -dirN.x;\n\t\traw[3] = 0.0;\n\n\t\traw[4] = lftN.y;\n\t\traw[5] = upN.y;\n\t\traw[6] = -dirN.y;\n\t\traw[7] = 0.0;\n\n\t\traw[8] = lftN.z;\n\t\traw[9] = upN.z;\n\t\traw[10] = -dirN.z;\n\t\traw[11] = 0.0;\n\n\t\traw[12] = -lftN.dotProduct(pos);\n\t\traw[13] = -upN.dotProduct(pos);\n\t\traw[14] = dirN.dotProduct(pos);\n\t\traw[15] = 1.0;\n\n\t\tmatrix.copyRawDataFrom(raw);\n\t}\n\n\tpublic static reflection(plane:Plane3D, target:Matrix3D = null):Matrix3D\n\t{\n\t\tif (target === null)\n\t\t\ttarget = new Matrix3D();\n\n\t\tvar a:number = plane.a, b:number = plane.b, c:number = plane.c, d:number = plane.d;\n\t\tvar rawData:number[] = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\tvar ab2:number = -2*a*b;\n\t\tvar ac2:number = -2*a*c;\n\t\tvar bc2:number = -2*b*c;\n\t\t// reflection matrix\n\t\trawData[0] = 1 - 2*a*a;\n\t\trawData[4] = ab2;\n\t\trawData[8] = ac2;\n\t\trawData[12] = -2*a*d;\n\t\trawData[1] = ab2;\n\t\trawData[5] = 1 - 2*b*b;\n\t\trawData[9] = bc2;\n\t\trawData[13] = -2*b*d;\n\t\trawData[2] = ac2;\n\t\trawData[6] = bc2;\n\t\trawData[10] = 1 - 2*c*c;\n\t\trawData[14] = -2*c*d;\n\t\trawData[3] = 0;\n\t\trawData[7] = 0;\n\t\trawData[11] = 0;\n\t\trawData[15] = 1;\n\t\ttarget.copyRawDataFrom(rawData);\n\n\t\treturn target;\n\t}\n\n\n\tpublic static transformVector(matrix:Matrix3D, vector:Vector3D, result:Vector3D = null):Vector3D\n\t{\n\t\tif (!result)\n\t\t\tresult = new Vector3D();\n\n\t\tvar raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\tmatrix.copyRawDataTo(raw);\n\t\tvar a:number = raw[0];\n\t\tvar e:number = raw[1];\n\t\tvar i:number = raw[2];\n\t\tvar m:number = raw[3];\n\t\tvar b:number = raw[4];\n\t\tvar f:number = raw[5];\n\t\tvar j:number = raw[6];\n\t\tvar n:number = raw[7];\n\t\tvar c:number = raw[8];\n\t\tvar g:number = raw[9];\n\t\tvar k:number = raw[10];\n\t\tvar o:number = raw[11];\n\t\tvar d:number = raw[12];\n\t\tvar h:number = raw[13];\n\t\tvar l:number = raw[14];\n\t\tvar p:number = raw[15];\n\n\t\tvar x:number = vector.x;\n\t\tvar y:number = vector.y;\n\t\tvar z:number = vector.z;\n\t\tresult.x = a * x + b * y + c * z + d;\n\t\tresult.y = e * x + f * y + g * z + h;\n\t\tresult.z = i * x + j * y + k * z + l;\n\t\tresult.w = m * x + n * y + o * z + p;\n\t\treturn result;\n\t}\n\n\tpublic static deltaTransformVector(matrix:Matrix3D, vector:Vector3D, result:Vector3D = null):Vector3D\n\t{\n\t\tif (!result)\n\t\t\tresult = new Vector3D();\n\n\t\tvar raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\tmatrix.copyRawDataTo(raw);\n\t\tvar a:number = raw[0];\n\t\tvar e:number = raw[1];\n\t\tvar i:number = raw[2];\n\t\tvar m:number = raw[3];\n\t\tvar b:number = raw[4];\n\t\tvar f:number = raw[5];\n\t\tvar j:number = raw[6];\n\t\tvar n:number = raw[7];\n\t\tvar c:number = raw[8];\n\t\tvar g:number = raw[9];\n\t\tvar k:number = raw[10];\n\t\tvar o:number = raw[11];\n\t\tvar x:number = vector.x;\n\t\tvar y:number = vector.y;\n\t\tvar z:number = vector.z;\n\t\tresult.x = a * x + b * y + c * z;\n\t\tresult.y = e * x + f * y + g * z;\n\t\tresult.z = i * x + j * y + k * z;\n\t\tresult.w = m * x + n * y + o * z;\n\t\treturn result;\n\t}\n\n\tpublic static getTranslation(transform:Matrix3D, result:Vector3D = null):Vector3D\n\t{\n\t\tif(!result)\n\t\t\tresult = new Vector3D();\n\n\t\ttransform.copyColumnTo(3, result);\n\t\treturn result;\n\t}\n\n\tpublic static deltaTransformVectors(matrix:Matrix3D, vin:Array, vout:Array)\n\t{\n\t\tvar raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\tmatrix.copyRawDataTo(raw);\n\t\tvar a:number = raw[0];\n\t\tvar e:number = raw[1];\n\t\tvar i:number = raw[2];\n\t\tvar m:number = raw[3];\n\t\tvar b:number = raw[4];\n\t\tvar f:number = raw[5];\n\t\tvar j:number = raw[6];\n\t\tvar n:number = raw[7];\n\t\tvar c:number = raw[8];\n\t\tvar g:number = raw[9];\n\t\tvar k:number = raw[10];\n\t\tvar o:number = raw[11];\n\t\tvar outIndex:number = 0;\n\t\tvar length:number = vin.length;\n\t\tfor(var index:number = 0; indexAn exception is thrown if the rawData property is set to a matrix that is not invertible. The Matrix3D\n\t * object must be invertible. If a non-invertible matrix is needed, create a subclass of the Matrix3D object.

\n\t */\n\tpublic rawData:number[];\n\n\t/**\n\t * Creates a Matrix3D object.\n\t */\n\tconstructor(v:number[] = null)\n\t{\n\t\tif (v != null && v.length == 16)\n\t\t\tthis.rawData = v.concat();\n\t\telse\n\t\t\tthis.rawData = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ];\n\t}\n\n\t/**\n\t * Appends the matrix by multiplying another Matrix3D object by the current Matrix3D object.\n\t */\n\tpublic append(lhs:Matrix3D)\n\t{\n\t\tvar m111:number = this.rawData[0], m121:number = this.rawData[4], m131:number = this.rawData[8], m141:number = this.rawData[12], m112:number = this.rawData[1], m122:number = this.rawData[5], m132:number = this.rawData[9], m142:number = this.rawData[13], m113:number = this.rawData[2], m123:number = this.rawData[6], m133:number = this.rawData[10], m143:number = this.rawData[14], m114:number = this.rawData[3], m124:number = this.rawData[7], m134:number = this.rawData[11], m144:number = this.rawData[15], m211:number = lhs.rawData[0], m221:number = lhs.rawData[4], m231:number = lhs.rawData[8], m241:number = lhs.rawData[12], m212:number = lhs.rawData[1], m222:number = lhs.rawData[5], m232:number = lhs.rawData[9], m242:number = lhs.rawData[13], m213:number = lhs.rawData[2], m223:number = lhs.rawData[6], m233:number = lhs.rawData[10], m243:number = lhs.rawData[14], m214:number = lhs.rawData[3], m224:number = lhs.rawData[7], m234:number = lhs.rawData[11], m244:number = lhs.rawData[15];\n\n\t\tthis.rawData[0] = m111*m211 + m112*m221 + m113*m231 + m114*m241;\n\t\tthis.rawData[1] = m111*m212 + m112*m222 + m113*m232 + m114*m242;\n\t\tthis.rawData[2] = m111*m213 + m112*m223 + m113*m233 + m114*m243;\n\t\tthis.rawData[3] = m111*m214 + m112*m224 + m113*m234 + m114*m244;\n\n\t\tthis.rawData[4] = m121*m211 + m122*m221 + m123*m231 + m124*m241;\n\t\tthis.rawData[5] = m121*m212 + m122*m222 + m123*m232 + m124*m242;\n\t\tthis.rawData[6] = m121*m213 + m122*m223 + m123*m233 + m124*m243;\n\t\tthis.rawData[7] = m121*m214 + m122*m224 + m123*m234 + m124*m244;\n\n\t\tthis.rawData[8] = m131*m211 + m132*m221 + m133*m231 + m134*m241;\n\t\tthis.rawData[9] = m131*m212 + m132*m222 + m133*m232 + m134*m242;\n\t\tthis.rawData[10] = m131*m213 + m132*m223 + m133*m233 + m134*m243;\n\t\tthis.rawData[11] = m131*m214 + m132*m224 + m133*m234 + m134*m244;\n\n\t\tthis.rawData[12] = m141*m211 + m142*m221 + m143*m231 + m144*m241;\n\t\tthis.rawData[13] = m141*m212 + m142*m222 + m143*m232 + m144*m242;\n\t\tthis.rawData[14] = m141*m213 + m142*m223 + m143*m233 + m144*m243;\n\t\tthis.rawData[15] = m141*m214 + m142*m224 + m143*m234 + m144*m244;\n\t}\n\n\t/**\n\t * Appends an incremental rotation to a Matrix3D object.\n\t */\n\tpublic appendRotation(degrees:number, axis:Vector3D):void //, pivot:Vector3D = null )\n\t{\n\t\tvar m:Matrix3D = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees);\n\n\t\tthis.append(m);\n\t}\n\n\t/**\n\t * Appends an incremental scale change along the x, y, and z axes to a Matrix3D object.\n\t */\n\tpublic appendScale(xScale:number, yScale:number, zScale:number)\n\t{\n\t\tthis.append(new 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 ]));\n\t}\n\n\t/**\n\t * Appends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object.\n\t */\n\tpublic appendTranslation(x:number, y:number, z:number)\n\t{\n\t\tthis.rawData[12] += x;\n\t\tthis.rawData[13] += y;\n\t\tthis.rawData[14] += z;\n\t}\n\n\t/**\n\t * Returns a new Matrix3D object that is an exact copy of the current Matrix3D object.\n\t */\n\tpublic clone():Matrix3D\n\t{\n\t\treturn new Matrix3D(this.rawData.slice(0));\n\t}\n\n\t/**\n\t * Copies a Vector3D object into specific column of the calling Matrix3D object.\n\t */\n\tpublic copyColumnFrom(column:number, vector3D:Vector3D)\n\t{\n\t\tswitch (column) {\n\t\t\tcase 0:\n\t\t\t\tthis.rawData[ 0 ] = vector3D.x;\n\t\t\t\tthis.rawData[ 1 ] = vector3D.y;\n\t\t\t\tthis.rawData[ 2 ] = vector3D.z;\n\t\t\t\tthis.rawData[ 3 ] = vector3D.w;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.rawData[ 4 ] = vector3D.x;\n\t\t\t\tthis.rawData[ 5 ] = vector3D.y;\n\t\t\t\tthis.rawData[ 6 ] = vector3D.z;\n\t\t\t\tthis.rawData[ 7 ] = vector3D.w;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.rawData[ 8 ] = vector3D.x;\n\t\t\t\tthis.rawData[ 9 ] = vector3D.y;\n\t\t\t\tthis.rawData[ 10 ] = vector3D.z;\n\t\t\t\tthis.rawData[ 11 ] = vector3D.w;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tthis.rawData[ 12 ] = vector3D.x;\n\t\t\t\tthis.rawData[ 13 ] = vector3D.y;\n\t\t\t\tthis.rawData[ 14 ] = vector3D.z;\n\t\t\t\tthis.rawData[ 15 ] = vector3D.w;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new ArgumentError(\"ArgumentError, Column \" + column + \" out of bounds [0, ..., 3]\");\n\t\t}\n\t}\n\n\t/**\n\t * Copies specific column of the calling Matrix3D object into the Vector3D object.\n\t */\n\tpublic copyColumnTo(column:number, vector3D:Vector3D)\n\t{\n\t\tswitch (column) {\n\t\t\tcase 0:\n\t\t\t\tvector3D.x = this.rawData[ 0 ];\n\t\t\t\tvector3D.y = this.rawData[ 1 ];\n\t\t\t\tvector3D.z = this.rawData[ 2 ];\n\t\t\t\tvector3D.w = this.rawData[ 3 ];\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tvector3D.x = this.rawData[ 4 ];\n\t\t\t\tvector3D.y = this.rawData[ 5 ];\n\t\t\t\tvector3D.z = this.rawData[ 6 ];\n\t\t\t\tvector3D.w = this.rawData[ 7 ];\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tvector3D.x = this.rawData[ 8 ];\n\t\t\t\tvector3D.y = this.rawData[ 9 ];\n\t\t\t\tvector3D.z = this.rawData[ 10 ];\n\t\t\t\tvector3D.w = this.rawData[ 11 ];\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tvector3D.x = this.rawData[ 12 ];\n\t\t\t\tvector3D.y = this.rawData[ 13 ];\n\t\t\t\tvector3D.z = this.rawData[ 14 ];\n\t\t\t\tvector3D.w = this.rawData[ 15 ];\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new ArgumentError(\"ArgumentError, Column \" + column + \" out of bounds [0, ..., 3]\");\n\t\t}\n\t}\n\n\t/**\n\t * Copies all of the matrix data from the source Matrix3D object into the calling Matrix3D object.\n\t */\n\tpublic copyFrom(sourceMatrix3D:Matrix3D)\n\t{\n\t\tvar len:number = sourceMatrix3D.rawData.length;\n\t\tfor (var c:number = 0; c < len; c++)\n\t\t\tthis.rawData[c] = sourceMatrix3D.rawData[c];\n\t}\n\n\tpublic copyRawDataFrom(vector:number[], index:number = 0, transpose:boolean = false):void\n\t{\n\t\tif (transpose)\n\t\t\tthis.transpose();\n\n\t\tvar len:number = vector.length - index;\n\t\tfor (var c:number = 0; c < len; c++)\n\t\t\tthis.rawData[c] = vector[c + index];\n\n\t\tif (transpose)\n\t\t\tthis.transpose();\n\t}\n\n\tpublic copyRawDataTo(vector:number[], index:number = 0, transpose:boolean = false)\n\t{\n\t\tif (transpose)\n\t\t\tthis.transpose();\n\n\t\tvar len:number = this.rawData.length\n\t\tfor (var c:number = 0; c < len; c++)\n\t\t\tvector[c + index ] = this.rawData[c];\n\n\t\tif (transpose)\n\t\t\tthis.transpose();\n\t}\n\n\t/**\n\t * Copies a Vector3D object into specific row of the calling Matrix3D object.\n\t */\n\tpublic copyRowFrom(row:number, vector3D:Vector3D)\n\t{\n\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tthis.rawData[ 0 ] = vector3D.x;\n\t\t\t\tthis.rawData[ 4 ] = vector3D.y;\n\t\t\t\tthis.rawData[ 8 ] = vector3D.z;\n\t\t\t\tthis.rawData[ 12 ] = vector3D.w;\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.rawData[ 1 ] = vector3D.x;\n\t\t\t\tthis.rawData[ 5 ] = vector3D.y;\n\t\t\t\tthis.rawData[ 9 ] = vector3D.z;\n\t\t\t\tthis.rawData[ 13 ] = vector3D.w;\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tthis.rawData[ 2 ] = vector3D.x;\n\t\t\t\tthis.rawData[ 6 ] = vector3D.y;\n\t\t\t\tthis.rawData[ 10 ] = vector3D.z;\n\t\t\t\tthis.rawData[ 14 ] = vector3D.w;\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tthis.rawData[ 3 ] = vector3D.x;\n\t\t\t\tthis.rawData[ 7 ] = vector3D.y;\n\t\t\t\tthis.rawData[ 11 ] = vector3D.z;\n\t\t\t\tthis.rawData[ 15 ] = vector3D.w;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new ArgumentError(\"ArgumentError, Row \" + row + \" out of bounds [0, ..., 3]\");\n\t\t}\n\t}\n\n\t/**\n\t * Copies specific row of the calling Matrix3D object into the Vector3D object.\n\t */\n\tpublic copyRowTo(row:number, vector3D:Vector3D)\n\t{\n\t\tswitch (row) {\n\t\t\tcase 0:\n\t\t\t\tvector3D.x = this.rawData[ 0 ];\n\t\t\t\tvector3D.y = this.rawData[ 4 ];\n\t\t\t\tvector3D.z = this.rawData[ 8 ];\n\t\t\t\tvector3D.w = this.rawData[ 12 ];\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tvector3D.x = this.rawData[ 1 ];\n\t\t\t\tvector3D.y = this.rawData[ 5 ];\n\t\t\t\tvector3D.z = this.rawData[ 9 ];\n\t\t\t\tvector3D.w = this.rawData[ 13 ];\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tvector3D.x = this.rawData[ 2 ];\n\t\t\t\tvector3D.y = this.rawData[ 6 ];\n\t\t\t\tvector3D.z = this.rawData[ 10 ];\n\t\t\t\tvector3D.w = this.rawData[ 14 ];\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tvector3D.x = this.rawData[ 3 ];\n\t\t\t\tvector3D.y = this.rawData[ 7 ];\n\t\t\t\tvector3D.z = this.rawData[ 11 ];\n\t\t\t\tvector3D.w = this.rawData[ 15 ]\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new ArgumentError(\"ArgumentError, Row \" + row + \" out of bounds [0, ..., 3]\");\n\t\t}\n\t}\n\n\t/**\n\t * Copies this Matrix3D object into a destination Matrix3D object.\n\t */\n\tpublic copyToMatrix3D(dest:Matrix3D)\n\t{\n\t\tdest.rawData = this.rawData.slice(0);\n\t}\n\n\t/**\n\t * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector3D objects.\n\t */\n\tpublic decompose(orientationStyle:string = \"eulerAngles\"):Vector3D[]\n\t{\n\t\tvar q:Quaternion;\n\n\t\t// Initial Tests - Not OK\n\n\t\tvar vec:Vector3D[] = [];\n\t\tvar m = this.clone();\n\t\tvar mr = m.rawData;\n\n\t\tvar pos:Vector3D = new Vector3D(mr[12], mr[13], mr[14]);\n\t\tmr[12] = 0;\n\t\tmr[13] = 0;\n\t\tmr[14] = 0;\n\n\t\tvar scale:Vector3D = new Vector3D();\n\n\t\tscale.x = Math.sqrt(mr[0]*mr[0] + mr[1]*mr[1] + mr[2]*mr[2]);\n\t\tscale.y = Math.sqrt(mr[4]*mr[4] + mr[5]*mr[5] + mr[6]*mr[6]);\n\t\tscale.z = Math.sqrt(mr[8]*mr[8] + mr[9]*mr[9] + mr[10]*mr[10]);\n\n\t\tif (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)\n\t\t\tscale.z = -scale.z;\n\n\t\tmr[0] /= scale.x;\n\t\tmr[1] /= scale.x;\n\t\tmr[2] /= scale.x;\n\t\tmr[4] /= scale.y;\n\t\tmr[5] /= scale.y;\n\t\tmr[6] /= scale.y;\n\t\tmr[8] /= scale.z;\n\t\tmr[9] /= scale.z;\n\t\tmr[10] /= scale.z;\n\n\t\tvar rot = new Vector3D();\n\n\t\tswitch (orientationStyle) {\n\t\t\tcase Orientation3D.AXIS_ANGLE:\n\n\t\t\t\trot.w = Math.acos((mr[0] + mr[5] + mr[10] - 1)/2);\n\n\t\t\t\tvar len:number = Math.sqrt((mr[6] - mr[9])*(mr[6] - mr[9]) + (mr[8] - mr[2])*(mr[8] - mr[2]) + (mr[1] - mr[4])*(mr[1] - mr[4]));\n\t\t\t\trot.x = (mr[6] - mr[9])/len;\n\t\t\t\trot.y = (mr[8] - mr[2])/len;\n\t\t\t\trot.z = (mr[1] - mr[4])/len;\n\n\t\t\t\tbreak;\n\t\t\tcase Orientation3D.QUATERNION:\n\n\t\t\t\tvar tr = mr[0] + mr[5] + mr[10];\n\n\t\t\t\tif (tr > 0) {\n\t\t\t\t\trot.w = Math.sqrt(1 + tr)/2;\n\n\t\t\t\t\trot.x = (mr[6] - mr[9])/(4*rot.w);\n\t\t\t\t\trot.y = (mr[8] - mr[2])/(4*rot.w);\n\t\t\t\t\trot.z = (mr[1] - mr[4])/(4*rot.w);\n\t\t\t\t} else if ((mr[0] > mr[5]) && (mr[0] > mr[10])) {\n\t\t\t\t\trot.x = Math.sqrt(1 + mr[0] - mr[5] - mr[10])/2;\n\n\t\t\t\t\trot.w = (mr[6] - mr[9])/(4*rot.x);\n\t\t\t\t\trot.y = (mr[1] + mr[4])/(4*rot.x);\n\t\t\t\t\trot.z = (mr[8] + mr[2])/(4*rot.x);\n\t\t\t\t} else if (mr[5] > mr[10]) {\n\t\t\t\t\trot.y = Math.sqrt(1 + mr[5] - mr[0] - mr[10])/2;\n\n\t\t\t\t\trot.x = (mr[1] + mr[4])/(4*rot.y);\n\t\t\t\t\trot.w = (mr[8] - mr[2])/(4*rot.y);\n\t\t\t\t\trot.z = (mr[6] + mr[9])/(4*rot.y);\n\t\t\t\t} else {\n\t\t\t\t\trot.z = Math.sqrt(1 + mr[10] - mr[0] - mr[5])/2;\n\n\t\t\t\t\trot.x = (mr[8] + mr[2])/(4*rot.z);\n\t\t\t\t\trot.y = (mr[6] + mr[9])/(4*rot.z);\n\t\t\t\t\trot.w = (mr[1] - mr[4])/(4*rot.z);\n\t\t\t\t}\n\n\n\t\t\t\tbreak;\n\t\t\tcase Orientation3D.EULER_ANGLES:\n\n\t\t\t\trot.y = Math.asin(-mr[2]);\n\n\t\t\t\t//var cos:number = Math.cos(rot.y);\n\n\t\t\t\tif (mr[2] != 1 && mr[2] != -1) {\n\t\t\t\t\trot.x = Math.atan2(mr[6], mr[10]);\n\t\t\t\t\trot.z = Math.atan2(mr[1], mr[0]);\n\t\t\t\t} else {\n\t\t\t\t\trot.z = 0;\n\t\t\t\t\trot.x = Math.atan2(mr[4], mr[5]);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t}\n\n\t\tvec.push(pos);\n\t\tvec.push(rot);\n\t\tvec.push(scale);\n\n\t\treturn vec;\n\t}\n\n\t/**\n\t * Uses the transformation matrix without its translation elements to transform a Vector3D object from one space\n\t * coordinate to another.\n\t */\n\tpublic deltaTransformVector(v:Vector3D):Vector3D\n\t{\n\t\tvar x:number = v.x;\n\t\tvar y:number = v.y;\n\t\tvar z:number = v.z;\n\n\t\treturn new Vector3D((x*this.rawData[0] + y*this.rawData[4] + z*this.rawData[8]), (x*this.rawData[1] + y*this.rawData[5] + z*this.rawData[9]), (x*this.rawData[2] + y*this.rawData[6] + z*this.rawData[10]), (x*this.rawData[3] + y*this.rawData[7] + z*this.rawData[11]));\n\t}\n\n\t/**\n\t * Converts the current matrix to an identity or unit matrix.\n\t */\n\tpublic identity()\n\t{\n\t\tthis.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ];\n\t}\n\n\t/**\n\t * [static] Interpolates the translation, rotation, and scale transformation of one matrix toward those of the target matrix.\n\t */\n\tstatic interpolate(thisMat:Matrix3D, toMat:Matrix3D, percent:number):Matrix3D\n\t{\n\t\tvar m:Matrix3D = new Matrix3D();\n\t\tfor (var i:number = 0; i < 16; ++i)\n\t\t\tm.rawData[i] = thisMat.rawData[i] + (toMat.rawData[i] - thisMat.rawData[i])*percent;\n\n\t\treturn m;\n\t}\n\n\t/**\n\t * Interpolates this matrix towards the translation, rotation, and scale transformations of the target matrix.\n\t */\n\tpublic interpolateTo(toMat:Matrix3D, percent:number)\n\t{\n\t\tfor (var i:number = 0; i < 16; ++i)\n\t\t\tthis.rawData[i] = this.rawData[i] + (toMat.rawData[i] - this.rawData[i])*percent;\n\t}\n\n\t/**\n\t * Inverts the current matrix.\n\t */\n\tpublic invert():boolean\n\t{\n\t\tvar d = this.determinant;\n\t\tvar invertable = Math.abs(d) > 0.00000000001;\n\n\t\tif (invertable) {\n\t\t\td = 1/d;\n\t\t\tvar m11:number = this.rawData[0];\n\t\t\tvar m21:number = this.rawData[4];\n\t\t\tvar m31:number = this.rawData[8];\n\t\t\tvar m41:number = this.rawData[12];\n\t\t\tvar m12:number = this.rawData[1];\n\t\t\tvar m22:number = this.rawData[5];\n\t\t\tvar m32:number = this.rawData[9];\n\t\t\tvar m42:number = this.rawData[13];\n\t\t\tvar m13:number = this.rawData[2];\n\t\t\tvar m23:number = this.rawData[6];\n\t\t\tvar m33:number = this.rawData[10];\n\t\t\tvar m43:number = this.rawData[14];\n\t\t\tvar m14:number = this.rawData[3];\n\t\t\tvar m24:number = this.rawData[7];\n\t\t\tvar m34:number = this.rawData[11];\n\t\t\tvar m44:number = this.rawData[15];\n\n\t\t\tthis.rawData[0] = d*(m22*(m33*m44 - m43*m34) - m32*(m23*m44 - m43*m24) + m42*(m23*m34 - m33*m24));\n\t\t\tthis.rawData[1] = -d*(m12*(m33*m44 - m43*m34) - m32*(m13*m44 - m43*m14) + m42*(m13*m34 - m33*m14));\n\t\t\tthis.rawData[2] = d*(m12*(m23*m44 - m43*m24) - m22*(m13*m44 - m43*m14) + m42*(m13*m24 - m23*m14));\n\t\t\tthis.rawData[3] = -d*(m12*(m23*m34 - m33*m24) - m22*(m13*m34 - m33*m14) + m32*(m13*m24 - m23*m14));\n\t\t\tthis.rawData[4] = -d*(m21*(m33*m44 - m43*m34) - m31*(m23*m44 - m43*m24) + m41*(m23*m34 - m33*m24));\n\t\t\tthis.rawData[5] = d*(m11*(m33*m44 - m43*m34) - m31*(m13*m44 - m43*m14) + m41*(m13*m34 - m33*m14));\n\t\t\tthis.rawData[6] = -d*(m11*(m23*m44 - m43*m24) - m21*(m13*m44 - m43*m14) + m41*(m13*m24 - m23*m14));\n\t\t\tthis.rawData[7] = d*(m11*(m23*m34 - m33*m24) - m21*(m13*m34 - m33*m14) + m31*(m13*m24 - m23*m14));\n\t\t\tthis.rawData[8] = d*(m21*(m32*m44 - m42*m34) - m31*(m22*m44 - m42*m24) + m41*(m22*m34 - m32*m24));\n\t\t\tthis.rawData[9] = -d*(m11*(m32*m44 - m42*m34) - m31*(m12*m44 - m42*m14) + m41*(m12*m34 - m32*m14));\n\t\t\tthis.rawData[10] = d*(m11*(m22*m44 - m42*m24) - m21*(m12*m44 - m42*m14) + m41*(m12*m24 - m22*m14));\n\t\t\tthis.rawData[11] = -d*(m11*(m22*m34 - m32*m24) - m21*(m12*m34 - m32*m14) + m31*(m12*m24 - m22*m14));\n\t\t\tthis.rawData[12] = -d*(m21*(m32*m43 - m42*m33) - m31*(m22*m43 - m42*m23) + m41*(m22*m33 - m32*m23));\n\t\t\tthis.rawData[13] = d*(m11*(m32*m43 - m42*m33) - m31*(m12*m43 - m42*m13) + m41*(m12*m33 - m32*m13));\n\t\t\tthis.rawData[14] = -d*(m11*(m22*m43 - m42*m23) - m21*(m12*m43 - m42*m13) + m41*(m12*m23 - m22*m13));\n\t\t\tthis.rawData[15] = d*(m11*(m22*m33 - m32*m23) - m21*(m12*m33 - m32*m13) + m31*(m12*m23 - m22*m13));\n\t\t}\n\t\treturn invertable;\n\t}\n\n\t/* TODO implement pointAt\n\t public pointAt( pos:Vector3D, at:Vector3D = null, up:Vector3D = null )\n\t {\n\t }\n\t */\n\n\t/**\n\t * Prepends a matrix by multiplying the current Matrix3D object by another Matrix3D object.\n\t */\n\tpublic prepend(rhs:Matrix3D)\n\t{\n\t\tvar m111:number = rhs.rawData[0], m121:number = rhs.rawData[4], m131:number = rhs.rawData[8], m141:number = rhs.rawData[12], m112:number = rhs.rawData[1], m122:number = rhs.rawData[5], m132:number = rhs.rawData[9], m142:number = rhs.rawData[13], m113:number = rhs.rawData[2], m123:number = rhs.rawData[6], m133:number = rhs.rawData[10], m143:number = rhs.rawData[14], m114:number = rhs.rawData[3], m124:number = rhs.rawData[7], m134:number = rhs.rawData[11], m144:number = rhs.rawData[15], m211:number = this.rawData[0], m221:number = this.rawData[4], m231:number = this.rawData[8], m241:number = this.rawData[12], m212:number = this.rawData[1], m222:number = this.rawData[5], m232:number = this.rawData[9], m242:number = this.rawData[13], m213:number = this.rawData[2], m223:number = this.rawData[6], m233:number = this.rawData[10], m243:number = this.rawData[14], m214:number = this.rawData[3], m224:number = this.rawData[7], m234:number = this.rawData[11], m244:number = this.rawData[15];\n\n\t\tthis.rawData[0] = m111*m211 + m112*m221 + m113*m231 + m114*m241;\n\t\tthis.rawData[1] = m111*m212 + m112*m222 + m113*m232 + m114*m242;\n\t\tthis.rawData[2] = m111*m213 + m112*m223 + m113*m233 + m114*m243;\n\t\tthis.rawData[3] = m111*m214 + m112*m224 + m113*m234 + m114*m244;\n\n\t\tthis.rawData[4] = m121*m211 + m122*m221 + m123*m231 + m124*m241;\n\t\tthis.rawData[5] = m121*m212 + m122*m222 + m123*m232 + m124*m242;\n\t\tthis.rawData[6] = m121*m213 + m122*m223 + m123*m233 + m124*m243;\n\t\tthis.rawData[7] = m121*m214 + m122*m224 + m123*m234 + m124*m244;\n\n\t\tthis.rawData[8] = m131*m211 + m132*m221 + m133*m231 + m134*m241;\n\t\tthis.rawData[9] = m131*m212 + m132*m222 + m133*m232 + m134*m242;\n\t\tthis.rawData[10] = m131*m213 + m132*m223 + m133*m233 + m134*m243;\n\t\tthis.rawData[11] = m131*m214 + m132*m224 + m133*m234 + m134*m244;\n\n\t\tthis.rawData[12] = m141*m211 + m142*m221 + m143*m231 + m144*m241;\n\t\tthis.rawData[13] = m141*m212 + m142*m222 + m143*m232 + m144*m242;\n\t\tthis.rawData[14] = m141*m213 + m142*m223 + m143*m233 + m144*m243;\n\t\tthis.rawData[15] = m141*m214 + m142*m224 + m143*m234 + m144*m244;\n\t}\n\n\t/**\n\t * Prepends an incremental rotation to a Matrix3D object.\n\t */\n\tpublic prependRotation(degrees:number, axis:Vector3D) //, pivot:Vector3D = null )\n\t{\n\t\tvar m:Matrix3D = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees);\n\n\t\t/*\n\t\t if ( pivot != null )\n\t\t {\n\t\t var p:Vector3D = pivot;\n\t\t m.appendTranslation( p.x, p.y, p.z );\n\t\t }\n\t\t */\n\t\tthis.prepend(m);\n\t}\n\n\t/**\n\t * Prepends an incremental scale change along the x, y, and z axes to a Matrix3D object.\n\t */\n\tpublic prependScale(xScale:number, yScale:number, zScale:number)\n\t{\n\n\t\t// Initial Tests - OK\n\n\t\tthis.prepend(new Matrix3D([ xScale, 0, 0, 0, 0, yScale, 0, 0, 0, 0, zScale, 0, 0, 0, 0, 1 ]));\n\t}\n\n\t/**\n\t * Prepends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object.\n\t */\n\tpublic prependTranslation(x:number, y:number, z:number)\n\t{\n\n\t\t// Initial Tests - OK\n\n\t\tvar m = new Matrix3D();\n\t\tm.position = new Vector3D(x, y, z);\n\t\tthis.prepend(m);\n\t}\n\n\t// TODO orientationStyle\n\t/**\n\t * Sets the transformation matrix's translation, rotation, and scale settings.\n\t */\n\tpublic recompose(components:Vector3D[]):boolean\n\t{\n\n\t\t// Initial Tests - OK\n\n\t\tif (components.length < 3) return false\n\n\t\t//components[2].x == 0 || components[2].y == 0 || components[2].z == 0) return false;\n\n\t\tthis.identity();\n\t\tthis.appendScale(components[2].x, components[2].y, components[2].z);\n\n\t\tvar angle:number;\n\t\tangle = -components[1].x;\n\t\tthis.append(new 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]));\n\t\tangle = -components[1].y;\n\t\tthis.append(new 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]));\n\t\tangle = -components[1].z;\n\t\tthis.append(new 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]));\n\n\t\tthis.position = components[0];\n\t\tthis.rawData[15] = 1;\n\n\t\treturn true;\n\t}\n\n\tpublic transformVector(v:Vector3D):Vector3D\n\t{\n\t\tvar x:number = v.x;\n\t\tvar y:number = v.y;\n\t\tvar z:number = v.z;\n\n\t\treturn new 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]), (x*this.rawData[3] + y*this.rawData[7] + z*this.rawData[11] + this.rawData[15]));\n\t}\n\n\t/**\n\t * Uses the transformation matrix to transform a Vector of Numbers from one coordinate space to another.\n\t */\n\tpublic transformVectors(vin:number[], vout:number[])\n\t{\n\n\t\t// Initial Tests - OK\n\n\t\tvar i:number = 0;\n\t\tvar x:number = 0, y:number = 0, z:number = 0;\n\n\t\twhile (i + 3 <= vin.length) {\n\t\t\tx = vin[i];\n\t\t\ty = vin[i + 1];\n\t\t\tz = vin[i + 2];\n\t\t\tvout[i] = x*this.rawData[0] + y*this.rawData[4] + z*this.rawData[8] + this.rawData[12];\n\t\t\tvout[i + 1] = x*this.rawData[1] + y*this.rawData[5] + z*this.rawData[9] + this.rawData[13];\n\t\t\tvout[i + 2] = x*this.rawData[2] + y*this.rawData[6] + z*this.rawData[10] + this.rawData[14];\n\t\t\ti += 3;\n\t\t}\n\t}\n\n\t/**\n\t * Converts the current Matrix3D object to a matrix where the rows and columns are swapped.\n\t */\n\tpublic transpose()\n\t{\n\n\t\t// Initial Tests - OK\n\n\t\tvar oRawData:number[] = this.rawData.slice(0);\n\n\t\tthis.rawData[1] = oRawData[4];\n\t\tthis.rawData[2] = oRawData[8];\n\t\tthis.rawData[3] = oRawData[12];\n\t\tthis.rawData[4] = oRawData[1];\n\t\tthis.rawData[6] = oRawData[9];\n\t\tthis.rawData[7] = oRawData[13];\n\t\tthis.rawData[8] = oRawData[2];\n\t\tthis.rawData[9] = oRawData[6];\n\t\tthis.rawData[11] = oRawData[14];\n\t\tthis.rawData[12] = oRawData[3];\n\t\tthis.rawData[13] = oRawData[7];\n\t\tthis.rawData[14] = oRawData[11];\n\t}\n\n\tstatic getAxisRotation(x:number, y:number, z:number, degrees:number):Matrix3D\n\t{\n\n\t\t// internal class use by rotations which have been tested\n\n\t\tvar m:Matrix3D = new Matrix3D();\n\n\t\tvar rad = degrees*( Math.PI/180 );\n\t\tvar c:number = Math.cos(rad);\n\t\tvar s:number = Math.sin(rad);\n\t\tvar t:number = 1 - c;\n\t\tvar tmp1:number, tmp2:number;\n\n\t\tm.rawData[0] = c + x*x*t;\n\t\tm.rawData[5] = c + y*y*t;\n\t\tm.rawData[10] = c + z*z*t;\n\n\t\ttmp1 = x*y*t;\n\t\ttmp2 = z*s;\n\t\tm.rawData[1] = tmp1 + tmp2;\n\t\tm.rawData[4] = tmp1 - tmp2;\n\t\ttmp1 = x*z*t;\n\t\ttmp2 = y*s;\n\t\tm.rawData[8] = tmp1 + tmp2;\n\t\tm.rawData[2] = tmp1 - tmp2;\n\t\ttmp1 = y*z*t;\n\t\ttmp2 = x*s;\n\t\tm.rawData[9] = tmp1 - tmp2;\n\t\tm.rawData[6] = tmp1 + tmp2;\n\n\t\treturn m;\n\t}\n\n\t/**\n\t * [read-only] A Number that determines whether a matrix is invertible.\n\t */\n\tpublic get determinant():number\n\t{\n\t\treturn ((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]));\n\t}\n\n\t/**\n\t * A Vector3D object that holds the position, the 3D coordinate (x,y,z) of a display object within the\n\t * transformation's frame of reference.\n\t */\n\tpublic get position():Vector3D\n\t{\n\t\treturn new Vector3D(this.rawData[12], this.rawData[13], this.rawData[14]);\n\t}\n\n\tpublic set position(value:Vector3D)\n\t{\n\t\tthis.rawData[12] = value.x;\n\t\tthis.rawData[13] = value.y;\n\t\tthis.rawData[14] = value.z;\n\t}\n\n\tpublic toFixed(decimalPlace:number):string\n\t{\n\t\tvar magnitude:number = Math.pow(10, decimalPlace);\n\t\treturn \"matrix3d(\" + Math.round(this.rawData[0]*magnitude)/magnitude + \",\" + Math.round(this.rawData[1]*magnitude)/magnitude + \",\" + Math.round(this.rawData[2]*magnitude)/magnitude + \",\" + Math.round(this.rawData[3]*magnitude)/magnitude + \",\" + Math.round(this.rawData[4]*magnitude)/magnitude + \",\" + Math.round(this.rawData[5]*magnitude)/magnitude + \",\" + Math.round(this.rawData[6]*magnitude)/magnitude + \",\" + Math.round(this.rawData[7]*magnitude)/magnitude + \",\" + Math.round(this.rawData[8]*magnitude)/magnitude + \",\" + Math.round(this.rawData[9]*magnitude)/magnitude + \",\" + Math.round(this.rawData[10]*magnitude)/magnitude + \",\" + Math.round(this.rawData[11]*magnitude)/magnitude + \",\" + Math.round(this.rawData[12]*magnitude)/magnitude + \",\" + Math.round(this.rawData[13]*magnitude)/magnitude + \",\" + Math.round(this.rawData[14]*magnitude)/magnitude + \",\" + Math.round(this.rawData[15]*magnitude)/magnitude + \")\";\n\t}\n\n\tpublic toString():string\n\t{\n\t\treturn \"matrix3d(\" + Math.round(this.rawData[0]*1000)/1000 + \",\" + Math.round(this.rawData[1]*1000)/1000 + \",\" + Math.round(this.rawData[2]*1000)/1000 + \",\" + Math.round(this.rawData[3]*1000)/1000 + \",\" + Math.round(this.rawData[4]*1000)/1000 + \",\" + Math.round(this.rawData[5]*1000)/1000 + \",\" + Math.round(this.rawData[6]*1000)/1000 + \",\" + Math.round(this.rawData[7]*1000)/1000 + \",\" + Math.round(this.rawData[8]*1000)/1000 + \",\" + Math.round(this.rawData[9]*1000)/1000 + \",\" + Math.round(this.rawData[10]*1000)/1000 + \",\" + Math.round(this.rawData[11]*1000)/1000 + \",\" + Math.round(this.rawData[12]*1000)/1000 + \",\" + Math.round(this.rawData[13]*1000)/1000 + \",\" + Math.round(this.rawData[14]*1000)/1000 + \",\" + Math.round(this.rawData[15]*1000)/1000 + \")\";\n\t}\n}\n\nexport = Matrix3D;", + "import Point\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport ArgumentError\t\t\t= require(\"awayjs-core/lib/errors/ArgumentError\");\n\n/**\n * The Matrix class represents a transformation matrix that determines how to\n * map points from one coordinate space to another. You can perform various\n * graphical transformations on a display object by setting the properties of\n * a Matrix object, applying that Matrix object to the matrix\n * property of a Transform object, and then applying that Transform object as\n * the transform property of the display object. These\n * transformation functions include translation(x and y\n * repositioning), rotation, scaling, and skewing.\n *\n *

Together these types of transformations are known as affine\n * transformations. Affine transformations preserve the straightness of\n * lines while transforming, so that parallel lines stay parallel.

\n *\n *

To apply a transformation matrix to a display object, you create a\n * Transform object, set its matrix property to the\n * transformation matrix, and then set the transform property of\n * the display object to the Transform object. Matrix objects are also used as\n * parameters of some methods, such as the following:

\n *\n *
    \n *
  • The draw() method of a BitmapData object
  • \n *
  • The beginBitmapFill() method,\n * beginGradientFill() method, or\n * lineGradientStyle() method of a Graphics object
  • \n *
\n *\n *

A transformation matrix object is a 3 x 3 matrix with the following\n * contents:

\n *\n *

In traditional transformation matrixes, the u,\n * v, and w properties provide extra capabilities.\n * The Matrix class can only operate in two-dimensional space, so it always\n * assumes that the property values u and v are 0.0,\n * and that the property value w is 1.0. The effective values of\n * the matrix are as follows:

\n *\n *

You can get and set the values of all six of the other properties in a\n * Matrix object: a, b, c,\n * d, tx, and ty.

\n *\n *

The Matrix class supports the four major types of transformations:\n * translation, scaling, rotation, and skewing. You can set three of these\n * transformations by using specialized methods, as described in the following\n * table:

\n *\n *

Each transformation function alters the current matrix properties so\n * that you can effectively combine multiple transformations. To do this, you\n * call more than one transformation function before applying the matrix to\n * its display object target(by using the transform property of\n * that display object).

\n *\n *

Use the new Matrix() constructor to create a Matrix object\n * before you can call the methods of the Matrix object.

\n */\nclass Matrix\n{\n\t/**\n\t * The value that affects the positioning of pixels along the x axis\n\t * when scaling or rotating an image.\n\t */\n\tpublic a:number;\n\n\t/**\n\t * The value that affects the positioning of pixels along the y axis\n\t * when rotating or skewing an image.\n\t */\n\tpublic b:number;\n\n\t/**\n\t * The value that affects the positioning of pixels along the x axis\n\t * when rotating or skewing an image.\n\t */\n\tpublic c:number;\n\n\t/**\n\t * The value that affects the positioning of pixels along the y axis\n\t * when scaling or rotating an image.\n\t */\n\tpublic d:number;\n\n\t/**\n\t * The distance by which to translate each point along the x axis.\n\t */\n\tpublic tx:number;\n\n\t/**\n\t * The distance by which to translate each point along the y axis.\n\t */\n\tpublic ty:number;\n\n\t/**\n\t * Creates a new Matrix object with the specified parameters. In matrix\n\t * notation, the properties are organized like this:\n\t *\n\t *

If you do not provide any parameters to the new Matrix()\n\t * constructor, it creates an identity matrix with the following\n\t * values:

\n\t *\n\t *

In matrix notation, the identity matrix looks like this:

\n\t *\n\t * @param a The value that affects the positioning of pixels along the\n\t * x axis when scaling or rotating an image.\n\t * @param b The value that affects the positioning of pixels along the\n\t * y axis when rotating or skewing an image.\n\t * @param c The value that affects the positioning of pixels along the\n\t * x axis when rotating or skewing an image.\n\t * @param d The value that affects the positioning of pixels along the\n\t * y axis when scaling or rotating an image..\n\t * @param tx The distance by which to translate each point along the x\n\t * axis.\n\t * @param ty The distance by which to translate each point along the y\n\t * axis.\n\t */\n\tconstructor(a:number = 1, b:number = 0, c:number = 0, d:number = 1, tx:number = 0, ty:number = 0)\n\t{\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.d = d;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t}\n\n\t/**\n\t * Returns a new Matrix object that is a clone of this matrix, with an exact\n\t * copy of the contained object.\n\t *\n\t * @return A Matrix object.\n\t */\n\tpublic clone():Matrix\n\t{\n\t\treturn new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty);\n\t}\n\n\t/**\n\t * Concatenates a matrix with the current matrix, effectively combining the\n\t * geometric effects of the two. In mathematical terms, concatenating two\n\t * matrixes is the same as combining them using matrix multiplication.\n\t *\n\t *

For example, if matrix m1 scales an object by a factor of\n\t * four, and matrix m2 rotates an object by 1.5707963267949\n\t * radians(Math.PI/2), then m1.concat(m2)\n\t * transforms m1 into a matrix that scales an object by a factor\n\t * of four and rotates the object by Math.PI/2 radians.

\n\t *\n\t *

This method replaces the source matrix with the concatenated matrix. If\n\t * you want to concatenate two matrixes without altering either of the two\n\t * source matrixes, first copy the source matrix by using the\n\t * clone() method, as shown in the Class Examples section.

\n\t *\n\t * @param matrix The matrix to be concatenated to the source matrix.\n\t */\n\tpublic concat(matrix:Matrix):void\n\t{\n\t\tvar a1 = this.a*matrix.a + this.b*matrix.c;\n\t\tthis.b = this.a*matrix.b + this.b*matrix.d;\n\t\tthis.a = a1;\n\n\t\tvar c1 = this.c*matrix.a + this.d*matrix.c;\n\t\tthis.d = this.c*matrix.b + this.d*matrix.d;\n\n\t\tthis.c = c1;\n\n\t\tvar tx1 = this.tx*matrix.a + this.ty*matrix.c + matrix.tx;\n\t\tthis.ty = this.tx*matrix.b + this.ty*matrix.d + matrix.ty;\n\t\tthis.tx = tx1;\n\t}\n\n\t/**\n\t * Copies a Vector3D object into specific column of the calling Matrix3D\n\t * object.\n\t *\n\t * @param column The column from which to copy the data from.\n\t * @param vector3D The Vector3D object from which to copy the data.\n\t */\n\tpublic copyColumnFrom(column:number, vector3D:Vector3D):void\n\t{\n\t\tif (column > 2) {\n\t\t\tthrow \"Column \" + column + \" out of bounds (2)\";\n\t\t} else if (column == 0) {\n\t\t\tthis.a = vector3D.x;\n\t\t\tthis.c = vector3D.y;\n\t\t} else if (column == 1) {\n\t\t\tthis.b = vector3D.x;\n\t\t\tthis.d = vector3D.y;\n\t\t} else {\n\t\t\tthis.tx = vector3D.x;\n\t\t\tthis.ty = vector3D.y;\n\t\t}\n\t}\n\n\t/**\n\t * Copies specific column of the calling Matrix object into the Vector3D\n\t * object. The w element of the Vector3D object will not be changed.\n\t *\n\t * @param column The column from which to copy the data from.\n\t * @param vector3D The Vector3D object from which to copy the data.\n\t */\n\tpublic copyColumnTo(column:number, vector3D:Vector3D):void\n\t{\n\t\tif (column > 2) {\n\t\t\tthrow new ArgumentError(\"ArgumentError, Column \" + column + \" out of bounds [0, ..., 2]\");\n\t\t} else if (column == 0) {\n\t\t\tvector3D.x = this.a;\n\t\t\tvector3D.y = this.c;\n\t\t\tvector3D.z = 0;\n\t\t} else if (column == 1) {\n\t\t\tvector3D.x = this.b;\n\t\t\tvector3D.y = this.d;\n\t\t\tvector3D.z = 0;\n\t\t} else {\n\t\t\tvector3D.x = this.tx;\n\t\t\tvector3D.y = this.ty;\n\t\t\tvector3D.z = 1;\n\t\t}\n\t}\n\n\t/**\n\t * Copies all of the matrix data from the source Point object into the\n\t * calling Matrix object.\n\t *\n\t * @param sourceMatrix The Matrix object from which to copy the data.\n\t */\n\tpublic copyFrom(sourceMatrix:Matrix):void\n\t{\n\t\tthis.a = sourceMatrix.a;\n\t\tthis.b = sourceMatrix.b;\n\t\tthis.c = sourceMatrix.c;\n\t\tthis.d = sourceMatrix.d;\n\t\tthis.tx = sourceMatrix.tx;\n\t\tthis.ty = sourceMatrix.ty;\n\t}\n\n\t/**\n\t * Copies a Vector3D object into specific row of the calling Matrix object.\n\t *\n\t * @param row The row from which to copy the data from.\n\t * @param vector3D The Vector3D object from which to copy the data.\n\t */\n\tpublic copyRowFrom(row:number, vector3D:Vector3D):void\n\t{\n\t\tif (row > 2) {\n\t\t\tthrow new ArgumentError(\"ArgumentError, Row \" + row + \" out of bounds [0, ..., 2]\");\n\t\t} else if (row == 0) {\n\t\t\tthis.a = vector3D.x;\n\t\t\tthis.c = vector3D.y;\n\t\t} else if (row == 1) {\n\t\t\tthis.b = vector3D.x;\n\t\t\tthis.d = vector3D.y;\n\t\t} else {\n\t\t\tthis.tx = vector3D.x;\n\t\t\tthis.ty = vector3D.y;\n\t\t}\n\t}\n\n\t/**\n\t * Copies specific row of the calling Matrix object into the Vector3D object.\n\t * The w element of the Vector3D object will not be changed.\n\t *\n\t * @param row The row from which to copy the data from.\n\t * @param vector3D The Vector3D object from which to copy the data.\n\t */\n\tpublic copyRowTo(row:number, vector3D:Vector3D):void\n\t{\n\t\tif (row > 2) {\n\t\t\tthrow new ArgumentError(\"ArgumentError, Row \" + row + \" out of bounds [0, ..., 2]\");\n\t\t} else if (row == 0) {\n\t\t\tvector3D.x = this.a;\n\t\t\tvector3D.y = this.b;\n\t\t\tvector3D.z = this.tx;\n\t\t} else if (row == 1) {\n\t\t\tvector3D.x = this.c;\n\t\t\tvector3D.y = this.d;\n\t\t\tvector3D.z = this.ty;\n\t\t} else {\n\t\t\tvector3D.setTo(0, 0, 1);\n\t\t}\n\t}\n\n\t/**\n\t * Includes parameters for scaling, rotation, and translation. When applied\n\t * to a matrix it sets the matrix's values based on those parameters.\n\t *\n\t *

Using the createBox() method lets you obtain the same\n\t * matrix as you would if you applied the identity(),\n\t * rotate(), scale(), and translate()\n\t * methods in succession. For example, mat1.createBox(2,2,Math.PI/4,\n\t * 100, 100) has the same effect as the following:

\n\t *\n\t * @param scaleX The factor by which to scale horizontally.\n\t * @param scaleY The factor by which scale vertically.\n\t * @param rotation The amount to rotate, in radians.\n\t * @param tx The number of pixels to translate(move) to the right\n\t * along the x axis.\n\t * @param ty The number of pixels to translate(move) down along the\n\t * y axis.\n\t */\n\tpublic createBox(scaleX:number, scaleY:number, rotation:number = 0, tx:number = 0, ty:number = 0):void\n\t{\n\t\tthis.a = scaleX;\n\t\tthis.d = scaleY;\n\t\tthis.b = rotation;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t}\n\n\t/**\n\t * Creates the specific style of matrix expected by the\n\t * beginGradientFill() and lineGradientStyle()\n\t * methods of the Graphics class. Width and height are scaled to a\n\t * scaleX/scaleY pair and the\n\t * tx/ty values are offset by half the width and\n\t * height.\n\t *\n\t *

For example, consider a gradient with the following\n\t * characteristics:

\n\t *\n\t *
    \n\t *
  • GradientType.LINEAR
  • \n\t *
  • Two colors, green and blue, with the ratios array set to [0,\n\t * 255]
  • \n\t *
  • SpreadMethod.PAD
  • \n\t *
  • InterpolationMethod.LINEAR_RGB
  • \n\t *
\n\t *\n\t *

The following illustrations show gradients in which the matrix was\n\t * defined using the createGradientBox() method with different\n\t * parameter settings:

\n\t *\n\t * @param width The width of the gradient box.\n\t * @param height The height of the gradient box.\n\t * @param rotation The amount to rotate, in radians.\n\t * @param tx The distance, in pixels, to translate to the right along\n\t * the x axis. This value is offset by half of the\n\t * width parameter.\n\t * @param ty The distance, in pixels, to translate down along the\n\t * y axis. This value is offset by half of the\n\t * height parameter.\n\t */\n\tpublic createGradientBox(width:number, height:number, rotation:number = 0, tx:number = 0, ty:number = 0):void\n\t{\n\t\tthis.a = width/1638.4;\n\t\tthis.d = height/1638.4;\n\n\t\tif (rotation != 0.0) {\n\t\t\tvar cos = Math.cos(rotation);\n\t\t\tvar sin = Math.sin(rotation);\n\n\t\t\tthis.b = sin*this.d;\n\t\t\tthis.c = -sin*this.a;\n\t\t\tthis.a *= cos;\n\t\t\tthis.d *= cos;\n\t\t} else {\n\t\t\tthis.b = this.c = 0;\n\t\t}\n\n\t\tthis.tx = tx + width/2;\n\t\tthis.ty = ty + height/2;\n\t}\n\n\t/**\n\t * Given a point in the pretransform coordinate space, returns the\n\t * coordinates of that point after the transformation occurs. Unlike the\n\t * standard transformation applied using the transformPoint()\n\t * method, the deltaTransformPoint() method's transformation\n\t * does not consider the translation parameters tx and\n\t * ty.\n\t *\n\t * @param point The point for which you want to get the result of the matrix\n\t * transformation.\n\t * @return The point resulting from applying the matrix transformation.\n\t */\n\tpublic deltaTransformPoint(point:Point):Point\n\t{\n\t\treturn new Point(point.x*this.a + point.y*this.c, point.x*this.b + point.y*this.d);\n\t}\n\n\t/**\n\t * Sets each matrix property to a value that causes a null transformation. An\n\t * object transformed by applying an identity matrix will be identical to the\n\t * original.\n\t *\n\t *

After calling the identity() method, the resulting matrix\n\t * has the following properties: a=1, b=0,\n\t * c=0, d=1, tx=0,\n\t * ty=0.

\n\t *\n\t *

In matrix notation, the identity matrix looks like this:

\n\t *\n\t */\n\tpublic identity():void\n\t{\n\t\tthis.a = 1;\n\t\tthis.b = 0;\n\t\tthis.c = 0;\n\t\tthis.d = 1;\n\t\tthis.tx = 0;\n\t\tthis.ty = 0;\n\t}\n\n\t/**\n\t * Performs the opposite transformation of the original matrix. You can apply\n\t * an inverted matrix to an object to undo the transformation performed when\n\t * applying the original matrix.\n\t */\n\tpublic invert():void\n\t{\n\t\tvar norm = this.a*this.d - this.b*this.c;\n\n\t\tif (norm == 0) {\n\t\t\tthis.a = this.b = this.c = this.d = 0;\n\t\t\tthis.tx = -this.tx;\n\t\t\tthis.ty = -this.ty;\n\t\t} else {\n\t\t\tnorm = 1.0/norm;\n\t\t\tvar a1 = this.d*norm;\n\t\t\tthis.d = this.a*norm;\n\t\t\tthis.a = a1;\n\t\t\tthis.b *= -norm;\n\t\t\tthis.c *= -norm;\n\n\t\t\tvar tx1 = -this.a*this.tx - this.c*this.ty;\n\t\t\tthis.ty = -this.b*this.tx - this.d*this.ty;\n\t\t\tthis.tx = tx1;\n\t\t}\n\t}\n\n\n\t/**\n\t * Returns a new Matrix object that is a clone of this matrix, with an exact\n\t * copy of the contained object.\n\t *\n\t * @param matrix The matrix for which you want to get the result of the matrix\n\t * transformation.\n\t * @return A Matrix object.\n\t */\n\tpublic multiply(matrix:Matrix):Matrix\n\t{\n\t\tvar result = new Matrix();\n\n\t\tresult.a = this.a*matrix.a + this.b*matrix.c;\n\t\tresult.b = this.a*matrix.b + this.b*matrix.d;\n\t\tresult.c = this.c*matrix.a + this.d*matrix.c;\n\t\tresult.d = this.c*matrix.b + this.d*matrix.d;\n\n\t\tresult.tx = this.tx*matrix.a + this.ty*matrix.c + matrix.tx;\n\t\tresult.ty = this.tx*matrix.b + this.ty*matrix.d + matrix.ty;\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Applies a rotation transformation to the Matrix object.\n\t *\n\t *

The rotate() method alters the a,\n\t * b, c, and d properties of the\n\t * Matrix object. In matrix notation, this is the same as concatenating the\n\t * current matrix with the following:

\n\t *\n\t * @param angle The rotation angle in radians.\n\t */\n\tpublic rotate(angle:number):void\n\t{\n\t\tvar cos = Math.cos(angle);\n\t\tvar sin = Math.sin(angle);\n\n\t\tvar a1 = this.a*cos - this.b*sin;\n\t\tthis.b = this.a*sin + this.b*cos;\n\t\tthis.a = a1;\n\n\t\tvar c1 = this.c*cos - this.d*sin;\n\t\tthis.d = this.c*sin + this.d*cos;\n\t\tthis.c = c1;\n\n\t\tvar tx1 = this.tx*cos - this.ty*sin;\n\t\tthis.ty = this.tx*sin + this.ty*cos;\n\t\tthis.tx = tx1;\n\t}\n\n\t/**\n\t * Applies a scaling transformation to the matrix. The x axis is\n\t * multiplied by sx, and the y axis it is multiplied by\n\t * sy.\n\t *\n\t *

The scale() method alters the a and\n\t * d properties of the Matrix object. In matrix notation, this\n\t * is the same as concatenating the current matrix with the following\n\t * matrix:

\n\t *\n\t * @param sx A multiplier used to scale the object along the x axis.\n\t * @param sy A multiplier used to scale the object along the y axis.\n\t */\n\tpublic scale(sx:number, sy:number):void\n\t{\n\t\tthis.a *= sx;\n\t\tthis.b *= sy;\n\n\t\tthis.c *= sx;\n\t\tthis.d *= sy;\n\n\t\tthis.tx *= sx;\n\t\tthis.ty *= sy;\n\t}\n\n\t/**\n\t * Sets the members of Matrix to the specified values.\n\t *\n\t * @param a The value that affects the positioning of pixels along the\n\t * x axis when scaling or rotating an image.\n\t * @param b The value that affects the positioning of pixels along the\n\t * y axis when rotating or skewing an image.\n\t * @param c The value that affects the positioning of pixels along the\n\t * x axis when rotating or skewing an image.\n\t * @param d The value that affects the positioning of pixels along the\n\t * y axis when scaling or rotating an image..\n\t * @param tx The distance by which to translate each point along the x\n\t * axis.\n\t * @param ty The distance by which to translate each point along the y\n\t * axis.\n\t */\n\tpublic setTo(a:number, b:number, c:number, d:number, tx:number, ty:number):void\n\t{\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.d = d;\n\t\tthis.tx = tx;\n\t\tthis.ty = ty;\n\t}\n\n\t/**\n\t * Returns a text value listing the properties of the Matrix object.\n\t *\n\t * @return A string containing the values of the properties of the Matrix\n\t * object: a, b, c,\n\t * d, tx, and ty.\n\t */\n\tpublic toString():string\n\t{\n\t\treturn \"[Matrix] (a=\" + this.a + \", b=\" + this.b + \", c=\" + this.c + \", d=\" + this.d + \", tx=\" + this.tx + \", ty=\" + this.ty + \")\";\n\t}\n\n\t/**\n\t * Returns the result of applying the geometric transformation represented by\n\t * the Matrix object to the specified point.\n\t *\n\t * @param point The point for which you want to get the result of the Matrix\n\t * transformation.\n\t * @return The point resulting from applying the Matrix transformation.\n\t */\n\tpublic transformPoint(point:Point):Point\n\t{\n\t\treturn new Point(point.x*this.a + point.y*this.c + this.tx, point.x*this.b + point.y*this.d + this.ty);\n\t}\n\n\t/**\n\t * Translates the matrix along the x and y axes, as specified\n\t * by the dx and dy parameters.\n\t *\n\t * @param dx The amount of movement along the x axis to the right, in\n\t * pixels.\n\t * @param dy The amount of movement down along the y axis, in pixels.\n\t */\n\tpublic translate(dx:number, dy:number):void\n\t{\n\t\tthis.tx += dx;\n\t\tthis.ty += dy;\n\t}\n}\n\nexport = Matrix;", + "/**\n * A Quaternion object which can be used to represent rotations.\n */\nclass Orientation3D\n{\n\t/**\n\t * The axis angle orientation uses a combination of an axis and an angle to determine the orientation.\n\t * @type {string}\n\t */\n\tpublic static AXIS_ANGLE:string = \"axisAngle\";\n\n\t/**\n\t * The default orientation for decompose() and recompose() methods, defines the orientation with three separate angles of rotation for each axis.\n\t * @type {string}\n\t */\n\tpublic static EULER_ANGLES:string = \"eulerAngles\";\n\n\t/**\n\t * The quaternion orientation uses complex numbers.\n\t * @type {string}\n\t */\n\tpublic static QUATERNION:string = \"quaternion\";\n}\n\nexport = Orientation3D;", + "import Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Point\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\n\n/**\n *

The PerspectiveProjection class provides an easy way to assign or modify\n * the perspective transformations of a display object and all of its\n * children. For more complex or custom perspective transformations, use the\n * Matrix3D class. While the PerspectiveProjection class provides basic\n * three-dimensional presentation properties, the Matrix3D class provides more\n * detailed control over the three-dimensional presentation of display objects.\n *

\n *\n *

Projection is a way of representing a three-dimensional object in a\n * two-dimensional space, like a cube projected onto a computer screen.\n * Perspective projection uses a viewing frustum (a rectangular pyramid) to\n * model and project a three-dimensional world and its objects on the screen.\n * The viewing frustum becomes increasingly wider as it moves further from the\n * origin of the viewpoint. The origin of the viewpoint could be a camera or\n * the eyes of an observer facing the screen. The projected perspective\n * produces the illusion of three dimensions with depth and distance, where\n * the objects closer to the screen appear larger than the objects farther\n * from the screen.

\n *\n *

A default PerspectiveProjection object is a framework defined for\n * perspective transformation of the root object, based on the field of view\n * and aspect ratio (dimensions) of the stage. The projection center, the\n * vanishing point, is set to the center of the stage, which means the\n * three-dimensional display objects disappear toward the center of the stage\n * as they move back in the z axis. The default viewpoint is at point (0,0)\n * looking down the positive z axis. The y-axis points down toward the bottom\n * of the screen. You can gain access to the root display object's perspective\n * projection settings and change the field of view and projection center\n * properties of the perspectiveProjection property through the root object's\n * DisplayObject.transform property.

\n *\n *

You can also set a different perspective projection setting for a\n * display object through the parent's perspective projection. First, create a\n * PerspectiveProjection object and set its fieldOfView and\n * projectionCenter properties. Next, assign the\n * PerspectiveProjection object to the parent display object using the\n * DisplayObject.transform property. The specified projection\n * matrix and transformation will then apply to all the display object's\n * three-dimensional children.

\n *\n *

To modify a perspective projection of the stage or root object: use the\n * transform.matrix property of the root display object to gain\n * access to the PerspectiveProjection object. Or, apply different perspective\n * projection properties to a display object by setting the perspective\n * projection properties of the display object's parent. The child display\n * object inherits the new properties. Specifically, create a\n * PerspectiveProjection object and set its properties, then assign the\n * PerspectiveProjection object to the perspectiveProjection\n * property of the parent display object's transform property.\n * The specified projection transformation then applies to all the display\n * object's three-dimensional children.

\n *\n *

Since both PerspectiveProjection and Matrix3D objects perform\n * perspective transformations, do not assign both to a display object at the\n * same time. Use the PerspectiveProjection object for focal length and\n * projection center changes. For more control over the perspective\n * transformation, create a perspective projection Matrix3D object.

\n */\nclass PerspectiveProjection\n{\n\tprivate _matrix3D:Matrix3D;\n\n\t/**\n\t * Specifies an angle, as a degree between 0 and 180, for the field of\n\t * view in three dimensions. This value determines how strong the\n\t * perspective transformation and distortion apply to a\n\t * three-dimensional display object with a non-zero z-coordinate.\n\t *\n\t *

A degree close to 0 means that the screen's two-dimensional x-\n\t * and y-coordinates are roughly the same as the three-dimensional x-,\n\t * y-, and z-coordinates with little or no distortion. In other words,\n\t * for a small angle, a display object moving down the z axis appears\n\t * to stay near the same size and moves little.

\n\t *\n\t *

A value close to 180 degrees results in a fisheye projection effect:\n\t * positions with a z value smaller than 0 are magnified, while\n\t * positions with a z value larger than 0 are minimized. With a large\n\t * angle, a display object moving down the z axis appears to change\n\t * size quickly and moves a great distance. If the field of view is\n\t * set to 0 or 180, nothing is seen on the screen.

\n\t */\n\tpublic fieldOfView:number;\n\n\t/**\n\t * The distance between the eye or the viewpoint's origin (0,0,0) and\n\t * the display object located in the z axis. During the perspective\n\t * transformation, the focalLength is calculated\n\t * dynamically using the angle of the field of view and the stage's\n\t * aspect ratio (stage width divided by stage height).\n\t *\n\t * @see away.geom.PerspectiveProjection#fieldOfView\n\t */\n\tpublic focalLength:number;\n\n\t/**\n\t * A two-dimensional point representing the center of the projection,\n\t * the vanishing point for the display object.\n\t *\n\t *

The projectionCenter property is an offset to the\n\t * default registration point that is the upper left of the stage,\n\t * point (0,0). The default projection transformation center is in the\n\t * middle of the stage, which means the three-dimensional display\n\t * objects disappear toward the center of the stage as they move\n\t * backwards in the z axis.

\n\t */\n\tpublic projectionCenter:Point;\n\n\t/**\n\t * Creates an instance of a PerspectiveProjection object.\n\t */\n\tconstructor()\n\t{\n\n\t}\n\t/**\n\t * Returns the underlying Matrix3D object of the display object.\n\t *\n\t *

A display object, like the root object, can have a\n\t * PerspectiveProjection object without needing a Matrix3D property\n\t * defined for its transformations. In fact, use either a\n\t * PerspectiveProjection or a Matrix3D object to specify the\n\t * perspective transformation. If when using the PerspectiveProjection\n\t * object, a Matrix3D object was needed, the toMatrix3D()\n\t * method can retrieve the underlying Matrix3D object of the display\n\t * object. For example, the toMatrix3D() method can be\n\t * used with the Utils3D.projectVectors() method.

\n\t *\n\t * @see away.geom.Matrix3D\n\t */\n\tpublic toMatrix3D():Matrix3D\n\t{\n\t\treturn this._matrix3D;\n\t}\n}\n\nexport = PerspectiveProjection;", + "import PlaneClassification\t= require(\"awayjs-core/lib/core/geom/PlaneClassification\");\nimport Vector3D\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\n\nclass Plane3D\n{\n\t/**\n\t * The A coefficient of this plane. (Also the x dimension of the plane normal)\n\t */\n\tpublic a:number;\n\n\t/**\n\t * The B coefficient of this plane. (Also the y dimension of the plane normal)\n\t */\n\tpublic b:number;\n\n\t/**\n\t * The C coefficient of this plane. (Also the z dimension of the plane normal)\n\t */\n\tpublic c:number;\n\n\t/**\n\t * The D coefficient of this plane. (Also the inverse dot product between normal and point)\n\t */\n\tpublic d:number;\n\n\tpublic _iAlignment:number;\n\n\t// indicates the alignment of the plane\n\tpublic static ALIGN_ANY:number = 0;\n\tpublic static ALIGN_XY_AXIS:number = 1;\n\tpublic static ALIGN_YZ_AXIS:number = 2;\n\tpublic static ALIGN_XZ_AXIS:number = 3;\n\n\t/**\n\t * Create a Plane3D with ABCD coefficients\n\t */\n\tconstructor(a:number = 0, b:number = 0, c:number = 0, d:number = 0)\n\t{\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.d = d;\n\n\t\tif (a == 0 && b == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_XY_AXIS;\n\n\t\t} else if (b == 0 && c == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_YZ_AXIS;\n\n\t\t} else if (a == 0 && c == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_XZ_AXIS;\n\n\t\t} else {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_ANY;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Fills this Plane3D with the coefficients from 3 points in 3d space.\n\t * @param p0 Vector3D\n\t * @param p1 Vector3D\n\t * @param p2 Vector3D\n\t */\n\tpublic fromPoints(p0:Vector3D, p1:Vector3D, p2:Vector3D)\n\t{\n\t\tvar d1x:number = p1.x - p0.x;\n\t\tvar d1y:number = p1.y - p0.y;\n\t\tvar d1z:number = p1.z - p0.z;\n\n\t\tvar d2x:number = p2.x - p0.x;\n\t\tvar d2y:number = p2.y - p0.y;\n\t\tvar d2z:number = p2.z - p0.z;\n\n\t\tthis.a = d1y*d2z - d1z*d2y;\n\t\tthis.b = d1z*d2x - d1x*d2z;\n\t\tthis.c = d1x*d2y - d1y*d2x;\n\t\tthis.d = this.a*p0.x + this.b*p0.y + this.c*p0.z;\n\n\t\t// not using epsilon, since a plane is infinite and a small incorrection can grow very large\n\t\tif (this.a == 0 && this.b == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_XY_AXIS;\n\n\t\t} else if (this.b == 0 && this.c == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_YZ_AXIS;\n\n\t\t} else if (this.a == 0 && this.c == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_XZ_AXIS;\n\n\t\t} else {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_ANY;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Fills this Plane3D with the coefficients from the plane's normal and a point in 3d space.\n\t * @param normal Vector3D\n\t * @param point Vector3D\n\t */\n\tpublic fromNormalAndPoint(normal:Vector3D, point:Vector3D)\n\t{\n\t\tthis.a = normal.x;\n\t\tthis.b = normal.y;\n\t\tthis.c = normal.z;\n\t\tthis.d = this.a*point.x + this.b*point.y + this.c*point.z;\n\t\tif (this.a == 0 && this.b == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_XY_AXIS;\n\n\t\t} else if (this.b == 0 && this.c == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_YZ_AXIS;\n\n\t\t} else if (this.a == 0 && this.c == 0) {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_XZ_AXIS;\n\n\t\t} else {\n\n\t\t\tthis._iAlignment = Plane3D.ALIGN_ANY;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Normalize this Plane3D\n\t * @return Plane3D This Plane3D.\n\t */\n\tpublic normalize():Plane3D\n\t{\n\t\tvar len:number = 1/Math.sqrt(this.a*this.a + this.b*this.b + this.c*this.c);\n\t\tthis.a *= len;\n\t\tthis.b *= len;\n\t\tthis.c *= len;\n\t\tthis.d *= len;\n\t\treturn this;\n\t}\n\n\t/**\n\t * Returns the signed distance between this Plane3D and the point p.\n\t * @param p Vector3D\n\t * @returns Number\n\t */\n\tpublic distance(p:Vector3D):number\n\t{\n\n\t\tif (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) {\n\n\t\t\treturn this.a*p.x - this.d;\n\n\t\t} else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) {\n\t\t\treturn this.b*p.y - this.d;\n\t\t}\n\n\t\telse if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) {\n\n\t\t\treturn this.c*p.z - this.d;\n\n\t\t} else {\n\n\t\t\treturn this.a*p.x + this.b*p.y + this.c*p.z - this.d;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Classify a point against this Plane3D. (in front, back or intersecting)\n\t * @param p Vector3D\n\t * @return int Plane3.FRONT or Plane3D.BACK or Plane3D.INTERSECT\n\t */\n\tpublic classifyPoint(p:Vector3D, epsilon:number = 0.01):number\n\t{\n\t\t// check NaN\n\t\tif (this.d != this.d)\n\t\t\treturn PlaneClassification.FRONT;\n\n\t\tvar len:number;\n\t\tif (this._iAlignment == Plane3D.ALIGN_YZ_AXIS)\n\t\t\tlen = this.a*p.x - this.d; else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS)\n\t\t\tlen = this.b*p.y - this.d; else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS)\n\t\t\tlen = this.c*p.z - this.d; else\n\t\t\tlen = this.a*p.x + this.b*p.y + this.c*p.z - this.d;\n\n\t\tif (len < -epsilon)\n\t\t\treturn PlaneClassification.BACK; else if (len > epsilon)\n\t\t\treturn PlaneClassification.FRONT; else\n\t\t\treturn PlaneClassification.INTERSECT;\n\t}\n\n\tpublic toString():string\n\t{\n\t\treturn \"Plane3D [a:\" + this.a + \", b:\" + this.b + \", c:\" + this.c + \", d:\" + this.d + \"]\";\n\t}\n}\n\nexport = Plane3D;", + "class PlaneClassification\n{\n\t// \"back\" is synonymous with \"in\", but used for planes (back of plane is \"inside\" a solid volume walled by a plane)\n\tpublic static BACK:number = 0;\n\tpublic static FRONT:number = 1;\n\n\tpublic static IN:number = 0;\n\tpublic static OUT:number = 1;\n\tpublic static INTERSECT:number = 2;\n\n}\n\nexport = PlaneClassification;", + "/**\n * The Point object represents a location in a two-dimensional coordinate\n * system, where x represents the horizontal axis and y\n * represents the vertical axis.\n *\n *

The following code creates a point at(0,0):

\n *\n *

Methods and properties of the following classes use Point objects:

\n *\n *
    \n *
  • BitmapData
  • \n *
  • DisplayObject
  • \n *
  • DisplayObjectContainer
  • \n *
  • DisplacementMapFilter
  • \n *
  • NativeWindow
  • \n *
  • Matrix
  • \n *
  • Rectangle
  • \n *
\n *\n *

You can use the new Point() constructor to create a Point\n * object.

\n */\nclass Point\n{\n\t/**\n\t * The horizontal coordinate of the point. The default value is 0.\n\t */\n\tpublic x:number;\n\n\t/**\n\t * The vertical coordinate of the point. The default value is 0.\n\t */\n\tpublic y:number;\n\n\t/**\n\t * The length of the line segment from(0,0) to this point.\n\t */\n\tpublic get length():number\n\t{\n\t\treturn Math.sqrt(this.x*this.x + this.y*this.y);\n\t}\n\n\t/**\n\t * Creates a new point. If you pass no parameters to this method, a point is\n\t * created at(0,0).\n\t *\n\t * @param x The horizontal coordinate.\n\t * @param y The vertical coordinate.\n\t */\n\tconstructor(x:number = 0, y:number = 0)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t}\n\n\t/**\n\t * Adds the coordinates of another point to the coordinates of this point to\n\t * create a new point.\n\t *\n\t * @param v The point to be added.\n\t * @return The new point.\n\t */\n\tpublic add(v:Point):Point\n\t{\n\t\treturn new Point(this.x + v.x, this.y + v.y);\n\t}\n\n\t/**\n\t * Creates a copy of this Point object.\n\t *\n\t * @return The new Point object.\n\t */\n\tpublic clone():Point\n\t{\n\t\treturn new Point(this.x, this.y);\n\t}\n\n\tpublic copyFrom(sourcePoint:Point)\n\t{\n\n\t}\n\n\t/**\n\t * Determines whether two points are equal. Two points are equal if they have\n\t * the same x and y values.\n\t *\n\t * @param toCompare The point to be compared.\n\t * @return A value of true if the object is equal to this Point\n\t * object; false if it is not equal.\n\t */\n\tpublic equals(toCompare:Point):boolean\n\t{\n\t\treturn (this.x == toCompare.x && this.y == toCompare.y);\n\t}\n\n\t/**\n\t * Scales the line segment between(0,0) and the current point to a set\n\t * length.\n\t *\n\t * @param thickness The scaling value. For example, if the current point is\n\t * (0,5), and you normalize it to 1, the point returned is\n\t * at(0,1).\n\t */\n\tpublic normalize(thickness:number = 1)\n\t{\n\t\tif (this.length != 0) {\n\t\t\tvar invLength = thickness/this.length;\n\t\t\tthis.x *= invLength;\n\t\t\tthis.y *= invLength;\n\t\t\treturn;\n\t\t}\n\t\tthrow \"Cannot divide by zero length.\";\n\t}\n\n\t/**\n\t * Offsets the Point object by the specified amount. The value of\n\t * dx is added to the original value of x to create the\n\t * new x value. The value of dy is added to the original\n\t * value of y to create the new y value.\n\t *\n\t * @param dx The amount by which to offset the horizontal coordinate,\n\t * x.\n\t * @param dy The amount by which to offset the vertical coordinate, y.\n\t */\n\tpublic offset(dx:number, dy:number)\n\t{\n\t\tthis.x += dx;\n\t\tthis.y += dy;\n\t}\n\n\tpublic setTo(xa:number, ya:number)\n\t{\n\n\t}\n\n\t/**\n\t * Subtracts the coordinates of another point from the coordinates of this\n\t * point to create a new point.\n\t *\n\t * @param v The point to be subtracted.\n\t * @return The new point.\n\t */\n\tpublic subtract(v:Point):Point\n\t{\n\t\treturn new Point(this.x - v.x, this.y - v.y);\n\t}\n\n\t/**\n\t * Returns a string that contains the values of the x and y\n\t * coordinates. The string has the form \"(x=x,\n\t * y=y)\", so calling the toString() method for a\n\t * point at 23,17 would return \"(x=23, y=17)\".\n\t *\n\t * @return The string representation of the coordinates.\n\t */\n\tpublic toString():string\n\t{\n\t\treturn \"[Point] (x=\" + this.x + \", y=\" + this.y + \")\";\n\t}\n\n\t/**\n\t * Returns the distance between pt1 and pt2.\n\t *\n\t * @param pt1 The first point.\n\t * @param pt2 The second point.\n\t * @return The distance between the first and second points.\n\t */\n\tpublic static distance(pt1:Point, pt2:Point):number\n\t{\n\t\tvar dx:number = pt2.x - pt1.x;\n\t\tvar dy:number = pt2.y - pt1.y;\n\n\t\treturn Math.sqrt(dx*dx + dy*dy);\n\t}\n\n\t/**\n\t * Determines a point between two specified points. The parameter\n\t * f determines where the new interpolated point is located\n\t * relative to the two end points specified by parameters pt1\n\t * and pt2. The closer the value of the parameter f\n\t * is to 1.0, the closer the interpolated point is to the first\n\t * point(parameter pt1). The closer the value of the parameter\n\t * f is to 0, the closer the interpolated point is to the second\n\t * point(parameter pt2).\n\t *\n\t * @param pt1 The first point.\n\t * @param pt2 The second point.\n\t * @param f The level of interpolation between the two points. Indicates\n\t * where the new point will be, along the line between\n\t * pt1 and pt2. If f=1,\n\t * pt1 is returned; if f=0,\n\t * pt2 is returned.\n\t * @return The new, interpolated point.\n\t */\n\tpublic static interpolate(pt1:Point, pt2:Point, f:number):Point\n\t{\n\t\treturn new Point(pt2.x + (pt1.x - pt2.x)*f, pt2.y + (pt1.y - pt2.y)*f);\n\t}\n\n\t/**\n\t * Converts a pair of polar coordinates to a Cartesian point coordinate.\n\t *\n\t * @param len The length coordinate of the polar pair.\n\t * @param angle The angle, in radians, of the polar pair.\n\t * @return The Cartesian point.\n\t */\n\tpublic static polar(len:number, angle:number):Point\n\t{\n\t\treturn new Point(len*Math.cos(angle), len*Math.sin(angle));\n\t}\n}\n\nexport = Point;\n", + "class PoissonLookup\n{\n\tpublic static _distributions:Array>;\n\n\tpublic static initDistributions():void\n\t{\n\t\t// precalculated for best control\n\t\tthis._distributions = new Array>();\n\t\tthis._distributions[0] = new Array(0.3082841, 0.4320919);\n\t\tthis._distributions[1] = new Array(0.3082841, 0.4320919, -0.2274942, -0.6640266);\n\t\tthis._distributions[2] = new Array(0.8742689, 0.0009265686, -0.6864116, -0.5536607, -0.2325206, 0.7678371);\n\t\tthis._distributions[3] = new Array(0.3913446, -0.7084417, -0.7511101, -0.5935929, -0.2323436, 0.5320091, 0.8435315, 0.5035911);\n\t\tthis._distributions[4] = new Array(0.2122471, -0.5771395, -0.8543506, -0.1763534, 0.5189021, 0.8323698, -0.3616908, 0.5865368, 0.9523004, -0.04948437);\n\t\tthis._distributions[5] = new Array(0.5791035, 0.3496495, 0.2959551, -0.6006749, -0.2419119, -0.06879545, -0.7403072, 0.6110353, -0.04555973, 0.8059174, -0.5275017, -0.737129);\n\t\tthis._distributions[6] = new Array(0.06941478, 0.8519508, -0.7441907, 0.2426432, 0.6439992, -0.2405252, -0.1007523, -0.2327587, -0.6427067, -0.7248485, 0.8050759, 0.5492936, 0.3573822, -0.8824506);\n\t\tthis._distributions[7] = new Array(0.8509863, 0.4452587, -0.09507271, 0.2073005, 0.1706571, -0.6434793, 0.8029777, -0.2718274, -0.4401725, 0.8196304, 0.2715359, 0.8598521, -0.8121575, -0.006447683, -0.6486837, -0.7237598);\n\t\tthis._distributions[8] = new Array(0.6951686, -0.2680728, -0.04933243, 0.3710589, 0.6592212, 0.3661054, -0.01579228, -0.6909603, -0.3275101, -0.1756866, 0.3811549, 0.9218544, -0.216032, 0.9755028, -0.7065172, 0.3355389, -0.6579109, -0.6798355);\n\t\tthis._distributions[9] = new Array(0.6181276, -0.09790418, -0.2537868, -0.5570995, -0.1964931, 0.3459414, 0.3474613, -0.8885581, 0.5135743, 0.5753114, -0.9549091, 0.1480672, -0.8711916, -0.4293123, -0.6928071, 0.6190156, -0.13369, 0.8892705, 0.0548224, -0.1246777);\n\t\tthis._distributions[10] = new Array(0.4853027, -0.5080479, -0.1331675, -0.506597, 0.139575, 0.01316885, 0.803486, -0.07568797, 0.5240274, 0.4883182, -0.4334005, 0.1207938, -0.7794577, -0.3985141, 0.1576432, -0.9861221, -0.3712867, 0.6959021, 0.1517378, 0.9847429, -0.9762396, 0.1661073);\n\t\tthis._distributions[11] = new Array(-0.2790166, -0.01252619, 0.3389016, 0.3921154, 0.2408341, -0.313211, -0.8151779, -0.3898362, -0.6347761, 0.3486495, 0.09471484, -0.7722448, -0.1385674, 0.6364574, 0.2456331, 0.9295807, -0.3864306, -0.8247881, 0.6111673, -0.7164014, 0.8287669, 0.05466961, 0.837706, 0.5415626);\n\t\tthis._distributions[12] = new Array(0.056417, 0.3185693, -0.8245888, 0.1882799, 0.8575996, 0.1136829, 0.1070375, 0.875332, 0.4076743, -0.06000621, -0.4311306, 0.7239349, 0.2677574, -0.538472, -0.08486642, -0.2083647, -0.888989, -0.3906443, -0.4768958, -0.6664082, 0.09334993, -0.9861541, 0.808736, -0.455949, 0.5889823, 0.7660807);\n\t\tthis._distributions[13] = new Array(-0.2681346, -0.3955857, -0.1315102, -0.8852947, -0.5143692, 0.09551838, 0.4344836, -0.546945, -0.8620899, -0.3813288, 0.1650431, 0.02034803, -0.1543657, 0.3842218, -0.828457, 0.5376903, -0.6145, -0.7818927, -0.2639062, 0.8784655, 0.1912684, 0.9720125, 0.3135219, 0.5224229, 0.7850655, 0.4592297, 0.7465045, -0.1368916);\n\t\tthis._distributions[14] = new Array(0.4241029, 0.695281, 0.150511, -0.02304107, -0.2482675, 0.9120338, 0.8057325, 0.2622084, -0.2445909, 0.2765962, 0.8588713, -0.1772072, 0.3117845, -0.4385471, -0.3923851, -0.3298936, -0.1751254, -0.7405846, 0.6926506, -0.684163, -0.9304563, -0.3254691, -0.8533293, 0.1523024, 0.2510415, -0.917345, -0.6239773, -0.7105472, -0.6104624, 0.6041355);\n\t\tthis._distributions[15] = new Array(0.5844554, 0.06651045, 0.1343258, 0.6756578, 0.3799674, -0.6301104, 0.5590436, 0.7940555, 0.09574714, 0.02262517, 0.8697868, 0.393301, 0.003945862, -0.421735, 0.9043913, -0.2432393, -0.4844007, 0.7190998, -0.3201078, 0.2972371, -0.3852352, -0.6341155, -0.5413069, -0.09223081, -0.8468984, -0.5126905, 0.004156174, -0.8633173, -0.9681889, -0.03305046, -0.846509, 0.4414353);\n\t\tthis._distributions[16] = new Array(0.4506488, 0.657668, 0.4621297, 0.07441051, -0.2782125, 0.6201044, 0.9750003, 0.09110117, 0.1019436, 0.2986514, 0.03457398, 0.9631706, 0.542098, -0.5505635, 0.8675668, 0.4938077, -0.5414361, 0.2655292, -0.7941836, 0.6003053, -0.09847672, -0.1001604, -0.9316511, -0.08572888, 0.07286467, -0.611899, -0.5232627, -0.4082253, -0.5481608, -0.827938, -0.1551939, -0.9621193, 0.9220031, -0.3315949);\n\t\tthis._distributions[17] = new Array(0.197908, -0.4697656, -0.4474689, -0.3428435, 0.8529873, -0.2228634, 0.6022478, -0.5469642, 0.2545276, -0.931133, -0.1507547, -0.7855865, -0.07606658, 0.1011628, 0.3046715, 0.2785755, 0.4698432, -0.1064076, 0.6831254, 0.4152522, 0.1374381, 0.8363233, -0.2166121, 0.6682042, 0.5511393, 0.7996449, -0.4278994, 0.28836, -0.8875198, 0.2181732, -0.8772842, -0.2818254, -0.7000262, 0.5762185, -0.6062385, -0.7439126);\n\t\tthis._distributions[18] = new Array(0.6645703, -0.05678739, 0.5720971, 0.4533803, -0.07660709, 0.08802763, 0.5163431, -0.4426552, 0.1163455, -0.3404382, -0.4004807, -0.5046007, 0.2932099, -0.8201418, -0.5322125, 0.03834766, -0.1490209, -0.8817304, -0.8000439, -0.3509448, 0.5260983, 0.8421043, 0.1197811, 0.6963812, 0.9498612, 0.3122156, -0.9285746, 0.02120355, -0.6670724, 0.7217396, 0.9155889, -0.3510147, -0.271941, 0.4727852, 0.318879, 0.1634057, -0.2686755, 0.9253026);\n\t\tthis._distributions[19] = new Array(0.5064292, 0.422527, 0.8935515, -0.06610427, 0.1199719, 0.175568, 0.403388, -0.2003276, 0.1657927, 0.8154403, 0.9301245, 0.2929218, -0.1644068, 0.6201534, 0.7113559, -0.6589743, -0.3364046, -0.1799502, 0.02109996, -0.392765, -0.382213, 0.3219992, -0.9201946, 0.1207967, -0.726185, 0.4291916, -0.7443482, -0.2480059, -0.5147594, 0.7418784, 0.1935272, -0.7406143, -0.3643523, -0.5559214, -0.7147766, -0.6326278, -0.2524151, -0.9096627, 0.5161405, 0.7908453);\n\t\tthis._distributions[20] = new Array(0.7921003, -0.3032096, 0.5992879, -0.009052323, 0.2538549, -0.1872749, 0.7053444, 0.3677175, 0.5417761, -0.8170255, 0.9749611, 0.1210478, 0.1969143, -0.6117041, -0.1824499, -0.4634196, -0.1181338, -0.8668742, -0.3050112, -0.1352596, -0.4409327, -0.7082354, -0.03225285, 0.1171548, 0.3113096, 0.3250439, -0.8166144, -0.463995, -0.01014475, 0.4715334, -0.6868284, 0.05091889, -0.4011163, 0.2717285, -0.06756835, 0.8307694, -0.7938535, 0.4352129, -0.4663842, 0.7165329, 0.559729, 0.8093995);\n\t\tthis._distributions[21] = new Array(0.07832243, 0.426151, -0.3856795, 0.5799953, 0.01970797, 0.06706189, 0.4822682, 0.3014512, -0.1532982, 0.87485, -0.4959527, 0.07888043, 0.260601, -0.2304784, 0.4996209, 0.7167382, 0.585986, -0.04265174, -0.7679967, 0.5509416, -0.9041753, 0.1802134, -0.8407655, -0.4442826, -0.2058258, -0.2636995, -0.4984115, -0.5928579, 0.2926032, -0.7886473, -0.06933882, -0.621177, 0.578115, -0.4813387, 0.8981777, -0.3291056, 0.1942733, 0.9255584, 0.8084362, 0.5066984, 0.9920095, 0.03103104, -0.2403206, -0.9389018);\n\t\tthis._distributions[22] = new Array(-0.5691095, 0.1014316, -0.7788262, 0.384012, -0.8253665, -0.1645582, -0.1830993, 0.002997211, -0.2555013, -0.4177977, -0.6640869, -0.4794711, -0.2351242, 0.5850121, 0.02436554, 0.2825883, 0.006061143, -0.8200245, 0.1618791, -0.3063331, -0.3765897, -0.7249815, 0.6092919, -0.6769328, -0.5956934, 0.6957655, 0.5383642, 0.4522677, -0.1489165, 0.9125596, 0.4167473, 0.1335986, 0.1898309, 0.5874342, 0.2288171, 0.9624356, 0.7540846, -0.07672304, 0.8986252, 0.2788797, 0.3555991, -0.9262139, 0.8454325, -0.4027667, 0.4945236, -0.2935512);\n\t\tthis._distributions[23] = new Array(-0.4481403, -0.3758374, -0.8877251, 0.08739938, 0.05015831, -0.1339983, -0.4070427, -0.8534173, 0.1019274, -0.5503222, -0.445998, 0.1997541, -0.8686263, -0.2788867, -0.7695944, -0.6033704, -0.05515742, -0.885711, -0.7714347, 0.5790485, 0.3466263, -0.8799297, 0.4487582, -0.5321087, -0.2461368, 0.6053771, -0.05568117, 0.2457351, -0.4668669, 0.8523816, 0.8103387, -0.4255538, 0.4054182, -0.175663, -0.2802011, -0.08920153, 0.2665959, 0.382935, 0.555679, 0.1621837, 0.105246, 0.8420411, 0.6921161, 0.6902903, 0.880946, 0.2483067, 0.9699264, -0.1021767);\n\t\tthis._distributions[24] = new Array(-0.1703323, -0.3119385, 0.2916039, -0.2988263, -0.008472982, -0.9277695, -0.7730271, -0.3277904, 0.3440474, -0.6815342, -0.2910278, 0.03461745, -0.6764899, -0.657078, -0.3505501, -0.7311988, -0.03478927, 0.3258755, -0.6048835, 0.159423, 0.2035525, 0.02212214, 0.5116573, 0.2226856, 0.6664805, -0.2500189, 0.7147882, -0.6609634, 0.03030632, -0.5763278, -0.2516585, 0.6116219, -0.9434413, -0.0116792, 0.9061816, 0.2491155, 0.182867, 0.6076167, 0.286593, 0.9485695, -0.5992439, 0.6970096, -0.2082874, 0.9416641, 0.9880044, -0.1541709, -0.9122881, 0.331555, 0.7324886, 0.6725098);\n\t\tthis._distributions[25] = new Array(0.3869598, -0.04974834, 0.7168844, -0.0693711, -0.07166742, 0.1725325, 0.4599592, 0.3232779, 0.5872094, -0.4198674, 0.2442266, -0.625667, 0.1254557, 0.4500048, -0.2290154, -0.1803567, 0.890583, 0.3373493, 0.1256081, 0.7853789, -0.2676466, 0.5305805, -0.7063224, 0.252168, -0.3989835, 0.1189921, 0.09617215, -0.2451447, 0.6302541, 0.6085876, 0.9380925, -0.3234899, 0.5086241, -0.8573482, 0.03576187, -0.9876697, -0.0876712, -0.6365195, -0.5276513, 0.823456, -0.6935764, -0.2240411, -0.5212318, -0.5383121, -0.2116208, 0.9639363, -0.9840096, 0.02743555, -0.3991577, -0.8994547, -0.7830126, 0.614068);\n\t\tthis._distributions[26] = new Array(-0.8366601, 0.4464895, -0.5917366, -0.02073906, -0.9845258, 0.1635625, -0.3097973, 0.4379579, -0.5478154, 0.7173221, -0.1685888, 0.9261969, 0.01503595, 0.6046097, 0.4452421, 0.5449086, 0.0315687, 0.1944619, 0.3753404, 0.8688548, 0.4143643, 0.1396648, 0.8711032, 0.4304703, 0.7328773, 0.1461501, 0.6374492, -0.3521495, 0.145613, -0.1341466, 0.9040975, -0.135123, -0.7839059, -0.5450199, -0.516019, -0.3320859, -0.206158, -0.4431106, -0.9703014, -0.2368356, -0.2473119, -0.0864351, 0.2130725, -0.4604077, -0.003726701, -0.7122303, -0.4072131, -0.6833169, 0.1632999, -0.9776646, 0.4686888, -0.680495, -0.2293511, -0.9509777);\n\t\tthis._distributions[27] = new Array(0.107311, -0.1311369, -0.4194764, -0.3148777, 0.6171439, -0.2745973, 0.2796618, 0.1937153, -0.09106886, 0.4180236, 0.6044006, 0.05577846, 0.02927299, -0.6738263, -0.2580845, 0.1179939, -0.09023564, -0.3830024, 0.3570953, -0.5000587, 0.81591, -0.5518309, 0.9300217, -0.1257987, 0.4904627, -0.8381903, -0.3163182, -0.8632009, 0.1137595, -0.9875998, 0.8390043, 0.3538185, 0.2149114, 0.4993694, 0.5191584, 0.3833552, 0.5002763, 0.7061465, -0.2567276, 0.9068756, -0.5197366, 0.3467845, 0.03668867, 0.9734009, -0.5347553, 0.66747, -0.9028882, 0.1023768, -0.8967977, 0.412834, -0.5821944, 0.0426479, -0.8032165, -0.2397038, -0.5597343, -0.6358021);\n\t\tthis._distributions[28] = new Array(-0.6562496, -0.1781036, -0.9301494, 0.1185208, -0.3861143, -0.4153562, -0.1560799, -0.1099607, -0.5587025, 0.395218, -0.5322112, -0.699701, -0.5008639, 0.08726846, -0.970524, -0.1963461, -0.813577, -0.5185111, -0.1644458, 0.298, -0.3216791, 0.639982, 0.3315373, 0.3339162, 0.2383235, -0.00105722, 0.1137828, 0.5450742, -0.01899921, 0.8798413, 0.2849685, 0.8255596, 0.6974412, 0.2123175, 0.7588523, 0.5470437, 0.5102502, -0.1687844, 0.5853448, 0.8033476, 0.2590716, -0.5262504, 0.5607718, -0.6342825, 0.8666443, -0.1491841, 0.8341052, -0.4935003, -0.1568441, -0.6634066, 0.2512113, -0.8769391, -0.2559827, -0.9572457, -0.01928852, -0.3966542, -0.750667, 0.6409678);\n\t\tthis._distributions[29] = new Array(0.3454786, -0.04837726, 0.2649553, 0.2406852, 0.5599093, -0.3839145, -0.1111814, -0.05502108, 0.7586042, -0.05818377, 0.2519488, -0.4665135, -0.1264972, 0.2602723, -0.08766216, -0.3671907, 0.6428129, 0.3999204, -0.6105871, -0.1246869, -0.4589451, -0.7646643, -0.03021116, -0.7899352, -0.6036922, -0.4293956, -0.2481938, 0.6534185, 0.102798, 0.6784465, -0.6392644, 0.4821358, -0.6789002, 0.1779133, -0.9140783, -0.1989647, -0.9262617, 0.3381507, 0.4794891, -0.8093274, 0.3959447, 0.668478, 0.9602883, 0.2272305, -0.123672, 0.9210883, 0.2375148, 0.9523395, -0.52898, 0.7973378, -0.382433, 0.1228794, 0.695015, 0.6948439, 0.7530277, -0.6458191, 0.8777987, -0.3272956, 0.2318525, -0.962768);\n\t\tthis._distributions[30] = new Array(0.4518921, -0.1146195, 0.4720805, -0.4238748, 0.3655423, 0.1806341, 0.1589939, -0.23568, 0.7673324, -0.5149941, 0.01163658, 0.09045836, 0.7010971, 0.1245747, 0.7518286, -0.1855433, 0.4960719, 0.4601022, 0.2566979, -0.6308268, -0.0654714, -0.5126389, -0.1823319, -0.1343282, -0.1464312, 0.4883236, -0.3858738, 0.203523, 0.1484799, 0.4432284, -0.477109, -0.116241, 0.2719092, 0.7208626, 0.9104174, 0.3578536, -0.5956199, 0.7662588, -0.6996251, 0.3678654, -0.2514512, 0.9251933, 0.1275825, -0.9478135, -0.204608, -0.8611552, 0.4264838, -0.877443, 0.9854161, 0.05521112, 0.5912951, 0.7997434, 0.1140349, 0.982093, -0.9324368, -0.2094094, -0.42436, -0.6441524, -0.6722705, -0.3554261, -0.7844236, 0.08587621);\n\t\tthis._distributions[31] = new Array(-0.4206714, -0.5613642, -0.8733016, -0.3373051, -0.1046226, -0.2902999, -0.1318562, -0.8434365, 0.1145093, -0.5962623, -0.4965627, -0.1873259, -0.5011808, -0.8546229, -0.7165636, -0.5743566, 0.1090901, 0.2017643, 0.3404809, -0.220455, -0.1989015, 0.2372122, -0.4538706, 0.0979171, 0.4514146, -0.572846, 0.2314168, -0.8514503, -0.4247236, 0.5650803, -0.943347, 0.04514639, -0.1309718, 0.5221877, -0.7004157, 0.4561877, 0.6306441, 0.04448673, 0.4301621, 0.5766876, 0.1078042, 0.7245752, 0.3875354, 0.2794483, 0.702876, -0.2924213, 0.7360667, -0.6210318, 0.7486517, 0.6531103, 0.4898235, 0.8591025, 0.6549174, 0.3854057, -0.2596106, 0.7916998, 0.9251194, -0.05296265, -0.5620695, 0.820877, -0.01228026, 0.9937211, 0.9612103, 0.2628758);\n\t}\n\n\tpublic static getDistribution(n:number /*int*/):Array\n\t{\n\t\tif (!this._distributions)\n\t\t\tthis.initDistributions();\n\n\t\tif (n < 2 || n > 32)\n\t\t\treturn null;\n\n\t\treturn this._distributions[n - 1];\n\t}\n}\n\nexport = PoissonLookup;", + "import Matrix3DUtils\t\t= require(\"awayjs-core/lib/core/geom/Matrix3DUtils\");\nimport Orientation3D\t\t= require(\"awayjs-core/lib/core/geom/Orientation3D\");\nimport Matrix3D\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Vector3D\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\n\n/**\n * A Quaternion object which can be used to represent rotations.\n */\nclass Quaternion\n{\n\t/**\n\t * The x value of the quaternion.\n\t */\n\tpublic x:number = 0;\n\n\t/**\n\t * The y value of the quaternion.\n\t */\n\tpublic y:number = 0;\n\n\t/**\n\t * The z value of the quaternion.\n\t */\n\tpublic z:number = 0;\n\n\t/**\n\t * The w value of the quaternion.\n\t */\n\tpublic w:number = 1;\n\n\t/**\n\t * Creates a new Quaternion object.\n\t * @param x The x value of the quaternion.\n\t * @param y The y value of the quaternion.\n\t * @param z The z value of the quaternion.\n\t * @param w The w value of the quaternion.\n\t */\n\tconstructor(x:number = 0, y:number = 0, z:number = 0, w:number = 1)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\t}\n\n\t/**\n\t * Returns the magnitude of the quaternion object.\n\t */\n\tpublic get magnitude():number\n\t{\n\t\treturn Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z);\n\t}\n\n\t/**\n\t * Fills the quaternion object with the result from a multiplication of two quaternion objects.\n\t *\n\t * @param qa The first quaternion in the multiplication.\n\t * @param qb The second quaternion in the multiplication.\n\t */\n\tpublic multiply(qa:Quaternion, qb:Quaternion)\n\t{\n\t\tvar w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z;\n\t\tvar w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z;\n\n\t\tthis.w = w1*w2 - x1*x2 - y1*y2 - z1*z2;\n\t\tthis.x = w1*x2 + x1*w2 + y1*z2 - z1*y2;\n\t\tthis.y = w1*y2 - x1*z2 + y1*w2 + z1*x2;\n\t\tthis.z = w1*z2 + x1*y2 - y1*x2 + z1*w2;\n\t}\n\n\tpublic multiplyVector(vector:Vector3D, target:Quaternion = null):Quaternion\n\t{\n\t\t//target ||= new Quaternion();\n\t\tif (target === null) {\n\t\t\ttarget = new Quaternion();\n\n\t\t}\n\n\n\t\tvar x2:number = vector.x;\n\t\tvar y2:number = vector.y;\n\t\tvar z2:number = vector.z;\n\n\t\ttarget.w = -this.x*x2 - this.y*y2 - this.z*z2;\n\t\ttarget.x = this.w*x2 + this.y*z2 - this.z*y2;\n\t\ttarget.y = this.w*y2 - this.x*z2 + this.z*x2;\n\t\ttarget.z = this.w*z2 + this.x*y2 - this.y*x2;\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Fills the quaternion object with values representing the given rotation around a vector.\n\t *\n\t * @param axis The axis around which to rotate\n\t * @param angle The angle in radians of the rotation.\n\t */\n\tpublic fromAxisAngle(axis:Vector3D, angle:number)\n\t{\n\t\tvar sin_a:number = Math.sin(angle/2);\n\t\tvar cos_a:number = Math.cos(angle/2);\n\n\t\tthis.x = axis.x*sin_a;\n\t\tthis.y = axis.y*sin_a;\n\t\tthis.z = axis.z*sin_a;\n\t\tthis.w = cos_a;\n\n\t\tthis.normalize();\n\t}\n\n\t/**\n\t * Spherically interpolates between two quaternions, providing an interpolation between rotations with constant angle change rate.\n\t * @param qa The first quaternion to interpolate.\n\t * @param qb The second quaternion to interpolate.\n\t * @param t The interpolation weight, a value between 0 and 1.\n\t */\n\tpublic slerp(qa:Quaternion, qb:Quaternion, t:number)\n\t{\n\t\tvar w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z;\n\t\tvar w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z;\n\t\tvar dot:number = w1*w2 + x1*x2 + y1*y2 + z1*z2;\n\n\t\t// shortest direction\n\t\tif (dot < 0) {\n\t\t\tdot = -dot;\n\t\t\tw2 = -w2;\n\t\t\tx2 = -x2;\n\t\t\ty2 = -y2;\n\t\t\tz2 = -z2;\n\t\t}\n\n\t\tif (dot < 0.95) {\n\t\t\t// interpolate angle linearly\n\t\t\tvar angle:number = Math.acos(dot);\n\t\t\tvar s:number = 1/Math.sin(angle);\n\t\t\tvar s1:number = Math.sin(angle*(1 - t))*s;\n\t\t\tvar s2:number = Math.sin(angle*t)*s;\n\t\t\tthis.w = w1*s1 + w2*s2;\n\t\t\tthis.x = x1*s1 + x2*s2;\n\t\t\tthis.y = y1*s1 + y2*s2;\n\t\t\tthis.z = z1*s1 + z2*s2;\n\t\t} else {\n\t\t\t// nearly identical angle, interpolate linearly\n\t\t\tthis.w = w1 + t*(w2 - w1);\n\t\t\tthis.x = x1 + t*(x2 - x1);\n\t\t\tthis.y = y1 + t*(y2 - y1);\n\t\t\tthis.z = z1 + t*(z2 - z1);\n\t\t\tvar len:number = 1.0/Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z);\n\t\t\tthis.w *= len;\n\t\t\tthis.x *= len;\n\t\t\tthis.y *= len;\n\t\t\tthis.z *= len;\n\t\t}\n\t}\n\n\t/**\n\t * Linearly interpolates between two quaternions.\n\t * @param qa The first quaternion to interpolate.\n\t * @param qb The second quaternion to interpolate.\n\t * @param t The interpolation weight, a value between 0 and 1.\n\t */\n\tpublic lerp(qa:Quaternion, qb:Quaternion, t:number)\n\t{\n\t\tvar w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z;\n\t\tvar w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z;\n\t\tvar len:number;\n\n\t\t// shortest direction\n\t\tif (w1*w2 + x1*x2 + y1*y2 + z1*z2 < 0) {\n\t\t\tw2 = -w2;\n\t\t\tx2 = -x2;\n\t\t\ty2 = -y2;\n\t\t\tz2 = -z2;\n\t\t}\n\n\t\tthis.w = w1 + t*(w2 - w1);\n\t\tthis.x = x1 + t*(x2 - x1);\n\t\tthis.y = y1 + t*(y2 - y1);\n\t\tthis.z = z1 + t*(z2 - z1);\n\n\t\tlen = 1.0/Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z);\n\t\tthis.w *= len;\n\t\tthis.x *= len;\n\t\tthis.y *= len;\n\t\tthis.z *= len;\n\t}\n\n\t/**\n\t * Fills the quaternion object with values representing the given euler rotation.\n\t *\n\t * @param ax The angle in radians of the rotation around the ax axis.\n\t * @param ay The angle in radians of the rotation around the ay axis.\n\t * @param az The angle in radians of the rotation around the az axis.\n\t */\n\tpublic fromEulerAngles(ax:number, ay:number, az:number)\n\t{\n\t\tvar halfX:number = ax*.5, halfY:number = ay*.5, halfZ:number = az*.5;\n\t\tvar cosX:number = Math.cos(halfX), sinX:number = Math.sin(halfX);\n\t\tvar cosY:number = Math.cos(halfY), sinY:number = Math.sin(halfY);\n\t\tvar cosZ:number = Math.cos(halfZ), sinZ:number = Math.sin(halfZ);\n\n\t\tthis.w = cosX*cosY*cosZ + sinX*sinY*sinZ;\n\t\tthis.x = sinX*cosY*cosZ - cosX*sinY*sinZ;\n\t\tthis.y = cosX*sinY*cosZ + sinX*cosY*sinZ;\n\t\tthis.z = cosX*cosY*sinZ - sinX*sinY*cosZ;\n\t}\n\n\t/**\n\t * Fills a target Vector3D object with the Euler angles that form the rotation represented by this quaternion.\n\t * @param target An optional Vector3D object to contain the Euler angles. If not provided, a new object is created.\n\t * @return The Vector3D containing the Euler angles.\n\t */\n\tpublic toEulerAngles(target:Vector3D = null):Vector3D\n\t{\n\n\t\t//target ||= new Vector3D();\n\t\tif (target === null) {\n\n\t\t\ttarget = new Vector3D();\n\n\t\t}\n\n\t\ttarget.x = Math.atan2(2*(this.w*this.x + this.y*this.z), 1 - 2*(this.x*this.x + this.y*this.y));\n\t\ttarget.y = Math.asin(2*(this.w*this.y - this.z*this.x));\n\t\ttarget.z = Math.atan2(2*(this.w*this.z + this.x*this.y), 1 - 2*(this.y*this.y + this.z*this.z));\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Normalises the quaternion object.\n\t */\n\tpublic normalize(val:number = 1)\n\t{\n\t\tvar mag:number = val/Math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z + this.w*this.w);\n\n\t\tthis.x *= mag;\n\t\tthis.y *= mag;\n\t\tthis.z *= mag;\n\t\tthis.w *= mag;\n\t}\n\n\t/**\n\t * Used to trace the values of a quaternion.\n\t *\n\t * @return A string representation of the quaternion object.\n\t */\n\tpublic toString():string\n\t{\n\t\treturn \"{x:\" + this.x + \" y:\" + this.y + \" z:\" + this.z + \" w:\" + this.w + \"}\";\n\t}\n\n\t/**\n\t * Converts the quaternion to a Matrix3D object representing an equivalent rotation.\n\t * @param target An optional Matrix3D container to store the transformation in. If not provided, a new object is created.\n\t * @return A Matrix3D object representing an equivalent rotation.\n\t */\n\tpublic toMatrix3D(target:Matrix3D = null):Matrix3D\n\t{\n\t\tvar rawData:number[] = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\tvar xy2:number = 2.0*this.x*this.y, xz2:number = 2.0*this.x*this.z, xw2:number = 2.0*this.x*this.w;\n\t\tvar yz2:number = 2.0*this.y*this.z, yw2:number = 2.0*this.y*this.w, zw2:number = 2.0*this.z*this.w;\n\t\tvar xx:number = this.x*this.x, yy:number = this.y*this.y, zz:number = this.z*this.z, ww:number = this.w*this.w;\n\n\t\trawData[0] = xx - yy - zz + ww;\n\t\trawData[4] = xy2 - zw2;\n\t\trawData[8] = xz2 + yw2;\n\t\trawData[12] = 0;\n\t\trawData[1] = xy2 + zw2;\n\t\trawData[5] = -xx + yy - zz + ww;\n\t\trawData[9] = yz2 - xw2;\n\t\trawData[13] = 0;\n\t\trawData[2] = xz2 - yw2;\n\t\trawData[6] = yz2 + xw2;\n\t\trawData[10] = -xx - yy + zz + ww;\n\t\trawData[14] = 0;\n\t\trawData[3] = 0.0;\n\t\trawData[7] = 0.0;\n\t\trawData[11] = 0;\n\t\trawData[15] = 1;\n\n\t\tif (!target)\n\t\t\treturn new Matrix3D(rawData);\n\n\t\ttarget.copyRawDataFrom(rawData);\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Extracts a quaternion rotation matrix out of a given Matrix3D object.\n\t * @param matrix The Matrix3D out of which the rotation will be extracted.\n\t */\n\tpublic fromMatrix(matrix:Matrix3D)\n\t{\n\t\tvar v:Vector3D = matrix.decompose(Orientation3D.QUATERNION)[1];\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = v.w;\n\t}\n\n\t/**\n\t * Converts the quaternion to a Vector.<Number> matrix representation of a rotation equivalent to this quaternion.\n\t * @param target The Vector.<Number> to contain the raw matrix data.\n\t * @param exclude4thRow If true, the last row will be omitted, and a 4x3 matrix will be generated instead of a 4x4.\n\t */\n\tpublic toRawData(target:number[], exclude4thRow:boolean = false)\n\t{\n\t\tvar xy2:number = 2.0*this.x*this.y, xz2:number = 2.0*this.x*this.z, xw2:number = 2.0*this.x*this.w;\n\t\tvar yz2:number = 2.0*this.y*this.z, yw2:number = 2.0*this.y*this.w, zw2:number = 2.0*this.z*this.w;\n\t\tvar xx:number = this.x*this.x, yy:number = this.y*this.y, zz:number = this.z*this.z, ww:number = this.w*this.w;\n\n\t\ttarget[0] = xx - yy - zz + ww;\n\t\ttarget[1] = xy2 - zw2;\n\t\ttarget[2] = xz2 + yw2;\n\t\ttarget[4] = xy2 + zw2;\n\t\ttarget[5] = -xx + yy - zz + ww;\n\t\ttarget[6] = yz2 - xw2;\n\t\ttarget[8] = xz2 - yw2;\n\t\ttarget[9] = yz2 + xw2;\n\t\ttarget[10] = -xx - yy + zz + ww;\n\t\ttarget[3] = target[7] = target[11] = 0;\n\n\t\tif (!exclude4thRow) {\n\t\t\ttarget[12] = target[13] = target[14] = 0;\n\t\t\ttarget[15] = 1;\n\t\t}\n\t}\n\n\t/**\n\t * Clones the quaternion.\n\t * @return An exact duplicate of the current Quaternion.\n\t */\n\tpublic clone():Quaternion\n\t{\n\t\treturn new Quaternion(this.x, this.y, this.z, this.w);\n\t}\n\n\t/**\n\t * Rotates a point.\n\t * @param vector The Vector3D object to be rotated.\n\t * @param target An optional Vector3D object that will contain the rotated coordinates. If not provided, a new object will be created.\n\t * @return A Vector3D object containing the rotated point.\n\t */\n\tpublic rotatePoint(vector:Vector3D, target:Vector3D = null):Vector3D\n\t{\n\t\tvar x1:number, y1:number, z1:number, w1:number;\n\t\tvar x2:number = vector.x, y2:number = vector.y, z2:number = vector.z;\n\n\t\t//target ||= new Vector3D();\n\t\tif (target === null) {\n\n\t\t\ttarget = new Vector3D();\n\n\t\t}\n\n\t\t// p*q'\n\t\tw1 = -this.x*x2 - this.y*y2 - this.z*z2;\n\t\tx1 = this.w*x2 + this.y*z2 - this.z*y2;\n\t\ty1 = this.w*y2 - this.x*z2 + this.z*x2;\n\t\tz1 = this.w*z2 + this.x*y2 - this.y*x2;\n\n\t\ttarget.x = -w1*this.x + x1*this.w - y1*this.z + z1*this.y;\n\t\ttarget.y = -w1*this.y + x1*this.z + y1*this.w - z1*this.x;\n\t\ttarget.z = -w1*this.z - x1*this.y + y1*this.x + z1*this.w;\n\n\t\treturn target;\n\t}\n\n\t/**\n\t * Copies the data from a quaternion into this instance.\n\t * @param q The quaternion to copy from.\n\t */\n\tpublic copyFrom(q:Quaternion)\n\t{\n\t\tthis.x = q.x;\n\t\tthis.y = q.y;\n\t\tthis.z = q.z;\n\t\tthis.w = q.w;\n\t}\n}\n\nexport = Quaternion;", + "import Point\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\n\n/**\n * A Rectangle object is an area defined by its position, as indicated by its\n * top-left corner point(x, y) and by its width and its height.\n *\n *\n *

The x, y, width, and\n * height properties of the Rectangle class are independent of\n * each other; changing the value of one property has no effect on the others.\n * However, the right and bottom properties are\n * integrally related to those four properties. For example, if you change the\n * value of the right property, the value of the\n * width property changes; if you change the bottom\n * property, the value of the height property changes.

\n *\n *

The following methods and properties use Rectangle objects:

\n *\n *
    \n *
  • The applyFilter(), colorTransform(),\n * copyChannel(), copyPixels(), draw(),\n * fillRect(), generateFilterRect(),\n * getColorBoundsRect(), getPixels(),\n * merge(), paletteMap(),\n * pixelDisolve(), setPixels(), and\n * threshold() methods, and the rect property of the\n * BitmapData class
  • \n *
  • The getBounds() and getRect() methods, and\n * the scrollRect and scale9Grid properties of the\n * DisplayObject class
  • \n *
  • The getCharBoundaries() method of the TextField\n * class
  • \n *
  • The pixelBounds property of the Transform class
  • \n *
  • The bounds parameter for the startDrag()\n * method of the Sprite class
  • \n *
  • The printArea parameter of the addPage()\n * method of the PrintJob class
  • \n *
\n *\n *

You can use the new Rectangle() constructor to create a\n * Rectangle object.

\n *\n *

Note: The Rectangle class does not define a rectangular Shape\n * display object. To draw a rectangular Shape object onscreen, use the\n * drawRect() method of the Graphics class.

\n */\nclass Rectangle\n{\n\tprivate _size:Point;\n\tprivate _bottomRight:Point;\n\tprivate _topLeft:Point;\n\n\t/**\n\t * The height of the rectangle, in pixels. Changing the height\n\t * value of a Rectangle object has no effect on the x,\n\t * y, and width properties.\n\t */\n\tpublic height:number;\n\n\t/**\n\t * The width of the rectangle, in pixels. Changing the width\n\t * value of a Rectangle object has no effect on the x,\n\t * y, and height properties.\n\t */\n\tpublic width:number;\n\n\t/**\n\t * The x coordinate of the top-left corner of the rectangle. Changing\n\t * the value of the x property of a Rectangle object has no\n\t * effect on the y, width, and height\n\t * properties.\n\t *\n\t *

The value of the x property is equal to the value of the\n\t * left property.

\n\t */\n\tpublic x:number;\n\n\t/**\n\t * The y coordinate of the top-left corner of the rectangle. Changing\n\t * the value of the y property of a Rectangle object has no\n\t * effect on the x, width, and height\n\t * properties.\n\t *\n\t *

The value of the y property is equal to the value of the\n\t * top property.

\n\t */\n\tpublic y:number;\n\n\t/**\n\t * The sum of the y and height properties.\n\t */\n\tpublic get bottom():number\n\t{\n\t\treturn this.y + this.height;\n\t}\n\n\t/**\n\t * The location of the Rectangle object's bottom-right corner, determined by\n\t * the values of the right and bottom properties.\n\t */\n\tpublic get bottomRight():Point\n\t{\n\t\tif (this._bottomRight == null)\n\t\t\tthis._bottomRight = new Point();\n\n\t\tthis._bottomRight.x = this.x + this.width;\n\t\tthis._bottomRight.y = this.y + this.height;\n\n\t\treturn this._bottomRight;\n\t}\n\n\t/**\n\t * The x coordinate of the top-left corner of the rectangle. Changing\n\t * the left property of a Rectangle object has no effect on the\n\t * y and height properties. However it does affect\n\t * the width property, whereas changing the x value\n\t * does not affect the width property.\n\t *\n\t *

The value of the left property is equal to the value of\n\t * the x property.

\n\t */\n\tpublic get left():number\n\t{\n\t\treturn this.x;\n\t}\n\n\t/**\n\t * The sum of the x and width properties.\n\t */\n\tpublic get right():number\n\t{\n\t\treturn this.x + this.width;\n\t}\n\n\t/**\n\t * The size of the Rectangle object, expressed as a Point object with the\n\t * values of the width and height properties.\n\t */\n\tpublic get size():Point\n\t{\n\t\tif (this._size == null)\n\t\t\tthis._size = new Point();\n\n\t\tthis._size.x = this.width;\n\t\tthis._size.y = this.height;\n\n\t\treturn this._size;\n\t}\n\n\t/**\n\t * The y coordinate of the top-left corner of the rectangle. Changing\n\t * the top property of a Rectangle object has no effect on the\n\t * x and width properties. However it does affect\n\t * the height property, whereas changing the y\n\t * value does not affect the height property.\n\t *\n\t *

The value of the top property is equal to the value of the\n\t * y property.

\n\t */\n\tpublic get top():number\n\t{\n\t\treturn this.y;\n\t}\n\n\t/**\n\t * The location of the Rectangle object's top-left corner, determined by the\n\t * x and y coordinates of the point.\n\t */\n\tpublic get topLeft():Point\n\t{\n\t\tif (this._topLeft == null)\n\t\t\tthis._topLeft = new Point();\n\n\t\tthis._topLeft.x = this.x;\n\t\tthis._topLeft.y = this.y;\n\n\t\treturn this._topLeft;\n\t}\n\n\t/**\n\t * Creates a new Rectangle object with the top-left corner specified by the\n\t * x and y parameters and with the specified\n\t * width and height parameters. If you call this\n\t * public without parameters, a rectangle with x,\n\t * y, width, and height properties set\n\t * to 0 is created.\n\t *\n\t * @param x The x coordinate of the top-left corner of the\n\t * rectangle.\n\t * @param y The y coordinate of the top-left corner of the\n\t * rectangle.\n\t * @param width The width of the rectangle, in pixels.\n\t * @param height The height of the rectangle, in pixels.\n\t */\n\tconstructor(x:number = 0, y:number = 0, width:number = 0, height:number = 0)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t}\n\n\t/**\n\t * Returns a new Rectangle object with the same values for the\n\t * x, y, width, and\n\t * height properties as the original Rectangle object.\n\t *\n\t * @return A new Rectangle object with the same values for the\n\t * x, y, width, and\n\t * height properties as the original Rectangle object.\n\t */\n\tpublic clone():Rectangle\n\t{\n\t\treturn new Rectangle(this.x, this.y, this.width, this.height);\n\t}\n\n\t/**\n\t * Determines whether the specified point is contained within the rectangular\n\t * region defined by this Rectangle object.\n\t *\n\t * @param x The x coordinate(horizontal position) of the point.\n\t * @param y The y coordinate(vertical position) of the point.\n\t * @return A value of true if the Rectangle object contains the\n\t * specified point; otherwise false.\n\t */\n\tpublic contains(x:number, y:number):boolean\n\t{\n\t\treturn (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y);\n\t}\n\n\t/**\n\t * Determines whether the specified point is contained within the rectangular\n\t * region defined by this Rectangle object. This method is similar to the\n\t * Rectangle.contains() method, except that it takes a Point\n\t * object as a parameter.\n\t *\n\t * @param point The point, as represented by its x and y\n\t * coordinates.\n\t * @return A value of true if the Rectangle object contains the\n\t * specified point; otherwise false.\n\t */\n\tpublic containsPoint(point:Point):boolean\n\t{\n\t\treturn (this.x <= point.x && this.x + this.width >= point.x && this.y <= point.y && this.y + this.height >= point.y);\n\t}\n\n\t/**\n\t * Determines whether the Rectangle object specified by the rect\n\t * parameter is contained within this Rectangle object. A Rectangle object is\n\t * said to contain another if the second Rectangle object falls entirely\n\t * within the boundaries of the first.\n\t *\n\t * @param rect The Rectangle object being checked.\n\t * @return A value of true if the Rectangle object that you\n\t * specify is contained by this Rectangle object; otherwise\n\t * false.\n\t */\n\tpublic containsRect(rect:Rectangle):boolean\n\t{\n\t\treturn (this.x <= rect.x && this.x + this.width >= rect.x + rect.width && this.y <= rect.y && this.y + this.height >= rect.y + rect.height)\n\t}\n\n\t/**\n\t * Copies all of rectangle data from the source Rectangle object into the\n\t * calling Rectangle object.\n\t *\n\t * @param sourceRect The Rectangle object from which to copy the data.\n\t */\n\tpublic copyFrom(sourceRect:Rectangle)\n\t{\n\n\t}\n\n\t/**\n\t * Determines whether the object specified in the toCompare\n\t * parameter is equal to this Rectangle object. This method compares the\n\t * x, y, width, and\n\t * height properties of an object against the same properties of\n\t * this Rectangle object.\n\t *\n\t * @param toCompare The rectangle to compare to this Rectangle object.\n\t * @return A value of true if the object has exactly the same\n\t * values for the x, y, width,\n\t * and height properties as this Rectangle object;\n\t * otherwise false.\n\t */\n\tpublic equals(toCompare:Rectangle):boolean\n\t{\n\t\treturn (this.x == toCompare.x && this.y == toCompare.y && this.width == toCompare.width && this.height == toCompare.height)\n\t}\n\n\t/**\n\t * Increases the size of the Rectangle object by the specified amounts, in\n\t * pixels. The center point of the Rectangle object stays the same, and its\n\t * size increases to the left and right by the dx value, and to\n\t * the top and the bottom by the dy value.\n\t *\n\t * @param dx The value to be added to the left and the right of the Rectangle\n\t * object. The following equation is used to calculate the new\n\t * width and position of the rectangle:\n\t * @param dy The value to be added to the top and the bottom of the\n\t * Rectangle. The following equation is used to calculate the new\n\t * height and position of the rectangle:\n\t */\n\tpublic inflate(dx:number, dy:number)\n\t{\n\t\tthis.x -= dx/2;\n\t\tthis.y -= dy/2;\n\t\tthis.width += dx/2;\n\t\tthis.height += dy/2;\n\t}\n\n\t/**\n\t * Increases the size of the Rectangle object. This method is similar to the\n\t * Rectangle.inflate() method except it takes a Point object as\n\t * a parameter.\n\t *\n\t *

The following two code examples give the same result:

\n\t *\n\t * @param point The x property of this Point object is used to\n\t * increase the horizontal dimension of the Rectangle object.\n\t * The y property is used to increase the vertical\n\t * dimension of the Rectangle object.\n\t */\n\tpublic inflatePoint(point:Point)\n\t{\n\t\tthis.x -= point.x/2;\n\t\tthis.y -= point.y/2;\n\t\tthis.width += point.x/2;\n\t\tthis.height += point.y/2;\n\t}\n\n\t/**\n\t * If the Rectangle object specified in the toIntersect\n\t * parameter intersects with this Rectangle object, returns the area of\n\t * intersection as a Rectangle object. If the rectangles do not intersect,\n\t * this method returns an empty Rectangle object with its properties set to\n\t * 0.\n\t *\n\t * @param toIntersect The Rectangle object to compare against to see if it\n\t * intersects with this Rectangle object.\n\t * @return A Rectangle object that equals the area of intersection. If the\n\t * rectangles do not intersect, this method returns an empty\n\t * Rectangle object; that is, a rectangle with its x,\n\t * y, width, and height\n\t * properties set to 0.\n\t */\n\tpublic intersection(toIntersect:Rectangle):Rectangle\n\t{\n\t\tif (this.intersects(toIntersect)) {\n\t\t\tvar i:Rectangle = new Rectangle();\n\n\t\t\tif (this.x > toIntersect.x) {\n\t\t\t\ti.x = this.x;\n\t\t\t\ti.width = toIntersect.x - this.x + toIntersect.width;\n\n\t\t\t\tif (i.width > this.width)\n\t\t\t\t\ti.width = this.width;\n\t\t\t} else {\n\t\t\t\ti.x = toIntersect.x;\n\t\t\t\ti.width = this.x - toIntersect.x + this.width;\n\n\t\t\t\tif (i.width > toIntersect.width)\n\t\t\t\t\ti.width = toIntersect.width;\n\t\t\t}\n\n\t\t\tif (this.y > toIntersect.y) {\n\t\t\t\ti.y = this.y;\n\t\t\t\ti.height = toIntersect.y - this.y + toIntersect.height;\n\n\t\t\t\tif (i.height > this.height)\n\t\t\t\t\ti.height = this.height;\n\t\t\t} else {\n\t\t\t\ti.y = toIntersect.y;\n\t\t\t\ti.height = this.y - toIntersect.y + this.height;\n\n\t\t\t\tif (i.height > toIntersect.height)\n\t\t\t\t\ti.height = toIntersect.height;\n\t\t\t}\n\n\t\t\treturn i;\n\t\t}\n\n\t\treturn new Rectangle();\n\t}\n\n\t/**\n\t * Determines whether the object specified in the toIntersect\n\t * parameter intersects with this Rectangle object. This method checks the\n\t * x, y, width, and\n\t * height properties of the specified Rectangle object to see if\n\t * it intersects with this Rectangle object.\n\t *\n\t * @param toIntersect The Rectangle object to compare against this Rectangle\n\t * object.\n\t * @return A value of true if the specified object intersects\n\t * with this Rectangle object; otherwise false.\n\t */\n\tpublic intersects(toIntersect:Rectangle):boolean\n\t{\n\t\treturn (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height);\n\t}\n\n\t/**\n\t * Determines whether or not this Rectangle object is empty.\n\t *\n\t * @return A value of true if the Rectangle object's width or\n\t * height is less than or equal to 0; otherwise false.\n\t */\n\tpublic isEmpty():boolean\n\t{\n\t\treturn (this.x == 0 && this.y == 0 && this.width == 0 && this.height == 0);\n\t}\n\n\t/**\n\t * Adjusts the location of the Rectangle object, as determined by its\n\t * top-left corner, by the specified amounts.\n\t *\n\t * @param dx Moves the x value of the Rectangle object by this amount.\n\t * @param dy Moves the y value of the Rectangle object by this amount.\n\t */\n\tpublic offset(dx:number, dy:number)\n\t{\n\t\tthis.x += dx;\n\t\tthis.y += dy;\n\t}\n\n\t/**\n\t * Adjusts the location of the Rectangle object using a Point object as a\n\t * parameter. This method is similar to the Rectangle.offset()\n\t * method, except that it takes a Point object as a parameter.\n\t *\n\t * @param point A Point object to use to offset this Rectangle object.\n\t */\n\tpublic offsetPoint(point:Point)\n\t{\n\t\tthis.x += point.x;\n\t\tthis.y += point.y;\n\t}\n\n\t/**\n\t * Sets all of the Rectangle object's properties to 0. A Rectangle object is\n\t * empty if its width or height is less than or equal to 0.\n\t *\n\t *

This method sets the values of the x, y,\n\t * width, and height properties to 0.

\n\t *\n\t */\n\tpublic setEmpty()\n\t{\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.width = 0;\n\t\tthis.height = 0;\n\t}\n\n\t/**\n\t * Sets the members of Rectangle to the specified values\n\t *\n\t * @param xa The x coordinate of the top-left corner of the\n\t * rectangle.\n\t * @param ya The y coordinate of the top-left corner of the\n\t * rectangle.\n\t * @param widtha The width of the rectangle, in pixels.\n\t * @param heighta The height of the rectangle, in pixels.\n\t */\n\tpublic setTo(xa:number, ya:number, widtha:number, heighta:number)\n\t{\n\t\tthis.x = xa;\n\t\tthis.y = ya;\n\t\tthis.width = widtha;\n\t\tthis.height = heighta;\n\t}\n\n\t/**\n\t * Builds and returns a string that lists the horizontal and vertical\n\t * positions and the width and height of the Rectangle object.\n\t *\n\t * @return A string listing the value of each of the following properties of\n\t * the Rectangle object: x, y,\n\t * width, and height.\n\t */\n\tpublic toString():string\n\t{\n\t\treturn \"[Rectangle] (x=\" + this.x + \", y=\" + this.y + \", width=\" + this.width + \", height=\" + this.height + \")\";\n\t}\n\n\t/**\n\t * Adds two rectangles together to create a new Rectangle object, by filling\n\t * in the horizontal and vertical space between the two rectangles.\n\t *\n\t *

Note: The union() method ignores rectangles with\n\t * 0 as the height or width value, such as: var\n\t * rect2:Rectangle = new Rectangle(300,300,50,0);

\n\t *\n\t * @param toUnion A Rectangle object to add to this Rectangle object.\n\t * @return A new Rectangle object that is the union of the two rectangles.\n\t */\n\tpublic union(toUnion:Rectangle):Rectangle\n\t{\n\t\tvar u:Rectangle = new Rectangle();\n\n\t\tif (this.x < toUnion.x) {\n\t\t\tu.x = this.x;\n\t\t\tu.width = toUnion.x - this.x + toUnion.width;\n\n\t\t\tif (u.width < this.width)\n\t\t\t\tu.width = this.width;\n\t\t} else {\n\t\t\tu.x = toUnion.x;\n\t\t\tu.width = this.x - toUnion.x + this.width;\n\n\t\t\tif (u.width < toUnion.width)\n\t\t\t\tu.width = toUnion.width;\n\t\t}\n\n\t\tif (this.y < toUnion.y) {\n\t\t\tu.y = this.y;\n\t\t\tu.height = toUnion.y - this.y + toUnion.height;\n\n\t\t\tif (u.height < this.height)\n\t\t\t\tu.height = this.height;\n\t\t} else {\n\t\t\tu.y = toUnion.y;\n\t\t\tu.height = this.y - toUnion.y + this.height;\n\n\t\t\tif (u.height < toUnion.height)\n\t\t\t\tu.height = toUnion.height;\n\t\t}\n\n\t\treturn u;\n\t}\n}\n\nexport = Rectangle;", + "import DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport ColorTransform\t\t\t= require(\"awayjs-core/lib/core/geom/ColorTransform\");\nimport Matrix\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Matrix3DUtils\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3DUtils\");\nimport Rectangle\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport PerspectiveProjection\t= require(\"awayjs-core/lib/projections/PerspectiveProjection\");\n\n/**\n * The Transform class provides access to color adjustment properties and two-\n * or three-dimensional transformation objects that can be applied to a\n * display object. During the transformation, the color or the orientation and\n * position of a display object is adjusted(offset) from the current values\n * or coordinates to new values or coordinates. The Transform class also\n * collects data about color and two-dimensional matrix transformations that\n * are applied to a display object and all of its parent objects. You can\n * access these combined transformations through the\n * concatenatedColorTransform and concatenatedMatrix\n * properties.\n *\n *

To apply color transformations: create a ColorTransform object, set the\n * color adjustments using the object's methods and properties, and then\n * assign the colorTransformation property of the\n * transform property of the display object to the new\n * ColorTransformation object.

\n *\n *

To apply two-dimensional transformations: create a Matrix object, set\n * the matrix's two-dimensional transformation, and then assign the\n * transform.matrix property of the display object to the new\n * Matrix object.

\n *\n *

To apply three-dimensional transformations: start with a\n * three-dimensional display object. A three-dimensional display object has a\n * z property value other than zero. You do not need to create\n * the Matrix3D object. For all three-dimensional objects, a Matrix3D object\n * is created automatically when you assign a z value to a\n * display object. You can access the display object's Matrix3D object through\n * the display object's transform property. Using the methods of\n * the Matrix3D class, you can add to or modify the existing transformation\n * settings. Also, you can create a custom Matrix3D object, set the custom\n * Matrix3D object's transformation elements, and then assign the new Matrix3D\n * object to the display object using the transform.matrix\n * property.

\n *\n *

To modify a perspective projection of the stage or root object: use the\n * transform.matrix property of the root display object to gain\n * access to the PerspectiveProjection object. Or, apply different perspective\n * projection properties to a display object by setting the perspective\n * projection properties of the display object's parent. The child display\n * object inherits the new properties. Specifically, create a\n * PerspectiveProjection object and set its properties, then assign the\n * PerspectiveProjection object to the perspectiveProjection\n * property of the parent display object's transform property.\n * The specified projection transformation then applies to all the display\n * object's three-dimensional children.

\n *\n *

Since both PerspectiveProjection and Matrix3D objects perform\n * perspective transformations, do not assign both to a display object at the\n * same time. Use the PerspectiveProjection object for focal length and\n * projection center changes. For more control over the perspective\n * transformation, create a perspective projection Matrix3D object.

\n */\nclass Transform\n{\n\tprivate _displayObject:DisplayObject;\n\tprivate _concatenatedColorTransform:ColorTransform;\n\tprivate _concatenatedMatrix:Matrix;\n\tprivate _pixelBounds:Rectangle;\n\tpublic _position:Vector3D = new Vector3D();\n\n\t/**\n\t *\n\t */\n\tpublic get backVector():Vector3D\n\t{\n\t\tvar director:Vector3D = Matrix3DUtils.getForward(this._displayObject._iMatrix3D);\n\t\tdirector.negate();\n\n\t\treturn director;\n\t}\n\n\t/**\n\t * A ColorTransform object containing values that universally adjust the\n\t * colors in the display object.\n\t * \n\t * @throws TypeError The colorTransform is null when being set\n\t */\n\tpublic colorTransform:ColorTransform;\n\n\t/**\n\t * A ColorTransform object representing the combined color transformations\n\t * applied to the display object and all of its parent objects, back to the\n\t * root level. If different color transformations have been applied at\n\t * different levels, all of those transformations are concatenated into one\n\t * ColorTransform object for this property.\n\t */\n\tpublic get concatenatedColorTransform():ColorTransform\n\t{\n\t\treturn this._concatenatedColorTransform; //TODO\n\t}\n\n\t/**\n\t * A Matrix object representing the combined transformation matrixes of the\n\t * display object and all of its parent objects, back to the root level. If\n\t * different transformation matrixes have been applied at different levels,\n\t * all of those matrixes are concatenated into one matrix for this property.\n\t * Also, for resizeable SWF content running in the browser, this property\n\t * factors in the difference between stage coordinates and window coordinates\n\t * due to window resizing. Thus, the property converts local coordinates to\n\t * window coordinates, which may not be the same coordinate space as that of\n\t * the Stage.\n\t */\n\tpublic get concatenatedMatrix():Matrix\n\t{\n\t\treturn this._concatenatedMatrix; //TODO\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get downVector():Vector3D\n\t{\n\t\tvar director:Vector3D = Matrix3DUtils.getUp(this._displayObject._iMatrix3D);\n\t\tdirector.negate();\n\n\t\treturn director;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get forwardVector():Vector3D\n\t{\n\t\treturn Matrix3DUtils.getForward(this._displayObject._iMatrix3D);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get leftVector():Vector3D\n\t{\n\t\tvar director:Vector3D = Matrix3DUtils.getRight(this._displayObject._iMatrix3D);\n\t\tdirector.negate();\n\n\t\treturn director;\n\t}\n\n\t/**\n\t * A Matrix object containing values that alter the scaling, rotation, and\n\t * translation of the display object.\n\t *\n\t *

If the matrix property is set to a value(not\n\t * null), the matrix3D property is\n\t * null. And if the matrix3D property is set to a\n\t * value(not null), the matrix property is\n\t * null.

\n\t * \n\t * @throws TypeError The matrix is null when being set\n\t */\n\tpublic matrix:Matrix;\n\n\t/**\n\t * Provides access to the Matrix3D object of a three-dimensional display\n\t * object. The Matrix3D object represents a transformation matrix that\n\t * determines the display object's position and orientation. A Matrix3D\n\t * object can also perform perspective projection.\n\t *\n\t *

If the matrix property is set to a value(not\n\t * null), the matrix3D property is\n\t * null. And if the matrix3D property is set to a\n\t * value(not null), the matrix property is\n\t * null.

\n\t */\n\tpublic get matrix3D():Matrix3D\n\t{\n\t\treturn this._displayObject._iMatrix3D;\n\t}\n\n\tpublic set matrix3D(val:Matrix3D)\n\t{\n\t\tthis._displayObject._iMatrix3D = val;\n\t}\n\n\t/**\n\t * Provides access to the PerspectiveProjection object of a three-dimensional\n\t * display object. The PerspectiveProjection object can be used to modify the\n\t * perspective transformation of the stage or to assign a perspective\n\t * transformation to all the three-dimensional children of a display object.\n\t *\n\t *

Based on the field of view and aspect ratio(dimensions) of the stage,\n\t * a default PerspectiveProjection object is assigned to the root object.

\n\t */\n\tpublic perspectiveProjection:PerspectiveProjection;\n\n\t/**\n\t * A Rectangle object that defines the bounding rectangle of the display\n\t * object on the stage.\n\t */\n\tpublic get pixelBounds():Rectangle\n\t{\n\t\treturn this._pixelBounds;\n\t}\n\n\t/**\n\t * Defines the position of the 3d object, relative to the local coordinates of the parent ObjectContainer3D.\n\t */\n\tpublic get position():Vector3D\n\t{\n\t\treturn this._displayObject._iMatrix3D.position\n\t}\n\n\tpublic set position(value:Vector3D)\n\t{\n\t\tthis._displayObject.x = value.x;\n\t\tthis._displayObject.y = value.y;\n\t\tthis._displayObject.z = value.z;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get rightVector():Vector3D\n\t{\n\t\treturn Matrix3DUtils.getRight(this._displayObject._iMatrix3D);\n\t}\n\n\t/**\n\t * Defines the rotation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D.\n\t */\n\tpublic get rotation():Vector3D\n\t{\n\t\treturn new Vector3D(this._displayObject.rotationX, this._displayObject.rotationY, this._displayObject.rotationZ);\n\t}\n\n\tpublic set rotation(value:Vector3D)\n\t{\n\t\tthis._displayObject.rotationX = value.x;\n\t\tthis._displayObject.rotationY = value.y;\n\t\tthis._displayObject.rotationZ = value.z;\n\t}\n\n\t/**\n\t * Defines the scale of the 3d object, relative to the local coordinates of the parent ObjectContainer3D.\n\t */\n\tpublic get scale():Vector3D\n\t{\n\t\treturn new Vector3D(this._displayObject.scaleX, this._displayObject.scaleY, this._displayObject.scaleZ);\n\t}\n\n\tpublic set scale(value:Vector3D)\n\t{\n\t\tthis._displayObject.scaleX = value.x;\n\t\tthis._displayObject.scaleY = value.y;\n\t\tthis._displayObject.scaleZ = value.z;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get upVector():Vector3D\n\t{\n\t\treturn Matrix3DUtils.getUp(this._displayObject._iMatrix3D);\n\t}\n\n\tconstructor(displayObject:DisplayObject)\n\t{\n\t\tthis._displayObject = displayObject;\n\t}\n\n\t/**\n\t * Returns a Matrix3D object, which can transform the space of a specified\n\t * display object in relation to the current display object's space. You can\n\t * use the getRelativeMatrix3D() method to move one\n\t * three-dimensional display object relative to another three-dimensional\n\t * display object.\n\t * \n\t * @param relativeTo The display object relative to which the transformation\n\t * occurs. To get a Matrix3D object relative to the stage,\n\t * set the parameter to the root or\n\t * stage object. To get the world-relative\n\t * matrix of the display object, set the parameter to a\n\t * display object that has a perspective transformation\n\t * applied to it.\n\t * @return A Matrix3D object that can be used to transform the space from the\n\t * relativeTo display object to the current display\n\t * object space.\n\t */\n\tpublic getRelativeMatrix3D(relativeTo:DisplayObject):Matrix3D\n\t{\n\t\treturn new Matrix3D(); //TODO\n\t}\n\n\n\t/**\n\t * Moves the 3d object forwards along it's local z axis\n\t *\n\t * @param distance The length of the movement\n\t */\n\tpublic moveForward(distance:number)\n\t{\n\t\tthis._displayObject.translateLocal(Vector3D.Z_AXIS, distance);\n\t}\n\n\t/**\n\t * Moves the 3d object backwards along it's local z axis\n\t *\n\t * @param distance The length of the movement\n\t */\n\tpublic moveBackward(distance:number)\n\t{\n\t\tthis._displayObject.translateLocal(Vector3D.Z_AXIS, -distance);\n\t}\n\n\t/**\n\t * Moves the 3d object backwards along it's local x axis\n\t *\n\t * @param distance The length of the movement\n\t */\n\n\tpublic moveLeft(distance:number)\n\t{\n\t\tthis._displayObject.translateLocal(Vector3D.X_AXIS, -distance);\n\t}\n\n\t/**\n\t * Moves the 3d object forwards along it's local x axis\n\t *\n\t * @param distance The length of the movement\n\t */\n\tpublic moveRight(distance:number)\n\t{\n\t\tthis._displayObject.translateLocal(Vector3D.X_AXIS, distance);\n\t}\n\n\t/**\n\t * Moves the 3d object forwards along it's local y axis\n\t *\n\t * @param distance The length of the movement\n\t */\n\tpublic moveUp(distance:number)\n\t{\n\t\tthis._displayObject.translateLocal(Vector3D.Y_AXIS, distance);\n\t}\n\n\t/**\n\t * Moves the 3d object backwards along it's local y axis\n\t *\n\t * @param distance The length of the movement\n\t */\n\tpublic moveDown(distance:number)\n\t{\n\t\tthis._displayObject.translateLocal(Vector3D.Y_AXIS, -distance);\n\t}\n}\n\nexport = Transform;\n", + "import Matrix\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix\");\n\nclass UVTransform\n{\n\tprivate _uvMatrix:Matrix = new Matrix();\n\tprivate _uvMatrixDirty:boolean;\n\n\tprivate _rotation:number = 0;\n\tprivate _scaleU:number = 1;\n\tprivate _scaleV:number = 1;\n\tprivate _offsetU:number = 0;\n\tprivate _offsetV:number = 0;\n\n\t/**\n\t *\n\t */\n\tpublic get offsetU():number\n\t{\n\t\treturn this._offsetU;\n\t}\n\n\tpublic set offsetU(value:number)\n\t{\n\t\tif (value == this._offsetU)\n\t\t\treturn;\n\n\t\tthis._offsetU = value;\n\t\tthis._uvMatrixDirty = true;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get offsetV():number\n\t{\n\t\treturn this._offsetV;\n\t}\n\n\tpublic set offsetV(value:number)\n\t{\n\t\tif (value == this._offsetV)\n\t\t\treturn;\n\n\t\tthis._offsetV = value;\n\t\tthis._uvMatrixDirty = true;\n\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get rotation():number\n\t{\n\t\treturn this._rotation;\n\t}\n\n\tpublic set rotation(value:number)\n\t{\n\t\tif (value == this._rotation)\n\t\t\treturn;\n\n\t\tthis._rotation = value;\n\n\t\tthis._uvMatrixDirty = true;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get scaleU():number\n\t{\n\t\treturn this._scaleU;\n\t}\n\n\tpublic set scaleU(value:number)\n\t{\n\t\tif (value == this._scaleU)\n\t\t\treturn;\n\n\t\tthis._scaleU = value;\n\n\t\tthis._uvMatrixDirty = true;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get scaleV():number\n\t{\n\t\treturn this._scaleV;\n\t}\n\n\tpublic set scaleV(value:number)\n\t{\n\t\tif (value == this._scaleV)\n\t\t\treturn;\n\n\t\tthis._scaleV = value;\n\n\t\tthis._uvMatrixDirty = true;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get matrix():Matrix\n\t{\n\t\tif (this._uvMatrixDirty)\n\t\t\tthis.updateUVMatrix();\n\n\t\treturn this._uvMatrix;\n\t}\n\n\tconstructor()\n\t{\n\t}\n\n\n\t/**\n\t * @private\n\t */\n\tprivate updateUVMatrix()\n\t{\n\t\tthis._uvMatrix.identity();\n\n\t\tif (this._rotation != 0)\n\t\t\tthis._uvMatrix.rotate(this._rotation);\n\n\t\tif (this._scaleU != 1 || this._scaleV != 1)\n\t\t\tthis._uvMatrix.scale(this._scaleU, this._scaleV);\n\n\t\tthis._uvMatrix.translate(this._offsetU, this._offsetV);\n\n\t\tthis._uvMatrixDirty = false;\n\t}\n}\n\nexport = UVTransform;", + "/**\n * The Vector3D class represents a point or a location in the three-dimensional\n * space using the Cartesian coordinates x, y, and z. As in a two-dimensional\n * space, the x property represents the horizontal axis and the y property\n * represents the vertical axis. In three-dimensional space, the z property\n * represents depth. The value of the x property increases as the object moves\n * to the right. The value of the y property increases as the object moves\n * down. The z property increases as the object moves farther from the point\n * of view. Using perspective projection and scaling, the object is seen to be\n * bigger when near and smaller when farther away from the screen. As in a\n * right-handed three-dimensional coordinate system, the positive z-axis points\n * away from the viewer and the value of the z property increases as the object\n * moves away from the viewer's eye. The origin point (0,0,0) of the global\n * space is the upper-left corner of the stage.\n *\n *

The Vector3D class can also represent a direction, an arrow pointing from\n * the origin of the coordinates, such as (0,0,0), to an endpoint; or a\n * floating-point component of an RGB (Red, Green, Blue) color model.

\n *\n *

Quaternion notation introduces a fourth element, the w property, which\n * provides additional orientation information. For example, the w property can\n * define an angle of rotation of a Vector3D object. The combination of the\n * angle of rotation and the coordinates x, y, and z can determine the display\n * object's orientation. Here is a representation of Vector3D elements in\n * matrix notation:

\n */\nclass Vector3D\n{\n\t/**\n\t * The x axis defined as a Vector3D object with coordinates (1,0,0).\n\t */\n\tpublic static X_AXIS:Vector3D = new Vector3D(1, 0, 0);\n\n\t/**\n\t * The y axis defined as a Vector3D object with coordinates (0,1,0).\n\t */\n\tpublic static Y_AXIS:Vector3D = new Vector3D(0, 1, 0);\n\n\t/**\n\t * The z axis defined as a Vector3D object with coordinates (0,0,1).\n\t */\n\tpublic static Z_AXIS:Vector3D = new Vector3D(0, 0, 1);\n\n\t/**\n\t * The first element of a Vector3D object, such as the x coordinate of\n\t * a point in the three-dimensional space. The default value is 0.\n\t */\n\tpublic x:number;\n\n\t/*\n\t *The second element of a Vector3D object, such as the y coordinate of\n\t * a point in the three-dimensional space. The default value is 0.\n\t */\n\tpublic y:number;\n\n\t/**\n\t * The third element of a Vector3D object, such as the y coordinate of\n\t * a point in the three-dimensional space. The default value is 0.\n\t */\n\tpublic z:number;\n\n\t/**\n\t * TThe fourth element of a Vector3D object (in addition to the x, y,\n\t * and z properties) can hold data such as the angle of rotation. The\n\t * default value is 0.\n\t *\n\t *

Quaternion notation employs an angle as the fourth element in\n\t * its calculation of three-dimensional rotation. The w property can\n\t * be used to define the angle of rotation about the Vector3D object.\n\t * The combination of the rotation angle and the coordinates (x,y,z)\n\t * determines the display object's orientation.

\n\t *\n\t *

In addition, the w property can be used as a perspective warp\n\t * factor for a projected three-dimensional position or as a projection\n\t * transform value in representing a three-dimensional coordinate\n\t * projected into the two-dimensional space. For example, you can\n\t * create a projection matrix using the Matrix3D.rawData\n\t * property, that, when applied to a Vector3D object, produces a\n\t * transform value in the Vector3D object's fourth element (the w\n\t * property). Dividing the Vector3D object's other elements by the\n\t * transform value then produces a projected Vector3D object. You can\n\t * use the Vector3D.project() method to divide the first\n\t * three elements of a Vector3D object by its fourth element.

\n\t */\n\tpublic w:number;\n\n\t/**\n\t * The length, magnitude, of the current Vector3D object from the\n\t * origin (0,0,0) to the object's x, y, and z coordinates. The w\n\t * property is ignored. A unit vector has a length or magnitude of\n\t * one.\n\t */\n\tpublic get length():number\n\t{\n\t\treturn Math.sqrt(this.lengthSquared);\n\t}\n\n\t/**\n\t * The square of the length of the current Vector3D object, calculated\n\t * using the x, y, and z properties. The w property is ignored. Use the\n\t * lengthSquared() method whenever possible instead of the\n\t * slower Math.sqrt() method call of the\n\t * Vector3D.length() method.\n\t */\n\tpublic get lengthSquared():number\n\t{\n\t\treturn this.x*this.x + this.y*this.y + this.z*this.z;\n\t}\n\n\t/**\n\t * Creates an instance of a Vector3D object. If you do not specify a\n\t * parameter for the constructor, a Vector3D object is created with\n\t * the elements (0,0,0,0).\n\t *\n\t * @param x The first element, such as the x coordinate.\n\t * @param y The second element, such as the y coordinate.\n\t * @param z The third element, such as the z coordinate.\n\t * @param w An optional element for additional data such as the angle\n\t * of rotation.\n\t */\n\tconstructor(x:number = 0, y:number = 0, z:number = 0, w:number = 0)\n\t{\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\t}\n\n\t/**\n\t * Adds the value of the x, y, and z elements of the current Vector3D\n\t * object to the values of the x, y, and z elements of another Vector3D\n\t * object. The add() method does not change the current\n\t * Vector3D object. Instead, it returns a new Vector3D object with\n\t * the new values.\n\t *\n\t *

The result of adding two vectors together is a resultant vector.\n\t * One way to visualize the result is by drawing a vector from the\n\t * origin or tail of the first vector to the end or head of the second\n\t * vector. The resultant vector is the distance between the origin\n\t * point of the first vector and the end point of the second vector.\n\t *

\n\t */\n\tpublic add(a:Vector3D):Vector3D\n\t{\n\t\treturn new Vector3D(this.x + a.x, this.y + a.y, this.z + a.z, this.w + a.w)\n\t}\n\n\t/**\n\t * Returns the angle in radians between two vectors. The returned angle\n\t * is the smallest radian the first Vector3D object rotates until it\n\t * aligns with the second Vector3D object.\n\t *\n\t *

The angleBetween() method is a static method. You\n\t * can use it directly as a method of the Vector3D class.

\n\t *\n\t *

To convert a degree to a radian, you can use the following\n\t * formula:

\n\t *\n\t *

radian = Math.PI/180 * degree

\n\t *\n\t * @param a The first Vector3D object.\n\t * @param b The second Vector3D object.\n\t * @returns The angle between two Vector3D objects.\n\t */\n\tpublic static angleBetween(a:Vector3D, b:Vector3D):number\n\t{\n\t\treturn Math.acos(a.dotProduct(b)/(a.length*b.length));\n\t}\n\n\t/**\n\t * Returns a new Vector3D object that is an exact copy of the current\n\t * Vector3D object.\n\t *\n\t * @returns A new Vector3D object that is a copy of the current\n\t * Vector3D object.\n\t */\n\tpublic clone():Vector3D\n\t{\n\t\treturn new Vector3D(this.x, this.y, this.z, this.w);\n\t}\n\n\t/**\n\t * Copies all of vector data from the source Vector3D object into the\n\t * calling Vector3D object.\n\t *\n\t * @param src The Vector3D object from which to copy the data.\n\t */\n\tpublic copyFrom(src:Vector3D):void\n\t{\n\t\tthis.x = src.x;\n\t\tthis.y = src.y;\n\t\tthis.z = src.z;\n\t\tthis.w = src.w;\n\t}\n\n\t/**\n\t * Returns a new Vector3D object that is perpendicular (at a right\n\t * angle) to the current Vector3D and another Vector3D object. If the\n\t * returned Vector3D object's coordinates are (0,0,0), then the two\n\t * Vector3D objects are parallel to each other.\n\t *\n\t *

You can use the normalized cross product of two vertices of a\n\t * polygon surface with the normalized vector of the camera or eye\n\t * viewpoint to get a dot product. The value of the dot product can\n\t * identify whether a surface of a three-dimensional object is hidden\n\t * from the viewpoint.

\n\t *\n\t * @param a A second Vector3D object.\n\t * @returns A new Vector3D object that is perpendicular to the current\n\t * Vector3D object and the Vector3D object specified as the\n\t * parameter.\n\t */\n\tpublic crossProduct(a:Vector3D):Vector3D\n\t{\n\t\treturn new 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);\n\t}\n\n\t/**\n\t * Decrements the value of the x, y, and z elements of the current\n\t * Vector3D object by the values of the x, y, and z elements of\n\t * specified Vector3D object. Unlike the\n\t * Vector3D.subtract() method, the\n\t * decrementBy() method changes the current Vector3D\n\t * object and does not return a new Vector3D object.\n\t *\n\t * @param a The Vector3D object containing the values to subtract from\n\t * the current Vector3D object.\n\t */\n\tpublic decrementBy(a:Vector3D)\n\t{\n\t\tthis.x -= a.x;\n\t\tthis.y -= a.y;\n\t\tthis.z -= a.z;\n\t}\n\n\t/**\n\t * Returns the distance between two Vector3D objects. The\n\t * distance() method is a static method. You can use it\n\t * directly as a method of the Vector3D class to get the Euclidean\n\t * distance between two three-dimensional points.\n\t *\n\t * @param pt1 A Vector3D object as the first three-dimensional point.\n\t * @param pt2 A Vector3D object as the second three-dimensional point.\n\t * @returns The distance between two Vector3D objects.\n\t */\n\tstatic distance(pt1:Vector3D, pt2:Vector3D):number\n\t{\n\t\tvar x:number = (pt1.x - pt2.x);\n\t\tvar y:number = (pt1.y - pt2.y);\n\t\tvar z:number = (pt1.z - pt2.z);\n\t\treturn Math.sqrt(x*x + y*y + z*z);\n\t}\n\n\t/**\n\t * If the current Vector3D object and the one specified as the\n\t * parameter are unit vertices, this method returns the cosine of the\n\t * angle between the two vertices. Unit vertices are vertices that\n\t * point to the same direction but their length is one. They remove the\n\t * length of the vector as a factor in the result. You can use the\n\t * normalize() method to convert a vector to a unit\n\t * vector.\n\t *\n\t *

The dotProduct() method finds the angle between two\n\t * vertices. It is also used in backface culling or lighting\n\t * calculations. Backface culling is a procedure for determining which\n\t * surfaces are hidden from the viewpoint. You can use the normalized\n\t * vertices from the camera, or eye, viewpoint and the cross product of\n\t * the vertices of a polygon surface to get the dot product. If the dot\n\t * product is less than zero, then the surface is facing the camera or\n\t * the viewer. If the two unit vertices are perpendicular to each\n\t * other, they are orthogonal and the dot product is zero. If the two\n\t * vertices are parallel to each other, the dot product is one.

\n\t *\n\t * @param a The second Vector3D object.\n\t * @returns A scalar which is the dot product of the current Vector3D\n\t * object and the specified Vector3D object.\n\t *\n\t * @see away.geom.Vector3D#crossProduct()\n\t * @see away.geom.Vector3D#normalize()\n\t */\n\tpublic dotProduct(a:Vector3D):number\n\t{\n\t\treturn this.x*a.x + this.y*a.y + this.z*a.z;\n\t}\n\n\t/**\n\t * Determines whether two Vector3D objects are equal by comparing the\n\t * x, y, and z elements of the current Vector3D object with a\n\t * specified Vector3D object. If the values of these elements are the\n\t * same, the two Vector3D objects are equal. If the second optional\n\t * parameter is set to true, all four elements of the Vector3D objects,\n\t * including the w property, are compared.\n\t */\n\n\t/**\n\t *\n\t * @param toCompare The Vector3D object to be compared with the current\n\t * Vector3D object.\n\t * @param allFour An optional parameter that specifies whether the w\n\t * property of the Vector3D objects is used in the\n\t * comparison.\n\t * @returns A value of true if the specified Vector3D object is equal\n\t * to the current Vector3D object; false if it is not equal.\n\t */\n\tpublic equals(toCompare:Vector3D, allFour:boolean = false):boolean\n\t{\n\t\treturn (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && (!allFour || this.w == toCompare.w ));\n\t}\n\n\t/**\n\t * Increments the value of the x, y, and z elements of the current\n\t * Vector3D object by the values of the x, y, and z elements of a\n\t * specified Vector3D object. Unlike the Vector3D.add()\n\t * method, the incrementBy() method changes the current\n\t * Vector3D object and does not return a new Vector3D object.\n\t *\n\t * @param a The Vector3D object to be added to the current Vector3D\n\t * object.\n\t */\n\tpublic incrementBy(a:Vector3D)\n\t{\n\t\tthis.x += a.x;\n\t\tthis.y += a.y;\n\t\tthis.z += a.z;\n\t}\n\n\t/**\n\t * Compares the elements of the current Vector3D object with the\n\t * elements of a specified Vector3D object to determine whether they\n\t * are nearly equal. The two Vector3D objects are nearly equal if the\n\t * value of all the elements of the two vertices are equal, or the\n\t * result of the comparison is within the tolerance range. The\n\t * difference between two elements must be less than the number\n\t * specified as the tolerance parameter. If the third optional\n\t * parameter is set to true, all four elements of the\n\t * Vector3D objects, including the w property, are\n\t * compared. Otherwise, only the x, y, and z elements are included in\n\t * the comparison.\n\t */\n\n\t/**\n\t *\n\t * @param toCompare The Vector3D object to be compared with the current\n\t * Vector3D object.\n\t * @param tolerance A number determining the tolerance factor. If the\n\t * difference between the values of the Vector3D\n\t * element specified in the toCompare parameter and\n\t * the current Vector3D element is less than the\n\t * tolerance number, the two values are considered\n\t * nearly equal.\n\t * @param allFour An optional parameter that specifies whether the w\n\t * property of the Vector3D objects is used in the\n\t * comparison.\n\t * @returns A value of true if the specified Vector3D object is nearly\n\t * equal to the current Vector3D object; false if it is not\n\t * equal.\n\t *\n\t * @see away.geom.Vector3D#equals()\n\t */\n\tpublic nearEquals(toCompare:Vector3D, tolerance:number, allFour:boolean = true):boolean\n\t{\n\t\treturn ((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));\n\t}\n\n\t/**\n\t * Sets the current Vector3D object to its inverse. The inverse object\n\t * is also considered the opposite of the original object. The value of\n\t * the x, y, and z properties of the current Vector3D object is changed\n\t * to -x, -y, and -z.\n\t */\n\tpublic negate():void\n\t{\n\t\tthis.x = -this.x;\n\t\tthis.y = -this.y;\n\t\tthis.z = -this.z;\n\t}\n\n\t/**\n\t * Converts a Vector3D object to a unit vector by dividing the first\n\t * three elements (x, y, z) by the length of the vector. Unit vertices\n\t * are vertices that have a direction but their length is one. They\n\t * simplify vector calculations by removing length as a factor.\n\t */\n\t/**\n\t * Scales the line segment between(0,0) and the current point to a set\n\t * length.\n\t *\n\t * @param thickness The scaling value. For example, if the current\n\t * Vector3D object is (0,3,4), and you normalize it to\n\t * 1, the point returned is at(0,0.6,0.8).\n\t */\n\tpublic normalize(thickness:number = 1)\n\t{\n\t\tif (this.length != 0) {\n\t\t\tvar invLength = thickness/this.length;\n\t\t\tthis.x *= invLength;\n\t\t\tthis.y *= invLength;\n\t\t\tthis.z *= invLength;\n\t\t\treturn;\n\t\t}\n\t}\n\n\t/**\n\t * Divides the value of the x, y, and\n\t * z properties of the current Vector3D object by the\n\t * value of its w property.\n\t *\n\t *

If the current Vector3D object is the result of multiplying a\n\t * Vector3D object by a projection Matrix3D object, the w property can\n\t * hold the transform value. The project() method then can\n\t * complete the projection by dividing the elements by the\n\t * w property. Use the Matrix3D.rawData\n\t * property to create a projection Matrix3D object.

\n\t */\n\tpublic project():void\n\t{\n\t\tthis.x /= this.w;\n\t\tthis.y /= this.w;\n\t\tthis.z /= this.w;\n\t}\n\n\t/**\n\t * Scales the current Vector3D object by a scalar, a magnitude. The\n\t * Vector3D object's x, y, and z elements are multiplied by the scalar\n\t * number specified in the parameter. For example, if the vector is\n\t * scaled by ten, the result is a vector that is ten times longer. The\n\t * scalar can also change the direction of the vector. Multiplying the\n\t * vector by a negative number reverses its direction.\n\t *\n\t * @param s A multiplier (scalar) used to scale a Vector3D object.\n\n\t */\n\tpublic scaleBy(s:number):void\n\t{\n\t\tthis.x *= s;\n\t\tthis.y *= s;\n\t\tthis.z *= s;\n\t}\n\n\t/**\n\t * Sets the members of Vector3D to the specified values\n\t *\n\t * @param xa The first element, such as the x coordinate.\n\t * @param ya The second element, such as the y coordinate.\n\t * @param za The third element, such as the z coordinate.\n\t */\n\tpublic setTo(xa:number, ya:number, za:number):void\n\t{\n\t\tthis.x = xa;\n\t\tthis.y = ya;\n\t\tthis.z = za;\n\t}\n\n\t/**\n\t * Subtracts the value of the x, y, and z elements of the current\n\t * Vector3D object from the values of the x, y, and z elements of\n\t * another Vector3D object. The subtract() method does not\n\t * change the current Vector3D object. Instead, this method returns a\n\t * new Vector3D object with the new values.\n\t *\n\t * @param a The Vector3D object to be subtracted from the current\n\t * Vector3D object.\n\t * @returns A new Vector3D object that is the difference between the\n\t * current Vector3D and the specified Vector3D object.\n\t *\n\t * @see away.geom.Vector3D#decrementBy()\n\t */\n\tpublic subtract(a:Vector3D):Vector3D\n\t{\n\t\treturn new Vector3D(this.x - a.x, this.y - a.y, this.z - a.z);\n\t}\n\n\t/**\n\t * Returns a string representation of the current Vector3D object. The\n\t * string contains the values of the x, y, and z properties.\n\t */\n\tpublic toString():string\n\t{\n\t\treturn \"[Vector3D] (x:\" + this.x + \" ,y:\" + this.y + \", z\" + this.z + \", w:\" + this.w + \")\";\n\t}\n}\n\nexport = Vector3D;", + "import URLRequest\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequest\");\nimport AssetLibrary\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetLibrary\");\nimport AssetLibraryIterator\t\t= require(\"awayjs-core/lib/core/library/AssetLibraryIterator\");\nimport AssetLoader\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoader\");\nimport AssetLoaderToken\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoaderToken\");\nimport AssetLoaderContext\t\t= require(\"awayjs-core/lib/core/library/AssetLoaderContext\");\nimport ConflictPrecedence\t\t= require(\"awayjs-core/lib/core/library/ConflictPrecedence\");\nimport ConflictStrategy\t\t\t= require(\"awayjs-core/lib/core/library/ConflictStrategy\");\nimport ConflictStrategyBase\t\t= require(\"awayjs-core/lib/core/library/ConflictStrategyBase\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport AssetEvent\t\t\t\t= require(\"awayjs-core/lib/events/AssetEvent\");\nimport IOErrorEvent\t\t\t\t= require(\"awayjs-core/lib/events/IOErrorEvent\");\nimport LoaderEvent\t\t\t\t= require(\"awayjs-core/lib/events/LoaderEvent\");\nimport EventDispatcher\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport ParserEvent\t\t\t\t= require(\"awayjs-core/lib/events/ParserEvent\");\nimport ParserBase\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserBase\");\n\n/**\n * AssetLibraryBundle enforces a multiton pattern and is not intended to be instanced directly.\n * Its purpose is to create a container for 3D data management, both before and after parsing.\n * If you are interested in creating multiple library bundles, please use the getInstance() method.\n */\nclass AssetLibraryBundle extends EventDispatcher\n{\n\tpublic static _iInstances:Object = new Object();\n\n\tprivate _loadingSessions:Array;\n\tprivate _strategy:ConflictStrategyBase;\n\tprivate _strategyPreference:string;\n\tprivate _assets:Array;\n\tprivate _assetDictionary:Object;\n\tprivate _assetDictDirty:boolean;\n\tprivate _loadingSessionsGarbage:Array = new Array();\n\tprivate _gcTimeoutIID:number;\n\n\tprivate _onAssetRenameDelegate:(event:AssetEvent) => void;\n\tprivate _onAssetConflictResolvedDelegate:(event:AssetEvent) => void;\n\tprivate _onResourceCompleteDelegate:(event:LoaderEvent) => void;\n\tprivate _onTextureSizeErrorDelegate:(event:AssetEvent) => void;\n\tprivate _onAssetCompleteDelegate:(event:AssetEvent) => void;\n\tprivate _onLoadErrorDelegate:(event:IOErrorEvent) => boolean;\n\tprivate _onParseErrorDelegate:(event:ParserEvent) => boolean;\n\n\t/**\n\t * Creates a new AssetLibraryBundle object.\n\t *\n\t * @param me A multiton enforcer for the AssetLibraryBundle ensuring it cannnot be instanced.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._assets = new Array();//new Vector.;\n\t\tthis._assetDictionary = new Object();\n\t\tthis._loadingSessions = new Array();\n\n\t\tthis.conflictStrategy = ConflictStrategy.IGNORE.create();\n\t\tthis.conflictPrecedence = ConflictPrecedence.FAVOR_NEW;\n\n\t\tthis._onAssetRenameDelegate = (event:AssetEvent) => this.onAssetRename(event);\n\t\tthis._onAssetConflictResolvedDelegate = (event:AssetEvent) => this.onAssetConflictResolved(event);\n\t\tthis._onResourceCompleteDelegate = (event:LoaderEvent) => this.onResourceComplete(event);\n\t\tthis._onTextureSizeErrorDelegate = (event:AssetEvent) => this.onTextureSizeError(event);\n\t\tthis._onAssetCompleteDelegate = (event:AssetEvent) => this.onAssetComplete(event);\n\t\tthis._onLoadErrorDelegate = (event:IOErrorEvent) => this.onLoadError(event);\n\t\tthis._onParseErrorDelegate = (event:ParserEvent) => this.onParseError(event);\n\t}\n\n\t/**\n\t * Returns an AssetLibraryBundle instance. If no key is given, returns the default bundle instance (which is\n\t * similar to using the AssetLibraryBundle as a singleton.) To keep several separated library bundles,\n\t * pass a string key to this method to define which bundle should be returned. This is\n\t * referred to as using the AssetLibrary as a multiton.\n\t *\n\t * @param key Defines which multiton instance should be returned.\n\t * @return An instance of the asset library\n\t */\n\tpublic static getInstance(key:string = 'default'):AssetLibraryBundle\n\t{\n\t\tif (!key)\n\t\t\tkey = 'default';\n\n\t\tif (!AssetLibraryBundle._iInstances.hasOwnProperty(key))\n\t\t\tAssetLibraryBundle._iInstances[key] = new AssetLibraryBundle();\n\n\t\treturn AssetLibraryBundle._iInstances[key];\n\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic enableParser(parserClass:Object)\n\t{\n\t\tAssetLoader.enableParser(parserClass);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic enableParsers(parserClasses:Object[])\n\t{\n\t\tAssetLoader.enableParsers(parserClasses);\n\t}\n\n\t/**\n\t * Defines which strategy should be used for resolving naming conflicts, when two library\n\t * assets are given the same name. By default, ConflictStrategy.APPEND_NUM_SUFFIX\n\t * is used which means that a numeric suffix is appended to one of the assets. The\n\t * conflictPrecedence property defines which of the two conflicting assets will\n\t * be renamed.\n\t *\n\t * @see naming.ConflictStrategy\n\t * @see AssetLibrary.conflictPrecedence\n\t */\n\tpublic get conflictStrategy():ConflictStrategyBase\n\t{\n\t\treturn this._strategy;\n\t}\n\n\tpublic set conflictStrategy(val:ConflictStrategyBase)\n\t{\n\n\t\tif (!val)\n\t\t\tthrow new Error('namingStrategy must not be null. To ignore naming, use AssetLibrary.IGNORE');\n\n\t\tthis._strategy = val.create();\n\n\t}\n\n\t/**\n\t * Defines which asset should have precedence when resolving a naming conflict between\n\t * two assets of which one has just been renamed by the user or by a parser. By default\n\t * ConflictPrecedence.FAVOR_NEW is used, meaning that the newly renamed\n\t * asset will keep it's new name while the older asset gets renamed to not conflict.\n\t *\n\t * This property is ignored for conflict strategies that do not actually rename an\n\t * asset automatically, such as ConflictStrategy.IGNORE and ConflictStrategy.THROW_ERROR.\n\t *\n\t * @see away.library.ConflictPrecedence\n\t * @see away.library.ConflictStrategy\n\t */\n\tpublic get conflictPrecedence():string\n\t{\n\t\treturn this._strategyPreference;\n\t}\n\n\tpublic set conflictPrecedence(val:string)\n\t{\n\t\tthis._strategyPreference = val;\n\t}\n\n\t/**\n\t * Create an AssetLibraryIterator instance that can be used to iterate over the assets\n\t * in this asset library instance. The iterator can filter assets on asset type and/or\n\t * namespace. A \"null\" filter value means no filter of that type is used.\n\t *\n\t * @param assetTypeFilter Asset type to filter on (from the AssetType enum class.) Use\n\t * null to not filter on asset type.\n\t * @param namespaceFilter Namespace to filter on. Use null to not filter on namespace.\n\t * @param filterFunc Callback function to use when deciding whether an asset should be\n\t * included in the iteration or not. This needs to be a function that takes a single\n\t * parameter of type IAsset and returns a boolean where true means it should be included.\n\t *\n\t * @see away.library.AssetType\n\t */\n\tpublic createIterator(assetTypeFilter:string = null, namespaceFilter:string = null, filterFunc = null):AssetLibraryIterator\n\t{\n\t\treturn new AssetLibraryIterator(this._assets, assetTypeFilter, namespaceFilter, filterFunc);\n\t}\n\n\t/**\n\t * Loads a file and (optionally) all of its dependencies.\n\t *\n\t * @param req The URLRequest object containing the URL of the file to be loaded.\n\t * @param context An optional context object providing additional parameters for loading\n\t * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets\n\t * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type.\n\t * @return A handle to the retrieved resource.\n\t */\n\tpublic load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken\n\t{\n\t\tvar loader:AssetLoader = new AssetLoader();\n\n\t\tif (!this._loadingSessions)\n\t\t\tthis._loadingSessions = new Array();\n\n\t\tthis._loadingSessions.push(loader);\n\n\t\tloader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate);\n\t\tloader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate);\n\t\tloader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);\n\n\t\t// Error are handled separately (see documentation for addErrorHandler)\n\t\tloader._iAddErrorHandler(this._onLoadErrorDelegate);\n\t\tloader._iAddParseErrorHandler(this._onParseErrorDelegate);\n\n\t\treturn loader.load(req, context, ns, parser);\n\t}\n\n\t/**\n\t * Loads a resource from existing data in memory.\n\t *\n\t * @param data The data object containing all resource information.\n\t * @param context An optional context object providing additional parameters for loading\n\t * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets\n\t * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type.\n\t * @return A handle to the retrieved resource.\n\t */\n\tpublic loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken\n\t{\n\t\tvar loader:AssetLoader = new AssetLoader();\n\n\t\tif (!this._loadingSessions)\n\t\t\tthis._loadingSessions = new Array();\n\n\t\tthis._loadingSessions.push(loader);\n\n\t\tloader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate);\n\t\tloader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate);\n\t\tloader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);\n\n\t\t// Error are handled separately (see documentation for addErrorHandler)\n\t\tloader._iAddErrorHandler(this._onLoadErrorDelegate);\n\t\tloader._iAddParseErrorHandler(this._onParseErrorDelegate);\n\n\t\treturn loader.loadData(data, '', context, ns, parser);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic getAsset(name:string, ns:string = null):IAsset\n\t{\n\t\t//var asset : IAsset;\n\n\t\tif (this._assetDictDirty)\n\t\t\tthis.rehashAssetDict();\n\n\t\tif (ns == null)\n\t\t\tns = NamedAssetBase.DEFAULT_NAMESPACE;\n\n\t\tif (!this._assetDictionary.hasOwnProperty(ns))\n\t\t\treturn null;\n\n\t\treturn this._assetDictionary[ns][name];\n\n\t}\n\n\t/**\n\t * Adds an asset to the asset library, first making sure that it's name is unique\n\t * using the method defined by the conflictStrategy and\n\t * conflictPrecedence properties.\n\t */\n\tpublic addAsset(asset:IAsset)\n\t{\n\t\tvar ns:string;\n\t\tvar old:IAsset;\n\n\t\t// Bail if asset has already been added.\n\t\tif (this._assets.indexOf(asset) >= 0)\n\t\t\treturn;\n\n\t\told = this.getAsset(asset.name, asset.assetNamespace);\n\t\tns = asset.assetNamespace || NamedAssetBase.DEFAULT_NAMESPACE;\n\n\t\tif (old != null)\n\t\t\tthis._strategy.resolveConflict(asset, old, this._assetDictionary[ns], this._strategyPreference);\n\n\t\t//create unique-id (for now this is used in AwayBuilder only\n\t\t//asset.id = IDUtil.createUID();\n\n\t\t// Add it\n\t\tthis._assets.push(asset);\n\n\t\tif (!this._assetDictionary.hasOwnProperty(ns))\n\t\t\tthis._assetDictionary[ns] = new Object();\n\n\t\tthis._assetDictionary[ns][asset.name] = asset;\n\n\t\tasset.addEventListener(AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate);\n\t\tasset.addEventListener(AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate);\n\t}\n\n\t/**\n\t * Removes an asset from the library, and optionally disposes that asset by calling\n\t * it's disposeAsset() method (which for most assets is implemented as a default\n\t * version of that type's dispose() method.\n\t *\n\t * @param asset The asset which should be removed from this library.\n\t * @param dispose Defines whether the assets should also be disposed.\n\t */\n\tpublic removeAsset(asset:IAsset, dispose:boolean = true)\n\t{\n\t\tvar idx:number;\n\n\t\tthis.removeAssetFromDict(asset);\n\n\t\tasset.removeEventListener(AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate);\n\t\tasset.removeEventListener(AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate);\n\n\t\tidx = this._assets.indexOf(asset);\n\n\t\tif (idx >= 0)\n\t\t\tthis._assets.splice(idx, 1);\n\n\t\tif (dispose)\n\t\t\tasset.dispose();\n\t}\n\n\t/**\n\t * Removes an asset which is specified using name and namespace.\n\t *\n\t * @param name The name of the asset to be removed.\n\t * @param ns The namespace to which the desired asset belongs.\n\t * @param dispose Defines whether the assets should also be disposed.\n\t *\n\t * @see away.library.AssetLibrary.removeAsset()\n\t */\n\tpublic removeAssetByName(name:string, ns:string = null, dispose:boolean = true):IAsset\n\t{\n\n\t\tvar asset:IAsset = this.getAsset(name, ns);\n\n\t\tif (asset)\n\t\t\tthis.removeAsset(asset, dispose);\n\n\t\treturn asset;\n\t}\n\n\t/**\n\t * Removes all assets from the asset library, optionally disposing them as they\n\t * are removed.\n\t *\n\t * @param dispose Defines whether the assets should also be disposed.\n\t */\n\tpublic removeAllAssets(dispose:boolean = true)\n\t{\n\t\tif (dispose) {\n\t\t\tvar asset:IAsset;\n\n\t\t\tfor (var c:number = 0; c < this._assets.length; c++) {\n\t\t\t\tasset = this._assets[ c ];\n\t\t\t\tasset.dispose();\n\t\t\t}\n\t\t\t/*\n\t\t\t for each (asset in _assets)\n\t\t\t asset.dispose();\n\t\t\t */\n\t\t}\n\n\t\tthis._assets.length = 0;\n\t\tthis.rehashAssetDict();\n\t}\n\n\t/**\n\t * Removes all assets belonging to a particular namespace (null for default)\n\t * from the asset library, and optionall disposes them by calling their\n\t * disposeAsset() method.\n\t *\n\t * @param ns The namespace from which all assets should be removed.\n\t * @param dispose Defines whether the assets should also be disposed.\n\t *\n\t * @see away.library.AssetLibrary.removeAsset()\n\t */\n\tpublic removeNamespaceAssets(ns:string = null, dispose:boolean = true)\n\t{\n\t\tvar idx:number = 0;\n\t\tvar asset:IAsset;\n\t\tvar old_assets:IAsset[];\n\n\t\t// Empty the assets vector after having stored a copy of it.\n\t\t// The copy will be filled with all assets which weren't removed.\n\t\told_assets = this._assets.concat();\n\t\tthis._assets.length = 0;\n\n\t\tif (ns == null)\n\t\t\tns = NamedAssetBase.DEFAULT_NAMESPACE;\n\n\t\tfor (var d:number = 0; d < old_assets.length; d++) {\n\t\t\tasset = old_assets[d];\n\n\t\t\t// Remove from dict if in the supplied namespace. If not,\n\t\t\t// transfer over to the new vector.\n\t\t\tif (asset.assetNamespace == ns) {\n\t\t\t\tif (dispose)\n\t\t\t\t\tasset.dispose();\n\n\t\t\t\t// Remove asset from dictionary, but don't try to auto-remove\n\t\t\t\t// the namespace, which will trigger an unnecessarily expensive\n\t\t\t\t// test that is not needed since we know that the namespace\n\t\t\t\t// will be empty when loop finishes.\n\t\t\t\tthis.removeAssetFromDict(asset, false);\n\t\t\t} else {\n\t\t\t\tthis._assets[idx++] = asset;\n\t\t\t}\n\t\t}\n\n\t\t/*\n\t\t for each (asset in old_assets) {\n\t\t // Remove from dict if in the supplied namespace. If not,\n\t\t // transfer over to the new vector.\n\t\t if (asset.assetNamespace == ns) {\n\t\t if (dispose)\n\t\t asset.dispose();\n\n\t\t // Remove asset from dictionary, but don't try to auto-remove\n\t\t // the namespace, which will trigger an unnecessarily expensive\n\t\t // test that is not needed since we know that the namespace\n\t\t // will be empty when loop finishes.\n\t\t removeAssetFromDict(asset, false);\n\t\t } else\n\t\t _assets[idx++] = asset;\n\n\t\t }\n\t\t */\n\n\t\t// Remove empty namespace\n\t\tif (this._assetDictionary.hasOwnProperty(ns))\n\t\t\tdelete this._assetDictionary[ns];\n\t}\n\n\tprivate removeAssetFromDict(asset:IAsset, autoRemoveEmptyNamespace:boolean = true)\n\t{\n\t\tif (this._assetDictDirty)\n\t\t\tthis.rehashAssetDict();\n\n\t\tif (this._assetDictionary.hasOwnProperty(asset.assetNamespace)) {\n\t\t\tif (this._assetDictionary[asset.assetNamespace].hasOwnProperty(asset.name))\n\t\t\t\tdelete this._assetDictionary[asset.assetNamespace][asset.name];\n\n\t\t\tif (autoRemoveEmptyNamespace) {\n\n\t\t\t\tvar key:string;\n\t\t\t\tvar empty:boolean = true;\n\n\t\t\t\tfor (key in this._assetDictionary[asset.assetNamespace]) {\n\t\t\t\t\tempty = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (empty)\n\t\t\t\t\tdelete this._assetDictionary[asset.assetNamespace];\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic stopAllLoadingSessions()\n\t{\n\t\tvar i:number;\n\n\t\tif (!this._loadingSessions)\n\t\t\tthis._loadingSessions = new Array();\n\n\t\tvar length:number = this._loadingSessions.length;\n\n\t\tfor (i = 0; i < length; i++)\n\t\t\tthis.killLoadingSession(this._loadingSessions[i]);\n\n\t\tthis._loadingSessions = null;\n\t}\n\n\tprivate rehashAssetDict()\n\t{\n\t\tvar asset:IAsset;\n\n\t\tthis._assetDictionary = {};\n\n\t\tvar l:number = this._assets.length;\n\n\t\tfor (var c:number = 0; c < l; c++) {\n\t\t\tasset = this._assets[c];\n\n\t\t\tif (!this._assetDictionary.hasOwnProperty(asset.assetNamespace))\n\t\t\t\tthis._assetDictionary[asset.assetNamespace] = {};\n\n\t\t\tthis._assetDictionary[asset.assetNamespace][asset.name] = asset;\n\n\t\t}\n\n\t\tthis._assetDictDirty = false;\n\n\t}\n\n\t/**\n\t * Called when a an error occurs during loading.\n\t */\n\tprivate onLoadError(event:IOErrorEvent):boolean\n\t{\n\t\tif (this.hasEventListener(IOErrorEvent.IO_ERROR)) {\n\t\t\tthis.dispatchEvent(event);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Called when a an error occurs during parsing.\n\t */\n\tprivate onParseError(event:ParserEvent):boolean\n\t{\n\t\tif (this.hasEventListener(ParserEvent.PARSE_ERROR)) {\n\t\t\tthis.dispatchEvent(event);\n\t\t\treturn true;\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tprivate onAssetComplete(event:AssetEvent)\n\t{\n\t\t// Only add asset to library the first time.\n\t\tif (event.type == AssetEvent.ASSET_COMPLETE)\n\t\t\tthis.addAsset(event.asset);\n\n\t\tthis.dispatchEvent(event);\n\n\t}\n\n\tprivate onTextureSizeError(event:AssetEvent)\n\t{\n\t\tthis.dispatchEvent(event);\n\t}\n\n\t/**\n\t * Called when the resource and all of its dependencies was retrieved.\n\t */\n\tprivate onResourceComplete(event:LoaderEvent)\n\t{\n\t\tvar loader:AssetLoader = event.target;\n\n\t\tthis.dispatchEvent(event);\n\n\t\tvar index:number = this._loadingSessions.indexOf(loader);\n\t\tthis._loadingSessions.splice(index, 1);\n\n\t\t// Add loader to a garbage array - for a collection sweep and kill\n\t\tthis._loadingSessionsGarbage.push(loader);\n\t\tthis._gcTimeoutIID = setTimeout(() => {this.loadingSessionGC()}, 100);\n\t}\n\n\tprivate loadingSessionGC():void\n\t{\n\t\tvar loader:AssetLoader;\n\n\t\twhile (this._loadingSessionsGarbage.length > 0) {\n\t\t\tloader = this._loadingSessionsGarbage.pop();\n\t\t\tthis.killLoadingSession(loader);\n\t\t}\n\n\t\tclearTimeout(this._gcTimeoutIID);\n\t\tthis._gcTimeoutIID = null;\n\n\t}\n\n\tprivate killLoadingSession(loader:AssetLoader)\n\t{\n\t\tloader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate);\n\t\tloader.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate);\n\t\tloader.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);\n\t\tloader.stop();\n\t}\n\n\t/**\n\t * Called when unespected error occurs\n\t */\n\t/*\n\t private onResourceError() : void\n\t {\n\t var msg:string = \"Unexpected parser error\";\n\t if(hasEventListener(LoaderEvent.DEPENDENCY_ERROR)){\n\t var re:LoaderEvent = new LoaderEvent(LoaderEvent.DEPENDENCY_ERROR, \"\");\n\t dispatchEvent(re);\n\t } else{\n\t throw new Error(msg);\n\t }\n\t }\n\t */\n\n\tprivate onAssetRename(event:AssetEvent)\n\t{\n\t\tvar asset:IAsset = event.target;// TODO: was ev.currentTarget - watch this var\n\t\tvar old:IAsset = this.getAsset(asset.assetNamespace, asset.name);\n\n\t\tif (old != null) {\n\t\t\tthis._strategy.resolveConflict(asset, old, this._assetDictionary[asset.assetNamespace], this._strategyPreference);\n\t\t} else {\n\t\t\tvar dict:Object = this._assetDictionary[event.asset.assetNamespace];\n\n\t\t\tif (dict == null)\n\t\t\t\treturn;\n\n\t\t\tdict[event.assetPrevName] = null;\n\t\t\tdict[event.asset.name] = event.asset;\n\t\t}\n\t}\n\n\tprivate onAssetConflictResolved(event:AssetEvent)\n\t{\n\t\tthis.dispatchEvent(event.clone());\n\t}\n}\n\nexport = AssetLibraryBundle;", + "import IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\n\nclass AssetLibraryIterator\n{\n\n\tprivate _assets:Array;\n\tprivate _filtered:Array;\n\n\tprivate _idx:number;\n\n\tconstructor(assets:Array, assetTypeFilter:string, namespaceFilter:string, filterFunc)\n\t{\n\t\tthis._assets = assets;\n\t\tthis.filter(assetTypeFilter, namespaceFilter, filterFunc);\n\t}\n\n\tpublic get currentAsset():IAsset\n\t{\n\t\t// Return current, or null if no current\n\t\treturn ( this._idx < this._filtered.length )? this._filtered[ this._idx ] : null;\n\t}\n\n\tpublic get numAssets():number\n\t{\n\t\treturn this._filtered.length;\n\t}\n\n\tpublic next():IAsset\n\t{\n\t\tvar next:IAsset = null;\n\n\t\tif (this._idx < this._filtered.length)\n\t\t\tnext = this._filtered[this._idx];\n\n\t\tthis._idx++;\n\n\t\treturn next;\n\t}\n\n\tpublic reset()\n\t{\n\t\tthis._idx = 0;\n\t}\n\n\tpublic setIndex(index:number)\n\t{\n\t\tthis._idx = index;\n\t}\n\n\tprivate filter(assetTypeFilter:string, namespaceFilter:string, filterFunc)\n\t{\n\t\tif (assetTypeFilter || namespaceFilter) {\n\n\t\t\tvar idx:number;\n\t\t\tvar asset:IAsset;\n\n\n\t\t\tidx = 0;\n\t\t\tthis._filtered = new Array();//new Vector.;\n\n\t\t\tvar l:number = this._assets.length;\n\n\t\t\tfor (var c:number = 0; c < l; c++) {\n\n\t\t\t\tasset = this._assets[c];\n\n\t\t\t\t// Skip this assets if filtering on type and this is wrong type\n\t\t\t\tif (assetTypeFilter && asset.assetType != assetTypeFilter)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Skip this asset if filtering on namespace and this is wrong namespace\n\t\t\t\tif (namespaceFilter && asset.assetNamespace != namespaceFilter)\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// Skip this asset if a filter func has been provided and it returns false\n\t\t\t\tif (filterFunc != null && !filterFunc(asset))\n\t\t\t\t\tcontinue;\n\n\t\t\t\tthis._filtered[idx++] = asset;\n\n\t\t\t}\n\n\t\t\t/*\n\t\t\t for each (asset in _assets) {\n\t\t\t // Skip this assets if filtering on type and this is wrong type\n\t\t\t if (assetTypeFilter && asset.assetType != assetTypeFilter)\n\t\t\t continue;\n\n\t\t\t // Skip this asset if filtering on namespace and this is wrong namespace\n\t\t\t if (namespaceFilter && asset.assetNamespace != namespaceFilter)\n\t\t\t continue;\n\n\t\t\t // Skip this asset if a filter func has been provided and it returns false\n\t\t\t if (filterFunc != null && !filterFunc(asset))\n\t\t\t continue;\n\n\t\t\t _filtered[idx++] = asset;\n\t\t\t }\n\t\t\t */\n\n\t\t} else {\n\t\t\tthis._filtered = this._assets;\n\t\t}\n\t}\n}\n\nexport = AssetLibraryIterator;", + "import URLRequest\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequest\");\nimport AssetLibraryBundle\t\t= require(\"awayjs-core/lib/core/library/AssetLibraryBundle\");\nimport AssetLibraryIterator\t\t= require(\"awayjs-core/lib/core/library/AssetLibraryIterator\");\nimport AssetLoader\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoader\");\nimport AssetLoaderContext\t\t= require(\"awayjs-core/lib/core/library/AssetLoaderContext\");\nimport AssetLoaderToken\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoaderToken\");\nimport ConflictStrategyBase\t\t= require(\"awayjs-core/lib/core/library/ConflictStrategyBase\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport ParserBase\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserBase\");\n\n/**\n * AssetLibrary enforces a singleton pattern and is not intended to be instanced.\n * It's purpose is to allow access to the default library bundle through a set of static shortcut methods.\n * If you are interested in creating multiple library bundles, please use the getBundle() method.\n */\nclass AssetLibrary\n{\n\t/**\n\t * Creates a new AssetLibrary object.\n\t *\n\t */\n\tconstructor()\n\t{\n\t}\n\n\t//*/\n\t/**\n\t * Returns an AssetLibrary bundle instance. If no key is given, returns the default bundle (which is\n\t * similar to using the AssetLibraryBundle as a singleton). To keep several separated library bundles,\n\t * pass a string key to this method to define which bundle should be returned. This is\n\t * referred to as using the AssetLibraryBundle as a multiton.\n\t *\n\t * @param key Defines which multiton instance should be returned.\n\t * @return An instance of the asset library\n\t */\n\tpublic static getBundle(key:string = 'default'):AssetLibraryBundle\n\t{\n\t\treturn AssetLibraryBundle.getInstance(key);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic static enableParser(parserClass)\n\t{\n\t\tAssetLoader.enableParser(parserClass);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic static enableParsers(parserClasses:Array)\n\t{\n\t\tAssetLoader.enableParsers(parserClasses);\n\t}\n\n\t/**\n\t * Short-hand for conflictStrategy property on default asset library bundle.\n\t *\n\t * @see AssetLibraryBundle.conflictStrategy\n\t */\n\tpublic static get conflictStrategy():ConflictStrategyBase\n\t{\n\t\treturn AssetLibrary.getBundle().conflictStrategy;\n\t}\n\n\tpublic static set conflictStrategy(val:ConflictStrategyBase)\n\t{\n\t\tAssetLibrary.getBundle().conflictStrategy = val;\n\t}\n\n\t/**\n\t * Short-hand for conflictPrecedence property on default asset library bundle.\n\t *\n\t * @see AssetLibraryBundle.conflictPrecedence\n\t */\n\tpublic static get conflictPrecedence():string\n\t{\n\t\treturn AssetLibrary.getBundle().conflictPrecedence;\n\t}\n\n\tpublic static set conflictPrecedence(val:string)\n\t{\n\t\tAssetLibrary.getBundle().conflictPrecedence = val;\n\t}\n\n\t/**\n\t * Short-hand for createIterator() method on default asset library bundle.\n\t *\n\t * @see AssetLibraryBundle.createIterator()\n\t */\n\tpublic static createIterator(assetTypeFilter:string = null, namespaceFilter:string = null, filterFunc = null):AssetLibraryIterator\n\t{\n\t\treturn AssetLibrary.getBundle().createIterator(assetTypeFilter, namespaceFilter, filterFunc);\n\t}\n\n\t/**\n\t * Short-hand for load() method on default asset library bundle.\n\t *\n\t * @see AssetLibraryBundle.load()\n\t */\n\tpublic static load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken\n\t{\n\t\treturn AssetLibrary.getBundle().load(req, context, ns, parser);\n\t}\n\n\t/**\n\t * Short-hand for loadData() method on default asset library bundle.\n\t *\n\t * @see AssetLibraryBundle.loadData()\n\t */\n\tpublic static loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken\n\t{\n\t\treturn AssetLibrary.getBundle().loadData(data, context, ns, parser);\n\t}\n\n\tpublic static stopLoad()\n\t{\n\t\tAssetLibrary.getBundle().stopAllLoadingSessions();\n\t}\n\n\t/**\n\t * Short-hand for getAsset() method on default asset library bundle.\n\t *\n\t * @see AssetLibraryBundle.getAsset()\n\t */\n\tpublic static getAsset(name:string, ns:string = null):IAsset\n\t{\n\t\treturn AssetLibrary.getBundle().getAsset(name, ns);\n\t}\n\n\t/**\n\t * Short-hand for addEventListener() method on default asset library bundle.\n\t */\n\tpublic static addEventListener(type:string, listener:Function)\n\t{\n\t\tAssetLibrary.getBundle().addEventListener(type, listener);\n\t}\n\n\t/**\n\t * Short-hand for removeEventListener() method on default asset library bundle.\n\t */\n\tpublic static removeEventListener(type:string, listener:Function)\n\t{\n\t\tAssetLibrary.getBundle().removeEventListener(type, listener);\n\t}\n\n\t/**\n\t * Short-hand for hasEventListener() method on default asset library bundle.\n\n\t public static hasEventListener(type:string):boolean\n\t {\n\t\treturn AssetLibrary.getBundle().hasEventListener(type);\n\t}\n\n\t public static willTrigger(type:string):boolean\n\t {\n\t\treturn getBundle().willTrigger(type);\n\t}\n\t */\n\n\t/**\n\t * Short-hand for addAsset() method on default asset library bundle.\n\t *\n\t * @see AssetLibraryBundle.addAsset()\n\t */\n\tpublic static addAsset(asset:IAsset)\n\t{\n\t\tAssetLibrary.getBundle().addAsset(asset);\n\t}\n\n\t/**\n\t * Short-hand for removeAsset() method on default asset library bundle.\n\t *\n\t * @param asset The asset which should be removed from the library.\n\t * @param dispose Defines whether the assets should also be disposed.\n\t *\n\t * @see AssetLibraryBundle.removeAsset()\n\t */\n\tpublic static removeAsset(asset:IAsset, dispose:boolean = true)\n\t{\n\t\tAssetLibrary.getBundle().removeAsset(asset, dispose);\n\t}\n\n\t/**\n\t * Short-hand for removeAssetByName() method on default asset library bundle.\n\t *\n\t * @param name The name of the asset to be removed.\n\t * @param ns The namespace to which the desired asset belongs.\n\t * @param dispose Defines whether the assets should also be disposed.\n\t *\n\t * @see AssetLibraryBundle.removeAssetByName()\n\t */\n\tpublic static removeAssetByName(name:string, ns:string = null, dispose:boolean = true):IAsset\n\t{\n\t\treturn AssetLibrary.getBundle().removeAssetByName(name, ns, dispose);\n\t}\n\n\t/**\n\t * Short-hand for removeAllAssets() method on default asset library bundle.\n\t *\n\t * @param dispose Defines whether the assets should also be disposed.\n\t *\n\t * @see AssetLibraryBundle.removeAllAssets()\n\t */\n\tpublic static removeAllAssets(dispose:boolean = true)\n\t{\n\t\tAssetLibrary.getBundle().removeAllAssets(dispose);\n\t}\n\n\t/**\n\t * Short-hand for removeNamespaceAssets() method on default asset library bundle.\n\t *\n\t * @see AssetLibraryBundle.removeNamespaceAssets()\n\t */\n\tpublic static removeNamespaceAssets(ns:string = null, dispose:boolean = true)\n\t{\n\t\tAssetLibrary.getBundle().removeNamespaceAssets(ns, dispose);\n\t}\n}\n\nexport = AssetLibrary;", + "class AssetLoaderContext\n{\n\tpublic static UNDEFINED:number = 0;\n\tpublic static SINGLEPASS_MATERIALS:number = 1;\n\tpublic static MULTIPASS_MATERIALS:number = 2;\n\n\tprivate _includeDependencies:boolean;\n\tprivate _dependencyBaseUrl:string;\n\tprivate _embeddedDataByUrl:Object;\n\tprivate _remappedUrls:Object;\n\tprivate _materialMode:number;\n\n\tprivate _overrideAbsPath:boolean;\n\tprivate _overrideFullUrls:boolean;\n\n\t/**\n\t * AssetLoaderContext provides configuration for the AssetLoader load() and parse() operations.\n\t * Use it to configure how (and if) dependencies are loaded, or to map dependency URLs to\n\t * embedded data.\n\t *\n\t * @see away.loading.AssetLoader\n\t */\n\tconstructor(includeDependencies:boolean = true, dependencyBaseUrl:string = null)\n\t{\n\t\tthis._includeDependencies = includeDependencies;\n\t\tthis._dependencyBaseUrl = dependencyBaseUrl || '';\n\t\tthis._embeddedDataByUrl = {};\n\t\tthis._remappedUrls = {};\n\t\tthis._materialMode = AssetLoaderContext.UNDEFINED;\n\t}\n\n\t/**\n\t * Defines whether dependencies (all files except the one at the URL given to the load() or\n\t * parseData() operations) should be automatically loaded. Defaults to true.\n\t */\n\tpublic get includeDependencies():boolean\n\t{\n\t\treturn this._includeDependencies;\n\t}\n\n\tpublic set includeDependencies(val:boolean)\n\t{\n\t\tthis._includeDependencies = val;\n\t}\n\n\t/**\n\t * MaterialMode defines, if the Parser should create SinglePass or MultiPass Materials\n\t * Options:\n\t * 0 (Default / undefined) - All Parsers will create SinglePassMaterials, but the AWD2.1parser will create Materials as they are defined in the file\n\t * 1 (Force SinglePass) - All Parsers create SinglePassMaterials\n\t * 2 (Force MultiPass) - All Parsers will create MultiPassMaterials\n\t *\n\t */\n\tpublic get materialMode():number\n\t{\n\t\treturn this._materialMode;\n\t}\n\n\tpublic set materialMode(materialMode:number)\n\t{\n\t\tthis._materialMode = materialMode;\n\t}\n\n\t/**\n\t * A base URL that will be prepended to all relative dependency URLs found in a loaded resource.\n\t * Absolute paths will not be affected by the value of this property.\n\t */\n\tpublic get dependencyBaseUrl():string\n\t{\n\t\treturn this._dependencyBaseUrl;\n\t}\n\n\tpublic set dependencyBaseUrl(val:string)\n\t{\n\t\tthis._dependencyBaseUrl = val;\n\t}\n\n\t/**\n\t * Defines whether absolute paths (defined as paths that begin with a \"/\") should be overridden\n\t * with the dependencyBaseUrl defined in this context. If this is true, and the base path is\n\t * \"base\", /path/to/asset.jpg will be resolved as base/path/to/asset.jpg.\n\t */\n\tpublic get overrideAbsolutePaths():boolean\n\t{\n\t\treturn this._overrideAbsPath;\n\t}\n\n\tpublic set overrideAbsolutePaths(val:boolean)\n\t{\n\t\tthis._overrideAbsPath = val;\n\t}\n\n\t/**\n\t * Defines whether \"full\" URLs (defined as a URL that includes a scheme, e.g. http://) should be\n\t * overridden with the dependencyBaseUrl defined in this context. If this is true, and the base\n\t * path is \"base\", http://example.com/path/to/asset.jpg will be resolved as base/path/to/asset.jpg.\n\t */\n\tpublic get overrideFullURLs():boolean\n\t{\n\t\treturn this._overrideFullUrls;\n\t}\n\n\tpublic set overrideFullURLs(val:boolean)\n\t{\n\t\tthis._overrideFullUrls = val;\n\t}\n\n\t/**\n\t * Map a URL to another URL, so that files that are referred to by the original URL will instead\n\t * be loaded from the new URL. Use this when your file structure does not match the one that is\n\t * expected by the loaded file.\n\t *\n\t * @param originalUrl The original URL which is referenced in the loaded resource.\n\t * @param newUrl The URL from which away.should load the resource instead.\n\t *\n\t * @see mapUrlToData()\n\t */\n\tpublic mapUrl(originalUrl:string, newUrl:string)\n\t{\n\t\tthis._remappedUrls[originalUrl] = newUrl;\n\t}\n\n\t/**\n\t * Map a URL to embedded data, so that instead of trying to load a dependency from the URL at\n\t * which it's referenced, the dependency data will be retrieved straight from the memory instead.\n\t *\n\t * @param originalUrl The original URL which is referenced in the loaded resource.\n\t * @param data The embedded data. Can be ByteArray or a class which can be used to create a bytearray.\n\t */\n\tpublic mapUrlToData(originalUrl:string, data:any)\n\t{\n\t\tthis._embeddedDataByUrl[originalUrl] = data;\n\t}\n\n\t/**\n\t * @private\n\t * Defines whether embedded data has been mapped to a particular URL.\n\t */\n\tpublic _iHasDataForUrl(url:string):boolean\n\t{\n\t\treturn this._embeddedDataByUrl.hasOwnProperty(url);\n\t}\n\n\t/**\n\t * @private\n\t * Returns embedded data for a particular URL.\n\t */\n\tpublic _iGetDataForUrl(url:string):any\n\t{\n\t\treturn this._embeddedDataByUrl[url];\n\t}\n\n\t/**\n\t * @private\n\t * Defines whether a replacement URL has been mapped to a particular URL.\n\t */\n\tpublic _iHasMappingForUrl(url:string):boolean\n\t{\n\t\treturn this._remappedUrls.hasOwnProperty(url);\n\t}\n\n\t/**\n\t * @private\n\t * Returns new (replacement) URL for a particular original URL.\n\t */\n\tpublic _iGetRemappedUrl(originalUrl:string):string\n\t{\n\t\treturn this._remappedUrls[originalUrl];\n\t}\n}\n\nexport = AssetLoaderContext;", + "import AssetLoader\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoader\");\nimport EventDispatcher\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\n\n/**\n * Dispatched when any asset finishes parsing. Also see specific events for each\n * individual asset type (meshes, materials et c.)\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"assetComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when a full resource (including dependencies) finishes loading.\n *\n * @eventType away.events.LoaderEvent\n */\n//[Event(name=\"resourceComplete\", type=\"away3d.events.LoaderEvent\")]\n\n\n/**\n * Dispatched when a single dependency (which may be the main file of a resource)\n * finishes loading.\n *\n * @eventType away.events.LoaderEvent\n */\n//[Event(name=\"dependencyComplete\", type=\"away3d.events.LoaderEvent\")]\n\n\n/**\n * Dispatched when an error occurs during loading. I\n *\n * @eventType away.events.LoaderEvent\n */\n//[Event(name=\"loadError\", type=\"away3d.events.LoaderEvent\")]\n\n\n/**\n * Dispatched when an error occurs during parsing.\n *\n * @eventType away.events.ParserEvent\n */\n//[Event(name=\"parseError\", type=\"away3d.events.ParserEvent\")]\n\n\n/**\n * Dispatched when a skybox asset has been costructed from a ressource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"skyboxComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Dispatched when a camera3d asset has been costructed from a ressource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"cameraComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Dispatched when a mesh asset has been costructed from a ressource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"meshComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Dispatched when a geometry asset has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"geometryComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Dispatched when a skeleton asset has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"skeletonComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Dispatched when a skeleton pose asset has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"skeletonPoseComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Dispatched when a container asset has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"containerComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Dispatched when a texture asset has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"textureComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Dispatched when a texture projector asset has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"textureProjectorComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when a material asset has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"materialComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when a animator asset has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"animatorComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when an animation set has been constructed from a group of animation state resources.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"animationSetComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when an animation state has been constructed from a group of animation node resources.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"animationStateComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when an animation node has been constructed from a resource.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"animationNodeComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when an animation state transition has been constructed from a group of animation node resources.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"stateTransitionComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when an light asset has been constructed from a resources.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"lightComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when an light picker asset has been constructed from a resources.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"lightPickerComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when an effect method asset has been constructed from a resources.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"effectMethodComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when an shadow map method asset has been constructed from a resources.\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"shadowMapMethodComplete\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * Instances of this class are returned as tokens by loading operations\n * to provide an object on which events can be listened for in cases where\n * the actual asset loader is not directly available (e.g. when using the\n * AssetLibrary to perform the load.)\n *\n * By listening for events on this class instead of directly on the\n * AssetLibrary, one can distinguish different loads from each other.\n *\n * The token will dispatch all events that the original AssetLoader dispatches,\n * while not providing an interface to obstruct the load and is as such a\n * safer return value for loader wrappers than the loader itself.\n */\nclass AssetLoaderToken extends EventDispatcher\n{\n\tpublic _iLoader:AssetLoader;\n\n\tconstructor(loader:AssetLoader)\n\t{\n\t\tsuper();\n\n\t\tthis._iLoader = loader;\n\t}\n\n\tpublic addEventListener(type:string, listener:Function)\n\t{\n\t\tthis._iLoader.addEventListener(type, listener);\n\t}\n\n\n\tpublic removeEventListener(type:string, listener:Function)\n\t{\n\t\tthis._iLoader.removeEventListener(type, listener);\n\t}\n\n\tpublic hasEventListener(type:string, listener:Function = null):boolean\n\t{\n\t\treturn this._iLoader.hasEventListener(type, listener);\n\t}\n\n\t/*\n\t public willTrigger(type:string):boolean\n\t {\n\t return this._iLoader.willTrigger(type);\n\t }\n\t */\n}\n\nexport = AssetLoaderToken;", + "import DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport AssetLoaderContext\t\t= require(\"awayjs-core/lib/core/library/AssetLoaderContext\");\nimport AssetLoaderToken\t\t\t= require(\"awayjs-core/lib/core/library/AssetLoaderToken\");\nimport URLLoader\t\t\t\t= require(\"awayjs-core/lib/core/net/URLLoader\");\nimport URLLoaderDataFormat\t\t= require(\"awayjs-core/lib/core/net/URLLoaderDataFormat\");\nimport URLRequest\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequest\");\nimport Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport AssetEvent\t\t\t\t= require(\"awayjs-core/lib/events/AssetEvent\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\nimport EventDispatcher\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport IOErrorEvent\t\t\t\t= require(\"awayjs-core/lib/events/IOErrorEvent\");\nimport LoaderEvent\t\t\t\t= require(\"awayjs-core/lib/events/LoaderEvent\");\nimport ParserEvent\t\t\t\t= require(\"awayjs-core/lib/events/ParserEvent\");\nimport CubeTextureParser\t\t= require(\"awayjs-core/lib/parsers/CubeTextureParser\");\nimport ParserBase\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserBase\");\nimport ResourceDependency\t\t= require(\"awayjs-core/lib/parsers/ResourceDependency\");\nimport Texture2DParser\t\t\t= require(\"awayjs-core/lib/parsers/Texture2DParser\");\n\n/**\n * Dispatched when any asset finishes parsing. Also see specific events for each\n * individual asset type (meshes, materials et c.)\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"assetComplete\", type=\"away3d.events.AssetEvent\")]\n\n\n/**\n * Dispatched when a full resource (including dependencies) finishes loading.\n *\n * @eventType away.events.LoaderEvent\n */\n//[Event(name=\"resourceComplete\", type=\"away3d.events.LoaderEvent\")]\n\n\n/**\n * Dispatched when a single dependency (which may be the main file of a resource)\n * finishes loading.\n *\n * @eventType away.events.LoaderEvent\n */\n//[Event(name=\"dependencyComplete\", type=\"away3d.events.LoaderEvent\")]\n\n\n/**\n * Dispatched when an error occurs during loading. I\n *\n * @eventType away.events.LoaderEvent\n */\n//[Event(name=\"loadError\", type=\"away3d.events.LoaderEvent\")]\n\n\n/**\n * Dispatched when an error occurs during parsing.\n *\n * @eventType away.events.ParserEvent\n */\n//[Event(name=\"parseError\", type=\"away3d.events.ParserEvent\")]\n\n/**\n * Dispatched when an image asset dimensions are not a power of 2\n *\n * @eventType away.events.AssetEvent\n */\n//[Event(name=\"textureSizeError\", type=\"away3d.events.AssetEvent\")]\n\n/**\n * AssetLoader can load any file format that away.supports (or for which a third-party parser\n * has been plugged in) and it's dependencies. Events are dispatched when assets are encountered\n * and for when the resource (or it's dependencies) have been loaded.\n *\n * The AssetLoader will not make assets available in any other way than through the dispatched\n * events. To store assets and make them available at any point from any module in an application,\n * use the AssetLibrary to load and manage assets.\n *\n * @see away.library.AssetLibrary\n */\nclass AssetLoader extends EventDispatcher\n{\n\tprivate _context:AssetLoaderContext;\n\tprivate _token:AssetLoaderToken;\n\tprivate _uri:string;\n\tprivate _content:DisplayObject;\n\tprivate _materialMode:number;\n\n\tprivate _errorHandlers:Array;\n\tprivate _parseErrorHandlers:Array;\n\n\tprivate _stack:Array;\n\tprivate _baseDependency:ResourceDependency;\n\tprivate _currentDependency:ResourceDependency;\n\tprivate _namespace:string;\n\n\tprivate _onReadyForDependenciesDelegate:(event:ParserEvent) => void;\n\tprivate _onParseCompleteDelegate:(event:ParserEvent) => void;\n\tprivate _onParseErrorDelegate:(event:ParserEvent) => void;\n\tprivate _onLoadCompleteDelegate:(event:Event) => void;\n\tprivate _onLoadErrorDelegate:(event:IOErrorEvent) => void;\n\tprivate _onTextureSizeErrorDelegate:(event:AssetEvent) => void;\n\tprivate _onAssetCompleteDelegate:(event:AssetEvent) => void;\n\n\t// Image parser only parser that is added by default, to save file size.\n\tprivate static _parsers:Array = new Array(Texture2DParser, CubeTextureParser);\n\n\t/**\n\t * Enables a specific parser.\n\t * When no specific parser is set for a loading/parsing opperation,\n\t * loader3d can autoselect the correct parser to use.\n\t * A parser must have been enabled, to be considered when autoselecting the parser.\n\t *\n\t * @param parser The parser class to enable.\n\t *\n\t * @see away.parsers.Parsers\n\t */\n\tpublic static enableParser(parser)\n\t{\n\t\tif (AssetLoader._parsers.indexOf(parser) < 0)\n\t\t\tAssetLoader._parsers.push(parser);\n\t}\n\n\t/**\n\t * Enables a list of parsers.\n\t * When no specific parser is set for a loading/parsing opperation,\n\t * AssetLoader can autoselect the correct parser to use.\n\t * A parser must have been enabled, to be considered when autoselecting the parser.\n\t *\n\t * @param parsers A Vector of parser classes to enable.\n\t * @see away.parsers.Parsers\n\t */\n\tpublic static enableParsers(parsers:Array)\n\t{\n\t\tfor (var c:number = 0; c < parsers.length; c++)\n\t\t\tAssetLoader.enableParser(parsers[ c ]);\n\t}\n\n\t/**\n\t * Returns the base dependency of the loader\n\t */\n\tpublic get baseDependency():ResourceDependency\n\t{\n\t\treturn this._baseDependency;\n\t}\n\n\t/**\n\t * Create a new ResourceLoadSession object.\n\t */\n\tconstructor(materialMode:number = 0)\n\t{\n\t\tsuper();\n\n\t\tthis._materialMode = materialMode;\n\n\t\tthis._stack = new Array();\n\t\tthis._errorHandlers = new Array();\n\t\tthis._parseErrorHandlers = new Array();\n\n\t\tthis._onReadyForDependenciesDelegate = (event:ParserEvent) => this.onReadyForDependencies(event);\n\t\tthis._onParseCompleteDelegate = (event:ParserEvent) => this.onParseComplete(event);\n\t\tthis._onParseErrorDelegate = (event:ParserEvent) => this.onParseError(event);\n\t\tthis._onLoadCompleteDelegate = (event:Event) => this.onLoadComplete(event);\n\t\tthis._onLoadErrorDelegate = (event:IOErrorEvent) => this.onLoadError(event);\n\t\tthis._onTextureSizeErrorDelegate = (event:AssetEvent) => this.onTextureSizeError(event);\n\t\tthis._onAssetCompleteDelegate = (event:AssetEvent) => this.onAssetComplete(event);\n\t}\n\n\t/**\n\t * Loads a file and (optionally) all of its dependencies.\n\t *\n\t * @param req The URLRequest object containing the URL of the file to be loaded.\n\t * @param context An optional context object providing additional parameters for loading\n\t * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets\n\t * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type.\n\t */\n\tpublic load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken\n\t{\n\t\tif (!this._token) {\n\t\t\tthis._token = new AssetLoaderToken(this);\n\n\t\t\tthis._uri = req.url = req.url.replace(/\\\\/g, \"/\");\n\t\t\tthis._context = context;\n\t\t\tthis._namespace = ns;\n\n\t\t\tthis._baseDependency = new ResourceDependency('', req, null, parser, null);\n\t\t\tthis.retrieveDependency(this._baseDependency);\n\n\t\t\treturn this._token;\n\t\t}\n\n\t\t// TODO: Throw error (already loading)\n\t\treturn null;\n\t}\n\n\t/**\n\t * Loads a resource from already loaded data.\n\t *\n\t * @param data The data object containing all resource information.\n\t * @param context An optional context object providing additional parameters for loading\n\t * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets\n\t * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type.\n\t */\n\tpublic loadData(data:any, id:string, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken\n\t{\n\t\tif (!this._token) {\n\t\t\tthis._token = new AssetLoaderToken(this);\n\n\t\t\tthis._uri = id;\n\t\t\tthis._context = context;\n\t\t\tthis._namespace = ns;\n\n\t\t\tthis._baseDependency = new ResourceDependency(id, null, data, parser, null);\n\t\t\tthis.retrieveDependency(this._baseDependency);\n\n\t\t\treturn this._token;\n\t\t}\n\n\t\t// TODO: Throw error (already loading)\n\t\treturn null;\n\t}\n\n\t/**\n\t * Recursively retrieves the next to-be-loaded and parsed dependency on the stack, or pops the list off the\n\t * stack when complete and continues on the top set.\n\t * @param parser The parser that will translate the data into a usable resource.\n\t */\n\tprivate retrieveNext(parser:ParserBase = null)\n\t{\n\t\tif (this._currentDependency.dependencies.length) {\n\n\t\t\tvar next:ResourceDependency = this._currentDependency.dependencies.pop();\n\n\t\t\tthis._stack.push(this._currentDependency);\n\t\t\tthis.retrieveDependency(next);\n\n\t\t} else if (this._currentDependency.parser && this._currentDependency.parser.parsingPaused) {\n\n\t\t\tthis._currentDependency.parser._iResumeParsingAfterDependencies();\n\t\t\tthis._stack.pop();\n\n\t\t} else if (this._stack.length) {\n\n\t\t\tvar prev:ResourceDependency = this._currentDependency;\n\n\t\t\tthis._currentDependency = this._stack.pop();\n\n\t\t\tif (prev._iSuccess)\n\t\t\t\tprev.resolve();\n\n\t\t\tthis.retrieveNext(parser);\n\n\t\t} else {\n\t\t\tthis.dispatchEvent(new LoaderEvent(LoaderEvent.RESOURCE_COMPLETE, this._uri, this._baseDependency.parser.content, this._baseDependency.assets));\n\t\t}\n\t}\n\n\t/**\n\t * Retrieves a single dependency.\n\t * @param parser The parser that will translate the data into a usable resource.\n\t */\n\tprivate retrieveDependency(dependency:ResourceDependency)\n\t{\n\t\tvar data:any;\n\n\t\tif (this._context && this._context.materialMode != 0)\n\t\t\tthis._materialMode = this._context.materialMode;\n\n\t\tthis._currentDependency = dependency;\n\n\t\tdependency._iLoader = new URLLoader();\n\n\t\tthis.addEventListeners(dependency._iLoader);\n\n\t\t// Get already loaded (or mapped) data if available\n\t\tdata = dependency.data;\n\n\t\tif (this._context && dependency.request && this._context._iHasDataForUrl(dependency.request.url))\n\t\t\tdata = this._context._iGetDataForUrl(dependency.request.url);\n\n\t\tif (data) {\n\t\t\tif (data.constructor === Function)\n\t\t\t\tdata = new data();\n\n\t\t\tdependency._iSetData(data);\n\n\t\t\tif (dependency.retrieveAsRawData) {\n\t\t\t\t// No need to parse. The parent parser is expecting this\n\t\t\t\t// to be raw data so it can be passed directly.\n\t\t\t\tdependency.resolve();\n\n\t\t\t\t// Move on to next dependency\n\t\t\t\tthis.retrieveNext();\n\n\t\t\t} else {\n\t\t\t\tthis.parseDependency(dependency);\n\t\t\t}\n\n\t\t} else {\n\t\t\t// Resolve URL and start loading\n\t\t\tdependency.request.url = this.resolveDependencyUrl(dependency);\n\n\t\t\tif (dependency.retrieveAsRawData) {\n\t\t\t\t// Always use binary for raw data loading\n\t\t\t\tdependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY;\n\t\t\t} else {\n\n\t\t\t\tif (!dependency.parser)\n\t\t\t\t\tdependency._iSetParser(this.getParserFromSuffix(dependency.request.url));\n\n\t\t\t\tif (dependency.parser) {\n\t\t\t\t\tdependency._iLoader.dataFormat = dependency.parser.dataFormat;\n\t\t\t\t} else {\n\t\t\t\t\t// Always use BINARY for unknown file formats. The thorough\n\t\t\t\t\t// file type check will determine format after load, and if\n\t\t\t\t\t// binary, a text load will have broken the file data.\n\t\t\t\t\tdependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tdependency._iLoader.load(dependency.request);\n\t\t}\n\t}\n\n\tprivate joinUrl(base:string, end:string):string\n\t{\n\t\tif (end.charAt(0) == '/')\n\t\t\tend = end.substr(1);\n\n\t\tif (base.length == 0)\n\t\t\treturn end;\n\n\t\tif (base.charAt(base.length - 1) == '/')\n\t\t\tbase = base.substr(0, base.length - 1);\n\n\t\treturn base.concat('/', end);\n\n\t}\n\n\tprivate resolveDependencyUrl(dependency:ResourceDependency):string\n\t{\n\t\tvar scheme_re:RegExp;\n\t\tvar base:string;\n\t\tvar url:string = dependency.request.url;\n\n\t\t// Has the user re-mapped this URL?\n\t\tif (this._context && this._context._iHasMappingForUrl(url))\n\t\t\treturn this._context._iGetRemappedUrl(url);\n\n\t\t// This is the \"base\" dependency, i.e. the actual requested asset.\n\t\t// We will not try to resolve this since the user can probably be\n\t\t// thrusted to know this URL better than our automatic resolver. :)\n\t\tif (url == this._uri)\n\t\t\treturn url;\n\n\n\t\t// Absolute URL? Check if starts with slash or a URL\n\t\t// scheme definition (e.g. ftp://, http://, file://)\n\t\tscheme_re = new RegExp('/^[a-zA-Z]{3,4}:\\/\\//');\n\n\t\tif (url.charAt(0) == '/') {\n\t\t\tif (this._context && this._context.overrideAbsolutePaths)\n\t\t\t\treturn this.joinUrl(this._context.dependencyBaseUrl, url); else\n\t\t\t\treturn url;\n\t\t} else if (scheme_re.test(url)) {\n\t\t\t// If overriding full URLs, get rid of scheme (e.g. \"http://\")\n\t\t\t// and replace with the dependencyBaseUrl defined by user.\n\t\t\tif (this._context && this._context.overrideFullURLs) {\n\n\t\t\t\tvar noscheme_url : string = url.replace( scheme_re , '' );//url['replace'](scheme_re);\n\t\t\t\treturn this.joinUrl(this._context.dependencyBaseUrl, noscheme_url);\n\t\t\t}\n\t\t}\n\n\t\t// Since not absolute, just get rid of base file name to find it's\n\t\t// folder and then concatenate dynamic URL\n\t\tif (this._context && this._context.dependencyBaseUrl) {\n\t\t\tbase = this._context.dependencyBaseUrl;\n\t\t\treturn this.joinUrl(base, url);\n\t\t} else {\n\t\t\tbase = this._uri.substring(0, this._uri.lastIndexOf('/') + 1);\n\t\t\treturn this.joinUrl(base, url);\n\t\t}\n\t}\n\n\tprivate retrieveParserDependencies()\n\t{\n\t\tif (!this._currentDependency)\n\t\t\treturn;\n\n\t\tvar parserDependancies = this._currentDependency.parser.dependencies\n\t\tvar i:number, len:number = parserDependancies.length;\n\n\t\tfor (i = 0; i < len; i++)\n\t\t\tthis._currentDependency.dependencies[i] = parserDependancies[i];\n\n\n\t\t// Since more dependencies might be added eventually, empty this\n\t\t// list so that the same dependency isn't retrieved more than once.\n\t\tparserDependancies.length = 0;\n\n\t\tthis._stack.push(this._currentDependency);\n\n\t\tthis.retrieveNext();\n\t}\n\n\tprivate resolveParserDependencies()\n\t{\n\t\tthis._currentDependency._iSuccess = true;\n\n\t\t// Retrieve any last dependencies remaining on this parser, or\n\t\t// if none exists, just move on.\n\t\tif (this._currentDependency.parser && this._currentDependency.parser.dependencies.length && (!this._context || this._context.includeDependencies))//context may be null\n\t\t\tthis.retrieveParserDependencies();\n\t\telse\n\t\t\tthis.retrieveNext();\n\t}\n\n\t/**\n\t * Called when a single dependency loading failed, and pushes further dependencies onto the stack.\n\t * @param event\n\t */\n\tprivate onLoadError(event:IOErrorEvent)\n\t{\n\t\tvar handled:boolean;\n\t\tvar isDependency:boolean = (this._currentDependency != this._baseDependency);\n\t\tvar loader:URLLoader = event.target;//TODO: keep on eye on this one\n\n\t\tthis.removeEventListeners(loader);\n\n\t\tif (this.hasEventListener(IOErrorEvent.IO_ERROR )) {\n\t\t\tthis.dispatchEvent(event);\n\t\t\thandled = true;\n\t\t} else {\n\t\t\t// TODO: Consider not doing this even when AssetLoader does have it's own LOAD_ERROR listener\n\t\t\tvar i:number, len:number = this._errorHandlers.length;\n\t\t\tfor (i = 0; i < len; i++)\n\t\t\t\tif (!handled)\n\t\t\t\t\thandled = this._errorHandlers[i](event);\n\t\t}\n\n\t\tif (handled) {\n\n\t\t\t//if (isDependency && ! event.isDefaultPrevented()) {\n\t\t\tif (isDependency) { // TODO: JS / AS3 Change - we don't have isDefaultPrevented - so will this work\n\n\t\t\t\tthis._currentDependency.resolveFailure();\n\t\t\t\tthis.retrieveNext();\n\n\t\t\t} else {\n\t\t\t\t// Either this was the base file (last left in the stack) or\n\t\t\t\t// default behavior was prevented by the handlers, and hence\n\t\t\t\t// there is nothing more to do than clean up and bail.\n\t\t\t\tthis.dispose();\n\t\t\t\treturn;\n\t\t\t}\n\t\t} else {\n\n\t\t\t// Error event was not handled by listeners directly on AssetLoader or\n\t\t\t// on any of the subscribed loaders (in the list of error handlers.)\n\t\t\tthrow new Error();\n\t\t}\n\t}\n\n\t/**\n\t * Called when a dependency parsing failed, and dispatches a ParserEvent.PARSE_ERROR\n\t * @param event\n\t */\n\tprivate onParseError(event:ParserEvent)\n\t{\n\t\tvar handled:boolean;\n\n\t\tvar isDependency:boolean = (this._currentDependency != this._baseDependency);\n\n\t\tvar loader:URLLoader = event.target;\n\n\t\tthis.removeEventListeners(loader);\n\n\t\tif (this.hasEventListener(ParserEvent.PARSE_ERROR)) {\n\t\t\tthis.dispatchEvent(event);\n\t\t\thandled = true;\n\t\t} else {\n\t\t\t// TODO: Consider not doing this even when AssetLoader does\n\t\t\t// have it's own LOAD_ERROR listener\n\t\t\tvar i:number, len:number = this._parseErrorHandlers.length;\n\n\t\t\tfor (i = 0; i < len; i++)\n\t\t\t\tif (!handled)\n\t\t\t\t\thandled = this._parseErrorHandlers[i](event);\n\t\t}\n\n\t\tif (handled) {\n\t\t\tthis.dispose();\n\t\t\treturn;\n\t\t} else {\n\t\t\t// Error event was not handled by listeners directly on AssetLoader or\n\t\t\t// on any of the subscribed loaders (in the list of error handlers.)\n\t\t\tthrow new Error(event.message);\n\t\t}\n\t}\n\n\tprivate onAssetComplete(event:AssetEvent)\n\t{\n\t\t// Add loaded asset to list of assets retrieved as part\n\t\t// of the current dependency. This list will be inspected\n\t\t// by the parent parser when dependency is resolved\n\t\tif (this._currentDependency)\n\t\t\tthis._currentDependency.assets.push(event.asset);\n\n\t\tevent.asset.resetAssetPath(event.asset.name, this._namespace);\n\n\t\tif (!this._currentDependency.suppresAssetEvents)\n\t\t\tthis.dispatchEvent(event);\n\t}\n\n\tprivate onReadyForDependencies(event:ParserEvent)\n\t{\n\t\tvar parser:ParserBase = event.target;\n\n\t\tif (this._context && !this._context.includeDependencies)\n\t\t\tparser._iResumeParsingAfterDependencies();\n\t\telse\n\t\t\tthis.retrieveParserDependencies();\n\t}\n\n\t/**\n\t * Called when a single dependency was parsed, and pushes further dependencies onto the stack.\n\t * @param event\n\t */\n\tprivate onLoadComplete(event:Event)\n\t{\n\t\tvar loader:URLLoader = event.target;\n\n\t\tthis.removeEventListeners(loader);\n\n\t\t// Resolve this dependency\n\t\tthis._currentDependency._iSetData(loader.data);\n\n\t\tif (this._currentDependency.retrieveAsRawData) {\n\t\t\t// No need to parse this data, which should be returned as is\n\t\t\tthis.resolveParserDependencies();\n\t\t} else {\n\t\t\tthis.parseDependency(this._currentDependency);\n\t\t}\n\t}\n\n\t/**\n\t * Called when parsing is complete.\n\t */\n\tprivate onParseComplete(event:ParserEvent):void\n\t{\n\t\tvar parser:ParserBase = event.target;\n\n\t\tthis.resolveParserDependencies();//resolve in front of removing listeners to allow any remaining asset events to propagate\n\n\t\tparser.removeEventListener(ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate);\n\t\tparser.removeEventListener(ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate);\n\t\tparser.removeEventListener(ParserEvent.PARSE_ERROR, this._onParseErrorDelegate);\n\t\tparser.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate);\n\t\tparser.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);\n\t}\n\n\t/**\n\t * Called when an image is too large or it's dimensions are not a power of 2\n\t * @param event\n\t */\n\tprivate onTextureSizeError(event:AssetEvent)\n\t{\n\t\tevent.asset.name = this._currentDependency.resolveName(event.asset);\n\n\t\tthis.dispatchEvent(event);\n\t}\n\n\tprivate addEventListeners(loader:URLLoader)\n\t{\n\t\tloader.addEventListener(Event.COMPLETE, this._onLoadCompleteDelegate);\n\t\tloader.addEventListener(IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate);\n\t}\n\n\tprivate removeEventListeners(loader:URLLoader)\n\t{\n\t\tloader.removeEventListener(Event.COMPLETE, this._onLoadCompleteDelegate);\n\t\tloader.removeEventListener(IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate);\n\t}\n\n\tpublic stop()\n\t{\n\t\tthis.dispose();\n\t}\n\n\tprivate dispose()\n\t{\n\t\tthis._errorHandlers = null;\n\t\tthis._parseErrorHandlers = null;\n\t\tthis._context = null;\n\t\tthis._token = null;\n\t\tthis._stack = null;\n\n\t\tif (this._currentDependency && this._currentDependency._iLoader)\n\t\t\tthis.removeEventListeners(this._currentDependency._iLoader);\n\n\t\tthis._currentDependency = null;\n\n\t}\n\n\t/**\n\t * @private\n\t * This method is used by other loader classes (e.g. Loader3D and AssetLibraryBundle) to\n\t * add error event listeners to the AssetLoader instance. This system is used instead of\n\t * the regular EventDispatcher system so that the AssetLibrary error handler can be sure\n\t * that if hasEventListener() returns true, it's client code that's listening for the\n\t * event. Secondly, functions added as error handler through this custom method are\n\t * expected to return a boolean value indicating whether the event was handled (i.e.\n\t * whether they in turn had any client code listening for the event.) If no handlers\n\t * return true, the AssetLoader knows that the event wasn't handled and will throw an RTE.\n\t */\n\n\tpublic _iAddParseErrorHandler(handler)\n\t{\n\t\tif (this._parseErrorHandlers.indexOf(handler) < 0)\n\t\t\tthis._parseErrorHandlers.push(handler);\n\t}\n\n\tpublic _iAddErrorHandler(handler)\n\t{\n\t\tif (this._errorHandlers.indexOf(handler) < 0)\n\t\t\tthis._errorHandlers.push(handler);\n\t}\n\n\n\t/**\n\t * Guesses the parser to be used based on the file contents.\n\t * @param data The data to be parsed.\n\t * @param uri The url or id of the object to be parsed.\n\t * @return An instance of the guessed parser.\n\t */\n\tprivate getParserFromData(data:any):ParserBase\n\t{\n\t\tvar len:number = AssetLoader._parsers.length;\n\n\t\t// go in reverse order to allow application override of default parser added in away.proper\n\t\tfor (var i:number = len - 1; i >= 0; i--)\n\t\t\tif (AssetLoader._parsers[i].supportsData(data))\n\t\t\t\treturn new AssetLoader._parsers[i]();\n\n\t\treturn null;\n\t}\n\n\n\t/**\n\t * Initiates parsing of the loaded dependency.\n\t *\n\t * @param The dependency to be parsed.\n\t */\n\tprivate parseDependency(dependency:ResourceDependency):void\n\t{\n\t\tvar parser:ParserBase = dependency.parser;\n\n\t\t// If no parser has been defined, try to find one by letting\n\t\t// all plugged in parsers inspect the actual data.\n\t\tif (!parser)\n\t\t\tdependency._iSetParser(parser = this.getParserFromData(dependency.data));\n\n\t\tif (parser) {\n\t\t\tparser.addEventListener(ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate);\n\t\t\tparser.addEventListener(ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate);\n\t\t\tparser.addEventListener(ParserEvent.PARSE_ERROR, this._onParseErrorDelegate);\n\t\t\tparser.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate);\n\t\t\tparser.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate);\n\n\t\t\tif (dependency.request && dependency.request.url)\n\t\t\t\tparser._iFileName = dependency.request.url;\n\n\t\t\tparser.materialMode = this._materialMode;\n\n\t\t\tparser.parseAsync(dependency.data);\n\n\t\t} else {\n\t\t\tvar message:string = \"No parser defined. To enable all parsers for auto-detection, use Parsers.enableAllBundled()\"\n\t\t\tif(this.hasEventListener(ParserEvent.PARSE_ERROR))\n\t\t\t\tthis.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message));\n\t\t\telse\n\t\t\t\tthrow new Error(message);\n\t\t}\n\t}\n\n\t/**\n\t * Guesses the parser to be used based on the file extension.\n\t * @return An instance of the guessed parser.\n\t */\n\tprivate getParserFromSuffix(url:string):ParserBase\n\t{\n\t\t// Get rid of query string if any and extract extension\n\t\tvar base:string = (url.indexOf('?') > 0)? url.split('?')[0] : url;\n\t\tvar fileExtension:string = base.substr(base.lastIndexOf('.') + 1).toLowerCase();\n\n\t\tvar len:number = AssetLoader._parsers.length;\n\n\t\t// go in reverse order to allow application override of default parser added in away.proper\n\t\tfor (var i:number = len - 1; i >= 0; i--) {\n\t\t\tvar parserClass:any = AssetLoader._parsers[i];\n\t\t\tif (parserClass.supportsType(fileExtension))\n\t\t\t\treturn new parserClass();\n\t\t}\n\n\t\treturn null;\n\t}\n}\n\nexport = AssetLoader;", + "class AssetType\n{\n\tpublic static ANIMATION_NODE:string = 'animationNode';\n\tpublic static ANIMATION_SET:string = 'animationSet';\n\tpublic static ANIMATION_STATE:string = 'animationState';\n\tpublic static ANIMATOR:string = 'animator';\n\tpublic static BILLBOARD:string = 'billboard';\n\tpublic static CAMERA:string = 'camera';\n\tpublic static CONTAINER:string = 'container';\n\tpublic static EFFECTS_METHOD:string = 'effectsMethod';\n\tpublic static GEOMETRY:string = 'geometry';\n\tpublic static LINE_SEGMENT:string = 'lineSegment';\n\tpublic static LIGHT:string = 'light';\n\tpublic static LIGHT_PICKER:string = 'lightPicker';\n\tpublic static MATERIAL:string = 'material';\n\tpublic static MESH:string = 'mesh';\n\tpublic static TRIANGLE_SUB_MESH:string = 'triangleSubMesh';\n\tpublic static LINE_SUB_MESH:string = 'lineSubMesh';\n\tpublic static PRIMITIVE_PREFAB:string = 'primitivePrefab';\n\tpublic static SHADOW_MAP_METHOD:string = 'shadowMapMethod';\n\tpublic static SKELETON:string = 'skeleton';\n\tpublic static SKELETON_POSE:string = 'skeletonPose';\n\tpublic static SKYBOX:string = 'skybox';\n\tpublic static STATE_TRANSITION:string = 'stateTransition';\n\tpublic static TEXTURE:string = 'texture';\n\tpublic static TEXTURE_PROJECTOR:string = 'textureProjector';\n}\n\nexport = AssetType;", + "/**\n * Enumaration class for precedence when resolving naming conflicts in the library.\n *\n * @see away.library.AssetLibrary.conflictPrecedence\n * @see away.library.AssetLibrary.conflictStrategy\n * @see away.library.naming.ConflictStrategy\n */\nclass ConflictPrecedence\n{\n\t/**\n\t * Signals that in a conflict, the previous owner of the conflicting name\n\t * should be favored (and keep it's name) and that the newly renamed asset\n\t * is reverted to a non-conflicting name.\n\t */\n\tpublic static FAVOR_OLD:string = 'favorOld';\n\n\t/**\n\t * Signales that in a conflict, the newly renamed asset is favored (and keeps\n\t * it's newly defined name) and that the previous owner of that name gets\n\t * renamed to a non-conflicting name.\n\t */\n\tpublic static FAVOR_NEW:string = 'favorNew';\n}\n\nexport = ConflictPrecedence;", + "import ConflictPrecedence\t\t= require(\"awayjs-core/lib/core/library/ConflictPrecedence\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport AssetEvent\t\t\t\t= require(\"awayjs-core/lib/events/AssetEvent\");\n\n/**\n * Abstract base class for naming conflict resolution classes. Extend this to create a\n * strategy class which the asset library can use to resolve asset naming conflicts, or\n * use one of the bundled concrete strategy classes:\n *\n *
    \n *
  • IgnoreConflictStrategy (ConflictStrategy.IGNORE)
  • \n *
  • ErrorConflictStrategy (ConflictStrategy.THROW_ERROR)
  • \n *
  • NumSuffixConflictStrategy (ConflictStrategy.APPEND_NUM_SUFFIX)
  • \n *
\n *\n * @see away.library.AssetLibrary.conflictStrategy\n * @see away.library.ConflictStrategy\n * @see away.library.IgnoreConflictStrategy\n * @see away.library.ErrorConflictStrategy\n * @see away.library.NumSuffixConflictStrategy\n */\nclass ConflictStrategyBase\n{\n\n\tconstructor()\n\t{\n\t}\n\n\t/**\n\t * Resolve a naming conflict between two assets. Must be implemented by concrete strategy\n\t * classes.\n\t */\n\tpublic resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t * Create instance of this conflict strategy. Used internally by the AssetLibrary to\n\t * make sure the same strategy instance is not used in all AssetLibrary instances, which\n\t * would break any state caching that happens inside the strategy class.\n\t */\n\tpublic create():ConflictStrategyBase\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t * Provided as a convenience method for all conflict strategy classes, as a way to finalize\n\t * the conflict resolution by applying the new names and dispatching the correct events.\n\t */\n\tpublic _pUpdateNames(ns:string, nonConflictingName:string, oldAsset:IAsset, newAsset:IAsset, assetsDictionary:Object, precedence:string)\n\t{\n\t\tvar loser_prev_name:string;\n\t\tvar winner:IAsset;\n\t\tvar loser:IAsset;\n\n\t\twinner = (precedence === ConflictPrecedence.FAVOR_NEW)? newAsset : oldAsset;\n\t\tloser = (precedence === ConflictPrecedence.FAVOR_NEW)? oldAsset : newAsset;\n\n\t\tloser_prev_name = loser.name;\n\n\t\tassetsDictionary[winner.name] = winner;\n\t\tassetsDictionary[nonConflictingName] = loser;\n\t\tloser.resetAssetPath(nonConflictingName, ns, false);\n\n\t\tloser.dispatchEvent(new AssetEvent(AssetEvent.ASSET_CONFLICT_RESOLVED, loser, loser_prev_name));\n\t}\n}\n\nexport = ConflictStrategyBase;", + "import ConflictStrategyBase\t\t\t= require(\"awayjs-core/lib/core/library/ConflictStrategyBase\");\nimport ErrorConflictStrategy\t\t= require(\"awayjs-core/lib/core/library/ErrorConflictStrategy\");\nimport IgnoreConflictStrategy\t\t= require(\"awayjs-core/lib/core/library/IgnoreConflictStrategy\");\nimport NumSuffixConflictStrategy\t= require(\"awayjs-core/lib/core/library/NumSuffixConflictStrategy\");\n\n/**\n * Enumeration class for bundled conflict strategies. Set one of these values (or an\n * instance of a self-defined sub-class of ConflictStrategyBase) to the conflictStrategy\n * property on an AssetLibrary to define how that library resolves naming conflicts.\n *\n * The value of the AssetLibrary.conflictPrecedence property defines which\n * of the conflicting assets will get to keep it's name, and which is renamed (if any.)\n *\n * @see away.library.AssetLibrary.conflictStrategy\n * @see away.library.naming.ConflictStrategyBase\n */\nclass ConflictStrategy\n{\n\t/**\n\t * Specifies that in case of a naming conflict, one of the assets will be renamed and\n\t * a numeric suffix appended to the base name.\n\t */\n\tpublic static APPEND_NUM_SUFFIX:ConflictStrategyBase = new NumSuffixConflictStrategy();\n\n\t/**\n\t * Specifies that naming conflicts should be ignored. This is not recommended in most\n\t * cases, unless it can be 100% guaranteed that the application does not cause naming\n\t * conflicts in the library (i.e. when an app-level system is in place to prevent this.)\n\t */\n\tpublic static IGNORE:ConflictStrategyBase = new IgnoreConflictStrategy();\n\n\t/**\n\t * Specifies that an error should be thrown if a naming conflict is discovered. Use this\n\t * to be 100% sure that naming conflicts never occur unnoticed, and when it's undesirable\n\t * to have the library automatically rename assets to avoid such conflicts.\n\t */\n\tpublic static THROW_ERROR:ConflictStrategyBase = new ErrorConflictStrategy();\n\n\tconstructor(include?:ConflictStrategyBase)\n\t{\n\t\t//TODO: find out why typescript d.ts files do not include this class\n\t}\n}\n\nexport = ConflictStrategy;", + "import ConflictStrategyBase\t\t= require(\"awayjs-core/lib/core/library/ConflictStrategyBase\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\n\nclass ErrorConflictStrategy extends ConflictStrategyBase\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tpublic resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string)\n\t{\n\t\tthrow new Error('Asset name collision while AssetLibrary.namingStrategy set to AssetLibrary.THROW_ERROR. Asset path: ' + changedAsset.assetFullPath);\n\t}\n\n\tpublic create():ConflictStrategyBase\n\t{\n\t\treturn new ErrorConflictStrategy();\n\t}\n}\n\nexport = ErrorConflictStrategy;", + "import IEventDispatcher\t\t\t= require(\"awayjs-core/lib/events/IEventDispatcher\");\n\ninterface IAsset extends IEventDispatcher\n{\n\t/**\n\t *\n\t */\n\tname:string;\n\n\t/**\n\t *\n\t */\n\tid:number;\n\n\t/**\n\t *\n\t */\n\tassetNamespace:string;\n\n\t/**\n\t *\n\t */\n\tassetType:string;\n\n\t/**\n\t *\n\t */\n\tassetFullPath:Array;\n\n\t/**\n\t *\n\t * @param name\n\t * @param ns\n\t */\n\tassetPathEquals(name:string, ns:string):boolean;\n\n\t/**\n\t *\n\t * @param name\n\t * @param ns\n\t * @param overrideOriginal\n\t */\n\tresetAssetPath(name:string, ns:string, overrideOriginal?:boolean):void;\n\n\t/**\n\t *\n\t */\n\tdispose();\n\n}\n\nexport = IAsset;\n", + "class IDUtil\n{\n\t/**\n\t * @private\n\t * Char codes for 0123456789ABCDEF\n\t */\n\tprivate static ALPHA_CHAR_CODES = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70];\n\n\t/**\n\t * Generates a UID (unique identifier) based on ActionScript's\n\t * pseudo-random number generator and the current time.\n\t *\n\t *

The UID has the form\n\t * \"XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\"\n\t * where X is a hexadecimal digit (0-9, A-F).

\n\t *\n\t *

This UID will not be truly globally unique; but it is the best\n\t * we can do without player support for UID generation.

\n\t *\n\t * @return The newly-generated UID.\n\t *\n\t * @langversion 3.0\n\t * @playerversion Flash 9\n\t * @playerversion AIR 1.1\n\t * @productversion Flex 3\n\t */\n\tpublic static createUID():string\n\t{\n\t\tvar uid = new Array(36);\n\t\tvar index:number = 0;\n\n\t\tvar i:number;\n\t\tvar j:number;\n\n\t\tfor (i = 0; i < 8; i++)\n\t\t\tuid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)];\n\n\t\tfor (i = 0; i < 3; i++) {\n\t\t\tuid[index++] = 45; // charCode for \"-\"\n\n\t\t\tfor (j = 0; j < 4; j++)\n\t\t\t\tuid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)];\n\t\t}\n\n\t\tuid[index++] = 45; // charCode for \"-\"\n\n\t\tvar time:number = new Date().getTime();\n\t\t// Note: time is the number of milliseconds since 1970,\n\t\t// which is currently more than one trillion.\n\t\t// We use the low 8 hex digits of this number in the UID.\n\t\t// Just in case the system clock has been reset to\n\t\t// Jan 1-4, 1970 (in which case this number could have only\n\t\t// 1-7 hex digits), we pad on the left with 7 zeros\n\t\t// before taking the low digits.\n\t\tvar timeString:string = (\"0000000\" + time.toString(16).toUpperCase()).substr(-8);\n\n\t\tfor (i = 0; i < 8; i++)\n\t\t\tuid[index++] = timeString.charCodeAt(i);\n\n\t\tfor (i = 0; i < 4; i++)\n\t\t\tuid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)];\n\n\t\treturn String.fromCharCode.apply(null, uid);\n\t}\n\n\t/**\n\t * Returns the decimal representation of a hex digit.\n\t * @private\n\n\t private static getDigit(hex:string):number\n\t {\n\t\tswitch (hex) {\n\t\t\tcase \"A\":\n\t\t\tcase \"a\":\n\t\t\t\treturn 10;\n\t\t\tcase \"B\":\n\t\t\tcase \"b\":\n\t\t\t\treturn 11;\n\t\t\tcase \"C\":\n\t\t\tcase \"c\":\n\t\t\t\treturn 12;\n\t\t\tcase \"D\":\n\t\t\tcase \"d\":\n\t\t\t\treturn 13;\n\t\t\tcase \"E\":\n\t\t\tcase \"e\":\n\t\t\t\treturn 14;\n\t\t\tcase \"F\":\n\t\t\tcase \"f\":\n\t\t\t\treturn 15;\n\t\t\tdefault:\n\t\t\t\treturn new uint(hex);\n\t\t}\n\t}\n\t */\n\n}\n\nexport = IDUtil;", + "import ConflictStrategyBase\t\t= require(\"awayjs-core/lib/core/library/ConflictStrategyBase\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\n\nclass IgnoreConflictStrategy extends ConflictStrategyBase\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tpublic resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string)\n\t{\n\t\t// Do nothing, ignore the fact that there is a conflict.\n\t\treturn;\n\t}\n\n\tpublic create():ConflictStrategyBase\n\t{\n\t\treturn new IgnoreConflictStrategy();\n\t}\n}\n\nexport = IgnoreConflictStrategy;", + "import IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport AssetEvent\t\t\t\t= require(\"awayjs-core/lib/events/AssetEvent\");\nimport EventDispatcher\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\n\nclass NamedAssetBase extends EventDispatcher\n{\n\tpublic static ID_COUNT:number = 0;\n\n\tprivate _originalName:string;\n\tprivate _namespace:string;\n\tprivate _name:string;\n\tprivate _id:number;\n\tprivate _full_path:Array;\n\n\tpublic static DEFAULT_NAMESPACE:string = 'default';\n\n\tconstructor(name:string = null)\n\t{\n\t\tsuper();\n\n\t\tthis._id = NamedAssetBase.ID_COUNT++;\n\n\t\tif (name == null)\n\t\t\tname = 'null';\n\n\t\tthis._name = name;\n\t\tthis._originalName = name;\n\n\t\tthis.updateFullPath();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get assetType():string\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t * The original name used for this asset in the resource (e.g. file) in which\n\t * it was found. This may not be the same as name, which may\n\t * have changed due to of a name conflict.\n\t */\n\tpublic get originalName():string\n\t{\n\t\treturn this._originalName;\n\t}\n\n\t/**\n\t * A unique id for the asset, used to identify assets in an associative array\n\t */\n\tpublic get id():number\n\t{\n\t\treturn this._id;\n\t}\n\n\tpublic get name():string\n\t{\n\t\treturn this._name;\n\t}\n\n\tpublic set name(val:string)\n\t{\n\t\tvar prev:string;\n\n\t\tprev = this._name;\n\t\tthis._name = val;\n\n\t\tif (this._name == null)\n\t\t\tthis._name = 'null';\n\n\t\tthis.updateFullPath();\n\n\t\t//if (hasEventListener(AssetEvent.ASSET_RENAME))\n\t\tthis.dispatchEvent(new AssetEvent(AssetEvent.ASSET_RENAME, this, prev));\n\n\t}\n\n\tpublic dispose()\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic get assetNamespace():string\n\t{\n\t\treturn this._namespace;\n\t}\n\n\tpublic get assetFullPath():Array\n\t{\n\t\treturn this._full_path;\n\t}\n\n\tpublic assetPathEquals(name:string, ns:string):boolean\n\t{\n\t\treturn (this._name == name && (!ns || this._namespace == ns));\n\t}\n\n\tpublic resetAssetPath(name:string, ns:string = null, overrideOriginal:boolean = true):void\n\t{\n\n\t\tthis._name = name? name : 'null';\n\t\tthis._namespace = ns? ns : NamedAssetBase.DEFAULT_NAMESPACE;\n\n\t\tif (overrideOriginal)\n\t\t\tthis._originalName = this._name;\n\n\t\tthis.updateFullPath();\n\t}\n\n\tprivate updateFullPath():void\n\t{\n\t\tthis._full_path = [ this._namespace, this._name ];\n\t}\n}\n\nexport = NamedAssetBase;", + "import ConflictStrategyBase\t\t= require(\"awayjs-core/lib/core/library/ConflictStrategyBase\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\n\nclass NumSuffixConflictStrategy extends ConflictStrategyBase\n{\n\tprivate _separator:string;\n\tprivate _next_suffix:Object;\n\n\tconstructor(separator:string = '.')\n\t{\n\t\tsuper();\n\n\t\tthis._separator = separator;\n\t\tthis._next_suffix = {};\n\t}\n\n\tpublic resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string)\n\t{\n\t\tvar orig:string;\n\t\tvar new_name:string;\n\t\tvar base:string;\n\t\tvar suffix:number;\n\n\t\torig = changedAsset.name;\n\n\t\tif (orig.indexOf(this._separator) >= 0) {\n\t\t\t// Name has an ocurrence of the separator, so get base name and suffix,\n\t\t\t// unless suffix is non-numerical, in which case revert to zero and\n\t\t\t// use entire name as base\n\t\t\tbase = orig.substring(0, orig.lastIndexOf(this._separator));\n\t\t\tsuffix = parseInt(orig.substring(base.length - 1));\n\n\t\t\tif (isNaN(suffix)) {\n\t\t\t\tbase = orig;\n\t\t\t\tsuffix = 0;\n\t\t\t}\n\n\t\t} else {\n\t\t\tbase = orig;\n\t\t\tsuffix = 0;\n\t\t}\n\n\t\tif (suffix == 0 && this._next_suffix.hasOwnProperty(base)) {\n\n\t\t\tsuffix = this._next_suffix[base];\n\n\t\t}\n\n\t\t// Find the first suffixed name that does\n\t\t// not collide with other names.\n\t\tdo {\n\n\t\t\tsuffix++;\n\n\t\t\tnew_name = base.concat(this._separator, suffix.toString());\n\n\t\t} while (assetsDictionary.hasOwnProperty(new_name));\n\n\t\tthis._next_suffix[ base ] = suffix;\n\t\tthis._pUpdateNames(oldAsset.assetNamespace, new_name, oldAsset, changedAsset, assetsDictionary, precedence);\n\n\t}\n\n\tpublic create():ConflictStrategyBase\n\t{\n\t\treturn new NumSuffixConflictStrategy(this._separator);\n\t}\n}\n\nexport = NumSuffixConflictStrategy;", + "class CrossDomainPolicy\n{\n\tpublic static ANONYMOUS:string = 'anonymous';\n\n\tpublic static USE_CREDENTIALS:string = 'use-credentials';\n}\n\nexport = CrossDomainPolicy;\n", + "class URLLoaderDataFormat\n{\n\t/**\n\t * TEXT\n\t * @type {string}\n\t */\n\tpublic static TEXT:string = \"text\";\n\n\t/**\n\t * Variables / Value Pairs\n\t * @type {string}\n\t */\n\tpublic static VARIABLES:string = \"variables\";\n\n\t/**\n\t *\n\t * @type {string}\n\t */\n\tpublic static BLOB:string = \"blob\";\n\n\t/**\n\t *\n\t * @type {string}\n\t */\n\tpublic static ARRAY_BUFFER:string = \"arraybuffer\";\n\n\t/**\n\t *\n\t * @type {string}\n\t */\n\tpublic static BINARY:string = \"binary\";\n}\n\nexport = URLLoaderDataFormat;", + "import URLLoaderDataFormat\t\t\t= require(\"awayjs-core/lib/core/net/URLLoaderDataFormat\");\nimport URLRequest\t\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequest\");\nimport URLRequestMethod\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequestMethod\");\nimport URLVariables\t\t\t\t\t= require(\"awayjs-core/lib/core/net/URLVariables\");\nimport AwayEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\nimport EventDispatcher\t\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport HTTPStatusEvent\t\t\t\t= require(\"awayjs-core/lib/events/HTTPStatusEvent\");\nimport IOErrorEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/IOErrorEvent\");\nimport AwayProgressEvent\t\t\t= require(\"awayjs-core/lib/events/ProgressEvent\");\n\n/**\n * The URLLoader is used to load a single file, as part of a resource.\n *\n * While URLLoader can be used directly, e.g. to create a third-party asset\n * management system, it's recommended to use any of the classes Loader3D, AssetLoader\n * and AssetLibrary instead in most cases.\n *\n * @see AssetLoader\n * @see away.library.AssetLibrary\n */\nclass URLLoader extends EventDispatcher\n{\n\tprivate _XHR:XMLHttpRequest;\n\tprivate _bytesLoaded:number = 0;\n\tprivate _bytesTotal:number = 0;\n\tprivate _dataFormat:string = URLLoaderDataFormat.TEXT;\n\tprivate _loadError:boolean = false;\n\n\tprivate _request:URLRequest;\n\tprivate _data:any;\n\n\tprivate _loadStartEvent:AwayEvent;\n\tprivate _loadErrorEvent:IOErrorEvent;\n\tprivate _loadCompleteEvent:AwayEvent;\n\tprivate _progressEvent:AwayProgressEvent;\n\n\t/**\n\t * Creates a new URLLoader object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get url():string\n\t{\n\n\t\treturn this._request? this._request.url : '';\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get data():any\n\t{\n\t\treturn this._data;\n\t}\n\n\n\t/**\n\t *\n\t * URLLoaderDataFormat.BINARY\n\t * URLLoaderDataFormat.TEXT\n\t * URLLoaderDataFormat.VARIABLES\n\t *\n\t * @param format\n\t */\n\tpublic set dataFormat(format:string)\n\t{\n\t\tthis._dataFormat = format;\n\t}\n\n\tpublic get dataFormat():string\n\t{\n\t\treturn this._dataFormat;\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get bytesLoaded():number\n\t{\n\t\treturn this._bytesLoaded;\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get bytesTotal():number\n\t{\n\t\treturn this._bytesTotal;\n\t}\n\n\t/**\n\t * Load a resource from a file.\n\t *\n\t * @param request The URLRequest object containing the URL of the object to be loaded.\n\t */\n\tpublic load(request:URLRequest):void\n\t{\n\t\tthis._request = request;\n\n\t\tthis.initXHR();\n\n\t\tif (request.method === URLRequestMethod.POST)\n\t\t\tthis.postRequest(request);\n\t\telse\n\t\t\tthis.getRequest(request);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic close():void\n\t{\n\t\tthis._XHR.abort();\n\t\tthis.disposeXHR();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose():void\n\t{\n\t\tif (this._XHR)\n\t\t\tthis._XHR.abort();\n\n\t\tthis.disposeXHR();\n\n\t\tthis._data = null;\n\t\tthis._dataFormat = null;\n\t\tthis._bytesLoaded = null;\n\t\tthis._bytesTotal = null;\n\t}\n\n\t/**\n\t *\n\t * @param xhr\n\t * @param responseType\n\t */\n\tprivate setResponseType(xhr:XMLHttpRequest, responseType:string):void\n\t{\n\t\tswitch (responseType) {\n\t\t\tcase URLLoaderDataFormat.ARRAY_BUFFER:\n\t\t\tcase URLLoaderDataFormat.BLOB:\n\t\t\tcase URLLoaderDataFormat.TEXT:\n\t\t\t\txhr.responseType = responseType;\n\t\t\t\tbreak;\n\n\t\t\tcase URLLoaderDataFormat.VARIABLES:\n\t\t\t\txhr.responseType = URLLoaderDataFormat.TEXT;\n\t\t\t\tbreak;\n\n\t\t\tcase URLLoaderDataFormat.BINARY:\n\t\t\t\txhr.responseType = '';\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param request {URLRequest}\n\t */\n\tprivate getRequest(request:URLRequest):void\n\t{\n\t\ttry {\n\t\t\tthis._XHR.open(request.method, request.url, request.async);\n\t\t\tthis.setResponseType(this._XHR, this._dataFormat);\n\t\t\tthis._XHR.send(); // No data to send\n\t\t} catch (e /* */) {\n\t\t\tthis.handleXmlHttpRequestException(e);\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param request {URLRequest}\n\t */\n\tprivate postRequest(request:URLRequest):void\n\t{\n\t\tthis._loadError = false;\n\n\t\tthis._XHR.open(request.method, request.url, request.async);\n\n\t\tif (request.data != null) {\n\t\t\tif (request.data instanceof URLVariables) {\n\t\t\t\tvar urlVars:URLVariables = request.data;\n\n\t\t\t\ttry {\n\t\t\t\t\tthis._XHR.responseType = 'text';\n\t\t\t\t\tthis._XHR.send(urlVars.formData);\n\t\t\t\t} catch (e /* */) {\n\t\t\t\t\tthis.handleXmlHttpRequestException(e);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.setResponseType(this._XHR, this._dataFormat);\n\n\t\t\t\tif (request.data)\n\t\t\t\t\tthis._XHR.send(request.data); // TODO: Test\n\t\t\t\telse\n\t\t\t\t\tthis._XHR.send(); // no data to send\n\t\t\t}\n\t\t} else {\n\t\t\tthis._XHR.send(); // No data to send\n\t\t}\n\n\t}\n\n\t/**\n\t *\n\t * @param error {XMLHttpRequestException}\n\t */\n\tprivate handleXmlHttpRequestException(error:any /* */):void\n\t{\n\t\tswitch (error.code) {\n\n\t\t/******************************************************************************************************************************************************************************************************\n\t\t *\n\t\t * XMLHttpRequestException { message: \"NETWORK_ERR: XMLHttpRequest Exception 101\", name: \"NETWORK_ERR\", code: 101, stack: \"Error: A network error occurred in synchronous req…\",NETWORK_ERR: 101… }\n\t\t * code: 101 , message: \"NETWORK_ERR: XMLHttpRequest Exception 101\" , name: \"NETWORK_ERR\"\n\t\t *\n\t\t ******************************************************************************************************************************************************************************************************/\n\n\t\t\tcase 101:\n\t\t\t\t// Note: onLoadError event throws IO_ERROR event - this case is already Covered\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t */\n\tprivate initXHR()\n\t{\n\t\tif (!this._XHR) {\n\t\t\tthis._XHR = new XMLHttpRequest();\n\n\t\t\tthis._XHR.onloadstart = (event:ProgressEvent) => this.onLoadStart(event); // loadstart\t - When the request starts.\n\t\t\tthis._XHR.onprogress = (event:ProgressEvent) => this.onProgress(event);\t // progress\t - While loading and sending data.\n\t\t\tthis._XHR.onabort = (event:UIEvent) => this.onAbort(event);\t // abort\t - When the request has been aborted, either by invoking the abort() method or navigating away from the page.\n\t\t\tthis._XHR.onerror = (event:ErrorEvent) => this.onLoadError(event); // error\t - When the request has failed.\n\t\t\tthis._XHR.onload = (event:Event) => this.onLoadComplete(event); // load\t - When the request has successfully completed.\n\t\t\tthis._XHR.ontimeout = (event:Event) => this.onTimeOut(event); // timeout\t - When the author specified timeout has passed before the request could complete.\n\t\t\tthis._XHR.onloadend = (event:ProgressEvent) => this.onLoadEnd(event); // loadend\t - When the request has completed, regardless of whether or not it was successful.\n\t\t\tthis._XHR.onreadystatechange = (event:Event) => this.onReadyStateChange(event); // onreadystatechange - When XHR state changes\n\t\t}\n\t}\n\n\t/**\n\t *\n\t */\n\tprivate disposeXHR()\n\t{\n\t\tif (this._XHR !== null) {\n\t\t\tthis._XHR.onloadstart = null;\n\t\t\tthis._XHR.onprogress = null;\n\t\t\tthis._XHR.onabort = null;\n\t\t\tthis._XHR.onerror = null;\n\t\t\tthis._XHR.onload = null;\n\t\t\tthis._XHR.ontimeout = null;\n\t\t\tthis._XHR.onloadend = null;\n\t\t\tthis._XHR = null;\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @param source\n\t */\n\tpublic decodeURLVariables(source:string):Object\n\t{\n\t\tvar result:Object = new Object();\n\n\t\tsource = source.split(\"+\").join(\" \");\n\n\t\tvar tokens, re = /[?&]?([^=]+)=([^&]*)/g;\n\n\t\twhile (tokens = re.exec(source))\n\t\t\tresult[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);\n\n\t\treturn result;\n\t}\n\n\t// XMLHttpRequest - Event Handlers\n\n\t/**\n\t * When XHR state changes\n\t * @param event\n\t */\n\tprivate onReadyStateChange(event:Event)\n\t{\n\t\tif (this._XHR.readyState == 4) {\n\t\t\tif (this._XHR.status == 404) {\n\t\t\t\tthis._loadError = true;\n\n\t\t\t\tif (!this._loadErrorEvent)\n\t\t\t\t\tthis._loadErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR);\n\n\t\t\t\tthis.dispatchEvent(this._loadErrorEvent);\n\t\t\t}\n\n\t\t\tthis.dispatchEvent(new HTTPStatusEvent(HTTPStatusEvent.HTTP_STATUS, this._XHR.status));\n\t\t}\n\t}\n\n\t/**\n\t * When the request has completed, regardless of whether or not it was successful.\n\t * @param event\n\t */\n\tprivate onLoadEnd(event:ProgressEvent)\n\t{\n\t\tif (this._loadError === true)\n\t\t\treturn;\n\t}\n\n\t/**\n\t * When the author specified timeout has passed before the request could complete.\n\t * @param event\n\t */\n\tprivate onTimeOut(event:Event)\n\t{\n\t\t//TODO: Timeout not currently implemented ( also not part of AS3 API )\n\t}\n\n\t/**\n\t * When the request has been aborted, either by invoking the abort() method or navigating away from the page.\n\t * @param event\n\t */\n\tprivate onAbort(event:UIEvent)\n\t{\n\t\t// TODO: investigate whether this needs to be an IOError\n\t}\n\n\t/**\n\t * While loading and sending data.\n\t * @param event\n\t */\n\tprivate onProgress(event:ProgressEvent)\n\t{\n\t\tif (!this._progressEvent)\n\t\t\tthis._progressEvent = new AwayProgressEvent(AwayProgressEvent.PROGRESS);\n\n\t\tthis._progressEvent.bytesTotal = event.total;\n\t\tthis._progressEvent.bytesLoaded = event.loaded;\n\n\t\tthis.dispatchEvent(this._progressEvent);\n\t}\n\n\t/**\n\t * When the request starts.\n\t * @param event\n\t */\n\tprivate onLoadStart(event:ProgressEvent)\n\t{\n\t\tif (!this._loadStartEvent)\n\t\t\tthis._loadStartEvent = new AwayEvent(AwayEvent.OPEN);\n\n\t\tthis.dispatchEvent(this._loadStartEvent);\n\t}\n\n\t/**\n\t * When the request has successfully completed.\n\t * @param event\n\t */\n\tprivate onLoadComplete(event:Event)\n\t{\n\t\tif (this._loadError === true)\n\t\t\treturn;\n\n\t\tswitch (this._dataFormat) {\n\t\t\tcase URLLoaderDataFormat.TEXT:\n\t\t\t\tthis._data = this._XHR.responseText;\n\t\t\t\tbreak;\n\n\t\t\tcase URLLoaderDataFormat.VARIABLES:\n\t\t\t\tthis._data = this.decodeURLVariables(this._XHR.responseText);\n\t\t\t\tbreak;\n\n\t\t\tcase URLLoaderDataFormat.BLOB:\n\t\t\tcase URLLoaderDataFormat.ARRAY_BUFFER:\n\t\t\tcase URLLoaderDataFormat.BINARY:\n\t\t\t\tthis._data = this._XHR.response;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthis._data = this._XHR.responseText;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif (!this._loadCompleteEvent)\n\t\t\tthis._loadCompleteEvent = new AwayEvent(AwayEvent.COMPLETE);\n\n\t\tthis.dispatchEvent(this._loadCompleteEvent);\n\t}\n\n\t/**\n\t * When the request has failed. ( due to network issues ).\n\t * @param event\n\t */\n\tprivate onLoadError(event:Event)\n\t{\n\t\tthis._loadError = true;\n\n\t\tif (!this._loadErrorEvent)\n\t\t\tthis._loadErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR);\n\n\t\tthis.dispatchEvent(this._loadErrorEvent);\n\t}\n}\n\nexport = URLLoader;", + "class URLRequestMethod\n{\n\t/**\n\t *\n\t * @type {string}\n\t */\n\tpublic static POST:string = 'POST';\n\t/**\n\t *\n\t * @type {string}\n\t */\n\tpublic static GET:string = 'GET';\n}\n\nexport = URLRequestMethod;", + "import URLRequestMethod\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequestMethod\");\n\nclass URLRequest\n{\n\t/*\n\t * The MIME content type of the content in the the data property.\n\t * @type {string}\n\t */\n\t//public contentType : string = 'application/x-www-form-urlencoded'; //Note: Not used for now.\n\n\t/**\n\t * Object containing data to be transmited with URL Request ( URL Variables / binary / string )\n\t *\n\t */\n\tpublic data:any;\n\n\t/**\n\t *\n\t * away.net.URLRequestMethod.GET\n\t * away.net.URLRequestMethod.POST\n\t *\n\t * @type {string}\n\t */\n\tpublic method:string = URLRequestMethod.GET;\n\n\t/**\n\t * Use asynchronous XMLHttpRequest\n\t * @type {boolean}\n\t */\n\tpublic async:boolean = true;\n\n\t/**\n\t *\n\t */\n\tprivate _url:string;\n\n\t/**\n\n\t * @param url\n\t */\n\tconstructor(url:string = null)\n\t{\n\t\tthis._url = url;\n\t}\n\n\t/**\n\t *\n\t * @returns {string}\n\t */\n\tpublic get url():string\n\t{\n\t\treturn this._url;\n\t}\n\n\t/**\n\t *\n\t * @param value\n\t */\n\tpublic set url(value:string)\n\t{\n\t\tthis._url = value;\n\t}\n\n\t/**\n\t * dispose\n\t */\n\tpublic dispose():void\n\t{\n\t\tthis.data = null;\n\t\tthis._url = null;\n\t}\n}\n\nexport = URLRequest;", + "class URLVariables\n{\n\tprivate _variables:Object = new Object();\n\n\t/**\n\t *\n\t * @param source\n\t */\n\tconstructor(source:string = null)\n\t{\n\t\tif (source !== null)\n\t\t\tthis.decode(source);\n\t}\n\n\t/**\n\t *\n\t * @param source\n\t */\n\tpublic decode(source:string):void\n\t{\n\t\tsource = source.split(\"+\").join(\" \");\n\n\t\tvar tokens, re = /[?&]?([^=]+)=([^&]*)/g;\n\n\t\twhile (tokens = re.exec(source))\n\t\t\tthis._variables[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);\n\t}\n\n\t/**\n\t *\n\t * @returns {string}\n\t */\n\tpublic toString():string\n\t{\n\t\treturn '';\n\t}\n\n\t/**\n\t *\n\t * @returns {Object}\n\t */\n\tpublic get variables():Object\n\t{\n\t\treturn this._variables;\n\t}\n\n\t/**\n\t *\n\t * @returns {Object}\n\t */\n\tpublic get formData():FormData\n\t{\n\t\tvar fd:FormData = new FormData();\n\n\t\tfor (var s in this._variables)\n\t\t\tfd.append(s, this._variables[s]);\n\n\t\treturn fd;\n\t}\n\n\t/**\n\t *\n\t * @returns {Object}\n\t */\n\tpublic set variables(obj:Object)\n\t{\n\t\tthis._variables = obj;\n\t}\n}\n\nexport = URLVariables;", + "import EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.partition.CameraNode\n */\nclass CameraNode extends EntityNode\n{\n\tconstructor(camera:IEntity)\n\t{\n\t\tsuper(camera);\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic acceptTraverser(traverser:ICollector)\n\t{\n\t\t// todo: dead end for now, if it has a debug mesh, then sure accept that\n\t}\n}\n\nexport = CameraNode;", + "import EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.partition.DirectionalLightNode\n */\nclass DirectionalLightNode extends EntityNode\n{\n\tprivate _directionalLight:IEntity;\n\n\t/**\n\t *\n\t * @param directionalLight\n\t */\n\tconstructor(directionalLight:IEntity)\n\t{\n\t\tsuper(directionalLight);\n\n\t\tthis._directionalLight = directionalLight;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic acceptTraverser(traverser:ICollector)\n\t{\n\t\tif (traverser.enterNode(this))\n\t\t\ttraverser.applyDirectionalLight(this._directionalLight);\n\t}\n\n\t/**\n\t *\n\t * @returns {boolean}\n\t */\n\tpublic isCastingShadow():boolean\n\t{\n\t\treturn false;\n\t}\n}\n\nexport = DirectionalLightNode;", + "import Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.partition.EntityNode\n */\nclass EntityNode extends NodeBase\n{\n\n\tprivate _entity:IEntity;\n\tpublic _iUpdateQueueNext:EntityNode;\n\n\tconstructor(entity:IEntity)\n\t{\n\t\tsuper();\n\t\tthis._entity = entity;\n\t\tthis._iNumEntities = 1;\n\t}\n\n\tpublic get entity():IEntity\n\t{\n\t\treturn this._entity;\n\t}\n\n\tpublic removeFromParent():void\n\t{\n\t\tif (this._iParent)\n\t\t\tthis._iParent.iRemoveNode(this);\n\n\t\tthis._iParent = null;\n\t}\n\n\t/**\n\t *\n\t * @returns {boolean}\n\t */\n\tpublic isCastingShadow():boolean\n\t{\n\t\treturn this.entity.castsShadows;\n\t}\n\n\t/**\n\t *\n\t * @param planes\n\t * @param numPlanes\n\t * @returns {boolean}\n\t */\n\tpublic isInFrustum(planes:Array, numPlanes:number):boolean\n\t{\n\t\tif (!this._entity._iIsVisible())\n\t\t\treturn false;\n\n\t\treturn this._entity.worldBounds.isInFrustum(planes, numPlanes);\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic acceptTraverser(traverser:ICollector)\n\t{\n\t\tif (traverser.enterNode(this))\n\t\t\ttraverser.applyEntity(this._entity);\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean\n\t{\n\t\tif (!this._entity._iIsVisible())\n\t\t\treturn false;\n\n\t\treturn this._entity.isIntersectingRay(rayPosition, rayDirection);\n\t}\n\n\t/**\n\t *\n\t * @protected\n\t */\n\tpublic _pCreateBoundsPrimitive():IEntity\n\t{\n\t\treturn this._entity.bounds.boundingEntity;\n\t}\n}\n\nexport = EntityNode;", + "import EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.partition.LightProbeNode\n */\nclass LightProbeNode extends EntityNode\n{\n\tprivate _lightProbe:IEntity;\n\n\t/**\n\t *\n\t * @param lightProbe\n\t */\n\tconstructor(lightProbe:IEntity)\n\t{\n\t\tsuper(lightProbe);\n\n\t\tthis._lightProbe = lightProbe;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic acceptTraverser(traverser:ICollector)\n\t{\n\t\tif (traverser.enterNode(this))\n\t\t\ttraverser.applyLightProbe(this._lightProbe);\n\t}\n\n\t/**\n\t *\n\t * @returns {boolean}\n\t */\n\tpublic isCastingShadow():boolean\n\t{\n\t\treturn false;\n\t}\n}\n\nexport = LightProbeNode;", + "import Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.partition.NodeBase\n */\nclass NodeBase\n{\n\tprivate _boundsChildrenVisible:boolean;\n\tprivate _explicitBoundsVisible:boolean;\n\tprivate _implicitBoundsVisible:boolean;\n\tpublic _iParent:NodeBase;\n\tpublic _pChildNodes:Array;\n\tpublic _pNumChildNodes:number = 0;\n\tpublic _pBoundsPrimitive:IEntity;\n\n\tpublic _iNumEntities:number = 0;\n\tpublic _iCollectionMark:number;// = 0;\n\n\t/**\n\t *\n\t */\n\tpublic get boundsVisible():boolean\n\t{\n\t\treturn this._explicitBoundsVisible;\n\t}\n\n\tpublic set boundsVisible(value:boolean)\n\t{\n\t\tif (this._explicitBoundsVisible == value)\n\t\t\treturn;\n\n\t\tthis._explicitBoundsVisible = value;\n\n\t\tthis._iUpdateImplicitBoundsVisible(this._iParent? this._iParent.boundsChildrenVisible : false);\n\n\t}\n\n\tpublic get boundsChildrenVisible():boolean\n\t{\n\t\treturn this._boundsChildrenVisible;\n\t}\n\n\tpublic set boundsChildrenVisible(value:boolean)\n\t{\n\t\tif (this._boundsChildrenVisible == value)\n\t\t\treturn;\n\n\t\tthis._boundsChildrenVisible = value;\n\n\t\tfor (var i:number = 0; i < this._pNumChildNodes; ++i)\n\t\t\tthis._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get parent():NodeBase\n\t{\n\t\treturn this._iParent;\n\t}\n\n\t/**\n\t *\n\t * @protected\n\t */\n\tpublic get _pNumEntities():number\n\t{\n\t\treturn this._iNumEntities;\n\t}\n\n\t/**\n\t *\n\t */\n\tconstructor()\n\t{\n\t\tthis._pChildNodes = new Array();\n\t}\n\n\t/**\n\t *\n\t * @param planes\n\t * @param numPlanes\n\t * @returns {boolean}\n\t * @internal\n\t */\n\tpublic isInFrustum(planes:Array, numPlanes:number):boolean\n\t{\n\t\treturn true;\n\t}\n\n\t/**\n\t *\n\t * @param rayPosition\n\t * @param rayDirection\n\t * @returns {boolean}\n\t */\n\tpublic isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean\n\t{\n\t\treturn true;\n\t}\n\n\t/**\n\t *\n\t * @returns {boolean}\n\t */\n\tpublic isCastingShadow():boolean\n\t{\n\t\treturn true;\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t * @returns {away.partition.NodeBase}\n\t */\n\tpublic findPartitionForEntity(entity:IEntity):NodeBase\n\t{\n\t\treturn this;\n\t}\n\n\t/**\n\t *\n\t * @param traverser\n\t */\n\tpublic acceptTraverser(traverser:ICollector)\n\t{\n\t\tif (this._pNumEntities == 0 && !this._implicitBoundsVisible)\n\t\t\treturn;\n\n\t\tif (traverser.enterNode(this)) {\n\t\t\tvar i:number = 0;\n\n\t\t\twhile (i < this._pNumChildNodes)\n\t\t\t\tthis._pChildNodes[i++].acceptTraverser(traverser);\n\n\t\t\tif (this._implicitBoundsVisible)\n\t\t\t\tthis._pBoundsPrimitive.partitionNode.acceptTraverser(traverser);\n\t\t}\n\t}\n\n\t/**\n\t *\n\t * @protected\n\t */\n\tpublic _pCreateBoundsPrimitive():IEntity\n\t{\n\t\treturn null;\n\t}\n\n\t/**\n\t *\n\t * @param node\n\t * @internal\n\t */\n\tpublic iAddNode(node:NodeBase)\n\t{\n\t\tnode._iParent = this;\n\t\tthis._iNumEntities += node._pNumEntities;\n\t\tthis._pChildNodes[ this._pNumChildNodes++ ] = node;\n\n\t\tnode._iUpdateImplicitBoundsVisible(this.boundsChildrenVisible);\n\n\t\tvar numEntities:number = node._pNumEntities;\n\t\tnode = this;\n\n\t\tdo {\n\t\t\tnode._iNumEntities += numEntities;\n\t\t} while ((node = node._iParent) != null);\n\t}\n\n\t/**\n\t *\n\t * @param node\n\t * @internal\n\t */\n\tpublic iRemoveNode(node:NodeBase)\n\t{\n\t\tvar index:number = this._pChildNodes.indexOf(node);\n\t\tthis._pChildNodes[index] = this._pChildNodes[--this._pNumChildNodes];\n\t\tthis._pChildNodes.pop();\n\n\t\tnode._iUpdateImplicitBoundsVisible(false);\n\n\t\tvar numEntities:number = node._pNumEntities;\n\t\tnode = this;\n\n\t\tdo {\n\t\t\tnode._pNumEntities -= numEntities;\n\t\t} while ((node = node._iParent) != null);\n\t}\n\n\tprivate _iUpdateImplicitBoundsVisible(value:boolean)\n\t{\n\t\tif (this._implicitBoundsVisible == this._explicitBoundsVisible || value)\n\t\t\treturn;\n\n\t\tthis._implicitBoundsVisible = this._explicitBoundsVisible || value;\n\n\t\tthis._iUpdateEntityBounds();\n\n\t\tfor (var i:number = 0; i < this._pNumChildNodes; ++i)\n\t\t\tthis._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible);\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tpublic _iIsBoundsVisible():boolean\n\t{\n\t\treturn this._implicitBoundsVisible;\n\t}\n\n//\t\tpublic _pUpdateNumEntities(value:number)\n//\t\t{\n//\t\t\tvar diff:number = value - this._pNumEntities;\n//\t\t\tvar node:NodeBase = this;\n//\n//\t\t\tdo {\n//\t\t\t\tnode._pNumEntities += diff;\n//\t\t\t} while ((node = node._iParent) != null);\n//\t\t}\n\n\tpublic _iUpdateEntityBounds()\n\t{\n\t\tif (this._pBoundsPrimitive) {\n\t\t\tthis._pBoundsPrimitive.dispose();\n\t\t\tthis._pBoundsPrimitive = null;\n\t\t}\n\n\t\tif (this._implicitBoundsVisible)\n\t\t\tthis._pBoundsPrimitive = this._pCreateBoundsPrimitive();\n\t}\n}\n\nexport = NodeBase;", + "/**\n * @class away.partition.NullNode\n */\nclass NullNode\n{\n\tconstructor()\n\t{\n\t}\n}\n\nexport = NullNode;", + "import DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport NullNode\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NullNode\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\n\n/**\n * @class away.partition.Partition\n */\nclass Partition\n{\n\n\tpublic _rootNode:NodeBase;\n\tprivate _updatesMade:Boolean = false;\n\tprivate _updateQueue:EntityNode;\n\n\tconstructor(rootNode:NodeBase)\n\t{\n\t\tthis._rootNode = rootNode || new NullNode();\n\t}\n\n\tpublic get rootNode():NodeBase\n\t{\n\t\treturn this._rootNode;\n\t}\n\n\tpublic traverse(traverser:ICollector)\n\t{\n\t\tif (this._updatesMade)\n\t\t\tthis.updateEntities();\n\n\t\tthis._rootNode.acceptTraverser(traverser);\n\t}\n\n\tpublic iMarkForUpdate(entity:DisplayObject)\n\t{\n\t\tvar node:EntityNode = entity.partitionNode;\n\t\tvar t:EntityNode = this._updateQueue;\n\n\t\twhile (t) {\n\t\t\tif (node == t)\n\t\t\t\treturn;\n\n\t\t\tt = t._iUpdateQueueNext;\n\t\t}\n\n\t\tnode._iUpdateQueueNext = this._updateQueue;\n\n\t\tthis._updateQueue = node;\n\t\tthis._updatesMade = true;\n\t}\n\n\tpublic iRemoveEntity(entity:DisplayObject)\n\t{\n\t\tvar node:EntityNode = entity.partitionNode;\n\t\tvar t:EntityNode;\n\n\t\tnode.removeFromParent();\n\n\t\tif (node == this._updateQueue) {\n\t\t\tthis._updateQueue = node._iUpdateQueueNext;\n\t\t} else {\n\t\t\tt = this._updateQueue;\n\t\t\twhile (t && t._iUpdateQueueNext != node)\n\t\t\t\tt = t._iUpdateQueueNext;\n\n\t\t\tif (t)\n\t\t\t\tt._iUpdateQueueNext = node._iUpdateQueueNext;\n\t\t}\n\n\t\tnode._iUpdateQueueNext = null;\n\n\t\tif (!this._updateQueue)\n\t\t\tthis._updatesMade = false;\n\t}\n\n\tprivate updateEntities()\n\t{\n\t\tvar node:EntityNode = this._updateQueue;\n\t\tvar targetNode:NodeBase;\n\t\tvar t:EntityNode;\n\t\tthis._updateQueue = null;\n\t\tthis._updatesMade = false;\n\n\t\tdo {\n\t\t\ttargetNode = this._rootNode.findPartitionForEntity(node.entity);\n\n\t\t\tif (node.parent != targetNode) {\n\t\t\t\tif (node)\n\t\t\t\t\tnode.removeFromParent();\n\n\t\t\t\ttargetNode.iAddNode(node);\n\t\t\t}\n\n\t\t\tt = node._iUpdateQueueNext;\n\t\t\tnode._iUpdateQueueNext = null;\n\n\t\t\t//required for controllers with autoUpdate set to true\n\t\t\tnode.entity._iInternalUpdate();\n\n\t\t} while ((node = t) != null);\n\t}\n}\n\nexport = Partition;", + "import NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.partition.PointLightNode\n */\nclass PointLightNode extends EntityNode\n{\n\tprivate _pointLight:IEntity;\n\n\t/**\n\t *\n\t * @param pointLight\n\t */\n\tconstructor(pointLight:IEntity)\n\t{\n\t\tsuper(pointLight);\n\n\t\tthis._pointLight = pointLight;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic acceptTraverser(traverser:ICollector)\n\t{\n\t\tif (traverser.enterNode( this))\n\t\t\ttraverser.applyPointLight(this._pointLight);\n\t}\n\n\t/**\n\t *\n\t * @returns {boolean}\n\t */\n\tpublic isCastingShadow():boolean\n\t{\n\t\treturn false;\n\t}\n}\n\nexport = PointLightNode;", + "import Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * SkyboxNode is a space partitioning leaf node that contains a Skybox object.\n *\n * @class away.partition.SkyboxNode\n */\nclass SkyboxNode extends EntityNode\n{\n\tprivate _skyBox:IEntity;\n\n\t/**\n\t * Creates a new SkyboxNode object.\n\t * @param skyBox The Skybox to be contained in the node.\n\t */\n\tconstructor(skyBox:IEntity)\n\t{\n\t\tsuper(skyBox);\n\n\t\tthis._skyBox = skyBox;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic acceptTraverser(traverser:ICollector)\n\t{\n\t\tif (traverser.enterNode( this))\n\t\t\ttraverser.applySkybox(this._skyBox);\n\t}\n\n\t/**\n\t *\n\t * @param planes\n\t * @param numPlanes\n\t * @returns {boolean}\n\t */\n\tpublic isInFrustum(planes:Array, numPlanes:number):boolean\n\t{\n\t\tif (!this._skyBox._iIsVisible)\n\t\t\treturn false;\n\n\t\t//a skybox is always in view unless its visibility is set to false\n\t\treturn true;\n\t}\n}\n\nexport = SkyboxNode;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport View\t\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/View\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport PickingCollisionVO\t\t\t= require(\"awayjs-core/lib/core/pick/PickingCollisionVO\");\n\n/**\n * Provides an interface for picking objects that can pick 3d objects from a view or scene.\n *\n * @interface away.pick.IPicker\n */\ninterface IPicker\n{\n\t/**\n\t * Gets the collision object from the screen coordinates of the picking ray.\n\t *\n\t * @param x The x coordinate of the picking ray in screen-space.\n\t * @param y The y coordinate of the picking ray in screen-space.\n\t * @param view The view on which the picking object acts.\n\t */\n\tgetViewCollision(x:number, y:number, view:View):PickingCollisionVO;\n\n\t/**\n\t * Gets the collision object from the scene position and direction of the picking ray.\n\t *\n\t * @param position The position of the picking ray in scene-space.\n\t * @param direction The direction of the picking ray in scene-space.\n\t * @param scene The scene on which the picking object acts.\n\t */\n\tgetSceneCollision(position:Vector3D, direction:Vector3D, scene:Scene):PickingCollisionVO;\n\n\t/**\n\t * Determines whether the picker takes account of the mouseEnabled properties of entities. Defaults to true.\n\t */\n\tonlyMouseEnabled:boolean; // GET / SET\n\n\t/**\n\t * Disposes memory used by the IPicker object\n\t */\n\tdispose();\n}\n\nexport = IPicker;", + "import Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport PickingCollisionVO\t\t\t= require(\"awayjs-core/lib/core/pick/PickingCollisionVO\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * Provides an interface for picking colliders that can be assigned to individual entities in a scene for specific picking behaviour.\n * Used with the RaycastPicker picking object.\n *\n * @see away.entities.Entity#pickingCollider\n * @see away.pick.RaycastPicker\n *\n * @interface away.pick.IPickingCollider\n */\ninterface IPickingCollider\n{\n\t/**\n\t * Sets the position and direction of a picking ray in local coordinates to the entity.\n\t *\n\t * @param localDirection The position vector in local coordinates\n\t * @param localPosition The direction vector in local coordinates\n\t */\n\tsetLocalRay(localPosition:Vector3D, localDirection:Vector3D);\n\n\t/**\n\t * Tests a Billboard object for a collision with the picking ray.\n\t *\n\t * @param entity The entity instance to be tested.\n\t * @param pickingCollisionVO The collision object used to store the collision results\n\t * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray.\n\t */\n\ttestBillboardCollision(entity:IEntity, pickingCollisionVO:PickingCollisionVO, shortestCollisionDistance:number):boolean\n\n\t/**\n\t * Tests a Mesh object for a collision with the picking ray.\n\t *\n\t * @param entity The entity instance to be tested.\n\t * @param pickingCollisionVO The collision object used to store the collision results\n\t * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray.\n\t * @param findClosest\n\t */\n\ttestMeshCollision(entity:IEntity, pickingCollisionVO:PickingCollisionVO, shortestCollisionDistance:number, findClosest:boolean):boolean\n}\n\nexport = IPickingCollider;", + "import DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport IMaterialOwner\t\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport Point\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\n\n/**\n * Value object for a picking collision returned by a picking collider. Created as unique objects on display objects\n *\n * @see away.base.DisplayObject#pickingCollisionVO\n * @see away.core.pick.IPickingCollider\n *\n * @class away.pick.PickingCollisionVO\n */\nclass PickingCollisionVO\n{\n\t/**\n\t * The display object to which this collision object belongs.\n\t */\n\tpublic displayObject:DisplayObject;\n\n\t/**\n\t * The local position of the collision on the entity's surface.\n\t */\n\tpublic localPosition:Vector3D;\n\n\t/**\n\t * The local normal vector at the position of the collision.\n\t */\n\tpublic localNormal:Vector3D;\n\n\t/**\n\t * The uv coordinate at the position of the collision.\n\t */\n\tpublic uv:Point;\n\n\t/**\n\t * The index of the face where the event took pl ace.\n\t */\n\tpublic index:number;\n\n\t/**\n\t * The index of the subGeometry where the event took place.\n\t */\n//\t\tpublic subGeometryIndex:number;\n\n\t/**\n\t * The starting position of the colliding ray in local coordinates.\n\t */\n\tpublic localRayPosition:Vector3D;\n\n\t/**\n\t * The direction of the colliding ray in local coordinates.\n\t */\n\tpublic localRayDirection:Vector3D;\n\n\t/**\n\t * The starting position of the colliding ray in scene coordinates.\n\t */\n\tpublic rayPosition:Vector3D;\n\n\t/**\n\t * The direction of the colliding ray in scene coordinates.\n\t */\n\tpublic rayDirection:Vector3D;\n\n\t/**\n\t * Determines if the ray position is contained within the entity bounds.\n\t *\n\t * @see away3d.entities.Entity#bounds\n\t */\n\tpublic rayOriginIsInsideBounds:boolean;\n\n\t/**\n\t * The distance along the ray from the starting position to the calculated intersection entry point with the entity.\n\t */\n\tpublic rayEntryDistance:number;\n\n\t/**\n\t * The material ownwer associated with a collision.\n\t */\n\tpublic materialOwner:IMaterialOwner;\n\n\t/**\n\t * Creates a new PickingCollisionVO object.\n\t *\n\t * @param entity The entity to which this collision object belongs.\n\t */\n\tconstructor(displayObject:DisplayObject)\n\t{\n\t\tthis.displayObject = displayObject;\n\t}\n\n}\n\nexport = PickingCollisionVO;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport View\t\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/View\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IPicker\t\t\t\t\t\t= require(\"awayjs-core/lib/core/pick/IPicker\");\nimport PickingCollisionVO\t\t\t= require(\"awayjs-core/lib/core/pick/PickingCollisionVO\");\nimport EntityListItem\t\t\t\t= require(\"awayjs-core/lib/core/pool/EntityListItem\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport RaycastCollector\t\t\t\t= require(\"awayjs-core/lib/core/traverse/RaycastCollector\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * Picks a 3d object from a view or scene by 3D raycast calculations.\n * Performs an initial coarse boundary calculation to return a subset of entities whose bounding volumes intersect with the specified ray,\n * then triggers an optional picking collider on individual entity objects to further determine the precise values of the picking ray collision.\n *\n * @class away.pick.RaycastPicker\n */\nclass RaycastPicker implements IPicker\n{\n\tprivate _findClosestCollision:boolean;\n\tprivate _raycastCollector:RaycastCollector;\n\tprivate _ignoredEntities = [];\n\tprivate _onlyMouseEnabled:boolean = true;\n\n\tprivate _entities:Array;\n\tprivate _numEntities:number = 0;\n\tprivate _hasCollisions:boolean;\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic get onlyMouseEnabled():boolean\n\t{\n\t\treturn this._onlyMouseEnabled;\n\t}\n\n\tpublic set onlyMouseEnabled(value:boolean)\n\t{\n\t\tthis._onlyMouseEnabled = value;\n\t}\n\n\t/**\n\t * Creates a new RaycastPicker object.\n\t *\n\t * @param findClosestCollision Determines whether the picker searches for the closest bounds collision along the ray,\n\t * or simply returns the first collision encountered. Defaults to false.\n\t */\n\tconstructor(findClosestCollision:boolean = false)\n\t{\n\t\tthis._raycastCollector = new RaycastCollector();\n\n\t\tthis._findClosestCollision = findClosestCollision;\n\t\tthis._entities = new Array();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic getViewCollision(x:number, y:number, view:View):PickingCollisionVO\n\t{\n\t\t//update ray\n\t\tvar rayPosition:Vector3D = view.unproject(x, y, 0);\n\t\tvar rayDirection:Vector3D = view.unproject(x, y, 1).subtract(rayPosition);\n\n\t\treturn this.getSceneCollision(rayPosition, rayDirection, view.scene);\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic getSceneCollision(rayPosition:Vector3D, rayDirection:Vector3D, scene:Scene):PickingCollisionVO\n\t{\n\t\t//clear collector\n\t\tthis._raycastCollector.clear();\n\n\t\t//setup ray vectors\n\t\tthis._raycastCollector.rayPosition = rayPosition;\n\t\tthis._raycastCollector.rayDirection = rayDirection;\n\n\t\t// collect entities to test\n\t\tscene.traversePartitions(this._raycastCollector);\n\n\t\tthis._numEntities = 0;\n\t\tvar node:EntityListItem = this._raycastCollector.entityHead;\n\t\tvar entity:IEntity;\n\n\t\twhile (node) {\n\t\t\tif (!this.isIgnored(entity = node.entity))\n\t\t\t\tthis._entities[this._numEntities++] = entity;\n\n\t\t\tnode = node.next;\n\t\t}\n\n\t\t//early out if no collisions detected\n\t\tif (!this._numEntities)\n\t\t\treturn null;\n\n\t\treturn this.getPickingCollisionVO(this._raycastCollector);\n\t}\n\n//\t\tpublic getEntityCollision(position:Vector3D, direction:Vector3D, entities:Array):PickingCollisionVO\n//\t\t{\n//\t\t\tthis._numEntities = 0;\n//\n//\t\t\tvar entity:IEntity;\n//\t\t\tvar l:number = entities.length;\n//\n//\t\t\tfor (var c:number = 0; c < l; c++) {\n//\t\t\t\tentity = entities[c];\n//\n//\t\t\t\tif (entity.isIntersectingRay(position, direction))\n//\t\t\t\t\tthis._entities[this._numEntities++] = entity;\n//\t\t\t}\n//\n//\t\t\treturn this.getPickingCollisionVO(this._raycastCollector);\n//\t\t}\n\n\tpublic setIgnoreList(entities)\n\t{\n\t\tthis._ignoredEntities = entities;\n\t}\n\n\tprivate isIgnored(entity:IEntity):boolean\n\t{\n\t\tif (this._onlyMouseEnabled && !entity._iIsMouseEnabled())\n\t\t\treturn true;\n\n\t\tvar len:number = this._ignoredEntities.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tif (this._ignoredEntities[i] == entity)\n\t\t\t\treturn true;\n\n\t\treturn false;\n\t}\n\n\tprivate sortOnNearT(entity1:IEntity, entity2:IEntity):number\n\t{\n\t\treturn entity1._iPickingCollisionVO.rayEntryDistance > entity2._iPickingCollisionVO.rayEntryDistance? 1 : -1;\n\t}\n\n\tprivate getPickingCollisionVO(collector:ICollector):PickingCollisionVO\n\t{\n\t\t// trim before sorting\n\t\tthis._entities.length = this._numEntities;\n\n\t\t// Sort entities from closest to furthest.\n\t\tthis._entities = this._entities.sort(this.sortOnNearT); // TODO - test sort filter in JS\n\n\t\t// ---------------------------------------------------------------------\n\t\t// Evaluate triangle collisions when needed.\n\t\t// Replaces collision data provided by bounds collider with more precise data.\n\t\t// ---------------------------------------------------------------------\n\n\t\tvar shortestCollisionDistance:number = Number.MAX_VALUE;\n\t\tvar bestCollisionVO:PickingCollisionVO;\n\t\tvar pickingCollisionVO:PickingCollisionVO;\n\t\tvar entity:IEntity;\n\t\tvar i:number;\n\n\t\tfor (i = 0; i < this._numEntities; ++i) {\n\t\t\tentity = this._entities[i];\n\t\t\tpickingCollisionVO = entity._iPickingCollisionVO;\n\t\t\tif (entity.pickingCollider) {\n\t\t\t\t// If a collision exists, update the collision data and stop all checks.\n\t\t\t\tif ((bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) && entity._iTestCollision(shortestCollisionDistance, this._findClosestCollision)) {\n\t\t\t\t\tshortestCollisionDistance = pickingCollisionVO.rayEntryDistance;\n\t\t\t\t\tbestCollisionVO = pickingCollisionVO;\n\t\t\t\t\tif (!this._findClosestCollision) {\n\t\t\t\t\t\tthis.updateLocalPosition(pickingCollisionVO);\n\t\t\t\t\t\treturn pickingCollisionVO;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) { // A bounds collision with no triangle collider stops all checks.\n\t\t\t\t// Note: a bounds collision with a ray origin inside its bounds is ONLY ever used\n\t\t\t\t// to enable the detection of a corresponsding triangle collision.\n\t\t\t\t// Therefore, bounds collisions with a ray origin inside its bounds can be ignored\n\t\t\t\t// if it has been established that there is NO triangle collider to test\n\t\t\t\tif (!pickingCollisionVO.rayOriginIsInsideBounds) {\n\t\t\t\t\tthis.updateLocalPosition(pickingCollisionVO);\n\t\t\t\t\treturn pickingCollisionVO;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn bestCollisionVO;\n\t}\n\n\tprivate updateLocalPosition(pickingCollisionVO:PickingCollisionVO)\n\t{\n\t\tvar collisionPos:Vector3D = ( pickingCollisionVO.localPosition == null )? new Vector3D() : pickingCollisionVO.localPosition;\n\n\t\tvar rayDir:Vector3D = pickingCollisionVO.localRayDirection;\n\t\tvar rayPos:Vector3D = pickingCollisionVO.localRayPosition;\n\t\tvar t:number = pickingCollisionVO.rayEntryDistance;\n\t\tcollisionPos.x = rayPos.x + t*rayDir.x;\n\t\tcollisionPos.y = rayPos.y + t*rayDir.y;\n\t\tcollisionPos.z = rayPos.z + t*rayDir.z;\n\t}\n\n\tpublic dispose()\n\t{\n\t\t//TODO\n\t}\n}\n\nexport = RaycastPicker;", + "import CSSRenderableBase\t\t\t= require(\"awayjs-core/lib/core/pool/CSSRenderableBase\");\nimport RenderablePool\t\t\t\t= require(\"awayjs-core/lib/core/pool/RenderablePool\");\nimport Billboard\t\t\t\t\t= require(\"awayjs-core/lib/entities/Billboard\");\n\n/**\n * @class away.pool.RenderableListItem\n */\nclass CSSBillboardRenderable extends CSSRenderableBase\n{\n\tpublic static id:string = \"billboard\";\n\n\tconstructor(pool:RenderablePool, billboard:Billboard)\n\t{\n\t\tsuper(pool, billboard, billboard);\n\n\t\tvar div:HTMLDivElement = document.createElement(\"div\");\n\t\tdiv.onmousedown = (event:MouseEvent) => false;\n\n\t\tthis.htmlElement = div;\n\n\t\tvar style:MSStyleCSSProperties = div.style;\n\n\t\tstyle.position = \"absolute\";\n\t\tstyle.transformOrigin\n\t\t\t= style[\"-webkit-transform-origin\"]\n\t\t\t= style[\"-moz-transform-origin\"]\n\t\t\t= style[\"-o-transform-origin\"]\n\t\t\t= style[\"-ms-transform-origin\"] = \"0% 0%\";\n\n\t\tvar img:HTMLDivElement = document.createElement(\"div\");\n\n\t\tdiv.appendChild(img);\n\n\t\timg.className = \"material\" + billboard.material.id;\n\t}\n}\n\nexport = CSSBillboardRenderable;", + "import CSSRenderableBase\t\t\t= require(\"awayjs-core/lib/core/pool/CSSRenderableBase\");\nimport RenderablePool\t\t\t\t= require(\"awayjs-core/lib/core/pool/RenderablePool\");\nimport LineSegment\t\t\t\t\t= require(\"awayjs-core/lib/entities/LineSegment\");\n\n/**\n * @class away.pool.RenderableListItem\n */\nclass CSSLineSegmentRenderable extends CSSRenderableBase\n{\n\tpublic static id:string = \"lineSegment\";\n\n\tconstructor(pool:RenderablePool, lineSegment:LineSegment)\n\t{\n\t\tsuper(pool, lineSegment, lineSegment);\n\n\t\tvar div:HTMLDivElement = document.createElement(\"div\");\n\t\tdiv.onmousedown = (event:MouseEvent) => false;\n\n\t\tthis.htmlElement = div;\n\n\t\tvar style:MSStyleCSSProperties = div.style;\n\n\t\tstyle.position = \"absolute\";\n\t\tstyle.transformOrigin\n\t\t\t= style[\"-webkit-transform-origin\"]\n\t\t\t= style[\"-moz-transform-origin\"]\n\t\t\t= style[\"-o-transform-origin\"]\n\t\t\t= style[\"-ms-transform-origin\"] = \"0% 0%\";\n\n\t\tvar img:HTMLDivElement = document.createElement(\"div\");\n\n\t\tdiv.appendChild(img);\n\n\t\timg.className = \"material\" + lineSegment.material.id;\n\t}\n}\n\nexport = CSSLineSegmentRenderable;", + "import IMaterialOwner\t\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport IRenderable\t\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport RenderablePool\t\t\t\t= require(\"awayjs-core/lib/core/pool/RenderablePool\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.pool.RenderableListItem\n */\nclass CSSRenderableBase implements IRenderable\n{\n\t/**\n\t *\n\t */\n\tprivate _pool:RenderablePool;\n\n\t/**\n\t *\n\t */\n\tpublic next:CSSRenderableBase;\n\n\t/**\n\t *\n\t */\n\tpublic materialId:number;\n\n\t/**\n\t *\n\t */\n\tpublic renderOrderId:number;\n\n\t/**\n\t *\n\t */\n\tpublic zIndex:number;\n\n\t/**\n\t *\n\t */\n\tpublic cascaded:boolean;\n\n\t/**\n\t *\n\t */\n\tpublic renderSceneTransform:Matrix3D;\n\n\t/**\n\t *\n\t */\n\tpublic sourceEntity:IEntity;\n\n\t/**\n\t *\n\t */\n\tpublic materialOwner:IMaterialOwner;\n\n\t/**\n\t *\n\t */\n\tpublic htmlElement:HTMLElement;\n\n\t/**\n\t *\n\t * @param sourceEntity\n\t * @param material\n\t * @param animator\n\t */\n\tconstructor(pool:RenderablePool, sourceEntity:IEntity, materialOwner:IMaterialOwner)\n\t{\n\t\t//store a reference to the pool for later disposal\n\t\tthis._pool = pool;\n\n\t\tthis.sourceEntity = sourceEntity;\n\t\tthis.materialOwner = materialOwner;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic dispose()\n\t{\n\t\tthis._pool.disposeItem(this.materialOwner);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic invalidateGeometry()\n\t{\n\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic invalidateIndexData()\n\t{\n\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic invalidateVertexData(dataType:string)\n\t{\n\n\t}\n}\n\nexport = CSSRenderableBase;", + "import CSSRenderableBase\t\t\t= require(\"awayjs-core/lib/core/pool/CSSRenderableBase\");\nimport RenderablePool\t\t\t\t= require(\"awayjs-core/lib/core/pool/RenderablePool\");\nimport Skybox\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Skybox\");\n\n\n/**\n * @class away.pool.CSSSkyboxRenderable\n */\nclass CSSSkyboxRenderable extends CSSRenderableBase\n{\n\tpublic static id:string = \"skybox\";\n\n\tconstructor(pool:RenderablePool, skyBox:Skybox)\n\t{\n\t\tsuper(pool, skyBox, skyBox);\n\n\t\tvar div:HTMLDivElement = document.createElement(\"div\");\n\t\tdiv.onmousedown = (event:MouseEvent) => false;\n\n\t\tthis.htmlElement = div;\n\n\t\tvar style:MSStyleCSSProperties = div.style;\n\t\tvar img:HTMLDivElement;\n\n\t\t//create the six images that make up the skybox\n\t\tstyle.position = \"absolute\";\n\t\tstyle.transformOrigin\n\t\t\t= style[\"-webkit-transform-origin\"]\n\t\t\t= style[\"-moz-transform-origin\"]\n\t\t\t= style[\"-o-transform-origin\"]\n\t\t\t= style[\"-ms-transform-origin\"] = \"0% 0%\";\n\n\t\timg = document.createElement(\"div\");\n\n\t\tdiv.appendChild(img);\n\n\t\timg.className = \"material\" + skyBox.material.id;\n\t}\n}\n\nexport = CSSSkyboxRenderable;", + "import EntityListItem\t\t\t\t= require(\"awayjs-core/lib/core/pool/EntityListItem\");\n\n/**\n * @class away.pool.EntityListItemPool\n */\nclass EntityListItemPool\n{\n\tprivate _pool:Array;\n\tprivate _index:number = 0;\n\tprivate _poolSize:number = 0;\n\n\t/**\n\t *\n\t */\n\tconstructor()\n\t{\n\t\tthis._pool = new Array();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic getItem():EntityListItem\n\t{\n\t\tvar item:EntityListItem;\n\t\tif (this._index == this._poolSize) {\n\t\t\titem = new EntityListItem();\n\t\t\tthis._pool[this._index++] = item;\n\t\t\t++this._poolSize;\n\t\t} else {\n\t\t\titem = this._pool[this._index++];\n\t\t}\n\t\treturn item;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic freeAll()\n\t{\n\t\tthis._index = 0;\n\t}\n\n\tpublic dispose()\n\t{\n\t\tthis._pool.length = 0;\n\t}\n}\n\nexport = EntityListItemPool;", + "import IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.pool.EntityListItem\n */\nclass EntityListItem\n{\n\t/**\n\t *\n\t */\n\tpublic entity:IEntity;\n\n\t/**\n\t *\n\t */\n\tpublic next:EntityListItem;\n}\n\nexport = EntityListItem;", + "/**\n * IMaterialData is an interface for classes that are used in the rendering pipeline to render the\n * contents of a texture\n *\n * @class away.pool.IMaterialData\n */\ninterface IMaterialData\n{\n\t/**\n\t *\n\t */\n\tdispose();\n\n\t/**\n\t *\n\t */\n\tinvalidateMaterial();\n\n\t/**\n\t *\n\t */\n\tinvalidateAnimation();\n}\n\nexport = IMaterialData;", + "import IMaterialPass\t\t\t\t= require(\"awayjs-core/lib/materials/passes/IMaterialPass\");\n\n/**\n * IMaterialPassData is an interface for classes that are used in the rendering pipeline to render the\n * contents of a material pass\n *\n * @class away.pool.IMaterialPassData\n */\ninterface IMaterialPassData\n{\n\t/**\n\t *\n\t */\n\tmaterialPass:IMaterialPass;\n\n\t/**\n\t *\n\t */\n\tdispose();\n\n\t/**\n\t *\n\t */\n\tinvalidate();\n}\n\nexport = IMaterialPassData;", + "import IMaterialOwner\t\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport IRenderable\t\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport RenderablePool\t\t\t\t= require(\"awayjs-core/lib/core/pool/RenderablePool\");\n\n/**\n * IRenderableClass is an interface for the constructable class definition IRenderable that is used to\n * create renderable objects in the rendering pipeline to render the contents of a partition\n *\n * @class away.render.IRenderableClass\n */\ninterface IRenderableClass\n{\n\t/**\n\t *\n\t */\n\tid:string;\n\n\t/**\n\t *\n\t */\n\tnew(pool:RenderablePool, materialOwner:IMaterialOwner):IRenderable;\n}\n\nexport = IRenderableClass;", + "import IMaterialOwner\t\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * IRenderable is an interface for classes that are used in the rendering pipeline to render the\n * contents of a partition\n *\n * @class away.render.IRenderable\n */\ninterface IRenderable\n{\n\t/**\n\t *\n\t */\n\tnext:IRenderable;\n\n\n\t/**\n\t *\n\t */\n\tmaterialId:number;\n\n\t/**\n\t *\n\t */\n\tmaterialOwner:IMaterialOwner;\n\n\t/**\n\t *\n\t */\n\tsourceEntity:IEntity;\n\n\t/**\n\t *\n\t */\n\trenderOrderId:number;\n\n\t/**\n\t *\n\t */\n\tzIndex:number;\n\n\t/**\n\t *\n\t */\n\tdispose();\n\n\t/**\n\t *\n\t */\n\tinvalidateGeometry();\n\n\t/**\n\t *\n\t */\n\tinvalidateIndexData();\n\n\t/**\n\t *\n\t */\n\tinvalidateVertexData(dataType:string);\n}\n\nexport = IRenderable;", + "/**\n * ITextureData is an interface for classes that are used in the rendering pipeline to render the\n * contents of a texture\n *\n * @class away.pool.ITextureData\n */\ninterface ITextureData\n{\n\t/**\n\t *\n\t */\n\tdispose();\n\n\t/**\n\t *\n\t */\n\tinvalidate();\n}\n\nexport = ITextureData;", + "import IMaterialOwner\t\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport IRenderable\t\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport IRenderableClass\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderableClass\");\n\n/**\n * @class away.pool.RenderablePool\n */\nclass RenderablePool\n{\n\tprivate static _pools:Object = new Object();\n\n\tprivate _pool:Object = new Object();\n\tprivate _renderableClass:IRenderableClass;\n\n\t/**\n\t * //TODO\n\t *\n\t * @param renderableClass\n\t */\n\tconstructor(renderableClass:IRenderableClass)\n\t{\n\t\tthis._renderableClass = renderableClass;\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @param materialOwner\n\t * @returns IRenderable\n\t */\n\tpublic getItem(materialOwner:IMaterialOwner):IRenderable\n\t{\n\t\treturn (this._pool[materialOwner.id] || (this._pool[materialOwner.id] = materialOwner._iAddRenderable(new this._renderableClass(this, materialOwner))))\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @param materialOwner\n\t */\n\tpublic disposeItem(materialOwner:IMaterialOwner)\n\t{\n\t\tmaterialOwner._iRemoveRenderable(this._pool[materialOwner.id]);\n\n\t\tthis._pool[materialOwner.id] = null;\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @param renderableClass\n\t * @returns RenderablePool\n\t */\n\tpublic static getPool(renderableClass:IRenderableClass):RenderablePool\n\t{\n\t\tvar pool:RenderablePool = RenderablePool._pools[renderableClass.id];\n\n\t\tif (pool != undefined)\n\t\t\treturn pool;\n\n\t\treturn (RenderablePool._pools[renderableClass.id] = new RenderablePool(renderableClass));\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @param renderableClass\n\t */\n\tpublic static disposePool(renderableClass:any)\n\t{\n\t\tif (RenderablePool._pools[renderableClass.id])\n\t\t\tRenderablePool._pools[renderableClass.id] = undefined;\n\t}\n}\n\nexport = RenderablePool;", + "import Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport CSSRenderableBase\t\t\t= require(\"awayjs-core/lib/core/pool/CSSRenderableBase\");\nimport CSSRendererBase\t\t\t\t= require(\"awayjs-core/lib/core/render/CSSRendererBase\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport CSSEntityCollector\t\t\t= require(\"awayjs-core/lib/core/traverse/CSSEntityCollector\");\nimport EntityCollector\t\t\t\t= require(\"awayjs-core/lib/core/traverse/EntityCollector\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport CSSMaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/CSSMaterialBase\");\nimport CoordinateSystem\t\t\t\t= require(\"awayjs-core/lib/projections/CoordinateSystem\");\n\n\n/**\n * The DefaultRenderer class provides the default rendering method. It renders the scene graph objects using the\n * materials assigned to them.\n *\n * @class away.render.DefaultRenderer\n */\nclass CSSDefaultRenderer extends CSSRendererBase implements IRenderer\n{\n\tprivate _container:HTMLDivElement;\n\tprivate _context:HTMLDivElement;\n\tprivate _contextStyle:MSStyleCSSProperties;\n\tprivate _contextMatrix:Matrix3D = new Matrix3D();\n\t\n\tprivate _activeMaterial:CSSMaterialBase;\n\tprivate _skyboxProjection:Matrix3D = new Matrix3D();\n\tprivate _transform:Matrix3D = new Matrix3D();\n\n\t/**\n\t * Creates a new CSSDefaultRenderer object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\t//create container for the renderer\n\t\tthis._container = document.createElement(\"div\");\n\t\tthis._container.style.overflow = \"hidden\";\n\t\tthis._container.style.position = \"absolute\";\n\t\t\n\t\t//add container to body\n\t\tdocument.body.appendChild(this._container);\n\n\t\t//create conxtext for the renderer\n\t\tthis._context = document.createElement(\"div\");\n\t\tthis._contextStyle = this._context.style;\n\t\tthis._contextStyle.position = \"absolute\";\n\t\tthis._contextStyle.transformStyle\n\t\t\t= this._contextStyle[\"-webkit-transform-style\"]\n\t\t\t= this._contextStyle[\"-moz-transform-style\"]\n\t\t\t= this._contextStyle[\"-o-transform-style\"]\n\t\t\t= this._contextStyle[\"-ms-transform-style\"] = \"preserve-3d\";\n\t\tthis._contextStyle.transformOrigin\n\t\t\t= this._contextStyle[\"-webkit-transform-origin\"]\n\t\t\t= this._contextStyle[\"-moz-transform-origin\"]\n\t\t\t= this._contextStyle[\"-o-transform-origin\"]\n\t\t\t= this._contextStyle[\"-ms-transform-origin\"] = \"0% 0%\";\n\n\t\t//add context to container\n\t\tthis._container.appendChild(this._context);\n\t}\n\n\t/**\n\t *\n\t * @param entityCollector\n\t */\n\tpublic render(entityCollector:ICollector)\n\t{\n\t\tsuper.render(entityCollector);\n\n\t\tif (this._pBackBufferInvalid)// reset or update render settings\n\t\t\tthis.pUpdateBackBuffer();\n\n\t\tthis._iRender( entityCollector);\n\n\t\tthis._pBackBufferInvalid = false;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic pDraw(entityCollector:EntityCollector)\n\t{\n//\t\t\tif (entityCollector.skyBox) {\n//\t\t\t\tif (this._activeMaterial)\n//\t\t\t\t\tthis._activeMaterial.iDeactivate(this._pStageGL);\n//\n//\t\t\t\tthis._activeMaterial = null;\n//\n//\t\t\t\tthis._pContext.setDepthTest(false, away.gl.ContextGLCompareMode.ALWAYS);\n//\t\t\t\tthis.drawSkybox(entityCollector);\n//\n//\t\t\t}\n//\n//\t\t\tvar which:number = target? DefaultRenderer.SCREEN_PASSES : DefaultRenderer.ALL_PASSES;\n\n\t\tvar sheet:CSSStyleSheet = document.styleSheets[document.styleSheets.length - 1];\n\n\t\tfor (var i:number = 0; i < sheet.cssRules.length; i++) {\n\t\t\tvar style:MSStyleCSSProperties = ( sheet.cssRules[i]).style;\n\t\t\tstyle.transform\n\t\t\t\t= style[\"-webkit-transform\"]\n\t\t\t\t= style[\"-moz-transform\"]\n\t\t\t\t= style[\"-o-transform\"]\n\t\t\t\t= style[\"-ms-transform\"] = (entityCollector.camera.projection.coordinateSystem == CoordinateSystem.RIGHT_HANDED)? \"\" : \"scale3d(1, -1, 1) translateY(-\" + style.height + \")\";\n\t\t}\n\n\t\tthis.drawRenderables(this._renderableHead, entityCollector);\n\n//\t\t\tif (this._activeMaterial)\n//\t\t\t\tthis._activeMaterial.iDeactivate(this._pStageGL);\n\n\t\tthis._activeMaterial = null;\n\t}\n\n\t/**\n\t * Updates the backbuffer properties.\n\t */\n\tpublic pUpdateBackBuffer()\n\t{\n\t\tthis._container.style.width = this._width + \"px\";\n\t\tthis._container.style.height = this._height + \"px\";\n\t\tthis._container.style.clip = \"rect(0px, \" + this._width + \"px, \" + this._height + \"px, 0px)\";\n\n\t\t//update context matrix\n\t\tthis._contextMatrix.rawData[0] = this._width/2;\n\t\tthis._contextMatrix.rawData[5] = -this._height/2;\n\t\tthis._contextMatrix.rawData[10] = -1; //fix for innaccurate z-sort\n\t\tthis._contextMatrix.rawData[12] = this._width/2;\n\t\tthis._contextMatrix.rawData[13] = this._height/2;\n\n\t\t//update context tranform\n\t\tthis._contextStyle.transform\n\t\t\t= this._contextStyle[\"-webkit-transform\"]\n\t\t\t= this._contextStyle[\"-moz-transform\"]\n\t\t\t= this._contextStyle[\"-o-transform\"]\n\t\t\t= this._contextStyle[\"-ms-transform\"] = this._contextMatrix.toString();\n\n\t\tthis._pBackBufferInvalid = false;\n\t}\n\n\t/**\n\t * Draw the skybox if present.\n\t * @param entityCollector The EntityCollector containing all potentially visible information.\n\t */\n\tprivate drawSkybox(entityCollector:CSSEntityCollector)\n\t{\n\t\t//TODO\n\t}\n\n\t/**\n\t * Draw a list of renderables.\n\t * @param renderables The renderables to draw.\n\t * @param entityCollector The EntityCollector containing all potentially visible information.\n\t */\n\tprivate drawRenderables(item:CSSRenderableBase, entityCollector:EntityCollector)\n\t{\n\t\tvar viewProjection:Matrix3D = entityCollector.camera.viewProjection.clone();\n\n\t\twhile (item) {\n\t\t\tthis._activeMaterial = item.materialOwner.material;\n\n\t\t\t//serialise transform and apply to html element\n\t\t\tthis._transform.copyRawDataFrom(item.renderSceneTransform.rawData);\n\t\t\tthis._transform.append(viewProjection);\n\n\t\t\tvar style:MSStyleCSSProperties = item.htmlElement.style;\n\n\t\t\tstyle.transform\n\t\t\t\t= style[\"-webkit-transform\"]\n\t\t\t\t= style[\"-moz-transform\"]\n\t\t\t\t= style[\"-o-transform\"]\n\t\t\t\t= style[\"-ms-transform\"] = this._transform.toString();\n\n\t\t\tstyle.transformStyle\n\t\t\t\t= style[\"-webkit-transform-style\"]\n\t\t\t\t= style[\"-moz-transform-style\"]\n\t\t\t\t= style[\"-o-transform-style\"]\n\t\t\t\t= style[\"-ms-transform-style\"] = \"preserve-3d\";\n\n\t\t\t//check if child requires adding to the view\n\t\t\tif (!this._context.contains(item.htmlElement))\n\t\t\t\tthis._context.appendChild(item.htmlElement);\n\n\t\t\titem = item.next;\n\t\t}\n\n//\t\t\tvar numPasses:number;\n//\t\t\tvar j:number;\n//\t\t\tvar camera:away.entities.Camera = entityCollector.camera;\n//\t\t\tvar item2:away.render.CSSRenderableBase;\n//\n//\t\t\twhile (item) {\n//\t\t\t\tthis._activeMaterial = item.material;\n//\n//\t\t\t\tthis._activeMaterial.iUpdateMaterial(this._pContext);\n//\n//\t\t\t\tnumPasses = this._activeMaterial._iNumPasses;\n//\n//\t\t\t\tj = 0;\n//\n//\t\t\t\tdo {\n//\t\t\t\t\titem2 = item;\n//\n//\t\t\t\t\tvar rttMask:number = this._activeMaterial.iPassRendersToTexture(j)? 1 : 2;\n//\n//\t\t\t\t\tif ((rttMask & which) != 0) {\n//\t\t\t\t\t\tthis._activeMaterial.iActivatePass(j, this._pStageGL, camera);\n//\n//\t\t\t\t\t\tdo {\n//\t\t\t\t\t\t\tthis._activeMaterial.iRenderPass(j, item2, this._pStageGL, entityCollector);\n//\n//\t\t\t\t\t\t\titem2 = item2.next;\n//\n//\t\t\t\t\t\t} while (item2 && item2.material == this._activeMaterial);\n//\n//\t\t\t\t\t\tthis._activeMaterial.iDeactivatePass(j, this._pStageGL);\n//\n//\t\t\t\t\t} else {\n//\t\t\t\t\t\tdo {\n//\t\t\t\t\t\t\titem2 = item2.next;\n//\n//\t\t\t\t\t\t} while (item2 && item2.renderable.material == this._activeMaterial);\n//\t\t\t\t\t}\n//\t\t\t\t} while (++j < numPasses);\n//\n//\t\t\t\titem = item2;\n//\t\t\t}\n\t}\n\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\n\t\t//TODO\n\t}\n\n\n\tpublic _iCreateEntityCollector():ICollector\n\t{\n\t\treturn new CSSEntityCollector();\n\t}\n}\n\nexport = CSSDefaultRenderer;", + "import LineSubMesh\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LineSubMesh\");\nimport TriangleSubMesh\t\t\t\t= require(\"awayjs-core/lib/core/base/TriangleSubMesh\");\nimport Point\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport Rectangle\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport CSSBillboardRenderable\t\t= require(\"awayjs-core/lib/core/pool/CSSBillboardRenderable\");\nimport CSSLineSegmentRenderable\t\t= require(\"awayjs-core/lib/core/pool/CSSLineSegmentRenderable\");\nimport CSSRenderableBase\t\t\t= require(\"awayjs-core/lib/core/pool/CSSRenderableBase\");\nimport EntityListItem\t\t\t\t= require(\"awayjs-core/lib/core/pool/EntityListItem\");\nimport RenderablePool\t\t\t\t= require(\"awayjs-core/lib/core/pool/RenderablePool\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport IEntitySorter\t\t\t\t= require(\"awayjs-core/lib/core/sort/IEntitySorter\");\nimport CSSEntityCollector\t\t\t= require(\"awayjs-core/lib/core/traverse/CSSEntityCollector\");\nimport EntityCollector\t\t\t\t= require(\"awayjs-core/lib/core/traverse/EntityCollector\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport Billboard\t\t\t\t\t= require(\"awayjs-core/lib/entities/Billboard\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport Skybox\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Skybox\");\nimport AbstractMethodError\t\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport EventDispatcher\t\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport RendererEvent\t\t\t\t= require(\"awayjs-core/lib/events/RendererEvent\");\nimport CSSMaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/CSSMaterialBase\");\nimport TextureProxyBase\t\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\n/**\n * RendererBase forms an abstract base class for classes that are used in the rendering pipeline to render the\n * contents of a partition\n *\n * @class away.render.RendererBase\n */\nclass CSSRendererBase extends EventDispatcher\n{\n\tprivate _billboardRenderablePool:RenderablePool;\n\tprivate _lineSegmentRenderablePool:RenderablePool;\n\n\tpublic _pCamera:Camera;\n\tpublic _iEntryPoint:Vector3D;\n\tpublic _pCameraForward:Vector3D;\n\n\tprivate _backgroundR:number = 0;\n\tprivate _backgroundG:number = 0;\n\tprivate _backgroundB:number = 0;\n\tprivate _backgroundAlpha:number = 1;\n\tprivate _shareContext:boolean = false;\n\n\tpublic _pBackBufferInvalid:boolean = true;\n\tpublic _depthTextureInvalid:boolean = true;\n\n\tpublic _renderableHead:CSSRenderableBase;\n\n\tpublic _width:number;\n\tpublic _height:number;\n\n\tprivate _viewPort:Rectangle = new Rectangle();\n\tprivate _viewportDirty:boolean;\n\tprivate _scissorRect:Rectangle = new Rectangle();\n\tprivate _scissorDirty:boolean;\n\n\tprivate _localPos:Point = new Point();\n\tprivate _globalPos:Point = new Point();\n\n\tprivate _scissorUpdated:RendererEvent;\n\tprivate _viewPortUpdated:RendererEvent;\n\n\t/**\n\t * A viewPort rectangle equivalent of the StageGL size and position.\n\t */\n\tpublic get viewPort():Rectangle\n\t{\n\t\treturn this._viewPort;\n\t}\n\n\t/**\n\t * A scissor rectangle equivalent of the view size and position.\n\t */\n\tpublic get scissorRect():Rectangle\n\t{\n\t\treturn this._scissorRect;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get x():number\n\t{\n\t\treturn this._localPos.x;\n\t}\n\n\tpublic set x(value:number)\n\t{\n\t\tif (this.x == value)\n\t\t\treturn;\n\n\t\tthis.updateGlobalPos();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get y():number\n\t{\n\t\treturn this._localPos.y;\n\t}\n\n\tpublic set y(value:number)\n\t{\n\t\tif (this.y == value)\n\t\t\treturn;\n\n\t\tthis._globalPos.y = this._localPos.y = value;\n\n\t\tthis.updateGlobalPos();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get width():number\n\t{\n\t\treturn this._width;\n\t}\n\n\tpublic set width(value:number)\n\t{\n\t\tif (this._width == value)\n\t\t\treturn;\n\n\t\tthis._width = value;\n\t\tthis._scissorRect.width = value;\n\t\tthis._viewPort.width = value;\n\n\t\tthis._pBackBufferInvalid = true;\n\t\tthis._depthTextureInvalid = true;\n\n\t\tthis.notifyViewportUpdate();\n\t\tthis.notifyScissorUpdate();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._height;\n\t}\n\n\tpublic set height(value:number)\n\t{\n\t\tif (this._height == value)\n\t\t\treturn;\n\n\t\tthis._height = value;\n\t\tthis._scissorRect.height = value;\n\t\tthis._viewPort.height = value;\n\n\t\tthis._pBackBufferInvalid = true;\n\t\tthis._depthTextureInvalid = true;\n\n\t\tthis.notifyViewportUpdate();\n\t\tthis.notifyScissorUpdate();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic renderableSorter:IEntitySorter;\n\n\t/**\n\t * Creates a new RendererBase object.\n\t */\n\tconstructor(renderToTexture:boolean = false, forceSoftware:boolean = false, profile:string = \"baseline\")\n\t{\n\t\tsuper();\n\n\t\tthis._billboardRenderablePool = RenderablePool.getPool(CSSBillboardRenderable);\n\t\tthis._lineSegmentRenderablePool = RenderablePool.getPool(CSSLineSegmentRenderable);\n\n\t\tthis._viewPort = new Rectangle();\n\n\t\tif (this._width == 0)\n\t\t\tthis.width = window.innerWidth;\n\n\t\tif (this._height == 0)\n\t\t\tthis.height = window.innerHeight;\n\t}\n\n\t/**\n\t * The background color's red component, used when clearing.\n\t *\n\t * @private\n\t */\n\tpublic get _iBackgroundR():number\n\t{\n\t\treturn this._backgroundR;\n\t}\n\n\tpublic set _iBackgroundR(value:number)\n\t{\n\t\tif (this._backgroundR == value)\n\t\t\treturn;\n\n\t\tthis._backgroundR = value;\n\n\t\tthis._pBackBufferInvalid = true;\n\t}\n\n\t/**\n\t * The background color's green component, used when clearing.\n\t *\n\t * @private\n\t */\n\tpublic get _iBackgroundG():number\n\t{\n\t\treturn this._backgroundG;\n\t}\n\n\tpublic set _iBackgroundG(value:number)\n\t{\n\t\tif (this._backgroundG == value)\n\t\t\treturn;\n\n\t\tthis._backgroundG = value;\n\n\t\tthis._pBackBufferInvalid = true;\n\t}\n\n\t/**\n\t * The background color's blue component, used when clearing.\n\t *\n\t * @private\n\t */\n\tpublic get _iBackgroundB():number\n\t{\n\t\treturn this._backgroundB;\n\t}\n\n\tpublic set _iBackgroundB(value:number)\n\t{\n\t\tif (this._backgroundB == value)\n\t\t\treturn;\n\n\t\tthis._backgroundB = value;\n\n\t\tthis._pBackBufferInvalid = true;\n\t}\n\n\tpublic get shareContext():boolean\n\t{\n\t\treturn this._shareContext;\n\t}\n\n\tpublic set shareContext(value:boolean)\n\t{\n\t\tif (this._shareContext == value)\n\t\t\treturn;\n\n\t\tthis._shareContext = value;\n\n\t\tthis.updateGlobalPos();\n\t}\n\n\t/**\n\t * Disposes the resources used by the RendererBase.\n\t */\n\tpublic dispose()\n\t{\n\t\t/*\n\t\t if (_backgroundImageRenderer) {\n\t\t _backgroundImageRenderer.dispose();\n\t\t _backgroundImageRenderer = null;\n\t\t }\n\t\t */\n\t}\n\n\tpublic render(entityCollector:ICollector)\n\t{\n\t\tthis._viewportDirty = false;\n\t\tthis._scissorDirty = false;\n\t}\n\n\t/**\n\t * Renders the potentially visible geometry to the back buffer or texture.\n\t * @param entityCollector The EntityCollector object containing the potentially visible geometry.\n\t * @param scissorRect\n\t */\n\tpublic _iRender(entityCollector:EntityCollector, target:TextureProxyBase = null, scissorRect:Rectangle = null, surfaceSelector:number = 0)\n\t{\n\t\tif (!entityCollector.entityHead)\n\t\t\treturn;\n\n\t\tthis.pExecuteRender(entityCollector, scissorRect);\n\t}\n\n\tpublic _iRenderCascades(entityCollector:ICollector, target:TextureProxyBase, numCascades:number, scissorRects:Array, cameras:Array)\n\t{\n\n\t}\n\tpublic pCollectRenderables(entityCollector:ICollector)\n\t{\n\t\t//reset head values\n\t\tthis._renderableHead = null;\n\n\t\t//grab entity head\n\t\tvar item:EntityListItem = entityCollector.entityHead;\n\n\t\t//set temp values for entry point and camera forward vector\n\t\tthis._pCamera = entityCollector.camera;\n\t\tthis._iEntryPoint = this._pCamera.scenePosition;\n\t\tthis._pCameraForward = this._pCamera.transform.forwardVector;\n\n\t\t//iterate through all entities\n\t\twhile (item) {\n\t\t\titem.entity._iCollectRenderables(this);\n\t\t\titem = item.next;\n\t\t}\n\t}\n\n\t/**\n\t * Renders the potentially visible geometry to the back buffer or texture. Only executed if everything is set up.\n\t * @param entityCollector The EntityCollector object containing the potentially visible geometry.\n\t * @param scissorRect\n\t */\n\tpublic pExecuteRender(entityCollector:CSSEntityCollector, scissorRect:Rectangle = null)\n\t{\n\t\tthis.pCollectRenderables(entityCollector);\n\n\t\tthis.pDraw(entityCollector);\n\t}\n\n\t/**\n\t * Performs the actual drawing of dom objects to the target.\n\t *\n\t * @param entityCollector The EntityCollector object containing the potentially visible dom objects.\n\t */\n\tpublic pDraw(entityCollector:CSSEntityCollector)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic get _iBackgroundAlpha():number\n\t{\n\t\treturn this._backgroundAlpha;\n\t}\n\n\tpublic set _iBackgroundAlpha(value:number)\n\t{\n\t\tif (this._backgroundAlpha == value)\n\t\t\treturn;\n\n\t\tthis._backgroundAlpha = value;\n\n\t\tthis._pBackBufferInvalid = true;\n\t}\n\n\t/**\n\t *\n\t * @param billboard\n\t */\n\tpublic applyBillboard(billboard:Billboard)\n\t{\n\t\tthis._applyRenderable( this._billboardRenderablePool.getItem(billboard));\n\t}\n\n\t/**\n\t *\n\t * @param lineSubMesh\n\t */\n\tpublic applyLineSubMesh(lineSubMesh:LineSubMesh)\n\t{\n\t\t//this._applyRenderable( this._billboardRenderablePool.getItem(lineSegment));\n\t}\n\n\t/**\n\t *\n\t * @param skybox\n\t */\n\tpublic applySkybox(skybox:Skybox)\n\t{\n\n\t}\n\n\t/**\n\t *\n\t * @param triangleSubMesh\n\t */\n\tpublic applyTriangleSubMesh(triangleSubMesh:TriangleSubMesh)\n\t{\n\n\t}\n\n\t/**\n\t *\n\t * @param renderable\n\t * @private\n\t */\n\tprivate _applyRenderable(renderable:CSSRenderableBase)\n\t{\n\t\tvar material:CSSMaterialBase = renderable.materialOwner.material;\n\t\tvar entity:IEntity = renderable.sourceEntity;\n\t\tvar position:Vector3D = entity.scenePosition;\n\n\t\tif (material) {\n\t\t\t//set ids for faster referencing\n\t\t\trenderable.materialId = material._iMaterialId;\n//\t\t\t\trenderable.renderOrderId = material._iRenderOrderId;\n\t\t\trenderable.cascaded = false;\n\n\t\t\t// project onto camera's z-axis\n\t\t\tposition = this._iEntryPoint.subtract(position);\n\t\t\trenderable.zIndex = entity.zOffset - position.dotProduct(this._pCameraForward);\n\n\t\t\t//store reference to scene transform\n\t\t\trenderable.renderSceneTransform = renderable.sourceEntity.getRenderSceneTransform(this._pCamera);\n\n\t\t\t//store reference to next item in list\n\t\t\trenderable.next = this._renderableHead;\n\t\t\tthis._renderableHead = renderable;\n\t\t}\n\t}\n\n\n\t/**\n\t * @private\n\t */\n\tprivate notifyScissorUpdate()\n\t{\n\t\tif (this._scissorDirty)\n\t\t\treturn;\n\n\t\tthis._scissorDirty = true;\n\n\t\tif (!this._scissorUpdated)\n\t\t\tthis._scissorUpdated = new RendererEvent(RendererEvent.SCISSOR_UPDATED);\n\n\t\tthis.dispatchEvent(this._scissorUpdated);\n\t}\n\n\n\t/**\n\t * @private\n\t */\n\tprivate notifyViewportUpdate()\n\t{\n\t\tif (this._viewportDirty)\n\t\t\treturn;\n\n\t\tthis._viewportDirty = true;\n\n\t\tif (!this._viewPortUpdated)\n\t\t\tthis._viewPortUpdated = new RendererEvent(RendererEvent.VIEWPORT_UPDATED);\n\n\t\tthis.dispatchEvent(this._viewPortUpdated);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic updateGlobalPos()\n\t{\n\t\tthis._viewPort.x = this._globalPos.x;\n\t\tthis._viewPort.y = this._globalPos.y;\n\n\t\tthis.notifyViewportUpdate();\n\t\tthis.notifyScissorUpdate();\n\t}\n\n\n\tpublic _iCreateEntityCollector():ICollector\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n}\n\nexport = CSSRendererBase;", + "import LineSubMesh\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LineSubMesh\");\nimport TriangleSubMesh\t\t\t\t= require(\"awayjs-core/lib/core/base/TriangleSubMesh\");\nimport Rectangle\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport IEntitySorter\t\t\t\t= require(\"awayjs-core/lib/core/sort/IEntitySorter\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport Billboard\t\t\t\t\t= require(\"awayjs-core/lib/entities/Billboard\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport Skybox\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Skybox\");\nimport IEventDispatcher\t\t\t\t= require(\"awayjs-core/lib/events/IEventDispatcher\");\nimport TextureProxyBase\t\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\n/**\n * IRenderer is an interface for classes that are used in the rendering pipeline to render the\n * contents of a partition\n *\n * @class away.render.IRenderer\n */\ninterface IRenderer extends IEventDispatcher\n{\n\t/**\n\t *\n\t */\n\trenderableSorter:IEntitySorter;\n\n\t/**\n\t *\n\t */\n\tshareContext:boolean;\n\n\t/**\n\t *\n\t */\n\tx:number /*uint*/;\n\n\t/**\n\t *\n\t */\n\ty:number /*uint*/;\n\n\t/**\n\t *\n\t */\n\twidth:number /*uint*/;\n\n\t/**\n\t *\n\t */\n\theight:number /*uint*/;\n\n\t/**\n\t *\n\t */\n\tviewPort:Rectangle;\n\n\t/**\n\t *\n\t */\n\tscissorRect:Rectangle;\n\n\t/**\n\t *\n\t * @param billboard\n\t */\n\tapplyBillboard(billboard:Billboard);\n\n\t/**\n\t *\n\t * @param triangleSubMesh\n\t */\n\tapplyLineSubMesh(triangleSubMesh:LineSubMesh);\n\n\t/**\n\t *\n\t * @param triangleSubMesh\n\t */\n\tapplyTriangleSubMesh(triangleSubMesh:TriangleSubMesh);\n\n\t/**\n\t *\n\t */\n\tdispose();\n\n\t/**\n\t *\n\t * @param entityCollector\n\t */\n\trender(entityCollector:ICollector);\n\n\t/**\n\t * @internal\n\t */\n\t_iBackgroundR:number /*uint*/;\n\n\t/**\n\t * @internal\n\t */\n\t_iBackgroundG:number /*uint*/;\n\n\t/**\n\t * @internal\n\t */\n\t_iBackgroundB:number /*uint*/;\n\n\t/**\n\t * @internal\n\t */\n\t_iBackgroundAlpha:number;\n\n\t/**\n\t * @internal\n\t */\n\t_iCreateEntityCollector():ICollector;\n\n\t_iRender(entityCollector:ICollector, target?:TextureProxyBase, scissorRect?:Rectangle, surfaceSelector?:number);\n\n\t_iRenderCascades(entityCollector:ICollector, target:TextureProxyBase, numCascades:number, scissorRects:Array, cameras:Array)\n}\n\nexport = IRenderer;", + "import IRenderable\t\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\n\n/**\n * @interface away.sort.IEntitySorter\n */\ninterface IEntitySorter\n{\n\tsortBlendedRenderables(head:IRenderable):IRenderable;\n\n\tsortOpaqueRenderables(head:IRenderable):IRenderable;\n}\n\nexport = IEntitySorter;", + "import IRenderable\t\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport IEntitySorter\t\t\t\t= require(\"awayjs-core/lib/core/sort/IEntitySorter\");\n\n/**\n * @class away.sort.RenderableMergeSort\n */\nclass RenderableMergeSort implements IEntitySorter\n{\n\tpublic sortBlendedRenderables(head:IRenderable):IRenderable\n\t{\n\t\tvar headB:IRenderable;\n\t\tvar fast:IRenderable;\n\t\tvar slow:IRenderable;\n\n\t\tif (!head || !head.next) {\n\t\t\treturn head;\n\t\t}\n\n\t\t// split in two sublists\n\t\tslow = head;\n\t\tfast = head.next;\n\n\t\twhile (fast) {\n\t\t\tfast = fast.next;\n\t\t\tif (fast) {\n\t\t\t\tslow = slow.next;\n\t\t\t\tfast = fast.next;\n\t\t\t}\n\t\t}\n\n\t\theadB = slow.next;\n\t\tslow.next = null;\n\n\t\t// recurse\n\t\thead = this.sortBlendedRenderables(head);\n\t\theadB = this.sortBlendedRenderables(headB);\n\n\t\t// merge sublists while respecting order\n\t\tvar result:IRenderable;\n\t\tvar curr:IRenderable;\n\t\tvar l:IRenderable;\n\n\t\tif (!head)\n\t\t\treturn headB;\n\t\tif (!headB)\n\t\t\treturn head;\n\n\t\twhile (head && headB) {\n\t\t\tif (head.zIndex < headB.zIndex) {\n\t\t\t\tl = head;\n\t\t\t\thead = head.next;\n\t\t\t} else {\n\t\t\t\tl = headB;\n\t\t\t\theadB = headB.next;\n\t\t\t}\n\n\t\t\tif (!result)\n\t\t\t\tresult = l; else\n\t\t\t\tcurr.next = l;\n\n\t\t\tcurr = l;\n\t\t}\n\n\t\tif (head)\n\t\t\tcurr.next = head; else if (headB)\n\t\t\tcurr.next = headB;\n\n\t\treturn result;\n\t}\n\n\tpublic sortOpaqueRenderables(head:IRenderable):IRenderable\n\t{\n\t\tvar headB:IRenderable;\n\t\tvar fast:IRenderable, slow:IRenderable;\n\n\t\tif (!head || !head.next) {\n\t\t\treturn head;\n\t\t}\n\n\t\t// split in two sublists\n\t\tslow = head;\n\t\tfast = head.next;\n\n\t\twhile (fast) {\n\t\t\tfast = fast.next;\n\t\t\tif (fast) {\n\t\t\t\tslow = slow.next;\n\t\t\t\tfast = fast.next;\n\t\t\t}\n\t\t}\n\n\t\theadB = slow.next;\n\t\tslow.next = null;\n\n\t\t// recurse\n\t\thead = this.sortOpaqueRenderables(head);\n\t\theadB = this.sortOpaqueRenderables(headB);\n\n\t\t// merge sublists while respecting order\n\t\tvar result:IRenderable;\n\t\tvar curr:IRenderable;\n\t\tvar l:IRenderable;\n\t\tvar cmp:number = 0;\n\n\t\tif (!head)\n\t\t\treturn headB;\n\t\tif (!headB)\n\t\t\treturn head;\n\n\t\twhile (head && headB && head != null && headB != null) {\n\n\t\t\t// first sort per render order id (reduces program3D switches),\n\t\t\t// then on material id (reduces setting props),\n\t\t\t// then on zIndex (reduces overdraw)\n\t\t\tvar aid:number = head.renderOrderId;\n\t\t\tvar bid:number = headB.renderOrderId;\n\n\t\t\tif (aid == bid) {\n\t\t\t\tvar ma:number = head.materialId;\n\t\t\t\tvar mb:number = headB.materialId;\n\n\t\t\t\tif (ma == mb) {\n\t\t\t\t\tif (head.zIndex < headB.zIndex)\n\t\t\t\t\t\tcmp = 1; else\n\t\t\t\t\t\tcmp = -1;\n\t\t\t\t} else if (ma > mb) {\n\t\t\t\t\tcmp = 1;\n\t\t\t\t} else {\n\t\t\t\t\tcmp = -1;\n\t\t\t\t}\n\t\t\t} else if (aid > bid) {\n\t\t\t\tcmp = 1;\n\t\t\t} else {\n\t\t\t\tcmp = -1;\n\t\t\t}\n\n\t\t\tif (cmp < 0) {\n\t\t\t\tl = head;\n\t\t\t\thead = head.next;\n\t\t\t} else {\n\t\t\t\tl = headB;\n\t\t\t\theadB = headB.next;\n\t\t\t}\n\n\t\t\tif (!result) {\n\t\t\t\tresult = l;\n\t\t\t\tcurr = l;\n\t\t\t} else {\n\t\t\t\tcurr.next = l;\n\t\t\t\tcurr = l;\n\t\t\t}\n\t\t}\n\n\t\tif (head)\n\t\t\tcurr.next = head; else if (headB)\n\t\t\tcurr.next = headB;\n\n\t\treturn result;\n\t}\n}\n\nexport = RenderableMergeSort;", + "/**\n * The AntiAliasType class provides values for anti-aliasing in the\n * away.text.TextField class.\n */\nclass AntiAliasType\n{\n\t/**\n\t * Sets anti-aliasing to advanced anti-aliasing. Advanced anti-aliasing\n\t * allows font faces to be rendered at very high quality at small sizes. It\n\t * is best used with applications that have a lot of small text. Advanced\n\t * anti-aliasing is not recommended for very large fonts(larger than 48\n\t * points). This constant is used for the antiAliasType property\n\t * in the TextField class. Use the syntax\n\t * AntiAliasType.ADVANCED.\n\t */\n\tpublic static ADVANCED:string = \"advanced\";\n\n\t/**\n\t * Sets anti-aliasing to the anti-aliasing that is used in Flash Player 7 and\n\t * earlier. This setting is recommended for applications that do not have a\n\t * lot of text. This constant is used for the antiAliasType\n\t * property in the TextField class. Use the syntax\n\t * AntiAliasType.NORMAL.\n\t */\n\tpublic static NORMAL:string = \"normal\";\n}\n\nexport = AntiAliasType;", + "/**\n * The GridFitType class defines values for grid fitting in the TextField class.\n */\nclass GridFitType\n{\n\t/**\n\t * Doesn't set grid fitting. Horizontal and vertical lines in the glyphs are\n\t * not forced to the pixel grid. This constant is used in setting the\n\t * gridFitType property of the TextField class. This is often a\n\t * good setting for animation or for large font sizes. Use the syntax\n\t * GridFitType.NONE.\n\t */\n\tpublic static NONE:string = \"none\";\n\n\t/**\n\t * Fits strong horizontal and vertical lines to the pixel grid. This constant\n\t * is used in setting the gridFitType property of the TextField\n\t * class. This setting only works for left-justified text fields and acts\n\t * like the GridFitType.SUBPIXEL constant in static text. This\n\t * setting generally provides the best readability for left-aligned text. Use\n\t * the syntax GridFitType.PIXEL.\n\t */\n\tpublic static PIXEL:string = \"pixel\";\n\n\t/**\n\t * Fits strong horizontal and vertical lines to the sub-pixel grid on LCD\n\t * monitors. (Red, green, and blue are actual pixels on an LCD screen.) This\n\t * is often a good setting for right-aligned or center-aligned dynamic text,\n\t * and it is sometimes a useful tradeoff for animation vs. text quality. This\n\t * constant is used in setting the gridFitType property of the\n\t * TextField class. Use the syntax GridFitType.SUBPIXEL.\n\t */\n\tpublic static SUBPIXEL:string = \"subpixel\";\n}\n\nexport = GridFitType;", + "/**\n * The TextFieldAutoSize class is an enumeration of constant values used in\n * setting the autoSize property of the TextField class.\n */\nclass TextFieldAutoSize\n{\n\t/**\n\t * Specifies that the text is to be treated as center-justified text. Any\n\t * resizing of a single line of a text field is equally distributed to both\n\t * the right and left sides.\n\t */\n\tpublic static CENTER:string = \"center\";\n\n\t/**\n\t * Specifies that the text is to be treated as left-justified text, meaning\n\t * that the left side of the text field remains fixed and any resizing of a\n\t * single line is on the right side.\n\t */\n\tpublic static LEFT:string = \"left\";\n\n\t/**\n\t * Specifies that no resizing is to occur.\n\t */\n\tpublic static NONE:string = \"none\";\n\n\t/**\n\t * Specifies that the text is to be treated as right-justified text, meaning\n\t * that the right side of the text field remains fixed and any resizing of a\n\t * single line is on the left side.\n\t */\n\tpublic static RIGHT:string = \"right\";\n}\n\nexport = TextFieldAutoSize;", + "/**\n * The TextFieldType class is an enumeration of constant values used in setting the\n * type property of the TextField class.\n *\n * @see away.entities.TextField#type\n */\nclass TextFieldType\n{\n\t/**\n\t * Used to specify a dynamic TextField.\n\t */\n\tpublic static DYNAMIC:string = \"dynamic\";\n\n\t/**\n\t * Used to specify an input TextField.\n\t */\n\tpublic static INPUT:string = \"input\";\n}\n\nexport = TextFieldType;", + "/**\n * The TextFormatAlign class provides values for text alignment in the\n * TextFormat class.\n */\nclass TextFormatAlign\n{\n\t/**\n\t * Constant; centers the text in the text field. Use the syntax\n\t * TextFormatAlign.CENTER.\n\t */\n\tpublic CENTER:string = \"center\";\n\n\t/**\n\t * Constant; justifies text within the text field. Use the syntax\n\t * TextFormatAlign.JUSTIFY.\n\t */\n\tpublic JUSTIFY:string = \"justify\";\n\n\t/**\n\t * Constant; aligns text to the left within the text field. Use the syntax\n\t * TextFormatAlign.LEFT.\n\t */\n\tpublic LEFT:string = \"left\";\n\n\t/**\n\t * Constant; aligns text to the right within the text field. Use the syntax\n\t * TextFormatAlign.RIGHT.\n\t */\n\tpublic RIGHT:string = \"right\";\n}\n\nexport = TextFormatAlign;", + "/**\n * The TextFormat class represents character formatting information. Use the\n * TextFormat class to create specific text formatting for text fields. You\n * can apply text formatting to both static and dynamic text fields. The\n * properties of the TextFormat class apply to device and embedded fonts.\n * However, for embedded fonts, bold and italic text actually require specific\n * fonts. If you want to display bold or italic text with an embedded font,\n * you need to embed the bold and italic variations of that font.\n *\n *

You must use the constructor new TextFormat() to create a\n * TextFormat object before setting its properties. When you apply a\n * TextFormat object to a text field using the\n * TextField.defaultTextFormat property or the\n * TextField.setTextFormat() method, only its defined properties\n * are applied. Use the TextField.defaultTextFormat property to\n * apply formatting BEFORE you add text to the TextField, and the\n * setTextFormat() method to add formatting AFTER you add text to\n * the TextField. The TextFormat properties are null\n * by default because if you don't provide values for the properties, Flash\n * Player uses its own default formatting. The default formatting that Flash\n * Player uses for each property(if property's value is null) is\n * as follows:

\n *\n *

The default formatting for each property is also described in each\n * property description.

\n */\nclass TextFormat\n{\n\n\t/**\n\t * Indicates the alignment of the paragraph. Valid values are TextFormatAlign\n\t * constants.\n\t *\n\t * @default TextFormatAlign.LEFT\n\t * @throws ArgumentError The align specified is not a member of\n\t * flash.text.TextFormatAlign.\n\t */\n\tpublic align:string;\n\n\t/**\n\t * Indicates the block indentation in pixels. Block indentation is applied to\n\t * an entire block of text; that is, to all lines of the text. In contrast,\n\t * normal indentation(TextFormat.indent) affects only the first\n\t * line of each paragraph. If this property is null, the\n\t * TextFormat object does not specify block indentation(block indentation is\n\t * 0).\n\t */\n\tpublic blockIndent:number;\n\n\t/**\n\t * Specifies whether the text is boldface. The default value is\n\t * null, which means no boldface is used. If the value is\n\t * true, then the text is boldface.\n\t */\n\tpublic bold:boolean;\n\n\t/**\n\t * Indicates that the text is part of a bulleted list. In a bulleted list,\n\t * each paragraph of text is indented. To the left of the first line of each\n\t * paragraph, a bullet symbol is displayed. The default value is\n\t * null, which means no bulleted list is used.\n\t */\n\tpublic bullet:boolean;\n\n\t/**\n\t * Indicates the color of the text. A number containing three 8-bit RGB\n\t * components; for example, 0xFF0000 is red, and 0x00FF00 is green. The\n\t * default value is null, which means that Flash Player uses the\n\t * color black(0x000000).\n\t */\n\tpublic color:boolean;\n\n\t/**\n\t * The name of the font for text in this text format, as a string. The\n\t * default value is null, which means that Flash Player uses\n\t * Times New Roman font for the text.\n\t */\n\tpublic font:string;\n\n\t/**\n\t * Indicates the indentation from the left margin to the first character in\n\t * the paragraph. The default value is null, which indicates\n\t * that no indentation is used.\n\t */\n\tpublic indent:number;\n\n\t/**\n\t * Indicates whether text in this text format is italicized. The default\n\t * value is null, which means no italics are used.\n\t */\n\tpublic italic:boolean;\n\n\t/**\n\t * A Boolean value that indicates whether kerning is enabled\n\t * (true) or disabled(false). Kerning adjusts the\n\t * pixels between certain character pairs to improve readability, and should\n\t * be used only when necessary, such as with headings in large fonts. Kerning\n\t * is supported for embedded fonts only.\n\t *\n\t *

Certain fonts such as Verdana and monospaced fonts, such as Courier\n\t * New, do not support kerning.

\n\t *\n\t *

The default value is null, which means that kerning is not\n\t * enabled.

\n\t */\n\tpublic kerning:boolean;\n\n\t/**\n\t * An integer representing the amount of vertical space(called\n\t * leading) between lines. The default value is null,\n\t * which indicates that the amount of leading used is 0.\n\t */\n\tpublic leading:number;\n\n\t/**\n\t * The left margin of the paragraph, in pixels. The default value is\n\t * null, which indicates that the left margin is 0 pixels.\n\t */\n\tpublic leftMargin:number;\n\n\t/**\n\t * A number representing the amount of space that is uniformly distributed\n\t * between all characters. The value specifies the number of pixels that are\n\t * added to the advance after each character. The default value is\n\t * null, which means that 0 pixels of letter spacing is used.\n\t * You can use decimal values such as 1.75.\n\t */\n\tpublic letterSpacing:number;\n\n\t/**\n\t * The right margin of the paragraph, in pixels. The default value is\n\t * null, which indicates that the right margin is 0 pixels.\n\t */\n\tpublic rightMargin:number;\n\n\t/**\n\t * The size in pixels of text in this text format. The default value is\n\t * null, which means that a size of 12 is used.\n\t */\n\tpublic size:number;\n\n\t/**\n\t * Specifies custom tab stops as an array of non-negative integers. Each tab\n\t * stop is specified in pixels. If custom tab stops are not specified\n\t * (null), the default tab stop is 4(average character width).\n\t */\n\tpublic tabStops:Array = new Array();\n\n\t/**\n\t * Indicates the target window where the hyperlink is displayed. If the\n\t * target window is an empty string, the text is displayed in the default\n\t * target window _self. You can choose a custom name or one of\n\t * the following four names: _self specifies the current frame\n\t * in the current window, _blank specifies a new window,\n\t * _parent specifies the parent of the current frame, and\n\t * _top specifies the top-level frame in the current window. If\n\t * the TextFormat.url property is an empty string or\n\t * null, you can get or set this property, but the property will\n\t * have no effect.\n\t */\n\tpublic target:string;\n\n\t/**\n\t * Indicates whether the text that uses this text format is underlined\n\t * (true) or not(false). This underlining is\n\t * similar to that produced by the tag, but the latter is\n\t * not true underlining, because it does not skip descenders correctly. The\n\t * default value is null, which indicates that underlining is\n\t * not used.\n\t */\n\tpublic underline:boolean;\n\n\t/**\n\t * Indicates the target URL for the text in this text format. If the\n\t * url property is an empty string, the text does not have a\n\t * hyperlink. The default value is null, which indicates that\n\t * the text does not have a hyperlink.\n\t *\n\t *

Note: The text with the assigned text format must be set with\n\t * the htmlText property for the hyperlink to work.

\n\t */\n\tpublic url:string;\n\n\t/**\n\t * Creates a TextFormat object with the specified properties. You can then\n\t * change the properties of the TextFormat object to change the formatting of\n\t * text fields.\n\t *\n\t *

Any parameter may be set to null to indicate that it is\n\t * not defined. All of the parameters are optional; any omitted parameters\n\t * are treated as null.

\n\t *\n\t * @param font The name of a font for text as a string.\n\t * @param size An integer that indicates the size in pixels.\n\t * @param color The color of text using this text format. A number\n\t * containing three 8-bit RGB components; for example,\n\t * 0xFF0000 is red, and 0x00FF00 is green.\n\t * @param bold A Boolean value that indicates whether the text is\n\t * boldface.\n\t * @param italic A Boolean value that indicates whether the text is\n\t * italicized.\n\t * @param underline A Boolean value that indicates whether the text is\n\t * underlined.\n\t * @param url The URL to which the text in this text format\n\t * hyperlinks. If url is an empty string, the\n\t * text does not have a hyperlink.\n\t * @param target The target window where the hyperlink is displayed. If\n\t * the target window is an empty string, the text is\n\t * displayed in the default target window\n\t * _self. If the url parameter\n\t * is set to an empty string or to the value\n\t * null, you can get or set this property,\n\t * but the property will have no effect.\n\t * @param align The alignment of the paragraph, as a TextFormatAlign\n\t * value.\n\t * @param leftMargin Indicates the left margin of the paragraph, in pixels.\n\t * @param rightMargin Indicates the right margin of the paragraph, in pixels.\n\t * @param indent An integer that indicates the indentation from the left\n\t * margin to the first character in the paragraph.\n\t * @param leading A number that indicates the amount of leading vertical\n\t * space between lines.\n\t */\n\tconstructor(font:string = \"Times New Roman\", size:number = 12, color:number /*int*/ = 0x000000, bold:boolean = false, italic:boolean = false, underline:boolean = false, url:string = \"\", target:string = \"\", align:string = \"left\", leftMargin:number = 0, rightMargin:number = 0, indent:number = 0, leading:number = 0)\n\t{\n\t\tthis.font = font;\n\t\tthis.size = size;\n\t\tthis.bold = bold;\n\t\tthis.italic = italic;\n\t\tthis.underline = underline;\n\t\tthis.url = url;\n\t\tthis.target = target;\n\t\tthis.align = align;\n\t\tthis.leftMargin = leftMargin;\n\t\tthis.rightMargin = rightMargin;\n\t\tthis.indent = indent;\n\t\tthis.leading = leading;\n\t}\n}\n\nexport = TextFormat;", + "/**\n * A class that defines the Interactive mode of a text field object.\n *\n * @see away.entities.TextField#textInteractionMode\n */\nclass TextInteractionMode\n{\n\t/**\n\t * The text field's default interaction mode is NORMAL and it varies across\n\t * platform. On Desktop, the normal mode implies that the text field is in\n\t * scrollable + selection mode. On Mobile platforms like Android, normal mode\n\t * implies that the text field can only be scrolled but the text can not be\n\t * selected.\n\t */\n\tpublic static NORMAL:string = \"normal\";\n\n\t/**\n\t * On mobile platforms like Android, the text field starts in normal mode\n\t * (which implies scroll and non-selectable mode). The user can switch to\n\t * selection mode through the in-built context menu of the text field object.\n\t */\n\tpublic static SELECTION:string = \"selection\";\n}\n\nexport = TextInteractionMode;", + "/**\n * The TextLineMetrics class contains information about the text position and\n * measurements of a line of text within a text field. All measurements are in\n * pixels. Objects of this class are returned by the \n * away.entities.TextField.getLineMetrics() method.\n */\nclass TextLineMetrics\n{\n\t/**\n\t * The ascent value of the text is the length from the baseline to the top of\n\t * the line height in pixels.\n\t */\n\tpublic ascent:number;\n\n\t/**\n\t * The descent value of the text is the length from the baseline to the\n\t * bottom depth of the line in pixels.\n\t */\n\tpublic descent:number;\n\n\t/**\n\t * The height value of the text of the selected lines (not necessarily the\n\t * complete text) in pixels. The height of the text line does not include the\n\t * gutter height.\n\t */\n\tpublic height:number;\n\n\t/**\n\t * The leading value is the measurement of the vertical distance between the\n\t * lines of text.\n\t */\n\tpublic leading:number;\n\n\t/**\n\t * The width value is the width of the text of the selected lines (not\n\t * necessarily the complete text) in pixels. The width of the text line is\n\t * not the same as the width of the text field. The width of the text line is\n\t * relative to the text field width, minus the gutter width of 4 pixels\n\t * (2 pixels on each side).\n\t */\n\tpublic width:number;\n\n\t/**\n\t * The x value is the left position of the first character in pixels. This\n\t * value includes the margin, indent (if any), and gutter widths.\n\t */\n\tpublic x:number;\n\n\t/**\n\t * Creates a TextLineMetrics object. The TextLineMetrics object contains\n\t * information about the text metrics of a line of text in a text field.\n\t * Objects of this class are returned by the\n\t * away.entities.TextField.getLineMetrics() method.\n\t *\n\t * @param x The left position of the first character in pixels.\n\t * @param width The width of the text of the selected lines (not\n\t * necessarily the complete text) in pixels.\n\t * @param height The height of the text of the selected lines (not\n\t * necessarily the complete text) in pixels.\n\t * @param ascent The length from the baseline to the top of the line\n\t * height in pixels.\n\t * @param descent The length from the baseline to the bottom depth of\n\t * the line in pixels.\n\t * @param leading The measurement of the vertical distance between the\n\t * lines of text.\n\t */\n\tconstructor(x:number = NaN, width:number = NaN, height:number = NaN, ascent:number = NaN, descent:number = NaN, leading:number = NaN)\n\t{\n\n\t}\n}\n\nexport = TextLineMetrics;", + "import CollectorBase\t\t\t\t= require(\"awayjs-core/lib/core/traverse/CollectorBase\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\n\n/**\n * @class away.traverse.CSSEntityCollector\n */\nclass CSSEntityCollector extends CollectorBase implements ICollector\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n}\n\nexport = CSSEntityCollector;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport EntityListItem\t\t\t\t= require(\"awayjs-core/lib/core/pool/EntityListItem\");\nimport EntityListItemPool\t\t\t= require(\"awayjs-core/lib/core/pool/EntityListItemPool\");\nimport NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.traverse.CollectorBase\n */\nclass CollectorBase implements ICollector\n{\n\tpublic scene:Scene;\n\n\tpublic _pEntityHead:EntityListItem;\n\tpublic _pEntityListItemPool:EntityListItemPool;\n\tpublic _pCamera:Camera;\n\tprivate _customCullPlanes:Array;\n\tprivate _cullPlanes:Array;\n\tprivate _numCullPlanes:number = 0;\n\tpublic _pNumEntities:number = 0;\n\tpublic _pNumInteractiveEntities:number = 0;\n\n\tconstructor()\n\t{\n\t\tthis._pEntityListItemPool = new EntityListItemPool();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get camera():Camera\n\t{\n\t\treturn this._pCamera;\n\t}\n\n\tpublic set camera(value:Camera)\n\t{\n\t\tthis._pCamera = value;\n\t\tthis._cullPlanes = this._pCamera.frustumPlanes;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get cullPlanes():Array\n\t{\n\t\treturn this._customCullPlanes;\n\t}\n\n\tpublic set cullPlanes(value:Array)\n\t{\n\t\tthis._customCullPlanes = value;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get entityHead():EntityListItem\n\t{\n\t\treturn this._pEntityHead;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get numEntities():number\n\t{\n\t\treturn this._pNumEntities;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get numInteractiveEntities():number\n\t{\n\t\treturn this._pNumInteractiveEntities;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic clear()\n\t{\n\t\tthis._pNumEntities = this._pNumInteractiveEntities = 0;\n\t\tthis._cullPlanes = this._customCullPlanes? this._customCullPlanes : ( this._pCamera? this._pCamera.frustumPlanes : null );\n\t\tthis._numCullPlanes = this._cullPlanes? this._cullPlanes.length : 0;\n\t\tthis._pEntityHead = null;\n\t\tthis._pEntityListItemPool.freeAll();\n\t}\n\n\t/**\n\t *\n\t * @param node\n\t * @returns {boolean}\n\t */\n\tpublic enterNode(node:NodeBase):boolean\n\t{\n\t\tvar enter:boolean = this.scene._iCollectionMark != node._iCollectionMark && node.isInFrustum(this._cullPlanes, this._numCullPlanes);\n\n\t\tnode._iCollectionMark = this.scene._iCollectionMark;\n\n\t\treturn enter;\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applyDirectionalLight(entity:IEntity)\n\t{\n\t\t//don't do anything here\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applyEntity(entity:IEntity)\n\t{\n\t\tthis._pNumEntities++;\n\n\t\tif (entity._iIsMouseEnabled())\n\t\t\tthis._pNumInteractiveEntities++;\n\n\t\tvar item:EntityListItem = this._pEntityListItemPool.getItem();\n\t\titem.entity = entity;\n\n\t\titem.next = this._pEntityHead;\n\t\tthis._pEntityHead = item;\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applyLightProbe(entity:IEntity)\n\t{\n\t\t//don't do anything here\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applyPointLight(entity:IEntity)\n\t{\n\t\t//don't do anything here\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applySkybox(entity:IEntity)\n\t{\n\t\t//don't do anything here\n\t}\n}\n\nexport = CollectorBase;", + "import LightBase\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LightBase\");\nimport CollectorBase\t\t\t\t= require(\"awayjs-core/lib/core/traverse/CollectorBase\");\nimport DirectionalLight\t\t\t\t= require(\"awayjs-core/lib/entities/DirectionalLight\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport LightProbe\t\t\t\t\t= require(\"awayjs-core/lib/entities/LightProbe\");\nimport PointLight\t\t\t\t\t= require(\"awayjs-core/lib/entities/PointLight\");\nimport Skybox\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Skybox\");\n\n/**\n * @class away.traverse.EntityCollector\n */\nclass EntityCollector extends CollectorBase\n{\n\tpublic _pSkybox:Skybox;\n\tpublic _pLights:Array;\n\tprivate _directionalLights:Array;\n\tprivate _pointLights:Array;\n\tprivate _lightProbes:Array;\n\n\tpublic _pNumLights:number = 0;\n\n\tprivate _numDirectionalLights:number = 0;\n\tprivate _numPointLights:number = 0;\n\tprivate _numLightProbes:number = 0;\n\n\t/**\n\t *\n\t */\n\tpublic get directionalLights():Array\n\t{\n\t\treturn this._directionalLights;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get lightProbes():Array\n\t{\n\t\treturn this._lightProbes;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get lights():Array\n\t{\n\t\treturn this._pLights;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get pointLights():Array\n\t{\n\t\treturn this._pointLights;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get skyBox():Skybox\n\t{\n\t\treturn this._pSkybox;\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._pLights = new Array();\n\t\tthis._directionalLights = new Array();\n\t\tthis._pointLights = new Array();\n\t\tthis._lightProbes = new Array();\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applyDirectionalLight(entity:IEntity)\n\t{\n\t\tthis._directionalLights[ this._numDirectionalLights++ ] = entity;\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applyLightProbe(entity:IEntity)\n\t{\n\t\tthis._lightProbes[ this._numLightProbes++ ] = entity;\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applyPointLight(entity:IEntity)\n\t{\n\t\tthis._pointLights[ this._numPointLights++ ] = entity;\n\t}\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tpublic applySkybox(entity:IEntity)\n\t{\n\t\tthis._pSkybox = entity;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic clear()\n\t{\n\t\tsuper.clear();\n\n\t\tthis._pSkybox = null;\n\n\t\tif (this._pNumLights > 0)\n\t\t\tthis._pLights.length = this._pNumLights = 0;\n\n\t\tif (this._numDirectionalLights > 0)\n\t\t\tthis._directionalLights.length = this._numDirectionalLights = 0;\n\n\t\tif (this._numPointLights > 0)\n\t\t\tthis._pointLights.length = this._numPointLights = 0;\n\n\t\tif (this._numLightProbes > 0)\n\t\t\tthis._lightProbes.length = this._numLightProbes = 0;\n\t}\n}\n\nexport = EntityCollector;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport DirectionalLight\t\t\t\t= require(\"awayjs-core/lib/entities/DirectionalLight\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * @class away.traverse.ICollector\n */\ninterface ICollector\n{\n\t/**\n\t *\n\t */\n\tcamera:Camera;\n\n\t/**\n\t *\n\t */\n\tscene:Scene;\n\n\t/**\n\t *\n\t */\n\tnumEntities:number;\n\n\t/**\n\t *\n\t */\n\tnumInteractiveEntities:number;\n\n\t/**\n\t *\n\t */\n\tclear();\n\n\t/**\n\t *\n\t */\n\tentityHead;\n\n\t/**\n\t *\n\t * @param node\n\t */\n\tenterNode(node:NodeBase):boolean;\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tapplyDirectionalLight(entity:IEntity);\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tapplyEntity(entity:IEntity);\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tapplyLightProbe(entity:IEntity);\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tapplyPointLight(entity:IEntity);\n\n\n\t/**\n\t *\n\t * @param entity\n\t */\n\tapplySkybox(entity:IEntity);\n}\n\nexport = ICollector;", + "import Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport CollectorBase\t\t\t\t= require(\"awayjs-core/lib/core/traverse/CollectorBase\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\n\n/**\n * The RaycastCollector class is a traverser for scene partitions that collects all scene graph entities that are\n * considered intersecting with the defined ray.\n *\n * @see away.partition.Partition\n * @see away.entities.IEntity\n *\n * @class away.traverse.RaycastCollector\n */\nclass RaycastCollector extends CollectorBase\n{\n\tprivate _rayPosition:Vector3D = new Vector3D();\n\tprivate _rayDirection:Vector3D = new Vector3D();\n\n\tpublic _iCollectionMark:number = 0;\n\n\t/**\n\t * Provides the starting position of the ray.\n\t */\n\tpublic get rayPosition():Vector3D\n\t{\n\t\treturn this._rayPosition;\n\t}\n\n\tpublic set rayPosition(value:Vector3D)\n\t{\n\t\tthis._rayPosition = value;\n\t}\n\n\t/**\n\t * Provides the direction vector of the ray.\n\t */\n\tpublic get rayDirection():Vector3D\n\t{\n\t\treturn this._rayDirection;\n\t}\n\n\tpublic set rayDirection(value:Vector3D)\n\t{\n\t\tthis._rayDirection = value;\n\t}\n\n\t/**\n\t * Creates a new RaycastCollector object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t * Returns true if the current node is at least partly in the frustum. If so, the partition node knows to pass on the traverser to its children.\n\t *\n\t * @param node The Partition3DNode object to frustum-test.\n\t */\n\tpublic enterNode(node:NodeBase):boolean\n\t{\n\t\treturn node.isIntersectingRay(this._rayPosition, this._rayDirection);\n\t}\n}\n\nexport = RaycastCollector;", + "import NodeBase\t\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/NodeBase\");\nimport CollectorBase\t\t\t\t= require(\"awayjs-core/lib/core/traverse/CollectorBase\");\n\n/**\n * @class away.traverse.ShadowCasterCollector\n */\nclass ShadowCasterCollector extends CollectorBase\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic enterNode(node:NodeBase):boolean\n\t{\n\t\tvar enter:boolean = this.scene._iCollectionMark != node._iCollectionMark && node.isCastingShadow();\n\n\t\tif (!enter) {\n\t\t\tnode._iCollectionMark = this.scene._iCollectionMark;\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn super.enterNode(node);\n\t}\n}\n\nexport = ShadowCasterCollector;", + "class Keyboard\n{\n\t/**\n\t * Constant associated with the key code value for the A key (65).\n\t */\n\tpublic static A:number /*uint*/ = 65;\n\n\t/**\n\t * Constant associated with the key code value for the Alternate (Option) key (18).\n\t */\n\tpublic static ALTERNATE:number /*uint*/ = 18;\n\n\t/**\n\t * Select the audio mode\n\t */\n\tpublic static AUDIO:number /*uint*/ = 0x01000017;\n\n\t/**\n\t * Constant associated with the key code value for the B key (66).\n\t */\n\tpublic static B:number /*uint*/ = 66;\n\n\t/**\n\t * Return to previous page in application\n\t */\n\tpublic static BACK:number /*uint*/ = 0x01000016;\n\n\t/**\n\t * Constant associated with the key code value for the ` key (192).\n\t */\n\tpublic static BACKQUOTE:number /*uint*/ = 192;\n\n\t/**\n\t * Constant associated with the key code value for the \\ key (220).\n\t */\n\tpublic static BACKSLASH:number /*uint*/ = 220;\n\n\t/**\n\t * Constant associated with the key code value for the Backspace key (8).\n\t */\n\tpublic static BACKSPACE:number /*uint*/ = 8;\n\n\t/**\n\t * Blue function key button\n\t */\n\tpublic static BLUE:number /*uint*/ = 0x01000003;\n\n\t/**\n\t * Constant associated with the key code value for the C key (67).\n\t */\n\tpublic static C:number /*uint*/ = 67;\n\n\t/**\n\t * Constant associated with the key code value for the Caps Lock key (20).\n\t */\n\tpublic static CAPS_LOCK:number /*uint*/ = 20;\n\n\t/**\n\t * Channel down\n\t */\n\tpublic static CHANNEL_DOWN:number /*uint*/ = 0x01000005;\n\n\t/**\n\t * Channel up\n\t */\n\tpublic static CHANNEL_UP:number /*uint*/ = 0x01000005;\n\n\t/**\n\t * Constant associated with the key code value for the , key (188).\n\t */\n\tpublic static COMMA:number /*uint*/ = 188;\n\n\t/**\n\t * Constant associated with the Mac command key (15). This constant is\n\t * currently only used for setting menu key equivalents.\n\t */\n\tpublic static COMMAND:number /*uint*/ = 15;\n\n\t/**\n\t * Constant associated with the key code value for the Control key (17).\n\t */\n\tpublic static CONTROL:number /*uint*/ = 17;\n\n\t/**\n\t * An array containing all the defined key name constants.\n\t */\n\tpublic static CharCodeStrings:Array;\n\n\t/**\n\t * Constant associated with the key code value for the D key (68).\n\t */\n\tpublic static D:number /*uint*/ = 68;\n\n\t/**\n\t * Constant associated with the key code value for the Delete key (46).\n\t */\n\tpublic static DELETE:number /*uint*/ = 46;\n\n\t/**\n\t * Constant associated with the key code value for the Down Arrow key (40).\n\t */\n\tpublic static DOWN:number /*uint*/ = 40;\n\n\t/**\n\t * Engage DVR application mode\n\t */\n\tpublic static DVR:number /*uint*/ = 0x01000019;\n\n\t/**\n\t * Constant associated with the key code value for the E key (69).\n\t */\n\tpublic static E:number /*uint*/ = 69;\n\n\t/**\n\t * Constant associated with the key code value for the End key (35).\n\t */\n\tpublic static END:number /*uint*/ = 35;\n\n\t/**\n\t * Constant associated with the key code value for the Enter key (13).\n\t */\n\tpublic static ENTER:number /*uint*/ = 13;\n\n\t/**\n\t * Constant associated with the key code value for the = key (187).\n\t */\n\tpublic static EQUAL:number /*uint*/ = 187;\n\n\t/**\n\t * Constant associated with the key code value for the Escape key (27).\n\t */\n\tpublic static ESCAPE:number /*uint*/ = 27;\n\n\t/**\n\t * Exits current application mode\n\t */\n\tpublic static EXIT:number /*uint*/ = 0x01000015;\n\n\t/**\n\t * Constant associated with the key code value for the F key (70).\n\t */\n\tpublic static F:number /*uint*/ = 70;\n\n\t/**\n\t * Constant associated with the key code value for the F1 key (112).\n\t */\n\tpublic static F1:number /*uint*/ = 112;\n\n\t/**\n\t * Constant associated with the key code value for the F10 key (121).\n\t */\n\tpublic static F10:number /*uint*/ = 121;\n\n\t/**\n\t * Constant associated with the key code value for the F11 key (122).\n\t */\n\tpublic static F11:number /*uint*/ = 122;\n\n\t/**\n\t * Constant associated with the key code value for the F12 key (123).\n\t */\n\tpublic static F12:number /*uint*/ = 123;\n\n\t/**\n\t * Constant associated with the key code value for the F13 key (124).\n\t */\n\tpublic static F13:number /*uint*/ = 124;\n\n\t/**\n\t * Constant associated with the key code value for the F14 key (125).\n\t */\n\tpublic static F14:number /*uint*/ = 125;\n\n\t/**\n\t * Constant associated with the key code value for the F15 key (126).\n\t */\n\tpublic static F15:number /*uint*/ = 126;\n\n\t/**\n\t * Constant associated with the key code value for the F2 key (113).\n\t */\n\tpublic static F2:number /*uint*/ = 113;\n\n\t/**\n\t * Constant associated with the key code value for the F3 key (114).\n\t */\n\tpublic static F3:number /*uint*/ = 114;\n\n\t/**\n\t * Constant associated with the key code value for the F4 key (115).\n\t */\n\tpublic static F4:number /*uint*/ = 115;\n\n\t/**\n\t * Constant associated with the key code value for the F5 key (116).\n\t */\n\tpublic static F5:number /*uint*/ = 116;\n\n\t/**\n\t * Constant associated with the key code value for the F6 key (117).\n\t */\n\tpublic static F6:number /*uint*/ = 117;\n\n\t/**\n\t * Constant associated with the key code value for the F7 key (118).\n\t */\n\tpublic static F7:number /*uint*/ = 118;\n\n\t/**\n\t * Constant associated with the key code value for the F8 key (119).\n\t */\n\tpublic static F8:number /*uint*/ = 119;\n\n\t/**\n\t * Constant associated with the key code value for the F9 key (120).\n\t */\n\tpublic static F9:number /*uint*/ = 120;\n\n\t/**\n\t * Engage fast-forward transport mode\n\t */\n\tpublic static FAST_FORWARD:number /*uint*/ = 0x0100000A;\n\n\t/**\n\t * Constant associated with the key code value for the G key (71).\n\t */\n\tpublic static G:number /*uint*/ = 71;\n\n\t/**\n\t * Green function key button\n\t */\n\tpublic static GREEN:number /*uint*/ = 0x01000001;\n\n\t/**\n\t * Engage program guide\n\t */\n\tpublic static GUIDE:number /*uint*/ = 0x01000014;\n\n\t/**\n\t * Constant associated with the key code value for the H key (72).\n\t */\n\tpublic static H:number /*uint*/ = 72;\n\n\t/**\n\t * Engage help application or context-sensitive help\n\t */\n\tpublic static HELP:number /*uint*/ = 0x0100001D;\n\n\t/**\n\t * Constant associated with the key code value for the Home key (36).\n\t */\n\tpublic static HOME:number /*uint*/ = 36;\n\n\t/**\n\t * Constant associated with the key code value for the I key (73).\n\t */\n\tpublic static I:number /*uint*/ = 73;\n\n\t/**\n\t * Info button\n\t */\n\tpublic static INFO:number /*uint*/ = 0x01000013;\n\n\t/**\n\t * Cycle input\n\t */\n\tpublic static INPUT:number /*uint*/ = 0x0100001B;\n\n\t/**\n\t * Constant associated with the key code value for the Insert key (45).\n\t */\n\tpublic static INSERT:number /*uint*/ = 45;\n\n\t/**\n\t * Constant associated with the key code value for the J key (74).\n\t */\n\tpublic static J:number /*uint*/ = 74;\n\n\t/**\n\t * Constant associated with the key code value for the K key (75).\n\t */\n\tpublic static K:number /*uint*/ = 75;\n\n\t/**\n\t * The Begin key\n\t */\n\tpublic static KEYNAME_BEGIN:string = \"Begin\";\n\n\t/**\n\t * The Break key\n\t */\n\tpublic static KEYNAME_BREAK:string = \"Break\";\n\n\t/**\n\t * The Clear Display key\n\t */\n\tpublic static KEYNAME_CLEARDISPLAY:string = \"ClrDsp\";\n\n\t/**\n\t * The Clear Line key\n\t */\n\tpublic static KEYNAME_CLEARLINE:string = \"ClrLn\";\n\n\t/**\n\t * The Delete key\n\t */\n\tpublic static KEYNAME_DELETE:string = \"Delete\";\n\n\t/**\n\t * The Delete Character key\n\t */\n\tpublic static KEYNAME_DELETECHAR:string = \"DelChr\";\n\n\t/**\n\t * The Delete Line key\n\t */\n\tpublic static KEYNAME_DELETELINE:string = \"DelLn\";\n\n\t/**\n\t * The down arrow\n\t */\n\tpublic static KEYNAME_DOWNARROW:string = \"Down\";\n\n\t/**\n\t * The End key\n\t */\n\tpublic static KEYNAME_END:string = \"End\";\n\n\t/**\n\t * The Execute key\n\t */\n\tpublic static KEYNAME_EXECUTE:string = \"Exec\";\n\n\t/**\n\t * The F1 key\n\t */\n\tpublic static KEYNAME_F1:string = \"F1\";\n\n\t/**\n\t * The F10 key\n\t */\n\tpublic static KEYNAME_F10:string = \"F10\";\n\n\t/**\n\t * The F11 key\n\t */\n\tpublic static KEYNAME_F11:string = \"F11\";\n\n\t/**\n\t * The F12 key\n\t */\n\tpublic static KEYNAME_F12:string = \"F12\";\n\n\t/**\n\t * The F13 key\n\t */\n\tpublic static KEYNAME_F13:string = \"F13\";\n\n\t/**\n\t * The F14 key\n\t */\n\tpublic static KEYNAME_F14:string = \"F14\";\n\n\t/**\n\t * The F15 key\n\t */\n\tpublic static KEYNAME_F15:string = \"F15\";\n\n\t/**\n\t * The F16 key\n\t */\n\tpublic static KEYNAME_F16:string = \"F16\";\n\n\t/**\n\t * The F17 key\n\t */\n\tpublic static KEYNAME_F17:string = \"F17\";\n\n\t/**\n\t * The F18 key\n\t */\n\tpublic static KEYNAME_F18:string = \"F18\";\n\n\t/**\n\t * The F19 key\n\t */\n\tpublic static KEYNAME_F19:string = \"F19\";\n\n\t/**\n\t * The F2 key\n\t */\n\tpublic static KEYNAME_F2:string = \"F2\";\n\n\t/**\n\t * The F20 key\n\t */\n\tpublic static KEYNAME_F20:string = \"F20\";\n\n\t/**\n\t * The F21 key\n\t */\n\tpublic static KEYNAME_F21:string = \"F21\";\n\n\t/**\n\t * The F22 key\n\t */\n\tpublic static KEYNAME_F22:string = \"F22\";\n\n\t/**\n\t * The F23 key\n\t */\n\tpublic static KEYNAME_F23:string = \"F23\";\n\n\t/**\n\t * The F24 key\n\t */\n\tpublic static KEYNAME_F24:string = \"F24\";\n\n\t/**\n\t * The F25 key\n\t */\n\tpublic static KEYNAME_F25:string = \"F25\";\n\n\t/**\n\t * The F26 key\n\t */\n\tpublic static KEYNAME_F26:string = \"F26\";\n\n\t/**\n\t * The F27 key\n\t */\n\tpublic static KEYNAME_F27:string = \"F27\";\n\n\t/**\n\t * The F28 key\n\t */\n\tpublic static KEYNAME_F28:string = \"F28\";\n\n\t/**\n\t * The F29 key\n\t */\n\tpublic static KEYNAME_F29:string = \"F29\";\n\n\t/**\n\t * The F3 key\n\t */\n\tpublic static KEYNAME_F3:string = \"F3\";\n\n\t/**\n\t * The F30 key\n\t */\n\tpublic static KEYNAME_F30:string = \"F30\";\n\n\t/**\n\t * The F31 key\n\t */\n\tpublic static KEYNAME_F31:string = \"F31\";\n\n\t/**\n\t * The F32 key\n\t */\n\tpublic static KEYNAME_F32:string = \"F32\";\n\n\t/**\n\t * The F33 key\n\t */\n\tpublic static KEYNAME_F33:string = \"F33\";\n\n\t/**\n\t * The F34 key\n\t */\n\tpublic static KEYNAME_F34:string = \"F34\";\n\n\t/**\n\t * The F35 key\n\t */\n\tpublic static KEYNAME_F35:string = \"F35\";\n\n\t/**\n\t * The F4 key\n\t */\n\tpublic static KEYNAME_F4:string = \"F4\";\n\n\t/**\n\t * The F5 key\n\t */\n\tpublic static KEYNAME_F5:string = \"F5\";\n\n\t/**\n\t * The F6 key\n\t */\n\tpublic static KEYNAME_F6:string = \"F6\";\n\n\t/**\n\t * The F7 key\n\t */\n\tpublic static KEYNAME_F7:string = \"F7\";\n\n\t/**\n\t * The F8 key\n\t */\n\tpublic static KEYNAME_F8:string = \"F8\";\n\n\t/**\n\t * The F9 key\n\t */\n\tpublic static KEYNAME_F9:string = \"F9\";\n\n\t/**\n\t * The Find key\n\t */\n\tpublic static KEYNAME_FIND:string = \"Find\";\n\n\t/**\n\t * The Help key\n\t */\n\tpublic static KEYNAME_HELP:string = \"Help\";\n\n\t/**\n\t * The Home key\n\t */\n\tpublic static KEYNAME_HOME:string = \"Home\";\n\n\t/**\n\t * The Insert key\n\t */\n\tpublic static KEYNAME_INSERT:string = \"Insert\";\n\n\t/**\n\t * The Insert Character key\n\t */\n\tpublic static KEYNAME_INSERTCHAR:string = \"InsChr\";\n\n\t/**\n\t * The Insert Line key\n\t */\n\tpublic static KEYNAME_INSERTLINE:string = \"LnsLn\";\n\n\t/**\n\t * The left arrow\n\t */\n\tpublic static KEYNAME_LEFTARROW:string = \"Left\";\n\n\t/**\n\t * The Menu key\n\t */\n\tpublic static KEYNAME_MENU:string = \"Menu\";\n\n\t/**\n\t * The Mode Switch key\n\t */\n\tpublic static KEYNAME_MODESWITCH:string = \"ModeSw\";\n\n\t/**\n\t * The Next key\n\t */\n\tpublic static KEYNAME_NEXT:string = \"Next\";\n\n\t/**\n\t * The Page Down key\n\t */\n\tpublic static KEYNAME_PAGEDOWN:string = \"PgDn\";\n\n\t/**\n\t * The Page Up key\n\t */\n\tpublic static KEYNAME_PAGEUP:string = \"PgUp\";\n\n\t/**\n\t * The Pause key\n\t */\n\tpublic static KEYNAME_PAUSE:string = \"Pause\";\n\n\t/**\n\t * The Previous key\n\t */\n\tpublic static KEYNAME_PREV:string = \"Prev\";\n\n\t/**\n\t * The PRINT key\n\t */\n\tpublic static KEYNAME_PRINT:string = \"Print\";\n\n\t/**\n\t * The PRINT Screen\n\t */\n\tpublic static KEYNAME_PRINTSCREEN:string = \"PrntScrn\";\n\n\t/**\n\t * The Redo key\n\t */\n\tpublic static KEYNAME_REDO:string = \"Redo\";\n\n\t/**\n\t * The Reset key\n\t */\n\tpublic static KEYNAME_RESET:string = \"Reset\";\n\n\t/**\n\t * The right arrow\n\t */\n\tpublic static KEYNAME_RIGHTARROW:string = \"Right\";\n\n\t/**\n\t * The Scroll Lock key\n\t */\n\tpublic static KEYNAME_SCROLLLOCK:string = \"ScrlLck\";\n\n\t/**\n\t * The Select key\n\t */\n\tpublic static KEYNAME_SELECT:string = \"Select\";\n\n\t/**\n\t * The Stop key\n\t */\n\tpublic static KEYNAME_STOP:string = \"Stop\";\n\n\t/**\n\t * The System Request key\n\t */\n\tpublic static KEYNAME_SYSREQ:string = \"SysReq\";\n\n\t/**\n\t * The System key\n\t */\n\tpublic static KEYNAME_SYSTEM:string = \"Sys\";\n\n\t/**\n\t * The Undo key\n\t */\n\tpublic static KEYNAME_UNDO:string = \"Undo\";\n\n\t/**\n\t * The up arrow\n\t */\n\tpublic static KEYNAME_UPARROW:string = \"Up\";\n\n\t/**\n\t * The User key\n\t */\n\tpublic static KEYNAME_USER:string = \"User\";\n\n\t/**\n\t * Constant associated with the key code value for the L key (76).\n\t */\n\tpublic static L:number /*uint*/ = 76;\n\n\t/**\n\t * Watch last channel or show watched\n\t */\n\tpublic static LAST:number /*uint*/ = 0x01000011;\n\n\t/**\n\t * Constant associated with the key code value for the Left Arrow key (37).\n\t */\n\tpublic static LEFT:number /*uint*/ = 37;\n\n\t/**\n\t * Constant associated with the key code value for the [ key (219).\n\t */\n\tpublic static LEFTBRACKET:number /*uint*/ = 219;\n\n\t/**\n\t * Return to live [position in broadcast]\n\t */\n\tpublic static LIVE:number /*uint*/ = 0x01000010;\n\n\t/**\n\t * Constant associated with the key code value for the M key (77).\n\t */\n\tpublic static M:number /*uint*/ = 77;\n\n\t/**\n\t * Engage \"Master Shell\" e.g. TiVo or other vendor button\n\t */\n\tpublic static MASTER_SHELL:number /*uint*/ = 0x0100001E;\n\n\t/**\n\t * Engage menu\n\t */\n\tpublic static MENU:number /*uint*/ = 0x01000012;\n\n\t/**\n\t * Constant associated with the key code value for the - key (189).\n\t */\n\tpublic static MINUS:number /*uint*/ = 189;\n\n\t/**\n\t * Constant associated with the key code value for the N key (78).\n\t */\n\tpublic static N:number /*uint*/ = 78;\n\n\t/**\n\t * Skip to next track or chapter\n\t */\n\tpublic static NEXT:number /*uint*/ = 0x0100000E;\n\n\t/**\n\t * Constant associated with the key code value for the 0 key (48).\n\t */\n\tpublic static NUMBER_0:number /*uint*/ = 48;\n\n\t/**\n\t * Constant associated with the key code value for the 1 key (49).\n\t */\n\tpublic static NUMBER_1:number /*uint*/ = 49;\n\n\t/**\n\t * Constant associated with the key code value for the 2 key (50).\n\t */\n\tpublic static NUMBER_2:number /*uint*/ = 50;\n\n\t/**\n\t * Constant associated with the key code value for the 3 key (51).\n\t */\n\tpublic static NUMBER_3:number /*uint*/ = 51;\n\n\t/**\n\t * Constant associated with the key code value for the 4 key (52).\n\t */\n\tpublic static NUMBER_4:number /*uint*/ = 52;\n\n\t/**\n\t * Constant associated with the key code value for the 5 key (53).\n\t */\n\tpublic static NUMBER_5:number /*uint*/ = 53;\n\n\t/**\n\t * Constant associated with the key code value for the 6 key (54).\n\t */\n\tpublic static NUMBER_6:number /*uint*/ = 54;\n\n\t/**\n\t * Constant associated with the key code value for the 7 key (55).\n\t */\n\tpublic static NUMBER_7:number /*uint*/ = 55;\n\n\t/**\n\t * Constant associated with the key code value for the 8 key (56).\n\t */\n\tpublic static NUMBER_8:number /*uint*/ = 56;\n\n\t/**\n\t * Constant associated with the key code value for the 9 key (57).\n\t */\n\tpublic static NUMBER_9:number /*uint*/ = 57;\n\n\t/**\n\t * Constant associated with the pseudo-key code for the the number pad (21). Use to set numpad modifier on key equivalents\n\t */\n\tpublic static NUMPAD:number /*uint*/ = 21;\n\n\t/**\n\t * Constant associated with the key code value for the number 0 key on the number pad (96).\n\t */\n\tpublic static NUMPAD_0:number /*uint*/ = 96;\n\n\t/**\n\t * Constant associated with the key code value for the number 1 key on the number pad (97).\n\t */\n\tpublic static NUMPAD_1:number /*uint*/ = 97;\n\n\t/**\n\t * Constant associated with the key code value for the number 2 key on the number pad (98).\n\t */\n\tpublic static NUMPAD_2:number /*uint*/ = 98;\n\n\t/**\n\t * Constant associated with the key code value for the number 3 key on the number pad (99).\n\t */\n\tpublic static NUMPAD_3:number /*uint*/ = 99;\n\n\t/**\n\t * Constant associated with the key code value for the number 4 key on the number pad (100).\n\t */\n\tpublic static NUMPAD_4:number /*uint*/ = 100;\n\n\t/**\n\t * Constant associated with the key code value for the number 5 key on the number pad (101).\n\t */\n\tpublic static NUMPAD_5:number /*uint*/ = 101;\n\n\t/**\n\t * Constant associated with the key code value for the number 6 key on the number pad (102).\n\t */\n\tpublic static NUMPAD_6:number /*uint*/ = 102;\n\n\t/**\n\t * Constant associated with the key code value for the number 7 key on the number pad (103).\n\t */\n\tpublic static NUMPAD_7:number /*uint*/ = 103;\n\n\t/**\n\t * Constant associated with the key code value for the number 8 key on the number pad (104).\n\t */\n\tpublic static NUMPAD_8:number /*uint*/ = 104;\n\n\t/**\n\t * Constant associated with the key code value for the number 9 key on the number pad (105).\n\t */\n\tpublic static NUMPAD_9:number /*uint*/ = 105;\n\n\t/**\n\t * Constant associated with the key code value for the addition key on the number pad (107).\n\t */\n\tpublic static NUMPAD_ADD:number /*uint*/ = 107;\n\n\t/**\n\t * Constant associated with the key code value for the decimal key on the number pad (110).\n\t */\n\tpublic static NUMPAD_DECIMAL:number /*uint*/ = 110;\n\n\t/**\n\t * Constant associated with the key code value for the division key on the number pad (111).\n\t */\n\tpublic static NUMPAD_DIVIDE:number /*uint*/ = 111;\n\n\t/**\n\t * Constant associated with the key code value for the Enter key on the number pad (108).\n\t */\n\tpublic static NUMPAD_ENTER:number /*uint*/ = 108;\n\n\t/**\n\t * Constant associated with the key code value for the multiplication key on the number pad (106).\n\t */\n\tpublic static NUMPAD_MULTIPLY:number /*uint*/ = 106;\n\n\t/**\n\t * Constant associated with the key code value for the subtraction key on the number pad (109).\n\t */\n\tpublic static NUMPAD_SUBTRACT:number /*uint*/ = 109;\n\n\t/**\n\t * Constant associated with the key code value for the O key (79).\n\t */\n\tpublic static O:number /*uint*/ = 79;\n\n\t/**\n\t * Constant associated with the key code value for the P key (80).\n\t */\n\tpublic static P:number /*uint*/ = 80;\n\n\t/**\n\t * Constant associated with the key code value for the Page Down key (34).\n\t */\n\tpublic static PAGE_DOWN:number /*uint*/ = 34;\n\n\t/**\n\t * Constant associated with the key code value for the Page Up key (33).\n\t */\n\tpublic static PAGE_UP:number /*uint*/ = 33;\n\n\t/**\n\t * Engage pause transport mode\n\t */\n\tpublic static PAUSE:number /*uint*/ = 0x01000008;\n\n\t/**\n\t * Constant associated with the key code value for the . key (190).\n\t */\n\tpublic static PERIOD:number /*uint*/ = 190;\n\n\t/**\n\t * Engage play transport mode\n\t */\n\tpublic static PLAY:number /*uint*/ = 0x01000007;\n\n\t/**\n\t * Skip to previous track or chapter\n\t */\n\tpublic static PREVIOUS:number /*uint*/ = 0x0100000F;\n\n\t/**\n\t * Constant associated with the key code value for the Q key (81).\n\t */\n\tpublic static Q:number /*uint*/ = 81;\n\n\t/**\n\t * Constant associated with the key code value for the ' key (222).\n\t */\n\tpublic static QUOTE:number /*uint*/ = 222;\n\n\t/**\n\t * Constant associated with the key code value for the R key (82).\n\t */\n\tpublic static R:number /*uint*/ = 82;\n\n\t/**\n\t * Record item or engage record transport mode\n\t */\n\tpublic static RECORD:number /*uint*/ = 0x01000006;\n\n\t/**\n\t * Red function key button\n\t */\n\tpublic static RED:number /*uint*/ = 0x01000000;\n\n\t/**\n\t * Engage rewind transport mode\n\t */\n\tpublic static REWIND:number /*uint*/ = 0x0100000B;\n\n\t/**\n\t * Constant associated with the key code value for the Right Arrow key (39).\n\t */\n\tpublic static RIGHT:number /*uint*/ = 39;\n\n\t/**\n\t * Constant associated with the key code value for the ] key (221).\n\t */\n\tpublic static RIGHTBRACKET:number /*uint*/ = 221;\n\n\t/**\n\t * Constant associated with the key code value for the S key (83).\n\t */\n\tpublic static S:number /*uint*/ = 83;\n\n\t/**\n\t * Search button\n\t */\n\tpublic static SEARCH:number /*uint*/ = 0x0100001F;\n\n\t/**\n\t * Constant associated with the key code value for the ; key (186).\n\t */\n\tpublic static SEMICOLON:number /*uint*/ = 186;\n\n\t/**\n\t * Engage setup application or menu\n\t */\n\tpublic static SETUP:number /*uint*/ = 0x0100001C;\n\n\t/**\n\t * Constant associated with the key code value for the Shift key (16).\n\t */\n\tpublic static SHIFT:number /*uint*/ = 16;\n\n\t/**\n\t * Quick skip backward (usually 7-10 seconds)\n\t */\n\tpublic static SKIP_BACKWARD:number /*uint*/ = 0x0100000D;\n\n\t/**\n\t * Quick skip ahead (usually 30 seconds)\n\t */\n\tpublic static SKIP_FORWARD:number /*uint*/ = 0x0100000C;\n\n\t/**\n\t * Constant associated with the key code value for the / key (191).\n\t */\n\tpublic static SLASH:number /*uint*/ = 191;\n\n\t/**\n\t * Constant associated with the key code value for the Spacebar (32).\n\t */\n\tpublic static SPACE:number /*uint*/ = 32;\n\n\t/**\n\t * Engage stop transport mode\n\t */\n\tpublic static STOP:number /*uint*/ = 0x01000009;\n\n\t/**\n\t * Toggle subtitles\n\t */\n\tpublic static SUBTITLE:number /*uint*/ = 0x01000018;\n\n\t/**\n\t * Constant associated with the key code value for the T key (84).\n\t */\n\tpublic static T:number /*uint*/ = 84;\n\n\t/**\n\t * Constant associated with the key code value for the Tab key (9).\n\t */\n\tpublic static TAB:number /*uint*/ = 9;\n\n\t/**\n\t * Constant associated with the key code value for the U key (85).\n\t */\n\tpublic static U:number /*uint*/ = 85;\n\n\t/**\n\t * Constant associated with the key code value for the Up Arrow key (38).\n\t */\n\tpublic static UP:number /*uint*/ = 38;\n\n\t/**\n\t * Constant associated with the key code value for the V key (86).\n\t */\n\tpublic static V:number /*uint*/ = 86;\n\n\t/**\n\t * Engage video-on-demand\n\t */\n\tpublic static VOD:number /*uint*/ = 0x0100001A;\n\n\t/**\n\t * Constant associated with the key code value for the W key (87).\n\t */\n\tpublic static W:number /*uint*/ = 87;\n\n\t/**\n\t * Constant associated with the key code value for the X key (88).\n\t */\n\tpublic static X:number /*uint*/ = 88;\n\n\t/**\n\t * Constant associated with the key code value for the Y key (89).\n\t */\n\tpublic static Y:number /*uint*/ = 89;\n\n\t/**\n\t * Yellow function key button\n\t */\n\tpublic static YELLOW:number /*uint*/ = 0x01000002;\n\n\t/**\n\t * Constant associated with the key code value for the Z key (90).\n\t */\n\tpublic static Z:number /*uint*/ = 90;\n\n}\n\nexport = Keyboard;", + "import IAnimator\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimator\");\nimport BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport IMaterialOwner\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport UVTransform\t\t\t\t= require(\"awayjs-core/lib/core/geom/UVTransform\");\nimport AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport EntityNode\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport IRenderer\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport IEntity\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport MaterialEvent\t\t\t= require(\"awayjs-core/lib/events/MaterialEvent\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * The Billboard class represents display objects that represent bitmap images.\n * These can be images that you load with the flash.Assets or\n * flash.display.Loader classes, or they can be images that you\n * create with the Billboard() constructor.\n *\n *

The Billboard() constructor allows you to create a Billboard\n * object that contains a reference to a BitmapData object. After you create a\n * Billboard object, use the addChild() or addChildAt()\n * method of the parent DisplayObjectContainer instance to place the bitmap on\n * the display list.

\n *\n *

A Billboard object can share its BitmapData reference among several Billboard\n * objects, independent of translation or rotation properties. Because you can\n * create multiple Billboard objects that reference the same BitmapData object,\n * multiple display objects can use the same complex BitmapData object without\n * incurring the memory overhead of a BitmapData object for each display\n * object instance.

\n *\n *

A BitmapData object can be drawn to the screen by a Billboard object in one\n * of two ways: by using the default hardware renderer with a single hardware surface,\n * or by using the slower software renderer when 3D acceleration is not available.

\n *\n *

If you would prefer to perform a batch rendering command, rather than using a\n * single surface for each Billboard object, you can also draw to the screen using the\n * drawTiles() or drawTriangles() methods which are\n * available to flash.display.Tilesheet and flash.display.Graphics\n * objects.

\n *\n *

Note: The Billboard class is not a subclass of the InteractiveObject\n * class, so it cannot dispatch mouse events. However, you can use the\n * addEventListener() method of the display object container that\n * contains the Billboard object.

\n */\n\nclass Billboard extends DisplayObject implements IEntity, IMaterialOwner\n{\n\tprivate _animator:IAnimator;\n\tprivate _billboardWidth:number;\n\tprivate _billboardHeight:number;\n\tprivate _material:MaterialBase;\n\tprivate _uvTransform:UVTransform;\n\n\tprivate onSizeChangedDelegate:(event:MaterialEvent) => void;\n\n\t/**\n\t * Defines the animator of the mesh. Act on the mesh's geometry. Defaults to null\n\t */\n\tpublic get animator():IAnimator\n\t{\n\t\treturn this._animator;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.BILLBOARD;\n\t}\n\n\t/**\n\t * The BitmapData object being referenced.\n\t */\n\tpublic bitmapData:BitmapData; //TODO\n\n\t/**\n\t *\n\t */\n\tpublic get billboardHeight():number\n\t{\n\t\treturn this._billboardHeight;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get billboardWidth():number\n\t{\n\t\treturn this._billboardWidth;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get material():MaterialBase\n\t{\n\t\treturn this._material;\n\t}\n\n\tpublic set material(value:MaterialBase)\n\t{\n\t\tif (value == this._material)\n\t\t\treturn;\n\n\t\tif (this._material) {\n\t\t\tthis._material.iRemoveOwner(this);\n\t\t\tthis._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate);\n\t\t}\n\n\n\t\tthis._material = value;\n\n\t\tif (this._material) {\n\t\t\tthis._material.iAddOwner(this);\n\t\t\tthis._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate);\n\t\t}\n\t}\n\n\t/**\n\t * Controls whether or not the Billboard object is snapped to the nearest pixel.\n\t * This value is ignored in the native and HTML5 targets.\n\t * The PixelSnapping class includes possible values:\n\t *
    \n\t *
  • PixelSnapping.NEVER - No pixel snapping occurs.
  • \n\t *
  • PixelSnapping.ALWAYS - The image is always snapped to\n\t * the nearest pixel, independent of transformation.
  • \n\t *
  • PixelSnapping.AUTO - The image is snapped to the\n\t * nearest pixel if it is drawn with no rotation or skew and it is drawn at a\n\t * scale factor of 99.9% to 100.1%. If these conditions are satisfied, the\n\t * bitmap image is drawn at 100% scale, snapped to the nearest pixel.\n\t * When targeting Flash Player, this value allows the image to be drawn as fast\n\t * as possible using the internal vector renderer.
  • \n\t *
\n\t */\n\tpublic pixelSnapping:string; //TODO\n\n\t/**\n\t * Controls whether or not the bitmap is smoothed when scaled. If\n\t * true, the bitmap is smoothed when scaled. If\n\t * false, the bitmap is not smoothed when scaled.\n\t */\n\tpublic smoothing:boolean; //TODO\n\n\t/**\n\t *\n\t */\n\tpublic get uvTransform():UVTransform\n\t{\n\t\treturn this._uvTransform;\n\t}\n\n\tpublic set uvTransform(value:UVTransform)\n\t{\n\t\tthis._uvTransform = value;\n\t}\n\n\tconstructor(material:MaterialBase, pixelSnapping:string = \"auto\", smoothing:boolean = false)\n\t{\n\t\tsuper();\n\n\t\tthis._pIsEntity = true;\n\n\t\tthis.onSizeChangedDelegate = (event:MaterialEvent) => this.onSizeChanged(event);\n\n\t\tthis.material = material;\n\n\t\tthis._billboardWidth = material.width;\n\t\tthis._billboardHeight = material.height;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():EntityNode\n\t{\n\t\treturn new EntityNode(this);\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pUpdateBounds()\n\t{\n\t\tthis._pBounds.fromExtremes(0, 0, 0, this._billboardWidth, this._billboardHeight, 0);\n\n\t\tsuper.pUpdateBounds();\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @param shortestCollisionDistance\n\t * @param findClosest\n\t * @returns {boolean}\n\t *\n\t * @internal\n\t */\n\tpublic _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean\n\t{\n\t\treturn this._pPickingCollider.testBillboardCollision(this, this._pPickingCollisionVO, shortestCollisionDistance);\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate onSizeChanged(event:MaterialEvent)\n\t{\n\t\tthis._billboardWidth = this._material.width;\n\t\tthis._billboardHeight = this._material.height;\n\n\t\tthis._pBoundsInvalid = true;\n\n\t\tvar len:number = this._pRenderables.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis._pRenderables[i].invalidateVertexData(\"vertices\"); //TODO\n\t}\n\n\tpublic _iCollectRenderables(renderer:IRenderer)\n\t{\n\t\t// Since this getter is invoked every iteration of the render loop, and\n\t\t// the prefab construct could affect the sub-meshes, the prefab is\n\t\t// validated here to give it a chance to rebuild.\n\t\tif (this._iSourcePrefab)\n\t\t\tthis._iSourcePrefab._iValidate();\n\n\t\tthis._iCollectRenderable(renderer);\n\t}\n\n\tpublic _iCollectRenderable(renderer:IRenderer)\n\t{\n\t\trenderer.applyBillboard(this);\n\t}\n}\n\nexport = Billboard;", + "import BoundingVolumeBase\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport NullBounds\t\t\t\t= require(\"awayjs-core/lib/bounds/NullBounds\");\nimport DisplayObjectContainer\t= require(\"awayjs-core/lib/containers/DisplayObjectContainer\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Plane3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport CameraNode\t\t\t\t= require(\"awayjs-core/lib/core/partition/CameraNode\");\nimport EntityNode\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport IRenderer\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport IEntity\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport CameraEvent\t\t\t\t= require(\"awayjs-core/lib/events/CameraEvent\");\nimport ProjectionEvent\t\t\t= require(\"awayjs-core/lib/events/ProjectionEvent\");\nimport IProjection\t\t\t\t= require(\"awayjs-core/lib/projections/IProjection\");\nimport PerspectiveProjection\t= require(\"awayjs-core/lib/projections/PerspectiveProjection\");\n\nclass Camera extends DisplayObjectContainer implements IEntity\n{\n\tprivate _viewProjection:Matrix3D = new Matrix3D();\n\tprivate _viewProjectionDirty:Boolean = true;\n\tprivate _projection:IProjection;\n\tprivate _frustumPlanes:Array;\n\tprivate _frustumPlanesDirty:Boolean = true;\n\tprivate _onProjectionMatrixChangedDelegate:(event:ProjectionEvent) => void;\n\n\tconstructor(projection:IProjection = null)\n\t{\n\t\tsuper();\n\n\t\tthis._pIsEntity = true;\n\n\t\tthis._onProjectionMatrixChangedDelegate = (event:ProjectionEvent) => this.onProjectionMatrixChanged(event);\n\n\t\tthis._projection = projection || new PerspectiveProjection();\n\t\tthis._projection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate);\n\n\t\tthis._frustumPlanes = [];\n\n\t\tfor (var i:number = 0; i < 6; ++i)\n\t\t\tthis._frustumPlanes[i] = new Plane3D();\n\n\t\tthis.z = -1000;\n\n\t}\n\n\tpublic pCreateDefaultBoundingVolume():BoundingVolumeBase\n\t{\n\t\treturn new NullBounds();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():EntityNode\n\t{\n\t\treturn new CameraNode(this);\n\t}\n\n\t//@override\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.CAMERA;\n\t}\n\n\tprivate onProjectionMatrixChanged(event:ProjectionEvent)\n\t{\n\t\tthis._viewProjectionDirty = true;\n\t\tthis._frustumPlanesDirty = true;\n\t\tthis.dispatchEvent(event);\n\t}\n\n\tpublic get frustumPlanes():Array\n\t{\n\t\tif (this._frustumPlanesDirty)\n\t\t\tthis.updateFrustum();\n\n\t\treturn this._frustumPlanes;\n\t}\n\n\tprivate updateFrustum()\n\t{\n\t\tvar a:number, b:number, c:number;\n\t\t//var d : Number;\n\t\tvar c11:number, c12:number, c13:number, c14:number;\n\t\tvar c21:number, c22:number, c23:number, c24:number;\n\t\tvar c31:number, c32:number, c33:number, c34:number;\n\t\tvar c41:number, c42:number, c43:number, c44:number;\n\t\tvar p:Plane3D;\n\t\tvar raw:number[] = new Array(16);\n\t\t;//new Array(16 );away.utils.Matrix3DUtils.RAW_DATA_CONTAINER;//[];\n\t\tvar invLen:number;\n\t\tthis.viewProjection.copyRawDataTo(raw);\n\n\t\tc11 = raw[0];\n\t\tc12 = raw[4];\n\t\tc13 = raw[8];\n\t\tc14 = raw[12];\n\t\tc21 = raw[1];\n\t\tc22 = raw[5];\n\t\tc23 = raw[9];\n\t\tc24 = raw[13];\n\t\tc31 = raw[2];\n\t\tc32 = raw[6];\n\t\tc33 = raw[10];\n\t\tc34 = raw[14];\n\t\tc41 = raw[3];\n\t\tc42 = raw[7];\n\t\tc43 = raw[11];\n\t\tc44 = raw[15];\n\n\t\t// left plane\n\t\tp = this._frustumPlanes[0];\n\t\ta = c41 + c11;\n\t\tb = c42 + c12;\n\t\tc = c43 + c13;\n\t\tinvLen = 1/Math.sqrt(a*a + b*b + c*c);\n\t\tp.a = a*invLen;\n\t\tp.b = b*invLen;\n\t\tp.c = c*invLen;\n\t\tp.d = -(c44 + c14)*invLen;\n\n\t\t// right plane\n\t\tp = this._frustumPlanes[1];\n\t\ta = c41 - c11;\n\t\tb = c42 - c12;\n\t\tc = c43 - c13;\n\t\tinvLen = 1/Math.sqrt(a*a + b*b + c*c);\n\t\tp.a = a*invLen;\n\t\tp.b = b*invLen;\n\t\tp.c = c*invLen;\n\t\tp.d = (c14 - c44)*invLen;\n\n\t\t// bottom\n\t\tp = this._frustumPlanes[2];\n\t\ta = c41 + c21;\n\t\tb = c42 + c22;\n\t\tc = c43 + c23;\n\t\tinvLen = 1/Math.sqrt(a*a + b*b + c*c);\n\t\tp.a = a*invLen;\n\t\tp.b = b*invLen;\n\t\tp.c = c*invLen;\n\t\tp.d = -(c44 + c24)*invLen;\n\n\t\t// top\n\t\tp = this._frustumPlanes[3];\n\t\ta = c41 - c21;\n\t\tb = c42 - c22;\n\t\tc = c43 - c23;\n\t\tinvLen = 1/Math.sqrt(a*a + b*b + c*c);\n\t\tp.a = a*invLen;\n\t\tp.b = b*invLen;\n\t\tp.c = c*invLen;\n\t\tp.d = (c24 - c44)*invLen;\n\n\t\t// near\n\t\tp = this._frustumPlanes[4];\n\t\ta = c31;\n\t\tb = c32;\n\t\tc = c33;\n\t\tinvLen = 1/Math.sqrt(a*a + b*b + c*c);\n\t\tp.a = a*invLen;\n\t\tp.b = b*invLen;\n\t\tp.c = c*invLen;\n\t\tp.d = -c34*invLen;\n\n\t\t// far\n\t\tp = this._frustumPlanes[5];\n\t\ta = c41 - c31;\n\t\tb = c42 - c32;\n\t\tc = c43 - c33;\n\t\tinvLen = 1/Math.sqrt(a*a + b*b + c*c);\n\t\tp.a = a*invLen;\n\t\tp.b = b*invLen;\n\t\tp.c = c*invLen;\n\t\tp.d = (c34 - c44)*invLen;\n\n\t\tthis._frustumPlanesDirty = false;\n\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pInvalidateSceneTransform()\n\t{\n\t\tsuper.pInvalidateSceneTransform();\n\n\t\tthis._viewProjectionDirty = true;\n\t\tthis._frustumPlanesDirty = true;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pUpdateBounds()\n\t{\n\t\tthis._pBoundsInvalid = false;\n\t\tthis._pBounds.nullify();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get projection():IProjection\n\t{\n\t\treturn this._projection;\n\t}\n\n\tpublic set projection(value:IProjection)\n\t{\n\t\tif (this._projection == value)\n\t\t\treturn;\n\n\t\tif (!value)\n\t\t\tthrow new Error(\"Projection cannot be null!\");\n\n\t\tthis._projection.removeEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate);\n\t\tthis._projection = value;\n\t\tthis._projection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate);\n\t\tthis.dispatchEvent(new CameraEvent(CameraEvent.PROJECTION_CHANGED, this));\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get viewProjection():Matrix3D\n\t{\n\t\tif (this._viewProjectionDirty) {\n\t\t\tthis._viewProjection.copyFrom(this.inverseSceneTransform);\n\t\t\tthis._viewProjection.append(this._projection.matrix);\n\t\t\tthis._viewProjectionDirty = false;\n\t\t}\n\n\t\treturn this._viewProjection;\n\t}\n\n\t/**\n\t * Calculates the ray in scene space from the camera to the given normalized coordinates in screen space.\n\t *\n\t * @param nX The normalised x coordinate in screen space, -1 corresponds to the left edge of the viewport, 1 to the right.\n\t * @param nY The normalised y coordinate in screen space, -1 corresponds to the top edge of the viewport, 1 to the bottom.\n\t * @param sZ The z coordinate in screen space, representing the distance into the screen.\n\t * @return The ray from the camera to the scene space position of the given screen coordinates.\n\t */\n\tpublic getRay(nX:number, nY:number, sZ:number):Vector3D\n\t{\n\t\treturn this.sceneTransform.deltaTransformVector(this._projection.unproject(nX, nY, sZ));\n\t}\n\n\t/**\n\t * Calculates the normalised position in screen space of the given scene position.\n\t *\n\t * @param point3d the position vector of the scene coordinates to be projected.\n\t * @return The normalised screen position of the given scene coordinates.\n\t */\n\tpublic project(point3d:Vector3D):Vector3D\n\t{\n\t\treturn this._projection.project(this.inverseSceneTransform.transformVector(point3d));\n\t}\n\n\t/**\n\t * Calculates the scene position of the given normalized coordinates in screen space.\n\t *\n\t * @param nX The normalised x coordinate in screen space, minus the originX offset of the projection property.\n\t * @param nY The normalised y coordinate in screen space, minus the originY offset of the projection property.\n\t * @param sZ The z coordinate in screen space, representing the distance into the screen.\n\t * @return The scene position of the given screen coordinates.\n\t */\n\tpublic unproject(nX:number, nY:number, sZ:number):Vector3D\n\t{\n\t\treturn this.sceneTransform.transformVector(this._projection.unproject(nX, nY, sZ));\n\t}\n\n\tpublic _iCollectRenderables(renderer:IRenderer)\n\t{\n\t\t// Since this getter is invoked every iteration of the render loop, and\n\t\t// the prefab construct could affect the sub-meshes, the prefab is\n\t\t// validated here to give it a chance to rebuild.\n\t\tif (this._iSourcePrefab)\n\t\t\tthis._iSourcePrefab._iValidate();\n\n\t\tthis._iCollectRenderable(renderer);\n\t}\n\n\tpublic _iCollectRenderable(renderer:IRenderer)\n\t{\n\t\t//nothing to do here\n\t}\n}\n\nexport = Camera;", + "import BoundingVolumeBase\t\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport NullBounds\t\t\t\t\t= require(\"awayjs-core/lib/bounds/NullBounds\");\nimport LightBase\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LightBase\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport DirectionalLightNode\t\t\t= require(\"awayjs-core/lib/core/partition/DirectionalLightNode\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport DirectionalShadowMapper\t\t= require(\"awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper\");\n\nclass DirectionalLight extends LightBase implements IEntity\n{\n\tprivate _direction:Vector3D;\n\tprivate _tmpLookAt:Vector3D;\n\tprivate _sceneDirection:Vector3D;\n\tprivate _projAABBPoints:Array;\n\n\tconstructor(xDir:number = 0, yDir:number = -1, zDir:number = 1)\n\t{\n\t\tsuper();\n\n\t\tthis._pIsEntity = true;\n\n\t\tthis.direction = new Vector3D(xDir, yDir, zDir);\n\n\t\tthis._sceneDirection = new Vector3D();\n\t}\n\n\tpublic get sceneDirection():Vector3D\n\t{\n\t\tif (this._pSceneTransformDirty)\n\t\t\tthis.pUpdateSceneTransform();\n\n\t\treturn this._sceneDirection;\n\t}\n\n\tpublic get direction():Vector3D\n\t{\n\t\treturn this._direction;\n\t}\n\n\tpublic set direction(value:Vector3D)\n\t{\n\t\tthis._direction = value;\n\n\t\tif (!this._tmpLookAt)\n\t\t\tthis._tmpLookAt = new Vector3D();\n\n\t\tthis._tmpLookAt.x = this.x + this._direction.x;\n\t\tthis._tmpLookAt.y = this.y + this._direction.y;\n\t\tthis._tmpLookAt.z = this.z + this._direction.z;\n\n\t\tthis.lookAt(this._tmpLookAt);\n\t}\n\n\t/**\n\t *\n\t * @returns {away.bounds.NullBounds}\n\t */\n\tpublic pCreateDefaultBoundingVolume():BoundingVolumeBase\n\t{\n\t\t//directional lights are to be considered global, hence always in view\n\t\treturn new NullBounds();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic pUpdateBounds()\n\t{\n\t}\n\n\t//@override\n\tpublic pUpdateSceneTransform()\n\t{\n\t\tsuper.pUpdateSceneTransform();\n\t\tthis.sceneTransform.copyColumnTo(2, this._sceneDirection);\n\t\tthis._sceneDirection.normalize();\n\t}\n\n\t//@override\n\tpublic pCreateShadowMapper():DirectionalShadowMapper\n\t{\n\t\treturn new DirectionalShadowMapper();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():EntityNode\n\t{\n\t\treturn new DirectionalLightNode(this);\n\t}\n\n\t//override\n\tpublic iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D\n\t{\n\t\tvar raw:Array = new Array();\n\t\tvar bounds:BoundingVolumeBase = entity.bounds;\n\t\tvar m:Matrix3D = new Matrix3D();\n\n\t\tm.copyFrom(entity.getRenderSceneTransform(camera));\n\t\tm.append(this.inverseSceneTransform);\n\n\t\tif (!this._projAABBPoints)\n\t\t\tthis._projAABBPoints = [];\n\n\t\tm.transformVectors(bounds.aabbPoints, this._projAABBPoints);\n\n\t\tvar xMin:number = Infinity, xMax:number = -Infinity;\n\t\tvar yMin:number = Infinity, yMax:number = -Infinity;\n\t\tvar zMin:number = Infinity, zMax:number = -Infinity;\n\t\tvar d:number;\n\t\tfor (var i:number = 0; i < 24;) {\n\t\t\td = this._projAABBPoints[i++];\n\n\t\t\tif (d < xMin)\n\t\t\t\txMin = d;\n\n\t\t\tif (d > xMax)\n\t\t\t\txMax = d;\n\n\t\t\td = this._projAABBPoints[i++];\n\n\t\t\tif (d < yMin)\n\t\t\t\tyMin = d;\n\n\t\t\tif (d > yMax)\n\t\t\t\tyMax = d;\n\n\t\t\td = this._projAABBPoints[i++];\n\n\t\t\tif (d < zMin)\n\t\t\t\tzMin = d;\n\n\t\t\tif (d > zMax)\n\t\t\t\tzMax = d;\n\t\t}\n\n\t\tvar invXRange:number = 1/(xMax - xMin);\n\t\tvar invYRange:number = 1/(yMax - yMin);\n\t\tvar invZRange:number = 1/(zMax - zMin);\n\t\traw[0] = 2*invXRange;\n\t\traw[5] = 2*invYRange;\n\t\traw[10] = invZRange;\n\t\traw[12] = -(xMax + xMin)*invXRange;\n\t\traw[13] = -(yMax + yMin)*invYRange;\n\t\traw[14] = -zMin*invZRange;\n\t\traw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0;\n\t\traw[15] = 1;\n\n\t\tif (!target)\n\t\t\ttarget = new Matrix3D();\n\n\t\ttarget.copyRawDataFrom(raw);\n\t\ttarget.prepend(m);\n\n\t\treturn target;\n\t}\n\n\tpublic _iCollectRenderables(renderer:IRenderer)\n\t{\n\t\t//nothing to do here\n\t}\n}\n\nexport = DirectionalLight;", + "import BoundingVolumeBase\t\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport ControllerBase\t\t\t\t= require(\"awayjs-core/lib/controllers/ControllerBase\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Transform\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Transform\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IAsset\t\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport Partition\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/Partition\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport IPickingCollider\t\t\t\t= require(\"awayjs-core/lib/core/pick/IPickingCollider\");\nimport PickingCollisionVO\t\t\t= require(\"awayjs-core/lib/core/pick/PickingCollisionVO\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\n\ninterface IEntity extends IAsset\n{\n\tx:number;\n\ty:number;\n\tz:number;\n\n\trotationX:number;\n\trotationY:number;\n\trotationZ:number;\n\n\tscaleX:number;\n\tscaleY:number;\n\tscaleZ:number;\n\n\t/**\n\t *\n\t */\n\tbounds:BoundingVolumeBase;\n\n\t/**\n\t *\n\t */\n\tcastsShadows:boolean;\n\n\t/**\n\t *\n\t */\n\tinverseSceneTransform:Matrix3D;\n\n\t/**\n\t *\n\t */\n\tpartitionNode:EntityNode;\n\n\t/**\n\t *\n\t */\n\tpickingCollider:IPickingCollider;\n\n\t/**\n\t *\n\t */\n\ttransform:Transform;\n\n\t/**\n\t *\n\t */\n\tscene:Scene;\n\n\t/**\n\t *\n\t */\n\tscenePosition:Vector3D;\n\n\t/**\n\t *\n\t */\n\tsceneTransform:Matrix3D;\n\n\t/**\n\t *\n\t */\n\tworldBounds:BoundingVolumeBase;\n\n\t/**\n\t *\n\t */\n\tzOffset:number\n\n\t/**\n\t *\n\t */\n\tisIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean;\n\n\t/**\n\t *\n\t *\n\t * @param target\n\t * @param upAxis\n\t */\n\tlookAt(target:Vector3D, upAxis?:Vector3D);\n\n\t/**\n\t * @internal\n\t */\n\t_iPickingCollisionVO:PickingCollisionVO;\n\n\t/**\n\t * @internal\n\t */\n\t_iController:ControllerBase;\n\n\t/**\n\t * @internal\n\t */\n\t_iAssignedPartition:Partition;\n\n\t/**\n\t * //TODO\n\t *\n\t * @param shortestCollisionDistance\n\t * @param findClosest\n\t * @returns {boolean}\n\t *\n\t * @internal\n\t */\n\t_iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean;\n\n\t/**\n\t * @internal\n\t */\n\t_iIsMouseEnabled():boolean\n\n\t/**\n\t * @internal\n\t */\n\t_iIsVisible():boolean\n\n\t_iInternalUpdate()\n\n\t/**\n\t * The transformation matrix that transforms from model to world space, adapted with any special operations needed to render.\n\t * For example, assuring certain alignedness which is not inherent in the scene transform. By default, this would\n\t * return the scene transform.\n\t */\n\tgetRenderSceneTransform(camera:Camera):Matrix3D;\n\n\t/**\n\t *\n\t * @param renderer\n\t * @private\n\t */\n\t_iCollectRenderables(renderer:IRenderer);\n}\n\nexport = IEntity;", + "import BoundingVolumeBase\t\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport NullBounds\t\t\t\t\t= require(\"awayjs-core/lib/bounds/NullBounds\");\nimport LightBase\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LightBase\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport LightProbeNode\t\t\t\t= require(\"awayjs-core/lib/core/partition/LightProbeNode\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport Error\t\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport CubeTextureBase\t\t\t\t= require(\"awayjs-core/lib/textures/CubeTextureBase\");\n\nclass LightProbe extends LightBase implements IEntity\n{\n\tprivate _diffuseMap:CubeTextureBase;\n\tprivate _specularMap:CubeTextureBase;\n\n\tconstructor(diffuseMap:CubeTextureBase, specularMap:CubeTextureBase = null)\n\t{\n\t\tsuper();\n\n\t\tthis._pIsEntity = true;\n\n\t\tthis._diffuseMap = diffuseMap;\n\t\tthis._specularMap = specularMap;\n\t}\n\n\tpublic get diffuseMap():CubeTextureBase\n\t{\n\t\treturn this._diffuseMap;\n\t}\n\n\tpublic set diffuseMap(value:CubeTextureBase)\n\t{\n\t\tthis._diffuseMap = value;\n\t}\n\n\tpublic get specularMap():CubeTextureBase\n\t{\n\t\treturn this._specularMap;\n\t}\n\n\tpublic set specularMap(value:CubeTextureBase)\n\t{\n\t\tthis._specularMap = value;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():EntityNode\n\t{\n\t\treturn new LightProbeNode(this);\n\t}\n\n\t//@override\n\tpublic pUpdateBounds()\n\t{\n\t\tthis._pBoundsInvalid = false;\n\t}\n\n\t//@override\n\tpublic pCreateDefaultBoundingVolume():BoundingVolumeBase\n\t{\n\t\treturn new NullBounds();\n\t}\n\n\t//@override\n\tpublic iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D\n\t{\n\t\tthrow new Error(\"Object projection matrices are not supported for LightProbe objects!\");\n\t}\n\n\tpublic _iCollectRenderables(renderer:IRenderer)\n\t{\n\t\t//nothing to do here\n\t}\n}\n\nexport = LightProbe;", + "import IAnimator\t\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimator\");\nimport DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport IMaterialOwner\t\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport UVTransform\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/UVTransform\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport AssetType\t\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport MaterialEvent\t\t\t\t= require(\"awayjs-core/lib/events/MaterialEvent\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport MaterialBase\t\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * A Line Segment primitive.\n */\nclass LineSegment extends DisplayObject implements IEntity, IMaterialOwner\n{\n\tprivate _animator:IAnimator;\n\tprivate _material:MaterialBase;\n\tprivate _uvTransform:UVTransform;\n\n\tprivate onSizeChangedDelegate:(event:MaterialEvent) => void;\n\n\tpublic _startPosition:Vector3D;\n\tpublic _endPosition:Vector3D;\n\tpublic _halfThickness:number;\n\n\n\t/**\n\t * Defines the animator of the line segment. Act on the line segment's geometry. Defaults to null\n\t */\n\tpublic get animator():IAnimator\n\t{\n\t\treturn this._animator;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.LINE_SEGMENT;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get startPostion():Vector3D\n\t{\n\t\treturn this._startPosition;\n\t}\n\n\tpublic set startPosition(value:Vector3D)\n\t{\n\t\tif (this._startPosition == value)\n\t\t\treturn;\n\n\t\tthis._startPosition = value;\n\n\t\tthis.notifyRenderableUpdate();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get endPosition():Vector3D\n\t{\n\t\treturn this._endPosition;\n\t}\n\n\tpublic set endPosition(value:Vector3D)\n\t{\n\t\tif (this._endPosition == value)\n\t\t\treturn;\n\n\t\tthis._endPosition = value;\n\n\t\tthis.notifyRenderableUpdate();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get material():MaterialBase\n\t{\n\t\treturn this._material;\n\t}\n\n\tpublic set material(value:MaterialBase)\n\t{\n\t\tif (value == this._material)\n\t\t\treturn;\n\n\t\tif (this._material) {\n\t\t\tthis._material.iRemoveOwner(this);\n\t\t\tthis._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate);\n\t\t}\n\n\n\t\tthis._material = value;\n\n\t\tif (this._material) {\n\t\t\tthis._material.iAddOwner(this);\n\t\t\tthis._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate);\n\t\t}\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get thickness():number\n\t{\n\t\treturn this._halfThickness*2;\n\t}\n\n\tpublic set thickness(value:number)\n\t{\n\t\tif (this._halfThickness == value)\n\t\t\treturn;\n\n\t\tthis._halfThickness = value*0.5;\n\n\t\tthis.notifyRenderableUpdate();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get uvTransform():UVTransform\n\t{\n\t\treturn this._uvTransform;\n\t}\n\n\tpublic set uvTransform(value:UVTransform)\n\t{\n\t\tthis._uvTransform = value;\n\t}\n\n\t/**\n\t * Create a line segment\n\t *\n\t * @param startPosition Start position of the line segment\n\t * @param endPosition Ending position of the line segment\n\t * @param thickness Thickness of the line\n\t */\n\tconstructor(material:MaterialBase, startPosition:Vector3D, endPosition:Vector3D, thickness:number = 1)\n\t{\n\t\tsuper();\n\n\t\tthis._pIsEntity = true;\n\n\t\tthis.onSizeChangedDelegate = (event:MaterialEvent) => this.onSizeChanged(event);\n\n\t\tthis.material = material;\n\n\t\tthis._startPosition = startPosition;\n\t\tthis._endPosition = endPosition;\n\t\tthis._halfThickness = thickness*0.5;\n\t}\n\n\tpublic dispose()\n\t{\n\t\tthis._startPosition = null;\n\t\tthis._endPosition = null;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():EntityNode\n\t{\n\t\treturn new EntityNode(this);\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pUpdateBounds()\n\t{\n\t\tthis._pBounds.fromExtremes(this._startPosition.x, this._startPosition.y, this._startPosition.z, this._endPosition.x, this._endPosition.y, this._endPosition.z);\n\n\t\tsuper.pUpdateBounds();\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate onSizeChanged(event:MaterialEvent)\n\t{\n\t\tthis.notifyRenderableUpdate();\n\t}\n\n\t/**\n\t * @private\n\t */\n\tprivate notifyRenderableUpdate()\n\t{\n\t\tvar len:number = this._pRenderables.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis._pRenderables[i].invalidateVertexData(\"vertices\"); //TODO\n\t}\n\n\tpublic _iCollectRenderables(renderer:IRenderer)\n\t{\n\t\t// Since this getter is invoked every iteration of the render loop, and\n\t\t// the prefab construct could affect the sub-meshes, the prefab is\n\t\t// validated here to give it a chance to rebuild.\n\t\tif (this._iSourcePrefab)\n\t\t\tthis._iSourcePrefab._iValidate();\n\n\t\tthis._iCollectRenderable(renderer);\n\t}\n\n\tpublic _iCollectRenderable(renderer:IRenderer)\n\t{\n\t\t//TODO\n\t}\n}\n\nexport = LineSegment;", + "import IAnimator\t\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimator\");\nimport DisplayObjectContainer\t\t= require(\"awayjs-core/lib/containers/DisplayObjectContainer\");\nimport DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Geometry\t\t\t\t\t\t= require(\"awayjs-core/lib/core/base/Geometry\");\nimport ISubMesh\t\t\t\t\t\t= require(\"awayjs-core/lib/core/base/ISubMesh\");\nimport ISubMeshClass\t\t\t\t= require(\"awayjs-core/lib/core/base/ISubMeshClass\");\nimport TriangleSubGeometry\t\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport SubGeometryBase\t\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport UVTransform\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/UVTransform\");\nimport AssetType\t\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport GeometryEvent\t\t\t\t= require(\"awayjs-core/lib/events/GeometryEvent\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport MaterialBase\t\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * Mesh is an instance of a Geometry, augmenting it with a presence in the scene graph, a material, and an animation\n * state. It consists out of SubMeshes, which in turn correspond to SubGeometries. SubMeshes allow different parts\n * of the geometry to be assigned different materials.\n */\nclass Mesh extends DisplayObjectContainer implements IEntity\n{\n\tprivate _uvTransform:UVTransform;\n\n\tprivate _subMeshes:Array;\n\tprivate _geometry:Geometry;\n\tprivate _material:MaterialBase;\n\tprivate _animator:IAnimator;\n\tprivate _castsShadows:boolean = true;\n\tprivate _shareAnimationGeometry:boolean = true;\n\n\tprivate _onGeometryBoundsInvalidDelegate:(event:GeometryEvent) => void;\n\tprivate _onSubGeometryAddedDelegate:(event:GeometryEvent) => void;\n\tprivate _onSubGeometryRemovedDelegate:(event:GeometryEvent) => void;\n\n\t/**\n\t * Defines the animator of the mesh. Act on the mesh's geometry. Default value is null.\n\t */\n\tpublic get animator():IAnimator\n\t{\n\t\treturn this._animator;\n\t}\n\n\tpublic set animator(value:IAnimator)\n\t{\n\t\tif (this._animator)\n\t\t\tthis._animator.removeOwner(this);\n\n\t\tthis._animator = value;\n\n\t\tvar len:number = this._subMeshes.length;\n\t\tvar subMesh:ISubMesh;\n\n\t\tfor (var i:number = 0; i < len; ++i) {\n\t\t\tsubMesh = this._subMeshes[i];\n\n\t\t\t// cause material to be unregistered and registered again to work with the new animation type (if possible)\n\t\t\tif (subMesh.material) {\n\t\t\t\tsubMesh.material.iRemoveOwner(subMesh);\n\t\t\t\tsubMesh.material.iAddOwner(subMesh);\n\t\t\t}\n\n\t\t\t//invalidate any existing renderables in case they need to pull new geometry\n\t\t\tsubMesh._iInvalidateRenderableGeometry();\n\t\t}\n\n\t\tif (this._animator)\n\t\t\tthis._animator.addOwner(this);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.MESH;\n\t}\n\n\t/**\n\t * Indicates whether or not the Mesh can cast shadows. Default value is true.\n\t */\n\tpublic get castsShadows():boolean\n\t{\n\t\treturn this._castsShadows;\n\t}\n\n\tpublic set castsShadows(value:boolean)\n\t{\n\t\tthis._castsShadows = value;\n\t}\n\n\t/**\n\t * The geometry used by the mesh that provides it with its shape.\n\t */\n\tpublic get geometry():Geometry\n\t{\n\t\tif (this._iSourcePrefab)\n\t\t\tthis._iSourcePrefab._iValidate();\n\n\t\treturn this._geometry;\n\t}\n\n\tpublic set geometry(value:Geometry)\n\t{\n\t\tvar i:number;\n\n\t\tif (this._geometry) {\n\t\t\tthis._geometry.removeEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate);\n\t\t\tthis._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate);\n\t\t\tthis._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate);\n\n\t\t\tfor (i = 0; i < this._subMeshes.length; ++i)\n\t\t\t\tthis._subMeshes[i].dispose();\n\n\t\t\tthis._subMeshes.length = 0;\n\t\t}\n\n\t\tthis._geometry = value;\n\n\t\tif (this._geometry) {\n\n\t\t\tthis._geometry.addEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate);\n\t\t\tthis._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate);\n\t\t\tthis._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate);\n\n\t\t\tvar subGeoms:Array = this._geometry.subGeometries;\n\n\t\t\tfor (i = 0; i < subGeoms.length; ++i)\n\t\t\t\tthis.addSubMesh(subGeoms[i]);\n\t\t}\n\t}\n\n\t/**\n\t * The material with which to render the Mesh.\n\t */\n\tpublic get material():MaterialBase\n\t{\n\t\treturn this._material;\n\t}\n\n\tpublic set material(value:MaterialBase)\n\t{\n\t\tif (value == this._material)\n\t\t\treturn;\n\n\t\tvar i:number;\n\t\tvar len:number = this._subMeshes.length;\n\t\tvar subMesh:ISubMesh;\n\n\t\tfor (i = 0; i < len; i++)\n\t\t\tif (this._material && (subMesh = this._subMeshes[i]).material == this._material)\n\t\t\t\tthis._material.iRemoveOwner(subMesh);\n\n\t\tthis._material = value;\n\n\t\tfor (i = 0; i < len; i++)\n\t\t\tif (this._material && (subMesh = this._subMeshes[i]).material == this._material)\n\t\t\t\tthis._material.iAddOwner(subMesh);\n\t}\n\n\t/**\n\t * Indicates whether or not the mesh share the same animation geometry.\n\t */\n\tpublic get shareAnimationGeometry():boolean\n\t{\n\t\treturn this._shareAnimationGeometry;\n\t}\n\n\tpublic set shareAnimationGeometry(value:boolean)\n\t{\n\t\tthis._shareAnimationGeometry = value;\n\t}\n\n\t/**\n\t * The SubMeshes out of which the Mesh consists. Every SubMesh can be assigned a material to override the Mesh's\n\t * material.\n\t */\n\tpublic get subMeshes():Array\n\t{\n\t\t// Since this getter is invoked every iteration of the render loop, and\n\t\t// the prefab construct could affect the sub-meshes, the prefab is\n\t\t// validated here to give it a chance to rebuild.\n\t\tif (this._iSourcePrefab)\n\t\t\tthis._iSourcePrefab._iValidate();\n\n\t\treturn this._subMeshes;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get uvTransform():UVTransform\n\t{\n\t\treturn this._uvTransform;\n\t}\n\n\tpublic set uvTransform(value:UVTransform)\n\t{\n\t\tthis._uvTransform = value;\n\t}\n\n\t/**\n\t * Create a new Mesh object.\n\t *\n\t * @param geometry The geometry used by the mesh that provides it with its shape.\n\t * @param material [optional] The material with which to render the Mesh.\n\t */\n\tconstructor(geometry:Geometry, material:MaterialBase = null)\n\t{\n\t\tsuper();\n\n\t\tthis._pIsEntity = true;\n\n\t\tthis._subMeshes = new Array();\n\n\t\tthis._onGeometryBoundsInvalidDelegate = (event:GeometryEvent) => this.onGeometryBoundsInvalid(event);\n\t\tthis._onSubGeometryAddedDelegate = (event:GeometryEvent) => this.onSubGeometryAdded(event);\n\t\tthis._onSubGeometryRemovedDelegate = (event:GeometryEvent) => this.onSubGeometryRemoved(event);\n\n\t\t//this should never happen, but if people insist on trying to create their meshes before they have geometry to fill it, it becomes necessary\n\t\tthis.geometry = geometry || new Geometry();\n\n\t\tthis.material = material;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic bakeTransformations()\n\t{\n\t\tthis.geometry.applyTransformation(this._iMatrix3D);\n\t\tthis._iMatrix3D.identity();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\n\t\tthis.material = null;\n\t\tthis.geometry = null;\n\t}\n\n\t/**\n\t * Disposes mesh including the animator and children. This is a merely a convenience method.\n\t * @return\n\t */\n\tpublic disposeWithAnimatorAndChildren()\n\t{\n\t\tthis.disposeWithChildren();\n\n\t\t if (this._animator)\n\t\t\tthis._animator.dispose();\n\t}\n\n\t/**\n\t * Clones this Mesh instance along with all it's children, while re-using the same\n\t * material, geometry and animation set. The returned result will be a copy of this mesh,\n\t * containing copies of all of it's children.\n\t *\n\t * Properties that are re-used (i.e. not cloned) by the new copy include name,\n\t * geometry, and material. Properties that are cloned or created anew for the copy\n\t * include subMeshes, children of the mesh, and the animator.\n\t *\n\t * If you want to copy just the mesh, reusing it's geometry and material while not\n\t * cloning it's children, the simplest way is to create a new mesh manually:\n\t *\n\t * \n\t * var clone : Mesh = new Mesh(original.geometry, original.material);\n\t * \n\t */\n\tpublic clone():DisplayObject\n\t{\n\t\tvar clone:Mesh = new Mesh(this._geometry, this._material);\n\n\t\tclone._iMatrix3D = this._iMatrix3D;\n\t\tclone.pivot = this.pivot;\n\t\tclone.partition = this.partition;\n\t\tclone.bounds = this.bounds.clone();\n\n\n\t\tclone.name = this.name;\n\t\tclone.castsShadows = this.castsShadows;\n\t\tclone.shareAnimationGeometry = this.shareAnimationGeometry;\n\t\tclone.mouseEnabled = this.mouseEnabled;\n\t\tclone.mouseChildren = this.mouseChildren;\n\t\t//this is of course no proper cloning\n\t\t//maybe use this instead?: http://blog.another-d-mention.ro/programming/how-to-clone-duplicate-an-object-in-actionscript-3/\n\t\tclone.extra = this.extra;\n\n\t\tvar len:number = this._subMeshes.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tclone._subMeshes[i].material = this._subMeshes[i]._iGetExplicitMaterial();\n\n\n\t\tlen = this.numChildren;\n\t\tvar obj:any;\n\n\t\tfor (i = 0; i < len; ++i) {\n\t\t\tobj = this.getChildAt(i).clone();\n\t\t\tclone.addChild( obj);\n\t\t}\n\n\t\tif (this._animator)\n\t\t\tclone.animator = this._animator.clone();\n\n\t\treturn clone;\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @param subGeometry\n\t * @returns {SubMeshBase}\n\t */\n\tpublic getSubMeshFromSubGeometry(subGeometry:SubGeometryBase):ISubMesh\n\t{\n\t\treturn this._subMeshes[this._geometry.subGeometries.indexOf(subGeometry)];\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():EntityNode\n\t{\n\t\treturn new EntityNode(this);\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @protected\n\t */\n\tpublic pUpdateBounds()\n\t{\n\t\tthis._pBounds.fromGeometry(this._geometry);\n\n\t\tsuper.pUpdateBounds();\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @private\n\t */\n\tprivate onGeometryBoundsInvalid(event:GeometryEvent)\n\t{\n\t\tthis.pInvalidateBounds();\n\t}\n\n\t/**\n\t * Called when a SubGeometry was added to the Geometry.\n\t *\n\t * @private\n\t */\n\tprivate onSubGeometryAdded(event:GeometryEvent)\n\t{\n\t\tthis.addSubMesh(event.subGeometry);\n\t}\n\n\t/**\n\t * Called when a SubGeometry was removed from the Geometry.\n\t *\n\t * @private\n\t */\n\tprivate onSubGeometryRemoved(event:GeometryEvent)\n\t{\n\t\tvar subMesh:ISubMesh;\n\t\tvar subGeom:SubGeometryBase = event.subGeometry;\n\t\tvar len:number = this._subMeshes.length;\n\t\tvar i:number;\n\n\t\t// Important! This has to be done here, and not delayed until the\n\t\t// next render loop, since this may be caused by the geometry being\n\t\t// rebuilt IN THE RENDER LOOP. Invalidating and waiting will delay\n\t\t// it until the NEXT RENDER FRAME which is probably not desirable.\n\t\tfor (i = 0; i < len; ++i) {\n\n\t\t\tsubMesh = this._subMeshes[i];\n\n\t\t\tif (subMesh.subGeometry == subGeom) {\n\t\t\t\tsubMesh.dispose();\n\n\t\t\t\tthis._subMeshes.splice(i, 1);\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t--len;\n\t\tfor (; i < len; ++i)\n\t\t\tthis._subMeshes[i]._iIndex = i;\n\t}\n\n\t/**\n\t * Adds a SubMeshBase wrapping a SubGeometry.\n\t *\n\t * @param subGeometry\n\t */\n\tprivate addSubMesh(subGeometry:SubGeometryBase)\n\t{\n\t\tvar SubMeshClass:ISubMeshClass = subGeometry.subMeshClass;\n\n\t\tvar subMesh:ISubMesh = new SubMeshClass(subGeometry, this, null);\n\t\tvar len:number = this._subMeshes.length;\n\n\t\tsubMesh._iIndex = len;\n\n\t\tthis._subMeshes[len] = subMesh;\n\n\t\tthis.pInvalidateBounds();\n\t}\n\n\t/**\n\t * //TODO\n\t *\n\t * @param shortestCollisionDistance\n\t * @param findClosest\n\t * @returns {boolean}\n\t *\n\t * @internal\n\t */\n\tpublic _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean\n\t{\n\t\treturn this._pPickingCollider.testMeshCollision(this, this._pPickingCollisionVO, shortestCollisionDistance, findClosest);\n\t}\n\n\t/**\n\t *\n\t * @param renderer\n\t *\n\t * @internal\n\t */\n\tpublic _iCollectRenderables(renderer:IRenderer)\n\t{\n\t\t// Since this getter is invoked every iteration of the render loop, and\n\t\t// the prefab construct could affect the sub-meshes, the prefab is\n\t\t// validated here to give it a chance to rebuild.\n\t\tif (this._iSourcePrefab)\n\t\t\tthis._iSourcePrefab._iValidate();\n\n\t\tvar len:number /*uint*/ = this._subMeshes.length;\n\t\tfor (var i:number /*uint*/ = 0; i < len; i++)\n\t\t\tthis._subMeshes[i]._iCollectRenderable(renderer);\n\t}\n\n\tpublic _iInvalidateRenderableGeometries()\n\t{\n\t\tvar len:number = this._subMeshes.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tthis._subMeshes[i]._iInvalidateRenderableGeometry();\n\t}\n}\n\nexport = Mesh;", + "import BoundingSphere\t\t\t\t= require(\"awayjs-core/lib/bounds/BoundingSphere\");\nimport BoundingVolumeBase\t\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport LightBase\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LightBase\");\nimport Box\t\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Box\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport EntityNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/EntityNode\");\nimport PointLightNode\t\t\t\t= require(\"awayjs-core/lib/core/partition/PointLightNode\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport CubeMapShadowMapper\t\t\t= require(\"awayjs-core/lib/materials/shadowmappers/CubeMapShadowMapper\");\n\nclass PointLight extends LightBase implements IEntity\n{\n\tpublic _pRadius:number = 90000;\n\tpublic _pFallOff:number = 100000;\n\tpublic _pFallOffFactor:number;\n\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._pIsEntity = true;\n\n\t\tthis._pFallOffFactor = 1/(this._pFallOff*this._pFallOff - this._pRadius*this._pRadius);\n\t}\n\n\tpublic pCreateShadowMapper():CubeMapShadowMapper\n\t{\n\t\treturn new CubeMapShadowMapper();\n\t}\n\n\tpublic get radius():number\n\t{\n\t\treturn this._pRadius;\n\t}\n\n\tpublic set radius(value:number)\n\t{\n\t\tthis._pRadius = value;\n\n\t\tif (this._pRadius < 0) {\n\t\t\tthis._pRadius = 0;\n\t\t} else if (this._pRadius > this._pFallOff) {\n\t\t\tthis._pFallOff = this._pRadius;\n\t\t\tthis.pInvalidateBounds();\n\t\t}\n\t\tthis._pFallOffFactor = 1/( this._pFallOff*this._pFallOff - this._pRadius*this._pRadius );\n\t}\n\n\tpublic iFallOffFactor():number\n\t{\n\t\treturn this._pFallOffFactor;\n\t}\n\n\tpublic get fallOff():number\n\t{\n\t\treturn this._pFallOff;\n\t}\n\n\tpublic set fallOff(value:number)\n\t{\n\t\tthis._pFallOff = value;\n\n\t\tif (this._pFallOff < 0)\n\t\t\tthis._pFallOff = 0;\n\n\t\tif (this._pFallOff < this._pRadius)\n\t\t\tthis._pRadius = this._pFallOff;\n\n\t\tthis._pFallOffFactor = 1/( this._pFallOff*this._pFallOff - this._pRadius*this._pRadius);\n\t\tthis.pInvalidateBounds();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():EntityNode\n\t{\n\t\treturn new PointLightNode(this);\n\t}\n\n\tpublic pUpdateBounds()\n\t{\n\t\tthis._pBounds.fromSphere(new Vector3D(), this._pFallOff);\n\t\tthis._pBoundsInvalid = false;\n\t}\n\n\tpublic pCreateDefaultBoundingVolume():BoundingVolumeBase\n\t{\n\t\t//point lights are culled based on their falloff radius\n\t\treturn new BoundingSphere();\n\t}\n\n\tpublic iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D\n\t{\n\t\tvar raw:number[] = new Array(16);\n\t\tvar bounds:BoundingVolumeBase = entity.bounds;\n\t\tvar m:Matrix3D = new Matrix3D();\n\n\t\t// todo: do not use lookAt on Light\n\t\tm.copyFrom(entity.getRenderSceneTransform(camera));\n\t\tm.append(this._pParent.inverseSceneTransform);\n\t\tthis.lookAt(m.position);\n\n\t\tm.copyFrom(entity.getRenderSceneTransform(camera));\n\t\tm.append(this.inverseSceneTransform);\n\n\t\tvar box:Box = bounds.aabb;\n\t\tvar v1:Vector3D = m.deltaTransformVector(new Vector3D(box.left, box.bottom, box.front));\n\t\tvar v2:Vector3D = m.deltaTransformVector(new Vector3D(box.right, box.top, box.back));\n\t\tvar d1:number = v1.x*v1.x + v1.y*v1.y + v1.z*v1.z;\n\t\tvar d2:number = v2.x*v2.x + v2.y*v2.y + v2.z*v2.z;\n\t\tvar d:number = Math.sqrt(d1 > d2? d1 : d2);\n\t\tvar zMin:number;\n\t\tvar zMax:number;\n\n\t\tvar z:number = m.rawData[14];\n\t\tzMin = z - d;\n\t\tzMax = z + d;\n\n\t\traw[5] = raw[0] = zMin/d;\n\t\traw[10] = zMax/(zMax - zMin);\n\t\traw[11] = 1;\n\t\traw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[12] = raw[13] = raw[15] = 0;\n\t\traw[14] = -zMin*raw[10];\n\n\t\tif (!target)\n\t\t\ttarget = new Matrix3D();\n\n\t\ttarget.copyRawDataFrom(raw);\n\t\ttarget.prepend(m);\n\n\t\treturn target;\n\t}\n\n\tpublic _iCollectRenderables(renderer:IRenderer)\n\t{\n\t\t//nothing to do here\n\t}\n}\n\nexport = PointLight;", + "import DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Graphics\t\t\t\t\t\t= require(\"awayjs-core/lib/core/base/Graphics\");\n\n/**\n * This class is used to create lightweight shapes using the ActionScript\n * drawing application program interface(API). The Shape class includes a\n * graphics property, which lets you access methods from the\n * Graphics class.\n *\n *

The Sprite class also includes a graphicsproperty, and it\n * includes other features not available to the Shape class. For example, a\n * Sprite object is a display object container, whereas a Shape object is not\n * (and cannot contain child display objects). For this reason, Shape objects\n * consume less memory than Sprite objects that contain the same graphics.\n * However, a Sprite object supports user input events, while a Shape object\n * does not.

\n */\nclass Shape extends DisplayObject\n{\n\tprivate _graphics:Graphics;\n\n\t/**\n\t * Specifies the Graphics object belonging to this Shape object, where vector\n\t * drawing commands can occur.\n\t */\n\tget graphics():Graphics\n\t{\n\t\treturn this._graphics;\n\t}\n\n\t/**\n\t * Creates a new Shape object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n}\n\nexport = Shape;", + "import IAnimator\t\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimator\");\nimport BoundingVolumeBase\t\t\t= require(\"awayjs-core/lib/bounds/BoundingVolumeBase\");\nimport NullBounds\t\t\t\t\t= require(\"awayjs-core/lib/bounds/NullBounds\");\nimport DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport IMaterialOwner\t\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport UVTransform\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/UVTransform\");\nimport AssetType\t\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport SkyboxNode\t\t\t\t\t= require(\"awayjs-core/lib/core/partition/SkyboxNode\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport IEntity\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/IEntity\");\nimport MaterialBase\t\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * A Skybox class is used to render a sky in the scene. It's always considered static and 'at infinity', and as\n * such it's always centered at the camera's position and sized to exactly fit within the camera's frustum, ensuring\n * the sky box is always as large as possible without being clipped.\n */\nclass Skybox extends DisplayObject implements IEntity, IMaterialOwner\n{\n\tprivate _uvTransform:UVTransform;\n\n\tprivate _material:MaterialBase;\n\tprivate _animator:IAnimator;\n\n\tpublic get animator():IAnimator\n\t{\n\t\treturn this._animator;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get uvTransform():UVTransform\n\t{\n\t\treturn this._uvTransform;\n\t}\n\n\tpublic set uvTransform(value:UVTransform)\n\t{\n\t\tthis._uvTransform = value;\n\t}\n\n\t/**\n\t * Create a new Skybox object.\n\t *\n\t * @param material\tThe material with which to render the Skybox.\n\t */\n\tconstructor(material:MaterialBase)\n\t{\n\t\tsuper();\n\n\t\tthis._pIsEntity = true;\n\n\t\tthis.material = material;\n\t}\n\n/**\n * The material with which to render the Skybox.\n */\n\tpublic get material():MaterialBase\n\t{\n\t\treturn this._material;\n\t}\n\n\tpublic set material(value:MaterialBase)\n\t{\n\t\tif (value == this._material)\n\t\t\treturn;\n\n\t\tif (this._material)\n\t\t\tthis._material.iRemoveOwner( this);\n\n\t\tthis._material = value;\n\n\t\tif (this._material)\n\t\t\tthis._material.iAddOwner( this);\n\t}\n\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.SKYBOX;\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pInvalidateBounds()\n\t{\n\t\t// dead end\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateEntityPartitionNode():SkyboxNode\n\t{\n\t\treturn new SkyboxNode(this);\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pCreateDefaultBoundingVolume():BoundingVolumeBase\n\t{\n\t\treturn new NullBounds();\n\t}\n\n\t/**\n\t * @protected\n\t */\n\tpublic pUpdateBounds()\n\t{\n\t\tthis._pBoundsInvalid = false;\n\t}\n\n\tpublic get castsShadows():boolean\n\t{\n\t\treturn false; //TODO\n\t}\n\n\tpublic _iCollectRenderables(renderer:IRenderer)\n\t{\n\t\t//skybox do not get collected in the standard entity list\n\t}\n\n\tpublic _iCollectRenderable(renderer:IRenderer)\n\t{\n\n\t}\n}\n\nexport = Skybox;", + "import DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Rectangle\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport AntiAliasType\t\t\t\t= require(\"awayjs-core/lib/core/text/AntiAliasType\");\nimport GridFitType\t\t\t\t\t= require(\"awayjs-core/lib/core/text/GridFitType\");\nimport TextFieldAutoSize\t\t\t= require(\"awayjs-core/lib/core/text/TextFieldAutoSize\");\nimport TextFieldType\t\t\t\t= require(\"awayjs-core/lib/core/text/TextFieldType\");\nimport TextFormat\t\t\t\t\t= require(\"awayjs-core/lib/core/text/TextFormat\");\nimport TextInteractionMode\t\t\t= require(\"awayjs-core/lib/core/text/TextInteractionMode\");\nimport TextLineMetrics\t\t\t\t= require(\"awayjs-core/lib/core/text/TextLineMetrics\");\n\n/**\n * The TextField class is used to create display objects for text display and\n * input. You can use the TextField class to\n * perform low-level text rendering. However, in Flex, you typically use the\n * Label, Text, TextArea, and TextInput controls to process text. You can give a text field an instance name in the\n * Property inspector and use the methods and properties of the TextField\n * class to manipulate it with ActionScript. TextField instance names are\n * displayed in the Movie Explorer and in the Insert Target Path dialog box in\n * the Actions panel.\n *\n *

To create a text field dynamically, use the TextField()\n * constructor.

\n *\n *

The methods of the TextField class let you set, select, and manipulate\n * text in a dynamic or input text field that you create during authoring or\n * at runtime.

\n *\n *

ActionScript provides several ways to format your text at runtime. The\n * TextFormat class lets you set character and paragraph formatting for\n * TextField objects. You can apply Cascading Style Sheets(CSS) styles to\n * text fields by using the TextField.styleSheet property and the\n * StyleSheet class. You can use CSS to style built-in HTML tags, define new\n * formatting tags, or apply styles. You can assign HTML formatted text, which\n * optionally uses CSS styles, directly to a text field. HTML text that you\n * assign to a text field can contain embedded media(movie clips, SWF files,\n * GIF files, PNG files, and JPEG files). The text wraps around the embedded\n * media in the same way that a web browser wraps text around media embedded\n * in an HTML document.

\n *\n *

Flash Player supports a subset of HTML tags that you can use to format\n * text. See the list of supported HTML tags in the description of the\n * htmlText property.

\n * \n * @event change Dispatched after a control value is\n * modified, unlike the\n * textInput event, which is\n * dispatched before the value is modified.\n * Unlike the W3C DOM Event Model version of\n * the change event, which\n * dispatches the event only after the\n * control loses focus, the ActionScript 3.0\n * version of the change event\n * is dispatched any time the control\n * changes. For example, if a user types text\n * into a text field, a change\n * event is dispatched after every keystroke.\n * @event link Dispatched when a user clicks a hyperlink\n * in an HTML-enabled text field, where the\n * URL begins with \"event:\". The remainder of\n * the URL after \"event:\" is placed in the\n * text property of the LINK event.\n *\n *

Note: The default behavior,\n * adding the text to the text field, occurs\n * only when Flash Player generates the\n * event, which in this case happens when a\n * user attempts to input text. You cannot\n * put text into a text field by sending it\n * textInput events.

\n * @event scroll Dispatched by a TextField object\n * after the user scrolls.\n * @event textInput Flash Player dispatches the\n * textInput event when a user\n * enters one or more characters of text.\n * Various text input methods can generate\n * this event, including standard keyboards,\n * input method editors(IMEs), voice or\n * speech recognition systems, and even the\n * act of pasting plain text with no\n * formatting or style information.\n * @event textInteractionModeChange Flash Player dispatches the\n * textInteractionModeChange\n * event when a user changes the interaction\n * mode of a text field. for example on\n * Android, one can toggle from NORMAL mode\n * to SELECTION mode using context menu\n * options\n */\nclass TextField extends DisplayObject\n{\n\tprivate _bottomScrollV:number;\n\tprivate _caretIndex:number;\n\tprivate _length:number;\n\tprivate _maxScrollH:number;\n\tprivate _maxScrollV:number;\n\tprivate _numLines:number;\n\tprivate _selectionBeginIndex:number;\n\tprivate _selectionEndIndex:number;\n\tprivate _text:string = \"\";\n\tprivate _textHeight:number;\n\tprivate _textInteractionMode:TextInteractionMode;\n\tprivate _textWidth:number;\n\n\tprivate _charBoundaries:Rectangle;\n\tprivate _charIndexAtPoint:number;\n\tprivate _firstCharInParagraph:number;\n\tprivate _imageReference:DisplayObject\n\tprivate _lineIndexAtPoint:number;\n\tprivate _lineIndexOfChar:number;\n\tprivate _lineLength:number;\n\tprivate _lineMetrics:TextLineMetrics;\n\tprivate _lineOffset:number;\n\tprivate _lineText:string;\n\tprivate _paragraphLength:number;\n\tprivate _textFormat:TextFormat;\n\n\t/**\n\t * When set to true and the text field is not in focus, Flash\n\t * Player highlights the selection in the text field in gray. When set to\n\t * false and the text field is not in focus, Flash Player does\n\t * not highlight the selection in the text field.\n\t * \n\t * @default false\n\t */\n\tpublic alwaysShowSelection:boolean\n\n\t/**\n\t * The type of anti-aliasing used for this text field. Use\n\t * flash.text.AntiAliasType constants for this property. You can\n\t * control this setting only if the font is embedded(with the\n\t * embedFonts property set to true). The default\n\t * setting is flash.text.AntiAliasType.NORMAL.\n\t *\n\t *

To set values for this property, use the following string values:

\n\t */\n\tpublic antiAliasType:AntiAliasType;\n\n\t/**\n\t * Controls automatic sizing and alignment of text fields. Acceptable values\n\t * for the TextFieldAutoSize constants:\n\t * TextFieldAutoSize.NONE(the default),\n\t * TextFieldAutoSize.LEFT, TextFieldAutoSize.RIGHT,\n\t * and TextFieldAutoSize.CENTER.\n\t *\n\t *

If autoSize is set to TextFieldAutoSize.NONE\n\t * (the default) no resizing occurs.

\n\t *\n\t *

If autoSize is set to TextFieldAutoSize.LEFT,\n\t * the text is treated as left-justified text, meaning that the left margin\n\t * of the text field remains fixed and any resizing of a single line of the\n\t * text field is on the right margin. If the text includes a line break(for\n\t * example, \"\\n\" or \"\\r\"), the bottom is also\n\t * resized to fit the next line of text. If wordWrap is also set\n\t * to true, only the bottom of the text field is resized and the\n\t * right side remains fixed.

\n\t *\n\t *

If autoSize is set to\n\t * TextFieldAutoSize.RIGHT, the text is treated as\n\t * right-justified text, meaning that the right margin of the text field\n\t * remains fixed and any resizing of a single line of the text field is on\n\t * the left margin. If the text includes a line break(for example,\n\t * \"\\n\" or \"\\r\"), the bottom is also resized to fit the next\n\t * line of text. If wordWrap is also set to true,\n\t * only the bottom of the text field is resized and the left side remains\n\t * fixed.

\n\t *\n\t *

If autoSize is set to\n\t * TextFieldAutoSize.CENTER, the text is treated as\n\t * center-justified text, meaning that any resizing of a single line of the\n\t * text field is equally distributed to both the right and left margins. If\n\t * the text includes a line break(for example, \"\\n\" or\n\t * \"\\r\"), the bottom is also resized to fit the next line of\n\t * text. If wordWrap is also set to true, only the\n\t * bottom of the text field is resized and the left and right sides remain\n\t * fixed.

\n\t * \n\t * @throws ArgumentError The autoSize specified is not a member\n\t * of flash.text.TextFieldAutoSize.\n\t */\n\tpublic autoSize:TextFieldAutoSize;\n\n\t/**\n\t * Specifies whether the text field has a background fill. If\n\t * true, the text field has a background fill. If\n\t * false, the text field has no background fill. Use the\n\t * backgroundColor property to set the background color of a\n\t * text field.\n\t * \n\t * @default false\n\t */\n\tpublic background:boolean;\n\n\t/**\n\t * The color of the text field background. The default value is\n\t * 0xFFFFFF(white). This property can be retrieved or set, even\n\t * if there currently is no background, but the color is visible only if the\n\t * text field has the background property set to\n\t * true.\n\t */\n\tpublic backgroundColor:number /*int*/;\n\n\t/**\n\t * Specifies whether the text field has a border. If true, the\n\t * text field has a border. If false, the text field has no\n\t * border. Use the borderColor property to set the border color.\n\t * \n\t * @default false\n\t */\n\tpublic border:boolean;\n\n\t/**\n\t * The color of the text field border. The default value is\n\t * 0x000000(black). This property can be retrieved or set, even\n\t * if there currently is no border, but the color is visible only if the text\n\t * field has the border property set to true.\n\t */\n\tpublic borderColor:number /*int*/;\n\n\t/**\n\t * An integer(1-based index) that indicates the bottommost line that is\n\t * currently visible in the specified text field. Think of the text field as\n\t * a window onto a block of text. The scrollV property is the\n\t * 1-based index of the topmost visible line in the window.\n\t *\n\t *

All the text between the lines indicated by scrollV and\n\t * bottomScrollV is currently visible in the text field.

\n\t */\n\tpublic get bottomScrollV():number /*int*/\n\t{\n\t\treturn this._bottomScrollV;\n\t}\n\n\t/**\n\t * The index of the insertion point(caret) position. If no insertion point\n\t * is displayed, the value is the position the insertion point would be if\n\t * you restored focus to the field(typically where the insertion point last\n\t * was, or 0 if the field has not had focus).\n\t *\n\t *

Selection span indexes are zero-based(for example, the first position\n\t * is 0, the second position is 1, and so on).

\n\t */\n\tpublic get caretIndex():number /*int*/\n\t{\n\t\treturn this._caretIndex;\n\t}\n\n\t/**\n\t * A Boolean value that specifies whether extra white space(spaces, line\n\t * breaks, and so on) in a text field with HTML text is removed. The default\n\t * value is false. The condenseWhite property only\n\t * affects text set with the htmlText property, not the\n\t * text property. If you set text with the text\n\t * property, condenseWhite is ignored.\n\t *\n\t *

If condenseWhite is set to true, use standard\n\t * HTML commands such as
and

to place line\n\t * breaks in the text field.

\n\t *\n\t *

Set the condenseWhite property before setting the\n\t * htmlText property.

\n\t */\n\tpublic condenseWhite:boolean;\n\n\t/**\n\t * Specifies the format applied to newly inserted text, such as text entered\n\t * by a user or text inserted with the replaceSelectedText()\n\t * method.\n\t *\n\t *

Note: When selecting characters to be replaced with\n\t * setSelection() and replaceSelectedText(), the\n\t * defaultTextFormat will be applied only if the text has been\n\t * selected up to and including the last character. Here is an example:

\n\t *
 public my_txt:TextField new TextField();\n\t * my_txt.text = \"Flash Macintosh version\"; public my_fmt:TextFormat = new\n\t * TextFormat(); my_fmt.color = 0xFF0000; my_txt.defaultTextFormat = my_fmt;\n\t * my_txt.setSelection(6,15); // partial text selected - defaultTextFormat\n\t * not applied my_txt.setSelection(6,23); // text selected to end -\n\t * defaultTextFormat applied my_txt.replaceSelectedText(\"Windows version\");\n\t * 
\n\t *\n\t *

When you access the defaultTextFormat property, the\n\t * returned TextFormat object has all of its properties defined. No property\n\t * is null.

\n\t *\n\t *

Note: You can't set this property if a style sheet is applied to\n\t * the text field.

\n\t * \n\t * @throws Error This method cannot be used on a text field with a style\n\t * sheet.\n\t */\n\tpublic defaultTextFormat:TextFormat;\n\n\t/**\n\t * Specifies whether the text field is a password text field. If the value of\n\t * this property is true, the text field is treated as a\n\t * password text field and hides the input characters using asterisks instead\n\t * of the actual characters. If false, the text field is not\n\t * treated as a password text field. When password mode is enabled, the Cut\n\t * and Copy commands and their corresponding keyboard shortcuts will not\n\t * function. This security mechanism prevents an unscrupulous user from using\n\t * the shortcuts to discover a password on an unattended computer.\n\t * \n\t * @default false\n\t */\n\tpublic displayAsPassword:boolean;\n\n\t/**\n\t * Specifies whether to render by using embedded font outlines. If\n\t * false, Flash Player renders the text field by using device\n\t * fonts.\n\t *\n\t *

If you set the embedFonts property to true\n\t * for a text field, you must specify a font for that text by using the\n\t * font property of a TextFormat object applied to the text\n\t * field. If the specified font is not embedded in the SWF file, the text is\n\t * not displayed.

\n\t * \n\t * @default false\n\t */\n\tpublic embedFonts:boolean;\n\n\t/**\n\t * The type of grid fitting used for this text field. This property applies\n\t * only if the flash.text.AntiAliasType property of the text\n\t * field is set to flash.text.AntiAliasType.ADVANCED.\n\t *\n\t *

The type of grid fitting used determines whether Flash Player forces\n\t * strong horizontal and vertical lines to fit to a pixel or subpixel grid,\n\t * or not at all.

\n\t *\n\t *

For the flash.text.GridFitType property, you can use the\n\t * following string values:

\n\t * \n\t * @default pixel\n\t */\n\tpublic gridFitType:GridFitType;\n\n\t/**\n\t * Contains the HTML representation of the text field contents.\n\t *\n\t *

Flash Player supports the following HTML tags:

\n\t *\n\t *

Flash Player and AIR also support explicit character codes, such as\n\t * &(ASCII ampersand) and €(Unicode € symbol).

\n\t */\n\tpublic htmlText:string;\n\n\t/**\n\t * The number of characters in a text field. A character such as tab\n\t * (\\t) counts as one character.\n\t */\n\tpublic get length():number /*int*/\n\t{\n\t\treturn this._length;\n\t}\n\n\t/**\n\t * The maximum number of characters that the text field can contain, as\n\t * entered by a user. A script can insert more text than\n\t * maxChars allows; the maxChars property indicates\n\t * only how much text a user can enter. If the value of this property is\n\t * 0, a user can enter an unlimited amount of text.\n\t * \n\t * @default 0\n\t */\n\tpublic maxChars:number /*int*/;\n\n\t/**\n\t * The maximum value of scrollH.\n\t */\n\tpublic maxScrollH():number /*int*/\n\t{\n\t\treturn this._maxScrollH;\n\t}\n\n\t/**\n\t * The maximum value of scrollV.\n\t */\n\tpublic maxScrollV():number /*int*/\n\t{\n\t\treturn this._maxScrollV;\n\t}\n\n\t/**\n\t * A Boolean value that indicates whether Flash Player automatically scrolls\n\t * multiline text fields when the user clicks a text field and rolls the\n\t * mouse wheel. By default, this value is true. This property is\n\t * useful if you want to prevent mouse wheel scrolling of text fields, or\n\t * implement your own text field scrolling.\n\t */\n\tpublic mouseWheelEnabled:boolean;\n\n\t/**\n\t * Indicates whether field is a multiline text field. If the value is\n\t * true, the text field is multiline; if the value is\n\t * false, the text field is a single-line text field. In a field\n\t * of type TextFieldType.INPUT, the multiline value\n\t * determines whether the Enter key creates a new line(a value\n\t * of false, and the Enter key is ignored). If you\n\t * paste text into a TextField with a multiline\n\t * value of false, newlines are stripped out of the text.\n\t * \n\t * @default false\n\t */\n\tpublic multiline:boolean;\n\n\t/**\n\t * Defines the number of text lines in a multiline text field. If\n\t * wordWrap property is set to true, the number of\n\t * lines increases when text wraps.\n\t */\n\tpublic get numLines():number /*int*/\n\t{\n\t\treturn this._numLines;\n\t}\n\n\t/**\n\t * Indicates the set of characters that a user can enter into the text field.\n\t * If the value of the restrict property is null,\n\t * you can enter any character. If the value of the restrict\n\t * property is an empty string, you cannot enter any character. If the value\n\t * of the restrict property is a string of characters, you can\n\t * enter only characters in the string into the text field. The string is\n\t * scanned from left to right. You can specify a range by using the hyphen\n\t * (-) character. Only user interaction is restricted; a script can put any\n\t * text into the text field. This property does\n\t * not synchronize with the Embed font options in the Property inspector.\n\t *\n\t *

If the string begins with a caret(^) character, all characters are\n\t * initially accepted and succeeding characters in the string are excluded\n\t * from the set of accepted characters. If the string does not begin with a\n\t * caret(^) character, no characters are initially accepted and succeeding\n\t * characters in the string are included in the set of accepted\n\t * characters.

\n\t *\n\t *

The following example allows only uppercase characters, spaces, and\n\t * numbers to be entered into a text field:

\n\t *
 my_txt.restrict = \"A-Z 0-9\"; 
\n\t *\n\t *

The following example includes all characters, but excludes lowercase\n\t * letters:

\n\t *
 my_txt.restrict = \"^a-z\"; 
\n\t *\n\t *

You can use a backslash to enter a ^ or - verbatim. The accepted\n\t * backslash sequences are \\-, \\^ or \\\\. The backslash must be an actual\n\t * character in the string, so when specified in ActionScript, a double\n\t * backslash must be used. For example, the following code includes only the\n\t * dash(-) and caret(^):

\n\t *
 my_txt.restrict = \"\\\\-\\\\^\"; 
\n\t *\n\t *

The ^ can be used anywhere in the string to toggle between including\n\t * characters and excluding characters. The following code includes only\n\t * uppercase letters, but excludes the uppercase letter Q:

\n\t *
 my_txt.restrict = \"A-Z^Q\"; 
\n\t *\n\t *

You can use the \\u escape sequence to construct\n\t * restrict strings. The following code includes only the\n\t * characters from ASCII 32(space) to ASCII 126(tilde).

\n\t *
 my_txt.restrict = \"\\u0020-\\u007E\"; 
\n\t * \n\t * @default null\n\t */\n\tpublic restrict:string;\n\n\t/**\n\t * The current horizontal scrolling position. If the scrollH\n\t * property is 0, the text is not horizontally scrolled. This property value\n\t * is an integer that represents the horizontal position in pixels.\n\t *\n\t *

The units of horizontal scrolling are pixels, whereas the units of\n\t * vertical scrolling are lines. Horizontal scrolling is measured in pixels\n\t * because most fonts you typically use are proportionally spaced; that is,\n\t * the characters can have different widths. Flash Player performs vertical\n\t * scrolling by line because users usually want to see a complete line of\n\t * text rather than a partial line. Even if a line uses multiple fonts, the\n\t * height of the line adjusts to fit the largest font in use.

\n\t *\n\t *

Note: The scrollH property is zero-based, not\n\t * 1-based like the scrollV vertical scrolling property.

\n\t */\n\tpublic scrollH:number;\n\n\t/**\n\t * The vertical position of text in a text field. The scrollV\n\t * property is useful for directing users to a specific paragraph in a long\n\t * passage, or creating scrolling text fields.\n\t *\n\t *

The units of vertical scrolling are lines, whereas the units of\n\t * horizontal scrolling are pixels. If the first line displayed is the first\n\t * line in the text field, scrollV is set to 1(not 0). Horizontal scrolling\n\t * is measured in pixels because most fonts are proportionally spaced; that\n\t * is, the characters can have different widths. Flash performs vertical\n\t * scrolling by line because users usually want to see a complete line of\n\t * text rather than a partial line. Even if there are multiple fonts on a\n\t * line, the height of the line adjusts to fit the largest font in use.

\n\t */\n\tpublic scrollV:number;\n\n\t/**\n\t * A Boolean value that indicates whether the text field is selectable. The\n\t * value true indicates that the text is selectable. The\n\t * selectable property controls whether a text field is\n\t * selectable, not whether a text field is editable. A dynamic text field can\n\t * be selectable even if it is not editable. If a dynamic text field is not\n\t * selectable, the user cannot select its text.\n\t *\n\t *

If selectable is set to false, the text in\n\t * the text field does not respond to selection commands from the mouse or\n\t * keyboard, and the text cannot be copied with the Copy command. If\n\t * selectable is set to true, the text in the text\n\t * field can be selected with the mouse or keyboard, and the text can be\n\t * copied with the Copy command. You can select text this way even if the\n\t * text field is a dynamic text field instead of an input text field.

\n\t * \n\t * @default true\n\t */\n\tpublic selectable:boolean;\n\n\t/**\n\t * The zero-based character index value of the first character in the current\n\t * selection. For example, the first character is 0, the second character is\n\t * 1, and so on. If no text is selected, this property is the value of\n\t * caretIndex.\n\t */\n\tpublic get selectionBeginIndex():number /*int*/\n\t{\n\t\treturn this._selectionBeginIndex;\n\t}\n\n\t/**\n\t * The zero-based character index value of the last character in the current\n\t * selection. For example, the first character is 0, the second character is\n\t * 1, and so on. If no text is selected, this property is the value of\n\t * caretIndex.\n\t */\n\tpublic get selectionEndIndex():number /*int*/\n\t{\n\t\treturn this._selectionEndIndex;\n\t}\n\n\t/**\n\t * The sharpness of the glyph edges in this text field. This property applies\n\t * only if the flash.text.AntiAliasType property of the text\n\t * field is set to flash.text.AntiAliasType.ADVANCED. The range\n\t * for sharpness is a number from -400 to 400. If you attempt to\n\t * set sharpness to a value outside that range, Flash sets the\n\t * property to the nearest value in the range(either -400 or 400).\n\t * \n\t * @default 0\n\t */\n\tpublic sharpness:number;\n\n\t/**\n\t * Attaches a style sheet to the text field. For information on creating\n\t * style sheets, see the StyleSheet class and the ActionScript 3.0\n\t * Developer's Guide.\n\t *\n\t *

You can change the style sheet associated with a text field at any\n\t * time. If you change the style sheet in use, the text field is redrawn with\n\t * the new style sheet. You can set the style sheet to null or\n\t * undefined to remove the style sheet. If the style sheet in\n\t * use is removed, the text field is redrawn without a style sheet.

\n\t *\n\t *

Note: If the style sheet is removed, the contents of both\n\t * TextField.text and TextField.htmlText change to\n\t * incorporate the formatting previously applied by the style sheet. To\n\t * preserve the original TextField.htmlText contents without the\n\t * formatting, save the value in a variable before removing the style\n\t * sheet.

\n\t */\n\tpublic styleSheet:StyleSheet;\n\n\t/**\n\t * A string that is the current text in the text field. Lines are separated\n\t * by the carriage return character('\\r', ASCII 13). This\n\t * property contains unformatted text in the text field, without HTML tags.\n\t *\n\t *

To get the text in HTML form, use the htmlText\n\t * property.

\n\t */\n\tpublic get text():string\n\t{\n\t\treturn this._text;\n\t}\n\n\tpublic set text(value:string)\n\t{\n\t\tif (this._text == value)\n\t\t\treturn;\n\n\t\tthis._text = value;\n\t}\n\n\t/**\n\t * The color of the text in a text field, in hexadecimal format. The\n\t * hexadecimal color system uses six digits to represent color values. Each\n\t * digit has 16 possible values or characters. The characters range from 0-9\n\t * and then A-F. For example, black is 0x000000; white is\n\t * 0xFFFFFF.\n\t * \n\t * @default 0(0x000000)\n\t */\n\tpublic textColor:number /*int*/;\n\n\t/**\n\t * The height of the text in pixels.\n\t */\n\tpublic get textHeight():number\n\t{\n\t\treturn this._textHeight;\n\t}\n\n\t/**\n\t * The interaction mode property, Default value is\n\t * TextInteractionMode.NORMAL. On mobile platforms, the normal mode implies\n\t * that the text can be scrolled but not selected. One can switch to the\n\t * selectable mode through the in-built context menu on the text field. On\n\t * Desktop, the normal mode implies that the text is in scrollable as well as\n\t * selection mode.\n\t */\n\tpublic get textInteractionMode():TextInteractionMode\n\t{\n\t\treturn this._textInteractionMode;\n\t}\n\n\t/**\n\t * The width of the text in pixels.\n\t */\n\tpublic get textWidth():number\n\t{\n\t\treturn this._textWidth;\n\t}\n\n\t/**\n\t * The thickness of the glyph edges in this text field. This property applies\n\t * only when AntiAliasType is set to\n\t * AntiAliasType.ADVANCED.\n\t *\n\t *

The range for thickness is a number from -200 to 200. If\n\t * you attempt to set thickness to a value outside that range,\n\t * the property is set to the nearest value in the range(either -200 or\n\t * 200).

\n\t * \n\t * @default 0\n\t */\n\tpublic thickness:number;\n\n\t/**\n\t * The type of the text field. Either one of the following TextFieldType\n\t * constants: TextFieldType.DYNAMIC, which specifies a dynamic\n\t * text field, which a user cannot edit, or TextFieldType.INPUT,\n\t * which specifies an input text field, which a user can edit.\n\t * \n\t * @default dynamic\n\t * @throws ArgumentError The type specified is not a member of\n\t * flash.text.TextFieldType.\n\t */\n\tpublic type:TextFieldType;\n\n\t/**\n\t * Specifies whether to copy and paste the text formatting along with the\n\t * text. When set to true, Flash Player copies and pastes\n\t * formatting(such as alignment, bold, and italics) when you copy and paste\n\t * between text fields. Both the origin and destination text fields for the\n\t * copy and paste procedure must have useRichTextClipboard set\n\t * to true. The default value is false.\n\t */\n\tpublic useRichTextClipboard:boolean;\n\n\t/**\n\t * A Boolean value that indicates whether the text field has word wrap. If\n\t * the value of wordWrap is true, the text field\n\t * has word wrap; if the value is false, the text field does not\n\t * have word wrap. The default value is false.\n\t */\n\tpublic wordWrap:boolean;\n\n\t/**\n\t * Creates a new TextField instance. After you create the TextField instance,\n\t * call the addChild() or addChildAt() method of\n\t * the parent DisplayObjectContainer object to add the TextField instance to\n\t * the display list.\n\t *\n\t *

The default size for a text field is 100 x 100 pixels.

\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t * Appends the string specified by the newText parameter to the\n\t * end of the text of the text field. This method is more efficient than an\n\t * addition assignment(+=) on a text property\n\t * (such as someTextField.text += moreText), particularly for a\n\t * text field that contains a significant amount of content.\n\t * \n\t * @param newText The string to append to the existing text.\n\t */\n\tpublic appendText(newText:string)\n\t{\n\t\t//TODO\n\t}\n\n\t/**\n\t * Returns a rectangle that is the bounding box of the character.\n\t * \n\t * @param charIndex The zero-based index value for the character(for\n\t * example, the first position is 0, the second position is\n\t * 1, and so on).\n\t * @return A rectangle with x and y minimum and\n\t * maximum values defining the bounding box of the character.\n\t */\n\tpublic getCharBoundaries(charIndex:number):Rectangle\n\t{\n\t\treturn this._charBoundaries;\n\t}\n\n\t/**\n\t * Returns the zero-based index value of the character at the point specified\n\t * by the x and y parameters.\n\t * \n\t * @param x The x coordinate of the character.\n\t * @param y The y coordinate of the character.\n\t * @return The zero-based index value of the character(for example, the\n\t * first position is 0, the second position is 1, and so on). Returns\n\t * -1 if the point is not over any character.\n\t */\n\tpublic getCharIndexAtPoint(x:number, y:number):number /*int*/\n\t{\n\t\treturn this._charIndexAtPoint;\n\t}\n\n\t/**\n\t * Given a character index, returns the index of the first character in the\n\t * same paragraph.\n\t * \n\t * @param charIndex The zero-based index value of the character(for example,\n\t * the first character is 0, the second character is 1, and\n\t * so on).\n\t * @return The zero-based index value of the first character in the same\n\t * paragraph.\n\t * @throws RangeError The character index specified is out of range.\n\t */\n\tpublic getFirstCharInParagraph(charIndex:number /*int*/):number /*int*/\n\t{\n\t\treturn this._firstCharInParagraph;\n\t}\n\n\t/**\n\t * Returns a DisplayObject reference for the given id, for an\n\t * image or SWF file that has been added to an HTML-formatted text field by\n\t * using an tag. The tag is in the\n\t * following format:\n\t *\n\t *

 

\n\t * \n\t * @param id The id to match(in the id attribute\n\t * of the tag).\n\t * @return The display object corresponding to the image or SWF file with the\n\t * matching id attribute in the tag\n\t * of the text field. For media loaded from an external source, this\n\t * object is a Loader object, and, once loaded, the media object is a\n\t * child of that Loader object. For media embedded in the SWF file,\n\t * it is the loaded object. If no tag with the\n\t * matching id exists, the method returns\n\t * null.\n\t */\n\tpublic getImageReference(id:string):DisplayObject\n\t{\n\t\treturn this._imageReference;\n\t}\n\n\t/**\n\t * Returns the zero-based index value of the line at the point specified by\n\t * the x and y parameters.\n\t * \n\t * @param x The x coordinate of the line.\n\t * @param y The y coordinate of the line.\n\t * @return The zero-based index value of the line(for example, the first\n\t * line is 0, the second line is 1, and so on). Returns -1 if the\n\t * point is not over any line.\n\t */\n\tpublic getLineIndexAtPoint(x:number, y:number):number /*int*/\n\t{\n\t\treturn this._lineIndexAtPoint;\n\t}\n\n\t/**\n\t * Returns the zero-based index value of the line containing the character\n\t * specified by the charIndex parameter.\n\t * \n\t * @param charIndex The zero-based index value of the character(for example,\n\t * the first character is 0, the second character is 1, and\n\t * so on).\n\t * @return The zero-based index value of the line.\n\t * @throws RangeError The character index specified is out of range.\n\t */\n\tpublic getLineIndexOfChar(charIndex:number /*int*/):number /*int*/\n\t{\n\t\treturn this._lineIndexOfChar;\n\t}\n\n\t/**\n\t * Returns the number of characters in a specific text line.\n\t * \n\t * @param lineIndex The line number for which you want the length.\n\t * @return The number of characters in the line.\n\t * @throws RangeError The line number specified is out of range.\n\t */\n\tpublic getLineLength(lineIndex:number /*int*/):number /*int*/\n\t{\n\t\treturn this._lineLength;\n\t}\n\n\t/**\n\t * Returns metrics information about a given text line.\n\t * \n\t * @param lineIndex The line number for which you want metrics information.\n\t * @return A TextLineMetrics object.\n\t * @throws RangeError The line number specified is out of range.\n\t */\n\tpublic getLineMetrics(lineIndex:number /*int*/):TextLineMetrics\n\t{\n\t\treturn this._lineMetrics;\n\t}\n\n\t/**\n\t * Returns the character index of the first character in the line that the\n\t * lineIndex parameter specifies.\n\t * \n\t * @param lineIndex The zero-based index value of the line(for example, the\n\t * first line is 0, the second line is 1, and so on).\n\t * @return The zero-based index value of the first character in the line.\n\t * @throws RangeError The line number specified is out of range.\n\t */\n\tpublic getLineOffset(lineIndex:number /*int*/):number /*int*/\n\t{\n\t\treturn this._lineOffset;\n\t}\n\n\t/**\n\t * Returns the text of the line specified by the lineIndex\n\t * parameter.\n\t * \n\t * @param lineIndex The zero-based index value of the line(for example, the\n\t * first line is 0, the second line is 1, and so on).\n\t * @return The text string contained in the specified line.\n\t * @throws RangeError The line number specified is out of range.\n\t */\n\tpublic getLineText(lineIndex:number /*int*/):string\n\t{\n\t\treturn this._lineText;\n\t}\n\n\t/**\n\t * Given a character index, returns the length of the paragraph containing\n\t * the given character. The length is relative to the first character in the\n\t * paragraph(as returned by getFirstCharInParagraph()), not to\n\t * the character index passed in.\n\t * \n\t * @param charIndex The zero-based index value of the character(for example,\n\t * the first character is 0, the second character is 1, and\n\t * so on).\n\t * @return Returns the number of characters in the paragraph.\n\t * @throws RangeError The character index specified is out of range.\n\t */\n\tpublic getParagraphLength(charIndex:number /*int*/):number /*int*/\n\t{\n\t\treturn this._paragraphLength;\n\t}\n\n\t/**\n\t * Returns a TextFormat object that contains formatting information for the\n\t * range of text that the beginIndex and endIndex\n\t * parameters specify. Only properties that are common to the entire text\n\t * specified are set in the resulting TextFormat object. Any property that is\n\t * mixed, meaning that it has different values at different points in\n\t * the text, has a value of null.\n\t *\n\t *

If you do not specify values for these parameters, this method is\n\t * applied to all the text in the text field.

\n\t *\n\t *

The following table describes three possible usages:

\n\t * \n\t * @return The TextFormat object that represents the formatting properties\n\t * for the specified text.\n\t * @throws RangeError The beginIndex or endIndex\n\t * specified is out of range.\n\t */\n\tpublic getTextFormat(beginIndex:number /*int*/ = -1, endIndex:number /*int*/ = -1):TextFormat\n\t{\n\t\treturn this._textFormat;\n\t}\n\n\t/**\n\t * Replaces the current selection with the contents of the value\n\t * parameter. The text is inserted at the position of the current selection,\n\t * using the current default character format and default paragraph format.\n\t * The text is not treated as HTML.\n\t *\n\t *

You can use the replaceSelectedText() method to insert and\n\t * delete text without disrupting the character and paragraph formatting of\n\t * the rest of the text.

\n\t *\n\t *

Note: This method does not work if a style sheet is applied to\n\t * the text field.

\n\t * \n\t * @param value The string to replace the currently selected text.\n\t * @throws Error This method cannot be used on a text field with a style\n\t * sheet.\n\t */\n\tpublic replaceSelectedText(value:string)\n\t{\n\n\t}\n\n\t/**\n\t * Replaces the range of characters that the beginIndex and\n\t * endIndex parameters specify with the contents of the\n\t * newText parameter. As designed, the text from\n\t * beginIndex to endIndex-1 is replaced.\n\t *\n\t *

Note: This method does not work if a style sheet is applied to\n\t * the text field.

\n\t * \n\t * @param beginIndex The zero-based index value for the start position of the\n\t * replacement range.\n\t * @param endIndex The zero-based index position of the first character\n\t * after the desired text span.\n\t * @param newText The text to use to replace the specified range of\n\t * characters.\n\t * @throws Error This method cannot be used on a text field with a style\n\t * sheet.\n\t */\n\tpublic replaceText(beginIndex:number /*int*/, endIndex:number /*int*/, newText:string)\n\t{\n\n\t}\n\n\t/**\n\t * Sets as selected the text designated by the index values of the first and\n\t * last characters, which are specified with the beginIndex and\n\t * endIndex parameters. If the two parameter values are the\n\t * same, this method sets the insertion point, as if you set the\n\t * caretIndex property.\n\t * \n\t * @param beginIndex The zero-based index value of the first character in the\n\t * selection(for example, the first character is 0, the\n\t * second character is 1, and so on).\n\t * @param endIndex The zero-based index value of the last character in the\n\t * selection.\n\t */\n\tpublic setSelection(beginIndex:number /*int*/, endIndex:number /*int*/)\n\t{\n\n\t}\n\n\t/**\n\t * Applies the text formatting that the format parameter\n\t * specifies to the specified text in a text field. The value of\n\t * format must be a TextFormat object that specifies the desired\n\t * text formatting changes. Only the non-null properties of\n\t * format are applied to the text field. Any property of\n\t * format that is set to null is not applied. By\n\t * default, all of the properties of a newly created TextFormat object are\n\t * set to null.\n\t *\n\t *

Note: This method does not work if a style sheet is applied to\n\t * the text field.

\n\t *\n\t *

The setTextFormat() method changes the text formatting\n\t * applied to a range of characters or to the entire body of text in a text\n\t * field. To apply the properties of format to all text in the text field, do\n\t * not specify values for beginIndex and endIndex.\n\t * To apply the properties of the format to a range of text, specify values\n\t * for the beginIndex and the endIndex parameters.\n\t * You can use the length property to determine the index\n\t * values.

\n\t *\n\t *

The two types of formatting information in a TextFormat object are\n\t * character level formatting and paragraph level formatting. Each character\n\t * in a text field can have its own character formatting settings, such as\n\t * font name, font size, bold, and italic.

\n\t *\n\t *

For paragraphs, the first character of the paragraph is examined for\n\t * the paragraph formatting settings for the entire paragraph. Examples of\n\t * paragraph formatting settings are left margin, right margin, and\n\t * indentation.

\n\t *\n\t *

Any text inserted manually by the user, or replaced by the\n\t * replaceSelectedText() method, receives the default text field\n\t * formatting for new text, and not the formatting specified for the text\n\t * insertion point. To set the default formatting for new text, use\n\t * defaultTextFormat.

\n\t * \n\t * @param format A TextFormat object that contains character and paragraph\n\t * formatting information.\n\t * @throws Error This method cannot be used on a text field with a style\n\t * sheet.\n\t * @throws RangeError The beginIndex or endIndex\n\t * specified is out of range.\n\t */\n\tpublic setTextFormat(format:TextFormat, beginIndex:number /*int*/ = -1, endIndex:number /*int*/ = -1)\n\t{\n\n\t}\n\n\t/**\n\t * Returns true if an embedded font is available with the specified\n\t * fontName and fontStyle where\n\t * Font.fontType is flash.text.FontType.EMBEDDED.\n\t * Starting with Flash Player 10, two kinds of embedded fonts can appear in a\n\t * SWF file. Normal embedded fonts are only used with TextField objects. CFF\n\t * embedded fonts are only used with the flash.text.engine classes. The two\n\t * types are distinguished by the fontType property of the\n\t * Font class, as returned by the enumerateFonts()\n\t * function.\n\t *\n\t *

TextField cannot use a font of type EMBEDDED_CFF. If\n\t * embedFonts is set to true and the only font\n\t * available at run time with the specified name and style is of type\n\t * EMBEDDED_CFF, Flash Player fails to render the text, as if no\n\t * embedded font were available with the specified name and style.

\n\t *\n\t *

If both EMBEDDED and EMBEDDED_CFF fonts are\n\t * available with the same name and style, the EMBEDDED font is\n\t * selected and text renders with the EMBEDDED font.

\n\t * \n\t * @param fontName The name of the embedded font to check.\n\t * @param fontStyle Specifies the font style to check. Use\n\t * flash.text.FontStyle\n\t * @return true if a compatible embedded font is available,\n\t * otherwise false.\n\t * @throws ArgumentError The fontStyle specified is not a member\n\t * of flash.text.FontStyle.\n\t */\n\tpublic static isFontCompatible(fontName:string, fontStyle:string):boolean\n\t{\n\t\treturn false;\n\t}\n}\n\nexport = TextField;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\n\n/**\n * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden\n * by a concrete subclass.\n */\nclass AbstractMethodError extends Error\n{\n\t/**\n\t * Create a new AbstractMethodError.\n\t * @param message An optional message to override the default error message.\n\t * @param id The id of the error.\n\t */\n\tconstructor(message:string = null, id:number = 0)\n\t{\n\t\tsuper(message || \"An abstract method was called! Either an instance of an abstract class was created, or an abstract method was not overridden by the subclass.\", id);\n\t}\n}\n\nexport = AbstractMethodError;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\n\n/**\n * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden\n * by a concrete subclass.\n */\nclass ArgumentError extends Error\n{\n\t/**\n\t * Create a new ArgumentError.\n\t *\n\t * @param message An optional message to override the default error message.\n\t * @param id The id of the error.\n\t */\n\tconstructor(message:string = null, id:number = 0)\n\t{\n\t\tsuper(message || \"ArgumentError\", id);\n\t}\n}\n\nexport = ArgumentError;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\n\nclass CastError extends Error\n{\n\tconstructor(message:string)\n\t{\n\t\tsuper(message);\n\t}\n}\n\nexport = CastError;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\n\nclass DocumentError extends Error\n{\n\tpublic static DOCUMENT_DOES_NOT_EXIST:string = \"documentDoesNotExist\";\n\n\tconstructor(message:string = \"DocumentError\", id:number = 0)\n\t{\n\t\tsuper(message, id);\n\t}\n}\n\nexport = DocumentError;", + "class Error\n{\n\n\tprivate _errorID:number = 0; //Contains the reference number associated with the specific error message.\n\tprivate _messsage:string = ''; //Contains the message associated with the Error object.\n\tprivate _name:string = ''; // Contains the name of the Error object.\n\n\tconstructor(message:string = '', id:number = 0, _name:string = '')\n\t{\n\n\t\tthis._messsage = message;\n\t\tthis._name = name;\n\t\tthis._errorID = id;\n\n\t}\n\n\t/**\n\t *\n\t * @returns {string}\n\t */\n\tpublic get message():string\n\t{\n\n\t\treturn this._messsage;\n\n\t}\n\n\t/**\n\t *\n\t * @param value\n\t */\n\tpublic set message(value:string)\n\t{\n\n\t\tthis._messsage = value;\n\n\t}\n\n\t/**\n\t *\n\t * @returns {string}\n\t */\n\tpublic get name():string\n\t{\n\n\t\treturn this._name;\n\n\t}\n\n\t/**\n\t *\n\t * @param value\n\t */\n\tpublic set name(value:string)\n\t{\n\n\t\tthis._name = value;\n\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get errorID():number\n\t{\n\n\t\treturn this._errorID;\n\n\t}\n\n}\n\nexport = Error;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\n\n/**\n * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden\n * by a concrete subclass.\n */\nclass PartialImplementationError extends Error\n{\n\t/**\n\t * Create a new AbstractMethodError.\n\t * @param message An optional message to override the default error message.\n\t * @param id The id of the error.\n\t */\n\tconstructor(dependency:string = '', id:number = 0)\n\t{\n\t\tsuper(\"PartialImplementationError - this function is in development. Required Dependency: \" + dependency, id);\n\t}\n}\n\nexport = PartialImplementationError;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\n\n/**\n * RangeError is thrown when an index is accessed out of range of the number of\n * available indices on an Array.\n */\nclass RangeError extends Error\n{\n\t/**\n\t * Create a new RangeError.\n\t *\n\t * @param message An optional message to override the default error message.\n\t * @param id The id of the error.\n\t */\n\tconstructor(message:string = null, id:number = 0)\n\t{\n\t\tsuper(message || \"RangeError\", id);\n\t}\n}\n\nexport = RangeError;", + "import IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\n/**\n * @class away.events.AssetEvent\n */\nclass AssetEvent extends Event\n{\n\t/**\n\t *\n\t */\n\tpublic static ASSET_COMPLETE:string = \"assetComplete\";\n\n\t/**\n\t *\n\t */\n\tpublic static ASSET_RENAME:string = 'assetRename';\n\n\t/**\n\t *\n\t */\n\tpublic static ASSET_CONFLICT_RESOLVED:string = 'assetConflictResolved';\n\n\t/**\n\t *\n\t */\n\tpublic static TEXTURE_SIZE_ERROR:string = 'textureSizeError';\n\n\tprivate _asset:IAsset;\n\tprivate _prevName:string;\n\n\t/**\n\t *\n\t */\n\tconstructor(type:string, asset:IAsset = null, prevName:string = null)\n\t{\n\t\tsuper(type);\n\n\t\tthis._asset = asset;\n\t\tthis._prevName = prevName || (this._asset? this._asset.name : null);\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get asset():IAsset\n\t{\n\t\treturn this._asset;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get assetPrevName():string\n\t{\n\t\treturn this._prevName;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic clone():Event\n\t{\n\t\treturn new AssetEvent(this.type, this.asset, this.assetPrevName);\n\t}\n}\n\nexport = AssetEvent;", + "import Camera\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\n/**\n * @class away.events.CameraEvent\n */\nclass CameraEvent extends Event\n{\n\tpublic static PROJECTION_CHANGED:string = \"projectionChanged\";\n\n\tprivate _camera:Camera;\n\n\tconstructor(type:string, camera:Camera)\n\t{\n\t\tsuper(type);\n\n\t\tthis._camera = camera;\n\t}\n\n\tpublic get camera():Camera\n\t{\n\t\treturn this._camera;\n\t}\n}\n\nexport = CameraEvent;", + "import DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass DisplayObjectEvent extends Event\n{\n\tpublic static VISIBLITY_UPDATED:string = \"visiblityUpdated\";\n\tpublic static SCENETRANSFORM_CHANGED:string = \"scenetransformChanged\";\n\tpublic static SCENE_CHANGED:string = \"sceneChanged\";\n\tpublic static POSITION_CHANGED:string = \"positionChanged\";\n\tpublic static ROTATION_CHANGED:string = \"rotationChanged\";\n\tpublic static SCALE_CHANGED:string = \"scaleChanged\";\n\n\tpublic object:DisplayObject;\n\n\tconstructor(type:string, object:DisplayObject)\n\t{\n\t\tsuper(type);\n\t\tthis.object = object;\n\t}\n}\n\nexport = DisplayObjectEvent;", + "import Event\t\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\n/**\n * Base class for dispatching events\n*\n* @class away.events.EventDispatcher\n*\n*/\nclass EventDispatcher\n{\n\tprivate listeners:Array> = new Array>();\n\tprivate target:any;\n\n\tconstructor(target:any = null)\n\t{\n\t\tthis.target = target || this;\n\t}\n\n\t/**\n\t * Add an event listener\n\t * @method addEventListener\n\t * @param {String} Name of event to add a listener for\n\t * @param {Function} Callback function\n\t */\n\tpublic addEventListener(type:string, listener:Function)\n\t{\n\t\tif (this.listeners[ type ] === undefined)\n\t\t\tthis.listeners[ type ] = new Array();\n\n\t\tif (this.getEventListenerIndex(type, listener) === -1)\n\t\t\tthis.listeners[ type ].push(listener);\n\t}\n\n\t/**\n\t * Remove an event listener\n\t * @method removeEventListener\n\t * @param {String} Name of event to remove a listener for\n\t * @param {Function} Callback function\n\t */\n\tpublic removeEventListener(type:string, listener:Function)\n\t{\n\t\tvar index:number = this.getEventListenerIndex(type, listener);\n\n\t\tif (index !== -1)\n\t\t\tthis.listeners[ type ].splice(index, 1);\n\t}\n\n\t/**\n\t * Dispatch an event\n\t * @method dispatchEvent\n\t * @param {Event} Event to dispatch\n\t */\n\tpublic dispatchEvent(event:Event)\n\t{\n\t\tvar listenerArray:Array = this.listeners[ event.type ];\n\n\t\tif (listenerArray !== undefined) {\n\t\t\tvar l:number = listenerArray.length;\n\n\t\t\tevent.target = this.target;\n\n\t\t\tfor (var i:number = 0; i < l; i++)\n\t\t\t\tlistenerArray[i](event);\n\t\t}\n\t}\n\n\t/**\n\t * get Event Listener Index in array. Returns -1 if no listener is added\n\t * @method getEventListenerIndex\n\t * @param {String} Name of event to remove a listener for\n\t * @param {Function} Callback function\n\t */\n\tprivate getEventListenerIndex(type:string, listener:Function):number\n\t{\n\t\tif (this.listeners[ type ] !== undefined) {\n\t\t\tvar a:Array = this.listeners[ type ];\n\t\t\tvar l:number = a.length;\n\n\t\t\tfor (var i:number = 0; i < l; i++)\n\t\t\t\tif (listener == a[i])\n\t\t\t\t\treturn i;\n\t\t}\n\n\t\treturn -1;\n\t}\n\n\t/**\n\t * check if an object has an event listener assigned to it\n\t * @method hasListener\n\t * @param {String} Name of event to remove a listener for\n\t * @param {Function} Callback function\n\t */\n\tpublic hasEventListener(type:string, listener?:Function):boolean\n\t{\n\t\tif (listener != null) {\n\t\t\treturn ( this.getEventListenerIndex(type, listener) !== -1 );\n\t\t} else {\n\t\t\tif (this.listeners[ type ] !== undefined)\n\t\t\t\treturn ( this.listeners[ type ].length > 0 );\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn false;\n\t}\n}\n\nexport = EventDispatcher;", + "class Event\n{\n\n\tpublic static COMPLETE:string = 'complete';\n\tpublic static OPEN:string = 'open';\n\n\tpublic static ENTER_FRAME:string = 'enterFrame';\n\tpublic static EXIT_FRAME:string = 'exitFrame';\n\n\n\tpublic static RESIZE:string = \"resize\";\n\tpublic static ERROR:string = \"error\";\n\tpublic static CHANGE:string = \"change\";\n\n\t/**\n\t * Type of event\n\t * @property type\n\t * @type String\n\t */\n\tpublic type:string = undefined;\n\n\t/**\n\t * Reference to target object\n\t * @property target\n\t * @type Object\n\t */\n\tpublic target:any = undefined;\n\n\tconstructor(type:string)\n\t{\n\t\tthis.type = type;\n\t}\n\n\t/**\n\t * Clones the current event.\n\t * @return An exact duplicate of the current event.\n\t */\n\tpublic clone():Event\n\t{\n\t\treturn new Event(this.type);\n\t}\n}\n\nexport = Event;", + "import SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\n/**\n* Dispatched to notify changes in a geometry object's state.\n*\n* @class away.events.GeometryEvent\n* @see away3d.core.base.Geometry\n*/\nclass GeometryEvent extends Event\n{\n\t/**\n\t * Dispatched when a TriangleSubGeometry was added to the dispatching Geometry.\n\t */\n\tpublic static SUB_GEOMETRY_ADDED:string = \"SubGeometryAdded\";\n\n\t/**\n\t * Dispatched when a TriangleSubGeometry was removed from the dispatching Geometry.\n\t */\n\tpublic static SUB_GEOMETRY_REMOVED:string = \"SubGeometryRemoved\";\n\n\tpublic static BOUNDS_INVALID:string = \"BoundsInvalid\";\n\n\tprivate _subGeometry:SubGeometryBase;\n\n\t/**\n\t * Create a new GeometryEvent\n\t * @param type The event type.\n\t * @param subGeometry An optional TriangleSubGeometry object that is the subject of this event.\n\t */\n\tconstructor(type:string, subGeometry:SubGeometryBase = null)\n\t{\n\t\tsuper(type);\n\n\t\tthis._subGeometry = subGeometry;\n\t}\n\n\t/**\n\t * The TriangleSubGeometry object that is the subject of this event, if appropriate.\n\t */\n\tpublic get subGeometry():SubGeometryBase\n\t{\n\t\treturn this._subGeometry;\n\t}\n\n\t/**\n\t * Clones the event.\n\t * @return An exact duplicate of the current object.\n\t */\n\tpublic clone():Event\n\t{\n\t\treturn new GeometryEvent(this.type, this._subGeometry);\n\t}\n}\n\nexport = GeometryEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\n/**\n * @class away.events.HTTPStatusEvent\n */\nclass HTTPStatusEvent extends Event\n{\n\n\tpublic static HTTP_STATUS:string = \"httpStatus\";\n\n\tpublic status:number;\n\n\tconstructor(type:string, status:number = null)\n\t{\n\t\tsuper(type);\n\n\t\tthis.status = status;\n\n\t}\n}\n\nexport = HTTPStatusEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\n/**\n * Base interface for dispatching events\n *\n * @interface away.events.IEventDispatcher\n *\n */\ninterface IEventDispatcher\n{\n\t/**\n\t * Add an event listener\n\t * @method addEventListener\n\t * @param {String} Name of event to add a listener for\n\t * @param {Function} Callback function\n\t */\n\taddEventListener(type:string, listener:Function);\n\n\t/**\n\t * Remove an event listener\n\t * @method removeEventListener\n\t * @param {String} Name of event to remove a listener for\n\t * @param {Function} Callback function\n\t */\n\tremoveEventListener(type:string, listener:Function);\n\n\t/**\n\t * Dispatch an event\n\t * @method dispatchEvent\n\t * @param {Event} Event to dispatch\n\t */\n\tdispatchEvent(event:Event);\n\n\t/**\n\t * check if an object has an event listener assigned to it\n\t * @method hasListener\n\t * @param {String} Name of event to remove a listener for\n\t * @param {Function} Callback function\n\t * @param {Object} Target object listener is added to\n\t */\n\thasEventListener(type:string, listener?:Function) : boolean;\n}\n\nexport = IEventDispatcher;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass IOErrorEvent extends Event\n{\n\n\tpublic static IO_ERROR:string = \"ioError\";\n\n\tconstructor(type:string)\n\t{\n\t\tsuper(type);\n\n\t}\n}\n\nexport = IOErrorEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass LightEvent extends Event\n{\n\n\tpublic static CASTS_SHADOW_CHANGE:string = \"castsShadowChange\";\n\n\tconstructor(type:string)\n\t{\n\t\tsuper(type);\n\t}\n\n\t//@override\n\tpublic clone():Event\n\t{\n\t\treturn new LightEvent(this.type);\n\t}\n}\n\nexport = LightEvent;", + "import DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass LoaderEvent extends Event\n{\n\t/**\n\t * Dispatched when a resource and all of its dependencies is retrieved.\n\t */\n\tpublic static RESOURCE_COMPLETE:string = \"resourceComplete\";\n\n\tprivate _url:string;\n\tprivate _content:DisplayObject;\n\tprivate _assets:IAsset[];\n\n\t/**\n\t * Create a new LoaderEvent object.\n\t *\n\t * @param type The event type.\n\t * @param url The url of the loaded resource.\n\t * @param assets The assets of the loaded resource.\n\t */\n\tconstructor(type:string, url:string = null, content:DisplayObject = null, assets:Array = null)\n\t{\n\t\tsuper(type);\n\n\t\tthis._url = url;\n\t\tthis._content = content;\n\t\tthis._assets = assets;\n\t}\n\n\t/**\n\t * The content returned if the resource has been loaded inside a Loader object.\n\t */\n\tpublic get content():DisplayObject\n\t{\n\t\treturn this._content;\n\t}\n\n\t/**\n\t * The url of the loaded resource.\n\t */\n\tpublic get url():string\n\t{\n\t\treturn this._url;\n\t}\n\n\t/**\n\t * The error string on loadError.\n\t */\n\tpublic get assets():IAsset[]\n\t{\n\t\treturn this._assets;\n\t}\n\n\t/**\n\t * Clones the current event.\n\t * @return An exact duplicate of the current event.\n\t */\n\tpublic clone():Event\n\t{\n\t\treturn new LoaderEvent(this.type, this._url, this._content, this._assets);\n\t}\n}\n\nexport = LoaderEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass MaterialEvent extends Event\n{\n\tpublic static SIZE_CHANGED:string = \"sizeChanged\";\n\n\tconstructor(type:string)\n\t{\n\t\tsuper(type);\n\t}\n}\n\nexport = MaterialEvent;", + "import View\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/View\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport IMaterialOwner\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport Point\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\n\n/**\n * A MouseEvent is dispatched when a mouse event occurs over a mouseEnabled object in View.\n * TODO: we don't have screenZ data, tho this should be easy to implement\n */\nclass MouseEvent extends Event\n{\n\t// Private.\n\tpublic _iAllowedToPropagate:boolean = true;\n\tpublic _iParentEvent:MouseEvent;\n\n\t/**\n\t * Defines the value of the type property of a mouseOver3d event object.\n\t */\n\tpublic static MOUSE_OVER:string = \"mouseOver3d\";\n\n\t/**\n\t * Defines the value of the type property of a mouseOut3d event object.\n\t */\n\tpublic static MOUSE_OUT:string = \"mouseOut3d\";\n\n\t/**\n\t * Defines the value of the type property of a mouseUp3d event object.\n\t */\n\tpublic static MOUSE_UP:string = \"mouseUp3d\";\n\n\t/**\n\t * Defines the value of the type property of a mouseDown3d event object.\n\t */\n\tpublic static MOUSE_DOWN:string = \"mouseDown3d\";\n\n\t/**\n\t * Defines the value of the type property of a mouseMove3d event object.\n\t */\n\tpublic static MOUSE_MOVE:string = \"mouseMove3d\";\n\n\t/**\n\t * Defines the value of the type property of a rollOver3d event object.\n\t */\n//\t\tpublic static ROLL_OVER : string = \"rollOver3d\";\n\n\t/**\n\t * Defines the value of the type property of a rollOut3d event object.\n\t */\n//\t\tpublic static ROLL_OUT : string = \"rollOut3d\";\n\n\t/**\n\t * Defines the value of the type property of a click3d event object.\n\t */\n\tpublic static CLICK:string = \"click3d\";\n\n\t/**\n\t * Defines the value of the type property of a doubleClick3d event object.\n\t */\n\tpublic static DOUBLE_CLICK:string = \"doubleClick3d\";\n\n\t/**\n\t * Defines the value of the type property of a mouseWheel3d event object.\n\t */\n\tpublic static MOUSE_WHEEL:string = \"mouseWheel3d\";\n\n\t/**\n\t * The horizontal coordinate at which the event occurred in view coordinates.\n\t */\n\tpublic screenX:number;\n\n\t/**\n\t * The vertical coordinate at which the event occurred in view coordinates.\n\t */\n\tpublic screenY:number;\n\n\t/**\n\t * The view object inside which the event took place.\n\t */\n\tpublic view:View;\n\n\t/**\n\t * The 3d object inside which the event took place.\n\t */\n\tpublic object:DisplayObject;\n\n\t/**\n\t * The material owner inside which the event took place.\n\t */\n\tpublic materialOwner:IMaterialOwner;\n\n\t/**\n\t * The material of the 3d element inside which the event took place.\n\t */\n\tpublic material:MaterialBase;\n\n\t/**\n\t * The uv coordinate inside the draw primitive where the event took place.\n\t */\n\tpublic uv:Point;\n\n\t/**\n\t * The index of the face where the event took place.\n\t */\n\tpublic index:number;\n\n\t/**\n\t * The index of the subGeometry where the event took place.\n\t */\n\tpublic subGeometryIndex:number;\n\n\t/**\n\t * The position in object space where the event took place\n\t */\n\tpublic localPosition:Vector3D;\n\n\t/**\n\t * The normal in object space where the event took place\n\t */\n\tpublic localNormal:Vector3D;\n\n\t/**\n\t * Indicates whether the Control key is active (true) or inactive (false).\n\t */\n\tpublic ctrlKey:boolean;\n\n\t/**\n\t * Indicates whether the Alt key is active (true) or inactive (false).\n\t */\n\tpublic altKey:boolean;\n\n\t/**\n\t * Indicates whether the Shift key is active (true) or inactive (false).\n\t */\n\tpublic shiftKey:boolean;\n\n\t/**\n\t * Indicates how many lines should be scrolled for each unit the user rotates the mouse wheel.\n\t */\n\tpublic delta:number;\n\n\t/**\n\t * Create a new MouseEvent object.\n\t * @param type The type of the MouseEvent.\n\t */\n\tconstructor(type:string)\n\t{\n\t\tsuper(type);\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic get bubbles():boolean\n\t{\n\t\tvar doesBubble:boolean = this._iAllowedToPropagate;\n\t\tthis._iAllowedToPropagate = true;\n\n\t\t// Don't bubble if propagation has been stopped.\n\t\treturn doesBubble;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic stopPropagation()\n\t{\n\t\tthis._iAllowedToPropagate = false;\n\n\t\tif (this._iParentEvent)\n\t\t\tthis._iParentEvent.stopPropagation();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic stopImmediatePropagation()\n\t{\n\t\tthis._iAllowedToPropagate = false;\n\n\t\tif (this._iParentEvent)\n\t\t\tthis._iParentEvent.stopImmediatePropagation();\n\t}\n\n\t/**\n\t * Creates a copy of the MouseEvent object and sets the value of each property to match that of the original.\n\t */\n\tpublic clone():Event\n\t{\n\t\tvar result:MouseEvent = new MouseEvent(this.type);\n\n\t\t/* TODO: Debug / test - look into isDefaultPrevented\n\t\t if (isDefaultPrevented())\n\t\t result.preventDefault();\n\t\t */\n\n\t\tresult.screenX = this.screenX;\n\t\tresult.screenY = this.screenY;\n\n\t\tresult.view = this.view;\n\t\tresult.object = this.object;\n\t\tresult.materialOwner = this.materialOwner;\n\t\tresult.material = this.material;\n\t\tresult.uv = this.uv;\n\t\tresult.localPosition = this.localPosition;\n\t\tresult.localNormal = this.localNormal;\n\t\tresult.index = this.index;\n\t\tresult.subGeometryIndex = this.subGeometryIndex;\n\t\tresult.delta = this.delta;\n\n\t\tresult.ctrlKey = this.ctrlKey;\n\t\tresult.shiftKey = this.shiftKey;\n\n\t\tresult._iParentEvent = this;\n\t\tresult._iAllowedToPropagate = this._iAllowedToPropagate;\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * The position in scene space where the event took place\n\t */\n\tpublic get scenePosition():Vector3D\n\t{\n\t\treturn this.object.sceneTransform.transformVector(this.localPosition);\n\t}\n\n\t/**\n\t * The normal in scene space where the event took place\n\t */\n\tpublic get sceneNormal():Vector3D\n\t{\n\t\tvar sceneNormal:Vector3D = this.object.sceneTransform.deltaTransformVector(this.localNormal);\n\t\tsceneNormal.normalize();\n\n\t\treturn sceneNormal;\n\t}\n}\n\nexport = MouseEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass ParserEvent extends Event\n{\n\tprivate _message:string;\n\n\t/**\n\t * Dispatched when parsing of an asset completed.\n\t */\n\tpublic static PARSE_COMPLETE:string = 'parseComplete';\n\n\t/**\n\t * Dispatched when an error occurs while parsing the data (e.g. because it's\n\t * incorrectly formatted.)\n\t */\n\tpublic static PARSE_ERROR:string = 'parseError';\n\n\n\t/**\n\t * Dispatched when a parser is ready to have dependencies retrieved and resolved.\n\t * This is an internal event that should rarely (if ever) be listened for by\n\t * external classes.\n\t */\n\tpublic static READY_FOR_DEPENDENCIES:string = 'readyForDependencies';\n\n\n\tconstructor(type:string, message:string = '')\n\t{\n\t\tsuper(type);\n\n\t\tthis._message = message;\n\t}\n\n\n\t/**\n\t * Additional human-readable message. Usually supplied for ParserEvent.PARSE_ERROR events.\n\t */\n\tpublic get message():string\n\t{\n\t\treturn this._message;\n\t}\n\n\n\tpublic clone():Event\n\t{\n\t\treturn new ParserEvent(this.type, this.message);\n\t}\n}\n\nexport = ParserEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass ProgressEvent extends Event\n{\n\tpublic static PROGRESS:string = \"progress\";\n\n\tpublic bytesLoaded:number;\n\n\tpublic bytesTotal:number;\n\n\tconstructor(type:string)\n\t{\n\t\tsuper(type);\n\t}\n}\n\nexport = ProgressEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\nimport IProjection\t\t\t\t= require(\"awayjs-core/lib/projections/IProjection\");\n\nclass ProjectionEvent extends Event\n{\n\tpublic static MATRIX_CHANGED:string = \"matrixChanged\";\n\n\tprivate _projection:IProjection;\n\n\tconstructor(type:string, projection:IProjection)\n\t{\n\t\tsuper(type);\n\t\tthis._projection = projection;\n\t}\n\n\tpublic get projection():IProjection\n\t{\n\t\treturn this._projection;\n\t}\n}\n\nexport = ProjectionEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass RendererEvent extends Event\n{\n\tpublic static VIEWPORT_UPDATED:string = \"viewportUpdated\";\n\tpublic static SCISSOR_UPDATED:string = \"scissorUpdated\";\n\n\tconstructor(type:string)\n\t{\n\t\tsuper(type);\n\t}\n}\n\nexport = RendererEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass ResizeEvent extends Event\n{\n\tpublic static RESIZE:string = \"resize\";\n\n\tprivate _oldHeight:number;\n\tprivate _oldWidth:number;\n\n\tconstructor(type:string, oldHeight:number = NaN, oldWidth:number = NaN)\n\t{\n\t\tsuper(type);\n\n\t\tthis._oldHeight = oldHeight;\n\t\tthis._oldWidth = oldWidth;\n\t}\n\n\tpublic get oldHeight():number\n\t{\n\t\treturn this._oldHeight;\n\t}\n\n\tpublic get oldWidth():number\n\t{\n\t\treturn this._oldWidth;\n\t}\n}\n\nexport = ResizeEvent;", + "import DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass SceneEvent extends Event\n{\n\t/**\n\t *\n\t */\n\tpublic static ADDED_TO_SCENE:string = \"addedToScene\";\n\n\t/**\n\t *\n\t */\n\tpublic static REMOVED_FROM_SCENE:string = \"removedFromScene\";\n\n\t/**\n\t *\n\t */\n\tpublic static PARTITION_CHANGED:string = \"partitionChanged\";\n\n\t/**\n\t *\n\t */\n\tpublic displayObject:DisplayObject;\n\n\tconstructor(type:string, displayObject:DisplayObject)\n\t{\n\t\tsuper(type);\n\n\t\tthis.displayObject = displayObject;\n\t}\n}\n\nexport = SceneEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass StageEvent extends Event\n{\n\tpublic static CONTEXT_CREATED:string = \"contextCreated\";\n\tpublic static CONTEXT_DISPOSED:string = \"contextDisposed\";\n\tpublic static CONTEXT_RECREATED:string = \"contextRecreated\";\n\tpublic static VIEWPORT_UPDATED:string = \"viewportUpdated\";\n\n\tconstructor(type:string)\n\t{\n\t\tsuper(type);\n\t}\n}\n\nexport = StageEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\n/**\n * Dispatched to notify changes in a sub geometry object's state.\n *\n * @class away.events.SubGeometryEvent\n * @see away.core.base.Geometry\n */\nclass SubGeometryEvent extends Event\n{\n\t/**\n\t * Dispatched when a TriangleSubGeometry's index data has been updated.\n\t */\n\tpublic static INDICES_UPDATED:string = \"indicesUpdated\";\n\n\t/**\n\t * Dispatched when a TriangleSubGeometry's vertex data has been updated.\n\t */\n\tpublic static VERTICES_UPDATED:string = \"verticesUpdated\";\n\n\tprivate _dataType:string;\n\n\t/**\n\t * Create a new GeometryEvent\n\t * @param type The event type.\n\t * @param dataType An optional data type of the vertex data being updated.\n\t */\n\tconstructor(type:string, dataType:string = \"\")\n\t{\n\t\tsuper(type);\n\n\t\tthis._dataType = dataType;\n\t}\n\n\t/**\n\t * The data type of the vertex data.\n\t */\n\tpublic get dataType():string\n\t{\n\t\treturn this._dataType;\n\t}\n\n\t/**\n\t * Clones the event.\n\t *\n\t * @return An exact duplicate of the current object.\n\t */\n\tpublic clone():Event\n\t{\n\t\treturn new SubGeometryEvent(this.type, this._dataType);\n\t}\n}\n\nexport = SubGeometryEvent;", + "import Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\n\nclass TimerEvent extends Event\n{\n\n\tpublic static TIMER:string = \"timer\";\n\tpublic static TIMER_COMPLETE:string = \"timerComplete\";\n\n\tconstructor(type:string)\n\t{\n\t\tsuper(type);\n\n\t}\n}\n\nexport = TimerEvent", + "import View\t\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/View\");\nimport DisplayObject\t\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport PickingCollisionVO\t\t\t= require(\"awayjs-core/lib/core/pick/PickingCollisionVO\");\nimport AwayMouseEvent\t\t\t\t= require(\"awayjs-core/lib/events/MouseEvent\");\n\n/**\n * MouseManager enforces a singleton pattern and is not intended to be instanced.\n * it provides a manager class for detecting mouse hits on scene objects and sending out mouse events.\n */\nclass MouseManager\n{\n\tprivate static _instance:MouseManager;\n\n\tprivate _viewLookup:Array = new Array();\n\n\tpublic _iActiveDiv:HTMLDivElement;\n\tpublic _iUpdateDirty:boolean;\n\tpublic _iCollidingObject:PickingCollisionVO;\n\t\n\tprivate _nullVector:Vector3D = new Vector3D();\n\tprivate _previousCollidingObject:PickingCollisionVO;\n\tprivate _queuedEvents:Array = new Array();\n\n\tprivate _mouseMoveEvent:MouseEvent;\n\n\tprivate _mouseUp:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_UP);\n\tprivate _mouseClick:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.CLICK);\n\tprivate _mouseOut:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_OUT);\n\tprivate _mouseDown:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_DOWN);\n\tprivate _mouseMove:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_MOVE);\n\tprivate _mouseOver:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_OVER);\n\tprivate _mouseWheel:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_WHEEL);\n\tprivate _mouseDoubleClick:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.DOUBLE_CLICK);\n\n\tprivate onClickDelegate:(event:MouseEvent) => void;\n\tprivate onDoubleClickDelegate:(event:MouseEvent) => void;\n\tprivate onMouseDownDelegate:(event:MouseEvent) => void;\n\tprivate onMouseMoveDelegate:(event:MouseEvent) => void;\n\tprivate onMouseUpDelegate:(event:MouseEvent) => void;\n\tprivate onMouseWheelDelegate:(event:MouseEvent) => void;\n\tprivate onMouseOverDelegate:(event:MouseEvent) => void;\n\tprivate onMouseOutDelegate:(event:MouseEvent) => void;\n\n\t/**\n\t * Creates a new MouseManager object.\n\t */\n\tconstructor()\n\t{\n\t\tthis.onClickDelegate = (event:MouseEvent) => this.onClick(event);\n\t\tthis.onDoubleClickDelegate = (event:MouseEvent) => this.onDoubleClick(event);\n\t\tthis.onMouseDownDelegate = (event:MouseEvent) => this.onMouseDown(event);\n\t\tthis.onMouseMoveDelegate = (event:MouseEvent) => this.onMouseMove(event);\n\t\tthis.onMouseUpDelegate = (event:MouseEvent) => this.onMouseUp(event);\n\t\tthis.onMouseWheelDelegate = (event:MouseEvent) => this.onMouseWheel(event);\n\t\tthis.onMouseOverDelegate = (event:MouseEvent) => this.onMouseOver(event);\n\t\tthis.onMouseOutDelegate = (event:MouseEvent) => this.onMouseOut(event);\n\t}\n\n\tpublic static getInstance():MouseManager\n\t{\n\t\tif (this._instance)\n\t\t\treturn this._instance;\n\n\t\treturn (this._instance = new MouseManager());\n\t}\n\n\tpublic fireMouseEvents(forceMouseMove:boolean)\n\t{\n\t\t // If colliding object has changed, queue over/out events.\n\t\tif (this._iCollidingObject != this._previousCollidingObject) {\n\t\t\tif (this._previousCollidingObject)\n\t\t\t\tthis.queueDispatch(this._mouseOut, this._mouseMoveEvent, this._previousCollidingObject);\n\n\t\t\tif (this._iCollidingObject)\n\t\t\t\tthis.queueDispatch(this._mouseOver, this._mouseMoveEvent);\n\t\t}\n\n\t\t // Fire mouse move events here if forceMouseMove is on.\n\t\tif (forceMouseMove && this._iCollidingObject)\n\t\t\tthis.queueDispatch( this._mouseMove, this._mouseMoveEvent);\n\n\t\tvar event:AwayMouseEvent;\n\t\tvar dispatcher:DisplayObject;\n\n\t\t // Dispatch all queued events.\n\t\tvar len:number = this._queuedEvents.length;\n\t\tfor (var i:number = 0; i < len; ++i) {\n\t\t\t// Only dispatch from first implicitly enabled object ( one that is not a child of a mouseChildren = false hierarchy ).\n\t\t\tevent = this._queuedEvents[i];\n\t\t\tdispatcher = event.object;\n\n\t\t\twhile (dispatcher && !dispatcher._iIsMouseEnabled())\n\t\t\t\tdispatcher = dispatcher.parent;\n\n\t\t\tif (dispatcher)\n\t\t\t\tdispatcher.dispatchEvent(event);\n\t\t}\n\n\t\tthis._queuedEvents.length = 0;\n\n\t\tthis._previousCollidingObject = this._iCollidingObject;\n\n\t\tthis._iUpdateDirty = false;\n\t}\n\n//\t\tpublic addViewLayer(view:View)\n//\t\t{\n//\t\t\tvar stg:Stage = view.stage;\n//\n//\t\t\t// Add instance to mouse3dmanager to fire mouse events for multiple views\n//\t\t\tif (!view.stageGL.mouse3DManager)\n//\t\t\t\tview.stageGL.mouse3DManager = this;\n//\n//\t\t\tif (!hasKey(view))\n//\t\t\t\t_view3Ds[view] = 0;\n//\n//\t\t\t_childDepth = 0;\n//\t\t\ttraverseDisplayObjects(stg);\n//\t\t\t_viewCount = _childDepth;\n//\t\t}\n\n\tpublic registerView(view:View)\n\t{\n\t\tview.htmlElement.addEventListener(\"click\", this.onClickDelegate);\n\t\tview.htmlElement.addEventListener(\"dblclick\", this.onDoubleClickDelegate);\n\t\tview.htmlElement.addEventListener(\"mousedown\", this.onMouseDownDelegate);\n\t\tview.htmlElement.addEventListener(\"mousemove\", this.onMouseMoveDelegate);\n\t\tview.htmlElement.addEventListener(\"mouseup\", this.onMouseUpDelegate);\n\t\tview.htmlElement.addEventListener(\"mousewheel\", this.onMouseWheelDelegate);\n\t\tview.htmlElement.addEventListener(\"mouseover\", this.onMouseOverDelegate);\n\t\tview.htmlElement.addEventListener(\"mouseout\", this.onMouseOutDelegate);\n\n\t\tthis._viewLookup.push(view);\n\t}\n\n\tpublic unregisterView(view:View)\n\t{\n\t\tview.htmlElement.removeEventListener(\"click\", this.onClickDelegate);\n\t\tview.htmlElement.removeEventListener(\"dblclick\", this.onDoubleClickDelegate);\n\t\tview.htmlElement.removeEventListener(\"mousedown\", this.onMouseDownDelegate);\n\t\tview.htmlElement.removeEventListener(\"mousemove\", this.onMouseMoveDelegate);\n\t\tview.htmlElement.removeEventListener(\"mouseup\", this.onMouseUpDelegate);\n\t\tview.htmlElement.removeEventListener(\"mousewheel\", this.onMouseWheelDelegate);\n\t\tview.htmlElement.removeEventListener(\"mouseover\", this.onMouseOverDelegate);\n\t\tview.htmlElement.removeEventListener(\"mouseout\", this.onMouseOutDelegate);\n\n\t\tthis._viewLookup.slice(this._viewLookup.indexOf(view), 1);\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Private.\n\t// ---------------------------------------------------------------------\n\n\tprivate queueDispatch(event:AwayMouseEvent, sourceEvent:MouseEvent, collider:PickingCollisionVO = null)\n\t{\n\t\t// 2D properties.\n\t\tif (sourceEvent) {\n\t\t\tevent.ctrlKey = sourceEvent.ctrlKey;\n\t\t\tevent.altKey = sourceEvent.altKey;\n\t\t\tevent.shiftKey = sourceEvent.shiftKey;\n\t\t\tevent.screenX = sourceEvent.clientX;\n\t\t\tevent.screenY = sourceEvent.clientY;\n\t\t}\n\n\t\tif (collider == null)\n\t\t\tcollider = this._iCollidingObject;\n\n\t\t// 3D properties.\n\t\tif (collider) {\n\t\t\t// Object.\n\t\t\tevent.object = collider.displayObject;\n\t\t\tevent.materialOwner = collider.materialOwner;\n\t\t\t// UV.\n\t\t\tevent.uv = collider.uv;\n\t\t\t// Position.\n\t\t\tevent.localPosition = collider.localPosition? collider.localPosition.clone() : null;\n\t\t\t// Normal.\n\t\t\tevent.localNormal = collider.localNormal? collider.localNormal.clone() : null;\n\t\t\t// Face index.\n\t\t\tevent.index = collider.index;\n\t\t} else {\n\t\t\t// Set all to null.\n\t\t\tevent.uv = null;\n\t\t\tevent.object = null;\n\t\t\tevent.localPosition = this._nullVector;\n\t\t\tevent.localNormal = this._nullVector;\n\t\t\tevent.index = 0;\n\t\t\tevent.subGeometryIndex = 0;\n\t\t}\n\n\t\t// Store event to be dispatched later.\n\t\tthis._queuedEvents.push(event);\n\t}\n\n\t// ---------------------------------------------------------------------\n\t// Listeners.\n\t// ---------------------------------------------------------------------\n\n\tprivate onMouseMove(event:MouseEvent)\n\t{\n\t\tthis.updateColliders(event);\n\n\t\tif (this._iCollidingObject)\n\t\t\tthis.queueDispatch(this._mouseMove, this._mouseMoveEvent = event);\n\t}\n\n\tprivate onMouseOut(event:MouseEvent)\n\t{\n\t\tthis._iActiveDiv = null;\n\n\t\tthis.updateColliders(event);\n\n\t\tif (this._iCollidingObject)\n\t\t\tthis.queueDispatch(this._mouseOut, event);\n\t}\n\n\tprivate onMouseOver(event:MouseEvent)\n\t{\n\t\tthis._iActiveDiv = event.target;\n\n\t\tthis.updateColliders(event);\n\n\t\tif (this._iCollidingObject)\n\t\t\tthis.queueDispatch( this._mouseOver, event);\n\t}\n\n\tprivate onClick(event:MouseEvent)\n\t{\n\t\tthis.updateColliders(event);\n\n\t\tif (this._iCollidingObject)\n\t\t\tthis.queueDispatch(this._mouseClick, event);\n\t}\n\n\tprivate onDoubleClick(event:MouseEvent)\n\t{\n\t\tthis.updateColliders(event);\n\n\t\tif (this._iCollidingObject)\n\t\t\tthis.queueDispatch(this._mouseDoubleClick, event);\n\t}\n\n\tprivate onMouseDown(event:MouseEvent)\n\t{\n\t\tthis._iActiveDiv = event.target;\n\n\t\tthis.updateColliders(event);\n\n\t\tif (this._iCollidingObject)\n\t\t\tthis.queueDispatch(this._mouseDown, event);\n\t}\n\n\tprivate onMouseUp(event:MouseEvent)\n\t{\n\t\tthis.updateColliders(event);\n\n\t\tif (this._iCollidingObject)\n\t\t\tthis.queueDispatch(this._mouseUp , event);\n\t}\n\n\tprivate onMouseWheel(event:MouseEvent)\n\t{\n\t\tthis.updateColliders(event);\n\n\t\tif (this._iCollidingObject)\n\t\t\tthis.queueDispatch(this._mouseWheel, event);\n\t}\n\n\n\tprivate updateColliders(event:MouseEvent)\n\t{\n\t\tif (this._iUpdateDirty)\n\t\t\treturn;\n\n\t\tvar view:View;\n\t\tvar bounds:ClientRect;\n\t\tvar mouseX:number = event.clientX;\n\t\tvar mouseY:number = event.clientY;\n\t\tvar len:number = this._viewLookup.length;\n\t\tfor (var i:number = 0; i < len; i++) {\n\t\t\tview = this._viewLookup[i];\n\t\t\tbounds = view.htmlElement.getBoundingClientRect();\n\t\t\tif (mouseX < bounds.left || mouseX > bounds.right || mouseY < bounds.top || mouseY > bounds.bottom) {\n\t\t\t\tview._pMouseX = null;\n\t\t\t\tview._pMouseY = null;\n\t\t\t} else {\n\t\t\t\tview._pMouseX = mouseX + bounds.left;\n\t\t\t\tview._pMouseY = mouseY + bounds.top;\n\t\t\t\tview.updateCollider();\n\n\t\t\t\tif (view.layeredView && this._iCollidingObject)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tthis._iUpdateDirty = true;\n\t}\n}\n\nexport = MouseManager;", + "import MaterialBase\t\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\nimport ImageTexture\t\t\t\t\t= require(\"awayjs-core/lib/textures/ImageTexture\");\nimport Texture2DBase\t\t\t\t= require(\"awayjs-core/lib/textures/Texture2DBase\");\n\n/**\n * MaterialBase forms an abstract base class for any material.\n * A material consists of several passes, each of which constitutes at least one render call. Several passes could\n * be used for special effects (render lighting for many lights in several passes, render an outline in a separate\n * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space\n * subsurface scattering, or rendering a depth map for specialized self-shadowing).\n *\n * Away3D provides default materials trough SinglePassMaterialBase and MultiPassMaterialBase, which use modular\n * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom\n * shaders, or entire new material frameworks.\n */\nclass CSSMaterialBase extends MaterialBase\n{\n\tprivate _imageElement:HTMLImageElement;\n\tprivate _imageStyle:MSStyleCSSProperties;\n\n\n\tpublic get imageElement():HTMLImageElement\n\t{\n\t\treturn this._imageElement;\n\t}\n\n\tpublic get imageStyle():MSStyleCSSProperties\n\t{\n\t\treturn this._imageStyle;\n\t}\n\n\t/**\n\t * The texture object to use for the albedo colour.\n\t */\n\tpublic get texture():Texture2DBase\n\t{\n\t\treturn this._pTexture;\n\t}\n\n\tpublic set texture(value:Texture2DBase)\n\t{\n\t\tif (this._pTexture == value)\n\t\t\treturn;\n\n\t\tthis._pTexture = value;\n\n\t\tif (value instanceof ImageTexture) {\n\t\t\tthis._imageElement = ( value).htmlImageElement;\n\n\t\t\tvar node:HTMLStyleElement = document.createElement(\"style\");\n\t\t\tnode.type = \"text/css\";\n\t\t\tdocument.getElementsByTagName(\"head\")[0].appendChild(node);\n\n\t\t\tvar sheet:CSSStyleSheet = document.styleSheets[document.styleSheets.length - 1];\n\t\t\tsheet.insertRule(\".material\" + this.id + \"{ }\", 0);\n\t\t\tvar style:MSStyleCSSProperties = ( sheet.cssRules[0]).style;\n\n\t\t\tstyle.backgroundImage = \"url(\" + this._imageElement.src + \")\";\n\t\t\tstyle.backgroundSize = \"100% 100%\";\n\t\t\tstyle.position = \"absolute\";\n\t\t\tstyle.width = this._imageElement.width + \"px\";\n\t\t\tstyle.height = this._imageElement.height + \"px\";\n\t\t\tstyle.transformOrigin\n\t\t\t\t= style[\"-webkit-transform-origin\"]\n\t\t\t\t= style[\"-moz-transform-origin\"]\n\t\t\t\t= style[\"-o-transform-origin\"]\n\t\t\t\t= style[\"-ms-transform-origin\"] = \"0% 0%\";\n\n\t\t\tthis._pHeight = this._imageElement.height;\n\t\t\tthis._pWidth = this._imageElement.width;\n\n\t\t\tthis._pNotifySizeChanged();\n\t\t}\n\t}\n\n\t/**\n\t * Creates a new MaterialBase object.\n\t */\n\tconstructor(texture:Texture2DBase = null, smooth:boolean = true, repeat:boolean = false)\n\t{\n\t\tsuper();\n\n\t\tthis._iMaterialId = Number(this.id);\n\n\t\tthis.texture = texture;\n\n\t\tthis.smooth = smooth;\n\t\tthis.repeat = repeat;\n\t}\n}\n\nexport = CSSMaterialBase;", + "/**\n * Enumeration class for defining which lighting types affect the specific material\n * lighting component (diffuse and specular). This can be useful if, for example, you\n * want to use light probes for diffuse global lighting, but want specular reflections from\n * traditional light sources without those affecting the diffuse light.\n *\n * @see away.materials.ColorMaterial.diffuseLightSources\n * @see away.materials.ColorMaterial.specularLightSources\n * @see away.materials.TextureMaterial.diffuseLightSources\n * @see away.materials.TextureMaterial.specularLightSources\n */\nclass LightSources\n{\n\t/**\n\t * Defines normal lights are to be used as the source for the lighting\n\t * component.\n\t */\n\tpublic static LIGHTS:number = 0x01;\n\n\t/**\n\t * Defines that global lighting probes are to be used as the source for the\n\t * lighting component.\n\t */\n\tpublic static PROBES:number = 0x02;\n\n\t/**\n\t * Defines that both normal and global lighting probes are to be used as the\n\t * source for the lighting component. This is equivalent to LightSources.LIGHTS | LightSources.PROBES.\n\t */\n\tpublic static ALL:number = 0x03;\n}\n\nexport = LightSources;", + "import IAnimationSet\t\t\t= require(\"awayjs-core/lib/animators/IAnimationSet\");\nimport IAnimator\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimator\");\nimport BlendMode\t\t\t\t= require(\"awayjs-core/lib/core/base/BlendMode\");\nimport IMaterialOwner\t\t\t= require(\"awayjs-core/lib/core/base/IMaterialOwner\");\nimport IStage\t\t\t\t\t= require(\"awayjs-core/lib/core/base/IStage\");\nimport Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport IRenderable\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport IMaterialData\t\t\t= require(\"awayjs-core/lib/core/pool/IMaterialData\");\nimport IMaterialPassData\t\t= require(\"awayjs-core/lib/core/pool/IMaterialPassData\");\nimport Camera\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport Event\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\nimport MaterialEvent\t\t\t= require(\"awayjs-core/lib/events/MaterialEvent\");\nimport LightPickerBase\t\t\t= require(\"awayjs-core/lib/materials/lightpickers/LightPickerBase\");\nimport IMaterialPass\t\t\t= require(\"awayjs-core/lib/materials/passes/IMaterialPass\");\nimport Texture2DBase\t\t\t= require(\"awayjs-core/lib/textures/Texture2DBase\");\n\n\n/**\n * MaterialBase forms an abstract base class for any material.\n * A material consists of several passes, each of which constitutes at least one render call. Several passes could\n * be used for special effects (render lighting for many lights in several passes, render an outline in a separate\n * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space\n * subsurface scattering, or rendering a depth map for specialized self-shadowing).\n *\n * Away3D provides default materials trough SinglePassMaterialBase and TriangleMaterial, which use modular\n * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom\n * shaders, or entire new material frameworks.\n */\nclass MaterialBase extends NamedAssetBase implements IAsset\n{\n\tprivate _sizeChanged:MaterialEvent;\n\tprivate _materialPassData:Array = new Array();\n\tprivate _materialData:Array = new Array();\n\n\tpublic _pAlphaThreshold:number = 0;\n\tpublic _pAnimateUVs:boolean = false;\n\tprivate _enableLightFallOff:boolean = true;\n\tprivate _specularLightSources:number = 0x01;\n\tprivate _diffuseLightSources:number = 0x03;\n\n\t/**\n\t * An object to contain any extra data.\n\t */\n\tpublic extra:Object;\n\n\t/**\n\t * A value that can be used by materials that only work with a given type of renderer. The renderer can test the\n\t * classification to choose which render path to use. For example, a deferred material could set this value so\n\t * that the deferred renderer knows not to take the forward rendering path.\n\t *\n\t * @private\n\t */\n\tpublic _iClassification:string;\n\n\n\t/**\n\t * An id for this material used to sort the renderables by shader program, which reduces Program state changes.\n\t *\n\t * @private\n\t */\n\tpublic _iMaterialId:number = 0;\n\n\tpublic _iBaseScreenPassIndex:number = 0;\n\n\tprivate _bothSides:boolean = false; // update\n\tprivate _animationSet:IAnimationSet;\n\tpublic _pScreenPassesInvalid:boolean = true;\n\n\t/**\n\t * A list of material owners, renderables or custom Entities.\n\t */\n\tprivate _owners:Array;\n\n\tprivate _alphaPremultiplied:boolean;\n\n\tpublic _pBlendMode:string = BlendMode.NORMAL;\n\n\tprivate _numPasses:number = 0;\n\tprivate _passes:Array;\n\n\tprivate _mipmap:boolean = false;\n\tprivate _smooth:boolean = true;\n\tprivate _repeat:boolean = false;\n\tprivate _color:number = 0xFFFFFF;\n\tpublic _pTexture:Texture2DBase;\n\n\tpublic _pLightPicker:LightPickerBase;\n\n\tpublic _pHeight:number = 1;\n\tpublic _pWidth:number = 1;\n\tpublic _pRequiresBlending:boolean = false;\n\n\tprivate _onPassChangeDelegate:(event:Event) => void;\n\tprivate _onLightChangeDelegate:(event:Event) => void;\n\n\t/**\n\t * Creates a new MaterialBase object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._iMaterialId = Number(this.id);\n\n\t\tthis._owners = new Array();\n\t\tthis._passes = new Array();\n\n\t\tthis._onPassChangeDelegate = (event:Event) => this.onPassChange(event);\n\t\tthis._onLightChangeDelegate = (event:Event) => this.onLightsChange(event);\n\n\t\tthis.alphaPremultiplied = false; //TODO: work out why this is different for WebGL\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.MATERIAL;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._pHeight;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get animationSet():IAnimationSet\n\t{\n\t\treturn this._animationSet;\n\t}\n\n\n\t/**\n\t * The light picker used by the material to provide lights to the material if it supports lighting.\n\t *\n\t * @see LightPickerBase\n\t * @see StaticLightPicker\n\t */\n\tpublic get lightPicker():LightPickerBase\n\t{\n\t\treturn this._pLightPicker;\n\t}\n\n\tpublic set lightPicker(value:LightPickerBase)\n\t{\n\t\tif (this._pLightPicker == value)\n\t\t\treturn;\n\n\t\tif (this._pLightPicker)\n\t\t\tthis._pLightPicker.removeEventListener(Event.CHANGE, this._onLightChangeDelegate);\n\n\t\tthis._pLightPicker = value;\n\n\t\tif (this._pLightPicker)\n\t\t\tthis._pLightPicker.addEventListener(Event.CHANGE, this._onLightChangeDelegate);\n\n\t\tthis._pInvalidateScreenPasses();\n\t}\n\n\t/**\n\t * Indicates whether or not any used textures should use mipmapping. Defaults to true.\n\t */\n\tpublic get mipmap():boolean\n\t{\n\t\treturn this._mipmap;\n\t}\n\n\tpublic set mipmap(value:boolean)\n\t{\n\t\tif (this._mipmap == value)\n\t\t\treturn;\n\n\t\tthis._mipmap = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * Indicates whether or not any used textures should use smoothing.\n\t */\n\tpublic get smooth():boolean\n\t{\n\t\treturn this._smooth;\n\t}\n\n\tpublic set smooth(value:boolean)\n\t{\n\t\tif (this._smooth == value)\n\t\t\treturn;\n\n\t\tthis._smooth = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * Indicates whether or not any used textures should be tiled. If set to false, texture samples are clamped to\n\t * the texture's borders when the uv coordinates are outside the [0, 1] interval.\n\t */\n\tpublic get repeat():boolean\n\t{\n\t\treturn this._repeat;\n\t}\n\n\tpublic set repeat(value:boolean)\n\t{\n\t\tif (this._repeat == value)\n\t\t\treturn;\n\n\t\tthis._repeat = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * The diffuse reflectivity color of the surface.\n\t */\n\tpublic get color():number\n\t{\n\t\treturn this._color;\n\t}\n\n\tpublic set color(value:number)\n\t{\n\t\tif (this._color == value)\n\t\t\treturn;\n\n\t\tthis._color = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * The texture object to use for the albedo colour.\n\t */\n\tpublic get texture():Texture2DBase\n\t{\n\t\treturn this._pTexture;\n\t}\n\n\tpublic set texture(value:Texture2DBase)\n\t{\n\t\tif (this._pTexture == value)\n\t\t\treturn;\n\n\t\tthis._pTexture = value;\n\n\t\tthis._pInvalidatePasses();\n\n\t\tthis._pHeight = this._pTexture.height;\n\t\tthis._pWidth = this._pTexture.width;\n\n\t\tthis._pNotifySizeChanged();\n\t}\n\n\t/**\n\t * Specifies whether or not the UV coordinates should be animated using a transformation matrix.\n\t */\n\tpublic get animateUVs():boolean\n\t{\n\t\treturn this._pAnimateUVs;\n\t}\n\n\tpublic set animateUVs(value:boolean)\n\t{\n\t\tif (this._pAnimateUVs == value)\n\t\t\treturn;\n\n\t\tthis._pAnimateUVs = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * Whether or not to use fallOff and radius properties for lights. This can be used to improve performance and\n\t * compatibility for constrained mode.\n\t */\n\tpublic get enableLightFallOff():boolean\n\t{\n\t\treturn this._enableLightFallOff;\n\t}\n\n\tpublic set enableLightFallOff(value:boolean)\n\t{\n\t\tif (this._enableLightFallOff == value)\n\t\t\treturn;\n\n\t\tthis._enableLightFallOff = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * Define which light source types to use for diffuse reflections. This allows choosing between regular lights\n\t * and/or light probes for diffuse reflections.\n\t *\n\t * @see away3d.materials.LightSources\n\t */\n\tpublic get diffuseLightSources():number\n\t{\n\t\treturn this._diffuseLightSources;\n\t}\n\n\tpublic set diffuseLightSources(value:number)\n\t{\n\t\tif (this._diffuseLightSources == value)\n\t\t\treturn;\n\n\t\tthis._diffuseLightSources = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * Define which light source types to use for specular reflections. This allows choosing between regular lights\n\t * and/or light probes for specular reflections.\n\t *\n\t * @see away3d.materials.LightSources\n\t */\n\tpublic get specularLightSources():number\n\t{\n\t\treturn this._specularLightSources;\n\t}\n\n\tpublic set specularLightSources(value:number)\n\t{\n\t\tif (this._specularLightSources == value)\n\t\t\treturn;\n\n\t\tthis._specularLightSources = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * Cleans up resources owned by the material, including passes. Textures are not owned by the material since they\n\t * could be used by other materials and will not be disposed.\n\t */\n\tpublic dispose()\n\t{\n\t\tvar i:number;\n\t\tvar len:number;\n\n\t\tthis._pClearScreenPasses();\n\n\t\tlen = this._materialData.length;\n\t\tfor (i = 0; i < len; i++)\n\t\t\tthis._materialData[i].dispose();\n\n\t\tthis._materialData = new Array();\n\n\t\tlen = this._materialPassData.length;\n\t\tfor (i = 0; i < len; i++)\n\t\t\tthis._materialPassData[i].dispose();\n\n\t\tthis._materialPassData = new Array();\n\t}\n\n\t/**\n\t * Defines whether or not the material should cull triangles facing away from the camera.\n\t */\n\tpublic get bothSides():boolean\n\t{\n\t\treturn this._bothSides;\n\t}\n\n\tpublic set bothSides(value:boolean)\n\t{\n\t\tif (this._bothSides = value)\n\t\t\treturn;\n\n\t\tthis._bothSides = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * The blend mode to use when drawing this renderable. The following blend modes are supported:\n\t *
    \n\t *
  • BlendMode.NORMAL: No blending, unless the material inherently needs it
  • \n\t *
  • BlendMode.LAYER: Force blending. This will draw the object the same as NORMAL, but without writing depth writes.
  • \n\t *
  • BlendMode.MULTIPLY
  • \n\t *
  • BlendMode.ADD
  • \n\t *
  • BlendMode.ALPHA
  • \n\t *
\n\t */\n\tpublic get blendMode():string\n\t{\n\t\treturn this._pBlendMode;\n\t}\n\n\tpublic set blendMode(value:string)\n\t{\n\t\tif (this._pBlendMode == value)\n\t\t\treturn;\n\n\t\tthis._pBlendMode = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * Indicates whether visible textures (or other pixels) used by this material have\n\t * already been premultiplied. Toggle this if you are seeing black halos around your\n\t * blended alpha edges.\n\t */\n\tpublic get alphaPremultiplied():boolean\n\t{\n\t\treturn this._alphaPremultiplied;\n\t}\n\n\tpublic set alphaPremultiplied(value:boolean)\n\t{\n\t\tif (this._alphaPremultiplied == value)\n\t\t\treturn;\n\n\t\tthis._alphaPremultiplied = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either\n\t * invisible or entirely opaque, often used with textures for foliage, etc.\n\t * Recommended values are 0 to disable alpha, or 0.5 to create smooth edges. Default value is 0 (disabled).\n\t */\n\tpublic get alphaThreshold():number\n\t{\n\t\treturn this._pAlphaThreshold;\n\t}\n\n\tpublic set alphaThreshold(value:number)\n\t{\n\t\tif (value < 0)\n\t\t\tvalue = 0;\n\t\telse if (value > 1)\n\t\t\tvalue = 1;\n\n\t\tif (this._pAlphaThreshold == value)\n\t\t\treturn;\n\n\t\tthis._pAlphaThreshold = value;\n\n\t\tthis._pInvalidatePasses();\n\t}\n\n\t/**\n\t * Indicates whether or not the material requires alpha blending during rendering.\n\t */\n\tpublic get requiresBlending():boolean\n\t{\n\t\treturn this._pRequiresBlending;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get width():number\n\t{\n\t\treturn this._pWidth;\n\t}\n\n\t/**\n\t * Sets the render state for a pass that is independent of the rendered object. This needs to be called before\n\t * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated.\n\t * @param pass The pass data to activate.\n\t * @param stage The Stage object which is currently used for rendering.\n\t * @param camera The camera from which the scene is viewed.\n\t * @private\n\t */\n\tpublic _iActivatePass(pass:IMaterialPassData, stage:IStage, camera:Camera) // ARCANE\n\t{\n\t\tpass.materialPass._iActivate(pass, stage, camera);\n\t}\n\n\t/**\n\t * Clears the render state for a pass. This needs to be called before activating another pass.\n\t * @param pass The pass to deactivate.\n\t * @param stage The Stage used for rendering\n\t *\n\t * @internal\n\t */\n\tpublic _iDeactivatePass(pass:IMaterialPassData, stage:IStage) // ARCANE\n\t{\n\t\tpass.materialPass._iDeactivate(pass, stage);\n\t}\n\n\t/**\n\t * Renders the current pass. Before calling renderPass, activatePass needs to be called with the same index.\n\t * @param pass The pass used to render the renderable.\n\t * @param renderable The IRenderable object to draw.\n\t * @param stage The Stage object used for rendering.\n\t * @param entityCollector The EntityCollector object that contains the visible scene data.\n\t * @param viewProjection The view-projection matrix used to project to the screen. This is not the same as\n\t * camera.viewProjection as it includes the scaling factors when rendering to textures.\n\t *\n\t * @internal\n\t */\n\tpublic _iRenderPass(pass:IMaterialPassData, renderable:IRenderable, stage:IStage, camera:Camera, viewProjection:Matrix3D)\n\t{\n\t\tif (this._pLightPicker)\n\t\t\tthis._pLightPicker.collectLights(renderable);\n\n\t\tpass.materialPass._iRender(pass, renderable, stage, camera, viewProjection);\n\t}\n\n\t//\n\t// MATERIAL MANAGEMENT\n\t//\n\t/**\n\t * Mark an IMaterialOwner as owner of this material.\n\t * Assures we're not using the same material across renderables with different animations, since the\n\t * Programs depend on animation. This method needs to be called when a material is assigned.\n\t *\n\t * @param owner The IMaterialOwner that had this material assigned\n\t *\n\t * @internal\n\t */\n\tpublic iAddOwner(owner:IMaterialOwner)\n\t{\n\t\tthis._owners.push(owner);\n\n\t\tvar animationSet:IAnimationSet;\n\t\tvar animator:IAnimator = owner.animator;\n\n\t\tif (animator)\n\t\t\tanimationSet = animator.animationSet;\n\n\t\tif (owner.animator) {\n\t\t\tif (this._animationSet && animationSet != this._animationSet) {\n\t\t\t\tthrow new Error(\"A Material instance cannot be shared across material owners with different animation sets\");\n\t\t\t} else {\n\t\t\t\tif (this._animationSet != animationSet) {\n\n\t\t\t\t\tthis._animationSet = animationSet;\n\n\t\t\t\t\tthis.invalidateAnimation();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Removes an IMaterialOwner as owner.\n\t * @param owner\n\t *\n\t * @internal\n\t */\n\tpublic iRemoveOwner(owner:IMaterialOwner)\n\t{\n\t\tthis._owners.splice(this._owners.indexOf(owner), 1);\n\n\t\tif (this._owners.length == 0) {\n\t\t\tthis._animationSet = null;\n\n\t\t\tthis.invalidateAnimation();\n\t\t}\n\t}\n\n\t/**\n\t * A list of the IMaterialOwners that use this material\n\t *\n\t * @private\n\t */\n\tpublic get iOwners():Array\n\t{\n\t\treturn this._owners;\n\t}\n\n\t/**\n\t * The amount of passes used by the material.\n\t *\n\t * @private\n\t */\n\tpublic _iNumScreenPasses():number\n\t{\n\t\treturn this._numPasses;\n\t}\n\n\t/**\n\t * A list of the screen passes used in this material\n\t *\n\t * @private\n\t */\n\tpublic get _iScreenPasses():Array\n\t{\n\t\treturn this._passes;\n\t}\n\n\t/**\n\t * Marks the shader programs for all passes as invalid, so they will be recompiled before the next use.\n\t *\n\t * @private\n\t */\n\tpublic _pInvalidatePasses()\n\t{\n\t\tvar len:number = this._materialPassData.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis._materialPassData[i].invalidate();\n\n\t\tthis.invalidateMaterial();\n\t}\n\n\t/**\n\t * Flags that the screen passes have become invalid and need possible re-ordering / adding / deleting\n\t */\n\tpublic _pInvalidateScreenPasses()\n\t{\n\t\tthis._pScreenPassesInvalid = true;\n\t}\n\n\t/**\n\t * Removes a pass from the material.\n\t * @param pass The pass to be removed.\n\t */\n\tpublic _pRemoveScreenPass(pass:IMaterialPass)\n\t{\n\t\tpass.removeEventListener(Event.CHANGE, this._onPassChangeDelegate);\n\t\tthis._passes.splice(this._passes.indexOf(pass), 1);\n\n\t\tthis._numPasses--;\n\t}\n\n\t/**\n\t * Removes all passes from the material\n\t */\n\tpublic _pClearScreenPasses()\n\t{\n\t\tfor (var i:number = 0; i < this._numPasses; ++i)\n\t\t\tthis._passes[i].removeEventListener(Event.CHANGE, this._onPassChangeDelegate);\n\n\t\tthis._passes.length = this._numPasses = 0;\n\t}\n\n\t/**\n\t * Adds a pass to the material\n\t * @param pass\n\t */\n\tpublic _pAddScreenPass(pass:IMaterialPass)\n\t{\n\t\tthis._passes[this._numPasses++] = pass;\n\n\t\tpass.lightPicker = this._pLightPicker;\n\t\tpass.addEventListener(Event.CHANGE, this._onPassChangeDelegate);\n\n\t\tthis.invalidateMaterial();\n\t}\n\n\tpublic _iAddMaterialData(materialData:IMaterialData):IMaterialData\n\t{\n\t\tthis._materialData.push(materialData);\n\n\t\treturn materialData;\n\t}\n\n\tpublic _iRemoveMaterialData(materialData:IMaterialData):IMaterialData\n\t{\n\t\tthis._materialData.splice(this._materialData.indexOf(materialData), 1);\n\n\t\treturn materialData;\n\t}\n\n\t/**\n\t * Performs any processing that needs to occur before any of its passes are used.\n\t *\n\t * @private\n\t */\n\tpublic _iUpdateMaterial()\n\t{\n\t}\n\t\n\t/**\n\t * Listener for when a pass's shader code changes. It recalculates the render order id.\n\t */\n\tprivate onPassChange(event:Event)\n\t{\n\t\tthis.invalidateMaterial();\n\t}\n\n\tprivate invalidateAnimation()\n\t{\n\t\tvar len:number = this._materialData.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis._materialData[i].invalidateAnimation();\n\t}\n\t\n\tprivate invalidateMaterial()\n\t{\n\t\tvar len:number = this._materialData.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis._materialData[i].invalidateMaterial();\n\t}\n\n\t/**\n\t * Called when the light picker's configuration changed.\n\t */\n\tprivate onLightsChange(event:Event)\n\t{\n\t\tthis._pInvalidateScreenPasses();\n\t}\n\n\tpublic _pNotifySizeChanged()\n\t{\n\t\tif (!this._sizeChanged)\n\t\t\tthis._sizeChanged = new MaterialEvent(MaterialEvent.SIZE_CHANGED);\n\n\t\tthis.dispatchEvent(this._sizeChanged);\n\t}\n\n\tpublic _iAddMaterialPassData(materialPassData:IMaterialPassData):IMaterialPassData\n\t{\n\t\tthis._materialPassData.push(materialPassData);\n\n\t\treturn materialPassData;\n\t}\n\n\tpublic _iRemoveMaterialPassData(materialPassData:IMaterialPassData):IMaterialPassData\n\t{\n\t\tthis._materialPassData.splice(this._materialPassData.indexOf(materialPassData), 1);\n\n\t\treturn materialPassData;\n\t}\n}\n\nexport = MaterialBase;", + "import LightBase\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LightBase\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport AssetType\t\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport NamedAssetBase\t\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport IAsset\t\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport IRenderable\t\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport ICollector\t\t\t\t\t= require(\"awayjs-core/lib/core/traverse/ICollector\");\nimport DirectionalLight\t\t\t\t= require(\"awayjs-core/lib/entities/DirectionalLight\");\nimport LightProbe\t\t\t\t\t= require(\"awayjs-core/lib/entities/LightProbe\");\nimport PointLight\t\t\t\t\t= require(\"awayjs-core/lib/entities/PointLight\");\n\n/**\n * LightPickerBase provides an abstract base clase for light picker classes. These classes are responsible for\n * feeding materials with relevant lights. Usually, StaticLightPicker can be used, but LightPickerBase can be\n * extended to provide more application-specific dynamic selection of lights.\n *\n * @see StaticLightPicker\n */\nclass LightPickerBase extends NamedAssetBase implements IAsset\n{\n\tpublic _pNumPointLights:number = 0;\n\tpublic _pNumDirectionalLights:number = 0;\n\tpublic _pNumCastingPointLights:number = 0;\n\tpublic _pNumCastingDirectionalLights:number = 0;\n\tpublic _pNumLightProbes:number = 0;\n\n\tpublic _pAllPickedLights:Array;\n\tpublic _pPointLights:Array;\n\tpublic _pCastingPointLights:Array;\n\tpublic _pDirectionalLights:Array;\n\tpublic _pCastingDirectionalLights:Array;\n\tpublic _pLightProbes:Array;\n\tpublic _pLightProbeWeights:Array;\n\n\t/**\n\t * Creates a new LightPickerBase object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t * Disposes resources used by the light picker.\n\t */\n\tpublic dispose()\n\t{\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.LIGHT_PICKER;\n\t}\n\n\t/**\n\t * The maximum amount of directional lights that will be provided.\n\t */\n\tpublic get numDirectionalLights():number\n\t{\n\t\treturn this._pNumDirectionalLights;\n\t}\n\n\t/**\n\t * The maximum amount of point lights that will be provided.\n\t */\n\tpublic get numPointLights():number\n\t{\n\t\treturn this._pNumPointLights;\n\t}\n\n\t/**\n\t * The maximum amount of directional lights that cast shadows.\n\t */\n\tpublic get numCastingDirectionalLights():number\n\t{\n\t\treturn this._pNumCastingDirectionalLights;\n\t}\n\n\t/**\n\t * The amount of point lights that cast shadows.\n\t */\n\tpublic get numCastingPointLights():number\n\t{\n\t\treturn this._pNumCastingPointLights;\n\t}\n\n\t/**\n\t * The maximum amount of light probes that will be provided.\n\t */\n\tpublic get numLightProbes():number\n\t{\n\t\treturn this._pNumLightProbes;\n\t}\n\n\t/**\n\t * The collected point lights to be used for shading.\n\t */\n\tpublic get pointLights():Array\n\t{\n\t\treturn this._pPointLights;\n\t}\n\n\t/**\n\t * The collected directional lights to be used for shading.\n\t */\n\tpublic get directionalLights():Array\n\t{\n\t\treturn this._pDirectionalLights;\n\t}\n\n\t/**\n\t * The collected point lights that cast shadows to be used for shading.\n\t */\n\tpublic get castingPointLights():Array\n\t{\n\t\treturn this._pCastingPointLights;\n\t}\n\n\t/**\n\t * The collected directional lights that cast shadows to be used for shading.\n\t */\n\tpublic get castingDirectionalLights():Array\n\t{\n\t\treturn this._pCastingDirectionalLights;\n\t}\n\n\t/**\n\t * The collected light probes to be used for shading.\n\t */\n\tpublic get lightProbes():Array\n\t{\n\t\treturn this._pLightProbes;\n\t}\n\n\t/**\n\t * The weights for each light probe, defining their influence on the object.\n\t */\n\tpublic get lightProbeWeights():Array\n\t{\n\t\treturn this._pLightProbeWeights;\n\t}\n\n\t/**\n\t * A collection of all the collected lights.\n\t */\n\tpublic get allPickedLights():Array\n\t{\n\t\treturn this._pAllPickedLights;\n\t}\n\n\t/**\n\t * Updates set of lights for a given renderable and EntityCollector. Always call super.collectLights() after custom overridden code.\n\t */\n\tpublic collectLights(renderable:IRenderable)\n\t{\n\t\tthis.updateProbeWeights(renderable);\n\t}\n\n\t/**\n\t * Updates the weights for the light probes, based on the renderable's position relative to them.\n\t * @param renderable The renderble for which to calculate the light probes' influence.\n\t */\n\tprivate updateProbeWeights(renderable:IRenderable)\n\t{\n\t\t// todo: this will cause the same calculations to occur per TriangleSubMesh. See if this can be improved.\n\t\tvar objectPos:Vector3D = renderable.sourceEntity.scenePosition;\n\t\tvar lightPos:Vector3D;\n\n\t\tvar rx:number = objectPos.x, ry:number = objectPos.y, rz:number = objectPos.z;\n\t\tvar dx:number, dy:number, dz:number;\n\t\tvar w:number, total:number = 0;\n\t\tvar i:number;\n\n\t\t// calculates weights for probes\n\t\tfor (i = 0; i < this._pNumLightProbes; ++i) {\n\n\t\t\tlightPos = this._pLightProbes[i].scenePosition;\n\t\t\tdx = rx - lightPos.x;\n\t\t\tdy = ry - lightPos.y;\n\t\t\tdz = rz - lightPos.z;\n\t\t\t// weight is inversely proportional to square of distance\n\t\t\tw = dx*dx + dy*dy + dz*dz;\n\n\t\t\t// just... huge if at the same spot\n\t\t\tw = w > .00001? 1/w : 50000000;\n\t\t\tthis._pLightProbeWeights[i] = w;\n\t\t\ttotal += w;\n\t\t}\n\n\t\t// normalize\n\t\ttotal = 1/total;\n\n\t\tfor (i = 0; i < this._pNumLightProbes; ++i)\n\t\t\tthis._pLightProbeWeights[i] *= total;\n\t}\n}\n\nexport = LightPickerBase;", + "import LightBase\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LightBase\");\nimport DirectionalLight\t\t\t\t= require(\"awayjs-core/lib/entities/DirectionalLight\");\nimport LightProbe\t\t\t\t\t= require(\"awayjs-core/lib/entities/LightProbe\");\nimport PointLight\t\t\t\t\t= require(\"awayjs-core/lib/entities/PointLight\");\nimport Event\t\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\nimport LightEvent\t\t\t\t\t= require(\"awayjs-core/lib/events/LightEvent\");\nimport LightPickerBase\t\t\t\t= require(\"awayjs-core/lib/materials/lightpickers/LightPickerBase\");\n\n/**\n * StaticLightPicker is a light picker that provides a static set of lights. The lights can be reassigned, but\n * if the configuration changes (number of directional lights, point lights, etc), a material recompilation may\n * occur.\n */\nclass StaticLightPicker extends LightPickerBase\n{\n\tprivate _lights:Array;\n\tprivate _onCastShadowChangeDelegate:Function;\n\n\t/**\n\t * Creates a new StaticLightPicker object.\n\t * @param lights The lights to be used for shading.\n\t */\n\tconstructor(lights)\n\t{\n\t\tsuper();\n\n\t\tthis._onCastShadowChangeDelegate = (event:LightEvent) => this.onCastShadowChange(event);\n\n\t\tthis.lights = lights;\n\t}\n\n\t/**\n\t * The lights used for shading.\n\t */\n\tpublic get lights()\n\t{\n\t\treturn this._lights;\n\t}\n\n\tpublic set lights(value:Array)\n\t{\n\t\tvar numPointLights:number = 0;\n\t\tvar numDirectionalLights:number = 0;\n\t\tvar numCastingPointLights:number = 0;\n\t\tvar numCastingDirectionalLights:number = 0;\n\t\tvar numLightProbes:number = 0;\n\t\tvar light:LightBase;\n\n\t\tif (this._lights)\n\t\t\tthis.clearListeners();\n\n\t\tthis._lights = value;\n\t\tthis._pAllPickedLights = value;\n\t\tthis._pPointLights = new Array();\n\t\tthis._pCastingPointLights = new Array();\n\t\tthis._pDirectionalLights = new Array();\n\t\tthis._pCastingDirectionalLights = new Array();\n\t\tthis._pLightProbes = new Array();\n\n\t\tvar len:number = value.length;\n\n\t\tfor (var i:number = 0; i < len; ++i) {\n\t\t\tlight = value[i];\n\t\t\tlight.addEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate);\n\n\t\t\tif (light instanceof PointLight) {\n\t\t\t\tif (light.castsShadows)\n\t\t\t\t\tthis._pCastingPointLights[numCastingPointLights++] = light;\n\t\t\t\telse\n\t\t\t\t\tthis._pPointLights[numPointLights++] = light;\n\n\t\t\t} else if (light instanceof DirectionalLight) {\n\t\t\t\tif (light.castsShadows)\n\t\t\t\t\tthis._pCastingDirectionalLights[numCastingDirectionalLights++] = light;\n\t\t\t\telse\n\t\t\t\t\tthis._pDirectionalLights[numDirectionalLights++] = light;\n\n\t\t\t} else if (light instanceof LightProbe) {\n\t\t\t\tthis._pLightProbes[numLightProbes++] = light;\n\t\t\t}\n\t\t}\n\n\t\tif (this._pNumDirectionalLights == numDirectionalLights && this._pNumPointLights == numPointLights && this._pNumLightProbes == numLightProbes && this._pNumCastingPointLights == numCastingPointLights && this._pNumCastingDirectionalLights == numCastingDirectionalLights)\n\t\t\treturn;\n\n\t\tthis._pNumDirectionalLights = numDirectionalLights;\n\t\tthis._pNumCastingDirectionalLights = numCastingDirectionalLights;\n\t\tthis._pNumPointLights = numPointLights;\n\t\tthis._pNumCastingPointLights = numCastingPointLights;\n\t\tthis._pNumLightProbes = numLightProbes;\n\n\t\t// MUST HAVE MULTIPLE OF 4 ELEMENTS!\n\t\tthis._pLightProbeWeights = new Array(Math.ceil(numLightProbes/4)*4);\n\n\t\t// notify material lights have changed\n\t\tthis.dispatchEvent(new Event(Event.CHANGE));\n\n\t}\n\n\t/**\n\t * Remove configuration change listeners on the lights.\n\t */\n\tprivate clearListeners()\n\t{\n\t\tvar len:number = this._lights.length;\n\t\tfor (var i:number = 0; i < len; ++i)\n\t\t\tthis._lights[i].removeEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate);\n\t}\n\n\t/**\n\t * Notifies the material of a configuration change.\n\t */\n\tprivate onCastShadowChange(event:LightEvent)\n\t{\n\t\t// TODO: Assign to special caster collections, just append it to the lights in SinglePass\n\t\t// But keep seperated in multipass\n\n\t\tvar light:LightBase = event.target;\n\n\t\tif (light instanceof PointLight)\n\t\t\tthis.updatePointCasting( light);\n\t\telse if (light instanceof DirectionalLight)\n\t\t\tthis.updateDirectionalCasting( light);\n\n\t\tthis.dispatchEvent(new Event(Event.CHANGE));\n\t}\n\n\t/**\n\t * Called when a directional light's shadow casting configuration changes.\n\t */\n\tprivate updateDirectionalCasting(light:DirectionalLight)\n\t{\n\t\tvar dl:DirectionalLight = light;\n\n\t\tif (light.castsShadows) {\n\t\t\t--this._pNumDirectionalLights;\n\t\t\t++this._pNumCastingDirectionalLights;\n\n\n\t\t\tthis._pDirectionalLights.splice(this._pDirectionalLights.indexOf(dl), 1);\n\t\t\tthis._pCastingDirectionalLights.push(light);\n\n\t\t} else {\n\t\t\t++this._pNumDirectionalLights;\n\t\t\t--this._pNumCastingDirectionalLights;\n\n\t\t\tthis._pCastingDirectionalLights.splice(this._pCastingDirectionalLights.indexOf(dl), 1);\n\t\t\tthis._pDirectionalLights.push(light);\n\t\t}\n\t}\n\n\t/**\n\t * Called when a point light's shadow casting configuration changes.\n\t */\n\tprivate updatePointCasting(light:PointLight)\n\t{\n\t\tvar pl:PointLight = light;\n\n\t\tif (light.castsShadows) {\n\t\t\t--this._pNumPointLights;\n\t\t\t++this._pNumCastingPointLights;\n\t\t\tthis._pPointLights.splice(this._pPointLights.indexOf(pl), 1);\n\t\t\tthis._pCastingPointLights.push(light);\n\t\t} else {\n\t\t\t++this._pNumPointLights;\n\t\t\t--this._pNumCastingPointLights;\n\n\t\t\tthis._pCastingPointLights.splice(this._pCastingPointLights.indexOf(pl), 1);\n\t\t\tthis._pPointLights.push(light);\n\t\t}\n\t}\n}\n\nexport = StaticLightPicker;", + "import IAnimationSet\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimationSet\");\nimport IAnimator\t\t\t\t\t= require(\"awayjs-core/lib/animators/IAnimator\");\nimport IStage\t\t\t\t\t\t= require(\"awayjs-core/lib/core/base/IStage\");\nimport BlendMode\t\t\t\t\t= require(\"awayjs-core/lib/core/base/BlendMode\");\nimport Rectangle\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport IMaterialPassData\t\t\t= require(\"awayjs-core/lib/core/pool/IMaterialPassData\");\nimport IRenderable\t\t\t\t\t= require(\"awayjs-core/lib/core/pool/IRenderable\");\nimport AbstractMethodError\t\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport ArgumentError\t\t\t\t= require(\"awayjs-core/lib/errors/ArgumentError\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport Event\t\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\nimport IEventDispatcher\t\t\t\t= require(\"awayjs-core/lib/events/IEventDispatcher\");\nimport LightPickerBase\t\t\t\t= require(\"awayjs-core/lib/materials/lightpickers/LightPickerBase\");\nimport TextureProxyBase\t\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\n/**\n * MaterialPassBase provides an abstract base class for material shader passes. A material pass constitutes at least\n * a render call per required renderable.\n */\ninterface IMaterialPass extends IEventDispatcher\n{\n\t/**\n\t * Cleans up any resources used by the current object.\n\t * @param deep Indicates whether other resources should be cleaned up, that could potentially be shared across different instances.\n\t */\n\tdispose();\n\n\t/**\n\t * Renders an object to the current render target.\n\t *\n\t * @private\n\t */\n\t_iRender(pass:IMaterialPassData, renderable:IRenderable, stage:IStage, camera:Camera, viewProjection:Matrix3D);\n\n\t/**\n\t * Sets the render state for the pass that is independent of the rendered object. This needs to be called before\n\t * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated.\n\t * @param stage The Stage object which is currently used for rendering.\n\t * @param camera The camera from which the scene is viewed.\n\t * @private\n\t */\n\t_iActivate(pass:IMaterialPassData, stage:IStage, camera:Camera);\n\n\t/**\n\t * Clears the render state for the pass. This needs to be called before activating another pass.\n\t * @param stage The Stage used for rendering\n\t *\n\t * @private\n\t */\n\t_iDeactivate(pass:IMaterialPassData, stage:IStage);\n\n\t/**\n\t * The light picker used by the material to provide lights to the material if it supports lighting.\n\t *\n\t * @see away.materials.LightPickerBase\n\t * @see away.materials.StaticLightPicker\n\t */\n\tlightPicker:LightPickerBase;\n}\n\nexport = IMaterialPass;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Matrix3DUtils\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3DUtils\");\nimport Rectangle\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport Event\t\t\t\t\t\t= require(\"awayjs-core/lib/events/Event\");\nimport EventDispatcher\t\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport IEventDispatcher\t\t\t\t= require(\"awayjs-core/lib/events/IEventDispatcher\");\nimport DirectionalShadowMapper\t\t= require(\"awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper\");\nimport FreeMatrixProjection\t\t\t= require(\"awayjs-core/lib/projections/FreeMatrixProjection\");\nimport IProjection\t\t\t\t\t= require(\"awayjs-core/lib/projections/IProjection\");\nimport RenderTexture\t\t\t\t= require(\"awayjs-core/lib/textures/RenderTexture\");\nimport TextureProxyBase\t\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\nclass CascadeShadowMapper extends DirectionalShadowMapper implements IEventDispatcher\n{\n\tpublic _pScissorRects:Rectangle[];\n\tprivate _pScissorRectsInvalid:boolean = true;\n\tprivate _splitRatios:number[];\n\n\tprivate _numCascades:number /*int*/;\n\tprivate _depthCameras:Array;\n\tprivate _depthLenses:Array;\n\n\tprivate _texOffsetsX:Array;\n\tprivate _texOffsetsY:Array;\n\n\tprivate _changeDispatcher:EventDispatcher;\n\tprivate _nearPlaneDistances:number[];\n\n\tconstructor(numCascades:number /*uint*/ = 3)\n\t{\n\t\tsuper();\n\n\t\tif (numCascades < 1 || numCascades > 4)\n\t\t\tthrow new Error(\"numCascades must be an integer between 1 and 4\");\n\n\t\tthis._numCascades = numCascades;\n\t\tthis._changeDispatcher = new EventDispatcher(this);\n\t\tthis.init();\n\t}\n\n\tpublic getSplitRatio(index:number /*uint*/):number\n\t{\n\t\treturn this._splitRatios[index];\n\t}\n\n\tpublic setSplitRatio(index:number /*uint*/, value:number)\n\t{\n\t\tif (value < 0)\n\t\t\tvalue = 0;\n\t\telse if (value > 1)\n\t\t\tvalue = 1;\n\n\t\tif (index >= this._numCascades)\n\t\t\tthrow new Error(\"index must be smaller than the number of cascades!\");\n\n\t\tthis._splitRatios[index] = value;\n\t}\n\n\tpublic getDepthProjections(partition:number /*uint*/):Matrix3D\n\t{\n\t\treturn this._depthCameras[partition].viewProjection;\n\t}\n\n\tprivate init()\n\t{\n\t\tthis._splitRatios = new Array(this._numCascades);\n\t\tthis._nearPlaneDistances = new Array(this._numCascades);\n\n\t\tvar s:number = 1;\n\t\tfor (var i:number /*int*/ = this._numCascades - 1; i >= 0; --i) {\n\t\t\tthis._splitRatios[i] = s;\n\t\t\ts *= .4;\n\t\t}\n\n\t\tthis._texOffsetsX = Array(-1, 1, -1, 1);\n\t\tthis._texOffsetsY = Array(1, 1, -1, -1);\n\t\tthis._pScissorRects = new Array(4);\n\t\tthis._depthLenses = new Array();\n\t\tthis._depthCameras = new Array();\n\n\t\tfor (i = 0; i < this._numCascades; ++i) {\n\t\t\tthis._depthLenses[i] = new FreeMatrixProjection();\n\t\t\tthis._depthCameras[i] = new Camera(this._depthLenses[i]);\n\t\t}\n\t}\n\n\tpublic _pSetDepthMapSize(value:number /*uint*/)\n\t{\n\t\tsuper._pSetDepthMapSize(value);\n\n\t\tthis.invalidateScissorRects();\n\t}\n\n\tprivate invalidateScissorRects()\n\t{\n\t\tthis._pScissorRectsInvalid = true;\n\t}\n\n\tpublic get numCascades():number /*int*/\n\t{\n\t\treturn this._numCascades;\n\t}\n\n\tpublic set numCascades(value:number /*int*/)\n\t{\n\t\tif (value == this._numCascades)\n\t\t\treturn;\n\n\t\tif (value < 1 || value > 4)\n\t\t\tthrow new Error(\"numCascades must be an integer between 1 and 4\");\n\n\t\tthis._numCascades = value;\n\t\tthis.invalidateScissorRects();\n\t\tthis.init();\n\t\tthis.dispatchEvent(new Event(Event.CHANGE));\n\t}\n\n\tpublic pDrawDepthMap(target:RenderTexture, scene:Scene, renderer:IRenderer)\n\t{\n\t\tif (this._pScissorRectsInvalid)\n\t\t\tthis.updateScissorRects();\n\n\t\tthis._pCasterCollector.cullPlanes = this._pCullPlanes;\n\t\tthis._pCasterCollector.camera = this._pOverallDepthCamera;\n\t\tthis._pCasterCollector.clear();\n\t\tscene.traversePartitions(this._pCasterCollector);\n\n\t\trenderer._iRenderCascades(this._pCasterCollector, target, this._numCascades, this._pScissorRects, this._depthCameras);\n\t}\n\n\tprivate updateScissorRects()\n\t{\n\t\tvar half:number = this._pDepthMapSize*.5;\n\n\t\tthis._pScissorRects[0] = new Rectangle(0, 0, half, half);\n\t\tthis._pScissorRects[1] = new Rectangle(half, 0, half, half);\n\t\tthis._pScissorRects[2] = new Rectangle(0, half, half, half);\n\t\tthis._pScissorRects[3] = new Rectangle(half, half, half, half);\n\n\t\tthis._pScissorRectsInvalid = false;\n\t}\n\n\tpublic pUpdateDepthProjection(viewCamera:Camera)\n\t{\n\t\tvar matrix:Matrix3D;\n\t\tvar projection:IProjection = viewCamera.projection;\n\t\tvar projectionNear:number = projection.near;\n\t\tvar projectionRange:number = projection.far - projectionNear;\n\n\t\tthis.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix);\n\t\tthis._pMatrix.appendScale(.96, .96, 1);\n\t\tthis._pOverallDepthProjection.matrix = this._pMatrix;\n\t\tthis.pUpdateCullPlanes(viewCamera);\n\n\t\tfor (var i:number /*int*/ = 0; i < this._numCascades; ++i) {\n\t\t\tmatrix = this._depthLenses[i].matrix;\n\n\t\t\tthis._nearPlaneDistances[i] = projectionNear + this._splitRatios[i]*projectionRange;\n\t\t\tthis._depthCameras[i].transform = this._pOverallDepthCamera.transform;\n\n\t\t\tthis.updateProjectionPartition(matrix, this._splitRatios[i], this._texOffsetsX[i], this._texOffsetsY[i]);\n\n\t\t\tthis._depthLenses[i].matrix = matrix;\n\t\t}\n\t}\n\n\tprivate updateProjectionPartition(matrix:Matrix3D, splitRatio:number, texOffsetX:number, texOffsetY:number)\n\t{\n\t\tvar raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER;\n\t\tvar xN:number, yN:number, zN:number;\n\t\tvar xF:number, yF:number, zF:number;\n\t\tvar minX:number = Number.POSITIVE_INFINITY, minY:number = Number.POSITIVE_INFINITY, minZ:number;\n\t\tvar maxX:number = Number.NEGATIVE_INFINITY, maxY:number = Number.NEGATIVE_INFINITY, maxZ:number = Number.NEGATIVE_INFINITY;\n\t\tvar i:number /*uint*/ = 0;\n\n\t\twhile (i < 12) {\n\t\t\txN = this._pLocalFrustum[i];\n\t\t\tyN = this._pLocalFrustum[i + 1];\n\t\t\tzN = this._pLocalFrustum[i + 2];\n\t\t\txF = xN + (this._pLocalFrustum[i + 12] - xN)*splitRatio;\n\t\t\tyF = yN + (this._pLocalFrustum[i + 13] - yN)*splitRatio;\n\t\t\tzF = zN + (this._pLocalFrustum[i + 14] - zN)*splitRatio;\n\t\t\tif (xN < minX)\n\t\t\t\tminX = xN;\n\t\t\tif (xN > maxX)\n\t\t\t\tmaxX = xN;\n\t\t\tif (yN < minY)\n\t\t\t\tminY = yN;\n\t\t\tif (yN > maxY)\n\t\t\t\tmaxY = yN;\n\t\t\tif (zN > maxZ)\n\t\t\t\tmaxZ = zN;\n\t\t\tif (xF < minX)\n\t\t\t\tminX = xF;\n\t\t\tif (xF > maxX)\n\t\t\t\tmaxX = xF;\n\t\t\tif (yF < minY)\n\t\t\t\tminY = yF;\n\t\t\tif (yF > maxY)\n\t\t\t\tmaxY = yF;\n\t\t\tif (zF > maxZ)\n\t\t\t\tmaxZ = zF;\n\t\t\ti += 3;\n\t\t}\n\n\t\tminZ = 1;\n\n\t\tvar w:number = (maxX - minX);\n\t\tvar h:number = (maxY - minY);\n\t\tvar d:number = 1/(maxZ - minZ);\n\n\t\tif (minX < 0)\n\t\t\tminX -= this._pSnap; // because int() rounds up for < 0\n\t\tif (minY < 0)\n\t\t\tminY -= this._pSnap;\n\t\tminX = Math.floor(minX/this._pSnap)*this._pSnap;\n\t\tminY = Math.floor(minY/this._pSnap)*this._pSnap;\n\n\t\tvar snap2:number = 2*this._pSnap;\n\t\tw = Math.floor(w/snap2 + 1)*snap2;\n\t\th = Math.floor(h/snap2 + 1)*snap2;\n\n\t\tmaxX = minX + w;\n\t\tmaxY = minY + h;\n\n\t\tw = 1/w;\n\t\th = 1/h;\n\n\t\traw[0] = 2*w;\n\t\traw[5] = 2*h;\n\t\traw[10] = d;\n\t\traw[12] = -(maxX + minX)*w;\n\t\traw[13] = -(maxY + minY)*h;\n\t\traw[14] = -minZ*d;\n\t\traw[15] = 1;\n\t\traw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0;\n\n\t\tmatrix.copyRawDataFrom(raw);\n\t\tmatrix.appendScale(.96, .96, 1);\n\t\tmatrix.appendTranslation(texOffsetX, texOffsetY, 0);\n\t\tmatrix.appendScale(.5, .5, 1);\n\t}\n\n\tpublic addEventListener(type:string, listener:Function)\n\t{\n\t\tthis._changeDispatcher.addEventListener(type, listener);\n\t}\n\n\tpublic removeEventListener(type:string, listener:Function)\n\t{\n\t\tthis._changeDispatcher.removeEventListener(type, listener);\n\t}\n\n\tpublic dispatchEvent(event:Event)\n\t{\n\t\treturn this._changeDispatcher.dispatchEvent(event);\n\t}\n\n\tpublic hasEventListener(type:string):boolean\n\t{\n\t\treturn this._changeDispatcher.hasEventListener(type);\n\t}\n\n\tget _iNearPlaneDistances():Array\n\t{\n\t\treturn this._nearPlaneDistances;\n\t}\n}\n\nexport = CascadeShadowMapper;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport PointLight\t\t\t\t\t= require(\"awayjs-core/lib/entities/PointLight\");\nimport PartialImplementationError\t= require(\"awayjs-core/lib/errors/PartialImplementationError\");\nimport ShadowMapperBase\t\t\t\t= require(\"awayjs-core/lib/materials/shadowmappers/ShadowMapperBase\");\nimport PerspectiveProjection\t\t= require(\"awayjs-core/lib/projections/PerspectiveProjection\");\nimport RenderTexture\t\t\t\t= require(\"awayjs-core/lib/textures/RenderTexture\");\nimport TextureProxyBase\t\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\nclass CubeMapShadowMapper extends ShadowMapperBase\n{\n\tprivate _depthCameras:Array;\n\tprivate _projections:Array;\n\tprivate _needsRender:Array;\n\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._pDepthMapSize = 512;\n\t\tthis._needsRender = new Array();\n\t\tthis.initCameras();\n\t}\n\n\tprivate initCameras()\n\t{\n\t\tthis._depthCameras = new Array();\n\t\tthis._projections = new Array();\n\n\t\t// posX, negX, posY, negY, posZ, negZ\n\t\tthis.addCamera(0, 90, 0);\n\t\tthis.addCamera(0, -90, 0);\n\t\tthis.addCamera(-90, 0, 0);\n\t\tthis.addCamera(90, 0, 0);\n\t\tthis.addCamera(0, 0, 0);\n\t\tthis.addCamera(0, 180, 0);\n\t}\n\n\tprivate addCamera(rotationX:number, rotationY:number, rotationZ:number)\n\t{\n\t\tvar cam:Camera = new Camera();\n\t\tcam.rotationX = rotationX;\n\t\tcam.rotationY = rotationY;\n\t\tcam.rotationZ = rotationZ;\n\t\tcam.projection.near = .01;\n\n\t\tvar projection:PerspectiveProjection = cam.projection;\n\t\tprojection.fieldOfView = 90;\n\t\tthis._projections.push(projection);\n\t\tcam.projection._iAspectRatio = 1;\n\t\tthis._depthCameras.push(cam);\n\t}\n\n\t//@override\n\tpublic pCreateDepthTexture():TextureProxyBase\n\t{\n\t\tthrow new PartialImplementationError();\n\t\t/*\n\t\t return new RenderCubeTexture( this._depthMapSize );\n\t\t */\n\t}\n\n\t//@override\n\tpublic pUpdateDepthProjection(viewCamera:Camera)\n\t{\n\t\tvar light:PointLight = (this._pLight);\n\t\tvar maxDistance:number = light._pFallOff;\n\t\tvar pos:Vector3D = this._pLight.scenePosition;\n\n\t\t// todo: faces outside frustum which are pointing away from camera need not be rendered!\n\t\tfor (var i:number = 0; i < 6; ++i) {\n\t\t\tthis._projections[i].far = maxDistance;\n\t\t\tthis._depthCameras[i].transform.position = pos;\n\t\t\tthis._needsRender[i] = true;\n\t\t}\n\t}\n\n\t//@override\n\tpublic pDrawDepthMap(target:RenderTexture, scene:Scene, renderer:IRenderer)\n\t{\n\t\tfor (var i:number = 0; i < 6; ++i) {\n\t\t\tif (this._needsRender[i]) {\n\t\t\t\tthis._pCasterCollector.camera = this._depthCameras[i];\n\t\t\t\tthis._pCasterCollector.clear();\n\t\t\t\tscene.traversePartitions(this._pCasterCollector);\n\t\t\t\trenderer._iRender(this._pCasterCollector, target, null, i)\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport = CubeMapShadowMapper;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport Matrix3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Plane3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport DirectionalLight\t\t\t\t= require(\"awayjs-core/lib/entities/DirectionalLight\");\nimport ShadowMapperBase\t\t\t\t= require(\"awayjs-core/lib/materials/shadowmappers/ShadowMapperBase\");\nimport FreeMatrixProjection\t\t\t= require(\"awayjs-core/lib/projections/FreeMatrixProjection\");\nimport RenderTexture\t\t\t\t= require(\"awayjs-core/lib/textures/RenderTexture\");\nimport TextureProxyBase\t\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\nclass DirectionalShadowMapper extends ShadowMapperBase\n{\n\tpublic _pOverallDepthCamera:Camera;\n\tpublic _pLocalFrustum:Array;\n\n\tpublic _pLightOffset:number = 10000;\n\tpublic _pMatrix:Matrix3D;\n\tpublic _pOverallDepthProjection:FreeMatrixProjection;\n\tpublic _pSnap:number = 64;\n\n\tpublic _pCullPlanes:Array;\n\tpublic _pMinZ:number;\n\tpublic _pMaxZ:number;\n\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._pCullPlanes = [];\n\t\tthis._pOverallDepthProjection = new FreeMatrixProjection();\n\t\tthis._pOverallDepthCamera = new Camera(this._pOverallDepthProjection);\n\t\tthis._pLocalFrustum = [];\n\t\tthis._pMatrix = new Matrix3D();\n\t}\n\n\tpublic get snap():number\n\t{\n\t\treturn this._pSnap;\n\t}\n\n\tpublic set snap(value:number)\n\t{\n\t\tthis._pSnap = value;\n\t}\n\n\tpublic get lightOffset():number\n\t{\n\t\treturn this._pLightOffset;\n\t}\n\n\tpublic set lightOffset(value:number)\n\t{\n\t\tthis._pLightOffset = value;\n\t}\n\n\t//@arcane\n\tpublic get iDepthProjection():Matrix3D\n\t{\n\t\treturn this._pOverallDepthCamera.viewProjection;\n\t}\n\n\t//@arcane\n\tpublic get depth():number\n\t{\n\t\treturn this._pMaxZ - this._pMinZ;\n\t}\n\n\t//@override\n\tpublic pDrawDepthMap(target:TextureProxyBase, scene:Scene, renderer:IRenderer)\n\t{\n\t\tthis._pCasterCollector.camera = this._pOverallDepthCamera;\n\t\tthis._pCasterCollector.cullPlanes = this._pCullPlanes;\n\t\tthis._pCasterCollector.clear();\n\t\tscene.traversePartitions(this._pCasterCollector);\n\t\trenderer._iRender(this._pCasterCollector, target);\n\t}\n\n\t//@protected\n\tpublic pUpdateCullPlanes(viewCamera:Camera)\n\t{\n\t\tvar lightFrustumPlanes:Array = this._pOverallDepthCamera.frustumPlanes;\n\t\tvar viewFrustumPlanes:Array = viewCamera.frustumPlanes;\n\t\tthis._pCullPlanes.length = 4;\n\n\t\tthis._pCullPlanes[0] = lightFrustumPlanes[0];\n\t\tthis._pCullPlanes[1] = lightFrustumPlanes[1];\n\t\tthis._pCullPlanes[2] = lightFrustumPlanes[2];\n\t\tthis._pCullPlanes[3] = lightFrustumPlanes[3];\n\n\t\tvar light:DirectionalLight = this._pLight;\n\t\tvar dir:Vector3D = light.sceneDirection;\n\t\tvar dirX:number = dir.x;\n\t\tvar dirY:number = dir.y;\n\t\tvar dirZ:number = dir.z;\n\t\tvar j:number = 4;\n\t\tfor (var i:number = 0; i < 6; ++i) {\n\t\t\tvar plane:Plane3D = viewFrustumPlanes[i];\n\t\t\tif (plane.a*dirX + plane.b*dirY + plane.c*dirZ < 0)\n\t\t\t\tthis._pCullPlanes[j++] = plane;\n\t\t}\n\t}\n\n\t//@override\n\tpublic pUpdateDepthProjection(viewCamera:Camera)\n\t{\n\t\tthis.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix);\n\t\tthis._pOverallDepthProjection.matrix = this._pMatrix;\n\t\tthis.pUpdateCullPlanes(viewCamera);\n\t}\n\n\tpublic pUpdateProjectionFromFrustumCorners(viewCamera:Camera, corners:Array, matrix:Matrix3D)\n\t{\n\t\tvar raw:Array = new Array();\n\t\tvar dir:Vector3D;\n\t\tvar x:number, y:number, z:number;\n\t\tvar minX:number, minY:number;\n\t\tvar maxX:number, maxY:number;\n\t\tvar i:number;\n\n\t\tvar light:DirectionalLight = this._pLight;\n\t\tdir = light.sceneDirection;\n\t\tthis._pOverallDepthCamera.transform.matrix3D = this._pLight.sceneTransform;\n\t\tx = Math.floor((viewCamera.x - dir.x*this._pLightOffset)/this._pSnap)*this._pSnap;\n\t\ty = Math.floor((viewCamera.y - dir.y*this._pLightOffset)/this._pSnap)*this._pSnap;\n\t\tz = Math.floor((viewCamera.z - dir.z*this._pLightOffset)/this._pSnap)*this._pSnap;\n\t\tthis._pOverallDepthCamera.x = x;\n\t\tthis._pOverallDepthCamera.y = y;\n\t\tthis._pOverallDepthCamera.z = z;\n\n\t\tthis._pMatrix.copyFrom(this._pOverallDepthCamera.inverseSceneTransform);\n\t\tthis._pMatrix.prepend(viewCamera.sceneTransform);\n\t\tthis._pMatrix.transformVectors(corners, this._pLocalFrustum);\n\n\t\tminX = maxX = this._pLocalFrustum[0];\n\t\tminY = maxY = this._pLocalFrustum[1];\n\t\tthis._pMaxZ = this._pLocalFrustum[2];\n\n\t\ti = 3;\n\t\twhile (i < 24) {\n\t\t\tx = this._pLocalFrustum[i];\n\t\t\ty = this._pLocalFrustum[i + 1];\n\t\t\tz = this._pLocalFrustum[i + 2];\n\t\t\tif (x < minX)\n\t\t\t\tminX = x;\n\t\t\tif (x > maxX)\n\t\t\t\tmaxX = x;\n\t\t\tif (y < minY)\n\t\t\t\tminY = y;\n\t\t\tif (y > maxY)\n\t\t\t\tmaxY = y;\n\t\t\tif (z > this._pMaxZ)\n\t\t\t\tthis._pMaxZ = z;\n\t\t\ti += 3;\n\t\t}\n\n\t\tthis._pMinZ = 1;\n\n\t\tvar w:number = maxX - minX;\n\t\tvar h:number = maxY - minY;\n\t\tvar d:number = 1/(this._pMaxZ - this._pMinZ);\n\n\t\tif (minX < 0)\n\t\t\tminX -= this._pSnap; // because int() rounds up for < 0\n\n\t\tif (minY < 0)\n\t\t\tminY -= this._pSnap;\n\n\t\tminX = Math.floor(minX/this._pSnap)*this._pSnap;\n\t\tminY = Math.floor(minY/this._pSnap)*this._pSnap;\n\n\t\tvar snap2:number = 2*this._pSnap;\n\t\tw = Math.floor(w/snap2 + 2)*snap2;\n\t\th = Math.floor(h/snap2 + 2)*snap2;\n\n\t\tmaxX = minX + w;\n\t\tmaxY = minY + h;\n\n\t\tw = 1/w;\n\t\th = 1/h;\n\n\t\traw[0] = 2*w;\n\t\traw[5] = 2*h;\n\t\traw[10] = d;\n\t\traw[12] = -(maxX + minX)*w;\n\t\traw[13] = -(maxY + minY)*h;\n\t\traw[14] = -this._pMinZ*d;\n\t\traw[15] = 1;\n\t\traw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0;\n\n\t\tmatrix.copyRawDataFrom(raw);\n\t}\n}\n\nexport = DirectionalShadowMapper;", + "import Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport DirectionalShadowMapper\t\t= require(\"awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper\");\n\nclass NearDirectionalShadowMapper extends DirectionalShadowMapper\n{\n\tprivate _coverageRatio:number;\n\n\tconstructor(coverageRatio:number = .5)\n\t{\n\t\tsuper();\n\n\t\tthis.coverageRatio = coverageRatio;\n\t}\n\n\t/**\n\t * A value between 0 and 1 to indicate the ratio of the view frustum that needs to be covered by the shadow map.\n\t */\n\tpublic get coverageRatio():number\n\t{\n\t\treturn this._coverageRatio;\n\t}\n\n\tpublic set coverageRatio(value:number)\n\t{\n\t\tif (value > 1)\n\t\t\tvalue = 1; else if (value < 0)\n\t\t\tvalue = 0;\n\n\t\tthis._coverageRatio = value;\n\t}\n\n\tpublic pUpdateDepthProjection(viewCamera:Camera)\n\t{\n\t\tvar corners:Array = viewCamera.projection.frustumCorners;\n\n\t\tfor (var i:number /*int*/ = 0; i < 12; ++i) {\n\t\t\tvar v:number = corners[i];\n\t\t\tthis._pLocalFrustum[i] = v;\n\t\t\tthis._pLocalFrustum[i + 12] = v + (corners[i + 12] - v)*this._coverageRatio;\n\t\t}\n\n\t\tthis.pUpdateProjectionFromFrustumCorners(viewCamera, this._pLocalFrustum, this._pMatrix);\n\t\tthis._pOverallDepthProjection.matrix = this._pMatrix;\n\t}\n}\n\nexport = NearDirectionalShadowMapper;", + "import Scene\t\t\t\t\t\t= require(\"awayjs-core/lib/containers/Scene\");\nimport LightBase\t\t\t\t\t= require(\"awayjs-core/lib/core/base/LightBase\");\nimport IRenderer\t\t\t\t\t= require(\"awayjs-core/lib/core/render/IRenderer\");\nimport EntityCollector\t\t\t\t= require(\"awayjs-core/lib/core/traverse/EntityCollector\");\nimport ShadowCasterCollector\t\t= require(\"awayjs-core/lib/core/traverse/ShadowCasterCollector\");\nimport AbstractMethodError\t\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport Camera\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Camera\");\nimport RenderTexture\t\t\t\t= require(\"awayjs-core/lib/textures/RenderTexture\");\nimport TextureProxyBase\t\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\nclass ShadowMapperBase\n{\n\n\tpublic _pCasterCollector:ShadowCasterCollector;\n\n\tprivate _depthMap:TextureProxyBase;\n\tpublic _pDepthMapSize:number = 2048;\n\tpublic _pLight:LightBase;\n\tprivate _explicitDepthMap:boolean;\n\tprivate _autoUpdateShadows:boolean = true;\n\tpublic _iShadowsInvalid:boolean;\n\n\tconstructor()\n\t{\n\t\tthis._pCasterCollector = this.pCreateCasterCollector();\n\t}\n\n\tpublic pCreateCasterCollector()\n\t{\n\t\treturn new ShadowCasterCollector();\n\t}\n\n\tpublic get autoUpdateShadows():boolean\n\t{\n\t\treturn this._autoUpdateShadows;\n\t}\n\n\tpublic set autoUpdateShadows(value:boolean)\n\t{\n\t\tthis._autoUpdateShadows = value;\n\t}\n\n\tpublic updateShadows()\n\t{\n\t\tthis._iShadowsInvalid = true;\n\t}\n\n\tpublic iSetDepthMap(depthMap:TextureProxyBase)\n\t{\n\t\tif (this._depthMap == depthMap)\n\t\t\treturn;\n\n\t\tif (this._depthMap && !this._explicitDepthMap)\n\t\t\tthis._depthMap.dispose();\n\n\t\tthis._depthMap = depthMap;\n\n\t\tif (this._depthMap) {\n\t\t\tthis._explicitDepthMap = true;\n\t\t\tthis._pDepthMapSize = this._depthMap.size;\n\t\t} else {\n\t\t\tthis._explicitDepthMap = false;\n\t\t}\n\t}\n\n\tpublic get light():LightBase\n\t{\n\t\treturn this._pLight;\n\t}\n\n\tpublic set light(value:LightBase)\n\t{\n\t\tthis._pLight = value;\n\t}\n\n\tpublic get depthMap():TextureProxyBase\n\t{\n\t\tif (!this._depthMap)\n\t\t\tthis._depthMap = this.pCreateDepthTexture();\n\n\t\treturn this._depthMap;\n\t}\n\n\tpublic get depthMapSize():number\n\t{\n\t\treturn this._pDepthMapSize;\n\t}\n\n\tpublic set depthMapSize(value:number)\n\t{\n\t\tif (value == this._pDepthMapSize)\n\t\t\treturn;\n\n\t\tthis._pSetDepthMapSize(value);\n\t}\n\n\tpublic dispose()\n\t{\n\t\tthis._pCasterCollector = null;\n\n\t\tif (this._depthMap && !this._explicitDepthMap)\n\t\t\tthis._depthMap.dispose();\n\n\t\tthis._depthMap = null;\n\t}\n\n\tpublic pCreateDepthTexture():TextureProxyBase\n\t{\n\t\treturn new RenderTexture(this._pDepthMapSize, this._pDepthMapSize);\n\t}\n\n\tpublic iRenderDepthMap(entityCollector:EntityCollector, renderer:IRenderer)\n\t{\n\t\tthis._iShadowsInvalid = false;\n\n\t\tthis.pUpdateDepthProjection(entityCollector.camera);\n\n\t\tif (!this._depthMap)\n\t\t\tthis._depthMap = this.pCreateDepthTexture();\n\n\t\tthis.pDrawDepthMap(this._depthMap, entityCollector.scene, renderer);\n\t}\n\n\tpublic pUpdateDepthProjection(viewCamera:Camera)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic pDrawDepthMap(target:TextureProxyBase, scene:Scene, renderer:IRenderer)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic _pSetDepthMapSize(value)\n\t{\n\t\tthis._pDepthMapSize = value;\n\n\t\tif (this._explicitDepthMap) {\n\t\t\tthrow Error(\"Cannot set depth map size for the current renderer.\");\n\t\t} else if (this._depthMap) {\n\t\t\tthis._depthMap.dispose();\n\t\t\tthis._depthMap = null;\n\t\t}\n\t}\n}\n\nexport = ShadowMapperBase;", + "import IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport URLLoaderDataFormat\t\t= require(\"awayjs-core/lib/core/net/URLLoaderDataFormat\");\nimport URLRequest\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequest\");\nimport ParserBase\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserBase\");\nimport ResourceDependency\t\t= require(\"awayjs-core/lib/parsers/ResourceDependency\");\nimport ImageCubeTexture\t\t\t= require(\"awayjs-core/lib/textures/ImageCubeTexture\");\nimport ImageTexture\t\t\t\t= require(\"awayjs-core/lib/textures/ImageTexture\");\n\n/**\n * CubeTextureParser provides a \"parser\" for natively supported image types (jpg, png). While it simply loads bytes into\n * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without\n * exception cases.\n */\nclass CubeTextureParser extends ParserBase\n{\n\tprivate static posX:string = 'posX';\n\tprivate static negX:string = 'negX';\n\tprivate static posY:string = 'posY';\n\tprivate static negY:string = 'negY';\n\tprivate static posZ:string = 'posZ';\n\tprivate static negZ:string = 'negZ';\n\n\tprivate _imgDependencyDictionary:Object;\n\n\t/**\n\t * Creates a new CubeTextureParser object.\n\t * @param uri The url or id of the data or file to be parsed.\n\t * @param extra The holder for extra contextual data that the parser might need.\n\t */\n\tconstructor()\n\t{\n\t\tsuper(URLLoaderDataFormat.TEXT);\n\t}\n\n\t/**\n\t * Indicates whether or not a given file extension is supported by the parser.\n\t * @param extension The file extension of a potential file to be parsed.\n\t * @return Whether or not the given file type is supported.\n\t */\n\n\tpublic static supportsType(extension:string):boolean\n\t{\n\t\textension = extension.toLowerCase();\n\t\treturn extension == \"cube\";\n\t}\n\n\t/**\n\t * Tests whether a data block can be parsed by the parser.\n\t * @param data The data block to potentially be parsed.\n\t * @return Whether or not the given data is supported.\n\t */\n\tpublic static supportsData(data:any):boolean\n\t{\n\t\ttry {\n\t\t\tvar obj = JSON.parse(data);\n\n\t\t\tif (obj) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _iResolveDependency(resourceDependency:ResourceDependency)\n\t{\n\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _iResolveDependencyFailure(resourceDependency:ResourceDependency)\n\t{\n\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pProceedParsing():boolean\n\t{\n\t\tif (this._imgDependencyDictionary != null) { //all images loaded\n\t\t\tvar asset:ImageCubeTexture = new ImageCubeTexture(\n\n\t\t\t\tthis._getHTMLImageElement(CubeTextureParser.posX), this._getHTMLImageElement(CubeTextureParser.negX), this._getHTMLImageElement(CubeTextureParser.posY), this._getHTMLImageElement(CubeTextureParser.negY), this._getHTMLImageElement(CubeTextureParser.posZ), this._getHTMLImageElement(CubeTextureParser.negZ));\n\n\t\t\t//clear dictionary\n\t\t\tthis._imgDependencyDictionary = null;\n\n\t\t\tasset.name = this._iFileName;\n\n\t\t\tthis._pFinalizeAsset( asset, this._iFileName);\n\n\t\t\treturn ParserBase.PARSING_DONE;\n\t\t}\n\n\t\ttry {\n\t\t\tvar json:any = JSON.parse(this.data);\n\t\t\tvar data:Array = > json.data;\n\t\t\tvar rec:any;\n\n\t\t\tif (data.length != 6)\n\t\t\t\tthis._pDieWithError('CubeTextureParser: Error - cube texture should have exactly 6 images');\n\n\t\t\tif (json) {\n\t\t\t\tthis._imgDependencyDictionary = new Object();\n\n\t\t\t\tfor (var c:number = 0; c < data.length; c++) {\n\t\t\t\t\trec = data[c];\n\t\t\t\t\tthis._imgDependencyDictionary[rec.id] = this._pAddDependency(rec.id, new URLRequest(rec.image.toString()));\n\t\t\t\t}\n\n\t\t\t\tif (!this._validateCubeData()) {\n\n\t\t\t\t\tthis._pDieWithError(\"CubeTextureParser: JSON data error - cubes require id of: \\n\" + CubeTextureParser.posX + ', ' + CubeTextureParser.negX + ', \\n' + CubeTextureParser.posY + ', ' + CubeTextureParser.negY + ', \\n' + CubeTextureParser.posZ + ', ' + CubeTextureParser.negZ);\n\n\t\t\t\t\treturn ParserBase.PARSING_DONE;\n\n\t\t\t\t}\n\n\t\t\t\tthis._pPauseAndRetrieveDependencies();\n\n\t\t\t\treturn ParserBase.MORE_TO_PARSE;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tthis._pDieWithError('CubeTexturePaser Error parsing JSON');\n\t\t}\n\n\t\treturn ParserBase.PARSING_DONE;\n\n\t}\n\n\tprivate _validateCubeData():boolean\n\t{\n\t\treturn ( this._imgDependencyDictionary[ CubeTextureParser.posX ] != null && this._imgDependencyDictionary[ CubeTextureParser.negX ] != null && this._imgDependencyDictionary[ CubeTextureParser.posY ] != null && this._imgDependencyDictionary[ CubeTextureParser.negY ] != null && this._imgDependencyDictionary[ CubeTextureParser.posZ ] != null && this._imgDependencyDictionary[ CubeTextureParser.negZ ] != null );\n\t}\n\n\tprivate _getHTMLImageElement(name:string):HTMLImageElement\n\t{\n\t\tvar dependency:ResourceDependency = this._imgDependencyDictionary[ name ];\n\n\t\tif (dependency) {\n\t\t\treturn ( dependency.assets[0]).htmlImageElement;\n\t\t}\n\n\t\treturn null;\n\t}\n\n}\n\nexport = CubeTextureParser;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport URLRequest\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequest\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport AssetEvent\t\t\t\t= require(\"awayjs-core/lib/events/AssetEvent\");\nimport EventDispatcher\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport ParserEvent\t\t\t\t= require(\"awayjs-core/lib/events/ParserEvent\");\nimport TimerEvent\t\t\t\t= require(\"awayjs-core/lib/events/TimerEvent\");\nimport ParserUtils\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserUtils\");\nimport ResourceDependency\t\t= require(\"awayjs-core/lib/parsers/ResourceDependency\");\nimport ByteArray\t\t\t\t= require(\"awayjs-core/lib/utils/ByteArray\");\nimport TextureUtils\t\t\t\t= require(\"awayjs-core/lib/utils/TextureUtils\");\nimport Timer\t\t\t\t\t= require(\"awayjs-core/lib/utils/Timer\");\nimport getTimer\t\t\t\t\t= require(\"awayjs-core/lib/utils/getTimer\");\n\n/**\n * ParserBase provides an abstract base class for objects that convert blocks of data to data structures\n * supported by away.\n *\n * If used by AssetLoader to automatically determine the parser type, two public static methods should\n * be implemented, with the following signatures:\n *\n * public static supportsType(extension : string) : boolean\n * Indicates whether or not a given file extension is supported by the parser.\n *\n * public static supportsData(data : *) : boolean\n * Tests whether a data block can be parsed by the parser.\n *\n * Furthermore, for any concrete subtype, the method initHandle should be overridden to immediately\n * create the object that will contain the parsed data. This allows ResourceManager to return an object\n * handle regardless of whether the object was loaded or not.\n *\n * @see AssetLoader\n */\nclass ParserBase extends EventDispatcher\n{\n\tpublic _iFileName:string;\n\tprivate _dataFormat:string;\n\tprivate _data:any;\n\tprivate _frameLimit:number;\n\tprivate _lastFrameTime:number;\n\tprivate _pOnIntervalDelegate:(event:TimerEvent) => void;\n\tpublic _pContent:DisplayObject;\n\n\t//----------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t// TODO: add error checking for the following ( could cause a problem if this function is not implemented )\n\t//----------------------------------------------------------------------------------------------------------------------------------------------------------------\n\t// Needs to be implemented in all Parsers (\n\t//public static supportsType(extension : string) : boolean\n\t//* Indicates whether or not a given file extension is supported by the parser.\n\t//----------------------------------------------------------------------------------------------------------------------------------------------------------------\n\n\tpublic static supportsType(extension:string):boolean\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/* TODO: Implement ParserUtils;\n\t public _pGetTextData():string\n\t {\n\t return ParserUtils.toString(_data);\n\t }\n\n\t public _pGetByteData():ByteArray\n\t {\n\t return ParserUtils.toByteArray(_data);\n\t }\n\t */\n\tprivate _dependencies:Array;\n\tprivate _parsingPaused:boolean;\n\tprivate _parsingComplete:boolean;\n\tprivate _parsingFailure:boolean;\n\tprivate _timer:Timer;\n\tprivate _materialMode:number;\n\n\t/**\n\t * Returned by proceedParsing to indicate no more parsing is needed.\n\t */\n\tpublic static PARSING_DONE:boolean = true;\n\t/* Protected */\n\n\t/**\n\t * Returned by proceedParsing to indicate more parsing is needed, allowing asynchronous parsing.\n\t */\n\tpublic static MORE_TO_PARSE:boolean = false;\n\t/* Protected */\n\n\n\tpublic get content():DisplayObject\n\t{\n\t\treturn this._pContent;\n\t}\n\n\t/**\n\t * Creates a new ParserBase object\n\t * @param format The data format of the file data to be parsed. Can be either ParserDataFormat.BINARY or ParserDataFormat.PLAIN_TEXT, and should be provided by the concrete subtype.\n\t *\n\t * @see away.loading.parsers.ParserDataFormat\n\t */\n\tconstructor(format:string)\n\t{\n\t\tsuper();\n\n\t\tthis._materialMode = 0;\n\t\tthis._dataFormat = format;\n\t\tthis._dependencies = new Array();\n\n\t\tthis._pOnIntervalDelegate = (event:TimerEvent) => this._pOnInterval(event);\n\t}\n\n\t/**\n\t * Validates a bitmapData loaded before assigning to a default BitmapMaterial\n\t */\n\n\tpublic isBitmapDataValid(bitmapData:BitmapData):boolean\n\t{\n\t\tvar isValid:boolean = TextureUtils.isBitmapDataValid(bitmapData);\n\n\t\tif (!isValid) {\n\n\t\t\tconsole.log(\">> Bitmap loaded is not having power of 2 dimensions or is higher than 2048\");\n\t\t}\n\n\t\treturn isValid;\n\t}\n\n\tpublic set parsingFailure(b:boolean)\n\t{\n\t\tthis._parsingFailure = b;\n\t}\n\n\tpublic get parsingFailure():boolean\n\t{\n\t\treturn this._parsingFailure;\n\t}\n\n\tpublic get parsingPaused():boolean\n\t{\n\t\treturn this._parsingPaused;\n\t}\n\n\tpublic get parsingComplete():boolean\n\t{\n\t\treturn this._parsingComplete;\n\t}\n\n\tpublic set materialMode(newMaterialMode:number)\n\t{\n\t\tthis._materialMode = newMaterialMode;\n\t}\n\n\tpublic get materialMode():number\n\t{\n\t\treturn this._materialMode;\n\t}\n\n\tpublic get data():any\n\t{\n\t\treturn this._data;\n\t}\n\n\t/**\n\t * The data format of the file data to be parsed. Options are URLLoaderDataFormat.BINARY, URLLoaderDataFormat.ARRAY_BUFFER, URLLoaderDataFormat.BLOB, URLLoaderDataFormat.VARIABLES or URLLoaderDataFormat.TEXT.\n\t */\n\tpublic get dataFormat():string\n\t{\n\t\treturn this._dataFormat;\n\t}\n\n\t/**\n\t * Parse data (possibly containing bytearry, plain text or BitmapAsset) asynchronously, meaning that\n\t * the parser will periodically stop parsing so that the AVM may proceed to the\n\t * next frame.\n\t *\n\t * @param data The untyped data object in which the loaded data resides.\n\t * @param frameLimit number of milliseconds of parsing allowed per frame. The\n\t * actual time spent on a frame can exceed this number since time-checks can\n\t * only be performed between logical sections of the parsing procedure.\n\t */\n\tpublic parseAsync(data:any, frameLimit:number = 30)\n\t{\n\t\tthis._data = data;\n\t\tthis._pStartParsing(frameLimit);\n\t}\n\n\t/**\n\t * A list of dependencies that need to be loaded and resolved for the object being parsed.\n\t */\n\tpublic get dependencies():Array\n\t{\n\t\treturn this._dependencies;\n\t}\n\n\t/**\n\t * Resolve a dependency when it's loaded. For example, a dependency containing an ImageResource would be assigned\n\t * to a Mesh instance as a BitmapMaterial, a scene graph object would be added to its intended parent. The\n\t * dependency should be a member of the dependencies property.\n\t *\n\t * @param resourceDependency The dependency to be resolved.\n\t */\n\tpublic _iResolveDependency(resourceDependency:ResourceDependency)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t * Resolve a dependency loading failure. Used by parser to eventually provide a default map\n\t *\n\t * @param resourceDependency The dependency to be resolved.\n\t */\n\tpublic _iResolveDependencyFailure(resourceDependency:ResourceDependency)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t * Resolve a dependency name\n\t *\n\t * @param resourceDependency The dependency to be resolved.\n\t */\n\tpublic _iResolveDependencyName(resourceDependency:ResourceDependency, asset:IAsset):string\n\t{\n\t\treturn asset.name;\n\t}\n\n\tpublic _iResumeParsingAfterDependencies()\n\t{\n\t\tthis._parsingPaused = false;\n\n\t\tif (this._timer)\n\t\t\tthis._timer.start();\n\t}\n\n\tpublic _pFinalizeAsset(asset:IAsset, name:string = null)\n\t{\n\t\tvar type_event:string;\n\t\tvar type_name:string;\n\n\t\tif (name != null)\n\t\t\tasset.name = name;\n\n\t\t// If the asset has no name, give it\n\t\t// a per-type default name.\n\t\tif (!asset.name)\n\t\t\tasset.name = asset.assetType;\n\n\t\tthis.dispatchEvent(new AssetEvent(AssetEvent.ASSET_COMPLETE, asset));\n\t}\n\n\t/**\n\t * Parse the next block of data.\n\t * @return Whether or not more data needs to be parsed. Can be ParserBase.ParserBase.PARSING_DONE or\n\t * ParserBase.ParserBase.MORE_TO_PARSE.\n\t */\n\tpublic _pProceedParsing():boolean\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic _pDieWithError(message:string = 'Unknown parsing error')\n\t{\n\t\tif (this._timer) {\n\t\t\tthis._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate);\n\t\t\tthis._timer.stop();\n\t\t\tthis._timer = null;\n\t\t}\n\n\t\tthis.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message));\n\t}\n\n\tpublic _pAddDependency(id:string, req:URLRequest, retrieveAsRawData:boolean = false, data:any = null, suppressErrorEvents:boolean = false):ResourceDependency\n\t{\n\t\tvar dependency:ResourceDependency = new ResourceDependency(id, req, data, null, this, retrieveAsRawData, suppressErrorEvents);\n\t\tthis._dependencies.push(dependency);\n\n\t\treturn dependency;\n\t}\n\n\tpublic _pPauseAndRetrieveDependencies()\n\t{\n\t\tif (this._timer)\n\t\t\tthis._timer.stop();\n\n\t\tthis._parsingPaused = true;\n\t\tthis.dispatchEvent(new ParserEvent(ParserEvent.READY_FOR_DEPENDENCIES));\n\t}\n\n\t/**\n\t * Tests whether or not there is still time left for parsing within the maximum allowed time frame per session.\n\t * @return True if there is still time left, false if the maximum allotted time was exceeded and parsing should be interrupted.\n\t */\n\tpublic _pHasTime():boolean\n\t{\n\t\treturn ((getTimer() - this._lastFrameTime) < this._frameLimit);\n\t}\n\n\t/**\n\t * Called when the parsing pause interval has passed and parsing can proceed.\n\t */\n\tpublic _pOnInterval(event:TimerEvent = null)\n\t{\n\t\tthis._lastFrameTime = getTimer();\n\n\t\tif (this._pProceedParsing() && !this._parsingFailure)\n\t\t\tthis._pFinishParsing();\n\t}\n\n\t/**\n\t * Initializes the parsing of data.\n\t * @param frameLimit The maximum duration of a parsing session.\n\t */\n\tpublic _pStartParsing(frameLimit:number)\n\t{\n\t\tthis._frameLimit = frameLimit;\n\t\tthis._timer = new Timer(this._frameLimit, 0);\n\t\tthis._timer.addEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate);\n\t\tthis._timer.start();\n\t}\n\n\t/**\n\t * Finish parsing the data.\n\t */\n\tpublic _pFinishParsing()\n\t{\n\t\tif (this._timer) {\n\t\t\tthis._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate);\n\t\t\tthis._timer.stop();\n\t\t}\n\n\t\tthis._timer = null;\n\t\tthis._parsingComplete = true;\n\n\t\tthis.dispatchEvent(new ParserEvent(ParserEvent.PARSE_COMPLETE));\n\t}\n\n\t/**\n\t *\n\t * @returns {string}\n\t * @private\n\t */\n\tpublic _pGetTextData():string\n\t{\n\t\treturn ParserUtils.toString(this._data);\n\t}\n\n\t/**\n\t *\n\t * @returns {string}\n\t * @private\n\t */\n\tpublic _pGetByteData():ByteArray\n\t{\n\t\treturn ParserUtils.toByteArray(this._data);\n\t}\n}\n\nexport = ParserBase;", + "/**\n * An enumeration providing values to describe the data format of parsed data.\n */\nclass ParserDataFormat\n{\n\t/**\n\t * Describes the format of a binary file.\n\t */\n\tpublic static BINARY:string = \"binary\";\n\n\t/**\n\t * Describes the format of a plain text file.\n\t */\n\tpublic static PLAIN_TEXT:string = \"plainText\";\n\n\t/**\n\t * Describes the format of an image file\n\t */\n\tpublic static IMAGE:string = \"image\";\n\n}\n\nexport = ParserDataFormat;", + "import ByteArray\t\t\t\t= require(\"awayjs-core/lib/utils/ByteArray\");\n\nclass ParserUtils\n{\n\n\t/**\n\t * Converts an ArrayBuffer to a base64 string\n\t *\n\t * @param image data as a ByteArray\n\t *\n\t * @return HTMLImageElement\n\t *\n\t */\n\tpublic static arrayBufferToImage(data:ArrayBuffer):HTMLImageElement\n\t{\n\t\tvar byteStr:string = '';\n\t\tvar bytes:Uint8Array = new Uint8Array(data);\n\t\tvar len:number = bytes.byteLength;\n\n\t\tfor (var i = 0; i < len; i++)\n\t\t\tbyteStr += String.fromCharCode(bytes[ i ])\n\n\t\tvar base64Image:string = window.btoa(byteStr);\n\t\tvar str:string = 'data:image/png;base64,' + base64Image;\n\t\tvar img:HTMLImageElement = new Image();\n\t\timg.src = str;\n\n\t\treturn img;\n\t}\n\n\t/**\n\t * Converts an ByteArray to an Image - returns an HTMLImageElement\n\t *\n\t * @param image data as a ByteArray\n\t *\n\t * @return HTMLImageElement\n\t *\n\t */\n\tpublic static byteArrayToImage(data:ByteArray):HTMLImageElement\n\t{\n\t\tvar byteStr:string = '';\n\t\tvar bytes:Uint8Array = new Uint8Array(data.arraybytes);\n\t\tvar len:number = bytes.byteLength;\n\n\t\tfor (var i = 0; i < len; i++)\n\t\t\tbyteStr += String.fromCharCode(bytes[ i ])\n\n\t\tvar base64Image:string = window.btoa(byteStr);\n\t\tvar str:string = 'data:image/png;base64,' + base64Image;\n\t\tvar img:HTMLImageElement = new Image();\n\t\timg.src = str;\n\n\t\treturn img;\n\t}\n\n\t/**\n\t * Converts an Blob to an Image - returns an HTMLImageElement\n\t *\n\t * @param image data as a Blob\n\t *\n\t * @return HTMLImageElement\n\t *\n\t */\n\tpublic static blobToImage(data:Blob):HTMLImageElement\n\t{\n\t\tvar URLObj:URL = window['URL'] || window['webkitURL'];\n\t\tvar src = URLObj.createObjectURL(data);\n\t\tvar img:HTMLImageElement = new Image();\n\t\timg.src = src;\n\n\t\treturn img;\n\t}\n\n\t/**\n\t * Returns a object as ByteArray, if possible.\n\t *\n\t * @param data The object to return as ByteArray\n\t *\n\t * @return The ByteArray or null\n\t *\n\t */\n\tpublic static toByteArray(data:any):ByteArray\n\t{\n\t\tvar b:ByteArray = new ByteArray();\n\t\tb.setArrayBuffer(data);\n\t\treturn b;\n\t}\n\n\t/**\n\t * Returns a object as String, if possible.\n\t *\n\t * @param data The object to return as String\n\t * @param length The length of the returned String\n\t *\n\t * @return The String or null\n\t *\n\t */\n\tpublic static toString(data:any, length:number = 0):string\n\t{\n\n\t\tif (typeof data === 'string') {\n\t\t\tvar s:string = data;\n\n\t\t\tif (s['substr'] != null)\n\t\t\t\treturn s.substr(0, s.length);\n\t\t}\n\n\t\tif (data instanceof ByteArray) {\n\t\t\tvar ba:ByteArray = data;\n\t\t\tba.position = 0;\n\t\t\treturn ba.readUTFBytes(Math.min(ba.getBytesAvailable(), length));\n\t\t}\n\n\t\treturn null;\n\n\t\t/*\n\t\t var ba:ByteArray;\n\n\t\t length ||= uint.MAX_VALUE;\n\n\t\t if (data is String)\n\t\t return String(data).substr(0, length);\n\n\t\t ba = toByteArray(data);\n\t\t if (ba) {\n\t\t ba.position = 0;\n\t\t return ba.readUTFBytes(Math.min(ba.bytesAvailable, length));\n\t\t }\n\n\t\t return null;\n\n\t\t */\n\n\t}\n}\n\nexport = ParserUtils;", + "import IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport URLLoader\t\t\t\t= require(\"awayjs-core/lib/core/net/URLLoader\");\nimport URLRequest\t\t\t\t= require(\"awayjs-core/lib/core/net/URLRequest\");\nimport ParserBase\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserBase\");\n\n/**\n * ResourceDependency represents the data required to load, parse and resolve additional files (\"dependencies\")\n * required by a parser, used by ResourceLoadSession.\n *\n */\nclass ResourceDependency\n{\n\tprivate _id:string;\n\tprivate _request:URLRequest;\n\tprivate _assets:Array;\n\tprivate _parser:ParserBase;\n\tprivate _parentParser:ParserBase;\n\tprivate _data:any;\n\tprivate _retrieveAsRawData:boolean;\n\tprivate _suppressAssetEvents:boolean;\n\tprivate _dependencies:Array;\n\n\tpublic _iLoader:URLLoader;\n\tpublic _iSuccess:boolean;\n\n\n\tconstructor(id:string, request:URLRequest, data:any, parser:ParserBase, parentParser:ParserBase, retrieveAsRawData:boolean = false, suppressAssetEvents:boolean = false)\n\t{\n\t\tthis._id = id;\n\t\tthis._request = request;\n\t\tthis._data = data;\n\t\tthis._parser = parser;\n\t\tthis._parentParser = parentParser;\n\t\tthis._retrieveAsRawData = retrieveAsRawData;\n\t\tthis._suppressAssetEvents = suppressAssetEvents;\n\n\t\tthis._assets = new Array();\n\t\tthis._dependencies = new Array();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get id():string\n\t{\n\t\treturn this._id;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get request():URLRequest\n\t{\n\t\treturn this._request;\n\t}\n\n\t/**\n\t * The data containing the dependency to be parsed, if the resource was already loaded.\n\t */\n\tpublic get data():any\n\t{\n\t\treturn this._data;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get parser():ParserBase\n\t{\n\t\treturn this._parser;\n\t}\n\n\t/**\n\t * The parser which is dependent on this ResourceDependency object.\n\t */\n\tpublic get parentParser():ParserBase\n\t{\n\t\treturn this._parentParser;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get retrieveAsRawData():boolean\n\t{\n\t\treturn this._retrieveAsRawData;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get suppresAssetEvents():boolean\n\t{\n\t\treturn this._suppressAssetEvents;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get assets():Array\n\t{\n\t\treturn this._assets;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get dependencies():Array\n\t{\n\t\treturn this._dependencies;\n\t}\n\n\t/**\n\t * @private\n\t * Method to set data after having already created the dependency object, e.g. after load.\n\t */\n\tpublic _iSetData(data:any):void\n\t{\n\t\tthis._data = data;\n\t}\n\n\t/**\n\t * @private\n\t *\n\t */\n\tpublic _iSetParser(parser:ParserBase):void\n\t{\n\t\tthis._parser = parser;\n\t}\n\n\t/**\n\t * Resolve the dependency when it's loaded with the parent parser. For example, a dependency containing an\n\t * ImageResource would be assigned to a Mesh instance as a BitmapMaterial, a scene graph object would be added\n\t * to its intended parent. The dependency should be a member of the dependencies property.\n\t */\n\tpublic resolve():void\n\t{\n\t\tif (this._parentParser)\n\t\t\tthis._parentParser._iResolveDependency(this);\n\t}\n\n\t/**\n\t * Resolve a dependency failure. For example, map loading failure from a 3d file\n\t */\n\tpublic resolveFailure():void\n\t{\n\t\tif (this._parentParser)\n\t\t\tthis._parentParser._iResolveDependencyFailure(this);\n\t}\n\n\t/**\n\t * Resolve the dependencies name\n\t */\n\tpublic resolveName(asset:IAsset):string\n\t{\n\t\tif (this._parentParser)\n\t\t\treturn this._parentParser._iResolveDependencyName(this, asset);\n\n\t\treturn asset.name;\n\t}\n}\n\nexport = ResourceDependency;", + "import IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport URLLoaderDataFormat\t\t= require(\"awayjs-core/lib/core/net/URLLoaderDataFormat\");\nimport Billboard\t\t\t\t= require(\"awayjs-core/lib/entities/Billboard\");\nimport CSSMaterialBase\t\t\t= require(\"awayjs-core/lib/materials/CSSMaterialBase\");\nimport ParserBase\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserBase\");\nimport ParserUtils\t\t\t\t= require(\"awayjs-core/lib/parsers/ParserUtils\");\nimport ImageTexture\t\t\t\t= require(\"awayjs-core/lib/textures/ImageTexture\");\nimport Texture2DBase\t\t\t= require(\"awayjs-core/lib/textures/Texture2DBase\");\nimport ByteArray\t\t\t\t= require(\"awayjs-core/lib/utils/ByteArray\");\nimport TextureUtils\t\t\t\t= require(\"awayjs-core/lib/utils/TextureUtils\");\n\n/**\n * Texture2DParser provides a \"parser\" for natively supported image types (jpg, png). While it simply loads bytes into\n * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without\n * exception cases.\n */\nclass Texture2DParser extends ParserBase\n{\n\tprivate _startedParsing:boolean;\n\tprivate _doneParsing:boolean;\n\tprivate _loadingImage:boolean;\n\tprivate _htmlImageElement:HTMLImageElement;\n\n\t/**\n\t * Creates a new Texture2DParser object.\n\t * @param uri The url or id of the data or file to be parsed.\n\t * @param extra The holder for extra contextual data that the parser might need.\n\t */\n\tconstructor()\n\t{\n\t\tsuper(URLLoaderDataFormat.BLOB);\n\t}\n\n\t/**\n\t * Indicates whether or not a given file extension is supported by the parser.\n\t * @param extension The file extension of a potential file to be parsed.\n\t * @return Whether or not the given file type is supported.\n\t */\n\tpublic static supportsType(extension:string):boolean\n\t{\n\n\t\textension = extension.toLowerCase();\n\t\treturn extension == \"jpg\" || extension == \"jpeg\" || extension == \"png\" || extension == \"gif\";//|| extension == \"bmp\";//|| extension == \"atf\";\n\n\t}\n\n\t/**\n\t * Tests whether a data block can be parsed by the parser.\n\t * @param data The data block to potentially be parsed.\n\t * @return Whether or not the given data is supported.\n\t */\n\tpublic static supportsData(data:any):boolean\n\t{\n\n\t\tif (data instanceof HTMLImageElement)\n\t\t\treturn true;\n\n\t\tif (!(data instanceof ByteArray))\n\t\t\treturn false;\n\n\t\tvar ba:ByteArray = data;\n\t\tba.position = 0;\n\n\t\tif (ba.readUnsignedShort() == 0xffd8)\n\t\t\treturn true; // JPEG, maybe check for \"JFIF\" as well?\n\n\t\tba.position = 0;\n\t\tif (ba.readShort() == 0x424D)\n\t\t\treturn true; // BMP\n\n\t\tba.position = 1;\n\t\tif (ba.readUTFBytes(3) == 'PNG')\n\t\t\treturn true;\n\n\t\tba.position = 0;\n\t\tif (ba.readUTFBytes(3) == 'GIF' && ba.readShort() == 0x3839 && ba.readByte() == 0x61)\n\t\t\treturn true;\n\n\t\tba.position = 0;\n\t\tif (ba.readUTFBytes(3) == 'ATF')\n\t\t\treturn true;\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pProceedParsing():boolean\n\t{\n\n\t\tvar asset:Texture2DBase;\n\t\tvar sizeError:boolean = false;\n\n\t\tif (this._loadingImage) {\n\t\t\treturn ParserBase.MORE_TO_PARSE;\n\t\t} else if (this._htmlImageElement) {\n\t\t\tif (TextureUtils.isHTMLImageElementValid(this._htmlImageElement)) {\n\t\t\t\tasset = new ImageTexture(this._htmlImageElement);\n\t\t\t\tthis._pFinalizeAsset( asset, this._iFileName);\n\t\t\t}\n\t\t} else if (this.data instanceof HTMLImageElement) {// Parse HTMLImageElement\n\n\t\t\tif (TextureUtils.isHTMLImageElementValid( this.data)) {\n\t\t\t\tasset = new ImageTexture( this.data);\n\t\t\t\tthis._pFinalizeAsset( asset, this._iFileName);\n\t\t\t} else {\n\t\t\t\tsizeError = true;\n\t\t\t}\n\n\t\t} else if (this.data instanceof ByteArray) { // Parse a ByteArray\n\n\t\t\tvar ba:ByteArray = this.data;\n\t\t\tba.position = 0;\n\t\t\tvar htmlImageElement:HTMLImageElement = ParserUtils.byteArrayToImage(this.data);\n\n\t\t\tif (TextureUtils.isHTMLImageElementValid(htmlImageElement)) {\n\t\t\t\tasset = new ImageTexture(htmlImageElement);\n\t\t\t\tthis._pFinalizeAsset( asset, this._iFileName);\n\t\t\t} else {\n\t\t\t\tsizeError = true;\n\t\t\t}\n\n\t\t} else if (this.data instanceof ArrayBuffer) {// Parse an ArrayBuffer\n\n\t\t\tthis._htmlImageElement = ParserUtils.arrayBufferToImage(this.data);\n\n\t\t\tasset = new ImageTexture(this._htmlImageElement);\n\t\t\tthis._pFinalizeAsset( asset, this._iFileName);\n\n\t\t} else if (this.data instanceof Blob) { // Parse a Blob\n\n\t\t\tthis._htmlImageElement = ParserUtils.blobToImage(this.data);\n\n\t\t\tthis._htmlImageElement.onload = (event) => this.onLoadComplete(event);\n\t\t\tthis._loadingImage = true;\n\n\t\t\treturn ParserBase.MORE_TO_PARSE;\n\t\t}\n\n\t\tif (sizeError == true) // Generate new Checkerboard texture material\n\t\t{\n//\t\t\t\tasset = new BitmapTexture(DefaultMaterialManager.createCheckeredBitmapData(), false);\n//\t\t\t\tthis._pFinalizeAsset( asset, this._iFileName);\n//\t\t\t\tthis.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.TEXTURE_SIZE_ERROR, asset));\n\t\t}\n\n\t\tthis._pContent = new Billboard(new CSSMaterialBase(asset));\n\n\t\treturn ParserBase.PARSING_DONE;\n\n\t}\n\n\tpublic onLoadComplete(event)\n\t{\n\t\tthis._loadingImage = false;\n\t}\n}\n\nexport = Texture2DParser;", + "import DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\n\n/**\n * PrefabBase is an abstract base class for prefabs, which are prebuilt display objects that allow easy cloning and updating\n */\nclass PrefabBase extends NamedAssetBase\n{\n\tpublic _pObjects:Array = new Array();\n\n//\t\tpublic _pBatchObjects:Array = new Array();\n\n\t/**\n\t * Creates a new PrefabBase object.\n\t */\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\t/**\n\t * Returns a display object generated from this prefab\n\t */\n\tpublic getNewObject():DisplayObject\n\t{\n\t\tvar object:DisplayObject = this._pCreateObject();\n\n\t\tthis._pObjects.push(object);\n\n\t\treturn object;\n\t}\n\n//\t\tpublic getNewBatchObject():BatchObject\n//\t\t{\n//\t\t\tvar object:BatchObject = this._pCreateBatchObject();\n//\n//\t\t\tthis._pBatchObjects.push(object);\n//\n//\t\t\treturn object;\n//\t\t}\n\n\tpublic _pCreateObject():DisplayObject\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic _iValidate()\n\t{\n\t\t// To be overridden when necessary\n\t}\n}\n\nexport = PrefabBase;", + "import LineSubGeometry\t\t\t= require(\"awayjs-core/lib/core/base/LineSubGeometry\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport PrimitivePrefabBase\t\t= require(\"awayjs-core/lib/prefabs/PrimitivePrefabBase\");\n\n/**\n * A Capsule primitive mesh.\n */\nclass PrimitiveCapsulePrefab extends PrimitivePrefabBase implements IAsset\n{\n\tprivate _radius:number;\n\tprivate _height:number;\n\tprivate _segmentsW:number;\n\tprivate _segmentsH:number;\n\tprivate _yUp:boolean;\n\tprivate _numVertices:number = 0;\n\n\t/**\n\t * The radius of the capsule.\n\t */\n\tpublic get radius():number\n\t{\n\t\treturn this._radius;\n\t}\n\n\tpublic set radius(value:number)\n\t{\n\t\tthis._radius = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The height of the capsule.\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._height;\n\t}\n\n\tpublic set height(value:number)\n\t{\n\t\tthis._height = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Defines the number of horizontal segments that make up the capsule. Defaults to 16.\n\t */\n\tpublic get segmentsW():number\n\t{\n\t\treturn this._segmentsW;\n\t}\n\n\tpublic set segmentsW(value:number)\n\t{\n\t\tthis._segmentsW = value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven.\n\t */\n\tpublic get segmentsH():number\n\t{\n\t\treturn this._segmentsH;\n\t}\n\n\tpublic set segmentsH(value:number)\n\t{\n\t\tthis._segmentsH = (value%2 == 0)? value + 1 : value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tpublic get yUp():boolean\n\t{\n\t\treturn this._yUp;\n\t}\n\n\tpublic set yUp(value:boolean)\n\t{\n\t\tthis._yUp = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Creates a new Capsule object.\n\t * @param radius The radius of the capsule.\n\t * @param height The height of the capsule.\n\t * @param segmentsW Defines the number of horizontal segments that make up the capsule. Defaults to 16.\n\t * @param segmentsH Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven value.\n\t * @param yUp Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tconstructor(radius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 15, yUp:boolean = true)\n\t{\n\t\tsuper();\n\n\t\tthis._radius = radius;\n\t\tthis._height = height;\n\t\tthis._segmentsW = segmentsW;\n\t\tthis._segmentsH = (segmentsH%2 == 0)? segmentsH + 1 : segmentsH;\n\t\tthis._yUp = yUp;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildGeometry(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar indices:Array /*uint*/;\n\t\tvar positions:Array;\n\t\tvar normals:Array;\n\t\tvar tangents:Array;\n\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar triIndex:number = 0;\n\t\tvar index:number = 0;\n\t\tvar startIndex:number;\n\t\tvar comp1:number, comp2:number, t1:number, t2:number;\n\t\tvar numIndices:number = 0;\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\t// evaluate target number of vertices, triangles and indices\n\t\t\tthis._numVertices = (this._segmentsH + 1)*(this._segmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of closure\n\t\t\tnumIndices = (this._segmentsH - 1)*this._segmentsW*6; // each level has segmentH quads, each of 2 triangles\n\n\t\t\t// need to initialize raw arrays or can be reused?\n\t\t\tif (this._numVertices == triangleGeometry.numVertices) {\n\t\t\t\tindices = triangleGeometry.indices;\n\t\t\t\tpositions = triangleGeometry.positions;\n\t\t\t\tnormals = triangleGeometry.vertexNormals;\n\t\t\t\ttangents = triangleGeometry.vertexTangents;\n\t\t\t} else {\n\t\t\t\tindices = new Array(numIndices)\n\t\t\t\tpositions = new Array(this._numVertices*3);\n\t\t\t\tnormals = new Array(this._numVertices*3);\n\t\t\t\ttangents = new Array(this._numVertices*3);\n\n\t\t\t\tthis._pInvalidateUVs();\n\t\t\t}\n\n\t\t\tfor (j = 0; j <= this._segmentsH; ++j) {\n\n\t\t\t\tvar horangle:number = Math.PI*j/this._segmentsH;\n\t\t\t\tvar z:number = -this._radius*Math.cos(horangle);\n\t\t\t\tvar ringradius:number = this._radius*Math.sin(horangle);\n\n\t\t\t\tstartIndex = index;\n\n\t\t\t\tfor (i = 0; i <= this._segmentsW; ++i) {\n\t\t\t\t\tvar verangle:number = 2*Math.PI*i/this._segmentsW;\n\t\t\t\t\tvar x:number = ringradius*Math.cos(verangle);\n\t\t\t\t\tvar offset:number = j > this._segmentsH/2? this._height/2 : -this._height/2;\n\t\t\t\t\tvar y:number = ringradius*Math.sin(verangle);\n\t\t\t\t\tvar normLen:number = 1/Math.sqrt(x*x + y*y + z*z);\n\t\t\t\t\tvar tanLen:number = Math.sqrt(y*y + x*x);\n\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tt1 = 0;\n\t\t\t\t\t\tt2 = tanLen > .007? x/tanLen : 0;\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = y;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt1 = tanLen > .007? x/tanLen : 0;\n\t\t\t\t\t\tt2 = 0;\n\t\t\t\t\t\tcomp1 = y;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i == this._segmentsW) {\n\n\t\t\t\t\t\tpositions[index] = positions[startIndex];\n\t\t\t\t\t\tpositions[index + 1] = positions[startIndex + 1];\n\t\t\t\t\t\tpositions[index + 2] = positions[startIndex + 2];\n\t\t\t\t\t\tnormals[index] = (normals[startIndex] + (x*normLen))*.5;\n\t\t\t\t\t\tnormals[index + 1] = (normals[startIndex + 1] + ( comp1*normLen))*.5;\n\t\t\t\t\t\tnormals[index + 2] = (normals[startIndex + 2] + (comp2*normLen))*.5;\n\t\t\t\t\t\ttangents[index] = (tangents[startIndex] + (tanLen > .007? -y/tanLen : 1))*.5;\n\t\t\t\t\t\ttangents[index + 1] = (tangents[startIndex + 1] + t1)*.5;\n\t\t\t\t\t\ttangents[index + 2] = (tangents[startIndex + 2] + t2)*.5;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// vertex\n\t\t\t\t\t\tpositions[index] = x;\n\t\t\t\t\t\tpositions[index + 1] = (this._yUp)? comp1 - offset : comp1;\n\t\t\t\t\t\tpositions[index + 2] = (this._yUp)? comp2 : comp2 + offset;\n\t\t\t\t\t\t// normal\n\t\t\t\t\t\tnormals[index] = x*normLen;\n\t\t\t\t\t\tnormals[index + 1] = comp1*normLen;\n\t\t\t\t\t\tnormals[index + 2] = comp2*normLen;\n\t\t\t\t\t\t// tangent\n\t\t\t\t\t\ttangents[index] = tanLen > .007? -y/tanLen : 1;\n\t\t\t\t\t\ttangents[index + 1] = t1;\n\t\t\t\t\t\ttangents[index + 2] = t2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i > 0 && j > 0) {\n\t\t\t\t\t\tvar a:number = (this._segmentsW + 1)*j + i;\n\t\t\t\t\t\tvar b:number = (this._segmentsW + 1)*j + i - 1;\n\t\t\t\t\t\tvar c:number = (this._segmentsW + 1)*(j - 1) + i - 1;\n\t\t\t\t\t\tvar d:number = (this._segmentsW + 1)*(j - 1) + i;\n\n\t\t\t\t\t\tif (j == this._segmentsH) {\n\t\t\t\t\t\t\tpositions[index] = positions[startIndex];\n\t\t\t\t\t\t\tpositions[index + 1] = positions[startIndex + 1];\n\t\t\t\t\t\t\tpositions[index + 2] = positions[startIndex + 2];\n\n\t\t\t\t\t\t\tindices[triIndex++] = a;\n\t\t\t\t\t\t\tindices[triIndex++] = c;\n\t\t\t\t\t\t\tindices[triIndex++] = d;\n\n\t\t\t\t\t\t} else if (j == 1) {\n\t\t\t\t\t\t\tindices[triIndex++] = a;\n\t\t\t\t\t\t\tindices[triIndex++] = b;\n\t\t\t\t\t\t\tindices[triIndex++] = c;\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindices[triIndex++] = a;\n\t\t\t\t\t\t\tindices[triIndex++] = b;\n\t\t\t\t\t\t\tindices[triIndex++] = c;\n\t\t\t\t\t\t\tindices[triIndex++] = a;\n\t\t\t\t\t\t\tindices[triIndex++] = c;\n\t\t\t\t\t\t\tindices[triIndex++] = d;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tindex += 3;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\ttriangleGeometry.updateIndices(indices);\n\n\t\t\ttriangleGeometry.updatePositions(positions);\n\t\t\ttriangleGeometry.updateVertexNormals(normals);\n\t\t\ttriangleGeometry.updateVertexTangents(tangents);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\t//TODO\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildUVs(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar i:number, j:number;\n\t\tvar uvs:Array;\n\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\t// need to initialize raw array or can be reused?\n\t\t\tif (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) {\n\t\t\t\tuvs = triangleGeometry.uvs;\n\t\t\t} else {\n\t\t\t\tuvs = new Array(this._numVertices*2);\n\t\t\t}\n\n\t\t\t// current uv component index\n\t\t\tvar index:number = 0;\n\n\t\t\t// surface\n\t\t\tfor (j = 0; j <= this._segmentsH; ++j) {\n\t\t\t\tfor (i = 0; i <= this._segmentsW; ++i) {\n\t\t\t\t\t// revolution vertex\n\t\t\t\t\tuvs[index++] = ( i/this._segmentsW )*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( j/this._segmentsH )*triangleGeometry.scaleV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\ttriangleGeometry.updateUVs(uvs);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\t//nothing to do here\n\t\t}\n\t}\n}\n\nexport = PrimitiveCapsulePrefab;", + "import IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport PrimitiveCylinderPrefab\t= require(\"awayjs-core/lib/prefabs/PrimitiveCylinderPrefab\");\n\n/**\n * A UV Cone primitive mesh.\n */\nclass PrimitiveConePrefab extends PrimitiveCylinderPrefab implements IAsset\n{\n\n\t/**\n\t * The radius of the bottom end of the cone.\n\t */\n\tpublic get radius():number\n\t{\n\t\treturn this._pBottomRadius;\n\t}\n\n\tpublic set radius(value:number)\n\t{\n\t\tthis._pBottomRadius = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Creates a new Cone object.\n\t * @param radius The radius of the bottom end of the cone\n\t * @param height The height of the cone\n\t * @param segmentsW Defines the number of horizontal segments that make up the cone. Defaults to 16.\n\t * @param segmentsH Defines the number of vertical segments that make up the cone. Defaults to 1.\n\t * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tconstructor(radius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 1, closed:boolean = true, yUp:boolean = true)\n\t{\n\t\tsuper(0, radius, height, segmentsW, segmentsH, false, closed, true, yUp);\n\t}\n}\n\nexport = PrimitiveConePrefab;", + "import LineSubGeometry\t\t\t= require(\"awayjs-core/lib/core/base/LineSubGeometry\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport PrimitivePrefabBase\t\t= require(\"awayjs-core/lib/prefabs/PrimitivePrefabBase\");\n\n/**\n * A Cube primitive prefab.\n */\nclass PrimitiveCubePrefab extends PrimitivePrefabBase implements IAsset\n{\n\tprivate _width:number;\n\tprivate _height:number;\n\tprivate _depth:number;\n\tprivate _tile6:boolean;\n\n\tprivate _segmentsW:number;\n\tprivate _segmentsH:number;\n\tprivate _segmentsD:number;\n\n\t/**\n\t * Creates a new Cube object.\n\t * @param width The size of the cube along its X-axis.\n\t * @param height The size of the cube along its Y-axis.\n\t * @param depth The size of the cube along its Z-axis.\n\t * @param segmentsW The number of segments that make up the cube along the X-axis.\n\t * @param segmentsH The number of segments that make up the cube along the Y-axis.\n\t * @param segmentsD The number of segments that make up the cube along the Z-axis.\n\t * @param tile6 The type of uv mapping to use. When true, a texture will be subdivided in a 2x3 grid, each used for a single face. When false, the entire image is mapped on each face.\n\t */\n\tconstructor(width:number = 100, height:number = 100, depth:number = 100, segmentsW:number = 1, segmentsH:number = 1, segmentsD:number = 1, tile6:boolean = true)\n\t{\n\t\tsuper();\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\t\tthis._depth = depth;\n\t\tthis._segmentsW = segmentsW;\n\t\tthis._segmentsH = segmentsH;\n\t\tthis._segmentsD = segmentsD;\n\t\tthis._tile6 = tile6;\n\t}\n\n\t/**\n\t * The size of the cube along its X-axis.\n\t */\n\tpublic get width():number\n\t{\n\t\treturn this._width;\n\t}\n\n\tpublic set width(value:number)\n\t{\n\t\tthis._width = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The size of the cube along its Y-axis.\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._height;\n\t}\n\n\tpublic set height(value:number)\n\t{\n\t\tthis._height = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The size of the cube along its Z-axis.\n\t */\n\tpublic get depth():number\n\t{\n\t\treturn this._depth;\n\t}\n\n\tpublic set depth(value:number)\n\t{\n\t\tthis._depth = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The type of uv mapping to use. When false, the entire image is mapped on each face.\n\t * When true, a texture will be subdivided in a 3x2 grid, each used for a single face.\n\t * Reading the tiles from left to right, top to bottom they represent the faces of the\n\t * cube in the following order: bottom, top, back, left, front, right. This creates\n\t * several shared edges (between the top, front, left and right faces) which simplifies\n\t * texture painting.\n\t */\n\tpublic get tile6():boolean\n\t{\n\t\treturn this._tile6;\n\t}\n\n\tpublic set tile6(value:boolean)\n\t{\n\t\tthis._tile6 = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The number of segments that make up the cube along the X-axis. Defaults to 1.\n\t */\n\tpublic get segmentsW():number\n\t{\n\t\treturn this._segmentsW;\n\t}\n\n\tpublic set segmentsW(value:number)\n\t{\n\t\tthis._segmentsW = value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * The number of segments that make up the cube along the Y-axis. Defaults to 1.\n\t */\n\tpublic get segmentsH():number\n\t{\n\t\treturn this._segmentsH;\n\t}\n\n\tpublic set segmentsH(value:number)\n\t{\n\t\tthis._segmentsH = value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * The number of segments that make up the cube along the Z-axis. Defaults to 1.\n\t */\n\tpublic get segmentsD():number\n\t{\n\t\treturn this._segmentsD;\n\t}\n\n\tpublic set segmentsD(value:number)\n\t{\n\t\tthis._segmentsD = value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildGeometry(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar indices:Array /*uint*/;\n\t\tvar positions:Array;\n\t\tvar normals:Array;\n\t\tvar tangents:Array;\n\n\t\tvar tl:number, tr:number, bl:number, br:number;\n\t\tvar i:number, j:number, inc:number = 0;\n\n\t\tvar vidx:number, fidx:number; // indices\n\t\tvar hw:number, hh:number, hd:number; // halves\n\t\tvar dw:number, dh:number, dd:number; // deltas\n\n\t\tvar outer_pos:number;\n\t\tvar numIndices:number;\n\t\tvar numVertices:number;\n\n\t\t// half cube dimensions\n\t\thw = this._width/2;\n\t\thh = this._height/2;\n\t\thd = this._depth/2;\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\tnumVertices = ((this._segmentsW + 1)*(this._segmentsH + 1) + (this._segmentsW + 1)*(this._segmentsD + 1) + (this._segmentsH + 1)*(this._segmentsD + 1))*2;\n\n\t\t\tnumIndices = ((this._segmentsW*this._segmentsH + this._segmentsW*this._segmentsD + this._segmentsH*this._segmentsD)*12);\n\n\t\t\tif (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) {\n\t\t\t\tindices = triangleGeometry.indices;\n\t\t\t\tpositions = triangleGeometry.positions;\n\t\t\t\tnormals = triangleGeometry.vertexNormals;\n\t\t\t\ttangents = triangleGeometry.vertexTangents;\n\t\t\t} else {\n\t\t\t\tindices = new Array(numIndices);\n\t\t\t\tpositions = new Array(numVertices*3);\n\t\t\t\tnormals = new Array(numVertices*3);\n\t\t\t\ttangents = new Array(numVertices*3);\n\n\t\t\t\tthis._pInvalidateUVs();\n\t\t\t}\n\n\t\t\tvidx = 0;\n\t\t\tfidx = 0;\n\n\t\t\t// Segment dimensions\n\t\t\tdw = this._width/this._segmentsW;\n\t\t\tdh = this._height/this._segmentsH;\n\t\t\tdd = this._depth/this._segmentsD;\n\n\t\t\tfor (i = 0; i <= this._segmentsW; i++) {\n\t\t\t\touter_pos = -hw + i*dw;\n\n\t\t\t\tfor (j = 0; j <= this._segmentsH; j++) {\n\t\t\t\t\t// front\n\t\t\t\t\tpositions[vidx] = outer_pos;\n\t\t\t\t\tpositions[vidx + 1] = -hh + j*dh;\n\t\t\t\t\tpositions[vidx + 2] = -hd;\n\t\t\t\t\tnormals[vidx] = 0;\n\t\t\t\t\tnormals[vidx + 1] = 0;\n\t\t\t\t\tnormals[vidx + 2] = -1;\n\t\t\t\t\ttangents[vidx] = 1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t// back\n\t\t\t\t\tpositions[vidx] = outer_pos;\n\t\t\t\t\tpositions[vidx + 1] = -hh + j*dh;\n\t\t\t\t\tpositions[vidx + 2] = hd;\n\t\t\t\t\tnormals[vidx] = 0;\n\t\t\t\t\tnormals[vidx + 1] = 0;\n\t\t\t\t\tnormals[vidx + 2] = 1;\n\t\t\t\t\ttangents[vidx] = -1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\tif (i && j) {\n\t\t\t\t\t\ttl = 2*((i - 1)*(this._segmentsH + 1) + (j - 1));\n\t\t\t\t\t\ttr = 2*(i*(this._segmentsH + 1) + (j - 1));\n\t\t\t\t\t\tbl = tl + 2;\n\t\t\t\t\t\tbr = tr + 2;\n\n\t\t\t\t\t\tindices[fidx++] = tl;\n\t\t\t\t\t\tindices[fidx++] = bl;\n\t\t\t\t\t\tindices[fidx++] = br;\n\t\t\t\t\t\tindices[fidx++] = tl;\n\t\t\t\t\t\tindices[fidx++] = br;\n\t\t\t\t\t\tindices[fidx++] = tr;\n\t\t\t\t\t\tindices[fidx++] = tr + 1;\n\t\t\t\t\t\tindices[fidx++] = br + 1;\n\t\t\t\t\t\tindices[fidx++] = bl + 1;\n\t\t\t\t\t\tindices[fidx++] = tr + 1;\n\t\t\t\t\t\tindices[fidx++] = bl + 1;\n\t\t\t\t\t\tindices[fidx++] = tl + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinc += 2*(this._segmentsW + 1)*(this._segmentsH + 1);\n\n\t\t\tfor (i = 0; i <= this._segmentsW; i++) {\n\t\t\t\touter_pos = -hw + i*dw;\n\n\t\t\t\tfor (j = 0; j <= this._segmentsD; j++) {\n\t\t\t\t\t// top\n\t\t\t\t\tpositions[vidx] = outer_pos;\n\t\t\t\t\tpositions[vidx + 1] = hh;\n\t\t\t\t\tpositions[vidx + 2] = -hd + j*dd;\n\t\t\t\t\tnormals[vidx] = 0;\n\t\t\t\t\tnormals[vidx + 1] = 1;\n\t\t\t\t\tnormals[vidx + 2] = 0;\n\t\t\t\t\ttangents[vidx] = 1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t// bottom\n\t\t\t\t\tpositions[vidx] = outer_pos;\n\t\t\t\t\tpositions[vidx + 1] = -hh;\n\t\t\t\t\tpositions[vidx + 2] = -hd + j*dd;\n\t\t\t\t\tnormals[vidx] = 0;\n\t\t\t\t\tnormals[vidx + 1] = -1;\n\t\t\t\t\tnormals[vidx + 2] = 0;\n\t\t\t\t\ttangents[vidx] = 1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\tif (i && j) {\n\t\t\t\t\t\ttl = inc + 2*((i - 1)*(this._segmentsD + 1) + (j - 1));\n\t\t\t\t\t\ttr = inc + 2*(i*(this._segmentsD + 1) + (j - 1));\n\t\t\t\t\t\tbl = tl + 2;\n\t\t\t\t\t\tbr = tr + 2;\n\n\t\t\t\t\t\tindices[fidx++] = tl;\n\t\t\t\t\t\tindices[fidx++] = bl;\n\t\t\t\t\t\tindices[fidx++] = br;\n\t\t\t\t\t\tindices[fidx++] = tl;\n\t\t\t\t\t\tindices[fidx++] = br;\n\t\t\t\t\t\tindices[fidx++] = tr;\n\t\t\t\t\t\tindices[fidx++] = tr + 1;\n\t\t\t\t\t\tindices[fidx++] = br + 1;\n\t\t\t\t\t\tindices[fidx++] = bl + 1;\n\t\t\t\t\t\tindices[fidx++] = tr + 1;\n\t\t\t\t\t\tindices[fidx++] = bl + 1;\n\t\t\t\t\t\tindices[fidx++] = tl + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tinc += 2*(this._segmentsW + 1)*(this._segmentsD + 1);\n\n\t\t\tfor (i = 0; i <= this._segmentsD; i++) {\n\t\t\t\touter_pos = hd - i*dd;\n\n\t\t\t\tfor (j = 0; j <= this._segmentsH; j++) {\n\t\t\t\t\t// left\n\t\t\t\t\tpositions[vidx] = -hw;\n\t\t\t\t\tpositions[vidx+1] = -hh + j*dh;\n\t\t\t\t\tpositions[vidx+2] = outer_pos;\n\t\t\t\t\tnormals[vidx] = -1;\n\t\t\t\t\tnormals[vidx+1] = 0;\n\t\t\t\t\tnormals[vidx+2] = 0;\n\t\t\t\t\ttangents[vidx] = 0;\n\t\t\t\t\ttangents[vidx+1] = 0;\n\t\t\t\t\ttangents[vidx+2] = -1;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t// right\n\t\t\t\t\tpositions[vidx] = hw;\n\t\t\t\t\tpositions[vidx+1] = -hh + j*dh;\n\t\t\t\t\tpositions[vidx+2] = outer_pos;\n\t\t\t\t\tnormals[vidx] = 1;\n\t\t\t\t\tnormals[vidx+1] = 0;\n\t\t\t\t\tnormals[vidx+2] = 0;\n\t\t\t\t\ttangents[vidx] = 0;\n\t\t\t\t\ttangents[vidx+1] = 0;\n\t\t\t\t\ttangents[vidx+2] = 1;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\tif (i && j) {\n\t\t\t\t\t\ttl = inc + 2*((i - 1)*(this._segmentsH + 1) + (j - 1));\n\t\t\t\t\t\ttr = inc + 2*(i*(this._segmentsH + 1) + (j - 1));\n\t\t\t\t\t\tbl = tl + 2;\n\t\t\t\t\t\tbr = tr + 2;\n\n\t\t\t\t\t\tindices[fidx++] = tl;\n\t\t\t\t\t\tindices[fidx++] = bl;\n\t\t\t\t\t\tindices[fidx++] = br;\n\t\t\t\t\t\tindices[fidx++] = tl;\n\t\t\t\t\t\tindices[fidx++] = br;\n\t\t\t\t\t\tindices[fidx++] = tr;\n\t\t\t\t\t\tindices[fidx++] = tr + 1;\n\t\t\t\t\t\tindices[fidx++] = br + 1;\n\t\t\t\t\t\tindices[fidx++] = bl + 1;\n\t\t\t\t\t\tindices[fidx++] = tr + 1;\n\t\t\t\t\t\tindices[fidx++] = bl + 1;\n\t\t\t\t\t\tindices[fidx++] = tl + 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttriangleGeometry.updateIndices(indices);\n\n\t\t\ttriangleGeometry.updatePositions(positions);\n\t\t\ttriangleGeometry.updateVertexNormals(normals);\n\t\t\ttriangleGeometry.updateVertexTangents(tangents);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\tvar lineGeometry:LineSubGeometry = target;\n\n\t\t\tvar numSegments:number = this._segmentsH*4 + this._segmentsW*4 + this._segmentsD*4;\n\t\t\tvar startPositions:Array;\n\t\t\tvar endPositions:Array;\n\t\t\tvar thickness:Array;\n\n\t\t\tif (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) {\n\t\t\t\tstartPositions = lineGeometry.startPositions;\n\t\t\t\tendPositions = lineGeometry.endPositions;\n\t\t\t\tthickness = lineGeometry.thickness;\n\t\t\t} else {\n\t\t\t\tstartPositions = new Array(numSegments*3);\n\t\t\t\tendPositions = new Array(numSegments*3);\n\t\t\t\tthickness = new Array(numSegments);\n\t\t\t}\n\n\t\t\tvidx = 0;\n\n\t\t\tfidx = 0;\n\n\t\t\t//front/back face\n\t\t\tfor (i = 0; i < this._segmentsH; ++i) {\n\t\t\t\tstartPositions[vidx] = -hw;\n\t\t\t\tstartPositions[vidx + 1] = i*this._height/this._segmentsH - hh;\n\t\t\t\tstartPositions[vidx + 2] = -hd;\n\n\t\t\t\tendPositions[vidx] = hw;\n\t\t\t\tendPositions[vidx + 1] = i*this._height/this._segmentsH - hh\n\t\t\t\tendPositions[vidx + 2] = -hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\n\t\t\t\tstartPositions[vidx] = -hw;\n\t\t\t\tstartPositions[vidx + 1] = hh - i*this._height/this._segmentsH;\n\t\t\t\tstartPositions[vidx + 2] = hd;\n\n\t\t\t\tendPositions[vidx] = hw;\n\t\t\t\tendPositions[vidx + 1] = hh - i*this._height/this._segmentsH;\n\t\t\t\tendPositions[vidx + 2] = hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < this._segmentsW; ++i) {\n\t\t\t\tstartPositions[vidx] = i*this._width/this._segmentsW - hw;\n\t\t\t\tstartPositions[vidx + 1] = -hh;\n\t\t\t\tstartPositions[vidx + 2] = -hd;\n\n\t\t\t\tendPositions[vidx] = i*this._width/this._segmentsW - hw;\n\t\t\t\tendPositions[vidx + 1] = hh;\n\t\t\t\tendPositions[vidx + 2] = -hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\n\t\t\t\tstartPositions[vidx] = hw - i*this._width/this._segmentsW;\n\t\t\t\tstartPositions[vidx + 1] = -hh;\n\t\t\t\tstartPositions[vidx + 2] = hd;\n\n\t\t\t\tendPositions[vidx] = hw - i*this._width/this._segmentsW;\n\t\t\t\tendPositions[vidx + 1] = hh;\n\t\t\t\tendPositions[vidx + 2] = hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\t\t\t}\n\n\t\t\t//left/right face\n\t\t\tfor (i = 0; i < this._segmentsH; ++i) {\n\t\t\t\tstartPositions[vidx] = -hw;\n\t\t\t\tstartPositions[vidx + 1] = i*this._height/this._segmentsH - hh;\n\t\t\t\tstartPositions[vidx + 2] = -hd;\n\n\t\t\t\tendPositions[vidx] = -hw;\n\t\t\t\tendPositions[vidx + 1] = i*this._height/this._segmentsH - hh\n\t\t\t\tendPositions[vidx + 2] = hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\n\t\t\t\tstartPositions[vidx] = hw;\n\t\t\t\tstartPositions[vidx + 1] = hh - i*this._height/this._segmentsH;\n\t\t\t\tstartPositions[vidx + 2] = -hd;\n\n\t\t\t\tendPositions[vidx] = hw;\n\t\t\t\tendPositions[vidx + 1] = hh - i*this._height/this._segmentsH;\n\t\t\t\tendPositions[vidx + 2] = hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < this._segmentsD; ++i) {\n\t\t\t\tstartPositions[vidx] = hw\n\t\t\t\tstartPositions[vidx + 1] = -hh;\n\t\t\t\tstartPositions[vidx + 2] = i*this._depth/this._segmentsD - hd;\n\n\t\t\t\tendPositions[vidx] = hw;\n\t\t\t\tendPositions[vidx + 1] = hh;\n\t\t\t\tendPositions[vidx + 2] = i*this._depth/this._segmentsD - hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\n\t\t\t\tstartPositions[vidx] = -hw;\n\t\t\t\tstartPositions[vidx + 1] = -hh;\n\t\t\t\tstartPositions[vidx + 2] = hd - i*this._depth/this._segmentsD;\n\n\t\t\t\tendPositions[vidx] = -hw;\n\t\t\t\tendPositions[vidx + 1] = hh;\n\t\t\t\tendPositions[vidx + 2] = hd - i*this._depth/this._segmentsD;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\t\t\t}\n\n\n\t\t\t//top/bottom face\n\t\t\tfor (i = 0; i < this._segmentsD; ++i) {\n\t\t\t\tstartPositions[vidx] = -hw;\n\t\t\t\tstartPositions[vidx + 1] = -hh;\n\t\t\t\tstartPositions[vidx + 2] = hd - i*this._depth/this._segmentsD;\n\n\t\t\t\tendPositions[vidx] = hw;\n\t\t\t\tendPositions[vidx + 1] = -hh;\n\t\t\t\tendPositions[vidx + 2] = hd - i*this._depth/this._segmentsD;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\n\t\t\t\tstartPositions[vidx] = -hw;\n\t\t\t\tstartPositions[vidx + 1] = hh;\n\t\t\t\tstartPositions[vidx + 2] = i*this._depth/this._segmentsD - hd;\n\n\t\t\t\tendPositions[vidx] = hw;\n\t\t\t\tendPositions[vidx + 1] = hh;\n\t\t\t\tendPositions[vidx + 2] = i*this._depth/this._segmentsD - hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\t\t\t}\n\n\t\t\tfor (i = 0; i < this._segmentsW; ++i) {\n\t\t\t\tstartPositions[vidx] = hw - i*this._width/this._segmentsW;\n\t\t\t\tstartPositions[vidx + 1] = -hh;\n\t\t\t\tstartPositions[vidx + 2] = -hd;\n\n\t\t\t\tendPositions[vidx] = hw - i*this._width/this._segmentsW;\n\t\t\t\tendPositions[vidx + 1] = -hh;\n\t\t\t\tendPositions[vidx + 2] = hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\n\t\t\t\tstartPositions[vidx] = i*this._width/this._segmentsW - hw;\n\t\t\t\tstartPositions[vidx + 1] = hh;\n\t\t\t\tstartPositions[vidx + 2] = -hd;\n\n\t\t\t\tendPositions[vidx] = i*this._width/this._segmentsW - hw;\n\t\t\t\tendPositions[vidx + 1] = hh;\n\t\t\t\tendPositions[vidx + 2] = hd;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\tlineGeometry.updatePositions(startPositions, endPositions);\n\t\t\tlineGeometry.updateThickness(thickness);\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildUVs(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar i:number, j:number, index:number;\n\t\tvar uvs:Array;\n\n\t\tvar u_tile_dim:number, v_tile_dim:number;\n\t\tvar u_tile_step:number, v_tile_step:number;\n\t\tvar tl0u:number, tl0v:number;\n\t\tvar tl1u:number, tl1v:number;\n\t\tvar du:number, dv:number;\n\t\tvar numVertices:number;\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tnumVertices = ((this._segmentsW + 1)*(this._segmentsH + 1) + (this._segmentsW + 1)*(this._segmentsD + 1) + (this._segmentsH + 1)*(this._segmentsD + 1))*2;\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\tif (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) {\n\t\t\t\tuvs = triangleGeometry.uvs;\n\t\t\t} else {\n\t\t\t\tuvs = new Array(numVertices*2);\n\t\t\t}\n\n\t\t\tif (this._tile6) {\n\t\t\t\tu_tile_dim = u_tile_step = 1/3;\n\t\t\t\tv_tile_dim = v_tile_step = 1/2;\n\t\t\t} else {\n\t\t\t\tu_tile_dim = v_tile_dim = 1;\n\t\t\t\tu_tile_step = v_tile_step = 0;\n\t\t\t}\n\n\t\t\t// Create planes two and two, the same way that they were\n\t\t\t// constructed in the buildGeometry() function. First calculate\n\t\t\t// the top-left UV coordinate for both planes, and then loop\n\t\t\t// over the points, calculating the UVs from these numbers.\n\n\t\t\t// When tile6 is true, the layout is as follows:\n\t\t\t// .-----.-----.-----. (1,1)\n\t\t\t// | Bot | T | Bak |\n\t\t\t// |-----+-----+-----|\n\t\t\t// | L | F | R |\n\t\t\t// (0,0)'-----'-----'-----'\n\n\t\t\tindex = 0;\n\n\t\t\t// FRONT / BACK\n\t\t\ttl0u = 1*u_tile_step;\n\t\t\ttl0v = 1*v_tile_step;\n\t\t\ttl1u = 2*u_tile_step;\n\t\t\ttl1v = 0*v_tile_step;\n\t\t\tdu = u_tile_dim/this._segmentsW;\n\t\t\tdv = v_tile_dim/this._segmentsH;\n\t\t\tfor (i = 0; i <= this._segmentsW; i++) {\n\t\t\t\tfor (j = 0; j <= this._segmentsH; j++) {\n\t\t\t\t\tuvs[index++] = ( tl0u + i*du )*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV;\n\n\t\t\t\t\tuvs[index++] = ( tl1u + (u_tile_dim - i*du))*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( tl1v + (v_tile_dim - j*dv))*triangleGeometry.scaleV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// TOP / BOTTOM\n\t\t\ttl0u = 1*u_tile_step;\n\t\t\ttl0v = 0*v_tile_step;\n\t\t\ttl1u = 0*u_tile_step;\n\t\t\ttl1v = 0*v_tile_step;\n\t\t\tdu = u_tile_dim/this._segmentsW;\n\t\t\tdv = v_tile_dim/this._segmentsD;\n\t\t\tfor (i = 0; i <= this._segmentsW; i++) {\n\t\t\t\tfor (j = 0; j <= this._segmentsD; j++) {\n\t\t\t\t\tuvs[index++] = ( tl0u + i*du)*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV;\n\n\t\t\t\t\tuvs[index++] = ( tl1u + i*du)*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( tl1v + j*dv)*triangleGeometry.scaleV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// LEFT / RIGHT\n\t\t\ttl0u = 0*u_tile_step;\n\t\t\ttl0v = 1*v_tile_step;\n\t\t\ttl1u = 2*u_tile_step;\n\t\t\ttl1v = 1*v_tile_step;\n\t\t\tdu = u_tile_dim/this._segmentsD;\n\t\t\tdv = v_tile_dim/this._segmentsH;\n\t\t\tfor (i = 0; i <= this._segmentsD; i++) {\n\t\t\t\tfor (j = 0; j <= this._segmentsH; j++) {\n\t\t\t\t\tuvs[index++] = ( tl0u + i*du)*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV;\n\n\t\t\t\t\tuvs[index++] = ( tl1u + (u_tile_dim - i*du))*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( tl1v + (v_tile_dim - j*dv))*triangleGeometry.scaleV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttriangleGeometry.updateUVs(uvs);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\t//nothing to do here\n\t\t}\n\t}\n}\n\nexport = PrimitiveCubePrefab;", + "import LineSubGeometry\t\t\t= require(\"awayjs-core/lib/core/base/LineSubGeometry\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport PrimitivePrefabBase\t\t= require(\"awayjs-core/lib/prefabs/PrimitivePrefabBase\");\n\n/**\n * A Cylinder primitive mesh.\n */\nclass PrimitiveCylinderPrefab extends PrimitivePrefabBase implements IAsset\n{\n\tpublic _pBottomRadius:number;\n\tpublic _pSegmentsW:number;\n\tpublic _pSegmentsH:number;\n\n\tprivate _topRadius:number;\n\tprivate _height:number;\n\n\tprivate _topClosed:boolean;\n\tprivate _bottomClosed:boolean;\n\tprivate _surfaceClosed:boolean;\n\tprivate _yUp:boolean;\n\tprivate _numVertices:number = 0;\n\n\t/**\n\t * The radius of the top end of the cylinder.\n\t */\n\tpublic get topRadius():number\n\t{\n\t\treturn this._topRadius;\n\t}\n\n\tpublic set topRadius(value:number)\n\t{\n\t\tthis._topRadius = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The radius of the bottom end of the cylinder.\n\t */\n\tpublic get bottomRadius():number\n\t{\n\t\treturn this._pBottomRadius;\n\t}\n\n\tpublic set bottomRadius(value:number)\n\t{\n\t\tthis._pBottomRadius = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The radius of the top end of the cylinder.\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._height;\n\t}\n\n\tpublic set height(value:number)\n\t{\n\t\tthis._height = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Defines the number of horizontal segments that make up the cylinder. Defaults to 16.\n\t */\n\tpublic get segmentsW():number\n\t{\n\t\treturn this._pSegmentsW;\n\t}\n\n\tpublic set segmentsW(value:number)\n\t{\n\t\tthis.setSegmentsW(value);\n\t}\n\n\tpublic setSegmentsW(value:number)\n\t{\n\t\tthis._pSegmentsW = value;\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * Defines the number of vertical segments that make up the cylinder. Defaults to 1.\n\t */\n\tpublic get segmentsH():number\n\t{\n\t\treturn this._pSegmentsH;\n\t}\n\n\tpublic set segmentsH(value:number)\n\t{\n\n\t\tthis.setSegmentsH(value)\n\n\t}\n\n\tpublic setSegmentsH(value:number)\n\t{\n\t\tthis._pSegmentsH = value;\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\n\t}\n\n\t/**\n\t * Defines whether the top end of the cylinder is closed (true) or open.\n\t */\n\tpublic get topClosed():boolean\n\t{\n\t\treturn this._topClosed;\n\t}\n\n\tpublic set topClosed(value:boolean)\n\t{\n\t\tthis._topClosed = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Defines whether the bottom end of the cylinder is closed (true) or open.\n\t */\n\tpublic get bottomClosed():boolean\n\t{\n\t\treturn this._bottomClosed;\n\t}\n\n\tpublic set bottomClosed(value:boolean)\n\t{\n\t\tthis._bottomClosed = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Defines whether the cylinder poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tpublic get yUp():boolean\n\t{\n\t\treturn this._yUp;\n\t}\n\n\tpublic set yUp(value:boolean)\n\t{\n\t\tthis._yUp = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Creates a new Cylinder object.\n\t * @param topRadius The radius of the top end of the cylinder.\n\t * @param bottomRadius The radius of the bottom end of the cylinder\n\t * @param height The radius of the bottom end of the cylinder\n\t * @param segmentsW Defines the number of horizontal segments that make up the cylinder. Defaults to 16.\n\t * @param segmentsH Defines the number of vertical segments that make up the cylinder. Defaults to 1.\n\t * @param topClosed Defines whether the top end of the cylinder is closed (true) or open.\n\t * @param bottomClosed Defines whether the bottom end of the cylinder is closed (true) or open.\n\t * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tconstructor(topRadius:number = 50, bottomRadius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 1, topClosed:boolean = true, bottomClosed:boolean = true, surfaceClosed:boolean = true, yUp:boolean = true)\n\t{\n\t\tsuper();\n\n\t\tthis._topRadius = topRadius;\n\t\tthis._pBottomRadius = bottomRadius;\n\t\tthis._height = height;\n\t\tthis._pSegmentsW = segmentsW;\n\t\tthis._pSegmentsH = segmentsH;\n\t\tthis._topClosed = topClosed;\n\t\tthis._bottomClosed = bottomClosed;\n\t\tthis._surfaceClosed = surfaceClosed;\n\t\tthis._yUp = yUp;\n\t}\n\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildGeometry(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar indices:Array /*uint*/;\n\t\tvar positions:Array;\n\t\tvar normals:Array;\n\t\tvar tangents:Array;\n\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar x:number;\n\t\tvar y:number;\n\t\tvar z:number;\n\t\tvar vidx:number;\n\t\tvar fidx:number;\n\n\t\tvar radius:number;\n\t\tvar revolutionAngle:number;\n\n\t\tvar dr:number;\n\t\tvar latNormElev:number;\n\t\tvar latNormBase:number;\n\t\tvar numIndices:number = 0;\n\n\t\tvar comp1:number;\n\t\tvar comp2:number;\n\t\tvar startIndex:number = 0;\n\t\tvar nextVertexIndex:number = 0;\n\n\t\tvar t1:number;\n\t\tvar t2:number;\n\n\t\t// reset utility variables\n\t\tthis._numVertices = 0;\n\n\t\t// evaluate revolution steps\n\t\tvar revolutionAngleDelta:number = 2*Math.PI/this._pSegmentsW;\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\t// evaluate target number of vertices, triangles and indices\n\t\t\tif (this._surfaceClosed) {\n\t\t\t\tthis._numVertices += (this._pSegmentsH + 1)*(this._pSegmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of UV unwrapping\n\t\t\t\tnumIndices += this._pSegmentsH*this._pSegmentsW*6; // each level has segmentW quads, each of 2 triangles\n\t\t\t}\n\t\t\tif (this._topClosed) {\n\t\t\t\tthis._numVertices += 2*(this._pSegmentsW + 1); // segmentsW + 1 because of unwrapping\n\t\t\t\tnumIndices += this._pSegmentsW*3; // one triangle for each segment\n\t\t\t}\n\t\t\tif (this._bottomClosed) {\n\t\t\t\tthis._numVertices += 2*(this._pSegmentsW + 1);\n\t\t\t\tnumIndices += this._pSegmentsW*3;\n\t\t\t}\n\n\t\t\t// need to initialize raw arrays or can be reused?\n\t\t\tif (this._numVertices == triangleGeometry.numVertices) {\n\t\t\t\tindices = triangleGeometry.indices;\n\t\t\t\tpositions = triangleGeometry.positions;\n\t\t\t\tnormals = triangleGeometry.vertexNormals;\n\t\t\t\ttangents = triangleGeometry.vertexTangents;\n\t\t\t} else {\n\t\t\t\tindices = new Array(numIndices)\n\t\t\t\tpositions = new Array(this._numVertices*3);\n\t\t\t\tnormals = new Array(this._numVertices*3);\n\t\t\t\ttangents = new Array(this._numVertices*3);\n\n\t\t\t\tthis._pInvalidateUVs();\n\t\t\t}\n\n\t\t\tvidx = 0;\n\t\t\tfidx = 0;\n\n\t\t\t// top\n\t\t\tif (this._topClosed && this._topRadius > 0) {\n\n\t\t\t\tz = -0.5*this._height;\n\n\t\t\t\tfor (i = 0; i <= this._pSegmentsW; ++i) {\n\t\t\t\t\t// central vertex\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tt1 = 1;\n\t\t\t\t\t\tt2 = 0;\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = 0;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt1 = 0;\n\t\t\t\t\t\tt2 = -1;\n\t\t\t\t\t\tcomp1 = 0;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tpositions[vidx] = 0;\n\t\t\t\t\tpositions[vidx + 1] = comp1;\n\t\t\t\t\tpositions[vidx + 2] = comp2;\n\t\t\t\t\tnormals[vidx] = 0;\n\t\t\t\t\tnormals[vidx + 1] = t1;\n\t\t\t\t\tnormals[vidx + 2] = t2;\n\t\t\t\t\ttangents[vidx] = 1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t// revolution vertex\n\t\t\t\t\trevolutionAngle = i*revolutionAngleDelta;\n\t\t\t\t\tx = this._topRadius*Math.cos(revolutionAngle);\n\t\t\t\t\ty = this._topRadius*Math.sin(revolutionAngle);\n\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = y;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcomp1 = y;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i == this._pSegmentsW) {\n\t\t\t\t\t\tpositions[vidx] = positions[startIndex + 3];\n\t\t\t\t\t\tpositions[vidx + 1] = positions[startIndex + 4];\n\t\t\t\t\t\tpositions[vidx + 2] = positions[startIndex + 5];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpositions[vidx] = x;\n\t\t\t\t\t\tpositions[vidx + 1] = comp1;\n\t\t\t\t\t\tpositions[vidx + 2] = comp2;\n\t\t\t\t\t}\n\n\t\t\t\t\tnormals[vidx] = 0;\n\t\t\t\t\tnormals[vidx + 1] = t1;\n\t\t\t\t\tnormals[vidx + 2] = t2;\n\t\t\t\t\ttangents[vidx] = 1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t// add triangle\n\t\t\t\t\t\tindices[fidx++] = nextVertexIndex;\n\t\t\t\t\t\tindices[fidx++] = nextVertexIndex + 1;\n\t\t\t\t\t\tindices[fidx++] = nextVertexIndex + 2;\n\n\t\t\t\t\t\tnextVertexIndex += 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnextVertexIndex += 2;\n\t\t\t}\n\n\t\t\t// bottom\n\t\t\tif (this._bottomClosed && this._pBottomRadius > 0) {\n\n\t\t\t\tz = 0.5*this._height;\n\n\t\t\t\tstartIndex = nextVertexIndex*3;\n\n\t\t\t\tfor (i = 0; i <= this._pSegmentsW; ++i) {\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tt1 = -1;\n\t\t\t\t\t\tt2 = 0;\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt1 = 0;\n\t\t\t\t\t\tt2 = 1;\n\t\t\t\t\t\tcomp1 = 0;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tpositions[vidx] = 0;\n\t\t\t\t\tpositions[vidx + 1] = comp1;\n\t\t\t\t\tpositions[vidx + 2] = comp2;\n\t\t\t\t\tnormals[vidx] = 0;\n\t\t\t\t\tnormals[vidx + 1] = t1;\n\t\t\t\t\tnormals[vidx + 2] = t2;\n\t\t\t\t\ttangents[vidx] = 1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t// revolution vertex\n\t\t\t\t\trevolutionAngle = i*revolutionAngleDelta;\n\t\t\t\t\tx = this._pBottomRadius*Math.cos(revolutionAngle);\n\t\t\t\t\ty = this._pBottomRadius*Math.sin(revolutionAngle);\n\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = y;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcomp1 = y;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i == this._pSegmentsW) {\n\t\t\t\t\t\tpositions[vidx] = positions[startIndex + 3];\n\t\t\t\t\t\tpositions[vidx + 1] = positions[startIndex + 4];\n\t\t\t\t\t\tpositions[vidx + 2] = positions[startIndex + 5];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpositions[vidx] = x;\n\t\t\t\t\t\tpositions[vidx + 1] = comp1;\n\t\t\t\t\t\tpositions[vidx + 2] = comp2;\n\t\t\t\t\t}\n\n\t\t\t\t\tnormals[vidx] = 0;\n\t\t\t\t\tnormals[vidx + 1] = t1;\n\t\t\t\t\tnormals[vidx + 2] = t2;\n\t\t\t\t\ttangents[vidx] = 1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\t// add triangle\n\t\t\t\t\t\tindices[fidx++] = nextVertexIndex;\n\t\t\t\t\t\tindices[fidx++] = nextVertexIndex + 2;\n\t\t\t\t\t\tindices[fidx++] = nextVertexIndex + 1;\n\n\t\t\t\t\t\tnextVertexIndex += 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tnextVertexIndex += 2;\n\t\t\t}\n\n\t\t\t// The normals on the lateral surface all have the same incline, i.e.\n\t\t\t// the \"elevation\" component (Y or Z depending on yUp) is constant.\n\t\t\t// Same principle goes for the \"base\" of these vectors, which will be\n\t\t\t// calculated such that a vector [base,elev] will be a unit vector.\n\t\t\tdr = (this._pBottomRadius - this._topRadius);\n\t\t\tlatNormElev = dr/this._height;\n\t\t\tlatNormBase = (latNormElev == 0)? 1 : this._height/dr;\n\n\t\t\t// lateral surface\n\t\t\tif (this._surfaceClosed) {\n\t\t\t\tvar a:number;\n\t\t\t\tvar b:number;\n\t\t\t\tvar c:number;\n\t\t\t\tvar d:number;\n\t\t\t\tvar na0:number, na1:number, naComp1:number, naComp2:number;\n\n\t\t\t\tfor (j = 0; j <= this._pSegmentsH; ++j) {\n\t\t\t\t\tradius = this._topRadius - ((j/this._pSegmentsH)*(this._topRadius - this._pBottomRadius));\n\t\t\t\t\tz = -(this._height/2) + (j/this._pSegmentsH*this._height);\n\n\t\t\t\t\tstartIndex = nextVertexIndex*3;\n\n\t\t\t\t\tfor (i = 0; i <= this._pSegmentsW; ++i) {\n\t\t\t\t\t\t// revolution vertex\n\t\t\t\t\t\trevolutionAngle = i*revolutionAngleDelta;\n\t\t\t\t\t\tx = radius*Math.cos(revolutionAngle);\n\t\t\t\t\t\ty = radius*Math.sin(revolutionAngle);\n\t\t\t\t\t\tna0 = latNormBase*Math.cos(revolutionAngle);\n\t\t\t\t\t\tna1 = latNormBase*Math.sin(revolutionAngle);\n\n\t\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\t\tt1 = 0;\n\t\t\t\t\t\t\tt2 = -na0;\n\t\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\t\tcomp2 = y;\n\t\t\t\t\t\t\tnaComp1 = latNormElev;\n\t\t\t\t\t\t\tnaComp2 = na1;\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt1 = -na0;\n\t\t\t\t\t\t\tt2 = 0;\n\t\t\t\t\t\t\tcomp1 = y;\n\t\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t\t\tnaComp1 = na1;\n\t\t\t\t\t\t\tnaComp2 = latNormElev;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (i == this._pSegmentsW) {\n\t\t\t\t\t\t\tpositions[vidx] = positions[startIndex];\n\t\t\t\t\t\t\tpositions[vidx + 1] = positions[startIndex + 1];\n\t\t\t\t\t\t\tpositions[vidx + 2] = positions[startIndex + 2];\n\t\t\t\t\t\t\tnormals[vidx] = na0;\n\t\t\t\t\t\t\tnormals[vidx + 1] = latNormElev;\n\t\t\t\t\t\t\tnormals[vidx + 2] = na1;\n\t\t\t\t\t\t\ttangents[vidx] = na1;\n\t\t\t\t\t\t\ttangents[vidx + 1] = t1;\n\t\t\t\t\t\t\ttangents[vidx + 2] = t2;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpositions[vidx] = x;\n\t\t\t\t\t\t\tpositions[vidx + 1] = comp1;\n\t\t\t\t\t\t\tpositions[vidx + 2] = comp2;\n\t\t\t\t\t\t\tnormals[vidx] = na0;\n\t\t\t\t\t\t\tnormals[vidx + 1] = naComp1;\n\t\t\t\t\t\t\tnormals[vidx + 2] = naComp2;\n\t\t\t\t\t\t\ttangents[vidx] = -na1;\n\t\t\t\t\t\t\ttangents[vidx + 1] = t1;\n\t\t\t\t\t\t\ttangents[vidx + 2] = t2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t\t// close triangle\n\t\t\t\t\t\tif (i > 0 && j > 0) {\n\t\t\t\t\t\t\ta = nextVertexIndex; // current\n\t\t\t\t\t\t\tb = nextVertexIndex - 1; // previous\n\t\t\t\t\t\t\tc = b - this._pSegmentsW - 1; // previous of last level\n\t\t\t\t\t\t\td = a - this._pSegmentsW - 1; // current of last level\n\n\t\t\t\t\t\t\tindices[fidx++] = a;\n\t\t\t\t\t\t\tindices[fidx++] = b;\n\t\t\t\t\t\t\tindices[fidx++] = c;\n\n\t\t\t\t\t\t\tindices[fidx++] = a;\n\t\t\t\t\t\t\tindices[fidx++] = c;\n\t\t\t\t\t\t\tindices[fidx++] = d;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnextVertexIndex++;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\ttriangleGeometry.updateIndices(indices);\n\n\t\t\ttriangleGeometry.updatePositions(positions);\n\t\t\ttriangleGeometry.updateVertexNormals(normals);\n\t\t\ttriangleGeometry.updateVertexTangents(tangents);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\tvar lineGeometry:LineSubGeometry = target;\n\n\t\t\tvar numSegments:number = (this._pSegmentsH + 1)*(this._pSegmentsW) + this._pSegmentsW;\n\t\t\tvar startPositions:Array;\n\t\t\tvar endPositions:Array;\n\t\t\tvar thickness:Array;\n\n\t\t\tif (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) {\n\t\t\t\tstartPositions = lineGeometry.startPositions;\n\t\t\t\tendPositions = lineGeometry.endPositions;\n\t\t\t\tthickness = lineGeometry.thickness;\n\t\t\t} else {\n\t\t\t\tstartPositions = new Array(numSegments*3);\n\t\t\t\tendPositions = new Array(numSegments*3);\n\t\t\t\tthickness = new Array(numSegments);\n\t\t\t}\n\n\t\t\tvidx = 0;\n\n\t\t\tfidx = 0;\n\n\t\t\t//horizonal lines\n\n\t\t\tfor (j = 0; j <= this._pSegmentsH; ++j) {\n\t\t\t\tradius = this._topRadius - ((j/this._pSegmentsH)*(this._topRadius - this._pBottomRadius));\n\t\t\t\tz = this._height*(j/this._pSegmentsH - 0.5);\n\n\t\t\t\tfor (i = 0; i <= this._pSegmentsW; ++i) {\n\t\t\t\t\t// revolution vertex\n\t\t\t\t\trevolutionAngle = i*revolutionAngleDelta;\n\t\t\t\t\tx = radius*Math.cos(revolutionAngle);\n\t\t\t\t\ty = radius*Math.sin(revolutionAngle);\n\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = y;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcomp1 = y;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i > 0) {\n\t\t\t\t\t\tendPositions[vidx] = x;\n\t\t\t\t\t\tendPositions[vidx + 1] = comp1;\n\t\t\t\t\t\tendPositions[vidx + 2] = comp2;\n\n\t\t\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t\t//vertical lines\n\t\t\t\t\t\tstartPositions[vidx] = endPositions[vidx - this._pSegmentsW*6];\n\t\t\t\t\t\tstartPositions[vidx + 1] = endPositions[vidx + 1 - this._pSegmentsW*6];\n\t\t\t\t\t\tstartPositions[vidx + 2] = endPositions[vidx + 2 - this._pSegmentsW*6];\n\n\t\t\t\t\t\tendPositions[vidx] = x;\n\t\t\t\t\t\tendPositions[vidx + 1] = comp1;\n\t\t\t\t\t\tendPositions[vidx + 2] = comp2;\n\n\t\t\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\t\t\tvidx += 3;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i < this._pSegmentsW) {\n\t\t\t\t\t\tstartPositions[vidx] = x;\n\t\t\t\t\t\tstartPositions[vidx + 1] = comp1;\n\t\t\t\t\t\tstartPositions[vidx + 2] = comp2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\tlineGeometry.updatePositions(startPositions, endPositions);\n\t\t\tlineGeometry.updateThickness(thickness);\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildUVs(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar x:number;\n\t\tvar y:number;\n\t\tvar revolutionAngle:number;\n\t\tvar uvs:Array;\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\t// need to initialize raw array or can be reused?\n\t\t\tif (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) {\n\t\t\t\tuvs = triangleGeometry.uvs;\n\t\t\t} else {\n\t\t\t\tuvs = new Array(this._numVertices*2);\n\t\t\t}\n\n\t\t\t// evaluate revolution steps\n\t\t\tvar revolutionAngleDelta:number = 2*Math.PI/this._pSegmentsW;\n\n\t\t\t// current uv component index\n\t\t\tvar index:number = 0;\n\n\t\t\t// top\n\t\t\tif (this._topClosed) {\n\t\t\t\tfor (i = 0; i <= this._pSegmentsW; ++i) {\n\n\t\t\t\t\trevolutionAngle = i*revolutionAngleDelta;\n\t\t\t\t\tx = 0.5 + 0.5* -Math.cos(revolutionAngle);\n\t\t\t\t\ty = 0.5 + 0.5*Math.sin(revolutionAngle);\n\n\t\t\t\t\tuvs[index++] = 0.5*triangleGeometry.scaleU; // central vertex\n\t\t\t\t\tuvs[index++] = 0.5*triangleGeometry.scaleV;\n\n\t\t\t\t\tuvs[index++] = x*triangleGeometry.scaleU; // revolution vertex\n\t\t\t\t\tuvs[index++] = y*triangleGeometry.scaleV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// bottom\n\t\t\tif (this._bottomClosed) {\n\t\t\t\tfor (i = 0; i <= this._pSegmentsW; ++i) {\n\n\t\t\t\t\trevolutionAngle = i*revolutionAngleDelta;\n\t\t\t\t\tx = 0.5 + 0.5*Math.cos(revolutionAngle);\n\t\t\t\t\ty = 0.5 + 0.5*Math.sin(revolutionAngle);\n\n\t\t\t\t\tuvs[index++] = 0.5*triangleGeometry.scaleU; // central vertex\n\t\t\t\t\tuvs[index++] = 0.5*triangleGeometry.scaleV;\n\n\t\t\t\t\tuvs[index++] = x*triangleGeometry.scaleU; // revolution vertex\n\t\t\t\t\tuvs[index++] = y*triangleGeometry.scaleV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// lateral surface\n\t\t\tif (this._surfaceClosed) {\n\t\t\t\tfor (j = 0; j <= this._pSegmentsH; ++j) {\n\t\t\t\t\tfor (i = 0; i <= this._pSegmentsW; ++i) {\n\t\t\t\t\t\t// revolution vertex\n\t\t\t\t\t\tuvs[index++] = ( i/this._pSegmentsW )*triangleGeometry.scaleU;\n\t\t\t\t\t\tuvs[index++] = ( j/this._pSegmentsH )*triangleGeometry.scaleV;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\ttriangleGeometry.updateUVs(uvs);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\t//nothing to do here\n\t\t}\n\t}\n}\n\nexport = PrimitiveCylinderPrefab;", + "import LineSubGeometry\t\t\t= require(\"awayjs-core/lib/core/base/LineSubGeometry\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport PrimitivePrefabBase\t\t= require(\"awayjs-core/lib/prefabs/PrimitivePrefabBase\");\n\n/**\n * A Plane primitive mesh.\n */\nclass PrimitivePlanePrefab extends PrimitivePrefabBase implements IAsset\n{\n\tprivate _segmentsW:number;\n\tprivate _segmentsH:number;\n\tprivate _yUp:boolean;\n\tprivate _width:number;\n\tprivate _height:number;\n\tprivate _doubleSided:boolean;\n\n\t/**\n\t * Creates a new Plane object.\n\t * @param width The width of the plane.\n\t * @param height The height of the plane.\n\t * @param segmentsW The number of segments that make up the plane along the X-axis.\n\t * @param segmentsH The number of segments that make up the plane along the Y or Z-axis.\n\t * @param yUp Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false).\n\t * @param doubleSided Defines whether the plane will be visible from both sides, with correct vertex normals.\n\t */\n\tconstructor(width:number = 100, height:number = 100, segmentsW:number = 1, segmentsH:number = 1, yUp:boolean = true, doubleSided:boolean = false)\n\t{\n\n\t\tsuper();\n\n\t\tthis._segmentsW = segmentsW;\n\t\tthis._segmentsH = segmentsH;\n\t\tthis._yUp = yUp;\n\t\tthis._width = width;\n\t\tthis._height = height;\n\t\tthis._doubleSided = doubleSided;\n\n\t}\n\n\t/**\n\t * The number of segments that make up the plane along the X-axis. Defaults to 1.\n\t */\n\tpublic get segmentsW():number\n\t{\n\t\treturn this._segmentsW;\n\t}\n\n\tpublic set segmentsW(value:number)\n\t{\n\n\t\tthis._segmentsW = value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\n\t}\n\n\t/**\n\t * The number of segments that make up the plane along the Y or Z-axis, depending on whether yUp is true or\n\t * false, respectively. Defaults to 1.\n\t */\n\tpublic get segmentsH():number\n\t{\n\t\treturn this._segmentsH;\n\t}\n\n\tpublic set segmentsH(value:number)\n\t{\n\n\t\tthis._segmentsH = value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\n\t}\n\n\t/**\n\t * Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). Defaults to true.\n\t */\n\tpublic get yUp():boolean\n\t{\n\t\treturn this._yUp;\n\t}\n\n\tpublic set yUp(value:boolean)\n\t{\n\t\tthis._yUp = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Defines whether the plane will be visible from both sides, with correct vertex normals (as opposed to bothSides on Material). Defaults to false.\n\t */\n\tpublic get doubleSided():boolean\n\t{\n\t\treturn this._doubleSided;\n\t}\n\n\tpublic set doubleSided(value:boolean)\n\t{\n\t\tthis._doubleSided = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The width of the plane.\n\t */\n\tpublic get width():number\n\t{\n\t\treturn this._width;\n\t}\n\n\tpublic set width(value:number)\n\t{\n\t\tthis._width = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The height of the plane.\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._height;\n\t}\n\n\tpublic set height(value:number)\n\t{\n\t\tthis._height = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildGeometry(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar indices:Array /*uint*/;\n\t\tvar x:number, y:number;\n\t\tvar numIndices:number;\n\t\tvar base:number;\n\t\tvar tw:number = this._segmentsW + 1;\n\t\tvar numVertices:number;\n\n\t\tvar vidx:number, fidx:number; // indices\n\n\t\tvar xi:number;\n\t\tvar yi:number;\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\tvar numVertices:number = (this._segmentsH + 1)*tw;\n\t\t\tvar positions:Array;\n\t\t\tvar normals:Array;\n\t\t\tvar tangents:Array;\n\n\t\t\tif (this._doubleSided)\n\t\t\t\tnumVertices *= 2;\n\n\t\t\tnumIndices = this._segmentsH*this._segmentsW*6;\n\n\t\t\tif (this._doubleSided)\n\t\t\t\tnumIndices *= 2;\n\n\t\t\tif (triangleGeometry.indices != null && numIndices == triangleGeometry.indices.length) {\n\t\t\t\tindices = triangleGeometry.indices;\n\t\t\t} else {\n\t\t\t\tindices = new Array(numIndices);\n\n\t\t\t\tthis._pInvalidateUVs();\n\t\t\t}\n\n\t\t\tif (numVertices == triangleGeometry.numVertices) {\n\t\t\t\tpositions = triangleGeometry.positions;\n\t\t\t\tnormals = triangleGeometry.vertexNormals;\n\t\t\t\ttangents = triangleGeometry.vertexTangents;\n\t\t\t} else {\n\t\t\t\tpositions = new Array(numVertices*3);\n\t\t\t\tnormals = new Array(numVertices*3);\n\t\t\t\ttangents = new Array(numVertices*3);\n\n\t\t\t\tthis._pInvalidateUVs();\n\t\t\t}\n\n\t\t\tfidx = 0;\n\n\t\t\tvidx = 0;\n\n\t\t\tfor (yi = 0; yi <= this._segmentsH; ++yi) {\n\n\t\t\t\tfor (xi = 0; xi <= this._segmentsW; ++xi) {\n\t\t\t\t\tx = (xi/this._segmentsW - .5)*this._width;\n\t\t\t\t\ty = (yi/this._segmentsH - .5)*this._height;\n\n\t\t\t\t\tpositions[vidx] = x;\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tpositions[vidx + 1] = 0;\n\t\t\t\t\t\tpositions[vidx + 2] = y;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpositions[vidx + 1] = y;\n\t\t\t\t\t\tpositions[vidx + 2] = 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tnormals[vidx] = 0;\n\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tnormals[vidx + 1] = 1;\n\t\t\t\t\t\tnormals[vidx + 2] = 0;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnormals[vidx + 1] = 0;\n\t\t\t\t\t\tnormals[vidx + 2] = -1;\n\t\t\t\t\t}\n\n\t\t\t\t\ttangents[vidx] = 1;\n\t\t\t\t\ttangents[vidx + 1] = 0;\n\t\t\t\t\ttangents[vidx + 2] = 0;\n\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t// add vertex with same position, but with inverted normal & tangent\n\t\t\t\t\tif (this._doubleSided) {\n\n\t\t\t\t\t\tfor (var i:number = vidx; i < vidx + 3; ++i) {\n\t\t\t\t\t\t\tpositions[i] = positions[i - 3];\n\t\t\t\t\t\t\tnormals[i] = -normals[i - 3];\n\t\t\t\t\t\t\ttangents[i] = -tangents[i - 3];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif (xi != this._segmentsW && yi != this._segmentsH) {\n\n\t\t\t\t\t\tbase = xi + yi*tw;\n\t\t\t\t\t\tvar mult:number = this._doubleSided? 2 : 1;\n\n\t\t\t\t\t\tindices[fidx++] = base*mult;\n\t\t\t\t\t\tindices[fidx++] = (base + tw)*mult;\n\t\t\t\t\t\tindices[fidx++] = (base + tw + 1)*mult;\n\t\t\t\t\t\tindices[fidx++] = base*mult;\n\t\t\t\t\t\tindices[fidx++] = (base + tw + 1)*mult;\n\t\t\t\t\t\tindices[fidx++] = (base + 1)*mult;\n\n\t\t\t\t\t\tif (this._doubleSided) {\n\n\t\t\t\t\t\t\tindices[fidx++] = (base + tw + 1)*mult + 1;\n\t\t\t\t\t\t\tindices[fidx++] = (base + tw)*mult + 1;\n\t\t\t\t\t\t\tindices[fidx++] = base*mult + 1;\n\t\t\t\t\t\t\tindices[fidx++] = (base + 1)*mult + 1;\n\t\t\t\t\t\t\tindices[fidx++] = (base + tw + 1)*mult + 1;\n\t\t\t\t\t\t\tindices[fidx++] = base*mult + 1;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttriangleGeometry.updateIndices(indices);\n\n\t\t\ttriangleGeometry.updatePositions(positions);\n\t\t\ttriangleGeometry.updateVertexNormals(normals);\n\t\t\ttriangleGeometry.updateVertexTangents(tangents);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\tvar lineGeometry:LineSubGeometry = target;\n\n\t\t\tvar numSegments:number = (this._segmentsH + 1) + tw;\n\t\t\tvar startPositions:Array;\n\t\t\tvar endPositions:Array;\n\t\t\tvar thickness:Array;\n\n\t\t\tvar hw:number = this._width/2;\n\t\t\tvar hh:number = this._height/2;\n\n\n\t\t\tif (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) {\n\t\t\t\tstartPositions = lineGeometry.startPositions;\n\t\t\t\tendPositions = lineGeometry.endPositions;\n\t\t\t\tthickness = lineGeometry.thickness;\n\t\t\t} else {\n\t\t\t\tstartPositions = new Array(numSegments*3);\n\t\t\t\tendPositions = new Array(numSegments*3);\n\t\t\t\tthickness = new Array(numSegments);\n\t\t\t}\n\n\t\t\tfidx = 0;\n\n\t\t\tvidx = 0;\n\n\t\t\tfor (yi = 0; yi <= this._segmentsH; ++yi) {\n\t\t\t\tstartPositions[vidx] = -hw;\n\t\t\t\tstartPositions[vidx + 1] = 0;\n\t\t\t\tstartPositions[vidx + 2] = yi*this._height - hh;\n\n\t\t\t\tendPositions[vidx] = hw;\n\t\t\t\tendPositions[vidx + 1] = 0;\n\t\t\t\tendPositions[vidx + 2] = yi*this._height - hh;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\t\t\t}\n\n\n\t\t\tfor (xi = 0; xi <= this._segmentsW; ++xi) {\n\t\t\t\tstartPositions[vidx] = xi*this._width - hw;\n\t\t\t\tstartPositions[vidx + 1] = 0;\n\t\t\t\tstartPositions[vidx + 2] = -hh;\n\n\t\t\t\tendPositions[vidx] = xi*this._width - hw;\n\t\t\t\tendPositions[vidx + 1] = 0;\n\t\t\t\tendPositions[vidx + 2] = hh;\n\n\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\tvidx += 3;\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\tlineGeometry.updatePositions(startPositions, endPositions);\n\t\t\tlineGeometry.updateThickness(thickness);\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildUVs(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar uvs:Array;\n\t\tvar numVertices:number;\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tnumVertices = ( this._segmentsH + 1 )*( this._segmentsW + 1 );\n\n\t\t\tif (this._doubleSided)\n\t\t\t\tnumVertices *= 2;\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\tif (triangleGeometry.uvs && numVertices == triangleGeometry.numVertices) {\n\t\t\t\tuvs = triangleGeometry.uvs;\n\t\t\t} else {\n\t\t\t\tuvs = new Array(numVertices*2);\n\t\t\t\tthis._pInvalidateGeometry()\n\t\t\t}\n\n\t\t\tvar index:number = 0;\n\n\t\t\tfor (var yi:number = 0; yi <= this._segmentsH; ++yi) {\n\n\t\t\t\tfor (var xi:number = 0; xi <= this._segmentsW; ++xi) {\n\t\t\t\t\tuvs[index] = (xi/this._segmentsW)*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index + 1] = (1 - yi/this._segmentsH)*triangleGeometry.scaleV;\n\t\t\t\t\tindex += 2;\n\n\t\t\t\t\tif (this._doubleSided) {\n\t\t\t\t\t\tuvs[index] = (xi/this._segmentsW)*triangleGeometry.scaleU;\n\t\t\t\t\t\tuvs[index+1] = (1 - yi/this._segmentsH)*triangleGeometry.scaleV;\n\t\t\t\t\t\tindex += 2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttriangleGeometry.updateUVs(uvs);\n\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\t//nothing to do here\n\t\t}\n\t}\n}\n\nexport = PrimitivePlanePrefab;", + "import IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport PrimitiveCylinderPrefab\t= require(\"awayjs-core/lib/prefabs/PrimitiveCylinderPrefab\");\n\n/**\n * A UV RegularPolygon primitive mesh.\n */\nclass PrimitivePolygonPrefab extends PrimitiveCylinderPrefab implements IAsset\n{\n\n\t/**\n\t * The radius of the regular polygon.\n\t */\n\tpublic get radius():number\n\t{\n\t\treturn this._pBottomRadius;\n\t}\n\n\tpublic set radius(value:number)\n\t{\n\t\tthis._pBottomRadius = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The number of sides of the regular polygon.\n\t */\n\tpublic get sides():number\n\t{\n\t\treturn this._pSegmentsW;\n\t}\n\n\tpublic set sides(value:number)\n\t{\n\t\tthis.setSegmentsW(value);\n\t}\n\n\t/**\n\t * The number of subdivisions from the edge to the center of the regular polygon.\n\t */\n\tpublic get subdivisions():number\n\t{\n\t\treturn this._pSegmentsH;\n\t}\n\n\tpublic set subdivisions(value:number)\n\t{\n\t\tthis.setSegmentsH(value);\n\t}\n\n\t/**\n\t * Creates a new RegularPolygon disc object.\n\t * @param radius The radius of the regular polygon\n\t * @param sides Defines the number of sides of the regular polygon.\n\t * @param yUp Defines whether the regular polygon should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tconstructor(radius:number = 100, sides:number = 16, yUp:boolean = true)\n\t{\n\t\tsuper(radius, 0, 0, sides, 1, true, false, false, yUp);\n\t}\n}\n\nexport = PrimitivePolygonPrefab;", + "import DisplayObject\t\t\t= require(\"awayjs-core/lib/core/base/DisplayObject\");\nimport Geometry\t\t\t\t\t= require(\"awayjs-core/lib/core/base/Geometry\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport LineSubGeometry\t\t\t= require(\"awayjs-core/lib/core/base/LineSubGeometry\");\nimport AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport Mesh\t\t\t\t\t\t= require(\"awayjs-core/lib/entities/Mesh\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport MaterialBase\t\t\t\t= require(\"awayjs-core/lib/materials/MaterialBase\");\nimport PrefabBase\t\t\t\t= require(\"awayjs-core/lib/prefabs/PrefabBase\");\n\n/**\n * PrimitivePrefabBase is an abstract base class for polytope prefabs, which are simple pre-built geometric shapes\n */\nclass PrimitivePrefabBase extends PrefabBase\n{\n\tpublic _geomDirty:boolean = true;\n\tpublic _uvDirty:boolean = true;\n\n\tprivate _material:MaterialBase;\n\tprivate _geometry:Geometry;\n\tprivate _subGeometry:SubGeometryBase;\n\tprivate _geometryType:string;\n\tprivate _geometryTypeDirty:boolean = true;\n\n\n\t/**\n\t *\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.PRIMITIVE_PREFAB;\n\t}\n\n\t/**\n\t * \n\t */\n\tpublic get geometryType():string\n\t{\n\t\treturn this._geometryType;\n\t}\n\t\n\tpublic set geometryType(value:string)\n\t{\n\t\tif (this._geometryType == value)\n\t\t\treturn;\n\n\t\tthis._geometryType = value;\n\t\t\n\t\tthis.invalidateGeometryType();\n\t}\n\n\tpublic get geometry():Geometry\n\t{\n\t\tthis._iValidate();\n\n\t\treturn this._geometry;\n\t}\n\n\t/**\n\t * The material with which to render the primitive.\n\t */\n\tpublic get material():MaterialBase\n\t{\n\t\treturn this._material;\n\t}\n\n\tpublic set material(value:MaterialBase)\n\t{\n\t\tif (value == this._material)\n\t\t\treturn;\n\n\t\tthis._material = value;\n\n\t\tvar len:number = this._pObjects.length;\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\t( this._pObjects[i]).material = this._material;\n\t}\n\n\t/**\n\t * Creates a new PrimitivePrefabBase object.\n\t *\n\t * @param material The material with which to render the object\n\t */\n\tconstructor(material:MaterialBase = null, geometryType:string = \"triangleSubGeometry\")\n\t{\n\t\tsuper();\n\n\t\tthis._geometry = new Geometry();\n\t\tthis._material = material;\n\t\tthis._geometryType = geometryType;\n\t}\n\n\t/**\n\t * Builds the primitive's geometry when invalid. This method should not be called directly. The calling should\n\t * be triggered by the invalidateGeometry method (and in turn by updateGeometry).\n\t */\n\tpublic _pBuildGeometry(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t * Builds the primitive's uv coordinates when invalid. This method should not be called directly. The calling\n\t * should be triggered by the invalidateUVs method (and in turn by updateUVs).\n\t */\n\tpublic _pBuildUVs(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\t/**\n\t * Invalidates the primitive's geometry type, causing it to be updated when requested.\n\t */\n\tpublic invalidateGeometryType()\n\t{\n\t\tthis._geometryTypeDirty = true;\n\t\tthis._geomDirty = true;\n\t\tthis._uvDirty = true;\n\t}\n\t\n\t/**\n\t * Invalidates the primitive's geometry, causing it to be updated when requested.\n\t */\n\tpublic _pInvalidateGeometry()\n\t{\n\t\tthis._geomDirty = true;\n\t}\n\n\t/**\n\t * Invalidates the primitive's uv coordinates, causing them to be updated when requested.\n\t */\n\tpublic _pInvalidateUVs()\n\t{\n\t\tthis._uvDirty = true;\n\t}\n\n\t/**\n\t * Updates the subgeometry when invalid.\n\t */\n\tprivate updateGeometryType()\n\t{\n\t\t//remove any existing sub geometry\n\t\tif (this._subGeometry)\n\t\t\tthis._geometry.removeSubGeometry(this._subGeometry);\n\n\t\tif (this._geometryType == \"triangleSubGeometry\") {\n\t\t\tvar triangleGeometry:TriangleSubGeometry = new TriangleSubGeometry(true);\n\t\t\ttriangleGeometry.autoDeriveNormals = false;\n\t\t\ttriangleGeometry.autoDeriveTangents = false;\n\t\t\ttriangleGeometry.autoDeriveUVs = false;\n\t\t\tthis._geometry.addSubGeometry(triangleGeometry);\n\t\t\tthis._subGeometry = triangleGeometry;\n\t\t} else if (this._geometryType == \"lineSubGeometry\") {\n\t\t\tthis._geometry.addSubGeometry(this._subGeometry = new LineSubGeometry());\n\t\t}\n\n\t\tthis._geometryTypeDirty = false;\n\t}\n\n\t\n\t/**\n\t * Updates the geometry when invalid.\n\t */\n\tprivate updateGeometry()\n\t{\n\t\tthis._pBuildGeometry(this._subGeometry, this._geometryType);\n\n\t\tthis._geomDirty = false;\n\t}\n\n\t/**\n\t * Updates the uv coordinates when invalid.\n\t */\n\tprivate updateUVs()\n\t{\n\t\tthis._pBuildUVs(this._subGeometry, this._geometryType);\n\n\t\tthis._uvDirty = false;\n\t}\n\n\tpublic _iValidate()\n\t{\n\t\tif (this._geometryTypeDirty)\n\t\t\tthis.updateGeometryType();\n\t\t\n\t\tif (this._geomDirty)\n\t\t\tthis.updateGeometry();\n\n\t\tif (this._uvDirty)\n\t\t\tthis.updateUVs();\n\t}\n\n\n\tpublic _pCreateObject():DisplayObject\n\t{\n\t\tvar mesh:Mesh = new Mesh(this._geometry, this._material);\n\t\tmesh._iSourcePrefab = this;\n\n\t\treturn mesh;\n\t}\n\n\n//\t\tpublic _pCreateBatchObject():BatchObject\n//\t\t{\n//\t\t\tvar batch:BatchObject = new BatchObject(this._geometry, this._material);\n//\t\t\tbatch._iSourcePrefab = this;\n//\n//\t\t\treturn batch;\n//\t\t}\n}\n\nexport = PrimitivePrefabBase;", + "import LineSubGeometry\t\t\t= require(\"awayjs-core/lib/core/base/LineSubGeometry\");\nimport SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport PrimitivePrefabBase\t\t= require(\"awayjs-core/lib/prefabs/PrimitivePrefabBase\");\n\n/**\n * A UV Sphere primitive mesh.\n */\nclass PrimitiveSpherePrefab extends PrimitivePrefabBase implements IAsset\n{\n\tprivate _radius:number;\n\tprivate _segmentsW:number;\n\tprivate _segmentsH:number;\n\tprivate _yUp:boolean;\n\n\t/**\n\t * The radius of the sphere.\n\t */\n\tpublic get radius():number\n\t{\n\t\treturn this._radius;\n\t}\n\n\tpublic set radius(value:number)\n\t{\n\t\tthis._radius = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Defines the number of horizontal segments that make up the sphere. Defaults to 16.\n\t */\n\tpublic get segmentsW():number\n\t{\n\t\treturn this._segmentsW;\n\t}\n\n\tpublic set segmentsW(value:number)\n\t{\n\t\tthis._segmentsW = value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * Defines the number of vertical segments that make up the sphere. Defaults to 12.\n\t */\n\tpublic get segmentsH():number\n\t{\n\t\treturn this._segmentsH;\n\t}\n\n\tpublic set segmentsH(value:number)\n\t{\n\t\tthis._segmentsH = value;\n\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tpublic get yUp():boolean\n\t{\n\t\treturn this._yUp;\n\t}\n\n\tpublic set yUp(value:boolean)\n\t{\n\t\tthis._yUp = value;\n\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Creates a new Sphere object.\n\t *\n\t * @param radius The radius of the sphere.\n\t * @param segmentsW Defines the number of horizontal segments that make up the sphere.\n\t * @param segmentsH Defines the number of vertical segments that make up the sphere.\n\t * @param yUp Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tconstructor(radius:number = 50, segmentsW:number = 16, segmentsH:number = 12, yUp:boolean = true)\n\t{\n\t\tsuper();\n\n\t\tthis._radius = radius;\n\t\tthis._segmentsW = segmentsW;\n\t\tthis._segmentsH = segmentsH;\n\t\tthis._yUp = yUp;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildGeometry(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar indices:Array /*uint*/;\n\t\tvar positions:Array;\n\t\tvar normals:Array;\n\t\tvar tangents:Array;\n\n\t\tvar i:number;\n\t\tvar j:number;\n\t\tvar vidx:number, fidx:number; // indices\n\n\t\tvar comp1:number;\n\t\tvar comp2:number;\n\t\tvar numVertices:number;\n\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\tnumVertices = (this._segmentsH + 1)*(this._segmentsW + 1);\n\n\t\t\tif (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) {\n\t\t\t\tindices = triangleGeometry.indices;\n\t\t\t\tpositions = triangleGeometry.positions;\n\t\t\t\tnormals = triangleGeometry.vertexNormals;\n\t\t\t\ttangents = triangleGeometry.vertexTangents;\n\t\t\t} else {\n\t\t\t\tindices = new Array((this._segmentsH - 1)*this._segmentsW*6);\n\t\t\t\tpositions = new Array(numVertices*3);\n\t\t\t\tnormals = new Array(numVertices*3);\n\t\t\t\ttangents = new Array(numVertices*3);\n\n\t\t\t\tthis._pInvalidateUVs();\n\t\t\t}\n\n\t\t\tvidx = 0;\n\t\t\tfidx = 0;\n\n\t\t\tvar startIndex:number;\n\t\t\tvar t1:number;\n\t\t\tvar t2:number;\n\n\t\t\tfor (j = 0; j <= this._segmentsH; ++j) {\n\n\t\t\t\tstartIndex = vidx;\n\n\t\t\t\tvar horangle:number = Math.PI*j/this._segmentsH;\n\t\t\t\tvar z:number = -this._radius*Math.cos(horangle);\n\t\t\t\tvar ringradius:number = this._radius*Math.sin(horangle);\n\n\t\t\t\tfor (i = 0; i <= this._segmentsW; ++i) {\n\t\t\t\t\tvar verangle:number = 2*Math.PI*i/this._segmentsW;\n\t\t\t\t\tvar x:number = ringradius*Math.cos(verangle);\n\t\t\t\t\tvar y:number = ringradius*Math.sin(verangle);\n\t\t\t\t\tvar normLen:number = 1/Math.sqrt(x*x + y*y + z*z);\n\t\t\t\t\tvar tanLen:number = Math.sqrt(y*y + x*x);\n\n\t\t\t\t\tif (this._yUp) {\n\n\t\t\t\t\t\tt1 = 0;\n\t\t\t\t\t\tt2 = tanLen > .007? x/tanLen : 0;\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = y;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tt1 = tanLen > .007? x/tanLen : 0;\n\t\t\t\t\t\tt2 = 0;\n\t\t\t\t\t\tcomp1 = y;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i == this._segmentsW) {\n\t\t\t\t\t\tpositions[vidx] = positions[startIndex];\n\t\t\t\t\t\tpositions[vidx+1] = positions[startIndex + 1];\n\t\t\t\t\t\tpositions[vidx+2] = positions[startIndex + 2];\n\t\t\t\t\t\tnormals[vidx] = normals[startIndex] + (x*normLen)*.5;\n\t\t\t\t\t\tnormals[vidx+1] = normals[startIndex + 1] + ( comp1*normLen)*.5;\n\t\t\t\t\t\tnormals[vidx+2] = normals[startIndex + 2] + (comp2*normLen)*.5;\n\t\t\t\t\t\ttangents[vidx] = tanLen > .007? -y/tanLen : 1;\n\t\t\t\t\t\ttangents[vidx+1] = t1;\n\t\t\t\t\t\ttangents[vidx+2] = t2;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpositions[vidx] = x;\n\t\t\t\t\t\tpositions[vidx+1] = comp1;\n\t\t\t\t\t\tpositions[vidx+2] = comp2;\n\t\t\t\t\t\tnormals[vidx] = x*normLen;\n\t\t\t\t\t\tnormals[vidx+1] = comp1*normLen;\n\t\t\t\t\t\tnormals[vidx+2] = comp2*normLen;\n\t\t\t\t\t\ttangents[vidx] = tanLen > .007? -y/tanLen : 1;\n\t\t\t\t\t\ttangents[vidx+1] = t1;\n\t\t\t\t\t\ttangents[vidx+2] = t2;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i > 0 && j > 0) {\n\n\t\t\t\t\t\tvar a:number = (this._segmentsW + 1)*j + i;\n\t\t\t\t\t\tvar b:number = (this._segmentsW + 1)*j + i - 1;\n\t\t\t\t\t\tvar c:number = (this._segmentsW + 1)*(j - 1) + i - 1;\n\t\t\t\t\t\tvar d:number = (this._segmentsW + 1)*(j - 1) + i;\n\n\t\t\t\t\t\tif (j == this._segmentsH) {\n\n\t\t\t\t\t\t\tpositions[vidx] = positions[startIndex];\n\t\t\t\t\t\t\tpositions[vidx + 1] = positions[startIndex + 1];\n\t\t\t\t\t\t\tpositions[vidx + 2] = positions[startIndex + 2];\n\n\t\t\t\t\t\t\tindices[fidx++] = a;\n\t\t\t\t\t\t\tindices[fidx++] = c;\n\t\t\t\t\t\t\tindices[fidx++] = d;\n\n\t\t\t\t\t\t} else if (j == 1) {\n\n\t\t\t\t\t\t\tindices[fidx++] = a;\n\t\t\t\t\t\t\tindices[fidx++] = b;\n\t\t\t\t\t\t\tindices[fidx++] = c;\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tindices[fidx++] = a;\n\t\t\t\t\t\t\tindices[fidx++] = b;\n\t\t\t\t\t\t\tindices[fidx++] = c;\n\t\t\t\t\t\t\tindices[fidx++] = a;\n\t\t\t\t\t\t\tindices[fidx++] = c;\n\t\t\t\t\t\t\tindices[fidx++] = d;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvidx += 3;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttriangleGeometry.updateIndices(indices);\n\n\t\t\ttriangleGeometry.updatePositions(positions);\n\t\t\ttriangleGeometry.updateVertexNormals(normals);\n\t\t\ttriangleGeometry.updateVertexTangents(tangents);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\n\t\t\tvar lineGeometry:LineSubGeometry = target;\n\n\t\t\tvar numSegments:number = (this._segmentsH - 1)*this._segmentsW*2;\n\t\t\tvar startPositions:Array;\n\t\t\tvar endPositions:Array;\n\t\t\tvar thickness:Array;\n\n\t\t\tif (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) {\n\t\t\t\tstartPositions = lineGeometry.startPositions;\n\t\t\t\tendPositions = lineGeometry.endPositions;\n\t\t\t\tthickness = lineGeometry.thickness;\n\t\t\t} else {\n\t\t\t\tstartPositions = new Array(numSegments*3);\n\t\t\t\tendPositions = new Array(numSegments*3);\n\t\t\t\tthickness = new Array(numSegments);\n\t\t\t}\n\n\t\t\tvidx = 0;\n\n\t\t\tfidx = 0;\n\n\t\t\tfor (j = 0; j <= this._segmentsH; ++j) {\n\n\t\t\t\tvar horangle:number = Math.PI*j/this._segmentsH;\n\t\t\t\tvar z:number = -this._radius*Math.cos(horangle);\n\t\t\t\tvar ringradius:number = this._radius*Math.sin(horangle);\n\n\t\t\t\tfor (i = 0; i <= this._segmentsW; ++i) {\n\t\t\t\t\tvar verangle:number = 2*Math.PI*i/this._segmentsW;\n\t\t\t\t\tvar x:number = ringradius*Math.cos(verangle);\n\t\t\t\t\tvar y:number = ringradius*Math.sin(verangle);\n\n\t\t\t\t\tif (this._yUp) {\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = y;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcomp1 = y;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i > 0 && j > 0) {\n\t\t\t\t\t\t//horizonal lines\n\t\t\t\t\t\tif (j < this._segmentsH) {\n\t\t\t\t\t\t\tendPositions[vidx] = x;\n\t\t\t\t\t\t\tendPositions[vidx + 1] = comp1;\n\t\t\t\t\t\t\tendPositions[vidx + 2] = comp2;\n\n\t\t\t\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\t\t\t\tvidx += 3;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//vertical lines\n\t\t\t\t\t\tstartPositions[vidx] = endPositions[vidx - this._segmentsW*6];\n\t\t\t\t\t\tstartPositions[vidx + 1] = endPositions[vidx + 1 - this._segmentsW*6];\n\t\t\t\t\t\tstartPositions[vidx + 2] = endPositions[vidx + 2 - this._segmentsW*6];\n\n\t\t\t\t\t\tendPositions[vidx] = x;\n\t\t\t\t\t\tendPositions[vidx + 1] = comp1;\n\t\t\t\t\t\tendPositions[vidx + 2] = comp2;\n\n\t\t\t\t\t\tthickness[fidx++] = 1;\n\n\t\t\t\t\t\tvidx += 3;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i < this._segmentsW && j > 0 && j < this._segmentsH) {\n\t\t\t\t\t\tstartPositions[vidx] = x;\n\t\t\t\t\t\tstartPositions[vidx + 1] = comp1;\n\t\t\t\t\t\tstartPositions[vidx + 2] = comp2;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\tlineGeometry.updatePositions(startPositions, endPositions);\n\t\t\tlineGeometry.updateThickness(thickness);\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildUVs(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar i:number, j:number;\n\t\tvar numVertices:number = (this._segmentsH + 1)*(this._segmentsW + 1);\n\t\tvar uvs:Array;\n\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tnumVertices = (this._segmentsH + 1)*(this._segmentsW + 1);\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\tif (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) {\n\t\t\t\tuvs = triangleGeometry.uvs;\n\t\t\t} else {\n\t\t\t\tuvs = new Array(numVertices*2);\n\t\t\t}\n\n\t\t\tvar index:number = 0;\n\t\t\tfor (j = 0; j <= this._segmentsH; ++j) {\n\t\t\t\tfor (i = 0; i <= this._segmentsW; ++i) {\n\t\t\t\t\tuvs[index++] = ( i/this._segmentsW )*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( j/this._segmentsH )*triangleGeometry.scaleV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttriangleGeometry.updateUVs(uvs);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\t//nothing to do here\n\t\t}\n\t}\n}\n\nexport = PrimitiveSpherePrefab;", + "import SubGeometryBase\t\t\t= require(\"awayjs-core/lib/core/base/SubGeometryBase\");\nimport TriangleSubGeometry\t\t= require(\"awayjs-core/lib/core/base/TriangleSubGeometry\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport PrimitivePrefabBase\t\t= require(\"awayjs-core/lib/prefabs/PrimitivePrefabBase\");\n\n/**\n * A UV Cylinder primitive mesh.\n */\nclass PrimitiveTorusPrefab extends PrimitivePrefabBase implements IAsset\n{\n\tprivate _radius:number;\n\tprivate _tubeRadius:number;\n\tprivate _segmentsR:number;\n\tprivate _segmentsT:number;\n\tprivate _yUp:boolean;\n\tprivate _numVertices:number = 0;\n\n\t/**\n\t * The radius of the torus.\n\t */\n\tpublic get radius():number\n\t{\n\t\treturn this._radius;\n\t}\n\n\tpublic set radius(value:number)\n\t{\n\t\tthis._radius = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * The radius of the inner tube of the torus.\n\t */\n\tpublic get tubeRadius():number\n\t{\n\t\treturn this._tubeRadius;\n\t}\n\n\tpublic set tubeRadius(value:number)\n\t{\n\t\tthis._tubeRadius = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Defines the number of horizontal segments that make up the torus. Defaults to 16.\n\t */\n\tpublic get segmentsR():number\n\t{\n\t\treturn this._segmentsR;\n\t}\n\n\tpublic set segmentsR(value:number)\n\t{\n\t\tthis._segmentsR = value;\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * Defines the number of vertical segments that make up the torus. Defaults to 8.\n\t */\n\tpublic get segmentsT():number\n\t{\n\t\treturn this._segmentsT;\n\t}\n\n\tpublic set segmentsT(value:number)\n\t{\n\t\tthis._segmentsT = value;\n\t\tthis._pInvalidateGeometry();\n\t\tthis._pInvalidateUVs();\n\t}\n\n\t/**\n\t * Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tpublic get yUp():boolean\n\t{\n\t\treturn this._yUp;\n\t}\n\n\tpublic set yUp(value:boolean)\n\t{\n\t\tthis._yUp = value;\n\t\tthis._pInvalidateGeometry();\n\t}\n\n\t/**\n\t * Creates a new Torus object.\n\t * @param radius The radius of the torus.\n\t * @param tuebRadius The radius of the inner tube of the torus.\n\t * @param segmentsR Defines the number of horizontal segments that make up the torus.\n\t * @param segmentsT Defines the number of vertical segments that make up the torus.\n\t * @param yUp Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false).\n\t */\n\tconstructor(radius:number = 50, tubeRadius:number = 50, segmentsR:number = 16, segmentsT:number = 8, yUp:boolean = true)\n\t{\n\t\tsuper();\n\n\t\tthis._radius = radius;\n\t\tthis._tubeRadius = tubeRadius;\n\t\tthis._segmentsR = segmentsR;\n\t\tthis._segmentsT = segmentsT;\n\t\tthis._yUp = yUp;\n\t}\n\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildGeometry(target:SubGeometryBase, geometryType:string)\n\t{\n\t\tvar indices:Array /*uint*/;\n\t\tvar positions:Array;\n\t\tvar normals:Array;\n\t\tvar tangents:Array;\n\n\t\tvar i:number, j:number;\n\t\tvar x:number, y:number, z:number, nx:number, ny:number, nz:number, revolutionAngleR:number, revolutionAngleT:number;\n\t\tvar vidx:number;\n\t\tvar fidx:number;\n\t\tvar numIndices:number = 0;\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\t// evaluate target number of vertices, triangles and indices\n\t\t\tthis._numVertices = (this._segmentsT + 1)*(this._segmentsR + 1); // segmentsT + 1 because of closure, segmentsR + 1 because of closure\n\t\t\tnumIndices = this._segmentsT*this._segmentsR*6; // each level has segmentR quads, each of 2 triangles\n\n\t\t\t// need to initialize raw arrays or can be reused?\n\t\t\tif (this._numVertices == triangleGeometry.numVertices) {\n\t\t\t\tindices = triangleGeometry.indices;\n\t\t\t\tpositions = triangleGeometry.positions;\n\t\t\t\tnormals = triangleGeometry.vertexNormals;\n\t\t\t\ttangents = triangleGeometry.vertexTangents;\n\t\t\t} else {\n\t\t\t\tindices = new Array(numIndices)\n\t\t\t\tpositions = new Array(this._numVertices*3);\n\t\t\t\tnormals = new Array(this._numVertices*3);\n\t\t\t\ttangents = new Array(this._numVertices*3);\n\n\t\t\t\tthis._pInvalidateUVs();\n\t\t\t}\n\n\n\t\t\tvidx = 0;\n\t\t\tfidx = 0;\n\n\t\t\t// evaluate revolution steps\n\t\t\tvar revolutionAngleDeltaR:number = 2*Math.PI/this._segmentsR;\n\t\t\tvar revolutionAngleDeltaT:number = 2*Math.PI/this._segmentsT;\n\n\t\t\tvar comp1:number, comp2:number;\n\t\t\tvar t1:number, t2:number, n1:number, n2:number;\n\t\t\tvar startIndex:number = 0;\n\t\t\tvar nextVertexIndex:number = 0;\n\n\t\t\t// surface\n\t\t\tvar a:number, b:number, c:number, d:number, length:number;\n\n\t\t\tfor (j = 0; j <= this._segmentsT; ++j) {\n\n\t\t\t\tstartIndex = nextVertexIndex*3;\n\n\t\t\t\tfor (i = 0; i <= this._segmentsR; ++i) {\n\n\t\t\t\t\t// revolution vertex\n\t\t\t\t\trevolutionAngleR = i*revolutionAngleDeltaR;\n\t\t\t\t\trevolutionAngleT = j*revolutionAngleDeltaT;\n\n\t\t\t\t\tlength = Math.cos(revolutionAngleT);\n\t\t\t\t\tnx = length*Math.cos(revolutionAngleR);\n\t\t\t\t\tny = length*Math.sin(revolutionAngleR);\n\t\t\t\t\tnz = Math.sin(revolutionAngleT);\n\n\t\t\t\t\tx = this._radius*Math.cos(revolutionAngleR) + this._tubeRadius*nx;\n\t\t\t\t\ty = this._radius*Math.sin(revolutionAngleR) + this._tubeRadius*ny;\n\t\t\t\t\tz = (j == this._segmentsT)? 0 : this._tubeRadius*nz;\n\n\t\t\t\t\tif (this._yUp) {\n\n\t\t\t\t\t\tn1 = -nz;\n\t\t\t\t\t\tn2 = ny;\n\t\t\t\t\t\tt1 = 0;\n\t\t\t\t\t\tt2 = (length? nx/length : x/this._radius);\n\t\t\t\t\t\tcomp1 = -z;\n\t\t\t\t\t\tcomp2 = y;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tn1 = ny;\n\t\t\t\t\t\tn2 = nz;\n\t\t\t\t\t\tt1 = (length? nx/length : x/this._radius);\n\t\t\t\t\t\tt2 = 0;\n\t\t\t\t\t\tcomp1 = y;\n\t\t\t\t\t\tcomp2 = z;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (i == this._segmentsR) {\n\t\t\t\t\t\tpositions[vidx] = x;\n\t\t\t\t\t\tpositions[vidx + 1] = positions[startIndex + 1];\n\t\t\t\t\t\tpositions[vidx + 2] = positions[startIndex + 2];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tpositions[vidx] = x;\n\t\t\t\t\t\tpositions[vidx + 1] = comp1;\n\t\t\t\t\t\tpositions[vidx + 2] = comp2;\n\t\t\t\t\t}\n\n\t\t\t\t\tnormals[vidx] = nx;\n\t\t\t\t\tnormals[vidx + 1] = n1;\n\t\t\t\t\tnormals[vidx + 2] = n2;\n\t\t\t\t\ttangents[vidx] = -(length? ny/length : y/this._radius);\n\t\t\t\t\ttangents[vidx + 1] = t1;\n\t\t\t\t\ttangents[vidx + 2] = t2;\n\n\t\t\t\t\tvidx += 3;\n\n\t\t\t\t\t// close triangle\n\t\t\t\t\tif (i > 0 && j > 0) {\n\t\t\t\t\t\ta = nextVertexIndex; // current\n\t\t\t\t\t\tb = nextVertexIndex - 1; // previous\n\t\t\t\t\t\tc = b - this._segmentsR - 1; // previous of last level\n\t\t\t\t\t\td = a - this._segmentsR - 1; // current of last level\n\n\t\t\t\t\t\tindices[fidx++] = a;\n\t\t\t\t\t\tindices[fidx++] = b;\n\t\t\t\t\t\tindices[fidx++] = c;\n\n\t\t\t\t\t\tindices[fidx++] = a;\n\t\t\t\t\t\tindices[fidx++] = c;\n\t\t\t\t\t\tindices[fidx++] = d;\n\t\t\t\t\t}\n\n\t\t\t\t\tnextVertexIndex++;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\ttriangleGeometry.updateIndices(indices);\n\n\t\t\ttriangleGeometry.updatePositions(positions);\n\t\t\ttriangleGeometry.updateVertexNormals(normals);\n\t\t\ttriangleGeometry.updateVertexTangents(tangents);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\t//TODO\n\t\t}\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic _pBuildUVs(target:SubGeometryBase, geometryType:string)\n\t{\n\n\t\tvar i:number, j:number;\n\t\tvar uvs:Array;\n\n\n\t\tif (geometryType == \"triangleSubGeometry\") {\n\n\t\t\tvar triangleGeometry:TriangleSubGeometry = target;\n\n\t\t\t// need to initialize raw array or can be reused?\n\t\t\tif (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) {\n\t\t\t\tuvs = triangleGeometry.uvs;\n\t\t\t} else {\n\t\t\t\tuvs = new Array(this._numVertices*2);\n\t\t\t}\n\n\t\t\t// current uv component index\n\t\t\tvar index:number = 0;\n\n\t\t\t// surface\n\t\t\tfor (j = 0; j <= this._segmentsT; ++j) {\n\t\t\t\tfor (i = 0; i <= this._segmentsR; ++i) {\n\t\t\t\t\t// revolution vertex\n\t\t\t\t\tuvs[index++] = ( i/this._segmentsR )*triangleGeometry.scaleU;\n\t\t\t\t\tuvs[index++] = ( j/this._segmentsT )*triangleGeometry.scaleV;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// build real data from raw data\n\t\t\ttriangleGeometry.updateUVs(uvs);\n\n\t\t} else if (geometryType == \"lineSubGeometry\") {\n\t\t\t//nothing to do here\n\t\t}\n\t}\n}\n\nexport = PrimitiveTorusPrefab;", + "/**\n * Provides constant values for camera lens projection options use the the coordinateSystem property\n *\n * @see away.projections.PerspectiveLens#coordinateSystem\n */\nclass CoordinateSystem\n{\n\t/**\n\t * Default option, projects to a left-handed coordinate system\n\t */\n\tpublic static LEFT_HANDED:string = \"leftHanded\";\n\n\t/**\n\t * Projects to a right-handed coordinate system\n\t */\n\tpublic static RIGHT_HANDED:string = \"rightHanded\";\n}\n\nexport = CoordinateSystem;", + "import PerspectiveProjection\t= require(\"awayjs-core/lib/projections/PerspectiveProjection\");\nimport ProjectionBase\t\t\t= require(\"awayjs-core/lib/projections/ProjectionBase\");\n\nclass FreeMatrixProjection extends ProjectionBase\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\n\t\tthis._pMatrix.copyFrom(new PerspectiveProjection().matrix);\n\t}\n\n\t//@override\n\tpublic set near(value:number)\n\t{\n\t\tthis._pNear = value;\n\t}\n\n\t//@override\n\tpublic set far(value:number)\n\t{\n\t\tthis._pFar = value;\n\t}\n\n\t//@override\n\tpublic set iAspectRatio(value:number)\n\t{\n\t\tthis._pAspectRatio = value;\n\t}\n\n\t//@override\n\tpublic clone():ProjectionBase\n\t{\n\t\tvar clone:FreeMatrixProjection = new FreeMatrixProjection();\n\t\tclone._pMatrix.copyFrom(this._pMatrix);\n\t\tclone._pNear = this._pNear;\n\t\tclone._pFar = this._pFar;\n\t\tclone._pAspectRatio = this._pAspectRatio;\n\t\tclone.pInvalidateMatrix();\n\t\treturn clone;\n\t}\n\n\t//@override\n\tpublic pUpdateMatrix()\n\t{\n\t\tthis._pMatrixInvalid = false;\n\t}\n}\n\nexport = FreeMatrixProjection;", + "import Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport IEventDispatcher\t\t\t= require(\"awayjs-core/lib/events/IEventDispatcher\");\n\n/**\n * IMaterialOwner provides an interface for objects that can use materials.\n *\n * @interface away.base.IMaterialOwner\n */\ninterface IProjection extends IEventDispatcher\n{\n\tcoordinateSystem:string;\n\n\tfrustumCorners:Array\n\n\tmatrix:Matrix3D;\n\n\tnear:number;\n\n\toriginX:number;\n\n\toriginY:number;\n\n\tfar:number;\n\n\t_iAspectRatio:number;\n\n\tproject(point3d:Vector3D):Vector3D;\n\n\tunproject(nX:number, nY:number, sZ:number):Vector3D;\n\n\t_iUpdateScissorRect(x:number, y:number, width:number, height:number);\n\n\t_iUpdateViewport(x:number, y:number, width:number, height:number);\n}\n\nexport = IProjection;", + "import Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Plane3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Plane3D\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport ProjectionEvent\t\t\t= require(\"awayjs-core/lib/events/ProjectionEvent\");\nimport IProjection\t\t\t\t= require(\"awayjs-core/lib/projections/IProjection\");\nimport ProjectionBase\t\t\t= require(\"awayjs-core/lib/projections/ProjectionBase\");\n\nclass ObliqueNearPlaneProjection extends ProjectionBase\n{\n\n\tprivate _baseProjection:IProjection;\n\tprivate _plane:Plane3D;\n\tprivate _onProjectionMatrixChangedDelegate:(event:ProjectionEvent) => void;\n\n\tconstructor(baseProjection:IProjection, plane:Plane3D)\n\t{\n\t\tsuper();\n\t\tthis.baseProjection = baseProjection;\n\t\tthis.plane = plane;\n\n\t\tthis._onProjectionMatrixChangedDelegate = (event:ProjectionEvent) => this.onProjectionMatrixChanged(event);\n\t}\n\n\t//@override\n\tpublic get frustumCorners():number[]\n\t{\n\t\treturn this._baseProjection.frustumCorners;\n\t}\n\n\t//@override\n\tpublic get near():number\n\t{\n\t\treturn this._baseProjection.near;\n\t}\n\n\t//@override\n\tpublic set near(value:number)\n\t{\n\t\tthis._baseProjection.near = value;\n\t}\n\n\t//@override\n\tpublic get far():number\n\t{\n\t\treturn this._baseProjection.far;\n\t}\n\n\t//@override\n\tpublic set far(value:number)\n\t{\n\t\tthis._baseProjection.far = value;\n\t}\n\n\t//@override\n\tpublic get iAspectRatio():number\n\t{\n\t\treturn this._baseProjection._iAspectRatio;\n\t}\n\n\t//@override\n\tpublic set iAspectRatio(value:number)\n\t{\n\t\tthis._baseProjection._iAspectRatio = value;\n\t}\n\n\tpublic get plane():Plane3D\n\t{\n\t\treturn this._plane;\n\t}\n\n\tpublic set plane(value:Plane3D)\n\t{\n\t\tthis._plane = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic set baseProjection(value:IProjection)\n\t{\n\t\tif (this._baseProjection) {\n\t\t\tthis._baseProjection.removeEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate);\n\t\t}\n\t\tthis._baseProjection = value;\n\n\t\tif (this._baseProjection) {\n\t\t\tthis._baseProjection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate);\n\t\t}\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tprivate onProjectionMatrixChanged(event:ProjectionEvent)\n\t{\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\t//@override\n\tpublic pUpdateMatrix()\n\t{\n\t\tthis._pMatrix.copyFrom(this._baseProjection.matrix);\n\n\t\tvar cx:number = this._plane.a;\n\t\tvar cy:number = this._plane.b;\n\t\tvar cz:number = this._plane.c;\n\t\tvar cw:number = -this._plane.d + .05;\n\t\tvar signX:number = cx >= 0? 1 : -1;\n\t\tvar signY:number = cy >= 0? 1 : -1;\n\t\tvar p:Vector3D = new Vector3D(signX, signY, 1, 1);\n\t\tvar inverse:Matrix3D = this._pMatrix.clone();\n\t\tinverse.invert();\n\t\tvar q:Vector3D = inverse.transformVector(p);\n\t\tthis._pMatrix.copyRowTo(3, p);\n\t\tvar a:number = (q.x*p.x + q.y*p.y + q.z*p.z + q.w*p.w)/(cx*q.x + cy*q.y + cz*q.z + cw*q.w);\n\t\tthis._pMatrix.copyRowFrom(2, new Vector3D(cx*a, cy*a, cz*a, cw*a));\n\t}\n}\n\nexport = ObliqueNearPlaneProjection;", + "import Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport ProjectionBase\t\t\t= require(\"awayjs-core/lib/projections/ProjectionBase\");\n\nclass OrthographicOffCenterProjection extends ProjectionBase\n{\n\n\tprivate _minX:number;\n\tprivate _maxX:number;\n\tprivate _minY:number;\n\tprivate _maxY:number;\n\n\tconstructor(minX:number, maxX:number, minY:number, maxY:number)\n\t{\n\t\tsuper();\n\t\tthis._minX = minX;\n\t\tthis._maxX = maxX;\n\t\tthis._minY = minY;\n\t\tthis._maxY = maxY;\n\t}\n\n\tpublic get minX():number\n\t{\n\t\treturn this._minX;\n\t}\n\n\tpublic set minX(value:number)\n\t{\n\t\tthis._minX = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic get maxX():number\n\t{\n\t\treturn this._maxX;\n\t}\n\n\tpublic set maxX(value:number)\n\t{\n\t\tthis._maxX = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic get minY():number\n\t{\n\t\treturn this._minY;\n\t}\n\n\tpublic set minY(value:number)\n\t{\n\t\tthis._minY = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic get maxY():number\n\t{\n\t\treturn this._maxY;\n\t}\n\n\tpublic set maxY(value:number)\n\t{\n\t\tthis._maxY = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\t//@override\n\tpublic unproject(nX:number, nY:number, sZ:number):Vector3D\n\t{\n\t\tvar v:Vector3D = new Vector3D(nX, -nY, sZ, 1.0);\n\t\tv = this.unprojectionMatrix.transformVector(v);\n\t\t//z is unaffected by transform\n\t\tv.z = sZ;\n\n\t\treturn v;\n\t}\n\n\t//@override\n\tpublic clone():ProjectionBase\n\t{\n\t\tvar clone:OrthographicOffCenterProjection = new OrthographicOffCenterProjection(this._minX, this._maxX, this._minY, this._maxY);\n\t\tclone._pNear = this._pNear;\n\t\tclone._pFar = this._pFar;\n\t\tclone._pAspectRatio = this._pAspectRatio;\n\t\treturn clone;\n\t}\n\n\t//@override\n\tpublic pUpdateMatrix()\n\t{\n\t\tvar raw:number[] = [];\n\t\tvar w:number = 1/(this._maxX - this._minX);\n\t\tvar h:number = 1/(this._maxY - this._minY);\n\t\tvar d:number = 1/(this._pFar - this._pNear);\n\n\t\traw[0] = 2*w;\n\t\traw[5] = 2*h;\n\t\traw[10] = d;\n\t\traw[12] = -(this._maxX + this._minX)*w;\n\t\traw[13] = -(this._maxY + this._minY)*h;\n\t\traw[14] = -this._pNear*d;\n\t\traw[15] = 1;\n\t\traw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0;\n\t\tthis._pMatrix.copyRawDataFrom(raw);\n\n\t\tthis._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._minX;\n\t\tthis._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._maxX;\n\t\tthis._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._minY;\n\t\tthis._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._maxY;\n\t\tthis._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear;\n\t\tthis._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar;\n\n\t\tthis._pMatrixInvalid = false;\n\t}\n}\n\nexport = OrthographicOffCenterProjection;", + "import Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport ProjectionBase\t\t\t= require(\"awayjs-core/lib/projections/ProjectionBase\");\n\nclass OrthographicProjection extends ProjectionBase\n{\n\n\tprivate _projectionHeight:number;\n\tprivate _xMax:number;\n\tprivate _yMax:number;\n\n\tconstructor(projectionHeight:number = 500)\n\t{\n\t\tsuper();\n\t\tthis._projectionHeight = projectionHeight;\n\t}\n\n\tpublic get projectionHeight():number\n\t{\n\t\treturn this._projectionHeight;\n\t}\n\n\tpublic set projectionHeight(value:number)\n\t{\n\t\tif (value == this._projectionHeight) {\n\t\t\treturn;\n\t\t}\n\t\tthis._projectionHeight = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\t//@override\n\tpublic unproject(nX:number, nY:number, sZ:number):Vector3D\n\t{\n\t\tvar v:Vector3D = new Vector3D(nX + this.matrix.rawData[12], -nY + this.matrix.rawData[13], sZ, 1.0);\n\t\tv = this.unprojectionMatrix.transformVector(v);\n\n\t\t//z is unaffected by transform\n\t\tv.z = sZ;\n\n\t\treturn v;\n\t}\n\n\t//@override\n\tpublic clone():ProjectionBase\n\t{\n\t\tvar clone:OrthographicProjection = new OrthographicProjection();\n\t\tclone._pNear = this._pNear;\n\t\tclone._pFar = this._pFar;\n\t\tclone._pAspectRatio = this._pAspectRatio;\n\t\tclone.projectionHeight = this._projectionHeight;\n\t\treturn clone;\n\t}\n\n\t//@override\n\tpublic pUpdateMatrix()\n\t{\n\t\tvar raw:number[] = [];\n\t\tthis._yMax = this._projectionHeight*.5;\n\t\tthis._xMax = this._yMax*this._pAspectRatio;\n\n\t\tvar left:number;\n\t\tvar right:number;\n\t\tvar top:number;\n\t\tvar bottom:number;\n\n\t\tif (this._pScissorRect.x == 0 && this._pScissorRect.y == 0 && this._pScissorRect.width == this._pViewPort.width && this._pScissorRect.height == this._pViewPort.height) {\n\t\t\t// assume symmetric frustum\n\n\t\t\tleft = -this._xMax;\n\t\t\tright = this._xMax;\n\t\t\ttop = -this._yMax;\n\t\t\tbottom = this._yMax;\n\n\t\t\traw[0] = 2/(this._projectionHeight*this._pAspectRatio);\n\t\t\traw[5] = 2/this._projectionHeight;\n\t\t\traw[10] = 1/(this._pFar - this._pNear);\n\t\t\traw[14] = this._pNear/(this._pNear - this._pFar);\n\t\t\traw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = raw[12] = raw[13] = 0;\n\t\t\traw[15] = 1;\n\n\t\t} else {\n\n\t\t\tvar xWidth:number = this._xMax*(this._pViewPort.width/this._pScissorRect.width);\n\t\t\tvar yHgt:number = this._yMax*(this._pViewPort.height/this._pScissorRect.height);\n\t\t\tvar center:number = this._xMax*(this._pScissorRect.x*2 - this._pViewPort.width)/this._pScissorRect.width + this._xMax;\n\t\t\tvar middle:number = -this._yMax*(this._pScissorRect.y*2 - this._pViewPort.height)/this._pScissorRect.height - this._yMax;\n\n\t\t\tleft = center - xWidth;\n\t\t\tright = center + xWidth;\n\t\t\ttop = middle - yHgt;\n\t\t\tbottom = middle + yHgt;\n\n\t\t\traw[0] = 2*1/(right - left);\n\t\t\traw[5] = -2*1/(top - bottom);\n\t\t\traw[10] = 1/(this._pFar - this._pNear);\n\n\t\t\traw[12] = (right + left)/(right - left);\n\t\t\traw[13] = (bottom + top)/(bottom - top);\n\t\t\traw[14] = this._pNear/(this.near - this.far);\n\n\t\t\traw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0;\n\t\t\traw[15] = 1;\n\t\t}\n\n\t\tthis._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = left;\n\t\tthis._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = right;\n\t\tthis._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = top;\n\t\tthis._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = bottom;\n\t\tthis._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear;\n\t\tthis._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar;\n\n\t\tthis._pMatrix.copyRawDataFrom(raw);\n\n\t\tthis._pMatrixInvalid = false;\n\t}\n}\n\nexport= OrthographicProjection;", + "import Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport CoordinateSystem\t\t\t= require(\"awayjs-core/lib/projections/CoordinateSystem\");\nimport ProjectionBase\t\t\t= require(\"awayjs-core/lib/projections/ProjectionBase\");\n\nclass PerspectiveProjection extends ProjectionBase\n{\n\tprivate _fieldOfView:number = 60;\n\tprivate _focalLength:number = 1000;\n\tprivate _hFieldOfView:number = 60;\n\tprivate _hFocalLength:number = 1000;\n\tprivate _preserveAspectRatio:boolean = true;\n\tprivate _preserveFocalLength:boolean = false;\n\n\tconstructor(fieldOfView:number = 60, coordinateSystem:string = \"leftHanded\")\n\t{\n\t\tsuper(coordinateSystem);\n\t\tthis.fieldOfView = fieldOfView;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get preserveAspectRatio():boolean\n\t{\n\t\treturn this._preserveAspectRatio;\n\t}\n\n\tpublic set preserveAspectRatio(value:boolean)\n\t{\n\t\tif (this._preserveAspectRatio == value)\n\t\t\treturn;\n\n\t\tthis._preserveAspectRatio = value;\n\n\t\tif (this._preserveAspectRatio)\n\t\t\tthis.pInvalidateMatrix();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get preserveFocalLength():boolean\n\t{\n\t\treturn this._preserveFocalLength;\n\t}\n\n\tpublic set preserveFocalLength(value:boolean)\n\t{\n\t\tif (this._preserveFocalLength == value)\n\t\t\treturn;\n\n\t\tthis._preserveFocalLength = value;\n\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get fieldOfView():number\n\t{\n\t\treturn this._fieldOfView;\n\t}\n\n\tpublic set fieldOfView(value:number)\n\t{\n\t\tif (this._fieldOfView == value)\n\t\t\treturn;\n\n\t\tthis._fieldOfView = value;\n\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get focalLength():number\n\t{\n\t\treturn this._focalLength;\n\t}\n\n\tpublic set focalLength(value:number)\n\t{\n\t\tif (this._focalLength == value)\n\t\t\treturn;\n\n\t\tthis._focalLength = value;\n\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get hFieldOfView():number\n\t{\n\t\treturn this._hFieldOfView;\n\t}\n\n\tpublic set hFieldOfView(value:number)\n\t{\n\t\tif (this._hFieldOfView == value)\n\t\t\treturn;\n\n\t\tthis._hFieldOfView = value;\n\n\t\tthis._hFocalLength = 1/Math.tan(this._hFieldOfView*Math.PI/360);\n\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get hFocalLength():number\n\t{\n\t\treturn this._hFocalLength;\n\t}\n\n\tpublic set hFocalLength(value:number)\n\t{\n\t\tif (this._hFocalLength == value)\n\t\t\treturn;\n\n\t\tthis._hFocalLength = value;\n\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\n\t//@override\n\tpublic unproject(nX:number, nY:number, sZ:number):Vector3D\n\t{\n\t\tvar v:Vector3D = new Vector3D(nX, -nY, sZ, 1.0);\n\n\t\tv.x *= sZ;\n\t\tv.y *= sZ;\n\n\t\tv = this.unprojectionMatrix.transformVector(v);\n\n\t\t//z is unaffected by transform\n\t\tv.z = sZ;\n\n\t\treturn v;\n\t}\n\n\t//@override\n\tpublic clone():ProjectionBase\n\t{\n\t\tvar clone:PerspectiveProjection = new PerspectiveProjection(this._fieldOfView);\n\t\tclone._pNear = this._pNear;\n\t\tclone._pFar = this._pFar;\n\t\tclone._pAspectRatio = this._pAspectRatio;\n\t\tclone._pCoordinateSystem = this._pCoordinateSystem;\n\t\treturn clone;\n\t}\n\n\t//@override\n\tpublic pUpdateMatrix()\n\t{\n\t\tvar raw:number[] = [];\n\n\t\tif (this._preserveFocalLength) {\n\t\t\tif (this._preserveAspectRatio)\n\t\t\t\tthis._hFocalLength = this._focalLength;\n\n\t\t\tthis._fieldOfView = Math.atan(0.5*this._pScissorRect.height/this._focalLength)*360/Math.PI;\n\t\t\tthis._hFieldOfView = Math.atan(0.5*this._pScissorRect.width/this._hFocalLength)*360/Math.PI;\n\t\t} else {\n\t\t\tthis._focalLength = 0.5*this._pScissorRect.height/Math.tan(this._fieldOfView*Math.PI/360);\n\n\t\t\tif (this._preserveAspectRatio)\n\t\t\t\tthis._hFocalLength = this._focalLength;\n\t\t\telse\n\t\t\t\tthis._hFocalLength = 0.5*this._pScissorRect.width/Math.tan(this._hFieldOfView*Math.PI/360);\n\t\t}\n\n\t\tvar tanMinX = -this._pOriginX/this._hFocalLength;\n\t\tvar tanMaxX = (1 - this._pOriginX)/this._hFocalLength;\n\t\tvar tanMinY = -this._pOriginY/this._focalLength;\n\t\tvar tanMaxY = (1 - this._pOriginY)/this._focalLength;\n\n\t\tvar left:number;\n\t\tvar right:number;\n\t\tvar top:number;\n\t\tvar bottom:number;\n\n\t\t// assume scissored frustum\n\t\tvar center:number = -((tanMinX - tanMaxX)*this._pScissorRect.x + tanMinX*this._pScissorRect.width);\n\t\tvar middle:number = ((tanMinY - tanMaxY)*this._pScissorRect.y + tanMinY*this._pScissorRect.height);\n\n\t\tleft = center - (tanMaxX - tanMinX)*this._pViewPort.width;\n\t\tright = center;\n\t\ttop = middle;\n\t\tbottom = middle + (tanMaxY - tanMinY)*this._pViewPort.height;\n\n\t\traw[0] = 2/(right - left);\n\t\traw[5] = 2/(bottom - top);\n\t\traw[8] = (right + left)/(right - left);\n\t\traw[9] = (bottom + top)/(bottom - top);\n\t\traw[10] = (this._pFar + this._pNear)/(this._pFar - this._pNear);\n\t\traw[11] = 1;\n\t\traw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[12] = raw[13] = raw[15] = 0;\n\t\traw[14] = -2*this._pFar*this._pNear/(this._pFar - this._pNear);\n\n\t\tif (this._pCoordinateSystem == CoordinateSystem.RIGHT_HANDED)\n\t\t\traw[5] = -raw[5];\n\n\t\tthis._pMatrix.copyRawDataFrom(raw);\n\n\t\tthis._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pNear*left;\n\t\tthis._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pNear*right;\n\t\tthis._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pNear*top;\n\t\tthis._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pNear*bottom;\n\n\t\tthis._pFrustumCorners[12] = this._pFrustumCorners[21] = this._pFar*left;\n\t\tthis._pFrustumCorners[15] = this._pFrustumCorners[18] = this._pFar*right;\n\t\tthis._pFrustumCorners[13] = this._pFrustumCorners[16] = this._pFar*top;\n\t\tthis._pFrustumCorners[19] = this._pFrustumCorners[22] = this._pFar*bottom;\n\n\t\tthis._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear;\n\t\tthis._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar;\n\n\t\tthis._pMatrixInvalid = false;\n\n\n\t}\n}\n\nexport = PerspectiveProjection;", + "import Matrix3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix3D\");\nimport Rectangle\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport Vector3D\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Vector3D\");\nimport EventDispatcher\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport ProjectionEvent\t\t\t= require(\"awayjs-core/lib/events/ProjectionEvent\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport IProjection\t\t\t\t= require(\"awayjs-core/lib/projections/IProjection\");\n\nclass ProjectionBase extends EventDispatcher implements IProjection\n{\n\tpublic _pMatrix:Matrix3D = new Matrix3D();\n\tpublic _pScissorRect:Rectangle = new Rectangle();\n\tpublic _pViewPort:Rectangle = new Rectangle();\n\tpublic _pNear:number = 20;\n\tpublic _pFar:number = 3000;\n\tpublic _pAspectRatio:number = 1;\n\n\tpublic _pMatrixInvalid:boolean = true;\n\tpublic _pFrustumCorners:number[] = [];\n\tpublic _pCoordinateSystem:string;\n\tpublic _pOriginX:number = 0.5;\n\tpublic _pOriginY:number = 0.5;\n\n\tprivate _unprojection:Matrix3D;\n\tprivate _unprojectionInvalid:boolean = true;\n\n\tconstructor(coordinateSystem:string = \"leftHanded\")\n\t{\n\t\tsuper();\n\n\t\tthis.coordinateSystem = coordinateSystem;\n\t}\n\n\t/**\n\t * The handedness of the coordinate system projection. The default is LEFT_HANDED.\n\t */\n\tpublic get coordinateSystem():string\n\t{\n\t\treturn this._pCoordinateSystem;\n\t}\n\n\tpublic set coordinateSystem(value:string)\n\t{\n\t\tif (this._pCoordinateSystem == value)\n\t\t\treturn;\n\n\t\tthis._pCoordinateSystem = value;\n\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic get frustumCorners():number[]\n\t{\n\t\treturn this._pFrustumCorners;\n\t}\n\n\tpublic set frustumCorners(frustumCorners:number[])\n\t{\n\t\tthis._pFrustumCorners = frustumCorners;\n\t}\n\n\tpublic get matrix():Matrix3D\n\t{\n\t\tif (this._pMatrixInvalid) {\n\t\t\tthis.pUpdateMatrix();\n\t\t\tthis._pMatrixInvalid = false;\n\t\t}\n\t\treturn this._pMatrix;\n\t}\n\n\tpublic set matrix(value:Matrix3D)\n\t{\n\t\tthis._pMatrix = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic get near():number\n\t{\n\t\treturn this._pNear;\n\t}\n\n\tpublic set near(value:number)\n\t{\n\t\tif (value == this._pNear) {\n\t\t\treturn;\n\t\t}\n\t\tthis._pNear = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic get originX():number\n\t{\n\t\treturn this._pOriginX;\n\t}\n\n\tpublic set originX(value:number)\n\t{\n\t\tif (this._pOriginX == value)\n\t\t\treturn;\n\n\t\tthis._pOriginX = value;\n\t}\n\n\tpublic get originY():number\n\t{\n\t\treturn this._pOriginY;\n\t}\n\n\tpublic set originY(value:number)\n\t{\n\t\tif (this._pOriginY == value)\n\t\t\treturn;\n\n\t\tthis._pOriginY = value;\n\t}\n\n\tpublic get far():number\n\t{\n\t\treturn this._pFar;\n\t}\n\n\tpublic set far(value:number)\n\t{\n\t\tif (value == this._pFar) {\n\t\t\treturn;\n\t\t}\n\t\tthis._pFar = value;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic project(point3d:Vector3D):Vector3D\n\t{\n\t\tvar v:Vector3D = this.matrix.transformVector(point3d);\n\t\tv.x = v.x/v.w;\n\t\tv.y = -v.y/v.w;\n\n\t\t//z is unaffected by transform\n\t\tv.z = point3d.z;\n\n\t\treturn v;\n\t}\n\n\tpublic get unprojectionMatrix():Matrix3D\n\t{\n\t\tif (this._unprojectionInvalid) {\n\t\t\tif (!this._unprojection)\n\t\t\t\tthis._unprojection = new Matrix3D();\n\n\t\t\tthis._unprojection.copyFrom(this.matrix);\n\t\t\tthis._unprojection.invert();\n\t\t\tthis._unprojectionInvalid = false;\n\t\t}\n\t\treturn this._unprojection;\n\t}\n\n\tpublic unproject(nX:number, nY:number, sZ:number):Vector3D\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic clone():ProjectionBase\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic get _iAspectRatio():number\n\t{\n\t\treturn this._pAspectRatio;\n\t}\n\n\tpublic set _iAspectRatio(value:number)\n\t{\n\t\tif (this._pAspectRatio == value)\n\t\t\treturn;\n\n\t\tthis._pAspectRatio = value;\n\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic pInvalidateMatrix()\n\t{\n\t\tthis._pMatrixInvalid = true;\n\t\tthis._unprojectionInvalid = true;\n\t\tthis.dispatchEvent(new ProjectionEvent(ProjectionEvent.MATRIX_CHANGED, this));\n\t}\n\n\tpublic pUpdateMatrix()\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n\n\tpublic _iUpdateScissorRect(x:number, y:number, width:number, height:number)\n\t{\n\t\tthis._pScissorRect.x = x;\n\t\tthis._pScissorRect.y = y;\n\t\tthis._pScissorRect.width = width;\n\t\tthis._pScissorRect.height = height;\n\t\tthis.pInvalidateMatrix();\n\t}\n\n\tpublic _iUpdateViewport(x:number, y:number, width:number, height:number)\n\t{\n\t\tthis._pViewPort.x = x;\n\t\tthis._pViewPort.y = y;\n\t\tthis._pViewPort.width = width;\n\t\tthis._pViewPort.height = height;\n\t\tthis.pInvalidateMatrix();\n\t}\n}\n\nexport = ProjectionBase;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport CubeTextureBase\t\t\t= require(\"awayjs-core/lib/textures/CubeTextureBase\");\nimport TextureUtils\t\t\t\t= require(\"awayjs-core/lib/utils/TextureUtils\");\n\nclass BitmapCubeTexture extends CubeTextureBase\n{\n\tprivate _bitmapDatas:Array = new Array(6);\n\n\t/**\n\t * The texture on the cube's right face.\n\t */\n\tpublic get positiveX():BitmapData\n\t{\n\t\treturn this._bitmapDatas[0];\n\t}\n\n\tpublic set positiveX(value:BitmapData)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._bitmapDatas[0] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's left face.\n\t */\n\tpublic get negativeX():BitmapData\n\t{\n\t\treturn this._bitmapDatas[1];\n\t}\n\n\tpublic set negativeX(value:BitmapData)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._bitmapDatas[1] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's top face.\n\t */\n\tpublic get positiveY():BitmapData\n\t{\n\t\treturn this._bitmapDatas[2];\n\t}\n\n\tpublic set positiveY(value:BitmapData)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._bitmapDatas[2] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's bottom face.\n\t */\n\tpublic get negativeY():BitmapData\n\t{\n\t\treturn this._bitmapDatas[3];\n\t}\n\n\tpublic set negativeY(value:BitmapData)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._bitmapDatas[3] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's far face.\n\t */\n\tpublic get positiveZ():BitmapData\n\t{\n\t\treturn this._bitmapDatas[4];\n\t}\n\n\tpublic set positiveZ(value:BitmapData)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._bitmapDatas[4] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's near face.\n\t */\n\tpublic get negativeZ():BitmapData\n\t{\n\t\treturn this._bitmapDatas[5];\n\t}\n\n\tpublic set negativeZ(value:BitmapData)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._bitmapDatas[5] = value;\n\t}\n\n\tconstructor(posX:BitmapData, negX:BitmapData, posY:BitmapData, negY:BitmapData, posZ:BitmapData, negZ:BitmapData, generateMipmaps:boolean = false)\n\t{\n\t\tsuper(generateMipmaps);\n\n\t\tthis._testSize(this._bitmapDatas[0] = posX);\n\t\tthis._testSize(this._bitmapDatas[1] = negX);\n\t\tthis._testSize(this._bitmapDatas[2] = posY);\n\t\tthis._testSize(this._bitmapDatas[3] = negY);\n\t\tthis._testSize(this._bitmapDatas[4] = posZ);\n\t\tthis._testSize(this._bitmapDatas[5] = negZ);\n\n\t\tthis.invalidateContent();\n\n\t\tthis._pSetSize(posX.width);\n\t}\n\n\t/**\n\t *\n\t * @param value\n\t * @private\n\t */\n\tprivate _testSize(value:BitmapData)\n\t{\n\t\tif (value.width != value.height)\n\t\t\tthrow new Error(\"BitmapData should have equal width and height!\");\n\t\tif (!TextureUtils.isBitmapDataValid(value))\n\t\t\tthrow new Error(\"Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048\");\n\t}\n\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\n\t\tvar len:number = this._bitmapDatas.length\n\t\tfor (var i:number = 0; i < len; i++) {\n\t\t\tthis._bitmapDatas[i].dispose();\n\t\t\tthis._bitmapDatas[i] = null;\n\t\t}\n\n\t\tthis._bitmapDatas = null;\n\t}\n\n\tpublic _iGetTextureData(side:number):BitmapData\n\t{\n\t\treturn this._bitmapDatas[side];\n\t}\n}\n\nexport = BitmapCubeTexture;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport Texture2DBase\t\t\t= require(\"awayjs-core/lib/textures/Texture2DBase\");\nimport TextureUtils\t\t\t\t= require(\"awayjs-core/lib/utils/TextureUtils\");\n\nclass BitmapTexture extends Texture2DBase\n{\n\tpublic _bitmapData:BitmapData;\n\n\t/**\n\t *\n\t * @returns {BitmapData}\n\t */\n\tpublic get bitmapData():BitmapData\n\t{\n\t\treturn this._bitmapData;\n\t}\n\n\tpublic set bitmapData(value:BitmapData)\n\t{\n\t\tif (this._bitmapData == value)\n\t\t\treturn;\n\n\t\tif (!TextureUtils.isBitmapDataValid(value))\n\t\t\tthrow new Error(\"Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048\");\n\n\t\tthis._bitmapData = value;\n\n\t\tthis.invalidateContent();\n\n\t\tthis._pSetSize(value.width, value.height);\n\t}\n\n\tconstructor(bitmapData:BitmapData, generateMipmaps:boolean = false)\n\t{\n\t\tsuper(generateMipmaps);\n\n\t\tthis.bitmapData = bitmapData;\n\t}\n\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\n\t\tthis._bitmapData.dispose();\n\t\tthis._bitmapData = null;\n\t}\n\n\tpublic _iGetTextureData():BitmapData\n\t{\n\t\treturn this._bitmapData;\n\t}\n}\n\nexport = BitmapTexture;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport MipmapGenerator\t\t\t= require(\"awayjs-core/lib/textures/MipmapGenerator\");\nimport TextureProxyBase\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\nclass CubeTextureBase extends TextureProxyBase\n{\n\tpublic _mipmapDataArray:Array> = new Array>(6);\n\tpublic _mipmapDataDirtyArray:Array = new Array(6);\n\n\tconstructor(generateMipmaps:boolean = false)\n\t{\n\t\tsuper(generateMipmaps);\n\t}\n\n\t/**\n\t *\n\t * @param width\n\t * @param height\n\t * @private\n\t */\n\tpublic _pSetSize(size:number)\n\t{\n\t\tif (this._pSize != size)\n\t\t\tthis.invalidateSize();\n\n\t\tfor (var i:number = 0; i < 6; i++)\n\t\t\tthis._mipmapDataDirtyArray[i] = true;\n\n\t\tthis._pSize = size;\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\n\t\tfor (var i:number = 0; i < 6; i++) {\n\t\t\tvar mipmapData:Array = this._mipmapDataArray[i];\n\t\t\tvar len:number = mipmapData.length;\n\t\t\tfor (var j:number = 0; j < len; j++)\n\t\t\t\tMipmapGenerator.freeMipMapHolder(mipmapData[j]);\n\t\t}\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic invalidateContent():void\n\t{\n\t\tsuper.invalidateContent();\n\n\t\tfor (var i:number = 0; i < 6; i++)\n\t\t\tthis._mipmapDataDirtyArray[i] = true;\n\t}\n\n\tpublic _iGetMipmapData(side:number):Array\n\t{\n\t\tif (this._mipmapDataDirtyArray[side]) {\n\t\t\tthis._mipmapDataDirtyArray[side] = false;\n\n\t\t\tvar mipmapData:Array = this._mipmapDataArray[side] || (this._mipmapDataArray[side] = new Array());\n\t\t\tMipmapGenerator.generateMipMaps(this._iGetTextureData(side), mipmapData, true);\n\t\t}\n\n\t\treturn this._mipmapDataArray[side];\n\t}\n\n\tpublic _iGetTextureData(side:number):any\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n}\n\nexport = CubeTextureBase;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport CubeTextureBase\t\t\t= require(\"awayjs-core/lib/textures/CubeTextureBase\");\nimport TextureUtils\t\t\t\t= require(\"awayjs-core/lib/utils/TextureUtils\");\n\nclass ImageCubeTexture extends CubeTextureBase\n{\n\tprivate _htmlImageElements:Array = new Array(6);\n\n\t/**\n\t * The texture on the cube's right face.\n\t */\n\tpublic get positiveX():HTMLImageElement\n\t{\n\t\treturn this._htmlImageElements[0];\n\t}\n\n\tpublic set positiveX(value:HTMLImageElement)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._htmlImageElements[0] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's left face.\n\t */\n\tpublic get negativeX():HTMLImageElement\n\t{\n\t\treturn this._htmlImageElements[1];\n\t}\n\n\tpublic set negativeX(value:HTMLImageElement)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._htmlImageElements[1] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's top face.\n\t */\n\tpublic get positiveY():HTMLImageElement\n\t{\n\t\treturn this._htmlImageElements[2];\n\t}\n\n\tpublic set positiveY(value:HTMLImageElement)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._htmlImageElements[2] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's bottom face.\n\t */\n\tpublic get negativeY():HTMLImageElement\n\t{\n\t\treturn this._htmlImageElements[3];\n\t}\n\n\tpublic set negativeY(value:HTMLImageElement)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._htmlImageElements[3] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's far face.\n\t */\n\tpublic get positiveZ():HTMLImageElement\n\t{\n\t\treturn this._htmlImageElements[4];\n\t}\n\n\tpublic set positiveZ(value:HTMLImageElement)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._htmlImageElements[4] = value;\n\t}\n\n\t/**\n\t * The texture on the cube's near face.\n\t */\n\tpublic get negativeZ():HTMLImageElement\n\t{\n\t\treturn this._htmlImageElements[5];\n\t}\n\n\tpublic set negativeZ(value:HTMLImageElement)\n\t{\n\t\tthis._testSize(value);\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width);\n\t\tthis._htmlImageElements[5] = value;\n\t}\n\n\tconstructor(posX:HTMLImageElement, negX:HTMLImageElement, posY:HTMLImageElement, negY:HTMLImageElement, posZ:HTMLImageElement, negZ:HTMLImageElement, generateMipmaps:boolean = false)\n\t{\n\t\tsuper(generateMipmaps);\n\n\t\tthis._testSize(this._htmlImageElements[0] = posX);\n\t\tthis._testSize(this._htmlImageElements[1] = negX);\n\t\tthis._testSize(this._htmlImageElements[2] = posY);\n\t\tthis._testSize(this._htmlImageElements[3] = negY);\n\t\tthis._testSize(this._htmlImageElements[4] = posZ);\n\t\tthis._testSize(this._htmlImageElements[5] = negZ);\n\n\t\tthis.invalidateContent();\n\n\t\tthis._pSetSize(posX.width);\n\t}\n\n\tprivate _testSize(value:HTMLImageElement)\n\t{\n\t\tif (value.width != value.height)\n\t\t\tthrow new Error(\"BitmapData should have equal width and height!\");\n\t\tif (!TextureUtils.isHTMLImageElementValid(value))\n\t\t\tthrow new Error(\"Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048\");\n\t}\n\n\tpublic _iGetTextureData(side:number):HTMLImageElement\n\t{\n\t\treturn this._htmlImageElements[side];\n\t}\n}\n\nexport = ImageCubeTexture;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport Texture2DBase\t\t\t= require(\"awayjs-core/lib/textures/Texture2DBase\");\nimport TextureUtils\t\t\t\t= require(\"awayjs-core/lib/utils/TextureUtils\");\n\nclass ImageTexture extends Texture2DBase\n{\n\tprivate _htmlImageElement:HTMLImageElement;\n\n\t/**\n\t *\n\t * @param htmlImageElement\n\t * @param generateMipmaps\n\t */\n\tconstructor(htmlImageElement:HTMLImageElement, generateMipmaps:boolean = false)\n\t{\n\t\tsuper(generateMipmaps);\n\n\t\tthis.htmlImageElement = htmlImageElement;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic get htmlImageElement():HTMLImageElement\n\t{\n\t\treturn this._htmlImageElement;\n\t}\n\n\tpublic set htmlImageElement(value:HTMLImageElement)\n\t{\n\t\tif (this._htmlImageElement == value)\n\t\t\treturn;\n\n\t\tif (!TextureUtils.isHTMLImageElementValid(value))\n\t\t\tthrow new Error(\"Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048\");\n\n\t\tthis._htmlImageElement = value;\n\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(value.width, value.height);\n\t}\n\n\tpublic _iGetTextureData():HTMLImageElement\n\t{\n\t\treturn this._htmlImageElement;\n\t}\n}\n\nexport = ImageTexture;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport Matrix\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Matrix\");\nimport Rectangle\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\n\n/**\n * MipmapGenerator is a helper class that uploads BitmapData to a Texture including mipmap levels.\n */\nclass MipmapGenerator\n{\n\tprivate static _mipMaps = [];\n\tprivate static _mipMapUses = [];\n\n\tprivate static _matrix:Matrix = new Matrix();\n\tprivate static _rect:Rectangle = new Rectangle();\n\tprivate static _source:BitmapData;\n\n\t/**\n\t * Uploads a BitmapData with mip maps to a target Texture object.\n\t * @param source The source to upload.\n\t * @param target The target Texture to upload to.\n\t * @param mipmap An optional mip map holder to avoids creating new instances for fe animated materials.\n\t * @param alpha Indicate whether or not the uploaded bitmapData is transparent.\n\t */\n\tpublic static generateMipMaps(source:HTMLImageElement, output?:Array, alpha?:boolean);\n\tpublic static generateMipMaps(source:BitmapData, output?:Array, alpha?:boolean);\n\tpublic static generateMipMaps(source:any, output?:Array, alpha:boolean = false)\n\t{\n\t\tvar w:number = source.width;\n\t\tvar h:number = source.height;\n\t\tvar i:number = 0;\n\n\t\tvar mipmap:BitmapData;\n\n\t\tMipmapGenerator._rect.width = w;\n\t\tMipmapGenerator._rect.height = h;\n\n\t\twhile (w >= 1 && h >= 1) {\n\n\t\t\tmipmap = output[i] = MipmapGenerator._getMipmapHolder(output[i], w, h);\n\n\t\t\tif (alpha)\n\t\t\t\tmipmap.fillRect(MipmapGenerator._rect, 0);\n\n\t\t\tMipmapGenerator._matrix.a = MipmapGenerator._rect.width/source.width;\n\t\t\tMipmapGenerator._matrix.d = MipmapGenerator._rect.height/source.height;\n\n\t\t\tmipmap.draw(source, MipmapGenerator._matrix); //TODO: smoothing?\n\n\t\t\tw >>= 1;\n\t\t\th >>= 1;\n\n\t\t\tMipmapGenerator._rect.width = w > 1? w : 1;\n\t\t\tMipmapGenerator._rect.height = h > 1? h : 1;\n\n\t\t\ti++;\n\t\t}\n\t}\n\n\tprivate static _getMipmapHolder(mipMapHolder:BitmapData, newW:number, newH:number):BitmapData\n\t{\n\t\tif (mipMapHolder) {\n\t\t\tif (mipMapHolder.width == newW && mipMapHolder.height == newH)\n\t\t\t\treturn mipMapHolder;\n\n\t\t\tMipmapGenerator.freeMipMapHolder(mipMapHolder);\n\t\t}\n\n\t\tif (!MipmapGenerator._mipMaps[newW]) {\n\t\t\tMipmapGenerator._mipMaps[newW] = [];\n\t\t\tMipmapGenerator._mipMapUses[newW] = [];\n\t\t}\n\n\t\tif (!MipmapGenerator._mipMaps[newW][newH]) {\n\t\t\tmipMapHolder = MipmapGenerator._mipMaps[newW][newH] = new BitmapData(newW, newH, true);\n\t\t\tMipmapGenerator._mipMapUses[newW][newH] = 1;\n\t\t} else {\n\t\t\tMipmapGenerator._mipMapUses[newW][newH] = MipmapGenerator._mipMapUses[newW][newH] + 1;\n\t\t\tmipMapHolder = MipmapGenerator._mipMaps[newW][newH];\n\t\t}\n\n\t\treturn mipMapHolder;\n\t}\n\n\tpublic static freeMipMapHolder(mipMapHolder:BitmapData)\n\t{\n\t\tvar holderWidth:number = mipMapHolder.width;\n\t\tvar holderHeight:number = mipMapHolder.height;\n\n\t\tif (--MipmapGenerator._mipMapUses[holderWidth][holderHeight] == 0) {\n\t\t\tMipmapGenerator._mipMaps[holderWidth][holderHeight].dispose();\n\t\t\tMipmapGenerator._mipMaps[holderWidth][holderHeight] = null;\n\t\t}\n\t}\n}\n\nexport = MipmapGenerator;", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport Texture2DBase\t\t\t= require(\"awayjs-core/lib/textures/Texture2DBase\");\nimport TextureUtils\t\t\t\t= require(\"awayjs-core/lib/utils/TextureUtils\");\n\nclass RenderTexture extends Texture2DBase\n{\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get width():number\n\t{\n\t\treturn this._pWidth;\n\t}\n\n\tpublic set width(value:number)\n\t{\n\t\tif (value == this._pWidth)\n\t\t\treturn;\n\n\t\tif (!TextureUtils.isDimensionValid(value))\n\t\t\tthrow new Error(\"Invalid size: Width and height must be power of 2 and cannot exceed 2048\");\n\n\t\tthis.invalidateContent();\n\n\t\tthis._pSetSize(value, this._pHeight);\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._pHeight;\n\t}\n\n\tpublic set height(value:number)\n\t{\n\t\tif (value == this._pHeight)\n\t\t\treturn;\n\n\t\tif (!TextureUtils.isDimensionValid(value))\n\t\t\tthrow new Error(\"Invalid size: Width and height must be power of 2 and cannot exceed 2048\");\n\n\t\tthis.invalidateContent();\n\t\tthis._pSetSize(this._pWidth, value);\n\t}\n\n\tconstructor(width:number, height:number)\n\t{\n\t\tsuper(false);\n\n\t\tthis._pSetSize(width, height);\n\t}\n}\n\nexport = RenderTexture;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport BitmapDataChannel\t\t= require(\"awayjs-core/lib/core/base/BitmapDataChannel\");\nimport Point\t\t\t\t\t= require(\"awayjs-core/lib/core/geom/Point\");\nimport Rectangle\t\t\t\t= require(\"awayjs-core/lib/core/geom/Rectangle\");\nimport BitmapTexture\t\t\t= require(\"awayjs-core/lib/textures/BitmapTexture\");\n\n/**\n * A convenience texture that encodes a specular map in the red channel, and the gloss map in the green channel, as expected by BasicSpecularMapMethod\n */\nclass SpecularBitmapTexture extends BitmapTexture\n{\n\tprivate _specularMap:BitmapData;\n\tprivate _glossMap:BitmapData;\n\t\n\tconstructor(specularMap:BitmapData = null, glossMap:BitmapData = null, generateMipmaps:boolean = true)\n\t{\n\t\tvar bmd:BitmapData = specularMap? specularMap : glossMap;\n\n\t\tbmd = bmd? new BitmapData(bmd.width, bmd.height, false, 0xffffff) : new BitmapData(1, 1, false, 0xffffff);\n\t\t\n\t\tsuper(bmd, generateMipmaps);\n\t\t\n\t\tthis.specularMap = specularMap;\n\t\tthis.glossMap = glossMap;\n\t}\n\t\n\tpublic get specularMap():BitmapData\n\t{\n\t\treturn this._specularMap;\n\t}\n\t\n\tpublic set specularMap(value:BitmapData)\n\t{\n\t\tthis._specularMap = value;\n\n\t\tthis.invalidateContent();\n\t\t\n\t\tthis._testSize();\n\t}\n\t\n\tpublic get glossMap():BitmapData\n\t{\n\t\treturn this._glossMap;\n\t}\n\t\n\tpublic set glossMap(value:BitmapData)\n\t{\n\t\tthis._glossMap = value;\n\t\tthis.invalidateContent();\n\t\t\n\t\tthis._testSize();\n\t}\n\t\n\tprivate _testSize()\n\t{\n\t\tvar w:Number, h:Number;\n\t\t\n\t\tif (this._specularMap) {\n\t\t\tw = this._specularMap.width;\n\t\t\th = this._specularMap.height;\n\t\t} else if (this._glossMap) {\n\t\t\tw = this._glossMap.width;\n\t\t\th = this._glossMap.height;\n\t\t} else {\n\t\t\tw = 1;\n\t\t\th = 1;\n\t\t}\n\t\t\n\t\tif (w != this._bitmapData.width && h != this._bitmapData.height) {\n\t\t\tvar oldBitmap:BitmapData = this._bitmapData;\n\t\t\tthis.bitmapData = new BitmapData(this._specularMap.width, this._specularMap.height, false, 0xffffff);\n\t\t\toldBitmap.dispose();\n\t\t}\n\t}\n\n\tpublic _iGetTextureData():BitmapData\n\t{\n\t\tvar rect:Rectangle = this._specularMap.rect;\n\t\tvar origin:Point = new Point();\n\n\t\tthis._bitmapData.fillRect(rect, 0xffffff);\n\n\t\tif (this._glossMap)\n\t\t\tthis._bitmapData.copyChannel(this._glossMap, rect, origin, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN);\n\n\t\tif (this._specularMap)\n\t\t\tthis._bitmapData.copyChannel(this._specularMap, rect, origin, BitmapDataChannel.RED, BitmapDataChannel.RED);\n\n\t\treturn this._bitmapData;\n\t}\n}\n\nexport = SpecularBitmapTexture;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\nimport MipmapGenerator\t\t\t= require(\"awayjs-core/lib/textures/MipmapGenerator\");\nimport TextureProxyBase\t\t\t= require(\"awayjs-core/lib/textures/TextureProxyBase\");\n\nclass Texture2DBase extends TextureProxyBase\n{\n\tprivate _mipmapData:Array;\n\tprivate _mipmapDataDirty:boolean;\n\tpublic _pWidth:number;\n\tpublic _pHeight:number;\n\t\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get width():number\n\t{\n\t\treturn this._pWidth;\n\t}\n\n\t/**\n\t *\n\t * @returns {number}\n\t */\n\tpublic get height():number\n\t{\n\t\treturn this._pHeight;\n\t}\n\n\tpublic get size():number\n\t{\n\t\treturn this._pWidth;\n\t}\n\n\tconstructor(generateMipmaps:boolean = false)\n\t{\n\t\tsuper(generateMipmaps);\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic dispose()\n\t{\n\t\tsuper.dispose();\n\n\t\tif (this._mipmapData) {\n\t\t\tvar len:number = this._mipmapData.length;\n\t\t\tfor (var i:number = 0; i < len; i++)\n\t\t\t\tMipmapGenerator.freeMipMapHolder(this._mipmapData[i]);\n\t\t}\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic invalidateContent():void\n\t{\n\t\tsuper.invalidateContent();\n\n\t\tthis._mipmapDataDirty = true;\n\t}\n\n\t/**\n\t *\n\t * @param width\n\t * @param height\n\t * @private\n\t */\n\tpublic _pSetSize(width:number, height:number)\n\t{\n\t\tif (this._pWidth != width || this._pHeight != height)\n\t\t\tthis.invalidateSize();\n\n\t\tthis._mipmapDataDirty = true;\n\n\t\tthis._pWidth = width;\n\t\tthis._pHeight = height;\n\t}\n\n\tpublic _iGetMipmapData():Array\n\t{\n\t\tif (this._mipmapDataDirty) {\n\t\t\tthis._mipmapDataDirty = false;\n\n\t\t\tif (!this._mipmapData)\n\t\t\t\tthis._mipmapData = new Array();\n\n\t\t\tMipmapGenerator.generateMipMaps(this._iGetTextureData(), this._mipmapData, true);\n\t\t}\n\n\t\treturn this._mipmapData;\n\t}\n\n\tpublic _iGetTextureData():any\n\t{\n\t\tthrow new AbstractMethodError();\n\t}\n}\n\nexport = Texture2DBase;", + "import AssetType\t\t\t\t= require(\"awayjs-core/lib/core/library/AssetType\");\nimport IAsset\t\t\t\t\t= require(\"awayjs-core/lib/core/library/IAsset\");\nimport NamedAssetBase\t\t\t= require(\"awayjs-core/lib/core/library/NamedAssetBase\");\nimport ITextureData\t\t\t\t= require(\"awayjs-core/lib/core/pool/ITextureData\");\n\n/**\n *\n */\nclass TextureProxyBase extends NamedAssetBase implements IAsset\n{\n\tpublic _pSize:number;\n\tpublic _pFormat:string = \"bgra\"\n\tprivate _hasMipmaps:boolean;\n\tprivate _generateMipmaps:boolean;\n\tprivate _textureData:Array = new Array();\n\t\n\t/**\n\t *\n\t */\n\tconstructor(generateMipmaps:boolean = false)\n\t{\n\t\tsuper();\n\n\t\tthis._generateMipmaps = this._hasMipmaps = generateMipmaps;\n\t}\n\n\tpublic get size():number\n\t{\n\t\treturn this._pSize;\n\t}\n\n\tpublic get hasMipmaps():boolean\n\t{\n\t\treturn this._hasMipmaps;\n\t}\n\n\t/**\n\t *\n\t * @returns {string}\n\t */\n\tpublic get format():string\n\t{\n\t\treturn this._pFormat;\n\t}\n\n\t/**\n\t *\n\t * @returns {boolean}\n\t */\n\tpublic get generateMipmaps():boolean\n\t{\n\t\treturn this._generateMipmaps;\n\t}\n\n\tpublic set generateMipmaps(value:boolean)\n\t{\n\t\tif (this._generateMipmaps == value)\n\t\t\treturn;\n\n\t\tthis._generateMipmaps = this._hasMipmaps = value;\n\n\t\tthis.invalidateContent();\n\t}\n\n\t/**\n\t *\n\t * @returns {string}\n\t */\n\tpublic get assetType():string\n\t{\n\t\treturn AssetType.TEXTURE;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic invalidateContent():void\n\t{\n\t\tvar len:number = this._textureData.length\n\t\tfor (var i:number = 0; i < len; i++)\n\t\t\tthis._textureData[i].invalidate();\n\t}\n\n\t/**\n\t *\n\t * @private\n\t */\n\tpublic invalidateSize():void\n\t{\n\t\twhile (this._textureData.length)\n\t\t\tthis._textureData[0].dispose();\n\t}\n\n\t/**\n\t * @inheritDoc\n\t */\n\tpublic dispose()\n\t{\n\t\twhile (this._textureData.length)\n\t\t\tthis._textureData[0].dispose();\n\t}\n\n\n\tpublic _iAddTextureData(textureData:ITextureData):ITextureData\n\t{\n\t\tthis._textureData.push(textureData);\n\n\t\treturn textureData;\n\t}\n\n\tpublic _iRemoveTextureData(textureData:ITextureData):ITextureData\n\t{\n\t\tthis._textureData.splice(this._textureData.indexOf(textureData), 1);\n\n\t\treturn textureData;\n\t}\n}\n\nexport = TextureProxyBase;", + "import AbstractMethodError\t\t= require(\"awayjs-core/lib/errors/AbstractMethodError\");\n\nclass ByteArrayBase\n{\n\tpublic position:number = 0;\n\tpublic length:number = 0;\n\tpublic _mode:string = \"\";\n\n\tpublic static Base64Key = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n\tconstructor()\n\t{\n\t}\n\n\tpublic writeByte(b:number)\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic readByte():number\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic writeUnsignedByte(b:number)\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic readUnsignedByte():number\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic writeUnsignedShort(b:number)\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic readUnsignedShort():number\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic writeUnsignedInt(b:number)\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic readUnsignedInt():number\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic writeFloat(b:number)\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic toFloatBits(x:number)\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic readFloat(b:number)\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic fromFloatBits(x:number)\n\t{\n\t\tthrow \"Virtual method\";\n\t}\n\n\tpublic getBytesAvailable():number\n\t{\n\t\tthrow new AbstractMethodError('ByteArrayBase, getBytesAvailable() not implemented ');\n\t}\n\n\tpublic toString():string\n\t{\n\t\treturn \"[ByteArray] ( \" + this._mode + \" ) position=\" + this.position + \" length=\" + this.length;\n\t}\n\n\tpublic compareEqual(other, count)\n\t{\n\t\tif (count == undefined || count > this.length - this.position)\n\t\t\tcount = this.length - this.position;\n\t\tif (count > other.length - other.position)\n\t\t\tcount = other.length - other.position;\n\t\tvar co0 = count;\n\t\tvar r = true;\n\t\twhile (r && count >= 4) {\n\t\t\tcount -= 4;\n\t\t\tif (this.readUnsignedInt() != other.readUnsignedInt()) r = false;\n\t\t}\n\t\twhile (r && count >= 1) {\n\t\t\tcount--;\n\t\t\tif (this.readUnsignedByte() != other.readUnsignedByte()) r = false;\n\t\t}\n\t\tvar c0;\n\t\tthis.position -= (c0 - count);\n\t\tother.position -= (c0 - count);\n\t\treturn r;\n\t}\n\n\tpublic writeBase64String(s:string)\n\t{\n\t\tfor (var i:number = 0; i < s.length; i++) {\n\t\t\tvar v = s.charAt(i);\n\t\t}\n\t}\n\n\tpublic dumpToConsole()\n\t{\n\t\tvar oldpos = this.position;\n\t\tthis.position = 0;\n\t\tvar nstep:number = 8;\n\n\t\tfunction asHexString(x, digits)\n\t\t{\n\t\t\tvar lut:Array = [ \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\", \"c\", \"d\", \"e\", \"f\" ];\n\t\t\tvar sh:string = \"\";\n\t\t\tfor (var d:number = 0; d < digits; d++) {\n\t\t\t\tsh = lut[(x >> (d << 2)) & 0xf] + sh;\n\t\t\t}\n\t\t\treturn sh;\n\t\t}\n\n\t\tfor (var i = 0; i < this.length; i += nstep) {\n\t\t\tvar s:string = asHexString(i, 4) + \":\";\n\t\t\tfor (var j:number = 0; j < nstep && i + j < this.length; j++) {\n\t\t\t\ts += \" \" + asHexString(this.readUnsignedByte(), 2);\n\t\t\t}\n\t\t\tconsole.log(s);\n\t\t}\n\t\tthis.position = oldpos;\n\t}\n\n\tpublic readBase64String(count:number)\n\t{\n\t\tif (count == undefined || count > this.length - this.position)\n\t\t\tcount = this.length - this.position;\n\t\tif (!(count > 0)) return \"\";\n\n\t\treturn ByteArrayBase.internalGetBase64String(count, this.readUnsignedByte, this);\n\t}\n\n\tpublic static internalGetBase64String(count, getUnsignedByteFunc, self)\n\t{ // return base64 string of the next count bytes\n\t\tvar r = \"\";\n\t\tvar b0, b1, b2, enc1, enc2, enc3, enc4;\n\t\tvar base64Key = ByteArrayBase.Base64Key;\n\t\twhile (count >= 3) {\n\t\t\tb0 = getUnsignedByteFunc.apply(self);\n\t\t\tb1 = getUnsignedByteFunc.apply(self);\n\t\t\tb2 = getUnsignedByteFunc.apply(self);\n\t\t\tenc1 = b0 >> 2;\n\t\t\tenc2 = ((b0 & 3) << 4) | (b1 >> 4);\n\t\t\tenc3 = ((b1 & 15) << 2) | (b2 >> 6);\n\t\t\tenc4 = b2 & 63;\n\t\t\tr += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + base64Key.charAt(enc4);\n\t\t\tcount -= 3;\n\t\t}\n\t\t// pad\n\t\tif (count == 2) {\n\t\t\tb0 = getUnsignedByteFunc.apply(self);\n\t\t\tb1 = getUnsignedByteFunc.apply(self);\n\t\t\tenc1 = b0 >> 2;\n\t\t\tenc2 = ((b0 & 3) << 4) | (b1 >> 4);\n\t\t\tenc3 = ((b1 & 15) << 2);\n\t\t\tr += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + \"=\";\n\t\t} else if (count == 1) {\n\t\t\tb0 = getUnsignedByteFunc.apply(self);\n\t\t\tenc1 = b0 >> 2;\n\t\t\tenc2 = ((b0 & 3) << 4);\n\t\t\tr += base64Key.charAt(enc1) + base64Key.charAt(enc2) + \"==\";\n\t\t}\n\t\treturn r;\n\t}\n}\n\nexport = ByteArrayBase;", + "import ByteArrayBase\t\t\t= require(\"awayjs-core/lib/utils/ByteArrayBase\");\n\nclass ByteArrayBuffer extends ByteArrayBase\n{\n\n\t/*\n\t public maxlength:number = 0;\n\t public arraybytes; //ArrayBuffer\n\t public unalignedarraybytestemp; //ArrayBuffer\n\t */\n\n\tpublic _bytes:number[];\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t\tthis._bytes = [];\n\t\tthis._mode = \"Array\";\n\t}\n\n\tpublic writeByte(b:number)\n\t{\n\t\tvar bi:number = ~~b;\n\t\tthis._bytes[ this.position++ ] = bi;\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readByte():number\n\t{\n\t\tif (this.position >= this.length) {\n\t\t\tthrow \"ByteArray out of bounds read. Position=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\treturn this._bytes[ this.position++ ];\n\t}\n\n\tpublic writeUnsignedByte(b:number)\n\t{\n\t\tvar bi:number = ~~b;\n\t\tthis._bytes[this.position++] = bi & 0xff;\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readUnsignedByte():number\n\t{\n\t\tif (this.position >= this.length) {\n\t\t\tthrow \"ByteArray out of bounds read. Position=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\treturn this._bytes[ this.position++ ];\n\t}\n\n\tpublic writeUnsignedShort(b:number)\n\t{\n\t\tvar bi:number = ~~b;\n\t\tthis._bytes[ this.position++ ] = bi & 0xff;\n\t\tthis._bytes[ this.position++ ] = (bi >> 8) & 0xff;\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readUnsignedShort():number\n\t{\n\t\tif (this.position + 2 > this.length) {\n\t\t\tthrow \"ByteArray out of bounds read. Position=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\tvar r:number = this._bytes[ this.position ] | ( this._bytes[ this.position + 1 ] << 8 );\n\t\tthis.position += 2;\n\t\treturn r;\n\t}\n\n\tpublic writeUnsignedInt(b:number)\n\t{\n\t\tvar bi:number = ~~b;\n\t\tthis._bytes[ this.position++ ] = bi & 0xff;\n\t\tthis._bytes[ this.position++ ] = (bi >>> 8) & 0xff;\n\t\tthis._bytes[ this.position++ ] = (bi >>> 16) & 0xff;\n\t\tthis._bytes[ this.position++ ] = (bi >>> 24) & 0xff;\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readUnsignedInt():number\n\t{\n\t\tif (this.position + 4 > this.length) {\n\t\t\tthrow \"ByteArray out of bounds read. Position=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\tvar r:number = this._bytes[ this.position ] | ( this._bytes[this.position + 1] << 8 ) | ( this._bytes[this.position + 2] << 16 ) | ( this._bytes[this.position + 3] << 24 );\n\t\tthis.position += 4;\n\t\treturn r >>> 0;\n\t}\n\n\tpublic writeFloat(b:number)\n\t{\n\t\t// this is crazy slow and silly, but as a fallback...\n\n\t\tthis.writeUnsignedInt(this.toFloatBits(Number(b)));\n\t}\n\n\tpublic toFloatBits(x:number)\n\t{\n\t\t// don't handle inf/nan yet\n\t\t// special case zero\n\t\tif (x == 0) {\n\t\t\treturn 0;\n\t\t}\n\t\t// remove the sign, after this we only deal with positive numbers\n\t\tvar sign:number = 0;\n\t\tif (x < 0) {\n\t\t\tx = -x;\n\t\t\tsign = 1;\n\t\t} else {\n\t\t\tsign = 0;\n\t\t}\n\t\t// a float value is now defined as: x = (1+(mantissa*2^-23))*(2^(exponent-127))\n\t\tvar exponent:number = Math.log(x)/Math.log(2); // rough exponent\n\t\texponent = Math.floor(exponent);\n\t\tx = x*Math.pow(2, 23 - exponent); // normalize to 24 bits\n\t\tvar mantissa = Math.floor(x) - 0x800000;\n\t\texponent = exponent + 127;\n\t\treturn( ( sign << 31 ) >>> 0) | ( exponent << 23 ) | mantissa;\n\t}\n\n\tpublic readFloat(b:number)\n\t{\n\t\treturn this.fromFloatBits(this.readUnsignedInt());\n\t}\n\n\tpublic fromFloatBits(x:number)\n\t{\n\t\tif (x == 0) {\n\t\t\treturn 0;\n\t\t}\n\t\tvar exponent:number = ( x >>> 23 ) & 0xff;\n\t\tvar mantissa:number = ( x & 0x7fffff ) | 0x800000;\n\t\tvar y = Math.pow(2, ( exponent - 127 ) - 23)*mantissa;\n\t\tif (x >>> 31 != 0) {\n\t\t\ty = -y;\n\t\t}\n\t\treturn y;\n\t}\n\n\t/*\n\t public ensureWriteableSpace( n:number )\n\t {\n\t this.ensureSpace( n + this.position );\n\t }\n\n\t private ensureSpace( n:number )\n\t {\n\t if ( n > this.maxlength ) {\n\t var newmaxlength:number = (n+255)&(~255);\n\t var newarraybuffer = new ArrayBuffer(newmaxlength);\n\t var view = new Uint8Array(this.arraybytes, 0, this.length);\n\t var newview = new Uint8Array(newarraybuffer, 0, this.length);\n\t newview.set(view); // memcpy\n\t this.arraybytes = newarraybuffer;\n\t this.maxlength = newmaxlength;\n\t }\n\t }\n\t */\n}\n\nexport = ByteArrayBuffer;", + "import ByteArrayBase\t\t\t= require(\"awayjs-core/lib/utils/ByteArrayBase\");\n\nclass ByteArray extends ByteArrayBase\n{\n\tpublic maxlength:number = 0;\n\tpublic arraybytes; //ArrayBuffer\n\tpublic unalignedarraybytestemp; //ArrayBuffer\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t\tthis._mode = \"Typed array\";\n\t\tthis.maxlength = 4;\n\t\tthis.arraybytes = new ArrayBuffer(this.maxlength);\n\t\tthis.unalignedarraybytestemp = new ArrayBuffer(16);\n\t}\n\n\tpublic ensureWriteableSpace(n:number)\n\t{\n\t\tthis.ensureSpace(n + this.position);\n\t}\n\n\tpublic setArrayBuffer(aBuffer:ArrayBuffer):void\n\t{\n\n\t\tthis.ensureSpace(aBuffer.byteLength);\n\n\t\tthis.length = aBuffer.byteLength;\n\n\t\tvar inInt8AView:Int8Array = new Int8Array(aBuffer);\n\t\tvar localInt8View:Int8Array = new Int8Array(this.arraybytes, 0, this.length);\n\n\t\tlocalInt8View.set(inInt8AView);\n\n\t\tthis.position = 0;\n\n\t}\n\n\tpublic getBytesAvailable():number\n\t{\n\t\treturn ( this.length ) - ( this.position );\n\t}\n\n\tpublic ensureSpace(n:number)\n\t{\n\t\tif (n > this.maxlength) {\n\t\t\tvar newmaxlength:number = (n + 255) & (~255);\n\t\t\tvar newarraybuffer = new ArrayBuffer(newmaxlength);\n\t\t\tvar view = new Uint8Array(this.arraybytes, 0, this.length);\n\t\t\tvar newview = new Uint8Array(newarraybuffer, 0, this.length);\n\t\t\tnewview.set(view); // memcpy\n\t\t\tthis.arraybytes = newarraybuffer;\n\t\t\tthis.maxlength = newmaxlength;\n\t\t}\n\t}\n\n\tpublic writeByte(b:number)\n\t{\n\t\tthis.ensureWriteableSpace(1);\n\t\tvar view = new Int8Array(this.arraybytes);\n\t\tview[ this.position++ ] = (~~b); // ~~ is cast to int in js...\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readByte()\n\t{\n\t\tif (this.position >= this.length) {\n\t\t\tthrow \"ByteArray out of bounds read. Positon=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\tvar view = new Int8Array(this.arraybytes);\n\n\t\treturn view[ this.position++ ];\n\t}\n\n\tpublic readBytes(bytes:ByteArray, offset:number = 0, length:number = 0)\n\t{\n\n\t\tif (length == null) {\n\t\t\tlength = bytes.length;\n\t\t}\n\n\t\tbytes.ensureWriteableSpace(offset + length);\n\n\t\tvar byteView:Int8Array = new Int8Array(bytes.arraybytes);\n\t\tvar localByteView:Int8Array = new Int8Array(this.arraybytes);\n\n\t\tbyteView.set(localByteView.subarray(this.position, this.position + length), offset);\n\n\t\tthis.position += length;\n\n\t\tif (length + offset > bytes.length) {\n\t\t\tbytes.length += ( length + offset ) - bytes.length;\n\t\t}\n\n\t}\n\n\tpublic writeUnsignedByte(b:number)\n\t{\n\t\tthis.ensureWriteableSpace(1);\n\t\tvar view = new Uint8Array(this.arraybytes);\n\t\tview[this.position++] = (~~b) & 0xff; // ~~ is cast to int in js...\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readUnsignedByte()\n\t{\n\t\tif (this.position >= this.length) {\n\t\t\tthrow \"ByteArray out of bounds read. Positon=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\tvar view = new Uint8Array(this.arraybytes);\n\t\treturn view[this.position++];\n\t}\n\n\tpublic writeUnsignedShort(b:number)\n\t{\n\t\tthis.ensureWriteableSpace(2);\n\t\tif (( this.position & 1 ) == 0) {\n\t\t\tvar view = new Uint16Array(this.arraybytes);\n\t\t\tview[ this.position >> 1 ] = (~~b) & 0xffff; // ~~ is cast to int in js...\n\t\t} else {\n\t\t\tvar view = new Uint16Array(this.unalignedarraybytestemp, 0, 1);\n\t\t\tview[0] = (~~b) & 0xffff;\n\t\t\tvar view2 = new Uint8Array(this.arraybytes, this.position, 2);\n\t\t\tvar view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2);\n\t\t\tview2.set(view3);\n\t\t}\n\t\tthis.position += 2;\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readUTFBytes(len:number):string\n\t{\n\n\t\tvar value:string = \"\";\n\t\tvar max:number = this.position + len;\n\t\tvar data:DataView = new DataView(this.arraybytes);\n\n\t\t// utf8-encode\n\t\twhile (this.position < max) {\n\n\t\t\tvar c:number = data.getUint8(this.position++);\n\n\t\t\tif (c < 0x80) {\n\n\t\t\t\tif (c == 0) break;\n\t\t\t\tvalue += String.fromCharCode(c);\n\n\t\t\t} else if (c < 0xE0) {\n\n\t\t\t\tvalue += String.fromCharCode(((c & 0x3F) << 6) | (data.getUint8(this.position++) & 0x7F));\n\n\t\t\t} else if (c < 0xF0) {\n\n\t\t\t\tvar c2 = data.getUint8(this.position++);\n\t\t\t\tvalue += String.fromCharCode(((c & 0x1F) << 12) | ((c2 & 0x7F) << 6) | (data.getUint8(this.position++) & 0x7F));\n\n\t\t\t} else {\n\n\t\t\t\tvar c2 = data.getUint8(this.position++);\n\t\t\t\tvar c3 = data.getUint8(this.position++);\n\n\t\t\t\tvalue += String.fromCharCode(((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 << 6) & 0x7F) | (data.getUint8(this.position++) & 0x7F));\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n\tpublic readInt():number\n\t{\n\n\t\tvar data:DataView = new DataView(this.arraybytes);\n\t\tvar int:number = data.getInt32(this.position, true);\n\n\t\tthis.position += 4;\n\n\t\treturn int;\n\n\t}\n\n\tpublic readShort():number\n\t{\n\n\t\tvar data:DataView = new DataView(this.arraybytes);\n\t\tvar short:number = data.getInt16(this.position, true);\n\n\t\tthis.position += 2;\n\t\treturn short;\n\n\t}\n\n\tpublic readDouble():number\n\t{\n\t\tvar data:DataView = new DataView(this.arraybytes);\n\t\tvar double:number = data.getFloat64(this.position, true);\n\n\t\tthis.position += 8;\n\t\treturn double;\n\n\t}\n\n\tpublic readUnsignedShort()\n\t{\n\t\tif (this.position > this.length + 2) {\n\t\t\tthrow \"ByteArray out of bounds read. Position=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\tif (( this.position & 1 ) == 0) {\n\t\t\tvar view = new Uint16Array(this.arraybytes);\n\t\t\tvar pa:number = this.position >> 1;\n\t\t\tthis.position += 2;\n\t\t\treturn view[ pa ];\n\t\t} else {\n\t\t\tvar view = new Uint16Array(this.unalignedarraybytestemp, 0, 1);\n\t\t\tvar view2 = new Uint8Array(this.arraybytes, this.position, 2);\n\t\t\tvar view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2);\n\t\t\tview3.set(view2);\n\t\t\tthis.position += 2;\n\t\t\treturn view[0];\n\t\t}\n\t}\n\n\tpublic writeUnsignedInt(b:number)\n\t{\n\t\tthis.ensureWriteableSpace(4);\n\t\tif (( this.position & 3 ) == 0) {\n\t\t\tvar view = new Uint32Array(this.arraybytes);\n\t\t\tview[ this.position >> 2 ] = (~~b) & 0xffffffff; // ~~ is cast to int in js...\n\t\t} else {\n\t\t\tvar view = new Uint32Array(this.unalignedarraybytestemp, 0, 1);\n\t\t\tview[0] = (~~b) & 0xffffffff;\n\t\t\tvar view2 = new Uint8Array(this.arraybytes, this.position, 4);\n\t\t\tvar view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4);\n\t\t\tview2.set(view3);\n\t\t}\n\t\tthis.position += 4;\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readUnsignedInt()\n\t{\n\n\t\tif (this.position > this.length + 4) {\n\t\t\tthrow \"ByteArray out of bounds read. Position=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\tif (( this.position & 3 ) == 0) {\n\t\t\tvar view = new Uint32Array(this.arraybytes);\n\t\t\tvar pa:number = this.position >> 2;\n\t\t\tthis.position += 4;\n\t\t\treturn view[ pa ];\n\t\t} else {\n\t\t\tvar view = new Uint32Array(this.unalignedarraybytestemp, 0, 1);\n\t\t\tvar view2 = new Uint8Array(this.arraybytes, this.position, 4);\n\t\t\tvar view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4);\n\t\t\tview3.set(view2);\n\t\t\tthis.position += 4;\n\t\t\treturn view[0];\n\t\t}\n\t}\n\n\tpublic writeFloat(b:number)\n\t{\n\t\tthis.ensureWriteableSpace(4);\n\t\tif (( this.position & 3 ) == 0) {\n\t\t\tvar view = new Float32Array(this.arraybytes);\n\t\t\tview[ this.position >> 2 ] = b;\n\t\t} else {\n\t\t\tvar view = new Float32Array(this.unalignedarraybytestemp, 0, 1);\n\t\t\tview[0] = b;\n\t\t\tvar view2 = new Uint8Array(this.arraybytes, this.position, 4);\n\t\t\tvar view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4);\n\t\t\tview2.set(view3);\n\t\t}\n\t\tthis.position += 4;\n\t\tif (this.position > this.length) {\n\t\t\tthis.length = this.position;\n\t\t}\n\t}\n\n\tpublic readFloat()\n\t{\n\t\tif (this.position > this.length + 4) {\n\t\t\tthrow \"ByteArray out of bounds read. Positon=\" + this.position + \", Length=\" + this.length;\n\t\t}\n\t\tif ((this.position & 3) == 0) {\n\t\t\tvar view = new Float32Array(this.arraybytes);\n\t\t\tvar pa = this.position >> 2;\n\t\t\tthis.position += 4;\n\t\t\treturn view[pa];\n\t\t} else {\n\t\t\tvar view = new Float32Array(this.unalignedarraybytestemp, 0, 1);\n\t\t\tvar view2 = new Uint8Array(this.arraybytes, this.position, 4);\n\t\t\tvar view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4);\n\t\t\tview3.set(view2);\n\t\t\tthis.position += 4;\n\t\t\treturn view[ 0 ];\n\t\t}\n\t}\n}\n\nexport = ByteArray;", + "class CSS\n{\n\tpublic static setElementSize(element:HTMLElement, width:number, height:number)\n\t{\n\t\telement.style.width = width + \"px\";\n\t\telement.style.height = height + \"px\";\n\t\telement[\"width\"] = width;\n\t\telement[\"height\"] = height;\n\t}\n\n\tpublic static setElementWidth(element:HTMLElement, width:number)\n\t{\n\t\telement.style.width = width + \"px\";\n\t\telement[\"width\"] = width;\n\t}\n\n\tpublic static setElementHeight(element:HTMLElement, height:number)\n\t{\n\t\telement.style.height = height + \"px\";\n\t\telement[\"height\"] = height;\n\t}\n\n\tpublic static setElementX(element:HTMLElement, x:number)\n\t{\n\t\telement.style.position = 'absolute';\n\t\telement.style.left = x + \"px\";\n\t}\n\n\tpublic static setElementY(element:HTMLElement, y:number)\n\t{\n\t\telement.style.position = 'absolute';\n\t\telement.style.top = y + \"px\";\n\t}\n\n\tpublic static getElementVisibility(element:HTMLElement):boolean\n\t{\n\t\treturn element.style.visibility == 'visible';\n\t}\n\n\tpublic static setElementVisibility(element:HTMLElement, visible:boolean)\n\t{\n\t\tif (visible) {\n\t\t\telement.style.visibility = 'visible';\n\t\t} else {\n\t\t\telement.style.visibility = 'hidden';\n\t\t}\n\t}\n\n\tpublic static setElementAlpha(element:HTMLElement, alpha:number)\n\t{\n\t\tif (element instanceof HTMLCanvasElement) {\n\t\t\tvar context = ( element).getContext(\"2d\");\n\t\t\tcontext.globalAlpha = alpha;\n\t\t}\n\t}\n\n\tpublic static setElementPosition(element:HTMLElement, x:number, y:number, absolute:boolean = false)\n\t{\n\t\tif (absolute) {\n\t\t\telement.style.position = \"absolute\";\n\t\t} else {\n\t\t\telement.style.position = \"relative\";\n\t\t}\n\n\t\telement.style.left = x + \"px\";\n\t\telement.style.top = y + \"px\";\n\t}\n}\n\nexport = CSS;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\nimport CastError\t\t\t\t= require(\"awayjs-core/lib/errors/CastError\");\nimport BitmapTexture\t\t\t= require(\"awayjs-core/lib/textures/BitmapTexture\");\nimport ImageTexture\t\t\t\t= require(\"awayjs-core/lib/textures/ImageTexture\");\nimport ByteArray\t\t\t\t= require(\"awayjs-core/lib/utils/ByteArray\");\n\n/**\n * Helper class for casting assets to usable objects\n */\nclass Cast\n{\n\tprivate static _colorNames:Object;\n\tprivate static _hexChars:string = \"0123456789abcdefABCDEF\";\n\n\tprivate static _notClasses:Object = new Object();\n\tprivate static _classes:Object = new Object();\n\n\tpublic static string(data:any):string\n\t{\n\t\tif (typeof(data) == 'function')\n\t\t\tdata = new data;\n\n\t\tif (typeof(data) == 'string')\n\t\t\treturn data;\n\n\t\treturn data;\n\t}\n\n\tpublic static byteArray(data:any):ByteArray\n\t{\n\t\tif (typeof(data) == 'function')\n\t\t\tdata = new data;\n\n\t\tif (data instanceof ByteArray)\n\t\t\treturn data;\n\n\t\treturn data;\n\t}\n\n\t// public static xml(data:any):XML\n\t// {\n\t// if (typeof(data) == 'function')\n\t// data = new data;\n\t//\n\t// if (data is XML)\n\t// return data;\n\t//\n\t// return XML(data);\n\t// }\n\n\tprivate static isHex(str:string):boolean\n\t{\n\t\tvar length:number /*int*/ = str.length;\n\t\tfor (var i:number /*int*/ = 0; i < length; ++i) {\n\t\t\tif (this._hexChars.indexOf(str.charAt(i)) == -1)\n\t\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tpublic static tryColor(data:any):number /*uint*/\n\t{\n\t\tif (typeof(data) == 'number' /*uint*/)\n\t\t\treturn Math.floor( data);\n\n\t\tif (typeof(data) == 'string') {\n\t\t\tif (data == \"random\")\n\t\t\t\treturn Math.floor(Math.random()*0x1000000);\n\n\t\t\tif (this._colorNames == null) {\n\t\t\t\tthis._colorNames = new Object();\n\t\t\t\tthis._colorNames[\"steelblue\"] = 0x4682B4;\n\t\t\t\tthis._colorNames[\"royalblue\"] = 0x041690;\n\t\t\t\tthis._colorNames[\"cornflowerblue\"] = 0x6495ED;\n\t\t\t\tthis._colorNames[\"lightsteelblue\"] = 0xB0C4DE;\n\t\t\t\tthis._colorNames[\"mediumslateblue\"] = 0x7B68EE;\n\t\t\t\tthis._colorNames[\"slateblue\"] = 0x6A5ACD;\n\t\t\t\tthis._colorNames[\"darkslateblue\"] = 0x483D8B;\n\t\t\t\tthis._colorNames[\"midnightblue\"] = 0x191970;\n\t\t\t\tthis._colorNames[\"navy\"] = 0x000080;\n\t\t\t\tthis._colorNames[\"darkblue\"] = 0x00008B;\n\t\t\t\tthis._colorNames[\"mediumblue\"] = 0x0000CD;\n\t\t\t\tthis._colorNames[\"blue\"] = 0x0000FF;\n\t\t\t\tthis._colorNames[\"dodgerblue\"] = 0x1E90FF;\n\t\t\t\tthis._colorNames[\"deepskyblue\"] = 0x00BFFF;\n\t\t\t\tthis._colorNames[\"lightskyblue\"] = 0x87CEFA;\n\t\t\t\tthis._colorNames[\"skyblue\"] = 0x87CEEB;\n\t\t\t\tthis._colorNames[\"lightblue\"] = 0xADD8E6;\n\t\t\t\tthis._colorNames[\"powderblue\"] = 0xB0E0E6;\n\t\t\t\tthis._colorNames[\"azure\"] = 0xF0FFFF;\n\t\t\t\tthis._colorNames[\"lightcyan\"] = 0xE0FFFF;\n\t\t\t\tthis._colorNames[\"paleturquoise\"] = 0xAFEEEE;\n\t\t\t\tthis._colorNames[\"mediumturquoise\"] = 0x48D1CC;\n\t\t\t\tthis._colorNames[\"lightseagreen\"] = 0x20B2AA;\n\t\t\t\tthis._colorNames[\"darkcyan\"] = 0x008B8B;\n\t\t\t\tthis._colorNames[\"teal\"] = 0x008080;\n\t\t\t\tthis._colorNames[\"cadetblue\"] = 0x5F9EA0;\n\t\t\t\tthis._colorNames[\"darkturquoise\"] = 0x00CED1;\n\t\t\t\tthis._colorNames[\"aqua\"] = 0x00FFFF;\n\t\t\t\tthis._colorNames[\"cyan\"] = 0x00FFFF;\n\t\t\t\tthis._colorNames[\"turquoise\"] = 0x40E0D0;\n\t\t\t\tthis._colorNames[\"aquamarine\"] = 0x7FFFD4;\n\t\t\t\tthis._colorNames[\"mediumaquamarine\"] = 0x66CDAA;\n\t\t\t\tthis._colorNames[\"darkseagreen\"] = 0x8FBC8F;\n\t\t\t\tthis._colorNames[\"mediumseagreen\"] = 0x3CB371;\n\t\t\t\tthis._colorNames[\"seagreen\"] = 0x2E8B57;\n\t\t\t\tthis._colorNames[\"darkgreen\"] = 0x006400;\n\t\t\t\tthis._colorNames[\"green\"] = 0x008000;\n\t\t\t\tthis._colorNames[\"forestgreen\"] = 0x228B22;\n\t\t\t\tthis._colorNames[\"limegreen\"] = 0x32CD32;\n\t\t\t\tthis._colorNames[\"lime\"] = 0x00FF00;\n\t\t\t\tthis._colorNames[\"chartreuse\"] = 0x7FFF00;\n\t\t\t\tthis._colorNames[\"lawngreen\"] = 0x7CFC00;\n\t\t\t\tthis._colorNames[\"greenyellow\"] = 0xADFF2F;\n\t\t\t\tthis._colorNames[\"yellowgreen\"] = 0x9ACD32;\n\t\t\t\tthis._colorNames[\"palegreen\"] = 0x98FB98;\n\t\t\t\tthis._colorNames[\"lightgreen\"] = 0x90EE90;\n\t\t\t\tthis._colorNames[\"springgreen\"] = 0x00FF7F;\n\t\t\t\tthis._colorNames[\"mediumspringgreen\"] = 0x00FA9A;\n\t\t\t\tthis._colorNames[\"darkolivegreen\"] = 0x556B2F;\n\t\t\t\tthis._colorNames[\"olivedrab\"] = 0x6B8E23;\n\t\t\t\tthis._colorNames[\"olive\"] = 0x808000;\n\t\t\t\tthis._colorNames[\"darkkhaki\"] = 0xBDB76B;\n\t\t\t\tthis._colorNames[\"darkgoldenrod\"] = 0xB8860B;\n\t\t\t\tthis._colorNames[\"goldenrod\"] = 0xDAA520;\n\t\t\t\tthis._colorNames[\"gold\"] = 0xFFD700;\n\t\t\t\tthis._colorNames[\"yellow\"] = 0xFFFF00;\n\t\t\t\tthis._colorNames[\"khaki\"] = 0xF0E68C;\n\t\t\t\tthis._colorNames[\"palegoldenrod\"] = 0xEEE8AA;\n\t\t\t\tthis._colorNames[\"blanchedalmond\"] = 0xFFEBCD;\n\t\t\t\tthis._colorNames[\"moccasin\"] = 0xFFE4B5;\n\t\t\t\tthis._colorNames[\"wheat\"] = 0xF5DEB3;\n\t\t\t\tthis._colorNames[\"navajowhite\"] = 0xFFDEAD;\n\t\t\t\tthis._colorNames[\"burlywood\"] = 0xDEB887;\n\t\t\t\tthis._colorNames[\"tan\"] = 0xD2B48C;\n\t\t\t\tthis._colorNames[\"rosybrown\"] = 0xBC8F8F;\n\t\t\t\tthis._colorNames[\"sienna\"] = 0xA0522D;\n\t\t\t\tthis._colorNames[\"saddlebrown\"] = 0x8B4513;\n\t\t\t\tthis._colorNames[\"chocolate\"] = 0xD2691E;\n\t\t\t\tthis._colorNames[\"peru\"] = 0xCD853F;\n\t\t\t\tthis._colorNames[\"sandybrown\"] = 0xF4A460;\n\t\t\t\tthis._colorNames[\"darkred\"] = 0x8B0000;\n\t\t\t\tthis._colorNames[\"maroon\"] = 0x800000;\n\t\t\t\tthis._colorNames[\"brown\"] = 0xA52A2A;\n\t\t\t\tthis._colorNames[\"firebrick\"] = 0xB22222;\n\t\t\t\tthis._colorNames[\"indianred\"] = 0xCD5C5C;\n\t\t\t\tthis._colorNames[\"lightcoral\"] = 0xF08080;\n\t\t\t\tthis._colorNames[\"salmon\"] = 0xFA8072;\n\t\t\t\tthis._colorNames[\"darksalmon\"] = 0xE9967A;\n\t\t\t\tthis._colorNames[\"lightsalmon\"] = 0xFFA07A;\n\t\t\t\tthis._colorNames[\"coral\"] = 0xFF7F50;\n\t\t\t\tthis._colorNames[\"tomato\"] = 0xFF6347;\n\t\t\t\tthis._colorNames[\"darkorange\"] = 0xFF8C00;\n\t\t\t\tthis._colorNames[\"orange\"] = 0xFFA500;\n\t\t\t\tthis._colorNames[\"orangered\"] = 0xFF4500;\n\t\t\t\tthis._colorNames[\"crimson\"] = 0xDC143C;\n\t\t\t\tthis._colorNames[\"red\"] = 0xFF0000;\n\t\t\t\tthis._colorNames[\"deeppink\"] = 0xFF1493;\n\t\t\t\tthis._colorNames[\"fuchsia\"] = 0xFF00FF;\n\t\t\t\tthis._colorNames[\"magenta\"] = 0xFF00FF;\n\t\t\t\tthis._colorNames[\"hotpink\"] = 0xFF69B4;\n\t\t\t\tthis._colorNames[\"lightpink\"] = 0xFFB6C1;\n\t\t\t\tthis._colorNames[\"pink\"] = 0xFFC0CB;\n\t\t\t\tthis._colorNames[\"palevioletred\"] = 0xDB7093;\n\t\t\t\tthis._colorNames[\"mediumvioletred\"] = 0xC71585;\n\t\t\t\tthis._colorNames[\"purple\"] = 0x800080;\n\t\t\t\tthis._colorNames[\"darkmagenta\"] = 0x8B008B;\n\t\t\t\tthis._colorNames[\"mediumpurple\"] = 0x9370DB;\n\t\t\t\tthis._colorNames[\"blueviolet\"] = 0x8A2BE2;\n\t\t\t\tthis._colorNames[\"indigo\"] = 0x4B0082;\n\t\t\t\tthis._colorNames[\"darkviolet\"] = 0x9400D3;\n\t\t\t\tthis._colorNames[\"darkorchid\"] = 0x9932CC;\n\t\t\t\tthis._colorNames[\"mediumorchid\"] = 0xBA55D3;\n\t\t\t\tthis._colorNames[\"orchid\"] = 0xDA70D6;\n\t\t\t\tthis._colorNames[\"violet\"] = 0xEE82EE;\n\t\t\t\tthis._colorNames[\"plum\"] = 0xDDA0DD;\n\t\t\t\tthis._colorNames[\"thistle\"] = 0xD8BFD8;\n\t\t\t\tthis._colorNames[\"lavender\"] = 0xE6E6FA;\n\t\t\t\tthis._colorNames[\"ghostwhite\"] = 0xF8F8FF;\n\t\t\t\tthis._colorNames[\"aliceblue\"] = 0xF0F8FF;\n\t\t\t\tthis._colorNames[\"mintcream\"] = 0xF5FFFA;\n\t\t\t\tthis._colorNames[\"honeydew\"] = 0xF0FFF0;\n\t\t\t\tthis._colorNames[\"lightgoldenrodyellow\"] = 0xFAFAD2;\n\t\t\t\tthis._colorNames[\"lemonchiffon\"] = 0xFFFACD;\n\t\t\t\tthis._colorNames[\"cornsilk\"] = 0xFFF8DC;\n\t\t\t\tthis._colorNames[\"lightyellow\"] = 0xFFFFE0;\n\t\t\t\tthis._colorNames[\"ivory\"] = 0xFFFFF0;\n\t\t\t\tthis._colorNames[\"floralwhite\"] = 0xFFFAF0;\n\t\t\t\tthis._colorNames[\"linen\"] = 0xFAF0E6;\n\t\t\t\tthis._colorNames[\"oldlace\"] = 0xFDF5E6;\n\t\t\t\tthis._colorNames[\"antiquewhite\"] = 0xFAEBD7;\n\t\t\t\tthis._colorNames[\"bisque\"] = 0xFFE4C4;\n\t\t\t\tthis._colorNames[\"peachpuff\"] = 0xFFDAB9;\n\t\t\t\tthis._colorNames[\"papayawhip\"] = 0xFFEFD5;\n\t\t\t\tthis._colorNames[\"beige\"] = 0xF5F5DC;\n\t\t\t\tthis._colorNames[\"seashell\"] = 0xFFF5EE;\n\t\t\t\tthis._colorNames[\"lavenderblush\"] = 0xFFF0F5;\n\t\t\t\tthis._colorNames[\"mistyrose\"] = 0xFFE4E1;\n\t\t\t\tthis._colorNames[\"snow\"] = 0xFFFAFA;\n\t\t\t\tthis._colorNames[\"white\"] = 0xFFFFFF;\n\t\t\t\tthis._colorNames[\"whitesmoke\"] = 0xF5F5F5;\n\t\t\t\tthis._colorNames[\"gainsboro\"] = 0xDCDCDC;\n\t\t\t\tthis._colorNames[\"lightgrey\"] = 0xD3D3D3;\n\t\t\t\tthis._colorNames[\"silver\"] = 0xC0C0C0;\n\t\t\t\tthis._colorNames[\"darkgrey\"] = 0xA9A9A9;\n\t\t\t\tthis._colorNames[\"grey\"] = 0x808080;\n\t\t\t\tthis._colorNames[\"lightslategrey\"] = 0x778899;\n\t\t\t\tthis._colorNames[\"slategrey\"] = 0x708090;\n\t\t\t\tthis._colorNames[\"dimgrey\"] = 0x696969;\n\t\t\t\tthis._colorNames[\"darkslategrey\"] = 0x2F4F4F;\n\t\t\t\tthis._colorNames[\"black\"] = 0x000000;\n\t\t\t\tthis._colorNames[\"transparent\"] = 0xFF000000;\n\t\t\t}\n\n\t\t\tif (this._colorNames[data] != null)\n\t\t\t\treturn this._colorNames[data];\n\n\t\t\tif ((( data).length == 6) && this.isHex(data))\n\t\t\t\treturn parseInt(\"0x\" + data);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tpublic static color(data:any):number /*uint*/\n\t{\n\t\tvar result:number /*uint*/ = this.tryColor(data);\n\n\t\tif (result == null)\n\t\t\tthrow new CastError(\"Can't cast to color: \" + data);\n\n\t\treturn result;\n\t}\n\n\tpublic static tryClass(name:string):any\n\t{\n\t\tif (this._notClasses[name])\n\t\t\treturn name;\n\n\t\tvar result:any = this._classes[name];\n\n\t\tif (result != null)\n\t\t\treturn result;\n\n\t\ttry {\n\t\t\tresult = window[name];\n\t\t\tthis._classes[name] = result;\n\t\t\treturn result;\n\t\t} catch (e /*ReferenceError*/) {\n\t\t}\n\n\t\tthis._notClasses[name] = true;\n\n\t\treturn name;\n\t}\n\n\tpublic static bitmapData(data:any):BitmapData\n\t{\n\t\tif (data == null)\n\t\t\treturn null;\n\n\t\tif (typeof(data) == 'string')\n\t\t\tdata = this.tryClass(data);\n\n\t\tif (typeof(data) == 'function') {\n\t\t\ttry {\n\t\t\t\tdata = new data();\n\t\t\t} catch (e /*ArgumentError*/) {\n\t\t\t\tdata = new data(0, 0);\n\t\t\t}\n\t\t}\n\n\t\tif (data instanceof BitmapData)\n\t\t\treturn data;\n\n\t\tif (data instanceof ImageTexture)\n\t\t\tdata = ( data).htmlImageElement;\n\n\t\tif (data instanceof HTMLImageElement) {\n\t\t\tvar imageElement:HTMLImageElement = data;\n\t\t\tvar bitmapData:BitmapData = new BitmapData(imageElement.width, imageElement.height, true, 0x0);\n\t\t\tbitmapData.draw(imageElement)\n\t\t\treturn bitmapData;\n\t\t}\n\n\t\t// if (data is DisplayObject) {\n\t\t// var ds:DisplayObject = data as DisplayObject;\n\t\t// var bmd:BitmapData = new BitmapData(ds.width, ds.height, true, 0x00FFFFFF);\n\t\t// var mat:Matrix = ds.transform.matrix.clone();\n\t\t// mat.tx = 0;\n\t\t// mat.ty = 0;\n\t\t// bmd.draw(ds, mat, ds.transform.colorTransform, ds.blendMode, bmd.rect, true);\n\t\t// return bmd;\n\t\t// }\n\n\t\tthrow new CastError(\"Can't cast to BitmapData: \" + data);\n\t}\n\n\tpublic static bitmapTexture(data:any):BitmapTexture\n\t{\n\t\tif (data == null)\n\t\t\treturn null;\n\n\t\tif (typeof(data) == 'string')\n\t\t\tdata = this.tryClass(data);\n\n\t\tif (typeof(data) == 'function') {\n\t\t\ttry {\n\t\t\t\tdata = new data();\n\t\t\t} catch (e /*ArgumentError*/) {\n\t\t\t\tdata = new data(0, 0);\n\t\t\t}\n\t\t}\n\n\t\tif (data instanceof BitmapTexture)\n\t\t\treturn data;\n\n\t\ttry {\n\t\t\tvar bmd:BitmapData = Cast.bitmapData(data);\n\t\t\treturn new BitmapTexture(bmd);\n\t\t} catch (e /*CastError*/) {\n\t\t}\n\n\t\tthrow new CastError(\"Can't cast to BitmapTexture: \" + data);\n\t}\n}\n\nexport = Cast;", + "/**\n *\n */\nclass ColorUtils\n{\n\tpublic static float32ColorToARGB(float32Color:number):number[]\n\t{\n\t\tvar a:number = ( float32Color & 0xff000000 ) >>> 24\n\t\tvar r:number = ( float32Color & 0xff0000 ) >>> 16;\n\t\tvar g:number = ( float32Color & 0xff00 ) >>> 8;\n\t\tvar b:number = float32Color & 0xff;\n\t\tvar result:number[] = [ a, r , g , b ];\n\n\t\treturn result;\n\t}\n\n\tprivate static componentToHex(c:number):string\n\t{\n\t\tvar hex = c.toString(16);\n\t\treturn hex.length == 1? \"0\" + hex : hex;\n\t}\n\n\tpublic static RGBToHexString(argb:number[]):string\n\t{\n\t\treturn \"#\" + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]);\n\t}\n\n\tpublic static ARGBToHexString(argb:number[]):string\n\t{\n\t\treturn \"#\" + ColorUtils.componentToHex(argb[0]) + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]);\n\t}\n}\n\nexport = ColorUtils;", + "import PartialImplementationError\t= require(\"awayjs-core/lib/errors/PartialImplementationError\");\n\n/**\n *\n */\nclass Debug\n{\n\tpublic static THROW_ERRORS:boolean = true;\n\tpublic static ENABLE_LOG:boolean = true;\n\tpublic static LOG_PI_ERRORS:boolean = true;\n\n\tprivate static keyword:string = null;\n\n\tpublic static breakpoint():void\n\t{\n\t\tDebug['break']();\n\t}\n\n\tpublic static throwPIROnKeyWordOnly(str:string, enable:boolean = true)\n\t{\n\t\tif (!enable)\n\t\t\tDebug.keyword = null;\n\t\telse\n\t\t\tDebug.keyword = str;\n\t}\n\n\tpublic static throwPIR(clss:string, fnc:string, msg:string)\n\t{\n\t\tDebug.logPIR('PartialImplementationError ' + clss, fnc, msg);\n\n\t\tif (Debug.THROW_ERRORS) {\n\t\t\tif (Debug.keyword) {\n\t\t\t\tvar e:string = clss + fnc + msg;\n\n\t\t\t\tif (e.indexOf(Debug.keyword) == -1)\n\t\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow new PartialImplementationError(clss + '.' + fnc + ': ' + msg);\n\t\t}\n\t}\n\n\tprivate static logPIR(clss:string, fnc:string, msg:string = '')\n\t{\n\t\tif (Debug.LOG_PI_ERRORS)\n\t\t\tconsole.log(clss + '.' + fnc + ': ' + msg);\n\t}\n\n\tpublic static log(...args:any[])\n\t{\n\t\tif (Debug.ENABLE_LOG)\n\t\t\tconsole.log(args);\n\t}\n}\n\nexport = Debug;", + "import getTimer\t\t\t\t\t= require(\"awayjs-core/lib/utils/getTimer\");\n\nclass RequestAnimationFrame\n{\n\tprivate _callback:Function;\n\tprivate _callbackContext:Object;\n\tprivate _active:boolean = false;\n\tprivate _rafUpdateFunction:any;\n\tprivate _prevTime:number;\n\tprivate _dt:number;\n\tprivate _currentTime:number;\n\tprivate _argsArray:Array = new Array();\n\tprivate _getTimer:Function;\n\n\tconstructor(callback:Function, callbackContext:Object)\n\t{\n\t\tthis._getTimer = getTimer;\n\n\t\tthis.setCallback(callback, callbackContext);\n\n\t\tthis._rafUpdateFunction = () => {\n\t\t\tif (this._active)\n\t\t\t\tthis._tick();\n\t\t}\n\n\t\tthis._argsArray.push(this._dt);\n\t}\n\n\t// Public\n\n\t/**\n\t *\n\t * @param callback\n\t * @param callbackContext\n\t */\n\tpublic setCallback(callback:Function, callbackContext:Object)\n\t{\n\t\tthis._callback = callback;\n\t\tthis._callbackContext = callbackContext;\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic start()\n\t{\n\t\tthis._prevTime = this._getTimer();\n\t\tthis._active = true;\n\n\t\tif (window.requestAnimationFrame) {\n\t\t\twindow.requestAnimationFrame(this._rafUpdateFunction);\n\t\t} else {\n\t\t\tif (window['mozRequestAnimationFrame'])\n\t\t\t\twindow.requestAnimationFrame = window['mozRequestAnimationFrame'];\n\t\t\telse if (window['webkitRequestAnimationFrame'])\n\t\t\t\twindow.requestAnimationFrame = window['webkitRequestAnimationFrame'];\n\t\t\telse if (window['oRequestAnimationFrame'])\n\t\t\t\twindow.requestAnimationFrame = window['oRequestAnimationFrame'];\n\t\t}\n\t}\n\n\t/**\n\t *\n\t */\n\tpublic stop()\n\t{\n\t\tthis._active = false;\n\t}\n\n\t// Get / Set\n\n\t/**\n\t *\n\t * @returns {boolean}\n\t */\n\tpublic get active():boolean\n\t{\n\t\treturn this._active;\n\t}\n\n\t// Private\n\n\t/**\n\t *\n\t * @private\n\t */\n\tprivate _tick():void\n\t{\n\t\tthis._currentTime = this._getTimer();\n\t\tthis._dt = this._currentTime - this._prevTime;\n\t\tthis._argsArray[0] = this._dt;\n\t\tthis._callback.apply(this._callbackContext, this._argsArray);\n\n\t\twindow.requestAnimationFrame(this._rafUpdateFunction);\n\n\t\tthis._prevTime = this._currentTime;\n\t}\n\n\n}\n\nexport = RequestAnimationFrame;", + "import BitmapData\t\t\t\t= require(\"awayjs-core/lib/core/base/BitmapData\");\n\nclass TextureUtils\n{\n\tprivate static MAX_SIZE:number = 2048;\n\n\tpublic static isBitmapDataValid(bitmapData:BitmapData):boolean\n\t{\n\t\tif (bitmapData == null) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn TextureUtils.isDimensionValid(bitmapData.width) && TextureUtils.isDimensionValid(bitmapData.height);\n\n\t}\n\n\tpublic static isHTMLImageElementValid(image:HTMLImageElement):boolean\n\t{\n\t\tif (image == null)\n\t\t\treturn true;\n\n\t\treturn TextureUtils.isDimensionValid(image.width) && TextureUtils.isDimensionValid(image.height);\n\n\t}\n\n\tpublic static isDimensionValid(d:number):boolean\n\t{\n\n\t\treturn d >= 1 && d <= TextureUtils.MAX_SIZE && TextureUtils.isPowerOfTwo(d);\n\n\t}\n\n\tpublic static isPowerOfTwo(value:number):boolean\n\t{\n\n\t\treturn value? ( ( value & -value ) == value ) : false;\n\n\t}\n\n\tpublic static getBestPowerOf2(value:number):number\n\t{\n\t\tvar p:number = 1;\n\n\t\twhile (p < value)\n\t\t\tp <<= 1;\n\n\t\tif (p > TextureUtils.MAX_SIZE)\n\t\t\tp = TextureUtils.MAX_SIZE;\n\n\t\treturn p;\n\t}\n}\n\nexport = TextureUtils", + "import Error\t\t\t\t\t= require(\"awayjs-core/lib/errors/Error\");\nimport EventDispatcher\t\t\t= require(\"awayjs-core/lib/events/EventDispatcher\");\nimport TimerEvent\t\t\t\t= require(\"awayjs-core/lib/events/TimerEvent\");\n\nclass Timer extends EventDispatcher\n{\n\n\tprivate _delay:number;\n\tprivate _repeatCount:number = 0;\n\tprivate _currentCount:number = 0;\n\tprivate _iid:number;\n\tprivate _running:boolean = false;\n\n\tconstructor(delay:number, repeatCount:number = 0)\n\t{\n\n\t\tsuper();\n\n\n\t\tthis._delay = delay;\n\t\tthis._repeatCount = repeatCount;\n\n\t\tif (isNaN(delay) || delay < 0) {\n\t\t\tthrow new Error(\"Delay is negative or not a number\");\n\t\t}\n\n\t}\n\n\tpublic get currentCount():number\n\t{\n\n\t\treturn this._currentCount;\n\n\t}\n\n\tpublic get delay():number\n\t{\n\n\t\treturn this._delay;\n\n\t}\n\n\tpublic set delay(value:number)\n\t{\n\n\t\tthis._delay = value;\n\n\t\tif (this._running) {\n\t\t\tthis.stop();\n\t\t\tthis.start();\n\t\t}\n\n\t}\n\n\tpublic get repeatCount():number\n\t{\n\n\t\treturn this._repeatCount;\n\t}\n\n\tpublic set repeatCount(value:number)\n\t{\n\n\t\tthis._repeatCount = value;\n\t}\n\n\tpublic reset():void\n\t{\n\n\t\tif (this._running) {\n\t\t\tthis.stop();\n\t\t}\n\n\t\tthis._currentCount = 0;\n\n\t}\n\n\tpublic get running():boolean\n\t{\n\n\t\treturn this._running;\n\n\t}\n\n\tpublic start():void\n\t{\n\n\t\tthis._running = true;\n\t\tclearInterval(this._iid);\n\t\tthis._iid = setInterval(() => this.tick(), this._delay);\n\n\t}\n\n\tpublic stop():void\n\t{\n\n\t\tthis._running = false;\n\t\tclearInterval(this._iid);\n\n\t}\n\n\tprivate tick():void\n\t{\n\n\t\tthis._currentCount++;\n\n\t\tif (( this._repeatCount > 0 ) && this._currentCount >= this._repeatCount) {\n\n\t\t\tthis.stop();\n\t\t\tthis.dispatchEvent(new TimerEvent(TimerEvent.TIMER));\n\t\t\tthis.dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE));\n\n\t\t} else {\n\n\t\t\tthis.dispatchEvent(new TimerEvent(TimerEvent.TIMER));\n\n\t\t}\n\n\t}\n}\n\nexport = Timer;", + "/**\n *\n *\n * @returns {number}\n */\nfunction getTimer():number\n{\n\t// number milliseconds of 1970/01/01\n\t// this different to AS3 implementation which gets the number of milliseconds\n\t// since instance of Flash player was initialised\n\treturn Date.now();\n}\n\nexport = getTimer;" + ] +} \ No newline at end of file diff --git a/build/awayjs-core.next.d.ts b/build/awayjs-core.next.d.ts deleted file mode 100644 index 62cff747..00000000 --- a/build/awayjs-core.next.d.ts +++ /dev/null @@ -1,15640 +0,0 @@ -/// -declare module away.errors { - class Error { - private _errorID; - private _messsage; - private _name; - constructor(message?: string, id?: number, _name?: string); - /** - * - * @returns {string} - */ - /** - * - * @param value - */ - public message : string; - /** - * - * @returns {string} - */ - /** - * - * @param value - */ - public name : string; - /** - * - * @returns {number} - */ - public errorID : number; - } -} -declare module away.errors { - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - class ArgumentError extends Error { - /** - * Create a new ArgumentError. - * - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - constructor(message?: string, id?: number); - } -} -declare module away.errors { - class CastError extends Error { - constructor(message: string); - } -} -declare module away.errors { - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - class PartialImplementationError extends Error { - /** - * Create a new AbstractMethodError. - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - constructor(dependency?: string, id?: number); - } -} -declare module away.errors { - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - class AbstractMethodError extends Error { - /** - * Create a new AbstractMethodError. - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - constructor(message?: string, id?: number); - } -} -declare module away.errors { - class DocumentError extends Error { - static DOCUMENT_DOES_NOT_EXIST: string; - constructor(message?: string, id?: number); - } -} -declare module away.errors { - /** - * RangeError is thrown when an index is accessed out of range of the number of - * available indices on an Array. - */ - class RangeError extends Error { - /** - * Create a new RangeError. - * - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - constructor(message?: string, id?: number); - } -} -/** -* Base event class -* @class away.events.Event -*/ -declare module away.events { - class Event { - static COMPLETE: string; - static OPEN: string; - static ENTER_FRAME: string; - static EXIT_FRAME: string; - static RESIZE: string; - static ERROR: string; - static CHANGE: string; - /** - * Type of event - * @property type - * @type String - */ - public type: string; - /** - * Reference to target object - * @property target - * @type Object - */ - public target: any; - constructor(type: string); - /** - * Clones the current event. - * @return An exact duplicate of the current event. - */ - public clone(): Event; - } -} -declare module away.events { - /** - * @class away.events.AssetEvent - */ - class AssetEvent extends Event { - /** - * - */ - static ASSET_COMPLETE: string; - /** - * - */ - static ASSET_RENAME: string; - /** - * - */ - static ASSET_CONFLICT_RESOLVED: string; - /** - * - */ - static TEXTURE_SIZE_ERROR: string; - private _asset; - private _prevName; - /** - * - */ - constructor(type: string, asset?: library.IAsset, prevName?: string); - /** - * - */ - public asset : library.IAsset; - /** - * - */ - public assetPrevName : string; - /** - * - */ - public clone(): Event; - } -} -/** -* @module away.events -*/ -declare module away.events { - /** - * @class away.events.CameraEvent - */ - class CameraEvent extends Event { - static PROJECTION_CHANGED: string; - private _camera; - constructor(type: string, camera: entities.Camera); - public camera : entities.Camera; - } -} -/** -* @module away.events -*/ -declare module away.events { - class DisplayObjectEvent extends Event { - static VISIBLITY_UPDATED: string; - static SCENETRANSFORM_CHANGED: string; - static SCENE_CHANGED: string; - static POSITION_CHANGED: string; - static ROTATION_CHANGED: string; - static SCALE_CHANGED: string; - public object: base.DisplayObject; - constructor(type: string, object: base.DisplayObject); - } -} -/** -* @module away.events -*/ -declare module away.events { - /** - * Base class for dispatching events - * - * @class away.events.EventDispatcher - * - */ - class EventDispatcher { - private listeners; - private target; - constructor(target?: any); - /** - * Add an event listener - * @method addEventListener - * @param {String} Name of event to add a listener for - * @param {Function} Callback function - */ - public addEventListener(type: string, listener: Function): void; - /** - * Remove an event listener - * @method removeEventListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - public removeEventListener(type: string, listener: Function): void; - /** - * Dispatch an event - * @method dispatchEvent - * @param {Event} Event to dispatch - */ - public dispatchEvent(event: Event): void; - /** - * get Event Listener Index in array. Returns -1 if no listener is added - * @method getEventListenerIndex - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - private getEventListenerIndex(type, listener); - /** - * check if an object has an event listener assigned to it - * @method hasListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - public hasEventListener(type: string, listener?: Function): boolean; - } -} -declare module away.events { - /** - * Dispatched to notify changes in a geometry object's state. - * - * @class away.events.GeometryEvent - * @see away3d.core.base.Geometry - */ - class GeometryEvent extends Event { - /** - * Dispatched when a TriangleSubGeometry was added to the dispatching Geometry. - */ - static SUB_GEOMETRY_ADDED: string; - /** - * Dispatched when a TriangleSubGeometry was removed from the dispatching Geometry. - */ - static SUB_GEOMETRY_REMOVED: string; - static BOUNDS_INVALID: string; - private _subGeometry; - /** - * Create a new GeometryEvent - * @param type The event type. - * @param subGeometry An optional TriangleSubGeometry object that is the subject of this event. - */ - constructor(type: string, subGeometry?: base.SubGeometryBase); - /** - * The TriangleSubGeometry object that is the subject of this event, if appropriate. - */ - public subGeometry : base.SubGeometryBase; - /** - * Clones the event. - * @return An exact duplicate of the current object. - */ - public clone(): Event; - } -} -declare module away.events { - /** - * @class away.events.HTTPStatusEvent - */ - class HTTPStatusEvent extends Event { - static HTTP_STATUS: string; - public status: number; - constructor(type: string, status?: number); - } -} -/** -* @module away.events -*/ -declare module away.events { - /** - * Base interface for dispatching events - * - * @interface away.events.IEventDispatcher - * - */ - interface IEventDispatcher { - /** - * Add an event listener - * @method addEventListener - * @param {String} Name of event to add a listener for - * @param {Function} Callback function - */ - addEventListener(type: string, listener: Function): any; - /** - * Remove an event listener - * @method removeEventListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - removeEventListener(type: string, listener: Function): any; - /** - * Dispatch an event - * @method dispatchEvent - * @param {Event} Event to dispatch - */ - dispatchEvent(event: Event): any; - /** - * check if an object has an event listener assigned to it - * @method hasListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - * @param {Object} Target object listener is added to - */ - hasEventListener(type: string, listener?: Function): boolean; - } -} -/** -* @module away.events -*/ -declare module away.events { - class IOErrorEvent extends Event { - static IO_ERROR: string; - constructor(type: string); - } -} -/** -* @module away.events -*/ -declare module away.events { - class LightEvent extends Event { - static CASTS_SHADOW_CHANGE: string; - constructor(type: string); - public clone(): Event; - } -} -/** -* @module away.events -*/ -declare module away.events { - class LoaderEvent extends Event { - /** - * Dispatched when a resource and all of its dependencies is retrieved. - */ - static RESOURCE_COMPLETE: string; - private _url; - private _content; - private _assets; - /** - * Create a new LoaderEvent object. - * - * @param type The event type. - * @param url The url of the loaded resource. - * @param assets The assets of the loaded resource. - */ - constructor(type: string, url?: string, content?: base.DisplayObject, assets?: library.IAsset[]); - /** - * The content returned if the resource has been loaded inside a Loader object. - */ - public content : base.DisplayObject; - /** - * The url of the loaded resource. - */ - public url : string; - /** - * The error string on loadError. - */ - public assets : library.IAsset[]; - /** - * Clones the current event. - * @return An exact duplicate of the current event. - */ - public clone(): Event; - } -} -/** -* @module away.events -*/ -declare module away.events { - class ParserEvent extends Event { - private _message; - /** - * Dispatched when parsing of an asset completed. - */ - static PARSE_COMPLETE: string; - /** - * Dispatched when an error occurs while parsing the data (e.g. because it's - * incorrectly formatted.) - */ - static PARSE_ERROR: string; - /** - * Dispatched when a parser is ready to have dependencies retrieved and resolved. - * This is an internal event that should rarely (if ever) be listened for by - * external classes. - */ - static READY_FOR_DEPENDENCIES: string; - constructor(type: string, message?: string); - /** - * Additional human-readable message. Usually supplied for ParserEvent.PARSE_ERROR events. - */ - public message : string; - public clone(): Event; - } -} -/** -* @module away.events -*/ -declare module away.events { - /** - * A MouseEvent is dispatched when a mouse event occurs over a mouseEnabled object in View. - * TODO: we don't have screenZ data, tho this should be easy to implement - */ - class MouseEvent extends Event { - public _iAllowedToPropagate: boolean; - public _iParentEvent: MouseEvent; - /** - * Defines the value of the type property of a mouseOver3d event object. - */ - static MOUSE_OVER: string; - /** - * Defines the value of the type property of a mouseOut3d event object. - */ - static MOUSE_OUT: string; - /** - * Defines the value of the type property of a mouseUp3d event object. - */ - static MOUSE_UP: string; - /** - * Defines the value of the type property of a mouseDown3d event object. - */ - static MOUSE_DOWN: string; - /** - * Defines the value of the type property of a mouseMove3d event object. - */ - static MOUSE_MOVE: string; - /** - * Defines the value of the type property of a click3d event object. - */ - static CLICK: string; - /** - * Defines the value of the type property of a doubleClick3d event object. - */ - static DOUBLE_CLICK: string; - /** - * Defines the value of the type property of a mouseWheel3d event object. - */ - static MOUSE_WHEEL: string; - /** - * The horizontal coordinate at which the event occurred in view coordinates. - */ - public screenX: number; - /** - * The vertical coordinate at which the event occurred in view coordinates. - */ - public screenY: number; - /** - * The view object inside which the event took place. - */ - public view: containers.View; - /** - * The 3d object inside which the event took place. - */ - public object: base.DisplayObject; - /** - * The material owner inside which the event took place. - */ - public materialOwner: base.IMaterialOwner; - /** - * The material of the 3d element inside which the event took place. - */ - public material: materials.MaterialBase; - /** - * The uv coordinate inside the draw primitive where the event took place. - */ - public uv: geom.Point; - /** - * The index of the face where the event took place. - */ - public index: number; - /** - * The index of the subGeometry where the event took place. - */ - public subGeometryIndex: number; - /** - * The position in object space where the event took place - */ - public localPosition: geom.Vector3D; - /** - * The normal in object space where the event took place - */ - public localNormal: geom.Vector3D; - /** - * Indicates whether the Control key is active (true) or inactive (false). - */ - public ctrlKey: boolean; - /** - * Indicates whether the Alt key is active (true) or inactive (false). - */ - public altKey: boolean; - /** - * Indicates whether the Shift key is active (true) or inactive (false). - */ - public shiftKey: boolean; - /** - * Indicates how many lines should be scrolled for each unit the user rotates the mouse wheel. - */ - public delta: number; - /** - * Create a new MouseEvent object. - * @param type The type of the MouseEvent. - */ - constructor(type: string); - /** - * @inheritDoc - */ - public bubbles : boolean; - /** - * @inheritDoc - */ - public stopPropagation(): void; - /** - * @inheritDoc - */ - public stopImmediatePropagation(): void; - /** - * Creates a copy of the MouseEvent object and sets the value of each property to match that of the original. - */ - public clone(): Event; - /** - * The position in scene space where the event took place - */ - public scenePosition : geom.Vector3D; - /** - * The normal in scene space where the event took place - */ - public sceneNormal : geom.Vector3D; - } -} -/** -* @module away.events -*/ -declare module away.events { - class MaterialEvent extends Event { - static SIZE_CHANGED: string; - constructor(type: string); - } -} -/** -* @module away.events -*/ -declare module away.events { - class ProgressEvent extends Event { - static PROGRESS: string; - public bytesLoaded: number; - public bytesTotal: number; - constructor(type: string); - } -} -/** -* @module away.events -*/ -declare module away.events { - class ProjectionEvent extends Event { - static MATRIX_CHANGED: string; - private _projection; - constructor(type: string, projection: projections.IProjection); - public projection : projections.IProjection; - } -} -/** -* @module away.events -*/ -declare module away.events { - class RendererEvent extends Event { - static VIEWPORT_UPDATED: string; - static SCISSOR_UPDATED: string; - constructor(type: string); - } -} -/** -* @module away.events -*/ -declare module away.events { - class SceneEvent extends Event { - /** - * - */ - static ADDED_TO_SCENE: string; - /** - * - */ - static REMOVED_FROM_SCENE: string; - /** - * - */ - static PARTITION_CHANGED: string; - /** - * - */ - public displayObject: base.DisplayObject; - constructor(type: string, displayObject: base.DisplayObject); - } -} -/** -* @module away.events -*/ -declare module away.events { - class StageEvent extends Event { - static CONTEXT_CREATED: string; - static CONTEXT_DISPOSED: string; - static CONTEXT_RECREATED: string; - static VIEWPORT_UPDATED: string; - constructor(type: string); - } -} -declare module away.events { - /** - * Dispatched to notify changes in a sub geometry object's state. - * - * @class away.events.SubGeometryEvent - * @see away3d.core.base.Geometry - */ - class SubGeometryEvent extends Event { - /** - * Dispatched when a TriangleSubGeometry's index data has been updated. - */ - static INDICES_UPDATED: string; - /** - * Dispatched when a TriangleSubGeometry's vertex data has been updated. - */ - static VERTICES_UPDATED: string; - private _dataType; - /** - * Create a new GeometryEvent - * @param type The event type. - * @param dataType An optional data type of the vertex data being updated. - */ - constructor(type: string, dataType?: string); - /** - * The data type of the vertex data. - */ - public dataType : string; - /** - * Clones the event. - * - * @return An exact duplicate of the current object. - */ - public clone(): Event; - } -} -/** -* @module away.events -*/ -declare module away.events { - class TimerEvent extends Event { - static TIMER: string; - static TIMER_COMPLETE: string; - constructor(type: string); - } -} -declare module away.utils { - class ByteArrayBase { - public position: number; - public length: number; - public _mode: string; - static Base64Key: string; - constructor(); - public writeByte(b: number): void; - public readByte(): number; - public writeUnsignedByte(b: number): void; - public readUnsignedByte(): number; - public writeUnsignedShort(b: number): void; - public readUnsignedShort(): number; - public writeUnsignedInt(b: number): void; - public readUnsignedInt(): number; - public writeFloat(b: number): void; - public toFloatBits(x: number): void; - public readFloat(b: number): void; - public fromFloatBits(x: number): void; - public getBytesAvailable(): number; - public toString(): string; - public compareEqual(other: any, count: any): boolean; - public writeBase64String(s: string): void; - public dumpToConsole(): void; - public readBase64String(count: number): string; - static internalGetBase64String(count: any, getUnsignedByteFunc: any, self: any): string; - } -} -declare module away.utils { - class ByteArray extends ByteArrayBase { - public maxlength: number; - public arraybytes: any; - public unalignedarraybytestemp: any; - constructor(); - public ensureWriteableSpace(n: number): void; - public setArrayBuffer(aBuffer: ArrayBuffer): void; - public getBytesAvailable(): number; - public ensureSpace(n: number): void; - public writeByte(b: number): void; - public readByte(): number; - public readBytes(bytes: ByteArray, offset?: number, length?: number): void; - public writeUnsignedByte(b: number): void; - public readUnsignedByte(): number; - public writeUnsignedShort(b: number): void; - public readUTFBytes(len: number): string; - public readInt(): number; - public readShort(): number; - public readDouble(): number; - public readUnsignedShort(): number; - public writeUnsignedInt(b: number): void; - public readUnsignedInt(): number; - public writeFloat(b: number): void; - public readFloat(): number; - } -} -declare module away.utils { - class ByteArrayBuffer extends ByteArrayBase { - public _bytes: number[]; - constructor(); - public writeByte(b: number): void; - public readByte(): number; - public writeUnsignedByte(b: number): void; - public readUnsignedByte(): number; - public writeUnsignedShort(b: number): void; - public readUnsignedShort(): number; - public writeUnsignedInt(b: number): void; - public readUnsignedInt(): number; - public writeFloat(b: number): void; - public toFloatBits(x: number): number; - public readFloat(b: number): number; - public fromFloatBits(x: number): number; - } -} -declare module away.utils { - class ColorUtils { - static float32ColorToARGB(float32Color: number): number[]; - private static componentToHex(c); - static RGBToHexString(argb: number[]): string; - static ARGBToHexString(argb: number[]): string; - } -} -declare module away.utils { - /** - * Helper class for casting assets to usable objects - */ - class Cast { - private static _colorNames; - private static _hexChars; - private static _notClasses; - private static _classes; - static string(data: any): string; - static byteArray(data: any): ByteArray; - private static isHex(str); - static tryColor(data: any): number; - static color(data: any): number; - static tryClass(name: string): any; - static bitmapData(data: any): base.BitmapData; - static bitmapTexture(data: any): textures.BitmapTexture; - } -} -declare module away.utils { - class CSS { - static setElementSize(element: HTMLElement, width: number, height: number): void; - static setElementWidth(element: HTMLElement, width: number): void; - static setElementHeight(element: HTMLElement, height: number): void; - static setElementX(element: HTMLElement, x: number): void; - static setElementY(element: HTMLElement, y: number): void; - static getElementVisibility(element: HTMLElement): boolean; - static setElementVisibility(element: HTMLElement, visible: boolean): void; - static setElementAlpha(element: HTMLElement, alpha: number): void; - static setElementPosition(element: HTMLElement, x: number, y: number, absolute?: boolean): void; - } -} -declare module away { - class Debug { - static THROW_ERRORS: boolean; - static ENABLE_LOG: boolean; - static LOG_PI_ERRORS: boolean; - private static keyword; - static breakpoint(): void; - static throwPIROnKeyWordOnly(str: string, enable?: boolean): void; - static throwPIR(clss: string, fnc: string, msg: string): void; - private static logPIR(clss, fnc, msg?); - static log(...args: any[]): void; - } -} -declare module away.utils { - class Delegate { - private _func; - constructor(func?: Function); - /** - Creates a functions wrapper for the original function so that it runs - in the provided context. - @parameter obj Context in which to run the function. - @paramater func Function to run. - */ - static create(obj: Object, func: Function): Function; - public createDelegate(obj: Object): Function; - } -} -declare module away.utils { - function getTimer(): number; -} -declare module away.utils { - class RequestAnimationFrame { - private _callback; - private _callbackContext; - private _active; - private _rafUpdateFunction; - private _prevTime; - private _dt; - private _currentTime; - private _argsArray; - private _getTimer; - constructor(callback: Function, callbackContext: Object); - /** - * - * @param callback - * @param callbackContext - */ - public setCallback(callback: Function, callbackContext: Object): void; - /** - * - */ - public start(): void; - /** - * - */ - public stop(): void; - /** - * - * @returns {boolean} - */ - public active : boolean; - /** - * - * @private - */ - private _tick(); - } -} -declare module away.utils { - class TextureUtils { - private static MAX_SIZE; - static isBitmapDataValid(bitmapData: base.BitmapData): boolean; - static isHTMLImageElementValid(image: HTMLImageElement): boolean; - static isDimensionValid(d: number): boolean; - static isPowerOfTwo(value: number): boolean; - static getBestPowerOf2(value: number): number; - } -} -declare module away.utils { - class Timer extends events.EventDispatcher { - private _delay; - private _repeatCount; - private _currentCount; - private _iid; - private _running; - constructor(delay: number, repeatCount?: number); - public currentCount : number; - public delay : number; - public repeatCount : number; - public reset(): void; - public running : boolean; - public start(): void; - public stop(): void; - private tick(); - } -} -/** -* A Box object is an area defined by its position, as indicated by its -* top-left-front corner point(x, y, z) and by its width, -* height and depth. -* -* -*

The x, y, z, width, -* height depth properties of the Box class are -* independent of each other; changing the value of one property has no effect -* on the others. However, the right, bottom and -* back properties are integrally related to those six -* properties. For example, if you change the value of the right -* property, the value of the width property changes; if you -* change the bottom property, the value of the -* height property changes.

-* -*

The following methods and properties use Box objects:

-* -*
    -*
  • The bounds property of the DisplayObject class
  • -*
-* -*

You can use the new Box() constructor to create a -* Box object.

-* -*

Note: The Box class does not define a cubic Shape -* display object. -*/ -declare module away.geom { - class Box { - private _depth; - private _height; - private _size; - private _bottomRightBack; - private _topLeftFront; - private _width; - /** - * The height of the box, in pixels. Changing the height value - * of a Box object has no effect on the x, y, - * z, depth and width properties. - */ - public height: number; - /** - * The width of the box, in pixels. Changing the width value - * of a Box object has no effect on the x, y, - * z, depth and height properties. - */ - public width: number; - /** - * The deoth of the box, in pixels. Changing the depth value - * of a Box object has no effect on the x, y, - * z, width and height properties. - */ - public depth: number; - /** - * The x coordinate of the top-left-front corner of the box. - * Changing the value of the x property of a Box object has no - * effect on the y, z, width, - * height and depth properties. - * - *

The value of the x property is equal to the value of the - * left property.

- */ - public x: number; - /** - * The y coordinate of the top-left-front corner of the box. - * Changing the value of the y property of a Box object has no - * effect on the x, z, width, - * height and depth properties. - * - *

The value of the y property is equal to the value of the - * top property.

- */ - public y: number; - /** - * The y coordinate of the top-left-front corner of the box. - * Changing the value of the z property of a Box object has no - * effect on the x, y, width, - * height and depth properties. - * - *

The value of the z property is equal to the value of the - * front property.

- */ - public z: number; - /** - * The sum of the z and height properties. - */ - public back : number; - /** - * The sum of the y and height properties. - */ - public bottom : number; - /** - * The location of the Box object's bottom-right corner, determined by the - * values of the right and bottom properties. - */ - public bottomRightBack : Vector3D; - /** - * The z coordinate of the top-left-front corner of the box. Changing - * the front property of a Box object has no effect on the - * x, y, width and height - * properties. However it does affect the depth property, - * whereas changing the z value does not affect the - * depth property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - public front : number; - /** - * The x coordinate of the top-left corner of the box. Changing the - * left property of a Box object has no effect on the - * y and height properties. However it does affect - * the width property, whereas changing the x value - * does not affect the width property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - public left : number; - /** - * The sum of the x and width properties. - */ - public right : number; - /** - * The size of the Box object, expressed as a Vector3D object with the - * values of the width, height and - * depth properties. - */ - public size : Vector3D; - /** - * The y coordinate of the top-left-front corner of the box. Changing - * the top property of a Box object has no effect on the - * x and width properties. However it does affect - * the height property, whereas changing the y - * value does not affect the height property. - * - *

The value of the top property is equal to the value of the - * y property.

- */ - public top : number; - /** - * The location of the Box object's top-left-front corner, determined by the - * x, y and z coordinates of the point. - */ - public topLeftFront : Vector3D; - /** - * Creates a new Box object with the top-left-front corner specified by the - * x, y and z parameters and with the - * specified width, height and depth - * parameters. If you call this public without parameters, a box with - * x, y, z, width, - * height and depth properties set to 0 is created. - * - * @param x The x coordinate of the top-left-front corner of the - * box. - * @param y The y coordinate of the top-left-front corner of the - * box. - * @param z The z coordinate of the top-left-front corner of the - * box. - * @param width The width of the box, in pixels. - * @param height The height of the box, in pixels. - * @param depth The depth of the box, in pixels. - */ - constructor(x?: number, y?: number, z?: number, width?: number, height?: number, depth?: number); - /** - * Returns a new Box object with the same values for the x, - * y, z, width, height - * and depth properties as the original Box object. - * - * @return A new Box object with the same values for the x, - * y, z, width, - * height and depth properties as the - * original Box object. - */ - public clone(): Box; - /** - * Determines whether the specified position is contained within the cubic - * region defined by this Box object. - * - * @param x The x coordinate(horizontal component) of the position. - * @param y The y coordinate(vertical component) of the position. - * @param z The z coordinate(longitudinal component) of the position. - * @return A value of true if the Box object contains the - * specified position; otherwise false. - */ - public contains(x: number, y: number, z: number): boolean; - /** - * Determines whether the specified position is contained within the cubic - * region defined by this Box object. This method is similar to the - * Box.contains() method, except that it takes a Vector3D - * object as a parameter. - * - * @param position The position, as represented by its x, y and - * z coordinates. - * @return A value of true if the Box object contains the - * specified position; otherwise false. - */ - public containsPoint(position: Vector3D): boolean; - /** - * Determines whether the Box object specified by the box - * parameter is contained within this Box object. A Box object is said to - * contain another if the second Box object falls entirely within the - * boundaries of the first. - * - * @param box The Box object being checked. - * @return A value of true if the Box object that you specify - * is contained by this Box object; otherwise false. - */ - public containsRect(box: Box): boolean; - /** - * Copies all of box data from the source Box object into the calling - * Box object. - * - * @param sourceBox The Box object from which to copy the data. - */ - public copyFrom(sourceBox: Box): void; - /** - * Determines whether the object specified in the toCompare - * parameter is equal to this Box object. This method compares the - * x, y, z, width, - * height and depth properties of an object against - * the same properties of this Box object. - * - * @param toCompare The box to compare to this Box object. - * @return A value of true if the object has exactly the same - * values for the x, y, z, - * width, height and depth - * properties as this Box object; otherwise false. - */ - public equals(toCompare: Box): boolean; - /** - * Increases the size of the Box object by the specified amounts, in - * pixels. The center point of the Box object stays the same, and its - * size increases to the left and right by the dx value, to - * the top and the bottom by the dy value, and to - * the front and the back by the dz value. - * - * @param dx The value to be added to the left and the right of the Box - * object. The following equation is used to calculate the new - * width and position of the box: - * @param dy The value to be added to the top and the bottom of the Box - * object. The following equation is used to calculate the new - * height and position of the box: - * @param dz The value to be added to the front and the back of the Box - * object. The following equation is used to calculate the new - * depth and position of the box: - */ - public inflate(dx: number, dy: number, dz: number): void; - /** - * Increases the size of the Box object. This method is similar to the - * Box.inflate() method except it takes a Vector3D object as - * a parameter. - * - *

The following two code examples give the same result:

- * - * @param delta The x property of this Vector3D object is used to - * increase the horizontal dimension of the Box object. - * The y property is used to increase the vertical - * dimension of the Box object. - * The z property is used to increase the - * longitudinal dimension of the Box object. - */ - public inflatePoint(delta: Vector3D): void; - /** - * If the Box object specified in the toIntersect parameter - * intersects with this Box object, returns the area of intersection - * as a Box object. If the boxes do not intersect, this method returns an - * empty Box object with its properties set to 0. - * - * @param toIntersect The Box object to compare against to see if it - * intersects with this Box object. - * @return A Box object that equals the area of intersection. If the - * boxes do not intersect, this method returns an empty Box - * object; that is, a box with its x, y, - * z, width, height, and - * depth properties set to 0. - */ - public intersection(toIntersect: Box): Box; - /** - * Determines whether the object specified in the toIntersect - * parameter intersects with this Box object. This method checks the - * x, y, z, width, - * height, and depth properties of the specified - * Box object to see if it intersects with this Box object. - * - * @param toIntersect The Box object to compare against this Box object. - * @return A value of true if the specified object intersects - * with this Box object; otherwise false. - */ - public intersects(toIntersect: Box): boolean; - /** - * Determines whether or not this Box object is empty. - * - * @return A value of true if the Box object's width, height or - * depth is less than or equal to 0; otherwise false. - */ - public isEmpty(): boolean; - /** - * Adjusts the location of the Box object, as determined by its - * top-left-front corner, by the specified amounts. - * - * @param dx Moves the x value of the Box object by this amount. - * @param dy Moves the y value of the Box object by this amount. - * @param dz Moves the z value of the Box object by this amount. - */ - public offset(dx: number, dy: number, dz: number): void; - /** - * Adjusts the location of the Box object using a Vector3D object as a - * parameter. This method is similar to the Box.offset() - * method, except that it takes a Vector3D object as a parameter. - * - * @param position A Vector3D object to use to offset this Box object. - */ - public offsetPosition(position: Vector3D): void; - /** - * Sets all of the Box object's properties to 0. A Box object is empty if its - * width, height or depth is less than or equal to 0. - * - *

This method sets the values of the x, y, - * z, width, height, and - * depth properties to 0.

- * - */ - public setEmpty(): void; - /** - * Sets the members of Box to the specified values - * - * @param xa The x coordinate of the top-left-front corner of the - * box. - * @param ya The y coordinate of the top-left-front corner of the - * box. - * @param yz The z coordinate of the top-left-front corner of the - * box. - * @param widtha The width of the box, in pixels. - * @param heighta The height of the box, in pixels. - * @param deptha The depth of the box, in pixels. - */ - public setTo(xa: number, ya: number, za: number, widtha: number, heighta: number, deptha: number): void; - /** - * Builds and returns a string that lists the horizontal, vertical and - * longitudinal positions and the width, height and depth of the Box object. - * - * @return A string listing the value of each of the following properties of - * the Box object: x, y, z, - * width, height, and depth. - */ - public toString(): string; - /** - * Adds two boxes together to create a new Box object, by filling - * in the horizontal, vertical and longitudinal space between the two boxes. - * - *

Note: The union() method ignores boxes with - * 0 as the height, width or depth value, such as: var - * box2:Box = new Box(300,300,300,50,50,0);

- * - * @param toUnion A Box object to add to this Box object. - * @return A new Box object that is the union of the two boxes. - */ - public union(toUnion: Box): Box; - } -} -/** -* The ColorTransform class lets you adjust the color values in a display -* object. The color adjustment or color transformation can be applied -* to all four channels: red, green, blue, and alpha transparency. -* -*

When a ColorTransform object is applied to a display object, a new value -* for each color channel is calculated like this:

-* -*
    -*
  • New red value = (old red value * redMultiplier) + -* redOffset
  • -*
  • New green value = (old green value * greenMultiplier) + -* greenOffset
  • -*
  • New blue value = (old blue value * blueMultiplier) + -* blueOffset
  • -*
  • New alpha value = (old alpha value * alphaMultiplier) + -* alphaOffset
  • -*
-* -*

If any of the color channel values is greater than 255 after the -* calculation, it is set to 255. If it is less than 0, it is set to 0.

-* -*

You can use ColorTransform objects in the following ways:

-* -*
    -*
  • In the colorTransform parameter of the -* colorTransform() method of the BitmapData class
  • -*
  • As the colorTransform property of a Transform object -* (which can be used as the transform property of a display -* object)
  • -*
-* -*

You must use the new ColorTransform() constructor to create -* a ColorTransform object before you can call the methods of the -* ColorTransform object.

-* -*

Color transformations do not apply to the background color of a movie -* clip(such as a loaded SWF object). They apply only to graphics and symbols -* that are attached to the movie clip.

-*/ -declare module away.geom { - class ColorTransform { - /** - * A decimal value that is multiplied with the alpha transparency channel - * value. - * - *

If you set the alpha transparency value of a display object directly by - * using the alpha property of the DisplayObject instance, it - * affects the value of the alphaMultiplier property of that - * display object's transform.colorTransform property.

- */ - public alphaMultiplier: number; - /** - * A number from -255 to 255 that is added to the alpha transparency channel - * value after it has been multiplied by the alphaMultiplier - * value. - */ - public alphaOffset: number; - /** - * A decimal value that is multiplied with the blue channel value. - */ - public blueMultiplier: number; - /** - * A number from -255 to 255 that is added to the blue channel value after it - * has been multiplied by the blueMultiplier value. - */ - public blueOffset: number; - /** - * A decimal value that is multiplied with the green channel value. - */ - public greenMultiplier: number; - /** - * A number from -255 to 255 that is added to the green channel value after - * it has been multiplied by the greenMultiplier value. - */ - public greenOffset: number; - /** - * A decimal value that is multiplied with the red channel value. - */ - public redMultiplier: number; - /** - * A number from -255 to 255 that is added to the red channel value after it - * has been multiplied by the redMultiplier value. - */ - public redOffset: number; - /** - * The RGB color value for a ColorTransform object. - * - *

When you set this property, it changes the three color offset values - * (redOffset, greenOffset, and - * blueOffset) accordingly, and it sets the three color - * multiplier values(redMultiplier, - * greenMultiplier, and blueMultiplier) to 0. The - * alpha transparency multiplier and offset values do not change.

- * - *

When you pass a value for this property, use the format - * 0xRRGGBB. RR, GG, and BB each consist of two - * hexadecimal digits that specify the offset of each color component. The 0x - * tells the ActionScript compiler that the number is a hexadecimal - * value.

- */ - public color : number; - /** - * Creates a ColorTransform object for a display object with the specified - * color channel values and alpha values. - * - * @param redMultiplier The value for the red multiplier, in the range from - * 0 to 1. - * @param greenMultiplier The value for the green multiplier, in the range - * from 0 to 1. - * @param blueMultiplier The value for the blue multiplier, in the range - * from 0 to 1. - * @param alphaMultiplier The value for the alpha transparency multiplier, in - * the range from 0 to 1. - * @param redOffset The offset value for the red color channel, in the - * range from -255 to 255. - * @param greenOffset The offset value for the green color channel, in - * the range from -255 to 255. - * @param blueOffset The offset for the blue color channel value, in the - * range from -255 to 255. - * @param alphaOffset The offset for alpha transparency channel value, in - * the range from -255 to 255. - */ - constructor(redMultiplier?: number, greenMultiplier?: number, blueMultiplier?: number, alphaMultiplier?: number, redOffset?: number, greenOffset?: number, blueOffset?: number, alphaOffset?: number); - /** - * Concatenates the ColorTranform object specified by the second - * parameter with the current ColorTransform object and sets the current - * object as the result, which is an additive combination of the two color - * transformations. When you apply the concatenated ColorTransform object, - * the effect is the same as applying the second color - * transformation after the original color transformation. - * - * @param second The ColorTransform object to be combined with the current - * ColorTransform object. - */ - public concat(second: ColorTransform): void; - } -} -declare module away.geom { - /** - * MathConsts provides some commonly used mathematical constants - */ - class MathConsts { - /** - * The amount to multiply with when converting radians to degrees. - */ - static RADIANS_TO_DEGREES: number; - /** - * The amount to multiply with when converting degrees to radians. - */ - static DEGREES_TO_RADIANS: number; - } -} -/** -* The Matrix class represents a transformation matrix that determines how to -* map points from one coordinate space to another. You can perform various -* graphical transformations on a display object by setting the properties of -* a Matrix object, applying that Matrix object to the matrix -* property of a Transform object, and then applying that Transform object as -* the transform property of the display object. These -* transformation functions include translation(x and y -* repositioning), rotation, scaling, and skewing. -* -*

Together these types of transformations are known as affine -* transformations. Affine transformations preserve the straightness of -* lines while transforming, so that parallel lines stay parallel.

-* -*

To apply a transformation matrix to a display object, you create a -* Transform object, set its matrix property to the -* transformation matrix, and then set the transform property of -* the display object to the Transform object. Matrix objects are also used as -* parameters of some methods, such as the following:

-* -*
    -*
  • The draw() method of a BitmapData object
  • -*
  • The beginBitmapFill() method, -* beginGradientFill() method, or -* lineGradientStyle() method of a Graphics object
  • -*
-* -*

A transformation matrix object is a 3 x 3 matrix with the following -* contents:

-* -*

In traditional transformation matrixes, the u, -* v, and w properties provide extra capabilities. -* The Matrix class can only operate in two-dimensional space, so it always -* assumes that the property values u and v are 0.0, -* and that the property value w is 1.0. The effective values of -* the matrix are as follows:

-* -*

You can get and set the values of all six of the other properties in a -* Matrix object: a, b, c, -* d, tx, and ty.

-* -*

The Matrix class supports the four major types of transformations: -* translation, scaling, rotation, and skewing. You can set three of these -* transformations by using specialized methods, as described in the following -* table:

-* -*

Each transformation function alters the current matrix properties so -* that you can effectively combine multiple transformations. To do this, you -* call more than one transformation function before applying the matrix to -* its display object target(by using the transform property of -* that display object).

-* -*

Use the new Matrix() constructor to create a Matrix object -* before you can call the methods of the Matrix object.

-*/ -declare module away.geom { - class Matrix { - /** - * The value that affects the positioning of pixels along the x axis - * when scaling or rotating an image. - */ - public a: number; - /** - * The value that affects the positioning of pixels along the y axis - * when rotating or skewing an image. - */ - public b: number; - /** - * The value that affects the positioning of pixels along the x axis - * when rotating or skewing an image. - */ - public c: number; - /** - * The value that affects the positioning of pixels along the y axis - * when scaling or rotating an image. - */ - public d: number; - /** - * The distance by which to translate each point along the x axis. - */ - public tx: number; - /** - * The distance by which to translate each point along the y axis. - */ - public ty: number; - /** - * Creates a new Matrix object with the specified parameters. In matrix - * notation, the properties are organized like this: - * - *

If you do not provide any parameters to the new Matrix() - * constructor, it creates an identity matrix with the following - * values:

- * - *

In matrix notation, the identity matrix looks like this:

- * - * @param a The value that affects the positioning of pixels along the - * x axis when scaling or rotating an image. - * @param b The value that affects the positioning of pixels along the - * y axis when rotating or skewing an image. - * @param c The value that affects the positioning of pixels along the - * x axis when rotating or skewing an image. - * @param d The value that affects the positioning of pixels along the - * y axis when scaling or rotating an image.. - * @param tx The distance by which to translate each point along the x - * axis. - * @param ty The distance by which to translate each point along the y - * axis. - */ - constructor(a?: number, b?: number, c?: number, d?: number, tx?: number, ty?: number); - /** - * Returns a new Matrix object that is a clone of this matrix, with an exact - * copy of the contained object. - * - * @return A Matrix object. - */ - public clone(): Matrix; - /** - * Concatenates a matrix with the current matrix, effectively combining the - * geometric effects of the two. In mathematical terms, concatenating two - * matrixes is the same as combining them using matrix multiplication. - * - *

For example, if matrix m1 scales an object by a factor of - * four, and matrix m2 rotates an object by 1.5707963267949 - * radians(Math.PI/2), then m1.concat(m2) - * transforms m1 into a matrix that scales an object by a factor - * of four and rotates the object by Math.PI/2 radians.

- * - *

This method replaces the source matrix with the concatenated matrix. If - * you want to concatenate two matrixes without altering either of the two - * source matrixes, first copy the source matrix by using the - * clone() method, as shown in the Class Examples section.

- * - * @param matrix The matrix to be concatenated to the source matrix. - */ - public concat(matrix: Matrix): void; - /** - * Copies a Vector3D object into specific column of the calling Matrix3D - * object. - * - * @param column The column from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - public copyColumnFrom(column: number, vector3D: Vector3D): void; - /** - * Copies specific column of the calling Matrix object into the Vector3D - * object. The w element of the Vector3D object will not be changed. - * - * @param column The column from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - public copyColumnTo(column: number, vector3D: Vector3D): void; - /** - * Copies all of the matrix data from the source Point object into the - * calling Matrix object. - * - * @param sourceMatrix The Matrix object from which to copy the data. - */ - public copyFrom(sourceMatrix: Matrix): void; - /** - * Copies a Vector3D object into specific row of the calling Matrix object. - * - * @param row The row from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - public copyRowFrom(row: number, vector3D: Vector3D): void; - /** - * Copies specific row of the calling Matrix object into the Vector3D object. - * The w element of the Vector3D object will not be changed. - * - * @param row The row from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - public copyRowTo(row: number, vector3D: Vector3D): void; - /** - * Includes parameters for scaling, rotation, and translation. When applied - * to a matrix it sets the matrix's values based on those parameters. - * - *

Using the createBox() method lets you obtain the same - * matrix as you would if you applied the identity(), - * rotate(), scale(), and translate() - * methods in succession. For example, mat1.createBox(2,2,Math.PI/4, - * 100, 100) has the same effect as the following:

- * - * @param scaleX The factor by which to scale horizontally. - * @param scaleY The factor by which scale vertically. - * @param rotation The amount to rotate, in radians. - * @param tx The number of pixels to translate(move) to the right - * along the x axis. - * @param ty The number of pixels to translate(move) down along the - * y axis. - */ - public createBox(scaleX: number, scaleY: number, rotation?: number, tx?: number, ty?: number): void; - /** - * Creates the specific style of matrix expected by the - * beginGradientFill() and lineGradientStyle() - * methods of the Graphics class. Width and height are scaled to a - * scaleX/scaleY pair and the - * tx/ty values are offset by half the width and - * height. - * - *

For example, consider a gradient with the following - * characteristics:

- * - *
    - *
  • GradientType.LINEAR
  • - *
  • Two colors, green and blue, with the ratios array set to [0, - * 255]
  • - *
  • SpreadMethod.PAD
  • - *
  • InterpolationMethod.LINEAR_RGB
  • - *
- * - *

The following illustrations show gradients in which the matrix was - * defined using the createGradientBox() method with different - * parameter settings:

- * - * @param width The width of the gradient box. - * @param height The height of the gradient box. - * @param rotation The amount to rotate, in radians. - * @param tx The distance, in pixels, to translate to the right along - * the x axis. This value is offset by half of the - * width parameter. - * @param ty The distance, in pixels, to translate down along the - * y axis. This value is offset by half of the - * height parameter. - */ - public createGradientBox(width: number, height: number, rotation?: number, tx?: number, ty?: number): void; - /** - * Given a point in the pretransform coordinate space, returns the - * coordinates of that point after the transformation occurs. Unlike the - * standard transformation applied using the transformPoint() - * method, the deltaTransformPoint() method's transformation - * does not consider the translation parameters tx and - * ty. - * - * @param point The point for which you want to get the result of the matrix - * transformation. - * @return The point resulting from applying the matrix transformation. - */ - public deltaTransformPoint(point: Point): Point; - /** - * Sets each matrix property to a value that causes a null transformation. An - * object transformed by applying an identity matrix will be identical to the - * original. - * - *

After calling the identity() method, the resulting matrix - * has the following properties: a=1, b=0, - * c=0, d=1, tx=0, - * ty=0.

- * - *

In matrix notation, the identity matrix looks like this:

- * - */ - public identity(): void; - /** - * Performs the opposite transformation of the original matrix. You can apply - * an inverted matrix to an object to undo the transformation performed when - * applying the original matrix. - */ - public invert(): void; - /** - * Returns a new Matrix object that is a clone of this matrix, with an exact - * copy of the contained object. - * - * @param matrix The matrix for which you want to get the result of the matrix - * transformation. - * @return A Matrix object. - */ - public multiply(matrix: Matrix): Matrix; - /** - * Applies a rotation transformation to the Matrix object. - * - *

The rotate() method alters the a, - * b, c, and d properties of the - * Matrix object. In matrix notation, this is the same as concatenating the - * current matrix with the following:

- * - * @param angle The rotation angle in radians. - */ - public rotate(angle: number): void; - /** - * Applies a scaling transformation to the matrix. The x axis is - * multiplied by sx, and the y axis it is multiplied by - * sy. - * - *

The scale() method alters the a and - * d properties of the Matrix object. In matrix notation, this - * is the same as concatenating the current matrix with the following - * matrix:

- * - * @param sx A multiplier used to scale the object along the x axis. - * @param sy A multiplier used to scale the object along the y axis. - */ - public scale(sx: number, sy: number): void; - /** - * Sets the members of Matrix to the specified values. - * - * @param a The value that affects the positioning of pixels along the - * x axis when scaling or rotating an image. - * @param b The value that affects the positioning of pixels along the - * y axis when rotating or skewing an image. - * @param c The value that affects the positioning of pixels along the - * x axis when rotating or skewing an image. - * @param d The value that affects the positioning of pixels along the - * y axis when scaling or rotating an image.. - * @param tx The distance by which to translate each point along the x - * axis. - * @param ty The distance by which to translate each point along the y - * axis. - */ - public setTo(a: number, b: number, c: number, d: number, tx: number, ty: number): void; - /** - * Returns a text value listing the properties of the Matrix object. - * - * @return A string containing the values of the properties of the Matrix - * object: a, b, c, - * d, tx, and ty. - */ - public toString(): string; - /** - * Returns the result of applying the geometric transformation represented by - * the Matrix object to the specified point. - * - * @param point The point for which you want to get the result of the Matrix - * transformation. - * @return The point resulting from applying the Matrix transformation. - */ - public transformPoint(point: Point): Point; - /** - * Translates the matrix along the x and y axes, as specified - * by the dx and dy parameters. - * - * @param dx The amount of movement along the x axis to the right, in - * pixels. - * @param dy The amount of movement down along the y axis, in pixels. - */ - public translate(dx: number, dy: number): void; - } -} -declare module away.geom { - class Matrix3D { - /** - * A Vector of 16 Numbers, where every four elements is a column of a 4x4 matrix. - * - *

An exception is thrown if the rawData property is set to a matrix that is not invertible. The Matrix3D - * object must be invertible. If a non-invertible matrix is needed, create a subclass of the Matrix3D object.

- */ - public rawData: number[]; - /** - * Creates a Matrix3D object. - */ - constructor(v?: number[]); - /** - * Appends the matrix by multiplying another Matrix3D object by the current Matrix3D object. - */ - public append(lhs: Matrix3D): void; - /** - * Appends an incremental rotation to a Matrix3D object. - */ - public appendRotation(degrees: number, axis: Vector3D): void; - /** - * Appends an incremental scale change along the x, y, and z axes to a Matrix3D object. - */ - public appendScale(xScale: number, yScale: number, zScale: number): void; - /** - * Appends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. - */ - public appendTranslation(x: number, y: number, z: number): void; - /** - * Returns a new Matrix3D object that is an exact copy of the current Matrix3D object. - */ - public clone(): Matrix3D; - /** - * Copies a Vector3D object into specific column of the calling Matrix3D object. - */ - public copyColumnFrom(column: number, vector3D: Vector3D): void; - /** - * Copies specific column of the calling Matrix3D object into the Vector3D object. - */ - public copyColumnTo(column: number, vector3D: Vector3D): void; - /** - * Copies all of the matrix data from the source Matrix3D object into the calling Matrix3D object. - */ - public copyFrom(sourceMatrix3D: Matrix3D): void; - public copyRawDataFrom(vector: number[], index?: number, transpose?: boolean): void; - public copyRawDataTo(vector: number[], index?: number, transpose?: boolean): void; - /** - * Copies a Vector3D object into specific row of the calling Matrix3D object. - */ - public copyRowFrom(row: number, vector3D: Vector3D): void; - /** - * Copies specific row of the calling Matrix3D object into the Vector3D object. - */ - public copyRowTo(row: number, vector3D: Vector3D): void; - /** - * Copies this Matrix3D object into a destination Matrix3D object. - */ - public copyToMatrix3D(dest: Matrix3D): void; - /** - * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector3D objects. - */ - public decompose(orientationStyle?: string): Vector3D[]; - /** - * Uses the transformation matrix without its translation elements to transform a Vector3D object from one space - * coordinate to another. - */ - public deltaTransformVector(v: Vector3D): Vector3D; - /** - * Converts the current matrix to an identity or unit matrix. - */ - public identity(): void; - /** - * [static] Interpolates the translation, rotation, and scale transformation of one matrix toward those of the target matrix. - */ - static interpolate(thisMat: Matrix3D, toMat: Matrix3D, percent: number): Matrix3D; - /** - * Interpolates this matrix towards the translation, rotation, and scale transformations of the target matrix. - */ - public interpolateTo(toMat: Matrix3D, percent: number): void; - /** - * Inverts the current matrix. - */ - public invert(): boolean; - /** - * Prepends a matrix by multiplying the current Matrix3D object by another Matrix3D object. - */ - public prepend(rhs: Matrix3D): void; - /** - * Prepends an incremental rotation to a Matrix3D object. - */ - public prependRotation(degrees: number, axis: Vector3D): void; - /** - * Prepends an incremental scale change along the x, y, and z axes to a Matrix3D object. - */ - public prependScale(xScale: number, yScale: number, zScale: number): void; - /** - * Prepends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. - */ - public prependTranslation(x: number, y: number, z: number): void; - /** - * Sets the transformation matrix's translation, rotation, and scale settings. - */ - public recompose(components: Vector3D[]): boolean; - public transformVector(v: Vector3D): Vector3D; - /** - * Uses the transformation matrix to transform a Vector of Numbers from one coordinate space to another. - */ - public transformVectors(vin: number[], vout: number[]): void; - /** - * Converts the current Matrix3D object to a matrix where the rows and columns are swapped. - */ - public transpose(): void; - static getAxisRotation(x: number, y: number, z: number, degrees: number): Matrix3D; - /** - * [read-only] A Number that determines whether a matrix is invertible. - */ - public determinant : number; - /** - * A Vector3D object that holds the position, the 3D coordinate (x,y,z) of a display object within the - * transformation's frame of reference. - */ - public position : Vector3D; - public toFixed(decimalPlace: number): string; - public toString(): string; - } -} -declare module away.geom { - /** - * away.geom.Matrix3DUtils provides additional Matrix3D functions. - */ - class Matrix3DUtils { - /** - * A reference to a Vector to be used as a temporary raw data container, to prevent object creation. - */ - static RAW_DATA_CONTAINER: number[]; - static CALCULATION_MATRIX: Matrix3D; - /** - * Fills the 3d matrix object with values representing the transformation made by the given quaternion. - * - * @param quarternion The quarterion object to convert. - */ - static quaternion2matrix(quarternion: Quaternion, m?: Matrix3D): Matrix3D; - /** - * Returns a normalised Vector3D object representing the forward vector of the given matrix. - * @param m The Matrix3D object to use to get the forward vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The forward vector - */ - static getForward(m: Matrix3D, v?: Vector3D): Vector3D; - /** - * Returns a normalised Vector3D object representing the up vector of the given matrix. - * @param m The Matrix3D object to use to get the up vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The up vector - */ - static getUp(m: Matrix3D, v?: Vector3D): Vector3D; - /** - * Returns a normalised Vector3D object representing the right vector of the given matrix. - * @param m The Matrix3D object to use to get the right vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The right vector - */ - static getRight(m: Matrix3D, v?: Vector3D): Vector3D; - /** - * Returns a boolean value representing whether there is any significant difference between the two given 3d matrices. - */ - static compare(m1: Matrix3D, m2: Matrix3D): boolean; - static lookAt(matrix: Matrix3D, pos: Vector3D, dir: Vector3D, up: Vector3D): void; - static reflection(plane: Plane3D, target?: Matrix3D): Matrix3D; - static transformVector(matrix: Matrix3D, vector: Vector3D, result?: Vector3D): Vector3D; - static deltaTransformVector(matrix: Matrix3D, vector: Vector3D, result?: Vector3D): Vector3D; - static getTranslation(transform: Matrix3D, result?: Vector3D): Vector3D; - static deltaTransformVectors(matrix: Matrix3D, vin: number[], vout: number[]): void; - } -} -declare module away.geom { - /** - * A Quaternion object which can be used to represent rotations. - */ - class Orientation3D { - static AXIS_ANGLE: string; - static EULER_ANGLES: string; - static QUATERNION: string; - } -} -/** -*

The PerspectiveProjection class provides an easy way to assign or modify -* the perspective transformations of a display object and all of its -* children. For more complex or custom perspective transformations, use the -* Matrix3D class. While the PerspectiveProjection class provides basic -* three-dimensional presentation properties, the Matrix3D class provides more -* detailed control over the three-dimensional presentation of display objects. -*

-* -*

Projection is a way of representing a three-dimensional object in a -* two-dimensional space, like a cube projected onto a computer screen. -* Perspective projection uses a viewing frustum (a rectangular pyramid) to -* model and project a three-dimensional world and its objects on the screen. -* The viewing frustum becomes increasingly wider as it moves further from the -* origin of the viewpoint. The origin of the viewpoint could be a camera or -* the eyes of an observer facing the screen. The projected perspective -* produces the illusion of three dimensions with depth and distance, where -* the objects closer to the screen appear larger than the objects farther -* from the screen.

-* -*

A default PerspectiveProjection object is a framework defined for -* perspective transformation of the root object, based on the field of view -* and aspect ratio (dimensions) of the stage. The projection center, the -* vanishing point, is set to the center of the stage, which means the -* three-dimensional display objects disappear toward the center of the stage -* as they move back in the z axis. The default viewpoint is at point (0,0) -* looking down the positive z axis. The y-axis points down toward the bottom -* of the screen. You can gain access to the root display object's perspective -* projection settings and change the field of view and projection center -* properties of the perspectiveProjection property through the root object's -* DisplayObject.transform property.

-* -*

You can also set a different perspective projection setting for a -* display object through the parent's perspective projection. First, create a -* PerspectiveProjection object and set its fieldOfView and -* projectionCenter properties. Next, assign the -* PerspectiveProjection object to the parent display object using the -* DisplayObject.transform property. The specified projection -* matrix and transformation will then apply to all the display object's -* three-dimensional children.

-* -*

To modify a perspective projection of the stage or root object: use the -* transform.matrix property of the root display object to gain -* access to the PerspectiveProjection object. Or, apply different perspective -* projection properties to a display object by setting the perspective -* projection properties of the display object's parent. The child display -* object inherits the new properties. Specifically, create a -* PerspectiveProjection object and set its properties, then assign the -* PerspectiveProjection object to the perspectiveProjection -* property of the parent display object's transform property. -* The specified projection transformation then applies to all the display -* object's three-dimensional children.

-* -*

Since both PerspectiveProjection and Matrix3D objects perform -* perspective transformations, do not assign both to a display object at the -* same time. Use the PerspectiveProjection object for focal length and -* projection center changes. For more control over the perspective -* transformation, create a perspective projection Matrix3D object.

-*/ -declare module away.geom { - class PerspectiveProjection { - private _matrix3D; - /** - * Specifies an angle, as a degree between 0 and 180, for the field of - * view in three dimensions. This value determines how strong the - * perspective transformation and distortion apply to a - * three-dimensional display object with a non-zero z-coordinate. - * - *

A degree close to 0 means that the screen's two-dimensional x- - * and y-coordinates are roughly the same as the three-dimensional x-, - * y-, and z-coordinates with little or no distortion. In other words, - * for a small angle, a display object moving down the z axis appears - * to stay near the same size and moves little.

- * - *

A value close to 180 degrees results in a fisheye projection effect: - * positions with a z value smaller than 0 are magnified, while - * positions with a z value larger than 0 are minimized. With a large - * angle, a display object moving down the z axis appears to change - * size quickly and moves a great distance. If the field of view is - * set to 0 or 180, nothing is seen on the screen.

- */ - public fieldOfView: number; - /** - * The distance between the eye or the viewpoint's origin (0,0,0) and - * the display object located in the z axis. During the perspective - * transformation, the focalLength is calculated - * dynamically using the angle of the field of view and the stage's - * aspect ratio (stage width divided by stage height). - * - * @see away.geom.PerspectiveProjection#fieldOfView - */ - public focalLength: number; - /** - * A two-dimensional point representing the center of the projection, - * the vanishing point for the display object. - * - *

The projectionCenter property is an offset to the - * default registration point that is the upper left of the stage, - * point (0,0). The default projection transformation center is in the - * middle of the stage, which means the three-dimensional display - * objects disappear toward the center of the stage as they move - * backwards in the z axis.

- */ - public projectionCenter: Point; - /** - * Creates an instance of a PerspectiveProjection object. - */ - constructor(); - /** - * Returns the underlying Matrix3D object of the display object. - * - *

A display object, like the root object, can have a - * PerspectiveProjection object without needing a Matrix3D property - * defined for its transformations. In fact, use either a - * PerspectiveProjection or a Matrix3D object to specify the - * perspective transformation. If when using the PerspectiveProjection - * object, a Matrix3D object was needed, the toMatrix3D() - * method can retrieve the underlying Matrix3D object of the display - * object. For example, the toMatrix3D() method can be - * used with the Utils3D.projectVectors() method.

- * - * @see away.geom.Matrix3D - */ - public toMatrix3D(): Matrix3D; - } -} -declare module away.geom { - class Plane3D { - /** - * The A coefficient of this plane. (Also the x dimension of the plane normal) - */ - public a: number; - /** - * The B coefficient of this plane. (Also the y dimension of the plane normal) - */ - public b: number; - /** - * The C coefficient of this plane. (Also the z dimension of the plane normal) - */ - public c: number; - /** - * The D coefficient of this plane. (Also the inverse dot product between normal and point) - */ - public d: number; - public _iAlignment: number; - static ALIGN_ANY: number; - static ALIGN_XY_AXIS: number; - static ALIGN_YZ_AXIS: number; - static ALIGN_XZ_AXIS: number; - /** - * Create a Plane3D with ABCD coefficients - */ - constructor(a?: number, b?: number, c?: number, d?: number); - /** - * Fills this Plane3D with the coefficients from 3 points in 3d space. - * @param p0 Vector3D - * @param p1 Vector3D - * @param p2 Vector3D - */ - public fromPoints(p0: Vector3D, p1: Vector3D, p2: Vector3D): void; - /** - * Fills this Plane3D with the coefficients from the plane's normal and a point in 3d space. - * @param normal Vector3D - * @param point Vector3D - */ - public fromNormalAndPoint(normal: Vector3D, point: Vector3D): void; - /** - * Normalize this Plane3D - * @return Plane3D This Plane3D. - */ - public normalize(): Plane3D; - /** - * Returns the signed distance between this Plane3D and the point p. - * @param p Vector3D - * @returns Number - */ - public distance(p: Vector3D): number; - /** - * Classify a point against this Plane3D. (in front, back or intersecting) - * @param p Vector3D - * @return int Plane3.FRONT or Plane3D.BACK or Plane3D.INTERSECT - */ - public classifyPoint(p: Vector3D, epsilon?: number): number; - public toString(): string; - } -} -declare module away.geom { - class PlaneClassification { - static BACK: number; - static FRONT: number; - static IN: number; - static OUT: number; - static INTERSECT: number; - } -} -/** -* The Point object represents a location in a two-dimensional coordinate -* system, where x represents the horizontal axis and y -* represents the vertical axis. -* -*

The following code creates a point at(0,0):

-* -*

Methods and properties of the following classes use Point objects:

-* -*
    -*
  • BitmapData
  • -*
  • DisplayObject
  • -*
  • DisplayObjectContainer
  • -*
  • DisplacementMapFilter
  • -*
  • NativeWindow
  • -*
  • Matrix
  • -*
  • Rectangle
  • -*
-* -*

You can use the new Point() constructor to create a Point -* object.

-*/ -declare module away.geom { - class Point { - /** - * The horizontal coordinate of the point. The default value is 0. - */ - public x: number; - /** - * The vertical coordinate of the point. The default value is 0. - */ - public y: number; - /** - * The length of the line segment from(0,0) to this point. - */ - public length : number; - /** - * Creates a new point. If you pass no parameters to this method, a point is - * created at(0,0). - * - * @param x The horizontal coordinate. - * @param y The vertical coordinate. - */ - constructor(x?: number, y?: number); - /** - * Adds the coordinates of another point to the coordinates of this point to - * create a new point. - * - * @param v The point to be added. - * @return The new point. - */ - public add(v: Point): Point; - /** - * Creates a copy of this Point object. - * - * @return The new Point object. - */ - public clone(): Point; - public copyFrom(sourcePoint: Point): void; - /** - * Determines whether two points are equal. Two points are equal if they have - * the same x and y values. - * - * @param toCompare The point to be compared. - * @return A value of true if the object is equal to this Point - * object; false if it is not equal. - */ - public equals(toCompare: Point): boolean; - /** - * Scales the line segment between(0,0) and the current point to a set - * length. - * - * @param thickness The scaling value. For example, if the current point is - * (0,5), and you normalize it to 1, the point returned is - * at(0,1). - */ - public normalize(thickness?: number): void; - /** - * Offsets the Point object by the specified amount. The value of - * dx is added to the original value of x to create the - * new x value. The value of dy is added to the original - * value of y to create the new y value. - * - * @param dx The amount by which to offset the horizontal coordinate, - * x. - * @param dy The amount by which to offset the vertical coordinate, y. - */ - public offset(dx: number, dy: number): void; - public setTo(xa: number, ya: number): void; - /** - * Subtracts the coordinates of another point from the coordinates of this - * point to create a new point. - * - * @param v The point to be subtracted. - * @return The new point. - */ - public subtract(v: Point): Point; - /** - * Returns a string that contains the values of the x and y - * coordinates. The string has the form "(x=x, - * y=y)", so calling the toString() method for a - * point at 23,17 would return "(x=23, y=17)". - * - * @return The string representation of the coordinates. - */ - public toString(): string; - /** - * Returns the distance between pt1 and pt2. - * - * @param pt1 The first point. - * @param pt2 The second point. - * @return The distance between the first and second points. - */ - static distance(pt1: Point, pt2: Point): number; - /** - * Determines a point between two specified points. The parameter - * f determines where the new interpolated point is located - * relative to the two end points specified by parameters pt1 - * and pt2. The closer the value of the parameter f - * is to 1.0, the closer the interpolated point is to the first - * point(parameter pt1). The closer the value of the parameter - * f is to 0, the closer the interpolated point is to the second - * point(parameter pt2). - * - * @param pt1 The first point. - * @param pt2 The second point. - * @param f The level of interpolation between the two points. Indicates - * where the new point will be, along the line between - * pt1 and pt2. If f=1, - * pt1 is returned; if f=0, - * pt2 is returned. - * @return The new, interpolated point. - */ - static interpolate(pt1: Point, pt2: Point, f: number): Point; - /** - * Converts a pair of polar coordinates to a Cartesian point coordinate. - * - * @param len The length coordinate of the polar pair. - * @param angle The angle, in radians, of the polar pair. - * @return The Cartesian point. - */ - static polar(len: number, angle: number): Point; - } -} -declare module away.geom { - class PoissonLookup { - static _distributions: number[][]; - static initDistributions(): void; - static getDistribution(n: number): number[]; - } -} -declare module away.geom { - /** - * A Quaternion object which can be used to represent rotations. - */ - class Quaternion { - /** - * The x value of the quaternion. - */ - public x: number; - /** - * The y value of the quaternion. - */ - public y: number; - /** - * The z value of the quaternion. - */ - public z: number; - /** - * The w value of the quaternion. - */ - public w: number; - /** - * Creates a new Quaternion object. - * @param x The x value of the quaternion. - * @param y The y value of the quaternion. - * @param z The z value of the quaternion. - * @param w The w value of the quaternion. - */ - constructor(x?: number, y?: number, z?: number, w?: number); - /** - * Returns the magnitude of the quaternion object. - */ - public magnitude : number; - /** - * Fills the quaternion object with the result from a multiplication of two quaternion objects. - * - * @param qa The first quaternion in the multiplication. - * @param qb The second quaternion in the multiplication. - */ - public multiply(qa: Quaternion, qb: Quaternion): void; - public multiplyVector(vector: Vector3D, target?: Quaternion): Quaternion; - /** - * Fills the quaternion object with values representing the given rotation around a vector. - * - * @param axis The axis around which to rotate - * @param angle The angle in radians of the rotation. - */ - public fromAxisAngle(axis: Vector3D, angle: number): void; - /** - * Spherically interpolates between two quaternions, providing an interpolation between rotations with constant angle change rate. - * @param qa The first quaternion to interpolate. - * @param qb The second quaternion to interpolate. - * @param t The interpolation weight, a value between 0 and 1. - */ - public slerp(qa: Quaternion, qb: Quaternion, t: number): void; - /** - * Linearly interpolates between two quaternions. - * @param qa The first quaternion to interpolate. - * @param qb The second quaternion to interpolate. - * @param t The interpolation weight, a value between 0 and 1. - */ - public lerp(qa: Quaternion, qb: Quaternion, t: number): void; - /** - * Fills the quaternion object with values representing the given euler rotation. - * - * @param ax The angle in radians of the rotation around the ax axis. - * @param ay The angle in radians of the rotation around the ay axis. - * @param az The angle in radians of the rotation around the az axis. - */ - public fromEulerAngles(ax: number, ay: number, az: number): void; - /** - * Fills a target Vector3D object with the Euler angles that form the rotation represented by this quaternion. - * @param target An optional Vector3D object to contain the Euler angles. If not provided, a new object is created. - * @return The Vector3D containing the Euler angles. - */ - public toEulerAngles(target?: Vector3D): Vector3D; - /** - * Normalises the quaternion object. - */ - public normalize(val?: number): void; - /** - * Used to trace the values of a quaternion. - * - * @return A string representation of the quaternion object. - */ - public toString(): string; - /** - * Converts the quaternion to a Matrix3D object representing an equivalent rotation. - * @param target An optional Matrix3D container to store the transformation in. If not provided, a new object is created. - * @return A Matrix3D object representing an equivalent rotation. - */ - public toMatrix3D(target?: Matrix3D): Matrix3D; - /** - * Extracts a quaternion rotation matrix out of a given Matrix3D object. - * @param matrix The Matrix3D out of which the rotation will be extracted. - */ - public fromMatrix(matrix: Matrix3D): void; - /** - * Converts the quaternion to a Vector.<Number> matrix representation of a rotation equivalent to this quaternion. - * @param target The Vector.<Number> to contain the raw matrix data. - * @param exclude4thRow If true, the last row will be omitted, and a 4x3 matrix will be generated instead of a 4x4. - */ - public toRawData(target: number[], exclude4thRow?: boolean): void; - /** - * Clones the quaternion. - * @return An exact duplicate of the current Quaternion. - */ - public clone(): Quaternion; - /** - * Rotates a point. - * @param vector The Vector3D object to be rotated. - * @param target An optional Vector3D object that will contain the rotated coordinates. If not provided, a new object will be created. - * @return A Vector3D object containing the rotated point. - */ - public rotatePoint(vector: Vector3D, target?: Vector3D): Vector3D; - /** - * Copies the data from a quaternion into this instance. - * @param q The quaternion to copy from. - */ - public copyFrom(q: Quaternion): void; - } -} -/** -* A Rectangle object is an area defined by its position, as indicated by its -* top-left corner point(x, y) and by its width and its height. -* -* -*

The x, y, width, and -* height properties of the Rectangle class are independent of -* each other; changing the value of one property has no effect on the others. -* However, the right and bottom properties are -* integrally related to those four properties. For example, if you change the -* value of the right property, the value of the -* width property changes; if you change the bottom -* property, the value of the height property changes.

-* -*

The following methods and properties use Rectangle objects:

-* -*
    -*
  • The applyFilter(), colorTransform(), -* copyChannel(), copyPixels(), draw(), -* fillRect(), generateFilterRect(), -* getColorBoundsRect(), getPixels(), -* merge(), paletteMap(), -* pixelDisolve(), setPixels(), and -* threshold() methods, and the rect property of the -* BitmapData class
  • -*
  • The getBounds() and getRect() methods, and -* the scrollRect and scale9Grid properties of the -* DisplayObject class
  • -*
  • The getCharBoundaries() method of the TextField -* class
  • -*
  • The pixelBounds property of the Transform class
  • -*
  • The bounds parameter for the startDrag() -* method of the Sprite class
  • -*
  • The printArea parameter of the addPage() -* method of the PrintJob class
  • -*
-* -*

You can use the new Rectangle() constructor to create a -* Rectangle object.

-* -*

Note: The Rectangle class does not define a rectangular Shape -* display object. To draw a rectangular Shape object onscreen, use the -* drawRect() method of the Graphics class.

-*/ -declare module away.geom { - class Rectangle { - private _size; - private _bottomRight; - private _topLeft; - /** - * The height of the rectangle, in pixels. Changing the height - * value of a Rectangle object has no effect on the x, - * y, and width properties. - */ - public height: number; - /** - * The width of the rectangle, in pixels. Changing the width - * value of a Rectangle object has no effect on the x, - * y, and height properties. - */ - public width: number; - /** - * The x coordinate of the top-left corner of the rectangle. Changing - * the value of the x property of a Rectangle object has no - * effect on the y, width, and height - * properties. - * - *

The value of the x property is equal to the value of the - * left property.

- */ - public x: number; - /** - * The y coordinate of the top-left corner of the rectangle. Changing - * the value of the y property of a Rectangle object has no - * effect on the x, width, and height - * properties. - * - *

The value of the y property is equal to the value of the - * top property.

- */ - public y: number; - /** - * The sum of the y and height properties. - */ - public bottom : number; - /** - * The location of the Rectangle object's bottom-right corner, determined by - * the values of the right and bottom properties. - */ - public bottomRight : Point; - /** - * The x coordinate of the top-left corner of the rectangle. Changing - * the left property of a Rectangle object has no effect on the - * y and height properties. However it does affect - * the width property, whereas changing the x value - * does not affect the width property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - public left : number; - /** - * The sum of the x and width properties. - */ - public right : number; - /** - * The size of the Rectangle object, expressed as a Point object with the - * values of the width and height properties. - */ - public size : Point; - /** - * The y coordinate of the top-left corner of the rectangle. Changing - * the top property of a Rectangle object has no effect on the - * x and width properties. However it does affect - * the height property, whereas changing the y - * value does not affect the height property. - * - *

The value of the top property is equal to the value of the - * y property.

- */ - public top : number; - /** - * The location of the Rectangle object's top-left corner, determined by the - * x and y coordinates of the point. - */ - public topLeft : Point; - /** - * Creates a new Rectangle object with the top-left corner specified by the - * x and y parameters and with the specified - * width and height parameters. If you call this - * public without parameters, a rectangle with x, - * y, width, and height properties set - * to 0 is created. - * - * @param x The x coordinate of the top-left corner of the - * rectangle. - * @param y The y coordinate of the top-left corner of the - * rectangle. - * @param width The width of the rectangle, in pixels. - * @param height The height of the rectangle, in pixels. - */ - constructor(x?: number, y?: number, width?: number, height?: number); - /** - * Returns a new Rectangle object with the same values for the - * x, y, width, and - * height properties as the original Rectangle object. - * - * @return A new Rectangle object with the same values for the - * x, y, width, and - * height properties as the original Rectangle object. - */ - public clone(): Rectangle; - /** - * Determines whether the specified point is contained within the rectangular - * region defined by this Rectangle object. - * - * @param x The x coordinate(horizontal position) of the point. - * @param y The y coordinate(vertical position) of the point. - * @return A value of true if the Rectangle object contains the - * specified point; otherwise false. - */ - public contains(x: number, y: number): boolean; - /** - * Determines whether the specified point is contained within the rectangular - * region defined by this Rectangle object. This method is similar to the - * Rectangle.contains() method, except that it takes a Point - * object as a parameter. - * - * @param point The point, as represented by its x and y - * coordinates. - * @return A value of true if the Rectangle object contains the - * specified point; otherwise false. - */ - public containsPoint(point: Point): boolean; - /** - * Determines whether the Rectangle object specified by the rect - * parameter is contained within this Rectangle object. A Rectangle object is - * said to contain another if the second Rectangle object falls entirely - * within the boundaries of the first. - * - * @param rect The Rectangle object being checked. - * @return A value of true if the Rectangle object that you - * specify is contained by this Rectangle object; otherwise - * false. - */ - public containsRect(rect: Rectangle): boolean; - /** - * Copies all of rectangle data from the source Rectangle object into the - * calling Rectangle object. - * - * @param sourceRect The Rectangle object from which to copy the data. - */ - public copyFrom(sourceRect: Rectangle): void; - /** - * Determines whether the object specified in the toCompare - * parameter is equal to this Rectangle object. This method compares the - * x, y, width, and - * height properties of an object against the same properties of - * this Rectangle object. - * - * @param toCompare The rectangle to compare to this Rectangle object. - * @return A value of true if the object has exactly the same - * values for the x, y, width, - * and height properties as this Rectangle object; - * otherwise false. - */ - public equals(toCompare: Rectangle): boolean; - /** - * Increases the size of the Rectangle object by the specified amounts, in - * pixels. The center point of the Rectangle object stays the same, and its - * size increases to the left and right by the dx value, and to - * the top and the bottom by the dy value. - * - * @param dx The value to be added to the left and the right of the Rectangle - * object. The following equation is used to calculate the new - * width and position of the rectangle: - * @param dy The value to be added to the top and the bottom of the - * Rectangle. The following equation is used to calculate the new - * height and position of the rectangle: - */ - public inflate(dx: number, dy: number): void; - /** - * Increases the size of the Rectangle object. This method is similar to the - * Rectangle.inflate() method except it takes a Point object as - * a parameter. - * - *

The following two code examples give the same result:

- * - * @param point The x property of this Point object is used to - * increase the horizontal dimension of the Rectangle object. - * The y property is used to increase the vertical - * dimension of the Rectangle object. - */ - public inflatePoint(point: Point): void; - /** - * If the Rectangle object specified in the toIntersect - * parameter intersects with this Rectangle object, returns the area of - * intersection as a Rectangle object. If the rectangles do not intersect, - * this method returns an empty Rectangle object with its properties set to - * 0. - * - * @param toIntersect The Rectangle object to compare against to see if it - * intersects with this Rectangle object. - * @return A Rectangle object that equals the area of intersection. If the - * rectangles do not intersect, this method returns an empty - * Rectangle object; that is, a rectangle with its x, - * y, width, and height - * properties set to 0. - */ - public intersection(toIntersect: Rectangle): Rectangle; - /** - * Determines whether the object specified in the toIntersect - * parameter intersects with this Rectangle object. This method checks the - * x, y, width, and - * height properties of the specified Rectangle object to see if - * it intersects with this Rectangle object. - * - * @param toIntersect The Rectangle object to compare against this Rectangle - * object. - * @return A value of true if the specified object intersects - * with this Rectangle object; otherwise false. - */ - public intersects(toIntersect: Rectangle): boolean; - /** - * Determines whether or not this Rectangle object is empty. - * - * @return A value of true if the Rectangle object's width or - * height is less than or equal to 0; otherwise false. - */ - public isEmpty(): boolean; - /** - * Adjusts the location of the Rectangle object, as determined by its - * top-left corner, by the specified amounts. - * - * @param dx Moves the x value of the Rectangle object by this amount. - * @param dy Moves the y value of the Rectangle object by this amount. - */ - public offset(dx: number, dy: number): void; - /** - * Adjusts the location of the Rectangle object using a Point object as a - * parameter. This method is similar to the Rectangle.offset() - * method, except that it takes a Point object as a parameter. - * - * @param point A Point object to use to offset this Rectangle object. - */ - public offsetPoint(point: Point): void; - /** - * Sets all of the Rectangle object's properties to 0. A Rectangle object is - * empty if its width or height is less than or equal to 0. - * - *

This method sets the values of the x, y, - * width, and height properties to 0.

- * - */ - public setEmpty(): void; - /** - * Sets the members of Rectangle to the specified values - * - * @param xa The x coordinate of the top-left corner of the - * rectangle. - * @param ya The y coordinate of the top-left corner of the - * rectangle. - * @param widtha The width of the rectangle, in pixels. - * @param heighta The height of the rectangle, in pixels. - */ - public setTo(xa: number, ya: number, widtha: number, heighta: number): void; - /** - * Builds and returns a string that lists the horizontal and vertical - * positions and the width and height of the Rectangle object. - * - * @return A string listing the value of each of the following properties of - * the Rectangle object: x, y, - * width, and height. - */ - public toString(): string; - /** - * Adds two rectangles together to create a new Rectangle object, by filling - * in the horizontal and vertical space between the two rectangles. - * - *

Note: The union() method ignores rectangles with - * 0 as the height or width value, such as: var - * rect2:Rectangle = new Rectangle(300,300,50,0);

- * - * @param toUnion A Rectangle object to add to this Rectangle object. - * @return A new Rectangle object that is the union of the two rectangles. - */ - public union(toUnion: Rectangle): Rectangle; - } -} -/** -* The Transform class provides access to color adjustment properties and two- -* or three-dimensional transformation objects that can be applied to a -* display object. During the transformation, the color or the orientation and -* position of a display object is adjusted(offset) from the current values -* or coordinates to new values or coordinates. The Transform class also -* collects data about color and two-dimensional matrix transformations that -* are applied to a display object and all of its parent objects. You can -* access these combined transformations through the -* concatenatedColorTransform and concatenatedMatrix -* properties. -* -*

To apply color transformations: create a ColorTransform object, set the -* color adjustments using the object's methods and properties, and then -* assign the colorTransformation property of the -* transform property of the display object to the new -* ColorTransformation object.

-* -*

To apply two-dimensional transformations: create a Matrix object, set -* the matrix's two-dimensional transformation, and then assign the -* transform.matrix property of the display object to the new -* Matrix object.

-* -*

To apply three-dimensional transformations: start with a -* three-dimensional display object. A three-dimensional display object has a -* z property value other than zero. You do not need to create -* the Matrix3D object. For all three-dimensional objects, a Matrix3D object -* is created automatically when you assign a z value to a -* display object. You can access the display object's Matrix3D object through -* the display object's transform property. Using the methods of -* the Matrix3D class, you can add to or modify the existing transformation -* settings. Also, you can create a custom Matrix3D object, set the custom -* Matrix3D object's transformation elements, and then assign the new Matrix3D -* object to the display object using the transform.matrix -* property.

-* -*

To modify a perspective projection of the stage or root object: use the -* transform.matrix property of the root display object to gain -* access to the PerspectiveProjection object. Or, apply different perspective -* projection properties to a display object by setting the perspective -* projection properties of the display object's parent. The child display -* object inherits the new properties. Specifically, create a -* PerspectiveProjection object and set its properties, then assign the -* PerspectiveProjection object to the perspectiveProjection -* property of the parent display object's transform property. -* The specified projection transformation then applies to all the display -* object's three-dimensional children.

-* -*

Since both PerspectiveProjection and Matrix3D objects perform -* perspective transformations, do not assign both to a display object at the -* same time. Use the PerspectiveProjection object for focal length and -* projection center changes. For more control over the perspective -* transformation, create a perspective projection Matrix3D object.

-*/ -declare module away.geom { - class Transform { - private _displayObject; - private _concatenatedColorTransform; - private _concatenatedMatrix; - private _pixelBounds; - public _position: Vector3D; - /** - * - */ - public backVector : Vector3D; - /** - * A ColorTransform object containing values that universally adjust the - * colors in the display object. - * - * @throws TypeError The colorTransform is null when being set - */ - public colorTransform: ColorTransform; - /** - * A ColorTransform object representing the combined color transformations - * applied to the display object and all of its parent objects, back to the - * root level. If different color transformations have been applied at - * different levels, all of those transformations are concatenated into one - * ColorTransform object for this property. - */ - public concatenatedColorTransform : ColorTransform; - /** - * A Matrix object representing the combined transformation matrixes of the - * display object and all of its parent objects, back to the root level. If - * different transformation matrixes have been applied at different levels, - * all of those matrixes are concatenated into one matrix for this property. - * Also, for resizeable SWF content running in the browser, this property - * factors in the difference between stage coordinates and window coordinates - * due to window resizing. Thus, the property converts local coordinates to - * window coordinates, which may not be the same coordinate space as that of - * the Stage. - */ - public concatenatedMatrix : Matrix; - /** - * - */ - public downVector : Vector3D; - /** - * - */ - public forwardVector : Vector3D; - /** - * - */ - public leftVector : Vector3D; - /** - * A Matrix object containing values that alter the scaling, rotation, and - * translation of the display object. - * - *

If the matrix property is set to a value(not - * null), the matrix3D property is - * null. And if the matrix3D property is set to a - * value(not null), the matrix property is - * null.

- * - * @throws TypeError The matrix is null when being set - */ - public matrix: Matrix; - /** - * Provides access to the Matrix3D object of a three-dimensional display - * object. The Matrix3D object represents a transformation matrix that - * determines the display object's position and orientation. A Matrix3D - * object can also perform perspective projection. - * - *

If the matrix property is set to a value(not - * null), the matrix3D property is - * null. And if the matrix3D property is set to a - * value(not null), the matrix property is - * null.

- */ - public matrix3D : Matrix3D; - /** - * Provides access to the PerspectiveProjection object of a three-dimensional - * display object. The PerspectiveProjection object can be used to modify the - * perspective transformation of the stage or to assign a perspective - * transformation to all the three-dimensional children of a display object. - * - *

Based on the field of view and aspect ratio(dimensions) of the stage, - * a default PerspectiveProjection object is assigned to the root object.

- */ - public perspectiveProjection: PerspectiveProjection; - /** - * A Rectangle object that defines the bounding rectangle of the display - * object on the stage. - */ - public pixelBounds : Rectangle; - /** - * Defines the position of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - public position : Vector3D; - /** - * - */ - public rightVector : Vector3D; - /** - * Defines the rotation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - public rotation : Vector3D; - /** - * Defines the scale of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - public scale : Vector3D; - /** - * - */ - public upVector : Vector3D; - constructor(displayObject: base.DisplayObject); - /** - * Returns a Matrix3D object, which can transform the space of a specified - * display object in relation to the current display object's space. You can - * use the getRelativeMatrix3D() method to move one - * three-dimensional display object relative to another three-dimensional - * display object. - * - * @param relativeTo The display object relative to which the transformation - * occurs. To get a Matrix3D object relative to the stage, - * set the parameter to the root or - * stage object. To get the world-relative - * matrix of the display object, set the parameter to a - * display object that has a perspective transformation - * applied to it. - * @return A Matrix3D object that can be used to transform the space from the - * relativeTo display object to the current display - * object space. - */ - public getRelativeMatrix3D(relativeTo: base.DisplayObject): Matrix3D; - /** - * Moves the 3d object forwards along it's local z axis - * - * @param distance The length of the movement - */ - public moveForward(distance: number): void; - /** - * Moves the 3d object backwards along it's local z axis - * - * @param distance The length of the movement - */ - public moveBackward(distance: number): void; - /** - * Moves the 3d object backwards along it's local x axis - * - * @param distance The length of the movement - */ - public moveLeft(distance: number): void; - /** - * Moves the 3d object forwards along it's local x axis - * - * @param distance The length of the movement - */ - public moveRight(distance: number): void; - /** - * Moves the 3d object forwards along it's local y axis - * - * @param distance The length of the movement - */ - public moveUp(distance: number): void; - /** - * Moves the 3d object backwards along it's local y axis - * - * @param distance The length of the movement - */ - public moveDown(distance: number): void; - } -} -declare module away.geom { - class UVTransform { - private _uvMatrix; - private _uvMatrixDirty; - private _rotation; - private _scaleU; - private _scaleV; - private _offsetU; - private _offsetV; - /** - * - */ - public offsetU : number; - /** - * - */ - public offsetV : number; - /** - * - */ - public rotation : number; - /** - * - */ - public scaleU : number; - /** - * - */ - public scaleV : number; - /** - * - */ - public matrix : Matrix; - constructor(); - /** - * @private - */ - private updateUVMatrix(); - } -} -/** -* The Vector3D class represents a point or a location in the three-dimensional -* space using the Cartesian coordinates x, y, and z. As in a two-dimensional -* space, the x property represents the horizontal axis and the y property -* represents the vertical axis. In three-dimensional space, the z property -* represents depth. The value of the x property increases as the object moves -* to the right. The value of the y property increases as the object moves -* down. The z property increases as the object moves farther from the point -* of view. Using perspective projection and scaling, the object is seen to be -* bigger when near and smaller when farther away from the screen. As in a -* right-handed three-dimensional coordinate system, the positive z-axis points -* away from the viewer and the value of the z property increases as the object -* moves away from the viewer's eye. The origin point (0,0,0) of the global -* space is the upper-left corner of the stage. -* -*

The Vector3D class can also represent a direction, an arrow pointing from -* the origin of the coordinates, such as (0,0,0), to an endpoint; or a -* floating-point component of an RGB (Red, Green, Blue) color model.

-* -*

Quaternion notation introduces a fourth element, the w property, which -* provides additional orientation information. For example, the w property can -* define an angle of rotation of a Vector3D object. The combination of the -* angle of rotation and the coordinates x, y, and z can determine the display -* object's orientation. Here is a representation of Vector3D elements in -* matrix notation:

-*/ -declare module away.geom { - class Vector3D { - /** - * The x axis defined as a Vector3D object with coordinates (1,0,0). - */ - static X_AXIS: Vector3D; - /** - * The y axis defined as a Vector3D object with coordinates (0,1,0). - */ - static Y_AXIS: Vector3D; - /** - * The z axis defined as a Vector3D object with coordinates (0,0,1). - */ - static Z_AXIS: Vector3D; - /** - * The first element of a Vector3D object, such as the x coordinate of - * a point in the three-dimensional space. The default value is 0. - */ - public x: number; - public y: number; - /** - * The third element of a Vector3D object, such as the y coordinate of - * a point in the three-dimensional space. The default value is 0. - */ - public z: number; - /** - * TThe fourth element of a Vector3D object (in addition to the x, y, - * and z properties) can hold data such as the angle of rotation. The - * default value is 0. - * - *

Quaternion notation employs an angle as the fourth element in - * its calculation of three-dimensional rotation. The w property can - * be used to define the angle of rotation about the Vector3D object. - * The combination of the rotation angle and the coordinates (x,y,z) - * determines the display object's orientation.

- * - *

In addition, the w property can be used as a perspective warp - * factor for a projected three-dimensional position or as a projection - * transform value in representing a three-dimensional coordinate - * projected into the two-dimensional space. For example, you can - * create a projection matrix using the Matrix3D.rawData - * property, that, when applied to a Vector3D object, produces a - * transform value in the Vector3D object's fourth element (the w - * property). Dividing the Vector3D object's other elements by the - * transform value then produces a projected Vector3D object. You can - * use the Vector3D.project() method to divide the first - * three elements of a Vector3D object by its fourth element.

- */ - public w: number; - /** - * The length, magnitude, of the current Vector3D object from the - * origin (0,0,0) to the object's x, y, and z coordinates. The w - * property is ignored. A unit vector has a length or magnitude of - * one. - */ - public length : number; - /** - * The square of the length of the current Vector3D object, calculated - * using the x, y, and z properties. The w property is ignored. Use the - * lengthSquared() method whenever possible instead of the - * slower Math.sqrt() method call of the - * Vector3D.length() method. - */ - public lengthSquared : number; - /** - * Creates an instance of a Vector3D object. If you do not specify a - * parameter for the constructor, a Vector3D object is created with - * the elements (0,0,0,0). - * - * @param x The first element, such as the x coordinate. - * @param y The second element, such as the y coordinate. - * @param z The third element, such as the z coordinate. - * @param w An optional element for additional data such as the angle - * of rotation. - */ - constructor(x?: number, y?: number, z?: number, w?: number); - /** - * Adds the value of the x, y, and z elements of the current Vector3D - * object to the values of the x, y, and z elements of another Vector3D - * object. The add() method does not change the current - * Vector3D object. Instead, it returns a new Vector3D object with - * the new values. - * - *

The result of adding two vectors together is a resultant vector. - * One way to visualize the result is by drawing a vector from the - * origin or tail of the first vector to the end or head of the second - * vector. The resultant vector is the distance between the origin - * point of the first vector and the end point of the second vector. - *

- */ - public add(a: Vector3D): Vector3D; - /** - * Returns the angle in radians between two vectors. The returned angle - * is the smallest radian the first Vector3D object rotates until it - * aligns with the second Vector3D object. - * - *

The angleBetween() method is a static method. You - * can use it directly as a method of the Vector3D class.

- * - *

To convert a degree to a radian, you can use the following - * formula:

- * - *

radian = Math.PI/180 * degree

- * - * @param a The first Vector3D object. - * @param b The second Vector3D object. - * @returns The angle between two Vector3D objects. - */ - static angleBetween(a: Vector3D, b: Vector3D): number; - /** - * Returns a new Vector3D object that is an exact copy of the current - * Vector3D object. - * - * @returns A new Vector3D object that is a copy of the current - * Vector3D object. - */ - public clone(): Vector3D; - /** - * Copies all of vector data from the source Vector3D object into the - * calling Vector3D object. - * - * @param src The Vector3D object from which to copy the data. - */ - public copyFrom(src: Vector3D): void; - /** - * Returns a new Vector3D object that is perpendicular (at a right - * angle) to the current Vector3D and another Vector3D object. If the - * returned Vector3D object's coordinates are (0,0,0), then the two - * Vector3D objects are parallel to each other. - * - *

You can use the normalized cross product of two vertices of a - * polygon surface with the normalized vector of the camera or eye - * viewpoint to get a dot product. The value of the dot product can - * identify whether a surface of a three-dimensional object is hidden - * from the viewpoint.

- * - * @param a A second Vector3D object. - * @returns A new Vector3D object that is perpendicular to the current - * Vector3D object and the Vector3D object specified as the - * parameter. - */ - public crossProduct(a: Vector3D): Vector3D; - /** - * Decrements the value of the x, y, and z elements of the current - * Vector3D object by the values of the x, y, and z elements of - * specified Vector3D object. Unlike the - * Vector3D.subtract() method, the - * decrementBy() method changes the current Vector3D - * object and does not return a new Vector3D object. - * - * @param a The Vector3D object containing the values to subtract from - * the current Vector3D object. - */ - public decrementBy(a: Vector3D): void; - /** - * Returns the distance between two Vector3D objects. The - * distance() method is a static method. You can use it - * directly as a method of the Vector3D class to get the Euclidean - * distance between two three-dimensional points. - * - * @param pt1 A Vector3D object as the first three-dimensional point. - * @param pt2 A Vector3D object as the second three-dimensional point. - * @returns The distance between two Vector3D objects. - */ - static distance(pt1: Vector3D, pt2: Vector3D): number; - /** - * If the current Vector3D object and the one specified as the - * parameter are unit vertices, this method returns the cosine of the - * angle between the two vertices. Unit vertices are vertices that - * point to the same direction but their length is one. They remove the - * length of the vector as a factor in the result. You can use the - * normalize() method to convert a vector to a unit - * vector. - * - *

The dotProduct() method finds the angle between two - * vertices. It is also used in backface culling or lighting - * calculations. Backface culling is a procedure for determining which - * surfaces are hidden from the viewpoint. You can use the normalized - * vertices from the camera, or eye, viewpoint and the cross product of - * the vertices of a polygon surface to get the dot product. If the dot - * product is less than zero, then the surface is facing the camera or - * the viewer. If the two unit vertices are perpendicular to each - * other, they are orthogonal and the dot product is zero. If the two - * vertices are parallel to each other, the dot product is one.

- * - * @param a The second Vector3D object. - * @returns A scalar which is the dot product of the current Vector3D - * object and the specified Vector3D object. - * - * @see away.geom.Vector3D#crossProduct() - * @see away.geom.Vector3D#normalize() - */ - public dotProduct(a: Vector3D): number; - /** - * Determines whether two Vector3D objects are equal by comparing the - * x, y, and z elements of the current Vector3D object with a - * specified Vector3D object. If the values of these elements are the - * same, the two Vector3D objects are equal. If the second optional - * parameter is set to true, all four elements of the Vector3D objects, - * including the w property, are compared. - */ - /** - * - * @param toCompare The Vector3D object to be compared with the current - * Vector3D object. - * @param allFour An optional parameter that specifies whether the w - * property of the Vector3D objects is used in the - * comparison. - * @returns A value of true if the specified Vector3D object is equal - * to the current Vector3D object; false if it is not equal. - */ - public equals(toCompare: Vector3D, allFour?: boolean): boolean; - /** - * Increments the value of the x, y, and z elements of the current - * Vector3D object by the values of the x, y, and z elements of a - * specified Vector3D object. Unlike the Vector3D.add() - * method, the incrementBy() method changes the current - * Vector3D object and does not return a new Vector3D object. - * - * @param a The Vector3D object to be added to the current Vector3D - * object. - */ - public incrementBy(a: Vector3D): void; - /** - * Compares the elements of the current Vector3D object with the - * elements of a specified Vector3D object to determine whether they - * are nearly equal. The two Vector3D objects are nearly equal if the - * value of all the elements of the two vertices are equal, or the - * result of the comparison is within the tolerance range. The - * difference between two elements must be less than the number - * specified as the tolerance parameter. If the third optional - * parameter is set to true, all four elements of the - * Vector3D objects, including the w property, are - * compared. Otherwise, only the x, y, and z elements are included in - * the comparison. - */ - /** - * - * @param toCompare The Vector3D object to be compared with the current - * Vector3D object. - * @param tolerance A number determining the tolerance factor. If the - * difference between the values of the Vector3D - * element specified in the toCompare parameter and - * the current Vector3D element is less than the - * tolerance number, the two values are considered - * nearly equal. - * @param allFour An optional parameter that specifies whether the w - * property of the Vector3D objects is used in the - * comparison. - * @returns A value of true if the specified Vector3D object is nearly - * equal to the current Vector3D object; false if it is not - * equal. - * - * @see away.geom.Vector3D#equals() - */ - public nearEquals(toCompare: Vector3D, tolerance: number, allFour?: boolean): boolean; - /** - * Sets the current Vector3D object to its inverse. The inverse object - * is also considered the opposite of the original object. The value of - * the x, y, and z properties of the current Vector3D object is changed - * to -x, -y, and -z. - */ - public negate(): void; - /** - * Converts a Vector3D object to a unit vector by dividing the first - * three elements (x, y, z) by the length of the vector. Unit vertices - * are vertices that have a direction but their length is one. They - * simplify vector calculations by removing length as a factor. - */ - /** - * Scales the line segment between(0,0) and the current point to a set - * length. - * - * @param thickness The scaling value. For example, if the current - * Vector3D object is (0,3,4), and you normalize it to - * 1, the point returned is at(0,0.6,0.8). - */ - public normalize(thickness?: number): void; - /** - * Divides the value of the x, y, and - * z properties of the current Vector3D object by the - * value of its w property. - * - *

If the current Vector3D object is the result of multiplying a - * Vector3D object by a projection Matrix3D object, the w property can - * hold the transform value. The project() method then can - * complete the projection by dividing the elements by the - * w property. Use the Matrix3D.rawData - * property to create a projection Matrix3D object.

- */ - public project(): void; - /** - * Scales the current Vector3D object by a scalar, a magnitude. The - * Vector3D object's x, y, and z elements are multiplied by the scalar - * number specified in the parameter. For example, if the vector is - * scaled by ten, the result is a vector that is ten times longer. The - * scalar can also change the direction of the vector. Multiplying the - * vector by a negative number reverses its direction. - * - * @param s A multiplier (scalar) used to scale a Vector3D object. - - */ - public scaleBy(s: number): void; - /** - * Sets the members of Vector3D to the specified values - * - * @param xa The first element, such as the x coordinate. - * @param ya The second element, such as the y coordinate. - * @param za The third element, such as the z coordinate. - */ - public setTo(xa: number, ya: number, za: number): void; - /** - * Subtracts the value of the x, y, and z elements of the current - * Vector3D object from the values of the x, y, and z elements of - * another Vector3D object. The subtract() method does not - * change the current Vector3D object. Instead, this method returns a - * new Vector3D object with the new values. - * - * @param a The Vector3D object to be subtracted from the current - * Vector3D object. - * @returns A new Vector3D object that is the difference between the - * current Vector3D and the specified Vector3D object. - * - * @see away.geom.Vector3D#decrementBy() - */ - public subtract(a: Vector3D): Vector3D; - /** - * Returns a string representation of the current Vector3D object. The - * string contains the values of the x, y, and z properties. - */ - public toString(): string; - } -} -declare module away.bounds { - class BoundingVolumeBase { - public _aabb: geom.Box; - public _pAabbPoints: number[]; - public _pAabbPointsDirty: boolean; - public _pBoundingEntity: entities.IEntity; - constructor(); - public aabb : geom.Box; - public aabbPoints : number[]; - public boundingEntity : entities.IEntity; - public nullify(): void; - public disposeRenderable(): void; - public fromVertices(vertices: number[]): void; - /** - * Updates the bounds to fit a Geometry object. - * - * @param geometry The Geometry object to be bounded. - */ - public fromGeometry(geometry: base.Geometry): void; - public fromSphere(center: geom.Vector3D, radius: number): void; - public fromExtremes(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): void; - public isInFrustum(planes: geom.Plane3D[], numPlanes: number): boolean; - public overlaps(bounds: BoundingVolumeBase): boolean; - public clone(): BoundingVolumeBase; - public rayIntersection(position: geom.Vector3D, direction: geom.Vector3D, targetNormal: geom.Vector3D): number; - public containsPoint(position: geom.Vector3D): boolean; - public pUpdateAABBPoints(): void; - public pUpdateBoundingEntity(): void; - public pCreateBoundingEntity(): entities.IEntity; - public classifyToPlane(plane: geom.Plane3D): number; - public transformFrom(bounds: BoundingVolumeBase, matrix: geom.Matrix3D): void; - } -} -declare module away.bounds { - class NullBounds extends BoundingVolumeBase { - private _alwaysIn; - constructor(alwaysIn?: boolean); - public clone(): BoundingVolumeBase; - public pCreateBoundingEntity(): entities.IEntity; - public isInFrustum(planes: geom.Plane3D[], numPlanes: number): boolean; - public fromSphere(center: geom.Vector3D, radius: number): void; - public fromExtremes(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): void; - public classifyToPlane(plane: geom.Plane3D): number; - public transformFrom(bounds: BoundingVolumeBase, matrix: geom.Matrix3D): void; - } -} -declare module away.bounds { - class BoundingSphere extends BoundingVolumeBase { - private _radius; - private _centerX; - private _centerY; - private _centerZ; - constructor(); - public radius : number; - public nullify(): void; - public isInFrustum(planes: geom.Plane3D[], numPlanes: number): boolean; - public fromSphere(center: geom.Vector3D, radius: number): void; - public fromExtremes(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): void; - public clone(): BoundingVolumeBase; - public rayIntersection(position: geom.Vector3D, direction: geom.Vector3D, targetNormal: geom.Vector3D): number; - public containsPoint(position: geom.Vector3D): boolean; - public pUpdateBoundingEntity(): void; - public pCreateBoundingEntity(): entities.IEntity; - public classifyToPlane(plane: geom.Plane3D): number; - public transformFrom(bounds: BoundingVolumeBase, matrix: geom.Matrix3D): void; - } -} -declare module away.bounds { - /** - * AxisAlignedBoundingBox represents a bounding box volume that has its planes aligned to the local coordinate axes of the bounded object. - * This is useful for most meshes. - */ - class AxisAlignedBoundingBox extends BoundingVolumeBase { - private _centerX; - private _centerY; - private _centerZ; - private _halfExtentsX; - private _halfExtentsY; - private _halfExtentsZ; - /** - * Creates a new AxisAlignedBoundingBox object. - */ - constructor(); - /** - * @inheritDoc - */ - public nullify(): void; - /** - * @inheritDoc - */ - public isInFrustum(planes: geom.Plane3D[], numPlanes: number): boolean; - public rayIntersection(position: geom.Vector3D, direction: geom.Vector3D, targetNormal: geom.Vector3D): number; - /** - * @inheritDoc - */ - public containsPoint(position: geom.Vector3D): boolean; - /** - * @inheritDoc - */ - public fromExtremes(minX: number, minY: number, minZ: number, maxX: number, maxY: number, maxZ: number): void; - /** - * @inheritDoc - */ - public clone(): BoundingVolumeBase; - public halfExtentsX : number; - public halfExtentsY : number; - public halfExtentsZ : number; - /** - * Finds the closest point on the bounding volume to another given point. This can be used for maximum error calculations for content within a given bound. - * @param point The point for which to find the closest point on the bounding volume - * @param target An optional Vector3D to store the result to prevent creating a new object. - * @return - */ - public closestPointToPoint(point: geom.Vector3D, target?: geom.Vector3D): geom.Vector3D; - public pUpdateBoundingRenderable(): void; - public pCreateBoundingEntity(): entities.IEntity; - public classifyToPlane(plane: geom.Plane3D): number; - public transformFrom(bounds: BoundingVolumeBase, matrix: geom.Matrix3D): void; - } -} -declare module away.net { - /** - * - */ - class URLRequest { - /** - * Object containing data to be transmited with URL Request ( URL Variables / binary / string ) - * - */ - public data: any; - /** - * - * away.net.URLRequestMethod.GET - * away.net.URLRequestMethod.POST - * - * @type {string} - */ - public method: string; - /** - * Use asynchronous XMLHttpRequest - * @type {boolean} - */ - public async: boolean; - /** - * - */ - private _url; - /** - - * @param url - */ - constructor(url?: string); - /** - * - * @returns {string} - */ - /** - * - * @param value - */ - public url : string; - /** - * dispose - */ - public dispose(): void; - } -} -declare module away.net { - class URLLoaderDataFormat { - /** - * TEXT - * @type {string} - */ - static TEXT: string; - /** - * Variables / Value Pairs - * @type {string} - */ - static VARIABLES: string; - /** - * - * @type {string} - */ - static BLOB: string; - /** - * - * @type {string} - */ - static ARRAY_BUFFER: string; - /** - * - * @type {string} - */ - static BINARY: string; - } -} -declare module away.net { - class URLRequestMethod { - /** - * - * @type {string} - */ - static POST: string; - /** - * - * @type {string} - */ - static GET: string; - } -} -declare module away.net { - /** - * The URLLoader is used to load a single file, as part of a resource. - * - * While URLLoader can be used directly, e.g. to create a third-party asset - * management system, it's recommended to use any of the classes Loader3D, AssetLoader - * and AssetLibrary instead in most cases. - * - * @see AssetLoader - * @see away.library.AssetLibrary - */ - class URLLoader extends events.EventDispatcher { - private _XHR; - private _bytesLoaded; - private _bytesTotal; - private _dataFormat; - private _loadError; - private _request; - private _data; - private _loadStartEvent; - private _loadErrorEvent; - private _loadCompleteEvent; - private _progressEvent; - /** - * Creates a new URLLoader object. - */ - constructor(); - /** - * - */ - public url : string; - /** - * - */ - public data : any; - /** - * - * URLLoaderDataFormat.BINARY - * URLLoaderDataFormat.TEXT - * URLLoaderDataFormat.VARIABLES - * - * @param format - */ - public dataFormat : string; - /** - * - * @returns {number} - */ - public bytesLoaded : number; - /** - * - * @returns {number} - */ - public bytesTotal : number; - /** - * Load a resource from a file. - * - * @param request The URLRequest object containing the URL of the object to be loaded. - */ - public load(request: URLRequest): void; - /** - * - */ - public close(): void; - /** - * - */ - public dispose(): void; - /** - * - * @param xhr - * @param responseType - */ - private setResponseType(xhr, responseType); - /** - * - * @param request {URLRequest} - */ - private getRequest(request); - /** - * - * @param request {URLRequest} - */ - private postRequest(request); - /** - * - * @param error {XMLHttpRequestException} - */ - private handleXmlHttpRequestException(error); - /** - * - */ - private initXHR(); - /** - * - */ - private disposeXHR(); - /** - * - * @param source - */ - public decodeURLVariables(source: string): Object; - /** - * When XHR state changes - * @param event - */ - private onReadyStateChange(event); - /** - * When the request has completed, regardless of whether or not it was successful. - * @param event - */ - private onLoadEnd(event); - /** - * When the author specified timeout has passed before the request could complete. - * @param event - */ - private onTimeOut(event); - /** - * When the request has been aborted, either by invoking the abort() method or navigating away from the page. - * @param event - */ - private onAbort(event); - /** - * While loading and sending data. - * @param event - */ - private onProgress(event); - /** - * When the request starts. - * @param event - */ - private onLoadStart(event); - /** - * When the request has successfully completed. - * @param event - */ - private onLoadComplete(event); - /** - * When the request has failed. ( due to network issues ). - * @param event - */ - private onLoadError(event); - } -} -declare module away.net { - class URLVariables { - private _variables; - /** - * - * @param source - */ - constructor(source?: string); - /** - * - * @param source - */ - public decode(source: string): void; - /** - * - * @returns {string} - */ - public toString(): string; - /** - * - * @returns {Object} - */ - /** - * - * @returns {Object} - */ - public variables : Object; - /** - * - * @returns {Object} - */ - public formData : FormData; - } -} -declare module away.library { - interface IAsset extends events.IEventDispatcher { - name: string; - id: number; - assetNamespace: string; - assetType: string; - assetFullPath: string[]; - assetPathEquals(name: string, ns: string): boolean; - resetAssetPath(name: string, ns: string, overrideOriginal?: boolean): void; - dispose(): any; - } -} -declare module away.library { - class NamedAssetBase extends events.EventDispatcher { - static ID_COUNT: number; - private _originalName; - private _namespace; - private _name; - private _id; - private _full_path; - static DEFAULT_NAMESPACE: string; - constructor(name?: string); - /** - * - */ - public assetType : string; - /** - * The original name used for this asset in the resource (e.g. file) in which - * it was found. This may not be the same as name, which may - * have changed due to of a name conflict. - */ - public originalName : string; - /** - * A unique id for the asset, used to identify assets in an associative array - */ - public id : number; - public name : string; - public dispose(): void; - public assetNamespace : string; - public assetFullPath : string[]; - public assetPathEquals(name: string, ns: string): boolean; - public resetAssetPath(name: string, ns?: string, overrideOriginal?: boolean): void; - private updateFullPath(); - } -} -declare module away.library { - class AssetType { - static ANIMATION_NODE: string; - static ANIMATION_SET: string; - static ANIMATION_STATE: string; - static ANIMATOR: string; - static BILLBOARD: string; - static CAMERA: string; - static CONTAINER: string; - static EFFECTS_METHOD: string; - static GEOMETRY: string; - static LINE_SEGMENT: string; - static LIGHT: string; - static LIGHT_PICKER: string; - static MATERIAL: string; - static MESH: string; - static TRIANGLE_SUB_MESH: string; - static LINE_SUB_MESH: string; - static PRIMITIVE_PREFAB: string; - static SHADOW_MAP_METHOD: string; - static SKELETON: string; - static SKELETON_POSE: string; - static SKYBOX: string; - static STATE_TRANSITION: string; - static TEXTURE: string; - static TEXTURE_PROJECTOR: string; - } -} -declare module away.display { - class ContextMode { - static AUTO: string; - static WEBGL: string; - static FLASH: string; - static NATIVE: string; - } -} -/** -* @module away.base -*/ -declare module away.display { - /** - * - * @class away.base.IContext - */ - interface IContext { - container: HTMLElement; - clear(red?: number, green?: number, blue?: number, alpha?: number, depth?: number, stencil?: number, mask?: number): any; - configureBackBuffer(width: number, height: number, antiAlias: number, enableDepthAndStencil?: boolean): any; - dispose(): any; - present(): any; - setScissorRectangle(rect: geom.Rectangle): any; - } -} -/** -* A class that provides constant values for visual blend mode effects. These -* constants are used in the following: -*
    -*
  • The blendMode property of the -* flash.display.DisplayObject class.
  • -*
  • The blendMode parameter of the draw() -* method of the flash.display.BitmapData class
  • -*
-*/ -declare module away.base { - class BlendMode { - /** - * Adds the values of the constituent colors of the display object to the - * colors of its background, applying a ceiling of 0xFF. This setting is - * commonly used for animating a lightening dissolve between two objects. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xAAA633, and the background pixel has an RGB value of 0xDD2200, the - * resulting RGB value for the displayed pixel is 0xFFC833(because 0xAA + - * 0xDD > 0xFF, 0xA6 + 0x22 = 0xC8, and 0x33 + 0x00 = 0x33).

- */ - static ADD: string; - /** - * Applies the alpha value of each pixel of the display object to the - * background. This requires the blendMode property of the - * parent display object be set to - * away.base.BlendMode.LAYER. - * - *

Not supported under GPU rendering.

- */ - static ALPHA: string; - /** - * Selects the darker of the constituent colors of the display object and the - * colors of the background(the colors with the smaller values). This - * setting is commonly used for superimposing type. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the - * resulting RGB value for the displayed pixel is 0xDDCC00(because 0xFF > - * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

- * - *

Not supported under GPU rendering.

- */ - static DARKEN: string; - /** - * Compares the constituent colors of the display object with the colors of - * its background, and subtracts the darker of the values of the two - * constituent colors from the lighter value. This setting is commonly used - * for more vibrant colors. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the - * resulting RGB value for the displayed pixel is 0x222C33(because 0xFF - - * 0xDD = 0x22, 0xF8 - 0xCC = 0x2C, and 0x33 - 0x00 = 0x33).

- */ - static DIFFERENCE: string; - /** - * Erases the background based on the alpha value of the display object. This - * process requires that the blendMode property of the parent - * display object be set to flash.display.BlendMode.LAYER. - * - *

Not supported under GPU rendering.

- */ - static ERASE: string; - /** - * Adjusts the color of each pixel based on the darkness of the display - * object. If the display object is lighter than 50% gray, the display object - * and background colors are screened, which results in a lighter color. If - * the display object is darker than 50% gray, the colors are multiplied, - * which results in a darker color. This setting is commonly used for shading - * effects. - * - *

Not supported under GPU rendering.

- */ - static HARDLIGHT: string; - /** - * Inverts the background. - */ - static INVERT: string; - /** - * Forces the creation of a transparency group for the display object. This - * means that the display object is precomposed in a temporary buffer before - * it is processed further. The precomposition is done automatically if the - * display object is precached by means of bitmap caching or if the display - * object is a display object container that has at least one child object - * with a blendMode setting other than "normal". - * - *

Not supported under GPU rendering.

- */ - static LAYER: string; - /** - * Selects the lighter of the constituent colors of the display object and - * the colors of the background(the colors with the larger values). This - * setting is commonly used for superimposing type. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the - * resulting RGB value for the displayed pixel is 0xFFF833(because 0xFF > - * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

- * - *

Not supported under GPU rendering.

- */ - static LIGHTEN: string; - /** - * Multiplies the values of the display object constituent colors by the - * constituent colors of the background color, and normalizes by dividing by - * 0xFF, resulting in darker colors. This setting is commonly used for - * shadows and depth effects. - * - *

For example, if a constituent color(such as red) of one pixel in the - * display object and the corresponding color of the pixel in the background - * both have the value 0x88, the multiplied result is 0x4840. Dividing by - * 0xFF yields a value of 0x48 for that constituent color, which is a darker - * shade than the color of the display object or the color of the - * background.

- */ - static MULTIPLY: string; - /** - * The display object appears in front of the background. Pixel values of the - * display object override the pixel values of the background. Where the - * display object is transparent, the background is visible. - */ - static NORMAL: string; - /** - * Adjusts the color of each pixel based on the darkness of the background. - * If the background is lighter than 50% gray, the display object and - * background colors are screened, which results in a lighter color. If the - * background is darker than 50% gray, the colors are multiplied, which - * results in a darker color. This setting is commonly used for shading - * effects. - * - *

Not supported under GPU rendering.

- */ - static OVERLAY: string; - /** - * Multiplies the complement(inverse) of the display object color by the - * complement of the background color, resulting in a bleaching effect. This - * setting is commonly used for highlights or to remove black areas of the - * display object. - */ - static SCREEN: string; - /** - * Uses a shader to define the blend between objects. - * - *

Setting the blendShader property to a Shader instance - * automatically sets the display object's blendMode property to - * BlendMode.SHADER. If the blendMode property is - * set to BlendMode.SHADER without first setting the - * blendShader property, the blendMode property is - * set to BlendMode.NORMAL instead. If the - * blendShader property is set(which sets the - * blendMode property to BlendMode.SHADER), then - * later the value of the blendMode property is changed, the - * blend mode can be reset to use the blend shader simply by setting the - * blendMode property to BlendMode.SHADER. The - * blendShader property does not need to be set again except to - * change the shader that's used to define the blend mode.

- * - *

Not supported under GPU rendering.

- */ - static SHADER: string; - /** - * Subtracts the values of the constituent colors in the display object from - * the values of the background color, applying a floor of 0. This setting is - * commonly used for animating a darkening dissolve between two objects. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xAA2233, and the background pixel has an RGB value of 0xDDA600, the - * resulting RGB value for the displayed pixel is 0x338400(because 0xDD - - * 0xAA = 0x33, 0xA6 - 0x22 = 0x84, and 0x00 - 0x33 < 0x00).

- */ - static SUBTRACT: string; - } -} -/** -*/ -declare module away.base { - class AlignmentMode { - /** - * - */ - static REGISTRATION_POINT: string; - /** - * - */ - static PIVOT_POINT: string; - } -} -/** -*/ -declare module away.base { - class OrientationMode { - /** - * - */ - static DEFAULT: string; - /** - * - */ - static CAMERA_PLANE: string; - /** - * - */ - static CAMERA_POSITION: string; - } -} -declare module away.base { - /** - * - */ - class BitmapData { - private _imageCanvas; - private _context; - private _imageData; - private _rect; - private _transparent; - private _alpha; - private _locked; - /** - * - * @param width - * @param height - * @param transparent - * @param fillColor - */ - constructor(width: number, height: number, transparent?: boolean, fillColor?: number); - /** - * - */ - public dispose(): void; - /** - * - */ - public lock(): void; - /** - * - */ - public unlock(): void; - /** - * - * @param x - * @param y - * @param color - */ - public getPixel(x: any, y: any): number; - /** - * - * @param x - * @param y - * @param color - */ - public setPixel(x: any, y: any, color: number): void; - /** - * - * @param rect - * @param inputByteArray - */ - public setPixels(rect: geom.Rectangle, inputByteArray: utils.ByteArray): void; - /** - * - * @param x - * @param y - * @param color - */ - public setPixel32(x: any, y: any, color: number): void; - public setVector(rect: geom.Rectangle, inputVector: number[]): void; - /** - * Copy an HTMLImageElement or BitmapData object - * - * @param img {BitmapData} / {HTMLImageElement} - * @param sourceRect - source rectange to copy from - * @param destRect - destinatoin rectange to copy to - */ - public drawImage(img: BitmapData, sourceRect: geom.Rectangle, destRect: geom.Rectangle): any; - public drawImage(img: HTMLImageElement, sourceRect: geom.Rectangle, destRect: geom.Rectangle): any; - private _drawImage(img, sourceRect, destRect); - /** - * - * @param bmpd - * @param sourceRect - * @param destRect - */ - public copyPixels(bmpd: BitmapData, sourceRect: geom.Rectangle, destRect: geom.Rectangle): any; - public copyPixels(bmpd: HTMLImageElement, sourceRect: geom.Rectangle, destRect: geom.Rectangle): any; - private _copyPixels(bmpd, sourceRect, destRect); - /** - * - * @param rect - * @param color - */ - public fillRect(rect: geom.Rectangle, color: number): void; - /** - * - * @param source - * @param matrix - */ - public draw(source: BitmapData, matrix?: geom.Matrix): any; - public draw(source: HTMLImageElement, matrix?: geom.Matrix): any; - private _draw(source, matrix); - public copyChannel(sourceBitmap: BitmapData, sourceRect: geom.Rectangle, destPoint: geom.Point, sourceChannel: number, destChannel: number): void; - public colorTransform(rect: geom.Rectangle, colorTransform: geom.ColorTransform): void; - /** - * - * @returns {ImageData} - */ - /** - * - * @param {ImageData} - */ - public imageData : ImageData; - /** - * - * @returns {number} - */ - /** - * - * @param {number} - */ - public width : number; - /** - * - * @returns {number} - */ - /** - * - * @param {number} - */ - public height : number; - /** - * - * @param {Rectangle} - */ - public rect : geom.Rectangle; - /** - * - * @returns {HTMLCanvasElement} - */ - public canvas : HTMLCanvasElement; - /** - * - * @returns {HTMLCanvasElement} - */ - public context : CanvasRenderingContext2D; - /** - * convert decimal value to Hex - */ - private hexToRGBACSS(d); - } -} -declare module away.base { - class BitmapDataChannel { - static ALPHA: number; - static BLUE: number; - static GREEN: number; - static RED: number; - } -} -/** -* The CapsStyle class is an enumeration of constant values that specify the -* caps style to use in drawing lines. The constants are provided for use as -* values in the caps parameter of the -* flash.display.Graphics.lineStyle() method. You can specify the -* following three types of caps: -*/ -declare module away.base { - class CapsStyle { - /** - * Used to specify round caps in the caps parameter of the - * flash.display.Graphics.lineStyle() method. - */ - static ROUND: string; - /** - * Used to specify no caps in the caps parameter of the - * flash.display.Graphics.lineStyle() method. - */ - static NONE: string; - /** - * Used to specify square caps in the caps parameter of the - * flash.display.Graphics.lineStyle() method. - */ - static SQUARE: string; - } -} -/** -* The DisplayObject class is the base class for all objects that can be -* placed on the display list. The display list manages all objects displayed -* in flash. Use the DisplayObjectContainer class to arrange the -* display objects in the display list. DisplayObjectContainer objects can -* have child display objects, while other display objects, such as Shape and -* TextField objects, are "leaf" nodes that have only parents and siblings, no -* children. -* -*

The DisplayObject class supports basic functionality like the x -* and y position of an object, as well as more advanced properties of -* the object such as its transformation matrix.

-* -*

DisplayObject is an abstract base class; therefore, you cannot call -* DisplayObject directly. Invoking new DisplayObject() throws an -* ArgumentError exception.

-* -*

All display objects inherit from the DisplayObject class.

-* -*

The DisplayObject class itself does not include any APIs for rendering -* content onscreen. For that reason, if you want create a custom subclass of -* the DisplayObject class, you will want to extend one of its subclasses that -* do have APIs for rendering content onscreen, such as the Shape, Sprite, -* Bitmap, SimpleButton, TextField, or MovieClip class.

-* -*

The DisplayObject class contains several broadcast events. Normally, the -* target of any particular event is a specific DisplayObject instance. For -* example, the target of an added event is the specific -* DisplayObject instance that was added to the display list. Having a single -* target restricts the placement of event listeners to that target and in -* some cases the target's ancestors on the display list. With broadcast -* events, however, the target is not a specific DisplayObject instance, but -* rather all DisplayObject instances, including those that are not on the -* display list. This means that you can add a listener to any DisplayObject -* instance to listen for broadcast events. In addition to the broadcast -* events listed in the DisplayObject class's Events table, the DisplayObject -* class also inherits two broadcast events from the EventDispatcher class: -* activate and deactivate.

-* -*

Some properties previously used in the ActionScript 1.0 and 2.0 -* MovieClip, TextField, and Button classes(such as _alpha, -* _height, _name, _width, -* _x, _y, and others) have equivalents in the -* ActionScript 3.0 DisplayObject class that are renamed so that they no -* longer begin with the underscore(_) character.

-* -*

For more information, see the "Display Programming" chapter of the -* ActionScript 3.0 Developer's Guide.

-* -* @event added Dispatched when a display object is added to the -* display list. The following methods trigger this -* event: -* DisplayObjectContainer.addChild(), -* DisplayObjectContainer.addChildAt(). -* @event addedToStage Dispatched when a display object is added to the on -* stage display list, either directly or through the -* addition of a sub tree in which the display object -* is contained. The following methods trigger this -* event: -* DisplayObjectContainer.addChild(), -* DisplayObjectContainer.addChildAt(). -* @event enterFrame [broadcast event] Dispatched when the playhead is -* entering a new frame. If the playhead is not -* moving, or if there is only one frame, this event -* is dispatched continuously in conjunction with the -* frame rate. This event is a broadcast event, which -* means that it is dispatched by all display objects -* with a listener registered for this event. -* @event exitFrame [broadcast event] Dispatched when the playhead is -* exiting the current frame. All frame scripts have -* been run. If the playhead is not moving, or if -* there is only one frame, this event is dispatched -* continuously in conjunction with the frame rate. -* This event is a broadcast event, which means that -* it is dispatched by all display objects with a -* listener registered for this event. -* @event frameConstructed [broadcast event] Dispatched after the constructors -* of frame display objects have run but before frame -* scripts have run. If the playhead is not moving, or -* if there is only one frame, this event is -* dispatched continuously in conjunction with the -* frame rate. This event is a broadcast event, which -* means that it is dispatched by all display objects -* with a listener registered for this event. -* @event removed Dispatched when a display object is about to be -* removed from the display list. Two methods of the -* DisplayObjectContainer class generate this event: -* removeChild() and -* removeChildAt(). -* -*

The following methods of a -* DisplayObjectContainer object also generate this -* event if an object must be removed to make room for -* the new object: addChild(), -* addChildAt(), and -* setChildIndex().

-* @event removedFromStage Dispatched when a display object is about to be -* removed from the display list, either directly or -* through the removal of a sub tree in which the -* display object is contained. Two methods of the -* DisplayObjectContainer class generate this event: -* removeChild() and -* removeChildAt(). -* -*

The following methods of a -* DisplayObjectContainer object also generate this -* event if an object must be removed to make room for -* the new object: addChild(), -* addChildAt(), and -* setChildIndex().

-* @event render [broadcast event] Dispatched when the display list -* is about to be updated and rendered. This event -* provides the last opportunity for objects listening -* for this event to make changes before the display -* list is rendered. You must call the -* invalidate() method of the Stage -* object each time you want a render -* event to be dispatched. Render events -* are dispatched to an object only if there is mutual -* trust between it and the object that called -* Stage.invalidate(). This event is a -* broadcast event, which means that it is dispatched -* by all display objects with a listener registered -* for this event. -* -*

Note: This event is not dispatched if the -* display is not rendering. This is the case when the -* content is either minimized or obscured.

-*/ -declare module away.base { - class DisplayObject extends library.NamedAssetBase implements IBitmapDrawable { - private _loaderInfo; - private _mouseX; - private _mouseY; - private _root; - private _bounds; - private _boundsVisible; - private _depth; - private _height; - private _width; - public _pScene: containers.Scene; - public _pParent: containers.DisplayObjectContainer; - public _pSceneTransform: geom.Matrix3D; - public _pSceneTransformDirty: boolean; - public _pIsEntity: boolean; - private _explicitPartition; - public _pImplicitPartition: partition.Partition; - private _partitionNode; - private _sceneTransformChanged; - private _scenechanged; - private _transform; - private _matrix3D; - private _matrix3DDirty; - private _inverseSceneTransform; - private _inverseSceneTransformDirty; - private _scenePosition; - private _scenePositionDirty; - private _explicitVisibility; - public _pImplicitVisibility: boolean; - private _explicitMouseEnabled; - public _pImplicitMouseEnabled: boolean; - private _listenToSceneTransformChanged; - private _listenToSceneChanged; - private _positionDirty; - private _rotationDirty; - private _scaleDirty; - private _positionChanged; - private _rotationChanged; - private _scaleChanged; - private _rotationX; - private _rotationY; - private _rotationZ; - private _eulers; - private _flipY; - private _listenToPositionChanged; - private _listenToRotationChanged; - private _listenToScaleChanged; - private _zOffset; - public _pScaleX: number; - public _pScaleY: number; - public _pScaleZ: number; - private _x; - private _y; - private _z; - private _pivot; - private _orientationMatrix; - private _pivotZero; - private _pivotDirty; - private _pos; - private _rot; - private _sca; - private _transformComponents; - public _pIgnoreTransform: boolean; - private _shaderPickingDetails; - public _pPickingCollisionVO: pick.PickingCollisionVO; - public _pBounds: bounds.BoundingVolumeBase; - public _pBoundsInvalid: boolean; - private _worldBounds; - private _worldBoundsInvalid; - public _pPickingCollider: pick.IPickingCollider; - public _pRenderables: pool.IRenderable[]; - public _iSourcePrefab: prefabs.PrefabBase; - /** - * - */ - public alignmentMode: string; - /** - * Indicates the alpha transparency value of the object specified. Valid - * values are 0(fully transparent) to 1(fully opaque). The default value is - * 1. Display objects with alpha set to 0 are active, - * even though they are invisible. - */ - public alpha: number; - /** - * A value from the BlendMode class that specifies which blend mode to use. A - * bitmap can be drawn internally in two ways. If you have a blend mode - * enabled or an external clipping mask, the bitmap is drawn by adding a - * bitmap-filled square shape to the vector render. If you attempt to set - * this property to an invalid value, Flash runtimes set the value to - * BlendMode.NORMAL. - * - *

The blendMode property affects each pixel of the display - * object. Each pixel is composed of three constituent colors(red, green, - * and blue), and each constituent color has a value between 0x00 and 0xFF. - * Flash Player or Adobe AIR compares each constituent color of one pixel in - * the movie clip with the corresponding color of the pixel in the - * background. For example, if blendMode is set to - * BlendMode.LIGHTEN, Flash Player or Adobe AIR compares the red - * value of the display object with the red value of the background, and uses - * the lighter of the two as the value for the red component of the displayed - * color.

- * - *

The following table describes the blendMode settings. The - * BlendMode class defines string values you can use. The illustrations in - * the table show blendMode values applied to a circular display - * object(2) superimposed on another display object(1).

- */ - public blendMode: BlendMode; - /** - * - */ - public bounds : bounds.BoundingVolumeBase; - /** - * If set to true, NME will use the software renderer to cache - * an internal bitmap representation of the display object. For native targets, - * this is often much slower than the default hardware renderer. When you - * are using the Flash target, this caching may increase performance for display - * objects that contain complex vector content. - * - *

All vector data for a display object that has a cached bitmap is drawn - * to the bitmap instead of the main display. If - * cacheAsBitmapMatrix is null or unsupported, the bitmap is - * then copied to the main display as unstretched, unrotated pixels snapped - * to the nearest pixel boundaries. Pixels are mapped 1 to 1 with the parent - * object. If the bounds of the bitmap change, the bitmap is recreated - * instead of being stretched.

- * - *

If cacheAsBitmapMatrix is non-null and supported, the - * object is drawn to the off-screen bitmap using that matrix and the - * stretched and/or rotated results of that rendering are used to draw the - * object to the main display.

- * - *

No internal bitmap is created unless the cacheAsBitmap - * property is set to true.

- * - *

After you set the cacheAsBitmap property to - * true, the rendering does not change, however the display - * object performs pixel snapping automatically. The animation speed can be - * significantly faster depending on the complexity of the vector content. - *

- * - *

The cacheAsBitmap property is automatically set to - * true whenever you apply a filter to a display object(when - * its filter array is not empty), and if a display object has a - * filter applied to it, cacheAsBitmap is reported as - * true for that display object, even if you set the property to - * false. If you clear all filters for a display object, the - * cacheAsBitmap setting changes to what it was last set to.

- * - *

A display object does not use a bitmap even if the - * cacheAsBitmap property is set to true and - * instead renders from vector data in the following cases:

- * - *
    - *
  • The bitmap is too large. In AIR 1.5 and Flash Player 10, the maximum - * size for a bitmap image is 8,191 pixels in width or height, and the total - * number of pixels cannot exceed 16,777,215 pixels.(So, if a bitmap image - * is 8,191 pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 - * and earlier, the limitation is is 2880 pixels in height and 2,880 pixels - * in width.
  • - *
  • The bitmap fails to allocate(out of memory error).
  • - *
- * - *

The cacheAsBitmap property is best used with movie clips - * that have mostly static content and that do not scale and rotate - * frequently. With such movie clips, cacheAsBitmap can lead to - * performance increases when the movie clip is translated(when its x - * and y position is changed).

- */ - public cacheAsBitmap: boolean; - /** - * - */ - public castsShadows: boolean; - /** - * Indicates the depth of the display object, in pixels. The depth is - * calculated based on the bounds of the content of the display object. When - * you set the depth property, the scaleZ property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content (such as an empty sprite) has a depth of 0, even if you try to - * set depth to a different value.

- */ - public depth : number; - /** - * Defines the rotation of the 3d object as a Vector3D object containing euler angles for rotation around x, y and z axis. - */ - public eulers : geom.Vector3D; - /** - * An object that can contain any extra data. - */ - public extra: Object; - /** - * Indicates the height of the display object, in pixels. The height is - * calculated based on the bounds of the content of the display object. When - * you set the height property, the scaleY property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content (such as an empty sprite) has a height of 0, even if you try to - * set height to a different value.

- */ - public height : number; - /** - * Indicates the instance container index of the DisplayObject. The object can be - * identified in the child list of its parent display object container by - * calling the getChildByIndex() method of the display object - * container. - * - *

If the DisplayObject has no parent container, index defaults to 0.

- */ - public index : number; - /** - * - */ - public inverseSceneTransform : geom.Matrix3D; - /** - * - */ - public ignoreTransform : boolean; - /** - * - */ - public isEntity : boolean; - /** - * Returns a LoaderInfo object containing information about loading the file - * to which this display object belongs. The loaderInfo property - * is defined only for the root display object of a SWF file or for a loaded - * Bitmap(not for a Bitmap that is drawn with ActionScript). To find the - * loaderInfo object associated with the SWF file that contains - * a display object named myDisplayObject, use - * myDisplayObject.root.loaderInfo. - * - *

A large SWF file can monitor its download by calling - * this.root.loaderInfo.addEventListener(Event.COMPLETE, - * func).

- */ - public loaderInfo : LoaderInfo; - /** - * The calling display object is masked by the specified mask - * object. To ensure that masking works when the Stage is scaled, the - * mask display object must be in an active part of the display - * list. The mask object itself is not drawn. Set - * mask to null to remove the mask. - * - *

To be able to scale a mask object, it must be on the display list. To - * be able to drag a mask Sprite object(by calling its - * startDrag() method), it must be on the display list. To call - * the startDrag() method for a mask sprite based on a - * mouseDown event being dispatched by the sprite, set the - * sprite's buttonMode property to true.

- * - *

When display objects are cached by setting the - * cacheAsBitmap property to true an the - * cacheAsBitmapMatrix property to a Matrix object, both the - * mask and the display object being masked must be part of the same cached - * bitmap. Thus, if the display object is cached, then the mask must be a - * child of the display object. If an ancestor of the display object on the - * display list is cached, then the mask must be a child of that ancestor or - * one of its descendents. If more than one ancestor of the masked object is - * cached, then the mask must be a descendent of the cached container closest - * to the masked object in the display list.

- * - *

Note: A single mask object cannot be used to mask - * more than one calling display object. When the mask is - * assigned to a second display object, it is removed as the mask of the - * first object, and that object's mask property becomes - * null.

- */ - public mask: DisplayObject; - /** - * Specifies whether this object receives mouse, or other user input, - * messages. The default value is true, which means that by - * default any InteractiveObject instance that is on the display list - * receives mouse events or other user input events. If - * mouseEnabled is set to false, the instance does - * not receive any mouse events(or other user input events like keyboard - * events). Any children of this instance on the display list are not - * affected. To change the mouseEnabled behavior for all - * children of an object on the display list, use - * flash.display.DisplayObjectContainer.mouseChildren. - * - *

No event is dispatched by setting this property. You must use the - * addEventListener() method to create interactive - * functionality.

- */ - public mouseEnabled : boolean; - /** - * Indicates the x coordinate of the mouse or user input device position, in - * pixels. - * - *

Note: For a DisplayObject that has been rotated, the returned x - * coordinate will reflect the non-rotated object.

- */ - public mouseX : number; - /** - * Indicates the y coordinate of the mouse or user input device position, in - * pixels. - * - *

Note: For a DisplayObject that has been rotated, the returned y - * coordinate will reflect the non-rotated object.

- */ - public mouseY : number; - /** - * Indicates the instance name of the DisplayObject. The object can be - * identified in the child list of its parent display object container by - * calling the getChildByName() method of the display object - * container. - * - * @throws IllegalOperationError If you are attempting to set this property - * on an object that was placed on the timeline - * in the Flash authoring tool. - */ - public name: string; - /** - * - */ - public orientationMode: string; - /** - * Indicates the DisplayObjectContainer object that contains this display - * object. Use the parent property to specify a relative path to - * display objects that are above the current display object in the display - * list hierarchy. - * - *

You can use parent to move up multiple levels in the - * display list as in the following:

- * - * @throws SecurityError The parent display object belongs to a security - * sandbox to which you do not have access. You can - * avoid this situation by having the parent movie call - * the Security.allowDomain() method. - */ - public parent : containers.DisplayObjectContainer; - /** - * - */ - public partition : partition.Partition; - /** - * - */ - public partitionNode : partition.EntityNode; - /** - * - */ - public pickingCollider : pick.IPickingCollider; - /** - * Defines the local point around which the object rotates. - */ - public pivot : geom.Vector3D; - /** - * For a display object in a loaded SWF file, the root property - * is the top-most display object in the portion of the display list's tree - * structure represented by that SWF file. For a Bitmap object representing a - * loaded image file, the root property is the Bitmap object - * itself. For the instance of the main class of the first SWF file loaded, - * the root property is the display object itself. The - * root property of the Stage object is the Stage object itself. - * The root property is set to null for any display - * object that has not been added to the display list, unless it has been - * added to a display object container that is off the display list but that - * is a child of the top-most display object in a loaded SWF file. - * - *

For example, if you create a new Sprite object by calling the - * Sprite() constructor method, its root property - * is null until you add it to the display list(or to a display - * object container that is off the display list but that is a child of the - * top-most display object in a SWF file).

- * - *

For a loaded SWF file, even though the Loader object used to load the - * file may not be on the display list, the top-most display object in the - * SWF file has its root property set to itself. The Loader - * object does not have its root property set until it is added - * as a child of a display object for which the root property is - * set.

- */ - public root : containers.DisplayObjectContainer; - /** - * Indicates the rotation of the DisplayObject instance, in degrees, from its - * original orientation. Values from 0 to 180 represent clockwise rotation; - * values from 0 to -180 represent counterclockwise rotation. Values outside - * this range are added to or subtracted from 360 to obtain a value within - * the range. For example, the statement my_video.rotation = 450 - * is the same as my_video.rotation = 90. - */ - public rotation: number; - /** - * Indicates the x-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - public rotationX : number; - /** - * Indicates the y-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - public rotationY : number; - /** - * Indicates the z-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - public rotationZ : number; - /** - * The current scaling grid that is in effect. If set to null, - * the entire display object is scaled normally when any scale transformation - * is applied. - * - *

When you define the scale9Grid property, the display - * object is divided into a grid with nine regions based on the - * scale9Grid rectangle, which defines the center region of the - * grid. The eight other regions of the grid are the following areas:

- * - *
    - *
  • The upper-left corner outside of the rectangle
  • - *
  • The area above the rectangle
  • - *
  • The upper-right corner outside of the rectangle
  • - *
  • The area to the left of the rectangle
  • - *
  • The area to the right of the rectangle
  • - *
  • The lower-left corner outside of the rectangle
  • - *
  • The area below the rectangle
  • - *
  • The lower-right corner outside of the rectangle
  • - *
- * - *

You can think of the eight regions outside of the center(defined by - * the rectangle) as being like a picture frame that has special rules - * applied to it when scaled.

- * - *

When the scale9Grid property is set and a display object - * is scaled, all text and gradients are scaled normally; however, for other - * types of objects the following rules apply:

- * - *
    - *
  • Content in the center region is scaled normally.
  • - *
  • Content in the corners is not scaled.
  • - *
  • Content in the top and bottom regions is scaled horizontally only. - * Content in the left and right regions is scaled vertically only.
  • - *
  • All fills(including bitmaps, video, and gradients) are stretched to - * fit their shapes.
  • - *
- * - *

If a display object is rotated, all subsequent scaling is normal(and - * the scale9Grid property is ignored).

- * - *

For example, consider the following display object and a rectangle that - * is applied as the display object's scale9Grid:

- * - *

A common use for setting scale9Grid is to set up a display - * object to be used as a component, in which edge regions retain the same - * width when the component is scaled.

- * - * @throws ArgumentError If you pass an invalid argument to the method. - */ - public scale9Grid: geom.Rectangle; - /** - * Indicates the horizontal scale(percentage) of the object as applied from - * the registration point. The default registration point is(0,0). 1.0 - * equals 100% scale. - * - *

Scaling the local coordinate system changes the x and - * y property values, which are defined in whole pixels.

- */ - public scaleX : number; - /** - * Indicates the vertical scale(percentage) of an object as applied from the - * registration point of the object. The default registration point is(0,0). - * 1.0 is 100% scale. - * - *

Scaling the local coordinate system changes the x and - * y property values, which are defined in whole pixels.

- */ - public scaleY : number; - /** - * Indicates the depth scale(percentage) of an object as applied from the - * registration point of the object. The default registration point is(0,0). - * 1.0 is 100% scale. - * - *

Scaling the local coordinate system changes the x, - * y and z property values, which are defined in - * whole pixels.

- */ - public scaleZ : number; - /** - * - */ - public scene : containers.Scene; - /** - * - */ - public scenePosition : geom.Vector3D; - public sceneTransform : geom.Matrix3D; - /** - * The scroll rectangle bounds of the display object. The display object is - * cropped to the size defined by the rectangle, and it scrolls within the - * rectangle when you change the x and y properties - * of the scrollRect object. - * - *

The properties of the scrollRect Rectangle object use the - * display object's coordinate space and are scaled just like the overall - * display object. The corner bounds of the cropped window on the scrolling - * display object are the origin of the display object(0,0) and the point - * defined by the width and height of the rectangle. They are not centered - * around the origin, but use the origin to define the upper-left corner of - * the area. A scrolled display object always scrolls in whole pixel - * increments.

- * - *

You can scroll an object left and right by setting the x - * property of the scrollRect Rectangle object. You can scroll - * an object up and down by setting the y property of the - * scrollRect Rectangle object. If the display object is rotated - * 90° and you scroll it left and right, the display object actually scrolls - * up and down.

- */ - public scrollRect: geom.Rectangle; - /** - * - */ - public shaderPickingDetails : boolean; - /** - * - */ - public boundsVisible : boolean; - /** - * An object with properties pertaining to a display object's matrix, color - * transform, and pixel bounds. The specific properties - matrix, - * colorTransform, and three read-only properties - * (concatenatedMatrix, concatenatedColorTransform, - * and pixelBounds) - are described in the entry for the - * Transform class. - * - *

Each of the transform object's properties is itself an object. This - * concept is important because the only way to set new values for the matrix - * or colorTransform objects is to create a new object and copy that object - * into the transform.matrix or transform.colorTransform property.

- * - *

For example, to increase the tx value of a display - * object's matrix, you must make a copy of the entire matrix object, then - * copy the new object into the matrix property of the transform object:

- *
 public myMatrix:Matrix =
-        * myDisplayObject.transform.matrix; myMatrix.tx += 10;
-        * myDisplayObject.transform.matrix = myMatrix; 
- * - *

You cannot directly set the tx property. The following - * code has no effect on myDisplayObject:

- *
 myDisplayObject.transform.matrix.tx +=
-        * 10; 
- * - *

You can also copy an entire transform object and assign it to another - * display object's transform property. For example, the following code - * copies the entire transform object from myOldDisplayObj to - * myNewDisplayObj:

- * myNewDisplayObj.transform = myOldDisplayObj.transform; - * - *

The resulting display object, myNewDisplayObj, now has the - * same values for its matrix, color transform, and pixel bounds as the old - * display object, myOldDisplayObj.

- * - *

Note that AIR for TV devices use hardware acceleration, if it is - * available, for color transforms.

- */ - public transform : geom.Transform; - /** - * Whether or not the display object is visible. Display objects that are not - * visible are disabled. For example, if visible=false for an - * InteractiveObject instance, it cannot be clicked. - */ - public visible : boolean; - /** - * Indicates the width of the display object, in pixels. The width is - * calculated based on the bounds of the content of the display object. When - * you set the width property, the scaleX property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content(such as an empty sprite) has a width of 0, even if you try to set - * width to a different value.

- */ - public width : number; - /** - * - */ - public worldBounds : bounds.BoundingVolumeBase; - /** - * Indicates the x coordinate of the DisplayObject instance relative - * to the local coordinates of the parent DisplayObjectContainer. If the - * object is inside a DisplayObjectContainer that has transformations, it is - * in the local coordinate system of the enclosing DisplayObjectContainer. - * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the - * DisplayObjectContainer's children inherit a coordinate system that is - * rotated 90° counterclockwise. The object's coordinates refer to the - * registration point position. - */ - public x : number; - /** - * Indicates the y coordinate of the DisplayObject instance relative - * to the local coordinates of the parent DisplayObjectContainer. If the - * object is inside a DisplayObjectContainer that has transformations, it is - * in the local coordinate system of the enclosing DisplayObjectContainer. - * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the - * DisplayObjectContainer's children inherit a coordinate system that is - * rotated 90° counterclockwise. The object's coordinates refer to the - * registration point position. - */ - public y : number; - /** - * Indicates the z coordinate position along the z-axis of the DisplayObject - * instance relative to the 3D parent container. The z property is used for - * 3D coordinates, not screen or pixel coordinates. - * - *

When you set a z property for a display object to - * something other than the default value of 0, a corresponding - * Matrix3D object is automatically created. for adjusting a display object's - * position and orientation in three dimensions. When working with the - * z-axis, the existing behavior of x and y properties changes from screen or - * pixel coordinates to positions relative to the 3D parent container.

- * - *

For example, a child of the _root at position x = 100, y = - * 100, z = 200 is not drawn at pixel location(100,100). The child is drawn - * wherever the 3D projection calculation puts it. The calculation is:

- * - *

(x~~cameraFocalLength/cameraRelativeZPosition, - * y~~cameraFocalLength/cameraRelativeZPosition)

- */ - public z : number; - /** - * - */ - public zOffset : number; - /** - * Creates a new DisplayObject instance. - */ - constructor(); - /** - * - */ - public addEventListener(type: string, listener: Function): void; - /** - * - */ - public clone(): DisplayObject; - /** - * - */ - public dispose(): void; - /** - * @inheritDoc - */ - public disposeAsset(): void; - /** - * Returns a rectangle that defines the area of the display object relative - * to the coordinate system of the targetCoordinateSpace object. - * Consider the following code, which shows how the rectangle returned can - * vary depending on the targetCoordinateSpace parameter that - * you pass to the method: - * - *

Note: Use the localToGlobal() and - * globalToLocal() methods to convert the display object's local - * coordinates to display coordinates, or display coordinates to local - * coordinates, respectively.

- * - *

The getBounds() method is similar to the - * getRect() method; however, the Rectangle returned by the - * getBounds() method includes any strokes on shapes, whereas - * the Rectangle returned by the getRect() method does not. For - * an example, see the description of the getRect() method.

- * - * @param targetCoordinateSpace The display object that defines the - * coordinate system to use. - * @return The rectangle that defines the area of the display object relative - * to the targetCoordinateSpace object's coordinate - * system. - */ - public getBounds(targetCoordinateSpace: DisplayObject): geom.Rectangle; - /** - * Returns a rectangle that defines the boundary of the display object, based - * on the coordinate system defined by the targetCoordinateSpace - * parameter, excluding any strokes on shapes. The values that the - * getRect() method returns are the same or smaller than those - * returned by the getBounds() method. - * - *

Note: Use localToGlobal() and - * globalToLocal() methods to convert the display object's local - * coordinates to Stage coordinates, or Stage coordinates to local - * coordinates, respectively.

- * - * @param targetCoordinateSpace The display object that defines the - * coordinate system to use. - * @return The rectangle that defines the area of the display object relative - * to the targetCoordinateSpace object's coordinate - * system. - */ - public getRect(targetCoordinateSpace: DisplayObject): geom.Rectangle; - /** - * Converts the point object from the Stage(global) coordinates - * to the display object's(local) coordinates. - * - *

To use this method, first create an instance of the Point class. The - * x and y values that you assign represent global coordinates - * because they relate to the origin(0,0) of the main display area. Then - * pass the Point instance as the parameter to the - * globalToLocal() method. The method returns a new Point object - * with x and y values that relate to the origin of the display - * object instead of the origin of the Stage.

- * - * @param point An object created with the Point class. The Point object - * specifies the x and y coordinates as - * properties. - * @return A Point object with coordinates relative to the display object. - */ - public globalToLocal(point: geom.Point): geom.Point; - /** - * Converts a two-dimensional point from the Stage(global) coordinates to a - * three-dimensional display object's(local) coordinates. - * - *

To use this method, first create an instance of the Point class. The x - * and y values that you assign to the Point object represent global - * coordinates because they are relative to the origin(0,0) of the main - * display area. Then pass the Point object to the - * globalToLocal3D() method as the point parameter. - * The method returns three-dimensional coordinates as a Vector3D object - * containing x, y, and z values that - * are relative to the origin of the three-dimensional display object.

- * - * @param point A two dimensional Point object representing global x and y - * coordinates. - * @return A Vector3D object with coordinates relative to the - * three-dimensional display object. - */ - public globalToLocal3D(point: geom.Point): geom.Vector3D; - /** - * Evaluates the bounding box of the display object to see if it overlaps or - * intersects with the bounding box of the obj display object. - * - * @param obj The display object to test against. - * @return true if the bounding boxes of the display objects - * intersect; false if not. - */ - public hitTestObject(obj: DisplayObject): boolean; - /** - * Evaluates the display object to see if it overlaps or intersects with the - * point specified by the x and y parameters. The - * x and y parameters specify a point in the - * coordinate space of the Stage, not the display object container that - * contains the display object(unless that display object container is the - * Stage). - * - * @param x The x coordinate to test against this object. - * @param y The y coordinate to test against this object. - * @param shapeFlag Whether to check against the actual pixels of the object - * (true) or the bounding box - * (false). - * @return true if the display object overlaps or intersects - * with the specified point; false otherwise. - */ - public hitTestPoint(x: number, y: number, shapeFlag?: boolean): boolean; - /** - * @inheritDoc - */ - public isIntersectingRay(rayPosition: geom.Vector3D, rayDirection: geom.Vector3D): boolean; - /** - * Converts a three-dimensional point of the three-dimensional display - * object's(local) coordinates to a two-dimensional point in the Stage - * (global) coordinates. - * - *

For example, you can only use two-dimensional coordinates(x,y) to draw - * with the display.Graphics methods. To draw a - * three-dimensional object, you need to map the three-dimensional - * coordinates of a display object to two-dimensional coordinates. First, - * create an instance of the Vector3D class that holds the x-, y-, and z- - * coordinates of the three-dimensional display object. Then pass the - * Vector3D object to the local3DToGlobal() method as the - * point3d parameter. The method returns a two-dimensional Point - * object that can be used with the Graphics API to draw the - * three-dimensional object.

- * - * @param point3d A Vector3D object containing either a three-dimensional - * point or the coordinates of the three-dimensional display - * object. - * @return A two-dimensional point representing a three-dimensional point in - * two-dimensional space. - */ - public local3DToGlobal(point3d: geom.Vector3D): geom.Point; - /** - * Rotates the 3d object around to face a point defined relative to the local coordinates of the parent ObjectContainer3D. - * - * @param target The vector defining the point to be looked at - * @param upAxis An optional vector used to define the desired up orientation of the 3d object after rotation has occurred - */ - public lookAt(target: geom.Vector3D, upAxis?: geom.Vector3D): void; - /** - * Converts the point object from the display object's(local) - * coordinates to the Stage(global) coordinates. - * - *

This method allows you to convert any given x and y - * coordinates from values that are relative to the origin(0,0) of a - * specific display object(local coordinates) to values that are relative to - * the origin of the Stage(global coordinates).

- * - *

To use this method, first create an instance of the Point class. The - * x and y values that you assign represent local coordinates - * because they relate to the origin of the display object.

- * - *

You then pass the Point instance that you created as the parameter to - * the localToGlobal() method. The method returns a new Point - * object with x and y values that relate to the origin of the - * Stage instead of the origin of the display object.

- * - * @param point The name or identifier of a point created with the Point - * class, specifying the x and y coordinates as - * properties. - * @return A Point object with coordinates relative to the Stage. - */ - public localToGlobal(point: geom.Point): geom.Point; - /** - * Moves the 3d object directly to a point in space - * - * @param dx The amount of movement along the local x axis. - * @param dy The amount of movement along the local y axis. - * @param dz The amount of movement along the local z axis. - */ - public moveTo(dx: number, dy: number, dz: number): void; - /** - * Moves the local point around which the object rotates. - * - * @param dx The amount of movement along the local x axis. - * @param dy The amount of movement along the local y axis. - * @param dz The amount of movement along the local z axis. - */ - public movePivot(dx: number, dy: number, dz: number): void; - /** - * Rotates the 3d object around it's local x-axis - * - * @param angle The amount of rotation in degrees - */ - public pitch(angle: number): void; - /** - * - */ - public getRenderSceneTransform(camera: entities.Camera): geom.Matrix3D; - /** - * Rotates the 3d object around it's local z-axis - * - * @param angle The amount of rotation in degrees - */ - public roll(angle: number): void; - /** - * Rotates the 3d object around an axis by a defined angle - * - * @param axis The vector defining the axis of rotation - * @param angle The amount of rotation in degrees - */ - public rotate(axis: geom.Vector3D, angle: number): void; - /** - * Rotates the 3d object directly to a euler angle - * - * @param ax The angle in degrees of the rotation around the x axis. - * @param ay The angle in degrees of the rotation around the y axis. - * @param az The angle in degrees of the rotation around the z axis. - */ - public rotateTo(ax: number, ay: number, az: number): void; - /** - * - */ - public removeEventListener(type: string, listener: Function): void; - /** - * Moves the 3d object along a vector by a defined length - * - * @param axis The vector defining the axis of movement - * @param distance The length of the movement - */ - public translate(axis: geom.Vector3D, distance: number): void; - /** - * Moves the 3d object along a vector by a defined length - * - * @param axis The vector defining the axis of movement - * @param distance The length of the movement - */ - public translateLocal(axis: geom.Vector3D, distance: number): void; - /** - * Rotates the 3d object around it's local y-axis - * - * @param angle The amount of rotation in degrees - */ - public yaw(angle: number): void; - /** - * @internal - */ - public _iController: controllers.ControllerBase; - /** - * @internal - */ - public _iAssignedPartition : partition.Partition; - /** - * The transformation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - * - * @internal - */ - public _iMatrix3D : geom.Matrix3D; - /** - * @internal - */ - public _iPickingCollisionVO : pick.PickingCollisionVO; - /** - * @internal - */ - public iSetParent(value: containers.DisplayObjectContainer): void; - /** - * @protected - */ - public pCreateDefaultBoundingVolume(): bounds.BoundingVolumeBase; - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.EntityNode; - /** - * @protected - */ - public pInvalidateBounds(): void; - /** - * @protected - */ - public pInvalidateSceneTransform(): void; - /** - * @protected - */ - public pUpdateBounds(): void; - /** - * @protected - */ - public _pUpdateImplicitMouseEnabled(value: boolean): void; - /** - * @protected - */ - public _pUpdateImplicitPartition(value: partition.Partition): void; - /** - * @protected - */ - public _pUpdateImplicitVisibility(value: boolean): void; - /** - * @protected - */ - public _pUpdateMatrix3D(): void; - /** - * @protected - */ - public pUpdateSceneTransform(): void; - public _iAddRenderable(renderable: pool.IRenderable): pool.IRenderable; - public _iRemoveRenderable(renderable: pool.IRenderable): pool.IRenderable; - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - public _iTestCollision(shortestCollisionDistance: number, findClosest: boolean): boolean; - /** - * - */ - public _iInternalUpdate(): void; - /** - * @internal - */ - public _iIsVisible(): boolean; - /** - * @internal - */ - public _iIsMouseEnabled(): boolean; - /** - * @internal - */ - public _iSetScene(value: containers.Scene): void; - /** - * @protected - */ - public _pUpdateScene(value: containers.Scene): void; - /** - * @private - */ - private notifyPositionChanged(); - /** - * @private - */ - private notifyRotationChanged(); - /** - * @private - */ - private notifyScaleChanged(); - /** - * @private - */ - private notifySceneChange(); - /** - * @private - */ - private notifySceneTransformChange(); - /** - * Invalidates the 3D transformation matrix, causing it to be updated upon the next request - * - * @private - */ - private invalidateMatrix3D(); - /** - * @private - */ - private invalidatePartition(); - /** - * @private - */ - private invalidatePivot(); - /** - * @private - */ - private invalidatePosition(); - /** - * @private - */ - private invalidateRotation(); - /** - * @private - */ - private invalidateScale(); - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * - * Geometry is a collection of SubGeometries, each of which contain the actual geometrical data such as vertices, - * normals, uvs, etc. It also contains a reference to an animation class, which defines how the geometry moves. - * A Geometry object is assigned to a Mesh, a scene graph occurence of the geometry, which in turn assigns - * the SubGeometries to its respective TriangleSubMesh objects. - * - * - * - * @see away.core.base.SubGeometry - * @see away.entities.Mesh - * - * @class away.base.Geometry - */ - class Geometry extends library.NamedAssetBase implements library.IAsset { - private _subGeometries; - public assetType : string; - /** - * A collection of TriangleSubGeometry objects, each of which contain geometrical data such as vertices, normals, etc. - */ - public subGeometries : SubGeometryBase[]; - public getSubGeometries(): SubGeometryBase[]; - /** - * Creates a new Geometry object. - */ - constructor(); - public applyTransformation(transform: geom.Matrix3D): void; - /** - * Adds a new TriangleSubGeometry object to the list. - * @param subGeometry The TriangleSubGeometry object to be added. - */ - public addSubGeometry(subGeometry: SubGeometryBase): void; - /** - * Removes a new TriangleSubGeometry object from the list. - * @param subGeometry The TriangleSubGeometry object to be removed. - */ - public removeSubGeometry(subGeometry: SubGeometryBase): void; - /** - * Clones the geometry. - * @return An exact duplicate of the current Geometry object. - */ - public clone(): Geometry; - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - public scale(scale: number): void; - /** - * Clears all resources used by the Geometry object, including SubGeometries. - */ - public dispose(): void; - /** - * Scales the uv coordinates (tiling) - * @param scaleU The amount by which to scale on the u axis. Default is 1; - * @param scaleV The amount by which to scale on the v axis. Default is 1; - */ - public scaleUV(scaleU?: number, scaleV?: number): void; - public iInvalidateBounds(subGeom: SubGeometryBase): void; - } -} -/** -* The GradientType class provides values for the type parameter -* in the beginGradientFill() and -* lineGradientStyle() methods of the flash.display.Graphics -* class. -*/ -declare module away.base { - class GradientType { - /** - * Value used to specify a linear gradient fill. - */ - static LINEAR: string; - /** - * Value used to specify a radial gradient fill. - */ - static RADIAL: string; - } -} -/** -* The Graphics class contains a set of methods that you can use to create a -* vector shape. Display objects that support drawing include Sprite and Shape -* objects. Each of these classes includes a graphics property -* that is a Graphics object. The following are among those helper functions -* provided for ease of use: drawRect(), -* drawRoundRect(), drawCircle(), and -* drawEllipse(). -* -*

You cannot create a Graphics object directly from ActionScript code. If -* you call new Graphics(), an exception is thrown.

-* -*

The Graphics class is final; it cannot be subclassed.

-*/ -declare module away.base { - class Graphics { - /** - * Fills a drawing area with a bitmap image. The bitmap can be repeated or - * tiled to fill the area. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param bitmap A transparent or opaque bitmap image that contains the bits - * to be displayed. - * @param matrix A matrix object(of the flash.geom.Matrix class), which you - * can use to define transformations on the bitmap. For - * example, you can use the following matrix to rotate a bitmap - * by 45 degrees(pi/4 radians): - * @param repeat If true, the bitmap image repeats in a tiled - * pattern. If false, the bitmap image does not - * repeat, and the edges of the bitmap are used for any fill - * area that extends beyond the bitmap. - * - *

For example, consider the following bitmap(a 20 x - * 20-pixel checkerboard pattern):

- * - *

When repeat is set to true(as - * in the following example), the bitmap fill repeats the - * bitmap:

- * - *

When repeat is set to false, - * the bitmap fill uses the edge pixels for the fill area - * outside the bitmap:

- * @param smooth If false, upscaled bitmap images are rendered - * by using a nearest-neighbor algorithm and look pixelated. If - * true, upscaled bitmap images are rendered by - * using a bilinear algorithm. Rendering by using the nearest - * neighbor algorithm is faster. - */ - public beginBitmapFill(bitmap: BitmapData, matrix?: geom.Matrix, repeat?: boolean, smooth?: boolean): void; - /** - * Specifies a simple one-color fill that subsequent calls to other Graphics - * methods(such as lineTo() or drawCircle()) use - * when drawing. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param color The color of the fill(0xRRGGBB). - * @param alpha The alpha value of the fill(0.0 to 1.0). - */ - public beginFill(color: number, alpha?: number): void; - /** - * Specifies a gradient fill used by subsequent calls to other Graphics - * methods(such as lineTo() or drawCircle()) for - * the object. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param type A value from the GradientType class that - * specifies which gradient type to use: - * GradientType.LINEAR or - * GradientType.RADIAL. - * @param colors An array of RGB hexadecimal color values used - * in the gradient; for example, red is 0xFF0000, - * blue is 0x0000FF, and so on. You can specify - * up to 15 colors. For each color, specify a - * corresponding value in the alphas and ratios - * parameters. - * @param alphas An array of alpha values for the corresponding - * colors in the colors array; valid values are 0 - * to 1. If the value is less than 0, the default - * is 0. If the value is greater than 1, the - * default is 1. - * @param ratios An array of color distribution ratios; valid - * values are 0-255. This value defines the - * percentage of the width where the color is - * sampled at 100%. The value 0 represents the - * left position in the gradient box, and 255 - * represents the right position in the gradient - * box. - * @param matrix A transformation matrix as defined by the - * flash.geom.Matrix class. The flash.geom.Matrix - * class includes a - * createGradientBox() method, which - * lets you conveniently set up the matrix for use - * with the beginGradientFill() - * method. - * @param spreadMethod A value from the SpreadMethod class that - * specifies which spread method to use, either: - * SpreadMethod.PAD, - * SpreadMethod.REFLECT, or - * SpreadMethod.REPEAT. - * - *

For example, consider a simple linear - * gradient between two colors:

- * - *

This example uses - * SpreadMethod.PAD for the spread - * method, and the gradient fill looks like the - * following:

- * - *

If you use SpreadMethod.REFLECT - * for the spread method, the gradient fill looks - * like the following:

- * - *

If you use SpreadMethod.REPEAT - * for the spread method, the gradient fill looks - * like the following:

- * @param interpolationMethod A value from the InterpolationMethod class that - * specifies which value to use: - * InterpolationMethod.LINEAR_RGB or - * InterpolationMethod.RGB - * - *

For example, consider a simple linear - * gradient between two colors(with the - * spreadMethod parameter set to - * SpreadMethod.REFLECT). The - * different interpolation methods affect the - * appearance as follows:

- * @param focalPointRatio A number that controls the location of the - * focal point of the gradient. 0 means that the - * focal point is in the center. 1 means that the - * focal point is at one border of the gradient - * circle. -1 means that the focal point is at the - * other border of the gradient circle. A value - * less than -1 or greater than 1 is rounded to -1 - * or 1. For example, the following example shows - * a focalPointRatio set to 0.75: - * @throws ArgumentError If the type parameter is not valid. - */ - public beginGradientFill(type: GradientType, colors: number[], alphas: number[], ratios: number[], matrix?: geom.Matrix, spreadMethod?: string, interpolationMethod?: string, focalPointRatio?: number): void; - /** - * Clears the graphics that were drawn to this Graphics object, and resets - * fill and line style settings. - * - */ - public clear(): void; - /** - * Copies all of drawing commands from the source Graphics object into the - * calling Graphics object. - * - * @param sourceGraphics The Graphics object from which to copy the drawing - * commands. - */ - public copyFrom(sourceGraphics: Graphics): void; - /** - * Draws a cubic Bezier curve from the current drawing position to the - * specified anchor point. Cubic Bezier curves consist of two anchor points - * and two control points. The curve interpolates the two anchor points and - * curves toward the two control points. - * - * The four points you use to draw a cubic Bezier curve with the - * cubicCurveTo() method are as follows: - * - *
    - *
  • The current drawing position is the first anchor point.
  • - *
  • The anchorX and anchorY parameters specify the second anchor point. - *
  • - *
  • The controlX1 and controlY1 parameters - * specify the first control point.
  • - *
  • The controlX2 and controlY2 parameters - * specify the second control point.
  • - *
- * - * If you call the cubicCurveTo() method before calling the - * moveTo() method, your curve starts at position (0, 0). - * - * If the cubicCurveTo() method succeeds, the Flash runtime sets - * the current drawing position to (anchorX, - * anchorY). If the cubicCurveTo() method fails, - * the current drawing position remains unchanged. - * - * If your movie clip contains content created with the Flash drawing tools, - * the results of calls to the cubicCurveTo() method are drawn - * underneath that content. - * - * @param controlX1 Specifies the horizontal position of the first control - * point relative to the registration point of the parent - * display object. - * @param controlY1 Specifies the vertical position of the first control - * point relative to the registration point of the parent - * display object. - * @param controlX2 Specifies the horizontal position of the second control - * point relative to the registration point of the parent - * display object. - * @param controlY2 Specifies the vertical position of the second control - * point relative to the registration point of the parent - * display object. - * @param anchorX Specifies the horizontal position of the anchor point - * relative to the registration point of the parent display - * object. - * @param anchorY Specifies the vertical position of the anchor point - * relative to the registration point of the parent display - * object. - */ - public cubicCurveTo(controlX1: number, controlY1: number, controlX2: number, controlY2: number, anchorX: number, anchorY: number): void; - /** - * Draws a curve using the current line style from the current drawing - * position to(anchorX, anchorY) and using the control point that - * (controlX, controlY) specifies. The current - * drawing position is then set to(anchorX, - * anchorY). If the movie clip in which you are drawing contains - * content created with the Flash drawing tools, calls to the - * curveTo() method are drawn underneath this content. If you - * call the curveTo() method before any calls to the - * moveTo() method, the default of the current drawing position - * is(0, 0). If any of the parameters are missing, this method fails and the - * current drawing position is not changed. - * - *

The curve drawn is a quadratic Bezier curve. Quadratic Bezier curves - * consist of two anchor points and one control point. The curve interpolates - * the two anchor points and curves toward the control point.

- * - * @param controlX A number that specifies the horizontal position of the - * control point relative to the registration point of the - * parent display object. - * @param controlY A number that specifies the vertical position of the - * control point relative to the registration point of the - * parent display object. - * @param anchorX A number that specifies the horizontal position of the - * next anchor point relative to the registration point of - * the parent display object. - * @param anchorY A number that specifies the vertical position of the next - * anchor point relative to the registration point of the - * parent display object. - */ - public curveTo(controlX: number, controlY: number, anchorX: number, anchorY: number): void; - /** - * Draws a circle. Set the line style, fill, or both before you call the - * drawCircle() method, by calling the linestyle(), - * lineGradientStyle(), beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. - * - * @param x The x location of the center of the circle relative - * to the registration point of the parent display object(in - * pixels). - * @param y The y location of the center of the circle relative - * to the registration point of the parent display object(in - * pixels). - * @param radius The radius of the circle(in pixels). - */ - public drawCircle(x: number, y: number, radius: number): void; - /** - * Draws an ellipse. Set the line style, fill, or both before you call the - * drawEllipse() method, by calling the - * linestyle(), lineGradientStyle(), - * beginFill(), beginGradientFill(), or - * beginBitmapFill() method. - * - * @param x The x location of the top-left of the bounding-box of - * the ellipse relative to the registration point of the parent - * display object(in pixels). - * @param y The y location of the top left of the bounding-box of - * the ellipse relative to the registration point of the parent - * display object(in pixels). - * @param width The width of the ellipse(in pixels). - * @param height The height of the ellipse(in pixels). - */ - public drawEllipse(x: number, y: number, width: number, height: number): void; - /** - * Submits a series of IGraphicsData instances for drawing. This method - * accepts a Vector containing objects including paths, fills, and strokes - * that implement the IGraphicsData interface. A Vector of IGraphicsData - * instances can refer to a part of a shape, or a complex fully defined set - * of data for rendering a complete shape. - * - *

Graphics paths can contain other graphics paths. If the - * graphicsData Vector includes a path, that path and all its - * sub-paths are rendered during this operation.

- * - */ - public drawGraphicsData(graphicsData: IGraphicsData[]): void; - /** - * Submits a series of commands for drawing. The drawPath() - * method uses vector arrays to consolidate individual moveTo(), - * lineTo(), and curveTo() drawing commands into a - * single call. The drawPath() method parameters combine drawing - * commands with x- and y-coordinate value pairs and a drawing direction. The - * drawing commands are values from the GraphicsPathCommand class. The x- and - * y-coordinate value pairs are Numbers in an array where each pair defines a - * coordinate location. The drawing direction is a value from the - * GraphicsPathWinding class. - * - *

Generally, drawings render faster with drawPath() than - * with a series of individual lineTo() and - * curveTo() methods.

- * - *

The drawPath() method uses a uses a floating computation - * so rotation and scaling of shapes is more accurate and gives better - * results. However, curves submitted using the drawPath() - * method can have small sub-pixel alignment errors when used in conjunction - * with the lineTo() and curveTo() methods.

- * - *

The drawPath() method also uses slightly different rules - * for filling and drawing lines. They are:

- * - *
    - *
  • When a fill is applied to rendering a path: - *
      - *
    • A sub-path of less than 3 points is not rendered.(But note that the - * stroke rendering will still occur, consistent with the rules for strokes - * below.)
    • - *
    • A sub-path that isn't closed(the end point is not equal to the - * begin point) is implicitly closed.
    • - *
    - *
  • - *
  • When a stroke is applied to rendering a path: - *
      - *
    • The sub-paths can be composed of any number of points.
    • - *
    • The sub-path is never implicitly closed.
    • - *
    - *
  • - *
- * - * @param winding Specifies the winding rule using a value defined in the - * GraphicsPathWinding class. - */ - public drawPath(commands: number[], data: number[], winding: GraphicsPathWinding): void; - /** - * Draws a rectangle. Set the line style, fill, or both before you call the - * drawRect() method, by calling the linestyle(), - * lineGradientStyle(), beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. - * - * @param x A number indicating the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number indicating the vertical position relative to the - * registration point of the parent display object(in pixels). - * @param width The width of the rectangle(in pixels). - * @param height The height of the rectangle(in pixels). - * @throws ArgumentError If the width or height - * parameters are not a number - * (Number.NaN). - */ - public drawRect(x: number, y: number, width: number, height: number): void; - /** - * Draws a rounded rectangle. Set the line style, fill, or both before you - * call the drawRoundRect() method, by calling the - * linestyle(), lineGradientStyle(), - * beginFill(), beginGradientFill(), or - * beginBitmapFill() method. - * - * @param x A number indicating the horizontal position relative - * to the registration point of the parent display - * object(in pixels). - * @param y A number indicating the vertical position relative to - * the registration point of the parent display object - * (in pixels). - * @param width The width of the round rectangle(in pixels). - * @param height The height of the round rectangle(in pixels). - * @param ellipseWidth The width of the ellipse used to draw the rounded - * corners(in pixels). - * @param ellipseHeight The height of the ellipse used to draw the rounded - * corners(in pixels). Optional; if no value is - * specified, the default value matches that provided - * for the ellipseWidth parameter. - * @throws ArgumentError If the width, height, - * ellipseWidth or - * ellipseHeight parameters are not a - * number(Number.NaN). - */ - public drawRoundRect(x: number, y: number, width: number, height: number, ellipseWidth: number, ellipseHeight?: number): void; - /** - * Renders a set of triangles, typically to distort bitmaps and give them a - * three-dimensional appearance. The drawTriangles() method maps - * either the current fill, or a bitmap fill, to the triangle faces using a - * set of(u,v) coordinates. - * - *

Any type of fill can be used, but if the fill has a transform matrix - * that transform matrix is ignored.

- * - *

A uvtData parameter improves texture mapping when a - * bitmap fill is used.

- * - * @param culling Specifies whether to render triangles that face in a - * specified direction. This parameter prevents the rendering - * of triangles that cannot be seen in the current view. This - * parameter can be set to any value defined by the - * TriangleCulling class. - */ - public drawTriangles(vertices: number[], indices?: number[], uvtData?: number[], culling?: TriangleCulling): void; - /** - * Applies a fill to the lines and curves that were added since the last call - * to the beginFill(), beginGradientFill(), or - * beginBitmapFill() method. Flash uses the fill that was - * specified in the previous call to the beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. If the current drawing position does not equal the previous - * position specified in a moveTo() method and a fill is - * defined, the path is closed with a line and then filled. - * - */ - public endFill(): void; - /** - * Specifies a bitmap to use for the line stroke when drawing lines. - * - *

The bitmap line style is used for subsequent calls to Graphics methods - * such as the lineTo() method or the drawCircle() - * method. The line style remains in effect until you call the - * lineStyle() or lineGradientStyle() methods, or - * the lineBitmapStyle() method again with different parameters. - *

- * - *

You can call the lineBitmapStyle() method in the middle of - * drawing a path to specify different styles for different line segments - * within a path.

- * - *

Call the lineStyle() method before you call the - * lineBitmapStyle() method to enable a stroke, or else the - * value of the line style is undefined.

- * - *

Calls to the clear() method set the line style back to - * undefined.

- * - * @param bitmap The bitmap to use for the line stroke. - * @param matrix An optional transformation matrix as defined by the - * flash.geom.Matrix class. The matrix can be used to scale or - * otherwise manipulate the bitmap before applying it to the - * line style. - * @param repeat Whether to repeat the bitmap in a tiled fashion. - * @param smooth Whether smoothing should be applied to the bitmap. - */ - public lineBitmapStyle(bitmap: BitmapData, matrix?: geom.Matrix, repeat?: boolean, smooth?: boolean): void; - /** - * Specifies a gradient to use for the stroke when drawing lines. - * - *

The gradient line style is used for subsequent calls to Graphics - * methods such as the lineTo() methods or the - * drawCircle() method. The line style remains in effect until - * you call the lineStyle() or lineBitmapStyle() - * methods, or the lineGradientStyle() method again with - * different parameters.

- * - *

You can call the lineGradientStyle() method in the middle - * of drawing a path to specify different styles for different line segments - * within a path.

- * - *

Call the lineStyle() method before you call the - * lineGradientStyle() method to enable a stroke, or else the - * value of the line style is undefined.

- * - *

Calls to the clear() method set the line style back to - * undefined.

- * - * @param type A value from the GradientType class that - * specifies which gradient type to use, either - * GradientType.LINEAR or GradientType.RADIAL. - * @param colors An array of RGB hexadecimal color values used - * in the gradient; for example, red is 0xFF0000, - * blue is 0x0000FF, and so on. You can specify - * up to 15 colors. For each color, specify a - * corresponding value in the alphas and ratios - * parameters. - * @param alphas An array of alpha values for the corresponding - * colors in the colors array; valid values are 0 - * to 1. If the value is less than 0, the default - * is 0. If the value is greater than 1, the - * default is 1. - * @param ratios An array of color distribution ratios; valid - * values are 0-255. This value defines the - * percentage of the width where the color is - * sampled at 100%. The value 0 represents the - * left position in the gradient box, and 255 - * represents the right position in the gradient - * box. - * @param matrix A transformation matrix as defined by the - * flash.geom.Matrix class. The flash.geom.Matrix - * class includes a - * createGradientBox() method, which - * lets you conveniently set up the matrix for use - * with the lineGradientStyle() - * method. - * @param spreadMethod A value from the SpreadMethod class that - * specifies which spread method to use: - * @param interpolationMethod A value from the InterpolationMethod class that - * specifies which value to use. For example, - * consider a simple linear gradient between two - * colors(with the spreadMethod - * parameter set to - * SpreadMethod.REFLECT). The - * different interpolation methods affect the - * appearance as follows: - * @param focalPointRatio A number that controls the location of the - * focal point of the gradient. The value 0 means - * the focal point is in the center. The value 1 - * means the focal point is at one border of the - * gradient circle. The value -1 means that the - * focal point is at the other border of the - * gradient circle. Values less than -1 or greater - * than 1 are rounded to -1 or 1. The following - * image shows a gradient with a - * focalPointRatio of -0.75: - */ - public lineGradientStyle(type: GradientType, colors: number[], alphas: number[], ratios: number[], matrix?: geom.Matrix, spreadMethod?: SpreadMethod, interpolationMethod?: InterpolationMethod, focalPointRatio?: number): void; - /** - * Specifies a line style used for subsequent calls to Graphics methods such - * as the lineTo() method or the drawCircle() - * method. The line style remains in effect until you call the - * lineGradientStyle() method, the - * lineBitmapStyle() method, or the lineStyle() - * method with different parameters. - * - *

You can call the lineStyle() method in the middle of - * drawing a path to specify different styles for different line segments - * within the path.

- * - *

Note: Calls to the clear() method set the line - * style back to undefined.

- * - *

Note: Flash Lite 4 supports only the first three parameters - * (thickness, color, and alpha).

- * - * @param thickness An integer that indicates the thickness of the line in - * points; valid values are 0-255. If a number is not - * specified, or if the parameter is undefined, a line is - * not drawn. If a value of less than 0 is passed, the - * default is 0. The value 0 indicates hairline - * thickness; the maximum thickness is 255. If a value - * greater than 255 is passed, the default is 255. - * @param color A hexadecimal color value of the line; for example, - * red is 0xFF0000, blue is 0x0000FF, and so on. If a - * value is not indicated, the default is 0x000000 - * (black). Optional. - * @param alpha A number that indicates the alpha value of the color - * of the line; valid values are 0 to 1. If a value is - * not indicated, the default is 1(solid). If the value - * is less than 0, the default is 0. If the value is - * greater than 1, the default is 1. - * @param pixelHinting(Not supported in Flash Lite 4) A Boolean value that - * specifies whether to hint strokes to full pixels. This - * affects both the position of anchors of a curve and - * the line stroke size itself. With - * pixelHinting set to true, - * line widths are adjusted to full pixel widths. With - * pixelHinting set to false, - * disjoints can appear for curves and straight lines. - * For example, the following illustrations show how - * Flash Player or Adobe AIR renders two rounded - * rectangles that are identical, except that the - * pixelHinting parameter used in the - * lineStyle() method is set differently - * (the images are scaled by 200%, to emphasize the - * difference): - * - *

If a value is not supplied, the line does not use - * pixel hinting.

- * @param scaleMode (Not supported in Flash Lite 4) A value from the - * LineScaleMode class that specifies which scale mode to - * use: - *
    - *
  • LineScaleMode.NORMAL - Always - * scale the line thickness when the object is scaled - * (the default).
  • - *
  • LineScaleMode.NONE - Never scale - * the line thickness.
  • - *
  • LineScaleMode.VERTICAL - Do not - * scale the line thickness if the object is scaled - * vertically only. For example, consider the - * following circles, drawn with a one-pixel line, and - * each with the scaleMode parameter set to - * LineScaleMode.VERTICAL. The circle on the - * left is scaled vertically only, and the circle on the - * right is scaled both vertically and horizontally: - *
  • - *
  • LineScaleMode.HORIZONTAL - Do not - * scale the line thickness if the object is scaled - * horizontally only. For example, consider the - * following circles, drawn with a one-pixel line, and - * each with the scaleMode parameter set to - * LineScaleMode.HORIZONTAL. The circle on - * the left is scaled horizontally only, and the circle - * on the right is scaled both vertically and - * horizontally:
  • - *
- * @param caps (Not supported in Flash Lite 4) A value from the - * CapsStyle class that specifies the type of caps at the - * end of lines. Valid values are: - * CapsStyle.NONE, - * CapsStyle.ROUND, and - * CapsStyle.SQUARE. If a value is not - * indicated, Flash uses round caps. - * - *

For example, the following illustrations show the - * different capsStyle settings. For each - * setting, the illustration shows a blue line with a - * thickness of 30(for which the capsStyle - * applies), and a superimposed black line with a - * thickness of 1(for which no capsStyle - * applies):

- * @param joints (Not supported in Flash Lite 4) A value from the - * JointStyle class that specifies the type of joint - * appearance used at angles. Valid values are: - * JointStyle.BEVEL, - * JointStyle.MITER, and - * JointStyle.ROUND. If a value is not - * indicated, Flash uses round joints. - * - *

For example, the following illustrations show the - * different joints settings. For each - * setting, the illustration shows an angled blue line - * with a thickness of 30(for which the - * jointStyle applies), and a superimposed - * angled black line with a thickness of 1(for which no - * jointStyle applies):

- * - *

Note: For joints set to - * JointStyle.MITER, you can use the - * miterLimit parameter to limit the length - * of the miter.

- * @param miterLimit (Not supported in Flash Lite 4) A number that - * indicates the limit at which a miter is cut off. Valid - * values range from 1 to 255(and values outside that - * range are rounded to 1 or 255). This value is only - * used if the jointStyle is set to - * "miter". The miterLimit - * value represents the length that a miter can extend - * beyond the point at which the lines meet to form a - * joint. The value expresses a factor of the line - * thickness. For example, with a - * miterLimit factor of 2.5 and a - * thickness of 10 pixels, the miter is cut - * off at 25 pixels. - * - *

For example, consider the following angled lines, - * each drawn with a thickness of 20, but - * with miterLimit set to 1, 2, and 4. - * Superimposed are black reference lines showing the - * meeting points of the joints:

- * - *

Notice that a given miterLimit value - * has a specific maximum angle for which the miter is - * cut off. The following table lists some examples:

- */ - public lineStyle(thickness?: number, color?: number, alpha?: number, pixelHinting?: boolean, scaleMode?: LineScaleMode, caps?: CapsStyle, joints?: JointStyle, miterLimit?: number): void; - /** - * Draws a line using the current line style from the current drawing - * position to(x, y); the current drawing position - * is then set to(x, y). If the display object in - * which you are drawing contains content that was created with the Flash - * drawing tools, calls to the lineTo() method are drawn - * underneath the content. If you call lineTo() before any calls - * to the moveTo() method, the default position for the current - * drawing is(0, 0). If any of the parameters are missing, this - * method fails and the current drawing position is not changed. - * - * @param x A number that indicates the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number that indicates the vertical position relative to the - * registration point of the parent display object(in pixels). - */ - public lineTo(x: number, y: number): void; - /** - * Moves the current drawing position to(x, y). If - * any of the parameters are missing, this method fails and the current - * drawing position is not changed. - * - * @param x A number that indicates the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number that indicates the vertical position relative to the - * registration point of the parent display object(in pixels). - */ - public moveTo(x: number, y: number): void; - } -} -/** -* The GraphicsPathWinding class provides values for the -* flash.display.GraphicsPath.winding property and the -* flash.display.Graphics.drawPath() method to determine the -* direction to draw a path. A clockwise path is positively wound, and a -* counter-clockwise path is negatively wound: -* -*

When paths intersect or overlap, the winding direction determines the -* rules for filling the areas created by the intersection or overlap:

-*/ -declare module away.base { - class GraphicsPathWinding { - static EVEN_ODD: string; - static NON_ZERO: string; - } -} -/** -* The IBitmapDrawable interface is implemented by objects that can be passed as the -* source parameter of the draw() method of the BitmapData class. These -* objects are of type BitmapData or DisplayObject. -* -* @see away.base.BitmapData#draw() -* @see away.base.BitmapData -* @see away.base.DisplayObject -*/ -declare module away.base { - interface IBitmapDrawable { - } -} -/** -* This interface is used to define objects that can be used as parameters in the -* away.base.Graphics methods, including fills, strokes, and paths. Use -* the implementor classes of this interface to create and manage drawing property -* data, and to reuse the same data for different instances. Then, use the methods of -* the Graphics class to render the drawing objects. -* -* @see away.base.Graphics.drawGraphicsData() -* @see away.base.Graphics.readGraphicsData() -*/ -declare module away.base { - interface IGraphicsData { - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * IMaterialOwner provides an interface for objects that can use materials. - * - * @interface away.base.IMaterialOwner - */ - interface IMaterialOwner extends library.IAsset { - /** - * The animation used by the material owner to assemble the vertex code. - */ - animator: animators.IAnimator; - /** - * The material with which to render the object. - */ - material: materials.MaterialBase; - /** - * - */ - uvTransform: geom.UVTransform; - /** - * - * @param renderable - * @private - */ - _iAddRenderable(renderable: pool.IRenderable): pool.IRenderable; - /** - * - * @param renderable - * @private - */ - _iRemoveRenderable(renderable: pool.IRenderable): pool.IRenderable; - /** - * - * @param renderer - * @private - */ - _iCollectRenderable(renderer: render.IRenderer): any; - } -} -/** -* The InterpolationMethod class provides values for the -* interpolationMethod parameter in the -* Graphics.beginGradientFill() and -* Graphics.lineGradientStyle() methods. This parameter -* determines the RGB space to use when rendering the gradient. -*/ -declare module away.base { - class InterpolationMethod { - /** - * Specifies that the RGB interpolation method should be used. This means - * that the gradient is rendered with exponential sRGB(standard RGB) space. - * The sRGB space is a W3C-endorsed standard that defines a non-linear - * conversion between red, green, and blue component values and the actual - * intensity of the visible component color. - * - *

For example, consider a simple linear gradient between two colors(with - * the spreadMethod parameter set to - * SpreadMethod.REFLECT). The different interpolation methods - * affect the appearance as follows:

- */ - static LINEAR_RGB: string; - /** - * Specifies that the RGB interpolation method should be used. This means - * that the gradient is rendered with exponential sRGB(standard RGB) space. - * The sRGB space is a W3C-endorsed standard that defines a non-linear - * conversion between red, green, and blue component values and the actual - * intensity of the visible component color. - * - *

For example, consider a simple linear gradient between two colors(with - * the spreadMethod parameter set to - * SpreadMethod.REFLECT). The different interpolation methods - * affect the appearance as follows:

- */ - static RGB: string; - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * ISubMesh is an interface for object SubMesh that is used to - * apply a material to a SubGeometry class - * - * @class away.base.ISubMesh - */ - interface ISubMesh extends IMaterialOwner { - subGeometry: SubGeometryBase; - parentMesh: entities.Mesh; - _iIndex: number; - _iInvalidateRenderableGeometry(): any; - _iGetExplicitMaterial(): materials.MaterialBase; - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * ISubMeshClass is an interface for the constructable class definition ISubMesh that is used to - * apply a material to a SubGeometry class - * - * @class away.base.ISubMeshClass - */ - interface ISubMeshClass { - /** - * - */ - new(subGeometry: SubGeometryBase, parentMesh: entities.Mesh, material?: materials.MaterialBase): ISubMesh; - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * @class away.base.TriangleSubGeometry - */ - class SubGeometryBase extends library.NamedAssetBase { - static VERTEX_DATA: string; - public _pStrideOffsetDirty: boolean; - public _pIndices: number[]; - public _pVertices: number[]; - private _numIndices; - private _numTriangles; - public _pNumVertices: number; - public _pConcatenateArrays: boolean; - private _indicesUpdated; - public _pStride: Object; - public _pOffset: Object; - public _pUpdateStrideOffset(): void; - public _pSubMeshClass: ISubMeshClass; - public subMeshClass : ISubMeshClass; - /** - * - */ - public concatenateArrays : boolean; - /** - * The raw index data that define the faces. - */ - public indices : number[]; - /** - * - */ - public vertices : number[]; - /** - * The total amount of triangles in the TriangleSubGeometry. - */ - public numTriangles : number; - public numVertices : number; - /** - * - */ - constructor(concatenatedArrays: boolean); - /** - * - */ - public getStride(dataType: string): any; - /** - * - */ - public getOffset(dataType: string): any; - public updateVertices(): void; - /** - * - */ - public dispose(): void; - /** - * Updates the face indices of the TriangleSubGeometry. - * - * @param indices The face indices to upload. - */ - public updateIndices(indices: number[]): void; - /** - * @protected - */ - public pInvalidateBounds(): void; - /** - * The Geometry object that 'owns' this TriangleSubGeometry object. - * - * @private - */ - public parentGeometry: Geometry; - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - public clone(): SubGeometryBase; - public applyTransformation(transform: geom.Matrix3D): void; - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - public scale(scale: number): void; - public scaleUV(scaleU?: number, scaleV?: number): void; - public getBoundingPositions(): number[]; - private notifyIndicesUpdate(); - public _pNotifyVerticesUpdate(): void; - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * SubMeshBase wraps a TriangleSubGeometry as a scene graph instantiation. A SubMeshBase is owned by a Mesh object. - * - * - * @see away.base.TriangleSubGeometry - * @see away.entities.Mesh - * - * @class away.base.SubMeshBase - */ - class SubMeshBase extends library.NamedAssetBase { - public _pParentMesh: entities.Mesh; - public _uvTransform: geom.UVTransform; - public _iIndex: number; - public _material: materials.MaterialBase; - private _renderables; - /** - * The animator object that provides the state for the TriangleSubMesh's animation. - */ - public animator : animators.IAnimator; - /** - * The material used to render the current TriangleSubMesh. If set to null, its parent Mesh's material will be used instead. - */ - public material : materials.MaterialBase; - /** - * The scene transform object that transforms from model to world space. - */ - public sceneTransform : geom.Matrix3D; - /** - * The entity that that initially provided the IRenderable to the render pipeline (ie: the owning Mesh object). - */ - public parentMesh : entities.Mesh; - /** - * - */ - public uvTransform : geom.UVTransform; - /** - * Creates a new SubMeshBase object - */ - constructor(); - /** - * - */ - public dispose(): void; - /** - * - * @param camera - * @returns {away.geom.Matrix3D} - */ - public getRenderSceneTransform(camera: entities.Camera): geom.Matrix3D; - public _iAddRenderable(renderable: pool.IRenderable): pool.IRenderable; - public _iRemoveRenderable(renderable: pool.IRenderable): pool.IRenderable; - public _iInvalidateRenderableGeometry(): void; - public _iCollectRenderable(renderer: render.IRenderer): void; - public _iGetExplicitMaterial(): materials.MaterialBase; - } -} -/** -* The JointStyle class is an enumeration of constant values that specify the -* joint style to use in drawing lines. These constants are provided for use -* as values in the joints parameter of the -* flash.display.Graphics.lineStyle() method. The method supports -* three types of joints: miter, round, and bevel, as the following example -* shows: -*/ -declare module away.base { - class JointStyle { - /** - * Specifies beveled joints in the joints parameter of the - * flash.display.Graphics.lineStyle() method. - */ - static BEVEL: string; - /** - * Specifies mitered joints in the joints parameter of the - * flash.display.Graphics.lineStyle() method. - */ - static MITER: string; - /** - * Specifies round joints in the joints parameter of the - * flash.display.Graphics.lineStyle() method. - */ - static ROUND: string; - } -} -/** -* The LineScaleMode class provides values for the scaleMode -* parameter in the Graphics.lineStyle() method. -*/ -declare module away.base { - class LineScaleMode { - /** - * With this setting used as the scaleMode parameter of the - * lineStyle() method, the thickness of the line scales - * only vertically. For example, consider the following circles, drawn - * with a one-pixel line, and each with the scaleMode parameter - * set to LineScaleMode.VERTICAL. The circle on the left is - * scaled only vertically, and the circle on the right is scaled both - * vertically and horizontally. - */ - static HORIZONTAL: string; - /** - * With this setting used as the scaleMode parameter of the - * lineStyle() method, the thickness of the line never scales. - */ - static NONE: string; - /** - * With this setting used as the scaleMode parameter of the - * lineStyle() method, the thickness of the line always scales - * when the object is scaled(the default). - */ - static NORMAL: string; - /** - * With this setting used as the scaleMode parameter of the - * lineStyle() method, the thickness of the line scales - * only horizontally. For example, consider the following circles, - * drawn with a one-pixel line, and each with the scaleMode - * parameter set to LineScaleMode.HORIZONTAL. The circle on the - * left is scaled only horizontally, and the circle on the right is scaled - * both vertically and horizontally. - */ - static VERTICAL: string; - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * @class away.base.TriangleSubGeometry - */ - class LineSubGeometry extends SubGeometryBase { - static VERTEX_DATA: string; - static START_POSITION_DATA: string; - static END_POSITION_DATA: string; - static THICKNESS_DATA: string; - static COLOR_DATA: string; - static POSITION_FORMAT: string; - static COLOR_FORMAT: string; - static THICKNESS_FORMAT: string; - private _positionsDirty; - private _boundingPositionDirty; - private _thicknessDirty; - private _colorsDirty; - private _startPositions; - private _endPositions; - private _boundingPositions; - private _thickness; - private _startColors; - private _endColors; - private _numSegments; - private _positionsUpdated; - private _thicknessUpdated; - private _colorUpdated; - public _pUpdateStrideOffset(): void; - /** - * - */ - public vertices : number[]; - /** - * - */ - public startPositions : number[]; - /** - * - */ - public endPositions : number[]; - /** - * - */ - public thickness : number[]; - /** - * - */ - public startColors : number[]; - /** - * - */ - public endColors : number[]; - /** - * The total amount of segments in the TriangleSubGeometry. - */ - public numSegments : number; - /** - * - */ - constructor(); - public getBoundingPositions(): number[]; - /** - * - */ - public updatePositions(startValues: number[], endValues: number[]): void; - /** - * Updates the thickness. - */ - public updateThickness(values: number[]): void; - /** - * - */ - public updateColors(startValues: number[], endValues: number[]): void; - /** - * - */ - public dispose(): void; - /** - * @protected - */ - public pInvalidateBounds(): void; - /** - * The Geometry object that 'owns' this TriangleSubGeometry object. - * - * @private - */ - public parentGeometry: Geometry; - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - public clone(): LineSubGeometry; - public _pNotifyVerticesUpdate(): void; - private notifyPositionsUpdate(); - private notifyThicknessUpdate(); - private notifyColorsUpdate(); - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * LineSubMesh wraps a LineSubGeometry as a scene graph instantiation. A LineSubMesh is owned by a Mesh object. - * - * - * @see away.base.LineSubGeometry - * @see away.entities.Mesh - * - * @class away.base.LineSubMesh - */ - class LineSubMesh extends SubMeshBase implements ISubMesh { - private _subGeometry; - /** - * - */ - public assetType : string; - /** - * The LineSubGeometry object which provides the geometry data for this LineSubMesh. - */ - public subGeometry : LineSubGeometry; - /** - * Creates a new LineSubMesh object - * @param subGeometry The LineSubGeometry object which provides the geometry data for this LineSubMesh. - * @param parentMesh The Mesh object to which this LineSubMesh belongs. - * @param material An optional material used to render this LineSubMesh. - */ - constructor(subGeometry: LineSubGeometry, parentMesh: entities.Mesh, material?: materials.MaterialBase); - /** - * - */ - public dispose(): void; - public _iCollectRenderable(renderer: render.IRenderer): void; - } -} -/** -* The LoaderInfo class provides information about a loaded SWF file or a -* loaded image file(JPEG, GIF, or PNG). LoaderInfo objects are available for -* any display object. The information provided includes load progress, the -* URLs of the loader and loaded content, the number of bytes total for the -* media, and the nominal height and width of the media. -* -*

You can access LoaderInfo objects in two ways:

-* -*
    -*
  • The contentLoaderInfo property of a flash.display.Loader -* object - The contentLoaderInfo property is always available -* for any Loader object. For a Loader object that has not called the -* load() or loadBytes() method, or that has not -* sufficiently loaded, attempting to access many of the properties of the -* contentLoaderInfo property throws an error.
  • -*
  • The loaderInfo property of a display object.
  • -*
-* -*

The contentLoaderInfo property of a Loader object provides -* information about the content that the Loader object is loading, whereas -* the loaderInfo property of a DisplayObject provides -* information about the root SWF file for that display object.

-* -*

When you use a Loader object to load a display object(such as a SWF -* file or a bitmap), the loaderInfo property of the display -* object is the same as the contentLoaderInfo property of the -* Loader object(DisplayObject.loaderInfo = -* Loader.contentLoaderInfo). Because the instance of the main class of -* the SWF file has no Loader object, the loaderInfo property is -* the only way to access the LoaderInfo for the instance of the main class of -* the SWF file.

-* -*

The following diagram shows the different uses of the LoaderInfo -* object - for the instance of the main class of the SWF file, for the -* contentLoaderInfo property of a Loader object, and for the -* loaderInfo property of a loaded object:

-* -*

When a loading operation is not complete, some properties of the -* contentLoaderInfo property of a Loader object are not -* available. You can obtain some properties, such as -* bytesLoaded, bytesTotal, url, -* loaderURL, and applicationDomain. When the -* loaderInfo object dispatches the init event, you -* can access all properties of the loaderInfo object and the -* loaded image or SWF file.

-* -*

Note: All properties of LoaderInfo objects are read-only.

-* -*

The EventDispatcher.dispatchEvent() method is not -* applicable to LoaderInfo objects. If you call dispatchEvent() -* on a LoaderInfo object, an IllegalOperationError exception is thrown.

-* -* @event complete Dispatched when data has loaded successfully. In other -* words, it is dispatched when all the content has been -* downloaded and the loading has finished. The -* complete event is always dispatched after -* the init event. The init event -* is dispatched when the object is ready to access, though -* the content may still be downloading. -* @event httpStatus Dispatched when a network request is made over HTTP and -* an HTTP status code can be detected. -* @event init Dispatched when the properties and methods of a loaded -* SWF file are accessible and ready for use. The content, -* however, can still be downloading. A LoaderInfo object -* dispatches the init event when the following -* conditions exist: -*
    -*
  • All properties and methods associated with the -* loaded object and those associated with the LoaderInfo -* object are accessible.
  • -*
  • The constructors for all child objects have -* completed.
  • -*
  • All ActionScript code in the first frame of the -* loaded SWF's main timeline has been executed.
  • -*
-* -*

For example, an Event.INIT is dispatched -* when the first frame of a movie or animation is loaded. -* The movie is then accessible and can be added to the -* display list. The complete movie, however, can take -* longer to download. The Event.COMPLETE is -* only dispatched once the full movie is loaded.

-* -*

The init event always precedes the -* complete event.

-* @event ioError Dispatched when an input or output error occurs that -* causes a load operation to fail. -* @event open Dispatched when a load operation starts. -* @event progress Dispatched when data is received as the download -* operation progresses. -* @event unload Dispatched by a LoaderInfo object whenever a loaded -* object is removed by using the unload() -* method of the Loader object, or when a second load is -* performed by the same Loader object and the original -* content is removed prior to the load beginning. -*/ -declare module away.base { - class LoaderInfo extends events.EventDispatcher { - private _bytes; - private _bytesLoaded; - private _bytesTotal; - private _content; - private _contentType; - private _loader; - private _url; - /** - * The bytes associated with a LoaderInfo object. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the loaded object due to security - * restrictions. This situation can occur, for - * instance, when a Loader object attempts to access - * the contentLoaderInfo.content property - * and it is not granted security permission to access - * the loaded content. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - public bytes : utils.ByteArray; - /** - * The number of bytes that are loaded for the media. When this number equals - * the value of bytesTotal, all of the bytes are loaded. - */ - public bytesLoaded : number; - /** - * The number of compressed bytes in the entire media file. - * - *

Before the first progress event is dispatched by this - * LoaderInfo object's corresponding Loader object, bytesTotal - * is 0. After the first progress event from the Loader object, - * bytesTotal reflects the actual number of bytes to be - * downloaded.

- */ - public bytesTotal : number; - /** - * The loaded object associated with this LoaderInfo object. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the loaded object due to security - * restrictions. This situation can occur, for - * instance, when a Loader object attempts to access - * the contentLoaderInfo.content property - * and it is not granted security permission to access - * the loaded content. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - public content : DisplayObject; - /** - * The MIME type of the loaded file. The value is null if not - * enough of the file has loaded in order to determine the type. The - * following list gives the possible values: - *
    - *
  • "application/x-shockwave-flash"
  • - *
  • "image/jpeg"
  • - *
  • "image/gif"
  • - *
  • "image/png"
  • - *
- */ - public contentType : string; - /** - * The Loader object associated with this LoaderInfo object. If this - * LoaderInfo object is the loaderInfo property of the instance - * of the main class of the SWF file, no Loader object is associated. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the Loader object because of security - * restrictions. This can occur, for instance, when a - * loaded SWF file attempts to access its - * loaderInfo.loader property and it is - * not granted security permission to access the - * loading SWF file. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - public loader : containers.Loader; - /** - * The URL of the media being loaded. - * - *

Before the first progress event is dispatched by this - * LoaderInfo object's corresponding Loader object, the value of the - * url property might reflect only the initial URL specified in - * the call to the load() method of the Loader object. After the - * first progress event, the url property reflects - * the media's final URL, after any redirects and relative URLs are - * resolved.

- * - *

In some cases, the value of the url property is truncated; - * see the isURLInaccessible property for details.

- */ - public url : string; - } -} -/** -* The PixelSnapping class is an enumeration of constant values for setting -* the pixel snapping options by using the pixelSnapping property -* of a Bitmap object. -*/ -declare module away.base { - class PixelSnapping { - /** - * A constant value used in the pixelSnapping property of a - * Bitmap object to specify that the bitmap image is always snapped to the - * nearest pixel, independent of any transformation. - */ - static ALWAYS: string; - /** - * A constant value used in the pixelSnapping property of a - * Bitmap object to specify that the bitmap image is snapped to the nearest - * pixel if it is drawn with no rotation or skew and it is drawn at a scale - * factor of 99.9% to 100.1%. If these conditions are satisfied, the image is - * drawn at 100% scale, snapped to the nearest pixel. Internally, this - * setting allows the image to be drawn as fast as possible by using the - * vector renderer. - */ - static AUTO: string; - /** - * A constant value used in the pixelSnapping property of a - * Bitmap object to specify that no pixel snapping occurs. - */ - static NEVER: string; - } -} -/** -* The SpreadMethod class provides values for the spreadMethod -* parameter in the beginGradientFill() and -* lineGradientStyle() methods of the Graphics class. -* -*

The following example shows the same gradient fill using various spread -* methods:

-*/ -declare module away.base { - class SpreadMethod { - /** - * Specifies that the gradient use the pad spread method. - */ - static PAD: string; - /** - * Specifies that the gradient use the reflect spread method. - */ - static REFLECT: string; - /** - * Specifies that the gradient use the repeat spread method. - */ - static REPEAT: string; - } -} -declare module away.base { - /** - * Stage provides a proxy class to handle the creation and attachment of the Context - * (and in turn the back buffer) it uses. Stage should never be created directly, - * but requested through StageManager. - * - * @see away.managers.StageManager - * - */ - class Stage extends events.EventDispatcher { - private _context; - private _container; - private _width; - private _height; - private _x; - private _y; - private _stageIndex; - private _usesSoftwareRendering; - private _profile; - private _stageManager; - private _antiAlias; - private _enableDepthAndStencil; - private _contextRequested; - private _renderTarget; - private _renderSurfaceSelector; - private _scissorRect; - private _color; - private _backBufferDirty; - private _viewPort; - private _enterFrame; - private _exitFrame; - private _viewportUpdated; - private _viewportDirty; - private _bufferClear; - private _initialised; - constructor(container: HTMLCanvasElement, stageIndex: number, stageManager: managers.StageManager, forceSoftware?: boolean, profile?: string); - /** - * Requests a Context object to attach to the managed gl canvas. - */ - public requestContext(forceSoftware?: boolean, profile?: string, mode?: string): void; - /** - * The width of the gl canvas - */ - public width : number; - /** - * The height of the gl canvas - */ - public height : number; - /** - * The x position of the gl canvas - */ - public x : number; - /** - * The y position of the gl canvas - */ - public y : number; - public visible : boolean; - public container : HTMLElement; - /** - * The Context object associated with the given stage object. - */ - public context : display.IContext; - private notifyViewportUpdated(); - private notifyEnterFrame(); - private notifyExitFrame(); - public profile : string; - /** - * Disposes the Stage object, freeing the Context attached to the Stage. - */ - public dispose(): void; - /** - * Configures the back buffer associated with the Stage object. - * @param backBufferWidth The width of the backbuffer. - * @param backBufferHeight The height of the backbuffer. - * @param antiAlias The amount of anti-aliasing to use. - * @param enableDepthAndStencil Indicates whether the back buffer contains a depth and stencil buffer. - */ - public configureBackBuffer(backBufferWidth: number, backBufferHeight: number, antiAlias: number, enableDepthAndStencil: boolean): void; - public enableDepthAndStencil : boolean; - public renderTarget : textures.TextureProxyBase; - public renderSurfaceSelector : number; - public clear(): void; - public addEventListener(type: string, listener: Function): void; - /** - * Removes a listener from the EventDispatcher object. Special case for enterframe and exitframe events - will switch StageProxy out of automatic render mode. - * If there is no matching listener registered with the EventDispatcher object, a call to this method has no effect. - * - * @param type The type of event. - * @param listener The listener object to remove. - * @param useCapture Specifies whether the listener was registered for the capture phase or the target and bubbling phases. If the listener was registered for both the capture phase and the target and bubbling phases, two calls to removeEventListener() are required to remove both, one call with useCapture() set to true, and another call with useCapture() set to false. - */ - public removeEventListener(type: string, listener: Function): void; - public scissorRect : geom.Rectangle; - /** - * The index of the Stage which is managed by this instance of StageProxy. - */ - public stageIndex : number; - /** - * Indicates whether the Stage managed by this proxy is running in software mode. - * Remember to wait for the CONTEXT_CREATED event before checking this property, - * as only then will it be guaranteed to be accurate. - */ - public usesSoftwareRendering : boolean; - /** - * The antiAliasing of the Stage. - */ - public antiAlias : number; - /** - * A viewPort rectangle equivalent of the Stage size and position. - */ - public viewPort : geom.Rectangle; - /** - * The background color of the Stage. - */ - public color : number; - /** - * The freshly cleared state of the backbuffer before any rendering - */ - public bufferClear : boolean; - /** - * Frees the Context associated with this StageProxy. - */ - private freeContext(); - /** - * The Enter_Frame handler for processing the proxy.ENTER_FRAME and proxy.EXIT_FRAME event handlers. - * Typically the proxy.ENTER_FRAME listener would render the layers for this Stage instance. - */ - private onEnterFrame(event); - public recoverFromDisposal(): boolean; - private _callback(context); - } -} -/** -* Defines codes for culling algorithms that determine which triangles not to -* render when drawing triangle paths. -* -*

The terms POSITIVE and NEGATIVE refer to the -* sign of a triangle's normal along the z-axis. The normal is a 3D vector -* that is perpendicular to the surface of the triangle.

-* -*

A triangle whose vertices 0, 1, and 2 are arranged in a clockwise order -* has a positive normal value. That is, its normal points in a positive -* z-axis direction, away from the current view point. When the -* TriangleCulling.POSITIVE algorithm is used, triangles with -* positive normals are not rendered. Another term for this is backface -* culling.

-* -*

A triangle whose vertices are arranged in a counter-clockwise order has -* a negative normal value. That is, its normal points in a negative z-axis -* direction, toward the current view point. When the -* TriangleCulling.NEGATIVE algorithm is used, triangles with -* negative normals will not be rendered.

-*/ -declare module away.base { - class TriangleCulling { - /** - * Specifies culling of all triangles facing toward the current view point. - */ - static NEGATIVE: string; - /** - * Specifies no culling. All triangles in the path are rendered. - */ - static NONE: string; - /** - * Specifies culling of all triangles facing away from the current view - * point. This is also known as backface culling. - */ - static POSITIVE: string; - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * @class away.base.TriangleSubGeometry - */ - class TriangleSubGeometry extends SubGeometryBase { - static POSITION_DATA: string; - static NORMAL_DATA: string; - static TANGENT_DATA: string; - static UV_DATA: string; - static SECONDARY_UV_DATA: string; - static JOINT_INDEX_DATA: string; - static JOINT_WEIGHT_DATA: string; - static POSITION_FORMAT: string; - static NORMAL_FORMAT: string; - static TANGENT_FORMAT: string; - static UV_FORMAT: string; - static SECONDARY_UV_FORMAT: string; - private _positionsDirty; - private _faceNormalsDirty; - private _faceTangentsDirty; - private _vertexNormalsDirty; - private _vertexTangentsDirty; - private _uvsDirty; - private _secondaryUVsDirty; - private _jointIndicesDirty; - private _jointWeightsDirty; - private _positions; - private _vertexNormals; - private _vertexTangents; - private _uvs; - private _secondaryUVs; - private _jointIndices; - private _jointWeights; - private _useCondensedIndices; - private _condensedJointIndices; - private _condensedIndexLookUp; - private _numCondensedJoints; - private _jointsPerVertex; - private _concatenateArrays; - private _autoDeriveNormals; - private _autoDeriveTangents; - private _autoDeriveUVs; - private _useFaceWeights; - private _faceNormals; - private _faceTangents; - private _faceWeights; - private _scaleU; - private _scaleV; - private _positionsUpdated; - private _normalsUpdated; - private _tangentsUpdated; - private _uvsUpdated; - private _secondaryUVsUpdated; - private _jointIndicesUpdated; - private _jointWeightsUpdated; - /** - * - */ - public scaleU : number; - /** - * - */ - public scaleV : number; - /** - * Offers the option of enabling GPU accelerated animation on skeletons larger than 32 joints - * by condensing the number of joint index values required per mesh. Only applicable to - * skeleton animations that utilise more than one mesh object. Defaults to false. - */ - public useCondensedIndices : boolean; - public _pUpdateStrideOffset(): void; - /** - * - */ - public jointsPerVertex : number; - /** - * Defines whether a UV buffer should be automatically generated to contain dummy UV coordinates. - * Set to true if a geometry lacks UV data but uses a material that requires it, or leave as false - * in cases where UV data is explicitly defined or the material does not require UV data. - */ - public autoDeriveUVs : boolean; - /** - * True if the vertex normals should be derived from the geometry, false if the vertex normals are set - * explicitly. - */ - public autoDeriveNormals : boolean; - /** - * True if the vertex tangents should be derived from the geometry, false if the vertex normals are set - * explicitly. - */ - public autoDeriveTangents : boolean; - /** - * - */ - public vertices : number[]; - /** - * - */ - public positions : number[]; - /** - * - */ - public vertexNormals : number[]; - /** - * - */ - public vertexTangents : number[]; - /** - * The raw data of the face normals, in the same order as the faces are listed in the index list. - */ - public faceNormals : number[]; - /** - * The raw data of the face tangets, in the same order as the faces are listed in the index list. - */ - public faceTangents : number[]; - /** - * - */ - public uvs : number[]; - /** - * - */ - public secondaryUVs : number[]; - /** - * - */ - public jointIndices : number[]; - /** - * - */ - public jointWeights : number[]; - /** - * Indicates whether or not to take the size of faces into account when auto-deriving vertex normals and tangents. - */ - public useFaceWeights : boolean; - public numCondensedJoints : number; - public condensedIndexLookUp : number[]; - /** - * - */ - constructor(concatenatedArrays: boolean); - public getBoundingPositions(): number[]; - /** - * - */ - public updatePositions(values: number[]): void; - /** - * Updates the vertex normals based on the geometry. - */ - public updateVertexNormals(values: number[]): void; - /** - * Updates the vertex tangents based on the geometry. - */ - public updateVertexTangents(values: number[]): void; - /** - * Updates the uvs based on the geometry. - */ - public updateUVs(values: number[]): void; - /** - * Updates the secondary uvs based on the geometry. - */ - public updateSecondaryUVs(values: number[]): void; - /** - * Updates the joint indices - */ - public updateJointIndices(values: number[]): void; - /** - * Updates the joint weights. - */ - public updateJointWeights(values: number[]): void; - /** - * - */ - public dispose(): void; - /** - * Updates the face indices of the TriangleSubGeometry. - * - * @param indices The face indices to upload. - */ - public updateIndices(indices: number[]): void; - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - public clone(): TriangleSubGeometry; - public scaleUV(scaleU?: number, scaleV?: number): void; - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - public scale(scale: number): void; - public applyTransformation(transform: geom.Matrix3D): void; - /** - * Updates the tangents for each face. - */ - private updateFaceTangents(); - /** - * Updates the normals for each face. - */ - private updateFaceNormals(); - public _pNotifyVerticesUpdate(): void; - private notifyPositionsUpdate(); - private notifyNormalsUpdate(); - private notifyTangentsUpdate(); - private notifyUVsUpdate(); - private notifySecondaryUVsUpdate(); - private notifyJointIndicesUpdate(); - private notifyJointWeightsUpdate(); - } -} -/** -* @module away.base -*/ -declare module away.base { - /** - * TriangleSubMesh wraps a TriangleSubGeometry as a scene graph instantiation. A TriangleSubMesh is owned by a Mesh object. - * - * - * @see away.base.TriangleSubGeometry - * @see away.entities.Mesh - * - * @class away.base.TriangleSubMesh - */ - class TriangleSubMesh extends SubMeshBase implements ISubMesh { - private _subGeometry; - /** - * - */ - public assetType : string; - /** - * The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. - */ - public subGeometry : TriangleSubGeometry; - /** - * Creates a new TriangleSubMesh object - * @param subGeometry The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. - * @param parentMesh The Mesh object to which this TriangleSubMesh belongs. - * @param material An optional material used to render this TriangleSubMesh. - */ - constructor(subGeometry: TriangleSubGeometry, parentMesh: entities.Mesh, material?: materials.MaterialBase); - /** - * - */ - public dispose(): void; - public _iCollectRenderable(renderer: render.IRenderer): void; - } -} -declare module away.textures { - /** - * - */ - class TextureProxyBase extends library.NamedAssetBase implements library.IAsset { - public _pSize: number; - public _pFormat: string; - private _hasMipmaps; - private _generateMipmaps; - private _textureData; - /** - * - */ - constructor(generateMipmaps?: boolean); - public size : number; - public hasMipmaps : boolean; - /** - * - * @returns {string} - */ - public format : string; - /** - * - * @returns {boolean} - */ - public generateMipmaps : boolean; - /** - * - * @returns {string} - */ - public assetType : string; - /** - * - */ - public invalidateContent(): void; - /** - * - * @private - */ - public invalidateSize(): void; - /** - * @inheritDoc - */ - public dispose(): void; - public _iAddTextureData(textureData: pool.ITextureData): pool.ITextureData; - public _iRemoveTextureData(textureData: pool.ITextureData): pool.ITextureData; - } -} -declare module away.textures { - class Texture2DBase extends TextureProxyBase { - private _mipmapData; - private _mipmapDataDirty; - public _pWidth: number; - public _pHeight: number; - /** - * - * @returns {number} - */ - public width : number; - /** - * - * @returns {number} - */ - public height : number; - public size : number; - constructor(generateMipmaps?: boolean); - /** - * @inheritDoc - */ - public dispose(): void; - /** - * - */ - public invalidateContent(): void; - /** - * - * @param width - * @param height - * @private - */ - public _pSetSize(width: number, height: number): void; - public _iGetMipmapData(): base.BitmapData[]; - public _iGetTextureData(): any; - } -} -declare module away.textures { - class CubeTextureBase extends TextureProxyBase { - public _mipmapDataArray: base.BitmapData[][]; - public _mipmapDataDirtyArray: boolean[]; - constructor(generateMipmaps?: boolean); - /** - * - * @param width - * @param height - * @private - */ - public _pSetSize(size: number): void; - /** - * @inheritDoc - */ - public dispose(): void; - /** - * - */ - public invalidateContent(): void; - public _iGetMipmapData(side: number): base.BitmapData[]; - public _iGetTextureData(side: number): any; - } -} -declare module away.textures { - class ImageTexture extends Texture2DBase { - private _htmlImageElement; - /** - * - * @param htmlImageElement - * @param generateMipmaps - */ - constructor(htmlImageElement: HTMLImageElement, generateMipmaps?: boolean); - /** - * - */ - public htmlImageElement : HTMLImageElement; - public _iGetTextureData(): HTMLImageElement; - } -} -declare module away.textures { - class BitmapTexture extends Texture2DBase { - public _bitmapData: base.BitmapData; - /** - * - * @returns {BitmapData} - */ - public bitmapData : base.BitmapData; - constructor(bitmapData: base.BitmapData, generateMipmaps?: boolean); - public dispose(): void; - public _iGetTextureData(): base.BitmapData; - } -} -declare module away.textures { - class RenderTexture extends Texture2DBase { - /** - * - * @returns {number} - */ - public width : number; - /** - * - * @returns {number} - */ - public height : number; - constructor(width: number, height: number); - } -} -declare module away.textures { - class ImageCubeTexture extends CubeTextureBase { - private _htmlImageElements; - /** - * The texture on the cube's right face. - */ - public positiveX : HTMLImageElement; - /** - * The texture on the cube's left face. - */ - public negativeX : HTMLImageElement; - /** - * The texture on the cube's top face. - */ - public positiveY : HTMLImageElement; - /** - * The texture on the cube's bottom face. - */ - public negativeY : HTMLImageElement; - /** - * The texture on the cube's far face. - */ - public positiveZ : HTMLImageElement; - /** - * The texture on the cube's near face. - */ - public negativeZ : HTMLImageElement; - constructor(posX: HTMLImageElement, negX: HTMLImageElement, posY: HTMLImageElement, negY: HTMLImageElement, posZ: HTMLImageElement, negZ: HTMLImageElement, generateMipmaps?: boolean); - private _testSize(value); - public _iGetTextureData(side: number): HTMLImageElement; - } -} -declare module away.textures { - class BitmapCubeTexture extends CubeTextureBase { - private _bitmapDatas; - /** - * The texture on the cube's right face. - */ - public positiveX : base.BitmapData; - /** - * The texture on the cube's left face. - */ - public negativeX : base.BitmapData; - /** - * The texture on the cube's top face. - */ - public positiveY : base.BitmapData; - /** - * The texture on the cube's bottom face. - */ - public negativeY : base.BitmapData; - /** - * The texture on the cube's far face. - */ - public positiveZ : base.BitmapData; - /** - * The texture on the cube's near face. - */ - public negativeZ : base.BitmapData; - constructor(posX: base.BitmapData, negX: base.BitmapData, posY: base.BitmapData, negY: base.BitmapData, posZ: base.BitmapData, negZ: base.BitmapData, generateMipmaps?: boolean); - /** - * - * @param value - * @private - */ - private _testSize(value); - public dispose(): void; - public _iGetTextureData(side: number): base.BitmapData; - } -} -declare module away.textures { - /** - * MipmapGenerator is a helper class that uploads BitmapData to a Texture including mipmap levels. - */ - class MipmapGenerator { - private static _mipMaps; - private static _mipMapUses; - private static _matrix; - private static _rect; - private static _source; - /** - * Uploads a BitmapData with mip maps to a target Texture object. - * @param source The source to upload. - * @param target The target Texture to upload to. - * @param mipmap An optional mip map holder to avoids creating new instances for fe animated materials. - * @param alpha Indicate whether or not the uploaded bitmapData is transparent. - */ - static generateMipMaps(source: HTMLImageElement, output?: base.BitmapData[], alpha?: boolean): any; - static generateMipMaps(source: base.BitmapData, output?: base.BitmapData[], alpha?: boolean): any; - private static _getMipmapHolder(mipMapHolder, newW, newH); - static freeMipMapHolder(mipMapHolder: base.BitmapData): void; - } -} -declare module away.textures { - /** - * A convenience texture that encodes a specular map in the red channel, and the gloss map in the green channel, as expected by BasicSpecularMapMethod - */ - class SpecularBitmapTexture extends BitmapTexture { - private _specularMap; - private _glossMap; - constructor(specularMap?: base.BitmapData, glossMap?: base.BitmapData, generateMipmaps?: boolean); - public specularMap : base.BitmapData; - public glossMap : base.BitmapData; - private _testSize(); - public _iGetTextureData(): base.BitmapData; - } -} -declare module away.parsers { - /** - * ParserBase provides an abstract base class for objects that convert blocks of data to data structures - * supported by away. - * - * If used by AssetLoader to automatically determine the parser type, two public static methods should - * be implemented, with the following signatures: - * - * public static supportsType(extension : string) : boolean - * Indicates whether or not a given file extension is supported by the parser. - * - * public static supportsData(data : *) : boolean - * Tests whether a data block can be parsed by the parser. - * - * Furthermore, for any concrete subtype, the method initHandle should be overridden to immediately - * create the object that will contain the parsed data. This allows ResourceManager to return an object - * handle regardless of whether the object was loaded or not. - * - * @see away.net.AssetLoader - */ - class ParserBase extends events.EventDispatcher { - public _iFileName: string; - private _dataFormat; - private _data; - private _frameLimit; - private _lastFrameTime; - private _pOnIntervalDelegate; - public _pContent: base.DisplayObject; - static supportsType(extension: string): boolean; - private _dependencies; - private _parsingPaused; - private _parsingComplete; - private _parsingFailure; - private _timer; - private _materialMode; - /** - * Returned by proceedParsing to indicate no more parsing is needed. - */ - static PARSING_DONE: boolean; - /** - * Returned by proceedParsing to indicate more parsing is needed, allowing asynchronous parsing. - */ - static MORE_TO_PARSE: boolean; - public content : base.DisplayObject; - /** - * Creates a new ParserBase object - * @param format The data format of the file data to be parsed. Can be either ParserDataFormat.BINARY or ParserDataFormat.PLAIN_TEXT, and should be provided by the concrete subtype. - * - * @see away.loading.parsers.ParserDataFormat - */ - constructor(format: string); - /** - * Validates a bitmapData loaded before assigning to a default BitmapMaterial - */ - public isBitmapDataValid(bitmapData: base.BitmapData): boolean; - public parsingFailure : boolean; - public parsingPaused : boolean; - public parsingComplete : boolean; - public materialMode : number; - public data : any; - /** - * The data format of the file data to be parsed. Options are URLLoaderDataFormat.BINARY, URLLoaderDataFormat.ARRAY_BUFFER, URLLoaderDataFormat.BLOB, URLLoaderDataFormat.VARIABLES or URLLoaderDataFormat.TEXT. - */ - public dataFormat : string; - /** - * Parse data (possibly containing bytearry, plain text or BitmapAsset) asynchronously, meaning that - * the parser will periodically stop parsing so that the AVM may proceed to the - * next frame. - * - * @param data The untyped data object in which the loaded data resides. - * @param frameLimit number of milliseconds of parsing allowed per frame. The - * actual time spent on a frame can exceed this number since time-checks can - * only be performed between logical sections of the parsing procedure. - */ - public parseAsync(data: any, frameLimit?: number): void; - /** - * A list of dependencies that need to be loaded and resolved for the object being parsed. - */ - public dependencies : ResourceDependency[]; - /** - * Resolve a dependency when it's loaded. For example, a dependency containing an ImageResource would be assigned - * to a Mesh instance as a BitmapMaterial, a scene graph object would be added to its intended parent. The - * dependency should be a member of the dependencies property. - * - * @param resourceDependency The dependency to be resolved. - */ - public _iResolveDependency(resourceDependency: ResourceDependency): void; - /** - * Resolve a dependency loading failure. Used by parser to eventually provide a default map - * - * @param resourceDependency The dependency to be resolved. - */ - public _iResolveDependencyFailure(resourceDependency: ResourceDependency): void; - /** - * Resolve a dependency name - * - * @param resourceDependency The dependency to be resolved. - */ - public _iResolveDependencyName(resourceDependency: ResourceDependency, asset: library.IAsset): string; - public _iResumeParsingAfterDependencies(): void; - public _pFinalizeAsset(asset: library.IAsset, name?: string): void; - /** - * Parse the next block of data. - * @return Whether or not more data needs to be parsed. Can be ParserBase.ParserBase.PARSING_DONE or - * ParserBase.ParserBase.MORE_TO_PARSE. - */ - public _pProceedParsing(): boolean; - public _pDieWithError(message?: string): void; - public _pAddDependency(id: string, req: net.URLRequest, retrieveAsRawData?: boolean, data?: any, suppressErrorEvents?: boolean): ResourceDependency; - public _pPauseAndRetrieveDependencies(): void; - /** - * Tests whether or not there is still time left for parsing within the maximum allowed time frame per session. - * @return True if there is still time left, false if the maximum allotted time was exceeded and parsing should be interrupted. - */ - public _pHasTime(): boolean; - /** - * Called when the parsing pause interval has passed and parsing can proceed. - */ - public _pOnInterval(event?: events.TimerEvent): void; - /** - * Initializes the parsing of data. - * @param frameLimit The maximum duration of a parsing session. - */ - public _pStartParsing(frameLimit: number): void; - /** - * Finish parsing the data. - */ - public _pFinishParsing(): void; - /** - * - * @returns {string} - * @private - */ - public _pGetTextData(): string; - /** - * - * @returns {string} - * @private - */ - public _pGetByteData(): utils.ByteArray; - } -} -declare module away.parsers { - /** - * CubeTextureParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - class CubeTextureParser extends ParserBase { - private static posX; - private static negX; - private static posY; - private static negY; - private static posZ; - private static negZ; - private _imgDependencyDictionary; - /** - * Creates a new CubeTextureParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - constructor(); - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - static supportsType(extension: string): boolean; - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - static supportsData(data: any): boolean; - /** - * @inheritDoc - */ - public _iResolveDependency(resourceDependency: ResourceDependency): void; - /** - * @inheritDoc - */ - public _iResolveDependencyFailure(resourceDependency: ResourceDependency): void; - /** - * @inheritDoc - */ - public _pProceedParsing(): boolean; - private _validateCubeData(); - private _getHTMLImageElement(name); - } -} -declare module away.parsers { - /** - * Texture2DParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - class Texture2DParser extends ParserBase { - private _startedParsing; - private _doneParsing; - private _loadingImage; - private _htmlImageElement; - /** - * Creates a new Texture2DParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - constructor(); - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - static supportsType(extension: string): boolean; - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - static supportsData(data: any): boolean; - /** - * @inheritDoc - */ - public _pProceedParsing(): boolean; - public onLoadComplete(event: any): void; - } -} -declare module away.parsers { - /** - * An enumeration providing values to describe the data format of parsed data. - */ - class ParserDataFormat { - /** - * Describes the format of a binary file. - */ - static BINARY: string; - /** - * Describes the format of a plain text file. - */ - static PLAIN_TEXT: string; - /** - * Describes the format of an image file - */ - static IMAGE: string; - } -} -declare module away.parsers { - class ParserUtils { - /** - * Converts an ArrayBuffer to a base64 string - * - * @param image data as a ByteArray - * - * @return HTMLImageElement - * - */ - static arrayBufferToImage(data: ArrayBuffer): HTMLImageElement; - /** - * Converts an ByteArray to an Image - returns an HTMLImageElement - * - * @param image data as a ByteArray - * - * @return HTMLImageElement - * - */ - static byteArrayToImage(data: utils.ByteArray): HTMLImageElement; - /** - * Converts an Blob to an Image - returns an HTMLImageElement - * - * @param image data as a Blob - * - * @return HTMLImageElement - * - */ - static blobToImage(data: Blob): HTMLImageElement; - /** - * Returns a object as ByteArray, if possible. - * - * @param data The object to return as ByteArray - * - * @return The ByteArray or null - * - */ - static toByteArray(data: any): utils.ByteArray; - /** - * Returns a object as String, if possible. - * - * @param data The object to return as String - * @param length The length of the returned String - * - * @return The String or null - * - */ - static toString(data: any, length?: number): string; - } -} -declare module away.parsers { - /** - * ResourceDependency represents the data required to load, parse and resolve additional files ("dependencies") - * required by a parser, used by ResourceLoadSession. - * - */ - class ResourceDependency { - private _id; - private _request; - private _assets; - private _parser; - private _parentParser; - private _data; - private _retrieveAsRawData; - private _suppressAssetEvents; - private _dependencies; - public _iLoader: net.URLLoader; - public _iSuccess: boolean; - constructor(id: string, request: net.URLRequest, data: any, parser: ParserBase, parentParser: ParserBase, retrieveAsRawData?: boolean, suppressAssetEvents?: boolean); - /** - * - */ - public id : string; - /** - * - */ - public request : net.URLRequest; - /** - * The data containing the dependency to be parsed, if the resource was already loaded. - */ - public data : any; - /** - * - */ - public parser : ParserBase; - /** - * The parser which is dependent on this ResourceDependency object. - */ - public parentParser : ParserBase; - /** - * - */ - public retrieveAsRawData : boolean; - /** - * - */ - public suppresAssetEvents : boolean; - /** - * - */ - public assets : library.IAsset[]; - /** - * - */ - public dependencies : ResourceDependency[]; - /** - * @private - * Method to set data after having already created the dependency object, e.g. after load. - */ - public _iSetData(data: any): void; - /** - * @private - * - */ - public _iSetParser(parser: ParserBase): void; - /** - * Resolve the dependency when it's loaded with the parent parser. For example, a dependency containing an - * ImageResource would be assigned to a Mesh instance as a BitmapMaterial, a scene graph object would be added - * to its intended parent. The dependency should be a member of the dependencies property. - */ - public resolve(): void; - /** - * Resolve a dependency failure. For example, map loading failure from a 3d file - */ - public resolveFailure(): void; - /** - * Resolve the dependencies name - */ - public resolveName(asset: library.IAsset): string; - } -} -declare module away.library { - class AssetLoaderContext { - static UNDEFINED: number; - static SINGLEPASS_MATERIALS: number; - static MULTIPASS_MATERIALS: number; - private _includeDependencies; - private _dependencyBaseUrl; - private _embeddedDataByUrl; - private _remappedUrls; - private _materialMode; - private _overrideAbsPath; - private _overrideFullUrls; - /** - * AssetLoaderContext provides configuration for the AssetLoader load() and parse() operations. - * Use it to configure how (and if) dependencies are loaded, or to map dependency URLs to - * embedded data. - * - * @see away.loading.AssetLoader - */ - constructor(includeDependencies?: boolean, dependencyBaseUrl?: string); - /** - * Defines whether dependencies (all files except the one at the URL given to the load() or - * parseData() operations) should be automatically loaded. Defaults to true. - */ - public includeDependencies : boolean; - /** - * MaterialMode defines, if the Parser should create SinglePass or MultiPass Materials - * Options: - * 0 (Default / undefined) - All Parsers will create SinglePassMaterials, but the AWD2.1parser will create Materials as they are defined in the file - * 1 (Force SinglePass) - All Parsers create SinglePassMaterials - * 2 (Force MultiPass) - All Parsers will create MultiPassMaterials - * - */ - public materialMode : number; - /** - * A base URL that will be prepended to all relative dependency URLs found in a loaded resource. - * Absolute paths will not be affected by the value of this property. - */ - public dependencyBaseUrl : string; - /** - * Defines whether absolute paths (defined as paths that begin with a "/") should be overridden - * with the dependencyBaseUrl defined in this context. If this is true, and the base path is - * "base", /path/to/asset.jpg will be resolved as base/path/to/asset.jpg. - */ - public overrideAbsolutePaths : boolean; - /** - * Defines whether "full" URLs (defined as a URL that includes a scheme, e.g. http://) should be - * overridden with the dependencyBaseUrl defined in this context. If this is true, and the base - * path is "base", http://example.com/path/to/asset.jpg will be resolved as base/path/to/asset.jpg. - */ - public overrideFullURLs : boolean; - /** - * Map a URL to another URL, so that files that are referred to by the original URL will instead - * be loaded from the new URL. Use this when your file structure does not match the one that is - * expected by the loaded file. - * - * @param originalUrl The original URL which is referenced in the loaded resource. - * @param newUrl The URL from which away.should load the resource instead. - * - * @see mapUrlToData() - */ - public mapUrl(originalUrl: string, newUrl: string): void; - /** - * Map a URL to embedded data, so that instead of trying to load a dependency from the URL at - * which it's referenced, the dependency data will be retrieved straight from the memory instead. - * - * @param originalUrl The original URL which is referenced in the loaded resource. - * @param data The embedded data. Can be ByteArray or a class which can be used to create a bytearray. - */ - public mapUrlToData(originalUrl: string, data: any): void; - /** - * @private - * Defines whether embedded data has been mapped to a particular URL. - */ - public _iHasDataForUrl(url: string): boolean; - /** - * @private - * Returns embedded data for a particular URL. - */ - public _iGetDataForUrl(url: string): any; - /** - * @private - * Defines whether a replacement URL has been mapped to a particular URL. - */ - public _iHasMappingForUrl(url: string): boolean; - /** - * @private - * Returns new (replacement) URL for a particular original URL. - */ - public _iGetRemappedUrl(originalUrl: string): string; - } -} -declare module away.library { - /** - * AssetLoader can load any file format that away.supports (or for which a third-party parser - * has been plugged in) and it's dependencies. Events are dispatched when assets are encountered - * and for when the resource (or it's dependencies) have been loaded. - * - * The AssetLoader will not make assets available in any other way than through the dispatched - * events. To store assets and make them available at any point from any module in an application, - * use the AssetLibrary to load and manage assets. - * - * @see away.library.AssetLibrary - */ - class AssetLoader extends events.EventDispatcher { - private _context; - private _token; - private _uri; - private _content; - private _materialMode; - private _errorHandlers; - private _parseErrorHandlers; - private _stack; - private _baseDependency; - private _currentDependency; - private _namespace; - private _onReadyForDependenciesDelegate; - private _onParseCompleteDelegate; - private _onParseErrorDelegate; - private _onLoadCompleteDelegate; - private _onLoadErrorDelegate; - private _onTextureSizeErrorDelegate; - private _onAssetCompleteDelegate; - private static _parsers; - /** - * Enables a specific parser. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parser The parser class to enable. - * - * @see away.parsers.Parsers - */ - static enableParser(parser: any): void; - /** - * Enables a list of parsers. - * When no specific parser is set for a loading/parsing opperation, - * AssetLoader can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parsers A Vector of parser classes to enable. - * @see away.parsers.Parsers - */ - static enableParsers(parsers: Object[]): void; - /** - * Returns the base dependency of the loader - */ - public baseDependency : parsers.ResourceDependency; - /** - * Create a new ResourceLoadSession object. - */ - constructor(materialMode?: number); - /** - * Loads a file and (optionally) all of its dependencies. - * - * @param req The URLRequest object containing the URL of the file to be loaded. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - */ - public load(req: net.URLRequest, context?: AssetLoaderContext, ns?: string, parser?: parsers.ParserBase): AssetLoaderToken; - /** - * Loads a resource from already loaded data. - * - * @param data The data object containing all resource information. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - */ - public loadData(data: any, id: string, context?: AssetLoaderContext, ns?: string, parser?: parsers.ParserBase): AssetLoaderToken; - /** - * Recursively retrieves the next to-be-loaded and parsed dependency on the stack, or pops the list off the - * stack when complete and continues on the top set. - * @param parser The parser that will translate the data into a usable resource. - */ - private retrieveNext(parser?); - /** - * Retrieves a single dependency. - * @param parser The parser that will translate the data into a usable resource. - */ - private retrieveDependency(dependency); - private joinUrl(base, end); - private resolveDependencyUrl(dependency); - private retrieveParserDependencies(); - private resolveParserDependencies(); - /** - * Called when a single dependency loading failed, and pushes further dependencies onto the stack. - * @param event - */ - private onLoadError(event); - /** - * Called when a dependency parsing failed, and dispatches a ParserEvent.PARSE_ERROR - * @param event - */ - private onParseError(event); - private onAssetComplete(event); - private onReadyForDependencies(event); - /** - * Called when a single dependency was parsed, and pushes further dependencies onto the stack. - * @param event - */ - private onLoadComplete(event); - /** - * Called when parsing is complete. - */ - private onParseComplete(event); - /** - * Called when an image is too large or it's dimensions are not a power of 2 - * @param event - */ - private onTextureSizeError(event); - private addEventListeners(loader); - private removeEventListeners(loader); - public stop(): void; - private dispose(); - /** - * @private - * This method is used by other loader classes (e.g. Loader3D and AssetLibraryBundle) to - * add error event listeners to the AssetLoader instance. This system is used instead of - * the regular EventDispatcher system so that the AssetLibrary error handler can be sure - * that if hasEventListener() returns true, it's client code that's listening for the - * event. Secondly, functions added as error handler through this custom method are - * expected to return a boolean value indicating whether the event was handled (i.e. - * whether they in turn had any client code listening for the event.) If no handlers - * return true, the AssetLoader knows that the event wasn't handled and will throw an RTE. - */ - public _iAddParseErrorHandler(handler: any): void; - public _iAddErrorHandler(handler: any): void; - /** - * Guesses the parser to be used based on the file contents. - * @param data The data to be parsed. - * @param uri The url or id of the object to be parsed. - * @return An instance of the guessed parser. - */ - private getParserFromData(data); - /** - * Initiates parsing of the loaded dependency. - * - * @param The dependency to be parsed. - */ - private parseDependency(dependency); - /** - * Guesses the parser to be used based on the file extension. - * @return An instance of the guessed parser. - */ - private getParserFromSuffix(url); - } -} -declare module away.library { - /** - * Instances of this class are returned as tokens by loading operations - * to provide an object on which events can be listened for in cases where - * the actual asset loader is not directly available (e.g. when using the - * AssetLibrary to perform the load.) - * - * By listening for events on this class instead of directly on the - * AssetLibrary, one can distinguish different loads from each other. - * - * The token will dispatch all events that the original AssetLoader dispatches, - * while not providing an interface to obstruct the load and is as such a - * safer return value for loader wrappers than the loader itself. - */ - class AssetLoaderToken extends events.EventDispatcher { - public _iLoader: AssetLoader; - constructor(loader: AssetLoader); - public addEventListener(type: string, listener: Function): void; - public removeEventListener(type: string, listener: Function): void; - public hasEventListener(type: string, listener?: Function): boolean; - } -} -declare module away.library { - class IDUtil { - /** - * @private - * Char codes for 0123456789ABCDEF - */ - private static ALPHA_CHAR_CODES; - /** - * Generates a UID (unique identifier) based on ActionScript's - * pseudo-random number generator and the current time. - * - *

The UID has the form - * "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" - * where X is a hexadecimal digit (0-9, A-F).

- * - *

This UID will not be truly globally unique; but it is the best - * we can do without player support for UID generation.

- * - * @return The newly-generated UID. - * - * @langversion 3.0 - * @playerversion Flash 9 - * @playerversion AIR 1.1 - * @productversion Flex 3 - */ - static createUID(): string; - } -} -declare module away.library { - class AssetLibraryIterator { - private _assets; - private _filtered; - private _idx; - constructor(assets: IAsset[], assetTypeFilter: string, namespaceFilter: string, filterFunc: any); - public currentAsset : IAsset; - public numAssets : number; - public next(): IAsset; - public reset(): void; - public setIndex(index: number): void; - private filter(assetTypeFilter, namespaceFilter, filterFunc); - } -} -declare module away.library { - /** - * Abstract base class for naming conflict resolution classes. Extend this to create a - * strategy class which the asset library can use to resolve asset naming conflicts, or - * use one of the bundled concrete strategy classes: - * - *
    - *
  • IgnoreConflictStrategy (ConflictStrategy.IGNORE)
  • - *
  • ErrorConflictStrategy (ConflictStrategy.THROW_ERROR)
  • - *
  • NumSuffixConflictStrategy (ConflictStrategy.APPEND_NUM_SUFFIX)
  • - *
- * - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.ConflictStrategy - * @see away.library.IgnoreConflictStrategy - * @see away.library.ErrorConflictStrategy - * @see away.library.NumSuffixConflictStrategy - */ - class ConflictStrategyBase { - constructor(); - /** - * Resolve a naming conflict between two assets. Must be implemented by concrete strategy - * classes. - */ - public resolveConflict(changedAsset: IAsset, oldAsset: IAsset, assetsDictionary: Object, precedence: string): void; - /** - * Create instance of this conflict strategy. Used internally by the AssetLibrary to - * make sure the same strategy instance is not used in all AssetLibrary instances, which - * would break any state caching that happens inside the strategy class. - */ - public create(): ConflictStrategyBase; - /** - * Provided as a convenience method for all conflict strategy classes, as a way to finalize - * the conflict resolution by applying the new names and dispatching the correct events. - */ - public _pUpdateNames(ns: string, nonConflictingName: string, oldAsset: IAsset, newAsset: IAsset, assetsDictionary: Object, precedence: string): void; - } -} -declare module away.library { - class NumSuffixConflictStrategy extends ConflictStrategyBase { - private _separator; - private _next_suffix; - constructor(separator?: string); - public resolveConflict(changedAsset: IAsset, oldAsset: IAsset, assetsDictionary: Object, precedence: string): void; - public create(): ConflictStrategyBase; - } -} -declare module away.library { - class IgnoreConflictStrategy extends ConflictStrategyBase { - constructor(); - public resolveConflict(changedAsset: IAsset, oldAsset: IAsset, assetsDictionary: Object, precedence: string): void; - public create(): ConflictStrategyBase; - } -} -declare module away.library { - class ErrorConflictStrategy extends ConflictStrategyBase { - constructor(); - public resolveConflict(changedAsset: IAsset, oldAsset: IAsset, assetsDictionary: Object, precedence: string): void; - public create(): ConflictStrategyBase; - } -} -declare module away.library { - /** - * Enumaration class for precedence when resolving naming conflicts in the library. - * - * @see away.library.AssetLibrary.conflictPrecedence - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.naming.ConflictStrategy - */ - class ConflictPrecedence { - /** - * Signals that in a conflict, the previous owner of the conflicting name - * should be favored (and keep it's name) and that the newly renamed asset - * is reverted to a non-conflicting name. - */ - static FAVOR_OLD: string; - /** - * Signales that in a conflict, the newly renamed asset is favored (and keeps - * it's newly defined name) and that the previous owner of that name gets - * renamed to a non-conflicting name. - */ - static FAVOR_NEW: string; - } -} -declare module away.library { - /** - * Enumeration class for bundled conflict strategies. Set one of these values (or an - * instance of a self-defined sub-class of ConflictStrategyBase) to the conflictStrategy - * property on an AssetLibrary to define how that library resolves naming conflicts. - * - * The value of the AssetLibrary.conflictPrecedence property defines which - * of the conflicting assets will get to keep it's name, and which is renamed (if any.) - * - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.naming.ConflictStrategyBase - */ - class ConflictStrategy { - /** - * Specifies that in case of a naming conflict, one of the assets will be renamed and - * a numeric suffix appended to the base name. - */ - static APPEND_NUM_SUFFIX: ConflictStrategyBase; - /** - * Specifies that naming conflicts should be ignored. This is not recommended in most - * cases, unless it can be 100% guaranteed that the application does not cause naming - * conflicts in the library (i.e. when an app-level system is in place to prevent this.) - */ - static IGNORE: ConflictStrategyBase; - /** - * Specifies that an error should be thrown if a naming conflict is discovered. Use this - * to be 100% sure that naming conflicts never occur unnoticed, and when it's undesirable - * to have the library automatically rename assets to avoid such conflicts. - */ - static THROW_ERROR: ConflictStrategyBase; - } -} -declare module away.library { - /** - * AssetLibraryBundle enforces a multiton pattern and is not intended to be instanced directly. - * Its purpose is to create a container for 3D data management, both before and after parsing. - * If you are interested in creating multiple library bundles, please use the getInstance() method. - */ - class AssetLibraryBundle extends events.EventDispatcher { - private _loadingSessions; - private _strategy; - private _strategyPreference; - private _assets; - private _assetDictionary; - private _assetDictDirty; - private _loadingSessionsGarbage; - private _gcTimeoutIID; - private _onAssetRenameDelegate; - private _onAssetConflictResolvedDelegate; - private _onResourceCompleteDelegate; - private _onTextureSizeErrorDelegate; - private _onAssetCompleteDelegate; - private _onLoadErrorDelegate; - private _onParseErrorDelegate; - /** - * Creates a new AssetLibraryBundle object. - * - * @param me A multiton enforcer for the AssetLibraryBundle ensuring it cannnot be instanced. - */ - constructor(me: AssetLibraryBundleSingletonEnforcer); - /** - * Returns an AssetLibraryBundle instance. If no key is given, returns the default bundle instance (which is - * similar to using the AssetLibraryBundle as a singleton.) To keep several separated library bundles, - * pass a string key to this method to define which bundle should be returned. This is - * referred to as using the AssetLibrary as a multiton. - * - * @param key Defines which multiton instance should be returned. - * @return An instance of the asset library - */ - static getInstance(key?: string): AssetLibraryBundle; - /** - * - */ - public enableParser(parserClass: Object): void; - /** - * - */ - public enableParsers(parserClasses: Object[]): void; - /** - * Defines which strategy should be used for resolving naming conflicts, when two library - * assets are given the same name. By default, ConflictStrategy.APPEND_NUM_SUFFIX - * is used which means that a numeric suffix is appended to one of the assets. The - * conflictPrecedence property defines which of the two conflicting assets will - * be renamed. - * - * @see naming.ConflictStrategy - * @see AssetLibrary.conflictPrecedence - */ - public conflictStrategy : ConflictStrategyBase; - /** - * Defines which asset should have precedence when resolving a naming conflict between - * two assets of which one has just been renamed by the user or by a parser. By default - * ConflictPrecedence.FAVOR_NEW is used, meaning that the newly renamed - * asset will keep it's new name while the older asset gets renamed to not conflict. - * - * This property is ignored for conflict strategies that do not actually rename an - * asset automatically, such as ConflictStrategy.IGNORE and ConflictStrategy.THROW_ERROR. - * - * @see away.library.ConflictPrecedence - * @see away.library.ConflictStrategy - */ - public conflictPrecedence : string; - /** - * Create an AssetLibraryIterator instance that can be used to iterate over the assets - * in this asset library instance. The iterator can filter assets on asset type and/or - * namespace. A "null" filter value means no filter of that type is used. - * - * @param assetTypeFilter Asset type to filter on (from the AssetType enum class.) Use - * null to not filter on asset type. - * @param namespaceFilter Namespace to filter on. Use null to not filter on namespace. - * @param filterFunc Callback function to use when deciding whether an asset should be - * included in the iteration or not. This needs to be a function that takes a single - * parameter of type IAsset and returns a boolean where true means it should be included. - * - * @see away.library.AssetType - */ - public createIterator(assetTypeFilter?: string, namespaceFilter?: string, filterFunc?: any): AssetLibraryIterator; - /** - * Loads a file and (optionally) all of its dependencies. - * - * @param req The URLRequest object containing the URL of the file to be loaded. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - * @return A handle to the retrieved resource. - */ - public load(req: net.URLRequest, context?: AssetLoaderContext, ns?: string, parser?: parsers.ParserBase): AssetLoaderToken; - /** - * Loads a resource from existing data in memory. - * - * @param data The data object containing all resource information. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - * @return A handle to the retrieved resource. - */ - public loadData(data: any, context?: AssetLoaderContext, ns?: string, parser?: parsers.ParserBase): AssetLoaderToken; - /** - * - */ - public getAsset(name: string, ns?: string): IAsset; - /** - * Adds an asset to the asset library, first making sure that it's name is unique - * using the method defined by the conflictStrategy and - * conflictPrecedence properties. - */ - public addAsset(asset: IAsset): void; - /** - * Removes an asset from the library, and optionally disposes that asset by calling - * it's disposeAsset() method (which for most assets is implemented as a default - * version of that type's dispose() method. - * - * @param asset The asset which should be removed from this library. - * @param dispose Defines whether the assets should also be disposed. - */ - public removeAsset(asset: IAsset, dispose?: boolean): void; - /** - * Removes an asset which is specified using name and namespace. - * - * @param name The name of the asset to be removed. - * @param ns The namespace to which the desired asset belongs. - * @param dispose Defines whether the assets should also be disposed. - * - * @see away.library.AssetLibrary.removeAsset() - */ - public removeAssetByName(name: string, ns?: string, dispose?: boolean): IAsset; - /** - * Removes all assets from the asset library, optionally disposing them as they - * are removed. - * - * @param dispose Defines whether the assets should also be disposed. - */ - public removeAllAssets(dispose?: boolean): void; - /** - * Removes all assets belonging to a particular namespace (null for default) - * from the asset library, and optionall disposes them by calling their - * disposeAsset() method. - * - * @param ns The namespace from which all assets should be removed. - * @param dispose Defines whether the assets should also be disposed. - * - * @see away.library.AssetLibrary.removeAsset() - */ - public removeNamespaceAssets(ns?: string, dispose?: boolean): void; - private removeAssetFromDict(asset, autoRemoveEmptyNamespace?); - public stopAllLoadingSessions(): void; - private rehashAssetDict(); - /** - * Called when a an error occurs during loading. - */ - private onLoadError(event); - /** - * Called when a an error occurs during parsing. - */ - private onParseError(event); - private onAssetComplete(event); - private onTextureSizeError(event); - /** - * Called when the resource and all of its dependencies was retrieved. - */ - private onResourceComplete(event); - private loadingSessionGC(); - private killLoadingSession(loader); - private onAssetRename(ev); - private onAssetConflictResolved(ev); - } -} -declare class AssetLibraryBundleSingletonEnforcer { -} -declare module away.library { - /** - * AssetLibrary enforces a singleton pattern and is not intended to be instanced. - * It's purpose is to allow access to the default library bundle through a set of static shortcut methods. - * If you are interested in creating multiple library bundles, please use the getBundle() method. - */ - class AssetLibrary { - static _iInstances: Object; - constructor(se: AssetLibrarySingletonEnforcer); - /** - * Returns an AssetLibrary bundle instance. If no key is given, returns the default bundle (which is - * similar to using the AssetLibraryBundle as a singleton). To keep several separated library bundles, - * pass a string key to this method to define which bundle should be returned. This is - * referred to as using the AssetLibraryBundle as a multiton. - * - * @param key Defines which multiton instance should be returned. - * @return An instance of the asset library - */ - static getBundle(key?: string): AssetLibraryBundle; - /** - * - */ - static enableParser(parserClass: any): void; - /** - * - */ - static enableParsers(parserClasses: Object[]): void; - /** - * Short-hand for conflictStrategy property on default asset library bundle. - * - * @see AssetLibraryBundle.conflictStrategy - */ - static conflictStrategy : ConflictStrategyBase; - /** - * Short-hand for conflictPrecedence property on default asset library bundle. - * - * @see AssetLibraryBundle.conflictPrecedence - */ - static conflictPrecedence : string; - /** - * Short-hand for createIterator() method on default asset library bundle. - * - * @see AssetLibraryBundle.createIterator() - */ - static createIterator(assetTypeFilter?: string, namespaceFilter?: string, filterFunc?: any): AssetLibraryIterator; - /** - * Short-hand for load() method on default asset library bundle. - * - * @see AssetLibraryBundle.load() - */ - static load(req: net.URLRequest, context?: AssetLoaderContext, ns?: string, parser?: parsers.ParserBase): AssetLoaderToken; - /** - * Short-hand for loadData() method on default asset library bundle. - * - * @see AssetLibraryBundle.loadData() - */ - static loadData(data: any, context?: AssetLoaderContext, ns?: string, parser?: parsers.ParserBase): AssetLoaderToken; - static stopLoad(): void; - /** - * Short-hand for getAsset() method on default asset library bundle. - * - * @see AssetLibraryBundle.getAsset() - */ - static getAsset(name: string, ns?: string): IAsset; - /** - * Short-hand for addEventListener() method on default asset library bundle. - */ - static addEventListener(type: string, listener: Function): void; - /** - * Short-hand for removeEventListener() method on default asset library bundle. - */ - static removeEventListener(type: string, listener: Function): void; - /** - * Short-hand for hasEventListener() method on default asset library bundle. - - public static hasEventListener(type:string):boolean - { - return AssetLibrary.getBundle().hasEventListener(type); - } - - public static willTrigger(type:string):boolean - { - return getBundle().willTrigger(type); - } - */ - /** - * Short-hand for addAsset() method on default asset library bundle. - * - * @see AssetLibraryBundle.addAsset() - */ - static addAsset(asset: IAsset): void; - /** - * Short-hand for removeAsset() method on default asset library bundle. - * - * @param asset The asset which should be removed from the library. - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAsset() - */ - static removeAsset(asset: IAsset, dispose?: boolean): void; - /** - * Short-hand for removeAssetByName() method on default asset library bundle. - * - * @param name The name of the asset to be removed. - * @param ns The namespace to which the desired asset belongs. - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAssetByName() - */ - static removeAssetByName(name: string, ns?: string, dispose?: boolean): IAsset; - /** - * Short-hand for removeAllAssets() method on default asset library bundle. - * - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAllAssets() - */ - static removeAllAssets(dispose?: boolean): void; - /** - * Short-hand for removeNamespaceAssets() method on default asset library bundle. - * - * @see AssetLibraryBundle.removeNamespaceAssets() - */ - static removeNamespaceAssets(ns?: string, dispose?: boolean): void; - } -} -declare class AssetLibrarySingletonEnforcer { -} -/** -* @module away.pool -*/ -declare module away.pool { - /** - * @class away.pool.EntityListItem - */ - class EntityListItem { - /** - * - */ - public entity: entities.IEntity; - /** - * - */ - public next: EntityListItem; - } -} -/** -* @module away.pool -*/ -declare module away.pool { - /** - * @class away.pool.EntityListItemPool - */ - class EntityListItemPool { - private _pool; - private _index; - private _poolSize; - /** - * - */ - constructor(); - /** - * - */ - public getItem(): EntityListItem; - /** - * - */ - public freeAll(): void; - public dispose(): void; - } -} -/** -* @module away.pool -*/ -declare module away.pool { - /** - * IRenderable is an interface for classes that are used in the rendering pipeline to render the - * contents of a partition - * - * @class away.render.IRenderable - */ - interface IRenderable { - /** - * - */ - next: IRenderable; - /** - * - */ - materialId: number; - /** - * - */ - materialOwner: base.IMaterialOwner; - /** - * - */ - sourceEntity: entities.IEntity; - /** - * - */ - renderOrderId: number; - /** - * - */ - zIndex: number; - /** - * - */ - dispose(): any; - /** - * - */ - invalidateGeometry(): any; - /** - * - */ - invalidateIndexData(): any; - /** - * - */ - invalidateVertexData(dataType: string): any; - } -} -/** -* @module away.pool -*/ -declare module away.pool { - /** - * IRenderableClass is an interface for the constructable class definition IRenderable that is used to - * create renderable objects in the rendering pipeline to render the contents of a partition - * - * @class away.render.IRenderableClass - */ - interface IRenderableClass { - /** - * - */ - id: string; - /** - * - */ - new(pool: RenderablePool, materialOwner: base.IMaterialOwner): IRenderable; - } -} -/** -* @module away.pool -*/ -declare module away.pool { - /** - * IMaterialData is an interface for classes that are used in the rendering pipeline to render the - * contents of a texture - * - * @class away.pool.IMaterialData - */ - interface IMaterialData { - /** - * - */ - dispose(): any; - /** - * - */ - invalidateMaterial(): any; - /** - * - */ - invalidateAnimation(): any; - } -} -/** -* @module away.pool -*/ -declare module away.pool { - /** - * IMaterialPassData is an interface for classes that are used in the rendering pipeline to render the - * contents of a material pass - * - * @class away.pool.IMaterialPassData - */ - interface IMaterialPassData { - /** - * - */ - materialPass: materials.IMaterialPass; - /** - * - */ - dispose(): any; - /** - * - */ - invalidate(): any; - } -} -/** -* @module away.pool -*/ -declare module away.pool { - /** - * ITextureData is an interface for classes that are used in the rendering pipeline to render the - * contents of a texture - * - * @class away.pool.ITextureData - */ - interface ITextureData { - /** - * - */ - dispose(): any; - /** - * - */ - invalidate(): any; - } -} -/** -* @module away.pool -*/ -declare module away.pool { - /** - * @class away.pool.RenderablePool - */ - class RenderablePool { - private static _pools; - private _pool; - private _renderableClass; - /** - * //TODO - * - * @param renderableClass - */ - constructor(renderableClass: IRenderableClass); - /** - * //TODO - * - * @param materialOwner - * @returns IRenderable - */ - public getItem(materialOwner: base.IMaterialOwner): IRenderable; - /** - * //TODO - * - * @param materialOwner - */ - public disposeItem(materialOwner: base.IMaterialOwner): void; - /** - * //TODO - * - * @param renderableClass - * @returns RenderablePool - */ - static getPool(renderableClass: IRenderableClass): RenderablePool; - /** - * //TODO - * - * @param renderableClass - */ - static disposePool(renderableClass: any): void; - } -} -/** -* @module away.data -*/ -declare module away.pool { - /** - * @class away.pool.RenderableListItem - */ - class CSSRenderableBase implements IRenderable { - /** - * - */ - private _pool; - /** - * - */ - public next: CSSRenderableBase; - /** - * - */ - public materialId: number; - /** - * - */ - public renderOrderId: number; - /** - * - */ - public zIndex: number; - /** - * - */ - public cascaded: boolean; - /** - * - */ - public renderSceneTransform: geom.Matrix3D; - /** - * - */ - public sourceEntity: entities.IEntity; - /** - * - */ - public materialOwner: base.IMaterialOwner; - /** - * - */ - public htmlElement: HTMLElement; - /** - * - * @param sourceEntity - * @param material - * @param animator - */ - constructor(pool: RenderablePool, sourceEntity: entities.IEntity, materialOwner: base.IMaterialOwner); - /** - * - */ - public dispose(): void; - /** - * - */ - public invalidateGeometry(): void; - /** - * - */ - public invalidateIndexData(): void; - /** - * - */ - public invalidateVertexData(dataType: string): void; - } -} -/** -* @module away.data -*/ -declare module away.pool { - /** - * @class away.pool.RenderableListItem - */ - class CSSBillboardRenderable extends CSSRenderableBase { - static id: string; - constructor(pool: RenderablePool, billboard: entities.Billboard); - } -} -/** -* @module away.data -*/ -declare module away.pool { - /** - * @class away.pool.RenderableListItem - */ - class CSSLineSegmentRenderable extends CSSRenderableBase { - static id: string; - constructor(pool: RenderablePool, lineSegment: entities.LineSegment); - } -} -/** -* @module away.data -*/ -declare module away.pool { - /** - * @class away.pool.CSSSkyboxRenderable - */ - class CSSSkyboxRenderable extends CSSRenderableBase { - static id: string; - constructor(pool: RenderablePool, skyBox: entities.Skybox); - } -} -/** -* @module away.traverse -*/ -declare module away.traverse { - /** - * @class away.traverse.ICollector - */ - interface ICollector { - /** - * - */ - camera: entities.Camera; - /** - * - */ - scene: containers.Scene; - /** - * - */ - numEntities: number; - /** - * - */ - numInteractiveEntities: number; - /** - * - */ - clear(): any; - /** - * - */ - entityHead: any; - /** - * - * @param node - */ - enterNode(node: partition.NodeBase): boolean; - /** - * - * @param entity - */ - applyDirectionalLight(entity: entities.IEntity): any; - /** - * - * @param entity - */ - applyEntity(entity: entities.IEntity): any; - /** - * - * @param entity - */ - applyLightProbe(entity: entities.IEntity): any; - /** - * - * @param entity - */ - applyPointLight(entity: entities.IEntity): any; - /** - * - * @param entity - */ - applySkybox(entity: entities.IEntity): any; - } -} -/** -* @module away.traverse -*/ -declare module away.traverse { - /** - * @class away.traverse.CollectorBase - */ - class CollectorBase implements ICollector { - public scene: containers.Scene; - public _pEntityHead: pool.EntityListItem; - public _pEntityListItemPool: pool.EntityListItemPool; - public _pCamera: entities.Camera; - private _customCullPlanes; - private _cullPlanes; - private _numCullPlanes; - public _pNumEntities: number; - public _pNumInteractiveEntities: number; - constructor(); - /** - * - */ - public camera : entities.Camera; - /** - * - */ - public cullPlanes : geom.Plane3D[]; - /** - * - */ - public entityHead : pool.EntityListItem; - /** - * - */ - public numEntities : number; - /** - * - */ - public numInteractiveEntities : number; - /** - * - */ - public clear(): void; - /** - * - * @param node - * @returns {boolean} - */ - public enterNode(node: partition.NodeBase): boolean; - /** - * - * @param entity - */ - public applyDirectionalLight(entity: entities.IEntity): void; - /** - * - * @param entity - */ - public applyEntity(entity: entities.IEntity): void; - /** - * - * @param entity - */ - public applyLightProbe(entity: entities.IEntity): void; - /** - * - * @param entity - */ - public applyPointLight(entity: entities.IEntity): void; - /** - * - * @param entity - */ - public applySkybox(entity: entities.IEntity): void; - } -} -/** -* @module away.traverse -*/ -declare module away.traverse { - /** - * @class away.traverse.EntityCollector - */ - class EntityCollector extends CollectorBase { - public _pSkybox: entities.Skybox; - public _pLights: base.LightBase[]; - private _directionalLights; - private _pointLights; - private _lightProbes; - public _pNumLights: number; - private _numDirectionalLights; - private _numPointLights; - private _numLightProbes; - /** - * - */ - public directionalLights : entities.DirectionalLight[]; - /** - * - */ - public lightProbes : entities.LightProbe[]; - /** - * - */ - public lights : base.LightBase[]; - /** - * - */ - public pointLights : entities.PointLight[]; - /** - * - */ - public skyBox : entities.Skybox; - constructor(); - /** - * - * @param entity - */ - public applyDirectionalLight(entity: entities.IEntity): void; - /** - * - * @param entity - */ - public applyLightProbe(entity: entities.IEntity): void; - /** - * - * @param entity - */ - public applyPointLight(entity: entities.IEntity): void; - /** - * - * @param entity - */ - public applySkybox(entity: entities.IEntity): void; - /** - * - */ - public clear(): void; - } -} -/** -* @module away.traverse -*/ -declare module away.traverse { - /** - * The RaycastCollector class is a traverser for scene partitions that collects all scene graph entities that are - * considered intersecting with the defined ray. - * - * @see away.partition.Partition - * @see away.entities.IEntity - * - * @class away.traverse.RaycastCollector - */ - class RaycastCollector extends CollectorBase { - private _rayPosition; - private _rayDirection; - public _iCollectionMark: number; - /** - * Provides the starting position of the ray. - */ - public rayPosition : geom.Vector3D; - /** - * Provides the direction vector of the ray. - */ - public rayDirection : geom.Vector3D; - /** - * Creates a new RaycastCollector object. - */ - constructor(); - /** - * Returns true if the current node is at least partly in the frustum. If so, the partition node knows to pass on the traverser to its children. - * - * @param node The Partition3DNode object to frustum-test. - */ - public enterNode(node: partition.NodeBase): boolean; - } -} -/** -* @module away.traverse -*/ -declare module away.traverse { - /** - * @class away.traverse.CSSEntityCollector - */ - class CSSEntityCollector extends CollectorBase implements ICollector { - constructor(); - } -} -/** -* @module away.traverse -*/ -declare module away.traverse { - /** - * @class away.traverse.ShadowCasterCollector - */ - class ShadowCasterCollector extends CollectorBase { - constructor(); - /** - * - */ - public enterNode(node: partition.NodeBase): boolean; - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * @class away.partition.NodeBase - */ - class NodeBase { - private _boundsChildrenVisible; - private _explicitBoundsVisible; - private _implicitBoundsVisible; - public _iParent: NodeBase; - public _pChildNodes: NodeBase[]; - public _pNumChildNodes: number; - public _pBoundsPrimitive: entities.IEntity; - public _iNumEntities: number; - public _iCollectionMark: number; - /** - * - */ - public boundsVisible : boolean; - public boundsChildrenVisible : boolean; - /** - * - */ - public parent : NodeBase; - /** - * - * @protected - */ - public _pNumEntities : number; - /** - * - */ - constructor(); - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - * @internal - */ - public isInFrustum(planes: geom.Plane3D[], numPlanes: number): boolean; - /** - * - * @param rayPosition - * @param rayDirection - * @returns {boolean} - */ - public isIntersectingRay(rayPosition: geom.Vector3D, rayDirection: geom.Vector3D): boolean; - /** - * - * @returns {boolean} - */ - public isCastingShadow(): boolean; - /** - * - * @param entity - * @returns {away.partition.NodeBase} - */ - public findPartitionForEntity(entity: entities.IEntity): NodeBase; - /** - * - * @param traverser - */ - public acceptTraverser(traverser: traverse.ICollector): void; - /** - * - * @protected - */ - public _pCreateBoundsPrimitive(): entities.IEntity; - /** - * - * @param node - * @internal - */ - public iAddNode(node: NodeBase): void; - /** - * - * @param node - * @internal - */ - public iRemoveNode(node: NodeBase): void; - private _iUpdateImplicitBoundsVisible(value); - /** - * @internal - */ - public _iIsBoundsVisible(): boolean; - public _iUpdateEntityBounds(): void; - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * @class away.partition.NullNode - */ - class NullNode { - constructor(); - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * @class away.partition.Partition - */ - class Partition { - public _rootNode: NodeBase; - private _updatesMade; - private _updateQueue; - constructor(rootNode: NodeBase); - public rootNode : NodeBase; - public traverse(traverser: traverse.ICollector): void; - public iMarkForUpdate(entity: base.DisplayObject): void; - public iRemoveEntity(entity: base.DisplayObject): void; - private updateEntities(); - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * @class away.partition.EntityNode - */ - class EntityNode extends NodeBase { - private _entity; - public _iUpdateQueueNext: EntityNode; - constructor(entity: entities.IEntity); - public entity : entities.IEntity; - public removeFromParent(): void; - /** - * - * @returns {boolean} - */ - public isCastingShadow(): boolean; - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - */ - public isInFrustum(planes: geom.Plane3D[], numPlanes: number): boolean; - /** - * @inheritDoc - */ - public acceptTraverser(traverser: traverse.ICollector): void; - /** - * @inheritDoc - */ - public isIntersectingRay(rayPosition: geom.Vector3D, rayDirection: geom.Vector3D): boolean; - /** - * - * @protected - */ - public _pCreateBoundsPrimitive(): entities.IEntity; - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * @class away.partition.CameraNode - */ - class CameraNode extends EntityNode { - constructor(camera: entities.IEntity); - /** - * @inheritDoc - */ - public acceptTraverser(traverser: traverse.ICollector): void; - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * @class away.partition.DirectionalLightNode - */ - class DirectionalLightNode extends EntityNode { - private _directionalLight; - /** - * - * @param directionalLight - */ - constructor(directionalLight: entities.IEntity); - /** - * @inheritDoc - */ - public acceptTraverser(traverser: traverse.ICollector): void; - /** - * - * @returns {boolean} - */ - public isCastingShadow(): boolean; - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * @class away.partition.LightProbeNode - */ - class LightProbeNode extends EntityNode { - private _lightProbe; - /** - * - * @param lightProbe - */ - constructor(lightProbe: entities.IEntity); - /** - * @inheritDoc - */ - public acceptTraverser(traverser: traverse.ICollector): void; - /** - * - * @returns {boolean} - */ - public isCastingShadow(): boolean; - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * @class away.partition.PointLightNode - */ - class PointLightNode extends EntityNode { - private _pointLight; - /** - * - * @param pointLight - */ - constructor(pointLight: entities.IEntity); - /** - * @inheritDoc - */ - public acceptTraverser(traverser: traverse.ICollector): void; - /** - * - * @returns {boolean} - */ - public isCastingShadow(): boolean; - } -} -/** -* @module away.partition -*/ -declare module away.partition { - /** - * SkyboxNode is a space partitioning leaf node that contains a Skybox object. - * - * @class away.partition.SkyboxNode - */ - class SkyboxNode extends EntityNode { - private _skyBox; - /** - * Creates a new SkyboxNode object. - * @param skyBox The Skybox to be contained in the node. - */ - constructor(skyBox: entities.IEntity); - /** - * @inheritDoc - */ - public acceptTraverser(traverser: traverse.ICollector): void; - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - */ - public isInFrustum(planes: geom.Plane3D[], numPlanes: number): boolean; - } -} -/** -* @module away.pick -*/ -declare module away.pick { - /** - * Provides an interface for picking colliders that can be assigned to individual entities in a scene for specific picking behaviour. - * Used with the RaycastPicker picking object. - * - * @see away.entities.Entity#pickingCollider - * @see away.pick.RaycastPicker - * - * @interface away.pick.IPickingCollider - */ - interface IPickingCollider { - /** - * Sets the position and direction of a picking ray in local coordinates to the entity. - * - * @param localDirection The position vector in local coordinates - * @param localPosition The direction vector in local coordinates - */ - setLocalRay(localPosition: geom.Vector3D, localDirection: geom.Vector3D): any; - /** - * Tests a Billboard object for a collision with the picking ray. - * - * @param entity The entity instance to be tested. - * @param pickingCollisionVO The collision object used to store the collision results - * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray. - */ - testBillboardCollision(entity: entities.IEntity, pickingCollisionVO: PickingCollisionVO, shortestCollisionDistance: number): boolean; - /** - * Tests a Mesh object for a collision with the picking ray. - * - * @param entity The entity instance to be tested. - * @param pickingCollisionVO The collision object used to store the collision results - * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray. - * @param findClosest - */ - testMeshCollision(entity: entities.IEntity, pickingCollisionVO: PickingCollisionVO, shortestCollisionDistance: number, findClosest: boolean): boolean; - } -} -/** -* @module away.pick -*/ -declare module away.pick { - /** - * Provides an interface for picking objects that can pick 3d objects from a view or scene. - * - * @interface away.pick.IPicker - */ - interface IPicker { - /** - * Gets the collision object from the screen coordinates of the picking ray. - * - * @param x The x coordinate of the picking ray in screen-space. - * @param y The y coordinate of the picking ray in screen-space. - * @param view The view on which the picking object acts. - */ - getViewCollision(x: number, y: number, view: containers.View): PickingCollisionVO; - /** - * Gets the collision object from the scene position and direction of the picking ray. - * - * @param position The position of the picking ray in scene-space. - * @param direction The direction of the picking ray in scene-space. - * @param scene The scene on which the picking object acts. - */ - getSceneCollision(position: geom.Vector3D, direction: geom.Vector3D, scene: containers.Scene): PickingCollisionVO; - /** - * Determines whether the picker takes account of the mouseEnabled properties of entities. Defaults to true. - */ - onlyMouseEnabled: boolean; - /** - * Disposes memory used by the IPicker object - */ - dispose(): any; - } -} -/** -* @module away.pick -*/ -declare module away.pick { - /** - * Value object for a picking collision returned by a picking collider. Created as unique objects on display objects - * - * @see away.base.DisplayObject#pickingCollisionVO - * @see away.core.pick.IPickingCollider - * - * @class away.pick.PickingCollisionVO - */ - class PickingCollisionVO { - /** - * The display object to which this collision object belongs. - */ - public displayObject: base.DisplayObject; - /** - * The local position of the collision on the entity's surface. - */ - public localPosition: geom.Vector3D; - /** - * The local normal vector at the position of the collision. - */ - public localNormal: geom.Vector3D; - /** - * The uv coordinate at the position of the collision. - */ - public uv: geom.Point; - /** - * The index of the face where the event took pl ace. - */ - public index: number; - /** - * The starting position of the colliding ray in local coordinates. - */ - public localRayPosition: geom.Vector3D; - /** - * The direction of the colliding ray in local coordinates. - */ - public localRayDirection: geom.Vector3D; - /** - * The starting position of the colliding ray in scene coordinates. - */ - public rayPosition: geom.Vector3D; - /** - * The direction of the colliding ray in scene coordinates. - */ - public rayDirection: geom.Vector3D; - /** - * Determines if the ray position is contained within the entity bounds. - * - * @see away3d.entities.Entity#bounds - */ - public rayOriginIsInsideBounds: boolean; - /** - * The distance along the ray from the starting position to the calculated intersection entry point with the entity. - */ - public rayEntryDistance: number; - /** - * The material ownwer associated with a collision. - */ - public materialOwner: base.IMaterialOwner; - /** - * Creates a new PickingCollisionVO object. - * - * @param entity The entity to which this collision object belongs. - */ - constructor(displayObject: base.DisplayObject); - } -} -/** -* @module away.pick -*/ -declare module away.pick { - /** - * Picks a 3d object from a view or scene by 3D raycast calculations. - * Performs an initial coarse boundary calculation to return a subset of entities whose bounding volumes intersect with the specified ray, - * then triggers an optional picking collider on individual entity objects to further determine the precise values of the picking ray collision. - * - * @class away.pick.RaycastPicker - */ - class RaycastPicker implements IPicker { - private _findClosestCollision; - private _raycastCollector; - private _ignoredEntities; - private _onlyMouseEnabled; - private _entities; - private _numEntities; - private _hasCollisions; - /** - * @inheritDoc - */ - public onlyMouseEnabled : boolean; - /** - * Creates a new RaycastPicker object. - * - * @param findClosestCollision Determines whether the picker searches for the closest bounds collision along the ray, - * or simply returns the first collision encountered. Defaults to false. - */ - constructor(findClosestCollision?: boolean); - /** - * @inheritDoc - */ - public getViewCollision(x: number, y: number, view: containers.View): PickingCollisionVO; - /** - * @inheritDoc - */ - public getSceneCollision(rayPosition: geom.Vector3D, rayDirection: geom.Vector3D, scene: containers.Scene): PickingCollisionVO; - public setIgnoreList(entities: any): void; - private isIgnored(entity); - private sortOnNearT(entity1, entity2); - private getPickingCollisionVO(collector); - private updateLocalPosition(pickingCollisionVO); - public dispose(): void; - } -} -/** -* @module away.render -*/ -declare module away.render { - /** - * IRenderer is an interface for classes that are used in the rendering pipeline to render the - * contents of a partition - * - * @class away.render.IRenderer - */ - interface IRenderer extends events.IEventDispatcher { - /** - * - */ - renderableSorter: sort.IEntitySorter; - /** - * - */ - shareContext: boolean; - /** - * - */ - x: number; - /** - * - */ - y: number; - /** - * - */ - width: number; - /** - * - */ - height: number; - /** - * - */ - viewPort: geom.Rectangle; - /** - * - */ - scissorRect: geom.Rectangle; - /** - * - * @param billboard - */ - applyBillboard(billboard: entities.Billboard): any; - /** - * - * @param triangleSubMesh - */ - applyLineSubMesh(triangleSubMesh: base.LineSubMesh): any; - /** - * - * @param triangleSubMesh - */ - applyTriangleSubMesh(triangleSubMesh: base.TriangleSubMesh): any; - /** - * - */ - dispose(): any; - /** - * - * @param entityCollector - */ - render(entityCollector: traverse.ICollector): any; - /** - * @internal - */ - _iBackgroundR: number; - /** - * @internal - */ - _iBackgroundG: number; - /** - * @internal - */ - _iBackgroundB: number; - /** - * @internal - */ - _iBackgroundAlpha: number; - /** - * @internal - */ - _iCreateEntityCollector(): traverse.ICollector; - _iRender(entityCollector: traverse.ICollector, target?: textures.TextureProxyBase, scissorRect?: geom.Rectangle, surfaceSelector?: number): any; - _iRenderCascades(entityCollector: traverse.ICollector, target: textures.TextureProxyBase, numCascades: number, scissorRects: geom.Rectangle[], cameras: entities.Camera[]): any; - } -} -/** -* @module away.render -*/ -declare module away.render { - /** - * RendererBase forms an abstract base class for classes that are used in the rendering pipeline to render the - * contents of a partition - * - * @class away.render.RendererBase - */ - class CSSRendererBase extends events.EventDispatcher { - private _billboardRenderablePool; - private _lineSegmentRenderablePool; - public _pCamera: entities.Camera; - public _iEntryPoint: geom.Vector3D; - public _pCameraForward: geom.Vector3D; - private _backgroundR; - private _backgroundG; - private _backgroundB; - private _backgroundAlpha; - private _shareContext; - public _pBackBufferInvalid: boolean; - public _depthTextureInvalid: boolean; - public _renderableHead: pool.CSSRenderableBase; - public _width: number; - public _height: number; - private _viewPort; - private _viewportDirty; - private _scissorRect; - private _scissorDirty; - private _localPos; - private _globalPos; - private _scissorUpdated; - private _viewPortUpdated; - /** - * A viewPort rectangle equivalent of the StageGL size and position. - */ - public viewPort : geom.Rectangle; - /** - * A scissor rectangle equivalent of the view size and position. - */ - public scissorRect : geom.Rectangle; - /** - * - */ - public x : number; - /** - * - */ - public y : number; - /** - * - */ - public width : number; - /** - * - */ - public height : number; - /** - * - */ - public renderableSorter: sort.IEntitySorter; - /** - * Creates a new RendererBase object. - */ - constructor(renderToTexture?: boolean, forceSoftware?: boolean, profile?: string); - /** - * The background color's red component, used when clearing. - * - * @private - */ - public _iBackgroundR : number; - /** - * The background color's green component, used when clearing. - * - * @private - */ - public _iBackgroundG : number; - /** - * The background color's blue component, used when clearing. - * - * @private - */ - public _iBackgroundB : number; - public shareContext : boolean; - /** - * Disposes the resources used by the RendererBase. - */ - public dispose(): void; - public render(entityCollector: traverse.ICollector): void; - /** - * Renders the potentially visible geometry to the back buffer or texture. - * @param entityCollector The EntityCollector object containing the potentially visible geometry. - * @param scissorRect - */ - public _iRender(entityCollector: traverse.EntityCollector, target?: textures.TextureProxyBase, scissorRect?: geom.Rectangle, surfaceSelector?: number): void; - public _iRenderCascades(entityCollector: traverse.ICollector, target: textures.TextureProxyBase, numCascades: number, scissorRects: geom.Rectangle[], cameras: entities.Camera[]): void; - public pCollectRenderables(entityCollector: traverse.ICollector): void; - /** - * Renders the potentially visible geometry to the back buffer or texture. Only executed if everything is set up. - * @param entityCollector The EntityCollector object containing the potentially visible geometry. - * @param scissorRect - */ - public pExecuteRender(entityCollector: traverse.CSSEntityCollector, scissorRect?: geom.Rectangle): void; - /** - * Performs the actual drawing of dom objects to the target. - * - * @param entityCollector The EntityCollector object containing the potentially visible dom objects. - */ - public pDraw(entityCollector: traverse.CSSEntityCollector): void; - public _iBackgroundAlpha : number; - /** - * - * @param billboard - */ - public applyBillboard(billboard: entities.Billboard): void; - /** - * - * @param lineSubMesh - */ - public applyLineSubMesh(lineSubMesh: base.LineSubMesh): void; - /** - * - * @param skybox - */ - public applySkybox(skybox: entities.Skybox): void; - /** - * - * @param triangleSubMesh - */ - public applyTriangleSubMesh(triangleSubMesh: base.TriangleSubMesh): void; - /** - * - * @param renderable - * @private - */ - private _applyRenderable(renderable); - /** - * @private - */ - private notifyScissorUpdate(); - /** - * @private - */ - private notifyViewportUpdate(); - /** - * - */ - public updateGlobalPos(): void; - public _iCreateEntityCollector(): traverse.ICollector; - } -} -/** -* @module away.render -*/ -declare module away.render { - /** - * The DefaultRenderer class provides the default rendering method. It renders the scene graph objects using the - * materials assigned to them. - * - * @class away.render.DefaultRenderer - */ - class CSSDefaultRenderer extends CSSRendererBase implements IRenderer { - private _container; - private _context; - private _contextStyle; - private _contextMatrix; - private _activeMaterial; - private _skyboxProjection; - private _transform; - /** - * Creates a new CSSDefaultRenderer object. - */ - constructor(); - /** - * - * @param entityCollector - */ - public render(entityCollector: traverse.ICollector): void; - /** - * @inheritDoc - */ - public pDraw(entityCollector: traverse.EntityCollector): void; - /** - * Updates the backbuffer properties. - */ - public pUpdateBackBuffer(): void; - /** - * Draw the skybox if present. - * @param entityCollector The EntityCollector containing all potentially visible information. - */ - private drawSkybox(entityCollector); - /** - * Draw a list of renderables. - * @param renderables The renderables to draw. - * @param entityCollector The EntityCollector containing all potentially visible information. - */ - private drawRenderables(item, entityCollector); - public dispose(): void; - public _iCreateEntityCollector(): traverse.ICollector; - } -} -/** -* @module away.sort -*/ -declare module away.sort { - /** - * @interface away.sort.IEntitySorter - */ - interface IEntitySorter { - sortBlendedRenderables(head: pool.IRenderable): pool.IRenderable; - sortOpaqueRenderables(head: pool.IRenderable): pool.IRenderable; - } -} -/** -* @module away.sort -*/ -declare module away.sort { - /** - * @class away.sort.RenderableMergeSort - */ - class RenderableMergeSort implements IEntitySorter { - public sortBlendedRenderables(head: pool.IRenderable): pool.IRenderable; - public sortOpaqueRenderables(head: pool.IRenderable): pool.IRenderable; - } -} -/** -* The AntiAliasType class provides values for anti-aliasing in the -* away.text.TextField class. -*/ -declare module away.text { - class AntiAliasType { - /** - * Sets anti-aliasing to advanced anti-aliasing. Advanced anti-aliasing - * allows font faces to be rendered at very high quality at small sizes. It - * is best used with applications that have a lot of small text. Advanced - * anti-aliasing is not recommended for very large fonts(larger than 48 - * points). This constant is used for the antiAliasType property - * in the TextField class. Use the syntax - * AntiAliasType.ADVANCED. - */ - static ADVANCED: string; - /** - * Sets anti-aliasing to the anti-aliasing that is used in Flash Player 7 and - * earlier. This setting is recommended for applications that do not have a - * lot of text. This constant is used for the antiAliasType - * property in the TextField class. Use the syntax - * AntiAliasType.NORMAL. - */ - static NORMAL: string; - } -} -/** -* The GridFitType class defines values for grid fitting in the TextField class. -*/ -declare module away.text { - class GridFitType { - /** - * Doesn't set grid fitting. Horizontal and vertical lines in the glyphs are - * not forced to the pixel grid. This constant is used in setting the - * gridFitType property of the TextField class. This is often a - * good setting for animation or for large font sizes. Use the syntax - * GridFitType.NONE. - */ - static NONE: string; - /** - * Fits strong horizontal and vertical lines to the pixel grid. This constant - * is used in setting the gridFitType property of the TextField - * class. This setting only works for left-justified text fields and acts - * like the GridFitType.SUBPIXEL constant in static text. This - * setting generally provides the best readability for left-aligned text. Use - * the syntax GridFitType.PIXEL. - */ - static PIXEL: string; - /** - * Fits strong horizontal and vertical lines to the sub-pixel grid on LCD - * monitors. (Red, green, and blue are actual pixels on an LCD screen.) This - * is often a good setting for right-aligned or center-aligned dynamic text, - * and it is sometimes a useful tradeoff for animation vs. text quality. This - * constant is used in setting the gridFitType property of the - * TextField class. Use the syntax GridFitType.SUBPIXEL. - */ - static SUBPIXEL: string; - } -} -/** -* The TextFieldAutoSize class is an enumeration of constant values used in -* setting the autoSize property of the TextField class. -*/ -declare module away.text { - class TextFieldAutoSize { - /** - * Specifies that the text is to be treated as center-justified text. Any - * resizing of a single line of a text field is equally distributed to both - * the right and left sides. - */ - static CENTER: string; - /** - * Specifies that the text is to be treated as left-justified text, meaning - * that the left side of the text field remains fixed and any resizing of a - * single line is on the right side. - */ - static LEFT: string; - /** - * Specifies that no resizing is to occur. - */ - static NONE: string; - /** - * Specifies that the text is to be treated as right-justified text, meaning - * that the right side of the text field remains fixed and any resizing of a - * single line is on the left side. - */ - static RIGHT: string; - } -} -/** -* The TextFieldType class is an enumeration of constant values used in setting the -* type property of the TextField class. -* -* @see away.entities.TextField#type -*/ -declare module away.text { - class TextFieldType { - /** - * Used to specify a dynamic TextField. - */ - static DYNAMIC: string; - /** - * Used to specify an input TextField. - */ - static INPUT: string; - } -} -/** -* The TextFormat class represents character formatting information. Use the -* TextFormat class to create specific text formatting for text fields. You -* can apply text formatting to both static and dynamic text fields. The -* properties of the TextFormat class apply to device and embedded fonts. -* However, for embedded fonts, bold and italic text actually require specific -* fonts. If you want to display bold or italic text with an embedded font, -* you need to embed the bold and italic variations of that font. -* -*

You must use the constructor new TextFormat() to create a -* TextFormat object before setting its properties. When you apply a -* TextFormat object to a text field using the -* TextField.defaultTextFormat property or the -* TextField.setTextFormat() method, only its defined properties -* are applied. Use the TextField.defaultTextFormat property to -* apply formatting BEFORE you add text to the TextField, and the -* setTextFormat() method to add formatting AFTER you add text to -* the TextField. The TextFormat properties are null -* by default because if you don't provide values for the properties, Flash -* Player uses its own default formatting. The default formatting that Flash -* Player uses for each property(if property's value is null) is -* as follows:

-* -*

The default formatting for each property is also described in each -* property description.

-*/ -declare module away.text { - class TextFormat { - /** - * Indicates the alignment of the paragraph. Valid values are TextFormatAlign - * constants. - * - * @default TextFormatAlign.LEFT - * @throws ArgumentError The align specified is not a member of - * flash.text.TextFormatAlign. - */ - public align: string; - /** - * Indicates the block indentation in pixels. Block indentation is applied to - * an entire block of text; that is, to all lines of the text. In contrast, - * normal indentation(TextFormat.indent) affects only the first - * line of each paragraph. If this property is null, the - * TextFormat object does not specify block indentation(block indentation is - * 0). - */ - public blockIndent: number; - /** - * Specifies whether the text is boldface. The default value is - * null, which means no boldface is used. If the value is - * true, then the text is boldface. - */ - public bold: boolean; - /** - * Indicates that the text is part of a bulleted list. In a bulleted list, - * each paragraph of text is indented. To the left of the first line of each - * paragraph, a bullet symbol is displayed. The default value is - * null, which means no bulleted list is used. - */ - public bullet: boolean; - /** - * Indicates the color of the text. A number containing three 8-bit RGB - * components; for example, 0xFF0000 is red, and 0x00FF00 is green. The - * default value is null, which means that Flash Player uses the - * color black(0x000000). - */ - public color: boolean; - /** - * The name of the font for text in this text format, as a string. The - * default value is null, which means that Flash Player uses - * Times New Roman font for the text. - */ - public font: string; - /** - * Indicates the indentation from the left margin to the first character in - * the paragraph. The default value is null, which indicates - * that no indentation is used. - */ - public indent: number; - /** - * Indicates whether text in this text format is italicized. The default - * value is null, which means no italics are used. - */ - public italic: boolean; - /** - * A Boolean value that indicates whether kerning is enabled - * (true) or disabled(false). Kerning adjusts the - * pixels between certain character pairs to improve readability, and should - * be used only when necessary, such as with headings in large fonts. Kerning - * is supported for embedded fonts only. - * - *

Certain fonts such as Verdana and monospaced fonts, such as Courier - * New, do not support kerning.

- * - *

The default value is null, which means that kerning is not - * enabled.

- */ - public kerning: boolean; - /** - * An integer representing the amount of vertical space(called - * leading) between lines. The default value is null, - * which indicates that the amount of leading used is 0. - */ - public leading: number; - /** - * The left margin of the paragraph, in pixels. The default value is - * null, which indicates that the left margin is 0 pixels. - */ - public leftMargin: number; - /** - * A number representing the amount of space that is uniformly distributed - * between all characters. The value specifies the number of pixels that are - * added to the advance after each character. The default value is - * null, which means that 0 pixels of letter spacing is used. - * You can use decimal values such as 1.75. - */ - public letterSpacing: number; - /** - * The right margin of the paragraph, in pixels. The default value is - * null, which indicates that the right margin is 0 pixels. - */ - public rightMargin: number; - /** - * The size in pixels of text in this text format. The default value is - * null, which means that a size of 12 is used. - */ - public size: number; - /** - * Specifies custom tab stops as an array of non-negative integers. Each tab - * stop is specified in pixels. If custom tab stops are not specified - * (null), the default tab stop is 4(average character width). - */ - public tabStops: number[]; - /** - * Indicates the target window where the hyperlink is displayed. If the - * target window is an empty string, the text is displayed in the default - * target window _self. You can choose a custom name or one of - * the following four names: _self specifies the current frame - * in the current window, _blank specifies a new window, - * _parent specifies the parent of the current frame, and - * _top specifies the top-level frame in the current window. If - * the TextFormat.url property is an empty string or - * null, you can get or set this property, but the property will - * have no effect. - */ - public target: string; - /** - * Indicates whether the text that uses this text format is underlined - * (true) or not(false). This underlining is - * similar to that produced by the tag, but the latter is - * not true underlining, because it does not skip descenders correctly. The - * default value is null, which indicates that underlining is - * not used. - */ - public underline: boolean; - /** - * Indicates the target URL for the text in this text format. If the - * url property is an empty string, the text does not have a - * hyperlink. The default value is null, which indicates that - * the text does not have a hyperlink. - * - *

Note: The text with the assigned text format must be set with - * the htmlText property for the hyperlink to work.

- */ - public url: string; - /** - * Creates a TextFormat object with the specified properties. You can then - * change the properties of the TextFormat object to change the formatting of - * text fields. - * - *

Any parameter may be set to null to indicate that it is - * not defined. All of the parameters are optional; any omitted parameters - * are treated as null.

- * - * @param font The name of a font for text as a string. - * @param size An integer that indicates the size in pixels. - * @param color The color of text using this text format. A number - * containing three 8-bit RGB components; for example, - * 0xFF0000 is red, and 0x00FF00 is green. - * @param bold A Boolean value that indicates whether the text is - * boldface. - * @param italic A Boolean value that indicates whether the text is - * italicized. - * @param underline A Boolean value that indicates whether the text is - * underlined. - * @param url The URL to which the text in this text format - * hyperlinks. If url is an empty string, the - * text does not have a hyperlink. - * @param target The target window where the hyperlink is displayed. If - * the target window is an empty string, the text is - * displayed in the default target window - * _self. If the url parameter - * is set to an empty string or to the value - * null, you can get or set this property, - * but the property will have no effect. - * @param align The alignment of the paragraph, as a TextFormatAlign - * value. - * @param leftMargin Indicates the left margin of the paragraph, in pixels. - * @param rightMargin Indicates the right margin of the paragraph, in pixels. - * @param indent An integer that indicates the indentation from the left - * margin to the first character in the paragraph. - * @param leading A number that indicates the amount of leading vertical - * space between lines. - */ - constructor(font?: string, size?: number, color?: number, bold?: boolean, italic?: boolean, underline?: boolean, url?: string, target?: string, align?: string, leftMargin?: number, rightMargin?: number, indent?: number, leading?: number); - } -} -/** -* The TextFormatAlign class provides values for text alignment in the -* TextFormat class. -*/ -declare module away.text { - class TextFormatAlign { - /** - * Constant; centers the text in the text field. Use the syntax - * TextFormatAlign.CENTER. - */ - public CENTER: string; - /** - * Constant; justifies text within the text field. Use the syntax - * TextFormatAlign.JUSTIFY. - */ - public JUSTIFY: string; - /** - * Constant; aligns text to the left within the text field. Use the syntax - * TextFormatAlign.LEFT. - */ - public LEFT: string; - /** - * Constant; aligns text to the right within the text field. Use the syntax - * TextFormatAlign.RIGHT. - */ - public RIGHT: string; - } -} -/** -* A class that defines the Interactive mode of a text field object. -* -* @see away.entities.TextField#textInteractionMode -*/ -declare module away.text { - class TextInteractionMode { - /** - * The text field's default interaction mode is NORMAL and it varies across - * platform. On Desktop, the normal mode implies that the text field is in - * scrollable + selection mode. On Mobile platforms like Android, normal mode - * implies that the text field can only be scrolled but the text can not be - * selected. - */ - static NORMAL: string; - /** - * On mobile platforms like Android, the text field starts in normal mode - * (which implies scroll and non-selectable mode). The user can switch to - * selection mode through the in-built context menu of the text field object. - */ - static SELECTION: string; - } -} -/** -* The TextLineMetrics class contains information about the text position and -* measurements of a line of text within a text field. All measurements are in -* pixels. Objects of this class are returned by the -* away.entities.TextField.getLineMetrics() method. -*/ -declare module away.text { - class TextLineMetrics { - /** - * The ascent value of the text is the length from the baseline to the top of - * the line height in pixels. - */ - public ascent: number; - /** - * The descent value of the text is the length from the baseline to the - * bottom depth of the line in pixels. - */ - public descent: number; - /** - * The height value of the text of the selected lines (not necessarily the - * complete text) in pixels. The height of the text line does not include the - * gutter height. - */ - public height: number; - /** - * The leading value is the measurement of the vertical distance between the - * lines of text. - */ - public leading: number; - /** - * The width value is the width of the text of the selected lines (not - * necessarily the complete text) in pixels. The width of the text line is - * not the same as the width of the text field. The width of the text line is - * relative to the text field width, minus the gutter width of 4 pixels - * (2 pixels on each side). - */ - public width: number; - /** - * The x value is the left position of the first character in pixels. This - * value includes the margin, indent (if any), and gutter widths. - */ - public x: number; - /** - * Creates a TextLineMetrics object. The TextLineMetrics object contains - * information about the text metrics of a line of text in a text field. - * Objects of this class are returned by the - * away.entities.TextField.getLineMetrics() method. - * - * @param x The left position of the first character in pixels. - * @param width The width of the text of the selected lines (not - * necessarily the complete text) in pixels. - * @param height The height of the text of the selected lines (not - * necessarily the complete text) in pixels. - * @param ascent The length from the baseline to the top of the line - * height in pixels. - * @param descent The length from the baseline to the bottom depth of - * the line in pixels. - * @param leading The measurement of the vertical distance between the - * lines of text. - */ - constructor(x?: number, width?: number, height?: number, ascent?: number, descent?: number, leading?: number); - } -} -declare module away.ui { - class Keyboard { - /** - * Constant associated with the key code value for the A key (65). - */ - static A: number; - /** - * Constant associated with the key code value for the Alternate (Option) key (18). - */ - static ALTERNATE: number; - /** - * Select the audio mode - */ - static AUDIO: number; - /** - * Constant associated with the key code value for the B key (66). - */ - static B: number; - /** - * Return to previous page in application - */ - static BACK: number; - /** - * Constant associated with the key code value for the ` key (192). - */ - static BACKQUOTE: number; - /** - * Constant associated with the key code value for the \ key (220). - */ - static BACKSLASH: number; - /** - * Constant associated with the key code value for the Backspace key (8). - */ - static BACKSPACE: number; - /** - * Blue function key button - */ - static BLUE: number; - /** - * Constant associated with the key code value for the C key (67). - */ - static C: number; - /** - * Constant associated with the key code value for the Caps Lock key (20). - */ - static CAPS_LOCK: number; - /** - * Channel down - */ - static CHANNEL_DOWN: number; - /** - * Channel up - */ - static CHANNEL_UP: number; - /** - * Constant associated with the key code value for the , key (188). - */ - static COMMA: number; - /** - * Constant associated with the Mac command key (15). This constant is - * currently only used for setting menu key equivalents. - */ - static COMMAND: number; - /** - * Constant associated with the key code value for the Control key (17). - */ - static CONTROL: number; - /** - * An array containing all the defined key name constants. - */ - static CharCodeStrings: any[]; - /** - * Constant associated with the key code value for the D key (68). - */ - static D: number; - /** - * Constant associated with the key code value for the Delete key (46). - */ - static DELETE: number; - /** - * Constant associated with the key code value for the Down Arrow key (40). - */ - static DOWN: number; - /** - * Engage DVR application mode - */ - static DVR: number; - /** - * Constant associated with the key code value for the E key (69). - */ - static E: number; - /** - * Constant associated with the key code value for the End key (35). - */ - static END: number; - /** - * Constant associated with the key code value for the Enter key (13). - */ - static ENTER: number; - /** - * Constant associated with the key code value for the = key (187). - */ - static EQUAL: number; - /** - * Constant associated with the key code value for the Escape key (27). - */ - static ESCAPE: number; - /** - * Exits current application mode - */ - static EXIT: number; - /** - * Constant associated with the key code value for the F key (70). - */ - static F: number; - /** - * Constant associated with the key code value for the F1 key (112). - */ - static F1: number; - /** - * Constant associated with the key code value for the F10 key (121). - */ - static F10: number; - /** - * Constant associated with the key code value for the F11 key (122). - */ - static F11: number; - /** - * Constant associated with the key code value for the F12 key (123). - */ - static F12: number; - /** - * Constant associated with the key code value for the F13 key (124). - */ - static F13: number; - /** - * Constant associated with the key code value for the F14 key (125). - */ - static F14: number; - /** - * Constant associated with the key code value for the F15 key (126). - */ - static F15: number; - /** - * Constant associated with the key code value for the F2 key (113). - */ - static F2: number; - /** - * Constant associated with the key code value for the F3 key (114). - */ - static F3: number; - /** - * Constant associated with the key code value for the F4 key (115). - */ - static F4: number; - /** - * Constant associated with the key code value for the F5 key (116). - */ - static F5: number; - /** - * Constant associated with the key code value for the F6 key (117). - */ - static F6: number; - /** - * Constant associated with the key code value for the F7 key (118). - */ - static F7: number; - /** - * Constant associated with the key code value for the F8 key (119). - */ - static F8: number; - /** - * Constant associated with the key code value for the F9 key (120). - */ - static F9: number; - /** - * Engage fast-forward transport mode - */ - static FAST_FORWARD: number; - /** - * Constant associated with the key code value for the G key (71). - */ - static G: number; - /** - * Green function key button - */ - static GREEN: number; - /** - * Engage program guide - */ - static GUIDE: number; - /** - * Constant associated with the key code value for the H key (72). - */ - static H: number; - /** - * Engage help application or context-sensitive help - */ - static HELP: number; - /** - * Constant associated with the key code value for the Home key (36). - */ - static HOME: number; - /** - * Constant associated with the key code value for the I key (73). - */ - static I: number; - /** - * Info button - */ - static INFO: number; - /** - * Cycle input - */ - static INPUT: number; - /** - * Constant associated with the key code value for the Insert key (45). - */ - static INSERT: number; - /** - * Constant associated with the key code value for the J key (74). - */ - static J: number; - /** - * Constant associated with the key code value for the K key (75). - */ - static K: number; - /** - * The Begin key - */ - static KEYNAME_BEGIN: string; - /** - * The Break key - */ - static KEYNAME_BREAK: string; - /** - * The Clear Display key - */ - static KEYNAME_CLEARDISPLAY: string; - /** - * The Clear Line key - */ - static KEYNAME_CLEARLINE: string; - /** - * The Delete key - */ - static KEYNAME_DELETE: string; - /** - * The Delete Character key - */ - static KEYNAME_DELETECHAR: string; - /** - * The Delete Line key - */ - static KEYNAME_DELETELINE: string; - /** - * The down arrow - */ - static KEYNAME_DOWNARROW: string; - /** - * The End key - */ - static KEYNAME_END: string; - /** - * The Execute key - */ - static KEYNAME_EXECUTE: string; - /** - * The F1 key - */ - static KEYNAME_F1: string; - /** - * The F10 key - */ - static KEYNAME_F10: string; - /** - * The F11 key - */ - static KEYNAME_F11: string; - /** - * The F12 key - */ - static KEYNAME_F12: string; - /** - * The F13 key - */ - static KEYNAME_F13: string; - /** - * The F14 key - */ - static KEYNAME_F14: string; - /** - * The F15 key - */ - static KEYNAME_F15: string; - /** - * The F16 key - */ - static KEYNAME_F16: string; - /** - * The F17 key - */ - static KEYNAME_F17: string; - /** - * The F18 key - */ - static KEYNAME_F18: string; - /** - * The F19 key - */ - static KEYNAME_F19: string; - /** - * The F2 key - */ - static KEYNAME_F2: string; - /** - * The F20 key - */ - static KEYNAME_F20: string; - /** - * The F21 key - */ - static KEYNAME_F21: string; - /** - * The F22 key - */ - static KEYNAME_F22: string; - /** - * The F23 key - */ - static KEYNAME_F23: string; - /** - * The F24 key - */ - static KEYNAME_F24: string; - /** - * The F25 key - */ - static KEYNAME_F25: string; - /** - * The F26 key - */ - static KEYNAME_F26: string; - /** - * The F27 key - */ - static KEYNAME_F27: string; - /** - * The F28 key - */ - static KEYNAME_F28: string; - /** - * The F29 key - */ - static KEYNAME_F29: string; - /** - * The F3 key - */ - static KEYNAME_F3: string; - /** - * The F30 key - */ - static KEYNAME_F30: string; - /** - * The F31 key - */ - static KEYNAME_F31: string; - /** - * The F32 key - */ - static KEYNAME_F32: string; - /** - * The F33 key - */ - static KEYNAME_F33: string; - /** - * The F34 key - */ - static KEYNAME_F34: string; - /** - * The F35 key - */ - static KEYNAME_F35: string; - /** - * The F4 key - */ - static KEYNAME_F4: string; - /** - * The F5 key - */ - static KEYNAME_F5: string; - /** - * The F6 key - */ - static KEYNAME_F6: string; - /** - * The F7 key - */ - static KEYNAME_F7: string; - /** - * The F8 key - */ - static KEYNAME_F8: string; - /** - * The F9 key - */ - static KEYNAME_F9: string; - /** - * The Find key - */ - static KEYNAME_FIND: string; - /** - * The Help key - */ - static KEYNAME_HELP: string; - /** - * The Home key - */ - static KEYNAME_HOME: string; - /** - * The Insert key - */ - static KEYNAME_INSERT: string; - /** - * The Insert Character key - */ - static KEYNAME_INSERTCHAR: string; - /** - * The Insert Line key - */ - static KEYNAME_INSERTLINE: string; - /** - * The left arrow - */ - static KEYNAME_LEFTARROW: string; - /** - * The Menu key - */ - static KEYNAME_MENU: string; - /** - * The Mode Switch key - */ - static KEYNAME_MODESWITCH: string; - /** - * The Next key - */ - static KEYNAME_NEXT: string; - /** - * The Page Down key - */ - static KEYNAME_PAGEDOWN: string; - /** - * The Page Up key - */ - static KEYNAME_PAGEUP: string; - /** - * The Pause key - */ - static KEYNAME_PAUSE: string; - /** - * The Previous key - */ - static KEYNAME_PREV: string; - /** - * The PRINT key - */ - static KEYNAME_PRINT: string; - /** - * The PRINT Screen - */ - static KEYNAME_PRINTSCREEN: string; - /** - * The Redo key - */ - static KEYNAME_REDO: string; - /** - * The Reset key - */ - static KEYNAME_RESET: string; - /** - * The right arrow - */ - static KEYNAME_RIGHTARROW: string; - /** - * The Scroll Lock key - */ - static KEYNAME_SCROLLLOCK: string; - /** - * The Select key - */ - static KEYNAME_SELECT: string; - /** - * The Stop key - */ - static KEYNAME_STOP: string; - /** - * The System Request key - */ - static KEYNAME_SYSREQ: string; - /** - * The System key - */ - static KEYNAME_SYSTEM: string; - /** - * The Undo key - */ - static KEYNAME_UNDO: string; - /** - * The up arrow - */ - static KEYNAME_UPARROW: string; - /** - * The User key - */ - static KEYNAME_USER: string; - /** - * Constant associated with the key code value for the L key (76). - */ - static L: number; - /** - * Watch last channel or show watched - */ - static LAST: number; - /** - * Constant associated with the key code value for the Left Arrow key (37). - */ - static LEFT: number; - /** - * Constant associated with the key code value for the [ key (219). - */ - static LEFTBRACKET: number; - /** - * Return to live [position in broadcast] - */ - static LIVE: number; - /** - * Constant associated with the key code value for the M key (77). - */ - static M: number; - /** - * Engage "Master Shell" e.g. TiVo or other vendor button - */ - static MASTER_SHELL: number; - /** - * Engage menu - */ - static MENU: number; - /** - * Constant associated with the key code value for the - key (189). - */ - static MINUS: number; - /** - * Constant associated with the key code value for the N key (78). - */ - static N: number; - /** - * Skip to next track or chapter - */ - static NEXT: number; - /** - * Constant associated with the key code value for the 0 key (48). - */ - static NUMBER_0: number; - /** - * Constant associated with the key code value for the 1 key (49). - */ - static NUMBER_1: number; - /** - * Constant associated with the key code value for the 2 key (50). - */ - static NUMBER_2: number; - /** - * Constant associated with the key code value for the 3 key (51). - */ - static NUMBER_3: number; - /** - * Constant associated with the key code value for the 4 key (52). - */ - static NUMBER_4: number; - /** - * Constant associated with the key code value for the 5 key (53). - */ - static NUMBER_5: number; - /** - * Constant associated with the key code value for the 6 key (54). - */ - static NUMBER_6: number; - /** - * Constant associated with the key code value for the 7 key (55). - */ - static NUMBER_7: number; - /** - * Constant associated with the key code value for the 8 key (56). - */ - static NUMBER_8: number; - /** - * Constant associated with the key code value for the 9 key (57). - */ - static NUMBER_9: number; - /** - * Constant associated with the pseudo-key code for the the number pad (21). Use to set numpad modifier on key equivalents - */ - static NUMPAD: number; - /** - * Constant associated with the key code value for the number 0 key on the number pad (96). - */ - static NUMPAD_0: number; - /** - * Constant associated with the key code value for the number 1 key on the number pad (97). - */ - static NUMPAD_1: number; - /** - * Constant associated with the key code value for the number 2 key on the number pad (98). - */ - static NUMPAD_2: number; - /** - * Constant associated with the key code value for the number 3 key on the number pad (99). - */ - static NUMPAD_3: number; - /** - * Constant associated with the key code value for the number 4 key on the number pad (100). - */ - static NUMPAD_4: number; - /** - * Constant associated with the key code value for the number 5 key on the number pad (101). - */ - static NUMPAD_5: number; - /** - * Constant associated with the key code value for the number 6 key on the number pad (102). - */ - static NUMPAD_6: number; - /** - * Constant associated with the key code value for the number 7 key on the number pad (103). - */ - static NUMPAD_7: number; - /** - * Constant associated with the key code value for the number 8 key on the number pad (104). - */ - static NUMPAD_8: number; - /** - * Constant associated with the key code value for the number 9 key on the number pad (105). - */ - static NUMPAD_9: number; - /** - * Constant associated with the key code value for the addition key on the number pad (107). - */ - static NUMPAD_ADD: number; - /** - * Constant associated with the key code value for the decimal key on the number pad (110). - */ - static NUMPAD_DECIMAL: number; - /** - * Constant associated with the key code value for the division key on the number pad (111). - */ - static NUMPAD_DIVIDE: number; - /** - * Constant associated with the key code value for the Enter key on the number pad (108). - */ - static NUMPAD_ENTER: number; - /** - * Constant associated with the key code value for the multiplication key on the number pad (106). - */ - static NUMPAD_MULTIPLY: number; - /** - * Constant associated with the key code value for the subtraction key on the number pad (109). - */ - static NUMPAD_SUBTRACT: number; - /** - * Constant associated with the key code value for the O key (79). - */ - static O: number; - /** - * Constant associated with the key code value for the P key (80). - */ - static P: number; - /** - * Constant associated with the key code value for the Page Down key (34). - */ - static PAGE_DOWN: number; - /** - * Constant associated with the key code value for the Page Up key (33). - */ - static PAGE_UP: number; - /** - * Engage pause transport mode - */ - static PAUSE: number; - /** - * Constant associated with the key code value for the . key (190). - */ - static PERIOD: number; - /** - * Engage play transport mode - */ - static PLAY: number; - /** - * Skip to previous track or chapter - */ - static PREVIOUS: number; - /** - * Constant associated with the key code value for the Q key (81). - */ - static Q: number; - /** - * Constant associated with the key code value for the ' key (222). - */ - static QUOTE: number; - /** - * Constant associated with the key code value for the R key (82). - */ - static R: number; - /** - * Record item or engage record transport mode - */ - static RECORD: number; - /** - * Red function key button - */ - static RED: number; - /** - * Engage rewind transport mode - */ - static REWIND: number; - /** - * Constant associated with the key code value for the Right Arrow key (39). - */ - static RIGHT: number; - /** - * Constant associated with the key code value for the ] key (221). - */ - static RIGHTBRACKET: number; - /** - * Constant associated with the key code value for the S key (83). - */ - static S: number; - /** - * Search button - */ - static SEARCH: number; - /** - * Constant associated with the key code value for the ; key (186). - */ - static SEMICOLON: number; - /** - * Engage setup application or menu - */ - static SETUP: number; - /** - * Constant associated with the key code value for the Shift key (16). - */ - static SHIFT: number; - /** - * Quick skip backward (usually 7-10 seconds) - */ - static SKIP_BACKWARD: number; - /** - * Quick skip ahead (usually 30 seconds) - */ - static SKIP_FORWARD: number; - /** - * Constant associated with the key code value for the / key (191). - */ - static SLASH: number; - /** - * Constant associated with the key code value for the Spacebar (32). - */ - static SPACE: number; - /** - * Engage stop transport mode - */ - static STOP: number; - /** - * Toggle subtitles - */ - static SUBTITLE: number; - /** - * Constant associated with the key code value for the T key (84). - */ - static T: number; - /** - * Constant associated with the key code value for the Tab key (9). - */ - static TAB: number; - /** - * Constant associated with the key code value for the U key (85). - */ - static U: number; - /** - * Constant associated with the key code value for the Up Arrow key (38). - */ - static UP: number; - /** - * Constant associated with the key code value for the V key (86). - */ - static V: number; - /** - * Engage video-on-demand - */ - static VOD: number; - /** - * Constant associated with the key code value for the W key (87). - */ - static W: number; - /** - * Constant associated with the key code value for the X key (88). - */ - static X: number; - /** - * Constant associated with the key code value for the Y key (89). - */ - static Y: number; - /** - * Yellow function key button - */ - static YELLOW: number; - /** - * Constant associated with the key code value for the Z key (90). - */ - static Z: number; - } -} -/** -* The DisplayObjectContainer class is the base class for all objects that can -* serve as display object containers on the display list. The display list -* manages all objects displayed in the Flash runtimes. Use the -* DisplayObjectContainer class to arrange the display objects in the display -* list. Each DisplayObjectContainer object has its own child list for -* organizing the z-order of the objects. The z-order is the front-to-back -* order that determines which object is drawn in front, which is behind, and -* so on. -* -*

DisplayObject is an abstract base class; therefore, you cannot call -* DisplayObject directly. Invoking new DisplayObject() throws an -* ArgumentError exception.

-* The DisplayObjectContainer class is an abstract base class for all objects -* that can contain child objects. It cannot be instantiated directly; calling -* the new DisplayObjectContainer() constructor throws an -* ArgumentError exception. -* -*

For more information, see the "Display Programming" chapter of the -* ActionScript 3.0 Developer's Guide.

-*/ -declare module away.containers { - class DisplayObjectContainer extends base.DisplayObject implements library.IAsset { - private _mouseChildren; - private _children; - public _iIsRoot: boolean; - /** - * - */ - public assetType : string; - /** - * Determines whether or not the children of the object are mouse, or user - * input device, enabled. If an object is enabled, a user can interact with - * it by using a mouse or user input device. The default is - * true. - * - *

This property is useful when you create a button with an instance of - * the Sprite class(instead of using the SimpleButton class). When you use a - * Sprite instance to create a button, you can choose to decorate the button - * by using the addChild() method to add additional Sprite - * instances. This process can cause unexpected behavior with mouse events - * because the Sprite instances you add as children can become the target - * object of a mouse event when you expect the parent instance to be the - * target object. To ensure that the parent instance serves as the target - * objects for mouse events, you can set the mouseChildren - * property of the parent instance to false.

- * - *

No event is dispatched by setting this property. You must use the - * addEventListener() method to create interactive - * functionality.

- */ - public mouseChildren : boolean; - /** - * Returns the number of children of this object. - */ - public numChildren : number; - /** - * Determines whether the children of the object are tab enabled. Enables or - * disables tabbing for the children of the object. The default is - * true. - * - *

Note: Do not use the tabChildren property with - * Flex. Instead, use the - * mx.core.UIComponent.hasFocusableChildren property.

- * - * @throws IllegalOperationError Calling this property of the Stage object - * throws an exception. The Stage object does - * not implement this property. - */ - public tabChildren: boolean; - /** - * Calling the new DisplayObjectContainer() constructor throws - * an ArgumentError exception. You can, however, call - * constructors for the following subclasses of DisplayObjectContainer: - *
    - *
  • new Loader()
  • - *
  • new Sprite()
  • - *
  • new MovieClip()
  • - *
- */ - constructor(); - /** - * Adds a child DisplayObject instance to this DisplayObjectContainer - * instance. The child is added to the front(top) of all other children in - * this DisplayObjectContainer instance.(To add a child to a specific index - * position, use the addChildAt() method.) - * - *

If you add a child object that already has a different display object - * container as a parent, the object is removed from the child list of the - * other display object container.

- * - *

Note: The command stage.addChild() can cause - * problems with a published SWF file, including security problems and - * conflicts with other loaded SWF files. There is only one Stage within a - * Flash runtime instance, no matter how many SWF files you load into the - * runtime. So, generally, objects should not be added to the Stage, - * directly, at all. The only object the Stage should contain is the root - * object. Create a DisplayObjectContainer to contain all of the items on the - * display list. Then, if necessary, add that DisplayObjectContainer instance - * to the Stage.

- * - * @param child The DisplayObject instance to add as a child of this - * DisplayObjectContainer instance. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child is the same as the parent. Also - * throws if the caller is a child(or grandchild etc.) - * of the child being added. - * @event added Dispatched when a display object is added to the display - * list. - */ - public addChild(child: base.DisplayObject): base.DisplayObject; - /** - * Adds a child DisplayObject instance to this DisplayObjectContainer - * instance. The child is added at the index position specified. An index of - * 0 represents the back(bottom) of the display list for this - * DisplayObjectContainer object. - * - *

For example, the following example shows three display objects, labeled - * a, b, and c, at index positions 0, 2, and 1, respectively:

- * - *

If you add a child object that already has a different display object - * container as a parent, the object is removed from the child list of the - * other display object container.

- * - * @param child The DisplayObject instance to add as a child of this - * DisplayObjectContainer instance. - * @param index The index position to which the child is added. If you - * specify a currently occupied index position, the child object - * that exists at that position and all higher positions are - * moved up one position in the child list. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child is the same as the parent. Also - * throws if the caller is a child(or grandchild etc.) - * of the child being added. - * @throws RangeError Throws if the index position does not exist in the - * child list. - * @event added Dispatched when a display object is added to the display - * list. - */ - public addChildAt(child: base.DisplayObject, index: number): base.DisplayObject; - public addChildren(...childarray: base.DisplayObject[]): void; - /** - * - */ - public clone(): base.DisplayObject; - /** - * Determines whether the specified display object is a child of the - * DisplayObjectContainer instance or the instance itself. The search - * includes the entire display list including this DisplayObjectContainer - * instance. Grandchildren, great-grandchildren, and so on each return - * true. - * - * @param child The child object to test. - * @return true if the child object is a child of - * the DisplayObjectContainer or the container itself; otherwise - * false. - */ - public contains(child: base.DisplayObject): boolean; - /** - * - */ - public disposeWithChildren(): void; - /** - * Returns the child display object instance that exists at the specified - * index. - * - * @param index The index position of the child object. - * @return The child display object at the specified index position. - * @throws RangeError Throws if the index does not exist in the child - * list. - */ - public getChildAt(index: number): base.DisplayObject; - /** - * Returns the child display object that exists with the specified name. If - * more that one child display object has the specified name, the method - * returns the first object in the child list. - * - *

The getChildAt() method is faster than the - * getChildByName() method. The getChildAt() method - * accesses a child from a cached array, whereas the - * getChildByName() method has to traverse a linked list to - * access a child.

- * - * @param name The name of the child to return. - * @return The child display object with the specified name. - */ - public getChildByName(name: string): base.DisplayObject; - /** - * Returns the index position of a child DisplayObject instance. - * - * @param child The DisplayObject instance to identify. - * @return The index position of the child display object to identify. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - */ - public getChildIndex(child: base.DisplayObject): number; - /** - * Returns an array of objects that lie under the specified point and are - * children(or grandchildren, and so on) of this DisplayObjectContainer - * instance. Any child objects that are inaccessible for security reasons are - * omitted from the returned array. To determine whether this security - * restriction affects the returned array, call the - * areInaccessibleObjectsUnderPoint() method. - * - *

The point parameter is in the coordinate space of the - * Stage, which may differ from the coordinate space of the display object - * container(unless the display object container is the Stage). You can use - * the globalToLocal() and the localToGlobal() - * methods to convert points between these coordinate spaces.

- * - * @param point The point under which to look. - * @return An array of objects that lie under the specified point and are - * children(or grandchildren, and so on) of this - * DisplayObjectContainer instance. - */ - public getObjectsUnderPoint(point: geom.Point): base.DisplayObject[]; - /** - * Removes the specified child DisplayObject instance from the - * child list of the DisplayObjectContainer instance. The parent - * property of the removed child is set to null , and the object - * is garbage collected if no other references to the child exist. The index - * positions of any display objects above the child in the - * DisplayObjectContainer are decreased by 1. - * - *

The garbage collector reallocates unused memory space. When a variable - * or object is no longer actively referenced or stored somewhere, the - * garbage collector sweeps through and wipes out the memory space it used to - * occupy if no other references to it exist.

- * - * @param child The DisplayObject instance to remove. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - */ - public removeChild(child: base.DisplayObject): base.DisplayObject; - /** - * Removes a child DisplayObject from the specified index - * position in the child list of the DisplayObjectContainer. The - * parent property of the removed child is set to - * null, and the object is garbage collected if no other - * references to the child exist. The index positions of any display objects - * above the child in the DisplayObjectContainer are decreased by 1. - * - *

The garbage collector reallocates unused memory space. When a variable - * or object is no longer actively referenced or stored somewhere, the - * garbage collector sweeps through and wipes out the memory space it used to - * occupy if no other references to it exist.

- * - * @param index The child index of the DisplayObject to remove. - * @return The DisplayObject instance that was removed. - * @throws RangeError Throws if the index does not exist in the child - * list. - * @throws SecurityError This child display object belongs to a sandbox to - * which the calling object does not have access. You - * can avoid this situation by having the child movie - * call the Security.allowDomain() method. - */ - public removeChildAt(index: number): base.DisplayObject; - /** - * Removes all child DisplayObject instances from the child list - * of the DisplayObjectContainer instance. The parent property - * of the removed children is set to null, and the objects are - * garbage collected if no other references to the children exist. - * - * The garbage collector reallocates unused memory space. When a variable or - * object is no longer actively referenced or stored somewhere, the garbage - * collector sweeps through and wipes out the memory space it used to occupy - * if no other references to it exist. - * - * @param beginIndex The beginning position. A value smaller than 0 throws a RangeError. - * @param endIndex The ending position. A value smaller than 0 throws a RangeError. - * @throws RangeError Throws if the beginIndex or endIndex positions do - * not exist in the child list. - */ - public removeChildren(beginIndex?: number, endIndex?: number): void; - /** - * Changes the position of an existing child in the display object container. - * This affects the layering of child objects. For example, the following - * example shows three display objects, labeled a, b, and c, at index - * positions 0, 1, and 2, respectively: - * - *

When you use the setChildIndex() method and specify an - * index position that is already occupied, the only positions that change - * are those in between the display object's former and new position. All - * others will stay the same. If a child is moved to an index LOWER than its - * current index, all children in between will INCREASE by 1 for their index - * reference. If a child is moved to an index HIGHER than its current index, - * all children in between will DECREASE by 1 for their index reference. For - * example, if the display object container in the previous example is named - * container, you can swap the position of the display objects - * labeled a and b by calling the following code:

- * - *

This code results in the following arrangement of objects:

- * - * @param child The child DisplayObject instance for which you want to change - * the index number. - * @param index The resulting index number for the child display - * object. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - * @throws RangeError Throws if the index does not exist in the child - * list. - */ - public setChildIndex(child: base.DisplayObject, index: number): void; - /** - * Swaps the z-order (front-to-back order) of the two specified child - * objects. All other child objects in the display object container remain in - * the same index positions. - * - * @param child1 The first child object. - * @param child2 The second child object. - * @throws ArgumentError Throws if either child parameter is not a child of - * this object. - */ - public swapChildren(child1: base.DisplayObject, child2: base.DisplayObject): void; - /** - * Swaps the z-order(front-to-back order) of the child objects at the two - * specified index positions in the child list. All other child objects in - * the display object container remain in the same index positions. - * - * @param index1 The index position of the first child object. - * @param index2 The index position of the second child object. - * @throws RangeError If either index does not exist in the child list. - */ - public swapChildrenAt(index1: number, index2: number): void; - /** - * @protected - */ - public pInvalidateSceneTransform(): void; - /** - * @protected - */ - public _pUpdateScene(value: Scene): void; - /** - * @protected - */ - public _pUpdateImplicitMouseEnabled(value: boolean): void; - /** - * @protected - */ - public _pUpdateImplicitVisibility(value: boolean): void; - /** - * @protected - */ - public _pUpdateImplicitPartition(value: partition.Partition): void; - /** - * @private - * - * @param child - */ - private removeChildInternal(child); - } -} -declare module away.base { - class LightBase extends containers.DisplayObjectContainer { - private _color; - private _colorR; - private _colorG; - private _colorB; - private _ambientColor; - private _ambient; - public _iAmbientR: number; - public _iAmbientG: number; - public _iAmbientB: number; - private _specular; - public _iSpecularR: number; - public _iSpecularG: number; - public _iSpecularB: number; - private _diffuse; - public _iDiffuseR: number; - public _iDiffuseG: number; - public _iDiffuseB: number; - private _castsShadows; - private _shadowMapper; - constructor(); - public castsShadows : boolean; - public pCreateShadowMapper(): materials.ShadowMapperBase; - public specular : number; - public diffuse : number; - public color : number; - public ambient : number; - public ambientColor : number; - private updateAmbient(); - public iGetObjectProjectionMatrix(entity: entities.IEntity, camera: entities.Camera, target?: geom.Matrix3D): geom.Matrix3D; - public assetType : string; - private updateSpecular(); - private updateDiffuse(); - public shadowMapper : materials.ShadowMapperBase; - } -} -declare module away.projections { - /** - * Provides constant values for camera lens projection options use the the coordinateSystem property - * - * @see away.projections.PerspectiveLens#coordinateSystem - */ - class CoordinateSystem { - /** - * Default option, projects to a left-handed coordinate system - */ - static LEFT_HANDED: string; - /** - * Projects to a right-handed coordinate system - */ - static RIGHT_HANDED: string; - } -} -/** -* @module away.base -*/ -declare module away.projections { - /** - * IMaterialOwner provides an interface for objects that can use materials. - * - * @interface away.base.IMaterialOwner - */ - interface IProjection extends events.IEventDispatcher { - coordinateSystem: string; - frustumCorners: number[]; - matrix: geom.Matrix3D; - near: number; - originX: number; - originY: number; - far: number; - _iAspectRatio: number; - project(point3d: geom.Vector3D): geom.Vector3D; - unproject(nX: number, nY: number, sZ: number): geom.Vector3D; - _iUpdateScissorRect(x: number, y: number, width: number, height: number): any; - _iUpdateViewport(x: number, y: number, width: number, height: number): any; - } -} -declare module away.projections { - class ProjectionBase extends events.EventDispatcher implements IProjection { - public _pMatrix: geom.Matrix3D; - public _pScissorRect: geom.Rectangle; - public _pViewPort: geom.Rectangle; - public _pNear: number; - public _pFar: number; - public _pAspectRatio: number; - public _pMatrixInvalid: boolean; - public _pFrustumCorners: number[]; - public _pCoordinateSystem: string; - public _pOriginX: number; - public _pOriginY: number; - private _unprojection; - private _unprojectionInvalid; - constructor(coordinateSystem?: string); - /** - * The handedness of the coordinate system projection. The default is LEFT_HANDED. - */ - public coordinateSystem : string; - public frustumCorners : number[]; - public matrix : geom.Matrix3D; - public near : number; - public originX : number; - public originY : number; - public far : number; - public project(point3d: geom.Vector3D): geom.Vector3D; - public unprojectionMatrix : geom.Matrix3D; - public unproject(nX: number, nY: number, sZ: number): geom.Vector3D; - public clone(): ProjectionBase; - public _iAspectRatio : number; - public pInvalidateMatrix(): void; - public pUpdateMatrix(): void; - public _iUpdateScissorRect(x: number, y: number, width: number, height: number): void; - public _iUpdateViewport(x: number, y: number, width: number, height: number): void; - } -} -declare module away.projections { - class PerspectiveProjection extends ProjectionBase { - private _fieldOfView; - private _focalLength; - private _hFieldOfView; - private _hFocalLength; - private _preserveAspectRatio; - private _preserveFocalLength; - constructor(fieldOfView?: number, coordinateSystem?: string); - /** - * - */ - public preserveAspectRatio : boolean; - /** - * - */ - public preserveFocalLength : boolean; - /** - * - */ - public fieldOfView : number; - /** - * - */ - public focalLength : number; - /** - * - */ - public hFieldOfView : number; - /** - * - */ - public hFocalLength : number; - public unproject(nX: number, nY: number, sZ: number): geom.Vector3D; - public clone(): ProjectionBase; - public pUpdateMatrix(): void; - } -} -declare module away.projections { - class FreeMatrixProjection extends ProjectionBase { - constructor(); - public near : number; - public far : number; - public iAspectRatio : number; - public clone(): ProjectionBase; - public pUpdateMatrix(): void; - } -} -declare module away.projections { - class OrthographicProjection extends ProjectionBase { - private _projectionHeight; - private _xMax; - private _yMax; - constructor(projectionHeight?: number); - public projectionHeight : number; - public unproject(nX: number, nY: number, sZ: number): geom.Vector3D; - public clone(): ProjectionBase; - public pUpdateMatrix(): void; - } -} -declare module away.projections { - class OrthographicOffCenterProjection extends ProjectionBase { - private _minX; - private _maxX; - private _minY; - private _maxY; - constructor(minX: number, maxX: number, minY: number, maxY: number); - public minX : number; - public maxX : number; - public minY : number; - public maxY : number; - public unproject(nX: number, nY: number, sZ: number): geom.Vector3D; - public clone(): ProjectionBase; - public pUpdateMatrix(): void; - } -} -declare module away.projections { - class ObliqueNearPlaneProjection extends ProjectionBase { - private _baseProjection; - private _plane; - private _onProjectionMatrixChangedDelegate; - constructor(baseProjection: IProjection, plane: geom.Plane3D); - public frustumCorners : number[]; - public near : number; - public far : number; - public iAspectRatio : number; - public plane : geom.Plane3D; - public baseProjection : IProjection; - private onProjectionMatrixChanged(event); - public pUpdateMatrix(): void; - } -} -declare module away.entities { - class Camera extends containers.DisplayObjectContainer implements IEntity { - private _viewProjection; - private _viewProjectionDirty; - private _projection; - private _frustumPlanes; - private _frustumPlanesDirty; - private _onProjectionMatrixChangedDelegate; - constructor(projection?: projections.IProjection); - public pCreateDefaultBoundingVolume(): bounds.BoundingVolumeBase; - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.EntityNode; - public assetType : string; - private onProjectionMatrixChanged(event); - public frustumPlanes : geom.Plane3D[]; - private updateFrustum(); - /** - * @protected - */ - public pInvalidateSceneTransform(): void; - /** - * @protected - */ - public pUpdateBounds(): void; - /** - * - */ - public projection : projections.IProjection; - /** - * - */ - public viewProjection : geom.Matrix3D; - /** - * Calculates the ray in scene space from the camera to the given normalized coordinates in screen space. - * - * @param nX The normalised x coordinate in screen space, -1 corresponds to the left edge of the viewport, 1 to the right. - * @param nY The normalised y coordinate in screen space, -1 corresponds to the top edge of the viewport, 1 to the bottom. - * @param sZ The z coordinate in screen space, representing the distance into the screen. - * @return The ray from the camera to the scene space position of the given screen coordinates. - */ - public getRay(nX: number, nY: number, sZ: number): geom.Vector3D; - /** - * Calculates the normalised position in screen space of the given scene position. - * - * @param point3d the position vector of the scene coordinates to be projected. - * @return The normalised screen position of the given scene coordinates. - */ - public project(point3d: geom.Vector3D): geom.Vector3D; - /** - * Calculates the scene position of the given normalized coordinates in screen space. - * - * @param nX The normalised x coordinate in screen space, minus the originX offset of the projection property. - * @param nY The normalised y coordinate in screen space, minus the originY offset of the projection property. - * @param sZ The z coordinate in screen space, representing the distance into the screen. - * @return The scene position of the given screen coordinates. - */ - public unproject(nX: number, nY: number, sZ: number): geom.Vector3D; - public _iCollectRenderables(renderer: render.IRenderer): void; - public _iCollectRenderable(renderer: render.IRenderer): void; - } -} -declare module away.materials { - class ShadowMapperBase { - public _pCasterCollector: traverse.ShadowCasterCollector; - private _depthMap; - public _pDepthMapSize: number; - public _pLight: base.LightBase; - private _explicitDepthMap; - private _autoUpdateShadows; - public _iShadowsInvalid: boolean; - constructor(); - public pCreateCasterCollector(): traverse.ShadowCasterCollector; - public autoUpdateShadows : boolean; - public updateShadows(): void; - public iSetDepthMap(depthMap: textures.TextureProxyBase): void; - public light : base.LightBase; - public depthMap : textures.TextureProxyBase; - public depthMapSize : number; - public dispose(): void; - public pCreateDepthTexture(): textures.TextureProxyBase; - public iRenderDepthMap(stage: base.Stage, entityCollector: traverse.EntityCollector, renderer: render.IRenderer): void; - public pUpdateDepthProjection(viewCamera: entities.Camera): void; - public pDrawDepthMap(target: textures.TextureProxyBase, scene: containers.Scene, renderer: render.IRenderer): void; - public _pSetDepthMapSize(value: any): void; - } -} -declare module away.materials { - class CubeMapShadowMapper extends ShadowMapperBase { - private _depthCameras; - private _projections; - private _needsRender; - constructor(); - private initCameras(); - private addCamera(rotationX, rotationY, rotationZ); - public pCreateDepthTexture(): textures.TextureProxyBase; - public pUpdateDepthProjection(viewCamera: entities.Camera): void; - public pDrawDepthMap(target: textures.RenderTexture, scene: containers.Scene, renderer: render.IRenderer): void; - } -} -declare module away.materials { - class DirectionalShadowMapper extends ShadowMapperBase { - public _pOverallDepthCamera: entities.Camera; - public _pLocalFrustum: number[]; - public _pLightOffset: number; - public _pMatrix: geom.Matrix3D; - public _pOverallDepthProjection: projections.FreeMatrixProjection; - public _pSnap: number; - public _pCullPlanes: geom.Plane3D[]; - public _pMinZ: number; - public _pMaxZ: number; - constructor(); - public snap : number; - public lightOffset : number; - public iDepthProjection : geom.Matrix3D; - public depth : number; - public pDrawDepthMap(target: textures.TextureProxyBase, scene: containers.Scene, renderer: render.IRenderer): void; - public pUpdateCullPlanes(viewCamera: entities.Camera): void; - public pUpdateDepthProjection(viewCamera: entities.Camera): void; - public pUpdateProjectionFromFrustumCorners(viewCamera: entities.Camera, corners: number[], matrix: geom.Matrix3D): void; - } -} -declare module away.materials { - class CascadeShadowMapper extends DirectionalShadowMapper implements events.IEventDispatcher { - public _pScissorRects: geom.Rectangle[]; - private _pScissorRectsInvalid; - private _splitRatios; - private _numCascades; - private _depthCameras; - private _depthLenses; - private _texOffsetsX; - private _texOffsetsY; - private _changeDispatcher; - private _nearPlaneDistances; - constructor(numCascades?: number); - public getSplitRatio(index: number): number; - public setSplitRatio(index: number, value: number): void; - public getDepthProjections(partition: number): geom.Matrix3D; - private init(); - public _pSetDepthMapSize(value: number): void; - private invalidateScissorRects(); - public numCascades : number; - public pDrawDepthMap(target: textures.RenderTexture, scene: containers.Scene, renderer: render.IRenderer): void; - private updateScissorRects(); - public pUpdateDepthProjection(viewCamera: entities.Camera): void; - private updateProjectionPartition(matrix, splitRatio, texOffsetX, texOffsetY); - public addEventListener(type: string, listener: Function): void; - public removeEventListener(type: string, listener: Function): void; - public dispatchEvent(event: events.Event): void; - public hasEventListener(type: string): boolean; - public _iNearPlaneDistances : number[]; - } -} -declare module away.materials { - class NearDirectionalShadowMapper extends DirectionalShadowMapper { - private _coverageRatio; - constructor(coverageRatio?: number); - /** - * A value between 0 and 1 to indicate the ratio of the view frustum that needs to be covered by the shadow map. - */ - public coverageRatio : number; - public pUpdateDepthProjection(viewCamera: entities.Camera): void; - } -} -declare module away.entities { - interface IEntity extends library.IAsset { - x: number; - y: number; - z: number; - rotationX: number; - rotationY: number; - rotationZ: number; - scaleX: number; - scaleY: number; - scaleZ: number; - /** - * - */ - bounds: bounds.BoundingVolumeBase; - /** - * - */ - castsShadows: boolean; - /** - * - */ - inverseSceneTransform: geom.Matrix3D; - /** - * - */ - partitionNode: partition.EntityNode; - /** - * - */ - pickingCollider: pick.IPickingCollider; - /** - * - */ - transform: geom.Transform; - /** - * - */ - scene: containers.Scene; - /** - * - */ - scenePosition: geom.Vector3D; - /** - * - */ - sceneTransform: geom.Matrix3D; - /** - * - */ - worldBounds: bounds.BoundingVolumeBase; - /** - * - */ - zOffset: number; - /** - * - */ - isIntersectingRay(rayPosition: geom.Vector3D, rayDirection: geom.Vector3D): boolean; - /** - * - * - * @param target - * @param upAxis - */ - lookAt(target: geom.Vector3D, upAxis?: geom.Vector3D): any; - /** - * @internal - */ - _iPickingCollisionVO: pick.PickingCollisionVO; - /** - * @internal - */ - _iController: controllers.ControllerBase; - /** - * @internal - */ - _iAssignedPartition: partition.Partition; - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - _iTestCollision(shortestCollisionDistance: number, findClosest: boolean): boolean; - /** - * @internal - */ - _iIsMouseEnabled(): boolean; - /** - * @internal - */ - _iIsVisible(): boolean; - _iInternalUpdate(): any; - /** - * The transformation matrix that transforms from model to world space, adapted with any special operations needed to render. - * For example, assuring certain alignedness which is not inherent in the scene transform. By default, this would - * return the scene transform. - */ - getRenderSceneTransform(camera: Camera): geom.Matrix3D; - /** - * - * @param renderer - * @private - */ - _iCollectRenderables(renderer: render.IRenderer): any; - } -} -/** -* The Billboard class represents display objects that represent bitmap images. -* These can be images that you load with the flash.Assets or -* flash.display.Loader classes, or they can be images that you -* create with the Billboard() constructor. -* -*

The Billboard() constructor allows you to create a Billboard -* object that contains a reference to a BitmapData object. After you create a -* Billboard object, use the addChild() or addChildAt() -* method of the parent DisplayObjectContainer instance to place the bitmap on -* the display list.

-* -*

A Billboard object can share its BitmapData reference among several Billboard -* objects, independent of translation or rotation properties. Because you can -* create multiple Billboard objects that reference the same BitmapData object, -* multiple display objects can use the same complex BitmapData object without -* incurring the memory overhead of a BitmapData object for each display -* object instance.

-* -*

A BitmapData object can be drawn to the screen by a Billboard object in one -* of two ways: by using the default hardware renderer with a single hardware surface, -* or by using the slower software renderer when 3D acceleration is not available.

-* -*

If you would prefer to perform a batch rendering command, rather than using a -* single surface for each Billboard object, you can also draw to the screen using the -* drawTiles() or drawTriangles() methods which are -* available to flash.display.Tilesheet and flash.display.Graphics -* objects.

-* -*

Note: The Billboard class is not a subclass of the InteractiveObject -* class, so it cannot dispatch mouse events. However, you can use the -* addEventListener() method of the display object container that -* contains the Billboard object.

-*/ -declare module away.entities { - class Billboard extends base.DisplayObject implements IEntity, base.IMaterialOwner { - private _animator; - private _billboardWidth; - private _billboardHeight; - private _material; - private _uvTransform; - private onSizeChangedDelegate; - /** - * Defines the animator of the mesh. Act on the mesh's geometry. Defaults to null - */ - public animator : animators.IAnimator; - /** - * - */ - public assetType : string; - /** - * The BitmapData object being referenced. - */ - public bitmapData: base.BitmapData; - /** - * - */ - public billboardHeight : number; - /** - * - */ - public billboardWidth : number; - /** - * - */ - public material : materials.MaterialBase; - /** - * Controls whether or not the Billboard object is snapped to the nearest pixel. - * This value is ignored in the native and HTML5 targets. - * The PixelSnapping class includes possible values: - *
    - *
  • PixelSnapping.NEVER - No pixel snapping occurs.
  • - *
  • PixelSnapping.ALWAYS - The image is always snapped to - * the nearest pixel, independent of transformation.
  • - *
  • PixelSnapping.AUTO - The image is snapped to the - * nearest pixel if it is drawn with no rotation or skew and it is drawn at a - * scale factor of 99.9% to 100.1%. If these conditions are satisfied, the - * bitmap image is drawn at 100% scale, snapped to the nearest pixel. - * When targeting Flash Player, this value allows the image to be drawn as fast - * as possible using the internal vector renderer.
  • - *
- */ - public pixelSnapping: string; - /** - * Controls whether or not the bitmap is smoothed when scaled. If - * true, the bitmap is smoothed when scaled. If - * false, the bitmap is not smoothed when scaled. - */ - public smoothing: boolean; - /** - * - */ - public uvTransform : geom.UVTransform; - constructor(material: materials.MaterialBase, pixelSnapping?: string, smoothing?: boolean); - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.EntityNode; - /** - * @protected - */ - public pUpdateBounds(): void; - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - public _iTestCollision(shortestCollisionDistance: number, findClosest: boolean): boolean; - /** - * @private - */ - private onSizeChanged(event); - public _iCollectRenderables(renderer: render.IRenderer): void; - public _iCollectRenderable(renderer: render.IRenderer): void; - } -} -declare module away.entities { - class DirectionalLight extends base.LightBase implements IEntity { - private _direction; - private _tmpLookAt; - private _sceneDirection; - private _projAABBPoints; - constructor(xDir?: number, yDir?: number, zDir?: number); - public sceneDirection : geom.Vector3D; - public direction : geom.Vector3D; - /** - * - * @returns {away.bounds.NullBounds} - */ - public pCreateDefaultBoundingVolume(): bounds.BoundingVolumeBase; - /** - * - */ - public pUpdateBounds(): void; - public pUpdateSceneTransform(): void; - public pCreateShadowMapper(): materials.DirectionalShadowMapper; - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.EntityNode; - public iGetObjectProjectionMatrix(entity: IEntity, camera: Camera, target?: geom.Matrix3D): geom.Matrix3D; - public _iCollectRenderables(renderer: render.IRenderer): void; - } -} -declare module away.entities { - class LightProbe extends base.LightBase implements IEntity { - private _diffuseMap; - private _specularMap; - constructor(diffuseMap: textures.CubeTextureBase, specularMap?: textures.CubeTextureBase); - public diffuseMap : textures.CubeTextureBase; - public specularMap : textures.CubeTextureBase; - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.EntityNode; - public pUpdateBounds(): void; - public pCreateDefaultBoundingVolume(): bounds.BoundingVolumeBase; - public iGetObjectProjectionMatrix(entity: IEntity, camera: Camera, target?: geom.Matrix3D): geom.Matrix3D; - public _iCollectRenderables(renderer: render.IRenderer): void; - } -} -declare module away.entities { - /** - * A Line Segment primitive. - */ - class LineSegment extends base.DisplayObject implements IEntity, base.IMaterialOwner { - private _animator; - private _material; - private _uvTransform; - private onSizeChangedDelegate; - public _startPosition: geom.Vector3D; - public _endPosition: geom.Vector3D; - public _halfThickness: number; - /** - * Defines the animator of the line segment. Act on the line segment's geometry. Defaults to null - */ - public animator : animators.IAnimator; - /** - * - */ - public assetType : string; - /** - * - */ - public startPostion : geom.Vector3D; - public startPosition : geom.Vector3D; - /** - * - */ - public endPosition : geom.Vector3D; - /** - * - */ - public material : materials.MaterialBase; - /** - * - */ - public thickness : number; - /** - * - */ - public uvTransform : geom.UVTransform; - /** - * Create a line segment - * - * @param startPosition Start position of the line segment - * @param endPosition Ending position of the line segment - * @param thickness Thickness of the line - */ - constructor(material: materials.MaterialBase, startPosition: geom.Vector3D, endPosition: geom.Vector3D, thickness?: number); - public dispose(): void; - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.EntityNode; - /** - * @protected - */ - public pUpdateBounds(): void; - /** - * @private - */ - private onSizeChanged(event); - /** - * @private - */ - private notifyRenderableUpdate(); - public _iCollectRenderables(renderer: render.IRenderer): void; - public _iCollectRenderable(renderer: render.IRenderer): void; - } -} -declare module away.entities { - /** - * Mesh is an instance of a Geometry, augmenting it with a presence in the scene graph, a material, and an animation - * state. It consists out of SubMeshes, which in turn correspond to SubGeometries. SubMeshes allow different parts - * of the geometry to be assigned different materials. - */ - class Mesh extends containers.DisplayObjectContainer implements IEntity { - private _uvTransform; - private _subMeshes; - private _geometry; - private _material; - private _animator; - private _castsShadows; - private _shareAnimationGeometry; - private _onGeometryBoundsInvalidDelegate; - private _onSubGeometryAddedDelegate; - private _onSubGeometryRemovedDelegate; - /** - * Defines the animator of the mesh. Act on the mesh's geometry. Default value is null. - */ - public animator : animators.IAnimator; - /** - * - */ - public assetType : string; - /** - * Indicates whether or not the Mesh can cast shadows. Default value is true. - */ - public castsShadows : boolean; - /** - * The geometry used by the mesh that provides it with its shape. - */ - public geometry : base.Geometry; - /** - * The material with which to render the Mesh. - */ - public material : materials.MaterialBase; - /** - * Indicates whether or not the mesh share the same animation geometry. - */ - public shareAnimationGeometry : boolean; - /** - * The SubMeshes out of which the Mesh consists. Every SubMesh can be assigned a material to override the Mesh's - * material. - */ - public subMeshes : base.ISubMesh[]; - /** - * - */ - public uvTransform : geom.UVTransform; - /** - * Create a new Mesh object. - * - * @param geometry The geometry used by the mesh that provides it with its shape. - * @param material [optional] The material with which to render the Mesh. - */ - constructor(geometry: base.Geometry, material?: materials.MaterialBase); - /** - * - */ - public bakeTransformations(): void; - /** - * @inheritDoc - */ - public dispose(): void; - /** - * Disposes mesh including the animator and children. This is a merely a convenience method. - * @return - */ - public disposeWithAnimatorAndChildren(): void; - /** - * Clones this Mesh instance along with all it's children, while re-using the same - * material, geometry and animation set. The returned result will be a copy of this mesh, - * containing copies of all of it's children. - * - * Properties that are re-used (i.e. not cloned) by the new copy include name, - * geometry, and material. Properties that are cloned or created anew for the copy - * include subMeshes, children of the mesh, and the animator. - * - * If you want to copy just the mesh, reusing it's geometry and material while not - * cloning it's children, the simplest way is to create a new mesh manually: - * - * - * var clone : Mesh = new Mesh(original.geometry, original.material); - * - */ - public clone(): base.DisplayObject; - /** - * //TODO - * - * @param subGeometry - * @returns {SubMeshBase} - */ - public getSubMeshFromSubGeometry(subGeometry: base.TriangleSubGeometry): base.ISubMesh; - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.EntityNode; - /** - * //TODO - * - * @protected - */ - public pUpdateBounds(): void; - /** - * //TODO - * - * @private - */ - private onGeometryBoundsInvalid(event); - /** - * Called when a SubGeometry was added to the Geometry. - * - * @private - */ - private onSubGeometryAdded(event); - /** - * Called when a SubGeometry was removed from the Geometry. - * - * @private - */ - private onSubGeometryRemoved(event); - /** - * Adds a SubMeshBase wrapping a SubGeometry. - * - * @param subGeometry - */ - private addSubMesh(subGeometry); - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - public _iTestCollision(shortestCollisionDistance: number, findClosest: boolean): boolean; - /** - * - * @param renderer - * - * @internal - */ - public _iCollectRenderables(renderer: render.IRenderer): void; - public _iInvalidateRenderableGeometries(): void; - } -} -declare module away.entities { - class PointLight extends base.LightBase implements IEntity { - public _pRadius: number; - public _pFallOff: number; - public _pFallOffFactor: number; - constructor(); - public pCreateShadowMapper(): materials.CubeMapShadowMapper; - public radius : number; - public iFallOffFactor(): number; - public fallOff : number; - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.EntityNode; - public pUpdateBounds(): void; - public pCreateDefaultBoundingVolume(): bounds.BoundingVolumeBase; - public iGetObjectProjectionMatrix(entity: IEntity, camera: Camera, target?: geom.Matrix3D): geom.Matrix3D; - public _iCollectRenderables(renderer: render.IRenderer): void; - } -} -/** -* This class is used to create lightweight shapes using the ActionScript -* drawing application program interface(API). The Shape class includes a -* graphics property, which lets you access methods from the -* Graphics class. -* -*

The Sprite class also includes a graphicsproperty, and it -* includes other features not available to the Shape class. For example, a -* Sprite object is a display object container, whereas a Shape object is not -* (and cannot contain child display objects). For this reason, Shape objects -* consume less memory than Sprite objects that contain the same graphics. -* However, a Sprite object supports user input events, while a Shape object -* does not.

-*/ -declare module away.entities { - class Shape extends base.DisplayObject { - private _graphics; - /** - * Specifies the Graphics object belonging to this Shape object, where vector - * drawing commands can occur. - */ - public graphics : base.Graphics; - /** - * Creates a new Shape object. - */ - constructor(); - } -} -declare module away.entities { - /** - * A Skybox class is used to render a sky in the scene. It's always considered static and 'at infinity', and as - * such it's always centered at the camera's position and sized to exactly fit within the camera's frustum, ensuring - * the sky box is always as large as possible without being clipped. - */ - class Skybox extends base.DisplayObject implements IEntity, base.IMaterialOwner { - private _uvTransform; - private _material; - private _animator; - public animator : animators.IAnimator; - /** - * - */ - public uvTransform : geom.UVTransform; - /** - * Create a new Skybox object. - * - * @param material The material with which to render the Skybox. - */ - constructor(material: materials.MaterialBase); - /** - * The material with which to render the Skybox. - */ - public material : materials.MaterialBase; - public assetType : string; - /** - * @protected - */ - public pInvalidateBounds(): void; - /** - * @protected - */ - public pCreateEntityPartitionNode(): partition.SkyboxNode; - /** - * @protected - */ - public pCreateDefaultBoundingVolume(): bounds.BoundingVolumeBase; - /** - * @protected - */ - public pUpdateBounds(): void; - public castsShadows : boolean; - public _iCollectRenderables(renderer: render.IRenderer): void; - public _iCollectRenderable(renderer: render.IRenderer): void; - } -} -/** -* The TextField class is used to create display objects for text display and -* input. You can use the TextField class to -* perform low-level text rendering. However, in Flex, you typically use the -* Label, Text, TextArea, and TextInput controls to process text. You can give a text field an instance name in the -* Property inspector and use the methods and properties of the TextField -* class to manipulate it with ActionScript. TextField instance names are -* displayed in the Movie Explorer and in the Insert Target Path dialog box in -* the Actions panel. -* -*

To create a text field dynamically, use the TextField() -* constructor.

-* -*

The methods of the TextField class let you set, select, and manipulate -* text in a dynamic or input text field that you create during authoring or -* at runtime.

-* -*

ActionScript provides several ways to format your text at runtime. The -* TextFormat class lets you set character and paragraph formatting for -* TextField objects. You can apply Cascading Style Sheets(CSS) styles to -* text fields by using the TextField.styleSheet property and the -* StyleSheet class. You can use CSS to style built-in HTML tags, define new -* formatting tags, or apply styles. You can assign HTML formatted text, which -* optionally uses CSS styles, directly to a text field. HTML text that you -* assign to a text field can contain embedded media(movie clips, SWF files, -* GIF files, PNG files, and JPEG files). The text wraps around the embedded -* media in the same way that a web browser wraps text around media embedded -* in an HTML document.

-* -*

Flash Player supports a subset of HTML tags that you can use to format -* text. See the list of supported HTML tags in the description of the -* htmlText property.

-* -* @event change Dispatched after a control value is -* modified, unlike the -* textInput event, which is -* dispatched before the value is modified. -* Unlike the W3C DOM Event Model version of -* the change event, which -* dispatches the event only after the -* control loses focus, the ActionScript 3.0 -* version of the change event -* is dispatched any time the control -* changes. For example, if a user types text -* into a text field, a change -* event is dispatched after every keystroke. -* @event link Dispatched when a user clicks a hyperlink -* in an HTML-enabled text field, where the -* URL begins with "event:". The remainder of -* the URL after "event:" is placed in the -* text property of the LINK event. -* -*

Note: The default behavior, -* adding the text to the text field, occurs -* only when Flash Player generates the -* event, which in this case happens when a -* user attempts to input text. You cannot -* put text into a text field by sending it -* textInput events.

-* @event scroll Dispatched by a TextField object -* after the user scrolls. -* @event textInput Flash Player dispatches the -* textInput event when a user -* enters one or more characters of text. -* Various text input methods can generate -* this event, including standard keyboards, -* input method editors(IMEs), voice or -* speech recognition systems, and even the -* act of pasting plain text with no -* formatting or style information. -* @event textInteractionModeChange Flash Player dispatches the -* textInteractionModeChange -* event when a user changes the interaction -* mode of a text field. for example on -* Android, one can toggle from NORMAL mode -* to SELECTION mode using context menu -* options -*/ -declare module away.entities { - class TextField extends base.DisplayObject { - private _bottomScrollV; - private _caretIndex; - private _length; - private _maxScrollH; - private _maxScrollV; - private _numLines; - private _selectionBeginIndex; - private _selectionEndIndex; - private _text; - private _textHeight; - private _textInteractionMode; - private _textWidth; - private _charBoundaries; - private _charIndexAtPoint; - private _firstCharInParagraph; - private _imageReference; - private _lineIndexAtPoint; - private _lineIndexOfChar; - private _lineLength; - private _lineMetrics; - private _lineOffset; - private _lineText; - private _paragraphLength; - private _textFormat; - /** - * When set to true and the text field is not in focus, Flash - * Player highlights the selection in the text field in gray. When set to - * false and the text field is not in focus, Flash Player does - * not highlight the selection in the text field. - * - * @default false - */ - public alwaysShowSelection: boolean; - /** - * The type of anti-aliasing used for this text field. Use - * flash.text.AntiAliasType constants for this property. You can - * control this setting only if the font is embedded(with the - * embedFonts property set to true). The default - * setting is flash.text.AntiAliasType.NORMAL. - * - *

To set values for this property, use the following string values:

- */ - public antiAliasType: text.AntiAliasType; - /** - * Controls automatic sizing and alignment of text fields. Acceptable values - * for the TextFieldAutoSize constants: - * TextFieldAutoSize.NONE(the default), - * TextFieldAutoSize.LEFT, TextFieldAutoSize.RIGHT, - * and TextFieldAutoSize.CENTER. - * - *

If autoSize is set to TextFieldAutoSize.NONE - * (the default) no resizing occurs.

- * - *

If autoSize is set to TextFieldAutoSize.LEFT, - * the text is treated as left-justified text, meaning that the left margin - * of the text field remains fixed and any resizing of a single line of the - * text field is on the right margin. If the text includes a line break(for - * example, "\n" or "\r"), the bottom is also - * resized to fit the next line of text. If wordWrap is also set - * to true, only the bottom of the text field is resized and the - * right side remains fixed.

- * - *

If autoSize is set to - * TextFieldAutoSize.RIGHT, the text is treated as - * right-justified text, meaning that the right margin of the text field - * remains fixed and any resizing of a single line of the text field is on - * the left margin. If the text includes a line break(for example, - * "\n" or "\r"), the bottom is also resized to fit the next - * line of text. If wordWrap is also set to true, - * only the bottom of the text field is resized and the left side remains - * fixed.

- * - *

If autoSize is set to - * TextFieldAutoSize.CENTER, the text is treated as - * center-justified text, meaning that any resizing of a single line of the - * text field is equally distributed to both the right and left margins. If - * the text includes a line break(for example, "\n" or - * "\r"), the bottom is also resized to fit the next line of - * text. If wordWrap is also set to true, only the - * bottom of the text field is resized and the left and right sides remain - * fixed.

- * - * @throws ArgumentError The autoSize specified is not a member - * of flash.text.TextFieldAutoSize. - */ - public autoSize: text.TextFieldAutoSize; - /** - * Specifies whether the text field has a background fill. If - * true, the text field has a background fill. If - * false, the text field has no background fill. Use the - * backgroundColor property to set the background color of a - * text field. - * - * @default false - */ - public background: boolean; - /** - * The color of the text field background. The default value is - * 0xFFFFFF(white). This property can be retrieved or set, even - * if there currently is no background, but the color is visible only if the - * text field has the background property set to - * true. - */ - public backgroundColor: number; - /** - * Specifies whether the text field has a border. If true, the - * text field has a border. If false, the text field has no - * border. Use the borderColor property to set the border color. - * - * @default false - */ - public border: boolean; - /** - * The color of the text field border. The default value is - * 0x000000(black). This property can be retrieved or set, even - * if there currently is no border, but the color is visible only if the text - * field has the border property set to true. - */ - public borderColor: number; - /** - * An integer(1-based index) that indicates the bottommost line that is - * currently visible in the specified text field. Think of the text field as - * a window onto a block of text. The scrollV property is the - * 1-based index of the topmost visible line in the window. - * - *

All the text between the lines indicated by scrollV and - * bottomScrollV is currently visible in the text field.

- */ - public bottomScrollV : number; - /** - * The index of the insertion point(caret) position. If no insertion point - * is displayed, the value is the position the insertion point would be if - * you restored focus to the field(typically where the insertion point last - * was, or 0 if the field has not had focus). - * - *

Selection span indexes are zero-based(for example, the first position - * is 0, the second position is 1, and so on).

- */ - public caretIndex : number; - /** - * A Boolean value that specifies whether extra white space(spaces, line - * breaks, and so on) in a text field with HTML text is removed. The default - * value is false. The condenseWhite property only - * affects text set with the htmlText property, not the - * text property. If you set text with the text - * property, condenseWhite is ignored. - * - *

If condenseWhite is set to true, use standard - * HTML commands such as
and

to place line - * breaks in the text field.

- * - *

Set the condenseWhite property before setting the - * htmlText property.

- */ - public condenseWhite: boolean; - /** - * Specifies the format applied to newly inserted text, such as text entered - * by a user or text inserted with the replaceSelectedText() - * method. - * - *

Note: When selecting characters to be replaced with - * setSelection() and replaceSelectedText(), the - * defaultTextFormat will be applied only if the text has been - * selected up to and including the last character. Here is an example:

- *
 public my_txt:TextField new TextField();
-        * my_txt.text = "Flash Macintosh version"; public my_fmt:TextFormat = new
-        * TextFormat(); my_fmt.color = 0xFF0000; my_txt.defaultTextFormat = my_fmt;
-        * my_txt.setSelection(6,15); // partial text selected - defaultTextFormat
-        * not applied my_txt.setSelection(6,23); // text selected to end -
-        * defaultTextFormat applied my_txt.replaceSelectedText("Windows version");
-        * 
- * - *

When you access the defaultTextFormat property, the - * returned TextFormat object has all of its properties defined. No property - * is null.

- * - *

Note: You can't set this property if a style sheet is applied to - * the text field.

- * - * @throws Error This method cannot be used on a text field with a style - * sheet. - */ - public defaultTextFormat: text.TextFormat; - /** - * Specifies whether the text field is a password text field. If the value of - * this property is true, the text field is treated as a - * password text field and hides the input characters using asterisks instead - * of the actual characters. If false, the text field is not - * treated as a password text field. When password mode is enabled, the Cut - * and Copy commands and their corresponding keyboard shortcuts will not - * function. This security mechanism prevents an unscrupulous user from using - * the shortcuts to discover a password on an unattended computer. - * - * @default false - */ - public displayAsPassword: boolean; - /** - * Specifies whether to render by using embedded font outlines. If - * false, Flash Player renders the text field by using device - * fonts. - * - *

If you set the embedFonts property to true - * for a text field, you must specify a font for that text by using the - * font property of a TextFormat object applied to the text - * field. If the specified font is not embedded in the SWF file, the text is - * not displayed.

- * - * @default false - */ - public embedFonts: boolean; - /** - * The type of grid fitting used for this text field. This property applies - * only if the flash.text.AntiAliasType property of the text - * field is set to flash.text.AntiAliasType.ADVANCED. - * - *

The type of grid fitting used determines whether Flash Player forces - * strong horizontal and vertical lines to fit to a pixel or subpixel grid, - * or not at all.

- * - *

For the flash.text.GridFitType property, you can use the - * following string values:

- * - * @default pixel - */ - public gridFitType: text.GridFitType; - /** - * Contains the HTML representation of the text field contents. - * - *

Flash Player supports the following HTML tags:

- * - *

Flash Player and AIR also support explicit character codes, such as - * &(ASCII ampersand) and €(Unicode € symbol).

- */ - public htmlText: string; - /** - * The number of characters in a text field. A character such as tab - * (\t) counts as one character. - */ - public length : number; - /** - * The maximum number of characters that the text field can contain, as - * entered by a user. A script can insert more text than - * maxChars allows; the maxChars property indicates - * only how much text a user can enter. If the value of this property is - * 0, a user can enter an unlimited amount of text. - * - * @default 0 - */ - public maxChars: number; - /** - * The maximum value of scrollH. - */ - public maxScrollH(): number; - /** - * The maximum value of scrollV. - */ - public maxScrollV(): number; - /** - * A Boolean value that indicates whether Flash Player automatically scrolls - * multiline text fields when the user clicks a text field and rolls the - * mouse wheel. By default, this value is true. This property is - * useful if you want to prevent mouse wheel scrolling of text fields, or - * implement your own text field scrolling. - */ - public mouseWheelEnabled: boolean; - /** - * Indicates whether field is a multiline text field. If the value is - * true, the text field is multiline; if the value is - * false, the text field is a single-line text field. In a field - * of type TextFieldType.INPUT, the multiline value - * determines whether the Enter key creates a new line(a value - * of false, and the Enter key is ignored). If you - * paste text into a TextField with a multiline - * value of false, newlines are stripped out of the text. - * - * @default false - */ - public multiline: boolean; - /** - * Defines the number of text lines in a multiline text field. If - * wordWrap property is set to true, the number of - * lines increases when text wraps. - */ - public numLines : number; - /** - * Indicates the set of characters that a user can enter into the text field. - * If the value of the restrict property is null, - * you can enter any character. If the value of the restrict - * property is an empty string, you cannot enter any character. If the value - * of the restrict property is a string of characters, you can - * enter only characters in the string into the text field. The string is - * scanned from left to right. You can specify a range by using the hyphen - * (-) character. Only user interaction is restricted; a script can put any - * text into the text field. This property does - * not synchronize with the Embed font options in the Property inspector. - * - *

If the string begins with a caret(^) character, all characters are - * initially accepted and succeeding characters in the string are excluded - * from the set of accepted characters. If the string does not begin with a - * caret(^) character, no characters are initially accepted and succeeding - * characters in the string are included in the set of accepted - * characters.

- * - *

The following example allows only uppercase characters, spaces, and - * numbers to be entered into a text field:

- *
 my_txt.restrict = "A-Z 0-9"; 
- * - *

The following example includes all characters, but excludes lowercase - * letters:

- *
 my_txt.restrict = "^a-z"; 
- * - *

You can use a backslash to enter a ^ or - verbatim. The accepted - * backslash sequences are \-, \^ or \\. The backslash must be an actual - * character in the string, so when specified in ActionScript, a double - * backslash must be used. For example, the following code includes only the - * dash(-) and caret(^):

- *
 my_txt.restrict = "\\-\\^"; 
- * - *

The ^ can be used anywhere in the string to toggle between including - * characters and excluding characters. The following code includes only - * uppercase letters, but excludes the uppercase letter Q:

- *
 my_txt.restrict = "A-Z^Q"; 
- * - *

You can use the \u escape sequence to construct - * restrict strings. The following code includes only the - * characters from ASCII 32(space) to ASCII 126(tilde).

- *
 my_txt.restrict = "\u0020-\u007E"; 
- * - * @default null - */ - public restrict: string; - /** - * The current horizontal scrolling position. If the scrollH - * property is 0, the text is not horizontally scrolled. This property value - * is an integer that represents the horizontal position in pixels. - * - *

The units of horizontal scrolling are pixels, whereas the units of - * vertical scrolling are lines. Horizontal scrolling is measured in pixels - * because most fonts you typically use are proportionally spaced; that is, - * the characters can have different widths. Flash Player performs vertical - * scrolling by line because users usually want to see a complete line of - * text rather than a partial line. Even if a line uses multiple fonts, the - * height of the line adjusts to fit the largest font in use.

- * - *

Note: The scrollH property is zero-based, not - * 1-based like the scrollV vertical scrolling property.

- */ - public scrollH: number; - /** - * The vertical position of text in a text field. The scrollV - * property is useful for directing users to a specific paragraph in a long - * passage, or creating scrolling text fields. - * - *

The units of vertical scrolling are lines, whereas the units of - * horizontal scrolling are pixels. If the first line displayed is the first - * line in the text field, scrollV is set to 1(not 0). Horizontal scrolling - * is measured in pixels because most fonts are proportionally spaced; that - * is, the characters can have different widths. Flash performs vertical - * scrolling by line because users usually want to see a complete line of - * text rather than a partial line. Even if there are multiple fonts on a - * line, the height of the line adjusts to fit the largest font in use.

- */ - public scrollV: number; - /** - * A Boolean value that indicates whether the text field is selectable. The - * value true indicates that the text is selectable. The - * selectable property controls whether a text field is - * selectable, not whether a text field is editable. A dynamic text field can - * be selectable even if it is not editable. If a dynamic text field is not - * selectable, the user cannot select its text. - * - *

If selectable is set to false, the text in - * the text field does not respond to selection commands from the mouse or - * keyboard, and the text cannot be copied with the Copy command. If - * selectable is set to true, the text in the text - * field can be selected with the mouse or keyboard, and the text can be - * copied with the Copy command. You can select text this way even if the - * text field is a dynamic text field instead of an input text field.

- * - * @default true - */ - public selectable: boolean; - /** - * The zero-based character index value of the first character in the current - * selection. For example, the first character is 0, the second character is - * 1, and so on. If no text is selected, this property is the value of - * caretIndex. - */ - public selectionBeginIndex : number; - /** - * The zero-based character index value of the last character in the current - * selection. For example, the first character is 0, the second character is - * 1, and so on. If no text is selected, this property is the value of - * caretIndex. - */ - public selectionEndIndex : number; - /** - * The sharpness of the glyph edges in this text field. This property applies - * only if the flash.text.AntiAliasType property of the text - * field is set to flash.text.AntiAliasType.ADVANCED. The range - * for sharpness is a number from -400 to 400. If you attempt to - * set sharpness to a value outside that range, Flash sets the - * property to the nearest value in the range(either -400 or 400). - * - * @default 0 - */ - public sharpness: number; - /** - * Attaches a style sheet to the text field. For information on creating - * style sheets, see the StyleSheet class and the ActionScript 3.0 - * Developer's Guide. - * - *

You can change the style sheet associated with a text field at any - * time. If you change the style sheet in use, the text field is redrawn with - * the new style sheet. You can set the style sheet to null or - * undefined to remove the style sheet. If the style sheet in - * use is removed, the text field is redrawn without a style sheet.

- * - *

Note: If the style sheet is removed, the contents of both - * TextField.text and TextField.htmlText change to - * incorporate the formatting previously applied by the style sheet. To - * preserve the original TextField.htmlText contents without the - * formatting, save the value in a variable before removing the style - * sheet.

- */ - public styleSheet: StyleSheet; - /** - * A string that is the current text in the text field. Lines are separated - * by the carriage return character('\r', ASCII 13). This - * property contains unformatted text in the text field, without HTML tags. - * - *

To get the text in HTML form, use the htmlText - * property.

- */ - public text : string; - /** - * The color of the text in a text field, in hexadecimal format. The - * hexadecimal color system uses six digits to represent color values. Each - * digit has 16 possible values or characters. The characters range from 0-9 - * and then A-F. For example, black is 0x000000; white is - * 0xFFFFFF. - * - * @default 0(0x000000) - */ - public textColor: number; - /** - * The height of the text in pixels. - */ - public textHeight : number; - /** - * The interaction mode property, Default value is - * TextInteractionMode.NORMAL. On mobile platforms, the normal mode implies - * that the text can be scrolled but not selected. One can switch to the - * selectable mode through the in-built context menu on the text field. On - * Desktop, the normal mode implies that the text is in scrollable as well as - * selection mode. - */ - public textInteractionMode : text.TextInteractionMode; - /** - * The width of the text in pixels. - */ - public textWidth : number; - /** - * The thickness of the glyph edges in this text field. This property applies - * only when away.text.AntiAliasType is set to - * away.text.AntiAliasType.ADVANCED. - * - *

The range for thickness is a number from -200 to 200. If - * you attempt to set thickness to a value outside that range, - * the property is set to the nearest value in the range(either -200 or - * 200).

- * - * @default 0 - */ - public thickness: number; - /** - * The type of the text field. Either one of the following TextFieldType - * constants: TextFieldType.DYNAMIC, which specifies a dynamic - * text field, which a user cannot edit, or TextFieldType.INPUT, - * which specifies an input text field, which a user can edit. - * - * @default dynamic - * @throws ArgumentError The type specified is not a member of - * flash.text.TextFieldType. - */ - public type: text.TextFieldType; - /** - * Specifies whether to copy and paste the text formatting along with the - * text. When set to true, Flash Player copies and pastes - * formatting(such as alignment, bold, and italics) when you copy and paste - * between text fields. Both the origin and destination text fields for the - * copy and paste procedure must have useRichTextClipboard set - * to true. The default value is false. - */ - public useRichTextClipboard: boolean; - /** - * A Boolean value that indicates whether the text field has word wrap. If - * the value of wordWrap is true, the text field - * has word wrap; if the value is false, the text field does not - * have word wrap. The default value is false. - */ - public wordWrap: boolean; - /** - * Creates a new TextField instance. After you create the TextField instance, - * call the addChild() or addChildAt() method of - * the parent DisplayObjectContainer object to add the TextField instance to - * the display list. - * - *

The default size for a text field is 100 x 100 pixels.

- */ - constructor(); - /** - * Appends the string specified by the newText parameter to the - * end of the text of the text field. This method is more efficient than an - * addition assignment(+=) on a text property - * (such as someTextField.text += moreText), particularly for a - * text field that contains a significant amount of content. - * - * @param newText The string to append to the existing text. - */ - public appendText(newText: string): void; - /** - * Returns a rectangle that is the bounding box of the character. - * - * @param charIndex The zero-based index value for the character(for - * example, the first position is 0, the second position is - * 1, and so on). - * @return A rectangle with x and y minimum and - * maximum values defining the bounding box of the character. - */ - public getCharBoundaries(charIndex: number): geom.Rectangle; - /** - * Returns the zero-based index value of the character at the point specified - * by the x and y parameters. - * - * @param x The x coordinate of the character. - * @param y The y coordinate of the character. - * @return The zero-based index value of the character(for example, the - * first position is 0, the second position is 1, and so on). Returns - * -1 if the point is not over any character. - */ - public getCharIndexAtPoint(x: number, y: number): number; - /** - * Given a character index, returns the index of the first character in the - * same paragraph. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return The zero-based index value of the first character in the same - * paragraph. - * @throws RangeError The character index specified is out of range. - */ - public getFirstCharInParagraph(charIndex: number): number; - /** - * Returns a DisplayObject reference for the given id, for an - * image or SWF file that has been added to an HTML-formatted text field by - * using an tag. The tag is in the - * following format: - * - *

 

- * - * @param id The id to match(in the id attribute - * of the tag). - * @return The display object corresponding to the image or SWF file with the - * matching id attribute in the tag - * of the text field. For media loaded from an external source, this - * object is a Loader object, and, once loaded, the media object is a - * child of that Loader object. For media embedded in the SWF file, - * it is the loaded object. If no tag with the - * matching id exists, the method returns - * null. - */ - public getImageReference(id: string): base.DisplayObject; - /** - * Returns the zero-based index value of the line at the point specified by - * the x and y parameters. - * - * @param x The x coordinate of the line. - * @param y The y coordinate of the line. - * @return The zero-based index value of the line(for example, the first - * line is 0, the second line is 1, and so on). Returns -1 if the - * point is not over any line. - */ - public getLineIndexAtPoint(x: number, y: number): number; - /** - * Returns the zero-based index value of the line containing the character - * specified by the charIndex parameter. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return The zero-based index value of the line. - * @throws RangeError The character index specified is out of range. - */ - public getLineIndexOfChar(charIndex: number): number; - /** - * Returns the number of characters in a specific text line. - * - * @param lineIndex The line number for which you want the length. - * @return The number of characters in the line. - * @throws RangeError The line number specified is out of range. - */ - public getLineLength(lineIndex: number): number; - /** - * Returns metrics information about a given text line. - * - * @param lineIndex The line number for which you want metrics information. - * @return A TextLineMetrics object. - * @throws RangeError The line number specified is out of range. - */ - public getLineMetrics(lineIndex: number): text.TextLineMetrics; - /** - * Returns the character index of the first character in the line that the - * lineIndex parameter specifies. - * - * @param lineIndex The zero-based index value of the line(for example, the - * first line is 0, the second line is 1, and so on). - * @return The zero-based index value of the first character in the line. - * @throws RangeError The line number specified is out of range. - */ - public getLineOffset(lineIndex: number): number; - /** - * Returns the text of the line specified by the lineIndex - * parameter. - * - * @param lineIndex The zero-based index value of the line(for example, the - * first line is 0, the second line is 1, and so on). - * @return The text string contained in the specified line. - * @throws RangeError The line number specified is out of range. - */ - public getLineText(lineIndex: number): string; - /** - * Given a character index, returns the length of the paragraph containing - * the given character. The length is relative to the first character in the - * paragraph(as returned by getFirstCharInParagraph()), not to - * the character index passed in. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return Returns the number of characters in the paragraph. - * @throws RangeError The character index specified is out of range. - */ - public getParagraphLength(charIndex: number): number; - /** - * Returns a TextFormat object that contains formatting information for the - * range of text that the beginIndex and endIndex - * parameters specify. Only properties that are common to the entire text - * specified are set in the resulting TextFormat object. Any property that is - * mixed, meaning that it has different values at different points in - * the text, has a value of null. - * - *

If you do not specify values for these parameters, this method is - * applied to all the text in the text field.

- * - *

The following table describes three possible usages:

- * - * @return The TextFormat object that represents the formatting properties - * for the specified text. - * @throws RangeError The beginIndex or endIndex - * specified is out of range. - */ - public getTextFormat(beginIndex?: number, endIndex?: number): text.TextFormat; - /** - * Replaces the current selection with the contents of the value - * parameter. The text is inserted at the position of the current selection, - * using the current default character format and default paragraph format. - * The text is not treated as HTML. - * - *

You can use the replaceSelectedText() method to insert and - * delete text without disrupting the character and paragraph formatting of - * the rest of the text.

- * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - * @param value The string to replace the currently selected text. - * @throws Error This method cannot be used on a text field with a style - * sheet. - */ - public replaceSelectedText(value: string): void; - /** - * Replaces the range of characters that the beginIndex and - * endIndex parameters specify with the contents of the - * newText parameter. As designed, the text from - * beginIndex to endIndex-1 is replaced. - * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - * @param beginIndex The zero-based index value for the start position of the - * replacement range. - * @param endIndex The zero-based index position of the first character - * after the desired text span. - * @param newText The text to use to replace the specified range of - * characters. - * @throws Error This method cannot be used on a text field with a style - * sheet. - */ - public replaceText(beginIndex: number, endIndex: number, newText: string): void; - /** - * Sets as selected the text designated by the index values of the first and - * last characters, which are specified with the beginIndex and - * endIndex parameters. If the two parameter values are the - * same, this method sets the insertion point, as if you set the - * caretIndex property. - * - * @param beginIndex The zero-based index value of the first character in the - * selection(for example, the first character is 0, the - * second character is 1, and so on). - * @param endIndex The zero-based index value of the last character in the - * selection. - */ - public setSelection(beginIndex: number, endIndex: number): void; - /** - * Applies the text formatting that the format parameter - * specifies to the specified text in a text field. The value of - * format must be a TextFormat object that specifies the desired - * text formatting changes. Only the non-null properties of - * format are applied to the text field. Any property of - * format that is set to null is not applied. By - * default, all of the properties of a newly created TextFormat object are - * set to null. - * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - *

The setTextFormat() method changes the text formatting - * applied to a range of characters or to the entire body of text in a text - * field. To apply the properties of format to all text in the text field, do - * not specify values for beginIndex and endIndex. - * To apply the properties of the format to a range of text, specify values - * for the beginIndex and the endIndex parameters. - * You can use the length property to determine the index - * values.

- * - *

The two types of formatting information in a TextFormat object are - * character level formatting and paragraph level formatting. Each character - * in a text field can have its own character formatting settings, such as - * font name, font size, bold, and italic.

- * - *

For paragraphs, the first character of the paragraph is examined for - * the paragraph formatting settings for the entire paragraph. Examples of - * paragraph formatting settings are left margin, right margin, and - * indentation.

- * - *

Any text inserted manually by the user, or replaced by the - * replaceSelectedText() method, receives the default text field - * formatting for new text, and not the formatting specified for the text - * insertion point. To set the default formatting for new text, use - * defaultTextFormat.

- * - * @param format A TextFormat object that contains character and paragraph - * formatting information. - * @throws Error This method cannot be used on a text field with a style - * sheet. - * @throws RangeError The beginIndex or endIndex - * specified is out of range. - */ - public setTextFormat(format: text.TextFormat, beginIndex?: number, endIndex?: number): void; - /** - * Returns true if an embedded font is available with the specified - * fontName and fontStyle where - * Font.fontType is flash.text.FontType.EMBEDDED. - * Starting with Flash Player 10, two kinds of embedded fonts can appear in a - * SWF file. Normal embedded fonts are only used with TextField objects. CFF - * embedded fonts are only used with the flash.text.engine classes. The two - * types are distinguished by the fontType property of the - * Font class, as returned by the enumerateFonts() - * function. - * - *

TextField cannot use a font of type EMBEDDED_CFF. If - * embedFonts is set to true and the only font - * available at run time with the specified name and style is of type - * EMBEDDED_CFF, Flash Player fails to render the text, as if no - * embedded font were available with the specified name and style.

- * - *

If both EMBEDDED and EMBEDDED_CFF fonts are - * available with the same name and style, the EMBEDDED font is - * selected and text renders with the EMBEDDED font.

- * - * @param fontName The name of the embedded font to check. - * @param fontStyle Specifies the font style to check. Use - * flash.text.FontStyle - * @return true if a compatible embedded font is available, - * otherwise false. - * @throws ArgumentError The fontStyle specified is not a member - * of flash.text.FontStyle. - */ - static isFontCompatible(fontName: string, fontStyle: string): boolean; - } -} -declare module away.managers { - /** - * MouseManager enforces a singleton pattern and is not intended to be instanced. - * it provides a manager class for detecting mouse hits on scene objects and sending out mouse events. - */ - class MouseManager { - private static _instance; - private _viewLookup; - public _iActiveDiv: HTMLDivElement; - public _iUpdateDirty: boolean; - public _iCollidingObject: pick.PickingCollisionVO; - private _nullVector; - private _previousCollidingObject; - private _queuedEvents; - private _mouseMoveEvent; - private _mouseUp; - private _mouseClick; - private _mouseOut; - private _mouseDown; - private _mouseMove; - private _mouseOver; - private _mouseWheel; - private _mouseDoubleClick; - private onClickDelegate; - private onDoubleClickDelegate; - private onMouseDownDelegate; - private onMouseMoveDelegate; - private onMouseUpDelegate; - private onMouseWheelDelegate; - private onMouseOverDelegate; - private onMouseOutDelegate; - /** - * Creates a new MouseManager object. - */ - constructor(); - static getInstance(): MouseManager; - public fireMouseEvents(forceMouseMove: boolean): void; - public registerView(view: containers.View): void; - public unregisterView(view: containers.View): void; - private queueDispatch(event, sourceEvent, collider?); - private onMouseMove(event); - private onMouseOut(event); - private onMouseOver(event); - private onClick(event); - private onDoubleClick(event); - private onMouseDown(event); - private onMouseUp(event); - private onMouseWheel(event); - private updateColliders(event); - } -} -declare module away.managers { - /** - * The StageManager class provides a multiton object that handles management for Stage objects. - * - * @see away.base.Stage - */ - class StageManager extends events.EventDispatcher { - private static STAGE_MAX_QUANTITY; - private _stages; - private static _instance; - private static _numStages; - private _onContextCreatedDelegate; - /** - * Creates a new StageManager class. - * @param stage The Stage object that contains the Stage objects to be managed. - * @private - */ - constructor(StageManagerSingletonEnforcer: StageManagerSingletonEnforcer); - /** - * Gets a StageManager instance for the given Stage object. - * @param stage The Stage object that contains the Stage objects to be managed. - * @return The StageManager instance for the given Stage object. - */ - static getInstance(): StageManager; - /** - * Requests the Stage for the given index. - * - * @param index The index of the requested Stage. - * @param forceSoftware Whether to force software mode even if hardware acceleration is available. - * @param profile The compatibility profile, an enumeration of ContextProfile - * @return The Stage for the given index. - */ - public getStageAt(index: number, forceSoftware?: boolean, profile?: string, mode?: string): base.Stage; - /** - * Removes a Stage from the manager. - * @param stage - * @private - */ - public iRemoveStage(stage: base.Stage): void; - /** - * Get the next available stage. An error is thrown if there are no StageProxies available - * @param forceSoftware Whether to force software mode even if hardware acceleration is available. - * @param profile The compatibility profile, an enumeration of ContextProfile - * @return The allocated stage - */ - public getFreeStage(forceSoftware?: boolean, profile?: string, mode?: string): base.Stage; - /** - * Checks if a new stage can be created and managed by the class. - * @return true if there is one slot free for a new stage - */ - public hasFreeStage : boolean; - /** - * Returns the amount of stage objects that can be created and managed by the class - * @return the amount of free slots - */ - public numSlotsFree : number; - /** - * Returns the amount of Stage objects currently managed by the class. - * @return the amount of slots used - */ - public numSlotsUsed : number; - /** - * The maximum amount of Stage objects that can be managed by the class - */ - public numSlotsTotal : number; - private onContextCreated(e); - } -} -declare class StageManagerSingletonEnforcer { -} -/** -* The Loader class is used to load SWF files or image(JPG, PNG, or GIF) -* files. Use the load() method to initiate loading. The loaded -* display object is added as a child of the Loader object. -* -*

Use the URLLoader class to load text or binary data.

-* -*

The Loader class overrides the following methods that it inherits, -* because a Loader object can only have one child display object - the -* display object that it loads. Calling the following methods throws an -* exception: addChild(), addChildAt(), -* removeChild(), removeChildAt(), and -* setChildIndex(). To remove a loaded display object, you must -* remove the Loader object from its parent DisplayObjectContainer -* child array.

-* -*

Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes -* are not used in ActionScript 3.0. The Loader and URLLoader classes replace -* them.

-* -*

When you use the Loader class, consider the Flash Player and Adobe AIR -* security model:

-* -*
    -*
  • You can load content from any accessible source.
  • -*
  • Loading is not allowed if the calling SWF file is in a network -* sandbox and the file to be loaded is local.
  • -*
  • If the loaded content is a SWF file written with ActionScript 3.0, it -* cannot be cross-scripted by a SWF file in another security sandbox unless -* that cross-scripting arrangement was approved through a call to the -* System.allowDomain() or the -* System.allowInsecureDomain() method in the loaded content -* file.
  • -*
  • If the loaded content is an AVM1 SWF file(written using ActionScript -* 1.0 or 2.0), it cannot be cross-scripted by an AVM2 SWF file(written using -* ActionScript 3.0). However, you can communicate between the two SWF files -* by using the LocalConnection class.
  • -*
  • If the loaded content is an image, its data cannot be accessed by a -* SWF file outside of the security sandbox, unless the domain of that SWF -* file was included in a URL policy file at the origin domain of the -* image.
  • -*
  • Movie clips in the local-with-file-system sandbox cannot script movie -* clips in the local-with-networking sandbox, and the reverse is also -* prevented.
  • -*
  • You cannot connect to commonly reserved ports. For a complete list of -* blocked ports, see "Restricting Networking APIs" in the ActionScript 3.0 -* Developer's Guide.
  • -*
-* -*

However, in AIR, content in the application security -* sandbox(content installed with the AIR application) are not restricted by -* these security limitations.

-* -*

For more information related to security, see the Flash Player Developer -* Center Topic: Security.

-* -*

When loading a SWF file from an untrusted source(such as a domain other -* than that of the Loader object's root SWF file), you may want to define a -* mask for the Loader object, to prevent the loaded content(which is a child -* of the Loader object) from drawing to portions of the Stage outside of that -* mask, as shown in the following code:

-*/ -declare module away.containers { - class Loader extends DisplayObjectContainer { - private _loadingSessions; - private _useAssetLib; - private _assetLibId; - private _onResourceCompleteDelegate; - private _onAssetCompleteDelegate; - private _content; - private _contentLoaderInfo; - /** - * Contains the root display object of the SWF file or image(JPG, PNG, or - * GIF) file that was loaded by using the load() or - * loadBytes() methods. - * - * @throws SecurityError The loaded SWF file or image file belongs to a - * security sandbox to which you do not have access. - * For a loaded SWF file, you can avoid this situation - * by having the file call the - * Security.allowDomain() method or by - * having the loading file specify a - * loaderContext parameter with its - * securityDomain property set to - * SecurityDomain.currentDomain when you - * call the load() or - * loadBytes() method. - */ - public content : base.DisplayObject; - /** - * Returns a LoaderInfo object corresponding to the object being loaded. - * LoaderInfo objects are shared between the Loader object and the loaded - * content object. The LoaderInfo object supplies loading progress - * information and statistics about the loaded file. - * - *

Events related to the load are dispatched by the LoaderInfo object - * referenced by the contentLoaderInfo property of the Loader - * object. The contentLoaderInfo property is set to a valid - * LoaderInfo object, even before the content is loaded, so that you can add - * event listeners to the object prior to the load.

- * - *

To detect uncaught errors that happen in a loaded SWF, use the - * Loader.uncaughtErrorEvents property, not the - * Loader.contentLoaderInfo.uncaughtErrorEvents property.

- */ - public contentLoaderInfo : base.LoaderInfo; - /** - * Creates a Loader object that you can use to load files, such as SWF, JPEG, - * GIF, or PNG files. Call the load() method to load the asset - * as a child of the Loader instance. You can then add the Loader object to - * the display list(for instance, by using the addChild() - * method of a DisplayObjectContainer instance). The asset appears on the - * Stage as it loads. - * - *

You can also use a Loader instance "offlist," that is without adding it - * to a display object container on the display list. In this mode, the - * Loader instance might be used to load a SWF file that contains additional - * modules of an application.

- * - *

To detect when the SWF file is finished loading, you can use the events - * of the LoaderInfo object associated with the - * contentLoaderInfo property of the Loader object. At that - * point, the code in the module SWF file can be executed to initialize and - * start the module. In the offlist mode, a Loader instance might also be - * used to load a SWF file that contains components or media assets. Again, - * you can use the LoaderInfo object event notifications to detect when the - * components are finished loading. At that point, the application can start - * using the components and media assets in the library of the SWF file by - * instantiating the ActionScript 3.0 classes that represent those components - * and assets.

- * - *

To determine the status of a Loader object, monitor the following - * events that the LoaderInfo object associated with the - * contentLoaderInfo property of the Loader object:

- * - *
    - *
  • The open event is dispatched when loading begins.
  • - *
  • The ioError or securityError event is - * dispatched if the file cannot be loaded or if an error occured during the - * load process.
  • - *
  • The progress event fires continuously while the file is - * being loaded.
  • - *
  • The complete event is dispatched when a file completes - * downloading, but before the loaded movie clip's methods and properties are - * available.
  • - *
  • The init event is dispatched after the properties and - * methods of the loaded SWF file are accessible, so you can begin - * manipulating the loaded SWF file. This event is dispatched before the - * complete handler. In streaming SWF files, the - * init event can occur significantly earlier than the - * complete event. For most purposes, use the init - * handler.
  • - *
- */ - constructor(useAssetLibrary?: boolean, assetLibraryId?: string); - /** - * Cancels a load() method operation that is currently in - * progress for the Loader instance. - * - */ - public close(): void; - /** - * Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an - * object that is a child of this Loader object. If you load an animated GIF - * file, only the first frame is displayed. As the Loader object can contain - * only a single child, issuing a subsequent load() request - * terminates the previous request, if still pending, and commences a new - * load. - * - *

Note: In AIR 1.5 and Flash Player 10, the maximum size for a - * loaded image is 8,191 pixels in width or height, and the total number of - * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191 - * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and - * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height - * and 2,880 pixels in width.

- * - *

A SWF file or image loaded into a Loader object inherits the position, - * rotation, and scale properties of the parent display objects of the Loader - * object.

- * - *

Use the unload() method to remove movies or images loaded - * with this method, or to cancel a load operation that is in progress.

- * - *

You can prevent a SWF file from using this method by setting the - * allowNetworking parameter of the the object and - * embed tags in the HTML page that contains the SWF - * content.

- * - *

When you use this method, consider the Flash Player security model, - * which is described in the Loader class description.

- * - *

In Flash Player 10 and later, if you use a multipart Content-Type(for - * example "multipart/form-data") that contains an upload(indicated by a - * "filename" parameter in a "content-disposition" header within the POST - * body), the POST operation is subject to the security rules applied to - * uploads:

- * - *
    - *
  • The POST operation must be performed in response to a user-initiated - * action, such as a mouse click or key press.
  • - *
  • If the POST operation is cross-domain(the POST target is not on the - * same server as the SWF file that is sending the POST request), the target - * server must provide a URL policy file that permits cross-domain - * access.
  • - *
- * - *

Also, for any multipart Content-Type, the syntax must be valid - * (according to the RFC2046 standard). If the syntax appears to be invalid, - * the POST operation is subject to the security rules applied to - * uploads.

- * - *

For more information related to security, see the Flash Player - * Developer Center Topic: Security.

- * - * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG - * file to be loaded. A relative path must be relative to the - * main SWF file. Absolute URLs must include the protocol - * reference, such as http:// or file:///. Filenames cannot - * include disk drive specifications. - * @param context A LoaderContext object, which has properties that define - * the following: - *
    - *
  • Whether or not to check for the existence of a policy - * file upon loading the object
  • - *
  • The ApplicationDomain for the loaded object
  • - *
  • The SecurityDomain for the loaded object
  • - *
  • The ImageDecodingPolicy for the loaded image - * object
  • - *
- * - *

If the context parameter is not specified - * or refers to a null object, the loaded content remains in - * its own security domain.

- * - *

For complete details, see the description of the - * properties in the LoaderContext - * class.

- * @param ns An optional namespace string under which the file is to be - * loaded, allowing the differentiation of two resources with - * identical assets. - * @param parser An optional parser object for translating the loaded data - * into a usable resource. If not provided, AssetLoader will - * attempt to auto-detect the file type. - * @throws IOError The digest property of the - * request object is not - * null. You should only set the - * digest property of a URLRequest - * object when calling the - * URLLoader.load() method when - * loading a SWZ file(an Adobe platform - * component). - * @throws IllegalOperationError If the requestedContentParent - * property of the context - * parameter is a Loader. - * @throws IllegalOperationError If the LoaderContext.parameters - * parameter is set to non-null and has some - * values which are not Strings. - * @throws SecurityError The value of - * LoaderContext.securityDomain - * must be either null or - * SecurityDomain.currentDomain. - * This reflects the fact that you can only - * place the loaded media in its natural - * security sandbox or your own(the latter - * requires a policy file). - * @throws SecurityError Local SWF files may not set - * LoaderContext.securityDomain to anything - * other than null. It is not - * permitted to import non-local media into a - * local sandbox, or to place other local media - * in anything other than its natural sandbox. - * @throws SecurityError You cannot connect to commonly reserved - * ports. For a complete list of blocked ports, - * see "Restricting Networking APIs" in the - * ActionScript 3.0 Developer's Guide. - * @throws SecurityError If the applicationDomain or - * securityDomain properties of - * the context parameter are from - * a disallowed domain. - * @throws SecurityError If a local SWF file is attempting to use the - * securityDomain property of the - * context parameter. - * @event asyncError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and it is not possible to - * add the loaded content as a child to the specified - * DisplayObjectContainer. This could happen if the - * loaded content is a - * flash.display.AVM1Movie or if the - * addChild() call to the - * requestedContentParent throws an error. - * @event complete Dispatched by the contentLoaderInfo - * object when the file has completed loading. The - * complete event is always dispatched - * after the init event. - * @event httpStatus Dispatched by the contentLoaderInfo - * object when a network request is made over HTTP and - * Flash Player can detect the HTTP status code. - * @event init Dispatched by the contentLoaderInfo - * object when the properties and methods of the loaded - * SWF file are accessible. The init event - * always precedes the complete event. - * @event ioError Dispatched by the contentLoaderInfo - * object when an input or output error occurs that - * causes a load operation to fail. - * @event open Dispatched by the contentLoaderInfo - * object when the loading operation starts. - * @event progress Dispatched by the contentLoaderInfo - * object as data is received while load operation - * progresses. - * @event securityError Dispatched by the contentLoaderInfo - * object if a SWF file in the local-with-filesystem - * sandbox attempts to load content in the - * local-with-networking sandbox, or vice versa. - * @event securityError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and the security sandbox - * of the - * LoaderContext.requestedContentParent - * does not have access to the loaded SWF. - * @event unload Dispatched by the contentLoaderInfo - * object when a loaded object is removed. - */ - public load(request: net.URLRequest, context?: library.AssetLoaderContext, ns?: string, parser?: parsers.ParserBase): library.AssetLoaderToken; - /** - * Loads from binary data stored in a ByteArray object. - * - *

The loadBytes() method is asynchronous. You must wait for - * the "init" event before accessing the properties of a loaded object.

- * - *

When you use this method, consider the Flash Player security model, - * which is described in the Loader class description.

- * - * @param bytes A ByteArray object. The contents of the ByteArray can be - * any of the file formats supported by the Loader class: SWF, - * GIF, JPEG, or PNG. - * @param context A LoaderContext object. Only the - * applicationDomain property of the - * LoaderContext object applies; the - * checkPolicyFile and - * securityDomain properties of the LoaderContext - * object do not apply. - * - *

If the context parameter is not specified - * or refers to a null object, the content is loaded into the - * current security domain - a process referred to as "import - * loading" in Flash Player security documentation. - * Specifically, if the loading SWF file trusts the remote SWF - * by incorporating the remote SWF into its code, then the - * loading SWF can import it directly into its own security - * domain.

- * - *

For more information related to security, see the Flash - * Player Developer Center Topic: Security.

- * @throws ArgumentError If the length property of the - * ByteArray object is not greater than 0. - * @throws IllegalOperationError If the checkPolicyFile or - * securityDomain property of the - * context parameter are non-null. - * @throws IllegalOperationError If the requestedContentParent - * property of the context - * parameter is a Loader. - * @throws IllegalOperationError If the LoaderContext.parameters - * parameter is set to non-null and has some - * values which are not Strings. - * @throws SecurityError If the provided - * applicationDomain property of - * the context property is from a - * disallowed domain. - * @throws SecurityError You cannot connect to commonly reserved - * ports. For a complete list of blocked ports, - * see "Restricting Networking APIs" in the - * ActionScript 3.0 Developer's Guide. - * @event asyncError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and it is not possible to - * add the loaded content as a child to the specified - * DisplayObjectContainer. This could happen if the - * loaded content is a - * flash.display.AVM1Movie or if the - * addChild() call to the - * requestedContentParent throws an error. - * @event complete Dispatched by the contentLoaderInfo - * object when the operation is complete. The - * complete event is always dispatched - * after the init event. - * @event init Dispatched by the contentLoaderInfo - * object when the properties and methods of the loaded - * data are accessible. The init event - * always precedes the complete event. - * @event ioError Dispatched by the contentLoaderInfo - * object when the runtime cannot parse the data in the - * byte array. - * @event open Dispatched by the contentLoaderInfo - * object when the operation starts. - * @event progress Dispatched by the contentLoaderInfo - * object as data is transfered in memory. - * @event securityError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and the security sandbox - * of the - * LoaderContext.requestedContentParent - * does not have access to the loaded SWF. - * @event unload Dispatched by the contentLoaderInfo - * object when a loaded object is removed. - */ - public loadData(data: any, context?: library.AssetLoaderContext, ns?: string, parser?: parsers.ParserBase): library.AssetLoaderToken; - /** - * Removes a child of this Loader object that was loaded by using the - * load() method. The property of the associated - * LoaderInfo object is reset to null. The child is not - * necessarily destroyed because other objects might have references to it; - * however, it is no longer a child of the Loader object. - * - *

As a best practice, before you unload a child SWF file, you should - * explicitly close any streams in the child SWF file's objects, such as - * LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise, - * audio in the child SWF file might continue to play, even though the child - * SWF file was unloaded. To close streams in the child SWF file, add an - * event listener to the child that listens for the unload - * event. When the parent calls Loader.unload(), the - * unload event is dispatched to the child. The following code - * shows how you might do this:

- *
 public closeAllStreams(evt:Event) {
-        * myNetStream.close(); mySound.close(); myNetConnection.close();
-        * myLocalConnection.close(); }
-        * myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,
-        * closeAllStreams);
- * - */ - public unload(): void; - /** - * Enables a specific parser. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parserClass The parser class to enable. - * @see away.parsers.Parsers - */ - static enableParser(parserClass: Object): void; - /** - * Enables a list of parsers. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parserClasses A Vector of parser classes to enable. - * @see away.parsers.Parsers - */ - static enableParsers(parserClasses: Object[]): void; - private removeListeners(dispatcher); - private onAssetComplete(event); - /** - * Called when an error occurs during loading - */ - private onLoadError(event); - /** - * Called when a an error occurs during parsing - */ - private onParseError(event); - /** - * Called when the resource and all of its dependencies was retrieved. - */ - private onResourceComplete(event); - } -} -declare module away.containers { - class Scene extends events.EventDispatcher { - private _expandedPartitions; - private _partitions; - public _iSceneGraphRoot: DisplayObjectContainer; - public _iCollectionMark: number; - constructor(); - public traversePartitions(traverser: traverse.ICollector): void; - public partition : partition.Partition; - public contains(child: base.DisplayObject): boolean; - public addChild(child: base.DisplayObject): base.DisplayObject; - public removeChild(child: base.DisplayObject): void; - public removeChildAt(index: number): void; - public getChildAt(index: number): base.DisplayObject; - public numChildren : number; - /** - * @internal - */ - public iRegisterEntity(displayObject: base.DisplayObject): void; - /** - * @internal - */ - public iRegisterPartition(partition: partition.Partition): void; - /** - * @internal - */ - public iUnregisterEntity(displayObject: base.DisplayObject): void; - /** - * @internal - */ - public iUnregisterPartition(partition: partition.Partition): void; - } -} -declare module away.containers { - class View { - public _pScene: Scene; - public _pCamera: entities.Camera; - public _pEntityCollector: traverse.ICollector; - public _pRenderer: render.IRenderer; - private _aspectRatio; - private _width; - private _height; - private _time; - private _deltaTime; - private _backgroundColor; - private _backgroundAlpha; - private _viewportDirty; - private _scissorDirty; - private _onScenePartitionChangedDelegate; - private _onProjectionChangedDelegate; - private _onViewportUpdatedDelegate; - private _onScissorUpdatedDelegate; - private _mouseManager; - private _mousePicker; - private _htmlElement; - private _shareContext; - public _pMouseX: number; - public _pMouseY: number; - constructor(renderer: render.IRenderer, scene?: Scene, camera?: entities.Camera); - /** - * - * @param e - */ - private onScenePartitionChanged(e); - public layeredView: boolean; - public mouseX : number; - public mouseY : number; - /** - * - */ - public htmlElement : HTMLDivElement; - /** - * - */ - public renderer : render.IRenderer; - /** - * - */ - public shareContext : boolean; - /** - * - */ - public backgroundColor : number; - /** - * - * @returns {number} - */ - /** - * - * @param value - */ - public backgroundAlpha : number; - /** - * - * @returns {Camera3D} - */ - /** - * Set camera that's used to render the scene for this viewport - */ - public camera : entities.Camera; - /** - * - * @returns {away.containers.Scene3D} - */ - /** - * Set the scene that's used to render for this viewport - */ - public scene : Scene; - /** - * - * @returns {number} - */ - public deltaTime : number; - /** - * - */ - public width : number; - /** - * - */ - public height : number; - /** - * - */ - public mousePicker : pick.IPicker; - /** - * - */ - public x : number; - /** - * - */ - public y : number; - /** - * - */ - public visible : boolean; - /** - * - * @returns {number} - */ - public renderedFacesCount : number; - /** - * Renders the view. - */ - public render(): void; - /** - * - */ - public pUpdateTime(): void; - /** - * - */ - public dispose(): void; - /** - * - */ - public iEntityCollector : traverse.ICollector; - /** - * - */ - private onProjectionChanged(event); - /** - * - */ - private onViewportUpdated(event); - /** - * - */ - private onScissorUpdated(event); - public project(point3d: geom.Vector3D): geom.Vector3D; - public unproject(sX: number, sY: number, sZ: number): geom.Vector3D; - public getRay(sX: number, sY: number, sZ: number): geom.Vector3D; - public forceMouseMove: boolean; - public updateCollider(): void; - } -} -declare module away.controllers { - class ControllerBase { - public _pAutoUpdate: boolean; - public _pTargetObject: base.DisplayObject; - constructor(targetObject?: base.DisplayObject); - public pNotifyUpdate(): void; - public targetObject : base.DisplayObject; - public autoUpdate : boolean; - public update(interpolate?: boolean): void; - } -} -declare module away.controllers { - class LookAtController extends ControllerBase { - public _pLookAtPosition: geom.Vector3D; - public _pLookAtObject: base.DisplayObject; - public _pOrigin: geom.Vector3D; - private _onLookAtObjectChangedDelegate; - constructor(targetObject?: base.DisplayObject, lookAtObject?: base.DisplayObject); - public lookAtPosition : geom.Vector3D; - public lookAtObject : base.DisplayObject; - public update(interpolate?: boolean): void; - private onLookAtObjectChanged(event); - } -} -declare module away.controllers { - /** - * Extended camera used to hover round a specified target object. - * - * @see away.containers.View - */ - class HoverController extends LookAtController { - public _iCurrentPanAngle: number; - public _iCurrentTiltAngle: number; - private _panAngle; - private _tiltAngle; - private _distance; - private _minPanAngle; - private _maxPanAngle; - private _minTiltAngle; - private _maxTiltAngle; - private _steps; - private _yFactor; - private _wrapPanAngle; - private _upAxis; - /** - * Fractional step taken each time the hover() method is called. Defaults to 8. - * - * Affects the speed at which the tiltAngle and panAngle resolve to their targets. - * - * @see #tiltAngle - * @see #panAngle - */ - public steps : number; - /** - * Rotation of the camera in degrees around the y axis. Defaults to 0. - */ - public panAngle : number; - /** - * Elevation angle of the camera in degrees. Defaults to 90. - */ - public tiltAngle : number; - /** - * Distance between the camera and the specified target. Defaults to 1000. - */ - public distance : number; - /** - * Minimum bounds for the panAngle. Defaults to -Infinity. - * - * @see #panAngle - */ - public minPanAngle : number; - /** - * Maximum bounds for the panAngle. Defaults to Infinity. - * - * @see #panAngle - */ - public maxPanAngle : number; - /** - * Minimum bounds for the tiltAngle. Defaults to -90. - * - * @see #tiltAngle - */ - public minTiltAngle : number; - /** - * Maximum bounds for the tiltAngle. Defaults to 90. - * - * @see #tiltAngle - */ - public maxTiltAngle : number; - /** - * Fractional difference in distance between the horizontal camera orientation and vertical camera orientation. Defaults to 2. - * - * @see #distance - */ - public yFactor : number; - /** - * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. - */ - public wrapPanAngle : boolean; - /** - * Creates a new HoverController object. - */ - constructor(targetObject?: base.DisplayObject, lookAtObject?: base.DisplayObject, panAngle?: number, tiltAngle?: number, distance?: number, minTiltAngle?: number, maxTiltAngle?: number, minPanAngle?: number, maxPanAngle?: number, steps?: number, yFactor?: number, wrapPanAngle?: boolean); - /** - * Updates the current tilt angle and pan angle values. - * - * Values are calculated using the defined tiltAngle, panAngle and steps variables. - * - * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. - * - * @see #tiltAngle - * @see #panAngle - * @see #steps - */ - public update(interpolate?: boolean): void; - } -} -declare module away.controllers { - /** - * Extended camera used to hover round a specified target object. - * - * @see away3d.containers.View3D - */ - class FirstPersonController extends ControllerBase { - public _iCurrentPanAngle: number; - public _iCurrentTiltAngle: number; - private _panAngle; - private _tiltAngle; - private _minTiltAngle; - private _maxTiltAngle; - private _steps; - private _walkIncrement; - private _strafeIncrement; - private _wrapPanAngle; - public fly: boolean; - /** - * Fractional step taken each time the hover() method is called. Defaults to 8. - * - * Affects the speed at which the tiltAngle and panAngle resolve to their targets. - * - * @see #tiltAngle - * @see #panAngle - */ - public steps : number; - /** - * Rotation of the camera in degrees around the y axis. Defaults to 0. - */ - public panAngle : number; - /** - * Elevation angle of the camera in degrees. Defaults to 90. - */ - public tiltAngle : number; - /** - * Minimum bounds for the tiltAngle. Defaults to -90. - * - * @see #tiltAngle - */ - public minTiltAngle : number; - /** - * Maximum bounds for the tiltAngle. Defaults to 90. - * - * @see #tiltAngle - */ - public maxTiltAngle : number; - /** - * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. - */ - public wrapPanAngle : boolean; - /** - * Creates a new HoverController object. - */ - constructor(targetObject?: base.DisplayObject, panAngle?: number, tiltAngle?: number, minTiltAngle?: number, maxTiltAngle?: number, steps?: number, wrapPanAngle?: boolean); - /** - * Updates the current tilt angle and pan angle values. - * - * Values are calculated using the defined tiltAngle, panAngle and steps variables. - * - * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. - * - * @see #tiltAngle - * @see #panAngle - * @see #steps - */ - public update(interpolate?: boolean): void; - public incrementWalk(val: number): void; - public incrementStrafe(val: number): void; - } -} -declare module away.controllers { - /** - * Controller used to follow behind an object on the XZ plane, with an optional - * elevation (tiltAngle). - * - * @see away3d.containers.View3D - */ - class FollowController extends HoverController { - constructor(targetObject?: base.DisplayObject, lookAtObject?: base.DisplayObject, tiltAngle?: number, distance?: number); - public update(interpolate?: boolean): void; - } -} -declare module away.controllers { - /** - * Uses spring physics to animate the target object towards a position that is - * defined as the lookAtTarget object's position plus the vector defined by the - * positionOffset property. - */ - class SpringController extends LookAtController { - private _velocity; - private _dv; - private _stretch; - private _force; - private _acceleration; - private _desiredPosition; - /** - * Stiffness of the spring, how hard is it to extend. The higher it is, the more "fixed" the cam will be. - * A number between 1 and 20 is recommended. - */ - public stiffness: number; - /** - * Damping is the spring internal friction, or how much it resists the "boinggggg" effect. Too high and you'll lose it! - * A number between 1 and 20 is recommended. - */ - public damping: number; - /** - * Mass of the camera, if over 120 and it'll be very heavy to move. - */ - public mass: number; - /** - * Offset of spring center from target in target object space, ie: Where the camera should ideally be in the target object space. - */ - public positionOffset: geom.Vector3D; - constructor(targetObject?: base.DisplayObject, lookAtObject?: base.DisplayObject, stiffness?: number, mass?: number, damping?: number); - public update(interpolate?: boolean): void; - } -} -declare module away.materials { - /** - * LightPickerBase provides an abstract base clase for light picker classes. These classes are responsible for - * feeding materials with relevant lights. Usually, StaticLightPicker can be used, but LightPickerBase can be - * extended to provide more application-specific dynamic selection of lights. - * - * @see StaticLightPicker - */ - class LightPickerBase extends library.NamedAssetBase implements library.IAsset { - public _pNumPointLights: number; - public _pNumDirectionalLights: number; - public _pNumCastingPointLights: number; - public _pNumCastingDirectionalLights: number; - public _pNumLightProbes: number; - public _pAllPickedLights: base.LightBase[]; - public _pPointLights: entities.PointLight[]; - public _pCastingPointLights: entities.PointLight[]; - public _pDirectionalLights: entities.DirectionalLight[]; - public _pCastingDirectionalLights: entities.DirectionalLight[]; - public _pLightProbes: entities.LightProbe[]; - public _pLightProbeWeights: number[]; - /** - * Creates a new LightPickerBase object. - */ - constructor(); - /** - * Disposes resources used by the light picker. - */ - public dispose(): void; - /** - * @inheritDoc - */ - public assetType : string; - /** - * The maximum amount of directional lights that will be provided. - */ - public numDirectionalLights : number; - /** - * The maximum amount of point lights that will be provided. - */ - public numPointLights : number; - /** - * The maximum amount of directional lights that cast shadows. - */ - public numCastingDirectionalLights : number; - /** - * The amount of point lights that cast shadows. - */ - public numCastingPointLights : number; - /** - * The maximum amount of light probes that will be provided. - */ - public numLightProbes : number; - /** - * The collected point lights to be used for shading. - */ - public pointLights : entities.PointLight[]; - /** - * The collected directional lights to be used for shading. - */ - public directionalLights : entities.DirectionalLight[]; - /** - * The collected point lights that cast shadows to be used for shading. - */ - public castingPointLights : entities.PointLight[]; - /** - * The collected directional lights that cast shadows to be used for shading. - */ - public castingDirectionalLights : entities.DirectionalLight[]; - /** - * The collected light probes to be used for shading. - */ - public lightProbes : entities.LightProbe[]; - /** - * The weights for each light probe, defining their influence on the object. - */ - public lightProbeWeights : number[]; - /** - * A collection of all the collected lights. - */ - public allPickedLights : base.LightBase[]; - /** - * Updates set of lights for a given renderable and EntityCollector. Always call super.collectLights() after custom overridden code. - */ - public collectLights(renderable: pool.IRenderable): void; - /** - * Updates the weights for the light probes, based on the renderable's position relative to them. - * @param renderable The renderble for which to calculate the light probes' influence. - */ - private updateProbeWeights(renderable); - } -} -declare module away.materials { - /** - * StaticLightPicker is a light picker that provides a static set of lights. The lights can be reassigned, but - * if the configuration changes (number of directional lights, point lights, etc), a material recompilation may - * occur. - */ - class StaticLightPicker extends LightPickerBase { - private _lights; - private _onCastShadowChangeDelegate; - /** - * Creates a new StaticLightPicker object. - * @param lights The lights to be used for shading. - */ - constructor(lights: any); - /** - * The lights used for shading. - */ - public lights : any[]; - /** - * Remove configuration change listeners on the lights. - */ - private clearListeners(); - /** - * Notifies the material of a configuration change. - */ - private onCastShadowChange(event); - /** - * Called when a directional light's shadow casting configuration changes. - */ - private updateDirectionalCasting(light); - /** - * Called when a point light's shadow casting configuration changes. - */ - private updatePointCasting(light); - } -} -declare module away.materials { - /** - * MaterialPassBase provides an abstract base class for material shader passes. A material pass constitutes at least - * a render call per required renderable. - */ - interface IMaterialPass extends events.IEventDispatcher { - /** - * Cleans up any resources used by the current object. - * @param deep Indicates whether other resources should be cleaned up, that could potentially be shared across different instances. - */ - dispose(): any; - /** - * Renders an object to the current render target. - * - * @private - */ - _iRender(pass: pool.IMaterialPassData, renderable: pool.IRenderable, stage: base.Stage, camera: entities.Camera, viewProjection: geom.Matrix3D): any; - /** - * Sets the render state for the pass that is independent of the rendered object. This needs to be called before - * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. - * @param stage The Stage object which is currently used for rendering. - * @param camera The camera from which the scene is viewed. - * @private - */ - _iActivate(pass: pool.IMaterialPassData, stage: base.Stage, camera: entities.Camera): any; - /** - * Clears the render state for the pass. This needs to be called before activating another pass. - * @param stage The Stage used for rendering - * - * @private - */ - _iDeactivate(pass: pool.IMaterialPassData, stage: base.Stage): any; - /** - * The light picker used by the material to provide lights to the material if it supports lighting. - * - * @see away.materials.LightPickerBase - * @see away.materials.StaticLightPicker - */ - lightPicker: LightPickerBase; - } -} -declare module away.materials { - /** - * Enumeration class for defining which lighting types affect the specific material - * lighting component (diffuse and specular). This can be useful if, for example, you - * want to use light probes for diffuse global lighting, but want specular reflections from - * traditional light sources without those affecting the diffuse light. - * - * @see away.materials.ColorMaterial.diffuseLightSources - * @see away.materials.ColorMaterial.specularLightSources - * @see away.materials.TextureMaterial.diffuseLightSources - * @see away.materials.TextureMaterial.specularLightSources - */ - class LightSources { - /** - * Defines normal lights are to be used as the source for the lighting - * component. - */ - static LIGHTS: number; - /** - * Defines that global lighting probes are to be used as the source for the - * lighting component. - */ - static PROBES: number; - /** - * Defines that both normal and global lighting probes are to be used as the - * source for the lighting component. This is equivalent to LightSources.LIGHTS | LightSources.PROBES. - */ - static ALL: number; - } -} -declare module away.materials { - /** - * MaterialBase forms an abstract base class for any material. - * A material consists of several passes, each of which constitutes at least one render call. Several passes could - * be used for special effects (render lighting for many lights in several passes, render an outline in a separate - * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space - * subsurface scattering, or rendering a depth map for specialized self-shadowing). - * - * Away3D provides default materials trough SinglePassMaterialBase and TriangleMaterial, which use modular - * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom - * shaders, or entire new material frameworks. - */ - class MaterialBase extends library.NamedAssetBase implements library.IAsset { - private _materialPassData; - private _materialData; - public _pAlphaThreshold: number; - public _pAnimateUVs: boolean; - private _enableLightFallOff; - private _specularLightSources; - private _diffuseLightSources; - /** - * An object to contain any extra data. - */ - public extra: Object; - /** - * A value that can be used by materials that only work with a given type of renderer. The renderer can test the - * classification to choose which render path to use. For example, a deferred material could set this value so - * that the deferred renderer knows not to take the forward rendering path. - * - * @private - */ - public _iClassification: string; - /** - * An id for this material used to sort the renderables by shader program, which reduces Program state changes. - * - * @private - */ - public _iMaterialId: number; - public _iBaseScreenPassIndex: number; - private _bothSides; - private _animationSet; - public _pScreenPassesInvalid: boolean; - /** - * A list of material owners, renderables or custom Entities. - */ - private _owners; - private _alphaPremultiplied; - public _pBlendMode: string; - private _numPasses; - private _passes; - private _mipmap; - private _smooth; - private _repeat; - private _color; - public _pTexture: textures.Texture2DBase; - public _pLightPicker: LightPickerBase; - public _pHeight: number; - public _pWidth: number; - public _pRequiresBlending: boolean; - private _onPassChangeDelegate; - private _onLightChangeDelegate; - /** - * Creates a new MaterialBase object. - */ - constructor(); - /** - * @inheritDoc - */ - public assetType : string; - /** - * - */ - public height : number; - /** - * - */ - public animationSet : animators.IAnimationSet; - /** - * The light picker used by the material to provide lights to the material if it supports lighting. - * - * @see LightPickerBase - * @see StaticLightPicker - */ - public lightPicker : LightPickerBase; - /** - * Indicates whether or not any used textures should use mipmapping. Defaults to true. - */ - public mipmap : boolean; - /** - * Indicates whether or not any used textures should use smoothing. - */ - public smooth : boolean; - /** - * Indicates whether or not any used textures should be tiled. If set to false, texture samples are clamped to - * the texture's borders when the uv coordinates are outside the [0, 1] interval. - */ - public repeat : boolean; - /** - * The diffuse reflectivity color of the surface. - */ - public color : number; - /** - * The texture object to use for the albedo colour. - */ - public texture : textures.Texture2DBase; - /** - * Specifies whether or not the UV coordinates should be animated using a transformation matrix. - */ - public animateUVs : boolean; - /** - * Whether or not to use fallOff and radius properties for lights. This can be used to improve performance and - * compatibility for constrained mode. - */ - public enableLightFallOff : boolean; - /** - * Define which light source types to use for diffuse reflections. This allows choosing between regular lights - * and/or light probes for diffuse reflections. - * - * @see away3d.materials.LightSources - */ - public diffuseLightSources : number; - /** - * Define which light source types to use for specular reflections. This allows choosing between regular lights - * and/or light probes for specular reflections. - * - * @see away3d.materials.LightSources - */ - public specularLightSources : number; - /** - * Cleans up resources owned by the material, including passes. Textures are not owned by the material since they - * could be used by other materials and will not be disposed. - */ - public dispose(): void; - /** - * Defines whether or not the material should cull triangles facing away from the camera. - */ - public bothSides : boolean; - /** - * The blend mode to use when drawing this renderable. The following blend modes are supported: - *
    - *
  • BlendMode.NORMAL: No blending, unless the material inherently needs it
  • - *
  • BlendMode.LAYER: Force blending. This will draw the object the same as NORMAL, but without writing depth writes.
  • - *
  • BlendMode.MULTIPLY
  • - *
  • BlendMode.ADD
  • - *
  • BlendMode.ALPHA
  • - *
- */ - public blendMode : string; - /** - * Indicates whether visible textures (or other pixels) used by this material have - * already been premultiplied. Toggle this if you are seeing black halos around your - * blended alpha edges. - */ - public alphaPremultiplied : boolean; - /** - * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either - * invisible or entirely opaque, often used with textures for foliage, etc. - * Recommended values are 0 to disable alpha, or 0.5 to create smooth edges. Default value is 0 (disabled). - */ - public alphaThreshold : number; - /** - * Indicates whether or not the material requires alpha blending during rendering. - */ - public requiresBlending : boolean; - /** - * - */ - public width : number; - /** - * Sets the render state for a pass that is independent of the rendered object. This needs to be called before - * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. - * @param pass The pass data to activate. - * @param stage The Stage object which is currently used for rendering. - * @param camera The camera from which the scene is viewed. - * @private - */ - public _iActivatePass(pass: pool.IMaterialPassData, stage: base.Stage, camera: entities.Camera): void; - /** - * Clears the render state for a pass. This needs to be called before activating another pass. - * @param pass The pass to deactivate. - * @param stage The Stage used for rendering - * - * @internal - */ - public _iDeactivatePass(pass: pool.IMaterialPassData, stage: base.Stage): void; - /** - * Renders the current pass. Before calling renderPass, activatePass needs to be called with the same index. - * @param pass The pass used to render the renderable. - * @param renderable The IRenderable object to draw. - * @param stage The Stage object used for rendering. - * @param entityCollector The EntityCollector object that contains the visible scene data. - * @param viewProjection The view-projection matrix used to project to the screen. This is not the same as - * camera.viewProjection as it includes the scaling factors when rendering to textures. - * - * @internal - */ - public _iRenderPass(pass: pool.IMaterialPassData, renderable: pool.IRenderable, stage: base.Stage, camera: entities.Camera, viewProjection: geom.Matrix3D): void; - /** - * Mark an IMaterialOwner as owner of this material. - * Assures we're not using the same material across renderables with different animations, since the - * Programs depend on animation. This method needs to be called when a material is assigned. - * - * @param owner The IMaterialOwner that had this material assigned - * - * @internal - */ - public iAddOwner(owner: base.IMaterialOwner): void; - /** - * Removes an IMaterialOwner as owner. - * @param owner - * - * @internal - */ - public iRemoveOwner(owner: base.IMaterialOwner): void; - /** - * A list of the IMaterialOwners that use this material - * - * @private - */ - public iOwners : base.IMaterialOwner[]; - /** - * The amount of passes used by the material. - * - * @private - */ - public _iNumScreenPasses(): number; - /** - * A list of the screen passes used in this material - * - * @private - */ - public _iScreenPasses : IMaterialPass[]; - /** - * Marks the shader programs for all passes as invalid, so they will be recompiled before the next use. - * - * @private - */ - public _pInvalidatePasses(): void; - /** - * Flags that the screen passes have become invalid and need possible re-ordering / adding / deleting - */ - public _pInvalidateScreenPasses(): void; - /** - * Removes a pass from the material. - * @param pass The pass to be removed. - */ - public _pRemoveScreenPass(pass: IMaterialPass): void; - /** - * Removes all passes from the material - */ - public _pClearScreenPasses(): void; - /** - * Adds a pass to the material - * @param pass - */ - public _pAddScreenPass(pass: IMaterialPass): void; - public _iAddMaterialData(materialData: pool.IMaterialData): pool.IMaterialData; - public _iRemoveMaterialData(materialData: pool.IMaterialData): pool.IMaterialData; - /** - * Performs any processing that needs to occur before any of its passes are used. - * - * @private - */ - public _iUpdateMaterial(): void; - /** - * Listener for when a pass's shader code changes. It recalculates the render order id. - */ - private onPassChange(event); - private invalidateAnimation(); - private invalidateMaterial(); - /** - * Called when the light picker's configuration changed. - */ - private onLightsChange(event); - public _iAddMaterialPassData(materialPassData: pool.IMaterialPassData): pool.IMaterialPassData; - public _iRemoveMaterialPassData(materialPassData: pool.IMaterialPassData): pool.IMaterialPassData; - } -} -declare module away.materials { - /** - * MaterialBase forms an abstract base class for any material. - * A material consists of several passes, each of which constitutes at least one render call. Several passes could - * be used for special effects (render lighting for many lights in several passes, render an outline in a separate - * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space - * subsurface scattering, or rendering a depth map for specialized self-shadowing). - * - * Away3D provides default materials trough SinglePassMaterialBase and MultiPassMaterialBase, which use modular - * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom - * shaders, or entire new material frameworks. - */ - class CSSMaterialBase extends MaterialBase { - private _sizeChanged; - private _imageElement; - private _imageStyle; - public imageElement : HTMLImageElement; - public imageStyle : MSStyleCSSProperties; - /** - * The texture object to use for the albedo colour. - */ - public texture : textures.Texture2DBase; - /** - * Creates a new MaterialBase object. - */ - constructor(texture?: textures.Texture2DBase, smooth?: boolean, repeat?: boolean); - private notifySizeChanged(); - } -} -declare module away.prefabs { - /** - * PrefabBase is an abstract base class for prefabs, which are prebuilt display objects that allow easy cloning and updating - */ - class PrefabBase extends library.NamedAssetBase { - public _pObjects: base.DisplayObject[]; - /** - * Creates a new PrefabBase object. - */ - constructor(); - /** - * Returns a display object generated from this prefab - */ - public getNewObject(): base.DisplayObject; - public _pCreateObject(): base.DisplayObject; - public _iValidate(): void; - } -} -declare module away.prefabs { - /** - * PrimitivePrefabBase is an abstract base class for polytope prefabs, which are simple pre-built geometric shapes - */ - class PrimitivePrefabBase extends PrefabBase { - public _geomDirty: boolean; - public _uvDirty: boolean; - private _material; - private _geometry; - private _subGeometry; - private _geometryType; - private _geometryTypeDirty; - /** - * - */ - public assetType : string; - /** - * - */ - public geometryType : string; - public geometry : base.Geometry; - /** - * The material with which to render the primitive. - */ - public material : materials.MaterialBase; - /** - * Creates a new PrimitivePrefabBase object. - * - * @param material The material with which to render the object - */ - constructor(material?: materials.MaterialBase, geometryType?: string); - /** - * Builds the primitive's geometry when invalid. This method should not be called directly. The calling should - * be triggered by the invalidateGeometry method (and in turn by updateGeometry). - */ - public _pBuildGeometry(target: base.SubGeometryBase, geometryType: string): void; - /** - * Builds the primitive's uv coordinates when invalid. This method should not be called directly. The calling - * should be triggered by the invalidateUVs method (and in turn by updateUVs). - */ - public _pBuildUVs(target: base.SubGeometryBase, geometryType: string): void; - /** - * Invalidates the primitive's geometry type, causing it to be updated when requested. - */ - public invalidateGeometryType(): void; - /** - * Invalidates the primitive's geometry, causing it to be updated when requested. - */ - public _pInvalidateGeometry(): void; - /** - * Invalidates the primitive's uv coordinates, causing them to be updated when requested. - */ - public _pInvalidateUVs(): void; - /** - * Updates the subgeometry when invalid. - */ - private updateGeometryType(); - /** - * Updates the geometry when invalid. - */ - private updateGeometry(); - /** - * Updates the uv coordinates when invalid. - */ - private updateUVs(); - public _iValidate(): void; - public _pCreateObject(): base.DisplayObject; - } -} -declare module away.prefabs { - /** - * A UV Cylinder primitive mesh. - */ - class PrimitiveTorusPrefab extends PrimitivePrefabBase implements library.IAsset { - private _radius; - private _tubeRadius; - private _segmentsR; - private _segmentsT; - private _yUp; - private _numVertices; - /** - * The radius of the torus. - */ - public radius : number; - /** - * The radius of the inner tube of the torus. - */ - public tubeRadius : number; - /** - * Defines the number of horizontal segments that make up the torus. Defaults to 16. - */ - public segmentsR : number; - /** - * Defines the number of vertical segments that make up the torus. Defaults to 8. - */ - public segmentsT : number; - /** - * Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - public yUp : boolean; - /** - * Creates a new Torus object. - * @param radius The radius of the torus. - * @param tuebRadius The radius of the inner tube of the torus. - * @param segmentsR Defines the number of horizontal segments that make up the torus. - * @param segmentsT Defines the number of vertical segments that make up the torus. - * @param yUp Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius?: number, tubeRadius?: number, segmentsR?: number, segmentsT?: number, yUp?: boolean); - /** - * @inheritDoc - */ - public _pBuildGeometry(target: base.SubGeometryBase, geometryType: string): void; - /** - * @inheritDoc - */ - public _pBuildUVs(target: base.SubGeometryBase, geometryType: string): void; - } -} -declare module away.prefabs { - /** - * A Cube primitive prefab. - */ - class PrimitiveCubePrefab extends PrimitivePrefabBase implements library.IAsset { - private _width; - private _height; - private _depth; - private _tile6; - private _segmentsW; - private _segmentsH; - private _segmentsD; - /** - * Creates a new Cube object. - * @param width The size of the cube along its X-axis. - * @param height The size of the cube along its Y-axis. - * @param depth The size of the cube along its Z-axis. - * @param segmentsW The number of segments that make up the cube along the X-axis. - * @param segmentsH The number of segments that make up the cube along the Y-axis. - * @param segmentsD The number of segments that make up the cube along the Z-axis. - * @param tile6 The type of uv mapping to use. When true, a texture will be subdivided in a 2x3 grid, each used for a single face. When false, the entire image is mapped on each face. - */ - constructor(width?: number, height?: number, depth?: number, segmentsW?: number, segmentsH?: number, segmentsD?: number, tile6?: boolean); - /** - * The size of the cube along its X-axis. - */ - public width : number; - /** - * The size of the cube along its Y-axis. - */ - public height : number; - /** - * The size of the cube along its Z-axis. - */ - public depth : number; - /** - * The type of uv mapping to use. When false, the entire image is mapped on each face. - * When true, a texture will be subdivided in a 3x2 grid, each used for a single face. - * Reading the tiles from left to right, top to bottom they represent the faces of the - * cube in the following order: bottom, top, back, left, front, right. This creates - * several shared edges (between the top, front, left and right faces) which simplifies - * texture painting. - */ - public tile6 : boolean; - /** - * The number of segments that make up the cube along the X-axis. Defaults to 1. - */ - public segmentsW : number; - /** - * The number of segments that make up the cube along the Y-axis. Defaults to 1. - */ - public segmentsH : number; - /** - * The number of segments that make up the cube along the Z-axis. Defaults to 1. - */ - public segmentsD : number; - /** - * @inheritDoc - */ - public _pBuildGeometry(target: base.SubGeometryBase, geometryType: string): void; - /** - * @inheritDoc - */ - public _pBuildUVs(target: base.SubGeometryBase, geometryType: string): void; - } -} -declare module away.prefabs { - /** - * A Plane primitive mesh. - */ - class PrimitivePlanePrefab extends PrimitivePrefabBase implements library.IAsset { - private _segmentsW; - private _segmentsH; - private _yUp; - private _width; - private _height; - private _doubleSided; - /** - * Creates a new Plane object. - * @param width The width of the plane. - * @param height The height of the plane. - * @param segmentsW The number of segments that make up the plane along the X-axis. - * @param segmentsH The number of segments that make up the plane along the Y or Z-axis. - * @param yUp Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). - * @param doubleSided Defines whether the plane will be visible from both sides, with correct vertex normals. - */ - constructor(width?: number, height?: number, segmentsW?: number, segmentsH?: number, yUp?: boolean, doubleSided?: boolean); - /** - * The number of segments that make up the plane along the X-axis. Defaults to 1. - */ - public segmentsW : number; - /** - * The number of segments that make up the plane along the Y or Z-axis, depending on whether yUp is true or - * false, respectively. Defaults to 1. - */ - public segmentsH : number; - /** - * Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). Defaults to true. - */ - public yUp : boolean; - /** - * Defines whether the plane will be visible from both sides, with correct vertex normals (as opposed to bothSides on Material). Defaults to false. - */ - public doubleSided : boolean; - /** - * The width of the plane. - */ - public width : number; - /** - * The height of the plane. - */ - public height : number; - /** - * @inheritDoc - */ - public _pBuildGeometry(target: base.SubGeometryBase, geometryType: string): void; - /** - * @inheritDoc - */ - public _pBuildUVs(target: base.SubGeometryBase, geometryType: string): void; - } -} -declare module away.prefabs { - /** - * A Capsule primitive mesh. - */ - class PrimitiveCapsulePrefab extends PrimitivePrefabBase implements library.IAsset { - private _radius; - private _height; - private _segmentsW; - private _segmentsH; - private _yUp; - private _numVertices; - /** - * The radius of the capsule. - */ - public radius : number; - /** - * The height of the capsule. - */ - public height : number; - /** - * Defines the number of horizontal segments that make up the capsule. Defaults to 16. - */ - public segmentsW : number; - /** - * Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven. - */ - public segmentsH : number; - /** - * Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - public yUp : boolean; - /** - * Creates a new Capsule object. - * @param radius The radius of the capsule. - * @param height The height of the capsule. - * @param segmentsW Defines the number of horizontal segments that make up the capsule. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven value. - * @param yUp Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius?: number, height?: number, segmentsW?: number, segmentsH?: number, yUp?: boolean); - /** - * @inheritDoc - */ - public _pBuildGeometry(target: base.SubGeometryBase, geometryType: string): void; - /** - * @inheritDoc - */ - public _pBuildUVs(target: base.SubGeometryBase, geometryType: string): void; - } -} -declare module away.prefabs { - /** - * A Cylinder primitive mesh. - */ - class PrimitiveCylinderPrefab extends PrimitivePrefabBase implements library.IAsset { - public _pBottomRadius: number; - public _pSegmentsW: number; - public _pSegmentsH: number; - private _topRadius; - private _height; - private _topClosed; - private _bottomClosed; - private _surfaceClosed; - private _yUp; - private _numVertices; - /** - * The radius of the top end of the cylinder. - */ - public topRadius : number; - /** - * The radius of the bottom end of the cylinder. - */ - public bottomRadius : number; - /** - * The radius of the top end of the cylinder. - */ - public height : number; - /** - * Defines the number of horizontal segments that make up the cylinder. Defaults to 16. - */ - public segmentsW : number; - public setSegmentsW(value: number): void; - /** - * Defines the number of vertical segments that make up the cylinder. Defaults to 1. - */ - public segmentsH : number; - public setSegmentsH(value: number): void; - /** - * Defines whether the top end of the cylinder is closed (true) or open. - */ - public topClosed : boolean; - /** - * Defines whether the bottom end of the cylinder is closed (true) or open. - */ - public bottomClosed : boolean; - /** - * Defines whether the cylinder poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - public yUp : boolean; - /** - * Creates a new Cylinder object. - * @param topRadius The radius of the top end of the cylinder. - * @param bottomRadius The radius of the bottom end of the cylinder - * @param height The radius of the bottom end of the cylinder - * @param segmentsW Defines the number of horizontal segments that make up the cylinder. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the cylinder. Defaults to 1. - * @param topClosed Defines whether the top end of the cylinder is closed (true) or open. - * @param bottomClosed Defines whether the bottom end of the cylinder is closed (true) or open. - * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(topRadius?: number, bottomRadius?: number, height?: number, segmentsW?: number, segmentsH?: number, topClosed?: boolean, bottomClosed?: boolean, surfaceClosed?: boolean, yUp?: boolean); - /** - * @inheritDoc - */ - public _pBuildGeometry(target: base.SubGeometryBase, geometryType: string): void; - /** - * @inheritDoc - */ - public _pBuildUVs(target: base.SubGeometryBase, geometryType: string): void; - } -} -declare module away.prefabs { - /** - * A UV Cone primitive mesh. - */ - class PrimitiveConePrefab extends PrimitiveCylinderPrefab implements library.IAsset { - /** - * The radius of the bottom end of the cone. - */ - public radius : number; - /** - * Creates a new Cone object. - * @param radius The radius of the bottom end of the cone - * @param height The height of the cone - * @param segmentsW Defines the number of horizontal segments that make up the cone. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the cone. Defaults to 1. - * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius?: number, height?: number, segmentsW?: number, segmentsH?: number, closed?: boolean, yUp?: boolean); - } -} -declare module away.prefabs { - /** - * A UV RegularPolygon primitive mesh. - */ - class PrimitivePolygonPrefab extends PrimitiveCylinderPrefab implements library.IAsset { - /** - * The radius of the regular polygon. - */ - public radius : number; - /** - * The number of sides of the regular polygon. - */ - public sides : number; - /** - * The number of subdivisions from the edge to the center of the regular polygon. - */ - public subdivisions : number; - /** - * Creates a new RegularPolygon disc object. - * @param radius The radius of the regular polygon - * @param sides Defines the number of sides of the regular polygon. - * @param yUp Defines whether the regular polygon should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius?: number, sides?: number, yUp?: boolean); - } -} -declare module away.prefabs { - /** - * A UV Sphere primitive mesh. - */ - class PrimitiveSpherePrefab extends PrimitivePrefabBase implements library.IAsset { - private _radius; - private _segmentsW; - private _segmentsH; - private _yUp; - /** - * The radius of the sphere. - */ - public radius : number; - /** - * Defines the number of horizontal segments that make up the sphere. Defaults to 16. - */ - public segmentsW : number; - /** - * Defines the number of vertical segments that make up the sphere. Defaults to 12. - */ - public segmentsH : number; - /** - * Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - public yUp : boolean; - /** - * Creates a new Sphere object. - * - * @param radius The radius of the sphere. - * @param segmentsW Defines the number of horizontal segments that make up the sphere. - * @param segmentsH Defines the number of vertical segments that make up the sphere. - * @param yUp Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius?: number, segmentsW?: number, segmentsH?: number, yUp?: boolean); - /** - * @inheritDoc - */ - public _pBuildGeometry(target: base.SubGeometryBase, geometryType: string): void; - /** - * @inheritDoc - */ - public _pBuildUVs(target: base.SubGeometryBase, geometryType: string): void; - } -} -declare module away.animators { - /** - * Provides an abstract base class for nodes in an animation blend tree. - */ - class AnimationNodeBase extends library.NamedAssetBase implements library.IAsset { - public _pStateClass: any; - public stateClass : any; - /** - * Creates a new AnimationNodeBase object. - */ - constructor(); - /** - * @inheritDoc - */ - public dispose(): void; - /** - * @inheritDoc - */ - public assetType : string; - } -} -declare module away.animators { - /** - * Provides an interface for data set classes that hold animation data for use in animator classes. - * - * @see away3d.animators.AnimatorBase - */ - interface IAnimationSet extends library.IAsset { - /** - * Check to determine whether a state is registered in the animation set under the given name. - * - * @param stateName The name of the animation state object to be checked. - */ - hasAnimation(name: string): boolean; - /** - * Retrieves the animation state object registered in the animation data set under the given name. - * - * @param stateName The name of the animation state object to be retrieved. - */ - getAnimation(name: string): AnimationNodeBase; - /** - * Indicates whether the properties of the animation data contained within the set combined with - * the vertex registers aslready in use on shading materials allows the animation data to utilise - * GPU calls. - */ - usesCPU: boolean; - /** - * Called by the material to reset the GPU indicator before testing whether register space in the shader - * is available for running GPU-based animation code. - * - * @private - */ - resetGPUCompatibility(): any; - /** - * Called by the animator to void the GPU indicator when register space in the shader - * is no longer available for running GPU-based animation code. - * - * @private - */ - cancelGPUCompatibility(): any; - } -} -declare module away.animators { - /** - * Provides an interface for animator classes that control animation output from a data set subtype of AnimationSetBase. - * - * @see away.animators.IAnimationSet - */ - interface IAnimator extends library.IAsset { - /** - * - */ - animationSet: IAnimationSet; - /** - * - */ - clone(): IAnimator; - /** - * - */ - dispose(): any; - /** - * Used by the entity object to which the animator is applied, registers the owner for internal use. - * - * @private - */ - addOwner(mesh: entities.IEntity): any; - /** - * Used by the mesh object from which the animator is removed, unregisters the owner for internal use. - * - * @private - */ - removeOwner(mesh: entities.IEntity): any; - /** - * //TODO - * - * @param sourceSubGeometry - */ - getRenderableSubGeometry(renderable: pool.IRenderable, sourceSubGeometry: base.SubGeometryBase): base.SubGeometryBase; - } -} -declare module away { - class AwayJSCore extends events.EventDispatcher { - constructor(); - } -} diff --git a/build/awayjs-core.next.js b/build/awayjs-core.next.js deleted file mode 100644 index 8f311490..00000000 --- a/build/awayjs-core.next.js +++ /dev/null @@ -1,34946 +0,0 @@ -/// -var away; -(function (away) { - (function (errors) { - var Error = (function () { - function Error(message, id, _name) { - if (typeof message === "undefined") { message = ''; } - if (typeof id === "undefined") { id = 0; } - if (typeof _name === "undefined") { _name = ''; } - this._errorID = 0; - this._messsage = ''; - this._name = ''; - this._messsage = message; - this._name = name; - this._errorID = id; - } - Object.defineProperty(Error.prototype, "message", { - /** - * - * @returns {string} - */ - get: function () { - return this._messsage; - }, - /** - * - * @param value - */ - set: function (value) { - this._messsage = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Error.prototype, "name", { - /** - * - * @returns {string} - */ - get: function () { - return this._name; - }, - /** - * - * @param value - */ - set: function (value) { - this._name = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Error.prototype, "errorID", { - /** - * - * @returns {number} - */ - get: function () { - return this._errorID; - }, - enumerable: true, - configurable: true - }); - return Error; - })(); - errors.Error = Error; - })(away.errors || (away.errors = {})); - var errors = away.errors; -})(away || (away = {})); -/// -var __extends = this.__extends || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var away; -(function (away) { - (function (errors) { - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - var ArgumentError = (function (_super) { - __extends(ArgumentError, _super); - /** - * Create a new ArgumentError. - * - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - function ArgumentError(message, id) { - if (typeof message === "undefined") { message = null; } - if (typeof id === "undefined") { id = 0; } - _super.call(this, message || "ArgumentError", id); - } - return ArgumentError; - })(away.errors.Error); - errors.ArgumentError = ArgumentError; - })(away.errors || (away.errors = {})); - var errors = away.errors; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (errors) { - var CastError = (function (_super) { - __extends(CastError, _super); - function CastError(message) { - _super.call(this, message); - } - return CastError; - })(errors.Error); - errors.CastError = CastError; - })(away.errors || (away.errors = {})); - var errors = away.errors; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (errors) { - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - var PartialImplementationError = (function (_super) { - __extends(PartialImplementationError, _super); - /** - * Create a new AbstractMethodError. - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - function PartialImplementationError(dependency, id) { - if (typeof dependency === "undefined") { dependency = ''; } - if (typeof id === "undefined") { id = 0; } - _super.call(this, "PartialImplementationError - this function is in development. Required Dependency: " + dependency, id); - } - return PartialImplementationError; - })(errors.Error); - errors.PartialImplementationError = PartialImplementationError; - })(away.errors || (away.errors = {})); - var errors = away.errors; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (errors) { - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - var AbstractMethodError = (function (_super) { - __extends(AbstractMethodError, _super); - /** - * Create a new AbstractMethodError. - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - function AbstractMethodError(message, id) { - if (typeof message === "undefined") { message = null; } - if (typeof id === "undefined") { id = 0; } - _super.call(this, message || "An abstract method was called! Either an instance of an abstract class was created, or an abstract method was not overridden by the subclass.", id); - } - return AbstractMethodError; - })(away.errors.Error); - errors.AbstractMethodError = AbstractMethodError; - })(away.errors || (away.errors = {})); - var errors = away.errors; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (errors) { - var DocumentError = (function (_super) { - __extends(DocumentError, _super); - function DocumentError(message, id) { - if (typeof message === "undefined") { message = "DocumentError"; } - if (typeof id === "undefined") { id = 0; } - _super.call(this, message, id); - } - DocumentError.DOCUMENT_DOES_NOT_EXIST = "documentDoesNotExist"; - return DocumentError; - })(errors.Error); - errors.DocumentError = DocumentError; - })(away.errors || (away.errors = {})); - var errors = away.errors; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (errors) { - /** - * RangeError is thrown when an index is accessed out of range of the number of - * available indices on an Array. - */ - var RangeError = (function (_super) { - __extends(RangeError, _super); - /** - * Create a new RangeError. - * - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - function RangeError(message, id) { - if (typeof message === "undefined") { message = null; } - if (typeof id === "undefined") { id = 0; } - _super.call(this, message || "RangeError", id); - } - return RangeError; - })(away.errors.Error); - errors.RangeError = RangeError; - })(away.errors || (away.errors = {})); - var errors = away.errors; -})(away || (away = {})); -var away; -(function (away) { - /** - * Base event class - * @class away.events.Event - */ - (function (events) { - var Event = (function () { - function Event(type) { - /** - * Type of event - * @property type - * @type String - */ - this.type = undefined; - /** - * Reference to target object - * @property target - * @type Object - */ - this.target = undefined; - this.type = type; - } - /** - * Clones the current event. - * @return An exact duplicate of the current event. - */ - Event.prototype.clone = function () { - return new Event(this.type); - }; - Event.COMPLETE = 'complete'; - Event.OPEN = 'open'; - - Event.ENTER_FRAME = 'enterFrame'; - Event.EXIT_FRAME = 'exitFrame'; - - Event.RESIZE = "resize"; - Event.ERROR = "error"; - Event.CHANGE = "change"; - return Event; - })(); - events.Event = Event; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (events) { - /** - * @class away.events.AssetEvent - */ - var AssetEvent = (function (_super) { - __extends(AssetEvent, _super); - /** - * - */ - function AssetEvent(type, asset, prevName) { - if (typeof asset === "undefined") { asset = null; } - if (typeof prevName === "undefined") { prevName = null; } - _super.call(this, type); - - this._asset = asset; - this._prevName = prevName || (this._asset ? this._asset.name : null); - } - Object.defineProperty(AssetEvent.prototype, "asset", { - /** - * - */ - get: function () { - return this._asset; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(AssetEvent.prototype, "assetPrevName", { - /** - * - */ - get: function () { - return this._prevName; - }, - enumerable: true, - configurable: true - }); - - /** - * - */ - AssetEvent.prototype.clone = function () { - return new away.events.AssetEvent(this.type, this.asset, this.assetPrevName); - }; - AssetEvent.ASSET_COMPLETE = "assetComplete"; - - AssetEvent.ASSET_RENAME = 'assetRename'; - - AssetEvent.ASSET_CONFLICT_RESOLVED = 'assetConflictResolved'; - - AssetEvent.TEXTURE_SIZE_ERROR = 'textureSizeError'; - return AssetEvent; - })(away.events.Event); - events.AssetEvent = AssetEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - /** - * @class away.events.CameraEvent - */ - var CameraEvent = (function (_super) { - __extends(CameraEvent, _super); - function CameraEvent(type, camera) { - _super.call(this, type); - - this._camera = camera; - } - Object.defineProperty(CameraEvent.prototype, "camera", { - get: function () { - return this._camera; - }, - enumerable: true, - configurable: true - }); - CameraEvent.PROJECTION_CHANGED = "projectionChanged"; - return CameraEvent; - })(away.events.Event); - events.CameraEvent = CameraEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -var away; -(function (away) { - /// - /** - * @module away.events - */ - (function (events) { - var DisplayObjectEvent = (function (_super) { - __extends(DisplayObjectEvent, _super); - function DisplayObjectEvent(type, object) { - _super.call(this, type); - this.object = object; - } - DisplayObjectEvent.VISIBLITY_UPDATED = "visiblityUpdated"; - DisplayObjectEvent.SCENETRANSFORM_CHANGED = "scenetransformChanged"; - DisplayObjectEvent.SCENE_CHANGED = "sceneChanged"; - DisplayObjectEvent.POSITION_CHANGED = "positionChanged"; - DisplayObjectEvent.ROTATION_CHANGED = "rotationChanged"; - DisplayObjectEvent.SCALE_CHANGED = "scaleChanged"; - return DisplayObjectEvent; - })(events.Event); - events.DisplayObjectEvent = DisplayObjectEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - /** - * Base class for dispatching events - * - * @class away.events.EventDispatcher - * - */ - var EventDispatcher = (function () { - function EventDispatcher(target) { - if (typeof target === "undefined") { target = null; } - this.listeners = new Array(); - this.target = target || this; - } - /** - * Add an event listener - * @method addEventListener - * @param {String} Name of event to add a listener for - * @param {Function} Callback function - */ - EventDispatcher.prototype.addEventListener = function (type, listener) { - if (this.listeners[type] === undefined) - this.listeners[type] = new Array(); - - if (this.getEventListenerIndex(type, listener) === -1) - this.listeners[type].push(listener); - }; - - /** - * Remove an event listener - * @method removeEventListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - EventDispatcher.prototype.removeEventListener = function (type, listener) { - var index = this.getEventListenerIndex(type, listener); - - if (index !== -1) - this.listeners[type].splice(index, 1); - }; - - /** - * Dispatch an event - * @method dispatchEvent - * @param {Event} Event to dispatch - */ - EventDispatcher.prototype.dispatchEvent = function (event) { - var listenerArray = this.listeners[event.type]; - - if (listenerArray !== undefined) { - var l = listenerArray.length; - - event.target = this.target; - - for (var i = 0; i < l; i++) - listenerArray[i](event); - } - }; - - /** - * get Event Listener Index in array. Returns -1 if no listener is added - * @method getEventListenerIndex - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - EventDispatcher.prototype.getEventListenerIndex = function (type, listener) { - if (this.listeners[type] !== undefined) { - var a = this.listeners[type]; - var l = a.length; - - for (var i = 0; i < l; i++) - if (listener == a[i]) - return i; - } - - return -1; - }; - - /** - * check if an object has an event listener assigned to it - * @method hasListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - EventDispatcher.prototype.hasEventListener = function (type, listener) { - if (listener != null) { - return (this.getEventListenerIndex(type, listener) !== -1); - } else { - if (this.listeners[type] !== undefined) - return (this.listeners[type].length > 0); - - return false; - } - - return false; - }; - return EventDispatcher; - })(); - events.EventDispatcher = EventDispatcher; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (events) { - /** - * Dispatched to notify changes in a geometry object's state. - * - * @class away.events.GeometryEvent - * @see away3d.core.base.Geometry - */ - var GeometryEvent = (function (_super) { - __extends(GeometryEvent, _super); - /** - * Create a new GeometryEvent - * @param type The event type. - * @param subGeometry An optional TriangleSubGeometry object that is the subject of this event. - */ - function GeometryEvent(type, subGeometry) { - if (typeof subGeometry === "undefined") { subGeometry = null; } - _super.call(this, type); - this._subGeometry = subGeometry; - } - Object.defineProperty(GeometryEvent.prototype, "subGeometry", { - /** - * The TriangleSubGeometry object that is the subject of this event, if appropriate. - */ - get: function () { - return this._subGeometry; - }, - enumerable: true, - configurable: true - }); - - /** - * Clones the event. - * @return An exact duplicate of the current object. - */ - GeometryEvent.prototype.clone = function () { - return new GeometryEvent(this.type, this._subGeometry); - }; - GeometryEvent.SUB_GEOMETRY_ADDED = "SubGeometryAdded"; - - GeometryEvent.SUB_GEOMETRY_REMOVED = "SubGeometryRemoved"; - - GeometryEvent.BOUNDS_INVALID = "BoundsInvalid"; - return GeometryEvent; - })(away.events.Event); - events.GeometryEvent = GeometryEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (events) { - /** - * @class away.events.HTTPStatusEvent - */ - var HTTPStatusEvent = (function (_super) { - __extends(HTTPStatusEvent, _super); - function HTTPStatusEvent(type, status) { - if (typeof status === "undefined") { status = null; } - _super.call(this, type); - - this.status = status; - } - HTTPStatusEvent.HTTP_STATUS = "HTTPStatusEvent_HTTP_STATUS"; - return HTTPStatusEvent; - })(away.events.Event); - events.HTTPStatusEvent = HTTPStatusEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - var IOErrorEvent = (function (_super) { - __extends(IOErrorEvent, _super); - function IOErrorEvent(type) { - _super.call(this, type); - } - IOErrorEvent.IO_ERROR = "ioError"; - return IOErrorEvent; - })(away.events.Event); - events.IOErrorEvent = IOErrorEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - var LightEvent = (function (_super) { - __extends(LightEvent, _super); - function LightEvent(type) { - _super.call(this, type); - } - //@override - LightEvent.prototype.clone = function () { - return new away.events.LightEvent(this.type); - }; - LightEvent.CASTS_SHADOW_CHANGE = "castsShadowChange"; - return LightEvent; - })(away.events.Event); - events.LightEvent = LightEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - var LoaderEvent = (function (_super) { - __extends(LoaderEvent, _super); - /** - * Create a new LoaderEvent object. - * - * @param type The event type. - * @param url The url of the loaded resource. - * @param assets The assets of the loaded resource. - */ - function LoaderEvent(type, url, content, assets) { - if (typeof url === "undefined") { url = null; } - if (typeof content === "undefined") { content = null; } - if (typeof assets === "undefined") { assets = null; } - _super.call(this, type); - - this._url = url; - this._content = content; - this._assets = assets; - } - Object.defineProperty(LoaderEvent.prototype, "content", { - /** - * The content returned if the resource has been loaded inside a Loader object. - */ - get: function () { - return this._content; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LoaderEvent.prototype, "url", { - /** - * The url of the loaded resource. - */ - get: function () { - return this._url; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LoaderEvent.prototype, "assets", { - /** - * The error string on loadError. - */ - get: function () { - return this._assets; - }, - enumerable: true, - configurable: true - }); - - /** - * Clones the current event. - * @return An exact duplicate of the current event. - */ - LoaderEvent.prototype.clone = function () { - return new LoaderEvent(this.type, this._url, this._content, this._assets); - }; - LoaderEvent.RESOURCE_COMPLETE = "resourceComplete"; - return LoaderEvent; - })(away.events.Event); - events.LoaderEvent = LoaderEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - //import flash.events.Event; - var ParserEvent = (function (_super) { - __extends(ParserEvent, _super); - function ParserEvent(type, message) { - if (typeof message === "undefined") { message = ''; } - _super.call(this, type); - - this._message = message; - } - Object.defineProperty(ParserEvent.prototype, "message", { - /** - * Additional human-readable message. Usually supplied for ParserEvent.PARSE_ERROR events. - */ - get: function () { - return this._message; - }, - enumerable: true, - configurable: true - }); - - ParserEvent.prototype.clone = function () { - return new away.events.ParserEvent(this.type, this.message); - }; - ParserEvent.PARSE_COMPLETE = 'parseComplete'; - - ParserEvent.PARSE_ERROR = 'parseError'; - - ParserEvent.READY_FOR_DEPENDENCIES = 'readyForDependencies'; - return ParserEvent; - })(away.events.Event); - events.ParserEvent = ParserEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -var away; -(function (away) { - /// - /** - * @module away.events - */ - (function (events) { - /** - * A MouseEvent is dispatched when a mouse event occurs over a mouseEnabled object in View. - * TODO: we don't have screenZ data, tho this should be easy to implement - */ - var MouseEvent = (function (_super) { - __extends(MouseEvent, _super); - /** - * Create a new MouseEvent object. - * @param type The type of the MouseEvent. - */ - function MouseEvent(type) { - _super.call(this, type); - // Private. - this._iAllowedToPropagate = true; - } - Object.defineProperty(MouseEvent.prototype, "bubbles", { - /** - * @inheritDoc - */ - get: function () { - var doesBubble = this._iAllowedToPropagate; - this._iAllowedToPropagate = true; - - // Don't bubble if propagation has been stopped. - return doesBubble; - }, - enumerable: true, - configurable: true - }); - - /** - * @inheritDoc - */ - MouseEvent.prototype.stopPropagation = function () { - this._iAllowedToPropagate = false; - - if (this._iParentEvent) - this._iParentEvent.stopPropagation(); - }; - - /** - * @inheritDoc - */ - MouseEvent.prototype.stopImmediatePropagation = function () { - this._iAllowedToPropagate = false; - - if (this._iParentEvent) - this._iParentEvent.stopImmediatePropagation(); - }; - - /** - * Creates a copy of the MouseEvent object and sets the value of each property to match that of the original. - */ - MouseEvent.prototype.clone = function () { - var result = new MouseEvent(this.type); - - /* TODO: Debug / test - look into isDefaultPrevented - if (isDefaultPrevented()) - result.preventDefault(); - */ - result.screenX = this.screenX; - result.screenY = this.screenY; - - result.view = this.view; - result.object = this.object; - result.materialOwner = this.materialOwner; - result.material = this.material; - result.uv = this.uv; - result.localPosition = this.localPosition; - result.localNormal = this.localNormal; - result.index = this.index; - result.subGeometryIndex = this.subGeometryIndex; - result.delta = this.delta; - - result.ctrlKey = this.ctrlKey; - result.shiftKey = this.shiftKey; - - result._iParentEvent = this; - result._iAllowedToPropagate = this._iAllowedToPropagate; - - return result; - }; - - Object.defineProperty(MouseEvent.prototype, "scenePosition", { - /** - * The position in scene space where the event took place - */ - get: function () { - return this.object.sceneTransform.transformVector(this.localPosition); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(MouseEvent.prototype, "sceneNormal", { - /** - * The normal in scene space where the event took place - */ - get: function () { - var sceneNormal = this.object.sceneTransform.deltaTransformVector(this.localNormal); - sceneNormal.normalize(); - - return sceneNormal; - }, - enumerable: true, - configurable: true - }); - MouseEvent.MOUSE_OVER = "mouseOver3d"; - - MouseEvent.MOUSE_OUT = "mouseOut3d"; - - MouseEvent.MOUSE_UP = "mouseUp3d"; - - MouseEvent.MOUSE_DOWN = "mouseDown3d"; - - MouseEvent.MOUSE_MOVE = "mouseMove3d"; - - MouseEvent.CLICK = "click3d"; - - MouseEvent.DOUBLE_CLICK = "doubleClick3d"; - - MouseEvent.MOUSE_WHEEL = "mouseWheel3d"; - return MouseEvent; - })(away.events.Event); - events.MouseEvent = MouseEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -var away; -(function (away) { - /// - /** - * @module away.events - */ - (function (events) { - var MaterialEvent = (function (_super) { - __extends(MaterialEvent, _super); - function MaterialEvent(type) { - _super.call(this, type); - } - MaterialEvent.SIZE_CHANGED = "sizeChanged"; - return MaterialEvent; - })(events.Event); - events.MaterialEvent = MaterialEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - var ProgressEvent = (function (_super) { - __extends(ProgressEvent, _super); - function ProgressEvent(type) { - _super.call(this, type); - } - ProgressEvent.PROGRESS = "progress"; - return ProgressEvent; - })(away.events.Event); - events.ProgressEvent = ProgressEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -var away; -(function (away) { - /// - /** - * @module away.events - */ - (function (events) { - var ProjectionEvent = (function (_super) { - __extends(ProjectionEvent, _super); - function ProjectionEvent(type, projection) { - _super.call(this, type); - this._projection = projection; - } - Object.defineProperty(ProjectionEvent.prototype, "projection", { - get: function () { - return this._projection; - }, - enumerable: true, - configurable: true - }); - ProjectionEvent.MATRIX_CHANGED = "matrixChanged"; - return ProjectionEvent; - })(away.events.Event); - events.ProjectionEvent = ProjectionEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - //import flash.events.Event; - var RendererEvent = (function (_super) { - __extends(RendererEvent, _super); - function RendererEvent(type) { - _super.call(this, type); //, bubbles, cancelable); - } - RendererEvent.VIEWPORT_UPDATED = "viewportUpdated"; - RendererEvent.SCISSOR_UPDATED = "scissorUpdated"; - return RendererEvent; - })(events.Event); - events.RendererEvent = RendererEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - var SceneEvent = (function (_super) { - __extends(SceneEvent, _super); - function SceneEvent(type, displayObject) { - this.displayObject = displayObject; - _super.call(this, type); - } - SceneEvent.ADDED_TO_SCENE = "addedToScene"; - - SceneEvent.REMOVED_FROM_SCENE = "removedFromScene"; - - SceneEvent.PARTITION_CHANGED = "partitionChanged"; - return SceneEvent; - })(away.events.Event); - events.SceneEvent = SceneEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - var StageEvent = (function (_super) { - __extends(StageEvent, _super); - function StageEvent(type) { - _super.call(this, type); - } - StageEvent.CONTEXT_CREATED = "contextCreated"; - StageEvent.CONTEXT_DISPOSED = "contextDisposed"; - StageEvent.CONTEXT_RECREATED = "contextRecreated"; - StageEvent.VIEWPORT_UPDATED = "viewportUpdated"; - return StageEvent; - })(away.events.Event); - events.StageEvent = StageEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (events) { - /** - * Dispatched to notify changes in a sub geometry object's state. - * - * @class away.events.SubGeometryEvent - * @see away3d.core.base.Geometry - */ - var SubGeometryEvent = (function (_super) { - __extends(SubGeometryEvent, _super); - /** - * Create a new GeometryEvent - * @param type The event type. - * @param dataType An optional data type of the vertex data being updated. - */ - function SubGeometryEvent(type, dataType) { - if (typeof dataType === "undefined") { dataType = ""; } - _super.call(this, type); - this._dataType = dataType; - } - Object.defineProperty(SubGeometryEvent.prototype, "dataType", { - /** - * The data type of the vertex data. - */ - get: function () { - return this._dataType; - }, - enumerable: true, - configurable: true - }); - - /** - * Clones the event. - * - * @return An exact duplicate of the current object. - */ - SubGeometryEvent.prototype.clone = function () { - return new SubGeometryEvent(this.type, this._dataType); - }; - SubGeometryEvent.INDICES_UPDATED = "indicesUpdated"; - - SubGeometryEvent.VERTICES_UPDATED = "verticesUpdated"; - return SubGeometryEvent; - })(away.events.Event); - events.SubGeometryEvent = SubGeometryEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.events - */ - (function (events) { - var TimerEvent = (function (_super) { - __extends(TimerEvent, _super); - function TimerEvent(type) { - _super.call(this, type); - } - TimerEvent.TIMER = "timer"; - TimerEvent.TIMER_COMPLETE = "timerComplete"; - return TimerEvent; - })(away.events.Event); - events.TimerEvent = TimerEvent; - })(away.events || (away.events = {})); - var events = away.events; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (utils) { - var ByteArrayBase = (function () { - function ByteArrayBase() { - this.position = 0; - this.length = 0; - this._mode = ""; - } - ByteArrayBase.prototype.writeByte = function (b) { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.readByte = function () { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.writeUnsignedByte = function (b) { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.readUnsignedByte = function () { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.writeUnsignedShort = function (b) { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.readUnsignedShort = function () { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.writeUnsignedInt = function (b) { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.readUnsignedInt = function () { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.writeFloat = function (b) { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.toFloatBits = function (x) { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.readFloat = function (b) { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.fromFloatBits = function (x) { - throw "Virtual method"; - }; - - ByteArrayBase.prototype.getBytesAvailable = function () { - throw new away.errors.AbstractMethodError('ByteArrayBase, getBytesAvailable() not implemented '); - }; - - ByteArrayBase.prototype.toString = function () { - return "[ByteArray] ( " + this._mode + " ) position=" + this.position + " length=" + this.length; - }; - - ByteArrayBase.prototype.compareEqual = function (other, count) { - if (count == undefined || count > this.length - this.position) - count = this.length - this.position; - if (count > other.length - other.position) - count = other.length - other.position; - var co0 = count; - var r = true; - while (r && count >= 4) { - count -= 4; - if (this.readUnsignedInt() != other.readUnsignedInt()) - r = false; - } - while (r && count >= 1) { - count--; - if (this.readUnsignedByte() != other.readUnsignedByte()) - r = false; - } - var c0; - this.position -= (c0 - count); - other.position -= (c0 - count); - return r; - }; - - ByteArrayBase.prototype.writeBase64String = function (s) { - for (var i = 0; i < s.length; i++) { - var v = s.charAt(i); - } - }; - - ByteArrayBase.prototype.dumpToConsole = function () { - var oldpos = this.position; - this.position = 0; - var nstep = 8; - - function asHexString(x, digits) { - var lut = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; - var sh = ""; - for (var d = 0; d < digits; d++) { - sh = lut[(x >> (d << 2)) & 0xf] + sh; - } - return sh; - } - - for (var i = 0; i < this.length; i += nstep) { - var s = asHexString(i, 4) + ":"; - for (var j = 0; j < nstep && i + j < this.length; j++) { - s += " " + asHexString(this.readUnsignedByte(), 2); - } - console.log(s); - } - this.position = oldpos; - }; - - ByteArrayBase.prototype.readBase64String = function (count) { - if (count == undefined || count > this.length - this.position) - count = this.length - this.position; - if (!(count > 0)) - return ""; - - return ByteArrayBase.internalGetBase64String(count, this.readUnsignedByte, this); - }; - - ByteArrayBase.internalGetBase64String = function (count, getUnsignedByteFunc, self) { - var r = ""; - var b0, b1, b2, enc1, enc2, enc3, enc4; - var base64Key = ByteArrayBase.Base64Key; - while (count >= 3) { - b0 = getUnsignedByteFunc.apply(self); - b1 = getUnsignedByteFunc.apply(self); - b2 = getUnsignedByteFunc.apply(self); - enc1 = b0 >> 2; - enc2 = ((b0 & 3) << 4) | (b1 >> 4); - enc3 = ((b1 & 15) << 2) | (b2 >> 6); - enc4 = b2 & 63; - r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + base64Key.charAt(enc4); - count -= 3; - } - - // pad - if (count == 2) { - b0 = getUnsignedByteFunc.apply(self); - b1 = getUnsignedByteFunc.apply(self); - enc1 = b0 >> 2; - enc2 = ((b0 & 3) << 4) | (b1 >> 4); - enc3 = ((b1 & 15) << 2); - r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + "="; - } else if (count == 1) { - b0 = getUnsignedByteFunc.apply(self); - enc1 = b0 >> 2; - enc2 = ((b0 & 3) << 4); - r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + "=="; - } - return r; - }; - ByteArrayBase.Base64Key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - return ByteArrayBase; - })(); - utils.ByteArrayBase = ByteArrayBase; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (utils) { - var ByteArray = (function (_super) { - __extends(ByteArray, _super); - function ByteArray() { - _super.call(this); - this.maxlength = 0; - this._mode = "Typed array"; - this.maxlength = 4; - this.arraybytes = new ArrayBuffer(this.maxlength); - this.unalignedarraybytestemp = new ArrayBuffer(16); - } - ByteArray.prototype.ensureWriteableSpace = function (n) { - this.ensureSpace(n + this.position); - }; - - ByteArray.prototype.setArrayBuffer = function (aBuffer) { - this.ensureSpace(aBuffer.byteLength); - - this.length = aBuffer.byteLength; - - var inInt8AView = new Int8Array(aBuffer); - var localInt8View = new Int8Array(this.arraybytes, 0, this.length); - - localInt8View.set(inInt8AView); - - this.position = 0; - }; - - ByteArray.prototype.getBytesAvailable = function () { - return (this.length) - (this.position); - }; - - ByteArray.prototype.ensureSpace = function (n) { - if (n > this.maxlength) { - var newmaxlength = (n + 255) & (~255); - var newarraybuffer = new ArrayBuffer(newmaxlength); - var view = new Uint8Array(this.arraybytes, 0, this.length); - var newview = new Uint8Array(newarraybuffer, 0, this.length); - newview.set(view); // memcpy - this.arraybytes = newarraybuffer; - this.maxlength = newmaxlength; - } - }; - - ByteArray.prototype.writeByte = function (b) { - this.ensureWriteableSpace(1); - var view = new Int8Array(this.arraybytes); - view[this.position++] = (~~b); // ~~ is cast to int in js... - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArray.prototype.readByte = function () { - if (this.position >= this.length) { - throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; - } - var view = new Int8Array(this.arraybytes); - - return view[this.position++]; - }; - - ByteArray.prototype.readBytes = function (bytes, offset, length) { - if (typeof offset === "undefined") { offset = 0; } - if (typeof length === "undefined") { length = 0; } - if (length == null) { - length = bytes.length; - } - - bytes.ensureWriteableSpace(offset + length); - - var byteView = new Int8Array(bytes.arraybytes); - var localByteView = new Int8Array(this.arraybytes); - - byteView.set(localByteView.subarray(this.position, this.position + length), offset); - - this.position += length; - - if (length + offset > bytes.length) { - bytes.length += (length + offset) - bytes.length; - } - }; - - ByteArray.prototype.writeUnsignedByte = function (b) { - this.ensureWriteableSpace(1); - var view = new Uint8Array(this.arraybytes); - view[this.position++] = (~~b) & 0xff; // ~~ is cast to int in js... - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArray.prototype.readUnsignedByte = function () { - if (this.position >= this.length) { - throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; - } - var view = new Uint8Array(this.arraybytes); - return view[this.position++]; - }; - - ByteArray.prototype.writeUnsignedShort = function (b) { - this.ensureWriteableSpace(2); - if ((this.position & 1) == 0) { - var view = new Uint16Array(this.arraybytes); - view[this.position >> 1] = (~~b) & 0xffff; // ~~ is cast to int in js... - } else { - var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); - view[0] = (~~b) & 0xffff; - var view2 = new Uint8Array(this.arraybytes, this.position, 2); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); - view2.set(view3); - } - this.position += 2; - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArray.prototype.readUTFBytes = function (len) { - var value = ""; - var max = this.position + len; - var data = new DataView(this.arraybytes); - - while (this.position < max) { - var c = data.getUint8(this.position++); - - if (c < 0x80) { - if (c == 0) - break; - value += String.fromCharCode(c); - } else if (c < 0xE0) { - value += String.fromCharCode(((c & 0x3F) << 6) | (data.getUint8(this.position++) & 0x7F)); - } else if (c < 0xF0) { - var c2 = data.getUint8(this.position++); - value += String.fromCharCode(((c & 0x1F) << 12) | ((c2 & 0x7F) << 6) | (data.getUint8(this.position++) & 0x7F)); - } else { - var c2 = data.getUint8(this.position++); - var c3 = data.getUint8(this.position++); - - value += String.fromCharCode(((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 << 6) & 0x7F) | (data.getUint8(this.position++) & 0x7F)); - } - } - - return value; - }; - - ByteArray.prototype.readInt = function () { - var data = new DataView(this.arraybytes); - var int = data.getInt32(this.position, true); - - this.position += 4; - - return int; - }; - - ByteArray.prototype.readShort = function () { - var data = new DataView(this.arraybytes); - var short = data.getInt16(this.position, true); - - this.position += 2; - return short; - }; - - ByteArray.prototype.readDouble = function () { - var data = new DataView(this.arraybytes); - var double = data.getFloat64(this.position, true); - - this.position += 8; - return double; - }; - - ByteArray.prototype.readUnsignedShort = function () { - if (this.position > this.length + 2) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - if ((this.position & 1) == 0) { - var view = new Uint16Array(this.arraybytes); - var pa = this.position >> 1; - this.position += 2; - return view[pa]; - } else { - var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); - var view2 = new Uint8Array(this.arraybytes, this.position, 2); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); - view3.set(view2); - this.position += 2; - return view[0]; - } - }; - - ByteArray.prototype.writeUnsignedInt = function (b) { - this.ensureWriteableSpace(4); - if ((this.position & 3) == 0) { - var view = new Uint32Array(this.arraybytes); - view[this.position >> 2] = (~~b) & 0xffffffff; // ~~ is cast to int in js... - } else { - var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); - view[0] = (~~b) & 0xffffffff; - var view2 = new Uint8Array(this.arraybytes, this.position, 4); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); - view2.set(view3); - } - this.position += 4; - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArray.prototype.readUnsignedInt = function () { - if (this.position > this.length + 4) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - if ((this.position & 3) == 0) { - var view = new Uint32Array(this.arraybytes); - var pa = this.position >> 2; - this.position += 4; - return view[pa]; - } else { - var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); - var view2 = new Uint8Array(this.arraybytes, this.position, 4); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); - view3.set(view2); - this.position += 4; - return view[0]; - } - }; - - ByteArray.prototype.writeFloat = function (b) { - this.ensureWriteableSpace(4); - if ((this.position & 3) == 0) { - var view = new Float32Array(this.arraybytes); - view[this.position >> 2] = b; - } else { - var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); - view[0] = b; - var view2 = new Uint8Array(this.arraybytes, this.position, 4); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); - view2.set(view3); - } - this.position += 4; - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArray.prototype.readFloat = function () { - if (this.position > this.length + 4) { - throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; - } - if ((this.position & 3) == 0) { - var view = new Float32Array(this.arraybytes); - var pa = this.position >> 2; - this.position += 4; - return view[pa]; - } else { - var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); - var view2 = new Uint8Array(this.arraybytes, this.position, 4); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); - view3.set(view2); - this.position += 4; - return view[0]; - } - }; - return ByteArray; - })(utils.ByteArrayBase); - utils.ByteArray = ByteArray; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (utils) { - var ByteArrayBuffer = (function (_super) { - __extends(ByteArrayBuffer, _super); - function ByteArrayBuffer() { - _super.call(this); - this._bytes = []; - this._mode = "Array"; - } - ByteArrayBuffer.prototype.writeByte = function (b) { - var bi = ~~b; - this._bytes[this.position++] = bi; - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArrayBuffer.prototype.readByte = function () { - if (this.position >= this.length) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - return this._bytes[this.position++]; - }; - - ByteArrayBuffer.prototype.writeUnsignedByte = function (b) { - var bi = ~~b; - this._bytes[this.position++] = bi & 0xff; - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArrayBuffer.prototype.readUnsignedByte = function () { - if (this.position >= this.length) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - return this._bytes[this.position++]; - }; - - ByteArrayBuffer.prototype.writeUnsignedShort = function (b) { - var bi = ~~b; - this._bytes[this.position++] = bi & 0xff; - this._bytes[this.position++] = (bi >> 8) & 0xff; - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArrayBuffer.prototype.readUnsignedShort = function () { - if (this.position + 2 > this.length) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - var r = this._bytes[this.position] | (this._bytes[this.position + 1] << 8); - this.position += 2; - return r; - }; - - ByteArrayBuffer.prototype.writeUnsignedInt = function (b) { - var bi = ~~b; - this._bytes[this.position++] = bi & 0xff; - this._bytes[this.position++] = (bi >>> 8) & 0xff; - this._bytes[this.position++] = (bi >>> 16) & 0xff; - this._bytes[this.position++] = (bi >>> 24) & 0xff; - if (this.position > this.length) { - this.length = this.position; - } - }; - - ByteArrayBuffer.prototype.readUnsignedInt = function () { - if (this.position + 4 > this.length) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - var r = this._bytes[this.position] | (this._bytes[this.position + 1] << 8) | (this._bytes[this.position + 2] << 16) | (this._bytes[this.position + 3] << 24); - this.position += 4; - return r >>> 0; - }; - - ByteArrayBuffer.prototype.writeFloat = function (b) { - // this is crazy slow and silly, but as a fallback... - this.writeUnsignedInt(this.toFloatBits(Number(b))); - }; - - ByteArrayBuffer.prototype.toFloatBits = function (x) { - // don't handle inf/nan yet - // special case zero - if (x == 0) { - return 0; - } - - // remove the sign, after this we only deal with positive numbers - var sign = 0; - if (x < 0) { - x = -x; - sign = 1; - } else { - sign = 0; - } - - // a float value is now defined as: x = (1+(mantissa*2^-23))*(2^(exponent-127)) - var exponent = Math.log(x) / Math.log(2); - exponent = Math.floor(exponent); - x = x * Math.pow(2, 23 - exponent); // normalize to 24 bits - var mantissa = Math.floor(x) - 0x800000; - exponent = exponent + 127; - return ((sign << 31) >>> 0) | (exponent << 23) | mantissa; - }; - - ByteArrayBuffer.prototype.readFloat = function (b) { - return this.fromFloatBits(this.readUnsignedInt()); - }; - - ByteArrayBuffer.prototype.fromFloatBits = function (x) { - if (x == 0) { - return 0; - } - var exponent = (x >>> 23) & 0xff; - var mantissa = (x & 0x7fffff) | 0x800000; - var y = Math.pow(2, (exponent - 127) - 23) * mantissa; - if (x >>> 31 != 0) { - y = -y; - } - return y; - }; - return ByteArrayBuffer; - })(utils.ByteArrayBase); - utils.ByteArrayBuffer = ByteArrayBuffer; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -var away; -(function (away) { - (function (utils) { - var ColorUtils = (function () { - function ColorUtils() { - } - ColorUtils.float32ColorToARGB = function (float32Color) { - var a = (float32Color & 0xff000000) >>> 24; - var r = (float32Color & 0xff0000) >>> 16; - var g = (float32Color & 0xff00) >>> 8; - var b = float32Color & 0xff; - var result = [a, r, g, b]; - - return result; - }; - - ColorUtils.componentToHex = function (c) { - var hex = c.toString(16); - return hex.length == 1 ? "0" + hex : hex; - }; - - ColorUtils.RGBToHexString = function (argb) { - return "#" + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); - }; - - ColorUtils.ARGBToHexString = function (argb) { - return "#" + ColorUtils.componentToHex(argb[0]) + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); - }; - return ColorUtils; - })(); - utils.ColorUtils = ColorUtils; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (utils) { - /** - * Helper class for casting assets to usable objects - */ - var Cast = (function () { - function Cast() { - } - Cast.string = function (data) { - if (typeof (data) == 'function') - data = new data; - - if (typeof (data) == 'string') - return data; - - return data; - }; - - Cast.byteArray = function (data) { - if (typeof (data) == 'function') - data = new data; - - if (data instanceof utils.ByteArray) - return data; - - return data; - }; - - // public static xml(data:any):XML - // { - // if (typeof(data) == 'function') - // data = new data; - // - // if (data is XML) - // return data; - // - // return XML(data); - // } - Cast.isHex = function (str) { - var length = str.length; - for (var i = 0; i < length; ++i) { - if (this._hexChars.indexOf(str.charAt(i)) == -1) - return false; - } - - return true; - }; - - Cast.tryColor = function (data) { - if (typeof (data) == 'number') - return Math.floor(data); - - if (typeof (data) == 'string') { - if (data == "random") - return Math.floor(Math.random() * 0x1000000); - - if (this._colorNames == null) { - this._colorNames = new Object(); - this._colorNames["steelblue"] = 0x4682B4; - this._colorNames["royalblue"] = 0x041690; - this._colorNames["cornflowerblue"] = 0x6495ED; - this._colorNames["lightsteelblue"] = 0xB0C4DE; - this._colorNames["mediumslateblue"] = 0x7B68EE; - this._colorNames["slateblue"] = 0x6A5ACD; - this._colorNames["darkslateblue"] = 0x483D8B; - this._colorNames["midnightblue"] = 0x191970; - this._colorNames["navy"] = 0x000080; - this._colorNames["darkblue"] = 0x00008B; - this._colorNames["mediumblue"] = 0x0000CD; - this._colorNames["blue"] = 0x0000FF; - this._colorNames["dodgerblue"] = 0x1E90FF; - this._colorNames["deepskyblue"] = 0x00BFFF; - this._colorNames["lightskyblue"] = 0x87CEFA; - this._colorNames["skyblue"] = 0x87CEEB; - this._colorNames["lightblue"] = 0xADD8E6; - this._colorNames["powderblue"] = 0xB0E0E6; - this._colorNames["azure"] = 0xF0FFFF; - this._colorNames["lightcyan"] = 0xE0FFFF; - this._colorNames["paleturquoise"] = 0xAFEEEE; - this._colorNames["mediumturquoise"] = 0x48D1CC; - this._colorNames["lightseagreen"] = 0x20B2AA; - this._colorNames["darkcyan"] = 0x008B8B; - this._colorNames["teal"] = 0x008080; - this._colorNames["cadetblue"] = 0x5F9EA0; - this._colorNames["darkturquoise"] = 0x00CED1; - this._colorNames["aqua"] = 0x00FFFF; - this._colorNames["cyan"] = 0x00FFFF; - this._colorNames["turquoise"] = 0x40E0D0; - this._colorNames["aquamarine"] = 0x7FFFD4; - this._colorNames["mediumaquamarine"] = 0x66CDAA; - this._colorNames["darkseagreen"] = 0x8FBC8F; - this._colorNames["mediumseagreen"] = 0x3CB371; - this._colorNames["seagreen"] = 0x2E8B57; - this._colorNames["darkgreen"] = 0x006400; - this._colorNames["green"] = 0x008000; - this._colorNames["forestgreen"] = 0x228B22; - this._colorNames["limegreen"] = 0x32CD32; - this._colorNames["lime"] = 0x00FF00; - this._colorNames["chartreuse"] = 0x7FFF00; - this._colorNames["lawngreen"] = 0x7CFC00; - this._colorNames["greenyellow"] = 0xADFF2F; - this._colorNames["yellowgreen"] = 0x9ACD32; - this._colorNames["palegreen"] = 0x98FB98; - this._colorNames["lightgreen"] = 0x90EE90; - this._colorNames["springgreen"] = 0x00FF7F; - this._colorNames["mediumspringgreen"] = 0x00FA9A; - this._colorNames["darkolivegreen"] = 0x556B2F; - this._colorNames["olivedrab"] = 0x6B8E23; - this._colorNames["olive"] = 0x808000; - this._colorNames["darkkhaki"] = 0xBDB76B; - this._colorNames["darkgoldenrod"] = 0xB8860B; - this._colorNames["goldenrod"] = 0xDAA520; - this._colorNames["gold"] = 0xFFD700; - this._colorNames["yellow"] = 0xFFFF00; - this._colorNames["khaki"] = 0xF0E68C; - this._colorNames["palegoldenrod"] = 0xEEE8AA; - this._colorNames["blanchedalmond"] = 0xFFEBCD; - this._colorNames["moccasin"] = 0xFFE4B5; - this._colorNames["wheat"] = 0xF5DEB3; - this._colorNames["navajowhite"] = 0xFFDEAD; - this._colorNames["burlywood"] = 0xDEB887; - this._colorNames["tan"] = 0xD2B48C; - this._colorNames["rosybrown"] = 0xBC8F8F; - this._colorNames["sienna"] = 0xA0522D; - this._colorNames["saddlebrown"] = 0x8B4513; - this._colorNames["chocolate"] = 0xD2691E; - this._colorNames["peru"] = 0xCD853F; - this._colorNames["sandybrown"] = 0xF4A460; - this._colorNames["darkred"] = 0x8B0000; - this._colorNames["maroon"] = 0x800000; - this._colorNames["brown"] = 0xA52A2A; - this._colorNames["firebrick"] = 0xB22222; - this._colorNames["indianred"] = 0xCD5C5C; - this._colorNames["lightcoral"] = 0xF08080; - this._colorNames["salmon"] = 0xFA8072; - this._colorNames["darksalmon"] = 0xE9967A; - this._colorNames["lightsalmon"] = 0xFFA07A; - this._colorNames["coral"] = 0xFF7F50; - this._colorNames["tomato"] = 0xFF6347; - this._colorNames["darkorange"] = 0xFF8C00; - this._colorNames["orange"] = 0xFFA500; - this._colorNames["orangered"] = 0xFF4500; - this._colorNames["crimson"] = 0xDC143C; - this._colorNames["red"] = 0xFF0000; - this._colorNames["deeppink"] = 0xFF1493; - this._colorNames["fuchsia"] = 0xFF00FF; - this._colorNames["magenta"] = 0xFF00FF; - this._colorNames["hotpink"] = 0xFF69B4; - this._colorNames["lightpink"] = 0xFFB6C1; - this._colorNames["pink"] = 0xFFC0CB; - this._colorNames["palevioletred"] = 0xDB7093; - this._colorNames["mediumvioletred"] = 0xC71585; - this._colorNames["purple"] = 0x800080; - this._colorNames["darkmagenta"] = 0x8B008B; - this._colorNames["mediumpurple"] = 0x9370DB; - this._colorNames["blueviolet"] = 0x8A2BE2; - this._colorNames["indigo"] = 0x4B0082; - this._colorNames["darkviolet"] = 0x9400D3; - this._colorNames["darkorchid"] = 0x9932CC; - this._colorNames["mediumorchid"] = 0xBA55D3; - this._colorNames["orchid"] = 0xDA70D6; - this._colorNames["violet"] = 0xEE82EE; - this._colorNames["plum"] = 0xDDA0DD; - this._colorNames["thistle"] = 0xD8BFD8; - this._colorNames["lavender"] = 0xE6E6FA; - this._colorNames["ghostwhite"] = 0xF8F8FF; - this._colorNames["aliceblue"] = 0xF0F8FF; - this._colorNames["mintcream"] = 0xF5FFFA; - this._colorNames["honeydew"] = 0xF0FFF0; - this._colorNames["lightgoldenrodyellow"] = 0xFAFAD2; - this._colorNames["lemonchiffon"] = 0xFFFACD; - this._colorNames["cornsilk"] = 0xFFF8DC; - this._colorNames["lightyellow"] = 0xFFFFE0; - this._colorNames["ivory"] = 0xFFFFF0; - this._colorNames["floralwhite"] = 0xFFFAF0; - this._colorNames["linen"] = 0xFAF0E6; - this._colorNames["oldlace"] = 0xFDF5E6; - this._colorNames["antiquewhite"] = 0xFAEBD7; - this._colorNames["bisque"] = 0xFFE4C4; - this._colorNames["peachpuff"] = 0xFFDAB9; - this._colorNames["papayawhip"] = 0xFFEFD5; - this._colorNames["beige"] = 0xF5F5DC; - this._colorNames["seashell"] = 0xFFF5EE; - this._colorNames["lavenderblush"] = 0xFFF0F5; - this._colorNames["mistyrose"] = 0xFFE4E1; - this._colorNames["snow"] = 0xFFFAFA; - this._colorNames["white"] = 0xFFFFFF; - this._colorNames["whitesmoke"] = 0xF5F5F5; - this._colorNames["gainsboro"] = 0xDCDCDC; - this._colorNames["lightgrey"] = 0xD3D3D3; - this._colorNames["silver"] = 0xC0C0C0; - this._colorNames["darkgrey"] = 0xA9A9A9; - this._colorNames["grey"] = 0x808080; - this._colorNames["lightslategrey"] = 0x778899; - this._colorNames["slategrey"] = 0x708090; - this._colorNames["dimgrey"] = 0x696969; - this._colorNames["darkslategrey"] = 0x2F4F4F; - this._colorNames["black"] = 0x000000; - this._colorNames["transparent"] = 0xFF000000; - } - - if (this._colorNames[data] != null) - return this._colorNames[data]; - - if ((data.length == 6) && this.isHex(data)) - return parseInt("0x" + data); - } - - return null; - }; - - Cast.color = function (data) { - var result = this.tryColor(data); - - if (result == null) - throw new away.errors.CastError("Can't cast to color: " + data); - - return result; - }; - - Cast.tryClass = function (name) { - if (this._notClasses[name]) - return name; - - var result = this._classes[name]; - - if (result != null) - return result; - - try { - result = window[name]; - this._classes[name] = result; - return result; - } catch (e) { - } - - this._notClasses[name] = true; - - return name; - }; - - Cast.bitmapData = function (data) { - if (data == null) - return null; - - if (typeof (data) == 'string') - data = this.tryClass(data); - - if (typeof (data) == 'function') { - try { - data = new data(); - } catch (e) { - data = new data(0, 0); - } - } - - if (data instanceof away.base.BitmapData) - return data; - - if (data instanceof away.textures.ImageTexture) - data = data.htmlImageElement; - - if (data instanceof HTMLImageElement) { - var imageElement = data; - var bitmapData = new away.base.BitmapData(imageElement.width, imageElement.height, true, 0x0); - bitmapData.draw(imageElement); - return bitmapData; - } - - throw new away.errors.CastError("Can't cast to BitmapData: " + data); - }; - - Cast.bitmapTexture = function (data) { - if (data == null) - return null; - - if (typeof (data) == 'string') - data = this.tryClass(data); - - if (typeof (data) == 'function') { - try { - data = new data(); - } catch (e) { - data = new data(0, 0); - } - } - - if (data instanceof away.textures.BitmapTexture) - return data; - - try { - var bmd = Cast.bitmapData(data); - return new away.textures.BitmapTexture(bmd); - } catch (e) { - } - - throw new away.errors.CastError("Can't cast to BitmapTexture: " + data); - }; - Cast._hexChars = "0123456789abcdefABCDEF"; - - Cast._notClasses = new Object(); - Cast._classes = new Object(); - return Cast; - })(); - utils.Cast = Cast; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (utils) { - var CSS = (function () { - function CSS() { - } - CSS.setElementSize = function (element, width, height) { - element.style.width = width + "px"; - element.style.height = height + "px"; - element["width"] = width; - element["height"] = height; - }; - - CSS.setElementWidth = function (element, width) { - element.style.width = width + "px"; - element["width"] = width; - }; - - CSS.setElementHeight = function (element, height) { - element.style.height = height + "px"; - element["height"] = height; - }; - - CSS.setElementX = function (element, x) { - element.style.position = 'absolute'; - element.style.left = x + "px"; - }; - - CSS.setElementY = function (element, y) { - element.style.position = 'absolute'; - element.style.top = y + "px"; - }; - - CSS.getElementVisibility = function (element) { - return element.style.visibility == 'visible'; - }; - - CSS.setElementVisibility = function (element, visible) { - if (visible) { - element.style.visibility = 'visible'; - } else { - element.style.visibility = 'hidden'; - } - }; - - CSS.setElementAlpha = function (element, alpha) { - if (element instanceof HTMLCanvasElement) { - var context = element.getContext("2d"); - context.globalAlpha = alpha; - } - }; - - CSS.setElementPosition = function (element, x, y, absolute) { - if (typeof absolute === "undefined") { absolute = false; } - if (absolute) { - element.style.position = "absolute"; - } else { - element.style.position = "relative"; - } - - element.style.left = x + "px"; - element.style.top = y + "px"; - }; - return CSS; - })(); - utils.CSS = CSS; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -/// -var away; -(function (away) { - var Debug = (function () { - function Debug() { - } - Debug.breakpoint = function () { - away.Debug['break'](); - }; - - Debug.throwPIROnKeyWordOnly = function (str, enable) { - if (typeof enable === "undefined") { enable = true; } - if (!enable) - away.Debug.keyword = null; - else - away.Debug.keyword = str; - }; - - Debug.throwPIR = function (clss, fnc, msg) { - Debug.logPIR('PartialImplementationError ' + clss, fnc, msg); - - if (Debug.THROW_ERRORS) { - if (away.Debug.keyword) { - var e = clss + fnc + msg; - - if (e.indexOf(away.Debug.keyword) == -1) - return; - } - - throw new away.errors.PartialImplementationError(clss + '.' + fnc + ': ' + msg); - } - }; - - Debug.logPIR = function (clss, fnc, msg) { - if (typeof msg === "undefined") { msg = ''; } - if (Debug.LOG_PI_ERRORS) - console.log(clss + '.' + fnc + ': ' + msg); - }; - - Debug.log = function () { - var args = []; - for (var _i = 0; _i < (arguments.length - 0); _i++) { - args[_i] = arguments[_i + 0]; - } - if (Debug.ENABLE_LOG) - console.log(args); - }; - Debug.THROW_ERRORS = true; - Debug.ENABLE_LOG = true; - Debug.LOG_PI_ERRORS = true; - - Debug.keyword = null; - return Debug; - })(); - away.Debug = Debug; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (utils) { - var Delegate = (function () { - function Delegate(func) { - if (typeof func === "undefined") { func = null; } - this._func = func; - } - /** - Creates a functions wrapper for the original function so that it runs - in the provided context. - @parameter obj Context in which to run the function. - @paramater func Function to run. - */ - Delegate.create = function (obj, func) { - var f = function () { - return func.apply(obj, arguments); - }; - - return f; - }; - - Delegate.prototype.createDelegate = function (obj) { - return Delegate.create(obj, this._func); - }; - return Delegate; - })(); - utils.Delegate = Delegate; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (utils) { - //[native(cls="TimerClass", gc="exact", instance="TimerObject", methods="auto")] - //[Event(name="timerComplete", type="flash.events.TimerEvent")] - //[Event(name="timer", type="flash.events.TimerEvent")] - function getTimer() { - // number milliseconds of 1970/01/01 - // this different to AS3 implementation which gets the number of milliseconds - // since instance of Flash player was initialised - return Date.now(); - } - utils.getTimer = getTimer; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (utils) { - var RequestAnimationFrame = (function () { - function RequestAnimationFrame(callback, callbackContext) { - var _this = this; - this._active = false; - this._argsArray = new Array(); - this._getTimer = away.utils.getTimer; - - this.setCallback(callback, callbackContext); - - this._rafUpdateFunction = function () { - if (_this._active) { - _this._tick(); - } - }; - - this._argsArray.push(this._dt); - } - // Public - /** - * - * @param callback - * @param callbackContext - */ - RequestAnimationFrame.prototype.setCallback = function (callback, callbackContext) { - this._callback = callback; - this._callbackContext = callbackContext; - }; - - /** - * - */ - RequestAnimationFrame.prototype.start = function () { - this._prevTime = this._getTimer(); - this._active = true; - - if (window.requestAnimationFrame) { - window.requestAnimationFrame(this._rafUpdateFunction); - } else { - if (window['mozRequestAnimationFrame']) { - window.requestAnimationFrame = window['mozRequestAnimationFrame']; - } else if (window['webkitRequestAnimationFrame']) { - window.requestAnimationFrame = window['webkitRequestAnimationFrame']; - } else if (window['oRequestAnimationFrame']) { - window.requestAnimationFrame = window['oRequestAnimationFrame']; - } - } - }; - - /** - * - */ - RequestAnimationFrame.prototype.stop = function () { - this._active = false; - }; - - Object.defineProperty(RequestAnimationFrame.prototype, "active", { - // Get / Set - /** - * - * @returns {boolean} - */ - get: function () { - return this._active; - }, - enumerable: true, - configurable: true - }); - - // Private - /** - * - * @private - */ - RequestAnimationFrame.prototype._tick = function () { - this._currentTime = this._getTimer(); - this._dt = this._currentTime - this._prevTime; - this._argsArray[0] = this._dt; - this._callback.apply(this._callbackContext, this._argsArray); - - window.requestAnimationFrame(this._rafUpdateFunction); - - this._prevTime = this._currentTime; - }; - return RequestAnimationFrame; - })(); - utils.RequestAnimationFrame = RequestAnimationFrame; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (utils) { - //import flash.base.BitmapData; - var TextureUtils = (function () { - function TextureUtils() { - } - TextureUtils.isBitmapDataValid = function (bitmapData) { - if (bitmapData == null) { - return true; - } - - return TextureUtils.isDimensionValid(bitmapData.width) && TextureUtils.isDimensionValid(bitmapData.height); - }; - - TextureUtils.isHTMLImageElementValid = function (image) { - if (image == null) { - return true; - } - - return TextureUtils.isDimensionValid(image.width) && TextureUtils.isDimensionValid(image.height); - }; - - TextureUtils.isDimensionValid = function (d) { - return d >= 1 && d <= TextureUtils.MAX_SIZE && TextureUtils.isPowerOfTwo(d); - }; - - TextureUtils.isPowerOfTwo = function (value) { - return value ? ((value & -value) == value) : false; - }; - - TextureUtils.getBestPowerOf2 = function (value) { - var p = 1; - - while (p < value) - p <<= 1; - - if (p > TextureUtils.MAX_SIZE) - p = TextureUtils.MAX_SIZE; - - return p; - }; - TextureUtils.MAX_SIZE = 2048; - return TextureUtils; - })(); - utils.TextureUtils = TextureUtils; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (utils) { - //[native(cls="TimerClass", gc="exact", instance="TimerObject", methods="auto")] - //[Event(name="timerComplete", type="flash.events.TimerEvent")] - //[Event(name="timer", type="flash.events.TimerEvent")] - var Timer = (function (_super) { - __extends(Timer, _super); - function Timer(delay, repeatCount) { - if (typeof repeatCount === "undefined") { repeatCount = 0; } - _super.call(this); - this._repeatCount = 0; - this._currentCount = 0; - this._running = false; - - this._delay = delay; - this._repeatCount = repeatCount; - - if (isNaN(delay) || delay < 0) { - throw new away.errors.Error("Delay is negative or not a number"); - } - } - Object.defineProperty(Timer.prototype, "currentCount", { - get: function () { - return this._currentCount; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Timer.prototype, "delay", { - get: function () { - return this._delay; - }, - set: function (value) { - this._delay = value; - - if (this._running) { - this.stop(); - this.start(); - } - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Timer.prototype, "repeatCount", { - get: function () { - return this._repeatCount; - }, - set: function (value) { - this._repeatCount = value; - }, - enumerable: true, - configurable: true - }); - - - Timer.prototype.reset = function () { - if (this._running) { - this.stop(); - } - - this._currentCount = 0; - }; - - Object.defineProperty(Timer.prototype, "running", { - get: function () { - return this._running; - }, - enumerable: true, - configurable: true - }); - - Timer.prototype.start = function () { - var _this = this; - this._running = true; - clearInterval(this._iid); - this._iid = setInterval(function () { - return _this.tick(); - }, this._delay); - }; - - Timer.prototype.stop = function () { - this._running = false; - clearInterval(this._iid); - }; - - Timer.prototype.tick = function () { - this._currentCount++; - - if ((this._repeatCount > 0) && this._currentCount >= this._repeatCount) { - this.stop(); - this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER)); - this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER_COMPLETE)); - } else { - this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER)); - } - }; - return Timer; - })(away.events.EventDispatcher); - utils.Timer = Timer; - })(away.utils || (away.utils = {})); - var utils = away.utils; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * A Box object is an area defined by its position, as indicated by its - * top-left-front corner point(x, y, z) and by its width, - * height and depth. - * - * - *

The x, y, z, width, - * height depth properties of the Box class are - * independent of each other; changing the value of one property has no effect - * on the others. However, the right, bottom and - * back properties are integrally related to those six - * properties. For example, if you change the value of the right - * property, the value of the width property changes; if you - * change the bottom property, the value of the - * height property changes.

- * - *

The following methods and properties use Box objects:

- * - *
    - *
  • The bounds property of the DisplayObject class
  • - *
- * - *

You can use the new Box() constructor to create a - * Box object.

- * - *

Note: The Box class does not define a cubic Shape - * display object. - */ - (function (geom) { - var Box = (function () { - /** - * Creates a new Box object with the top-left-front corner specified by the - * x, y and z parameters and with the - * specified width, height and depth - * parameters. If you call this public without parameters, a box with - * x, y, z, width, - * height and depth properties set to 0 is created. - * - * @param x The x coordinate of the top-left-front corner of the - * box. - * @param y The y coordinate of the top-left-front corner of the - * box. - * @param z The z coordinate of the top-left-front corner of the - * box. - * @param width The width of the box, in pixels. - * @param height The height of the box, in pixels. - * @param depth The depth of the box, in pixels. - */ - function Box(x, y, z, width, height, depth) { - if (typeof x === "undefined") { x = 0; } - if (typeof y === "undefined") { y = 0; } - if (typeof z === "undefined") { z = 0; } - if (typeof width === "undefined") { width = 0; } - if (typeof height === "undefined") { height = 0; } - if (typeof depth === "undefined") { depth = 0; } - this.x = x; - this.y = y; - this.z = z; - this.width = width; - this.height = height; - this.depth = depth; - } - Object.defineProperty(Box.prototype, "back", { - /** - * The sum of the z and height properties. - */ - get: function () { - return this.z + this.depth; - }, - set: function (val) { - this.depth = val - this.z; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Box.prototype, "bottom", { - /** - * The sum of the y and height properties. - */ - get: function () { - return this.y + this.height; - }, - set: function (val) { - this.height = val - this.y; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Box.prototype, "bottomRightBack", { - /** - * The location of the Box object's bottom-right corner, determined by the - * values of the right and bottom properties. - */ - get: function () { - if (this._bottomRightBack == null) - this._bottomRightBack = new geom.Vector3D(); - - this._bottomRightBack.x = this.x + this.width; - this._bottomRightBack.y = this.y + this.height; - this._bottomRightBack.z = this.z + this.depth; - - return this._bottomRightBack; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Box.prototype, "front", { - /** - * The z coordinate of the top-left-front corner of the box. Changing - * the front property of a Box object has no effect on the - * x, y, width and height - * properties. However it does affect the depth property, - * whereas changing the z value does not affect the - * depth property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - get: function () { - return this.z; - }, - set: function (val) { - this.depth += this.z - val; - this.z = val; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Box.prototype, "left", { - /** - * The x coordinate of the top-left corner of the box. Changing the - * left property of a Box object has no effect on the - * y and height properties. However it does affect - * the width property, whereas changing the x value - * does not affect the width property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - get: function () { - return this.x; - }, - set: function (val) { - this.width += this.x - val; - this.x = val; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Box.prototype, "right", { - /** - * The sum of the x and width properties. - */ - get: function () { - return this.x + this.width; - }, - set: function (val) { - this.width = val - this.x; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Box.prototype, "size", { - /** - * The size of the Box object, expressed as a Vector3D object with the - * values of the width, height and - * depth properties. - */ - get: function () { - if (this._size == null) - this._size = new geom.Vector3D(); - - this._size.x = this.width; - this._size.y = this.height; - this._size.z = this.depth; - - return this._size; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Box.prototype, "top", { - /** - * The y coordinate of the top-left-front corner of the box. Changing - * the top property of a Box object has no effect on the - * x and width properties. However it does affect - * the height property, whereas changing the y - * value does not affect the height property. - * - *

The value of the top property is equal to the value of the - * y property.

- */ - get: function () { - return this.y; - }, - set: function (val) { - this.height += (this.y - val); - this.y = val; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Box.prototype, "topLeftFront", { - /** - * The location of the Box object's top-left-front corner, determined by the - * x, y and z coordinates of the point. - */ - get: function () { - if (this._topLeftFront == null) - this._topLeftFront = new away.geom.Vector3D(); - - this._topLeftFront.x = this.x; - this._topLeftFront.y = this.y; - this._topLeftFront.z = this.z; - - return this._topLeftFront; - }, - enumerable: true, - configurable: true - }); - - /** - * Returns a new Box object with the same values for the x, - * y, z, width, height - * and depth properties as the original Box object. - * - * @return A new Box object with the same values for the x, - * y, z, width, - * height and depth properties as the - * original Box object. - */ - Box.prototype.clone = function () { - return new Box(this.x, this.y, this.z, this.width, this.height, this.depth); - }; - - /** - * Determines whether the specified position is contained within the cubic - * region defined by this Box object. - * - * @param x The x coordinate(horizontal component) of the position. - * @param y The y coordinate(vertical component) of the position. - * @param z The z coordinate(longitudinal component) of the position. - * @return A value of true if the Box object contains the - * specified position; otherwise false. - */ - Box.prototype.contains = function (x, y, z) { - return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y && this.z <= z && this.z + this.depth >= z); - }; - - /** - * Determines whether the specified position is contained within the cubic - * region defined by this Box object. This method is similar to the - * Box.contains() method, except that it takes a Vector3D - * object as a parameter. - * - * @param position The position, as represented by its x, y and - * z coordinates. - * @return A value of true if the Box object contains the - * specified position; otherwise false. - */ - Box.prototype.containsPoint = function (position) { - return (this.x <= position.x && this.x + this.width >= position.x && this.y <= position.y && this.y + this.height >= position.y && this.z <= position.z && this.z + this.depth >= position.z); - }; - - /** - * Determines whether the Box object specified by the box - * parameter is contained within this Box object. A Box object is said to - * contain another if the second Box object falls entirely within the - * boundaries of the first. - * - * @param box The Box object being checked. - * @return A value of true if the Box object that you specify - * is contained by this Box object; otherwise false. - */ - Box.prototype.containsRect = function (box) { - return (this.x <= box.x && this.x + this.width >= box.x + box.width && this.y <= box.y && this.y + this.height >= box.y + box.height && this.z <= box.z && this.z + this.depth >= box.z + box.depth); - }; - - /** - * Copies all of box data from the source Box object into the calling - * Box object. - * - * @param sourceBox The Box object from which to copy the data. - */ - Box.prototype.copyFrom = function (sourceBox) { - //TODO - }; - - /** - * Determines whether the object specified in the toCompare - * parameter is equal to this Box object. This method compares the - * x, y, z, width, - * height and depth properties of an object against - * the same properties of this Box object. - * - * @param toCompare The box to compare to this Box object. - * @return A value of true if the object has exactly the same - * values for the x, y, z, - * width, height and depth - * properties as this Box object; otherwise false. - */ - Box.prototype.equals = function (toCompare) { - return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && this.width == toCompare.width && this.height == toCompare.height && this.depth == toCompare.depth); - }; - - /** - * Increases the size of the Box object by the specified amounts, in - * pixels. The center point of the Box object stays the same, and its - * size increases to the left and right by the dx value, to - * the top and the bottom by the dy value, and to - * the front and the back by the dz value. - * - * @param dx The value to be added to the left and the right of the Box - * object. The following equation is used to calculate the new - * width and position of the box: - * @param dy The value to be added to the top and the bottom of the Box - * object. The following equation is used to calculate the new - * height and position of the box: - * @param dz The value to be added to the front and the back of the Box - * object. The following equation is used to calculate the new - * depth and position of the box: - */ - Box.prototype.inflate = function (dx, dy, dz) { - this.x -= dx / 2; - this.y -= dy / 2; - this.z -= dz / 2; - this.width += dx / 2; - this.height += dy / 2; - this.depth += dz / 2; - }; - - /** - * Increases the size of the Box object. This method is similar to the - * Box.inflate() method except it takes a Vector3D object as - * a parameter. - * - *

The following two code examples give the same result:

- * - * @param delta The x property of this Vector3D object is used to - * increase the horizontal dimension of the Box object. - * The y property is used to increase the vertical - * dimension of the Box object. - * The z property is used to increase the - * longitudinal dimension of the Box object. - */ - Box.prototype.inflatePoint = function (delta) { - this.x -= delta.x / 2; - this.y -= delta.y / 2; - this.z -= delta.z / 2; - this.width += delta.x / 2; - this.height += delta.y / 2; - this.depth += delta.z / 2; - }; - - /** - * If the Box object specified in the toIntersect parameter - * intersects with this Box object, returns the area of intersection - * as a Box object. If the boxes do not intersect, this method returns an - * empty Box object with its properties set to 0. - * - * @param toIntersect The Box object to compare against to see if it - * intersects with this Box object. - * @return A Box object that equals the area of intersection. If the - * boxes do not intersect, this method returns an empty Box - * object; that is, a box with its x, y, - * z, width, height, and - * depth properties set to 0. - */ - Box.prototype.intersection = function (toIntersect) { - if (this.intersects(toIntersect)) { - var i = new Box(); - - if (this.x > toIntersect.x) { - i.x = this.x; - i.width = toIntersect.x - this.x + toIntersect.width; - - if (i.width > this.width) - i.width = this.width; - } else { - i.x = toIntersect.x; - i.width = this.x - toIntersect.x + this.width; - - if (i.width > toIntersect.width) - i.width = toIntersect.width; - } - - if (this.y > toIntersect.y) { - i.y = this.y; - i.height = toIntersect.y - this.y + toIntersect.height; - - if (i.height > this.height) - i.height = this.height; - } else { - i.y = toIntersect.y; - i.height = this.y - toIntersect.y + this.height; - - if (i.height > toIntersect.height) - i.height = toIntersect.height; - } - - if (this.z > toIntersect.z) { - i.z = this.z; - i.depth = toIntersect.z - this.z + toIntersect.depth; - - if (i.depth > this.depth) - i.depth = this.depth; - } else { - i.z = toIntersect.z; - i.depth = this.z - toIntersect.z + this.depth; - - if (i.depth > toIntersect.depth) - i.depth = toIntersect.depth; - } - - return i; - } - - return new Box(); - }; - - /** - * Determines whether the object specified in the toIntersect - * parameter intersects with this Box object. This method checks the - * x, y, z, width, - * height, and depth properties of the specified - * Box object to see if it intersects with this Box object. - * - * @param toIntersect The Box object to compare against this Box object. - * @return A value of true if the specified object intersects - * with this Box object; otherwise false. - */ - Box.prototype.intersects = function (toIntersect) { - return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height && this.z + this.depth > toIntersect.z && this.z < toIntersect.z + toIntersect.depth); - }; - - /** - * Determines whether or not this Box object is empty. - * - * @return A value of true if the Box object's width, height or - * depth is less than or equal to 0; otherwise false. - */ - Box.prototype.isEmpty = function () { - return (this.x == 0 && this.y == 0 && this.z == 0 && this.width == 0 && this.height == 0 && this.depth == 0); - }; - - /** - * Adjusts the location of the Box object, as determined by its - * top-left-front corner, by the specified amounts. - * - * @param dx Moves the x value of the Box object by this amount. - * @param dy Moves the y value of the Box object by this amount. - * @param dz Moves the z value of the Box object by this amount. - */ - Box.prototype.offset = function (dx, dy, dz) { - this.x += dx; - this.y += dy; - this.z += dz; - }; - - /** - * Adjusts the location of the Box object using a Vector3D object as a - * parameter. This method is similar to the Box.offset() - * method, except that it takes a Vector3D object as a parameter. - * - * @param position A Vector3D object to use to offset this Box object. - */ - Box.prototype.offsetPosition = function (position) { - this.x += position.x; - this.y += position.y; - this.z += position.z; - }; - - /** - * Sets all of the Box object's properties to 0. A Box object is empty if its - * width, height or depth is less than or equal to 0. - * - *

This method sets the values of the x, y, - * z, width, height, and - * depth properties to 0.

- * - */ - Box.prototype.setEmpty = function () { - this.x = 0; - this.y = 0; - this.z = 0; - this.width = 0; - this.height = 0; - this.depth = 0; - }; - - /** - * Sets the members of Box to the specified values - * - * @param xa The x coordinate of the top-left-front corner of the - * box. - * @param ya The y coordinate of the top-left-front corner of the - * box. - * @param yz The z coordinate of the top-left-front corner of the - * box. - * @param widtha The width of the box, in pixels. - * @param heighta The height of the box, in pixels. - * @param deptha The depth of the box, in pixels. - */ - Box.prototype.setTo = function (xa, ya, za, widtha, heighta, deptha) { - this.x = xa; - this.y = ya; - this.z = za; - this.width = widtha; - this.height = heighta; - this.depth = deptha; - }; - - /** - * Builds and returns a string that lists the horizontal, vertical and - * longitudinal positions and the width, height and depth of the Box object. - * - * @return A string listing the value of each of the following properties of - * the Box object: x, y, z, - * width, height, and depth. - */ - Box.prototype.toString = function () { - return "[Box] (x=" + this.x + ", y=" + this.y + ", z=" + this.z + ", width=" + this.width + ", height=" + this.height + ", depth=" + this.depth + ")"; - }; - - /** - * Adds two boxes together to create a new Box object, by filling - * in the horizontal, vertical and longitudinal space between the two boxes. - * - *

Note: The union() method ignores boxes with - * 0 as the height, width or depth value, such as: var - * box2:Box = new Box(300,300,300,50,50,0);

- * - * @param toUnion A Box object to add to this Box object. - * @return A new Box object that is the union of the two boxes. - */ - Box.prototype.union = function (toUnion) { - var u = new Box(); - - if (this.x < toUnion.x) { - u.x = this.x; - u.width = toUnion.x - this.x + toUnion.width; - - if (u.width < this.width) - u.width = this.width; - } else { - u.x = toUnion.x; - u.width = this.x - toUnion.x + this.width; - - if (u.width < toUnion.width) - u.width = toUnion.width; - } - - if (this.y < toUnion.y) { - u.y = this.y; - u.height = toUnion.y - this.y + toUnion.height; - - if (u.height < this.height) - u.height = this.height; - } else { - u.y = toUnion.y; - u.height = this.y - toUnion.y + this.height; - - if (u.height < toUnion.height) - u.height = toUnion.height; - } - - if (this.z < toUnion.z) { - u.z = this.z; - u.depth = toUnion.z - this.z + toUnion.depth; - - if (u.depth < this.depth) - u.depth = this.depth; - } else { - u.z = toUnion.z; - u.depth = this.z - toUnion.z + this.depth; - - if (u.depth < toUnion.depth) - u.depth = toUnion.depth; - } - - return u; - }; - return Box; - })(); - geom.Box = Box; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The ColorTransform class lets you adjust the color values in a display - * object. The color adjustment or color transformation can be applied - * to all four channels: red, green, blue, and alpha transparency. - * - *

When a ColorTransform object is applied to a display object, a new value - * for each color channel is calculated like this:

- * - *
    - *
  • New red value = (old red value * redMultiplier) + - * redOffset
  • - *
  • New green value = (old green value * greenMultiplier) + - * greenOffset
  • - *
  • New blue value = (old blue value * blueMultiplier) + - * blueOffset
  • - *
  • New alpha value = (old alpha value * alphaMultiplier) + - * alphaOffset
  • - *
- * - *

If any of the color channel values is greater than 255 after the - * calculation, it is set to 255. If it is less than 0, it is set to 0.

- * - *

You can use ColorTransform objects in the following ways:

- * - *
    - *
  • In the colorTransform parameter of the - * colorTransform() method of the BitmapData class
  • - *
  • As the colorTransform property of a Transform object - * (which can be used as the transform property of a display - * object)
  • - *
- * - *

You must use the new ColorTransform() constructor to create - * a ColorTransform object before you can call the methods of the - * ColorTransform object.

- * - *

Color transformations do not apply to the background color of a movie - * clip(such as a loaded SWF object). They apply only to graphics and symbols - * that are attached to the movie clip.

- */ - (function (geom) { - var ColorTransform = (function () { - /** - * Creates a ColorTransform object for a display object with the specified - * color channel values and alpha values. - * - * @param redMultiplier The value for the red multiplier, in the range from - * 0 to 1. - * @param greenMultiplier The value for the green multiplier, in the range - * from 0 to 1. - * @param blueMultiplier The value for the blue multiplier, in the range - * from 0 to 1. - * @param alphaMultiplier The value for the alpha transparency multiplier, in - * the range from 0 to 1. - * @param redOffset The offset value for the red color channel, in the - * range from -255 to 255. - * @param greenOffset The offset value for the green color channel, in - * the range from -255 to 255. - * @param blueOffset The offset for the blue color channel value, in the - * range from -255 to 255. - * @param alphaOffset The offset for alpha transparency channel value, in - * the range from -255 to 255. - */ - function ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier, redOffset, greenOffset, blueOffset, alphaOffset) { - if (typeof redMultiplier === "undefined") { redMultiplier = 1; } - if (typeof greenMultiplier === "undefined") { greenMultiplier = 1; } - if (typeof blueMultiplier === "undefined") { blueMultiplier = 1; } - if (typeof alphaMultiplier === "undefined") { alphaMultiplier = 1; } - if (typeof redOffset === "undefined") { redOffset = 0; } - if (typeof greenOffset === "undefined") { greenOffset = 0; } - if (typeof blueOffset === "undefined") { blueOffset = 0; } - if (typeof alphaOffset === "undefined") { alphaOffset = 0; } - this.redMultiplier = redMultiplier; - this.greenMultiplier = greenMultiplier; - this.blueMultiplier = blueMultiplier; - this.alphaMultiplier = alphaMultiplier; - this.redOffset = redOffset; - this.greenOffset = greenOffset; - this.blueOffset = blueOffset; - this.alphaOffset = alphaOffset; - } - Object.defineProperty(ColorTransform.prototype, "color", { - /** - * The RGB color value for a ColorTransform object. - * - *

When you set this property, it changes the three color offset values - * (redOffset, greenOffset, and - * blueOffset) accordingly, and it sets the three color - * multiplier values(redMultiplier, - * greenMultiplier, and blueMultiplier) to 0. The - * alpha transparency multiplier and offset values do not change.

- * - *

When you pass a value for this property, use the format - * 0xRRGGBB. RR, GG, and BB each consist of two - * hexadecimal digits that specify the offset of each color component. The 0x - * tells the ActionScript compiler that the number is a hexadecimal - * value.

- */ - get: function () { - return ((this.redOffset << 16) | (this.greenOffset << 8) | this.blueOffset); - }, - set: function (value) { - var argb = away.utils.ColorUtils.float32ColorToARGB(value); - - this.redOffset = argb[1]; //(value >> 16) & 0xFF; - this.greenOffset = argb[2]; //(value >> 8) & 0xFF; - this.blueOffset = argb[3]; //value & 0xFF; - - this.redMultiplier = 0; - this.greenMultiplier = 0; - this.blueMultiplier = 0; - }, - enumerable: true, - configurable: true - }); - - - /** - * Concatenates the ColorTranform object specified by the second - * parameter with the current ColorTransform object and sets the current - * object as the result, which is an additive combination of the two color - * transformations. When you apply the concatenated ColorTransform object, - * the effect is the same as applying the second color - * transformation after the original color transformation. - * - * @param second The ColorTransform object to be combined with the current - * ColorTransform object. - */ - ColorTransform.prototype.concat = function (second) { - this.redMultiplier += second.redMultiplier; - this.greenMultiplier += second.greenMultiplier; - this.blueMultiplier += second.blueMultiplier; - this.alphaMultiplier += second.alphaMultiplier; - }; - return ColorTransform; - })(); - geom.ColorTransform = ColorTransform; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (geom) { - /** - * MathConsts provides some commonly used mathematical constants - */ - var MathConsts = (function () { - function MathConsts() { - } - MathConsts.RADIANS_TO_DEGREES = 180 / Math.PI; - - MathConsts.DEGREES_TO_RADIANS = Math.PI / 180; - return MathConsts; - })(); - geom.MathConsts = MathConsts; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The Matrix class represents a transformation matrix that determines how to - * map points from one coordinate space to another. You can perform various - * graphical transformations on a display object by setting the properties of - * a Matrix object, applying that Matrix object to the matrix - * property of a Transform object, and then applying that Transform object as - * the transform property of the display object. These - * transformation functions include translation(x and y - * repositioning), rotation, scaling, and skewing. - * - *

Together these types of transformations are known as affine - * transformations. Affine transformations preserve the straightness of - * lines while transforming, so that parallel lines stay parallel.

- * - *

To apply a transformation matrix to a display object, you create a - * Transform object, set its matrix property to the - * transformation matrix, and then set the transform property of - * the display object to the Transform object. Matrix objects are also used as - * parameters of some methods, such as the following:

- * - *
    - *
  • The draw() method of a BitmapData object
  • - *
  • The beginBitmapFill() method, - * beginGradientFill() method, or - * lineGradientStyle() method of a Graphics object
  • - *
- * - *

A transformation matrix object is a 3 x 3 matrix with the following - * contents:

- * - *

In traditional transformation matrixes, the u, - * v, and w properties provide extra capabilities. - * The Matrix class can only operate in two-dimensional space, so it always - * assumes that the property values u and v are 0.0, - * and that the property value w is 1.0. The effective values of - * the matrix are as follows:

- * - *

You can get and set the values of all six of the other properties in a - * Matrix object: a, b, c, - * d, tx, and ty.

- * - *

The Matrix class supports the four major types of transformations: - * translation, scaling, rotation, and skewing. You can set three of these - * transformations by using specialized methods, as described in the following - * table:

- * - *

Each transformation function alters the current matrix properties so - * that you can effectively combine multiple transformations. To do this, you - * call more than one transformation function before applying the matrix to - * its display object target(by using the transform property of - * that display object).

- * - *

Use the new Matrix() constructor to create a Matrix object - * before you can call the methods of the Matrix object.

- */ - (function (geom) { - var Matrix = (function () { - /** - * Creates a new Matrix object with the specified parameters. In matrix - * notation, the properties are organized like this: - * - *

If you do not provide any parameters to the new Matrix() - * constructor, it creates an identity matrix with the following - * values:

- * - *

In matrix notation, the identity matrix looks like this:

- * - * @param a The value that affects the positioning of pixels along the - * x axis when scaling or rotating an image. - * @param b The value that affects the positioning of pixels along the - * y axis when rotating or skewing an image. - * @param c The value that affects the positioning of pixels along the - * x axis when rotating or skewing an image. - * @param d The value that affects the positioning of pixels along the - * y axis when scaling or rotating an image.. - * @param tx The distance by which to translate each point along the x - * axis. - * @param ty The distance by which to translate each point along the y - * axis. - */ - function Matrix(a, b, c, d, tx, ty) { - if (typeof a === "undefined") { a = 1; } - if (typeof b === "undefined") { b = 0; } - if (typeof c === "undefined") { c = 0; } - if (typeof d === "undefined") { d = 1; } - if (typeof tx === "undefined") { tx = 0; } - if (typeof ty === "undefined") { ty = 0; } - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.tx = tx; - this.ty = ty; - } - /** - * Returns a new Matrix object that is a clone of this matrix, with an exact - * copy of the contained object. - * - * @return A Matrix object. - */ - Matrix.prototype.clone = function () { - return new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty); - }; - - /** - * Concatenates a matrix with the current matrix, effectively combining the - * geometric effects of the two. In mathematical terms, concatenating two - * matrixes is the same as combining them using matrix multiplication. - * - *

For example, if matrix m1 scales an object by a factor of - * four, and matrix m2 rotates an object by 1.5707963267949 - * radians(Math.PI/2), then m1.concat(m2) - * transforms m1 into a matrix that scales an object by a factor - * of four and rotates the object by Math.PI/2 radians.

- * - *

This method replaces the source matrix with the concatenated matrix. If - * you want to concatenate two matrixes without altering either of the two - * source matrixes, first copy the source matrix by using the - * clone() method, as shown in the Class Examples section.

- * - * @param matrix The matrix to be concatenated to the source matrix. - */ - Matrix.prototype.concat = function (matrix) { - var a1 = this.a * matrix.a + this.b * matrix.c; - this.b = this.a * matrix.b + this.b * matrix.d; - this.a = a1; - - var c1 = this.c * matrix.a + this.d * matrix.c; - this.d = this.c * matrix.b + this.d * matrix.d; - - this.c = c1; - - var tx1 = this.tx * matrix.a + this.ty * matrix.c + matrix.tx; - this.ty = this.tx * matrix.b + this.ty * matrix.d + matrix.ty; - this.tx = tx1; - }; - - /** - * Copies a Vector3D object into specific column of the calling Matrix3D - * object. - * - * @param column The column from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - Matrix.prototype.copyColumnFrom = function (column, vector3D) { - if (column > 2) { - throw "Column " + column + " out of bounds (2)"; - } else if (column == 0) { - this.a = vector3D.x; - this.c = vector3D.y; - } else if (column == 1) { - this.b = vector3D.x; - this.d = vector3D.y; - } else { - this.tx = vector3D.x; - this.ty = vector3D.y; - } - }; - - /** - * Copies specific column of the calling Matrix object into the Vector3D - * object. The w element of the Vector3D object will not be changed. - * - * @param column The column from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - Matrix.prototype.copyColumnTo = function (column, vector3D) { - if (column > 2) { - throw new away.errors.ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 2]"); - } else if (column == 0) { - vector3D.x = this.a; - vector3D.y = this.c; - vector3D.z = 0; - } else if (column == 1) { - vector3D.x = this.b; - vector3D.y = this.d; - vector3D.z = 0; - } else { - vector3D.x = this.tx; - vector3D.y = this.ty; - vector3D.z = 1; - } - }; - - /** - * Copies all of the matrix data from the source Point object into the - * calling Matrix object. - * - * @param sourceMatrix The Matrix object from which to copy the data. - */ - Matrix.prototype.copyFrom = function (sourceMatrix) { - this.a = sourceMatrix.a; - this.b = sourceMatrix.b; - this.c = sourceMatrix.c; - this.d = sourceMatrix.d; - this.tx = sourceMatrix.tx; - this.ty = sourceMatrix.ty; - }; - - /** - * Copies a Vector3D object into specific row of the calling Matrix object. - * - * @param row The row from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - Matrix.prototype.copyRowFrom = function (row, vector3D) { - if (row > 2) { - throw new away.errors.ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); - } else if (row == 0) { - this.a = vector3D.x; - this.c = vector3D.y; - } else if (row == 1) { - this.b = vector3D.x; - this.d = vector3D.y; - } else { - this.tx = vector3D.x; - this.ty = vector3D.y; - } - }; - - /** - * Copies specific row of the calling Matrix object into the Vector3D object. - * The w element of the Vector3D object will not be changed. - * - * @param row The row from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - Matrix.prototype.copyRowTo = function (row, vector3D) { - if (row > 2) { - throw new away.errors.ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); - } else if (row == 0) { - vector3D.x = this.a; - vector3D.y = this.b; - vector3D.z = this.tx; - } else if (row == 1) { - vector3D.x = this.c; - vector3D.y = this.d; - vector3D.z = this.ty; - } else { - vector3D.setTo(0, 0, 1); - } - }; - - /** - * Includes parameters for scaling, rotation, and translation. When applied - * to a matrix it sets the matrix's values based on those parameters. - * - *

Using the createBox() method lets you obtain the same - * matrix as you would if you applied the identity(), - * rotate(), scale(), and translate() - * methods in succession. For example, mat1.createBox(2,2,Math.PI/4, - * 100, 100) has the same effect as the following:

- * - * @param scaleX The factor by which to scale horizontally. - * @param scaleY The factor by which scale vertically. - * @param rotation The amount to rotate, in radians. - * @param tx The number of pixels to translate(move) to the right - * along the x axis. - * @param ty The number of pixels to translate(move) down along the - * y axis. - */ - Matrix.prototype.createBox = function (scaleX, scaleY, rotation, tx, ty) { - if (typeof rotation === "undefined") { rotation = 0; } - if (typeof tx === "undefined") { tx = 0; } - if (typeof ty === "undefined") { ty = 0; } - this.a = scaleX; - this.d = scaleY; - this.b = rotation; - this.tx = tx; - this.ty = ty; - }; - - /** - * Creates the specific style of matrix expected by the - * beginGradientFill() and lineGradientStyle() - * methods of the Graphics class. Width and height are scaled to a - * scaleX/scaleY pair and the - * tx/ty values are offset by half the width and - * height. - * - *

For example, consider a gradient with the following - * characteristics:

- * - *
    - *
  • GradientType.LINEAR
  • - *
  • Two colors, green and blue, with the ratios array set to [0, - * 255]
  • - *
  • SpreadMethod.PAD
  • - *
  • InterpolationMethod.LINEAR_RGB
  • - *
- * - *

The following illustrations show gradients in which the matrix was - * defined using the createGradientBox() method with different - * parameter settings:

- * - * @param width The width of the gradient box. - * @param height The height of the gradient box. - * @param rotation The amount to rotate, in radians. - * @param tx The distance, in pixels, to translate to the right along - * the x axis. This value is offset by half of the - * width parameter. - * @param ty The distance, in pixels, to translate down along the - * y axis. This value is offset by half of the - * height parameter. - */ - Matrix.prototype.createGradientBox = function (width, height, rotation, tx, ty) { - if (typeof rotation === "undefined") { rotation = 0; } - if (typeof tx === "undefined") { tx = 0; } - if (typeof ty === "undefined") { ty = 0; } - this.a = width / 1638.4; - this.d = height / 1638.4; - - if (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 = this.c = 0; - } - - this.tx = tx + width / 2; - this.ty = ty + height / 2; - }; - - /** - * Given a point in the pretransform coordinate space, returns the - * coordinates of that point after the transformation occurs. Unlike the - * standard transformation applied using the transformPoint() - * method, the deltaTransformPoint() method's transformation - * does not consider the translation parameters tx and - * ty. - * - * @param point The point for which you want to get the result of the matrix - * transformation. - * @return The point resulting from applying the matrix transformation. - */ - Matrix.prototype.deltaTransformPoint = function (point) { - return new away.geom.Point(point.x * this.a + point.y * this.c, point.x * this.b + point.y * this.d); - }; - - /** - * Sets each matrix property to a value that causes a null transformation. An - * object transformed by applying an identity matrix will be identical to the - * original. - * - *

After calling the identity() method, the resulting matrix - * has the following properties: a=1, b=0, - * c=0, d=1, tx=0, - * ty=0.

- * - *

In matrix notation, the identity matrix looks like this:

- * - */ - Matrix.prototype.identity = function () { - this.a = 1; - this.b = 0; - this.c = 0; - this.d = 1; - this.tx = 0; - this.ty = 0; - }; - - /** - * Performs the opposite transformation of the original matrix. You can apply - * an inverted matrix to an object to undo the transformation performed when - * applying the original matrix. - */ - Matrix.prototype.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.tx = -this.tx; - this.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.ty = -this.b * this.tx - this.d * this.ty; - this.tx = tx1; - } - }; - - /** - * Returns a new Matrix object that is a clone of this matrix, with an exact - * copy of the contained object. - * - * @param matrix The matrix for which you want to get the result of the matrix - * transformation. - * @return A Matrix object. - */ - Matrix.prototype.multiply = function (matrix) { - var result = new Matrix(); - - result.a = this.a * matrix.a + this.b * matrix.c; - result.b = this.a * matrix.b + this.b * matrix.d; - result.c = this.c * matrix.a + this.d * matrix.c; - result.d = this.c * matrix.b + this.d * matrix.d; - - result.tx = this.tx * matrix.a + this.ty * matrix.c + matrix.tx; - result.ty = this.tx * matrix.b + this.ty * matrix.d + matrix.ty; - - return result; - }; - - /** - * Applies a rotation transformation to the Matrix object. - * - *

The rotate() method alters the a, - * b, c, and d properties of the - * Matrix object. In matrix notation, this is the same as concatenating the - * current matrix with the following:

- * - * @param angle The rotation angle in radians. - */ - Matrix.prototype.rotate = function (angle) { - var cos = Math.cos(angle); - var sin = Math.sin(angle); - - 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.ty = this.tx * sin + this.ty * cos; - this.tx = tx1; - }; - - /** - * Applies a scaling transformation to the matrix. The x axis is - * multiplied by sx, and the y axis it is multiplied by - * sy. - * - *

The scale() method alters the a and - * d properties of the Matrix object. In matrix notation, this - * is the same as concatenating the current matrix with the following - * matrix:

- * - * @param sx A multiplier used to scale the object along the x axis. - * @param sy A multiplier used to scale the object along the y axis. - */ - Matrix.prototype.scale = function (sx, sy) { - this.a *= sx; - this.b *= sy; - - this.c *= sx; - this.d *= sy; - - this.tx *= sx; - this.ty *= sy; - }; - - /** - * Sets the members of Matrix to the specified values. - * - * @param a The value that affects the positioning of pixels along the - * x axis when scaling or rotating an image. - * @param b The value that affects the positioning of pixels along the - * y axis when rotating or skewing an image. - * @param c The value that affects the positioning of pixels along the - * x axis when rotating or skewing an image. - * @param d The value that affects the positioning of pixels along the - * y axis when scaling or rotating an image.. - * @param tx The distance by which to translate each point along the x - * axis. - * @param ty The distance by which to translate each point along the y - * axis. - */ - Matrix.prototype.setTo = function (a, b, c, d, tx, ty) { - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.tx = tx; - this.ty = ty; - }; - - /** - * Returns a text value listing the properties of the Matrix object. - * - * @return A string containing the values of the properties of the Matrix - * object: a, b, c, - * d, tx, and ty. - */ - Matrix.prototype.toString = function () { - return "[Matrix] (a=" + this.a + ", b=" + this.b + ", c=" + this.c + ", d=" + this.d + ", tx=" + this.tx + ", ty=" + this.ty + ")"; - }; - - /** - * Returns the result of applying the geometric transformation represented by - * the Matrix object to the specified point. - * - * @param point The point for which you want to get the result of the Matrix - * transformation. - * @return The point resulting from applying the Matrix transformation. - */ - Matrix.prototype.transformPoint = function (point) { - return new away.geom.Point(point.x * this.a + point.y * this.c + this.tx, point.x * this.b + point.y * this.d + this.ty); - }; - - /** - * Translates the matrix along the x and y axes, as specified - * by the dx and dy parameters. - * - * @param dx The amount of movement along the x axis to the right, in - * pixels. - * @param dy The amount of movement down along the y axis, in pixels. - */ - Matrix.prototype.translate = function (dx, dy) { - this.tx += dx; - this.ty += dy; - }; - return Matrix; - })(); - geom.Matrix = Matrix; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (geom) { - var Matrix3D = (function () { - /** - * Creates a Matrix3D object. - */ - function Matrix3D(v) { - if (typeof v === "undefined") { v = null; } - if (v != null && v.length == 16) - this.rawData = v.concat(); - else - this.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; - } - /** - * Appends the matrix by multiplying another Matrix3D object by the current Matrix3D object. - */ - Matrix3D.prototype.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; - }; - - /** - * Appends an incremental rotation to a Matrix3D object. - */ - Matrix3D.prototype.appendRotation = function (degrees, axis) { - var m = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); - - this.append(m); - }; - - /** - * Appends an incremental scale change along the x, y, and z axes to a Matrix3D object. - */ - Matrix3D.prototype.appendScale = function (xScale, yScale, zScale) { - this.append(new 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])); - }; - - /** - * Appends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. - */ - Matrix3D.prototype.appendTranslation = function (x, y, z) { - this.rawData[12] += x; - this.rawData[13] += y; - this.rawData[14] += z; - }; - - /** - * Returns a new Matrix3D object that is an exact copy of the current Matrix3D object. - */ - Matrix3D.prototype.clone = function () { - return new Matrix3D(this.rawData.slice(0)); - }; - - /** - * Copies a Vector3D object into specific column of the calling Matrix3D object. - */ - Matrix3D.prototype.copyColumnFrom = function (column, vector3D) { - switch (column) { - case 0: - this.rawData[0] = vector3D.x; - this.rawData[1] = vector3D.y; - this.rawData[2] = vector3D.z; - this.rawData[3] = vector3D.w; - break; - case 1: - this.rawData[4] = vector3D.x; - this.rawData[5] = vector3D.y; - this.rawData[6] = vector3D.z; - this.rawData[7] = vector3D.w; - break; - case 2: - this.rawData[8] = vector3D.x; - this.rawData[9] = vector3D.y; - this.rawData[10] = vector3D.z; - this.rawData[11] = vector3D.w; - break; - case 3: - this.rawData[12] = vector3D.x; - this.rawData[13] = vector3D.y; - this.rawData[14] = vector3D.z; - this.rawData[15] = vector3D.w; - break; - default: - throw new away.errors.ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); - } - }; - - /** - * Copies specific column of the calling Matrix3D object into the Vector3D object. - */ - Matrix3D.prototype.copyColumnTo = function (column, vector3D) { - switch (column) { - case 0: - vector3D.x = this.rawData[0]; - vector3D.y = this.rawData[1]; - vector3D.z = this.rawData[2]; - vector3D.w = this.rawData[3]; - break; - case 1: - vector3D.x = this.rawData[4]; - vector3D.y = this.rawData[5]; - vector3D.z = this.rawData[6]; - vector3D.w = this.rawData[7]; - break; - case 2: - vector3D.x = this.rawData[8]; - vector3D.y = this.rawData[9]; - vector3D.z = this.rawData[10]; - vector3D.w = this.rawData[11]; - break; - case 3: - vector3D.x = this.rawData[12]; - vector3D.y = this.rawData[13]; - vector3D.z = this.rawData[14]; - vector3D.w = this.rawData[15]; - break; - default: - throw new away.errors.ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); - } - }; - - /** - * Copies all of the matrix data from the source Matrix3D object into the calling Matrix3D object. - */ - Matrix3D.prototype.copyFrom = function (sourceMatrix3D) { - var len = sourceMatrix3D.rawData.length; - for (var c = 0; c < len; c++) - this.rawData[c] = sourceMatrix3D.rawData[c]; - }; - - Matrix3D.prototype.copyRawDataFrom = function (vector, index, transpose) { - if (typeof index === "undefined") { index = 0; } - if (typeof transpose === "undefined") { transpose = false; } - if (transpose) - this.transpose(); - - var len = vector.length - index; - for (var c = 0; c < len; c++) - this.rawData[c] = vector[c + index]; - - if (transpose) - this.transpose(); - }; - - Matrix3D.prototype.copyRawDataTo = function (vector, index, transpose) { - if (typeof index === "undefined") { index = 0; } - if (typeof transpose === "undefined") { transpose = false; } - if (transpose) - this.transpose(); - - var len = this.rawData.length; - for (var c = 0; c < len; c++) - vector[c + index] = this.rawData[c]; - - if (transpose) - this.transpose(); - }; - - /** - * Copies a Vector3D object into specific row of the calling Matrix3D object. - */ - Matrix3D.prototype.copyRowFrom = function (row, vector3D) { - switch (row) { - case 0: - this.rawData[0] = vector3D.x; - this.rawData[4] = vector3D.y; - this.rawData[8] = vector3D.z; - this.rawData[12] = vector3D.w; - break; - case 1: - this.rawData[1] = vector3D.x; - this.rawData[5] = vector3D.y; - this.rawData[9] = vector3D.z; - this.rawData[13] = vector3D.w; - break; - case 2: - this.rawData[2] = vector3D.x; - this.rawData[6] = vector3D.y; - this.rawData[10] = vector3D.z; - this.rawData[14] = vector3D.w; - break; - case 3: - this.rawData[3] = vector3D.x; - this.rawData[7] = vector3D.y; - this.rawData[11] = vector3D.z; - this.rawData[15] = vector3D.w; - break; - default: - throw new away.errors.ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); - } - }; - - /** - * Copies specific row of the calling Matrix3D object into the Vector3D object. - */ - Matrix3D.prototype.copyRowTo = function (row, vector3D) { - switch (row) { - case 0: - vector3D.x = this.rawData[0]; - vector3D.y = this.rawData[4]; - vector3D.z = this.rawData[8]; - vector3D.w = this.rawData[12]; - break; - case 1: - vector3D.x = this.rawData[1]; - vector3D.y = this.rawData[5]; - vector3D.z = this.rawData[9]; - vector3D.w = this.rawData[13]; - break; - case 2: - vector3D.x = this.rawData[2]; - vector3D.y = this.rawData[6]; - vector3D.z = this.rawData[10]; - vector3D.w = this.rawData[14]; - break; - case 3: - vector3D.x = this.rawData[3]; - vector3D.y = this.rawData[7]; - vector3D.z = this.rawData[11]; - vector3D.w = this.rawData[15]; - break; - default: - throw new away.errors.ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); - } - }; - - /** - * Copies this Matrix3D object into a destination Matrix3D object. - */ - Matrix3D.prototype.copyToMatrix3D = function (dest) { - dest.rawData = this.rawData.slice(0); - }; - - /** - * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector3D objects. - */ - Matrix3D.prototype.decompose = function (orientationStyle) { - if (typeof orientationStyle === "undefined") { orientationStyle = "eulerAngles"; } - var q; - - // Initial Tests - Not OK - var vec = []; - var m = this.clone(); - var mr = m.rawData; - - var pos = new geom.Vector3D(mr[12], mr[13], mr[14]); - mr[12] = 0; - mr[13] = 0; - mr[14] = 0; - - var scale = new 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 geom.Vector3D(); - - switch (orientationStyle) { - case geom.Orientation3D.AXIS_ANGLE: - rot.w = Math.acos((mr[0] + mr[5] + mr[10] - 1) / 2); - - var len = Math.sqrt((mr[6] - mr[9]) * (mr[6] - mr[9]) + (mr[8] - mr[2]) * (mr[8] - mr[2]) + (mr[1] - mr[4]) * (mr[1] - mr[4])); - rot.x = (mr[6] - mr[9]) / len; - rot.y = (mr[8] - mr[2]) / len; - rot.z = (mr[1] - mr[4]) / len; - - break; - case geom.Orientation3D.QUATERNION: - var tr = mr[0] + mr[5] + mr[10]; - - if (tr > 0) { - rot.w = Math.sqrt(1 + tr) / 2; - - rot.x = (mr[6] - mr[9]) / (4 * rot.w); - rot.y = (mr[8] - mr[2]) / (4 * rot.w); - rot.z = (mr[1] - mr[4]) / (4 * rot.w); - } else if ((mr[0] > mr[5]) && (mr[0] > mr[10])) { - rot.x = Math.sqrt(1 + mr[0] - mr[5] - mr[10]) / 2; - - rot.w = (mr[6] - mr[9]) / (4 * rot.x); - rot.y = (mr[1] + mr[4]) / (4 * rot.x); - rot.z = (mr[8] + mr[2]) / (4 * rot.x); - } else if (mr[5] > mr[10]) { - rot.y = Math.sqrt(1 + mr[5] - mr[0] - mr[10]) / 2; - - rot.x = (mr[1] + mr[4]) / (4 * rot.y); - rot.w = (mr[8] - mr[2]) / (4 * rot.y); - rot.z = (mr[6] + mr[9]) / (4 * rot.y); - } else { - rot.z = Math.sqrt(1 + mr[10] - mr[0] - mr[5]) / 2; - - rot.x = (mr[8] + mr[2]) / (4 * rot.z); - rot.y = (mr[6] + mr[9]) / (4 * rot.z); - rot.w = (mr[1] - mr[4]) / (4 * rot.z); - } - - break; - case geom.Orientation3D.EULER_ANGLES: - rot.y = Math.asin(-mr[2]); - - //var cos:number = Math.cos(rot.y); - if (mr[2] != 1 && mr[2] != -1) { - 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]); - } - - break; - } - - vec.push(pos); - vec.push(rot); - vec.push(scale); - - return vec; - }; - - /** - * Uses the transformation matrix without its translation elements to transform a Vector3D object from one space - * coordinate to another. - */ - Matrix3D.prototype.deltaTransformVector = function (v) { - var x = v.x; - var y = v.y; - var z = v.z; - - return new away.geom.Vector3D((x * this.rawData[0] + y * this.rawData[4] + z * this.rawData[8]), (x * this.rawData[1] + y * this.rawData[5] + z * this.rawData[9]), (x * this.rawData[2] + y * this.rawData[6] + z * this.rawData[10]), (x * this.rawData[3] + y * this.rawData[7] + z * this.rawData[11])); - }; - - /** - * Converts the current matrix to an identity or unit matrix. - */ - Matrix3D.prototype.identity = function () { - this.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; - }; - - /** - * [static] Interpolates the translation, rotation, and scale transformation of one matrix toward those of the target matrix. - */ - Matrix3D.interpolate = function (thisMat, toMat, percent) { - var m = new Matrix3D(); - for (var i = 0; i < 16; ++i) - m.rawData[i] = thisMat.rawData[i] + (toMat.rawData[i] - thisMat.rawData[i]) * percent; - - return m; - }; - - /** - * Interpolates this matrix towards the translation, rotation, and scale transformations of the target matrix. - */ - Matrix3D.prototype.interpolateTo = function (toMat, percent) { - for (var i = 0; i < 16; ++i) - this.rawData[i] = this.rawData[i] + (toMat.rawData[i] - this.rawData[i]) * percent; - }; - - /** - * Inverts the current matrix. - */ - Matrix3D.prototype.invert = function () { - var d = this.determinant; - 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 invertable; - }; - - /* TODO implement pointAt - public pointAt( pos:Vector3D, at:Vector3D = null, up:Vector3D = null ) - { - } - */ - /** - * Prepends a matrix by multiplying the current Matrix3D object by another Matrix3D object. - */ - Matrix3D.prototype.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; - }; - - /** - * Prepends an incremental rotation to a Matrix3D object. - */ - Matrix3D.prototype.prependRotation = function (degrees, axis) { - var m = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); - - /* - if ( pivot != null ) - { - var p:Vector3D = pivot; - m.appendTranslation( p.x, p.y, p.z ); - } - */ - this.prepend(m); - }; - - /** - * Prepends an incremental scale change along the x, y, and z axes to a Matrix3D object. - */ - Matrix3D.prototype.prependScale = function (xScale, yScale, zScale) { - // Initial Tests - OK - this.prepend(new Matrix3D([xScale, 0, 0, 0, 0, yScale, 0, 0, 0, 0, zScale, 0, 0, 0, 0, 1])); - }; - - /** - * Prepends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. - */ - Matrix3D.prototype.prependTranslation = function (x, y, z) { - // Initial Tests - OK - var m = new Matrix3D(); - m.position = new geom.Vector3D(x, y, z); - this.prepend(m); - }; - - // TODO orientationStyle - /** - * Sets the transformation matrix's translation, rotation, and scale settings. - */ - Matrix3D.prototype.recompose = function (components) { - // Initial Tests - OK - if (components.length < 3) - return false; - - //components[2].x == 0 || components[2].y == 0 || components[2].z == 0) return false; - this.identity(); - this.appendScale(components[2].x, components[2].y, components[2].z); - - var angle; - angle = -components[1].x; - this.append(new 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 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 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.position = components[0]; - this.rawData[15] = 1; - - return true; - }; - - Matrix3D.prototype.transformVector = function (v) { - var x = v.x; - var y = v.y; - var z = v.z; - - return new away.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]), (x * this.rawData[3] + y * this.rawData[7] + z * this.rawData[11] + this.rawData[15])); - }; - - /** - * Uses the transformation matrix to transform a Vector of Numbers from one coordinate space to another. - */ - Matrix3D.prototype.transformVectors = function (vin, vout) { - // Initial Tests - OK - var i = 0; - var x = 0, y = 0, z = 0; - - while (i + 3 <= vin.length) { - 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; - } - }; - - /** - * Converts the current Matrix3D object to a matrix where the rows and columns are swapped. - */ - Matrix3D.prototype.transpose = function () { - // Initial Tests - OK - var oRawData = this.rawData.slice(0); - - 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]; - }; - - Matrix3D.getAxisRotation = function (x, y, z, degrees) { - // internal class use by rotations which have been tested - var m = new Matrix3D(); - - var rad = degrees * (Math.PI / 180); - var c = Math.cos(rad); - var s = Math.sin(rad); - var t = 1 - c; - var tmp1, tmp2; - - m.rawData[0] = c + x * x * t; - m.rawData[5] = c + y * y * t; - m.rawData[10] = c + z * z * t; - - tmp1 = x * y * t; - tmp2 = z * s; - m.rawData[1] = tmp1 + tmp2; - m.rawData[4] = tmp1 - tmp2; - tmp1 = x * z * t; - tmp2 = y * s; - m.rawData[8] = tmp1 + tmp2; - m.rawData[2] = tmp1 - tmp2; - tmp1 = y * z * t; - tmp2 = x * s; - m.rawData[9] = tmp1 - tmp2; - m.rawData[6] = tmp1 + tmp2; - - return m; - }; - - Object.defineProperty(Matrix3D.prototype, "determinant", { - /** - * [read-only] A Number that determines whether a matrix is invertible. - */ - get: function () { - return ((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])); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Matrix3D.prototype, "position", { - /** - * A Vector3D object that holds the position, the 3D coordinate (x,y,z) of a display object within the - * transformation's frame of reference. - */ - get: function () { - return new geom.Vector3D(this.rawData[12], this.rawData[13], this.rawData[14]); - }, - set: function (value) { - this.rawData[12] = value.x; - this.rawData[13] = value.y; - this.rawData[14] = value.z; - }, - enumerable: true, - configurable: true - }); - - - Matrix3D.prototype.toFixed = function (decimalPlace) { - var magnitude = Math.pow(10, decimalPlace); - return "matrix3d(" + Math.round(this.rawData[0] * magnitude) / magnitude + "," + Math.round(this.rawData[1] * magnitude) / magnitude + "," + Math.round(this.rawData[2] * magnitude) / magnitude + "," + Math.round(this.rawData[3] * magnitude) / magnitude + "," + Math.round(this.rawData[4] * magnitude) / magnitude + "," + Math.round(this.rawData[5] * magnitude) / magnitude + "," + Math.round(this.rawData[6] * magnitude) / magnitude + "," + Math.round(this.rawData[7] * magnitude) / magnitude + "," + Math.round(this.rawData[8] * magnitude) / magnitude + "," + Math.round(this.rawData[9] * magnitude) / magnitude + "," + Math.round(this.rawData[10] * magnitude) / magnitude + "," + Math.round(this.rawData[11] * magnitude) / magnitude + "," + Math.round(this.rawData[12] * magnitude) / magnitude + "," + Math.round(this.rawData[13] * magnitude) / magnitude + "," + Math.round(this.rawData[14] * magnitude) / magnitude + "," + Math.round(this.rawData[15] * magnitude) / magnitude + ")"; - }; - - Matrix3D.prototype.toString = function () { - return "matrix3d(" + Math.round(this.rawData[0] * 1000) / 1000 + "," + Math.round(this.rawData[1] * 1000) / 1000 + "," + Math.round(this.rawData[2] * 1000) / 1000 + "," + Math.round(this.rawData[3] * 1000) / 1000 + "," + Math.round(this.rawData[4] * 1000) / 1000 + "," + Math.round(this.rawData[5] * 1000) / 1000 + "," + Math.round(this.rawData[6] * 1000) / 1000 + "," + Math.round(this.rawData[7] * 1000) / 1000 + "," + Math.round(this.rawData[8] * 1000) / 1000 + "," + Math.round(this.rawData[9] * 1000) / 1000 + "," + Math.round(this.rawData[10] * 1000) / 1000 + "," + Math.round(this.rawData[11] * 1000) / 1000 + "," + Math.round(this.rawData[12] * 1000) / 1000 + "," + Math.round(this.rawData[13] * 1000) / 1000 + "," + Math.round(this.rawData[14] * 1000) / 1000 + "," + Math.round(this.rawData[15] * 1000) / 1000 + ")"; - }; - return Matrix3D; - })(); - geom.Matrix3D = Matrix3D; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (geom) { - //import flash.geom.*; - /** - * away.geom.Matrix3DUtils provides additional Matrix3D functions. - */ - var Matrix3DUtils = (function () { - function Matrix3DUtils() { - } - /** - * Fills the 3d matrix object with values representing the transformation made by the given quaternion. - * - * @param quarternion The quarterion object to convert. - */ - Matrix3DUtils.quaternion2matrix = function (quarternion, m) { - if (typeof m === "undefined") { m = null; } - var x = quarternion.x; - var y = quarternion.y; - var z = quarternion.z; - var w = quarternion.w; - - var xx = x * x; - var xy = x * y; - var xz = x * z; - var xw = x * w; - - var yy = y * y; - var yz = y * z; - var yw = y * w; - - var zz = z * z; - var zw = z * w; - - var raw = Matrix3DUtils.RAW_DATA_CONTAINER; - raw[0] = 1 - 2 * (yy + zz); - raw[1] = 2 * (xy + zw); - raw[2] = 2 * (xz - yw); - raw[4] = 2 * (xy - zw); - raw[5] = 1 - 2 * (xx + zz); - raw[6] = 2 * (yz + xw); - raw[8] = 2 * (xz + yw); - raw[9] = 2 * (yz - xw); - raw[10] = 1 - 2 * (xx + yy); - raw[3] = raw[7] = raw[11] = raw[12] = raw[13] = raw[14] = 0; - raw[15] = 1; - - if (m) { - m.copyRawDataFrom(raw); - return m; - } else - return new geom.Matrix3D(raw); - }; - - /** - * Returns a normalised Vector3D object representing the forward vector of the given matrix. - * @param m The Matrix3D object to use to get the forward vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The forward vector - */ - Matrix3DUtils.getForward = function (m, v) { - if (typeof v === "undefined") { v = null; } - //v ||= new Vector3D(0.0, 0.0, 0.0); - if (v === null) { - v = new geom.Vector3D(0.0, 0.0, 0.0); - } - - m.copyColumnTo(2, v); - v.normalize(); - - return v; - }; - - /** - * Returns a normalised Vector3D object representing the up vector of the given matrix. - * @param m The Matrix3D object to use to get the up vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The up vector - */ - Matrix3DUtils.getUp = function (m, v) { - //v ||= new Vector3D(0.0, 0.0, 0.0); - if (typeof v === "undefined") { v = null; } - if (v === null) { - v = new geom.Vector3D(0.0, 0.0, 0.0); - } - - m.copyColumnTo(1, v); - v.normalize(); - - return v; - }; - - /** - * Returns a normalised Vector3D object representing the right vector of the given matrix. - * @param m The Matrix3D object to use to get the right vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The right vector - */ - Matrix3DUtils.getRight = function (m, v) { - if (typeof v === "undefined") { v = null; } - //v ||= new Vector3D(0.0, 0.0, 0.0); - if (v === null) { - v = new geom.Vector3D(0.0, 0.0, 0.0); - } - - m.copyColumnTo(0, v); - v.normalize(); - - return v; - }; - - /** - * Returns a boolean value representing whether there is any significant difference between the two given 3d matrices. - */ - Matrix3DUtils.compare = function (m1, m2) { - var r1 = Matrix3DUtils.RAW_DATA_CONTAINER; - var r2 = m2.rawData; - m1.copyRawDataTo(r1); - - for (var i = 0; i < 16; ++i) { - if (r1[i] != r2[i]) - return false; - } - - return true; - }; - - Matrix3DUtils.lookAt = function (matrix, pos, dir, up) { - var dirN; - var upN; - var lftN; - var raw = Matrix3DUtils.RAW_DATA_CONTAINER; - - lftN = dir.crossProduct(up); - lftN.normalize(); - - upN = lftN.crossProduct(dir); - upN.normalize(); - dirN = dir.clone(); - dirN.normalize(); - - raw[0] = lftN.x; - raw[1] = upN.x; - raw[2] = -dirN.x; - raw[3] = 0.0; - - raw[4] = lftN.y; - raw[5] = upN.y; - raw[6] = -dirN.y; - raw[7] = 0.0; - - raw[8] = lftN.z; - raw[9] = upN.z; - raw[10] = -dirN.z; - raw[11] = 0.0; - - raw[12] = -lftN.dotProduct(pos); - raw[13] = -upN.dotProduct(pos); - raw[14] = dirN.dotProduct(pos); - raw[15] = 1.0; - - matrix.copyRawDataFrom(raw); - }; - - Matrix3DUtils.reflection = function (plane, target) { - if (typeof target === "undefined") { target = null; } - if (target === null) - target = new geom.Matrix3D(); - - var a = plane.a, b = plane.b, c = plane.c, d = plane.d; - var rawData = Matrix3DUtils.RAW_DATA_CONTAINER; - var ab2 = -2 * a * b; - var ac2 = -2 * a * c; - var bc2 = -2 * b * c; - - // reflection matrix - rawData[0] = 1 - 2 * a * a; - rawData[4] = ab2; - rawData[8] = ac2; - rawData[12] = -2 * a * d; - rawData[1] = ab2; - rawData[5] = 1 - 2 * b * b; - rawData[9] = bc2; - rawData[13] = -2 * b * d; - rawData[2] = ac2; - rawData[6] = bc2; - rawData[10] = 1 - 2 * c * c; - rawData[14] = -2 * c * d; - rawData[3] = 0; - rawData[7] = 0; - rawData[11] = 0; - rawData[15] = 1; - target.copyRawDataFrom(rawData); - - return target; - }; - - Matrix3DUtils.transformVector = function (matrix, vector, result) { - if (typeof result === "undefined") { result = null; } - if (!result) - result = new geom.Vector3D(); - - var raw = Matrix3DUtils.RAW_DATA_CONTAINER; - matrix.copyRawDataTo(raw); - var a = raw[0]; - var e = raw[1]; - var i = raw[2]; - var m = raw[3]; - var b = raw[4]; - var f = raw[5]; - var j = raw[6]; - var n = raw[7]; - var c = raw[8]; - var g = raw[9]; - var k = raw[10]; - var o = raw[11]; - var d = raw[12]; - var h = raw[13]; - var l = raw[14]; - var p = raw[15]; - - var x = vector.x; - var y = vector.y; - var z = vector.z; - result.x = a * x + b * y + c * z + d; - result.y = e * x + f * y + g * z + h; - result.z = i * x + j * y + k * z + l; - result.w = m * x + n * y + o * z + p; - return result; - }; - - Matrix3DUtils.deltaTransformVector = function (matrix, vector, result) { - if (typeof result === "undefined") { result = null; } - if (!result) - result = new geom.Vector3D(); - - var raw = Matrix3DUtils.RAW_DATA_CONTAINER; - matrix.copyRawDataTo(raw); - var a = raw[0]; - var e = raw[1]; - var i = raw[2]; - var m = raw[3]; - var b = raw[4]; - var f = raw[5]; - var j = raw[6]; - var n = raw[7]; - var c = raw[8]; - var g = raw[9]; - var k = raw[10]; - var o = raw[11]; - var x = vector.x; - var y = vector.y; - var z = vector.z; - result.x = a * x + b * y + c * z; - result.y = e * x + f * y + g * z; - result.z = i * x + j * y + k * z; - result.w = m * x + n * y + o * z; - return result; - }; - - Matrix3DUtils.getTranslation = function (transform, result) { - if (typeof result === "undefined") { result = null; } - if (!result) - result = new geom.Vector3D(); - - transform.copyColumnTo(3, result); - return result; - }; - - Matrix3DUtils.deltaTransformVectors = function (matrix, vin, vout) { - var raw = Matrix3DUtils.RAW_DATA_CONTAINER; - matrix.copyRawDataTo(raw); - var a = raw[0]; - var e = raw[1]; - var i = raw[2]; - var m = raw[3]; - var b = raw[4]; - var f = raw[5]; - var j = raw[6]; - var n = raw[7]; - var c = raw[8]; - var g = raw[9]; - var k = raw[10]; - var o = raw[11]; - var outIndex = 0; - var length = vin.length; - for (var index = 0; index < length; index += 3) { - var x = vin[index]; - var y = vin[index + 1]; - var z = vin[index + 2]; - vout[outIndex++] = a * x + b * y + c * z; - vout[outIndex++] = e * x + f * y + g * z; - vout[outIndex++] = i * x + j * y + k * z; - } - }; - Matrix3DUtils.RAW_DATA_CONTAINER = new Array(16); - - Matrix3DUtils.CALCULATION_MATRIX = new geom.Matrix3D(); - return Matrix3DUtils; - })(); - geom.Matrix3DUtils = Matrix3DUtils; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (geom) { - /** - * A Quaternion object which can be used to represent rotations. - */ - var Orientation3D = (function () { - function Orientation3D() { - } - Orientation3D.AXIS_ANGLE = "axisAngle"; - Orientation3D.EULER_ANGLES = "eulerAngles"; - Orientation3D.QUATERNION = "quaternion"; - return Orientation3D; - })(); - geom.Orientation3D = Orientation3D; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - *

The PerspectiveProjection class provides an easy way to assign or modify - * the perspective transformations of a display object and all of its - * children. For more complex or custom perspective transformations, use the - * Matrix3D class. While the PerspectiveProjection class provides basic - * three-dimensional presentation properties, the Matrix3D class provides more - * detailed control over the three-dimensional presentation of display objects. - *

- * - *

Projection is a way of representing a three-dimensional object in a - * two-dimensional space, like a cube projected onto a computer screen. - * Perspective projection uses a viewing frustum (a rectangular pyramid) to - * model and project a three-dimensional world and its objects on the screen. - * The viewing frustum becomes increasingly wider as it moves further from the - * origin of the viewpoint. The origin of the viewpoint could be a camera or - * the eyes of an observer facing the screen. The projected perspective - * produces the illusion of three dimensions with depth and distance, where - * the objects closer to the screen appear larger than the objects farther - * from the screen.

- * - *

A default PerspectiveProjection object is a framework defined for - * perspective transformation of the root object, based on the field of view - * and aspect ratio (dimensions) of the stage. The projection center, the - * vanishing point, is set to the center of the stage, which means the - * three-dimensional display objects disappear toward the center of the stage - * as they move back in the z axis. The default viewpoint is at point (0,0) - * looking down the positive z axis. The y-axis points down toward the bottom - * of the screen. You can gain access to the root display object's perspective - * projection settings and change the field of view and projection center - * properties of the perspectiveProjection property through the root object's - * DisplayObject.transform property.

- * - *

You can also set a different perspective projection setting for a - * display object through the parent's perspective projection. First, create a - * PerspectiveProjection object and set its fieldOfView and - * projectionCenter properties. Next, assign the - * PerspectiveProjection object to the parent display object using the - * DisplayObject.transform property. The specified projection - * matrix and transformation will then apply to all the display object's - * three-dimensional children.

- * - *

To modify a perspective projection of the stage or root object: use the - * transform.matrix property of the root display object to gain - * access to the PerspectiveProjection object. Or, apply different perspective - * projection properties to a display object by setting the perspective - * projection properties of the display object's parent. The child display - * object inherits the new properties. Specifically, create a - * PerspectiveProjection object and set its properties, then assign the - * PerspectiveProjection object to the perspectiveProjection - * property of the parent display object's transform property. - * The specified projection transformation then applies to all the display - * object's three-dimensional children.

- * - *

Since both PerspectiveProjection and Matrix3D objects perform - * perspective transformations, do not assign both to a display object at the - * same time. Use the PerspectiveProjection object for focal length and - * projection center changes. For more control over the perspective - * transformation, create a perspective projection Matrix3D object.

- */ - (function (geom) { - var PerspectiveProjection = (function () { - /** - * Creates an instance of a PerspectiveProjection object. - */ - function PerspectiveProjection() { - } - /** - * Returns the underlying Matrix3D object of the display object. - * - *

A display object, like the root object, can have a - * PerspectiveProjection object without needing a Matrix3D property - * defined for its transformations. In fact, use either a - * PerspectiveProjection or a Matrix3D object to specify the - * perspective transformation. If when using the PerspectiveProjection - * object, a Matrix3D object was needed, the toMatrix3D() - * method can retrieve the underlying Matrix3D object of the display - * object. For example, the toMatrix3D() method can be - * used with the Utils3D.projectVectors() method.

- * - * @see away.geom.Matrix3D - */ - PerspectiveProjection.prototype.toMatrix3D = function () { - return this._matrix3D; - }; - return PerspectiveProjection; - })(); - geom.PerspectiveProjection = PerspectiveProjection; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (geom) { - var Plane3D = (function () { - /** - * Create a Plane3D with ABCD coefficients - */ - function Plane3D(a, b, c, d) { - if (typeof a === "undefined") { a = 0; } - if (typeof b === "undefined") { b = 0; } - if (typeof c === "undefined") { c = 0; } - if (typeof d === "undefined") { d = 0; } - this.a = a; - this.b = b; - this.c = c; - this.d = d; - - if (a == 0 && b == 0) { - this._iAlignment = Plane3D.ALIGN_XY_AXIS; - } else if (b == 0 && c == 0) { - this._iAlignment = Plane3D.ALIGN_YZ_AXIS; - } else if (a == 0 && c == 0) { - this._iAlignment = Plane3D.ALIGN_XZ_AXIS; - } else { - this._iAlignment = Plane3D.ALIGN_ANY; - } - } - /** - * Fills this Plane3D with the coefficients from 3 points in 3d space. - * @param p0 Vector3D - * @param p1 Vector3D - * @param p2 Vector3D - */ - Plane3D.prototype.fromPoints = function (p0, p1, p2) { - var d1x = p1.x - p0.x; - var d1y = p1.y - p0.y; - var d1z = p1.z - p0.z; - - var d2x = p2.x - p0.x; - var d2y = p2.y - p0.y; - var d2z = p2.z - p0.z; - - this.a = d1y * d2z - d1z * d2y; - this.b = d1z * d2x - d1x * d2z; - this.c = d1x * d2y - d1y * d2x; - this.d = this.a * p0.x + this.b * p0.y + this.c * p0.z; - - // not using epsilon, since a plane is infinite and a small incorrection can grow very large - if (this.a == 0 && this.b == 0) { - this._iAlignment = Plane3D.ALIGN_XY_AXIS; - } else if (this.b == 0 && this.c == 0) { - this._iAlignment = Plane3D.ALIGN_YZ_AXIS; - } else if (this.a == 0 && this.c == 0) { - this._iAlignment = Plane3D.ALIGN_XZ_AXIS; - } else { - this._iAlignment = Plane3D.ALIGN_ANY; - } - }; - - /** - * Fills this Plane3D with the coefficients from the plane's normal and a point in 3d space. - * @param normal Vector3D - * @param point Vector3D - */ - Plane3D.prototype.fromNormalAndPoint = function (normal, point) { - this.a = normal.x; - this.b = normal.y; - this.c = normal.z; - this.d = this.a * point.x + this.b * point.y + this.c * point.z; - if (this.a == 0 && this.b == 0) { - this._iAlignment = Plane3D.ALIGN_XY_AXIS; - } else if (this.b == 0 && this.c == 0) { - this._iAlignment = Plane3D.ALIGN_YZ_AXIS; - } else if (this.a == 0 && this.c == 0) { - this._iAlignment = Plane3D.ALIGN_XZ_AXIS; - } else { - this._iAlignment = Plane3D.ALIGN_ANY; - } - }; - - /** - * Normalize this Plane3D - * @return Plane3D This Plane3D. - */ - Plane3D.prototype.normalize = function () { - var len = 1 / Math.sqrt(this.a * this.a + this.b * this.b + this.c * this.c); - this.a *= len; - this.b *= len; - this.c *= len; - this.d *= len; - return this; - }; - - /** - * Returns the signed distance between this Plane3D and the point p. - * @param p Vector3D - * @returns Number - */ - Plane3D.prototype.distance = function (p) { - if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) { - return this.a * p.x - this.d; - } else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) { - return this.b * p.y - this.d; - } else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) { - return this.c * p.z - this.d; - } else { - return this.a * p.x + this.b * p.y + this.c * p.z - this.d; - } - }; - - /** - * Classify a point against this Plane3D. (in front, back or intersecting) - * @param p Vector3D - * @return int Plane3.FRONT or Plane3D.BACK or Plane3D.INTERSECT - */ - Plane3D.prototype.classifyPoint = function (p, epsilon) { - if (typeof epsilon === "undefined") { epsilon = 0.01; } - // check NaN - if (this.d != this.d) - return away.geom.PlaneClassification.FRONT; - - var len; - if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) - len = this.a * p.x - this.d; - else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) - len = this.b * p.y - this.d; - else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) - len = this.c * p.z - this.d; - else - len = this.a * p.x + this.b * p.y + this.c * p.z - this.d; - - if (len < -epsilon) - return away.geom.PlaneClassification.BACK; - else if (len > epsilon) - return away.geom.PlaneClassification.FRONT; - else - return away.geom.PlaneClassification.INTERSECT; - }; - - Plane3D.prototype.toString = function () { - return "Plane3D [a:" + this.a + ", b:" + this.b + ", c:" + this.c + ", d:" + this.d + "]"; - }; - Plane3D.ALIGN_ANY = 0; - Plane3D.ALIGN_XY_AXIS = 1; - Plane3D.ALIGN_YZ_AXIS = 2; - Plane3D.ALIGN_XZ_AXIS = 3; - return Plane3D; - })(); - geom.Plane3D = Plane3D; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (geom) { - var PlaneClassification = (function () { - function PlaneClassification() { - } - PlaneClassification.BACK = 0; - PlaneClassification.FRONT = 1; - - PlaneClassification.IN = 0; - PlaneClassification.OUT = 1; - PlaneClassification.INTERSECT = 2; - return PlaneClassification; - })(); - geom.PlaneClassification = PlaneClassification; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The Point object represents a location in a two-dimensional coordinate - * system, where x represents the horizontal axis and y - * represents the vertical axis. - * - *

The following code creates a point at(0,0):

- * - *

Methods and properties of the following classes use Point objects:

- * - *
    - *
  • BitmapData
  • - *
  • DisplayObject
  • - *
  • DisplayObjectContainer
  • - *
  • DisplacementMapFilter
  • - *
  • NativeWindow
  • - *
  • Matrix
  • - *
  • Rectangle
  • - *
- * - *

You can use the new Point() constructor to create a Point - * object.

- */ - (function (geom) { - var Point = (function () { - /** - * Creates a new point. If you pass no parameters to this method, a point is - * created at(0,0). - * - * @param x The horizontal coordinate. - * @param y The vertical coordinate. - */ - function Point(x, y) { - if (typeof x === "undefined") { x = 0; } - if (typeof y === "undefined") { y = 0; } - this.x = x; - this.y = y; - } - Object.defineProperty(Point.prototype, "length", { - /** - * The length of the line segment from(0,0) to this point. - */ - get: function () { - return Math.sqrt(this.x * this.x + this.y * this.y); - }, - enumerable: true, - configurable: true - }); - - /** - * Adds the coordinates of another point to the coordinates of this point to - * create a new point. - * - * @param v The point to be added. - * @return The new point. - */ - Point.prototype.add = function (v) { - return new Point(this.x + v.x, this.y + v.y); - }; - - /** - * Creates a copy of this Point object. - * - * @return The new Point object. - */ - Point.prototype.clone = function () { - return new Point(this.x, this.y); - }; - - Point.prototype.copyFrom = function (sourcePoint) { - }; - - /** - * Determines whether two points are equal. Two points are equal if they have - * the same x and y values. - * - * @param toCompare The point to be compared. - * @return A value of true if the object is equal to this Point - * object; false if it is not equal. - */ - Point.prototype.equals = function (toCompare) { - return (this.x == toCompare.x && this.y == toCompare.y); - }; - - /** - * Scales the line segment between(0,0) and the current point to a set - * length. - * - * @param thickness The scaling value. For example, if the current point is - * (0,5), and you normalize it to 1, the point returned is - * at(0,1). - */ - Point.prototype.normalize = function (thickness) { - if (typeof thickness === "undefined") { thickness = 1; } - if (this.length != 0) { - var invLength = thickness / this.length; - this.x *= invLength; - this.y *= invLength; - return; - } - throw "Cannot divide by zero length."; - }; - - /** - * Offsets the Point object by the specified amount. The value of - * dx is added to the original value of x to create the - * new x value. The value of dy is added to the original - * value of y to create the new y value. - * - * @param dx The amount by which to offset the horizontal coordinate, - * x. - * @param dy The amount by which to offset the vertical coordinate, y. - */ - Point.prototype.offset = function (dx, dy) { - this.x += dx; - this.y += dy; - }; - - Point.prototype.setTo = function (xa, ya) { - }; - - /** - * Subtracts the coordinates of another point from the coordinates of this - * point to create a new point. - * - * @param v The point to be subtracted. - * @return The new point. - */ - Point.prototype.subtract = function (v) { - return new Point(this.x - v.x, this.y - v.y); - }; - - /** - * Returns a string that contains the values of the x and y - * coordinates. The string has the form "(x=x, - * y=y)", so calling the toString() method for a - * point at 23,17 would return "(x=23, y=17)". - * - * @return The string representation of the coordinates. - */ - Point.prototype.toString = function () { - return "[Point] (x=" + this.x + ", y=" + this.y + ")"; - }; - - /** - * Returns the distance between pt1 and pt2. - * - * @param pt1 The first point. - * @param pt2 The second point. - * @return The distance between the first and second points. - */ - Point.distance = function (pt1, pt2) { - var dx = pt2.x - pt1.x; - var dy = pt2.y - pt1.y; - - return Math.sqrt(dx * dx + dy * dy); - }; - - /** - * Determines a point between two specified points. The parameter - * f determines where the new interpolated point is located - * relative to the two end points specified by parameters pt1 - * and pt2. The closer the value of the parameter f - * is to 1.0, the closer the interpolated point is to the first - * point(parameter pt1). The closer the value of the parameter - * f is to 0, the closer the interpolated point is to the second - * point(parameter pt2). - * - * @param pt1 The first point. - * @param pt2 The second point. - * @param f The level of interpolation between the two points. Indicates - * where the new point will be, along the line between - * pt1 and pt2. If f=1, - * pt1 is returned; if f=0, - * pt2 is returned. - * @return The new, interpolated point. - */ - Point.interpolate = function (pt1, pt2, f) { - return new Point(pt2.x + (pt1.x - pt2.x) * f, pt2.y + (pt1.y - pt2.y) * f); - }; - - /** - * Converts a pair of polar coordinates to a Cartesian point coordinate. - * - * @param len The length coordinate of the polar pair. - * @param angle The angle, in radians, of the polar pair. - * @return The Cartesian point. - */ - Point.polar = function (len, angle) { - return new Point(len * Math.cos(angle), len * Math.sin(angle)); - }; - return Point; - })(); - geom.Point = Point; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (geom) { - var PoissonLookup = (function () { - function PoissonLookup() { - } - PoissonLookup.initDistributions = function () { - // precalculated for best control - this._distributions = new Array(); - this._distributions[0] = new Array(0.3082841, 0.4320919); - this._distributions[1] = new Array(0.3082841, 0.4320919, -0.2274942, -0.6640266); - this._distributions[2] = new Array(0.8742689, 0.0009265686, -0.6864116, -0.5536607, -0.2325206, 0.7678371); - this._distributions[3] = new Array(0.3913446, -0.7084417, -0.7511101, -0.5935929, -0.2323436, 0.5320091, 0.8435315, 0.5035911); - this._distributions[4] = new Array(0.2122471, -0.5771395, -0.8543506, -0.1763534, 0.5189021, 0.8323698, -0.3616908, 0.5865368, 0.9523004, -0.04948437); - this._distributions[5] = new Array(0.5791035, 0.3496495, 0.2959551, -0.6006749, -0.2419119, -0.06879545, -0.7403072, 0.6110353, -0.04555973, 0.8059174, -0.5275017, -0.737129); - this._distributions[6] = new Array(0.06941478, 0.8519508, -0.7441907, 0.2426432, 0.6439992, -0.2405252, -0.1007523, -0.2327587, -0.6427067, -0.7248485, 0.8050759, 0.5492936, 0.3573822, -0.8824506); - this._distributions[7] = new Array(0.8509863, 0.4452587, -0.09507271, 0.2073005, 0.1706571, -0.6434793, 0.8029777, -0.2718274, -0.4401725, 0.8196304, 0.2715359, 0.8598521, -0.8121575, -0.006447683, -0.6486837, -0.7237598); - this._distributions[8] = new Array(0.6951686, -0.2680728, -0.04933243, 0.3710589, 0.6592212, 0.3661054, -0.01579228, -0.6909603, -0.3275101, -0.1756866, 0.3811549, 0.9218544, -0.216032, 0.9755028, -0.7065172, 0.3355389, -0.6579109, -0.6798355); - this._distributions[9] = new Array(0.6181276, -0.09790418, -0.2537868, -0.5570995, -0.1964931, 0.3459414, 0.3474613, -0.8885581, 0.5135743, 0.5753114, -0.9549091, 0.1480672, -0.8711916, -0.4293123, -0.6928071, 0.6190156, -0.13369, 0.8892705, 0.0548224, -0.1246777); - this._distributions[10] = new Array(0.4853027, -0.5080479, -0.1331675, -0.506597, 0.139575, 0.01316885, 0.803486, -0.07568797, 0.5240274, 0.4883182, -0.4334005, 0.1207938, -0.7794577, -0.3985141, 0.1576432, -0.9861221, -0.3712867, 0.6959021, 0.1517378, 0.9847429, -0.9762396, 0.1661073); - this._distributions[11] = new Array(-0.2790166, -0.01252619, 0.3389016, 0.3921154, 0.2408341, -0.313211, -0.8151779, -0.3898362, -0.6347761, 0.3486495, 0.09471484, -0.7722448, -0.1385674, 0.6364574, 0.2456331, 0.9295807, -0.3864306, -0.8247881, 0.6111673, -0.7164014, 0.8287669, 0.05466961, 0.837706, 0.5415626); - this._distributions[12] = new Array(0.056417, 0.3185693, -0.8245888, 0.1882799, 0.8575996, 0.1136829, 0.1070375, 0.875332, 0.4076743, -0.06000621, -0.4311306, 0.7239349, 0.2677574, -0.538472, -0.08486642, -0.2083647, -0.888989, -0.3906443, -0.4768958, -0.6664082, 0.09334993, -0.9861541, 0.808736, -0.455949, 0.5889823, 0.7660807); - this._distributions[13] = new Array(-0.2681346, -0.3955857, -0.1315102, -0.8852947, -0.5143692, 0.09551838, 0.4344836, -0.546945, -0.8620899, -0.3813288, 0.1650431, 0.02034803, -0.1543657, 0.3842218, -0.828457, 0.5376903, -0.6145, -0.7818927, -0.2639062, 0.8784655, 0.1912684, 0.9720125, 0.3135219, 0.5224229, 0.7850655, 0.4592297, 0.7465045, -0.1368916); - this._distributions[14] = new Array(0.4241029, 0.695281, 0.150511, -0.02304107, -0.2482675, 0.9120338, 0.8057325, 0.2622084, -0.2445909, 0.2765962, 0.8588713, -0.1772072, 0.3117845, -0.4385471, -0.3923851, -0.3298936, -0.1751254, -0.7405846, 0.6926506, -0.684163, -0.9304563, -0.3254691, -0.8533293, 0.1523024, 0.2510415, -0.917345, -0.6239773, -0.7105472, -0.6104624, 0.6041355); - this._distributions[15] = new Array(0.5844554, 0.06651045, 0.1343258, 0.6756578, 0.3799674, -0.6301104, 0.5590436, 0.7940555, 0.09574714, 0.02262517, 0.8697868, 0.393301, 0.003945862, -0.421735, 0.9043913, -0.2432393, -0.4844007, 0.7190998, -0.3201078, 0.2972371, -0.3852352, -0.6341155, -0.5413069, -0.09223081, -0.8468984, -0.5126905, 0.004156174, -0.8633173, -0.9681889, -0.03305046, -0.846509, 0.4414353); - this._distributions[16] = new Array(0.4506488, 0.657668, 0.4621297, 0.07441051, -0.2782125, 0.6201044, 0.9750003, 0.09110117, 0.1019436, 0.2986514, 0.03457398, 0.9631706, 0.542098, -0.5505635, 0.8675668, 0.4938077, -0.5414361, 0.2655292, -0.7941836, 0.6003053, -0.09847672, -0.1001604, -0.9316511, -0.08572888, 0.07286467, -0.611899, -0.5232627, -0.4082253, -0.5481608, -0.827938, -0.1551939, -0.9621193, 0.9220031, -0.3315949); - this._distributions[17] = new Array(0.197908, -0.4697656, -0.4474689, -0.3428435, 0.8529873, -0.2228634, 0.6022478, -0.5469642, 0.2545276, -0.931133, -0.1507547, -0.7855865, -0.07606658, 0.1011628, 0.3046715, 0.2785755, 0.4698432, -0.1064076, 0.6831254, 0.4152522, 0.1374381, 0.8363233, -0.2166121, 0.6682042, 0.5511393, 0.7996449, -0.4278994, 0.28836, -0.8875198, 0.2181732, -0.8772842, -0.2818254, -0.7000262, 0.5762185, -0.6062385, -0.7439126); - this._distributions[18] = new Array(0.6645703, -0.05678739, 0.5720971, 0.4533803, -0.07660709, 0.08802763, 0.5163431, -0.4426552, 0.1163455, -0.3404382, -0.4004807, -0.5046007, 0.2932099, -0.8201418, -0.5322125, 0.03834766, -0.1490209, -0.8817304, -0.8000439, -0.3509448, 0.5260983, 0.8421043, 0.1197811, 0.6963812, 0.9498612, 0.3122156, -0.9285746, 0.02120355, -0.6670724, 0.7217396, 0.9155889, -0.3510147, -0.271941, 0.4727852, 0.318879, 0.1634057, -0.2686755, 0.9253026); - this._distributions[19] = new Array(0.5064292, 0.422527, 0.8935515, -0.06610427, 0.1199719, 0.175568, 0.403388, -0.2003276, 0.1657927, 0.8154403, 0.9301245, 0.2929218, -0.1644068, 0.6201534, 0.7113559, -0.6589743, -0.3364046, -0.1799502, 0.02109996, -0.392765, -0.382213, 0.3219992, -0.9201946, 0.1207967, -0.726185, 0.4291916, -0.7443482, -0.2480059, -0.5147594, 0.7418784, 0.1935272, -0.7406143, -0.3643523, -0.5559214, -0.7147766, -0.6326278, -0.2524151, -0.9096627, 0.5161405, 0.7908453); - this._distributions[20] = new Array(0.7921003, -0.3032096, 0.5992879, -0.009052323, 0.2538549, -0.1872749, 0.7053444, 0.3677175, 0.5417761, -0.8170255, 0.9749611, 0.1210478, 0.1969143, -0.6117041, -0.1824499, -0.4634196, -0.1181338, -0.8668742, -0.3050112, -0.1352596, -0.4409327, -0.7082354, -0.03225285, 0.1171548, 0.3113096, 0.3250439, -0.8166144, -0.463995, -0.01014475, 0.4715334, -0.6868284, 0.05091889, -0.4011163, 0.2717285, -0.06756835, 0.8307694, -0.7938535, 0.4352129, -0.4663842, 0.7165329, 0.559729, 0.8093995); - this._distributions[21] = new Array(0.07832243, 0.426151, -0.3856795, 0.5799953, 0.01970797, 0.06706189, 0.4822682, 0.3014512, -0.1532982, 0.87485, -0.4959527, 0.07888043, 0.260601, -0.2304784, 0.4996209, 0.7167382, 0.585986, -0.04265174, -0.7679967, 0.5509416, -0.9041753, 0.1802134, -0.8407655, -0.4442826, -0.2058258, -0.2636995, -0.4984115, -0.5928579, 0.2926032, -0.7886473, -0.06933882, -0.621177, 0.578115, -0.4813387, 0.8981777, -0.3291056, 0.1942733, 0.9255584, 0.8084362, 0.5066984, 0.9920095, 0.03103104, -0.2403206, -0.9389018); - this._distributions[22] = new Array(-0.5691095, 0.1014316, -0.7788262, 0.384012, -0.8253665, -0.1645582, -0.1830993, 0.002997211, -0.2555013, -0.4177977, -0.6640869, -0.4794711, -0.2351242, 0.5850121, 0.02436554, 0.2825883, 0.006061143, -0.8200245, 0.1618791, -0.3063331, -0.3765897, -0.7249815, 0.6092919, -0.6769328, -0.5956934, 0.6957655, 0.5383642, 0.4522677, -0.1489165, 0.9125596, 0.4167473, 0.1335986, 0.1898309, 0.5874342, 0.2288171, 0.9624356, 0.7540846, -0.07672304, 0.8986252, 0.2788797, 0.3555991, -0.9262139, 0.8454325, -0.4027667, 0.4945236, -0.2935512); - this._distributions[23] = new Array(-0.4481403, -0.3758374, -0.8877251, 0.08739938, 0.05015831, -0.1339983, -0.4070427, -0.8534173, 0.1019274, -0.5503222, -0.445998, 0.1997541, -0.8686263, -0.2788867, -0.7695944, -0.6033704, -0.05515742, -0.885711, -0.7714347, 0.5790485, 0.3466263, -0.8799297, 0.4487582, -0.5321087, -0.2461368, 0.6053771, -0.05568117, 0.2457351, -0.4668669, 0.8523816, 0.8103387, -0.4255538, 0.4054182, -0.175663, -0.2802011, -0.08920153, 0.2665959, 0.382935, 0.555679, 0.1621837, 0.105246, 0.8420411, 0.6921161, 0.6902903, 0.880946, 0.2483067, 0.9699264, -0.1021767); - this._distributions[24] = new Array(-0.1703323, -0.3119385, 0.2916039, -0.2988263, -0.008472982, -0.9277695, -0.7730271, -0.3277904, 0.3440474, -0.6815342, -0.2910278, 0.03461745, -0.6764899, -0.657078, -0.3505501, -0.7311988, -0.03478927, 0.3258755, -0.6048835, 0.159423, 0.2035525, 0.02212214, 0.5116573, 0.2226856, 0.6664805, -0.2500189, 0.7147882, -0.6609634, 0.03030632, -0.5763278, -0.2516585, 0.6116219, -0.9434413, -0.0116792, 0.9061816, 0.2491155, 0.182867, 0.6076167, 0.286593, 0.9485695, -0.5992439, 0.6970096, -0.2082874, 0.9416641, 0.9880044, -0.1541709, -0.9122881, 0.331555, 0.7324886, 0.6725098); - this._distributions[25] = new Array(0.3869598, -0.04974834, 0.7168844, -0.0693711, -0.07166742, 0.1725325, 0.4599592, 0.3232779, 0.5872094, -0.4198674, 0.2442266, -0.625667, 0.1254557, 0.4500048, -0.2290154, -0.1803567, 0.890583, 0.3373493, 0.1256081, 0.7853789, -0.2676466, 0.5305805, -0.7063224, 0.252168, -0.3989835, 0.1189921, 0.09617215, -0.2451447, 0.6302541, 0.6085876, 0.9380925, -0.3234899, 0.5086241, -0.8573482, 0.03576187, -0.9876697, -0.0876712, -0.6365195, -0.5276513, 0.823456, -0.6935764, -0.2240411, -0.5212318, -0.5383121, -0.2116208, 0.9639363, -0.9840096, 0.02743555, -0.3991577, -0.8994547, -0.7830126, 0.614068); - this._distributions[26] = new Array(-0.8366601, 0.4464895, -0.5917366, -0.02073906, -0.9845258, 0.1635625, -0.3097973, 0.4379579, -0.5478154, 0.7173221, -0.1685888, 0.9261969, 0.01503595, 0.6046097, 0.4452421, 0.5449086, 0.0315687, 0.1944619, 0.3753404, 0.8688548, 0.4143643, 0.1396648, 0.8711032, 0.4304703, 0.7328773, 0.1461501, 0.6374492, -0.3521495, 0.145613, -0.1341466, 0.9040975, -0.135123, -0.7839059, -0.5450199, -0.516019, -0.3320859, -0.206158, -0.4431106, -0.9703014, -0.2368356, -0.2473119, -0.0864351, 0.2130725, -0.4604077, -0.003726701, -0.7122303, -0.4072131, -0.6833169, 0.1632999, -0.9776646, 0.4686888, -0.680495, -0.2293511, -0.9509777); - this._distributions[27] = new Array(0.107311, -0.1311369, -0.4194764, -0.3148777, 0.6171439, -0.2745973, 0.2796618, 0.1937153, -0.09106886, 0.4180236, 0.6044006, 0.05577846, 0.02927299, -0.6738263, -0.2580845, 0.1179939, -0.09023564, -0.3830024, 0.3570953, -0.5000587, 0.81591, -0.5518309, 0.9300217, -0.1257987, 0.4904627, -0.8381903, -0.3163182, -0.8632009, 0.1137595, -0.9875998, 0.8390043, 0.3538185, 0.2149114, 0.4993694, 0.5191584, 0.3833552, 0.5002763, 0.7061465, -0.2567276, 0.9068756, -0.5197366, 0.3467845, 0.03668867, 0.9734009, -0.5347553, 0.66747, -0.9028882, 0.1023768, -0.8967977, 0.412834, -0.5821944, 0.0426479, -0.8032165, -0.2397038, -0.5597343, -0.6358021); - this._distributions[28] = new Array(-0.6562496, -0.1781036, -0.9301494, 0.1185208, -0.3861143, -0.4153562, -0.1560799, -0.1099607, -0.5587025, 0.395218, -0.5322112, -0.699701, -0.5008639, 0.08726846, -0.970524, -0.1963461, -0.813577, -0.5185111, -0.1644458, 0.298, -0.3216791, 0.639982, 0.3315373, 0.3339162, 0.2383235, -0.00105722, 0.1137828, 0.5450742, -0.01899921, 0.8798413, 0.2849685, 0.8255596, 0.6974412, 0.2123175, 0.7588523, 0.5470437, 0.5102502, -0.1687844, 0.5853448, 0.8033476, 0.2590716, -0.5262504, 0.5607718, -0.6342825, 0.8666443, -0.1491841, 0.8341052, -0.4935003, -0.1568441, -0.6634066, 0.2512113, -0.8769391, -0.2559827, -0.9572457, -0.01928852, -0.3966542, -0.750667, 0.6409678); - this._distributions[29] = new Array(0.3454786, -0.04837726, 0.2649553, 0.2406852, 0.5599093, -0.3839145, -0.1111814, -0.05502108, 0.7586042, -0.05818377, 0.2519488, -0.4665135, -0.1264972, 0.2602723, -0.08766216, -0.3671907, 0.6428129, 0.3999204, -0.6105871, -0.1246869, -0.4589451, -0.7646643, -0.03021116, -0.7899352, -0.6036922, -0.4293956, -0.2481938, 0.6534185, 0.102798, 0.6784465, -0.6392644, 0.4821358, -0.6789002, 0.1779133, -0.9140783, -0.1989647, -0.9262617, 0.3381507, 0.4794891, -0.8093274, 0.3959447, 0.668478, 0.9602883, 0.2272305, -0.123672, 0.9210883, 0.2375148, 0.9523395, -0.52898, 0.7973378, -0.382433, 0.1228794, 0.695015, 0.6948439, 0.7530277, -0.6458191, 0.8777987, -0.3272956, 0.2318525, -0.962768); - this._distributions[30] = new Array(0.4518921, -0.1146195, 0.4720805, -0.4238748, 0.3655423, 0.1806341, 0.1589939, -0.23568, 0.7673324, -0.5149941, 0.01163658, 0.09045836, 0.7010971, 0.1245747, 0.7518286, -0.1855433, 0.4960719, 0.4601022, 0.2566979, -0.6308268, -0.0654714, -0.5126389, -0.1823319, -0.1343282, -0.1464312, 0.4883236, -0.3858738, 0.203523, 0.1484799, 0.4432284, -0.477109, -0.116241, 0.2719092, 0.7208626, 0.9104174, 0.3578536, -0.5956199, 0.7662588, -0.6996251, 0.3678654, -0.2514512, 0.9251933, 0.1275825, -0.9478135, -0.204608, -0.8611552, 0.4264838, -0.877443, 0.9854161, 0.05521112, 0.5912951, 0.7997434, 0.1140349, 0.982093, -0.9324368, -0.2094094, -0.42436, -0.6441524, -0.6722705, -0.3554261, -0.7844236, 0.08587621); - this._distributions[31] = new Array(-0.4206714, -0.5613642, -0.8733016, -0.3373051, -0.1046226, -0.2902999, -0.1318562, -0.8434365, 0.1145093, -0.5962623, -0.4965627, -0.1873259, -0.5011808, -0.8546229, -0.7165636, -0.5743566, 0.1090901, 0.2017643, 0.3404809, -0.220455, -0.1989015, 0.2372122, -0.4538706, 0.0979171, 0.4514146, -0.572846, 0.2314168, -0.8514503, -0.4247236, 0.5650803, -0.943347, 0.04514639, -0.1309718, 0.5221877, -0.7004157, 0.4561877, 0.6306441, 0.04448673, 0.4301621, 0.5766876, 0.1078042, 0.7245752, 0.3875354, 0.2794483, 0.702876, -0.2924213, 0.7360667, -0.6210318, 0.7486517, 0.6531103, 0.4898235, 0.8591025, 0.6549174, 0.3854057, -0.2596106, 0.7916998, 0.9251194, -0.05296265, -0.5620695, 0.820877, -0.01228026, 0.9937211, 0.9612103, 0.2628758); - }; - - PoissonLookup.getDistribution = function (n /*int*/ ) { - if (!this._distributions) - this.initDistributions(); - - if (n < 2 || n > 32) - return null; - - return this._distributions[n - 1]; - }; - return PoissonLookup; - })(); - geom.PoissonLookup = PoissonLookup; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (geom) { - //import flash.geom.Matrix3D; - //import flash.geom.Orientation3D; - //import flash.geom.Vector3D; - /** - * A Quaternion object which can be used to represent rotations. - */ - var Quaternion = (function () { - /** - * Creates a new Quaternion object. - * @param x The x value of the quaternion. - * @param y The y value of the quaternion. - * @param z The z value of the quaternion. - * @param w The w value of the quaternion. - */ - function Quaternion(x, y, z, w) { - if (typeof x === "undefined") { x = 0; } - if (typeof y === "undefined") { y = 0; } - if (typeof z === "undefined") { z = 0; } - if (typeof w === "undefined") { w = 1; } - /** - * The x value of the quaternion. - */ - this.x = 0; - /** - * The y value of the quaternion. - */ - this.y = 0; - /** - * The z value of the quaternion. - */ - this.z = 0; - /** - * The w value of the quaternion. - */ - this.w = 1; - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - Object.defineProperty(Quaternion.prototype, "magnitude", { - /** - * Returns the magnitude of the quaternion object. - */ - get: function () { - return Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); - }, - enumerable: true, - configurable: true - }); - - /** - * Fills the quaternion object with the result from a multiplication of two quaternion objects. - * - * @param qa The first quaternion in the multiplication. - * @param qb The second quaternion in the multiplication. - */ - Quaternion.prototype.multiply = function (qa, qb) { - var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; - var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; - - this.w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2; - this.x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2; - this.y = w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2; - this.z = w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2; - }; - - Quaternion.prototype.multiplyVector = function (vector, target) { - if (typeof target === "undefined") { target = null; } - //target ||= new Quaternion(); - if (target === null) { - target = new Quaternion(); - } - - var x2 = vector.x; - var y2 = vector.y; - var z2 = vector.z; - - target.w = -this.x * x2 - this.y * y2 - this.z * z2; - target.x = this.w * x2 + this.y * z2 - this.z * y2; - target.y = this.w * y2 - this.x * z2 + this.z * x2; - target.z = this.w * z2 + this.x * y2 - this.y * x2; - - return target; - }; - - /** - * Fills the quaternion object with values representing the given rotation around a vector. - * - * @param axis The axis around which to rotate - * @param angle The angle in radians of the rotation. - */ - Quaternion.prototype.fromAxisAngle = function (axis, angle) { - var sin_a = Math.sin(angle / 2); - var cos_a = Math.cos(angle / 2); - - this.x = axis.x * sin_a; - this.y = axis.y * sin_a; - this.z = axis.z * sin_a; - this.w = cos_a; - - this.normalize(); - }; - - /** - * Spherically interpolates between two quaternions, providing an interpolation between rotations with constant angle change rate. - * @param qa The first quaternion to interpolate. - * @param qb The second quaternion to interpolate. - * @param t The interpolation weight, a value between 0 and 1. - */ - Quaternion.prototype.slerp = function (qa, qb, t) { - var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; - var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; - var dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2; - - // shortest direction - if (dot < 0) { - dot = -dot; - w2 = -w2; - x2 = -x2; - y2 = -y2; - z2 = -z2; - } - - if (dot < 0.95) { - // interpolate angle linearly - var angle = Math.acos(dot); - var s = 1 / Math.sin(angle); - var s1 = Math.sin(angle * (1 - t)) * s; - var s2 = Math.sin(angle * t) * s; - this.w = w1 * s1 + w2 * s2; - this.x = x1 * s1 + x2 * s2; - this.y = y1 * s1 + y2 * s2; - this.z = z1 * s1 + z2 * s2; - } else { - // nearly identical angle, interpolate linearly - this.w = w1 + t * (w2 - w1); - this.x = x1 + t * (x2 - x1); - this.y = y1 + t * (y2 - y1); - this.z = z1 + t * (z2 - z1); - var len = 1.0 / Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); - this.w *= len; - this.x *= len; - this.y *= len; - this.z *= len; - } - }; - - /** - * Linearly interpolates between two quaternions. - * @param qa The first quaternion to interpolate. - * @param qb The second quaternion to interpolate. - * @param t The interpolation weight, a value between 0 and 1. - */ - Quaternion.prototype.lerp = function (qa, qb, t) { - var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; - var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; - var len; - - // shortest direction - if (w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2 < 0) { - w2 = -w2; - x2 = -x2; - y2 = -y2; - z2 = -z2; - } - - this.w = w1 + t * (w2 - w1); - this.x = x1 + t * (x2 - x1); - this.y = y1 + t * (y2 - y1); - this.z = z1 + t * (z2 - z1); - - len = 1.0 / Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); - this.w *= len; - this.x *= len; - this.y *= len; - this.z *= len; - }; - - /** - * Fills the quaternion object with values representing the given euler rotation. - * - * @param ax The angle in radians of the rotation around the ax axis. - * @param ay The angle in radians of the rotation around the ay axis. - * @param az The angle in radians of the rotation around the az axis. - */ - Quaternion.prototype.fromEulerAngles = function (ax, ay, az) { - var halfX = ax * .5, halfY = ay * .5, halfZ = az * .5; - var cosX = Math.cos(halfX), sinX = Math.sin(halfX); - var cosY = Math.cos(halfY), sinY = Math.sin(halfY); - var cosZ = Math.cos(halfZ), sinZ = Math.sin(halfZ); - - this.w = cosX * cosY * cosZ + sinX * sinY * sinZ; - this.x = sinX * cosY * cosZ - cosX * sinY * sinZ; - this.y = cosX * sinY * cosZ + sinX * cosY * sinZ; - this.z = cosX * cosY * sinZ - sinX * sinY * cosZ; - }; - - /** - * Fills a target Vector3D object with the Euler angles that form the rotation represented by this quaternion. - * @param target An optional Vector3D object to contain the Euler angles. If not provided, a new object is created. - * @return The Vector3D containing the Euler angles. - */ - Quaternion.prototype.toEulerAngles = function (target) { - if (typeof target === "undefined") { target = null; } - //target ||= new away.geom.Vector3D(); - if (target === null) { - target = new away.geom.Vector3D(); - } - - target.x = Math.atan2(2 * (this.w * this.x + this.y * this.z), 1 - 2 * (this.x * this.x + this.y * this.y)); - target.y = Math.asin(2 * (this.w * this.y - this.z * this.x)); - target.z = Math.atan2(2 * (this.w * this.z + this.x * this.y), 1 - 2 * (this.y * this.y + this.z * this.z)); - - return target; - }; - - /** - * Normalises the quaternion object. - */ - Quaternion.prototype.normalize = function (val) { - if (typeof val === "undefined") { val = 1; } - var mag = val / Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); - - this.x *= mag; - this.y *= mag; - this.z *= mag; - this.w *= mag; - }; - - /** - * Used to trace the values of a quaternion. - * - * @return A string representation of the quaternion object. - */ - Quaternion.prototype.toString = function () { - return "{x:" + this.x + " y:" + this.y + " z:" + this.z + " w:" + this.w + "}"; - }; - - /** - * Converts the quaternion to a Matrix3D object representing an equivalent rotation. - * @param target An optional Matrix3D container to store the transformation in. If not provided, a new object is created. - * @return A Matrix3D object representing an equivalent rotation. - */ - Quaternion.prototype.toMatrix3D = function (target) { - if (typeof target === "undefined") { target = null; } - var rawData = away.geom.Matrix3DUtils.RAW_DATA_CONTAINER; - var xy2 = 2.0 * this.x * this.y, xz2 = 2.0 * this.x * this.z, xw2 = 2.0 * this.x * this.w; - var yz2 = 2.0 * this.y * this.z, yw2 = 2.0 * this.y * this.w, zw2 = 2.0 * this.z * this.w; - var xx = this.x * this.x, yy = this.y * this.y, zz = this.z * this.z, ww = this.w * this.w; - - rawData[0] = xx - yy - zz + ww; - rawData[4] = xy2 - zw2; - rawData[8] = xz2 + yw2; - rawData[12] = 0; - rawData[1] = xy2 + zw2; - rawData[5] = -xx + yy - zz + ww; - rawData[9] = yz2 - xw2; - rawData[13] = 0; - rawData[2] = xz2 - yw2; - rawData[6] = yz2 + xw2; - rawData[10] = -xx - yy + zz + ww; - rawData[14] = 0; - rawData[3] = 0.0; - rawData[7] = 0.0; - rawData[11] = 0; - rawData[15] = 1; - - if (!target) - return new away.geom.Matrix3D(rawData); - - target.copyRawDataFrom(rawData); - - return target; - }; - - /** - * Extracts a quaternion rotation matrix out of a given Matrix3D object. - * @param matrix The Matrix3D out of which the rotation will be extracted. - */ - Quaternion.prototype.fromMatrix = function (matrix) { - var v = matrix.decompose(away.geom.Orientation3D.QUATERNION)[1]; - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.w = v.w; - }; - - /** - * Converts the quaternion to a Vector.<Number> matrix representation of a rotation equivalent to this quaternion. - * @param target The Vector.<Number> to contain the raw matrix data. - * @param exclude4thRow If true, the last row will be omitted, and a 4x3 matrix will be generated instead of a 4x4. - */ - Quaternion.prototype.toRawData = function (target, exclude4thRow) { - if (typeof exclude4thRow === "undefined") { exclude4thRow = false; } - var xy2 = 2.0 * this.x * this.y, xz2 = 2.0 * this.x * this.z, xw2 = 2.0 * this.x * this.w; - var yz2 = 2.0 * this.y * this.z, yw2 = 2.0 * this.y * this.w, zw2 = 2.0 * this.z * this.w; - var xx = this.x * this.x, yy = this.y * this.y, zz = this.z * this.z, ww = this.w * this.w; - - target[0] = xx - yy - zz + ww; - target[1] = xy2 - zw2; - target[2] = xz2 + yw2; - target[4] = xy2 + zw2; - target[5] = -xx + yy - zz + ww; - target[6] = yz2 - xw2; - target[8] = xz2 - yw2; - target[9] = yz2 + xw2; - target[10] = -xx - yy + zz + ww; - target[3] = target[7] = target[11] = 0; - - if (!exclude4thRow) { - target[12] = target[13] = target[14] = 0; - target[15] = 1; - } - }; - - /** - * Clones the quaternion. - * @return An exact duplicate of the current Quaternion. - */ - Quaternion.prototype.clone = function () { - return new Quaternion(this.x, this.y, this.z, this.w); - }; - - /** - * Rotates a point. - * @param vector The Vector3D object to be rotated. - * @param target An optional Vector3D object that will contain the rotated coordinates. If not provided, a new object will be created. - * @return A Vector3D object containing the rotated point. - */ - Quaternion.prototype.rotatePoint = function (vector, target) { - if (typeof target === "undefined") { target = null; } - var x1, y1, z1, w1; - var x2 = vector.x, y2 = vector.y, z2 = vector.z; - - //target ||= new away.geom.Vector3D(); - if (target === null) { - target = new away.geom.Vector3D(); - } - - // p*q' - w1 = -this.x * x2 - this.y * y2 - this.z * z2; - x1 = this.w * x2 + this.y * z2 - this.z * y2; - y1 = this.w * y2 - this.x * z2 + this.z * x2; - z1 = this.w * z2 + this.x * y2 - this.y * x2; - - target.x = -w1 * this.x + x1 * this.w - y1 * this.z + z1 * this.y; - target.y = -w1 * this.y + x1 * this.z + y1 * this.w - z1 * this.x; - target.z = -w1 * this.z - x1 * this.y + y1 * this.x + z1 * this.w; - - return target; - }; - - /** - * Copies the data from a quaternion into this instance. - * @param q The quaternion to copy from. - */ - Quaternion.prototype.copyFrom = function (q) { - this.x = q.x; - this.y = q.y; - this.z = q.z; - this.w = q.w; - }; - return Quaternion; - })(); - geom.Quaternion = Quaternion; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * A Rectangle object is an area defined by its position, as indicated by its - * top-left corner point(x, y) and by its width and its height. - * - * - *

The x, y, width, and - * height properties of the Rectangle class are independent of - * each other; changing the value of one property has no effect on the others. - * However, the right and bottom properties are - * integrally related to those four properties. For example, if you change the - * value of the right property, the value of the - * width property changes; if you change the bottom - * property, the value of the height property changes.

- * - *

The following methods and properties use Rectangle objects:

- * - *
    - *
  • The applyFilter(), colorTransform(), - * copyChannel(), copyPixels(), draw(), - * fillRect(), generateFilterRect(), - * getColorBoundsRect(), getPixels(), - * merge(), paletteMap(), - * pixelDisolve(), setPixels(), and - * threshold() methods, and the rect property of the - * BitmapData class
  • - *
  • The getBounds() and getRect() methods, and - * the scrollRect and scale9Grid properties of the - * DisplayObject class
  • - *
  • The getCharBoundaries() method of the TextField - * class
  • - *
  • The pixelBounds property of the Transform class
  • - *
  • The bounds parameter for the startDrag() - * method of the Sprite class
  • - *
  • The printArea parameter of the addPage() - * method of the PrintJob class
  • - *
- * - *

You can use the new Rectangle() constructor to create a - * Rectangle object.

- * - *

Note: The Rectangle class does not define a rectangular Shape - * display object. To draw a rectangular Shape object onscreen, use the - * drawRect() method of the Graphics class.

- */ - (function (geom) { - var Rectangle = (function () { - /** - * Creates a new Rectangle object with the top-left corner specified by the - * x and y parameters and with the specified - * width and height parameters. If you call this - * public without parameters, a rectangle with x, - * y, width, and height properties set - * to 0 is created. - * - * @param x The x coordinate of the top-left corner of the - * rectangle. - * @param y The y coordinate of the top-left corner of the - * rectangle. - * @param width The width of the rectangle, in pixels. - * @param height The height of the rectangle, in pixels. - */ - function Rectangle(x, y, width, height) { - if (typeof x === "undefined") { x = 0; } - if (typeof y === "undefined") { y = 0; } - if (typeof width === "undefined") { width = 0; } - if (typeof height === "undefined") { height = 0; } - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - Object.defineProperty(Rectangle.prototype, "bottom", { - /** - * The sum of the y and height properties. - */ - get: function () { - return this.y + this.height; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Rectangle.prototype, "bottomRight", { - /** - * The location of the Rectangle object's bottom-right corner, determined by - * the values of the right and bottom properties. - */ - get: function () { - if (this._bottomRight == null) - this._bottomRight = new geom.Point(); - - this._bottomRight.x = this.x + this.width; - this._bottomRight.y = this.y + this.height; - - return this._bottomRight; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Rectangle.prototype, "left", { - /** - * The x coordinate of the top-left corner of the rectangle. Changing - * the left property of a Rectangle object has no effect on the - * y and height properties. However it does affect - * the width property, whereas changing the x value - * does not affect the width property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - get: function () { - return this.x; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Rectangle.prototype, "right", { - /** - * The sum of the x and width properties. - */ - get: function () { - return this.x + this.width; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Rectangle.prototype, "size", { - /** - * The size of the Rectangle object, expressed as a Point object with the - * values of the width and height properties. - */ - get: function () { - if (this._size == null) - this._size = new geom.Point(); - - this._size.x = this.width; - this._size.y = this.height; - - return this._size; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Rectangle.prototype, "top", { - /** - * The y coordinate of the top-left corner of the rectangle. Changing - * the top property of a Rectangle object has no effect on the - * x and width properties. However it does affect - * the height property, whereas changing the y - * value does not affect the height property. - * - *

The value of the top property is equal to the value of the - * y property.

- */ - get: function () { - return this.y; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Rectangle.prototype, "topLeft", { - /** - * The location of the Rectangle object's top-left corner, determined by the - * x and y coordinates of the point. - */ - get: function () { - if (this._topLeft == null) - this._topLeft = new geom.Point(); - - this._topLeft.x = this.x; - this._topLeft.y = this.y; - - return this._topLeft; - }, - enumerable: true, - configurable: true - }); - - /** - * Returns a new Rectangle object with the same values for the - * x, y, width, and - * height properties as the original Rectangle object. - * - * @return A new Rectangle object with the same values for the - * x, y, width, and - * height properties as the original Rectangle object. - */ - Rectangle.prototype.clone = function () { - return new Rectangle(this.x, this.y, this.width, this.height); - }; - - /** - * Determines whether the specified point is contained within the rectangular - * region defined by this Rectangle object. - * - * @param x The x coordinate(horizontal position) of the point. - * @param y The y coordinate(vertical position) of the point. - * @return A value of true if the Rectangle object contains the - * specified point; otherwise false. - */ - Rectangle.prototype.contains = function (x, y) { - return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y); - }; - - /** - * Determines whether the specified point is contained within the rectangular - * region defined by this Rectangle object. This method is similar to the - * Rectangle.contains() method, except that it takes a Point - * object as a parameter. - * - * @param point The point, as represented by its x and y - * coordinates. - * @return A value of true if the Rectangle object contains the - * specified point; otherwise false. - */ - Rectangle.prototype.containsPoint = function (point) { - return (this.x <= point.x && this.x + this.width >= point.x && this.y <= point.y && this.y + this.height >= point.y); - }; - - /** - * Determines whether the Rectangle object specified by the rect - * parameter is contained within this Rectangle object. A Rectangle object is - * said to contain another if the second Rectangle object falls entirely - * within the boundaries of the first. - * - * @param rect The Rectangle object being checked. - * @return A value of true if the Rectangle object that you - * specify is contained by this Rectangle object; otherwise - * false. - */ - Rectangle.prototype.containsRect = function (rect) { - return (this.x <= rect.x && this.x + this.width >= rect.x + rect.width && this.y <= rect.y && this.y + this.height >= rect.y + rect.height); - }; - - /** - * Copies all of rectangle data from the source Rectangle object into the - * calling Rectangle object. - * - * @param sourceRect The Rectangle object from which to copy the data. - */ - Rectangle.prototype.copyFrom = function (sourceRect) { - }; - - /** - * Determines whether the object specified in the toCompare - * parameter is equal to this Rectangle object. This method compares the - * x, y, width, and - * height properties of an object against the same properties of - * this Rectangle object. - * - * @param toCompare The rectangle to compare to this Rectangle object. - * @return A value of true if the object has exactly the same - * values for the x, y, width, - * and height properties as this Rectangle object; - * otherwise false. - */ - Rectangle.prototype.equals = function (toCompare) { - return (this.x == toCompare.x && this.y == toCompare.y && this.width == toCompare.width && this.height == toCompare.height); - }; - - /** - * Increases the size of the Rectangle object by the specified amounts, in - * pixels. The center point of the Rectangle object stays the same, and its - * size increases to the left and right by the dx value, and to - * the top and the bottom by the dy value. - * - * @param dx The value to be added to the left and the right of the Rectangle - * object. The following equation is used to calculate the new - * width and position of the rectangle: - * @param dy The value to be added to the top and the bottom of the - * Rectangle. The following equation is used to calculate the new - * height and position of the rectangle: - */ - Rectangle.prototype.inflate = function (dx, dy) { - this.x -= dx / 2; - this.y -= dy / 2; - this.width += dx / 2; - this.height += dy / 2; - }; - - /** - * Increases the size of the Rectangle object. This method is similar to the - * Rectangle.inflate() method except it takes a Point object as - * a parameter. - * - *

The following two code examples give the same result:

- * - * @param point The x property of this Point object is used to - * increase the horizontal dimension of the Rectangle object. - * The y property is used to increase the vertical - * dimension of the Rectangle object. - */ - Rectangle.prototype.inflatePoint = function (point) { - this.x -= point.x / 2; - this.y -= point.y / 2; - this.width += point.x / 2; - this.height += point.y / 2; - }; - - /** - * If the Rectangle object specified in the toIntersect - * parameter intersects with this Rectangle object, returns the area of - * intersection as a Rectangle object. If the rectangles do not intersect, - * this method returns an empty Rectangle object with its properties set to - * 0. - * - * @param toIntersect The Rectangle object to compare against to see if it - * intersects with this Rectangle object. - * @return A Rectangle object that equals the area of intersection. If the - * rectangles do not intersect, this method returns an empty - * Rectangle object; that is, a rectangle with its x, - * y, width, and height - * properties set to 0. - */ - Rectangle.prototype.intersection = function (toIntersect) { - if (this.intersects(toIntersect)) { - var i = new Rectangle(); - - if (this.x > toIntersect.x) { - i.x = this.x; - i.width = toIntersect.x - this.x + toIntersect.width; - - if (i.width > this.width) - i.width = this.width; - } else { - i.x = toIntersect.x; - i.width = this.x - toIntersect.x + this.width; - - if (i.width > toIntersect.width) - i.width = toIntersect.width; - } - - if (this.y > toIntersect.y) { - i.y = this.y; - i.height = toIntersect.y - this.y + toIntersect.height; - - if (i.height > this.height) - i.height = this.height; - } else { - i.y = toIntersect.y; - i.height = this.y - toIntersect.y + this.height; - - if (i.height > toIntersect.height) - i.height = toIntersect.height; - } - - return i; - } - - return new Rectangle(); - }; - - /** - * Determines whether the object specified in the toIntersect - * parameter intersects with this Rectangle object. This method checks the - * x, y, width, and - * height properties of the specified Rectangle object to see if - * it intersects with this Rectangle object. - * - * @param toIntersect The Rectangle object to compare against this Rectangle - * object. - * @return A value of true if the specified object intersects - * with this Rectangle object; otherwise false. - */ - Rectangle.prototype.intersects = function (toIntersect) { - return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height); - }; - - /** - * Determines whether or not this Rectangle object is empty. - * - * @return A value of true if the Rectangle object's width or - * height is less than or equal to 0; otherwise false. - */ - Rectangle.prototype.isEmpty = function () { - return (this.x == 0 && this.y == 0 && this.width == 0 && this.height == 0); - }; - - /** - * Adjusts the location of the Rectangle object, as determined by its - * top-left corner, by the specified amounts. - * - * @param dx Moves the x value of the Rectangle object by this amount. - * @param dy Moves the y value of the Rectangle object by this amount. - */ - Rectangle.prototype.offset = function (dx, dy) { - this.x += dx; - this.y += dy; - }; - - /** - * Adjusts the location of the Rectangle object using a Point object as a - * parameter. This method is similar to the Rectangle.offset() - * method, except that it takes a Point object as a parameter. - * - * @param point A Point object to use to offset this Rectangle object. - */ - Rectangle.prototype.offsetPoint = function (point) { - this.x += point.x; - this.y += point.y; - }; - - /** - * Sets all of the Rectangle object's properties to 0. A Rectangle object is - * empty if its width or height is less than or equal to 0. - * - *

This method sets the values of the x, y, - * width, and height properties to 0.

- * - */ - Rectangle.prototype.setEmpty = function () { - this.x = 0; - this.y = 0; - this.width = 0; - this.height = 0; - }; - - /** - * Sets the members of Rectangle to the specified values - * - * @param xa The x coordinate of the top-left corner of the - * rectangle. - * @param ya The y coordinate of the top-left corner of the - * rectangle. - * @param widtha The width of the rectangle, in pixels. - * @param heighta The height of the rectangle, in pixels. - */ - Rectangle.prototype.setTo = function (xa, ya, widtha, heighta) { - this.x = xa; - this.y = ya; - this.width = widtha; - this.height = heighta; - }; - - /** - * Builds and returns a string that lists the horizontal and vertical - * positions and the width and height of the Rectangle object. - * - * @return A string listing the value of each of the following properties of - * the Rectangle object: x, y, - * width, and height. - */ - Rectangle.prototype.toString = function () { - return "[Rectangle] (x=" + this.x + ", y=" + this.y + ", width=" + this.width + ", height=" + this.height + ")"; - }; - - /** - * Adds two rectangles together to create a new Rectangle object, by filling - * in the horizontal and vertical space between the two rectangles. - * - *

Note: The union() method ignores rectangles with - * 0 as the height or width value, such as: var - * rect2:Rectangle = new Rectangle(300,300,50,0);

- * - * @param toUnion A Rectangle object to add to this Rectangle object. - * @return A new Rectangle object that is the union of the two rectangles. - */ - Rectangle.prototype.union = function (toUnion) { - var u = new Rectangle(); - - if (this.x < toUnion.x) { - u.x = this.x; - u.width = toUnion.x - this.x + toUnion.width; - - if (u.width < this.width) - u.width = this.width; - } else { - u.x = toUnion.x; - u.width = this.x - toUnion.x + this.width; - - if (u.width < toUnion.width) - u.width = toUnion.width; - } - - if (this.y < toUnion.y) { - u.y = this.y; - u.height = toUnion.y - this.y + toUnion.height; - - if (u.height < this.height) - u.height = this.height; - } else { - u.y = toUnion.y; - u.height = this.y - toUnion.y + this.height; - - if (u.height < toUnion.height) - u.height = toUnion.height; - } - - return u; - }; - return Rectangle; - })(); - geom.Rectangle = Rectangle; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The Transform class provides access to color adjustment properties and two- - * or three-dimensional transformation objects that can be applied to a - * display object. During the transformation, the color or the orientation and - * position of a display object is adjusted(offset) from the current values - * or coordinates to new values or coordinates. The Transform class also - * collects data about color and two-dimensional matrix transformations that - * are applied to a display object and all of its parent objects. You can - * access these combined transformations through the - * concatenatedColorTransform and concatenatedMatrix - * properties. - * - *

To apply color transformations: create a ColorTransform object, set the - * color adjustments using the object's methods and properties, and then - * assign the colorTransformation property of the - * transform property of the display object to the new - * ColorTransformation object.

- * - *

To apply two-dimensional transformations: create a Matrix object, set - * the matrix's two-dimensional transformation, and then assign the - * transform.matrix property of the display object to the new - * Matrix object.

- * - *

To apply three-dimensional transformations: start with a - * three-dimensional display object. A three-dimensional display object has a - * z property value other than zero. You do not need to create - * the Matrix3D object. For all three-dimensional objects, a Matrix3D object - * is created automatically when you assign a z value to a - * display object. You can access the display object's Matrix3D object through - * the display object's transform property. Using the methods of - * the Matrix3D class, you can add to or modify the existing transformation - * settings. Also, you can create a custom Matrix3D object, set the custom - * Matrix3D object's transformation elements, and then assign the new Matrix3D - * object to the display object using the transform.matrix - * property.

- * - *

To modify a perspective projection of the stage or root object: use the - * transform.matrix property of the root display object to gain - * access to the PerspectiveProjection object. Or, apply different perspective - * projection properties to a display object by setting the perspective - * projection properties of the display object's parent. The child display - * object inherits the new properties. Specifically, create a - * PerspectiveProjection object and set its properties, then assign the - * PerspectiveProjection object to the perspectiveProjection - * property of the parent display object's transform property. - * The specified projection transformation then applies to all the display - * object's three-dimensional children.

- * - *

Since both PerspectiveProjection and Matrix3D objects perform - * perspective transformations, do not assign both to a display object at the - * same time. Use the PerspectiveProjection object for focal length and - * projection center changes. For more control over the perspective - * transformation, create a perspective projection Matrix3D object.

- */ - (function (geom) { - var Transform = (function () { - function Transform(displayObject) { - this._position = new away.geom.Vector3D(); - this._displayObject = displayObject; - } - Object.defineProperty(Transform.prototype, "backVector", { - /** - * - */ - get: function () { - var director = away.geom.Matrix3DUtils.getForward(this._displayObject._iMatrix3D); - director.negate(); - - return director; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Transform.prototype, "concatenatedColorTransform", { - /** - * A ColorTransform object representing the combined color transformations - * applied to the display object and all of its parent objects, back to the - * root level. If different color transformations have been applied at - * different levels, all of those transformations are concatenated into one - * ColorTransform object for this property. - */ - get: function () { - return this._concatenatedColorTransform; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Transform.prototype, "concatenatedMatrix", { - /** - * A Matrix object representing the combined transformation matrixes of the - * display object and all of its parent objects, back to the root level. If - * different transformation matrixes have been applied at different levels, - * all of those matrixes are concatenated into one matrix for this property. - * Also, for resizeable SWF content running in the browser, this property - * factors in the difference between stage coordinates and window coordinates - * due to window resizing. Thus, the property converts local coordinates to - * window coordinates, which may not be the same coordinate space as that of - * the Stage. - */ - get: function () { - return this._concatenatedMatrix; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Transform.prototype, "downVector", { - /** - * - */ - get: function () { - var director = away.geom.Matrix3DUtils.getUp(this._displayObject._iMatrix3D); - director.negate(); - - return director; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Transform.prototype, "forwardVector", { - /** - * - */ - get: function () { - return away.geom.Matrix3DUtils.getForward(this._displayObject._iMatrix3D); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Transform.prototype, "leftVector", { - /** - * - */ - get: function () { - var director = away.geom.Matrix3DUtils.getRight(this._displayObject._iMatrix3D); - director.negate(); - - return director; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Transform.prototype, "matrix3D", { - /** - * Provides access to the Matrix3D object of a three-dimensional display - * object. The Matrix3D object represents a transformation matrix that - * determines the display object's position and orientation. A Matrix3D - * object can also perform perspective projection. - * - *

If the matrix property is set to a value(not - * null), the matrix3D property is - * null. And if the matrix3D property is set to a - * value(not null), the matrix property is - * null.

- */ - get: function () { - return this._displayObject._iMatrix3D; - }, - set: function (val) { - this._displayObject._iMatrix3D = val; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Transform.prototype, "pixelBounds", { - /** - * A Rectangle object that defines the bounding rectangle of the display - * object on the stage. - */ - get: function () { - return this._pixelBounds; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Transform.prototype, "position", { - /** - * Defines the position of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - get: function () { - return this._displayObject._iMatrix3D.position; - }, - set: function (value) { - this._displayObject.x = value.x; - this._displayObject.y = value.y; - this._displayObject.z = value.z; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Transform.prototype, "rightVector", { - /** - * - */ - get: function () { - return away.geom.Matrix3DUtils.getRight(this._displayObject._iMatrix3D); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Transform.prototype, "rotation", { - /** - * Defines the rotation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - get: function () { - return new geom.Vector3D(this._displayObject.rotationX, this._displayObject.rotationY, this._displayObject.rotationZ); - }, - set: function (value) { - this._displayObject.rotationX = value.x; - this._displayObject.rotationY = value.y; - this._displayObject.rotationZ = value.z; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Transform.prototype, "scale", { - /** - * Defines the scale of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - get: function () { - return new geom.Vector3D(this._displayObject.scaleX, this._displayObject.scaleY, this._displayObject.scaleZ); - }, - set: function (value) { - this._displayObject.scaleX = value.x; - this._displayObject.scaleY = value.y; - this._displayObject.scaleZ = value.z; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Transform.prototype, "upVector", { - /** - * - */ - get: function () { - return away.geom.Matrix3DUtils.getUp(this._displayObject._iMatrix3D); - }, - enumerable: true, - configurable: true - }); - - /** - * Returns a Matrix3D object, which can transform the space of a specified - * display object in relation to the current display object's space. You can - * use the getRelativeMatrix3D() method to move one - * three-dimensional display object relative to another three-dimensional - * display object. - * - * @param relativeTo The display object relative to which the transformation - * occurs. To get a Matrix3D object relative to the stage, - * set the parameter to the root or - * stage object. To get the world-relative - * matrix of the display object, set the parameter to a - * display object that has a perspective transformation - * applied to it. - * @return A Matrix3D object that can be used to transform the space from the - * relativeTo display object to the current display - * object space. - */ - Transform.prototype.getRelativeMatrix3D = function (relativeTo) { - return new geom.Matrix3D(); - }; - - /** - * Moves the 3d object forwards along it's local z axis - * - * @param distance The length of the movement - */ - Transform.prototype.moveForward = function (distance) { - this._displayObject.translateLocal(away.geom.Vector3D.Z_AXIS, distance); - }; - - /** - * Moves the 3d object backwards along it's local z axis - * - * @param distance The length of the movement - */ - Transform.prototype.moveBackward = function (distance) { - this._displayObject.translateLocal(away.geom.Vector3D.Z_AXIS, -distance); - }; - - /** - * Moves the 3d object backwards along it's local x axis - * - * @param distance The length of the movement - */ - Transform.prototype.moveLeft = function (distance) { - this._displayObject.translateLocal(away.geom.Vector3D.X_AXIS, -distance); - }; - - /** - * Moves the 3d object forwards along it's local x axis - * - * @param distance The length of the movement - */ - Transform.prototype.moveRight = function (distance) { - this._displayObject.translateLocal(away.geom.Vector3D.X_AXIS, distance); - }; - - /** - * Moves the 3d object forwards along it's local y axis - * - * @param distance The length of the movement - */ - Transform.prototype.moveUp = function (distance) { - this._displayObject.translateLocal(away.geom.Vector3D.Y_AXIS, distance); - }; - - /** - * Moves the 3d object backwards along it's local y axis - * - * @param distance The length of the movement - */ - Transform.prototype.moveDown = function (distance) { - this._displayObject.translateLocal(away.geom.Vector3D.Y_AXIS, -distance); - }; - return Transform; - })(); - geom.Transform = Transform; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (geom) { - var UVTransform = (function () { - function UVTransform() { - this._uvMatrix = new away.geom.Matrix(); - this._rotation = 0; - this._scaleU = 1; - this._scaleV = 1; - this._offsetU = 0; - this._offsetV = 0; - } - Object.defineProperty(UVTransform.prototype, "offsetU", { - /** - * - */ - get: function () { - return this._offsetU; - }, - set: function (value) { - if (value == this._offsetU) - return; - - this._offsetU = value; - this._uvMatrixDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(UVTransform.prototype, "offsetV", { - /** - * - */ - get: function () { - return this._offsetV; - }, - set: function (value) { - if (value == this._offsetV) - return; - - this._offsetV = value; - this._uvMatrixDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(UVTransform.prototype, "rotation", { - /** - * - */ - get: function () { - return this._rotation; - }, - set: function (value) { - if (value == this._rotation) - return; - - this._rotation = value; - - this._uvMatrixDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(UVTransform.prototype, "scaleU", { - /** - * - */ - get: function () { - return this._scaleU; - }, - set: function (value) { - if (value == this._scaleU) - return; - - this._scaleU = value; - - this._uvMatrixDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(UVTransform.prototype, "scaleV", { - /** - * - */ - get: function () { - return this._scaleV; - }, - set: function (value) { - if (value == this._scaleV) - return; - - this._scaleV = value; - - this._uvMatrixDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(UVTransform.prototype, "matrix", { - /** - * - */ - get: function () { - if (this._uvMatrixDirty) - this.updateUVMatrix(); - - return this._uvMatrix; - }, - enumerable: true, - configurable: true - }); - - /** - * @private - */ - UVTransform.prototype.updateUVMatrix = function () { - this._uvMatrix.identity(); - - if (this._rotation != 0) - this._uvMatrix.rotate(this._rotation); - - if (this._scaleU != 1 || this._scaleV != 1) - this._uvMatrix.scale(this._scaleU, this._scaleV); - - this._uvMatrix.translate(this._offsetU, this._offsetV); - - this._uvMatrixDirty = false; - }; - return UVTransform; - })(); - geom.UVTransform = UVTransform; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The Vector3D class represents a point or a location in the three-dimensional - * space using the Cartesian coordinates x, y, and z. As in a two-dimensional - * space, the x property represents the horizontal axis and the y property - * represents the vertical axis. In three-dimensional space, the z property - * represents depth. The value of the x property increases as the object moves - * to the right. The value of the y property increases as the object moves - * down. The z property increases as the object moves farther from the point - * of view. Using perspective projection and scaling, the object is seen to be - * bigger when near and smaller when farther away from the screen. As in a - * right-handed three-dimensional coordinate system, the positive z-axis points - * away from the viewer and the value of the z property increases as the object - * moves away from the viewer's eye. The origin point (0,0,0) of the global - * space is the upper-left corner of the stage. - * - *

The Vector3D class can also represent a direction, an arrow pointing from - * the origin of the coordinates, such as (0,0,0), to an endpoint; or a - * floating-point component of an RGB (Red, Green, Blue) color model.

- * - *

Quaternion notation introduces a fourth element, the w property, which - * provides additional orientation information. For example, the w property can - * define an angle of rotation of a Vector3D object. The combination of the - * angle of rotation and the coordinates x, y, and z can determine the display - * object's orientation. Here is a representation of Vector3D elements in - * matrix notation:

- */ - (function (geom) { - var Vector3D = (function () { - /** - * Creates an instance of a Vector3D object. If you do not specify a - * parameter for the constructor, a Vector3D object is created with - * the elements (0,0,0,0). - * - * @param x The first element, such as the x coordinate. - * @param y The second element, such as the y coordinate. - * @param z The third element, such as the z coordinate. - * @param w An optional element for additional data such as the angle - * of rotation. - */ - function Vector3D(x, y, z, w) { - if (typeof x === "undefined") { x = 0; } - if (typeof y === "undefined") { y = 0; } - if (typeof z === "undefined") { z = 0; } - if (typeof w === "undefined") { w = 0; } - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - Object.defineProperty(Vector3D.prototype, "length", { - /** - * The length, magnitude, of the current Vector3D object from the - * origin (0,0,0) to the object's x, y, and z coordinates. The w - * property is ignored. A unit vector has a length or magnitude of - * one. - */ - get: function () { - return Math.sqrt(this.lengthSquared); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Vector3D.prototype, "lengthSquared", { - /** - * The square of the length of the current Vector3D object, calculated - * using the x, y, and z properties. The w property is ignored. Use the - * lengthSquared() method whenever possible instead of the - * slower Math.sqrt() method call of the - * Vector3D.length() method. - */ - get: function () { - return this.x * this.x + this.y * this.y + this.z * this.z; - }, - enumerable: true, - configurable: true - }); - - /** - * Adds the value of the x, y, and z elements of the current Vector3D - * object to the values of the x, y, and z elements of another Vector3D - * object. The add() method does not change the current - * Vector3D object. Instead, it returns a new Vector3D object with - * the new values. - * - *

The result of adding two vectors together is a resultant vector. - * One way to visualize the result is by drawing a vector from the - * origin or tail of the first vector to the end or head of the second - * vector. The resultant vector is the distance between the origin - * point of the first vector and the end point of the second vector. - *

- */ - Vector3D.prototype.add = function (a) { - return new Vector3D(this.x + a.x, this.y + a.y, this.z + a.z, this.w + a.w); - }; - - /** - * Returns the angle in radians between two vectors. The returned angle - * is the smallest radian the first Vector3D object rotates until it - * aligns with the second Vector3D object. - * - *

The angleBetween() method is a static method. You - * can use it directly as a method of the Vector3D class.

- * - *

To convert a degree to a radian, you can use the following - * formula:

- * - *

radian = Math.PI/180 * degree

- * - * @param a The first Vector3D object. - * @param b The second Vector3D object. - * @returns The angle between two Vector3D objects. - */ - Vector3D.angleBetween = function (a, b) { - return Math.acos(a.dotProduct(b) / (a.length * b.length)); - }; - - /** - * Returns a new Vector3D object that is an exact copy of the current - * Vector3D object. - * - * @returns A new Vector3D object that is a copy of the current - * Vector3D object. - */ - Vector3D.prototype.clone = function () { - return new Vector3D(this.x, this.y, this.z, this.w); - }; - - /** - * Copies all of vector data from the source Vector3D object into the - * calling Vector3D object. - * - * @param src The Vector3D object from which to copy the data. - */ - Vector3D.prototype.copyFrom = function (src) { - this.x = src.x; - this.y = src.y; - this.z = src.z; - this.w = src.w; - }; - - /** - * Returns a new Vector3D object that is perpendicular (at a right - * angle) to the current Vector3D and another Vector3D object. If the - * returned Vector3D object's coordinates are (0,0,0), then the two - * Vector3D objects are parallel to each other. - * - *

You can use the normalized cross product of two vertices of a - * polygon surface with the normalized vector of the camera or eye - * viewpoint to get a dot product. The value of the dot product can - * identify whether a surface of a three-dimensional object is hidden - * from the viewpoint.

- * - * @param a A second Vector3D object. - * @returns A new Vector3D object that is perpendicular to the current - * Vector3D object and the Vector3D object specified as the - * parameter. - */ - Vector3D.prototype.crossProduct = function (a) { - return new 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); - }; - - /** - * Decrements the value of the x, y, and z elements of the current - * Vector3D object by the values of the x, y, and z elements of - * specified Vector3D object. Unlike the - * Vector3D.subtract() method, the - * decrementBy() method changes the current Vector3D - * object and does not return a new Vector3D object. - * - * @param a The Vector3D object containing the values to subtract from - * the current Vector3D object. - */ - Vector3D.prototype.decrementBy = function (a) { - this.x -= a.x; - this.y -= a.y; - this.z -= a.z; - }; - - /** - * Returns the distance between two Vector3D objects. The - * distance() method is a static method. You can use it - * directly as a method of the Vector3D class to get the Euclidean - * distance between two three-dimensional points. - * - * @param pt1 A Vector3D object as the first three-dimensional point. - * @param pt2 A Vector3D object as the second three-dimensional point. - * @returns The distance between two Vector3D objects. - */ - Vector3D.distance = function (pt1, pt2) { - var x = (pt1.x - pt2.x); - var y = (pt1.y - pt2.y); - var z = (pt1.z - pt2.z); - return Math.sqrt(x * x + y * y + z * z); - }; - - /** - * If the current Vector3D object and the one specified as the - * parameter are unit vertices, this method returns the cosine of the - * angle between the two vertices. Unit vertices are vertices that - * point to the same direction but their length is one. They remove the - * length of the vector as a factor in the result. You can use the - * normalize() method to convert a vector to a unit - * vector. - * - *

The dotProduct() method finds the angle between two - * vertices. It is also used in backface culling or lighting - * calculations. Backface culling is a procedure for determining which - * surfaces are hidden from the viewpoint. You can use the normalized - * vertices from the camera, or eye, viewpoint and the cross product of - * the vertices of a polygon surface to get the dot product. If the dot - * product is less than zero, then the surface is facing the camera or - * the viewer. If the two unit vertices are perpendicular to each - * other, they are orthogonal and the dot product is zero. If the two - * vertices are parallel to each other, the dot product is one.

- * - * @param a The second Vector3D object. - * @returns A scalar which is the dot product of the current Vector3D - * object and the specified Vector3D object. - * - * @see away.geom.Vector3D#crossProduct() - * @see away.geom.Vector3D#normalize() - */ - Vector3D.prototype.dotProduct = function (a) { - return this.x * a.x + this.y * a.y + this.z * a.z; - }; - - /** - * Determines whether two Vector3D objects are equal by comparing the - * x, y, and z elements of the current Vector3D object with a - * specified Vector3D object. If the values of these elements are the - * same, the two Vector3D objects are equal. If the second optional - * parameter is set to true, all four elements of the Vector3D objects, - * including the w property, are compared. - */ - /** - * - * @param toCompare The Vector3D object to be compared with the current - * Vector3D object. - * @param allFour An optional parameter that specifies whether the w - * property of the Vector3D objects is used in the - * comparison. - * @returns A value of true if the specified Vector3D object is equal - * to the current Vector3D object; false if it is not equal. - */ - Vector3D.prototype.equals = function (toCompare, allFour) { - if (typeof allFour === "undefined") { allFour = false; } - return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && (!allFour || this.w == toCompare.w)); - }; - - /** - * Increments the value of the x, y, and z elements of the current - * Vector3D object by the values of the x, y, and z elements of a - * specified Vector3D object. Unlike the Vector3D.add() - * method, the incrementBy() method changes the current - * Vector3D object and does not return a new Vector3D object. - * - * @param a The Vector3D object to be added to the current Vector3D - * object. - */ - Vector3D.prototype.incrementBy = function (a) { - this.x += a.x; - this.y += a.y; - this.z += a.z; - }; - - /** - * Compares the elements of the current Vector3D object with the - * elements of a specified Vector3D object to determine whether they - * are nearly equal. The two Vector3D objects are nearly equal if the - * value of all the elements of the two vertices are equal, or the - * result of the comparison is within the tolerance range. The - * difference between two elements must be less than the number - * specified as the tolerance parameter. If the third optional - * parameter is set to true, all four elements of the - * Vector3D objects, including the w property, are - * compared. Otherwise, only the x, y, and z elements are included in - * the comparison. - */ - /** - * - * @param toCompare The Vector3D object to be compared with the current - * Vector3D object. - * @param tolerance A number determining the tolerance factor. If the - * difference between the values of the Vector3D - * element specified in the toCompare parameter and - * the current Vector3D element is less than the - * tolerance number, the two values are considered - * nearly equal. - * @param allFour An optional parameter that specifies whether the w - * property of the Vector3D objects is used in the - * comparison. - * @returns A value of true if the specified Vector3D object is nearly - * equal to the current Vector3D object; false if it is not - * equal. - * - * @see away.geom.Vector3D#equals() - */ - Vector3D.prototype.nearEquals = function (toCompare, tolerance, allFour) { - if (typeof allFour === "undefined") { allFour = true; } - 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)); - }; - - /** - * Sets the current Vector3D object to its inverse. The inverse object - * is also considered the opposite of the original object. The value of - * the x, y, and z properties of the current Vector3D object is changed - * to -x, -y, and -z. - */ - Vector3D.prototype.negate = function () { - this.x = -this.x; - this.y = -this.y; - this.z = -this.z; - }; - - /** - * Converts a Vector3D object to a unit vector by dividing the first - * three elements (x, y, z) by the length of the vector. Unit vertices - * are vertices that have a direction but their length is one. They - * simplify vector calculations by removing length as a factor. - */ - /** - * Scales the line segment between(0,0) and the current point to a set - * length. - * - * @param thickness The scaling value. For example, if the current - * Vector3D object is (0,3,4), and you normalize it to - * 1, the point returned is at(0,0.6,0.8). - */ - Vector3D.prototype.normalize = function (thickness) { - if (typeof thickness === "undefined") { thickness = 1; } - if (this.length != 0) { - var invLength = thickness / this.length; - this.x *= invLength; - this.y *= invLength; - this.z *= invLength; - return; - } - }; - - /** - * Divides the value of the x, y, and - * z properties of the current Vector3D object by the - * value of its w property. - * - *

If the current Vector3D object is the result of multiplying a - * Vector3D object by a projection Matrix3D object, the w property can - * hold the transform value. The project() method then can - * complete the projection by dividing the elements by the - * w property. Use the Matrix3D.rawData - * property to create a projection Matrix3D object.

- */ - Vector3D.prototype.project = function () { - this.x /= this.w; - this.y /= this.w; - this.z /= this.w; - }; - - /** - * Scales the current Vector3D object by a scalar, a magnitude. The - * Vector3D object's x, y, and z elements are multiplied by the scalar - * number specified in the parameter. For example, if the vector is - * scaled by ten, the result is a vector that is ten times longer. The - * scalar can also change the direction of the vector. Multiplying the - * vector by a negative number reverses its direction. - * - * @param s A multiplier (scalar) used to scale a Vector3D object. - - */ - Vector3D.prototype.scaleBy = function (s) { - this.x *= s; - this.y *= s; - this.z *= s; - }; - - /** - * Sets the members of Vector3D to the specified values - * - * @param xa The first element, such as the x coordinate. - * @param ya The second element, such as the y coordinate. - * @param za The third element, such as the z coordinate. - */ - Vector3D.prototype.setTo = function (xa, ya, za) { - this.x = xa; - this.y = ya; - this.z = za; - }; - - /** - * Subtracts the value of the x, y, and z elements of the current - * Vector3D object from the values of the x, y, and z elements of - * another Vector3D object. The subtract() method does not - * change the current Vector3D object. Instead, this method returns a - * new Vector3D object with the new values. - * - * @param a The Vector3D object to be subtracted from the current - * Vector3D object. - * @returns A new Vector3D object that is the difference between the - * current Vector3D and the specified Vector3D object. - * - * @see away.geom.Vector3D#decrementBy() - */ - Vector3D.prototype.subtract = function (a) { - return new Vector3D(this.x - a.x, this.y - a.y, this.z - a.z); - }; - - /** - * Returns a string representation of the current Vector3D object. The - * string contains the values of the x, y, and z properties. - */ - Vector3D.prototype.toString = function () { - return "[Vector3D] (x:" + this.x + " ,y:" + this.y + ", z" + this.z + ", w:" + this.w + ")"; - }; - Vector3D.X_AXIS = new Vector3D(1, 0, 0); - - Vector3D.Y_AXIS = new Vector3D(0, 1, 0); - - Vector3D.Z_AXIS = new Vector3D(0, 0, 1); - return Vector3D; - })(); - geom.Vector3D = Vector3D; - })(away.geom || (away.geom = {})); - var geom = away.geom; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (_bounds) { - var Box = away.geom.Box; - - var BoundingVolumeBase = (function () { - function BoundingVolumeBase() { - this._pAabbPoints = new Array(); - this._pAabbPointsDirty = true; - this._aabb = new Box(); - } - Object.defineProperty(BoundingVolumeBase.prototype, "aabb", { - get: function () { - return this._aabb; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(BoundingVolumeBase.prototype, "aabbPoints", { - get: function () { - if (this._pAabbPointsDirty) - this.pUpdateAABBPoints(); - - return this._pAabbPoints; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(BoundingVolumeBase.prototype, "boundingEntity", { - get: function () { - if (!this._pBoundingEntity) { - this._pBoundingEntity = this.pCreateBoundingEntity(); - this.pUpdateBoundingEntity(); - } - - return this._pBoundingEntity; - }, - enumerable: true, - configurable: true - }); - - BoundingVolumeBase.prototype.nullify = function () { - this._aabb.x = this._aabb.y = this._aabb.z = 0; - this._aabb.width = this._aabb.height = this._aabb.depth = 0; - this._pAabbPointsDirty = true; - - if (this._pBoundingEntity) - this.pUpdateBoundingEntity(); - }; - - BoundingVolumeBase.prototype.disposeRenderable = function () { - if (this._pBoundingEntity) - this._pBoundingEntity.dispose(); - - this._pBoundingEntity = null; - }; - - BoundingVolumeBase.prototype.fromVertices = function (vertices) { - var i; - var len = vertices.length; - var minX, minY, minZ; - var maxX, maxY, maxZ; - - if (len == 0) { - this.nullify(); - return; - } - - var v; - - minX = maxX = vertices[i++]; - minY = maxY = vertices[i++]; - minZ = maxZ = vertices[i++]; - - while (i < len) { - v = vertices[i++]; - if (v < minX) - minX = v; - else if (v > maxX) - maxX = v; - v = vertices[i++]; - if (v < minY) - minY = v; - else if (v > maxY) - maxY = v; - v = vertices[i++]; - if (v < minZ) - minZ = v; - else if (v > maxZ) - maxZ = v; - } - - this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); - }; - - /** - * Updates the bounds to fit a Geometry object. - * - * @param geometry The Geometry object to be bounded. - */ - BoundingVolumeBase.prototype.fromGeometry = function (geometry) { - var i, j, p; - var subGeoms = geometry.subGeometries; - var subGeom; - var boundingPositions; - var numSubGeoms = subGeoms.length; - var minX, minY, minZ; - var maxX, maxY, maxZ; - - if (numSubGeoms > 0) { - i = 0; - subGeom = subGeoms[0]; - boundingPositions = subGeom.getBoundingPositions(); - minX = maxX = boundingPositions[i]; - minY = maxY = boundingPositions[i + 1]; - minZ = maxZ = boundingPositions[i + 2]; - - j = numSubGeoms; - while (j--) { - subGeom = subGeoms[j]; - boundingPositions = subGeom.getBoundingPositions(); - i = boundingPositions.length; - while (i--) { - p = boundingPositions[i]; - if (p < minX) - minX = p; - else if (p > maxX) - maxX = p; - - p = boundingPositions[i + 1]; - - if (p < minY) - minY = p; - else if (p > maxY) - maxY = p; - - p = boundingPositions[i + 2]; - - if (p < minZ) - minZ = p; - else if (p > maxZ) - maxZ = p; - } - } - - this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); - } else { - this.fromExtremes(0, 0, 0, 0, 0, 0); - } - }; - - BoundingVolumeBase.prototype.fromSphere = function (center, radius) { - this.fromExtremes(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius); - }; - - BoundingVolumeBase.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { - this._aabb.x = minX; - this._aabb.y = maxY; - this._aabb.z = minZ; - this._aabb.width = maxX - minX; - this._aabb.height = maxY - minY; - this._aabb.depth = maxZ - minZ; - this._pAabbPointsDirty = true; - - if (this._pBoundingEntity) - this.pUpdateBoundingEntity(); - }; - - BoundingVolumeBase.prototype.isInFrustum = function (planes, numPlanes) { - throw new away.errors.AbstractMethodError(); - }; - - BoundingVolumeBase.prototype.overlaps = function (bounds) { - return this._aabb.intersects(bounds.aabb); - }; - - BoundingVolumeBase.prototype.clone = function () { - throw new away.errors.AbstractMethodError(); - }; - - BoundingVolumeBase.prototype.rayIntersection = function (position, direction, targetNormal) { - return -1; - }; - - BoundingVolumeBase.prototype.containsPoint = function (position) { - return false; - }; - - BoundingVolumeBase.prototype.pUpdateAABBPoints = function () { - var minX = this._aabb.x; - var minY = this._aabb.y - this._aabb.height; - var minZ = this._aabb.z; - var maxX = this._aabb.x + this._aabb.width; - var maxY = this._aabb.y; - var maxZ = this._aabb.z + this._aabb.depth; - - this._pAabbPoints[0] = minX; - this._pAabbPoints[1] = minY; - this._pAabbPoints[2] = minZ; - this._pAabbPoints[3] = maxX; - this._pAabbPoints[4] = minY; - this._pAabbPoints[5] = minZ; - this._pAabbPoints[6] = minX; - this._pAabbPoints[7] = maxY; - this._pAabbPoints[8] = minZ; - this._pAabbPoints[9] = maxX; - this._pAabbPoints[10] = maxY; - this._pAabbPoints[11] = minZ; - this._pAabbPoints[12] = minX; - this._pAabbPoints[13] = minY; - this._pAabbPoints[14] = maxZ; - this._pAabbPoints[15] = maxX; - this._pAabbPoints[16] = minY; - this._pAabbPoints[17] = maxZ; - this._pAabbPoints[18] = minX; - this._pAabbPoints[19] = maxY; - this._pAabbPoints[20] = maxZ; - this._pAabbPoints[21] = maxX; - this._pAabbPoints[22] = maxY; - this._pAabbPoints[23] = maxZ; - this._pAabbPointsDirty = false; - }; - - BoundingVolumeBase.prototype.pUpdateBoundingEntity = function () { - throw new away.errors.AbstractMethodError(); - }; - - BoundingVolumeBase.prototype.pCreateBoundingEntity = function () { - throw new away.errors.AbstractMethodError(); - }; - - BoundingVolumeBase.prototype.classifyToPlane = function (plane) { - throw new away.errors.AbstractMethodError(); - }; - - BoundingVolumeBase.prototype.transformFrom = function (bounds, matrix) { - throw new away.errors.AbstractMethodError(); - }; - return BoundingVolumeBase; - })(); - _bounds.BoundingVolumeBase = BoundingVolumeBase; - })(away.bounds || (away.bounds = {})); - var bounds = away.bounds; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (_bounds) { - var PlaneClassification = away.geom.PlaneClassification; - - var NullBounds = (function (_super) { - __extends(NullBounds, _super); - function NullBounds(alwaysIn) { - if (typeof alwaysIn === "undefined") { alwaysIn = true; } - _super.call(this); - - this._alwaysIn = alwaysIn; - - this._aabb.width = this._aabb.height = this._aabb.depth = Number.POSITIVE_INFINITY; - this._aabb.x = this._aabb.y = this._aabb.z = this._alwaysIn ? Number.NEGATIVE_INFINITY / 2 : Number.POSITIVE_INFINITY; - } - //@override - NullBounds.prototype.clone = function () { - return new NullBounds(this._alwaysIn); - }; - - //@override - NullBounds.prototype.pCreateBoundingEntity = function () { - //return this._renderable || new away.primitives.WireframeSphere( 100, 16, 12, 0xffffff, 0.5 ); - return null; - }; - - //@override - NullBounds.prototype.isInFrustum = function (planes, numPlanes) { - return this._alwaysIn; - }; - - // //@override - // public fromGeometry(geometry:away.base.Geometry) - // { - // } - //@override - NullBounds.prototype.fromSphere = function (center, radius) { - }; - - //@override - NullBounds.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { - }; - - NullBounds.prototype.classifyToPlane = function (plane) { - return PlaneClassification.INTERSECT; - }; - - //@override - NullBounds.prototype.transformFrom = function (bounds, matrix) { - this._alwaysIn = bounds._alwaysIn; - }; - return NullBounds; - })(_bounds.BoundingVolumeBase); - _bounds.NullBounds = NullBounds; - })(away.bounds || (away.bounds = {})); - var bounds = away.bounds; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (_bounds) { - var PlaneClassification = away.geom.PlaneClassification; - - var Vector3D = away.geom.Vector3D; - - var BoundingSphere = (function (_super) { - __extends(BoundingSphere, _super); - function BoundingSphere() { - _super.call(this); - this._radius = 0; - this._centerX = 0; - this._centerY = 0; - this._centerZ = 0; - } - Object.defineProperty(BoundingSphere.prototype, "radius", { - get: function () { - return this._radius; - }, - enumerable: true, - configurable: true - }); - - BoundingSphere.prototype.nullify = function () { - _super.prototype.nullify.call(this); - this._centerX = this._centerY = this._centerZ = 0; - this._radius = 0; - }; - - BoundingSphere.prototype.isInFrustum = function (planes, numPlanes) { - for (var i = 0; i < numPlanes; ++i) { - var plane = planes[i]; - var flippedExtentX = plane.a < 0 ? -this._radius : this._radius; - var flippedExtentY = plane.b < 0 ? -this._radius : this._radius; - var flippedExtentZ = plane.c < 0 ? -this._radius : this._radius; - var projDist = plane.a * (this._centerX + flippedExtentX) + plane.b * (this._centerY + flippedExtentY) + plane.c * (this._centerZ + flippedExtentZ) - plane.d; - if (projDist < 0) { - return false; - } - } - return true; - }; - - BoundingSphere.prototype.fromSphere = function (center, radius) { - this._centerX = center.x; - this._centerY = center.y; - this._centerZ = center.z; - this._radius = radius; - this._aabb.width = this._aabb.height = this._aabb.depth = radius * 2; - this._aabb.x = this._centerX - radius; - this._aabb.y = this._centerY + radius; - this._aabb.z = this._centerZ - radius; - this._pAabbPointsDirty = true; - - if (this._pBoundingEntity) - this.pUpdateBoundingEntity(); - }; - - BoundingSphere.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { - this._centerX = (maxX + minX) * .5; - this._centerY = (maxY + minY) * .5; - this._centerZ = (maxZ + minZ) * .5; - - var d = maxX - minX; - var y = maxY - minY; - var z = maxZ - minZ; - - if (y > d) - d = y; - - if (z > d) - d = z; - - this._radius = d * Math.sqrt(.5); - _super.prototype.fromExtremes.call(this, minX, minY, minZ, maxX, maxY, maxZ); - }; - - BoundingSphere.prototype.clone = function () { - var clone = new BoundingSphere(); - clone.fromSphere(new Vector3D(this._centerX, this._centerY, this._centerZ), this._radius); - return clone; - }; - - BoundingSphere.prototype.rayIntersection = function (position, direction, targetNormal) { - if (this.containsPoint(position)) { - return 0; - } - - var px = position.x - this._centerX, py = position.y - this._centerY, pz = position.z - this._centerZ; - var vx = direction.x, vy = direction.y, vz = direction.z; - var rayEntryDistance; - - var a = vx * vx + vy * vy + vz * vz; - var b = 2 * (px * vx + py * vy + pz * vz); - var c = px * px + py * py + pz * pz - this._radius * this._radius; - var det = b * b - 4 * a * c; - - if (det >= 0) { - var sqrtDet = Math.sqrt(det); - rayEntryDistance = (-b - sqrtDet) / (2 * a); - if (rayEntryDistance >= 0) { - targetNormal.x = px + rayEntryDistance * vx; - targetNormal.y = py + rayEntryDistance * vy; - targetNormal.z = pz + rayEntryDistance * vz; - targetNormal.normalize(); - - return rayEntryDistance; - } - } - - // ray misses sphere - return -1; - }; - - BoundingSphere.prototype.containsPoint = function (position) { - var px = position.x - this._centerX; - var py = position.y - this._centerY; - var pz = position.z - this._centerZ; - var distance = Math.sqrt(px * px + py * py + pz * pz); - return distance <= this._radius; - }; - - BoundingSphere.prototype.pUpdateBoundingEntity = function () { - var sc = this._radius; - if (sc == 0) - sc = 0.001; - - var transform = this._pBoundingEntity.transform; - transform.scale = new Vector3D(sc, sc, sc); - transform.position = new Vector3D(this._centerX, this._centerY, this._centerZ); - }; - - // TODO pCreateBoundingRenderable():WireframePrimitiveBase - BoundingSphere.prototype.pCreateBoundingEntity = function () { - return null; - }; - - //@override - BoundingSphere.prototype.classifyToPlane = function (plane) { - var a = plane.a; - var b = plane.b; - var c = plane.c; - var dd = a * this._centerX + b * this._centerY + c * this._centerZ - plane.d; - - if (a < 0) - a = -a; - - if (b < 0) - b = -b; - - if (c < 0) - c = -c; - - var rr = (a + b + c) * this._radius; - - return dd > rr ? PlaneClassification.FRONT : dd < -rr ? PlaneClassification.BACK : PlaneClassification.INTERSECT; - }; - - BoundingSphere.prototype.transformFrom = function (bounds, matrix) { - var sphere = bounds; - var cx = sphere._centerX; - var cy = sphere._centerY; - var cz = sphere._centerZ; - var raw = new Array(16); - - matrix.copyRawDataTo(raw); - - var m11 = raw[0], m12 = raw[4], m13 = raw[8], m14 = raw[12]; - var m21 = raw[1], m22 = raw[5], m23 = raw[9], m24 = raw[13]; - var m31 = raw[2], m32 = raw[6], m33 = raw[10], m34 = raw[14]; - - this._centerX = cx * m11 + cy * m12 + cz * m13 + m14; - this._centerY = cx * m21 + cy * m22 + cz * m23 + m24; - this._centerZ = cx * m31 + cy * m32 + cz * m33 + m34; - - if (m11 < 0) - m11 = -m11; - if (m12 < 0) - m12 = -m12; - if (m13 < 0) - m13 = -m13; - if (m21 < 0) - m21 = -m21; - if (m22 < 0) - m22 = -m22; - if (m23 < 0) - m23 = -m23; - if (m31 < 0) - m31 = -m31; - if (m32 < 0) - m32 = -m32; - if (m33 < 0) - m33 = -m33; - - var r = sphere._radius; - var rx = m11 + m12 + m13; - var ry = m21 + m22 + m23; - var rz = m31 + m32 + m33; - this._radius = r * Math.sqrt(rx * rx + ry * ry + rz * rz); - - this._aabb.width = this._aabb.height = this._aabb.depth = this._radius * 2; - this._aabb.x = this._centerX - this._radius; - this._aabb.y = this._centerY + this._radius; - this._aabb.z = this._centerZ - this._radius; - }; - return BoundingSphere; - })(_bounds.BoundingVolumeBase); - _bounds.BoundingSphere = BoundingSphere; - })(away.bounds || (away.bounds = {})); - var bounds = away.bounds; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (_bounds) { - var Matrix3DUtils = away.geom.Matrix3DUtils; - var PlaneClassification = away.geom.PlaneClassification; - - var Vector3D = away.geom.Vector3D; - - /** - * AxisAlignedBoundingBox represents a bounding box volume that has its planes aligned to the local coordinate axes of the bounded object. - * This is useful for most meshes. - */ - var AxisAlignedBoundingBox = (function (_super) { - __extends(AxisAlignedBoundingBox, _super); - /** - * Creates a new AxisAlignedBoundingBox object. - */ - function AxisAlignedBoundingBox() { - _super.call(this); - this._centerX = 0; - this._centerY = 0; - this._centerZ = 0; - this._halfExtentsX = 0; - this._halfExtentsY = 0; - this._halfExtentsZ = 0; - } - /** - * @inheritDoc - */ - AxisAlignedBoundingBox.prototype.nullify = function () { - _super.prototype.nullify.call(this); - - this._centerX = this._centerY = this._centerZ = 0; - this._halfExtentsX = this._halfExtentsY = this._halfExtentsZ = 0; - }; - - /** - * @inheritDoc - */ - AxisAlignedBoundingBox.prototype.isInFrustum = function (planes, numPlanes) { - for (var i = 0; i < numPlanes; ++i) { - var plane = planes[i]; - var a = plane.a; - var b = plane.b; - var c = plane.c; - var flippedExtentX = a < 0 ? -this._halfExtentsX : this._halfExtentsX; - var flippedExtentY = b < 0 ? -this._halfExtentsY : this._halfExtentsY; - var flippedExtentZ = c < 0 ? -this._halfExtentsZ : this._halfExtentsZ; - var projDist = a * (this._centerX + flippedExtentX) + b * (this._centerY + flippedExtentY) + c * (this._centerZ + flippedExtentZ) - plane.d; - - if (projDist < 0) - return false; - } - - return true; - }; - - AxisAlignedBoundingBox.prototype.rayIntersection = function (position, direction, targetNormal) { - if (this.containsPoint(position)) - return 0; - - var px = position.x - this._centerX; - var py = position.y - this._centerY; - var pz = position.z - this._centerZ; - - var vx = direction.x; - var vy = direction.y; - var vz = direction.z; - - var ix; - var iy; - var iz; - var rayEntryDistance; - - // ray-plane tests - var intersects; - if (vx < 0) { - rayEntryDistance = (this._halfExtentsX - px) / vx; - if (rayEntryDistance > 0) { - iy = py + rayEntryDistance * vy; - iz = pz + rayEntryDistance * vz; - if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { - targetNormal.x = 1; - targetNormal.y = 0; - targetNormal.z = 0; - - intersects = true; - } - } - } - if (!intersects && vx > 0) { - rayEntryDistance = (-this._halfExtentsX - px) / vx; - if (rayEntryDistance > 0) { - iy = py + rayEntryDistance * vy; - iz = pz + rayEntryDistance * vz; - if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { - targetNormal.x = -1; - targetNormal.y = 0; - targetNormal.z = 0; - intersects = true; - } - } - } - if (!intersects && vy < 0) { - rayEntryDistance = (this._halfExtentsY - py) / vy; - if (rayEntryDistance > 0) { - ix = px + rayEntryDistance * vx; - iz = pz + rayEntryDistance * vz; - if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { - targetNormal.x = 0; - targetNormal.y = 1; - targetNormal.z = 0; - intersects = true; - } - } - } - if (!intersects && vy > 0) { - rayEntryDistance = (-this._halfExtentsY - py) / vy; - if (rayEntryDistance > 0) { - ix = px + rayEntryDistance * vx; - iz = pz + rayEntryDistance * vz; - if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { - targetNormal.x = 0; - targetNormal.y = -1; - targetNormal.z = 0; - intersects = true; - } - } - } - if (!intersects && vz < 0) { - rayEntryDistance = (this._halfExtentsZ - pz) / vz; - if (rayEntryDistance > 0) { - ix = px + rayEntryDistance * vx; - iy = py + rayEntryDistance * vy; - if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { - targetNormal.x = 0; - targetNormal.y = 0; - targetNormal.z = 1; - intersects = true; - } - } - } - if (!intersects && vz > 0) { - rayEntryDistance = (-this._halfExtentsZ - pz) / vz; - if (rayEntryDistance > 0) { - ix = px + rayEntryDistance * vx; - iy = py + rayEntryDistance * vy; - if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { - targetNormal.x = 0; - targetNormal.y = 0; - targetNormal.z = -1; - intersects = true; - } - } - } - - return intersects ? rayEntryDistance : -1; - }; - - /** - * @inheritDoc - */ - AxisAlignedBoundingBox.prototype.containsPoint = function (position) { - var px = position.x - this._centerX, py = position.y - this._centerY, pz = position.z - this._centerZ; - return px <= this._halfExtentsX && px >= -this._halfExtentsX && py <= this._halfExtentsY && py >= -this._halfExtentsY && pz <= this._halfExtentsZ && pz >= -this._halfExtentsZ; - }; - - /** - * @inheritDoc - */ - AxisAlignedBoundingBox.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { - this._centerX = (maxX + minX) * .5; - this._centerY = (maxY + minY) * .5; - this._centerZ = (maxZ + minZ) * .5; - this._halfExtentsX = (maxX - minX) * .5; - this._halfExtentsY = (maxY - minY) * .5; - this._halfExtentsZ = (maxZ - minZ) * .5; - - _super.prototype.fromExtremes.call(this, minX, minY, minZ, maxX, maxY, maxZ); - }; - - /** - * @inheritDoc - */ - AxisAlignedBoundingBox.prototype.clone = function () { - var clone = new AxisAlignedBoundingBox(); - clone.fromExtremes(this._aabb.x, this._aabb.y + this._aabb.height, this._aabb.z, this._aabb.x + this._aabb.width, this._aabb.y, this._aabb.z + this._aabb.depth); - return clone; - }; - - Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsX", { - get: function () { - return this._halfExtentsX; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsY", { - get: function () { - return this._halfExtentsY; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsZ", { - get: function () { - return this._halfExtentsZ; - }, - enumerable: true, - configurable: true - }); - - /** - * Finds the closest point on the bounding volume to another given point. This can be used for maximum error calculations for content within a given bound. - * @param point The point for which to find the closest point on the bounding volume - * @param target An optional Vector3D to store the result to prevent creating a new object. - * @return - */ - AxisAlignedBoundingBox.prototype.closestPointToPoint = function (point, target) { - if (typeof target === "undefined") { target = null; } - var p; - - if (target == null) - target = new Vector3D(); - - p = point.x; - if (p < this._aabb.x) - p = this._aabb.x; - if (p > this._aabb.x + this._aabb.width) - p = this._aabb.x + this._aabb.width; - target.x = p; - - p = point.y; - if (p < this._aabb.y + this._aabb.height) - p = this._aabb.y + this._aabb.height; - if (p > this._aabb.y) - p = this._aabb.y; - target.y = p; - - p = point.z; - if (p < this._aabb.z) - p = this._aabb.z; - if (p > this._aabb.z + this._aabb.depth) - p = this._aabb.z + this._aabb.depth; - target.z = p; - - return target; - }; - - AxisAlignedBoundingBox.prototype.pUpdateBoundingRenderable = function () { - this._pBoundingEntity.transform.scale.x = Math.max(this._halfExtentsX * 2, 0.001); - this._pBoundingEntity.transform.scale.y = Math.max(this._halfExtentsY * 2, 0.001); - this._pBoundingEntity.transform.scale.z = Math.max(this._halfExtentsZ * 2, 0.001); - this._pBoundingEntity.transform.position.x = this._centerX; - this._pBoundingEntity.transform.position.y = this._centerY; - this._pBoundingEntity.transform.position.z = this._centerZ; - }; - - AxisAlignedBoundingBox.prototype.pCreateBoundingEntity = function () { - return null; - }; - - AxisAlignedBoundingBox.prototype.classifyToPlane = function (plane) { - var a = plane.a; - var b = plane.b; - var c = plane.c; - var centerDistance = a * this._centerX + b * this._centerY + c * this._centerZ - plane.d; - - if (a < 0) - a = -a; - - if (b < 0) - b = -b; - - if (c < 0) - c = -c; - - var boundOffset = a * this._halfExtentsX + b * this._halfExtentsY + c * this._halfExtentsZ; - - return centerDistance > boundOffset ? PlaneClassification.FRONT : centerDistance < -boundOffset ? PlaneClassification.BACK : PlaneClassification.INTERSECT; - }; - - AxisAlignedBoundingBox.prototype.transformFrom = function (bounds, matrix) { - var aabb = bounds; - var cx = aabb._centerX; - var cy = aabb._centerY; - var cz = aabb._centerZ; - var raw = Matrix3DUtils.RAW_DATA_CONTAINER; - - matrix.copyRawDataTo(raw); - - var m11 = raw[0], m12 = raw[4], m13 = raw[8], m14 = raw[12]; - var m21 = raw[1], m22 = raw[5], m23 = raw[9], m24 = raw[13]; - var m31 = raw[2], m32 = raw[6], m33 = raw[10], m34 = raw[14]; - - this._centerX = cx * m11 + cy * m12 + cz * m13 + m14; - this._centerY = cx * m21 + cy * m22 + cz * m23 + m24; - this._centerZ = cx * m31 + cy * m32 + cz * m33 + m34; - - if (m11 < 0) - m11 = -m11; - if (m12 < 0) - m12 = -m12; - if (m13 < 0) - m13 = -m13; - if (m21 < 0) - m21 = -m21; - if (m22 < 0) - m22 = -m22; - if (m23 < 0) - m23 = -m23; - if (m31 < 0) - m31 = -m31; - if (m32 < 0) - m32 = -m32; - if (m33 < 0) - m33 = -m33; - var hx = aabb._halfExtentsX; - var hy = aabb._halfExtentsY; - var hz = aabb._halfExtentsZ; - this._halfExtentsX = hx * m11 + hy * m12 + hz * m13; - this._halfExtentsY = hx * m21 + hy * m22 + hz * m23; - this._halfExtentsZ = hx * m31 + hy * m32 + hz * m33; - - this._aabb.width = this._aabb.height = this._aabb.depth = this._halfExtentsX * 2; - this._aabb.x = this._centerX - this._halfExtentsX; - this._aabb.y = this._centerY + this._halfExtentsY; - this._aabb.z = this._centerZ - this._halfExtentsZ; - }; - return AxisAlignedBoundingBox; - })(_bounds.BoundingVolumeBase); - _bounds.AxisAlignedBoundingBox = AxisAlignedBoundingBox; - })(away.bounds || (away.bounds = {})); - var bounds = away.bounds; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (net) { - /** - * - */ - var URLRequest = (function () { - /** - - * @param url - */ - function URLRequest(url) { - if (typeof url === "undefined") { url = null; } - /** - * - * away.net.URLRequestMethod.GET - * away.net.URLRequestMethod.POST - * - * @type {string} - */ - this.method = net.URLRequestMethod.GET; - /** - * Use asynchronous XMLHttpRequest - * @type {boolean} - */ - this.async = true; - this._url = url; - } - Object.defineProperty(URLRequest.prototype, "url", { - /** - * - * @returns {string} - */ - get: function () { - return this._url; - }, - /** - * - * @param value - */ - set: function (value) { - this._url = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * dispose - */ - URLRequest.prototype.dispose = function () { - this.data = null; - this._url = null; - }; - return URLRequest; - })(); - net.URLRequest = URLRequest; - })(away.net || (away.net = {})); - var net = away.net; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (net) { - var URLLoaderDataFormat = (function () { - function URLLoaderDataFormat() { - } - URLLoaderDataFormat.TEXT = 'text'; - - URLLoaderDataFormat.VARIABLES = 'variables'; - - URLLoaderDataFormat.BLOB = 'blob'; - - URLLoaderDataFormat.ARRAY_BUFFER = 'arraybuffer'; - - URLLoaderDataFormat.BINARY = 'binary'; - return URLLoaderDataFormat; - })(); - net.URLLoaderDataFormat = URLLoaderDataFormat; - })(away.net || (away.net = {})); - var net = away.net; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (net) { - var URLRequestMethod = (function () { - function URLRequestMethod() { - } - URLRequestMethod.POST = 'POST'; - - URLRequestMethod.GET = 'GET'; - return URLRequestMethod; - })(); - net.URLRequestMethod = URLRequestMethod; - })(away.net || (away.net = {})); - var net = away.net; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (net) { - /** - * The URLLoader is used to load a single file, as part of a resource. - * - * While URLLoader can be used directly, e.g. to create a third-party asset - * management system, it's recommended to use any of the classes Loader3D, AssetLoader - * and AssetLibrary instead in most cases. - * - * @see AssetLoader - * @see away.library.AssetLibrary - */ - var URLLoader = (function (_super) { - __extends(URLLoader, _super); - /** - * Creates a new URLLoader object. - */ - function URLLoader() { - _super.call(this); - this._bytesLoaded = 0; - this._bytesTotal = 0; - this._dataFormat = net.URLLoaderDataFormat.TEXT; - this._loadError = false; - } - Object.defineProperty(URLLoader.prototype, "url", { - /** - * - */ - get: function () { - return this._request ? this._request.url : ''; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(URLLoader.prototype, "data", { - /** - * - */ - get: function () { - return this._data; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(URLLoader.prototype, "dataFormat", { - get: function () { - return this._dataFormat; - }, - /** - * - * URLLoaderDataFormat.BINARY - * URLLoaderDataFormat.TEXT - * URLLoaderDataFormat.VARIABLES - * - * @param format - */ - set: function (format) { - this._dataFormat = format; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(URLLoader.prototype, "bytesLoaded", { - /** - * - * @returns {number} - */ - get: function () { - return this._bytesLoaded; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(URLLoader.prototype, "bytesTotal", { - /** - * - * @returns {number} - */ - get: function () { - return this._bytesTotal; - }, - enumerable: true, - configurable: true - }); - - /** - * Load a resource from a file. - * - * @param request The URLRequest object containing the URL of the object to be loaded. - */ - URLLoader.prototype.load = function (request) { - this._request = request; - - this.initXHR(); - - if (request.method === net.URLRequestMethod.POST) - this.postRequest(request); - else - this.getRequest(request); - }; - - /** - * - */ - URLLoader.prototype.close = function () { - this._XHR.abort(); - this.disposeXHR(); - }; - - /** - * - */ - URLLoader.prototype.dispose = function () { - if (this._XHR) - this._XHR.abort(); - - this.disposeXHR(); - - this._data = null; - this._dataFormat = null; - this._bytesLoaded = null; - this._bytesTotal = null; - }; - - /** - * - * @param xhr - * @param responseType - */ - URLLoader.prototype.setResponseType = function (xhr, responseType) { - switch (responseType) { - case net.URLLoaderDataFormat.ARRAY_BUFFER: - case net.URLLoaderDataFormat.BLOB: - case net.URLLoaderDataFormat.TEXT: - xhr.responseType = responseType; - break; - - case net.URLLoaderDataFormat.VARIABLES: - xhr.responseType = net.URLLoaderDataFormat.TEXT; - break; - - case net.URLLoaderDataFormat.BINARY: - xhr.responseType = ''; - break; - - default: - } - }; - - /** - * - * @param request {URLRequest} - */ - URLLoader.prototype.getRequest = function (request) { - try { - this._XHR.open(request.method, request.url, request.async); - this.setResponseType(this._XHR, this._dataFormat); - this._XHR.send(); // No data to send - } catch (e) { - this.handleXmlHttpRequestException(e); - } - }; - - /** - * - * @param request {URLRequest} - */ - URLLoader.prototype.postRequest = function (request) { - this._loadError = false; - - this._XHR.open(request.method, request.url, request.async); - - if (request.data != null) { - if (request.data instanceof net.URLVariables) { - var urlVars = request.data; - - try { - this._XHR.responseType = 'text'; - this._XHR.send(urlVars.formData); - } catch (e) { - this.handleXmlHttpRequestException(e); - } - } else { - this.setResponseType(this._XHR, this._dataFormat); - - if (request.data) - this._XHR.send(request.data); // TODO: Test - else - this._XHR.send(); // no data to send - } - } else { - this._XHR.send(); // No data to send - } - }; - - /** - * - * @param error {XMLHttpRequestException} - */ - URLLoader.prototype.handleXmlHttpRequestException = function (error /* */ ) { - switch (error.code) { - case 101: - break; - } - }; - - /** - * - */ - URLLoader.prototype.initXHR = function () { - var _this = this; - if (!this._XHR) { - this._XHR = new XMLHttpRequest(); - - this._XHR.onloadstart = function (event) { - return _this.onLoadStart(event); - }; // loadstart - When the request starts. - this._XHR.onprogress = function (event) { - return _this.onProgress(event); - }; // progress - While loading and sending data. - this._XHR.onabort = function (event) { - return _this.onAbort(event); - }; // abort - When the request has been aborted, either by invoking the abort() method or navigating away from the page. - this._XHR.onerror = function (event) { - return _this.onLoadError(event); - }; // error - When the request has failed. - this._XHR.onload = function (event) { - return _this.onLoadComplete(event); - }; // load - When the request has successfully completed. - this._XHR.ontimeout = function (event) { - return _this.onTimeOut(event); - }; // timeout - When the author specified timeout has passed before the request could complete. - this._XHR.onloadend = function (event) { - return _this.onLoadEnd(event); - }; // loadend - When the request has completed, regardless of whether or not it was successful. - this._XHR.onreadystatechange = function (event) { - return _this.onReadyStateChange(event); - }; // onreadystatechange - When XHR state changes - } - }; - - /** - * - */ - URLLoader.prototype.disposeXHR = function () { - if (this._XHR !== null) { - this._XHR.onloadstart = null; - this._XHR.onprogress = null; - this._XHR.onabort = null; - this._XHR.onerror = null; - this._XHR.onload = null; - this._XHR.ontimeout = null; - this._XHR.onloadend = null; - this._XHR = null; - } - }; - - /** - * - * @param source - */ - URLLoader.prototype.decodeURLVariables = function (source) { - var result = new Object(); - - source = source.split("+").join(" "); - - var tokens, re = /[?&]?([^=]+)=([^&]*)/g; - - while (tokens = re.exec(source)) - result[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); - - return result; - }; - - // XMLHttpRequest - Event Handlers - /** - * When XHR state changes - * @param event - */ - URLLoader.prototype.onReadyStateChange = function (event) { - if (this._XHR.readyState == 4) { - if (this._XHR.status == 404) { - this._loadError = true; - - if (!this._loadErrorEvent) - this._loadErrorEvent = new away.events.IOErrorEvent(away.events.IOErrorEvent.IO_ERROR); - - this.dispatchEvent(this._loadErrorEvent); - } - - this.dispatchEvent(new away.events.HTTPStatusEvent(away.events.HTTPStatusEvent.HTTP_STATUS, this._XHR.status)); - } - }; - - /** - * When the request has completed, regardless of whether or not it was successful. - * @param event - */ - URLLoader.prototype.onLoadEnd = function (event) { - if (this._loadError === true) - return; - }; - - /** - * When the author specified timeout has passed before the request could complete. - * @param event - */ - URLLoader.prototype.onTimeOut = function (event) { - //TODO: Timeout not currently implemented ( also not part of AS3 API ) - }; - - /** - * When the request has been aborted, either by invoking the abort() method or navigating away from the page. - * @param event - */ - URLLoader.prototype.onAbort = function (event) { - // TODO: investigate whether this needs to be an IOError - }; - - /** - * While loading and sending data. - * @param event - */ - URLLoader.prototype.onProgress = function (event) { - if (!this._progressEvent) - this._progressEvent = new away.events.ProgressEvent(away.events.ProgressEvent.PROGRESS); - - this._progressEvent.bytesTotal = event.total; - this._progressEvent.bytesLoaded = event.loaded; - - this.dispatchEvent(this._progressEvent); - }; - - /** - * When the request starts. - * @param event - */ - URLLoader.prototype.onLoadStart = function (event) { - if (!this._loadStartEvent) - this._loadStartEvent = new away.events.Event(away.events.Event.OPEN); - - this.dispatchEvent(this._loadStartEvent); - }; - - /** - * When the request has successfully completed. - * @param event - */ - URLLoader.prototype.onLoadComplete = function (event) { - if (this._loadError === true) - return; - - switch (this._dataFormat) { - case net.URLLoaderDataFormat.TEXT: - this._data = this._XHR.responseText; - break; - - case net.URLLoaderDataFormat.VARIABLES: - this._data = this.decodeURLVariables(this._XHR.responseText); - break; - - case net.URLLoaderDataFormat.BLOB: - case net.URLLoaderDataFormat.ARRAY_BUFFER: - case net.URLLoaderDataFormat.BINARY: - this._data = this._XHR.response; - break; - - default: - this._data = this._XHR.responseText; - break; - } - - if (!this._loadCompleteEvent) - this._loadCompleteEvent = new away.events.Event(away.events.Event.COMPLETE); - - this.dispatchEvent(this._loadCompleteEvent); - }; - - /** - * When the request has failed. ( due to network issues ). - * @param event - */ - URLLoader.prototype.onLoadError = function (event) { - this._loadError = true; - - if (!this._loadErrorEvent) - this._loadErrorEvent = new away.events.IOErrorEvent(away.events.IOErrorEvent.IO_ERROR); - - this.dispatchEvent(this._loadErrorEvent); - }; - return URLLoader; - })(away.events.EventDispatcher); - net.URLLoader = URLLoader; - })(away.net || (away.net = {})); - var net = away.net; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (net) { - var URLVariables = (function () { - /** - * - * @param source - */ - function URLVariables(source) { - if (typeof source === "undefined") { source = null; } - this._variables = new Object(); - if (source !== null) - this.decode(source); - } - /** - * - * @param source - */ - URLVariables.prototype.decode = function (source) { - source = source.split("+").join(" "); - - var tokens, re = /[?&]?([^=]+)=([^&]*)/g; - - while (tokens = re.exec(source)) - this._variables[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); - }; - - /** - * - * @returns {string} - */ - URLVariables.prototype.toString = function () { - return ''; - }; - - Object.defineProperty(URLVariables.prototype, "variables", { - /** - * - * @returns {Object} - */ - get: function () { - return this._variables; - }, - /** - * - * @returns {Object} - */ - set: function (obj) { - this._variables = obj; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(URLVariables.prototype, "formData", { - /** - * - * @returns {Object} - */ - get: function () { - var fd = new FormData(); - - for (var s in this._variables) - fd.append(s, this._variables[s]); - - return fd; - }, - enumerable: true, - configurable: true - }); - - return URLVariables; - })(); - net.URLVariables = URLVariables; - })(away.net || (away.net = {})); - var net = away.net; -})(away || (away = {})); -/// -/// -var away; -(function (away) { - (function (library) { - var AbstractMethodError = away.errors.AbstractMethodError; - - var NamedAssetBase = (function (_super) { - __extends(NamedAssetBase, _super); - function NamedAssetBase(name) { - if (typeof name === "undefined") { name = null; } - _super.call(this); - - this._id = NamedAssetBase.ID_COUNT++; - - if (name == null) - name = 'null'; - - this._name = name; - this._originalName = name; - - this.updateFullPath(); - } - Object.defineProperty(NamedAssetBase.prototype, "assetType", { - /** - * - */ - get: function () { - throw new AbstractMethodError(); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(NamedAssetBase.prototype, "originalName", { - /** - * The original name used for this asset in the resource (e.g. file) in which - * it was found. This may not be the same as name, which may - * have changed due to of a name conflict. - */ - get: function () { - return this._originalName; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(NamedAssetBase.prototype, "id", { - /** - * A unique id for the asset, used to identify assets in an associative array - */ - get: function () { - return this._id; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(NamedAssetBase.prototype, "name", { - get: function () { - return this._name; - }, - set: function (val) { - var prev; - - prev = this._name; - this._name = val; - - if (this._name == null) - this._name = 'null'; - - this.updateFullPath(); - - //if (hasEventListener(AssetEvent.ASSET_RENAME)) - this.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.ASSET_RENAME, this, prev)); - }, - enumerable: true, - configurable: true - }); - - - NamedAssetBase.prototype.dispose = function () { - throw new AbstractMethodError(); - }; - - Object.defineProperty(NamedAssetBase.prototype, "assetNamespace", { - get: function () { - return this._namespace; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(NamedAssetBase.prototype, "assetFullPath", { - get: function () { - return this._full_path; - }, - enumerable: true, - configurable: true - }); - - NamedAssetBase.prototype.assetPathEquals = function (name, ns) { - return (this._name == name && (!ns || this._namespace == ns)); - }; - - NamedAssetBase.prototype.resetAssetPath = function (name, ns, overrideOriginal) { - if (typeof ns === "undefined") { ns = null; } - if (typeof overrideOriginal === "undefined") { overrideOriginal = true; } - this._name = name ? name : 'null'; - this._namespace = ns ? ns : NamedAssetBase.DEFAULT_NAMESPACE; - - if (overrideOriginal) - this._originalName = this._name; - - this.updateFullPath(); - }; - - NamedAssetBase.prototype.updateFullPath = function () { - this._full_path = [this._namespace, this._name]; - }; - NamedAssetBase.ID_COUNT = 0; - - NamedAssetBase.DEFAULT_NAMESPACE = 'default'; - return NamedAssetBase; - })(away.events.EventDispatcher); - library.NamedAssetBase = NamedAssetBase; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -var away; -(function (away) { - (function (library) { - var AssetType = (function () { - function AssetType() { - } - AssetType.ANIMATION_NODE = 'animationNode'; - AssetType.ANIMATION_SET = 'animationSet'; - AssetType.ANIMATION_STATE = 'animationState'; - AssetType.ANIMATOR = 'animator'; - AssetType.BILLBOARD = 'billboard'; - AssetType.CAMERA = 'camera'; - AssetType.CONTAINER = 'container'; - AssetType.EFFECTS_METHOD = 'effectsMethod'; - AssetType.GEOMETRY = 'geometry'; - AssetType.LINE_SEGMENT = 'lineSegment'; - AssetType.LIGHT = 'light'; - AssetType.LIGHT_PICKER = 'lightPicker'; - AssetType.MATERIAL = 'material'; - AssetType.MESH = 'mesh'; - AssetType.TRIANGLE_SUB_MESH = 'triangleSubMesh'; - AssetType.LINE_SUB_MESH = 'lineSubMesh'; - AssetType.PRIMITIVE_PREFAB = 'primitivePrefab'; - AssetType.SHADOW_MAP_METHOD = 'shadowMapMethod'; - AssetType.SKELETON = 'skeleton'; - AssetType.SKELETON_POSE = 'skeletonPose'; - AssetType.SKYBOX = 'skybox'; - AssetType.STATE_TRANSITION = 'stateTransition'; - AssetType.TEXTURE = 'texture'; - AssetType.TEXTURE_PROJECTOR = 'textureProjector'; - return AssetType; - })(); - library.AssetType = AssetType; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (display) { - var ContextMode = (function () { - function ContextMode() { - } - ContextMode.AUTO = "auto"; - ContextMode.WEBGL = "webgl"; - ContextMode.FLASH = "flash"; - ContextMode.NATIVE = "native"; - return ContextMode; - })(); - display.ContextMode = ContextMode; - })(away.display || (away.display = {})); - var display = away.display; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (display) { - - })(away.display || (away.display = {})); - var display = away.display; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * A class that provides constant values for visual blend mode effects. These - * constants are used in the following: - *
    - *
  • The blendMode property of the - * flash.display.DisplayObject class.
  • - *
  • The blendMode parameter of the draw() - * method of the flash.display.BitmapData class
  • - *
- */ - (function (base) { - var BlendMode = (function () { - function BlendMode() { - } - BlendMode.ADD = "add"; - - BlendMode.ALPHA = "alpha"; - - BlendMode.DARKEN = "darken"; - - BlendMode.DIFFERENCE = "difference"; - - BlendMode.ERASE = "erase"; - - BlendMode.HARDLIGHT = "hardlight"; - - BlendMode.INVERT = "invert"; - - BlendMode.LAYER = "layer"; - - BlendMode.LIGHTEN = "lighten"; - - BlendMode.MULTIPLY = "multiply"; - - BlendMode.NORMAL = "normal"; - - BlendMode.OVERLAY = "overlay"; - - BlendMode.SCREEN = "screen"; - - BlendMode.SHADER = "shader"; - - BlendMode.SUBTRACT = "subtract"; - return BlendMode; - })(); - base.BlendMode = BlendMode; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - */ - (function (base) { - var AlignmentMode = (function () { - function AlignmentMode() { - } - AlignmentMode.REGISTRATION_POINT = "registrationPoint"; - - AlignmentMode.PIVOT_POINT = "pivot"; - return AlignmentMode; - })(); - base.AlignmentMode = AlignmentMode; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - */ - (function (base) { - var OrientationMode = (function () { - function OrientationMode() { - } - OrientationMode.DEFAULT = "default"; - - OrientationMode.CAMERA_PLANE = "cameraPlane"; - - OrientationMode.CAMERA_POSITION = "cameraPosition"; - return OrientationMode; - })(); - base.OrientationMode = OrientationMode; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (base) { - var Rectangle = away.geom.Rectangle; - - var ColorUtils = away.utils.ColorUtils; - - /** - * - */ - var BitmapData = (function () { - /** - * - * @param width - * @param height - * @param transparent - * @param fillColor - */ - function BitmapData(width, height, transparent, fillColor) { - if (typeof transparent === "undefined") { transparent = true; } - if (typeof fillColor === "undefined") { fillColor = null; } - this._alpha = 1; - this._locked = false; - this._transparent = transparent; - this._imageCanvas = document.createElement("canvas"); - this._imageCanvas.width = width; - this._imageCanvas.height = height; - this._context = this._imageCanvas.getContext("2d"); - this._rect = new Rectangle(0, 0, width, height); - - if (fillColor != null) { - if (this._transparent) { - this._alpha = away.utils.ColorUtils.float32ColorToARGB(fillColor)[0] / 255; - } else { - this._alpha = 1; - } - - this.fillRect(this._rect, fillColor); - } - } - /** - * - */ - BitmapData.prototype.dispose = function () { - this._context = null; - this._imageCanvas = null; - this._imageData = null; - this._rect = null; - this._transparent = null; - this._locked = null; - }; - - /** - * - */ - BitmapData.prototype.lock = function () { - this._locked = true; - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - }; - - /** - * - */ - BitmapData.prototype.unlock = function () { - this._locked = false; - - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - this._imageData = null; - } - }; - - /** - * - * @param x - * @param y - * @param color - */ - BitmapData.prototype.getPixel = function (x, y) { - var r; - var g; - var b; - var a; - - if (!this._locked) { - var pixelData = this._context.getImageData(x, y, 1, 1); - - r = pixelData.data[0]; - g = pixelData.data[1]; - b = pixelData.data[2]; - a = pixelData.data[3]; - } else { - var index = (x + y * this._imageCanvas.width) * 4; - - if (!this._imageData) - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - - r = this._imageData.data[index + 0]; - g = this._imageData.data[index + 1]; - b = this._imageData.data[index + 2]; - a = this._imageData.data[index + 3]; - } - - if (!this._locked) { - this._imageData = null; - } - - return (a << 24) | (r << 16) | (g << 8) | b; - }; - - /** - * - * @param x - * @param y - * @param color - */ - BitmapData.prototype.setPixel = function (x, y, color) { - var argb = away.utils.ColorUtils.float32ColorToARGB(color); - - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var index = (x + y * this._imageCanvas.width) * 4; - - this._imageData.data[index + 0] = argb[1]; - this._imageData.data[index + 1] = argb[2]; - this._imageData.data[index + 2] = argb[3]; - this._imageData.data[index + 3] = 255; - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - }; - - /** - * - * @param rect - * @param inputByteArray - */ - BitmapData.prototype.setPixels = function (rect, inputByteArray) { - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - inputByteArray.position = 0; - var i, j, index; - for (i = 0; i < rect.width; ++i) { - for (j = 0; j < rect.height; ++j) { - index = (i + rect.x + (j + rect.y) * this._imageCanvas.width) * 4; - - this._imageData.data[index + 0] = inputByteArray.readUnsignedInt(); - this._imageData.data[index + 1] = inputByteArray.readUnsignedInt(); - this._imageData.data[index + 2] = inputByteArray.readUnsignedInt(); - this._imageData.data[index + 3] = inputByteArray.readUnsignedInt(); - } - } - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - }; - - /** - * - * @param x - * @param y - * @param color - */ - BitmapData.prototype.setPixel32 = function (x, y, color) { - var argb = away.utils.ColorUtils.float32ColorToARGB(color); - - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var index = (x + y * this._imageCanvas.width) * 4; - - this._imageData.data[index + 0] = argb[1]; - this._imageData.data[index + 1] = argb[2]; - this._imageData.data[index + 2] = argb[3]; - this._imageData.data[index + 3] = argb[0]; - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - }; - - BitmapData.prototype.setVector = function (rect, inputVector) { - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var i, j, index, argb; - for (i = 0; i < rect.width; ++i) { - for (j = 0; j < rect.height; ++j) { - argb = away.utils.ColorUtils.float32ColorToARGB(inputVector[i + j * rect.width]); - index = (i + rect.x + (j + rect.y) * this._imageCanvas.width) * 4; - - this._imageData.data[index + 0] = argb[1]; - this._imageData.data[index + 1] = argb[2]; - this._imageData.data[index + 2] = argb[3]; - this._imageData.data[index + 3] = argb[0]; - } - } - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - }; - - BitmapData.prototype.drawImage = function (img, sourceRect, destRect) { - if (this._locked) { - // If canvas is locked: - // - // 1) copy image data back to canvas - // 2) draw object - // 3) read _imageData back out - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - } - - this._drawImage(img, sourceRect, destRect); - - if (this._imageData) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - } else { - this._drawImage(img, sourceRect, destRect); - } - }; - - BitmapData.prototype._drawImage = function (img, sourceRect, destRect) { - if (img instanceof away.base.BitmapData) { - this._context.drawImage(img.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); - } else if (img instanceof HTMLImageElement) { - this._context.drawImage(img, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); - } - }; - - BitmapData.prototype.copyPixels = function (bmpd, sourceRect, destRect) { - if (this._locked) { - // If canvas is locked: - // - // 1) copy image data back to canvas - // 2) draw object - // 3) read _imageData back out - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - } - - this._copyPixels(bmpd, sourceRect, destRect); - - if (this._imageData) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - } else { - this._copyPixels(bmpd, sourceRect, destRect); - } - }; - - BitmapData.prototype._copyPixels = function (bmpd, sourceRect, destRect) { - if (bmpd instanceof away.base.BitmapData) { - this._context.drawImage(bmpd.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); - } else if (bmpd instanceof HTMLImageElement) { - this._context.drawImage(bmpd, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); - } - }; - - /** - * - * @param rect - * @param color - */ - BitmapData.prototype.fillRect = function (rect, color) { - if (this._locked) { - // If canvas is locked: - // - // 1) copy image data back to canvas - // 2) apply fill - // 3) read _imageData back out - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - } - - this._context.fillStyle = this.hexToRGBACSS(color); - this._context.fillRect(rect.x, rect.y, rect.width, rect.height); - - if (this._imageData) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - } else { - this._context.fillStyle = this.hexToRGBACSS(color); - this._context.fillRect(rect.x, rect.y, rect.width, rect.height); - } - }; - - BitmapData.prototype.draw = function (source, matrix) { - if (this._locked) { - // If canvas is locked: - // - // 1) copy image data back to canvas - // 2) draw object - // 3) read _imageData back out - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - } - - this._draw(source, matrix); - - if (this._imageData) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - } else { - this._draw(source, matrix); - } - }; - - BitmapData.prototype._draw = function (source, matrix) { - if (source instanceof away.base.BitmapData) { - this._context.save(); - - if (matrix != null) - this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); - - this._context.drawImage(source.canvas, 0, 0); - this._context.restore(); - } else if (source instanceof HTMLImageElement) { - this._context.save(); - - if (matrix != null) - this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); - - this._context.drawImage(source, 0, 0); - this._context.restore(); - } - }; - - BitmapData.prototype.copyChannel = function (sourceBitmap, sourceRect, destPoint, sourceChannel, destChannel) { - var imageData = sourceBitmap.imageData; - - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var sourceData = sourceBitmap.imageData.data; - var destData = this._imageData.data; - - var sourceOffset = Math.round(Math.log(sourceChannel) / Math.log(2)); - var destOffset = Math.round(Math.log(destChannel) / Math.log(2)); - - var i, j, sourceIndex, destIndex; - for (i = 0; i < sourceRect.width; ++i) { - for (j = 0; j < sourceRect.height; ++j) { - sourceIndex = (i + sourceRect.x + (j + sourceRect.y) * sourceBitmap.width) * 4; - destIndex = (i + destPoint.x + (j + destPoint.y) * this.width) * 4; - - destData[destIndex + destOffset] = sourceData[sourceIndex + sourceOffset]; - } - } - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - }; - - BitmapData.prototype.colorTransform = function (rect, colorTransform) { - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var data = this._imageData.data; - - var i, j, index; - for (i = 0; i < rect.width; ++i) { - for (j = 0; j < rect.height; ++j) { - index = (i + rect.x + (j + rect.y) * this.width) * 4; - - data[index] = data[index] * colorTransform.redMultiplier + colorTransform.redOffset; - data[index + 1] = data[index + 1] * colorTransform.greenMultiplier + colorTransform.greenOffset; - data[index + 2] = data[index + 2] * colorTransform.blueMultiplier + colorTransform.blueOffset; - data[index + 3] = data[index + 3] * colorTransform.alphaMultiplier + colorTransform.alphaOffset; - } - } - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - }; - - - Object.defineProperty(BitmapData.prototype, "imageData", { - /** - * - * @returns {ImageData} - */ - get: function () { - return this._context.getImageData(0, 0, this._rect.width, this._rect.height); - }, - /** - * - * @param {ImageData} - */ - set: function (value) { - this._context.putImageData(value, 0, 0); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(BitmapData.prototype, "width", { - /** - * - * @returns {number} - */ - get: function () { - return this._imageCanvas.width; - }, - /** - * - * @param {number} - */ - set: function (value) { - this._rect.width = value; - this._imageCanvas.width = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(BitmapData.prototype, "height", { - /** - * - * @returns {number} - */ - get: function () { - return this._imageCanvas.height; - }, - /** - * - * @param {number} - */ - set: function (value) { - this._rect.height = value; - this._imageCanvas.height = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(BitmapData.prototype, "rect", { - /** - * - * @param {Rectangle} - */ - get: function () { - return this._rect; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(BitmapData.prototype, "canvas", { - /** - * - * @returns {HTMLCanvasElement} - */ - get: function () { - return this._imageCanvas; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(BitmapData.prototype, "context", { - /** - * - * @returns {HTMLCanvasElement} - */ - get: function () { - return this._context; - }, - enumerable: true, - configurable: true - }); - - // Private - /** - * convert decimal value to Hex - */ - BitmapData.prototype.hexToRGBACSS = function (d) { - var argb = ColorUtils.float32ColorToARGB(d); - - if (this._transparent == false) { - argb[0] = 1; - - return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] + ')'; - } - - return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] / 255 + ')'; - }; - return BitmapData; - })(); - base.BitmapData = BitmapData; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (base) { - var BitmapDataChannel = (function () { - function BitmapDataChannel() { - } - BitmapDataChannel.ALPHA = 8; - BitmapDataChannel.BLUE = 4; - BitmapDataChannel.GREEN = 2; - BitmapDataChannel.RED = 1; - return BitmapDataChannel; - })(); - base.BitmapDataChannel = BitmapDataChannel; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The CapsStyle class is an enumeration of constant values that specify the - * caps style to use in drawing lines. The constants are provided for use as - * values in the caps parameter of the - * flash.display.Graphics.lineStyle() method. You can specify the - * following three types of caps: - */ - (function (base) { - var CapsStyle = (function () { - function CapsStyle() { - } - CapsStyle.ROUND = "round"; - - CapsStyle.NONE = "none"; - - CapsStyle.SQUARE = "square"; - return CapsStyle; - })(); - base.CapsStyle = CapsStyle; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The DisplayObject class is the base class for all objects that can be - * placed on the display list. The display list manages all objects displayed - * in flash. Use the DisplayObjectContainer class to arrange the - * display objects in the display list. DisplayObjectContainer objects can - * have child display objects, while other display objects, such as Shape and - * TextField objects, are "leaf" nodes that have only parents and siblings, no - * children. - * - *

The DisplayObject class supports basic functionality like the x - * and y position of an object, as well as more advanced properties of - * the object such as its transformation matrix.

- * - *

DisplayObject is an abstract base class; therefore, you cannot call - * DisplayObject directly. Invoking new DisplayObject() throws an - * ArgumentError exception.

- * - *

All display objects inherit from the DisplayObject class.

- * - *

The DisplayObject class itself does not include any APIs for rendering - * content onscreen. For that reason, if you want create a custom subclass of - * the DisplayObject class, you will want to extend one of its subclasses that - * do have APIs for rendering content onscreen, such as the Shape, Sprite, - * Bitmap, SimpleButton, TextField, or MovieClip class.

- * - *

The DisplayObject class contains several broadcast events. Normally, the - * target of any particular event is a specific DisplayObject instance. For - * example, the target of an added event is the specific - * DisplayObject instance that was added to the display list. Having a single - * target restricts the placement of event listeners to that target and in - * some cases the target's ancestors on the display list. With broadcast - * events, however, the target is not a specific DisplayObject instance, but - * rather all DisplayObject instances, including those that are not on the - * display list. This means that you can add a listener to any DisplayObject - * instance to listen for broadcast events. In addition to the broadcast - * events listed in the DisplayObject class's Events table, the DisplayObject - * class also inherits two broadcast events from the EventDispatcher class: - * activate and deactivate.

- * - *

Some properties previously used in the ActionScript 1.0 and 2.0 - * MovieClip, TextField, and Button classes(such as _alpha, - * _height, _name, _width, - * _x, _y, and others) have equivalents in the - * ActionScript 3.0 DisplayObject class that are renamed so that they no - * longer begin with the underscore(_) character.

- * - *

For more information, see the "Display Programming" chapter of the - * ActionScript 3.0 Developer's Guide.

- * - * @event added Dispatched when a display object is added to the - * display list. The following methods trigger this - * event: - * DisplayObjectContainer.addChild(), - * DisplayObjectContainer.addChildAt(). - * @event addedToStage Dispatched when a display object is added to the on - * stage display list, either directly or through the - * addition of a sub tree in which the display object - * is contained. The following methods trigger this - * event: - * DisplayObjectContainer.addChild(), - * DisplayObjectContainer.addChildAt(). - * @event enterFrame [broadcast event] Dispatched when the playhead is - * entering a new frame. If the playhead is not - * moving, or if there is only one frame, this event - * is dispatched continuously in conjunction with the - * frame rate. This event is a broadcast event, which - * means that it is dispatched by all display objects - * with a listener registered for this event. - * @event exitFrame [broadcast event] Dispatched when the playhead is - * exiting the current frame. All frame scripts have - * been run. If the playhead is not moving, or if - * there is only one frame, this event is dispatched - * continuously in conjunction with the frame rate. - * This event is a broadcast event, which means that - * it is dispatched by all display objects with a - * listener registered for this event. - * @event frameConstructed [broadcast event] Dispatched after the constructors - * of frame display objects have run but before frame - * scripts have run. If the playhead is not moving, or - * if there is only one frame, this event is - * dispatched continuously in conjunction with the - * frame rate. This event is a broadcast event, which - * means that it is dispatched by all display objects - * with a listener registered for this event. - * @event removed Dispatched when a display object is about to be - * removed from the display list. Two methods of the - * DisplayObjectContainer class generate this event: - * removeChild() and - * removeChildAt(). - * - *

The following methods of a - * DisplayObjectContainer object also generate this - * event if an object must be removed to make room for - * the new object: addChild(), - * addChildAt(), and - * setChildIndex().

- * @event removedFromStage Dispatched when a display object is about to be - * removed from the display list, either directly or - * through the removal of a sub tree in which the - * display object is contained. Two methods of the - * DisplayObjectContainer class generate this event: - * removeChild() and - * removeChildAt(). - * - *

The following methods of a - * DisplayObjectContainer object also generate this - * event if an object must be removed to make room for - * the new object: addChild(), - * addChildAt(), and - * setChildIndex().

- * @event render [broadcast event] Dispatched when the display list - * is about to be updated and rendered. This event - * provides the last opportunity for objects listening - * for this event to make changes before the display - * list is rendered. You must call the - * invalidate() method of the Stage - * object each time you want a render - * event to be dispatched. Render events - * are dispatched to an object only if there is mutual - * trust between it and the object that called - * Stage.invalidate(). This event is a - * broadcast event, which means that it is dispatched - * by all display objects with a listener registered - * for this event. - * - *

Note: This event is not dispatched if the - * display is not rendering. This is the case when the - * content is either minimized or obscured.

- */ - (function (base) { - var DisplayObject = (function (_super) { - __extends(DisplayObject, _super); - /** - * Creates a new DisplayObject instance. - */ - function DisplayObject() { - _super.call(this); - this._pSceneTransform = new away.geom.Matrix3D(); - this._pSceneTransformDirty = true; - this._matrix3D = new away.geom.Matrix3D(); - this._matrix3DDirty = true; - this._inverseSceneTransform = new away.geom.Matrix3D(); - this._inverseSceneTransformDirty = true; - this._scenePosition = new away.geom.Vector3D(); - this._scenePositionDirty = true; - this._explicitVisibility = true; - this._pImplicitVisibility = true; - this._explicitMouseEnabled = true; - this._pImplicitMouseEnabled = true; - this._positionDirty = true; - this._rotationDirty = true; - this._scaleDirty = true; - this._rotationX = 0; - this._rotationY = 0; - this._rotationZ = 0; - this._eulers = new away.geom.Vector3D(); - this._flipY = new away.geom.Matrix3D(); - this._zOffset = 0; - this._pScaleX = 1; - this._pScaleY = 1; - this._pScaleZ = 1; - this._x = 0; - this._y = 0; - this._z = 0; - this._pivot = new away.geom.Vector3D(); - this._orientationMatrix = new away.geom.Matrix3D(); - this._pivotZero = true; - this._pivotDirty = true; - this._pos = new away.geom.Vector3D(); - this._rot = new away.geom.Vector3D(); - this._sca = new away.geom.Vector3D(); - this._pIgnoreTransform = false; - this._pBoundsInvalid = true; - this._worldBoundsInvalid = true; - this._pRenderables = new Array(); - /** - * - */ - this.alignmentMode = base.AlignmentMode.REGISTRATION_POINT; - /** - * - */ - this.castsShadows = true; - /** - * - */ - this.orientationMode = base.OrientationMode.DEFAULT; - - // Cached vector of transformation components used when - // recomposing the transform matrix in updateTransform() - this._transformComponents = new Array(3); //_transformComponents = new Vector.(3, true); - - this._transformComponents[0] = this._pos; - this._transformComponents[1] = this._rot; - this._transformComponents[2] = this._sca; - - //creation of associated transform object - this._transform = new away.geom.Transform(this); - - this._matrix3D.identity(); - - this._flipY.appendScale(1, -1, 1); - - this._pBounds = this.pCreateDefaultBoundingVolume(); - - this._worldBounds = this.pCreateDefaultBoundingVolume(); - } - Object.defineProperty(DisplayObject.prototype, "bounds", { - /** - * - */ - get: function () { - if (this._pBoundsInvalid) - this.pUpdateBounds(); - - return this._pBounds; - }, - set: function (value) { - if (this._pBounds == value) - return; - - this._pBounds = value; - - this._worldBounds = value.clone(); - - this.pInvalidateBounds(); - - if (this._boundsVisible) - this._partitionNode._iUpdateEntityBounds(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "depth", { - /** - * Indicates the depth of the display object, in pixels. The depth is - * calculated based on the bounds of the content of the display object. When - * you set the depth property, the scaleZ property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content (such as an empty sprite) has a depth of 0, even if you try to - * set depth to a different value.

- */ - get: function () { - if (this._pBoundsInvalid) - this.pUpdateBounds(); - - return this._depth; - }, - set: function (val) { - if (this._depth == val) - return; - - this._depth == val; - - this._pScaleZ = val / this.bounds.aabb.depth; - - this.invalidateScale(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "eulers", { - /** - * Defines the rotation of the 3d object as a Vector3D object containing euler angles for rotation around x, y and z axis. - */ - get: function () { - this._eulers.x = this._rotationX * away.geom.MathConsts.RADIANS_TO_DEGREES; - this._eulers.y = this._rotationY * away.geom.MathConsts.RADIANS_TO_DEGREES; - this._eulers.z = this._rotationZ * away.geom.MathConsts.RADIANS_TO_DEGREES; - - return this._eulers; - }, - set: function (value) { - this._rotationX = value.x * away.geom.MathConsts.DEGREES_TO_RADIANS; - this._rotationY = value.y * away.geom.MathConsts.DEGREES_TO_RADIANS; - this._rotationZ = value.z * away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "height", { - /** - * An indexed array that contains each filter object currently associated - * with the display object. The flash.filters package contains several - * classes that define specific filters you can use. - * - *

Filters can be applied in Flash Professional at design time, or at run - * time by using ActionScript code. To apply a filter by using ActionScript, - * you must make a temporary copy of the entire filters array, - * modify the temporary array, then assign the value of the temporary array - * back to the filters array. You cannot directly add a new - * filter object to the filters array.

- * - *

To add a filter by using ActionScript, perform the following steps - * (assume that the target display object is named - * myDisplayObject):

- * - *
    - *
  1. Create a new filter object by using the constructor method of your - * chosen filter class.
  2. - *
  3. Assign the value of the myDisplayObject.filters array - * to a temporary array, such as one named myFilters.
  4. - *
  5. Add the new filter object to the myFilters temporary - * array.
  6. - *
  7. Assign the value of the temporary array to the - * myDisplayObject.filters array.
  8. - *
- * - *

If the filters array is undefined, you do not need to use - * a temporary array. Instead, you can directly assign an array literal that - * contains one or more filter objects that you create. The first example in - * the Examples section adds a drop shadow filter by using code that handles - * both defined and undefined filters arrays.

- * - *

To modify an existing filter object, you must use the technique of - * modifying a copy of the filters array:

- * - *
    - *
  1. Assign the value of the filters array to a temporary - * array, such as one named myFilters.
  2. - *
  3. Modify the property by using the temporary array, - * myFilters. For example, to set the quality property of the - * first filter in the array, you could use the following code: - * myFilters[0].quality = 1;
  4. - *
  5. Assign the value of the temporary array to the filters - * array.
  6. - *
- * - *

At load time, if a display object has an associated filter, it is - * marked to cache itself as a transparent bitmap. From this point forward, - * as long as the display object has a valid filter list, the player caches - * the display object as a bitmap. This source bitmap is used as a source - * image for the filter effects. Each display object usually has two bitmaps: - * one with the original unfiltered source display object and another for the - * final image after filtering. The final image is used when rendering. As - * long as the display object does not change, the final image does not need - * updating.

- * - *

The flash.filters package includes classes for filters. For example, to - * create a DropShadow filter, you would write:

- * - * @throws ArgumentError When filters includes a ShaderFilter - * and the shader output type is not compatible with - * this operation(the shader must specify a - * pixel4 output). - * @throws ArgumentError When filters includes a ShaderFilter - * and the shader doesn't specify any image input or - * the first input is not an image4 input. - * @throws ArgumentError When filters includes a ShaderFilter - * and the shader specifies an image input that isn't - * provided. - * @throws ArgumentError When filters includes a ShaderFilter, a - * ByteArray or Vector. instance as a shader - * input, and the width and - * height properties aren't specified for - * the ShaderInput object, or the specified values - * don't match the amount of data in the input data. - * See the ShaderInput.input property for - * more information. - */ - // public filters:Array; - /** - * Indicates the height of the display object, in pixels. The height is - * calculated based on the bounds of the content of the display object. When - * you set the height property, the scaleY property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content (such as an empty sprite) has a height of 0, even if you try to - * set height to a different value.

- */ - get: function () { - if (this._pBoundsInvalid) - this.pUpdateBounds(); - - return this._height; - }, - set: function (val) { - if (this._height == val) - return; - - this._height == val; - - this._pScaleY = val / this.bounds.aabb.height; - - this.invalidateScale(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "index", { - /** - * Indicates the instance container index of the DisplayObject. The object can be - * identified in the child list of its parent display object container by - * calling the getChildByIndex() method of the display object - * container. - * - *

If the DisplayObject has no parent container, index defaults to 0.

- */ - get: function () { - if (this._pParent) - return this._pParent.getChildIndex(this); - - return 0; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "inverseSceneTransform", { - /** - * - */ - get: function () { - if (this._inverseSceneTransformDirty) { - this._inverseSceneTransform.copyFrom(this.sceneTransform); - this._inverseSceneTransform.invert(); - this._inverseSceneTransformDirty = false; - } - return this._inverseSceneTransform; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "ignoreTransform", { - /** - * - */ - get: function () { - return this._pIgnoreTransform; - }, - set: function (value) { - if (this._pIgnoreTransform == value) - return; - - this._pIgnoreTransform = value; - - if (value) { - this._pSceneTransform.identity(); - this._scenePosition.setTo(0, 0, 0); - } - - this.pInvalidateSceneTransform(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "isEntity", { - /** - * - */ - get: function () { - return this._pIsEntity; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "loaderInfo", { - /** - * Returns a LoaderInfo object containing information about loading the file - * to which this display object belongs. The loaderInfo property - * is defined only for the root display object of a SWF file or for a loaded - * Bitmap(not for a Bitmap that is drawn with ActionScript). To find the - * loaderInfo object associated with the SWF file that contains - * a display object named myDisplayObject, use - * myDisplayObject.root.loaderInfo. - * - *

A large SWF file can monitor its download by calling - * this.root.loaderInfo.addEventListener(Event.COMPLETE, - * func).

- */ - get: function () { - return this._loaderInfo; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "mouseEnabled", { - /** - * Specifies whether this object receives mouse, or other user input, - * messages. The default value is true, which means that by - * default any InteractiveObject instance that is on the display list - * receives mouse events or other user input events. If - * mouseEnabled is set to false, the instance does - * not receive any mouse events(or other user input events like keyboard - * events). Any children of this instance on the display list are not - * affected. To change the mouseEnabled behavior for all - * children of an object on the display list, use - * flash.display.DisplayObjectContainer.mouseChildren. - * - *

No event is dispatched by setting this property. You must use the - * addEventListener() method to create interactive - * functionality.

- */ - get: function () { - return this._explicitMouseEnabled; - }, - set: function (value) { - if (this._explicitMouseEnabled == value) - return; - - this._explicitMouseEnabled = value; - - this._pUpdateImplicitMouseEnabled(this._pParent ? this._pParent.mouseChildren : true); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "mouseX", { - /** - * Indicates the x coordinate of the mouse or user input device position, in - * pixels. - * - *

Note: For a DisplayObject that has been rotated, the returned x - * coordinate will reflect the non-rotated object.

- */ - get: function () { - return this._mouseX; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "mouseY", { - /** - * Indicates the y coordinate of the mouse or user input device position, in - * pixels. - * - *

Note: For a DisplayObject that has been rotated, the returned y - * coordinate will reflect the non-rotated object.

- */ - get: function () { - return this._mouseY; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "parent", { - /** - * Indicates the DisplayObjectContainer object that contains this display - * object. Use the parent property to specify a relative path to - * display objects that are above the current display object in the display - * list hierarchy. - * - *

You can use parent to move up multiple levels in the - * display list as in the following:

- * - * @throws SecurityError The parent display object belongs to a security - * sandbox to which you do not have access. You can - * avoid this situation by having the parent movie call - * the Security.allowDomain() method. - */ - get: function () { - return this._pParent; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "partition", { - /** - * - */ - get: function () { - return this._explicitPartition; - }, - set: function (value) { - if (this._explicitPartition == value) - return; - - if (this._pScene && this._explicitPartition) - this._pScene.iUnregisterPartition(this._explicitPartition); - - this._explicitPartition = value; - - if (this._pScene && value) - this._pScene.iRegisterPartition(value); - - this._pUpdateImplicitPartition(this._pParent ? this._pParent._iAssignedPartition : null); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "partitionNode", { - /** - * - */ - get: function () { - if (!this._partitionNode) - this._partitionNode = this.pCreateEntityPartitionNode(); - - return this._partitionNode; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "pickingCollider", { - /** - * - */ - get: function () { - return this._pPickingCollider; - }, - set: function (value) { - this._pPickingCollider = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "pivot", { - /** - * Defines the local point around which the object rotates. - */ - get: function () { - return this._pivot; - }, - set: function (pivot) { - this._pivot = pivot.clone(); - - this.invalidatePivot(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "root", { - /** - * For a display object in a loaded SWF file, the root property - * is the top-most display object in the portion of the display list's tree - * structure represented by that SWF file. For a Bitmap object representing a - * loaded image file, the root property is the Bitmap object - * itself. For the instance of the main class of the first SWF file loaded, - * the root property is the display object itself. The - * root property of the Stage object is the Stage object itself. - * The root property is set to null for any display - * object that has not been added to the display list, unless it has been - * added to a display object container that is off the display list but that - * is a child of the top-most display object in a loaded SWF file. - * - *

For example, if you create a new Sprite object by calling the - * Sprite() constructor method, its root property - * is null until you add it to the display list(or to a display - * object container that is off the display list but that is a child of the - * top-most display object in a SWF file).

- * - *

For a loaded SWF file, even though the Loader object used to load the - * file may not be on the display list, the top-most display object in the - * SWF file has its root property set to itself. The Loader - * object does not have its root property set until it is added - * as a child of a display object for which the root property is - * set.

- */ - get: function () { - return this._root; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "rotationX", { - /** - * Indicates the x-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - get: function () { - return this._rotationX * away.geom.MathConsts.RADIANS_TO_DEGREES; - }, - set: function (val) { - if (this.rotationX == val) - return; - - this._rotationX = val * away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "rotationY", { - /** - * Indicates the y-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - get: function () { - return this._rotationY * away.geom.MathConsts.RADIANS_TO_DEGREES; - }, - set: function (val) { - if (this.rotationY == val) - return; - - this._rotationY = val * away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "rotationZ", { - /** - * Indicates the z-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - get: function () { - return this._rotationZ * away.geom.MathConsts.RADIANS_TO_DEGREES; - }, - set: function (val) { - if (this.rotationZ == val) - return; - - this._rotationZ = val * away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "scaleX", { - /** - * Indicates the horizontal scale(percentage) of the object as applied from - * the registration point. The default registration point is(0,0). 1.0 - * equals 100% scale. - * - *

Scaling the local coordinate system changes the x and - * y property values, which are defined in whole pixels.

- */ - get: function () { - return this._pScaleX; - }, - set: function (val) { - if (this._pScaleX == val) - return; - - this._pScaleX = val; - - this.invalidateScale(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "scaleY", { - /** - * Indicates the vertical scale(percentage) of an object as applied from the - * registration point of the object. The default registration point is(0,0). - * 1.0 is 100% scale. - * - *

Scaling the local coordinate system changes the x and - * y property values, which are defined in whole pixels.

- */ - get: function () { - return this._pScaleY; - }, - set: function (val) { - if (this._pScaleY == val) - return; - - this._pScaleY = val; - - this.invalidateScale(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "scaleZ", { - /** - * Indicates the depth scale(percentage) of an object as applied from the - * registration point of the object. The default registration point is(0,0). - * 1.0 is 100% scale. - * - *

Scaling the local coordinate system changes the x, - * y and z property values, which are defined in - * whole pixels.

- */ - get: function () { - return this._pScaleZ; - }, - set: function (val) { - if (this._pScaleZ == val) - return; - - this._pScaleZ = val; - - this.invalidateScale(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "scene", { - /** - * - */ - get: function () { - return this._pScene; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "scenePosition", { - /** - * - */ - get: function () { - if (this._scenePositionDirty) { - if (!this._pivotZero && this.alignmentMode == base.AlignmentMode.PIVOT_POINT) { - var pivotScale = new away.geom.Vector3D(this._pivot.x / this._pScaleX, this._pivot.y / this._pScaleY, this._pivot.z / this._pScaleZ); - this._scenePosition = this.sceneTransform.transformVector(pivotScale); - //this._scenePosition.decrementBy(new away.geom.Vector3D(this._pivot.x*this._pScaleX, this._pivot.y*this._pScaleY, this._pivot.z*this._pScaleZ)); - } else { - this.sceneTransform.copyColumnTo(3, this._scenePosition); - } - - this._scenePositionDirty = false; - } - return this._scenePosition; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "sceneTransform", { - get: function () { - if (this._pSceneTransformDirty) - this.pUpdateSceneTransform(); - - return this._pSceneTransform; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "shaderPickingDetails", { - /** - * - */ - get: function () { - return this._shaderPickingDetails; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "boundsVisible", { - /** - * - */ - get: function () { - return this._boundsVisible; - }, - set: function (value) { - if (value == this._boundsVisible) - return; - - this._boundsVisible = value; - - this._partitionNode.boundsVisible = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "transform", { - /** - * An object with properties pertaining to a display object's matrix, color - * transform, and pixel bounds. The specific properties - matrix, - * colorTransform, and three read-only properties - * (concatenatedMatrix, concatenatedColorTransform, - * and pixelBounds) - are described in the entry for the - * Transform class. - * - *

Each of the transform object's properties is itself an object. This - * concept is important because the only way to set new values for the matrix - * or colorTransform objects is to create a new object and copy that object - * into the transform.matrix or transform.colorTransform property.

- * - *

For example, to increase the tx value of a display - * object's matrix, you must make a copy of the entire matrix object, then - * copy the new object into the matrix property of the transform object:

- *
 public myMatrix:Matrix =
-                * myDisplayObject.transform.matrix; myMatrix.tx += 10;
-                * myDisplayObject.transform.matrix = myMatrix; 
- * - *

You cannot directly set the tx property. The following - * code has no effect on myDisplayObject:

- *
 myDisplayObject.transform.matrix.tx +=
-                * 10; 
- * - *

You can also copy an entire transform object and assign it to another - * display object's transform property. For example, the following code - * copies the entire transform object from myOldDisplayObj to - * myNewDisplayObj:

- * myNewDisplayObj.transform = myOldDisplayObj.transform; - * - *

The resulting display object, myNewDisplayObj, now has the - * same values for its matrix, color transform, and pixel bounds as the old - * display object, myOldDisplayObj.

- * - *

Note that AIR for TV devices use hardware acceleration, if it is - * available, for color transforms.

- */ - get: function () { - return this._transform; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "visible", { - /** - * Whether or not the display object is visible. Display objects that are not - * visible are disabled. For example, if visible=false for an - * InteractiveObject instance, it cannot be clicked. - */ - get: function () { - return this._explicitVisibility; - }, - set: function (value) { - if (this._explicitVisibility == value) - return; - - this._explicitVisibility = value; - - this._pUpdateImplicitVisibility(this._pParent ? this._pParent._iIsVisible() : true); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "width", { - /** - * Indicates the width of the display object, in pixels. The width is - * calculated based on the bounds of the content of the display object. When - * you set the width property, the scaleX property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content(such as an empty sprite) has a width of 0, even if you try to set - * width to a different value.

- */ - get: function () { - if (this._pBoundsInvalid) - this.pUpdateBounds(); - - return this._width; - }, - set: function (val) { - if (this._width == val) - return; - - this._width == val; - - this._pScaleX = val / this.bounds.aabb.width; - - this.invalidateScale(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "worldBounds", { - /** - * - */ - get: function () { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the bounds of the entity, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - if (this._worldBoundsInvalid) { - this._worldBoundsInvalid = false; - this._worldBounds.transformFrom(this.bounds, this.sceneTransform); - } - - return this._worldBounds; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "x", { - /** - * Indicates the x coordinate of the DisplayObject instance relative - * to the local coordinates of the parent DisplayObjectContainer. If the - * object is inside a DisplayObjectContainer that has transformations, it is - * in the local coordinate system of the enclosing DisplayObjectContainer. - * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the - * DisplayObjectContainer's children inherit a coordinate system that is - * rotated 90° counterclockwise. The object's coordinates refer to the - * registration point position. - */ - get: function () { - return this._x; - }, - set: function (val) { - if (this._x == val) - return; - - this._x = val; - - this.invalidatePosition(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "y", { - /** - * Indicates the y coordinate of the DisplayObject instance relative - * to the local coordinates of the parent DisplayObjectContainer. If the - * object is inside a DisplayObjectContainer that has transformations, it is - * in the local coordinate system of the enclosing DisplayObjectContainer. - * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the - * DisplayObjectContainer's children inherit a coordinate system that is - * rotated 90° counterclockwise. The object's coordinates refer to the - * registration point position. - */ - get: function () { - return this._y; - }, - set: function (val) { - if (this._y == val) - return; - - this._y = val; - - this.invalidatePosition(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "z", { - /** - * Indicates the z coordinate position along the z-axis of the DisplayObject - * instance relative to the 3D parent container. The z property is used for - * 3D coordinates, not screen or pixel coordinates. - * - *

When you set a z property for a display object to - * something other than the default value of 0, a corresponding - * Matrix3D object is automatically created. for adjusting a display object's - * position and orientation in three dimensions. When working with the - * z-axis, the existing behavior of x and y properties changes from screen or - * pixel coordinates to positions relative to the 3D parent container.

- * - *

For example, a child of the _root at position x = 100, y = - * 100, z = 200 is not drawn at pixel location(100,100). The child is drawn - * wherever the 3D projection calculation puts it. The calculation is:

- * - *

(x~~cameraFocalLength/cameraRelativeZPosition, - * y~~cameraFocalLength/cameraRelativeZPosition)

- */ - get: function () { - return this._z; - }, - set: function (val) { - if (this._z == val) - return; - - this._z = val; - - this.invalidatePosition(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "zOffset", { - /** - * - */ - get: function () { - return this._zOffset; - }, - set: function (value) { - this._zOffset = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * - */ - DisplayObject.prototype.addEventListener = function (type, listener) { - _super.prototype.addEventListener.call(this, type, listener); //, priority, useWeakReference); - - switch (type) { - case away.events.DisplayObjectEvent.POSITION_CHANGED: - this._listenToPositionChanged = true; - break; - case away.events.DisplayObjectEvent.ROTATION_CHANGED: - this._listenToRotationChanged = true; - break; - case away.events.DisplayObjectEvent.SCALE_CHANGED: - this._listenToScaleChanged = true; - break; - } - }; - - /** - * - */ - DisplayObject.prototype.clone = function () { - var clone = new DisplayObject(); - clone.pivot = this.pivot; - clone._iMatrix3D = this._iMatrix3D; - clone.name = name; - - // todo: implement for all subtypes - return clone; - }; - - /** - * - */ - DisplayObject.prototype.dispose = function () { - if (this.parent) - this.parent.removeChild(this); - - while (this._pRenderables.length) - this._pRenderables[0].dispose(); - }; - - /** - * @inheritDoc - */ - DisplayObject.prototype.disposeAsset = function () { - this.dispose(); - }; - - /** - * Returns a rectangle that defines the area of the display object relative - * to the coordinate system of the targetCoordinateSpace object. - * Consider the following code, which shows how the rectangle returned can - * vary depending on the targetCoordinateSpace parameter that - * you pass to the method: - * - *

Note: Use the localToGlobal() and - * globalToLocal() methods to convert the display object's local - * coordinates to display coordinates, or display coordinates to local - * coordinates, respectively.

- * - *

The getBounds() method is similar to the - * getRect() method; however, the Rectangle returned by the - * getBounds() method includes any strokes on shapes, whereas - * the Rectangle returned by the getRect() method does not. For - * an example, see the description of the getRect() method.

- * - * @param targetCoordinateSpace The display object that defines the - * coordinate system to use. - * @return The rectangle that defines the area of the display object relative - * to the targetCoordinateSpace object's coordinate - * system. - */ - DisplayObject.prototype.getBounds = function (targetCoordinateSpace) { - return this._bounds; - }; - - /** - * Returns a rectangle that defines the boundary of the display object, based - * on the coordinate system defined by the targetCoordinateSpace - * parameter, excluding any strokes on shapes. The values that the - * getRect() method returns are the same or smaller than those - * returned by the getBounds() method. - * - *

Note: Use localToGlobal() and - * globalToLocal() methods to convert the display object's local - * coordinates to Stage coordinates, or Stage coordinates to local - * coordinates, respectively.

- * - * @param targetCoordinateSpace The display object that defines the - * coordinate system to use. - * @return The rectangle that defines the area of the display object relative - * to the targetCoordinateSpace object's coordinate - * system. - */ - DisplayObject.prototype.getRect = function (targetCoordinateSpace) { - return this._bounds; - }; - - /** - * Converts the point object from the Stage(global) coordinates - * to the display object's(local) coordinates. - * - *

To use this method, first create an instance of the Point class. The - * x and y values that you assign represent global coordinates - * because they relate to the origin(0,0) of the main display area. Then - * pass the Point instance as the parameter to the - * globalToLocal() method. The method returns a new Point object - * with x and y values that relate to the origin of the display - * object instead of the origin of the Stage.

- * - * @param point An object created with the Point class. The Point object - * specifies the x and y coordinates as - * properties. - * @return A Point object with coordinates relative to the display object. - */ - DisplayObject.prototype.globalToLocal = function (point) { - return point; - }; - - /** - * Converts a two-dimensional point from the Stage(global) coordinates to a - * three-dimensional display object's(local) coordinates. - * - *

To use this method, first create an instance of the Point class. The x - * and y values that you assign to the Point object represent global - * coordinates because they are relative to the origin(0,0) of the main - * display area. Then pass the Point object to the - * globalToLocal3D() method as the point parameter. - * The method returns three-dimensional coordinates as a Vector3D object - * containing x, y, and z values that - * are relative to the origin of the three-dimensional display object.

- * - * @param point A two dimensional Point object representing global x and y - * coordinates. - * @return A Vector3D object with coordinates relative to the - * three-dimensional display object. - */ - DisplayObject.prototype.globalToLocal3D = function (point) { - return new away.geom.Vector3D(); - }; - - /** - * Evaluates the bounding box of the display object to see if it overlaps or - * intersects with the bounding box of the obj display object. - * - * @param obj The display object to test against. - * @return true if the bounding boxes of the display objects - * intersect; false if not. - */ - DisplayObject.prototype.hitTestObject = function (obj) { - return false; - }; - - /** - * Evaluates the display object to see if it overlaps or intersects with the - * point specified by the x and y parameters. The - * x and y parameters specify a point in the - * coordinate space of the Stage, not the display object container that - * contains the display object(unless that display object container is the - * Stage). - * - * @param x The x coordinate to test against this object. - * @param y The y coordinate to test against this object. - * @param shapeFlag Whether to check against the actual pixels of the object - * (true) or the bounding box - * (false). - * @return true if the display object overlaps or intersects - * with the specified point; false otherwise. - */ - DisplayObject.prototype.hitTestPoint = function (x, y, shapeFlag) { - if (typeof shapeFlag === "undefined") { shapeFlag = false; } - return false; - }; - - /** - * @inheritDoc - */ - DisplayObject.prototype.isIntersectingRay = function (rayPosition, rayDirection) { - var localRayPosition = this.inverseSceneTransform.transformVector(rayPosition); - var localRayDirection = this.inverseSceneTransform.deltaTransformVector(rayDirection); - var pickingCollisionVO = this._iPickingCollisionVO; - - if (!pickingCollisionVO.localNormal) - pickingCollisionVO.localNormal = new away.geom.Vector3D(); - - var rayEntryDistance = this.bounds.rayIntersection(localRayPosition, localRayDirection, pickingCollisionVO.localNormal); - - if (rayEntryDistance < 0) - return false; - - pickingCollisionVO.rayEntryDistance = rayEntryDistance; - pickingCollisionVO.localRayPosition = localRayPosition; - pickingCollisionVO.localRayDirection = localRayDirection; - pickingCollisionVO.rayPosition = rayPosition; - pickingCollisionVO.rayDirection = rayDirection; - pickingCollisionVO.rayOriginIsInsideBounds = rayEntryDistance == 0; - - return true; - }; - - /** - * Converts a three-dimensional point of the three-dimensional display - * object's(local) coordinates to a two-dimensional point in the Stage - * (global) coordinates. - * - *

For example, you can only use two-dimensional coordinates(x,y) to draw - * with the display.Graphics methods. To draw a - * three-dimensional object, you need to map the three-dimensional - * coordinates of a display object to two-dimensional coordinates. First, - * create an instance of the Vector3D class that holds the x-, y-, and z- - * coordinates of the three-dimensional display object. Then pass the - * Vector3D object to the local3DToGlobal() method as the - * point3d parameter. The method returns a two-dimensional Point - * object that can be used with the Graphics API to draw the - * three-dimensional object.

- * - * @param point3d A Vector3D object containing either a three-dimensional - * point or the coordinates of the three-dimensional display - * object. - * @return A two-dimensional point representing a three-dimensional point in - * two-dimensional space. - */ - DisplayObject.prototype.local3DToGlobal = function (point3d) { - return new away.geom.Point(); - }; - - /** - * Rotates the 3d object around to face a point defined relative to the local coordinates of the parent ObjectContainer3D. - * - * @param target The vector defining the point to be looked at - * @param upAxis An optional vector used to define the desired up orientation of the 3d object after rotation has occurred - */ - DisplayObject.prototype.lookAt = function (target, upAxis) { - if (typeof upAxis === "undefined") { upAxis = null; } - var yAxis; - var zAxis; - var xAxis; - var raw; - - if (upAxis == null) - upAxis = away.geom.Vector3D.Y_AXIS; - else - upAxis.normalize(); - - zAxis = target.subtract(this._iMatrix3D.position); - zAxis.normalize(); - - xAxis = upAxis.crossProduct(zAxis); - xAxis.normalize(); - - if (xAxis.length < 0.05) { - xAxis.x = upAxis.y; - xAxis.y = upAxis.x; - xAxis.z = 0; - xAxis.normalize(); - } - - yAxis = zAxis.crossProduct(xAxis); - - raw = away.geom.Matrix3DUtils.RAW_DATA_CONTAINER; - - raw[0] = xAxis.x; - raw[1] = xAxis.y; - raw[2] = xAxis.z; - raw[3] = 0; - - raw[4] = yAxis.x; - raw[5] = yAxis.y; - raw[6] = yAxis.z; - raw[7] = 0; - - raw[8] = zAxis.x; - raw[9] = zAxis.y; - raw[10] = zAxis.z; - raw[11] = 0; - - var m = new away.geom.Matrix3D(); - m.copyRawDataFrom(raw); - - var vec = m.decompose()[1]; - - this._rotationX = vec.x; - this._rotationY = vec.y; - this._rotationZ = vec.z; - - this.invalidateRotation(); - }; - - /** - * Converts the point object from the display object's(local) - * coordinates to the Stage(global) coordinates. - * - *

This method allows you to convert any given x and y - * coordinates from values that are relative to the origin(0,0) of a - * specific display object(local coordinates) to values that are relative to - * the origin of the Stage(global coordinates).

- * - *

To use this method, first create an instance of the Point class. The - * x and y values that you assign represent local coordinates - * because they relate to the origin of the display object.

- * - *

You then pass the Point instance that you created as the parameter to - * the localToGlobal() method. The method returns a new Point - * object with x and y values that relate to the origin of the - * Stage instead of the origin of the display object.

- * - * @param point The name or identifier of a point created with the Point - * class, specifying the x and y coordinates as - * properties. - * @return A Point object with coordinates relative to the Stage. - */ - DisplayObject.prototype.localToGlobal = function (point) { - return new away.geom.Point(); - }; - - /** - * Moves the 3d object directly to a point in space - * - * @param dx The amount of movement along the local x axis. - * @param dy The amount of movement along the local y axis. - * @param dz The amount of movement along the local z axis. - */ - DisplayObject.prototype.moveTo = function (dx, dy, dz) { - if (this._x == dx && this._y == dy && this._z == dz) - return; - - this._x = dx; - this._y = dy; - this._z = dz; - - this.invalidatePosition(); - }; - - /** - * Moves the local point around which the object rotates. - * - * @param dx The amount of movement along the local x axis. - * @param dy The amount of movement along the local y axis. - * @param dz The amount of movement along the local z axis. - */ - DisplayObject.prototype.movePivot = function (dx, dy, dz) { - if (this._pivot == null) - this._pivot = new away.geom.Vector3D(); - - this._pivot.x += dx; - this._pivot.y += dy; - this._pivot.z += dz; - - this.invalidatePivot(); - }; - - /** - * Rotates the 3d object around it's local x-axis - * - * @param angle The amount of rotation in degrees - */ - DisplayObject.prototype.pitch = function (angle) { - this.rotate(away.geom.Vector3D.X_AXIS, angle); - }; - - /** - * - */ - DisplayObject.prototype.getRenderSceneTransform = function (camera) { - if (this.orientationMode == base.OrientationMode.CAMERA_PLANE) { - var comps = camera.sceneTransform.decompose(); - var scale = comps[2]; - comps[0] = this.scenePosition; - scale.x = this._pScaleX; - scale.y = this._pScaleY; - scale.z = this._pScaleZ; - this._orientationMatrix.recompose(comps); - - //add in case of pivot - if (!this._pivotZero && this.alignmentMode == base.AlignmentMode.PIVOT_POINT) - this._orientationMatrix.prependTranslation(-this._pivot.x / this._pScaleX, -this._pivot.y / this._pScaleY, -this._pivot.z / this._pScaleZ); - - return this._orientationMatrix; - } - - return this.sceneTransform; - }; - - /** - * Rotates the 3d object around it's local z-axis - * - * @param angle The amount of rotation in degrees - */ - DisplayObject.prototype.roll = function (angle) { - this.rotate(away.geom.Vector3D.Z_AXIS, angle); - }; - - /** - * Rotates the 3d object around an axis by a defined angle - * - * @param axis The vector defining the axis of rotation - * @param angle The amount of rotation in degrees - */ - DisplayObject.prototype.rotate = function (axis, angle) { - var m = new away.geom.Matrix3D(); - m.prependRotation(angle, axis); - - var vec = m.decompose()[1]; - - this._rotationX += vec.x; - this._rotationY += vec.y; - this._rotationZ += vec.z; - - this.invalidateRotation(); - }; - - /** - * Rotates the 3d object directly to a euler angle - * - * @param ax The angle in degrees of the rotation around the x axis. - * @param ay The angle in degrees of the rotation around the y axis. - * @param az The angle in degrees of the rotation around the z axis. - */ - DisplayObject.prototype.rotateTo = function (ax, ay, az) { - this._rotationX = ax * away.geom.MathConsts.DEGREES_TO_RADIANS; - this._rotationY = ay * away.geom.MathConsts.DEGREES_TO_RADIANS; - this._rotationZ = az * away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - }; - - /** - * - */ - DisplayObject.prototype.removeEventListener = function (type, listener) { - _super.prototype.removeEventListener.call(this, type, listener); - - if (this.hasEventListener(type, listener)) - return; - - switch (type) { - case away.events.DisplayObjectEvent.POSITION_CHANGED: - this._listenToPositionChanged = false; - break; - - case away.events.DisplayObjectEvent.ROTATION_CHANGED: - this._listenToRotationChanged = false; - break; - - case away.events.DisplayObjectEvent.SCALE_CHANGED: - this._listenToScaleChanged = false; - break; - } - }; - - /** - * Moves the 3d object along a vector by a defined length - * - * @param axis The vector defining the axis of movement - * @param distance The length of the movement - */ - DisplayObject.prototype.translate = function (axis, distance) { - var x = axis.x, y = axis.y, z = axis.z; - var len = distance / Math.sqrt(x * x + y * y + z * z); - - this._x += x * len; - this._y += y * len; - this._z += z * len; - - this.invalidatePosition(); - }; - - /** - * Moves the 3d object along a vector by a defined length - * - * @param axis The vector defining the axis of movement - * @param distance The length of the movement - */ - DisplayObject.prototype.translateLocal = function (axis, distance) { - var x = axis.x, y = axis.y, z = axis.z; - var len = distance / Math.sqrt(x * x + y * y + z * z); - - this._iMatrix3D.prependTranslation(x * len, y * len, z * len); - - this._matrix3D.copyColumnTo(3, this._pos); - - this._x = this._pos.x; - this._y = this._pos.y; - this._z = this._pos.z; - - this.invalidatePosition(); - }; - - /** - * Rotates the 3d object around it's local y-axis - * - * @param angle The amount of rotation in degrees - */ - DisplayObject.prototype.yaw = function (angle) { - this.rotate(away.geom.Vector3D.Y_AXIS, angle); - }; - - Object.defineProperty(DisplayObject.prototype, "_iAssignedPartition", { - /** - * @internal - */ - get: function () { - return this._pImplicitPartition; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObject.prototype, "_iMatrix3D", { - /** - * The transformation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - * - * @internal - */ - get: function () { - if (this._matrix3DDirty) - this._pUpdateMatrix3D(); - - return this._matrix3D; - }, - set: function (val) { - // TODO: From AS3 - Do we still need this in JS ? - //ridiculous matrix error - /* - if (!val.rawData[0]) { - - var raw:number[] = away.geom.Matrix3DUtils.RAW_DATA_CONTAINER; - val.copyRawDataTo(raw); - raw[0] = this._smallestNumber; - val.copyRawDataFrom(raw); - } - //*/ - var elements = val.decompose(); - var vec; - - vec = elements[0]; - - if (this._x != vec.x || this._y != vec.y || this._z != vec.z) { - this._x = vec.x; - this._y = vec.y; - this._z = vec.z; - - this.invalidatePosition(); - } - - vec = elements[1]; - - if (this._rotationX != vec.x || this._rotationY != vec.y || this._rotationZ != vec.z) { - this._rotationX = vec.x; - this._rotationY = vec.y; - this._rotationZ = vec.z; - - this.invalidateRotation(); - } - - vec = elements[2]; - - if (this._pScaleX != vec.x || this._pScaleY != vec.y || this._pScaleZ != vec.z) { - this._pScaleX = vec.x; - this._pScaleY = vec.y; - this._pScaleZ = vec.z; - - this.invalidateScale(); - } - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObject.prototype, "_iPickingCollisionVO", { - /** - * @internal - */ - get: function () { - if (!this._pPickingCollisionVO) - this._pPickingCollisionVO = new away.pick.PickingCollisionVO(this); - - return this._pPickingCollisionVO; - }, - enumerable: true, - configurable: true - }); - - /** - * @internal - */ - DisplayObject.prototype.iSetParent = function (value) { - this._pParent = value; - - if (value) { - this._pUpdateImplicitMouseEnabled(value.mouseChildren); - this._pUpdateImplicitVisibility(value._iIsVisible()); - this._pUpdateImplicitPartition(value._iAssignedPartition); - this._iSetScene(value._pScene); - } else { - this._pUpdateImplicitMouseEnabled(true); - this._pUpdateImplicitVisibility(true); - this._pUpdateImplicitPartition(null); - - this._iSetScene(null); - } - }; - - /** - * @protected - */ - DisplayObject.prototype.pCreateDefaultBoundingVolume = function () { - // point lights should be using sphere bounds - // directional lights should be using null bounds - return new away.bounds.AxisAlignedBoundingBox(); - }; - - /** - * @protected - */ - DisplayObject.prototype.pCreateEntityPartitionNode = function () { - throw new away.errors.AbstractMethodError(); - }; - - /** - * @protected - */ - DisplayObject.prototype.pInvalidateBounds = function () { - this._pBoundsInvalid = true; - this._worldBoundsInvalid = true; - - if (this.isEntity) - this.invalidatePartition(); - }; - - /** - * @protected - */ - DisplayObject.prototype.pInvalidateSceneTransform = function () { - this._pSceneTransformDirty = !this._pIgnoreTransform; - this._inverseSceneTransformDirty = !this._pIgnoreTransform; - this._scenePositionDirty = !this._pIgnoreTransform; - - this._worldBoundsInvalid = !this._pIgnoreTransform; - - if (this.isEntity) - this.invalidatePartition(); - - if (this._listenToSceneTransformChanged) - this.notifySceneTransformChange(); - }; - - /** - * @protected - */ - DisplayObject.prototype.pUpdateBounds = function () { - this._width = this._pBounds.aabb.width * this._pScaleX; - this._height = this._pBounds.aabb.height * this._pScaleY; - this._depth = this._pBounds.aabb.depth * this._pScaleZ; - - this._pBoundsInvalid = false; - }; - - /** - * @protected - */ - DisplayObject.prototype._pUpdateImplicitMouseEnabled = function (value) { - this._pImplicitMouseEnabled = this._explicitMouseEnabled && value; - - // If there is a parent and this child does not have a picking collider, use its parent's picking collider. - if (this._pImplicitMouseEnabled && this._pParent && !this._pPickingCollider) - this._pPickingCollider = this._pParent._pPickingCollider; - }; - - /** - * @protected - */ - DisplayObject.prototype._pUpdateImplicitPartition = function (value) { - // assign parent implicit partition if no explicit one is given - this._pImplicitPartition = this._explicitPartition || value; - }; - - /** - * @protected - */ - DisplayObject.prototype._pUpdateImplicitVisibility = function (value) { - this._pImplicitVisibility = this._explicitVisibility && value; - }; - - /** - * @protected - */ - DisplayObject.prototype._pUpdateMatrix3D = function () { - this._pos.x = this._x; - this._pos.y = this._y; - this._pos.z = this._z; - - this._rot.x = this._rotationX; - this._rot.y = this._rotationY; - this._rot.z = this._rotationZ; - - this._sca.x = this._pScaleX; - this._sca.y = this._pScaleY; - this._sca.z = this._pScaleZ; - - this._matrix3D.recompose(this._transformComponents); - - if (!this._pivotZero) { - this._matrix3D.prependTranslation(-this._pivot.x / this._pScaleX, -this._pivot.y / this._pScaleY, -this._pivot.z / this._pScaleZ); - if (this.alignmentMode != base.AlignmentMode.PIVOT_POINT) - this._matrix3D.appendTranslation(this._pivot.x, this._pivot.y, this._pivot.z); - } - - this._matrix3DDirty = false; - this._positionDirty = false; - this._rotationDirty = false; - this._scaleDirty = false; - this._pivotDirty = false; - }; - - /** - * @protected - */ - DisplayObject.prototype.pUpdateSceneTransform = function () { - if (this._pParent && !this._pParent._iIsRoot) { - this._pSceneTransform.copyFrom(this._pParent.sceneTransform); - this._pSceneTransform.prepend(this._iMatrix3D); - } else { - this._pSceneTransform.copyFrom(this._iMatrix3D); - } - - this._pSceneTransformDirty = false; - }; - - DisplayObject.prototype._iAddRenderable = function (renderable) { - this._pRenderables.push(renderable); - - return renderable; - }; - - DisplayObject.prototype._iRemoveRenderable = function (renderable) { - var index = this._pRenderables.indexOf(renderable); - - this._pRenderables.splice(index, 1); - - return renderable; - }; - - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - DisplayObject.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { - return false; - }; - - /** - * - */ - DisplayObject.prototype._iInternalUpdate = function () { - if (this._iController) - this._iController.update(); - }; - - /** - * @internal - */ - DisplayObject.prototype._iIsVisible = function () { - return this._pImplicitVisibility; - }; - - /** - * @internal - */ - DisplayObject.prototype._iIsMouseEnabled = function () { - return this._pImplicitMouseEnabled; - }; - - /** - * @internal - */ - DisplayObject.prototype._iSetScene = function (value) { - // test to see if we're switching roots while we're already using a scene partition - /* - if (value == null) - this._oldScene = this._pScene; - - if (this._explicitPartition && this._oldScene && this._oldScene != this._pScene) - this.partition = null; - - if (value) - this._oldScene = null; - - // end of stupid partition test code - //*/ - if (this._pScene == value) - return; - - this._pUpdateScene(value); - - if (!this._pSceneTransformDirty && !this._pIgnoreTransform) - this.pInvalidateSceneTransform(); - }; - - /** - * @protected - */ - DisplayObject.prototype._pUpdateScene = function (value) { - if (this._pScene) { - this._pScene.dispatchEvent(new away.events.SceneEvent(away.events.SceneEvent.REMOVED_FROM_SCENE, this)); - - //unregister entity from current scene - this._pScene.iUnregisterEntity(this); - } - - this._pScene = value; - - if (value) { - value.dispatchEvent(new away.events.SceneEvent(away.events.SceneEvent.ADDED_TO_SCENE, this)); - - //register entity with new scene - value.iRegisterEntity(this); - } - - this.notifySceneChange(); - }; - - /** - * @private - */ - DisplayObject.prototype.notifyPositionChanged = function () { - if (!this._positionChanged) - this._positionChanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.POSITION_CHANGED, this); - - this.dispatchEvent(this._positionChanged); - }; - - /** - * @private - */ - DisplayObject.prototype.notifyRotationChanged = function () { - if (!this._rotationChanged) - this._rotationChanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.ROTATION_CHANGED, this); - - this.dispatchEvent(this._rotationChanged); - }; - - /** - * @private - */ - DisplayObject.prototype.notifyScaleChanged = function () { - if (!this._scaleChanged) - this._scaleChanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCALE_CHANGED, this); - - this.dispatchEvent(this._scaleChanged); - }; - - /** - * @private - */ - DisplayObject.prototype.notifySceneChange = function () { - if (this._listenToSceneChanged) { - if (!this._scenechanged) - this._scenechanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCENE_CHANGED, this); - - this.dispatchEvent(this._scenechanged); - } - }; - - /** - * @private - */ - DisplayObject.prototype.notifySceneTransformChange = function () { - if (!this._sceneTransformChanged) - this._sceneTransformChanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCENETRANSFORM_CHANGED, this); - - this.dispatchEvent(this._sceneTransformChanged); - }; - - /** - * Invalidates the 3D transformation matrix, causing it to be updated upon the next request - * - * @private - */ - DisplayObject.prototype.invalidateMatrix3D = function () { - if (this._matrix3DDirty) - return; - - this._matrix3DDirty = true; - - if (!this._pSceneTransformDirty && !this._pIgnoreTransform) - this.pInvalidateSceneTransform(); - }; - - /** - * @private - */ - DisplayObject.prototype.invalidatePartition = function () { - if (this._iAssignedPartition) - this._iAssignedPartition.iMarkForUpdate(this); - }; - - /** - * @private - */ - DisplayObject.prototype.invalidatePivot = function () { - this._pivotZero = (this._pivot.x == 0) && (this._pivot.y == 0) && (this._pivot.z == 0); - - if (this._pivotDirty) - return; - - this._pivotDirty = true; - - this.invalidateMatrix3D(); - }; - - /** - * @private - */ - DisplayObject.prototype.invalidatePosition = function () { - if (this._positionDirty) - return; - - this._positionDirty = true; - - this.invalidateMatrix3D(); - - if (this._listenToPositionChanged) - this.notifyPositionChanged(); - }; - - /** - * @private - */ - DisplayObject.prototype.invalidateRotation = function () { - if (this._rotationDirty) - return; - - this._rotationDirty = true; - - this.invalidateMatrix3D(); - - if (this._listenToRotationChanged) - this.notifyRotationChanged(); - }; - - /** - * @private - */ - DisplayObject.prototype.invalidateScale = function () { - if (this._scaleDirty) - return; - - this._scaleDirty = true; - - this.invalidateMatrix3D(); - - if (this._listenToScaleChanged) - this.notifyScaleChanged(); - }; - return DisplayObject; - })(away.library.NamedAssetBase); - base.DisplayObject = DisplayObject; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - /** - * - * Geometry is a collection of SubGeometries, each of which contain the actual geometrical data such as vertices, - * normals, uvs, etc. It also contains a reference to an animation class, which defines how the geometry moves. - * A Geometry object is assigned to a Mesh, a scene graph occurence of the geometry, which in turn assigns - * the SubGeometries to its respective TriangleSubMesh objects. - * - * - * - * @see away.core.base.SubGeometry - * @see away.entities.Mesh - * - * @class away.base.Geometry - */ - var Geometry = (function (_super) { - __extends(Geometry, _super); - /** - * Creates a new Geometry object. - */ - function Geometry() { - _super.call(this); - - this._subGeometries = new Array(); - } - Object.defineProperty(Geometry.prototype, "assetType", { - get: function () { - return away.library.AssetType.GEOMETRY; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Geometry.prototype, "subGeometries", { - /** - * A collection of TriangleSubGeometry objects, each of which contain geometrical data such as vertices, normals, etc. - */ - get: function () { - return this._subGeometries; - }, - enumerable: true, - configurable: true - }); - - Geometry.prototype.getSubGeometries = function () { - return this._subGeometries; - }; - - Geometry.prototype.applyTransformation = function (transform) { - var len = this._subGeometries.length; - for (var i = 0; i < len; ++i) - this._subGeometries[i].applyTransformation(transform); - }; - - /** - * Adds a new TriangleSubGeometry object to the list. - * @param subGeometry The TriangleSubGeometry object to be added. - */ - Geometry.prototype.addSubGeometry = function (subGeometry) { - this._subGeometries.push(subGeometry); - - subGeometry.parentGeometry = this; - - if (this.hasEventListener(away.events.GeometryEvent.SUB_GEOMETRY_ADDED)) - this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.SUB_GEOMETRY_ADDED, subGeometry)); - - this.iInvalidateBounds(subGeometry); - }; - - /** - * Removes a new TriangleSubGeometry object from the list. - * @param subGeometry The TriangleSubGeometry object to be removed. - */ - Geometry.prototype.removeSubGeometry = function (subGeometry) { - this._subGeometries.splice(this._subGeometries.indexOf(subGeometry), 1); - - subGeometry.parentGeometry = null; - - if (this.hasEventListener(away.events.GeometryEvent.SUB_GEOMETRY_REMOVED)) - this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.SUB_GEOMETRY_REMOVED, subGeometry)); - - this.iInvalidateBounds(subGeometry); - }; - - /** - * Clones the geometry. - * @return An exact duplicate of the current Geometry object. - */ - Geometry.prototype.clone = function () { - var clone = new Geometry(); - var len = this._subGeometries.length; - - for (var i = 0; i < len; ++i) - clone.addSubGeometry(this._subGeometries[i].clone()); - - return clone; - }; - - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - Geometry.prototype.scale = function (scale) { - var numSubGeoms = this._subGeometries.length; - for (var i = 0; i < numSubGeoms; ++i) - this._subGeometries[i].scale(scale); - }; - - /** - * Clears all resources used by the Geometry object, including SubGeometries. - */ - Geometry.prototype.dispose = function () { - var numSubGeoms = this._subGeometries.length; - - for (var i = 0; i < numSubGeoms; ++i) { - var subGeom = this._subGeometries[0]; - this.removeSubGeometry(subGeom); - subGeom.dispose(); - } - }; - - /** - * Scales the uv coordinates (tiling) - * @param scaleU The amount by which to scale on the u axis. Default is 1; - * @param scaleV The amount by which to scale on the v axis. Default is 1; - */ - Geometry.prototype.scaleUV = function (scaleU, scaleV) { - if (typeof scaleU === "undefined") { scaleU = 1; } - if (typeof scaleV === "undefined") { scaleV = 1; } - var numSubGeoms = this._subGeometries.length; - - for (var i = 0; i < numSubGeoms; ++i) - this._subGeometries[i].scaleUV(scaleU, scaleV); - }; - - Geometry.prototype.iInvalidateBounds = function (subGeom) { - if (this.hasEventListener(away.events.GeometryEvent.BOUNDS_INVALID)) - this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.BOUNDS_INVALID, subGeom)); - }; - return Geometry; - })(away.library.NamedAssetBase); - base.Geometry = Geometry; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The GradientType class provides values for the type parameter - * in the beginGradientFill() and - * lineGradientStyle() methods of the flash.display.Graphics - * class. - */ - (function (base) { - var GradientType = (function () { - function GradientType() { - } - GradientType.LINEAR = "linear"; - - GradientType.RADIAL = "radial"; - return GradientType; - })(); - base.GradientType = GradientType; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The Graphics class contains a set of methods that you can use to create a - * vector shape. Display objects that support drawing include Sprite and Shape - * objects. Each of these classes includes a graphics property - * that is a Graphics object. The following are among those helper functions - * provided for ease of use: drawRect(), - * drawRoundRect(), drawCircle(), and - * drawEllipse(). - * - *

You cannot create a Graphics object directly from ActionScript code. If - * you call new Graphics(), an exception is thrown.

- * - *

The Graphics class is final; it cannot be subclassed.

- */ - (function (base) { - var Graphics = (function () { - function Graphics() { - } - /** - * Fills a drawing area with a bitmap image. The bitmap can be repeated or - * tiled to fill the area. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param bitmap A transparent or opaque bitmap image that contains the bits - * to be displayed. - * @param matrix A matrix object(of the flash.geom.Matrix class), which you - * can use to define transformations on the bitmap. For - * example, you can use the following matrix to rotate a bitmap - * by 45 degrees(pi/4 radians): - * @param repeat If true, the bitmap image repeats in a tiled - * pattern. If false, the bitmap image does not - * repeat, and the edges of the bitmap are used for any fill - * area that extends beyond the bitmap. - * - *

For example, consider the following bitmap(a 20 x - * 20-pixel checkerboard pattern):

- * - *

When repeat is set to true(as - * in the following example), the bitmap fill repeats the - * bitmap:

- * - *

When repeat is set to false, - * the bitmap fill uses the edge pixels for the fill area - * outside the bitmap:

- * @param smooth If false, upscaled bitmap images are rendered - * by using a nearest-neighbor algorithm and look pixelated. If - * true, upscaled bitmap images are rendered by - * using a bilinear algorithm. Rendering by using the nearest - * neighbor algorithm is faster. - */ - Graphics.prototype.beginBitmapFill = function (bitmap, matrix, repeat, smooth) { - if (typeof matrix === "undefined") { matrix = null; } - if (typeof repeat === "undefined") { repeat = true; } - if (typeof smooth === "undefined") { smooth = false; } - }; - - /** - * Specifies a simple one-color fill that subsequent calls to other Graphics - * methods(such as lineTo() or drawCircle()) use - * when drawing. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param color The color of the fill(0xRRGGBB). - * @param alpha The alpha value of the fill(0.0 to 1.0). - */ - Graphics.prototype.beginFill = function (color /*int*/ , alpha) { - if (typeof alpha === "undefined") { alpha = 1; } - }; - - /** - * Specifies a gradient fill used by subsequent calls to other Graphics - * methods(such as lineTo() or drawCircle()) for - * the object. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param type A value from the GradientType class that - * specifies which gradient type to use: - * GradientType.LINEAR or - * GradientType.RADIAL. - * @param colors An array of RGB hexadecimal color values used - * in the gradient; for example, red is 0xFF0000, - * blue is 0x0000FF, and so on. You can specify - * up to 15 colors. For each color, specify a - * corresponding value in the alphas and ratios - * parameters. - * @param alphas An array of alpha values for the corresponding - * colors in the colors array; valid values are 0 - * to 1. If the value is less than 0, the default - * is 0. If the value is greater than 1, the - * default is 1. - * @param ratios An array of color distribution ratios; valid - * values are 0-255. This value defines the - * percentage of the width where the color is - * sampled at 100%. The value 0 represents the - * left position in the gradient box, and 255 - * represents the right position in the gradient - * box. - * @param matrix A transformation matrix as defined by the - * flash.geom.Matrix class. The flash.geom.Matrix - * class includes a - * createGradientBox() method, which - * lets you conveniently set up the matrix for use - * with the beginGradientFill() - * method. - * @param spreadMethod A value from the SpreadMethod class that - * specifies which spread method to use, either: - * SpreadMethod.PAD, - * SpreadMethod.REFLECT, or - * SpreadMethod.REPEAT. - * - *

For example, consider a simple linear - * gradient between two colors:

- * - *

This example uses - * SpreadMethod.PAD for the spread - * method, and the gradient fill looks like the - * following:

- * - *

If you use SpreadMethod.REFLECT - * for the spread method, the gradient fill looks - * like the following:

- * - *

If you use SpreadMethod.REPEAT - * for the spread method, the gradient fill looks - * like the following:

- * @param interpolationMethod A value from the InterpolationMethod class that - * specifies which value to use: - * InterpolationMethod.LINEAR_RGB or - * InterpolationMethod.RGB - * - *

For example, consider a simple linear - * gradient between two colors(with the - * spreadMethod parameter set to - * SpreadMethod.REFLECT). The - * different interpolation methods affect the - * appearance as follows:

- * @param focalPointRatio A number that controls the location of the - * focal point of the gradient. 0 means that the - * focal point is in the center. 1 means that the - * focal point is at one border of the gradient - * circle. -1 means that the focal point is at the - * other border of the gradient circle. A value - * less than -1 or greater than 1 is rounded to -1 - * or 1. For example, the following example shows - * a focalPointRatio set to 0.75: - * @throws ArgumentError If the type parameter is not valid. - */ - Graphics.prototype.beginGradientFill = function (type, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio) { - if (typeof matrix === "undefined") { matrix = null; } - if (typeof spreadMethod === "undefined") { spreadMethod = "pad"; } - if (typeof interpolationMethod === "undefined") { interpolationMethod = "rgb"; } - if (typeof focalPointRatio === "undefined") { focalPointRatio = 0; } - }; - - /** - * Specifies a shader fill used by subsequent calls to other Graphics methods - * (such as lineTo() or drawCircle()) for the - * object. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - *

Shader fills are not supported under GPU rendering; filled areas will - * be colored cyan.

- * - * @param shader The shader to use for the fill. This Shader instance is not - * required to specify an image input. However, if an image - * input is specified in the shader, the input must be provided - * manually. To specify the input, set the input - * property of the corresponding ShaderInput property of the - * Shader.data property. - * - *

When you pass a Shader instance as an argument the shader - * is copied internally. The drawing fill operation uses that - * internal copy, not a reference to the original shader. Any - * changes made to the shader, such as changing a parameter - * value, input, or bytecode, are not applied to the copied - * shader that's used for the fill.

- * @param matrix A matrix object(of the flash.geom.Matrix class), which you - * can use to define transformations on the shader. For - * example, you can use the following matrix to rotate a shader - * by 45 degrees(pi/4 radians): - * - *

The coordinates received in the shader are based on the - * matrix that is specified for the matrix - * parameter. For a default(null) matrix, the - * coordinates in the shader are local pixel coordinates which - * can be used to sample an input.

- * @throws ArgumentError When the shader output type is not compatible with - * this operation(the shader must specify a - * pixel3 or pixel4 output). - * @throws ArgumentError When the shader specifies an image input that isn't - * provided. - * @throws ArgumentError When a ByteArray or Vector. instance is used - * as an input and the width and - * height properties aren't specified for - * the ShaderInput, or the specified values don't match - * the amount of data in the input object. See the - * ShaderInput.input property for more - * information. - */ - // public beginShaderFill(shader:Shader, matrix:away.geom.Matrix = null) - // { - // - // } - /** - * Clears the graphics that were drawn to this Graphics object, and resets - * fill and line style settings. - * - */ - Graphics.prototype.clear = function () { - }; - - /** - * Copies all of drawing commands from the source Graphics object into the - * calling Graphics object. - * - * @param sourceGraphics The Graphics object from which to copy the drawing - * commands. - */ - Graphics.prototype.copyFrom = function (sourceGraphics) { - }; - - /** - * Draws a cubic Bezier curve from the current drawing position to the - * specified anchor point. Cubic Bezier curves consist of two anchor points - * and two control points. The curve interpolates the two anchor points and - * curves toward the two control points. - * - * The four points you use to draw a cubic Bezier curve with the - * cubicCurveTo() method are as follows: - * - *
    - *
  • The current drawing position is the first anchor point.
  • - *
  • The anchorX and anchorY parameters specify the second anchor point. - *
  • - *
  • The controlX1 and controlY1 parameters - * specify the first control point.
  • - *
  • The controlX2 and controlY2 parameters - * specify the second control point.
  • - *
- * - * If you call the cubicCurveTo() method before calling the - * moveTo() method, your curve starts at position (0, 0). - * - * If the cubicCurveTo() method succeeds, the Flash runtime sets - * the current drawing position to (anchorX, - * anchorY). If the cubicCurveTo() method fails, - * the current drawing position remains unchanged. - * - * If your movie clip contains content created with the Flash drawing tools, - * the results of calls to the cubicCurveTo() method are drawn - * underneath that content. - * - * @param controlX1 Specifies the horizontal position of the first control - * point relative to the registration point of the parent - * display object. - * @param controlY1 Specifies the vertical position of the first control - * point relative to the registration point of the parent - * display object. - * @param controlX2 Specifies the horizontal position of the second control - * point relative to the registration point of the parent - * display object. - * @param controlY2 Specifies the vertical position of the second control - * point relative to the registration point of the parent - * display object. - * @param anchorX Specifies the horizontal position of the anchor point - * relative to the registration point of the parent display - * object. - * @param anchorY Specifies the vertical position of the anchor point - * relative to the registration point of the parent display - * object. - */ - Graphics.prototype.cubicCurveTo = function (controlX1, controlY1, controlX2, controlY2, anchorX, anchorY) { - }; - - /** - * Draws a curve using the current line style from the current drawing - * position to(anchorX, anchorY) and using the control point that - * (controlX, controlY) specifies. The current - * drawing position is then set to(anchorX, - * anchorY). If the movie clip in which you are drawing contains - * content created with the Flash drawing tools, calls to the - * curveTo() method are drawn underneath this content. If you - * call the curveTo() method before any calls to the - * moveTo() method, the default of the current drawing position - * is(0, 0). If any of the parameters are missing, this method fails and the - * current drawing position is not changed. - * - *

The curve drawn is a quadratic Bezier curve. Quadratic Bezier curves - * consist of two anchor points and one control point. The curve interpolates - * the two anchor points and curves toward the control point.

- * - * @param controlX A number that specifies the horizontal position of the - * control point relative to the registration point of the - * parent display object. - * @param controlY A number that specifies the vertical position of the - * control point relative to the registration point of the - * parent display object. - * @param anchorX A number that specifies the horizontal position of the - * next anchor point relative to the registration point of - * the parent display object. - * @param anchorY A number that specifies the vertical position of the next - * anchor point relative to the registration point of the - * parent display object. - */ - Graphics.prototype.curveTo = function (controlX, controlY, anchorX, anchorY) { - }; - - /** - * Draws a circle. Set the line style, fill, or both before you call the - * drawCircle() method, by calling the linestyle(), - * lineGradientStyle(), beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. - * - * @param x The x location of the center of the circle relative - * to the registration point of the parent display object(in - * pixels). - * @param y The y location of the center of the circle relative - * to the registration point of the parent display object(in - * pixels). - * @param radius The radius of the circle(in pixels). - */ - Graphics.prototype.drawCircle = function (x, y, radius) { - }; - - /** - * Draws an ellipse. Set the line style, fill, or both before you call the - * drawEllipse() method, by calling the - * linestyle(), lineGradientStyle(), - * beginFill(), beginGradientFill(), or - * beginBitmapFill() method. - * - * @param x The x location of the top-left of the bounding-box of - * the ellipse relative to the registration point of the parent - * display object(in pixels). - * @param y The y location of the top left of the bounding-box of - * the ellipse relative to the registration point of the parent - * display object(in pixels). - * @param width The width of the ellipse(in pixels). - * @param height The height of the ellipse(in pixels). - */ - Graphics.prototype.drawEllipse = function (x, y, width, height) { - }; - - /** - * Submits a series of IGraphicsData instances for drawing. This method - * accepts a Vector containing objects including paths, fills, and strokes - * that implement the IGraphicsData interface. A Vector of IGraphicsData - * instances can refer to a part of a shape, or a complex fully defined set - * of data for rendering a complete shape. - * - *

Graphics paths can contain other graphics paths. If the - * graphicsData Vector includes a path, that path and all its - * sub-paths are rendered during this operation.

- * - */ - Graphics.prototype.drawGraphicsData = function (graphicsData) { - }; - - /** - * Submits a series of commands for drawing. The drawPath() - * method uses vector arrays to consolidate individual moveTo(), - * lineTo(), and curveTo() drawing commands into a - * single call. The drawPath() method parameters combine drawing - * commands with x- and y-coordinate value pairs and a drawing direction. The - * drawing commands are values from the GraphicsPathCommand class. The x- and - * y-coordinate value pairs are Numbers in an array where each pair defines a - * coordinate location. The drawing direction is a value from the - * GraphicsPathWinding class. - * - *

Generally, drawings render faster with drawPath() than - * with a series of individual lineTo() and - * curveTo() methods.

- * - *

The drawPath() method uses a uses a floating computation - * so rotation and scaling of shapes is more accurate and gives better - * results. However, curves submitted using the drawPath() - * method can have small sub-pixel alignment errors when used in conjunction - * with the lineTo() and curveTo() methods.

- * - *

The drawPath() method also uses slightly different rules - * for filling and drawing lines. They are:

- * - *
    - *
  • When a fill is applied to rendering a path: - *
      - *
    • A sub-path of less than 3 points is not rendered.(But note that the - * stroke rendering will still occur, consistent with the rules for strokes - * below.)
    • - *
    • A sub-path that isn't closed(the end point is not equal to the - * begin point) is implicitly closed.
    • - *
    - *
  • - *
  • When a stroke is applied to rendering a path: - *
      - *
    • The sub-paths can be composed of any number of points.
    • - *
    • The sub-path is never implicitly closed.
    • - *
    - *
  • - *
- * - * @param winding Specifies the winding rule using a value defined in the - * GraphicsPathWinding class. - */ - Graphics.prototype.drawPath = function (commands, data, winding) { - }; - - /** - * Draws a rectangle. Set the line style, fill, or both before you call the - * drawRect() method, by calling the linestyle(), - * lineGradientStyle(), beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. - * - * @param x A number indicating the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number indicating the vertical position relative to the - * registration point of the parent display object(in pixels). - * @param width The width of the rectangle(in pixels). - * @param height The height of the rectangle(in pixels). - * @throws ArgumentError If the width or height - * parameters are not a number - * (Number.NaN). - */ - Graphics.prototype.drawRect = function (x, y, width, height) { - }; - - /** - * Draws a rounded rectangle. Set the line style, fill, or both before you - * call the drawRoundRect() method, by calling the - * linestyle(), lineGradientStyle(), - * beginFill(), beginGradientFill(), or - * beginBitmapFill() method. - * - * @param x A number indicating the horizontal position relative - * to the registration point of the parent display - * object(in pixels). - * @param y A number indicating the vertical position relative to - * the registration point of the parent display object - * (in pixels). - * @param width The width of the round rectangle(in pixels). - * @param height The height of the round rectangle(in pixels). - * @param ellipseWidth The width of the ellipse used to draw the rounded - * corners(in pixels). - * @param ellipseHeight The height of the ellipse used to draw the rounded - * corners(in pixels). Optional; if no value is - * specified, the default value matches that provided - * for the ellipseWidth parameter. - * @throws ArgumentError If the width, height, - * ellipseWidth or - * ellipseHeight parameters are not a - * number(Number.NaN). - */ - Graphics.prototype.drawRoundRect = function (x, y, width, height, ellipseWidth, ellipseHeight) { - if (typeof ellipseHeight === "undefined") { ellipseHeight = NaN; } - }; - - //public drawRoundRectComplex(x:Float, y:Float, width:Float, height:Float, topLeftRadius:Float, topRightRadius:Float, bottomLeftRadius:Float, bottomRightRadius:Float):Void; - /** - * Renders a set of triangles, typically to distort bitmaps and give them a - * three-dimensional appearance. The drawTriangles() method maps - * either the current fill, or a bitmap fill, to the triangle faces using a - * set of(u,v) coordinates. - * - *

Any type of fill can be used, but if the fill has a transform matrix - * that transform matrix is ignored.

- * - *

A uvtData parameter improves texture mapping when a - * bitmap fill is used.

- * - * @param culling Specifies whether to render triangles that face in a - * specified direction. This parameter prevents the rendering - * of triangles that cannot be seen in the current view. This - * parameter can be set to any value defined by the - * TriangleCulling class. - */ - Graphics.prototype.drawTriangles = function (vertices, indices, uvtData, culling) { - if (typeof indices === "undefined") { indices = null; } - if (typeof uvtData === "undefined") { uvtData = null; } - if (typeof culling === "undefined") { culling = null; } - }; - - /** - * Applies a fill to the lines and curves that were added since the last call - * to the beginFill(), beginGradientFill(), or - * beginBitmapFill() method. Flash uses the fill that was - * specified in the previous call to the beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. If the current drawing position does not equal the previous - * position specified in a moveTo() method and a fill is - * defined, the path is closed with a line and then filled. - * - */ - Graphics.prototype.endFill = function () { - }; - - /** - * Specifies a bitmap to use for the line stroke when drawing lines. - * - *

The bitmap line style is used for subsequent calls to Graphics methods - * such as the lineTo() method or the drawCircle() - * method. The line style remains in effect until you call the - * lineStyle() or lineGradientStyle() methods, or - * the lineBitmapStyle() method again with different parameters. - *

- * - *

You can call the lineBitmapStyle() method in the middle of - * drawing a path to specify different styles for different line segments - * within a path.

- * - *

Call the lineStyle() method before you call the - * lineBitmapStyle() method to enable a stroke, or else the - * value of the line style is undefined.

- * - *

Calls to the clear() method set the line style back to - * undefined.

- * - * @param bitmap The bitmap to use for the line stroke. - * @param matrix An optional transformation matrix as defined by the - * flash.geom.Matrix class. The matrix can be used to scale or - * otherwise manipulate the bitmap before applying it to the - * line style. - * @param repeat Whether to repeat the bitmap in a tiled fashion. - * @param smooth Whether smoothing should be applied to the bitmap. - */ - Graphics.prototype.lineBitmapStyle = function (bitmap, matrix, repeat, smooth) { - if (typeof matrix === "undefined") { matrix = null; } - if (typeof repeat === "undefined") { repeat = true; } - if (typeof smooth === "undefined") { smooth = false; } - }; - - /** - * Specifies a gradient to use for the stroke when drawing lines. - * - *

The gradient line style is used for subsequent calls to Graphics - * methods such as the lineTo() methods or the - * drawCircle() method. The line style remains in effect until - * you call the lineStyle() or lineBitmapStyle() - * methods, or the lineGradientStyle() method again with - * different parameters.

- * - *

You can call the lineGradientStyle() method in the middle - * of drawing a path to specify different styles for different line segments - * within a path.

- * - *

Call the lineStyle() method before you call the - * lineGradientStyle() method to enable a stroke, or else the - * value of the line style is undefined.

- * - *

Calls to the clear() method set the line style back to - * undefined.

- * - * @param type A value from the GradientType class that - * specifies which gradient type to use, either - * GradientType.LINEAR or GradientType.RADIAL. - * @param colors An array of RGB hexadecimal color values used - * in the gradient; for example, red is 0xFF0000, - * blue is 0x0000FF, and so on. You can specify - * up to 15 colors. For each color, specify a - * corresponding value in the alphas and ratios - * parameters. - * @param alphas An array of alpha values for the corresponding - * colors in the colors array; valid values are 0 - * to 1. If the value is less than 0, the default - * is 0. If the value is greater than 1, the - * default is 1. - * @param ratios An array of color distribution ratios; valid - * values are 0-255. This value defines the - * percentage of the width where the color is - * sampled at 100%. The value 0 represents the - * left position in the gradient box, and 255 - * represents the right position in the gradient - * box. - * @param matrix A transformation matrix as defined by the - * flash.geom.Matrix class. The flash.geom.Matrix - * class includes a - * createGradientBox() method, which - * lets you conveniently set up the matrix for use - * with the lineGradientStyle() - * method. - * @param spreadMethod A value from the SpreadMethod class that - * specifies which spread method to use: - * @param interpolationMethod A value from the InterpolationMethod class that - * specifies which value to use. For example, - * consider a simple linear gradient between two - * colors(with the spreadMethod - * parameter set to - * SpreadMethod.REFLECT). The - * different interpolation methods affect the - * appearance as follows: - * @param focalPointRatio A number that controls the location of the - * focal point of the gradient. The value 0 means - * the focal point is in the center. The value 1 - * means the focal point is at one border of the - * gradient circle. The value -1 means that the - * focal point is at the other border of the - * gradient circle. Values less than -1 or greater - * than 1 are rounded to -1 or 1. The following - * image shows a gradient with a - * focalPointRatio of -0.75: - */ - Graphics.prototype.lineGradientStyle = function (type, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio) { - if (typeof matrix === "undefined") { matrix = null; } - if (typeof spreadMethod === "undefined") { spreadMethod = null; } - if (typeof interpolationMethod === "undefined") { interpolationMethod = null; } - if (typeof focalPointRatio === "undefined") { focalPointRatio = 0; } - }; - - /** - * Specifies a shader to use for the line stroke when drawing lines. - * - *

The shader line style is used for subsequent calls to Graphics methods - * such as the lineTo() method or the drawCircle() - * method. The line style remains in effect until you call the - * lineStyle() or lineGradientStyle() methods, or - * the lineBitmapStyle() method again with different parameters. - *

- * - *

You can call the lineShaderStyle() method in the middle of - * drawing a path to specify different styles for different line segments - * within a path.

- * - *

Call the lineStyle() method before you call the - * lineShaderStyle() method to enable a stroke, or else the - * value of the line style is undefined.

- * - *

Calls to the clear() method set the line style back to - * undefined.

- * - * @param shader The shader to use for the line stroke. - * @param matrix An optional transformation matrix as defined by the - * flash.geom.Matrix class. The matrix can be used to scale or - * otherwise manipulate the bitmap before applying it to the - * line style. - */ - // public lineShaderStyle(shader:Shader, matrix:away.geom.Matrix = null) - // { - // - // } - /** - * Specifies a line style used for subsequent calls to Graphics methods such - * as the lineTo() method or the drawCircle() - * method. The line style remains in effect until you call the - * lineGradientStyle() method, the - * lineBitmapStyle() method, or the lineStyle() - * method with different parameters. - * - *

You can call the lineStyle() method in the middle of - * drawing a path to specify different styles for different line segments - * within the path.

- * - *

Note: Calls to the clear() method set the line - * style back to undefined.

- * - *

Note: Flash Lite 4 supports only the first three parameters - * (thickness, color, and alpha).

- * - * @param thickness An integer that indicates the thickness of the line in - * points; valid values are 0-255. If a number is not - * specified, or if the parameter is undefined, a line is - * not drawn. If a value of less than 0 is passed, the - * default is 0. The value 0 indicates hairline - * thickness; the maximum thickness is 255. If a value - * greater than 255 is passed, the default is 255. - * @param color A hexadecimal color value of the line; for example, - * red is 0xFF0000, blue is 0x0000FF, and so on. If a - * value is not indicated, the default is 0x000000 - * (black). Optional. - * @param alpha A number that indicates the alpha value of the color - * of the line; valid values are 0 to 1. If a value is - * not indicated, the default is 1(solid). If the value - * is less than 0, the default is 0. If the value is - * greater than 1, the default is 1. - * @param pixelHinting(Not supported in Flash Lite 4) A Boolean value that - * specifies whether to hint strokes to full pixels. This - * affects both the position of anchors of a curve and - * the line stroke size itself. With - * pixelHinting set to true, - * line widths are adjusted to full pixel widths. With - * pixelHinting set to false, - * disjoints can appear for curves and straight lines. - * For example, the following illustrations show how - * Flash Player or Adobe AIR renders two rounded - * rectangles that are identical, except that the - * pixelHinting parameter used in the - * lineStyle() method is set differently - * (the images are scaled by 200%, to emphasize the - * difference): - * - *

If a value is not supplied, the line does not use - * pixel hinting.

- * @param scaleMode (Not supported in Flash Lite 4) A value from the - * LineScaleMode class that specifies which scale mode to - * use: - *
    - *
  • LineScaleMode.NORMAL - Always - * scale the line thickness when the object is scaled - * (the default).
  • - *
  • LineScaleMode.NONE - Never scale - * the line thickness.
  • - *
  • LineScaleMode.VERTICAL - Do not - * scale the line thickness if the object is scaled - * vertically only. For example, consider the - * following circles, drawn with a one-pixel line, and - * each with the scaleMode parameter set to - * LineScaleMode.VERTICAL. The circle on the - * left is scaled vertically only, and the circle on the - * right is scaled both vertically and horizontally: - *
  • - *
  • LineScaleMode.HORIZONTAL - Do not - * scale the line thickness if the object is scaled - * horizontally only. For example, consider the - * following circles, drawn with a one-pixel line, and - * each with the scaleMode parameter set to - * LineScaleMode.HORIZONTAL. The circle on - * the left is scaled horizontally only, and the circle - * on the right is scaled both vertically and - * horizontally:
  • - *
- * @param caps (Not supported in Flash Lite 4) A value from the - * CapsStyle class that specifies the type of caps at the - * end of lines. Valid values are: - * CapsStyle.NONE, - * CapsStyle.ROUND, and - * CapsStyle.SQUARE. If a value is not - * indicated, Flash uses round caps. - * - *

For example, the following illustrations show the - * different capsStyle settings. For each - * setting, the illustration shows a blue line with a - * thickness of 30(for which the capsStyle - * applies), and a superimposed black line with a - * thickness of 1(for which no capsStyle - * applies):

- * @param joints (Not supported in Flash Lite 4) A value from the - * JointStyle class that specifies the type of joint - * appearance used at angles. Valid values are: - * JointStyle.BEVEL, - * JointStyle.MITER, and - * JointStyle.ROUND. If a value is not - * indicated, Flash uses round joints. - * - *

For example, the following illustrations show the - * different joints settings. For each - * setting, the illustration shows an angled blue line - * with a thickness of 30(for which the - * jointStyle applies), and a superimposed - * angled black line with a thickness of 1(for which no - * jointStyle applies):

- * - *

Note: For joints set to - * JointStyle.MITER, you can use the - * miterLimit parameter to limit the length - * of the miter.

- * @param miterLimit (Not supported in Flash Lite 4) A number that - * indicates the limit at which a miter is cut off. Valid - * values range from 1 to 255(and values outside that - * range are rounded to 1 or 255). This value is only - * used if the jointStyle is set to - * "miter". The miterLimit - * value represents the length that a miter can extend - * beyond the point at which the lines meet to form a - * joint. The value expresses a factor of the line - * thickness. For example, with a - * miterLimit factor of 2.5 and a - * thickness of 10 pixels, the miter is cut - * off at 25 pixels. - * - *

For example, consider the following angled lines, - * each drawn with a thickness of 20, but - * with miterLimit set to 1, 2, and 4. - * Superimposed are black reference lines showing the - * meeting points of the joints:

- * - *

Notice that a given miterLimit value - * has a specific maximum angle for which the miter is - * cut off. The following table lists some examples:

- */ - Graphics.prototype.lineStyle = function (thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit) { - if (typeof thickness === "undefined") { thickness = 0; } - if (typeof color === "undefined") { color = 0; } - if (typeof alpha === "undefined") { alpha = 1; } - if (typeof pixelHinting === "undefined") { pixelHinting = false; } - if (typeof scaleMode === "undefined") { scaleMode = null; } - if (typeof caps === "undefined") { caps = null; } - if (typeof joints === "undefined") { joints = null; } - if (typeof miterLimit === "undefined") { miterLimit = 3; } - }; - - /** - * Draws a line using the current line style from the current drawing - * position to(x, y); the current drawing position - * is then set to(x, y). If the display object in - * which you are drawing contains content that was created with the Flash - * drawing tools, calls to the lineTo() method are drawn - * underneath the content. If you call lineTo() before any calls - * to the moveTo() method, the default position for the current - * drawing is(0, 0). If any of the parameters are missing, this - * method fails and the current drawing position is not changed. - * - * @param x A number that indicates the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number that indicates the vertical position relative to the - * registration point of the parent display object(in pixels). - */ - Graphics.prototype.lineTo = function (x, y) { - }; - - /** - * Moves the current drawing position to(x, y). If - * any of the parameters are missing, this method fails and the current - * drawing position is not changed. - * - * @param x A number that indicates the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number that indicates the vertical position relative to the - * registration point of the parent display object(in pixels). - */ - Graphics.prototype.moveTo = function (x, y) { - }; - return Graphics; - })(); - base.Graphics = Graphics; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The GraphicsPathWinding class provides values for the - * flash.display.GraphicsPath.winding property and the - * flash.display.Graphics.drawPath() method to determine the - * direction to draw a path. A clockwise path is positively wound, and a - * counter-clockwise path is negatively wound: - * - *

When paths intersect or overlap, the winding direction determines the - * rules for filling the areas created by the intersection or overlap:

- */ - (function (base) { - var GraphicsPathWinding = (function () { - function GraphicsPathWinding() { - } - GraphicsPathWinding.EVEN_ODD = "evenOdd"; - GraphicsPathWinding.NON_ZERO = "nonZero"; - return GraphicsPathWinding; - })(); - base.GraphicsPathWinding = GraphicsPathWinding; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -/// -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The InterpolationMethod class provides values for the - * interpolationMethod parameter in the - * Graphics.beginGradientFill() and - * Graphics.lineGradientStyle() methods. This parameter - * determines the RGB space to use when rendering the gradient. - */ - (function (base) { - var InterpolationMethod = (function () { - function InterpolationMethod() { - } - InterpolationMethod.LINEAR_RGB = "linearRGB"; - - InterpolationMethod.RGB = "rgb"; - return InterpolationMethod; - })(); - base.InterpolationMethod = InterpolationMethod; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - /** - * @class away.base.TriangleSubGeometry - */ - var SubGeometryBase = (function (_super) { - __extends(SubGeometryBase, _super); - /** - * - */ - function SubGeometryBase(concatenatedArrays) { - _super.call(this); - this._pStrideOffsetDirty = true; - this._pConcatenateArrays = true; - this._pStride = new Object(); - this._pOffset = new Object(); - - this._pConcatenateArrays = concatenatedArrays; - } - SubGeometryBase.prototype._pUpdateStrideOffset = function () { - throw new away.errors.AbstractMethodError(); - }; - - Object.defineProperty(SubGeometryBase.prototype, "subMeshClass", { - get: function () { - return this._pSubMeshClass; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(SubGeometryBase.prototype, "concatenateArrays", { - /** - * - */ - get: function () { - return this._pConcatenateArrays; - }, - set: function (value) { - if (this._pConcatenateArrays == value) - return; - - this._pConcatenateArrays = value; - - this._pStrideOffsetDirty = true; - - if (value) - this._pNotifyVerticesUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(SubGeometryBase.prototype, "indices", { - /** - * The raw index data that define the faces. - */ - get: function () { - return this._pIndices; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(SubGeometryBase.prototype, "vertices", { - /** - * - */ - get: function () { - this.updateVertices(); - - return this._pVertices; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(SubGeometryBase.prototype, "numTriangles", { - /** - * The total amount of triangles in the TriangleSubGeometry. - */ - get: function () { - return this._numTriangles; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(SubGeometryBase.prototype, "numVertices", { - get: function () { - return this._pNumVertices; - }, - enumerable: true, - configurable: true - }); - - /** - * - */ - SubGeometryBase.prototype.getStride = function (dataType) { - if (this._pStrideOffsetDirty) - this._pUpdateStrideOffset(); - - return this._pStride[dataType]; - }; - - /** - * - */ - SubGeometryBase.prototype.getOffset = function (dataType) { - if (this._pStrideOffsetDirty) - this._pUpdateStrideOffset(); - - return this._pOffset[dataType]; - }; - - SubGeometryBase.prototype.updateVertices = function () { - throw new away.errors.AbstractMethodError(); - }; - - /** - * - */ - SubGeometryBase.prototype.dispose = function () { - this._pIndices = null; - this._pVertices = null; - }; - - /** - * Updates the face indices of the TriangleSubGeometry. - * - * @param indices The face indices to upload. - */ - SubGeometryBase.prototype.updateIndices = function (indices) { - this._pIndices = indices; - this._numIndices = indices.length; - - this._numTriangles = this._numIndices / 3; - - this.notifyIndicesUpdate(); - }; - - /** - * @protected - */ - SubGeometryBase.prototype.pInvalidateBounds = function () { - if (this.parentGeometry) - this.parentGeometry.iInvalidateBounds(this); - }; - - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - SubGeometryBase.prototype.clone = function () { - throw new away.errors.AbstractMethodError(); - }; - - SubGeometryBase.prototype.applyTransformation = function (transform) { - }; - - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - SubGeometryBase.prototype.scale = function (scale) { - }; - - SubGeometryBase.prototype.scaleUV = function (scaleU, scaleV) { - if (typeof scaleU === "undefined") { scaleU = 1; } - if (typeof scaleV === "undefined") { scaleV = 1; } - }; - - SubGeometryBase.prototype.getBoundingPositions = function () { - throw new away.errors.AbstractMethodError(); - }; - - SubGeometryBase.prototype.notifyIndicesUpdate = function () { - if (!this._indicesUpdated) - this._indicesUpdated = new away.events.SubGeometryEvent(away.events.SubGeometryEvent.INDICES_UPDATED); - - this.dispatchEvent(this._indicesUpdated); - }; - - SubGeometryBase.prototype._pNotifyVerticesUpdate = function () { - throw new away.errors.AbstractMethodError(); - }; - SubGeometryBase.VERTEX_DATA = "vertices"; - return SubGeometryBase; - })(away.library.NamedAssetBase); - base.SubGeometryBase = SubGeometryBase; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - /** - * SubMeshBase wraps a TriangleSubGeometry as a scene graph instantiation. A SubMeshBase is owned by a Mesh object. - * - * - * @see away.base.TriangleSubGeometry - * @see away.entities.Mesh - * - * @class away.base.SubMeshBase - */ - var SubMeshBase = (function (_super) { - __extends(SubMeshBase, _super); - /** - * Creates a new SubMeshBase object - */ - function SubMeshBase() { - _super.call(this); - this._iIndex = 0; - this._renderables = new Array(); - } - Object.defineProperty(SubMeshBase.prototype, "animator", { - //TODO test shader picking - // public get shaderPickingDetails():boolean - // { - // - // return this.sourceEntity.shaderPickingDetails; - // } - /** - * The animator object that provides the state for the TriangleSubMesh's animation. - */ - get: function () { - return this._pParentMesh.animator; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(SubMeshBase.prototype, "material", { - /** - * The material used to render the current TriangleSubMesh. If set to null, its parent Mesh's material will be used instead. - */ - get: function () { - return this._material || this._pParentMesh.material; - }, - set: function (value) { - if (this.material) - this.material.iRemoveOwner(this); - - this._material = value; - - if (this.material) - this.material.iAddOwner(this); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(SubMeshBase.prototype, "sceneTransform", { - /** - * The scene transform object that transforms from model to world space. - */ - get: function () { - return this._pParentMesh.sceneTransform; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(SubMeshBase.prototype, "parentMesh", { - /** - * The entity that that initially provided the IRenderable to the render pipeline (ie: the owning Mesh object). - */ - get: function () { - return this._pParentMesh; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(SubMeshBase.prototype, "uvTransform", { - /** - * - */ - get: function () { - return this._uvTransform || this._pParentMesh.uvTransform; - }, - set: function (value) { - this._uvTransform = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * - */ - SubMeshBase.prototype.dispose = function () { - this.material = null; - - var len = this._renderables.length; - for (var i = 0; i < len; i++) - this._renderables[i].dispose(); - }; - - /** - * - * @param camera - * @returns {away.geom.Matrix3D} - */ - SubMeshBase.prototype.getRenderSceneTransform = function (camera) { - return this._pParentMesh.getRenderSceneTransform(camera); - }; - - SubMeshBase.prototype._iAddRenderable = function (renderable) { - this._renderables.push(renderable); - - return renderable; - }; - - SubMeshBase.prototype._iRemoveRenderable = function (renderable) { - var index = this._renderables.indexOf(renderable); - - this._renderables.splice(index, 1); - - return renderable; - }; - - SubMeshBase.prototype._iInvalidateRenderableGeometry = function () { - var len = this._renderables.length; - for (var i = 0; i < len; i++) - this._renderables[i].invalidateGeometry(); - }; - - SubMeshBase.prototype._iCollectRenderable = function (renderer) { - throw new away.errors.AbstractMethodError(); - }; - - SubMeshBase.prototype._iGetExplicitMaterial = function () { - return this._material; - }; - return SubMeshBase; - })(away.library.NamedAssetBase); - base.SubMeshBase = SubMeshBase; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The JointStyle class is an enumeration of constant values that specify the - * joint style to use in drawing lines. These constants are provided for use - * as values in the joints parameter of the - * flash.display.Graphics.lineStyle() method. The method supports - * three types of joints: miter, round, and bevel, as the following example - * shows: - */ - (function (base) { - var JointStyle = (function () { - function JointStyle() { - } - JointStyle.BEVEL = "bevel"; - - JointStyle.MITER = "miter"; - - JointStyle.ROUND = "round"; - return JointStyle; - })(); - base.JointStyle = JointStyle; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The LineScaleMode class provides values for the scaleMode - * parameter in the Graphics.lineStyle() method. - */ - (function (base) { - var LineScaleMode = (function () { - function LineScaleMode() { - } - LineScaleMode.HORIZONTAL = "horizontal"; - - LineScaleMode.NONE = "none"; - - LineScaleMode.NORMAL = "normal"; - - LineScaleMode.VERTICAL = "vertical"; - return LineScaleMode; - })(); - base.LineScaleMode = LineScaleMode; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - /** - * @class away.base.TriangleSubGeometry - */ - var LineSubGeometry = (function (_super) { - __extends(LineSubGeometry, _super); - /** - * - */ - function LineSubGeometry() { - _super.call(this, true); - this._positionsDirty = true; - this._boundingPositionDirty = true; - this._thicknessDirty = true; - this._colorsDirty = true; - - this._pSubMeshClass = base.LineSubMesh; - } - LineSubGeometry.prototype._pUpdateStrideOffset = function () { - this._pOffset[LineSubGeometry.VERTEX_DATA] = 0; - - var stride = 0; - this._pOffset[LineSubGeometry.START_POSITION_DATA] = stride; - stride += 3; - - this._pOffset[LineSubGeometry.END_POSITION_DATA] = stride; - stride += 3; - - this._pOffset[LineSubGeometry.THICKNESS_DATA] = stride; - stride += 1; - - this._pOffset[LineSubGeometry.COLOR_DATA] = stride; - stride += 4; - - this._pStride[LineSubGeometry.VERTEX_DATA] = stride; - this._pStride[LineSubGeometry.START_POSITION_DATA] = stride; - this._pStride[LineSubGeometry.END_POSITION_DATA] = stride; - this._pStride[LineSubGeometry.THICKNESS_DATA] = stride; - this._pStride[LineSubGeometry.COLOR_DATA] = stride; - - var len = this._pNumVertices * stride; - - if (this._pVertices == null) - this._pVertices = new Array(len); - else if (this._pVertices.length != len) - this._pVertices.length = len; - - this._pStrideOffsetDirty = false; - }; - - Object.defineProperty(LineSubGeometry.prototype, "vertices", { - /** - * - */ - get: function () { - if (this._positionsDirty) - this.updatePositions(this._startPositions, this._endPositions); - - if (this._thicknessDirty) - this.updateThickness(this._thickness); - - if (this._colorsDirty) - this.updateColors(this._startColors, this._endColors); - - return this._pVertices; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSubGeometry.prototype, "startPositions", { - /** - * - */ - get: function () { - if (this._positionsDirty) - this.updatePositions(this._startPositions, this._endPositions); - - return this._startPositions; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSubGeometry.prototype, "endPositions", { - /** - * - */ - get: function () { - if (this._positionsDirty) - this.updatePositions(this._startPositions, this._endPositions); - - return this._endPositions; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSubGeometry.prototype, "thickness", { - /** - * - */ - get: function () { - if (this._thicknessDirty) - this.updateThickness(this._thickness); - - return this._thickness; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSubGeometry.prototype, "startColors", { - /** - * - */ - get: function () { - if (this._colorsDirty) - this.updateColors(this._startColors, this._endColors); - - return this._startColors; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSubGeometry.prototype, "endColors", { - /** - * - */ - get: function () { - if (this._colorsDirty) - this.updateColors(this._startColors, this._endColors); - - return this._endColors; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSubGeometry.prototype, "numSegments", { - /** - * The total amount of segments in the TriangleSubGeometry. - */ - get: function () { - return this._numSegments; - }, - enumerable: true, - configurable: true - }); - - LineSubGeometry.prototype.getBoundingPositions = function () { - if (this._boundingPositionDirty) - this._boundingPositions = this.startPositions.concat(this.endPositions); - - return this._boundingPositions; - }; - - /** - * - */ - LineSubGeometry.prototype.updatePositions = function (startValues, endValues) { - var i; - var j; - var values; - var index; - var stride; - var positions; - var indices; - - this._startPositions = startValues; - - if (this._startPositions == null) - this._startPositions = new Array(); - - this._endPositions = endValues; - - if (this._endPositions == null) - this._endPositions = new Array(); - - this._boundingPositionDirty = true; - - this._numSegments = this._startPositions.length / 3; - - this._pNumVertices = this._numSegments * 4; - - var lenV = this._pNumVertices * this.getStride(LineSubGeometry.VERTEX_DATA); - - if (this._pVertices == null) - this._pVertices = new Array(lenV); - else if (this._pVertices.length != lenV) - this._pVertices.length = lenV; - - i = 0; - j = 0; - index = this.getOffset(LineSubGeometry.START_POSITION_DATA); - stride = this.getStride(LineSubGeometry.START_POSITION_DATA); - positions = this._pVertices; - indices = new Array(); - - while (i < startValues.length) { - values = (index / stride & 1) ? endValues : startValues; - positions[index] = values[i]; - positions[index + 1] = values[i + 1]; - positions[index + 2] = values[i + 2]; - - values = (index / stride & 1) ? startValues : endValues; - positions[index + 3] = values[i]; - positions[index + 4] = values[i + 1]; - positions[index + 5] = values[i + 2]; - - if (++j == 4) { - var o = index / stride - 3; - indices.push(o, o + 1, o + 2, o + 3, o + 2, o + 1); - j = 0; - i += 3; - } - - index += stride; - } - - this.updateIndices(indices); - - this.pInvalidateBounds(); - - this.notifyPositionsUpdate(); - - this._positionsDirty = false; - }; - - /** - * Updates the thickness. - */ - LineSubGeometry.prototype.updateThickness = function (values) { - var i; - var j; - var index; - var offset; - var stride; - var thickness; - - this._thickness = values; - - if (values != null) { - i = 0; - j = 0; - offset = this.getOffset(LineSubGeometry.THICKNESS_DATA); - stride = this.getStride(LineSubGeometry.THICKNESS_DATA); - thickness = this._pVertices; - - index = offset; - while (i < values.length) { - thickness[index] = (Math.floor(0.5 * (index - offset) / stride + 0.5) & 1) ? -values[i] : values[i]; - - if (++j == 4) { - j = 0; - i++; - } - index += stride; - } - } - - this.notifyThicknessUpdate(); - - this._thicknessDirty = false; - }; - - /** - * - */ - LineSubGeometry.prototype.updateColors = function (startValues, endValues) { - var i; - var j; - var values; - var index; - var offset; - var stride; - var colors; - - this._startColors = startValues; - - this._endColors = endValues; - - //default to white - if (this._startColors == null) { - this._startColors = new Array(this._numSegments * 4); - - i = 0; - while (i < this._startColors.length) - this._startColors[i++] = 1; - } - - if (this._endColors == null) { - this._endColors = new Array(this._numSegments * 4); - - i = 0; - while (i < this._endColors.length) - this._endColors[i++] = 1; - } - - i = 0; - j = 0; - offset = this.getOffset(LineSubGeometry.COLOR_DATA); - stride = this.getStride(LineSubGeometry.COLOR_DATA); - colors = this._pVertices; - - index = offset; - - while (i < this._startColors.length) { - values = ((index - offset) / stride & 1) ? this._endColors : this._startColors; - colors[index] = values[i]; - colors[index + 1] = values[i + 1]; - colors[index + 2] = values[i + 2]; - colors[index + 3] = values[i + 3]; - - if (++j == 4) { - j = 0; - i += 4; - } - - index += stride; - } - - this.notifyColorsUpdate(); - - this._colorsDirty = false; - }; - - /** - * - */ - LineSubGeometry.prototype.dispose = function () { - _super.prototype.dispose.call(this); - - this._startPositions = null; - this._endPositions = null; - this._thickness = null; - this._startColors = null; - this._endColors = null; - }; - - /** - * @protected - */ - LineSubGeometry.prototype.pInvalidateBounds = function () { - if (this.parentGeometry) - this.parentGeometry.iInvalidateBounds(this); - }; - - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - LineSubGeometry.prototype.clone = function () { - var clone = new LineSubGeometry(); - clone.updateIndices(this._pIndices.concat()); - clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); - clone.updateThickness(this._thickness.concat()); - clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); - - return clone; - }; - - LineSubGeometry.prototype._pNotifyVerticesUpdate = function () { - this._pStrideOffsetDirty = true; - - this.notifyPositionsUpdate(); - this.notifyThicknessUpdate(); - this.notifyColorsUpdate(); - }; - - LineSubGeometry.prototype.notifyPositionsUpdate = function () { - if (this._positionsDirty) - return; - - this._positionsDirty = true; - - if (!this._positionsUpdated) - this._positionsUpdated = new away.events.SubGeometryEvent(away.events.SubGeometryEvent.VERTICES_UPDATED, base.TriangleSubGeometry.POSITION_DATA); - - this.dispatchEvent(this._positionsUpdated); - }; - - LineSubGeometry.prototype.notifyThicknessUpdate = function () { - if (this._thicknessDirty) - return; - - this._thicknessDirty = true; - - if (!this._thicknessUpdated) - this._thicknessUpdated = new away.events.SubGeometryEvent(away.events.SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.THICKNESS_DATA); - - this.dispatchEvent(this._thicknessUpdated); - }; - - LineSubGeometry.prototype.notifyColorsUpdate = function () { - if (this._colorsDirty) - return; - - this._colorsDirty = true; - - if (!this._colorUpdated) - this._colorUpdated = new away.events.SubGeometryEvent(away.events.SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.COLOR_DATA); - - this.dispatchEvent(this._colorUpdated); - }; - LineSubGeometry.VERTEX_DATA = "vertices"; - LineSubGeometry.START_POSITION_DATA = "startPositions"; - LineSubGeometry.END_POSITION_DATA = "endPositions"; - LineSubGeometry.THICKNESS_DATA = "thickness"; - LineSubGeometry.COLOR_DATA = "colors"; - - LineSubGeometry.POSITION_FORMAT = "float3"; - LineSubGeometry.COLOR_FORMAT = "float4"; - LineSubGeometry.THICKNESS_FORMAT = "float1"; - return LineSubGeometry; - })(base.SubGeometryBase); - base.LineSubGeometry = LineSubGeometry; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - var AssetType = away.library.AssetType; - - /** - * LineSubMesh wraps a LineSubGeometry as a scene graph instantiation. A LineSubMesh is owned by a Mesh object. - * - * - * @see away.base.LineSubGeometry - * @see away.entities.Mesh - * - * @class away.base.LineSubMesh - */ - var LineSubMesh = (function (_super) { - __extends(LineSubMesh, _super); - /** - * Creates a new LineSubMesh object - * @param subGeometry The LineSubGeometry object which provides the geometry data for this LineSubMesh. - * @param parentMesh The Mesh object to which this LineSubMesh belongs. - * @param material An optional material used to render this LineSubMesh. - */ - function LineSubMesh(subGeometry, parentMesh, material) { - if (typeof material === "undefined") { material = null; } - _super.call(this); - - this._pParentMesh = parentMesh; - this._subGeometry = subGeometry; - this.material = material; - } - Object.defineProperty(LineSubMesh.prototype, "assetType", { - /** - * - */ - get: function () { - return AssetType.LINE_SUB_MESH; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSubMesh.prototype, "subGeometry", { - /** - * The LineSubGeometry object which provides the geometry data for this LineSubMesh. - */ - get: function () { - return this._subGeometry; - }, - enumerable: true, - configurable: true - }); - - /** - * - */ - LineSubMesh.prototype.dispose = function () { - this.material = null; - - _super.prototype.dispose.call(this); - }; - - LineSubMesh.prototype._iCollectRenderable = function (renderer) { - renderer.applyLineSubMesh(this); - }; - return LineSubMesh; - })(base.SubMeshBase); - base.LineSubMesh = LineSubMesh; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The LoaderInfo class provides information about a loaded SWF file or a - * loaded image file(JPEG, GIF, or PNG). LoaderInfo objects are available for - * any display object. The information provided includes load progress, the - * URLs of the loader and loaded content, the number of bytes total for the - * media, and the nominal height and width of the media. - * - *

You can access LoaderInfo objects in two ways:

- * - *
    - *
  • The contentLoaderInfo property of a flash.display.Loader - * object - The contentLoaderInfo property is always available - * for any Loader object. For a Loader object that has not called the - * load() or loadBytes() method, or that has not - * sufficiently loaded, attempting to access many of the properties of the - * contentLoaderInfo property throws an error.
  • - *
  • The loaderInfo property of a display object.
  • - *
- * - *

The contentLoaderInfo property of a Loader object provides - * information about the content that the Loader object is loading, whereas - * the loaderInfo property of a DisplayObject provides - * information about the root SWF file for that display object.

- * - *

When you use a Loader object to load a display object(such as a SWF - * file or a bitmap), the loaderInfo property of the display - * object is the same as the contentLoaderInfo property of the - * Loader object(DisplayObject.loaderInfo = - * Loader.contentLoaderInfo). Because the instance of the main class of - * the SWF file has no Loader object, the loaderInfo property is - * the only way to access the LoaderInfo for the instance of the main class of - * the SWF file.

- * - *

The following diagram shows the different uses of the LoaderInfo - * object - for the instance of the main class of the SWF file, for the - * contentLoaderInfo property of a Loader object, and for the - * loaderInfo property of a loaded object:

- * - *

When a loading operation is not complete, some properties of the - * contentLoaderInfo property of a Loader object are not - * available. You can obtain some properties, such as - * bytesLoaded, bytesTotal, url, - * loaderURL, and applicationDomain. When the - * loaderInfo object dispatches the init event, you - * can access all properties of the loaderInfo object and the - * loaded image or SWF file.

- * - *

Note: All properties of LoaderInfo objects are read-only.

- * - *

The EventDispatcher.dispatchEvent() method is not - * applicable to LoaderInfo objects. If you call dispatchEvent() - * on a LoaderInfo object, an IllegalOperationError exception is thrown.

- * - * @event complete Dispatched when data has loaded successfully. In other - * words, it is dispatched when all the content has been - * downloaded and the loading has finished. The - * complete event is always dispatched after - * the init event. The init event - * is dispatched when the object is ready to access, though - * the content may still be downloading. - * @event httpStatus Dispatched when a network request is made over HTTP and - * an HTTP status code can be detected. - * @event init Dispatched when the properties and methods of a loaded - * SWF file are accessible and ready for use. The content, - * however, can still be downloading. A LoaderInfo object - * dispatches the init event when the following - * conditions exist: - *
    - *
  • All properties and methods associated with the - * loaded object and those associated with the LoaderInfo - * object are accessible.
  • - *
  • The constructors for all child objects have - * completed.
  • - *
  • All ActionScript code in the first frame of the - * loaded SWF's main timeline has been executed.
  • - *
- * - *

For example, an Event.INIT is dispatched - * when the first frame of a movie or animation is loaded. - * The movie is then accessible and can be added to the - * display list. The complete movie, however, can take - * longer to download. The Event.COMPLETE is - * only dispatched once the full movie is loaded.

- * - *

The init event always precedes the - * complete event.

- * @event ioError Dispatched when an input or output error occurs that - * causes a load operation to fail. - * @event open Dispatched when a load operation starts. - * @event progress Dispatched when data is received as the download - * operation progresses. - * @event unload Dispatched by a LoaderInfo object whenever a loaded - * object is removed by using the unload() - * method of the Loader object, or when a second load is - * performed by the same Loader object and the original - * content is removed prior to the load beginning. - */ - (function (base) { - var LoaderInfo = (function (_super) { - __extends(LoaderInfo, _super); - function LoaderInfo() { - _super.apply(this, arguments); - } - Object.defineProperty(LoaderInfo.prototype, "bytes", { - /** - * The bytes associated with a LoaderInfo object. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the loaded object due to security - * restrictions. This situation can occur, for - * instance, when a Loader object attempts to access - * the contentLoaderInfo.content property - * and it is not granted security permission to access - * the loaded content. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - get: function () { - return this._bytes; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LoaderInfo.prototype, "bytesLoaded", { - /** - * The number of bytes that are loaded for the media. When this number equals - * the value of bytesTotal, all of the bytes are loaded. - */ - get: function () { - return this._bytesLoaded; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LoaderInfo.prototype, "bytesTotal", { - /** - * The number of compressed bytes in the entire media file. - * - *

Before the first progress event is dispatched by this - * LoaderInfo object's corresponding Loader object, bytesTotal - * is 0. After the first progress event from the Loader object, - * bytesTotal reflects the actual number of bytes to be - * downloaded.

- */ - get: function () { - return this._bytesTotal; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LoaderInfo.prototype, "content", { - /** - * The loaded object associated with this LoaderInfo object. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the loaded object due to security - * restrictions. This situation can occur, for - * instance, when a Loader object attempts to access - * the contentLoaderInfo.content property - * and it is not granted security permission to access - * the loaded content. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - get: function () { - return this._content; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LoaderInfo.prototype, "contentType", { - /** - * The MIME type of the loaded file. The value is null if not - * enough of the file has loaded in order to determine the type. The - * following list gives the possible values: - *
    - *
  • "application/x-shockwave-flash"
  • - *
  • "image/jpeg"
  • - *
  • "image/gif"
  • - *
  • "image/png"
  • - *
- */ - get: function () { - return this._contentType; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LoaderInfo.prototype, "loader", { - /** - * The Loader object associated with this LoaderInfo object. If this - * LoaderInfo object is the loaderInfo property of the instance - * of the main class of the SWF file, no Loader object is associated. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the Loader object because of security - * restrictions. This can occur, for instance, when a - * loaded SWF file attempts to access its - * loaderInfo.loader property and it is - * not granted security permission to access the - * loading SWF file. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - get: function () { - return this._loader; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LoaderInfo.prototype, "url", { - /** - * The URL of the media being loaded. - * - *

Before the first progress event is dispatched by this - * LoaderInfo object's corresponding Loader object, the value of the - * url property might reflect only the initial URL specified in - * the call to the load() method of the Loader object. After the - * first progress event, the url property reflects - * the media's final URL, after any redirects and relative URLs are - * resolved.

- * - *

In some cases, the value of the url property is truncated; - * see the isURLInaccessible property for details.

- */ - get: function () { - return this._url; - }, - enumerable: true, - configurable: true - }); - return LoaderInfo; - })(away.events.EventDispatcher); - base.LoaderInfo = LoaderInfo; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The PixelSnapping class is an enumeration of constant values for setting - * the pixel snapping options by using the pixelSnapping property - * of a Bitmap object. - */ - (function (base) { - var PixelSnapping = (function () { - function PixelSnapping() { - } - PixelSnapping.ALWAYS = "always"; - - PixelSnapping.AUTO = "auto"; - - PixelSnapping.NEVER = "never"; - return PixelSnapping; - })(); - base.PixelSnapping = PixelSnapping; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The SpreadMethod class provides values for the spreadMethod - * parameter in the beginGradientFill() and - * lineGradientStyle() methods of the Graphics class. - * - *

The following example shows the same gradient fill using various spread - * methods:

- */ - (function (base) { - var SpreadMethod = (function () { - function SpreadMethod() { - } - SpreadMethod.PAD = "pad"; - - SpreadMethod.REFLECT = "reflect"; - - SpreadMethod.REPEAT = "repeat"; - return SpreadMethod; - })(); - base.SpreadMethod = SpreadMethod; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (base) { - var ContextMode = away.display.ContextMode; - - var Event = away.events.Event; - var StageEvent = away.events.StageEvent; - var Rectangle = away.geom.Rectangle; - - var CSS = away.utils.CSS; - - /** - * Stage provides a proxy class to handle the creation and attachment of the Context - * (and in turn the back buffer) it uses. Stage should never be created directly, - * but requested through StageManager. - * - * @see away.managers.StageManager - * - */ - var Stage = (function (_super) { - __extends(Stage, _super); - function Stage(container, stageIndex, stageManager, forceSoftware, profile) { - if (typeof forceSoftware === "undefined") { forceSoftware = false; } - if (typeof profile === "undefined") { profile = "baseline"; } - _super.call(this); - this._x = 0; - this._y = 0; - //private static _frameEventDriver:Shape = new Shape(); // TODO: add frame driver / request animation frame - this._stageIndex = -1; - this._antiAlias = 0; - //private var _activeVertexBuffers : Vector. = new Vector.(8, true); - //private var _activeTextures : Vector. = new Vector.(8, true); - this._renderTarget = null; - this._renderSurfaceSelector = 0; - //private _mouse3DManager:away.managers.Mouse3DManager; - //private _touch3DManager:Touch3DManager; //TODO: imeplement dependency Touch3DManager - this._initialised = false; - - this._container = container; - - this._stageIndex = stageIndex; - - this._stageManager = stageManager; - - this._viewPort = new Rectangle(); - - this._enableDepthAndStencil = true; - - CSS.setElementX(this._container, 0); - CSS.setElementY(this._container, 0); - - this.visible = true; - } - /** - * Requests a Context object to attach to the managed gl canvas. - */ - Stage.prototype.requestContext = function (forceSoftware, profile, mode) { - // If forcing software, we can be certain that the - // returned Context will be running software mode. - // If not, we can't be sure and should stick to the - // old value (will likely be same if re-requesting.) - var _this = this; - if (typeof forceSoftware === "undefined") { forceSoftware = false; } - if (typeof profile === "undefined") { profile = "baseline"; } - if (typeof mode === "undefined") { mode = "auto"; } - if (this._usesSoftwareRendering != null) - this._usesSoftwareRendering = forceSoftware; - - this._profile = profile; - - try { - if (mode == ContextMode.FLASH) - new away["stagegl"]["ContextStage3D"](this._container, this._stageIndex, function (context) { - return _this._callback(context); - }); - else - this._context = new away["stagegl"]["ContextWebGL"](this._container, this._stageIndex); - } catch (e) { - try { - if (mode == ContextMode.AUTO) - new away["stagegl"]["ContextStage3D"](this._container, this._stageIndex, function (context) { - return _this._callback(context); - }); - else - this.dispatchEvent(new Event(Event.ERROR)); - } catch (e) { - this.dispatchEvent(new Event(Event.ERROR)); - } - } - - if (this._context) - this._callback(this._context); - }; - - Object.defineProperty(Stage.prototype, "width", { - /** - * The width of the gl canvas - */ - get: function () { - return this._width; - }, - set: function (val) { - if (this._width == val) - return; - - CSS.setElementWidth(this._container, val); - - this._width = this._viewPort.width = val; - - this._backBufferDirty = true; - - this.notifyViewportUpdated(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Stage.prototype, "height", { - /** - * The height of the gl canvas - */ - get: function () { - return this._height; - }, - set: function (val) { - if (this._height == val) - return; - - CSS.setElementHeight(this._container, val); - - this._height = this._viewPort.height = val; - - this._backBufferDirty = true; - - this.notifyViewportUpdated(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Stage.prototype, "x", { - /** - * The x position of the gl canvas - */ - get: function () { - return this._x; - }, - set: function (val) { - if (this._x == val) - return; - - CSS.setElementX(this._container, val); - - this._x = this._viewPort.x = val; - - this.notifyViewportUpdated(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Stage.prototype, "y", { - /** - * The y position of the gl canvas - */ - get: function () { - return this._y; - }, - set: function (val) { - if (this._y == val) - return; - - CSS.setElementY(this._container, val); - - this._y = this._viewPort.y = val; - - this.notifyViewportUpdated(); - }, - enumerable: true, - configurable: true - }); - - - - Object.defineProperty(Stage.prototype, "visible", { - get: function () { - return CSS.getElementVisibility(this._container); - }, - set: function (val) { - CSS.setElementVisibility(this._container, val); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Stage.prototype, "container", { - get: function () { - return this._container; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Stage.prototype, "context", { - /** - * The Context object associated with the given stage object. - */ - get: function () { - return this._context; - }, - enumerable: true, - configurable: true - }); - - Stage.prototype.notifyViewportUpdated = function () { - if (this._viewportDirty) - return; - - this._viewportDirty = true; - - //if (!this.hasEventListener(StageEvent.VIEWPORT_UPDATED)) - //return; - //if (!_viewportUpdated) - this._viewportUpdated = new StageEvent(StageEvent.VIEWPORT_UPDATED); - - this.dispatchEvent(this._viewportUpdated); - }; - - Stage.prototype.notifyEnterFrame = function () { - //if (!hasEventListener(Event.ENTER_FRAME)) - //return; - if (!this._enterFrame) - this._enterFrame = new Event(Event.ENTER_FRAME); - - this.dispatchEvent(this._enterFrame); - }; - - Stage.prototype.notifyExitFrame = function () { - //if (!hasEventListener(Event.EXIT_FRAME)) - //return; - if (!this._exitFrame) - this._exitFrame = new Event(Event.EXIT_FRAME); - - this.dispatchEvent(this._exitFrame); - }; - - Object.defineProperty(Stage.prototype, "profile", { - get: function () { - return this._profile; - }, - enumerable: true, - configurable: true - }); - - /** - * Disposes the Stage object, freeing the Context attached to the Stage. - */ - Stage.prototype.dispose = function () { - this._stageManager.iRemoveStage(this); - this.freeContext(); - this._stageManager = null; - this._stageIndex = -1; - }; - - /** - * Configures the back buffer associated with the Stage object. - * @param backBufferWidth The width of the backbuffer. - * @param backBufferHeight The height of the backbuffer. - * @param antiAlias The amount of anti-aliasing to use. - * @param enableDepthAndStencil Indicates whether the back buffer contains a depth and stencil buffer. - */ - Stage.prototype.configureBackBuffer = function (backBufferWidth, backBufferHeight, antiAlias, enableDepthAndStencil) { - this.width = backBufferWidth; - this.height = backBufferHeight; - - this._antiAlias = antiAlias; - this._enableDepthAndStencil = enableDepthAndStencil; - - if (this._context) - this._context.configureBackBuffer(backBufferWidth, backBufferHeight, antiAlias, enableDepthAndStencil); - }; - - Object.defineProperty(Stage.prototype, "enableDepthAndStencil", { - /* - * Indicates whether the depth and stencil buffer is used - */ - get: function () { - return this._enableDepthAndStencil; - }, - set: function (enableDepthAndStencil) { - this._enableDepthAndStencil = enableDepthAndStencil; - this._backBufferDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Stage.prototype, "renderTarget", { - get: function () { - return this._renderTarget; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Stage.prototype, "renderSurfaceSelector", { - get: function () { - return this._renderSurfaceSelector; - }, - enumerable: true, - configurable: true - }); - - /* - * Clear and reset the back buffer when using a shared context - */ - Stage.prototype.clear = function () { - if (!this._context) - return; - - if (this._backBufferDirty) { - this.configureBackBuffer(this._width, this._height, this._antiAlias, this._enableDepthAndStencil); - this._backBufferDirty = false; - } - - this._context.clear((this._color & 0xff000000) >>> 24, (this._color & 0xff0000) >>> 16, (this._color & 0xff00) >>> 8, this._color & 0xff); - - this._bufferClear = true; - }; - - /** - * Registers an event listener object with an EventDispatcher object so that the listener receives notification of an event. Special case for enterframe and exitframe events - will switch StageProxy into automatic render mode. - * You can register event listeners on all nodes in the display list for a specific type of event, phase, and priority. - * - * @param type The type of event. - * @param listener The listener function that processes the event. - * @param useCapture Determines whether the listener works in the capture phase or the target and bubbling phases. If useCapture is set to true, the listener processes the event only during the capture phase and not in the target or bubbling phase. If useCapture is false, the listener processes the event only during the target or bubbling phase. To listen for the event in all three phases, call addEventListener twice, once with useCapture set to true, then again with useCapture set to false. - * @param priority The priority level of the event listener. The priority is designated by a signed 32-bit integer. The higher the number, the higher the priority. All listeners with priority n are processed before listeners of priority n-1. If two or more listeners share the same priority, they are processed in the order in which they were added. The default priority is 0. - * @param useWeakReference Determines whether the reference to the listener is strong or weak. A strong reference (the default) prevents your listener from being garbage-collected. A weak reference does not. - */ - //public override function addEventListener(type:string, listener, useCapture:boolean = false, priority:number = 0, useWeakReference:boolean = false) - Stage.prototype.addEventListener = function (type, listener) { - _super.prototype.addEventListener.call(this, type, listener); //useCapture, priority, useWeakReference); - //away.Debug.throwPIR( 'StageProxy' , 'addEventListener' , 'EnterFrame, ExitFrame'); - //if ((type == Event.ENTER_FRAME || type == Event.EXIT_FRAME) ){//&& ! this._frameEventDriver.hasEventListener(Event.ENTER_FRAME)){ - //_frameEventDriver.addEventListener(Event.ENTER_FRAME, onEnterFrame, useCapture, priority, useWeakReference); - //} - /* Original code - if ((type == Event.ENTER_FRAME || type == Event.EXIT_FRAME) && ! _frameEventDriver.hasEventListener(Event.ENTER_FRAME)){ - - _frameEventDriver.addEventListener(Event.ENTER_FRAME, onEnterFrame, useCapture, priority, useWeakReference); - - - } - */ - }; - - /** - * Removes a listener from the EventDispatcher object. Special case for enterframe and exitframe events - will switch StageProxy out of automatic render mode. - * If there is no matching listener registered with the EventDispatcher object, a call to this method has no effect. - * - * @param type The type of event. - * @param listener The listener object to remove. - * @param useCapture Specifies whether the listener was registered for the capture phase or the target and bubbling phases. If the listener was registered for both the capture phase and the target and bubbling phases, two calls to removeEventListener() are required to remove both, one call with useCapture() set to true, and another call with useCapture() set to false. - */ - Stage.prototype.removeEventListener = function (type, listener) { - _super.prototype.removeEventListener.call(this, type, listener); - //away.Debug.throwPIR( 'StageProxy' , 'removeEventListener' , 'EnterFrame, ExitFrame'); - /* - // Remove the main rendering listener if no EnterFrame listeners remain - if ( ! this.hasEventListener(Event.ENTER_FRAME , this.onEnterFrame , this ) - && ! this.hasEventListener(Event.EXIT_FRAME , this.onEnterFrame , this) ) //&& _frameEventDriver.hasEventListener(Event.ENTER_FRAME)) - { - - //_frameEventDriver.removeEventListener(Event.ENTER_FRAME, this.onEnterFrame, this ); - - } - */ - }; - - Object.defineProperty(Stage.prototype, "scissorRect", { - get: function () { - return this._scissorRect; - }, - set: function (value) { - this._scissorRect = value; - - this._context.setScissorRectangle(this._scissorRect); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Stage.prototype, "stageIndex", { - /** - * The index of the Stage which is managed by this instance of StageProxy. - */ - get: function () { - return this._stageIndex; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Stage.prototype, "usesSoftwareRendering", { - /** - * Indicates whether the Stage managed by this proxy is running in software mode. - * Remember to wait for the CONTEXT_CREATED event before checking this property, - * as only then will it be guaranteed to be accurate. - */ - get: function () { - return this._usesSoftwareRendering; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Stage.prototype, "antiAlias", { - /** - * The antiAliasing of the Stage. - */ - get: function () { - return this._antiAlias; - }, - set: function (antiAlias) { - this._antiAlias = antiAlias; - this._backBufferDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Stage.prototype, "viewPort", { - /** - * A viewPort rectangle equivalent of the Stage size and position. - */ - get: function () { - this._viewportDirty = false; - - return this._viewPort; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Stage.prototype, "color", { - /** - * The background color of the Stage. - */ - get: function () { - return this._color; - }, - set: function (color) { - this._color = color; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Stage.prototype, "bufferClear", { - /** - * The freshly cleared state of the backbuffer before any rendering - */ - get: function () { - return this._bufferClear; - }, - set: function (newBufferClear) { - this._bufferClear = newBufferClear; - }, - enumerable: true, - configurable: true - }); - - - /* - * Access to fire mouseevents across multiple layered view3D instances - */ - // public get mouse3DManager():Mouse3DManager - // { - // return this._mouse3DManager; - // } - // - // public set mouse3DManager(value:Mouse3DManager) - // { - // this._mouse3DManager = value; - // } - /* TODO: implement dependency Touch3DManager - public get touch3DManager():Touch3DManager - { - return _touch3DManager; - } - - public set touch3DManager(value:Touch3DManager) - { - _touch3DManager = value; - } - */ - /** - * Frees the Context associated with this StageProxy. - */ - Stage.prototype.freeContext = function () { - if (this._context) { - this._context.dispose(); - - this.dispatchEvent(new StageEvent(StageEvent.CONTEXT_DISPOSED)); - } - - this._context = null; - - this._initialised = false; - }; - - /** - * The Enter_Frame handler for processing the proxy.ENTER_FRAME and proxy.EXIT_FRAME event handlers. - * Typically the proxy.ENTER_FRAME listener would render the layers for this Stage instance. - */ - Stage.prototype.onEnterFrame = function (event) { - if (!this._context) - return; - - // Clear the stage instance - this.clear(); - - //notify the enterframe listeners - this.notifyEnterFrame(); - - // Call the present() to render the frame - if (!this._context) - this._context.present(); - - //notify the exitframe listeners - this.notifyExitFrame(); - }; - - Stage.prototype.recoverFromDisposal = function () { - if (!this._context) - return false; - - //away.Debug.throwPIR( 'StageProxy' , 'recoverFromDisposal' , '' ); - /* - if (this._iContext.driverInfo == "Disposed") - { - this._iContext = null; - this.dispatchEvent(new StageEvent(StageEvent.CONTEXT_DISPOSED)); - return false; - - } - */ - return true; - }; - - Stage.prototype._callback = function (context) { - this._context = context; - - this._container = this._context.container; - - // Only configure back buffer if width and height have been set, - // which they may not have been if View.render() has yet to be - // invoked for the first time. - if (this._width && this._height) - this._context.configureBackBuffer(this._width, this._height, this._antiAlias, this._enableDepthAndStencil); - - // Dispatch the appropriate event depending on whether context was - // created for the first time or recreated after a device loss. - this.dispatchEvent(new StageEvent(this._initialised ? StageEvent.CONTEXT_RECREATED : StageEvent.CONTEXT_CREATED)); - - this._initialised = true; - }; - return Stage; - })(away.events.EventDispatcher); - base.Stage = Stage; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * Defines codes for culling algorithms that determine which triangles not to - * render when drawing triangle paths. - * - *

The terms POSITIVE and NEGATIVE refer to the - * sign of a triangle's normal along the z-axis. The normal is a 3D vector - * that is perpendicular to the surface of the triangle.

- * - *

A triangle whose vertices 0, 1, and 2 are arranged in a clockwise order - * has a positive normal value. That is, its normal points in a positive - * z-axis direction, away from the current view point. When the - * TriangleCulling.POSITIVE algorithm is used, triangles with - * positive normals are not rendered. Another term for this is backface - * culling.

- * - *

A triangle whose vertices are arranged in a counter-clockwise order has - * a negative normal value. That is, its normal points in a negative z-axis - * direction, toward the current view point. When the - * TriangleCulling.NEGATIVE algorithm is used, triangles with - * negative normals will not be rendered.

- */ - (function (base) { - var TriangleCulling = (function () { - function TriangleCulling() { - } - TriangleCulling.NEGATIVE = "negative"; - - TriangleCulling.NONE = "none"; - - TriangleCulling.POSITIVE = "positive"; - return TriangleCulling; - })(); - base.TriangleCulling = TriangleCulling; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - var SubGeometryEvent = away.events.SubGeometryEvent; - - /** - * @class away.base.TriangleSubGeometry - */ - var TriangleSubGeometry = (function (_super) { - __extends(TriangleSubGeometry, _super); - /** - * - */ - function TriangleSubGeometry(concatenatedArrays) { - _super.call(this, concatenatedArrays); - this._positionsDirty = true; - this._faceNormalsDirty = true; - this._faceTangentsDirty = true; - this._vertexNormalsDirty = true; - this._vertexTangentsDirty = true; - this._uvsDirty = true; - this._secondaryUVsDirty = true; - this._jointIndicesDirty = true; - this._jointWeightsDirty = true; - this._concatenateArrays = true; - this._autoDeriveNormals = true; - this._autoDeriveTangents = true; - this._autoDeriveUVs = false; - this._useFaceWeights = false; - this._scaleU = 1; - this._scaleV = 1; - - this._pSubMeshClass = base.TriangleSubMesh; - } - Object.defineProperty(TriangleSubGeometry.prototype, "scaleU", { - /** - * - */ - get: function () { - return this._scaleU; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "scaleV", { - /** - * - */ - get: function () { - return this._scaleV; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "useCondensedIndices", { - /** - * Offers the option of enabling GPU accelerated animation on skeletons larger than 32 joints - * by condensing the number of joint index values required per mesh. Only applicable to - * skeleton animations that utilise more than one mesh object. Defaults to false. - */ - get: function () { - return this._useCondensedIndices; - }, - set: function (value) { - if (this._useCondensedIndices == value) - return; - - this._useCondensedIndices = value; - - this.notifyJointIndicesUpdate(); - }, - enumerable: true, - configurable: true - }); - - - TriangleSubGeometry.prototype._pUpdateStrideOffset = function () { - if (this._concatenateArrays) { - this._pOffset[TriangleSubGeometry.VERTEX_DATA] = 0; - - //always have positions - this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; - var stride = 3; - - if (this._vertexNormals != null) { - this._pOffset[TriangleSubGeometry.NORMAL_DATA] = stride; - stride += 3; - } - - if (this._vertexTangents != null) { - this._pOffset[TriangleSubGeometry.TANGENT_DATA] = stride; - stride += 3; - } - - if (this._uvs != null) { - this._pOffset[TriangleSubGeometry.UV_DATA] = stride; - stride += 2; - } - - if (this._secondaryUVs != null) { - this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; - stride += 2; - } - - if (this._jointIndices != null) { - this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; - stride += this._jointsPerVertex; - } - - if (this._jointWeights != null) { - this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; - stride += this._jointsPerVertex; - } - - this._pStride[TriangleSubGeometry.VERTEX_DATA] = stride; - this._pStride[TriangleSubGeometry.POSITION_DATA] = stride; - this._pStride[TriangleSubGeometry.NORMAL_DATA] = stride; - this._pStride[TriangleSubGeometry.TANGENT_DATA] = stride; - this._pStride[TriangleSubGeometry.UV_DATA] = stride; - this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; - this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; - this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; - - var len = this._pNumVertices * stride; - - if (this._pVertices == null) - this._pVertices = new Array(len); - else if (this._pVertices.length != len) - this._pVertices.length = len; - } else { - this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; - this._pOffset[TriangleSubGeometry.NORMAL_DATA] = 0; - this._pOffset[TriangleSubGeometry.TANGENT_DATA] = 0; - this._pOffset[TriangleSubGeometry.UV_DATA] = 0; - this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = 0; - this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = 0; - this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = 0; - - this._pStride[TriangleSubGeometry.POSITION_DATA] = 3; - this._pStride[TriangleSubGeometry.NORMAL_DATA] = 3; - this._pStride[TriangleSubGeometry.TANGENT_DATA] = 3; - this._pStride[TriangleSubGeometry.UV_DATA] = 2; - this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = 2; - this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = this._jointsPerVertex; - this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = this._jointsPerVertex; - } - - this._pStrideOffsetDirty = false; - }; - - Object.defineProperty(TriangleSubGeometry.prototype, "jointsPerVertex", { - /** - * - */ - get: function () { - return this._jointsPerVertex; - }, - set: function (value) { - if (this._jointsPerVertex == value) - return; - - this._jointsPerVertex = value; - - this._pStrideOffsetDirty = true; - - if (this._pConcatenateArrays) - this._pNotifyVerticesUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveUVs", { - /** - * Defines whether a UV buffer should be automatically generated to contain dummy UV coordinates. - * Set to true if a geometry lacks UV data but uses a material that requires it, or leave as false - * in cases where UV data is explicitly defined or the material does not require UV data. - */ - get: function () { - return this._autoDeriveUVs; - }, - set: function (value) { - if (this._autoDeriveUVs == value) - return; - - this._autoDeriveUVs = value; - - if (value) - this.notifyUVsUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveNormals", { - /** - * True if the vertex normals should be derived from the geometry, false if the vertex normals are set - * explicitly. - */ - get: function () { - return this._autoDeriveNormals; - }, - set: function (value) { - if (this._autoDeriveNormals == value) - return; - - this._autoDeriveNormals = value; - - if (value) - this.notifyNormalsUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveTangents", { - /** - * True if the vertex tangents should be derived from the geometry, false if the vertex normals are set - * explicitly. - */ - get: function () { - return this._autoDeriveTangents; - }, - set: function (value) { - if (this._autoDeriveTangents == value) - return; - - this._autoDeriveTangents = value; - - if (value) - this.notifyTangentsUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(TriangleSubGeometry.prototype, "vertices", { - /** - * - */ - get: function () { - if (this._positionsDirty) - this.updatePositions(this._positions); - - if (this._vertexNormalsDirty) - this.updateVertexNormals(this._vertexNormals); - - if (this._vertexTangentsDirty) - this.updateVertexTangents(this._vertexTangents); - - if (this._uvsDirty) - this.updateUVs(this._uvs); - - if (this._secondaryUVsDirty) - this.updateSecondaryUVs(this._secondaryUVs); - - if (this._jointIndicesDirty) - this.updateJointIndices(this._jointIndices); - - if (this._jointWeightsDirty) - this.updateJointWeights(this._jointWeights); - - return this._pVertices; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "positions", { - /** - * - */ - get: function () { - if (this._positionsDirty) - this.updatePositions(this._positions); - - return this._positions; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "vertexNormals", { - /** - * - */ - get: function () { - if (this._vertexNormalsDirty) - this.updateVertexNormals(this._vertexNormals); - - return this._vertexNormals; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "vertexTangents", { - /** - * - */ - get: function () { - if (this._vertexTangentsDirty) - this.updateVertexTangents(this._vertexTangents); - - return this._vertexTangents; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "faceNormals", { - /** - * The raw data of the face normals, in the same order as the faces are listed in the index list. - */ - get: function () { - if (this._faceNormalsDirty) - this.updateFaceNormals(); - - return this._faceNormals; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "faceTangents", { - /** - * The raw data of the face tangets, in the same order as the faces are listed in the index list. - */ - get: function () { - if (this._faceTangentsDirty) - this.updateFaceTangents(); - - return this._faceTangents; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "uvs", { - /** - * - */ - get: function () { - if (this._uvsDirty) - this.updateUVs(this._uvs); - - return this._uvs; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "secondaryUVs", { - /** - * - */ - get: function () { - if (this._secondaryUVsDirty) - this.updateSecondaryUVs(this._secondaryUVs); - - return this._secondaryUVs; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "jointIndices", { - /** - * - */ - get: function () { - if (this._jointIndicesDirty) - this.updateJointIndices(this._jointIndices); - - if (this._useCondensedIndices) - return this._condensedJointIndices; - - return this._jointIndices; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "jointWeights", { - /** - * - */ - get: function () { - if (this._jointWeightsDirty) - this.updateJointWeights(this._jointWeights); - - return this._jointWeights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "useFaceWeights", { - /** - * Indicates whether or not to take the size of faces into account when auto-deriving vertex normals and tangents. - */ - get: function () { - return this._useFaceWeights; - }, - set: function (value) { - if (this._useFaceWeights == value) - return; - - this._useFaceWeights = value; - - if (this._autoDeriveNormals) - this.notifyNormalsUpdate(); - - if (this._autoDeriveTangents) - this.notifyTangentsUpdate(); - - this._faceNormalsDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(TriangleSubGeometry.prototype, "numCondensedJoints", { - get: function () { - if (this._jointIndicesDirty) - this.updateJointIndices(this._jointIndices); - - return this._numCondensedJoints; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubGeometry.prototype, "condensedIndexLookUp", { - get: function () { - if (this._jointIndicesDirty) - this.updateJointIndices(this._jointIndices); - - return this._condensedIndexLookUp; - }, - enumerable: true, - configurable: true - }); - - TriangleSubGeometry.prototype.getBoundingPositions = function () { - if (this._positionsDirty) - this.updatePositions(this._positions); - - return this._positions; - }; - - /** - * - */ - TriangleSubGeometry.prototype.updatePositions = function (values) { - var i; - var index; - var stride; - var positions; - - this._positions = values; - - if (this._positions == null) - this._positions = new Array(); - - this._pNumVertices = this._positions.length / 3; - - if (this._concatenateArrays) { - var len = this._pNumVertices * this.getStride(TriangleSubGeometry.VERTEX_DATA); - - if (this._pVertices == null) - this._pVertices = new Array(len); - else if (this._pVertices.length != len) - this._pVertices.length = len; - - i = 0; - index = this.getOffset(TriangleSubGeometry.POSITION_DATA); - stride = this.getStride(TriangleSubGeometry.POSITION_DATA); - positions = this._pVertices; - - while (i < values.length) { - positions[index] = values[i++]; - positions[index + 1] = values[i++]; - positions[index + 2] = values[i++]; - index += stride; - } - } - - if (this._autoDeriveNormals) - this.notifyNormalsUpdate(); - - if (this._autoDeriveTangents) - this.notifyTangentsUpdate(); - - if (this._autoDeriveUVs) - this.notifyUVsUpdate(); - - this.pInvalidateBounds(); - - this.notifyPositionsUpdate(); - - this._positionsDirty = false; - }; - - /** - * Updates the vertex normals based on the geometry. - */ - TriangleSubGeometry.prototype.updateVertexNormals = function (values) { - var i; - var index; - var offset; - var stride; - var normals; - - if (!this._autoDeriveNormals) { - if ((this._vertexNormals == null || values == null) && (this._vertexNormals != null || values != null)) { - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - this._vertexNormals = values; - - if (values != null && this._concatenateArrays) { - i = 0; - index = this.getOffset(TriangleSubGeometry.NORMAL_DATA); - stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); - normals = this._pVertices; - - while (i < values.length) { - normals[index] = values[i++]; - normals[index + 1] = values[i++]; - normals[index + 2] = values[i++]; - index += stride; - } - } - } else { - if (this._vertexNormals == null) { - this._vertexNormals = new Array(this._positions.length); - - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - if (this._faceNormalsDirty) - this.updateFaceNormals(); - - offset = this.getOffset(TriangleSubGeometry.NORMAL_DATA); - stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); - - //autoderived normals - normals = this._concatenateArrays ? this._pVertices : this._vertexNormals; - - var f1 = 0; - var f2 = 1; - var f3 = 2; - - index = offset; - - //clear normal values - var lenV = normals.length; - while (index < lenV) { - normals[index] = 0; - normals[index + 1] = 0; - normals[index + 2] = 0; - index += stride; - } - - var k = 0; - var lenI = this._pIndices.length; - var weight; - - i = 0; - - while (i < lenI) { - weight = this._useFaceWeights ? this._faceWeights[k++] : 1; - index = offset + this._pIndices[i++] * stride; - normals[index] += this._faceNormals[f1] * weight; - normals[index + 1] += this._faceNormals[f2] * weight; - normals[index + 2] += this._faceNormals[f3] * weight; - index = offset + this._pIndices[i++] * stride; - normals[index] += this._faceNormals[f1] * weight; - normals[index + 1] += this._faceNormals[f2] * weight; - normals[index + 2] += this._faceNormals[f3] * weight; - index = offset + this._pIndices[i++] * stride; - normals[index] += this._faceNormals[f1] * weight; - normals[index + 1] += this._faceNormals[f2] * weight; - normals[index + 2] += this._faceNormals[f3] * weight; - f1 += 3; - f2 += 3; - f3 += 3; - } - - i = 0; - index = offset; - - while (index < lenV) { - var vx = normals[index]; - var vy = normals[index + 1]; - var vz = normals[index + 2]; - var d = 1.0 / Math.sqrt(vx * vx + vy * vy + vz * vz); - - if (this._concatenateArrays) { - this._vertexNormals[i++] = normals[index] = vx * d; - this._vertexNormals[i++] = normals[index + 1] = vy * d; - this._vertexNormals[i++] = normals[index + 2] = vz * d; - } else { - normals[index] = vx * d; - normals[index + 1] = vy * d; - normals[index + 2] = vz * d; - } - - index += stride; - } - } - - this.notifyNormalsUpdate(); - - this._vertexNormalsDirty = false; - }; - - /** - * Updates the vertex tangents based on the geometry. - */ - TriangleSubGeometry.prototype.updateVertexTangents = function (values) { - var i; - var index; - var offset; - var stride; - var tangents; - - if (!this._autoDeriveTangents) { - if ((this._vertexTangents == null || values == null) && (this._vertexTangents != null || values != null)) { - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - this._vertexTangents = values; - - if (values != null && this._concatenateArrays) { - i = 0; - index = this.getOffset(TriangleSubGeometry.TANGENT_DATA); - stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); - tangents = this._pVertices; - - while (i < values.length) { - tangents[index] = values[i++]; - tangents[index + 1] = values[i++]; - tangents[index + 2] = values[i++]; - index += stride; - } - } - } else { - if (this._vertexTangents == null) { - this._vertexTangents = new Array(this._positions.length); - - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - if (this._faceTangentsDirty) - this.updateFaceTangents(); - - offset = this.getOffset(TriangleSubGeometry.TANGENT_DATA); - stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); - - //autoderived tangents - tangents = this._concatenateArrays ? this._pVertices : this._vertexTangents; - - index = offset; - - //clear tangent values - var lenV = tangents.length; - while (index < lenV) { - tangents[index] = 0; - tangents[index + 1] = 0; - tangents[index + 2] = 0; - - index += stride; - } - - var k = 0; - var weight; - var f1 = 0; - var f2 = 1; - var f3 = 2; - - i = 0; - - //collect face tangents - var lenI = this._pIndices.length; - while (i < lenI) { - weight = this._useFaceWeights ? this._faceWeights[k++] : 1; - index = offset + this._pIndices[i++] * stride; - tangents[index++] += this._faceTangents[f1] * weight; - tangents[index++] += this._faceTangents[f2] * weight; - tangents[index] += this._faceTangents[f3] * weight; - index = offset + this._pIndices[i++] * stride; - tangents[index++] += this._faceTangents[f1] * weight; - tangents[index++] += this._faceTangents[f2] * weight; - tangents[index] += this._faceTangents[f3] * weight; - index = offset + this._pIndices[i++] * stride; - tangents[index++] += this._faceTangents[f1] * weight; - tangents[index++] += this._faceTangents[f2] * weight; - tangents[index] += this._faceTangents[f3] * weight; - f1 += 3; - f2 += 3; - f3 += 3; - } - - i = 0; - index = offset; - - while (index < lenV) { - var vx = tangents[index]; - var vy = tangents[index + 1]; - var vz = tangents[index + 2]; - var d = 1.0 / Math.sqrt(vx * vx + vy * vy + vz * vz); - - if (this._concatenateArrays) { - this._vertexTangents[i++] = tangents[index] = vx * d; - this._vertexTangents[i++] = tangents[index + 1] = vy * d; - this._vertexTangents[i++] = tangents[index + 2] = vz * d; - } else { - tangents[index] = vx * d; - tangents[index + 1] = vy * d; - tangents[index + 2] = vz * d; - } - - index += stride; - } - } - - this.notifyTangentsUpdate(); - - this._vertexTangentsDirty = false; - }; - - /** - * Updates the uvs based on the geometry. - */ - TriangleSubGeometry.prototype.updateUVs = function (values) { - var i; - var index; - var offset; - var stride; - var uvs; - - if (!this._autoDeriveUVs) { - if ((this._uvs == null || values == null) && (this._uvs != null || values != null)) { - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - this._uvs = values; - - if (values != null && this._concatenateArrays) { - i = 0; - index = this.getOffset(TriangleSubGeometry.UV_DATA); - stride = this.getStride(TriangleSubGeometry.UV_DATA); - uvs = this._pVertices; - - while (i < values.length) { - uvs[index] = values[i++]; - uvs[index + 1] = values[i++]; - index += stride; - } - } - } else { - if (this._uvs == null) { - this._uvs = new Array(this._positions.length * 2 / 3); - - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - offset = this.getOffset(TriangleSubGeometry.UV_DATA); - stride = this.getStride(TriangleSubGeometry.UV_DATA); - - //autoderived uvs - uvs = this._concatenateArrays ? this._pVertices : this._uvs; - - i = 0; - index = offset; - var uvIdx = 0; - - //clear uv values - var lenV = uvs.length; - while (index < lenV) { - if (this._concatenateArrays) { - this._uvs[i++] = uvs[index] = uvIdx * .5; - this._uvs[i++] = uvs[index + 1] = 1.0 - (uvIdx & 1); - } else { - uvs[index] = uvIdx * .5; - uvs[index + 1] = 1.0 - (uvIdx & 1); - } - - if (++uvIdx == 3) - uvIdx = 0; - - index += stride; - } - } - - if (this._autoDeriveTangents) - this.notifyTangentsUpdate(); - - this.notifyUVsUpdate(); - - this._uvsDirty = false; - }; - - /** - * Updates the secondary uvs based on the geometry. - */ - TriangleSubGeometry.prototype.updateSecondaryUVs = function (values) { - var i; - var index; - var offset; - var stride; - var uvs; - - if (this._concatenateArrays && (this._secondaryUVs == null || values == null) && (this._secondaryUVs != null || values != null)) - this._pNotifyVerticesUpdate(); - - this._secondaryUVs = values; - - if (values != null && this._concatenateArrays) { - offset = this.getOffset(TriangleSubGeometry.SECONDARY_UV_DATA); - stride = this.getStride(TriangleSubGeometry.SECONDARY_UV_DATA); - - i = 0; - index = offset; - uvs = this._pVertices; - - while (i < values.length) { - uvs[index] = values[i++]; - uvs[index + 1] = values[i++]; - index += stride; - } - } - - this.notifySecondaryUVsUpdate(); - - this._secondaryUVsDirty = false; - }; - - /** - * Updates the joint indices - */ - TriangleSubGeometry.prototype.updateJointIndices = function (values) { - var i; - var j; - var index; - var offset; - var stride; - var jointIndices; - - if (this._concatenateArrays && (this._jointIndices == null || values == null) && (this._jointIndices != null || values != null)) - this._pNotifyVerticesUpdate(); - - this._jointIndices = values; - - if (values != null) { - offset = this.getOffset(TriangleSubGeometry.JOINT_INDEX_DATA); - stride = this.getStride(TriangleSubGeometry.JOINT_INDEX_DATA); - if (this._useCondensedIndices) { - i = 0; - j = 0; - index = offset; - jointIndices = this._concatenateArrays ? this._pVertices : this._condensedJointIndices; - var oldIndex; - var newIndex = 0; - var dic = new Object(); - - if (!this._concatenateArrays) - this._condensedJointIndices = new Array(values.length); - - this._condensedIndexLookUp = new Array(); - - while (i < values.length) { - for (j = 0; j < this._jointsPerVertex; j++) { - oldIndex = values[i++]; - - // if we encounter a new index, assign it a new condensed index - if (dic[oldIndex] == undefined) { - dic[oldIndex] = newIndex * 3; //3 required for the three vectors that store the matrix - this._condensedIndexLookUp[newIndex++] = oldIndex; - } - jointIndices[index + j] = dic[oldIndex]; - } - index += stride; - } - this._numCondensedJoints = newIndex; - } else if (this._concatenateArrays) { - i = 0; - index = offset; - jointIndices = this._pVertices; - - while (i < values.length) { - j = 0; - while (j < this._jointsPerVertex) - jointIndices[index + j++] = values[i++]; - index += stride; - } - } - } - - this.notifyJointIndicesUpdate(); - - this._jointIndicesDirty = false; - }; - - /** - * Updates the joint weights. - */ - TriangleSubGeometry.prototype.updateJointWeights = function (values) { - var i; - var j; - var index; - var offset; - var stride; - var jointWeights; - - if (this._concatenateArrays && (this._jointWeights == null || values == null) && (this._jointWeights != null || values != null)) - this._pNotifyVerticesUpdate(); - - this._jointWeights = values; - - if (values != null && this._concatenateArrays) { - offset = this.getOffset(TriangleSubGeometry.JOINT_WEIGHT_DATA); - stride = this.getStride(TriangleSubGeometry.JOINT_WEIGHT_DATA); - - i = 0; - index = offset; - jointWeights = this._pVertices; - - while (i < values.length) { - j = 0; - while (j < this._jointsPerVertex) - jointWeights[index + j++] = values[i++]; - index += stride; - } - } - - this.notifyJointWeightsUpdate(); - - this._jointWeightsDirty = false; - }; - - /** - * - */ - TriangleSubGeometry.prototype.dispose = function () { - _super.prototype.dispose.call(this); - - this._positions = null; - this._vertexNormals = null; - this._vertexTangents = null; - this._uvs = null; - this._secondaryUVs = null; - this._jointIndices = null; - this._jointWeights = null; - - this._faceNormals = null; - this._faceWeights = null; - this._faceTangents = null; - }; - - /** - * Updates the face indices of the TriangleSubGeometry. - * - * @param indices The face indices to upload. - */ - TriangleSubGeometry.prototype.updateIndices = function (indices) { - _super.prototype.updateIndices.call(this, indices); - - this._faceNormalsDirty = true; - - if (this._autoDeriveNormals) - this._vertexNormalsDirty = true; - - if (this._autoDeriveTangents) - this._vertexTangentsDirty = true; - - if (this._autoDeriveUVs) - this._uvsDirty = true; - }; - - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - TriangleSubGeometry.prototype.clone = function () { - var clone = new TriangleSubGeometry(this._concatenateArrays); - clone.updateIndices(this._pIndices.concat()); - clone.updatePositions(this._positions.concat()); - - if (this._vertexNormals && !this._autoDeriveNormals) - clone.updateVertexNormals(this._vertexNormals.concat()); - else - clone.updateVertexNormals(null); - - if (this._uvs && !this._autoDeriveUVs) - clone.updateUVs(this._uvs.concat()); - else - clone.updateUVs(null); - - if (this._vertexTangents && !this._autoDeriveTangents) - clone.updateVertexTangents(this._vertexTangents.concat()); - else - clone.updateVertexTangents(null); - - if (this._secondaryUVs) - clone.updateSecondaryUVs(this._secondaryUVs.concat()); - - if (this._jointIndices) { - clone.jointsPerVertex = this._jointsPerVertex; - clone.updateJointIndices(this._jointIndices.concat()); - } - - if (this._jointWeights) - clone.updateJointWeights(this._jointWeights.concat()); - - return clone; - }; - - TriangleSubGeometry.prototype.scaleUV = function (scaleU, scaleV) { - if (typeof scaleU === "undefined") { scaleU = 1; } - if (typeof scaleV === "undefined") { scaleV = 1; } - var index; - var offset; - var stride; - var uvs; - - uvs = this._uvs; - - var ratioU = scaleU / this._scaleU; - var ratioV = scaleV / this._scaleV; - - this._scaleU = scaleU; - this._scaleV = scaleV; - - var len = uvs.length; - - offset = 0; - stride = 2; - - index = offset; - - while (index < len) { - uvs[index] *= ratioU; - uvs[index + 1] *= ratioV; - index += stride; - } - - this.notifyUVsUpdate(); - }; - - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - TriangleSubGeometry.prototype.scale = function (scale) { - var i; - var index; - var offset; - var stride; - var positions; - - positions = this._positions; - - var len = positions.length; - - offset = 0; - stride = 3; - - i = 0; - index = offset; - while (i < len) { - positions[index] *= scale; - positions[index + 1] *= scale; - positions[index + 2] *= scale; - - i += 3; - index += stride; - } - - this.notifyPositionsUpdate(); - }; - - TriangleSubGeometry.prototype.applyTransformation = function (transform) { - var positions; - var normals; - var tangents; - - if (this._concatenateArrays) { - positions = this._pVertices; - normals = this._pVertices; - tangents = this._pVertices; - } else { - positions = this._positions; - normals = this._vertexNormals; - tangents = this._vertexTangents; - } - - var len = this._positions.length / 3; - var i; - var i1; - var i2; - var vector = new away.geom.Vector3D(); - - var bakeNormals = this._vertexNormals != null; - var bakeTangents = this._vertexTangents != null; - var invTranspose; - - if (bakeNormals || bakeTangents) { - invTranspose = transform.clone(); - invTranspose.invert(); - invTranspose.transpose(); - } - - var vi0 = this.getOffset(TriangleSubGeometry.POSITION_DATA); - var ni0 = this.getOffset(TriangleSubGeometry.NORMAL_DATA); - var ti0 = this.getOffset(TriangleSubGeometry.TANGENT_DATA); - - var vStride = this.getStride(TriangleSubGeometry.POSITION_DATA); - var nStride = this.getStride(TriangleSubGeometry.NORMAL_DATA); - var tStride = this.getStride(TriangleSubGeometry.TANGENT_DATA); - - for (i = 0; i < len; ++i) { - i1 = vi0 + 1; - i2 = vi0 + 2; - - // bake position - vector.x = positions[vi0]; - vector.y = positions[i1]; - vector.z = positions[i2]; - vector = transform.transformVector(vector); - positions[vi0] = vector.x; - positions[i1] = vector.y; - positions[i2] = vector.z; - vi0 += vStride; - - // bake normal - if (bakeNormals) { - i1 = ni0 + 1; - i2 = ni0 + 2; - vector.x = normals[ni0]; - vector.y = normals[i1]; - vector.z = normals[i2]; - vector = invTranspose.deltaTransformVector(vector); - vector.normalize(); - normals[ni0] = vector.x; - normals[i1] = vector.y; - normals[i2] = vector.z; - ni0 += nStride; - } - - // bake tangent - if (bakeTangents) { - i1 = ti0 + 1; - i2 = ti0 + 2; - vector.x = tangents[ti0]; - vector.y = tangents[i1]; - vector.z = tangents[i2]; - vector = invTranspose.deltaTransformVector(vector); - vector.normalize(); - tangents[ti0] = vector.x; - tangents[i1] = vector.y; - tangents[i2] = vector.z; - ti0 += tStride; - } - } - - this.notifyPositionsUpdate(); - this.notifyNormalsUpdate(); - this.notifyTangentsUpdate(); - }; - - /** - * Updates the tangents for each face. - */ - TriangleSubGeometry.prototype.updateFaceTangents = function () { - var i = 0; - var index1; - var index2; - var index3; - var vi; - var v0; - var dv1; - var dv2; - var denom; - var x0, y0, z0; - var dx1, dy1, dz1; - var dx2, dy2, dz2; - var cx, cy, cz; - - var positions = this._positions; - var uvs = this._uvs; - - var len = this._pIndices.length; - - if (this._faceTangents == null) - this._faceTangents = new Array(len); - - while (i < len) { - index1 = this._pIndices[i]; - index2 = this._pIndices[i + 1]; - index3 = this._pIndices[i + 2]; - - v0 = uvs[index1 * 2 + 1]; - dv1 = uvs[index2 * 2 + 1] - v0; - dv2 = uvs[index3 * 2 + 1] - v0; - - vi = index1 * 3; - x0 = positions[vi]; - y0 = positions[vi + 1]; - z0 = positions[vi + 2]; - vi = index2 * 3; - dx1 = positions[vi] - x0; - dy1 = positions[vi + 1] - y0; - dz1 = positions[vi + 2] - z0; - vi = index3 * 3; - dx2 = positions[vi] - x0; - dy2 = positions[vi + 1] - y0; - dz2 = positions[vi + 2] - z0; - - cx = dv2 * dx1 - dv1 * dx2; - cy = dv2 * dy1 - dv1 * dy2; - cz = dv2 * dz1 - dv1 * dz2; - denom = 1 / Math.sqrt(cx * cx + cy * cy + cz * cz); - - this._faceTangents[i++] = denom * cx; - this._faceTangents[i++] = denom * cy; - this._faceTangents[i++] = denom * cz; - } - - this._faceTangentsDirty = false; - }; - - /** - * Updates the normals for each face. - */ - TriangleSubGeometry.prototype.updateFaceNormals = function () { - var i = 0; - var j = 0; - var k = 0; - var index; - var offset; - var stride; - - var x1, x2, x3; - var y1, y2, y3; - var z1, z2, z3; - var dx1, dy1, dz1; - var dx2, dy2, dz2; - var cx, cy, cz; - var d; - - var positions = this._positions; - - var len = this._pIndices.length; - - if (this._faceNormals == null) - this._faceNormals = new Array(len); - - if (this._useFaceWeights && this._faceWeights == null) - this._faceWeights = new Array(len / 3); - - while (i < len) { - index = this._pIndices[i++] * 3; - x1 = positions[index]; - y1 = positions[index + 1]; - z1 = positions[index + 2]; - index = this._pIndices[i++] * 3; - x2 = positions[index]; - y2 = positions[index + 1]; - z2 = positions[index + 2]; - index = this._pIndices[i++] * 3; - x3 = positions[index]; - y3 = positions[index + 1]; - z3 = positions[index + 2]; - dx1 = x3 - x1; - dy1 = y3 - y1; - dz1 = z3 - z1; - dx2 = x2 - x1; - dy2 = y2 - y1; - dz2 = z2 - z1; - cx = dz1 * dy2 - dy1 * dz2; - cy = dx1 * dz2 - dz1 * dx2; - cz = dy1 * dx2 - dx1 * dy2; - d = Math.sqrt(cx * cx + cy * cy + cz * cz); - - // length of cross product = 2*triangle area - if (this._useFaceWeights) { - var w = d * 10000; - - if (w < 1) - w = 1; - - this._faceWeights[k++] = w; - } - - d = 1 / d; - - this._faceNormals[j++] = cx * d; - this._faceNormals[j++] = cy * d; - this._faceNormals[j++] = cz * d; - } - - this._faceNormalsDirty = false; - }; - - TriangleSubGeometry.prototype._pNotifyVerticesUpdate = function () { - this._pStrideOffsetDirty = true; - - this.notifyPositionsUpdate(); - this.notifyNormalsUpdate(); - this.notifyTangentsUpdate(); - this.notifyUVsUpdate(); - this.notifySecondaryUVsUpdate(); - this.notifyJointIndicesUpdate(); - this.notifyJointWeightsUpdate(); - }; - - TriangleSubGeometry.prototype.notifyPositionsUpdate = function () { - if (this._positionsDirty) - return; - - this._positionsDirty = true; - - if (!this._positionsUpdated) - this._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); - - this.dispatchEvent(this._positionsUpdated); - }; - - TriangleSubGeometry.prototype.notifyNormalsUpdate = function () { - if (this._vertexNormalsDirty) - return; - - this._vertexNormalsDirty = true; - - if (!this._normalsUpdated) - this._normalsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.NORMAL_DATA); - - this.dispatchEvent(this._normalsUpdated); - }; - - TriangleSubGeometry.prototype.notifyTangentsUpdate = function () { - if (this._vertexTangentsDirty) - return; - - this._vertexTangentsDirty = true; - - if (!this._tangentsUpdated) - this._tangentsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.TANGENT_DATA); - - this.dispatchEvent(this._tangentsUpdated); - }; - - TriangleSubGeometry.prototype.notifyUVsUpdate = function () { - if (this._uvsDirty) - return; - - this._uvsDirty = true; - - if (!this._uvsUpdated) - this._uvsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.UV_DATA); - - this.dispatchEvent(this._uvsUpdated); - }; - - TriangleSubGeometry.prototype.notifySecondaryUVsUpdate = function () { - if (this._secondaryUVsDirty) - return; - - this._secondaryUVsDirty = true; - - if (!this._secondaryUVsUpdated) - this._secondaryUVsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.SECONDARY_UV_DATA); - - this.dispatchEvent(this._secondaryUVsUpdated); - }; - - TriangleSubGeometry.prototype.notifyJointIndicesUpdate = function () { - if (this._jointIndicesDirty) - return; - - this._jointIndicesDirty = true; - - if (!this._jointIndicesUpdated) - this._jointIndicesUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_INDEX_DATA); - - this.dispatchEvent(this._jointIndicesUpdated); - }; - - TriangleSubGeometry.prototype.notifyJointWeightsUpdate = function () { - if (this._jointWeightsDirty) - return; - - this._jointWeightsDirty = true; - - if (!this._jointWeightsUpdated) - this._jointWeightsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_WEIGHT_DATA); - - this.dispatchEvent(this._jointWeightsUpdated); - }; - TriangleSubGeometry.POSITION_DATA = "positions"; - TriangleSubGeometry.NORMAL_DATA = "vertexNormals"; - TriangleSubGeometry.TANGENT_DATA = "vertexTangents"; - TriangleSubGeometry.UV_DATA = "uvs"; - TriangleSubGeometry.SECONDARY_UV_DATA = "secondaryUVs"; - TriangleSubGeometry.JOINT_INDEX_DATA = "jointIndices"; - TriangleSubGeometry.JOINT_WEIGHT_DATA = "jointWeights"; - - TriangleSubGeometry.POSITION_FORMAT = "float3"; - TriangleSubGeometry.NORMAL_FORMAT = "float3"; - TriangleSubGeometry.TANGENT_FORMAT = "float3"; - TriangleSubGeometry.UV_FORMAT = "float2"; - TriangleSubGeometry.SECONDARY_UV_FORMAT = "float2"; - return TriangleSubGeometry; - })(base.SubGeometryBase); - base.TriangleSubGeometry = TriangleSubGeometry; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.base - */ - (function (base) { - var AssetType = away.library.AssetType; - - /** - * TriangleSubMesh wraps a TriangleSubGeometry as a scene graph instantiation. A TriangleSubMesh is owned by a Mesh object. - * - * - * @see away.base.TriangleSubGeometry - * @see away.entities.Mesh - * - * @class away.base.TriangleSubMesh - */ - var TriangleSubMesh = (function (_super) { - __extends(TriangleSubMesh, _super); - /** - * Creates a new TriangleSubMesh object - * @param subGeometry The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. - * @param parentMesh The Mesh object to which this TriangleSubMesh belongs. - * @param material An optional material used to render this TriangleSubMesh. - */ - function TriangleSubMesh(subGeometry, parentMesh, material) { - if (typeof material === "undefined") { material = null; } - _super.call(this); - - this._pParentMesh = parentMesh; - this._subGeometry = subGeometry; - this.material = material; - } - Object.defineProperty(TriangleSubMesh.prototype, "assetType", { - /** - * - */ - get: function () { - return AssetType.TRIANGLE_SUB_MESH; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TriangleSubMesh.prototype, "subGeometry", { - /** - * The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. - */ - get: function () { - return this._subGeometry; - }, - enumerable: true, - configurable: true - }); - - /** - * - */ - TriangleSubMesh.prototype.dispose = function () { - _super.prototype.dispose.call(this); - }; - - TriangleSubMesh.prototype._iCollectRenderable = function (renderer) { - renderer.applyTriangleSubMesh(this); - }; - return TriangleSubMesh; - })(base.SubMeshBase); - base.TriangleSubMesh = TriangleSubMesh; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - /** - * - */ - var TextureProxyBase = (function (_super) { - __extends(TextureProxyBase, _super); - /** - * - */ - function TextureProxyBase(generateMipmaps) { - if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } - _super.call(this); - this._pFormat = "bgra"; - this._textureData = new Array(); - - this._generateMipmaps = this._hasMipmaps = generateMipmaps; - } - Object.defineProperty(TextureProxyBase.prototype, "size", { - get: function () { - return this._pSize; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextureProxyBase.prototype, "hasMipmaps", { - get: function () { - return this._hasMipmaps; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextureProxyBase.prototype, "format", { - /** - * - * @returns {string} - */ - get: function () { - return this._pFormat; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextureProxyBase.prototype, "generateMipmaps", { - /** - * - * @returns {boolean} - */ - get: function () { - return this._generateMipmaps; - }, - set: function (value) { - if (this._generateMipmaps == value) - return; - - this._generateMipmaps = this._hasMipmaps = value; - - this.invalidateContent(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(TextureProxyBase.prototype, "assetType", { - /** - * - * @returns {string} - */ - get: function () { - return away.library.AssetType.TEXTURE; - }, - enumerable: true, - configurable: true - }); - - /** - * - */ - TextureProxyBase.prototype.invalidateContent = function () { - var len = this._textureData.length; - for (var i = 0; i < len; i++) - this._textureData[i].invalidate(); - }; - - /** - * - * @private - */ - TextureProxyBase.prototype.invalidateSize = function () { - while (this._textureData.length) - this._textureData[0].dispose(); - }; - - /** - * @inheritDoc - */ - TextureProxyBase.prototype.dispose = function () { - while (this._textureData.length) - this._textureData[0].dispose(); - }; - - TextureProxyBase.prototype._iAddTextureData = function (textureData) { - this._textureData.push(textureData); - - return textureData; - }; - - TextureProxyBase.prototype._iRemoveTextureData = function (textureData) { - this._textureData.splice(this._textureData.indexOf(textureData), 1); - - return textureData; - }; - return TextureProxyBase; - })(away.library.NamedAssetBase); - textures.TextureProxyBase = TextureProxyBase; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var Texture2DBase = (function (_super) { - __extends(Texture2DBase, _super); - function Texture2DBase(generateMipmaps) { - if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } - _super.call(this, generateMipmaps); - } - Object.defineProperty(Texture2DBase.prototype, "width", { - /** - * - * @returns {number} - */ - get: function () { - return this._pWidth; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Texture2DBase.prototype, "height", { - /** - * - * @returns {number} - */ - get: function () { - return this._pHeight; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Texture2DBase.prototype, "size", { - get: function () { - return this._pWidth; - }, - enumerable: true, - configurable: true - }); - - /** - * @inheritDoc - */ - Texture2DBase.prototype.dispose = function () { - _super.prototype.dispose.call(this); - - if (this._mipmapData) { - var len = this._mipmapData.length; - for (var i = 0; i < len; i++) - textures.MipmapGenerator.freeMipMapHolder(this._mipmapData[i]); - } - }; - - /** - * - */ - Texture2DBase.prototype.invalidateContent = function () { - _super.prototype.invalidateContent.call(this); - - this._mipmapDataDirty = true; - }; - - /** - * - * @param width - * @param height - * @private - */ - Texture2DBase.prototype._pSetSize = function (width, height) { - if (this._pWidth != width || this._pHeight != height) - this.invalidateSize(); - - this._mipmapDataDirty = true; - - this._pWidth = width; - this._pHeight = height; - }; - - Texture2DBase.prototype._iGetMipmapData = function () { - if (this._mipmapDataDirty) { - this._mipmapDataDirty = false; - - if (!this._mipmapData) - this._mipmapData = new Array(); - - away.textures.MipmapGenerator.generateMipMaps(this._iGetTextureData(), this._mipmapData, true); - } - - return this._mipmapData; - }; - - Texture2DBase.prototype._iGetTextureData = function () { - throw new away.errors.AbstractMethodError(); - }; - return Texture2DBase; - })(textures.TextureProxyBase); - textures.Texture2DBase = Texture2DBase; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var AbstractMethodError = away.errors.AbstractMethodError; - - var CubeTextureBase = (function (_super) { - __extends(CubeTextureBase, _super); - function CubeTextureBase(generateMipmaps) { - if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } - _super.call(this, generateMipmaps); - this._mipmapDataArray = new Array(6); - this._mipmapDataDirtyArray = new Array(6); - } - /** - * - * @param width - * @param height - * @private - */ - CubeTextureBase.prototype._pSetSize = function (size) { - if (this._pSize != size) - this.invalidateSize(); - - for (var i = 0; i < 6; i++) - this._mipmapDataDirtyArray[i] = true; - - this._pSize = size; - }; - - /** - * @inheritDoc - */ - CubeTextureBase.prototype.dispose = function () { - _super.prototype.dispose.call(this); - - for (var i = 0; i < 6; i++) { - var mipmapData = this._mipmapDataArray[i]; - var len = mipmapData.length; - for (var j = 0; j < len; j++) - textures.MipmapGenerator.freeMipMapHolder(mipmapData[j]); - } - }; - - /** - * - */ - CubeTextureBase.prototype.invalidateContent = function () { - _super.prototype.invalidateContent.call(this); - - for (var i = 0; i < 6; i++) - this._mipmapDataDirtyArray[i] = true; - }; - - CubeTextureBase.prototype._iGetMipmapData = function (side) { - if (this._mipmapDataDirtyArray[side]) { - this._mipmapDataDirtyArray[side] = false; - - var mipmapData = this._mipmapDataArray[side] || (this._mipmapDataArray[side] = new Array()); - textures.MipmapGenerator.generateMipMaps(this._iGetTextureData(side), mipmapData, true); - } - - return this._mipmapDataArray[side]; - }; - - CubeTextureBase.prototype._iGetTextureData = function (side) { - throw new AbstractMethodError(); - }; - return CubeTextureBase; - })(textures.TextureProxyBase); - textures.CubeTextureBase = CubeTextureBase; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var ImageTexture = (function (_super) { - __extends(ImageTexture, _super); - /** - * - * @param htmlImageElement - * @param generateMipmaps - */ - function ImageTexture(htmlImageElement, generateMipmaps) { - if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } - _super.call(this, generateMipmaps); - - this.htmlImageElement = htmlImageElement; - } - Object.defineProperty(ImageTexture.prototype, "htmlImageElement", { - /** - * - */ - get: function () { - return this._htmlImageElement; - }, - set: function (value) { - if (this._htmlImageElement == value) - return; - - if (!away.utils.TextureUtils.isHTMLImageElementValid(value)) - throw new away.errors.Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); - - this._htmlImageElement = value; - - this.invalidateContent(); - this._pSetSize(value.width, value.height); - }, - enumerable: true, - configurable: true - }); - - - ImageTexture.prototype._iGetTextureData = function () { - return this._htmlImageElement; - }; - return ImageTexture; - })(textures.Texture2DBase); - textures.ImageTexture = ImageTexture; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var BitmapTexture = (function (_super) { - __extends(BitmapTexture, _super); - function BitmapTexture(bitmapData, generateMipmaps) { - if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } - _super.call(this, generateMipmaps); - - this.bitmapData = bitmapData; - } - Object.defineProperty(BitmapTexture.prototype, "bitmapData", { - /** - * - * @returns {BitmapData} - */ - get: function () { - return this._bitmapData; - }, - set: function (value) { - if (this._bitmapData == value) - return; - - if (!away.utils.TextureUtils.isBitmapDataValid(value)) - throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); - - this._bitmapData = value; - - this.invalidateContent(); - - this._pSetSize(value.width, value.height); - }, - enumerable: true, - configurable: true - }); - - - BitmapTexture.prototype.dispose = function () { - _super.prototype.dispose.call(this); - - this._bitmapData.dispose(); - this._bitmapData = null; - }; - - BitmapTexture.prototype._iGetTextureData = function () { - return this._bitmapData; - }; - return BitmapTexture; - })(textures.Texture2DBase); - textures.BitmapTexture = BitmapTexture; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var RenderTexture = (function (_super) { - __extends(RenderTexture, _super); - function RenderTexture(width, height) { - _super.call(this, false); - - this._pSetSize(width, height); - } - Object.defineProperty(RenderTexture.prototype, "width", { - /** - * - * @returns {number} - */ - get: function () { - return this._pWidth; - }, - set: function (value) { - if (value == this._pWidth) - return; - - if (!away.utils.TextureUtils.isDimensionValid(value)) - throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); - - this.invalidateContent(); - - this._pSetSize(value, this._pHeight); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(RenderTexture.prototype, "height", { - /** - * - * @returns {number} - */ - get: function () { - return this._pHeight; - }, - set: function (value) { - if (value == this._pHeight) - return; - - if (!away.utils.TextureUtils.isDimensionValid(value)) - throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); - - this.invalidateContent(); - this._pSetSize(this._pWidth, value); - }, - enumerable: true, - configurable: true - }); - - return RenderTexture; - })(textures.Texture2DBase); - textures.RenderTexture = RenderTexture; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var ImageCubeTexture = (function (_super) { - __extends(ImageCubeTexture, _super); - function ImageCubeTexture(posX, negX, posY, negY, posZ, negZ, generateMipmaps) { - if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } - _super.call(this, generateMipmaps); - this._htmlImageElements = new Array(6); - - this._testSize(this._htmlImageElements[0] = posX); - this._testSize(this._htmlImageElements[1] = negX); - this._testSize(this._htmlImageElements[2] = posY); - this._testSize(this._htmlImageElements[3] = negY); - this._testSize(this._htmlImageElements[4] = posZ); - this._testSize(this._htmlImageElements[5] = negZ); - - this.invalidateContent(); - - this._pSetSize(posX.width); - } - Object.defineProperty(ImageCubeTexture.prototype, "positiveX", { - /** - * The texture on the cube's right face. - */ - get: function () { - return this._htmlImageElements[0]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[0] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ImageCubeTexture.prototype, "negativeX", { - /** - * The texture on the cube's left face. - */ - get: function () { - return this._htmlImageElements[1]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[1] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ImageCubeTexture.prototype, "positiveY", { - /** - * The texture on the cube's top face. - */ - get: function () { - return this._htmlImageElements[2]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[2] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ImageCubeTexture.prototype, "negativeY", { - /** - * The texture on the cube's bottom face. - */ - get: function () { - return this._htmlImageElements[3]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[3] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ImageCubeTexture.prototype, "positiveZ", { - /** - * The texture on the cube's far face. - */ - get: function () { - return this._htmlImageElements[4]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[4] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ImageCubeTexture.prototype, "negativeZ", { - /** - * The texture on the cube's near face. - */ - get: function () { - return this._htmlImageElements[5]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[5] = value; - }, - enumerable: true, - configurable: true - }); - - - ImageCubeTexture.prototype._testSize = function (value) { - if (value.width != value.height) - throw new Error("BitmapData should have equal width and height!"); - if (!away.utils.TextureUtils.isHTMLImageElementValid(value)) - throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); - }; - - ImageCubeTexture.prototype._iGetTextureData = function (side) { - return this._htmlImageElements[side]; - }; - return ImageCubeTexture; - })(textures.CubeTextureBase); - textures.ImageCubeTexture = ImageCubeTexture; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var BitmapCubeTexture = (function (_super) { - __extends(BitmapCubeTexture, _super); - function BitmapCubeTexture(posX, negX, posY, negY, posZ, negZ, generateMipmaps) { - if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } - _super.call(this, generateMipmaps); - this._bitmapDatas = new Array(6); - - this._testSize(this._bitmapDatas[0] = posX); - this._testSize(this._bitmapDatas[1] = negX); - this._testSize(this._bitmapDatas[2] = posY); - this._testSize(this._bitmapDatas[3] = negY); - this._testSize(this._bitmapDatas[4] = posZ); - this._testSize(this._bitmapDatas[5] = negZ); - - this.invalidateContent(); - - this._pSetSize(posX.width); - } - Object.defineProperty(BitmapCubeTexture.prototype, "positiveX", { - /** - * The texture on the cube's right face. - */ - get: function () { - return this._bitmapDatas[0]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[0] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(BitmapCubeTexture.prototype, "negativeX", { - /** - * The texture on the cube's left face. - */ - get: function () { - return this._bitmapDatas[1]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[1] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(BitmapCubeTexture.prototype, "positiveY", { - /** - * The texture on the cube's top face. - */ - get: function () { - return this._bitmapDatas[2]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[2] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(BitmapCubeTexture.prototype, "negativeY", { - /** - * The texture on the cube's bottom face. - */ - get: function () { - return this._bitmapDatas[3]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[3] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(BitmapCubeTexture.prototype, "positiveZ", { - /** - * The texture on the cube's far face. - */ - get: function () { - return this._bitmapDatas[4]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[4] = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(BitmapCubeTexture.prototype, "negativeZ", { - /** - * The texture on the cube's near face. - */ - get: function () { - return this._bitmapDatas[5]; - }, - set: function (value) { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[5] = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * - * @param value - * @private - */ - BitmapCubeTexture.prototype._testSize = function (value) { - if (value.width != value.height) - throw new Error("BitmapData should have equal width and height!"); - if (!away.utils.TextureUtils.isBitmapDataValid(value)) - throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); - }; - - BitmapCubeTexture.prototype.dispose = function () { - _super.prototype.dispose.call(this); - - var len = this._bitmapDatas.length; - for (var i = 0; i < len; i++) { - this._bitmapDatas[i].dispose(); - this._bitmapDatas[i] = null; - } - - this._bitmapDatas = null; - }; - - BitmapCubeTexture.prototype._iGetTextureData = function (side) { - return this._bitmapDatas[side]; - }; - return BitmapCubeTexture; - })(textures.CubeTextureBase); - textures.BitmapCubeTexture = BitmapCubeTexture; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var BitmapData = away.base.BitmapData; - var Matrix = away.geom.Matrix; - var Rectangle = away.geom.Rectangle; - - /** - * MipmapGenerator is a helper class that uploads BitmapData to a Texture including mipmap levels. - */ - var MipmapGenerator = (function () { - function MipmapGenerator() { - } - MipmapGenerator.generateMipMaps = function (source, output, alpha) { - if (typeof alpha === "undefined") { alpha = false; } - var w = source.width; - var h = source.height; - var i = 0; - - var mipmap; - - MipmapGenerator._rect.width = w; - MipmapGenerator._rect.height = h; - - while (w >= 1 && h >= 1) { - mipmap = output[i] = MipmapGenerator._getMipmapHolder(output[i], w, h); - - if (alpha) - mipmap.fillRect(MipmapGenerator._rect, 0); - - MipmapGenerator._matrix.a = MipmapGenerator._rect.width / source.width; - MipmapGenerator._matrix.d = MipmapGenerator._rect.height / source.height; - - mipmap.draw(source, MipmapGenerator._matrix); //TODO: smoothing? - - w >>= 1; - h >>= 1; - - MipmapGenerator._rect.width = w > 1 ? w : 1; - MipmapGenerator._rect.height = h > 1 ? h : 1; - - i++; - } - }; - - MipmapGenerator._getMipmapHolder = function (mipMapHolder, newW, newH) { - if (mipMapHolder) { - if (mipMapHolder.width == newW && mipMapHolder.height == newH) - return mipMapHolder; - - MipmapGenerator.freeMipMapHolder(mipMapHolder); - } - - if (!MipmapGenerator._mipMaps[newW]) { - MipmapGenerator._mipMaps[newW] = []; - MipmapGenerator._mipMapUses[newW] = []; - } - - if (!MipmapGenerator._mipMaps[newW][newH]) { - mipMapHolder = MipmapGenerator._mipMaps[newW][newH] = new BitmapData(newW, newH, true); - MipmapGenerator._mipMapUses[newW][newH] = 1; - } else { - MipmapGenerator._mipMapUses[newW][newH] = MipmapGenerator._mipMapUses[newW][newH] + 1; - mipMapHolder = MipmapGenerator._mipMaps[newW][newH]; - } - - return mipMapHolder; - }; - - MipmapGenerator.freeMipMapHolder = function (mipMapHolder) { - var holderWidth = mipMapHolder.width; - var holderHeight = mipMapHolder.height; - - if (--MipmapGenerator._mipMapUses[holderWidth][holderHeight] == 0) { - MipmapGenerator._mipMaps[holderWidth][holderHeight].dispose(); - MipmapGenerator._mipMaps[holderWidth][holderHeight] = null; - } - }; - MipmapGenerator._mipMaps = []; - MipmapGenerator._mipMapUses = []; - - MipmapGenerator._matrix = new Matrix(); - MipmapGenerator._rect = new Rectangle(); - return MipmapGenerator; - })(); - textures.MipmapGenerator = MipmapGenerator; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (textures) { - var BitmapData = away.base.BitmapData; - var BitmapDataChannel = away.base.BitmapDataChannel; - var Point = away.geom.Point; - - /** - * A convenience texture that encodes a specular map in the red channel, and the gloss map in the green channel, as expected by BasicSpecularMapMethod - */ - var SpecularBitmapTexture = (function (_super) { - __extends(SpecularBitmapTexture, _super); - function SpecularBitmapTexture(specularMap, glossMap, generateMipmaps) { - if (typeof specularMap === "undefined") { specularMap = null; } - if (typeof glossMap === "undefined") { glossMap = null; } - if (typeof generateMipmaps === "undefined") { generateMipmaps = true; } - var bmd = specularMap ? specularMap : glossMap; - - bmd = bmd ? new BitmapData(bmd.width, bmd.height, false, 0xffffff) : new BitmapData(1, 1, false, 0xffffff); - - _super.call(this, bmd, generateMipmaps); - - this.specularMap = specularMap; - this.glossMap = glossMap; - } - Object.defineProperty(SpecularBitmapTexture.prototype, "specularMap", { - get: function () { - return this._specularMap; - }, - set: function (value) { - this._specularMap = value; - - this.invalidateContent(); - - this._testSize(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(SpecularBitmapTexture.prototype, "glossMap", { - get: function () { - return this._glossMap; - }, - set: function (value) { - this._glossMap = value; - this.invalidateContent(); - - this._testSize(); - }, - enumerable: true, - configurable: true - }); - - - SpecularBitmapTexture.prototype._testSize = function () { - var w, h; - - if (this._specularMap) { - w = this._specularMap.width; - h = this._specularMap.height; - } else if (this._glossMap) { - w = this._glossMap.width; - h = this._glossMap.height; - } else { - w = 1; - h = 1; - } - - if (w != this._bitmapData.width && h != this._bitmapData.height) { - var oldBitmap = this._bitmapData; - this.bitmapData = new BitmapData(this._specularMap.width, this._specularMap.height, false, 0xffffff); - oldBitmap.dispose(); - } - }; - - SpecularBitmapTexture.prototype._iGetTextureData = function () { - var rect = this._specularMap.rect; - var origin = new Point(); - - this._bitmapData.fillRect(rect, 0xffffff); - - if (this._glossMap) - this._bitmapData.copyChannel(this._glossMap, rect, origin, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); - - if (this._specularMap) - this._bitmapData.copyChannel(this._specularMap, rect, origin, BitmapDataChannel.RED, BitmapDataChannel.RED); - - return this._bitmapData; - }; - return SpecularBitmapTexture; - })(textures.BitmapTexture); - textures.SpecularBitmapTexture = SpecularBitmapTexture; - })(away.textures || (away.textures = {})); - var textures = away.textures; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (parsers) { - var AbstractMethodError = away.errors.AbstractMethodError; - var AssetEvent = away.events.AssetEvent; - var ParserEvent = away.events.ParserEvent; - var TimerEvent = away.events.TimerEvent; - - var TextureUtils = away.utils.TextureUtils; - var Timer = away.utils.Timer; - - /** - * ParserBase provides an abstract base class for objects that convert blocks of data to data structures - * supported by away. - * - * If used by AssetLoader to automatically determine the parser type, two public static methods should - * be implemented, with the following signatures: - * - * public static supportsType(extension : string) : boolean - * Indicates whether or not a given file extension is supported by the parser. - * - * public static supportsData(data : *) : boolean - * Tests whether a data block can be parsed by the parser. - * - * Furthermore, for any concrete subtype, the method initHandle should be overridden to immediately - * create the object that will contain the parsed data. This allows ResourceManager to return an object - * handle regardless of whether the object was loaded or not. - * - * @see away.net.AssetLoader - */ - var ParserBase = (function (_super) { - __extends(ParserBase, _super); - /** - * Creates a new ParserBase object - * @param format The data format of the file data to be parsed. Can be either ParserDataFormat.BINARY or ParserDataFormat.PLAIN_TEXT, and should be provided by the concrete subtype. - * - * @see away.loading.parsers.ParserDataFormat - */ - function ParserBase(format) { - _super.call(this); - - this._materialMode = 0; - this._dataFormat = format; - this._dependencies = new Array(); - - this._pOnIntervalDelegate = away.utils.Delegate.create(this, this._pOnInterval); - } - //---------------------------------------------------------------------------------------------------------------------------------------------------------------- - // TODO: add error checking for the following ( could cause a problem if this function is not implemented ) - //---------------------------------------------------------------------------------------------------------------------------------------------------------------- - // Needs to be implemented in all Parsers ( - //public static supportsType(extension : string) : boolean - //* Indicates whether or not a given file extension is supported by the parser. - //---------------------------------------------------------------------------------------------------------------------------------------------------------------- - ParserBase.supportsType = function (extension) { - throw new AbstractMethodError(); - }; - - Object.defineProperty(ParserBase.prototype, "content", { - /* Protected */ - get: function () { - return this._pContent; - }, - enumerable: true, - configurable: true - }); - - /** - * Validates a bitmapData loaded before assigning to a default BitmapMaterial - */ - ParserBase.prototype.isBitmapDataValid = function (bitmapData) { - var isValid = TextureUtils.isBitmapDataValid(bitmapData); - - if (!isValid) { - console.log(">> Bitmap loaded is not having power of 2 dimensions or is higher than 2048"); - } - - return isValid; - }; - - - Object.defineProperty(ParserBase.prototype, "parsingFailure", { - get: function () { - return this._parsingFailure; - }, - set: function (b) { - this._parsingFailure = b; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ParserBase.prototype, "parsingPaused", { - get: function () { - return this._parsingPaused; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ParserBase.prototype, "parsingComplete", { - get: function () { - return this._parsingComplete; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ParserBase.prototype, "materialMode", { - get: function () { - return this._materialMode; - }, - set: function (newMaterialMode) { - this._materialMode = newMaterialMode; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ParserBase.prototype, "data", { - get: function () { - return this._data; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ParserBase.prototype, "dataFormat", { - /** - * The data format of the file data to be parsed. Options are URLLoaderDataFormat.BINARY, URLLoaderDataFormat.ARRAY_BUFFER, URLLoaderDataFormat.BLOB, URLLoaderDataFormat.VARIABLES or URLLoaderDataFormat.TEXT. - */ - get: function () { - return this._dataFormat; - }, - enumerable: true, - configurable: true - }); - - /** - * Parse data (possibly containing bytearry, plain text or BitmapAsset) asynchronously, meaning that - * the parser will periodically stop parsing so that the AVM may proceed to the - * next frame. - * - * @param data The untyped data object in which the loaded data resides. - * @param frameLimit number of milliseconds of parsing allowed per frame. The - * actual time spent on a frame can exceed this number since time-checks can - * only be performed between logical sections of the parsing procedure. - */ - ParserBase.prototype.parseAsync = function (data, frameLimit) { - if (typeof frameLimit === "undefined") { frameLimit = 30; } - this._data = data; - this._pStartParsing(frameLimit); - }; - - Object.defineProperty(ParserBase.prototype, "dependencies", { - /** - * A list of dependencies that need to be loaded and resolved for the object being parsed. - */ - get: function () { - return this._dependencies; - }, - enumerable: true, - configurable: true - }); - - /** - * Resolve a dependency when it's loaded. For example, a dependency containing an ImageResource would be assigned - * to a Mesh instance as a BitmapMaterial, a scene graph object would be added to its intended parent. The - * dependency should be a member of the dependencies property. - * - * @param resourceDependency The dependency to be resolved. - */ - ParserBase.prototype._iResolveDependency = function (resourceDependency) { - throw new AbstractMethodError(); - }; - - /** - * Resolve a dependency loading failure. Used by parser to eventually provide a default map - * - * @param resourceDependency The dependency to be resolved. - */ - ParserBase.prototype._iResolveDependencyFailure = function (resourceDependency) { - throw new AbstractMethodError(); - }; - - /** - * Resolve a dependency name - * - * @param resourceDependency The dependency to be resolved. - */ - ParserBase.prototype._iResolveDependencyName = function (resourceDependency, asset) { - return asset.name; - }; - - ParserBase.prototype._iResumeParsingAfterDependencies = function () { - this._parsingPaused = false; - - if (this._timer) - this._timer.start(); - }; - - ParserBase.prototype._pFinalizeAsset = function (asset, name) { - if (typeof name === "undefined") { name = null; } - var type_event; - var type_name; - - if (name != null) - asset.name = name; - - // If the asset has no name, give it - // a per-type default name. - if (!asset.name) - asset.name = asset.assetType; - - this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_COMPLETE, asset)); - }; - - /** - * Parse the next block of data. - * @return Whether or not more data needs to be parsed. Can be ParserBase.ParserBase.PARSING_DONE or - * ParserBase.ParserBase.MORE_TO_PARSE. - */ - ParserBase.prototype._pProceedParsing = function () { - throw new AbstractMethodError(); - }; - - ParserBase.prototype._pDieWithError = function (message) { - if (typeof message === "undefined") { message = 'Unknown parsing error'; } - if (this._timer) { - this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); - this._timer.stop(); - this._timer = null; - } - - this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message)); - }; - - ParserBase.prototype._pAddDependency = function (id, req, retrieveAsRawData, data, suppressErrorEvents) { - if (typeof retrieveAsRawData === "undefined") { retrieveAsRawData = false; } - if (typeof data === "undefined") { data = null; } - if (typeof suppressErrorEvents === "undefined") { suppressErrorEvents = false; } - var dependency = new parsers.ResourceDependency(id, req, data, null, this, retrieveAsRawData, suppressErrorEvents); - this._dependencies.push(dependency); - - return dependency; - }; - - ParserBase.prototype._pPauseAndRetrieveDependencies = function () { - if (this._timer) - this._timer.stop(); - - this._parsingPaused = true; - this.dispatchEvent(new ParserEvent(ParserEvent.READY_FOR_DEPENDENCIES)); - }; - - /** - * Tests whether or not there is still time left for parsing within the maximum allowed time frame per session. - * @return True if there is still time left, false if the maximum allotted time was exceeded and parsing should be interrupted. - */ - ParserBase.prototype._pHasTime = function () { - return ((away.utils.getTimer() - this._lastFrameTime) < this._frameLimit); - }; - - /** - * Called when the parsing pause interval has passed and parsing can proceed. - */ - ParserBase.prototype._pOnInterval = function (event) { - if (typeof event === "undefined") { event = null; } - this._lastFrameTime = away.utils.getTimer(); - - if (this._pProceedParsing() && !this._parsingFailure) - this._pFinishParsing(); - }; - - /** - * Initializes the parsing of data. - * @param frameLimit The maximum duration of a parsing session. - */ - ParserBase.prototype._pStartParsing = function (frameLimit) { - this._frameLimit = frameLimit; - this._timer = new Timer(this._frameLimit, 0); - this._timer.addEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); - this._timer.start(); - }; - - /** - * Finish parsing the data. - */ - ParserBase.prototype._pFinishParsing = function () { - if (this._timer) { - this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); - this._timer.stop(); - } - - this._timer = null; - this._parsingComplete = true; - - this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_COMPLETE)); - }; - - /** - * - * @returns {string} - * @private - */ - ParserBase.prototype._pGetTextData = function () { - return parsers.ParserUtils.toString(this._data); - }; - - /** - * - * @returns {string} - * @private - */ - ParserBase.prototype._pGetByteData = function () { - return parsers.ParserUtils.toByteArray(this._data); - }; - ParserBase.PARSING_DONE = true; - - ParserBase.MORE_TO_PARSE = false; - return ParserBase; - })(away.events.EventDispatcher); - parsers.ParserBase = ParserBase; - })(away.parsers || (away.parsers = {})); - var parsers = away.parsers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (parsers) { - var ImageCubeTexture = away.textures.ImageCubeTexture; - - /** - * CubeTextureParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - var CubeTextureParser = (function (_super) { - __extends(CubeTextureParser, _super); - /** - * Creates a new CubeTextureParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - function CubeTextureParser() { - _super.call(this, away.net.URLLoaderDataFormat.TEXT); - } - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - CubeTextureParser.supportsType = function (extension) { - extension = extension.toLowerCase(); - return extension == "cube"; - }; - - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - CubeTextureParser.supportsData = function (data) { - try { - var obj = JSON.parse(data); - - if (obj) { - return true; - } - return false; - } catch (e) { - return false; - } - - return false; - }; - - /** - * @inheritDoc - */ - CubeTextureParser.prototype._iResolveDependency = function (resourceDependency) { - }; - - /** - * @inheritDoc - */ - CubeTextureParser.prototype._iResolveDependencyFailure = function (resourceDependency) { - }; - - /** - * @inheritDoc - */ - CubeTextureParser.prototype._pProceedParsing = function () { - if (this._imgDependencyDictionary != null) { - var asset = new ImageCubeTexture(this._getHTMLImageElement(CubeTextureParser.posX), this._getHTMLImageElement(CubeTextureParser.negX), this._getHTMLImageElement(CubeTextureParser.posY), this._getHTMLImageElement(CubeTextureParser.negY), this._getHTMLImageElement(CubeTextureParser.posZ), this._getHTMLImageElement(CubeTextureParser.negZ)); - - //clear dictionary - this._imgDependencyDictionary = null; - - asset.name = this._iFileName; - - this._pFinalizeAsset(asset, this._iFileName); - - return parsers.ParserBase.PARSING_DONE; - } - - try { - var json = JSON.parse(this.data); - var data = json.data; - var rec; - - if (data.length != 6) - this._pDieWithError('CubeTextureParser: Error - cube texture should have exactly 6 images'); - - if (json) { - this._imgDependencyDictionary = new Object(); - - for (var c = 0; c < data.length; c++) { - rec = data[c]; - this._imgDependencyDictionary[rec.id] = this._pAddDependency(rec.id, new away.net.URLRequest(rec.image.toString())); - } - - if (!this._validateCubeData()) { - this._pDieWithError("CubeTextureParser: JSON data error - cubes require id of: \n" + CubeTextureParser.posX + ', ' + CubeTextureParser.negX + ', \n' + CubeTextureParser.posY + ', ' + CubeTextureParser.negY + ', \n' + CubeTextureParser.posZ + ', ' + CubeTextureParser.negZ); - - return parsers.ParserBase.PARSING_DONE; - } - - this._pPauseAndRetrieveDependencies(); - - return parsers.ParserBase.MORE_TO_PARSE; - } - } catch (e) { - this._pDieWithError('CubeTexturePaser Error parsing JSON'); - } - - return parsers.ParserBase.PARSING_DONE; - }; - - CubeTextureParser.prototype._validateCubeData = function () { - return (this._imgDependencyDictionary[CubeTextureParser.posX] != null && this._imgDependencyDictionary[CubeTextureParser.negX] != null && this._imgDependencyDictionary[CubeTextureParser.posY] != null && this._imgDependencyDictionary[CubeTextureParser.negY] != null && this._imgDependencyDictionary[CubeTextureParser.posZ] != null && this._imgDependencyDictionary[CubeTextureParser.negZ] != null); - }; - - CubeTextureParser.prototype._getHTMLImageElement = function (name) { - var dependency = this._imgDependencyDictionary[name]; - - if (dependency) { - return dependency.assets[0].htmlImageElement; - } - - return null; - }; - CubeTextureParser.posX = 'posX'; - CubeTextureParser.negX = 'negX'; - CubeTextureParser.posY = 'posY'; - CubeTextureParser.negY = 'negY'; - CubeTextureParser.posZ = 'posZ'; - CubeTextureParser.negZ = 'negZ'; - return CubeTextureParser; - })(parsers.ParserBase); - parsers.CubeTextureParser = CubeTextureParser; - })(away.parsers || (away.parsers = {})); - var parsers = away.parsers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (parsers) { - var URLLoaderDataFormat = away.net.URLLoaderDataFormat; - var ImageTexture = away.textures.ImageTexture; - - var ByteArray = away.utils.ByteArray; - var TextureUtils = away.utils.TextureUtils; - - /** - * Texture2DParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - var Texture2DParser = (function (_super) { - __extends(Texture2DParser, _super); - /** - * Creates a new Texture2DParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - function Texture2DParser() { - _super.call(this, URLLoaderDataFormat.ARRAY_BUFFER); - } - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - Texture2DParser.supportsType = function (extension) { - extension = extension.toLowerCase(); - return extension == "jpg" || extension == "jpeg" || extension == "png" || extension == "gif"; - }; - - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - Texture2DParser.supportsData = function (data) { - if (data instanceof HTMLImageElement) - return true; - - if (!(data instanceof ByteArray)) - return false; - - var ba = data; - ba.position = 0; - - if (ba.readUnsignedShort() == 0xffd8) - return true; - - ba.position = 0; - if (ba.readShort() == 0x424D) - return true; - - ba.position = 1; - if (ba.readUTFBytes(3) == 'PNG') - return true; - - ba.position = 0; - if (ba.readUTFBytes(3) == 'GIF' && ba.readShort() == 0x3839 && ba.readByte() == 0x61) - return true; - - ba.position = 0; - if (ba.readUTFBytes(3) == 'ATF') - return true; - - return false; - }; - - /** - * @inheritDoc - */ - Texture2DParser.prototype._pProceedParsing = function () { - var _this = this; - var asset; - var sizeError = false; - - if (this._loadingImage) { - return parsers.ParserBase.MORE_TO_PARSE; - } else if (this._htmlImageElement) { - if (TextureUtils.isHTMLImageElementValid(this._htmlImageElement)) { - asset = new ImageTexture(this._htmlImageElement); - this._pFinalizeAsset(asset, this._iFileName); - } - } else if (this.data instanceof HTMLImageElement) { - if (TextureUtils.isHTMLImageElementValid(this.data)) { - asset = new ImageTexture(this.data); - this._pFinalizeAsset(asset, this._iFileName); - } else { - sizeError = true; - } - } else if (this.data instanceof ByteArray) { - var ba = this.data; - ba.position = 0; - var htmlImageElement = parsers.ParserUtils.byteArrayToImage(this.data); - - if (TextureUtils.isHTMLImageElementValid(htmlImageElement)) { - asset = new ImageTexture(htmlImageElement); - this._pFinalizeAsset(asset, this._iFileName); - } else { - sizeError = true; - } - } else if (this.data instanceof ArrayBuffer) { - this._htmlImageElement = parsers.ParserUtils.arrayBufferToImage(this.data); - - asset = new ImageTexture(this._htmlImageElement); - this._pFinalizeAsset(asset, this._iFileName); - } else if (this.data instanceof Blob) { - this._htmlImageElement = parsers.ParserUtils.blobToImage(this.data); - - this._htmlImageElement.onload = function (event) { - return _this.onLoadComplete(event); - }; - this._loadingImage = true; - - return parsers.ParserBase.MORE_TO_PARSE; - } - - if (sizeError == true) { - // asset = new BitmapTexture(away.materials.DefaultMaterialManager.createCheckeredBitmapData(), false); - // this._pFinalizeAsset( asset, this._iFileName); - // this.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.TEXTURE_SIZE_ERROR, asset)); - } - - this._pContent = new away.entities.Billboard(new away.materials.CSSMaterialBase(asset)); - - return parsers.ParserBase.PARSING_DONE; - }; - - Texture2DParser.prototype.onLoadComplete = function (event) { - this._loadingImage = false; - }; - return Texture2DParser; - })(parsers.ParserBase); - parsers.Texture2DParser = Texture2DParser; - })(away.parsers || (away.parsers = {})); - var parsers = away.parsers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (parsers) { - /** - * An enumeration providing values to describe the data format of parsed data. - */ - var ParserDataFormat = (function () { - function ParserDataFormat() { - } - ParserDataFormat.BINARY = "binary"; - - ParserDataFormat.PLAIN_TEXT = "plainText"; - - ParserDataFormat.IMAGE = "image"; - return ParserDataFormat; - })(); - parsers.ParserDataFormat = ParserDataFormat; - })(away.parsers || (away.parsers = {})); - var parsers = away.parsers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (parsers) { - var ByteArray = away.utils.ByteArray; - - var ParserUtils = (function () { - function ParserUtils() { - } - /** - * Converts an ArrayBuffer to a base64 string - * - * @param image data as a ByteArray - * - * @return HTMLImageElement - * - */ - ParserUtils.arrayBufferToImage = function (data) { - var byteStr = ''; - var bytes = new Uint8Array(data); - var len = bytes.byteLength; - - for (var i = 0; i < len; i++) - byteStr += String.fromCharCode(bytes[i]); - - var base64Image = window.btoa(byteStr); - var str = 'data:image/png;base64,' + base64Image; - var img = new Image(); - img.src = str; - - return img; - }; - - /** - * Converts an ByteArray to an Image - returns an HTMLImageElement - * - * @param image data as a ByteArray - * - * @return HTMLImageElement - * - */ - ParserUtils.byteArrayToImage = function (data) { - var byteStr = ''; - var bytes = new Uint8Array(data.arraybytes); - var len = bytes.byteLength; - - for (var i = 0; i < len; i++) - byteStr += String.fromCharCode(bytes[i]); - - var base64Image = window.btoa(byteStr); - var str = 'data:image/png;base64,' + base64Image; - var img = new Image(); - img.src = str; - - return img; - }; - - /** - * Converts an Blob to an Image - returns an HTMLImageElement - * - * @param image data as a Blob - * - * @return HTMLImageElement - * - */ - ParserUtils.blobToImage = function (data) { - var URLObj = window['URL'] || window['webkitURL']; - var src = URLObj.createObjectURL(data); - var img = new Image(); - img.src = src; - - return img; - }; - - /** - * Returns a object as ByteArray, if possible. - * - * @param data The object to return as ByteArray - * - * @return The ByteArray or null - * - */ - ParserUtils.toByteArray = function (data) { - var b = new ByteArray(); - b.setArrayBuffer(data); - return b; - }; - - /** - * Returns a object as String, if possible. - * - * @param data The object to return as String - * @param length The length of the returned String - * - * @return The String or null - * - */ - ParserUtils.toString = function (data, length) { - if (typeof length === "undefined") { length = 0; } - if (typeof data === 'string') { - var s = data; - - if (s['substr'] != null) - return s.substr(0, s.length); - } - - if (data instanceof ByteArray) { - var ba = data; - ba.position = 0; - return ba.readUTFBytes(Math.min(ba.getBytesAvailable(), length)); - } - - return null; - /* - var ba:ByteArray; - - length ||= uint.MAX_VALUE; - - if (data is String) - return String(data).substr(0, length); - - ba = toByteArray(data); - if (ba) { - ba.position = 0; - return ba.readUTFBytes(Math.min(ba.bytesAvailable, length)); - } - - return null; - - */ - }; - return ParserUtils; - })(); - parsers.ParserUtils = ParserUtils; - })(away.parsers || (away.parsers = {})); - var parsers = away.parsers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (parsers) { - /** - * ResourceDependency represents the data required to load, parse and resolve additional files ("dependencies") - * required by a parser, used by ResourceLoadSession. - * - */ - var ResourceDependency = (function () { - function ResourceDependency(id, request, data, parser, parentParser, retrieveAsRawData, suppressAssetEvents) { - if (typeof retrieveAsRawData === "undefined") { retrieveAsRawData = false; } - if (typeof suppressAssetEvents === "undefined") { suppressAssetEvents = false; } - this._id = id; - this._request = request; - this._data = data; - this._parser = parser; - this._parentParser = parentParser; - this._retrieveAsRawData = retrieveAsRawData; - this._suppressAssetEvents = suppressAssetEvents; - - this._assets = new Array(); - this._dependencies = new Array(); - } - Object.defineProperty(ResourceDependency.prototype, "id", { - /** - * - */ - get: function () { - return this._id; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ResourceDependency.prototype, "request", { - /** - * - */ - get: function () { - return this._request; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ResourceDependency.prototype, "data", { - /** - * The data containing the dependency to be parsed, if the resource was already loaded. - */ - get: function () { - return this._data; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ResourceDependency.prototype, "parser", { - /** - * - */ - get: function () { - return this._parser; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ResourceDependency.prototype, "parentParser", { - /** - * The parser which is dependent on this ResourceDependency object. - */ - get: function () { - return this._parentParser; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ResourceDependency.prototype, "retrieveAsRawData", { - /** - * - */ - get: function () { - return this._retrieveAsRawData; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ResourceDependency.prototype, "suppresAssetEvents", { - /** - * - */ - get: function () { - return this._suppressAssetEvents; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ResourceDependency.prototype, "assets", { - /** - * - */ - get: function () { - return this._assets; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ResourceDependency.prototype, "dependencies", { - /** - * - */ - get: function () { - return this._dependencies; - }, - enumerable: true, - configurable: true - }); - - /** - * @private - * Method to set data after having already created the dependency object, e.g. after load. - */ - ResourceDependency.prototype._iSetData = function (data) { - this._data = data; - }; - - /** - * @private - * - */ - ResourceDependency.prototype._iSetParser = function (parser) { - this._parser = parser; - }; - - /** - * Resolve the dependency when it's loaded with the parent parser. For example, a dependency containing an - * ImageResource would be assigned to a Mesh instance as a BitmapMaterial, a scene graph object would be added - * to its intended parent. The dependency should be a member of the dependencies property. - */ - ResourceDependency.prototype.resolve = function () { - if (this._parentParser) - this._parentParser._iResolveDependency(this); - }; - - /** - * Resolve a dependency failure. For example, map loading failure from a 3d file - */ - ResourceDependency.prototype.resolveFailure = function () { - if (this._parentParser) - this._parentParser._iResolveDependencyFailure(this); - }; - - /** - * Resolve the dependencies name - */ - ResourceDependency.prototype.resolveName = function (asset) { - if (this._parentParser) - return this._parentParser._iResolveDependencyName(this, asset); - - return asset.name; - }; - return ResourceDependency; - })(); - parsers.ResourceDependency = ResourceDependency; - })(away.parsers || (away.parsers = {})); - var parsers = away.parsers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - var AssetLoaderContext = (function () { - /** - * AssetLoaderContext provides configuration for the AssetLoader load() and parse() operations. - * Use it to configure how (and if) dependencies are loaded, or to map dependency URLs to - * embedded data. - * - * @see away.loading.AssetLoader - */ - function AssetLoaderContext(includeDependencies, dependencyBaseUrl) { - if (typeof includeDependencies === "undefined") { includeDependencies = true; } - if (typeof dependencyBaseUrl === "undefined") { dependencyBaseUrl = null; } - this._includeDependencies = includeDependencies; - this._dependencyBaseUrl = dependencyBaseUrl || ''; - this._embeddedDataByUrl = {}; - this._remappedUrls = {}; - this._materialMode = AssetLoaderContext.UNDEFINED; - } - Object.defineProperty(AssetLoaderContext.prototype, "includeDependencies", { - /** - * Defines whether dependencies (all files except the one at the URL given to the load() or - * parseData() operations) should be automatically loaded. Defaults to true. - */ - get: function () { - return this._includeDependencies; - }, - set: function (val) { - this._includeDependencies = val; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(AssetLoaderContext.prototype, "materialMode", { - /** - * MaterialMode defines, if the Parser should create SinglePass or MultiPass Materials - * Options: - * 0 (Default / undefined) - All Parsers will create SinglePassMaterials, but the AWD2.1parser will create Materials as they are defined in the file - * 1 (Force SinglePass) - All Parsers create SinglePassMaterials - * 2 (Force MultiPass) - All Parsers will create MultiPassMaterials - * - */ - get: function () { - return this._materialMode; - }, - set: function (materialMode) { - this._materialMode = materialMode; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(AssetLoaderContext.prototype, "dependencyBaseUrl", { - /** - * A base URL that will be prepended to all relative dependency URLs found in a loaded resource. - * Absolute paths will not be affected by the value of this property. - */ - get: function () { - return this._dependencyBaseUrl; - }, - set: function (val) { - this._dependencyBaseUrl = val; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(AssetLoaderContext.prototype, "overrideAbsolutePaths", { - /** - * Defines whether absolute paths (defined as paths that begin with a "/") should be overridden - * with the dependencyBaseUrl defined in this context. If this is true, and the base path is - * "base", /path/to/asset.jpg will be resolved as base/path/to/asset.jpg. - */ - get: function () { - return this._overrideAbsPath; - }, - set: function (val) { - this._overrideAbsPath = val; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(AssetLoaderContext.prototype, "overrideFullURLs", { - /** - * Defines whether "full" URLs (defined as a URL that includes a scheme, e.g. http://) should be - * overridden with the dependencyBaseUrl defined in this context. If this is true, and the base - * path is "base", http://example.com/path/to/asset.jpg will be resolved as base/path/to/asset.jpg. - */ - get: function () { - return this._overrideFullUrls; - }, - set: function (val) { - this._overrideFullUrls = val; - }, - enumerable: true, - configurable: true - }); - - - /** - * Map a URL to another URL, so that files that are referred to by the original URL will instead - * be loaded from the new URL. Use this when your file structure does not match the one that is - * expected by the loaded file. - * - * @param originalUrl The original URL which is referenced in the loaded resource. - * @param newUrl The URL from which away.should load the resource instead. - * - * @see mapUrlToData() - */ - AssetLoaderContext.prototype.mapUrl = function (originalUrl, newUrl) { - this._remappedUrls[originalUrl] = newUrl; - }; - - /** - * Map a URL to embedded data, so that instead of trying to load a dependency from the URL at - * which it's referenced, the dependency data will be retrieved straight from the memory instead. - * - * @param originalUrl The original URL which is referenced in the loaded resource. - * @param data The embedded data. Can be ByteArray or a class which can be used to create a bytearray. - */ - AssetLoaderContext.prototype.mapUrlToData = function (originalUrl, data) { - this._embeddedDataByUrl[originalUrl] = data; - }; - - /** - * @private - * Defines whether embedded data has been mapped to a particular URL. - */ - AssetLoaderContext.prototype._iHasDataForUrl = function (url) { - return this._embeddedDataByUrl.hasOwnProperty(url); - }; - - /** - * @private - * Returns embedded data for a particular URL. - */ - AssetLoaderContext.prototype._iGetDataForUrl = function (url) { - return this._embeddedDataByUrl[url]; - }; - - /** - * @private - * Defines whether a replacement URL has been mapped to a particular URL. - */ - AssetLoaderContext.prototype._iHasMappingForUrl = function (url) { - return this._remappedUrls.hasOwnProperty(url); - }; - - /** - * @private - * Returns new (replacement) URL for a particular original URL. - */ - AssetLoaderContext.prototype._iGetRemappedUrl = function (originalUrl) { - return this._remappedUrls[originalUrl]; - }; - AssetLoaderContext.UNDEFINED = 0; - AssetLoaderContext.SINGLEPASS_MATERIALS = 1; - AssetLoaderContext.MULTIPASS_MATERIALS = 2; - return AssetLoaderContext; - })(); - library.AssetLoaderContext = AssetLoaderContext; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - var URLLoader = away.net.URLLoader; - var URLLoaderDataFormat = away.net.URLLoaderDataFormat; - - var CubeTextureParser = away.parsers.CubeTextureParser; - - var ResourceDependency = away.parsers.ResourceDependency; - var Texture2DParser = away.parsers.Texture2DParser; - - /** - * Dispatched when any asset finishes parsing. Also see specific events for each - * individual asset type (meshes, materials et c.) - * - * @eventType away.events.AssetEvent - */ - //[Event(name="assetComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a full resource (including dependencies) finishes loading. - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] - /** - * Dispatched when a single dependency (which may be the main file of a resource) - * finishes loading. - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] - /** - * Dispatched when an error occurs during loading. I - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="loadError", type="away3d.events.LoaderEvent")] - /** - * Dispatched when an error occurs during parsing. - * - * @eventType away.events.ParserEvent - */ - //[Event(name="parseError", type="away3d.events.ParserEvent")] - /** - * Dispatched when an image asset dimensions are not a power of 2 - * - * @eventType away.events.AssetEvent - */ - //[Event(name="textureSizeError", type="away3d.events.AssetEvent")] - /** - * AssetLoader can load any file format that away.supports (or for which a third-party parser - * has been plugged in) and it's dependencies. Events are dispatched when assets are encountered - * and for when the resource (or it's dependencies) have been loaded. - * - * The AssetLoader will not make assets available in any other way than through the dispatched - * events. To store assets and make them available at any point from any module in an application, - * use the AssetLibrary to load and manage assets. - * - * @see away.library.AssetLibrary - */ - var AssetLoader = (function (_super) { - __extends(AssetLoader, _super); - /** - * Create a new ResourceLoadSession object. - */ - function AssetLoader(materialMode) { - if (typeof materialMode === "undefined") { materialMode = 0; } - _super.call(this); - - this._materialMode = materialMode; - - this._stack = new Array(); - this._errorHandlers = new Array(); - this._parseErrorHandlers = new Array(); - - this._onReadyForDependenciesDelegate = away.utils.Delegate.create(this, this.onReadyForDependencies); - this._onParseCompleteDelegate = away.utils.Delegate.create(this, this.onParseComplete); - this._onParseErrorDelegate = away.utils.Delegate.create(this, this.onParseError); - this._onLoadCompleteDelegate = away.utils.Delegate.create(this, this.onLoadComplete); - this._onLoadErrorDelegate = away.utils.Delegate.create(this, this.onLoadError); - this._onTextureSizeErrorDelegate = away.utils.Delegate.create(this, this.onTextureSizeError); - this._onAssetCompleteDelegate = away.utils.Delegate.create(this, this.onAssetComplete); - } - /** - * Enables a specific parser. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parser The parser class to enable. - * - * @see away.parsers.Parsers - */ - AssetLoader.enableParser = function (parser) { - if (AssetLoader._parsers.indexOf(parser) < 0) - AssetLoader._parsers.push(parser); - }; - - /** - * Enables a list of parsers. - * When no specific parser is set for a loading/parsing opperation, - * AssetLoader can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parsers A Vector of parser classes to enable. - * @see away.parsers.Parsers - */ - AssetLoader.enableParsers = function (parsers) { - for (var c = 0; c < parsers.length; c++) - AssetLoader.enableParser(parsers[c]); - }; - - Object.defineProperty(AssetLoader.prototype, "baseDependency", { - /** - * Returns the base dependency of the loader - */ - get: function () { - return this._baseDependency; - }, - enumerable: true, - configurable: true - }); - - /** - * Loads a file and (optionally) all of its dependencies. - * - * @param req The URLRequest object containing the URL of the file to be loaded. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - */ - AssetLoader.prototype.load = function (req, context, ns, parser) { - if (typeof context === "undefined") { context = null; } - if (typeof ns === "undefined") { ns = null; } - if (typeof parser === "undefined") { parser = null; } - if (!this._token) { - this._token = new library.AssetLoaderToken(this); - - this._uri = req.url = req.url.replace(/\\/g, "/"); - this._context = context; - this._namespace = ns; - - this._baseDependency = new ResourceDependency('', req, null, parser, null); - this.retrieveDependency(this._baseDependency); - - return this._token; - } - - // TODO: Throw error (already loading) - return null; - }; - - /** - * Loads a resource from already loaded data. - * - * @param data The data object containing all resource information. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - */ - AssetLoader.prototype.loadData = function (data, id, context, ns, parser) { - if (typeof context === "undefined") { context = null; } - if (typeof ns === "undefined") { ns = null; } - if (typeof parser === "undefined") { parser = null; } - if (!this._token) { - this._token = new library.AssetLoaderToken(this); - - this._uri = id; - this._context = context; - this._namespace = ns; - - this._baseDependency = new ResourceDependency(id, null, data, parser, null); - this.retrieveDependency(this._baseDependency); - - return this._token; - } - - // TODO: Throw error (already loading) - return null; - }; - - /** - * Recursively retrieves the next to-be-loaded and parsed dependency on the stack, or pops the list off the - * stack when complete and continues on the top set. - * @param parser The parser that will translate the data into a usable resource. - */ - AssetLoader.prototype.retrieveNext = function (parser) { - if (typeof parser === "undefined") { parser = null; } - if (this._currentDependency.dependencies.length) { - var next = this._currentDependency.dependencies.pop(); - - this._stack.push(this._currentDependency); - this.retrieveDependency(next); - } else if (this._currentDependency.parser && this._currentDependency.parser.parsingPaused) { - this._currentDependency.parser._iResumeParsingAfterDependencies(); - this._stack.pop(); - } else if (this._stack.length) { - var prev = this._currentDependency; - - this._currentDependency = this._stack.pop(); - - if (prev._iSuccess) - prev.resolve(); - - this.retrieveNext(parser); - } else { - this.dispatchEvent(new away.events.LoaderEvent(away.events.LoaderEvent.RESOURCE_COMPLETE, this._uri, this._baseDependency.parser.content, this._baseDependency.assets)); - } - }; - - /** - * Retrieves a single dependency. - * @param parser The parser that will translate the data into a usable resource. - */ - AssetLoader.prototype.retrieveDependency = function (dependency) { - var data; - - if (this._context && this._context.materialMode != 0) - this._materialMode = this._context.materialMode; - - this._currentDependency = dependency; - - dependency._iLoader = new URLLoader(); - - this.addEventListeners(dependency._iLoader); - - // Get already loaded (or mapped) data if available - data = dependency.data; - - if (this._context && dependency.request && this._context._iHasDataForUrl(dependency.request.url)) - data = this._context._iGetDataForUrl(dependency.request.url); - - if (data) { - if (data.constructor === Function) - data = new data(); - - dependency._iSetData(data); - - if (dependency.retrieveAsRawData) { - // No need to parse. The parent parser is expecting this - // to be raw data so it can be passed directly. - dependency.resolve(); - - // Move on to next dependency - this.retrieveNext(); - } else { - this.parseDependency(dependency); - } - } else { - // Resolve URL and start loading - dependency.request.url = this.resolveDependencyUrl(dependency); - - if (dependency.retrieveAsRawData) { - // Always use binary for raw data loading - dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; - } else { - if (!dependency.parser) - dependency._iSetParser(this.getParserFromSuffix(dependency.request.url)); - - if (dependency.parser) { - dependency._iLoader.dataFormat = dependency.parser.dataFormat; - } else { - // Always use BINARY for unknown file formats. The thorough - // file type check will determine format after load, and if - // binary, a text load will have broken the file data. - dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; - } - } - - dependency._iLoader.load(dependency.request); - } - }; - - AssetLoader.prototype.joinUrl = function (base, end) { - if (end.charAt(0) == '/') - end = end.substr(1); - - if (base.length == 0) - return end; - - if (base.charAt(base.length - 1) == '/') - base = base.substr(0, base.length - 1); - - return base.concat('/', end); - }; - - AssetLoader.prototype.resolveDependencyUrl = function (dependency) { - var scheme_re; - var base; - var url = dependency.request.url; - - // Has the user re-mapped this URL? - if (this._context && this._context._iHasMappingForUrl(url)) - return this._context._iGetRemappedUrl(url); - - // This is the "base" dependency, i.e. the actual requested asset. - // We will not try to resolve this since the user can probably be - // thrusted to know this URL better than our automatic resolver. :) - if (url == this._uri) - return url; - - // Absolute URL? Check if starts with slash or a URL - // scheme definition (e.g. ftp://, http://, file://) - scheme_re = new RegExp('/^[a-zA-Z]{3,4}:\/\//'); - - if (url.charAt(0) == '/') { - if (this._context && this._context.overrideAbsolutePaths) - return this.joinUrl(this._context.dependencyBaseUrl, url); - else - return url; - } else if (scheme_re.test(url)) { - // If overriding full URLs, get rid of scheme (e.g. "http://") - // and replace with the dependencyBaseUrl defined by user. - if (this._context && this._context.overrideFullURLs) { - var noscheme_url = url.replace(scheme_re, ''); - return this.joinUrl(this._context.dependencyBaseUrl, noscheme_url); - } - } - - // Since not absolute, just get rid of base file name to find it's - // folder and then concatenate dynamic URL - if (this._context && this._context.dependencyBaseUrl) { - base = this._context.dependencyBaseUrl; - return this.joinUrl(base, url); - } else { - base = this._uri.substring(0, this._uri.lastIndexOf('/') + 1); - return this.joinUrl(base, url); - } - }; - - AssetLoader.prototype.retrieveParserDependencies = function () { - if (!this._currentDependency) - return; - - var parserDependancies = this._currentDependency.parser.dependencies; - var i, len = parserDependancies.length; - - for (i = 0; i < len; i++) - this._currentDependency.dependencies[i] = parserDependancies[i]; - - // Since more dependencies might be added eventually, empty this - // list so that the same dependency isn't retrieved more than once. - parserDependancies.length = 0; - - this._stack.push(this._currentDependency); - - this.retrieveNext(); - }; - - AssetLoader.prototype.resolveParserDependencies = function () { - this._currentDependency._iSuccess = true; - - // Retrieve any last dependencies remaining on this parser, or - // if none exists, just move on. - if (this._currentDependency.parser && this._currentDependency.parser.dependencies.length && (!this._context || this._context.includeDependencies)) - this.retrieveParserDependencies(); - else - this.retrieveNext(); - }; - - /** - * Called when a single dependency loading failed, and pushes further dependencies onto the stack. - * @param event - */ - AssetLoader.prototype.onLoadError = function (event) { - var handled; - var isDependency = (this._currentDependency != this._baseDependency); - var loader = event.target; - - this.removeEventListeners(loader); - - if (this.hasEventListener(away.events.IOErrorEvent.IO_ERROR)) { - this.dispatchEvent(event); - handled = true; - } else { - // TODO: Consider not doing this even when AssetLoader does have it's own LOAD_ERROR listener - var i, len = this._errorHandlers.length; - for (i = 0; i < len; i++) - if (!handled) - handled = this._errorHandlers[i](event); - } - - if (handled) { - //if (isDependency && ! event.isDefaultPrevented()) { - if (isDependency) { - this._currentDependency.resolveFailure(); - this.retrieveNext(); - } else { - // Either this was the base file (last left in the stack) or - // default behavior was prevented by the handlers, and hence - // there is nothing more to do than clean up and bail. - this.dispose(); - return; - } - } else { - throw new away.errors.Error(); - } - }; - - /** - * Called when a dependency parsing failed, and dispatches a ParserEvent.PARSE_ERROR - * @param event - */ - AssetLoader.prototype.onParseError = function (event) { - var handled; - - var isDependency = (this._currentDependency != this._baseDependency); - - var loader = event.target; - - this.removeEventListeners(loader); - - if (this.hasEventListener(away.events.ParserEvent.PARSE_ERROR)) { - this.dispatchEvent(event); - handled = true; - } else { - // TODO: Consider not doing this even when AssetLoader does - // have it's own LOAD_ERROR listener - var i, len = this._parseErrorHandlers.length; - - for (i = 0; i < len; i++) - if (!handled) - handled = this._parseErrorHandlers[i](event); - } - - if (handled) { - this.dispose(); - return; - } else { - throw new away.errors.Error(event.message); - } - }; - - AssetLoader.prototype.onAssetComplete = function (event) { - // Add loaded asset to list of assets retrieved as part - // of the current dependency. This list will be inspected - // by the parent parser when dependency is resolved - if (this._currentDependency) - this._currentDependency.assets.push(event.asset); - - event.asset.resetAssetPath(event.asset.name, this._namespace); - - if (!this._currentDependency.suppresAssetEvents) - this.dispatchEvent(event); - }; - - AssetLoader.prototype.onReadyForDependencies = function (event) { - var parser = event.target; - - if (this._context && !this._context.includeDependencies) - parser._iResumeParsingAfterDependencies(); - else - this.retrieveParserDependencies(); - }; - - /** - * Called when a single dependency was parsed, and pushes further dependencies onto the stack. - * @param event - */ - AssetLoader.prototype.onLoadComplete = function (event) { - var loader = event.target; - - this.removeEventListeners(loader); - - // Resolve this dependency - this._currentDependency._iSetData(loader.data); - - if (this._currentDependency.retrieveAsRawData) { - // No need to parse this data, which should be returned as is - this.resolveParserDependencies(); - } else { - this.parseDependency(this._currentDependency); - } - }; - - /** - * Called when parsing is complete. - */ - AssetLoader.prototype.onParseComplete = function (event) { - var parser = event.target; - - this.resolveParserDependencies(); //resolve in front of removing listeners to allow any remaining asset events to propagate - - parser.removeEventListener(away.events.ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); - parser.removeEventListener(away.events.ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); - parser.removeEventListener(away.events.ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); - parser.removeEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - parser.removeEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - }; - - /** - * Called when an image is too large or it's dimensions are not a power of 2 - * @param event - */ - AssetLoader.prototype.onTextureSizeError = function (event) { - event.asset.name = this._currentDependency.resolveName(event.asset); - - this.dispatchEvent(event); - }; - - AssetLoader.prototype.addEventListeners = function (loader) { - loader.addEventListener(away.events.Event.COMPLETE, this._onLoadCompleteDelegate); - loader.addEventListener(away.events.IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); - }; - - AssetLoader.prototype.removeEventListeners = function (loader) { - loader.removeEventListener(away.events.Event.COMPLETE, this._onLoadCompleteDelegate); - loader.removeEventListener(away.events.IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); - }; - - AssetLoader.prototype.stop = function () { - this.dispose(); - }; - - AssetLoader.prototype.dispose = function () { - this._errorHandlers = null; - this._parseErrorHandlers = null; - this._context = null; - this._token = null; - this._stack = null; - - if (this._currentDependency && this._currentDependency._iLoader) - this.removeEventListeners(this._currentDependency._iLoader); - - this._currentDependency = null; - }; - - /** - * @private - * This method is used by other loader classes (e.g. Loader3D and AssetLibraryBundle) to - * add error event listeners to the AssetLoader instance. This system is used instead of - * the regular EventDispatcher system so that the AssetLibrary error handler can be sure - * that if hasEventListener() returns true, it's client code that's listening for the - * event. Secondly, functions added as error handler through this custom method are - * expected to return a boolean value indicating whether the event was handled (i.e. - * whether they in turn had any client code listening for the event.) If no handlers - * return true, the AssetLoader knows that the event wasn't handled and will throw an RTE. - */ - AssetLoader.prototype._iAddParseErrorHandler = function (handler) { - if (this._parseErrorHandlers.indexOf(handler) < 0) - this._parseErrorHandlers.push(handler); - }; - - AssetLoader.prototype._iAddErrorHandler = function (handler) { - if (this._errorHandlers.indexOf(handler) < 0) - this._errorHandlers.push(handler); - }; - - /** - * Guesses the parser to be used based on the file contents. - * @param data The data to be parsed. - * @param uri The url or id of the object to be parsed. - * @return An instance of the guessed parser. - */ - AssetLoader.prototype.getParserFromData = function (data) { - var len = AssetLoader._parsers.length; - - for (var i = len - 1; i >= 0; i--) - if (AssetLoader._parsers[i].supportsData(data)) - return new AssetLoader._parsers[i](); - - return null; - }; - - /** - * Initiates parsing of the loaded dependency. - * - * @param The dependency to be parsed. - */ - AssetLoader.prototype.parseDependency = function (dependency) { - var parser = dependency.parser; - - // If no parser has been defined, try to find one by letting - // all plugged in parsers inspect the actual data. - if (!parser) - dependency._iSetParser(parser = this.getParserFromData(dependency.data)); - - if (parser) { - parser.addEventListener(away.events.ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); - parser.addEventListener(away.events.ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); - parser.addEventListener(away.events.ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); - parser.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - parser.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - if (dependency.request && dependency.request.url) - parser._iFileName = dependency.request.url; - - parser.materialMode = this._materialMode; - - parser.parseAsync(dependency.data); - } else { - var message = "No parser defined. To enable all parsers for auto-detection, use Parsers.enableAllBundled()"; - if (this.hasEventListener(away.events.ParserEvent.PARSE_ERROR)) - this.dispatchEvent(new away.events.ParserEvent(away.events.ParserEvent.PARSE_ERROR, message)); - else - throw new Error(message); - } - }; - - /** - * Guesses the parser to be used based on the file extension. - * @return An instance of the guessed parser. - */ - AssetLoader.prototype.getParserFromSuffix = function (url) { - // Get rid of query string if any and extract extension - var base = (url.indexOf('?') > 0) ? url.split('?')[0] : url; - var fileExtension = base.substr(base.lastIndexOf('.') + 1).toLowerCase(); - - var len = AssetLoader._parsers.length; - - for (var i = len - 1; i >= 0; i--) { - var parserClass = AssetLoader._parsers[i]; - if (parserClass.supportsType(fileExtension)) - return new parserClass(); - } - - return null; - }; - AssetLoader._parsers = new Array(Texture2DParser, CubeTextureParser); - return AssetLoader; - })(away.events.EventDispatcher); - library.AssetLoader = AssetLoader; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - /** - * Dispatched when any asset finishes parsing. Also see specific events for each - * individual asset type (meshes, materials et c.) - * - * @eventType away.events.AssetEvent - */ - //[Event(name="assetComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a full resource (including dependencies) finishes loading. - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] - /** - * Dispatched when a single dependency (which may be the main file of a resource) - * finishes loading. - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] - /** - * Dispatched when an error occurs during loading. I - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="loadError", type="away3d.events.LoaderEvent")] - /** - * Dispatched when an error occurs during parsing. - * - * @eventType away.events.ParserEvent - */ - //[Event(name="parseError", type="away3d.events.ParserEvent")] - /** - * Dispatched when a skybox asset has been costructed from a ressource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="skyboxComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a camera3d asset has been costructed from a ressource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="cameraComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a mesh asset has been costructed from a ressource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="meshComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a geometry asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="geometryComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a skeleton asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="skeletonComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a skeleton pose asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="skeletonPoseComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a container asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="containerComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a texture asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="textureComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a texture projector asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="textureProjectorComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a material asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="materialComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a animator asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="animatorComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when an animation set has been constructed from a group of animation state resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="animationSetComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when an animation state has been constructed from a group of animation node resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="animationStateComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when an animation node has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="animationNodeComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when an animation state transition has been constructed from a group of animation node resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="stateTransitionComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when an light asset has been constructed from a resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="lightComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when an light picker asset has been constructed from a resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="lightPickerComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when an effect method asset has been constructed from a resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="effectMethodComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when an shadow map method asset has been constructed from a resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="shadowMapMethodComplete", type="away3d.events.AssetEvent")] - /** - * Instances of this class are returned as tokens by loading operations - * to provide an object on which events can be listened for in cases where - * the actual asset loader is not directly available (e.g. when using the - * AssetLibrary to perform the load.) - * - * By listening for events on this class instead of directly on the - * AssetLibrary, one can distinguish different loads from each other. - * - * The token will dispatch all events that the original AssetLoader dispatches, - * while not providing an interface to obstruct the load and is as such a - * safer return value for loader wrappers than the loader itself. - */ - var AssetLoaderToken = (function (_super) { - __extends(AssetLoaderToken, _super); - function AssetLoaderToken(loader) { - _super.call(this); - - this._iLoader = loader; - } - AssetLoaderToken.prototype.addEventListener = function (type, listener) { - this._iLoader.addEventListener(type, listener); - }; - - AssetLoaderToken.prototype.removeEventListener = function (type, listener) { - this._iLoader.removeEventListener(type, listener); - }; - - AssetLoaderToken.prototype.hasEventListener = function (type, listener) { - if (typeof listener === "undefined") { listener = null; } - return this._iLoader.hasEventListener(type, listener); - }; - return AssetLoaderToken; - })(away.events.EventDispatcher); - library.AssetLoaderToken = AssetLoaderToken; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - var IDUtil = (function () { - function IDUtil() { - } - /** - * Generates a UID (unique identifier) based on ActionScript's - * pseudo-random number generator and the current time. - * - *

The UID has the form - * "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" - * where X is a hexadecimal digit (0-9, A-F).

- * - *

This UID will not be truly globally unique; but it is the best - * we can do without player support for UID generation.

- * - * @return The newly-generated UID. - * - * @langversion 3.0 - * @playerversion Flash 9 - * @playerversion AIR 1.1 - * @productversion Flex 3 - */ - IDUtil.createUID = function () { - var uid = new Array(36); - var index = 0; - - var i; - var j; - - for (i = 0; i < 8; i++) - uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; - - for (i = 0; i < 3; i++) { - uid[index++] = 45; // charCode for "-" - - for (j = 0; j < 4; j++) - uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; - } - - uid[index++] = 45; // charCode for "-" - - var time = new Date().getTime(); - - // Note: time is the number of milliseconds since 1970, - // which is currently more than one trillion. - // We use the low 8 hex digits of this number in the UID. - // Just in case the system clock has been reset to - // Jan 1-4, 1970 (in which case this number could have only - // 1-7 hex digits), we pad on the left with 7 zeros - // before taking the low digits. - var timeString = ("0000000" + time.toString(16).toUpperCase()).substr(-8); - - for (i = 0; i < 8; i++) - uid[index++] = timeString.charCodeAt(i); - - for (i = 0; i < 4; i++) - uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; - - return String.fromCharCode.apply(null, uid); - }; - IDUtil.ALPHA_CHAR_CODES = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70]; - return IDUtil; - })(); - library.IDUtil = IDUtil; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - //import away.library.assets.IAsset; - var AssetLibraryIterator = (function () { - function AssetLibraryIterator(assets, assetTypeFilter, namespaceFilter, filterFunc) { - this._assets = assets; - this.filter(assetTypeFilter, namespaceFilter, filterFunc); - } - Object.defineProperty(AssetLibraryIterator.prototype, "currentAsset", { - get: function () { - // Return current, or null if no current - return (this._idx < this._filtered.length) ? this._filtered[this._idx] : null; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(AssetLibraryIterator.prototype, "numAssets", { - get: function () { - return this._filtered.length; - }, - enumerable: true, - configurable: true - }); - - AssetLibraryIterator.prototype.next = function () { - var next = null; - - if (this._idx < this._filtered.length) - next = this._filtered[this._idx]; - - this._idx++; - - return next; - }; - - AssetLibraryIterator.prototype.reset = function () { - this._idx = 0; - }; - - AssetLibraryIterator.prototype.setIndex = function (index) { - this._idx = index; - }; - - AssetLibraryIterator.prototype.filter = function (assetTypeFilter, namespaceFilter, filterFunc) { - if (assetTypeFilter || namespaceFilter) { - var idx; - var asset; - - idx = 0; - this._filtered = new Array(); //new Vector.; - - var l = this._assets.length; - - for (var c = 0; c < l; c++) { - asset = this._assets[c]; - - // Skip this assets if filtering on type and this is wrong type - if (assetTypeFilter && asset.assetType != assetTypeFilter) - continue; - - // Skip this asset if filtering on namespace and this is wrong namespace - if (namespaceFilter && asset.assetNamespace != namespaceFilter) - continue; - - // Skip this asset if a filter func has been provided and it returns false - if (filterFunc != null && !filterFunc(asset)) - continue; - - this._filtered[idx++] = asset; - } - /* - for each (asset in _assets) { - // Skip this assets if filtering on type and this is wrong type - if (assetTypeFilter && asset.assetType != assetTypeFilter) - continue; - - // Skip this asset if filtering on namespace and this is wrong namespace - if (namespaceFilter && asset.assetNamespace != namespaceFilter) - continue; - - // Skip this asset if a filter func has been provided and it returns false - if (filterFunc != null && !filterFunc(asset)) - continue; - - _filtered[idx++] = asset; - } - */ - } else { - this._filtered = this._assets; - } - }; - return AssetLibraryIterator; - })(); - library.AssetLibraryIterator = AssetLibraryIterator; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - var AbstractMethodError = away.errors.AbstractMethodError; - - /** - * Abstract base class for naming conflict resolution classes. Extend this to create a - * strategy class which the asset library can use to resolve asset naming conflicts, or - * use one of the bundled concrete strategy classes: - * - *
    - *
  • IgnoreConflictStrategy (ConflictStrategy.IGNORE)
  • - *
  • ErrorConflictStrategy (ConflictStrategy.THROW_ERROR)
  • - *
  • NumSuffixConflictStrategy (ConflictStrategy.APPEND_NUM_SUFFIX)
  • - *
- * - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.ConflictStrategy - * @see away.library.IgnoreConflictStrategy - * @see away.library.ErrorConflictStrategy - * @see away.library.NumSuffixConflictStrategy - */ - var ConflictStrategyBase = (function () { - function ConflictStrategyBase() { - } - /** - * Resolve a naming conflict between two assets. Must be implemented by concrete strategy - * classes. - */ - ConflictStrategyBase.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { - throw new AbstractMethodError(); - }; - - /** - * Create instance of this conflict strategy. Used internally by the AssetLibrary to - * make sure the same strategy instance is not used in all AssetLibrary instances, which - * would break any state caching that happens inside the strategy class. - */ - ConflictStrategyBase.prototype.create = function () { - throw new AbstractMethodError(); - }; - - /** - * Provided as a convenience method for all conflict strategy classes, as a way to finalize - * the conflict resolution by applying the new names and dispatching the correct events. - */ - ConflictStrategyBase.prototype._pUpdateNames = function (ns, nonConflictingName, oldAsset, newAsset, assetsDictionary, precedence) { - var loser_prev_name; - var winner; - var loser; - - winner = (precedence === library.ConflictPrecedence.FAVOR_NEW) ? newAsset : oldAsset; - loser = (precedence === library.ConflictPrecedence.FAVOR_NEW) ? oldAsset : newAsset; - - loser_prev_name = loser.name; - - assetsDictionary[winner.name] = winner; - assetsDictionary[nonConflictingName] = loser; - loser.resetAssetPath(nonConflictingName, ns, false); - - loser.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED, loser, loser_prev_name)); - }; - return ConflictStrategyBase; - })(); - library.ConflictStrategyBase = ConflictStrategyBase; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - var NumSuffixConflictStrategy = (function (_super) { - __extends(NumSuffixConflictStrategy, _super); - function NumSuffixConflictStrategy(separator) { - if (typeof separator === "undefined") { separator = '.'; } - _super.call(this); - - this._separator = separator; - this._next_suffix = {}; - } - NumSuffixConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { - var orig; - var new_name; - var base; - var suffix; - - orig = changedAsset.name; - - if (orig.indexOf(this._separator) >= 0) { - // Name has an ocurrence of the separator, so get base name and suffix, - // unless suffix is non-numerical, in which case revert to zero and - // use entire name as base - base = orig.substring(0, orig.lastIndexOf(this._separator)); - suffix = parseInt(orig.substring(base.length - 1)); - - if (isNaN(suffix)) { - base = orig; - suffix = 0; - } - } else { - base = orig; - suffix = 0; - } - - if (suffix == 0 && this._next_suffix.hasOwnProperty(base)) { - suffix = this._next_suffix[base]; - } - - do { - suffix++; - - new_name = base.concat(this._separator, suffix.toString()); - } while(assetsDictionary.hasOwnProperty(new_name)); - - this._next_suffix[base] = suffix; - this._pUpdateNames(oldAsset.assetNamespace, new_name, oldAsset, changedAsset, assetsDictionary, precedence); - }; - - NumSuffixConflictStrategy.prototype.create = function () { - return new NumSuffixConflictStrategy(this._separator); - }; - return NumSuffixConflictStrategy; - })(library.ConflictStrategyBase); - library.NumSuffixConflictStrategy = NumSuffixConflictStrategy; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - var IgnoreConflictStrategy = (function (_super) { - __extends(IgnoreConflictStrategy, _super); - function IgnoreConflictStrategy() { - _super.call(this); - } - IgnoreConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { - // Do nothing, ignore the fact that there is a conflict. - return; - }; - - IgnoreConflictStrategy.prototype.create = function () { - return new IgnoreConflictStrategy(); - }; - return IgnoreConflictStrategy; - })(library.ConflictStrategyBase); - library.IgnoreConflictStrategy = IgnoreConflictStrategy; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - var ErrorConflictStrategy = (function (_super) { - __extends(ErrorConflictStrategy, _super); - function ErrorConflictStrategy() { - _super.call(this); - } - ErrorConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { - throw new away.errors.Error('Asset name collision while AssetLibrary.namingStrategy set to AssetLibrary.THROW_ERROR. Asset path: ' + changedAsset.assetFullPath); - }; - - ErrorConflictStrategy.prototype.create = function () { - return new ErrorConflictStrategy(); - }; - return ErrorConflictStrategy; - })(library.ConflictStrategyBase); - library.ErrorConflictStrategy = ErrorConflictStrategy; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -var away; -(function (away) { - (function (library) { - /** - * Enumaration class for precedence when resolving naming conflicts in the library. - * - * @see away.library.AssetLibrary.conflictPrecedence - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.naming.ConflictStrategy - */ - var ConflictPrecedence = (function () { - function ConflictPrecedence() { - } - ConflictPrecedence.FAVOR_OLD = 'favorOld'; - - ConflictPrecedence.FAVOR_NEW = 'favorNew'; - return ConflictPrecedence; - })(); - library.ConflictPrecedence = ConflictPrecedence; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - /** - * Enumeration class for bundled conflict strategies. Set one of these values (or an - * instance of a self-defined sub-class of ConflictStrategyBase) to the conflictStrategy - * property on an AssetLibrary to define how that library resolves naming conflicts. - * - * The value of the AssetLibrary.conflictPrecedence property defines which - * of the conflicting assets will get to keep it's name, and which is renamed (if any.) - * - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.naming.ConflictStrategyBase - */ - var ConflictStrategy = (function () { - function ConflictStrategy() { - } - ConflictStrategy.APPEND_NUM_SUFFIX = new library.NumSuffixConflictStrategy(); - - ConflictStrategy.IGNORE = new library.IgnoreConflictStrategy(); - - ConflictStrategy.THROW_ERROR = new library.ErrorConflictStrategy(); - return ConflictStrategy; - })(); - library.ConflictStrategy = ConflictStrategy; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (library) { - /** - * AssetLibraryBundle enforces a multiton pattern and is not intended to be instanced directly. - * Its purpose is to create a container for 3D data management, both before and after parsing. - * If you are interested in creating multiple library bundles, please use the getInstance() method. - */ - var AssetLibraryBundle = (function (_super) { - __extends(AssetLibraryBundle, _super); - /** - * Creates a new AssetLibraryBundle object. - * - * @param me A multiton enforcer for the AssetLibraryBundle ensuring it cannnot be instanced. - */ - function AssetLibraryBundle(me) { - _super.call(this); - this._loadingSessionsGarbage = new Array(); - - this._assets = new Array(); //new Vector.; - this._assetDictionary = new Object(); - this._loadingSessions = new Array(); - - this.conflictStrategy = library.ConflictStrategy.IGNORE.create(); - this.conflictPrecedence = library.ConflictPrecedence.FAVOR_NEW; - - this._onAssetRenameDelegate = away.utils.Delegate.create(this, this.onAssetRename); - this._onAssetConflictResolvedDelegate = away.utils.Delegate.create(this, this.onAssetConflictResolved); - this._onResourceCompleteDelegate = away.utils.Delegate.create(this, this.onResourceComplete); - this._onTextureSizeErrorDelegate = away.utils.Delegate.create(this, this.onTextureSizeError); - this._onAssetCompleteDelegate = away.utils.Delegate.create(this, this.onAssetComplete); - this._onLoadErrorDelegate = away.utils.Delegate.create(this, this.onLoadError); - this._onParseErrorDelegate = away.utils.Delegate.create(this, this.onParseError); - } - /** - * Returns an AssetLibraryBundle instance. If no key is given, returns the default bundle instance (which is - * similar to using the AssetLibraryBundle as a singleton.) To keep several separated library bundles, - * pass a string key to this method to define which bundle should be returned. This is - * referred to as using the AssetLibrary as a multiton. - * - * @param key Defines which multiton instance should be returned. - * @return An instance of the asset library - */ - AssetLibraryBundle.getInstance = function (key) { - if (typeof key === "undefined") { key = 'default'; } - if (!key) - key = 'default'; - - if (!library.AssetLibrary._iInstances.hasOwnProperty(key)) - library.AssetLibrary._iInstances[key] = new AssetLibraryBundle(new AssetLibraryBundleSingletonEnforcer()); - - return library.AssetLibrary._iInstances[key]; - }; - - /** - * - */ - AssetLibraryBundle.prototype.enableParser = function (parserClass) { - library.AssetLoader.enableParser(parserClass); - }; - - /** - * - */ - AssetLibraryBundle.prototype.enableParsers = function (parserClasses) { - library.AssetLoader.enableParsers(parserClasses); - }; - - Object.defineProperty(AssetLibraryBundle.prototype, "conflictStrategy", { - /** - * Defines which strategy should be used for resolving naming conflicts, when two library - * assets are given the same name. By default, ConflictStrategy.APPEND_NUM_SUFFIX - * is used which means that a numeric suffix is appended to one of the assets. The - * conflictPrecedence property defines which of the two conflicting assets will - * be renamed. - * - * @see naming.ConflictStrategy - * @see AssetLibrary.conflictPrecedence - */ - get: function () { - return this._strategy; - }, - set: function (val) { - if (!val) - throw new away.errors.Error('namingStrategy must not be null. To ignore naming, use AssetLibrary.IGNORE'); - - this._strategy = val.create(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(AssetLibraryBundle.prototype, "conflictPrecedence", { - /** - * Defines which asset should have precedence when resolving a naming conflict between - * two assets of which one has just been renamed by the user or by a parser. By default - * ConflictPrecedence.FAVOR_NEW is used, meaning that the newly renamed - * asset will keep it's new name while the older asset gets renamed to not conflict. - * - * This property is ignored for conflict strategies that do not actually rename an - * asset automatically, such as ConflictStrategy.IGNORE and ConflictStrategy.THROW_ERROR. - * - * @see away.library.ConflictPrecedence - * @see away.library.ConflictStrategy - */ - get: function () { - return this._strategyPreference; - }, - set: function (val) { - this._strategyPreference = val; - }, - enumerable: true, - configurable: true - }); - - - /** - * Create an AssetLibraryIterator instance that can be used to iterate over the assets - * in this asset library instance. The iterator can filter assets on asset type and/or - * namespace. A "null" filter value means no filter of that type is used. - * - * @param assetTypeFilter Asset type to filter on (from the AssetType enum class.) Use - * null to not filter on asset type. - * @param namespaceFilter Namespace to filter on. Use null to not filter on namespace. - * @param filterFunc Callback function to use when deciding whether an asset should be - * included in the iteration or not. This needs to be a function that takes a single - * parameter of type IAsset and returns a boolean where true means it should be included. - * - * @see away.library.AssetType - */ - AssetLibraryBundle.prototype.createIterator = function (assetTypeFilter, namespaceFilter, filterFunc) { - if (typeof assetTypeFilter === "undefined") { assetTypeFilter = null; } - if (typeof namespaceFilter === "undefined") { namespaceFilter = null; } - if (typeof filterFunc === "undefined") { filterFunc = null; } - return new library.AssetLibraryIterator(this._assets, assetTypeFilter, namespaceFilter, filterFunc); - }; - - /** - * Loads a file and (optionally) all of its dependencies. - * - * @param req The URLRequest object containing the URL of the file to be loaded. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - * @return A handle to the retrieved resource. - */ - AssetLibraryBundle.prototype.load = function (req, context, ns, parser) { - if (typeof context === "undefined") { context = null; } - if (typeof ns === "undefined") { ns = null; } - if (typeof parser === "undefined") { parser = null; } - var loader = new library.AssetLoader(); - - if (!this._loadingSessions) - this._loadingSessions = new Array(); - - this._loadingSessions.push(loader); - - loader.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - loader.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - loader.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - // Error are handled separately (see documentation for addErrorHandler) - loader._iAddErrorHandler(this._onLoadErrorDelegate); - loader._iAddParseErrorHandler(this._onParseErrorDelegate); - - return loader.load(req, context, ns, parser); - }; - - /** - * Loads a resource from existing data in memory. - * - * @param data The data object containing all resource information. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - * @return A handle to the retrieved resource. - */ - AssetLibraryBundle.prototype.loadData = function (data, context, ns, parser) { - if (typeof context === "undefined") { context = null; } - if (typeof ns === "undefined") { ns = null; } - if (typeof parser === "undefined") { parser = null; } - var loader = new library.AssetLoader(); - - if (!this._loadingSessions) - this._loadingSessions = new Array(); - - this._loadingSessions.push(loader); - - loader.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - loader.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - loader.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - // Error are handled separately (see documentation for addErrorHandler) - loader._iAddErrorHandler(this._onLoadErrorDelegate); - loader._iAddParseErrorHandler(this._onParseErrorDelegate); - - return loader.loadData(data, '', context, ns, parser); - }; - - /** - * - */ - AssetLibraryBundle.prototype.getAsset = function (name, ns) { - //var asset : IAsset; - if (typeof ns === "undefined") { ns = null; } - if (this._assetDictDirty) - this.rehashAssetDict(); - - if (ns == null) - ns = library.NamedAssetBase.DEFAULT_NAMESPACE; - - if (!this._assetDictionary.hasOwnProperty(ns)) - return null; - - return this._assetDictionary[ns][name]; - }; - - /** - * Adds an asset to the asset library, first making sure that it's name is unique - * using the method defined by the conflictStrategy and - * conflictPrecedence properties. - */ - AssetLibraryBundle.prototype.addAsset = function (asset) { - var ns; - var old; - - // Bail if asset has already been added. - if (this._assets.indexOf(asset) >= 0) - return; - - old = this.getAsset(asset.name, asset.assetNamespace); - ns = asset.assetNamespace || library.NamedAssetBase.DEFAULT_NAMESPACE; - - if (old != null) - this._strategy.resolveConflict(asset, old, this._assetDictionary[ns], this._strategyPreference); - - //create unique-id (for now this is used in AwayBuilder only - //asset.id = IDUtil.createUID(); - // Add it - this._assets.push(asset); - - if (!this._assetDictionary.hasOwnProperty(ns)) - this._assetDictionary[ns] = new Object(); - - this._assetDictionary[ns][asset.name] = asset; - - asset.addEventListener(away.events.AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); - asset.addEventListener(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); - }; - - /** - * Removes an asset from the library, and optionally disposes that asset by calling - * it's disposeAsset() method (which for most assets is implemented as a default - * version of that type's dispose() method. - * - * @param asset The asset which should be removed from this library. - * @param dispose Defines whether the assets should also be disposed. - */ - AssetLibraryBundle.prototype.removeAsset = function (asset, dispose) { - if (typeof dispose === "undefined") { dispose = true; } - var idx; - - this.removeAssetFromDict(asset); - - asset.removeEventListener(away.events.AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); - asset.removeEventListener(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); - - idx = this._assets.indexOf(asset); - - if (idx >= 0) - this._assets.splice(idx, 1); - - if (dispose) - asset.dispose(); - }; - - /** - * Removes an asset which is specified using name and namespace. - * - * @param name The name of the asset to be removed. - * @param ns The namespace to which the desired asset belongs. - * @param dispose Defines whether the assets should also be disposed. - * - * @see away.library.AssetLibrary.removeAsset() - */ - AssetLibraryBundle.prototype.removeAssetByName = function (name, ns, dispose) { - if (typeof ns === "undefined") { ns = null; } - if (typeof dispose === "undefined") { dispose = true; } - var asset = this.getAsset(name, ns); - - if (asset) - this.removeAsset(asset, dispose); - - return asset; - }; - - /** - * Removes all assets from the asset library, optionally disposing them as they - * are removed. - * - * @param dispose Defines whether the assets should also be disposed. - */ - AssetLibraryBundle.prototype.removeAllAssets = function (dispose) { - if (typeof dispose === "undefined") { dispose = true; } - if (dispose) { - var asset; - - for (var c = 0; c < this._assets.length; c++) { - asset = this._assets[c]; - asset.dispose(); - } - /* - for each (asset in _assets) - asset.dispose(); - */ - } - - this._assets.length = 0; - this.rehashAssetDict(); - }; - - /** - * Removes all assets belonging to a particular namespace (null for default) - * from the asset library, and optionall disposes them by calling their - * disposeAsset() method. - * - * @param ns The namespace from which all assets should be removed. - * @param dispose Defines whether the assets should also be disposed. - * - * @see away.library.AssetLibrary.removeAsset() - */ - AssetLibraryBundle.prototype.removeNamespaceAssets = function (ns, dispose) { - if (typeof ns === "undefined") { ns = null; } - if (typeof dispose === "undefined") { dispose = true; } - var idx = 0; - var asset; - var old_assets; - - // Empty the assets vector after having stored a copy of it. - // The copy will be filled with all assets which weren't removed. - old_assets = this._assets.concat(); - this._assets.length = 0; - - if (ns == null) - ns = library.NamedAssetBase.DEFAULT_NAMESPACE; - - for (var d = 0; d < old_assets.length; d++) { - asset = old_assets[d]; - - // Remove from dict if in the supplied namespace. If not, - // transfer over to the new vector. - if (asset.assetNamespace == ns) { - if (dispose) - asset.dispose(); - - // Remove asset from dictionary, but don't try to auto-remove - // the namespace, which will trigger an unnecessarily expensive - // test that is not needed since we know that the namespace - // will be empty when loop finishes. - this.removeAssetFromDict(asset, false); - } else { - this._assets[idx++] = asset; - } - } - - /* - for each (asset in old_assets) { - // Remove from dict if in the supplied namespace. If not, - // transfer over to the new vector. - if (asset.assetNamespace == ns) { - if (dispose) - asset.dispose(); - - // Remove asset from dictionary, but don't try to auto-remove - // the namespace, which will trigger an unnecessarily expensive - // test that is not needed since we know that the namespace - // will be empty when loop finishes. - removeAssetFromDict(asset, false); - } else - _assets[idx++] = asset; - - } - */ - // Remove empty namespace - if (this._assetDictionary.hasOwnProperty(ns)) - delete this._assetDictionary[ns]; - }; - - AssetLibraryBundle.prototype.removeAssetFromDict = function (asset, autoRemoveEmptyNamespace) { - if (typeof autoRemoveEmptyNamespace === "undefined") { autoRemoveEmptyNamespace = true; } - if (this._assetDictDirty) - this.rehashAssetDict(); - - if (this._assetDictionary.hasOwnProperty(asset.assetNamespace)) { - if (this._assetDictionary[asset.assetNamespace].hasOwnProperty(asset.name)) - delete this._assetDictionary[asset.assetNamespace][asset.name]; - - if (autoRemoveEmptyNamespace) { - var key; - var empty = true; - - for (key in this._assetDictionary[asset.assetNamespace]) { - empty = false; - break; - } - - if (empty) - delete this._assetDictionary[asset.assetNamespace]; - } - } - }; - - AssetLibraryBundle.prototype.stopAllLoadingSessions = function () { - var i; - - if (!this._loadingSessions) - this._loadingSessions = new Array(); - - var length = this._loadingSessions.length; - - for (i = 0; i < length; i++) - this.killLoadingSession(this._loadingSessions[i]); - - this._loadingSessions = null; - }; - - AssetLibraryBundle.prototype.rehashAssetDict = function () { - var asset; - - this._assetDictionary = {}; - - var l = this._assets.length; - - for (var c = 0; c < l; c++) { - asset = this._assets[c]; - - if (!this._assetDictionary.hasOwnProperty(asset.assetNamespace)) - this._assetDictionary[asset.assetNamespace] = {}; - - this._assetDictionary[asset.assetNamespace][asset.name] = asset; - } - - this._assetDictDirty = false; - }; - - /** - * Called when a an error occurs during loading. - */ - AssetLibraryBundle.prototype.onLoadError = function (event) { - if (this.hasEventListener(away.events.IOErrorEvent.IO_ERROR)) { - this.dispatchEvent(event); - return true; - } else { - return false; - } - }; - - /** - * Called when a an error occurs during parsing. - */ - AssetLibraryBundle.prototype.onParseError = function (event) { - if (this.hasEventListener(away.events.ParserEvent.PARSE_ERROR)) { - this.dispatchEvent(event); - return true; - } else { - return false; - } - }; - - AssetLibraryBundle.prototype.onAssetComplete = function (event) { - // Only add asset to library the first time. - if (event.type == away.events.AssetEvent.ASSET_COMPLETE) - this.addAsset(event.asset); - - this.dispatchEvent(event); - }; - - AssetLibraryBundle.prototype.onTextureSizeError = function (event) { - this.dispatchEvent(event); - }; - - /** - * Called when the resource and all of its dependencies was retrieved. - */ - AssetLibraryBundle.prototype.onResourceComplete = function (event) { - var _this = this; - var loader = event.target; - - this.dispatchEvent(event); - - var index = this._loadingSessions.indexOf(loader); - this._loadingSessions.splice(index, 1); - - // Add loader to a garbage array - for a collection sweep and kill - this._loadingSessionsGarbage.push(loader); - this._gcTimeoutIID = setTimeout(function () { - _this.loadingSessionGC(); - }, 100); - }; - - AssetLibraryBundle.prototype.loadingSessionGC = function () { - var loader; - - while (this._loadingSessionsGarbage.length > 0) { - loader = this._loadingSessionsGarbage.pop(); - this.killLoadingSession(loader); - } - - clearTimeout(this._gcTimeoutIID); - this._gcTimeoutIID = null; - }; - - AssetLibraryBundle.prototype.killLoadingSession = function (loader) { - loader.removeEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - loader.removeEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - loader.removeEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - loader.stop(); - }; - - /** - * Called when unespected error occurs - */ - /* - private onResourceError() : void - { - var msg:string = "Unexpected parser error"; - if(hasEventListener(LoaderEvent.DEPENDENCY_ERROR)){ - var re:LoaderEvent = new LoaderEvent(LoaderEvent.DEPENDENCY_ERROR, ""); - dispatchEvent(re); - } else{ - throw new Error(msg); - } - } - */ - AssetLibraryBundle.prototype.onAssetRename = function (ev) { - var asset = ev.target; - var old = this.getAsset(asset.assetNamespace, asset.name); - - if (old != null) { - this._strategy.resolveConflict(asset, old, this._assetDictionary[asset.assetNamespace], this._strategyPreference); - } else { - var dict = this._assetDictionary[ev.asset.assetNamespace]; - - if (dict == null) - return; - - dict[ev.assetPrevName] = null; - dict[ev.asset.name] = ev.asset; - } - }; - - AssetLibraryBundle.prototype.onAssetConflictResolved = function (ev) { - this.dispatchEvent(ev.clone()); - }; - return AssetLibraryBundle; - })(away.events.EventDispatcher); - library.AssetLibraryBundle = AssetLibraryBundle; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); - -// singleton enforcer -var AssetLibraryBundleSingletonEnforcer = (function () { - function AssetLibraryBundleSingletonEnforcer() { - } - return AssetLibraryBundleSingletonEnforcer; -})(); -/// -var away; -(function (away) { - (function (library) { - /** - * AssetLibrary enforces a singleton pattern and is not intended to be instanced. - * It's purpose is to allow access to the default library bundle through a set of static shortcut methods. - * If you are interested in creating multiple library bundles, please use the getBundle() method. - */ - var AssetLibrary = (function () { - /** - * Creates a new AssetLibrary object. - * - * @param se A singleton enforcer for the AssetLibrary ensuring it cannnot be instanced. - */ - //* - function AssetLibrary(se) { - se = se; - } - //*/ - /** - * Returns an AssetLibrary bundle instance. If no key is given, returns the default bundle (which is - * similar to using the AssetLibraryBundle as a singleton). To keep several separated library bundles, - * pass a string key to this method to define which bundle should be returned. This is - * referred to as using the AssetLibraryBundle as a multiton. - * - * @param key Defines which multiton instance should be returned. - * @return An instance of the asset library - */ - AssetLibrary.getBundle = function (key) { - if (typeof key === "undefined") { key = 'default'; } - return library.AssetLibraryBundle.getInstance(key); - }; - - /** - * - */ - AssetLibrary.enableParser = function (parserClass) { - library.AssetLoader.enableParser(parserClass); - }; - - /** - * - */ - AssetLibrary.enableParsers = function (parserClasses) { - library.AssetLoader.enableParsers(parserClasses); - }; - - Object.defineProperty(AssetLibrary, "conflictStrategy", { - /** - * Short-hand for conflictStrategy property on default asset library bundle. - * - * @see AssetLibraryBundle.conflictStrategy - */ - get: function () { - return AssetLibrary.getBundle().conflictStrategy; - }, - set: function (val) { - AssetLibrary.getBundle().conflictStrategy = val; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(AssetLibrary, "conflictPrecedence", { - /** - * Short-hand for conflictPrecedence property on default asset library bundle. - * - * @see AssetLibraryBundle.conflictPrecedence - */ - get: function () { - return AssetLibrary.getBundle().conflictPrecedence; - }, - set: function (val) { - AssetLibrary.getBundle().conflictPrecedence = val; - }, - enumerable: true, - configurable: true - }); - - - /** - * Short-hand for createIterator() method on default asset library bundle. - * - * @see AssetLibraryBundle.createIterator() - */ - AssetLibrary.createIterator = function (assetTypeFilter, namespaceFilter, filterFunc) { - if (typeof assetTypeFilter === "undefined") { assetTypeFilter = null; } - if (typeof namespaceFilter === "undefined") { namespaceFilter = null; } - if (typeof filterFunc === "undefined") { filterFunc = null; } - return AssetLibrary.getBundle().createIterator(assetTypeFilter, namespaceFilter, filterFunc); - }; - - /** - * Short-hand for load() method on default asset library bundle. - * - * @see AssetLibraryBundle.load() - */ - AssetLibrary.load = function (req, context, ns, parser) { - if (typeof context === "undefined") { context = null; } - if (typeof ns === "undefined") { ns = null; } - if (typeof parser === "undefined") { parser = null; } - return AssetLibrary.getBundle().load(req, context, ns, parser); - }; - - /** - * Short-hand for loadData() method on default asset library bundle. - * - * @see AssetLibraryBundle.loadData() - */ - AssetLibrary.loadData = function (data, context, ns, parser) { - if (typeof context === "undefined") { context = null; } - if (typeof ns === "undefined") { ns = null; } - if (typeof parser === "undefined") { parser = null; } - return AssetLibrary.getBundle().loadData(data, context, ns, parser); - }; - - AssetLibrary.stopLoad = function () { - AssetLibrary.getBundle().stopAllLoadingSessions(); - }; - - /** - * Short-hand for getAsset() method on default asset library bundle. - * - * @see AssetLibraryBundle.getAsset() - */ - AssetLibrary.getAsset = function (name, ns) { - if (typeof ns === "undefined") { ns = null; } - return AssetLibrary.getBundle().getAsset(name, ns); - }; - - /** - * Short-hand for addEventListener() method on default asset library bundle. - */ - AssetLibrary.addEventListener = function (type, listener) { - AssetLibrary.getBundle().addEventListener(type, listener); - }; - - /** - * Short-hand for removeEventListener() method on default asset library bundle. - */ - AssetLibrary.removeEventListener = function (type, listener) { - AssetLibrary.getBundle().removeEventListener(type, listener); - }; - - /** - * Short-hand for hasEventListener() method on default asset library bundle. - - public static hasEventListener(type:string):boolean - { - return AssetLibrary.getBundle().hasEventListener(type); - } - - public static willTrigger(type:string):boolean - { - return getBundle().willTrigger(type); - } - */ - /** - * Short-hand for addAsset() method on default asset library bundle. - * - * @see AssetLibraryBundle.addAsset() - */ - AssetLibrary.addAsset = function (asset) { - AssetLibrary.getBundle().addAsset(asset); - }; - - /** - * Short-hand for removeAsset() method on default asset library bundle. - * - * @param asset The asset which should be removed from the library. - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAsset() - */ - AssetLibrary.removeAsset = function (asset, dispose) { - if (typeof dispose === "undefined") { dispose = true; } - AssetLibrary.getBundle().removeAsset(asset, dispose); - }; - - /** - * Short-hand for removeAssetByName() method on default asset library bundle. - * - * @param name The name of the asset to be removed. - * @param ns The namespace to which the desired asset belongs. - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAssetByName() - */ - AssetLibrary.removeAssetByName = function (name, ns, dispose) { - if (typeof ns === "undefined") { ns = null; } - if (typeof dispose === "undefined") { dispose = true; } - return AssetLibrary.getBundle().removeAssetByName(name, ns, dispose); - }; - - /** - * Short-hand for removeAllAssets() method on default asset library bundle. - * - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAllAssets() - */ - AssetLibrary.removeAllAssets = function (dispose) { - if (typeof dispose === "undefined") { dispose = true; } - AssetLibrary.getBundle().removeAllAssets(dispose); - }; - - /** - * Short-hand for removeNamespaceAssets() method on default asset library bundle. - * - * @see AssetLibraryBundle.removeNamespaceAssets() - */ - AssetLibrary.removeNamespaceAssets = function (ns, dispose) { - if (typeof ns === "undefined") { ns = null; } - if (typeof dispose === "undefined") { dispose = true; } - AssetLibrary.getBundle().removeNamespaceAssets(ns, dispose); - }; - AssetLibrary._iInstances = {}; - return AssetLibrary; - })(); - library.AssetLibrary = AssetLibrary; - })(away.library || (away.library = {})); - var library = away.library; -})(away || (away = {})); - -// singleton enforcer -var AssetLibrarySingletonEnforcer = (function () { - function AssetLibrarySingletonEnforcer() { - } - return AssetLibrarySingletonEnforcer; -})(); -/// -var away; -(function (away) { - /** - * @module away.pool - */ - (function (pool) { - /** - * @class away.pool.EntityListItem - */ - var EntityListItem = (function () { - function EntityListItem() { - } - return EntityListItem; - })(); - pool.EntityListItem = EntityListItem; - })(away.pool || (away.pool = {})); - var pool = away.pool; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.pool - */ - (function (pool) { - /** - * @class away.pool.EntityListItemPool - */ - var EntityListItemPool = (function () { - /** - * - */ - function EntityListItemPool() { - this._index = 0; - this._poolSize = 0; - this._pool = []; - } - /** - * - */ - EntityListItemPool.prototype.getItem = function () { - var item; - if (this._index == this._poolSize) { - item = new pool.EntityListItem(); - this._pool[this._index++] = item; - ++this._poolSize; - } else { - item = this._pool[this._index++]; - } - return item; - }; - - /** - * - */ - EntityListItemPool.prototype.freeAll = function () { - this._index = 0; - }; - - EntityListItemPool.prototype.dispose = function () { - this._pool.length = 0; - }; - return EntityListItemPool; - })(); - pool.EntityListItemPool = EntityListItemPool; - })(away.pool || (away.pool = {})); - var pool = away.pool; -})(away || (away = {})); -/// -/// -/// -/// -var away; -(function (away) { - /** - * @module away.pool - */ - (function (pool) { - - })(away.pool || (away.pool = {})); - var pool = away.pool; -})(away || (away = {})); -/// -/// -var away; -(function (away) { - /** - * @module away.pool - */ - (function (_pool) { - /** - * @class away.pool.RenderablePool - */ - var RenderablePool = (function () { - /** - * //TODO - * - * @param renderableClass - */ - function RenderablePool(renderableClass) { - this._pool = new Object(); - this._renderableClass = renderableClass; - } - /** - * //TODO - * - * @param materialOwner - * @returns IRenderable - */ - RenderablePool.prototype.getItem = function (materialOwner) { - return (this._pool[materialOwner.id] || (this._pool[materialOwner.id] = materialOwner._iAddRenderable(new this._renderableClass(this, materialOwner)))); - }; - - /** - * //TODO - * - * @param materialOwner - */ - RenderablePool.prototype.disposeItem = function (materialOwner) { - materialOwner._iRemoveRenderable(this._pool[materialOwner.id]); - - this._pool[materialOwner.id] = null; - }; - - /** - * //TODO - * - * @param renderableClass - * @returns RenderablePool - */ - RenderablePool.getPool = function (renderableClass) { - var pool = RenderablePool._pools[renderableClass.id]; - - if (pool != undefined) - return pool; - - return (RenderablePool._pools[renderableClass.id] = new RenderablePool(renderableClass)); - }; - - /** - * //TODO - * - * @param renderableClass - */ - RenderablePool.disposePool = function (renderableClass) { - if (RenderablePool._pools[renderableClass.id]) - RenderablePool._pools[renderableClass.id] = undefined; - }; - RenderablePool._pools = new Object(); - return RenderablePool; - })(); - _pool.RenderablePool = RenderablePool; - })(away.pool || (away.pool = {})); - var pool = away.pool; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.data - */ - (function (_pool) { - /** - * @class away.pool.RenderableListItem - */ - var CSSRenderableBase = (function () { - /** - * - * @param sourceEntity - * @param material - * @param animator - */ - function CSSRenderableBase(pool, sourceEntity, materialOwner) { - //store a reference to the pool for later disposal - this._pool = pool; - - this.sourceEntity = sourceEntity; - this.materialOwner = materialOwner; - } - /** - * - */ - CSSRenderableBase.prototype.dispose = function () { - this._pool.disposeItem(this.materialOwner); - }; - - /** - * - */ - CSSRenderableBase.prototype.invalidateGeometry = function () { - }; - - /** - * - */ - CSSRenderableBase.prototype.invalidateIndexData = function () { - }; - - /** - * - */ - CSSRenderableBase.prototype.invalidateVertexData = function (dataType) { - }; - return CSSRenderableBase; - })(); - _pool.CSSRenderableBase = CSSRenderableBase; - })(away.pool || (away.pool = {})); - var pool = away.pool; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.data - */ - (function (_pool) { - /** - * @class away.pool.RenderableListItem - */ - var CSSBillboardRenderable = (function (_super) { - __extends(CSSBillboardRenderable, _super); - function CSSBillboardRenderable(pool, billboard) { - _super.call(this, pool, billboard, billboard); - - var div = document.createElement("div"); - div.onmousedown = function (event) { - return false; - }; - - this.htmlElement = div; - - var style = div.style; - - style.position = "absolute"; - style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; - - var img = document.createElement("div"); - - div.appendChild(img); - - img.className = "material" + billboard.material.id; - } - CSSBillboardRenderable.id = "billboard"; - return CSSBillboardRenderable; - })(_pool.CSSRenderableBase); - _pool.CSSBillboardRenderable = CSSBillboardRenderable; - })(away.pool || (away.pool = {})); - var pool = away.pool; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.data - */ - (function (_pool) { - /** - * @class away.pool.RenderableListItem - */ - var CSSLineSegmentRenderable = (function (_super) { - __extends(CSSLineSegmentRenderable, _super); - function CSSLineSegmentRenderable(pool, lineSegment) { - _super.call(this, pool, lineSegment, lineSegment); - - var div = document.createElement("div"); - div.onmousedown = function (event) { - return false; - }; - - this.htmlElement = div; - - var style = div.style; - - style.position = "absolute"; - style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; - - var img = document.createElement("div"); - - div.appendChild(img); - - img.className = "material" + lineSegment.material.id; - } - CSSLineSegmentRenderable.id = "lineSegment"; - return CSSLineSegmentRenderable; - })(_pool.CSSRenderableBase); - _pool.CSSLineSegmentRenderable = CSSLineSegmentRenderable; - })(away.pool || (away.pool = {})); - var pool = away.pool; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.data - */ - (function (_pool) { - /** - * @class away.pool.CSSSkyboxRenderable - */ - var CSSSkyboxRenderable = (function (_super) { - __extends(CSSSkyboxRenderable, _super); - function CSSSkyboxRenderable(pool, skyBox) { - _super.call(this, pool, skyBox, skyBox); - - var div = document.createElement("div"); - div.onmousedown = function (event) { - return false; - }; - - this.htmlElement = div; - - var style = div.style; - var img; - - //create the six images that make up the skybox - style.position = "absolute"; - style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; - - img = document.createElement("div"); - - div.appendChild(img); - - img.className = "material" + skyBox.material.id; - } - CSSSkyboxRenderable.id = "skybox"; - return CSSSkyboxRenderable; - })(_pool.CSSRenderableBase); - _pool.CSSSkyboxRenderable = CSSSkyboxRenderable; - })(away.pool || (away.pool = {})); - var pool = away.pool; -})(away || (away = {})); -/// -/// -var away; -(function (away) { - /** - * @module away.traverse - */ - (function (traverse) { - var EntityListItemPool = away.pool.EntityListItemPool; - - /** - * @class away.traverse.CollectorBase - */ - var CollectorBase = (function () { - function CollectorBase() { - this._numCullPlanes = 0; - this._pNumEntities = 0; - this._pNumInteractiveEntities = 0; - this._pEntityListItemPool = new EntityListItemPool(); - } - Object.defineProperty(CollectorBase.prototype, "camera", { - /** - * - */ - get: function () { - return this._pCamera; - }, - set: function (value) { - this._pCamera = value; - this._cullPlanes = this._pCamera.frustumPlanes; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CollectorBase.prototype, "cullPlanes", { - /** - * - */ - get: function () { - return this._customCullPlanes; - }, - set: function (value) { - this._customCullPlanes = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CollectorBase.prototype, "entityHead", { - /** - * - */ - get: function () { - return this._pEntityHead; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(CollectorBase.prototype, "numEntities", { - /** - * - */ - get: function () { - return this._pNumEntities; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(CollectorBase.prototype, "numInteractiveEntities", { - /** - * - */ - get: function () { - return this._pNumInteractiveEntities; - }, - enumerable: true, - configurable: true - }); - - /** - * - */ - CollectorBase.prototype.clear = function () { - this._pNumEntities = this._pNumInteractiveEntities = 0; - this._cullPlanes = this._customCullPlanes ? this._customCullPlanes : (this._pCamera ? this._pCamera.frustumPlanes : null); - this._numCullPlanes = this._cullPlanes ? this._cullPlanes.length : 0; - this._pEntityHead = null; - this._pEntityListItemPool.freeAll(); - }; - - /** - * - * @param node - * @returns {boolean} - */ - CollectorBase.prototype.enterNode = function (node) { - var enter = this.scene._iCollectionMark != node._iCollectionMark && node.isInFrustum(this._cullPlanes, this._numCullPlanes); - - node._iCollectionMark = this.scene._iCollectionMark; - - return enter; - }; - - /** - * - * @param entity - */ - CollectorBase.prototype.applyDirectionalLight = function (entity) { - //don't do anything here - }; - - /** - * - * @param entity - */ - CollectorBase.prototype.applyEntity = function (entity) { - this._pNumEntities++; - - if (entity._iIsMouseEnabled()) - this._pNumInteractiveEntities++; - - var item = this._pEntityListItemPool.getItem(); - item.entity = entity; - - item.next = this._pEntityHead; - this._pEntityHead = item; - }; - - /** - * - * @param entity - */ - CollectorBase.prototype.applyLightProbe = function (entity) { - //don't do anything here - }; - - /** - * - * @param entity - */ - CollectorBase.prototype.applyPointLight = function (entity) { - //don't do anything here - }; - - /** - * - * @param entity - */ - CollectorBase.prototype.applySkybox = function (entity) { - //don't do anything here - }; - return CollectorBase; - })(); - traverse.CollectorBase = CollectorBase; - })(away.traverse || (away.traverse = {})); - var traverse = away.traverse; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.traverse - */ - (function (traverse) { - /** - * @class away.traverse.EntityCollector - */ - var EntityCollector = (function (_super) { - __extends(EntityCollector, _super); - function EntityCollector() { - _super.call(this); - this._pNumLights = 0; - this._numDirectionalLights = 0; - this._numPointLights = 0; - this._numLightProbes = 0; - - this._pLights = new Array(); - this._directionalLights = new Array(); - this._pointLights = new Array(); - this._lightProbes = new Array(); - } - Object.defineProperty(EntityCollector.prototype, "directionalLights", { - /** - * - */ - get: function () { - return this._directionalLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(EntityCollector.prototype, "lightProbes", { - /** - * - */ - get: function () { - return this._lightProbes; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(EntityCollector.prototype, "lights", { - /** - * - */ - get: function () { - return this._pLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(EntityCollector.prototype, "pointLights", { - /** - * - */ - get: function () { - return this._pointLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(EntityCollector.prototype, "skyBox", { - /** - * - */ - get: function () { - return this._pSkybox; - }, - enumerable: true, - configurable: true - }); - - /** - * - * @param entity - */ - EntityCollector.prototype.applyDirectionalLight = function (entity) { - this._directionalLights[this._numDirectionalLights++] = entity; - }; - - /** - * - * @param entity - */ - EntityCollector.prototype.applyLightProbe = function (entity) { - this._lightProbes[this._numLightProbes++] = entity; - }; - - /** - * - * @param entity - */ - EntityCollector.prototype.applyPointLight = function (entity) { - this._pointLights[this._numPointLights++] = entity; - }; - - /** - * - * @param entity - */ - EntityCollector.prototype.applySkybox = function (entity) { - this._pSkybox = entity; - }; - - /** - * - */ - EntityCollector.prototype.clear = function () { - _super.prototype.clear.call(this); - - this._pSkybox = null; - - if (this._pNumLights > 0) - this._pLights.length = this._pNumLights = 0; - - if (this._numDirectionalLights > 0) - this._directionalLights.length = this._numDirectionalLights = 0; - - if (this._numPointLights > 0) - this._pointLights.length = this._numPointLights = 0; - - if (this._numLightProbes > 0) - this._lightProbes.length = this._numLightProbes = 0; - }; - return EntityCollector; - })(traverse.CollectorBase); - traverse.EntityCollector = EntityCollector; - })(away.traverse || (away.traverse = {})); - var traverse = away.traverse; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.traverse - */ - (function (traverse) { - var Vector3D = away.geom.Vector3D; - - /** - * The RaycastCollector class is a traverser for scene partitions that collects all scene graph entities that are - * considered intersecting with the defined ray. - * - * @see away.partition.Partition - * @see away.entities.IEntity - * - * @class away.traverse.RaycastCollector - */ - var RaycastCollector = (function (_super) { - __extends(RaycastCollector, _super); - /** - * Creates a new RaycastCollector object. - */ - function RaycastCollector() { - _super.call(this); - this._rayPosition = new Vector3D(); - this._rayDirection = new Vector3D(); - this._iCollectionMark = 0; - } - Object.defineProperty(RaycastCollector.prototype, "rayPosition", { - /** - * Provides the starting position of the ray. - */ - get: function () { - return this._rayPosition; - }, - set: function (value) { - this._rayPosition = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(RaycastCollector.prototype, "rayDirection", { - /** - * Provides the direction vector of the ray. - */ - get: function () { - return this._rayDirection; - }, - set: function (value) { - this._rayDirection = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * Returns true if the current node is at least partly in the frustum. If so, the partition node knows to pass on the traverser to its children. - * - * @param node The Partition3DNode object to frustum-test. - */ - RaycastCollector.prototype.enterNode = function (node) { - return node.isIntersectingRay(this._rayPosition, this._rayDirection); - }; - return RaycastCollector; - })(traverse.CollectorBase); - traverse.RaycastCollector = RaycastCollector; - })(away.traverse || (away.traverse = {})); - var traverse = away.traverse; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.traverse - */ - (function (traverse) { - /** - * @class away.traverse.CSSEntityCollector - */ - var CSSEntityCollector = (function (_super) { - __extends(CSSEntityCollector, _super); - function CSSEntityCollector() { - _super.call(this); - } - return CSSEntityCollector; - })(traverse.CollectorBase); - traverse.CSSEntityCollector = CSSEntityCollector; - })(away.traverse || (away.traverse = {})); - var traverse = away.traverse; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.traverse - */ - (function (traverse) { - /** - * @class away.traverse.ShadowCasterCollector - */ - var ShadowCasterCollector = (function (_super) { - __extends(ShadowCasterCollector, _super); - function ShadowCasterCollector() { - _super.call(this); - } - /** - * - */ - ShadowCasterCollector.prototype.enterNode = function (node) { - var enter = this.scene._iCollectionMark != node._iCollectionMark && node.isCastingShadow(); - - if (!enter) { - node._iCollectionMark = this.scene._iCollectionMark; - - return false; - } - - return _super.prototype.enterNode.call(this, node); - }; - return ShadowCasterCollector; - })(traverse.CollectorBase); - traverse.ShadowCasterCollector = ShadowCasterCollector; - })(away.traverse || (away.traverse = {})); - var traverse = away.traverse; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * @class away.partition.NodeBase - */ - var NodeBase = (function () { - /** - * - */ - function NodeBase() { - this._pNumChildNodes = 0; - this._iNumEntities = 0; - this._pChildNodes = new Array(); - } - Object.defineProperty(NodeBase.prototype, "boundsVisible", { - /** - * - */ - get: function () { - return this._explicitBoundsVisible; - }, - set: function (value) { - if (this._explicitBoundsVisible == value) - return; - - this._explicitBoundsVisible = value; - - this._iUpdateImplicitBoundsVisible(this._iParent ? this._iParent.boundsChildrenVisible : false); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(NodeBase.prototype, "boundsChildrenVisible", { - get: function () { - return this._boundsChildrenVisible; - }, - set: function (value) { - if (this._boundsChildrenVisible == value) - return; - - this._boundsChildrenVisible = value; - - for (var i = 0; i < this._pNumChildNodes; ++i) - this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(NodeBase.prototype, "parent", { - /** - * - */ - get: function () { - return this._iParent; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(NodeBase.prototype, "_pNumEntities", { - /** - * - * @protected - */ - get: function () { - return this._iNumEntities; - }, - enumerable: true, - configurable: true - }); - - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - * @internal - */ - NodeBase.prototype.isInFrustum = function (planes, numPlanes) { - return true; - }; - - /** - * - * @param rayPosition - * @param rayDirection - * @returns {boolean} - */ - NodeBase.prototype.isIntersectingRay = function (rayPosition, rayDirection) { - return true; - }; - - /** - * - * @returns {boolean} - */ - NodeBase.prototype.isCastingShadow = function () { - return true; - }; - - /** - * - * @param entity - * @returns {away.partition.NodeBase} - */ - NodeBase.prototype.findPartitionForEntity = function (entity) { - return this; - }; - - /** - * - * @param traverser - */ - NodeBase.prototype.acceptTraverser = function (traverser) { - if (this._pNumEntities == 0 && !this._implicitBoundsVisible) - return; - - if (traverser.enterNode(this)) { - var i = 0; - - while (i < this._pNumChildNodes) - this._pChildNodes[i++].acceptTraverser(traverser); - - if (this._implicitBoundsVisible) - this._pBoundsPrimitive.partitionNode.acceptTraverser(traverser); - } - }; - - /** - * - * @protected - */ - NodeBase.prototype._pCreateBoundsPrimitive = function () { - return null; - }; - - /** - * - * @param node - * @internal - */ - NodeBase.prototype.iAddNode = function (node) { - node._iParent = this; - this._iNumEntities += node._pNumEntities; - this._pChildNodes[this._pNumChildNodes++] = node; - - node._iUpdateImplicitBoundsVisible(this.boundsChildrenVisible); - - var numEntities = node._pNumEntities; - node = this; - - do { - node._iNumEntities += numEntities; - } while((node = node._iParent) != null); - }; - - /** - * - * @param node - * @internal - */ - NodeBase.prototype.iRemoveNode = function (node) { - var index = this._pChildNodes.indexOf(node); - this._pChildNodes[index] = this._pChildNodes[--this._pNumChildNodes]; - this._pChildNodes.pop(); - - node._iUpdateImplicitBoundsVisible(false); - - var numEntities = node._pNumEntities; - node = this; - - do { - node._pNumEntities -= numEntities; - } while((node = node._iParent) != null); - }; - - NodeBase.prototype._iUpdateImplicitBoundsVisible = function (value) { - if (this._implicitBoundsVisible == this._explicitBoundsVisible || value) - return; - - this._implicitBoundsVisible = this._explicitBoundsVisible || value; - - this._iUpdateEntityBounds(); - - for (var i = 0; i < this._pNumChildNodes; ++i) - this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); - }; - - /** - * @internal - */ - NodeBase.prototype._iIsBoundsVisible = function () { - return this._implicitBoundsVisible; - }; - - // public _pUpdateNumEntities(value:number) - // { - // var diff:number = value - this._pNumEntities; - // var node:NodeBase = this; - // - // do { - // node._pNumEntities += diff; - // } while ((node = node._iParent) != null); - // } - NodeBase.prototype._iUpdateEntityBounds = function () { - if (this._pBoundsPrimitive) { - this._pBoundsPrimitive.dispose(); - this._pBoundsPrimitive = null; - } - - if (this._implicitBoundsVisible) - this._pBoundsPrimitive = this._pCreateBoundsPrimitive(); - }; - return NodeBase; - })(); - partition.NodeBase = NodeBase; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * @class away.partition.NullNode - */ - var NullNode = (function () { - function NullNode() { - } - return NullNode; - })(); - partition.NullNode = NullNode; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * @class away.partition.Partition - */ - var Partition = (function () { - function Partition(rootNode) { - this._updatesMade = false; - this._rootNode = rootNode || new partition.NullNode(); - } - Object.defineProperty(Partition.prototype, "rootNode", { - get: function () { - return this._rootNode; - }, - enumerable: true, - configurable: true - }); - - Partition.prototype.traverse = function (traverser) { - if (this._updatesMade) - this.updateEntities(); - - this._rootNode.acceptTraverser(traverser); - }; - - Partition.prototype.iMarkForUpdate = function (entity) { - var node = entity.partitionNode; - var t = this._updateQueue; - - while (t) { - if (node == t) - return; - - t = t._iUpdateQueueNext; - } - - node._iUpdateQueueNext = this._updateQueue; - - this._updateQueue = node; - this._updatesMade = true; - }; - - Partition.prototype.iRemoveEntity = function (entity) { - var node = entity.partitionNode; - var t; - - node.removeFromParent(); - - if (node == this._updateQueue) { - this._updateQueue = node._iUpdateQueueNext; - } else { - t = this._updateQueue; - while (t && t._iUpdateQueueNext != node) - t = t._iUpdateQueueNext; - - if (t) - t._iUpdateQueueNext = node._iUpdateQueueNext; - } - - node._iUpdateQueueNext = null; - - if (!this._updateQueue) - this._updatesMade = false; - }; - - Partition.prototype.updateEntities = function () { - var node = this._updateQueue; - var targetNode; - var t; - this._updateQueue = null; - this._updatesMade = false; - - do { - targetNode = this._rootNode.findPartitionForEntity(node.entity); - - if (node.parent != targetNode) { - if (node) - node.removeFromParent(); - - targetNode.iAddNode(node); - } - - t = node._iUpdateQueueNext; - node._iUpdateQueueNext = null; - - //required for controllers with autoUpdate set to true - node.entity._iInternalUpdate(); - } while((node = t) != null); - }; - return Partition; - })(); - partition.Partition = Partition; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * @class away.partition.EntityNode - */ - var EntityNode = (function (_super) { - __extends(EntityNode, _super); - function EntityNode(entity) { - _super.call(this); - this._entity = entity; - this._iNumEntities = 1; - } - Object.defineProperty(EntityNode.prototype, "entity", { - get: function () { - return this._entity; - }, - enumerable: true, - configurable: true - }); - - EntityNode.prototype.removeFromParent = function () { - if (this._iParent) - this._iParent.iRemoveNode(this); - - this._iParent = null; - }; - - /** - * - * @returns {boolean} - */ - EntityNode.prototype.isCastingShadow = function () { - return this.entity.castsShadows; - }; - - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - */ - EntityNode.prototype.isInFrustum = function (planes, numPlanes) { - if (!this._entity._iIsVisible()) - return false; - - return this._entity.worldBounds.isInFrustum(planes, numPlanes); - }; - - /** - * @inheritDoc - */ - EntityNode.prototype.acceptTraverser = function (traverser) { - if (traverser.enterNode(this)) - traverser.applyEntity(this._entity); - }; - - /** - * @inheritDoc - */ - EntityNode.prototype.isIntersectingRay = function (rayPosition, rayDirection) { - if (!this._entity._iIsVisible()) - return false; - - return this._entity.isIntersectingRay(rayPosition, rayDirection); - }; - - /** - * - * @protected - */ - EntityNode.prototype._pCreateBoundsPrimitive = function () { - return this._entity.bounds.boundingEntity; - }; - return EntityNode; - })(partition.NodeBase); - partition.EntityNode = EntityNode; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * @class away.partition.CameraNode - */ - var CameraNode = (function (_super) { - __extends(CameraNode, _super); - function CameraNode(camera) { - _super.call(this, camera); - } - /** - * @inheritDoc - */ - CameraNode.prototype.acceptTraverser = function (traverser) { - // todo: dead end for now, if it has a debug mesh, then sure accept that - }; - return CameraNode; - })(partition.EntityNode); - partition.CameraNode = CameraNode; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * @class away.partition.DirectionalLightNode - */ - var DirectionalLightNode = (function (_super) { - __extends(DirectionalLightNode, _super); - /** - * - * @param directionalLight - */ - function DirectionalLightNode(directionalLight) { - _super.call(this, directionalLight); - - this._directionalLight = directionalLight; - } - /** - * @inheritDoc - */ - DirectionalLightNode.prototype.acceptTraverser = function (traverser) { - if (traverser.enterNode(this)) - traverser.applyDirectionalLight(this._directionalLight); - }; - - /** - * - * @returns {boolean} - */ - DirectionalLightNode.prototype.isCastingShadow = function () { - return false; - }; - return DirectionalLightNode; - })(partition.EntityNode); - partition.DirectionalLightNode = DirectionalLightNode; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * @class away.partition.LightProbeNode - */ - var LightProbeNode = (function (_super) { - __extends(LightProbeNode, _super); - /** - * - * @param lightProbe - */ - function LightProbeNode(lightProbe) { - _super.call(this, lightProbe); - - this._lightProbe = lightProbe; - } - /** - * @inheritDoc - */ - LightProbeNode.prototype.acceptTraverser = function (traverser) { - if (traverser.enterNode(this)) - traverser.applyLightProbe(this._lightProbe); - }; - - /** - * - * @returns {boolean} - */ - LightProbeNode.prototype.isCastingShadow = function () { - return false; - }; - return LightProbeNode; - })(partition.EntityNode); - partition.LightProbeNode = LightProbeNode; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * @class away.partition.PointLightNode - */ - var PointLightNode = (function (_super) { - __extends(PointLightNode, _super); - /** - * - * @param pointLight - */ - function PointLightNode(pointLight) { - _super.call(this, pointLight); - - this._pointLight = pointLight; - } - /** - * @inheritDoc - */ - PointLightNode.prototype.acceptTraverser = function (traverser) { - if (traverser.enterNode(this)) - traverser.applyPointLight(this._pointLight); - }; - - /** - * - * @returns {boolean} - */ - PointLightNode.prototype.isCastingShadow = function () { - return false; - }; - return PointLightNode; - })(partition.EntityNode); - partition.PointLightNode = PointLightNode; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.partition - */ - (function (partition) { - /** - * SkyboxNode is a space partitioning leaf node that contains a Skybox object. - * - * @class away.partition.SkyboxNode - */ - var SkyboxNode = (function (_super) { - __extends(SkyboxNode, _super); - /** - * Creates a new SkyboxNode object. - * @param skyBox The Skybox to be contained in the node. - */ - function SkyboxNode(skyBox) { - _super.call(this, skyBox); - - this._skyBox = skyBox; - } - /** - * @inheritDoc - */ - SkyboxNode.prototype.acceptTraverser = function (traverser) { - if (traverser.enterNode(this)) - traverser.applySkybox(this._skyBox); - }; - - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - */ - SkyboxNode.prototype.isInFrustum = function (planes, numPlanes) { - if (!this._skyBox._iIsVisible) - return false; - - //a skybox is always in view unless its visibility is set to false - return true; - }; - return SkyboxNode; - })(partition.EntityNode); - partition.SkyboxNode = SkyboxNode; - })(away.partition || (away.partition = {})); - var partition = away.partition; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.pick - */ - (function (pick) { - - })(away.pick || (away.pick = {})); - var pick = away.pick; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.pick - */ - (function (pick) { - - })(away.pick || (away.pick = {})); - var pick = away.pick; -})(away || (away = {})); -var away; -(function (away) { - /// - /** - * @module away.pick - */ - (function (pick) { - /** - * Value object for a picking collision returned by a picking collider. Created as unique objects on display objects - * - * @see away.base.DisplayObject#pickingCollisionVO - * @see away.core.pick.IPickingCollider - * - * @class away.pick.PickingCollisionVO - */ - var PickingCollisionVO = (function () { - /** - * Creates a new PickingCollisionVO object. - * - * @param entity The entity to which this collision object belongs. - */ - function PickingCollisionVO(displayObject) { - this.displayObject = displayObject; - } - return PickingCollisionVO; - })(); - pick.PickingCollisionVO = PickingCollisionVO; - })(away.pick || (away.pick = {})); - var pick = away.pick; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.pick - */ - (function (pick) { - var RaycastCollector = away.traverse.RaycastCollector; - - /** - * Picks a 3d object from a view or scene by 3D raycast calculations. - * Performs an initial coarse boundary calculation to return a subset of entities whose bounding volumes intersect with the specified ray, - * then triggers an optional picking collider on individual entity objects to further determine the precise values of the picking ray collision. - * - * @class away.pick.RaycastPicker - */ - var RaycastPicker = (function () { - /** - * Creates a new RaycastPicker object. - * - * @param findClosestCollision Determines whether the picker searches for the closest bounds collision along the ray, - * or simply returns the first collision encountered. Defaults to false. - */ - function RaycastPicker(findClosestCollision) { - if (typeof findClosestCollision === "undefined") { findClosestCollision = false; } - this._ignoredEntities = []; - this._onlyMouseEnabled = true; - this._numEntities = 0; - this._raycastCollector = new RaycastCollector(); - - this._findClosestCollision = findClosestCollision; - this._entities = new Array(); - } - Object.defineProperty(RaycastPicker.prototype, "onlyMouseEnabled", { - /** - * @inheritDoc - */ - get: function () { - return this._onlyMouseEnabled; - }, - set: function (value) { - this._onlyMouseEnabled = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * @inheritDoc - */ - RaycastPicker.prototype.getViewCollision = function (x, y, view) { - //update ray - var rayPosition = view.unproject(x, y, 0); - var rayDirection = view.unproject(x, y, 1).subtract(rayPosition); - - return this.getSceneCollision(rayPosition, rayDirection, view.scene); - }; - - /** - * @inheritDoc - */ - RaycastPicker.prototype.getSceneCollision = function (rayPosition, rayDirection, scene) { - //clear collector - this._raycastCollector.clear(); - - //setup ray vectors - this._raycastCollector.rayPosition = rayPosition; - this._raycastCollector.rayDirection = rayDirection; - - // collect entities to test - scene.traversePartitions(this._raycastCollector); - - this._numEntities = 0; - var node = this._raycastCollector.entityHead; - var entity; - - while (node) { - if (!this.isIgnored(entity = node.entity)) - this._entities[this._numEntities++] = entity; - - node = node.next; - } - - //early out if no collisions detected - if (!this._numEntities) - return null; - - return this.getPickingCollisionVO(this._raycastCollector); - }; - - // public getEntityCollision(position:away.geom.Vector3D, direction:away.geom.Vector3D, entities:Array):PickingCollisionVO - // { - // this._numEntities = 0; - // - // var entity:IEntity; - // var l:number = entities.length; - // - // for (var c:number = 0; c < l; c++) { - // entity = entities[c]; - // - // if (entity.isIntersectingRay(position, direction)) - // this._entities[this._numEntities++] = entity; - // } - // - // return this.getPickingCollisionVO(this._raycastCollector); - // } - RaycastPicker.prototype.setIgnoreList = function (entities) { - this._ignoredEntities = entities; - }; - - RaycastPicker.prototype.isIgnored = function (entity) { - if (this._onlyMouseEnabled && !entity._iIsMouseEnabled()) - return true; - - var len = this._ignoredEntities.length; - for (var i = 0; i < len; i++) - if (this._ignoredEntities[i] == entity) - return true; - - return false; - }; - - RaycastPicker.prototype.sortOnNearT = function (entity1, entity2) { - return entity1._iPickingCollisionVO.rayEntryDistance > entity2._iPickingCollisionVO.rayEntryDistance ? 1 : -1; - }; - - RaycastPicker.prototype.getPickingCollisionVO = function (collector) { - // trim before sorting - this._entities.length = this._numEntities; - - // Sort entities from closest to furthest. - this._entities = this._entities.sort(this.sortOnNearT); // TODO - test sort filter in JS - - // --------------------------------------------------------------------- - // Evaluate triangle collisions when needed. - // Replaces collision data provided by bounds collider with more precise data. - // --------------------------------------------------------------------- - var shortestCollisionDistance = Number.MAX_VALUE; - var bestCollisionVO; - var pickingCollisionVO; - var entity; - var i; - - for (i = 0; i < this._numEntities; ++i) { - entity = this._entities[i]; - pickingCollisionVO = entity._iPickingCollisionVO; - if (entity.pickingCollider) { - // If a collision exists, update the collision data and stop all checks. - if ((bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) && entity._iTestCollision(shortestCollisionDistance, this._findClosestCollision)) { - shortestCollisionDistance = pickingCollisionVO.rayEntryDistance; - bestCollisionVO = pickingCollisionVO; - if (!this._findClosestCollision) { - this.updateLocalPosition(pickingCollisionVO); - return pickingCollisionVO; - } - } - } else if (bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) { - // Note: a bounds collision with a ray origin inside its bounds is ONLY ever used - // to enable the detection of a corresponsding triangle collision. - // Therefore, bounds collisions with a ray origin inside its bounds can be ignored - // if it has been established that there is NO triangle collider to test - if (!pickingCollisionVO.rayOriginIsInsideBounds) { - this.updateLocalPosition(pickingCollisionVO); - return pickingCollisionVO; - } - } - } - - return bestCollisionVO; - }; - - RaycastPicker.prototype.updateLocalPosition = function (pickingCollisionVO) { - var collisionPos = (pickingCollisionVO.localPosition == null) ? new away.geom.Vector3D() : pickingCollisionVO.localPosition; - - var rayDir = pickingCollisionVO.localRayDirection; - var rayPos = pickingCollisionVO.localRayPosition; - var t = pickingCollisionVO.rayEntryDistance; - collisionPos.x = rayPos.x + t * rayDir.x; - collisionPos.y = rayPos.y + t * rayDir.y; - collisionPos.z = rayPos.z + t * rayDir.z; - }; - - RaycastPicker.prototype.dispose = function () { - //TODO - }; - return RaycastPicker; - })(); - pick.RaycastPicker = RaycastPicker; - })(away.pick || (away.pick = {})); - var pick = away.pick; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.render - */ - (function (_render) { - - })(away.render || (away.render = {})); - var render = away.render; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.render - */ - (function (render) { - /** - * RendererBase forms an abstract base class for classes that are used in the rendering pipeline to render the - * contents of a partition - * - * @class away.render.RendererBase - */ - var CSSRendererBase = (function (_super) { - __extends(CSSRendererBase, _super); - /** - * Creates a new RendererBase object. - */ - function CSSRendererBase(renderToTexture, forceSoftware, profile) { - if (typeof renderToTexture === "undefined") { renderToTexture = false; } - if (typeof forceSoftware === "undefined") { forceSoftware = false; } - if (typeof profile === "undefined") { profile = "baseline"; } - _super.call(this); - this._backgroundR = 0; - this._backgroundG = 0; - this._backgroundB = 0; - this._backgroundAlpha = 1; - this._shareContext = false; - this._pBackBufferInvalid = true; - this._depthTextureInvalid = true; - this._viewPort = new away.geom.Rectangle(); - this._scissorRect = new away.geom.Rectangle(); - this._localPos = new away.geom.Point(); - this._globalPos = new away.geom.Point(); - - this._billboardRenderablePool = away.pool.RenderablePool.getPool(away.pool.CSSBillboardRenderable); - this._lineSegmentRenderablePool = away.pool.RenderablePool.getPool(away.pool.CSSLineSegmentRenderable); - - this._viewPort = new away.geom.Rectangle(); - - if (this._width == 0) - this.width = window.innerWidth; - - if (this._height == 0) - this.height = window.innerHeight; - } - Object.defineProperty(CSSRendererBase.prototype, "viewPort", { - /** - * A viewPort rectangle equivalent of the StageGL size and position. - */ - get: function () { - return this._viewPort; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(CSSRendererBase.prototype, "scissorRect", { - /** - * A scissor rectangle equivalent of the view size and position. - */ - get: function () { - return this._scissorRect; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(CSSRendererBase.prototype, "x", { - /** - * - */ - get: function () { - return this._localPos.x; - }, - set: function (value) { - if (this.x == value) - return; - - this.updateGlobalPos(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CSSRendererBase.prototype, "y", { - /** - * - */ - get: function () { - return this._localPos.y; - }, - set: function (value) { - if (this.y == value) - return; - - this._globalPos.y = this._localPos.y = value; - - this.updateGlobalPos(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CSSRendererBase.prototype, "width", { - /** - * - */ - get: function () { - return this._width; - }, - set: function (value) { - if (this._width == value) - return; - - this._width = value; - this._scissorRect.width = value; - this._viewPort.width = value; - - this._pBackBufferInvalid = true; - this._depthTextureInvalid = true; - - this.notifyViewportUpdate(); - this.notifyScissorUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CSSRendererBase.prototype, "height", { - /** - * - */ - get: function () { - return this._height; - }, - set: function (value) { - if (this._height == value) - return; - - this._height = value; - this._scissorRect.height = value; - this._viewPort.height = value; - - this._pBackBufferInvalid = true; - this._depthTextureInvalid = true; - - this.notifyViewportUpdate(); - this.notifyScissorUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundR", { - /** - * The background color's red component, used when clearing. - * - * @private - */ - get: function () { - return this._backgroundR; - }, - set: function (value) { - if (this._backgroundR == value) - return; - - this._backgroundR = value; - - this._pBackBufferInvalid = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundG", { - /** - * The background color's green component, used when clearing. - * - * @private - */ - get: function () { - return this._backgroundG; - }, - set: function (value) { - if (this._backgroundG == value) - return; - - this._backgroundG = value; - - this._pBackBufferInvalid = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundB", { - /** - * The background color's blue component, used when clearing. - * - * @private - */ - get: function () { - return this._backgroundB; - }, - set: function (value) { - if (this._backgroundB == value) - return; - - this._backgroundB = value; - - this._pBackBufferInvalid = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(CSSRendererBase.prototype, "shareContext", { - get: function () { - return this._shareContext; - }, - set: function (value) { - if (this._shareContext == value) - return; - - this._shareContext = value; - - this.updateGlobalPos(); - }, - enumerable: true, - configurable: true - }); - - - /** - * Disposes the resources used by the RendererBase. - */ - CSSRendererBase.prototype.dispose = function () { - /* - if (_backgroundImageRenderer) { - _backgroundImageRenderer.dispose(); - _backgroundImageRenderer = null; - } - */ - }; - - CSSRendererBase.prototype.render = function (entityCollector) { - this._viewportDirty = false; - this._scissorDirty = false; - }; - - /** - * Renders the potentially visible geometry to the back buffer or texture. - * @param entityCollector The EntityCollector object containing the potentially visible geometry. - * @param scissorRect - */ - CSSRendererBase.prototype._iRender = function (entityCollector, target, scissorRect, surfaceSelector) { - if (typeof target === "undefined") { target = null; } - if (typeof scissorRect === "undefined") { scissorRect = null; } - if (typeof surfaceSelector === "undefined") { surfaceSelector = 0; } - if (!entityCollector.entityHead) - return; - - this.pExecuteRender(entityCollector, scissorRect); - }; - - CSSRendererBase.prototype._iRenderCascades = function (entityCollector, target, numCascades, scissorRects, cameras) { - }; - CSSRendererBase.prototype.pCollectRenderables = function (entityCollector) { - //reset head values - this._renderableHead = null; - - //grab entity head - var item = entityCollector.entityHead; - - //set temp values for entry point and camera forward vector - this._pCamera = entityCollector.camera; - this._iEntryPoint = this._pCamera.scenePosition; - this._pCameraForward = this._pCamera.transform.forwardVector; - - while (item) { - item.entity._iCollectRenderables(this); - item = item.next; - } - }; - - /** - * Renders the potentially visible geometry to the back buffer or texture. Only executed if everything is set up. - * @param entityCollector The EntityCollector object containing the potentially visible geometry. - * @param scissorRect - */ - CSSRendererBase.prototype.pExecuteRender = function (entityCollector, scissorRect) { - if (typeof scissorRect === "undefined") { scissorRect = null; } - this.pCollectRenderables(entityCollector); - - this.pDraw(entityCollector); - }; - - /** - * Performs the actual drawing of dom objects to the target. - * - * @param entityCollector The EntityCollector object containing the potentially visible dom objects. - */ - CSSRendererBase.prototype.pDraw = function (entityCollector) { - throw new away.errors.AbstractMethodError(); - }; - - Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundAlpha", { - get: function () { - return this._backgroundAlpha; - }, - set: function (value) { - if (this._backgroundAlpha == value) - return; - - this._backgroundAlpha = value; - - this._pBackBufferInvalid = true; - }, - enumerable: true, - configurable: true - }); - - - /** - * - * @param billboard - */ - CSSRendererBase.prototype.applyBillboard = function (billboard) { - this._applyRenderable(this._billboardRenderablePool.getItem(billboard)); - }; - - /** - * - * @param lineSubMesh - */ - CSSRendererBase.prototype.applyLineSubMesh = function (lineSubMesh) { - //this._applyRenderable( this._billboardRenderablePool.getItem(lineSegment)); - }; - - /** - * - * @param skybox - */ - CSSRendererBase.prototype.applySkybox = function (skybox) { - }; - - /** - * - * @param triangleSubMesh - */ - CSSRendererBase.prototype.applyTriangleSubMesh = function (triangleSubMesh) { - }; - - /** - * - * @param renderable - * @private - */ - CSSRendererBase.prototype._applyRenderable = function (renderable) { - var material = renderable.materialOwner.material; - var entity = renderable.sourceEntity; - var position = entity.scenePosition; - - if (material) { - //set ids for faster referencing - renderable.materialId = material._iMaterialId; - - // renderable.renderOrderId = material._iRenderOrderId; - renderable.cascaded = false; - - // project onto camera's z-axis - position = this._iEntryPoint.subtract(position); - renderable.zIndex = entity.zOffset - position.dotProduct(this._pCameraForward); - - //store reference to scene transform - renderable.renderSceneTransform = renderable.sourceEntity.getRenderSceneTransform(this._pCamera); - - //store reference to next item in list - renderable.next = this._renderableHead; - this._renderableHead = renderable; - } - }; - - /** - * @private - */ - CSSRendererBase.prototype.notifyScissorUpdate = function () { - if (this._scissorDirty) - return; - - this._scissorDirty = true; - - if (!this._scissorUpdated) - this._scissorUpdated = new away.events.RendererEvent(away.events.RendererEvent.SCISSOR_UPDATED); - - this.dispatchEvent(this._scissorUpdated); - }; - - /** - * @private - */ - CSSRendererBase.prototype.notifyViewportUpdate = function () { - if (this._viewportDirty) - return; - - this._viewportDirty = true; - - if (!this._viewPortUpdated) - this._viewPortUpdated = new away.events.RendererEvent(away.events.RendererEvent.VIEWPORT_UPDATED); - - this.dispatchEvent(this._viewPortUpdated); - }; - - /** - * - */ - CSSRendererBase.prototype.updateGlobalPos = function () { - this._viewPort.x = this._globalPos.x; - this._viewPort.y = this._globalPos.y; - - this.notifyViewportUpdate(); - this.notifyScissorUpdate(); - }; - - CSSRendererBase.prototype._iCreateEntityCollector = function () { - throw new away.errors.AbstractMethodError(); - }; - return CSSRendererBase; - })(away.events.EventDispatcher); - render.CSSRendererBase = CSSRendererBase; - })(away.render || (away.render = {})); - var render = away.render; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * @module away.render - */ - (function (render) { - /** - * The DefaultRenderer class provides the default rendering method. It renders the scene graph objects using the - * materials assigned to them. - * - * @class away.render.DefaultRenderer - */ - var CSSDefaultRenderer = (function (_super) { - __extends(CSSDefaultRenderer, _super); - /** - * Creates a new CSSDefaultRenderer object. - */ - function CSSDefaultRenderer() { - _super.call(this); - this._contextMatrix = new away.geom.Matrix3D(); - this._skyboxProjection = new away.geom.Matrix3D(); - this._transform = new away.geom.Matrix3D(); - - //create container for the renderer - this._container = document.createElement("div"); - this._container.style.overflow = "hidden"; - this._container.style.position = "absolute"; - - //add container to body - document.body.appendChild(this._container); - - //create conxtext for the renderer - this._context = document.createElement("div"); - this._contextStyle = this._context.style; - this._contextStyle.position = "absolute"; - this._contextStyle.transformStyle = this._contextStyle["-webkit-transform-style"] = this._contextStyle["-moz-transform-style"] = this._contextStyle["-o-transform-style"] = this._contextStyle["-ms-transform-style"] = "preserve-3d"; - this._contextStyle.transformOrigin = this._contextStyle["-webkit-transform-origin"] = this._contextStyle["-moz-transform-origin"] = this._contextStyle["-o-transform-origin"] = this._contextStyle["-ms-transform-origin"] = "0% 0%"; - - //add context to container - this._container.appendChild(this._context); - } - /** - * - * @param entityCollector - */ - CSSDefaultRenderer.prototype.render = function (entityCollector) { - _super.prototype.render.call(this, entityCollector); - - if (this._pBackBufferInvalid) - this.pUpdateBackBuffer(); - - this._iRender(entityCollector); - - this._pBackBufferInvalid = false; - }; - - /** - * @inheritDoc - */ - CSSDefaultRenderer.prototype.pDraw = function (entityCollector) { - // if (entityCollector.skyBox) { - // if (this._activeMaterial) - // this._activeMaterial.iDeactivate(this._pStageGL); - // - // this._activeMaterial = null; - // - // this._pContext.setDepthTest(false, away.gl.ContextGLCompareMode.ALWAYS); - // this.drawSkybox(entityCollector); - // - // } - // - // var which:number = target? DefaultRenderer.SCREEN_PASSES : DefaultRenderer.ALL_PASSES; - var sheet = document.styleSheets[document.styleSheets.length - 1]; - - for (var i = 0; i < sheet.cssRules.length; i++) { - var style = sheet.cssRules[i].style; - style.transform = style["-webkit-transform"] = style["-moz-transform"] = style["-o-transform"] = style["-ms-transform"] = (entityCollector.camera.projection.coordinateSystem == away.projections.CoordinateSystem.RIGHT_HANDED) ? "" : "scale3d(1, -1, 1) translateY(-" + style.height + ")"; - } - - this.drawRenderables(this._renderableHead, entityCollector); - - // if (this._activeMaterial) - // this._activeMaterial.iDeactivate(this._pStageGL); - this._activeMaterial = null; - }; - - /** - * Updates the backbuffer properties. - */ - CSSDefaultRenderer.prototype.pUpdateBackBuffer = function () { - this._container.style.width = this._width + "px"; - this._container.style.height = this._height + "px"; - this._container.style.clip = "rect(0px, " + this._width + "px, " + this._height + "px, 0px)"; - - //update context matrix - this._contextMatrix.rawData[0] = this._width / 2; - this._contextMatrix.rawData[5] = -this._height / 2; - this._contextMatrix.rawData[10] = -1; //fix for innaccurate z-sort - this._contextMatrix.rawData[12] = this._width / 2; - this._contextMatrix.rawData[13] = this._height / 2; - - //update context tranform - this._contextStyle.transform = this._contextStyle["-webkit-transform"] = this._contextStyle["-moz-transform"] = this._contextStyle["-o-transform"] = this._contextStyle["-ms-transform"] = this._contextMatrix.toString(); - - this._pBackBufferInvalid = false; - }; - - /** - * Draw the skybox if present. - * @param entityCollector The EntityCollector containing all potentially visible information. - */ - CSSDefaultRenderer.prototype.drawSkybox = function (entityCollector) { - //TODO - }; - - /** - * Draw a list of renderables. - * @param renderables The renderables to draw. - * @param entityCollector The EntityCollector containing all potentially visible information. - */ - CSSDefaultRenderer.prototype.drawRenderables = function (item, entityCollector) { - var viewProjection = entityCollector.camera.viewProjection.clone(); - - while (item) { - this._activeMaterial = item.materialOwner.material; - - //serialise transform and apply to html element - this._transform.copyRawDataFrom(item.renderSceneTransform.rawData); - this._transform.append(viewProjection); - - var style = item.htmlElement.style; - - style.transform = style["-webkit-transform"] = style["-moz-transform"] = style["-o-transform"] = style["-ms-transform"] = this._transform.toString(); - - style.transformStyle = style["-webkit-transform-style"] = style["-moz-transform-style"] = style["-o-transform-style"] = style["-ms-transform-style"] = "preserve-3d"; - - //check if child requires adding to the view - if (!this._context.contains(item.htmlElement)) - this._context.appendChild(item.htmlElement); - - item = item.next; - } - // var numPasses:number; - // var j:number; - // var camera:away.entities.Camera = entityCollector.camera; - // var item2:away.render.CSSRenderableBase; - // - // while (item) { - // this._activeMaterial = item.material; - // - // this._activeMaterial.iUpdateMaterial(this._pContext); - // - // numPasses = this._activeMaterial._iNumPasses; - // - // j = 0; - // - // do { - // item2 = item; - // - // var rttMask:number = this._activeMaterial.iPassRendersToTexture(j)? 1 : 2; - // - // if ((rttMask & which) != 0) { - // this._activeMaterial.iActivatePass(j, this._pStageGL, camera); - // - // do { - // this._activeMaterial.iRenderPass(j, item2, this._pStageGL, entityCollector); - // - // item2 = item2.next; - // - // } while (item2 && item2.material == this._activeMaterial); - // - // this._activeMaterial.iDeactivatePass(j, this._pStageGL); - // - // } else { - // do { - // item2 = item2.next; - // - // } while (item2 && item2.renderable.material == this._activeMaterial); - // } - // } while (++j < numPasses); - // - // item = item2; - // } - }; - - CSSDefaultRenderer.prototype.dispose = function () { - _super.prototype.dispose.call(this); - //TODO - }; - - CSSDefaultRenderer.prototype._iCreateEntityCollector = function () { - return new away.traverse.CSSEntityCollector(); - }; - return CSSDefaultRenderer; - })(render.CSSRendererBase); - render.CSSDefaultRenderer = CSSDefaultRenderer; - })(away.render || (away.render = {})); - var render = away.render; -})(away || (away = {})); -/// -/// -var away; -(function (away) { - /** - * @module away.sort - */ - (function (sort) { - /** - * @class away.sort.RenderableMergeSort - */ - var RenderableMergeSort = (function () { - function RenderableMergeSort() { - } - RenderableMergeSort.prototype.sortBlendedRenderables = function (head) { - var headB; - var fast; - var slow; - - if (!head || !head.next) { - return head; - } - - // split in two sublists - slow = head; - fast = head.next; - - while (fast) { - fast = fast.next; - if (fast) { - slow = slow.next; - fast = fast.next; - } - } - - headB = slow.next; - slow.next = null; - - // recurse - head = this.sortBlendedRenderables(head); - headB = this.sortBlendedRenderables(headB); - - // merge sublists while respecting order - var result; - var curr; - var l; - - if (!head) - return headB; - if (!headB) - return head; - - while (head && headB) { - if (head.zIndex < headB.zIndex) { - l = head; - head = head.next; - } else { - l = headB; - headB = headB.next; - } - - if (!result) - result = l; - else - curr.next = l; - - curr = l; - } - - if (head) - curr.next = head; - else if (headB) - curr.next = headB; - - return result; - }; - - RenderableMergeSort.prototype.sortOpaqueRenderables = function (head) { - var headB; - var fast, slow; - - if (!head || !head.next) { - return head; - } - - // split in two sublists - slow = head; - fast = head.next; - - while (fast) { - fast = fast.next; - if (fast) { - slow = slow.next; - fast = fast.next; - } - } - - headB = slow.next; - slow.next = null; - - // recurse - head = this.sortOpaqueRenderables(head); - headB = this.sortOpaqueRenderables(headB); - - // merge sublists while respecting order - var result; - var curr; - var l; - var cmp = 0; - - if (!head) - return headB; - if (!headB) - return head; - - while (head && headB && head != null && headB != null) { - // first sort per render order id (reduces program3D switches), - // then on material id (reduces setting props), - // then on zIndex (reduces overdraw) - var aid = head.renderOrderId; - var bid = headB.renderOrderId; - - if (aid == bid) { - var ma = head.materialId; - var mb = headB.materialId; - - if (ma == mb) { - if (head.zIndex < headB.zIndex) - cmp = 1; - else - cmp = -1; - } else if (ma > mb) { - cmp = 1; - } else { - cmp = -1; - } - } else if (aid > bid) { - cmp = 1; - } else { - cmp = -1; - } - - if (cmp < 0) { - l = head; - head = head.next; - } else { - l = headB; - headB = headB.next; - } - - if (!result) { - result = l; - curr = l; - } else { - curr.next = l; - curr = l; - } - } - - if (head) - curr.next = head; - else if (headB) - curr.next = headB; - - return result; - }; - return RenderableMergeSort; - })(); - sort.RenderableMergeSort = RenderableMergeSort; - })(away.sort || (away.sort = {})); - var sort = away.sort; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The AntiAliasType class provides values for anti-aliasing in the - * away.text.TextField class. - */ - (function (text) { - var AntiAliasType = (function () { - function AntiAliasType() { - } - AntiAliasType.ADVANCED = "advanced"; - - AntiAliasType.NORMAL = "normal"; - return AntiAliasType; - })(); - text.AntiAliasType = AntiAliasType; - })(away.text || (away.text = {})); - var text = away.text; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The GridFitType class defines values for grid fitting in the TextField class. - */ - (function (text) { - var GridFitType = (function () { - function GridFitType() { - } - GridFitType.NONE = "none"; - - GridFitType.PIXEL = "pixel"; - - GridFitType.SUBPIXEL = "subpixel"; - return GridFitType; - })(); - text.GridFitType = GridFitType; - })(away.text || (away.text = {})); - var text = away.text; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The TextFieldAutoSize class is an enumeration of constant values used in - * setting the autoSize property of the TextField class. - */ - (function (text) { - var TextFieldAutoSize = (function () { - function TextFieldAutoSize() { - } - TextFieldAutoSize.CENTER = "center"; - - TextFieldAutoSize.LEFT = "left"; - - TextFieldAutoSize.NONE = "none"; - - TextFieldAutoSize.RIGHT = "right"; - return TextFieldAutoSize; - })(); - text.TextFieldAutoSize = TextFieldAutoSize; - })(away.text || (away.text = {})); - var text = away.text; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The TextFieldType class is an enumeration of constant values used in setting the - * type property of the TextField class. - * - * @see away.entities.TextField#type - */ - (function (text) { - var TextFieldType = (function () { - function TextFieldType() { - } - TextFieldType.DYNAMIC = "dynamic"; - - TextFieldType.INPUT = "input"; - return TextFieldType; - })(); - text.TextFieldType = TextFieldType; - })(away.text || (away.text = {})); - var text = away.text; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The TextFormat class represents character formatting information. Use the - * TextFormat class to create specific text formatting for text fields. You - * can apply text formatting to both static and dynamic text fields. The - * properties of the TextFormat class apply to device and embedded fonts. - * However, for embedded fonts, bold and italic text actually require specific - * fonts. If you want to display bold or italic text with an embedded font, - * you need to embed the bold and italic variations of that font. - * - *

You must use the constructor new TextFormat() to create a - * TextFormat object before setting its properties. When you apply a - * TextFormat object to a text field using the - * TextField.defaultTextFormat property or the - * TextField.setTextFormat() method, only its defined properties - * are applied. Use the TextField.defaultTextFormat property to - * apply formatting BEFORE you add text to the TextField, and the - * setTextFormat() method to add formatting AFTER you add text to - * the TextField. The TextFormat properties are null - * by default because if you don't provide values for the properties, Flash - * Player uses its own default formatting. The default formatting that Flash - * Player uses for each property(if property's value is null) is - * as follows:

- * - *

The default formatting for each property is also described in each - * property description.

- */ - (function (text) { - var TextFormat = (function () { - /** - * Creates a TextFormat object with the specified properties. You can then - * change the properties of the TextFormat object to change the formatting of - * text fields. - * - *

Any parameter may be set to null to indicate that it is - * not defined. All of the parameters are optional; any omitted parameters - * are treated as null.

- * - * @param font The name of a font for text as a string. - * @param size An integer that indicates the size in pixels. - * @param color The color of text using this text format. A number - * containing three 8-bit RGB components; for example, - * 0xFF0000 is red, and 0x00FF00 is green. - * @param bold A Boolean value that indicates whether the text is - * boldface. - * @param italic A Boolean value that indicates whether the text is - * italicized. - * @param underline A Boolean value that indicates whether the text is - * underlined. - * @param url The URL to which the text in this text format - * hyperlinks. If url is an empty string, the - * text does not have a hyperlink. - * @param target The target window where the hyperlink is displayed. If - * the target window is an empty string, the text is - * displayed in the default target window - * _self. If the url parameter - * is set to an empty string or to the value - * null, you can get or set this property, - * but the property will have no effect. - * @param align The alignment of the paragraph, as a TextFormatAlign - * value. - * @param leftMargin Indicates the left margin of the paragraph, in pixels. - * @param rightMargin Indicates the right margin of the paragraph, in pixels. - * @param indent An integer that indicates the indentation from the left - * margin to the first character in the paragraph. - * @param leading A number that indicates the amount of leading vertical - * space between lines. - */ - function TextFormat(font, size, color, bold, italic, underline, url, target, align, leftMargin, rightMargin, indent, leading) { - if (typeof font === "undefined") { font = "Times New Roman"; } - if (typeof size === "undefined") { size = 12; } - if (typeof color === "undefined") { color = 0x000000; } - if (typeof bold === "undefined") { bold = false; } - if (typeof italic === "undefined") { italic = false; } - if (typeof underline === "undefined") { underline = false; } - if (typeof url === "undefined") { url = ""; } - if (typeof target === "undefined") { target = ""; } - if (typeof align === "undefined") { align = "left"; } - if (typeof leftMargin === "undefined") { leftMargin = 0; } - if (typeof rightMargin === "undefined") { rightMargin = 0; } - if (typeof indent === "undefined") { indent = 0; } - if (typeof leading === "undefined") { leading = 0; } - /** - * Specifies custom tab stops as an array of non-negative integers. Each tab - * stop is specified in pixels. If custom tab stops are not specified - * (null), the default tab stop is 4(average character width). - */ - this.tabStops = new Array(); - this.font = font; - this.size = size; - this.bold = bold; - this.italic = italic; - this.underline = underline; - this.url = url; - this.target = target; - this.align = align; - this.leftMargin = leftMargin; - this.rightMargin = rightMargin; - this.indent = indent; - this.leading = leading; - } - return TextFormat; - })(); - text.TextFormat = TextFormat; - })(away.text || (away.text = {})); - var text = away.text; -})(away || (away = {})); -var away; -(function (away) { - /// - /** - * The TextFormatAlign class provides values for text alignment in the - * TextFormat class. - */ - (function (text) { - var TextFormatAlign = (function () { - function TextFormatAlign() { - /** - * Constant; centers the text in the text field. Use the syntax - * TextFormatAlign.CENTER. - */ - this.CENTER = "center"; - /** - * Constant; justifies text within the text field. Use the syntax - * TextFormatAlign.JUSTIFY. - */ - this.JUSTIFY = "justify"; - /** - * Constant; aligns text to the left within the text field. Use the syntax - * TextFormatAlign.LEFT. - */ - this.LEFT = "left"; - /** - * Constant; aligns text to the right within the text field. Use the syntax - * TextFormatAlign.RIGHT. - */ - this.RIGHT = "right"; - } - return TextFormatAlign; - })(); - text.TextFormatAlign = TextFormatAlign; - })(away.text || (away.text = {})); - var text = away.text; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * A class that defines the Interactive mode of a text field object. - * - * @see away.entities.TextField#textInteractionMode - */ - (function (text) { - var TextInteractionMode = (function () { - function TextInteractionMode() { - } - TextInteractionMode.NORMAL = "normal"; - - TextInteractionMode.SELECTION = "selection"; - return TextInteractionMode; - })(); - text.TextInteractionMode = TextInteractionMode; - })(away.text || (away.text = {})); - var text = away.text; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The TextLineMetrics class contains information about the text position and - * measurements of a line of text within a text field. All measurements are in - * pixels. Objects of this class are returned by the - * away.entities.TextField.getLineMetrics() method. - */ - (function (text) { - var TextLineMetrics = (function () { - /** - * Creates a TextLineMetrics object. The TextLineMetrics object contains - * information about the text metrics of a line of text in a text field. - * Objects of this class are returned by the - * away.entities.TextField.getLineMetrics() method. - * - * @param x The left position of the first character in pixels. - * @param width The width of the text of the selected lines (not - * necessarily the complete text) in pixels. - * @param height The height of the text of the selected lines (not - * necessarily the complete text) in pixels. - * @param ascent The length from the baseline to the top of the line - * height in pixels. - * @param descent The length from the baseline to the bottom depth of - * the line in pixels. - * @param leading The measurement of the vertical distance between the - * lines of text. - */ - function TextLineMetrics(x, width, height, ascent, descent, leading) { - if (typeof x === "undefined") { x = NaN; } - if (typeof width === "undefined") { width = NaN; } - if (typeof height === "undefined") { height = NaN; } - if (typeof ascent === "undefined") { ascent = NaN; } - if (typeof descent === "undefined") { descent = NaN; } - if (typeof leading === "undefined") { leading = NaN; } - } - return TextLineMetrics; - })(); - text.TextLineMetrics = TextLineMetrics; - })(away.text || (away.text = {})); - var text = away.text; -})(away || (away = {})); -var away; -(function (away) { - /// - (function (ui) { - var Keyboard = (function () { - function Keyboard() { - } - Keyboard.A = 65; - - Keyboard.ALTERNATE = 18; - - Keyboard.AUDIO = 0x01000017; - - Keyboard.B = 66; - - Keyboard.BACK = 0x01000016; - - Keyboard.BACKQUOTE = 192; - - Keyboard.BACKSLASH = 220; - - Keyboard.BACKSPACE = 8; - - Keyboard.BLUE = 0x01000003; - - Keyboard.C = 67; - - Keyboard.CAPS_LOCK = 20; - - Keyboard.CHANNEL_DOWN = 0x01000005; - - Keyboard.CHANNEL_UP = 0x01000005; - - Keyboard.COMMA = 188; - - Keyboard.COMMAND = 15; - - Keyboard.CONTROL = 17; - - Keyboard.D = 68; - - Keyboard.DELETE = 46; - - Keyboard.DOWN = 40; - - Keyboard.DVR = 0x01000019; - - Keyboard.E = 69; - - Keyboard.END = 35; - - Keyboard.ENTER = 13; - - Keyboard.EQUAL = 187; - - Keyboard.ESCAPE = 27; - - Keyboard.EXIT = 0x01000015; - - Keyboard.F = 70; - - Keyboard.F1 = 112; - - Keyboard.F10 = 121; - - Keyboard.F11 = 122; - - Keyboard.F12 = 123; - - Keyboard.F13 = 124; - - Keyboard.F14 = 125; - - Keyboard.F15 = 126; - - Keyboard.F2 = 113; - - Keyboard.F3 = 114; - - Keyboard.F4 = 115; - - Keyboard.F5 = 116; - - Keyboard.F6 = 117; - - Keyboard.F7 = 118; - - Keyboard.F8 = 119; - - Keyboard.F9 = 120; - - Keyboard.FAST_FORWARD = 0x0100000A; - - Keyboard.G = 71; - - Keyboard.GREEN = 0x01000001; - - Keyboard.GUIDE = 0x01000014; - - Keyboard.H = 72; - - Keyboard.HELP = 0x0100001D; - - Keyboard.HOME = 36; - - Keyboard.I = 73; - - Keyboard.INFO = 0x01000013; - - Keyboard.INPUT = 0x0100001B; - - Keyboard.INSERT = 45; - - Keyboard.J = 74; - - Keyboard.K = 75; - - Keyboard.KEYNAME_BEGIN = "Begin"; - - Keyboard.KEYNAME_BREAK = "Break"; - - Keyboard.KEYNAME_CLEARDISPLAY = "ClrDsp"; - - Keyboard.KEYNAME_CLEARLINE = "ClrLn"; - - Keyboard.KEYNAME_DELETE = "Delete"; - - Keyboard.KEYNAME_DELETECHAR = "DelChr"; - - Keyboard.KEYNAME_DELETELINE = "DelLn"; - - Keyboard.KEYNAME_DOWNARROW = "Down"; - - Keyboard.KEYNAME_END = "End"; - - Keyboard.KEYNAME_EXECUTE = "Exec"; - - Keyboard.KEYNAME_F1 = "F1"; - - Keyboard.KEYNAME_F10 = "F10"; - - Keyboard.KEYNAME_F11 = "F11"; - - Keyboard.KEYNAME_F12 = "F12"; - - Keyboard.KEYNAME_F13 = "F13"; - - Keyboard.KEYNAME_F14 = "F14"; - - Keyboard.KEYNAME_F15 = "F15"; - - Keyboard.KEYNAME_F16 = "F16"; - - Keyboard.KEYNAME_F17 = "F17"; - - Keyboard.KEYNAME_F18 = "F18"; - - Keyboard.KEYNAME_F19 = "F19"; - - Keyboard.KEYNAME_F2 = "F2"; - - Keyboard.KEYNAME_F20 = "F20"; - - Keyboard.KEYNAME_F21 = "F21"; - - Keyboard.KEYNAME_F22 = "F22"; - - Keyboard.KEYNAME_F23 = "F23"; - - Keyboard.KEYNAME_F24 = "F24"; - - Keyboard.KEYNAME_F25 = "F25"; - - Keyboard.KEYNAME_F26 = "F26"; - - Keyboard.KEYNAME_F27 = "F27"; - - Keyboard.KEYNAME_F28 = "F28"; - - Keyboard.KEYNAME_F29 = "F29"; - - Keyboard.KEYNAME_F3 = "F3"; - - Keyboard.KEYNAME_F30 = "F30"; - - Keyboard.KEYNAME_F31 = "F31"; - - Keyboard.KEYNAME_F32 = "F32"; - - Keyboard.KEYNAME_F33 = "F33"; - - Keyboard.KEYNAME_F34 = "F34"; - - Keyboard.KEYNAME_F35 = "F35"; - - Keyboard.KEYNAME_F4 = "F4"; - - Keyboard.KEYNAME_F5 = "F5"; - - Keyboard.KEYNAME_F6 = "F6"; - - Keyboard.KEYNAME_F7 = "F7"; - - Keyboard.KEYNAME_F8 = "F8"; - - Keyboard.KEYNAME_F9 = "F9"; - - Keyboard.KEYNAME_FIND = "Find"; - - Keyboard.KEYNAME_HELP = "Help"; - - Keyboard.KEYNAME_HOME = "Home"; - - Keyboard.KEYNAME_INSERT = "Insert"; - - Keyboard.KEYNAME_INSERTCHAR = "InsChr"; - - Keyboard.KEYNAME_INSERTLINE = "LnsLn"; - - Keyboard.KEYNAME_LEFTARROW = "Left"; - - Keyboard.KEYNAME_MENU = "Menu"; - - Keyboard.KEYNAME_MODESWITCH = "ModeSw"; - - Keyboard.KEYNAME_NEXT = "Next"; - - Keyboard.KEYNAME_PAGEDOWN = "PgDn"; - - Keyboard.KEYNAME_PAGEUP = "PgUp"; - - Keyboard.KEYNAME_PAUSE = "Pause"; - - Keyboard.KEYNAME_PREV = "Prev"; - - Keyboard.KEYNAME_PRINT = "Print"; - - Keyboard.KEYNAME_PRINTSCREEN = "PrntScrn"; - - Keyboard.KEYNAME_REDO = "Redo"; - - Keyboard.KEYNAME_RESET = "Reset"; - - Keyboard.KEYNAME_RIGHTARROW = "Right"; - - Keyboard.KEYNAME_SCROLLLOCK = "ScrlLck"; - - Keyboard.KEYNAME_SELECT = "Select"; - - Keyboard.KEYNAME_STOP = "Stop"; - - Keyboard.KEYNAME_SYSREQ = "SysReq"; - - Keyboard.KEYNAME_SYSTEM = "Sys"; - - Keyboard.KEYNAME_UNDO = "Undo"; - - Keyboard.KEYNAME_UPARROW = "Up"; - - Keyboard.KEYNAME_USER = "User"; - - Keyboard.L = 76; - - Keyboard.LAST = 0x01000011; - - Keyboard.LEFT = 37; - - Keyboard.LEFTBRACKET = 219; - - Keyboard.LIVE = 0x01000010; - - Keyboard.M = 77; - - Keyboard.MASTER_SHELL = 0x0100001E; - - Keyboard.MENU = 0x01000012; - - Keyboard.MINUS = 189; - - Keyboard.N = 78; - - Keyboard.NEXT = 0x0100000E; - - Keyboard.NUMBER_0 = 48; - - Keyboard.NUMBER_1 = 49; - - Keyboard.NUMBER_2 = 50; - - Keyboard.NUMBER_3 = 51; - - Keyboard.NUMBER_4 = 52; - - Keyboard.NUMBER_5 = 53; - - Keyboard.NUMBER_6 = 54; - - Keyboard.NUMBER_7 = 55; - - Keyboard.NUMBER_8 = 56; - - Keyboard.NUMBER_9 = 57; - - Keyboard.NUMPAD = 21; - - Keyboard.NUMPAD_0 = 96; - - Keyboard.NUMPAD_1 = 97; - - Keyboard.NUMPAD_2 = 98; - - Keyboard.NUMPAD_3 = 99; - - Keyboard.NUMPAD_4 = 100; - - Keyboard.NUMPAD_5 = 101; - - Keyboard.NUMPAD_6 = 102; - - Keyboard.NUMPAD_7 = 103; - - Keyboard.NUMPAD_8 = 104; - - Keyboard.NUMPAD_9 = 105; - - Keyboard.NUMPAD_ADD = 107; - - Keyboard.NUMPAD_DECIMAL = 110; - - Keyboard.NUMPAD_DIVIDE = 111; - - Keyboard.NUMPAD_ENTER = 108; - - Keyboard.NUMPAD_MULTIPLY = 106; - - Keyboard.NUMPAD_SUBTRACT = 109; - - Keyboard.O = 79; - - Keyboard.P = 80; - - Keyboard.PAGE_DOWN = 34; - - Keyboard.PAGE_UP = 33; - - Keyboard.PAUSE = 0x01000008; - - Keyboard.PERIOD = 190; - - Keyboard.PLAY = 0x01000007; - - Keyboard.PREVIOUS = 0x0100000F; - - Keyboard.Q = 81; - - Keyboard.QUOTE = 222; - - Keyboard.R = 82; - - Keyboard.RECORD = 0x01000006; - - Keyboard.RED = 0x01000000; - - Keyboard.REWIND = 0x0100000B; - - Keyboard.RIGHT = 39; - - Keyboard.RIGHTBRACKET = 221; - - Keyboard.S = 83; - - Keyboard.SEARCH = 0x0100001F; - - Keyboard.SEMICOLON = 186; - - Keyboard.SETUP = 0x0100001C; - - Keyboard.SHIFT = 16; - - Keyboard.SKIP_BACKWARD = 0x0100000D; - - Keyboard.SKIP_FORWARD = 0x0100000C; - - Keyboard.SLASH = 191; - - Keyboard.SPACE = 32; - - Keyboard.STOP = 0x01000009; - - Keyboard.SUBTITLE = 0x01000018; - - Keyboard.T = 84; - - Keyboard.TAB = 9; - - Keyboard.U = 85; - - Keyboard.UP = 38; - - Keyboard.V = 86; - - Keyboard.VOD = 0x0100001A; - - Keyboard.W = 87; - - Keyboard.X = 88; - - Keyboard.Y = 89; - - Keyboard.YELLOW = 0x01000002; - - Keyboard.Z = 90; - return Keyboard; - })(); - ui.Keyboard = Keyboard; - })(away.ui || (away.ui = {})); - var ui = away.ui; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The DisplayObjectContainer class is the base class for all objects that can - * serve as display object containers on the display list. The display list - * manages all objects displayed in the Flash runtimes. Use the - * DisplayObjectContainer class to arrange the display objects in the display - * list. Each DisplayObjectContainer object has its own child list for - * organizing the z-order of the objects. The z-order is the front-to-back - * order that determines which object is drawn in front, which is behind, and - * so on. - * - *

DisplayObject is an abstract base class; therefore, you cannot call - * DisplayObject directly. Invoking new DisplayObject() throws an - * ArgumentError exception.

- * The DisplayObjectContainer class is an abstract base class for all objects - * that can contain child objects. It cannot be instantiated directly; calling - * the new DisplayObjectContainer() constructor throws an - * ArgumentError exception. - * - *

For more information, see the "Display Programming" chapter of the - * ActionScript 3.0 Developer's Guide.

- */ - (function (containers) { - var ArgumentError = away.errors.ArgumentError; - var Error = away.errors.Error; - var RangeError = away.errors.RangeError; - - var AssetType = away.library.AssetType; - - var DisplayObjectContainer = (function (_super) { - __extends(DisplayObjectContainer, _super); - /** - * Calling the new DisplayObjectContainer() constructor throws - * an ArgumentError exception. You can, however, call - * constructors for the following subclasses of DisplayObjectContainer: - *
    - *
  • new Loader()
  • - *
  • new Sprite()
  • - *
  • new MovieClip()
  • - *
- */ - function DisplayObjectContainer() { - _super.call(this); - this._mouseChildren = true; - this._children = new Array(); - } - Object.defineProperty(DisplayObjectContainer.prototype, "assetType", { - /** - * - */ - get: function () { - return AssetType.CONTAINER; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DisplayObjectContainer.prototype, "mouseChildren", { - /** - * Determines whether or not the children of the object are mouse, or user - * input device, enabled. If an object is enabled, a user can interact with - * it by using a mouse or user input device. The default is - * true. - * - *

This property is useful when you create a button with an instance of - * the Sprite class(instead of using the SimpleButton class). When you use a - * Sprite instance to create a button, you can choose to decorate the button - * by using the addChild() method to add additional Sprite - * instances. This process can cause unexpected behavior with mouse events - * because the Sprite instances you add as children can become the target - * object of a mouse event when you expect the parent instance to be the - * target object. To ensure that the parent instance serves as the target - * objects for mouse events, you can set the mouseChildren - * property of the parent instance to false.

- * - *

No event is dispatched by setting this property. You must use the - * addEventListener() method to create interactive - * functionality.

- */ - get: function () { - return this._mouseChildren; - }, - set: function (value) { - if (this._mouseChildren == value) - return; - - this._mouseChildren = value; - - this._pUpdateImplicitMouseEnabled(this._pParent ? this._pParent.mouseChildren : true); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DisplayObjectContainer.prototype, "numChildren", { - /** - * Returns the number of children of this object. - */ - get: function () { - return this._children.length; - }, - enumerable: true, - configurable: true - }); - - /** - * Adds a child DisplayObject instance to this DisplayObjectContainer - * instance. The child is added to the front(top) of all other children in - * this DisplayObjectContainer instance.(To add a child to a specific index - * position, use the addChildAt() method.) - * - *

If you add a child object that already has a different display object - * container as a parent, the object is removed from the child list of the - * other display object container.

- * - *

Note: The command stage.addChild() can cause - * problems with a published SWF file, including security problems and - * conflicts with other loaded SWF files. There is only one Stage within a - * Flash runtime instance, no matter how many SWF files you load into the - * runtime. So, generally, objects should not be added to the Stage, - * directly, at all. The only object the Stage should contain is the root - * object. Create a DisplayObjectContainer to contain all of the items on the - * display list. Then, if necessary, add that DisplayObjectContainer instance - * to the Stage.

- * - * @param child The DisplayObject instance to add as a child of this - * DisplayObjectContainer instance. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child is the same as the parent. Also - * throws if the caller is a child(or grandchild etc.) - * of the child being added. - * @event added Dispatched when a display object is added to the display - * list. - */ - DisplayObjectContainer.prototype.addChild = function (child) { - if (child == null) - throw new Error("Parameter child cannot be null."); - - //if child already has a parent, remove it. - if (child._pParent) - child._pParent.removeChildInternal(child); - - child.iSetParent(this); - - this._children.push(child); - - return child; - }; - - /** - * Adds a child DisplayObject instance to this DisplayObjectContainer - * instance. The child is added at the index position specified. An index of - * 0 represents the back(bottom) of the display list for this - * DisplayObjectContainer object. - * - *

For example, the following example shows three display objects, labeled - * a, b, and c, at index positions 0, 2, and 1, respectively:

- * - *

If you add a child object that already has a different display object - * container as a parent, the object is removed from the child list of the - * other display object container.

- * - * @param child The DisplayObject instance to add as a child of this - * DisplayObjectContainer instance. - * @param index The index position to which the child is added. If you - * specify a currently occupied index position, the child object - * that exists at that position and all higher positions are - * moved up one position in the child list. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child is the same as the parent. Also - * throws if the caller is a child(or grandchild etc.) - * of the child being added. - * @throws RangeError Throws if the index position does not exist in the - * child list. - * @event added Dispatched when a display object is added to the display - * list. - */ - DisplayObjectContainer.prototype.addChildAt = function (child, index /*int*/ ) { - return child; - }; - - DisplayObjectContainer.prototype.addChildren = function () { - var childarray = []; - for (var _i = 0; _i < (arguments.length - 0); _i++) { - childarray[_i] = arguments[_i + 0]; - } - var len = childarray.length; - for (var i = 0; i < len; i++) - this.addChild(childarray[i]); - }; - - /** - * - */ - DisplayObjectContainer.prototype.clone = function () { - var clone = new DisplayObjectContainer(); - clone.pivot = this.pivot; - clone._iMatrix3D = this._iMatrix3D; - clone.partition = this.partition; - clone.name = name; - - var len = this._children.length; - for (var i = 0; i < len; ++i) - clone.addChild(this._children[i].clone()); - - // todo: implement for all subtypes - return clone; - }; - - /** - * Determines whether the specified display object is a child of the - * DisplayObjectContainer instance or the instance itself. The search - * includes the entire display list including this DisplayObjectContainer - * instance. Grandchildren, great-grandchildren, and so on each return - * true. - * - * @param child The child object to test. - * @return true if the child object is a child of - * the DisplayObjectContainer or the container itself; otherwise - * false. - */ - DisplayObjectContainer.prototype.contains = function (child) { - return this._children.indexOf(child) >= 0; - }; - - /** - * - */ - DisplayObjectContainer.prototype.disposeWithChildren = function () { - this.dispose(); - - while (this.numChildren > 0) - this.getChildAt(0).dispose(); - }; - - /** - * Returns the child display object instance that exists at the specified - * index. - * - * @param index The index position of the child object. - * @return The child display object at the specified index position. - * @throws RangeError Throws if the index does not exist in the child - * list. - */ - DisplayObjectContainer.prototype.getChildAt = function (index /*int*/ ) { - var child = this._children[index]; - - if (child == null) - throw new RangeError("Index does not exist in the child list of the caller"); - - return child; - }; - - /** - * Returns the child display object that exists with the specified name. If - * more that one child display object has the specified name, the method - * returns the first object in the child list. - * - *

The getChildAt() method is faster than the - * getChildByName() method. The getChildAt() method - * accesses a child from a cached array, whereas the - * getChildByName() method has to traverse a linked list to - * access a child.

- * - * @param name The name of the child to return. - * @return The child display object with the specified name. - */ - DisplayObjectContainer.prototype.getChildByName = function (name) { - var len = this._children.length; - for (var i = 0; i < len; ++i) - if (this._children[i].name == name) - return this._children[i]; - - return null; - }; - - /** - * Returns the index position of a child DisplayObject instance. - * - * @param child The DisplayObject instance to identify. - * @return The index position of the child display object to identify. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - */ - DisplayObjectContainer.prototype.getChildIndex = function (child) { - var childIndex = this._children.indexOf(child); - - if (childIndex == -1) - throw new ArgumentError("Child parameter is not a child of the caller"); - - return childIndex; - }; - - /** - * Returns an array of objects that lie under the specified point and are - * children(or grandchildren, and so on) of this DisplayObjectContainer - * instance. Any child objects that are inaccessible for security reasons are - * omitted from the returned array. To determine whether this security - * restriction affects the returned array, call the - * areInaccessibleObjectsUnderPoint() method. - * - *

The point parameter is in the coordinate space of the - * Stage, which may differ from the coordinate space of the display object - * container(unless the display object container is the Stage). You can use - * the globalToLocal() and the localToGlobal() - * methods to convert points between these coordinate spaces.

- * - * @param point The point under which to look. - * @return An array of objects that lie under the specified point and are - * children(or grandchildren, and so on) of this - * DisplayObjectContainer instance. - */ - DisplayObjectContainer.prototype.getObjectsUnderPoint = function (point) { - return new Array(); - }; - - /** - * Removes the specified child DisplayObject instance from the - * child list of the DisplayObjectContainer instance. The parent - * property of the removed child is set to null , and the object - * is garbage collected if no other references to the child exist. The index - * positions of any display objects above the child in the - * DisplayObjectContainer are decreased by 1. - * - *

The garbage collector reallocates unused memory space. When a variable - * or object is no longer actively referenced or stored somewhere, the - * garbage collector sweeps through and wipes out the memory space it used to - * occupy if no other references to it exist.

- * - * @param child The DisplayObject instance to remove. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - */ - DisplayObjectContainer.prototype.removeChild = function (child) { - if (child == null) - throw new Error("Parameter child cannot be null"); - - this.removeChildInternal(child); - - child.iSetParent(null); - - return child; - }; - - /** - * Removes a child DisplayObject from the specified index - * position in the child list of the DisplayObjectContainer. The - * parent property of the removed child is set to - * null, and the object is garbage collected if no other - * references to the child exist. The index positions of any display objects - * above the child in the DisplayObjectContainer are decreased by 1. - * - *

The garbage collector reallocates unused memory space. When a variable - * or object is no longer actively referenced or stored somewhere, the - * garbage collector sweeps through and wipes out the memory space it used to - * occupy if no other references to it exist.

- * - * @param index The child index of the DisplayObject to remove. - * @return The DisplayObject instance that was removed. - * @throws RangeError Throws if the index does not exist in the child - * list. - * @throws SecurityError This child display object belongs to a sandbox to - * which the calling object does not have access. You - * can avoid this situation by having the child movie - * call the Security.allowDomain() method. - */ - DisplayObjectContainer.prototype.removeChildAt = function (index /*int*/ ) { - return this.removeChild(this._children[index]); - }; - - /** - * Removes all child DisplayObject instances from the child list - * of the DisplayObjectContainer instance. The parent property - * of the removed children is set to null, and the objects are - * garbage collected if no other references to the children exist. - * - * The garbage collector reallocates unused memory space. When a variable or - * object is no longer actively referenced or stored somewhere, the garbage - * collector sweeps through and wipes out the memory space it used to occupy - * if no other references to it exist. - * - * @param beginIndex The beginning position. A value smaller than 0 throws a RangeError. - * @param endIndex The ending position. A value smaller than 0 throws a RangeError. - * @throws RangeError Throws if the beginIndex or endIndex positions do - * not exist in the child list. - */ - DisplayObjectContainer.prototype.removeChildren = function (beginIndex, endIndex) { - if (typeof beginIndex === "undefined") { beginIndex = 0; } - if (typeof endIndex === "undefined") { endIndex = 2147483647; } - if (beginIndex < 0) - throw new RangeError("beginIndex is out of range of the child list"); - - if (endIndex > this._children.length) - throw new RangeError("endIndex is out of range of the child list"); - - for (var i = beginIndex; i < endIndex; i++) - this.removeChild(this._children[i]); - }; - - /** - * Changes the position of an existing child in the display object container. - * This affects the layering of child objects. For example, the following - * example shows three display objects, labeled a, b, and c, at index - * positions 0, 1, and 2, respectively: - * - *

When you use the setChildIndex() method and specify an - * index position that is already occupied, the only positions that change - * are those in between the display object's former and new position. All - * others will stay the same. If a child is moved to an index LOWER than its - * current index, all children in between will INCREASE by 1 for their index - * reference. If a child is moved to an index HIGHER than its current index, - * all children in between will DECREASE by 1 for their index reference. For - * example, if the display object container in the previous example is named - * container, you can swap the position of the display objects - * labeled a and b by calling the following code:

- * - *

This code results in the following arrangement of objects:

- * - * @param child The child DisplayObject instance for which you want to change - * the index number. - * @param index The resulting index number for the child display - * object. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - * @throws RangeError Throws if the index does not exist in the child - * list. - */ - DisplayObjectContainer.prototype.setChildIndex = function (child, index /*int*/ ) { - //TODO - }; - - /** - * Swaps the z-order (front-to-back order) of the two specified child - * objects. All other child objects in the display object container remain in - * the same index positions. - * - * @param child1 The first child object. - * @param child2 The second child object. - * @throws ArgumentError Throws if either child parameter is not a child of - * this object. - */ - DisplayObjectContainer.prototype.swapChildren = function (child1, child2) { - //TODO - }; - - /** - * Swaps the z-order(front-to-back order) of the child objects at the two - * specified index positions in the child list. All other child objects in - * the display object container remain in the same index positions. - * - * @param index1 The index position of the first child object. - * @param index2 The index position of the second child object. - * @throws RangeError If either index does not exist in the child list. - */ - DisplayObjectContainer.prototype.swapChildrenAt = function (index1 /*int*/ , index2 /*int*/ ) { - //TODO - }; - - /** - * @protected - */ - DisplayObjectContainer.prototype.pInvalidateSceneTransform = function () { - _super.prototype.pInvalidateSceneTransform.call(this); - - var len = this._children.length; - for (var i = 0; i < len; ++i) - this._children[i].pInvalidateSceneTransform(); - }; - - /** - * @protected - */ - DisplayObjectContainer.prototype._pUpdateScene = function (value) { - _super.prototype._pUpdateScene.call(this, value); - - var len = this._children.length; - for (var i = 0; i < len; ++i) - this._children[i]._pUpdateScene(value); - }; - - /** - * @protected - */ - DisplayObjectContainer.prototype._pUpdateImplicitMouseEnabled = function (value) { - _super.prototype._pUpdateImplicitMouseEnabled.call(this, value); - - var len = this._children.length; - for (var i = 0; i < len; ++i) - this._children[i]._pUpdateImplicitMouseEnabled(this._mouseChildren); - }; - - /** - * @protected - */ - DisplayObjectContainer.prototype._pUpdateImplicitVisibility = function (value) { - _super.prototype._pUpdateImplicitVisibility.call(this, value); - - var len = this._children.length; - for (var i = 0; i < len; ++i) - this._children[i]._pUpdateImplicitVisibility(this._pImplicitVisibility); - }; - - /** - * @protected - */ - DisplayObjectContainer.prototype._pUpdateImplicitPartition = function (value) { - _super.prototype._pUpdateImplicitPartition.call(this, value); - - var len = this._children.length; - for (var i = 0; i < len; ++i) - this._children[i]._pUpdateImplicitPartition(this._pImplicitPartition); - }; - - /** - * @private - * - * @param child - */ - DisplayObjectContainer.prototype.removeChildInternal = function (child) { - this._children.splice(this.getChildIndex(child), 1); - - return child; - }; - return DisplayObjectContainer; - })(away.base.DisplayObject); - containers.DisplayObjectContainer = DisplayObjectContainer; - })(away.containers || (away.containers = {})); - var containers = away.containers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (base) { - var AbstractMethodError = away.errors.AbstractMethodError; - var LightEvent = away.events.LightEvent; - - var AssetType = away.library.AssetType; - - var LightBase = (function (_super) { - __extends(LightBase, _super); - function LightBase() { - _super.call(this); - this._color = 0xffffff; - this._colorR = 1; - this._colorG = 1; - this._colorB = 1; - this._ambientColor = 0xffffff; - this._ambient = 0; - this._iAmbientR = 0; - this._iAmbientG = 0; - this._iAmbientB = 0; - this._specular = 1; - this._iSpecularR = 1; - this._iSpecularG = 1; - this._iSpecularB = 1; - this._diffuse = 1; - this._iDiffuseR = 1; - this._iDiffuseG = 1; - this._iDiffuseB = 1; - this._castsShadows = false; - } - Object.defineProperty(LightBase.prototype, "castsShadows", { - get: function () { - return this._castsShadows; - }, - set: function (value) { - if (this._castsShadows == value) - return; - - this._castsShadows = value; - - if (value) { - if (this._shadowMapper == null) - this._shadowMapper = this.pCreateShadowMapper(); - - this._shadowMapper.light = this; - } else { - this._shadowMapper.dispose(); - this._shadowMapper = null; - } - - //*/ - this.dispatchEvent(new LightEvent(LightEvent.CASTS_SHADOW_CHANGE)); - }, - enumerable: true, - configurable: true - }); - - - LightBase.prototype.pCreateShadowMapper = function () { - throw new AbstractMethodError(); - }; - - Object.defineProperty(LightBase.prototype, "specular", { - get: function () { - return this._specular; - }, - set: function (value) { - if (value < 0) - value = 0; - - this._specular = value; - this.updateSpecular(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LightBase.prototype, "diffuse", { - get: function () { - return this._diffuse; - }, - set: function (value) { - if (value < 0) - value = 0; - - this._diffuse = value; - this.updateDiffuse(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LightBase.prototype, "color", { - get: function () { - return this._color; - }, - set: function (value) { - this._color = value; - this._colorR = ((this._color >> 16) & 0xff) / 0xff; - this._colorG = ((this._color >> 8) & 0xff) / 0xff; - this._colorB = (this._color & 0xff) / 0xff; - - this.updateDiffuse(); - this.updateSpecular(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LightBase.prototype, "ambient", { - get: function () { - return this._ambient; - }, - set: function (value) { - if (value < 0) - value = 0; - else if (value > 1) - value = 1; - - this._ambient = value; - this.updateAmbient(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LightBase.prototype, "ambientColor", { - get: function () { - return this._ambientColor; - }, - set: function (value) { - this._ambientColor = value; - this.updateAmbient(); - }, - enumerable: true, - configurable: true - }); - - - LightBase.prototype.updateAmbient = function () { - this._iAmbientR = ((this._ambientColor >> 16) & 0xff) / 0xff * this._ambient; - this._iAmbientG = ((this._ambientColor >> 8) & 0xff) / 0xff * this._ambient; - this._iAmbientB = (this._ambientColor & 0xff) / 0xff * this._ambient; - }; - - LightBase.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { - if (typeof target === "undefined") { target = null; } - throw new AbstractMethodError(); - }; - - Object.defineProperty(LightBase.prototype, "assetType", { - //@override - get: function () { - return AssetType.LIGHT; - }, - enumerable: true, - configurable: true - }); - - LightBase.prototype.updateSpecular = function () { - this._iSpecularR = this._colorR * this._specular; - this._iSpecularG = this._colorG * this._specular; - this._iSpecularB = this._colorB * this._specular; - }; - - LightBase.prototype.updateDiffuse = function () { - this._iDiffuseR = this._colorR * this._diffuse; - this._iDiffuseG = this._colorG * this._diffuse; - this._iDiffuseB = this._colorB * this._diffuse; - }; - - Object.defineProperty(LightBase.prototype, "shadowMapper", { - get: function () { - return this._shadowMapper; - }, - set: function (value) { - this._shadowMapper = value; - this._shadowMapper.light = this; - }, - enumerable: true, - configurable: true - }); - - return LightBase; - })(away.containers.DisplayObjectContainer); - base.LightBase = LightBase; - })(away.base || (away.base = {})); - var base = away.base; -})(away || (away = {})); -var away; -(function (away) { - (function (projections) { - /** - * Provides constant values for camera lens projection options use the the coordinateSystem property - * - * @see away.projections.PerspectiveLens#coordinateSystem - */ - var CoordinateSystem = (function () { - function CoordinateSystem() { - } - CoordinateSystem.LEFT_HANDED = "leftHanded"; - - CoordinateSystem.RIGHT_HANDED = "rightHanded"; - return CoordinateSystem; - })(); - projections.CoordinateSystem = CoordinateSystem; - })(away.projections || (away.projections = {})); - var projections = away.projections; -})(away || (away = {})); -/// -/// -var away; -(function (away) { - (function (projections) { - var ProjectionBase = (function (_super) { - __extends(ProjectionBase, _super); - function ProjectionBase(coordinateSystem) { - if (typeof coordinateSystem === "undefined") { coordinateSystem = "leftHanded"; } - _super.call(this); - this._pMatrix = new away.geom.Matrix3D(); - this._pScissorRect = new away.geom.Rectangle(); - this._pViewPort = new away.geom.Rectangle(); - this._pNear = 20; - this._pFar = 3000; - this._pAspectRatio = 1; - this._pMatrixInvalid = true; - this._pFrustumCorners = []; - this._pOriginX = 0.5; - this._pOriginY = 0.5; - this._unprojectionInvalid = true; - - this.coordinateSystem = coordinateSystem; - } - Object.defineProperty(ProjectionBase.prototype, "coordinateSystem", { - /** - * The handedness of the coordinate system projection. The default is LEFT_HANDED. - */ - get: function () { - return this._pCoordinateSystem; - }, - set: function (value) { - if (this._pCoordinateSystem == value) - return; - - this._pCoordinateSystem = value; - - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ProjectionBase.prototype, "frustumCorners", { - get: function () { - return this._pFrustumCorners; - }, - set: function (frustumCorners) { - this._pFrustumCorners = frustumCorners; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ProjectionBase.prototype, "matrix", { - get: function () { - if (this._pMatrixInvalid) { - this.pUpdateMatrix(); - this._pMatrixInvalid = false; - } - return this._pMatrix; - }, - set: function (value) { - this._pMatrix = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ProjectionBase.prototype, "near", { - get: function () { - return this._pNear; - }, - set: function (value) { - if (value == this._pNear) { - return; - } - this._pNear = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ProjectionBase.prototype, "originX", { - get: function () { - return this._pOriginX; - }, - set: function (value) { - if (this._pOriginX == value) - return; - - this._pOriginX = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ProjectionBase.prototype, "originY", { - get: function () { - return this._pOriginY; - }, - set: function (value) { - if (this._pOriginY == value) - return; - - this._pOriginY = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ProjectionBase.prototype, "far", { - get: function () { - return this._pFar; - }, - set: function (value) { - if (value == this._pFar) { - return; - } - this._pFar = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - ProjectionBase.prototype.project = function (point3d) { - var v = this.matrix.transformVector(point3d); - v.x = v.x / v.w; - v.y = -v.y / v.w; - - //z is unaffected by transform - v.z = point3d.z; - - return v; - }; - - Object.defineProperty(ProjectionBase.prototype, "unprojectionMatrix", { - get: function () { - if (this._unprojectionInvalid) { - if (!this._unprojection) - this._unprojection = new away.geom.Matrix3D(); - - this._unprojection.copyFrom(this.matrix); - this._unprojection.invert(); - this._unprojectionInvalid = false; - } - return this._unprojection; - }, - enumerable: true, - configurable: true - }); - - ProjectionBase.prototype.unproject = function (nX, nY, sZ) { - throw new away.errors.AbstractMethodError(); - }; - - ProjectionBase.prototype.clone = function () { - throw new away.errors.AbstractMethodError(); - }; - - Object.defineProperty(ProjectionBase.prototype, "_iAspectRatio", { - get: function () { - return this._pAspectRatio; - }, - set: function (value) { - if (this._pAspectRatio == value) - return; - - this._pAspectRatio = value; - - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - ProjectionBase.prototype.pInvalidateMatrix = function () { - this._pMatrixInvalid = true; - this._unprojectionInvalid = true; - this.dispatchEvent(new away.events.ProjectionEvent(away.events.ProjectionEvent.MATRIX_CHANGED, this)); - }; - - ProjectionBase.prototype.pUpdateMatrix = function () { - throw new away.errors.AbstractMethodError(); - }; - - ProjectionBase.prototype._iUpdateScissorRect = function (x, y, width, height) { - this._pScissorRect.x = x; - this._pScissorRect.y = y; - this._pScissorRect.width = width; - this._pScissorRect.height = height; - this.pInvalidateMatrix(); - }; - - ProjectionBase.prototype._iUpdateViewport = function (x, y, width, height) { - this._pViewPort.x = x; - this._pViewPort.y = y; - this._pViewPort.width = width; - this._pViewPort.height = height; - this.pInvalidateMatrix(); - }; - return ProjectionBase; - })(away.events.EventDispatcher); - projections.ProjectionBase = ProjectionBase; - })(away.projections || (away.projections = {})); - var projections = away.projections; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (projections) { - var PerspectiveProjection = (function (_super) { - __extends(PerspectiveProjection, _super); - function PerspectiveProjection(fieldOfView, coordinateSystem) { - if (typeof fieldOfView === "undefined") { fieldOfView = 60; } - if (typeof coordinateSystem === "undefined") { coordinateSystem = "leftHanded"; } - _super.call(this, coordinateSystem); - this._fieldOfView = 60; - this._focalLength = 1000; - this._hFieldOfView = 60; - this._hFocalLength = 1000; - this._preserveAspectRatio = true; - this._preserveFocalLength = false; - this.fieldOfView = fieldOfView; - } - Object.defineProperty(PerspectiveProjection.prototype, "preserveAspectRatio", { - /** - * - */ - get: function () { - return this._preserveAspectRatio; - }, - set: function (value) { - if (this._preserveAspectRatio == value) - return; - - this._preserveAspectRatio = value; - - if (this._preserveAspectRatio) - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PerspectiveProjection.prototype, "preserveFocalLength", { - /** - * - */ - get: function () { - return this._preserveFocalLength; - }, - set: function (value) { - if (this._preserveFocalLength == value) - return; - - this._preserveFocalLength = value; - - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PerspectiveProjection.prototype, "fieldOfView", { - /** - * - */ - get: function () { - return this._fieldOfView; - }, - set: function (value) { - if (this._fieldOfView == value) - return; - - this._fieldOfView = value; - - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PerspectiveProjection.prototype, "focalLength", { - /** - * - */ - get: function () { - return this._focalLength; - }, - set: function (value) { - if (this._focalLength == value) - return; - - this._focalLength = value; - - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PerspectiveProjection.prototype, "hFieldOfView", { - /** - * - */ - get: function () { - return this._hFieldOfView; - }, - set: function (value) { - if (this._hFieldOfView == value) - return; - - this._hFieldOfView = value; - - this._hFocalLength = 1 / Math.tan(this._hFieldOfView * Math.PI / 360); - - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PerspectiveProjection.prototype, "hFocalLength", { - /** - * - */ - get: function () { - return this._hFocalLength; - }, - set: function (value) { - if (this._hFocalLength == value) - return; - - this._hFocalLength = value; - - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - //@override - PerspectiveProjection.prototype.unproject = function (nX, nY, sZ) { - var v = new away.geom.Vector3D(nX, -nY, sZ, 1.0); - - v.x *= sZ; - v.y *= sZ; - - v = this.unprojectionMatrix.transformVector(v); - - //z is unaffected by transform - v.z = sZ; - - return v; - }; - - //@override - PerspectiveProjection.prototype.clone = function () { - var clone = new PerspectiveProjection(this._fieldOfView); - clone._pNear = this._pNear; - clone._pFar = this._pFar; - clone._pAspectRatio = this._pAspectRatio; - clone._pCoordinateSystem = this._pCoordinateSystem; - return clone; - }; - - //@override - PerspectiveProjection.prototype.pUpdateMatrix = function () { - var raw = []; - - if (this._preserveFocalLength) { - if (this._preserveAspectRatio) - this._hFocalLength = this._focalLength; - - this._fieldOfView = Math.atan(0.5 * this._pScissorRect.height / this._focalLength) * 360 / Math.PI; - this._hFieldOfView = Math.atan(0.5 * this._pScissorRect.width / this._hFocalLength) * 360 / Math.PI; - } else { - this._focalLength = 0.5 * this._pScissorRect.height / Math.tan(this._fieldOfView * Math.PI / 360); - - if (this._preserveAspectRatio) - this._hFocalLength = this._focalLength; - else - this._hFocalLength = 0.5 * this._pScissorRect.width / Math.tan(this._hFieldOfView * Math.PI / 360); - } - - var tanMinX = -this._pOriginX / this._hFocalLength; - var tanMaxX = (1 - this._pOriginX) / this._hFocalLength; - var tanMinY = -this._pOriginY / this._focalLength; - var tanMaxY = (1 - this._pOriginY) / this._focalLength; - - var left; - var right; - var top; - var bottom; - - // assume scissored frustum - var center = -((tanMinX - tanMaxX) * this._pScissorRect.x + tanMinX * this._pScissorRect.width); - var middle = ((tanMinY - tanMaxY) * this._pScissorRect.y + tanMinY * this._pScissorRect.height); - - left = center - (tanMaxX - tanMinX) * this._pViewPort.width; - right = center; - top = middle; - bottom = middle + (tanMaxY - tanMinY) * this._pViewPort.height; - - raw[0] = 2 / (right - left); - raw[5] = 2 / (bottom - top); - raw[8] = (right + left) / (right - left); - raw[9] = (bottom + top) / (bottom - top); - raw[10] = (this._pFar + this._pNear) / (this._pFar - this._pNear); - raw[11] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[12] = raw[13] = raw[15] = 0; - raw[14] = -2 * this._pFar * this._pNear / (this._pFar - this._pNear); - - if (this._pCoordinateSystem == projections.CoordinateSystem.RIGHT_HANDED) - raw[5] = -raw[5]; - - this._pMatrix.copyRawDataFrom(raw); - - this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pNear * left; - this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pNear * right; - this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pNear * top; - this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pNear * bottom; - - this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._pFar * left; - this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._pFar * right; - this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._pFar * top; - this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._pFar * bottom; - - this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; - this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; - - this._pMatrixInvalid = false; - }; - return PerspectiveProjection; - })(projections.ProjectionBase); - projections.PerspectiveProjection = PerspectiveProjection; - })(away.projections || (away.projections = {})); - var projections = away.projections; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (projections) { - var FreeMatrixProjection = (function (_super) { - __extends(FreeMatrixProjection, _super); - function FreeMatrixProjection() { - _super.call(this); - this._pMatrix.copyFrom(new projections.PerspectiveProjection().matrix); - } - Object.defineProperty(FreeMatrixProjection.prototype, "near", { - //@override - set: function (value) { - this._pNear = value; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(FreeMatrixProjection.prototype, "far", { - //@override - set: function (value) { - this._pFar = value; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(FreeMatrixProjection.prototype, "iAspectRatio", { - //@override - set: function (value) { - this._pAspectRatio = value; - }, - enumerable: true, - configurable: true - }); - - //@override - FreeMatrixProjection.prototype.clone = function () { - var clone = new FreeMatrixProjection(); - clone._pMatrix.copyFrom(this._pMatrix); - clone._pNear = this._pNear; - clone._pFar = this._pFar; - clone._pAspectRatio = this._pAspectRatio; - clone.pInvalidateMatrix(); - return clone; - }; - - //@override - FreeMatrixProjection.prototype.pUpdateMatrix = function () { - this._pMatrixInvalid = false; - }; - return FreeMatrixProjection; - })(projections.ProjectionBase); - projections.FreeMatrixProjection = FreeMatrixProjection; - })(away.projections || (away.projections = {})); - var projections = away.projections; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (projections) { - var OrthographicProjection = (function (_super) { - __extends(OrthographicProjection, _super); - function OrthographicProjection(projectionHeight) { - if (typeof projectionHeight === "undefined") { projectionHeight = 500; } - _super.call(this); - this._projectionHeight = projectionHeight; - } - Object.defineProperty(OrthographicProjection.prototype, "projectionHeight", { - get: function () { - return this._projectionHeight; - }, - set: function (value) { - if (value == this._projectionHeight) { - return; - } - this._projectionHeight = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - //@override - OrthographicProjection.prototype.unproject = function (nX, nY, sZ) { - var v = new away.geom.Vector3D(nX + this.matrix.rawData[12], -nY + this.matrix.rawData[13], sZ, 1.0); - v = this.unprojectionMatrix.transformVector(v); - - //z is unaffected by transform - v.z = sZ; - - return v; - }; - - //@override - OrthographicProjection.prototype.clone = function () { - var clone = new OrthographicProjection(); - clone._pNear = this._pNear; - clone._pFar = this._pFar; - clone._pAspectRatio = this._pAspectRatio; - clone.projectionHeight = this._projectionHeight; - return clone; - }; - - //@override - OrthographicProjection.prototype.pUpdateMatrix = function () { - var raw = []; - this._yMax = this._projectionHeight * .5; - this._xMax = this._yMax * this._pAspectRatio; - - var left; - var right; - var top; - var bottom; - - if (this._pScissorRect.x == 0 && this._pScissorRect.y == 0 && this._pScissorRect.width == this._pViewPort.width && this._pScissorRect.height == this._pViewPort.height) { - // assume symmetric frustum - left = -this._xMax; - right = this._xMax; - top = -this._yMax; - bottom = this._yMax; - - raw[0] = 2 / (this._projectionHeight * this._pAspectRatio); - raw[5] = 2 / this._projectionHeight; - raw[10] = 1 / (this._pFar - this._pNear); - raw[14] = this._pNear / (this._pNear - this._pFar); - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = raw[12] = raw[13] = 0; - raw[15] = 1; - } else { - var xWidth = this._xMax * (this._pViewPort.width / this._pScissorRect.width); - var yHgt = this._yMax * (this._pViewPort.height / this._pScissorRect.height); - var center = this._xMax * (this._pScissorRect.x * 2 - this._pViewPort.width) / this._pScissorRect.width + this._xMax; - var middle = -this._yMax * (this._pScissorRect.y * 2 - this._pViewPort.height) / this._pScissorRect.height - this._yMax; - - left = center - xWidth; - right = center + xWidth; - top = middle - yHgt; - bottom = middle + yHgt; - - raw[0] = 2 * 1 / (right - left); - raw[5] = -2 * 1 / (top - bottom); - raw[10] = 1 / (this._pFar - this._pNear); - - raw[12] = (right + left) / (right - left); - raw[13] = (bottom + top) / (bottom - top); - raw[14] = this._pNear / (this.near - this.far); - - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - raw[15] = 1; - } - - this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = left; - this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = right; - this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = top; - this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = bottom; - this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; - this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; - - this._pMatrix.copyRawDataFrom(raw); - - this._pMatrixInvalid = false; - }; - return OrthographicProjection; - })(projections.ProjectionBase); - projections.OrthographicProjection = OrthographicProjection; - })(away.projections || (away.projections = {})); - var projections = away.projections; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (projections) { - var OrthographicOffCenterProjection = (function (_super) { - __extends(OrthographicOffCenterProjection, _super); - function OrthographicOffCenterProjection(minX, maxX, minY, maxY) { - _super.call(this); - this._minX = minX; - this._maxX = maxX; - this._minY = minY; - this._maxY = maxY; - } - Object.defineProperty(OrthographicOffCenterProjection.prototype, "minX", { - get: function () { - return this._minX; - }, - set: function (value) { - this._minX = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(OrthographicOffCenterProjection.prototype, "maxX", { - get: function () { - return this._maxX; - }, - set: function (value) { - this._maxX = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(OrthographicOffCenterProjection.prototype, "minY", { - get: function () { - return this._minY; - }, - set: function (value) { - this._minY = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(OrthographicOffCenterProjection.prototype, "maxY", { - get: function () { - return this._maxY; - }, - set: function (value) { - this._maxY = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - //@override - OrthographicOffCenterProjection.prototype.unproject = function (nX, nY, sZ) { - var v = new away.geom.Vector3D(nX, -nY, sZ, 1.0); - v = this.unprojectionMatrix.transformVector(v); - - //z is unaffected by transform - v.z = sZ; - - return v; - }; - - //@override - OrthographicOffCenterProjection.prototype.clone = function () { - var clone = new OrthographicOffCenterProjection(this._minX, this._maxX, this._minY, this._maxY); - clone._pNear = this._pNear; - clone._pFar = this._pFar; - clone._pAspectRatio = this._pAspectRatio; - return clone; - }; - - //@override - OrthographicOffCenterProjection.prototype.pUpdateMatrix = function () { - var raw = []; - var w = 1 / (this._maxX - this._minX); - var h = 1 / (this._maxY - this._minY); - var d = 1 / (this._pFar - this._pNear); - - raw[0] = 2 * w; - raw[5] = 2 * h; - raw[10] = d; - raw[12] = -(this._maxX + this._minX) * w; - raw[13] = -(this._maxY + this._minY) * h; - raw[14] = -this._pNear * d; - raw[15] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - this._pMatrix.copyRawDataFrom(raw); - - this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._minX; - this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._maxX; - this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._minY; - this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._maxY; - this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; - this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; - - this._pMatrixInvalid = false; - }; - return OrthographicOffCenterProjection; - })(projections.ProjectionBase); - projections.OrthographicOffCenterProjection = OrthographicOffCenterProjection; - })(away.projections || (away.projections = {})); - var projections = away.projections; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (projections) { - var ObliqueNearPlaneProjection = (function (_super) { - __extends(ObliqueNearPlaneProjection, _super); - function ObliqueNearPlaneProjection(baseProjection, plane) { - _super.call(this); - this.baseProjection = baseProjection; - this.plane = plane; - - this._onProjectionMatrixChangedDelegate = away.utils.Delegate.create(this, this.onProjectionMatrixChanged); - } - Object.defineProperty(ObliqueNearPlaneProjection.prototype, "frustumCorners", { - //@override - get: function () { - return this._baseProjection.frustumCorners; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ObliqueNearPlaneProjection.prototype, "near", { - //@override - get: function () { - return this._baseProjection.near; - }, - //@override - set: function (value) { - this._baseProjection.near = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ObliqueNearPlaneProjection.prototype, "far", { - //@override - get: function () { - return this._baseProjection.far; - }, - //@override - set: function (value) { - this._baseProjection.far = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ObliqueNearPlaneProjection.prototype, "iAspectRatio", { - //@override - get: function () { - return this._baseProjection._iAspectRatio; - }, - //@override - set: function (value) { - this._baseProjection._iAspectRatio = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ObliqueNearPlaneProjection.prototype, "plane", { - get: function () { - return this._plane; - }, - set: function (value) { - this._plane = value; - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ObliqueNearPlaneProjection.prototype, "baseProjection", { - set: function (value) { - if (this._baseProjection) { - this._baseProjection.removeEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - } - this._baseProjection = value; - - if (this._baseProjection) { - this._baseProjection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - } - this.pInvalidateMatrix(); - }, - enumerable: true, - configurable: true - }); - - ObliqueNearPlaneProjection.prototype.onProjectionMatrixChanged = function (event) { - this.pInvalidateMatrix(); - }; - - //@override - ObliqueNearPlaneProjection.prototype.pUpdateMatrix = function () { - this._pMatrix.copyFrom(this._baseProjection.matrix); - - var cx = this._plane.a; - var cy = this._plane.b; - var cz = this._plane.c; - var cw = -this._plane.d + .05; - var signX = cx >= 0 ? 1 : -1; - var signY = cy >= 0 ? 1 : -1; - var p = new away.geom.Vector3D(signX, signY, 1, 1); - var inverse = this._pMatrix.clone(); - inverse.invert(); - var q = inverse.transformVector(p); - this._pMatrix.copyRowTo(3, p); - var a = (q.x * p.x + q.y * p.y + q.z * p.z + q.w * p.w) / (cx * q.x + cy * q.y + cz * q.z + cw * q.w); - this._pMatrix.copyRowFrom(2, new away.geom.Vector3D(cx * a, cy * a, cz * a, cw * a)); - }; - return ObliqueNearPlaneProjection; - })(projections.ProjectionBase); - projections.ObliqueNearPlaneProjection = ObliqueNearPlaneProjection; - })(away.projections || (away.projections = {})); - var projections = away.projections; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (entities) { - var Camera = (function (_super) { - __extends(Camera, _super); - function Camera(projection) { - if (typeof projection === "undefined") { projection = null; } - _super.call(this); - this._viewProjection = new away.geom.Matrix3D(); - this._viewProjectionDirty = true; - this._frustumPlanesDirty = true; - - this._pIsEntity = true; - - this._onProjectionMatrixChangedDelegate = away.utils.Delegate.create(this, this.onProjectionMatrixChanged); - - this._projection = projection || new away.projections.PerspectiveProjection(); - this._projection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - - this._frustumPlanes = []; - - for (var i = 0; i < 6; ++i) - this._frustumPlanes[i] = new away.geom.Plane3D(); - - this.z = -1000; - } - Camera.prototype.pCreateDefaultBoundingVolume = function () { - return new away.bounds.NullBounds(); - }; - - /** - * @protected - */ - Camera.prototype.pCreateEntityPartitionNode = function () { - return new away.partition.CameraNode(this); - }; - - Object.defineProperty(Camera.prototype, "assetType", { - //@override - get: function () { - return away.library.AssetType.CAMERA; - }, - enumerable: true, - configurable: true - }); - - Camera.prototype.onProjectionMatrixChanged = function (event) { - this._viewProjectionDirty = true; - this._frustumPlanesDirty = true; - this.dispatchEvent(event); - }; - - Object.defineProperty(Camera.prototype, "frustumPlanes", { - get: function () { - if (this._frustumPlanesDirty) - this.updateFrustum(); - - return this._frustumPlanes; - }, - enumerable: true, - configurable: true - }); - - Camera.prototype.updateFrustum = function () { - var a, b, c; - - //var d : Number; - var c11, c12, c13, c14; - var c21, c22, c23, c24; - var c31, c32, c33, c34; - var c41, c42, c43, c44; - var p; - var raw = new Array(16); - ; - var invLen; - this.viewProjection.copyRawDataTo(raw); - - c11 = raw[0]; - c12 = raw[4]; - c13 = raw[8]; - c14 = raw[12]; - c21 = raw[1]; - c22 = raw[5]; - c23 = raw[9]; - c24 = raw[13]; - c31 = raw[2]; - c32 = raw[6]; - c33 = raw[10]; - c34 = raw[14]; - c41 = raw[3]; - c42 = raw[7]; - c43 = raw[11]; - c44 = raw[15]; - - // left plane - p = this._frustumPlanes[0]; - a = c41 + c11; - b = c42 + c12; - c = c43 + c13; - invLen = 1 / Math.sqrt(a * a + b * b + c * c); - p.a = a * invLen; - p.b = b * invLen; - p.c = c * invLen; - p.d = -(c44 + c14) * invLen; - - // right plane - p = this._frustumPlanes[1]; - a = c41 - c11; - b = c42 - c12; - c = c43 - c13; - invLen = 1 / Math.sqrt(a * a + b * b + c * c); - p.a = a * invLen; - p.b = b * invLen; - p.c = c * invLen; - p.d = (c14 - c44) * invLen; - - // bottom - p = this._frustumPlanes[2]; - a = c41 + c21; - b = c42 + c22; - c = c43 + c23; - invLen = 1 / Math.sqrt(a * a + b * b + c * c); - p.a = a * invLen; - p.b = b * invLen; - p.c = c * invLen; - p.d = -(c44 + c24) * invLen; - - // top - p = this._frustumPlanes[3]; - a = c41 - c21; - b = c42 - c22; - c = c43 - c23; - invLen = 1 / Math.sqrt(a * a + b * b + c * c); - p.a = a * invLen; - p.b = b * invLen; - p.c = c * invLen; - p.d = (c24 - c44) * invLen; - - // near - p = this._frustumPlanes[4]; - a = c31; - b = c32; - c = c33; - invLen = 1 / Math.sqrt(a * a + b * b + c * c); - p.a = a * invLen; - p.b = b * invLen; - p.c = c * invLen; - p.d = -c34 * invLen; - - // far - p = this._frustumPlanes[5]; - a = c41 - c31; - b = c42 - c32; - c = c43 - c33; - invLen = 1 / Math.sqrt(a * a + b * b + c * c); - p.a = a * invLen; - p.b = b * invLen; - p.c = c * invLen; - p.d = (c34 - c44) * invLen; - - this._frustumPlanesDirty = false; - }; - - /** - * @protected - */ - Camera.prototype.pInvalidateSceneTransform = function () { - _super.prototype.pInvalidateSceneTransform.call(this); - - this._viewProjectionDirty = true; - this._frustumPlanesDirty = true; - }; - - /** - * @protected - */ - Camera.prototype.pUpdateBounds = function () { - this._pBoundsInvalid = false; - this._pBounds.nullify(); - }; - - Object.defineProperty(Camera.prototype, "projection", { - /** - * - */ - get: function () { - return this._projection; - }, - set: function (value) { - if (this._projection == value) - return; - - if (!value) - throw new Error("Projection cannot be null!"); - - this._projection.removeEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - this._projection = value; - this._projection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - this.dispatchEvent(new away.events.CameraEvent(away.events.CameraEvent.PROJECTION_CHANGED, this)); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Camera.prototype, "viewProjection", { - /** - * - */ - get: function () { - if (this._viewProjectionDirty) { - this._viewProjection.copyFrom(this.inverseSceneTransform); - this._viewProjection.append(this._projection.matrix); - this._viewProjectionDirty = false; - } - - return this._viewProjection; - }, - enumerable: true, - configurable: true - }); - - /** - * Calculates the ray in scene space from the camera to the given normalized coordinates in screen space. - * - * @param nX The normalised x coordinate in screen space, -1 corresponds to the left edge of the viewport, 1 to the right. - * @param nY The normalised y coordinate in screen space, -1 corresponds to the top edge of the viewport, 1 to the bottom. - * @param sZ The z coordinate in screen space, representing the distance into the screen. - * @return The ray from the camera to the scene space position of the given screen coordinates. - */ - Camera.prototype.getRay = function (nX, nY, sZ) { - return this.sceneTransform.deltaTransformVector(this._projection.unproject(nX, nY, sZ)); - }; - - /** - * Calculates the normalised position in screen space of the given scene position. - * - * @param point3d the position vector of the scene coordinates to be projected. - * @return The normalised screen position of the given scene coordinates. - */ - Camera.prototype.project = function (point3d) { - return this._projection.project(this.inverseSceneTransform.transformVector(point3d)); - }; - - /** - * Calculates the scene position of the given normalized coordinates in screen space. - * - * @param nX The normalised x coordinate in screen space, minus the originX offset of the projection property. - * @param nY The normalised y coordinate in screen space, minus the originY offset of the projection property. - * @param sZ The z coordinate in screen space, representing the distance into the screen. - * @return The scene position of the given screen coordinates. - */ - Camera.prototype.unproject = function (nX, nY, sZ) { - return this.sceneTransform.transformVector(this._projection.unproject(nX, nY, sZ)); - }; - - Camera.prototype._iCollectRenderables = function (renderer) { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - this._iCollectRenderable(renderer); - }; - - Camera.prototype._iCollectRenderable = function (renderer) { - //nothing to do here - }; - return Camera; - })(away.containers.DisplayObjectContainer); - entities.Camera = Camera; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - var AbstractMethodError = away.errors.AbstractMethodError; - - var ShadowCasterCollector = away.traverse.ShadowCasterCollector; - var RenderTexture = away.textures.RenderTexture; - - var ShadowMapperBase = (function () { - function ShadowMapperBase() { - this._pDepthMapSize = 2048; - this._autoUpdateShadows = true; - this._pCasterCollector = this.pCreateCasterCollector(); - } - ShadowMapperBase.prototype.pCreateCasterCollector = function () { - return new ShadowCasterCollector(); - }; - - Object.defineProperty(ShadowMapperBase.prototype, "autoUpdateShadows", { - get: function () { - return this._autoUpdateShadows; - }, - set: function (value) { - this._autoUpdateShadows = value; - }, - enumerable: true, - configurable: true - }); - - - ShadowMapperBase.prototype.updateShadows = function () { - this._iShadowsInvalid = true; - }; - - ShadowMapperBase.prototype.iSetDepthMap = function (depthMap) { - if (this._depthMap == depthMap) - return; - - if (this._depthMap && !this._explicitDepthMap) - this._depthMap.dispose(); - - this._depthMap = depthMap; - - if (this._depthMap) { - this._explicitDepthMap = true; - this._pDepthMapSize = this._depthMap.size; - } else { - this._explicitDepthMap = false; - } - }; - - Object.defineProperty(ShadowMapperBase.prototype, "light", { - get: function () { - return this._pLight; - }, - set: function (value) { - this._pLight = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ShadowMapperBase.prototype, "depthMap", { - get: function () { - if (!this._depthMap) - this._depthMap = this.pCreateDepthTexture(); - - return this._depthMap; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(ShadowMapperBase.prototype, "depthMapSize", { - get: function () { - return this._pDepthMapSize; - }, - set: function (value) { - if (value == this._pDepthMapSize) - return; - - this._pSetDepthMapSize(value); - }, - enumerable: true, - configurable: true - }); - - - ShadowMapperBase.prototype.dispose = function () { - this._pCasterCollector = null; - - if (this._depthMap && !this._explicitDepthMap) - this._depthMap.dispose(); - - this._depthMap = null; - }; - - ShadowMapperBase.prototype.pCreateDepthTexture = function () { - return new RenderTexture(this._pDepthMapSize, this._pDepthMapSize); - }; - - ShadowMapperBase.prototype.iRenderDepthMap = function (stage, entityCollector, renderer) { - this._iShadowsInvalid = false; - - this.pUpdateDepthProjection(entityCollector.camera); - - if (!this._depthMap) - this._depthMap = this.pCreateDepthTexture(); - - this.pDrawDepthMap(this._depthMap, entityCollector.scene, renderer); - }; - - ShadowMapperBase.prototype.pUpdateDepthProjection = function (viewCamera) { - throw new AbstractMethodError(); - }; - - ShadowMapperBase.prototype.pDrawDepthMap = function (target, scene, renderer) { - throw new AbstractMethodError(); - }; - - ShadowMapperBase.prototype._pSetDepthMapSize = function (value) { - this._pDepthMapSize = value; - - if (this._explicitDepthMap) { - throw Error("Cannot set depth map size for the current renderer."); - } else if (this._depthMap) { - this._depthMap.dispose(); - this._depthMap = null; - } - }; - return ShadowMapperBase; - })(); - materials.ShadowMapperBase = ShadowMapperBase; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - var Camera = away.entities.Camera; - - var CubeMapShadowMapper = (function (_super) { - __extends(CubeMapShadowMapper, _super); - function CubeMapShadowMapper() { - _super.call(this); - - this._pDepthMapSize = 512; - this._needsRender = new Array(); - this.initCameras(); - } - CubeMapShadowMapper.prototype.initCameras = function () { - this._depthCameras = new Array(); - this._projections = new Array(); - - // posX, negX, posY, negY, posZ, negZ - this.addCamera(0, 90, 0); - this.addCamera(0, -90, 0); - this.addCamera(-90, 0, 0); - this.addCamera(90, 0, 0); - this.addCamera(0, 0, 0); - this.addCamera(0, 180, 0); - }; - - CubeMapShadowMapper.prototype.addCamera = function (rotationX, rotationY, rotationZ) { - var cam = new Camera(); - cam.rotationX = rotationX; - cam.rotationY = rotationY; - cam.rotationZ = rotationZ; - cam.projection.near = .01; - - var projection = cam.projection; - projection.fieldOfView = 90; - this._projections.push(projection); - cam.projection._iAspectRatio = 1; - this._depthCameras.push(cam); - }; - - //@override - CubeMapShadowMapper.prototype.pCreateDepthTexture = function () { - throw new away.errors.PartialImplementationError(); - /* - return new RenderCubeTexture( this._depthMapSize ); - */ - }; - - //@override - CubeMapShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { - var light = (this._pLight); - var maxDistance = light._pFallOff; - var pos = this._pLight.scenePosition; - - for (var i = 0; i < 6; ++i) { - this._projections[i].far = maxDistance; - this._depthCameras[i].transform.position = pos; - this._needsRender[i] = true; - } - }; - - //@override - CubeMapShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { - for (var i = 0; i < 6; ++i) { - if (this._needsRender[i]) { - this._pCasterCollector.camera = this._depthCameras[i]; - this._pCasterCollector.clear(); - scene.traversePartitions(this._pCasterCollector); - renderer._iRender(this._pCasterCollector, target, null, i); - } - } - }; - return CubeMapShadowMapper; - })(materials.ShadowMapperBase); - materials.CubeMapShadowMapper = CubeMapShadowMapper; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - var Camera = away.entities.Camera; - - var Matrix3D = away.geom.Matrix3D; - - var FreeMatrixProjection = away.projections.FreeMatrixProjection; - - var DirectionalShadowMapper = (function (_super) { - __extends(DirectionalShadowMapper, _super); - function DirectionalShadowMapper() { - _super.call(this); - this._pLightOffset = 10000; - this._pSnap = 64; - - this._pCullPlanes = []; - this._pOverallDepthProjection = new FreeMatrixProjection(); - this._pOverallDepthCamera = new Camera(this._pOverallDepthProjection); - this._pLocalFrustum = []; - this._pMatrix = new Matrix3D(); - } - Object.defineProperty(DirectionalShadowMapper.prototype, "snap", { - get: function () { - return this._pSnap; - }, - set: function (value) { - this._pSnap = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DirectionalShadowMapper.prototype, "lightOffset", { - get: function () { - return this._pLightOffset; - }, - set: function (value) { - this._pLightOffset = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(DirectionalShadowMapper.prototype, "iDepthProjection", { - //@arcane - get: function () { - return this._pOverallDepthCamera.viewProjection; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DirectionalShadowMapper.prototype, "depth", { - //@arcane - get: function () { - return this._pMaxZ - this._pMinZ; - }, - enumerable: true, - configurable: true - }); - - //@override - DirectionalShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { - this._pCasterCollector.camera = this._pOverallDepthCamera; - this._pCasterCollector.cullPlanes = this._pCullPlanes; - this._pCasterCollector.clear(); - scene.traversePartitions(this._pCasterCollector); - renderer._iRender(this._pCasterCollector, target); - }; - - //@protected - DirectionalShadowMapper.prototype.pUpdateCullPlanes = function (viewCamera) { - var lightFrustumPlanes = this._pOverallDepthCamera.frustumPlanes; - var viewFrustumPlanes = viewCamera.frustumPlanes; - this._pCullPlanes.length = 4; - - this._pCullPlanes[0] = lightFrustumPlanes[0]; - this._pCullPlanes[1] = lightFrustumPlanes[1]; - this._pCullPlanes[2] = lightFrustumPlanes[2]; - this._pCullPlanes[3] = lightFrustumPlanes[3]; - - var light = this._pLight; - var dir = light.sceneDirection; - var dirX = dir.x; - var dirY = dir.y; - var dirZ = dir.z; - var j = 4; - for (var i = 0; i < 6; ++i) { - var plane = viewFrustumPlanes[i]; - if (plane.a * dirX + plane.b * dirY + plane.c * dirZ < 0) - this._pCullPlanes[j++] = plane; - } - }; - - //@override - DirectionalShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { - this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); - this._pOverallDepthProjection.matrix = this._pMatrix; - this.pUpdateCullPlanes(viewCamera); - }; - - DirectionalShadowMapper.prototype.pUpdateProjectionFromFrustumCorners = function (viewCamera, corners, matrix) { - var raw = new Array(); - var dir; - var x, y, z; - var minX, minY; - var maxX, maxY; - var i; - - var light = this._pLight; - dir = light.sceneDirection; - this._pOverallDepthCamera.transform.matrix3D = this._pLight.sceneTransform; - x = Math.floor((viewCamera.x - dir.x * this._pLightOffset) / this._pSnap) * this._pSnap; - y = Math.floor((viewCamera.y - dir.y * this._pLightOffset) / this._pSnap) * this._pSnap; - z = Math.floor((viewCamera.z - dir.z * this._pLightOffset) / this._pSnap) * this._pSnap; - this._pOverallDepthCamera.x = x; - this._pOverallDepthCamera.y = y; - this._pOverallDepthCamera.z = z; - - this._pMatrix.copyFrom(this._pOverallDepthCamera.inverseSceneTransform); - this._pMatrix.prepend(viewCamera.sceneTransform); - this._pMatrix.transformVectors(corners, this._pLocalFrustum); - - minX = maxX = this._pLocalFrustum[0]; - minY = maxY = this._pLocalFrustum[1]; - this._pMaxZ = this._pLocalFrustum[2]; - - i = 3; - while (i < 24) { - x = this._pLocalFrustum[i]; - y = this._pLocalFrustum[i + 1]; - z = this._pLocalFrustum[i + 2]; - if (x < minX) - minX = x; - if (x > maxX) - maxX = x; - if (y < minY) - minY = y; - if (y > maxY) - maxY = y; - if (z > this._pMaxZ) - this._pMaxZ = z; - i += 3; - } - - this._pMinZ = 1; - - var w = maxX - minX; - var h = maxY - minY; - var d = 1 / (this._pMaxZ - this._pMinZ); - - if (minX < 0) - minX -= this._pSnap; // because int() rounds up for < 0 - - if (minY < 0) - minY -= this._pSnap; - - minX = Math.floor(minX / this._pSnap) * this._pSnap; - minY = Math.floor(minY / this._pSnap) * this._pSnap; - - var snap2 = 2 * this._pSnap; - w = Math.floor(w / snap2 + 2) * snap2; - h = Math.floor(h / snap2 + 2) * snap2; - - maxX = minX + w; - maxY = minY + h; - - w = 1 / w; - h = 1 / h; - - raw[0] = 2 * w; - raw[5] = 2 * h; - raw[10] = d; - raw[12] = -(maxX + minX) * w; - raw[13] = -(maxY + minY) * h; - raw[14] = -this._pMinZ * d; - raw[15] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - - matrix.copyRawDataFrom(raw); - }; - return DirectionalShadowMapper; - })(materials.ShadowMapperBase); - materials.DirectionalShadowMapper = DirectionalShadowMapper; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -var away; -(function (away) { - (function (materials) { - var Camera = away.entities.Camera; - var Event = away.events.Event; - var EventDispatcher = away.events.EventDispatcher; - - var Matrix3DUtils = away.geom.Matrix3DUtils; - var Rectangle = away.geom.Rectangle; - var FreeMatrixProjection = away.projections.FreeMatrixProjection; - - var CascadeShadowMapper = (function (_super) { - __extends(CascadeShadowMapper, _super); - function CascadeShadowMapper(numCascades) { - if (typeof numCascades === "undefined") { numCascades = 3; } - _super.call(this); - this._pScissorRectsInvalid = true; - - if (numCascades < 1 || numCascades > 4) - throw new Error("numCascades must be an integer between 1 and 4"); - - this._numCascades = numCascades; - this._changeDispatcher = new EventDispatcher(this); - this.init(); - } - CascadeShadowMapper.prototype.getSplitRatio = function (index /*uint*/ ) { - return this._splitRatios[index]; - }; - - CascadeShadowMapper.prototype.setSplitRatio = function (index /*uint*/ , value) { - if (value < 0) - value = 0; - else if (value > 1) - value = 1; - - if (index >= this._numCascades) - throw new Error("index must be smaller than the number of cascades!"); - - this._splitRatios[index] = value; - }; - - CascadeShadowMapper.prototype.getDepthProjections = function (partition /*uint*/ ) { - return this._depthCameras[partition].viewProjection; - }; - - CascadeShadowMapper.prototype.init = function () { - this._splitRatios = new Array(this._numCascades); - this._nearPlaneDistances = new Array(this._numCascades); - - var s = 1; - for (var i = this._numCascades - 1; i >= 0; --i) { - this._splitRatios[i] = s; - s *= .4; - } - - this._texOffsetsX = Array(-1, 1, -1, 1); - this._texOffsetsY = Array(1, 1, -1, -1); - this._pScissorRects = new Array(4); - this._depthLenses = new Array(); - this._depthCameras = new Array(); - - for (i = 0; i < this._numCascades; ++i) { - this._depthLenses[i] = new FreeMatrixProjection(); - this._depthCameras[i] = new Camera(this._depthLenses[i]); - } - }; - - CascadeShadowMapper.prototype._pSetDepthMapSize = function (value /*uint*/ ) { - _super.prototype._pSetDepthMapSize.call(this, value); - - this.invalidateScissorRects(); - }; - - CascadeShadowMapper.prototype.invalidateScissorRects = function () { - this._pScissorRectsInvalid = true; - }; - - Object.defineProperty(CascadeShadowMapper.prototype, "numCascades", { - get: function () { - return this._numCascades; - }, - set: function (value /*int*/ ) { - if (value == this._numCascades) - return; - - if (value < 1 || value > 4) - throw new Error("numCascades must be an integer between 1 and 4"); - - this._numCascades = value; - this.invalidateScissorRects(); - this.init(); - this.dispatchEvent(new Event(Event.CHANGE)); - }, - enumerable: true, - configurable: true - }); - - - CascadeShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { - if (this._pScissorRectsInvalid) - this.updateScissorRects(); - - this._pCasterCollector.cullPlanes = this._pCullPlanes; - this._pCasterCollector.camera = this._pOverallDepthCamera; - this._pCasterCollector.clear(); - scene.traversePartitions(this._pCasterCollector); - - renderer._iRenderCascades(this._pCasterCollector, target, this._numCascades, this._pScissorRects, this._depthCameras); - }; - - CascadeShadowMapper.prototype.updateScissorRects = function () { - var half = this._pDepthMapSize * .5; - - this._pScissorRects[0] = new Rectangle(0, 0, half, half); - this._pScissorRects[1] = new Rectangle(half, 0, half, half); - this._pScissorRects[2] = new Rectangle(0, half, half, half); - this._pScissorRects[3] = new Rectangle(half, half, half, half); - - this._pScissorRectsInvalid = false; - }; - - CascadeShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { - var matrix; - var projection = viewCamera.projection; - var projectionNear = projection.near; - var projectionRange = projection.far - projectionNear; - - this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); - this._pMatrix.appendScale(.96, .96, 1); - this._pOverallDepthProjection.matrix = this._pMatrix; - this.pUpdateCullPlanes(viewCamera); - - for (var i = 0; i < this._numCascades; ++i) { - matrix = this._depthLenses[i].matrix; - - this._nearPlaneDistances[i] = projectionNear + this._splitRatios[i] * projectionRange; - this._depthCameras[i].transform = this._pOverallDepthCamera.transform; - - this.updateProjectionPartition(matrix, this._splitRatios[i], this._texOffsetsX[i], this._texOffsetsY[i]); - - this._depthLenses[i].matrix = matrix; - } - }; - - CascadeShadowMapper.prototype.updateProjectionPartition = function (matrix, splitRatio, texOffsetX, texOffsetY) { - var raw = Matrix3DUtils.RAW_DATA_CONTAINER; - var xN, yN, zN; - var xF, yF, zF; - var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, minZ; - var maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY, maxZ = Number.NEGATIVE_INFINITY; - var i = 0; - - while (i < 12) { - xN = this._pLocalFrustum[i]; - yN = this._pLocalFrustum[i + 1]; - zN = this._pLocalFrustum[i + 2]; - xF = xN + (this._pLocalFrustum[i + 12] - xN) * splitRatio; - yF = yN + (this._pLocalFrustum[i + 13] - yN) * splitRatio; - zF = zN + (this._pLocalFrustum[i + 14] - zN) * splitRatio; - if (xN < minX) - minX = xN; - if (xN > maxX) - maxX = xN; - if (yN < minY) - minY = yN; - if (yN > maxY) - maxY = yN; - if (zN > maxZ) - maxZ = zN; - if (xF < minX) - minX = xF; - if (xF > maxX) - maxX = xF; - if (yF < minY) - minY = yF; - if (yF > maxY) - maxY = yF; - if (zF > maxZ) - maxZ = zF; - i += 3; - } - - minZ = 1; - - var w = (maxX - minX); - var h = (maxY - minY); - var d = 1 / (maxZ - minZ); - - if (minX < 0) - minX -= this._pSnap; // because int() rounds up for < 0 - if (minY < 0) - minY -= this._pSnap; - minX = Math.floor(minX / this._pSnap) * this._pSnap; - minY = Math.floor(minY / this._pSnap) * this._pSnap; - - var snap2 = 2 * this._pSnap; - w = Math.floor(w / snap2 + 1) * snap2; - h = Math.floor(h / snap2 + 1) * snap2; - - maxX = minX + w; - maxY = minY + h; - - w = 1 / w; - h = 1 / h; - - raw[0] = 2 * w; - raw[5] = 2 * h; - raw[10] = d; - raw[12] = -(maxX + minX) * w; - raw[13] = -(maxY + minY) * h; - raw[14] = -minZ * d; - raw[15] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - - matrix.copyRawDataFrom(raw); - matrix.appendScale(.96, .96, 1); - matrix.appendTranslation(texOffsetX, texOffsetY, 0); - matrix.appendScale(.5, .5, 1); - }; - - CascadeShadowMapper.prototype.addEventListener = function (type, listener) { - this._changeDispatcher.addEventListener(type, listener); - }; - - CascadeShadowMapper.prototype.removeEventListener = function (type, listener) { - this._changeDispatcher.removeEventListener(type, listener); - }; - - CascadeShadowMapper.prototype.dispatchEvent = function (event) { - return this._changeDispatcher.dispatchEvent(event); - }; - - CascadeShadowMapper.prototype.hasEventListener = function (type) { - return this._changeDispatcher.hasEventListener(type); - }; - - Object.defineProperty(CascadeShadowMapper.prototype, "_iNearPlaneDistances", { - get: function () { - return this._nearPlaneDistances; - }, - enumerable: true, - configurable: true - }); - return CascadeShadowMapper; - })(materials.DirectionalShadowMapper); - materials.CascadeShadowMapper = CascadeShadowMapper; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - var NearDirectionalShadowMapper = (function (_super) { - __extends(NearDirectionalShadowMapper, _super); - function NearDirectionalShadowMapper(coverageRatio) { - if (typeof coverageRatio === "undefined") { coverageRatio = .5; } - _super.call(this); - - this.coverageRatio = coverageRatio; - } - Object.defineProperty(NearDirectionalShadowMapper.prototype, "coverageRatio", { - /** - * A value between 0 and 1 to indicate the ratio of the view frustum that needs to be covered by the shadow map. - */ - get: function () { - return this._coverageRatio; - }, - set: function (value) { - if (value > 1) - value = 1; - else if (value < 0) - value = 0; - - this._coverageRatio = value; - }, - enumerable: true, - configurable: true - }); - - - NearDirectionalShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { - var corners = viewCamera.projection.frustumCorners; - - for (var i = 0; i < 12; ++i) { - var v = corners[i]; - this._pLocalFrustum[i] = v; - this._pLocalFrustum[i + 12] = v + (corners[i + 12] - v) * this._coverageRatio; - } - - this.pUpdateProjectionFromFrustumCorners(viewCamera, this._pLocalFrustum, this._pMatrix); - this._pOverallDepthProjection.matrix = this._pMatrix; - }; - return NearDirectionalShadowMapper; - })(materials.DirectionalShadowMapper); - materials.NearDirectionalShadowMapper = NearDirectionalShadowMapper; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -/// -var away; -(function (away) { - /** - * The Billboard class represents display objects that represent bitmap images. - * These can be images that you load with the flash.Assets or - * flash.display.Loader classes, or they can be images that you - * create with the Billboard() constructor. - * - *

The Billboard() constructor allows you to create a Billboard - * object that contains a reference to a BitmapData object. After you create a - * Billboard object, use the addChild() or addChildAt() - * method of the parent DisplayObjectContainer instance to place the bitmap on - * the display list.

- * - *

A Billboard object can share its BitmapData reference among several Billboard - * objects, independent of translation or rotation properties. Because you can - * create multiple Billboard objects that reference the same BitmapData object, - * multiple display objects can use the same complex BitmapData object without - * incurring the memory overhead of a BitmapData object for each display - * object instance.

- * - *

A BitmapData object can be drawn to the screen by a Billboard object in one - * of two ways: by using the default hardware renderer with a single hardware surface, - * or by using the slower software renderer when 3D acceleration is not available.

- * - *

If you would prefer to perform a batch rendering command, rather than using a - * single surface for each Billboard object, you can also draw to the screen using the - * drawTiles() or drawTriangles() methods which are - * available to flash.display.Tilesheet and flash.display.Graphics - * objects.

- * - *

Note: The Billboard class is not a subclass of the InteractiveObject - * class, so it cannot dispatch mouse events. However, you can use the - * addEventListener() method of the display object container that - * contains the Billboard object.

- */ - (function (entities) { - var MaterialEvent = away.events.MaterialEvent; - - var Billboard = (function (_super) { - __extends(Billboard, _super); - function Billboard(material, pixelSnapping, smoothing) { - if (typeof pixelSnapping === "undefined") { pixelSnapping = "auto"; } - if (typeof smoothing === "undefined") { smoothing = false; } - var _this = this; - _super.call(this); - - this._pIsEntity = true; - - this.onSizeChangedDelegate = function (event) { - return _this.onSizeChanged(event); - }; - - this.material = material; - - this._billboardWidth = material.width; - this._billboardHeight = material.height; - } - Object.defineProperty(Billboard.prototype, "animator", { - /** - * Defines the animator of the mesh. Act on the mesh's geometry. Defaults to null - */ - get: function () { - return this._animator; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Billboard.prototype, "assetType", { - /** - * - */ - get: function () { - return away.library.AssetType.BILLBOARD; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Billboard.prototype, "billboardHeight", { - /** - * - */ - get: function () { - return this._billboardHeight; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Billboard.prototype, "billboardWidth", { - /** - * - */ - get: function () { - return this._billboardWidth; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Billboard.prototype, "material", { - /** - * - */ - get: function () { - return this._material; - }, - set: function (value) { - if (value == this._material) - return; - - if (this._material) { - this._material.iRemoveOwner(this); - this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); - } - - this._material = value; - - if (this._material) { - this._material.iAddOwner(this); - this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); - } - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Billboard.prototype, "uvTransform", { - /** - * - */ - get: function () { - return this._uvTransform; - }, - set: function (value) { - this._uvTransform = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * @protected - */ - Billboard.prototype.pCreateEntityPartitionNode = function () { - return new away.partition.EntityNode(this); - }; - - /** - * @protected - */ - Billboard.prototype.pUpdateBounds = function () { - this._pBounds.fromExtremes(0, 0, 0, this._billboardWidth, this._billboardHeight, 0); - - _super.prototype.pUpdateBounds.call(this); - }; - - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - Billboard.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { - return this._pPickingCollider.testBillboardCollision(this, this._pPickingCollisionVO, shortestCollisionDistance); - }; - - /** - * @private - */ - Billboard.prototype.onSizeChanged = function (event) { - this._billboardWidth = this._material.width; - this._billboardHeight = this._material.height; - - this._pBoundsInvalid = true; - - var len = this._pRenderables.length; - for (var i = 0; i < len; i++) - this._pRenderables[i].invalidateVertexData("vertices"); //TODO - }; - - Billboard.prototype._iCollectRenderables = function (renderer) { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - this._iCollectRenderable(renderer); - }; - - Billboard.prototype._iCollectRenderable = function (renderer) { - renderer.applyBillboard(this); - }; - return Billboard; - })(away.base.DisplayObject); - entities.Billboard = Billboard; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (entities) { - var NullBounds = away.bounds.NullBounds; - - var Matrix3D = away.geom.Matrix3D; - var Vector3D = away.geom.Vector3D; - var DirectionalShadowMapper = away.materials.DirectionalShadowMapper; - var DirectionalLightNode = away.partition.DirectionalLightNode; - - var DirectionalLight = (function (_super) { - __extends(DirectionalLight, _super); - function DirectionalLight(xDir, yDir, zDir) { - if (typeof xDir === "undefined") { xDir = 0; } - if (typeof yDir === "undefined") { yDir = -1; } - if (typeof zDir === "undefined") { zDir = 1; } - _super.call(this); - - this._pIsEntity = true; - - this.direction = new Vector3D(xDir, yDir, zDir); - - this._sceneDirection = new Vector3D(); - } - Object.defineProperty(DirectionalLight.prototype, "sceneDirection", { - get: function () { - if (this._pSceneTransformDirty) - this.pUpdateSceneTransform(); - - return this._sceneDirection; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(DirectionalLight.prototype, "direction", { - get: function () { - return this._direction; - }, - set: function (value) { - this._direction = value; - - if (!this._tmpLookAt) - this._tmpLookAt = new Vector3D(); - - this._tmpLookAt.x = this.x + this._direction.x; - this._tmpLookAt.y = this.y + this._direction.y; - this._tmpLookAt.z = this.z + this._direction.z; - - this.lookAt(this._tmpLookAt); - }, - enumerable: true, - configurable: true - }); - - - /** - * - * @returns {away.bounds.NullBounds} - */ - DirectionalLight.prototype.pCreateDefaultBoundingVolume = function () { - //directional lights are to be considered global, hence always in view - return new NullBounds(); - }; - - /** - * - */ - DirectionalLight.prototype.pUpdateBounds = function () { - }; - - //@override - DirectionalLight.prototype.pUpdateSceneTransform = function () { - _super.prototype.pUpdateSceneTransform.call(this); - this.sceneTransform.copyColumnTo(2, this._sceneDirection); - this._sceneDirection.normalize(); - }; - - //@override - DirectionalLight.prototype.pCreateShadowMapper = function () { - return new DirectionalShadowMapper(); - }; - - /** - * @protected - */ - DirectionalLight.prototype.pCreateEntityPartitionNode = function () { - return new DirectionalLightNode(this); - }; - - //override - DirectionalLight.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { - if (typeof target === "undefined") { target = null; } - var raw = new Array(); - var bounds = entity.bounds; - var m = new Matrix3D(); - - m.copyFrom(entity.getRenderSceneTransform(camera)); - m.append(this.inverseSceneTransform); - - if (!this._projAABBPoints) - this._projAABBPoints = []; - - m.transformVectors(bounds.aabbPoints, this._projAABBPoints); - - var xMin = Infinity, xMax = -Infinity; - var yMin = Infinity, yMax = -Infinity; - var zMin = Infinity, zMax = -Infinity; - var d; - for (var i = 0; i < 24;) { - d = this._projAABBPoints[i++]; - - if (d < xMin) - xMin = d; - - if (d > xMax) - xMax = d; - - d = this._projAABBPoints[i++]; - - if (d < yMin) - yMin = d; - - if (d > yMax) - yMax = d; - - d = this._projAABBPoints[i++]; - - if (d < zMin) - zMin = d; - - if (d > zMax) - zMax = d; - } - - var invXRange = 1 / (xMax - xMin); - var invYRange = 1 / (yMax - yMin); - var invZRange = 1 / (zMax - zMin); - raw[0] = 2 * invXRange; - raw[5] = 2 * invYRange; - raw[10] = invZRange; - raw[12] = -(xMax + xMin) * invXRange; - raw[13] = -(yMax + yMin) * invYRange; - raw[14] = -zMin * invZRange; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - raw[15] = 1; - - if (!target) - target = new Matrix3D(); - - target.copyRawDataFrom(raw); - target.prepend(m); - - return target; - }; - - DirectionalLight.prototype._iCollectRenderables = function (renderer) { - //nothing to do here - }; - return DirectionalLight; - })(away.base.LightBase); - entities.DirectionalLight = DirectionalLight; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (entities) { - var NullBounds = away.bounds.NullBounds; - - var LightProbeNode = away.partition.LightProbeNode; - - var LightProbe = (function (_super) { - __extends(LightProbe, _super); - function LightProbe(diffuseMap, specularMap) { - if (typeof specularMap === "undefined") { specularMap = null; } - _super.call(this); - - this._pIsEntity = true; - - this._diffuseMap = diffuseMap; - this._specularMap = specularMap; - } - Object.defineProperty(LightProbe.prototype, "diffuseMap", { - get: function () { - return this._diffuseMap; - }, - set: function (value) { - this._diffuseMap = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LightProbe.prototype, "specularMap", { - get: function () { - return this._specularMap; - }, - set: function (value) { - this._specularMap = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * @protected - */ - LightProbe.prototype.pCreateEntityPartitionNode = function () { - return new LightProbeNode(this); - }; - - //@override - LightProbe.prototype.pUpdateBounds = function () { - this._pBoundsInvalid = false; - }; - - //@override - LightProbe.prototype.pCreateDefaultBoundingVolume = function () { - return new NullBounds(); - }; - - //@override - LightProbe.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { - if (typeof target === "undefined") { target = null; } - throw new away.errors.Error("Object projection matrices are not supported for LightProbe objects!"); - }; - - LightProbe.prototype._iCollectRenderables = function (renderer) { - //nothing to do here - }; - return LightProbe; - })(away.base.LightBase); - entities.LightProbe = LightProbe; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -var away; -(function (away) { - (function (entities) { - var MaterialEvent = away.events.MaterialEvent; - - var EntityNode = away.partition.EntityNode; - - /** - * A Line Segment primitive. - */ - var LineSegment = (function (_super) { - __extends(LineSegment, _super); - /** - * Create a line segment - * - * @param startPosition Start position of the line segment - * @param endPosition Ending position of the line segment - * @param thickness Thickness of the line - */ - function LineSegment(material, startPosition, endPosition, thickness) { - if (typeof thickness === "undefined") { thickness = 1; } - var _this = this; - _super.call(this); - - this._pIsEntity = true; - - this.onSizeChangedDelegate = function (event) { - return _this.onSizeChanged(event); - }; - - this.material = material; - - this._startPosition = startPosition; - this._endPosition = endPosition; - this._halfThickness = thickness * 0.5; - } - Object.defineProperty(LineSegment.prototype, "animator", { - /** - * Defines the animator of the line segment. Act on the line segment's geometry. Defaults to null - */ - get: function () { - return this._animator; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSegment.prototype, "assetType", { - /** - * - */ - get: function () { - return away.library.AssetType.LINE_SEGMENT; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSegment.prototype, "startPostion", { - /** - * - */ - get: function () { - return this._startPosition; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSegment.prototype, "startPosition", { - set: function (value) { - if (this._startPosition == value) - return; - - this._startPosition = value; - - this.notifyRenderableUpdate(); - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LineSegment.prototype, "endPosition", { - /** - * - */ - get: function () { - return this._endPosition; - }, - set: function (value) { - if (this._endPosition == value) - return; - - this._endPosition = value; - - this.notifyRenderableUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LineSegment.prototype, "material", { - /** - * - */ - get: function () { - return this._material; - }, - set: function (value) { - if (value == this._material) - return; - - if (this._material) { - this._material.iRemoveOwner(this); - this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); - } - - this._material = value; - - if (this._material) { - this._material.iAddOwner(this); - this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); - } - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LineSegment.prototype, "thickness", { - /** - * - */ - get: function () { - return this._halfThickness * 2; - }, - set: function (value) { - if (this._halfThickness == value) - return; - - this._halfThickness = value * 0.5; - - this.notifyRenderableUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LineSegment.prototype, "uvTransform", { - /** - * - */ - get: function () { - return this._uvTransform; - }, - set: function (value) { - this._uvTransform = value; - }, - enumerable: true, - configurable: true - }); - - - LineSegment.prototype.dispose = function () { - this._startPosition = null; - this._endPosition = null; - }; - - /** - * @protected - */ - LineSegment.prototype.pCreateEntityPartitionNode = function () { - return new EntityNode(this); - }; - - /** - * @protected - */ - LineSegment.prototype.pUpdateBounds = function () { - this._pBounds.fromExtremes(this._startPosition.x, this._startPosition.y, this._startPosition.z, this._endPosition.x, this._endPosition.y, this._endPosition.z); - - _super.prototype.pUpdateBounds.call(this); - }; - - /** - * @private - */ - LineSegment.prototype.onSizeChanged = function (event) { - this.notifyRenderableUpdate(); - }; - - /** - * @private - */ - LineSegment.prototype.notifyRenderableUpdate = function () { - var len = this._pRenderables.length; - for (var i = 0; i < len; i++) - this._pRenderables[i].invalidateVertexData("vertices"); //TODO - }; - - LineSegment.prototype._iCollectRenderables = function (renderer) { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - this._iCollectRenderable(renderer); - }; - - LineSegment.prototype._iCollectRenderable = function (renderer) { - //TODO - }; - return LineSegment; - })(away.base.DisplayObject); - entities.LineSegment = LineSegment; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (entities) { - var Geometry = away.base.Geometry; - var GeometryEvent = away.events.GeometryEvent; - - /** - * Mesh is an instance of a Geometry, augmenting it with a presence in the scene graph, a material, and an animation - * state. It consists out of SubMeshes, which in turn correspond to SubGeometries. SubMeshes allow different parts - * of the geometry to be assigned different materials. - */ - var Mesh = (function (_super) { - __extends(Mesh, _super); - /** - * Create a new Mesh object. - * - * @param geometry The geometry used by the mesh that provides it with its shape. - * @param material [optional] The material with which to render the Mesh. - */ - function Mesh(geometry, material) { - if (typeof material === "undefined") { material = null; } - var _this = this; - _super.call(this); - this._castsShadows = true; - this._shareAnimationGeometry = true; - - this._pIsEntity = true; - - this._subMeshes = new Array(); - - this._onGeometryBoundsInvalidDelegate = function (event) { - return _this.onGeometryBoundsInvalid(event); - }; - this._onSubGeometryAddedDelegate = function (event) { - return _this.onSubGeometryAdded(event); - }; - this._onSubGeometryRemovedDelegate = function (event) { - return _this.onSubGeometryRemoved(event); - }; - - //this should never happen, but if people insist on trying to create their meshes before they have geometry to fill it, it becomes necessary - this.geometry = geometry || new Geometry(); - - this.material = material; - } - Object.defineProperty(Mesh.prototype, "animator", { - /** - * Defines the animator of the mesh. Act on the mesh's geometry. Default value is null. - */ - get: function () { - return this._animator; - }, - set: function (value) { - if (this._animator) - this._animator.removeOwner(this); - - this._animator = value; - - var len = this._subMeshes.length; - var subMesh; - - for (var i = 0; i < len; ++i) { - subMesh = this._subMeshes[i]; - - // cause material to be unregistered and registered again to work with the new animation type (if possible) - if (subMesh.material) { - subMesh.material.iRemoveOwner(subMesh); - subMesh.material.iAddOwner(subMesh); - } - - //invalidate any existing renderables in case they need to pull new geometry - subMesh._iInvalidateRenderableGeometry(); - } - - if (this._animator) - this._animator.addOwner(this); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Mesh.prototype, "assetType", { - /** - * - */ - get: function () { - return away.library.AssetType.MESH; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Mesh.prototype, "castsShadows", { - /** - * Indicates whether or not the Mesh can cast shadows. Default value is true. - */ - get: function () { - return this._castsShadows; - }, - set: function (value) { - this._castsShadows = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Mesh.prototype, "geometry", { - /** - * The geometry used by the mesh that provides it with its shape. - */ - get: function () { - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - return this._geometry; - }, - set: function (value) { - var i; - - if (this._geometry) { - this._geometry.removeEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); - this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); - this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); - - for (i = 0; i < this._subMeshes.length; ++i) - this._subMeshes[i].dispose(); - - this._subMeshes.length = 0; - } - - this._geometry = value; - - if (this._geometry) { - this._geometry.addEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); - this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); - this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); - - var subGeoms = this._geometry.subGeometries; - - for (i = 0; i < subGeoms.length; ++i) - this.addSubMesh(subGeoms[i]); - } - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Mesh.prototype, "material", { - /** - * The material with which to render the Mesh. - */ - get: function () { - return this._material; - }, - set: function (value) { - if (value == this._material) - return; - - var i; - var len = this._subMeshes.length; - var subMesh; - - for (i = 0; i < len; i++) - if (this._material && (subMesh = this._subMeshes[i]).material == this._material) - this._material.iRemoveOwner(subMesh); - - this._material = value; - - for (i = 0; i < len; i++) - if (this._material && (subMesh = this._subMeshes[i]).material == this._material) - this._material.iAddOwner(subMesh); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Mesh.prototype, "shareAnimationGeometry", { - /** - * Indicates whether or not the mesh share the same animation geometry. - */ - get: function () { - return this._shareAnimationGeometry; - }, - set: function (value) { - this._shareAnimationGeometry = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Mesh.prototype, "subMeshes", { - /** - * The SubMeshes out of which the Mesh consists. Every SubMesh can be assigned a material to override the Mesh's - * material. - */ - get: function () { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - return this._subMeshes; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Mesh.prototype, "uvTransform", { - /** - * - */ - get: function () { - return this._uvTransform; - }, - set: function (value) { - this._uvTransform = value; - }, - enumerable: true, - configurable: true - }); - - - /** - * - */ - Mesh.prototype.bakeTransformations = function () { - this.geometry.applyTransformation(this._iMatrix3D); - this._iMatrix3D.identity(); - }; - - /** - * @inheritDoc - */ - Mesh.prototype.dispose = function () { - _super.prototype.dispose.call(this); - - this.material = null; - this.geometry = null; - }; - - /** - * Disposes mesh including the animator and children. This is a merely a convenience method. - * @return - */ - Mesh.prototype.disposeWithAnimatorAndChildren = function () { - this.disposeWithChildren(); - - if (this._animator) - this._animator.dispose(); - }; - - /** - * Clones this Mesh instance along with all it's children, while re-using the same - * material, geometry and animation set. The returned result will be a copy of this mesh, - * containing copies of all of it's children. - * - * Properties that are re-used (i.e. not cloned) by the new copy include name, - * geometry, and material. Properties that are cloned or created anew for the copy - * include subMeshes, children of the mesh, and the animator. - * - * If you want to copy just the mesh, reusing it's geometry and material while not - * cloning it's children, the simplest way is to create a new mesh manually: - * - * - * var clone : Mesh = new Mesh(original.geometry, original.material); - * - */ - Mesh.prototype.clone = function () { - var clone = new Mesh(this._geometry, this._material); - - clone._iMatrix3D = this._iMatrix3D; - clone.pivot = this.pivot; - clone.partition = this.partition; - clone.bounds = this.bounds.clone(); - - clone.name = this.name; - clone.castsShadows = this.castsShadows; - clone.shareAnimationGeometry = this.shareAnimationGeometry; - clone.mouseEnabled = this.mouseEnabled; - clone.mouseChildren = this.mouseChildren; - - //this is of course no proper cloning - //maybe use this instead?: http://blog.another-d-mention.ro/programming/how-to-clone-duplicate-an-object-in-actionscript-3/ - clone.extra = this.extra; - - var len = this._subMeshes.length; - for (var i = 0; i < len; ++i) - clone._subMeshes[i].material = this._subMeshes[i]._iGetExplicitMaterial(); - - len = this.numChildren; - var obj; - - for (i = 0; i < len; ++i) { - obj = this.getChildAt(i).clone(); - clone.addChild(obj); - } - - if (this._animator) - clone.animator = this._animator.clone(); - - return clone; - }; - - /** - * //TODO - * - * @param subGeometry - * @returns {SubMeshBase} - */ - Mesh.prototype.getSubMeshFromSubGeometry = function (subGeometry) { - return this._subMeshes[this._geometry.subGeometries.indexOf(subGeometry)]; - }; - - /** - * @protected - */ - Mesh.prototype.pCreateEntityPartitionNode = function () { - return new away.partition.EntityNode(this); - }; - - /** - * //TODO - * - * @protected - */ - Mesh.prototype.pUpdateBounds = function () { - this._pBounds.fromGeometry(this._geometry); - - _super.prototype.pUpdateBounds.call(this); - }; - - /** - * //TODO - * - * @private - */ - Mesh.prototype.onGeometryBoundsInvalid = function (event) { - this.pInvalidateBounds(); - }; - - /** - * Called when a SubGeometry was added to the Geometry. - * - * @private - */ - Mesh.prototype.onSubGeometryAdded = function (event) { - this.addSubMesh(event.subGeometry); - }; - - /** - * Called when a SubGeometry was removed from the Geometry. - * - * @private - */ - Mesh.prototype.onSubGeometryRemoved = function (event) { - var subMesh; - var subGeom = event.subGeometry; - var len = this._subMeshes.length; - var i; - - for (i = 0; i < len; ++i) { - subMesh = this._subMeshes[i]; - - if (subMesh.subGeometry == subGeom) { - subMesh.dispose(); - - this._subMeshes.splice(i, 1); - - break; - } - } - - --len; - for (; i < len; ++i) - this._subMeshes[i]._iIndex = i; - }; - - /** - * Adds a SubMeshBase wrapping a SubGeometry. - * - * @param subGeometry - */ - Mesh.prototype.addSubMesh = function (subGeometry) { - var SubMeshClass = subGeometry.subMeshClass; - - var subMesh = new SubMeshClass(subGeometry, this, null); - var len = this._subMeshes.length; - - subMesh._iIndex = len; - - this._subMeshes[len] = subMesh; - - this.pInvalidateBounds(); - }; - - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - Mesh.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { - return this._pPickingCollider.testMeshCollision(this, this._pPickingCollisionVO, shortestCollisionDistance, findClosest); - }; - - /** - * - * @param renderer - * - * @internal - */ - Mesh.prototype._iCollectRenderables = function (renderer) { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - var len = this._subMeshes.length; - for (var i = 0; i < len; i++) - this._subMeshes[i]._iCollectRenderable(renderer); - }; - - Mesh.prototype._iInvalidateRenderableGeometries = function () { - var len = this._subMeshes.length; - for (var i = 0; i < len; ++i) - this._subMeshes[i]._iInvalidateRenderableGeometry(); - }; - return Mesh; - })(away.containers.DisplayObjectContainer); - entities.Mesh = Mesh; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (entities) { - var BoundingSphere = away.bounds.BoundingSphere; - - var Matrix3D = away.geom.Matrix3D; - var Vector3D = away.geom.Vector3D; - var CubeMapShadowMapper = away.materials.CubeMapShadowMapper; - - var PointLightNode = away.partition.PointLightNode; - - var PointLight = (function (_super) { - __extends(PointLight, _super); - function PointLight() { - _super.call(this); - this._pRadius = 90000; - this._pFallOff = 100000; - - this._pIsEntity = true; - - this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); - } - PointLight.prototype.pCreateShadowMapper = function () { - return new CubeMapShadowMapper(); - }; - - Object.defineProperty(PointLight.prototype, "radius", { - get: function () { - return this._pRadius; - }, - set: function (value) { - this._pRadius = value; - - if (this._pRadius < 0) { - this._pRadius = 0; - } else if (this._pRadius > this._pFallOff) { - this._pFallOff = this._pRadius; - this.pInvalidateBounds(); - } - this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); - }, - enumerable: true, - configurable: true - }); - - - PointLight.prototype.iFallOffFactor = function () { - return this._pFallOffFactor; - }; - - Object.defineProperty(PointLight.prototype, "fallOff", { - get: function () { - return this._pFallOff; - }, - set: function (value) { - this._pFallOff = value; - - if (this._pFallOff < 0) - this._pFallOff = 0; - - if (this._pFallOff < this._pRadius) - this._pRadius = this._pFallOff; - - this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); - this.pInvalidateBounds(); - }, - enumerable: true, - configurable: true - }); - - - /** - * @protected - */ - PointLight.prototype.pCreateEntityPartitionNode = function () { - return new PointLightNode(this); - }; - - PointLight.prototype.pUpdateBounds = function () { - this._pBounds.fromSphere(new Vector3D(), this._pFallOff); - this._pBoundsInvalid = false; - }; - - PointLight.prototype.pCreateDefaultBoundingVolume = function () { - //point lights are culled based on their falloff radius - return new BoundingSphere(); - }; - - PointLight.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { - if (typeof target === "undefined") { target = null; } - var raw = new Array(16); - var bounds = entity.bounds; - var m = new Matrix3D(); - - // todo: do not use lookAt on Light - m.copyFrom(entity.getRenderSceneTransform(camera)); - m.append(this._pParent.inverseSceneTransform); - this.lookAt(m.position); - - m.copyFrom(entity.getRenderSceneTransform(camera)); - m.append(this.inverseSceneTransform); - - var box = bounds.aabb; - var v1 = m.deltaTransformVector(new Vector3D(box.left, box.bottom, box.front)); - var v2 = m.deltaTransformVector(new Vector3D(box.right, box.top, box.back)); - var d1 = v1.x * v1.x + v1.y * v1.y + v1.z * v1.z; - var d2 = v2.x * v2.x + v2.y * v2.y + v2.z * v2.z; - var d = Math.sqrt(d1 > d2 ? d1 : d2); - var zMin; - var zMax; - - var z = m.rawData[14]; - zMin = z - d; - zMax = z + d; - - raw[5] = raw[0] = zMin / d; - raw[10] = zMax / (zMax - zMin); - raw[11] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[12] = raw[13] = raw[15] = 0; - raw[14] = -zMin * raw[10]; - - if (!target) - target = new Matrix3D(); - - target.copyRawDataFrom(raw); - target.prepend(m); - - return target; - }; - - PointLight.prototype._iCollectRenderables = function (renderer) { - //nothing to do here - }; - return PointLight; - })(away.base.LightBase); - entities.PointLight = PointLight; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * This class is used to create lightweight shapes using the ActionScript - * drawing application program interface(API). The Shape class includes a - * graphics property, which lets you access methods from the - * Graphics class. - * - *

The Sprite class also includes a graphicsproperty, and it - * includes other features not available to the Shape class. For example, a - * Sprite object is a display object container, whereas a Shape object is not - * (and cannot contain child display objects). For this reason, Shape objects - * consume less memory than Sprite objects that contain the same graphics. - * However, a Sprite object supports user input events, while a Shape object - * does not.

- */ - (function (entities) { - var Shape = (function (_super) { - __extends(Shape, _super); - /** - * Creates a new Shape object. - */ - function Shape() { - _super.call(this); - } - Object.defineProperty(Shape.prototype, "graphics", { - /** - * Specifies the Graphics object belonging to this Shape object, where vector - * drawing commands can occur. - */ - get: function () { - return this._graphics; - }, - enumerable: true, - configurable: true - }); - return Shape; - })(away.base.DisplayObject); - entities.Shape = Shape; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (entities) { - var NullBounds = away.bounds.NullBounds; - - var SkyboxNode = away.partition.SkyboxNode; - - /** - * A Skybox class is used to render a sky in the scene. It's always considered static and 'at infinity', and as - * such it's always centered at the camera's position and sized to exactly fit within the camera's frustum, ensuring - * the sky box is always as large as possible without being clipped. - */ - var Skybox = (function (_super) { - __extends(Skybox, _super); - /** - * Create a new Skybox object. - * - * @param material The material with which to render the Skybox. - */ - function Skybox(material) { - _super.call(this); - - this._pIsEntity = true; - - this.material = material; - } - Object.defineProperty(Skybox.prototype, "animator", { - get: function () { - return this._animator; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Skybox.prototype, "uvTransform", { - /** - * - */ - get: function () { - return this._uvTransform; - }, - set: function (value) { - this._uvTransform = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Skybox.prototype, "material", { - /** - * The material with which to render the Skybox. - */ - get: function () { - return this._material; - }, - set: function (value) { - if (value == this._material) - return; - - if (this._material) - this._material.iRemoveOwner(this); - - this._material = value; - - if (this._material) - this._material.iAddOwner(this); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(Skybox.prototype, "assetType", { - get: function () { - return away.library.AssetType.SKYBOX; - }, - enumerable: true, - configurable: true - }); - - /** - * @protected - */ - Skybox.prototype.pInvalidateBounds = function () { - // dead end - }; - - /** - * @protected - */ - Skybox.prototype.pCreateEntityPartitionNode = function () { - return new SkyboxNode(this); - }; - - /** - * @protected - */ - Skybox.prototype.pCreateDefaultBoundingVolume = function () { - return new NullBounds(); - }; - - /** - * @protected - */ - Skybox.prototype.pUpdateBounds = function () { - this._pBoundsInvalid = false; - }; - - Object.defineProperty(Skybox.prototype, "castsShadows", { - get: function () { - return false; - }, - enumerable: true, - configurable: true - }); - - Skybox.prototype._iCollectRenderables = function (renderer) { - //skybox do not get collected in the standard entity list - }; - - Skybox.prototype._iCollectRenderable = function (renderer) { - }; - return Skybox; - })(away.base.DisplayObject); - entities.Skybox = Skybox; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - /** - * The TextField class is used to create display objects for text display and - * input. You can use the TextField class to - * perform low-level text rendering. However, in Flex, you typically use the - * Label, Text, TextArea, and TextInput controls to process text. You can give a text field an instance name in the - * Property inspector and use the methods and properties of the TextField - * class to manipulate it with ActionScript. TextField instance names are - * displayed in the Movie Explorer and in the Insert Target Path dialog box in - * the Actions panel. - * - *

To create a text field dynamically, use the TextField() - * constructor.

- * - *

The methods of the TextField class let you set, select, and manipulate - * text in a dynamic or input text field that you create during authoring or - * at runtime.

- * - *

ActionScript provides several ways to format your text at runtime. The - * TextFormat class lets you set character and paragraph formatting for - * TextField objects. You can apply Cascading Style Sheets(CSS) styles to - * text fields by using the TextField.styleSheet property and the - * StyleSheet class. You can use CSS to style built-in HTML tags, define new - * formatting tags, or apply styles. You can assign HTML formatted text, which - * optionally uses CSS styles, directly to a text field. HTML text that you - * assign to a text field can contain embedded media(movie clips, SWF files, - * GIF files, PNG files, and JPEG files). The text wraps around the embedded - * media in the same way that a web browser wraps text around media embedded - * in an HTML document.

- * - *

Flash Player supports a subset of HTML tags that you can use to format - * text. See the list of supported HTML tags in the description of the - * htmlText property.

- * - * @event change Dispatched after a control value is - * modified, unlike the - * textInput event, which is - * dispatched before the value is modified. - * Unlike the W3C DOM Event Model version of - * the change event, which - * dispatches the event only after the - * control loses focus, the ActionScript 3.0 - * version of the change event - * is dispatched any time the control - * changes. For example, if a user types text - * into a text field, a change - * event is dispatched after every keystroke. - * @event link Dispatched when a user clicks a hyperlink - * in an HTML-enabled text field, where the - * URL begins with "event:". The remainder of - * the URL after "event:" is placed in the - * text property of the LINK event. - * - *

Note: The default behavior, - * adding the text to the text field, occurs - * only when Flash Player generates the - * event, which in this case happens when a - * user attempts to input text. You cannot - * put text into a text field by sending it - * textInput events.

- * @event scroll Dispatched by a TextField object - * after the user scrolls. - * @event textInput Flash Player dispatches the - * textInput event when a user - * enters one or more characters of text. - * Various text input methods can generate - * this event, including standard keyboards, - * input method editors(IMEs), voice or - * speech recognition systems, and even the - * act of pasting plain text with no - * formatting or style information. - * @event textInteractionModeChange Flash Player dispatches the - * textInteractionModeChange - * event when a user changes the interaction - * mode of a text field. for example on - * Android, one can toggle from NORMAL mode - * to SELECTION mode using context menu - * options - */ - (function (entities) { - var TextField = (function (_super) { - __extends(TextField, _super); - /** - * Creates a new TextField instance. After you create the TextField instance, - * call the addChild() or addChildAt() method of - * the parent DisplayObjectContainer object to add the TextField instance to - * the display list. - * - *

The default size for a text field is 100 x 100 pixels.

- */ - function TextField() { - _super.call(this); - this._text = ""; - } - Object.defineProperty(TextField.prototype, "bottomScrollV", { - /** - * An integer(1-based index) that indicates the bottommost line that is - * currently visible in the specified text field. Think of the text field as - * a window onto a block of text. The scrollV property is the - * 1-based index of the topmost visible line in the window. - * - *

All the text between the lines indicated by scrollV and - * bottomScrollV is currently visible in the text field.

- */ - get: function () { - return this._bottomScrollV; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextField.prototype, "caretIndex", { - /** - * The index of the insertion point(caret) position. If no insertion point - * is displayed, the value is the position the insertion point would be if - * you restored focus to the field(typically where the insertion point last - * was, or 0 if the field has not had focus). - * - *

Selection span indexes are zero-based(for example, the first position - * is 0, the second position is 1, and so on).

- */ - get: function () { - return this._caretIndex; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextField.prototype, "length", { - /** - * The number of characters in a text field. A character such as tab - * (\t) counts as one character. - */ - get: function () { - return this._length; - }, - enumerable: true, - configurable: true - }); - - /** - * The maximum value of scrollH. - */ - TextField.prototype.maxScrollH = function () { - return this._maxScrollH; - }; - - /** - * The maximum value of scrollV. - */ - TextField.prototype.maxScrollV = function () { - return this._maxScrollV; - }; - - Object.defineProperty(TextField.prototype, "numLines", { - /** - * Defines the number of text lines in a multiline text field. If - * wordWrap property is set to true, the number of - * lines increases when text wraps. - */ - get: function () { - return this._numLines; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextField.prototype, "selectionBeginIndex", { - /** - * The zero-based character index value of the first character in the current - * selection. For example, the first character is 0, the second character is - * 1, and so on. If no text is selected, this property is the value of - * caretIndex. - */ - get: function () { - return this._selectionBeginIndex; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextField.prototype, "selectionEndIndex", { - /** - * The zero-based character index value of the last character in the current - * selection. For example, the first character is 0, the second character is - * 1, and so on. If no text is selected, this property is the value of - * caretIndex. - */ - get: function () { - return this._selectionEndIndex; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextField.prototype, "text", { - /** - * A string that is the current text in the text field. Lines are separated - * by the carriage return character('\r', ASCII 13). This - * property contains unformatted text in the text field, without HTML tags. - * - *

To get the text in HTML form, use the htmlText - * property.

- */ - get: function () { - return this._text; - }, - set: function (value) { - if (this._text == value) - return; - - this._text = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(TextField.prototype, "textHeight", { - /** - * The height of the text in pixels. - */ - get: function () { - return this._textHeight; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextField.prototype, "textInteractionMode", { - /** - * The interaction mode property, Default value is - * TextInteractionMode.NORMAL. On mobile platforms, the normal mode implies - * that the text can be scrolled but not selected. One can switch to the - * selectable mode through the in-built context menu on the text field. On - * Desktop, the normal mode implies that the text is in scrollable as well as - * selection mode. - */ - get: function () { - return this._textInteractionMode; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(TextField.prototype, "textWidth", { - /** - * The width of the text in pixels. - */ - get: function () { - return this._textWidth; - }, - enumerable: true, - configurable: true - }); - - /** - * Appends the string specified by the newText parameter to the - * end of the text of the text field. This method is more efficient than an - * addition assignment(+=) on a text property - * (such as someTextField.text += moreText), particularly for a - * text field that contains a significant amount of content. - * - * @param newText The string to append to the existing text. - */ - TextField.prototype.appendText = function (newText) { - //TODO - }; - - /** - * Returns a rectangle that is the bounding box of the character. - * - * @param charIndex The zero-based index value for the character(for - * example, the first position is 0, the second position is - * 1, and so on). - * @return A rectangle with x and y minimum and - * maximum values defining the bounding box of the character. - */ - TextField.prototype.getCharBoundaries = function (charIndex) { - return this._charBoundaries; - }; - - /** - * Returns the zero-based index value of the character at the point specified - * by the x and y parameters. - * - * @param x The x coordinate of the character. - * @param y The y coordinate of the character. - * @return The zero-based index value of the character(for example, the - * first position is 0, the second position is 1, and so on). Returns - * -1 if the point is not over any character. - */ - TextField.prototype.getCharIndexAtPoint = function (x, y) { - return this._charIndexAtPoint; - }; - - /** - * Given a character index, returns the index of the first character in the - * same paragraph. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return The zero-based index value of the first character in the same - * paragraph. - * @throws RangeError The character index specified is out of range. - */ - TextField.prototype.getFirstCharInParagraph = function (charIndex /*int*/ ) { - return this._firstCharInParagraph; - }; - - /** - * Returns a DisplayObject reference for the given id, for an - * image or SWF file that has been added to an HTML-formatted text field by - * using an tag. The tag is in the - * following format: - * - *

 

- * - * @param id The id to match(in the id attribute - * of the tag). - * @return The display object corresponding to the image or SWF file with the - * matching id attribute in the tag - * of the text field. For media loaded from an external source, this - * object is a Loader object, and, once loaded, the media object is a - * child of that Loader object. For media embedded in the SWF file, - * it is the loaded object. If no tag with the - * matching id exists, the method returns - * null. - */ - TextField.prototype.getImageReference = function (id) { - return this._imageReference; - }; - - /** - * Returns the zero-based index value of the line at the point specified by - * the x and y parameters. - * - * @param x The x coordinate of the line. - * @param y The y coordinate of the line. - * @return The zero-based index value of the line(for example, the first - * line is 0, the second line is 1, and so on). Returns -1 if the - * point is not over any line. - */ - TextField.prototype.getLineIndexAtPoint = function (x, y) { - return this._lineIndexAtPoint; - }; - - /** - * Returns the zero-based index value of the line containing the character - * specified by the charIndex parameter. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return The zero-based index value of the line. - * @throws RangeError The character index specified is out of range. - */ - TextField.prototype.getLineIndexOfChar = function (charIndex /*int*/ ) { - return this._lineIndexOfChar; - }; - - /** - * Returns the number of characters in a specific text line. - * - * @param lineIndex The line number for which you want the length. - * @return The number of characters in the line. - * @throws RangeError The line number specified is out of range. - */ - TextField.prototype.getLineLength = function (lineIndex /*int*/ ) { - return this._lineLength; - }; - - /** - * Returns metrics information about a given text line. - * - * @param lineIndex The line number for which you want metrics information. - * @return A TextLineMetrics object. - * @throws RangeError The line number specified is out of range. - */ - TextField.prototype.getLineMetrics = function (lineIndex /*int*/ ) { - return this._lineMetrics; - }; - - /** - * Returns the character index of the first character in the line that the - * lineIndex parameter specifies. - * - * @param lineIndex The zero-based index value of the line(for example, the - * first line is 0, the second line is 1, and so on). - * @return The zero-based index value of the first character in the line. - * @throws RangeError The line number specified is out of range. - */ - TextField.prototype.getLineOffset = function (lineIndex /*int*/ ) { - return this._lineOffset; - }; - - /** - * Returns the text of the line specified by the lineIndex - * parameter. - * - * @param lineIndex The zero-based index value of the line(for example, the - * first line is 0, the second line is 1, and so on). - * @return The text string contained in the specified line. - * @throws RangeError The line number specified is out of range. - */ - TextField.prototype.getLineText = function (lineIndex /*int*/ ) { - return this._lineText; - }; - - /** - * Given a character index, returns the length of the paragraph containing - * the given character. The length is relative to the first character in the - * paragraph(as returned by getFirstCharInParagraph()), not to - * the character index passed in. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return Returns the number of characters in the paragraph. - * @throws RangeError The character index specified is out of range. - */ - TextField.prototype.getParagraphLength = function (charIndex /*int*/ ) { - return this._paragraphLength; - }; - - /** - * Returns a TextFormat object that contains formatting information for the - * range of text that the beginIndex and endIndex - * parameters specify. Only properties that are common to the entire text - * specified are set in the resulting TextFormat object. Any property that is - * mixed, meaning that it has different values at different points in - * the text, has a value of null. - * - *

If you do not specify values for these parameters, this method is - * applied to all the text in the text field.

- * - *

The following table describes three possible usages:

- * - * @return The TextFormat object that represents the formatting properties - * for the specified text. - * @throws RangeError The beginIndex or endIndex - * specified is out of range. - */ - TextField.prototype.getTextFormat = function (beginIndex, endIndex) { - if (typeof beginIndex === "undefined") { beginIndex = -1; } - if (typeof endIndex === "undefined") { endIndex = -1; } - return this._textFormat; - }; - - /** - * Replaces the current selection with the contents of the value - * parameter. The text is inserted at the position of the current selection, - * using the current default character format and default paragraph format. - * The text is not treated as HTML. - * - *

You can use the replaceSelectedText() method to insert and - * delete text without disrupting the character and paragraph formatting of - * the rest of the text.

- * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - * @param value The string to replace the currently selected text. - * @throws Error This method cannot be used on a text field with a style - * sheet. - */ - TextField.prototype.replaceSelectedText = function (value) { - }; - - /** - * Replaces the range of characters that the beginIndex and - * endIndex parameters specify with the contents of the - * newText parameter. As designed, the text from - * beginIndex to endIndex-1 is replaced. - * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - * @param beginIndex The zero-based index value for the start position of the - * replacement range. - * @param endIndex The zero-based index position of the first character - * after the desired text span. - * @param newText The text to use to replace the specified range of - * characters. - * @throws Error This method cannot be used on a text field with a style - * sheet. - */ - TextField.prototype.replaceText = function (beginIndex /*int*/ , endIndex /*int*/ , newText) { - }; - - /** - * Sets as selected the text designated by the index values of the first and - * last characters, which are specified with the beginIndex and - * endIndex parameters. If the two parameter values are the - * same, this method sets the insertion point, as if you set the - * caretIndex property. - * - * @param beginIndex The zero-based index value of the first character in the - * selection(for example, the first character is 0, the - * second character is 1, and so on). - * @param endIndex The zero-based index value of the last character in the - * selection. - */ - TextField.prototype.setSelection = function (beginIndex /*int*/ , endIndex /*int*/ ) { - }; - - /** - * Applies the text formatting that the format parameter - * specifies to the specified text in a text field. The value of - * format must be a TextFormat object that specifies the desired - * text formatting changes. Only the non-null properties of - * format are applied to the text field. Any property of - * format that is set to null is not applied. By - * default, all of the properties of a newly created TextFormat object are - * set to null. - * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - *

The setTextFormat() method changes the text formatting - * applied to a range of characters or to the entire body of text in a text - * field. To apply the properties of format to all text in the text field, do - * not specify values for beginIndex and endIndex. - * To apply the properties of the format to a range of text, specify values - * for the beginIndex and the endIndex parameters. - * You can use the length property to determine the index - * values.

- * - *

The two types of formatting information in a TextFormat object are - * character level formatting and paragraph level formatting. Each character - * in a text field can have its own character formatting settings, such as - * font name, font size, bold, and italic.

- * - *

For paragraphs, the first character of the paragraph is examined for - * the paragraph formatting settings for the entire paragraph. Examples of - * paragraph formatting settings are left margin, right margin, and - * indentation.

- * - *

Any text inserted manually by the user, or replaced by the - * replaceSelectedText() method, receives the default text field - * formatting for new text, and not the formatting specified for the text - * insertion point. To set the default formatting for new text, use - * defaultTextFormat.

- * - * @param format A TextFormat object that contains character and paragraph - * formatting information. - * @throws Error This method cannot be used on a text field with a style - * sheet. - * @throws RangeError The beginIndex or endIndex - * specified is out of range. - */ - TextField.prototype.setTextFormat = function (format, beginIndex, endIndex) { - if (typeof beginIndex === "undefined") { beginIndex = -1; } - if (typeof endIndex === "undefined") { endIndex = -1; } - }; - - /** - * Returns true if an embedded font is available with the specified - * fontName and fontStyle where - * Font.fontType is flash.text.FontType.EMBEDDED. - * Starting with Flash Player 10, two kinds of embedded fonts can appear in a - * SWF file. Normal embedded fonts are only used with TextField objects. CFF - * embedded fonts are only used with the flash.text.engine classes. The two - * types are distinguished by the fontType property of the - * Font class, as returned by the enumerateFonts() - * function. - * - *

TextField cannot use a font of type EMBEDDED_CFF. If - * embedFonts is set to true and the only font - * available at run time with the specified name and style is of type - * EMBEDDED_CFF, Flash Player fails to render the text, as if no - * embedded font were available with the specified name and style.

- * - *

If both EMBEDDED and EMBEDDED_CFF fonts are - * available with the same name and style, the EMBEDDED font is - * selected and text renders with the EMBEDDED font.

- * - * @param fontName The name of the embedded font to check. - * @param fontStyle Specifies the font style to check. Use - * flash.text.FontStyle - * @return true if a compatible embedded font is available, - * otherwise false. - * @throws ArgumentError The fontStyle specified is not a member - * of flash.text.FontStyle. - */ - TextField.isFontCompatible = function (fontName, fontStyle) { - return false; - }; - return TextField; - })(away.base.DisplayObject); - entities.TextField = TextField; - })(away.entities || (away.entities = {})); - var entities = away.entities; -})(away || (away = {})); -/// -var away; -(function (away) { - // Reference note: http://www.w3schools.com/jsref/dom_obj_event.asp - (function (managers) { - /** - * MouseManager enforces a singleton pattern and is not intended to be instanced. - * it provides a manager class for detecting mouse hits on scene objects and sending out mouse events. - */ - var MouseManager = (function () { - /** - * Creates a new MouseManager object. - */ - function MouseManager() { - var _this = this; - this._viewLookup = new Array(); - this._nullVector = new away.geom.Vector3D(); - this._queuedEvents = new Array(); - this._mouseUp = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_UP); - this._mouseClick = new away.events.MouseEvent(away.events.MouseEvent.CLICK); - this._mouseOut = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_OUT); - this._mouseDown = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_DOWN); - this._mouseMove = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_MOVE); - this._mouseOver = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_OVER); - this._mouseWheel = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_WHEEL); - this._mouseDoubleClick = new away.events.MouseEvent(away.events.MouseEvent.DOUBLE_CLICK); - this.onClickDelegate = function (event) { - return _this.onClick(event); - }; - this.onDoubleClickDelegate = function (event) { - return _this.onDoubleClick(event); - }; - this.onMouseDownDelegate = function (event) { - return _this.onMouseDown(event); - }; - this.onMouseMoveDelegate = function (event) { - return _this.onMouseMove(event); - }; - this.onMouseUpDelegate = function (event) { - return _this.onMouseUp(event); - }; - this.onMouseWheelDelegate = function (event) { - return _this.onMouseWheel(event); - }; - this.onMouseOverDelegate = function (event) { - return _this.onMouseOver(event); - }; - this.onMouseOutDelegate = function (event) { - return _this.onMouseOut(event); - }; - } - MouseManager.getInstance = function () { - if (this._instance) - return this._instance; - - return (this._instance = new MouseManager()); - }; - - MouseManager.prototype.fireMouseEvents = function (forceMouseMove) { - // If colliding object has changed, queue over/out events. - if (this._iCollidingObject != this._previousCollidingObject) { - if (this._previousCollidingObject) - this.queueDispatch(this._mouseOut, this._mouseMoveEvent, this._previousCollidingObject); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseOver, this._mouseMoveEvent); - } - - // Fire mouse move events here if forceMouseMove is on. - if (forceMouseMove && this._iCollidingObject) - this.queueDispatch(this._mouseMove, this._mouseMoveEvent); - - var event; - var dispatcher; - - // Dispatch all queued events. - var len = this._queuedEvents.length; - for (var i = 0; i < len; ++i) { - // Only dispatch from first implicitly enabled object ( one that is not a child of a mouseChildren = false hierarchy ). - event = this._queuedEvents[i]; - dispatcher = event.object; - - while (dispatcher && !dispatcher._iIsMouseEnabled()) - dispatcher = dispatcher.parent; - - if (dispatcher) - dispatcher.dispatchEvent(event); - } - - this._queuedEvents.length = 0; - - this._previousCollidingObject = this._iCollidingObject; - - this._iUpdateDirty = false; - }; - - // public addViewLayer(view:away.containers.View) - // { - // var stg:Stage = view.stage; - // - // // Add instance to mouse3dmanager to fire mouse events for multiple views - // if (!view.stageGL.mouse3DManager) - // view.stageGL.mouse3DManager = this; - // - // if (!hasKey(view)) - // _view3Ds[view] = 0; - // - // _childDepth = 0; - // traverseDisplayObjects(stg); - // _viewCount = _childDepth; - // } - MouseManager.prototype.registerView = function (view) { - view.htmlElement.addEventListener("click", this.onClickDelegate); - view.htmlElement.addEventListener("dblclick", this.onDoubleClickDelegate); - view.htmlElement.addEventListener("mousedown", this.onMouseDownDelegate); - view.htmlElement.addEventListener("mousemove", this.onMouseMoveDelegate); - view.htmlElement.addEventListener("mouseup", this.onMouseUpDelegate); - view.htmlElement.addEventListener("mousewheel", this.onMouseWheelDelegate); - view.htmlElement.addEventListener("mouseover", this.onMouseOverDelegate); - view.htmlElement.addEventListener("mouseout", this.onMouseOutDelegate); - - this._viewLookup.push(view); - }; - - MouseManager.prototype.unregisterView = function (view) { - view.htmlElement.removeEventListener("click", this.onClickDelegate); - view.htmlElement.removeEventListener("dblclick", this.onDoubleClickDelegate); - view.htmlElement.removeEventListener("mousedown", this.onMouseDownDelegate); - view.htmlElement.removeEventListener("mousemove", this.onMouseMoveDelegate); - view.htmlElement.removeEventListener("mouseup", this.onMouseUpDelegate); - view.htmlElement.removeEventListener("mousewheel", this.onMouseWheelDelegate); - view.htmlElement.removeEventListener("mouseover", this.onMouseOverDelegate); - view.htmlElement.removeEventListener("mouseout", this.onMouseOutDelegate); - - this._viewLookup.slice(this._viewLookup.indexOf(view), 1); - }; - - // --------------------------------------------------------------------- - // Private. - // --------------------------------------------------------------------- - MouseManager.prototype.queueDispatch = function (event, sourceEvent, collider) { - if (typeof collider === "undefined") { collider = null; } - // 2D properties. - if (sourceEvent) { - event.ctrlKey = sourceEvent.ctrlKey; - event.altKey = sourceEvent.altKey; - event.shiftKey = sourceEvent.shiftKey; - event.screenX = sourceEvent.clientX; - event.screenY = sourceEvent.clientY; - } - - if (collider == null) - collider = this._iCollidingObject; - - // 3D properties. - if (collider) { - // Object. - event.object = collider.displayObject; - event.materialOwner = collider.materialOwner; - - // UV. - event.uv = collider.uv; - - // Position. - event.localPosition = collider.localPosition ? collider.localPosition.clone() : null; - - // Normal. - event.localNormal = collider.localNormal ? collider.localNormal.clone() : null; - - // Face index. - event.index = collider.index; - } else { - // Set all to null. - event.uv = null; - event.object = null; - event.localPosition = this._nullVector; - event.localNormal = this._nullVector; - event.index = 0; - event.subGeometryIndex = 0; - } - - // Store event to be dispatched later. - this._queuedEvents.push(event); - }; - - // --------------------------------------------------------------------- - // Listeners. - // --------------------------------------------------------------------- - MouseManager.prototype.onMouseMove = function (event) { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseMove, this._mouseMoveEvent = event); - }; - - MouseManager.prototype.onMouseOut = function (event) { - this._iActiveDiv = null; - - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseOut, event); - }; - - MouseManager.prototype.onMouseOver = function (event) { - this._iActiveDiv = event.target; - - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseOver, event); - }; - - MouseManager.prototype.onClick = function (event) { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseClick, event); - }; - - MouseManager.prototype.onDoubleClick = function (event) { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseDoubleClick, event); - }; - - MouseManager.prototype.onMouseDown = function (event) { - this._iActiveDiv = event.target; - - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseDown, event); - }; - - MouseManager.prototype.onMouseUp = function (event) { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseUp, event); - }; - - MouseManager.prototype.onMouseWheel = function (event) { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseWheel, event); - }; - - MouseManager.prototype.updateColliders = function (event) { - if (this._iUpdateDirty) - return; - - var view; - var bounds; - var mouseX = event.clientX; - var mouseY = event.clientY; - var len = this._viewLookup.length; - for (var i = 0; i < len; i++) { - view = this._viewLookup[i]; - bounds = view.htmlElement.getBoundingClientRect(); - if (mouseX < bounds.left || mouseX > bounds.right || mouseY < bounds.top || mouseY > bounds.bottom) { - view._pMouseX = null; - view._pMouseY = null; - } else { - view._pMouseX = mouseX + bounds.left; - view._pMouseY = mouseY + bounds.top; - view.updateCollider(); - - if (view.layeredView && this._iCollidingObject) - break; - } - } - - this._iUpdateDirty = true; - }; - return MouseManager; - })(); - managers.MouseManager = MouseManager; - })(away.managers || (away.managers = {})); - var managers = away.managers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (managers) { - var Stage = away.base.Stage; - - var StageEvent = away.events.StageEvent; - - /** - * The StageManager class provides a multiton object that handles management for Stage objects. - * - * @see away.base.Stage - */ - var StageManager = (function (_super) { - __extends(StageManager, _super); - /** - * Creates a new StageManager class. - * @param stage The Stage object that contains the Stage objects to be managed. - * @private - */ - function StageManager(StageManagerSingletonEnforcer) { - var _this = this; - _super.call(this); - - if (!StageManagerSingletonEnforcer) - throw new Error("This class is a multiton and cannot be instantiated manually. Use StageManager.getInstance instead."); - - this._stages = new Array(StageManager.STAGE_MAX_QUANTITY); - - this._onContextCreatedDelegate = function (event) { - return _this.onContextCreated(event); - }; - } - /** - * Gets a StageManager instance for the given Stage object. - * @param stage The Stage object that contains the Stage objects to be managed. - * @return The StageManager instance for the given Stage object. - */ - StageManager.getInstance = function () { - if (this._instance == null) - this._instance = new StageManager(new StageManagerSingletonEnforcer()); - - return this._instance; - }; - - /** - * Requests the Stage for the given index. - * - * @param index The index of the requested Stage. - * @param forceSoftware Whether to force software mode even if hardware acceleration is available. - * @param profile The compatibility profile, an enumeration of ContextProfile - * @return The Stage for the given index. - */ - StageManager.prototype.getStageAt = function (index, forceSoftware, profile, mode) { - if (typeof forceSoftware === "undefined") { forceSoftware = false; } - if (typeof profile === "undefined") { profile = "baseline"; } - if (typeof mode === "undefined") { mode = "auto"; } - if (index < 0 || index >= StageManager.STAGE_MAX_QUANTITY) - throw new away.errors.ArgumentError("Index is out of bounds [0.." + StageManager.STAGE_MAX_QUANTITY + "]"); - - if (!this._stages[index]) { - StageManager._numStages++; - - var canvas = document.createElement("canvas"); - canvas.id = "stage" + index; - document.body.appendChild(canvas); - var stage = this._stages[index] = new Stage(canvas, index, this, forceSoftware, profile); - stage.addEventListener(StageEvent.CONTEXT_CREATED, this._onContextCreatedDelegate); - stage.requestContext(forceSoftware, profile, mode); - } - - return stage; - }; - - /** - * Removes a Stage from the manager. - * @param stage - * @private - */ - StageManager.prototype.iRemoveStage = function (stage) { - StageManager._numStages--; - - stage.removeEventListener(StageEvent.CONTEXT_CREATED, this._onContextCreatedDelegate); - - this._stages[stage.stageIndex] = null; - }; - - /** - * Get the next available stage. An error is thrown if there are no StageProxies available - * @param forceSoftware Whether to force software mode even if hardware acceleration is available. - * @param profile The compatibility profile, an enumeration of ContextProfile - * @return The allocated stage - */ - StageManager.prototype.getFreeStage = function (forceSoftware, profile, mode) { - if (typeof forceSoftware === "undefined") { forceSoftware = false; } - if (typeof profile === "undefined") { profile = "baseline"; } - if (typeof mode === "undefined") { mode = "auto"; } - var i = 0; - var len = this._stages.length; - - while (i < len) { - if (!this._stages[i]) - return this.getStageAt(i, forceSoftware, profile, mode); - - ++i; - } - - return null; - }; - - Object.defineProperty(StageManager.prototype, "hasFreeStage", { - /** - * Checks if a new stage can be created and managed by the class. - * @return true if there is one slot free for a new stage - */ - get: function () { - return StageManager._numStages < StageManager.STAGE_MAX_QUANTITY ? true : false; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(StageManager.prototype, "numSlotsFree", { - /** - * Returns the amount of stage objects that can be created and managed by the class - * @return the amount of free slots - */ - get: function () { - return StageManager.STAGE_MAX_QUANTITY - StageManager._numStages; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(StageManager.prototype, "numSlotsUsed", { - /** - * Returns the amount of Stage objects currently managed by the class. - * @return the amount of slots used - */ - get: function () { - return StageManager._numStages; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(StageManager.prototype, "numSlotsTotal", { - /** - * The maximum amount of Stage objects that can be managed by the class - */ - get: function () { - return this._stages.length; - }, - enumerable: true, - configurable: true - }); - - StageManager.prototype.onContextCreated = function (e) { - //var stage:Stage = e.target; - //document.body.appendChild(stage.canvas) - }; - StageManager.STAGE_MAX_QUANTITY = 8; - - StageManager._numStages = 0; - return StageManager; - })(away.events.EventDispatcher); - managers.StageManager = StageManager; - })(away.managers || (away.managers = {})); - var managers = away.managers; -})(away || (away = {})); - -var StageManagerSingletonEnforcer = (function () { - function StageManagerSingletonEnforcer() { - } - return StageManagerSingletonEnforcer; -})(); -/// -var away; -(function (away) { - /** - * The Loader class is used to load SWF files or image(JPG, PNG, or GIF) - * files. Use the load() method to initiate loading. The loaded - * display object is added as a child of the Loader object. - * - *

Use the URLLoader class to load text or binary data.

- * - *

The Loader class overrides the following methods that it inherits, - * because a Loader object can only have one child display object - the - * display object that it loads. Calling the following methods throws an - * exception: addChild(), addChildAt(), - * removeChild(), removeChildAt(), and - * setChildIndex(). To remove a loaded display object, you must - * remove the Loader object from its parent DisplayObjectContainer - * child array.

- * - *

Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes - * are not used in ActionScript 3.0. The Loader and URLLoader classes replace - * them.

- * - *

When you use the Loader class, consider the Flash Player and Adobe AIR - * security model:

- * - *
    - *
  • You can load content from any accessible source.
  • - *
  • Loading is not allowed if the calling SWF file is in a network - * sandbox and the file to be loaded is local.
  • - *
  • If the loaded content is a SWF file written with ActionScript 3.0, it - * cannot be cross-scripted by a SWF file in another security sandbox unless - * that cross-scripting arrangement was approved through a call to the - * System.allowDomain() or the - * System.allowInsecureDomain() method in the loaded content - * file.
  • - *
  • If the loaded content is an AVM1 SWF file(written using ActionScript - * 1.0 or 2.0), it cannot be cross-scripted by an AVM2 SWF file(written using - * ActionScript 3.0). However, you can communicate between the two SWF files - * by using the LocalConnection class.
  • - *
  • If the loaded content is an image, its data cannot be accessed by a - * SWF file outside of the security sandbox, unless the domain of that SWF - * file was included in a URL policy file at the origin domain of the - * image.
  • - *
  • Movie clips in the local-with-file-system sandbox cannot script movie - * clips in the local-with-networking sandbox, and the reverse is also - * prevented.
  • - *
  • You cannot connect to commonly reserved ports. For a complete list of - * blocked ports, see "Restricting Networking APIs" in the ActionScript 3.0 - * Developer's Guide.
  • - *
- * - *

However, in AIR, content in the application security - * sandbox(content installed with the AIR application) are not restricted by - * these security limitations.

- * - *

For more information related to security, see the Flash Player Developer - * Center Topic: Security.

- * - *

When loading a SWF file from an untrusted source(such as a domain other - * than that of the Loader object's root SWF file), you may want to define a - * mask for the Loader object, to prevent the loaded content(which is a child - * of the Loader object) from drawing to portions of the Stage outside of that - * mask, as shown in the following code:

- */ - (function (containers) { - var AssetEvent = away.events.AssetEvent; - - var IOErrorEvent = away.events.IOErrorEvent; - var LoaderEvent = away.events.LoaderEvent; - var ParserEvent = away.events.ParserEvent; - var AssetLoader = away.library.AssetLoader; - - /** - * Dispatched when any asset finishes parsing. Also see specific events for each - * individual asset type (meshes, materials et c.) - * - * @eventType away3d.events.AssetEvent - */ - //[Event(name="assetComplete", type="away3d.events.AssetEvent")] - /** - * Dispatched when a full resource (including dependencies) finishes loading. - * - * @eventType away3d.events.LoaderEvent - */ - //[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] - var Loader = (function (_super) { - __extends(Loader, _super); - /** - * Creates a Loader object that you can use to load files, such as SWF, JPEG, - * GIF, or PNG files. Call the load() method to load the asset - * as a child of the Loader instance. You can then add the Loader object to - * the display list(for instance, by using the addChild() - * method of a DisplayObjectContainer instance). The asset appears on the - * Stage as it loads. - * - *

You can also use a Loader instance "offlist," that is without adding it - * to a display object container on the display list. In this mode, the - * Loader instance might be used to load a SWF file that contains additional - * modules of an application.

- * - *

To detect when the SWF file is finished loading, you can use the events - * of the LoaderInfo object associated with the - * contentLoaderInfo property of the Loader object. At that - * point, the code in the module SWF file can be executed to initialize and - * start the module. In the offlist mode, a Loader instance might also be - * used to load a SWF file that contains components or media assets. Again, - * you can use the LoaderInfo object event notifications to detect when the - * components are finished loading. At that point, the application can start - * using the components and media assets in the library of the SWF file by - * instantiating the ActionScript 3.0 classes that represent those components - * and assets.

- * - *

To determine the status of a Loader object, monitor the following - * events that the LoaderInfo object associated with the - * contentLoaderInfo property of the Loader object:

- * - *
    - *
  • The open event is dispatched when loading begins.
  • - *
  • The ioError or securityError event is - * dispatched if the file cannot be loaded or if an error occured during the - * load process.
  • - *
  • The progress event fires continuously while the file is - * being loaded.
  • - *
  • The complete event is dispatched when a file completes - * downloading, but before the loaded movie clip's methods and properties are - * available.
  • - *
  • The init event is dispatched after the properties and - * methods of the loaded SWF file are accessible, so you can begin - * manipulating the loaded SWF file. This event is dispatched before the - * complete handler. In streaming SWF files, the - * init event can occur significantly earlier than the - * complete event. For most purposes, use the init - * handler.
  • - *
- */ - function Loader(useAssetLibrary, assetLibraryId) { - if (typeof useAssetLibrary === "undefined") { useAssetLibrary = true; } - if (typeof assetLibraryId === "undefined") { assetLibraryId = null; } - _super.call(this); - - this._loadingSessions = new Array(); - this._useAssetLib = useAssetLibrary; - this._assetLibId = assetLibraryId; - - this._onResourceCompleteDelegate = away.utils.Delegate.create(this, this.onResourceComplete); - this._onAssetCompleteDelegate = away.utils.Delegate.create(this, this.onAssetComplete); - } - Object.defineProperty(Loader.prototype, "content", { - /** - * Contains the root display object of the SWF file or image(JPG, PNG, or - * GIF) file that was loaded by using the load() or - * loadBytes() methods. - * - * @throws SecurityError The loaded SWF file or image file belongs to a - * security sandbox to which you do not have access. - * For a loaded SWF file, you can avoid this situation - * by having the file call the - * Security.allowDomain() method or by - * having the loading file specify a - * loaderContext parameter with its - * securityDomain property set to - * SecurityDomain.currentDomain when you - * call the load() or - * loadBytes() method. - */ - get: function () { - return this._content; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(Loader.prototype, "contentLoaderInfo", { - /** - * Returns a LoaderInfo object corresponding to the object being loaded. - * LoaderInfo objects are shared between the Loader object and the loaded - * content object. The LoaderInfo object supplies loading progress - * information and statistics about the loaded file. - * - *

Events related to the load are dispatched by the LoaderInfo object - * referenced by the contentLoaderInfo property of the Loader - * object. The contentLoaderInfo property is set to a valid - * LoaderInfo object, even before the content is loaded, so that you can add - * event listeners to the object prior to the load.

- * - *

To detect uncaught errors that happen in a loaded SWF, use the - * Loader.uncaughtErrorEvents property, not the - * Loader.contentLoaderInfo.uncaughtErrorEvents property.

- */ - get: function () { - return this._contentLoaderInfo; - }, - enumerable: true, - configurable: true - }); - - /** - * Cancels a load() method operation that is currently in - * progress for the Loader instance. - * - */ - Loader.prototype.close = function () { - if (this._useAssetLib) { - var lib; - lib = away.library.AssetLibraryBundle.getInstance(this._assetLibId); - lib.stopAllLoadingSessions(); - this._loadingSessions = null; - return; - } - var i; - var length = this._loadingSessions.length; - for (i = 0; i < length; i++) { - this.removeListeners(this._loadingSessions[i]); - this._loadingSessions[i].stop(); - this._loadingSessions[i] = null; - } - this._loadingSessions = null; - }; - - /** - * Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an - * object that is a child of this Loader object. If you load an animated GIF - * file, only the first frame is displayed. As the Loader object can contain - * only a single child, issuing a subsequent load() request - * terminates the previous request, if still pending, and commences a new - * load. - * - *

Note: In AIR 1.5 and Flash Player 10, the maximum size for a - * loaded image is 8,191 pixels in width or height, and the total number of - * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191 - * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and - * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height - * and 2,880 pixels in width.

- * - *

A SWF file or image loaded into a Loader object inherits the position, - * rotation, and scale properties of the parent display objects of the Loader - * object.

- * - *

Use the unload() method to remove movies or images loaded - * with this method, or to cancel a load operation that is in progress.

- * - *

You can prevent a SWF file from using this method by setting the - * allowNetworking parameter of the the object and - * embed tags in the HTML page that contains the SWF - * content.

- * - *

When you use this method, consider the Flash Player security model, - * which is described in the Loader class description.

- * - *

In Flash Player 10 and later, if you use a multipart Content-Type(for - * example "multipart/form-data") that contains an upload(indicated by a - * "filename" parameter in a "content-disposition" header within the POST - * body), the POST operation is subject to the security rules applied to - * uploads:

- * - *
    - *
  • The POST operation must be performed in response to a user-initiated - * action, such as a mouse click or key press.
  • - *
  • If the POST operation is cross-domain(the POST target is not on the - * same server as the SWF file that is sending the POST request), the target - * server must provide a URL policy file that permits cross-domain - * access.
  • - *
- * - *

Also, for any multipart Content-Type, the syntax must be valid - * (according to the RFC2046 standard). If the syntax appears to be invalid, - * the POST operation is subject to the security rules applied to - * uploads.

- * - *

For more information related to security, see the Flash Player - * Developer Center Topic: Security.

- * - * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG - * file to be loaded. A relative path must be relative to the - * main SWF file. Absolute URLs must include the protocol - * reference, such as http:// or file:///. Filenames cannot - * include disk drive specifications. - * @param context A LoaderContext object, which has properties that define - * the following: - *
    - *
  • Whether or not to check for the existence of a policy - * file upon loading the object
  • - *
  • The ApplicationDomain for the loaded object
  • - *
  • The SecurityDomain for the loaded object
  • - *
  • The ImageDecodingPolicy for the loaded image - * object
  • - *
- * - *

If the context parameter is not specified - * or refers to a null object, the loaded content remains in - * its own security domain.

- * - *

For complete details, see the description of the - * properties in the LoaderContext - * class.

- * @param ns An optional namespace string under which the file is to be - * loaded, allowing the differentiation of two resources with - * identical assets. - * @param parser An optional parser object for translating the loaded data - * into a usable resource. If not provided, AssetLoader will - * attempt to auto-detect the file type. - * @throws IOError The digest property of the - * request object is not - * null. You should only set the - * digest property of a URLRequest - * object when calling the - * URLLoader.load() method when - * loading a SWZ file(an Adobe platform - * component). - * @throws IllegalOperationError If the requestedContentParent - * property of the context - * parameter is a Loader. - * @throws IllegalOperationError If the LoaderContext.parameters - * parameter is set to non-null and has some - * values which are not Strings. - * @throws SecurityError The value of - * LoaderContext.securityDomain - * must be either null or - * SecurityDomain.currentDomain. - * This reflects the fact that you can only - * place the loaded media in its natural - * security sandbox or your own(the latter - * requires a policy file). - * @throws SecurityError Local SWF files may not set - * LoaderContext.securityDomain to anything - * other than null. It is not - * permitted to import non-local media into a - * local sandbox, or to place other local media - * in anything other than its natural sandbox. - * @throws SecurityError You cannot connect to commonly reserved - * ports. For a complete list of blocked ports, - * see "Restricting Networking APIs" in the - * ActionScript 3.0 Developer's Guide. - * @throws SecurityError If the applicationDomain or - * securityDomain properties of - * the context parameter are from - * a disallowed domain. - * @throws SecurityError If a local SWF file is attempting to use the - * securityDomain property of the - * context parameter. - * @event asyncError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and it is not possible to - * add the loaded content as a child to the specified - * DisplayObjectContainer. This could happen if the - * loaded content is a - * flash.display.AVM1Movie or if the - * addChild() call to the - * requestedContentParent throws an error. - * @event complete Dispatched by the contentLoaderInfo - * object when the file has completed loading. The - * complete event is always dispatched - * after the init event. - * @event httpStatus Dispatched by the contentLoaderInfo - * object when a network request is made over HTTP and - * Flash Player can detect the HTTP status code. - * @event init Dispatched by the contentLoaderInfo - * object when the properties and methods of the loaded - * SWF file are accessible. The init event - * always precedes the complete event. - * @event ioError Dispatched by the contentLoaderInfo - * object when an input or output error occurs that - * causes a load operation to fail. - * @event open Dispatched by the contentLoaderInfo - * object when the loading operation starts. - * @event progress Dispatched by the contentLoaderInfo - * object as data is received while load operation - * progresses. - * @event securityError Dispatched by the contentLoaderInfo - * object if a SWF file in the local-with-filesystem - * sandbox attempts to load content in the - * local-with-networking sandbox, or vice versa. - * @event securityError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and the security sandbox - * of the - * LoaderContext.requestedContentParent - * does not have access to the loaded SWF. - * @event unload Dispatched by the contentLoaderInfo - * object when a loaded object is removed. - */ - Loader.prototype.load = function (request, context, ns, parser) { - if (typeof context === "undefined") { context = null; } - if (typeof ns === "undefined") { ns = null; } - if (typeof parser === "undefined") { parser = null; } - var token; - - if (this._useAssetLib) { - var lib; - lib = away.library.AssetLibraryBundle.getInstance(this._assetLibId); - token = lib.load(request, context, ns, parser); - } else { - var loader = new AssetLoader(); - this._loadingSessions.push(loader); - token = loader.load(request, context, ns, parser); - } - - token.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - // Error are handled separately (see documentation for addErrorHandler) - token._iLoader._iAddErrorHandler(this.onLoadError); - token._iLoader._iAddParseErrorHandler(this.onParseError); - - return token; - }; - - /** - * Loads from binary data stored in a ByteArray object. - * - *

The loadBytes() method is asynchronous. You must wait for - * the "init" event before accessing the properties of a loaded object.

- * - *

When you use this method, consider the Flash Player security model, - * which is described in the Loader class description.

- * - * @param bytes A ByteArray object. The contents of the ByteArray can be - * any of the file formats supported by the Loader class: SWF, - * GIF, JPEG, or PNG. - * @param context A LoaderContext object. Only the - * applicationDomain property of the - * LoaderContext object applies; the - * checkPolicyFile and - * securityDomain properties of the LoaderContext - * object do not apply. - * - *

If the context parameter is not specified - * or refers to a null object, the content is loaded into the - * current security domain - a process referred to as "import - * loading" in Flash Player security documentation. - * Specifically, if the loading SWF file trusts the remote SWF - * by incorporating the remote SWF into its code, then the - * loading SWF can import it directly into its own security - * domain.

- * - *

For more information related to security, see the Flash - * Player Developer Center Topic: Security.

- * @throws ArgumentError If the length property of the - * ByteArray object is not greater than 0. - * @throws IllegalOperationError If the checkPolicyFile or - * securityDomain property of the - * context parameter are non-null. - * @throws IllegalOperationError If the requestedContentParent - * property of the context - * parameter is a Loader. - * @throws IllegalOperationError If the LoaderContext.parameters - * parameter is set to non-null and has some - * values which are not Strings. - * @throws SecurityError If the provided - * applicationDomain property of - * the context property is from a - * disallowed domain. - * @throws SecurityError You cannot connect to commonly reserved - * ports. For a complete list of blocked ports, - * see "Restricting Networking APIs" in the - * ActionScript 3.0 Developer's Guide. - * @event asyncError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and it is not possible to - * add the loaded content as a child to the specified - * DisplayObjectContainer. This could happen if the - * loaded content is a - * flash.display.AVM1Movie or if the - * addChild() call to the - * requestedContentParent throws an error. - * @event complete Dispatched by the contentLoaderInfo - * object when the operation is complete. The - * complete event is always dispatched - * after the init event. - * @event init Dispatched by the contentLoaderInfo - * object when the properties and methods of the loaded - * data are accessible. The init event - * always precedes the complete event. - * @event ioError Dispatched by the contentLoaderInfo - * object when the runtime cannot parse the data in the - * byte array. - * @event open Dispatched by the contentLoaderInfo - * object when the operation starts. - * @event progress Dispatched by the contentLoaderInfo - * object as data is transfered in memory. - * @event securityError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and the security sandbox - * of the - * LoaderContext.requestedContentParent - * does not have access to the loaded SWF. - * @event unload Dispatched by the contentLoaderInfo - * object when a loaded object is removed. - */ - Loader.prototype.loadData = function (data, context, ns, parser) { - if (typeof context === "undefined") { context = null; } - if (typeof ns === "undefined") { ns = null; } - if (typeof parser === "undefined") { parser = null; } - var token; - - if (this._useAssetLib) { - var lib; - lib = away.library.AssetLibraryBundle.getInstance(this._assetLibId); - token = lib.loadData(data, context, ns, parser); - } else { - var loader = new AssetLoader(); - this._loadingSessions.push(loader); - token = loader.loadData(data, '', context, ns, parser); - } - - token.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - // Error are handled separately (see documentation for addErrorHandler) - token._iLoader._iAddErrorHandler(this.onLoadError); - token._iLoader._iAddParseErrorHandler(this.onParseError); - - return token; - }; - - /** - * Removes a child of this Loader object that was loaded by using the - * load() method. The property of the associated - * LoaderInfo object is reset to null. The child is not - * necessarily destroyed because other objects might have references to it; - * however, it is no longer a child of the Loader object. - * - *

As a best practice, before you unload a child SWF file, you should - * explicitly close any streams in the child SWF file's objects, such as - * LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise, - * audio in the child SWF file might continue to play, even though the child - * SWF file was unloaded. To close streams in the child SWF file, add an - * event listener to the child that listens for the unload - * event. When the parent calls Loader.unload(), the - * unload event is dispatched to the child. The following code - * shows how you might do this:

- *
 public closeAllStreams(evt:Event) {
-            * myNetStream.close(); mySound.close(); myNetConnection.close();
-            * myLocalConnection.close(); }
-            * myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,
-            * closeAllStreams);
- * - */ - Loader.prototype.unload = function () { - //TODO - }; - - /** - * Enables a specific parser. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parserClass The parser class to enable. - * @see away.parsers.Parsers - */ - Loader.enableParser = function (parserClass) { - AssetLoader.enableParser(parserClass); - }; - - /** - * Enables a list of parsers. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parserClasses A Vector of parser classes to enable. - * @see away.parsers.Parsers - */ - Loader.enableParsers = function (parserClasses) { - AssetLoader.enableParsers(parserClasses); - }; - - Loader.prototype.removeListeners = function (dispatcher) { - dispatcher.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - dispatcher.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - }; - - Loader.prototype.onAssetComplete = function (event) { - this.dispatchEvent(event); - }; - - /** - * Called when an error occurs during loading - */ - Loader.prototype.onLoadError = function (event) { - if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { - this.dispatchEvent(event); - return true; - } else { - return false; - } - }; - - /** - * Called when a an error occurs during parsing - */ - Loader.prototype.onParseError = function (event) { - if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { - this.dispatchEvent(event); - return true; - } else { - return false; - } - }; - - /** - * Called when the resource and all of its dependencies was retrieved. - */ - Loader.prototype.onResourceComplete = function (event) { - var content = event.content; - - this._content = content; - - if (content) - this.addChild(content); - - this.dispatchEvent(event); - }; - return Loader; - })(containers.DisplayObjectContainer); - containers.Loader = Loader; - })(away.containers || (away.containers = {})); - var containers = away.containers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (containers) { - var DisplayObjectContainer = away.containers.DisplayObjectContainer; - var SceneEvent = away.events.SceneEvent; - var NodeBase = away.partition.NodeBase; - var Partition = away.partition.Partition; - - var Scene = (function (_super) { - __extends(Scene, _super); - function Scene() { - _super.call(this); - this._expandedPartitions = new Array(); - this._partitions = new Array(); - this._iCollectionMark = 0; - - this._iSceneGraphRoot = new DisplayObjectContainer(); - - this._iSceneGraphRoot._iSetScene(this); - this._iSceneGraphRoot._iIsRoot = true; - this._iSceneGraphRoot.partition = new Partition(new NodeBase()); - } - Scene.prototype.traversePartitions = function (traverser) { - var i = 0; - var len = this._partitions.length; - - traverser.scene = this; - - while (i < len) { - this._iCollectionMark++; - this._partitions[i++].traverse(traverser); - } - }; - - Object.defineProperty(Scene.prototype, "partition", { - get: function () { - return this._iSceneGraphRoot.partition; - }, - set: function (value) { - this._iSceneGraphRoot.partition = value; - - this.dispatchEvent(new SceneEvent(SceneEvent.PARTITION_CHANGED, this._iSceneGraphRoot)); - }, - enumerable: true, - configurable: true - }); - - - Scene.prototype.contains = function (child) { - return this._iSceneGraphRoot.contains(child); - }; - - Scene.prototype.addChild = function (child) { - return this._iSceneGraphRoot.addChild(child); - }; - - Scene.prototype.removeChild = function (child) { - this._iSceneGraphRoot.removeChild(child); - }; - - Scene.prototype.removeChildAt = function (index) { - this._iSceneGraphRoot.removeChildAt(index); - }; - - Scene.prototype.getChildAt = function (index) { - return this._iSceneGraphRoot.getChildAt(index); - }; - - Object.defineProperty(Scene.prototype, "numChildren", { - get: function () { - return this._iSceneGraphRoot.numChildren; - }, - enumerable: true, - configurable: true - }); - - /** - * @internal - */ - Scene.prototype.iRegisterEntity = function (displayObject) { - if (displayObject.partition) - this.iRegisterPartition(displayObject.partition); - - if (displayObject.isEntity) - displayObject._iAssignedPartition.iMarkForUpdate(displayObject); - }; - - /** - * @internal - */ - Scene.prototype.iRegisterPartition = function (partition) { - this._expandedPartitions.push(partition); - - //ensure duplicates are not found in partitions array - if (this._partitions.indexOf(partition) == -1) - this._partitions.push(partition); - }; - - /** - * @internal - */ - Scene.prototype.iUnregisterEntity = function (displayObject) { - if (displayObject.partition) - this.iUnregisterPartition(displayObject.partition); - - if (displayObject.isEntity) - displayObject._iAssignedPartition.iRemoveEntity(displayObject); - }; - - /** - * @internal - */ - Scene.prototype.iUnregisterPartition = function (partition) { - this._expandedPartitions.splice(this._expandedPartitions.indexOf(partition), 1); - - //if no more partition references found, remove from partitions array - if (this._expandedPartitions.indexOf(partition) == -1) - this._partitions.splice(this._partitions.indexOf(partition), 1); - }; - return Scene; - })(away.events.EventDispatcher); - containers.Scene = Scene; - })(away.containers || (away.containers = {})); - var containers = away.containers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (containers) { - var Scene = away.containers.Scene; - var Camera = away.entities.Camera; - var CameraEvent = away.events.CameraEvent; - var SceneEvent = away.events.SceneEvent; - var RendererEvent = away.events.RendererEvent; - - var MouseManager = away.managers.MouseManager; - - var RaycastPicker = away.pick.RaycastPicker; - - var Delegate = away.utils.Delegate; - - var View = (function () { - /* - *********************************************************************** - * Disabled / Not yet implemented - *********************************************************************** - * - * private _background:away.textures.Texture2DBase; - * - * public _pTouch3DManager:away.managers.Touch3DManager; - * - */ - function View(renderer, scene, camera) { - if (typeof scene === "undefined") { scene = null; } - if (typeof camera === "undefined") { camera = null; } - this._width = 0; - this._height = 0; - this._time = 0; - this._deltaTime = 0; - this._backgroundColor = 0x000000; - this._backgroundAlpha = 1; - this._viewportDirty = true; - this._scissorDirty = true; - this._mousePicker = new RaycastPicker(); - this._onScenePartitionChangedDelegate = Delegate.create(this, this.onScenePartitionChanged); - this._onProjectionChangedDelegate = Delegate.create(this, this.onProjectionChanged); - this._onViewportUpdatedDelegate = Delegate.create(this, this.onViewportUpdated); - this._onScissorUpdatedDelegate = Delegate.create(this, this.onScissorUpdated); - - this.scene = scene || new Scene(); - this.camera = camera || new Camera(); - this.renderer = renderer; - - //make sure document border is zero - document.body.style.margin = "0px"; - - this._htmlElement = document.createElement("div"); - this._htmlElement.style.position = "absolute"; - - document.body.appendChild(this._htmlElement); - - this._mouseManager = MouseManager.getInstance(); - this._mouseManager.registerView(this); - // if (this._shareContext) - // this._mouse3DManager.addViewLayer(this); - } - /** - * - * @param e - */ - View.prototype.onScenePartitionChanged = function (e) { - if (this._pCamera) - this._pCamera.partition = this.scene.partition; - }; - - Object.defineProperty(View.prototype, "mouseX", { - get: function () { - return this._pMouseX; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(View.prototype, "mouseY", { - get: function () { - return this._pMouseY; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(View.prototype, "htmlElement", { - /** - * - */ - get: function () { - return this._htmlElement; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(View.prototype, "renderer", { - /** - * - */ - get: function () { - return this._pRenderer; - }, - set: function (value) { - if (this._pRenderer == value) - return; - - if (this._pRenderer) { - this._pRenderer.dispose(); - this._pRenderer.removeEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); - this._pRenderer.removeEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); - } - - this._pRenderer = value; - - this._pRenderer.addEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); - this._pRenderer.addEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); - - //reset entity collector - this._pEntityCollector = this._pRenderer._iCreateEntityCollector(); - - if (this._pCamera) - this._pEntityCollector.camera = this._pCamera; - - //reset back buffer - this._pRenderer._iBackgroundR = ((this._backgroundColor >> 16) & 0xff) / 0xff; - this._pRenderer._iBackgroundG = ((this._backgroundColor >> 8) & 0xff) / 0xff; - this._pRenderer._iBackgroundB = (this._backgroundColor & 0xff) / 0xff; - this._pRenderer._iBackgroundAlpha = this._backgroundAlpha; - this._pRenderer.width = this._width; - this._pRenderer.height = this._height; - this._pRenderer.shareContext = this._shareContext; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "shareContext", { - /** - * - */ - get: function () { - return this._shareContext; - }, - set: function (value) { - if (this._shareContext == value) - return; - - this._shareContext = value; - - if (this._pRenderer) - this._pRenderer.shareContext = this._shareContext; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "backgroundColor", { - /** - * - */ - get: function () { - return this._backgroundColor; - }, - set: function (value) { - if (this._backgroundColor == value) - return; - - this._backgroundColor = value; - - this._pRenderer._iBackgroundR = ((value >> 16) & 0xff) / 0xff; - this._pRenderer._iBackgroundG = ((value >> 8) & 0xff) / 0xff; - this._pRenderer._iBackgroundB = (value & 0xff) / 0xff; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "backgroundAlpha", { - /** - * - * @returns {number} - */ - get: function () { - return this._backgroundAlpha; - }, - /** - * - * @param value - */ - set: function (value) { - if (value > 1) - value = 1; - else if (value < 0) - value = 0; - - if (this._backgroundAlpha == value) - return; - - this._pRenderer._iBackgroundAlpha = this._backgroundAlpha = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "camera", { - /** - * - * @returns {Camera3D} - */ - get: function () { - return this._pCamera; - }, - /** - * Set camera that's used to render the scene for this viewport - */ - set: function (value) { - if (this._pCamera == value) - return; - - if (this._pCamera) - this._pCamera.removeEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); - - this._pCamera = value; - - if (this._pEntityCollector) - this._pEntityCollector.camera = this._pCamera; - - if (this._pScene) - this._pCamera.partition = this._pScene.partition; - - this._pCamera.addEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); - this._scissorDirty = true; - this._viewportDirty = true; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "scene", { - /** - * - * @returns {away.containers.Scene3D} - */ - get: function () { - return this._pScene; - }, - /** - * Set the scene that's used to render for this viewport - */ - set: function (value) { - if (this._pScene == value) - return; - - if (this._pScene) - this._pScene.removeEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); - - this._pScene = value; - - this._pScene.addEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); - - if (this._pCamera) - this._pCamera.partition = this._pScene.partition; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "deltaTime", { - /** - * - * @returns {number} - */ - get: function () { - return this._deltaTime; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(View.prototype, "width", { - /** - * - */ - get: function () { - return this._width; - }, - set: function (value) { - if (this._width == value) - return; - - this._width = value; - this._aspectRatio = this._width / this._height; - this._pCamera.projection._iAspectRatio = this._aspectRatio; - this._pRenderer.width = value; - this._htmlElement.style.width = value + "px"; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "height", { - /** - * - */ - get: function () { - return this._height; - }, - set: function (value) { - if (this._height == value) - return; - - this._height = value; - this._aspectRatio = this._width / this._height; - this._pCamera.projection._iAspectRatio = this._aspectRatio; - this._pRenderer.height = value; - this._htmlElement.style.height = value + "px"; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "mousePicker", { - /** - * - */ - get: function () { - return this._mousePicker; - }, - set: function (value) { - if (this._mousePicker == value) - return; - - if (value == null) - this._mousePicker = new RaycastPicker(); - else - this._mousePicker = value; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "x", { - /** - * - */ - get: function () { - return this._pRenderer.x; - }, - set: function (value) { - if (this._pRenderer.x == value) - return; - - this._pRenderer.x == value; - this._htmlElement.style.left = value + "px"; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "y", { - /** - * - */ - get: function () { - return this._pRenderer.y; - }, - set: function (value) { - if (this._pRenderer.y == value) - return; - - this._pRenderer.y == value; - this._htmlElement.style.top = value + "px"; - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "visible", { - /** - * - */ - get: function () { - return (this._htmlElement.style.visibility == "visible"); - }, - set: function (value) { - this._htmlElement.style.visibility = value ? "visible" : "hidden"; - //TODO transfer visible property to associated context (if one exists) - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(View.prototype, "renderedFacesCount", { - /** - * - * @returns {number} - */ - get: function () { - return 0; - //return this._pEntityCollector._pNumTriangles;//numTriangles; - }, - enumerable: true, - configurable: true - }); - - /** - * Renders the view. - */ - View.prototype.render = function () { - this.pUpdateTime(); - - //update view and size data - this._pCamera.projection._iAspectRatio = this._aspectRatio; - - if (this._scissorDirty) { - this._scissorDirty = false; - this._pCamera.projection._iUpdateScissorRect(this._pRenderer.scissorRect.x, this._pRenderer.scissorRect.y, this._pRenderer.scissorRect.width, this._pRenderer.scissorRect.height); - } - - if (this._viewportDirty) { - this._viewportDirty = false; - this._pCamera.projection._iUpdateViewport(this._pRenderer.viewPort.x, this._pRenderer.viewPort.y, this._pRenderer.viewPort.width, this._pRenderer.viewPort.height); - } - - // update picking - if (!this._shareContext) { - if (this.forceMouseMove && this._htmlElement == this._mouseManager._iActiveDiv && !this._mouseManager._iUpdateDirty) - this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); - - this._mouseManager.fireMouseEvents(this.forceMouseMove); - //_touch3DManager.fireTouchEvents(); - } - - //_touch3DManager.updateCollider(); - //clear entity collector ready for collection - this._pEntityCollector.clear(); - - // collect stuff to render - this._pScene.traversePartitions(this._pEntityCollector); - - //render the contents of the entity collector - this._pRenderer.render(this._pEntityCollector); - }; - - /** - * - */ - View.prototype.pUpdateTime = function () { - var time = away.utils.getTimer(); - - if (this._time == 0) - this._time = time; - - this._deltaTime = time - this._time; - this._time = time; - }; - - /** - * - */ - View.prototype.dispose = function () { - this._pRenderer.dispose(); - - // TODO: imeplement mouseManager / touch3DManager - this._mouseManager.unregisterView(this); - - //this._touch3DManager.disableTouchListeners(this); - //this._touch3DManager.dispose(); - this._mouseManager = null; - - //this._touch3DManager = null; - this._pRenderer = null; - this._pEntityCollector = null; - }; - - Object.defineProperty(View.prototype, "iEntityCollector", { - /** - * - */ - get: function () { - return this._pEntityCollector; - }, - enumerable: true, - configurable: true - }); - - /** - * - */ - View.prototype.onProjectionChanged = function (event) { - this._scissorDirty = true; - this._viewportDirty = true; - }; - - /** - * - */ - View.prototype.onViewportUpdated = function (event) { - this._viewportDirty = true; - }; - - /** - * - */ - View.prototype.onScissorUpdated = function (event) { - this._scissorDirty = true; - }; - - View.prototype.project = function (point3d) { - var v = this._pCamera.project(point3d); - v.x = v.x * this._pRenderer.viewPort.width / 2 + this._width * this._pCamera.projection.originX; - v.y = v.y * this._pRenderer.viewPort.height / 2 + this._height * this._pCamera.projection.originY; - - return v; - }; - - View.prototype.unproject = function (sX, sY, sZ) { - return this._pCamera.unproject(2 * (sX - this._width * this._pCamera.projection.originX) / this._pRenderer.viewPort.width, 2 * (sY - this._height * this._pCamera.projection.originY) / this._pRenderer.viewPort.height, sZ); - }; - - View.prototype.getRay = function (sX, sY, sZ) { - return this._pCamera.getRay((sX * 2 - this._width) / this._width, (sY * 2 - this._height) / this._height, sZ); - }; - - /*TODO: implement Background - public get background():away.textures.Texture2DBase - { - return this._background; - } - */ - /*TODO: implement Background - public set background( value:away.textures.Texture2DBase ) - { - this._background = value; - this._renderer.background = _background; - } - */ - // TODO: required dependency stageGL - View.prototype.updateCollider = function () { - if (!this._shareContext) { - if (this._htmlElement == this._mouseManager._iActiveDiv) - this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); - } else { - var collidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); - - if (this.layeredView || this._mouseManager._iCollidingObject == null || collidingObject.rayEntryDistance < this._mouseManager._iCollidingObject.rayEntryDistance) - this._mouseManager._iCollidingObject = collidingObject; - } - }; - return View; - })(); - containers.View = View; - })(away.containers || (away.containers = {})); - var containers = away.containers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (controllers) { - var AbstractMethodError = away.errors.AbstractMethodError; - - var ControllerBase = (function () { - function ControllerBase(targetObject) { - if (typeof targetObject === "undefined") { targetObject = null; } - this._pAutoUpdate = true; - this.targetObject = targetObject; - } - ControllerBase.prototype.pNotifyUpdate = function () { - if (this._pTargetObject && this._pTargetObject._iAssignedPartition && this._pAutoUpdate) { - this._pTargetObject._iAssignedPartition.iMarkForUpdate(this._pTargetObject); - } - }; - - Object.defineProperty(ControllerBase.prototype, "targetObject", { - get: function () { - return this._pTargetObject; - }, - set: function (val) { - if (this._pTargetObject == val) { - return; - } - - if (this._pTargetObject && this._pAutoUpdate) { - this._pTargetObject._iController = null; - } - this._pTargetObject = val; - - if (this._pTargetObject && this._pAutoUpdate) { - this._pTargetObject._iController = this; - } - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(ControllerBase.prototype, "autoUpdate", { - get: function () { - return this._pAutoUpdate; - }, - set: function (val) { - if (this._pAutoUpdate == val) { - return; - } - this._pAutoUpdate = val; - - if (this._pTargetObject) { - if (this._pTargetObject) { - this._pTargetObject._iController = this; - } else { - this._pTargetObject._iController = null; - } - } - }, - enumerable: true, - configurable: true - }); - - - ControllerBase.prototype.update = function (interpolate) { - if (typeof interpolate === "undefined") { interpolate = true; } - throw new AbstractMethodError(); - }; - return ControllerBase; - })(); - controllers.ControllerBase = ControllerBase; - })(away.controllers || (away.controllers = {})); - var controllers = away.controllers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (controllers) { - var DisplayObjectEvent = away.events.DisplayObjectEvent; - var Vector3D = away.geom.Vector3D; - - var LookAtController = (function (_super) { - __extends(LookAtController, _super); - function LookAtController(targetObject, lookAtObject) { - if (typeof targetObject === "undefined") { targetObject = null; } - if (typeof lookAtObject === "undefined") { lookAtObject = null; } - _super.call(this, targetObject); - this._pOrigin = new Vector3D(0.0, 0.0, 0.0); - - this._onLookAtObjectChangedDelegate = away.utils.Delegate.create(this, this.onLookAtObjectChanged); - - if (lookAtObject) { - this.lookAtObject = lookAtObject; - } else { - this.lookAtPosition = new Vector3D(); - } - } - Object.defineProperty(LookAtController.prototype, "lookAtPosition", { - get: function () { - return this._pLookAtPosition; - }, - set: function (val) { - if (this._pLookAtObject) { - this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); - this._pLookAtObject = null; - } - - this._pLookAtPosition = val; - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(LookAtController.prototype, "lookAtObject", { - get: function () { - return this._pLookAtObject; - }, - set: function (val) { - if (this._pLookAtPosition) - this._pLookAtPosition = null; - - if (this._pLookAtObject == val) - return; - - if (this._pLookAtObject) - this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); - - this._pLookAtObject = val; - - if (this._pLookAtObject) - this._pLookAtObject.addEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - //@override - LookAtController.prototype.update = function (interpolate) { - if (typeof interpolate === "undefined") { interpolate = true; } - if (this._pTargetObject) { - if (this._pLookAtPosition) - this._pTargetObject.lookAt(this._pLookAtPosition); - else if (this._pLookAtObject) - this._pTargetObject.lookAt(this._pLookAtObject.scene ? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position); - } - }; - - LookAtController.prototype.onLookAtObjectChanged = function (event) { - this.pNotifyUpdate(); - }; - return LookAtController; - })(controllers.ControllerBase); - controllers.LookAtController = LookAtController; - })(away.controllers || (away.controllers = {})); - var controllers = away.controllers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (controllers) { - var MathConsts = away.geom.MathConsts; - var Vector3D = away.geom.Vector3D; - - /** - * Extended camera used to hover round a specified target object. - * - * @see away.containers.View - */ - var HoverController = (function (_super) { - __extends(HoverController, _super); - /** - * Creates a new HoverController object. - */ - function HoverController(targetObject, lookAtObject, panAngle, tiltAngle, distance, minTiltAngle, maxTiltAngle, minPanAngle, maxPanAngle, steps, yFactor, wrapPanAngle) { - if (typeof targetObject === "undefined") { targetObject = null; } - if (typeof lookAtObject === "undefined") { lookAtObject = null; } - if (typeof panAngle === "undefined") { panAngle = 0; } - if (typeof tiltAngle === "undefined") { tiltAngle = 90; } - if (typeof distance === "undefined") { distance = 1000; } - if (typeof minTiltAngle === "undefined") { minTiltAngle = -90; } - if (typeof maxTiltAngle === "undefined") { maxTiltAngle = 90; } - if (typeof minPanAngle === "undefined") { minPanAngle = null; } - if (typeof maxPanAngle === "undefined") { maxPanAngle = null; } - if (typeof steps === "undefined") { steps = 8; } - if (typeof yFactor === "undefined") { yFactor = 2; } - if (typeof wrapPanAngle === "undefined") { wrapPanAngle = false; } - _super.call(this, targetObject, lookAtObject); - this._iCurrentPanAngle = 0; - this._iCurrentTiltAngle = 90; - this._panAngle = 0; - this._tiltAngle = 90; - this._distance = 1000; - this._minPanAngle = -Infinity; - this._maxPanAngle = Infinity; - this._minTiltAngle = -90; - this._maxTiltAngle = 90; - this._steps = 8; - this._yFactor = 2; - this._wrapPanAngle = false; - this._upAxis = new Vector3D(); - - this.distance = distance; - this.panAngle = panAngle; - this.tiltAngle = tiltAngle; - this.minPanAngle = (minPanAngle != null) ? minPanAngle : -Infinity; - this.maxPanAngle = (maxPanAngle != null) ? maxPanAngle : Infinity; - this.minTiltAngle = minTiltAngle; - this.maxTiltAngle = maxTiltAngle; - this.steps = steps; - this.yFactor = yFactor; - this.wrapPanAngle = wrapPanAngle; - - //values passed in contrustor are applied immediately - this._iCurrentPanAngle = this._panAngle; - this._iCurrentTiltAngle = this._tiltAngle; - } - Object.defineProperty(HoverController.prototype, "steps", { - /** - * Fractional step taken each time the hover() method is called. Defaults to 8. - * - * Affects the speed at which the tiltAngle and panAngle resolve to their targets. - * - * @see #tiltAngle - * @see #panAngle - */ - get: function () { - return this._steps; - }, - set: function (val) { - val = (val < 1) ? 1 : val; - - if (this._steps == val) - return; - - this._steps = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "panAngle", { - /** - * Rotation of the camera in degrees around the y axis. Defaults to 0. - */ - get: function () { - return this._panAngle; - }, - set: function (val) { - val = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, val)); - - if (this._panAngle == val) - return; - - this._panAngle = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "tiltAngle", { - /** - * Elevation angle of the camera in degrees. Defaults to 90. - */ - get: function () { - return this._tiltAngle; - }, - set: function (val) { - val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); - - if (this._tiltAngle == val) - return; - - this._tiltAngle = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "distance", { - /** - * Distance between the camera and the specified target. Defaults to 1000. - */ - get: function () { - return this._distance; - }, - set: function (val) { - if (this._distance == val) - return; - - this._distance = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "minPanAngle", { - /** - * Minimum bounds for the panAngle. Defaults to -Infinity. - * - * @see #panAngle - */ - get: function () { - return this._minPanAngle; - }, - set: function (val) { - if (this._minPanAngle == val) - return; - - this._minPanAngle = val; - - this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "maxPanAngle", { - /** - * Maximum bounds for the panAngle. Defaults to Infinity. - * - * @see #panAngle - */ - get: function () { - return this._maxPanAngle; - }, - set: function (val) { - if (this._maxPanAngle == val) - return; - - this._maxPanAngle = val; - - this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "minTiltAngle", { - /** - * Minimum bounds for the tiltAngle. Defaults to -90. - * - * @see #tiltAngle - */ - get: function () { - return this._minTiltAngle; - }, - set: function (val) { - if (this._minTiltAngle == val) - return; - - this._minTiltAngle = val; - - this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "maxTiltAngle", { - /** - * Maximum bounds for the tiltAngle. Defaults to 90. - * - * @see #tiltAngle - */ - get: function () { - return this._maxTiltAngle; - }, - set: function (val) { - if (this._maxTiltAngle == val) - return; - - this._maxTiltAngle = val; - - this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "yFactor", { - /** - * Fractional difference in distance between the horizontal camera orientation and vertical camera orientation. Defaults to 2. - * - * @see #distance - */ - get: function () { - return this._yFactor; - }, - set: function (val) { - if (this._yFactor == val) - return; - - this._yFactor = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(HoverController.prototype, "wrapPanAngle", { - /** - * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. - */ - get: function () { - return this._wrapPanAngle; - }, - set: function (val) { - if (this._wrapPanAngle == val) - return; - - this._wrapPanAngle = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - /** - * Updates the current tilt angle and pan angle values. - * - * Values are calculated using the defined tiltAngle, panAngle and steps variables. - * - * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. - * - * @see #tiltAngle - * @see #panAngle - * @see #steps - */ - HoverController.prototype.update = function (interpolate) { - if (typeof interpolate === "undefined") { interpolate = true; } - if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { - this.pNotifyUpdate(); - - if (this._wrapPanAngle) { - if (this._panAngle < 0) { - this._iCurrentPanAngle += this._panAngle % 360 + 360 - this._panAngle; - this._panAngle = this._panAngle % 360 + 360; - } else { - this._iCurrentPanAngle += this._panAngle % 360 - this._panAngle; - this._panAngle = this._panAngle % 360; - } - - while (this._panAngle - this._iCurrentPanAngle < -180) - this._iCurrentPanAngle -= 360; - - while (this._panAngle - this._iCurrentPanAngle > 180) - this._iCurrentPanAngle += 360; - } - - if (interpolate) { - this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle) / (this.steps + 1); - this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle) / (this.steps + 1); - } else { - this._iCurrentPanAngle = this._panAngle; - this._iCurrentTiltAngle = this._tiltAngle; - } - - //snap coords if angle differences are close - if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { - this._iCurrentTiltAngle = this._tiltAngle; - this._iCurrentPanAngle = this._panAngle; - } - } - - var pos = (this.lookAtObject) ? this.lookAtObject.transform.position : (this.lookAtPosition) ? this.lookAtPosition : this._pOrigin; - this.targetObject.x = pos.x + this.distance * Math.sin(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); - this.targetObject.y = pos.y + this.distance * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS) * this.yFactor; - this.targetObject.z = pos.z + this.distance * Math.cos(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); - - this._upAxis.x = -Math.sin(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); - this._upAxis.y = Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); - this._upAxis.z = -Math.cos(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); - - if (this._pTargetObject) { - if (this._pLookAtPosition) - this._pTargetObject.lookAt(this._pLookAtPosition, this._upAxis); - else if (this._pLookAtObject) - this._pTargetObject.lookAt(this._pLookAtObject.scene ? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position, this._upAxis); - } - }; - return HoverController; - })(controllers.LookAtController); - controllers.HoverController = HoverController; - })(away.controllers || (away.controllers = {})); - var controllers = away.controllers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (controllers) { - /** - * Extended camera used to hover round a specified target object. - * - * @see away3d.containers.View3D - */ - var FirstPersonController = (function (_super) { - __extends(FirstPersonController, _super); - /** - * Creates a new HoverController object. - */ - function FirstPersonController(targetObject, panAngle, tiltAngle, minTiltAngle, maxTiltAngle, steps, wrapPanAngle) { - if (typeof targetObject === "undefined") { targetObject = null; } - if (typeof panAngle === "undefined") { panAngle = 0; } - if (typeof tiltAngle === "undefined") { tiltAngle = 90; } - if (typeof minTiltAngle === "undefined") { minTiltAngle = -90; } - if (typeof maxTiltAngle === "undefined") { maxTiltAngle = 90; } - if (typeof steps === "undefined") { steps = 8; } - if (typeof wrapPanAngle === "undefined") { wrapPanAngle = false; } - _super.call(this, targetObject); - this._iCurrentPanAngle = 0; - this._iCurrentTiltAngle = 90; - this._panAngle = 0; - this._tiltAngle = 90; - this._minTiltAngle = -90; - this._maxTiltAngle = 90; - this._steps = 8; - this._walkIncrement = 0; - this._strafeIncrement = 0; - this._wrapPanAngle = false; - this.fly = false; - - this.panAngle = panAngle; - this.tiltAngle = tiltAngle; - this.minTiltAngle = minTiltAngle; - this.maxTiltAngle = maxTiltAngle; - this.steps = steps; - this.wrapPanAngle = wrapPanAngle; - - //values passed in contrustor are applied immediately - this._iCurrentPanAngle = this._panAngle; - this._iCurrentTiltAngle = this._tiltAngle; - } - Object.defineProperty(FirstPersonController.prototype, "steps", { - /** - * Fractional step taken each time the hover() method is called. Defaults to 8. - * - * Affects the speed at which the tiltAngle and panAngle resolve to their targets. - * - * @see #tiltAngle - * @see #panAngle - */ - get: function () { - return this._steps; - }, - set: function (val) { - val = (val < 1) ? 1 : val; - - if (this._steps == val) - return; - - this._steps = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(FirstPersonController.prototype, "panAngle", { - /** - * Rotation of the camera in degrees around the y axis. Defaults to 0. - */ - get: function () { - return this._panAngle; - }, - set: function (val) { - if (this._panAngle == val) - return; - - this._panAngle = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(FirstPersonController.prototype, "tiltAngle", { - /** - * Elevation angle of the camera in degrees. Defaults to 90. - */ - get: function () { - return this._tiltAngle; - }, - set: function (val) { - val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); - - if (this._tiltAngle == val) - return; - - this._tiltAngle = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(FirstPersonController.prototype, "minTiltAngle", { - /** - * Minimum bounds for the tiltAngle. Defaults to -90. - * - * @see #tiltAngle - */ - get: function () { - return this._minTiltAngle; - }, - set: function (val) { - if (this._minTiltAngle == val) - return; - - this._minTiltAngle = val; - - this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(FirstPersonController.prototype, "maxTiltAngle", { - /** - * Maximum bounds for the tiltAngle. Defaults to 90. - * - * @see #tiltAngle - */ - get: function () { - return this._maxTiltAngle; - }, - set: function (val) { - if (this._maxTiltAngle == val) - return; - - this._maxTiltAngle = val; - - this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(FirstPersonController.prototype, "wrapPanAngle", { - /** - * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. - */ - get: function () { - return this._wrapPanAngle; - }, - set: function (val) { - if (this._wrapPanAngle == val) - return; - - this._wrapPanAngle = val; - - this.pNotifyUpdate(); - }, - enumerable: true, - configurable: true - }); - - - /** - * Updates the current tilt angle and pan angle values. - * - * Values are calculated using the defined tiltAngle, panAngle and steps variables. - * - * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. - * - * @see #tiltAngle - * @see #panAngle - * @see #steps - */ - FirstPersonController.prototype.update = function (interpolate) { - if (typeof interpolate === "undefined") { interpolate = true; } - if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { - this.pNotifyUpdate(); - - if (this._wrapPanAngle) { - if (this._panAngle < 0) { - this._iCurrentPanAngle += this._panAngle % 360 + 360 - this._panAngle; - this._panAngle = this._panAngle % 360 + 360; - } else { - this._iCurrentPanAngle += this._panAngle % 360 - this._panAngle; - this._panAngle = this._panAngle % 360; - } - - while (this._panAngle - this._iCurrentPanAngle < -180) - this._iCurrentPanAngle -= 360; - - while (this._panAngle - this._iCurrentPanAngle > 180) - this._iCurrentPanAngle += 360; - } - - if (interpolate) { - this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle) / (this.steps + 1); - this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle) / (this.steps + 1); - } else { - this._iCurrentTiltAngle = this._tiltAngle; - this._iCurrentPanAngle = this._panAngle; - } - - //snap coords if angle differences are close - if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { - this._iCurrentTiltAngle = this._tiltAngle; - this._iCurrentPanAngle = this._panAngle; - } - } - - this.targetObject.rotationX = this._iCurrentTiltAngle; - this.targetObject.rotationY = this._iCurrentPanAngle; - - if (this._walkIncrement) { - if (this.fly) { - this.targetObject.transform.moveForward(this._walkIncrement); - } else { - this.targetObject.x += this._walkIncrement * Math.sin(this._panAngle * away.geom.MathConsts.DEGREES_TO_RADIANS); - this.targetObject.z += this._walkIncrement * Math.cos(this._panAngle * away.geom.MathConsts.DEGREES_TO_RADIANS); - } - this._walkIncrement = 0; - } - - if (this._strafeIncrement) { - this.targetObject.transform.moveRight(this._strafeIncrement); - this._strafeIncrement = 0; - } - }; - - FirstPersonController.prototype.incrementWalk = function (val) { - if (val == 0) - return; - - this._walkIncrement += val; - - this.pNotifyUpdate(); - }; - - FirstPersonController.prototype.incrementStrafe = function (val) { - if (val == 0) - return; - - this._strafeIncrement += val; - - this.pNotifyUpdate(); - }; - return FirstPersonController; - })(controllers.ControllerBase); - controllers.FirstPersonController = FirstPersonController; - })(away.controllers || (away.controllers = {})); - var controllers = away.controllers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (controllers) { - /** - * Controller used to follow behind an object on the XZ plane, with an optional - * elevation (tiltAngle). - * - * @see away3d.containers.View3D - */ - var FollowController = (function (_super) { - __extends(FollowController, _super); - function FollowController(targetObject, lookAtObject, tiltAngle, distance) { - if (typeof targetObject === "undefined") { targetObject = null; } - if (typeof lookAtObject === "undefined") { lookAtObject = null; } - if (typeof tiltAngle === "undefined") { tiltAngle = 45; } - if (typeof distance === "undefined") { distance = 700; } - _super.call(this, targetObject, lookAtObject, 0, tiltAngle, distance); - } - FollowController.prototype.update = function (interpolate) { - if (typeof interpolate === "undefined") { interpolate = true; } - interpolate = interpolate; // unused: prevents warning - - if (!this.lookAtObject) - return; - - this.panAngle = this._pLookAtObject.rotationY - 180; - _super.prototype.update.call(this); - }; - return FollowController; - })(controllers.HoverController); - controllers.FollowController = FollowController; - })(away.controllers || (away.controllers = {})); - var controllers = away.controllers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (controllers) { - var Vector3D = away.geom.Vector3D; - - /** - * Uses spring physics to animate the target object towards a position that is - * defined as the lookAtTarget object's position plus the vector defined by the - * positionOffset property. - */ - var SpringController = (function (_super) { - __extends(SpringController, _super); - function SpringController(targetObject, lookAtObject, stiffness, mass, damping) { - if (typeof targetObject === "undefined") { targetObject = null; } - if (typeof lookAtObject === "undefined") { lookAtObject = null; } - if (typeof stiffness === "undefined") { stiffness = 1; } - if (typeof mass === "undefined") { mass = 40; } - if (typeof damping === "undefined") { damping = 4; } - _super.call(this, targetObject, lookAtObject); - /** - * Offset of spring center from target in target object space, ie: Where the camera should ideally be in the target object space. - */ - this.positionOffset = new Vector3D(0, 500, -1000); - - this.stiffness = stiffness; - this.damping = damping; - this.mass = mass; - - this._velocity = new Vector3D(); - this._dv = new Vector3D(); - this._stretch = new Vector3D(); - this._force = new Vector3D(); - this._acceleration = new Vector3D(); - this._desiredPosition = new Vector3D(); - } - SpringController.prototype.update = function (interpolate) { - if (typeof interpolate === "undefined") { interpolate = true; } - var offs; - - if (!this._pLookAtObject || !this._pTargetObject) - return; - - offs = this._pLookAtObject.transform.matrix3D.deltaTransformVector(this.positionOffset); - this._desiredPosition.x = this._pLookAtObject.x + offs.x; - this._desiredPosition.y = this._pLookAtObject.y + offs.y; - this._desiredPosition.z = this._pLookAtObject.z + offs.z; - - this._stretch = this._pTargetObject.transform.position.add(this._desiredPosition); - this._stretch.scaleBy(-this.stiffness); - - this._dv.copyFrom(this._velocity); - this._dv.scaleBy(this.damping); - - this._force.x = this._stretch.x - this._dv.x; - this._force.y = this._stretch.y - this._dv.y; - this._force.z = this._stretch.z - this._dv.z; - - this._acceleration.copyFrom(this._force); - this._acceleration.scaleBy(1 / this.mass); - - this._velocity.incrementBy(this._acceleration); - - this._pTargetObject.transform.position = this._pTargetObject.transform.position.add(this._velocity); - - _super.prototype.update.call(this); - }; - return SpringController; - })(controllers.LookAtController); - controllers.SpringController = SpringController; - })(away.controllers || (away.controllers = {})); - var controllers = away.controllers; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - var AssetType = away.library.AssetType; - - /** - * LightPickerBase provides an abstract base clase for light picker classes. These classes are responsible for - * feeding materials with relevant lights. Usually, StaticLightPicker can be used, but LightPickerBase can be - * extended to provide more application-specific dynamic selection of lights. - * - * @see StaticLightPicker - */ - var LightPickerBase = (function (_super) { - __extends(LightPickerBase, _super); - /** - * Creates a new LightPickerBase object. - */ - function LightPickerBase() { - _super.call(this); - this._pNumPointLights = 0; - this._pNumDirectionalLights = 0; - this._pNumCastingPointLights = 0; - this._pNumCastingDirectionalLights = 0; - this._pNumLightProbes = 0; - } - /** - * Disposes resources used by the light picker. - */ - LightPickerBase.prototype.dispose = function () { - }; - - Object.defineProperty(LightPickerBase.prototype, "assetType", { - /** - * @inheritDoc - */ - get: function () { - return AssetType.LIGHT_PICKER; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "numDirectionalLights", { - /** - * The maximum amount of directional lights that will be provided. - */ - get: function () { - return this._pNumDirectionalLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "numPointLights", { - /** - * The maximum amount of point lights that will be provided. - */ - get: function () { - return this._pNumPointLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "numCastingDirectionalLights", { - /** - * The maximum amount of directional lights that cast shadows. - */ - get: function () { - return this._pNumCastingDirectionalLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "numCastingPointLights", { - /** - * The amount of point lights that cast shadows. - */ - get: function () { - return this._pNumCastingPointLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "numLightProbes", { - /** - * The maximum amount of light probes that will be provided. - */ - get: function () { - return this._pNumLightProbes; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "pointLights", { - /** - * The collected point lights to be used for shading. - */ - get: function () { - return this._pPointLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "directionalLights", { - /** - * The collected directional lights to be used for shading. - */ - get: function () { - return this._pDirectionalLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "castingPointLights", { - /** - * The collected point lights that cast shadows to be used for shading. - */ - get: function () { - return this._pCastingPointLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "castingDirectionalLights", { - /** - * The collected directional lights that cast shadows to be used for shading. - */ - get: function () { - return this._pCastingDirectionalLights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "lightProbes", { - /** - * The collected light probes to be used for shading. - */ - get: function () { - return this._pLightProbes; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "lightProbeWeights", { - /** - * The weights for each light probe, defining their influence on the object. - */ - get: function () { - return this._pLightProbeWeights; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(LightPickerBase.prototype, "allPickedLights", { - /** - * A collection of all the collected lights. - */ - get: function () { - return this._pAllPickedLights; - }, - enumerable: true, - configurable: true - }); - - /** - * Updates set of lights for a given renderable and EntityCollector. Always call super.collectLights() after custom overridden code. - */ - LightPickerBase.prototype.collectLights = function (renderable) { - this.updateProbeWeights(renderable); - }; - - /** - * Updates the weights for the light probes, based on the renderable's position relative to them. - * @param renderable The renderble for which to calculate the light probes' influence. - */ - LightPickerBase.prototype.updateProbeWeights = function (renderable) { - // todo: this will cause the same calculations to occur per TriangleSubMesh. See if this can be improved. - var objectPos = renderable.sourceEntity.scenePosition; - var lightPos; - - var rx = objectPos.x, ry = objectPos.y, rz = objectPos.z; - var dx, dy, dz; - var w, total = 0; - var i; - - for (i = 0; i < this._pNumLightProbes; ++i) { - lightPos = this._pLightProbes[i].scenePosition; - dx = rx - lightPos.x; - dy = ry - lightPos.y; - dz = rz - lightPos.z; - - // weight is inversely proportional to square of distance - w = dx * dx + dy * dy + dz * dz; - - // just... huge if at the same spot - w = w > .00001 ? 1 / w : 50000000; - this._pLightProbeWeights[i] = w; - total += w; - } - - // normalize - total = 1 / total; - - for (i = 0; i < this._pNumLightProbes; ++i) - this._pLightProbeWeights[i] *= total; - }; - return LightPickerBase; - })(away.library.NamedAssetBase); - materials.LightPickerBase = LightPickerBase; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - var DirectionalLight = away.entities.DirectionalLight; - var LightProbe = away.entities.LightProbe; - var PointLight = away.entities.PointLight; - var Event = away.events.Event; - var LightEvent = away.events.LightEvent; - - /** - * StaticLightPicker is a light picker that provides a static set of lights. The lights can be reassigned, but - * if the configuration changes (number of directional lights, point lights, etc), a material recompilation may - * occur. - */ - var StaticLightPicker = (function (_super) { - __extends(StaticLightPicker, _super); - /** - * Creates a new StaticLightPicker object. - * @param lights The lights to be used for shading. - */ - function StaticLightPicker(lights) { - var _this = this; - _super.call(this); - - this._onCastShadowChangeDelegate = function (event) { - return _this.onCastShadowChange(event); - }; - - this.lights = lights; - } - Object.defineProperty(StaticLightPicker.prototype, "lights", { - /** - * The lights used for shading. - */ - get: function () { - return this._lights; - }, - set: function (value) { - var numPointLights = 0; - var numDirectionalLights = 0; - var numCastingPointLights = 0; - var numCastingDirectionalLights = 0; - var numLightProbes = 0; - var light; - - if (this._lights) - this.clearListeners(); - - this._lights = value; - this._pAllPickedLights = value; - this._pPointLights = new Array(); - this._pCastingPointLights = new Array(); - this._pDirectionalLights = new Array(); - this._pCastingDirectionalLights = new Array(); - this._pLightProbes = new Array(); - - var len = value.length; - - for (var i = 0; i < len; ++i) { - light = value[i]; - light.addEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); - - if (light instanceof PointLight) { - if (light.castsShadows) - this._pCastingPointLights[numCastingPointLights++] = light; - else - this._pPointLights[numPointLights++] = light; - } else if (light instanceof DirectionalLight) { - if (light.castsShadows) - this._pCastingDirectionalLights[numCastingDirectionalLights++] = light; - else - this._pDirectionalLights[numDirectionalLights++] = light; - } else if (light instanceof LightProbe) { - this._pLightProbes[numLightProbes++] = light; - } - } - - if (this._pNumDirectionalLights == numDirectionalLights && this._pNumPointLights == numPointLights && this._pNumLightProbes == numLightProbes && this._pNumCastingPointLights == numCastingPointLights && this._pNumCastingDirectionalLights == numCastingDirectionalLights) - return; - - this._pNumDirectionalLights = numDirectionalLights; - this._pNumCastingDirectionalLights = numCastingDirectionalLights; - this._pNumPointLights = numPointLights; - this._pNumCastingPointLights = numCastingPointLights; - this._pNumLightProbes = numLightProbes; - - // MUST HAVE MULTIPLE OF 4 ELEMENTS! - this._pLightProbeWeights = new Array(Math.ceil(numLightProbes / 4) * 4); - - // notify material lights have changed - this.dispatchEvent(new Event(Event.CHANGE)); - }, - enumerable: true, - configurable: true - }); - - - /** - * Remove configuration change listeners on the lights. - */ - StaticLightPicker.prototype.clearListeners = function () { - var len = this._lights.length; - for (var i = 0; i < len; ++i) - this._lights[i].removeEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); - }; - - /** - * Notifies the material of a configuration change. - */ - StaticLightPicker.prototype.onCastShadowChange = function (event) { - // TODO: Assign to special caster collections, just append it to the lights in SinglePass - // But keep seperated in multipass - var light = event.target; - - if (light instanceof PointLight) - this.updatePointCasting(light); - else if (light instanceof DirectionalLight) - this.updateDirectionalCasting(light); - - this.dispatchEvent(new Event(Event.CHANGE)); - }; - - /** - * Called when a directional light's shadow casting configuration changes. - */ - StaticLightPicker.prototype.updateDirectionalCasting = function (light) { - var dl = light; - - if (light.castsShadows) { - --this._pNumDirectionalLights; - ++this._pNumCastingDirectionalLights; - - this._pDirectionalLights.splice(this._pDirectionalLights.indexOf(dl), 1); - this._pCastingDirectionalLights.push(light); - } else { - ++this._pNumDirectionalLights; - --this._pNumCastingDirectionalLights; - - this._pCastingDirectionalLights.splice(this._pCastingDirectionalLights.indexOf(dl), 1); - this._pDirectionalLights.push(light); - } - }; - - /** - * Called when a point light's shadow casting configuration changes. - */ - StaticLightPicker.prototype.updatePointCasting = function (light) { - var pl = light; - - if (light.castsShadows) { - --this._pNumPointLights; - ++this._pNumCastingPointLights; - this._pPointLights.splice(this._pPointLights.indexOf(pl), 1); - this._pCastingPointLights.push(light); - } else { - ++this._pNumPointLights; - --this._pNumCastingPointLights; - - this._pCastingPointLights.splice(this._pCastingPointLights.indexOf(pl), 1); - this._pPointLights.push(light); - } - }; - return StaticLightPicker; - })(materials.LightPickerBase); - materials.StaticLightPicker = StaticLightPicker; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -var away; -(function (away) { - (function (materials) { - /** - * Enumeration class for defining which lighting types affect the specific material - * lighting component (diffuse and specular). This can be useful if, for example, you - * want to use light probes for diffuse global lighting, but want specular reflections from - * traditional light sources without those affecting the diffuse light. - * - * @see away.materials.ColorMaterial.diffuseLightSources - * @see away.materials.ColorMaterial.specularLightSources - * @see away.materials.TextureMaterial.diffuseLightSources - * @see away.materials.TextureMaterial.specularLightSources - */ - var LightSources = (function () { - function LightSources() { - } - LightSources.LIGHTS = 0x01; - - LightSources.PROBES = 0x02; - - LightSources.ALL = 0x03; - return LightSources; - })(); - materials.LightSources = LightSources; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - var BlendMode = away.base.BlendMode; - - var Event = away.events.Event; - - var AssetType = away.library.AssetType; - - /** - * MaterialBase forms an abstract base class for any material. - * A material consists of several passes, each of which constitutes at least one render call. Several passes could - * be used for special effects (render lighting for many lights in several passes, render an outline in a separate - * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space - * subsurface scattering, or rendering a depth map for specialized self-shadowing). - * - * Away3D provides default materials trough SinglePassMaterialBase and TriangleMaterial, which use modular - * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom - * shaders, or entire new material frameworks. - */ - var MaterialBase = (function (_super) { - __extends(MaterialBase, _super); - /** - * Creates a new MaterialBase object. - */ - function MaterialBase() { - var _this = this; - _super.call(this); - this._materialPassData = new Array(); - this._materialData = new Array(); - this._pAlphaThreshold = 0; - this._pAnimateUVs = false; - this._enableLightFallOff = true; - this._specularLightSources = 0x01; - this._diffuseLightSources = 0x03; - /** - * An id for this material used to sort the renderables by shader program, which reduces Program state changes. - * - * @private - */ - this._iMaterialId = 0; - this._iBaseScreenPassIndex = 0; - this._bothSides = false; - this._pScreenPassesInvalid = true; - this._pBlendMode = BlendMode.NORMAL; - this._numPasses = 0; - this._mipmap = false; - this._smooth = true; - this._repeat = false; - this._color = 0xFFFFFF; - this._pHeight = 1; - this._pWidth = 1; - this._pRequiresBlending = false; - - this._iMaterialId = Number(this.id); - - this._owners = new Array(); - this._passes = new Array(); - - this._onPassChangeDelegate = function (event) { - return _this.onPassChange(event); - }; - this._onLightChangeDelegate = function (event) { - return _this.onLightsChange(event); - }; - - this.alphaPremultiplied = false; //TODO: work out why this is different for WebGL - } - Object.defineProperty(MaterialBase.prototype, "assetType", { - /** - * @inheritDoc - */ - get: function () { - return AssetType.MATERIAL; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(MaterialBase.prototype, "height", { - /** - * - */ - get: function () { - return this._pHeight; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(MaterialBase.prototype, "animationSet", { - /** - * - */ - get: function () { - return this._animationSet; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(MaterialBase.prototype, "lightPicker", { - /** - * The light picker used by the material to provide lights to the material if it supports lighting. - * - * @see LightPickerBase - * @see StaticLightPicker - */ - get: function () { - return this._pLightPicker; - }, - set: function (value) { - if (this._pLightPicker == value) - return; - - if (this._pLightPicker) - this._pLightPicker.removeEventListener(Event.CHANGE, this._onLightChangeDelegate); - - this._pLightPicker = value; - - if (this._pLightPicker) - this._pLightPicker.addEventListener(Event.CHANGE, this._onLightChangeDelegate); - - this._pInvalidateScreenPasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "mipmap", { - /** - * Indicates whether or not any used textures should use mipmapping. Defaults to true. - */ - get: function () { - return this._mipmap; - }, - set: function (value) { - if (this._mipmap == value) - return; - - this._mipmap = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "smooth", { - /** - * Indicates whether or not any used textures should use smoothing. - */ - get: function () { - return this._smooth; - }, - set: function (value) { - if (this._smooth == value) - return; - - this._smooth = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "repeat", { - /** - * Indicates whether or not any used textures should be tiled. If set to false, texture samples are clamped to - * the texture's borders when the uv coordinates are outside the [0, 1] interval. - */ - get: function () { - return this._repeat; - }, - set: function (value) { - if (this._repeat == value) - return; - - this._repeat = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "color", { - /** - * The diffuse reflectivity color of the surface. - */ - get: function () { - return this._color; - }, - set: function (value) { - if (this._color == value) - return; - - this._color = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "texture", { - /** - * The texture object to use for the albedo colour. - */ - get: function () { - return this._pTexture; - }, - set: function (value) { - if (this._pTexture == value) - return; - - this._pTexture = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "animateUVs", { - /** - * Specifies whether or not the UV coordinates should be animated using a transformation matrix. - */ - get: function () { - return this._pAnimateUVs; - }, - set: function (value) { - if (this._pAnimateUVs == value) - return; - - this._pAnimateUVs = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "enableLightFallOff", { - /** - * Whether or not to use fallOff and radius properties for lights. This can be used to improve performance and - * compatibility for constrained mode. - */ - get: function () { - return this._enableLightFallOff; - }, - set: function (value) { - if (this._enableLightFallOff == value) - return; - - this._enableLightFallOff = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "diffuseLightSources", { - /** - * Define which light source types to use for diffuse reflections. This allows choosing between regular lights - * and/or light probes for diffuse reflections. - * - * @see away3d.materials.LightSources - */ - get: function () { - return this._diffuseLightSources; - }, - set: function (value) { - if (this._diffuseLightSources == value) - return; - - this._diffuseLightSources = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "specularLightSources", { - /** - * Define which light source types to use for specular reflections. This allows choosing between regular lights - * and/or light probes for specular reflections. - * - * @see away3d.materials.LightSources - */ - get: function () { - return this._specularLightSources; - }, - set: function (value) { - if (this._specularLightSources == value) - return; - - this._specularLightSources = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - /** - * Cleans up resources owned by the material, including passes. Textures are not owned by the material since they - * could be used by other materials and will not be disposed. - */ - MaterialBase.prototype.dispose = function () { - var i; - var len; - - this._pClearScreenPasses(); - - len = this._materialData.length; - for (i = 0; i < len; i++) - this._materialData[i].dispose(); - - this._materialData = new Array(); - - len = this._materialPassData.length; - for (i = 0; i < len; i++) - this._materialPassData[i].dispose(); - - this._materialPassData = new Array(); - }; - - Object.defineProperty(MaterialBase.prototype, "bothSides", { - /** - * Defines whether or not the material should cull triangles facing away from the camera. - */ - get: function () { - return this._bothSides; - }, - set: function (value) { - if (this._bothSides = value) - return; - - this._bothSides = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "blendMode", { - /** - * The blend mode to use when drawing this renderable. The following blend modes are supported: - *
    - *
  • BlendMode.NORMAL: No blending, unless the material inherently needs it
  • - *
  • BlendMode.LAYER: Force blending. This will draw the object the same as NORMAL, but without writing depth writes.
  • - *
  • BlendMode.MULTIPLY
  • - *
  • BlendMode.ADD
  • - *
  • BlendMode.ALPHA
  • - *
- */ - get: function () { - return this._pBlendMode; - }, - set: function (value) { - if (this._pBlendMode == value) - return; - - this._pBlendMode = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "alphaPremultiplied", { - /** - * Indicates whether visible textures (or other pixels) used by this material have - * already been premultiplied. Toggle this if you are seeing black halos around your - * blended alpha edges. - */ - get: function () { - return this._alphaPremultiplied; - }, - set: function (value) { - if (this._alphaPremultiplied == value) - return; - - this._alphaPremultiplied = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "alphaThreshold", { - /** - * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either - * invisible or entirely opaque, often used with textures for foliage, etc. - * Recommended values are 0 to disable alpha, or 0.5 to create smooth edges. Default value is 0 (disabled). - */ - get: function () { - return this._pAlphaThreshold; - }, - set: function (value) { - if (value < 0) - value = 0; - else if (value > 1) - value = 1; - - if (this._pAlphaThreshold == value) - return; - - this._pAlphaThreshold = value; - - this._pInvalidatePasses(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(MaterialBase.prototype, "requiresBlending", { - /** - * Indicates whether or not the material requires alpha blending during rendering. - */ - get: function () { - return this._pRequiresBlending; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(MaterialBase.prototype, "width", { - /** - * - */ - get: function () { - return this._pWidth; - }, - enumerable: true, - configurable: true - }); - - /** - * Sets the render state for a pass that is independent of the rendered object. This needs to be called before - * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. - * @param pass The pass data to activate. - * @param stage The Stage object which is currently used for rendering. - * @param camera The camera from which the scene is viewed. - * @private - */ - MaterialBase.prototype._iActivatePass = function (pass, stage, camera) { - pass.materialPass._iActivate(pass, stage, camera); - }; - - /** - * Clears the render state for a pass. This needs to be called before activating another pass. - * @param pass The pass to deactivate. - * @param stage The Stage used for rendering - * - * @internal - */ - MaterialBase.prototype._iDeactivatePass = function (pass, stage) { - pass.materialPass._iDeactivate(pass, stage); - }; - - /** - * Renders the current pass. Before calling renderPass, activatePass needs to be called with the same index. - * @param pass The pass used to render the renderable. - * @param renderable The IRenderable object to draw. - * @param stage The Stage object used for rendering. - * @param entityCollector The EntityCollector object that contains the visible scene data. - * @param viewProjection The view-projection matrix used to project to the screen. This is not the same as - * camera.viewProjection as it includes the scaling factors when rendering to textures. - * - * @internal - */ - MaterialBase.prototype._iRenderPass = function (pass, renderable, stage, camera, viewProjection) { - if (this._pLightPicker) - this._pLightPicker.collectLights(renderable); - - pass.materialPass._iRender(pass, renderable, stage, camera, viewProjection); - }; - - // - // MATERIAL MANAGEMENT - // - /** - * Mark an IMaterialOwner as owner of this material. - * Assures we're not using the same material across renderables with different animations, since the - * Programs depend on animation. This method needs to be called when a material is assigned. - * - * @param owner The IMaterialOwner that had this material assigned - * - * @internal - */ - MaterialBase.prototype.iAddOwner = function (owner) { - this._owners.push(owner); - - var animationSet; - var animator = owner.animator; - - if (animator) - animationSet = animator.animationSet; - - if (owner.animator) { - if (this._animationSet && animationSet != this._animationSet) { - throw new Error("A Material instance cannot be shared across material owners with different animation sets"); - } else { - if (this._animationSet != animationSet) { - this._animationSet = animationSet; - - this.invalidateAnimation(); - } - } - } - }; - - /** - * Removes an IMaterialOwner as owner. - * @param owner - * - * @internal - */ - MaterialBase.prototype.iRemoveOwner = function (owner) { - this._owners.splice(this._owners.indexOf(owner), 1); - - if (this._owners.length == 0) { - this._animationSet = null; - - this.invalidateAnimation(); - } - }; - - Object.defineProperty(MaterialBase.prototype, "iOwners", { - /** - * A list of the IMaterialOwners that use this material - * - * @private - */ - get: function () { - return this._owners; - }, - enumerable: true, - configurable: true - }); - - /** - * The amount of passes used by the material. - * - * @private - */ - MaterialBase.prototype._iNumScreenPasses = function () { - return this._numPasses; - }; - - Object.defineProperty(MaterialBase.prototype, "_iScreenPasses", { - /** - * A list of the screen passes used in this material - * - * @private - */ - get: function () { - return this._passes; - }, - enumerable: true, - configurable: true - }); - - /** - * Marks the shader programs for all passes as invalid, so they will be recompiled before the next use. - * - * @private - */ - MaterialBase.prototype._pInvalidatePasses = function () { - var len = this._materialPassData.length; - for (var i = 0; i < len; i++) - this._materialPassData[i].invalidate(); - - this.invalidateMaterial(); - }; - - /** - * Flags that the screen passes have become invalid and need possible re-ordering / adding / deleting - */ - MaterialBase.prototype._pInvalidateScreenPasses = function () { - this._pScreenPassesInvalid = true; - }; - - /** - * Removes a pass from the material. - * @param pass The pass to be removed. - */ - MaterialBase.prototype._pRemoveScreenPass = function (pass) { - pass.removeEventListener(Event.CHANGE, this._onPassChangeDelegate); - this._passes.splice(this._passes.indexOf(pass), 1); - - this._numPasses--; - }; - - /** - * Removes all passes from the material - */ - MaterialBase.prototype._pClearScreenPasses = function () { - for (var i = 0; i < this._numPasses; ++i) - this._passes[i].removeEventListener(Event.CHANGE, this._onPassChangeDelegate); - - this._passes.length = this._numPasses = 0; - }; - - /** - * Adds a pass to the material - * @param pass - */ - MaterialBase.prototype._pAddScreenPass = function (pass) { - this._passes[this._numPasses++] = pass; - - pass.lightPicker = this._pLightPicker; - pass.addEventListener(Event.CHANGE, this._onPassChangeDelegate); - - this.invalidateMaterial(); - }; - - MaterialBase.prototype._iAddMaterialData = function (materialData) { - this._materialData.push(materialData); - - return materialData; - }; - - MaterialBase.prototype._iRemoveMaterialData = function (materialData) { - this._materialData.splice(this._materialData.indexOf(materialData), 1); - - return materialData; - }; - - /** - * Performs any processing that needs to occur before any of its passes are used. - * - * @private - */ - MaterialBase.prototype._iUpdateMaterial = function () { - }; - - /** - * Listener for when a pass's shader code changes. It recalculates the render order id. - */ - MaterialBase.prototype.onPassChange = function (event) { - this.invalidateMaterial(); - }; - - MaterialBase.prototype.invalidateAnimation = function () { - var len = this._materialData.length; - for (var i = 0; i < len; i++) - this._materialData[i].invalidateAnimation(); - }; - - MaterialBase.prototype.invalidateMaterial = function () { - var len = this._materialData.length; - for (var i = 0; i < len; i++) - this._materialData[i].invalidateMaterial(); - }; - - /** - * Called when the light picker's configuration changed. - */ - MaterialBase.prototype.onLightsChange = function (event) { - this._pInvalidateScreenPasses(); - }; - - MaterialBase.prototype._iAddMaterialPassData = function (materialPassData) { - this._materialPassData.push(materialPassData); - - return materialPassData; - }; - - MaterialBase.prototype._iRemoveMaterialPassData = function (materialPassData) { - this._materialPassData.splice(this._materialPassData.indexOf(materialPassData), 1); - - return materialPassData; - }; - return MaterialBase; - })(away.library.NamedAssetBase); - materials.MaterialBase = MaterialBase; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (materials) { - var MaterialEvent = away.events.MaterialEvent; - - /** - * MaterialBase forms an abstract base class for any material. - * A material consists of several passes, each of which constitutes at least one render call. Several passes could - * be used for special effects (render lighting for many lights in several passes, render an outline in a separate - * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space - * subsurface scattering, or rendering a depth map for specialized self-shadowing). - * - * Away3D provides default materials trough SinglePassMaterialBase and MultiPassMaterialBase, which use modular - * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom - * shaders, or entire new material frameworks. - */ - var CSSMaterialBase = (function (_super) { - __extends(CSSMaterialBase, _super); - /** - * Creates a new MaterialBase object. - */ - function CSSMaterialBase(texture, smooth, repeat) { - if (typeof texture === "undefined") { texture = null; } - if (typeof smooth === "undefined") { smooth = true; } - if (typeof repeat === "undefined") { repeat = false; } - _super.call(this); - - this._iMaterialId = Number(this.id); - - this.texture = texture; - - this.smooth = smooth; - this.repeat = repeat; - } - Object.defineProperty(CSSMaterialBase.prototype, "imageElement", { - get: function () { - return this._imageElement; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(CSSMaterialBase.prototype, "imageStyle", { - get: function () { - return this._imageStyle; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(CSSMaterialBase.prototype, "texture", { - /** - * The texture object to use for the albedo colour. - */ - get: function () { - return this._pTexture; - }, - set: function (value) { - if (this._pTexture == value) - return; - - this._pTexture = value; - - if (value instanceof away.textures.ImageTexture) { - this._imageElement = value.htmlImageElement; - - var node = document.createElement("style"); - node.type = "text/css"; - document.getElementsByTagName("head")[0].appendChild(node); - - var sheet = document.styleSheets[document.styleSheets.length - 1]; - sheet.insertRule(".material" + this.id + "{ }", 0); - var style = sheet.cssRules[0].style; - - style.backgroundImage = "url(" + this._imageElement.src + ")"; - style.backgroundSize = "100% 100%"; - style.position = "absolute"; - style.width = this._imageElement.width + "px"; - style.height = this._imageElement.height + "px"; - style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; - - this._pHeight = this._imageElement.height; - this._pWidth = this._imageElement.width; - - this.notifySizeChanged(); - } - }, - enumerable: true, - configurable: true - }); - - - CSSMaterialBase.prototype.notifySizeChanged = function () { - if (!this._sizeChanged) - this._sizeChanged = new MaterialEvent(MaterialEvent.SIZE_CHANGED); - - this.dispatchEvent(this._sizeChanged); - }; - return CSSMaterialBase; - })(materials.MaterialBase); - materials.CSSMaterialBase = CSSMaterialBase; - })(away.materials || (away.materials = {})); - var materials = away.materials; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - // import BatchObject = away.base.BatchObject; - var AbstractMethodError = away.errors.AbstractMethodError; - - /** - * PrefabBase is an abstract base class for prefabs, which are prebuilt display objects that allow easy cloning and updating - */ - var PrefabBase = (function (_super) { - __extends(PrefabBase, _super); - // public _pBatchObjects:Array = new Array(); - /** - * Creates a new PrefabBase object. - */ - function PrefabBase() { - _super.call(this); - this._pObjects = new Array(); - } - /** - * Returns a display object generated from this prefab - */ - PrefabBase.prototype.getNewObject = function () { - var object = this._pCreateObject(); - - this._pObjects.push(object); - - return object; - }; - - // public getNewBatchObject():BatchObject - // { - // var object:BatchObject = this._pCreateBatchObject(); - // - // this._pBatchObjects.push(object); - // - // return object; - // } - PrefabBase.prototype._pCreateObject = function () { - throw new AbstractMethodError(); - }; - - PrefabBase.prototype._iValidate = function () { - // To be overridden when necessary - }; - return PrefabBase; - })(away.library.NamedAssetBase); - prefabs.PrefabBase = PrefabBase; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - var Geometry = away.base.Geometry; - - var TriangleSubGeometry = away.base.TriangleSubGeometry; - var LineSubGeometry = away.base.LineSubGeometry; - var Mesh = away.entities.Mesh; - - /** - * PrimitivePrefabBase is an abstract base class for polytope prefabs, which are simple pre-built geometric shapes - */ - var PrimitivePrefabBase = (function (_super) { - __extends(PrimitivePrefabBase, _super); - /** - * Creates a new PrimitivePrefabBase object. - * - * @param material The material with which to render the object - */ - function PrimitivePrefabBase(material, geometryType) { - if (typeof material === "undefined") { material = null; } - if (typeof geometryType === "undefined") { geometryType = "triangleSubGeometry"; } - _super.call(this); - this._geomDirty = true; - this._uvDirty = true; - this._geometryTypeDirty = true; - - this._geometry = new Geometry(); - this._material = material; - this._geometryType = geometryType; - } - Object.defineProperty(PrimitivePrefabBase.prototype, "assetType", { - /** - * - */ - get: function () { - return away.library.AssetType.PRIMITIVE_PREFAB; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(PrimitivePrefabBase.prototype, "geometryType", { - /** - * - */ - get: function () { - return this._geometryType; - }, - set: function (value) { - if (this._geometryType == value) - return; - - this._geometryType = value; - - this.invalidateGeometryType(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitivePrefabBase.prototype, "geometry", { - get: function () { - this._iValidate(); - - return this._geometry; - }, - enumerable: true, - configurable: true - }); - - Object.defineProperty(PrimitivePrefabBase.prototype, "material", { - /** - * The material with which to render the primitive. - */ - get: function () { - return this._material; - }, - set: function (value) { - if (value == this._material) - return; - - this._material = value; - - var len = this._pObjects.length; - for (var i = 0; i < len; i++) - this._pObjects[i].material = this._material; - }, - enumerable: true, - configurable: true - }); - - - /** - * Builds the primitive's geometry when invalid. This method should not be called directly. The calling should - * be triggered by the invalidateGeometry method (and in turn by updateGeometry). - */ - PrimitivePrefabBase.prototype._pBuildGeometry = function (target, geometryType) { - throw new away.errors.AbstractMethodError(); - }; - - /** - * Builds the primitive's uv coordinates when invalid. This method should not be called directly. The calling - * should be triggered by the invalidateUVs method (and in turn by updateUVs). - */ - PrimitivePrefabBase.prototype._pBuildUVs = function (target, geometryType) { - throw new away.errors.AbstractMethodError(); - }; - - /** - * Invalidates the primitive's geometry type, causing it to be updated when requested. - */ - PrimitivePrefabBase.prototype.invalidateGeometryType = function () { - this._geometryTypeDirty = true; - this._geomDirty = true; - this._uvDirty = true; - }; - - /** - * Invalidates the primitive's geometry, causing it to be updated when requested. - */ - PrimitivePrefabBase.prototype._pInvalidateGeometry = function () { - this._geomDirty = true; - }; - - /** - * Invalidates the primitive's uv coordinates, causing them to be updated when requested. - */ - PrimitivePrefabBase.prototype._pInvalidateUVs = function () { - this._uvDirty = true; - }; - - /** - * Updates the subgeometry when invalid. - */ - PrimitivePrefabBase.prototype.updateGeometryType = function () { - //remove any existing sub geometry - if (this._subGeometry) - this._geometry.removeSubGeometry(this._subGeometry); - - if (this._geometryType == "triangleSubGeometry") { - var triangleGeometry = new TriangleSubGeometry(true); - triangleGeometry.autoDeriveNormals = false; - triangleGeometry.autoDeriveTangents = false; - triangleGeometry.autoDeriveUVs = false; - this._geometry.addSubGeometry(triangleGeometry); - this._subGeometry = triangleGeometry; - } else if (this._geometryType == "lineSubGeometry") { - this._geometry.addSubGeometry(this._subGeometry = new LineSubGeometry()); - } - - this._geometryTypeDirty = false; - }; - - /** - * Updates the geometry when invalid. - */ - PrimitivePrefabBase.prototype.updateGeometry = function () { - this._pBuildGeometry(this._subGeometry, this._geometryType); - - this._geomDirty = false; - }; - - /** - * Updates the uv coordinates when invalid. - */ - PrimitivePrefabBase.prototype.updateUVs = function () { - this._pBuildUVs(this._subGeometry, this._geometryType); - - this._uvDirty = false; - }; - - PrimitivePrefabBase.prototype._iValidate = function () { - if (this._geometryTypeDirty) - this.updateGeometryType(); - - if (this._geomDirty) - this.updateGeometry(); - - if (this._uvDirty) - this.updateUVs(); - }; - - PrimitivePrefabBase.prototype._pCreateObject = function () { - var mesh = new Mesh(this._geometry, this._material); - mesh._iSourcePrefab = this; - - return mesh; - }; - return PrimitivePrefabBase; - })(prefabs.PrefabBase); - prefabs.PrimitivePrefabBase = PrimitivePrefabBase; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - /** - * A UV Cylinder primitive mesh. - */ - var PrimitiveTorusPrefab = (function (_super) { - __extends(PrimitiveTorusPrefab, _super); - /** - * Creates a new Torus object. - * @param radius The radius of the torus. - * @param tuebRadius The radius of the inner tube of the torus. - * @param segmentsR Defines the number of horizontal segments that make up the torus. - * @param segmentsT Defines the number of vertical segments that make up the torus. - * @param yUp Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - function PrimitiveTorusPrefab(radius, tubeRadius, segmentsR, segmentsT, yUp) { - if (typeof radius === "undefined") { radius = 50; } - if (typeof tubeRadius === "undefined") { tubeRadius = 50; } - if (typeof segmentsR === "undefined") { segmentsR = 16; } - if (typeof segmentsT === "undefined") { segmentsT = 8; } - if (typeof yUp === "undefined") { yUp = true; } - _super.call(this); - this._numVertices = 0; - - this._radius = radius; - this._tubeRadius = tubeRadius; - this._segmentsR = segmentsR; - this._segmentsT = segmentsT; - this._yUp = yUp; - } - Object.defineProperty(PrimitiveTorusPrefab.prototype, "radius", { - /** - * The radius of the torus. - */ - get: function () { - return this._radius; - }, - set: function (value) { - this._radius = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveTorusPrefab.prototype, "tubeRadius", { - /** - * The radius of the inner tube of the torus. - */ - get: function () { - return this._tubeRadius; - }, - set: function (value) { - this._tubeRadius = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveTorusPrefab.prototype, "segmentsR", { - /** - * Defines the number of horizontal segments that make up the torus. Defaults to 16. - */ - get: function () { - return this._segmentsR; - }, - set: function (value) { - this._segmentsR = value; - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveTorusPrefab.prototype, "segmentsT", { - /** - * Defines the number of vertical segments that make up the torus. Defaults to 8. - */ - get: function () { - return this._segmentsT; - }, - set: function (value) { - this._segmentsT = value; - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveTorusPrefab.prototype, "yUp", { - /** - * Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - get: function () { - return this._yUp; - }, - set: function (value) { - this._yUp = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - /** - * @inheritDoc - */ - PrimitiveTorusPrefab.prototype._pBuildGeometry = function (target, geometryType) { - var indices; - var positions; - var normals; - var tangents; - - var i, j; - var x, y, z, nx, ny, nz, revolutionAngleR, revolutionAngleT; - var vidx; - var fidx; - var numIndices = 0; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - // evaluate target number of vertices, triangles and indices - this._numVertices = (this._segmentsT + 1) * (this._segmentsR + 1); // segmentsT + 1 because of closure, segmentsR + 1 because of closure - numIndices = this._segmentsT * this._segmentsR * 6; // each level has segmentR quads, each of 2 triangles - - // need to initialize raw arrays or can be reused? - if (this._numVertices == triangleGeometry.numVertices) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array(numIndices); - positions = new Array(this._numVertices * 3); - normals = new Array(this._numVertices * 3); - tangents = new Array(this._numVertices * 3); - - this._pInvalidateUVs(); - } - - vidx = 0; - fidx = 0; - - // evaluate revolution steps - var revolutionAngleDeltaR = 2 * Math.PI / this._segmentsR; - var revolutionAngleDeltaT = 2 * Math.PI / this._segmentsT; - - var comp1, comp2; - var t1, t2, n1, n2; - var startIndex = 0; - var nextVertexIndex = 0; - - // surface - var a, b, c, d, length; - - for (j = 0; j <= this._segmentsT; ++j) { - startIndex = nextVertexIndex * 3; - - for (i = 0; i <= this._segmentsR; ++i) { - // revolution vertex - revolutionAngleR = i * revolutionAngleDeltaR; - revolutionAngleT = j * revolutionAngleDeltaT; - - length = Math.cos(revolutionAngleT); - nx = length * Math.cos(revolutionAngleR); - ny = length * Math.sin(revolutionAngleR); - nz = Math.sin(revolutionAngleT); - - x = this._radius * Math.cos(revolutionAngleR) + this._tubeRadius * nx; - y = this._radius * Math.sin(revolutionAngleR) + this._tubeRadius * ny; - z = (j == this._segmentsT) ? 0 : this._tubeRadius * nz; - - if (this._yUp) { - n1 = -nz; - n2 = ny; - t1 = 0; - t2 = (length ? nx / length : x / this._radius); - comp1 = -z; - comp2 = y; - } else { - n1 = ny; - n2 = nz; - t1 = (length ? nx / length : x / this._radius); - t2 = 0; - comp1 = y; - comp2 = z; - } - - if (i == this._segmentsR) { - positions[vidx] = x; - positions[vidx + 1] = positions[startIndex + 1]; - positions[vidx + 2] = positions[startIndex + 2]; - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - } - - normals[vidx] = nx; - normals[vidx + 1] = n1; - normals[vidx + 2] = n2; - tangents[vidx] = -(length ? ny / length : y / this._radius); - tangents[vidx + 1] = t1; - tangents[vidx + 2] = t2; - - vidx += 3; - - // close triangle - if (i > 0 && j > 0) { - a = nextVertexIndex; // current - b = nextVertexIndex - 1; // previous - c = b - this._segmentsR - 1; // previous of last level - d = a - this._segmentsR - 1; // current of last level - - indices[fidx++] = a; - indices[fidx++] = b; - indices[fidx++] = c; - - indices[fidx++] = a; - indices[fidx++] = c; - indices[fidx++] = d; - } - - nextVertexIndex++; - } - } - - // build real data from raw data - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - } else if (geometryType == "lineSubGeometry") { - //TODO - } - }; - - /** - * @inheritDoc - */ - PrimitiveTorusPrefab.prototype._pBuildUVs = function (target, geometryType) { - var i, j; - var uvs; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - // need to initialize raw array or can be reused? - if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(this._numVertices * 2); - } - - // current uv component index - var index = 0; - - for (j = 0; j <= this._segmentsT; ++j) { - for (i = 0; i <= this._segmentsR; ++i) { - // revolution vertex - uvs[index++] = (i / this._segmentsR) * triangleGeometry.scaleU; - uvs[index++] = (j / this._segmentsT) * triangleGeometry.scaleV; - } - } - - // build real data from raw data - triangleGeometry.updateUVs(uvs); - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - }; - return PrimitiveTorusPrefab; - })(prefabs.PrimitivePrefabBase); - prefabs.PrimitiveTorusPrefab = PrimitiveTorusPrefab; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - /** - * A Cube primitive prefab. - */ - var PrimitiveCubePrefab = (function (_super) { - __extends(PrimitiveCubePrefab, _super); - /** - * Creates a new Cube object. - * @param width The size of the cube along its X-axis. - * @param height The size of the cube along its Y-axis. - * @param depth The size of the cube along its Z-axis. - * @param segmentsW The number of segments that make up the cube along the X-axis. - * @param segmentsH The number of segments that make up the cube along the Y-axis. - * @param segmentsD The number of segments that make up the cube along the Z-axis. - * @param tile6 The type of uv mapping to use. When true, a texture will be subdivided in a 2x3 grid, each used for a single face. When false, the entire image is mapped on each face. - */ - function PrimitiveCubePrefab(width, height, depth, segmentsW, segmentsH, segmentsD, tile6) { - if (typeof width === "undefined") { width = 100; } - if (typeof height === "undefined") { height = 100; } - if (typeof depth === "undefined") { depth = 100; } - if (typeof segmentsW === "undefined") { segmentsW = 1; } - if (typeof segmentsH === "undefined") { segmentsH = 1; } - if (typeof segmentsD === "undefined") { segmentsD = 1; } - if (typeof tile6 === "undefined") { tile6 = true; } - _super.call(this); - - this._width = width; - this._height = height; - this._depth = depth; - this._segmentsW = segmentsW; - this._segmentsH = segmentsH; - this._segmentsD = segmentsD; - this._tile6 = tile6; - } - Object.defineProperty(PrimitiveCubePrefab.prototype, "width", { - /** - * The size of the cube along its X-axis. - */ - get: function () { - return this._width; - }, - set: function (value) { - this._width = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCubePrefab.prototype, "height", { - /** - * The size of the cube along its Y-axis. - */ - get: function () { - return this._height; - }, - set: function (value) { - this._height = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCubePrefab.prototype, "depth", { - /** - * The size of the cube along its Z-axis. - */ - get: function () { - return this._depth; - }, - set: function (value) { - this._depth = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCubePrefab.prototype, "tile6", { - /** - * The type of uv mapping to use. When false, the entire image is mapped on each face. - * When true, a texture will be subdivided in a 3x2 grid, each used for a single face. - * Reading the tiles from left to right, top to bottom they represent the faces of the - * cube in the following order: bottom, top, back, left, front, right. This creates - * several shared edges (between the top, front, left and right faces) which simplifies - * texture painting. - */ - get: function () { - return this._tile6; - }, - set: function (value) { - this._tile6 = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsW", { - /** - * The number of segments that make up the cube along the X-axis. Defaults to 1. - */ - get: function () { - return this._segmentsW; - }, - set: function (value) { - this._segmentsW = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsH", { - /** - * The number of segments that make up the cube along the Y-axis. Defaults to 1. - */ - get: function () { - return this._segmentsH; - }, - set: function (value) { - this._segmentsH = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsD", { - /** - * The number of segments that make up the cube along the Z-axis. Defaults to 1. - */ - get: function () { - return this._segmentsD; - }, - set: function (value) { - this._segmentsD = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - /** - * @inheritDoc - */ - PrimitiveCubePrefab.prototype._pBuildGeometry = function (target, geometryType) { - var indices; - var positions; - var normals; - var tangents; - - var tl, tr, bl, br; - var i, j, inc = 0; - - var vidx, fidx; - var hw, hh, hd; - var dw, dh, dd; - - var outer_pos; - var numIndices; - var numVertices; - - // half cube dimensions - hw = this._width / 2; - hh = this._height / 2; - hd = this._depth / 2; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - numVertices = ((this._segmentsW + 1) * (this._segmentsH + 1) + (this._segmentsW + 1) * (this._segmentsD + 1) + (this._segmentsH + 1) * (this._segmentsD + 1)) * 2; - - numIndices = ((this._segmentsW * this._segmentsH + this._segmentsW * this._segmentsD + this._segmentsH * this._segmentsD) * 12); - - if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array(numIndices); - positions = new Array(numVertices * 3); - normals = new Array(numVertices * 3); - tangents = new Array(numVertices * 3); - - this._pInvalidateUVs(); - } - - vidx = 0; - fidx = 0; - - // Segment dimensions - dw = this._width / this._segmentsW; - dh = this._height / this._segmentsH; - dd = this._depth / this._segmentsD; - - for (i = 0; i <= this._segmentsW; i++) { - outer_pos = -hw + i * dw; - - for (j = 0; j <= this._segmentsH; j++) { - // front - positions[vidx] = outer_pos; - positions[vidx + 1] = -hh + j * dh; - positions[vidx + 2] = -hd; - normals[vidx] = 0; - normals[vidx + 1] = 0; - normals[vidx + 2] = -1; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - // back - positions[vidx] = outer_pos; - positions[vidx + 1] = -hh + j * dh; - positions[vidx + 2] = hd; - normals[vidx] = 0; - normals[vidx + 1] = 0; - normals[vidx + 2] = 1; - tangents[vidx] = -1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - if (i && j) { - tl = 2 * ((i - 1) * (this._segmentsH + 1) + (j - 1)); - tr = 2 * (i * (this._segmentsH + 1) + (j - 1)); - bl = tl + 2; - br = tr + 2; - - indices[fidx++] = tl; - indices[fidx++] = bl; - indices[fidx++] = br; - indices[fidx++] = tl; - indices[fidx++] = br; - indices[fidx++] = tr; - indices[fidx++] = tr + 1; - indices[fidx++] = br + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tr + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tl + 1; - } - } - } - - inc += 2 * (this._segmentsW + 1) * (this._segmentsH + 1); - - for (i = 0; i <= this._segmentsW; i++) { - outer_pos = -hw + i * dw; - - for (j = 0; j <= this._segmentsD; j++) { - // top - positions[vidx] = outer_pos; - positions[vidx + 1] = hh; - positions[vidx + 2] = -hd + j * dd; - normals[vidx] = 0; - normals[vidx + 1] = 1; - normals[vidx + 2] = 0; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - // bottom - positions[vidx] = outer_pos; - positions[vidx + 1] = -hh; - positions[vidx + 2] = -hd + j * dd; - normals[vidx] = 0; - normals[vidx + 1] = -1; - normals[vidx + 2] = 0; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - if (i && j) { - tl = inc + 2 * ((i - 1) * (this._segmentsD + 1) + (j - 1)); - tr = inc + 2 * (i * (this._segmentsD + 1) + (j - 1)); - bl = tl + 2; - br = tr + 2; - - indices[fidx++] = tl; - indices[fidx++] = bl; - indices[fidx++] = br; - indices[fidx++] = tl; - indices[fidx++] = br; - indices[fidx++] = tr; - indices[fidx++] = tr + 1; - indices[fidx++] = br + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tr + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tl + 1; - } - } - } - - inc += 2 * (this._segmentsW + 1) * (this._segmentsD + 1); - - for (i = 0; i <= this._segmentsD; i++) { - outer_pos = hd - i * dd; - - for (j = 0; j <= this._segmentsH; j++) { - // left - positions[vidx] = -hw; - positions[vidx + 1] = -hh + j * dh; - positions[vidx + 2] = outer_pos; - normals[vidx] = -1; - normals[vidx + 1] = 0; - normals[vidx + 2] = 0; - tangents[vidx] = 0; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = -1; - vidx += 3; - - // right - positions[vidx] = hw; - positions[vidx + 1] = -hh + j * dh; - positions[vidx + 2] = outer_pos; - normals[vidx] = 1; - normals[vidx + 1] = 0; - normals[vidx + 2] = 0; - tangents[vidx] = 0; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 1; - vidx += 3; - - if (i && j) { - tl = inc + 2 * ((i - 1) * (this._segmentsH + 1) + (j - 1)); - tr = inc + 2 * (i * (this._segmentsH + 1) + (j - 1)); - bl = tl + 2; - br = tr + 2; - - indices[fidx++] = tl; - indices[fidx++] = bl; - indices[fidx++] = br; - indices[fidx++] = tl; - indices[fidx++] = br; - indices[fidx++] = tr; - indices[fidx++] = tr + 1; - indices[fidx++] = br + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tr + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tl + 1; - } - } - } - - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - } else if (geometryType == "lineSubGeometry") { - var lineGeometry = target; - - var numSegments = this._segmentsH * 4 + this._segmentsW * 4 + this._segmentsD * 4; - var startPositions; - var endPositions; - var thickness; - - if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { - startPositions = lineGeometry.startPositions; - endPositions = lineGeometry.endPositions; - thickness = lineGeometry.thickness; - } else { - startPositions = new Array(numSegments * 3); - endPositions = new Array(numSegments * 3); - thickness = new Array(numSegments); - } - - vidx = 0; - - fidx = 0; - - for (i = 0; i < this._segmentsH; ++i) { - startPositions[vidx] = -hw; - startPositions[vidx + 1] = i * this._height / this._segmentsH - hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = i * this._height / this._segmentsH - hh; - endPositions[vidx + 2] = -hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = -hw; - startPositions[vidx + 1] = hh - i * this._height / this._segmentsH; - startPositions[vidx + 2] = hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = hh - i * this._height / this._segmentsH; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (i = 0; i < this._segmentsW; ++i) { - startPositions[vidx] = i * this._width / this._segmentsW - hw; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = i * this._width / this._segmentsW - hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = -hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = hw - i * this._width / this._segmentsW; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = hd; - - endPositions[vidx] = hw - i * this._width / this._segmentsW; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (i = 0; i < this._segmentsH; ++i) { - startPositions[vidx] = -hw; - startPositions[vidx + 1] = i * this._height / this._segmentsH - hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = -hw; - endPositions[vidx + 1] = i * this._height / this._segmentsH - hh; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = hw; - startPositions[vidx + 1] = hh - i * this._height / this._segmentsH; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = hh - i * this._height / this._segmentsH; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (i = 0; i < this._segmentsD; ++i) { - startPositions[vidx] = hw; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = -hw; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; - - endPositions[vidx] = -hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (i = 0; i < this._segmentsD; ++i) { - startPositions[vidx] = -hw; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = -hh; - endPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = -hw; - startPositions[vidx + 1] = hh; - startPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (i = 0; i < this._segmentsW; ++i) { - startPositions[vidx] = hw - i * this._width / this._segmentsW; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = hw - i * this._width / this._segmentsW; - endPositions[vidx + 1] = -hh; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = i * this._width / this._segmentsW - hw; - startPositions[vidx + 1] = hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = i * this._width / this._segmentsW - hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - // build real data from raw data - lineGeometry.updatePositions(startPositions, endPositions); - lineGeometry.updateThickness(thickness); - } - }; - - /** - * @inheritDoc - */ - PrimitiveCubePrefab.prototype._pBuildUVs = function (target, geometryType) { - var i, j, index; - var uvs; - - var u_tile_dim, v_tile_dim; - var u_tile_step, v_tile_step; - var tl0u, tl0v; - var tl1u, tl1v; - var du, dv; - var numVertices; - - if (geometryType == "triangleSubGeometry") { - numVertices = ((this._segmentsW + 1) * (this._segmentsH + 1) + (this._segmentsW + 1) * (this._segmentsD + 1) + (this._segmentsH + 1) * (this._segmentsD + 1)) * 2; - - var triangleGeometry = target; - - if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(numVertices * 2); - } - - if (this._tile6) { - u_tile_dim = u_tile_step = 1 / 3; - v_tile_dim = v_tile_step = 1 / 2; - } else { - u_tile_dim = v_tile_dim = 1; - u_tile_step = v_tile_step = 0; - } - - // Create planes two and two, the same way that they were - // constructed in the buildGeometry() function. First calculate - // the top-left UV coordinate for both planes, and then loop - // over the points, calculating the UVs from these numbers. - // When tile6 is true, the layout is as follows: - // .-----.-----.-----. (1,1) - // | Bot | T | Bak | - // |-----+-----+-----| - // | L | F | R | - // (0,0)'-----'-----'-----' - index = 0; - - // FRONT / BACK - tl0u = 1 * u_tile_step; - tl0v = 1 * v_tile_step; - tl1u = 2 * u_tile_step; - tl1v = 0 * v_tile_step; - du = u_tile_dim / this._segmentsW; - dv = v_tile_dim / this._segmentsH; - for (i = 0; i <= this._segmentsW; i++) { - for (j = 0; j <= this._segmentsH; j++) { - uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; - uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; - - uvs[index++] = (tl1u + (u_tile_dim - i * du)) * triangleGeometry.scaleU; - uvs[index++] = (tl1v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; - } - } - - // TOP / BOTTOM - tl0u = 1 * u_tile_step; - tl0v = 0 * v_tile_step; - tl1u = 0 * u_tile_step; - tl1v = 0 * v_tile_step; - du = u_tile_dim / this._segmentsW; - dv = v_tile_dim / this._segmentsD; - for (i = 0; i <= this._segmentsW; i++) { - for (j = 0; j <= this._segmentsD; j++) { - uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; - uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; - - uvs[index++] = (tl1u + i * du) * triangleGeometry.scaleU; - uvs[index++] = (tl1v + j * dv) * triangleGeometry.scaleV; - } - } - - // LEFT / RIGHT - tl0u = 0 * u_tile_step; - tl0v = 1 * v_tile_step; - tl1u = 2 * u_tile_step; - tl1v = 1 * v_tile_step; - du = u_tile_dim / this._segmentsD; - dv = v_tile_dim / this._segmentsH; - for (i = 0; i <= this._segmentsD; i++) { - for (j = 0; j <= this._segmentsH; j++) { - uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; - uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; - - uvs[index++] = (tl1u + (u_tile_dim - i * du)) * triangleGeometry.scaleU; - uvs[index++] = (tl1v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; - } - } - - triangleGeometry.updateUVs(uvs); - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - }; - return PrimitiveCubePrefab; - })(prefabs.PrimitivePrefabBase); - prefabs.PrimitiveCubePrefab = PrimitiveCubePrefab; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - /** - * A Plane primitive mesh. - */ - var PrimitivePlanePrefab = (function (_super) { - __extends(PrimitivePlanePrefab, _super); - /** - * Creates a new Plane object. - * @param width The width of the plane. - * @param height The height of the plane. - * @param segmentsW The number of segments that make up the plane along the X-axis. - * @param segmentsH The number of segments that make up the plane along the Y or Z-axis. - * @param yUp Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). - * @param doubleSided Defines whether the plane will be visible from both sides, with correct vertex normals. - */ - function PrimitivePlanePrefab(width, height, segmentsW, segmentsH, yUp, doubleSided) { - if (typeof width === "undefined") { width = 100; } - if (typeof height === "undefined") { height = 100; } - if (typeof segmentsW === "undefined") { segmentsW = 1; } - if (typeof segmentsH === "undefined") { segmentsH = 1; } - if (typeof yUp === "undefined") { yUp = true; } - if (typeof doubleSided === "undefined") { doubleSided = false; } - _super.call(this); - - this._segmentsW = segmentsW; - this._segmentsH = segmentsH; - this._yUp = yUp; - this._width = width; - this._height = height; - this._doubleSided = doubleSided; - } - Object.defineProperty(PrimitivePlanePrefab.prototype, "segmentsW", { - /** - * The number of segments that make up the plane along the X-axis. Defaults to 1. - */ - get: function () { - return this._segmentsW; - }, - set: function (value) { - this._segmentsW = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitivePlanePrefab.prototype, "segmentsH", { - /** - * The number of segments that make up the plane along the Y or Z-axis, depending on whether yUp is true or - * false, respectively. Defaults to 1. - */ - get: function () { - return this._segmentsH; - }, - set: function (value) { - this._segmentsH = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitivePlanePrefab.prototype, "yUp", { - /** - * Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). Defaults to true. - */ - get: function () { - return this._yUp; - }, - set: function (value) { - this._yUp = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitivePlanePrefab.prototype, "doubleSided", { - /** - * Defines whether the plane will be visible from both sides, with correct vertex normals (as opposed to bothSides on Material). Defaults to false. - */ - get: function () { - return this._doubleSided; - }, - set: function (value) { - this._doubleSided = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitivePlanePrefab.prototype, "width", { - /** - * The width of the plane. - */ - get: function () { - return this._width; - }, - set: function (value) { - this._width = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitivePlanePrefab.prototype, "height", { - /** - * The height of the plane. - */ - get: function () { - return this._height; - }, - set: function (value) { - this._height = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - /** - * @inheritDoc - */ - PrimitivePlanePrefab.prototype._pBuildGeometry = function (target, geometryType) { - var indices; - var x, y; - var numIndices; - var base; - var tw = this._segmentsW + 1; - var numVertices; - - var vidx, fidx; - - var xi; - var yi; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - var numVertices = (this._segmentsH + 1) * tw; - var positions; - var normals; - var tangents; - - if (this._doubleSided) - numVertices *= 2; - - numIndices = this._segmentsH * this._segmentsW * 6; - - if (this._doubleSided) - numIndices *= 2; - - if (triangleGeometry.indices != null && numIndices == triangleGeometry.indices.length) { - indices = triangleGeometry.indices; - } else { - indices = new Array(numIndices); - - this._pInvalidateUVs(); - } - - if (numVertices == triangleGeometry.numVertices) { - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - positions = new Array(numVertices * 3); - normals = new Array(numVertices * 3); - tangents = new Array(numVertices * 3); - - this._pInvalidateUVs(); - } - - fidx = 0; - - vidx = 0; - - for (yi = 0; yi <= this._segmentsH; ++yi) { - for (xi = 0; xi <= this._segmentsW; ++xi) { - x = (xi / this._segmentsW - .5) * this._width; - y = (yi / this._segmentsH - .5) * this._height; - - positions[vidx] = x; - if (this._yUp) { - positions[vidx + 1] = 0; - positions[vidx + 2] = y; - } else { - positions[vidx + 1] = y; - positions[vidx + 2] = 0; - } - - normals[vidx] = 0; - - if (this._yUp) { - normals[vidx + 1] = 1; - normals[vidx + 2] = 0; - } else { - normals[vidx + 1] = 0; - normals[vidx + 2] = -1; - } - - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - - vidx += 3; - - // add vertex with same position, but with inverted normal & tangent - if (this._doubleSided) { - for (var i = vidx; i < vidx + 3; ++i) { - positions[i] = positions[i - 3]; - normals[i] = -normals[i - 3]; - tangents[i] = -tangents[i - 3]; - } - - vidx += 3; - } - - if (xi != this._segmentsW && yi != this._segmentsH) { - base = xi + yi * tw; - var mult = this._doubleSided ? 2 : 1; - - indices[fidx++] = base * mult; - indices[fidx++] = (base + tw) * mult; - indices[fidx++] = (base + tw + 1) * mult; - indices[fidx++] = base * mult; - indices[fidx++] = (base + tw + 1) * mult; - indices[fidx++] = (base + 1) * mult; - - if (this._doubleSided) { - indices[fidx++] = (base + tw + 1) * mult + 1; - indices[fidx++] = (base + tw) * mult + 1; - indices[fidx++] = base * mult + 1; - indices[fidx++] = (base + 1) * mult + 1; - indices[fidx++] = (base + tw + 1) * mult + 1; - indices[fidx++] = base * mult + 1; - } - } - } - } - - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - } else if (geometryType == "lineSubGeometry") { - var lineGeometry = target; - - var numSegments = (this._segmentsH + 1) + tw; - var startPositions; - var endPositions; - var thickness; - - var hw = this._width / 2; - var hh = this._height / 2; - - if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { - startPositions = lineGeometry.startPositions; - endPositions = lineGeometry.endPositions; - thickness = lineGeometry.thickness; - } else { - startPositions = new Array(numSegments * 3); - endPositions = new Array(numSegments * 3); - thickness = new Array(numSegments); - } - - fidx = 0; - - vidx = 0; - - for (yi = 0; yi <= this._segmentsH; ++yi) { - startPositions[vidx] = -hw; - startPositions[vidx + 1] = 0; - startPositions[vidx + 2] = yi * this._height - hh; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = 0; - endPositions[vidx + 2] = yi * this._height - hh; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (xi = 0; xi <= this._segmentsW; ++xi) { - startPositions[vidx] = xi * this._width - hw; - startPositions[vidx + 1] = 0; - startPositions[vidx + 2] = -hh; - - endPositions[vidx] = xi * this._width - hw; - endPositions[vidx + 1] = 0; - endPositions[vidx + 2] = hh; - - thickness[fidx++] = 1; - - vidx += 3; - } - - // build real data from raw data - lineGeometry.updatePositions(startPositions, endPositions); - lineGeometry.updateThickness(thickness); - } - }; - - /** - * @inheritDoc - */ - PrimitivePlanePrefab.prototype._pBuildUVs = function (target, geometryType) { - var uvs; - var numVertices; - - if (geometryType == "triangleSubGeometry") { - numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); - - if (this._doubleSided) - numVertices *= 2; - - var triangleGeometry = target; - - if (triangleGeometry.uvs && numVertices == triangleGeometry.numVertices) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(numVertices * 2); - this._pInvalidateGeometry(); - } - - var index = 0; - - for (var yi = 0; yi <= this._segmentsH; ++yi) { - for (var xi = 0; xi <= this._segmentsW; ++xi) { - uvs[index] = (xi / this._segmentsW) * triangleGeometry.scaleU; - uvs[index + 1] = (1 - yi / this._segmentsH) * triangleGeometry.scaleV; - index += 2; - - if (this._doubleSided) { - uvs[index] = (xi / this._segmentsW) * triangleGeometry.scaleU; - uvs[index + 1] = (1 - yi / this._segmentsH) * triangleGeometry.scaleV; - index += 2; - } - } - } - - triangleGeometry.updateUVs(uvs); - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - }; - return PrimitivePlanePrefab; - })(prefabs.PrimitivePrefabBase); - prefabs.PrimitivePlanePrefab = PrimitivePlanePrefab; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - /** - * A Capsule primitive mesh. - */ - var PrimitiveCapsulePrefab = (function (_super) { - __extends(PrimitiveCapsulePrefab, _super); - /** - * Creates a new Capsule object. - * @param radius The radius of the capsule. - * @param height The height of the capsule. - * @param segmentsW Defines the number of horizontal segments that make up the capsule. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven value. - * @param yUp Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - function PrimitiveCapsulePrefab(radius, height, segmentsW, segmentsH, yUp) { - if (typeof radius === "undefined") { radius = 50; } - if (typeof height === "undefined") { height = 100; } - if (typeof segmentsW === "undefined") { segmentsW = 16; } - if (typeof segmentsH === "undefined") { segmentsH = 15; } - if (typeof yUp === "undefined") { yUp = true; } - _super.call(this); - this._numVertices = 0; - - this._radius = radius; - this._height = height; - this._segmentsW = segmentsW; - this._segmentsH = (segmentsH % 2 == 0) ? segmentsH + 1 : segmentsH; - this._yUp = yUp; - } - Object.defineProperty(PrimitiveCapsulePrefab.prototype, "radius", { - /** - * The radius of the capsule. - */ - get: function () { - return this._radius; - }, - set: function (value) { - this._radius = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCapsulePrefab.prototype, "height", { - /** - * The height of the capsule. - */ - get: function () { - return this._height; - }, - set: function (value) { - this._height = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCapsulePrefab.prototype, "segmentsW", { - /** - * Defines the number of horizontal segments that make up the capsule. Defaults to 16. - */ - get: function () { - return this._segmentsW; - }, - set: function (value) { - this._segmentsW = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCapsulePrefab.prototype, "segmentsH", { - /** - * Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven. - */ - get: function () { - return this._segmentsH; - }, - set: function (value) { - this._segmentsH = (value % 2 == 0) ? value + 1 : value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCapsulePrefab.prototype, "yUp", { - /** - * Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - get: function () { - return this._yUp; - }, - set: function (value) { - this._yUp = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - /** - * @inheritDoc - */ - PrimitiveCapsulePrefab.prototype._pBuildGeometry = function (target, geometryType) { - var indices; - var positions; - var normals; - var tangents; - - var i; - var j; - var triIndex = 0; - var index = 0; - var startIndex; - var comp1, comp2, t1, t2; - var numIndices = 0; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - // evaluate target number of vertices, triangles and indices - this._numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of closure - numIndices = (this._segmentsH - 1) * this._segmentsW * 6; // each level has segmentH quads, each of 2 triangles - - // need to initialize raw arrays or can be reused? - if (this._numVertices == triangleGeometry.numVertices) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array(numIndices); - positions = new Array(this._numVertices * 3); - normals = new Array(this._numVertices * 3); - tangents = new Array(this._numVertices * 3); - - this._pInvalidateUVs(); - } - - for (j = 0; j <= this._segmentsH; ++j) { - var horangle = Math.PI * j / this._segmentsH; - var z = -this._radius * Math.cos(horangle); - var ringradius = this._radius * Math.sin(horangle); - - startIndex = index; - - for (i = 0; i <= this._segmentsW; ++i) { - var verangle = 2 * Math.PI * i / this._segmentsW; - var x = ringradius * Math.cos(verangle); - var offset = j > this._segmentsH / 2 ? this._height / 2 : -this._height / 2; - var y = ringradius * Math.sin(verangle); - var normLen = 1 / Math.sqrt(x * x + y * y + z * z); - var tanLen = Math.sqrt(y * y + x * x); - - if (this._yUp) { - t1 = 0; - t2 = tanLen > .007 ? x / tanLen : 0; - comp1 = -z; - comp2 = y; - } else { - t1 = tanLen > .007 ? x / tanLen : 0; - t2 = 0; - comp1 = y; - comp2 = z; - } - - if (i == this._segmentsW) { - positions[index] = positions[startIndex]; - positions[index + 1] = positions[startIndex + 1]; - positions[index + 2] = positions[startIndex + 2]; - normals[index] = (normals[startIndex] + (x * normLen)) * .5; - normals[index + 1] = (normals[startIndex + 1] + (comp1 * normLen)) * .5; - normals[index + 2] = (normals[startIndex + 2] + (comp2 * normLen)) * .5; - tangents[index] = (tangents[startIndex] + (tanLen > .007 ? -y / tanLen : 1)) * .5; - tangents[index + 1] = (tangents[startIndex + 1] + t1) * .5; - tangents[index + 2] = (tangents[startIndex + 2] + t2) * .5; - } else { - // vertex - positions[index] = x; - positions[index + 1] = (this._yUp) ? comp1 - offset : comp1; - positions[index + 2] = (this._yUp) ? comp2 : comp2 + offset; - - // normal - normals[index] = x * normLen; - normals[index + 1] = comp1 * normLen; - normals[index + 2] = comp2 * normLen; - - // tangent - tangents[index] = tanLen > .007 ? -y / tanLen : 1; - tangents[index + 1] = t1; - tangents[index + 2] = t2; - } - - if (i > 0 && j > 0) { - var a = (this._segmentsW + 1) * j + i; - var b = (this._segmentsW + 1) * j + i - 1; - var c = (this._segmentsW + 1) * (j - 1) + i - 1; - var d = (this._segmentsW + 1) * (j - 1) + i; - - if (j == this._segmentsH) { - positions[index] = positions[startIndex]; - positions[index + 1] = positions[startIndex + 1]; - positions[index + 2] = positions[startIndex + 2]; - - indices[triIndex++] = a; - indices[triIndex++] = c; - indices[triIndex++] = d; - } else if (j == 1) { - indices[triIndex++] = a; - indices[triIndex++] = b; - indices[triIndex++] = c; - } else { - indices[triIndex++] = a; - indices[triIndex++] = b; - indices[triIndex++] = c; - indices[triIndex++] = a; - indices[triIndex++] = c; - indices[triIndex++] = d; - } - } - - index += 3; - } - } - - // build real data from raw data - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - } else if (geometryType == "lineSubGeometry") { - //TODO - } - }; - - /** - * @inheritDoc - */ - PrimitiveCapsulePrefab.prototype._pBuildUVs = function (target, geometryType) { - var i, j; - var uvs; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - // need to initialize raw array or can be reused? - if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(this._numVertices * 2); - } - - // current uv component index - var index = 0; - - for (j = 0; j <= this._segmentsH; ++j) { - for (i = 0; i <= this._segmentsW; ++i) { - // revolution vertex - uvs[index++] = (i / this._segmentsW) * triangleGeometry.scaleU; - uvs[index++] = (j / this._segmentsH) * triangleGeometry.scaleV; - } - } - - // build real data from raw data - triangleGeometry.updateUVs(uvs); - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - }; - return PrimitiveCapsulePrefab; - })(prefabs.PrimitivePrefabBase); - prefabs.PrimitiveCapsulePrefab = PrimitiveCapsulePrefab; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - /** - * A Cylinder primitive mesh. - */ - var PrimitiveCylinderPrefab = (function (_super) { - __extends(PrimitiveCylinderPrefab, _super); - /** - * Creates a new Cylinder object. - * @param topRadius The radius of the top end of the cylinder. - * @param bottomRadius The radius of the bottom end of the cylinder - * @param height The radius of the bottom end of the cylinder - * @param segmentsW Defines the number of horizontal segments that make up the cylinder. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the cylinder. Defaults to 1. - * @param topClosed Defines whether the top end of the cylinder is closed (true) or open. - * @param bottomClosed Defines whether the bottom end of the cylinder is closed (true) or open. - * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - function PrimitiveCylinderPrefab(topRadius, bottomRadius, height, segmentsW, segmentsH, topClosed, bottomClosed, surfaceClosed, yUp) { - if (typeof topRadius === "undefined") { topRadius = 50; } - if (typeof bottomRadius === "undefined") { bottomRadius = 50; } - if (typeof height === "undefined") { height = 100; } - if (typeof segmentsW === "undefined") { segmentsW = 16; } - if (typeof segmentsH === "undefined") { segmentsH = 1; } - if (typeof topClosed === "undefined") { topClosed = true; } - if (typeof bottomClosed === "undefined") { bottomClosed = true; } - if (typeof surfaceClosed === "undefined") { surfaceClosed = true; } - if (typeof yUp === "undefined") { yUp = true; } - _super.call(this); - this._numVertices = 0; - - this._topRadius = topRadius; - this._pBottomRadius = bottomRadius; - this._height = height; - this._pSegmentsW = segmentsW; - this._pSegmentsH = segmentsH; - this._topClosed = topClosed; - this._bottomClosed = bottomClosed; - this._surfaceClosed = surfaceClosed; - this._yUp = yUp; - } - Object.defineProperty(PrimitiveCylinderPrefab.prototype, "topRadius", { - /** - * The radius of the top end of the cylinder. - */ - get: function () { - return this._topRadius; - }, - set: function (value) { - this._topRadius = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCylinderPrefab.prototype, "bottomRadius", { - /** - * The radius of the bottom end of the cylinder. - */ - get: function () { - return this._pBottomRadius; - }, - set: function (value) { - this._pBottomRadius = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCylinderPrefab.prototype, "height", { - /** - * The radius of the top end of the cylinder. - */ - get: function () { - return this._height; - }, - set: function (value) { - this._height = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCylinderPrefab.prototype, "segmentsW", { - /** - * Defines the number of horizontal segments that make up the cylinder. Defaults to 16. - */ - get: function () { - return this._pSegmentsW; - }, - set: function (value) { - this.setSegmentsW(value); - }, - enumerable: true, - configurable: true - }); - - - PrimitiveCylinderPrefab.prototype.setSegmentsW = function (value) { - this._pSegmentsW = value; - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }; - - Object.defineProperty(PrimitiveCylinderPrefab.prototype, "segmentsH", { - /** - * Defines the number of vertical segments that make up the cylinder. Defaults to 1. - */ - get: function () { - return this._pSegmentsH; - }, - set: function (value) { - this.setSegmentsH(value); - }, - enumerable: true, - configurable: true - }); - - - PrimitiveCylinderPrefab.prototype.setSegmentsH = function (value) { - this._pSegmentsH = value; - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }; - - Object.defineProperty(PrimitiveCylinderPrefab.prototype, "topClosed", { - /** - * Defines whether the top end of the cylinder is closed (true) or open. - */ - get: function () { - return this._topClosed; - }, - set: function (value) { - this._topClosed = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCylinderPrefab.prototype, "bottomClosed", { - /** - * Defines whether the bottom end of the cylinder is closed (true) or open. - */ - get: function () { - return this._bottomClosed; - }, - set: function (value) { - this._bottomClosed = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveCylinderPrefab.prototype, "yUp", { - /** - * Defines whether the cylinder poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - get: function () { - return this._yUp; - }, - set: function (value) { - this._yUp = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - /** - * @inheritDoc - */ - PrimitiveCylinderPrefab.prototype._pBuildGeometry = function (target, geometryType) { - var indices; - var positions; - var normals; - var tangents; - - var i; - var j; - var x; - var y; - var z; - var vidx; - var fidx; - - var radius; - var revolutionAngle; - - var dr; - var latNormElev; - var latNormBase; - var numIndices = 0; - - var comp1; - var comp2; - var startIndex = 0; - var nextVertexIndex = 0; - - var t1; - var t2; - - // reset utility variables - this._numVertices = 0; - - // evaluate revolution steps - var revolutionAngleDelta = 2 * Math.PI / this._pSegmentsW; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - // evaluate target number of vertices, triangles and indices - if (this._surfaceClosed) { - this._numVertices += (this._pSegmentsH + 1) * (this._pSegmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of UV unwrapping - numIndices += this._pSegmentsH * this._pSegmentsW * 6; // each level has segmentW quads, each of 2 triangles - } - if (this._topClosed) { - this._numVertices += 2 * (this._pSegmentsW + 1); // segmentsW + 1 because of unwrapping - numIndices += this._pSegmentsW * 3; // one triangle for each segment - } - if (this._bottomClosed) { - this._numVertices += 2 * (this._pSegmentsW + 1); - numIndices += this._pSegmentsW * 3; - } - - // need to initialize raw arrays or can be reused? - if (this._numVertices == triangleGeometry.numVertices) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array(numIndices); - positions = new Array(this._numVertices * 3); - normals = new Array(this._numVertices * 3); - tangents = new Array(this._numVertices * 3); - - this._pInvalidateUVs(); - } - - vidx = 0; - fidx = 0; - - // top - if (this._topClosed && this._topRadius > 0) { - z = -0.5 * this._height; - - for (i = 0; i <= this._pSegmentsW; ++i) { - // central vertex - if (this._yUp) { - t1 = 1; - t2 = 0; - comp1 = -z; - comp2 = 0; - } else { - t1 = 0; - t2 = -1; - comp1 = 0; - comp2 = z; - } - - positions[vidx] = 0; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - normals[vidx] = 0; - normals[vidx + 1] = t1; - normals[vidx + 2] = t2; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - // revolution vertex - revolutionAngle = i * revolutionAngleDelta; - x = this._topRadius * Math.cos(revolutionAngle); - y = this._topRadius * Math.sin(revolutionAngle); - - if (this._yUp) { - comp1 = -z; - comp2 = y; - } else { - comp1 = y; - comp2 = z; - } - - if (i == this._pSegmentsW) { - positions[vidx] = positions[startIndex + 3]; - positions[vidx + 1] = positions[startIndex + 4]; - positions[vidx + 2] = positions[startIndex + 5]; - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - } - - normals[vidx] = 0; - normals[vidx + 1] = t1; - normals[vidx + 2] = t2; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - if (i > 0) { - // add triangle - indices[fidx++] = nextVertexIndex; - indices[fidx++] = nextVertexIndex + 1; - indices[fidx++] = nextVertexIndex + 2; - - nextVertexIndex += 2; - } - } - - nextVertexIndex += 2; - } - - // bottom - if (this._bottomClosed && this._pBottomRadius > 0) { - z = 0.5 * this._height; - - startIndex = nextVertexIndex * 3; - - for (i = 0; i <= this._pSegmentsW; ++i) { - if (this._yUp) { - t1 = -1; - t2 = 0; - comp1 = -z; - comp2 = 0; - } else { - t1 = 0; - t2 = 1; - comp1 = 0; - comp2 = z; - } - - positions[vidx] = 0; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - normals[vidx] = 0; - normals[vidx + 1] = t1; - normals[vidx + 2] = t2; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - // revolution vertex - revolutionAngle = i * revolutionAngleDelta; - x = this._pBottomRadius * Math.cos(revolutionAngle); - y = this._pBottomRadius * Math.sin(revolutionAngle); - - if (this._yUp) { - comp1 = -z; - comp2 = y; - } else { - comp1 = y; - comp2 = z; - } - - if (i == this._pSegmentsW) { - positions[vidx] = positions[startIndex + 3]; - positions[vidx + 1] = positions[startIndex + 4]; - positions[vidx + 2] = positions[startIndex + 5]; - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - } - - normals[vidx] = 0; - normals[vidx + 1] = t1; - normals[vidx + 2] = t2; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - if (i > 0) { - // add triangle - indices[fidx++] = nextVertexIndex; - indices[fidx++] = nextVertexIndex + 2; - indices[fidx++] = nextVertexIndex + 1; - - nextVertexIndex += 2; - } - } - - nextVertexIndex += 2; - } - - // The normals on the lateral surface all have the same incline, i.e. - // the "elevation" component (Y or Z depending on yUp) is constant. - // Same principle goes for the "base" of these vectors, which will be - // calculated such that a vector [base,elev] will be a unit vector. - dr = (this._pBottomRadius - this._topRadius); - latNormElev = dr / this._height; - latNormBase = (latNormElev == 0) ? 1 : this._height / dr; - - // lateral surface - if (this._surfaceClosed) { - var a; - var b; - var c; - var d; - var na0, na1, naComp1, naComp2; - - for (j = 0; j <= this._pSegmentsH; ++j) { - radius = this._topRadius - ((j / this._pSegmentsH) * (this._topRadius - this._pBottomRadius)); - z = -(this._height / 2) + (j / this._pSegmentsH * this._height); - - startIndex = nextVertexIndex * 3; - - for (i = 0; i <= this._pSegmentsW; ++i) { - // revolution vertex - revolutionAngle = i * revolutionAngleDelta; - x = radius * Math.cos(revolutionAngle); - y = radius * Math.sin(revolutionAngle); - na0 = latNormBase * Math.cos(revolutionAngle); - na1 = latNormBase * Math.sin(revolutionAngle); - - if (this._yUp) { - t1 = 0; - t2 = -na0; - comp1 = -z; - comp2 = y; - naComp1 = latNormElev; - naComp2 = na1; - } else { - t1 = -na0; - t2 = 0; - comp1 = y; - comp2 = z; - naComp1 = na1; - naComp2 = latNormElev; - } - - if (i == this._pSegmentsW) { - positions[vidx] = positions[startIndex]; - positions[vidx + 1] = positions[startIndex + 1]; - positions[vidx + 2] = positions[startIndex + 2]; - normals[vidx] = na0; - normals[vidx + 1] = latNormElev; - normals[vidx + 2] = na1; - tangents[vidx] = na1; - tangents[vidx + 1] = t1; - tangents[vidx + 2] = t2; - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - normals[vidx] = na0; - normals[vidx + 1] = naComp1; - normals[vidx + 2] = naComp2; - tangents[vidx] = -na1; - tangents[vidx + 1] = t1; - tangents[vidx + 2] = t2; - } - vidx += 3; - - // close triangle - if (i > 0 && j > 0) { - a = nextVertexIndex; // current - b = nextVertexIndex - 1; // previous - c = b - this._pSegmentsW - 1; // previous of last level - d = a - this._pSegmentsW - 1; // current of last level - - indices[fidx++] = a; - indices[fidx++] = b; - indices[fidx++] = c; - - indices[fidx++] = a; - indices[fidx++] = c; - indices[fidx++] = d; - } - - nextVertexIndex++; - } - } - } - - // build real data from raw data - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - } else if (geometryType == "lineSubGeometry") { - var lineGeometry = target; - - var numSegments = (this._pSegmentsH + 1) * (this._pSegmentsW) + this._pSegmentsW; - var startPositions; - var endPositions; - var thickness; - - if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { - startPositions = lineGeometry.startPositions; - endPositions = lineGeometry.endPositions; - thickness = lineGeometry.thickness; - } else { - startPositions = new Array(numSegments * 3); - endPositions = new Array(numSegments * 3); - thickness = new Array(numSegments); - } - - vidx = 0; - - fidx = 0; - - for (j = 0; j <= this._pSegmentsH; ++j) { - radius = this._topRadius - ((j / this._pSegmentsH) * (this._topRadius - this._pBottomRadius)); - z = this._height * (j / this._pSegmentsH - 0.5); - - for (i = 0; i <= this._pSegmentsW; ++i) { - // revolution vertex - revolutionAngle = i * revolutionAngleDelta; - x = radius * Math.cos(revolutionAngle); - y = radius * Math.sin(revolutionAngle); - - if (this._yUp) { - comp1 = -z; - comp2 = y; - } else { - comp1 = y; - comp2 = z; - } - - if (i > 0) { - endPositions[vidx] = x; - endPositions[vidx + 1] = comp1; - endPositions[vidx + 2] = comp2; - - thickness[fidx++] = 1; - - vidx += 3; - - //vertical lines - startPositions[vidx] = endPositions[vidx - this._pSegmentsW * 6]; - startPositions[vidx + 1] = endPositions[vidx + 1 - this._pSegmentsW * 6]; - startPositions[vidx + 2] = endPositions[vidx + 2 - this._pSegmentsW * 6]; - - endPositions[vidx] = x; - endPositions[vidx + 1] = comp1; - endPositions[vidx + 2] = comp2; - - thickness[fidx++] = 1; - - vidx += 3; - } - - if (i < this._pSegmentsW) { - startPositions[vidx] = x; - startPositions[vidx + 1] = comp1; - startPositions[vidx + 2] = comp2; - } - } - } - - // build real data from raw data - lineGeometry.updatePositions(startPositions, endPositions); - lineGeometry.updateThickness(thickness); - } - }; - - /** - * @inheritDoc - */ - PrimitiveCylinderPrefab.prototype._pBuildUVs = function (target, geometryType) { - var i; - var j; - var x; - var y; - var revolutionAngle; - var uvs; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - // need to initialize raw array or can be reused? - if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(this._numVertices * 2); - } - - // evaluate revolution steps - var revolutionAngleDelta = 2 * Math.PI / this._pSegmentsW; - - // current uv component index - var index = 0; - - // top - if (this._topClosed) { - for (i = 0; i <= this._pSegmentsW; ++i) { - revolutionAngle = i * revolutionAngleDelta; - x = 0.5 + 0.5 * -Math.cos(revolutionAngle); - y = 0.5 + 0.5 * Math.sin(revolutionAngle); - - uvs[index++] = 0.5 * triangleGeometry.scaleU; // central vertex - uvs[index++] = 0.5 * triangleGeometry.scaleV; - - uvs[index++] = x * triangleGeometry.scaleU; // revolution vertex - uvs[index++] = y * triangleGeometry.scaleV; - } - } - - // bottom - if (this._bottomClosed) { - for (i = 0; i <= this._pSegmentsW; ++i) { - revolutionAngle = i * revolutionAngleDelta; - x = 0.5 + 0.5 * Math.cos(revolutionAngle); - y = 0.5 + 0.5 * Math.sin(revolutionAngle); - - uvs[index++] = 0.5 * triangleGeometry.scaleU; // central vertex - uvs[index++] = 0.5 * triangleGeometry.scaleV; - - uvs[index++] = x * triangleGeometry.scaleU; // revolution vertex - uvs[index++] = y * triangleGeometry.scaleV; - } - } - - // lateral surface - if (this._surfaceClosed) { - for (j = 0; j <= this._pSegmentsH; ++j) { - for (i = 0; i <= this._pSegmentsW; ++i) { - // revolution vertex - uvs[index++] = (i / this._pSegmentsW) * triangleGeometry.scaleU; - uvs[index++] = (j / this._pSegmentsH) * triangleGeometry.scaleV; - } - } - } - - // build real data from raw data - triangleGeometry.updateUVs(uvs); - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - }; - return PrimitiveCylinderPrefab; - })(prefabs.PrimitivePrefabBase); - prefabs.PrimitiveCylinderPrefab = PrimitiveCylinderPrefab; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - /** - * A UV Cone primitive mesh. - */ - var PrimitiveConePrefab = (function (_super) { - __extends(PrimitiveConePrefab, _super); - /** - * Creates a new Cone object. - * @param radius The radius of the bottom end of the cone - * @param height The height of the cone - * @param segmentsW Defines the number of horizontal segments that make up the cone. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the cone. Defaults to 1. - * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - function PrimitiveConePrefab(radius, height, segmentsW, segmentsH, closed, yUp) { - if (typeof radius === "undefined") { radius = 50; } - if (typeof height === "undefined") { height = 100; } - if (typeof segmentsW === "undefined") { segmentsW = 16; } - if (typeof segmentsH === "undefined") { segmentsH = 1; } - if (typeof closed === "undefined") { closed = true; } - if (typeof yUp === "undefined") { yUp = true; } - _super.call(this, 0, radius, height, segmentsW, segmentsH, false, closed, true, yUp); - } - Object.defineProperty(PrimitiveConePrefab.prototype, "radius", { - /** - * The radius of the bottom end of the cone. - */ - get: function () { - return this._pBottomRadius; - }, - set: function (value) { - this._pBottomRadius = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - return PrimitiveConePrefab; - })(prefabs.PrimitiveCylinderPrefab); - prefabs.PrimitiveConePrefab = PrimitiveConePrefab; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - /** - * A UV RegularPolygon primitive mesh. - */ - var PrimitivePolygonPrefab = (function (_super) { - __extends(PrimitivePolygonPrefab, _super); - /** - * Creates a new RegularPolygon disc object. - * @param radius The radius of the regular polygon - * @param sides Defines the number of sides of the regular polygon. - * @param yUp Defines whether the regular polygon should lay on the Y-axis (true) or on the Z-axis (false). - */ - function PrimitivePolygonPrefab(radius, sides, yUp) { - if (typeof radius === "undefined") { radius = 100; } - if (typeof sides === "undefined") { sides = 16; } - if (typeof yUp === "undefined") { yUp = true; } - _super.call(this, radius, 0, 0, sides, 1, true, false, false, yUp); - } - Object.defineProperty(PrimitivePolygonPrefab.prototype, "radius", { - /** - * The radius of the regular polygon. - */ - get: function () { - return this._pBottomRadius; - }, - set: function (value) { - this._pBottomRadius = value; - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitivePolygonPrefab.prototype, "sides", { - /** - * The number of sides of the regular polygon. - */ - get: function () { - return this._pSegmentsW; - }, - set: function (value) { - this.setSegmentsW(value); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitivePolygonPrefab.prototype, "subdivisions", { - /** - * The number of subdivisions from the edge to the center of the regular polygon. - */ - get: function () { - return this._pSegmentsH; - }, - set: function (value) { - this.setSegmentsH(value); - }, - enumerable: true, - configurable: true - }); - - return PrimitivePolygonPrefab; - })(prefabs.PrimitiveCylinderPrefab); - prefabs.PrimitivePolygonPrefab = PrimitivePolygonPrefab; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (prefabs) { - /** - * A UV Sphere primitive mesh. - */ - var PrimitiveSpherePrefab = (function (_super) { - __extends(PrimitiveSpherePrefab, _super); - /** - * Creates a new Sphere object. - * - * @param radius The radius of the sphere. - * @param segmentsW Defines the number of horizontal segments that make up the sphere. - * @param segmentsH Defines the number of vertical segments that make up the sphere. - * @param yUp Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - function PrimitiveSpherePrefab(radius, segmentsW, segmentsH, yUp) { - if (typeof radius === "undefined") { radius = 50; } - if (typeof segmentsW === "undefined") { segmentsW = 16; } - if (typeof segmentsH === "undefined") { segmentsH = 12; } - if (typeof yUp === "undefined") { yUp = true; } - _super.call(this); - - this._radius = radius; - this._segmentsW = segmentsW; - this._segmentsH = segmentsH; - this._yUp = yUp; - } - Object.defineProperty(PrimitiveSpherePrefab.prototype, "radius", { - /** - * The radius of the sphere. - */ - get: function () { - return this._radius; - }, - set: function (value) { - this._radius = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveSpherePrefab.prototype, "segmentsW", { - /** - * Defines the number of horizontal segments that make up the sphere. Defaults to 16. - */ - get: function () { - return this._segmentsW; - }, - set: function (value) { - this._segmentsW = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveSpherePrefab.prototype, "segmentsH", { - /** - * Defines the number of vertical segments that make up the sphere. Defaults to 12. - */ - get: function () { - return this._segmentsH; - }, - set: function (value) { - this._segmentsH = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - }, - enumerable: true, - configurable: true - }); - - - Object.defineProperty(PrimitiveSpherePrefab.prototype, "yUp", { - /** - * Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - get: function () { - return this._yUp; - }, - set: function (value) { - this._yUp = value; - - this._pInvalidateGeometry(); - }, - enumerable: true, - configurable: true - }); - - - /** - * @inheritDoc - */ - PrimitiveSpherePrefab.prototype._pBuildGeometry = function (target, geometryType) { - var indices; - var positions; - var normals; - var tangents; - - var i; - var j; - var vidx, fidx; - - var comp1; - var comp2; - var numVertices; - - if (geometryType == "triangleSubGeometry") { - var triangleGeometry = target; - - numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); - - if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array((this._segmentsH - 1) * this._segmentsW * 6); - positions = new Array(numVertices * 3); - normals = new Array(numVertices * 3); - tangents = new Array(numVertices * 3); - - this._pInvalidateUVs(); - } - - vidx = 0; - fidx = 0; - - var startIndex; - var t1; - var t2; - - for (j = 0; j <= this._segmentsH; ++j) { - startIndex = vidx; - - var horangle = Math.PI * j / this._segmentsH; - var z = -this._radius * Math.cos(horangle); - var ringradius = this._radius * Math.sin(horangle); - - for (i = 0; i <= this._segmentsW; ++i) { - var verangle = 2 * Math.PI * i / this._segmentsW; - var x = ringradius * Math.cos(verangle); - var y = ringradius * Math.sin(verangle); - var normLen = 1 / Math.sqrt(x * x + y * y + z * z); - var tanLen = Math.sqrt(y * y + x * x); - - if (this._yUp) { - t1 = 0; - t2 = tanLen > .007 ? x / tanLen : 0; - comp1 = -z; - comp2 = y; - } else { - t1 = tanLen > .007 ? x / tanLen : 0; - t2 = 0; - comp1 = y; - comp2 = z; - } - - if (i == this._segmentsW) { - positions[vidx] = positions[startIndex]; - positions[vidx + 1] = positions[startIndex + 1]; - positions[vidx + 2] = positions[startIndex + 2]; - normals[vidx] = normals[startIndex] + (x * normLen) * .5; - normals[vidx + 1] = normals[startIndex + 1] + (comp1 * normLen) * .5; - normals[vidx + 2] = normals[startIndex + 2] + (comp2 * normLen) * .5; - tangents[vidx] = tanLen > .007 ? -y / tanLen : 1; - tangents[vidx + 1] = t1; - tangents[vidx + 2] = t2; - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - normals[vidx] = x * normLen; - normals[vidx + 1] = comp1 * normLen; - normals[vidx + 2] = comp2 * normLen; - tangents[vidx] = tanLen > .007 ? -y / tanLen : 1; - tangents[vidx + 1] = t1; - tangents[vidx + 2] = t2; - } - - if (i > 0 && j > 0) { - var a = (this._segmentsW + 1) * j + i; - var b = (this._segmentsW + 1) * j + i - 1; - var c = (this._segmentsW + 1) * (j - 1) + i - 1; - var d = (this._segmentsW + 1) * (j - 1) + i; - - if (j == this._segmentsH) { - positions[vidx] = positions[startIndex]; - positions[vidx + 1] = positions[startIndex + 1]; - positions[vidx + 2] = positions[startIndex + 2]; - - indices[fidx++] = a; - indices[fidx++] = c; - indices[fidx++] = d; - } else if (j == 1) { - indices[fidx++] = a; - indices[fidx++] = b; - indices[fidx++] = c; - } else { - indices[fidx++] = a; - indices[fidx++] = b; - indices[fidx++] = c; - indices[fidx++] = a; - indices[fidx++] = c; - indices[fidx++] = d; - } - } - - vidx += 3; - } - } - - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - } else if (geometryType == "lineSubGeometry") { - var lineGeometry = target; - - var numSegments = (this._segmentsH - 1) * this._segmentsW * 2; - var startPositions; - var endPositions; - var thickness; - - if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { - startPositions = lineGeometry.startPositions; - endPositions = lineGeometry.endPositions; - thickness = lineGeometry.thickness; - } else { - startPositions = new Array(numSegments * 3); - endPositions = new Array(numSegments * 3); - thickness = new Array(numSegments); - } - - vidx = 0; - - fidx = 0; - - for (j = 0; j <= this._segmentsH; ++j) { - var horangle = Math.PI * j / this._segmentsH; - var z = -this._radius * Math.cos(horangle); - var ringradius = this._radius * Math.sin(horangle); - - for (i = 0; i <= this._segmentsW; ++i) { - var verangle = 2 * Math.PI * i / this._segmentsW; - var x = ringradius * Math.cos(verangle); - var y = ringradius * Math.sin(verangle); - - if (this._yUp) { - comp1 = -z; - comp2 = y; - } else { - comp1 = y; - comp2 = z; - } - - if (i > 0 && j > 0) { - //horizonal lines - if (j < this._segmentsH) { - endPositions[vidx] = x; - endPositions[vidx + 1] = comp1; - endPositions[vidx + 2] = comp2; - - thickness[fidx++] = 1; - - vidx += 3; - } - - //vertical lines - startPositions[vidx] = endPositions[vidx - this._segmentsW * 6]; - startPositions[vidx + 1] = endPositions[vidx + 1 - this._segmentsW * 6]; - startPositions[vidx + 2] = endPositions[vidx + 2 - this._segmentsW * 6]; - - endPositions[vidx] = x; - endPositions[vidx + 1] = comp1; - endPositions[vidx + 2] = comp2; - - thickness[fidx++] = 1; - - vidx += 3; - } - - if (i < this._segmentsW && j > 0 && j < this._segmentsH) { - startPositions[vidx] = x; - startPositions[vidx + 1] = comp1; - startPositions[vidx + 2] = comp2; - } - } - } - - // build real data from raw data - lineGeometry.updatePositions(startPositions, endPositions); - lineGeometry.updateThickness(thickness); - } - }; - - /** - * @inheritDoc - */ - PrimitiveSpherePrefab.prototype._pBuildUVs = function (target, geometryType) { - var i, j; - var numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); - var uvs; - - if (geometryType == "triangleSubGeometry") { - numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); - - var triangleGeometry = target; - - if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(numVertices * 2); - } - - var index = 0; - for (j = 0; j <= this._segmentsH; ++j) { - for (i = 0; i <= this._segmentsW; ++i) { - uvs[index++] = (i / this._segmentsW) * triangleGeometry.scaleU; - uvs[index++] = (j / this._segmentsH) * triangleGeometry.scaleV; - } - } - - triangleGeometry.updateUVs(uvs); - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - }; - return PrimitiveSpherePrefab; - })(prefabs.PrimitivePrefabBase); - prefabs.PrimitiveSpherePrefab = PrimitiveSpherePrefab; - })(away.prefabs || (away.prefabs = {})); - var prefabs = away.prefabs; -})(away || (away = {})); -/// -var away; -(function (away) { - (function (animators) { - var AssetType = away.library.AssetType; - - var NamedAssetBase = away.library.NamedAssetBase; - - /** - * Provides an abstract base class for nodes in an animation blend tree. - */ - var AnimationNodeBase = (function (_super) { - __extends(AnimationNodeBase, _super); - /** - * Creates a new AnimationNodeBase object. - */ - function AnimationNodeBase() { - _super.call(this); - } - Object.defineProperty(AnimationNodeBase.prototype, "stateClass", { - get: function () { - return this._pStateClass; - }, - enumerable: true, - configurable: true - }); - - /** - * @inheritDoc - */ - AnimationNodeBase.prototype.dispose = function () { - }; - - Object.defineProperty(AnimationNodeBase.prototype, "assetType", { - /** - * @inheritDoc - */ - get: function () { - return AssetType.ANIMATION_NODE; - }, - enumerable: true, - configurable: true - }); - return AnimationNodeBase; - })(NamedAssetBase); - animators.AnimationNodeBase = AnimationNodeBase; - })(away.animators || (away.animators = {})); - var animators = away.animators; -})(away || (away = {})); -/// -/// -var away; -(function (away) { - (function (animators) { - - })(away.animators || (away.animators = {})); - var animators = away.animators; -})(away || (away = {})); -/********************************************************************************************************************************************************************************************************** -* This file contains a reference to all the classes used in the project. -******************************************************************************************************************************************************************************************************** -* -* The TypeScript compiler exports classes in a non deterministic manner, as the extend functionality copies the prototype chain -* of one object onto another during initialisation and load (to create extensible functionality), the non deterministic nature of the -* compiler can result in an extend operation referencing a class that is undefined and not yet loaded - which throw an JavaScript error. -* -* This file provides the compiler with a strict order in which to export the TypeScript classes to mitigate undefined extend errors -* -* @see https://typescript.codeplex.com/workitem/1356 @see https://typescript.codeplex.com/workitem/913 -* -*********************************************************************************************************************************************************************************************************/ -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -away.Debug.THROW_ERRORS = false; -away.Debug.LOG_PI_ERRORS = false; - -var away; -(function (away) { - var AwayJSCore = (function (_super) { - __extends(AwayJSCore, _super); - function AwayJSCore() { - _super.call(this); - } - return AwayJSCore; - })(away.events.EventDispatcher); - away.AwayJSCore = AwayJSCore; -})(away || (away = {})); -//# sourceMappingURL=awayjs-core.next.js.map diff --git a/build/awayjs-core.next.js.map b/build/awayjs-core.next.js.map deleted file mode 100644 index 2160e2f0..00000000 --- a/build/awayjs-core.next.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"awayjs-core.next.js","sourceRoot":"","sources":["../src/away/errors/Error.ts","../src/away/errors/ArgumentError.ts","../src/away/errors/CastError.ts","../src/away/errors/PartialImplementationError.ts","../src/away/errors/AbstractMethodError.ts","../src/away/errors/DocumentError.ts","../src/away/errors/RangeError.ts","../src/away/events/Event.ts","../src/away/events/AssetEvent.ts","../src/away/events/CameraEvent.ts","../src/away/events/DisplayObjectEvent.ts","../src/away/events/EventDispatcher.ts","../src/away/events/GeometryEvent.ts","../src/away/events/HTTPStatusEvent.ts","../src/away/events/IEventDispatcher.ts","../src/away/events/IOErrorEvent.ts","../src/away/events/LightEvent.ts","../src/away/events/LoaderEvent.ts","../src/away/events/ParserEvent.ts","../src/away/events/MouseEvent.ts","../src/away/events/MaterialEvent.ts","../src/away/events/ProgressEvent.ts","../src/away/events/ProjectionEvent.ts","../src/away/events/RendererEvent.ts","../src/away/events/SceneEvent.ts","../src/away/events/StageEvent.ts","../src/away/events/SubGeometryEvent.ts","../src/away/events/TimerEvent.ts","../src/away/utils/ByteArrayBase.ts","../src/away/utils/ByteArray.ts","../src/away/utils/ByteArrayBuffer.ts","../src/away/utils/ColorUtils.ts","../src/away/utils/Cast.ts","../src/away/utils/CSS.ts","../src/away/utils/Debug.ts","../src/away/utils/Delegate.ts","../src/away/utils/getTimer.ts","../src/away/utils/RequestAnimationFrame.ts","../src/away/utils/TextureUtils.ts","../src/away/utils/Timer.ts","../src/away/core/geom/Box.ts","../src/away/core/geom/ColorTransform.ts","../src/away/core/geom/MathConsts.ts","../src/away/core/geom/Matrix.ts","../src/away/core/geom/Matrix3D.ts","../src/away/core/geom/Matrix3DUtils.ts","../src/away/core/geom/Orientation3D.ts","../src/away/core/geom/PerspectiveProjection.ts","../src/away/core/geom/Plane3D.ts","../src/away/core/geom/PlaneClassification.ts","../src/away/core/geom/Point.ts","../src/away/core/geom/PoissonLookup.ts","../src/away/core/geom/Quaternion.ts","../src/away/core/geom/Rectangle.ts","../src/away/core/geom/Transform.ts","../src/away/core/geom/UVTransform.ts","../src/away/core/geom/Vector3D.ts","../src/away/bounds/BoundingVolumeBase.ts","../src/away/bounds/NullBounds.ts","../src/away/bounds/BoundingSphere.ts","../src/away/bounds/AxisAlignedBoundingBox.ts","../src/away/core/net/URLRequest.ts","../src/away/core/net/URLLoaderDataFormat.ts","../src/away/core/net/URLRequestMethod.ts","../src/away/core/net/URLLoader.ts","../src/away/core/net/URLVariables.ts","../src/away/core/library/IAsset.ts","../src/away/core/library/NamedAssetBase.ts","../src/away/core/library/AssetType.ts","../src/away/core/display/ContextMode.ts","../src/away/core/display/IContext.ts","../src/away/core/base/BlendMode.ts","../src/away/core/base/AlignmentMode.ts","../src/away/core/base/OrientationMode.ts","../src/away/core/base/BitmapData.ts","../src/away/core/base/BitmapDataChannel.ts","../src/away/core/base/CapsStyle.ts","../src/away/core/base/DisplayObject.ts","../src/away/core/base/Geometry.ts","../src/away/core/base/GradientType.ts","../src/away/core/base/Graphics.ts","../src/away/core/base/GraphicsPathWinding.ts","../src/away/core/base/IBitmapDrawable.ts","../src/away/core/base/IGraphicsData.ts","../src/away/core/base/IMaterialOwner.ts","../src/away/core/base/InterpolationMethod.ts","../src/away/core/base/ISubMesh.ts","../src/away/core/base/ISubMeshClass.ts","../src/away/core/base/SubGeometryBase.ts","../src/away/core/base/SubMeshBase.ts","../src/away/core/base/JointStyle.ts","../src/away/core/base/LineScaleMode.ts","../src/away/core/base/LineSubGeometry.ts","../src/away/core/base/LineSubMesh.ts","../src/away/core/base/LoaderInfo.ts","../src/away/core/base/PixelSnapping.ts","../src/away/core/base/SpreadMethod.ts","../src/away/core/base/Stage.ts","../src/away/core/base/TriangleCulling.ts","../src/away/core/base/TriangleSubGeometry.ts","../src/away/core/base/TriangleSubMesh.ts","../src/away/textures/TextureProxyBase.ts","../src/away/textures/Texture2DBase.ts","../src/away/textures/CubeTextureBase.ts","../src/away/textures/ImageTexture.ts","../src/away/textures/BitmapTexture.ts","../src/away/textures/RenderTexture.ts","../src/away/textures/ImageCubeTexture.ts","../src/away/textures/BitmapCubeTexture.ts","../src/away/textures/MipmapGenerator.ts","../src/away/textures/SpecularBitmapTexture.ts","../src/away/parsers/ParserBase.ts","../src/away/parsers/CubeTextureParser.ts","../src/away/parsers/Texture2DParser.ts","../src/away/parsers/ParserDataFormat.ts","../src/away/parsers/ParserUtils.ts","../src/away/parsers/ResourceDependency.ts","../src/away/core/library/AssetLoaderContext.ts","../src/away/core/library/AssetLoader.ts","../src/away/core/library/AssetLoaderToken.ts","../src/away/core/library/IDUtil.ts","../src/away/core/library/AssetLibraryIterator.ts","../src/away/core/library/ConflictStrategyBase.ts","../src/away/core/library/NumSuffixConflictStrategy.ts","../src/away/core/library/IgnoreConflictStrategy.ts","../src/away/core/library/ErrorConflictStrategy.ts","../src/away/core/library/ConflictPrecedence.ts","../src/away/core/library/ConflictStrategy.ts","../src/away/core/library/AssetLibraryBundle.ts","../src/away/core/library/AssetLibrary.ts","../src/away/core/pool/EntityListItem.ts","../src/away/core/pool/EntityListItemPool.ts","../src/away/core/pool/IRenderable.ts","../src/away/core/pool/IRenderableClass.ts","../src/away/core/pool/IMaterialData.ts","../src/away/core/pool/IMaterialPassData.ts","../src/away/core/pool/ITextureData.ts","../src/away/core/pool/RenderablePool.ts","../src/away/core/pool/CSSRenderableBase.ts","../src/away/core/pool/CSSBillboardRenderable.ts","../src/away/core/pool/CSSLineSegmentRenderable.ts","../src/away/core/pool/CSSSkyboxRenderable.ts","../src/away/core/traverse/ICollector.ts","../src/away/core/traverse/CollectorBase.ts","../src/away/core/traverse/EntityCollector.ts","../src/away/core/traverse/RaycastCollector.ts","../src/away/core/traverse/CSSEntityCollector.ts","../src/away/core/traverse/ShadowCasterCollector.ts","../src/away/core/partition/NodeBase.ts","../src/away/core/partition/NullNode.ts","../src/away/core/partition/Partition.ts","../src/away/core/partition/EntityNode.ts","../src/away/core/partition/CameraNode.ts","../src/away/core/partition/DirectionalLightNode.ts","../src/away/core/partition/LightProbeNode.ts","../src/away/core/partition/PointLightNode.ts","../src/away/core/partition/SkyboxNode.ts","../src/away/core/pick/IPickingCollider.ts","../src/away/core/pick/IPicker.ts","../src/away/core/pick/PickingCollisionVO.ts","../src/away/core/pick/RaycastPicker.ts","../src/away/core/render/IRenderer.ts","../src/away/core/render/CSSRendererBase.ts","../src/away/core/render/CSSDefaultRenderer.ts","../src/away/core/sort/IEntitySorter.ts","../src/away/core/sort/RenderableMergeSort.ts","../src/away/core/text/AntiAliasType.ts","../src/away/core/text/GridFitType.ts","../src/away/core/text/TextFieldAutoSize.ts","../src/away/core/text/TextFieldType.ts","../src/away/core/text/TextFormat.ts","../src/away/core/text/TextFormatAlign.ts","../src/away/core/text/TextInteractionMode.ts","../src/away/core/text/TextLineMetrics.ts","../src/away/core/ui/Keyboard.ts","../src/away/containers/DisplayObjectContainer.ts","../src/away/core/base/LightBase.ts","../src/away/projections/CoordinateSystem.ts","../src/away/projections/IProjection.ts","../src/away/projections/ProjectionBase.ts","../src/away/projections/PerspectiveProjection.ts","../src/away/projections/FreeMatrixProjection.ts","../src/away/projections/OrthographicProjection.ts","../src/away/projections/OrthographicOffCenterProjection.ts","../src/away/projections/ObliqueNearPlaneProjection.ts","../src/away/entities/Camera.ts","../src/away/materials/shadowmappers/ShadowMapperBase.ts","../src/away/materials/shadowmappers/CubeMapShadowMapper.ts","../src/away/materials/shadowmappers/DirectionalShadowMapper.ts","../src/away/materials/shadowmappers/CascadeShadowMapper.ts","../src/away/materials/shadowmappers/NearDirectionalShadowMapper.ts","../src/away/entities/IEntity.ts","../src/away/entities/Billboard.ts","../src/away/entities/DirectionalLight.ts","../src/away/entities/LightProbe.ts","../src/away/entities/LineSegment.ts","../src/away/entities/Mesh.ts","../src/away/entities/PointLight.ts","../src/away/entities/Shape.ts","../src/away/entities/Skybox.ts","../src/away/entities/TextField.ts","../src/away/managers/MouseManager.ts","../src/away/managers/StageManager.ts","../src/away/containers/Loader.ts","../src/away/containers/Scene.ts","../src/away/containers/View.ts","../src/away/controllers/ControllerBase.ts","../src/away/controllers/LookAtController.ts","../src/away/controllers/HoverController.ts","../src/away/controllers/FirstPersonController.ts","../src/away/controllers/FollowController.ts","../src/away/controllers/SpringController.ts","../src/away/materials/lightpickers/LightPickerBase.ts","../src/away/materials/lightpickers/StaticLightPicker.ts","../src/away/materials/passes/IMaterialPass.ts","../src/away/materials/LightSources.ts","../src/away/materials/MaterialBase.ts","../src/away/materials/CSSMaterialBase.ts","../src/away/prefabs/PrefabBase.ts","../src/away/prefabs/PrimitivePrefabBase.ts","../src/away/prefabs/PrimitiveTorusPrefab.ts","../src/away/prefabs/PrimitiveCubePrefab.ts","../src/away/prefabs/PrimitivePlanePrefab.ts","../src/away/prefabs/PrimitiveCapsulePrefab.ts","../src/away/prefabs/PrimitiveCylinderPrefab.ts","../src/away/prefabs/PrimitiveConePrefab.ts","../src/away/prefabs/PrimitivePolygonPrefab.ts","../src/away/prefabs/PrimitiveSpherePrefab.ts","../src/away/animators/nodes/AnimationNodeBase.ts","../src/away/animators/IAnimationSet.ts","../src/away/animators/IAnimator.ts","../src/away/_definitions.ts","../src/AwayJSCore.ts"],"names":["away","away.errors","away.errors.Error","away.errors.Error.constructor","away.errors.ArgumentError","away.errors.ArgumentError.constructor","away.errors.CastError","away.errors.CastError.constructor","away.errors.PartialImplementationError","away.errors.PartialImplementationError.constructor","away.errors.AbstractMethodError","away.errors.AbstractMethodError.constructor","away.errors.DocumentError","away.errors.DocumentError.constructor","away.errors.RangeError","away.errors.RangeError.constructor","away.events","away.events.Event","away.events.Event.constructor","away.events.Event.clone","away.events.AssetEvent","away.events.AssetEvent.constructor","away.events.AssetEvent.clone","away.events.CameraEvent","away.events.CameraEvent.constructor","away.events.DisplayObjectEvent","away.events.DisplayObjectEvent.constructor","away.events.EventDispatcher","away.events.EventDispatcher.constructor","away.events.EventDispatcher.addEventListener","away.events.EventDispatcher.removeEventListener","away.events.EventDispatcher.dispatchEvent","away.events.EventDispatcher.getEventListenerIndex","away.events.EventDispatcher.hasEventListener","away.events.GeometryEvent","away.events.GeometryEvent.constructor","away.events.GeometryEvent.clone","away.events.HTTPStatusEvent","away.events.HTTPStatusEvent.constructor","away.events.IOErrorEvent","away.events.IOErrorEvent.constructor","away.events.LightEvent","away.events.LightEvent.constructor","away.events.LightEvent.clone","away.events.LoaderEvent","away.events.LoaderEvent.constructor","away.events.LoaderEvent.clone","away.events.ParserEvent","away.events.ParserEvent.constructor","away.events.ParserEvent.clone","away.events.MouseEvent","away.events.MouseEvent.constructor","away.events.MouseEvent.stopPropagation","away.events.MouseEvent.stopImmediatePropagation","away.events.MouseEvent.clone","away.events.MaterialEvent","away.events.MaterialEvent.constructor","away.events.ProgressEvent","away.events.ProgressEvent.constructor","away.events.ProjectionEvent","away.events.ProjectionEvent.constructor","away.events.RendererEvent","away.events.RendererEvent.constructor","away.events.SceneEvent","away.events.SceneEvent.constructor","away.events.StageEvent","away.events.StageEvent.constructor","away.events.SubGeometryEvent","away.events.SubGeometryEvent.constructor","away.events.SubGeometryEvent.clone","away.events.TimerEvent","away.events.TimerEvent.constructor","away.utils","away.utils.ByteArrayBase","away.utils.ByteArrayBase.constructor","away.utils.ByteArrayBase.writeByte","away.utils.ByteArrayBase.readByte","away.utils.ByteArrayBase.writeUnsignedByte","away.utils.ByteArrayBase.readUnsignedByte","away.utils.ByteArrayBase.writeUnsignedShort","away.utils.ByteArrayBase.readUnsignedShort","away.utils.ByteArrayBase.writeUnsignedInt","away.utils.ByteArrayBase.readUnsignedInt","away.utils.ByteArrayBase.writeFloat","away.utils.ByteArrayBase.toFloatBits","away.utils.ByteArrayBase.readFloat","away.utils.ByteArrayBase.fromFloatBits","away.utils.ByteArrayBase.getBytesAvailable","away.utils.ByteArrayBase.toString","away.utils.ByteArrayBase.compareEqual","away.utils.ByteArrayBase.writeBase64String","away.utils.ByteArrayBase.dumpToConsole","away.utils.ByteArrayBase.dumpToConsole.asHexString","away.utils.ByteArrayBase.readBase64String","away.utils.ByteArrayBase.internalGetBase64String","away.utils.ByteArray","away.utils.ByteArray.constructor","away.utils.ByteArray.ensureWriteableSpace","away.utils.ByteArray.setArrayBuffer","away.utils.ByteArray.getBytesAvailable","away.utils.ByteArray.ensureSpace","away.utils.ByteArray.writeByte","away.utils.ByteArray.readByte","away.utils.ByteArray.readBytes","away.utils.ByteArray.writeUnsignedByte","away.utils.ByteArray.readUnsignedByte","away.utils.ByteArray.writeUnsignedShort","away.utils.ByteArray.readUTFBytes","away.utils.ByteArray.readInt","away.utils.ByteArray.readShort","away.utils.ByteArray.readDouble","away.utils.ByteArray.readUnsignedShort","away.utils.ByteArray.writeUnsignedInt","away.utils.ByteArray.readUnsignedInt","away.utils.ByteArray.writeFloat","away.utils.ByteArray.readFloat","away.utils.ByteArrayBuffer","away.utils.ByteArrayBuffer.constructor","away.utils.ByteArrayBuffer.writeByte","away.utils.ByteArrayBuffer.readByte","away.utils.ByteArrayBuffer.writeUnsignedByte","away.utils.ByteArrayBuffer.readUnsignedByte","away.utils.ByteArrayBuffer.writeUnsignedShort","away.utils.ByteArrayBuffer.readUnsignedShort","away.utils.ByteArrayBuffer.writeUnsignedInt","away.utils.ByteArrayBuffer.readUnsignedInt","away.utils.ByteArrayBuffer.writeFloat","away.utils.ByteArrayBuffer.toFloatBits","away.utils.ByteArrayBuffer.readFloat","away.utils.ByteArrayBuffer.fromFloatBits","away.utils.ColorUtils","away.utils.ColorUtils.constructor","away.utils.ColorUtils.float32ColorToARGB","away.utils.ColorUtils.componentToHex","away.utils.ColorUtils.RGBToHexString","away.utils.ColorUtils.ARGBToHexString","away.utils.Cast","away.utils.Cast.constructor","away.utils.Cast.string","away.utils.Cast.byteArray","away.utils.Cast.isHex","away.utils.Cast.tryColor","away.utils.Cast.color","away.utils.Cast.tryClass","away.utils.Cast.bitmapData","away.utils.Cast.bitmapTexture","away.utils.CSS","away.utils.CSS.constructor","away.utils.CSS.setElementSize","away.utils.CSS.setElementWidth","away.utils.CSS.setElementHeight","away.utils.CSS.setElementX","away.utils.CSS.setElementY","away.utils.CSS.getElementVisibility","away.utils.CSS.setElementVisibility","away.utils.CSS.setElementAlpha","away.utils.CSS.setElementPosition","away.Debug","away.Debug.constructor","away.Debug.breakpoint","away.Debug.throwPIROnKeyWordOnly","away.Debug.throwPIR","away.Debug.logPIR","away.Debug.log","away.utils.Delegate","away.utils.Delegate.constructor","away.utils.Delegate.create","away.utils.Delegate.createDelegate","away.utils.getTimer","away.utils.RequestAnimationFrame","away.utils.RequestAnimationFrame.constructor","away.utils.RequestAnimationFrame.setCallback","away.utils.RequestAnimationFrame.start","away.utils.RequestAnimationFrame.stop","away.utils.RequestAnimationFrame._tick","away.utils.TextureUtils","away.utils.TextureUtils.constructor","away.utils.TextureUtils.isBitmapDataValid","away.utils.TextureUtils.isHTMLImageElementValid","away.utils.TextureUtils.isDimensionValid","away.utils.TextureUtils.isPowerOfTwo","away.utils.TextureUtils.getBestPowerOf2","away.utils.Timer","away.utils.Timer.constructor","away.utils.Timer.reset","away.utils.Timer.start","away.utils.Timer.stop","away.utils.Timer.tick","away.geom","away.geom.Box","away.geom.Box.constructor","away.geom.Box.clone","away.geom.Box.contains","away.geom.Box.containsPoint","away.geom.Box.containsRect","away.geom.Box.copyFrom","away.geom.Box.equals","away.geom.Box.inflate","away.geom.Box.inflatePoint","away.geom.Box.intersection","away.geom.Box.intersects","away.geom.Box.isEmpty","away.geom.Box.offset","away.geom.Box.offsetPosition","away.geom.Box.setEmpty","away.geom.Box.setTo","away.geom.Box.toString","away.geom.Box.union","away.geom.ColorTransform","away.geom.ColorTransform.constructor","away.geom.ColorTransform.concat","away.geom.MathConsts","away.geom.MathConsts.constructor","away.geom.Matrix","away.geom.Matrix.constructor","away.geom.Matrix.clone","away.geom.Matrix.concat","away.geom.Matrix.copyColumnFrom","away.geom.Matrix.copyColumnTo","away.geom.Matrix.copyFrom","away.geom.Matrix.copyRowFrom","away.geom.Matrix.copyRowTo","away.geom.Matrix.createBox","away.geom.Matrix.createGradientBox","away.geom.Matrix.deltaTransformPoint","away.geom.Matrix.identity","away.geom.Matrix.invert","away.geom.Matrix.multiply","away.geom.Matrix.rotate","away.geom.Matrix.scale","away.geom.Matrix.setTo","away.geom.Matrix.toString","away.geom.Matrix.transformPoint","away.geom.Matrix.translate","away.geom.Matrix3D","away.geom.Matrix3D.constructor","away.geom.Matrix3D.append","away.geom.Matrix3D.appendRotation","away.geom.Matrix3D.appendScale","away.geom.Matrix3D.appendTranslation","away.geom.Matrix3D.clone","away.geom.Matrix3D.copyColumnFrom","away.geom.Matrix3D.copyColumnTo","away.geom.Matrix3D.copyFrom","away.geom.Matrix3D.copyRawDataFrom","away.geom.Matrix3D.copyRawDataTo","away.geom.Matrix3D.copyRowFrom","away.geom.Matrix3D.copyRowTo","away.geom.Matrix3D.copyToMatrix3D","away.geom.Matrix3D.decompose","away.geom.Matrix3D.deltaTransformVector","away.geom.Matrix3D.identity","away.geom.Matrix3D.interpolate","away.geom.Matrix3D.interpolateTo","away.geom.Matrix3D.invert","away.geom.Matrix3D.prepend","away.geom.Matrix3D.prependRotation","away.geom.Matrix3D.prependScale","away.geom.Matrix3D.prependTranslation","away.geom.Matrix3D.recompose","away.geom.Matrix3D.transformVector","away.geom.Matrix3D.transformVectors","away.geom.Matrix3D.transpose","away.geom.Matrix3D.getAxisRotation","away.geom.Matrix3D.toFixed","away.geom.Matrix3D.toString","away.geom.Matrix3DUtils","away.geom.Matrix3DUtils.constructor","away.geom.Matrix3DUtils.quaternion2matrix","away.geom.Matrix3DUtils.getForward","away.geom.Matrix3DUtils.getUp","away.geom.Matrix3DUtils.getRight","away.geom.Matrix3DUtils.compare","away.geom.Matrix3DUtils.lookAt","away.geom.Matrix3DUtils.reflection","away.geom.Matrix3DUtils.transformVector","away.geom.Matrix3DUtils.deltaTransformVector","away.geom.Matrix3DUtils.getTranslation","away.geom.Matrix3DUtils.deltaTransformVectors","away.geom.Orientation3D","away.geom.Orientation3D.constructor","away.geom.PerspectiveProjection","away.geom.PerspectiveProjection.constructor","away.geom.PerspectiveProjection.toMatrix3D","away.geom.Plane3D","away.geom.Plane3D.constructor","away.geom.Plane3D.fromPoints","away.geom.Plane3D.fromNormalAndPoint","away.geom.Plane3D.normalize","away.geom.Plane3D.distance","away.geom.Plane3D.classifyPoint","away.geom.Plane3D.toString","away.geom.PlaneClassification","away.geom.PlaneClassification.constructor","away.geom.Point","away.geom.Point.constructor","away.geom.Point.add","away.geom.Point.clone","away.geom.Point.copyFrom","away.geom.Point.equals","away.geom.Point.normalize","away.geom.Point.offset","away.geom.Point.setTo","away.geom.Point.subtract","away.geom.Point.toString","away.geom.Point.distance","away.geom.Point.interpolate","away.geom.Point.polar","away.geom.PoissonLookup","away.geom.PoissonLookup.constructor","away.geom.PoissonLookup.initDistributions","away.geom.PoissonLookup.getDistribution","away.geom.Quaternion","away.geom.Quaternion.constructor","away.geom.Quaternion.multiply","away.geom.Quaternion.multiplyVector","away.geom.Quaternion.fromAxisAngle","away.geom.Quaternion.slerp","away.geom.Quaternion.lerp","away.geom.Quaternion.fromEulerAngles","away.geom.Quaternion.toEulerAngles","away.geom.Quaternion.normalize","away.geom.Quaternion.toString","away.geom.Quaternion.toMatrix3D","away.geom.Quaternion.fromMatrix","away.geom.Quaternion.toRawData","away.geom.Quaternion.clone","away.geom.Quaternion.rotatePoint","away.geom.Quaternion.copyFrom","away.geom.Rectangle","away.geom.Rectangle.constructor","away.geom.Rectangle.clone","away.geom.Rectangle.contains","away.geom.Rectangle.containsPoint","away.geom.Rectangle.containsRect","away.geom.Rectangle.copyFrom","away.geom.Rectangle.equals","away.geom.Rectangle.inflate","away.geom.Rectangle.inflatePoint","away.geom.Rectangle.intersection","away.geom.Rectangle.intersects","away.geom.Rectangle.isEmpty","away.geom.Rectangle.offset","away.geom.Rectangle.offsetPoint","away.geom.Rectangle.setEmpty","away.geom.Rectangle.setTo","away.geom.Rectangle.toString","away.geom.Rectangle.union","away.geom.Transform","away.geom.Transform.constructor","away.geom.Transform.getRelativeMatrix3D","away.geom.Transform.moveForward","away.geom.Transform.moveBackward","away.geom.Transform.moveLeft","away.geom.Transform.moveRight","away.geom.Transform.moveUp","away.geom.Transform.moveDown","away.geom.UVTransform","away.geom.UVTransform.constructor","away.geom.UVTransform.updateUVMatrix","away.geom.Vector3D","away.geom.Vector3D.constructor","away.geom.Vector3D.add","away.geom.Vector3D.angleBetween","away.geom.Vector3D.clone","away.geom.Vector3D.copyFrom","away.geom.Vector3D.crossProduct","away.geom.Vector3D.decrementBy","away.geom.Vector3D.distance","away.geom.Vector3D.dotProduct","away.geom.Vector3D.equals","away.geom.Vector3D.incrementBy","away.geom.Vector3D.nearEquals","away.geom.Vector3D.negate","away.geom.Vector3D.normalize","away.geom.Vector3D.project","away.geom.Vector3D.scaleBy","away.geom.Vector3D.setTo","away.geom.Vector3D.subtract","away.geom.Vector3D.toString","away.bounds","away.bounds.BoundingVolumeBase","away.bounds.BoundingVolumeBase.constructor","away.bounds.BoundingVolumeBase.nullify","away.bounds.BoundingVolumeBase.disposeRenderable","away.bounds.BoundingVolumeBase.fromVertices","away.bounds.BoundingVolumeBase.fromGeometry","away.bounds.BoundingVolumeBase.fromSphere","away.bounds.BoundingVolumeBase.fromExtremes","away.bounds.BoundingVolumeBase.isInFrustum","away.bounds.BoundingVolumeBase.overlaps","away.bounds.BoundingVolumeBase.clone","away.bounds.BoundingVolumeBase.rayIntersection","away.bounds.BoundingVolumeBase.containsPoint","away.bounds.BoundingVolumeBase.pUpdateAABBPoints","away.bounds.BoundingVolumeBase.pUpdateBoundingEntity","away.bounds.BoundingVolumeBase.pCreateBoundingEntity","away.bounds.BoundingVolumeBase.classifyToPlane","away.bounds.BoundingVolumeBase.transformFrom","away.bounds.NullBounds","away.bounds.NullBounds.constructor","away.bounds.NullBounds.clone","away.bounds.NullBounds.pCreateBoundingEntity","away.bounds.NullBounds.isInFrustum","away.bounds.NullBounds.fromSphere","away.bounds.NullBounds.fromExtremes","away.bounds.NullBounds.classifyToPlane","away.bounds.NullBounds.transformFrom","away.bounds.BoundingSphere","away.bounds.BoundingSphere.constructor","away.bounds.BoundingSphere.nullify","away.bounds.BoundingSphere.isInFrustum","away.bounds.BoundingSphere.fromSphere","away.bounds.BoundingSphere.fromExtremes","away.bounds.BoundingSphere.clone","away.bounds.BoundingSphere.rayIntersection","away.bounds.BoundingSphere.containsPoint","away.bounds.BoundingSphere.pUpdateBoundingEntity","away.bounds.BoundingSphere.pCreateBoundingEntity","away.bounds.BoundingSphere.classifyToPlane","away.bounds.BoundingSphere.transformFrom","away.bounds.AxisAlignedBoundingBox","away.bounds.AxisAlignedBoundingBox.constructor","away.bounds.AxisAlignedBoundingBox.nullify","away.bounds.AxisAlignedBoundingBox.isInFrustum","away.bounds.AxisAlignedBoundingBox.rayIntersection","away.bounds.AxisAlignedBoundingBox.containsPoint","away.bounds.AxisAlignedBoundingBox.fromExtremes","away.bounds.AxisAlignedBoundingBox.clone","away.bounds.AxisAlignedBoundingBox.closestPointToPoint","away.bounds.AxisAlignedBoundingBox.pUpdateBoundingRenderable","away.bounds.AxisAlignedBoundingBox.pCreateBoundingEntity","away.bounds.AxisAlignedBoundingBox.classifyToPlane","away.bounds.AxisAlignedBoundingBox.transformFrom","away.net","away.net.URLRequest","away.net.URLRequest.constructor","away.net.URLRequest.dispose","away.net.URLLoaderDataFormat","away.net.URLLoaderDataFormat.constructor","away.net.URLRequestMethod","away.net.URLRequestMethod.constructor","away.net.URLLoader","away.net.URLLoader.constructor","away.net.URLLoader.load","away.net.URLLoader.close","away.net.URLLoader.dispose","away.net.URLLoader.setResponseType","away.net.URLLoader.getRequest","away.net.URLLoader.postRequest","away.net.URLLoader.handleXmlHttpRequestException","away.net.URLLoader.initXHR","away.net.URLLoader.disposeXHR","away.net.URLLoader.decodeURLVariables","away.net.URLLoader.onReadyStateChange","away.net.URLLoader.onLoadEnd","away.net.URLLoader.onTimeOut","away.net.URLLoader.onAbort","away.net.URLLoader.onProgress","away.net.URLLoader.onLoadStart","away.net.URLLoader.onLoadComplete","away.net.URLLoader.onLoadError","away.net.URLVariables","away.net.URLVariables.constructor","away.net.URLVariables.decode","away.net.URLVariables.toString","away.library","away.library.NamedAssetBase","away.library.NamedAssetBase.constructor","away.library.NamedAssetBase.dispose","away.library.NamedAssetBase.assetPathEquals","away.library.NamedAssetBase.resetAssetPath","away.library.NamedAssetBase.updateFullPath","away.library.AssetType","away.library.AssetType.constructor","away.display","away.display.ContextMode","away.display.ContextMode.constructor","away.base","away.base.BlendMode","away.base.BlendMode.constructor","away.base.AlignmentMode","away.base.AlignmentMode.constructor","away.base.OrientationMode","away.base.OrientationMode.constructor","away.base.BitmapData","away.base.BitmapData.constructor","away.base.BitmapData.dispose","away.base.BitmapData.lock","away.base.BitmapData.unlock","away.base.BitmapData.getPixel","away.base.BitmapData.setPixel","away.base.BitmapData.setPixels","away.base.BitmapData.setPixel32","away.base.BitmapData.setVector","away.base.BitmapData.drawImage","away.base.BitmapData._drawImage","away.base.BitmapData.copyPixels","away.base.BitmapData._copyPixels","away.base.BitmapData.fillRect","away.base.BitmapData.draw","away.base.BitmapData._draw","away.base.BitmapData.copyChannel","away.base.BitmapData.colorTransform","away.base.BitmapData.hexToRGBACSS","away.base.BitmapDataChannel","away.base.BitmapDataChannel.constructor","away.base.CapsStyle","away.base.CapsStyle.constructor","away.base.DisplayObject","away.base.DisplayObject.constructor","away.base.DisplayObject.addEventListener","away.base.DisplayObject.clone","away.base.DisplayObject.dispose","away.base.DisplayObject.disposeAsset","away.base.DisplayObject.getBounds","away.base.DisplayObject.getRect","away.base.DisplayObject.globalToLocal","away.base.DisplayObject.globalToLocal3D","away.base.DisplayObject.hitTestObject","away.base.DisplayObject.hitTestPoint","away.base.DisplayObject.isIntersectingRay","away.base.DisplayObject.local3DToGlobal","away.base.DisplayObject.lookAt","away.base.DisplayObject.localToGlobal","away.base.DisplayObject.moveTo","away.base.DisplayObject.movePivot","away.base.DisplayObject.pitch","away.base.DisplayObject.getRenderSceneTransform","away.base.DisplayObject.roll","away.base.DisplayObject.rotate","away.base.DisplayObject.rotateTo","away.base.DisplayObject.removeEventListener","away.base.DisplayObject.translate","away.base.DisplayObject.translateLocal","away.base.DisplayObject.yaw","away.base.DisplayObject.iSetParent","away.base.DisplayObject.pCreateDefaultBoundingVolume","away.base.DisplayObject.pCreateEntityPartitionNode","away.base.DisplayObject.pInvalidateBounds","away.base.DisplayObject.pInvalidateSceneTransform","away.base.DisplayObject.pUpdateBounds","away.base.DisplayObject._pUpdateImplicitMouseEnabled","away.base.DisplayObject._pUpdateImplicitPartition","away.base.DisplayObject._pUpdateImplicitVisibility","away.base.DisplayObject._pUpdateMatrix3D","away.base.DisplayObject.pUpdateSceneTransform","away.base.DisplayObject._iAddRenderable","away.base.DisplayObject._iRemoveRenderable","away.base.DisplayObject._iTestCollision","away.base.DisplayObject._iInternalUpdate","away.base.DisplayObject._iIsVisible","away.base.DisplayObject._iIsMouseEnabled","away.base.DisplayObject._iSetScene","away.base.DisplayObject._pUpdateScene","away.base.DisplayObject.notifyPositionChanged","away.base.DisplayObject.notifyRotationChanged","away.base.DisplayObject.notifyScaleChanged","away.base.DisplayObject.notifySceneChange","away.base.DisplayObject.notifySceneTransformChange","away.base.DisplayObject.invalidateMatrix3D","away.base.DisplayObject.invalidatePartition","away.base.DisplayObject.invalidatePivot","away.base.DisplayObject.invalidatePosition","away.base.DisplayObject.invalidateRotation","away.base.DisplayObject.invalidateScale","away.base.Geometry","away.base.Geometry.constructor","away.base.Geometry.getSubGeometries","away.base.Geometry.applyTransformation","away.base.Geometry.addSubGeometry","away.base.Geometry.removeSubGeometry","away.base.Geometry.clone","away.base.Geometry.scale","away.base.Geometry.dispose","away.base.Geometry.scaleUV","away.base.Geometry.iInvalidateBounds","away.base.GradientType","away.base.GradientType.constructor","away.base.Graphics","away.base.Graphics.constructor","away.base.Graphics.beginBitmapFill","away.base.Graphics.beginFill","away.base.Graphics.beginGradientFill","away.base.Graphics.clear","away.base.Graphics.copyFrom","away.base.Graphics.cubicCurveTo","away.base.Graphics.curveTo","away.base.Graphics.drawCircle","away.base.Graphics.drawEllipse","away.base.Graphics.drawGraphicsData","away.base.Graphics.drawPath","away.base.Graphics.drawRect","away.base.Graphics.drawRoundRect","away.base.Graphics.drawTriangles","away.base.Graphics.endFill","away.base.Graphics.lineBitmapStyle","away.base.Graphics.lineGradientStyle","away.base.Graphics.lineStyle","away.base.Graphics.lineTo","away.base.Graphics.moveTo","away.base.GraphicsPathWinding","away.base.GraphicsPathWinding.constructor","away.base.InterpolationMethod","away.base.InterpolationMethod.constructor","away.base.SubGeometryBase","away.base.SubGeometryBase.constructor","away.base.SubGeometryBase._pUpdateStrideOffset","away.base.SubGeometryBase.getStride","away.base.SubGeometryBase.getOffset","away.base.SubGeometryBase.updateVertices","away.base.SubGeometryBase.dispose","away.base.SubGeometryBase.updateIndices","away.base.SubGeometryBase.pInvalidateBounds","away.base.SubGeometryBase.clone","away.base.SubGeometryBase.applyTransformation","away.base.SubGeometryBase.scale","away.base.SubGeometryBase.scaleUV","away.base.SubGeometryBase.getBoundingPositions","away.base.SubGeometryBase.notifyIndicesUpdate","away.base.SubGeometryBase._pNotifyVerticesUpdate","away.base.SubMeshBase","away.base.SubMeshBase.constructor","away.base.SubMeshBase.dispose","away.base.SubMeshBase.getRenderSceneTransform","away.base.SubMeshBase._iAddRenderable","away.base.SubMeshBase._iRemoveRenderable","away.base.SubMeshBase._iInvalidateRenderableGeometry","away.base.SubMeshBase._iCollectRenderable","away.base.SubMeshBase._iGetExplicitMaterial","away.base.JointStyle","away.base.JointStyle.constructor","away.base.LineScaleMode","away.base.LineScaleMode.constructor","away.base.LineSubGeometry","away.base.LineSubGeometry.constructor","away.base.LineSubGeometry._pUpdateStrideOffset","away.base.LineSubGeometry.getBoundingPositions","away.base.LineSubGeometry.updatePositions","away.base.LineSubGeometry.updateThickness","away.base.LineSubGeometry.updateColors","away.base.LineSubGeometry.dispose","away.base.LineSubGeometry.pInvalidateBounds","away.base.LineSubGeometry.clone","away.base.LineSubGeometry._pNotifyVerticesUpdate","away.base.LineSubGeometry.notifyPositionsUpdate","away.base.LineSubGeometry.notifyThicknessUpdate","away.base.LineSubGeometry.notifyColorsUpdate","away.base.LineSubMesh","away.base.LineSubMesh.constructor","away.base.LineSubMesh.dispose","away.base.LineSubMesh._iCollectRenderable","away.base.LoaderInfo","away.base.LoaderInfo.constructor","away.base.PixelSnapping","away.base.PixelSnapping.constructor","away.base.SpreadMethod","away.base.SpreadMethod.constructor","away.base.Stage","away.base.Stage.constructor","away.base.Stage.requestContext","away.base.Stage.notifyViewportUpdated","away.base.Stage.notifyEnterFrame","away.base.Stage.notifyExitFrame","away.base.Stage.dispose","away.base.Stage.configureBackBuffer","away.base.Stage.clear","away.base.Stage.addEventListener","away.base.Stage.removeEventListener","away.base.Stage.freeContext","away.base.Stage.onEnterFrame","away.base.Stage.recoverFromDisposal","away.base.Stage._callback","away.base.TriangleCulling","away.base.TriangleCulling.constructor","away.base.TriangleSubGeometry","away.base.TriangleSubGeometry.constructor","away.base.TriangleSubGeometry._pUpdateStrideOffset","away.base.TriangleSubGeometry.getBoundingPositions","away.base.TriangleSubGeometry.updatePositions","away.base.TriangleSubGeometry.updateVertexNormals","away.base.TriangleSubGeometry.updateVertexTangents","away.base.TriangleSubGeometry.updateUVs","away.base.TriangleSubGeometry.updateSecondaryUVs","away.base.TriangleSubGeometry.updateJointIndices","away.base.TriangleSubGeometry.updateJointWeights","away.base.TriangleSubGeometry.dispose","away.base.TriangleSubGeometry.updateIndices","away.base.TriangleSubGeometry.clone","away.base.TriangleSubGeometry.scaleUV","away.base.TriangleSubGeometry.scale","away.base.TriangleSubGeometry.applyTransformation","away.base.TriangleSubGeometry.updateFaceTangents","away.base.TriangleSubGeometry.updateFaceNormals","away.base.TriangleSubGeometry._pNotifyVerticesUpdate","away.base.TriangleSubGeometry.notifyPositionsUpdate","away.base.TriangleSubGeometry.notifyNormalsUpdate","away.base.TriangleSubGeometry.notifyTangentsUpdate","away.base.TriangleSubGeometry.notifyUVsUpdate","away.base.TriangleSubGeometry.notifySecondaryUVsUpdate","away.base.TriangleSubGeometry.notifyJointIndicesUpdate","away.base.TriangleSubGeometry.notifyJointWeightsUpdate","away.base.TriangleSubMesh","away.base.TriangleSubMesh.constructor","away.base.TriangleSubMesh.dispose","away.base.TriangleSubMesh._iCollectRenderable","away.textures","away.textures.TextureProxyBase","away.textures.TextureProxyBase.constructor","away.textures.TextureProxyBase.invalidateContent","away.textures.TextureProxyBase.invalidateSize","away.textures.TextureProxyBase.dispose","away.textures.TextureProxyBase._iAddTextureData","away.textures.TextureProxyBase._iRemoveTextureData","away.textures.Texture2DBase","away.textures.Texture2DBase.constructor","away.textures.Texture2DBase.dispose","away.textures.Texture2DBase.invalidateContent","away.textures.Texture2DBase._pSetSize","away.textures.Texture2DBase._iGetMipmapData","away.textures.Texture2DBase._iGetTextureData","away.textures.CubeTextureBase","away.textures.CubeTextureBase.constructor","away.textures.CubeTextureBase._pSetSize","away.textures.CubeTextureBase.dispose","away.textures.CubeTextureBase.invalidateContent","away.textures.CubeTextureBase._iGetMipmapData","away.textures.CubeTextureBase._iGetTextureData","away.textures.ImageTexture","away.textures.ImageTexture.constructor","away.textures.ImageTexture._iGetTextureData","away.textures.BitmapTexture","away.textures.BitmapTexture.constructor","away.textures.BitmapTexture.dispose","away.textures.BitmapTexture._iGetTextureData","away.textures.RenderTexture","away.textures.RenderTexture.constructor","away.textures.ImageCubeTexture","away.textures.ImageCubeTexture.constructor","away.textures.ImageCubeTexture._testSize","away.textures.ImageCubeTexture._iGetTextureData","away.textures.BitmapCubeTexture","away.textures.BitmapCubeTexture.constructor","away.textures.BitmapCubeTexture._testSize","away.textures.BitmapCubeTexture.dispose","away.textures.BitmapCubeTexture._iGetTextureData","away.textures.MipmapGenerator","away.textures.MipmapGenerator.constructor","away.textures.MipmapGenerator.generateMipMaps","away.textures.MipmapGenerator._getMipmapHolder","away.textures.MipmapGenerator.freeMipMapHolder","away.textures.SpecularBitmapTexture","away.textures.SpecularBitmapTexture.constructor","away.textures.SpecularBitmapTexture._testSize","away.textures.SpecularBitmapTexture._iGetTextureData","away.parsers","away.parsers.ParserBase","away.parsers.ParserBase.constructor","away.parsers.ParserBase.supportsType","away.parsers.ParserBase.isBitmapDataValid","away.parsers.ParserBase.parseAsync","away.parsers.ParserBase._iResolveDependency","away.parsers.ParserBase._iResolveDependencyFailure","away.parsers.ParserBase._iResolveDependencyName","away.parsers.ParserBase._iResumeParsingAfterDependencies","away.parsers.ParserBase._pFinalizeAsset","away.parsers.ParserBase._pProceedParsing","away.parsers.ParserBase._pDieWithError","away.parsers.ParserBase._pAddDependency","away.parsers.ParserBase._pPauseAndRetrieveDependencies","away.parsers.ParserBase._pHasTime","away.parsers.ParserBase._pOnInterval","away.parsers.ParserBase._pStartParsing","away.parsers.ParserBase._pFinishParsing","away.parsers.ParserBase._pGetTextData","away.parsers.ParserBase._pGetByteData","away.parsers.CubeTextureParser","away.parsers.CubeTextureParser.constructor","away.parsers.CubeTextureParser.supportsType","away.parsers.CubeTextureParser.supportsData","away.parsers.CubeTextureParser._iResolveDependency","away.parsers.CubeTextureParser._iResolveDependencyFailure","away.parsers.CubeTextureParser._pProceedParsing","away.parsers.CubeTextureParser._validateCubeData","away.parsers.CubeTextureParser._getHTMLImageElement","away.parsers.Texture2DParser","away.parsers.Texture2DParser.constructor","away.parsers.Texture2DParser.supportsType","away.parsers.Texture2DParser.supportsData","away.parsers.Texture2DParser._pProceedParsing","away.parsers.Texture2DParser.onLoadComplete","away.parsers.ParserDataFormat","away.parsers.ParserDataFormat.constructor","away.parsers.ParserUtils","away.parsers.ParserUtils.constructor","away.parsers.ParserUtils.arrayBufferToImage","away.parsers.ParserUtils.byteArrayToImage","away.parsers.ParserUtils.blobToImage","away.parsers.ParserUtils.toByteArray","away.parsers.ParserUtils.toString","away.parsers.ResourceDependency","away.parsers.ResourceDependency.constructor","away.parsers.ResourceDependency._iSetData","away.parsers.ResourceDependency._iSetParser","away.parsers.ResourceDependency.resolve","away.parsers.ResourceDependency.resolveFailure","away.parsers.ResourceDependency.resolveName","away.library.AssetLoaderContext","away.library.AssetLoaderContext.constructor","away.library.AssetLoaderContext.mapUrl","away.library.AssetLoaderContext.mapUrlToData","away.library.AssetLoaderContext._iHasDataForUrl","away.library.AssetLoaderContext._iGetDataForUrl","away.library.AssetLoaderContext._iHasMappingForUrl","away.library.AssetLoaderContext._iGetRemappedUrl","away.library.AssetLoader","away.library.AssetLoader.constructor","away.library.AssetLoader.enableParser","away.library.AssetLoader.enableParsers","away.library.AssetLoader.load","away.library.AssetLoader.loadData","away.library.AssetLoader.retrieveNext","away.library.AssetLoader.retrieveDependency","away.library.AssetLoader.joinUrl","away.library.AssetLoader.resolveDependencyUrl","away.library.AssetLoader.retrieveParserDependencies","away.library.AssetLoader.resolveParserDependencies","away.library.AssetLoader.onLoadError","away.library.AssetLoader.onParseError","away.library.AssetLoader.onAssetComplete","away.library.AssetLoader.onReadyForDependencies","away.library.AssetLoader.onLoadComplete","away.library.AssetLoader.onParseComplete","away.library.AssetLoader.onTextureSizeError","away.library.AssetLoader.addEventListeners","away.library.AssetLoader.removeEventListeners","away.library.AssetLoader.stop","away.library.AssetLoader.dispose","away.library.AssetLoader._iAddParseErrorHandler","away.library.AssetLoader._iAddErrorHandler","away.library.AssetLoader.getParserFromData","away.library.AssetLoader.parseDependency","away.library.AssetLoader.getParserFromSuffix","away.library.AssetLoaderToken","away.library.AssetLoaderToken.constructor","away.library.AssetLoaderToken.addEventListener","away.library.AssetLoaderToken.removeEventListener","away.library.AssetLoaderToken.hasEventListener","away.library.IDUtil","away.library.IDUtil.constructor","away.library.IDUtil.createUID","away.library.AssetLibraryIterator","away.library.AssetLibraryIterator.constructor","away.library.AssetLibraryIterator.next","away.library.AssetLibraryIterator.reset","away.library.AssetLibraryIterator.setIndex","away.library.AssetLibraryIterator.filter","away.library.ConflictStrategyBase","away.library.ConflictStrategyBase.constructor","away.library.ConflictStrategyBase.resolveConflict","away.library.ConflictStrategyBase.create","away.library.ConflictStrategyBase._pUpdateNames","away.library.NumSuffixConflictStrategy","away.library.NumSuffixConflictStrategy.constructor","away.library.NumSuffixConflictStrategy.resolveConflict","away.library.NumSuffixConflictStrategy.create","away.library.IgnoreConflictStrategy","away.library.IgnoreConflictStrategy.constructor","away.library.IgnoreConflictStrategy.resolveConflict","away.library.IgnoreConflictStrategy.create","away.library.ErrorConflictStrategy","away.library.ErrorConflictStrategy.constructor","away.library.ErrorConflictStrategy.resolveConflict","away.library.ErrorConflictStrategy.create","away.library.ConflictPrecedence","away.library.ConflictPrecedence.constructor","away.library.ConflictStrategy","away.library.ConflictStrategy.constructor","away.library.AssetLibraryBundle","away.library.AssetLibraryBundle.constructor","away.library.AssetLibraryBundle.getInstance","away.library.AssetLibraryBundle.enableParser","away.library.AssetLibraryBundle.enableParsers","away.library.AssetLibraryBundle.createIterator","away.library.AssetLibraryBundle.load","away.library.AssetLibraryBundle.loadData","away.library.AssetLibraryBundle.getAsset","away.library.AssetLibraryBundle.addAsset","away.library.AssetLibraryBundle.removeAsset","away.library.AssetLibraryBundle.removeAssetByName","away.library.AssetLibraryBundle.removeAllAssets","away.library.AssetLibraryBundle.removeNamespaceAssets","away.library.AssetLibraryBundle.removeAssetFromDict","away.library.AssetLibraryBundle.stopAllLoadingSessions","away.library.AssetLibraryBundle.rehashAssetDict","away.library.AssetLibraryBundle.onLoadError","away.library.AssetLibraryBundle.onParseError","away.library.AssetLibraryBundle.onAssetComplete","away.library.AssetLibraryBundle.onTextureSizeError","away.library.AssetLibraryBundle.onResourceComplete","away.library.AssetLibraryBundle.loadingSessionGC","away.library.AssetLibraryBundle.killLoadingSession","away.library.AssetLibraryBundle.onAssetRename","away.library.AssetLibraryBundle.onAssetConflictResolved","AssetLibraryBundleSingletonEnforcer","AssetLibraryBundleSingletonEnforcer.constructor","away.library.AssetLibrary","away.library.AssetLibrary.constructor","away.library.AssetLibrary.getBundle","away.library.AssetLibrary.enableParser","away.library.AssetLibrary.enableParsers","away.library.AssetLibrary.createIterator","away.library.AssetLibrary.load","away.library.AssetLibrary.loadData","away.library.AssetLibrary.stopLoad","away.library.AssetLibrary.getAsset","away.library.AssetLibrary.addEventListener","away.library.AssetLibrary.removeEventListener","away.library.AssetLibrary.addAsset","away.library.AssetLibrary.removeAsset","away.library.AssetLibrary.removeAssetByName","away.library.AssetLibrary.removeAllAssets","away.library.AssetLibrary.removeNamespaceAssets","AssetLibrarySingletonEnforcer","AssetLibrarySingletonEnforcer.constructor","away.pool","away.pool.EntityListItem","away.pool.EntityListItem.constructor","away.pool.EntityListItemPool","away.pool.EntityListItemPool.constructor","away.pool.EntityListItemPool.getItem","away.pool.EntityListItemPool.freeAll","away.pool.EntityListItemPool.dispose","away.pool.RenderablePool","away.pool.RenderablePool.constructor","away.pool.RenderablePool.getItem","away.pool.RenderablePool.disposeItem","away.pool.RenderablePool.getPool","away.pool.RenderablePool.disposePool","away.pool.CSSRenderableBase","away.pool.CSSRenderableBase.constructor","away.pool.CSSRenderableBase.dispose","away.pool.CSSRenderableBase.invalidateGeometry","away.pool.CSSRenderableBase.invalidateIndexData","away.pool.CSSRenderableBase.invalidateVertexData","away.pool.CSSBillboardRenderable","away.pool.CSSBillboardRenderable.constructor","away.pool.CSSLineSegmentRenderable","away.pool.CSSLineSegmentRenderable.constructor","away.pool.CSSSkyboxRenderable","away.pool.CSSSkyboxRenderable.constructor","away.traverse","away.traverse.CollectorBase","away.traverse.CollectorBase.constructor","away.traverse.CollectorBase.clear","away.traverse.CollectorBase.enterNode","away.traverse.CollectorBase.applyDirectionalLight","away.traverse.CollectorBase.applyEntity","away.traverse.CollectorBase.applyLightProbe","away.traverse.CollectorBase.applyPointLight","away.traverse.CollectorBase.applySkybox","away.traverse.EntityCollector","away.traverse.EntityCollector.constructor","away.traverse.EntityCollector.applyDirectionalLight","away.traverse.EntityCollector.applyLightProbe","away.traverse.EntityCollector.applyPointLight","away.traverse.EntityCollector.applySkybox","away.traverse.EntityCollector.clear","away.traverse.RaycastCollector","away.traverse.RaycastCollector.constructor","away.traverse.RaycastCollector.enterNode","away.traverse.CSSEntityCollector","away.traverse.CSSEntityCollector.constructor","away.traverse.ShadowCasterCollector","away.traverse.ShadowCasterCollector.constructor","away.traverse.ShadowCasterCollector.enterNode","away.partition","away.partition.NodeBase","away.partition.NodeBase.constructor","away.partition.NodeBase.isInFrustum","away.partition.NodeBase.isIntersectingRay","away.partition.NodeBase.isCastingShadow","away.partition.NodeBase.findPartitionForEntity","away.partition.NodeBase.acceptTraverser","away.partition.NodeBase._pCreateBoundsPrimitive","away.partition.NodeBase.iAddNode","away.partition.NodeBase.iRemoveNode","away.partition.NodeBase._iUpdateImplicitBoundsVisible","away.partition.NodeBase._iIsBoundsVisible","away.partition.NodeBase._iUpdateEntityBounds","away.partition.NullNode","away.partition.NullNode.constructor","away.partition.Partition","away.partition.Partition.constructor","away.partition.Partition.traverse","away.partition.Partition.iMarkForUpdate","away.partition.Partition.iRemoveEntity","away.partition.Partition.updateEntities","away.partition.EntityNode","away.partition.EntityNode.constructor","away.partition.EntityNode.removeFromParent","away.partition.EntityNode.isCastingShadow","away.partition.EntityNode.isInFrustum","away.partition.EntityNode.acceptTraverser","away.partition.EntityNode.isIntersectingRay","away.partition.EntityNode._pCreateBoundsPrimitive","away.partition.CameraNode","away.partition.CameraNode.constructor","away.partition.CameraNode.acceptTraverser","away.partition.DirectionalLightNode","away.partition.DirectionalLightNode.constructor","away.partition.DirectionalLightNode.acceptTraverser","away.partition.DirectionalLightNode.isCastingShadow","away.partition.LightProbeNode","away.partition.LightProbeNode.constructor","away.partition.LightProbeNode.acceptTraverser","away.partition.LightProbeNode.isCastingShadow","away.partition.PointLightNode","away.partition.PointLightNode.constructor","away.partition.PointLightNode.acceptTraverser","away.partition.PointLightNode.isCastingShadow","away.partition.SkyboxNode","away.partition.SkyboxNode.constructor","away.partition.SkyboxNode.acceptTraverser","away.partition.SkyboxNode.isInFrustum","away.pick","away.pick.PickingCollisionVO","away.pick.PickingCollisionVO.constructor","away.pick.RaycastPicker","away.pick.RaycastPicker.constructor","away.pick.RaycastPicker.getViewCollision","away.pick.RaycastPicker.getSceneCollision","away.pick.RaycastPicker.setIgnoreList","away.pick.RaycastPicker.isIgnored","away.pick.RaycastPicker.sortOnNearT","away.pick.RaycastPicker.getPickingCollisionVO","away.pick.RaycastPicker.updateLocalPosition","away.pick.RaycastPicker.dispose","away.render","away.render.CSSRendererBase","away.render.CSSRendererBase.constructor","away.render.CSSRendererBase.dispose","away.render.CSSRendererBase.render","away.render.CSSRendererBase._iRender","away.render.CSSRendererBase._iRenderCascades","away.render.CSSRendererBase.pCollectRenderables","away.render.CSSRendererBase.pExecuteRender","away.render.CSSRendererBase.pDraw","away.render.CSSRendererBase.applyBillboard","away.render.CSSRendererBase.applyLineSubMesh","away.render.CSSRendererBase.applySkybox","away.render.CSSRendererBase.applyTriangleSubMesh","away.render.CSSRendererBase._applyRenderable","away.render.CSSRendererBase.notifyScissorUpdate","away.render.CSSRendererBase.notifyViewportUpdate","away.render.CSSRendererBase.updateGlobalPos","away.render.CSSRendererBase._iCreateEntityCollector","away.render.CSSDefaultRenderer","away.render.CSSDefaultRenderer.constructor","away.render.CSSDefaultRenderer.render","away.render.CSSDefaultRenderer.pDraw","away.render.CSSDefaultRenderer.pUpdateBackBuffer","away.render.CSSDefaultRenderer.drawSkybox","away.render.CSSDefaultRenderer.drawRenderables","away.render.CSSDefaultRenderer.dispose","away.render.CSSDefaultRenderer._iCreateEntityCollector","away.sort","away.sort.RenderableMergeSort","away.sort.RenderableMergeSort.constructor","away.sort.RenderableMergeSort.sortBlendedRenderables","away.sort.RenderableMergeSort.sortOpaqueRenderables","away.text","away.text.AntiAliasType","away.text.AntiAliasType.constructor","away.text.GridFitType","away.text.GridFitType.constructor","away.text.TextFieldAutoSize","away.text.TextFieldAutoSize.constructor","away.text.TextFieldType","away.text.TextFieldType.constructor","away.text.TextFormat","away.text.TextFormat.constructor","away.text.TextFormatAlign","away.text.TextFormatAlign.constructor","away.text.TextInteractionMode","away.text.TextInteractionMode.constructor","away.text.TextLineMetrics","away.text.TextLineMetrics.constructor","away.ui","away.ui.Keyboard","away.ui.Keyboard.constructor","away.containers","away.containers.DisplayObjectContainer","away.containers.DisplayObjectContainer.constructor","away.containers.DisplayObjectContainer.addChild","away.containers.DisplayObjectContainer.addChildAt","away.containers.DisplayObjectContainer.addChildren","away.containers.DisplayObjectContainer.clone","away.containers.DisplayObjectContainer.contains","away.containers.DisplayObjectContainer.disposeWithChildren","away.containers.DisplayObjectContainer.getChildAt","away.containers.DisplayObjectContainer.getChildByName","away.containers.DisplayObjectContainer.getChildIndex","away.containers.DisplayObjectContainer.getObjectsUnderPoint","away.containers.DisplayObjectContainer.removeChild","away.containers.DisplayObjectContainer.removeChildAt","away.containers.DisplayObjectContainer.removeChildren","away.containers.DisplayObjectContainer.setChildIndex","away.containers.DisplayObjectContainer.swapChildren","away.containers.DisplayObjectContainer.swapChildrenAt","away.containers.DisplayObjectContainer.pInvalidateSceneTransform","away.containers.DisplayObjectContainer._pUpdateScene","away.containers.DisplayObjectContainer._pUpdateImplicitMouseEnabled","away.containers.DisplayObjectContainer._pUpdateImplicitVisibility","away.containers.DisplayObjectContainer._pUpdateImplicitPartition","away.containers.DisplayObjectContainer.removeChildInternal","away.base.LightBase","away.base.LightBase.constructor","away.base.LightBase.pCreateShadowMapper","away.base.LightBase.updateAmbient","away.base.LightBase.iGetObjectProjectionMatrix","away.base.LightBase.updateSpecular","away.base.LightBase.updateDiffuse","away.projections","away.projections.CoordinateSystem","away.projections.CoordinateSystem.constructor","away.projections.ProjectionBase","away.projections.ProjectionBase.constructor","away.projections.ProjectionBase.project","away.projections.ProjectionBase.unproject","away.projections.ProjectionBase.clone","away.projections.ProjectionBase.pInvalidateMatrix","away.projections.ProjectionBase.pUpdateMatrix","away.projections.ProjectionBase._iUpdateScissorRect","away.projections.ProjectionBase._iUpdateViewport","away.projections.PerspectiveProjection","away.projections.PerspectiveProjection.constructor","away.projections.PerspectiveProjection.unproject","away.projections.PerspectiveProjection.clone","away.projections.PerspectiveProjection.pUpdateMatrix","away.projections.FreeMatrixProjection","away.projections.FreeMatrixProjection.constructor","away.projections.FreeMatrixProjection.clone","away.projections.FreeMatrixProjection.pUpdateMatrix","away.projections.OrthographicProjection","away.projections.OrthographicProjection.constructor","away.projections.OrthographicProjection.unproject","away.projections.OrthographicProjection.clone","away.projections.OrthographicProjection.pUpdateMatrix","away.projections.OrthographicOffCenterProjection","away.projections.OrthographicOffCenterProjection.constructor","away.projections.OrthographicOffCenterProjection.unproject","away.projections.OrthographicOffCenterProjection.clone","away.projections.OrthographicOffCenterProjection.pUpdateMatrix","away.projections.ObliqueNearPlaneProjection","away.projections.ObliqueNearPlaneProjection.constructor","away.projections.ObliqueNearPlaneProjection.onProjectionMatrixChanged","away.projections.ObliqueNearPlaneProjection.pUpdateMatrix","away.entities","away.entities.Camera","away.entities.Camera.constructor","away.entities.Camera.pCreateDefaultBoundingVolume","away.entities.Camera.pCreateEntityPartitionNode","away.entities.Camera.onProjectionMatrixChanged","away.entities.Camera.updateFrustum","away.entities.Camera.pInvalidateSceneTransform","away.entities.Camera.pUpdateBounds","away.entities.Camera.getRay","away.entities.Camera.project","away.entities.Camera.unproject","away.entities.Camera._iCollectRenderables","away.entities.Camera._iCollectRenderable","away.materials","away.materials.ShadowMapperBase","away.materials.ShadowMapperBase.constructor","away.materials.ShadowMapperBase.pCreateCasterCollector","away.materials.ShadowMapperBase.updateShadows","away.materials.ShadowMapperBase.iSetDepthMap","away.materials.ShadowMapperBase.dispose","away.materials.ShadowMapperBase.pCreateDepthTexture","away.materials.ShadowMapperBase.iRenderDepthMap","away.materials.ShadowMapperBase.pUpdateDepthProjection","away.materials.ShadowMapperBase.pDrawDepthMap","away.materials.ShadowMapperBase._pSetDepthMapSize","away.materials.CubeMapShadowMapper","away.materials.CubeMapShadowMapper.constructor","away.materials.CubeMapShadowMapper.initCameras","away.materials.CubeMapShadowMapper.addCamera","away.materials.CubeMapShadowMapper.pCreateDepthTexture","away.materials.CubeMapShadowMapper.pUpdateDepthProjection","away.materials.CubeMapShadowMapper.pDrawDepthMap","away.materials.DirectionalShadowMapper","away.materials.DirectionalShadowMapper.constructor","away.materials.DirectionalShadowMapper.pDrawDepthMap","away.materials.DirectionalShadowMapper.pUpdateCullPlanes","away.materials.DirectionalShadowMapper.pUpdateDepthProjection","away.materials.DirectionalShadowMapper.pUpdateProjectionFromFrustumCorners","away.materials.CascadeShadowMapper","away.materials.CascadeShadowMapper.constructor","away.materials.CascadeShadowMapper.getSplitRatio","away.materials.CascadeShadowMapper.setSplitRatio","away.materials.CascadeShadowMapper.getDepthProjections","away.materials.CascadeShadowMapper.init","away.materials.CascadeShadowMapper._pSetDepthMapSize","away.materials.CascadeShadowMapper.invalidateScissorRects","away.materials.CascadeShadowMapper.pDrawDepthMap","away.materials.CascadeShadowMapper.updateScissorRects","away.materials.CascadeShadowMapper.pUpdateDepthProjection","away.materials.CascadeShadowMapper.updateProjectionPartition","away.materials.CascadeShadowMapper.addEventListener","away.materials.CascadeShadowMapper.removeEventListener","away.materials.CascadeShadowMapper.dispatchEvent","away.materials.CascadeShadowMapper.hasEventListener","away.materials.NearDirectionalShadowMapper","away.materials.NearDirectionalShadowMapper.constructor","away.materials.NearDirectionalShadowMapper.pUpdateDepthProjection","away.entities.Billboard","away.entities.Billboard.constructor","away.entities.Billboard.pCreateEntityPartitionNode","away.entities.Billboard.pUpdateBounds","away.entities.Billboard._iTestCollision","away.entities.Billboard.onSizeChanged","away.entities.Billboard._iCollectRenderables","away.entities.Billboard._iCollectRenderable","away.entities.DirectionalLight","away.entities.DirectionalLight.constructor","away.entities.DirectionalLight.pCreateDefaultBoundingVolume","away.entities.DirectionalLight.pUpdateBounds","away.entities.DirectionalLight.pUpdateSceneTransform","away.entities.DirectionalLight.pCreateShadowMapper","away.entities.DirectionalLight.pCreateEntityPartitionNode","away.entities.DirectionalLight.iGetObjectProjectionMatrix","away.entities.DirectionalLight._iCollectRenderables","away.entities.LightProbe","away.entities.LightProbe.constructor","away.entities.LightProbe.pCreateEntityPartitionNode","away.entities.LightProbe.pUpdateBounds","away.entities.LightProbe.pCreateDefaultBoundingVolume","away.entities.LightProbe.iGetObjectProjectionMatrix","away.entities.LightProbe._iCollectRenderables","away.entities.LineSegment","away.entities.LineSegment.constructor","away.entities.LineSegment.dispose","away.entities.LineSegment.pCreateEntityPartitionNode","away.entities.LineSegment.pUpdateBounds","away.entities.LineSegment.onSizeChanged","away.entities.LineSegment.notifyRenderableUpdate","away.entities.LineSegment._iCollectRenderables","away.entities.LineSegment._iCollectRenderable","away.entities.Mesh","away.entities.Mesh.constructor","away.entities.Mesh.bakeTransformations","away.entities.Mesh.dispose","away.entities.Mesh.disposeWithAnimatorAndChildren","away.entities.Mesh.clone","away.entities.Mesh.getSubMeshFromSubGeometry","away.entities.Mesh.pCreateEntityPartitionNode","away.entities.Mesh.pUpdateBounds","away.entities.Mesh.onGeometryBoundsInvalid","away.entities.Mesh.onSubGeometryAdded","away.entities.Mesh.onSubGeometryRemoved","away.entities.Mesh.addSubMesh","away.entities.Mesh._iTestCollision","away.entities.Mesh._iCollectRenderables","away.entities.Mesh._iInvalidateRenderableGeometries","away.entities.PointLight","away.entities.PointLight.constructor","away.entities.PointLight.pCreateShadowMapper","away.entities.PointLight.iFallOffFactor","away.entities.PointLight.pCreateEntityPartitionNode","away.entities.PointLight.pUpdateBounds","away.entities.PointLight.pCreateDefaultBoundingVolume","away.entities.PointLight.iGetObjectProjectionMatrix","away.entities.PointLight._iCollectRenderables","away.entities.Shape","away.entities.Shape.constructor","away.entities.Skybox","away.entities.Skybox.constructor","away.entities.Skybox.pInvalidateBounds","away.entities.Skybox.pCreateEntityPartitionNode","away.entities.Skybox.pCreateDefaultBoundingVolume","away.entities.Skybox.pUpdateBounds","away.entities.Skybox._iCollectRenderables","away.entities.Skybox._iCollectRenderable","away.entities.TextField","away.entities.TextField.constructor","away.entities.TextField.maxScrollH","away.entities.TextField.maxScrollV","away.entities.TextField.appendText","away.entities.TextField.getCharBoundaries","away.entities.TextField.getCharIndexAtPoint","away.entities.TextField.getFirstCharInParagraph","away.entities.TextField.getImageReference","away.entities.TextField.getLineIndexAtPoint","away.entities.TextField.getLineIndexOfChar","away.entities.TextField.getLineLength","away.entities.TextField.getLineMetrics","away.entities.TextField.getLineOffset","away.entities.TextField.getLineText","away.entities.TextField.getParagraphLength","away.entities.TextField.getTextFormat","away.entities.TextField.replaceSelectedText","away.entities.TextField.replaceText","away.entities.TextField.setSelection","away.entities.TextField.setTextFormat","away.entities.TextField.isFontCompatible","away.managers","away.managers.MouseManager","away.managers.MouseManager.constructor","away.managers.MouseManager.getInstance","away.managers.MouseManager.fireMouseEvents","away.managers.MouseManager.registerView","away.managers.MouseManager.unregisterView","away.managers.MouseManager.queueDispatch","away.managers.MouseManager.onMouseMove","away.managers.MouseManager.onMouseOut","away.managers.MouseManager.onMouseOver","away.managers.MouseManager.onClick","away.managers.MouseManager.onDoubleClick","away.managers.MouseManager.onMouseDown","away.managers.MouseManager.onMouseUp","away.managers.MouseManager.onMouseWheel","away.managers.MouseManager.updateColliders","away.managers.StageManager","away.managers.StageManager.constructor","away.managers.StageManager.getInstance","away.managers.StageManager.getStageAt","away.managers.StageManager.iRemoveStage","away.managers.StageManager.getFreeStage","away.managers.StageManager.onContextCreated","StageManagerSingletonEnforcer","StageManagerSingletonEnforcer.constructor","away.containers.Loader","away.containers.Loader.constructor","away.containers.Loader.close","away.containers.Loader.load","away.containers.Loader.loadData","away.containers.Loader.unload","away.containers.Loader.enableParser","away.containers.Loader.enableParsers","away.containers.Loader.removeListeners","away.containers.Loader.onAssetComplete","away.containers.Loader.onLoadError","away.containers.Loader.onParseError","away.containers.Loader.onResourceComplete","away.containers.Scene","away.containers.Scene.constructor","away.containers.Scene.traversePartitions","away.containers.Scene.contains","away.containers.Scene.addChild","away.containers.Scene.removeChild","away.containers.Scene.removeChildAt","away.containers.Scene.getChildAt","away.containers.Scene.iRegisterEntity","away.containers.Scene.iRegisterPartition","away.containers.Scene.iUnregisterEntity","away.containers.Scene.iUnregisterPartition","away.containers.View","away.containers.View.constructor","away.containers.View.onScenePartitionChanged","away.containers.View.render","away.containers.View.pUpdateTime","away.containers.View.dispose","away.containers.View.onProjectionChanged","away.containers.View.onViewportUpdated","away.containers.View.onScissorUpdated","away.containers.View.project","away.containers.View.unproject","away.containers.View.getRay","away.containers.View.updateCollider","away.controllers","away.controllers.ControllerBase","away.controllers.ControllerBase.constructor","away.controllers.ControllerBase.pNotifyUpdate","away.controllers.ControllerBase.update","away.controllers.LookAtController","away.controllers.LookAtController.constructor","away.controllers.LookAtController.update","away.controllers.LookAtController.onLookAtObjectChanged","away.controllers.HoverController","away.controllers.HoverController.constructor","away.controllers.HoverController.update","away.controllers.FirstPersonController","away.controllers.FirstPersonController.constructor","away.controllers.FirstPersonController.update","away.controllers.FirstPersonController.incrementWalk","away.controllers.FirstPersonController.incrementStrafe","away.controllers.FollowController","away.controllers.FollowController.constructor","away.controllers.FollowController.update","away.controllers.SpringController","away.controllers.SpringController.constructor","away.controllers.SpringController.update","away.materials.LightPickerBase","away.materials.LightPickerBase.constructor","away.materials.LightPickerBase.dispose","away.materials.LightPickerBase.collectLights","away.materials.LightPickerBase.updateProbeWeights","away.materials.StaticLightPicker","away.materials.StaticLightPicker.constructor","away.materials.StaticLightPicker.clearListeners","away.materials.StaticLightPicker.onCastShadowChange","away.materials.StaticLightPicker.updateDirectionalCasting","away.materials.StaticLightPicker.updatePointCasting","away.materials.LightSources","away.materials.LightSources.constructor","away.materials.MaterialBase","away.materials.MaterialBase.constructor","away.materials.MaterialBase.dispose","away.materials.MaterialBase._iActivatePass","away.materials.MaterialBase._iDeactivatePass","away.materials.MaterialBase._iRenderPass","away.materials.MaterialBase.iAddOwner","away.materials.MaterialBase.iRemoveOwner","away.materials.MaterialBase._iNumScreenPasses","away.materials.MaterialBase._pInvalidatePasses","away.materials.MaterialBase._pInvalidateScreenPasses","away.materials.MaterialBase._pRemoveScreenPass","away.materials.MaterialBase._pClearScreenPasses","away.materials.MaterialBase._pAddScreenPass","away.materials.MaterialBase._iAddMaterialData","away.materials.MaterialBase._iRemoveMaterialData","away.materials.MaterialBase._iUpdateMaterial","away.materials.MaterialBase.onPassChange","away.materials.MaterialBase.invalidateAnimation","away.materials.MaterialBase.invalidateMaterial","away.materials.MaterialBase.onLightsChange","away.materials.MaterialBase._iAddMaterialPassData","away.materials.MaterialBase._iRemoveMaterialPassData","away.materials.CSSMaterialBase","away.materials.CSSMaterialBase.constructor","away.materials.CSSMaterialBase.notifySizeChanged","away.prefabs","away.prefabs.PrefabBase","away.prefabs.PrefabBase.constructor","away.prefabs.PrefabBase.getNewObject","away.prefabs.PrefabBase._pCreateObject","away.prefabs.PrefabBase._iValidate","away.prefabs.PrimitivePrefabBase","away.prefabs.PrimitivePrefabBase.constructor","away.prefabs.PrimitivePrefabBase._pBuildGeometry","away.prefabs.PrimitivePrefabBase._pBuildUVs","away.prefabs.PrimitivePrefabBase.invalidateGeometryType","away.prefabs.PrimitivePrefabBase._pInvalidateGeometry","away.prefabs.PrimitivePrefabBase._pInvalidateUVs","away.prefabs.PrimitivePrefabBase.updateGeometryType","away.prefabs.PrimitivePrefabBase.updateGeometry","away.prefabs.PrimitivePrefabBase.updateUVs","away.prefabs.PrimitivePrefabBase._iValidate","away.prefabs.PrimitivePrefabBase._pCreateObject","away.prefabs.PrimitiveTorusPrefab","away.prefabs.PrimitiveTorusPrefab.constructor","away.prefabs.PrimitiveTorusPrefab._pBuildGeometry","away.prefabs.PrimitiveTorusPrefab._pBuildUVs","away.prefabs.PrimitiveCubePrefab","away.prefabs.PrimitiveCubePrefab.constructor","away.prefabs.PrimitiveCubePrefab._pBuildGeometry","away.prefabs.PrimitiveCubePrefab._pBuildUVs","away.prefabs.PrimitivePlanePrefab","away.prefabs.PrimitivePlanePrefab.constructor","away.prefabs.PrimitivePlanePrefab._pBuildGeometry","away.prefabs.PrimitivePlanePrefab._pBuildUVs","away.prefabs.PrimitiveCapsulePrefab","away.prefabs.PrimitiveCapsulePrefab.constructor","away.prefabs.PrimitiveCapsulePrefab._pBuildGeometry","away.prefabs.PrimitiveCapsulePrefab._pBuildUVs","away.prefabs.PrimitiveCylinderPrefab","away.prefabs.PrimitiveCylinderPrefab.constructor","away.prefabs.PrimitiveCylinderPrefab.setSegmentsW","away.prefabs.PrimitiveCylinderPrefab.setSegmentsH","away.prefabs.PrimitiveCylinderPrefab._pBuildGeometry","away.prefabs.PrimitiveCylinderPrefab._pBuildUVs","away.prefabs.PrimitiveConePrefab","away.prefabs.PrimitiveConePrefab.constructor","away.prefabs.PrimitivePolygonPrefab","away.prefabs.PrimitivePolygonPrefab.constructor","away.prefabs.PrimitiveSpherePrefab","away.prefabs.PrimitiveSpherePrefab.constructor","away.prefabs.PrimitiveSpherePrefab._pBuildGeometry","away.prefabs.PrimitiveSpherePrefab._pBuildUVs","away.animators","away.animators.AnimationNodeBase","away.animators.AnimationNodeBase.constructor","away.animators.AnimationNodeBase.dispose","away.AwayJSCore","away.AwayJSCore.constructor"],"mappings":"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GA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA;;gBAE99BA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAC/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAC/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAC/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;;gBAE/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAC/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAC/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAC/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;;gBAE/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAC/DA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAC/DA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA;gBAChEA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA,IAAIA,GAACA,IAAIA,GAAGA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EA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,CAACA,CAACA;gBAC5DA,KAAKA,CAACA,CAACA,GAAGA,IAAIA,CAACA,IAAIA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,EAAEA,CAACA,GAACA,EAAEA,CAACA,EAAEA,CAACA,CAACA;;gBAE9DA,IAAIA,EAAEA,CAACA,CAACA,CAACA,GAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,EAAEA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,EAAEA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAAGA,CAACA;oBAClHA,KAAKA,CAACA,CAACA,GAAGA,CAACA,KAAKA,CAACA,CAACA,CAACA;;gBAEpBA,EAAEA,CAACA,CAACA,CAACA,IAAIA,KAAKA,CAACA,CAACA;gBAChBA,EAAEA,CAACA,CAACA,CAACA,IAAIA,KAAKA,CAACA,CAACA;gBAChBA,EAAEA,CAACA,CAACA,CAACA,IAAIA,KAAKA,CAACA,CAACA;gBAChBA,EAAEA,CAACA,CAACA,CAACA,IAAIA,KAAKA,CAACA,CAACA;gBAChBA,EAAEA,CAACA,CAACA,CAACA,IAAIA,KAAKA,CAACA,CAACA;gBAChBA,EAAEA,CAACA,CAACA,CAACA,IAAIA,KAAKA,CAACA,CAACA;gBAChBA,EAAEA,CAACA,CAACA,CAACA,IAAIA,KAAKA,CAACA,CAACA;gBAChBA,EAAEA,CAACA,CAACA,CAACA,IAAIA,KAAKA,CAACA,CAACA;gBAChBA,EAAEA,CAACA,EAAEA,CAACA,IAAIA,KAAKA,CAACA,CAACA;;gBAEjBA,IAAIA,GAAGA,GAAGA,IAAIA,aAAQA,CAACA,CAACA;;gBAExBA,QAAQA,gBAAgBA,CAACA;oBACxBA,KAAKA,kBAAaA,CAACA,UAAUA;wBAE5BA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,IAAIA,CAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,CAACA;;wBAEjDA,IAAIA,GAAGA,GAAUA,IAAIA,CAACA,IAAIA,CAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,CAACA;wBAC/HA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,GAAGA;wBAC3BA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,GAAGA;wBAC3BA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,GAAGA;;wBAE3BA,KAAMA;AAAAA,oBACPA,KAAKA,kBAAaA,CAACA,UAAUA;wBAE5BA,IAAIA,EAAEA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,EAAEA,CAACA;;wBAE/BA,IAAIA,EAAEA,GAAGA,CAACA,CAAEA;4BACXA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAAGA,EAAEA,CAACA,GAACA,CAACA;;4BAE3BA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;yBACjCA,MAAMA,IAAIA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,IAAIA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,EAAEA,CAACA,CAACA,CAAEA;4BAC/CA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,EAAEA,CAACA,CAACA,GAACA,CAACA;;4BAE/CA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;yBACjCA,MAAMA,IAAIA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,EAAEA,CAACA,CAAEA;4BAC1BA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,EAAEA,CAACA,CAACA,GAACA,CAACA;;4BAE/CA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;yBACjCA,KAAMA;4BACNA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAAGA,EAAEA,CAACA,EAAEA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA;;4BAE/CA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA,GAACA,GAAGA,CAACA,CAACA,CAACA;yBACjCA;;wBAGDA,KAAMA;AAAAA,oBACPA,KAAKA,kBAAaA,CAACA,YAAYA;wBAE9BA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,IAAIA,CAACA,CAACA,EAAEA,CAACA,CAACA,CAACA,CAACA;;wBAEzBA,mCAAmCA;wBAEnCA,IAAIA,EAAEA,CAACA,CAACA,CAACA,IAAIA,CAACA,IAAIA,EAAEA,CAACA,CAACA,CAACA,IAAIA,CAACA,CAACA,CAAEA;4BAC9BA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,EAAEA,CAACA,CAACA,CAACA,EAAEA,EAAEA,CAACA,EAAEA,CAACA,CAACA;4BACjCA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,EAAEA,CAACA,CAACA,CAACA,EAAEA,EAAEA,CAACA,CAACA,CAACA,CAACA;yBAChCA,KAAMA;4BACNA,GAAGA,CAACA,CAACA,GAAGA,CAACA;4BACTA,GAAGA,CAACA,CAACA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,EAAEA,CAACA,CAACA,CAACA,EAAEA,EAAEA,CAACA,CAACA,CAACA,CAACA;yBAChCA;;wBAEDA,KAAMA;AAAAA,iBACPA;;gBAEDA,GAAGA,CAACA,IAAIA,CAACA,GAAGA,CAACA;gBACbA,GAAGA,CAACA,IAAIA,CAACA,GAAGA,CAACA;gBACbA,GAAGA,CAACA,IAAIA,CAACA,KAAKA,CAACA;;gBAEfA,OAAOA,GAAGA;YACXA,CAACA;;YAMDf;;;cADGA;sDACHA,UAA4BA,CAAUA;gBAErCgB,IAAIA,CAACA,GAAUA,CAACA,CAACA,CAACA;gBAClBA,IAAIA,CAACA,GAAUA,CAACA,CAACA,CAACA;gBAClBA,IAAIA,CAACA,GAAUA,CAACA,CAACA,CAACA;;gBAElBA,OAAOA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,EAAEA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,EAAEA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,CAACA,EAAEA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,CAACA,CAACA;YACpRA,CAACA;;YAKDhB;;cADGA;0CACHA;gBAECiB,IAAIA,CAACA,OAAOA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CA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBACjGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBAClGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBACjGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBAClGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBAClGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBACjGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBAClGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBACjGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBACjGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBAClGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBAClGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBACnGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBACnGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBAClGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;oBACnGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,GAAGA,GAAGA,GAACA,CAACA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA,CAACA,CAACA;iBAClGA;gBACDA,OAAOA,UAAUA;YAClBA,CAACA;;YAWDpB;;;;cALGA;YAEHA;;cAEGA;yCACHA,UAAeA,GAAYA;gBAE1BqB,IAAIA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,GAAGA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,GAAUA,I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UA,CAACA,CAACA,CAACA,CAACA,CAACA,EAAEA,UAAUA,CAACA,CAACA,CAACA,CAACA,CAACA,CAACA;;gBAEnEA,IAAIA,KAAKA;gBACTA,KAAKA,GAAGA,CAACA,UAAUA,CAACA,CAACA,CAACA,CAACA,CAACA;gBACxBA,IAAIA,CAACA,MAAMA,CAACA,IAAIA,QAAQA,CAACA,CAACA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAGA,CAACA,CAACA,CAACA,CAACA;gBACrIA,KAAKA,GAAGA,CAACA,UAAUA,CAACA,CAACA,CAACA,CAACA,CAACA;gBACxBA,IAAIA,CAACA,MAAMA,CAACA,IAAIA,QAAQA,CAACA,CAACA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,CAACA,CAACA,CAACA;gBACpIA,KAAKA,GAAGA,CAACA,UAAUA,CAACA,CAACA,CAACA,CAACA,CAACA;gBACxBA,IAAIA,CAACA,MAAMA,CAACA,IAAIA,QAAQA,CAACA,CAACA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,CAACA,CAACA,CAACA;;gBAEpIA,IAAIA,CAACA,QAAQA,GAAGA,UAAUA,CAACA,CAACA,CAACA;gBAC7BA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA;;gBAEpBA,OAAOA,IAAIA;YACZA,CAACA;;YAEDzB,qCAAAA,UAAuBA,CAAoBA;gBAE1C0B,IAAIA,CAACA,GAAUA,CAACA,CAACA,CAACA;gBAClBA,IAAIA,CAACA,GAAUA,CAACA,CAACA,CAACA;gBAClBA,IAAIA,CAACA,GAAUA,CAACA,CAACA,CAACA;;gBAElBA,OAAOA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,CAACA,EAAEA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,CAACA,EAAEA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,CAACA,EAAEA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,CAACA,CAACA;YAChWA,CAACA;;YAKD1B;;cADGA;kDACHA,UAAwBA,GAAYA,EAAEA,IAAaA;gBAGlD2B,qBAAqBA;gBAErBA,IAAIA,CAACA,GAAUA,CAACA;gBAChBA,IAAIA,CAACA,GAAUA,CAACA,EAAEA,CAACA,GAAUA,CAACA,EAAEA,CAACA,GAAUA,CAACA;;gBAE5CA,OAAOA,CAACA,GAAGA,CAACA,IAAIA,GAAGA,CAACA,MAAMA,CAAEA;oBAC3BA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA;oBACVA,CAACA,GAAGA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA;oBACdA,CAACA,GAAGA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA;oBACdA,IAAIA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA;oBACtFA,IAAIA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA;oBAC1FA,IAAIA,CAACA,CAACA,GAAGA,CAACA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AIA;gBAC1BA,IAAIA,GAAGA,CAACA,GAACA,CAACA,GAACA,CAACA;gBACZA,IAAIA,GAAGA,CAACA,GAACA,CAACA;gBACVA,CAACA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAAGA,IAAIA;gBAC1BA,CAACA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,GAAGA,IAAIA;;gBAE1BA,OAAOA,CAACA;YACTA,CAACA;;YAKD7B;gBAAAA;;kBADGA;qBACHA;oBAECA,OAAUA,CAACA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,CAACA,GAAGA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAAGA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAAGA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAAGA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAAGA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,CAACA,CAACA;gBACx1BA,CAACA;;;;AAAAA;YAMDA;gBAAAA;;;kBADGA;qBACHA;oBAECA,OAAOA,IAAIA,aAAQA,CAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,CAACA;gBAC1EA,CAACA;gBAEDA,KAAAA,UAAoBA,KAAcA;oBAEjCA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,KAAKA,CAACA,CAACA;oBAC1BA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,KAAKA,CAACA,CAACA;oBAC1BA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,KAAKA,CAACA,CAACA;gBAC3BA,CAACA;;;;AAPAA;;YASDA,6BAAAA,UAAeA,YAAmBA;gBAEjC8B,IAAIA,SAASA,GAAUA,IAAIA,CAACA,GAAGA,CAACA,EAAEA,EAAEA,YAAYA,CAACA;gBACjDA,OAAOA,WAAWA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,OAAOA,CAACA,EAAEA,CAACA,GAACA,SAASA,CAACA,GAACA,SAASA,GAAGA,GAAGA;YACz5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AACA,CAACA,GAACA,CAACA,GAACA,CAACA;gBACvBA,IAAIA,GAAGA,GAAUA,CAACA,CAACA,GAACA,CAACA,GAACA,CAACA;;gBACvBA,oBAAoBA;gBACpBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAACA,CAACA;gBACtBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,GAAGA;gBAChBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,GAAGA;gBAChBA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAACA,CAACA;gBACpBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,GAAGA;gBAChBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAACA,CAACA;gBACtBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,GAAGA;gBAChBA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAACA,CAACA;gBACpBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,GAAGA;gBAChBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,GAAGA;gBAChBA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAACA,CAACA;gBACvBA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,GAACA,CAACA;gBACpBA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA;gBACdA,OAAOA,CAACA,CAACA,CAACA,GAAGA,CAACA;gBACdA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA;gBACfA,OAAOA,CAACA,EAAEA,CAACA,GAAGA,CAACA;gBACfA,MAAMA,CAACA,eAAeA,CAACA,OAAOA,CAACA;;gBAE/BA,OAAOA,MAAMA;YACdA,CAACA;;YAGDR,gCAAAA,UAA8BA,MAAeA,EAAEA,MAAeA,EAAEA,MAAsBA;gBAAtBS,qCAAAA,MAAMA,GAAYA,IAAIA;AAAAA,gBAErFA,IAAIA,CAACA,MAAMA;oBACVA,MAAMA,GAAGA,IAAIA,aAAQA,CAACA,CAACA,CAACA;;gBAEzBA,IAAIA,GAAGA,GAAiBA,aAAaA,CAACA,kBAAkBA;gBACxDA,MAAMA,CAACA,aAAaA,CAACA,GAAGA,CAACA;gBACzBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;;gBAEtBA,IAAIA,CAACA,GAAUA,MAAMA,CAACA,CAACA;gBACvBA,IAAIA,CAACA,GAAUA,MAAMA,CAACA,CAACA;gBACvBA,IAAIA,CAACA,GAAUA,MAAMA,CAACA,CAACA;gBACvBA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;gBACpCA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;gBACpCA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;gBACpCA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;gBACpCA,OAAOA,MAAMA;YACdA,CAACA;;YAEDT,qCAAAA,UAAmCA,MAAeA,EAAEA,MAAeA,EAAEA,MAAsBA;gBAAtBU,qCAAAA,MAAMA,GAAYA,IAAIA;AAAAA,gBAE1FA,IAAIA,CAACA,MAAMA;oBACVA,MAAMA,GAAGA,IAAIA,aAAQA,CAACA,CAACA,CAACA;;gBAEzBA,IAAIA,GAAGA,GAAiBA,aAAaA,CAACA,kBAAkBA;gBACxDA,MAAMA,CAACA,aAAaA,CAACA,GAAGA,CAACA;gBACzBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,CAACA,GAAUA,MAAMA,CAACA,CAACA;gBACvBA,IAAIA,CAACA,GAAUA,MAAMA,CAACA,CAACA;gBACvBA,IAAIA,CAACA,GAAUA,MAAMA,CAACA,CAACA;gBACvBA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;gBAChCA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;gBAChCA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;gBAChCA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;gBAChCA,OAAOA,MAAMA;YACdA,CAACA;;YAEDV,+BAAAA,UAA6BA,SAAkBA,EAAEA,MAAsBA;gBAAtBW,qCAAAA,MAAMA,GAAYA,IAAIA;AAAAA,gBAEtEA,IAAGA,CAACA,MAAMA;oBACTA,MAAMA,GAAGA,IAAIA,aAAQA,CAACA,CAACA,CAACA;;gBAEzBA,SAASA,CAACA,YAAYA,CAACA,CAACA,EAAEA,MAAMA,CAACA;gBACjCA,OAAOA,MAAMA;YACdA,CAACA;;YAEDX,sCAAAA,UAAoCA,MAAeA,EAAEA,GAAiBA,EAAEA,IAAkBA;gBAEzFY,IAAIA,GAAGA,GAAiBA,aAAaA,CAACA,kBAAkBA;gBACxDA,MAAMA,CAACA,aAAaA,CAACA,GAAGA,CAACA;gBACzBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,CAACA,CAACA;gBACrBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,EAAEA,CAACA;gBACtBA,IAAIA,QAAQA,GAAUA,CAACA;gBACvBA,IAAIA,MAAMA,GAAUA,GAAGA,CAACA,MAAMA;gBAC9BA,KAAIA,IAAIA,KAAKA,GAAUA,CAACA,EAAEA,KAAKA,GAACA,MAAMA,EAAEA,KAAKA,IAAEA,CAACA,CAAEA;oBACjDA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,KAAKA,CAACA;oBACzBA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,KAAKA,GAACA,CAACA,CAACA;oBAC3BA,IAAIA,CAACA,GAAUA,GAAGA,CAACA,KAAKA,GAACA,CAACA,CAACA;oBAC3BA,IAAIA,CAACA,QAAQA,EAAEA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;oBACxCA,IAAIA,CAACA,QAAQA,EAAEA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;oBACxCA,IAAIA,CAACA,QAAQA,EAAEA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA,GAAGA,CAACA;iBACxCA;YACFA,CAACA;YA3SDZ,mCAA4CA,IAAIA,KAAKA,CAASA,EAAEA,CAACA;;YAGjEA,mCAA4CA,IAAIA,aAAQA,CAACA,CAACA;YAyS3DA,qBAACA;QAADA,CAACA,IAAA9E;QAjTDA,mCAiTCA;IACFA,CAACA,iCAAA5L;yBAAAA;AAADA,CAACA,uBAAA;AC3TD,4CAA4C;AAE5C,IAAO,IAAI;AAeV,CAfD,UAAO,IAAI;KAAXA,UAAYA,IAAIA;QAEf4L;;UAEGA;QACHA;YAAA2F;YAOAC,CAACA;AAAAD,YAJAA,2BAAkCA,WAAWA;YAC7CA,6BAAoCA,aAAaA;YACjDA,2BAAkCA,YAAYA;YAE/CA,qBAACA;QAADA,CAACA,IAAA3F;QAPDA,mCAOCA;IAGFA,CAACA,iCAAA5L;yBAAAA;AAADA,CAACA,uBAAA;ACjBD,4CAA4C;AA6D5C,IAAO,IAAI;AA8EV,CA9ED,UAAO,IAAI;IA3DXA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA0DGA;KACHA,UAAYA,IAAIA;QAEf4L;YAoDC6F;;cADGA;YACHA;YAGAC,CAACA;YAgBDD;;;;;;;;;;;;;;cADGA;yDACHA;gBAECE,OAAOA,IAAIA,CAACA,SAASA;YACtBA,CAACA;YACFF,6BAACA;QAADA,CAACA,IAAA7F;QA3EDA,mDA2ECA;IACFA,CAACA,iCAAA5L;yBAAAA;AAADA,CAACA,uBAAA;AC3ID,4CAA4C;AAE5C,IAAO,IAAI;AA+MV,CA/MD,UAAO,IAAI;KAAXA,UAAYA,IAAIA;QAGf4L;YAiCCgG;;cADGA;YACHA,iBAAYA,CAAYA,EAAEA,CAAYA,EAAEA,CAAYA,EAAEA,CAAYA;gBAAtDC,gCAAAA,CAACA,GAAUA,CAACA;AAAAA,gBAAEA,gCAAAA,CAACA,GAAUA,CAACA;AAAAA,gBAAEA,gCAAAA,CAACA,GAAUA,CAACA;AAAAA,gBAAEA,gCAAAA,CAACA,GAAUA,CAACA;AAAAA,gBAEjEA,IAAIA,CAACA,CAACA,GAAGA,CAACA;gBACVA,IAAIA,CAACA,CAACA,GAAGA,CAACA;gBACVA,IAAIA,CAACA,CAACA,GAAGA,CAACA;gBACVA,IAAIA,CAACA,CAACA,GAAGA,CAACA;;gBAEVA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,CAAEA;oBAErBA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,MAAMA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,CAAEA;oBAE5BA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,MAAMA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,CAAEA;oBAE5BA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,KAAMA;oBAENA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,SAASA;iBAEpCA;YAEFA,CAACA;YAQDD;;;;;cADGA;2CACHA,UAAkBA,EAAqBA,EAAEA,EAAqBA,EAAEA,EAAqBA;gBAEpFE,IAAIA,GAAGA,GAAUA,EAAEA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA;gBAC5BA,IAAIA,GAAGA,GAAUA,EAAEA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA;gBAC5BA,IAAIA,GAAGA,GAAUA,EAAEA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA;;gBAE5BA,IAAIA,GAAGA,GAAUA,EAAEA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA;gBAC5BA,IAAIA,GAAGA,GAAUA,EAAEA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA;gBAC5BA,IAAIA,GAAGA,GAAUA,EAAEA,CAACA,CAACA,GAAGA,EAAEA,CAACA,CAACA;;gBAE5BA,IAAIA,CAACA,CAACA,GAAGA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA;gBAC1BA,IAAIA,CAACA,CAACA,GAAGA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA;gBAC1BA,IAAIA,CAACA,CAACA,GAAGA,GAAGA,GAACA,GAAGA,GAAGA,GAAGA,GAACA,GAAGA;gBAC1BA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,EAAEA,CAACA,CAACA;;gBAEhDA,4FAA4FA;gBAC5FA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAAEA;oBAE/BA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,MAAMA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAAEA;oBAEtCA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,MAAMA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAAEA;oBAEtCA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,KAAMA;oBAENA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,SAASA;iBAEpCA;YAEFA,CAACA;;YAODF;;;;cADGA;mDACHA,UAA0BA,MAAyBA,EAAEA,KAAwBA;gBAE5EG,IAAIA,CAACA,CAACA,GAAGA,MAAMA,CAACA,CAACA;gBACjBA,IAAIA,CAACA,CAACA,GAAGA,MAAMA,CAACA,CAACA;gBACjBA,IAAIA,CAACA,CAACA,GAAGA,MAAMA,CAACA,CAACA;gBACjBA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,KAAKA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,KAAKA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,KAAKA,CAACA,CAACA;gBACzDA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAAEA;oBAE/BA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,MAAMA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAAEA;oBAEtCA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,MAAMA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAAEA;oBAEtCA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,aAAaA;iBAExCA,KAAMA;oBAENA,IAAIA,CAACA,WAAWA,GAAGA,OAAOA,CAACA,SAASA;iBAEpCA;YAEFA,CAACA;;YAMDH;;;cADGA;0CACHA;gBAECI,IAAIA,GAAGA,GAAUA,CAACA,GAACA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,CAACA;gBAC3EA,IAAIA,CAACA,CAACA,IAAIA,GAAGA;gBACbA,IAAIA,CAACA,CAACA,IAAIA,GAAGA;gBACbA,IAAIA,CAACA,CAACA,IAAIA,GAAGA;gBACbA,IAAIA,CAACA,CAACA,IAAIA,GAAGA;gBACbA,OAAOA,IAAIA;YACZA,CAACA;;YAODJ;;;;cADGA;yCACHA,UAAgBA,CAAoBA;gBAGnCK,IAAIA,IAAIA,CAACA,WAAWA,IAAIA,OAAOA,CAACA,aAAaA,CAAEA;oBAE9CA,OAAOA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA;iBAE1BA,MAAMA,IAAIA,IAAIA,CAACA,WAAWA,IAAIA,OAAOA,CAACA,aAAaA,CAAEA;oBACrDA,OAAOA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA;iBAC1BA,MAEIA,IAAIA,IAAIA,CAACA,WAAWA,IAAIA,OAAOA,CAACA,aAAaA,CAAEA;oBAEnDA,OAAOA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA;iBAE1BA,KAAMA;oBAENA,OAAOA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA;iBAEpDA;YAEFA,CAACA;;YAODL;;;;cADGA;8CACHA,UAAqBA,CAAoBA,EAAEA,OAAqBA;gBAArBM,sCAAAA,OAAOA,GAAUA,IAAIA;AAAAA,gBAE/DA,YAAYA;gBACZA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,IAAIA,CAACA,CAACA;oBACnBA,OAAOA,IAAIA,CAACA,IAAIA,CAACA,mBAAmBA,CAACA,KAAKA,CAACA;;gBAE5CA,IAAIA,GAAGA;gBACPA,IAAIA,IAAIA,CAACA,WAAWA,IAAIA,OAAOA,CAACA,aAAaA;oBAC5CA,GAAGA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA;qBAAOA,IAAIA,IAAIA,CAACA,WAAWA,IAAIA,OAAOA,CAACA,aAAaA;oBAC7EA,GAAGA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA;qBAAOA,IAAIA,IAAIA,CAACA,WAAWA,IAAIA,OAAOA,CAACA,aAAaA;oBAC7EA,GAAGA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA;;oBACzBA,GAAGA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,CAACA;;gBAErDA,IAAIA,GAAGA,GAAGA,CAACA,OAAOA;oBACjBA,OAAOA,IAAIA,CAACA,IAAIA,CAACA,mBAAmBA,CAACA,IAAIA;qBAAOA,IAAIA,GAAGA,GAAGA,OAAOA;oBACjEA,OAAOA,IAAIA,CAACA,IAAIA,CAACA,mBAAmBA,CAACA,KAAKA;;oBAC1CA,OAAOA,IAAIA,CAACA,IAAIA,CAACA,mBAAmBA,CAACA,SAASA,CAACA;YACjDA,CAACA;;YAEDN,6BAAAA;gBAECO,OAAOA,aAAaA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,MAAMA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,MAAMA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,MAAMA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,GAAGA;YAC1FA,CAACA;YAjLDP,oBAAiCA,CAACA;YAClCA,wBAAqCA,CAACA;YACtCA,wBAAqCA,CAACA;YACtCA,wBAAqCA,CAACA;YA+KvCA,eAACA;QAADA,CAACA,IAAAhG;QA3MDA,uBA2MCA;IACFA,CAACA,iCAAA5L;yBAAAA;AAADA,CAACA,uBAAA;AChND,IAAO,IAAI;AAcV,CAdD,UAAO,IAAI;IADXA,4CAA4CA;KAC5CA,UAAYA,IAAIA;QAGf4L;YAAAwG;YAUAC,CAACA;AAAAD,YAPAA,2BAA4BA,CAACA;YAC7BA,4BAA6BA,CAACA;;YAE9BA,yBAA0BA,CAACA;YAC3BA,0BAA2BA,CAACA;YAC5BA,gCAAiCA,CAACA;YAEnCA,2BAACA;QAADA,CAACA,IAAAxG;QAVDA,+CAUCA;IACFA,CAACA,iCAAA5L;yBAAAA;AAADA,CAACA,uBAAA;ACfD,4CAA4C;AAwB5C,IAAO,IAAI;AA+LV,CA/LD,UAAO,IAAI;IAtBXA;;;;;;;;;;;;;;;;;;;;;MAqBGA;KACHA,UAAYA,IAAIA;QAEf4L;YA2BC0G;;;;;;cADGA;YACHA,eAAYA,CAAYA,EAAEA,CAAYA;gBAA1BC,gCAAAA,CAACA,GAAUA,CAACA;AAAAA,gBAAEA,gCAAAA,CAACA,GAAUA,CAACA;AAAAA,gBAErCA,IAAIA,CAACA,CAACA,GAAGA,CAACA;gBACVA,IAAIA,CAACA,CAACA,GAAGA,CAACA;YACXA,CAACA;YAhBDD;gBAAAA;;kBADGA;qBACHA;oBAECA,OAAOA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,CAACA;gBAChDA,CAACA;;;;AAAAA;YAsBDA;;;;;;cADGA;kCACHA,UAAWA,CAAOA;gBAEjBE,OAAOA,IAAIA,KAAKA,CAACA,IAAIA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,EAAEA,IAAIA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,CAACA;YAC7CA,CAACA;;YAODF;;;;cADGA;oCACHA;gBAECG,OAAOA,IAAIA,KAAKA,CAACA,IAAIA,CAACA,CAACA,EAAEA,IAAIA,CAACA,CAACA,CAACA;YACjCA,CAACA;;YAEDH,2BAAAA,UAAgBA,WAAiBA;YAGjCI,CAACA;;YAUDJ;;;;;;;cADGA;qCACHA,UAAcA,SAAeA;gBAE5BK,OAAOA,CAACA,IAAIA,CAACA,CAACA,IAAIA,SAASA,CAACA,CAACA,IAAIA,IAAIA,CAACA,CAACA,IAAIA,SAASA,CAACA,CAACA,CAACA;YACxDA,CAACA;;YAUDL;;;;;;;cADGA;wCACHA,UAAiBA,SAAoBA;gBAApBM,wCAAAA,SAASA,GAAUA,CAACA;AAAAA,gBAEpCA,IAAIA,IAAIA,CAACA,MAAMA,IAAIA,CAACA,CAAEA;oBACrBA,IAAIA,SAASA,GAAGA,SAASA,GAACA,IAAIA,CAACA,MAAMA;oBACrCA,IAAIA,CAACA,CAACA,IAAIA,SAASA;oBACnBA,IAAIA,CAACA,CAACA,IAAIA,SAASA;oBACnBA,MAAOA;iBACPA;gBACDA,MAAMA,+BAA+BA;YACtCA,CAACA;;YAYDN;;;;;;;;;cADGA;qCACHA,UAAcA,EAASA,EAAEA,EAASA;gBAEjCO,IAAIA,CAACA,CAACA,IAAIA,EAAEA;gBACZA,IAAIA,CAACA,CAACA,IAAIA,EAAEA;YACbA,CAACA;;YAEDP,wBAAAA,UAAaA,EAASA,EAAEA,EAASA;YAGjCQ,CAACA;;YASDR;;;;;;cADGA;uCACHA,UAAgBA,CAAOA;gBAEtBS,OAAOA,IAAIA,KAAKA,CAACA,IAAIA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,EAAEA,IAAIA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,CAACA;YAC7CA,CAACA;;YAUDT;;;;;;;cADGA;uCACHA;gBAECU,OAAOA,aAAaA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,MAAMA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,GAAGA;YACtDA,CAACA;;YASDV;;;;;;cADGA;6BACHA,UAAuBA,GAASA,EAAEA,GAASA;gBAE1CW,IAAIA,EAAEA,GAAUA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA;gBAC7BA,IAAIA,EAAEA,GAAUA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA;;gBAE7BA,OAAOA,IAAIA,CAACA,IAAIA,CAACA,EAAEA,GAACA,EAAEA,GAAGA,EAAEA,GAACA,EAAEA,CAACA;YAChCA,CAACA;;YAqBDX;;;;;;;;;;;;;;;;;;cADGA;gCACHA,UAA0BA,GAASA,EAAEA,GAASA,EAAEA,CAAQA;gBAEvDY,OAAOA,IAAIA,KAAKA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAACA,CAACA,EAAEA,GAAGA,CAACA,CAACA,GAAGA,CAACA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAACA,CAACA,CAACA;YACvEA,CAACA;;YASDZ;;;;;;cADGA;0BACHA,UAAoBA,GAAUA,EAAEA,KAAYA;gBAE3Ca,OAAOA,IAAIA,KAAKA,CAACA,GAAGA,GAACA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,EAAEA,GAAGA,GAACA,IAAIA,CAACA,GAAGA,CAACA,KAAKA,CAACA,CAACA;YAC3DA,CAACA;YACFb,aAACA;QAADA,CAACA,IAAA1G;QA5LDA,mBA4LCA;IACFA,CAACA,iCAAA5L;yBAAAA;AAADA,CAACA,uBAAA;ACvND,4CAA4C;AAE5C,IAAO,IAAI;AAuDV,CAvDD,UAAO,IAAI;KAAXA,UAAYA,IAAIA;QAEf4L;YAAAwH;YAoDAC,CAACA;AAAAD,YAhDAA,kCAAAA;gBAECE,iCAAiCA;gBACjCA,IAAIA,CAACA,cAAcA,GAAGA,IAAIA,KAAKA,CAAgBA,CAACA;gBAChDA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,SAASA,CAACA;gBAChEA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,CAACA;gBACxFA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,YAAYA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,CAACA;gBAClHA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,SAASA,CAACA;gBACtIA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,UAAUA,CAACA;gBAC9JA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,UAAUA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,CAACA,UAAUA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,QAAQA,CAACA;gBACtLA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,UAAUA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,CAACA;gBAC5MA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,SAASA,EAAEA,CAACA,UAAUA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,WAAWA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,CAACA;gBACrOA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,UAAUA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,UAAUA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,QAAQA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,CAACA;gBAC3PA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,CAACA,UAAUA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA,SAASA,EAAEA,SAASA,EAAEA,CAACA,OAAOA,EAAEA,SAASA,EAAEA,SAASA,EAAEA,CAACA,SAASA,CAACA;gBAChRA,IAAIA,CAACA,cAAcA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,KAAKA,CAASA,SAASA,EAAEA,CAACA,SAASA,EAAEA,CAACA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A,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,CAACA,EAAEA,CAACA,GAAGA,CAACA,GAACA,CAACA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,CAACA,CAACA;gBAC/FA,MAAMA,CAACA,CAACA,GAAGA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,CAACA,CAACA;gBACvDA,MAAMA,CAACA,CAACA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,CAACA,EAAEA,CAACA,GAAGA,CAACA,GAACA,CAACA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,CAACA,CAACA;;gBAE/FA,OAAOA,MAAMA;YACdA,CAACA;;YAKDR;;cADGA;6CACHA,UAAiBA,GAAcA;gBAAdS,kCAAAA,GAAGA,GAAUA,CAACA;AAAAA,gBAE9BA,IAAIA,GAAGA,GAAUA,GAAGA,GAACA,IAAIA,CAACA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,IAAIA,CAACA,CAACA,CAACA;;gBAE7FA,IAAIA,CAACA,CAACA,IAAIA,GAAGA;gBACbA,IAAIA,CAACA,CAACA,IAAIA,GAAGA;gBACbA,IAAIA,CAACA,CAACA,IAAIA,GAAGA;gBACbA,IAAIA,CAACA,CAACA,IAAIA,GAAGA;YACdA,CAACA;;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AAOA,IAAIA,QAAQA,CAACA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,EAAEA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,EAAEA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,EAAEA,CAACA,CAACA;YAClGA,CAACA;;YAaDN;;;;;;;;;;cADGA;6CACHA,UAAmBA,CAAUA;gBAE5BO,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAACA,CAACA;gBACbA,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAACA,CAACA;gBACbA,IAAIA,CAACA,CAACA,IAAIA,CAACA,CAACA,CAACA;YACdA,CAACA;;YAYDP;;;;;;;;;cADGA;gCACHA,UAAgBA,GAAYA,EAAEA,GAAYA;gBAEzCQ,IAAIA,CAACA,GAAUA,CAACA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA;gBAC9BA,IAAIA,CAACA,GAAUA,CAACA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA;gBAC9BA,IAAIA,CAACA,GAAUA,CAACA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA;gBAC9BA,OAAOA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,CAACA;YAClCA,CAACA;;YA6BDR;;;;;;;;;;;;;;;;;;;;;;;;;;cADGA;4CACHA,UAAkBA,CAAUA;gBAE3BS,OAAOA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,CAACA,GAACA,CAACA,CAACA,CAACA;YAC5CA,CAACA;;YAqBDT;;;;;;;cAZGA;YA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AMA,CAACA;;gBAE3CA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,CAACA;gBACZA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,CAACA;gBACZA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,CAACA;gBACXA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,IAAIA,CAACA,KAAKA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,GAACA,CAACA;gBACtCA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,IAAIA,CAACA,KAAKA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,GAACA,CAACA;gBACtCA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,CAACA,IAAIA,CAACA,MAAMA,GAACA,CAACA;gBACxBA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,CAACA;gBACXA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,CAACA;gBACnFA,IAAIA,CAACA,QAAQA,CAACA,eAAeA,CAACA,GAAGA,CAACA;;gBAElCA,IAAIA,CAACA,gBAAgBA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,gBAAgBA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,gBAAgBA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,gBAAgBA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,KAAKA;gBACxHA,IAAIA,CAACA,gBAAgBA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,gBAAgBA,CAACA,CAACA,CAACA,GAAGA,IAAIA,CAACA,gBAAgBA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,CAACA,gBAA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,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,MAAMA,GAAGA,CAACA,GAACA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,CAACA;gBACrCA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,GAAGA,CAACA,GAACA,MAAMA;;gBAEzBA,cAAcA;gBACdA,CAACA,GAAGA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA;gBAC1BA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,MAAMA,GAAGA,CAACA,GAACA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,CAACA;gBACrCA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAAGA,GAAGA,GAAGA,CAACA,GAACA,MAAMA;;gBAExBA,SAASA;gBACTA,CAACA,GAAGA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA;gBAC1BA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,MAAMA,GAAGA,CAACA,GAACA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,CAACA;gBACrCA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAAGA,GAAGA,GAAGA,CAACA,GAACA,MAAMA;;gBAEzBA,MAAMA;gBACNA,CAACA,GAAGA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA;gBAC1BA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA;gBACbA,MAAMA,GAAGA,CAACA,GAACA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,CAACA;gBACrCA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAAGA,GAAGA,GAAGA,CAACA,GAACA,MAAMA;;gBAExBA,OAAOA;gBACPA,CAACA,GAAGA,IAAIA,CAACA,cAAcA,CAACA,CAACA,CAACA;gBAC1BA,CAACA,GAAGA,GAAGA;gBACPA,CAACA,GAAGA,GAAGA;gBACPA,CAACA,GAAGA,GAAGA;gBACPA,MAAMA,GAAGA,CAACA,GAACA,IAAIA,CAACA,IAAIA,CAACA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,GAAGA,CAACA,GAACA,CAACA,CAACA;gBACrCA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAACA,CAACA,GAAGA,CAACA,GAACA,MAAMA;gBACdA,CAACA,CAA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,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,GAAGA,CAACA,GAACA,EAAEA;4BAChCA,SAASA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA;4BACzBA,OAAOA,CAACA,IAAIA,CAACA,GAAGA,CAACA;4BACjBA,OAAOA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA;4BACrBA,OAAOA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA;4BACtBA,QAAQA,CAACA,IAAIA,CAACA,GAAGA,CAACA;4BAClBA,QAAQA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA;4BACtBA,QAAQA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA;4BACtBA,IAAIA,IAAIA,CAACA;;4BAETA,OAAOA;4BACPA,SAASA,CAACA,IAAIA,CAACA,GAAGA,SAASA;4BAC3BA,SAASA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,GAAGA,CAACA,GAACA,EAAEA;4BAChCA,SAASA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,EAAEA;4BACxBA,OAAOA,CAACA,IAAIA,CAACA,GAAGA,CAACA;4BACjBA,OAAOA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA;4BACrBA,OAAOA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA;4BACrBA,QAAQA,CAACA,IAAIA,CAACA,GAAGA,CAACA,CAACA;4BACnBA,QAAQA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA;4BACtBA,QAAQA,CAACA,IAAIA,GAAGA,CAACA,CAACA,GAAGA,CAACA;4BACtBA,IAAIA,IAAIA,CAACA;;4BAETA,IAAIA,CAACA,IAAIA,CAACA,CAAEA;gCACXA,EAAEA,GAAGA,CAACA,GAACA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAACA,CAACA,IAAIA,CAACA,UAAUA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA,C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A;;oBAEpDA,KAAKA,CAACA,GAAGA,CAACA,EAAEA,CAACA,IAAIA,IAAIA,CAACA,UAAUA,EAAEA,CAACA,EAAEA,CAAEA;wBACtCA,SAASA,GAAGA,EAAEA,GAAGA,CAACA,GAACA,EAAEA;;wBAErBA,KAAKA,CAACA,GAAGA,CAACA,EAAEA,CAACA,IAAIA,IAAIA,CAACA,UAAUA,EAAEA,CAACA,EAAEA,CAAEA;4BACtCA,OAAOA;4BACPA,SAASA,CAACA,IAAIA,CAACA,GAAGA,CAACA,EAAEA;4BACrBA,SAASA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,CAACA,EAAEA,GAAGA,CAACA,GAACA,EAAEA;4BAC9BA,SAASA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,SAASA;4BAC7BA,OAAOA,CAACA,IAAIA,CAACA,GAAGA,CAACA,CAACA;4BAClBA,OAAOA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,CAACA;4BACnBA,OAAOA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,CAACA;4BACnBA,QAAQA,CAACA,IAAIA,CAACA,GAAGA,CAACA;4BAClBA,QAAQA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,CAACA;4BACpBA,QAAQA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,CAACA,CAACA;4BACrBA,IAAIA,IAAIA,CAACA;;4BAETA,QAAQA;4BACRA,SAASA,CAACA,IAAIA,CAACA,GAAGA,EAAEA;4BACpBA,SAASA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,CAACA,EAAEA,GAAGA,CAACA,GAACA,EAAEA;4BAC9BA,SAASA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,SAASA;4BAC7BA,OAAOA,CAACA,IAAIA,CAACA,GAAGA,CAACA;4BACjBA,OAAOA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,CAACA;4BACnBA,OAAOA,CAACA,IAAIA,GAACA,CAACA,CAACA,GAAGA,CAACA;4BACnBA,QAAQA,CAACA,IAAIA,CAACA,GAAGA,CAACA;4BAClBA,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"} \ No newline at end of file diff --git a/build/awayjs-core.next.min.js b/build/awayjs-core.next.min.js deleted file mode 100644 index d7cf09c4..00000000 --- a/build/awayjs-core.next.min.js +++ /dev/null @@ -1,17 +0,0 @@ -var away;!function(away){!function(errors){var Error=function(){function Error(message,id,_name){"undefined"==typeof message&&(message=""),"undefined"==typeof id&&(id=0),"undefined"==typeof _name&&(_name=""),this._errorID=0,this._messsage="",this._name="",this._messsage=message,this._name=name,this._errorID=id}return Object.defineProperty(Error.prototype,"message",{get:function(){return this._messsage},set:function(value){this._messsage=value},enumerable:!0,configurable:!0}),Object.defineProperty(Error.prototype,"name",{get:function(){return this._name},set:function(value){this._name=value},enumerable:!0,configurable:!0}),Object.defineProperty(Error.prototype,"errorID",{get:function(){return this._errorID},enumerable:!0,configurable:!0}),Error}();errors.Error=Error}(away.errors||(away.errors={}));away.errors}(away||(away={}));var __extends=this.__extends||function(d,b){function __(){this.constructor=d}for(var p in b)b.hasOwnProperty(p)&&(d[p]=b[p]);__.prototype=b.prototype,d.prototype=new __},away;!function(away){!function(errors){var ArgumentError=function(_super){function ArgumentError(message,id){"undefined"==typeof message&&(message=null),"undefined"==typeof id&&(id=0),_super.call(this,message||"ArgumentError",id)}return __extends(ArgumentError,_super),ArgumentError}(away.errors.Error);errors.ArgumentError=ArgumentError}(away.errors||(away.errors={}));away.errors}(away||(away={}));var away;!function(away){!function(errors){var CastError=function(_super){function CastError(message){_super.call(this,message)}return __extends(CastError,_super),CastError}(errors.Error);errors.CastError=CastError}(away.errors||(away.errors={}));away.errors}(away||(away={}));var away;!function(away){!function(errors){var PartialImplementationError=function(_super){function PartialImplementationError(dependency,id){"undefined"==typeof dependency&&(dependency=""),"undefined"==typeof id&&(id=0),_super.call(this,"PartialImplementationError - this function is in development. Required Dependency: "+dependency,id)}return __extends(PartialImplementationError,_super),PartialImplementationError}(errors.Error);errors.PartialImplementationError=PartialImplementationError}(away.errors||(away.errors={}));away.errors}(away||(away={}));var away;!function(away){!function(errors){var AbstractMethodError=function(_super){function AbstractMethodError(message,id){"undefined"==typeof message&&(message=null),"undefined"==typeof id&&(id=0),_super.call(this,message||"An abstract method was called! Either an instance of an abstract class was created, or an abstract method was not overridden by the subclass.",id)}return __extends(AbstractMethodError,_super),AbstractMethodError}(away.errors.Error);errors.AbstractMethodError=AbstractMethodError}(away.errors||(away.errors={}));away.errors}(away||(away={}));var away;!function(away){!function(errors){var DocumentError=function(_super){function DocumentError(message,id){"undefined"==typeof message&&(message="DocumentError"),"undefined"==typeof id&&(id=0),_super.call(this,message,id)}return __extends(DocumentError,_super),DocumentError.DOCUMENT_DOES_NOT_EXIST="documentDoesNotExist",DocumentError}(errors.Error);errors.DocumentError=DocumentError}(away.errors||(away.errors={}));away.errors}(away||(away={}));var away;!function(away){!function(errors){var RangeError=function(_super){function RangeError(message,id){"undefined"==typeof message&&(message=null),"undefined"==typeof id&&(id=0),_super.call(this,message||"RangeError",id)}return __extends(RangeError,_super),RangeError}(away.errors.Error);errors.RangeError=RangeError}(away.errors||(away.errors={}));away.errors}(away||(away={}));var away;!function(away){!function(events){var Event=function(){function Event(type){this.type=void 0,this.target=void 0,this.type=type}return Event.prototype.clone=function(){return new Event(this.type)},Event.COMPLETE="complete",Event.OPEN="open",Event.ENTER_FRAME="enterFrame",Event.EXIT_FRAME="exitFrame",Event.RESIZE="resize",Event.ERROR="error",Event.CHANGE="change",Event}();events.Event=Event}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var AssetEvent=function(_super){function AssetEvent(type,asset,prevName){"undefined"==typeof asset&&(asset=null),"undefined"==typeof prevName&&(prevName=null),_super.call(this,type),this._asset=asset,this._prevName=prevName||(this._asset?this._asset.name:null)}return __extends(AssetEvent,_super),Object.defineProperty(AssetEvent.prototype,"asset",{get:function(){return this._asset},enumerable:!0,configurable:!0}),Object.defineProperty(AssetEvent.prototype,"assetPrevName",{get:function(){return this._prevName},enumerable:!0,configurable:!0}),AssetEvent.prototype.clone=function(){return new away.events.AssetEvent(this.type,this.asset,this.assetPrevName)},AssetEvent.ASSET_COMPLETE="assetComplete",AssetEvent.ASSET_RENAME="assetRename",AssetEvent.ASSET_CONFLICT_RESOLVED="assetConflictResolved",AssetEvent.TEXTURE_SIZE_ERROR="textureSizeError",AssetEvent}(away.events.Event);events.AssetEvent=AssetEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var CameraEvent=function(_super){function CameraEvent(type,camera){_super.call(this,type),this._camera=camera}return __extends(CameraEvent,_super),Object.defineProperty(CameraEvent.prototype,"camera",{get:function(){return this._camera},enumerable:!0,configurable:!0}),CameraEvent.PROJECTION_CHANGED="projectionChanged",CameraEvent}(away.events.Event);events.CameraEvent=CameraEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var DisplayObjectEvent=function(_super){function DisplayObjectEvent(type,object){_super.call(this,type),this.object=object}return __extends(DisplayObjectEvent,_super),DisplayObjectEvent.VISIBLITY_UPDATED="visiblityUpdated",DisplayObjectEvent.SCENETRANSFORM_CHANGED="scenetransformChanged",DisplayObjectEvent.SCENE_CHANGED="sceneChanged",DisplayObjectEvent.POSITION_CHANGED="positionChanged",DisplayObjectEvent.ROTATION_CHANGED="rotationChanged",DisplayObjectEvent.SCALE_CHANGED="scaleChanged",DisplayObjectEvent}(events.Event);events.DisplayObjectEvent=DisplayObjectEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var EventDispatcher=function(){function EventDispatcher(target){"undefined"==typeof target&&(target=null),this.listeners=new Array,this.target=target||this}return EventDispatcher.prototype.addEventListener=function(type,listener){void 0===this.listeners[type]&&(this.listeners[type]=new Array),-1===this.getEventListenerIndex(type,listener)&&this.listeners[type].push(listener)},EventDispatcher.prototype.removeEventListener=function(type,listener){var index=this.getEventListenerIndex(type,listener);-1!==index&&this.listeners[type].splice(index,1)},EventDispatcher.prototype.dispatchEvent=function(event){var listenerArray=this.listeners[event.type];if(void 0!==listenerArray){var l=listenerArray.length;event.target=this.target;for(var i=0;l>i;i++)listenerArray[i](event)}},EventDispatcher.prototype.getEventListenerIndex=function(type,listener){if(void 0!==this.listeners[type])for(var a=this.listeners[type],l=a.length,i=0;l>i;i++)if(listener==a[i])return i;return-1},EventDispatcher.prototype.hasEventListener=function(type,listener){return null!=listener?-1!==this.getEventListenerIndex(type,listener):void 0!==this.listeners[type]?this.listeners[type].length>0:!1},EventDispatcher}();events.EventDispatcher=EventDispatcher}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var GeometryEvent=function(_super){function GeometryEvent(type,subGeometry){"undefined"==typeof subGeometry&&(subGeometry=null),_super.call(this,type),this._subGeometry=subGeometry}return __extends(GeometryEvent,_super),Object.defineProperty(GeometryEvent.prototype,"subGeometry",{get:function(){return this._subGeometry},enumerable:!0,configurable:!0}),GeometryEvent.prototype.clone=function(){return new GeometryEvent(this.type,this._subGeometry)},GeometryEvent.SUB_GEOMETRY_ADDED="SubGeometryAdded",GeometryEvent.SUB_GEOMETRY_REMOVED="SubGeometryRemoved",GeometryEvent.BOUNDS_INVALID="BoundsInvalid",GeometryEvent}(away.events.Event);events.GeometryEvent=GeometryEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var HTTPStatusEvent=function(_super){function HTTPStatusEvent(type,status){"undefined"==typeof status&&(status=null),_super.call(this,type),this.status=status}return __extends(HTTPStatusEvent,_super),HTTPStatusEvent.HTTP_STATUS="HTTPStatusEvent_HTTP_STATUS",HTTPStatusEvent}(away.events.Event);events.HTTPStatusEvent=HTTPStatusEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var IOErrorEvent=function(_super){function IOErrorEvent(type){_super.call(this,type)}return __extends(IOErrorEvent,_super),IOErrorEvent.IO_ERROR="ioError",IOErrorEvent}(away.events.Event);events.IOErrorEvent=IOErrorEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var LightEvent=function(_super){function LightEvent(type){_super.call(this,type)}return __extends(LightEvent,_super),LightEvent.prototype.clone=function(){return new away.events.LightEvent(this.type)},LightEvent.CASTS_SHADOW_CHANGE="castsShadowChange",LightEvent}(away.events.Event);events.LightEvent=LightEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var LoaderEvent=function(_super){function LoaderEvent(type,url,content,assets){"undefined"==typeof url&&(url=null),"undefined"==typeof content&&(content=null),"undefined"==typeof assets&&(assets=null),_super.call(this,type),this._url=url,this._content=content,this._assets=assets}return __extends(LoaderEvent,_super),Object.defineProperty(LoaderEvent.prototype,"content",{get:function(){return this._content},enumerable:!0,configurable:!0}),Object.defineProperty(LoaderEvent.prototype,"url",{get:function(){return this._url},enumerable:!0,configurable:!0}),Object.defineProperty(LoaderEvent.prototype,"assets",{get:function(){return this._assets},enumerable:!0,configurable:!0}),LoaderEvent.prototype.clone=function(){return new LoaderEvent(this.type,this._url,this._content,this._assets)},LoaderEvent.RESOURCE_COMPLETE="resourceComplete",LoaderEvent}(away.events.Event);events.LoaderEvent=LoaderEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var ParserEvent=function(_super){function ParserEvent(type,message){"undefined"==typeof message&&(message=""),_super.call(this,type),this._message=message}return __extends(ParserEvent,_super),Object.defineProperty(ParserEvent.prototype,"message",{get:function(){return this._message},enumerable:!0,configurable:!0}),ParserEvent.prototype.clone=function(){return new away.events.ParserEvent(this.type,this.message)},ParserEvent.PARSE_COMPLETE="parseComplete",ParserEvent.PARSE_ERROR="parseError",ParserEvent.READY_FOR_DEPENDENCIES="readyForDependencies",ParserEvent}(away.events.Event);events.ParserEvent=ParserEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var MouseEvent=function(_super){function MouseEvent(type){_super.call(this,type),this._iAllowedToPropagate=!0}return __extends(MouseEvent,_super),Object.defineProperty(MouseEvent.prototype,"bubbles",{get:function(){var doesBubble=this._iAllowedToPropagate;return this._iAllowedToPropagate=!0,doesBubble},enumerable:!0,configurable:!0}),MouseEvent.prototype.stopPropagation=function(){this._iAllowedToPropagate=!1,this._iParentEvent&&this._iParentEvent.stopPropagation()},MouseEvent.prototype.stopImmediatePropagation=function(){this._iAllowedToPropagate=!1,this._iParentEvent&&this._iParentEvent.stopImmediatePropagation()},MouseEvent.prototype.clone=function(){var result=new MouseEvent(this.type);return result.screenX=this.screenX,result.screenY=this.screenY,result.view=this.view,result.object=this.object,result.materialOwner=this.materialOwner,result.material=this.material,result.uv=this.uv,result.localPosition=this.localPosition,result.localNormal=this.localNormal,result.index=this.index,result.subGeometryIndex=this.subGeometryIndex,result.delta=this.delta,result.ctrlKey=this.ctrlKey,result.shiftKey=this.shiftKey,result._iParentEvent=this,result._iAllowedToPropagate=this._iAllowedToPropagate,result},Object.defineProperty(MouseEvent.prototype,"scenePosition",{get:function(){return this.object.sceneTransform.transformVector(this.localPosition)},enumerable:!0,configurable:!0}),Object.defineProperty(MouseEvent.prototype,"sceneNormal",{get:function(){var sceneNormal=this.object.sceneTransform.deltaTransformVector(this.localNormal);return sceneNormal.normalize(),sceneNormal},enumerable:!0,configurable:!0}),MouseEvent.MOUSE_OVER="mouseOver3d",MouseEvent.MOUSE_OUT="mouseOut3d",MouseEvent.MOUSE_UP="mouseUp3d",MouseEvent.MOUSE_DOWN="mouseDown3d",MouseEvent.MOUSE_MOVE="mouseMove3d",MouseEvent.CLICK="click3d",MouseEvent.DOUBLE_CLICK="doubleClick3d",MouseEvent.MOUSE_WHEEL="mouseWheel3d",MouseEvent}(away.events.Event);events.MouseEvent=MouseEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var MaterialEvent=function(_super){function MaterialEvent(type){_super.call(this,type)}return __extends(MaterialEvent,_super),MaterialEvent.SIZE_CHANGED="sizeChanged",MaterialEvent}(events.Event);events.MaterialEvent=MaterialEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var ProgressEvent=function(_super){function ProgressEvent(type){_super.call(this,type)}return __extends(ProgressEvent,_super),ProgressEvent.PROGRESS="progress",ProgressEvent}(away.events.Event);events.ProgressEvent=ProgressEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var ProjectionEvent=function(_super){function ProjectionEvent(type,projection){_super.call(this,type),this._projection=projection}return __extends(ProjectionEvent,_super),Object.defineProperty(ProjectionEvent.prototype,"projection",{get:function(){return this._projection},enumerable:!0,configurable:!0}),ProjectionEvent.MATRIX_CHANGED="matrixChanged",ProjectionEvent}(away.events.Event);events.ProjectionEvent=ProjectionEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var RendererEvent=function(_super){function RendererEvent(type){_super.call(this,type)}return __extends(RendererEvent,_super),RendererEvent.VIEWPORT_UPDATED="viewportUpdated",RendererEvent.SCISSOR_UPDATED="scissorUpdated",RendererEvent}(events.Event);events.RendererEvent=RendererEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var SceneEvent=function(_super){function SceneEvent(type,displayObject){this.displayObject=displayObject,_super.call(this,type)}return __extends(SceneEvent,_super),SceneEvent.ADDED_TO_SCENE="addedToScene",SceneEvent.REMOVED_FROM_SCENE="removedFromScene",SceneEvent.PARTITION_CHANGED="partitionChanged",SceneEvent}(away.events.Event);events.SceneEvent=SceneEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var StageEvent=function(_super){function StageEvent(type){_super.call(this,type)}return __extends(StageEvent,_super),StageEvent.CONTEXT_CREATED="contextCreated",StageEvent.CONTEXT_DISPOSED="contextDisposed",StageEvent.CONTEXT_RECREATED="contextRecreated",StageEvent.VIEWPORT_UPDATED="viewportUpdated",StageEvent}(away.events.Event);events.StageEvent=StageEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var SubGeometryEvent=function(_super){function SubGeometryEvent(type,dataType){"undefined"==typeof dataType&&(dataType=""),_super.call(this,type),this._dataType=dataType}return __extends(SubGeometryEvent,_super),Object.defineProperty(SubGeometryEvent.prototype,"dataType",{get:function(){return this._dataType},enumerable:!0,configurable:!0}),SubGeometryEvent.prototype.clone=function(){return new SubGeometryEvent(this.type,this._dataType)},SubGeometryEvent.INDICES_UPDATED="indicesUpdated",SubGeometryEvent.VERTICES_UPDATED="verticesUpdated",SubGeometryEvent}(away.events.Event);events.SubGeometryEvent=SubGeometryEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(events){var TimerEvent=function(_super){function TimerEvent(type){_super.call(this,type)}return __extends(TimerEvent,_super),TimerEvent.TIMER="timer",TimerEvent.TIMER_COMPLETE="timerComplete",TimerEvent}(away.events.Event);events.TimerEvent=TimerEvent}(away.events||(away.events={}));away.events}(away||(away={}));var away;!function(away){!function(utils){var ByteArrayBase=function(){function ByteArrayBase(){this.position=0,this.length=0,this._mode=""}return ByteArrayBase.prototype.writeByte=function(){throw"Virtual method"},ByteArrayBase.prototype.readByte=function(){throw"Virtual method"},ByteArrayBase.prototype.writeUnsignedByte=function(){throw"Virtual method"},ByteArrayBase.prototype.readUnsignedByte=function(){throw"Virtual method"},ByteArrayBase.prototype.writeUnsignedShort=function(){throw"Virtual method"},ByteArrayBase.prototype.readUnsignedShort=function(){throw"Virtual method"},ByteArrayBase.prototype.writeUnsignedInt=function(){throw"Virtual method"},ByteArrayBase.prototype.readUnsignedInt=function(){throw"Virtual method"},ByteArrayBase.prototype.writeFloat=function(){throw"Virtual method"},ByteArrayBase.prototype.toFloatBits=function(){throw"Virtual method"},ByteArrayBase.prototype.readFloat=function(){throw"Virtual method"},ByteArrayBase.prototype.fromFloatBits=function(){throw"Virtual method"},ByteArrayBase.prototype.getBytesAvailable=function(){throw new away.errors.AbstractMethodError("ByteArrayBase, getBytesAvailable() not implemented ")},ByteArrayBase.prototype.toString=function(){return"[ByteArray] ( "+this._mode+" ) position="+this.position+" length="+this.length},ByteArrayBase.prototype.compareEqual=function(other,count){(void 0==count||count>this.length-this.position)&&(count=this.length-this.position),count>other.length-other.position&&(count=other.length-other.position);for(var r=!0;r&&count>=4;)count-=4,this.readUnsignedInt()!=other.readUnsignedInt()&&(r=!1);for(;r&&count>=1;)count--,this.readUnsignedByte()!=other.readUnsignedByte()&&(r=!1);var c0;return this.position-=c0-count,other.position-=c0-count,r},ByteArrayBase.prototype.writeBase64String=function(s){for(var i=0;id;d++)sh=lut[x>>(d<<2)&15]+sh;return sh}var oldpos=this.position;this.position=0;for(var nstep=8,i=0;ij&&i+jthis.length-this.position)&&(count=this.length-this.position),count>0?ByteArrayBase.internalGetBase64String(count,this.readUnsignedByte,this):""},ByteArrayBase.internalGetBase64String=function(count,getUnsignedByteFunc,self){for(var b0,b1,b2,enc1,enc2,enc3,enc4,r="",base64Key=ByteArrayBase.Base64Key;count>=3;)b0=getUnsignedByteFunc.apply(self),b1=getUnsignedByteFunc.apply(self),b2=getUnsignedByteFunc.apply(self),enc1=b0>>2,enc2=(3&b0)<<4|b1>>4,enc3=(15&b1)<<2|b2>>6,enc4=63&b2,r+=base64Key.charAt(enc1)+base64Key.charAt(enc2)+base64Key.charAt(enc3)+base64Key.charAt(enc4),count-=3;return 2==count?(b0=getUnsignedByteFunc.apply(self),b1=getUnsignedByteFunc.apply(self),enc1=b0>>2,enc2=(3&b0)<<4|b1>>4,enc3=(15&b1)<<2,r+=base64Key.charAt(enc1)+base64Key.charAt(enc2)+base64Key.charAt(enc3)+"="):1==count&&(b0=getUnsignedByteFunc.apply(self),enc1=b0>>2,enc2=(3&b0)<<4,r+=base64Key.charAt(enc1)+base64Key.charAt(enc2)+"=="),r},ByteArrayBase.Base64Key="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",ByteArrayBase}();utils.ByteArrayBase=ByteArrayBase}(away.utils||(away.utils={}));away.utils}(away||(away={}));var away;!function(away){!function(utils){var ByteArray=function(_super){function ByteArray(){_super.call(this),this.maxlength=0,this._mode="Typed array",this.maxlength=4,this.arraybytes=new ArrayBuffer(this.maxlength),this.unalignedarraybytestemp=new ArrayBuffer(16)}return __extends(ByteArray,_super),ByteArray.prototype.ensureWriteableSpace=function(n){this.ensureSpace(n+this.position)},ByteArray.prototype.setArrayBuffer=function(aBuffer){this.ensureSpace(aBuffer.byteLength),this.length=aBuffer.byteLength;var inInt8AView=new Int8Array(aBuffer),localInt8View=new Int8Array(this.arraybytes,0,this.length);localInt8View.set(inInt8AView),this.position=0},ByteArray.prototype.getBytesAvailable=function(){return this.length-this.position},ByteArray.prototype.ensureSpace=function(n){if(n>this.maxlength){var newmaxlength=n+255&-256,newarraybuffer=new ArrayBuffer(newmaxlength),view=new Uint8Array(this.arraybytes,0,this.length),newview=new Uint8Array(newarraybuffer,0,this.length);newview.set(view),this.arraybytes=newarraybuffer,this.maxlength=newmaxlength}},ByteArray.prototype.writeByte=function(b){this.ensureWriteableSpace(1);var view=new Int8Array(this.arraybytes);view[this.position++]=~~b,this.position>this.length&&(this.length=this.position)},ByteArray.prototype.readByte=function(){if(this.position>=this.length)throw"ByteArray out of bounds read. Positon="+this.position+", Length="+this.length;var view=new Int8Array(this.arraybytes);return view[this.position++]},ByteArray.prototype.readBytes=function(bytes,offset,length){"undefined"==typeof offset&&(offset=0),"undefined"==typeof length&&(length=0),null==length&&(length=bytes.length),bytes.ensureWriteableSpace(offset+length);var byteView=new Int8Array(bytes.arraybytes),localByteView=new Int8Array(this.arraybytes);byteView.set(localByteView.subarray(this.position,this.position+length),offset),this.position+=length,length+offset>bytes.length&&(bytes.length+=length+offset-bytes.length)},ByteArray.prototype.writeUnsignedByte=function(b){this.ensureWriteableSpace(1);var view=new Uint8Array(this.arraybytes);view[this.position++]=255&~~b,this.position>this.length&&(this.length=this.position)},ByteArray.prototype.readUnsignedByte=function(){if(this.position>=this.length)throw"ByteArray out of bounds read. Positon="+this.position+", Length="+this.length;var view=new Uint8Array(this.arraybytes);return view[this.position++]},ByteArray.prototype.writeUnsignedShort=function(b){if(this.ensureWriteableSpace(2),0==(1&this.position)){var view=new Uint16Array(this.arraybytes);view[this.position>>1]=65535&~~b}else{var view=new Uint16Array(this.unalignedarraybytestemp,0,1);view[0]=65535&~~b;var view2=new Uint8Array(this.arraybytes,this.position,2),view3=new Uint8Array(this.unalignedarraybytestemp,0,2);view2.set(view3)}this.position+=2,this.position>this.length&&(this.length=this.position)},ByteArray.prototype.readUTFBytes=function(len){for(var value="",max=this.position+len,data=new DataView(this.arraybytes);this.positionc){if(0==c)break;value+=String.fromCharCode(c)}else if(224>c)value+=String.fromCharCode((63&c)<<6|127&data.getUint8(this.position++));else if(240>c){var c2=data.getUint8(this.position++);value+=String.fromCharCode((31&c)<<12|(127&c2)<<6|127&data.getUint8(this.position++))}else{var c2=data.getUint8(this.position++),c3=data.getUint8(this.position++);value+=String.fromCharCode((15&c)<<18|(127&c2)<<12|c3<<6&127|127&data.getUint8(this.position++))}}return value},ByteArray.prototype.readInt=function(){var data=new DataView(this.arraybytes),int=data.getInt32(this.position,!0);return this.position+=4,int},ByteArray.prototype.readShort=function(){var data=new DataView(this.arraybytes),short=data.getInt16(this.position,!0);return this.position+=2,short},ByteArray.prototype.readDouble=function(){var data=new DataView(this.arraybytes),double=data.getFloat64(this.position,!0);return this.position+=8,double},ByteArray.prototype.readUnsignedShort=function(){if(this.position>this.length+2)throw"ByteArray out of bounds read. Position="+this.position+", Length="+this.length;if(0==(1&this.position)){var view=new Uint16Array(this.arraybytes),pa=this.position>>1;return this.position+=2,view[pa]}var view=new Uint16Array(this.unalignedarraybytestemp,0,1),view2=new Uint8Array(this.arraybytes,this.position,2),view3=new Uint8Array(this.unalignedarraybytestemp,0,2);return view3.set(view2),this.position+=2,view[0]},ByteArray.prototype.writeUnsignedInt=function(b){if(this.ensureWriteableSpace(4),0==(3&this.position)){var view=new Uint32Array(this.arraybytes);view[this.position>>2]=4294967295&~~b}else{var view=new Uint32Array(this.unalignedarraybytestemp,0,1);view[0]=4294967295&~~b;var view2=new Uint8Array(this.arraybytes,this.position,4),view3=new Uint8Array(this.unalignedarraybytestemp,0,4);view2.set(view3)}this.position+=4,this.position>this.length&&(this.length=this.position)},ByteArray.prototype.readUnsignedInt=function(){if(this.position>this.length+4)throw"ByteArray out of bounds read. Position="+this.position+", Length="+this.length;if(0==(3&this.position)){var view=new Uint32Array(this.arraybytes),pa=this.position>>2;return this.position+=4,view[pa]}var view=new Uint32Array(this.unalignedarraybytestemp,0,1),view2=new Uint8Array(this.arraybytes,this.position,4),view3=new Uint8Array(this.unalignedarraybytestemp,0,4);return view3.set(view2),this.position+=4,view[0]},ByteArray.prototype.writeFloat=function(b){if(this.ensureWriteableSpace(4),0==(3&this.position)){var view=new Float32Array(this.arraybytes);view[this.position>>2]=b}else{var view=new Float32Array(this.unalignedarraybytestemp,0,1);view[0]=b;var view2=new Uint8Array(this.arraybytes,this.position,4),view3=new Uint8Array(this.unalignedarraybytestemp,0,4);view2.set(view3)}this.position+=4,this.position>this.length&&(this.length=this.position)},ByteArray.prototype.readFloat=function(){if(this.position>this.length+4)throw"ByteArray out of bounds read. Positon="+this.position+", Length="+this.length;if(0==(3&this.position)){var view=new Float32Array(this.arraybytes),pa=this.position>>2;return this.position+=4,view[pa]}var view=new Float32Array(this.unalignedarraybytestemp,0,1),view2=new Uint8Array(this.arraybytes,this.position,4),view3=new Uint8Array(this.unalignedarraybytestemp,0,4);return view3.set(view2),this.position+=4,view[0]},ByteArray}(utils.ByteArrayBase);utils.ByteArray=ByteArray}(away.utils||(away.utils={}));away.utils}(away||(away={}));var away;!function(away){!function(utils){var ByteArrayBuffer=function(_super){function ByteArrayBuffer(){_super.call(this),this._bytes=[],this._mode="Array"}return __extends(ByteArrayBuffer,_super),ByteArrayBuffer.prototype.writeByte=function(b){var bi=~~b;this._bytes[this.position++]=bi,this.position>this.length&&(this.length=this.position)},ByteArrayBuffer.prototype.readByte=function(){if(this.position>=this.length)throw"ByteArray out of bounds read. Position="+this.position+", Length="+this.length;return this._bytes[this.position++]},ByteArrayBuffer.prototype.writeUnsignedByte=function(b){var bi=~~b;this._bytes[this.position++]=255&bi,this.position>this.length&&(this.length=this.position)},ByteArrayBuffer.prototype.readUnsignedByte=function(){if(this.position>=this.length)throw"ByteArray out of bounds read. Position="+this.position+", Length="+this.length;return this._bytes[this.position++]},ByteArrayBuffer.prototype.writeUnsignedShort=function(b){var bi=~~b;this._bytes[this.position++]=255&bi,this._bytes[this.position++]=bi>>8&255,this.position>this.length&&(this.length=this.position)},ByteArrayBuffer.prototype.readUnsignedShort=function(){if(this.position+2>this.length)throw"ByteArray out of bounds read. Position="+this.position+", Length="+this.length;var r=this._bytes[this.position]|this._bytes[this.position+1]<<8;return this.position+=2,r},ByteArrayBuffer.prototype.writeUnsignedInt=function(b){var bi=~~b;this._bytes[this.position++]=255&bi,this._bytes[this.position++]=bi>>>8&255,this._bytes[this.position++]=bi>>>16&255,this._bytes[this.position++]=bi>>>24&255,this.position>this.length&&(this.length=this.position)},ByteArrayBuffer.prototype.readUnsignedInt=function(){if(this.position+4>this.length)throw"ByteArray out of bounds read. Position="+this.position+", Length="+this.length;var r=this._bytes[this.position]|this._bytes[this.position+1]<<8|this._bytes[this.position+2]<<16|this._bytes[this.position+3]<<24;return this.position+=4,r>>>0},ByteArrayBuffer.prototype.writeFloat=function(b){this.writeUnsignedInt(this.toFloatBits(Number(b)))},ByteArrayBuffer.prototype.toFloatBits=function(x){if(0==x)return 0;var sign=0;0>x?(x=-x,sign=1):sign=0;var exponent=Math.log(x)/Math.log(2);exponent=Math.floor(exponent),x*=Math.pow(2,23-exponent);var mantissa=Math.floor(x)-8388608;return exponent+=127,sign<<31>>>0|exponent<<23|mantissa},ByteArrayBuffer.prototype.readFloat=function(){return this.fromFloatBits(this.readUnsignedInt())},ByteArrayBuffer.prototype.fromFloatBits=function(x){if(0==x)return 0;var exponent=x>>>23&255,mantissa=8388607&x|8388608,y=Math.pow(2,exponent-127-23)*mantissa;return x>>>31!=0&&(y=-y),y},ByteArrayBuffer}(utils.ByteArrayBase);utils.ByteArrayBuffer=ByteArrayBuffer}(away.utils||(away.utils={}));away.utils}(away||(away={}));var away;!function(away){!function(utils){var ColorUtils=function(){function ColorUtils(){}return ColorUtils.float32ColorToARGB=function(float32Color){var a=(4278190080&float32Color)>>>24,r=(16711680&float32Color)>>>16,g=(65280&float32Color)>>>8,b=255&float32Color,result=[a,r,g,b];return result},ColorUtils.componentToHex=function(c){var hex=c.toString(16);return 1==hex.length?"0"+hex:hex},ColorUtils.RGBToHexString=function(argb){return"#"+ColorUtils.componentToHex(argb[1])+ColorUtils.componentToHex(argb[2])+ColorUtils.componentToHex(argb[3])},ColorUtils.ARGBToHexString=function(argb){return"#"+ColorUtils.componentToHex(argb[0])+ColorUtils.componentToHex(argb[1])+ColorUtils.componentToHex(argb[2])+ColorUtils.componentToHex(argb[3])},ColorUtils}();utils.ColorUtils=ColorUtils}(away.utils||(away.utils={}));away.utils}(away||(away={}));var away;!function(away){!function(utils){var Cast=function(){function Cast(){}return Cast.string=function(data){return"function"==typeof data&&(data=new data),"string"==typeof data?data:data},Cast.byteArray=function(data){return"function"==typeof data&&(data=new data),data instanceof utils.ByteArray?data:data},Cast.isHex=function(str){for(var length=str.length,i=0;length>i;++i)if(-1==this._hexChars.indexOf(str.charAt(i)))return!1;return!0},Cast.tryColor=function(data){if("number"==typeof data)return Math.floor(data);if("string"==typeof data){if("random"==data)return Math.floor(16777216*Math.random());if(null==this._colorNames&&(this._colorNames=new Object,this._colorNames.steelblue=4620980,this._colorNames.royalblue=267920,this._colorNames.cornflowerblue=6591981,this._colorNames.lightsteelblue=11584734,this._colorNames.mediumslateblue=8087790,this._colorNames.slateblue=6970061,this._colorNames.darkslateblue=4734347,this._colorNames.midnightblue=1644912,this._colorNames.navy=128,this._colorNames.darkblue=139,this._colorNames.mediumblue=205,this._colorNames.blue=255,this._colorNames.dodgerblue=2003199,this._colorNames.deepskyblue=49151,this._colorNames.lightskyblue=8900346,this._colorNames.skyblue=8900331,this._colorNames.lightblue=11393254,this._colorNames.powderblue=11591910,this._colorNames.azure=15794175,this._colorNames.lightcyan=14745599,this._colorNames.paleturquoise=11529966,this._colorNames.mediumturquoise=4772300,this._colorNames.lightseagreen=2142890,this._colorNames.darkcyan=35723,this._colorNames.teal=32896,this._colorNames.cadetblue=6266528,this._colorNames.darkturquoise=52945,this._colorNames.aqua=65535,this._colorNames.cyan=65535,this._colorNames.turquoise=4251856,this._colorNames.aquamarine=8388564,this._colorNames.mediumaquamarine=6737322,this._colorNames.darkseagreen=9419919,this._colorNames.mediumseagreen=3978097,this._colorNames.seagreen=3050327,this._colorNames.darkgreen=25600,this._colorNames.green=32768,this._colorNames.forestgreen=2263842,this._colorNames.limegreen=3329330,this._colorNames.lime=65280,this._colorNames.chartreuse=8388352,this._colorNames.lawngreen=8190976,this._colorNames.greenyellow=11403055,this._colorNames.yellowgreen=10145074,this._colorNames.palegreen=10025880,this._colorNames.lightgreen=9498256,this._colorNames.springgreen=65407,this._colorNames.mediumspringgreen=64154,this._colorNames.darkolivegreen=5597999,this._colorNames.olivedrab=7048739,this._colorNames.olive=8421376,this._colorNames.darkkhaki=12433259,this._colorNames.darkgoldenrod=12092939,this._colorNames.goldenrod=14329120,this._colorNames.gold=16766720,this._colorNames.yellow=16776960,this._colorNames.khaki=15787660,this._colorNames.palegoldenrod=15657130,this._colorNames.blanchedalmond=16772045,this._colorNames.moccasin=16770229,this._colorNames.wheat=16113331,this._colorNames.navajowhite=16768685,this._colorNames.burlywood=14596231,this._colorNames.tan=13808780,this._colorNames.rosybrown=12357519,this._colorNames.sienna=10506797,this._colorNames.saddlebrown=9127187,this._colorNames.chocolate=13789470,this._colorNames.peru=13468991,this._colorNames.sandybrown=16032864,this._colorNames.darkred=9109504,this._colorNames.maroon=8388608,this._colorNames.brown=10824234,this._colorNames.firebrick=11674146,this._colorNames.indianred=13458524,this._colorNames.lightcoral=15761536,this._colorNames.salmon=16416882,this._colorNames.darksalmon=15308410,this._colorNames.lightsalmon=16752762,this._colorNames.coral=16744272,this._colorNames.tomato=16737095,this._colorNames.darkorange=16747520,this._colorNames.orange=16753920,this._colorNames.orangered=16729344,this._colorNames.crimson=14423100,this._colorNames.red=16711680,this._colorNames.deeppink=16716947,this._colorNames.fuchsia=16711935,this._colorNames.magenta=16711935,this._colorNames.hotpink=16738740,this._colorNames.lightpink=16758465,this._colorNames.pink=16761035,this._colorNames.palevioletred=14381203,this._colorNames.mediumvioletred=13047173,this._colorNames.purple=8388736,this._colorNames.darkmagenta=9109643,this._colorNames.mediumpurple=9662683,this._colorNames.blueviolet=9055202,this._colorNames.indigo=4915330,this._colorNames.darkviolet=9699539,this._colorNames.darkorchid=10040012,this._colorNames.mediumorchid=12211667,this._colorNames.orchid=14315734,this._colorNames.violet=15631086,this._colorNames.plum=14524637,this._colorNames.thistle=14204888,this._colorNames.lavender=15132410,this._colorNames.ghostwhite=16316671,this._colorNames.aliceblue=15792383,this._colorNames.mintcream=16121850,this._colorNames.honeydew=15794160,this._colorNames.lightgoldenrodyellow=16448210,this._colorNames.lemonchiffon=16775885,this._colorNames.cornsilk=16775388,this._colorNames.lightyellow=16777184,this._colorNames.ivory=16777200,this._colorNames.floralwhite=16775920,this._colorNames.linen=16445670,this._colorNames.oldlace=16643558,this._colorNames.antiquewhite=16444375,this._colorNames.bisque=16770244,this._colorNames.peachpuff=16767673,this._colorNames.papayawhip=16773077,this._colorNames.beige=16119260,this._colorNames.seashell=16774638,this._colorNames.lavenderblush=16773365,this._colorNames.mistyrose=16770273,this._colorNames.snow=16775930,this._colorNames.white=16777215,this._colorNames.whitesmoke=16119285,this._colorNames.gainsboro=14474460,this._colorNames.lightgrey=13882323,this._colorNames.silver=12632256,this._colorNames.darkgrey=11119017,this._colorNames.grey=8421504,this._colorNames.lightslategrey=7833753,this._colorNames.slategrey=7372944,this._colorNames.dimgrey=6908265,this._colorNames.darkslategrey=3100495,this._colorNames.black=0,this._colorNames.transparent=4278190080),null!=this._colorNames[data])return this._colorNames[data]; -if(6==data.length&&this.isHex(data))return parseInt("0x"+data)}return null},Cast.color=function(data){var result=this.tryColor(data);if(null==result)throw new away.errors.CastError("Can't cast to color: "+data);return result},Cast.tryClass=function(name){if(this._notClasses[name])return name;var result=this._classes[name];if(null!=result)return result;try{return result=window[name],this._classes[name]=result,result}catch(e){}return this._notClasses[name]=!0,name},Cast.bitmapData=function(data){if(null==data)return null;if("string"==typeof data&&(data=this.tryClass(data)),"function"==typeof data)try{data=new data}catch(e){data=new data(0,0)}if(data instanceof away.base.BitmapData)return data;if(data instanceof away.textures.ImageTexture&&(data=data.htmlImageElement),data instanceof HTMLImageElement){var imageElement=data,bitmapData=new away.base.BitmapData(imageElement.width,imageElement.height,!0,0);return bitmapData.draw(imageElement),bitmapData}throw new away.errors.CastError("Can't cast to BitmapData: "+data)},Cast.bitmapTexture=function(data){if(null==data)return null;if("string"==typeof data&&(data=this.tryClass(data)),"function"==typeof data)try{data=new data}catch(e){data=new data(0,0)}if(data instanceof away.textures.BitmapTexture)return data;try{var bmd=Cast.bitmapData(data);return new away.textures.BitmapTexture(bmd)}catch(e){}throw new away.errors.CastError("Can't cast to BitmapTexture: "+data)},Cast._hexChars="0123456789abcdefABCDEF",Cast._notClasses=new Object,Cast._classes=new Object,Cast}();utils.Cast=Cast}(away.utils||(away.utils={}));away.utils}(away||(away={}));var away;!function(away){!function(utils){var CSS=function(){function CSS(){}return CSS.setElementSize=function(element,width,height){element.style.width=width+"px",element.style.height=height+"px",element.width=width,element.height=height},CSS.setElementWidth=function(element,width){element.style.width=width+"px",element.width=width},CSS.setElementHeight=function(element,height){element.style.height=height+"px",element.height=height},CSS.setElementX=function(element,x){element.style.position="absolute",element.style.left=x+"px"},CSS.setElementY=function(element,y){element.style.position="absolute",element.style.top=y+"px"},CSS.getElementVisibility=function(element){return"visible"==element.style.visibility},CSS.setElementVisibility=function(element,visible){element.style.visibility=visible?"visible":"hidden"},CSS.setElementAlpha=function(element,alpha){if(element instanceof HTMLCanvasElement){var context=element.getContext("2d");context.globalAlpha=alpha}},CSS.setElementPosition=function(element,x,y,absolute){"undefined"==typeof absolute&&(absolute=!1),element.style.position=absolute?"absolute":"relative",element.style.left=x+"px",element.style.top=y+"px"},CSS}();utils.CSS=CSS}(away.utils||(away.utils={}));away.utils}(away||(away={}));var away;!function(away){var Debug=function(){function Debug(){}return Debug.breakpoint=function(){away.Debug["break"]()},Debug.throwPIROnKeyWordOnly=function(str,enable){"undefined"==typeof enable&&(enable=!0),away.Debug.keyword=enable?str:null},Debug.throwPIR=function(clss,fnc,msg){if(Debug.logPIR("PartialImplementationError "+clss,fnc,msg),Debug.THROW_ERRORS){if(away.Debug.keyword){var e=clss+fnc+msg;if(-1==e.indexOf(away.Debug.keyword))return}throw new away.errors.PartialImplementationError(clss+"."+fnc+": "+msg)}},Debug.logPIR=function(clss,fnc,msg){"undefined"==typeof msg&&(msg=""),Debug.LOG_PI_ERRORS&&console.log(clss+"."+fnc+": "+msg)},Debug.log=function(){for(var args=[],_i=0;_i=1&&d<=TextureUtils.MAX_SIZE&&TextureUtils.isPowerOfTwo(d)},TextureUtils.isPowerOfTwo=function(value){return value?(value&-value)==value:!1},TextureUtils.getBestPowerOf2=function(value){for(var p=1;value>p;)p<<=1;return p>TextureUtils.MAX_SIZE&&(p=TextureUtils.MAX_SIZE),p},TextureUtils.MAX_SIZE=2048,TextureUtils}();utils.TextureUtils=TextureUtils}(away.utils||(away.utils={}));away.utils}(away||(away={}));var away;!function(away){!function(utils){var Timer=function(_super){function Timer(delay,repeatCount){if("undefined"==typeof repeatCount&&(repeatCount=0),_super.call(this),this._repeatCount=0,this._currentCount=0,this._running=!1,this._delay=delay,this._repeatCount=repeatCount,isNaN(delay)||0>delay)throw new away.errors.Error("Delay is negative or not a number")}return __extends(Timer,_super),Object.defineProperty(Timer.prototype,"currentCount",{get:function(){return this._currentCount},enumerable:!0,configurable:!0}),Object.defineProperty(Timer.prototype,"delay",{get:function(){return this._delay},set:function(value){this._delay=value,this._running&&(this.stop(),this.start())},enumerable:!0,configurable:!0}),Object.defineProperty(Timer.prototype,"repeatCount",{get:function(){return this._repeatCount},set:function(value){this._repeatCount=value},enumerable:!0,configurable:!0}),Timer.prototype.reset=function(){this._running&&this.stop(),this._currentCount=0},Object.defineProperty(Timer.prototype,"running",{get:function(){return this._running},enumerable:!0,configurable:!0}),Timer.prototype.start=function(){var _this=this;this._running=!0,clearInterval(this._iid),this._iid=setInterval(function(){return _this.tick()},this._delay)},Timer.prototype.stop=function(){this._running=!1,clearInterval(this._iid)},Timer.prototype.tick=function(){this._currentCount++,this._repeatCount>0&&this._currentCount>=this._repeatCount?(this.stop(),this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER)),this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER_COMPLETE))):this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER))},Timer}(away.events.EventDispatcher);utils.Timer=Timer}(away.utils||(away.utils={}));away.utils}(away||(away={}));var away;!function(away){!function(geom){var Box=function(){function Box(x,y,z,width,height,depth){"undefined"==typeof x&&(x=0),"undefined"==typeof y&&(y=0),"undefined"==typeof z&&(z=0),"undefined"==typeof width&&(width=0),"undefined"==typeof height&&(height=0),"undefined"==typeof depth&&(depth=0),this.x=x,this.y=y,this.z=z,this.width=width,this.height=height,this.depth=depth}return Object.defineProperty(Box.prototype,"back",{get:function(){return this.z+this.depth},set:function(val){this.depth=val-this.z},enumerable:!0,configurable:!0}),Object.defineProperty(Box.prototype,"bottom",{get:function(){return this.y+this.height},set:function(val){this.height=val-this.y},enumerable:!0,configurable:!0}),Object.defineProperty(Box.prototype,"bottomRightBack",{get:function(){return null==this._bottomRightBack&&(this._bottomRightBack=new geom.Vector3D),this._bottomRightBack.x=this.x+this.width,this._bottomRightBack.y=this.y+this.height,this._bottomRightBack.z=this.z+this.depth,this._bottomRightBack},enumerable:!0,configurable:!0}),Object.defineProperty(Box.prototype,"front",{get:function(){return this.z},set:function(val){this.depth+=this.z-val,this.z=val},enumerable:!0,configurable:!0}),Object.defineProperty(Box.prototype,"left",{get:function(){return this.x},set:function(val){this.width+=this.x-val,this.x=val},enumerable:!0,configurable:!0}),Object.defineProperty(Box.prototype,"right",{get:function(){return this.x+this.width},set:function(val){this.width=val-this.x},enumerable:!0,configurable:!0}),Object.defineProperty(Box.prototype,"size",{get:function(){return null==this._size&&(this._size=new geom.Vector3D),this._size.x=this.width,this._size.y=this.height,this._size.z=this.depth,this._size},enumerable:!0,configurable:!0}),Object.defineProperty(Box.prototype,"top",{get:function(){return this.y},set:function(val){this.height+=this.y-val,this.y=val},enumerable:!0,configurable:!0}),Object.defineProperty(Box.prototype,"topLeftFront",{get:function(){return null==this._topLeftFront&&(this._topLeftFront=new away.geom.Vector3D),this._topLeftFront.x=this.x,this._topLeftFront.y=this.y,this._topLeftFront.z=this.z,this._topLeftFront},enumerable:!0,configurable:!0}),Box.prototype.clone=function(){return new Box(this.x,this.y,this.z,this.width,this.height,this.depth)},Box.prototype.contains=function(x,y,z){return this.x<=x&&this.x+this.width>=x&&this.y<=y&&this.y+this.height>=y&&this.z<=z&&this.z+this.depth>=z},Box.prototype.containsPoint=function(position){return this.x<=position.x&&this.x+this.width>=position.x&&this.y<=position.y&&this.y+this.height>=position.y&&this.z<=position.z&&this.z+this.depth>=position.z},Box.prototype.containsRect=function(box){return this.x<=box.x&&this.x+this.width>=box.x+box.width&&this.y<=box.y&&this.y+this.height>=box.y+box.height&&this.z<=box.z&&this.z+this.depth>=box.z+box.depth},Box.prototype.copyFrom=function(){},Box.prototype.equals=function(toCompare){return this.x==toCompare.x&&this.y==toCompare.y&&this.z==toCompare.z&&this.width==toCompare.width&&this.height==toCompare.height&&this.depth==toCompare.depth},Box.prototype.inflate=function(dx,dy,dz){this.x-=dx/2,this.y-=dy/2,this.z-=dz/2,this.width+=dx/2,this.height+=dy/2,this.depth+=dz/2},Box.prototype.inflatePoint=function(delta){this.x-=delta.x/2,this.y-=delta.y/2,this.z-=delta.z/2,this.width+=delta.x/2,this.height+=delta.y/2,this.depth+=delta.z/2},Box.prototype.intersection=function(toIntersect){if(this.intersects(toIntersect)){var i=new Box;return this.x>toIntersect.x?(i.x=this.x,i.width=toIntersect.x-this.x+toIntersect.width,i.width>this.width&&(i.width=this.width)):(i.x=toIntersect.x,i.width=this.x-toIntersect.x+this.width,i.width>toIntersect.width&&(i.width=toIntersect.width)),this.y>toIntersect.y?(i.y=this.y,i.height=toIntersect.y-this.y+toIntersect.height,i.height>this.height&&(i.height=this.height)):(i.y=toIntersect.y,i.height=this.y-toIntersect.y+this.height,i.height>toIntersect.height&&(i.height=toIntersect.height)),this.z>toIntersect.z?(i.z=this.z,i.depth=toIntersect.z-this.z+toIntersect.depth,i.depth>this.depth&&(i.depth=this.depth)):(i.z=toIntersect.z,i.depth=this.z-toIntersect.z+this.depth,i.depth>toIntersect.depth&&(i.depth=toIntersect.depth)),i}return new Box},Box.prototype.intersects=function(toIntersect){return this.x+this.width>toIntersect.x&&this.xtoIntersect.y&&this.ytoIntersect.z&&this.z2)throw"Column "+column+" out of bounds (2)";0==column?(this.a=vector3D.x,this.c=vector3D.y):1==column?(this.b=vector3D.x,this.d=vector3D.y):(this.tx=vector3D.x,this.ty=vector3D.y)},Matrix.prototype.copyColumnTo=function(column,vector3D){if(column>2)throw new away.errors.ArgumentError("ArgumentError, Column "+column+" out of bounds [0, ..., 2]");0==column?(vector3D.x=this.a,vector3D.y=this.c,vector3D.z=0):1==column?(vector3D.x=this.b,vector3D.y=this.d,vector3D.z=0):(vector3D.x=this.tx,vector3D.y=this.ty,vector3D.z=1)},Matrix.prototype.copyFrom=function(sourceMatrix){this.a=sourceMatrix.a,this.b=sourceMatrix.b,this.c=sourceMatrix.c,this.d=sourceMatrix.d,this.tx=sourceMatrix.tx,this.ty=sourceMatrix.ty},Matrix.prototype.copyRowFrom=function(row,vector3D){if(row>2)throw new away.errors.ArgumentError("ArgumentError, Row "+row+" out of bounds [0, ..., 2]");0==row?(this.a=vector3D.x,this.c=vector3D.y):1==row?(this.b=vector3D.x,this.d=vector3D.y):(this.tx=vector3D.x,this.ty=vector3D.y)},Matrix.prototype.copyRowTo=function(row,vector3D){if(row>2)throw new away.errors.ArgumentError("ArgumentError, Row "+row+" out of bounds [0, ..., 2]");0==row?(vector3D.x=this.a,vector3D.y=this.b,vector3D.z=this.tx):1==row?(vector3D.x=this.c,vector3D.y=this.d,vector3D.z=this.ty):vector3D.setTo(0,0,1)},Matrix.prototype.createBox=function(scaleX,scaleY,rotation,tx,ty){"undefined"==typeof rotation&&(rotation=0),"undefined"==typeof tx&&(tx=0),"undefined"==typeof ty&&(ty=0),this.a=scaleX,this.d=scaleY,this.b=rotation,this.tx=tx,this.ty=ty},Matrix.prototype.createGradientBox=function(width,height,rotation,tx,ty){if("undefined"==typeof rotation&&(rotation=0),"undefined"==typeof tx&&(tx=0),"undefined"==typeof ty&&(ty=0),this.a=width/1638.4,this.d=height/1638.4,0!=rotation){var cos=Math.cos(rotation),sin=Math.sin(rotation);this.b=sin*this.d,this.c=-sin*this.a,this.a*=cos,this.d*=cos}else this.b=this.c=0;this.tx=tx+width/2,this.ty=ty+height/2},Matrix.prototype.deltaTransformPoint=function(point){return new away.geom.Point(point.x*this.a+point.y*this.c,point.x*this.b+point.y*this.d)},Matrix.prototype.identity=function(){this.a=1,this.b=0,this.c=0,this.d=1,this.tx=0,this.ty=0},Matrix.prototype.invert=function(){var norm=this.a*this.d-this.b*this.c;if(0==norm)this.a=this.b=this.c=this.d=0,this.tx=-this.tx,this.ty=-this.ty;else{norm=1/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.ty=-this.b*this.tx-this.d*this.ty,this.tx=tx1}},Matrix.prototype.multiply=function(matrix){var result=new Matrix;return result.a=this.a*matrix.a+this.b*matrix.c,result.b=this.a*matrix.b+this.b*matrix.d,result.c=this.c*matrix.a+this.d*matrix.c,result.d=this.c*matrix.b+this.d*matrix.d,result.tx=this.tx*matrix.a+this.ty*matrix.c+matrix.tx,result.ty=this.tx*matrix.b+this.ty*matrix.d+matrix.ty,result},Matrix.prototype.rotate=function(angle){var cos=Math.cos(angle),sin=Math.sin(angle),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.ty=this.tx*sin+this.ty*cos,this.tx=tx1},Matrix.prototype.scale=function(sx,sy){this.a*=sx,this.b*=sy,this.c*=sx,this.d*=sy,this.tx*=sx,this.ty*=sy},Matrix.prototype.setTo=function(a,b,c,d,tx,ty){this.a=a,this.b=b,this.c=c,this.d=d,this.tx=tx,this.ty=ty},Matrix.prototype.toString=function(){return"[Matrix] (a="+this.a+", b="+this.b+", c="+this.c+", d="+this.d+", tx="+this.tx+", ty="+this.ty+")"},Matrix.prototype.transformPoint=function(point){return new away.geom.Point(point.x*this.a+point.y*this.c+this.tx,point.x*this.b+point.y*this.d+this.ty)},Matrix.prototype.translate=function(dx,dy){this.tx+=dx,this.ty+=dy},Matrix}();geom.Matrix=Matrix}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var Matrix3D=function(){function Matrix3D(v){"undefined"==typeof v&&(v=null),this.rawData=null!=v&&16==v.length?v.concat():[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}return Matrix3D.prototype.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},Matrix3D.prototype.appendRotation=function(degrees,axis){var m=Matrix3D.getAxisRotation(axis.x,axis.y,axis.z,degrees);this.append(m)},Matrix3D.prototype.appendScale=function(xScale,yScale,zScale){this.append(new Matrix3D([xScale,0,0,0,0,yScale,0,0,0,0,zScale,0,0,0,0,1]))},Matrix3D.prototype.appendTranslation=function(x,y,z){this.rawData[12]+=x,this.rawData[13]+=y,this.rawData[14]+=z},Matrix3D.prototype.clone=function(){return new Matrix3D(this.rawData.slice(0))},Matrix3D.prototype.copyColumnFrom=function(column,vector3D){switch(column){case 0:this.rawData[0]=vector3D.x,this.rawData[1]=vector3D.y,this.rawData[2]=vector3D.z,this.rawData[3]=vector3D.w;break;case 1:this.rawData[4]=vector3D.x,this.rawData[5]=vector3D.y,this.rawData[6]=vector3D.z,this.rawData[7]=vector3D.w;break;case 2:this.rawData[8]=vector3D.x,this.rawData[9]=vector3D.y,this.rawData[10]=vector3D.z,this.rawData[11]=vector3D.w;break;case 3:this.rawData[12]=vector3D.x,this.rawData[13]=vector3D.y,this.rawData[14]=vector3D.z,this.rawData[15]=vector3D.w;break;default:throw new away.errors.ArgumentError("ArgumentError, Column "+column+" out of bounds [0, ..., 3]")}},Matrix3D.prototype.copyColumnTo=function(column,vector3D){switch(column){case 0:vector3D.x=this.rawData[0],vector3D.y=this.rawData[1],vector3D.z=this.rawData[2],vector3D.w=this.rawData[3];break;case 1:vector3D.x=this.rawData[4],vector3D.y=this.rawData[5],vector3D.z=this.rawData[6],vector3D.w=this.rawData[7];break;case 2:vector3D.x=this.rawData[8],vector3D.y=this.rawData[9],vector3D.z=this.rawData[10],vector3D.w=this.rawData[11];break;case 3:vector3D.x=this.rawData[12],vector3D.y=this.rawData[13],vector3D.z=this.rawData[14],vector3D.w=this.rawData[15];break;default:throw new away.errors.ArgumentError("ArgumentError, Column "+column+" out of bounds [0, ..., 3]")}},Matrix3D.prototype.copyFrom=function(sourceMatrix3D){for(var len=sourceMatrix3D.rawData.length,c=0;len>c;c++)this.rawData[c]=sourceMatrix3D.rawData[c]},Matrix3D.prototype.copyRawDataFrom=function(vector,index,transpose){"undefined"==typeof index&&(index=0),"undefined"==typeof transpose&&(transpose=!1),transpose&&this.transpose();for(var len=vector.length-index,c=0;len>c;c++)this.rawData[c]=vector[c+index];transpose&&this.transpose()},Matrix3D.prototype.copyRawDataTo=function(vector,index,transpose){"undefined"==typeof index&&(index=0),"undefined"==typeof transpose&&(transpose=!1),transpose&&this.transpose();for(var len=this.rawData.length,c=0;len>c;c++)vector[c+index]=this.rawData[c];transpose&&this.transpose()},Matrix3D.prototype.copyRowFrom=function(row,vector3D){switch(row){case 0:this.rawData[0]=vector3D.x,this.rawData[4]=vector3D.y,this.rawData[8]=vector3D.z,this.rawData[12]=vector3D.w;break;case 1:this.rawData[1]=vector3D.x,this.rawData[5]=vector3D.y,this.rawData[9]=vector3D.z,this.rawData[13]=vector3D.w;break;case 2:this.rawData[2]=vector3D.x,this.rawData[6]=vector3D.y,this.rawData[10]=vector3D.z,this.rawData[14]=vector3D.w;break;case 3:this.rawData[3]=vector3D.x,this.rawData[7]=vector3D.y,this.rawData[11]=vector3D.z,this.rawData[15]=vector3D.w;break;default:throw new away.errors.ArgumentError("ArgumentError, Row "+row+" out of bounds [0, ..., 3]")}},Matrix3D.prototype.copyRowTo=function(row,vector3D){switch(row){case 0:vector3D.x=this.rawData[0],vector3D.y=this.rawData[4],vector3D.z=this.rawData[8],vector3D.w=this.rawData[12];break;case 1:vector3D.x=this.rawData[1],vector3D.y=this.rawData[5],vector3D.z=this.rawData[9],vector3D.w=this.rawData[13];break;case 2:vector3D.x=this.rawData[2],vector3D.y=this.rawData[6],vector3D.z=this.rawData[10],vector3D.w=this.rawData[14];break;case 3:vector3D.x=this.rawData[3],vector3D.y=this.rawData[7],vector3D.z=this.rawData[11],vector3D.w=this.rawData[15];break;default:throw new away.errors.ArgumentError("ArgumentError, Row "+row+" out of bounds [0, ..., 3]")}},Matrix3D.prototype.copyToMatrix3D=function(dest){dest.rawData=this.rawData.slice(0)},Matrix3D.prototype.decompose=function(orientationStyle){"undefined"==typeof orientationStyle&&(orientationStyle="eulerAngles");var vec=[],m=this.clone(),mr=m.rawData,pos=new geom.Vector3D(mr[12],mr[13],mr[14]);mr[12]=0,mr[13]=0,mr[14]=0;var scale=new 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]),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 geom.Vector3D;switch(orientationStyle){case geom.Orientation3D.AXIS_ANGLE:rot.w=Math.acos((mr[0]+mr[5]+mr[10]-1)/2);var len=Math.sqrt((mr[6]-mr[9])*(mr[6]-mr[9])+(mr[8]-mr[2])*(mr[8]-mr[2])+(mr[1]-mr[4])*(mr[1]-mr[4]));rot.x=(mr[6]-mr[9])/len,rot.y=(mr[8]-mr[2])/len,rot.z=(mr[1]-mr[4])/len;break;case geom.Orientation3D.QUATERNION:var tr=mr[0]+mr[5]+mr[10];tr>0?(rot.w=Math.sqrt(1+tr)/2,rot.x=(mr[6]-mr[9])/(4*rot.w),rot.y=(mr[8]-mr[2])/(4*rot.w),rot.z=(mr[1]-mr[4])/(4*rot.w)):mr[0]>mr[5]&&mr[0]>mr[10]?(rot.x=Math.sqrt(1+mr[0]-mr[5]-mr[10])/2,rot.w=(mr[6]-mr[9])/(4*rot.x),rot.y=(mr[1]+mr[4])/(4*rot.x),rot.z=(mr[8]+mr[2])/(4*rot.x)):mr[5]>mr[10]?(rot.y=Math.sqrt(1+mr[5]-mr[0]-mr[10])/2,rot.x=(mr[1]+mr[4])/(4*rot.y),rot.w=(mr[8]-mr[2])/(4*rot.y),rot.z=(mr[6]+mr[9])/(4*rot.y)):(rot.z=Math.sqrt(1+mr[10]-mr[0]-mr[5])/2,rot.x=(mr[8]+mr[2])/(4*rot.z),rot.y=(mr[6]+mr[9])/(4*rot.z),rot.w=(mr[1]-mr[4])/(4*rot.z));break;case geom.Orientation3D.EULER_ANGLES:rot.y=Math.asin(-mr[2]),1!=mr[2]&&-1!=mr[2]?(rot.x=Math.atan2(mr[6],mr[10]),rot.z=Math.atan2(mr[1],mr[0])):(rot.z=0,rot.x=Math.atan2(mr[4],mr[5]))}return vec.push(pos),vec.push(rot),vec.push(scale),vec},Matrix3D.prototype.deltaTransformVector=function(v){var x=v.x,y=v.y,z=v.z;return new away.geom.Vector3D(x*this.rawData[0]+y*this.rawData[4]+z*this.rawData[8],x*this.rawData[1]+y*this.rawData[5]+z*this.rawData[9],x*this.rawData[2]+y*this.rawData[6]+z*this.rawData[10],x*this.rawData[3]+y*this.rawData[7]+z*this.rawData[11])},Matrix3D.prototype.identity=function(){this.rawData=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]},Matrix3D.interpolate=function(thisMat,toMat,percent){for(var m=new Matrix3D,i=0;16>i;++i)m.rawData[i]=thisMat.rawData[i]+(toMat.rawData[i]-thisMat.rawData[i])*percent;return m},Matrix3D.prototype.interpolateTo=function(toMat,percent){for(var i=0;16>i;++i)this.rawData[i]=this.rawData[i]+(toMat.rawData[i]-this.rawData[i])*percent},Matrix3D.prototype.invert=function(){var d=this.determinant,invertable=Math.abs(d)>1e-11;if(invertable){d=1/d;var m11=this.rawData[0],m21=this.rawData[4],m31=this.rawData[8],m41=this.rawData[12],m12=this.rawData[1],m22=this.rawData[5],m32=this.rawData[9],m42=this.rawData[13],m13=this.rawData[2],m23=this.rawData[6],m33=this.rawData[10],m43=this.rawData[14],m14=this.rawData[3],m24=this.rawData[7],m34=this.rawData[11],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 invertable},Matrix3D.prototype.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},Matrix3D.prototype.prependRotation=function(degrees,axis){var m=Matrix3D.getAxisRotation(axis.x,axis.y,axis.z,degrees);this.prepend(m)},Matrix3D.prototype.prependScale=function(xScale,yScale,zScale){this.prepend(new Matrix3D([xScale,0,0,0,0,yScale,0,0,0,0,zScale,0,0,0,0,1]))},Matrix3D.prototype.prependTranslation=function(x,y,z){var m=new Matrix3D;m.position=new geom.Vector3D(x,y,z),this.prepend(m)},Matrix3D.prototype.recompose=function(components){if(components.length<3)return!1;this.identity(),this.appendScale(components[2].x,components[2].y,components[2].z);var angle;return angle=-components[1].x,this.append(new 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 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 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.position=components[0],this.rawData[15]=1,!0},Matrix3D.prototype.transformVector=function(v){var x=v.x,y=v.y,z=v.z;return new away.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],x*this.rawData[3]+y*this.rawData[7]+z*this.rawData[11]+this.rawData[15])},Matrix3D.prototype.transformVectors=function(vin,vout){for(var i=0,x=0,y=0,z=0;i+3<=vin.length;)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},Matrix3D.prototype.transpose=function(){var oRawData=this.rawData.slice(0);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]},Matrix3D.getAxisRotation=function(x,y,z,degrees){var tmp1,tmp2,m=new Matrix3D,rad=degrees*(Math.PI/180),c=Math.cos(rad),s=Math.sin(rad),t=1-c;return m.rawData[0]=c+x*x*t,m.rawData[5]=c+y*y*t,m.rawData[10]=c+z*z*t,tmp1=x*y*t,tmp2=z*s,m.rawData[1]=tmp1+tmp2,m.rawData[4]=tmp1-tmp2,tmp1=x*z*t,tmp2=y*s,m.rawData[8]=tmp1+tmp2,m.rawData[2]=tmp1-tmp2,tmp1=y*z*t,tmp2=x*s,m.rawData[9]=tmp1-tmp2,m.rawData[6]=tmp1+tmp2,m},Object.defineProperty(Matrix3D.prototype,"determinant",{get:function(){return(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])},enumerable:!0,configurable:!0}),Object.defineProperty(Matrix3D.prototype,"position",{get:function(){return new geom.Vector3D(this.rawData[12],this.rawData[13],this.rawData[14])},set:function(value){this.rawData[12]=value.x,this.rawData[13]=value.y,this.rawData[14]=value.z},enumerable:!0,configurable:!0}),Matrix3D.prototype.toFixed=function(decimalPlace){var magnitude=Math.pow(10,decimalPlace);return"matrix3d("+Math.round(this.rawData[0]*magnitude)/magnitude+","+Math.round(this.rawData[1]*magnitude)/magnitude+","+Math.round(this.rawData[2]*magnitude)/magnitude+","+Math.round(this.rawData[3]*magnitude)/magnitude+","+Math.round(this.rawData[4]*magnitude)/magnitude+","+Math.round(this.rawData[5]*magnitude)/magnitude+","+Math.round(this.rawData[6]*magnitude)/magnitude+","+Math.round(this.rawData[7]*magnitude)/magnitude+","+Math.round(this.rawData[8]*magnitude)/magnitude+","+Math.round(this.rawData[9]*magnitude)/magnitude+","+Math.round(this.rawData[10]*magnitude)/magnitude+","+Math.round(this.rawData[11]*magnitude)/magnitude+","+Math.round(this.rawData[12]*magnitude)/magnitude+","+Math.round(this.rawData[13]*magnitude)/magnitude+","+Math.round(this.rawData[14]*magnitude)/magnitude+","+Math.round(this.rawData[15]*magnitude)/magnitude+")"},Matrix3D.prototype.toString=function(){return"matrix3d("+Math.round(1e3*this.rawData[0])/1e3+","+Math.round(1e3*this.rawData[1])/1e3+","+Math.round(1e3*this.rawData[2])/1e3+","+Math.round(1e3*this.rawData[3])/1e3+","+Math.round(1e3*this.rawData[4])/1e3+","+Math.round(1e3*this.rawData[5])/1e3+","+Math.round(1e3*this.rawData[6])/1e3+","+Math.round(1e3*this.rawData[7])/1e3+","+Math.round(1e3*this.rawData[8])/1e3+","+Math.round(1e3*this.rawData[9])/1e3+","+Math.round(1e3*this.rawData[10])/1e3+","+Math.round(1e3*this.rawData[11])/1e3+","+Math.round(1e3*this.rawData[12])/1e3+","+Math.round(1e3*this.rawData[13])/1e3+","+Math.round(1e3*this.rawData[14])/1e3+","+Math.round(1e3*this.rawData[15])/1e3+")"},Matrix3D}();geom.Matrix3D=Matrix3D}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var Matrix3DUtils=function(){function Matrix3DUtils(){}return Matrix3DUtils.quaternion2matrix=function(quarternion,m){"undefined"==typeof m&&(m=null);var x=quarternion.x,y=quarternion.y,z=quarternion.z,w=quarternion.w,xx=x*x,xy=x*y,xz=x*z,xw=x*w,yy=y*y,yz=y*z,yw=y*w,zz=z*z,zw=z*w,raw=Matrix3DUtils.RAW_DATA_CONTAINER;return raw[0]=1-2*(yy+zz),raw[1]=2*(xy+zw),raw[2]=2*(xz-yw),raw[4]=2*(xy-zw),raw[5]=1-2*(xx+zz),raw[6]=2*(yz+xw),raw[8]=2*(xz+yw),raw[9]=2*(yz-xw),raw[10]=1-2*(xx+yy),raw[3]=raw[7]=raw[11]=raw[12]=raw[13]=raw[14]=0,raw[15]=1,m?(m.copyRawDataFrom(raw),m):new geom.Matrix3D(raw)},Matrix3DUtils.getForward=function(m,v){return"undefined"==typeof v&&(v=null),null===v&&(v=new geom.Vector3D(0,0,0)),m.copyColumnTo(2,v),v.normalize(),v},Matrix3DUtils.getUp=function(m,v){return"undefined"==typeof v&&(v=null),null===v&&(v=new geom.Vector3D(0,0,0)),m.copyColumnTo(1,v),v.normalize(),v},Matrix3DUtils.getRight=function(m,v){return"undefined"==typeof v&&(v=null),null===v&&(v=new geom.Vector3D(0,0,0)),m.copyColumnTo(0,v),v.normalize(),v},Matrix3DUtils.compare=function(m1,m2){var r1=Matrix3DUtils.RAW_DATA_CONTAINER,r2=m2.rawData;m1.copyRawDataTo(r1);for(var i=0;16>i;++i)if(r1[i]!=r2[i])return!1;return!0},Matrix3DUtils.lookAt=function(matrix,pos,dir,up){var dirN,upN,lftN,raw=Matrix3DUtils.RAW_DATA_CONTAINER;lftN=dir.crossProduct(up),lftN.normalize(),upN=lftN.crossProduct(dir),upN.normalize(),dirN=dir.clone(),dirN.normalize(),raw[0]=lftN.x,raw[1]=upN.x,raw[2]=-dirN.x,raw[3]=0,raw[4]=lftN.y,raw[5]=upN.y,raw[6]=-dirN.y,raw[7]=0,raw[8]=lftN.z,raw[9]=upN.z,raw[10]=-dirN.z,raw[11]=0,raw[12]=-lftN.dotProduct(pos),raw[13]=-upN.dotProduct(pos),raw[14]=dirN.dotProduct(pos),raw[15]=1,matrix.copyRawDataFrom(raw)},Matrix3DUtils.reflection=function(plane,target){"undefined"==typeof target&&(target=null),null===target&&(target=new geom.Matrix3D);var a=plane.a,b=plane.b,c=plane.c,d=plane.d,rawData=Matrix3DUtils.RAW_DATA_CONTAINER,ab2=-2*a*b,ac2=-2*a*c,bc2=-2*b*c;return rawData[0]=1-2*a*a,rawData[4]=ab2,rawData[8]=ac2,rawData[12]=-2*a*d,rawData[1]=ab2,rawData[5]=1-2*b*b,rawData[9]=bc2,rawData[13]=-2*b*d,rawData[2]=ac2,rawData[6]=bc2,rawData[10]=1-2*c*c,rawData[14]=-2*c*d,rawData[3]=0,rawData[7]=0,rawData[11]=0,rawData[15]=1,target.copyRawDataFrom(rawData),target},Matrix3DUtils.transformVector=function(matrix,vector,result){"undefined"==typeof result&&(result=null),result||(result=new geom.Vector3D);var raw=Matrix3DUtils.RAW_DATA_CONTAINER;matrix.copyRawDataTo(raw);var a=raw[0],e=raw[1],i=raw[2],m=raw[3],b=raw[4],f=raw[5],j=raw[6],n=raw[7],c=raw[8],g=raw[9],k=raw[10],o=raw[11],d=raw[12],h=raw[13],l=raw[14],p=raw[15],x=vector.x,y=vector.y,z=vector.z;return result.x=a*x+b*y+c*z+d,result.y=e*x+f*y+g*z+h,result.z=i*x+j*y+k*z+l,result.w=m*x+n*y+o*z+p,result},Matrix3DUtils.deltaTransformVector=function(matrix,vector,result){"undefined"==typeof result&&(result=null),result||(result=new geom.Vector3D);var raw=Matrix3DUtils.RAW_DATA_CONTAINER;matrix.copyRawDataTo(raw);var a=raw[0],e=raw[1],i=raw[2],m=raw[3],b=raw[4],f=raw[5],j=raw[6],n=raw[7],c=raw[8],g=raw[9],k=raw[10],o=raw[11],x=vector.x,y=vector.y,z=vector.z;return result.x=a*x+b*y+c*z,result.y=e*x+f*y+g*z,result.z=i*x+j*y+k*z,result.w=m*x+n*y+o*z,result},Matrix3DUtils.getTranslation=function(transform,result){return"undefined"==typeof result&&(result=null),result||(result=new geom.Vector3D),transform.copyColumnTo(3,result),result},Matrix3DUtils.deltaTransformVectors=function(matrix,vin,vout){var raw=Matrix3DUtils.RAW_DATA_CONTAINER;matrix.copyRawDataTo(raw);for(var a=raw[0],e=raw[1],i=raw[2],b=(raw[3],raw[4]),f=raw[5],j=raw[6],c=(raw[7],raw[8]),g=raw[9],k=raw[10],outIndex=(raw[11],0),length=vin.length,index=0;length>index;index+=3){var x=vin[index],y=vin[index+1],z=vin[index+2];vout[outIndex++]=a*x+b*y+c*z,vout[outIndex++]=e*x+f*y+g*z,vout[outIndex++]=i*x+j*y+k*z}},Matrix3DUtils.RAW_DATA_CONTAINER=new Array(16),Matrix3DUtils.CALCULATION_MATRIX=new geom.Matrix3D,Matrix3DUtils}();geom.Matrix3DUtils=Matrix3DUtils}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var Orientation3D=function(){function Orientation3D(){}return Orientation3D.AXIS_ANGLE="axisAngle",Orientation3D.EULER_ANGLES="eulerAngles",Orientation3D.QUATERNION="quaternion",Orientation3D}();geom.Orientation3D=Orientation3D}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var PerspectiveProjection=function(){function PerspectiveProjection(){}return PerspectiveProjection.prototype.toMatrix3D=function(){return this._matrix3D},PerspectiveProjection}();geom.PerspectiveProjection=PerspectiveProjection}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var Plane3D=function(){function Plane3D(a,b,c,d){"undefined"==typeof a&&(a=0),"undefined"==typeof b&&(b=0),"undefined"==typeof c&&(c=0),"undefined"==typeof d&&(d=0),this.a=a,this.b=b,this.c=c,this.d=d,this._iAlignment=0==a&&0==b?Plane3D.ALIGN_XY_AXIS:0==b&&0==c?Plane3D.ALIGN_YZ_AXIS:0==a&&0==c?Plane3D.ALIGN_XZ_AXIS:Plane3D.ALIGN_ANY}return Plane3D.prototype.fromPoints=function(p0,p1,p2){var d1x=p1.x-p0.x,d1y=p1.y-p0.y,d1z=p1.z-p0.z,d2x=p2.x-p0.x,d2y=p2.y-p0.y,d2z=p2.z-p0.z;this.a=d1y*d2z-d1z*d2y,this.b=d1z*d2x-d1x*d2z,this.c=d1x*d2y-d1y*d2x,this.d=this.a*p0.x+this.b*p0.y+this.c*p0.z,this._iAlignment=0==this.a&&0==this.b?Plane3D.ALIGN_XY_AXIS:0==this.b&&0==this.c?Plane3D.ALIGN_YZ_AXIS:0==this.a&&0==this.c?Plane3D.ALIGN_XZ_AXIS:Plane3D.ALIGN_ANY},Plane3D.prototype.fromNormalAndPoint=function(normal,point){this.a=normal.x,this.b=normal.y,this.c=normal.z,this.d=this.a*point.x+this.b*point.y+this.c*point.z,this._iAlignment=0==this.a&&0==this.b?Plane3D.ALIGN_XY_AXIS:0==this.b&&0==this.c?Plane3D.ALIGN_YZ_AXIS:0==this.a&&0==this.c?Plane3D.ALIGN_XZ_AXIS:Plane3D.ALIGN_ANY},Plane3D.prototype.normalize=function(){var len=1/Math.sqrt(this.a*this.a+this.b*this.b+this.c*this.c);return this.a*=len,this.b*=len,this.c*=len,this.d*=len,this},Plane3D.prototype.distance=function(p){return this._iAlignment==Plane3D.ALIGN_YZ_AXIS?this.a*p.x-this.d:this._iAlignment==Plane3D.ALIGN_XZ_AXIS?this.b*p.y-this.d:this._iAlignment==Plane3D.ALIGN_XY_AXIS?this.c*p.z-this.d:this.a*p.x+this.b*p.y+this.c*p.z-this.d},Plane3D.prototype.classifyPoint=function(p,epsilon){if("undefined"==typeof epsilon&&(epsilon=.01),this.d!=this.d)return away.geom.PlaneClassification.FRONT;var len;return len=this._iAlignment==Plane3D.ALIGN_YZ_AXIS?this.a*p.x-this.d:this._iAlignment==Plane3D.ALIGN_XZ_AXIS?this.b*p.y-this.d:this._iAlignment==Plane3D.ALIGN_XY_AXIS?this.c*p.z-this.d:this.a*p.x+this.b*p.y+this.c*p.z-this.d,-epsilon>len?away.geom.PlaneClassification.BACK:len>epsilon?away.geom.PlaneClassification.FRONT:away.geom.PlaneClassification.INTERSECT},Plane3D.prototype.toString=function(){return"Plane3D [a:"+this.a+", b:"+this.b+", c:"+this.c+", d:"+this.d+"]"},Plane3D.ALIGN_ANY=0,Plane3D.ALIGN_XY_AXIS=1,Plane3D.ALIGN_YZ_AXIS=2,Plane3D.ALIGN_XZ_AXIS=3,Plane3D}();geom.Plane3D=Plane3D}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var PlaneClassification=function(){function PlaneClassification(){}return PlaneClassification.BACK=0,PlaneClassification.FRONT=1,PlaneClassification.IN=0,PlaneClassification.OUT=1,PlaneClassification.INTERSECT=2,PlaneClassification}();geom.PlaneClassification=PlaneClassification}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var Point=function(){function Point(x,y){"undefined"==typeof x&&(x=0),"undefined"==typeof y&&(y=0),this.x=x,this.y=y}return Object.defineProperty(Point.prototype,"length",{get:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},enumerable:!0,configurable:!0}),Point.prototype.add=function(v){return new Point(this.x+v.x,this.y+v.y)},Point.prototype.clone=function(){return new Point(this.x,this.y)},Point.prototype.copyFrom=function(){},Point.prototype.equals=function(toCompare){return this.x==toCompare.x&&this.y==toCompare.y},Point.prototype.normalize=function(thickness){if("undefined"==typeof thickness&&(thickness=1),0!=this.length){var invLength=thickness/this.length;return this.x*=invLength,this.y*=invLength,void 0}throw"Cannot divide by zero length."},Point.prototype.offset=function(dx,dy){this.x+=dx,this.y+=dy},Point.prototype.setTo=function(){},Point.prototype.subtract=function(v){return new Point(this.x-v.x,this.y-v.y)},Point.prototype.toString=function(){return"[Point] (x="+this.x+", y="+this.y+")"},Point.distance=function(pt1,pt2){var dx=pt2.x-pt1.x,dy=pt2.y-pt1.y;return Math.sqrt(dx*dx+dy*dy)},Point.interpolate=function(pt1,pt2,f){return new Point(pt2.x+(pt1.x-pt2.x)*f,pt2.y+(pt1.y-pt2.y)*f)},Point.polar=function(len,angle){return new Point(len*Math.cos(angle),len*Math.sin(angle))},Point}();geom.Point=Point}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var PoissonLookup=function(){function PoissonLookup(){}return PoissonLookup.initDistributions=function(){this._distributions=new Array,this._distributions[0]=new Array(.3082841,.4320919),this._distributions[1]=new Array(.3082841,.4320919,-.2274942,-.6640266),this._distributions[2]=new Array(.8742689,.0009265686,-.6864116,-.5536607,-.2325206,.7678371),this._distributions[3]=new Array(.3913446,-.7084417,-.7511101,-.5935929,-.2323436,.5320091,.8435315,.5035911),this._distributions[4]=new Array(.2122471,-.5771395,-.8543506,-.1763534,.5189021,.8323698,-.3616908,.5865368,.9523004,-.04948437),this._distributions[5]=new Array(.5791035,.3496495,.2959551,-.6006749,-.2419119,-.06879545,-.7403072,.6110353,-.04555973,.8059174,-.5275017,-.737129),this._distributions[6]=new Array(.06941478,.8519508,-.7441907,.2426432,.6439992,-.2405252,-.1007523,-.2327587,-.6427067,-.7248485,.8050759,.5492936,.3573822,-.8824506),this._distributions[7]=new Array(.8509863,.4452587,-.09507271,.2073005,.1706571,-.6434793,.8029777,-.2718274,-.4401725,.8196304,.2715359,.8598521,-.8121575,-.006447683,-.6486837,-.7237598),this._distributions[8]=new Array(.6951686,-.2680728,-.04933243,.3710589,.6592212,.3661054,-.01579228,-.6909603,-.3275101,-.1756866,.3811549,.9218544,-.216032,.9755028,-.7065172,.3355389,-.6579109,-.6798355),this._distributions[9]=new Array(.6181276,-.09790418,-.2537868,-.5570995,-.1964931,.3459414,.3474613,-.8885581,.5135743,.5753114,-.9549091,.1480672,-.8711916,-.4293123,-.6928071,.6190156,-.13369,.8892705,.0548224,-.1246777),this._distributions[10]=new Array(.4853027,-.5080479,-.1331675,-.506597,.139575,.01316885,.803486,-.07568797,.5240274,.4883182,-.4334005,.1207938,-.7794577,-.3985141,.1576432,-.9861221,-.3712867,.6959021,.1517378,.9847429,-.9762396,.1661073),this._distributions[11]=new Array(-.2790166,-.01252619,.3389016,.3921154,.2408341,-.313211,-.8151779,-.3898362,-.6347761,.3486495,.09471484,-.7722448,-.1385674,.6364574,.2456331,.9295807,-.3864306,-.8247881,.6111673,-.7164014,.8287669,.05466961,.837706,.5415626),this._distributions[12]=new Array(.056417,.3185693,-.8245888,.1882799,.8575996,.1136829,.1070375,.875332,.4076743,-.06000621,-.4311306,.7239349,.2677574,-.538472,-.08486642,-.2083647,-.888989,-.3906443,-.4768958,-.6664082,.09334993,-.9861541,.808736,-.455949,.5889823,.7660807),this._distributions[13]=new Array(-.2681346,-.3955857,-.1315102,-.8852947,-.5143692,.09551838,.4344836,-.546945,-.8620899,-.3813288,.1650431,.02034803,-.1543657,.3842218,-.828457,.5376903,-.6145,-.7818927,-.2639062,.8784655,.1912684,.9720125,.3135219,.5224229,.7850655,.4592297,.7465045,-.1368916),this._distributions[14]=new Array(.4241029,.695281,.150511,-.02304107,-.2482675,.9120338,.8057325,.2622084,-.2445909,.2765962,.8588713,-.1772072,.3117845,-.4385471,-.3923851,-.3298936,-.1751254,-.7405846,.6926506,-.684163,-.9304563,-.3254691,-.8533293,.1523024,.2510415,-.917345,-.6239773,-.7105472,-.6104624,.6041355),this._distributions[15]=new Array(.5844554,.06651045,.1343258,.6756578,.3799674,-.6301104,.5590436,.7940555,.09574714,.02262517,.8697868,.393301,.003945862,-.421735,.9043913,-.2432393,-.4844007,.7190998,-.3201078,.2972371,-.3852352,-.6341155,-.5413069,-.09223081,-.8468984,-.5126905,.004156174,-.8633173,-.9681889,-.03305046,-.846509,.4414353),this._distributions[16]=new Array(.4506488,.657668,.4621297,.07441051,-.2782125,.6201044,.9750003,.09110117,.1019436,.2986514,.03457398,.9631706,.542098,-.5505635,.8675668,.4938077,-.5414361,.2655292,-.7941836,.6003053,-.09847672,-.1001604,-.9316511,-.08572888,.07286467,-.611899,-.5232627,-.4082253,-.5481608,-.827938,-.1551939,-.9621193,.9220031,-.3315949),this._distributions[17]=new Array(.197908,-.4697656,-.4474689,-.3428435,.8529873,-.2228634,.6022478,-.5469642,.2545276,-.931133,-.1507547,-.7855865,-.07606658,.1011628,.3046715,.2785755,.4698432,-.1064076,.6831254,.4152522,.1374381,.8363233,-.2166121,.6682042,.5511393,.7996449,-.4278994,.28836,-.8875198,.2181732,-.8772842,-.2818254,-.7000262,.5762185,-.6062385,-.7439126),this._distributions[18]=new Array(.6645703,-.05678739,.5720971,.4533803,-.07660709,.08802763,.5163431,-.4426552,.1163455,-.3404382,-.4004807,-.5046007,.2932099,-.8201418,-.5322125,.03834766,-.1490209,-.8817304,-.8000439,-.3509448,.5260983,.8421043,.1197811,.6963812,.9498612,.3122156,-.9285746,.02120355,-.6670724,.7217396,.9155889,-.3510147,-.271941,.4727852,.318879,.1634057,-.2686755,.9253026),this._distributions[19]=new Array(.5064292,.422527,.8935515,-.06610427,.1199719,.175568,.403388,-.2003276,.1657927,.8154403,.9301245,.2929218,-.1644068,.6201534,.7113559,-.6589743,-.3364046,-.1799502,.02109996,-.392765,-.382213,.3219992,-.9201946,.1207967,-.726185,.4291916,-.7443482,-.2480059,-.5147594,.7418784,.1935272,-.7406143,-.3643523,-.5559214,-.7147766,-.6326278,-.2524151,-.9096627,.5161405,.7908453),this._distributions[20]=new Array(.7921003,-.3032096,.5992879,-.009052323,.2538549,-.1872749,.7053444,.3677175,.5417761,-.8170255,.9749611,.1210478,.1969143,-.6117041,-.1824499,-.4634196,-.1181338,-.8668742,-.3050112,-.1352596,-.4409327,-.7082354,-.03225285,.1171548,.3113096,.3250439,-.8166144,-.463995,-.01014475,.4715334,-.6868284,.05091889,-.4011163,.2717285,-.06756835,.8307694,-.7938535,.4352129,-.4663842,.7165329,.559729,.8093995),this._distributions[21]=new Array(.07832243,.426151,-.3856795,.5799953,.01970797,.06706189,.4822682,.3014512,-.1532982,.87485,-.4959527,.07888043,.260601,-.2304784,.4996209,.7167382,.585986,-.04265174,-.7679967,.5509416,-.9041753,.1802134,-.8407655,-.4442826,-.2058258,-.2636995,-.4984115,-.5928579,.2926032,-.7886473,-.06933882,-.621177,.578115,-.4813387,.8981777,-.3291056,.1942733,.9255584,.8084362,.5066984,.9920095,.03103104,-.2403206,-.9389018),this._distributions[22]=new Array(-.5691095,.1014316,-.7788262,.384012,-.8253665,-.1645582,-.1830993,.002997211,-.2555013,-.4177977,-.6640869,-.4794711,-.2351242,.5850121,.02436554,.2825883,.006061143,-.8200245,.1618791,-.3063331,-.3765897,-.7249815,.6092919,-.6769328,-.5956934,.6957655,.5383642,.4522677,-.1489165,.9125596,.4167473,.1335986,.1898309,.5874342,.2288171,.9624356,.7540846,-.07672304,.8986252,.2788797,.3555991,-.9262139,.8454325,-.4027667,.4945236,-.2935512),this._distributions[23]=new Array(-.4481403,-.3758374,-.8877251,.08739938,.05015831,-.1339983,-.4070427,-.8534173,.1019274,-.5503222,-.445998,.1997541,-.8686263,-.2788867,-.7695944,-.6033704,-.05515742,-.885711,-.7714347,.5790485,.3466263,-.8799297,.4487582,-.5321087,-.2461368,.6053771,-.05568117,.2457351,-.4668669,.8523816,.8103387,-.4255538,.4054182,-.175663,-.2802011,-.08920153,.2665959,.382935,.555679,.1621837,.105246,.8420411,.6921161,.6902903,.880946,.2483067,.9699264,-.1021767),this._distributions[24]=new Array(-.1703323,-.3119385,.2916039,-.2988263,-.008472982,-.9277695,-.7730271,-.3277904,.3440474,-.6815342,-.2910278,.03461745,-.6764899,-.657078,-.3505501,-.7311988,-.03478927,.3258755,-.6048835,.159423,.2035525,.02212214,.5116573,.2226856,.6664805,-.2500189,.7147882,-.6609634,.03030632,-.5763278,-.2516585,.6116219,-.9434413,-.0116792,.9061816,.2491155,.182867,.6076167,.286593,.9485695,-.5992439,.6970096,-.2082874,.9416641,.9880044,-.1541709,-.9122881,.331555,.7324886,.6725098),this._distributions[25]=new Array(.3869598,-.04974834,.7168844,-.0693711,-.07166742,.1725325,.4599592,.3232779,.5872094,-.4198674,.2442266,-.625667,.1254557,.4500048,-.2290154,-.1803567,.890583,.3373493,.1256081,.7853789,-.2676466,.5305805,-.7063224,.252168,-.3989835,.1189921,.09617215,-.2451447,.6302541,.6085876,.9380925,-.3234899,.5086241,-.8573482,.03576187,-.9876697,-.0876712,-.6365195,-.5276513,.823456,-.6935764,-.2240411,-.5212318,-.5383121,-.2116208,.9639363,-.9840096,.02743555,-.3991577,-.8994547,-.7830126,.614068),this._distributions[26]=new Array(-.8366601,.4464895,-.5917366,-.02073906,-.9845258,.1635625,-.3097973,.4379579,-.5478154,.7173221,-.1685888,.9261969,.01503595,.6046097,.4452421,.5449086,.0315687,.1944619,.3753404,.8688548,.4143643,.1396648,.8711032,.4304703,.7328773,.1461501,.6374492,-.3521495,.145613,-.1341466,.9040975,-.135123,-.7839059,-.5450199,-.516019,-.3320859,-.206158,-.4431106,-.9703014,-.2368356,-.2473119,-.0864351,.2130725,-.4604077,-.003726701,-.7122303,-.4072131,-.6833169,.1632999,-.9776646,.4686888,-.680495,-.2293511,-.9509777),this._distributions[27]=new Array(.107311,-.1311369,-.4194764,-.3148777,.6171439,-.2745973,.2796618,.1937153,-.09106886,.4180236,.6044006,.05577846,.02927299,-.6738263,-.2580845,.1179939,-.09023564,-.3830024,.3570953,-.5000587,.81591,-.5518309,.9300217,-.1257987,.4904627,-.8381903,-.3163182,-.8632009,.1137595,-.9875998,.8390043,.3538185,.2149114,.4993694,.5191584,.3833552,.5002763,.7061465,-.2567276,.9068756,-.5197366,.3467845,.03668867,.9734009,-.5347553,.66747,-.9028882,.1023768,-.8967977,.412834,-.5821944,.0426479,-.8032165,-.2397038,-.5597343,-.6358021),this._distributions[28]=new Array(-.6562496,-.1781036,-.9301494,.1185208,-.3861143,-.4153562,-.1560799,-.1099607,-.5587025,.395218,-.5322112,-.699701,-.5008639,.08726846,-.970524,-.1963461,-.813577,-.5185111,-.1644458,.298,-.3216791,.639982,.3315373,.3339162,.2383235,-.00105722,.1137828,.5450742,-.01899921,.8798413,.2849685,.8255596,.6974412,.2123175,.7588523,.5470437,.5102502,-.1687844,.5853448,.8033476,.2590716,-.5262504,.5607718,-.6342825,.8666443,-.1491841,.8341052,-.4935003,-.1568441,-.6634066,.2512113,-.8769391,-.2559827,-.9572457,-.01928852,-.3966542,-.750667,.6409678),this._distributions[29]=new Array(.3454786,-.04837726,.2649553,.2406852,.5599093,-.3839145,-.1111814,-.05502108,.7586042,-.05818377,.2519488,-.4665135,-.1264972,.2602723,-.08766216,-.3671907,.6428129,.3999204,-.6105871,-.1246869,-.4589451,-.7646643,-.03021116,-.7899352,-.6036922,-.4293956,-.2481938,.6534185,.102798,.6784465,-.6392644,.4821358,-.6789002,.1779133,-.9140783,-.1989647,-.9262617,.3381507,.4794891,-.8093274,.3959447,.668478,.9602883,.2272305,-.123672,.9210883,.2375148,.9523395,-.52898,.7973378,-.382433,.1228794,.695015,.6948439,.7530277,-.6458191,.8777987,-.3272956,.2318525,-.962768),this._distributions[30]=new Array(.4518921,-.1146195,.4720805,-.4238748,.3655423,.1806341,.1589939,-.23568,.7673324,-.5149941,.01163658,.09045836,.7010971,.1245747,.7518286,-.1855433,.4960719,.4601022,.2566979,-.6308268,-.0654714,-.5126389,-.1823319,-.1343282,-.1464312,.4883236,-.3858738,.203523,.1484799,.4432284,-.477109,-.116241,.2719092,.7208626,.9104174,.3578536,-.5956199,.7662588,-.6996251,.3678654,-.2514512,.9251933,.1275825,-.9478135,-.204608,-.8611552,.4264838,-.877443,.9854161,.05521112,.5912951,.7997434,.1140349,.982093,-.9324368,-.2094094,-.42436,-.6441524,-.6722705,-.3554261,-.7844236,.08587621),this._distributions[31]=new Array(-.4206714,-.5613642,-.8733016,-.3373051,-.1046226,-.2902999,-.1318562,-.8434365,.1145093,-.5962623,-.4965627,-.1873259,-.5011808,-.8546229,-.7165636,-.5743566,.1090901,.2017643,.3404809,-.220455,-.1989015,.2372122,-.4538706,.0979171,.4514146,-.572846,.2314168,-.8514503,-.4247236,.5650803,-.943347,.04514639,-.1309718,.5221877,-.7004157,.4561877,.6306441,.04448673,.4301621,.5766876,.1078042,.7245752,.3875354,.2794483,.702876,-.2924213,.7360667,-.6210318,.7486517,.6531103,.4898235,.8591025,.6549174,.3854057,-.2596106,.7916998,.9251194,-.05296265,-.5620695,.820877,-.01228026,.9937211,.9612103,.2628758)},PoissonLookup.getDistribution=function(n){return this._distributions||this.initDistributions(),2>n||n>32?null:this._distributions[n-1]},PoissonLookup}();geom.PoissonLookup=PoissonLookup}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var Quaternion=function(){function Quaternion(x,y,z,w){"undefined"==typeof x&&(x=0),"undefined"==typeof y&&(y=0),"undefined"==typeof z&&(z=0),"undefined"==typeof w&&(w=1),this.x=0,this.y=0,this.z=0,this.w=1,this.x=x,this.y=y,this.z=z,this.w=w}return Object.defineProperty(Quaternion.prototype,"magnitude",{get:function(){return Math.sqrt(this.w*this.w+this.x*this.x+this.y*this.y+this.z*this.z)},enumerable:!0,configurable:!0}),Quaternion.prototype.multiply=function(qa,qb){var w1=qa.w,x1=qa.x,y1=qa.y,z1=qa.z,w2=qb.w,x2=qb.x,y2=qb.y,z2=qb.z;this.w=w1*w2-x1*x2-y1*y2-z1*z2,this.x=w1*x2+x1*w2+y1*z2-z1*y2,this.y=w1*y2-x1*z2+y1*w2+z1*x2,this.z=w1*z2+x1*y2-y1*x2+z1*w2},Quaternion.prototype.multiplyVector=function(vector,target){"undefined"==typeof target&&(target=null),null===target&&(target=new Quaternion);var x2=vector.x,y2=vector.y,z2=vector.z;return target.w=-this.x*x2-this.y*y2-this.z*z2,target.x=this.w*x2+this.y*z2-this.z*y2,target.y=this.w*y2-this.x*z2+this.z*x2,target.z=this.w*z2+this.x*y2-this.y*x2,target},Quaternion.prototype.fromAxisAngle=function(axis,angle){var sin_a=Math.sin(angle/2),cos_a=Math.cos(angle/2);this.x=axis.x*sin_a,this.y=axis.y*sin_a,this.z=axis.z*sin_a,this.w=cos_a,this.normalize()},Quaternion.prototype.slerp=function(qa,qb,t){var w1=qa.w,x1=qa.x,y1=qa.y,z1=qa.z,w2=qb.w,x2=qb.x,y2=qb.y,z2=qb.z,dot=w1*w2+x1*x2+y1*y2+z1*z2;if(0>dot&&(dot=-dot,w2=-w2,x2=-x2,y2=-y2,z2=-z2),.95>dot){var angle=Math.acos(dot),s=1/Math.sin(angle),s1=Math.sin(angle*(1-t))*s,s2=Math.sin(angle*t)*s;this.w=w1*s1+w2*s2,this.x=x1*s1+x2*s2,this.y=y1*s1+y2*s2,this.z=z1*s1+z2*s2}else{this.w=w1+t*(w2-w1),this.x=x1+t*(x2-x1),this.y=y1+t*(y2-y1),this.z=z1+t*(z2-z1);var len=1/Math.sqrt(this.w*this.w+this.x*this.x+this.y*this.y+this.z*this.z);this.w*=len,this.x*=len,this.y*=len,this.z*=len}},Quaternion.prototype.lerp=function(qa,qb,t){var len,w1=qa.w,x1=qa.x,y1=qa.y,z1=qa.z,w2=qb.w,x2=qb.x,y2=qb.y,z2=qb.z;0>w1*w2+x1*x2+y1*y2+z1*z2&&(w2=-w2,x2=-x2,y2=-y2,z2=-z2),this.w=w1+t*(w2-w1),this.x=x1+t*(x2-x1),this.y=y1+t*(y2-y1),this.z=z1+t*(z2-z1),len=1/Math.sqrt(this.w*this.w+this.x*this.x+this.y*this.y+this.z*this.z),this.w*=len,this.x*=len,this.y*=len,this.z*=len},Quaternion.prototype.fromEulerAngles=function(ax,ay,az){var halfX=.5*ax,halfY=.5*ay,halfZ=.5*az,cosX=Math.cos(halfX),sinX=Math.sin(halfX),cosY=Math.cos(halfY),sinY=Math.sin(halfY),cosZ=Math.cos(halfZ),sinZ=Math.sin(halfZ);this.w=cosX*cosY*cosZ+sinX*sinY*sinZ,this.x=sinX*cosY*cosZ-cosX*sinY*sinZ,this.y=cosX*sinY*cosZ+sinX*cosY*sinZ,this.z=cosX*cosY*sinZ-sinX*sinY*cosZ},Quaternion.prototype.toEulerAngles=function(target){return"undefined"==typeof target&&(target=null),null===target&&(target=new away.geom.Vector3D),target.x=Math.atan2(2*(this.w*this.x+this.y*this.z),1-2*(this.x*this.x+this.y*this.y)),target.y=Math.asin(2*(this.w*this.y-this.z*this.x)),target.z=Math.atan2(2*(this.w*this.z+this.x*this.y),1-2*(this.y*this.y+this.z*this.z)),target},Quaternion.prototype.normalize=function(val){"undefined"==typeof val&&(val=1);var mag=val/Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w);this.x*=mag,this.y*=mag,this.z*=mag,this.w*=mag},Quaternion.prototype.toString=function(){return"{x:"+this.x+" y:"+this.y+" z:"+this.z+" w:"+this.w+"}"},Quaternion.prototype.toMatrix3D=function(target){"undefined"==typeof target&&(target=null);var rawData=away.geom.Matrix3DUtils.RAW_DATA_CONTAINER,xy2=2*this.x*this.y,xz2=2*this.x*this.z,xw2=2*this.x*this.w,yz2=2*this.y*this.z,yw2=2*this.y*this.w,zw2=2*this.z*this.w,xx=this.x*this.x,yy=this.y*this.y,zz=this.z*this.z,ww=this.w*this.w;return rawData[0]=xx-yy-zz+ww,rawData[4]=xy2-zw2,rawData[8]=xz2+yw2,rawData[12]=0,rawData[1]=xy2+zw2,rawData[5]=-xx+yy-zz+ww,rawData[9]=yz2-xw2,rawData[13]=0,rawData[2]=xz2-yw2,rawData[6]=yz2+xw2,rawData[10]=-xx-yy+zz+ww,rawData[14]=0,rawData[3]=0,rawData[7]=0,rawData[11]=0,rawData[15]=1,target?(target.copyRawDataFrom(rawData),target):new away.geom.Matrix3D(rawData)},Quaternion.prototype.fromMatrix=function(matrix){var v=matrix.decompose(away.geom.Orientation3D.QUATERNION)[1];this.x=v.x,this.y=v.y,this.z=v.z,this.w=v.w},Quaternion.prototype.toRawData=function(target,exclude4thRow){"undefined"==typeof exclude4thRow&&(exclude4thRow=!1);var xy2=2*this.x*this.y,xz2=2*this.x*this.z,xw2=2*this.x*this.w,yz2=2*this.y*this.z,yw2=2*this.y*this.w,zw2=2*this.z*this.w,xx=this.x*this.x,yy=this.y*this.y,zz=this.z*this.z,ww=this.w*this.w;target[0]=xx-yy-zz+ww,target[1]=xy2-zw2,target[2]=xz2+yw2,target[4]=xy2+zw2,target[5]=-xx+yy-zz+ww,target[6]=yz2-xw2,target[8]=xz2-yw2,target[9]=yz2+xw2,target[10]=-xx-yy+zz+ww,target[3]=target[7]=target[11]=0,exclude4thRow||(target[12]=target[13]=target[14]=0,target[15]=1)},Quaternion.prototype.clone=function(){return new Quaternion(this.x,this.y,this.z,this.w)},Quaternion.prototype.rotatePoint=function(vector,target){"undefined"==typeof target&&(target=null);var x1,y1,z1,w1,x2=vector.x,y2=vector.y,z2=vector.z;return null===target&&(target=new away.geom.Vector3D),w1=-this.x*x2-this.y*y2-this.z*z2,x1=this.w*x2+this.y*z2-this.z*y2,y1=this.w*y2-this.x*z2+this.z*x2,z1=this.w*z2+this.x*y2-this.y*x2,target.x=-w1*this.x+x1*this.w-y1*this.z+z1*this.y,target.y=-w1*this.y+x1*this.z+y1*this.w-z1*this.x,target.z=-w1*this.z-x1*this.y+y1*this.x+z1*this.w,target -},Quaternion.prototype.copyFrom=function(q){this.x=q.x,this.y=q.y,this.z=q.z,this.w=q.w},Quaternion}();geom.Quaternion=Quaternion}(away.geom||(away.geom={}));away.geom}(away||(away={}));var away;!function(away){!function(geom){var Rectangle=function(){function Rectangle(x,y,width,height){"undefined"==typeof x&&(x=0),"undefined"==typeof y&&(y=0),"undefined"==typeof width&&(width=0),"undefined"==typeof height&&(height=0),this.x=x,this.y=y,this.width=width,this.height=height}return Object.defineProperty(Rectangle.prototype,"bottom",{get:function(){return this.y+this.height},enumerable:!0,configurable:!0}),Object.defineProperty(Rectangle.prototype,"bottomRight",{get:function(){return null==this._bottomRight&&(this._bottomRight=new geom.Point),this._bottomRight.x=this.x+this.width,this._bottomRight.y=this.y+this.height,this._bottomRight},enumerable:!0,configurable:!0}),Object.defineProperty(Rectangle.prototype,"left",{get:function(){return this.x},enumerable:!0,configurable:!0}),Object.defineProperty(Rectangle.prototype,"right",{get:function(){return this.x+this.width},enumerable:!0,configurable:!0}),Object.defineProperty(Rectangle.prototype,"size",{get:function(){return null==this._size&&(this._size=new geom.Point),this._size.x=this.width,this._size.y=this.height,this._size},enumerable:!0,configurable:!0}),Object.defineProperty(Rectangle.prototype,"top",{get:function(){return this.y},enumerable:!0,configurable:!0}),Object.defineProperty(Rectangle.prototype,"topLeft",{get:function(){return null==this._topLeft&&(this._topLeft=new geom.Point),this._topLeft.x=this.x,this._topLeft.y=this.y,this._topLeft},enumerable:!0,configurable:!0}),Rectangle.prototype.clone=function(){return new Rectangle(this.x,this.y,this.width,this.height)},Rectangle.prototype.contains=function(x,y){return this.x<=x&&this.x+this.width>=x&&this.y<=y&&this.y+this.height>=y},Rectangle.prototype.containsPoint=function(point){return this.x<=point.x&&this.x+this.width>=point.x&&this.y<=point.y&&this.y+this.height>=point.y},Rectangle.prototype.containsRect=function(rect){return this.x<=rect.x&&this.x+this.width>=rect.x+rect.width&&this.y<=rect.y&&this.y+this.height>=rect.y+rect.height},Rectangle.prototype.copyFrom=function(){},Rectangle.prototype.equals=function(toCompare){return this.x==toCompare.x&&this.y==toCompare.y&&this.width==toCompare.width&&this.height==toCompare.height},Rectangle.prototype.inflate=function(dx,dy){this.x-=dx/2,this.y-=dy/2,this.width+=dx/2,this.height+=dy/2},Rectangle.prototype.inflatePoint=function(point){this.x-=point.x/2,this.y-=point.y/2,this.width+=point.x/2,this.height+=point.y/2},Rectangle.prototype.intersection=function(toIntersect){if(this.intersects(toIntersect)){var i=new Rectangle;return this.x>toIntersect.x?(i.x=this.x,i.width=toIntersect.x-this.x+toIntersect.width,i.width>this.width&&(i.width=this.width)):(i.x=toIntersect.x,i.width=this.x-toIntersect.x+this.width,i.width>toIntersect.width&&(i.width=toIntersect.width)),this.y>toIntersect.y?(i.y=this.y,i.height=toIntersect.y-this.y+toIntersect.height,i.height>this.height&&(i.height=this.height)):(i.y=toIntersect.y,i.height=this.y-toIntersect.y+this.height,i.height>toIntersect.height&&(i.height=toIntersect.height)),i}return new Rectangle},Rectangle.prototype.intersects=function(toIntersect){return this.x+this.width>toIntersect.x&&this.xtoIntersect.y&&this.yi;)v=vertices[i++],minX>v?minX=v:v>maxX&&(maxX=v),v=vertices[i++],minY>v?minY=v:v>maxY&&(maxY=v),v=vertices[i++],minZ>v?minZ=v:v>maxZ&&(maxZ=v);this.fromExtremes(minX,minY,minZ,maxX,maxY,maxZ)},BoundingVolumeBase.prototype.fromGeometry=function(geometry){var i,j,p,subGeom,boundingPositions,minX,minY,minZ,maxX,maxY,maxZ,subGeoms=geometry.subGeometries,numSubGeoms=subGeoms.length;if(numSubGeoms>0){for(i=0,subGeom=subGeoms[0],boundingPositions=subGeom.getBoundingPositions(),minX=maxX=boundingPositions[i],minY=maxY=boundingPositions[i+1],minZ=maxZ=boundingPositions[i+2],j=numSubGeoms;j--;)for(subGeom=subGeoms[j],boundingPositions=subGeom.getBoundingPositions(),i=boundingPositions.length;i--;)p=boundingPositions[i],minX>p?minX=p:p>maxX&&(maxX=p),p=boundingPositions[i+1],minY>p?minY=p:p>maxY&&(maxY=p),p=boundingPositions[i+2],minZ>p?minZ=p:p>maxZ&&(maxZ=p);this.fromExtremes(minX,minY,minZ,maxX,maxY,maxZ)}else this.fromExtremes(0,0,0,0,0,0)},BoundingVolumeBase.prototype.fromSphere=function(center,radius){this.fromExtremes(center.x-radius,center.y-radius,center.z-radius,center.x+radius,center.y+radius,center.z+radius)},BoundingVolumeBase.prototype.fromExtremes=function(minX,minY,minZ,maxX,maxY,maxZ){this._aabb.x=minX,this._aabb.y=maxY,this._aabb.z=minZ,this._aabb.width=maxX-minX,this._aabb.height=maxY-minY,this._aabb.depth=maxZ-minZ,this._pAabbPointsDirty=!0,this._pBoundingEntity&&this.pUpdateBoundingEntity()},BoundingVolumeBase.prototype.isInFrustum=function(){throw new away.errors.AbstractMethodError},BoundingVolumeBase.prototype.overlaps=function(bounds){return this._aabb.intersects(bounds.aabb)},BoundingVolumeBase.prototype.clone=function(){throw new away.errors.AbstractMethodError},BoundingVolumeBase.prototype.rayIntersection=function(){return-1},BoundingVolumeBase.prototype.containsPoint=function(){return!1},BoundingVolumeBase.prototype.pUpdateAABBPoints=function(){var minX=this._aabb.x,minY=this._aabb.y-this._aabb.height,minZ=this._aabb.z,maxX=this._aabb.x+this._aabb.width,maxY=this._aabb.y,maxZ=this._aabb.z+this._aabb.depth;this._pAabbPoints[0]=minX,this._pAabbPoints[1]=minY,this._pAabbPoints[2]=minZ,this._pAabbPoints[3]=maxX,this._pAabbPoints[4]=minY,this._pAabbPoints[5]=minZ,this._pAabbPoints[6]=minX,this._pAabbPoints[7]=maxY,this._pAabbPoints[8]=minZ,this._pAabbPoints[9]=maxX,this._pAabbPoints[10]=maxY,this._pAabbPoints[11]=minZ,this._pAabbPoints[12]=minX,this._pAabbPoints[13]=minY,this._pAabbPoints[14]=maxZ,this._pAabbPoints[15]=maxX,this._pAabbPoints[16]=minY,this._pAabbPoints[17]=maxZ,this._pAabbPoints[18]=minX,this._pAabbPoints[19]=maxY,this._pAabbPoints[20]=maxZ,this._pAabbPoints[21]=maxX,this._pAabbPoints[22]=maxY,this._pAabbPoints[23]=maxZ,this._pAabbPointsDirty=!1},BoundingVolumeBase.prototype.pUpdateBoundingEntity=function(){throw new away.errors.AbstractMethodError},BoundingVolumeBase.prototype.pCreateBoundingEntity=function(){throw new away.errors.AbstractMethodError},BoundingVolumeBase.prototype.classifyToPlane=function(){throw new away.errors.AbstractMethodError},BoundingVolumeBase.prototype.transformFrom=function(){throw new away.errors.AbstractMethodError},BoundingVolumeBase}();_bounds.BoundingVolumeBase=BoundingVolumeBase}(away.bounds||(away.bounds={}));away.bounds}(away||(away={}));var away;!function(away){!function(_bounds){var PlaneClassification=away.geom.PlaneClassification,NullBounds=function(_super){function NullBounds(alwaysIn){"undefined"==typeof alwaysIn&&(alwaysIn=!0),_super.call(this),this._alwaysIn=alwaysIn,this._aabb.width=this._aabb.height=this._aabb.depth=Number.POSITIVE_INFINITY,this._aabb.x=this._aabb.y=this._aabb.z=this._alwaysIn?Number.NEGATIVE_INFINITY/2:Number.POSITIVE_INFINITY}return __extends(NullBounds,_super),NullBounds.prototype.clone=function(){return new NullBounds(this._alwaysIn)},NullBounds.prototype.pCreateBoundingEntity=function(){return null},NullBounds.prototype.isInFrustum=function(){return this._alwaysIn},NullBounds.prototype.fromSphere=function(){},NullBounds.prototype.fromExtremes=function(){},NullBounds.prototype.classifyToPlane=function(){return PlaneClassification.INTERSECT},NullBounds.prototype.transformFrom=function(bounds){this._alwaysIn=bounds._alwaysIn},NullBounds}(_bounds.BoundingVolumeBase);_bounds.NullBounds=NullBounds}(away.bounds||(away.bounds={}));away.bounds}(away||(away={}));var away;!function(away){!function(_bounds){var PlaneClassification=away.geom.PlaneClassification,Vector3D=away.geom.Vector3D,BoundingSphere=function(_super){function BoundingSphere(){_super.call(this),this._radius=0,this._centerX=0,this._centerY=0,this._centerZ=0}return __extends(BoundingSphere,_super),Object.defineProperty(BoundingSphere.prototype,"radius",{get:function(){return this._radius},enumerable:!0,configurable:!0}),BoundingSphere.prototype.nullify=function(){_super.prototype.nullify.call(this),this._centerX=this._centerY=this._centerZ=0,this._radius=0},BoundingSphere.prototype.isInFrustum=function(planes,numPlanes){for(var i=0;numPlanes>i;++i){var plane=planes[i],flippedExtentX=plane.a<0?-this._radius:this._radius,flippedExtentY=plane.b<0?-this._radius:this._radius,flippedExtentZ=plane.c<0?-this._radius:this._radius,projDist=plane.a*(this._centerX+flippedExtentX)+plane.b*(this._centerY+flippedExtentY)+plane.c*(this._centerZ+flippedExtentZ)-plane.d;if(0>projDist)return!1}return!0},BoundingSphere.prototype.fromSphere=function(center,radius){this._centerX=center.x,this._centerY=center.y,this._centerZ=center.z,this._radius=radius,this._aabb.width=this._aabb.height=this._aabb.depth=2*radius,this._aabb.x=this._centerX-radius,this._aabb.y=this._centerY+radius,this._aabb.z=this._centerZ-radius,this._pAabbPointsDirty=!0,this._pBoundingEntity&&this.pUpdateBoundingEntity()},BoundingSphere.prototype.fromExtremes=function(minX,minY,minZ,maxX,maxY,maxZ){this._centerX=.5*(maxX+minX),this._centerY=.5*(maxY+minY),this._centerZ=.5*(maxZ+minZ);var d=maxX-minX,y=maxY-minY,z=maxZ-minZ;y>d&&(d=y),z>d&&(d=z),this._radius=d*Math.sqrt(.5),_super.prototype.fromExtremes.call(this,minX,minY,minZ,maxX,maxY,maxZ)},BoundingSphere.prototype.clone=function(){var clone=new BoundingSphere;return clone.fromSphere(new Vector3D(this._centerX,this._centerY,this._centerZ),this._radius),clone},BoundingSphere.prototype.rayIntersection=function(position,direction,targetNormal){if(this.containsPoint(position))return 0;var rayEntryDistance,px=position.x-this._centerX,py=position.y-this._centerY,pz=position.z-this._centerZ,vx=direction.x,vy=direction.y,vz=direction.z,a=vx*vx+vy*vy+vz*vz,b=2*(px*vx+py*vy+pz*vz),c=px*px+py*py+pz*pz-this._radius*this._radius,det=b*b-4*a*c;if(det>=0){var sqrtDet=Math.sqrt(det);if(rayEntryDistance=(-b-sqrtDet)/(2*a),rayEntryDistance>=0)return targetNormal.x=px+rayEntryDistance*vx,targetNormal.y=py+rayEntryDistance*vy,targetNormal.z=pz+rayEntryDistance*vz,targetNormal.normalize(),rayEntryDistance}return-1},BoundingSphere.prototype.containsPoint=function(position){var px=position.x-this._centerX,py=position.y-this._centerY,pz=position.z-this._centerZ,distance=Math.sqrt(px*px+py*py+pz*pz);return distance<=this._radius},BoundingSphere.prototype.pUpdateBoundingEntity=function(){var sc=this._radius;0==sc&&(sc=.001);var transform=this._pBoundingEntity.transform;transform.scale=new Vector3D(sc,sc,sc),transform.position=new Vector3D(this._centerX,this._centerY,this._centerZ)},BoundingSphere.prototype.pCreateBoundingEntity=function(){return null},BoundingSphere.prototype.classifyToPlane=function(plane){var a=plane.a,b=plane.b,c=plane.c,dd=a*this._centerX+b*this._centerY+c*this._centerZ-plane.d;0>a&&(a=-a),0>b&&(b=-b),0>c&&(c=-c);var rr=(a+b+c)*this._radius;return dd>rr?PlaneClassification.FRONT:-rr>dd?PlaneClassification.BACK:PlaneClassification.INTERSECT},BoundingSphere.prototype.transformFrom=function(bounds,matrix){var sphere=bounds,cx=sphere._centerX,cy=sphere._centerY,cz=sphere._centerZ,raw=new Array(16);matrix.copyRawDataTo(raw);var m11=raw[0],m12=raw[4],m13=raw[8],m14=raw[12],m21=raw[1],m22=raw[5],m23=raw[9],m24=raw[13],m31=raw[2],m32=raw[6],m33=raw[10],m34=raw[14];this._centerX=cx*m11+cy*m12+cz*m13+m14,this._centerY=cx*m21+cy*m22+cz*m23+m24,this._centerZ=cx*m31+cy*m32+cz*m33+m34,0>m11&&(m11=-m11),0>m12&&(m12=-m12),0>m13&&(m13=-m13),0>m21&&(m21=-m21),0>m22&&(m22=-m22),0>m23&&(m23=-m23),0>m31&&(m31=-m31),0>m32&&(m32=-m32),0>m33&&(m33=-m33);var r=sphere._radius,rx=m11+m12+m13,ry=m21+m22+m23,rz=m31+m32+m33;this._radius=r*Math.sqrt(rx*rx+ry*ry+rz*rz),this._aabb.width=this._aabb.height=this._aabb.depth=2*this._radius,this._aabb.x=this._centerX-this._radius,this._aabb.y=this._centerY+this._radius,this._aabb.z=this._centerZ-this._radius},BoundingSphere}(_bounds.BoundingVolumeBase);_bounds.BoundingSphere=BoundingSphere}(away.bounds||(away.bounds={}));away.bounds}(away||(away={}));var away;!function(away){!function(_bounds){var Matrix3DUtils=away.geom.Matrix3DUtils,PlaneClassification=away.geom.PlaneClassification,Vector3D=away.geom.Vector3D,AxisAlignedBoundingBox=function(_super){function AxisAlignedBoundingBox(){_super.call(this),this._centerX=0,this._centerY=0,this._centerZ=0,this._halfExtentsX=0,this._halfExtentsY=0,this._halfExtentsZ=0}return __extends(AxisAlignedBoundingBox,_super),AxisAlignedBoundingBox.prototype.nullify=function(){_super.prototype.nullify.call(this),this._centerX=this._centerY=this._centerZ=0,this._halfExtentsX=this._halfExtentsY=this._halfExtentsZ=0},AxisAlignedBoundingBox.prototype.isInFrustum=function(planes,numPlanes){for(var i=0;numPlanes>i;++i){var plane=planes[i],a=plane.a,b=plane.b,c=plane.c,flippedExtentX=0>a?-this._halfExtentsX:this._halfExtentsX,flippedExtentY=0>b?-this._halfExtentsY:this._halfExtentsY,flippedExtentZ=0>c?-this._halfExtentsZ:this._halfExtentsZ,projDist=a*(this._centerX+flippedExtentX)+b*(this._centerY+flippedExtentY)+c*(this._centerZ+flippedExtentZ)-plane.d;if(0>projDist)return!1}return!0},AxisAlignedBoundingBox.prototype.rayIntersection=function(position,direction,targetNormal){if(this.containsPoint(position))return 0;var ix,iy,iz,rayEntryDistance,intersects,px=position.x-this._centerX,py=position.y-this._centerY,pz=position.z-this._centerZ,vx=direction.x,vy=direction.y,vz=direction.z;return 0>vx&&(rayEntryDistance=(this._halfExtentsX-px)/vx,rayEntryDistance>0&&(iy=py+rayEntryDistance*vy,iz=pz+rayEntryDistance*vz,iy>-this._halfExtentsY&&iy-this._halfExtentsZ&&iz0&&(rayEntryDistance=(-this._halfExtentsX-px)/vx,rayEntryDistance>0&&(iy=py+rayEntryDistance*vy,iz=pz+rayEntryDistance*vz,iy>-this._halfExtentsY&&iy-this._halfExtentsZ&&izvy&&(rayEntryDistance=(this._halfExtentsY-py)/vy,rayEntryDistance>0&&(ix=px+rayEntryDistance*vx,iz=pz+rayEntryDistance*vz,ix>-this._halfExtentsX&&ix-this._halfExtentsZ&&iz0&&(rayEntryDistance=(-this._halfExtentsY-py)/vy,rayEntryDistance>0&&(ix=px+rayEntryDistance*vx,iz=pz+rayEntryDistance*vz,ix>-this._halfExtentsX&&ix-this._halfExtentsZ&&izvz&&(rayEntryDistance=(this._halfExtentsZ-pz)/vz,rayEntryDistance>0&&(ix=px+rayEntryDistance*vx,iy=py+rayEntryDistance*vy,iy>-this._halfExtentsY&&iy-this._halfExtentsX&&ix0&&(rayEntryDistance=(-this._halfExtentsZ-pz)/vz,rayEntryDistance>0&&(ix=px+rayEntryDistance*vx,iy=py+rayEntryDistance*vy,iy>-this._halfExtentsY&&iy-this._halfExtentsX&&ix=-this._halfExtentsX&&py<=this._halfExtentsY&&py>=-this._halfExtentsY&&pz<=this._halfExtentsZ&&pz>=-this._halfExtentsZ},AxisAlignedBoundingBox.prototype.fromExtremes=function(minX,minY,minZ,maxX,maxY,maxZ){this._centerX=.5*(maxX+minX),this._centerY=.5*(maxY+minY),this._centerZ=.5*(maxZ+minZ),this._halfExtentsX=.5*(maxX-minX),this._halfExtentsY=.5*(maxY-minY),this._halfExtentsZ=.5*(maxZ-minZ),_super.prototype.fromExtremes.call(this,minX,minY,minZ,maxX,maxY,maxZ)},AxisAlignedBoundingBox.prototype.clone=function(){var clone=new AxisAlignedBoundingBox;return clone.fromExtremes(this._aabb.x,this._aabb.y+this._aabb.height,this._aabb.z,this._aabb.x+this._aabb.width,this._aabb.y,this._aabb.z+this._aabb.depth),clone},Object.defineProperty(AxisAlignedBoundingBox.prototype,"halfExtentsX",{get:function(){return this._halfExtentsX},enumerable:!0,configurable:!0}),Object.defineProperty(AxisAlignedBoundingBox.prototype,"halfExtentsY",{get:function(){return this._halfExtentsY},enumerable:!0,configurable:!0}),Object.defineProperty(AxisAlignedBoundingBox.prototype,"halfExtentsZ",{get:function(){return this._halfExtentsZ},enumerable:!0,configurable:!0}),AxisAlignedBoundingBox.prototype.closestPointToPoint=function(point,target){"undefined"==typeof target&&(target=null);var p;return null==target&&(target=new Vector3D),p=point.x,pthis._aabb.x+this._aabb.width&&(p=this._aabb.x+this._aabb.width),target.x=p,p=point.y,pthis._aabb.y&&(p=this._aabb.y),target.y=p,p=point.z,pthis._aabb.z+this._aabb.depth&&(p=this._aabb.z+this._aabb.depth),target.z=p,target},AxisAlignedBoundingBox.prototype.pUpdateBoundingRenderable=function(){this._pBoundingEntity.transform.scale.x=Math.max(2*this._halfExtentsX,.001),this._pBoundingEntity.transform.scale.y=Math.max(2*this._halfExtentsY,.001),this._pBoundingEntity.transform.scale.z=Math.max(2*this._halfExtentsZ,.001),this._pBoundingEntity.transform.position.x=this._centerX,this._pBoundingEntity.transform.position.y=this._centerY,this._pBoundingEntity.transform.position.z=this._centerZ},AxisAlignedBoundingBox.prototype.pCreateBoundingEntity=function(){return null},AxisAlignedBoundingBox.prototype.classifyToPlane=function(plane){var a=plane.a,b=plane.b,c=plane.c,centerDistance=a*this._centerX+b*this._centerY+c*this._centerZ-plane.d;0>a&&(a=-a),0>b&&(b=-b),0>c&&(c=-c);var boundOffset=a*this._halfExtentsX+b*this._halfExtentsY+c*this._halfExtentsZ;return centerDistance>boundOffset?PlaneClassification.FRONT:-boundOffset>centerDistance?PlaneClassification.BACK:PlaneClassification.INTERSECT},AxisAlignedBoundingBox.prototype.transformFrom=function(bounds,matrix){var aabb=bounds,cx=aabb._centerX,cy=aabb._centerY,cz=aabb._centerZ,raw=Matrix3DUtils.RAW_DATA_CONTAINER;matrix.copyRawDataTo(raw);var m11=raw[0],m12=raw[4],m13=raw[8],m14=raw[12],m21=raw[1],m22=raw[5],m23=raw[9],m24=raw[13],m31=raw[2],m32=raw[6],m33=raw[10],m34=raw[14];this._centerX=cx*m11+cy*m12+cz*m13+m14,this._centerY=cx*m21+cy*m22+cz*m23+m24,this._centerZ=cx*m31+cy*m32+cz*m33+m34,0>m11&&(m11=-m11),0>m12&&(m12=-m12),0>m13&&(m13=-m13),0>m21&&(m21=-m21),0>m22&&(m22=-m22),0>m23&&(m23=-m23),0>m31&&(m31=-m31),0>m32&&(m32=-m32),0>m33&&(m33=-m33);var hx=aabb._halfExtentsX,hy=aabb._halfExtentsY,hz=aabb._halfExtentsZ;this._halfExtentsX=hx*m11+hy*m12+hz*m13,this._halfExtentsY=hx*m21+hy*m22+hz*m23,this._halfExtentsZ=hx*m31+hy*m32+hz*m33,this._aabb.width=this._aabb.height=this._aabb.depth=2*this._halfExtentsX,this._aabb.x=this._centerX-this._halfExtentsX,this._aabb.y=this._centerY+this._halfExtentsY,this._aabb.z=this._centerZ-this._halfExtentsZ},AxisAlignedBoundingBox}(_bounds.BoundingVolumeBase);_bounds.AxisAlignedBoundingBox=AxisAlignedBoundingBox}(away.bounds||(away.bounds={}));away.bounds}(away||(away={}));var away;!function(away){!function(net){var URLRequest=function(){function URLRequest(url){"undefined"==typeof url&&(url=null),this.method=net.URLRequestMethod.GET,this.async=!0,this._url=url}return Object.defineProperty(URLRequest.prototype,"url",{get:function(){return this._url},set:function(value){this._url=value},enumerable:!0,configurable:!0}),URLRequest.prototype.dispose=function(){this.data=null,this._url=null},URLRequest}();net.URLRequest=URLRequest}(away.net||(away.net={}));away.net}(away||(away={}));var away;!function(away){!function(net){var URLLoaderDataFormat=function(){function URLLoaderDataFormat(){}return URLLoaderDataFormat.TEXT="text",URLLoaderDataFormat.VARIABLES="variables",URLLoaderDataFormat.BLOB="blob",URLLoaderDataFormat.ARRAY_BUFFER="arraybuffer",URLLoaderDataFormat.BINARY="binary",URLLoaderDataFormat}();net.URLLoaderDataFormat=URLLoaderDataFormat}(away.net||(away.net={}));away.net}(away||(away={}));var away;!function(away){!function(net){var URLRequestMethod=function(){function URLRequestMethod(){}return URLRequestMethod.POST="POST",URLRequestMethod.GET="GET",URLRequestMethod}();net.URLRequestMethod=URLRequestMethod}(away.net||(away.net={}));away.net}(away||(away={}));var away;!function(away){!function(net){var URLLoader=function(_super){function URLLoader(){_super.call(this),this._bytesLoaded=0,this._bytesTotal=0,this._dataFormat=net.URLLoaderDataFormat.TEXT,this._loadError=!1}return __extends(URLLoader,_super),Object.defineProperty(URLLoader.prototype,"url",{get:function(){return this._request?this._request.url:"" -},enumerable:!0,configurable:!0}),Object.defineProperty(URLLoader.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),Object.defineProperty(URLLoader.prototype,"dataFormat",{get:function(){return this._dataFormat},set:function(format){this._dataFormat=format},enumerable:!0,configurable:!0}),Object.defineProperty(URLLoader.prototype,"bytesLoaded",{get:function(){return this._bytesLoaded},enumerable:!0,configurable:!0}),Object.defineProperty(URLLoader.prototype,"bytesTotal",{get:function(){return this._bytesTotal},enumerable:!0,configurable:!0}),URLLoader.prototype.load=function(request){this._request=request,this.initXHR(),request.method===net.URLRequestMethod.POST?this.postRequest(request):this.getRequest(request)},URLLoader.prototype.close=function(){this._XHR.abort(),this.disposeXHR()},URLLoader.prototype.dispose=function(){this._XHR&&this._XHR.abort(),this.disposeXHR(),this._data=null,this._dataFormat=null,this._bytesLoaded=null,this._bytesTotal=null},URLLoader.prototype.setResponseType=function(xhr,responseType){switch(responseType){case net.URLLoaderDataFormat.ARRAY_BUFFER:case net.URLLoaderDataFormat.BLOB:case net.URLLoaderDataFormat.TEXT:xhr.responseType=responseType;break;case net.URLLoaderDataFormat.VARIABLES:xhr.responseType=net.URLLoaderDataFormat.TEXT;break;case net.URLLoaderDataFormat.BINARY:xhr.responseType=""}},URLLoader.prototype.getRequest=function(request){try{this._XHR.open(request.method,request.url,request.async),this.setResponseType(this._XHR,this._dataFormat),this._XHR.send()}catch(e){this.handleXmlHttpRequestException(e)}},URLLoader.prototype.postRequest=function(request){if(this._loadError=!1,this._XHR.open(request.method,request.url,request.async),null!=request.data)if(request.data instanceof net.URLVariables){var urlVars=request.data;try{this._XHR.responseType="text",this._XHR.send(urlVars.formData)}catch(e){this.handleXmlHttpRequestException(e)}}else this.setResponseType(this._XHR,this._dataFormat),request.data?this._XHR.send(request.data):this._XHR.send();else this._XHR.send()},URLLoader.prototype.handleXmlHttpRequestException=function(error){switch(error.code){case 101:}},URLLoader.prototype.initXHR=function(){var _this=this;this._XHR||(this._XHR=new XMLHttpRequest,this._XHR.onloadstart=function(event){return _this.onLoadStart(event)},this._XHR.onprogress=function(event){return _this.onProgress(event)},this._XHR.onabort=function(event){return _this.onAbort(event)},this._XHR.onerror=function(event){return _this.onLoadError(event)},this._XHR.onload=function(event){return _this.onLoadComplete(event)},this._XHR.ontimeout=function(event){return _this.onTimeOut(event)},this._XHR.onloadend=function(event){return _this.onLoadEnd(event)},this._XHR.onreadystatechange=function(event){return _this.onReadyStateChange(event)})},URLLoader.prototype.disposeXHR=function(){null!==this._XHR&&(this._XHR.onloadstart=null,this._XHR.onprogress=null,this._XHR.onabort=null,this._XHR.onerror=null,this._XHR.onload=null,this._XHR.ontimeout=null,this._XHR.onloadend=null,this._XHR=null)},URLLoader.prototype.decodeURLVariables=function(source){var result=new Object;source=source.split("+").join(" ");for(var tokens,re=/[?&]?([^=]+)=([^&]*)/g;tokens=re.exec(source);)result[decodeURIComponent(tokens[1])]=decodeURIComponent(tokens[2]);return result},URLLoader.prototype.onReadyStateChange=function(){4==this._XHR.readyState&&(404==this._XHR.status&&(this._loadError=!0,this._loadErrorEvent||(this._loadErrorEvent=new away.events.IOErrorEvent(away.events.IOErrorEvent.IO_ERROR)),this.dispatchEvent(this._loadErrorEvent)),this.dispatchEvent(new away.events.HTTPStatusEvent(away.events.HTTPStatusEvent.HTTP_STATUS,this._XHR.status)))},URLLoader.prototype.onLoadEnd=function(){this._loadError===!0},URLLoader.prototype.onTimeOut=function(){},URLLoader.prototype.onAbort=function(){},URLLoader.prototype.onProgress=function(event){this._progressEvent||(this._progressEvent=new away.events.ProgressEvent(away.events.ProgressEvent.PROGRESS)),this._progressEvent.bytesTotal=event.total,this._progressEvent.bytesLoaded=event.loaded,this.dispatchEvent(this._progressEvent)},URLLoader.prototype.onLoadStart=function(){this._loadStartEvent||(this._loadStartEvent=new away.events.Event(away.events.Event.OPEN)),this.dispatchEvent(this._loadStartEvent)},URLLoader.prototype.onLoadComplete=function(){if(this._loadError!==!0){switch(this._dataFormat){case net.URLLoaderDataFormat.TEXT:this._data=this._XHR.responseText;break;case net.URLLoaderDataFormat.VARIABLES:this._data=this.decodeURLVariables(this._XHR.responseText);break;case net.URLLoaderDataFormat.BLOB:case net.URLLoaderDataFormat.ARRAY_BUFFER:case net.URLLoaderDataFormat.BINARY:this._data=this._XHR.response;break;default:this._data=this._XHR.responseText}this._loadCompleteEvent||(this._loadCompleteEvent=new away.events.Event(away.events.Event.COMPLETE)),this.dispatchEvent(this._loadCompleteEvent)}},URLLoader.prototype.onLoadError=function(){this._loadError=!0,this._loadErrorEvent||(this._loadErrorEvent=new away.events.IOErrorEvent(away.events.IOErrorEvent.IO_ERROR)),this.dispatchEvent(this._loadErrorEvent)},URLLoader}(away.events.EventDispatcher);net.URLLoader=URLLoader}(away.net||(away.net={}));away.net}(away||(away={}));var away;!function(away){!function(net){var URLVariables=function(){function URLVariables(source){"undefined"==typeof source&&(source=null),this._variables=new Object,null!==source&&this.decode(source)}return URLVariables.prototype.decode=function(source){source=source.split("+").join(" ");for(var tokens,re=/[?&]?([^=]+)=([^&]*)/g;tokens=re.exec(source);)this._variables[decodeURIComponent(tokens[1])]=decodeURIComponent(tokens[2])},URLVariables.prototype.toString=function(){return""},Object.defineProperty(URLVariables.prototype,"variables",{get:function(){return this._variables},set:function(obj){this._variables=obj},enumerable:!0,configurable:!0}),Object.defineProperty(URLVariables.prototype,"formData",{get:function(){var fd=new FormData;for(var s in this._variables)fd.append(s,this._variables[s]);return fd},enumerable:!0,configurable:!0}),URLVariables}();net.URLVariables=URLVariables}(away.net||(away.net={}));away.net}(away||(away={}));var away;!function(away){!function(library){var AbstractMethodError=away.errors.AbstractMethodError,NamedAssetBase=function(_super){function NamedAssetBase(name){"undefined"==typeof name&&(name=null),_super.call(this),this._id=NamedAssetBase.ID_COUNT++,null==name&&(name="null"),this._name=name,this._originalName=name,this.updateFullPath()}return __extends(NamedAssetBase,_super),Object.defineProperty(NamedAssetBase.prototype,"assetType",{get:function(){throw new AbstractMethodError},enumerable:!0,configurable:!0}),Object.defineProperty(NamedAssetBase.prototype,"originalName",{get:function(){return this._originalName},enumerable:!0,configurable:!0}),Object.defineProperty(NamedAssetBase.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(NamedAssetBase.prototype,"name",{get:function(){return this._name},set:function(val){var prev;prev=this._name,this._name=val,null==this._name&&(this._name="null"),this.updateFullPath(),this.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.ASSET_RENAME,this,prev))},enumerable:!0,configurable:!0}),NamedAssetBase.prototype.dispose=function(){throw new AbstractMethodError},Object.defineProperty(NamedAssetBase.prototype,"assetNamespace",{get:function(){return this._namespace},enumerable:!0,configurable:!0}),Object.defineProperty(NamedAssetBase.prototype,"assetFullPath",{get:function(){return this._full_path},enumerable:!0,configurable:!0}),NamedAssetBase.prototype.assetPathEquals=function(name,ns){return this._name==name&&(!ns||this._namespace==ns)},NamedAssetBase.prototype.resetAssetPath=function(name,ns,overrideOriginal){"undefined"==typeof ns&&(ns=null),"undefined"==typeof overrideOriginal&&(overrideOriginal=!0),this._name=name?name:"null",this._namespace=ns?ns:NamedAssetBase.DEFAULT_NAMESPACE,overrideOriginal&&(this._originalName=this._name),this.updateFullPath()},NamedAssetBase.prototype.updateFullPath=function(){this._full_path=[this._namespace,this._name]},NamedAssetBase.ID_COUNT=0,NamedAssetBase.DEFAULT_NAMESPACE="default",NamedAssetBase}(away.events.EventDispatcher);library.NamedAssetBase=NamedAssetBase}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var AssetType=function(){function AssetType(){}return AssetType.ANIMATION_NODE="animationNode",AssetType.ANIMATION_SET="animationSet",AssetType.ANIMATION_STATE="animationState",AssetType.ANIMATOR="animator",AssetType.BILLBOARD="billboard",AssetType.CAMERA="camera",AssetType.CONTAINER="container",AssetType.EFFECTS_METHOD="effectsMethod",AssetType.GEOMETRY="geometry",AssetType.LINE_SEGMENT="lineSegment",AssetType.LIGHT="light",AssetType.LIGHT_PICKER="lightPicker",AssetType.MATERIAL="material",AssetType.MESH="mesh",AssetType.TRIANGLE_SUB_MESH="triangleSubMesh",AssetType.LINE_SUB_MESH="lineSubMesh",AssetType.PRIMITIVE_PREFAB="primitivePrefab",AssetType.SHADOW_MAP_METHOD="shadowMapMethod",AssetType.SKELETON="skeleton",AssetType.SKELETON_POSE="skeletonPose",AssetType.SKYBOX="skybox",AssetType.STATE_TRANSITION="stateTransition",AssetType.TEXTURE="texture",AssetType.TEXTURE_PROJECTOR="textureProjector",AssetType}();library.AssetType=AssetType}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(display){var ContextMode=function(){function ContextMode(){}return ContextMode.AUTO="auto",ContextMode.WEBGL="webgl",ContextMode.FLASH="flash",ContextMode.NATIVE="native",ContextMode}();display.ContextMode=ContextMode}(away.display||(away.display={}));away.display}(away||(away={}));var away;!function(away){!function(){}(away.display||(away.display={}));away.display}(away||(away={}));var away;!function(away){!function(base){var BlendMode=function(){function BlendMode(){}return BlendMode.ADD="add",BlendMode.ALPHA="alpha",BlendMode.DARKEN="darken",BlendMode.DIFFERENCE="difference",BlendMode.ERASE="erase",BlendMode.HARDLIGHT="hardlight",BlendMode.INVERT="invert",BlendMode.LAYER="layer",BlendMode.LIGHTEN="lighten",BlendMode.MULTIPLY="multiply",BlendMode.NORMAL="normal",BlendMode.OVERLAY="overlay",BlendMode.SCREEN="screen",BlendMode.SHADER="shader",BlendMode.SUBTRACT="subtract",BlendMode}();base.BlendMode=BlendMode}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var AlignmentMode=function(){function AlignmentMode(){}return AlignmentMode.REGISTRATION_POINT="registrationPoint",AlignmentMode.PIVOT_POINT="pivot",AlignmentMode}();base.AlignmentMode=AlignmentMode}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var OrientationMode=function(){function OrientationMode(){}return OrientationMode.DEFAULT="default",OrientationMode.CAMERA_PLANE="cameraPlane",OrientationMode.CAMERA_POSITION="cameraPosition",OrientationMode}();base.OrientationMode=OrientationMode}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var Rectangle=away.geom.Rectangle,ColorUtils=away.utils.ColorUtils,BitmapData=function(){function BitmapData(width,height,transparent,fillColor){"undefined"==typeof transparent&&(transparent=!0),"undefined"==typeof fillColor&&(fillColor=null),this._alpha=1,this._locked=!1,this._transparent=transparent,this._imageCanvas=document.createElement("canvas"),this._imageCanvas.width=width,this._imageCanvas.height=height,this._context=this._imageCanvas.getContext("2d"),this._rect=new Rectangle(0,0,width,height),null!=fillColor&&(this._alpha=this._transparent?away.utils.ColorUtils.float32ColorToARGB(fillColor)[0]/255:1,this.fillRect(this._rect,fillColor))}return BitmapData.prototype.dispose=function(){this._context=null,this._imageCanvas=null,this._imageData=null,this._rect=null,this._transparent=null,this._locked=null},BitmapData.prototype.lock=function(){this._locked=!0,this._imageData=this._context.getImageData(0,0,this._rect.width,this._rect.height)},BitmapData.prototype.unlock=function(){this._locked=!1,this._imageData&&(this._context.putImageData(this._imageData,0,0),this._imageData=null)},BitmapData.prototype.getPixel=function(x,y){var r,g,b,a;if(this._locked){var index=4*(x+y*this._imageCanvas.width);this._imageData||(this._imageData=this._context.getImageData(0,0,this._rect.width,this._rect.height)),r=this._imageData.data[index+0],g=this._imageData.data[index+1],b=this._imageData.data[index+2],a=this._imageData.data[index+3]}else{var pixelData=this._context.getImageData(x,y,1,1);r=pixelData.data[0],g=pixelData.data[1],b=pixelData.data[2],a=pixelData.data[3]}return this._locked||(this._imageData=null),a<<24|r<<16|g<<8|b},BitmapData.prototype.setPixel=function(x,y,color){var argb=away.utils.ColorUtils.float32ColorToARGB(color);if(this._locked||(this._imageData=this._context.getImageData(0,0,this._rect.width,this._rect.height)),this._imageData){var index=4*(x+y*this._imageCanvas.width);this._imageData.data[index+0]=argb[1],this._imageData.data[index+1]=argb[2],this._imageData.data[index+2]=argb[3],this._imageData.data[index+3]=255}this._locked||(this._context.putImageData(this._imageData,0,0),this._imageData=null)},BitmapData.prototype.setPixels=function(rect,inputByteArray){if(this._locked||(this._imageData=this._context.getImageData(0,0,this._rect.width,this._rect.height)),this._imageData){inputByteArray.position=0;var i,j,index;for(i=0;irayEntryDistance?!1:(pickingCollisionVO.rayEntryDistance=rayEntryDistance,pickingCollisionVO.localRayPosition=localRayPosition,pickingCollisionVO.localRayDirection=localRayDirection,pickingCollisionVO.rayPosition=rayPosition,pickingCollisionVO.rayDirection=rayDirection,pickingCollisionVO.rayOriginIsInsideBounds=0==rayEntryDistance,!0)},DisplayObject.prototype.local3DToGlobal=function(){return new away.geom.Point},DisplayObject.prototype.lookAt=function(target,upAxis){"undefined"==typeof upAxis&&(upAxis=null);var yAxis,zAxis,xAxis,raw;null==upAxis?upAxis=away.geom.Vector3D.Y_AXIS:upAxis.normalize(),zAxis=target.subtract(this._iMatrix3D.position),zAxis.normalize(),xAxis=upAxis.crossProduct(zAxis),xAxis.normalize(),xAxis.length<.05&&(xAxis.x=upAxis.y,xAxis.y=upAxis.x,xAxis.z=0,xAxis.normalize()),yAxis=zAxis.crossProduct(xAxis),raw=away.geom.Matrix3DUtils.RAW_DATA_CONTAINER,raw[0]=xAxis.x,raw[1]=xAxis.y,raw[2]=xAxis.z,raw[3]=0,raw[4]=yAxis.x,raw[5]=yAxis.y,raw[6]=yAxis.z,raw[7]=0,raw[8]=zAxis.x,raw[9]=zAxis.y,raw[10]=zAxis.z,raw[11]=0;var m=new away.geom.Matrix3D;m.copyRawDataFrom(raw);var vec=m.decompose()[1];this._rotationX=vec.x,this._rotationY=vec.y,this._rotationZ=vec.z,this.invalidateRotation()},DisplayObject.prototype.localToGlobal=function(){return new away.geom.Point},DisplayObject.prototype.moveTo=function(dx,dy,dz){(this._x!=dx||this._y!=dy||this._z!=dz)&&(this._x=dx,this._y=dy,this._z=dz,this.invalidatePosition())},DisplayObject.prototype.movePivot=function(dx,dy,dz){null==this._pivot&&(this._pivot=new away.geom.Vector3D),this._pivot.x+=dx,this._pivot.y+=dy,this._pivot.z+=dz,this.invalidatePivot()},DisplayObject.prototype.pitch=function(angle){this.rotate(away.geom.Vector3D.X_AXIS,angle)},DisplayObject.prototype.getRenderSceneTransform=function(camera){if(this.orientationMode==base.OrientationMode.CAMERA_PLANE){var comps=camera.sceneTransform.decompose(),scale=comps[2];return comps[0]=this.scenePosition,scale.x=this._pScaleX,scale.y=this._pScaleY,scale.z=this._pScaleZ,this._orientationMatrix.recompose(comps),this._pivotZero||this.alignmentMode!=base.AlignmentMode.PIVOT_POINT||this._orientationMatrix.prependTranslation(-this._pivot.x/this._pScaleX,-this._pivot.y/this._pScaleY,-this._pivot.z/this._pScaleZ),this._orientationMatrix}return this.sceneTransform},DisplayObject.prototype.roll=function(angle){this.rotate(away.geom.Vector3D.Z_AXIS,angle)},DisplayObject.prototype.rotate=function(axis,angle){var m=new away.geom.Matrix3D;m.prependRotation(angle,axis);var vec=m.decompose()[1];this._rotationX+=vec.x,this._rotationY+=vec.y,this._rotationZ+=vec.z,this.invalidateRotation()},DisplayObject.prototype.rotateTo=function(ax,ay,az){this._rotationX=ax*away.geom.MathConsts.DEGREES_TO_RADIANS,this._rotationY=ay*away.geom.MathConsts.DEGREES_TO_RADIANS,this._rotationZ=az*away.geom.MathConsts.DEGREES_TO_RADIANS,this.invalidateRotation()},DisplayObject.prototype.removeEventListener=function(type,listener){if(_super.prototype.removeEventListener.call(this,type,listener),!this.hasEventListener(type,listener))switch(type){case away.events.DisplayObjectEvent.POSITION_CHANGED:this._listenToPositionChanged=!1;break;case away.events.DisplayObjectEvent.ROTATION_CHANGED:this._listenToRotationChanged=!1;break;case away.events.DisplayObjectEvent.SCALE_CHANGED:this._listenToScaleChanged=!1}},DisplayObject.prototype.translate=function(axis,distance){var x=axis.x,y=axis.y,z=axis.z,len=distance/Math.sqrt(x*x+y*y+z*z);this._x+=x*len,this._y+=y*len,this._z+=z*len,this.invalidatePosition()},DisplayObject.prototype.translateLocal=function(axis,distance){var x=axis.x,y=axis.y,z=axis.z,len=distance/Math.sqrt(x*x+y*y+z*z);this._iMatrix3D.prependTranslation(x*len,y*len,z*len),this._matrix3D.copyColumnTo(3,this._pos),this._x=this._pos.x,this._y=this._pos.y,this._z=this._pos.z,this.invalidatePosition()},DisplayObject.prototype.yaw=function(angle){this.rotate(away.geom.Vector3D.Y_AXIS,angle)},Object.defineProperty(DisplayObject.prototype,"_iAssignedPartition",{get:function(){return this._pImplicitPartition},enumerable:!0,configurable:!0}),Object.defineProperty(DisplayObject.prototype,"_iMatrix3D",{get:function(){return this._matrix3DDirty&&this._pUpdateMatrix3D(),this._matrix3D},set:function(val){var vec,elements=val.decompose();vec=elements[0],(this._x!=vec.x||this._y!=vec.y||this._z!=vec.z)&&(this._x=vec.x,this._y=vec.y,this._z=vec.z,this.invalidatePosition()),vec=elements[1],(this._rotationX!=vec.x||this._rotationY!=vec.y||this._rotationZ!=vec.z)&&(this._rotationX=vec.x,this._rotationY=vec.y,this._rotationZ=vec.z,this.invalidateRotation()),vec=elements[2],(this._pScaleX!=vec.x||this._pScaleY!=vec.y||this._pScaleZ!=vec.z)&&(this._pScaleX=vec.x,this._pScaleY=vec.y,this._pScaleZ=vec.z,this.invalidateScale())},enumerable:!0,configurable:!0}),Object.defineProperty(DisplayObject.prototype,"_iPickingCollisionVO",{get:function(){return this._pPickingCollisionVO||(this._pPickingCollisionVO=new away.pick.PickingCollisionVO(this)),this._pPickingCollisionVO},enumerable:!0,configurable:!0}),DisplayObject.prototype.iSetParent=function(value){this._pParent=value,value?(this._pUpdateImplicitMouseEnabled(value.mouseChildren),this._pUpdateImplicitVisibility(value._iIsVisible()),this._pUpdateImplicitPartition(value._iAssignedPartition),this._iSetScene(value._pScene)):(this._pUpdateImplicitMouseEnabled(!0),this._pUpdateImplicitVisibility(!0),this._pUpdateImplicitPartition(null),this._iSetScene(null))},DisplayObject.prototype.pCreateDefaultBoundingVolume=function(){return new away.bounds.AxisAlignedBoundingBox},DisplayObject.prototype.pCreateEntityPartitionNode=function(){throw new away.errors.AbstractMethodError},DisplayObject.prototype.pInvalidateBounds=function(){this._pBoundsInvalid=!0,this._worldBoundsInvalid=!0,this.isEntity&&this.invalidatePartition()},DisplayObject.prototype.pInvalidateSceneTransform=function(){this._pSceneTransformDirty=!this._pIgnoreTransform,this._inverseSceneTransformDirty=!this._pIgnoreTransform,this._scenePositionDirty=!this._pIgnoreTransform,this._worldBoundsInvalid=!this._pIgnoreTransform,this.isEntity&&this.invalidatePartition(),this._listenToSceneTransformChanged&&this.notifySceneTransformChange()},DisplayObject.prototype.pUpdateBounds=function(){this._width=this._pBounds.aabb.width*this._pScaleX,this._height=this._pBounds.aabb.height*this._pScaleY,this._depth=this._pBounds.aabb.depth*this._pScaleZ,this._pBoundsInvalid=!1},DisplayObject.prototype._pUpdateImplicitMouseEnabled=function(value){this._pImplicitMouseEnabled=this._explicitMouseEnabled&&value,this._pImplicitMouseEnabled&&this._pParent&&!this._pPickingCollider&&(this._pPickingCollider=this._pParent._pPickingCollider)},DisplayObject.prototype._pUpdateImplicitPartition=function(value){this._pImplicitPartition=this._explicitPartition||value},DisplayObject.prototype._pUpdateImplicitVisibility=function(value){this._pImplicitVisibility=this._explicitVisibility&&value},DisplayObject.prototype._pUpdateMatrix3D=function(){this._pos.x=this._x,this._pos.y=this._y,this._pos.z=this._z,this._rot.x=this._rotationX,this._rot.y=this._rotationY,this._rot.z=this._rotationZ,this._sca.x=this._pScaleX,this._sca.y=this._pScaleY,this._sca.z=this._pScaleZ,this._matrix3D.recompose(this._transformComponents),this._pivotZero||(this._matrix3D.prependTranslation(-this._pivot.x/this._pScaleX,-this._pivot.y/this._pScaleY,-this._pivot.z/this._pScaleZ),this.alignmentMode!=base.AlignmentMode.PIVOT_POINT&&this._matrix3D.appendTranslation(this._pivot.x,this._pivot.y,this._pivot.z)),this._matrix3DDirty=!1,this._positionDirty=!1,this._rotationDirty=!1,this._scaleDirty=!1,this._pivotDirty=!1},DisplayObject.prototype.pUpdateSceneTransform=function(){this._pParent&&!this._pParent._iIsRoot?(this._pSceneTransform.copyFrom(this._pParent.sceneTransform),this._pSceneTransform.prepend(this._iMatrix3D)):this._pSceneTransform.copyFrom(this._iMatrix3D),this._pSceneTransformDirty=!1},DisplayObject.prototype._iAddRenderable=function(renderable){return this._pRenderables.push(renderable),renderable},DisplayObject.prototype._iRemoveRenderable=function(renderable){var index=this._pRenderables.indexOf(renderable);return this._pRenderables.splice(index,1),renderable},DisplayObject.prototype._iTestCollision=function(){return!1},DisplayObject.prototype._iInternalUpdate=function(){this._iController&&this._iController.update()},DisplayObject.prototype._iIsVisible=function(){return this._pImplicitVisibility},DisplayObject.prototype._iIsMouseEnabled=function(){return this._pImplicitMouseEnabled},DisplayObject.prototype._iSetScene=function(value){this._pScene!=value&&(this._pUpdateScene(value),this._pSceneTransformDirty||this._pIgnoreTransform||this.pInvalidateSceneTransform())},DisplayObject.prototype._pUpdateScene=function(value){this._pScene&&(this._pScene.dispatchEvent(new away.events.SceneEvent(away.events.SceneEvent.REMOVED_FROM_SCENE,this)),this._pScene.iUnregisterEntity(this)),this._pScene=value,value&&(value.dispatchEvent(new away.events.SceneEvent(away.events.SceneEvent.ADDED_TO_SCENE,this)),value.iRegisterEntity(this)),this.notifySceneChange()},DisplayObject.prototype.notifyPositionChanged=function(){this._positionChanged||(this._positionChanged=new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.POSITION_CHANGED,this)),this.dispatchEvent(this._positionChanged)},DisplayObject.prototype.notifyRotationChanged=function(){this._rotationChanged||(this._rotationChanged=new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.ROTATION_CHANGED,this)),this.dispatchEvent(this._rotationChanged)},DisplayObject.prototype.notifyScaleChanged=function(){this._scaleChanged||(this._scaleChanged=new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCALE_CHANGED,this)),this.dispatchEvent(this._scaleChanged)},DisplayObject.prototype.notifySceneChange=function(){this._listenToSceneChanged&&(this._scenechanged||(this._scenechanged=new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCENE_CHANGED,this)),this.dispatchEvent(this._scenechanged))},DisplayObject.prototype.notifySceneTransformChange=function(){this._sceneTransformChanged||(this._sceneTransformChanged=new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCENETRANSFORM_CHANGED,this)),this.dispatchEvent(this._sceneTransformChanged)},DisplayObject.prototype.invalidateMatrix3D=function(){this._matrix3DDirty||(this._matrix3DDirty=!0,this._pSceneTransformDirty||this._pIgnoreTransform||this.pInvalidateSceneTransform())},DisplayObject.prototype.invalidatePartition=function(){this._iAssignedPartition&&this._iAssignedPartition.iMarkForUpdate(this)},DisplayObject.prototype.invalidatePivot=function(){this._pivotZero=0==this._pivot.x&&0==this._pivot.y&&0==this._pivot.z,this._pivotDirty||(this._pivotDirty=!0,this.invalidateMatrix3D())},DisplayObject.prototype.invalidatePosition=function(){this._positionDirty||(this._positionDirty=!0,this.invalidateMatrix3D(),this._listenToPositionChanged&&this.notifyPositionChanged())},DisplayObject.prototype.invalidateRotation=function(){this._rotationDirty||(this._rotationDirty=!0,this.invalidateMatrix3D(),this._listenToRotationChanged&&this.notifyRotationChanged())},DisplayObject.prototype.invalidateScale=function(){this._scaleDirty||(this._scaleDirty=!0,this.invalidateMatrix3D(),this._listenToScaleChanged&&this.notifyScaleChanged())},DisplayObject}(away.library.NamedAssetBase);base.DisplayObject=DisplayObject}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var Geometry=function(_super){function Geometry(){_super.call(this),this._subGeometries=new Array}return __extends(Geometry,_super),Object.defineProperty(Geometry.prototype,"assetType",{get:function(){return away.library.AssetType.GEOMETRY},enumerable:!0,configurable:!0}),Object.defineProperty(Geometry.prototype,"subGeometries",{get:function(){return this._subGeometries},enumerable:!0,configurable:!0}),Geometry.prototype.getSubGeometries=function(){return this._subGeometries},Geometry.prototype.applyTransformation=function(transform){for(var len=this._subGeometries.length,i=0;len>i;++i)this._subGeometries[i].applyTransformation(transform)},Geometry.prototype.addSubGeometry=function(subGeometry){this._subGeometries.push(subGeometry),subGeometry.parentGeometry=this,this.hasEventListener(away.events.GeometryEvent.SUB_GEOMETRY_ADDED)&&this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.SUB_GEOMETRY_ADDED,subGeometry)),this.iInvalidateBounds(subGeometry)},Geometry.prototype.removeSubGeometry=function(subGeometry){this._subGeometries.splice(this._subGeometries.indexOf(subGeometry),1),subGeometry.parentGeometry=null,this.hasEventListener(away.events.GeometryEvent.SUB_GEOMETRY_REMOVED)&&this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.SUB_GEOMETRY_REMOVED,subGeometry)),this.iInvalidateBounds(subGeometry)},Geometry.prototype.clone=function(){for(var clone=new Geometry,len=this._subGeometries.length,i=0;len>i;++i)clone.addSubGeometry(this._subGeometries[i].clone());return clone},Geometry.prototype.scale=function(scale){for(var numSubGeoms=this._subGeometries.length,i=0;numSubGeoms>i;++i)this._subGeometries[i].scale(scale)},Geometry.prototype.dispose=function(){for(var numSubGeoms=this._subGeometries.length,i=0;numSubGeoms>i;++i){var subGeom=this._subGeometries[0];this.removeSubGeometry(subGeom),subGeom.dispose()}},Geometry.prototype.scaleUV=function(scaleU,scaleV){"undefined"==typeof scaleU&&(scaleU=1),"undefined"==typeof scaleV&&(scaleV=1);for(var numSubGeoms=this._subGeometries.length,i=0;numSubGeoms>i;++i)this._subGeometries[i].scaleUV(scaleU,scaleV)},Geometry.prototype.iInvalidateBounds=function(subGeom){this.hasEventListener(away.events.GeometryEvent.BOUNDS_INVALID)&&this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.BOUNDS_INVALID,subGeom))},Geometry}(away.library.NamedAssetBase);base.Geometry=Geometry}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var GradientType=function(){function GradientType(){}return GradientType.LINEAR="linear",GradientType.RADIAL="radial",GradientType}();base.GradientType=GradientType}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var Graphics=function(){function Graphics(){}return Graphics.prototype.beginBitmapFill=function(bitmap,matrix,repeat,smooth){"undefined"==typeof matrix&&(matrix=null),"undefined"==typeof repeat&&(repeat=!0),"undefined"==typeof smooth&&(smooth=!1)},Graphics.prototype.beginFill=function(color,alpha){"undefined"==typeof alpha&&(alpha=1)},Graphics.prototype.beginGradientFill=function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio){"undefined"==typeof matrix&&(matrix=null),"undefined"==typeof spreadMethod&&(spreadMethod="pad"),"undefined"==typeof interpolationMethod&&(interpolationMethod="rgb"),"undefined"==typeof focalPointRatio&&(focalPointRatio=0)},Graphics.prototype.clear=function(){},Graphics.prototype.copyFrom=function(){},Graphics.prototype.cubicCurveTo=function(){},Graphics.prototype.curveTo=function(){},Graphics.prototype.drawCircle=function(){},Graphics.prototype.drawEllipse=function(){},Graphics.prototype.drawGraphicsData=function(){},Graphics.prototype.drawPath=function(){},Graphics.prototype.drawRect=function(){},Graphics.prototype.drawRoundRect=function(x,y,width,height,ellipseWidth,ellipseHeight){"undefined"==typeof ellipseHeight&&(ellipseHeight=0/0)},Graphics.prototype.drawTriangles=function(vertices,indices,uvtData,culling){"undefined"==typeof indices&&(indices=null),"undefined"==typeof uvtData&&(uvtData=null),"undefined"==typeof culling&&(culling=null)},Graphics.prototype.endFill=function(){},Graphics.prototype.lineBitmapStyle=function(bitmap,matrix,repeat,smooth){"undefined"==typeof matrix&&(matrix=null),"undefined"==typeof repeat&&(repeat=!0),"undefined"==typeof smooth&&(smooth=!1)},Graphics.prototype.lineGradientStyle=function(type,colors,alphas,ratios,matrix,spreadMethod,interpolationMethod,focalPointRatio){"undefined"==typeof matrix&&(matrix=null),"undefined"==typeof spreadMethod&&(spreadMethod=null),"undefined"==typeof interpolationMethod&&(interpolationMethod=null),"undefined"==typeof focalPointRatio&&(focalPointRatio=0)},Graphics.prototype.lineStyle=function(thickness,color,alpha,pixelHinting,scaleMode,caps,joints,miterLimit){"undefined"==typeof thickness&&(thickness=0),"undefined"==typeof color&&(color=0),"undefined"==typeof alpha&&(alpha=1),"undefined"==typeof pixelHinting&&(pixelHinting=!1),"undefined"==typeof scaleMode&&(scaleMode=null),"undefined"==typeof caps&&(caps=null),"undefined"==typeof joints&&(joints=null),"undefined"==typeof miterLimit&&(miterLimit=3)},Graphics.prototype.lineTo=function(){},Graphics.prototype.moveTo=function(){},Graphics}();base.Graphics=Graphics}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var GraphicsPathWinding=function(){function GraphicsPathWinding(){}return GraphicsPathWinding.EVEN_ODD="evenOdd",GraphicsPathWinding.NON_ZERO="nonZero",GraphicsPathWinding}();base.GraphicsPathWinding=GraphicsPathWinding}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(){}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var InterpolationMethod=function(){function InterpolationMethod(){}return InterpolationMethod.LINEAR_RGB="linearRGB",InterpolationMethod.RGB="rgb",InterpolationMethod}();base.InterpolationMethod=InterpolationMethod}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(){}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(){}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var SubGeometryBase=function(_super){function SubGeometryBase(concatenatedArrays){_super.call(this),this._pStrideOffsetDirty=!0,this._pConcatenateArrays=!0,this._pStride=new Object,this._pOffset=new Object,this._pConcatenateArrays=concatenatedArrays}return __extends(SubGeometryBase,_super),SubGeometryBase.prototype._pUpdateStrideOffset=function(){throw new away.errors.AbstractMethodError},Object.defineProperty(SubGeometryBase.prototype,"subMeshClass",{get:function(){return this._pSubMeshClass},enumerable:!0,configurable:!0}),Object.defineProperty(SubGeometryBase.prototype,"concatenateArrays",{get:function(){return this._pConcatenateArrays},set:function(value){this._pConcatenateArrays!=value&&(this._pConcatenateArrays=value,this._pStrideOffsetDirty=!0,value&&this._pNotifyVerticesUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(SubGeometryBase.prototype,"indices",{get:function(){return this._pIndices},enumerable:!0,configurable:!0}),Object.defineProperty(SubGeometryBase.prototype,"vertices",{get:function(){return this.updateVertices(),this._pVertices},enumerable:!0,configurable:!0}),Object.defineProperty(SubGeometryBase.prototype,"numTriangles",{get:function(){return this._numTriangles},enumerable:!0,configurable:!0}),Object.defineProperty(SubGeometryBase.prototype,"numVertices",{get:function(){return this._pNumVertices},enumerable:!0,configurable:!0}),SubGeometryBase.prototype.getStride=function(dataType){return this._pStrideOffsetDirty&&this._pUpdateStrideOffset(),this._pStride[dataType]},SubGeometryBase.prototype.getOffset=function(dataType){return this._pStrideOffsetDirty&&this._pUpdateStrideOffset(),this._pOffset[dataType]},SubGeometryBase.prototype.updateVertices=function(){throw new away.errors.AbstractMethodError},SubGeometryBase.prototype.dispose=function(){this._pIndices=null,this._pVertices=null},SubGeometryBase.prototype.updateIndices=function(indices){this._pIndices=indices,this._numIndices=indices.length,this._numTriangles=this._numIndices/3,this.notifyIndicesUpdate()},SubGeometryBase.prototype.pInvalidateBounds=function(){this.parentGeometry&&this.parentGeometry.iInvalidateBounds(this)},SubGeometryBase.prototype.clone=function(){throw new away.errors.AbstractMethodError},SubGeometryBase.prototype.applyTransformation=function(){},SubGeometryBase.prototype.scale=function(){},SubGeometryBase.prototype.scaleUV=function(scaleU,scaleV){"undefined"==typeof scaleU&&(scaleU=1),"undefined"==typeof scaleV&&(scaleV=1)},SubGeometryBase.prototype.getBoundingPositions=function(){throw new away.errors.AbstractMethodError},SubGeometryBase.prototype.notifyIndicesUpdate=function(){this._indicesUpdated||(this._indicesUpdated=new away.events.SubGeometryEvent(away.events.SubGeometryEvent.INDICES_UPDATED)),this.dispatchEvent(this._indicesUpdated)},SubGeometryBase.prototype._pNotifyVerticesUpdate=function(){throw new away.errors.AbstractMethodError},SubGeometryBase.VERTEX_DATA="vertices",SubGeometryBase}(away.library.NamedAssetBase);base.SubGeometryBase=SubGeometryBase}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var SubMeshBase=function(_super){function SubMeshBase(){_super.call(this),this._iIndex=0,this._renderables=new Array}return __extends(SubMeshBase,_super),Object.defineProperty(SubMeshBase.prototype,"animator",{get:function(){return this._pParentMesh.animator},enumerable:!0,configurable:!0}),Object.defineProperty(SubMeshBase.prototype,"material",{get:function(){return this._material||this._pParentMesh.material},set:function(value){this.material&&this.material.iRemoveOwner(this),this._material=value,this.material&&this.material.iAddOwner(this)},enumerable:!0,configurable:!0}),Object.defineProperty(SubMeshBase.prototype,"sceneTransform",{get:function(){return this._pParentMesh.sceneTransform},enumerable:!0,configurable:!0}),Object.defineProperty(SubMeshBase.prototype,"parentMesh",{get:function(){return this._pParentMesh},enumerable:!0,configurable:!0}),Object.defineProperty(SubMeshBase.prototype,"uvTransform",{get:function(){return this._uvTransform||this._pParentMesh.uvTransform},set:function(value){this._uvTransform=value},enumerable:!0,configurable:!0}),SubMeshBase.prototype.dispose=function(){this.material=null;for(var len=this._renderables.length,i=0;len>i;i++)this._renderables[i].dispose()},SubMeshBase.prototype.getRenderSceneTransform=function(camera){return this._pParentMesh.getRenderSceneTransform(camera)},SubMeshBase.prototype._iAddRenderable=function(renderable){return this._renderables.push(renderable),renderable},SubMeshBase.prototype._iRemoveRenderable=function(renderable){var index=this._renderables.indexOf(renderable);return this._renderables.splice(index,1),renderable},SubMeshBase.prototype._iInvalidateRenderableGeometry=function(){for(var len=this._renderables.length,i=0;len>i;i++)this._renderables[i].invalidateGeometry()},SubMeshBase.prototype._iCollectRenderable=function(){throw new away.errors.AbstractMethodError},SubMeshBase.prototype._iGetExplicitMaterial=function(){return this._material},SubMeshBase}(away.library.NamedAssetBase);base.SubMeshBase=SubMeshBase}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var JointStyle=function(){function JointStyle(){}return JointStyle.BEVEL="bevel",JointStyle.MITER="miter",JointStyle.ROUND="round",JointStyle}();base.JointStyle=JointStyle}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var LineScaleMode=function(){function LineScaleMode(){}return LineScaleMode.HORIZONTAL="horizontal",LineScaleMode.NONE="none",LineScaleMode.NORMAL="normal",LineScaleMode.VERTICAL="vertical",LineScaleMode}();base.LineScaleMode=LineScaleMode}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var LineSubGeometry=function(_super){function LineSubGeometry(){_super.call(this,!0),this._positionsDirty=!0,this._boundingPositionDirty=!0,this._thicknessDirty=!0,this._colorsDirty=!0,this._pSubMeshClass=base.LineSubMesh}return __extends(LineSubGeometry,_super),LineSubGeometry.prototype._pUpdateStrideOffset=function(){this._pOffset[LineSubGeometry.VERTEX_DATA]=0;var stride=0;this._pOffset[LineSubGeometry.START_POSITION_DATA]=stride,stride+=3,this._pOffset[LineSubGeometry.END_POSITION_DATA]=stride,stride+=3,this._pOffset[LineSubGeometry.THICKNESS_DATA]=stride,stride+=1,this._pOffset[LineSubGeometry.COLOR_DATA]=stride,stride+=4,this._pStride[LineSubGeometry.VERTEX_DATA]=stride,this._pStride[LineSubGeometry.START_POSITION_DATA]=stride,this._pStride[LineSubGeometry.END_POSITION_DATA]=stride,this._pStride[LineSubGeometry.THICKNESS_DATA]=stride,this._pStride[LineSubGeometry.COLOR_DATA]=stride;var len=this._pNumVertices*stride;null==this._pVertices?this._pVertices=new Array(len):this._pVertices.length!=len&&(this._pVertices.length=len),this._pStrideOffsetDirty=!1},Object.defineProperty(LineSubGeometry.prototype,"vertices",{get:function(){return this._positionsDirty&&this.updatePositions(this._startPositions,this._endPositions),this._thicknessDirty&&this.updateThickness(this._thickness),this._colorsDirty&&this.updateColors(this._startColors,this._endColors),this._pVertices},enumerable:!0,configurable:!0}),Object.defineProperty(LineSubGeometry.prototype,"startPositions",{get:function(){return this._positionsDirty&&this.updatePositions(this._startPositions,this._endPositions),this._startPositions},enumerable:!0,configurable:!0}),Object.defineProperty(LineSubGeometry.prototype,"endPositions",{get:function(){return this._positionsDirty&&this.updatePositions(this._startPositions,this._endPositions),this._endPositions},enumerable:!0,configurable:!0}),Object.defineProperty(LineSubGeometry.prototype,"thickness",{get:function(){return this._thicknessDirty&&this.updateThickness(this._thickness),this._thickness},enumerable:!0,configurable:!0}),Object.defineProperty(LineSubGeometry.prototype,"startColors",{get:function(){return this._colorsDirty&&this.updateColors(this._startColors,this._endColors),this._startColors},enumerable:!0,configurable:!0}),Object.defineProperty(LineSubGeometry.prototype,"endColors",{get:function(){return this._colorsDirty&&this.updateColors(this._startColors,this._endColors),this._endColors},enumerable:!0,configurable:!0}),Object.defineProperty(LineSubGeometry.prototype,"numSegments",{get:function(){return this._numSegments},enumerable:!0,configurable:!0}),LineSubGeometry.prototype.getBoundingPositions=function(){return this._boundingPositionDirty&&(this._boundingPositions=this.startPositions.concat(this.endPositions)),this._boundingPositions},LineSubGeometry.prototype.updatePositions=function(startValues,endValues){var i,j,values,index,stride,positions,indices;this._startPositions=startValues,null==this._startPositions&&(this._startPositions=new Array),this._endPositions=endValues,null==this._endPositions&&(this._endPositions=new Array),this._boundingPositionDirty=!0,this._numSegments=this._startPositions.length/3,this._pNumVertices=4*this._numSegments;var lenV=this._pNumVertices*this.getStride(LineSubGeometry.VERTEX_DATA);for(null==this._pVertices?this._pVertices=new Array(lenV):this._pVertices.length!=lenV&&(this._pVertices.length=lenV),i=0,j=0,index=this.getOffset(LineSubGeometry.START_POSITION_DATA),stride=this.getStride(LineSubGeometry.START_POSITION_DATA),positions=this._pVertices,indices=new Array;i>>24,(16711680&this._color)>>>16,(65280&this._color)>>>8,255&this._color),this._bufferClear=!0)},Stage.prototype.addEventListener=function(type,listener){_super.prototype.addEventListener.call(this,type,listener)},Stage.prototype.removeEventListener=function(type,listener){_super.prototype.removeEventListener.call(this,type,listener)},Object.defineProperty(Stage.prototype,"scissorRect",{get:function(){return this._scissorRect},set:function(value){this._scissorRect=value,this._context.setScissorRectangle(this._scissorRect)},enumerable:!0,configurable:!0}),Object.defineProperty(Stage.prototype,"stageIndex",{get:function(){return this._stageIndex},enumerable:!0,configurable:!0}),Object.defineProperty(Stage.prototype,"usesSoftwareRendering",{get:function(){return this._usesSoftwareRendering},enumerable:!0,configurable:!0}),Object.defineProperty(Stage.prototype,"antiAlias",{get:function(){return this._antiAlias},set:function(antiAlias){this._antiAlias=antiAlias,this._backBufferDirty=!0},enumerable:!0,configurable:!0}),Object.defineProperty(Stage.prototype,"viewPort",{get:function(){return this._viewportDirty=!1,this._viewPort},enumerable:!0,configurable:!0}),Object.defineProperty(Stage.prototype,"color",{get:function(){return this._color},set:function(color){this._color=color},enumerable:!0,configurable:!0}),Object.defineProperty(Stage.prototype,"bufferClear",{get:function(){return this._bufferClear},set:function(newBufferClear){this._bufferClear=newBufferClear},enumerable:!0,configurable:!0}),Stage.prototype.freeContext=function(){this._context&&(this._context.dispose(),this.dispatchEvent(new StageEvent(StageEvent.CONTEXT_DISPOSED))),this._context=null,this._initialised=!1},Stage.prototype.onEnterFrame=function(){this._context&&(this.clear(),this.notifyEnterFrame(),this._context||this._context.present(),this.notifyExitFrame())},Stage.prototype.recoverFromDisposal=function(){return this._context?!0:!1},Stage.prototype._callback=function(context){this._context=context,this._container=this._context.container,this._width&&this._height&&this._context.configureBackBuffer(this._width,this._height,this._antiAlias,this._enableDepthAndStencil),this.dispatchEvent(new StageEvent(this._initialised?StageEvent.CONTEXT_RECREATED:StageEvent.CONTEXT_CREATED)),this._initialised=!0},Stage}(away.events.EventDispatcher);base.Stage=Stage}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var TriangleCulling=function(){function TriangleCulling(){}return TriangleCulling.NEGATIVE="negative",TriangleCulling.NONE="none",TriangleCulling.POSITIVE="positive",TriangleCulling}();base.TriangleCulling=TriangleCulling}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var SubGeometryEvent=away.events.SubGeometryEvent,TriangleSubGeometry=function(_super){function TriangleSubGeometry(concatenatedArrays){_super.call(this,concatenatedArrays),this._positionsDirty=!0,this._faceNormalsDirty=!0,this._faceTangentsDirty=!0,this._vertexNormalsDirty=!0,this._vertexTangentsDirty=!0,this._uvsDirty=!0,this._secondaryUVsDirty=!0,this._jointIndicesDirty=!0,this._jointWeightsDirty=!0,this._concatenateArrays=!0,this._autoDeriveNormals=!0,this._autoDeriveTangents=!0,this._autoDeriveUVs=!1,this._useFaceWeights=!1,this._scaleU=1,this._scaleV=1,this._pSubMeshClass=base.TriangleSubMesh}return __extends(TriangleSubGeometry,_super),Object.defineProperty(TriangleSubGeometry.prototype,"scaleU",{get:function(){return this._scaleU},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"scaleV",{get:function(){return this._scaleV},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"useCondensedIndices",{get:function(){return this._useCondensedIndices},set:function(value){this._useCondensedIndices!=value&&(this._useCondensedIndices=value,this.notifyJointIndicesUpdate())},enumerable:!0,configurable:!0}),TriangleSubGeometry.prototype._pUpdateStrideOffset=function(){if(this._concatenateArrays){this._pOffset[TriangleSubGeometry.VERTEX_DATA]=0,this._pOffset[TriangleSubGeometry.POSITION_DATA]=0;var stride=3;null!=this._vertexNormals&&(this._pOffset[TriangleSubGeometry.NORMAL_DATA]=stride,stride+=3),null!=this._vertexTangents&&(this._pOffset[TriangleSubGeometry.TANGENT_DATA]=stride,stride+=3),null!=this._uvs&&(this._pOffset[TriangleSubGeometry.UV_DATA]=stride,stride+=2),null!=this._secondaryUVs&&(this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA]=stride,stride+=2),null!=this._jointIndices&&(this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA]=stride,stride+=this._jointsPerVertex),null!=this._jointWeights&&(this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA]=stride,stride+=this._jointsPerVertex),this._pStride[TriangleSubGeometry.VERTEX_DATA]=stride,this._pStride[TriangleSubGeometry.POSITION_DATA]=stride,this._pStride[TriangleSubGeometry.NORMAL_DATA]=stride,this._pStride[TriangleSubGeometry.TANGENT_DATA]=stride,this._pStride[TriangleSubGeometry.UV_DATA]=stride,this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA]=stride,this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA]=stride,this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA]=stride;var len=this._pNumVertices*stride;null==this._pVertices?this._pVertices=new Array(len):this._pVertices.length!=len&&(this._pVertices.length=len)}else this._pOffset[TriangleSubGeometry.POSITION_DATA]=0,this._pOffset[TriangleSubGeometry.NORMAL_DATA]=0,this._pOffset[TriangleSubGeometry.TANGENT_DATA]=0,this._pOffset[TriangleSubGeometry.UV_DATA]=0,this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA]=0,this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA]=0,this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA]=0,this._pStride[TriangleSubGeometry.POSITION_DATA]=3,this._pStride[TriangleSubGeometry.NORMAL_DATA]=3,this._pStride[TriangleSubGeometry.TANGENT_DATA]=3,this._pStride[TriangleSubGeometry.UV_DATA]=2,this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA]=2,this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA]=this._jointsPerVertex,this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA]=this._jointsPerVertex;this._pStrideOffsetDirty=!1},Object.defineProperty(TriangleSubGeometry.prototype,"jointsPerVertex",{get:function(){return this._jointsPerVertex},set:function(value){this._jointsPerVertex!=value&&(this._jointsPerVertex=value,this._pStrideOffsetDirty=!0,this._pConcatenateArrays&&this._pNotifyVerticesUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"autoDeriveUVs",{get:function(){return this._autoDeriveUVs},set:function(value){this._autoDeriveUVs!=value&&(this._autoDeriveUVs=value,value&&this.notifyUVsUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"autoDeriveNormals",{get:function(){return this._autoDeriveNormals},set:function(value){this._autoDeriveNormals!=value&&(this._autoDeriveNormals=value,value&&this.notifyNormalsUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"autoDeriveTangents",{get:function(){return this._autoDeriveTangents},set:function(value){this._autoDeriveTangents!=value&&(this._autoDeriveTangents=value,value&&this.notifyTangentsUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"vertices",{get:function(){return this._positionsDirty&&this.updatePositions(this._positions),this._vertexNormalsDirty&&this.updateVertexNormals(this._vertexNormals),this._vertexTangentsDirty&&this.updateVertexTangents(this._vertexTangents),this._uvsDirty&&this.updateUVs(this._uvs),this._secondaryUVsDirty&&this.updateSecondaryUVs(this._secondaryUVs),this._jointIndicesDirty&&this.updateJointIndices(this._jointIndices),this._jointWeightsDirty&&this.updateJointWeights(this._jointWeights),this._pVertices},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"positions",{get:function(){return this._positionsDirty&&this.updatePositions(this._positions),this._positions},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"vertexNormals",{get:function(){return this._vertexNormalsDirty&&this.updateVertexNormals(this._vertexNormals),this._vertexNormals},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"vertexTangents",{get:function(){return this._vertexTangentsDirty&&this.updateVertexTangents(this._vertexTangents),this._vertexTangents},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"faceNormals",{get:function(){return this._faceNormalsDirty&&this.updateFaceNormals(),this._faceNormals},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"faceTangents",{get:function(){return this._faceTangentsDirty&&this.updateFaceTangents(),this._faceTangents},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"uvs",{get:function(){return this._uvsDirty&&this.updateUVs(this._uvs),this._uvs},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"secondaryUVs",{get:function(){return this._secondaryUVsDirty&&this.updateSecondaryUVs(this._secondaryUVs),this._secondaryUVs},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"jointIndices",{get:function(){return this._jointIndicesDirty&&this.updateJointIndices(this._jointIndices),this._useCondensedIndices?this._condensedJointIndices:this._jointIndices},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"jointWeights",{get:function(){return this._jointWeightsDirty&&this.updateJointWeights(this._jointWeights),this._jointWeights},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"useFaceWeights",{get:function(){return this._useFaceWeights},set:function(value){this._useFaceWeights!=value&&(this._useFaceWeights=value,this._autoDeriveNormals&&this.notifyNormalsUpdate(),this._autoDeriveTangents&&this.notifyTangentsUpdate(),this._faceNormalsDirty=!0)},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"numCondensedJoints",{get:function(){return this._jointIndicesDirty&&this.updateJointIndices(this._jointIndices),this._numCondensedJoints},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubGeometry.prototype,"condensedIndexLookUp",{get:function(){return this._jointIndicesDirty&&this.updateJointIndices(this._jointIndices),this._condensedIndexLookUp},enumerable:!0,configurable:!0}),TriangleSubGeometry.prototype.getBoundingPositions=function(){return this._positionsDirty&&this.updatePositions(this._positions),this._positions},TriangleSubGeometry.prototype.updatePositions=function(values){var i,index,stride,positions;if(this._positions=values,null==this._positions&&(this._positions=new Array),this._pNumVertices=this._positions.length/3,this._concatenateArrays){var len=this._pNumVertices*this.getStride(TriangleSubGeometry.VERTEX_DATA);for(null==this._pVertices?this._pVertices=new Array(len):this._pVertices.length!=len&&(this._pVertices.length=len),i=0,index=this.getOffset(TriangleSubGeometry.POSITION_DATA),stride=this.getStride(TriangleSubGeometry.POSITION_DATA),positions=this._pVertices;iindex;)normals[index]=0,normals[index+1]=0,normals[index+2]=0,index+=stride;var weight,k=0,lenI=this._pIndices.length;for(i=0;lenI>i;)weight=this._useFaceWeights?this._faceWeights[k++]:1,index=offset+this._pIndices[i++]*stride,normals[index]+=this._faceNormals[f1]*weight,normals[index+1]+=this._faceNormals[f2]*weight,normals[index+2]+=this._faceNormals[f3]*weight,index=offset+this._pIndices[i++]*stride,normals[index]+=this._faceNormals[f1]*weight,normals[index+1]+=this._faceNormals[f2]*weight,normals[index+2]+=this._faceNormals[f3]*weight,index=offset+this._pIndices[i++]*stride,normals[index]+=this._faceNormals[f1]*weight,normals[index+1]+=this._faceNormals[f2]*weight,normals[index+2]+=this._faceNormals[f3]*weight,f1+=3,f2+=3,f3+=3;for(i=0,index=offset;lenV>index;){var vx=normals[index],vy=normals[index+1],vz=normals[index+2],d=1/Math.sqrt(vx*vx+vy*vy+vz*vz);this._concatenateArrays?(this._vertexNormals[i++]=normals[index]=vx*d,this._vertexNormals[i++]=normals[index+1]=vy*d,this._vertexNormals[i++]=normals[index+2]=vz*d):(normals[index]=vx*d,normals[index+1]=vy*d,normals[index+2]=vz*d),index+=stride}}else if(null!=this._vertexNormals&&null!=values||null==this._vertexNormals&&null==values||(this._concatenateArrays?this._pNotifyVerticesUpdate():this._pStrideOffsetDirty=!0),this._vertexNormals=values,null!=values&&this._concatenateArrays)for(i=0,index=this.getOffset(TriangleSubGeometry.NORMAL_DATA),stride=this.getStride(TriangleSubGeometry.NORMAL_DATA),normals=this._pVertices;iindex;)tangents[index]=0,tangents[index+1]=0,tangents[index+2]=0,index+=stride;var weight,k=0,f1=0,f2=1,f3=2;i=0;for(var lenI=this._pIndices.length;lenI>i;)weight=this._useFaceWeights?this._faceWeights[k++]:1,index=offset+this._pIndices[i++]*stride,tangents[index++]+=this._faceTangents[f1]*weight,tangents[index++]+=this._faceTangents[f2]*weight,tangents[index]+=this._faceTangents[f3]*weight,index=offset+this._pIndices[i++]*stride,tangents[index++]+=this._faceTangents[f1]*weight,tangents[index++]+=this._faceTangents[f2]*weight,tangents[index]+=this._faceTangents[f3]*weight,index=offset+this._pIndices[i++]*stride,tangents[index++]+=this._faceTangents[f1]*weight,tangents[index++]+=this._faceTangents[f2]*weight,tangents[index]+=this._faceTangents[f3]*weight,f1+=3,f2+=3,f3+=3;for(i=0,index=offset;lenV>index;){var vx=tangents[index],vy=tangents[index+1],vz=tangents[index+2],d=1/Math.sqrt(vx*vx+vy*vy+vz*vz);this._concatenateArrays?(this._vertexTangents[i++]=tangents[index]=vx*d,this._vertexTangents[i++]=tangents[index+1]=vy*d,this._vertexTangents[i++]=tangents[index+2]=vz*d):(tangents[index]=vx*d,tangents[index+1]=vy*d,tangents[index+2]=vz*d),index+=stride}}else if(null!=this._vertexTangents&&null!=values||null==this._vertexTangents&&null==values||(this._concatenateArrays?this._pNotifyVerticesUpdate():this._pStrideOffsetDirty=!0),this._vertexTangents=values,null!=values&&this._concatenateArrays)for(i=0,index=this.getOffset(TriangleSubGeometry.TANGENT_DATA),stride=this.getStride(TriangleSubGeometry.TANGENT_DATA),tangents=this._pVertices;iindex;)this._concatenateArrays?(this._uvs[i++]=uvs[index]=.5*uvIdx,this._uvs[i++]=uvs[index+1]=1-(1&uvIdx)):(uvs[index]=.5*uvIdx,uvs[index+1]=1-(1&uvIdx)),3==++uvIdx&&(uvIdx=0),index+=stride}else if(null!=this._uvs&&null!=values||null==this._uvs&&null==values||(this._concatenateArrays?this._pNotifyVerticesUpdate():this._pStrideOffsetDirty=!0),this._uvs=values,null!=values&&this._concatenateArrays)for(i=0,index=this.getOffset(TriangleSubGeometry.UV_DATA),stride=this.getStride(TriangleSubGeometry.UV_DATA),uvs=this._pVertices;iindex;)uvs[index]*=ratioU,uvs[index+1]*=ratioV,index+=stride;this.notifyUVsUpdate()},TriangleSubGeometry.prototype.scale=function(scale){var i,index,offset,stride,positions;positions=this._positions;var len=positions.length;for(offset=0,stride=3,i=0,index=offset;len>i;)positions[index]*=scale,positions[index+1]*=scale,positions[index+2]*=scale,i+=3,index+=stride;this.notifyPositionsUpdate()},TriangleSubGeometry.prototype.applyTransformation=function(transform){var positions,normals,tangents;this._concatenateArrays?(positions=this._pVertices,normals=this._pVertices,tangents=this._pVertices):(positions=this._positions,normals=this._vertexNormals,tangents=this._vertexTangents);var i,i1,i2,invTranspose,len=this._positions.length/3,vector=new away.geom.Vector3D,bakeNormals=null!=this._vertexNormals,bakeTangents=null!=this._vertexTangents;(bakeNormals||bakeTangents)&&(invTranspose=transform.clone(),invTranspose.invert(),invTranspose.transpose());var vi0=this.getOffset(TriangleSubGeometry.POSITION_DATA),ni0=this.getOffset(TriangleSubGeometry.NORMAL_DATA),ti0=this.getOffset(TriangleSubGeometry.TANGENT_DATA),vStride=this.getStride(TriangleSubGeometry.POSITION_DATA),nStride=this.getStride(TriangleSubGeometry.NORMAL_DATA),tStride=this.getStride(TriangleSubGeometry.TANGENT_DATA);for(i=0;len>i;++i)i1=vi0+1,i2=vi0+2,vector.x=positions[vi0],vector.y=positions[i1],vector.z=positions[i2],vector=transform.transformVector(vector),positions[vi0]=vector.x,positions[i1]=vector.y,positions[i2]=vector.z,vi0+=vStride,bakeNormals&&(i1=ni0+1,i2=ni0+2,vector.x=normals[ni0],vector.y=normals[i1],vector.z=normals[i2],vector=invTranspose.deltaTransformVector(vector),vector.normalize(),normals[ni0]=vector.x,normals[i1]=vector.y,normals[i2]=vector.z,ni0+=nStride),bakeTangents&&(i1=ti0+1,i2=ti0+2,vector.x=tangents[ti0],vector.y=tangents[i1],vector.z=tangents[i2],vector=invTranspose.deltaTransformVector(vector),vector.normalize(),tangents[ti0]=vector.x,tangents[i1]=vector.y,tangents[i2]=vector.z,ti0+=tStride); -this.notifyPositionsUpdate(),this.notifyNormalsUpdate(),this.notifyTangentsUpdate()},TriangleSubGeometry.prototype.updateFaceTangents=function(){var index1,index2,index3,vi,v0,dv1,dv2,denom,x0,y0,z0,dx1,dy1,dz1,dx2,dy2,dz2,cx,cy,cz,i=0,positions=this._positions,uvs=this._uvs,len=this._pIndices.length;for(null==this._faceTangents&&(this._faceTangents=new Array(len));len>i;)index1=this._pIndices[i],index2=this._pIndices[i+1],index3=this._pIndices[i+2],v0=uvs[2*index1+1],dv1=uvs[2*index2+1]-v0,dv2=uvs[2*index3+1]-v0,vi=3*index1,x0=positions[vi],y0=positions[vi+1],z0=positions[vi+2],vi=3*index2,dx1=positions[vi]-x0,dy1=positions[vi+1]-y0,dz1=positions[vi+2]-z0,vi=3*index3,dx2=positions[vi]-x0,dy2=positions[vi+1]-y0,dz2=positions[vi+2]-z0,cx=dv2*dx1-dv1*dx2,cy=dv2*dy1-dv1*dy2,cz=dv2*dz1-dv1*dz2,denom=1/Math.sqrt(cx*cx+cy*cy+cz*cz),this._faceTangents[i++]=denom*cx,this._faceTangents[i++]=denom*cy,this._faceTangents[i++]=denom*cz;this._faceTangentsDirty=!1},TriangleSubGeometry.prototype.updateFaceNormals=function(){var index,x1,x2,x3,y1,y2,y3,z1,z2,z3,dx1,dy1,dz1,dx2,dy2,dz2,cx,cy,cz,d,i=0,j=0,k=0,positions=this._positions,len=this._pIndices.length;for(null==this._faceNormals&&(this._faceNormals=new Array(len)),this._useFaceWeights&&null==this._faceWeights&&(this._faceWeights=new Array(len/3));len>i;){if(index=3*this._pIndices[i++],x1=positions[index],y1=positions[index+1],z1=positions[index+2],index=3*this._pIndices[i++],x2=positions[index],y2=positions[index+1],z2=positions[index+2],index=3*this._pIndices[i++],x3=positions[index],y3=positions[index+1],z3=positions[index+2],dx1=x3-x1,dy1=y3-y1,dz1=z3-z1,dx2=x2-x1,dy2=y2-y1,dz2=z2-z1,cx=dz1*dy2-dy1*dz2,cy=dx1*dz2-dz1*dx2,cz=dy1*dx2-dx1*dy2,d=Math.sqrt(cx*cx+cy*cy+cz*cz),this._useFaceWeights){var w=1e4*d;1>w&&(w=1),this._faceWeights[k++]=w}d=1/d,this._faceNormals[j++]=cx*d,this._faceNormals[j++]=cy*d,this._faceNormals[j++]=cz*d}this._faceNormalsDirty=!1},TriangleSubGeometry.prototype._pNotifyVerticesUpdate=function(){this._pStrideOffsetDirty=!0,this.notifyPositionsUpdate(),this.notifyNormalsUpdate(),this.notifyTangentsUpdate(),this.notifyUVsUpdate(),this.notifySecondaryUVsUpdate(),this.notifyJointIndicesUpdate(),this.notifyJointWeightsUpdate()},TriangleSubGeometry.prototype.notifyPositionsUpdate=function(){this._positionsDirty||(this._positionsDirty=!0,this._positionsUpdated||(this._positionsUpdated=new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED,TriangleSubGeometry.POSITION_DATA)),this.dispatchEvent(this._positionsUpdated))},TriangleSubGeometry.prototype.notifyNormalsUpdate=function(){this._vertexNormalsDirty||(this._vertexNormalsDirty=!0,this._normalsUpdated||(this._normalsUpdated=new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED,TriangleSubGeometry.NORMAL_DATA)),this.dispatchEvent(this._normalsUpdated))},TriangleSubGeometry.prototype.notifyTangentsUpdate=function(){this._vertexTangentsDirty||(this._vertexTangentsDirty=!0,this._tangentsUpdated||(this._tangentsUpdated=new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED,TriangleSubGeometry.TANGENT_DATA)),this.dispatchEvent(this._tangentsUpdated))},TriangleSubGeometry.prototype.notifyUVsUpdate=function(){this._uvsDirty||(this._uvsDirty=!0,this._uvsUpdated||(this._uvsUpdated=new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED,TriangleSubGeometry.UV_DATA)),this.dispatchEvent(this._uvsUpdated))},TriangleSubGeometry.prototype.notifySecondaryUVsUpdate=function(){this._secondaryUVsDirty||(this._secondaryUVsDirty=!0,this._secondaryUVsUpdated||(this._secondaryUVsUpdated=new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED,TriangleSubGeometry.SECONDARY_UV_DATA)),this.dispatchEvent(this._secondaryUVsUpdated))},TriangleSubGeometry.prototype.notifyJointIndicesUpdate=function(){this._jointIndicesDirty||(this._jointIndicesDirty=!0,this._jointIndicesUpdated||(this._jointIndicesUpdated=new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED,TriangleSubGeometry.JOINT_INDEX_DATA)),this.dispatchEvent(this._jointIndicesUpdated))},TriangleSubGeometry.prototype.notifyJointWeightsUpdate=function(){this._jointWeightsDirty||(this._jointWeightsDirty=!0,this._jointWeightsUpdated||(this._jointWeightsUpdated=new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED,TriangleSubGeometry.JOINT_WEIGHT_DATA)),this.dispatchEvent(this._jointWeightsUpdated))},TriangleSubGeometry.POSITION_DATA="positions",TriangleSubGeometry.NORMAL_DATA="vertexNormals",TriangleSubGeometry.TANGENT_DATA="vertexTangents",TriangleSubGeometry.UV_DATA="uvs",TriangleSubGeometry.SECONDARY_UV_DATA="secondaryUVs",TriangleSubGeometry.JOINT_INDEX_DATA="jointIndices",TriangleSubGeometry.JOINT_WEIGHT_DATA="jointWeights",TriangleSubGeometry.POSITION_FORMAT="float3",TriangleSubGeometry.NORMAL_FORMAT="float3",TriangleSubGeometry.TANGENT_FORMAT="float3",TriangleSubGeometry.UV_FORMAT="float2",TriangleSubGeometry.SECONDARY_UV_FORMAT="float2",TriangleSubGeometry}(base.SubGeometryBase);base.TriangleSubGeometry=TriangleSubGeometry}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(base){var AssetType=away.library.AssetType,TriangleSubMesh=function(_super){function TriangleSubMesh(subGeometry,parentMesh,material){"undefined"==typeof material&&(material=null),_super.call(this),this._pParentMesh=parentMesh,this._subGeometry=subGeometry,this.material=material}return __extends(TriangleSubMesh,_super),Object.defineProperty(TriangleSubMesh.prototype,"assetType",{get:function(){return AssetType.TRIANGLE_SUB_MESH},enumerable:!0,configurable:!0}),Object.defineProperty(TriangleSubMesh.prototype,"subGeometry",{get:function(){return this._subGeometry},enumerable:!0,configurable:!0}),TriangleSubMesh.prototype.dispose=function(){_super.prototype.dispose.call(this)},TriangleSubMesh.prototype._iCollectRenderable=function(renderer){renderer.applyTriangleSubMesh(this)},TriangleSubMesh}(base.SubMeshBase);base.TriangleSubMesh=TriangleSubMesh}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(textures){var TextureProxyBase=function(_super){function TextureProxyBase(generateMipmaps){"undefined"==typeof generateMipmaps&&(generateMipmaps=!1),_super.call(this),this._pFormat="bgra",this._textureData=new Array,this._generateMipmaps=this._hasMipmaps=generateMipmaps}return __extends(TextureProxyBase,_super),Object.defineProperty(TextureProxyBase.prototype,"size",{get:function(){return this._pSize},enumerable:!0,configurable:!0}),Object.defineProperty(TextureProxyBase.prototype,"hasMipmaps",{get:function(){return this._hasMipmaps},enumerable:!0,configurable:!0}),Object.defineProperty(TextureProxyBase.prototype,"format",{get:function(){return this._pFormat},enumerable:!0,configurable:!0}),Object.defineProperty(TextureProxyBase.prototype,"generateMipmaps",{get:function(){return this._generateMipmaps},set:function(value){this._generateMipmaps!=value&&(this._generateMipmaps=this._hasMipmaps=value,this.invalidateContent())},enumerable:!0,configurable:!0}),Object.defineProperty(TextureProxyBase.prototype,"assetType",{get:function(){return away.library.AssetType.TEXTURE},enumerable:!0,configurable:!0}),TextureProxyBase.prototype.invalidateContent=function(){for(var len=this._textureData.length,i=0;len>i;i++)this._textureData[i].invalidate()},TextureProxyBase.prototype.invalidateSize=function(){for(;this._textureData.length;)this._textureData[0].dispose()},TextureProxyBase.prototype.dispose=function(){for(;this._textureData.length;)this._textureData[0].dispose()},TextureProxyBase.prototype._iAddTextureData=function(textureData){return this._textureData.push(textureData),textureData},TextureProxyBase.prototype._iRemoveTextureData=function(textureData){return this._textureData.splice(this._textureData.indexOf(textureData),1),textureData},TextureProxyBase}(away.library.NamedAssetBase);textures.TextureProxyBase=TextureProxyBase}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var Texture2DBase=function(_super){function Texture2DBase(generateMipmaps){"undefined"==typeof generateMipmaps&&(generateMipmaps=!1),_super.call(this,generateMipmaps)}return __extends(Texture2DBase,_super),Object.defineProperty(Texture2DBase.prototype,"width",{get:function(){return this._pWidth},enumerable:!0,configurable:!0}),Object.defineProperty(Texture2DBase.prototype,"height",{get:function(){return this._pHeight},enumerable:!0,configurable:!0}),Object.defineProperty(Texture2DBase.prototype,"size",{get:function(){return this._pWidth},enumerable:!0,configurable:!0}),Texture2DBase.prototype.dispose=function(){if(_super.prototype.dispose.call(this),this._mipmapData)for(var len=this._mipmapData.length,i=0;len>i;i++)textures.MipmapGenerator.freeMipMapHolder(this._mipmapData[i])},Texture2DBase.prototype.invalidateContent=function(){_super.prototype.invalidateContent.call(this),this._mipmapDataDirty=!0},Texture2DBase.prototype._pSetSize=function(width,height){(this._pWidth!=width||this._pHeight!=height)&&this.invalidateSize(),this._mipmapDataDirty=!0,this._pWidth=width,this._pHeight=height},Texture2DBase.prototype._iGetMipmapData=function(){return this._mipmapDataDirty&&(this._mipmapDataDirty=!1,this._mipmapData||(this._mipmapData=new Array),away.textures.MipmapGenerator.generateMipMaps(this._iGetTextureData(),this._mipmapData,!0)),this._mipmapData},Texture2DBase.prototype._iGetTextureData=function(){throw new away.errors.AbstractMethodError},Texture2DBase}(textures.TextureProxyBase);textures.Texture2DBase=Texture2DBase}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var AbstractMethodError=away.errors.AbstractMethodError,CubeTextureBase=function(_super){function CubeTextureBase(generateMipmaps){"undefined"==typeof generateMipmaps&&(generateMipmaps=!1),_super.call(this,generateMipmaps),this._mipmapDataArray=new Array(6),this._mipmapDataDirtyArray=new Array(6)}return __extends(CubeTextureBase,_super),CubeTextureBase.prototype._pSetSize=function(size){this._pSize!=size&&this.invalidateSize();for(var i=0;6>i;i++)this._mipmapDataDirtyArray[i]=!0;this._pSize=size},CubeTextureBase.prototype.dispose=function(){_super.prototype.dispose.call(this);for(var i=0;6>i;i++)for(var mipmapData=this._mipmapDataArray[i],len=mipmapData.length,j=0;len>j;j++)textures.MipmapGenerator.freeMipMapHolder(mipmapData[j])},CubeTextureBase.prototype.invalidateContent=function(){_super.prototype.invalidateContent.call(this);for(var i=0;6>i;i++)this._mipmapDataDirtyArray[i]=!0},CubeTextureBase.prototype._iGetMipmapData=function(side){if(this._mipmapDataDirtyArray[side]){this._mipmapDataDirtyArray[side]=!1;var mipmapData=this._mipmapDataArray[side]||(this._mipmapDataArray[side]=new Array);textures.MipmapGenerator.generateMipMaps(this._iGetTextureData(side),mipmapData,!0)}return this._mipmapDataArray[side]},CubeTextureBase.prototype._iGetTextureData=function(){throw new AbstractMethodError},CubeTextureBase}(textures.TextureProxyBase);textures.CubeTextureBase=CubeTextureBase}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var ImageTexture=function(_super){function ImageTexture(htmlImageElement,generateMipmaps){"undefined"==typeof generateMipmaps&&(generateMipmaps=!1),_super.call(this,generateMipmaps),this.htmlImageElement=htmlImageElement}return __extends(ImageTexture,_super),Object.defineProperty(ImageTexture.prototype,"htmlImageElement",{get:function(){return this._htmlImageElement},set:function(value){if(this._htmlImageElement!=value){if(!away.utils.TextureUtils.isHTMLImageElementValid(value))throw new away.errors.Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048");this._htmlImageElement=value,this.invalidateContent(),this._pSetSize(value.width,value.height)}},enumerable:!0,configurable:!0}),ImageTexture.prototype._iGetTextureData=function(){return this._htmlImageElement},ImageTexture}(textures.Texture2DBase);textures.ImageTexture=ImageTexture}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var BitmapTexture=function(_super){function BitmapTexture(bitmapData,generateMipmaps){"undefined"==typeof generateMipmaps&&(generateMipmaps=!1),_super.call(this,generateMipmaps),this.bitmapData=bitmapData}return __extends(BitmapTexture,_super),Object.defineProperty(BitmapTexture.prototype,"bitmapData",{get:function(){return this._bitmapData},set:function(value){if(this._bitmapData!=value){if(!away.utils.TextureUtils.isBitmapDataValid(value))throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048");this._bitmapData=value,this.invalidateContent(),this._pSetSize(value.width,value.height)}},enumerable:!0,configurable:!0}),BitmapTexture.prototype.dispose=function(){_super.prototype.dispose.call(this),this._bitmapData.dispose(),this._bitmapData=null},BitmapTexture.prototype._iGetTextureData=function(){return this._bitmapData},BitmapTexture}(textures.Texture2DBase);textures.BitmapTexture=BitmapTexture}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var RenderTexture=function(_super){function RenderTexture(width,height){_super.call(this,!1),this._pSetSize(width,height)}return __extends(RenderTexture,_super),Object.defineProperty(RenderTexture.prototype,"width",{get:function(){return this._pWidth},set:function(value){if(value!=this._pWidth){if(!away.utils.TextureUtils.isDimensionValid(value))throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048");this.invalidateContent(),this._pSetSize(value,this._pHeight)}},enumerable:!0,configurable:!0}),Object.defineProperty(RenderTexture.prototype,"height",{get:function(){return this._pHeight},set:function(value){if(value!=this._pHeight){if(!away.utils.TextureUtils.isDimensionValid(value))throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048");this.invalidateContent(),this._pSetSize(this._pWidth,value)}},enumerable:!0,configurable:!0}),RenderTexture}(textures.Texture2DBase);textures.RenderTexture=RenderTexture}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var ImageCubeTexture=function(_super){function ImageCubeTexture(posX,negX,posY,negY,posZ,negZ,generateMipmaps){"undefined"==typeof generateMipmaps&&(generateMipmaps=!1),_super.call(this,generateMipmaps),this._htmlImageElements=new Array(6),this._testSize(this._htmlImageElements[0]=posX),this._testSize(this._htmlImageElements[1]=negX),this._testSize(this._htmlImageElements[2]=posY),this._testSize(this._htmlImageElements[3]=negY),this._testSize(this._htmlImageElements[4]=posZ),this._testSize(this._htmlImageElements[5]=negZ),this.invalidateContent(),this._pSetSize(posX.width)}return __extends(ImageCubeTexture,_super),Object.defineProperty(ImageCubeTexture.prototype,"positiveX",{get:function(){return this._htmlImageElements[0]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._htmlImageElements[0]=value},enumerable:!0,configurable:!0}),Object.defineProperty(ImageCubeTexture.prototype,"negativeX",{get:function(){return this._htmlImageElements[1]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._htmlImageElements[1]=value},enumerable:!0,configurable:!0}),Object.defineProperty(ImageCubeTexture.prototype,"positiveY",{get:function(){return this._htmlImageElements[2]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._htmlImageElements[2]=value},enumerable:!0,configurable:!0}),Object.defineProperty(ImageCubeTexture.prototype,"negativeY",{get:function(){return this._htmlImageElements[3]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._htmlImageElements[3]=value},enumerable:!0,configurable:!0}),Object.defineProperty(ImageCubeTexture.prototype,"positiveZ",{get:function(){return this._htmlImageElements[4]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._htmlImageElements[4]=value},enumerable:!0,configurable:!0}),Object.defineProperty(ImageCubeTexture.prototype,"negativeZ",{get:function(){return this._htmlImageElements[5]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._htmlImageElements[5]=value},enumerable:!0,configurable:!0}),ImageCubeTexture.prototype._testSize=function(value){if(value.width!=value.height)throw new Error("BitmapData should have equal width and height!");if(!away.utils.TextureUtils.isHTMLImageElementValid(value))throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048")},ImageCubeTexture.prototype._iGetTextureData=function(side){return this._htmlImageElements[side]},ImageCubeTexture}(textures.CubeTextureBase);textures.ImageCubeTexture=ImageCubeTexture}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var BitmapCubeTexture=function(_super){function BitmapCubeTexture(posX,negX,posY,negY,posZ,negZ,generateMipmaps){"undefined"==typeof generateMipmaps&&(generateMipmaps=!1),_super.call(this,generateMipmaps),this._bitmapDatas=new Array(6),this._testSize(this._bitmapDatas[0]=posX),this._testSize(this._bitmapDatas[1]=negX),this._testSize(this._bitmapDatas[2]=posY),this._testSize(this._bitmapDatas[3]=negY),this._testSize(this._bitmapDatas[4]=posZ),this._testSize(this._bitmapDatas[5]=negZ),this.invalidateContent(),this._pSetSize(posX.width)}return __extends(BitmapCubeTexture,_super),Object.defineProperty(BitmapCubeTexture.prototype,"positiveX",{get:function(){return this._bitmapDatas[0]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._bitmapDatas[0]=value},enumerable:!0,configurable:!0}),Object.defineProperty(BitmapCubeTexture.prototype,"negativeX",{get:function(){return this._bitmapDatas[1]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._bitmapDatas[1]=value},enumerable:!0,configurable:!0}),Object.defineProperty(BitmapCubeTexture.prototype,"positiveY",{get:function(){return this._bitmapDatas[2]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._bitmapDatas[2]=value},enumerable:!0,configurable:!0}),Object.defineProperty(BitmapCubeTexture.prototype,"negativeY",{get:function(){return this._bitmapDatas[3]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._bitmapDatas[3]=value},enumerable:!0,configurable:!0}),Object.defineProperty(BitmapCubeTexture.prototype,"positiveZ",{get:function(){return this._bitmapDatas[4]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._bitmapDatas[4]=value},enumerable:!0,configurable:!0}),Object.defineProperty(BitmapCubeTexture.prototype,"negativeZ",{get:function(){return this._bitmapDatas[5]},set:function(value){this._testSize(value),this.invalidateContent(),this._pSetSize(value.width),this._bitmapDatas[5]=value},enumerable:!0,configurable:!0}),BitmapCubeTexture.prototype._testSize=function(value){if(value.width!=value.height)throw new Error("BitmapData should have equal width and height!");if(!away.utils.TextureUtils.isBitmapDataValid(value))throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048")},BitmapCubeTexture.prototype.dispose=function(){_super.prototype.dispose.call(this);for(var len=this._bitmapDatas.length,i=0;len>i;i++)this._bitmapDatas[i].dispose(),this._bitmapDatas[i]=null;this._bitmapDatas=null},BitmapCubeTexture.prototype._iGetTextureData=function(side){return this._bitmapDatas[side]},BitmapCubeTexture}(textures.CubeTextureBase);textures.BitmapCubeTexture=BitmapCubeTexture}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var BitmapData=away.base.BitmapData,Matrix=away.geom.Matrix,Rectangle=away.geom.Rectangle,MipmapGenerator=function(){function MipmapGenerator(){}return MipmapGenerator.generateMipMaps=function(source,output,alpha){"undefined"==typeof alpha&&(alpha=!1);var mipmap,w=source.width,h=source.height,i=0;for(MipmapGenerator._rect.width=w,MipmapGenerator._rect.height=h;w>=1&&h>=1;)mipmap=output[i]=MipmapGenerator._getMipmapHolder(output[i],w,h),alpha&&mipmap.fillRect(MipmapGenerator._rect,0),MipmapGenerator._matrix.a=MipmapGenerator._rect.width/source.width,MipmapGenerator._matrix.d=MipmapGenerator._rect.height/source.height,mipmap.draw(source,MipmapGenerator._matrix),w>>=1,h>>=1,MipmapGenerator._rect.width=w>1?w:1,MipmapGenerator._rect.height=h>1?h:1,i++},MipmapGenerator._getMipmapHolder=function(mipMapHolder,newW,newH){if(mipMapHolder){if(mipMapHolder.width==newW&&mipMapHolder.height==newH)return mipMapHolder;MipmapGenerator.freeMipMapHolder(mipMapHolder)}return MipmapGenerator._mipMaps[newW]||(MipmapGenerator._mipMaps[newW]=[],MipmapGenerator._mipMapUses[newW]=[]),MipmapGenerator._mipMaps[newW][newH]?(MipmapGenerator._mipMapUses[newW][newH]=MipmapGenerator._mipMapUses[newW][newH]+1,mipMapHolder=MipmapGenerator._mipMaps[newW][newH]):(mipMapHolder=MipmapGenerator._mipMaps[newW][newH]=new BitmapData(newW,newH,!0),MipmapGenerator._mipMapUses[newW][newH]=1),mipMapHolder},MipmapGenerator.freeMipMapHolder=function(mipMapHolder){var holderWidth=mipMapHolder.width,holderHeight=mipMapHolder.height;0==--MipmapGenerator._mipMapUses[holderWidth][holderHeight]&&(MipmapGenerator._mipMaps[holderWidth][holderHeight].dispose(),MipmapGenerator._mipMaps[holderWidth][holderHeight]=null)},MipmapGenerator._mipMaps=[],MipmapGenerator._mipMapUses=[],MipmapGenerator._matrix=new Matrix,MipmapGenerator._rect=new Rectangle,MipmapGenerator}();textures.MipmapGenerator=MipmapGenerator}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(textures){var BitmapData=away.base.BitmapData,BitmapDataChannel=away.base.BitmapDataChannel,Point=away.geom.Point,SpecularBitmapTexture=function(_super){function SpecularBitmapTexture(specularMap,glossMap,generateMipmaps){"undefined"==typeof specularMap&&(specularMap=null),"undefined"==typeof glossMap&&(glossMap=null),"undefined"==typeof generateMipmaps&&(generateMipmaps=!0);var bmd=specularMap?specularMap:glossMap;bmd=bmd?new BitmapData(bmd.width,bmd.height,!1,16777215):new BitmapData(1,1,!1,16777215),_super.call(this,bmd,generateMipmaps),this.specularMap=specularMap,this.glossMap=glossMap}return __extends(SpecularBitmapTexture,_super),Object.defineProperty(SpecularBitmapTexture.prototype,"specularMap",{get:function(){return this._specularMap},set:function(value){this._specularMap=value,this.invalidateContent(),this._testSize()},enumerable:!0,configurable:!0}),Object.defineProperty(SpecularBitmapTexture.prototype,"glossMap",{get:function(){return this._glossMap},set:function(value){this._glossMap=value,this.invalidateContent(),this._testSize()},enumerable:!0,configurable:!0}),SpecularBitmapTexture.prototype._testSize=function(){var w,h;if(this._specularMap?(w=this._specularMap.width,h=this._specularMap.height):this._glossMap?(w=this._glossMap.width,h=this._glossMap.height):(w=1,h=1),w!=this._bitmapData.width&&h!=this._bitmapData.height){var oldBitmap=this._bitmapData;this.bitmapData=new BitmapData(this._specularMap.width,this._specularMap.height,!1,16777215),oldBitmap.dispose()}},SpecularBitmapTexture.prototype._iGetTextureData=function(){var rect=this._specularMap.rect,origin=new Point;return this._bitmapData.fillRect(rect,16777215),this._glossMap&&this._bitmapData.copyChannel(this._glossMap,rect,origin,BitmapDataChannel.GREEN,BitmapDataChannel.GREEN),this._specularMap&&this._bitmapData.copyChannel(this._specularMap,rect,origin,BitmapDataChannel.RED,BitmapDataChannel.RED),this._bitmapData},SpecularBitmapTexture}(textures.BitmapTexture);textures.SpecularBitmapTexture=SpecularBitmapTexture}(away.textures||(away.textures={}));away.textures}(away||(away={}));var away;!function(away){!function(parsers){var AbstractMethodError=away.errors.AbstractMethodError,AssetEvent=away.events.AssetEvent,ParserEvent=away.events.ParserEvent,TimerEvent=away.events.TimerEvent,TextureUtils=away.utils.TextureUtils,Timer=away.utils.Timer,ParserBase=function(_super){function ParserBase(format){_super.call(this),this._materialMode=0,this._dataFormat=format,this._dependencies=new Array,this._pOnIntervalDelegate=away.utils.Delegate.create(this,this._pOnInterval)}return __extends(ParserBase,_super),ParserBase.supportsType=function(){throw new AbstractMethodError},Object.defineProperty(ParserBase.prototype,"content",{get:function(){return this._pContent},enumerable:!0,configurable:!0}),ParserBase.prototype.isBitmapDataValid=function(bitmapData){var isValid=TextureUtils.isBitmapDataValid(bitmapData);return isValid||console.log(">> Bitmap loaded is not having power of 2 dimensions or is higher than 2048"),isValid},Object.defineProperty(ParserBase.prototype,"parsingFailure",{get:function(){return this._parsingFailure},set:function(b){this._parsingFailure=b},enumerable:!0,configurable:!0}),Object.defineProperty(ParserBase.prototype,"parsingPaused",{get:function(){return this._parsingPaused},enumerable:!0,configurable:!0}),Object.defineProperty(ParserBase.prototype,"parsingComplete",{get:function(){return this._parsingComplete},enumerable:!0,configurable:!0}),Object.defineProperty(ParserBase.prototype,"materialMode",{get:function(){return this._materialMode},set:function(newMaterialMode){this._materialMode=newMaterialMode},enumerable:!0,configurable:!0}),Object.defineProperty(ParserBase.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),Object.defineProperty(ParserBase.prototype,"dataFormat",{get:function(){return this._dataFormat},enumerable:!0,configurable:!0}),ParserBase.prototype.parseAsync=function(data,frameLimit){"undefined"==typeof frameLimit&&(frameLimit=30),this._data=data,this._pStartParsing(frameLimit)},Object.defineProperty(ParserBase.prototype,"dependencies",{get:function(){return this._dependencies},enumerable:!0,configurable:!0}),ParserBase.prototype._iResolveDependency=function(){throw new AbstractMethodError},ParserBase.prototype._iResolveDependencyFailure=function(){throw new AbstractMethodError},ParserBase.prototype._iResolveDependencyName=function(resourceDependency,asset){return asset.name},ParserBase.prototype._iResumeParsingAfterDependencies=function(){this._parsingPaused=!1,this._timer&&this._timer.start()},ParserBase.prototype._pFinalizeAsset=function(asset,name){"undefined"==typeof name&&(name=null);null!=name&&(asset.name=name),asset.name||(asset.name=asset.assetType),this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_COMPLETE,asset))},ParserBase.prototype._pProceedParsing=function(){throw new AbstractMethodError},ParserBase.prototype._pDieWithError=function(message){"undefined"==typeof message&&(message="Unknown parsing error"),this._timer&&(this._timer.removeEventListener(TimerEvent.TIMER,this._pOnIntervalDelegate),this._timer.stop(),this._timer=null),this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR,message))},ParserBase.prototype._pAddDependency=function(id,req,retrieveAsRawData,data,suppressErrorEvents){"undefined"==typeof retrieveAsRawData&&(retrieveAsRawData=!1),"undefined"==typeof data&&(data=null),"undefined"==typeof suppressErrorEvents&&(suppressErrorEvents=!1);var dependency=new parsers.ResourceDependency(id,req,data,null,this,retrieveAsRawData,suppressErrorEvents);return this._dependencies.push(dependency),dependency},ParserBase.prototype._pPauseAndRetrieveDependencies=function(){this._timer&&this._timer.stop(),this._parsingPaused=!0,this.dispatchEvent(new ParserEvent(ParserEvent.READY_FOR_DEPENDENCIES))},ParserBase.prototype._pHasTime=function(){return away.utils.getTimer()-this._lastFrameTimei;i++)byteStr+=String.fromCharCode(bytes[i]);var base64Image=window.btoa(byteStr),str="data:image/png;base64,"+base64Image,img=new Image;return img.src=str,img},ParserUtils.byteArrayToImage=function(data){for(var byteStr="",bytes=new Uint8Array(data.arraybytes),len=bytes.byteLength,i=0;len>i;i++)byteStr+=String.fromCharCode(bytes[i]);var base64Image=window.btoa(byteStr),str="data:image/png;base64,"+base64Image,img=new Image;return img.src=str,img},ParserUtils.blobToImage=function(data){var URLObj=window.URL||window.webkitURL,src=URLObj.createObjectURL(data),img=new Image;return img.src=src,img},ParserUtils.toByteArray=function(data){var b=new ByteArray;return b.setArrayBuffer(data),b},ParserUtils.toString=function(data,length){if("undefined"==typeof length&&(length=0),"string"==typeof data){var s=data;if(null!=s.substr)return s.substr(0,s.length)}if(data instanceof ByteArray){var ba=data;return ba.position=0,ba.readUTFBytes(Math.min(ba.getBytesAvailable(),length))}return null},ParserUtils}();parsers.ParserUtils=ParserUtils}(away.parsers||(away.parsers={}));away.parsers}(away||(away={}));var away;!function(away){!function(parsers){var ResourceDependency=function(){function ResourceDependency(id,request,data,parser,parentParser,retrieveAsRawData,suppressAssetEvents){"undefined"==typeof retrieveAsRawData&&(retrieveAsRawData=!1),"undefined"==typeof suppressAssetEvents&&(suppressAssetEvents=!1),this._id=id,this._request=request,this._data=data,this._parser=parser,this._parentParser=parentParser,this._retrieveAsRawData=retrieveAsRawData,this._suppressAssetEvents=suppressAssetEvents,this._assets=new Array,this._dependencies=new Array}return Object.defineProperty(ResourceDependency.prototype,"id",{get:function(){return this._id},enumerable:!0,configurable:!0}),Object.defineProperty(ResourceDependency.prototype,"request",{get:function(){return this._request},enumerable:!0,configurable:!0}),Object.defineProperty(ResourceDependency.prototype,"data",{get:function(){return this._data},enumerable:!0,configurable:!0}),Object.defineProperty(ResourceDependency.prototype,"parser",{get:function(){return this._parser},enumerable:!0,configurable:!0}),Object.defineProperty(ResourceDependency.prototype,"parentParser",{get:function(){return this._parentParser},enumerable:!0,configurable:!0}),Object.defineProperty(ResourceDependency.prototype,"retrieveAsRawData",{get:function(){return this._retrieveAsRawData},enumerable:!0,configurable:!0}),Object.defineProperty(ResourceDependency.prototype,"suppresAssetEvents",{get:function(){return this._suppressAssetEvents},enumerable:!0,configurable:!0}),Object.defineProperty(ResourceDependency.prototype,"assets",{get:function(){return this._assets},enumerable:!0,configurable:!0}),Object.defineProperty(ResourceDependency.prototype,"dependencies",{get:function(){return this._dependencies},enumerable:!0,configurable:!0}),ResourceDependency.prototype._iSetData=function(data){this._data=data},ResourceDependency.prototype._iSetParser=function(parser){this._parser=parser},ResourceDependency.prototype.resolve=function(){this._parentParser&&this._parentParser._iResolveDependency(this)},ResourceDependency.prototype.resolveFailure=function(){this._parentParser&&this._parentParser._iResolveDependencyFailure(this)},ResourceDependency.prototype.resolveName=function(asset){return this._parentParser?this._parentParser._iResolveDependencyName(this,asset):asset.name},ResourceDependency}();parsers.ResourceDependency=ResourceDependency}(away.parsers||(away.parsers={}));away.parsers}(away||(away={}));var away;!function(away){!function(library){var AssetLoaderContext=function(){function AssetLoaderContext(includeDependencies,dependencyBaseUrl){"undefined"==typeof includeDependencies&&(includeDependencies=!0),"undefined"==typeof dependencyBaseUrl&&(dependencyBaseUrl=null),this._includeDependencies=includeDependencies,this._dependencyBaseUrl=dependencyBaseUrl||"",this._embeddedDataByUrl={},this._remappedUrls={},this._materialMode=AssetLoaderContext.UNDEFINED}return Object.defineProperty(AssetLoaderContext.prototype,"includeDependencies",{get:function(){return this._includeDependencies},set:function(val){this._includeDependencies=val},enumerable:!0,configurable:!0}),Object.defineProperty(AssetLoaderContext.prototype,"materialMode",{get:function(){return this._materialMode},set:function(materialMode){this._materialMode=materialMode},enumerable:!0,configurable:!0}),Object.defineProperty(AssetLoaderContext.prototype,"dependencyBaseUrl",{get:function(){return this._dependencyBaseUrl},set:function(val){this._dependencyBaseUrl=val},enumerable:!0,configurable:!0}),Object.defineProperty(AssetLoaderContext.prototype,"overrideAbsolutePaths",{get:function(){return this._overrideAbsPath},set:function(val){this._overrideAbsPath=val},enumerable:!0,configurable:!0}),Object.defineProperty(AssetLoaderContext.prototype,"overrideFullURLs",{get:function(){return this._overrideFullUrls},set:function(val){this._overrideFullUrls=val},enumerable:!0,configurable:!0}),AssetLoaderContext.prototype.mapUrl=function(originalUrl,newUrl){this._remappedUrls[originalUrl]=newUrl},AssetLoaderContext.prototype.mapUrlToData=function(originalUrl,data){this._embeddedDataByUrl[originalUrl]=data},AssetLoaderContext.prototype._iHasDataForUrl=function(url){return this._embeddedDataByUrl.hasOwnProperty(url)},AssetLoaderContext.prototype._iGetDataForUrl=function(url){return this._embeddedDataByUrl[url]},AssetLoaderContext.prototype._iHasMappingForUrl=function(url){return this._remappedUrls.hasOwnProperty(url)},AssetLoaderContext.prototype._iGetRemappedUrl=function(originalUrl){return this._remappedUrls[originalUrl]},AssetLoaderContext.UNDEFINED=0,AssetLoaderContext.SINGLEPASS_MATERIALS=1,AssetLoaderContext.MULTIPASS_MATERIALS=2,AssetLoaderContext}();library.AssetLoaderContext=AssetLoaderContext}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var URLLoader=away.net.URLLoader,URLLoaderDataFormat=away.net.URLLoaderDataFormat,CubeTextureParser=away.parsers.CubeTextureParser,ResourceDependency=away.parsers.ResourceDependency,Texture2DParser=away.parsers.Texture2DParser,AssetLoader=function(_super){function AssetLoader(materialMode){"undefined"==typeof materialMode&&(materialMode=0),_super.call(this),this._materialMode=materialMode,this._stack=new Array,this._errorHandlers=new Array,this._parseErrorHandlers=new Array,this._onReadyForDependenciesDelegate=away.utils.Delegate.create(this,this.onReadyForDependencies),this._onParseCompleteDelegate=away.utils.Delegate.create(this,this.onParseComplete),this._onParseErrorDelegate=away.utils.Delegate.create(this,this.onParseError),this._onLoadCompleteDelegate=away.utils.Delegate.create(this,this.onLoadComplete),this._onLoadErrorDelegate=away.utils.Delegate.create(this,this.onLoadError),this._onTextureSizeErrorDelegate=away.utils.Delegate.create(this,this.onTextureSizeError),this._onAssetCompleteDelegate=away.utils.Delegate.create(this,this.onAssetComplete)}return __extends(AssetLoader,_super),AssetLoader.enableParser=function(parser){AssetLoader._parsers.indexOf(parser)<0&&AssetLoader._parsers.push(parser)},AssetLoader.enableParsers=function(parsers){for(var c=0;ci;i++)this._currentDependency.dependencies[i]=parserDependancies[i];parserDependancies.length=0,this._stack.push(this._currentDependency),this.retrieveNext()}},AssetLoader.prototype.resolveParserDependencies=function(){this._currentDependency._iSuccess=!0,this._currentDependency.parser&&this._currentDependency.parser.dependencies.length&&(!this._context||this._context.includeDependencies)?this.retrieveParserDependencies():this.retrieveNext()},AssetLoader.prototype.onLoadError=function(event){var handled,isDependency=this._currentDependency!=this._baseDependency,loader=event.target;if(this.removeEventListeners(loader),this.hasEventListener(away.events.IOErrorEvent.IO_ERROR))this.dispatchEvent(event),handled=!0;else{var i,len=this._errorHandlers.length;for(i=0;len>i;i++)handled||(handled=this._errorHandlers[i](event))}if(!handled)throw new away.errors.Error;return isDependency?(this._currentDependency.resolveFailure(),this.retrieveNext(),void 0):(this.dispose(),void 0)},AssetLoader.prototype.onParseError=function(event){var handled,loader=(this._currentDependency!=this._baseDependency,event.target);if(this.removeEventListeners(loader),this.hasEventListener(away.events.ParserEvent.PARSE_ERROR))this.dispatchEvent(event),handled=!0;else{var i,len=this._parseErrorHandlers.length;for(i=0;len>i;i++)handled||(handled=this._parseErrorHandlers[i](event))}if(handled)return this.dispose(),void 0;throw new away.errors.Error(event.message)},AssetLoader.prototype.onAssetComplete=function(event){this._currentDependency&&this._currentDependency.assets.push(event.asset),event.asset.resetAssetPath(event.asset.name,this._namespace),this._currentDependency.suppresAssetEvents||this.dispatchEvent(event)},AssetLoader.prototype.onReadyForDependencies=function(event){var parser=event.target;this._context&&!this._context.includeDependencies?parser._iResumeParsingAfterDependencies():this.retrieveParserDependencies()},AssetLoader.prototype.onLoadComplete=function(event){var loader=event.target;this.removeEventListeners(loader),this._currentDependency._iSetData(loader.data),this._currentDependency.retrieveAsRawData?this.resolveParserDependencies():this.parseDependency(this._currentDependency)},AssetLoader.prototype.onParseComplete=function(event){var parser=event.target;this.resolveParserDependencies(),parser.removeEventListener(away.events.ParserEvent.READY_FOR_DEPENDENCIES,this._onReadyForDependenciesDelegate),parser.removeEventListener(away.events.ParserEvent.PARSE_COMPLETE,this._onParseCompleteDelegate),parser.removeEventListener(away.events.ParserEvent.PARSE_ERROR,this._onParseErrorDelegate),parser.removeEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR,this._onTextureSizeErrorDelegate),parser.removeEventListener(away.events.AssetEvent.ASSET_COMPLETE,this._onAssetCompleteDelegate)},AssetLoader.prototype.onTextureSizeError=function(event){event.asset.name=this._currentDependency.resolveName(event.asset),this.dispatchEvent(event)},AssetLoader.prototype.addEventListeners=function(loader){loader.addEventListener(away.events.Event.COMPLETE,this._onLoadCompleteDelegate),loader.addEventListener(away.events.IOErrorEvent.IO_ERROR,this._onLoadErrorDelegate)},AssetLoader.prototype.removeEventListeners=function(loader){loader.removeEventListener(away.events.Event.COMPLETE,this._onLoadCompleteDelegate),loader.removeEventListener(away.events.IOErrorEvent.IO_ERROR,this._onLoadErrorDelegate)},AssetLoader.prototype.stop=function(){this.dispose()},AssetLoader.prototype.dispose=function(){this._errorHandlers=null,this._parseErrorHandlers=null,this._context=null,this._token=null,this._stack=null,this._currentDependency&&this._currentDependency._iLoader&&this.removeEventListeners(this._currentDependency._iLoader),this._currentDependency=null},AssetLoader.prototype._iAddParseErrorHandler=function(handler){this._parseErrorHandlers.indexOf(handler)<0&&this._parseErrorHandlers.push(handler)},AssetLoader.prototype._iAddErrorHandler=function(handler){this._errorHandlers.indexOf(handler)<0&&this._errorHandlers.push(handler)},AssetLoader.prototype.getParserFromData=function(data){for(var len=AssetLoader._parsers.length,i=len-1;i>=0;i--)if(AssetLoader._parsers[i].supportsData(data))return new AssetLoader._parsers[i];return null},AssetLoader.prototype.parseDependency=function(dependency){var parser=dependency.parser;if(parser||dependency._iSetParser(parser=this.getParserFromData(dependency.data)),parser)parser.addEventListener(away.events.ParserEvent.READY_FOR_DEPENDENCIES,this._onReadyForDependenciesDelegate),parser.addEventListener(away.events.ParserEvent.PARSE_COMPLETE,this._onParseCompleteDelegate),parser.addEventListener(away.events.ParserEvent.PARSE_ERROR,this._onParseErrorDelegate),parser.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR,this._onTextureSizeErrorDelegate),parser.addEventListener(away.events.AssetEvent.ASSET_COMPLETE,this._onAssetCompleteDelegate),dependency.request&&dependency.request.url&&(parser._iFileName=dependency.request.url),parser.materialMode=this._materialMode,parser.parseAsync(dependency.data);else{var message="No parser defined. To enable all parsers for auto-detection, use Parsers.enableAllBundled()";if(!this.hasEventListener(away.events.ParserEvent.PARSE_ERROR))throw new Error(message);this.dispatchEvent(new away.events.ParserEvent(away.events.ParserEvent.PARSE_ERROR,message))}},AssetLoader.prototype.getParserFromSuffix=function(url){for(var base=url.indexOf("?")>0?url.split("?")[0]:url,fileExtension=base.substr(base.lastIndexOf(".")+1).toLowerCase(),len=AssetLoader._parsers.length,i=len-1;i>=0;i--){var parserClass=AssetLoader._parsers[i];if(parserClass.supportsType(fileExtension))return new parserClass}return null},AssetLoader._parsers=new Array(Texture2DParser,CubeTextureParser),AssetLoader}(away.events.EventDispatcher);library.AssetLoader=AssetLoader}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var AssetLoaderToken=function(_super){function AssetLoaderToken(loader){_super.call(this),this._iLoader=loader}return __extends(AssetLoaderToken,_super),AssetLoaderToken.prototype.addEventListener=function(type,listener){this._iLoader.addEventListener(type,listener)},AssetLoaderToken.prototype.removeEventListener=function(type,listener){this._iLoader.removeEventListener(type,listener)},AssetLoaderToken.prototype.hasEventListener=function(type,listener){return"undefined"==typeof listener&&(listener=null),this._iLoader.hasEventListener(type,listener)},AssetLoaderToken}(away.events.EventDispatcher);library.AssetLoaderToken=AssetLoaderToken}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var IDUtil=function(){function IDUtil(){}return IDUtil.createUID=function(){var i,j,uid=new Array(36),index=0;for(i=0;8>i;i++)uid[index++]=IDUtil.ALPHA_CHAR_CODES[Math.floor(16*Math.random())];for(i=0;3>i;i++)for(uid[index++]=45,j=0;4>j;j++)uid[index++]=IDUtil.ALPHA_CHAR_CODES[Math.floor(16*Math.random())];uid[index++]=45;var time=(new Date).getTime(),timeString=("0000000"+time.toString(16).toUpperCase()).substr(-8);for(i=0;8>i;i++)uid[index++]=timeString.charCodeAt(i);for(i=0;4>i;i++)uid[index++]=IDUtil.ALPHA_CHAR_CODES[Math.floor(16*Math.random())];return String.fromCharCode.apply(null,uid)},IDUtil.ALPHA_CHAR_CODES=[48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70],IDUtil}();library.IDUtil=IDUtil}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var AssetLibraryIterator=function(){function AssetLibraryIterator(assets,assetTypeFilter,namespaceFilter,filterFunc){this._assets=assets,this.filter(assetTypeFilter,namespaceFilter,filterFunc)}return Object.defineProperty(AssetLibraryIterator.prototype,"currentAsset",{get:function(){return this._idxc;c++)asset=this._assets[c],assetTypeFilter&&asset.assetType!=assetTypeFilter||namespaceFilter&&asset.assetNamespace!=namespaceFilter||(null==filterFunc||filterFunc(asset))&&(this._filtered[idx++]=asset)}else this._filtered=this._assets},AssetLibraryIterator}();library.AssetLibraryIterator=AssetLibraryIterator}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var AbstractMethodError=away.errors.AbstractMethodError,ConflictStrategyBase=function(){function ConflictStrategyBase(){}return ConflictStrategyBase.prototype.resolveConflict=function(){throw new AbstractMethodError},ConflictStrategyBase.prototype.create=function(){throw new AbstractMethodError},ConflictStrategyBase.prototype._pUpdateNames=function(ns,nonConflictingName,oldAsset,newAsset,assetsDictionary,precedence){var loser_prev_name,winner,loser;winner=precedence===library.ConflictPrecedence.FAVOR_NEW?newAsset:oldAsset,loser=precedence===library.ConflictPrecedence.FAVOR_NEW?oldAsset:newAsset,loser_prev_name=loser.name,assetsDictionary[winner.name]=winner,assetsDictionary[nonConflictingName]=loser,loser.resetAssetPath(nonConflictingName,ns,!1),loser.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED,loser,loser_prev_name))},ConflictStrategyBase}();library.ConflictStrategyBase=ConflictStrategyBase}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var NumSuffixConflictStrategy=function(_super){function NumSuffixConflictStrategy(separator){"undefined"==typeof separator&&(separator="."),_super.call(this),this._separator=separator,this._next_suffix={}}return __extends(NumSuffixConflictStrategy,_super),NumSuffixConflictStrategy.prototype.resolveConflict=function(changedAsset,oldAsset,assetsDictionary,precedence){var orig,new_name,base,suffix;orig=changedAsset.name,orig.indexOf(this._separator)>=0?(base=orig.substring(0,orig.lastIndexOf(this._separator)),suffix=parseInt(orig.substring(base.length-1)),isNaN(suffix)&&(base=orig,suffix=0)):(base=orig,suffix=0),0==suffix&&this._next_suffix.hasOwnProperty(base)&&(suffix=this._next_suffix[base]);do suffix++,new_name=base.concat(this._separator,suffix.toString());while(assetsDictionary.hasOwnProperty(new_name));this._next_suffix[base]=suffix,this._pUpdateNames(oldAsset.assetNamespace,new_name,oldAsset,changedAsset,assetsDictionary,precedence)},NumSuffixConflictStrategy.prototype.create=function(){return new NumSuffixConflictStrategy(this._separator)},NumSuffixConflictStrategy}(library.ConflictStrategyBase);library.NumSuffixConflictStrategy=NumSuffixConflictStrategy}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var IgnoreConflictStrategy=function(_super){function IgnoreConflictStrategy(){_super.call(this)}return __extends(IgnoreConflictStrategy,_super),IgnoreConflictStrategy.prototype.resolveConflict=function(){},IgnoreConflictStrategy.prototype.create=function(){return new IgnoreConflictStrategy},IgnoreConflictStrategy}(library.ConflictStrategyBase);library.IgnoreConflictStrategy=IgnoreConflictStrategy}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var ErrorConflictStrategy=function(_super){function ErrorConflictStrategy(){_super.call(this)}return __extends(ErrorConflictStrategy,_super),ErrorConflictStrategy.prototype.resolveConflict=function(changedAsset){throw new away.errors.Error("Asset name collision while AssetLibrary.namingStrategy set to AssetLibrary.THROW_ERROR. Asset path: "+changedAsset.assetFullPath)},ErrorConflictStrategy.prototype.create=function(){return new ErrorConflictStrategy},ErrorConflictStrategy}(library.ConflictStrategyBase);library.ErrorConflictStrategy=ErrorConflictStrategy}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var ConflictPrecedence=function(){function ConflictPrecedence(){}return ConflictPrecedence.FAVOR_OLD="favorOld",ConflictPrecedence.FAVOR_NEW="favorNew",ConflictPrecedence}();library.ConflictPrecedence=ConflictPrecedence}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var ConflictStrategy=function(){function ConflictStrategy(){}return ConflictStrategy.APPEND_NUM_SUFFIX=new library.NumSuffixConflictStrategy,ConflictStrategy.IGNORE=new library.IgnoreConflictStrategy,ConflictStrategy.THROW_ERROR=new library.ErrorConflictStrategy,ConflictStrategy}();library.ConflictStrategy=ConflictStrategy}(away.library||(away.library={}));away.library}(away||(away={}));var away;!function(away){!function(library){var AssetLibraryBundle=function(_super){function AssetLibraryBundle(){_super.call(this),this._loadingSessionsGarbage=new Array,this._assets=new Array,this._assetDictionary=new Object,this._loadingSessions=new Array,this.conflictStrategy=library.ConflictStrategy.IGNORE.create(),this.conflictPrecedence=library.ConflictPrecedence.FAVOR_NEW,this._onAssetRenameDelegate=away.utils.Delegate.create(this,this.onAssetRename),this._onAssetConflictResolvedDelegate=away.utils.Delegate.create(this,this.onAssetConflictResolved),this._onResourceCompleteDelegate=away.utils.Delegate.create(this,this.onResourceComplete),this._onTextureSizeErrorDelegate=away.utils.Delegate.create(this,this.onTextureSizeError),this._onAssetCompleteDelegate=away.utils.Delegate.create(this,this.onAssetComplete),this._onLoadErrorDelegate=away.utils.Delegate.create(this,this.onLoadError),this._onParseErrorDelegate=away.utils.Delegate.create(this,this.onParseError)}return __extends(AssetLibraryBundle,_super),AssetLibraryBundle.getInstance=function(key){return"undefined"==typeof key&&(key="default"),key||(key="default"),library.AssetLibrary._iInstances.hasOwnProperty(key)||(library.AssetLibrary._iInstances[key]=new AssetLibraryBundle(new AssetLibraryBundleSingletonEnforcer)),library.AssetLibrary._iInstances[key]},AssetLibraryBundle.prototype.enableParser=function(parserClass){library.AssetLoader.enableParser(parserClass)},AssetLibraryBundle.prototype.enableParsers=function(parserClasses){library.AssetLoader.enableParsers(parserClasses)},Object.defineProperty(AssetLibraryBundle.prototype,"conflictStrategy",{get:function(){return this._strategy},set:function(val){if(!val)throw new away.errors.Error("namingStrategy must not be null. To ignore naming, use AssetLibrary.IGNORE");this._strategy=val.create()},enumerable:!0,configurable:!0}),Object.defineProperty(AssetLibraryBundle.prototype,"conflictPrecedence",{get:function(){return this._strategyPreference},set:function(val){this._strategyPreference=val},enumerable:!0,configurable:!0}),AssetLibraryBundle.prototype.createIterator=function(assetTypeFilter,namespaceFilter,filterFunc){return"undefined"==typeof assetTypeFilter&&(assetTypeFilter=null),"undefined"==typeof namespaceFilter&&(namespaceFilter=null),"undefined"==typeof filterFunc&&(filterFunc=null),new library.AssetLibraryIterator(this._assets,assetTypeFilter,namespaceFilter,filterFunc)},AssetLibraryBundle.prototype.load=function(req,context,ns,parser){"undefined"==typeof context&&(context=null),"undefined"==typeof ns&&(ns=null),"undefined"==typeof parser&&(parser=null);var loader=new library.AssetLoader;return this._loadingSessions||(this._loadingSessions=new Array),this._loadingSessions.push(loader),loader.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE,this._onResourceCompleteDelegate),loader.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR,this._onTextureSizeErrorDelegate),loader.addEventListener(away.events.AssetEvent.ASSET_COMPLETE,this._onAssetCompleteDelegate),loader._iAddErrorHandler(this._onLoadErrorDelegate),loader._iAddParseErrorHandler(this._onParseErrorDelegate),loader.load(req,context,ns,parser)},AssetLibraryBundle.prototype.loadData=function(data,context,ns,parser){"undefined"==typeof context&&(context=null),"undefined"==typeof ns&&(ns=null),"undefined"==typeof parser&&(parser=null);var loader=new library.AssetLoader;return this._loadingSessions||(this._loadingSessions=new Array),this._loadingSessions.push(loader),loader.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE,this._onResourceCompleteDelegate),loader.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR,this._onTextureSizeErrorDelegate),loader.addEventListener(away.events.AssetEvent.ASSET_COMPLETE,this._onAssetCompleteDelegate),loader._iAddErrorHandler(this._onLoadErrorDelegate),loader._iAddParseErrorHandler(this._onParseErrorDelegate),loader.loadData(data,"",context,ns,parser)},AssetLibraryBundle.prototype.getAsset=function(name,ns){return"undefined"==typeof ns&&(ns=null),this._assetDictDirty&&this.rehashAssetDict(),null==ns&&(ns=library.NamedAssetBase.DEFAULT_NAMESPACE),this._assetDictionary.hasOwnProperty(ns)?this._assetDictionary[ns][name]:null -},AssetLibraryBundle.prototype.addAsset=function(asset){var ns,old;this._assets.indexOf(asset)>=0||(old=this.getAsset(asset.name,asset.assetNamespace),ns=asset.assetNamespace||library.NamedAssetBase.DEFAULT_NAMESPACE,null!=old&&this._strategy.resolveConflict(asset,old,this._assetDictionary[ns],this._strategyPreference),this._assets.push(asset),this._assetDictionary.hasOwnProperty(ns)||(this._assetDictionary[ns]=new Object),this._assetDictionary[ns][asset.name]=asset,asset.addEventListener(away.events.AssetEvent.ASSET_RENAME,this._onAssetRenameDelegate),asset.addEventListener(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED,this._onAssetConflictResolvedDelegate))},AssetLibraryBundle.prototype.removeAsset=function(asset,dispose){"undefined"==typeof dispose&&(dispose=!0);var idx;this.removeAssetFromDict(asset),asset.removeEventListener(away.events.AssetEvent.ASSET_RENAME,this._onAssetRenameDelegate),asset.removeEventListener(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED,this._onAssetConflictResolvedDelegate),idx=this._assets.indexOf(asset),idx>=0&&this._assets.splice(idx,1),dispose&&asset.dispose()},AssetLibraryBundle.prototype.removeAssetByName=function(name,ns,dispose){"undefined"==typeof ns&&(ns=null),"undefined"==typeof dispose&&(dispose=!0);var asset=this.getAsset(name,ns);return asset&&this.removeAsset(asset,dispose),asset},AssetLibraryBundle.prototype.removeAllAssets=function(dispose){if("undefined"==typeof dispose&&(dispose=!0),dispose)for(var asset,c=0;ci;i++)this.killLoadingSession(this._loadingSessions[i]);this._loadingSessions=null},AssetLibraryBundle.prototype.rehashAssetDict=function(){var asset;this._assetDictionary={};for(var l=this._assets.length,c=0;l>c;c++)asset=this._assets[c],this._assetDictionary.hasOwnProperty(asset.assetNamespace)||(this._assetDictionary[asset.assetNamespace]={}),this._assetDictionary[asset.assetNamespace][asset.name]=asset;this._assetDictDirty=!1},AssetLibraryBundle.prototype.onLoadError=function(event){return this.hasEventListener(away.events.IOErrorEvent.IO_ERROR)?(this.dispatchEvent(event),!0):!1},AssetLibraryBundle.prototype.onParseError=function(event){return this.hasEventListener(away.events.ParserEvent.PARSE_ERROR)?(this.dispatchEvent(event),!0):!1},AssetLibraryBundle.prototype.onAssetComplete=function(event){event.type==away.events.AssetEvent.ASSET_COMPLETE&&this.addAsset(event.asset),this.dispatchEvent(event)},AssetLibraryBundle.prototype.onTextureSizeError=function(event){this.dispatchEvent(event)},AssetLibraryBundle.prototype.onResourceComplete=function(event){var _this=this,loader=event.target;this.dispatchEvent(event);var index=this._loadingSessions.indexOf(loader);this._loadingSessions.splice(index,1),this._loadingSessionsGarbage.push(loader),this._gcTimeoutIID=setTimeout(function(){_this.loadingSessionGC()},100)},AssetLibraryBundle.prototype.loadingSessionGC=function(){for(var loader;this._loadingSessionsGarbage.length>0;)loader=this._loadingSessionsGarbage.pop(),this.killLoadingSession(loader);clearTimeout(this._gcTimeoutIID),this._gcTimeoutIID=null},AssetLibraryBundle.prototype.killLoadingSession=function(loader){loader.removeEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE,this._onResourceCompleteDelegate),loader.removeEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR,this._onTextureSizeErrorDelegate),loader.removeEventListener(away.events.AssetEvent.ASSET_COMPLETE,this._onAssetCompleteDelegate),loader.stop()},AssetLibraryBundle.prototype.onAssetRename=function(ev){var asset=ev.target,old=this.getAsset(asset.assetNamespace,asset.name);if(null!=old)this._strategy.resolveConflict(asset,old,this._assetDictionary[asset.assetNamespace],this._strategyPreference);else{var dict=this._assetDictionary[ev.asset.assetNamespace];if(null==dict)return;dict[ev.assetPrevName]=null,dict[ev.asset.name]=ev.asset}},AssetLibraryBundle.prototype.onAssetConflictResolved=function(ev){this.dispatchEvent(ev.clone())},AssetLibraryBundle}(away.events.EventDispatcher);library.AssetLibraryBundle=AssetLibraryBundle}(away.library||(away.library={}));away.library}(away||(away={}));var AssetLibraryBundleSingletonEnforcer=function(){function AssetLibraryBundleSingletonEnforcer(){}return AssetLibraryBundleSingletonEnforcer}(),away;!function(away){!function(library){var AssetLibrary=function(){function AssetLibrary(se){se=se}return AssetLibrary.getBundle=function(key){return"undefined"==typeof key&&(key="default"),library.AssetLibraryBundle.getInstance(key)},AssetLibrary.enableParser=function(parserClass){library.AssetLoader.enableParser(parserClass)},AssetLibrary.enableParsers=function(parserClasses){library.AssetLoader.enableParsers(parserClasses)},Object.defineProperty(AssetLibrary,"conflictStrategy",{get:function(){return AssetLibrary.getBundle().conflictStrategy},set:function(val){AssetLibrary.getBundle().conflictStrategy=val},enumerable:!0,configurable:!0}),Object.defineProperty(AssetLibrary,"conflictPrecedence",{get:function(){return AssetLibrary.getBundle().conflictPrecedence},set:function(val){AssetLibrary.getBundle().conflictPrecedence=val},enumerable:!0,configurable:!0}),AssetLibrary.createIterator=function(assetTypeFilter,namespaceFilter,filterFunc){return"undefined"==typeof assetTypeFilter&&(assetTypeFilter=null),"undefined"==typeof namespaceFilter&&(namespaceFilter=null),"undefined"==typeof filterFunc&&(filterFunc=null),AssetLibrary.getBundle().createIterator(assetTypeFilter,namespaceFilter,filterFunc)},AssetLibrary.load=function(req,context,ns,parser){return"undefined"==typeof context&&(context=null),"undefined"==typeof ns&&(ns=null),"undefined"==typeof parser&&(parser=null),AssetLibrary.getBundle().load(req,context,ns,parser)},AssetLibrary.loadData=function(data,context,ns,parser){return"undefined"==typeof context&&(context=null),"undefined"==typeof ns&&(ns=null),"undefined"==typeof parser&&(parser=null),AssetLibrary.getBundle().loadData(data,context,ns,parser)},AssetLibrary.stopLoad=function(){AssetLibrary.getBundle().stopAllLoadingSessions()},AssetLibrary.getAsset=function(name,ns){return"undefined"==typeof ns&&(ns=null),AssetLibrary.getBundle().getAsset(name,ns)},AssetLibrary.addEventListener=function(type,listener){AssetLibrary.getBundle().addEventListener(type,listener)},AssetLibrary.removeEventListener=function(type,listener){AssetLibrary.getBundle().removeEventListener(type,listener)},AssetLibrary.addAsset=function(asset){AssetLibrary.getBundle().addAsset(asset)},AssetLibrary.removeAsset=function(asset,dispose){"undefined"==typeof dispose&&(dispose=!0),AssetLibrary.getBundle().removeAsset(asset,dispose)},AssetLibrary.removeAssetByName=function(name,ns,dispose){return"undefined"==typeof ns&&(ns=null),"undefined"==typeof dispose&&(dispose=!0),AssetLibrary.getBundle().removeAssetByName(name,ns,dispose)},AssetLibrary.removeAllAssets=function(dispose){"undefined"==typeof dispose&&(dispose=!0),AssetLibrary.getBundle().removeAllAssets(dispose)},AssetLibrary.removeNamespaceAssets=function(ns,dispose){"undefined"==typeof ns&&(ns=null),"undefined"==typeof dispose&&(dispose=!0),AssetLibrary.getBundle().removeNamespaceAssets(ns,dispose)},AssetLibrary._iInstances={},AssetLibrary}();library.AssetLibrary=AssetLibrary}(away.library||(away.library={}));away.library}(away||(away={}));var AssetLibrarySingletonEnforcer=function(){function AssetLibrarySingletonEnforcer(){}return AssetLibrarySingletonEnforcer}(),away;!function(away){!function(pool){var EntityListItem=function(){function EntityListItem(){}return EntityListItem}();pool.EntityListItem=EntityListItem}(away.pool||(away.pool={}));away.pool}(away||(away={}));var away;!function(away){!function(pool){var EntityListItemPool=function(){function EntityListItemPool(){this._index=0,this._poolSize=0,this._pool=[]}return EntityListItemPool.prototype.getItem=function(){var item;return this._index==this._poolSize?(item=new pool.EntityListItem,this._pool[this._index++]=item,++this._poolSize):item=this._pool[this._index++],item},EntityListItemPool.prototype.freeAll=function(){this._index=0},EntityListItemPool.prototype.dispose=function(){this._pool.length=0},EntityListItemPool}();pool.EntityListItemPool=EntityListItemPool}(away.pool||(away.pool={}));away.pool}(away||(away={}));var away;!function(away){!function(){}(away.pool||(away.pool={}));away.pool}(away||(away={}));var away;!function(away){!function(_pool){var RenderablePool=function(){function RenderablePool(renderableClass){this._pool=new Object,this._renderableClass=renderableClass}return RenderablePool.prototype.getItem=function(materialOwner){return this._pool[materialOwner.id]||(this._pool[materialOwner.id]=materialOwner._iAddRenderable(new this._renderableClass(this,materialOwner)))},RenderablePool.prototype.disposeItem=function(materialOwner){materialOwner._iRemoveRenderable(this._pool[materialOwner.id]),this._pool[materialOwner.id]=null},RenderablePool.getPool=function(renderableClass){var pool=RenderablePool._pools[renderableClass.id];return void 0!=pool?pool:RenderablePool._pools[renderableClass.id]=new RenderablePool(renderableClass)},RenderablePool.disposePool=function(renderableClass){RenderablePool._pools[renderableClass.id]&&(RenderablePool._pools[renderableClass.id]=void 0)},RenderablePool._pools=new Object,RenderablePool}();_pool.RenderablePool=RenderablePool}(away.pool||(away.pool={}));away.pool}(away||(away={}));var away;!function(away){!function(_pool){var CSSRenderableBase=function(){function CSSRenderableBase(pool,sourceEntity,materialOwner){this._pool=pool,this.sourceEntity=sourceEntity,this.materialOwner=materialOwner}return CSSRenderableBase.prototype.dispose=function(){this._pool.disposeItem(this.materialOwner)},CSSRenderableBase.prototype.invalidateGeometry=function(){},CSSRenderableBase.prototype.invalidateIndexData=function(){},CSSRenderableBase.prototype.invalidateVertexData=function(){},CSSRenderableBase}();_pool.CSSRenderableBase=CSSRenderableBase}(away.pool||(away.pool={}));away.pool}(away||(away={}));var away;!function(away){!function(_pool){var CSSBillboardRenderable=function(_super){function CSSBillboardRenderable(pool,billboard){_super.call(this,pool,billboard,billboard);var div=document.createElement("div");div.onmousedown=function(){return!1},this.htmlElement=div;var style=div.style;style.position="absolute",style.transformOrigin=style["-webkit-transform-origin"]=style["-moz-transform-origin"]=style["-o-transform-origin"]=style["-ms-transform-origin"]="0% 0%";var img=document.createElement("div");div.appendChild(img),img.className="material"+billboard.material.id}return __extends(CSSBillboardRenderable,_super),CSSBillboardRenderable.id="billboard",CSSBillboardRenderable}(_pool.CSSRenderableBase);_pool.CSSBillboardRenderable=CSSBillboardRenderable}(away.pool||(away.pool={}));away.pool}(away||(away={}));var away;!function(away){!function(_pool){var CSSLineSegmentRenderable=function(_super){function CSSLineSegmentRenderable(pool,lineSegment){_super.call(this,pool,lineSegment,lineSegment);var div=document.createElement("div");div.onmousedown=function(){return!1},this.htmlElement=div;var style=div.style;style.position="absolute",style.transformOrigin=style["-webkit-transform-origin"]=style["-moz-transform-origin"]=style["-o-transform-origin"]=style["-ms-transform-origin"]="0% 0%";var img=document.createElement("div");div.appendChild(img),img.className="material"+lineSegment.material.id}return __extends(CSSLineSegmentRenderable,_super),CSSLineSegmentRenderable.id="lineSegment",CSSLineSegmentRenderable}(_pool.CSSRenderableBase);_pool.CSSLineSegmentRenderable=CSSLineSegmentRenderable}(away.pool||(away.pool={}));away.pool}(away||(away={}));var away;!function(away){!function(_pool){var CSSSkyboxRenderable=function(_super){function CSSSkyboxRenderable(pool,skyBox){_super.call(this,pool,skyBox,skyBox);var div=document.createElement("div");div.onmousedown=function(){return!1},this.htmlElement=div;var img,style=div.style;style.position="absolute",style.transformOrigin=style["-webkit-transform-origin"]=style["-moz-transform-origin"]=style["-o-transform-origin"]=style["-ms-transform-origin"]="0% 0%",img=document.createElement("div"),div.appendChild(img),img.className="material"+skyBox.material.id}return __extends(CSSSkyboxRenderable,_super),CSSSkyboxRenderable.id="skybox",CSSSkyboxRenderable}(_pool.CSSRenderableBase);_pool.CSSSkyboxRenderable=CSSSkyboxRenderable}(away.pool||(away.pool={}));away.pool}(away||(away={}));var away;!function(away){!function(traverse){var EntityListItemPool=away.pool.EntityListItemPool,CollectorBase=function(){function CollectorBase(){this._numCullPlanes=0,this._pNumEntities=0,this._pNumInteractiveEntities=0,this._pEntityListItemPool=new EntityListItemPool}return Object.defineProperty(CollectorBase.prototype,"camera",{get:function(){return this._pCamera},set:function(value){this._pCamera=value,this._cullPlanes=this._pCamera.frustumPlanes},enumerable:!0,configurable:!0}),Object.defineProperty(CollectorBase.prototype,"cullPlanes",{get:function(){return this._customCullPlanes},set:function(value){this._customCullPlanes=value},enumerable:!0,configurable:!0}),Object.defineProperty(CollectorBase.prototype,"entityHead",{get:function(){return this._pEntityHead},enumerable:!0,configurable:!0}),Object.defineProperty(CollectorBase.prototype,"numEntities",{get:function(){return this._pNumEntities},enumerable:!0,configurable:!0}),Object.defineProperty(CollectorBase.prototype,"numInteractiveEntities",{get:function(){return this._pNumInteractiveEntities},enumerable:!0,configurable:!0}),CollectorBase.prototype.clear=function(){this._pNumEntities=this._pNumInteractiveEntities=0,this._cullPlanes=this._customCullPlanes?this._customCullPlanes:this._pCamera?this._pCamera.frustumPlanes:null,this._numCullPlanes=this._cullPlanes?this._cullPlanes.length:0,this._pEntityHead=null,this._pEntityListItemPool.freeAll()},CollectorBase.prototype.enterNode=function(node){var enter=this.scene._iCollectionMark!=node._iCollectionMark&&node.isInFrustum(this._cullPlanes,this._numCullPlanes);return node._iCollectionMark=this.scene._iCollectionMark,enter},CollectorBase.prototype.applyDirectionalLight=function(){},CollectorBase.prototype.applyEntity=function(entity){this._pNumEntities++,entity._iIsMouseEnabled()&&this._pNumInteractiveEntities++;var item=this._pEntityListItemPool.getItem();item.entity=entity,item.next=this._pEntityHead,this._pEntityHead=item},CollectorBase.prototype.applyLightProbe=function(){},CollectorBase.prototype.applyPointLight=function(){},CollectorBase.prototype.applySkybox=function(){},CollectorBase}();traverse.CollectorBase=CollectorBase}(away.traverse||(away.traverse={}));away.traverse}(away||(away={}));var away;!function(away){!function(traverse){var EntityCollector=function(_super){function EntityCollector(){_super.call(this),this._pNumLights=0,this._numDirectionalLights=0,this._numPointLights=0,this._numLightProbes=0,this._pLights=new Array,this._directionalLights=new Array,this._pointLights=new Array,this._lightProbes=new Array}return __extends(EntityCollector,_super),Object.defineProperty(EntityCollector.prototype,"directionalLights",{get:function(){return this._directionalLights},enumerable:!0,configurable:!0}),Object.defineProperty(EntityCollector.prototype,"lightProbes",{get:function(){return this._lightProbes},enumerable:!0,configurable:!0}),Object.defineProperty(EntityCollector.prototype,"lights",{get:function(){return this._pLights},enumerable:!0,configurable:!0}),Object.defineProperty(EntityCollector.prototype,"pointLights",{get:function(){return this._pointLights},enumerable:!0,configurable:!0}),Object.defineProperty(EntityCollector.prototype,"skyBox",{get:function(){return this._pSkybox},enumerable:!0,configurable:!0}),EntityCollector.prototype.applyDirectionalLight=function(entity){this._directionalLights[this._numDirectionalLights++]=entity},EntityCollector.prototype.applyLightProbe=function(entity){this._lightProbes[this._numLightProbes++]=entity},EntityCollector.prototype.applyPointLight=function(entity){this._pointLights[this._numPointLights++]=entity},EntityCollector.prototype.applySkybox=function(entity){this._pSkybox=entity},EntityCollector.prototype.clear=function(){_super.prototype.clear.call(this),this._pSkybox=null,this._pNumLights>0&&(this._pLights.length=this._pNumLights=0),this._numDirectionalLights>0&&(this._directionalLights.length=this._numDirectionalLights=0),this._numPointLights>0&&(this._pointLights.length=this._numPointLights=0),this._numLightProbes>0&&(this._lightProbes.length=this._numLightProbes=0)},EntityCollector}(traverse.CollectorBase);traverse.EntityCollector=EntityCollector}(away.traverse||(away.traverse={}));away.traverse}(away||(away={}));var away;!function(away){!function(traverse){var Vector3D=away.geom.Vector3D,RaycastCollector=function(_super){function RaycastCollector(){_super.call(this),this._rayPosition=new Vector3D,this._rayDirection=new Vector3D,this._iCollectionMark=0}return __extends(RaycastCollector,_super),Object.defineProperty(RaycastCollector.prototype,"rayPosition",{get:function(){return this._rayPosition},set:function(value){this._rayPosition=value},enumerable:!0,configurable:!0}),Object.defineProperty(RaycastCollector.prototype,"rayDirection",{get:function(){return this._rayDirection},set:function(value){this._rayDirection=value},enumerable:!0,configurable:!0}),RaycastCollector.prototype.enterNode=function(node){return node.isIntersectingRay(this._rayPosition,this._rayDirection)},RaycastCollector}(traverse.CollectorBase);traverse.RaycastCollector=RaycastCollector}(away.traverse||(away.traverse={}));away.traverse}(away||(away={}));var away;!function(away){!function(traverse){var CSSEntityCollector=function(_super){function CSSEntityCollector(){_super.call(this)}return __extends(CSSEntityCollector,_super),CSSEntityCollector}(traverse.CollectorBase);traverse.CSSEntityCollector=CSSEntityCollector}(away.traverse||(away.traverse={}));away.traverse}(away||(away={}));var away;!function(away){!function(traverse){var ShadowCasterCollector=function(_super){function ShadowCasterCollector(){_super.call(this)}return __extends(ShadowCasterCollector,_super),ShadowCasterCollector.prototype.enterNode=function(node){var enter=this.scene._iCollectionMark!=node._iCollectionMark&&node.isCastingShadow();return enter?_super.prototype.enterNode.call(this,node):(node._iCollectionMark=this.scene._iCollectionMark,!1)},ShadowCasterCollector}(traverse.CollectorBase);traverse.ShadowCasterCollector=ShadowCasterCollector}(away.traverse||(away.traverse={}));away.traverse}(away||(away={}));var away;!function(away){!function(partition){var NodeBase=function(){function NodeBase(){this._pNumChildNodes=0,this._iNumEntities=0,this._pChildNodes=new Array}return Object.defineProperty(NodeBase.prototype,"boundsVisible",{get:function(){return this._explicitBoundsVisible},set:function(value){this._explicitBoundsVisible!=value&&(this._explicitBoundsVisible=value,this._iUpdateImplicitBoundsVisible(this._iParent?this._iParent.boundsChildrenVisible:!1))},enumerable:!0,configurable:!0}),Object.defineProperty(NodeBase.prototype,"boundsChildrenVisible",{get:function(){return this._boundsChildrenVisible},set:function(value){if(this._boundsChildrenVisible!=value){this._boundsChildrenVisible=value;for(var i=0;ii;i++)if(this._ignoredEntities[i]==entity)return!0;return!1},RaycastPicker.prototype.sortOnNearT=function(entity1,entity2){return entity1._iPickingCollisionVO.rayEntryDistance>entity2._iPickingCollisionVO.rayEntryDistance?1:-1},RaycastPicker.prototype.getPickingCollisionVO=function(){this._entities.length=this._numEntities,this._entities=this._entities.sort(this.sortOnNearT);var bestCollisionVO,pickingCollisionVO,entity,i,shortestCollisionDistance=Number.MAX_VALUE;for(i=0;imb?1:-1}else cmp=aid>bid?1:-1;0>cmp?(l=head,head=head.next):(l=headB,headB=headB.next),result?(curr.next=l,curr=l):(result=l,curr=l)}return head?curr.next=head:headB&&(curr.next=headB),result},RenderableMergeSort}();sort.RenderableMergeSort=RenderableMergeSort}(away.sort||(away.sort={}));away.sort}(away||(away={}));var away;!function(away){!function(text){var AntiAliasType=function(){function AntiAliasType(){}return AntiAliasType.ADVANCED="advanced",AntiAliasType.NORMAL="normal",AntiAliasType}();text.AntiAliasType=AntiAliasType}(away.text||(away.text={}));away.text}(away||(away={}));var away;!function(away){!function(text){var GridFitType=function(){function GridFitType(){}return GridFitType.NONE="none",GridFitType.PIXEL="pixel",GridFitType.SUBPIXEL="subpixel",GridFitType}();text.GridFitType=GridFitType}(away.text||(away.text={}));away.text}(away||(away={}));var away;!function(away){!function(text){var TextFieldAutoSize=function(){function TextFieldAutoSize(){}return TextFieldAutoSize.CENTER="center",TextFieldAutoSize.LEFT="left",TextFieldAutoSize.NONE="none",TextFieldAutoSize.RIGHT="right",TextFieldAutoSize}();text.TextFieldAutoSize=TextFieldAutoSize}(away.text||(away.text={}));away.text}(away||(away={}));var away;!function(away){!function(text){var TextFieldType=function(){function TextFieldType(){}return TextFieldType.DYNAMIC="dynamic",TextFieldType.INPUT="input",TextFieldType}();text.TextFieldType=TextFieldType}(away.text||(away.text={}));away.text}(away||(away={}));var away;!function(away){!function(text){var TextFormat=function(){function TextFormat(font,size,color,bold,italic,underline,url,target,align,leftMargin,rightMargin,indent,leading){"undefined"==typeof font&&(font="Times New Roman"),"undefined"==typeof size&&(size=12),"undefined"==typeof color&&(color=0),"undefined"==typeof bold&&(bold=!1),"undefined"==typeof italic&&(italic=!1),"undefined"==typeof underline&&(underline=!1),"undefined"==typeof url&&(url=""),"undefined"==typeof target&&(target=""),"undefined"==typeof align&&(align="left"),"undefined"==typeof leftMargin&&(leftMargin=0),"undefined"==typeof rightMargin&&(rightMargin=0),"undefined"==typeof indent&&(indent=0),"undefined"==typeof leading&&(leading=0),this.tabStops=new Array,this.font=font,this.size=size,this.bold=bold,this.italic=italic,this.underline=underline,this.url=url,this.target=target,this.align=align,this.leftMargin=leftMargin,this.rightMargin=rightMargin,this.indent=indent,this.leading=leading}return TextFormat}();text.TextFormat=TextFormat}(away.text||(away.text={}));away.text}(away||(away={}));var away;!function(away){!function(text){var TextFormatAlign=function(){function TextFormatAlign(){this.CENTER="center",this.JUSTIFY="justify",this.LEFT="left",this.RIGHT="right"}return TextFormatAlign}();text.TextFormatAlign=TextFormatAlign}(away.text||(away.text={}));away.text}(away||(away={}));var away;!function(away){!function(text){var TextInteractionMode=function(){function TextInteractionMode(){}return TextInteractionMode.NORMAL="normal",TextInteractionMode.SELECTION="selection",TextInteractionMode}();text.TextInteractionMode=TextInteractionMode}(away.text||(away.text={}));away.text}(away||(away={}));var away;!function(away){!function(text){var TextLineMetrics=function(){function TextLineMetrics(x,width,height,ascent,descent,leading){"undefined"==typeof x&&(x=0/0),"undefined"==typeof width&&(width=0/0),"undefined"==typeof height&&(height=0/0),"undefined"==typeof ascent&&(ascent=0/0),"undefined"==typeof descent&&(descent=0/0),"undefined"==typeof leading&&(leading=0/0)}return TextLineMetrics}();text.TextLineMetrics=TextLineMetrics}(away.text||(away.text={}));away.text}(away||(away={}));var away;!function(away){!function(ui){var Keyboard=function(){function Keyboard(){}return Keyboard.A=65,Keyboard.ALTERNATE=18,Keyboard.AUDIO=16777239,Keyboard.B=66,Keyboard.BACK=16777238,Keyboard.BACKQUOTE=192,Keyboard.BACKSLASH=220,Keyboard.BACKSPACE=8,Keyboard.BLUE=16777219,Keyboard.C=67,Keyboard.CAPS_LOCK=20,Keyboard.CHANNEL_DOWN=16777221,Keyboard.CHANNEL_UP=16777221,Keyboard.COMMA=188,Keyboard.COMMAND=15,Keyboard.CONTROL=17,Keyboard.D=68,Keyboard.DELETE=46,Keyboard.DOWN=40,Keyboard.DVR=16777241,Keyboard.E=69,Keyboard.END=35,Keyboard.ENTER=13,Keyboard.EQUAL=187,Keyboard.ESCAPE=27,Keyboard.EXIT=16777237,Keyboard.F=70,Keyboard.F1=112,Keyboard.F10=121,Keyboard.F11=122,Keyboard.F12=123,Keyboard.F13=124,Keyboard.F14=125,Keyboard.F15=126,Keyboard.F2=113,Keyboard.F3=114,Keyboard.F4=115,Keyboard.F5=116,Keyboard.F6=117,Keyboard.F7=118,Keyboard.F8=119,Keyboard.F9=120,Keyboard.FAST_FORWARD=16777226,Keyboard.G=71,Keyboard.GREEN=16777217,Keyboard.GUIDE=16777236,Keyboard.H=72,Keyboard.HELP=16777245,Keyboard.HOME=36,Keyboard.I=73,Keyboard.INFO=16777235,Keyboard.INPUT=16777243,Keyboard.INSERT=45,Keyboard.J=74,Keyboard.K=75,Keyboard.KEYNAME_BEGIN="Begin",Keyboard.KEYNAME_BREAK="Break",Keyboard.KEYNAME_CLEARDISPLAY="ClrDsp",Keyboard.KEYNAME_CLEARLINE="ClrLn",Keyboard.KEYNAME_DELETE="Delete",Keyboard.KEYNAME_DELETECHAR="DelChr",Keyboard.KEYNAME_DELETELINE="DelLn",Keyboard.KEYNAME_DOWNARROW="Down",Keyboard.KEYNAME_END="End",Keyboard.KEYNAME_EXECUTE="Exec",Keyboard.KEYNAME_F1="F1",Keyboard.KEYNAME_F10="F10",Keyboard.KEYNAME_F11="F11",Keyboard.KEYNAME_F12="F12",Keyboard.KEYNAME_F13="F13",Keyboard.KEYNAME_F14="F14",Keyboard.KEYNAME_F15="F15",Keyboard.KEYNAME_F16="F16",Keyboard.KEYNAME_F17="F17",Keyboard.KEYNAME_F18="F18",Keyboard.KEYNAME_F19="F19",Keyboard.KEYNAME_F2="F2",Keyboard.KEYNAME_F20="F20",Keyboard.KEYNAME_F21="F21",Keyboard.KEYNAME_F22="F22",Keyboard.KEYNAME_F23="F23",Keyboard.KEYNAME_F24="F24",Keyboard.KEYNAME_F25="F25",Keyboard.KEYNAME_F26="F26",Keyboard.KEYNAME_F27="F27",Keyboard.KEYNAME_F28="F28",Keyboard.KEYNAME_F29="F29",Keyboard.KEYNAME_F3="F3",Keyboard.KEYNAME_F30="F30",Keyboard.KEYNAME_F31="F31",Keyboard.KEYNAME_F32="F32",Keyboard.KEYNAME_F33="F33",Keyboard.KEYNAME_F34="F34",Keyboard.KEYNAME_F35="F35",Keyboard.KEYNAME_F4="F4",Keyboard.KEYNAME_F5="F5",Keyboard.KEYNAME_F6="F6",Keyboard.KEYNAME_F7="F7",Keyboard.KEYNAME_F8="F8",Keyboard.KEYNAME_F9="F9",Keyboard.KEYNAME_FIND="Find",Keyboard.KEYNAME_HELP="Help",Keyboard.KEYNAME_HOME="Home",Keyboard.KEYNAME_INSERT="Insert",Keyboard.KEYNAME_INSERTCHAR="InsChr",Keyboard.KEYNAME_INSERTLINE="LnsLn",Keyboard.KEYNAME_LEFTARROW="Left",Keyboard.KEYNAME_MENU="Menu",Keyboard.KEYNAME_MODESWITCH="ModeSw",Keyboard.KEYNAME_NEXT="Next",Keyboard.KEYNAME_PAGEDOWN="PgDn",Keyboard.KEYNAME_PAGEUP="PgUp",Keyboard.KEYNAME_PAUSE="Pause",Keyboard.KEYNAME_PREV="Prev",Keyboard.KEYNAME_PRINT="Print",Keyboard.KEYNAME_PRINTSCREEN="PrntScrn",Keyboard.KEYNAME_REDO="Redo",Keyboard.KEYNAME_RESET="Reset",Keyboard.KEYNAME_RIGHTARROW="Right",Keyboard.KEYNAME_SCROLLLOCK="ScrlLck",Keyboard.KEYNAME_SELECT="Select",Keyboard.KEYNAME_STOP="Stop",Keyboard.KEYNAME_SYSREQ="SysReq",Keyboard.KEYNAME_SYSTEM="Sys",Keyboard.KEYNAME_UNDO="Undo",Keyboard.KEYNAME_UPARROW="Up",Keyboard.KEYNAME_USER="User",Keyboard.L=76,Keyboard.LAST=16777233,Keyboard.LEFT=37,Keyboard.LEFTBRACKET=219,Keyboard.LIVE=16777232,Keyboard.M=77,Keyboard.MASTER_SHELL=16777246,Keyboard.MENU=16777234,Keyboard.MINUS=189,Keyboard.N=78,Keyboard.NEXT=16777230,Keyboard.NUMBER_0=48,Keyboard.NUMBER_1=49,Keyboard.NUMBER_2=50,Keyboard.NUMBER_3=51,Keyboard.NUMBER_4=52,Keyboard.NUMBER_5=53,Keyboard.NUMBER_6=54,Keyboard.NUMBER_7=55,Keyboard.NUMBER_8=56,Keyboard.NUMBER_9=57,Keyboard.NUMPAD=21,Keyboard.NUMPAD_0=96,Keyboard.NUMPAD_1=97,Keyboard.NUMPAD_2=98,Keyboard.NUMPAD_3=99,Keyboard.NUMPAD_4=100,Keyboard.NUMPAD_5=101,Keyboard.NUMPAD_6=102,Keyboard.NUMPAD_7=103,Keyboard.NUMPAD_8=104,Keyboard.NUMPAD_9=105,Keyboard.NUMPAD_ADD=107,Keyboard.NUMPAD_DECIMAL=110,Keyboard.NUMPAD_DIVIDE=111,Keyboard.NUMPAD_ENTER=108,Keyboard.NUMPAD_MULTIPLY=106,Keyboard.NUMPAD_SUBTRACT=109,Keyboard.O=79,Keyboard.P=80,Keyboard.PAGE_DOWN=34,Keyboard.PAGE_UP=33,Keyboard.PAUSE=16777224,Keyboard.PERIOD=190,Keyboard.PLAY=16777223,Keyboard.PREVIOUS=16777231,Keyboard.Q=81,Keyboard.QUOTE=222,Keyboard.R=82,Keyboard.RECORD=16777222,Keyboard.RED=16777216,Keyboard.REWIND=16777227,Keyboard.RIGHT=39,Keyboard.RIGHTBRACKET=221,Keyboard.S=83,Keyboard.SEARCH=16777247,Keyboard.SEMICOLON=186,Keyboard.SETUP=16777244,Keyboard.SHIFT=16,Keyboard.SKIP_BACKWARD=16777229,Keyboard.SKIP_FORWARD=16777228,Keyboard.SLASH=191,Keyboard.SPACE=32,Keyboard.STOP=16777225,Keyboard.SUBTITLE=16777240,Keyboard.T=84,Keyboard.TAB=9,Keyboard.U=85,Keyboard.UP=38,Keyboard.V=86,Keyboard.VOD=16777242,Keyboard.W=87,Keyboard.X=88,Keyboard.Y=89,Keyboard.YELLOW=16777218,Keyboard.Z=90,Keyboard}();ui.Keyboard=Keyboard}(away.ui||(away.ui={}));away.ui}(away||(away={}));var away;!function(away){!function(containers){var ArgumentError=away.errors.ArgumentError,Error=away.errors.Error,RangeError=away.errors.RangeError,AssetType=away.library.AssetType,DisplayObjectContainer=function(_super){function DisplayObjectContainer(){_super.call(this),this._mouseChildren=!0,this._children=new Array}return __extends(DisplayObjectContainer,_super),Object.defineProperty(DisplayObjectContainer.prototype,"assetType",{get:function(){return AssetType.CONTAINER},enumerable:!0,configurable:!0}),Object.defineProperty(DisplayObjectContainer.prototype,"mouseChildren",{get:function(){return this._mouseChildren},set:function(value){this._mouseChildren!=value&&(this._mouseChildren=value,this._pUpdateImplicitMouseEnabled(this._pParent?this._pParent.mouseChildren:!0))},enumerable:!0,configurable:!0}),Object.defineProperty(DisplayObjectContainer.prototype,"numChildren",{get:function(){return this._children.length},enumerable:!0,configurable:!0}),DisplayObjectContainer.prototype.addChild=function(child){if(null==child)throw new Error("Parameter child cannot be null.");return child._pParent&&child._pParent.removeChildInternal(child),child.iSetParent(this),this._children.push(child),child},DisplayObjectContainer.prototype.addChildAt=function(child){return child},DisplayObjectContainer.prototype.addChildren=function(){for(var childarray=[],_i=0;_ii;i++)this.addChild(childarray[i])},DisplayObjectContainer.prototype.clone=function(){var clone=new DisplayObjectContainer;clone.pivot=this.pivot,clone._iMatrix3D=this._iMatrix3D,clone.partition=this.partition,clone.name=name;for(var len=this._children.length,i=0;len>i;++i)clone.addChild(this._children[i].clone());return clone},DisplayObjectContainer.prototype.contains=function(child){return this._children.indexOf(child)>=0},DisplayObjectContainer.prototype.disposeWithChildren=function(){for(this.dispose();this.numChildren>0;)this.getChildAt(0).dispose()},DisplayObjectContainer.prototype.getChildAt=function(index){var child=this._children[index];if(null==child)throw new RangeError("Index does not exist in the child list of the caller");return child},DisplayObjectContainer.prototype.getChildByName=function(name){for(var len=this._children.length,i=0;len>i;++i)if(this._children[i].name==name)return this._children[i];return null},DisplayObjectContainer.prototype.getChildIndex=function(child){var childIndex=this._children.indexOf(child);if(-1==childIndex)throw new ArgumentError("Child parameter is not a child of the caller");return childIndex},DisplayObjectContainer.prototype.getObjectsUnderPoint=function(){return new Array},DisplayObjectContainer.prototype.removeChild=function(child){if(null==child)throw new Error("Parameter child cannot be null");return this.removeChildInternal(child),child.iSetParent(null),child},DisplayObjectContainer.prototype.removeChildAt=function(index){return this.removeChild(this._children[index])},DisplayObjectContainer.prototype.removeChildren=function(beginIndex,endIndex){if("undefined"==typeof beginIndex&&(beginIndex=0),"undefined"==typeof endIndex&&(endIndex=2147483647),0>beginIndex)throw new RangeError("beginIndex is out of range of the child list");if(endIndex>this._children.length)throw new RangeError("endIndex is out of range of the child list");for(var i=beginIndex;endIndex>i;i++)this.removeChild(this._children[i])},DisplayObjectContainer.prototype.setChildIndex=function(){},DisplayObjectContainer.prototype.swapChildren=function(){},DisplayObjectContainer.prototype.swapChildrenAt=function(){},DisplayObjectContainer.prototype.pInvalidateSceneTransform=function(){_super.prototype.pInvalidateSceneTransform.call(this);for(var len=this._children.length,i=0;len>i;++i)this._children[i].pInvalidateSceneTransform()},DisplayObjectContainer.prototype._pUpdateScene=function(value){_super.prototype._pUpdateScene.call(this,value);for(var len=this._children.length,i=0;len>i;++i)this._children[i]._pUpdateScene(value)},DisplayObjectContainer.prototype._pUpdateImplicitMouseEnabled=function(value){_super.prototype._pUpdateImplicitMouseEnabled.call(this,value);for(var len=this._children.length,i=0;len>i;++i)this._children[i]._pUpdateImplicitMouseEnabled(this._mouseChildren)},DisplayObjectContainer.prototype._pUpdateImplicitVisibility=function(value){_super.prototype._pUpdateImplicitVisibility.call(this,value);for(var len=this._children.length,i=0;len>i;++i)this._children[i]._pUpdateImplicitVisibility(this._pImplicitVisibility)},DisplayObjectContainer.prototype._pUpdateImplicitPartition=function(value){_super.prototype._pUpdateImplicitPartition.call(this,value);for(var len=this._children.length,i=0;len>i;++i)this._children[i]._pUpdateImplicitPartition(this._pImplicitPartition)},DisplayObjectContainer.prototype.removeChildInternal=function(child){return this._children.splice(this.getChildIndex(child),1),child},DisplayObjectContainer}(away.base.DisplayObject);containers.DisplayObjectContainer=DisplayObjectContainer}(away.containers||(away.containers={}));away.containers}(away||(away={}));var away;!function(away){!function(base){var AbstractMethodError=away.errors.AbstractMethodError,LightEvent=away.events.LightEvent,AssetType=away.library.AssetType,LightBase=function(_super){function LightBase(){_super.call(this),this._color=16777215,this._colorR=1,this._colorG=1,this._colorB=1,this._ambientColor=16777215,this._ambient=0,this._iAmbientR=0,this._iAmbientG=0,this._iAmbientB=0,this._specular=1,this._iSpecularR=1,this._iSpecularG=1,this._iSpecularB=1,this._diffuse=1,this._iDiffuseR=1,this._iDiffuseG=1,this._iDiffuseB=1,this._castsShadows=!1}return __extends(LightBase,_super),Object.defineProperty(LightBase.prototype,"castsShadows",{get:function(){return this._castsShadows},set:function(value){this._castsShadows!=value&&(this._castsShadows=value,value?(null==this._shadowMapper&&(this._shadowMapper=this.pCreateShadowMapper()),this._shadowMapper.light=this):(this._shadowMapper.dispose(),this._shadowMapper=null),this.dispatchEvent(new LightEvent(LightEvent.CASTS_SHADOW_CHANGE)))},enumerable:!0,configurable:!0}),LightBase.prototype.pCreateShadowMapper=function(){throw new AbstractMethodError},Object.defineProperty(LightBase.prototype,"specular",{get:function(){return this._specular},set:function(value){0>value&&(value=0),this._specular=value,this.updateSpecular()},enumerable:!0,configurable:!0}),Object.defineProperty(LightBase.prototype,"diffuse",{get:function(){return this._diffuse},set:function(value){0>value&&(value=0),this._diffuse=value,this.updateDiffuse()},enumerable:!0,configurable:!0}),Object.defineProperty(LightBase.prototype,"color",{get:function(){return this._color},set:function(value){this._color=value,this._colorR=(this._color>>16&255)/255,this._colorG=(this._color>>8&255)/255,this._colorB=(255&this._color)/255,this.updateDiffuse(),this.updateSpecular()},enumerable:!0,configurable:!0}),Object.defineProperty(LightBase.prototype,"ambient",{get:function(){return this._ambient},set:function(value){0>value?value=0:value>1&&(value=1),this._ambient=value,this.updateAmbient()},enumerable:!0,configurable:!0}),Object.defineProperty(LightBase.prototype,"ambientColor",{get:function(){return this._ambientColor},set:function(value){this._ambientColor=value,this.updateAmbient()},enumerable:!0,configurable:!0}),LightBase.prototype.updateAmbient=function(){this._iAmbientR=(this._ambientColor>>16&255)/255*this._ambient,this._iAmbientG=(this._ambientColor>>8&255)/255*this._ambient,this._iAmbientB=(255&this._ambientColor)/255*this._ambient},LightBase.prototype.iGetObjectProjectionMatrix=function(entity,camera,target){throw"undefined"==typeof target&&(target=null),new AbstractMethodError},Object.defineProperty(LightBase.prototype,"assetType",{get:function(){return AssetType.LIGHT},enumerable:!0,configurable:!0}),LightBase.prototype.updateSpecular=function(){this._iSpecularR=this._colorR*this._specular,this._iSpecularG=this._colorG*this._specular,this._iSpecularB=this._colorB*this._specular},LightBase.prototype.updateDiffuse=function(){this._iDiffuseR=this._colorR*this._diffuse,this._iDiffuseG=this._colorG*this._diffuse,this._iDiffuseB=this._colorB*this._diffuse},Object.defineProperty(LightBase.prototype,"shadowMapper",{get:function(){return this._shadowMapper},set:function(value){this._shadowMapper=value,this._shadowMapper.light=this},enumerable:!0,configurable:!0}),LightBase}(away.containers.DisplayObjectContainer);base.LightBase=LightBase}(away.base||(away.base={}));away.base}(away||(away={}));var away;!function(away){!function(projections){var CoordinateSystem=function(){function CoordinateSystem(){}return CoordinateSystem.LEFT_HANDED="leftHanded",CoordinateSystem.RIGHT_HANDED="rightHanded",CoordinateSystem}();projections.CoordinateSystem=CoordinateSystem}(away.projections||(away.projections={}));away.projections}(away||(away={}));var away;!function(away){!function(projections){var ProjectionBase=function(_super){function ProjectionBase(coordinateSystem){"undefined"==typeof coordinateSystem&&(coordinateSystem="leftHanded"),_super.call(this),this._pMatrix=new away.geom.Matrix3D,this._pScissorRect=new away.geom.Rectangle,this._pViewPort=new away.geom.Rectangle,this._pNear=20,this._pFar=3e3,this._pAspectRatio=1,this._pMatrixInvalid=!0,this._pFrustumCorners=[],this._pOriginX=.5,this._pOriginY=.5,this._unprojectionInvalid=!0,this.coordinateSystem=coordinateSystem}return __extends(ProjectionBase,_super),Object.defineProperty(ProjectionBase.prototype,"coordinateSystem",{get:function(){return this._pCoordinateSystem},set:function(value){this._pCoordinateSystem!=value&&(this._pCoordinateSystem=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),Object.defineProperty(ProjectionBase.prototype,"frustumCorners",{get:function(){return this._pFrustumCorners},set:function(frustumCorners){this._pFrustumCorners=frustumCorners},enumerable:!0,configurable:!0}),Object.defineProperty(ProjectionBase.prototype,"matrix",{get:function(){return this._pMatrixInvalid&&(this.pUpdateMatrix(),this._pMatrixInvalid=!1),this._pMatrix},set:function(value){this._pMatrix=value,this.pInvalidateMatrix()},enumerable:!0,configurable:!0}),Object.defineProperty(ProjectionBase.prototype,"near",{get:function(){return this._pNear},set:function(value){value!=this._pNear&&(this._pNear=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),Object.defineProperty(ProjectionBase.prototype,"originX",{get:function(){return this._pOriginX},set:function(value){this._pOriginX!=value&&(this._pOriginX=value)},enumerable:!0,configurable:!0}),Object.defineProperty(ProjectionBase.prototype,"originY",{get:function(){return this._pOriginY},set:function(value){this._pOriginY!=value&&(this._pOriginY=value)},enumerable:!0,configurable:!0}),Object.defineProperty(ProjectionBase.prototype,"far",{get:function(){return this._pFar},set:function(value){value!=this._pFar&&(this._pFar=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),ProjectionBase.prototype.project=function(point3d){var v=this.matrix.transformVector(point3d);return v.x=v.x/v.w,v.y=-v.y/v.w,v.z=point3d.z,v},Object.defineProperty(ProjectionBase.prototype,"unprojectionMatrix",{get:function(){return this._unprojectionInvalid&&(this._unprojection||(this._unprojection=new away.geom.Matrix3D),this._unprojection.copyFrom(this.matrix),this._unprojection.invert(),this._unprojectionInvalid=!1),this._unprojection},enumerable:!0,configurable:!0}),ProjectionBase.prototype.unproject=function(){throw new away.errors.AbstractMethodError -},ProjectionBase.prototype.clone=function(){throw new away.errors.AbstractMethodError},Object.defineProperty(ProjectionBase.prototype,"_iAspectRatio",{get:function(){return this._pAspectRatio},set:function(value){this._pAspectRatio!=value&&(this._pAspectRatio=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),ProjectionBase.prototype.pInvalidateMatrix=function(){this._pMatrixInvalid=!0,this._unprojectionInvalid=!0,this.dispatchEvent(new away.events.ProjectionEvent(away.events.ProjectionEvent.MATRIX_CHANGED,this))},ProjectionBase.prototype.pUpdateMatrix=function(){throw new away.errors.AbstractMethodError},ProjectionBase.prototype._iUpdateScissorRect=function(x,y,width,height){this._pScissorRect.x=x,this._pScissorRect.y=y,this._pScissorRect.width=width,this._pScissorRect.height=height,this.pInvalidateMatrix()},ProjectionBase.prototype._iUpdateViewport=function(x,y,width,height){this._pViewPort.x=x,this._pViewPort.y=y,this._pViewPort.width=width,this._pViewPort.height=height,this.pInvalidateMatrix()},ProjectionBase}(away.events.EventDispatcher);projections.ProjectionBase=ProjectionBase}(away.projections||(away.projections={}));away.projections}(away||(away={}));var away;!function(away){!function(projections){var PerspectiveProjection=function(_super){function PerspectiveProjection(fieldOfView,coordinateSystem){"undefined"==typeof fieldOfView&&(fieldOfView=60),"undefined"==typeof coordinateSystem&&(coordinateSystem="leftHanded"),_super.call(this,coordinateSystem),this._fieldOfView=60,this._focalLength=1e3,this._hFieldOfView=60,this._hFocalLength=1e3,this._preserveAspectRatio=!0,this._preserveFocalLength=!1,this.fieldOfView=fieldOfView}return __extends(PerspectiveProjection,_super),Object.defineProperty(PerspectiveProjection.prototype,"preserveAspectRatio",{get:function(){return this._preserveAspectRatio},set:function(value){this._preserveAspectRatio!=value&&(this._preserveAspectRatio=value,this._preserveAspectRatio&&this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),Object.defineProperty(PerspectiveProjection.prototype,"preserveFocalLength",{get:function(){return this._preserveFocalLength},set:function(value){this._preserveFocalLength!=value&&(this._preserveFocalLength=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),Object.defineProperty(PerspectiveProjection.prototype,"fieldOfView",{get:function(){return this._fieldOfView},set:function(value){this._fieldOfView!=value&&(this._fieldOfView=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),Object.defineProperty(PerspectiveProjection.prototype,"focalLength",{get:function(){return this._focalLength},set:function(value){this._focalLength!=value&&(this._focalLength=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),Object.defineProperty(PerspectiveProjection.prototype,"hFieldOfView",{get:function(){return this._hFieldOfView},set:function(value){this._hFieldOfView!=value&&(this._hFieldOfView=value,this._hFocalLength=1/Math.tan(this._hFieldOfView*Math.PI/360),this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),Object.defineProperty(PerspectiveProjection.prototype,"hFocalLength",{get:function(){return this._hFocalLength},set:function(value){this._hFocalLength!=value&&(this._hFocalLength=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),PerspectiveProjection.prototype.unproject=function(nX,nY,sZ){var v=new away.geom.Vector3D(nX,-nY,sZ,1);return v.x*=sZ,v.y*=sZ,v=this.unprojectionMatrix.transformVector(v),v.z=sZ,v},PerspectiveProjection.prototype.clone=function(){var clone=new PerspectiveProjection(this._fieldOfView);return clone._pNear=this._pNear,clone._pFar=this._pFar,clone._pAspectRatio=this._pAspectRatio,clone._pCoordinateSystem=this._pCoordinateSystem,clone},PerspectiveProjection.prototype.pUpdateMatrix=function(){var raw=[];this._preserveFocalLength?(this._preserveAspectRatio&&(this._hFocalLength=this._focalLength),this._fieldOfView=360*Math.atan(.5*this._pScissorRect.height/this._focalLength)/Math.PI,this._hFieldOfView=360*Math.atan(.5*this._pScissorRect.width/this._hFocalLength)/Math.PI):(this._focalLength=.5*this._pScissorRect.height/Math.tan(this._fieldOfView*Math.PI/360),this._hFocalLength=this._preserveAspectRatio?this._focalLength:.5*this._pScissorRect.width/Math.tan(this._hFieldOfView*Math.PI/360));var left,right,top,bottom,tanMinX=-this._pOriginX/this._hFocalLength,tanMaxX=(1-this._pOriginX)/this._hFocalLength,tanMinY=-this._pOriginY/this._focalLength,tanMaxY=(1-this._pOriginY)/this._focalLength,center=-((tanMinX-tanMaxX)*this._pScissorRect.x+tanMinX*this._pScissorRect.width),middle=(tanMinY-tanMaxY)*this._pScissorRect.y+tanMinY*this._pScissorRect.height;left=center-(tanMaxX-tanMinX)*this._pViewPort.width,right=center,top=middle,bottom=middle+(tanMaxY-tanMinY)*this._pViewPort.height,raw[0]=2/(right-left),raw[5]=2/(bottom-top),raw[8]=(right+left)/(right-left),raw[9]=(bottom+top)/(bottom-top),raw[10]=(this._pFar+this._pNear)/(this._pFar-this._pNear),raw[11]=1,raw[1]=raw[2]=raw[3]=raw[4]=raw[6]=raw[7]=raw[12]=raw[13]=raw[15]=0,raw[14]=-2*this._pFar*this._pNear/(this._pFar-this._pNear),this._pCoordinateSystem==projections.CoordinateSystem.RIGHT_HANDED&&(raw[5]=-raw[5]),this._pMatrix.copyRawDataFrom(raw),this._pFrustumCorners[0]=this._pFrustumCorners[9]=this._pNear*left,this._pFrustumCorners[3]=this._pFrustumCorners[6]=this._pNear*right,this._pFrustumCorners[1]=this._pFrustumCorners[4]=this._pNear*top,this._pFrustumCorners[7]=this._pFrustumCorners[10]=this._pNear*bottom,this._pFrustumCorners[12]=this._pFrustumCorners[21]=this._pFar*left,this._pFrustumCorners[15]=this._pFrustumCorners[18]=this._pFar*right,this._pFrustumCorners[13]=this._pFrustumCorners[16]=this._pFar*top,this._pFrustumCorners[19]=this._pFrustumCorners[22]=this._pFar*bottom,this._pFrustumCorners[2]=this._pFrustumCorners[5]=this._pFrustumCorners[8]=this._pFrustumCorners[11]=this._pNear,this._pFrustumCorners[14]=this._pFrustumCorners[17]=this._pFrustumCorners[20]=this._pFrustumCorners[23]=this._pFar,this._pMatrixInvalid=!1},PerspectiveProjection}(projections.ProjectionBase);projections.PerspectiveProjection=PerspectiveProjection}(away.projections||(away.projections={}));away.projections}(away||(away={}));var away;!function(away){!function(projections){var FreeMatrixProjection=function(_super){function FreeMatrixProjection(){_super.call(this),this._pMatrix.copyFrom((new projections.PerspectiveProjection).matrix)}return __extends(FreeMatrixProjection,_super),Object.defineProperty(FreeMatrixProjection.prototype,"near",{set:function(value){this._pNear=value},enumerable:!0,configurable:!0}),Object.defineProperty(FreeMatrixProjection.prototype,"far",{set:function(value){this._pFar=value},enumerable:!0,configurable:!0}),Object.defineProperty(FreeMatrixProjection.prototype,"iAspectRatio",{set:function(value){this._pAspectRatio=value},enumerable:!0,configurable:!0}),FreeMatrixProjection.prototype.clone=function(){var clone=new FreeMatrixProjection;return clone._pMatrix.copyFrom(this._pMatrix),clone._pNear=this._pNear,clone._pFar=this._pFar,clone._pAspectRatio=this._pAspectRatio,clone.pInvalidateMatrix(),clone},FreeMatrixProjection.prototype.pUpdateMatrix=function(){this._pMatrixInvalid=!1},FreeMatrixProjection}(projections.ProjectionBase);projections.FreeMatrixProjection=FreeMatrixProjection}(away.projections||(away.projections={}));away.projections}(away||(away={}));var away;!function(away){!function(projections){var OrthographicProjection=function(_super){function OrthographicProjection(projectionHeight){"undefined"==typeof projectionHeight&&(projectionHeight=500),_super.call(this),this._projectionHeight=projectionHeight}return __extends(OrthographicProjection,_super),Object.defineProperty(OrthographicProjection.prototype,"projectionHeight",{get:function(){return this._projectionHeight},set:function(value){value!=this._projectionHeight&&(this._projectionHeight=value,this.pInvalidateMatrix())},enumerable:!0,configurable:!0}),OrthographicProjection.prototype.unproject=function(nX,nY,sZ){var v=new away.geom.Vector3D(nX+this.matrix.rawData[12],-nY+this.matrix.rawData[13],sZ,1);return v=this.unprojectionMatrix.transformVector(v),v.z=sZ,v},OrthographicProjection.prototype.clone=function(){var clone=new OrthographicProjection;return clone._pNear=this._pNear,clone._pFar=this._pFar,clone._pAspectRatio=this._pAspectRatio,clone.projectionHeight=this._projectionHeight,clone},OrthographicProjection.prototype.pUpdateMatrix=function(){var raw=[];this._yMax=.5*this._projectionHeight,this._xMax=this._yMax*this._pAspectRatio;var left,right,top,bottom;if(0==this._pScissorRect.x&&0==this._pScissorRect.y&&this._pScissorRect.width==this._pViewPort.width&&this._pScissorRect.height==this._pViewPort.height)left=-this._xMax,right=this._xMax,top=-this._yMax,bottom=this._yMax,raw[0]=2/(this._projectionHeight*this._pAspectRatio),raw[5]=2/this._projectionHeight,raw[10]=1/(this._pFar-this._pNear),raw[14]=this._pNear/(this._pNear-this._pFar),raw[1]=raw[2]=raw[3]=raw[4]=raw[6]=raw[7]=raw[8]=raw[9]=raw[11]=raw[12]=raw[13]=0,raw[15]=1;else{var xWidth=this._xMax*(this._pViewPort.width/this._pScissorRect.width),yHgt=this._yMax*(this._pViewPort.height/this._pScissorRect.height),center=this._xMax*(2*this._pScissorRect.x-this._pViewPort.width)/this._pScissorRect.width+this._xMax,middle=-this._yMax*(2*this._pScissorRect.y-this._pViewPort.height)/this._pScissorRect.height-this._yMax;left=center-xWidth,right=center+xWidth,top=middle-yHgt,bottom=middle+yHgt,raw[0]=2/(right-left),raw[5]=-2/(top-bottom),raw[10]=1/(this._pFar-this._pNear),raw[12]=(right+left)/(right-left),raw[13]=(bottom+top)/(bottom-top),raw[14]=this._pNear/(this.near-this.far),raw[1]=raw[2]=raw[3]=raw[4]=raw[6]=raw[7]=raw[8]=raw[9]=raw[11]=0,raw[15]=1}this._pFrustumCorners[0]=this._pFrustumCorners[9]=this._pFrustumCorners[12]=this._pFrustumCorners[21]=left,this._pFrustumCorners[3]=this._pFrustumCorners[6]=this._pFrustumCorners[15]=this._pFrustumCorners[18]=right,this._pFrustumCorners[1]=this._pFrustumCorners[4]=this._pFrustumCorners[13]=this._pFrustumCorners[16]=top,this._pFrustumCorners[7]=this._pFrustumCorners[10]=this._pFrustumCorners[19]=this._pFrustumCorners[22]=bottom,this._pFrustumCorners[2]=this._pFrustumCorners[5]=this._pFrustumCorners[8]=this._pFrustumCorners[11]=this._pNear,this._pFrustumCorners[14]=this._pFrustumCorners[17]=this._pFrustumCorners[20]=this._pFrustumCorners[23]=this._pFar,this._pMatrix.copyRawDataFrom(raw),this._pMatrixInvalid=!1},OrthographicProjection}(projections.ProjectionBase);projections.OrthographicProjection=OrthographicProjection}(away.projections||(away.projections={}));away.projections}(away||(away={}));var away;!function(away){!function(projections){var OrthographicOffCenterProjection=function(_super){function OrthographicOffCenterProjection(minX,maxX,minY,maxY){_super.call(this),this._minX=minX,this._maxX=maxX,this._minY=minY,this._maxY=maxY}return __extends(OrthographicOffCenterProjection,_super),Object.defineProperty(OrthographicOffCenterProjection.prototype,"minX",{get:function(){return this._minX},set:function(value){this._minX=value,this.pInvalidateMatrix()},enumerable:!0,configurable:!0}),Object.defineProperty(OrthographicOffCenterProjection.prototype,"maxX",{get:function(){return this._maxX},set:function(value){this._maxX=value,this.pInvalidateMatrix()},enumerable:!0,configurable:!0}),Object.defineProperty(OrthographicOffCenterProjection.prototype,"minY",{get:function(){return this._minY},set:function(value){this._minY=value,this.pInvalidateMatrix()},enumerable:!0,configurable:!0}),Object.defineProperty(OrthographicOffCenterProjection.prototype,"maxY",{get:function(){return this._maxY},set:function(value){this._maxY=value,this.pInvalidateMatrix()},enumerable:!0,configurable:!0}),OrthographicOffCenterProjection.prototype.unproject=function(nX,nY,sZ){var v=new away.geom.Vector3D(nX,-nY,sZ,1);return v=this.unprojectionMatrix.transformVector(v),v.z=sZ,v},OrthographicOffCenterProjection.prototype.clone=function(){var clone=new OrthographicOffCenterProjection(this._minX,this._maxX,this._minY,this._maxY);return clone._pNear=this._pNear,clone._pFar=this._pFar,clone._pAspectRatio=this._pAspectRatio,clone},OrthographicOffCenterProjection.prototype.pUpdateMatrix=function(){var raw=[],w=1/(this._maxX-this._minX),h=1/(this._maxY-this._minY),d=1/(this._pFar-this._pNear);raw[0]=2*w,raw[5]=2*h,raw[10]=d,raw[12]=-(this._maxX+this._minX)*w,raw[13]=-(this._maxY+this._minY)*h,raw[14]=-this._pNear*d,raw[15]=1,raw[1]=raw[2]=raw[3]=raw[4]=raw[6]=raw[7]=raw[8]=raw[9]=raw[11]=0,this._pMatrix.copyRawDataFrom(raw),this._pFrustumCorners[0]=this._pFrustumCorners[9]=this._pFrustumCorners[12]=this._pFrustumCorners[21]=this._minX,this._pFrustumCorners[3]=this._pFrustumCorners[6]=this._pFrustumCorners[15]=this._pFrustumCorners[18]=this._maxX,this._pFrustumCorners[1]=this._pFrustumCorners[4]=this._pFrustumCorners[13]=this._pFrustumCorners[16]=this._minY,this._pFrustumCorners[7]=this._pFrustumCorners[10]=this._pFrustumCorners[19]=this._pFrustumCorners[22]=this._maxY,this._pFrustumCorners[2]=this._pFrustumCorners[5]=this._pFrustumCorners[8]=this._pFrustumCorners[11]=this._pNear,this._pFrustumCorners[14]=this._pFrustumCorners[17]=this._pFrustumCorners[20]=this._pFrustumCorners[23]=this._pFar,this._pMatrixInvalid=!1},OrthographicOffCenterProjection}(projections.ProjectionBase);projections.OrthographicOffCenterProjection=OrthographicOffCenterProjection}(away.projections||(away.projections={}));away.projections}(away||(away={}));var away;!function(away){!function(projections){var ObliqueNearPlaneProjection=function(_super){function ObliqueNearPlaneProjection(baseProjection,plane){_super.call(this),this.baseProjection=baseProjection,this.plane=plane,this._onProjectionMatrixChangedDelegate=away.utils.Delegate.create(this,this.onProjectionMatrixChanged)}return __extends(ObliqueNearPlaneProjection,_super),Object.defineProperty(ObliqueNearPlaneProjection.prototype,"frustumCorners",{get:function(){return this._baseProjection.frustumCorners},enumerable:!0,configurable:!0}),Object.defineProperty(ObliqueNearPlaneProjection.prototype,"near",{get:function(){return this._baseProjection.near},set:function(value){this._baseProjection.near=value},enumerable:!0,configurable:!0}),Object.defineProperty(ObliqueNearPlaneProjection.prototype,"far",{get:function(){return this._baseProjection.far},set:function(value){this._baseProjection.far=value},enumerable:!0,configurable:!0}),Object.defineProperty(ObliqueNearPlaneProjection.prototype,"iAspectRatio",{get:function(){return this._baseProjection._iAspectRatio},set:function(value){this._baseProjection._iAspectRatio=value},enumerable:!0,configurable:!0}),Object.defineProperty(ObliqueNearPlaneProjection.prototype,"plane",{get:function(){return this._plane},set:function(value){this._plane=value,this.pInvalidateMatrix()},enumerable:!0,configurable:!0}),Object.defineProperty(ObliqueNearPlaneProjection.prototype,"baseProjection",{set:function(value){this._baseProjection&&this._baseProjection.removeEventListener(away.events.ProjectionEvent.MATRIX_CHANGED,this._onProjectionMatrixChangedDelegate),this._baseProjection=value,this._baseProjection&&this._baseProjection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED,this._onProjectionMatrixChangedDelegate),this.pInvalidateMatrix()},enumerable:!0,configurable:!0}),ObliqueNearPlaneProjection.prototype.onProjectionMatrixChanged=function(){this.pInvalidateMatrix()},ObliqueNearPlaneProjection.prototype.pUpdateMatrix=function(){this._pMatrix.copyFrom(this._baseProjection.matrix);var cx=this._plane.a,cy=this._plane.b,cz=this._plane.c,cw=-this._plane.d+.05,signX=cx>=0?1:-1,signY=cy>=0?1:-1,p=new away.geom.Vector3D(signX,signY,1,1),inverse=this._pMatrix.clone();inverse.invert();var q=inverse.transformVector(p);this._pMatrix.copyRowTo(3,p);var a=(q.x*p.x+q.y*p.y+q.z*p.z+q.w*p.w)/(cx*q.x+cy*q.y+cz*q.z+cw*q.w);this._pMatrix.copyRowFrom(2,new away.geom.Vector3D(cx*a,cy*a,cz*a,cw*a))},ObliqueNearPlaneProjection}(projections.ProjectionBase);projections.ObliqueNearPlaneProjection=ObliqueNearPlaneProjection}(away.projections||(away.projections={}));away.projections}(away||(away={}));var away;!function(away){!function(entities){var Camera=function(_super){function Camera(projection){"undefined"==typeof projection&&(projection=null),_super.call(this),this._viewProjection=new away.geom.Matrix3D,this._viewProjectionDirty=!0,this._frustumPlanesDirty=!0,this._pIsEntity=!0,this._onProjectionMatrixChangedDelegate=away.utils.Delegate.create(this,this.onProjectionMatrixChanged),this._projection=projection||new away.projections.PerspectiveProjection,this._projection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED,this._onProjectionMatrixChangedDelegate),this._frustumPlanes=[];for(var i=0;6>i;++i)this._frustumPlanes[i]=new away.geom.Plane3D;this.z=-1e3}return __extends(Camera,_super),Camera.prototype.pCreateDefaultBoundingVolume=function(){return new away.bounds.NullBounds},Camera.prototype.pCreateEntityPartitionNode=function(){return new away.partition.CameraNode(this)},Object.defineProperty(Camera.prototype,"assetType",{get:function(){return away.library.AssetType.CAMERA},enumerable:!0,configurable:!0}),Camera.prototype.onProjectionMatrixChanged=function(event){this._viewProjectionDirty=!0,this._frustumPlanesDirty=!0,this.dispatchEvent(event)},Object.defineProperty(Camera.prototype,"frustumPlanes",{get:function(){return this._frustumPlanesDirty&&this.updateFrustum(),this._frustumPlanes},enumerable:!0,configurable:!0}),Camera.prototype.updateFrustum=function(){var a,b,c,c11,c12,c13,c14,c21,c22,c23,c24,c31,c32,c33,c34,c41,c42,c43,c44,p,invLen,raw=new Array(16);this.viewProjection.copyRawDataTo(raw),c11=raw[0],c12=raw[4],c13=raw[8],c14=raw[12],c21=raw[1],c22=raw[5],c23=raw[9],c24=raw[13],c31=raw[2],c32=raw[6],c33=raw[10],c34=raw[14],c41=raw[3],c42=raw[7],c43=raw[11],c44=raw[15],p=this._frustumPlanes[0],a=c41+c11,b=c42+c12,c=c43+c13,invLen=1/Math.sqrt(a*a+b*b+c*c),p.a=a*invLen,p.b=b*invLen,p.c=c*invLen,p.d=-(c44+c14)*invLen,p=this._frustumPlanes[1],a=c41-c11,b=c42-c12,c=c43-c13,invLen=1/Math.sqrt(a*a+b*b+c*c),p.a=a*invLen,p.b=b*invLen,p.c=c*invLen,p.d=(c14-c44)*invLen,p=this._frustumPlanes[2],a=c41+c21,b=c42+c22,c=c43+c23,invLen=1/Math.sqrt(a*a+b*b+c*c),p.a=a*invLen,p.b=b*invLen,p.c=c*invLen,p.d=-(c44+c24)*invLen,p=this._frustumPlanes[3],a=c41-c21,b=c42-c22,c=c43-c23,invLen=1/Math.sqrt(a*a+b*b+c*c),p.a=a*invLen,p.b=b*invLen,p.c=c*invLen,p.d=(c24-c44)*invLen,p=this._frustumPlanes[4],a=c31,b=c32,c=c33,invLen=1/Math.sqrt(a*a+b*b+c*c),p.a=a*invLen,p.b=b*invLen,p.c=c*invLen,p.d=-c34*invLen,p=this._frustumPlanes[5],a=c41-c31,b=c42-c32,c=c43-c33,invLen=1/Math.sqrt(a*a+b*b+c*c),p.a=a*invLen,p.b=b*invLen,p.c=c*invLen,p.d=(c34-c44)*invLen,this._frustumPlanesDirty=!1},Camera.prototype.pInvalidateSceneTransform=function(){_super.prototype.pInvalidateSceneTransform.call(this),this._viewProjectionDirty=!0,this._frustumPlanesDirty=!0},Camera.prototype.pUpdateBounds=function(){this._pBoundsInvalid=!1,this._pBounds.nullify()},Object.defineProperty(Camera.prototype,"projection",{get:function(){return this._projection},set:function(value){if(this._projection!=value){if(!value)throw new Error("Projection cannot be null!");this._projection.removeEventListener(away.events.ProjectionEvent.MATRIX_CHANGED,this._onProjectionMatrixChangedDelegate),this._projection=value,this._projection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED,this._onProjectionMatrixChangedDelegate),this.dispatchEvent(new away.events.CameraEvent(away.events.CameraEvent.PROJECTION_CHANGED,this))}},enumerable:!0,configurable:!0}),Object.defineProperty(Camera.prototype,"viewProjection",{get:function(){return this._viewProjectionDirty&&(this._viewProjection.copyFrom(this.inverseSceneTransform),this._viewProjection.append(this._projection.matrix),this._viewProjectionDirty=!1),this._viewProjection},enumerable:!0,configurable:!0}),Camera.prototype.getRay=function(nX,nY,sZ){return this.sceneTransform.deltaTransformVector(this._projection.unproject(nX,nY,sZ))},Camera.prototype.project=function(point3d){return this._projection.project(this.inverseSceneTransform.transformVector(point3d))},Camera.prototype.unproject=function(nX,nY,sZ){return this.sceneTransform.transformVector(this._projection.unproject(nX,nY,sZ))},Camera.prototype._iCollectRenderables=function(renderer){this._iSourcePrefab&&this._iSourcePrefab._iValidate(),this._iCollectRenderable(renderer)},Camera.prototype._iCollectRenderable=function(){},Camera}(away.containers.DisplayObjectContainer);entities.Camera=Camera}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(materials){var AbstractMethodError=away.errors.AbstractMethodError,ShadowCasterCollector=away.traverse.ShadowCasterCollector,RenderTexture=away.textures.RenderTexture,ShadowMapperBase=function(){function ShadowMapperBase(){this._pDepthMapSize=2048,this._autoUpdateShadows=!0,this._pCasterCollector=this.pCreateCasterCollector()}return ShadowMapperBase.prototype.pCreateCasterCollector=function(){return new ShadowCasterCollector},Object.defineProperty(ShadowMapperBase.prototype,"autoUpdateShadows",{get:function(){return this._autoUpdateShadows},set:function(value){this._autoUpdateShadows=value},enumerable:!0,configurable:!0}),ShadowMapperBase.prototype.updateShadows=function(){this._iShadowsInvalid=!0},ShadowMapperBase.prototype.iSetDepthMap=function(depthMap){this._depthMap!=depthMap&&(this._depthMap&&!this._explicitDepthMap&&this._depthMap.dispose(),this._depthMap=depthMap,this._depthMap?(this._explicitDepthMap=!0,this._pDepthMapSize=this._depthMap.size):this._explicitDepthMap=!1)},Object.defineProperty(ShadowMapperBase.prototype,"light",{get:function(){return this._pLight},set:function(value){this._pLight=value},enumerable:!0,configurable:!0}),Object.defineProperty(ShadowMapperBase.prototype,"depthMap",{get:function(){return this._depthMap||(this._depthMap=this.pCreateDepthTexture()),this._depthMap},enumerable:!0,configurable:!0}),Object.defineProperty(ShadowMapperBase.prototype,"depthMapSize",{get:function(){return this._pDepthMapSize},set:function(value){value!=this._pDepthMapSize&&this._pSetDepthMapSize(value)},enumerable:!0,configurable:!0}),ShadowMapperBase.prototype.dispose=function(){this._pCasterCollector=null,this._depthMap&&!this._explicitDepthMap&&this._depthMap.dispose(),this._depthMap=null},ShadowMapperBase.prototype.pCreateDepthTexture=function(){return new RenderTexture(this._pDepthMapSize,this._pDepthMapSize)},ShadowMapperBase.prototype.iRenderDepthMap=function(stage,entityCollector,renderer){this._iShadowsInvalid=!1,this.pUpdateDepthProjection(entityCollector.camera),this._depthMap||(this._depthMap=this.pCreateDepthTexture()),this.pDrawDepthMap(this._depthMap,entityCollector.scene,renderer)},ShadowMapperBase.prototype.pUpdateDepthProjection=function(){throw new AbstractMethodError},ShadowMapperBase.prototype.pDrawDepthMap=function(){throw new AbstractMethodError},ShadowMapperBase.prototype._pSetDepthMapSize=function(value){if(this._pDepthMapSize=value,this._explicitDepthMap)throw Error("Cannot set depth map size for the current renderer.");this._depthMap&&(this._depthMap.dispose(),this._depthMap=null)},ShadowMapperBase}();materials.ShadowMapperBase=ShadowMapperBase}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(materials){var Camera=away.entities.Camera,CubeMapShadowMapper=function(_super){function CubeMapShadowMapper(){_super.call(this),this._pDepthMapSize=512,this._needsRender=new Array,this.initCameras()}return __extends(CubeMapShadowMapper,_super),CubeMapShadowMapper.prototype.initCameras=function(){this._depthCameras=new Array,this._projections=new Array,this.addCamera(0,90,0),this.addCamera(0,-90,0),this.addCamera(-90,0,0),this.addCamera(90,0,0),this.addCamera(0,0,0),this.addCamera(0,180,0)},CubeMapShadowMapper.prototype.addCamera=function(rotationX,rotationY,rotationZ){var cam=new Camera;cam.rotationX=rotationX,cam.rotationY=rotationY,cam.rotationZ=rotationZ,cam.projection.near=.01;var projection=cam.projection;projection.fieldOfView=90,this._projections.push(projection),cam.projection._iAspectRatio=1,this._depthCameras.push(cam)},CubeMapShadowMapper.prototype.pCreateDepthTexture=function(){throw new away.errors.PartialImplementationError},CubeMapShadowMapper.prototype.pUpdateDepthProjection=function(){for(var light=this._pLight,maxDistance=light._pFallOff,pos=this._pLight.scenePosition,i=0;6>i;++i)this._projections[i].far=maxDistance,this._depthCameras[i].transform.position=pos,this._needsRender[i]=!0},CubeMapShadowMapper.prototype.pDrawDepthMap=function(target,scene,renderer){for(var i=0;6>i;++i)this._needsRender[i]&&(this._pCasterCollector.camera=this._depthCameras[i],this._pCasterCollector.clear(),scene.traversePartitions(this._pCasterCollector),renderer._iRender(this._pCasterCollector,target,null,i))},CubeMapShadowMapper}(materials.ShadowMapperBase);materials.CubeMapShadowMapper=CubeMapShadowMapper}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(materials){var Camera=away.entities.Camera,Matrix3D=away.geom.Matrix3D,FreeMatrixProjection=away.projections.FreeMatrixProjection,DirectionalShadowMapper=function(_super){function DirectionalShadowMapper(){_super.call(this),this._pLightOffset=1e4,this._pSnap=64,this._pCullPlanes=[],this._pOverallDepthProjection=new FreeMatrixProjection,this._pOverallDepthCamera=new Camera(this._pOverallDepthProjection),this._pLocalFrustum=[],this._pMatrix=new Matrix3D}return __extends(DirectionalShadowMapper,_super),Object.defineProperty(DirectionalShadowMapper.prototype,"snap",{get:function(){return this._pSnap},set:function(value){this._pSnap=value},enumerable:!0,configurable:!0}),Object.defineProperty(DirectionalShadowMapper.prototype,"lightOffset",{get:function(){return this._pLightOffset},set:function(value){this._pLightOffset=value},enumerable:!0,configurable:!0}),Object.defineProperty(DirectionalShadowMapper.prototype,"iDepthProjection",{get:function(){return this._pOverallDepthCamera.viewProjection},enumerable:!0,configurable:!0}),Object.defineProperty(DirectionalShadowMapper.prototype,"depth",{get:function(){return this._pMaxZ-this._pMinZ},enumerable:!0,configurable:!0}),DirectionalShadowMapper.prototype.pDrawDepthMap=function(target,scene,renderer){this._pCasterCollector.camera=this._pOverallDepthCamera,this._pCasterCollector.cullPlanes=this._pCullPlanes,this._pCasterCollector.clear(),scene.traversePartitions(this._pCasterCollector),renderer._iRender(this._pCasterCollector,target)},DirectionalShadowMapper.prototype.pUpdateCullPlanes=function(viewCamera){var lightFrustumPlanes=this._pOverallDepthCamera.frustumPlanes,viewFrustumPlanes=viewCamera.frustumPlanes;this._pCullPlanes.length=4,this._pCullPlanes[0]=lightFrustumPlanes[0],this._pCullPlanes[1]=lightFrustumPlanes[1],this._pCullPlanes[2]=lightFrustumPlanes[2],this._pCullPlanes[3]=lightFrustumPlanes[3];for(var light=this._pLight,dir=light.sceneDirection,dirX=dir.x,dirY=dir.y,dirZ=dir.z,j=4,i=0;6>i;++i){var plane=viewFrustumPlanes[i];plane.a*dirX+plane.b*dirY+plane.c*dirZ<0&&(this._pCullPlanes[j++]=plane)}},DirectionalShadowMapper.prototype.pUpdateDepthProjection=function(viewCamera){this.pUpdateProjectionFromFrustumCorners(viewCamera,viewCamera.projection.frustumCorners,this._pMatrix),this._pOverallDepthProjection.matrix=this._pMatrix,this.pUpdateCullPlanes(viewCamera)},DirectionalShadowMapper.prototype.pUpdateProjectionFromFrustumCorners=function(viewCamera,corners,matrix){var dir,x,y,z,minX,minY,maxX,maxY,i,raw=new Array,light=this._pLight;for(dir=light.sceneDirection,this._pOverallDepthCamera.transform.matrix3D=this._pLight.sceneTransform,x=Math.floor((viewCamera.x-dir.x*this._pLightOffset)/this._pSnap)*this._pSnap,y=Math.floor((viewCamera.y-dir.y*this._pLightOffset)/this._pSnap)*this._pSnap,z=Math.floor((viewCamera.z-dir.z*this._pLightOffset)/this._pSnap)*this._pSnap,this._pOverallDepthCamera.x=x,this._pOverallDepthCamera.y=y,this._pOverallDepthCamera.z=z,this._pMatrix.copyFrom(this._pOverallDepthCamera.inverseSceneTransform),this._pMatrix.prepend(viewCamera.sceneTransform),this._pMatrix.transformVectors(corners,this._pLocalFrustum),minX=maxX=this._pLocalFrustum[0],minY=maxY=this._pLocalFrustum[1],this._pMaxZ=this._pLocalFrustum[2],i=3;24>i;)x=this._pLocalFrustum[i],y=this._pLocalFrustum[i+1],z=this._pLocalFrustum[i+2],minX>x&&(minX=x),x>maxX&&(maxX=x),minY>y&&(minY=y),y>maxY&&(maxY=y),z>this._pMaxZ&&(this._pMaxZ=z),i+=3;this._pMinZ=1;var w=maxX-minX,h=maxY-minY,d=1/(this._pMaxZ-this._pMinZ);0>minX&&(minX-=this._pSnap),0>minY&&(minY-=this._pSnap),minX=Math.floor(minX/this._pSnap)*this._pSnap,minY=Math.floor(minY/this._pSnap)*this._pSnap;var snap2=2*this._pSnap;w=Math.floor(w/snap2+2)*snap2,h=Math.floor(h/snap2+2)*snap2,maxX=minX+w,maxY=minY+h,w=1/w,h=1/h,raw[0]=2*w,raw[5]=2*h,raw[10]=d,raw[12]=-(maxX+minX)*w,raw[13]=-(maxY+minY)*h,raw[14]=-this._pMinZ*d,raw[15]=1,raw[1]=raw[2]=raw[3]=raw[4]=raw[6]=raw[7]=raw[8]=raw[9]=raw[11]=0,matrix.copyRawDataFrom(raw)},DirectionalShadowMapper}(materials.ShadowMapperBase);materials.DirectionalShadowMapper=DirectionalShadowMapper}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(materials){var Camera=away.entities.Camera,Event=away.events.Event,EventDispatcher=away.events.EventDispatcher,Matrix3DUtils=away.geom.Matrix3DUtils,Rectangle=away.geom.Rectangle,FreeMatrixProjection=away.projections.FreeMatrixProjection,CascadeShadowMapper=function(_super){function CascadeShadowMapper(numCascades){if("undefined"==typeof numCascades&&(numCascades=3),_super.call(this),this._pScissorRectsInvalid=!0,1>numCascades||numCascades>4)throw new Error("numCascades must be an integer between 1 and 4");this._numCascades=numCascades,this._changeDispatcher=new EventDispatcher(this),this.init()}return __extends(CascadeShadowMapper,_super),CascadeShadowMapper.prototype.getSplitRatio=function(index){return this._splitRatios[index]},CascadeShadowMapper.prototype.setSplitRatio=function(index,value){if(0>value?value=0:value>1&&(value=1),index>=this._numCascades)throw new Error("index must be smaller than the number of cascades!");this._splitRatios[index]=value},CascadeShadowMapper.prototype.getDepthProjections=function(partition){return this._depthCameras[partition].viewProjection},CascadeShadowMapper.prototype.init=function(){this._splitRatios=new Array(this._numCascades),this._nearPlaneDistances=new Array(this._numCascades);for(var s=1,i=this._numCascades-1;i>=0;--i)this._splitRatios[i]=s,s*=.4;for(this._texOffsetsX=Array(-1,1,-1,1),this._texOffsetsY=Array(1,1,-1,-1),this._pScissorRects=new Array(4),this._depthLenses=new Array,this._depthCameras=new Array,i=0;ivalue||value>4)throw new Error("numCascades must be an integer between 1 and 4");this._numCascades=value,this.invalidateScissorRects(),this.init(),this.dispatchEvent(new Event(Event.CHANGE))}},enumerable:!0,configurable:!0}),CascadeShadowMapper.prototype.pDrawDepthMap=function(target,scene,renderer){this._pScissorRectsInvalid&&this.updateScissorRects(),this._pCasterCollector.cullPlanes=this._pCullPlanes,this._pCasterCollector.camera=this._pOverallDepthCamera,this._pCasterCollector.clear(),scene.traversePartitions(this._pCasterCollector),renderer._iRenderCascades(this._pCasterCollector,target,this._numCascades,this._pScissorRects,this._depthCameras) -},CascadeShadowMapper.prototype.updateScissorRects=function(){var half=.5*this._pDepthMapSize;this._pScissorRects[0]=new Rectangle(0,0,half,half),this._pScissorRects[1]=new Rectangle(half,0,half,half),this._pScissorRects[2]=new Rectangle(0,half,half,half),this._pScissorRects[3]=new Rectangle(half,half,half,half),this._pScissorRectsInvalid=!1},CascadeShadowMapper.prototype.pUpdateDepthProjection=function(viewCamera){var matrix,projection=viewCamera.projection,projectionNear=projection.near,projectionRange=projection.far-projectionNear;this.pUpdateProjectionFromFrustumCorners(viewCamera,viewCamera.projection.frustumCorners,this._pMatrix),this._pMatrix.appendScale(.96,.96,1),this._pOverallDepthProjection.matrix=this._pMatrix,this.pUpdateCullPlanes(viewCamera);for(var i=0;ii;)xN=this._pLocalFrustum[i],yN=this._pLocalFrustum[i+1],zN=this._pLocalFrustum[i+2],xF=xN+(this._pLocalFrustum[i+12]-xN)*splitRatio,yF=yN+(this._pLocalFrustum[i+13]-yN)*splitRatio,zF=zN+(this._pLocalFrustum[i+14]-zN)*splitRatio,minX>xN&&(minX=xN),xN>maxX&&(maxX=xN),minY>yN&&(minY=yN),yN>maxY&&(maxY=yN),zN>maxZ&&(maxZ=zN),minX>xF&&(minX=xF),xF>maxX&&(maxX=xF),minY>yF&&(minY=yF),yF>maxY&&(maxY=yF),zF>maxZ&&(maxZ=zF),i+=3;minZ=1;var w=maxX-minX,h=maxY-minY,d=1/(maxZ-minZ);0>minX&&(minX-=this._pSnap),0>minY&&(minY-=this._pSnap),minX=Math.floor(minX/this._pSnap)*this._pSnap,minY=Math.floor(minY/this._pSnap)*this._pSnap;var snap2=2*this._pSnap;w=Math.floor(w/snap2+1)*snap2,h=Math.floor(h/snap2+1)*snap2,maxX=minX+w,maxY=minY+h,w=1/w,h=1/h,raw[0]=2*w,raw[5]=2*h,raw[10]=d,raw[12]=-(maxX+minX)*w,raw[13]=-(maxY+minY)*h,raw[14]=-minZ*d,raw[15]=1,raw[1]=raw[2]=raw[3]=raw[4]=raw[6]=raw[7]=raw[8]=raw[9]=raw[11]=0,matrix.copyRawDataFrom(raw),matrix.appendScale(.96,.96,1),matrix.appendTranslation(texOffsetX,texOffsetY,0),matrix.appendScale(.5,.5,1)},CascadeShadowMapper.prototype.addEventListener=function(type,listener){this._changeDispatcher.addEventListener(type,listener)},CascadeShadowMapper.prototype.removeEventListener=function(type,listener){this._changeDispatcher.removeEventListener(type,listener)},CascadeShadowMapper.prototype.dispatchEvent=function(event){return this._changeDispatcher.dispatchEvent(event)},CascadeShadowMapper.prototype.hasEventListener=function(type){return this._changeDispatcher.hasEventListener(type)},Object.defineProperty(CascadeShadowMapper.prototype,"_iNearPlaneDistances",{get:function(){return this._nearPlaneDistances},enumerable:!0,configurable:!0}),CascadeShadowMapper}(materials.DirectionalShadowMapper);materials.CascadeShadowMapper=CascadeShadowMapper}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(materials){var NearDirectionalShadowMapper=function(_super){function NearDirectionalShadowMapper(coverageRatio){"undefined"==typeof coverageRatio&&(coverageRatio=.5),_super.call(this),this.coverageRatio=coverageRatio}return __extends(NearDirectionalShadowMapper,_super),Object.defineProperty(NearDirectionalShadowMapper.prototype,"coverageRatio",{get:function(){return this._coverageRatio},set:function(value){value>1?value=1:0>value&&(value=0),this._coverageRatio=value},enumerable:!0,configurable:!0}),NearDirectionalShadowMapper.prototype.pUpdateDepthProjection=function(viewCamera){for(var corners=viewCamera.projection.frustumCorners,i=0;12>i;++i){var v=corners[i];this._pLocalFrustum[i]=v,this._pLocalFrustum[i+12]=v+(corners[i+12]-v)*this._coverageRatio}this.pUpdateProjectionFromFrustumCorners(viewCamera,this._pLocalFrustum,this._pMatrix),this._pOverallDepthProjection.matrix=this._pMatrix},NearDirectionalShadowMapper}(materials.DirectionalShadowMapper);materials.NearDirectionalShadowMapper=NearDirectionalShadowMapper}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(entities){var MaterialEvent=away.events.MaterialEvent,Billboard=function(_super){function Billboard(material,pixelSnapping,smoothing){"undefined"==typeof pixelSnapping&&(pixelSnapping="auto"),"undefined"==typeof smoothing&&(smoothing=!1);var _this=this;_super.call(this),this._pIsEntity=!0,this.onSizeChangedDelegate=function(event){return _this.onSizeChanged(event)},this.material=material,this._billboardWidth=material.width,this._billboardHeight=material.height}return __extends(Billboard,_super),Object.defineProperty(Billboard.prototype,"animator",{get:function(){return this._animator},enumerable:!0,configurable:!0}),Object.defineProperty(Billboard.prototype,"assetType",{get:function(){return away.library.AssetType.BILLBOARD},enumerable:!0,configurable:!0}),Object.defineProperty(Billboard.prototype,"billboardHeight",{get:function(){return this._billboardHeight},enumerable:!0,configurable:!0}),Object.defineProperty(Billboard.prototype,"billboardWidth",{get:function(){return this._billboardWidth},enumerable:!0,configurable:!0}),Object.defineProperty(Billboard.prototype,"material",{get:function(){return this._material},set:function(value){value!=this._material&&(this._material&&(this._material.iRemoveOwner(this),this._material.removeEventListener(MaterialEvent.SIZE_CHANGED,this.onSizeChangedDelegate)),this._material=value,this._material&&(this._material.iAddOwner(this),this._material.addEventListener(MaterialEvent.SIZE_CHANGED,this.onSizeChangedDelegate)))},enumerable:!0,configurable:!0}),Object.defineProperty(Billboard.prototype,"uvTransform",{get:function(){return this._uvTransform},set:function(value){this._uvTransform=value},enumerable:!0,configurable:!0}),Billboard.prototype.pCreateEntityPartitionNode=function(){return new away.partition.EntityNode(this)},Billboard.prototype.pUpdateBounds=function(){this._pBounds.fromExtremes(0,0,0,this._billboardWidth,this._billboardHeight,0),_super.prototype.pUpdateBounds.call(this)},Billboard.prototype._iTestCollision=function(shortestCollisionDistance){return this._pPickingCollider.testBillboardCollision(this,this._pPickingCollisionVO,shortestCollisionDistance)},Billboard.prototype.onSizeChanged=function(){this._billboardWidth=this._material.width,this._billboardHeight=this._material.height,this._pBoundsInvalid=!0;for(var len=this._pRenderables.length,i=0;len>i;i++)this._pRenderables[i].invalidateVertexData("vertices")},Billboard.prototype._iCollectRenderables=function(renderer){this._iSourcePrefab&&this._iSourcePrefab._iValidate(),this._iCollectRenderable(renderer)},Billboard.prototype._iCollectRenderable=function(renderer){renderer.applyBillboard(this)},Billboard}(away.base.DisplayObject);entities.Billboard=Billboard}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(entities){var NullBounds=away.bounds.NullBounds,Matrix3D=away.geom.Matrix3D,Vector3D=away.geom.Vector3D,DirectionalShadowMapper=away.materials.DirectionalShadowMapper,DirectionalLightNode=away.partition.DirectionalLightNode,DirectionalLight=function(_super){function DirectionalLight(xDir,yDir,zDir){"undefined"==typeof xDir&&(xDir=0),"undefined"==typeof yDir&&(yDir=-1),"undefined"==typeof zDir&&(zDir=1),_super.call(this),this._pIsEntity=!0,this.direction=new Vector3D(xDir,yDir,zDir),this._sceneDirection=new Vector3D}return __extends(DirectionalLight,_super),Object.defineProperty(DirectionalLight.prototype,"sceneDirection",{get:function(){return this._pSceneTransformDirty&&this.pUpdateSceneTransform(),this._sceneDirection},enumerable:!0,configurable:!0}),Object.defineProperty(DirectionalLight.prototype,"direction",{get:function(){return this._direction},set:function(value){this._direction=value,this._tmpLookAt||(this._tmpLookAt=new Vector3D),this._tmpLookAt.x=this.x+this._direction.x,this._tmpLookAt.y=this.y+this._direction.y,this._tmpLookAt.z=this.z+this._direction.z,this.lookAt(this._tmpLookAt)},enumerable:!0,configurable:!0}),DirectionalLight.prototype.pCreateDefaultBoundingVolume=function(){return new NullBounds},DirectionalLight.prototype.pUpdateBounds=function(){},DirectionalLight.prototype.pUpdateSceneTransform=function(){_super.prototype.pUpdateSceneTransform.call(this),this.sceneTransform.copyColumnTo(2,this._sceneDirection),this._sceneDirection.normalize()},DirectionalLight.prototype.pCreateShadowMapper=function(){return new DirectionalShadowMapper},DirectionalLight.prototype.pCreateEntityPartitionNode=function(){return new DirectionalLightNode(this)},DirectionalLight.prototype.iGetObjectProjectionMatrix=function(entity,camera,target){"undefined"==typeof target&&(target=null);var raw=new Array,bounds=entity.bounds,m=new Matrix3D;m.copyFrom(entity.getRenderSceneTransform(camera)),m.append(this.inverseSceneTransform),this._projAABBPoints||(this._projAABBPoints=[]),m.transformVectors(bounds.aabbPoints,this._projAABBPoints);for(var d,xMin=1/0,xMax=-1/0,yMin=1/0,yMax=-1/0,zMin=1/0,zMax=-1/0,i=0;24>i;)d=this._projAABBPoints[i++],xMin>d&&(xMin=d),d>xMax&&(xMax=d),d=this._projAABBPoints[i++],yMin>d&&(yMin=d),d>yMax&&(yMax=d),d=this._projAABBPoints[i++],zMin>d&&(zMin=d),d>zMax&&(zMax=d);var invXRange=1/(xMax-xMin),invYRange=1/(yMax-yMin),invZRange=1/(zMax-zMin);return raw[0]=2*invXRange,raw[5]=2*invYRange,raw[10]=invZRange,raw[12]=-(xMax+xMin)*invXRange,raw[13]=-(yMax+yMin)*invYRange,raw[14]=-zMin*invZRange,raw[1]=raw[2]=raw[3]=raw[4]=raw[6]=raw[7]=raw[8]=raw[9]=raw[11]=0,raw[15]=1,target||(target=new Matrix3D),target.copyRawDataFrom(raw),target.prepend(m),target},DirectionalLight.prototype._iCollectRenderables=function(){},DirectionalLight}(away.base.LightBase);entities.DirectionalLight=DirectionalLight}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(entities){var NullBounds=away.bounds.NullBounds,LightProbeNode=away.partition.LightProbeNode,LightProbe=function(_super){function LightProbe(diffuseMap,specularMap){"undefined"==typeof specularMap&&(specularMap=null),_super.call(this),this._pIsEntity=!0,this._diffuseMap=diffuseMap,this._specularMap=specularMap}return __extends(LightProbe,_super),Object.defineProperty(LightProbe.prototype,"diffuseMap",{get:function(){return this._diffuseMap},set:function(value){this._diffuseMap=value},enumerable:!0,configurable:!0}),Object.defineProperty(LightProbe.prototype,"specularMap",{get:function(){return this._specularMap},set:function(value){this._specularMap=value},enumerable:!0,configurable:!0}),LightProbe.prototype.pCreateEntityPartitionNode=function(){return new LightProbeNode(this)},LightProbe.prototype.pUpdateBounds=function(){this._pBoundsInvalid=!1},LightProbe.prototype.pCreateDefaultBoundingVolume=function(){return new NullBounds},LightProbe.prototype.iGetObjectProjectionMatrix=function(entity,camera,target){throw"undefined"==typeof target&&(target=null),new away.errors.Error("Object projection matrices are not supported for LightProbe objects!")},LightProbe.prototype._iCollectRenderables=function(){},LightProbe}(away.base.LightBase);entities.LightProbe=LightProbe}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(entities){var MaterialEvent=away.events.MaterialEvent,EntityNode=away.partition.EntityNode,LineSegment=function(_super){function LineSegment(material,startPosition,endPosition,thickness){"undefined"==typeof thickness&&(thickness=1);var _this=this;_super.call(this),this._pIsEntity=!0,this.onSizeChangedDelegate=function(event){return _this.onSizeChanged(event)},this.material=material,this._startPosition=startPosition,this._endPosition=endPosition,this._halfThickness=.5*thickness}return __extends(LineSegment,_super),Object.defineProperty(LineSegment.prototype,"animator",{get:function(){return this._animator},enumerable:!0,configurable:!0}),Object.defineProperty(LineSegment.prototype,"assetType",{get:function(){return away.library.AssetType.LINE_SEGMENT},enumerable:!0,configurable:!0}),Object.defineProperty(LineSegment.prototype,"startPostion",{get:function(){return this._startPosition},enumerable:!0,configurable:!0}),Object.defineProperty(LineSegment.prototype,"startPosition",{set:function(value){this._startPosition!=value&&(this._startPosition=value,this.notifyRenderableUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(LineSegment.prototype,"endPosition",{get:function(){return this._endPosition},set:function(value){this._endPosition!=value&&(this._endPosition=value,this.notifyRenderableUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(LineSegment.prototype,"material",{get:function(){return this._material},set:function(value){value!=this._material&&(this._material&&(this._material.iRemoveOwner(this),this._material.removeEventListener(MaterialEvent.SIZE_CHANGED,this.onSizeChangedDelegate)),this._material=value,this._material&&(this._material.iAddOwner(this),this._material.addEventListener(MaterialEvent.SIZE_CHANGED,this.onSizeChangedDelegate)))},enumerable:!0,configurable:!0}),Object.defineProperty(LineSegment.prototype,"thickness",{get:function(){return 2*this._halfThickness},set:function(value){this._halfThickness!=value&&(this._halfThickness=.5*value,this.notifyRenderableUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(LineSegment.prototype,"uvTransform",{get:function(){return this._uvTransform},set:function(value){this._uvTransform=value},enumerable:!0,configurable:!0}),LineSegment.prototype.dispose=function(){this._startPosition=null,this._endPosition=null},LineSegment.prototype.pCreateEntityPartitionNode=function(){return new EntityNode(this)},LineSegment.prototype.pUpdateBounds=function(){this._pBounds.fromExtremes(this._startPosition.x,this._startPosition.y,this._startPosition.z,this._endPosition.x,this._endPosition.y,this._endPosition.z),_super.prototype.pUpdateBounds.call(this)},LineSegment.prototype.onSizeChanged=function(){this.notifyRenderableUpdate()},LineSegment.prototype.notifyRenderableUpdate=function(){for(var len=this._pRenderables.length,i=0;len>i;i++)this._pRenderables[i].invalidateVertexData("vertices")},LineSegment.prototype._iCollectRenderables=function(renderer){this._iSourcePrefab&&this._iSourcePrefab._iValidate(),this._iCollectRenderable(renderer)},LineSegment.prototype._iCollectRenderable=function(){},LineSegment}(away.base.DisplayObject);entities.LineSegment=LineSegment}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(entities){var Geometry=away.base.Geometry,GeometryEvent=away.events.GeometryEvent,Mesh=function(_super){function Mesh(geometry,material){"undefined"==typeof material&&(material=null);var _this=this;_super.call(this),this._castsShadows=!0,this._shareAnimationGeometry=!0,this._pIsEntity=!0,this._subMeshes=new Array,this._onGeometryBoundsInvalidDelegate=function(event){return _this.onGeometryBoundsInvalid(event)},this._onSubGeometryAddedDelegate=function(event){return _this.onSubGeometryAdded(event)},this._onSubGeometryRemovedDelegate=function(event){return _this.onSubGeometryRemoved(event)},this.geometry=geometry||new Geometry,this.material=material}return __extends(Mesh,_super),Object.defineProperty(Mesh.prototype,"animator",{get:function(){return this._animator},set:function(value){this._animator&&this._animator.removeOwner(this),this._animator=value;for(var subMesh,len=this._subMeshes.length,i=0;len>i;++i)subMesh=this._subMeshes[i],subMesh.material&&(subMesh.material.iRemoveOwner(subMesh),subMesh.material.iAddOwner(subMesh)),subMesh._iInvalidateRenderableGeometry();this._animator&&this._animator.addOwner(this)},enumerable:!0,configurable:!0}),Object.defineProperty(Mesh.prototype,"assetType",{get:function(){return away.library.AssetType.MESH},enumerable:!0,configurable:!0}),Object.defineProperty(Mesh.prototype,"castsShadows",{get:function(){return this._castsShadows},set:function(value){this._castsShadows=value},enumerable:!0,configurable:!0}),Object.defineProperty(Mesh.prototype,"geometry",{get:function(){return this._iSourcePrefab&&this._iSourcePrefab._iValidate(),this._geometry},set:function(value){var i;if(this._geometry){for(this._geometry.removeEventListener(GeometryEvent.BOUNDS_INVALID,this._onGeometryBoundsInvalidDelegate),this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_ADDED,this._onSubGeometryAddedDelegate),this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED,this._onSubGeometryRemovedDelegate),i=0;ii;i++)this._material&&(subMesh=this._subMeshes[i]).material==this._material&&this._material.iRemoveOwner(subMesh);for(this._material=value,i=0;len>i;i++)this._material&&(subMesh=this._subMeshes[i]).material==this._material&&this._material.iAddOwner(subMesh)}},enumerable:!0,configurable:!0}),Object.defineProperty(Mesh.prototype,"shareAnimationGeometry",{get:function(){return this._shareAnimationGeometry},set:function(value){this._shareAnimationGeometry=value},enumerable:!0,configurable:!0}),Object.defineProperty(Mesh.prototype,"subMeshes",{get:function(){return this._iSourcePrefab&&this._iSourcePrefab._iValidate(),this._subMeshes},enumerable:!0,configurable:!0}),Object.defineProperty(Mesh.prototype,"uvTransform",{get:function(){return this._uvTransform},set:function(value){this._uvTransform=value},enumerable:!0,configurable:!0}),Mesh.prototype.bakeTransformations=function(){this.geometry.applyTransformation(this._iMatrix3D),this._iMatrix3D.identity()},Mesh.prototype.dispose=function(){_super.prototype.dispose.call(this),this.material=null,this.geometry=null},Mesh.prototype.disposeWithAnimatorAndChildren=function(){this.disposeWithChildren(),this._animator&&this._animator.dispose()},Mesh.prototype.clone=function(){var clone=new Mesh(this._geometry,this._material);clone._iMatrix3D=this._iMatrix3D,clone.pivot=this.pivot,clone.partition=this.partition,clone.bounds=this.bounds.clone(),clone.name=this.name,clone.castsShadows=this.castsShadows,clone.shareAnimationGeometry=this.shareAnimationGeometry,clone.mouseEnabled=this.mouseEnabled,clone.mouseChildren=this.mouseChildren,clone.extra=this.extra;for(var len=this._subMeshes.length,i=0;len>i;++i)clone._subMeshes[i].material=this._subMeshes[i]._iGetExplicitMaterial();len=this.numChildren;var obj;for(i=0;len>i;++i)obj=this.getChildAt(i).clone(),clone.addChild(obj);return this._animator&&(clone.animator=this._animator.clone()),clone},Mesh.prototype.getSubMeshFromSubGeometry=function(subGeometry){return this._subMeshes[this._geometry.subGeometries.indexOf(subGeometry)]},Mesh.prototype.pCreateEntityPartitionNode=function(){return new away.partition.EntityNode(this)},Mesh.prototype.pUpdateBounds=function(){this._pBounds.fromGeometry(this._geometry),_super.prototype.pUpdateBounds.call(this)},Mesh.prototype.onGeometryBoundsInvalid=function(){this.pInvalidateBounds()},Mesh.prototype.onSubGeometryAdded=function(event){this.addSubMesh(event.subGeometry)},Mesh.prototype.onSubGeometryRemoved=function(event){var subMesh,i,subGeom=event.subGeometry,len=this._subMeshes.length;for(i=0;len>i;++i)if(subMesh=this._subMeshes[i],subMesh.subGeometry==subGeom){subMesh.dispose(),this._subMeshes.splice(i,1);break}for(--len;len>i;++i)this._subMeshes[i]._iIndex=i},Mesh.prototype.addSubMesh=function(subGeometry){var SubMeshClass=subGeometry.subMeshClass,subMesh=new SubMeshClass(subGeometry,this,null),len=this._subMeshes.length;subMesh._iIndex=len,this._subMeshes[len]=subMesh,this.pInvalidateBounds()},Mesh.prototype._iTestCollision=function(shortestCollisionDistance,findClosest){return this._pPickingCollider.testMeshCollision(this,this._pPickingCollisionVO,shortestCollisionDistance,findClosest)},Mesh.prototype._iCollectRenderables=function(renderer){this._iSourcePrefab&&this._iSourcePrefab._iValidate();for(var len=this._subMeshes.length,i=0;len>i;i++)this._subMeshes[i]._iCollectRenderable(renderer)},Mesh.prototype._iInvalidateRenderableGeometries=function(){for(var len=this._subMeshes.length,i=0;len>i;++i)this._subMeshes[i]._iInvalidateRenderableGeometry()},Mesh}(away.containers.DisplayObjectContainer);entities.Mesh=Mesh}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(entities){var BoundingSphere=away.bounds.BoundingSphere,Matrix3D=away.geom.Matrix3D,Vector3D=away.geom.Vector3D,CubeMapShadowMapper=away.materials.CubeMapShadowMapper,PointLightNode=away.partition.PointLightNode,PointLight=function(_super){function PointLight(){_super.call(this),this._pRadius=9e4,this._pFallOff=1e5,this._pIsEntity=!0,this._pFallOffFactor=1/(this._pFallOff*this._pFallOff-this._pRadius*this._pRadius)}return __extends(PointLight,_super),PointLight.prototype.pCreateShadowMapper=function(){return new CubeMapShadowMapper},Object.defineProperty(PointLight.prototype,"radius",{get:function(){return this._pRadius},set:function(value){this._pRadius=value,this._pRadius<0?this._pRadius=0:this._pRadius>this._pFallOff&&(this._pFallOff=this._pRadius,this.pInvalidateBounds()),this._pFallOffFactor=1/(this._pFallOff*this._pFallOff-this._pRadius*this._pRadius)},enumerable:!0,configurable:!0}),PointLight.prototype.iFallOffFactor=function(){return this._pFallOffFactor},Object.defineProperty(PointLight.prototype,"fallOff",{get:function(){return this._pFallOff},set:function(value){this._pFallOff=value,this._pFallOff<0&&(this._pFallOff=0),this._pFallOffd2?d1:d2),z=m.rawData[14];return zMin=z-d,zMax=z+d,raw[5]=raw[0]=zMin/d,raw[10]=zMax/(zMax-zMin),raw[11]=1,raw[1]=raw[2]=raw[3]=raw[4]=raw[6]=raw[7]=raw[8]=raw[9]=raw[12]=raw[13]=raw[15]=0,raw[14]=-zMin*raw[10],target||(target=new Matrix3D),target.copyRawDataFrom(raw),target.prepend(m),target},PointLight.prototype._iCollectRenderables=function(){},PointLight}(away.base.LightBase);entities.PointLight=PointLight}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(entities){var Shape=function(_super){function Shape(){_super.call(this)}return __extends(Shape,_super),Object.defineProperty(Shape.prototype,"graphics",{get:function(){return this._graphics},enumerable:!0,configurable:!0}),Shape}(away.base.DisplayObject);entities.Shape=Shape}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(entities){var NullBounds=away.bounds.NullBounds,SkyboxNode=away.partition.SkyboxNode,Skybox=function(_super){function Skybox(material){_super.call(this),this._pIsEntity=!0,this.material=material}return __extends(Skybox,_super),Object.defineProperty(Skybox.prototype,"animator",{get:function(){return this._animator},enumerable:!0,configurable:!0}),Object.defineProperty(Skybox.prototype,"uvTransform",{get:function(){return this._uvTransform},set:function(value){this._uvTransform=value},enumerable:!0,configurable:!0}),Object.defineProperty(Skybox.prototype,"material",{get:function(){return this._material},set:function(value){value!=this._material&&(this._material&&this._material.iRemoveOwner(this),this._material=value,this._material&&this._material.iAddOwner(this))},enumerable:!0,configurable:!0}),Object.defineProperty(Skybox.prototype,"assetType",{get:function(){return away.library.AssetType.SKYBOX},enumerable:!0,configurable:!0}),Skybox.prototype.pInvalidateBounds=function(){},Skybox.prototype.pCreateEntityPartitionNode=function(){return new SkyboxNode(this)},Skybox.prototype.pCreateDefaultBoundingVolume=function(){return new NullBounds},Skybox.prototype.pUpdateBounds=function(){this._pBoundsInvalid=!1},Object.defineProperty(Skybox.prototype,"castsShadows",{get:function(){return!1},enumerable:!0,configurable:!0}),Skybox.prototype._iCollectRenderables=function(){},Skybox.prototype._iCollectRenderable=function(){},Skybox}(away.base.DisplayObject);entities.Skybox=Skybox}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(entities){var TextField=function(_super){function TextField(){_super.call(this),this._text=""}return __extends(TextField,_super),Object.defineProperty(TextField.prototype,"bottomScrollV",{get:function(){return this._bottomScrollV},enumerable:!0,configurable:!0}),Object.defineProperty(TextField.prototype,"caretIndex",{get:function(){return this._caretIndex},enumerable:!0,configurable:!0}),Object.defineProperty(TextField.prototype,"length",{get:function(){return this._length},enumerable:!0,configurable:!0}),TextField.prototype.maxScrollH=function(){return this._maxScrollH},TextField.prototype.maxScrollV=function(){return this._maxScrollV},Object.defineProperty(TextField.prototype,"numLines",{get:function(){return this._numLines},enumerable:!0,configurable:!0}),Object.defineProperty(TextField.prototype,"selectionBeginIndex",{get:function(){return this._selectionBeginIndex},enumerable:!0,configurable:!0}),Object.defineProperty(TextField.prototype,"selectionEndIndex",{get:function(){return this._selectionEndIndex},enumerable:!0,configurable:!0}),Object.defineProperty(TextField.prototype,"text",{get:function(){return this._text},set:function(value){this._text!=value&&(this._text=value)},enumerable:!0,configurable:!0}),Object.defineProperty(TextField.prototype,"textHeight",{get:function(){return this._textHeight},enumerable:!0,configurable:!0}),Object.defineProperty(TextField.prototype,"textInteractionMode",{get:function(){return this._textInteractionMode},enumerable:!0,configurable:!0}),Object.defineProperty(TextField.prototype,"textWidth",{get:function(){return this._textWidth},enumerable:!0,configurable:!0}),TextField.prototype.appendText=function(){},TextField.prototype.getCharBoundaries=function(){return this._charBoundaries},TextField.prototype.getCharIndexAtPoint=function(){return this._charIndexAtPoint},TextField.prototype.getFirstCharInParagraph=function(){return this._firstCharInParagraph},TextField.prototype.getImageReference=function(){return this._imageReference},TextField.prototype.getLineIndexAtPoint=function(){return this._lineIndexAtPoint},TextField.prototype.getLineIndexOfChar=function(){return this._lineIndexOfChar},TextField.prototype.getLineLength=function(){return this._lineLength},TextField.prototype.getLineMetrics=function(){return this._lineMetrics},TextField.prototype.getLineOffset=function(){return this._lineOffset},TextField.prototype.getLineText=function(){return this._lineText},TextField.prototype.getParagraphLength=function(){return this._paragraphLength},TextField.prototype.getTextFormat=function(beginIndex,endIndex){return"undefined"==typeof beginIndex&&(beginIndex=-1),"undefined"==typeof endIndex&&(endIndex=-1),this._textFormat},TextField.prototype.replaceSelectedText=function(){},TextField.prototype.replaceText=function(){},TextField.prototype.setSelection=function(){},TextField.prototype.setTextFormat=function(format,beginIndex,endIndex){"undefined"==typeof beginIndex&&(beginIndex=-1),"undefined"==typeof endIndex&&(endIndex=-1)},TextField.isFontCompatible=function(){return!1},TextField}(away.base.DisplayObject);entities.TextField=TextField}(away.entities||(away.entities={}));away.entities}(away||(away={}));var away;!function(away){!function(managers){var MouseManager=function(){function MouseManager(){var _this=this;this._viewLookup=new Array,this._nullVector=new away.geom.Vector3D,this._queuedEvents=new Array,this._mouseUp=new away.events.MouseEvent(away.events.MouseEvent.MOUSE_UP),this._mouseClick=new away.events.MouseEvent(away.events.MouseEvent.CLICK),this._mouseOut=new away.events.MouseEvent(away.events.MouseEvent.MOUSE_OUT),this._mouseDown=new away.events.MouseEvent(away.events.MouseEvent.MOUSE_DOWN),this._mouseMove=new away.events.MouseEvent(away.events.MouseEvent.MOUSE_MOVE),this._mouseOver=new away.events.MouseEvent(away.events.MouseEvent.MOUSE_OVER),this._mouseWheel=new away.events.MouseEvent(away.events.MouseEvent.MOUSE_WHEEL),this._mouseDoubleClick=new away.events.MouseEvent(away.events.MouseEvent.DOUBLE_CLICK),this.onClickDelegate=function(event){return _this.onClick(event)},this.onDoubleClickDelegate=function(event){return _this.onDoubleClick(event)},this.onMouseDownDelegate=function(event){return _this.onMouseDown(event)},this.onMouseMoveDelegate=function(event){return _this.onMouseMove(event)},this.onMouseUpDelegate=function(event){return _this.onMouseUp(event)},this.onMouseWheelDelegate=function(event){return _this.onMouseWheel(event)},this.onMouseOverDelegate=function(event){return _this.onMouseOver(event)},this.onMouseOutDelegate=function(event){return _this.onMouseOut(event)}}return MouseManager.getInstance=function(){return this._instance?this._instance:this._instance=new MouseManager},MouseManager.prototype.fireMouseEvents=function(forceMouseMove){this._iCollidingObject!=this._previousCollidingObject&&(this._previousCollidingObject&&this.queueDispatch(this._mouseOut,this._mouseMoveEvent,this._previousCollidingObject),this._iCollidingObject&&this.queueDispatch(this._mouseOver,this._mouseMoveEvent)),forceMouseMove&&this._iCollidingObject&&this.queueDispatch(this._mouseMove,this._mouseMoveEvent);for(var event,dispatcher,len=this._queuedEvents.length,i=0;len>i;++i){for(event=this._queuedEvents[i],dispatcher=event.object;dispatcher&&!dispatcher._iIsMouseEnabled();)dispatcher=dispatcher.parent;dispatcher&&dispatcher.dispatchEvent(event)}this._queuedEvents.length=0,this._previousCollidingObject=this._iCollidingObject,this._iUpdateDirty=!1},MouseManager.prototype.registerView=function(view){view.htmlElement.addEventListener("click",this.onClickDelegate),view.htmlElement.addEventListener("dblclick",this.onDoubleClickDelegate),view.htmlElement.addEventListener("mousedown",this.onMouseDownDelegate),view.htmlElement.addEventListener("mousemove",this.onMouseMoveDelegate),view.htmlElement.addEventListener("mouseup",this.onMouseUpDelegate),view.htmlElement.addEventListener("mousewheel",this.onMouseWheelDelegate),view.htmlElement.addEventListener("mouseover",this.onMouseOverDelegate),view.htmlElement.addEventListener("mouseout",this.onMouseOutDelegate),this._viewLookup.push(view) -},MouseManager.prototype.unregisterView=function(view){view.htmlElement.removeEventListener("click",this.onClickDelegate),view.htmlElement.removeEventListener("dblclick",this.onDoubleClickDelegate),view.htmlElement.removeEventListener("mousedown",this.onMouseDownDelegate),view.htmlElement.removeEventListener("mousemove",this.onMouseMoveDelegate),view.htmlElement.removeEventListener("mouseup",this.onMouseUpDelegate),view.htmlElement.removeEventListener("mousewheel",this.onMouseWheelDelegate),view.htmlElement.removeEventListener("mouseover",this.onMouseOverDelegate),view.htmlElement.removeEventListener("mouseout",this.onMouseOutDelegate),this._viewLookup.slice(this._viewLookup.indexOf(view),1)},MouseManager.prototype.queueDispatch=function(event,sourceEvent,collider){"undefined"==typeof collider&&(collider=null),sourceEvent&&(event.ctrlKey=sourceEvent.ctrlKey,event.altKey=sourceEvent.altKey,event.shiftKey=sourceEvent.shiftKey,event.screenX=sourceEvent.clientX,event.screenY=sourceEvent.clientY),null==collider&&(collider=this._iCollidingObject),collider?(event.object=collider.displayObject,event.materialOwner=collider.materialOwner,event.uv=collider.uv,event.localPosition=collider.localPosition?collider.localPosition.clone():null,event.localNormal=collider.localNormal?collider.localNormal.clone():null,event.index=collider.index):(event.uv=null,event.object=null,event.localPosition=this._nullVector,event.localNormal=this._nullVector,event.index=0,event.subGeometryIndex=0),this._queuedEvents.push(event)},MouseManager.prototype.onMouseMove=function(event){this.updateColliders(event),this._iCollidingObject&&this.queueDispatch(this._mouseMove,this._mouseMoveEvent=event)},MouseManager.prototype.onMouseOut=function(event){this._iActiveDiv=null,this.updateColliders(event),this._iCollidingObject&&this.queueDispatch(this._mouseOut,event)},MouseManager.prototype.onMouseOver=function(event){this._iActiveDiv=event.target,this.updateColliders(event),this._iCollidingObject&&this.queueDispatch(this._mouseOver,event)},MouseManager.prototype.onClick=function(event){this.updateColliders(event),this._iCollidingObject&&this.queueDispatch(this._mouseClick,event)},MouseManager.prototype.onDoubleClick=function(event){this.updateColliders(event),this._iCollidingObject&&this.queueDispatch(this._mouseDoubleClick,event)},MouseManager.prototype.onMouseDown=function(event){this._iActiveDiv=event.target,this.updateColliders(event),this._iCollidingObject&&this.queueDispatch(this._mouseDown,event)},MouseManager.prototype.onMouseUp=function(event){this.updateColliders(event),this._iCollidingObject&&this.queueDispatch(this._mouseUp,event)},MouseManager.prototype.onMouseWheel=function(event){this.updateColliders(event),this._iCollidingObject&&this.queueDispatch(this._mouseWheel,event)},MouseManager.prototype.updateColliders=function(event){if(!this._iUpdateDirty){for(var view,bounds,mouseX=event.clientX,mouseY=event.clientY,len=this._viewLookup.length,i=0;len>i;i++)if(view=this._viewLookup[i],bounds=view.htmlElement.getBoundingClientRect(),mouseXbounds.right||mouseYbounds.bottom)view._pMouseX=null,view._pMouseY=null;else if(view._pMouseX=mouseX+bounds.left,view._pMouseY=mouseY+bounds.top,view.updateCollider(),view.layeredView&&this._iCollidingObject)break;this._iUpdateDirty=!0}},MouseManager}();managers.MouseManager=MouseManager}(away.managers||(away.managers={}));away.managers}(away||(away={}));var away;!function(away){!function(managers){var Stage=away.base.Stage,StageEvent=away.events.StageEvent,StageManager=function(_super){function StageManager(StageManagerSingletonEnforcer){var _this=this;if(_super.call(this),!StageManagerSingletonEnforcer)throw new Error("This class is a multiton and cannot be instantiated manually. Use StageManager.getInstance instead.");this._stages=new Array(StageManager.STAGE_MAX_QUANTITY),this._onContextCreatedDelegate=function(event){return _this.onContextCreated(event)}}return __extends(StageManager,_super),StageManager.getInstance=function(){return null==this._instance&&(this._instance=new StageManager(new StageManagerSingletonEnforcer)),this._instance},StageManager.prototype.getStageAt=function(index,forceSoftware,profile,mode){if("undefined"==typeof forceSoftware&&(forceSoftware=!1),"undefined"==typeof profile&&(profile="baseline"),"undefined"==typeof mode&&(mode="auto"),0>index||index>=StageManager.STAGE_MAX_QUANTITY)throw new away.errors.ArgumentError("Index is out of bounds [0.."+StageManager.STAGE_MAX_QUANTITY+"]");if(!this._stages[index]){StageManager._numStages++;var canvas=document.createElement("canvas");canvas.id="stage"+index,document.body.appendChild(canvas);var stage=this._stages[index]=new Stage(canvas,index,this,forceSoftware,profile);stage.addEventListener(StageEvent.CONTEXT_CREATED,this._onContextCreatedDelegate),stage.requestContext(forceSoftware,profile,mode)}return stage},StageManager.prototype.iRemoveStage=function(stage){StageManager._numStages--,stage.removeEventListener(StageEvent.CONTEXT_CREATED,this._onContextCreatedDelegate),this._stages[stage.stageIndex]=null},StageManager.prototype.getFreeStage=function(forceSoftware,profile,mode){"undefined"==typeof forceSoftware&&(forceSoftware=!1),"undefined"==typeof profile&&(profile="baseline"),"undefined"==typeof mode&&(mode="auto");for(var i=0,len=this._stages.length;len>i;){if(!this._stages[i])return this.getStageAt(i,forceSoftware,profile,mode);++i}return null},Object.defineProperty(StageManager.prototype,"hasFreeStage",{get:function(){return StageManager._numStagesi;i++)this.removeListeners(this._loadingSessions[i]),this._loadingSessions[i].stop(),this._loadingSessions[i]=null;this._loadingSessions=null},Loader.prototype.load=function(request,context,ns,parser){"undefined"==typeof context&&(context=null),"undefined"==typeof ns&&(ns=null),"undefined"==typeof parser&&(parser=null);var token;if(this._useAssetLib){var lib;lib=away.library.AssetLibraryBundle.getInstance(this._assetLibId),token=lib.load(request,context,ns,parser)}else{var loader=new AssetLoader;this._loadingSessions.push(loader),token=loader.load(request,context,ns,parser)}return token.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE,this._onResourceCompleteDelegate),token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE,this._onAssetCompleteDelegate),token._iLoader._iAddErrorHandler(this.onLoadError),token._iLoader._iAddParseErrorHandler(this.onParseError),token},Loader.prototype.loadData=function(data,context,ns,parser){"undefined"==typeof context&&(context=null),"undefined"==typeof ns&&(ns=null),"undefined"==typeof parser&&(parser=null);var token;if(this._useAssetLib){var lib;lib=away.library.AssetLibraryBundle.getInstance(this._assetLibId),token=lib.loadData(data,context,ns,parser)}else{var loader=new AssetLoader;this._loadingSessions.push(loader),token=loader.loadData(data,"",context,ns,parser)}return token.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE,this._onResourceCompleteDelegate),token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE,this._onAssetCompleteDelegate),token._iLoader._iAddErrorHandler(this.onLoadError),token._iLoader._iAddParseErrorHandler(this.onParseError),token},Loader.prototype.unload=function(){},Loader.enableParser=function(parserClass){AssetLoader.enableParser(parserClass)},Loader.enableParsers=function(parserClasses){AssetLoader.enableParsers(parserClasses)},Loader.prototype.removeListeners=function(dispatcher){dispatcher.removeEventListener(LoaderEvent.RESOURCE_COMPLETE,this._onResourceCompleteDelegate),dispatcher.removeEventListener(AssetEvent.ASSET_COMPLETE,this._onAssetCompleteDelegate)},Loader.prototype.onAssetComplete=function(event){this.dispatchEvent(event)},Loader.prototype.onLoadError=function(event){return this.hasEventListener(IOErrorEvent.IO_ERROR)?(this.dispatchEvent(event),!0):!1},Loader.prototype.onParseError=function(event){return this.hasEventListener(ParserEvent.PARSE_ERROR)?(this.dispatchEvent(event),!0):!1},Loader.prototype.onResourceComplete=function(event){var content=event.content;this._content=content,content&&this.addChild(content),this.dispatchEvent(event)},Loader}(containers.DisplayObjectContainer);containers.Loader=Loader}(away.containers||(away.containers={}));away.containers}(away||(away={}));var away;!function(away){!function(containers){var DisplayObjectContainer=away.containers.DisplayObjectContainer,SceneEvent=away.events.SceneEvent,NodeBase=away.partition.NodeBase,Partition=away.partition.Partition,Scene=function(_super){function Scene(){_super.call(this),this._expandedPartitions=new Array,this._partitions=new Array,this._iCollectionMark=0,this._iSceneGraphRoot=new DisplayObjectContainer,this._iSceneGraphRoot._iSetScene(this),this._iSceneGraphRoot._iIsRoot=!0,this._iSceneGraphRoot.partition=new Partition(new NodeBase)}return __extends(Scene,_super),Scene.prototype.traversePartitions=function(traverser){var i=0,len=this._partitions.length;for(traverser.scene=this;len>i;)this._iCollectionMark++,this._partitions[i++].traverse(traverser)},Object.defineProperty(Scene.prototype,"partition",{get:function(){return this._iSceneGraphRoot.partition},set:function(value){this._iSceneGraphRoot.partition=value,this.dispatchEvent(new SceneEvent(SceneEvent.PARTITION_CHANGED,this._iSceneGraphRoot))},enumerable:!0,configurable:!0}),Scene.prototype.contains=function(child){return this._iSceneGraphRoot.contains(child)},Scene.prototype.addChild=function(child){return this._iSceneGraphRoot.addChild(child)},Scene.prototype.removeChild=function(child){this._iSceneGraphRoot.removeChild(child)},Scene.prototype.removeChildAt=function(index){this._iSceneGraphRoot.removeChildAt(index)},Scene.prototype.getChildAt=function(index){return this._iSceneGraphRoot.getChildAt(index)},Object.defineProperty(Scene.prototype,"numChildren",{get:function(){return this._iSceneGraphRoot.numChildren},enumerable:!0,configurable:!0}),Scene.prototype.iRegisterEntity=function(displayObject){displayObject.partition&&this.iRegisterPartition(displayObject.partition),displayObject.isEntity&&displayObject._iAssignedPartition.iMarkForUpdate(displayObject)},Scene.prototype.iRegisterPartition=function(partition){this._expandedPartitions.push(partition),-1==this._partitions.indexOf(partition)&&this._partitions.push(partition)},Scene.prototype.iUnregisterEntity=function(displayObject){displayObject.partition&&this.iUnregisterPartition(displayObject.partition),displayObject.isEntity&&displayObject._iAssignedPartition.iRemoveEntity(displayObject)},Scene.prototype.iUnregisterPartition=function(partition){this._expandedPartitions.splice(this._expandedPartitions.indexOf(partition),1),-1==this._expandedPartitions.indexOf(partition)&&this._partitions.splice(this._partitions.indexOf(partition),1)},Scene}(away.events.EventDispatcher);containers.Scene=Scene}(away.containers||(away.containers={}));away.containers}(away||(away={}));var away;!function(away){!function(containers){var Scene=away.containers.Scene,Camera=away.entities.Camera,CameraEvent=away.events.CameraEvent,SceneEvent=away.events.SceneEvent,RendererEvent=away.events.RendererEvent,MouseManager=away.managers.MouseManager,RaycastPicker=away.pick.RaycastPicker,Delegate=away.utils.Delegate,View=function(){function View(renderer,scene,camera){"undefined"==typeof scene&&(scene=null),"undefined"==typeof camera&&(camera=null),this._width=0,this._height=0,this._time=0,this._deltaTime=0,this._backgroundColor=0,this._backgroundAlpha=1,this._viewportDirty=!0,this._scissorDirty=!0,this._mousePicker=new RaycastPicker,this._onScenePartitionChangedDelegate=Delegate.create(this,this.onScenePartitionChanged),this._onProjectionChangedDelegate=Delegate.create(this,this.onProjectionChanged),this._onViewportUpdatedDelegate=Delegate.create(this,this.onViewportUpdated),this._onScissorUpdatedDelegate=Delegate.create(this,this.onScissorUpdated),this.scene=scene||new Scene,this.camera=camera||new Camera,this.renderer=renderer,document.body.style.margin="0px",this._htmlElement=document.createElement("div"),this._htmlElement.style.position="absolute",document.body.appendChild(this._htmlElement),this._mouseManager=MouseManager.getInstance(),this._mouseManager.registerView(this)}return View.prototype.onScenePartitionChanged=function(){this._pCamera&&(this._pCamera.partition=this.scene.partition)},Object.defineProperty(View.prototype,"mouseX",{get:function(){return this._pMouseX},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"mouseY",{get:function(){return this._pMouseY},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"htmlElement",{get:function(){return this._htmlElement},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"renderer",{get:function(){return this._pRenderer},set:function(value){this._pRenderer!=value&&(this._pRenderer&&(this._pRenderer.dispose(),this._pRenderer.removeEventListener(RendererEvent.VIEWPORT_UPDATED,this._onViewportUpdatedDelegate),this._pRenderer.removeEventListener(RendererEvent.SCISSOR_UPDATED,this._onScissorUpdatedDelegate)),this._pRenderer=value,this._pRenderer.addEventListener(RendererEvent.VIEWPORT_UPDATED,this._onViewportUpdatedDelegate),this._pRenderer.addEventListener(RendererEvent.SCISSOR_UPDATED,this._onScissorUpdatedDelegate),this._pEntityCollector=this._pRenderer._iCreateEntityCollector(),this._pCamera&&(this._pEntityCollector.camera=this._pCamera),this._pRenderer._iBackgroundR=(this._backgroundColor>>16&255)/255,this._pRenderer._iBackgroundG=(this._backgroundColor>>8&255)/255,this._pRenderer._iBackgroundB=(255&this._backgroundColor)/255,this._pRenderer._iBackgroundAlpha=this._backgroundAlpha,this._pRenderer.width=this._width,this._pRenderer.height=this._height,this._pRenderer.shareContext=this._shareContext)},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"shareContext",{get:function(){return this._shareContext},set:function(value){this._shareContext!=value&&(this._shareContext=value,this._pRenderer&&(this._pRenderer.shareContext=this._shareContext))},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"backgroundColor",{get:function(){return this._backgroundColor},set:function(value){this._backgroundColor!=value&&(this._backgroundColor=value,this._pRenderer._iBackgroundR=(value>>16&255)/255,this._pRenderer._iBackgroundG=(value>>8&255)/255,this._pRenderer._iBackgroundB=(255&value)/255)},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"backgroundAlpha",{get:function(){return this._backgroundAlpha},set:function(value){value>1?value=1:0>value&&(value=0),this._backgroundAlpha!=value&&(this._pRenderer._iBackgroundAlpha=this._backgroundAlpha=value)},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"camera",{get:function(){return this._pCamera},set:function(value){this._pCamera!=value&&(this._pCamera&&this._pCamera.removeEventListener(CameraEvent.PROJECTION_CHANGED,this._onProjectionChangedDelegate),this._pCamera=value,this._pEntityCollector&&(this._pEntityCollector.camera=this._pCamera),this._pScene&&(this._pCamera.partition=this._pScene.partition),this._pCamera.addEventListener(CameraEvent.PROJECTION_CHANGED,this._onProjectionChangedDelegate),this._scissorDirty=!0,this._viewportDirty=!0)},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"scene",{get:function(){return this._pScene},set:function(value){this._pScene!=value&&(this._pScene&&this._pScene.removeEventListener(SceneEvent.PARTITION_CHANGED,this._onScenePartitionChangedDelegate),this._pScene=value,this._pScene.addEventListener(SceneEvent.PARTITION_CHANGED,this._onScenePartitionChangedDelegate),this._pCamera&&(this._pCamera.partition=this._pScene.partition))},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"deltaTime",{get:function(){return this._deltaTime},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"width",{get:function(){return this._width},set:function(value){this._width!=value&&(this._width=value,this._aspectRatio=this._width/this._height,this._pCamera.projection._iAspectRatio=this._aspectRatio,this._pRenderer.width=value,this._htmlElement.style.width=value+"px")},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"height",{get:function(){return this._height},set:function(value){this._height!=value&&(this._height=value,this._aspectRatio=this._width/this._height,this._pCamera.projection._iAspectRatio=this._aspectRatio,this._pRenderer.height=value,this._htmlElement.style.height=value+"px")},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"mousePicker",{get:function(){return this._mousePicker},set:function(value){this._mousePicker!=value&&(this._mousePicker=null==value?new RaycastPicker:value)},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"x",{get:function(){return this._pRenderer.x},set:function(value){this._pRenderer.x!=value&&(this._pRenderer.x==value,this._htmlElement.style.left=value+"px")},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"y",{get:function(){return this._pRenderer.y},set:function(value){this._pRenderer.y!=value&&(this._pRenderer.y==value,this._htmlElement.style.top=value+"px")},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"visible",{get:function(){return"visible"==this._htmlElement.style.visibility},set:function(value){this._htmlElement.style.visibility=value?"visible":"hidden"},enumerable:!0,configurable:!0}),Object.defineProperty(View.prototype,"renderedFacesCount",{get:function(){return 0},enumerable:!0,configurable:!0}),View.prototype.render=function(){this.pUpdateTime(),this._pCamera.projection._iAspectRatio=this._aspectRatio,this._scissorDirty&&(this._scissorDirty=!1,this._pCamera.projection._iUpdateScissorRect(this._pRenderer.scissorRect.x,this._pRenderer.scissorRect.y,this._pRenderer.scissorRect.width,this._pRenderer.scissorRect.height)),this._viewportDirty&&(this._viewportDirty=!1,this._pCamera.projection._iUpdateViewport(this._pRenderer.viewPort.x,this._pRenderer.viewPort.y,this._pRenderer.viewPort.width,this._pRenderer.viewPort.height)),this._shareContext||(this.forceMouseMove&&this._htmlElement==this._mouseManager._iActiveDiv&&!this._mouseManager._iUpdateDirty&&(this._mouseManager._iCollidingObject=this.mousePicker.getViewCollision(this._pMouseX,this._pMouseY,this)),this._mouseManager.fireMouseEvents(this.forceMouseMove)),this._pEntityCollector.clear(),this._pScene.traversePartitions(this._pEntityCollector),this._pRenderer.render(this._pEntityCollector)},View.prototype.pUpdateTime=function(){var time=away.utils.getTimer();0==this._time&&(this._time=time),this._deltaTime=time-this._time,this._time=time},View.prototype.dispose=function(){this._pRenderer.dispose(),this._mouseManager.unregisterView(this),this._mouseManager=null,this._pRenderer=null,this._pEntityCollector=null},Object.defineProperty(View.prototype,"iEntityCollector",{get:function(){return this._pEntityCollector},enumerable:!0,configurable:!0}),View.prototype.onProjectionChanged=function(){this._scissorDirty=!0,this._viewportDirty=!0},View.prototype.onViewportUpdated=function(){this._viewportDirty=!0},View.prototype.onScissorUpdated=function(){this._scissorDirty=!0},View.prototype.project=function(point3d){var v=this._pCamera.project(point3d);return v.x=v.x*this._pRenderer.viewPort.width/2+this._width*this._pCamera.projection.originX,v.y=v.y*this._pRenderer.viewPort.height/2+this._height*this._pCamera.projection.originY,v},View.prototype.unproject=function(sX,sY,sZ){return this._pCamera.unproject(2*(sX-this._width*this._pCamera.projection.originX)/this._pRenderer.viewPort.width,2*(sY-this._height*this._pCamera.projection.originY)/this._pRenderer.viewPort.height,sZ)},View.prototype.getRay=function(sX,sY,sZ){return this._pCamera.getRay((2*sX-this._width)/this._width,(2*sY-this._height)/this._height,sZ)},View.prototype.updateCollider=function(){if(this._shareContext){var collidingObject=this.mousePicker.getViewCollision(this._pMouseX,this._pMouseY,this);(this.layeredView||null==this._mouseManager._iCollidingObject||collidingObject.rayEntryDistanceval?1:val,this._steps!=val&&(this._steps=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"panAngle",{get:function(){return this._panAngle},set:function(val){val=Math.max(this._minPanAngle,Math.min(this._maxPanAngle,val)),this._panAngle!=val&&(this._panAngle=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"tiltAngle",{get:function(){return this._tiltAngle},set:function(val){val=Math.max(this._minTiltAngle,Math.min(this._maxTiltAngle,val)),this._tiltAngle!=val&&(this._tiltAngle=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"distance",{get:function(){return this._distance},set:function(val){this._distance!=val&&(this._distance=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"minPanAngle",{get:function(){return this._minPanAngle},set:function(val){this._minPanAngle!=val&&(this._minPanAngle=val,this.panAngle=Math.max(this._minPanAngle,Math.min(this._maxPanAngle,this._panAngle)))},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"maxPanAngle",{get:function(){return this._maxPanAngle},set:function(val){this._maxPanAngle!=val&&(this._maxPanAngle=val,this.panAngle=Math.max(this._minPanAngle,Math.min(this._maxPanAngle,this._panAngle)))},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"minTiltAngle",{get:function(){return this._minTiltAngle},set:function(val){this._minTiltAngle!=val&&(this._minTiltAngle=val,this.tiltAngle=Math.max(this._minTiltAngle,Math.min(this._maxTiltAngle,this._tiltAngle)))},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"maxTiltAngle",{get:function(){return this._maxTiltAngle},set:function(val){this._maxTiltAngle!=val&&(this._maxTiltAngle=val,this.tiltAngle=Math.max(this._minTiltAngle,Math.min(this._maxTiltAngle,this._tiltAngle)))},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"yFactor",{get:function(){return this._yFactor},set:function(val){this._yFactor!=val&&(this._yFactor=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(HoverController.prototype,"wrapPanAngle",{get:function(){return this._wrapPanAngle},set:function(val){this._wrapPanAngle!=val&&(this._wrapPanAngle=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),HoverController.prototype.update=function(interpolate){if("undefined"==typeof interpolate&&(interpolate=!0),this._tiltAngle!=this._iCurrentTiltAngle||this._panAngle!=this._iCurrentPanAngle){if(this.pNotifyUpdate(),this._wrapPanAngle){for(this._panAngle<0?(this._iCurrentPanAngle+=this._panAngle%360+360-this._panAngle,this._panAngle=this._panAngle%360+360):(this._iCurrentPanAngle+=this._panAngle%360-this._panAngle,this._panAngle=this._panAngle%360);this._panAngle-this._iCurrentPanAngle<-180;)this._iCurrentPanAngle-=360;for(;this._panAngle-this._iCurrentPanAngle>180;)this._iCurrentPanAngle+=360}interpolate?(this._iCurrentTiltAngle+=(this._tiltAngle-this._iCurrentTiltAngle)/(this.steps+1),this._iCurrentPanAngle+=(this._panAngle-this._iCurrentPanAngle)/(this.steps+1)):(this._iCurrentPanAngle=this._panAngle,this._iCurrentTiltAngle=this._tiltAngle),Math.abs(this.tiltAngle-this._iCurrentTiltAngle)<.01&&Math.abs(this._panAngle-this._iCurrentPanAngle)<.01&&(this._iCurrentTiltAngle=this._tiltAngle,this._iCurrentPanAngle=this._panAngle)}var pos=this.lookAtObject?this.lookAtObject.transform.position:this.lookAtPosition?this.lookAtPosition:this._pOrigin;this.targetObject.x=pos.x+this.distance*Math.sin(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS),this.targetObject.y=pos.y+this.distance*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS)*this.yFactor,this.targetObject.z=pos.z+this.distance*Math.cos(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS),this._upAxis.x=-Math.sin(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS),this._upAxis.y=Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS),this._upAxis.z=-Math.cos(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS),this._pTargetObject&&(this._pLookAtPosition?this._pTargetObject.lookAt(this._pLookAtPosition,this._upAxis):this._pLookAtObject&&this._pTargetObject.lookAt(this._pLookAtObject.scene?this._pLookAtObject.scenePosition:this._pLookAtObject.transform.position,this._upAxis)) -},HoverController}(controllers.LookAtController);controllers.HoverController=HoverController}(away.controllers||(away.controllers={}));away.controllers}(away||(away={}));var away;!function(away){!function(controllers){var FirstPersonController=function(_super){function FirstPersonController(targetObject,panAngle,tiltAngle,minTiltAngle,maxTiltAngle,steps,wrapPanAngle){"undefined"==typeof targetObject&&(targetObject=null),"undefined"==typeof panAngle&&(panAngle=0),"undefined"==typeof tiltAngle&&(tiltAngle=90),"undefined"==typeof minTiltAngle&&(minTiltAngle=-90),"undefined"==typeof maxTiltAngle&&(maxTiltAngle=90),"undefined"==typeof steps&&(steps=8),"undefined"==typeof wrapPanAngle&&(wrapPanAngle=!1),_super.call(this,targetObject),this._iCurrentPanAngle=0,this._iCurrentTiltAngle=90,this._panAngle=0,this._tiltAngle=90,this._minTiltAngle=-90,this._maxTiltAngle=90,this._steps=8,this._walkIncrement=0,this._strafeIncrement=0,this._wrapPanAngle=!1,this.fly=!1,this.panAngle=panAngle,this.tiltAngle=tiltAngle,this.minTiltAngle=minTiltAngle,this.maxTiltAngle=maxTiltAngle,this.steps=steps,this.wrapPanAngle=wrapPanAngle,this._iCurrentPanAngle=this._panAngle,this._iCurrentTiltAngle=this._tiltAngle}return __extends(FirstPersonController,_super),Object.defineProperty(FirstPersonController.prototype,"steps",{get:function(){return this._steps},set:function(val){val=1>val?1:val,this._steps!=val&&(this._steps=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(FirstPersonController.prototype,"panAngle",{get:function(){return this._panAngle},set:function(val){this._panAngle!=val&&(this._panAngle=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(FirstPersonController.prototype,"tiltAngle",{get:function(){return this._tiltAngle},set:function(val){val=Math.max(this._minTiltAngle,Math.min(this._maxTiltAngle,val)),this._tiltAngle!=val&&(this._tiltAngle=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),Object.defineProperty(FirstPersonController.prototype,"minTiltAngle",{get:function(){return this._minTiltAngle},set:function(val){this._minTiltAngle!=val&&(this._minTiltAngle=val,this.tiltAngle=Math.max(this._minTiltAngle,Math.min(this._maxTiltAngle,this._tiltAngle)))},enumerable:!0,configurable:!0}),Object.defineProperty(FirstPersonController.prototype,"maxTiltAngle",{get:function(){return this._maxTiltAngle},set:function(val){this._maxTiltAngle!=val&&(this._maxTiltAngle=val,this.tiltAngle=Math.max(this._minTiltAngle,Math.min(this._maxTiltAngle,this._tiltAngle)))},enumerable:!0,configurable:!0}),Object.defineProperty(FirstPersonController.prototype,"wrapPanAngle",{get:function(){return this._wrapPanAngle},set:function(val){this._wrapPanAngle!=val&&(this._wrapPanAngle=val,this.pNotifyUpdate())},enumerable:!0,configurable:!0}),FirstPersonController.prototype.update=function(interpolate){if("undefined"==typeof interpolate&&(interpolate=!0),this._tiltAngle!=this._iCurrentTiltAngle||this._panAngle!=this._iCurrentPanAngle){if(this.pNotifyUpdate(),this._wrapPanAngle){for(this._panAngle<0?(this._iCurrentPanAngle+=this._panAngle%360+360-this._panAngle,this._panAngle=this._panAngle%360+360):(this._iCurrentPanAngle+=this._panAngle%360-this._panAngle,this._panAngle=this._panAngle%360);this._panAngle-this._iCurrentPanAngle<-180;)this._iCurrentPanAngle-=360;for(;this._panAngle-this._iCurrentPanAngle>180;)this._iCurrentPanAngle+=360}interpolate?(this._iCurrentTiltAngle+=(this._tiltAngle-this._iCurrentTiltAngle)/(this.steps+1),this._iCurrentPanAngle+=(this._panAngle-this._iCurrentPanAngle)/(this.steps+1)):(this._iCurrentTiltAngle=this._tiltAngle,this._iCurrentPanAngle=this._panAngle),Math.abs(this.tiltAngle-this._iCurrentTiltAngle)<.01&&Math.abs(this._panAngle-this._iCurrentPanAngle)<.01&&(this._iCurrentTiltAngle=this._tiltAngle,this._iCurrentPanAngle=this._panAngle)}this.targetObject.rotationX=this._iCurrentTiltAngle,this.targetObject.rotationY=this._iCurrentPanAngle,this._walkIncrement&&(this.fly?this.targetObject.transform.moveForward(this._walkIncrement):(this.targetObject.x+=this._walkIncrement*Math.sin(this._panAngle*away.geom.MathConsts.DEGREES_TO_RADIANS),this.targetObject.z+=this._walkIncrement*Math.cos(this._panAngle*away.geom.MathConsts.DEGREES_TO_RADIANS)),this._walkIncrement=0),this._strafeIncrement&&(this.targetObject.transform.moveRight(this._strafeIncrement),this._strafeIncrement=0)},FirstPersonController.prototype.incrementWalk=function(val){0!=val&&(this._walkIncrement+=val,this.pNotifyUpdate())},FirstPersonController.prototype.incrementStrafe=function(val){0!=val&&(this._strafeIncrement+=val,this.pNotifyUpdate())},FirstPersonController}(controllers.ControllerBase);controllers.FirstPersonController=FirstPersonController}(away.controllers||(away.controllers={}));away.controllers}(away||(away={}));var away;!function(away){!function(controllers){var FollowController=function(_super){function FollowController(targetObject,lookAtObject,tiltAngle,distance){"undefined"==typeof targetObject&&(targetObject=null),"undefined"==typeof lookAtObject&&(lookAtObject=null),"undefined"==typeof tiltAngle&&(tiltAngle=45),"undefined"==typeof distance&&(distance=700),_super.call(this,targetObject,lookAtObject,0,tiltAngle,distance)}return __extends(FollowController,_super),FollowController.prototype.update=function(interpolate){"undefined"==typeof interpolate&&(interpolate=!0),interpolate=interpolate,this.lookAtObject&&(this.panAngle=this._pLookAtObject.rotationY-180,_super.prototype.update.call(this))},FollowController}(controllers.HoverController);controllers.FollowController=FollowController}(away.controllers||(away.controllers={}));away.controllers}(away||(away={}));var away;!function(away){!function(controllers){var Vector3D=away.geom.Vector3D,SpringController=function(_super){function SpringController(targetObject,lookAtObject,stiffness,mass,damping){"undefined"==typeof targetObject&&(targetObject=null),"undefined"==typeof lookAtObject&&(lookAtObject=null),"undefined"==typeof stiffness&&(stiffness=1),"undefined"==typeof mass&&(mass=40),"undefined"==typeof damping&&(damping=4),_super.call(this,targetObject,lookAtObject),this.positionOffset=new Vector3D(0,500,-1e3),this.stiffness=stiffness,this.damping=damping,this.mass=mass,this._velocity=new Vector3D,this._dv=new Vector3D,this._stretch=new Vector3D,this._force=new Vector3D,this._acceleration=new Vector3D,this._desiredPosition=new Vector3D}return __extends(SpringController,_super),SpringController.prototype.update=function(interpolate){"undefined"==typeof interpolate&&(interpolate=!0);var offs;this._pLookAtObject&&this._pTargetObject&&(offs=this._pLookAtObject.transform.matrix3D.deltaTransformVector(this.positionOffset),this._desiredPosition.x=this._pLookAtObject.x+offs.x,this._desiredPosition.y=this._pLookAtObject.y+offs.y,this._desiredPosition.z=this._pLookAtObject.z+offs.z,this._stretch=this._pTargetObject.transform.position.add(this._desiredPosition),this._stretch.scaleBy(-this.stiffness),this._dv.copyFrom(this._velocity),this._dv.scaleBy(this.damping),this._force.x=this._stretch.x-this._dv.x,this._force.y=this._stretch.y-this._dv.y,this._force.z=this._stretch.z-this._dv.z,this._acceleration.copyFrom(this._force),this._acceleration.scaleBy(1/this.mass),this._velocity.incrementBy(this._acceleration),this._pTargetObject.transform.position=this._pTargetObject.transform.position.add(this._velocity),_super.prototype.update.call(this))},SpringController}(controllers.LookAtController);controllers.SpringController=SpringController}(away.controllers||(away.controllers={}));away.controllers}(away||(away={}));var away;!function(away){!function(materials){var AssetType=away.library.AssetType,LightPickerBase=function(_super){function LightPickerBase(){_super.call(this),this._pNumPointLights=0,this._pNumDirectionalLights=0,this._pNumCastingPointLights=0,this._pNumCastingDirectionalLights=0,this._pNumLightProbes=0}return __extends(LightPickerBase,_super),LightPickerBase.prototype.dispose=function(){},Object.defineProperty(LightPickerBase.prototype,"assetType",{get:function(){return AssetType.LIGHT_PICKER},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"numDirectionalLights",{get:function(){return this._pNumDirectionalLights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"numPointLights",{get:function(){return this._pNumPointLights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"numCastingDirectionalLights",{get:function(){return this._pNumCastingDirectionalLights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"numCastingPointLights",{get:function(){return this._pNumCastingPointLights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"numLightProbes",{get:function(){return this._pNumLightProbes},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"pointLights",{get:function(){return this._pPointLights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"directionalLights",{get:function(){return this._pDirectionalLights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"castingPointLights",{get:function(){return this._pCastingPointLights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"castingDirectionalLights",{get:function(){return this._pCastingDirectionalLights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"lightProbes",{get:function(){return this._pLightProbes},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"lightProbeWeights",{get:function(){return this._pLightProbeWeights},enumerable:!0,configurable:!0}),Object.defineProperty(LightPickerBase.prototype,"allPickedLights",{get:function(){return this._pAllPickedLights},enumerable:!0,configurable:!0}),LightPickerBase.prototype.collectLights=function(renderable){this.updateProbeWeights(renderable)},LightPickerBase.prototype.updateProbeWeights=function(renderable){var lightPos,dx,dy,dz,w,i,objectPos=renderable.sourceEntity.scenePosition,rx=objectPos.x,ry=objectPos.y,rz=objectPos.z,total=0;for(i=0;i1e-5?1/w:5e7,this._pLightProbeWeights[i]=w,total+=w;for(total=1/total,i=0;ii;++i)light=value[i],light.addEventListener(LightEvent.CASTS_SHADOW_CHANGE,this._onCastShadowChangeDelegate),light instanceof PointLight?light.castsShadows?this._pCastingPointLights[numCastingPointLights++]=light:this._pPointLights[numPointLights++]=light:light instanceof DirectionalLight?light.castsShadows?this._pCastingDirectionalLights[numCastingDirectionalLights++]=light:this._pDirectionalLights[numDirectionalLights++]=light:light instanceof LightProbe&&(this._pLightProbes[numLightProbes++]=light);(this._pNumDirectionalLights!=numDirectionalLights||this._pNumPointLights!=numPointLights||this._pNumLightProbes!=numLightProbes||this._pNumCastingPointLights!=numCastingPointLights||this._pNumCastingDirectionalLights!=numCastingDirectionalLights)&&(this._pNumDirectionalLights=numDirectionalLights,this._pNumCastingDirectionalLights=numCastingDirectionalLights,this._pNumPointLights=numPointLights,this._pNumCastingPointLights=numCastingPointLights,this._pNumLightProbes=numLightProbes,this._pLightProbeWeights=new Array(4*Math.ceil(numLightProbes/4)),this.dispatchEvent(new Event(Event.CHANGE)))},enumerable:!0,configurable:!0}),StaticLightPicker.prototype.clearListeners=function(){for(var len=this._lights.length,i=0;len>i;++i)this._lights[i].removeEventListener(LightEvent.CASTS_SHADOW_CHANGE,this._onCastShadowChangeDelegate)},StaticLightPicker.prototype.onCastShadowChange=function(event){var light=event.target;light instanceof PointLight?this.updatePointCasting(light):light instanceof DirectionalLight&&this.updateDirectionalCasting(light),this.dispatchEvent(new Event(Event.CHANGE))},StaticLightPicker.prototype.updateDirectionalCasting=function(light){var dl=light;light.castsShadows?(--this._pNumDirectionalLights,++this._pNumCastingDirectionalLights,this._pDirectionalLights.splice(this._pDirectionalLights.indexOf(dl),1),this._pCastingDirectionalLights.push(light)):(++this._pNumDirectionalLights,--this._pNumCastingDirectionalLights,this._pCastingDirectionalLights.splice(this._pCastingDirectionalLights.indexOf(dl),1),this._pDirectionalLights.push(light))},StaticLightPicker.prototype.updatePointCasting=function(light){var pl=light;light.castsShadows?(--this._pNumPointLights,++this._pNumCastingPointLights,this._pPointLights.splice(this._pPointLights.indexOf(pl),1),this._pCastingPointLights.push(light)):(++this._pNumPointLights,--this._pNumCastingPointLights,this._pCastingPointLights.splice(this._pCastingPointLights.indexOf(pl),1),this._pPointLights.push(light))},StaticLightPicker}(materials.LightPickerBase);materials.StaticLightPicker=StaticLightPicker}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(){}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(materials){var LightSources=function(){function LightSources(){}return LightSources.LIGHTS=1,LightSources.PROBES=2,LightSources.ALL=3,LightSources}();materials.LightSources=LightSources}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(materials){var BlendMode=away.base.BlendMode,Event=away.events.Event,AssetType=away.library.AssetType,MaterialBase=function(_super){function MaterialBase(){var _this=this;_super.call(this),this._materialPassData=new Array,this._materialData=new Array,this._pAlphaThreshold=0,this._pAnimateUVs=!1,this._enableLightFallOff=!0,this._specularLightSources=1,this._diffuseLightSources=3,this._iMaterialId=0,this._iBaseScreenPassIndex=0,this._bothSides=!1,this._pScreenPassesInvalid=!0,this._pBlendMode=BlendMode.NORMAL,this._numPasses=0,this._mipmap=!1,this._smooth=!0,this._repeat=!1,this._color=16777215,this._pHeight=1,this._pWidth=1,this._pRequiresBlending=!1,this._iMaterialId=Number(this.id),this._owners=new Array,this._passes=new Array,this._onPassChangeDelegate=function(event){return _this.onPassChange(event)},this._onLightChangeDelegate=function(event){return _this.onLightsChange(event)},this.alphaPremultiplied=!1}return __extends(MaterialBase,_super),Object.defineProperty(MaterialBase.prototype,"assetType",{get:function(){return AssetType.MATERIAL},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"height",{get:function(){return this._pHeight},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"animationSet",{get:function(){return this._animationSet},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"lightPicker",{get:function(){return this._pLightPicker},set:function(value){this._pLightPicker!=value&&(this._pLightPicker&&this._pLightPicker.removeEventListener(Event.CHANGE,this._onLightChangeDelegate),this._pLightPicker=value,this._pLightPicker&&this._pLightPicker.addEventListener(Event.CHANGE,this._onLightChangeDelegate),this._pInvalidateScreenPasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"mipmap",{get:function(){return this._mipmap},set:function(value){this._mipmap!=value&&(this._mipmap=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"smooth",{get:function(){return this._smooth},set:function(value){this._smooth!=value&&(this._smooth=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"repeat",{get:function(){return this._repeat},set:function(value){this._repeat!=value&&(this._repeat=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"color",{get:function(){return this._color},set:function(value){this._color!=value&&(this._color=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"texture",{get:function(){return this._pTexture},set:function(value){this._pTexture!=value&&(this._pTexture=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"animateUVs",{get:function(){return this._pAnimateUVs},set:function(value){this._pAnimateUVs!=value&&(this._pAnimateUVs=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"enableLightFallOff",{get:function(){return this._enableLightFallOff},set:function(value){this._enableLightFallOff!=value&&(this._enableLightFallOff=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"diffuseLightSources",{get:function(){return this._diffuseLightSources},set:function(value){this._diffuseLightSources!=value&&(this._diffuseLightSources=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"specularLightSources",{get:function(){return this._specularLightSources},set:function(value){this._specularLightSources!=value&&(this._specularLightSources=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),MaterialBase.prototype.dispose=function(){var i,len;for(this._pClearScreenPasses(),len=this._materialData.length,i=0;len>i;i++)this._materialData[i].dispose();for(this._materialData=new Array,len=this._materialPassData.length,i=0;len>i;i++)this._materialPassData[i].dispose();this._materialPassData=new Array},Object.defineProperty(MaterialBase.prototype,"bothSides",{get:function(){return this._bothSides},set:function(value){(this._bothSides=value)||(this._bothSides=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"blendMode",{get:function(){return this._pBlendMode},set:function(value){this._pBlendMode!=value&&(this._pBlendMode=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"alphaPremultiplied",{get:function(){return this._alphaPremultiplied},set:function(value){this._alphaPremultiplied!=value&&(this._alphaPremultiplied=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"alphaThreshold",{get:function(){return this._pAlphaThreshold},set:function(value){0>value?value=0:value>1&&(value=1),this._pAlphaThreshold!=value&&(this._pAlphaThreshold=value,this._pInvalidatePasses())},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"requiresBlending",{get:function(){return this._pRequiresBlending},enumerable:!0,configurable:!0}),Object.defineProperty(MaterialBase.prototype,"width",{get:function(){return this._pWidth},enumerable:!0,configurable:!0}),MaterialBase.prototype._iActivatePass=function(pass,stage,camera){pass.materialPass._iActivate(pass,stage,camera)},MaterialBase.prototype._iDeactivatePass=function(pass,stage){pass.materialPass._iDeactivate(pass,stage)},MaterialBase.prototype._iRenderPass=function(pass,renderable,stage,camera,viewProjection){this._pLightPicker&&this._pLightPicker.collectLights(renderable),pass.materialPass._iRender(pass,renderable,stage,camera,viewProjection)},MaterialBase.prototype.iAddOwner=function(owner){this._owners.push(owner);var animationSet,animator=owner.animator;if(animator&&(animationSet=animator.animationSet),owner.animator){if(this._animationSet&&animationSet!=this._animationSet)throw new Error("A Material instance cannot be shared across material owners with different animation sets");this._animationSet!=animationSet&&(this._animationSet=animationSet,this.invalidateAnimation())}},MaterialBase.prototype.iRemoveOwner=function(owner){this._owners.splice(this._owners.indexOf(owner),1),0==this._owners.length&&(this._animationSet=null,this.invalidateAnimation())},Object.defineProperty(MaterialBase.prototype,"iOwners",{get:function(){return this._owners},enumerable:!0,configurable:!0}),MaterialBase.prototype._iNumScreenPasses=function(){return this._numPasses},Object.defineProperty(MaterialBase.prototype,"_iScreenPasses",{get:function(){return this._passes},enumerable:!0,configurable:!0}),MaterialBase.prototype._pInvalidatePasses=function(){for(var len=this._materialPassData.length,i=0;len>i;i++)this._materialPassData[i].invalidate();this.invalidateMaterial()},MaterialBase.prototype._pInvalidateScreenPasses=function(){this._pScreenPassesInvalid=!0},MaterialBase.prototype._pRemoveScreenPass=function(pass){pass.removeEventListener(Event.CHANGE,this._onPassChangeDelegate),this._passes.splice(this._passes.indexOf(pass),1),this._numPasses--},MaterialBase.prototype._pClearScreenPasses=function(){for(var i=0;ii;i++)this._materialData[i].invalidateAnimation()},MaterialBase.prototype.invalidateMaterial=function(){for(var len=this._materialData.length,i=0;len>i;i++)this._materialData[i].invalidateMaterial()},MaterialBase.prototype.onLightsChange=function(){this._pInvalidateScreenPasses()},MaterialBase.prototype._iAddMaterialPassData=function(materialPassData){return this._materialPassData.push(materialPassData),materialPassData},MaterialBase.prototype._iRemoveMaterialPassData=function(materialPassData){return this._materialPassData.splice(this._materialPassData.indexOf(materialPassData),1),materialPassData},MaterialBase}(away.library.NamedAssetBase);materials.MaterialBase=MaterialBase}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(materials){var MaterialEvent=away.events.MaterialEvent,CSSMaterialBase=function(_super){function CSSMaterialBase(texture,smooth,repeat){"undefined"==typeof texture&&(texture=null),"undefined"==typeof smooth&&(smooth=!0),"undefined"==typeof repeat&&(repeat=!1),_super.call(this),this._iMaterialId=Number(this.id),this.texture=texture,this.smooth=smooth,this.repeat=repeat}return __extends(CSSMaterialBase,_super),Object.defineProperty(CSSMaterialBase.prototype,"imageElement",{get:function(){return this._imageElement},enumerable:!0,configurable:!0}),Object.defineProperty(CSSMaterialBase.prototype,"imageStyle",{get:function(){return this._imageStyle},enumerable:!0,configurable:!0}),Object.defineProperty(CSSMaterialBase.prototype,"texture",{get:function(){return this._pTexture},set:function(value){if(this._pTexture!=value&&(this._pTexture=value,value instanceof away.textures.ImageTexture)){this._imageElement=value.htmlImageElement;var node=document.createElement("style");node.type="text/css",document.getElementsByTagName("head")[0].appendChild(node);var sheet=document.styleSheets[document.styleSheets.length-1];sheet.insertRule(".material"+this.id+"{ }",0);var style=sheet.cssRules[0].style;style.backgroundImage="url("+this._imageElement.src+")",style.backgroundSize="100% 100%",style.position="absolute",style.width=this._imageElement.width+"px",style.height=this._imageElement.height+"px",style.transformOrigin=style["-webkit-transform-origin"]=style["-moz-transform-origin"]=style["-o-transform-origin"]=style["-ms-transform-origin"]="0% 0%",this._pHeight=this._imageElement.height,this._pWidth=this._imageElement.width,this.notifySizeChanged()}},enumerable:!0,configurable:!0}),CSSMaterialBase.prototype.notifySizeChanged=function(){this._sizeChanged||(this._sizeChanged=new MaterialEvent(MaterialEvent.SIZE_CHANGED)),this.dispatchEvent(this._sizeChanged)},CSSMaterialBase}(materials.MaterialBase);materials.CSSMaterialBase=CSSMaterialBase}(away.materials||(away.materials={}));away.materials}(away||(away={}));var away;!function(away){!function(prefabs){var AbstractMethodError=away.errors.AbstractMethodError,PrefabBase=function(_super){function PrefabBase(){_super.call(this),this._pObjects=new Array}return __extends(PrefabBase,_super),PrefabBase.prototype.getNewObject=function(){var object=this._pCreateObject();return this._pObjects.push(object),object},PrefabBase.prototype._pCreateObject=function(){throw new AbstractMethodError},PrefabBase.prototype._iValidate=function(){},PrefabBase}(away.library.NamedAssetBase);prefabs.PrefabBase=PrefabBase}(away.prefabs||(away.prefabs={}));away.prefabs}(away||(away={}));var away;!function(away){!function(prefabs){var Geometry=away.base.Geometry,TriangleSubGeometry=away.base.TriangleSubGeometry,LineSubGeometry=away.base.LineSubGeometry,Mesh=away.entities.Mesh,PrimitivePrefabBase=function(_super){function PrimitivePrefabBase(material,geometryType){"undefined"==typeof material&&(material=null),"undefined"==typeof geometryType&&(geometryType="triangleSubGeometry"),_super.call(this),this._geomDirty=!0,this._uvDirty=!0,this._geometryTypeDirty=!0,this._geometry=new Geometry,this._material=material,this._geometryType=geometryType}return __extends(PrimitivePrefabBase,_super),Object.defineProperty(PrimitivePrefabBase.prototype,"assetType",{get:function(){return away.library.AssetType.PRIMITIVE_PREFAB},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitivePrefabBase.prototype,"geometryType",{get:function(){return this._geometryType},set:function(value){this._geometryType!=value&&(this._geometryType=value,this.invalidateGeometryType())},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitivePrefabBase.prototype,"geometry",{get:function(){return this._iValidate(),this._geometry},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitivePrefabBase.prototype,"material",{get:function(){return this._material},set:function(value){if(value!=this._material){this._material=value;for(var len=this._pObjects.length,i=0;len>i;i++)this._pObjects[i].material=this._material}},enumerable:!0,configurable:!0}),PrimitivePrefabBase.prototype._pBuildGeometry=function(){throw new away.errors.AbstractMethodError},PrimitivePrefabBase.prototype._pBuildUVs=function(){throw new away.errors.AbstractMethodError},PrimitivePrefabBase.prototype.invalidateGeometryType=function(){this._geometryTypeDirty=!0,this._geomDirty=!0,this._uvDirty=!0},PrimitivePrefabBase.prototype._pInvalidateGeometry=function(){this._geomDirty=!0},PrimitivePrefabBase.prototype._pInvalidateUVs=function(){this._uvDirty=!0},PrimitivePrefabBase.prototype.updateGeometryType=function(){if(this._subGeometry&&this._geometry.removeSubGeometry(this._subGeometry),"triangleSubGeometry"==this._geometryType){var triangleGeometry=new TriangleSubGeometry(!0);triangleGeometry.autoDeriveNormals=!1,triangleGeometry.autoDeriveTangents=!1,triangleGeometry.autoDeriveUVs=!1,this._geometry.addSubGeometry(triangleGeometry),this._subGeometry=triangleGeometry}else"lineSubGeometry"==this._geometryType&&this._geometry.addSubGeometry(this._subGeometry=new LineSubGeometry);this._geometryTypeDirty=!1},PrimitivePrefabBase.prototype.updateGeometry=function(){this._pBuildGeometry(this._subGeometry,this._geometryType),this._geomDirty=!1},PrimitivePrefabBase.prototype.updateUVs=function(){this._pBuildUVs(this._subGeometry,this._geometryType),this._uvDirty=!1},PrimitivePrefabBase.prototype._iValidate=function(){this._geometryTypeDirty&&this.updateGeometryType(),this._geomDirty&&this.updateGeometry(),this._uvDirty&&this.updateUVs()},PrimitivePrefabBase.prototype._pCreateObject=function(){var mesh=new Mesh(this._geometry,this._material);return mesh._iSourcePrefab=this,mesh},PrimitivePrefabBase}(prefabs.PrefabBase);prefabs.PrimitivePrefabBase=PrimitivePrefabBase}(away.prefabs||(away.prefabs={}));away.prefabs}(away||(away={}));var away;!function(away){!function(prefabs){var PrimitiveTorusPrefab=function(_super){function PrimitiveTorusPrefab(radius,tubeRadius,segmentsR,segmentsT,yUp){"undefined"==typeof radius&&(radius=50),"undefined"==typeof tubeRadius&&(tubeRadius=50),"undefined"==typeof segmentsR&&(segmentsR=16),"undefined"==typeof segmentsT&&(segmentsT=8),"undefined"==typeof yUp&&(yUp=!0),_super.call(this),this._numVertices=0,this._radius=radius,this._tubeRadius=tubeRadius,this._segmentsR=segmentsR,this._segmentsT=segmentsT,this._yUp=yUp}return __extends(PrimitiveTorusPrefab,_super),Object.defineProperty(PrimitiveTorusPrefab.prototype,"radius",{get:function(){return this._radius},set:function(value){this._radius=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveTorusPrefab.prototype,"tubeRadius",{get:function(){return this._tubeRadius},set:function(value){this._tubeRadius=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveTorusPrefab.prototype,"segmentsR",{get:function(){return this._segmentsR},set:function(value){this._segmentsR=value,this._pInvalidateGeometry(),this._pInvalidateUVs()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveTorusPrefab.prototype,"segmentsT",{get:function(){return this._segmentsT},set:function(value){this._segmentsT=value,this._pInvalidateGeometry(),this._pInvalidateUVs()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveTorusPrefab.prototype,"yUp",{get:function(){return this._yUp},set:function(value){this._yUp=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),PrimitiveTorusPrefab.prototype._pBuildGeometry=function(target,geometryType){var indices,positions,normals,tangents,i,j,x,y,z,nx,ny,nz,revolutionAngleR,revolutionAngleT,vidx,fidx,numIndices=0;if("triangleSubGeometry"==geometryType){var triangleGeometry=target;this._numVertices=(this._segmentsT+1)*(this._segmentsR+1),numIndices=this._segmentsT*this._segmentsR*6,this._numVertices==triangleGeometry.numVertices?(indices=triangleGeometry.indices,positions=triangleGeometry.positions,normals=triangleGeometry.vertexNormals,tangents=triangleGeometry.vertexTangents):(indices=new Array(numIndices),positions=new Array(3*this._numVertices),normals=new Array(3*this._numVertices),tangents=new Array(3*this._numVertices),this._pInvalidateUVs()),vidx=0,fidx=0; -var comp1,comp2,t1,t2,n1,n2,a,b,c,d,length,revolutionAngleDeltaR=2*Math.PI/this._segmentsR,revolutionAngleDeltaT=2*Math.PI/this._segmentsT,startIndex=0,nextVertexIndex=0;for(j=0;j<=this._segmentsT;++j)for(startIndex=3*nextVertexIndex,i=0;i<=this._segmentsR;++i)revolutionAngleR=i*revolutionAngleDeltaR,revolutionAngleT=j*revolutionAngleDeltaT,length=Math.cos(revolutionAngleT),nx=length*Math.cos(revolutionAngleR),ny=length*Math.sin(revolutionAngleR),nz=Math.sin(revolutionAngleT),x=this._radius*Math.cos(revolutionAngleR)+this._tubeRadius*nx,y=this._radius*Math.sin(revolutionAngleR)+this._tubeRadius*ny,z=j==this._segmentsT?0:this._tubeRadius*nz,this._yUp?(n1=-nz,n2=ny,t1=0,t2=length?nx/length:x/this._radius,comp1=-z,comp2=y):(n1=ny,n2=nz,t1=length?nx/length:x/this._radius,t2=0,comp1=y,comp2=z),i==this._segmentsR?(positions[vidx]=x,positions[vidx+1]=positions[startIndex+1],positions[vidx+2]=positions[startIndex+2]):(positions[vidx]=x,positions[vidx+1]=comp1,positions[vidx+2]=comp2),normals[vidx]=nx,normals[vidx+1]=n1,normals[vidx+2]=n2,tangents[vidx]=-(length?ny/length:y/this._radius),tangents[vidx+1]=t1,tangents[vidx+2]=t2,vidx+=3,i>0&&j>0&&(a=nextVertexIndex,b=nextVertexIndex-1,c=b-this._segmentsR-1,d=a-this._segmentsR-1,indices[fidx++]=a,indices[fidx++]=b,indices[fidx++]=c,indices[fidx++]=a,indices[fidx++]=c,indices[fidx++]=d),nextVertexIndex++;triangleGeometry.updateIndices(indices),triangleGeometry.updatePositions(positions),triangleGeometry.updateVertexNormals(normals),triangleGeometry.updateVertexTangents(tangents)}},PrimitiveTorusPrefab.prototype._pBuildUVs=function(target,geometryType){var i,j,uvs;if("triangleSubGeometry"==geometryType){var triangleGeometry=target;uvs=triangleGeometry.uvs&&this._numVertices==triangleGeometry.numVertices?triangleGeometry.uvs:new Array(2*this._numVertices);var index=0;for(j=0;j<=this._segmentsT;++j)for(i=0;i<=this._segmentsR;++i)uvs[index++]=i/this._segmentsR*triangleGeometry.scaleU,uvs[index++]=j/this._segmentsT*triangleGeometry.scaleV;triangleGeometry.updateUVs(uvs)}},PrimitiveTorusPrefab}(prefabs.PrimitivePrefabBase);prefabs.PrimitiveTorusPrefab=PrimitiveTorusPrefab}(away.prefabs||(away.prefabs={}));away.prefabs}(away||(away={}));var away;!function(away){!function(prefabs){var PrimitiveCubePrefab=function(_super){function PrimitiveCubePrefab(width,height,depth,segmentsW,segmentsH,segmentsD,tile6){"undefined"==typeof width&&(width=100),"undefined"==typeof height&&(height=100),"undefined"==typeof depth&&(depth=100),"undefined"==typeof segmentsW&&(segmentsW=1),"undefined"==typeof segmentsH&&(segmentsH=1),"undefined"==typeof segmentsD&&(segmentsD=1),"undefined"==typeof tile6&&(tile6=!0),_super.call(this),this._width=width,this._height=height,this._depth=depth,this._segmentsW=segmentsW,this._segmentsH=segmentsH,this._segmentsD=segmentsD,this._tile6=tile6}return __extends(PrimitiveCubePrefab,_super),Object.defineProperty(PrimitiveCubePrefab.prototype,"width",{get:function(){return this._width},set:function(value){this._width=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCubePrefab.prototype,"height",{get:function(){return this._height},set:function(value){this._height=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCubePrefab.prototype,"depth",{get:function(){return this._depth},set:function(value){this._depth=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCubePrefab.prototype,"tile6",{get:function(){return this._tile6},set:function(value){this._tile6=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCubePrefab.prototype,"segmentsW",{get:function(){return this._segmentsW},set:function(value){this._segmentsW=value,this._pInvalidateGeometry(),this._pInvalidateUVs()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCubePrefab.prototype,"segmentsH",{get:function(){return this._segmentsH},set:function(value){this._segmentsH=value,this._pInvalidateGeometry(),this._pInvalidateUVs()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCubePrefab.prototype,"segmentsD",{get:function(){return this._segmentsD},set:function(value){this._segmentsD=value,this._pInvalidateGeometry(),this._pInvalidateUVs()},enumerable:!0,configurable:!0}),PrimitiveCubePrefab.prototype._pBuildGeometry=function(target,geometryType){var indices,positions,normals,tangents,tl,tr,bl,br,i,j,vidx,fidx,hw,hh,hd,dw,dh,dd,outer_pos,numIndices,numVertices,inc=0;if(hw=this._width/2,hh=this._height/2,hd=this._depth/2,"triangleSubGeometry"==geometryType){var triangleGeometry=target;for(numVertices=2*((this._segmentsW+1)*(this._segmentsH+1)+(this._segmentsW+1)*(this._segmentsD+1)+(this._segmentsH+1)*(this._segmentsD+1)),numIndices=12*(this._segmentsW*this._segmentsH+this._segmentsW*this._segmentsD+this._segmentsH*this._segmentsD),numVertices==triangleGeometry.numVertices&&null!=triangleGeometry.indices?(indices=triangleGeometry.indices,positions=triangleGeometry.positions,normals=triangleGeometry.vertexNormals,tangents=triangleGeometry.vertexTangents):(indices=new Array(numIndices),positions=new Array(3*numVertices),normals=new Array(3*numVertices),tangents=new Array(3*numVertices),this._pInvalidateUVs()),vidx=0,fidx=0,dw=this._width/this._segmentsW,dh=this._height/this._segmentsH,dd=this._depth/this._segmentsD,i=0;i<=this._segmentsW;i++)for(outer_pos=-hw+i*dw,j=0;j<=this._segmentsH;j++)positions[vidx]=outer_pos,positions[vidx+1]=-hh+j*dh,positions[vidx+2]=-hd,normals[vidx]=0,normals[vidx+1]=0,normals[vidx+2]=-1,tangents[vidx]=1,tangents[vidx+1]=0,tangents[vidx+2]=0,vidx+=3,positions[vidx]=outer_pos,positions[vidx+1]=-hh+j*dh,positions[vidx+2]=hd,normals[vidx]=0,normals[vidx+1]=0,normals[vidx+2]=1,tangents[vidx]=-1,tangents[vidx+1]=0,tangents[vidx+2]=0,vidx+=3,i&&j&&(tl=2*((i-1)*(this._segmentsH+1)+(j-1)),tr=2*(i*(this._segmentsH+1)+(j-1)),bl=tl+2,br=tr+2,indices[fidx++]=tl,indices[fidx++]=bl,indices[fidx++]=br,indices[fidx++]=tl,indices[fidx++]=br,indices[fidx++]=tr,indices[fidx++]=tr+1,indices[fidx++]=br+1,indices[fidx++]=bl+1,indices[fidx++]=tr+1,indices[fidx++]=bl+1,indices[fidx++]=tl+1);for(inc+=2*(this._segmentsW+1)*(this._segmentsH+1),i=0;i<=this._segmentsW;i++)for(outer_pos=-hw+i*dw,j=0;j<=this._segmentsD;j++)positions[vidx]=outer_pos,positions[vidx+1]=hh,positions[vidx+2]=-hd+j*dd,normals[vidx]=0,normals[vidx+1]=1,normals[vidx+2]=0,tangents[vidx]=1,tangents[vidx+1]=0,tangents[vidx+2]=0,vidx+=3,positions[vidx]=outer_pos,positions[vidx+1]=-hh,positions[vidx+2]=-hd+j*dd,normals[vidx]=0,normals[vidx+1]=-1,normals[vidx+2]=0,tangents[vidx]=1,tangents[vidx+1]=0,tangents[vidx+2]=0,vidx+=3,i&&j&&(tl=inc+2*((i-1)*(this._segmentsD+1)+(j-1)),tr=inc+2*(i*(this._segmentsD+1)+(j-1)),bl=tl+2,br=tr+2,indices[fidx++]=tl,indices[fidx++]=bl,indices[fidx++]=br,indices[fidx++]=tl,indices[fidx++]=br,indices[fidx++]=tr,indices[fidx++]=tr+1,indices[fidx++]=br+1,indices[fidx++]=bl+1,indices[fidx++]=tr+1,indices[fidx++]=bl+1,indices[fidx++]=tl+1);for(inc+=2*(this._segmentsW+1)*(this._segmentsD+1),i=0;i<=this._segmentsD;i++)for(outer_pos=hd-i*dd,j=0;j<=this._segmentsH;j++)positions[vidx]=-hw,positions[vidx+1]=-hh+j*dh,positions[vidx+2]=outer_pos,normals[vidx]=-1,normals[vidx+1]=0,normals[vidx+2]=0,tangents[vidx]=0,tangents[vidx+1]=0,tangents[vidx+2]=-1,vidx+=3,positions[vidx]=hw,positions[vidx+1]=-hh+j*dh,positions[vidx+2]=outer_pos,normals[vidx]=1,normals[vidx+1]=0,normals[vidx+2]=0,tangents[vidx]=0,tangents[vidx+1]=0,tangents[vidx+2]=1,vidx+=3,i&&j&&(tl=inc+2*((i-1)*(this._segmentsH+1)+(j-1)),tr=inc+2*(i*(this._segmentsH+1)+(j-1)),bl=tl+2,br=tr+2,indices[fidx++]=tl,indices[fidx++]=bl,indices[fidx++]=br,indices[fidx++]=tl,indices[fidx++]=br,indices[fidx++]=tr,indices[fidx++]=tr+1,indices[fidx++]=br+1,indices[fidx++]=bl+1,indices[fidx++]=tr+1,indices[fidx++]=bl+1,indices[fidx++]=tl+1);triangleGeometry.updateIndices(indices),triangleGeometry.updatePositions(positions),triangleGeometry.updateVertexNormals(normals),triangleGeometry.updateVertexTangents(tangents)}else if("lineSubGeometry"==geometryType){var startPositions,endPositions,thickness,lineGeometry=target,numSegments=4*this._segmentsH+4*this._segmentsW+4*this._segmentsD;for(null!=lineGeometry.indices&&numSegments==lineGeometry.numSegments?(startPositions=lineGeometry.startPositions,endPositions=lineGeometry.endPositions,thickness=lineGeometry.thickness):(startPositions=new Array(3*numSegments),endPositions=new Array(3*numSegments),thickness=new Array(numSegments)),vidx=0,fidx=0,i=0;ii;++i)positions[i]=positions[i-3],normals[i]=-normals[i-3],tangents[i]=-tangents[i-3];vidx+=3}if(xi!=this._segmentsW&&yi!=this._segmentsH){base=xi+yi*tw;var mult=this._doubleSided?2:1;indices[fidx++]=base*mult,indices[fidx++]=(base+tw)*mult,indices[fidx++]=(base+tw+1)*mult,indices[fidx++]=base*mult,indices[fidx++]=(base+tw+1)*mult,indices[fidx++]=(base+1)*mult,this._doubleSided&&(indices[fidx++]=(base+tw+1)*mult+1,indices[fidx++]=(base+tw)*mult+1,indices[fidx++]=base*mult+1,indices[fidx++]=(base+1)*mult+1,indices[fidx++]=(base+tw+1)*mult+1,indices[fidx++]=base*mult+1)}}triangleGeometry.updateIndices(indices),triangleGeometry.updatePositions(positions),triangleGeometry.updateVertexNormals(normals),triangleGeometry.updateVertexTangents(tangents)}else if("lineSubGeometry"==geometryType){var startPositions,endPositions,thickness,lineGeometry=target,numSegments=this._segmentsH+1+tw,hw=this._width/2,hh=this._height/2;for(null!=lineGeometry.indices&&numSegments==lineGeometry.numSegments?(startPositions=lineGeometry.startPositions,endPositions=lineGeometry.endPositions,thickness=lineGeometry.thickness):(startPositions=new Array(3*numSegments),endPositions=new Array(3*numSegments),thickness=new Array(numSegments)),fidx=0,vidx=0,yi=0;yi<=this._segmentsH;++yi)startPositions[vidx]=-hw,startPositions[vidx+1]=0,startPositions[vidx+2]=yi*this._height-hh,endPositions[vidx]=hw,endPositions[vidx+1]=0,endPositions[vidx+2]=yi*this._height-hh,thickness[fidx++]=1,vidx+=3;for(xi=0;xi<=this._segmentsW;++xi)startPositions[vidx]=xi*this._width-hw,startPositions[vidx+1]=0,startPositions[vidx+2]=-hh,endPositions[vidx]=xi*this._width-hw,endPositions[vidx+1]=0,endPositions[vidx+2]=hh,thickness[fidx++]=1,vidx+=3;lineGeometry.updatePositions(startPositions,endPositions),lineGeometry.updateThickness(thickness)}},PrimitivePlanePrefab.prototype._pBuildUVs=function(target,geometryType){var uvs,numVertices;if("triangleSubGeometry"==geometryType){numVertices=(this._segmentsH+1)*(this._segmentsW+1),this._doubleSided&&(numVertices*=2);var triangleGeometry=target;triangleGeometry.uvs&&numVertices==triangleGeometry.numVertices?uvs=triangleGeometry.uvs:(uvs=new Array(2*numVertices),this._pInvalidateGeometry());for(var index=0,yi=0;yi<=this._segmentsH;++yi)for(var xi=0;xi<=this._segmentsW;++xi)uvs[index]=xi/this._segmentsW*triangleGeometry.scaleU,uvs[index+1]=(1-yi/this._segmentsH)*triangleGeometry.scaleV,index+=2,this._doubleSided&&(uvs[index]=xi/this._segmentsW*triangleGeometry.scaleU,uvs[index+1]=(1-yi/this._segmentsH)*triangleGeometry.scaleV,index+=2);triangleGeometry.updateUVs(uvs)}},PrimitivePlanePrefab}(prefabs.PrimitivePrefabBase);prefabs.PrimitivePlanePrefab=PrimitivePlanePrefab}(away.prefabs||(away.prefabs={}));away.prefabs}(away||(away={}));var away;!function(away){!function(prefabs){var PrimitiveCapsulePrefab=function(_super){function PrimitiveCapsulePrefab(radius,height,segmentsW,segmentsH,yUp){"undefined"==typeof radius&&(radius=50),"undefined"==typeof height&&(height=100),"undefined"==typeof segmentsW&&(segmentsW=16),"undefined"==typeof segmentsH&&(segmentsH=15),"undefined"==typeof yUp&&(yUp=!0),_super.call(this),this._numVertices=0,this._radius=radius,this._height=height,this._segmentsW=segmentsW,this._segmentsH=segmentsH%2==0?segmentsH+1:segmentsH,this._yUp=yUp}return __extends(PrimitiveCapsulePrefab,_super),Object.defineProperty(PrimitiveCapsulePrefab.prototype,"radius",{get:function(){return this._radius},set:function(value){this._radius=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCapsulePrefab.prototype,"height",{get:function(){return this._height},set:function(value){this._height=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCapsulePrefab.prototype,"segmentsW",{get:function(){return this._segmentsW},set:function(value){this._segmentsW=value,this._pInvalidateGeometry(),this._pInvalidateUVs()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCapsulePrefab.prototype,"segmentsH",{get:function(){return this._segmentsH},set:function(value){this._segmentsH=value%2==0?value+1:value,this._pInvalidateGeometry(),this._pInvalidateUVs()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCapsulePrefab.prototype,"yUp",{get:function(){return this._yUp},set:function(value){this._yUp=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),PrimitiveCapsulePrefab.prototype._pBuildGeometry=function(target,geometryType){var indices,positions,normals,tangents,i,j,startIndex,comp1,comp2,t1,t2,triIndex=0,index=0,numIndices=0;if("triangleSubGeometry"==geometryType){var triangleGeometry=target;for(this._numVertices=(this._segmentsH+1)*(this._segmentsW+1),numIndices=(this._segmentsH-1)*this._segmentsW*6,this._numVertices==triangleGeometry.numVertices?(indices=triangleGeometry.indices,positions=triangleGeometry.positions,normals=triangleGeometry.vertexNormals,tangents=triangleGeometry.vertexTangents):(indices=new Array(numIndices),positions=new Array(3*this._numVertices),normals=new Array(3*this._numVertices),tangents=new Array(3*this._numVertices),this._pInvalidateUVs()),j=0;j<=this._segmentsH;++j){var horangle=Math.PI*j/this._segmentsH,z=-this._radius*Math.cos(horangle),ringradius=this._radius*Math.sin(horangle);for(startIndex=index,i=0;i<=this._segmentsW;++i){var verangle=2*Math.PI*i/this._segmentsW,x=ringradius*Math.cos(verangle),offset=j>this._segmentsH/2?this._height/2:-this._height/2,y=ringradius*Math.sin(verangle),normLen=1/Math.sqrt(x*x+y*y+z*z),tanLen=Math.sqrt(y*y+x*x);if(this._yUp?(t1=0,t2=tanLen>.007?x/tanLen:0,comp1=-z,comp2=y):(t1=tanLen>.007?x/tanLen:0,t2=0,comp1=y,comp2=z),i==this._segmentsW?(positions[index]=positions[startIndex],positions[index+1]=positions[startIndex+1],positions[index+2]=positions[startIndex+2],normals[index]=.5*(normals[startIndex]+x*normLen),normals[index+1]=.5*(normals[startIndex+1]+comp1*normLen),normals[index+2]=.5*(normals[startIndex+2]+comp2*normLen),tangents[index]=.5*(tangents[startIndex]+(tanLen>.007?-y/tanLen:1)),tangents[index+1]=.5*(tangents[startIndex+1]+t1),tangents[index+2]=.5*(tangents[startIndex+2]+t2)):(positions[index]=x,positions[index+1]=this._yUp?comp1-offset:comp1,positions[index+2]=this._yUp?comp2:comp2+offset,normals[index]=x*normLen,normals[index+1]=comp1*normLen,normals[index+2]=comp2*normLen,tangents[index]=tanLen>.007?-y/tanLen:1,tangents[index+1]=t1,tangents[index+2]=t2),i>0&&j>0){var a=(this._segmentsW+1)*j+i,b=(this._segmentsW+1)*j+i-1,c=(this._segmentsW+1)*(j-1)+i-1,d=(this._segmentsW+1)*(j-1)+i;j==this._segmentsH?(positions[index]=positions[startIndex],positions[index+1]=positions[startIndex+1],positions[index+2]=positions[startIndex+2],indices[triIndex++]=a,indices[triIndex++]=c,indices[triIndex++]=d):1==j?(indices[triIndex++]=a,indices[triIndex++]=b,indices[triIndex++]=c):(indices[triIndex++]=a,indices[triIndex++]=b,indices[triIndex++]=c,indices[triIndex++]=a,indices[triIndex++]=c,indices[triIndex++]=d)}index+=3}}triangleGeometry.updateIndices(indices),triangleGeometry.updatePositions(positions),triangleGeometry.updateVertexNormals(normals),triangleGeometry.updateVertexTangents(tangents)}},PrimitiveCapsulePrefab.prototype._pBuildUVs=function(target,geometryType){var i,j,uvs;if("triangleSubGeometry"==geometryType){var triangleGeometry=target;uvs=triangleGeometry.uvs&&this._numVertices==triangleGeometry.numVertices?triangleGeometry.uvs:new Array(2*this._numVertices);var index=0;for(j=0;j<=this._segmentsH;++j)for(i=0;i<=this._segmentsW;++i)uvs[index++]=i/this._segmentsW*triangleGeometry.scaleU,uvs[index++]=j/this._segmentsH*triangleGeometry.scaleV;triangleGeometry.updateUVs(uvs)}},PrimitiveCapsulePrefab}(prefabs.PrimitivePrefabBase);prefabs.PrimitiveCapsulePrefab=PrimitiveCapsulePrefab}(away.prefabs||(away.prefabs={}));away.prefabs}(away||(away={}));var away;!function(away){!function(prefabs){var PrimitiveCylinderPrefab=function(_super){function PrimitiveCylinderPrefab(topRadius,bottomRadius,height,segmentsW,segmentsH,topClosed,bottomClosed,surfaceClosed,yUp){"undefined"==typeof topRadius&&(topRadius=50),"undefined"==typeof bottomRadius&&(bottomRadius=50),"undefined"==typeof height&&(height=100),"undefined"==typeof segmentsW&&(segmentsW=16),"undefined"==typeof segmentsH&&(segmentsH=1),"undefined"==typeof topClosed&&(topClosed=!0),"undefined"==typeof bottomClosed&&(bottomClosed=!0),"undefined"==typeof surfaceClosed&&(surfaceClosed=!0),"undefined"==typeof yUp&&(yUp=!0),_super.call(this),this._numVertices=0,this._topRadius=topRadius,this._pBottomRadius=bottomRadius,this._height=height,this._pSegmentsW=segmentsW,this._pSegmentsH=segmentsH,this._topClosed=topClosed,this._bottomClosed=bottomClosed,this._surfaceClosed=surfaceClosed,this._yUp=yUp}return __extends(PrimitiveCylinderPrefab,_super),Object.defineProperty(PrimitiveCylinderPrefab.prototype,"topRadius",{get:function(){return this._topRadius},set:function(value){this._topRadius=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCylinderPrefab.prototype,"bottomRadius",{get:function(){return this._pBottomRadius},set:function(value){this._pBottomRadius=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCylinderPrefab.prototype,"height",{get:function(){return this._height},set:function(value){this._height=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCylinderPrefab.prototype,"segmentsW",{get:function(){return this._pSegmentsW},set:function(value){this.setSegmentsW(value)},enumerable:!0,configurable:!0}),PrimitiveCylinderPrefab.prototype.setSegmentsW=function(value){this._pSegmentsW=value,this._pInvalidateGeometry(),this._pInvalidateUVs()},Object.defineProperty(PrimitiveCylinderPrefab.prototype,"segmentsH",{get:function(){return this._pSegmentsH},set:function(value){this.setSegmentsH(value)},enumerable:!0,configurable:!0}),PrimitiveCylinderPrefab.prototype.setSegmentsH=function(value){this._pSegmentsH=value,this._pInvalidateGeometry(),this._pInvalidateUVs()},Object.defineProperty(PrimitiveCylinderPrefab.prototype,"topClosed",{get:function(){return this._topClosed},set:function(value){this._topClosed=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCylinderPrefab.prototype,"bottomClosed",{get:function(){return this._bottomClosed},set:function(value){this._bottomClosed=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),Object.defineProperty(PrimitiveCylinderPrefab.prototype,"yUp",{get:function(){return this._yUp},set:function(value){this._yUp=value,this._pInvalidateGeometry()},enumerable:!0,configurable:!0}),PrimitiveCylinderPrefab.prototype._pBuildGeometry=function(target,geometryType){var indices,positions,normals,tangents,i,j,x,y,z,vidx,fidx,radius,revolutionAngle,dr,latNormElev,latNormBase,comp1,comp2,t1,t2,numIndices=0,startIndex=0,nextVertexIndex=0;this._numVertices=0;var revolutionAngleDelta=2*Math.PI/this._pSegmentsW;if("triangleSubGeometry"==geometryType){var triangleGeometry=target;if(this._surfaceClosed&&(this._numVertices+=(this._pSegmentsH+1)*(this._pSegmentsW+1),numIndices+=this._pSegmentsH*this._pSegmentsW*6),this._topClosed&&(this._numVertices+=2*(this._pSegmentsW+1),numIndices+=3*this._pSegmentsW),this._bottomClosed&&(this._numVertices+=2*(this._pSegmentsW+1),numIndices+=3*this._pSegmentsW),this._numVertices==triangleGeometry.numVertices?(indices=triangleGeometry.indices,positions=triangleGeometry.positions,normals=triangleGeometry.vertexNormals,tangents=triangleGeometry.vertexTangents):(indices=new Array(numIndices),positions=new Array(3*this._numVertices),normals=new Array(3*this._numVertices),tangents=new Array(3*this._numVertices),this._pInvalidateUVs()),vidx=0,fidx=0,this._topClosed&&this._topRadius>0){for(z=-.5*this._height,i=0;i<=this._pSegmentsW;++i)this._yUp?(t1=1,t2=0,comp1=-z,comp2=0):(t1=0,t2=-1,comp1=0,comp2=z),positions[vidx]=0,positions[vidx+1]=comp1,positions[vidx+2]=comp2,normals[vidx]=0,normals[vidx+1]=t1,normals[vidx+2]=t2,tangents[vidx]=1,tangents[vidx+1]=0,tangents[vidx+2]=0,vidx+=3,revolutionAngle=i*revolutionAngleDelta,x=this._topRadius*Math.cos(revolutionAngle),y=this._topRadius*Math.sin(revolutionAngle),this._yUp?(comp1=-z,comp2=y):(comp1=y,comp2=z),i==this._pSegmentsW?(positions[vidx]=positions[startIndex+3],positions[vidx+1]=positions[startIndex+4],positions[vidx+2]=positions[startIndex+5]):(positions[vidx]=x,positions[vidx+1]=comp1,positions[vidx+2]=comp2),normals[vidx]=0,normals[vidx+1]=t1,normals[vidx+2]=t2,tangents[vidx]=1,tangents[vidx+1]=0,tangents[vidx+2]=0,vidx+=3,i>0&&(indices[fidx++]=nextVertexIndex,indices[fidx++]=nextVertexIndex+1,indices[fidx++]=nextVertexIndex+2,nextVertexIndex+=2);nextVertexIndex+=2}if(this._bottomClosed&&this._pBottomRadius>0){for(z=.5*this._height,startIndex=3*nextVertexIndex,i=0;i<=this._pSegmentsW;++i)this._yUp?(t1=-1,t2=0,comp1=-z,comp2=0):(t1=0,t2=1,comp1=0,comp2=z),positions[vidx]=0,positions[vidx+1]=comp1,positions[vidx+2]=comp2,normals[vidx]=0,normals[vidx+1]=t1,normals[vidx+2]=t2,tangents[vidx]=1,tangents[vidx+1]=0,tangents[vidx+2]=0,vidx+=3,revolutionAngle=i*revolutionAngleDelta,x=this._pBottomRadius*Math.cos(revolutionAngle),y=this._pBottomRadius*Math.sin(revolutionAngle),this._yUp?(comp1=-z,comp2=y):(comp1=y,comp2=z),i==this._pSegmentsW?(positions[vidx]=positions[startIndex+3],positions[vidx+1]=positions[startIndex+4],positions[vidx+2]=positions[startIndex+5]):(positions[vidx]=x,positions[vidx+1]=comp1,positions[vidx+2]=comp2),normals[vidx]=0,normals[vidx+1]=t1,normals[vidx+2]=t2,tangents[vidx]=1,tangents[vidx+1]=0,tangents[vidx+2]=0,vidx+=3,i>0&&(indices[fidx++]=nextVertexIndex,indices[fidx++]=nextVertexIndex+2,indices[fidx++]=nextVertexIndex+1,nextVertexIndex+=2);nextVertexIndex+=2}if(dr=this._pBottomRadius-this._topRadius,latNormElev=dr/this._height,latNormBase=0==latNormElev?1:this._height/dr,this._surfaceClosed){var a,b,c,d,na0,na1,naComp1,naComp2;for(j=0;j<=this._pSegmentsH;++j)for(radius=this._topRadius-j/this._pSegmentsH*(this._topRadius-this._pBottomRadius),z=-(this._height/2)+j/this._pSegmentsH*this._height,startIndex=3*nextVertexIndex,i=0;i<=this._pSegmentsW;++i)revolutionAngle=i*revolutionAngleDelta,x=radius*Math.cos(revolutionAngle),y=radius*Math.sin(revolutionAngle),na0=latNormBase*Math.cos(revolutionAngle),na1=latNormBase*Math.sin(revolutionAngle),this._yUp?(t1=0,t2=-na0,comp1=-z,comp2=y,naComp1=latNormElev,naComp2=na1):(t1=-na0,t2=0,comp1=y,comp2=z,naComp1=na1,naComp2=latNormElev),i==this._pSegmentsW?(positions[vidx]=positions[startIndex],positions[vidx+1]=positions[startIndex+1],positions[vidx+2]=positions[startIndex+2],normals[vidx]=na0,normals[vidx+1]=latNormElev,normals[vidx+2]=na1,tangents[vidx]=na1,tangents[vidx+1]=t1,tangents[vidx+2]=t2):(positions[vidx]=x,positions[vidx+1]=comp1,positions[vidx+2]=comp2,normals[vidx]=na0,normals[vidx+1]=naComp1,normals[vidx+2]=naComp2,tangents[vidx]=-na1,tangents[vidx+1]=t1,tangents[vidx+2]=t2),vidx+=3,i>0&&j>0&&(a=nextVertexIndex,b=nextVertexIndex-1,c=b-this._pSegmentsW-1,d=a-this._pSegmentsW-1,indices[fidx++]=a,indices[fidx++]=b,indices[fidx++]=c,indices[fidx++]=a,indices[fidx++]=c,indices[fidx++]=d),nextVertexIndex++ -}triangleGeometry.updateIndices(indices),triangleGeometry.updatePositions(positions),triangleGeometry.updateVertexNormals(normals),triangleGeometry.updateVertexTangents(tangents)}else if("lineSubGeometry"==geometryType){var startPositions,endPositions,thickness,lineGeometry=target,numSegments=(this._pSegmentsH+1)*this._pSegmentsW+this._pSegmentsW;for(null!=lineGeometry.indices&&numSegments==lineGeometry.numSegments?(startPositions=lineGeometry.startPositions,endPositions=lineGeometry.endPositions,thickness=lineGeometry.thickness):(startPositions=new Array(3*numSegments),endPositions=new Array(3*numSegments),thickness=new Array(numSegments)),vidx=0,fidx=0,j=0;j<=this._pSegmentsH;++j)for(radius=this._topRadius-j/this._pSegmentsH*(this._topRadius-this._pBottomRadius),z=this._height*(j/this._pSegmentsH-.5),i=0;i<=this._pSegmentsW;++i)revolutionAngle=i*revolutionAngleDelta,x=radius*Math.cos(revolutionAngle),y=radius*Math.sin(revolutionAngle),this._yUp?(comp1=-z,comp2=y):(comp1=y,comp2=z),i>0&&(endPositions[vidx]=x,endPositions[vidx+1]=comp1,endPositions[vidx+2]=comp2,thickness[fidx++]=1,vidx+=3,startPositions[vidx]=endPositions[vidx-6*this._pSegmentsW],startPositions[vidx+1]=endPositions[vidx+1-6*this._pSegmentsW],startPositions[vidx+2]=endPositions[vidx+2-6*this._pSegmentsW],endPositions[vidx]=x,endPositions[vidx+1]=comp1,endPositions[vidx+2]=comp2,thickness[fidx++]=1,vidx+=3),i.007?x/tanLen:0,comp1=-z,comp2=y):(t1=tanLen>.007?x/tanLen:0,t2=0,comp1=y,comp2=z),i==this._segmentsW?(positions[vidx]=positions[startIndex],positions[vidx+1]=positions[startIndex+1],positions[vidx+2]=positions[startIndex+2],normals[vidx]=normals[startIndex]+x*normLen*.5,normals[vidx+1]=normals[startIndex+1]+comp1*normLen*.5,normals[vidx+2]=normals[startIndex+2]+comp2*normLen*.5,tangents[vidx]=tanLen>.007?-y/tanLen:1,tangents[vidx+1]=t1,tangents[vidx+2]=t2):(positions[vidx]=x,positions[vidx+1]=comp1,positions[vidx+2]=comp2,normals[vidx]=x*normLen,normals[vidx+1]=comp1*normLen,normals[vidx+2]=comp2*normLen,tangents[vidx]=tanLen>.007?-y/tanLen:1,tangents[vidx+1]=t1,tangents[vidx+2]=t2),i>0&&j>0){var a=(this._segmentsW+1)*j+i,b=(this._segmentsW+1)*j+i-1,c=(this._segmentsW+1)*(j-1)+i-1,d=(this._segmentsW+1)*(j-1)+i;j==this._segmentsH?(positions[vidx]=positions[startIndex],positions[vidx+1]=positions[startIndex+1],positions[vidx+2]=positions[startIndex+2],indices[fidx++]=a,indices[fidx++]=c,indices[fidx++]=d):1==j?(indices[fidx++]=a,indices[fidx++]=b,indices[fidx++]=c):(indices[fidx++]=a,indices[fidx++]=b,indices[fidx++]=c,indices[fidx++]=a,indices[fidx++]=c,indices[fidx++]=d)}vidx+=3}}triangleGeometry.updateIndices(indices),triangleGeometry.updatePositions(positions),triangleGeometry.updateVertexNormals(normals),triangleGeometry.updateVertexTangents(tangents)}else if("lineSubGeometry"==geometryType){var startPositions,endPositions,thickness,lineGeometry=target,numSegments=(this._segmentsH-1)*this._segmentsW*2;for(null!=lineGeometry.indices&&numSegments==lineGeometry.numSegments?(startPositions=lineGeometry.startPositions,endPositions=lineGeometry.endPositions,thickness=lineGeometry.thickness):(startPositions=new Array(3*numSegments),endPositions=new Array(3*numSegments),thickness=new Array(numSegments)),vidx=0,fidx=0,j=0;j<=this._segmentsH;++j){var horangle=Math.PI*j/this._segmentsH,z=-this._radius*Math.cos(horangle),ringradius=this._radius*Math.sin(horangle);for(i=0;i<=this._segmentsW;++i){var verangle=2*Math.PI*i/this._segmentsW,x=ringradius*Math.cos(verangle),y=ringradius*Math.sin(verangle);this._yUp?(comp1=-z,comp2=y):(comp1=y,comp2=z),i>0&&j>0&&(j0&&jAnimationSetBase. + * + * @see away.animators.IAnimationSet + */ +interface IAnimator extends IAsset +{ + /** + * + */ + animationSet:IAnimationSet; + + /** + * + */ + clone():IAnimator; + + /** + * + */ + dispose(); + + /** + * Used by the entity object to which the animator is applied, registers the owner for internal use. + * + * @private + */ + addOwner(mesh:IEntity); + + /** + * Used by the mesh object from which the animator is removed, unregisters the owner for internal use. + * + * @private + */ + removeOwner(mesh:IEntity); + + /** + * //TODO + * + * @param sourceSubGeometry + */ + getRenderableSubGeometry(renderable:IRenderable, sourceSubGeometry:SubGeometryBase):SubGeometryBase; +} + +export = IAnimator; \ No newline at end of file diff --git a/lib/animators/nodes/AnimationNodeBase.js b/lib/animators/nodes/AnimationNodeBase.js new file mode 100755 index 00000000..4fe8bc63 --- /dev/null +++ b/lib/animators/nodes/AnimationNodeBase.js @@ -0,0 +1,51 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +/** +* Provides an abstract base class for nodes in an animation blend tree. +*/ +var AnimationNodeBase = (function (_super) { + __extends(AnimationNodeBase, _super); + /** + * Creates a new AnimationNodeBase object. + */ + function AnimationNodeBase() { + _super.call(this); + } + Object.defineProperty(AnimationNodeBase.prototype, "stateClass", { + get: function () { + return this._pStateClass; + }, + enumerable: true, + configurable: true + }); + + /** + * @inheritDoc + */ + AnimationNodeBase.prototype.dispose = function () { + }; + + Object.defineProperty(AnimationNodeBase.prototype, "assetType", { + /** + * @inheritDoc + */ + get: function () { + return AssetType.ANIMATION_NODE; + }, + enumerable: true, + configurable: true + }); + return AnimationNodeBase; +})(NamedAssetBase); + +module.exports = AnimationNodeBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFuaW1hdG9ycy9ub2Rlcy9BbmltYXRpb25Ob2RlQmFzZS50cyJdLCJuYW1lcyI6WyJBbmltYXRpb25Ob2RlQmFzZSIsIkFuaW1hdGlvbk5vZGVCYXNlLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uTm9kZUJhc2UuZGlzcG9zZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUVBQXdFOztBQUV4RSwyRUFBaUY7O0FBRWpGOztFQUVHO0FBQ0g7SUFBZ0NBLG9DQUFjQTtJQVk3Q0E7O01BREdBO0lBQ0hBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBO0lBQ1JBLENBQUNBO0lBWEREO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBO1FBQ3pCQSxDQUFDQTs7OztBQUFBQTtJQWFEQTs7TUFER0E7MENBQ0hBO0lBRUFFLENBQUNBOztJQUtERjtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsU0FBU0EsQ0FBQ0EsY0FBY0E7UUFDaENBLENBQUNBOzs7O0FBQUFBLElBQ0ZBLHlCQUFDQTtBQUFEQSxDQUFDQSxFQS9CK0IsY0FBYyxFQStCN0M7O0FBRUQsa0NBQTJCLENBQUEiLCJmaWxlIjoiYW5pbWF0b3JzL25vZGVzL0FuaW1hdGlvbk5vZGVCYXNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFzc2V0VHlwZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldFR5cGVcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IE5hbWVkQXNzZXRCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9OYW1lZEFzc2V0QmFzZVwiKTtcblxuLyoqXG4gKiBQcm92aWRlcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBub2RlcyBpbiBhbiBhbmltYXRpb24gYmxlbmQgdHJlZS5cbiAqL1xuY2xhc3MgQW5pbWF0aW9uTm9kZUJhc2UgZXh0ZW5kcyBOYW1lZEFzc2V0QmFzZSBpbXBsZW1lbnRzIElBc3NldFxue1xuXHRwdWJsaWMgX3BTdGF0ZUNsYXNzOmFueTtcblxuXHRwdWJsaWMgZ2V0IHN0YXRlQ2xhc3MoKTphbnlcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wU3RhdGVDbGFzcztcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFuaW1hdGlvbk5vZGVCYXNlPC9jb2RlPiBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIGdldCBhc3NldFR5cGUoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBBc3NldFR5cGUuQU5JTUFUSU9OX05PREU7XG5cdH1cbn1cblxuZXhwb3J0ID0gQW5pbWF0aW9uTm9kZUJhc2U7Il19 \ No newline at end of file diff --git a/lib/animators/nodes/AnimationNodeBase.ts b/lib/animators/nodes/AnimationNodeBase.ts new file mode 100644 index 00000000..bee7b65f --- /dev/null +++ b/lib/animators/nodes/AnimationNodeBase.ts @@ -0,0 +1,41 @@ +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +/** + * Provides an abstract base class for nodes in an animation blend tree. + */ +class AnimationNodeBase extends NamedAssetBase implements IAsset +{ + public _pStateClass:any; + + public get stateClass():any + { + return this._pStateClass; + } + + /** + * Creates a new AnimationNodeBase object. + */ + constructor() + { + super(); + } + + /** + * @inheritDoc + */ + public dispose() + { + } + + /** + * @inheritDoc + */ + public get assetType():string + { + return AssetType.ANIMATION_NODE; + } +} + +export = AnimationNodeBase; \ No newline at end of file diff --git a/lib/bounds/AxisAlignedBoundingBox.js b/lib/bounds/AxisAlignedBoundingBox.js new file mode 100755 index 00000000..4af73eba --- /dev/null +++ b/lib/bounds/AxisAlignedBoundingBox.js @@ -0,0 +1,342 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +var PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* AxisAlignedBoundingBox represents a bounding box volume that has its planes aligned to the local coordinate axes of the bounded object. +* This is useful for most meshes. +*/ +var AxisAlignedBoundingBox = (function (_super) { + __extends(AxisAlignedBoundingBox, _super); + /** + * Creates a new AxisAlignedBoundingBox object. + */ + function AxisAlignedBoundingBox() { + _super.call(this); + this._centerX = 0; + this._centerY = 0; + this._centerZ = 0; + this._halfExtentsX = 0; + this._halfExtentsY = 0; + this._halfExtentsZ = 0; + } + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.nullify = function () { + _super.prototype.nullify.call(this); + + this._centerX = this._centerY = this._centerZ = 0; + this._halfExtentsX = this._halfExtentsY = this._halfExtentsZ = 0; + }; + + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.isInFrustum = function (planes, numPlanes) { + for (var i = 0; i < numPlanes; ++i) { + var plane = planes[i]; + var a = plane.a; + var b = plane.b; + var c = plane.c; + var flippedExtentX = a < 0 ? -this._halfExtentsX : this._halfExtentsX; + var flippedExtentY = b < 0 ? -this._halfExtentsY : this._halfExtentsY; + var flippedExtentZ = c < 0 ? -this._halfExtentsZ : this._halfExtentsZ; + var projDist = a * (this._centerX + flippedExtentX) + b * (this._centerY + flippedExtentY) + c * (this._centerZ + flippedExtentZ) - plane.d; + + if (projDist < 0) + return false; + } + + return true; + }; + + AxisAlignedBoundingBox.prototype.rayIntersection = function (position, direction, targetNormal) { + if (this.containsPoint(position)) + return 0; + + var px = position.x - this._centerX; + var py = position.y - this._centerY; + var pz = position.z - this._centerZ; + + var vx = direction.x; + var vy = direction.y; + var vz = direction.z; + + var ix; + var iy; + var iz; + var rayEntryDistance; + + // ray-plane tests + var intersects; + if (vx < 0) { + rayEntryDistance = (this._halfExtentsX - px) / vx; + if (rayEntryDistance > 0) { + iy = py + rayEntryDistance * vy; + iz = pz + rayEntryDistance * vz; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 1; + targetNormal.y = 0; + targetNormal.z = 0; + + intersects = true; + } + } + } + if (!intersects && vx > 0) { + rayEntryDistance = (-this._halfExtentsX - px) / vx; + if (rayEntryDistance > 0) { + iy = py + rayEntryDistance * vy; + iz = pz + rayEntryDistance * vz; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = -1; + targetNormal.y = 0; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vy < 0) { + rayEntryDistance = (this._halfExtentsY - py) / vy; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance * vx; + iz = pz + rayEntryDistance * vz; + if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 0; + targetNormal.y = 1; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vy > 0) { + rayEntryDistance = (-this._halfExtentsY - py) / vy; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance * vx; + iz = pz + rayEntryDistance * vz; + if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 0; + targetNormal.y = -1; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vz < 0) { + rayEntryDistance = (this._halfExtentsZ - pz) / vz; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance * vx; + iy = py + rayEntryDistance * vy; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { + targetNormal.x = 0; + targetNormal.y = 0; + targetNormal.z = 1; + intersects = true; + } + } + } + if (!intersects && vz > 0) { + rayEntryDistance = (-this._halfExtentsZ - pz) / vz; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance * vx; + iy = py + rayEntryDistance * vy; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { + targetNormal.x = 0; + targetNormal.y = 0; + targetNormal.z = -1; + intersects = true; + } + } + } + + return intersects ? rayEntryDistance : -1; + }; + + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.containsPoint = function (position) { + var px = position.x - this._centerX, py = position.y - this._centerY, pz = position.z - this._centerZ; + return px <= this._halfExtentsX && px >= -this._halfExtentsX && py <= this._halfExtentsY && py >= -this._halfExtentsY && pz <= this._halfExtentsZ && pz >= -this._halfExtentsZ; + }; + + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { + this._centerX = (maxX + minX) * .5; + this._centerY = (maxY + minY) * .5; + this._centerZ = (maxZ + minZ) * .5; + this._halfExtentsX = (maxX - minX) * .5; + this._halfExtentsY = (maxY - minY) * .5; + this._halfExtentsZ = (maxZ - minZ) * .5; + + _super.prototype.fromExtremes.call(this, minX, minY, minZ, maxX, maxY, maxZ); + }; + + /** + * @inheritDoc + */ + AxisAlignedBoundingBox.prototype.clone = function () { + var clone = new AxisAlignedBoundingBox(); + clone.fromExtremes(this._aabb.x, this._aabb.y + this._aabb.height, this._aabb.z, this._aabb.x + this._aabb.width, this._aabb.y, this._aabb.z + this._aabb.depth); + return clone; + }; + + Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsX", { + get: function () { + return this._halfExtentsX; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsY", { + get: function () { + return this._halfExtentsY; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(AxisAlignedBoundingBox.prototype, "halfExtentsZ", { + get: function () { + return this._halfExtentsZ; + }, + enumerable: true, + configurable: true + }); + + /** + * Finds the closest point on the bounding volume to another given point. This can be used for maximum error calculations for content within a given bound. + * @param point The point for which to find the closest point on the bounding volume + * @param target An optional Vector3D to store the result to prevent creating a new object. + * @return + */ + AxisAlignedBoundingBox.prototype.closestPointToPoint = function (point, target) { + if (typeof target === "undefined") { target = null; } + var p; + + if (target == null) + target = new Vector3D(); + + p = point.x; + if (p < this._aabb.x) + p = this._aabb.x; + if (p > this._aabb.x + this._aabb.width) + p = this._aabb.x + this._aabb.width; + target.x = p; + + p = point.y; + if (p < this._aabb.y + this._aabb.height) + p = this._aabb.y + this._aabb.height; + if (p > this._aabb.y) + p = this._aabb.y; + target.y = p; + + p = point.z; + if (p < this._aabb.z) + p = this._aabb.z; + if (p > this._aabb.z + this._aabb.depth) + p = this._aabb.z + this._aabb.depth; + target.z = p; + + return target; + }; + + AxisAlignedBoundingBox.prototype.pUpdateBoundingRenderable = function () { + this._pBoundingEntity.transform.scale.x = Math.max(this._halfExtentsX * 2, 0.001); + this._pBoundingEntity.transform.scale.y = Math.max(this._halfExtentsY * 2, 0.001); + this._pBoundingEntity.transform.scale.z = Math.max(this._halfExtentsZ * 2, 0.001); + this._pBoundingEntity.transform.position.x = this._centerX; + this._pBoundingEntity.transform.position.y = this._centerY; + this._pBoundingEntity.transform.position.z = this._centerZ; + }; + + AxisAlignedBoundingBox.prototype.pCreateBoundingEntity = function () { + return null; + }; + + AxisAlignedBoundingBox.prototype.classifyToPlane = function (plane) { + var a = plane.a; + var b = plane.b; + var c = plane.c; + var centerDistance = a * this._centerX + b * this._centerY + c * this._centerZ - plane.d; + + if (a < 0) + a = -a; + + if (b < 0) + b = -b; + + if (c < 0) + c = -c; + + var boundOffset = a * this._halfExtentsX + b * this._halfExtentsY + c * this._halfExtentsZ; + + return centerDistance > boundOffset ? PlaneClassification.FRONT : centerDistance < -boundOffset ? PlaneClassification.BACK : PlaneClassification.INTERSECT; + }; + + AxisAlignedBoundingBox.prototype.transformFrom = function (bounds, matrix) { + var aabb = bounds; + var cx = aabb._centerX; + var cy = aabb._centerY; + var cz = aabb._centerZ; + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + + matrix.copyRawDataTo(raw); + + var m11 = raw[0], m12 = raw[4], m13 = raw[8], m14 = raw[12]; + var m21 = raw[1], m22 = raw[5], m23 = raw[9], m24 = raw[13]; + var m31 = raw[2], m32 = raw[6], m33 = raw[10], m34 = raw[14]; + + this._centerX = cx * m11 + cy * m12 + cz * m13 + m14; + this._centerY = cx * m21 + cy * m22 + cz * m23 + m24; + this._centerZ = cx * m31 + cy * m32 + cz * m33 + m34; + + if (m11 < 0) + m11 = -m11; + if (m12 < 0) + m12 = -m12; + if (m13 < 0) + m13 = -m13; + if (m21 < 0) + m21 = -m21; + if (m22 < 0) + m22 = -m22; + if (m23 < 0) + m23 = -m23; + if (m31 < 0) + m31 = -m31; + if (m32 < 0) + m32 = -m32; + if (m33 < 0) + m33 = -m33; + var hx = aabb._halfExtentsX; + var hy = aabb._halfExtentsY; + var hz = aabb._halfExtentsZ; + this._halfExtentsX = hx * m11 + hy * m12 + hz * m13; + this._halfExtentsY = hx * m21 + hy * m22 + hz * m23; + this._halfExtentsZ = hx * m31 + hy * m32 + hz * m33; + + this._aabb.width = this._aabb.height = this._aabb.depth = this._halfExtentsX * 2; + this._aabb.x = this._centerX - this._halfExtentsX; + this._aabb.y = this._centerY + this._halfExtentsY; + this._aabb.z = this._centerZ - this._halfExtentsZ; + }; + return AxisAlignedBoundingBox; +})(BoundingVolumeBase); + +module.exports = AxisAlignedBoundingBox; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvdW5kcy9BeGlzQWxpZ25lZEJvdW5kaW5nQm94LnRzIl0sIm5hbWVzIjpbIkF4aXNBbGlnbmVkQm91bmRpbmdCb3giLCJBeGlzQWxpZ25lZEJvdW5kaW5nQm94LmNvbnN0cnVjdG9yIiwiQXhpc0FsaWduZWRCb3VuZGluZ0JveC5udWxsaWZ5IiwiQXhpc0FsaWduZWRCb3VuZGluZ0JveC5pc0luRnJ1c3R1bSIsIkF4aXNBbGlnbmVkQm91bmRpbmdCb3gucmF5SW50ZXJzZWN0aW9uIiwiQXhpc0FsaWduZWRCb3VuZGluZ0JveC5jb250YWluc1BvaW50IiwiQXhpc0FsaWduZWRCb3VuZGluZ0JveC5mcm9tRXh0cmVtZXMiLCJBeGlzQWxpZ25lZEJvdW5kaW5nQm94LmNsb25lIiwiQXhpc0FsaWduZWRCb3VuZGluZ0JveC5jbG9zZXN0UG9pbnRUb1BvaW50IiwiQXhpc0FsaWduZWRCb3VuZGluZ0JveC5wVXBkYXRlQm91bmRpbmdSZW5kZXJhYmxlIiwiQXhpc0FsaWduZWRCb3VuZGluZ0JveC5wQ3JlYXRlQm91bmRpbmdFbnRpdHkiLCJBeGlzQWxpZ25lZEJvdW5kaW5nQm94LmNsYXNzaWZ5VG9QbGFuZSIsIkF4aXNBbGlnbmVkQm91bmRpbmdCb3gudHJhbnNmb3JtRnJvbSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNkVBQW1GOztBQUVuRixzRUFBNkU7QUFDN0Usa0ZBQXdGOztBQUV4Riw0REFBcUU7O0FBR3JFOzs7RUFHRztBQUNIO0lBQXFDQSx5Q0FBa0JBO0lBWXREQTs7TUFER0E7SUFDSEE7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFaUkEsS0FBUUEsUUFBUUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLEtBQVFBLFFBQVFBLEdBQVVBLENBQUNBLENBQUNBO1FBQzVCQSxLQUFRQSxRQUFRQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUM1QkEsS0FBUUEsYUFBYUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDakNBLEtBQVFBLGFBQWFBLEdBQVVBLENBQUNB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Q0FBQ0EsQ0FBQ0E7WUFDbkJBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO1FBQ2xCQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFWkEsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDWEEsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO1FBQ2xCQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQTtZQUN0Q0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFDckNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLENBQUNBOztRQUVaQSxPQUFPQSxNQUFNQTtJQUNkQSxDQUFDQTs7SUFFRFIsNkRBQUFBO1FBRUNTLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBQ0EsQ0FBQ0EsRUFBRUEsS0FBS0EsQ0FBQ0E7UUFDL0VBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBQ0EsQ0FBQ0EsRUFBRUEsS0FBS0EsQ0FBQ0E7UUFDL0VBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBQ0EsQ0FBQ0EsRUFBRUEsS0FBS0EsQ0FBQ0E7UUFDL0VBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDMURBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDMURBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUE7SUFDM0RBLENBQUNBOztJQUVEVCx5REFBQUE7UUFFQ1UsT0FBT0EsSUFBSUE7SUFDWkEsQ0FBQ0E7O0lBRURWLG1EQUFBQSxVQUF1QkEsS0FBYUE7UUFFbkNXLElBQUlBLENBQUNBLEdBQVVBLEtBQUtBLENBQUNBLENBQUNBO1FBQ3RCQSxJQUFJQSxDQUFDQSxHQUFVQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUN0QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDdEJBLElBQUlBLGNBQWNBLEdBQVVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBOztRQUV6RkEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDUkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRVJBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBO1lBQ1JBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBOztRQUVSQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNSQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFUkEsSUFBSUEsV0FBV0EsR0FBVUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUE7O1FBRTNGQSxPQUFPQSxjQUFjQSxHQUFHQSxXQUFXQSxHQUFFQSxtQkFBbUJBLENBQUNBLEtBQUtBLEdBQUdBLGNBQWNBLEdBQUdBLENBQUNBLFdBQVdBLEdBQUVBLG1CQUFtQkEsQ0FBQ0EsSUFBSUEsR0FBR0EsbUJBQW1CQSxDQUFDQSxTQUFTQTtJQUN6SkEsQ0FBQ0E7O0lBRURYLGlEQUFBQSxVQUFxQkEsTUFBeUJBLEVBQUVBLE1BQWVBO1FBRTlEWSxJQUFJQSxJQUFJQSxHQUFtREEsTUFBTUE7UUFDakVBLElBQUlBLEVBQUVBLEdBQVVBLElBQUlBLENBQUNBLFFBQVFBO1FBQzdCQSxJQUFJQSxFQUFFQSxHQUFVQSxJQUFJQSxDQUFDQSxRQUFRQTtRQUM3QkEsSUFBSUEsRUFBRUEsR0FBVUEsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDN0JBLElBQUlBLEdBQUdBLEdBQVlBLGFBQWFBLENBQUNBLGtCQUFrQkE7O1FBRW5EQSxNQUFNQSxDQUFDQSxhQUFhQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFekJBLElBQUlBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBO1FBQ3ZGQSxJQUFJQSxHQUFHQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxHQUFVQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUN2RkEsSUFBSUEsR0FBR0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBVUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBVUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7O1FBRXhGQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUM5Q0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDOUNBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBOztRQUU5Q0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDVkEsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWkEsSUFBSUEsRUFBRUEsR0FBVUEsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDbENBLElBQUlBLEVBQUVBLEdBQVVBLElBQUlBLENBQUNBLGFBQWFBO1FBQ2xDQSxJQUFJQSxFQUFFQSxHQUFVQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUNsQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0E7UUFDN0NBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBO1FBQzdDQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQTs7UUFFN0NBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLEdBQUNBLENBQUNBO1FBQzlFQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUNqREEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDakRBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBO0lBQ2xEQSxDQUFDQTtJQUNGWiw4QkFBQ0E7QUFBREEsQ0FBQ0EsRUF2VW9DLGtCQUFrQixFQXVVdEQ7O0FBRUQsdUNBQWdDLENBQUEiLCJmaWxlIjoiYm91bmRzL0F4aXNBbGlnbmVkQm91bmRpbmdCb3guanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQm91bmRpbmdWb2x1bWVCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2JvdW5kcy9Cb3VuZGluZ1ZvbHVtZUJhc2VcIik7XG5pbXBvcnQgTWF0cml4M0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IE1hdHJpeDNEVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RVdGlsc1wiKTtcbmltcG9ydCBQbGFuZUNsYXNzaWZpY2F0aW9uXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9QbGFuZUNsYXNzaWZpY2F0aW9uXCIpO1xuaW1wb3J0IFBsYW5lM0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1BsYW5lM0RcIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcblxuLyoqXG4gKiBBeGlzQWxpZ25lZEJvdW5kaW5nQm94IHJlcHJlc2VudHMgYSBib3VuZGluZyBib3ggdm9sdW1lIHRoYXQgaGFzIGl0cyBwbGFuZXMgYWxpZ25lZCB0byB0aGUgbG9jYWwgY29vcmRpbmF0ZSBheGVzIG9mIHRoZSBib3VuZGVkIG9iamVjdC5cbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBtb3N0IG1lc2hlcy5cbiAqL1xuY2xhc3MgQXhpc0FsaWduZWRCb3VuZGluZ0JveCBleHRlbmRzIEJvdW5kaW5nVm9sdW1lQmFzZVxue1xuXHRwcml2YXRlIF9jZW50ZXJYOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX2NlbnRlclk6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfY2VudGVyWjpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9oYWxmRXh0ZW50c1g6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfaGFsZkV4dGVudHNZOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX2hhbGZFeHRlbnRzWjpudW1iZXIgPSAwO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkF4aXNBbGlnbmVkQm91bmRpbmdCb3g8L2NvZGU+IG9iamVjdC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBudWxsaWZ5KClcblx0e1xuXHRcdHN1cGVyLm51bGxpZnkoKTtcblxuXHRcdHRoaXMuX2NlbnRlclggPSB0aGlzLl9jZW50ZXJZID0gdGhpcy5fY2VudGVyWiA9IDA7XG5cdFx0dGhpcy5faGFsZkV4dGVudHNYID0gdGhpcy5faGFsZkV4dGVudHNZID0gdGhpcy5faGFsZkV4dGVudHNaID0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIGlzSW5GcnVzdHVtKHBsYW5lczpBcnJheTxQbGFuZTNEPiwgbnVtUGxhbmVzOm51bWJlcik6Ym9vbGVhblxuXHR7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbnVtUGxhbmVzOyArK2kpIHtcblxuXHRcdFx0dmFyIHBsYW5lOlBsYW5lM0QgPSBwbGFuZXNbaV07XG5cdFx0XHR2YXIgYTpudW1iZXIgPSBwbGFuZS5hO1xuXHRcdFx0dmFyIGI6bnVtYmVyID0gcGxhbmUuYjtcblx0XHRcdHZhciBjOm51bWJlciA9IHBsYW5lLmM7XG5cdFx0XHR2YXIgZmxpcHBlZEV4dGVudFg6bnVtYmVyID0gYSA8IDA/IC10aGlzLl9oYWxmRXh0ZW50c1ggOiB0aGlzLl9oYWxmRXh0ZW50c1g7XG5cdFx0XHR2YXIgZmxpcHBlZEV4dGVudFk6bnVtYmVyID0gYiA8IDA/IC10aGlzLl9oYWxmRXh0ZW50c1kgOiB0aGlzLl9oYWxmRXh0ZW50c1k7XG5cdFx0XHR2YXIgZmxpcHBlZEV4dGVudFo6bnVtYmVyID0gYyA8IDA/IC10aGlzLl9oYWxmRXh0ZW50c1ogOiB0aGlzLl9oYWxmRXh0ZW50c1o7XG5cdFx0XHR2YXIgcHJvakRpc3Q6bnVtYmVyID0gYSoodGhpcy5fY2VudGVyWCArIGZsaXBwZWRFeHRlbnRYKSArIGIqKHRoaXMuX2NlbnRlclkgKyBmbGlwcGVkRXh0ZW50WSkgKyBjKih0aGlzLl9jZW50ZXJaICsgZmxpcHBlZEV4dGVudFopIC0gcGxhbmUuZDtcblxuXHRcdFx0aWYgKHByb2pEaXN0IDwgMClcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cHVibGljIHJheUludGVyc2VjdGlvbihwb3NpdGlvbjpWZWN0b3IzRCwgZGlyZWN0aW9uOlZlY3RvcjNELCB0YXJnZXROb3JtYWw6VmVjdG9yM0QpOm51bWJlclxuXHR7XG5cblx0XHRpZiAodGhpcy5jb250YWluc1BvaW50KHBvc2l0aW9uKSlcblx0XHRcdHJldHVybiAwO1xuXG5cdFx0dmFyIHB4Om51bWJlciA9IHBvc2l0aW9uLnggLSB0aGlzLl9jZW50ZXJYXG5cdFx0dmFyIHB5Om51bWJlciA9IHBvc2l0aW9uLnkgLSB0aGlzLl9jZW50ZXJZXG5cdFx0dmFyIHB6Om51bWJlciA9IHBvc2l0aW9uLnogLSB0aGlzLl9jZW50ZXJaO1xuXG5cdFx0dmFyIHZ4Om51bWJlciA9IGRpcmVjdGlvbi54XG5cdFx0dmFyIHZ5Om51bWJlciA9IGRpcmVjdGlvbi55XG5cdFx0dmFyIHZ6Om51bWJlciA9IGRpcmVjdGlvbi56O1xuXG5cdFx0dmFyIGl4Om51bWJlcjtcblx0XHR2YXIgaXk6bnVtYmVyO1xuXHRcdHZhciBpejpudW1iZXI7XG5cdFx0dmFyIHJheUVudHJ5RGlzdGFuY2U6bnVtYmVyO1xuXG5cdFx0Ly8gcmF5LXBsYW5lIHRlc3RzXG5cdFx0dmFyIGludGVyc2VjdHM6Ym9vbGVhbjtcblx0XHRpZiAodnggPCAwKSB7XG5cdFx0XHRyYXlFbnRyeURpc3RhbmNlID0gKCB0aGlzLl9oYWxmRXh0ZW50c1ggLSBweCApL3Z4O1xuXHRcdFx0aWYgKHJheUVudHJ5RGlzdGFuY2UgPiAwKSB7XG5cdFx0XHRcdGl5ID0gcHkgKyByYXlFbnRyeURpc3RhbmNlKnZ5O1xuXHRcdFx0XHRpeiA9IHB6ICsgcmF5RW50cnlEaXN0YW5jZSp2ejtcblx0XHRcdFx0aWYgKGl5ID4gLXRoaXMuX2hhbGZFeHRlbnRzWSAmJiBpeSA8IHRoaXMuX2hhbGZFeHRlbnRzWSAmJiBpeiA+IC10aGlzLl9oYWxmRXh0ZW50c1ogJiYgaXogPCB0aGlzLl9oYWxmRXh0ZW50c1opIHtcblx0XHRcdFx0XHR0YXJnZXROb3JtYWwueCA9IDE7XG5cdFx0XHRcdFx0dGFyZ2V0Tm9ybWFsLnkgPSAwO1xuXHRcdFx0XHRcdHRhcmdldE5vcm1hbC56ID0gMDtcblxuXHRcdFx0XHRcdGludGVyc2VjdHMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmICghaW50ZXJzZWN0cyAmJiB2eCA+IDApIHtcblx0XHRcdHJheUVudHJ5RGlzdGFuY2UgPSAoIC10aGlzLl9oYWxmRXh0ZW50c1ggLSBweCApL3Z4O1xuXHRcdFx0aWYgKHJheUVudHJ5RGlzdGFuY2UgPiAwKSB7XG5cdFx0XHRcdGl5ID0gcHkgKyByYXlFbnRyeURpc3RhbmNlKnZ5O1xuXHRcdFx0XHRpeiA9IHB6ICsgcmF5RW50cnlEaXN0YW5jZSp2ejtcblx0XHRcdFx0aWYgKGl5ID4gLXRoaXMuX2hhbGZFeHRlbnRzWSAmJiBpeSA8IHRoaXMuX2hhbGZFeHRlbnRzWSAmJiBpeiA+IC10aGlzLl9oYWxmRXh0ZW50c1ogJiYgaXogPCB0aGlzLl9oYWxmRXh0ZW50c1opIHtcblx0XHRcdFx0XHR0YXJnZXROb3JtYWwueCA9IC0xO1xuXHRcdFx0XHRcdHRhcmdldE5vcm1hbC55ID0gMDtcblx0XHRcdFx0XHR0YXJnZXROb3JtYWwueiA9IDA7XG5cdFx0XHRcdFx0aW50ZXJzZWN0cyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFpbnRlcnNlY3RzICYmIHZ5IDwgMCkge1xuXHRcdFx0cmF5RW50cnlEaXN0YW5jZSA9ICggdGhpcy5faGFsZkV4dGVudHNZIC0gcHkgKS92eTtcblx0XHRcdGlmIChyYXlFbnRyeURpc3RhbmNlID4gMCkge1xuXHRcdFx0XHRpeCA9IHB4ICsgcmF5RW50cnlEaXN0YW5jZSp2eDtcblx0XHRcdFx0aXogPSBweiArIHJheUVudHJ5RGlzdGFuY2Uqdno7XG5cdFx0XHRcdGlmIChpeCA+IC10aGlzLl9oYWxmRXh0ZW50c1ggJiYgaXggPCB0aGlzLl9oYWxmRXh0ZW50c1ggJiYgaXogPiAtdGhpcy5faGFsZkV4dGVudHNaICYmIGl6IDwgdGhpcy5faGFsZkV4dGVudHNaKSB7XG5cdFx0XHRcdFx0dGFyZ2V0Tm9ybWFsLnggPSAwO1xuXHRcdFx0XHRcdHRhcmdldE5vcm1hbC55ID0gMTtcblx0XHRcdFx0XHR0YXJnZXROb3JtYWwueiA9IDA7XG5cdFx0XHRcdFx0aW50ZXJzZWN0cyA9IHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFpbnRlcnNlY3RzICYmIHZ5ID4gMCkge1xuXHRcdFx0cmF5RW50cnlEaXN0YW5jZSA9ICggLXRoaXMuX2hhbGZFeHRlbnRzWSAtIHB5ICkvdnk7XG5cdFx0XHRpZiAocmF5RW50cnlEaXN0YW5jZSA+IDApIHtcblx0XHRcdFx0aXggPSBweCArIHJheUVudHJ5RGlzdGFuY2Uqdng7XG5cdFx0XHRcdGl6ID0gcHogKyByYXlFbnRyeURpc3RhbmNlKnZ6O1xuXHRcdFx0XHRpZiAoaXggPiAtdGhpcy5faGFsZkV4dGVudHNYICYmIGl4IDwgdGhpcy5faGFsZkV4dGVudHNYICYmIGl6ID4gLXRoaXMuX2hhbGZFeHRlbnRzWiAmJiBpeiA8IHRoaXMuX2hhbGZFeHRlbnRzWikge1xuXHRcdFx0XHRcdHRhcmdldE5vcm1hbC54ID0gMDtcblx0XHRcdFx0XHR0YXJnZXROb3JtYWwueSA9IC0xO1xuXHRcdFx0XHRcdHRhcmdldE5vcm1hbC56ID0gMDtcblx0XHRcdFx0XHRpbnRlcnNlY3RzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIWludGVyc2VjdHMgJiYgdnogPCAwKSB7XG5cdFx0XHRyYXlFbnRyeURpc3RhbmNlID0gKCB0aGlzLl9oYWxmRXh0ZW50c1ogLSBweiApL3Z6O1xuXHRcdFx0aWYgKHJheUVudHJ5RGlzdGFuY2UgPiAwKSB7XG5cdFx0XHRcdGl4ID0gcHggKyByYXlFbnRyeURpc3RhbmNlKnZ4O1xuXHRcdFx0XHRpeSA9IHB5ICsgcmF5RW50cnlEaXN0YW5jZSp2eTtcblx0XHRcdFx0aWYgKGl5ID4gLXRoaXMuX2hhbGZFeHRlbnRzWSAmJiBpeSA8IHRoaXMuX2hhbGZFeHRlbnRzWSAmJiBpeCA+IC10aGlzLl9oYWxmRXh0ZW50c1ggJiYgaXggPCB0aGlzLl9oYWxmRXh0ZW50c1gpIHtcblx0XHRcdFx0XHR0YXJnZXROb3JtYWwueCA9IDA7XG5cdFx0XHRcdFx0dGFyZ2V0Tm9ybWFsLnkgPSAwO1xuXHRcdFx0XHRcdHRhcmdldE5vcm1hbC56ID0gMTtcblx0XHRcdFx0XHRpbnRlcnNlY3RzID0gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRpZiAoIWludGVyc2VjdHMgJiYgdnogPiAwKSB7XG5cdFx0XHRyYXlFbnRyeURpc3RhbmNlID0gKCAtdGhpcy5faGFsZkV4dGVudHNaIC0gcHogKS92ejtcblx0XHRcdGlmIChyYXlFbnRyeURpc3RhbmNlID4gMCkge1xuXHRcdFx0XHRpeCA9IHB4ICsgcmF5RW50cnlEaXN0YW5jZSp2eDtcblx0XHRcdFx0aXkgPSBweSArIHJheUVudHJ5RGlzdGFuY2Uqdnk7XG5cdFx0XHRcdGlmIChpeSA+IC10aGlzLl9oYWxmRXh0ZW50c1kgJiYgaXkgPCB0aGlzLl9oYWxmRXh0ZW50c1kgJiYgaXggPiAtdGhpcy5faGFsZkV4dGVudHNYICYmIGl4IDwgdGhpcy5faGFsZkV4dGVudHNYKSB7XG5cdFx0XHRcdFx0dGFyZ2V0Tm9ybWFsLnggPSAwO1xuXHRcdFx0XHRcdHRhcmdldE5vcm1hbC55ID0gMDtcblx0XHRcdFx0XHR0YXJnZXROb3JtYWwueiA9IC0xO1xuXHRcdFx0XHRcdGludGVyc2VjdHMgPSB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGludGVyc2VjdHM/IHJheUVudHJ5RGlzdGFuY2UgOiAtMTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIGNvbnRhaW5zUG9pbnQocG9zaXRpb246VmVjdG9yM0QpOmJvb2xlYW5cblx0e1xuXHRcdHZhciBweDpudW1iZXIgPSBwb3NpdGlvbi54IC0gdGhpcy5fY2VudGVyWCwgcHk6bnVtYmVyID0gcG9zaXRpb24ueSAtIHRoaXMuX2NlbnRlclksIHB6Om51bWJlciA9IHBvc2l0aW9uLnogLSB0aGlzLl9jZW50ZXJaO1xuXHRcdHJldHVybiBweCA8PSB0aGlzLl9oYWxmRXh0ZW50c1ggJiYgcHggPj0gLXRoaXMuX2hhbGZFeHRlbnRzWCAmJiBweSA8PSB0aGlzLl9oYWxmRXh0ZW50c1kgJiYgcHkgPj0gLXRoaXMuX2hhbGZFeHRlbnRzWSAmJiBweiA8PSB0aGlzLl9oYWxmRXh0ZW50c1ogJiYgcHogPj0gLXRoaXMuX2hhbGZFeHRlbnRzWjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIGZyb21FeHRyZW1lcyhtaW5YOm51bWJlciwgbWluWTpudW1iZXIsIG1pblo6bnVtYmVyLCBtYXhYOm51bWJlciwgbWF4WTpudW1iZXIsIG1heFo6bnVtYmVyKVxuXHR7XG5cblx0XHR0aGlzLl9jZW50ZXJYID0gKG1heFggKyBtaW5YKSouNTtcblx0XHR0aGlzLl9jZW50ZXJZID0gKG1heFkgKyBtaW5ZKSouNTtcblx0XHR0aGlzLl9jZW50ZXJaID0gKG1heFogKyBtaW5aKSouNTtcblx0XHR0aGlzLl9oYWxmRXh0ZW50c1ggPSAobWF4WCAtIG1pblgpKi41O1xuXHRcdHRoaXMuX2hhbGZFeHRlbnRzWSA9IChtYXhZIC0gbWluWSkqLjU7XG5cdFx0dGhpcy5faGFsZkV4dGVudHNaID0gKG1heFogLSBtaW5aKSouNTtcblxuXHRcdHN1cGVyLmZyb21FeHRyZW1lcyhtaW5YLCBtaW5ZLCBtaW5aLCBtYXhYLCBtYXhZLCBtYXhaKTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgY2xvbmUoKTpCb3VuZGluZ1ZvbHVtZUJhc2Vcblx0e1xuXHRcdHZhciBjbG9uZTpBeGlzQWxpZ25lZEJvdW5kaW5nQm94ID0gbmV3IEF4aXNBbGlnbmVkQm91bmRpbmdCb3goKTtcblx0XHRjbG9uZS5mcm9tRXh0cmVtZXModGhpcy5fYWFiYi54LCB0aGlzLl9hYWJiLnkgKyB0aGlzLl9hYWJiLmhlaWdodCwgdGhpcy5fYWFiYi56LCB0aGlzLl9hYWJiLnggKyB0aGlzLl9hYWJiLndpZHRoLCB0aGlzLl9hYWJiLnksIHRoaXMuX2FhYmIueiArIHRoaXMuX2FhYmIuZGVwdGgpO1xuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgaGFsZkV4dGVudHNYKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faGFsZkV4dGVudHNYO1xuXHR9XG5cblx0cHVibGljIGdldCBoYWxmRXh0ZW50c1koKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9oYWxmRXh0ZW50c1k7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGhhbGZFeHRlbnRzWigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2hhbGZFeHRlbnRzWjtcblx0fVxuXG5cdC8qKlxuXHQgKiBGaW5kcyB0aGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgYm91bmRpbmcgdm9sdW1lIHRvIGFub3RoZXIgZ2l2ZW4gcG9pbnQuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIG1heGltdW0gZXJyb3IgY2FsY3VsYXRpb25zIGZvciBjb250ZW50IHdpdGhpbiBhIGdpdmVuIGJvdW5kLlxuXHQgKiBAcGFyYW0gcG9pbnQgVGhlIHBvaW50IGZvciB3aGljaCB0byBmaW5kIHRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBib3VuZGluZyB2b2x1bWVcblx0ICogQHBhcmFtIHRhcmdldCBBbiBvcHRpb25hbCBWZWN0b3IzRCB0byBzdG9yZSB0aGUgcmVzdWx0IHRvIHByZXZlbnQgY3JlYXRpbmcgYSBuZXcgb2JqZWN0LlxuXHQgKiBAcmV0dXJuXG5cdCAqL1xuXHRwdWJsaWMgY2xvc2VzdFBvaW50VG9Qb2ludChwb2ludDpWZWN0b3IzRCwgdGFyZ2V0OlZlY3RvcjNEID0gbnVsbCk6VmVjdG9yM0Rcblx0e1xuXHRcdHZhciBwOm51bWJlcjtcblxuXHRcdGlmICh0YXJnZXQgPT0gbnVsbClcblx0XHRcdHRhcmdldCA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdFx0cCA9IHBvaW50Lng7XG5cdFx0aWYgKHAgPCB0aGlzLl9hYWJiLngpXG5cdFx0XHRwID0gdGhpcy5fYWFiYi54O1xuXHRcdGlmIChwID4gdGhpcy5fYWFiYi54ICsgdGhpcy5fYWFiYi53aWR0aClcblx0XHRcdHAgPSB0aGlzLl9hYWJiLnggKyB0aGlzLl9hYWJiLndpZHRoO1xuXHRcdHRhcmdldC54ID0gcDtcblxuXHRcdHAgPSBwb2ludC55O1xuXHRcdGlmIChwIDwgdGhpcy5fYWFiYi55ICsgdGhpcy5fYWFiYi5oZWlnaHQpXG5cdFx0XHRwID0gdGhpcy5fYWFiYi55ICsgdGhpcy5fYWFiYi5oZWlnaHQ7XG5cdFx0aWYgKHAgPiB0aGlzLl9hYWJiLnkpXG5cdFx0XHRwID0gdGhpcy5fYWFiYi55O1xuXHRcdHRhcmdldC55ID0gcDtcblxuXHRcdHAgPSBwb2ludC56O1xuXHRcdGlmIChwIDwgdGhpcy5fYWFiYi56KVxuXHRcdFx0cCA9IHRoaXMuX2FhYmIuejtcblx0XHRpZiAocCA+IHRoaXMuX2FhYmIueiArIHRoaXMuX2FhYmIuZGVwdGgpXG5cdFx0XHRwID0gdGhpcy5fYWFiYi56ICsgdGhpcy5fYWFiYi5kZXB0aDtcblx0XHR0YXJnZXQueiA9IHA7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9XG5cblx0cHVibGljIHBVcGRhdGVCb3VuZGluZ1JlbmRlcmFibGUoKVxuXHR7XG5cdFx0dGhpcy5fcEJvdW5kaW5nRW50aXR5LnRyYW5zZm9ybS5zY2FsZS54ID0gTWF0aC5tYXgodGhpcy5faGFsZkV4dGVudHNYKjIsIDAuMDAxKTtcblx0XHR0aGlzLl9wQm91bmRpbmdFbnRpdHkudHJhbnNmb3JtLnNjYWxlLnkgPSBNYXRoLm1heCh0aGlzLl9oYWxmRXh0ZW50c1kqMiwgMC4wMDEpO1xuXHRcdHRoaXMuX3BCb3VuZGluZ0VudGl0eS50cmFuc2Zvcm0uc2NhbGUueiA9IE1hdGgubWF4KHRoaXMuX2hhbGZFeHRlbnRzWioyLCAwLjAwMSk7XG5cdFx0dGhpcy5fcEJvdW5kaW5nRW50aXR5LnRyYW5zZm9ybS5wb3NpdGlvbi54ID0gdGhpcy5fY2VudGVyWDtcblx0XHR0aGlzLl9wQm91bmRpbmdFbnRpdHkudHJhbnNmb3JtLnBvc2l0aW9uLnkgPSB0aGlzLl9jZW50ZXJZO1xuXHRcdHRoaXMuX3BCb3VuZGluZ0VudGl0eS50cmFuc2Zvcm0ucG9zaXRpb24ueiA9IHRoaXMuX2NlbnRlclo7XG5cdH1cblxuXHRwdWJsaWMgcENyZWF0ZUJvdW5kaW5nRW50aXR5KCk6SUVudGl0eVxuXHR7XG5cdFx0cmV0dXJuIG51bGw7Ly88YXdheS5wcmltaXRpdmVzLldpcmVmcmFtZVByaW1pdGl2ZUJhc2U+IG5ldyBhd2F5LnByaW1pdGl2ZXMuV2lyZWZyYW1lQ3ViZSgxLCAxLCAxLCAweGZmZmZmZiwgMC41KTtcblx0fVxuXG5cdHB1YmxpYyBjbGFzc2lmeVRvUGxhbmUocGxhbmU6UGxhbmUzRCk6bnVtYmVyXG5cdHtcblx0XHR2YXIgYTpudW1iZXIgPSBwbGFuZS5hO1xuXHRcdHZhciBiOm51bWJlciA9IHBsYW5lLmI7XG5cdFx0dmFyIGM6bnVtYmVyID0gcGxhbmUuYztcblx0XHR2YXIgY2VudGVyRGlzdGFuY2U6bnVtYmVyID0gYSp0aGlzLl9jZW50ZXJYICsgYip0aGlzLl9jZW50ZXJZICsgYyp0aGlzLl9jZW50ZXJaIC0gcGxhbmUuZDtcblxuXHRcdGlmIChhIDwgMClcblx0XHRcdGEgPSAtYTtcblxuXHRcdGlmIChiIDwgMClcblx0XHRcdGIgPSAtYjtcblxuXHRcdGlmIChjIDwgMClcblx0XHRcdGMgPSAtYztcblxuXHRcdHZhciBib3VuZE9mZnNldDpudW1iZXIgPSBhKnRoaXMuX2hhbGZFeHRlbnRzWCArIGIqdGhpcy5faGFsZkV4dGVudHNZICsgYyp0aGlzLl9oYWxmRXh0ZW50c1o7XG5cblx0XHRyZXR1cm4gY2VudGVyRGlzdGFuY2UgPiBib3VuZE9mZnNldD8gUGxhbmVDbGFzc2lmaWNhdGlvbi5GUk9OVCA6IGNlbnRlckRpc3RhbmNlIDwgLWJvdW5kT2Zmc2V0PyBQbGFuZUNsYXNzaWZpY2F0aW9uLkJBQ0sgOiBQbGFuZUNsYXNzaWZpY2F0aW9uLklOVEVSU0VDVDtcblx0fVxuXG5cdHB1YmxpYyB0cmFuc2Zvcm1Gcm9tKGJvdW5kczpCb3VuZGluZ1ZvbHVtZUJhc2UsIG1hdHJpeDpNYXRyaXgzRClcblx0e1xuXHRcdHZhciBhYWJiOkF4aXNBbGlnbmVkQm91bmRpbmdCb3ggPSA8QXhpc0FsaWduZWRCb3VuZGluZ0JveD4gYm91bmRzO1xuXHRcdHZhciBjeDpudW1iZXIgPSBhYWJiLl9jZW50ZXJYO1xuXHRcdHZhciBjeTpudW1iZXIgPSBhYWJiLl9jZW50ZXJZO1xuXHRcdHZhciBjejpudW1iZXIgPSBhYWJiLl9jZW50ZXJaO1xuXHRcdHZhciByYXc6bnVtYmVyW10gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblxuXHRcdG1hdHJpeC5jb3B5UmF3RGF0YVRvKHJhdyk7XG5cblx0XHR2YXIgbTExOm51bWJlciA9IHJhd1swXSwgbTEyOm51bWJlciA9IHJhd1s0XSwgbTEzOm51bWJlciA9IHJhd1s4XSwgbTE0Om51bWJlciA9IHJhd1sxMl07XG5cdFx0dmFyIG0yMTpudW1iZXIgPSByYXdbMV0sIG0yMjpudW1iZXIgPSByYXdbNV0sIG0yMzpudW1iZXIgPSByYXdbOV0sIG0yNDpudW1iZXIgPSByYXdbMTNdO1xuXHRcdHZhciBtMzE6bnVtYmVyID0gcmF3WzJdLCBtMzI6bnVtYmVyID0gcmF3WzZdLCBtMzM6bnVtYmVyID0gcmF3WzEwXSwgbTM0Om51bWJlciA9IHJhd1sxNF07XG5cblx0XHR0aGlzLl9jZW50ZXJYID0gY3gqbTExICsgY3kqbTEyICsgY3oqbTEzICsgbTE0O1xuXHRcdHRoaXMuX2NlbnRlclkgPSBjeCptMjEgKyBjeSptMjIgKyBjeiptMjMgKyBtMjQ7XG5cdFx0dGhpcy5fY2VudGVyWiA9IGN4Km0zMSArIGN5Km0zMiArIGN6Km0zMyArIG0zNDtcblxuXHRcdGlmIChtMTEgPCAwKVxuXHRcdFx0bTExID0gLW0xMTtcblx0XHRpZiAobTEyIDwgMClcblx0XHRcdG0xMiA9IC1tMTI7XG5cdFx0aWYgKG0xMyA8IDApXG5cdFx0XHRtMTMgPSAtbTEzO1xuXHRcdGlmIChtMjEgPCAwKVxuXHRcdFx0bTIxID0gLW0yMTtcblx0XHRpZiAobTIyIDwgMClcblx0XHRcdG0yMiA9IC1tMjI7XG5cdFx0aWYgKG0yMyA8IDApXG5cdFx0XHRtMjMgPSAtbTIzO1xuXHRcdGlmIChtMzEgPCAwKVxuXHRcdFx0bTMxID0gLW0zMTtcblx0XHRpZiAobTMyIDwgMClcblx0XHRcdG0zMiA9IC1tMzI7XG5cdFx0aWYgKG0zMyA8IDApXG5cdFx0XHRtMzMgPSAtbTMzO1xuXHRcdHZhciBoeDpudW1iZXIgPSBhYWJiLl9oYWxmRXh0ZW50c1g7XG5cdFx0dmFyIGh5Om51bWJlciA9IGFhYmIuX2hhbGZFeHRlbnRzWTtcblx0XHR2YXIgaHo6bnVtYmVyID0gYWFiYi5faGFsZkV4dGVudHNaO1xuXHRcdHRoaXMuX2hhbGZFeHRlbnRzWCA9IGh4Km0xMSArIGh5Km0xMiArIGh6Km0xMztcblx0XHR0aGlzLl9oYWxmRXh0ZW50c1kgPSBoeCptMjEgKyBoeSptMjIgKyBoeiptMjM7XG5cdFx0dGhpcy5faGFsZkV4dGVudHNaID0gaHgqbTMxICsgaHkqbTMyICsgaHoqbTMzO1xuXG5cdFx0dGhpcy5fYWFiYi53aWR0aCA9IHRoaXMuX2FhYmIuaGVpZ2h0ID0gdGhpcy5fYWFiYi5kZXB0aCA9IHRoaXMuX2hhbGZFeHRlbnRzWCoyO1xuXHRcdHRoaXMuX2FhYmIueCA9IHRoaXMuX2NlbnRlclggLSB0aGlzLl9oYWxmRXh0ZW50c1g7XG5cdFx0dGhpcy5fYWFiYi55ID0gdGhpcy5fY2VudGVyWSArIHRoaXMuX2hhbGZFeHRlbnRzWTtcblx0XHR0aGlzLl9hYWJiLnogPSB0aGlzLl9jZW50ZXJaIC0gdGhpcy5faGFsZkV4dGVudHNaO1xuXHR9XG59XG5cbmV4cG9ydCA9IEF4aXNBbGlnbmVkQm91bmRpbmdCb3g7Il19 \ No newline at end of file diff --git a/lib/bounds/AxisAlignedBoundingBox.ts b/lib/bounds/AxisAlignedBoundingBox.ts new file mode 100644 index 00000000..07cdfb6d --- /dev/null +++ b/lib/bounds/AxisAlignedBoundingBox.ts @@ -0,0 +1,342 @@ +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +import PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * AxisAlignedBoundingBox represents a bounding box volume that has its planes aligned to the local coordinate axes of the bounded object. + * This is useful for most meshes. + */ +class AxisAlignedBoundingBox extends BoundingVolumeBase +{ + private _centerX:number = 0; + private _centerY:number = 0; + private _centerZ:number = 0; + private _halfExtentsX:number = 0; + private _halfExtentsY:number = 0; + private _halfExtentsZ:number = 0; + + /** + * Creates a new AxisAlignedBoundingBox object. + */ + constructor() + { + super(); + } + + /** + * @inheritDoc + */ + public nullify() + { + super.nullify(); + + this._centerX = this._centerY = this._centerZ = 0; + this._halfExtentsX = this._halfExtentsY = this._halfExtentsZ = 0; + } + + /** + * @inheritDoc + */ + public isInFrustum(planes:Array, numPlanes:number):boolean + { + for (var i:number = 0; i < numPlanes; ++i) { + + var plane:Plane3D = planes[i]; + var a:number = plane.a; + var b:number = plane.b; + var c:number = plane.c; + var flippedExtentX:number = a < 0? -this._halfExtentsX : this._halfExtentsX; + var flippedExtentY:number = b < 0? -this._halfExtentsY : this._halfExtentsY; + var flippedExtentZ:number = c < 0? -this._halfExtentsZ : this._halfExtentsZ; + var projDist:number = a*(this._centerX + flippedExtentX) + b*(this._centerY + flippedExtentY) + c*(this._centerZ + flippedExtentZ) - plane.d; + + if (projDist < 0) + return false; + } + + return true; + } + + public rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number + { + + if (this.containsPoint(position)) + return 0; + + var px:number = position.x - this._centerX + var py:number = position.y - this._centerY + var pz:number = position.z - this._centerZ; + + var vx:number = direction.x + var vy:number = direction.y + var vz:number = direction.z; + + var ix:number; + var iy:number; + var iz:number; + var rayEntryDistance:number; + + // ray-plane tests + var intersects:boolean; + if (vx < 0) { + rayEntryDistance = ( this._halfExtentsX - px )/vx; + if (rayEntryDistance > 0) { + iy = py + rayEntryDistance*vy; + iz = pz + rayEntryDistance*vz; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 1; + targetNormal.y = 0; + targetNormal.z = 0; + + intersects = true; + } + } + } + if (!intersects && vx > 0) { + rayEntryDistance = ( -this._halfExtentsX - px )/vx; + if (rayEntryDistance > 0) { + iy = py + rayEntryDistance*vy; + iz = pz + rayEntryDistance*vz; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = -1; + targetNormal.y = 0; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vy < 0) { + rayEntryDistance = ( this._halfExtentsY - py )/vy; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance*vx; + iz = pz + rayEntryDistance*vz; + if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 0; + targetNormal.y = 1; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vy > 0) { + rayEntryDistance = ( -this._halfExtentsY - py )/vy; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance*vx; + iz = pz + rayEntryDistance*vz; + if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { + targetNormal.x = 0; + targetNormal.y = -1; + targetNormal.z = 0; + intersects = true; + } + } + } + if (!intersects && vz < 0) { + rayEntryDistance = ( this._halfExtentsZ - pz )/vz; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance*vx; + iy = py + rayEntryDistance*vy; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { + targetNormal.x = 0; + targetNormal.y = 0; + targetNormal.z = 1; + intersects = true; + } + } + } + if (!intersects && vz > 0) { + rayEntryDistance = ( -this._halfExtentsZ - pz )/vz; + if (rayEntryDistance > 0) { + ix = px + rayEntryDistance*vx; + iy = py + rayEntryDistance*vy; + if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { + targetNormal.x = 0; + targetNormal.y = 0; + targetNormal.z = -1; + intersects = true; + } + } + } + + return intersects? rayEntryDistance : -1; + } + + /** + * @inheritDoc + */ + public containsPoint(position:Vector3D):boolean + { + var px:number = position.x - this._centerX, py:number = position.y - this._centerY, pz:number = position.z - this._centerZ; + return px <= this._halfExtentsX && px >= -this._halfExtentsX && py <= this._halfExtentsY && py >= -this._halfExtentsY && pz <= this._halfExtentsZ && pz >= -this._halfExtentsZ; + } + + /** + * @inheritDoc + */ + public fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number) + { + + this._centerX = (maxX + minX)*.5; + this._centerY = (maxY + minY)*.5; + this._centerZ = (maxZ + minZ)*.5; + this._halfExtentsX = (maxX - minX)*.5; + this._halfExtentsY = (maxY - minY)*.5; + this._halfExtentsZ = (maxZ - minZ)*.5; + + super.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); + + } + + /** + * @inheritDoc + */ + public clone():BoundingVolumeBase + { + var clone:AxisAlignedBoundingBox = new AxisAlignedBoundingBox(); + clone.fromExtremes(this._aabb.x, this._aabb.y + this._aabb.height, this._aabb.z, this._aabb.x + this._aabb.width, this._aabb.y, this._aabb.z + this._aabb.depth); + return clone; + } + + public get halfExtentsX():number + { + return this._halfExtentsX; + } + + public get halfExtentsY():number + { + return this._halfExtentsY; + } + + public get halfExtentsZ():number + { + return this._halfExtentsZ; + } + + /** + * Finds the closest point on the bounding volume to another given point. This can be used for maximum error calculations for content within a given bound. + * @param point The point for which to find the closest point on the bounding volume + * @param target An optional Vector3D to store the result to prevent creating a new object. + * @return + */ + public closestPointToPoint(point:Vector3D, target:Vector3D = null):Vector3D + { + var p:number; + + if (target == null) + target = new Vector3D(); + + p = point.x; + if (p < this._aabb.x) + p = this._aabb.x; + if (p > this._aabb.x + this._aabb.width) + p = this._aabb.x + this._aabb.width; + target.x = p; + + p = point.y; + if (p < this._aabb.y + this._aabb.height) + p = this._aabb.y + this._aabb.height; + if (p > this._aabb.y) + p = this._aabb.y; + target.y = p; + + p = point.z; + if (p < this._aabb.z) + p = this._aabb.z; + if (p > this._aabb.z + this._aabb.depth) + p = this._aabb.z + this._aabb.depth; + target.z = p; + + return target; + } + + public pUpdateBoundingRenderable() + { + this._pBoundingEntity.transform.scale.x = Math.max(this._halfExtentsX*2, 0.001); + this._pBoundingEntity.transform.scale.y = Math.max(this._halfExtentsY*2, 0.001); + this._pBoundingEntity.transform.scale.z = Math.max(this._halfExtentsZ*2, 0.001); + this._pBoundingEntity.transform.position.x = this._centerX; + this._pBoundingEntity.transform.position.y = this._centerY; + this._pBoundingEntity.transform.position.z = this._centerZ; + } + + public pCreateBoundingEntity():IEntity + { + return null;// new away.primitives.WireframeCube(1, 1, 1, 0xffffff, 0.5); + } + + public classifyToPlane(plane:Plane3D):number + { + var a:number = plane.a; + var b:number = plane.b; + var c:number = plane.c; + var centerDistance:number = a*this._centerX + b*this._centerY + c*this._centerZ - plane.d; + + if (a < 0) + a = -a; + + if (b < 0) + b = -b; + + if (c < 0) + c = -c; + + var boundOffset:number = a*this._halfExtentsX + b*this._halfExtentsY + c*this._halfExtentsZ; + + return centerDistance > boundOffset? PlaneClassification.FRONT : centerDistance < -boundOffset? PlaneClassification.BACK : PlaneClassification.INTERSECT; + } + + public transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D) + { + var aabb:AxisAlignedBoundingBox = bounds; + var cx:number = aabb._centerX; + var cy:number = aabb._centerY; + var cz:number = aabb._centerZ; + var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + + matrix.copyRawDataTo(raw); + + var m11:number = raw[0], m12:number = raw[4], m13:number = raw[8], m14:number = raw[12]; + var m21:number = raw[1], m22:number = raw[5], m23:number = raw[9], m24:number = raw[13]; + var m31:number = raw[2], m32:number = raw[6], m33:number = raw[10], m34:number = raw[14]; + + this._centerX = cx*m11 + cy*m12 + cz*m13 + m14; + this._centerY = cx*m21 + cy*m22 + cz*m23 + m24; + this._centerZ = cx*m31 + cy*m32 + cz*m33 + m34; + + if (m11 < 0) + m11 = -m11; + if (m12 < 0) + m12 = -m12; + if (m13 < 0) + m13 = -m13; + if (m21 < 0) + m21 = -m21; + if (m22 < 0) + m22 = -m22; + if (m23 < 0) + m23 = -m23; + if (m31 < 0) + m31 = -m31; + if (m32 < 0) + m32 = -m32; + if (m33 < 0) + m33 = -m33; + var hx:number = aabb._halfExtentsX; + var hy:number = aabb._halfExtentsY; + var hz:number = aabb._halfExtentsZ; + this._halfExtentsX = hx*m11 + hy*m12 + hz*m13; + this._halfExtentsY = hx*m21 + hy*m22 + hz*m23; + this._halfExtentsZ = hx*m31 + hy*m32 + hz*m33; + + this._aabb.width = this._aabb.height = this._aabb.depth = this._halfExtentsX*2; + this._aabb.x = this._centerX - this._halfExtentsX; + this._aabb.y = this._centerY + this._halfExtentsY; + this._aabb.z = this._centerZ - this._halfExtentsZ; + } +} + +export = AxisAlignedBoundingBox; \ No newline at end of file diff --git a/lib/bounds/BoundingSphere.js b/lib/bounds/BoundingSphere.js new file mode 100755 index 00000000..1b4a9d41 --- /dev/null +++ b/lib/bounds/BoundingSphere.js @@ -0,0 +1,217 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + +var PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var BoundingSphere = (function (_super) { + __extends(BoundingSphere, _super); + function BoundingSphere() { + _super.call(this); + this._radius = 0; + this._centerX = 0; + this._centerY = 0; + this._centerZ = 0; + } + Object.defineProperty(BoundingSphere.prototype, "radius", { + get: function () { + return this._radius; + }, + enumerable: true, + configurable: true + }); + + BoundingSphere.prototype.nullify = function () { + _super.prototype.nullify.call(this); + this._centerX = this._centerY = this._centerZ = 0; + this._radius = 0; + }; + + BoundingSphere.prototype.isInFrustum = function (planes, numPlanes) { + for (var i = 0; i < numPlanes; ++i) { + var plane = planes[i]; + var flippedExtentX = plane.a < 0 ? -this._radius : this._radius; + var flippedExtentY = plane.b < 0 ? -this._radius : this._radius; + var flippedExtentZ = plane.c < 0 ? -this._radius : this._radius; + var projDist = plane.a * (this._centerX + flippedExtentX) + plane.b * (this._centerY + flippedExtentY) + plane.c * (this._centerZ + flippedExtentZ) - plane.d; + if (projDist < 0) { + return false; + } + } + return true; + }; + + BoundingSphere.prototype.fromSphere = function (center, radius) { + this._centerX = center.x; + this._centerY = center.y; + this._centerZ = center.z; + this._radius = radius; + this._aabb.width = this._aabb.height = this._aabb.depth = radius * 2; + this._aabb.x = this._centerX - radius; + this._aabb.y = this._centerY + radius; + this._aabb.z = this._centerZ - radius; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + }; + + BoundingSphere.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { + this._centerX = (maxX + minX) * .5; + this._centerY = (maxY + minY) * .5; + this._centerZ = (maxZ + minZ) * .5; + + var d = maxX - minX; + var y = maxY - minY; + var z = maxZ - minZ; + + if (y > d) + d = y; + + if (z > d) + d = z; + + this._radius = d * Math.sqrt(.5); + _super.prototype.fromExtremes.call(this, minX, minY, minZ, maxX, maxY, maxZ); + }; + + BoundingSphere.prototype.clone = function () { + var clone = new BoundingSphere(); + clone.fromSphere(new Vector3D(this._centerX, this._centerY, this._centerZ), this._radius); + return clone; + }; + + BoundingSphere.prototype.rayIntersection = function (position, direction, targetNormal) { + if (this.containsPoint(position)) { + return 0; + } + + var px = position.x - this._centerX, py = position.y - this._centerY, pz = position.z - this._centerZ; + var vx = direction.x, vy = direction.y, vz = direction.z; + var rayEntryDistance; + + var a = vx * vx + vy * vy + vz * vz; + var b = 2 * (px * vx + py * vy + pz * vz); + var c = px * px + py * py + pz * pz - this._radius * this._radius; + var det = b * b - 4 * a * c; + + if (det >= 0) { + var sqrtDet = Math.sqrt(det); + rayEntryDistance = (-b - sqrtDet) / (2 * a); + if (rayEntryDistance >= 0) { + targetNormal.x = px + rayEntryDistance * vx; + targetNormal.y = py + rayEntryDistance * vy; + targetNormal.z = pz + rayEntryDistance * vz; + targetNormal.normalize(); + + return rayEntryDistance; + } + } + + // ray misses sphere + return -1; + }; + + BoundingSphere.prototype.containsPoint = function (position) { + var px = position.x - this._centerX; + var py = position.y - this._centerY; + var pz = position.z - this._centerZ; + var distance = Math.sqrt(px * px + py * py + pz * pz); + return distance <= this._radius; + }; + + BoundingSphere.prototype.pUpdateBoundingEntity = function () { + var sc = this._radius; + if (sc == 0) + sc = 0.001; + + var transform = this._pBoundingEntity.transform; + transform.scale = new Vector3D(sc, sc, sc); + transform.position = new Vector3D(this._centerX, this._centerY, this._centerZ); + }; + + // TODO pCreateBoundingRenderable():WireframePrimitiveBase + BoundingSphere.prototype.pCreateBoundingEntity = function () { + return null; + }; + + //@override + BoundingSphere.prototype.classifyToPlane = function (plane) { + var a = plane.a; + var b = plane.b; + var c = plane.c; + var dd = a * this._centerX + b * this._centerY + c * this._centerZ - plane.d; + + if (a < 0) + a = -a; + + if (b < 0) + b = -b; + + if (c < 0) + c = -c; + + var rr = (a + b + c) * this._radius; + + return dd > rr ? PlaneClassification.FRONT : dd < -rr ? PlaneClassification.BACK : PlaneClassification.INTERSECT; + }; + + BoundingSphere.prototype.transformFrom = function (bounds, matrix) { + var sphere = bounds; + var cx = sphere._centerX; + var cy = sphere._centerY; + var cz = sphere._centerZ; + var raw = new Array(16); + + matrix.copyRawDataTo(raw); + + var m11 = raw[0], m12 = raw[4], m13 = raw[8], m14 = raw[12]; + var m21 = raw[1], m22 = raw[5], m23 = raw[9], m24 = raw[13]; + var m31 = raw[2], m32 = raw[6], m33 = raw[10], m34 = raw[14]; + + this._centerX = cx * m11 + cy * m12 + cz * m13 + m14; + this._centerY = cx * m21 + cy * m22 + cz * m23 + m24; + this._centerZ = cx * m31 + cy * m32 + cz * m33 + m34; + + if (m11 < 0) + m11 = -m11; + if (m12 < 0) + m12 = -m12; + if (m13 < 0) + m13 = -m13; + if (m21 < 0) + m21 = -m21; + if (m22 < 0) + m22 = -m22; + if (m23 < 0) + m23 = -m23; + if (m31 < 0) + m31 = -m31; + if (m32 < 0) + m32 = -m32; + if (m33 < 0) + m33 = -m33; + + var r = sphere._radius; + var rx = m11 + m12 + m13; + var ry = m21 + m22 + m23; + var rz = m31 + m32 + m33; + this._radius = r * Math.sqrt(rx * rx + ry * ry + rz * rz); + + this._aabb.width = this._aabb.height = this._aabb.depth = this._radius * 2; + this._aabb.x = this._centerX - this._radius; + this._aabb.y = this._centerY + this._radius; + this._aabb.z = this._centerZ - this._radius; + }; + return BoundingSphere; +})(BoundingVolumeBase); + +module.exports = BoundingSphere; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvdW5kcy9Cb3VuZGluZ1NwaGVyZS50cyJdLCJuYW1lcyI6WyJCb3VuZGluZ1NwaGVyZSIsIkJvdW5kaW5nU3BoZXJlLmNvbnN0cnVjdG9yIiwiQm91bmRpbmdTcGhlcmUubnVsbGlmeSIsIkJvdW5kaW5nU3BoZXJlLmlzSW5GcnVzdHVtIiwiQm91bmRpbmdTcGhlcmUuZnJvbVNwaGVyZSIsIkJvdW5kaW5nU3BoZXJlLmZyb21FeHRyZW1lcyIsIkJvdW5kaW5nU3BoZXJlLmNsb25lIiwiQm91bmRpbmdTcGhlcmUucmF5SW50ZXJzZWN0aW9uIiwiQm91bmRpbmdTcGhlcmUuY29udGFpbnNQb2ludCIsIkJvdW5kaW5nU3BoZXJlLnBVcGRhdGVCb3VuZGluZ0VudGl0eSIsIkJvdW5kaW5nU3BoZXJlLnBDcmVhdGVCb3VuZGluZ0VudGl0eSIsIkJvdW5kaW5nU3BoZXJlLmNsYXNzaWZ5VG9QbGFuZSIsIkJvdW5kaW5nU3BoZXJlLnRyYW5zZm9ybUZyb20iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZFQUFtRjs7QUFHbkYsa0ZBQXdGOztBQUd4Riw0REFBcUU7O0FBR3JFO0lBQTZCQSxpQ0FBa0JBO0lBUTlDQTtRQUVDQyxXQUFNQSxLQUFBQSxDQUFDQTtRQVBSQSxLQUFRQSxPQUFPQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUMzQkEsS0FBUUEsUUFBUUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLEtBQVFBLFFBQVFBLEdBQVVBLENBQUNBLENBQUNBO1FBQzVCQSxLQUFRQSxRQUFRQSxHQUFVQSxDQUFDQSxDQUFDQTtJQUs1QkEsQ0FBQ0E7SUFFREQ7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsT0FBT0E7UUFDcEJBLENBQUNBOzs7O0FBQUFBO0lBRURBLG1DQUFBQTtRQUVDRSxnQkFBS0EsQ0FBQ0EsT0FBT0EsS0FBQ0EsS0FBQUEsQ0FBQ0E7UUFDZkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0Es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Q0EsRUFBRUEsR0FBR0EsR0FBVUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7UUFDdkZBLElBQUlBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBOztRQUV4RkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDOUNBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQzlDQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQTs7UUFFOUNBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1ZBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBOztRQUVaQSxJQUFJQSxDQUFDQSxHQUFVQSxNQUFNQSxDQUFDQSxPQUFPQTtRQUM3QkEsSUFBSUEsRUFBRUEsR0FBVUEsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDL0JBLElBQUlBLEVBQUVBLEdBQVVBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQy9CQSxJQUFJQSxFQUFFQSxHQUFVQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUMvQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsQ0FBQ0E7O1FBRWpEQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFDQSxDQUFDQTtRQUN4RUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0E7UUFDM0NBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BO1FBQzNDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQTtJQUM1Q0EsQ0FBQ0E7SUFDRlosc0JBQUNBO0FBQURBLENBQUNBLEVBck40QixrQkFBa0IsRUFxTjlDOztBQUVELCtCQUF3QixDQUFBIiwiZmlsZSI6ImJvdW5kcy9Cb3VuZGluZ1NwaGVyZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCb3VuZGluZ1ZvbHVtZUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYm91bmRzL0JvdW5kaW5nVm9sdW1lQmFzZVwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RcIik7XG5pbXBvcnQgTWF0cml4M0RVdGlsc1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFV0aWxzXCIpO1xuaW1wb3J0IFBsYW5lQ2xhc3NpZmljYXRpb25cdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1BsYW5lQ2xhc3NpZmljYXRpb25cIik7XG5pbXBvcnQgUGxhbmUzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUGxhbmUzRFwiKTtcbmltcG9ydCBUcmFuc2Zvcm1cdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9UcmFuc2Zvcm1cIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcblxuY2xhc3MgQm91bmRpbmdTcGhlcmUgZXh0ZW5kcyBCb3VuZGluZ1ZvbHVtZUJhc2VcbntcblxuXHRwcml2YXRlIF9yYWRpdXM6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfY2VudGVyWDpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9jZW50ZXJZOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX2NlbnRlclo6bnVtYmVyID0gMDtcblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0cHVibGljIGdldCByYWRpdXMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9yYWRpdXM7XG5cdH1cblxuXHRwdWJsaWMgbnVsbGlmeSgpXG5cdHtcblx0XHRzdXBlci5udWxsaWZ5KCk7XG5cdFx0dGhpcy5fY2VudGVyWCA9IHRoaXMuX2NlbnRlclkgPSB0aGlzLl9jZW50ZXJaID0gMDtcblx0XHR0aGlzLl9yYWRpdXMgPSAwO1xuXHR9XG5cblx0cHVibGljIGlzSW5GcnVzdHVtKHBsYW5lczpBcnJheTxQbGFuZTNEPiwgbnVtUGxhbmVzOm51bWJlcik6Ym9vbGVhblxuXHR7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbnVtUGxhbmVzOyArK2kpIHtcblx0XHRcdHZhciBwbGFuZTpQbGFuZTNEID0gcGxhbmVzW2ldO1xuXHRcdFx0dmFyIGZsaXBwZWRFeHRlbnRYOm51bWJlciA9IHBsYW5lLmEgPCAwPyAtdGhpcy5fcmFkaXVzIDogdGhpcy5fcmFkaXVzO1xuXHRcdFx0dmFyIGZsaXBwZWRFeHRlbnRZOm51bWJlciA9IHBsYW5lLmIgPCAwPyAtdGhpcy5fcmFkaXVzIDogdGhpcy5fcmFkaXVzO1xuXHRcdFx0dmFyIGZsaXBwZWRFeHRlbnRaOm51bWJlciA9IHBsYW5lLmMgPCAwPyAtdGhpcy5fcmFkaXVzIDogdGhpcy5fcmFkaXVzO1xuXHRcdFx0dmFyIHByb2pEaXN0Om51bWJlciA9IHBsYW5lLmEqKCB0aGlzLl9jZW50ZXJYICsgZmxpcHBlZEV4dGVudFggKSArIHBsYW5lLmIqKCB0aGlzLl9jZW50ZXJZICsgZmxpcHBlZEV4dGVudFkpICsgcGxhbmUuYyooIHRoaXMuX2NlbnRlclogKyBmbGlwcGVkRXh0ZW50WiApIC0gcGxhbmUuZDtcblx0XHRcdGlmIChwcm9qRGlzdCA8IDApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBmcm9tU3BoZXJlKGNlbnRlcjpWZWN0b3IzRCwgcmFkaXVzOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX2NlbnRlclggPSBjZW50ZXIueDtcblx0XHR0aGlzLl9jZW50ZXJZID0gY2VudGVyLnk7XG5cdFx0dGhpcy5fY2VudGVyWiA9IGNlbnRlci56O1xuXHRcdHRoaXMuX3JhZGl1cyA9IHJhZGl1cztcblx0XHR0aGlzLl9hYWJiLndpZHRoID0gdGhpcy5fYWFiYi5oZWlnaHQgPSB0aGlzLl9hYWJiLmRlcHRoID0gcmFkaXVzKjI7XG5cdFx0dGhpcy5fYWFiYi54ID0gdGhpcy5fY2VudGVyWCAtIHJhZGl1cztcblx0XHR0aGlzLl9hYWJiLnkgPSB0aGlzLl9jZW50ZXJZICsgcmFkaXVzO1xuXHRcdHRoaXMuX2FhYmIueiA9IHRoaXMuX2NlbnRlclogLSByYWRpdXM7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNEaXJ0eSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5fcEJvdW5kaW5nRW50aXR5KVxuXHRcdFx0dGhpcy5wVXBkYXRlQm91bmRpbmdFbnRpdHkoKTtcblx0fVxuXG5cdHB1YmxpYyBmcm9tRXh0cmVtZXMobWluWDpudW1iZXIsIG1pblk6bnVtYmVyLCBtaW5aOm51bWJlciwgbWF4WDpudW1iZXIsIG1heFk6bnVtYmVyLCBtYXhaOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX2NlbnRlclggPSAobWF4WCArIG1pblgpKi41O1xuXHRcdHRoaXMuX2NlbnRlclkgPSAobWF4WSArIG1pblkpKi41O1xuXHRcdHRoaXMuX2NlbnRlclogPSAobWF4WiArIG1pblopKi41O1xuXG5cdFx0dmFyIGQ6bnVtYmVyID0gbWF4WCAtIG1pblg7XG5cdFx0dmFyIHk6bnVtYmVyID0gbWF4WSAtIG1pblk7XG5cdFx0dmFyIHo6bnVtYmVyID0gbWF4WiAtIG1pblo7XG5cblx0XHRpZiAoeSA+IGQpXG5cdFx0XHRkID0geTtcblxuXHRcdGlmICh6ID4gZClcblx0XHRcdGQgPSB6O1xuXG5cdFx0dGhpcy5fcmFkaXVzID0gZCpNYXRoLnNxcnQoLjUpO1xuXHRcdHN1cGVyLmZyb21FeHRyZW1lcyhtaW5YLCBtaW5ZLCBtaW5aLCBtYXhYLCBtYXhZLCBtYXhaKTtcblx0fVxuXG5cdHB1YmxpYyBjbG9uZSgpOkJvdW5kaW5nVm9sdW1lQmFzZVxuXHR7XG5cdFx0dmFyIGNsb25lOkJvdW5kaW5nU3BoZXJlID0gbmV3IEJvdW5kaW5nU3BoZXJlKCk7XG5cdFx0Y2xvbmUuZnJvbVNwaGVyZShuZXcgVmVjdG9yM0QodGhpcy5fY2VudGVyWCwgdGhpcy5fY2VudGVyWSwgdGhpcy5fY2VudGVyWiksIHRoaXMuX3JhZGl1cyk7XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9XG5cblx0cHVibGljIHJheUludGVyc2VjdGlvbihwb3NpdGlvbjpWZWN0b3IzRCwgZGlyZWN0aW9uOlZlY3RvcjNELCB0YXJnZXROb3JtYWw6VmVjdG9yM0QpOm51bWJlclxuXHR7XG5cdFx0aWYgKHRoaXMuY29udGFpbnNQb2ludChwb3NpdGlvbikpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBweDpudW1iZXIgPSBwb3NpdGlvbi54IC0gdGhpcy5fY2VudGVyWCwgcHk6bnVtYmVyID0gcG9zaXRpb24ueSAtIHRoaXMuX2NlbnRlclksIHB6Om51bWJlciA9IHBvc2l0aW9uLnogLSB0aGlzLl9jZW50ZXJaO1xuXHRcdHZhciB2eDpudW1iZXIgPSBkaXJlY3Rpb24ueCwgdnk6bnVtYmVyID0gZGlyZWN0aW9uLnksIHZ6Om51bWJlciA9IGRpcmVjdGlvbi56O1xuXHRcdHZhciByYXlFbnRyeURpc3RhbmNlOm51bWJlcjtcblxuXHRcdHZhciBhOm51bWJlciA9IHZ4KnZ4ICsgdnkqdnkgKyB2eip2ejtcblx0XHR2YXIgYjpudW1iZXIgPSAyKiggcHgqdnggKyBweSp2eSArIHB6KnZ6ICk7XG5cdFx0dmFyIGM6bnVtYmVyID0gcHgqcHggKyBweSpweSArIHB6KnB6IC0gdGhpcy5fcmFkaXVzKnRoaXMuX3JhZGl1cztcblx0XHR2YXIgZGV0Om51bWJlciA9IGIqYiAtIDQqYSpjO1xuXG5cdFx0aWYgKGRldCA+PSAwKSB7IC8vIHJheSBnb2VzIHRocm91Z2ggc3BoZXJlXG5cdFx0XHR2YXIgc3FydERldDpudW1iZXIgPSBNYXRoLnNxcnQoZGV0KTtcblx0XHRcdHJheUVudHJ5RGlzdGFuY2UgPSAoIC1iIC0gc3FydERldCApLyggMiphICk7XG5cdFx0XHRpZiAocmF5RW50cnlEaXN0YW5jZSA+PSAwKSB7XG5cdFx0XHRcdHRhcmdldE5vcm1hbC54ID0gcHggKyByYXlFbnRyeURpc3RhbmNlKnZ4O1xuXHRcdFx0XHR0YXJnZXROb3JtYWwueSA9IHB5ICsgcmF5RW50cnlEaXN0YW5jZSp2eTtcblx0XHRcdFx0dGFyZ2V0Tm9ybWFsLnogPSBweiArIHJheUVudHJ5RGlzdGFuY2Uqdno7XG5cdFx0XHRcdHRhcmdldE5vcm1hbC5ub3JtYWxpemUoKTtcblxuXHRcdFx0XHRyZXR1cm4gcmF5RW50cnlEaXN0YW5jZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyByYXkgbWlzc2VzIHNwaGVyZVxuXHRcdHJldHVybiAtMTtcblx0fVxuXG5cdHB1YmxpYyBjb250YWluc1BvaW50KHBvc2l0aW9uOlZlY3RvcjNEKTpib29sZWFuXG5cdHtcblx0XHR2YXIgcHg6bnVtYmVyID0gcG9zaXRpb24ueCAtIHRoaXMuX2NlbnRlclg7XG5cdFx0dmFyIHB5Om51bWJlciA9IHBvc2l0aW9uLnkgLSB0aGlzLl9jZW50ZXJZO1xuXHRcdHZhciBwejpudW1iZXIgPSBwb3NpdGlvbi56IC0gdGhpcy5fY2VudGVyWjtcblx0XHR2YXIgZGlzdGFuY2U6bnVtYmVyID0gTWF0aC5zcXJ0KHB4KnB4ICsgcHkqcHkgKyBweipweik7XG5cdFx0cmV0dXJuIGRpc3RhbmNlIDw9IHRoaXMuX3JhZGl1cztcblx0fVxuXG5cdHB1YmxpYyBwVXBkYXRlQm91bmRpbmdFbnRpdHkoKVxuXHR7XG5cdFx0dmFyIHNjOm51bWJlciA9IHRoaXMuX3JhZGl1cztcblx0XHRpZiAoc2MgPT0gMClcblx0XHRcdHNjID0gMC4wMDE7XG5cblx0XHR2YXIgdHJhbnNmb3JtOlRyYW5zZm9ybSA9IHRoaXMuX3BCb3VuZGluZ0VudGl0eS50cmFuc2Zvcm07XG5cdFx0dHJhbnNmb3JtLnNjYWxlID0gbmV3IFZlY3RvcjNEKHNjLCBzYywgc2MpO1xuXHRcdHRyYW5zZm9ybS5wb3NpdGlvbiA9IG5ldyBWZWN0b3IzRCh0aGlzLl9jZW50ZXJYLCB0aGlzLl9jZW50ZXJZLCB0aGlzLl9jZW50ZXJaKTtcblx0fVxuXG5cdC8vIFRPRE8gcENyZWF0ZUJvdW5kaW5nUmVuZGVyYWJsZSgpOldpcmVmcmFtZVByaW1pdGl2ZUJhc2VcblxuXHRwdWJsaWMgcENyZWF0ZUJvdW5kaW5nRW50aXR5KCk6SUVudGl0eVxuXHR7XG5cdFx0cmV0dXJuIG51bGw7Ly9uZXcgYXdheS5wcmltaXRpdmVzLldpcmVmcmFtZVNwaGVyZSgxLCAxNiwgMTIsIDB4ZmZmZmZmLCAwLjUpO1xuXHR9XG5cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgY2xhc3NpZnlUb1BsYW5lKHBsYW5lOlBsYW5lM0QpOm51bWJlclxuXHR7XG5cdFx0dmFyIGE6bnVtYmVyID0gcGxhbmUuYTtcblx0XHR2YXIgYjpudW1iZXIgPSBwbGFuZS5iO1xuXHRcdHZhciBjOm51bWJlciA9IHBsYW5lLmM7XG5cdFx0dmFyIGRkOm51bWJlciA9IGEqdGhpcy5fY2VudGVyWCArIGIqdGhpcy5fY2VudGVyWSArIGMqdGhpcy5fY2VudGVyWiAtIHBsYW5lLmQ7XG5cblx0XHRpZiAoYSA8IDApXG5cdFx0XHRhID0gLWE7XG5cblx0XHRpZiAoYiA8IDApXG5cdFx0XHRiID0gLWI7XG5cblx0XHRpZiAoYyA8IDApXG5cdFx0XHRjID0gLWM7XG5cblx0XHR2YXIgcnI6TnVtYmVyID0gKGEgKyBiICsgYykqdGhpcy5fcmFkaXVzO1xuXG5cdFx0cmV0dXJuIGRkID4gcnI/IFBsYW5lQ2xhc3NpZmljYXRpb24uRlJPTlQgOiBkZCA8IC1ycj8gUGxhbmVDbGFzc2lmaWNhdGlvbi5CQUNLIDogUGxhbmVDbGFzc2lmaWNhdGlvbi5JTlRFUlNFQ1Q7XG5cdH1cblxuXHRwdWJsaWMgdHJhbnNmb3JtRnJvbShib3VuZHM6Qm91bmRpbmdWb2x1bWVCYXNlLCBtYXRyaXg6TWF0cml4M0QpXG5cdHtcblx0XHR2YXIgc3BoZXJlOkJvdW5kaW5nU3BoZXJlID0gPEJvdW5kaW5nU3BoZXJlPiBib3VuZHM7XG5cdFx0dmFyIGN4Om51bWJlciA9IHNwaGVyZS5fY2VudGVyWDtcblx0XHR2YXIgY3k6bnVtYmVyID0gc3BoZXJlLl9jZW50ZXJZO1xuXHRcdHZhciBjejpudW1iZXIgPSBzcGhlcmUuX2NlbnRlclo7XG5cdFx0dmFyIHJhdzpBcnJheTxudW1iZXI+ID0gbmV3IEFycmF5PG51bWJlcj4oMTYpO1xuXG5cdFx0bWF0cml4LmNvcHlSYXdEYXRhVG8ocmF3KTtcblxuXHRcdHZhciBtMTE6bnVtYmVyID0gcmF3WzBdLCBtMTI6bnVtYmVyID0gcmF3WzRdLCBtMTM6bnVtYmVyID0gcmF3WzhdLCBtMTQ6bnVtYmVyID0gcmF3WzEyXTtcblx0XHR2YXIgbTIxOm51bWJlciA9IHJhd1sxXSwgbTIyOm51bWJlciA9IHJhd1s1XSwgbTIzOm51bWJlciA9IHJhd1s5XSwgbTI0Om51bWJlciA9IHJhd1sxM107XG5cdFx0dmFyIG0zMTpudW1iZXIgPSByYXdbMl0sIG0zMjpudW1iZXIgPSByYXdbNl0sIG0zMzpudW1iZXIgPSByYXdbMTBdLCBtMzQ6bnVtYmVyID0gcmF3WzE0XTtcblxuXHRcdHRoaXMuX2NlbnRlclggPSBjeCptMTEgKyBjeSptMTIgKyBjeiptMTMgKyBtMTQ7XG5cdFx0dGhpcy5fY2VudGVyWSA9IGN4Km0yMSArIGN5Km0yMiArIGN6Km0yMyArIG0yNDtcblx0XHR0aGlzLl9jZW50ZXJaID0gY3gqbTMxICsgY3kqbTMyICsgY3oqbTMzICsgbTM0O1xuXG5cdFx0aWYgKG0xMSA8IDApXG5cdFx0XHRtMTEgPSAtbTExO1xuXHRcdGlmIChtMTIgPCAwKVxuXHRcdFx0bTEyID0gLW0xMjtcblx0XHRpZiAobTEzIDwgMClcblx0XHRcdG0xMyA9IC1tMTM7XG5cdFx0aWYgKG0yMSA8IDApXG5cdFx0XHRtMjEgPSAtbTIxO1xuXHRcdGlmIChtMjIgPCAwKVxuXHRcdFx0bTIyID0gLW0yMjtcblx0XHRpZiAobTIzIDwgMClcblx0XHRcdG0yMyA9IC1tMjM7XG5cdFx0aWYgKG0zMSA8IDApXG5cdFx0XHRtMzEgPSAtbTMxO1xuXHRcdGlmIChtMzIgPCAwKVxuXHRcdFx0bTMyID0gLW0zMjtcblx0XHRpZiAobTMzIDwgMClcblx0XHRcdG0zMyA9IC1tMzM7XG5cblx0XHR2YXIgcjpudW1iZXIgPSBzcGhlcmUuX3JhZGl1cztcblx0XHR2YXIgcng6bnVtYmVyID0gbTExICsgbTEyICsgbTEzO1xuXHRcdHZhciByeTpudW1iZXIgPSBtMjEgKyBtMjIgKyBtMjM7XG5cdFx0dmFyIHJ6Om51bWJlciA9IG0zMSArIG0zMiArIG0zMztcblx0XHR0aGlzLl9yYWRpdXMgPSByKk1hdGguc3FydChyeCpyeCArIHJ5KnJ5ICsgcnoqcnopO1xuXG5cdFx0dGhpcy5fYWFiYi53aWR0aCA9IHRoaXMuX2FhYmIuaGVpZ2h0ID0gdGhpcy5fYWFiYi5kZXB0aCA9IHRoaXMuX3JhZGl1cyoyO1xuXHRcdHRoaXMuX2FhYmIueCA9IHRoaXMuX2NlbnRlclggLSB0aGlzLl9yYWRpdXM7XG5cdFx0dGhpcy5fYWFiYi55ID0gdGhpcy5fY2VudGVyWSArIHRoaXMuX3JhZGl1cztcblx0XHR0aGlzLl9hYWJiLnogPSB0aGlzLl9jZW50ZXJaIC0gdGhpcy5fcmFkaXVzO1xuXHR9XG59XG5cbmV4cG9ydCA9IEJvdW5kaW5nU3BoZXJlOyJdfQ== \ No newline at end of file diff --git a/lib/bounds/BoundingSphere.ts b/lib/bounds/BoundingSphere.ts new file mode 100644 index 00000000..47188ed4 --- /dev/null +++ b/lib/bounds/BoundingSphere.ts @@ -0,0 +1,225 @@ +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +import PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Transform = require("awayjs-core/lib/core/geom/Transform"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +class BoundingSphere extends BoundingVolumeBase +{ + + private _radius:number = 0; + private _centerX:number = 0; + private _centerY:number = 0; + private _centerZ:number = 0; + + constructor() + { + super(); + } + + public get radius():number + { + return this._radius; + } + + public nullify() + { + super.nullify(); + this._centerX = this._centerY = this._centerZ = 0; + this._radius = 0; + } + + public isInFrustum(planes:Array, numPlanes:number):boolean + { + for (var i:number = 0; i < numPlanes; ++i) { + var plane:Plane3D = planes[i]; + var flippedExtentX:number = plane.a < 0? -this._radius : this._radius; + var flippedExtentY:number = plane.b < 0? -this._radius : this._radius; + var flippedExtentZ:number = plane.c < 0? -this._radius : this._radius; + var projDist:number = plane.a*( this._centerX + flippedExtentX ) + plane.b*( this._centerY + flippedExtentY) + plane.c*( this._centerZ + flippedExtentZ ) - plane.d; + if (projDist < 0) { + return false; + } + } + return true; + } + + public fromSphere(center:Vector3D, radius:number) + { + this._centerX = center.x; + this._centerY = center.y; + this._centerZ = center.z; + this._radius = radius; + this._aabb.width = this._aabb.height = this._aabb.depth = radius*2; + this._aabb.x = this._centerX - radius; + this._aabb.y = this._centerY + radius; + this._aabb.z = this._centerZ - radius; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + } + + public fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number) + { + this._centerX = (maxX + minX)*.5; + this._centerY = (maxY + minY)*.5; + this._centerZ = (maxZ + minZ)*.5; + + var d:number = maxX - minX; + var y:number = maxY - minY; + var z:number = maxZ - minZ; + + if (y > d) + d = y; + + if (z > d) + d = z; + + this._radius = d*Math.sqrt(.5); + super.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); + } + + public clone():BoundingVolumeBase + { + var clone:BoundingSphere = new BoundingSphere(); + clone.fromSphere(new Vector3D(this._centerX, this._centerY, this._centerZ), this._radius); + return clone; + } + + public rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number + { + if (this.containsPoint(position)) { + return 0; + } + + var px:number = position.x - this._centerX, py:number = position.y - this._centerY, pz:number = position.z - this._centerZ; + var vx:number = direction.x, vy:number = direction.y, vz:number = direction.z; + var rayEntryDistance:number; + + var a:number = vx*vx + vy*vy + vz*vz; + var b:number = 2*( px*vx + py*vy + pz*vz ); + var c:number = px*px + py*py + pz*pz - this._radius*this._radius; + var det:number = b*b - 4*a*c; + + if (det >= 0) { // ray goes through sphere + var sqrtDet:number = Math.sqrt(det); + rayEntryDistance = ( -b - sqrtDet )/( 2*a ); + if (rayEntryDistance >= 0) { + targetNormal.x = px + rayEntryDistance*vx; + targetNormal.y = py + rayEntryDistance*vy; + targetNormal.z = pz + rayEntryDistance*vz; + targetNormal.normalize(); + + return rayEntryDistance; + } + } + + // ray misses sphere + return -1; + } + + public containsPoint(position:Vector3D):boolean + { + var px:number = position.x - this._centerX; + var py:number = position.y - this._centerY; + var pz:number = position.z - this._centerZ; + var distance:number = Math.sqrt(px*px + py*py + pz*pz); + return distance <= this._radius; + } + + public pUpdateBoundingEntity() + { + var sc:number = this._radius; + if (sc == 0) + sc = 0.001; + + var transform:Transform = this._pBoundingEntity.transform; + transform.scale = new Vector3D(sc, sc, sc); + transform.position = new Vector3D(this._centerX, this._centerY, this._centerZ); + } + + // TODO pCreateBoundingRenderable():WireframePrimitiveBase + + public pCreateBoundingEntity():IEntity + { + return null;//new away.primitives.WireframeSphere(1, 16, 12, 0xffffff, 0.5); + } + + + //@override + public classifyToPlane(plane:Plane3D):number + { + var a:number = plane.a; + var b:number = plane.b; + var c:number = plane.c; + var dd:number = a*this._centerX + b*this._centerY + c*this._centerZ - plane.d; + + if (a < 0) + a = -a; + + if (b < 0) + b = -b; + + if (c < 0) + c = -c; + + var rr:Number = (a + b + c)*this._radius; + + return dd > rr? PlaneClassification.FRONT : dd < -rr? PlaneClassification.BACK : PlaneClassification.INTERSECT; + } + + public transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D) + { + var sphere:BoundingSphere = bounds; + var cx:number = sphere._centerX; + var cy:number = sphere._centerY; + var cz:number = sphere._centerZ; + var raw:Array = new Array(16); + + matrix.copyRawDataTo(raw); + + var m11:number = raw[0], m12:number = raw[4], m13:number = raw[8], m14:number = raw[12]; + var m21:number = raw[1], m22:number = raw[5], m23:number = raw[9], m24:number = raw[13]; + var m31:number = raw[2], m32:number = raw[6], m33:number = raw[10], m34:number = raw[14]; + + this._centerX = cx*m11 + cy*m12 + cz*m13 + m14; + this._centerY = cx*m21 + cy*m22 + cz*m23 + m24; + this._centerZ = cx*m31 + cy*m32 + cz*m33 + m34; + + if (m11 < 0) + m11 = -m11; + if (m12 < 0) + m12 = -m12; + if (m13 < 0) + m13 = -m13; + if (m21 < 0) + m21 = -m21; + if (m22 < 0) + m22 = -m22; + if (m23 < 0) + m23 = -m23; + if (m31 < 0) + m31 = -m31; + if (m32 < 0) + m32 = -m32; + if (m33 < 0) + m33 = -m33; + + var r:number = sphere._radius; + var rx:number = m11 + m12 + m13; + var ry:number = m21 + m22 + m23; + var rz:number = m31 + m32 + m33; + this._radius = r*Math.sqrt(rx*rx + ry*ry + rz*rz); + + this._aabb.width = this._aabb.height = this._aabb.depth = this._radius*2; + this._aabb.x = this._centerX - this._radius; + this._aabb.y = this._centerY + this._radius; + this._aabb.z = this._centerZ - this._radius; + } +} + +export = BoundingSphere; \ No newline at end of file diff --git a/lib/bounds/BoundingVolumeBase.js b/lib/bounds/BoundingVolumeBase.js new file mode 100755 index 00000000..7d86b58a --- /dev/null +++ b/lib/bounds/BoundingVolumeBase.js @@ -0,0 +1,245 @@ +var Box = require("awayjs-core/lib/core/geom/Box"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var BoundingVolumeBase = (function () { + function BoundingVolumeBase() { + this._pAabbPoints = new Array(); + this._pAabbPointsDirty = true; + this._aabb = new Box(); + } + Object.defineProperty(BoundingVolumeBase.prototype, "aabb", { + get: function () { + return this._aabb; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BoundingVolumeBase.prototype, "aabbPoints", { + get: function () { + if (this._pAabbPointsDirty) + this.pUpdateAABBPoints(); + + return this._pAabbPoints; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BoundingVolumeBase.prototype, "boundingEntity", { + get: function () { + if (!this._pBoundingEntity) { + this._pBoundingEntity = this.pCreateBoundingEntity(); + this.pUpdateBoundingEntity(); + } + + return this._pBoundingEntity; + }, + enumerable: true, + configurable: true + }); + + BoundingVolumeBase.prototype.nullify = function () { + this._aabb.x = this._aabb.y = this._aabb.z = 0; + this._aabb.width = this._aabb.height = this._aabb.depth = 0; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + }; + + BoundingVolumeBase.prototype.disposeRenderable = function () { + if (this._pBoundingEntity) + this._pBoundingEntity.dispose(); + + this._pBoundingEntity = null; + }; + + BoundingVolumeBase.prototype.fromVertices = function (vertices) { + var i; + var len = vertices.length; + var minX, minY, minZ; + var maxX, maxY, maxZ; + + if (len == 0) { + this.nullify(); + return; + } + + var v; + + minX = maxX = vertices[i++]; + minY = maxY = vertices[i++]; + minZ = maxZ = vertices[i++]; + + while (i < len) { + v = vertices[i++]; + if (v < minX) + minX = v; + else if (v > maxX) + maxX = v; + v = vertices[i++]; + if (v < minY) + minY = v; + else if (v > maxY) + maxY = v; + v = vertices[i++]; + if (v < minZ) + minZ = v; + else if (v > maxZ) + maxZ = v; + } + + this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); + }; + + /** + * Updates the bounds to fit a Geometry object. + * + * @param geometry The Geometry object to be bounded. + */ + BoundingVolumeBase.prototype.fromGeometry = function (geometry) { + var i, j, p; + var subGeoms = geometry.subGeometries; + var subGeom; + var boundingPositions; + var numSubGeoms = subGeoms.length; + var minX, minY, minZ; + var maxX, maxY, maxZ; + + if (numSubGeoms > 0) { + i = 0; + subGeom = subGeoms[0]; + boundingPositions = subGeom.getBoundingPositions(); + minX = maxX = boundingPositions[i]; + minY = maxY = boundingPositions[i + 1]; + minZ = maxZ = boundingPositions[i + 2]; + + j = numSubGeoms; + while (j--) { + subGeom = subGeoms[j]; + boundingPositions = subGeom.getBoundingPositions(); + i = boundingPositions.length; + while (i--) { + p = boundingPositions[i]; + if (p < minX) + minX = p; + else if (p > maxX) + maxX = p; + + p = boundingPositions[i + 1]; + + if (p < minY) + minY = p; + else if (p > maxY) + maxY = p; + + p = boundingPositions[i + 2]; + + if (p < minZ) + minZ = p; + else if (p > maxZ) + maxZ = p; + } + } + + this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); + } else { + this.fromExtremes(0, 0, 0, 0, 0, 0); + } + }; + + BoundingVolumeBase.prototype.fromSphere = function (center, radius) { + this.fromExtremes(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius); + }; + + BoundingVolumeBase.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { + this._aabb.x = minX; + this._aabb.y = maxY; + this._aabb.z = minZ; + this._aabb.width = maxX - minX; + this._aabb.height = maxY - minY; + this._aabb.depth = maxZ - minZ; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + }; + + BoundingVolumeBase.prototype.isInFrustum = function (planes, numPlanes) { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.overlaps = function (bounds) { + return this._aabb.intersects(bounds.aabb); + }; + + BoundingVolumeBase.prototype.clone = function () { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.rayIntersection = function (position, direction, targetNormal) { + return -1; + }; + + BoundingVolumeBase.prototype.containsPoint = function (position) { + return false; + }; + + BoundingVolumeBase.prototype.pUpdateAABBPoints = function () { + var minX = this._aabb.x; + var minY = this._aabb.y - this._aabb.height; + var minZ = this._aabb.z; + var maxX = this._aabb.x + this._aabb.width; + var maxY = this._aabb.y; + var maxZ = this._aabb.z + this._aabb.depth; + + this._pAabbPoints[0] = minX; + this._pAabbPoints[1] = minY; + this._pAabbPoints[2] = minZ; + this._pAabbPoints[3] = maxX; + this._pAabbPoints[4] = minY; + this._pAabbPoints[5] = minZ; + this._pAabbPoints[6] = minX; + this._pAabbPoints[7] = maxY; + this._pAabbPoints[8] = minZ; + this._pAabbPoints[9] = maxX; + this._pAabbPoints[10] = maxY; + this._pAabbPoints[11] = minZ; + this._pAabbPoints[12] = minX; + this._pAabbPoints[13] = minY; + this._pAabbPoints[14] = maxZ; + this._pAabbPoints[15] = maxX; + this._pAabbPoints[16] = minY; + this._pAabbPoints[17] = maxZ; + this._pAabbPoints[18] = minX; + this._pAabbPoints[19] = maxY; + this._pAabbPoints[20] = maxZ; + this._pAabbPoints[21] = maxX; + this._pAabbPoints[22] = maxY; + this._pAabbPoints[23] = maxZ; + this._pAabbPointsDirty = false; + }; + + BoundingVolumeBase.prototype.pUpdateBoundingEntity = function () { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.pCreateBoundingEntity = function () { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.classifyToPlane = function (plane) { + throw new AbstractMethodError(); + }; + + BoundingVolumeBase.prototype.transformFrom = function (bounds, matrix) { + throw new AbstractMethodError(); + }; + return BoundingVolumeBase; +})(); + +module.exports = BoundingVolumeBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvdW5kcy9Cb3VuZGluZ1ZvbHVtZUJhc2UudHMiXSwibmFtZXMiOlsiQm91bmRpbmdWb2x1bWVCYXNlIiwiQm91bmRpbmdWb2x1bWVCYXNlLmNvbnN0cnVjdG9yIiwiQm91bmRpbmdWb2x1bWVCYXNlLm51bGxpZnkiLCJCb3VuZGluZ1ZvbHVtZUJhc2UuZGlzcG9zZVJlbmRlcmFibGUiLCJCb3VuZGluZ1ZvbHVtZUJhc2UuZnJvbVZlcnRpY2VzIiwiQm91bmRpbmdWb2x1bWVCYXNlLmZyb21HZW9tZXRyeSIsIkJvdW5kaW5nVm9sdW1lQmFzZS5mcm9tU3BoZXJlIiwiQm91bmRpbmdWb2x1bWVCYXNlLmZyb21FeHRyZW1lcyIsIkJvdW5kaW5nVm9sdW1lQmFzZS5pc0luRnJ1c3R1bSIsIkJvdW5kaW5nVm9sdW1lQmFzZS5vdmVybGFwcyIsIkJvdW5kaW5nVm9sdW1lQmFzZS5jbG9uZSIsIkJvdW5kaW5nVm9sdW1lQmFzZS5yYXlJbnRlcnNlY3Rpb24iLCJCb3VuZGluZ1ZvbHVtZUJhc2UuY29udGFpbnNQb2ludCIsIkJvdW5kaW5nVm9sdW1lQmFzZS5wVXBkYXRlQUFCQlBvaW50cyIsIkJvdW5kaW5nVm9sdW1lQmFzZS5wVXBkYXRlQm91bmRpbmdFbnRpdHkiLCJCb3VuZGluZ1ZvbHVtZUJhc2UucENyZWF0ZUJvdW5kaW5nRW50aXR5IiwiQm91bmRpbmdWb2x1bWVCYXNlLmNsYXNzaWZ5VG9QbGFuZSIsIkJvdW5kaW5nVm9sdW1lQmFzZS50cmFuc2Zvcm1Gcm9tIl0sIm1hcHBpbmdzIjoiQUFBQSxrREFFNEQ7O0FBSzVELCtFQUFxRjs7QUFFckY7SUFPQ0E7UUFKQUMsS0FBT0EsWUFBWUEsR0FBaUJBLElBQUlBLEtBQUtBLENBQVNBLENBQUNBLENBQUNBO1FBQ3hEQSxLQUFPQSxpQkFBaUJBLEdBQVdBLElBQUlBLENBQUNBO1FBS3ZDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQTtJQUN2QkEsQ0FBQ0E7SUFFREQ7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SUFBSUEsR0FBVUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0E7O1FBRWpEQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDM0JBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBO1FBQzNCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDM0JBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBO1FBQzNCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDM0JBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBO1FBQzNCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDNUJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBO1FBQzVCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUM1QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDNUJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBO1FBQzVCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUM1QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDNUJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBO1FBQzVCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUM1QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDNUJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBO1FBQzVCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUM1QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDNUJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBO1FBQzVCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLEtBQUtBO0lBQy9CQSxDQUFDQTs7SUFFRGIscURBQUFBO1FBRUNjLE1BQU1BLElBQUlBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7SUFDaENBLENBQUNBOztJQUVEZCxxREFBQUE7UUFFQ2UsTUFBTUEsSUFBSUEsbUJBQW1CQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7O0lBRURmLCtDQUFBQSxVQUF1QkEsS0FBYUE7UUFFbkNnQixNQUFNQSxJQUFJQSxtQkFBbUJBLENBQUNBLENBQUNBO0lBQ2hDQSxDQUFDQTs7SUFFRGhCLDZDQUFBQSxVQUFxQkEsTUFBeUJBLEVBQUVBLE1BQWVBO1FBRTlEaUIsTUFBTUEsSUFBSUEsbUJBQW1CQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7SUFDRmpCLDBCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELG1DQUE0QixDQUFBIiwiZmlsZSI6ImJvdW5kcy9Cb3VuZGluZ1ZvbHVtZUJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR2VvbWV0cnlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0dlb21ldHJ5XCIpO1xuaW1wb3J0IFN1Ykdlb21ldHJ5QmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9TdWJHZW9tZXRyeUJhc2VcIik7XG5pbXBvcnQgQm94XHRcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL0JveFwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RcIik7XG5pbXBvcnQgUGxhbmUzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUGxhbmUzRFwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9JRW50aXR5XCIpO1xuaW1wb3J0IEFic3RyYWN0TWV0aG9kRXJyb3JcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Fic3RyYWN0TWV0aG9kRXJyb3JcIik7XG5cbmNsYXNzIEJvdW5kaW5nVm9sdW1lQmFzZVxue1xuXHRwdWJsaWMgX2FhYmI6Qm94O1xuXHRwdWJsaWMgX3BBYWJiUG9pbnRzOkFycmF5PG51bWJlcj4gPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXHRwdWJsaWMgX3BBYWJiUG9pbnRzRGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cdHB1YmxpYyBfcEJvdW5kaW5nRW50aXR5OklFbnRpdHk7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5fYWFiYiA9IG5ldyBCb3goKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgYWFiYigpOkJveFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2FhYmI7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGFhYmJQb2ludHMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRpZiAodGhpcy5fcEFhYmJQb2ludHNEaXJ0eSlcblx0XHRcdHRoaXMucFVwZGF0ZUFBQkJQb2ludHMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9wQWFiYlBvaW50cztcblx0fVxuXG5cdHB1YmxpYyBnZXQgYm91bmRpbmdFbnRpdHkoKTpJRW50aXR5XG5cdHtcblx0XHRpZiAoIXRoaXMuX3BCb3VuZGluZ0VudGl0eSkge1xuXHRcdFx0dGhpcy5fcEJvdW5kaW5nRW50aXR5ID0gdGhpcy5wQ3JlYXRlQm91bmRpbmdFbnRpdHkoKTtcblx0XHRcdHRoaXMucFVwZGF0ZUJvdW5kaW5nRW50aXR5KCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX3BCb3VuZGluZ0VudGl0eTtcblx0fVxuXG5cdHB1YmxpYyBudWxsaWZ5KClcblx0e1xuXHRcdHRoaXMuX2FhYmIueCA9IHRoaXMuX2FhYmIueSA9IHRoaXMuX2FhYmIueiA9IDA7XG5cdFx0dGhpcy5fYWFiYi53aWR0aCA9IHRoaXMuX2FhYmIuaGVpZ2h0ID0gdGhpcy5fYWFiYi5kZXB0aCA9IDA7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNEaXJ0eSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5fcEJvdW5kaW5nRW50aXR5KVxuXHRcdFx0dGhpcy5wVXBkYXRlQm91bmRpbmdFbnRpdHkoKTtcblx0fVxuXG5cdHB1YmxpYyBkaXNwb3NlUmVuZGVyYWJsZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fcEJvdW5kaW5nRW50aXR5KVxuXHRcdFx0dGhpcy5fcEJvdW5kaW5nRW50aXR5LmRpc3Bvc2UoKTtcblxuXHRcdHRoaXMuX3BCb3VuZGluZ0VudGl0eSA9IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgZnJvbVZlcnRpY2VzKHZlcnRpY2VzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGxlbjpudW1iZXIgPSB2ZXJ0aWNlcy5sZW5ndGg7XG5cdFx0dmFyIG1pblg6bnVtYmVyLCBtaW5ZOm51bWJlciwgbWluWjpudW1iZXI7XG5cdFx0dmFyIG1heFg6bnVtYmVyLCBtYXhZOm51bWJlciwgbWF4WjpudW1iZXI7XG5cblx0XHRpZiAobGVuID09IDApIHtcblx0XHRcdHRoaXMubnVsbGlmeSgpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciB2Om51bWJlcjtcblxuXHRcdG1pblggPSBtYXhYID0gdmVydGljZXNbaSsrXTtcblx0XHRtaW5ZID0gbWF4WSA9IHZlcnRpY2VzW2krK107XG5cdFx0bWluWiA9IG1heFogPSB2ZXJ0aWNlc1tpKytdO1xuXG5cdFx0d2hpbGUgKGkgPCBsZW4pIHtcblx0XHRcdHYgPSB2ZXJ0aWNlc1tpKytdO1xuXHRcdFx0aWYgKHYgPCBtaW5YKVxuXHRcdFx0XHRtaW5YID0gdjsgZWxzZSBpZiAodiA+IG1heFgpXG5cdFx0XHRcdG1heFggPSB2O1xuXHRcdFx0diA9IHZlcnRpY2VzW2krK107XG5cdFx0XHRpZiAodiA8IG1pblkpXG5cdFx0XHRcdG1pblkgPSB2OyBlbHNlIGlmICh2ID4gbWF4WSlcblx0XHRcdFx0bWF4WSA9IHY7XG5cdFx0XHR2ID0gdmVydGljZXNbaSsrXTtcblx0XHRcdGlmICh2IDwgbWluWilcblx0XHRcdFx0bWluWiA9IHY7IGVsc2UgaWYgKHYgPiBtYXhaKVxuXHRcdFx0XHRtYXhaID0gdjtcblx0XHR9XG5cblx0XHR0aGlzLmZyb21FeHRyZW1lcyhtaW5YLCBtaW5ZLCBtaW5aLCBtYXhYLCBtYXhZLCBtYXhaKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBib3VuZHMgdG8gZml0IGEgR2VvbWV0cnkgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gZ2VvbWV0cnkgVGhlIEdlb21ldHJ5IG9iamVjdCB0byBiZSBib3VuZGVkLlxuXHQgKi9cblx0cHVibGljIGZyb21HZW9tZXRyeShnZW9tZXRyeTpHZW9tZXRyeSk6dm9pZFxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyLCBqOm51bWJlciwgcDpudW1iZXI7XG5cdFx0dmFyIHN1Ykdlb21zOkFycmF5PFN1Ykdlb21ldHJ5QmFzZT4gPSBnZW9tZXRyeS5zdWJHZW9tZXRyaWVzO1xuXHRcdHZhciBzdWJHZW9tOlN1Ykdlb21ldHJ5QmFzZTtcblx0XHR2YXIgYm91bmRpbmdQb3NpdGlvbnM6QXJyYXk8bnVtYmVyPjtcblx0XHR2YXIgbnVtU3ViR2VvbXM6bnVtYmVyID0gc3ViR2VvbXMubGVuZ3RoO1xuXHRcdHZhciBtaW5YOm51bWJlciwgbWluWTpudW1iZXIsIG1pblo6bnVtYmVyO1xuXHRcdHZhciBtYXhYOm51bWJlciwgbWF4WTpudW1iZXIsIG1heFo6bnVtYmVyO1xuXG5cdFx0aWYgKG51bVN1Ykdlb21zID4gMCkge1xuXHRcdFx0aSA9IDA7XG5cdFx0XHRzdWJHZW9tID0gc3ViR2VvbXNbMF07XG5cdFx0XHRib3VuZGluZ1Bvc2l0aW9ucyA9IHN1Ykdlb20uZ2V0Qm91bmRpbmdQb3NpdGlvbnMoKTtcblx0XHRcdG1pblggPSBtYXhYID0gYm91bmRpbmdQb3NpdGlvbnNbaV07XG5cdFx0XHRtaW5ZID0gbWF4WSA9IGJvdW5kaW5nUG9zaXRpb25zW2kgKyAxXTtcblx0XHRcdG1pblogPSBtYXhaID0gYm91bmRpbmdQb3NpdGlvbnNbaSArIDJdO1xuXG5cdFx0XHRqID0gbnVtU3ViR2VvbXM7XG5cdFx0XHR3aGlsZSAoai0tKSB7XG5cdFx0XHRcdHN1Ykdlb20gPSBzdWJHZW9tc1tqXTtcblx0XHRcdFx0Ym91bmRpbmdQb3NpdGlvbnMgPSBzdWJHZW9tLmdldEJvdW5kaW5nUG9zaXRpb25zKCk7XG5cdFx0XHRcdGkgPSBib3VuZGluZ1Bvc2l0aW9ucy5sZW5ndGg7XG5cdFx0XHRcdHdoaWxlIChpLS0pIHtcblx0XHRcdFx0XHRwID0gYm91bmRpbmdQb3NpdGlvbnNbaV07XG5cdFx0XHRcdFx0aWYgKHAgPCBtaW5YKVxuXHRcdFx0XHRcdFx0bWluWCA9IHA7XG5cdFx0XHRcdFx0ZWxzZSBpZiAocCA+IG1heFgpXG5cdFx0XHRcdFx0XHRtYXhYID0gcDtcblxuXHRcdFx0XHRcdHAgPSBib3VuZGluZ1Bvc2l0aW9uc1tpICsgMV07XG5cblx0XHRcdFx0XHRpZiAocCA8IG1pblkpXG5cdFx0XHRcdFx0XHRtaW5ZID0gcDtcblx0XHRcdFx0XHRlbHNlIGlmIChwID4gbWF4WSlcblx0XHRcdFx0XHRcdG1heFkgPSBwO1xuXG5cdFx0XHRcdFx0cCA9IGJvdW5kaW5nUG9zaXRpb25zW2kgKyAyXTtcblxuXHRcdFx0XHRcdGlmIChwIDwgbWluWilcblx0XHRcdFx0XHRcdG1pblogPSBwO1xuXHRcdFx0XHRcdGVsc2UgaWYgKHAgPiBtYXhaKVxuXHRcdFx0XHRcdFx0bWF4WiA9IHA7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5mcm9tRXh0cmVtZXMobWluWCwgbWluWSwgbWluWiwgbWF4WCwgbWF4WSwgbWF4Wik7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZnJvbUV4dHJlbWVzKDAsIDAsIDAsIDAsIDAsIDApO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmcm9tU3BoZXJlKGNlbnRlcjpWZWN0b3IzRCwgcmFkaXVzOm51bWJlcilcblx0e1xuXHRcdHRoaXMuZnJvbUV4dHJlbWVzKGNlbnRlci54IC0gcmFkaXVzLCBjZW50ZXIueSAtIHJhZGl1cywgY2VudGVyLnogLSByYWRpdXMsIGNlbnRlci54ICsgcmFkaXVzLCBjZW50ZXIueSArIHJhZGl1cywgY2VudGVyLnogKyByYWRpdXMpO1xuXHR9XG5cblx0cHVibGljIGZyb21FeHRyZW1lcyhtaW5YOm51bWJlciwgbWluWTpudW1iZXIsIG1pblo6bnVtYmVyLCBtYXhYOm51bWJlciwgbWF4WTpudW1iZXIsIG1heFo6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fYWFiYi54ID0gbWluWDtcblx0XHR0aGlzLl9hYWJiLnkgPSBtYXhZO1xuXHRcdHRoaXMuX2FhYmIueiA9IG1pblo7XG5cdFx0dGhpcy5fYWFiYi53aWR0aCA9IG1heFggLSBtaW5YO1xuXHRcdHRoaXMuX2FhYmIuaGVpZ2h0ID0gbWF4WSAtIG1pblk7XG5cdFx0dGhpcy5fYWFiYi5kZXB0aCA9IG1heFogLSBtaW5aO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKHRoaXMuX3BCb3VuZGluZ0VudGl0eSlcblx0XHRcdHRoaXMucFVwZGF0ZUJvdW5kaW5nRW50aXR5KCk7XG5cdH1cblxuXHRwdWJsaWMgaXNJbkZydXN0dW0ocGxhbmVzOkFycmF5PFBsYW5lM0Q+LCBudW1QbGFuZXM6bnVtYmVyKTpib29sZWFuXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0cHVibGljIG92ZXJsYXBzKGJvdW5kczpCb3VuZGluZ1ZvbHVtZUJhc2UpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9hYWJiLmludGVyc2VjdHMoYm91bmRzLmFhYmIpO1xuXHR9XG5cblx0cHVibGljIGNsb25lKCk6Qm91bmRpbmdWb2x1bWVCYXNlXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0cHVibGljIHJheUludGVyc2VjdGlvbihwb3NpdGlvbjpWZWN0b3IzRCwgZGlyZWN0aW9uOlZlY3RvcjNELCB0YXJnZXROb3JtYWw6VmVjdG9yM0QpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIC0xO1xuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zUG9pbnQocG9zaXRpb246VmVjdG9yM0QpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBwVXBkYXRlQUFCQlBvaW50cygpXG5cdHtcblx0XHR2YXIgbWluWDpudW1iZXIgPSB0aGlzLl9hYWJiLng7XG5cdFx0dmFyIG1pblk6bnVtYmVyID0gdGhpcy5fYWFiYi55IC0gdGhpcy5fYWFiYi5oZWlnaHQ7XG5cdFx0dmFyIG1pblo6bnVtYmVyID0gdGhpcy5fYWFiYi56O1xuXHRcdHZhciBtYXhYOm51bWJlciA9IHRoaXMuX2FhYmIueCArIHRoaXMuX2FhYmIud2lkdGg7XG5cdFx0dmFyIG1heFk6bnVtYmVyID0gdGhpcy5fYWFiYi55O1xuXHRcdHZhciBtYXhaOm51bWJlciA9IHRoaXMuX2FhYmIueiArIHRoaXMuX2FhYmIuZGVwdGg7XG5cblx0XHR0aGlzLl9wQWFiYlBvaW50c1swXSA9IG1pblg7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNbMV0gPSBtaW5ZO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzWzJdID0gbWluWjtcblx0XHR0aGlzLl9wQWFiYlBvaW50c1szXSA9IG1heFg7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNbNF0gPSBtaW5ZO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzWzVdID0gbWluWjtcblx0XHR0aGlzLl9wQWFiYlBvaW50c1s2XSA9IG1pblg7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNbN10gPSBtYXhZO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzWzhdID0gbWluWjtcblx0XHR0aGlzLl9wQWFiYlBvaW50c1s5XSA9IG1heFg7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNbMTBdID0gbWF4WTtcblx0XHR0aGlzLl9wQWFiYlBvaW50c1sxMV0gPSBtaW5aO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzWzEyXSA9IG1pblg7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNbMTNdID0gbWluWTtcblx0XHR0aGlzLl9wQWFiYlBvaW50c1sxNF0gPSBtYXhaO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzWzE1XSA9IG1heFg7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNbMTZdID0gbWluWTtcblx0XHR0aGlzLl9wQWFiYlBvaW50c1sxN10gPSBtYXhaO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzWzE4XSA9IG1pblg7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNbMTldID0gbWF4WTtcblx0XHR0aGlzLl9wQWFiYlBvaW50c1syMF0gPSBtYXhaO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzWzIxXSA9IG1heFg7XG5cdFx0dGhpcy5fcEFhYmJQb2ludHNbMjJdID0gbWF4WTtcblx0XHR0aGlzLl9wQWFiYlBvaW50c1syM10gPSBtYXhaO1xuXHRcdHRoaXMuX3BBYWJiUG9pbnRzRGlydHkgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBwVXBkYXRlQm91bmRpbmdFbnRpdHkoKVxuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdHB1YmxpYyBwQ3JlYXRlQm91bmRpbmdFbnRpdHkoKTpJRW50aXR5XG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0cHVibGljIGNsYXNzaWZ5VG9QbGFuZShwbGFuZTpQbGFuZTNEKTpudW1iZXJcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHRwdWJsaWMgdHJhbnNmb3JtRnJvbShib3VuZHM6Qm91bmRpbmdWb2x1bWVCYXNlLCBtYXRyaXg6TWF0cml4M0QpXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG59XG5cbmV4cG9ydCA9IEJvdW5kaW5nVm9sdW1lQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/bounds/BoundingVolumeBase.ts b/lib/bounds/BoundingVolumeBase.ts new file mode 100644 index 00000000..3028c53c --- /dev/null +++ b/lib/bounds/BoundingVolumeBase.ts @@ -0,0 +1,257 @@ +import Geometry = require("awayjs-core/lib/core/base/Geometry"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import Box = require("awayjs-core/lib/core/geom/Box"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +class BoundingVolumeBase +{ + public _aabb:Box; + public _pAabbPoints:Array = new Array(); + public _pAabbPointsDirty:boolean = true; + public _pBoundingEntity:IEntity; + + constructor() + { + this._aabb = new Box(); + } + + public get aabb():Box + { + return this._aabb; + } + + public get aabbPoints():Array + { + if (this._pAabbPointsDirty) + this.pUpdateAABBPoints(); + + return this._pAabbPoints; + } + + public get boundingEntity():IEntity + { + if (!this._pBoundingEntity) { + this._pBoundingEntity = this.pCreateBoundingEntity(); + this.pUpdateBoundingEntity(); + } + + return this._pBoundingEntity; + } + + public nullify() + { + this._aabb.x = this._aabb.y = this._aabb.z = 0; + this._aabb.width = this._aabb.height = this._aabb.depth = 0; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + } + + public disposeRenderable() + { + if (this._pBoundingEntity) + this._pBoundingEntity.dispose(); + + this._pBoundingEntity = null; + } + + public fromVertices(vertices:Array) + { + var i:number; + var len:number = vertices.length; + var minX:number, minY:number, minZ:number; + var maxX:number, maxY:number, maxZ:number; + + if (len == 0) { + this.nullify(); + return; + } + + var v:number; + + minX = maxX = vertices[i++]; + minY = maxY = vertices[i++]; + minZ = maxZ = vertices[i++]; + + while (i < len) { + v = vertices[i++]; + if (v < minX) + minX = v; else if (v > maxX) + maxX = v; + v = vertices[i++]; + if (v < minY) + minY = v; else if (v > maxY) + maxY = v; + v = vertices[i++]; + if (v < minZ) + minZ = v; else if (v > maxZ) + maxZ = v; + } + + this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); + } + + /** + * Updates the bounds to fit a Geometry object. + * + * @param geometry The Geometry object to be bounded. + */ + public fromGeometry(geometry:Geometry):void + { + var i:number, j:number, p:number; + var subGeoms:Array = geometry.subGeometries; + var subGeom:SubGeometryBase; + var boundingPositions:Array; + var numSubGeoms:number = subGeoms.length; + var minX:number, minY:number, minZ:number; + var maxX:number, maxY:number, maxZ:number; + + if (numSubGeoms > 0) { + i = 0; + subGeom = subGeoms[0]; + boundingPositions = subGeom.getBoundingPositions(); + minX = maxX = boundingPositions[i]; + minY = maxY = boundingPositions[i + 1]; + minZ = maxZ = boundingPositions[i + 2]; + + j = numSubGeoms; + while (j--) { + subGeom = subGeoms[j]; + boundingPositions = subGeom.getBoundingPositions(); + i = boundingPositions.length; + while (i--) { + p = boundingPositions[i]; + if (p < minX) + minX = p; + else if (p > maxX) + maxX = p; + + p = boundingPositions[i + 1]; + + if (p < minY) + minY = p; + else if (p > maxY) + maxY = p; + + p = boundingPositions[i + 2]; + + if (p < minZ) + minZ = p; + else if (p > maxZ) + maxZ = p; + } + } + + this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); + } else { + this.fromExtremes(0, 0, 0, 0, 0, 0); + } + } + + public fromSphere(center:Vector3D, radius:number) + { + this.fromExtremes(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius); + } + + public fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number) + { + this._aabb.x = minX; + this._aabb.y = maxY; + this._aabb.z = minZ; + this._aabb.width = maxX - minX; + this._aabb.height = maxY - minY; + this._aabb.depth = maxZ - minZ; + this._pAabbPointsDirty = true; + + if (this._pBoundingEntity) + this.pUpdateBoundingEntity(); + } + + public isInFrustum(planes:Array, numPlanes:number):boolean + { + throw new AbstractMethodError(); + } + + public overlaps(bounds:BoundingVolumeBase):boolean + { + return this._aabb.intersects(bounds.aabb); + } + + public clone():BoundingVolumeBase + { + throw new AbstractMethodError(); + } + + public rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number + { + return -1; + } + + public containsPoint(position:Vector3D):boolean + { + return false; + } + + public pUpdateAABBPoints() + { + var minX:number = this._aabb.x; + var minY:number = this._aabb.y - this._aabb.height; + var minZ:number = this._aabb.z; + var maxX:number = this._aabb.x + this._aabb.width; + var maxY:number = this._aabb.y; + var maxZ:number = this._aabb.z + this._aabb.depth; + + this._pAabbPoints[0] = minX; + this._pAabbPoints[1] = minY; + this._pAabbPoints[2] = minZ; + this._pAabbPoints[3] = maxX; + this._pAabbPoints[4] = minY; + this._pAabbPoints[5] = minZ; + this._pAabbPoints[6] = minX; + this._pAabbPoints[7] = maxY; + this._pAabbPoints[8] = minZ; + this._pAabbPoints[9] = maxX; + this._pAabbPoints[10] = maxY; + this._pAabbPoints[11] = minZ; + this._pAabbPoints[12] = minX; + this._pAabbPoints[13] = minY; + this._pAabbPoints[14] = maxZ; + this._pAabbPoints[15] = maxX; + this._pAabbPoints[16] = minY; + this._pAabbPoints[17] = maxZ; + this._pAabbPoints[18] = minX; + this._pAabbPoints[19] = maxY; + this._pAabbPoints[20] = maxZ; + this._pAabbPoints[21] = maxX; + this._pAabbPoints[22] = maxY; + this._pAabbPoints[23] = maxZ; + this._pAabbPointsDirty = false; + } + + public pUpdateBoundingEntity() + { + throw new AbstractMethodError(); + } + + public pCreateBoundingEntity():IEntity + { + throw new AbstractMethodError(); + } + + public classifyToPlane(plane:Plane3D):number + { + throw new AbstractMethodError(); + } + + public transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D) + { + throw new AbstractMethodError(); + } +} + +export = BoundingVolumeBase; \ No newline at end of file diff --git a/lib/bounds/NullBounds.js b/lib/bounds/NullBounds.js new file mode 100755 index 00000000..f216ebbd --- /dev/null +++ b/lib/bounds/NullBounds.js @@ -0,0 +1,63 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); + +var PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); + +var NullBounds = (function (_super) { + __extends(NullBounds, _super); + function NullBounds(alwaysIn) { + if (typeof alwaysIn === "undefined") { alwaysIn = true; } + _super.call(this); + + this._alwaysIn = alwaysIn; + + this._aabb.width = this._aabb.height = this._aabb.depth = Number.POSITIVE_INFINITY; + this._aabb.x = this._aabb.y = this._aabb.z = this._alwaysIn ? Number.NEGATIVE_INFINITY / 2 : Number.POSITIVE_INFINITY; + } + //@override + NullBounds.prototype.clone = function () { + return new NullBounds(this._alwaysIn); + }; + + //@override + NullBounds.prototype.pCreateBoundingEntity = function () { + //return this._renderable || new away.primitives.WireframeSphere( 100, 16, 12, 0xffffff, 0.5 ); + return null; + }; + + //@override + NullBounds.prototype.isInFrustum = function (planes, numPlanes) { + return this._alwaysIn; + }; + + // //@override + // public fromGeometry(geometry:away.base.Geometry) + // { + // } + //@override + NullBounds.prototype.fromSphere = function (center, radius) { + }; + + //@override + NullBounds.prototype.fromExtremes = function (minX, minY, minZ, maxX, maxY, maxZ) { + }; + + NullBounds.prototype.classifyToPlane = function (plane) { + return PlaneClassification.INTERSECT; + }; + + //@override + NullBounds.prototype.transformFrom = function (bounds, matrix) { + this._alwaysIn = bounds._alwaysIn; + }; + return NullBounds; +})(BoundingVolumeBase); + +module.exports = NullBounds; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJvdW5kcy9OdWxsQm91bmRzLnRzIl0sIm5hbWVzIjpbIk51bGxCb3VuZHMiLCJOdWxsQm91bmRzLmNvbnN0cnVjdG9yIiwiTnVsbEJvdW5kcy5jbG9uZSIsIk51bGxCb3VuZHMucENyZWF0ZUJvdW5kaW5nRW50aXR5IiwiTnVsbEJvdW5kcy5pc0luRnJ1c3R1bSIsIk51bGxCb3VuZHMuZnJvbVNwaGVyZSIsIk51bGxCb3VuZHMuZnJvbUV4dHJlbWVzIiwiTnVsbEJvdW5kcy5jbGFzc2lmeVRvUGxhbmUiLCJOdWxsQm91bmRzLnRyYW5zZm9ybUZyb20iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZFQUFtRjs7QUFFbkYsa0ZBQXdGOztBQUt4RjtJQUF5QkEsNkJBQWtCQTtJQUkxQ0Esb0JBQVlBLFFBQXVCQTtRQUF2QkMsdUNBQUFBLFFBQVFBLEdBQVdBLElBQUlBO0FBQUFBLFFBRWxDQSxXQUFNQSxLQUFBQSxDQUFDQTs7UUFFUEEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsUUFBUUE7O1FBRXpCQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxHQUFHQSxNQUFNQSxDQUFDQSxpQkFBaUJBO1FBQ2xGQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFFQSxNQUFNQSxDQUFDQSxpQkFBaUJBLEdBQUNBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLGlCQUFpQkE7SUFDbkhBLENBQUNBO0lBR0RELFdBRFdBO2lDQUNYQTtRQUVDRSxPQUFPQSxJQUFJQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtJQUN0Q0EsQ0FBQ0E7O0lBR0RGLFdBRFdBO2lEQUNYQTtRQUVDRywrRkFBK0ZBO1FBQy9GQSxPQUFPQSxJQUFJQTtJQUNaQSxDQUFDQTs7SUFHREgsV0FEV0E7dUNBQ1hBLFVBQW1CQSxNQUFxQkEsRUFBRUEsU0FBZ0JBO1FBRXpESSxPQUFPQSxJQUFJQSxDQUFDQSxTQUFTQTtJQUN0QkEsQ0FBQ0E7O0lBUURKLGVBTmNBO0lBQ2ZBLG9EQUFvREE7SUFDcERBLEtBQUtBO0lBQ0xBLEtBQUtBO0lBRUpBLFdBQVdBO3NDQUNYQSxVQUFrQkEsTUFBZUEsRUFBRUEsTUFBYUE7SUFFaERLLENBQUNBOztJQUdETCxXQURXQTt3Q0FDWEEsVUFBb0JBLElBQVdBLEVBQUVBLElBQVdBLEVBQUVBLElBQVdBLEVBQUVBLElBQVdBLEVBQUVBLElBQVdBLEVBQUVBLElBQVdBO0lBRWhHTSxDQUFDQTs7SUFFRE4sdUNBQUFBLFVBQXVCQSxLQUFhQTtRQUVuQ08sT0FBT0EsbUJBQW1CQSxDQUFDQSxTQUFTQTtJQUNyQ0EsQ0FBQ0E7O0lBR0RQLFdBRFdBO3lDQUNYQSxVQUFxQkEsTUFBeUJBLEVBQUVBLE1BQWVBO1FBRTlEUSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxNQUFvQkEsQ0FBRUEsU0FBU0E7SUFDakRBLENBQUNBO0lBQ0ZSLGtCQUFDQTtBQUFEQSxDQUFDQSxFQTFEd0Isa0JBQWtCLEVBMEQxQzs7QUFFRCwyQkFBb0IsQ0FBQSIsImZpbGUiOiJib3VuZHMvTnVsbEJvdW5kcy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCb3VuZGluZ1ZvbHVtZUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYm91bmRzL0JvdW5kaW5nVm9sdW1lQmFzZVwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RcIik7XG5pbXBvcnQgUGxhbmVDbGFzc2lmaWNhdGlvblx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUGxhbmVDbGFzc2lmaWNhdGlvblwiKTtcbmltcG9ydCBQbGFuZTNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9QbGFuZTNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5cbmNsYXNzIE51bGxCb3VuZHMgZXh0ZW5kcyBCb3VuZGluZ1ZvbHVtZUJhc2Vcbntcblx0cHJpdmF0ZSBfYWx3YXlzSW46Ym9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvcihhbHdheXNJbjpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9hbHdheXNJbiA9IGFsd2F5c0luO1xuXG5cdFx0dGhpcy5fYWFiYi53aWR0aCA9IHRoaXMuX2FhYmIuaGVpZ2h0ID0gdGhpcy5fYWFiYi5kZXB0aCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTtcblx0XHR0aGlzLl9hYWJiLnggPSB0aGlzLl9hYWJiLnkgPSB0aGlzLl9hYWJiLnogPSB0aGlzLl9hbHdheXNJbj8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLzIgOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgY2xvbmUoKTpCb3VuZGluZ1ZvbHVtZUJhc2Vcblx0e1xuXHRcdHJldHVybiBuZXcgTnVsbEJvdW5kcyh0aGlzLl9hbHdheXNJbik7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgcENyZWF0ZUJvdW5kaW5nRW50aXR5KCk6SUVudGl0eVxuXHR7XG5cdFx0Ly9yZXR1cm4gdGhpcy5fcmVuZGVyYWJsZSB8fCBuZXcgYXdheS5wcmltaXRpdmVzLldpcmVmcmFtZVNwaGVyZSggMTAwLCAxNiwgMTIsIDB4ZmZmZmZmLCAwLjUgKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBpc0luRnJ1c3R1bShwbGFuZXM6QXJyYXk8UGxhbmUzRD4sIG51bVBsYW5lczpudW1iZXIpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9hbHdheXNJbjtcblx0fVxuXG4vL1x0XHQvL0BvdmVycmlkZVxuLy9cdFx0cHVibGljIGZyb21HZW9tZXRyeShnZW9tZXRyeTphd2F5LmJhc2UuR2VvbWV0cnkpXG4vL1x0XHR7XG4vL1x0XHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIGZyb21TcGhlcmUoY2VudGVyOlZlY3RvcjNELCByYWRpdXM6bnVtYmVyKVxuXHR7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgZnJvbUV4dHJlbWVzKG1pblg6bnVtYmVyLCBtaW5ZOm51bWJlciwgbWluWjpudW1iZXIsIG1heFg6bnVtYmVyLCBtYXhZOm51bWJlciwgbWF4WjpudW1iZXIpXG5cdHtcblx0fVxuXG5cdHB1YmxpYyBjbGFzc2lmeVRvUGxhbmUocGxhbmU6UGxhbmUzRCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gUGxhbmVDbGFzc2lmaWNhdGlvbi5JTlRFUlNFQ1Q7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgdHJhbnNmb3JtRnJvbShib3VuZHM6Qm91bmRpbmdWb2x1bWVCYXNlLCBtYXRyaXg6TWF0cml4M0QpXG5cdHtcblx0XHR0aGlzLl9hbHdheXNJbiA9ICg8TnVsbEJvdW5kcz4gYm91bmRzKS5fYWx3YXlzSW47XG5cdH1cbn1cblxuZXhwb3J0ID0gTnVsbEJvdW5kczsiXX0= \ No newline at end of file diff --git a/lib/bounds/NullBounds.ts b/lib/bounds/NullBounds.ts new file mode 100644 index 00000000..757fee50 --- /dev/null +++ b/lib/bounds/NullBounds.ts @@ -0,0 +1,68 @@ +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +class NullBounds extends BoundingVolumeBase +{ + private _alwaysIn:boolean; + + constructor(alwaysIn:boolean = true) + { + super(); + + this._alwaysIn = alwaysIn; + + this._aabb.width = this._aabb.height = this._aabb.depth = Number.POSITIVE_INFINITY; + this._aabb.x = this._aabb.y = this._aabb.z = this._alwaysIn? Number.NEGATIVE_INFINITY/2 : Number.POSITIVE_INFINITY; + } + + //@override + public clone():BoundingVolumeBase + { + return new NullBounds(this._alwaysIn); + } + + //@override + public pCreateBoundingEntity():IEntity + { + //return this._renderable || new away.primitives.WireframeSphere( 100, 16, 12, 0xffffff, 0.5 ); + return null; + } + + //@override + public isInFrustum(planes:Array, numPlanes:number):boolean + { + return this._alwaysIn; + } + +// //@override +// public fromGeometry(geometry:away.base.Geometry) +// { +// } + + //@override + public fromSphere(center:Vector3D, radius:number) + { + } + + //@override + public fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number) + { + } + + public classifyToPlane(plane:Plane3D):number + { + return PlaneClassification.INTERSECT; + } + + //@override + public transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D) + { + this._alwaysIn = ( bounds)._alwaysIn; + } +} + +export = NullBounds; \ No newline at end of file diff --git a/lib/containers/DisplayObjectContainer.js b/lib/containers/DisplayObjectContainer.js new file mode 100755 index 00000000..e09e11e4 --- /dev/null +++ b/lib/containers/DisplayObjectContainer.js @@ -0,0 +1,540 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); +var Error = require("awayjs-core/lib/errors/Error"); +var RangeError = require("awayjs-core/lib/errors/RangeError"); + +/** +* The DisplayObjectContainer class is the base class for all objects that can +* serve as display object containers on the display list. The display list +* manages all objects displayed in the Flash runtimes. Use the +* DisplayObjectContainer class to arrange the display objects in the display +* list. Each DisplayObjectContainer object has its own child list for +* organizing the z-order of the objects. The z-order is the front-to-back +* order that determines which object is drawn in front, which is behind, and +* so on. +* +*

DisplayObject is an abstract base class; therefore, you cannot call +* DisplayObject directly. Invoking new DisplayObject() throws an +* ArgumentError exception.

+* The DisplayObjectContainer class is an abstract base class for all objects +* that can contain child objects. It cannot be instantiated directly; calling +* the new DisplayObjectContainer() constructor throws an +* ArgumentError exception. +* +*

For more information, see the "Display Programming" chapter of the +* ActionScript 3.0 Developer's Guide.

+*/ +var DisplayObjectContainer = (function (_super) { + __extends(DisplayObjectContainer, _super); + /** + * Calling the new DisplayObjectContainer() constructor throws + * an ArgumentError exception. You can, however, call + * constructors for the following subclasses of DisplayObjectContainer: + *
    + *
  • new Loader()
  • + *
  • new Sprite()
  • + *
  • new MovieClip()
  • + *
+ */ + function DisplayObjectContainer() { + _super.call(this); + this._mouseChildren = true; + this._children = new Array(); + } + Object.defineProperty(DisplayObjectContainer.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.CONTAINER; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObjectContainer.prototype, "mouseChildren", { + /** + * Determines whether or not the children of the object are mouse, or user + * input device, enabled. If an object is enabled, a user can interact with + * it by using a mouse or user input device. The default is + * true. + * + *

This property is useful when you create a button with an instance of + * the Sprite class(instead of using the SimpleButton class). When you use a + * Sprite instance to create a button, you can choose to decorate the button + * by using the addChild() method to add additional Sprite + * instances. This process can cause unexpected behavior with mouse events + * because the Sprite instances you add as children can become the target + * object of a mouse event when you expect the parent instance to be the + * target object. To ensure that the parent instance serves as the target + * objects for mouse events, you can set the mouseChildren + * property of the parent instance to false.

+ * + *

No event is dispatched by setting this property. You must use the + * addEventListener() method to create interactive + * functionality.

+ */ + get: function () { + return this._mouseChildren; + }, + set: function (value) { + if (this._mouseChildren == value) + return; + + this._mouseChildren = value; + + this._pUpdateImplicitMouseEnabled(this._pParent ? this._pParent.mouseChildren : true); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObjectContainer.prototype, "numChildren", { + /** + * Returns the number of children of this object. + */ + get: function () { + return this._children.length; + }, + enumerable: true, + configurable: true + }); + + /** + * Adds a child DisplayObject instance to this DisplayObjectContainer + * instance. The child is added to the front(top) of all other children in + * this DisplayObjectContainer instance.(To add a child to a specific index + * position, use the addChildAt() method.) + * + *

If you add a child object that already has a different display object + * container as a parent, the object is removed from the child list of the + * other display object container.

+ * + *

Note: The command stage.addChild() can cause + * problems with a published SWF file, including security problems and + * conflicts with other loaded SWF files. There is only one Stage within a + * Flash runtime instance, no matter how many SWF files you load into the + * runtime. So, generally, objects should not be added to the Stage, + * directly, at all. The only object the Stage should contain is the root + * object. Create a DisplayObjectContainer to contain all of the items on the + * display list. Then, if necessary, add that DisplayObjectContainer instance + * to the Stage.

+ * + * @param child The DisplayObject instance to add as a child of this + * DisplayObjectContainer instance. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child is the same as the parent. Also + * throws if the caller is a child(or grandchild etc.) + * of the child being added. + * @event added Dispatched when a display object is added to the display + * list. + */ + DisplayObjectContainer.prototype.addChild = function (child) { + if (child == null) + throw new Error("Parameter child cannot be null."); + + //if child already has a parent, remove it. + if (child._pParent) + child._pParent.removeChildInternal(child); + + child.iSetParent(this); + + this._children.push(child); + + return child; + }; + + /** + * Adds a child DisplayObject instance to this DisplayObjectContainer + * instance. The child is added at the index position specified. An index of + * 0 represents the back(bottom) of the display list for this + * DisplayObjectContainer object. + * + *

For example, the following example shows three display objects, labeled + * a, b, and c, at index positions 0, 2, and 1, respectively:

+ * + *

If you add a child object that already has a different display object + * container as a parent, the object is removed from the child list of the + * other display object container.

+ * + * @param child The DisplayObject instance to add as a child of this + * DisplayObjectContainer instance. + * @param index The index position to which the child is added. If you + * specify a currently occupied index position, the child object + * that exists at that position and all higher positions are + * moved up one position in the child list. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child is the same as the parent. Also + * throws if the caller is a child(or grandchild etc.) + * of the child being added. + * @throws RangeError Throws if the index position does not exist in the + * child list. + * @event added Dispatched when a display object is added to the display + * list. + */ + DisplayObjectContainer.prototype.addChildAt = function (child, index /*int*/ ) { + return child; + }; + + DisplayObjectContainer.prototype.addChildren = function () { + var childarray = []; + for (var _i = 0; _i < (arguments.length - 0); _i++) { + childarray[_i] = arguments[_i + 0]; + } + var len = childarray.length; + for (var i = 0; i < len; i++) + this.addChild(childarray[i]); + }; + + /** + * + */ + DisplayObjectContainer.prototype.clone = function () { + var clone = new DisplayObjectContainer(); + clone.pivot = this.pivot; + clone._iMatrix3D = this._iMatrix3D; + clone.partition = this.partition; + clone.name = name; + + var len = this._children.length; + for (var i = 0; i < len; ++i) + clone.addChild(this._children[i].clone()); + + // todo: implement for all subtypes + return clone; + }; + + /** + * Determines whether the specified display object is a child of the + * DisplayObjectContainer instance or the instance itself. The search + * includes the entire display list including this DisplayObjectContainer + * instance. Grandchildren, great-grandchildren, and so on each return + * true. + * + * @param child The child object to test. + * @return true if the child object is a child of + * the DisplayObjectContainer or the container itself; otherwise + * false. + */ + DisplayObjectContainer.prototype.contains = function (child) { + return this._children.indexOf(child) >= 0; + }; + + /** + * + */ + DisplayObjectContainer.prototype.disposeWithChildren = function () { + this.dispose(); + + while (this.numChildren > 0) + this.getChildAt(0).dispose(); + }; + + /** + * Returns the child display object instance that exists at the specified + * index. + * + * @param index The index position of the child object. + * @return The child display object at the specified index position. + * @throws RangeError Throws if the index does not exist in the child + * list. + */ + DisplayObjectContainer.prototype.getChildAt = function (index /*int*/ ) { + var child = this._children[index]; + + if (child == null) + throw new RangeError("Index does not exist in the child list of the caller"); + + return child; + }; + + /** + * Returns the child display object that exists with the specified name. If + * more that one child display object has the specified name, the method + * returns the first object in the child list. + * + *

The getChildAt() method is faster than the + * getChildByName() method. The getChildAt() method + * accesses a child from a cached array, whereas the + * getChildByName() method has to traverse a linked list to + * access a child.

+ * + * @param name The name of the child to return. + * @return The child display object with the specified name. + */ + DisplayObjectContainer.prototype.getChildByName = function (name) { + var len = this._children.length; + for (var i = 0; i < len; ++i) + if (this._children[i].name == name) + return this._children[i]; + + return null; + }; + + /** + * Returns the index position of a child DisplayObject instance. + * + * @param child The DisplayObject instance to identify. + * @return The index position of the child display object to identify. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + */ + DisplayObjectContainer.prototype.getChildIndex = function (child) { + var childIndex = this._children.indexOf(child); + + if (childIndex == -1) + throw new ArgumentError("Child parameter is not a child of the caller"); + + return childIndex; + }; + + /** + * Returns an array of objects that lie under the specified point and are + * children(or grandchildren, and so on) of this DisplayObjectContainer + * instance. Any child objects that are inaccessible for security reasons are + * omitted from the returned array. To determine whether this security + * restriction affects the returned array, call the + * areInaccessibleObjectsUnderPoint() method. + * + *

The point parameter is in the coordinate space of the + * Stage, which may differ from the coordinate space of the display object + * container(unless the display object container is the Stage). You can use + * the globalToLocal() and the localToGlobal() + * methods to convert points between these coordinate spaces.

+ * + * @param point The point under which to look. + * @return An array of objects that lie under the specified point and are + * children(or grandchildren, and so on) of this + * DisplayObjectContainer instance. + */ + DisplayObjectContainer.prototype.getObjectsUnderPoint = function (point) { + return new Array(); + }; + + /** + * Removes the specified child DisplayObject instance from the + * child list of the DisplayObjectContainer instance. The parent + * property of the removed child is set to null , and the object + * is garbage collected if no other references to the child exist. The index + * positions of any display objects above the child in the + * DisplayObjectContainer are decreased by 1. + * + *

The garbage collector reallocates unused memory space. When a variable + * or object is no longer actively referenced or stored somewhere, the + * garbage collector sweeps through and wipes out the memory space it used to + * occupy if no other references to it exist.

+ * + * @param child The DisplayObject instance to remove. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + */ + DisplayObjectContainer.prototype.removeChild = function (child) { + if (child == null) + throw new Error("Parameter child cannot be null"); + + this.removeChildInternal(child); + + child.iSetParent(null); + + return child; + }; + + /** + * Removes a child DisplayObject from the specified index + * position in the child list of the DisplayObjectContainer. The + * parent property of the removed child is set to + * null, and the object is garbage collected if no other + * references to the child exist. The index positions of any display objects + * above the child in the DisplayObjectContainer are decreased by 1. + * + *

The garbage collector reallocates unused memory space. When a variable + * or object is no longer actively referenced or stored somewhere, the + * garbage collector sweeps through and wipes out the memory space it used to + * occupy if no other references to it exist.

+ * + * @param index The child index of the DisplayObject to remove. + * @return The DisplayObject instance that was removed. + * @throws RangeError Throws if the index does not exist in the child + * list. + * @throws SecurityError This child display object belongs to a sandbox to + * which the calling object does not have access. You + * can avoid this situation by having the child movie + * call the Security.allowDomain() method. + */ + DisplayObjectContainer.prototype.removeChildAt = function (index /*int*/ ) { + return this.removeChild(this._children[index]); + }; + + /** + * Removes all child DisplayObject instances from the child list + * of the DisplayObjectContainer instance. The parent property + * of the removed children is set to null, and the objects are + * garbage collected if no other references to the children exist. + * + * The garbage collector reallocates unused memory space. When a variable or + * object is no longer actively referenced or stored somewhere, the garbage + * collector sweeps through and wipes out the memory space it used to occupy + * if no other references to it exist. + * + * @param beginIndex The beginning position. A value smaller than 0 throws a RangeError. + * @param endIndex The ending position. A value smaller than 0 throws a RangeError. + * @throws RangeError Throws if the beginIndex or endIndex positions do + * not exist in the child list. + */ + DisplayObjectContainer.prototype.removeChildren = function (beginIndex, endIndex) { + if (typeof beginIndex === "undefined") { beginIndex = 0; } + if (typeof endIndex === "undefined") { endIndex = 2147483647; } + if (beginIndex < 0) + throw new RangeError("beginIndex is out of range of the child list"); + + if (endIndex > this._children.length) + throw new RangeError("endIndex is out of range of the child list"); + + for (var i = beginIndex; i < endIndex; i++) + this.removeChild(this._children[i]); + }; + + /** + * Changes the position of an existing child in the display object container. + * This affects the layering of child objects. For example, the following + * example shows three display objects, labeled a, b, and c, at index + * positions 0, 1, and 2, respectively: + * + *

When you use the setChildIndex() method and specify an + * index position that is already occupied, the only positions that change + * are those in between the display object's former and new position. All + * others will stay the same. If a child is moved to an index LOWER than its + * current index, all children in between will INCREASE by 1 for their index + * reference. If a child is moved to an index HIGHER than its current index, + * all children in between will DECREASE by 1 for their index reference. For + * example, if the display object container in the previous example is named + * container, you can swap the position of the display objects + * labeled a and b by calling the following code:

+ * + *

This code results in the following arrangement of objects:

+ * + * @param child The child DisplayObject instance for which you want to change + * the index number. + * @param index The resulting index number for the child display + * object. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + * @throws RangeError Throws if the index does not exist in the child + * list. + */ + DisplayObjectContainer.prototype.setChildIndex = function (child, index /*int*/ ) { + //TODO + }; + + /** + * Swaps the z-order (front-to-back order) of the two specified child + * objects. All other child objects in the display object container remain in + * the same index positions. + * + * @param child1 The first child object. + * @param child2 The second child object. + * @throws ArgumentError Throws if either child parameter is not a child of + * this object. + */ + DisplayObjectContainer.prototype.swapChildren = function (child1, child2) { + //TODO + }; + + /** + * Swaps the z-order(front-to-back order) of the child objects at the two + * specified index positions in the child list. All other child objects in + * the display object container remain in the same index positions. + * + * @param index1 The index position of the first child object. + * @param index2 The index position of the second child object. + * @throws RangeError If either index does not exist in the child list. + */ + DisplayObjectContainer.prototype.swapChildrenAt = function (index1 /*int*/ , index2 /*int*/ ) { + //TODO + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype.pInvalidateSceneTransform = function () { + _super.prototype.pInvalidateSceneTransform.call(this); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i].pInvalidateSceneTransform(); + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype._pUpdateScene = function (value) { + _super.prototype._pUpdateScene.call(this, value); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i]._pUpdateScene(value); + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype._pUpdateImplicitMouseEnabled = function (value) { + _super.prototype._pUpdateImplicitMouseEnabled.call(this, value); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i]._pUpdateImplicitMouseEnabled(this._mouseChildren); + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype._pUpdateImplicitVisibility = function (value) { + _super.prototype._pUpdateImplicitVisibility.call(this, value); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i]._pUpdateImplicitVisibility(this._pImplicitVisibility); + }; + + /** + * @protected + */ + DisplayObjectContainer.prototype._pUpdateImplicitPartition = function (value) { + _super.prototype._pUpdateImplicitPartition.call(this, value); + + var len = this._children.length; + for (var i = 0; i < len; ++i) + this._children[i]._pUpdateImplicitPartition(this._pImplicitPartition); + }; + + /** + * @private + * + * @param child + */ + DisplayObjectContainer.prototype.removeChildInternal = function (child) { + this._children.splice(this.getChildIndex(child), 1); + + return child; + }; + return DisplayObjectContainer; +})(DisplayObject); + +module.exports = DisplayObjectContainer; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lcnMvRGlzcGxheU9iamVjdENvbnRhaW5lci50cyJdLCJuYW1lcyI6WyJEaXNwbGF5T2JqZWN0Q29udGFpbmVyIiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5jb25zdHJ1Y3RvciIsIkRpc3BsYXlPYmplY3RDb250YWluZXIuYWRkQ2hpbGQiLCJEaXNwbGF5T2JqZWN0Q29udGFpbmVyLmFkZENoaWxkQXQiLCJEaXNwbGF5T2JqZWN0Q29udGFpbmVyLmFkZENoaWxkcmVuIiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5jbG9uZSIsIkRpc3BsYXlPYmplY3RDb250YWluZXIuY29udGFpbnMiLCJEaXNwbGF5T2JqZWN0Q29udGFpbmVyLmRpc3Bvc2VXaXRoQ2hpbGRyZW4iLCJEaXNwbGF5T2JqZWN0Q29udGFpbmVyLmdldENoaWxkQXQiLCJEaXNwbGF5T2JqZWN0Q29udGFpbmVyLmdldENoaWxkQnlOYW1lIiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5nZXRDaGlsZEluZGV4IiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5nZXRPYmplY3RzVW5kZXJQb2ludCIsIkRpc3BsYXlPYmplY3RDb250YWluZXIucmVtb3ZlQ2hpbGQiLCJEaXNwbGF5T2JqZWN0Q29udGFpbmVyLnJlbW92ZUNoaWxkQXQiLCJEaXNwbGF5T2JqZWN0Q29udGFpbmVyLnJlbW92ZUNoaWxkcmVuIiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5zZXRDaGlsZEluZGV4IiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5zd2FwQ2hpbGRyZW4iLCJEaXNwbGF5T2JqZWN0Q29udGFpbmVyLnN3YXBDaGlsZHJlbkF0IiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5wSW52YWxpZGF0ZVNjZW5lVHJhbnNmb3JtIiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5fcFVwZGF0ZVNjZW5lIiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5fcFVwZGF0ZUltcGxpY2l0TW91c2VFbmFibGVkIiwiRGlzcGxheU9iamVjdENvbnRhaW5lci5fcFVwZGF0ZUltcGxpY2l0VmlzaWJpbGl0eSIsIkRpc3BsYXlPYmplY3RDb250YWluZXIuX3BVcGRhdGVJbXBsaWNpdFBhcnRpdGlvbiIsIkRpc3BsYXlPYmplY3RDb250YWluZXIucmVtb3ZlQ2hpbGRJbnRlcm5hbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsc0VBQzZFOztBQUc3RSxpRUFBeUU7O0FBRXpFLG1FQUEwRTtBQUMxRSxtREFBNEQ7QUFDNUQsNkRBQXFFOztBQUVyRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvQkc7QUFDSDtJQUFxQ0EseUNBQWFBO0lBbUZqREE7Ozs7Ozs7OztNQURHQTtJQUNIQTtRQUVDQyxXQUFNQSxLQUFBQSxDQUFDQTtRQW5GUkEsS0FBUUEsY0FBY0EsR0FBV0EsSUFBSUEsQ0FBQ0E7UUFDdENBLEtBQVFBLFNBQVNBLEdBQXdCQSxJQUFJQSxLQUFLQSxDQUFnQkEsQ0FBQ0EsQ0FBQ0E7SUFtRnBFQSxDQUFDQTtJQTdFREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLFNBQVNBLENBQUNBLFNBQVNBO1FBQzNCQSxDQUFDQTs7OztBQUFBQTtJQXVCREE7UUFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGNBQWNBO1FBQzNCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF5QkEsS0FBYUE7WUFFckNBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBLElBQUlBLEtBQUtBO2dCQUMvQkEsTUFBT0EsQ0FBQUE7O1lBRVJBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLEtBQUtBOztZQUUzQkEsSUFBSUEsQ0FBQ0EsNEJBQTRCQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFFQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQTtRQUNyRkEsQ0FBQ0E7Ozs7QUFWQUE7O0lBZURBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFD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O0lBQ3hFQSxDQUFDQTs7SUFPRHRCOzs7O01BREdBOzJEQUNIQSxVQUE0QkEsS0FBbUJBO1FBRTlDdUIsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7O1FBRW5EQSxPQUFPQSxLQUFLQTtJQUNiQSxDQUFDQTtJQUNGdkIsOEJBQUNBO0FBQURBLENBQUNBLEVBL2dCb0MsYUFBYSxFQStnQmpEOztBQUVELHVDQUFnQyxDQUFBIiwiZmlsZSI6ImNvbnRhaW5lcnMvRGlzcGxheU9iamVjdENvbnRhaW5lci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTY2VuZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1NjZW5lXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvRGlzcGxheU9iamVjdFwiKTtcbmltcG9ydCBQb2ludFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUG9pbnRcIik7XG5pbXBvcnQgUGFydGl0aW9uXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9QYXJ0aXRpb25cIik7XG5pbXBvcnQgQXNzZXRUeXBlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRUeXBlXCIpO1xuaW1wb3J0IElBc3NldFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IEFyZ3VtZW50RXJyb3JcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQXJndW1lbnRFcnJvclwiKTtcbmltcG9ydCBFcnJvclx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvRXJyb3JcIik7XG5pbXBvcnQgUmFuZ2VFcnJvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL1JhbmdlRXJyb3JcIik7XG5cbi8qKlxuICogVGhlIERpc3BsYXlPYmplY3RDb250YWluZXIgY2xhc3MgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGFsbCBvYmplY3RzIHRoYXQgY2FuXG4gKiBzZXJ2ZSBhcyBkaXNwbGF5IG9iamVjdCBjb250YWluZXJzIG9uIHRoZSBkaXNwbGF5IGxpc3QuIFRoZSBkaXNwbGF5IGxpc3RcbiAqIG1hbmFnZXMgYWxsIG9iamVjdHMgZGlzcGxheWVkIGluIHRoZSBGbGFzaCBydW50aW1lcy4gVXNlIHRoZVxuICogRGlzcGxheU9iamVjdENvbnRhaW5lciBjbGFzcyB0byBhcnJhbmdlIHRoZSBkaXNwbGF5IG9iamVjdHMgaW4gdGhlIGRpc3BsYXlcbiAqIGxpc3QuIEVhY2ggRGlzcGxheU9iamVjdENvbnRhaW5lciBvYmplY3QgaGFzIGl0cyBvd24gY2hpbGQgbGlzdCBmb3JcbiAqIG9yZ2FuaXppbmcgdGhlIHotb3JkZXIgb2YgdGhlIG9iamVjdHMuIFRoZSB6LW9yZGVyIGlzIHRoZSBmcm9udC10by1iYWNrXG4gKiBvcmRlciB0aGF0IGRldGVybWluZXMgd2hpY2ggb2JqZWN0IGlzIGRyYXduIGluIGZyb250LCB3aGljaCBpcyBiZWhpbmQsIGFuZFxuICogc28gb24uXG4gKlxuICogPHA+RGlzcGxheU9iamVjdCBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzOyB0aGVyZWZvcmUsIHlvdSBjYW5ub3QgY2FsbFxuICogRGlzcGxheU9iamVjdCBkaXJlY3RseS4gSW52b2tpbmcgPGNvZGU+bmV3IERpc3BsYXlPYmplY3QoKTwvY29kZT4gdGhyb3dzIGFuXG4gKiA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPiBleGNlcHRpb24uPC9wPlxuICogVGhlIERpc3BsYXlPYmplY3RDb250YWluZXIgY2xhc3MgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIG9iamVjdHNcbiAqIHRoYXQgY2FuIGNvbnRhaW4gY2hpbGQgb2JqZWN0cy4gSXQgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseTsgY2FsbGluZ1xuICogdGhlIDxjb2RlPm5ldyBEaXNwbGF5T2JqZWN0Q29udGFpbmVyKCk8L2NvZGU+IGNvbnN0cnVjdG9yIHRocm93cyBhblxuICogPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT4gZXhjZXB0aW9uLlxuICpcbiAqIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFwiRGlzcGxheSBQcm9ncmFtbWluZ1wiIGNoYXB0ZXIgb2YgdGhlXG4gKiA8aT5BY3Rpb25TY3JpcHQgMy4wIERldmVsb3BlcidzIEd1aWRlPC9pPi48L3A+XG4gKi9cbmNsYXNzIERpc3BsYXlPYmplY3RDb250YWluZXIgZXh0ZW5kcyBEaXNwbGF5T2JqZWN0IGltcGxlbWVudHMgSUFzc2V0XG57XG5cdHByaXZhdGUgX21vdXNlQ2hpbGRyZW46Ym9vbGVhbiA9IHRydWU7XG5cdHByaXZhdGUgX2NoaWxkcmVuOkFycmF5PERpc3BsYXlPYmplY3Q+ID0gbmV3IEFycmF5PERpc3BsYXlPYmplY3Q+KCk7XG5cdHB1YmxpYyBfaUlzUm9vdDpib29sZWFuO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBhc3NldFR5cGUoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBBc3NldFR5cGUuQ09OVEFJTkVSO1xuXHR9XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdGhlIGNoaWxkcmVuIG9mIHRoZSBvYmplY3QgYXJlIG1vdXNlLCBvciB1c2VyXG5cdCAqIGlucHV0IGRldmljZSwgZW5hYmxlZC4gSWYgYW4gb2JqZWN0IGlzIGVuYWJsZWQsIGEgdXNlciBjYW4gaW50ZXJhY3Qgd2l0aFxuXHQgKiBpdCBieSB1c2luZyBhIG1vdXNlIG9yIHVzZXIgaW5wdXQgZGV2aWNlLiBUaGUgZGVmYXVsdCBpc1xuXHQgKiA8Y29kZT50cnVlPC9jb2RlPi5cblx0ICpcblx0ICogPHA+VGhpcyBwcm9wZXJ0eSBpcyB1c2VmdWwgd2hlbiB5b3UgY3JlYXRlIGEgYnV0dG9uIHdpdGggYW4gaW5zdGFuY2Ugb2Zcblx0ICogdGhlIFNwcml0ZSBjbGFzcyhpbnN0ZWFkIG9mIHVzaW5nIHRoZSBTaW1wbGVCdXR0b24gY2xhc3MpLiBXaGVuIHlvdSB1c2UgYVxuXHQgKiBTcHJpdGUgaW5zdGFuY2UgdG8gY3JlYXRlIGEgYnV0dG9uLCB5b3UgY2FuIGNob29zZSB0byBkZWNvcmF0ZSB0aGUgYnV0dG9uXG5cdCAqIGJ5IHVzaW5nIHRoZSA8Y29kZT5hZGRDaGlsZCgpPC9jb2RlPiBtZXRob2QgdG8gYWRkIGFkZGl0aW9uYWwgU3ByaXRlXG5cdCAqIGluc3RhbmNlcy4gVGhpcyBwcm9jZXNzIGNhbiBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yIHdpdGggbW91c2UgZXZlbnRzXG5cdCAqIGJlY2F1c2UgdGhlIFNwcml0ZSBpbnN0YW5jZXMgeW91IGFkZCBhcyBjaGlsZHJlbiBjYW4gYmVjb21lIHRoZSB0YXJnZXRcblx0ICogb2JqZWN0IG9mIGEgbW91c2UgZXZlbnQgd2hlbiB5b3UgZXhwZWN0IHRoZSBwYXJlbnQgaW5zdGFuY2UgdG8gYmUgdGhlXG5cdCAqIHRhcmdldCBvYmplY3QuIFRvIGVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgaW5zdGFuY2Ugc2VydmVzIGFzIHRoZSB0YXJnZXRcblx0ICogb2JqZWN0cyBmb3IgbW91c2UgZXZlbnRzLCB5b3UgY2FuIHNldCB0aGUgPGNvZGU+bW91c2VDaGlsZHJlbjwvY29kZT5cblx0ICogcHJvcGVydHkgb2YgdGhlIHBhcmVudCBpbnN0YW5jZSB0byA8Y29kZT5mYWxzZTwvY29kZT4uPC9wPlxuXHQgKlxuXHQgKiA8cD4gTm8gZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBzZXR0aW5nIHRoaXMgcHJvcGVydHkuIFlvdSBtdXN0IHVzZSB0aGVcblx0ICogPGNvZGU+YWRkRXZlbnRMaXN0ZW5lcigpPC9jb2RlPiBtZXRob2QgdG8gY3JlYXRlIGludGVyYWN0aXZlXG5cdCAqIGZ1bmN0aW9uYWxpdHkuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBtb3VzZUNoaWxkcmVuKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21vdXNlQ2hpbGRyZW47XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1vdXNlQ2hpbGRyZW4odmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9tb3VzZUNoaWxkcmVuID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fbW91c2VDaGlsZHJlbiA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcFVwZGF0ZUltcGxpY2l0TW91c2VFbmFibGVkKHRoaXMuX3BQYXJlbnQ/IHRoaXMuX3BQYXJlbnQubW91c2VDaGlsZHJlbiA6IHRydWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjaGlsZHJlbiBvZiB0aGlzIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBnZXQgbnVtQ2hpbGRyZW4oKTpudW1iZXIgLyppbnQqL1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNoaWxkcmVuIG9mIHRoZSBvYmplY3QgYXJlIHRhYiBlbmFibGVkLiBFbmFibGVzIG9yXG5cdCAqIGRpc2FibGVzIHRhYmJpbmcgZm9yIHRoZSBjaGlsZHJlbiBvZiB0aGUgb2JqZWN0LiBUaGUgZGVmYXVsdCBpc1xuXHQgKiA8Y29kZT50cnVlPC9jb2RlPi5cblx0ICpcblx0ICogPHA+PGI+Tm90ZTo8L2I+IERvIG5vdCB1c2UgdGhlIDxjb2RlPnRhYkNoaWxkcmVuPC9jb2RlPiBwcm9wZXJ0eSB3aXRoXG5cdCAqIEZsZXguIEluc3RlYWQsIHVzZSB0aGVcblx0ICogPGNvZGU+bXguY29yZS5VSUNvbXBvbmVudC5oYXNGb2N1c2FibGVDaGlsZHJlbjwvY29kZT4gcHJvcGVydHkuPC9wPlxuXHQgKlxuXHQgKiBAdGhyb3dzIElsbGVnYWxPcGVyYXRpb25FcnJvciBDYWxsaW5nIHRoaXMgcHJvcGVydHkgb2YgdGhlIFN0YWdlIG9iamVjdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgYW4gZXhjZXB0aW9uLiBUaGUgU3RhZ2Ugb2JqZWN0IGRvZXNcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGltcGxlbWVudCB0aGlzIHByb3BlcnR5LlxuXHQgKi9cblx0cHVibGljIHRhYkNoaWxkcmVuOmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIENhbGxpbmcgdGhlIDxjb2RlPm5ldyBEaXNwbGF5T2JqZWN0Q29udGFpbmVyKCk8L2NvZGU+IGNvbnN0cnVjdG9yIHRocm93c1xuXHQgKiBhbiA8Y29kZT5Bcmd1bWVudEVycm9yPC9jb2RlPiBleGNlcHRpb24uIFlvdSA8aT5jYW48L2k+LCBob3dldmVyLCBjYWxsXG5cdCAqIGNvbnN0cnVjdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBzdWJjbGFzc2VzIG9mIERpc3BsYXlPYmplY3RDb250YWluZXI6XG5cdCAqIDx1bD5cblx0ICogICA8bGk+PGNvZGU+bmV3IExvYWRlcigpPC9jb2RlPjwvbGk+XG5cdCAqICAgPGxpPjxjb2RlPm5ldyBTcHJpdGUoKTwvY29kZT48L2xpPlxuXHQgKiAgIDxsaT48Y29kZT5uZXcgTW92aWVDbGlwKCk8L2NvZGU+PC9saT5cblx0ICogPC91bD5cblx0ICovXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGNoaWxkIERpc3BsYXlPYmplY3QgaW5zdGFuY2UgdG8gdGhpcyBEaXNwbGF5T2JqZWN0Q29udGFpbmVyXG5cdCAqIGluc3RhbmNlLiBUaGUgY2hpbGQgaXMgYWRkZWQgdG8gdGhlIGZyb250KHRvcCkgb2YgYWxsIG90aGVyIGNoaWxkcmVuIGluXG5cdCAqIHRoaXMgRGlzcGxheU9iamVjdENvbnRhaW5lciBpbnN0YW5jZS4oVG8gYWRkIGEgY2hpbGQgdG8gYSBzcGVjaWZpYyBpbmRleFxuXHQgKiBwb3NpdGlvbiwgdXNlIHRoZSA8Y29kZT5hZGRDaGlsZEF0KCk8L2NvZGU+IG1ldGhvZC4pXG5cdCAqXG5cdCAqIDxwPklmIHlvdSBhZGQgYSBjaGlsZCBvYmplY3QgdGhhdCBhbHJlYWR5IGhhcyBhIGRpZmZlcmVudCBkaXNwbGF5IG9iamVjdFxuXHQgKiBjb250YWluZXIgYXMgYSBwYXJlbnQsIHRoZSBvYmplY3QgaXMgcmVtb3ZlZCBmcm9tIHRoZSBjaGlsZCBsaXN0IG9mIHRoZVxuXHQgKiBvdGhlciBkaXNwbGF5IG9iamVjdCBjb250YWluZXIuIDwvcD5cblx0ICpcblx0ICogPHA+PGI+Tm90ZTo8L2I+IFRoZSBjb21tYW5kIDxjb2RlPnN0YWdlLmFkZENoaWxkKCk8L2NvZGU+IGNhbiBjYXVzZVxuXHQgKiBwcm9ibGVtcyB3aXRoIGEgcHVibGlzaGVkIFNXRiBmaWxlLCBpbmNsdWRpbmcgc2VjdXJpdHkgcHJvYmxlbXMgYW5kXG5cdCAqIGNvbmZsaWN0cyB3aXRoIG90aGVyIGxvYWRlZCBTV0YgZmlsZXMuIFRoZXJlIGlzIG9ubHkgb25lIFN0YWdlIHdpdGhpbiBhXG5cdCAqIEZsYXNoIHJ1bnRpbWUgaW5zdGFuY2UsIG5vIG1hdHRlciBob3cgbWFueSBTV0YgZmlsZXMgeW91IGxvYWQgaW50byB0aGVcblx0ICogcnVudGltZS4gU28sIGdlbmVyYWxseSwgb2JqZWN0cyBzaG91bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBTdGFnZSxcblx0ICogZGlyZWN0bHksIGF0IGFsbC4gVGhlIG9ubHkgb2JqZWN0IHRoZSBTdGFnZSBzaG91bGQgY29udGFpbiBpcyB0aGUgcm9vdFxuXHQgKiBvYmplY3QuIENyZWF0ZSBhIERpc3BsYXlPYmplY3RDb250YWluZXIgdG8gY29udGFpbiBhbGwgb2YgdGhlIGl0ZW1zIG9uIHRoZVxuXHQgKiBkaXNwbGF5IGxpc3QuIFRoZW4sIGlmIG5lY2Vzc2FyeSwgYWRkIHRoYXQgRGlzcGxheU9iamVjdENvbnRhaW5lciBpbnN0YW5jZVxuXHQgKiB0byB0aGUgU3RhZ2UuPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gY2hpbGQgVGhlIERpc3BsYXlPYmplY3QgaW5zdGFuY2UgdG8gYWRkIGFzIGEgY2hpbGQgb2YgdGhpc1xuXHQgKiAgICAgICAgICAgICAgRGlzcGxheU9iamVjdENvbnRhaW5lciBpbnN0YW5jZS5cblx0ICogQHJldHVybiBUaGUgRGlzcGxheU9iamVjdCBpbnN0YW5jZSB0aGF0IHlvdSBwYXNzIGluIHRoZSA8Y29kZT5jaGlsZDwvY29kZT5cblx0ICogICAgICAgICBwYXJhbWV0ZXIuXG5cdCAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciBUaHJvd3MgaWYgdGhlIGNoaWxkIGlzIHRoZSBzYW1lIGFzIHRoZSBwYXJlbnQuIEFsc29cblx0ICogICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBpZiB0aGUgY2FsbGVyIGlzIGEgY2hpbGQob3IgZ3JhbmRjaGlsZCBldGMuKVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGNoaWxkIGJlaW5nIGFkZGVkLlxuXHQgKiBAZXZlbnQgYWRkZWQgRGlzcGF0Y2hlZCB3aGVuIGEgZGlzcGxheSBvYmplY3QgaXMgYWRkZWQgdG8gdGhlIGRpc3BsYXlcblx0ICogICAgICAgICAgICAgIGxpc3QuXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ2hpbGQoY2hpbGQ6RGlzcGxheU9iamVjdCk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0aWYgKGNoaWxkID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgY2hpbGQgY2Fubm90IGJlIG51bGwuXCIpO1xuXG5cdFx0Ly9pZiBjaGlsZCBhbHJlYWR5IGhhcyBhIHBhcmVudCwgcmVtb3ZlIGl0LlxuXHRcdGlmIChjaGlsZC5fcFBhcmVudClcblx0XHRcdGNoaWxkLl9wUGFyZW50LnJlbW92ZUNoaWxkSW50ZXJuYWwoY2hpbGQpO1xuXG5cdFx0Y2hpbGQuaVNldFBhcmVudCh0aGlzKTtcblxuXHRcdHRoaXMuX2NoaWxkcmVuLnB1c2goY2hpbGQpO1xuXG5cdFx0cmV0dXJuIGNoaWxkO1xuXHR9XG5cblxuXHQvKipcblx0ICogQWRkcyBhIGNoaWxkIERpc3BsYXlPYmplY3QgaW5zdGFuY2UgdG8gdGhpcyBEaXNwbGF5T2JqZWN0Q29udGFpbmVyXG5cdCAqIGluc3RhbmNlLiBUaGUgY2hpbGQgaXMgYWRkZWQgYXQgdGhlIGluZGV4IHBvc2l0aW9uIHNwZWNpZmllZC4gQW4gaW5kZXggb2Zcblx0ICogMCByZXByZXNlbnRzIHRoZSBiYWNrKGJvdHRvbSkgb2YgdGhlIGRpc3BsYXkgbGlzdCBmb3IgdGhpc1xuXHQgKiBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIG9iamVjdC5cblx0ICpcblx0ICogPHA+Rm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aHJlZSBkaXNwbGF5IG9iamVjdHMsIGxhYmVsZWRcblx0ICogYSwgYiwgYW5kIGMsIGF0IGluZGV4IHBvc2l0aW9ucyAwLCAyLCBhbmQgMSwgcmVzcGVjdGl2ZWx5OjwvcD5cblx0ICpcblx0ICogPHA+SWYgeW91IGFkZCBhIGNoaWxkIG9iamVjdCB0aGF0IGFscmVhZHkgaGFzIGEgZGlmZmVyZW50IGRpc3BsYXkgb2JqZWN0XG5cdCAqIGNvbnRhaW5lciBhcyBhIHBhcmVudCwgdGhlIG9iamVjdCBpcyByZW1vdmVkIGZyb20gdGhlIGNoaWxkIGxpc3Qgb2YgdGhlXG5cdCAqIG90aGVyIGRpc3BsYXkgb2JqZWN0IGNvbnRhaW5lci4gPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gY2hpbGQgVGhlIERpc3BsYXlPYmplY3QgaW5zdGFuY2UgdG8gYWRkIGFzIGEgY2hpbGQgb2YgdGhpc1xuXHQgKiAgICAgICAgICAgICAgRGlzcGxheU9iamVjdENvbnRhaW5lciBpbnN0YW5jZS5cblx0ICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBwb3NpdGlvbiB0byB3aGljaCB0aGUgY2hpbGQgaXMgYWRkZWQuIElmIHlvdVxuXHQgKiAgICAgICAgICAgICAgc3BlY2lmeSBhIGN1cnJlbnRseSBvY2N1cGllZCBpbmRleCBwb3NpdGlvbiwgdGhlIGNoaWxkIG9iamVjdFxuXHQgKiAgICAgICAgICAgICAgdGhhdCBleGlzdHMgYXQgdGhhdCBwb3NpdGlvbiBhbmQgYWxsIGhpZ2hlciBwb3NpdGlvbnMgYXJlXG5cdCAqICAgICAgICAgICAgICBtb3ZlZCB1cCBvbmUgcG9zaXRpb24gaW4gdGhlIGNoaWxkIGxpc3QuXG5cdCAqIEByZXR1cm4gVGhlIERpc3BsYXlPYmplY3QgaW5zdGFuY2UgdGhhdCB5b3UgcGFzcyBpbiB0aGUgPGNvZGU+Y2hpbGQ8L2NvZGU+XG5cdCAqICAgICAgICAgcGFyYW1ldGVyLlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgVGhyb3dzIGlmIHRoZSBjaGlsZCBpcyB0aGUgc2FtZSBhcyB0aGUgcGFyZW50LiBBbHNvXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgaWYgdGhlIGNhbGxlciBpcyBhIGNoaWxkKG9yIGdyYW5kY2hpbGQgZXRjLilcblx0ICogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjaGlsZCBiZWluZyBhZGRlZC5cblx0ICogQHRocm93cyBSYW5nZUVycm9yICAgIFRocm93cyBpZiB0aGUgaW5kZXggcG9zaXRpb24gZG9lcyBub3QgZXhpc3QgaW4gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCBsaXN0LlxuXHQgKiBAZXZlbnQgYWRkZWQgRGlzcGF0Y2hlZCB3aGVuIGEgZGlzcGxheSBvYmplY3QgaXMgYWRkZWQgdG8gdGhlIGRpc3BsYXlcblx0ICogICAgICAgICAgICAgIGxpc3QuXG5cdCAqL1xuXHRwdWJsaWMgYWRkQ2hpbGRBdChjaGlsZDpEaXNwbGF5T2JqZWN0LCBpbmRleDpudW1iZXIgLyppbnQqLyk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIGNoaWxkO1xuXHR9XG5cblx0cHVibGljIGFkZENoaWxkcmVuKC4uLmNoaWxkYXJyYXk6QXJyYXk8RGlzcGxheU9iamVjdD4pXG5cdHtcblx0XHR2YXIgbGVuOm51bWJlciA9IGNoaWxkYXJyYXkubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8ICBsZW47IGkrKylcblx0XHRcdHRoaXMuYWRkQ2hpbGQoY2hpbGRhcnJheVtpXSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHZhciBjbG9uZTpEaXNwbGF5T2JqZWN0Q29udGFpbmVyID0gbmV3IERpc3BsYXlPYmplY3RDb250YWluZXIoKTtcblx0XHRjbG9uZS5waXZvdCA9IHRoaXMucGl2b3Q7XG5cdFx0Y2xvbmUuX2lNYXRyaXgzRCA9IHRoaXMuX2lNYXRyaXgzRDtcblx0XHRjbG9uZS5wYXJ0aXRpb24gPSB0aGlzLnBhcnRpdGlvbjtcblx0XHRjbG9uZS5uYW1lID0gbmFtZTtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fY2hpbGRyZW4ubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgKytpKVxuXHRcdFx0Y2xvbmUuYWRkQ2hpbGQodGhpcy5fY2hpbGRyZW5baV0uY2xvbmUoKSk7XG5cblx0XHQvLyB0b2RvOiBpbXBsZW1lbnQgZm9yIGFsbCBzdWJ0eXBlc1xuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBkaXNwbGF5IG9iamVjdCBpcyBhIGNoaWxkIG9mIHRoZVxuXHQgKiBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIGluc3RhbmNlIG9yIHRoZSBpbnN0YW5jZSBpdHNlbGYuIFRoZSBzZWFyY2hcblx0ICogaW5jbHVkZXMgdGhlIGVudGlyZSBkaXNwbGF5IGxpc3QgaW5jbHVkaW5nIHRoaXMgRGlzcGxheU9iamVjdENvbnRhaW5lclxuXHQgKiBpbnN0YW5jZS4gR3JhbmRjaGlsZHJlbiwgZ3JlYXQtZ3JhbmRjaGlsZHJlbiwgYW5kIHNvIG9uIGVhY2ggcmV0dXJuXG5cdCAqIDxjb2RlPnRydWU8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0gY2hpbGQgVGhlIGNoaWxkIG9iamVjdCB0byB0ZXN0LlxuXHQgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSA8Y29kZT5jaGlsZDwvY29kZT4gb2JqZWN0IGlzIGEgY2hpbGQgb2Zcblx0ICogICAgICAgICB0aGUgRGlzcGxheU9iamVjdENvbnRhaW5lciBvciB0aGUgY29udGFpbmVyIGl0c2VsZjsgb3RoZXJ3aXNlXG5cdCAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGNvbnRhaW5zKGNoaWxkOkRpc3BsYXlPYmplY3QpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9jaGlsZHJlbi5pbmRleE9mKGNoaWxkKSA+PSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZVdpdGhDaGlsZHJlbigpXG5cdHtcblx0XHR0aGlzLmRpc3Bvc2UoKTtcblxuXHRcdHdoaWxlICh0aGlzLm51bUNoaWxkcmVuID4gMClcblx0XHRcdHRoaXMuZ2V0Q2hpbGRBdCgwKS5kaXNwb3NlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY2hpbGQgZGlzcGxheSBvYmplY3QgaW5zdGFuY2UgdGhhdCBleGlzdHMgYXQgdGhlIHNwZWNpZmllZFxuXHQgKiBpbmRleC5cblx0ICpcblx0ICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBwb3NpdGlvbiBvZiB0aGUgY2hpbGQgb2JqZWN0LlxuXHQgKiBAcmV0dXJuIFRoZSBjaGlsZCBkaXNwbGF5IG9iamVjdCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHBvc2l0aW9uLlxuXHQgKiBAdGhyb3dzIFJhbmdlRXJyb3IgICAgVGhyb3dzIGlmIHRoZSBpbmRleCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2hpbGRcblx0ICogICAgICAgICAgICAgICAgICAgICAgIGxpc3QuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2hpbGRBdChpbmRleDpudW1iZXIgLyppbnQqLyk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0dmFyIGNoaWxkOkRpc3BsYXlPYmplY3QgPSB0aGlzLl9jaGlsZHJlbltpbmRleF07XG5cblx0XHRpZiAoY2hpbGQgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKFwiSW5kZXggZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNoaWxkIGxpc3Qgb2YgdGhlIGNhbGxlclwiKTtcblxuXHRcdHJldHVybiBjaGlsZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBjaGlsZCBkaXNwbGF5IG9iamVjdCB0aGF0IGV4aXN0cyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gSWZcblx0ICogbW9yZSB0aGF0IG9uZSBjaGlsZCBkaXNwbGF5IG9iamVjdCBoYXMgdGhlIHNwZWNpZmllZCBuYW1lLCB0aGUgbWV0aG9kXG5cdCAqIHJldHVybnMgdGhlIGZpcnN0IG9iamVjdCBpbiB0aGUgY2hpbGQgbGlzdC5cblx0ICpcblx0ICogPHA+VGhlIDxjb2RlPmdldENoaWxkQXQoKTwvY29kZT4gbWV0aG9kIGlzIGZhc3RlciB0aGFuIHRoZVxuXHQgKiA8Y29kZT5nZXRDaGlsZEJ5TmFtZSgpPC9jb2RlPiBtZXRob2QuIFRoZSA8Y29kZT5nZXRDaGlsZEF0KCk8L2NvZGU+IG1ldGhvZFxuXHQgKiBhY2Nlc3NlcyBhIGNoaWxkIGZyb20gYSBjYWNoZWQgYXJyYXksIHdoZXJlYXMgdGhlXG5cdCAqIDxjb2RlPmdldENoaWxkQnlOYW1lKCk8L2NvZGU+IG1ldGhvZCBoYXMgdG8gdHJhdmVyc2UgYSBsaW5rZWQgbGlzdCB0b1xuXHQgKiBhY2Nlc3MgYSBjaGlsZC48L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjaGlsZCB0byByZXR1cm4uXG5cdCAqIEByZXR1cm4gVGhlIGNoaWxkIGRpc3BsYXkgb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLlxuXHQgKi9cblx0cHVibGljIGdldENoaWxkQnlOYW1lKG5hbWU6c3RyaW5nKTpEaXNwbGF5T2JqZWN0XG5cdHtcblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX2NoaWxkcmVuLmxlbmd0aDtcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCBsZW47ICsraSlcblx0XHRcdGlmICh0aGlzLl9jaGlsZHJlbltpXS5uYW1lID09IG5hbWUpXG5cdFx0XHRcdHJldHVybiB0aGlzLl9jaGlsZHJlbltpXTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIGluZGV4IHBvc2l0aW9uIG9mIGEgPGNvZGU+Y2hpbGQ8L2NvZGU+IERpc3BsYXlPYmplY3QgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBjaGlsZCBUaGUgRGlzcGxheU9iamVjdCBpbnN0YW5jZSB0byBpZGVudGlmeS5cblx0ICogQHJldHVybiBUaGUgaW5kZXggcG9zaXRpb24gb2YgdGhlIGNoaWxkIGRpc3BsYXkgb2JqZWN0IHRvIGlkZW50aWZ5LlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgVGhyb3dzIGlmIHRoZSBjaGlsZCBwYXJhbWV0ZXIgaXMgbm90IGEgY2hpbGQgb2YgdGhpc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGdldENoaWxkSW5kZXgoY2hpbGQ6RGlzcGxheU9iamVjdCk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHZhciBjaGlsZEluZGV4Om51bWJlciA9IHRoaXMuX2NoaWxkcmVuLmluZGV4T2YoY2hpbGQpO1xuXG5cdFx0aWYgKGNoaWxkSW5kZXggPT0gLTEpXG5cdFx0XHR0aHJvdyBuZXcgQXJndW1lbnRFcnJvcihcIkNoaWxkIHBhcmFtZXRlciBpcyBub3QgYSBjaGlsZCBvZiB0aGUgY2FsbGVyXCIpO1xuXG5cdFx0cmV0dXJuIGNoaWxkSW5kZXg7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgbGllIHVuZGVyIHRoZSBzcGVjaWZpZWQgcG9pbnQgYW5kIGFyZVxuXHQgKiBjaGlsZHJlbihvciBncmFuZGNoaWxkcmVuLCBhbmQgc28gb24pIG9mIHRoaXMgRGlzcGxheU9iamVjdENvbnRhaW5lclxuXHQgKiBpbnN0YW5jZS4gQW55IGNoaWxkIG9iamVjdHMgdGhhdCBhcmUgaW5hY2Nlc3NpYmxlIGZvciBzZWN1cml0eSByZWFzb25zIGFyZVxuXHQgKiBvbWl0dGVkIGZyb20gdGhlIHJldHVybmVkIGFycmF5LiBUbyBkZXRlcm1pbmUgd2hldGhlciB0aGlzIHNlY3VyaXR5XG5cdCAqIHJlc3RyaWN0aW9uIGFmZmVjdHMgdGhlIHJldHVybmVkIGFycmF5LCBjYWxsIHRoZVxuXHQgKiA8Y29kZT5hcmVJbmFjY2Vzc2libGVPYmplY3RzVW5kZXJQb2ludCgpPC9jb2RlPiBtZXRob2QuXG5cdCAqXG5cdCAqIDxwPlRoZSA8Y29kZT5wb2ludDwvY29kZT4gcGFyYW1ldGVyIGlzIGluIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoZVxuXHQgKiBTdGFnZSwgd2hpY2ggbWF5IGRpZmZlciBmcm9tIHRoZSBjb29yZGluYXRlIHNwYWNlIG9mIHRoZSBkaXNwbGF5IG9iamVjdFxuXHQgKiBjb250YWluZXIodW5sZXNzIHRoZSBkaXNwbGF5IG9iamVjdCBjb250YWluZXIgaXMgdGhlIFN0YWdlKS4gWW91IGNhbiB1c2Vcblx0ICogdGhlIDxjb2RlPmdsb2JhbFRvTG9jYWwoKTwvY29kZT4gYW5kIHRoZSA8Y29kZT5sb2NhbFRvR2xvYmFsKCk8L2NvZGU+XG5cdCAqIG1ldGhvZHMgdG8gY29udmVydCBwb2ludHMgYmV0d2VlbiB0aGVzZSBjb29yZGluYXRlIHNwYWNlcy48L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBwb2ludCBUaGUgcG9pbnQgdW5kZXIgd2hpY2ggdG8gbG9vay5cblx0ICogQHJldHVybiBBbiBhcnJheSBvZiBvYmplY3RzIHRoYXQgbGllIHVuZGVyIHRoZSBzcGVjaWZpZWQgcG9pbnQgYW5kIGFyZVxuXHQgKiAgICAgICAgIGNoaWxkcmVuKG9yIGdyYW5kY2hpbGRyZW4sIGFuZCBzbyBvbikgb2YgdGhpc1xuXHQgKiAgICAgICAgIERpc3BsYXlPYmplY3RDb250YWluZXIgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T2JqZWN0c1VuZGVyUG9pbnQocG9pbnQ6UG9pbnQpOkFycmF5PERpc3BsYXlPYmplY3Q+XG5cdHtcblx0XHRyZXR1cm4gbmV3IEFycmF5PERpc3BsYXlPYmplY3Q+KCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIDxjb2RlPmNoaWxkPC9jb2RlPiBEaXNwbGF5T2JqZWN0IGluc3RhbmNlIGZyb20gdGhlXG5cdCAqIGNoaWxkIGxpc3Qgb2YgdGhlIERpc3BsYXlPYmplY3RDb250YWluZXIgaW5zdGFuY2UuIFRoZSA8Y29kZT5wYXJlbnQ8L2NvZGU+XG5cdCAqIHByb3BlcnR5IG9mIHRoZSByZW1vdmVkIGNoaWxkIGlzIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPiAsIGFuZCB0aGUgb2JqZWN0XG5cdCAqIGlzIGdhcmJhZ2UgY29sbGVjdGVkIGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlIGNoaWxkIGV4aXN0LiBUaGUgaW5kZXhcblx0ICogcG9zaXRpb25zIG9mIGFueSBkaXNwbGF5IG9iamVjdHMgYWJvdmUgdGhlIGNoaWxkIGluIHRoZVxuXHQgKiBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIGFyZSBkZWNyZWFzZWQgYnkgMS5cblx0ICpcblx0ICogPHA+VGhlIGdhcmJhZ2UgY29sbGVjdG9yIHJlYWxsb2NhdGVzIHVudXNlZCBtZW1vcnkgc3BhY2UuIFdoZW4gYSB2YXJpYWJsZVxuXHQgKiBvciBvYmplY3QgaXMgbm8gbG9uZ2VyIGFjdGl2ZWx5IHJlZmVyZW5jZWQgb3Igc3RvcmVkIHNvbWV3aGVyZSwgdGhlXG5cdCAqIGdhcmJhZ2UgY29sbGVjdG9yIHN3ZWVwcyB0aHJvdWdoIGFuZCB3aXBlcyBvdXQgdGhlIG1lbW9yeSBzcGFjZSBpdCB1c2VkIHRvXG5cdCAqIG9jY3VweSBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIGl0IGV4aXN0LjwvcD5cblx0ICpcblx0ICogQHBhcmFtIGNoaWxkIFRoZSBEaXNwbGF5T2JqZWN0IGluc3RhbmNlIHRvIHJlbW92ZS5cblx0ICogQHJldHVybiBUaGUgRGlzcGxheU9iamVjdCBpbnN0YW5jZSB0aGF0IHlvdSBwYXNzIGluIHRoZSA8Y29kZT5jaGlsZDwvY29kZT5cblx0ICogICAgICAgICBwYXJhbWV0ZXIuXG5cdCAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciBUaHJvd3MgaWYgdGhlIGNoaWxkIHBhcmFtZXRlciBpcyBub3QgYSBjaGlsZCBvZiB0aGlzXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQ2hpbGQoY2hpbGQ6RGlzcGxheU9iamVjdCk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0aWYgKGNoaWxkID09IG51bGwpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgY2hpbGQgY2Fubm90IGJlIG51bGxcIik7XG5cblx0XHR0aGlzLnJlbW92ZUNoaWxkSW50ZXJuYWwoY2hpbGQpO1xuXG5cdFx0Y2hpbGQuaVNldFBhcmVudChudWxsKTtcblxuXHRcdHJldHVybiBjaGlsZDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgY2hpbGQgRGlzcGxheU9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgPGNvZGU+aW5kZXg8L2NvZGU+XG5cdCAqIHBvc2l0aW9uIGluIHRoZSBjaGlsZCBsaXN0IG9mIHRoZSBEaXNwbGF5T2JqZWN0Q29udGFpbmVyLiBUaGVcblx0ICogPGNvZGU+cGFyZW50PC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgcmVtb3ZlZCBjaGlsZCBpcyBzZXQgdG9cblx0ICogPGNvZGU+bnVsbDwvY29kZT4sIGFuZCB0aGUgb2JqZWN0IGlzIGdhcmJhZ2UgY29sbGVjdGVkIGlmIG5vIG90aGVyXG5cdCAqIHJlZmVyZW5jZXMgdG8gdGhlIGNoaWxkIGV4aXN0LiBUaGUgaW5kZXggcG9zaXRpb25zIG9mIGFueSBkaXNwbGF5IG9iamVjdHNcblx0ICogYWJvdmUgdGhlIGNoaWxkIGluIHRoZSBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIGFyZSBkZWNyZWFzZWQgYnkgMS5cblx0ICpcblx0ICogPHA+VGhlIGdhcmJhZ2UgY29sbGVjdG9yIHJlYWxsb2NhdGVzIHVudXNlZCBtZW1vcnkgc3BhY2UuIFdoZW4gYSB2YXJpYWJsZVxuXHQgKiBvciBvYmplY3QgaXMgbm8gbG9uZ2VyIGFjdGl2ZWx5IHJlZmVyZW5jZWQgb3Igc3RvcmVkIHNvbWV3aGVyZSwgdGhlXG5cdCAqIGdhcmJhZ2UgY29sbGVjdG9yIHN3ZWVwcyB0aHJvdWdoIGFuZCB3aXBlcyBvdXQgdGhlIG1lbW9yeSBzcGFjZSBpdCB1c2VkIHRvXG5cdCAqIG9jY3VweSBpZiBubyBvdGhlciByZWZlcmVuY2VzIHRvIGl0IGV4aXN0LjwvcD5cblx0ICpcblx0ICogQHBhcmFtIGluZGV4IFRoZSBjaGlsZCBpbmRleCBvZiB0aGUgRGlzcGxheU9iamVjdCB0byByZW1vdmUuXG5cdCAqIEByZXR1cm4gVGhlIERpc3BsYXlPYmplY3QgaW5zdGFuY2UgdGhhdCB3YXMgcmVtb3ZlZC5cblx0ICogQHRocm93cyBSYW5nZUVycm9yICAgIFRocm93cyBpZiB0aGUgaW5kZXggZG9lcyBub3QgZXhpc3QgaW4gdGhlIGNoaWxkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBsaXN0LlxuXHQgKiBAdGhyb3dzIFNlY3VyaXR5RXJyb3IgVGhpcyBjaGlsZCBkaXNwbGF5IG9iamVjdCBiZWxvbmdzIHRvIGEgc2FuZGJveCB0b1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggdGhlIGNhbGxpbmcgb2JqZWN0IGRvZXMgbm90IGhhdmUgYWNjZXNzLiBZb3Vcblx0ICogICAgICAgICAgICAgICAgICAgICAgIGNhbiBhdm9pZCB0aGlzIHNpdHVhdGlvbiBieSBoYXZpbmcgdGhlIGNoaWxkIG1vdmllXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBjYWxsIHRoZSA8Y29kZT5TZWN1cml0eS5hbGxvd0RvbWFpbigpPC9jb2RlPiBtZXRob2QuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQ2hpbGRBdChpbmRleDpudW1iZXIgLyppbnQqLyk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy5fY2hpbGRyZW5baW5kZXhdKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCA8Y29kZT5jaGlsZDwvY29kZT4gRGlzcGxheU9iamVjdCBpbnN0YW5jZXMgZnJvbSB0aGUgY2hpbGQgbGlzdFxuXHQgKiBvZiB0aGUgRGlzcGxheU9iamVjdENvbnRhaW5lciBpbnN0YW5jZS4gVGhlIDxjb2RlPnBhcmVudDwvY29kZT4gcHJvcGVydHlcblx0ICogb2YgdGhlIHJlbW92ZWQgY2hpbGRyZW4gaXMgc2V0IHRvIDxjb2RlPm51bGw8L2NvZGU+LCBhbmQgdGhlIG9iamVjdHMgYXJlXG5cdCAqIGdhcmJhZ2UgY29sbGVjdGVkIGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlIGNoaWxkcmVuIGV4aXN0LlxuXHQgKlxuXHQgKiBUaGUgZ2FyYmFnZSBjb2xsZWN0b3IgcmVhbGxvY2F0ZXMgdW51c2VkIG1lbW9yeSBzcGFjZS4gV2hlbiBhIHZhcmlhYmxlIG9yXG5cdCAqIG9iamVjdCBpcyBubyBsb25nZXIgYWN0aXZlbHkgcmVmZXJlbmNlZCBvciBzdG9yZWQgc29tZXdoZXJlLCB0aGUgZ2FyYmFnZVxuXHQgKiBjb2xsZWN0b3Igc3dlZXBzIHRocm91Z2ggYW5kIHdpcGVzIG91dCB0aGUgbWVtb3J5IHNwYWNlIGl0IHVzZWQgdG8gb2NjdXB5XG5cdCAqIGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gaXQgZXhpc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBiZWdpbkluZGV4IFRoZSBiZWdpbm5pbmcgcG9zaXRpb24uIEEgdmFsdWUgc21hbGxlciB0aGFuIDAgdGhyb3dzIGEgUmFuZ2VFcnJvci5cblx0ICogQHBhcmFtIGVuZEluZGV4IFRoZSBlbmRpbmcgcG9zaXRpb24uIEEgdmFsdWUgc21hbGxlciB0aGFuIDAgdGhyb3dzIGEgUmFuZ2VFcnJvci5cblx0ICogQHRocm93cyBSYW5nZUVycm9yICAgIFRocm93cyBpZiB0aGUgYmVnaW5JbmRleCBvciBlbmRJbmRleCBwb3NpdGlvbnMgZG9cblx0ICogICAgICAgICAgICAgICAgICAgICAgIG5vdCBleGlzdCBpbiB0aGUgY2hpbGQgbGlzdC5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVDaGlsZHJlbihiZWdpbkluZGV4Om51bWJlciAvKmludCovID0gMCwgZW5kSW5kZXg6bnVtYmVyIC8qaW50Ki8gPSAyMTQ3NDgzNjQ3KVxuXHR7XG5cdFx0aWYgKGJlZ2luSW5kZXggPCAwKVxuXHRcdFx0dGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJiZWdpbkluZGV4IGlzIG91dCBvZiByYW5nZSBvZiB0aGUgY2hpbGQgbGlzdFwiKTtcblxuXHRcdGlmIChlbmRJbmRleCA+IHRoaXMuX2NoaWxkcmVuLmxlbmd0aClcblx0XHRcdHRocm93IG5ldyBSYW5nZUVycm9yKFwiZW5kSW5kZXggaXMgb3V0IG9mIHJhbmdlIG9mIHRoZSBjaGlsZCBsaXN0XCIpO1xuXG5cdFx0Zm9yKHZhciBpOm51bWJlciAvKnVpbnQqLyA9IGJlZ2luSW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKVxuXHRcdFx0dGhpcy5yZW1vdmVDaGlsZCh0aGlzLl9jaGlsZHJlbltpXSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlcyB0aGUgcG9zaXRpb24gb2YgYW4gZXhpc3RpbmcgY2hpbGQgaW4gdGhlIGRpc3BsYXkgb2JqZWN0IGNvbnRhaW5lci5cblx0ICogVGhpcyBhZmZlY3RzIHRoZSBsYXllcmluZyBvZiBjaGlsZCBvYmplY3RzLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZ1xuXHQgKiBleGFtcGxlIHNob3dzIHRocmVlIGRpc3BsYXkgb2JqZWN0cywgbGFiZWxlZCBhLCBiLCBhbmQgYywgYXQgaW5kZXhcblx0ICogcG9zaXRpb25zIDAsIDEsIGFuZCAyLCByZXNwZWN0aXZlbHk6XG5cdCAqXG5cdCAqIDxwPldoZW4geW91IHVzZSB0aGUgPGNvZGU+c2V0Q2hpbGRJbmRleCgpPC9jb2RlPiBtZXRob2QgYW5kIHNwZWNpZnkgYW5cblx0ICogaW5kZXggcG9zaXRpb24gdGhhdCBpcyBhbHJlYWR5IG9jY3VwaWVkLCB0aGUgb25seSBwb3NpdGlvbnMgdGhhdCBjaGFuZ2Vcblx0ICogYXJlIHRob3NlIGluIGJldHdlZW4gdGhlIGRpc3BsYXkgb2JqZWN0J3MgZm9ybWVyIGFuZCBuZXcgcG9zaXRpb24uIEFsbFxuXHQgKiBvdGhlcnMgd2lsbCBzdGF5IHRoZSBzYW1lLiBJZiBhIGNoaWxkIGlzIG1vdmVkIHRvIGFuIGluZGV4IExPV0VSIHRoYW4gaXRzXG5cdCAqIGN1cnJlbnQgaW5kZXgsIGFsbCBjaGlsZHJlbiBpbiBiZXR3ZWVuIHdpbGwgSU5DUkVBU0UgYnkgMSBmb3IgdGhlaXIgaW5kZXhcblx0ICogcmVmZXJlbmNlLiBJZiBhIGNoaWxkIGlzIG1vdmVkIHRvIGFuIGluZGV4IEhJR0hFUiB0aGFuIGl0cyBjdXJyZW50IGluZGV4LFxuXHQgKiBhbGwgY2hpbGRyZW4gaW4gYmV0d2VlbiB3aWxsIERFQ1JFQVNFIGJ5IDEgZm9yIHRoZWlyIGluZGV4IHJlZmVyZW5jZS4gRm9yXG5cdCAqIGV4YW1wbGUsIGlmIHRoZSBkaXNwbGF5IG9iamVjdCBjb250YWluZXIgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUgaXMgbmFtZWRcblx0ICogPGNvZGU+Y29udGFpbmVyPC9jb2RlPiwgeW91IGNhbiBzd2FwIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGlzcGxheSBvYmplY3RzXG5cdCAqIGxhYmVsZWQgYSBhbmQgYiBieSBjYWxsaW5nIHRoZSBmb2xsb3dpbmcgY29kZTo8L3A+XG5cdCAqXG5cdCAqIDxwPlRoaXMgY29kZSByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgYXJyYW5nZW1lbnQgb2Ygb2JqZWN0czo8L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBjaGlsZCBUaGUgY2hpbGQgRGlzcGxheU9iamVjdCBpbnN0YW5jZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlXG5cdCAqICAgICAgICAgICAgICB0aGUgaW5kZXggbnVtYmVyLlxuXHQgKiBAcGFyYW0gaW5kZXggVGhlIHJlc3VsdGluZyBpbmRleCBudW1iZXIgZm9yIHRoZSA8Y29kZT5jaGlsZDwvY29kZT4gZGlzcGxheVxuXHQgKiAgICAgICAgICAgICAgb2JqZWN0LlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgVGhyb3dzIGlmIHRoZSBjaGlsZCBwYXJhbWV0ZXIgaXMgbm90IGEgY2hpbGQgb2YgdGhpc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LlxuXHQgKiBAdGhyb3dzIFJhbmdlRXJyb3IgICAgVGhyb3dzIGlmIHRoZSBpbmRleCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2hpbGRcblx0ICogICAgICAgICAgICAgICAgICAgICAgIGxpc3QuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q2hpbGRJbmRleChjaGlsZDpEaXNwbGF5T2JqZWN0LCBpbmRleDpudW1iZXIgLyppbnQqLylcblx0e1xuXHRcdC8vVE9ET1xuXHR9XG5cblx0LyoqXG5cdCAqIFN3YXBzIHRoZSB6LW9yZGVyIChmcm9udC10by1iYWNrIG9yZGVyKSBvZiB0aGUgdHdvIHNwZWNpZmllZCBjaGlsZFxuXHQgKiBvYmplY3RzLiBBbGwgb3RoZXIgY2hpbGQgb2JqZWN0cyBpbiB0aGUgZGlzcGxheSBvYmplY3QgY29udGFpbmVyIHJlbWFpbiBpblxuXHQgKiB0aGUgc2FtZSBpbmRleCBwb3NpdGlvbnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBjaGlsZDEgVGhlIGZpcnN0IGNoaWxkIG9iamVjdC5cblx0ICogQHBhcmFtIGNoaWxkMiBUaGUgc2Vjb25kIGNoaWxkIG9iamVjdC5cblx0ICogQHRocm93cyBBcmd1bWVudEVycm9yIFRocm93cyBpZiBlaXRoZXIgY2hpbGQgcGFyYW1ldGVyIGlzIG5vdCBhIGNoaWxkIG9mXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBzd2FwQ2hpbGRyZW4oY2hpbGQxOkRpc3BsYXlPYmplY3QsIGNoaWxkMjpEaXNwbGF5T2JqZWN0KVxuXHR7XG5cdFx0Ly9UT0RPXG5cdH1cblxuXHQvKipcblx0ICogU3dhcHMgdGhlIHotb3JkZXIoZnJvbnQtdG8tYmFjayBvcmRlcikgb2YgdGhlIGNoaWxkIG9iamVjdHMgYXQgdGhlIHR3b1xuXHQgKiBzcGVjaWZpZWQgaW5kZXggcG9zaXRpb25zIGluIHRoZSBjaGlsZCBsaXN0LiBBbGwgb3RoZXIgY2hpbGQgb2JqZWN0cyBpblxuXHQgKiB0aGUgZGlzcGxheSBvYmplY3QgY29udGFpbmVyIHJlbWFpbiBpbiB0aGUgc2FtZSBpbmRleCBwb3NpdGlvbnMuXG5cdCAqXG5cdCAqIEBwYXJhbSBpbmRleDEgVGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGlsZCBvYmplY3QuXG5cdCAqIEBwYXJhbSBpbmRleDIgVGhlIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQgY2hpbGQgb2JqZWN0LlxuXHQgKiBAdGhyb3dzIFJhbmdlRXJyb3IgSWYgZWl0aGVyIGluZGV4IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjaGlsZCBsaXN0LlxuXHQgKi9cblx0cHVibGljIHN3YXBDaGlsZHJlbkF0KGluZGV4MTpudW1iZXIgLyppbnQqLywgaW5kZXgyOm51bWJlciAvKmludCovKVxuXHR7XG5cdFx0Ly9UT0RPXG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBJbnZhbGlkYXRlU2NlbmVUcmFuc2Zvcm0oKVxuXHR7XG5cdFx0c3VwZXIucEludmFsaWRhdGVTY2VuZVRyYW5zZm9ybSgpO1xuXG5cdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9jaGlsZHJlbi5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyArK2kpXG5cdFx0XHR0aGlzLl9jaGlsZHJlbltpXS5wSW52YWxpZGF0ZVNjZW5lVHJhbnNmb3JtKCk7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIF9wVXBkYXRlU2NlbmUodmFsdWU6U2NlbmUpXG5cdHtcblx0XHRzdXBlci5fcFVwZGF0ZVNjZW5lKHZhbHVlKTtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fY2hpbGRyZW4ubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgKytpKVxuXHRcdFx0dGhpcy5fY2hpbGRyZW5baV0uX3BVcGRhdGVTY2VuZSh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIF9wVXBkYXRlSW1wbGljaXRNb3VzZUVuYWJsZWQodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdHN1cGVyLl9wVXBkYXRlSW1wbGljaXRNb3VzZUVuYWJsZWQodmFsdWUpO1xuXG5cdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9jaGlsZHJlbi5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyArK2kpXG5cdFx0XHR0aGlzLl9jaGlsZHJlbltpXS5fcFVwZGF0ZUltcGxpY2l0TW91c2VFbmFibGVkKHRoaXMuX21vdXNlQ2hpbGRyZW4pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBfcFVwZGF0ZUltcGxpY2l0VmlzaWJpbGl0eSh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0c3VwZXIuX3BVcGRhdGVJbXBsaWNpdFZpc2liaWxpdHkodmFsdWUpO1xuXG5cdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9jaGlsZHJlbi5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyArK2kpXG5cdFx0XHR0aGlzLl9jaGlsZHJlbltpXS5fcFVwZGF0ZUltcGxpY2l0VmlzaWJpbGl0eSh0aGlzLl9wSW1wbGljaXRWaXNpYmlsaXR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgX3BVcGRhdGVJbXBsaWNpdFBhcnRpdGlvbih2YWx1ZTpQYXJ0aXRpb24pXG5cdHtcblx0XHRzdXBlci5fcFVwZGF0ZUltcGxpY2l0UGFydGl0aW9uKHZhbHVlKTtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fY2hpbGRyZW4ubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgKytpKVxuXHRcdFx0dGhpcy5fY2hpbGRyZW5baV0uX3BVcGRhdGVJbXBsaWNpdFBhcnRpdGlvbih0aGlzLl9wSW1wbGljaXRQYXJ0aXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqXG5cdCAqIEBwYXJhbSBjaGlsZFxuXHQgKi9cblx0cHJpdmF0ZSByZW1vdmVDaGlsZEludGVybmFsKGNoaWxkOkRpc3BsYXlPYmplY3QpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHRoaXMuX2NoaWxkcmVuLnNwbGljZSh0aGlzLmdldENoaWxkSW5kZXgoY2hpbGQpLCAxKTtcblxuXHRcdHJldHVybiBjaGlsZDtcblx0fVxufVxuXG5leHBvcnQgPSBEaXNwbGF5T2JqZWN0Q29udGFpbmVyOyJdfQ== \ No newline at end of file diff --git a/lib/containers/DisplayObjectContainer.ts b/lib/containers/DisplayObjectContainer.ts new file mode 100644 index 00000000..e8e2b6ce --- /dev/null +++ b/lib/containers/DisplayObjectContainer.ts @@ -0,0 +1,561 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Point = require("awayjs-core/lib/core/geom/Point"); +import Partition = require("awayjs-core/lib/core/partition/Partition"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); +import Error = require("awayjs-core/lib/errors/Error"); +import RangeError = require("awayjs-core/lib/errors/RangeError"); + +/** + * The DisplayObjectContainer class is the base class for all objects that can + * serve as display object containers on the display list. The display list + * manages all objects displayed in the Flash runtimes. Use the + * DisplayObjectContainer class to arrange the display objects in the display + * list. Each DisplayObjectContainer object has its own child list for + * organizing the z-order of the objects. The z-order is the front-to-back + * order that determines which object is drawn in front, which is behind, and + * so on. + * + *

DisplayObject is an abstract base class; therefore, you cannot call + * DisplayObject directly. Invoking new DisplayObject() throws an + * ArgumentError exception.

+ * The DisplayObjectContainer class is an abstract base class for all objects + * that can contain child objects. It cannot be instantiated directly; calling + * the new DisplayObjectContainer() constructor throws an + * ArgumentError exception. + * + *

For more information, see the "Display Programming" chapter of the + * ActionScript 3.0 Developer's Guide.

+ */ +class DisplayObjectContainer extends DisplayObject implements IAsset +{ + private _mouseChildren:boolean = true; + private _children:Array = new Array(); + public _iIsRoot:boolean; + + /** + * + */ + public get assetType():string + { + return AssetType.CONTAINER; + } + + /** + * Determines whether or not the children of the object are mouse, or user + * input device, enabled. If an object is enabled, a user can interact with + * it by using a mouse or user input device. The default is + * true. + * + *

This property is useful when you create a button with an instance of + * the Sprite class(instead of using the SimpleButton class). When you use a + * Sprite instance to create a button, you can choose to decorate the button + * by using the addChild() method to add additional Sprite + * instances. This process can cause unexpected behavior with mouse events + * because the Sprite instances you add as children can become the target + * object of a mouse event when you expect the parent instance to be the + * target object. To ensure that the parent instance serves as the target + * objects for mouse events, you can set the mouseChildren + * property of the parent instance to false.

+ * + *

No event is dispatched by setting this property. You must use the + * addEventListener() method to create interactive + * functionality.

+ */ + public get mouseChildren():boolean + { + return this._mouseChildren; + } + + public set mouseChildren(value:boolean) + { + if (this._mouseChildren == value) + return; + + this._mouseChildren = value; + + this._pUpdateImplicitMouseEnabled(this._pParent? this._pParent.mouseChildren : true); + } + + /** + * Returns the number of children of this object. + */ + public get numChildren():number /*int*/ + { + return this._children.length; + } + + /** + * Determines whether the children of the object are tab enabled. Enables or + * disables tabbing for the children of the object. The default is + * true. + * + *

Note: Do not use the tabChildren property with + * Flex. Instead, use the + * mx.core.UIComponent.hasFocusableChildren property.

+ * + * @throws IllegalOperationError Calling this property of the Stage object + * throws an exception. The Stage object does + * not implement this property. + */ + public tabChildren:boolean; + + /** + * Calling the new DisplayObjectContainer() constructor throws + * an ArgumentError exception. You can, however, call + * constructors for the following subclasses of DisplayObjectContainer: + *
    + *
  • new Loader()
  • + *
  • new Sprite()
  • + *
  • new MovieClip()
  • + *
+ */ + constructor() + { + super(); + } + + /** + * Adds a child DisplayObject instance to this DisplayObjectContainer + * instance. The child is added to the front(top) of all other children in + * this DisplayObjectContainer instance.(To add a child to a specific index + * position, use the addChildAt() method.) + * + *

If you add a child object that already has a different display object + * container as a parent, the object is removed from the child list of the + * other display object container.

+ * + *

Note: The command stage.addChild() can cause + * problems with a published SWF file, including security problems and + * conflicts with other loaded SWF files. There is only one Stage within a + * Flash runtime instance, no matter how many SWF files you load into the + * runtime. So, generally, objects should not be added to the Stage, + * directly, at all. The only object the Stage should contain is the root + * object. Create a DisplayObjectContainer to contain all of the items on the + * display list. Then, if necessary, add that DisplayObjectContainer instance + * to the Stage.

+ * + * @param child The DisplayObject instance to add as a child of this + * DisplayObjectContainer instance. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child is the same as the parent. Also + * throws if the caller is a child(or grandchild etc.) + * of the child being added. + * @event added Dispatched when a display object is added to the display + * list. + */ + public addChild(child:DisplayObject):DisplayObject + { + if (child == null) + throw new Error("Parameter child cannot be null."); + + //if child already has a parent, remove it. + if (child._pParent) + child._pParent.removeChildInternal(child); + + child.iSetParent(this); + + this._children.push(child); + + return child; + } + + + /** + * Adds a child DisplayObject instance to this DisplayObjectContainer + * instance. The child is added at the index position specified. An index of + * 0 represents the back(bottom) of the display list for this + * DisplayObjectContainer object. + * + *

For example, the following example shows three display objects, labeled + * a, b, and c, at index positions 0, 2, and 1, respectively:

+ * + *

If you add a child object that already has a different display object + * container as a parent, the object is removed from the child list of the + * other display object container.

+ * + * @param child The DisplayObject instance to add as a child of this + * DisplayObjectContainer instance. + * @param index The index position to which the child is added. If you + * specify a currently occupied index position, the child object + * that exists at that position and all higher positions are + * moved up one position in the child list. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child is the same as the parent. Also + * throws if the caller is a child(or grandchild etc.) + * of the child being added. + * @throws RangeError Throws if the index position does not exist in the + * child list. + * @event added Dispatched when a display object is added to the display + * list. + */ + public addChildAt(child:DisplayObject, index:number /*int*/):DisplayObject + { + return child; + } + + public addChildren(...childarray:Array) + { + var len:number = childarray.length; + for (var i:number = 0; i < len; i++) + this.addChild(childarray[i]); + } + + /** + * + */ + public clone():DisplayObject + { + var clone:DisplayObjectContainer = new DisplayObjectContainer(); + clone.pivot = this.pivot; + clone._iMatrix3D = this._iMatrix3D; + clone.partition = this.partition; + clone.name = name; + + var len:number = this._children.length; + for (var i:number = 0; i < len; ++i) + clone.addChild(this._children[i].clone()); + + // todo: implement for all subtypes + return clone; + } + + /** + * Determines whether the specified display object is a child of the + * DisplayObjectContainer instance or the instance itself. The search + * includes the entire display list including this DisplayObjectContainer + * instance. Grandchildren, great-grandchildren, and so on each return + * true. + * + * @param child The child object to test. + * @return true if the child object is a child of + * the DisplayObjectContainer or the container itself; otherwise + * false. + */ + public contains(child:DisplayObject):boolean + { + return this._children.indexOf(child) >= 0; + } + + /** + * + */ + public disposeWithChildren() + { + this.dispose(); + + while (this.numChildren > 0) + this.getChildAt(0).dispose(); + } + + /** + * Returns the child display object instance that exists at the specified + * index. + * + * @param index The index position of the child object. + * @return The child display object at the specified index position. + * @throws RangeError Throws if the index does not exist in the child + * list. + */ + public getChildAt(index:number /*int*/):DisplayObject + { + var child:DisplayObject = this._children[index]; + + if (child == null) + throw new RangeError("Index does not exist in the child list of the caller"); + + return child; + } + + /** + * Returns the child display object that exists with the specified name. If + * more that one child display object has the specified name, the method + * returns the first object in the child list. + * + *

The getChildAt() method is faster than the + * getChildByName() method. The getChildAt() method + * accesses a child from a cached array, whereas the + * getChildByName() method has to traverse a linked list to + * access a child.

+ * + * @param name The name of the child to return. + * @return The child display object with the specified name. + */ + public getChildByName(name:string):DisplayObject + { + var len:number = this._children.length; + for (var i:number = 0; i < len; ++i) + if (this._children[i].name == name) + return this._children[i]; + + return null; + } + + /** + * Returns the index position of a child DisplayObject instance. + * + * @param child The DisplayObject instance to identify. + * @return The index position of the child display object to identify. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + */ + public getChildIndex(child:DisplayObject):number /*int*/ + { + var childIndex:number = this._children.indexOf(child); + + if (childIndex == -1) + throw new ArgumentError("Child parameter is not a child of the caller"); + + return childIndex; + } + + /** + * Returns an array of objects that lie under the specified point and are + * children(or grandchildren, and so on) of this DisplayObjectContainer + * instance. Any child objects that are inaccessible for security reasons are + * omitted from the returned array. To determine whether this security + * restriction affects the returned array, call the + * areInaccessibleObjectsUnderPoint() method. + * + *

The point parameter is in the coordinate space of the + * Stage, which may differ from the coordinate space of the display object + * container(unless the display object container is the Stage). You can use + * the globalToLocal() and the localToGlobal() + * methods to convert points between these coordinate spaces.

+ * + * @param point The point under which to look. + * @return An array of objects that lie under the specified point and are + * children(or grandchildren, and so on) of this + * DisplayObjectContainer instance. + */ + public getObjectsUnderPoint(point:Point):Array + { + return new Array(); + } + + /** + * Removes the specified child DisplayObject instance from the + * child list of the DisplayObjectContainer instance. The parent + * property of the removed child is set to null , and the object + * is garbage collected if no other references to the child exist. The index + * positions of any display objects above the child in the + * DisplayObjectContainer are decreased by 1. + * + *

The garbage collector reallocates unused memory space. When a variable + * or object is no longer actively referenced or stored somewhere, the + * garbage collector sweeps through and wipes out the memory space it used to + * occupy if no other references to it exist.

+ * + * @param child The DisplayObject instance to remove. + * @return The DisplayObject instance that you pass in the child + * parameter. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + */ + public removeChild(child:DisplayObject):DisplayObject + { + if (child == null) + throw new Error("Parameter child cannot be null"); + + this.removeChildInternal(child); + + child.iSetParent(null); + + return child; + } + + /** + * Removes a child DisplayObject from the specified index + * position in the child list of the DisplayObjectContainer. The + * parent property of the removed child is set to + * null, and the object is garbage collected if no other + * references to the child exist. The index positions of any display objects + * above the child in the DisplayObjectContainer are decreased by 1. + * + *

The garbage collector reallocates unused memory space. When a variable + * or object is no longer actively referenced or stored somewhere, the + * garbage collector sweeps through and wipes out the memory space it used to + * occupy if no other references to it exist.

+ * + * @param index The child index of the DisplayObject to remove. + * @return The DisplayObject instance that was removed. + * @throws RangeError Throws if the index does not exist in the child + * list. + * @throws SecurityError This child display object belongs to a sandbox to + * which the calling object does not have access. You + * can avoid this situation by having the child movie + * call the Security.allowDomain() method. + */ + public removeChildAt(index:number /*int*/):DisplayObject + { + return this.removeChild(this._children[index]); + } + + /** + * Removes all child DisplayObject instances from the child list + * of the DisplayObjectContainer instance. The parent property + * of the removed children is set to null, and the objects are + * garbage collected if no other references to the children exist. + * + * The garbage collector reallocates unused memory space. When a variable or + * object is no longer actively referenced or stored somewhere, the garbage + * collector sweeps through and wipes out the memory space it used to occupy + * if no other references to it exist. + * + * @param beginIndex The beginning position. A value smaller than 0 throws a RangeError. + * @param endIndex The ending position. A value smaller than 0 throws a RangeError. + * @throws RangeError Throws if the beginIndex or endIndex positions do + * not exist in the child list. + */ + public removeChildren(beginIndex:number /*int*/ = 0, endIndex:number /*int*/ = 2147483647) + { + if (beginIndex < 0) + throw new RangeError("beginIndex is out of range of the child list"); + + if (endIndex > this._children.length) + throw new RangeError("endIndex is out of range of the child list"); + + for(var i:number /*uint*/ = beginIndex; i < endIndex; i++) + this.removeChild(this._children[i]); + } + + /** + * Changes the position of an existing child in the display object container. + * This affects the layering of child objects. For example, the following + * example shows three display objects, labeled a, b, and c, at index + * positions 0, 1, and 2, respectively: + * + *

When you use the setChildIndex() method and specify an + * index position that is already occupied, the only positions that change + * are those in between the display object's former and new position. All + * others will stay the same. If a child is moved to an index LOWER than its + * current index, all children in between will INCREASE by 1 for their index + * reference. If a child is moved to an index HIGHER than its current index, + * all children in between will DECREASE by 1 for their index reference. For + * example, if the display object container in the previous example is named + * container, you can swap the position of the display objects + * labeled a and b by calling the following code:

+ * + *

This code results in the following arrangement of objects:

+ * + * @param child The child DisplayObject instance for which you want to change + * the index number. + * @param index The resulting index number for the child display + * object. + * @throws ArgumentError Throws if the child parameter is not a child of this + * object. + * @throws RangeError Throws if the index does not exist in the child + * list. + */ + public setChildIndex(child:DisplayObject, index:number /*int*/) + { + //TODO + } + + /** + * Swaps the z-order (front-to-back order) of the two specified child + * objects. All other child objects in the display object container remain in + * the same index positions. + * + * @param child1 The first child object. + * @param child2 The second child object. + * @throws ArgumentError Throws if either child parameter is not a child of + * this object. + */ + public swapChildren(child1:DisplayObject, child2:DisplayObject) + { + //TODO + } + + /** + * Swaps the z-order(front-to-back order) of the child objects at the two + * specified index positions in the child list. All other child objects in + * the display object container remain in the same index positions. + * + * @param index1 The index position of the first child object. + * @param index2 The index position of the second child object. + * @throws RangeError If either index does not exist in the child list. + */ + public swapChildrenAt(index1:number /*int*/, index2:number /*int*/) + { + //TODO + } + + /** + * @protected + */ + public pInvalidateSceneTransform() + { + super.pInvalidateSceneTransform(); + + var len:number = this._children.length; + for (var i:number = 0; i < len; ++i) + this._children[i].pInvalidateSceneTransform(); + } + + /** + * @protected + */ + public _pUpdateScene(value:Scene) + { + super._pUpdateScene(value); + + var len:number = this._children.length; + for (var i:number = 0; i < len; ++i) + this._children[i]._pUpdateScene(value); + } + + /** + * @protected + */ + public _pUpdateImplicitMouseEnabled(value:boolean) + { + super._pUpdateImplicitMouseEnabled(value); + + var len:number = this._children.length; + for (var i:number = 0; i < len; ++i) + this._children[i]._pUpdateImplicitMouseEnabled(this._mouseChildren); + } + + /** + * @protected + */ + public _pUpdateImplicitVisibility(value:boolean) + { + super._pUpdateImplicitVisibility(value); + + var len:number = this._children.length; + for (var i:number = 0; i < len; ++i) + this._children[i]._pUpdateImplicitVisibility(this._pImplicitVisibility); + } + + /** + * @protected + */ + public _pUpdateImplicitPartition(value:Partition) + { + super._pUpdateImplicitPartition(value); + + var len:number = this._children.length; + for (var i:number = 0; i < len; ++i) + this._children[i]._pUpdateImplicitPartition(this._pImplicitPartition); + } + + /** + * @private + * + * @param child + */ + private removeChildInternal(child:DisplayObject):DisplayObject + { + this._children.splice(this.getChildIndex(child), 1); + + return child; + } +} + +export = DisplayObjectContainer; \ No newline at end of file diff --git a/lib/containers/Loader.js b/lib/containers/Loader.js new file mode 100755 index 00000000..22bd603b --- /dev/null +++ b/lib/containers/Loader.js @@ -0,0 +1,629 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + +var AssetLibraryBundle = require("awayjs-core/lib/core/library/AssetLibraryBundle"); +var AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); + +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); + +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); + +/** +* The Loader class is used to load SWF files or image(JPG, PNG, or GIF) +* files. Use the load() method to initiate loading. The loaded +* display object is added as a child of the Loader object. +* +*

Use the URLLoader class to load text or binary data.

+* +*

The Loader class overrides the following methods that it inherits, +* because a Loader object can only have one child display object - the +* display object that it loads. Calling the following methods throws an +* exception: addChild(), addChildAt(), +* removeChild(), removeChildAt(), and +* setChildIndex(). To remove a loaded display object, you must +* remove the Loader object from its parent DisplayObjectContainer +* child array.

+* +*

Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes +* are not used in ActionScript 3.0. The Loader and URLLoader classes replace +* them.

+* +*

When you use the Loader class, consider the Flash Player and Adobe AIR +* security model:

+* +*
    +*
  • You can load content from any accessible source.
  • +*
  • Loading is not allowed if the calling SWF file is in a network +* sandbox and the file to be loaded is local.
  • +*
  • If the loaded content is a SWF file written with ActionScript 3.0, it +* cannot be cross-scripted by a SWF file in another security sandbox unless +* that cross-scripting arrangement was approved through a call to the +* System.allowDomain() or the +* System.allowInsecureDomain() method in the loaded content +* file.
  • +*
  • If the loaded content is an AVM1 SWF file(written using ActionScript +* 1.0 or 2.0), it cannot be cross-scripted by an AVM2 SWF file(written using +* ActionScript 3.0). However, you can communicate between the two SWF files +* by using the LocalConnection class.
  • +*
  • If the loaded content is an image, its data cannot be accessed by a +* SWF file outside of the security sandbox, unless the domain of that SWF +* file was included in a URL policy file at the origin domain of the +* image.
  • +*
  • Movie clips in the local-with-file-system sandbox cannot script movie +* clips in the local-with-networking sandbox, and the reverse is also +* prevented.
  • +*
  • You cannot connect to commonly reserved ports. For a complete list of +* blocked ports, see "Restricting Networking APIs" in the ActionScript 3.0 +* Developer's Guide.
  • +*
+* +*

However, in AIR, content in the application security +* sandbox(content installed with the AIR application) are not restricted by +* these security limitations.

+* +*

For more information related to security, see the Flash Player Developer +* Center Topic: Security.

+* +*

When loading a SWF file from an untrusted source(such as a domain other +* than that of the Loader object's root SWF file), you may want to define a +* mask for the Loader object, to prevent the loaded content(which is a child +* of the Loader object) from drawing to portions of the Stage outside of that +* mask, as shown in the following code:

+*/ +var Loader = (function (_super) { + __extends(Loader, _super); + /** + * Creates a Loader object that you can use to load files, such as SWF, JPEG, + * GIF, or PNG files. Call the load() method to load the asset + * as a child of the Loader instance. You can then add the Loader object to + * the display list(for instance, by using the addChild() + * method of a DisplayObjectContainer instance). The asset appears on the + * Stage as it loads. + * + *

You can also use a Loader instance "offlist," that is without adding it + * to a display object container on the display list. In this mode, the + * Loader instance might be used to load a SWF file that contains additional + * modules of an application.

+ * + *

To detect when the SWF file is finished loading, you can use the events + * of the LoaderInfo object associated with the + * contentLoaderInfo property of the Loader object. At that + * point, the code in the module SWF file can be executed to initialize and + * start the module. In the offlist mode, a Loader instance might also be + * used to load a SWF file that contains components or media assets. Again, + * you can use the LoaderInfo object event notifications to detect when the + * components are finished loading. At that point, the application can start + * using the components and media assets in the library of the SWF file by + * instantiating the ActionScript 3.0 classes that represent those components + * and assets.

+ * + *

To determine the status of a Loader object, monitor the following + * events that the LoaderInfo object associated with the + * contentLoaderInfo property of the Loader object:

+ * + *
    + *
  • The open event is dispatched when loading begins.
  • + *
  • The ioError or securityError event is + * dispatched if the file cannot be loaded or if an error occured during the + * load process.
  • + *
  • The progress event fires continuously while the file is + * being loaded.
  • + *
  • The complete event is dispatched when a file completes + * downloading, but before the loaded movie clip's methods and properties are + * available.
  • + *
  • The init event is dispatched after the properties and + * methods of the loaded SWF file are accessible, so you can begin + * manipulating the loaded SWF file. This event is dispatched before the + * complete handler. In streaming SWF files, the + * init event can occur significantly earlier than the + * complete event. For most purposes, use the init + * handler.
  • + *
+ */ + function Loader(useAssetLibrary, assetLibraryId) { + if (typeof useAssetLibrary === "undefined") { useAssetLibrary = true; } + if (typeof assetLibraryId === "undefined") { assetLibraryId = null; } + var _this = this; + _super.call(this); + + this._loadingSessions = new Array(); + this._useAssetLib = useAssetLibrary; + this._assetLibId = assetLibraryId; + + this._onResourceCompleteDelegate = function (event) { + return _this.onResourceComplete(event); + }; + this._onAssetCompleteDelegate = function (event) { + return _this.onAssetComplete(event); + }; + } + Object.defineProperty(Loader.prototype, "content", { + /** + * Contains the root display object of the SWF file or image(JPG, PNG, or + * GIF) file that was loaded by using the load() or + * loadBytes() methods. + * + * @throws SecurityError The loaded SWF file or image file belongs to a + * security sandbox to which you do not have access. + * For a loaded SWF file, you can avoid this situation + * by having the file call the + * Security.allowDomain() method or by + * having the loading file specify a + * loaderContext parameter with its + * securityDomain property set to + * SecurityDomain.currentDomain when you + * call the load() or + * loadBytes() method. + */ + get: function () { + return this._content; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Loader.prototype, "contentLoaderInfo", { + /** + * Returns a LoaderInfo object corresponding to the object being loaded. + * LoaderInfo objects are shared between the Loader object and the loaded + * content object. The LoaderInfo object supplies loading progress + * information and statistics about the loaded file. + * + *

Events related to the load are dispatched by the LoaderInfo object + * referenced by the contentLoaderInfo property of the Loader + * object. The contentLoaderInfo property is set to a valid + * LoaderInfo object, even before the content is loaded, so that you can add + * event listeners to the object prior to the load.

+ * + *

To detect uncaught errors that happen in a loaded SWF, use the + * Loader.uncaughtErrorEvents property, not the + * Loader.contentLoaderInfo.uncaughtErrorEvents property.

+ */ + get: function () { + return this._contentLoaderInfo; + }, + enumerable: true, + configurable: true + }); + + /** + * Cancels a load() method operation that is currently in + * progress for the Loader instance. + * + */ + Loader.prototype.close = function () { + if (this._useAssetLib) { + var lib; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + lib.stopAllLoadingSessions(); + this._loadingSessions = null; + return; + } + var i; + var length = this._loadingSessions.length; + for (i = 0; i < length; i++) { + this.removeListeners(this._loadingSessions[i]); + this._loadingSessions[i].stop(); + this._loadingSessions[i] = null; + } + this._loadingSessions = null; + }; + + /** + * Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an + * object that is a child of this Loader object. If you load an animated GIF + * file, only the first frame is displayed. As the Loader object can contain + * only a single child, issuing a subsequent load() request + * terminates the previous request, if still pending, and commences a new + * load. + * + *

Note: In AIR 1.5 and Flash Player 10, the maximum size for a + * loaded image is 8,191 pixels in width or height, and the total number of + * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191 + * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and + * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height + * and 2,880 pixels in width.

+ * + *

A SWF file or image loaded into a Loader object inherits the position, + * rotation, and scale properties of the parent display objects of the Loader + * object.

+ * + *

Use the unload() method to remove movies or images loaded + * with this method, or to cancel a load operation that is in progress.

+ * + *

You can prevent a SWF file from using this method by setting the + * allowNetworking parameter of the the object and + * embed tags in the HTML page that contains the SWF + * content.

+ * + *

When you use this method, consider the Flash Player security model, + * which is described in the Loader class description.

+ * + *

In Flash Player 10 and later, if you use a multipart Content-Type(for + * example "multipart/form-data") that contains an upload(indicated by a + * "filename" parameter in a "content-disposition" header within the POST + * body), the POST operation is subject to the security rules applied to + * uploads:

+ * + *
    + *
  • The POST operation must be performed in response to a user-initiated + * action, such as a mouse click or key press.
  • + *
  • If the POST operation is cross-domain(the POST target is not on the + * same server as the SWF file that is sending the POST request), the target + * server must provide a URL policy file that permits cross-domain + * access.
  • + *
+ * + *

Also, for any multipart Content-Type, the syntax must be valid + * (according to the RFC2046 standard). If the syntax appears to be invalid, + * the POST operation is subject to the security rules applied to + * uploads.

+ * + *

For more information related to security, see the Flash Player + * Developer Center Topic: Security.

+ * + * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG + * file to be loaded. A relative path must be relative to the + * main SWF file. Absolute URLs must include the protocol + * reference, such as http:// or file:///. Filenames cannot + * include disk drive specifications. + * @param context A LoaderContext object, which has properties that define + * the following: + *
    + *
  • Whether or not to check for the existence of a policy + * file upon loading the object
  • + *
  • The ApplicationDomain for the loaded object
  • + *
  • The SecurityDomain for the loaded object
  • + *
  • The ImageDecodingPolicy for the loaded image + * object
  • + *
+ * + *

If the context parameter is not specified + * or refers to a null object, the loaded content remains in + * its own security domain.

+ * + *

For complete details, see the description of the + * properties in the LoaderContext + * class.

+ * @param ns An optional namespace string under which the file is to be + * loaded, allowing the differentiation of two resources with + * identical assets. + * @param parser An optional parser object for translating the loaded data + * into a usable resource. If not provided, AssetLoader will + * attempt to auto-detect the file type. + * @throws IOError The digest property of the + * request object is not + * null. You should only set the + * digest property of a URLRequest + * object when calling the + * URLLoader.load() method when + * loading a SWZ file(an Adobe platform + * component). + * @throws IllegalOperationError If the requestedContentParent + * property of the context + * parameter is a Loader. + * @throws IllegalOperationError If the LoaderContext.parameters + * parameter is set to non-null and has some + * values which are not Strings. + * @throws SecurityError The value of + * LoaderContext.securityDomain + * must be either null or + * SecurityDomain.currentDomain. + * This reflects the fact that you can only + * place the loaded media in its natural + * security sandbox or your own(the latter + * requires a policy file). + * @throws SecurityError Local SWF files may not set + * LoaderContext.securityDomain to anything + * other than null. It is not + * permitted to import non-local media into a + * local sandbox, or to place other local media + * in anything other than its natural sandbox. + * @throws SecurityError You cannot connect to commonly reserved + * ports. For a complete list of blocked ports, + * see "Restricting Networking APIs" in the + * ActionScript 3.0 Developer's Guide. + * @throws SecurityError If the applicationDomain or + * securityDomain properties of + * the context parameter are from + * a disallowed domain. + * @throws SecurityError If a local SWF file is attempting to use the + * securityDomain property of the + * context parameter. + * @event asyncError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and it is not possible to + * add the loaded content as a child to the specified + * DisplayObjectContainer. This could happen if the + * loaded content is a + * flash.display.AVM1Movie or if the + * addChild() call to the + * requestedContentParent throws an error. + * @event complete Dispatched by the contentLoaderInfo + * object when the file has completed loading. The + * complete event is always dispatched + * after the init event. + * @event httpStatus Dispatched by the contentLoaderInfo + * object when a network request is made over HTTP and + * Flash Player can detect the HTTP status code. + * @event init Dispatched by the contentLoaderInfo + * object when the properties and methods of the loaded + * SWF file are accessible. The init event + * always precedes the complete event. + * @event ioError Dispatched by the contentLoaderInfo + * object when an input or output error occurs that + * causes a load operation to fail. + * @event open Dispatched by the contentLoaderInfo + * object when the loading operation starts. + * @event progress Dispatched by the contentLoaderInfo + * object as data is received while load operation + * progresses. + * @event securityError Dispatched by the contentLoaderInfo + * object if a SWF file in the local-with-filesystem + * sandbox attempts to load content in the + * local-with-networking sandbox, or vice versa. + * @event securityError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and the security sandbox + * of the + * LoaderContext.requestedContentParent + * does not have access to the loaded SWF. + * @event unload Dispatched by the contentLoaderInfo + * object when a loaded object is removed. + */ + Loader.prototype.load = function (request, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + var token; + + if (this._useAssetLib) { + var lib; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + token = lib.load(request, context, ns, parser); + } else { + var loader = new AssetLoader(); + this._loadingSessions.push(loader); + token = loader.load(request, context, ns, parser); + } + + token.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + token.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + token._iLoader._iAddErrorHandler(this.onLoadError); + token._iLoader._iAddParseErrorHandler(this.onParseError); + + return token; + }; + + /** + * Loads from binary data stored in a ByteArray object. + * + *

The loadBytes() method is asynchronous. You must wait for + * the "init" event before accessing the properties of a loaded object.

+ * + *

When you use this method, consider the Flash Player security model, + * which is described in the Loader class description.

+ * + * @param bytes A ByteArray object. The contents of the ByteArray can be + * any of the file formats supported by the Loader class: SWF, + * GIF, JPEG, or PNG. + * @param context A LoaderContext object. Only the + * applicationDomain property of the + * LoaderContext object applies; the + * checkPolicyFile and + * securityDomain properties of the LoaderContext + * object do not apply. + * + *

If the context parameter is not specified + * or refers to a null object, the content is loaded into the + * current security domain - a process referred to as "import + * loading" in Flash Player security documentation. + * Specifically, if the loading SWF file trusts the remote SWF + * by incorporating the remote SWF into its code, then the + * loading SWF can import it directly into its own security + * domain.

+ * + *

For more information related to security, see the Flash + * Player Developer Center Topic: Security.

+ * @throws ArgumentError If the length property of the + * ByteArray object is not greater than 0. + * @throws IllegalOperationError If the checkPolicyFile or + * securityDomain property of the + * context parameter are non-null. + * @throws IllegalOperationError If the requestedContentParent + * property of the context + * parameter is a Loader. + * @throws IllegalOperationError If the LoaderContext.parameters + * parameter is set to non-null and has some + * values which are not Strings. + * @throws SecurityError If the provided + * applicationDomain property of + * the context property is from a + * disallowed domain. + * @throws SecurityError You cannot connect to commonly reserved + * ports. For a complete list of blocked ports, + * see "Restricting Networking APIs" in the + * ActionScript 3.0 Developer's Guide. + * @event asyncError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and it is not possible to + * add the loaded content as a child to the specified + * DisplayObjectContainer. This could happen if the + * loaded content is a + * flash.display.AVM1Movie or if the + * addChild() call to the + * requestedContentParent throws an error. + * @event complete Dispatched by the contentLoaderInfo + * object when the operation is complete. The + * complete event is always dispatched + * after the init event. + * @event init Dispatched by the contentLoaderInfo + * object when the properties and methods of the loaded + * data are accessible. The init event + * always precedes the complete event. + * @event ioError Dispatched by the contentLoaderInfo + * object when the runtime cannot parse the data in the + * byte array. + * @event open Dispatched by the contentLoaderInfo + * object when the operation starts. + * @event progress Dispatched by the contentLoaderInfo + * object as data is transfered in memory. + * @event securityError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and the security sandbox + * of the + * LoaderContext.requestedContentParent + * does not have access to the loaded SWF. + * @event unload Dispatched by the contentLoaderInfo + * object when a loaded object is removed. + */ + Loader.prototype.loadData = function (data, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + var token; + + if (this._useAssetLib) { + var lib; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + token = lib.loadData(data, context, ns, parser); + } else { + var loader = new AssetLoader(); + this._loadingSessions.push(loader); + token = loader.loadData(data, '', context, ns, parser); + } + + token.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + token.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + token._iLoader._iAddErrorHandler(this.onLoadError); + token._iLoader._iAddParseErrorHandler(this.onParseError); + + return token; + }; + + /** + * Removes a child of this Loader object that was loaded by using the + * load() method. The property of the associated + * LoaderInfo object is reset to null. The child is not + * necessarily destroyed because other objects might have references to it; + * however, it is no longer a child of the Loader object. + * + *

As a best practice, before you unload a child SWF file, you should + * explicitly close any streams in the child SWF file's objects, such as + * LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise, + * audio in the child SWF file might continue to play, even though the child + * SWF file was unloaded. To close streams in the child SWF file, add an + * event listener to the child that listens for the unload + * event. When the parent calls Loader.unload(), the + * unload event is dispatched to the child. The following code + * shows how you might do this:

+ *
 public closeAllStreams(evt:Event) {
+    * myNetStream.close(); mySound.close(); myNetConnection.close();
+    * myLocalConnection.close(); }
+    * myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,
+    * closeAllStreams);
+ * + */ + Loader.prototype.unload = function () { + //TODO + }; + + /** + * Enables a specific parser. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parserClass The parser class to enable. + * @see away.parsers.Parsers + */ + Loader.enableParser = function (parserClass) { + AssetLoader.enableParser(parserClass); + }; + + /** + * Enables a list of parsers. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parserClasses A Vector of parser classes to enable. + * @see away.parsers.Parsers + */ + Loader.enableParsers = function (parserClasses) { + AssetLoader.enableParsers(parserClasses); + }; + + Loader.prototype.removeListeners = function (dispatcher) { + dispatcher.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + dispatcher.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + }; + + Loader.prototype.onAssetComplete = function (event) { + this.dispatchEvent(event); + }; + + /** + * Called when an error occurs during loading + */ + Loader.prototype.onLoadError = function (event) { + if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + }; + + /** + * Called when a an error occurs during parsing + */ + Loader.prototype.onParseError = function (event) { + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + }; + + /** + * Called when the resource and all of its dependencies was retrieved. + */ + Loader.prototype.onResourceComplete = function (event) { + var content = event.content; + + this._content = content; + + if (content) + this.addChild(content); + + this.dispatchEvent(event); + }; + return Loader; +})(DisplayObjectContainer); + +module.exports = Loader; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lcnMvTG9hZGVyLnRzIl0sIm5hbWVzIjpbIkxvYWRlciIsIkxvYWRlci5jb25zdHJ1Y3RvciIsIkxvYWRlci5jbG9zZSIsIkxvYWRlci5sb2FkIiwiTG9hZGVyLmxvYWREYXRhIiwiTG9hZGVyLnVubG9hZCIsIkxvYWRlci5lbmFibGVQYXJzZXIiLCJMb2FkZXIuZW5hYmxlUGFyc2VycyIsIkxvYWRlci5yZW1vdmVMaXN0ZW5lcnMiLCJMb2FkZXIub25Bc3NldENvbXBsZXRlIiwiTG9hZGVyLm9uTG9hZEVycm9yIiwiTG9hZGVyLm9uUGFyc2VFcnJvciIsIkxvYWRlci5vblJlc291cmNlQ29tcGxldGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlGQUE4Rjs7QUFHOUYsbUZBQXlGO0FBQ3pGLHFFQUE2RTs7QUFJN0UsNkRBQXFFOztBQUVyRSxpRUFBeUU7QUFDekUsK0RBQXVFO0FBQ3ZFLCtEQUF1RTs7QUFHdkU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBOERHO0FBQ0g7SUFBcUJBLHlCQUFzQkE7SUFzSDFDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFER0E7SUFDSEEsZ0JBQVlBLGVBQThCQSxFQUFFQSxjQUE0QkE7UUFBNURDLDhDQUFBQSxlQUFlQSxHQUFXQSxJQUFJQTtBQUFBQSxRQUFFQSw2Q0FBQUEsY0FBY0EsR0FBVUEsSUFBSUE7QUFBQUEsUUFBeEVBLGlCQVVDQTtRQVJBQSxXQUFNQSxLQUFBQSxDQUFDQTs7UUFFUEEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFjQSxDQUFDQTtRQUNoREEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsZUFBZUE7UUFDbkNBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLGNBQWNBOztRQUVqQ0EsSUFBSUEsQ0FBQ0EsMkJBQTJCQSxHQUFHQSxVQUFDQSxL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QURBLENBQUNBLEVBbmpCb0Isc0JBQXNCLEVBbWpCMUM7O0FBRUQsdUJBQWdCLENBQUEiLCJmaWxlIjoiY29udGFpbmVycy9Mb2FkZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlzcGxheU9iamVjdENvbnRhaW5lclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udGFpbmVycy9EaXNwbGF5T2JqZWN0Q29udGFpbmVyXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvRGlzcGxheU9iamVjdFwiKTtcbmltcG9ydCBMb2FkZXJJbmZvXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvTG9hZGVySW5mb1wiKTtcbmltcG9ydCBBc3NldExpYnJhcnlCdW5kbGVcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TGlicmFyeUJ1bmRsZVwiKTtcbmltcG9ydCBBc3NldExvYWRlclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TG9hZGVyXCIpO1xuaW1wb3J0IEFzc2V0TG9hZGVyQ29udGV4dFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRMb2FkZXJDb250ZXh0XCIpO1xuaW1wb3J0IEFzc2V0TG9hZGVyVG9rZW5cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRMb2FkZXJUb2tlblwiKTtcbmltcG9ydCBVUkxSZXF1ZXN0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxSZXF1ZXN0XCIpO1xuaW1wb3J0IEFzc2V0RXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9Bc3NldEV2ZW50XCIpO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudERpc3BhdGNoZXJcIik7XG5pbXBvcnQgSU9FcnJvckV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvSU9FcnJvckV2ZW50XCIpO1xuaW1wb3J0IExvYWRlckV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvTG9hZGVyRXZlbnRcIik7XG5pbXBvcnQgUGFyc2VyRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9QYXJzZXJFdmVudFwiKTtcbmltcG9ydCBQYXJzZXJCYXNlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlckJhc2VcIik7XG5cbi8qKlxuICogVGhlIExvYWRlciBjbGFzcyBpcyB1c2VkIHRvIGxvYWQgU1dGIGZpbGVzIG9yIGltYWdlKEpQRywgUE5HLCBvciBHSUYpXG4gKiBmaWxlcy4gVXNlIHRoZSA8Y29kZT5sb2FkKCk8L2NvZGU+IG1ldGhvZCB0byBpbml0aWF0ZSBsb2FkaW5nLiBUaGUgbG9hZGVkXG4gKiBkaXNwbGF5IG9iamVjdCBpcyBhZGRlZCBhcyBhIGNoaWxkIG9mIHRoZSBMb2FkZXIgb2JqZWN0LlxuICpcbiAqIDxwPlVzZSB0aGUgVVJMTG9hZGVyIGNsYXNzIHRvIGxvYWQgdGV4dCBvciBiaW5hcnkgZGF0YS48L3A+XG4gKlxuICogPHA+VGhlIExvYWRlciBjbGFzcyBvdmVycmlkZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIHRoYXQgaXQgaW5oZXJpdHMsXG4gKiBiZWNhdXNlIGEgTG9hZGVyIG9iamVjdCBjYW4gb25seSBoYXZlIG9uZSBjaGlsZCBkaXNwbGF5IG9iamVjdCAtIHRoZVxuICogZGlzcGxheSBvYmplY3QgdGhhdCBpdCBsb2Fkcy4gQ2FsbGluZyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhyb3dzIGFuXG4gKiBleGNlcHRpb246IDxjb2RlPmFkZENoaWxkKCk8L2NvZGU+LCA8Y29kZT5hZGRDaGlsZEF0KCk8L2NvZGU+LFxuICogPGNvZGU+cmVtb3ZlQ2hpbGQoKTwvY29kZT4sIDxjb2RlPnJlbW92ZUNoaWxkQXQoKTwvY29kZT4sIGFuZFxuICogPGNvZGU+c2V0Q2hpbGRJbmRleCgpPC9jb2RlPi4gVG8gcmVtb3ZlIGEgbG9hZGVkIGRpc3BsYXkgb2JqZWN0LCB5b3UgbXVzdFxuICogcmVtb3ZlIHRoZSA8aT5Mb2FkZXI8L2k+IG9iamVjdCBmcm9tIGl0cyBwYXJlbnQgRGlzcGxheU9iamVjdENvbnRhaW5lclxuICogY2hpbGQgYXJyYXkuIDwvcD5cbiAqXG4gKiA8cD48Yj5Ob3RlOjwvYj4gVGhlIEFjdGlvblNjcmlwdCAyLjAgTW92aWVDbGlwTG9hZGVyIGFuZCBMb2FkVmFycyBjbGFzc2VzXG4gKiBhcmUgbm90IHVzZWQgaW4gQWN0aW9uU2NyaXB0IDMuMC4gVGhlIExvYWRlciBhbmQgVVJMTG9hZGVyIGNsYXNzZXMgcmVwbGFjZVxuICogdGhlbS48L3A+XG4gKlxuICogPHA+V2hlbiB5b3UgdXNlIHRoZSBMb2FkZXIgY2xhc3MsIGNvbnNpZGVyIHRoZSBGbGFzaCBQbGF5ZXIgYW5kIEFkb2JlIEFJUlxuICogc2VjdXJpdHkgbW9kZWw6IDwvcD5cbiAqXG4gKiA8dWw+XG4gKiAgIDxsaT5Zb3UgY2FuIGxvYWQgY29udGVudCBmcm9tIGFueSBhY2Nlc3NpYmxlIHNvdXJjZS4gPC9saT5cbiAqICAgPGxpPkxvYWRpbmcgaXMgbm90IGFsbG93ZWQgaWYgdGhlIGNhbGxpbmcgU1dGIGZpbGUgaXMgaW4gYSBuZXR3b3JrXG4gKiBzYW5kYm94IGFuZCB0aGUgZmlsZSB0byBiZSBsb2FkZWQgaXMgbG9jYWwuIDwvbGk+XG4gKiAgIDxsaT5JZiB0aGUgbG9hZGVkIGNvbnRlbnQgaXMgYSBTV0YgZmlsZSB3cml0dGVuIHdpdGggQWN0aW9uU2NyaXB0IDMuMCwgaXRcbiAqIGNhbm5vdCBiZSBjcm9zcy1zY3JpcHRlZCBieSBhIFNXRiBmaWxlIGluIGFub3RoZXIgc2VjdXJpdHkgc2FuZGJveCB1bmxlc3NcbiAqIHRoYXQgY3Jvc3Mtc2NyaXB0aW5nIGFycmFuZ2VtZW50IHdhcyBhcHByb3ZlZCB0aHJvdWdoIGEgY2FsbCB0byB0aGVcbiAqIDxjb2RlPlN5c3RlbS5hbGxvd0RvbWFpbigpPC9jb2RlPiBvciB0aGVcbiAqIDxjb2RlPlN5c3RlbS5hbGxvd0luc2VjdXJlRG9tYWluKCk8L2NvZGU+IG1ldGhvZCBpbiB0aGUgbG9hZGVkIGNvbnRlbnRcbiAqIGZpbGUuPC9saT5cbiAqICAgPGxpPklmIHRoZSBsb2FkZWQgY29udGVudCBpcyBhbiBBVk0xIFNXRiBmaWxlKHdyaXR0ZW4gdXNpbmcgQWN0aW9uU2NyaXB0XG4gKiAxLjAgb3IgMi4wKSwgaXQgY2Fubm90IGJlIGNyb3NzLXNjcmlwdGVkIGJ5IGFuIEFWTTIgU1dGIGZpbGUod3JpdHRlbiB1c2luZ1xuICogQWN0aW9uU2NyaXB0IDMuMCkuIEhvd2V2ZXIsIHlvdSBjYW4gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUgdHdvIFNXRiBmaWxlc1xuICogYnkgdXNpbmcgdGhlIExvY2FsQ29ubmVjdGlvbiBjbGFzcy48L2xpPlxuICogICA8bGk+SWYgdGhlIGxvYWRlZCBjb250ZW50IGlzIGFuIGltYWdlLCBpdHMgZGF0YSBjYW5ub3QgYmUgYWNjZXNzZWQgYnkgYVxuICogU1dGIGZpbGUgb3V0c2lkZSBvZiB0aGUgc2VjdXJpdHkgc2FuZGJveCwgdW5sZXNzIHRoZSBkb21haW4gb2YgdGhhdCBTV0ZcbiAqIGZpbGUgd2FzIGluY2x1ZGVkIGluIGEgVVJMIHBvbGljeSBmaWxlIGF0IHRoZSBvcmlnaW4gZG9tYWluIG9mIHRoZVxuICogaW1hZ2UuPC9saT5cbiAqICAgPGxpPk1vdmllIGNsaXBzIGluIHRoZSBsb2NhbC13aXRoLWZpbGUtc3lzdGVtIHNhbmRib3ggY2Fubm90IHNjcmlwdCBtb3ZpZVxuICogY2xpcHMgaW4gdGhlIGxvY2FsLXdpdGgtbmV0d29ya2luZyBzYW5kYm94LCBhbmQgdGhlIHJldmVyc2UgaXMgYWxzb1xuICogcHJldmVudGVkLiA8L2xpPlxuICogICA8bGk+WW91IGNhbm5vdCBjb25uZWN0IHRvIGNvbW1vbmx5IHJlc2VydmVkIHBvcnRzLiBGb3IgYSBjb21wbGV0ZSBsaXN0IG9mXG4gKiBibG9ja2VkIHBvcnRzLCBzZWUgXCJSZXN0cmljdGluZyBOZXR3b3JraW5nIEFQSXNcIiBpbiB0aGUgPGk+QWN0aW9uU2NyaXB0IDMuMFxuICogRGV2ZWxvcGVyJ3MgR3VpZGU8L2k+LiA8L2xpPlxuICogPC91bD5cbiAqXG4gKiA8cD5Ib3dldmVyLCBpbiBBSVIsIGNvbnRlbnQgaW4gdGhlIDxjb2RlPmFwcGxpY2F0aW9uPC9jb2RlPiBzZWN1cml0eVxuICogc2FuZGJveChjb250ZW50IGluc3RhbGxlZCB3aXRoIHRoZSBBSVIgYXBwbGljYXRpb24pIGFyZSBub3QgcmVzdHJpY3RlZCBieVxuICogdGhlc2Ugc2VjdXJpdHkgbGltaXRhdGlvbnMuPC9wPlxuICpcbiAqIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gc2VjdXJpdHksIHNlZSB0aGUgRmxhc2ggUGxheWVyIERldmVsb3BlclxuICogQ2VudGVyIFRvcGljOiA8YSBocmVmPVwiaHR0cDovL3d3dy5hZG9iZS5jb20vZ28vZGV2bmV0X3NlY3VyaXR5X2VuXCJcbiAqIHNjb3BlPVwiZXh0ZXJuYWxcIj5TZWN1cml0eTwvYT4uPC9wPlxuICpcbiAqIDxwPldoZW4gbG9hZGluZyBhIFNXRiBmaWxlIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZShzdWNoIGFzIGEgZG9tYWluIG90aGVyXG4gKiB0aGFuIHRoYXQgb2YgdGhlIExvYWRlciBvYmplY3QncyByb290IFNXRiBmaWxlKSwgeW91IG1heSB3YW50IHRvIGRlZmluZSBhXG4gKiBtYXNrIGZvciB0aGUgTG9hZGVyIG9iamVjdCwgdG8gcHJldmVudCB0aGUgbG9hZGVkIGNvbnRlbnQod2hpY2ggaXMgYSBjaGlsZFxuICogb2YgdGhlIExvYWRlciBvYmplY3QpIGZyb20gZHJhd2luZyB0byBwb3J0aW9ucyBvZiB0aGUgU3RhZ2Ugb3V0c2lkZSBvZiB0aGF0XG4gKiBtYXNrLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGNvZGU6PC9wPlxuICovXG5jbGFzcyBMb2FkZXIgZXh0ZW5kcyBEaXNwbGF5T2JqZWN0Q29udGFpbmVyXG57XG5cdC8qKlxuXHQgKiBEaXNwYXRjaGVkIHdoZW4gYW55IGFzc2V0IGZpbmlzaGVzIHBhcnNpbmcuIEFsc28gc2VlIHNwZWNpZmljIGV2ZW50cyBmb3IgZWFjaFxuXHQgKiBpbmRpdmlkdWFsIGFzc2V0IHR5cGUgKG1lc2hlcywgbWF0ZXJpYWxzIGV0IGMuKVxuXHQgKlxuXHQgKiBAZXZlbnRUeXBlIEFzc2V0RXZlbnRcblx0ICovXG5cdC8vW0V2ZW50KG5hbWU9XCJhc3NldENvbXBsZXRlXCIsIHR5cGU9XCJBc3NldEV2ZW50XCIpXVxuXG5cblx0LyoqXG5cdCAqIERpc3BhdGNoZWQgd2hlbiBhIGZ1bGwgcmVzb3VyY2UgKGluY2x1ZGluZyBkZXBlbmRlbmNpZXMpIGZpbmlzaGVzIGxvYWRpbmcuXG5cdCAqXG5cdCAqIEBldmVudFR5cGUgTG9hZGVyRXZlbnRcblx0ICovXG5cdC8vW0V2ZW50KG5hbWU9XCJyZXNvdXJjZUNvbXBsZXRlXCIsIHR5cGU9XCJMb2FkZXJFdmVudFwiKV1cblxuXHRwcml2YXRlIF9sb2FkaW5nU2Vzc2lvbnM6QXJyYXk8QXNzZXRMb2FkZXI+O1xuXHRwcml2YXRlIF91c2VBc3NldExpYjpib29sZWFuO1xuXHRwcml2YXRlIF9hc3NldExpYklkOnN0cmluZztcblx0cHJpdmF0ZSBfb25SZXNvdXJjZUNvbXBsZXRlRGVsZWdhdGU6RnVuY3Rpb247XG5cdHByaXZhdGUgX29uQXNzZXRDb21wbGV0ZURlbGVnYXRlOkZ1bmN0aW9uO1xuXG5cdHByaXZhdGUgX2NvbnRlbnQ6RGlzcGxheU9iamVjdDtcblx0cHJpdmF0ZSBfY29udGVudExvYWRlckluZm86TG9hZGVySW5mbztcblxuXHQvKipcblx0ICogQ29udGFpbnMgdGhlIHJvb3QgZGlzcGxheSBvYmplY3Qgb2YgdGhlIFNXRiBmaWxlIG9yIGltYWdlKEpQRywgUE5HLCBvclxuXHQgKiBHSUYpIGZpbGUgdGhhdCB3YXMgbG9hZGVkIGJ5IHVzaW5nIHRoZSA8Y29kZT5sb2FkKCk8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPmxvYWRCeXRlcygpPC9jb2RlPiBtZXRob2RzLlxuXHQgKlxuXHQgKiBAdGhyb3dzIFNlY3VyaXR5RXJyb3IgVGhlIGxvYWRlZCBTV0YgZmlsZSBvciBpbWFnZSBmaWxlIGJlbG9uZ3MgdG8gYVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHkgc2FuZGJveCB0byB3aGljaCB5b3UgZG8gbm90IGhhdmUgYWNjZXNzLlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGEgbG9hZGVkIFNXRiBmaWxlLCB5b3UgY2FuIGF2b2lkIHRoaXMgc2l0dWF0aW9uXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBieSBoYXZpbmcgdGhlIGZpbGUgY2FsbCB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlNlY3VyaXR5LmFsbG93RG9tYWluKCk8L2NvZGU+IG1ldGhvZCBvciBieVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgaGF2aW5nIHRoZSBsb2FkaW5nIGZpbGUgc3BlY2lmeSBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5sb2FkZXJDb250ZXh0PC9jb2RlPiBwYXJhbWV0ZXIgd2l0aCBpdHNcblx0ICogICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNlY3VyaXR5RG9tYWluPC9jb2RlPiBwcm9wZXJ0eSBzZXQgdG9cblx0ICogICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlNlY3VyaXR5RG9tYWluLmN1cnJlbnREb21haW48L2NvZGU+IHdoZW4geW91XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBjYWxsIHRoZSA8Y29kZT5sb2FkKCk8L2NvZGU+IG9yXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5sb2FkQnl0ZXMoKTwvY29kZT4gbWV0aG9kLlxuXHQgKi9cblx0cHVibGljIGdldCBjb250ZW50KCk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIExvYWRlckluZm8gb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9iamVjdCBiZWluZyBsb2FkZWQuXG5cdCAqIExvYWRlckluZm8gb2JqZWN0cyBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIExvYWRlciBvYmplY3QgYW5kIHRoZSBsb2FkZWRcblx0ICogY29udGVudCBvYmplY3QuIFRoZSBMb2FkZXJJbmZvIG9iamVjdCBzdXBwbGllcyBsb2FkaW5nIHByb2dyZXNzXG5cdCAqIGluZm9ybWF0aW9uIGFuZCBzdGF0aXN0aWNzIGFib3V0IHRoZSBsb2FkZWQgZmlsZS5cblx0ICpcblx0ICogPHA+RXZlbnRzIHJlbGF0ZWQgdG8gdGhlIGxvYWQgYXJlIGRpc3BhdGNoZWQgYnkgdGhlIExvYWRlckluZm8gb2JqZWN0XG5cdCAqIHJlZmVyZW5jZWQgYnkgdGhlIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgTG9hZGVyXG5cdCAqIG9iamVjdC4gVGhlIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gYSB2YWxpZFxuXHQgKiBMb2FkZXJJbmZvIG9iamVjdCwgZXZlbiBiZWZvcmUgdGhlIGNvbnRlbnQgaXMgbG9hZGVkLCBzbyB0aGF0IHlvdSBjYW4gYWRkXG5cdCAqIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgb2JqZWN0IHByaW9yIHRvIHRoZSBsb2FkLjwvcD5cblx0ICpcblx0ICogPHA+VG8gZGV0ZWN0IHVuY2F1Z2h0IGVycm9ycyB0aGF0IGhhcHBlbiBpbiBhIGxvYWRlZCBTV0YsIHVzZSB0aGVcblx0ICogPGNvZGU+TG9hZGVyLnVuY2F1Z2h0RXJyb3JFdmVudHM8L2NvZGU+IHByb3BlcnR5LCBub3QgdGhlXG5cdCAqIDxjb2RlPkxvYWRlci5jb250ZW50TG9hZGVySW5mby51bmNhdWdodEVycm9yRXZlbnRzPC9jb2RlPiBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGNvbnRlbnRMb2FkZXJJbmZvKCk6TG9hZGVySW5mb1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbnRlbnRMb2FkZXJJbmZvO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBMb2FkZXIgb2JqZWN0IHRoYXQgeW91IGNhbiB1c2UgdG8gbG9hZCBmaWxlcywgc3VjaCBhcyBTV0YsIEpQRUcsXG5cdCAqIEdJRiwgb3IgUE5HIGZpbGVzLiBDYWxsIHRoZSA8Y29kZT5sb2FkKCk8L2NvZGU+IG1ldGhvZCB0byBsb2FkIHRoZSBhc3NldFxuXHQgKiBhcyBhIGNoaWxkIG9mIHRoZSBMb2FkZXIgaW5zdGFuY2UuIFlvdSBjYW4gdGhlbiBhZGQgdGhlIExvYWRlciBvYmplY3QgdG9cblx0ICogdGhlIGRpc3BsYXkgbGlzdChmb3IgaW5zdGFuY2UsIGJ5IHVzaW5nIHRoZSA8Y29kZT5hZGRDaGlsZCgpPC9jb2RlPlxuXHQgKiBtZXRob2Qgb2YgYSBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIGluc3RhbmNlKS4gVGhlIGFzc2V0IGFwcGVhcnMgb24gdGhlXG5cdCAqIFN0YWdlIGFzIGl0IGxvYWRzLlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIGFsc28gdXNlIGEgTG9hZGVyIGluc3RhbmNlIFwib2ZmbGlzdCxcIiB0aGF0IGlzIHdpdGhvdXQgYWRkaW5nIGl0XG5cdCAqIHRvIGEgZGlzcGxheSBvYmplY3QgY29udGFpbmVyIG9uIHRoZSBkaXNwbGF5IGxpc3QuIEluIHRoaXMgbW9kZSwgdGhlXG5cdCAqIExvYWRlciBpbnN0YW5jZSBtaWdodCBiZSB1c2VkIHRvIGxvYWQgYSBTV0YgZmlsZSB0aGF0IGNvbnRhaW5zIGFkZGl0aW9uYWxcblx0ICogbW9kdWxlcyBvZiBhbiBhcHBsaWNhdGlvbi4gPC9wPlxuXHQgKlxuXHQgKiA8cD5UbyBkZXRlY3Qgd2hlbiB0aGUgU1dGIGZpbGUgaXMgZmluaXNoZWQgbG9hZGluZywgeW91IGNhbiB1c2UgdGhlIGV2ZW50c1xuXHQgKiBvZiB0aGUgTG9hZGVySW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZVxuXHQgKiA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT4gcHJvcGVydHkgb2YgdGhlIExvYWRlciBvYmplY3QuIEF0IHRoYXRcblx0ICogcG9pbnQsIHRoZSBjb2RlIGluIHRoZSBtb2R1bGUgU1dGIGZpbGUgY2FuIGJlIGV4ZWN1dGVkIHRvIGluaXRpYWxpemUgYW5kXG5cdCAqIHN0YXJ0IHRoZSBtb2R1bGUuIEluIHRoZSBvZmZsaXN0IG1vZGUsIGEgTG9hZGVyIGluc3RhbmNlIG1pZ2h0IGFsc28gYmVcblx0ICogdXNlZCB0byBsb2FkIGEgU1dGIGZpbGUgdGhhdCBjb250YWlucyBjb21wb25lbnRzIG9yIG1lZGlhIGFzc2V0cy4gQWdhaW4sXG5cdCAqIHlvdSBjYW4gdXNlIHRoZSBMb2FkZXJJbmZvIG9iamVjdCBldmVudCBub3RpZmljYXRpb25zIHRvIGRldGVjdCB3aGVuIHRoZVxuXHQgKiBjb21wb25lbnRzIGFyZSBmaW5pc2hlZCBsb2FkaW5nLiBBdCB0aGF0IHBvaW50LCB0aGUgYXBwbGljYXRpb24gY2FuIHN0YXJ0XG5cdCAqIHVzaW5nIHRoZSBjb21wb25lbnRzIGFuZCBtZWRpYSBhc3NldHMgaW4gdGhlIGxpYnJhcnkgb2YgdGhlIFNXRiBmaWxlIGJ5XG5cdCAqIGluc3RhbnRpYXRpbmcgdGhlIEFjdGlvblNjcmlwdCAzLjAgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCB0aG9zZSBjb21wb25lbnRzXG5cdCAqIGFuZCBhc3NldHMuPC9wPlxuXHQgKlxuXHQgKiA8cD5UbyBkZXRlcm1pbmUgdGhlIHN0YXR1cyBvZiBhIExvYWRlciBvYmplY3QsIG1vbml0b3IgdGhlIGZvbGxvd2luZ1xuXHQgKiBldmVudHMgdGhhdCB0aGUgTG9hZGVySW5mbyBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZVxuXHQgKiA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT4gcHJvcGVydHkgb2YgdGhlIExvYWRlciBvYmplY3Q6PC9wPlxuXHQgKlxuXHQgKiA8dWw+XG5cdCAqICAgPGxpPlRoZSA8Y29kZT5vcGVuPC9jb2RlPiBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gbG9hZGluZyBiZWdpbnMuPC9saT5cblx0ICogICA8bGk+VGhlIDxjb2RlPmlvRXJyb3I8L2NvZGU+IG9yIDxjb2RlPnNlY3VyaXR5RXJyb3I8L2NvZGU+IGV2ZW50IGlzXG5cdCAqIGRpc3BhdGNoZWQgaWYgdGhlIGZpbGUgY2Fubm90IGJlIGxvYWRlZCBvciBpZiBhbiBlcnJvciBvY2N1cmVkIGR1cmluZyB0aGVcblx0ICogbG9hZCBwcm9jZXNzLiA8L2xpPlxuXHQgKiAgIDxsaT5UaGUgPGNvZGU+cHJvZ3Jlc3M8L2NvZGU+IGV2ZW50IGZpcmVzIGNvbnRpbnVvdXNseSB3aGlsZSB0aGUgZmlsZSBpc1xuXHQgKiBiZWluZyBsb2FkZWQuPC9saT5cblx0ICogICA8bGk+VGhlIDxjb2RlPmNvbXBsZXRlPC9jb2RlPiBldmVudCBpcyBkaXNwYXRjaGVkIHdoZW4gYSBmaWxlIGNvbXBsZXRlc1xuXHQgKiBkb3dubG9hZGluZywgYnV0IGJlZm9yZSB0aGUgbG9hZGVkIG1vdmllIGNsaXAncyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIGFyZVxuXHQgKiBhdmFpbGFibGUuIDwvbGk+XG5cdCAqICAgPGxpPlRoZSA8Y29kZT5pbml0PC9jb2RlPiBldmVudCBpcyBkaXNwYXRjaGVkIGFmdGVyIHRoZSBwcm9wZXJ0aWVzIGFuZFxuXHQgKiBtZXRob2RzIG9mIHRoZSBsb2FkZWQgU1dGIGZpbGUgYXJlIGFjY2Vzc2libGUsIHNvIHlvdSBjYW4gYmVnaW5cblx0ICogbWFuaXB1bGF0aW5nIHRoZSBsb2FkZWQgU1dGIGZpbGUuIFRoaXMgZXZlbnQgaXMgZGlzcGF0Y2hlZCBiZWZvcmUgdGhlXG5cdCAqIDxjb2RlPmNvbXBsZXRlPC9jb2RlPiBoYW5kbGVyLiBJbiBzdHJlYW1pbmcgU1dGIGZpbGVzLCB0aGVcblx0ICogPGNvZGU+aW5pdDwvY29kZT4gZXZlbnQgY2FuIG9jY3VyIHNpZ25pZmljYW50bHkgZWFybGllciB0aGFuIHRoZVxuXHQgKiA8Y29kZT5jb21wbGV0ZTwvY29kZT4gZXZlbnQuIEZvciBtb3N0IHB1cnBvc2VzLCB1c2UgdGhlIDxjb2RlPmluaXQ8L2NvZGU+XG5cdCAqIGhhbmRsZXIuPC9saT5cblx0ICogPC91bD5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHVzZUFzc2V0TGlicmFyeTpib29sZWFuID0gdHJ1ZSwgYXNzZXRMaWJyYXJ5SWQ6c3RyaW5nID0gbnVsbClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9sb2FkaW5nU2Vzc2lvbnMgPSBuZXcgQXJyYXk8QXNzZXRMb2FkZXI+KCk7XG5cdFx0dGhpcy5fdXNlQXNzZXRMaWIgPSB1c2VBc3NldExpYnJhcnk7XG5cdFx0dGhpcy5fYXNzZXRMaWJJZCA9IGFzc2V0TGlicmFyeUlkO1xuXG5cdFx0dGhpcy5fb25SZXNvdXJjZUNvbXBsZXRlRGVsZWdhdGUgPSAoZXZlbnQ6TG9hZGVyRXZlbnQpID0+IHRoaXMub25SZXNvdXJjZUNvbXBsZXRlKGV2ZW50KTtcblx0XHR0aGlzLl9vbkFzc2V0Q29tcGxldGVEZWxlZ2F0ZSA9IChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uQXNzZXRDb21wbGV0ZShldmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FuY2VscyBhIDxjb2RlPmxvYWQoKTwvY29kZT4gbWV0aG9kIG9wZXJhdGlvbiB0aGF0IGlzIGN1cnJlbnRseSBpblxuXHQgKiBwcm9ncmVzcyBmb3IgdGhlIExvYWRlciBpbnN0YW5jZS5cblx0ICpcblx0ICovXG5cdHB1YmxpYyBjbG9zZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fdXNlQXNzZXRMaWIpIHtcblx0XHRcdHZhciBsaWI6QXNzZXRMaWJyYXJ5QnVuZGxlO1xuXHRcdFx0bGliID0gQXNzZXRMaWJyYXJ5QnVuZGxlLmdldEluc3RhbmNlKHRoaXMuX2Fzc2V0TGliSWQpO1xuXHRcdFx0bGliLnN0b3BBbGxMb2FkaW5nU2Vzc2lvbnMoKTtcblx0XHRcdHRoaXMuX2xvYWRpbmdTZXNzaW9ucyA9IG51bGw7XG5cdFx0XHRyZXR1cm5cblx0XHR9XG5cdFx0dmFyIGk6bnVtYmVyIC8qaW50Ki87XG5cdFx0dmFyIGxlbmd0aDpudW1iZXIgLyppbnQqLyA9IHRoaXMuX2xvYWRpbmdTZXNzaW9ucy5sZW5ndGg7XG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHR0aGlzLnJlbW92ZUxpc3RlbmVycyh0aGlzLl9sb2FkaW5nU2Vzc2lvbnNbaV0pO1xuXHRcdFx0dGhpcy5fbG9hZGluZ1Nlc3Npb25zW2ldLnN0b3AoKTtcblx0XHRcdHRoaXMuX2xvYWRpbmdTZXNzaW9uc1tpXSA9IG51bGw7XG5cdFx0fVxuXHRcdHRoaXMuX2xvYWRpbmdTZXNzaW9ucyA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZHMgYSBTV0YsIEpQRUcsIHByb2dyZXNzaXZlIEpQRUcsIHVuYW5pbWF0ZWQgR0lGLCBvciBQTkcgZmlsZSBpbnRvIGFuXG5cdCAqIG9iamVjdCB0aGF0IGlzIGEgY2hpbGQgb2YgdGhpcyBMb2FkZXIgb2JqZWN0LiBJZiB5b3UgbG9hZCBhbiBhbmltYXRlZCBHSUZcblx0ICogZmlsZSwgb25seSB0aGUgZmlyc3QgZnJhbWUgaXMgZGlzcGxheWVkLiBBcyB0aGUgTG9hZGVyIG9iamVjdCBjYW4gY29udGFpblxuXHQgKiBvbmx5IGEgc2luZ2xlIGNoaWxkLCBpc3N1aW5nIGEgc3Vic2VxdWVudCA8Y29kZT5sb2FkKCk8L2NvZGU+IHJlcXVlc3Rcblx0ICogdGVybWluYXRlcyB0aGUgcHJldmlvdXMgcmVxdWVzdCwgaWYgc3RpbGwgcGVuZGluZywgYW5kIGNvbW1lbmNlcyBhIG5ld1xuXHQgKiBsb2FkLlxuXHQgKlxuXHQgKiA8cD48Yj5Ob3RlPC9iPjogSW4gQUlSIDEuNSBhbmQgRmxhc2ggUGxheWVyIDEwLCB0aGUgbWF4aW11bSBzaXplIGZvciBhXG5cdCAqIGxvYWRlZCBpbWFnZSBpcyA4LDE5MSBwaXhlbHMgaW4gd2lkdGggb3IgaGVpZ2h0LCBhbmQgdGhlIHRvdGFsIG51bWJlciBvZlxuXHQgKiBwaXhlbHMgY2Fubm90IGV4Y2VlZCAxNiw3NzcsMjE1IHBpeGVscy4oU28sIGlmIGFuIGxvYWRlZCBpbWFnZSBpcyA4LDE5MVxuXHQgKiBwaXhlbHMgd2lkZSwgaXQgY2FuIG9ubHkgYmUgMiwwNDggcGl4ZWxzIGhpZ2guKSBJbiBGbGFzaCBQbGF5ZXIgOSBhbmRcblx0ICogZWFybGllciBhbmQgQUlSIDEuMSBhbmQgZWFybGllciwgdGhlIGxpbWl0YXRpb24gaXMgMiw4ODAgcGl4ZWxzIGluIGhlaWdodFxuXHQgKiBhbmQgMiw4ODAgcGl4ZWxzIGluIHdpZHRoLjwvcD5cblx0ICpcblx0ICogPHA+QSBTV0YgZmlsZSBvciBpbWFnZSBsb2FkZWQgaW50byBhIExvYWRlciBvYmplY3QgaW5oZXJpdHMgdGhlIHBvc2l0aW9uLFxuXHQgKiByb3RhdGlvbiwgYW5kIHNjYWxlIHByb3BlcnRpZXMgb2YgdGhlIHBhcmVudCBkaXNwbGF5IG9iamVjdHMgb2YgdGhlIExvYWRlclxuXHQgKiBvYmplY3QuIDwvcD5cblx0ICpcblx0ICogPHA+VXNlIHRoZSA8Y29kZT51bmxvYWQoKTwvY29kZT4gbWV0aG9kIHRvIHJlbW92ZSBtb3ZpZXMgb3IgaW1hZ2VzIGxvYWRlZFxuXHQgKiB3aXRoIHRoaXMgbWV0aG9kLCBvciB0byBjYW5jZWwgYSBsb2FkIG9wZXJhdGlvbiB0aGF0IGlzIGluIHByb2dyZXNzLjwvcD5cblx0ICpcblx0ICogPHA+WW91IGNhbiBwcmV2ZW50IGEgU1dGIGZpbGUgZnJvbSB1c2luZyB0aGlzIG1ldGhvZCBieSBzZXR0aW5nIHRoZVxuXHQgKiA8Y29kZT5hbGxvd05ldHdvcmtpbmc8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGUgdGhlIDxjb2RlPm9iamVjdDwvY29kZT4gYW5kXG5cdCAqIDxjb2RlPmVtYmVkPC9jb2RlPiB0YWdzIGluIHRoZSBIVE1MIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgU1dGXG5cdCAqIGNvbnRlbnQuPC9wPlxuXHQgKlxuXHQgKiA8cD5XaGVuIHlvdSB1c2UgdGhpcyBtZXRob2QsIGNvbnNpZGVyIHRoZSBGbGFzaCBQbGF5ZXIgc2VjdXJpdHkgbW9kZWwsXG5cdCAqIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgTG9hZGVyIGNsYXNzIGRlc2NyaXB0aW9uLiA8L3A+XG5cdCAqXG5cdCAqIDxwPiBJbiBGbGFzaCBQbGF5ZXIgMTAgYW5kIGxhdGVyLCBpZiB5b3UgdXNlIGEgbXVsdGlwYXJ0IENvbnRlbnQtVHlwZShmb3Jcblx0ICogZXhhbXBsZSBcIm11bHRpcGFydC9mb3JtLWRhdGFcIikgdGhhdCBjb250YWlucyBhbiB1cGxvYWQoaW5kaWNhdGVkIGJ5IGFcblx0ICogXCJmaWxlbmFtZVwiIHBhcmFtZXRlciBpbiBhIFwiY29udGVudC1kaXNwb3NpdGlvblwiIGhlYWRlciB3aXRoaW4gdGhlIFBPU1Rcblx0ICogYm9keSksIHRoZSBQT1NUIG9wZXJhdGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBzZWN1cml0eSBydWxlcyBhcHBsaWVkIHRvXG5cdCAqIHVwbG9hZHM6PC9wPlxuXHQgKlxuXHQgKiA8dWw+XG5cdCAqICAgPGxpPlRoZSBQT1NUIG9wZXJhdGlvbiBtdXN0IGJlIHBlcmZvcm1lZCBpbiByZXNwb25zZSB0byBhIHVzZXItaW5pdGlhdGVkXG5cdCAqIGFjdGlvbiwgc3VjaCBhcyBhIG1vdXNlIGNsaWNrIG9yIGtleSBwcmVzcy48L2xpPlxuXHQgKiAgIDxsaT5JZiB0aGUgUE9TVCBvcGVyYXRpb24gaXMgY3Jvc3MtZG9tYWluKHRoZSBQT1NUIHRhcmdldCBpcyBub3Qgb24gdGhlXG5cdCAqIHNhbWUgc2VydmVyIGFzIHRoZSBTV0YgZmlsZSB0aGF0IGlzIHNlbmRpbmcgdGhlIFBPU1QgcmVxdWVzdCksIHRoZSB0YXJnZXRcblx0ICogc2VydmVyIG11c3QgcHJvdmlkZSBhIFVSTCBwb2xpY3kgZmlsZSB0aGF0IHBlcm1pdHMgY3Jvc3MtZG9tYWluXG5cdCAqIGFjY2Vzcy48L2xpPlxuXHQgKiA8L3VsPlxuXHQgKlxuXHQgKiA8cD5BbHNvLCBmb3IgYW55IG11bHRpcGFydCBDb250ZW50LVR5cGUsIHRoZSBzeW50YXggbXVzdCBiZSB2YWxpZFxuXHQgKiAoYWNjb3JkaW5nIHRvIHRoZSBSRkMyMDQ2IHN0YW5kYXJkKS4gSWYgdGhlIHN5bnRheCBhcHBlYXJzIHRvIGJlIGludmFsaWQsXG5cdCAqIHRoZSBQT1NUIG9wZXJhdGlvbiBpcyBzdWJqZWN0IHRvIHRoZSBzZWN1cml0eSBydWxlcyBhcHBsaWVkIHRvXG5cdCAqIHVwbG9hZHMuPC9wPlxuXHQgKlxuXHQgKiA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHNlY3VyaXR5LCBzZWUgdGhlIEZsYXNoIFBsYXllclxuXHQgKiBEZXZlbG9wZXIgQ2VudGVyIFRvcGljOiA8YVxuXHQgKiBocmVmPVwiaHR0cDovL3d3dy5hZG9iZS5jb20vZ28vZGV2bmV0X3NlY3VyaXR5X2VuXCJcblx0ICogc2NvcGU9XCJleHRlcm5hbFwiPlNlY3VyaXR5PC9hPi48L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSByZXF1ZXN0IFRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkwgb2YgdGhlIFNXRiwgSlBFRywgR0lGLCBvciBQTkdcblx0ICogICAgICAgICAgICAgICAgZmlsZSB0byBiZSBsb2FkZWQuIEEgcmVsYXRpdmUgcGF0aCBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZVxuXHQgKiAgICAgICAgICAgICAgICBtYWluIFNXRiBmaWxlLiBBYnNvbHV0ZSBVUkxzIG11c3QgaW5jbHVkZSB0aGUgcHJvdG9jb2xcblx0ICogICAgICAgICAgICAgICAgcmVmZXJlbmNlLCBzdWNoIGFzIGh0dHA6Ly8gb3IgZmlsZTovLy8uIEZpbGVuYW1lcyBjYW5ub3Rcblx0ICogICAgICAgICAgICAgICAgaW5jbHVkZSBkaXNrIGRyaXZlIHNwZWNpZmljYXRpb25zLlxuXHQgKiBAcGFyYW0gY29udGV4dCBBIExvYWRlckNvbnRleHQgb2JqZWN0LCB3aGljaCBoYXMgcHJvcGVydGllcyB0aGF0IGRlZmluZVxuXHQgKiAgICAgICAgICAgICAgICB0aGUgZm9sbG93aW5nOlxuXHQgKiAgICAgICAgICAgICAgICA8dWw+XG5cdCAqICAgICAgICAgICAgICAgICAgPGxpPldoZXRoZXIgb3Igbm90IHRvIGNoZWNrIGZvciB0aGUgZXhpc3RlbmNlIG9mIGEgcG9saWN5XG5cdCAqICAgICAgICAgICAgICAgIGZpbGUgdXBvbiBsb2FkaW5nIHRoZSBvYmplY3Q8L2xpPlxuXHQgKiAgICAgICAgICAgICAgICAgIDxsaT5UaGUgQXBwbGljYXRpb25Eb21haW4gZm9yIHRoZSBsb2FkZWQgb2JqZWN0PC9saT5cblx0ICogICAgICAgICAgICAgICAgICA8bGk+VGhlIFNlY3VyaXR5RG9tYWluIGZvciB0aGUgbG9hZGVkIG9iamVjdDwvbGk+XG5cdCAqICAgICAgICAgICAgICAgICAgPGxpPlRoZSBJbWFnZURlY29kaW5nUG9saWN5IGZvciB0aGUgbG9hZGVkIGltYWdlXG5cdCAqICAgICAgICAgICAgICAgIG9iamVjdDwvbGk+XG5cdCAqICAgICAgICAgICAgICAgIDwvdWw+XG5cdCAqXG5cdCAqICAgICAgICAgICAgICAgIDxwPklmIHRoZSA8Y29kZT5jb250ZXh0PC9jb2RlPiBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZFxuXHQgKiAgICAgICAgICAgICAgICBvciByZWZlcnMgdG8gYSBudWxsIG9iamVjdCwgdGhlIGxvYWRlZCBjb250ZW50IHJlbWFpbnMgaW5cblx0ICogICAgICAgICAgICAgICAgaXRzIG93biBzZWN1cml0eSBkb21haW4uPC9wPlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICA8cD5Gb3IgY29tcGxldGUgZGV0YWlscywgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGVcblx0ICogICAgICAgICAgICAgICAgcHJvcGVydGllcyBpbiB0aGUgPGFcblx0ICogICAgICAgICAgICAgICAgaHJlZj1cIi4uL3N5c3RlbS9Mb2FkZXJDb250ZXh0Lmh0bWxcIj5Mb2FkZXJDb250ZXh0PC9hPlxuXHQgKiAgICAgICAgICAgICAgICBjbGFzcy48L3A+XG5cdCAqIEBwYXJhbSBucyAgICAgIEFuIG9wdGlvbmFsIG5hbWVzcGFjZSBzdHJpbmcgdW5kZXIgd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmVcblx0ICogICAgICAgICAgICAgICAgbG9hZGVkLCBhbGxvd2luZyB0aGUgZGlmZmVyZW50aWF0aW9uIG9mIHR3byByZXNvdXJjZXMgd2l0aFxuXHQgKiAgICAgICAgICAgICAgICBpZGVudGljYWwgYXNzZXRzLlxuXHQgKiBAcGFyYW0gcGFyc2VyICBBbiBvcHRpb25hbCBwYXJzZXIgb2JqZWN0IGZvciB0cmFuc2xhdGluZyB0aGUgbG9hZGVkIGRhdGFcblx0ICogICAgICAgICAgICAgICAgaW50byBhIHVzYWJsZSByZXNvdXJjZS4gSWYgbm90IHByb3ZpZGVkLCBBc3NldExvYWRlciB3aWxsXG5cdCAqICAgICAgICAgICAgICAgIGF0dGVtcHQgdG8gYXV0by1kZXRlY3QgdGhlIGZpbGUgdHlwZS5cblx0ICogQHRocm93cyBJT0Vycm9yICAgICAgICAgICAgICAgVGhlIDxjb2RlPmRpZ2VzdDwvY29kZT4gcHJvcGVydHkgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnJlcXVlc3Q8L2NvZGU+IG9iamVjdCBpcyBub3Rcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uIFlvdSBzaG91bGQgb25seSBzZXQgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmRpZ2VzdDwvY29kZT4gcHJvcGVydHkgb2YgYSBVUkxSZXF1ZXN0XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB3aGVuIGNhbGxpbmcgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlVSTExvYWRlci5sb2FkKCk8L2NvZGU+IG1ldGhvZCB3aGVuXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcgYSBTV1ogZmlsZShhbiBBZG9iZSBwbGF0Zm9ybVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQpLlxuXHQgKiBAdGhyb3dzIElsbGVnYWxPcGVyYXRpb25FcnJvciBJZiB0aGUgPGNvZGU+cmVxdWVzdGVkQ29udGVudFBhcmVudDwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgb2YgdGhlIDxjb2RlPmNvbnRleHQ8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpcyBhIDxjb2RlPkxvYWRlcjwvY29kZT4uXG5cdCAqIEB0aHJvd3MgSWxsZWdhbE9wZXJhdGlvbkVycm9yIElmIHRoZSA8Y29kZT5Mb2FkZXJDb250ZXh0LnBhcmFtZXRlcnM8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBpcyBzZXQgdG8gbm9uLW51bGwgYW5kIGhhcyBzb21lXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyB3aGljaCBhcmUgbm90IFN0cmluZ3MuXG5cdCAqIEB0aHJvd3MgU2VjdXJpdHlFcnJvciAgICAgICAgIFRoZSB2YWx1ZSBvZlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5Mb2FkZXJDb250ZXh0LnNlY3VyaXR5RG9tYWluPC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGVpdGhlciA8Y29kZT5udWxsPC9jb2RlPiBvclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5TZWN1cml0eURvbWFpbi5jdXJyZW50RG9tYWluPC9jb2RlPi5cblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyByZWZsZWN0cyB0aGUgZmFjdCB0aGF0IHlvdSBjYW4gb25seVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSB0aGUgbG9hZGVkIG1lZGlhIGluIGl0cyBuYXR1cmFsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5IHNhbmRib3ggb3IgeW91ciBvd24odGhlIGxhdHRlclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlcyBhIHBvbGljeSBmaWxlKS5cblx0ICogQHRocm93cyBTZWN1cml0eUVycm9yICAgICAgICAgTG9jYWwgU1dGIGZpbGVzIG1heSBub3Qgc2V0XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlckNvbnRleHQuc2VjdXJpdHlEb21haW4gdG8gYW55dGhpbmdcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgdGhhbiA8Y29kZT5udWxsPC9jb2RlPi4gSXQgaXMgbm90XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pdHRlZCB0byBpbXBvcnQgbm9uLWxvY2FsIG1lZGlhIGludG8gYVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBzYW5kYm94LCBvciB0byBwbGFjZSBvdGhlciBsb2NhbCBtZWRpYVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhbnl0aGluZyBvdGhlciB0aGFuIGl0cyBuYXR1cmFsIHNhbmRib3guXG5cdCAqIEB0aHJvd3MgU2VjdXJpdHlFcnJvciAgICAgICAgIFlvdSBjYW5ub3QgY29ubmVjdCB0byBjb21tb25seSByZXNlcnZlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0cy4gRm9yIGEgY29tcGxldGUgbGlzdCBvZiBibG9ja2VkIHBvcnRzLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgXCJSZXN0cmljdGluZyBOZXR3b3JraW5nIEFQSXNcIiBpbiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+QWN0aW9uU2NyaXB0IDMuMCBEZXZlbG9wZXIncyBHdWlkZTwvaT4uXG5cdCAqIEB0aHJvd3MgU2VjdXJpdHlFcnJvciAgICAgICAgIElmIHRoZSA8Y29kZT5hcHBsaWNhdGlvbkRvbWFpbjwvY29kZT4gb3Jcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+c2VjdXJpdHlEb21haW48L2NvZGU+IHByb3BlcnRpZXMgb2Zcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IHBhcmFtZXRlciBhcmUgZnJvbVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGRpc2FsbG93ZWQgZG9tYWluLlxuXHQgKiBAdGhyb3dzIFNlY3VyaXR5RXJyb3IgICAgICAgICBJZiBhIGxvY2FsIFNXRiBmaWxlIGlzIGF0dGVtcHRpbmcgdG8gdXNlIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5zZWN1cml0eURvbWFpbjwvY29kZT4gcHJvcGVydHkgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmNvbnRleHQ8L2NvZGU+IHBhcmFtZXRlci5cblx0ICogQGV2ZW50IGFzeW5jRXJyb3IgICAgRGlzcGF0Y2hlZCBieSB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+TG9hZGVyQ29udGV4dC5yZXF1ZXN0ZWRDb250ZW50UGFyZW50PC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSB0b1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICBhZGQgdGhlIGxvYWRlZCBjb250ZW50IGFzIGEgY2hpbGQgdG8gdGhlIHNwZWNpZmllZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5T2JqZWN0Q29udGFpbmVyLiBUaGlzIGNvdWxkIGhhcHBlbiBpZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgbG9hZGVkIGNvbnRlbnQgaXMgYVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5mbGFzaC5kaXNwbGF5LkFWTTFNb3ZpZTwvY29kZT4gb3IgaWYgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmFkZENoaWxkKCk8L2NvZGU+IGNhbGwgdG8gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbnRlbnRQYXJlbnQgdGhyb3dzIGFuIGVycm9yLlxuXHQgKiBAZXZlbnQgY29tcGxldGUgICAgICBEaXNwYXRjaGVkIGJ5IHRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHdoZW4gdGhlIGZpbGUgaGFzIGNvbXBsZXRlZCBsb2FkaW5nLiBUaGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+Y29tcGxldGU8L2NvZGU+IGV2ZW50IGlzIGFsd2F5cyBkaXNwYXRjaGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSA8Y29kZT5pbml0PC9jb2RlPiBldmVudC5cblx0ICogQGV2ZW50IGh0dHBTdGF0dXMgICAgRGlzcGF0Y2hlZCBieSB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB3aGVuIGEgbmV0d29yayByZXF1ZXN0IGlzIG1hZGUgb3ZlciBIVFRQIGFuZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBGbGFzaCBQbGF5ZXIgY2FuIGRldGVjdCB0aGUgSFRUUCBzdGF0dXMgY29kZS5cblx0ICogQGV2ZW50IGluaXQgICAgICAgICAgRGlzcGF0Y2hlZCBieSB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB3aGVuIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIG9mIHRoZSBsb2FkZWRcblx0ICogICAgICAgICAgICAgICAgICAgICAgU1dGIGZpbGUgYXJlIGFjY2Vzc2libGUuIFRoZSA8Y29kZT5pbml0PC9jb2RlPiBldmVudFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgcHJlY2VkZXMgdGhlIDxjb2RlPmNvbXBsZXRlPC9jb2RlPiBldmVudC5cblx0ICogQGV2ZW50IGlvRXJyb3IgICAgICAgRGlzcGF0Y2hlZCBieSB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB3aGVuIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMgdGhhdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBjYXVzZXMgYSBsb2FkIG9wZXJhdGlvbiB0byBmYWlsLlxuXHQgKiBAZXZlbnQgb3BlbiAgICAgICAgICBEaXNwYXRjaGVkIGJ5IHRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHdoZW4gdGhlIGxvYWRpbmcgb3BlcmF0aW9uIHN0YXJ0cy5cblx0ICogQGV2ZW50IHByb2dyZXNzICAgICAgRGlzcGF0Y2hlZCBieSB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBhcyBkYXRhIGlzIHJlY2VpdmVkIHdoaWxlIGxvYWQgb3BlcmF0aW9uXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzZXMuXG5cdCAqIEBldmVudCBzZWN1cml0eUVycm9yIERpc3BhdGNoZWQgYnkgdGhlIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgaWYgYSBTV0YgZmlsZSBpbiB0aGUgbG9jYWwtd2l0aC1maWxlc3lzdGVtXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHNhbmRib3ggYXR0ZW1wdHMgdG8gbG9hZCBjb250ZW50IGluIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBsb2NhbC13aXRoLW5ldHdvcmtpbmcgc2FuZGJveCwgb3IgdmljZSB2ZXJzYS5cblx0ICogQGV2ZW50IHNlY3VyaXR5RXJyb3IgRGlzcGF0Y2hlZCBieSB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+TG9hZGVyQ29udGV4dC5yZXF1ZXN0ZWRDb250ZW50UGFyZW50PC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHRoZSBzZWN1cml0eSBzYW5kYm94XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5Mb2FkZXJDb250ZXh0LnJlcXVlc3RlZENvbnRlbnRQYXJlbnQ8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBsb2FkZWQgU1dGLlxuXHQgKiBAZXZlbnQgdW5sb2FkICAgICAgICBEaXNwYXRjaGVkIGJ5IHRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHdoZW4gYSBsb2FkZWQgb2JqZWN0IGlzIHJlbW92ZWQuXG5cdCAqL1xuXHRwdWJsaWMgbG9hZChyZXF1ZXN0OlVSTFJlcXVlc3QsIGNvbnRleHQ6QXNzZXRMb2FkZXJDb250ZXh0ID0gbnVsbCwgbnM6c3RyaW5nID0gbnVsbCwgcGFyc2VyOlBhcnNlckJhc2UgPSBudWxsKTpBc3NldExvYWRlclRva2VuXG5cdHtcblx0XHR2YXIgdG9rZW46QXNzZXRMb2FkZXJUb2tlbjtcblxuXHRcdGlmICh0aGlzLl91c2VBc3NldExpYikge1xuXHRcdFx0dmFyIGxpYjpBc3NldExpYnJhcnlCdW5kbGU7XG5cdFx0XHRsaWIgPSBBc3NldExpYnJhcnlCdW5kbGUuZ2V0SW5zdGFuY2UodGhpcy5fYXNzZXRMaWJJZCk7XG5cdFx0XHR0b2tlbiA9IGxpYi5sb2FkKHJlcXVlc3QsIGNvbnRleHQsIG5zLCBwYXJzZXIpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgbG9hZGVyOkFzc2V0TG9hZGVyID0gbmV3IEFzc2V0TG9hZGVyKCk7XG5cdFx0XHR0aGlzLl9sb2FkaW5nU2Vzc2lvbnMucHVzaChsb2FkZXIpO1xuXHRcdFx0dG9rZW4gPSBsb2FkZXIubG9hZChyZXF1ZXN0LCBjb250ZXh0LCBucywgcGFyc2VyKTtcblx0XHR9XG5cblx0XHR0b2tlbi5hZGRFdmVudExpc3RlbmVyKExvYWRlckV2ZW50LlJFU09VUkNFX0NPTVBMRVRFLCB0aGlzLl9vblJlc291cmNlQ29tcGxldGVEZWxlZ2F0ZSk7XG5cdFx0dG9rZW4uYWRkRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LkFTU0VUX0NPTVBMRVRFLCB0aGlzLl9vbkFzc2V0Q29tcGxldGVEZWxlZ2F0ZSk7XG5cblx0XHQvLyBFcnJvciBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5IChzZWUgZG9jdW1lbnRhdGlvbiBmb3IgYWRkRXJyb3JIYW5kbGVyKVxuXHRcdHRva2VuLl9pTG9hZGVyLl9pQWRkRXJyb3JIYW5kbGVyKHRoaXMub25Mb2FkRXJyb3IpO1xuXHRcdHRva2VuLl9pTG9hZGVyLl9pQWRkUGFyc2VFcnJvckhhbmRsZXIodGhpcy5vblBhcnNlRXJyb3IpO1xuXG5cdFx0cmV0dXJuIHRva2VuO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIGZyb20gYmluYXJ5IGRhdGEgc3RvcmVkIGluIGEgQnl0ZUFycmF5IG9iamVjdC5cblx0ICpcblx0ICogPHA+VGhlIDxjb2RlPmxvYWRCeXRlcygpPC9jb2RlPiBtZXRob2QgaXMgYXN5bmNocm9ub3VzLiBZb3UgbXVzdCB3YWl0IGZvclxuXHQgKiB0aGUgXCJpbml0XCIgZXZlbnQgYmVmb3JlIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBvZiBhIGxvYWRlZCBvYmplY3QuPC9wPlxuXHQgKlxuXHQgKiA8cD5XaGVuIHlvdSB1c2UgdGhpcyBtZXRob2QsIGNvbnNpZGVyIHRoZSBGbGFzaCBQbGF5ZXIgc2VjdXJpdHkgbW9kZWwsXG5cdCAqIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiB0aGUgTG9hZGVyIGNsYXNzIGRlc2NyaXB0aW9uLiA8L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBieXRlcyAgIEEgQnl0ZUFycmF5IG9iamVjdC4gVGhlIGNvbnRlbnRzIG9mIHRoZSBCeXRlQXJyYXkgY2FuIGJlXG5cdCAqICAgICAgICAgICAgICAgIGFueSBvZiB0aGUgZmlsZSBmb3JtYXRzIHN1cHBvcnRlZCBieSB0aGUgTG9hZGVyIGNsYXNzOiBTV0YsXG5cdCAqICAgICAgICAgICAgICAgIEdJRiwgSlBFRywgb3IgUE5HLlxuXHQgKiBAcGFyYW0gY29udGV4dCBBIExvYWRlckNvbnRleHQgb2JqZWN0LiBPbmx5IHRoZVxuXHQgKiAgICAgICAgICAgICAgICA8Y29kZT5hcHBsaWNhdGlvbkRvbWFpbjwvY29kZT4gcHJvcGVydHkgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgIExvYWRlckNvbnRleHQgb2JqZWN0IGFwcGxpZXM7IHRoZVxuXHQgKiAgICAgICAgICAgICAgICA8Y29kZT5jaGVja1BvbGljeUZpbGU8L2NvZGU+IGFuZFxuXHQgKiAgICAgICAgICAgICAgICA8Y29kZT5zZWN1cml0eURvbWFpbjwvY29kZT4gcHJvcGVydGllcyBvZiB0aGUgTG9hZGVyQ29udGV4dFxuXHQgKiAgICAgICAgICAgICAgICBvYmplY3QgZG8gbm90IGFwcGx5LlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICA8cD5JZiB0aGUgPGNvZGU+Y29udGV4dDwvY29kZT4gcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWRcblx0ICogICAgICAgICAgICAgICAgb3IgcmVmZXJzIHRvIGEgbnVsbCBvYmplY3QsIHRoZSBjb250ZW50IGlzIGxvYWRlZCBpbnRvIHRoZVxuXHQgKiAgICAgICAgICAgICAgICBjdXJyZW50IHNlY3VyaXR5IGRvbWFpbiAtICBhIHByb2Nlc3MgcmVmZXJyZWQgdG8gYXMgXCJpbXBvcnRcblx0ICogICAgICAgICAgICAgICAgbG9hZGluZ1wiIGluIEZsYXNoIFBsYXllciBzZWN1cml0eSBkb2N1bWVudGF0aW9uLlxuXHQgKiAgICAgICAgICAgICAgICBTcGVjaWZpY2FsbHksIGlmIHRoZSBsb2FkaW5nIFNXRiBmaWxlIHRydXN0cyB0aGUgcmVtb3RlIFNXRlxuXHQgKiAgICAgICAgICAgICAgICBieSBpbmNvcnBvcmF0aW5nIHRoZSByZW1vdGUgU1dGIGludG8gaXRzIGNvZGUsIHRoZW4gdGhlXG5cdCAqICAgICAgICAgICAgICAgIGxvYWRpbmcgU1dGIGNhbiBpbXBvcnQgaXQgZGlyZWN0bHkgaW50byBpdHMgb3duIHNlY3VyaXR5XG5cdCAqICAgICAgICAgICAgICAgIGRvbWFpbi48L3A+XG5cdCAqXG5cdCAqICAgICAgICAgICAgICAgIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gc2VjdXJpdHksIHNlZSB0aGUgRmxhc2hcblx0ICogICAgICAgICAgICAgICAgUGxheWVyIERldmVsb3BlciBDZW50ZXIgVG9waWM6IDxhXG5cdCAqICAgICAgICAgICAgICAgIGhyZWY9XCJodHRwOi8vd3d3LmFkb2JlLmNvbS9nby9kZXZuZXRfc2VjdXJpdHlfZW5cIlxuXHQgKiAgICAgICAgICAgICAgICBzY29wZT1cImV4dGVybmFsXCI+U2VjdXJpdHk8L2E+LjwvcD5cblx0ICogQHRocm93cyBBcmd1bWVudEVycm9yICAgICAgICAgSWYgdGhlIDxjb2RlPmxlbmd0aDwvY29kZT4gcHJvcGVydHkgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheSBvYmplY3QgaXMgbm90IGdyZWF0ZXIgdGhhbiAwLlxuXHQgKiBAdGhyb3dzIElsbGVnYWxPcGVyYXRpb25FcnJvciBJZiB0aGUgPGNvZGU+Y2hlY2tQb2xpY3lGaWxlPC9jb2RlPiBvclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5zZWN1cml0eURvbWFpbjwvY29kZT4gcHJvcGVydHkgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmNvbnRleHQ8L2NvZGU+IHBhcmFtZXRlciBhcmUgbm9uLW51bGwuXG5cdCAqIEB0aHJvd3MgSWxsZWdhbE9wZXJhdGlvbkVycm9yIElmIHRoZSA8Y29kZT5yZXF1ZXN0ZWRDb250ZW50UGFyZW50PC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBvZiB0aGUgPGNvZGU+Y29udGV4dDwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIGEgPGNvZGU+TG9hZGVyPC9jb2RlPi5cblx0ICogQHRocm93cyBJbGxlZ2FsT3BlcmF0aW9uRXJyb3IgSWYgdGhlIDxjb2RlPkxvYWRlckNvbnRleHQucGFyYW1ldGVyczwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGlzIHNldCB0byBub24tbnVsbCBhbmQgaGFzIHNvbWVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIHdoaWNoIGFyZSBub3QgU3RyaW5ncy5cblx0ICogQHRocm93cyBTZWN1cml0eUVycm9yICAgICAgICAgSWYgdGhlIHByb3ZpZGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmFwcGxpY2F0aW9uRG9tYWluPC9jb2RlPiBwcm9wZXJ0eSBvZlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+Y29udGV4dDwvY29kZT4gcHJvcGVydHkgaXMgZnJvbSBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FsbG93ZWQgZG9tYWluLlxuXHQgKiBAdGhyb3dzIFNlY3VyaXR5RXJyb3IgICAgICAgICBZb3UgY2Fubm90IGNvbm5lY3QgdG8gY29tbW9ubHkgcmVzZXJ2ZWRcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydHMuIEZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgYmxvY2tlZCBwb3J0cyxcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlIFwiUmVzdHJpY3RpbmcgTmV0d29ya2luZyBBUElzXCIgaW4gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpPkFjdGlvblNjcmlwdCAzLjAgRGV2ZWxvcGVyJ3MgR3VpZGU8L2k+LlxuXHQgKiBAZXZlbnQgYXN5bmNFcnJvciAgICBEaXNwYXRjaGVkIGJ5IHRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGlmIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5Mb2FkZXJDb250ZXh0LnJlcXVlc3RlZENvbnRlbnRQYXJlbnQ8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IGhhcyBiZWVuIHNwZWNpZmllZCBhbmQgaXQgaXMgbm90IHBvc3NpYmxlIHRvXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGFkZCB0aGUgbG9hZGVkIGNvbnRlbnQgYXMgYSBjaGlsZCB0byB0aGUgc3BlY2lmaWVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlPYmplY3RDb250YWluZXIuIFRoaXMgY291bGQgaGFwcGVuIGlmIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgY29udGVudCBpcyBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmZsYXNoLmRpc3BsYXkuQVZNMU1vdmllPC9jb2RlPiBvciBpZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+YWRkQ2hpbGQoKTwvY29kZT4gY2FsbCB0byB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkQ29udGVudFBhcmVudCB0aHJvd3MgYW4gZXJyb3IuXG5cdCAqIEBldmVudCBjb21wbGV0ZSAgICAgIERpc3BhdGNoZWQgYnkgdGhlIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3Qgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlLiBUaGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+Y29tcGxldGU8L2NvZGU+IGV2ZW50IGlzIGFsd2F5cyBkaXNwYXRjaGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSA8Y29kZT5pbml0PC9jb2RlPiBldmVudC5cblx0ICogQGV2ZW50IGluaXQgICAgICAgICAgRGlzcGF0Y2hlZCBieSB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCB3aGVuIHRoZSBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIG9mIHRoZSBsb2FkZWRcblx0ICogICAgICAgICAgICAgICAgICAgICAgZGF0YSBhcmUgYWNjZXNzaWJsZS4gVGhlIDxjb2RlPmluaXQ8L2NvZGU+IGV2ZW50XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBwcmVjZWRlcyB0aGUgPGNvZGU+Y29tcGxldGU8L2NvZGU+IGV2ZW50LlxuXHQgKiBAZXZlbnQgaW9FcnJvciAgICAgICBEaXNwYXRjaGVkIGJ5IHRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHdoZW4gdGhlIHJ1bnRpbWUgY2Fubm90IHBhcnNlIHRoZSBkYXRhIGluIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBieXRlIGFycmF5LlxuXHQgKiBAZXZlbnQgb3BlbiAgICAgICAgICBEaXNwYXRjaGVkIGJ5IHRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHdoZW4gdGhlIG9wZXJhdGlvbiBzdGFydHMuXG5cdCAqIEBldmVudCBwcm9ncmVzcyAgICAgIERpc3BhdGNoZWQgYnkgdGhlIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgYXMgZGF0YSBpcyB0cmFuc2ZlcmVkIGluIG1lbW9yeS5cblx0ICogQGV2ZW50IHNlY3VyaXR5RXJyb3IgRGlzcGF0Y2hlZCBieSB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBpZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgPGNvZGU+TG9hZGVyQ29udGV4dC5yZXF1ZXN0ZWRDb250ZW50UGFyZW50PC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBoYXMgYmVlbiBzcGVjaWZpZWQgYW5kIHRoZSBzZWN1cml0eSBzYW5kYm94XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5Mb2FkZXJDb250ZXh0LnJlcXVlc3RlZENvbnRlbnRQYXJlbnQ8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBsb2FkZWQgU1dGLlxuXHQgKiBAZXZlbnQgdW5sb2FkICAgICAgICBEaXNwYXRjaGVkIGJ5IHRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHdoZW4gYSBsb2FkZWQgb2JqZWN0IGlzIHJlbW92ZWQuXG5cdCAqL1xuXHRwdWJsaWMgbG9hZERhdGEoZGF0YTphbnksIGNvbnRleHQ6QXNzZXRMb2FkZXJDb250ZXh0ID0gbnVsbCwgbnM6c3RyaW5nID0gbnVsbCwgcGFyc2VyOlBhcnNlckJhc2UgPSBudWxsKTpBc3NldExvYWRlclRva2VuXG5cdHtcblx0XHR2YXIgdG9rZW46QXNzZXRMb2FkZXJUb2tlbjtcblxuXHRcdGlmICh0aGlzLl91c2VBc3NldExpYikge1xuXHRcdFx0dmFyIGxpYjpBc3NldExpYnJhcnlCdW5kbGU7XG5cdFx0XHRsaWIgPSBBc3NldExpYnJhcnlCdW5kbGUuZ2V0SW5zdGFuY2UodGhpcy5fYXNzZXRMaWJJZCk7XG5cdFx0XHR0b2tlbiA9IGxpYi5sb2FkRGF0YShkYXRhLCBjb250ZXh0LCBucywgcGFyc2VyKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGxvYWRlcjpBc3NldExvYWRlciA9IG5ldyBBc3NldExvYWRlcigpO1xuXHRcdFx0dGhpcy5fbG9hZGluZ1Nlc3Npb25zLnB1c2gobG9hZGVyKTtcblx0XHRcdHRva2VuID0gbG9hZGVyLmxvYWREYXRhKGRhdGEsICcnLCBjb250ZXh0LCBucywgcGFyc2VyKTtcblx0XHR9XG5cblx0XHR0b2tlbi5hZGRFdmVudExpc3RlbmVyKExvYWRlckV2ZW50LlJFU09VUkNFX0NPTVBMRVRFLCB0aGlzLl9vblJlc291cmNlQ29tcGxldGVEZWxlZ2F0ZSk7XG5cdFx0dG9rZW4uYWRkRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LkFTU0VUX0NPTVBMRVRFLCB0aGlzLl9vbkFzc2V0Q29tcGxldGVEZWxlZ2F0ZSk7XG5cblx0XHQvLyBFcnJvciBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5IChzZWUgZG9jdW1lbnRhdGlvbiBmb3IgYWRkRXJyb3JIYW5kbGVyKVxuXHRcdHRva2VuLl9pTG9hZGVyLl9pQWRkRXJyb3JIYW5kbGVyKHRoaXMub25Mb2FkRXJyb3IpO1xuXHRcdHRva2VuLl9pTG9hZGVyLl9pQWRkUGFyc2VFcnJvckhhbmRsZXIodGhpcy5vblBhcnNlRXJyb3IpO1xuXG5cdFx0cmV0dXJuIHRva2VuO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBjaGlsZCBvZiB0aGlzIExvYWRlciBvYmplY3QgdGhhdCB3YXMgbG9hZGVkIGJ5IHVzaW5nIHRoZVxuXHQgKiA8Y29kZT5sb2FkKCk8L2NvZGU+IG1ldGhvZC4gVGhlIDxjb2RlPnByb3BlcnR5PC9jb2RlPiBvZiB0aGUgYXNzb2NpYXRlZFxuXHQgKiBMb2FkZXJJbmZvIG9iamVjdCBpcyByZXNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4gVGhlIGNoaWxkIGlzIG5vdFxuXHQgKiBuZWNlc3NhcmlseSBkZXN0cm95ZWQgYmVjYXVzZSBvdGhlciBvYmplY3RzIG1pZ2h0IGhhdmUgcmVmZXJlbmNlcyB0byBpdDtcblx0ICogaG93ZXZlciwgaXQgaXMgbm8gbG9uZ2VyIGEgY2hpbGQgb2YgdGhlIExvYWRlciBvYmplY3QuXG5cdCAqXG5cdCAqIDxwPkFzIGEgYmVzdCBwcmFjdGljZSwgYmVmb3JlIHlvdSB1bmxvYWQgYSBjaGlsZCBTV0YgZmlsZSwgeW91IHNob3VsZFxuXHQgKiBleHBsaWNpdGx5IGNsb3NlIGFueSBzdHJlYW1zIGluIHRoZSBjaGlsZCBTV0YgZmlsZSdzIG9iamVjdHMsIHN1Y2ggYXNcblx0ICogTG9jYWxDb25uZWN0aW9uLCBOZXRDb25uZWN0aW9uLCBOZXRTdHJlYW0sIGFuZCBTb3VuZCBvYmplY3RzLiBPdGhlcndpc2UsXG5cdCAqIGF1ZGlvIGluIHRoZSBjaGlsZCBTV0YgZmlsZSBtaWdodCBjb250aW51ZSB0byBwbGF5LCBldmVuIHRob3VnaCB0aGUgY2hpbGRcblx0ICogU1dGIGZpbGUgd2FzIHVubG9hZGVkLiBUbyBjbG9zZSBzdHJlYW1zIGluIHRoZSBjaGlsZCBTV0YgZmlsZSwgYWRkIGFuXG5cdCAqIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBjaGlsZCB0aGF0IGxpc3RlbnMgZm9yIHRoZSA8Y29kZT51bmxvYWQ8L2NvZGU+XG5cdCAqIGV2ZW50LiBXaGVuIHRoZSBwYXJlbnQgY2FsbHMgPGNvZGU+TG9hZGVyLnVubG9hZCgpPC9jb2RlPiwgdGhlXG5cdCAqIDxjb2RlPnVubG9hZDwvY29kZT4gZXZlbnQgaXMgZGlzcGF0Y2hlZCB0byB0aGUgY2hpbGQuIFRoZSBmb2xsb3dpbmcgY29kZVxuXHQgKiBzaG93cyBob3cgeW91IG1pZ2h0IGRvIHRoaXM6PC9wPlxuXHQgKiA8cHJlIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+IHB1YmxpYyBjbG9zZUFsbFN0cmVhbXMoZXZ0OkV2ZW50KSB7XG5cdCAqIG15TmV0U3RyZWFtLmNsb3NlKCk7IG15U291bmQuY2xvc2UoKTsgbXlOZXRDb25uZWN0aW9uLmNsb3NlKCk7XG5cdCAqIG15TG9jYWxDb25uZWN0aW9uLmNsb3NlKCk7IH1cblx0ICogbXlNb3ZpZUNsaXAubG9hZGVySW5mby5hZGRFdmVudExpc3RlbmVyKEV2ZW50LlVOTE9BRCxcblx0ICogY2xvc2VBbGxTdHJlYW1zKTs8L3ByZT5cblx0ICpcblx0ICovXG5cdHB1YmxpYyB1bmxvYWQoKVxuXHR7XG5cdFx0Ly9UT0RPXG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlcyBhIHNwZWNpZmljIHBhcnNlci5cblx0ICogV2hlbiBubyBzcGVjaWZpYyBwYXJzZXIgaXMgc2V0IGZvciBhIGxvYWRpbmcvcGFyc2luZyBvcHBlcmF0aW9uLFxuXHQgKiBsb2FkZXIzZCBjYW4gYXV0b3NlbGVjdCB0aGUgY29ycmVjdCBwYXJzZXIgdG8gdXNlLlxuXHQgKiBBIHBhcnNlciBtdXN0IGhhdmUgYmVlbiBlbmFibGVkLCB0byBiZSBjb25zaWRlcmVkIHdoZW4gYXV0b3NlbGVjdGluZyB0aGUgcGFyc2VyLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyc2VyQ2xhc3MgVGhlIHBhcnNlciBjbGFzcyB0byBlbmFibGUuXG5cdCAqIEBzZWUgYXdheS5wYXJzZXJzLlBhcnNlcnNcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZW5hYmxlUGFyc2VyKHBhcnNlckNsYXNzOk9iamVjdClcblx0e1xuXHRcdEFzc2V0TG9hZGVyLmVuYWJsZVBhcnNlcihwYXJzZXJDbGFzcyk7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlcyBhIGxpc3Qgb2YgcGFyc2Vycy5cblx0ICogV2hlbiBubyBzcGVjaWZpYyBwYXJzZXIgaXMgc2V0IGZvciBhIGxvYWRpbmcvcGFyc2luZyBvcHBlcmF0aW9uLFxuXHQgKiBsb2FkZXIzZCBjYW4gYXV0b3NlbGVjdCB0aGUgY29ycmVjdCBwYXJzZXIgdG8gdXNlLlxuXHQgKiBBIHBhcnNlciBtdXN0IGhhdmUgYmVlbiBlbmFibGVkLCB0byBiZSBjb25zaWRlcmVkIHdoZW4gYXV0b3NlbGVjdGluZyB0aGUgcGFyc2VyLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyc2VyQ2xhc3NlcyBBIFZlY3RvciBvZiBwYXJzZXIgY2xhc3NlcyB0byBlbmFibGUuXG5cdCAqIEBzZWUgYXdheS5wYXJzZXJzLlBhcnNlcnNcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZW5hYmxlUGFyc2VycyhwYXJzZXJDbGFzc2VzOkFycmF5PE9iamVjdD4pXG5cdHtcblx0XHRBc3NldExvYWRlci5lbmFibGVQYXJzZXJzKHBhcnNlckNsYXNzZXMpO1xuXHR9XG5cblxuXHRwcml2YXRlIHJlbW92ZUxpc3RlbmVycyhkaXNwYXRjaGVyOkV2ZW50RGlzcGF0Y2hlcilcblx0e1xuXHRcdGRpc3BhdGNoZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihMb2FkZXJFdmVudC5SRVNPVVJDRV9DT01QTEVURSwgdGhpcy5fb25SZXNvdXJjZUNvbXBsZXRlRGVsZWdhdGUpO1xuXHRcdGRpc3BhdGNoZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LkFTU0VUX0NPTVBMRVRFLCB0aGlzLl9vbkFzc2V0Q29tcGxldGVEZWxlZ2F0ZSk7XG5cdH1cblxuXHRwcml2YXRlIG9uQXNzZXRDb21wbGV0ZShldmVudDpBc3NldEV2ZW50KVxuXHR7XG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGxvYWRpbmdcblx0ICovXG5cdHByaXZhdGUgb25Mb2FkRXJyb3IoZXZlbnQ6TG9hZGVyRXZlbnQpOmJvb2xlYW5cblx0e1xuXHRcdGlmICh0aGlzLmhhc0V2ZW50TGlzdGVuZXIoSU9FcnJvckV2ZW50LklPX0VSUk9SKSkge1xuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBwYXJzaW5nXG5cdCAqL1xuXHRwcml2YXRlIG9uUGFyc2VFcnJvcihldmVudDpQYXJzZXJFdmVudCk6Ym9vbGVhblxuXHR7XG5cdFx0aWYgKHRoaXMuaGFzRXZlbnRMaXN0ZW5lcihQYXJzZXJFdmVudC5QQVJTRV9FUlJPUikpIHtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB0aGUgcmVzb3VyY2UgYW5kIGFsbCBvZiBpdHMgZGVwZW5kZW5jaWVzIHdhcyByZXRyaWV2ZWQuXG5cdCAqL1xuXHRwcml2YXRlIG9uUmVzb3VyY2VDb21wbGV0ZShldmVudDpMb2FkZXJFdmVudClcblx0e1xuXHRcdHZhciBjb250ZW50OkRpc3BsYXlPYmplY3QgPSBldmVudC5jb250ZW50O1xuXG5cdFx0dGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG5cblx0XHRpZiAoY29udGVudClcblx0XHRcdHRoaXMuYWRkQ2hpbGQoY29udGVudCk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG59XG5cbmV4cG9ydCA9IExvYWRlcjsiXX0= \ No newline at end of file diff --git a/lib/containers/Loader.ts b/lib/containers/Loader.ts new file mode 100644 index 00000000..20b61390 --- /dev/null +++ b/lib/containers/Loader.ts @@ -0,0 +1,644 @@ +import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import LoaderInfo = require("awayjs-core/lib/core/base/LoaderInfo"); +import AssetLibraryBundle = require("awayjs-core/lib/core/library/AssetLibraryBundle"); +import AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); +import AssetLoaderContext = require("awayjs-core/lib/core/library/AssetLoaderContext"); +import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +import LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +import ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + +/** + * The Loader class is used to load SWF files or image(JPG, PNG, or GIF) + * files. Use the load() method to initiate loading. The loaded + * display object is added as a child of the Loader object. + * + *

Use the URLLoader class to load text or binary data.

+ * + *

The Loader class overrides the following methods that it inherits, + * because a Loader object can only have one child display object - the + * display object that it loads. Calling the following methods throws an + * exception: addChild(), addChildAt(), + * removeChild(), removeChildAt(), and + * setChildIndex(). To remove a loaded display object, you must + * remove the Loader object from its parent DisplayObjectContainer + * child array.

+ * + *

Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes + * are not used in ActionScript 3.0. The Loader and URLLoader classes replace + * them.

+ * + *

When you use the Loader class, consider the Flash Player and Adobe AIR + * security model:

+ * + *
    + *
  • You can load content from any accessible source.
  • + *
  • Loading is not allowed if the calling SWF file is in a network + * sandbox and the file to be loaded is local.
  • + *
  • If the loaded content is a SWF file written with ActionScript 3.0, it + * cannot be cross-scripted by a SWF file in another security sandbox unless + * that cross-scripting arrangement was approved through a call to the + * System.allowDomain() or the + * System.allowInsecureDomain() method in the loaded content + * file.
  • + *
  • If the loaded content is an AVM1 SWF file(written using ActionScript + * 1.0 or 2.0), it cannot be cross-scripted by an AVM2 SWF file(written using + * ActionScript 3.0). However, you can communicate between the two SWF files + * by using the LocalConnection class.
  • + *
  • If the loaded content is an image, its data cannot be accessed by a + * SWF file outside of the security sandbox, unless the domain of that SWF + * file was included in a URL policy file at the origin domain of the + * image.
  • + *
  • Movie clips in the local-with-file-system sandbox cannot script movie + * clips in the local-with-networking sandbox, and the reverse is also + * prevented.
  • + *
  • You cannot connect to commonly reserved ports. For a complete list of + * blocked ports, see "Restricting Networking APIs" in the ActionScript 3.0 + * Developer's Guide.
  • + *
+ * + *

However, in AIR, content in the application security + * sandbox(content installed with the AIR application) are not restricted by + * these security limitations.

+ * + *

For more information related to security, see the Flash Player Developer + * Center Topic: Security.

+ * + *

When loading a SWF file from an untrusted source(such as a domain other + * than that of the Loader object's root SWF file), you may want to define a + * mask for the Loader object, to prevent the loaded content(which is a child + * of the Loader object) from drawing to portions of the Stage outside of that + * mask, as shown in the following code:

+ */ +class Loader extends DisplayObjectContainer +{ + /** + * Dispatched when any asset finishes parsing. Also see specific events for each + * individual asset type (meshes, materials et c.) + * + * @eventType AssetEvent + */ + //[Event(name="assetComplete", type="AssetEvent")] + + + /** + * Dispatched when a full resource (including dependencies) finishes loading. + * + * @eventType LoaderEvent + */ + //[Event(name="resourceComplete", type="LoaderEvent")] + + private _loadingSessions:Array; + private _useAssetLib:boolean; + private _assetLibId:string; + private _onResourceCompleteDelegate:Function; + private _onAssetCompleteDelegate:Function; + + private _content:DisplayObject; + private _contentLoaderInfo:LoaderInfo; + + /** + * Contains the root display object of the SWF file or image(JPG, PNG, or + * GIF) file that was loaded by using the load() or + * loadBytes() methods. + * + * @throws SecurityError The loaded SWF file or image file belongs to a + * security sandbox to which you do not have access. + * For a loaded SWF file, you can avoid this situation + * by having the file call the + * Security.allowDomain() method or by + * having the loading file specify a + * loaderContext parameter with its + * securityDomain property set to + * SecurityDomain.currentDomain when you + * call the load() or + * loadBytes() method. + */ + public get content():DisplayObject + { + return this._content; + } + + /** + * Returns a LoaderInfo object corresponding to the object being loaded. + * LoaderInfo objects are shared between the Loader object and the loaded + * content object. The LoaderInfo object supplies loading progress + * information and statistics about the loaded file. + * + *

Events related to the load are dispatched by the LoaderInfo object + * referenced by the contentLoaderInfo property of the Loader + * object. The contentLoaderInfo property is set to a valid + * LoaderInfo object, even before the content is loaded, so that you can add + * event listeners to the object prior to the load.

+ * + *

To detect uncaught errors that happen in a loaded SWF, use the + * Loader.uncaughtErrorEvents property, not the + * Loader.contentLoaderInfo.uncaughtErrorEvents property.

+ */ + public get contentLoaderInfo():LoaderInfo + { + return this._contentLoaderInfo; + } + + /** + * Creates a Loader object that you can use to load files, such as SWF, JPEG, + * GIF, or PNG files. Call the load() method to load the asset + * as a child of the Loader instance. You can then add the Loader object to + * the display list(for instance, by using the addChild() + * method of a DisplayObjectContainer instance). The asset appears on the + * Stage as it loads. + * + *

You can also use a Loader instance "offlist," that is without adding it + * to a display object container on the display list. In this mode, the + * Loader instance might be used to load a SWF file that contains additional + * modules of an application.

+ * + *

To detect when the SWF file is finished loading, you can use the events + * of the LoaderInfo object associated with the + * contentLoaderInfo property of the Loader object. At that + * point, the code in the module SWF file can be executed to initialize and + * start the module. In the offlist mode, a Loader instance might also be + * used to load a SWF file that contains components or media assets. Again, + * you can use the LoaderInfo object event notifications to detect when the + * components are finished loading. At that point, the application can start + * using the components and media assets in the library of the SWF file by + * instantiating the ActionScript 3.0 classes that represent those components + * and assets.

+ * + *

To determine the status of a Loader object, monitor the following + * events that the LoaderInfo object associated with the + * contentLoaderInfo property of the Loader object:

+ * + *
    + *
  • The open event is dispatched when loading begins.
  • + *
  • The ioError or securityError event is + * dispatched if the file cannot be loaded or if an error occured during the + * load process.
  • + *
  • The progress event fires continuously while the file is + * being loaded.
  • + *
  • The complete event is dispatched when a file completes + * downloading, but before the loaded movie clip's methods and properties are + * available.
  • + *
  • The init event is dispatched after the properties and + * methods of the loaded SWF file are accessible, so you can begin + * manipulating the loaded SWF file. This event is dispatched before the + * complete handler. In streaming SWF files, the + * init event can occur significantly earlier than the + * complete event. For most purposes, use the init + * handler.
  • + *
+ */ + constructor(useAssetLibrary:boolean = true, assetLibraryId:string = null) + { + super(); + + this._loadingSessions = new Array(); + this._useAssetLib = useAssetLibrary; + this._assetLibId = assetLibraryId; + + this._onResourceCompleteDelegate = (event:LoaderEvent) => this.onResourceComplete(event); + this._onAssetCompleteDelegate = (event:AssetEvent) => this.onAssetComplete(event); + } + + /** + * Cancels a load() method operation that is currently in + * progress for the Loader instance. + * + */ + public close() + { + if (this._useAssetLib) { + var lib:AssetLibraryBundle; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + lib.stopAllLoadingSessions(); + this._loadingSessions = null; + return + } + var i:number /*int*/; + var length:number /*int*/ = this._loadingSessions.length; + for (i = 0; i < length; i++) { + this.removeListeners(this._loadingSessions[i]); + this._loadingSessions[i].stop(); + this._loadingSessions[i] = null; + } + this._loadingSessions = null; + } + + /** + * Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an + * object that is a child of this Loader object. If you load an animated GIF + * file, only the first frame is displayed. As the Loader object can contain + * only a single child, issuing a subsequent load() request + * terminates the previous request, if still pending, and commences a new + * load. + * + *

Note: In AIR 1.5 and Flash Player 10, the maximum size for a + * loaded image is 8,191 pixels in width or height, and the total number of + * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191 + * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and + * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height + * and 2,880 pixels in width.

+ * + *

A SWF file or image loaded into a Loader object inherits the position, + * rotation, and scale properties of the parent display objects of the Loader + * object.

+ * + *

Use the unload() method to remove movies or images loaded + * with this method, or to cancel a load operation that is in progress.

+ * + *

You can prevent a SWF file from using this method by setting the + * allowNetworking parameter of the the object and + * embed tags in the HTML page that contains the SWF + * content.

+ * + *

When you use this method, consider the Flash Player security model, + * which is described in the Loader class description.

+ * + *

In Flash Player 10 and later, if you use a multipart Content-Type(for + * example "multipart/form-data") that contains an upload(indicated by a + * "filename" parameter in a "content-disposition" header within the POST + * body), the POST operation is subject to the security rules applied to + * uploads:

+ * + *
    + *
  • The POST operation must be performed in response to a user-initiated + * action, such as a mouse click or key press.
  • + *
  • If the POST operation is cross-domain(the POST target is not on the + * same server as the SWF file that is sending the POST request), the target + * server must provide a URL policy file that permits cross-domain + * access.
  • + *
+ * + *

Also, for any multipart Content-Type, the syntax must be valid + * (according to the RFC2046 standard). If the syntax appears to be invalid, + * the POST operation is subject to the security rules applied to + * uploads.

+ * + *

For more information related to security, see the Flash Player + * Developer Center Topic: Security.

+ * + * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG + * file to be loaded. A relative path must be relative to the + * main SWF file. Absolute URLs must include the protocol + * reference, such as http:// or file:///. Filenames cannot + * include disk drive specifications. + * @param context A LoaderContext object, which has properties that define + * the following: + *
    + *
  • Whether or not to check for the existence of a policy + * file upon loading the object
  • + *
  • The ApplicationDomain for the loaded object
  • + *
  • The SecurityDomain for the loaded object
  • + *
  • The ImageDecodingPolicy for the loaded image + * object
  • + *
+ * + *

If the context parameter is not specified + * or refers to a null object, the loaded content remains in + * its own security domain.

+ * + *

For complete details, see the description of the + * properties in the LoaderContext + * class.

+ * @param ns An optional namespace string under which the file is to be + * loaded, allowing the differentiation of two resources with + * identical assets. + * @param parser An optional parser object for translating the loaded data + * into a usable resource. If not provided, AssetLoader will + * attempt to auto-detect the file type. + * @throws IOError The digest property of the + * request object is not + * null. You should only set the + * digest property of a URLRequest + * object when calling the + * URLLoader.load() method when + * loading a SWZ file(an Adobe platform + * component). + * @throws IllegalOperationError If the requestedContentParent + * property of the context + * parameter is a Loader. + * @throws IllegalOperationError If the LoaderContext.parameters + * parameter is set to non-null and has some + * values which are not Strings. + * @throws SecurityError The value of + * LoaderContext.securityDomain + * must be either null or + * SecurityDomain.currentDomain. + * This reflects the fact that you can only + * place the loaded media in its natural + * security sandbox or your own(the latter + * requires a policy file). + * @throws SecurityError Local SWF files may not set + * LoaderContext.securityDomain to anything + * other than null. It is not + * permitted to import non-local media into a + * local sandbox, or to place other local media + * in anything other than its natural sandbox. + * @throws SecurityError You cannot connect to commonly reserved + * ports. For a complete list of blocked ports, + * see "Restricting Networking APIs" in the + * ActionScript 3.0 Developer's Guide. + * @throws SecurityError If the applicationDomain or + * securityDomain properties of + * the context parameter are from + * a disallowed domain. + * @throws SecurityError If a local SWF file is attempting to use the + * securityDomain property of the + * context parameter. + * @event asyncError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and it is not possible to + * add the loaded content as a child to the specified + * DisplayObjectContainer. This could happen if the + * loaded content is a + * flash.display.AVM1Movie or if the + * addChild() call to the + * requestedContentParent throws an error. + * @event complete Dispatched by the contentLoaderInfo + * object when the file has completed loading. The + * complete event is always dispatched + * after the init event. + * @event httpStatus Dispatched by the contentLoaderInfo + * object when a network request is made over HTTP and + * Flash Player can detect the HTTP status code. + * @event init Dispatched by the contentLoaderInfo + * object when the properties and methods of the loaded + * SWF file are accessible. The init event + * always precedes the complete event. + * @event ioError Dispatched by the contentLoaderInfo + * object when an input or output error occurs that + * causes a load operation to fail. + * @event open Dispatched by the contentLoaderInfo + * object when the loading operation starts. + * @event progress Dispatched by the contentLoaderInfo + * object as data is received while load operation + * progresses. + * @event securityError Dispatched by the contentLoaderInfo + * object if a SWF file in the local-with-filesystem + * sandbox attempts to load content in the + * local-with-networking sandbox, or vice versa. + * @event securityError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and the security sandbox + * of the + * LoaderContext.requestedContentParent + * does not have access to the loaded SWF. + * @event unload Dispatched by the contentLoaderInfo + * object when a loaded object is removed. + */ + public load(request:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken + { + var token:AssetLoaderToken; + + if (this._useAssetLib) { + var lib:AssetLibraryBundle; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + token = lib.load(request, context, ns, parser); + } else { + var loader:AssetLoader = new AssetLoader(); + this._loadingSessions.push(loader); + token = loader.load(request, context, ns, parser); + } + + token.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + token.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + token._iLoader._iAddErrorHandler(this.onLoadError); + token._iLoader._iAddParseErrorHandler(this.onParseError); + + return token; + } + + /** + * Loads from binary data stored in a ByteArray object. + * + *

The loadBytes() method is asynchronous. You must wait for + * the "init" event before accessing the properties of a loaded object.

+ * + *

When you use this method, consider the Flash Player security model, + * which is described in the Loader class description.

+ * + * @param bytes A ByteArray object. The contents of the ByteArray can be + * any of the file formats supported by the Loader class: SWF, + * GIF, JPEG, or PNG. + * @param context A LoaderContext object. Only the + * applicationDomain property of the + * LoaderContext object applies; the + * checkPolicyFile and + * securityDomain properties of the LoaderContext + * object do not apply. + * + *

If the context parameter is not specified + * or refers to a null object, the content is loaded into the + * current security domain - a process referred to as "import + * loading" in Flash Player security documentation. + * Specifically, if the loading SWF file trusts the remote SWF + * by incorporating the remote SWF into its code, then the + * loading SWF can import it directly into its own security + * domain.

+ * + *

For more information related to security, see the Flash + * Player Developer Center Topic: Security.

+ * @throws ArgumentError If the length property of the + * ByteArray object is not greater than 0. + * @throws IllegalOperationError If the checkPolicyFile or + * securityDomain property of the + * context parameter are non-null. + * @throws IllegalOperationError If the requestedContentParent + * property of the context + * parameter is a Loader. + * @throws IllegalOperationError If the LoaderContext.parameters + * parameter is set to non-null and has some + * values which are not Strings. + * @throws SecurityError If the provided + * applicationDomain property of + * the context property is from a + * disallowed domain. + * @throws SecurityError You cannot connect to commonly reserved + * ports. For a complete list of blocked ports, + * see "Restricting Networking APIs" in the + * ActionScript 3.0 Developer's Guide. + * @event asyncError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and it is not possible to + * add the loaded content as a child to the specified + * DisplayObjectContainer. This could happen if the + * loaded content is a + * flash.display.AVM1Movie or if the + * addChild() call to the + * requestedContentParent throws an error. + * @event complete Dispatched by the contentLoaderInfo + * object when the operation is complete. The + * complete event is always dispatched + * after the init event. + * @event init Dispatched by the contentLoaderInfo + * object when the properties and methods of the loaded + * data are accessible. The init event + * always precedes the complete event. + * @event ioError Dispatched by the contentLoaderInfo + * object when the runtime cannot parse the data in the + * byte array. + * @event open Dispatched by the contentLoaderInfo + * object when the operation starts. + * @event progress Dispatched by the contentLoaderInfo + * object as data is transfered in memory. + * @event securityError Dispatched by the contentLoaderInfo + * object if the + * LoaderContext.requestedContentParent + * property has been specified and the security sandbox + * of the + * LoaderContext.requestedContentParent + * does not have access to the loaded SWF. + * @event unload Dispatched by the contentLoaderInfo + * object when a loaded object is removed. + */ + public loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken + { + var token:AssetLoaderToken; + + if (this._useAssetLib) { + var lib:AssetLibraryBundle; + lib = AssetLibraryBundle.getInstance(this._assetLibId); + token = lib.loadData(data, context, ns, parser); + } else { + var loader:AssetLoader = new AssetLoader(); + this._loadingSessions.push(loader); + token = loader.loadData(data, '', context, ns, parser); + } + + token.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + token.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + token._iLoader._iAddErrorHandler(this.onLoadError); + token._iLoader._iAddParseErrorHandler(this.onParseError); + + return token; + } + + /** + * Removes a child of this Loader object that was loaded by using the + * load() method. The property of the associated + * LoaderInfo object is reset to null. The child is not + * necessarily destroyed because other objects might have references to it; + * however, it is no longer a child of the Loader object. + * + *

As a best practice, before you unload a child SWF file, you should + * explicitly close any streams in the child SWF file's objects, such as + * LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise, + * audio in the child SWF file might continue to play, even though the child + * SWF file was unloaded. To close streams in the child SWF file, add an + * event listener to the child that listens for the unload + * event. When the parent calls Loader.unload(), the + * unload event is dispatched to the child. The following code + * shows how you might do this:

+ *
 public closeAllStreams(evt:Event) {
+	 * myNetStream.close(); mySound.close(); myNetConnection.close();
+	 * myLocalConnection.close(); }
+	 * myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,
+	 * closeAllStreams);
+ * + */ + public unload() + { + //TODO + } + + /** + * Enables a specific parser. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parserClass The parser class to enable. + * @see away.parsers.Parsers + */ + public static enableParser(parserClass:Object) + { + AssetLoader.enableParser(parserClass); + } + + /** + * Enables a list of parsers. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parserClasses A Vector of parser classes to enable. + * @see away.parsers.Parsers + */ + public static enableParsers(parserClasses:Array) + { + AssetLoader.enableParsers(parserClasses); + } + + + private removeListeners(dispatcher:EventDispatcher) + { + dispatcher.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + dispatcher.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + } + + private onAssetComplete(event:AssetEvent) + { + this.dispatchEvent(event); + } + + /** + * Called when an error occurs during loading + */ + private onLoadError(event:LoaderEvent):boolean + { + if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + } + + /** + * Called when a an error occurs during parsing + */ + private onParseError(event:ParserEvent):boolean + { + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + } + + /** + * Called when the resource and all of its dependencies was retrieved. + */ + private onResourceComplete(event:LoaderEvent) + { + var content:DisplayObject = event.content; + + this._content = content; + + if (content) + this.addChild(content); + + this.dispatchEvent(event); + } +} + +export = Loader; \ No newline at end of file diff --git a/lib/containers/Scene.js b/lib/containers/Scene.js new file mode 100755 index 00000000..a3d29f32 --- /dev/null +++ b/lib/containers/Scene.js @@ -0,0 +1,131 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + +var NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +var Partition = require("awayjs-core/lib/core/partition/Partition"); + +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var SceneEvent = require("awayjs-core/lib/events/SceneEvent"); + +var Scene = (function (_super) { + __extends(Scene, _super); + function Scene() { + _super.call(this); + this._expandedPartitions = new Array(); + this._partitions = new Array(); + this._iCollectionMark = 0; + + this._iSceneGraphRoot = new DisplayObjectContainer(); + + this._iSceneGraphRoot._iSetScene(this); + this._iSceneGraphRoot._iIsRoot = true; + this._iSceneGraphRoot.partition = new Partition(new NodeBase()); + } + Scene.prototype.traversePartitions = function (traverser) { + var i = 0; + var len = this._partitions.length; + + traverser.scene = this; + + while (i < len) { + this._iCollectionMark++; + this._partitions[i++].traverse(traverser); + } + }; + + Object.defineProperty(Scene.prototype, "partition", { + get: function () { + return this._iSceneGraphRoot.partition; + }, + set: function (value) { + this._iSceneGraphRoot.partition = value; + + this.dispatchEvent(new SceneEvent(SceneEvent.PARTITION_CHANGED, this._iSceneGraphRoot)); + }, + enumerable: true, + configurable: true + }); + + + Scene.prototype.contains = function (child) { + return this._iSceneGraphRoot.contains(child); + }; + + Scene.prototype.addChild = function (child) { + return this._iSceneGraphRoot.addChild(child); + }; + + Scene.prototype.removeChild = function (child) { + this._iSceneGraphRoot.removeChild(child); + }; + + Scene.prototype.removeChildAt = function (index) { + this._iSceneGraphRoot.removeChildAt(index); + }; + + Scene.prototype.getChildAt = function (index) { + return this._iSceneGraphRoot.getChildAt(index); + }; + + Object.defineProperty(Scene.prototype, "numChildren", { + get: function () { + return this._iSceneGraphRoot.numChildren; + }, + enumerable: true, + configurable: true + }); + + /** + * @internal + */ + Scene.prototype.iRegisterEntity = function (displayObject) { + if (displayObject.partition) + this.iRegisterPartition(displayObject.partition); + + if (displayObject.isEntity) + displayObject._iAssignedPartition.iMarkForUpdate(displayObject); + }; + + /** + * @internal + */ + Scene.prototype.iRegisterPartition = function (partition) { + this._expandedPartitions.push(partition); + + //ensure duplicates are not found in partitions array + if (this._partitions.indexOf(partition) == -1) + this._partitions.push(partition); + }; + + /** + * @internal + */ + Scene.prototype.iUnregisterEntity = function (displayObject) { + if (displayObject.partition) + this.iUnregisterPartition(displayObject.partition); + + if (displayObject.isEntity) + displayObject._iAssignedPartition.iRemoveEntity(displayObject); + }; + + /** + * @internal + */ + Scene.prototype.iUnregisterPartition = function (partition) { + this._expandedPartitions.splice(this._expandedPartitions.indexOf(partition), 1); + + //if no more partition references found, remove from partitions array + if (this._expandedPartitions.indexOf(partition) == -1) + this._partitions.splice(this._partitions.indexOf(partition), 1); + }; + return Scene; +})(EventDispatcher); + +module.exports = Scene; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lcnMvU2NlbmUudHMiXSwibmFtZXMiOlsiU2NlbmUiLCJTY2VuZS5jb25zdHJ1Y3RvciIsIlNjZW5lLnRyYXZlcnNlUGFydGl0aW9ucyIsIlNjZW5lLmNvbnRhaW5zIiwiU2NlbmUuYWRkQ2hpbGQiLCJTY2VuZS5yZW1vdmVDaGlsZCIsIlNjZW5lLnJlbW92ZUNoaWxkQXQiLCJTY2VuZS5nZXRDaGlsZEF0IiwiU2NlbmUuaVJlZ2lzdGVyRW50aXR5IiwiU2NlbmUuaVJlZ2lzdGVyUGFydGl0aW9uIiwiU2NlbmUuaVVucmVnaXN0ZXJFbnRpdHkiLCJTY2VuZS5pVW5yZWdpc3RlclBhcnRpdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEseUZBQThGOztBQUU5RixpRUFBMEU7QUFDMUUsbUVBQTJFOztBQUUzRSx1RUFBOEU7QUFDOUUsNkRBQXFFOztBQUVyRTtJQUFvQkEsd0JBQWVBO0lBUWxDQTtRQUVDQyxXQUFNQSxLQUFBQSxDQUFDQTtRQVJSQSxLQUFRQSxtQkFBbUJBLEdBQW9CQSxJQUFJQSxLQUFLQSxDQUFZQSxDQUFDQSxDQUFDQTtRQUN0RUEsS0FBUUEsV0FBV0EsR0FBb0JBLElBQUlBLEtBQUtBLENBQVlBLENBQUNBLENBQUNBO1FBRzlEQSxLQUFPQSxnQkFBZ0JBLEdBQUdBLENBQUNBLENBQUNBOztRQU0zQkEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxJQUFJQSxzQkFBc0JBLENBQUNBLENBQUNBOztRQUVwREEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQTtRQUN0Q0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQTtRQUNyQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxTQUFTQSxHQUFHQSxJQUFJQSxTQUFTQSxDQUFDQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUNoRUEsQ0FBQ0E7SUFFREQscUNBQUFBLFVBQTBCQSxTQUFv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QSxJQUFJQSxhQUFhQSxDQUFDQSxRQUFRQTtZQUN6QkEsYUFBYUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxhQUFhQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTtJQUNqRUEsQ0FBQ0E7O0lBS0RWOztNQURHQTsyQ0FDSEEsVUFBNEJBLFNBQW1CQTtRQUU5Q1csSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxtQkFBbUJBLENBQUNBLE9BQU9BLENBQUNBLFNBQVNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBOztRQUUvRUEscUVBQXFFQTtRQUNyRUEsSUFBSUEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxPQUFPQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNwREEsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDbEVBLENBQUNBO0lBQ0ZYLGFBQUNBO0FBQURBLENBQUNBLEVBMUhtQixlQUFlLEVBMEhsQzs7QUFFRCxzQkFBZSxDQUFBIiwiZmlsZSI6ImNvbnRhaW5lcnMvU2NlbmUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlzcGxheU9iamVjdENvbnRhaW5lclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udGFpbmVycy9EaXNwbGF5T2JqZWN0Q29udGFpbmVyXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvRGlzcGxheU9iamVjdFwiKTtcbmltcG9ydCBOb2RlQmFzZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9Ob2RlQmFzZVwiKTtcbmltcG9ydCBQYXJ0aXRpb25cdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGFydGl0aW9uL1BhcnRpdGlvblwiKTtcbmltcG9ydCBJQ29sbGVjdG9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0lDb2xsZWN0b3JcIik7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiKTtcbmltcG9ydCBTY2VuZUV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvU2NlbmVFdmVudFwiKTtcblxuY2xhc3MgU2NlbmUgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXJcbntcblx0cHJpdmF0ZSBfZXhwYW5kZWRQYXJ0aXRpb25zOkFycmF5PFBhcnRpdGlvbj4gPSBuZXcgQXJyYXk8UGFydGl0aW9uPigpO1xuXHRwcml2YXRlIF9wYXJ0aXRpb25zOkFycmF5PFBhcnRpdGlvbj4gPSBuZXcgQXJyYXk8UGFydGl0aW9uPigpO1xuXG5cdHB1YmxpYyBfaVNjZW5lR3JhcGhSb290OkRpc3BsYXlPYmplY3RDb250YWluZXI7XG5cdHB1YmxpYyBfaUNvbGxlY3Rpb25NYXJrID0gMDtcblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5faVNjZW5lR3JhcGhSb290ID0gbmV3IERpc3BsYXlPYmplY3RDb250YWluZXIoKTtcblxuXHRcdHRoaXMuX2lTY2VuZUdyYXBoUm9vdC5faVNldFNjZW5lKHRoaXMpO1xuXHRcdHRoaXMuX2lTY2VuZUdyYXBoUm9vdC5faUlzUm9vdCA9IHRydWU7XG5cdFx0dGhpcy5faVNjZW5lR3JhcGhSb290LnBhcnRpdGlvbiA9IG5ldyBQYXJ0aXRpb24obmV3IE5vZGVCYXNlKCkpO1xuXHR9XG5cblx0cHVibGljIHRyYXZlcnNlUGFydGl0aW9ucyh0cmF2ZXJzZXI6SUNvbGxlY3Rvcilcblx0e1xuXHRcdHZhciBpOm51bWJlciA9IDA7XG5cdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9wYXJ0aXRpb25zLmxlbmd0aDtcblxuXHRcdHRyYXZlcnNlci5zY2VuZSA9IHRoaXM7XG5cblx0XHR3aGlsZSAoaSA8IGxlbikge1xuXHRcdFx0dGhpcy5faUNvbGxlY3Rpb25NYXJrKys7XG5cdFx0XHR0aGlzLl9wYXJ0aXRpb25zW2krK10udHJhdmVyc2UodHJhdmVyc2VyKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHBhcnRpdGlvbigpOlBhcnRpdGlvblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2lTY2VuZUdyYXBoUm9vdC5wYXJ0aXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2V0IHBhcnRpdGlvbih2YWx1ZTpQYXJ0aXRpb24pXG5cdHtcblx0XHR0aGlzLl9pU2NlbmVHcmFwaFJvb3QucGFydGl0aW9uID0gdmFsdWU7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFNjZW5lRXZlbnQoU2NlbmVFdmVudC5QQVJUSVRJT05fQ0hBTkdFRCwgdGhpcy5faVNjZW5lR3JhcGhSb290KSk7XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnMoY2hpbGQ6RGlzcGxheU9iamVjdCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2lTY2VuZUdyYXBoUm9vdC5jb250YWlucyhjaGlsZCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkQ2hpbGQoY2hpbGQ6RGlzcGxheU9iamVjdCk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2lTY2VuZUdyYXBoUm9vdC5hZGRDaGlsZChjaGlsZCk7XG5cdH1cblxuXHRwdWJsaWMgcmVtb3ZlQ2hpbGQoY2hpbGQ6RGlzcGxheU9iamVjdClcblx0e1xuXHRcdHRoaXMuX2lTY2VuZUdyYXBoUm9vdC5yZW1vdmVDaGlsZChjaGlsZCk7XG5cdH1cblxuXHRwdWJsaWMgcmVtb3ZlQ2hpbGRBdChpbmRleDpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9pU2NlbmVHcmFwaFJvb3QucmVtb3ZlQ2hpbGRBdChpbmRleCk7XG5cdH1cblxuXG5cdHB1YmxpYyBnZXRDaGlsZEF0KGluZGV4Om51bWJlcik6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2lTY2VuZUdyYXBoUm9vdC5nZXRDaGlsZEF0KGluZGV4KTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbnVtQ2hpbGRyZW4oKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pU2NlbmVHcmFwaFJvb3QubnVtQ2hpbGRyZW47XG5cdH1cblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgaVJlZ2lzdGVyRW50aXR5KGRpc3BsYXlPYmplY3Q6RGlzcGxheU9iamVjdClcblx0e1xuXHRcdGlmIChkaXNwbGF5T2JqZWN0LnBhcnRpdGlvbilcblx0XHRcdHRoaXMuaVJlZ2lzdGVyUGFydGl0aW9uKGRpc3BsYXlPYmplY3QucGFydGl0aW9uKTtcblxuXHRcdGlmIChkaXNwbGF5T2JqZWN0LmlzRW50aXR5KVxuXHRcdFx0ZGlzcGxheU9iamVjdC5faUFzc2lnbmVkUGFydGl0aW9uLmlNYXJrRm9yVXBkYXRlKGRpc3BsYXlPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGlSZWdpc3RlclBhcnRpdGlvbihwYXJ0aXRpb246UGFydGl0aW9uKVxuXHR7XG5cdFx0dGhpcy5fZXhwYW5kZWRQYXJ0aXRpb25zLnB1c2gocGFydGl0aW9uKTtcblxuXHRcdC8vZW5zdXJlIGR1cGxpY2F0ZXMgYXJlIG5vdCBmb3VuZCBpbiBwYXJ0aXRpb25zIGFycmF5XG5cdFx0aWYgKHRoaXMuX3BhcnRpdGlvbnMuaW5kZXhPZihwYXJ0aXRpb24pID09IC0xKVxuXHRcdFx0dGhpcy5fcGFydGl0aW9ucy5wdXNoKHBhcnRpdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgaVVucmVnaXN0ZXJFbnRpdHkoZGlzcGxheU9iamVjdDpEaXNwbGF5T2JqZWN0KVxuXHR7XG5cdFx0aWYgKGRpc3BsYXlPYmplY3QucGFydGl0aW9uKVxuXHRcdFx0dGhpcy5pVW5yZWdpc3RlclBhcnRpdGlvbihkaXNwbGF5T2JqZWN0LnBhcnRpdGlvbik7XG5cblx0XHRpZiAoZGlzcGxheU9iamVjdC5pc0VudGl0eSlcblx0XHRcdGRpc3BsYXlPYmplY3QuX2lBc3NpZ25lZFBhcnRpdGlvbi5pUmVtb3ZlRW50aXR5KGRpc3BsYXlPYmplY3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGlVbnJlZ2lzdGVyUGFydGl0aW9uKHBhcnRpdGlvbjpQYXJ0aXRpb24pXG5cdHtcblx0XHR0aGlzLl9leHBhbmRlZFBhcnRpdGlvbnMuc3BsaWNlKHRoaXMuX2V4cGFuZGVkUGFydGl0aW9ucy5pbmRleE9mKHBhcnRpdGlvbiksIDEpO1xuXG5cdFx0Ly9pZiBubyBtb3JlIHBhcnRpdGlvbiByZWZlcmVuY2VzIGZvdW5kLCByZW1vdmUgZnJvbSBwYXJ0aXRpb25zIGFycmF5XG5cdFx0aWYgKHRoaXMuX2V4cGFuZGVkUGFydGl0aW9ucy5pbmRleE9mKHBhcnRpdGlvbikgPT0gLTEpXG5cdFx0XHR0aGlzLl9wYXJ0aXRpb25zLnNwbGljZSh0aGlzLl9wYXJ0aXRpb25zLmluZGV4T2YocGFydGl0aW9uKSwgMSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gU2NlbmU7Il19 \ No newline at end of file diff --git a/lib/containers/Scene.ts b/lib/containers/Scene.ts new file mode 100644 index 00000000..3d949e1d --- /dev/null +++ b/lib/containers/Scene.ts @@ -0,0 +1,133 @@ +import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import Partition = require("awayjs-core/lib/core/partition/Partition"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import SceneEvent = require("awayjs-core/lib/events/SceneEvent"); + +class Scene extends EventDispatcher +{ + private _expandedPartitions:Array = new Array(); + private _partitions:Array = new Array(); + + public _iSceneGraphRoot:DisplayObjectContainer; + public _iCollectionMark = 0; + + constructor() + { + super(); + + this._iSceneGraphRoot = new DisplayObjectContainer(); + + this._iSceneGraphRoot._iSetScene(this); + this._iSceneGraphRoot._iIsRoot = true; + this._iSceneGraphRoot.partition = new Partition(new NodeBase()); + } + + public traversePartitions(traverser:ICollector) + { + var i:number = 0; + var len:number = this._partitions.length; + + traverser.scene = this; + + while (i < len) { + this._iCollectionMark++; + this._partitions[i++].traverse(traverser); + } + } + + public get partition():Partition + { + return this._iSceneGraphRoot.partition; + } + + public set partition(value:Partition) + { + this._iSceneGraphRoot.partition = value; + + this.dispatchEvent(new SceneEvent(SceneEvent.PARTITION_CHANGED, this._iSceneGraphRoot)); + } + + public contains(child:DisplayObject):boolean + { + return this._iSceneGraphRoot.contains(child); + } + + public addChild(child:DisplayObject):DisplayObject + { + return this._iSceneGraphRoot.addChild(child); + } + + public removeChild(child:DisplayObject) + { + this._iSceneGraphRoot.removeChild(child); + } + + public removeChildAt(index:number) + { + this._iSceneGraphRoot.removeChildAt(index); + } + + + public getChildAt(index:number):DisplayObject + { + return this._iSceneGraphRoot.getChildAt(index); + } + + public get numChildren():number + { + return this._iSceneGraphRoot.numChildren; + } + + /** + * @internal + */ + public iRegisterEntity(displayObject:DisplayObject) + { + if (displayObject.partition) + this.iRegisterPartition(displayObject.partition); + + if (displayObject.isEntity) + displayObject._iAssignedPartition.iMarkForUpdate(displayObject); + } + + /** + * @internal + */ + public iRegisterPartition(partition:Partition) + { + this._expandedPartitions.push(partition); + + //ensure duplicates are not found in partitions array + if (this._partitions.indexOf(partition) == -1) + this._partitions.push(partition); + } + + /** + * @internal + */ + public iUnregisterEntity(displayObject:DisplayObject) + { + if (displayObject.partition) + this.iUnregisterPartition(displayObject.partition); + + if (displayObject.isEntity) + displayObject._iAssignedPartition.iRemoveEntity(displayObject); + } + + /** + * @internal + */ + public iUnregisterPartition(partition:Partition) + { + this._expandedPartitions.splice(this._expandedPartitions.indexOf(partition), 1); + + //if no more partition references found, remove from partitions array + if (this._expandedPartitions.indexOf(partition) == -1) + this._partitions.splice(this._partitions.indexOf(partition), 1); + } +} + +export = Scene; \ No newline at end of file diff --git a/lib/containers/View.js b/lib/containers/View.js new file mode 100755 index 00000000..f28b0413 --- /dev/null +++ b/lib/containers/View.js @@ -0,0 +1,573 @@ +var Scene = require("awayjs-core/lib/containers/Scene"); + +var RaycastPicker = require("awayjs-core/lib/core/pick/RaycastPicker"); + +var Camera = require("awayjs-core/lib/entities/Camera"); +var CameraEvent = require("awayjs-core/lib/events/CameraEvent"); +var SceneEvent = require("awayjs-core/lib/events/SceneEvent"); +var RendererEvent = require("awayjs-core/lib/events/RendererEvent"); +var MouseManager = require("awayjs-core/lib/managers/MouseManager"); +var getTimer = require("awayjs-core/lib/utils/getTimer"); + +var View = (function () { + /* + *********************************************************************** + * Disabled / Not yet implemented + *********************************************************************** + * + * private _background:away.textures.Texture2DBase; + * + * public _pTouch3DManager:away.managers.Touch3DManager; + * + */ + function View(renderer, scene, camera) { + if (typeof scene === "undefined") { scene = null; } + if (typeof camera === "undefined") { camera = null; } + var _this = this; + this._width = 0; + this._height = 0; + this._time = 0; + this._deltaTime = 0; + this._backgroundColor = 0x000000; + this._backgroundAlpha = 1; + this._viewportDirty = true; + this._scissorDirty = true; + this._mousePicker = new RaycastPicker(); + this._onScenePartitionChangedDelegate = function (event) { + return _this.onScenePartitionChanged(event); + }; + this._onProjectionChangedDelegate = function (event) { + return _this.onProjectionChanged(event); + }; + this._onViewportUpdatedDelegate = function (event) { + return _this.onViewportUpdated(event); + }; + this._onScissorUpdatedDelegate = function (event) { + return _this.onScissorUpdated(event); + }; + + this.scene = scene || new Scene(); + this.camera = camera || new Camera(); + this.renderer = renderer; + + //make sure document border is zero + document.body.style.margin = "0px"; + + this._htmlElement = document.createElement("div"); + this._htmlElement.style.position = "absolute"; + + document.body.appendChild(this._htmlElement); + + this._mouseManager = MouseManager.getInstance(); + this._mouseManager.registerView(this); + // if (this._shareContext) + // this._mouse3DManager.addViewLayer(this); + } + /** + * + * @param e + */ + View.prototype.onScenePartitionChanged = function (event) { + if (this._pCamera) + this._pCamera.partition = this.scene.partition; + }; + + Object.defineProperty(View.prototype, "mouseX", { + get: function () { + return this._pMouseX; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(View.prototype, "mouseY", { + get: function () { + return this._pMouseY; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(View.prototype, "htmlElement", { + /** + * + */ + get: function () { + return this._htmlElement; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(View.prototype, "renderer", { + /** + * + */ + get: function () { + return this._pRenderer; + }, + set: function (value) { + if (this._pRenderer == value) + return; + + if (this._pRenderer) { + this._pRenderer.dispose(); + this._pRenderer.removeEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); + this._pRenderer.removeEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); + } + + this._pRenderer = value; + + this._pRenderer.addEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); + this._pRenderer.addEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); + + //reset entity collector + this._pEntityCollector = this._pRenderer._iCreateEntityCollector(); + + if (this._pCamera) + this._pEntityCollector.camera = this._pCamera; + + //reset back buffer + this._pRenderer._iBackgroundR = ((this._backgroundColor >> 16) & 0xff) / 0xff; + this._pRenderer._iBackgroundG = ((this._backgroundColor >> 8) & 0xff) / 0xff; + this._pRenderer._iBackgroundB = (this._backgroundColor & 0xff) / 0xff; + this._pRenderer._iBackgroundAlpha = this._backgroundAlpha; + this._pRenderer.width = this._width; + this._pRenderer.height = this._height; + this._pRenderer.shareContext = this._shareContext; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "shareContext", { + /** + * + */ + get: function () { + return this._shareContext; + }, + set: function (value) { + if (this._shareContext == value) + return; + + this._shareContext = value; + + if (this._pRenderer) + this._pRenderer.shareContext = this._shareContext; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "backgroundColor", { + /** + * + */ + get: function () { + return this._backgroundColor; + }, + set: function (value) { + if (this._backgroundColor == value) + return; + + this._backgroundColor = value; + + this._pRenderer._iBackgroundR = ((value >> 16) & 0xff) / 0xff; + this._pRenderer._iBackgroundG = ((value >> 8) & 0xff) / 0xff; + this._pRenderer._iBackgroundB = (value & 0xff) / 0xff; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "backgroundAlpha", { + /** + * + * @returns {number} + */ + get: function () { + return this._backgroundAlpha; + }, + /** + * + * @param value + */ + set: function (value) { + if (value > 1) + value = 1; + else if (value < 0) + value = 0; + + if (this._backgroundAlpha == value) + return; + + this._pRenderer._iBackgroundAlpha = this._backgroundAlpha = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "camera", { + /** + * + * @returns {Camera3D} + */ + get: function () { + return this._pCamera; + }, + /** + * Set camera that's used to render the scene for this viewport + */ + set: function (value) { + if (this._pCamera == value) + return; + + if (this._pCamera) + this._pCamera.removeEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); + + this._pCamera = value; + + if (this._pEntityCollector) + this._pEntityCollector.camera = this._pCamera; + + if (this._pScene) + this._pCamera.partition = this._pScene.partition; + + this._pCamera.addEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); + this._scissorDirty = true; + this._viewportDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "scene", { + /** + * + * @returns {away.containers.Scene3D} + */ + get: function () { + return this._pScene; + }, + /** + * Set the scene that's used to render for this viewport + */ + set: function (value) { + if (this._pScene == value) + return; + + if (this._pScene) + this._pScene.removeEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); + + this._pScene = value; + + this._pScene.addEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); + + if (this._pCamera) + this._pCamera.partition = this._pScene.partition; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "deltaTime", { + /** + * + * @returns {number} + */ + get: function () { + return this._deltaTime; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(View.prototype, "width", { + /** + * + */ + get: function () { + return this._width; + }, + set: function (value) { + if (this._width == value) + return; + + this._width = value; + this._aspectRatio = this._width / this._height; + this._pCamera.projection._iAspectRatio = this._aspectRatio; + this._pRenderer.width = value; + this._htmlElement.style.width = value + "px"; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "height", { + /** + * + */ + get: function () { + return this._height; + }, + set: function (value) { + if (this._height == value) + return; + + this._height = value; + this._aspectRatio = this._width / this._height; + this._pCamera.projection._iAspectRatio = this._aspectRatio; + this._pRenderer.height = value; + this._htmlElement.style.height = value + "px"; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "mousePicker", { + /** + * + */ + get: function () { + return this._mousePicker; + }, + set: function (value) { + if (this._mousePicker == value) + return; + + if (value == null) + this._mousePicker = new RaycastPicker(); + else + this._mousePicker = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "x", { + /** + * + */ + get: function () { + return this._pRenderer.x; + }, + set: function (value) { + if (this._pRenderer.x == value) + return; + + this._pRenderer.x == value; + this._htmlElement.style.left = value + "px"; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "y", { + /** + * + */ + get: function () { + return this._pRenderer.y; + }, + set: function (value) { + if (this._pRenderer.y == value) + return; + + this._pRenderer.y == value; + this._htmlElement.style.top = value + "px"; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "visible", { + /** + * + */ + get: function () { + return (this._htmlElement.style.visibility == "visible"); + }, + set: function (value) { + this._htmlElement.style.visibility = value ? "visible" : "hidden"; + //TODO transfer visible property to associated context (if one exists) + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(View.prototype, "renderedFacesCount", { + /** + * + * @returns {number} + */ + get: function () { + return 0; + //return this._pEntityCollector._pNumTriangles;//numTriangles; + }, + enumerable: true, + configurable: true + }); + + /** + * Renders the view. + */ + View.prototype.render = function () { + this.pUpdateTime(); + + //update view and size data + this._pCamera.projection._iAspectRatio = this._aspectRatio; + + if (this._scissorDirty) { + this._scissorDirty = false; + this._pCamera.projection._iUpdateScissorRect(this._pRenderer.scissorRect.x, this._pRenderer.scissorRect.y, this._pRenderer.scissorRect.width, this._pRenderer.scissorRect.height); + } + + if (this._viewportDirty) { + this._viewportDirty = false; + this._pCamera.projection._iUpdateViewport(this._pRenderer.viewPort.x, this._pRenderer.viewPort.y, this._pRenderer.viewPort.width, this._pRenderer.viewPort.height); + } + + // update picking + if (!this._shareContext) { + if (this.forceMouseMove && this._htmlElement == this._mouseManager._iActiveDiv && !this._mouseManager._iUpdateDirty) + this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + + this._mouseManager.fireMouseEvents(this.forceMouseMove); + //_touch3DManager.fireTouchEvents(); + } + + //_touch3DManager.updateCollider(); + //clear entity collector ready for collection + this._pEntityCollector.clear(); + + // collect stuff to render + this._pScene.traversePartitions(this._pEntityCollector); + + //render the contents of the entity collector + this._pRenderer.render(this._pEntityCollector); + }; + + /** + * + */ + View.prototype.pUpdateTime = function () { + var time = getTimer(); + + if (this._time == 0) + this._time = time; + + this._deltaTime = time - this._time; + this._time = time; + }; + + /** + * + */ + View.prototype.dispose = function () { + this._pRenderer.dispose(); + + // TODO: imeplement mouseManager / touch3DManager + this._mouseManager.unregisterView(this); + + //this._touch3DManager.disableTouchListeners(this); + //this._touch3DManager.dispose(); + this._mouseManager = null; + + //this._touch3DManager = null; + this._pRenderer = null; + this._pEntityCollector = null; + }; + + Object.defineProperty(View.prototype, "iEntityCollector", { + /** + * + */ + get: function () { + return this._pEntityCollector; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + View.prototype.onProjectionChanged = function (event) { + this._scissorDirty = true; + this._viewportDirty = true; + }; + + /** + * + */ + View.prototype.onViewportUpdated = function (event) { + this._viewportDirty = true; + }; + + /** + * + */ + View.prototype.onScissorUpdated = function (event) { + this._scissorDirty = true; + }; + + View.prototype.project = function (point3d) { + var v = this._pCamera.project(point3d); + v.x = v.x * this._pRenderer.viewPort.width / 2 + this._width * this._pCamera.projection.originX; + v.y = v.y * this._pRenderer.viewPort.height / 2 + this._height * this._pCamera.projection.originY; + + return v; + }; + + View.prototype.unproject = function (sX, sY, sZ) { + return this._pCamera.unproject(2 * (sX - this._width * this._pCamera.projection.originX) / this._pRenderer.viewPort.width, 2 * (sY - this._height * this._pCamera.projection.originY) / this._pRenderer.viewPort.height, sZ); + }; + + View.prototype.getRay = function (sX, sY, sZ) { + return this._pCamera.getRay((sX * 2 - this._width) / this._width, (sY * 2 - this._height) / this._height, sZ); + }; + + /*TODO: implement Background + public get background():away.textures.Texture2DBase + { + return this._background; + } + */ + /*TODO: implement Background + public set background( value:away.textures.Texture2DBase ) + { + this._background = value; + this._renderer.background = _background; + } + */ + // TODO: required dependency stageGL + View.prototype.updateCollider = function () { + if (!this._shareContext) { + if (this._htmlElement == this._mouseManager._iActiveDiv) + this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + } else { + var collidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + + if (this.layeredView || this._mouseManager._iCollidingObject == null || collidingObject.rayEntryDistance < this._mouseManager._iCollidingObject.rayEntryDistance) + this._mouseManager._iCollidingObject = collidingObject; + } + }; + return View; +})(); + +module.exports = View; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRhaW5lcnMvVmlldy50cyJdLCJuYW1lcyI6WyJWaWV3IiwiVmlldy5jb25zdHJ1Y3RvciIsIlZpZXcub25TY2VuZVBhcnRpdGlvbkNoYW5nZWQiLCJWaWV3LnJlbmRlciIsIlZpZXcucFVwZGF0ZVRpbWUiLCJWaWV3LmRpc3Bvc2UiLCJWaWV3Lm9uUHJvamVjdGlvbkNoYW5nZWQiLCJWaWV3Lm9uVmlld3BvcnRVcGRhdGVkIiwiVmlldy5vblNjaXNzb3JVcGRhdGVkIiwiVmlldy5wcm9qZWN0IiwiVmlldy51bnByb2plY3QiLCJWaWV3LmdldFJheSIsIlZpZXcudXBkYXRlQ29sbGlkZXIiXSwibWFwcGluZ3MiOiJBQUFBLHVEQUFnRTs7QUFPaEUsc0VBQTZFOztBQUk3RSx1REFBZ0U7QUFDaEUsK0RBQXVFO0FBQ3ZFLDZEQUFxRTtBQUNyRSxtRUFBMEU7QUFDMUUsbUVBQTJFO0FBQzNFLHdEQUFpRTs7QUFFakU7SUEwRENBOzs7Ozs7Ozs7TUFER0E7SUFDSEEsY0FBWUEsUUFBa0JBLEVBQUVBLEtBQWtCQSxFQUFFQSxNQUFvQkE7UUFBeENDLG9DQUFBQSxLQUFLQSxHQUFTQSxJQUFJQTtBQUFBQSxRQUFFQSxxQ0FBQUEsTUFBTUEsR0FBVUEsSUFBSUE7QUFBQUEsUUFBeEVBLGlCQXdCQ0E7UUF6RERBLEtBQVFBLE1BQU1BLEdBQVVBLENBQUNBLENBQUNBO1FBQzFCQSxLQUFRQSxPQUFPQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUUzQkEsS0FBUUEsS0FBS0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDekJBLEtBQVFBLFVBQVVBLEdBQVVBLENBQUNBLENBQUNBO1FBQzlCQSxLQUFRQSxnQkFBZ0JBLEdBQVVBLFFBQVFBLENBQUNBO1FBQzNDQSxLQUFRQSxnQkFBZ0JBLEdBQVVBLENBQUNBLENBQUNBO1FBRXBDQSxLQUFRQSxjQUFjQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUN0Q0EsS0FBUUEsYUFBYUEsR0FBV0EsSUFBSUEsQ0FBQ0E7UUFPckNBLEtBQVFBLFlB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Q0EsVUFBVUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxXQUFXQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNqTEE7O1FBRURBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBLENBQUVBO1lBQ3hCQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxLQUFLQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNsS0E7O1FBRURBLGlCQUFpQkE7UUFDakJBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUVBO1lBQ3hCQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxXQUFXQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxhQUFhQTtnQkFDbEhBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLGlCQUFpQkEsR0FBR0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTs7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QUlBLENBQUNBLGFBQWFBLENBQUNBLGlCQUFpQkEsR0FBR0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUM5R0EsS0FBTUE7WUFDTkEsSUFBSUEsZUFBZUEsR0FBc0JBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsSUFBSUEsQ0FBQ0E7O1lBRTlHQSxJQUFJQSxJQUFJQSxDQUFDQSxXQUFXQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxpQkFBaUJBLElBQUlBLElBQUlBLElBQUlBLGVBQWVBLENBQUNBLGdCQUFnQkEsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxnQkFBZ0JBO2dCQUMvSkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxlQUFlQSxDQUFDQTtTQUN4REE7SUFDRkEsQ0FBQ0E7SUFDRlosWUFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxxQkFBYyxDQUFBIiwiZmlsZSI6ImNvbnRhaW5lcnMvVmlldy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTY2VuZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1NjZW5lXCIpO1xuaW1wb3J0IE1hdHJpeDNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBQb2ludFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUG9pbnRcIik7XG5pbXBvcnQgUmVjdGFuZ2xlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUmVjdGFuZ2xlXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBJUGlja2VyXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGljay9JUGlja2VyXCIpO1xuaW1wb3J0IFBpY2tpbmdDb2xsaXNpb25WT1x0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BpY2svUGlja2luZ0NvbGxpc2lvblZPXCIpO1xuaW1wb3J0IFJheWNhc3RQaWNrZXJcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BpY2svUmF5Y2FzdFBpY2tlclwiKTtcbmltcG9ydCBJUmVuZGVyZXJcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcmVuZGVyL0lSZW5kZXJlclwiKTtcbmltcG9ydCBDU1NSZW5kZXJlckJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9DU1NSZW5kZXJlckJhc2VcIik7XG5pbXBvcnQgSUNvbGxlY3Rvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9JQ29sbGVjdG9yXCIpO1xuaW1wb3J0IENhbWVyYVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9DYW1lcmFcIik7XG5pbXBvcnQgQ2FtZXJhRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9DYW1lcmFFdmVudFwiKTtcbmltcG9ydCBTY2VuZUV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvU2NlbmVFdmVudFwiKTtcbmltcG9ydCBSZW5kZXJlckV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL1JlbmRlcmVyRXZlbnRcIik7XG5pbXBvcnQgTW91c2VNYW5hZ2VyXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYW5hZ2Vycy9Nb3VzZU1hbmFnZXJcIik7XG5pbXBvcnQgZ2V0VGltZXJcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvZ2V0VGltZXJcIik7XG5cbmNsYXNzIFZpZXdcbntcblxuXHQvKlxuXHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXHQgKiBEZXZlbG9wbWVudCBOb3Rlc1xuXHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXHQgKlxuXHQgKiBTaGFyZUNvbnRleHQgICAgIC0gdGhpcyBpcyBub3QgYmVpbmcgdXNlZCBhdCB0aGUgbW9tZW50IGludGVncmF0aW9uIHdpdGggb3RoZXIgZnJhbWV3b3JrcyBpcyBub3QgeWV0IGltcGxlbWVudGVkIG9yIHRlc3RlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgYW5kICggX2xvY2FsUG9zIC8gX2dsb2JhbFBvcyApIHBvc2l0aW9uIG9mIHZpZXdwb3J0IGFyZSB0aGUgc2FtZSBmb3IgdGhlIG1vbWVudFxuXHQgKlxuXHQgKiBCYWNrZ3JvdW5kXG5cdCAqICAgICAgICAgICAgICAgICAgLSB0aGlzIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgaW5jbHVkZWQgaW4gb3VyIHRlc3RzIGFuZCBpcyBjdXJyZW50bHkgZGlzYWJsZWRcblx0ICpcblx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cdCAqL1xuXG5cdC8vIFByb3RlY3RlZFxuXHRwdWJsaWMgX3BTY2VuZTpTY2VuZTtcblx0cHVibGljIF9wQ2FtZXJhOkNhbWVyYTtcblx0cHVibGljIF9wRW50aXR5Q29sbGVjdG9yOklDb2xsZWN0b3I7XG5cdHB1YmxpYyBfcFJlbmRlcmVyOklSZW5kZXJlcjtcblxuXHQvLyBQcml2YXRlXG5cdHByaXZhdGUgX2FzcGVjdFJhdGlvOm51bWJlcjtcblx0cHJpdmF0ZSBfd2lkdGg6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfaGVpZ2h0Om51bWJlciA9IDA7XG5cblx0cHJpdmF0ZSBfdGltZTpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9kZWx0YVRpbWU6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yOm51bWJlciA9IDB4MDAwMDAwO1xuXHRwcml2YXRlIF9iYWNrZ3JvdW5kQWxwaGE6bnVtYmVyID0gMTtcblxuXHRwcml2YXRlIF92aWV3cG9ydERpcnR5OmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9zY2lzc29yRGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHJpdmF0ZSBfb25TY2VuZVBhcnRpdGlvbkNoYW5nZWREZWxlZ2F0ZTooZXZlbnQ6U2NlbmVFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25Qcm9qZWN0aW9uQ2hhbmdlZERlbGVnYXRlOihldmVudDpDYW1lcmFFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25WaWV3cG9ydFVwZGF0ZWREZWxlZ2F0ZTooZXZlbnQ6UmVuZGVyZXJFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25TY2lzc29yVXBkYXRlZERlbGVnYXRlOihldmVudDpSZW5kZXJlckV2ZW50KSA9PiB2b2lkO1xuXHRwcml2YXRlIF9tb3VzZU1hbmFnZXI6TW91c2VNYW5hZ2VyO1xuXHRwcml2YXRlIF9tb3VzZVBpY2tlcjpJUGlja2VyID0gbmV3IFJheWNhc3RQaWNrZXIoKTtcblxuXHRwcml2YXRlIF9odG1sRWxlbWVudDpIVE1MRGl2RWxlbWVudDtcblx0cHJpdmF0ZSBfc2hhcmVDb250ZXh0OmJvb2xlYW47XG5cdHB1YmxpYyBfcE1vdXNlWDpudW1iZXI7XG5cdHB1YmxpYyBfcE1vdXNlWTpudW1iZXI7XG5cblx0Lypcblx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cdCAqIERpc2FibGVkIC8gTm90IHlldCBpbXBsZW1lbnRlZFxuXHQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblx0ICpcblx0ICogcHJpdmF0ZSBfYmFja2dyb3VuZDphd2F5LnRleHR1cmVzLlRleHR1cmUyREJhc2U7XG5cdCAqXG5cdCAqIHB1YmxpYyBfcFRvdWNoM0RNYW5hZ2VyOmF3YXkubWFuYWdlcnMuVG91Y2gzRE1hbmFnZXI7XG5cdCAqXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihyZW5kZXJlcjpJUmVuZGVyZXIsIHNjZW5lOlNjZW5lID0gbnVsbCwgY2FtZXJhOkNhbWVyYSA9IG51bGwpXG5cdHtcblx0XHR0aGlzLl9vblNjZW5lUGFydGl0aW9uQ2hhbmdlZERlbGVnYXRlID0gKGV2ZW50OlNjZW5lRXZlbnQpID0+IHRoaXMub25TY2VuZVBhcnRpdGlvbkNoYW5nZWQoZXZlbnQpO1xuXHRcdHRoaXMuX29uUHJvamVjdGlvbkNoYW5nZWREZWxlZ2F0ZSA9IChldmVudDpDYW1lcmFFdmVudCkgPT4gdGhpcy5vblByb2plY3Rpb25DaGFuZ2VkKGV2ZW50KTtcblx0XHR0aGlzLl9vblZpZXdwb3J0VXBkYXRlZERlbGVnYXRlID0gKGV2ZW50OlJlbmRlcmVyRXZlbnQpID0+IHRoaXMub25WaWV3cG9ydFVwZGF0ZWQoZXZlbnQpO1xuXHRcdHRoaXMuX29uU2Npc3NvclVwZGF0ZWREZWxlZ2F0ZSA9IChldmVudDpSZW5kZXJlckV2ZW50KSA9PiB0aGlzLm9uU2Npc3NvclVwZGF0ZWQoZXZlbnQpO1xuXG5cdFx0dGhpcy5zY2VuZSA9IHNjZW5lIHx8IG5ldyBTY2VuZSgpO1xuXHRcdHRoaXMuY2FtZXJhID0gY2FtZXJhIHx8IG5ldyBDYW1lcmEoKTtcblx0XHR0aGlzLnJlbmRlcmVyID0gcmVuZGVyZXI7XG5cblx0XHQvL21ha2Ugc3VyZSBkb2N1bWVudCBib3JkZXIgaXMgemVyb1xuXHRcdGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gXCIwcHhcIjtcblxuXHRcdHRoaXMuX2h0bWxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblx0XHR0aGlzLl9odG1sRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcblxuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5faHRtbEVsZW1lbnQpO1xuXG5cdFx0dGhpcy5fbW91c2VNYW5hZ2VyID0gTW91c2VNYW5hZ2VyLmdldEluc3RhbmNlKCk7XG5cdFx0dGhpcy5fbW91c2VNYW5hZ2VyLnJlZ2lzdGVyVmlldyh0aGlzKTtcblxuLy9cdFx0XHRpZiAodGhpcy5fc2hhcmVDb250ZXh0KVxuLy9cdFx0XHRcdHRoaXMuX21vdXNlM0RNYW5hZ2VyLmFkZFZpZXdMYXllcih0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZVxuXHQgKi9cblx0cHJpdmF0ZSBvblNjZW5lUGFydGl0aW9uQ2hhbmdlZChldmVudDpTY2VuZUV2ZW50KVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BDYW1lcmEpXG5cdFx0XHR0aGlzLl9wQ2FtZXJhLnBhcnRpdGlvbiA9IHRoaXMuc2NlbmUucGFydGl0aW9uO1xuXHR9XG5cblx0cHVibGljIGxheWVyZWRWaWV3OmJvb2xlYW47IC8vVE9ETzogc29tZXRoaW5nIHRvIGVuYWJsZSB0aGlzIGNvcnJlY3RseVxuXG5cdHB1YmxpYyBnZXQgbW91c2VYKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcE1vdXNlWDtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbW91c2VZKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcE1vdXNlWTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBodG1sRWxlbWVudCgpOkhUTUxEaXZFbGVtZW50XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faHRtbEVsZW1lbnQ7XG5cdH1cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHJlbmRlcmVyKCk6SVJlbmRlcmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFJlbmRlcmVyO1xuXHR9XG5cblx0cHVibGljIHNldCByZW5kZXJlcih2YWx1ZTpJUmVuZGVyZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fcFJlbmRlcmVyID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMuX3BSZW5kZXJlcikge1xuXHRcdFx0dGhpcy5fcFJlbmRlcmVyLmRpc3Bvc2UoKTtcblx0XHRcdHRoaXMuX3BSZW5kZXJlci5yZW1vdmVFdmVudExpc3RlbmVyKFJlbmRlcmVyRXZlbnQuVklFV1BPUlRfVVBEQVRFRCwgdGhpcy5fb25WaWV3cG9ydFVwZGF0ZWREZWxlZ2F0ZSk7XG5cdFx0XHR0aGlzLl9wUmVuZGVyZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihSZW5kZXJlckV2ZW50LlNDSVNTT1JfVVBEQVRFRCwgdGhpcy5fb25TY2lzc29yVXBkYXRlZERlbGVnYXRlKTtcblx0XHR9XG5cblx0XHR0aGlzLl9wUmVuZGVyZXIgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BSZW5kZXJlci5hZGRFdmVudExpc3RlbmVyKFJlbmRlcmVyRXZlbnQuVklFV1BPUlRfVVBEQVRFRCwgdGhpcy5fb25WaWV3cG9ydFVwZGF0ZWREZWxlZ2F0ZSk7XG5cdFx0dGhpcy5fcFJlbmRlcmVyLmFkZEV2ZW50TGlzdGVuZXIoUmVuZGVyZXJFdmVudC5TQ0lTU09SX1VQREFURUQsIHRoaXMuX29uU2Npc3NvclVwZGF0ZWREZWxlZ2F0ZSk7XG5cblx0XHQvL3Jlc2V0IGVudGl0eSBjb2xsZWN0b3Jcblx0XHR0aGlzLl9wRW50aXR5Q29sbGVjdG9yID0gdGhpcy5fcFJlbmRlcmVyLl9pQ3JlYXRlRW50aXR5Q29sbGVjdG9yKCk7XG5cblx0XHRpZiAodGhpcy5fcENhbWVyYSlcblx0XHRcdHRoaXMuX3BFbnRpdHlDb2xsZWN0b3IuY2FtZXJhID0gdGhpcy5fcENhbWVyYTtcblxuXHRcdC8vcmVzZXQgYmFjayBidWZmZXJcblx0XHR0aGlzLl9wUmVuZGVyZXIuX2lCYWNrZ3JvdW5kUiA9ICgodGhpcy5fYmFja2dyb3VuZENvbG9yID4+IDE2KSAmIDB4ZmYpLzB4ZmY7XG5cdFx0dGhpcy5fcFJlbmRlcmVyLl9pQmFja2dyb3VuZEcgPSAoKHRoaXMuX2JhY2tncm91bmRDb2xvciA+PiA4KSAmIDB4ZmYpLzB4ZmY7XG5cdFx0dGhpcy5fcFJlbmRlcmVyLl9pQmFja2dyb3VuZEIgPSAodGhpcy5fYmFja2dyb3VuZENvbG9yICYgMHhmZikvMHhmZjtcblx0XHR0aGlzLl9wUmVuZGVyZXIuX2lCYWNrZ3JvdW5kQWxwaGEgPSB0aGlzLl9iYWNrZ3JvdW5kQWxwaGE7XG5cdFx0dGhpcy5fcFJlbmRlcmVyLndpZHRoID0gdGhpcy5fd2lkdGg7XG5cdFx0dGhpcy5fcFJlbmRlcmVyLmhlaWdodCA9IHRoaXMuX2hlaWdodDtcblx0XHR0aGlzLl9wUmVuZGVyZXIuc2hhcmVDb250ZXh0ID0gdGhpcy5fc2hhcmVDb250ZXh0O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNoYXJlQ29udGV4dCgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9zaGFyZUNvbnRleHQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHNoYXJlQ29udGV4dCh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NoYXJlQ29udGV4dCA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3NoYXJlQ29udGV4dCA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuX3BSZW5kZXJlcilcblx0XHRcdHRoaXMuX3BSZW5kZXJlci5zaGFyZUNvbnRleHQgPSB0aGlzLl9zaGFyZUNvbnRleHQ7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yO1xuXHR9XG5cblx0cHVibGljIHNldCBiYWNrZ3JvdW5kQ29sb3IodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2JhY2tncm91bmRDb2xvciA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2JhY2tncm91bmRDb2xvciA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcFJlbmRlcmVyLl9pQmFja2dyb3VuZFIgPSAoKHZhbHVlID4+IDE2KSAmIDB4ZmYpLzB4ZmY7XG5cdFx0dGhpcy5fcFJlbmRlcmVyLl9pQmFja2dyb3VuZEcgPSAoKHZhbHVlID4+IDgpICYgMHhmZikvMHhmZjtcblx0XHR0aGlzLl9wUmVuZGVyZXIuX2lCYWNrZ3JvdW5kQiA9ICh2YWx1ZSAmIDB4ZmYpLzB4ZmY7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge251bWJlcn1cblx0ICovXG5cdHB1YmxpYyBnZXQgYmFja2dyb3VuZEFscGhhKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYmFja2dyb3VuZEFscGhhO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKi9cblx0cHVibGljIHNldCBiYWNrZ3JvdW5kQWxwaGEodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHZhbHVlID4gMSlcblx0XHRcdHZhbHVlID0gMTtcblx0XHRlbHNlIGlmICh2YWx1ZSA8IDApXG5cdFx0XHR2YWx1ZSA9IDA7XG5cblx0XHRpZiAodGhpcy5fYmFja2dyb3VuZEFscGhhID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcFJlbmRlcmVyLl9pQmFja2dyb3VuZEFscGhhID0gdGhpcy5fYmFja2dyb3VuZEFscGhhID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge0NhbWVyYTNEfVxuXHQgKi9cblx0cHVibGljIGdldCBjYW1lcmEoKTpDYW1lcmFcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wQ2FtZXJhO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCBjYW1lcmEgdGhhdCdzIHVzZWQgdG8gcmVuZGVyIHRoZSBzY2VuZSBmb3IgdGhpcyB2aWV3cG9ydFxuXHQgKi9cblx0cHVibGljIHNldCBjYW1lcmEodmFsdWU6Q2FtZXJhKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BDYW1lcmEgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5fcENhbWVyYSlcblx0XHRcdHRoaXMuX3BDYW1lcmEucmVtb3ZlRXZlbnRMaXN0ZW5lcihDYW1lcmFFdmVudC5QUk9KRUNUSU9OX0NIQU5HRUQsIHRoaXMuX29uUHJvamVjdGlvbkNoYW5nZWREZWxlZ2F0ZSk7XG5cblx0XHR0aGlzLl9wQ2FtZXJhID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5fcEVudGl0eUNvbGxlY3Rvcilcblx0XHRcdHRoaXMuX3BFbnRpdHlDb2xsZWN0b3IuY2FtZXJhID0gdGhpcy5fcENhbWVyYTtcblxuXHRcdGlmICh0aGlzLl9wU2NlbmUpXG5cdFx0XHR0aGlzLl9wQ2FtZXJhLnBhcnRpdGlvbiA9IHRoaXMuX3BTY2VuZS5wYXJ0aXRpb247XG5cblx0XHR0aGlzLl9wQ2FtZXJhLmFkZEV2ZW50TGlzdGVuZXIoQ2FtZXJhRXZlbnQuUFJPSkVDVElPTl9DSEFOR0VELCB0aGlzLl9vblByb2plY3Rpb25DaGFuZ2VkRGVsZWdhdGUpO1xuXHRcdHRoaXMuX3NjaXNzb3JEaXJ0eSA9IHRydWU7XG5cdFx0dGhpcy5fdmlld3BvcnREaXJ0eSA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge2F3YXkuY29udGFpbmVycy5TY2VuZTNEfVxuXHQgKi9cblx0cHVibGljIGdldCBzY2VuZSgpOlNjZW5lXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFNjZW5lO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldCB0aGUgc2NlbmUgdGhhdCdzIHVzZWQgdG8gcmVuZGVyIGZvciB0aGlzIHZpZXdwb3J0XG5cdCAqL1xuXHRwdWJsaWMgc2V0IHNjZW5lKHZhbHVlOlNjZW5lKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BTY2VuZSA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLl9wU2NlbmUpXG5cdFx0XHR0aGlzLl9wU2NlbmUucmVtb3ZlRXZlbnRMaXN0ZW5lcihTY2VuZUV2ZW50LlBBUlRJVElPTl9DSEFOR0VELCB0aGlzLl9vblNjZW5lUGFydGl0aW9uQ2hhbmdlZERlbGVnYXRlKTtcblxuXHRcdHRoaXMuX3BTY2VuZSA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcFNjZW5lLmFkZEV2ZW50TGlzdGVuZXIoU2NlbmVFdmVudC5QQVJUSVRJT05fQ0hBTkdFRCwgdGhpcy5fb25TY2VuZVBhcnRpdGlvbkNoYW5nZWREZWxlZ2F0ZSk7XG5cblx0XHRpZiAodGhpcy5fcENhbWVyYSlcblx0XHRcdHRoaXMuX3BDYW1lcmEucGFydGl0aW9uID0gdGhpcy5fcFNjZW5lLnBhcnRpdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfVxuXHQgKi9cblx0cHVibGljIGdldCBkZWx0YVRpbWUoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kZWx0YVRpbWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgd2lkdGgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl93aWR0aDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgd2lkdGgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3dpZHRoID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fd2lkdGggPSB2YWx1ZTtcblx0XHR0aGlzLl9hc3BlY3RSYXRpbyA9IHRoaXMuX3dpZHRoL3RoaXMuX2hlaWdodDtcblx0XHR0aGlzLl9wQ2FtZXJhLnByb2plY3Rpb24uX2lBc3BlY3RSYXRpbyA9IHRoaXMuX2FzcGVjdFJhdGlvO1xuXHRcdHRoaXMuX3BSZW5kZXJlci53aWR0aCA9IHZhbHVlO1xuXHRcdHRoaXMuX2h0bWxFbGVtZW50LnN0eWxlLndpZHRoID0gdmFsdWUgKyBcInB4XCI7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgaGVpZ2h0KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIHNldCBoZWlnaHQodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2hlaWdodCA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2hlaWdodCA9IHZhbHVlO1xuXHRcdHRoaXMuX2FzcGVjdFJhdGlvID0gdGhpcy5fd2lkdGgvdGhpcy5faGVpZ2h0O1xuXHRcdHRoaXMuX3BDYW1lcmEucHJvamVjdGlvbi5faUFzcGVjdFJhdGlvID0gdGhpcy5fYXNwZWN0UmF0aW87XG5cdFx0dGhpcy5fcFJlbmRlcmVyLmhlaWdodCA9IHZhbHVlO1xuXHRcdHRoaXMuX2h0bWxFbGVtZW50LnN0eWxlLmhlaWdodCA9IHZhbHVlICsgXCJweFwiO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1vdXNlUGlja2VyKCk6SVBpY2tlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21vdXNlUGlja2VyO1xuXHR9XG5cblx0cHVibGljIHNldCBtb3VzZVBpY2tlcih2YWx1ZTpJUGlja2VyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX21vdXNlUGlja2VyID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHZhbHVlID09IG51bGwpXG5cdFx0XHR0aGlzLl9tb3VzZVBpY2tlciA9IG5ldyBSYXljYXN0UGlja2VyKCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5fbW91c2VQaWNrZXIgPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB4KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFJlbmRlcmVyLng7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BSZW5kZXJlci54ID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcFJlbmRlcmVyLnggPT0gdmFsdWU7XG5cdFx0dGhpcy5faHRtbEVsZW1lbnQuc3R5bGUubGVmdCA9IHZhbHVlICsgXCJweFwiO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHkoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wUmVuZGVyZXIueTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgeSh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fcFJlbmRlcmVyLnkgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9wUmVuZGVyZXIueSA9PSB2YWx1ZTtcblx0XHR0aGlzLl9odG1sRWxlbWVudC5zdHlsZS50b3AgPSB2YWx1ZSArIFwicHhcIjtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB2aXNpYmxlKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLl9odG1sRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID09IFwidmlzaWJsZVwiKTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgdmlzaWJsZSh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0dGhpcy5faHRtbEVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9IHZhbHVlPyBcInZpc2libGVcIiA6IFwiaGlkZGVuXCI7XG5cdFx0Ly9UT0RPIHRyYW5zZmVyIHZpc2libGUgcHJvcGVydHkgdG8gYXNzb2NpYXRlZCBjb250ZXh0IChpZiBvbmUgZXhpc3RzKVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHJlbmRlcmVkRmFjZXNDb3VudCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIDA7IC8vVE9ET1xuXHRcdC8vcmV0dXJuIHRoaXMuX3BFbnRpdHlDb2xsZWN0b3IuX3BOdW1UcmlhbmdsZXM7Ly9udW1UcmlhbmdsZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmVuZGVycyB0aGUgdmlldy5cblx0ICovXG5cdHB1YmxpYyByZW5kZXIoKVxuXHR7XG5cdFx0dGhpcy5wVXBkYXRlVGltZSgpO1xuXG5cdFx0Ly91cGRhdGUgdmlldyBhbmQgc2l6ZSBkYXRhXG5cdFx0dGhpcy5fcENhbWVyYS5wcm9qZWN0aW9uLl9pQXNwZWN0UmF0aW8gPSB0aGlzLl9hc3BlY3RSYXRpbztcblxuXHRcdGlmICh0aGlzLl9zY2lzc29yRGlydHkpIHtcblx0XHRcdHRoaXMuX3NjaXNzb3JEaXJ0eSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5fcENhbWVyYS5wcm9qZWN0aW9uLl9pVXBkYXRlU2Npc3NvclJlY3QodGhpcy5fcFJlbmRlcmVyLnNjaXNzb3JSZWN0LngsIHRoaXMuX3BSZW5kZXJlci5zY2lzc29yUmVjdC55LCB0aGlzLl9wUmVuZGVyZXIuc2Npc3NvclJlY3Qud2lkdGgsIHRoaXMuX3BSZW5kZXJlci5zY2lzc29yUmVjdC5oZWlnaHQpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl92aWV3cG9ydERpcnR5KSB7XG5cdFx0XHR0aGlzLl92aWV3cG9ydERpcnR5ID0gZmFsc2U7XG5cdFx0XHR0aGlzLl9wQ2FtZXJhLnByb2plY3Rpb24uX2lVcGRhdGVWaWV3cG9ydCh0aGlzLl9wUmVuZGVyZXIudmlld1BvcnQueCwgdGhpcy5fcFJlbmRlcmVyLnZpZXdQb3J0LnksIHRoaXMuX3BSZW5kZXJlci52aWV3UG9ydC53aWR0aCwgdGhpcy5fcFJlbmRlcmVyLnZpZXdQb3J0LmhlaWdodCk7XG5cdFx0fVxuXG5cdFx0Ly8gdXBkYXRlIHBpY2tpbmdcblx0XHRpZiAoIXRoaXMuX3NoYXJlQ29udGV4dCkge1xuXHRcdFx0aWYgKHRoaXMuZm9yY2VNb3VzZU1vdmUgJiYgdGhpcy5faHRtbEVsZW1lbnQgPT0gdGhpcy5fbW91c2VNYW5hZ2VyLl9pQWN0aXZlRGl2ICYmICF0aGlzLl9tb3VzZU1hbmFnZXIuX2lVcGRhdGVEaXJ0eSlcblx0XHRcdFx0dGhpcy5fbW91c2VNYW5hZ2VyLl9pQ29sbGlkaW5nT2JqZWN0ID0gdGhpcy5tb3VzZVBpY2tlci5nZXRWaWV3Q29sbGlzaW9uKHRoaXMuX3BNb3VzZVgsIHRoaXMuX3BNb3VzZVksIHRoaXMpO1xuXG5cdFx0XHR0aGlzLl9tb3VzZU1hbmFnZXIuZmlyZU1vdXNlRXZlbnRzKHRoaXMuZm9yY2VNb3VzZU1vdmUpO1xuXHRcdFx0Ly9fdG91Y2gzRE1hbmFnZXIuZmlyZVRvdWNoRXZlbnRzKCk7XG5cdFx0fVxuXHRcdC8vX3RvdWNoM0RNYW5hZ2VyLnVwZGF0ZUNvbGxpZGVyKCk7XG5cblx0XHQvL2NsZWFyIGVudGl0eSBjb2xsZWN0b3IgcmVhZHkgZm9yIGNvbGxlY3Rpb25cblx0XHR0aGlzLl9wRW50aXR5Q29sbGVjdG9yLmNsZWFyKCk7XG5cblx0XHQvLyBjb2xsZWN0IHN0dWZmIHRvIHJlbmRlclxuXHRcdHRoaXMuX3BTY2VuZS50cmF2ZXJzZVBhcnRpdGlvbnModGhpcy5fcEVudGl0eUNvbGxlY3Rvcik7XG5cblx0XHQvL3JlbmRlciB0aGUgY29udGVudHMgb2YgdGhlIGVudGl0eSBjb2xsZWN0b3Jcblx0XHR0aGlzLl9wUmVuZGVyZXIucmVuZGVyKHRoaXMuX3BFbnRpdHlDb2xsZWN0b3IpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgcFVwZGF0ZVRpbWUoKTp2b2lkXG5cdHtcblx0XHR2YXIgdGltZTpudW1iZXIgPSBnZXRUaW1lcigpO1xuXG5cdFx0aWYgKHRoaXMuX3RpbWUgPT0gMClcblx0XHRcdHRoaXMuX3RpbWUgPSB0aW1lO1xuXG5cdFx0dGhpcy5fZGVsdGFUaW1lID0gdGltZSAtIHRoaXMuX3RpbWU7XG5cdFx0dGhpcy5fdGltZSA9IHRpbWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBkaXNwb3NlKClcblx0e1xuXHRcdHRoaXMuX3BSZW5kZXJlci5kaXNwb3NlKCk7XG5cblx0XHQvLyBUT0RPOiBpbWVwbGVtZW50IG1vdXNlTWFuYWdlciAvIHRvdWNoM0RNYW5hZ2VyXG5cdFx0dGhpcy5fbW91c2VNYW5hZ2VyLnVucmVnaXN0ZXJWaWV3KHRoaXMpO1xuXG5cdFx0Ly90aGlzLl90b3VjaDNETWFuYWdlci5kaXNhYmxlVG91Y2hMaXN0ZW5lcnModGhpcyk7XG5cdFx0Ly90aGlzLl90b3VjaDNETWFuYWdlci5kaXNwb3NlKCk7XG5cblx0XHR0aGlzLl9tb3VzZU1hbmFnZXIgPSBudWxsO1xuXHRcdC8vdGhpcy5fdG91Y2gzRE1hbmFnZXIgPSBudWxsO1xuXG5cdFx0dGhpcy5fcFJlbmRlcmVyID0gbnVsbDtcblx0XHR0aGlzLl9wRW50aXR5Q29sbGVjdG9yID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBpRW50aXR5Q29sbGVjdG9yKCk6SUNvbGxlY3RvclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BFbnRpdHlDb2xsZWN0b3I7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHByaXZhdGUgb25Qcm9qZWN0aW9uQ2hhbmdlZChldmVudDpDYW1lcmFFdmVudClcblx0e1xuXHRcdHRoaXMuX3NjaXNzb3JEaXJ0eSA9IHRydWU7XG5cdFx0dGhpcy5fdmlld3BvcnREaXJ0eSA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHByaXZhdGUgb25WaWV3cG9ydFVwZGF0ZWQoZXZlbnQ6UmVuZGVyZXJFdmVudClcblx0e1xuXHRcdHRoaXMuX3ZpZXdwb3J0RGlydHkgPSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIG9uU2Npc3NvclVwZGF0ZWQoZXZlbnQ6UmVuZGVyZXJFdmVudClcblx0e1xuXHRcdHRoaXMuX3NjaXNzb3JEaXJ0eSA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgcHJvamVjdChwb2ludDNkOlZlY3RvcjNEKTpWZWN0b3IzRFxuXHR7XG5cdFx0dmFyIHY6VmVjdG9yM0QgPSB0aGlzLl9wQ2FtZXJhLnByb2plY3QocG9pbnQzZCk7XG5cdFx0di54ID0gdi54KnRoaXMuX3BSZW5kZXJlci52aWV3UG9ydC53aWR0aC8yICsgdGhpcy5fd2lkdGgqdGhpcy5fcENhbWVyYS5wcm9qZWN0aW9uLm9yaWdpblg7XG5cdFx0di55ID0gdi55KnRoaXMuX3BSZW5kZXJlci52aWV3UG9ydC5oZWlnaHQvMiArIHRoaXMuX2hlaWdodCp0aGlzLl9wQ2FtZXJhLnByb2plY3Rpb24ub3JpZ2luWTtcblxuXHRcdHJldHVybiB2O1xuXHR9XG5cblx0cHVibGljIHVucHJvamVjdChzWDpudW1iZXIsIHNZOm51bWJlciwgc1o6bnVtYmVyKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BDYW1lcmEudW5wcm9qZWN0KDIqKHNYIC0gdGhpcy5fd2lkdGgqdGhpcy5fcENhbWVyYS5wcm9qZWN0aW9uLm9yaWdpblgpL3RoaXMuX3BSZW5kZXJlci52aWV3UG9ydC53aWR0aCwgMiooc1kgLSB0aGlzLl9oZWlnaHQqdGhpcy5fcENhbWVyYS5wcm9qZWN0aW9uLm9yaWdpblkpL3RoaXMuX3BSZW5kZXJlci52aWV3UG9ydC5oZWlnaHQsIHNaKTtcblxuXHR9XG5cblx0cHVibGljIGdldFJheShzWDpudW1iZXIsIHNZOm51bWJlciwgc1o6bnVtYmVyKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BDYW1lcmEuZ2V0UmF5KChzWCoyIC0gdGhpcy5fd2lkdGgpL3RoaXMuX3dpZHRoLCAoc1kqMiAtIHRoaXMuX2hlaWdodCkvdGhpcy5faGVpZ2h0LCBzWik7XG5cdH1cblxuXHQvKiBUT0RPOiBpbXBsZW1lbnQgVG91Y2gzRE1hbmFnZXJcblx0IHB1YmxpYyBnZXQgdG91Y2hQaWNrZXIoKTpJUGlja2VyXG5cdCB7XG5cdCByZXR1cm4gdGhpcy5fdG91Y2gzRE1hbmFnZXIudG91Y2hQaWNrZXI7XG5cdCB9XG5cdCAqL1xuXHQvKiBUT0RPOiBpbXBsZW1lbnQgVG91Y2gzRE1hbmFnZXJcblx0IHB1YmxpYyBzZXQgdG91Y2hQaWNrZXIoIHZhbHVlOklQaWNrZXIpXG5cdCB7XG5cdCB0aGlzLl90b3VjaDNETWFuYWdlci50b3VjaFBpY2tlciA9IHZhbHVlO1xuXHQgfVxuXHQgKi9cblxuXHRwdWJsaWMgZm9yY2VNb3VzZU1vdmU6Ym9vbGVhbjtcblxuXHQvKlRPRE86IGltcGxlbWVudCBCYWNrZ3JvdW5kXG5cdCBwdWJsaWMgZ2V0IGJhY2tncm91bmQoKTphd2F5LnRleHR1cmVzLlRleHR1cmUyREJhc2Vcblx0IHtcblx0IHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kO1xuXHQgfVxuXHQgKi9cblx0LypUT0RPOiBpbXBsZW1lbnQgQmFja2dyb3VuZFxuXHQgcHVibGljIHNldCBiYWNrZ3JvdW5kKCB2YWx1ZTphd2F5LnRleHR1cmVzLlRleHR1cmUyREJhc2UgKVxuXHQge1xuXHQgdGhpcy5fYmFja2dyb3VuZCA9IHZhbHVlO1xuXHQgdGhpcy5fcmVuZGVyZXIuYmFja2dyb3VuZCA9IF9iYWNrZ3JvdW5kO1xuXHQgfVxuXHQgKi9cblxuXHQvLyBUT0RPOiByZXF1aXJlZCBkZXBlbmRlbmN5IHN0YWdlR0xcblx0cHVibGljIHVwZGF0ZUNvbGxpZGVyKClcblx0e1xuXHRcdGlmICghdGhpcy5fc2hhcmVDb250ZXh0KSB7XG5cdFx0XHRpZiAodGhpcy5faHRtbEVsZW1lbnQgPT0gdGhpcy5fbW91c2VNYW5hZ2VyLl9pQWN0aXZlRGl2KVxuXHRcdFx0XHR0aGlzLl9tb3VzZU1hbmFnZXIuX2lDb2xsaWRpbmdPYmplY3QgPSB0aGlzLm1vdXNlUGlja2VyLmdldFZpZXdDb2xsaXNpb24odGhpcy5fcE1vdXNlWCwgdGhpcy5fcE1vdXNlWSwgdGhpcyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBjb2xsaWRpbmdPYmplY3Q6UGlja2luZ0NvbGxpc2lvblZPID0gdGhpcy5tb3VzZVBpY2tlci5nZXRWaWV3Q29sbGlzaW9uKHRoaXMuX3BNb3VzZVgsIHRoaXMuX3BNb3VzZVksIHRoaXMpO1xuXG5cdFx0XHRpZiAodGhpcy5sYXllcmVkVmlldyB8fCB0aGlzLl9tb3VzZU1hbmFnZXIuX2lDb2xsaWRpbmdPYmplY3QgPT0gbnVsbCB8fCBjb2xsaWRpbmdPYmplY3QucmF5RW50cnlEaXN0YW5jZSA8IHRoaXMuX21vdXNlTWFuYWdlci5faUNvbGxpZGluZ09iamVjdC5yYXlFbnRyeURpc3RhbmNlKVxuXHRcdFx0XHR0aGlzLl9tb3VzZU1hbmFnZXIuX2lDb2xsaWRpbmdPYmplY3QgPSBjb2xsaWRpbmdPYmplY3Q7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCA9IFZpZXc7Il19 \ No newline at end of file diff --git a/lib/containers/View.ts b/lib/containers/View.ts new file mode 100644 index 00000000..ddc2bbb8 --- /dev/null +++ b/lib/containers/View.ts @@ -0,0 +1,595 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Point = require("awayjs-core/lib/core/geom/Point"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IPicker = require("awayjs-core/lib/core/pick/IPicker"); +import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); +import RaycastPicker = require("awayjs-core/lib/core/pick/RaycastPicker"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import CSSRendererBase = require("awayjs-core/lib/core/render/CSSRendererBase"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import CameraEvent = require("awayjs-core/lib/events/CameraEvent"); +import SceneEvent = require("awayjs-core/lib/events/SceneEvent"); +import RendererEvent = require("awayjs-core/lib/events/RendererEvent"); +import MouseManager = require("awayjs-core/lib/managers/MouseManager"); +import getTimer = require("awayjs-core/lib/utils/getTimer"); + +class View +{ + + /* + ************************************************************************************************************************* + * Development Notes + ************************************************************************************************************************* + * + * ShareContext - this is not being used at the moment integration with other frameworks is not yet implemented or tested + * and ( _localPos / _globalPos ) position of viewport are the same for the moment + * + * Background + * - this is currently not being included in our tests and is currently disabled + * + ************************************************************************************************************************** + */ + + // Protected + public _pScene:Scene; + public _pCamera:Camera; + public _pEntityCollector:ICollector; + public _pRenderer:IRenderer; + + // Private + private _aspectRatio:number; + private _width:number = 0; + private _height:number = 0; + + private _time:number = 0; + private _deltaTime:number = 0; + private _backgroundColor:number = 0x000000; + private _backgroundAlpha:number = 1; + + private _viewportDirty:boolean = true; + private _scissorDirty:boolean = true; + + private _onScenePartitionChangedDelegate:(event:SceneEvent) => void; + private _onProjectionChangedDelegate:(event:CameraEvent) => void; + private _onViewportUpdatedDelegate:(event:RendererEvent) => void; + private _onScissorUpdatedDelegate:(event:RendererEvent) => void; + private _mouseManager:MouseManager; + private _mousePicker:IPicker = new RaycastPicker(); + + private _htmlElement:HTMLDivElement; + private _shareContext:boolean; + public _pMouseX:number; + public _pMouseY:number; + + /* + *********************************************************************** + * Disabled / Not yet implemented + *********************************************************************** + * + * private _background:away.textures.Texture2DBase; + * + * public _pTouch3DManager:away.managers.Touch3DManager; + * + */ + constructor(renderer:IRenderer, scene:Scene = null, camera:Camera = null) + { + this._onScenePartitionChangedDelegate = (event:SceneEvent) => this.onScenePartitionChanged(event); + this._onProjectionChangedDelegate = (event:CameraEvent) => this.onProjectionChanged(event); + this._onViewportUpdatedDelegate = (event:RendererEvent) => this.onViewportUpdated(event); + this._onScissorUpdatedDelegate = (event:RendererEvent) => this.onScissorUpdated(event); + + this.scene = scene || new Scene(); + this.camera = camera || new Camera(); + this.renderer = renderer; + + //make sure document border is zero + document.body.style.margin = "0px"; + + this._htmlElement = document.createElement("div"); + this._htmlElement.style.position = "absolute"; + + document.body.appendChild(this._htmlElement); + + this._mouseManager = MouseManager.getInstance(); + this._mouseManager.registerView(this); + +// if (this._shareContext) +// this._mouse3DManager.addViewLayer(this); + } + + /** + * + * @param e + */ + private onScenePartitionChanged(event:SceneEvent) + { + if (this._pCamera) + this._pCamera.partition = this.scene.partition; + } + + public layeredView:boolean; //TODO: something to enable this correctly + + public get mouseX():number + { + return this._pMouseX; + } + + public get mouseY():number + { + return this._pMouseY; + } + + /** + * + */ + public get htmlElement():HTMLDivElement + { + return this._htmlElement; + } + /** + * + */ + public get renderer():IRenderer + { + return this._pRenderer; + } + + public set renderer(value:IRenderer) + { + if (this._pRenderer == value) + return; + + if (this._pRenderer) { + this._pRenderer.dispose(); + this._pRenderer.removeEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); + this._pRenderer.removeEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); + } + + this._pRenderer = value; + + this._pRenderer.addEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); + this._pRenderer.addEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); + + //reset entity collector + this._pEntityCollector = this._pRenderer._iCreateEntityCollector(); + + if (this._pCamera) + this._pEntityCollector.camera = this._pCamera; + + //reset back buffer + this._pRenderer._iBackgroundR = ((this._backgroundColor >> 16) & 0xff)/0xff; + this._pRenderer._iBackgroundG = ((this._backgroundColor >> 8) & 0xff)/0xff; + this._pRenderer._iBackgroundB = (this._backgroundColor & 0xff)/0xff; + this._pRenderer._iBackgroundAlpha = this._backgroundAlpha; + this._pRenderer.width = this._width; + this._pRenderer.height = this._height; + this._pRenderer.shareContext = this._shareContext; + } + + /** + * + */ + public get shareContext():boolean + { + return this._shareContext; + } + + public set shareContext(value:boolean) + { + if (this._shareContext == value) + return; + + this._shareContext = value; + + if (this._pRenderer) + this._pRenderer.shareContext = this._shareContext; + } + + /** + * + */ + public get backgroundColor():number + { + return this._backgroundColor; + } + + public set backgroundColor(value:number) + { + if (this._backgroundColor == value) + return; + + this._backgroundColor = value; + + this._pRenderer._iBackgroundR = ((value >> 16) & 0xff)/0xff; + this._pRenderer._iBackgroundG = ((value >> 8) & 0xff)/0xff; + this._pRenderer._iBackgroundB = (value & 0xff)/0xff; + } + + /** + * + * @returns {number} + */ + public get backgroundAlpha():number + { + return this._backgroundAlpha; + } + + /** + * + * @param value + */ + public set backgroundAlpha(value:number) + { + if (value > 1) + value = 1; + else if (value < 0) + value = 0; + + if (this._backgroundAlpha == value) + return; + + this._pRenderer._iBackgroundAlpha = this._backgroundAlpha = value; + } + + /** + * + * @returns {Camera3D} + */ + public get camera():Camera + { + return this._pCamera; + } + + /** + * Set camera that's used to render the scene for this viewport + */ + public set camera(value:Camera) + { + if (this._pCamera == value) + return; + + if (this._pCamera) + this._pCamera.removeEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); + + this._pCamera = value; + + if (this._pEntityCollector) + this._pEntityCollector.camera = this._pCamera; + + if (this._pScene) + this._pCamera.partition = this._pScene.partition; + + this._pCamera.addEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); + this._scissorDirty = true; + this._viewportDirty = true; + } + + /** + * + * @returns {away.containers.Scene3D} + */ + public get scene():Scene + { + return this._pScene; + } + + /** + * Set the scene that's used to render for this viewport + */ + public set scene(value:Scene) + { + if (this._pScene == value) + return; + + if (this._pScene) + this._pScene.removeEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); + + this._pScene = value; + + this._pScene.addEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); + + if (this._pCamera) + this._pCamera.partition = this._pScene.partition; + } + + /** + * + * @returns {number} + */ + public get deltaTime():number + { + return this._deltaTime; + } + + /** + * + */ + public get width():number + { + return this._width; + } + + public set width(value:number) + { + if (this._width == value) + return; + + this._width = value; + this._aspectRatio = this._width/this._height; + this._pCamera.projection._iAspectRatio = this._aspectRatio; + this._pRenderer.width = value; + this._htmlElement.style.width = value + "px"; + } + + /** + * + */ + public get height():number + { + return this._height; + } + + public set height(value:number) + { + if (this._height == value) + return; + + this._height = value; + this._aspectRatio = this._width/this._height; + this._pCamera.projection._iAspectRatio = this._aspectRatio; + this._pRenderer.height = value; + this._htmlElement.style.height = value + "px"; + } + + /** + * + */ + public get mousePicker():IPicker + { + return this._mousePicker; + } + + public set mousePicker(value:IPicker) + { + if (this._mousePicker == value) + return; + + if (value == null) + this._mousePicker = new RaycastPicker(); + else + this._mousePicker = value; + } + + /** + * + */ + public get x():number + { + return this._pRenderer.x; + } + + public set x(value:number) + { + if (this._pRenderer.x == value) + return; + + this._pRenderer.x == value; + this._htmlElement.style.left = value + "px"; + } + + /** + * + */ + public get y():number + { + return this._pRenderer.y; + } + + public set y(value:number) + { + if (this._pRenderer.y == value) + return; + + this._pRenderer.y == value; + this._htmlElement.style.top = value + "px"; + } + + /** + * + */ + public get visible():boolean + { + return (this._htmlElement.style.visibility == "visible"); + } + + public set visible(value:boolean) + { + this._htmlElement.style.visibility = value? "visible" : "hidden"; + //TODO transfer visible property to associated context (if one exists) + } + + /** + * + * @returns {number} + */ + public get renderedFacesCount():number + { + return 0; //TODO + //return this._pEntityCollector._pNumTriangles;//numTriangles; + } + + /** + * Renders the view. + */ + public render() + { + this.pUpdateTime(); + + //update view and size data + this._pCamera.projection._iAspectRatio = this._aspectRatio; + + if (this._scissorDirty) { + this._scissorDirty = false; + this._pCamera.projection._iUpdateScissorRect(this._pRenderer.scissorRect.x, this._pRenderer.scissorRect.y, this._pRenderer.scissorRect.width, this._pRenderer.scissorRect.height); + } + + if (this._viewportDirty) { + this._viewportDirty = false; + this._pCamera.projection._iUpdateViewport(this._pRenderer.viewPort.x, this._pRenderer.viewPort.y, this._pRenderer.viewPort.width, this._pRenderer.viewPort.height); + } + + // update picking + if (!this._shareContext) { + if (this.forceMouseMove && this._htmlElement == this._mouseManager._iActiveDiv && !this._mouseManager._iUpdateDirty) + this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + + this._mouseManager.fireMouseEvents(this.forceMouseMove); + //_touch3DManager.fireTouchEvents(); + } + //_touch3DManager.updateCollider(); + + //clear entity collector ready for collection + this._pEntityCollector.clear(); + + // collect stuff to render + this._pScene.traversePartitions(this._pEntityCollector); + + //render the contents of the entity collector + this._pRenderer.render(this._pEntityCollector); + } + + /** + * + */ + public pUpdateTime():void + { + var time:number = getTimer(); + + if (this._time == 0) + this._time = time; + + this._deltaTime = time - this._time; + this._time = time; + } + + /** + * + */ + public dispose() + { + this._pRenderer.dispose(); + + // TODO: imeplement mouseManager / touch3DManager + this._mouseManager.unregisterView(this); + + //this._touch3DManager.disableTouchListeners(this); + //this._touch3DManager.dispose(); + + this._mouseManager = null; + //this._touch3DManager = null; + + this._pRenderer = null; + this._pEntityCollector = null; + } + + /** + * + */ + public get iEntityCollector():ICollector + { + return this._pEntityCollector; + } + + /** + * + */ + private onProjectionChanged(event:CameraEvent) + { + this._scissorDirty = true; + this._viewportDirty = true; + } + + /** + * + */ + private onViewportUpdated(event:RendererEvent) + { + this._viewportDirty = true; + } + + /** + * + */ + private onScissorUpdated(event:RendererEvent) + { + this._scissorDirty = true; + } + + public project(point3d:Vector3D):Vector3D + { + var v:Vector3D = this._pCamera.project(point3d); + v.x = v.x*this._pRenderer.viewPort.width/2 + this._width*this._pCamera.projection.originX; + v.y = v.y*this._pRenderer.viewPort.height/2 + this._height*this._pCamera.projection.originY; + + return v; + } + + public unproject(sX:number, sY:number, sZ:number):Vector3D + { + return this._pCamera.unproject(2*(sX - this._width*this._pCamera.projection.originX)/this._pRenderer.viewPort.width, 2*(sY - this._height*this._pCamera.projection.originY)/this._pRenderer.viewPort.height, sZ); + + } + + public getRay(sX:number, sY:number, sZ:number):Vector3D + { + return this._pCamera.getRay((sX*2 - this._width)/this._width, (sY*2 - this._height)/this._height, sZ); + } + + /* TODO: implement Touch3DManager + public get touchPicker():IPicker + { + return this._touch3DManager.touchPicker; + } + */ + /* TODO: implement Touch3DManager + public set touchPicker( value:IPicker) + { + this._touch3DManager.touchPicker = value; + } + */ + + public forceMouseMove:boolean; + + /*TODO: implement Background + public get background():away.textures.Texture2DBase + { + return this._background; + } + */ + /*TODO: implement Background + public set background( value:away.textures.Texture2DBase ) + { + this._background = value; + this._renderer.background = _background; + } + */ + + // TODO: required dependency stageGL + public updateCollider() + { + if (!this._shareContext) { + if (this._htmlElement == this._mouseManager._iActiveDiv) + this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + } else { + var collidingObject:PickingCollisionVO = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); + + if (this.layeredView || this._mouseManager._iCollidingObject == null || collidingObject.rayEntryDistance < this._mouseManager._iCollidingObject.rayEntryDistance) + this._mouseManager._iCollidingObject = collidingObject; + } + } +} + +export = View; \ No newline at end of file diff --git a/lib/controllers/ControllerBase.js b/lib/controllers/ControllerBase.js new file mode 100755 index 00000000..c508a155 --- /dev/null +++ b/lib/controllers/ControllerBase.js @@ -0,0 +1,71 @@ +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var ControllerBase = (function () { + function ControllerBase(targetObject) { + if (typeof targetObject === "undefined") { targetObject = null; } + this._pAutoUpdate = true; + this.targetObject = targetObject; + } + ControllerBase.prototype.pNotifyUpdate = function () { + if (this._pTargetObject && this._pTargetObject._iAssignedPartition && this._pAutoUpdate) { + this._pTargetObject._iAssignedPartition.iMarkForUpdate(this._pTargetObject); + } + }; + + Object.defineProperty(ControllerBase.prototype, "targetObject", { + get: function () { + return this._pTargetObject; + }, + set: function (val) { + if (this._pTargetObject == val) { + return; + } + + if (this._pTargetObject && this._pAutoUpdate) { + this._pTargetObject._iController = null; + } + this._pTargetObject = val; + + if (this._pTargetObject && this._pAutoUpdate) { + this._pTargetObject._iController = this; + } + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ControllerBase.prototype, "autoUpdate", { + get: function () { + return this._pAutoUpdate; + }, + set: function (val) { + if (this._pAutoUpdate == val) { + return; + } + this._pAutoUpdate = val; + + if (this._pTargetObject) { + if (this._pTargetObject) { + this._pTargetObject._iController = this; + } else { + this._pTargetObject._iController = null; + } + } + }, + enumerable: true, + configurable: true + }); + + + ControllerBase.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + throw new AbstractMethodError(); + }; + return ControllerBase; +})(); + +module.exports = ControllerBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRyb2xsZXJzL0NvbnRyb2xsZXJCYXNlLnRzIl0sIm5hbWVzIjpbIkNvbnRyb2xsZXJCYXNlIiwiQ29udHJvbGxlckJhc2UuY29uc3RydWN0b3IiLCJDb250cm9sbGVyQmFzZS5wTm90aWZ5VXBkYXRlIiwiQ29udHJvbGxlckJhc2UudXBkYXRlIl0sIm1hcHBpbmdzIjoiQUFBQSwrRUFDb0Y7O0FBRXBGO0lBTUNBLHdCQUFZQSxZQUFpQ0E7UUFBakNDLDJDQUFBQSxZQUFZQSxHQUFpQkEsSUFBSUE7QUFBQUEsUUFIN0NBLEtBQU9BLFlBQVlBLEdBQVdBLElBQUlBLENBQUNBO1FBS2xDQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxZQUFZQTtJQUNqQ0EsQ0FBQ0E7SUFFREQseUNBQUFBO1FBRUNFLElBQUlBLElBQUlBLENBQUNBLGNBQWNBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLG1CQUFtQkEsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBRUE7WUFDeEZBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0E7U0FDM0VBO0lBQ0ZBLENBQUNBOztJQUVERjtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxjQUFjQTtRQUMzQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBd0JBLEdBQWlCQTtZQUV4Q0EsSUFBSUEsSUFBSUEsQ0FBQ0EsY0FBY0EsSUFBSUEsR0FBR0EsQ0FBRUE7Z0JBQy9CQSxNQUFPQTthQUNQQTs7WUFFREEsSUFBSUEsSUFBSUEsQ0FBQ0EsY0FBY0EsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBRUE7Z0JBQzdDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQTthQUN2Q0E7WUFDREEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsR0FBR0E7O1lBRXpCQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFFQTtnQkFDN0NBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFlBQVlBLEdBQUdBLElBQUlBO2FBQ3ZDQTtZQUNEQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTtRQUNyQkEsQ0FBQ0E7Ozs7QUFqQkFBOztJQW1CREE7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUE7UUFDekJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXNCQSxHQUFXQTtZQUVoQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUEsSUFBSUEsR0FBR0EsQ0FBRUE7Z0JBQzdCQSxNQUFPQTthQUNQQTtZQUNEQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxHQUFHQTs7WUFFdkJBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBLENBQUVBO2dCQUN4QkEsSUFBSUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBRUE7b0JBQ3hCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQTtpQkFDdkNBLEtBQU1BO29CQUNOQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQTtpQkFDdkNBO2FBQ0RBO1FBQ0ZBLENBQUNBOzs7O0FBaEJBQTs7SUFrQkRBLGtDQUFBQSxVQUFjQSxXQUEwQkE7UUFBMUJHLDBDQUFBQSxXQUFXQSxHQUFXQSxJQUFJQTtBQUFBQSxRQUV2Q0EsTUFBTUEsSUFBSUEsbUJBQW1CQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7SUFDRkgsc0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsK0JBQXdCLENBQUEiLCJmaWxlIjoiY29udHJvbGxlcnMvQ29udHJvbGxlckJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlzcGxheU9iamVjdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvRGlzcGxheU9iamVjdFwiKTtcbmltcG9ydCBBYnN0cmFjdE1ldGhvZEVycm9yXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQWJzdHJhY3RNZXRob2RFcnJvclwiKTtcblxuY2xhc3MgQ29udHJvbGxlckJhc2VcbntcblxuXHRwdWJsaWMgX3BBdXRvVXBkYXRlOmJvb2xlYW4gPSB0cnVlO1xuXHRwdWJsaWMgX3BUYXJnZXRPYmplY3Q6RGlzcGxheU9iamVjdDtcblxuXHRjb25zdHJ1Y3Rvcih0YXJnZXRPYmplY3Q6RGlzcGxheU9iamVjdCA9IG51bGwpXG5cdHtcblx0XHR0aGlzLnRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdDtcblx0fVxuXG5cdHB1YmxpYyBwTm90aWZ5VXBkYXRlKClcblx0e1xuXHRcdGlmICh0aGlzLl9wVGFyZ2V0T2JqZWN0ICYmIHRoaXMuX3BUYXJnZXRPYmplY3QuX2lBc3NpZ25lZFBhcnRpdGlvbiAmJiB0aGlzLl9wQXV0b1VwZGF0ZSkge1xuXHRcdFx0dGhpcy5fcFRhcmdldE9iamVjdC5faUFzc2lnbmVkUGFydGl0aW9uLmlNYXJrRm9yVXBkYXRlKHRoaXMuX3BUYXJnZXRPYmplY3QpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBnZXQgdGFyZ2V0T2JqZWN0KCk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BUYXJnZXRPYmplY3Q7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHRhcmdldE9iamVjdCh2YWw6RGlzcGxheU9iamVjdClcblx0e1xuXHRcdGlmICh0aGlzLl9wVGFyZ2V0T2JqZWN0ID09IHZhbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9wVGFyZ2V0T2JqZWN0ICYmIHRoaXMuX3BBdXRvVXBkYXRlKSB7XG5cdFx0XHR0aGlzLl9wVGFyZ2V0T2JqZWN0Ll9pQ29udHJvbGxlciA9IG51bGw7XG5cdFx0fVxuXHRcdHRoaXMuX3BUYXJnZXRPYmplY3QgPSB2YWw7XG5cblx0XHRpZiAodGhpcy5fcFRhcmdldE9iamVjdCAmJiB0aGlzLl9wQXV0b1VwZGF0ZSkge1xuXHRcdFx0dGhpcy5fcFRhcmdldE9iamVjdC5faUNvbnRyb2xsZXIgPSB0aGlzO1xuXHRcdH1cblx0XHR0aGlzLnBOb3RpZnlVcGRhdGUoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgYXV0b1VwZGF0ZSgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wQXV0b1VwZGF0ZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgYXV0b1VwZGF0ZSh2YWw6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9wQXV0b1VwZGF0ZSA9PSB2YWwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5fcEF1dG9VcGRhdGUgPSB2YWw7XG5cblx0XHRpZiAodGhpcy5fcFRhcmdldE9iamVjdCkge1xuXHRcdFx0aWYgKHRoaXMuX3BUYXJnZXRPYmplY3QpIHtcblx0XHRcdFx0dGhpcy5fcFRhcmdldE9iamVjdC5faUNvbnRyb2xsZXIgPSB0aGlzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fcFRhcmdldE9iamVjdC5faUNvbnRyb2xsZXIgPSBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyB1cGRhdGUoaW50ZXJwb2xhdGU6Ym9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG59XG5cbmV4cG9ydCA9IENvbnRyb2xsZXJCYXNlOyJdfQ== \ No newline at end of file diff --git a/lib/controllers/ControllerBase.ts b/lib/controllers/ControllerBase.ts new file mode 100644 index 00000000..3e80959c --- /dev/null +++ b/lib/controllers/ControllerBase.ts @@ -0,0 +1,71 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +class ControllerBase +{ + + public _pAutoUpdate:boolean = true; + public _pTargetObject:DisplayObject; + + constructor(targetObject:DisplayObject = null) + { + this.targetObject = targetObject; + } + + public pNotifyUpdate() + { + if (this._pTargetObject && this._pTargetObject._iAssignedPartition && this._pAutoUpdate) { + this._pTargetObject._iAssignedPartition.iMarkForUpdate(this._pTargetObject); + } + } + + public get targetObject():DisplayObject + { + return this._pTargetObject; + } + + public set targetObject(val:DisplayObject) + { + if (this._pTargetObject == val) { + return; + } + + if (this._pTargetObject && this._pAutoUpdate) { + this._pTargetObject._iController = null; + } + this._pTargetObject = val; + + if (this._pTargetObject && this._pAutoUpdate) { + this._pTargetObject._iController = this; + } + this.pNotifyUpdate(); + } + + public get autoUpdate():boolean + { + return this._pAutoUpdate; + } + + public set autoUpdate(val:boolean) + { + if (this._pAutoUpdate == val) { + return; + } + this._pAutoUpdate = val; + + if (this._pTargetObject) { + if (this._pTargetObject) { + this._pTargetObject._iController = this; + } else { + this._pTargetObject._iController = null; + } + } + } + + public update(interpolate:boolean = true) + { + throw new AbstractMethodError(); + } +} + +export = ControllerBase; \ No newline at end of file diff --git a/lib/controllers/FirstPersonController.js b/lib/controllers/FirstPersonController.js new file mode 100755 index 00000000..e518ed0a --- /dev/null +++ b/lib/controllers/FirstPersonController.js @@ -0,0 +1,274 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); + +var MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); + +/** +* Extended camera used to hover round a specified target object. +* +* @see away3d.containers.View3D +*/ +var FirstPersonController = (function (_super) { + __extends(FirstPersonController, _super); + /** + * Creates a new HoverController object. + */ + function FirstPersonController(targetObject, panAngle, tiltAngle, minTiltAngle, maxTiltAngle, steps, wrapPanAngle) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof panAngle === "undefined") { panAngle = 0; } + if (typeof tiltAngle === "undefined") { tiltAngle = 90; } + if (typeof minTiltAngle === "undefined") { minTiltAngle = -90; } + if (typeof maxTiltAngle === "undefined") { maxTiltAngle = 90; } + if (typeof steps === "undefined") { steps = 8; } + if (typeof wrapPanAngle === "undefined") { wrapPanAngle = false; } + _super.call(this, targetObject); + this._iCurrentPanAngle = 0; + this._iCurrentTiltAngle = 90; + this._panAngle = 0; + this._tiltAngle = 90; + this._minTiltAngle = -90; + this._maxTiltAngle = 90; + this._steps = 8; + this._walkIncrement = 0; + this._strafeIncrement = 0; + this._wrapPanAngle = false; + this.fly = false; + + this.panAngle = panAngle; + this.tiltAngle = tiltAngle; + this.minTiltAngle = minTiltAngle; + this.maxTiltAngle = maxTiltAngle; + this.steps = steps; + this.wrapPanAngle = wrapPanAngle; + + //values passed in contrustor are applied immediately + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + Object.defineProperty(FirstPersonController.prototype, "steps", { + /** + * Fractional step taken each time the hover() method is called. Defaults to 8. + * + * Affects the speed at which the tiltAngle and panAngle resolve to their targets. + * + * @see #tiltAngle + * @see #panAngle + */ + get: function () { + return this._steps; + }, + set: function (val) { + val = (val < 1) ? 1 : val; + + if (this._steps == val) + return; + + this._steps = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "panAngle", { + /** + * Rotation of the camera in degrees around the y axis. Defaults to 0. + */ + get: function () { + return this._panAngle; + }, + set: function (val) { + if (this._panAngle == val) + return; + + this._panAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "tiltAngle", { + /** + * Elevation angle of the camera in degrees. Defaults to 90. + */ + get: function () { + return this._tiltAngle; + }, + set: function (val) { + val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); + + if (this._tiltAngle == val) + return; + + this._tiltAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "minTiltAngle", { + /** + * Minimum bounds for the tiltAngle. Defaults to -90. + * + * @see #tiltAngle + */ + get: function () { + return this._minTiltAngle; + }, + set: function (val) { + if (this._minTiltAngle == val) + return; + + this._minTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "maxTiltAngle", { + /** + * Maximum bounds for the tiltAngle. Defaults to 90. + * + * @see #tiltAngle + */ + get: function () { + return this._maxTiltAngle; + }, + set: function (val) { + if (this._maxTiltAngle == val) + return; + + this._maxTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(FirstPersonController.prototype, "wrapPanAngle", { + /** + * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. + */ + get: function () { + return this._wrapPanAngle; + }, + set: function (val) { + if (this._wrapPanAngle == val) + return; + + this._wrapPanAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + /** + * Updates the current tilt angle and pan angle values. + * + * Values are calculated using the defined tiltAngle, panAngle and steps variables. + * + * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. + * + * @see #tiltAngle + * @see #panAngle + * @see #steps + */ + FirstPersonController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { + this.pNotifyUpdate(); + + if (this._wrapPanAngle) { + if (this._panAngle < 0) { + this._iCurrentPanAngle += this._panAngle % 360 + 360 - this._panAngle; + this._panAngle = this._panAngle % 360 + 360; + } else { + this._iCurrentPanAngle += this._panAngle % 360 - this._panAngle; + this._panAngle = this._panAngle % 360; + } + + while (this._panAngle - this._iCurrentPanAngle < -180) + this._iCurrentPanAngle -= 360; + + while (this._panAngle - this._iCurrentPanAngle > 180) + this._iCurrentPanAngle += 360; + } + + if (interpolate) { + this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle) / (this.steps + 1); + this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle) / (this.steps + 1); + } else { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + + //snap coords if angle differences are close + if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + } + + this.targetObject.rotationX = this._iCurrentTiltAngle; + this.targetObject.rotationY = this._iCurrentPanAngle; + + if (this._walkIncrement) { + if (this.fly) { + this.targetObject.transform.moveForward(this._walkIncrement); + } else { + this.targetObject.x += this._walkIncrement * Math.sin(this._panAngle * MathConsts.DEGREES_TO_RADIANS); + this.targetObject.z += this._walkIncrement * Math.cos(this._panAngle * MathConsts.DEGREES_TO_RADIANS); + } + this._walkIncrement = 0; + } + + if (this._strafeIncrement) { + this.targetObject.transform.moveRight(this._strafeIncrement); + this._strafeIncrement = 0; + } + }; + + FirstPersonController.prototype.incrementWalk = function (val) { + if (val == 0) + return; + + this._walkIncrement += val; + + this.pNotifyUpdate(); + }; + + FirstPersonController.prototype.incrementStrafe = function (val) { + if (val == 0) + return; + + this._strafeIncrement += val; + + this.pNotifyUpdate(); + }; + return FirstPersonController; +})(ControllerBase); + +module.exports = FirstPersonController; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRyb2xsZXJzL0ZpcnN0UGVyc29uQ29udHJvbGxlci50cyJdLCJuYW1lcyI6WyJGaXJzdFBlcnNvbkNvbnRyb2xsZXIiLCJGaXJzdFBlcnNvbkNvbnRyb2xsZXIuY29uc3RydWN0b3IiLCJGaXJzdFBlcnNvbkNvbnRyb2xsZXIudXBkYXRlIiwiRmlyc3RQZXJzb25Db250cm9sbGVyLmluY3JlbWVudFdhbGsiLCJGaXJzdFBlcnNvbkNvbnRyb2xsZXIuaW5jcmVtZW50U3RyYWZlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwRUFBZ0Y7O0FBRWhGLGdFQUF1RTs7QUFFdkU7Ozs7RUFJRztBQUNIO0lBQW9DQSx3Q0FBY0E7SUE2SWpEQTs7TUFER0E7SUFDSEEsK0JBQVlBLFlBQWlDQSxFQUFFQSxRQUFtQkEsRUFBRUEsU0FBcUJBLEVBQUVBLFlBQXlCQSxFQUFFQSxZQUF3QkEsRUFBRUEsS0FBZ0JBLEVBQUVBLFlBQTRCQTtRQUFsTEMsMkNBQUFBLFlBQVlBLEdBQWlCQSxJQUFJQTtBQUFBQSxRQUFFQSx1Q0FBQUEsUUFBUUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLDJDQUFBQSxZQUFZQSxHQUFVQSxDQUFDQSxFQUFFQTtBQUFBQSxRQUFFQSwyQ0FBQUEsWUFBWUEsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEsb0NBQUFBLEtBQUtBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLDJDQUFBQSxZQUFZQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUU3TEEsV0FBTUEsT0FBQUEsWUFBWUEsQ0FBQ0E7UUE3SXBCQSxLQUFPQSxpQkFBaUJBLEdBQVVBLENBQUNBLENBQUNBO1FBQ3BDQSxLQUFRQSxrQkFBa0JBLEdBQVVBLEVBQUVBLENBQUNBO1FBRXZDQSxLQUFRQSxTQUFTQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUM3QkEsS0FBUUEsVUFBVUEsR0FBVUEsRUFBRUEsQ0FBQ0E7UUFDL0JBLEtBQVFBLGFB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U0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7UUFDN0ZBLENBQUNBOzs7O0FBVkFBOztJQWlCREE7UUFBQUE7Ozs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDMUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXdCQSxHQUFVQTtZQUVqQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsYUFBYUEsSUFBSUEsR0FBR0E7Z0JBQzVCQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsR0FBR0E7O1lBRXhCQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtRQUM3RkEsQ0FBQ0E7Ozs7QUFWQUE7O0lBZ0JEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDMUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXdCQSxHQUFXQTtZQUVsQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsYUFBYUEsSUFBSUEsR0FBR0E7Z0JBQzVCQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsR0FBR0E7O1lBRXhCQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTtRQUNyQkEsQ0FBQ0E7Ozs7QUFWQUE7O0lBMENEQTs7Ozs7Ozs7OztNQURHQTs2Q0FDSEEsVUFBY0EsV0FBMEJBO1FBQTFCRSwwQ0FBQUEsV0FBV0EsR0FBV0EsSUFBSUE7QUFBQUEsUUFFdkNBLElBQUlBLElBQUlBLENBQUNBLFVB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SUFDckJBLENBQUNBO0lBRUZKLDZCQUFDQTtBQUFEQSxDQUFDQSxFQXJQbUMsY0FBYyxFQXFQakQ7O0FBRUQsc0NBQStCLENBQUEiLCJmaWxlIjoiY29udHJvbGxlcnMvRmlyc3RQZXJzb25Db250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbnRyb2xsZXJCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRyb2xsZXJzL0NvbnRyb2xsZXJCYXNlXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgTWF0aENvbnN0c1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRoQ29uc3RzXCIpO1xuXG4vKipcbiAqIEV4dGVuZGVkIGNhbWVyYSB1c2VkIHRvIGhvdmVyIHJvdW5kIGEgc3BlY2lmaWVkIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHNlZSAgICBhd2F5M2QuY29udGFpbmVycy5WaWV3M0RcbiAqL1xuY2xhc3MgRmlyc3RQZXJzb25Db250cm9sbGVyIGV4dGVuZHMgQ29udHJvbGxlckJhc2Vcbntcblx0cHVibGljIF9pQ3VycmVudFBhbkFuZ2xlOm51bWJlciA9IDA7XG5cdHB1YmxpYyAgX2lDdXJyZW50VGlsdEFuZ2xlOm51bWJlciA9IDkwO1xuXG5cdHByaXZhdGUgX3BhbkFuZ2xlOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX3RpbHRBbmdsZTpudW1iZXIgPSA5MDtcblx0cHJpdmF0ZSBfbWluVGlsdEFuZ2xlOm51bWJlciA9IC05MDtcblx0cHJpdmF0ZSBfbWF4VGlsdEFuZ2xlOm51bWJlciA9IDkwO1xuXHRwcml2YXRlIF9zdGVwczpudW1iZXIgPSA4O1xuXHRwcml2YXRlIF93YWxrSW5jcmVtZW50Om51bWJlciA9IDA7XG5cdHByaXZhdGUgX3N0cmFmZUluY3JlbWVudDpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF93cmFwUGFuQW5nbGU6Ym9vbGVhbiA9IGZhbHNlO1xuXG5cdHB1YmxpYyBmbHk6Ym9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBGcmFjdGlvbmFsIHN0ZXAgdGFrZW4gZWFjaCB0aW1lIHRoZSA8Y29kZT5ob3ZlcigpPC9jb2RlPiBtZXRob2QgaXMgY2FsbGVkLiBEZWZhdWx0cyB0byA4LlxuXHQgKlxuXHQgKiBBZmZlY3RzIHRoZSBzcGVlZCBhdCB3aGljaCB0aGUgPGNvZGU+dGlsdEFuZ2xlPC9jb2RlPiBhbmQgPGNvZGU+cGFuQW5nbGU8L2NvZGU+IHJlc29sdmUgdG8gdGhlaXIgdGFyZ2V0cy5cblx0ICpcblx0ICogQHNlZSAgICAjdGlsdEFuZ2xlXG5cdCAqIEBzZWUgICAgI3BhbkFuZ2xlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHN0ZXBzKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc3RlcHM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHN0ZXBzKHZhbDpudW1iZXIpXG5cdHtcblx0XHR2YWwgPSAodmFsIDwgMSk/IDEgOiB2YWw7XG5cblx0XHRpZiAodGhpcy5fc3RlcHMgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fc3RlcHMgPSB2YWw7XG5cblx0XHR0aGlzLnBOb3RpZnlVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSb3RhdGlvbiBvZiB0aGUgY2FtZXJhIGluIGRlZ3JlZXMgYXJvdW5kIHRoZSB5IGF4aXMuIERlZmF1bHRzIHRvIDAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHBhbkFuZ2xlKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcGFuQW5nbGU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHBhbkFuZ2xlKHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fcGFuQW5nbGUgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcGFuQW5nbGUgPSB2YWw7XG5cblx0XHR0aGlzLnBOb3RpZnlVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbGV2YXRpb24gYW5nbGUgb2YgdGhlIGNhbWVyYSBpbiBkZWdyZWVzLiBEZWZhdWx0cyB0byA5MC5cblx0ICovXG5cdHB1YmxpYyBnZXQgdGlsdEFuZ2xlKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdGlsdEFuZ2xlO1xuXHR9XG5cblx0cHVibGljIHNldCB0aWx0QW5nbGUodmFsOm51bWJlcilcblx0e1xuXHRcdHZhbCA9IE1hdGgubWF4KHRoaXMuX21pblRpbHRBbmdsZSwgTWF0aC5taW4odGhpcy5fbWF4VGlsdEFuZ2xlLCB2YWwpKTtcblxuXHRcdGlmICh0aGlzLl90aWx0QW5nbGUgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fdGlsdEFuZ2xlID0gdmFsO1xuXG5cdFx0dGhpcy5wTm90aWZ5VXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogTWluaW11bSBib3VuZHMgZm9yIHRoZSA8Y29kZT50aWx0QW5nbGU8L2NvZGU+LiBEZWZhdWx0cyB0byAtOTAuXG5cdCAqXG5cdCAqIEBzZWUgICAgI3RpbHRBbmdsZVxuXHQgKi9cblx0cHVibGljIGdldCBtaW5UaWx0QW5nbGUoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9taW5UaWx0QW5nbGU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1pblRpbHRBbmdsZSh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX21pblRpbHRBbmdsZSA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9taW5UaWx0QW5nbGUgPSB2YWw7XG5cblx0XHR0aGlzLnRpbHRBbmdsZSA9IE1hdGgubWF4KHRoaXMuX21pblRpbHRBbmdsZSwgTWF0aC5taW4odGhpcy5fbWF4VGlsdEFuZ2xlLCB0aGlzLl90aWx0QW5nbGUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXhpbXVtIGJvdW5kcyBmb3IgdGhlIDxjb2RlPnRpbHRBbmdsZTwvY29kZT4uIERlZmF1bHRzIHRvIDkwLlxuXHQgKlxuXHQgKiBAc2VlICAgICN0aWx0QW5nbGVcblx0ICovXG5cdHB1YmxpYyBnZXQgbWF4VGlsdEFuZ2xlKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWF4VGlsdEFuZ2xlO1xuXHR9XG5cblx0cHVibGljIHNldCBtYXhUaWx0QW5nbGUodmFsOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9tYXhUaWx0QW5nbGUgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fbWF4VGlsdEFuZ2xlID0gdmFsO1xuXG5cdFx0dGhpcy50aWx0QW5nbGUgPSBNYXRoLm1heCh0aGlzLl9taW5UaWx0QW5nbGUsIE1hdGgubWluKHRoaXMuX21heFRpbHRBbmdsZSwgdGhpcy5fdGlsdEFuZ2xlKSk7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIHZhbHVlIG9mIHRoZSBwYW4gYW5nbGUgd3JhcHMgd2hlbiBvdmVyIDM2MCBkZWdyZWVzIG9yIHVuZGVyIDAgZGVncmVlcy4gRGVmYXVsdHMgdG8gZmFsc2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHdyYXBQYW5BbmdsZSgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl93cmFwUGFuQW5nbGU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHdyYXBQYW5BbmdsZSh2YWw6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl93cmFwUGFuQW5nbGUgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fd3JhcFBhbkFuZ2xlID0gdmFsO1xuXG5cdFx0dGhpcy5wTm90aWZ5VXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5Ib3ZlckNvbnRyb2xsZXI8L2NvZGU+IG9iamVjdC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHRhcmdldE9iamVjdDpEaXNwbGF5T2JqZWN0ID0gbnVsbCwgcGFuQW5nbGU6bnVtYmVyID0gMCwgdGlsdEFuZ2xlOm51bWJlciA9IDkwLCBtaW5UaWx0QW5nbGU6bnVtYmVyID0gLTkwLCBtYXhUaWx0QW5nbGU6bnVtYmVyID0gOTAsIHN0ZXBzOm51bWJlciA9IDgsIHdyYXBQYW5BbmdsZTpib29sZWFuID0gZmFsc2UpXG5cdHtcblx0XHRzdXBlcih0YXJnZXRPYmplY3QpO1xuXG5cdFx0dGhpcy5wYW5BbmdsZSA9IHBhbkFuZ2xlO1xuXHRcdHRoaXMudGlsdEFuZ2xlID0gdGlsdEFuZ2xlO1xuXHRcdHRoaXMubWluVGlsdEFuZ2xlID0gbWluVGlsdEFuZ2xlO1xuXHRcdHRoaXMubWF4VGlsdEFuZ2xlID0gbWF4VGlsdEFuZ2xlO1xuXHRcdHRoaXMuc3RlcHMgPSBzdGVwcztcblx0XHR0aGlzLndyYXBQYW5BbmdsZSA9IHdyYXBQYW5BbmdsZTtcblxuXHRcdC8vdmFsdWVzIHBhc3NlZCBpbiBjb250cnVzdG9yIGFyZSBhcHBsaWVkIGltbWVkaWF0ZWx5XG5cdFx0dGhpcy5faUN1cnJlbnRQYW5BbmdsZSA9IHRoaXMuX3BhbkFuZ2xlO1xuXHRcdHRoaXMuX2lDdXJyZW50VGlsdEFuZ2xlID0gdGhpcy5fdGlsdEFuZ2xlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGN1cnJlbnQgdGlsdCBhbmdsZSBhbmQgcGFuIGFuZ2xlIHZhbHVlcy5cblx0ICpcblx0ICogVmFsdWVzIGFyZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBkZWZpbmVkIDxjb2RlPnRpbHRBbmdsZTwvY29kZT4sIDxjb2RlPnBhbkFuZ2xlPC9jb2RlPiBhbmQgPGNvZGU+c3RlcHM8L2NvZGU+IHZhcmlhYmxlcy5cblx0ICpcblx0ICogQHBhcmFtIGludGVycG9sYXRlICAgSWYgdGhlIHVwZGF0ZSB0byBhIHRhcmdldCBwYW4tIG9yIHRpbHRBbmdsZSBpcyBpbnRlcnBvbGF0ZWQuIERlZmF1bHQgaXMgdHJ1ZS5cblx0ICpcblx0ICogQHNlZSAgICAjdGlsdEFuZ2xlXG5cdCAqIEBzZWUgICAgI3BhbkFuZ2xlXG5cdCAqIEBzZWUgICAgI3N0ZXBzXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlKGludGVycG9sYXRlOmJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3RpbHRBbmdsZSAhPSB0aGlzLl9pQ3VycmVudFRpbHRBbmdsZSB8fCB0aGlzLl9wYW5BbmdsZSAhPSB0aGlzLl9pQ3VycmVudFBhbkFuZ2xlKSB7XG5cblx0XHRcdHRoaXMucE5vdGlmeVVwZGF0ZSgpO1xuXG5cdFx0XHRpZiAodGhpcy5fd3JhcFBhbkFuZ2xlKSB7XG5cdFx0XHRcdGlmICh0aGlzLl9wYW5BbmdsZSA8IDApIHtcblx0XHRcdFx0XHR0aGlzLl9pQ3VycmVudFBhbkFuZ2xlICs9IHRoaXMuX3BhbkFuZ2xlJTM2MCArIDM2MCAtIHRoaXMuX3BhbkFuZ2xlO1xuXHRcdFx0XHRcdHRoaXMuX3BhbkFuZ2xlID0gdGhpcy5fcGFuQW5nbGUlMzYwICsgMzYwO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHRoaXMuX2lDdXJyZW50UGFuQW5nbGUgKz0gdGhpcy5fcGFuQW5nbGUlMzYwIC0gdGhpcy5fcGFuQW5nbGU7XG5cdFx0XHRcdFx0dGhpcy5fcGFuQW5nbGUgPSB0aGlzLl9wYW5BbmdsZSUzNjA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR3aGlsZSAodGhpcy5fcGFuQW5nbGUgLSB0aGlzLl9pQ3VycmVudFBhbkFuZ2xlIDwgLTE4MClcblx0XHRcdFx0XHR0aGlzLl9pQ3VycmVudFBhbkFuZ2xlIC09IDM2MDtcblxuXHRcdFx0XHR3aGlsZSAodGhpcy5fcGFuQW5nbGUgLSB0aGlzLl9pQ3VycmVudFBhbkFuZ2xlID4gMTgwKVxuXHRcdFx0XHRcdHRoaXMuX2lDdXJyZW50UGFuQW5nbGUgKz0gMzYwO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaW50ZXJwb2xhdGUpIHtcblx0XHRcdFx0dGhpcy5faUN1cnJlbnRUaWx0QW5nbGUgKz0gKHRoaXMuX3RpbHRBbmdsZSAtIHRoaXMuX2lDdXJyZW50VGlsdEFuZ2xlKS8odGhpcy5zdGVwcyArIDEpO1xuXHRcdFx0XHR0aGlzLl9pQ3VycmVudFBhbkFuZ2xlICs9ICh0aGlzLl9wYW5BbmdsZSAtIHRoaXMuX2lDdXJyZW50UGFuQW5nbGUpLyh0aGlzLnN0ZXBzICsgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9pQ3VycmVudFRpbHRBbmdsZSA9IHRoaXMuX3RpbHRBbmdsZTtcblx0XHRcdFx0dGhpcy5faUN1cnJlbnRQYW5BbmdsZSA9IHRoaXMuX3BhbkFuZ2xlO1xuXHRcdFx0fVxuXG5cdFx0XHQvL3NuYXAgY29vcmRzIGlmIGFuZ2xlIGRpZmZlcmVuY2VzIGFyZSBjbG9zZVxuXHRcdFx0aWYgKChNYXRoLmFicyh0aGlzLnRpbHRBbmdsZSAtIHRoaXMuX2lDdXJyZW50VGlsdEFuZ2xlKSA8IDAuMDEpICYmIChNYXRoLmFicyh0aGlzLl9wYW5BbmdsZSAtIHRoaXMuX2lDdXJyZW50UGFuQW5nbGUpIDwgMC4wMSkpIHtcblx0XHRcdFx0dGhpcy5faUN1cnJlbnRUaWx0QW5nbGUgPSB0aGlzLl90aWx0QW5nbGU7XG5cdFx0XHRcdHRoaXMuX2lDdXJyZW50UGFuQW5nbGUgPSB0aGlzLl9wYW5BbmdsZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnRhcmdldE9iamVjdC5yb3RhdGlvblggPSB0aGlzLl9pQ3VycmVudFRpbHRBbmdsZTtcblx0XHR0aGlzLnRhcmdldE9iamVjdC5yb3RhdGlvblkgPSB0aGlzLl9pQ3VycmVudFBhbkFuZ2xlO1xuXG5cdFx0aWYgKHRoaXMuX3dhbGtJbmNyZW1lbnQpIHtcblx0XHRcdGlmICh0aGlzLmZseSkge1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC50cmFuc2Zvcm0ubW92ZUZvcndhcmQodGhpcy5fd2Fsa0luY3JlbWVudCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC54ICs9IHRoaXMuX3dhbGtJbmNyZW1lbnQqTWF0aC5zaW4odGhpcy5fcGFuQW5nbGUqTWF0aENvbnN0cy5ERUdSRUVTX1RPX1JBRElBTlMpO1xuXHRcdFx0XHR0aGlzLnRhcmdldE9iamVjdC56ICs9IHRoaXMuX3dhbGtJbmNyZW1lbnQqTWF0aC5jb3ModGhpcy5fcGFuQW5nbGUqTWF0aENvbnN0cy5ERUdSRUVTX1RPX1JBRElBTlMpO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5fd2Fsa0luY3JlbWVudCA9IDA7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3N0cmFmZUluY3JlbWVudCkge1xuXHRcdFx0dGhpcy50YXJnZXRPYmplY3QudHJhbnNmb3JtLm1vdmVSaWdodCh0aGlzLl9zdHJhZmVJbmNyZW1lbnQpO1xuXHRcdFx0dGhpcy5fc3RyYWZlSW5jcmVtZW50ID0gMDtcblx0XHR9XG5cblx0fVxuXG5cdHB1YmxpYyBpbmNyZW1lbnRXYWxrKHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodmFsID09IDApXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl93YWxrSW5jcmVtZW50ICs9IHZhbDtcblxuXHRcdHRoaXMucE5vdGlmeVVwZGF0ZSgpO1xuXHR9XG5cblx0cHVibGljIGluY3JlbWVudFN0cmFmZSh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHZhbCA9PSAwKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fc3RyYWZlSW5jcmVtZW50ICs9IHZhbDtcblxuXHRcdHRoaXMucE5vdGlmeVVwZGF0ZSgpO1xuXHR9XG5cbn1cblxuZXhwb3J0ID0gRmlyc3RQZXJzb25Db250cm9sbGVyOyJdfQ== \ No newline at end of file diff --git a/lib/controllers/FirstPersonController.ts b/lib/controllers/FirstPersonController.ts new file mode 100644 index 00000000..39088fa6 --- /dev/null +++ b/lib/controllers/FirstPersonController.ts @@ -0,0 +1,257 @@ +import ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); + +/** + * Extended camera used to hover round a specified target object. + * + * @see away3d.containers.View3D + */ +class FirstPersonController extends ControllerBase +{ + public _iCurrentPanAngle:number = 0; + public _iCurrentTiltAngle:number = 90; + + private _panAngle:number = 0; + private _tiltAngle:number = 90; + private _minTiltAngle:number = -90; + private _maxTiltAngle:number = 90; + private _steps:number = 8; + private _walkIncrement:number = 0; + private _strafeIncrement:number = 0; + private _wrapPanAngle:boolean = false; + + public fly:boolean = false; + + /** + * Fractional step taken each time the hover() method is called. Defaults to 8. + * + * Affects the speed at which the tiltAngle and panAngle resolve to their targets. + * + * @see #tiltAngle + * @see #panAngle + */ + public get steps():number + { + return this._steps; + } + + public set steps(val:number) + { + val = (val < 1)? 1 : val; + + if (this._steps == val) + return; + + this._steps = val; + + this.pNotifyUpdate(); + } + + /** + * Rotation of the camera in degrees around the y axis. Defaults to 0. + */ + public get panAngle():number + { + return this._panAngle; + } + + public set panAngle(val:number) + { + if (this._panAngle == val) + return; + + this._panAngle = val; + + this.pNotifyUpdate(); + } + + /** + * Elevation angle of the camera in degrees. Defaults to 90. + */ + public get tiltAngle():number + { + return this._tiltAngle; + } + + public set tiltAngle(val:number) + { + val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); + + if (this._tiltAngle == val) + return; + + this._tiltAngle = val; + + this.pNotifyUpdate(); + } + + /** + * Minimum bounds for the tiltAngle. Defaults to -90. + * + * @see #tiltAngle + */ + public get minTiltAngle():number + { + return this._minTiltAngle; + } + + public set minTiltAngle(val:number) + { + if (this._minTiltAngle == val) + return; + + this._minTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + } + + /** + * Maximum bounds for the tiltAngle. Defaults to 90. + * + * @see #tiltAngle + */ + public get maxTiltAngle():number + { + return this._maxTiltAngle; + } + + public set maxTiltAngle(val:number) + { + if (this._maxTiltAngle == val) + return; + + this._maxTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + } + + + /** + * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. + */ + public get wrapPanAngle():boolean + { + return this._wrapPanAngle; + } + + public set wrapPanAngle(val:boolean) + { + if (this._wrapPanAngle == val) + return; + + this._wrapPanAngle = val; + + this.pNotifyUpdate(); + } + + /** + * Creates a new HoverController object. + */ + constructor(targetObject:DisplayObject = null, panAngle:number = 0, tiltAngle:number = 90, minTiltAngle:number = -90, maxTiltAngle:number = 90, steps:number = 8, wrapPanAngle:boolean = false) + { + super(targetObject); + + this.panAngle = panAngle; + this.tiltAngle = tiltAngle; + this.minTiltAngle = minTiltAngle; + this.maxTiltAngle = maxTiltAngle; + this.steps = steps; + this.wrapPanAngle = wrapPanAngle; + + //values passed in contrustor are applied immediately + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + + /** + * Updates the current tilt angle and pan angle values. + * + * Values are calculated using the defined tiltAngle, panAngle and steps variables. + * + * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. + * + * @see #tiltAngle + * @see #panAngle + * @see #steps + */ + public update(interpolate:boolean = true) + { + if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { + + this.pNotifyUpdate(); + + if (this._wrapPanAngle) { + if (this._panAngle < 0) { + this._iCurrentPanAngle += this._panAngle%360 + 360 - this._panAngle; + this._panAngle = this._panAngle%360 + 360; + } else { + this._iCurrentPanAngle += this._panAngle%360 - this._panAngle; + this._panAngle = this._panAngle%360; + } + + while (this._panAngle - this._iCurrentPanAngle < -180) + this._iCurrentPanAngle -= 360; + + while (this._panAngle - this._iCurrentPanAngle > 180) + this._iCurrentPanAngle += 360; + } + + if (interpolate) { + this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle)/(this.steps + 1); + this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle)/(this.steps + 1); + } else { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + + //snap coords if angle differences are close + if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + } + + this.targetObject.rotationX = this._iCurrentTiltAngle; + this.targetObject.rotationY = this._iCurrentPanAngle; + + if (this._walkIncrement) { + if (this.fly) { + this.targetObject.transform.moveForward(this._walkIncrement); + } else { + this.targetObject.x += this._walkIncrement*Math.sin(this._panAngle*MathConsts.DEGREES_TO_RADIANS); + this.targetObject.z += this._walkIncrement*Math.cos(this._panAngle*MathConsts.DEGREES_TO_RADIANS); + } + this._walkIncrement = 0; + } + + if (this._strafeIncrement) { + this.targetObject.transform.moveRight(this._strafeIncrement); + this._strafeIncrement = 0; + } + + } + + public incrementWalk(val:number) + { + if (val == 0) + return; + + this._walkIncrement += val; + + this.pNotifyUpdate(); + } + + public incrementStrafe(val:number) + { + if (val == 0) + return; + + this._strafeIncrement += val; + + this.pNotifyUpdate(); + } + +} + +export = FirstPersonController; \ No newline at end of file diff --git a/lib/controllers/FollowController.js b/lib/controllers/FollowController.js new file mode 100755 index 00000000..79f41737 --- /dev/null +++ b/lib/controllers/FollowController.js @@ -0,0 +1,39 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var HoverController = require("awayjs-core/lib/controllers/HoverController"); + +/** +* Controller used to follow behind an object on the XZ plane, with an optional +* elevation (tiltAngle). +* +* @see away3d.containers.View3D +*/ +var FollowController = (function (_super) { + __extends(FollowController, _super); + function FollowController(targetObject, lookAtObject, tiltAngle, distance) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof lookAtObject === "undefined") { lookAtObject = null; } + if (typeof tiltAngle === "undefined") { tiltAngle = 45; } + if (typeof distance === "undefined") { distance = 700; } + _super.call(this, targetObject, lookAtObject, 0, tiltAngle, distance); + } + FollowController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + interpolate = interpolate; // unused: prevents warning + + if (!this.lookAtObject) + return; + + this.panAngle = this._pLookAtObject.rotationY - 180; + _super.prototype.update.call(this); + }; + return FollowController; +})(HoverController); + +module.exports = FollowController; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRyb2xsZXJzL0ZvbGxvd0NvbnRyb2xsZXIudHMiXSwibmFtZXMiOlsiRm9sbG93Q29udHJvbGxlciIsIkZvbGxvd0NvbnRyb2xsZXIuY29uc3RydWN0b3IiLCJGb2xsb3dDb250cm9sbGVyLnVwZGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNEVBQWtGOztBQUdsRjs7Ozs7RUFLRztBQUNIO0lBQStCQSxtQ0FBZUE7SUFFN0NBLDBCQUFZQSxZQUFpQ0EsRUFBRUEsWUFBaUNBLEVBQUVBLFNBQXFCQSxFQUFFQSxRQUFxQkE7UUFBbEhDLDJDQUFBQSxZQUFZQSxHQUFpQkEsSUFBSUE7QUFBQUEsUUFBRUEsMkNBQUFBLFlBQVlBLEdBQWlCQSxJQUFJQTtBQUFBQSxRQUFFQSx3Q0FBQUEsU0FBU0EsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEsdUNBQUFBLFFBQVFBLEdBQVVBLEdBQUdBO0FBQUFBLFFBRTdIQSxXQUFNQSxPQUFBQSxZQUFZQSxFQUFFQSxZQUFZQSxFQUFFQSxDQUFDQSxFQUFFQSxTQUFTQSxFQUFFQSxRQUFRQSxDQUFDQTtJQUMxREEsQ0FBQ0E7SUFFREQsb0NBQUFBLFVBQWNBLFdBQTBCQTtRQUExQkUsMENBQUFBLFdBQVdBLEdBQVdBLElBQUlBO0FBQUFBLFFBRXZDQSxXQUFXQSxHQUFHQSxXQUFXQSxFQUFFQSwyQkFBMkJBOztRQUV0REEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUE7WUFDckJBLE1BQU9BLENBQUFBOztRQUVSQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxTQUFTQSxHQUFHQSxHQUFHQTtRQUNuREEsZ0JBQUtBLENBQUNBLE1BQU1BLEtBQUNBLEtBQUFBLENBQUNBO0lBQ2ZBLENBQUNBO0lBQ0ZGLHdCQUFDQTtBQUFEQSxDQUFDQSxFQWpCOEIsZUFBZSxFQWlCN0M7O0FBRUQsaUNBQTBCLENBQUEiLCJmaWxlIjoiY29udHJvbGxlcnMvRm9sbG93Q29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBIb3ZlckNvbnRyb2xsZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udHJvbGxlcnMvSG92ZXJDb250cm9sbGVyXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5cbi8qKlxuICogQ29udHJvbGxlciB1c2VkIHRvIGZvbGxvdyBiZWhpbmQgYW4gb2JqZWN0IG9uIHRoZSBYWiBwbGFuZSwgd2l0aCBhbiBvcHRpb25hbFxuICogZWxldmF0aW9uICh0aWx0QW5nbGUpLlxuICpcbiAqIEBzZWUgICAgYXdheTNkLmNvbnRhaW5lcnMuVmlldzNEXG4gKi9cbmNsYXNzIEZvbGxvd0NvbnRyb2xsZXIgZXh0ZW5kcyBIb3ZlckNvbnRyb2xsZXJcbntcblx0Y29uc3RydWN0b3IodGFyZ2V0T2JqZWN0OkRpc3BsYXlPYmplY3QgPSBudWxsLCBsb29rQXRPYmplY3Q6RGlzcGxheU9iamVjdCA9IG51bGwsIHRpbHRBbmdsZTpudW1iZXIgPSA0NSwgZGlzdGFuY2U6bnVtYmVyID0gNzAwKVxuXHR7XG5cdFx0c3VwZXIodGFyZ2V0T2JqZWN0LCBsb29rQXRPYmplY3QsIDAsIHRpbHRBbmdsZSwgZGlzdGFuY2UpO1xuXHR9XG5cblx0cHVibGljIHVwZGF0ZShpbnRlcnBvbGF0ZTpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdGludGVycG9sYXRlID0gaW50ZXJwb2xhdGU7IC8vIHVudXNlZDogcHJldmVudHMgd2FybmluZ1xuXG5cdFx0aWYgKCF0aGlzLmxvb2tBdE9iamVjdClcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMucGFuQW5nbGUgPSB0aGlzLl9wTG9va0F0T2JqZWN0LnJvdGF0aW9uWSAtIDE4MDtcblx0XHRzdXBlci51cGRhdGUoKTtcblx0fVxufVxuXG5leHBvcnQgPSBGb2xsb3dDb250cm9sbGVyOyJdfQ== \ No newline at end of file diff --git a/lib/controllers/FollowController.ts b/lib/controllers/FollowController.ts new file mode 100644 index 00000000..f5f48dda --- /dev/null +++ b/lib/controllers/FollowController.ts @@ -0,0 +1,29 @@ +import HoverController = require("awayjs-core/lib/controllers/HoverController"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +/** + * Controller used to follow behind an object on the XZ plane, with an optional + * elevation (tiltAngle). + * + * @see away3d.containers.View3D + */ +class FollowController extends HoverController +{ + constructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, tiltAngle:number = 45, distance:number = 700) + { + super(targetObject, lookAtObject, 0, tiltAngle, distance); + } + + public update(interpolate:boolean = true) + { + interpolate = interpolate; // unused: prevents warning + + if (!this.lookAtObject) + return; + + this.panAngle = this._pLookAtObject.rotationY - 180; + super.update(); + } +} + +export = FollowController; \ No newline at end of file diff --git a/lib/controllers/HoverController.js b/lib/controllers/HoverController.js new file mode 100755 index 00000000..8de60692 --- /dev/null +++ b/lib/controllers/HoverController.js @@ -0,0 +1,354 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var LookAtController = require("awayjs-core/lib/controllers/LookAtController"); + +var MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* Extended camera used to hover round a specified target object. +* +* @see away.containers.View +*/ +var HoverController = (function (_super) { + __extends(HoverController, _super); + /** + * Creates a new HoverController object. + */ + function HoverController(targetObject, lookAtObject, panAngle, tiltAngle, distance, minTiltAngle, maxTiltAngle, minPanAngle, maxPanAngle, steps, yFactor, wrapPanAngle) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof lookAtObject === "undefined") { lookAtObject = null; } + if (typeof panAngle === "undefined") { panAngle = 0; } + if (typeof tiltAngle === "undefined") { tiltAngle = 90; } + if (typeof distance === "undefined") { distance = 1000; } + if (typeof minTiltAngle === "undefined") { minTiltAngle = -90; } + if (typeof maxTiltAngle === "undefined") { maxTiltAngle = 90; } + if (typeof minPanAngle === "undefined") { minPanAngle = null; } + if (typeof maxPanAngle === "undefined") { maxPanAngle = null; } + if (typeof steps === "undefined") { steps = 8; } + if (typeof yFactor === "undefined") { yFactor = 2; } + if (typeof wrapPanAngle === "undefined") { wrapPanAngle = false; } + _super.call(this, targetObject, lookAtObject); + this._iCurrentPanAngle = 0; + this._iCurrentTiltAngle = 90; + this._panAngle = 0; + this._tiltAngle = 90; + this._distance = 1000; + this._minPanAngle = -Infinity; + this._maxPanAngle = Infinity; + this._minTiltAngle = -90; + this._maxTiltAngle = 90; + this._steps = 8; + this._yFactor = 2; + this._wrapPanAngle = false; + this._upAxis = new Vector3D(); + + this.distance = distance; + this.panAngle = panAngle; + this.tiltAngle = tiltAngle; + this.minPanAngle = (minPanAngle != null) ? minPanAngle : -Infinity; + this.maxPanAngle = (maxPanAngle != null) ? maxPanAngle : Infinity; + this.minTiltAngle = minTiltAngle; + this.maxTiltAngle = maxTiltAngle; + this.steps = steps; + this.yFactor = yFactor; + this.wrapPanAngle = wrapPanAngle; + + //values passed in contrustor are applied immediately + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + Object.defineProperty(HoverController.prototype, "steps", { + /** + * Fractional step taken each time the hover() method is called. Defaults to 8. + * + * Affects the speed at which the tiltAngle and panAngle resolve to their targets. + * + * @see #tiltAngle + * @see #panAngle + */ + get: function () { + return this._steps; + }, + set: function (val) { + val = (val < 1) ? 1 : val; + + if (this._steps == val) + return; + + this._steps = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "panAngle", { + /** + * Rotation of the camera in degrees around the y axis. Defaults to 0. + */ + get: function () { + return this._panAngle; + }, + set: function (val) { + val = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, val)); + + if (this._panAngle == val) + return; + + this._panAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "tiltAngle", { + /** + * Elevation angle of the camera in degrees. Defaults to 90. + */ + get: function () { + return this._tiltAngle; + }, + set: function (val) { + val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); + + if (this._tiltAngle == val) + return; + + this._tiltAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "distance", { + /** + * Distance between the camera and the specified target. Defaults to 1000. + */ + get: function () { + return this._distance; + }, + set: function (val) { + if (this._distance == val) + return; + + this._distance = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "minPanAngle", { + /** + * Minimum bounds for the panAngle. Defaults to -Infinity. + * + * @see #panAngle + */ + get: function () { + return this._minPanAngle; + }, + set: function (val) { + if (this._minPanAngle == val) + return; + + this._minPanAngle = val; + + this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "maxPanAngle", { + /** + * Maximum bounds for the panAngle. Defaults to Infinity. + * + * @see #panAngle + */ + get: function () { + return this._maxPanAngle; + }, + set: function (val) { + if (this._maxPanAngle == val) + return; + + this._maxPanAngle = val; + + this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "minTiltAngle", { + /** + * Minimum bounds for the tiltAngle. Defaults to -90. + * + * @see #tiltAngle + */ + get: function () { + return this._minTiltAngle; + }, + set: function (val) { + if (this._minTiltAngle == val) + return; + + this._minTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "maxTiltAngle", { + /** + * Maximum bounds for the tiltAngle. Defaults to 90. + * + * @see #tiltAngle + */ + get: function () { + return this._maxTiltAngle; + }, + set: function (val) { + if (this._maxTiltAngle == val) + return; + + this._maxTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "yFactor", { + /** + * Fractional difference in distance between the horizontal camera orientation and vertical camera orientation. Defaults to 2. + * + * @see #distance + */ + get: function () { + return this._yFactor; + }, + set: function (val) { + if (this._yFactor == val) + return; + + this._yFactor = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(HoverController.prototype, "wrapPanAngle", { + /** + * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. + */ + get: function () { + return this._wrapPanAngle; + }, + set: function (val) { + if (this._wrapPanAngle == val) + return; + + this._wrapPanAngle = val; + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + /** + * Updates the current tilt angle and pan angle values. + * + * Values are calculated using the defined tiltAngle, panAngle and steps variables. + * + * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. + * + * @see #tiltAngle + * @see #panAngle + * @see #steps + */ + HoverController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { + this.pNotifyUpdate(); + + if (this._wrapPanAngle) { + if (this._panAngle < 0) { + this._iCurrentPanAngle += this._panAngle % 360 + 360 - this._panAngle; + this._panAngle = this._panAngle % 360 + 360; + } else { + this._iCurrentPanAngle += this._panAngle % 360 - this._panAngle; + this._panAngle = this._panAngle % 360; + } + + while (this._panAngle - this._iCurrentPanAngle < -180) + this._iCurrentPanAngle -= 360; + + while (this._panAngle - this._iCurrentPanAngle > 180) + this._iCurrentPanAngle += 360; + } + + if (interpolate) { + this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle) / (this.steps + 1); + this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle) / (this.steps + 1); + } else { + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + + //snap coords if angle differences are close + if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + } + + var pos = (this.lookAtObject) ? this.lookAtObject.transform.position : (this.lookAtPosition) ? this.lookAtPosition : this._pOrigin; + this.targetObject.x = pos.x + this.distance * Math.sin(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + this.targetObject.y = pos.y + this.distance * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS) * this.yFactor; + this.targetObject.z = pos.z + this.distance * Math.cos(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + + this._upAxis.x = -Math.sin(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + this._upAxis.y = Math.cos(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + this._upAxis.z = -Math.cos(this._iCurrentPanAngle * MathConsts.DEGREES_TO_RADIANS) * Math.sin(this._iCurrentTiltAngle * MathConsts.DEGREES_TO_RADIANS); + + if (this._pTargetObject) { + if (this._pLookAtPosition) + this._pTargetObject.lookAt(this._pLookAtPosition, this._upAxis); + else if (this._pLookAtObject) + this._pTargetObject.lookAt(this._pLookAtObject.scene ? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position, this._upAxis); + } + }; + return HoverController; +})(LookAtController); + +module.exports = HoverController; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRyb2xsZXJzL0hvdmVyQ29udHJvbGxlci50cyJdLCJuYW1lcyI6WyJIb3ZlckNvbnRyb2xsZXIiLCJIb3ZlckNvbnRyb2xsZXIuY29uc3RydWN0b3IiLCJIb3ZlckNvbnRyb2xsZXIudXBkYXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4RUFBb0Y7O0FBRXBGLGdFQUF1RTtBQUN2RSw0REFBb0U7O0FBRXBFOzs7O0VBSUc7QUFDSDtJQUE4QkEsa0NBQWdCQTtJQTZON0NBOztNQURHQTtJQUNIQSx5QkFBWUEsWUFBaUNBLEVBQUVBLFlBQWlDQSxFQUFFQSxRQUFtQkEsRUFBRUEsU0FBcUJBLEVBQUVBLFFBQXNCQSxFQUFFQSxZQUF5QkEsRUFBRUEsWUFBd0JBLEVBQUVBLFdBQXlCQSxFQUFFQSxXQUF5QkEsRUFBRUEsS0FBZ0JBLEVBQUVBLE9BQWtCQSxFQUFFQSxZQUE0QkE7UUFBdlRDLDJDQUFBQSxZQUFZQSxHQUFpQkEsSUFBSUE7QUFBQUEsUUFBRUEsMkNBQUFBLFlBQVlBLEdBQWlCQSxJQUFJQTtBQUFBQSxRQUFFQSx1Q0FBQUEsUUFBUUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLHVDQUFBQSxRQUFRQSxHQUFVQSxJQUFJQTtBQUFBQSxRQUFFQSwyQ0FBQUEsWUFBWUEsR0FBVUEsQ0FBQ0EsRUFBRUE7QUFBQUEsUUFBRUEsMkNBQUFBLFlBQVlBLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLDBDQUFBQSxXQUFXQSxHQUFVQSxJQUFJQTtBQUFBQSxRQUFFQSwwQ0FBQUEsV0FBV0EsR0FBVUEsSUFBSUE7QUFBQUEsUUFBRUEsb0NBQUFBLEtBQUtBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLHNDQUFBQSxPQUFPQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSwyQ0FBQUEsWUFBWUEsR0FBV0EsS0FBS0E7QUFBQUEsUUFFbFVBLFdBQU1BLE9BQUFBLFlBQVlBLEVBQUVBLFlBQVlB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UUEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsR0FBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDeklBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLEdBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsR0FBQ0EsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUNBLFVBQVVBLENBQUNBLGtCQUFrQkEsQ0FBQ0E7UUFDMUtBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLEdBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsR0FBQ0EsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxPQUFPQTtRQUN4SEEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFDQSxVQUFVQSxDQUFDQSxrQkFBa0JBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsR0FBQ0EsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQTs7UUFFMUtBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsR0FBQ0EsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUNBLFVBQVVBLENBQUNBLGtCQUFrQkEsQ0FBQ0E7UUFDaEpBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsR0FBQ0EsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQTtRQUNoRkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFDQSxVQUFVQSxDQUFDQSxrQkFBa0JBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsR0FBQ0EsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQTs7UUFFaEpBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBLENBQUVBO1lBQ3hCQSxJQUFJQSxJQUFJQSxDQUFDQSxnQkFBZ0JBO2dCQUN4QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxFQUFFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQTtpQkFDM0RBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBO2dCQUMzQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsS0FBS0EsR0FBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsUUFBUUEsRUFBRUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7U0FDakpBO0lBQ0ZBLENBQUNBO0lBQ0ZGLHVCQUFDQTtBQUFEQSxDQUFDQSxFQWpUNkIsZ0JBQWdCLEVBaVQ3Qzs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJjb250cm9sbGVycy9Ib3ZlckNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9va0F0Q29udHJvbGxlclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250cm9sbGVycy9Mb29rQXRDb250cm9sbGVyXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgTWF0aENvbnN0c1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRoQ29uc3RzXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5cbi8qKlxuICogRXh0ZW5kZWQgY2FtZXJhIHVzZWQgdG8gaG92ZXIgcm91bmQgYSBzcGVjaWZpZWQgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAc2VlICAgIGF3YXkuY29udGFpbmVycy5WaWV3XG4gKi9cbmNsYXNzIEhvdmVyQ29udHJvbGxlciBleHRlbmRzIExvb2tBdENvbnRyb2xsZXJcbntcblx0cHVibGljIF9pQ3VycmVudFBhbkFuZ2xlOm51bWJlciA9IDA7XG5cdHB1YmxpYyBfaUN1cnJlbnRUaWx0QW5nbGU6bnVtYmVyID0gOTA7XG5cblx0cHJpdmF0ZSBfcGFuQW5nbGU6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfdGlsdEFuZ2xlOm51bWJlciA9IDkwO1xuXHRwcml2YXRlIF9kaXN0YW5jZTpudW1iZXIgPSAxMDAwO1xuXHRwcml2YXRlIF9taW5QYW5BbmdsZTpudW1iZXIgPSAtSW5maW5pdHk7XG5cdHByaXZhdGUgX21heFBhbkFuZ2xlOm51bWJlciA9IEluZmluaXR5O1xuXHRwcml2YXRlIF9taW5UaWx0QW5nbGU6bnVtYmVyID0gLTkwO1xuXHRwcml2YXRlIF9tYXhUaWx0QW5nbGU6bnVtYmVyID0gOTA7XG5cdHByaXZhdGUgX3N0ZXBzOm51bWJlciA9IDg7XG5cdHByaXZhdGUgX3lGYWN0b3I6bnVtYmVyID0gMjtcblx0cHJpdmF0ZSBfd3JhcFBhbkFuZ2xlOmJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSBfdXBBeGlzOlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCk7XG5cblx0LyoqXG5cdCAqIEZyYWN0aW9uYWwgc3RlcCB0YWtlbiBlYWNoIHRpbWUgdGhlIDxjb2RlPmhvdmVyKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIERlZmF1bHRzIHRvIDguXG5cdCAqXG5cdCAqIEFmZmVjdHMgdGhlIHNwZWVkIGF0IHdoaWNoIHRoZSA8Y29kZT50aWx0QW5nbGU8L2NvZGU+IGFuZCA8Y29kZT5wYW5BbmdsZTwvY29kZT4gcmVzb2x2ZSB0byB0aGVpciB0YXJnZXRzLlxuXHQgKlxuXHQgKiBAc2VlICAgICN0aWx0QW5nbGVcblx0ICogQHNlZSAgICAjcGFuQW5nbGVcblx0ICovXG5cdHB1YmxpYyBnZXQgc3RlcHMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zdGVwcztcblx0fVxuXG5cdHB1YmxpYyBzZXQgc3RlcHModmFsOm51bWJlcilcblx0e1xuXHRcdHZhbCA9ICh2YWwgPCAxKT8gMSA6IHZhbDtcblxuXHRcdGlmICh0aGlzLl9zdGVwcyA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9zdGVwcyA9IHZhbDtcblxuXHRcdHRoaXMucE5vdGlmeVVwZGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJvdGF0aW9uIG9mIHRoZSBjYW1lcmEgaW4gZGVncmVlcyBhcm91bmQgdGhlIHkgYXhpcy4gRGVmYXVsdHMgdG8gMC5cblx0ICovXG5cdHB1YmxpYyBnZXQgcGFuQW5nbGUoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wYW5BbmdsZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcGFuQW5nbGUodmFsOm51bWJlcilcblx0e1xuXHRcdHZhbCA9IE1hdGgubWF4KHRoaXMuX21pblBhbkFuZ2xlLCBNYXRoLm1pbih0aGlzLl9tYXhQYW5BbmdsZSwgdmFsKSk7XG5cblx0XHRpZiAodGhpcy5fcGFuQW5nbGUgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcGFuQW5nbGUgPSB2YWw7XG5cblx0XHR0aGlzLnBOb3RpZnlVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBFbGV2YXRpb24gYW5nbGUgb2YgdGhlIGNhbWVyYSBpbiBkZWdyZWVzLiBEZWZhdWx0cyB0byA5MC5cblx0ICovXG5cdHB1YmxpYyBnZXQgdGlsdEFuZ2xlKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdGlsdEFuZ2xlO1xuXHR9XG5cblx0cHVibGljIHNldCB0aWx0QW5nbGUodmFsOm51bWJlcilcblx0e1xuXHRcdHZhbCA9IE1hdGgubWF4KHRoaXMuX21pblRpbHRBbmdsZSwgTWF0aC5taW4odGhpcy5fbWF4VGlsdEFuZ2xlLCB2YWwpKTtcblxuXHRcdGlmICh0aGlzLl90aWx0QW5nbGUgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fdGlsdEFuZ2xlID0gdmFsO1xuXG5cdFx0dGhpcy5wTm90aWZ5VXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzdGFuY2UgYmV0d2VlbiB0aGUgY2FtZXJhIGFuZCB0aGUgc3BlY2lmaWVkIHRhcmdldC4gRGVmYXVsdHMgdG8gMTAwMC5cblx0ICovXG5cdHB1YmxpYyBnZXQgZGlzdGFuY2UoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kaXN0YW5jZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgZGlzdGFuY2UodmFsOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9kaXN0YW5jZSA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9kaXN0YW5jZSA9IHZhbDtcblxuXHRcdHRoaXMucE5vdGlmeVVwZGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1pbmltdW0gYm91bmRzIGZvciB0aGUgPGNvZGU+cGFuQW5nbGU8L2NvZGU+LiBEZWZhdWx0cyB0byAtSW5maW5pdHkuXG5cdCAqXG5cdCAqIEBzZWUgICAgI3BhbkFuZ2xlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1pblBhbkFuZ2xlKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWluUGFuQW5nbGU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1pblBhbkFuZ2xlKHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fbWluUGFuQW5nbGUgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fbWluUGFuQW5nbGUgPSB2YWw7XG5cblx0XHR0aGlzLnBhbkFuZ2xlID0gTWF0aC5tYXgodGhpcy5fbWluUGFuQW5nbGUsIE1hdGgubWluKHRoaXMuX21heFBhbkFuZ2xlLCB0aGlzLl9wYW5BbmdsZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1heGltdW0gYm91bmRzIGZvciB0aGUgPGNvZGU+cGFuQW5nbGU8L2NvZGU+LiBEZWZhdWx0cyB0byBJbmZpbml0eS5cblx0ICpcblx0ICogQHNlZSAgICAjcGFuQW5nbGVcblx0ICovXG5cdHB1YmxpYyBnZXQgbWF4UGFuQW5nbGUoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9tYXhQYW5BbmdsZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbWF4UGFuQW5nbGUodmFsOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9tYXhQYW5BbmdsZSA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9tYXhQYW5BbmdsZSA9IHZhbDtcblxuXHRcdHRoaXMucGFuQW5nbGUgPSBNYXRoLm1heCh0aGlzLl9taW5QYW5BbmdsZSwgTWF0aC5taW4odGhpcy5fbWF4UGFuQW5nbGUsIHRoaXMuX3BhbkFuZ2xlKSk7XG5cdH1cblxuXHQvKipcblx0ICogTWluaW11bSBib3VuZHMgZm9yIHRoZSA8Y29kZT50aWx0QW5nbGU8L2NvZGU+LiBEZWZhdWx0cyB0byAtOTAuXG5cdCAqXG5cdCAqIEBzZWUgICAgI3RpbHRBbmdsZVxuXHQgKi9cblx0cHVibGljIGdldCBtaW5UaWx0QW5nbGUoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9taW5UaWx0QW5nbGU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1pblRpbHRBbmdsZSh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX21pblRpbHRBbmdsZSA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9taW5UaWx0QW5nbGUgPSB2YWw7XG5cblx0XHR0aGlzLnRpbHRBbmdsZSA9IE1hdGgubWF4KHRoaXMuX21pblRpbHRBbmdsZSwgTWF0aC5taW4odGhpcy5fbWF4VGlsdEFuZ2xlLCB0aGlzLl90aWx0QW5nbGUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNYXhpbXVtIGJvdW5kcyBmb3IgdGhlIDxjb2RlPnRpbHRBbmdsZTwvY29kZT4uIERlZmF1bHRzIHRvIDkwLlxuXHQgKlxuXHQgKiBAc2VlICAgICN0aWx0QW5nbGVcblx0ICovXG5cdHB1YmxpYyBnZXQgbWF4VGlsdEFuZ2xlKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWF4VGlsdEFuZ2xlO1xuXHR9XG5cblx0cHVibGljIHNldCBtYXhUaWx0QW5nbGUodmFsOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9tYXhUaWx0QW5nbGUgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fbWF4VGlsdEFuZ2xlID0gdmFsO1xuXG5cdFx0dGhpcy50aWx0QW5nbGUgPSBNYXRoLm1heCh0aGlzLl9taW5UaWx0QW5nbGUsIE1hdGgubWluKHRoaXMuX21heFRpbHRBbmdsZSwgdGhpcy5fdGlsdEFuZ2xlKSk7XG5cdH1cblxuXHQvKipcblx0ICogRnJhY3Rpb25hbCBkaWZmZXJlbmNlIGluIGRpc3RhbmNlIGJldHdlZW4gdGhlIGhvcml6b250YWwgY2FtZXJhIG9yaWVudGF0aW9uIGFuZCB2ZXJ0aWNhbCBjYW1lcmEgb3JpZW50YXRpb24uIERlZmF1bHRzIHRvIDIuXG5cdCAqXG5cdCAqIEBzZWUgICAgI2Rpc3RhbmNlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHlGYWN0b3IoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl95RmFjdG9yO1xuXHR9XG5cblx0cHVibGljIHNldCB5RmFjdG9yKHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5feUZhY3RvciA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl95RmFjdG9yID0gdmFsO1xuXG5cdFx0dGhpcy5wTm90aWZ5VXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSB2YWx1ZSBvZiB0aGUgcGFuIGFuZ2xlIHdyYXBzIHdoZW4gb3ZlciAzNjAgZGVncmVlcyBvciB1bmRlciAwIGRlZ3JlZXMuIERlZmF1bHRzIHRvIGZhbHNlLlxuXHQgKi9cblx0cHVibGljIGdldCB3cmFwUGFuQW5nbGUoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fd3JhcFBhbkFuZ2xlO1xuXHR9XG5cblx0cHVibGljIHNldCB3cmFwUGFuQW5nbGUodmFsOmJvb2xlYW4pXG5cdHtcblx0XHRpZiAodGhpcy5fd3JhcFBhbkFuZ2xlID09IHZhbClcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3dyYXBQYW5BbmdsZSA9IHZhbDtcblxuXHRcdHRoaXMucE5vdGlmeVVwZGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+SG92ZXJDb250cm9sbGVyPC9jb2RlPiBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih0YXJnZXRPYmplY3Q6RGlzcGxheU9iamVjdCA9IG51bGwsIGxvb2tBdE9iamVjdDpEaXNwbGF5T2JqZWN0ID0gbnVsbCwgcGFuQW5nbGU6bnVtYmVyID0gMCwgdGlsdEFuZ2xlOm51bWJlciA9IDkwLCBkaXN0YW5jZTpudW1iZXIgPSAxMDAwLCBtaW5UaWx0QW5nbGU6bnVtYmVyID0gLTkwLCBtYXhUaWx0QW5nbGU6bnVtYmVyID0gOTAsIG1pblBhbkFuZ2xlOm51bWJlciA9IG51bGwsIG1heFBhbkFuZ2xlOm51bWJlciA9IG51bGwsIHN0ZXBzOm51bWJlciA9IDgsIHlGYWN0b3I6bnVtYmVyID0gMiwgd3JhcFBhbkFuZ2xlOmJvb2xlYW4gPSBmYWxzZSlcblx0e1xuXHRcdHN1cGVyKHRhcmdldE9iamVjdCwgbG9va0F0T2JqZWN0KTtcblxuXHRcdHRoaXMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblx0XHR0aGlzLnBhbkFuZ2xlID0gcGFuQW5nbGU7XG5cdFx0dGhpcy50aWx0QW5nbGUgPSB0aWx0QW5nbGU7XG5cdFx0dGhpcy5taW5QYW5BbmdsZSA9ICggbWluUGFuQW5nbGUgIT0gbnVsbCApPyBtaW5QYW5BbmdsZSA6IC1JbmZpbml0eTtcblx0XHR0aGlzLm1heFBhbkFuZ2xlID0gKCBtYXhQYW5BbmdsZSAhPSBudWxsICk/IG1heFBhbkFuZ2xlIDogSW5maW5pdHk7XG5cdFx0dGhpcy5taW5UaWx0QW5nbGUgPSBtaW5UaWx0QW5nbGU7XG5cdFx0dGhpcy5tYXhUaWx0QW5nbGUgPSBtYXhUaWx0QW5nbGU7XG5cdFx0dGhpcy5zdGVwcyA9IHN0ZXBzO1xuXHRcdHRoaXMueUZhY3RvciA9IHlGYWN0b3I7XG5cdFx0dGhpcy53cmFwUGFuQW5nbGUgPSB3cmFwUGFuQW5nbGU7XG5cblx0XHQvL3ZhbHVlcyBwYXNzZWQgaW4gY29udHJ1c3RvciBhcmUgYXBwbGllZCBpbW1lZGlhdGVseVxuXHRcdHRoaXMuX2lDdXJyZW50UGFuQW5nbGUgPSB0aGlzLl9wYW5BbmdsZTtcblx0XHR0aGlzLl9pQ3VycmVudFRpbHRBbmdsZSA9IHRoaXMuX3RpbHRBbmdsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBjdXJyZW50IHRpbHQgYW5nbGUgYW5kIHBhbiBhbmdsZSB2YWx1ZXMuXG5cdCAqXG5cdCAqIFZhbHVlcyBhcmUgY2FsY3VsYXRlZCB1c2luZyB0aGUgZGVmaW5lZCA8Y29kZT50aWx0QW5nbGU8L2NvZGU+LCA8Y29kZT5wYW5BbmdsZTwvY29kZT4gYW5kIDxjb2RlPnN0ZXBzPC9jb2RlPiB2YXJpYWJsZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSBpbnRlcnBvbGF0ZSAgIElmIHRoZSB1cGRhdGUgdG8gYSB0YXJnZXQgcGFuLSBvciB0aWx0QW5nbGUgaXMgaW50ZXJwb2xhdGVkLiBEZWZhdWx0IGlzIHRydWUuXG5cdCAqXG5cdCAqIEBzZWUgICAgI3RpbHRBbmdsZVxuXHQgKiBAc2VlICAgICNwYW5BbmdsZVxuXHQgKiBAc2VlICAgICNzdGVwc1xuXHQgKi9cblx0cHVibGljIHVwZGF0ZShpbnRlcnBvbGF0ZTpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdGlmICh0aGlzLl90aWx0QW5nbGUgIT0gdGhpcy5faUN1cnJlbnRUaWx0QW5nbGUgfHwgdGhpcy5fcGFuQW5nbGUgIT0gdGhpcy5faUN1cnJlbnRQYW5BbmdsZSkge1xuXG5cdFx0XHR0aGlzLnBOb3RpZnlVcGRhdGUoKTtcblxuXHRcdFx0aWYgKHRoaXMuX3dyYXBQYW5BbmdsZSkge1xuXHRcdFx0XHRpZiAodGhpcy5fcGFuQW5nbGUgPCAwKSB7XG5cdFx0XHRcdFx0dGhpcy5faUN1cnJlbnRQYW5BbmdsZSArPSB0aGlzLl9wYW5BbmdsZSUzNjAgKyAzNjAgLSB0aGlzLl9wYW5BbmdsZTtcblx0XHRcdFx0XHR0aGlzLl9wYW5BbmdsZSA9IHRoaXMuX3BhbkFuZ2xlJTM2MCArIDM2MDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0aGlzLl9pQ3VycmVudFBhbkFuZ2xlICs9IHRoaXMuX3BhbkFuZ2xlJTM2MCAtIHRoaXMuX3BhbkFuZ2xlO1xuXHRcdFx0XHRcdHRoaXMuX3BhbkFuZ2xlID0gdGhpcy5fcGFuQW5nbGUlMzYwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0d2hpbGUgKHRoaXMuX3BhbkFuZ2xlIC0gdGhpcy5faUN1cnJlbnRQYW5BbmdsZSA8IC0xODApXG5cdFx0XHRcdFx0dGhpcy5faUN1cnJlbnRQYW5BbmdsZSAtPSAzNjA7XG5cblx0XHRcdFx0d2hpbGUgKHRoaXMuX3BhbkFuZ2xlIC0gdGhpcy5faUN1cnJlbnRQYW5BbmdsZSA+IDE4MClcblx0XHRcdFx0XHR0aGlzLl9pQ3VycmVudFBhbkFuZ2xlICs9IDM2MDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGludGVycG9sYXRlKSB7XG5cdFx0XHRcdHRoaXMuX2lDdXJyZW50VGlsdEFuZ2xlICs9ICh0aGlzLl90aWx0QW5nbGUgLSB0aGlzLl9pQ3VycmVudFRpbHRBbmdsZSkvKHRoaXMuc3RlcHMgKyAxKTtcblx0XHRcdFx0dGhpcy5faUN1cnJlbnRQYW5BbmdsZSArPSAodGhpcy5fcGFuQW5nbGUgLSB0aGlzLl9pQ3VycmVudFBhbkFuZ2xlKS8odGhpcy5zdGVwcyArIDEpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5faUN1cnJlbnRQYW5BbmdsZSA9IHRoaXMuX3BhbkFuZ2xlO1xuXHRcdFx0XHR0aGlzLl9pQ3VycmVudFRpbHRBbmdsZSA9IHRoaXMuX3RpbHRBbmdsZTtcblx0XHRcdH1cblxuXHRcdFx0Ly9zbmFwIGNvb3JkcyBpZiBhbmdsZSBkaWZmZXJlbmNlcyBhcmUgY2xvc2Vcblx0XHRcdGlmICgoTWF0aC5hYnModGhpcy50aWx0QW5nbGUgLSB0aGlzLl9pQ3VycmVudFRpbHRBbmdsZSkgPCAwLjAxKSAmJiAoTWF0aC5hYnModGhpcy5fcGFuQW5nbGUgLSB0aGlzLl9pQ3VycmVudFBhbkFuZ2xlKSA8IDAuMDEpKSB7XG5cdFx0XHRcdHRoaXMuX2lDdXJyZW50VGlsdEFuZ2xlID0gdGhpcy5fdGlsdEFuZ2xlO1xuXHRcdFx0XHR0aGlzLl9pQ3VycmVudFBhbkFuZ2xlID0gdGhpcy5fcGFuQW5nbGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dmFyIHBvczpWZWN0b3IzRCA9ICh0aGlzLmxvb2tBdE9iamVjdCk/IHRoaXMubG9va0F0T2JqZWN0LnRyYW5zZm9ybS5wb3NpdGlvbiA6ICh0aGlzLmxvb2tBdFBvc2l0aW9uKT8gdGhpcy5sb29rQXRQb3NpdGlvbiA6IHRoaXMuX3BPcmlnaW47XG5cdFx0dGhpcy50YXJnZXRPYmplY3QueCA9IHBvcy54ICsgdGhpcy5kaXN0YW5jZSpNYXRoLnNpbih0aGlzLl9pQ3VycmVudFBhbkFuZ2xlKk1hdGhDb25zdHMuREVHUkVFU19UT19SQURJQU5TKSpNYXRoLmNvcyh0aGlzLl9pQ3VycmVudFRpbHRBbmdsZSpNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUyk7XG5cdFx0dGhpcy50YXJnZXRPYmplY3QueSA9IHBvcy55ICsgdGhpcy5kaXN0YW5jZSpNYXRoLnNpbih0aGlzLl9pQ3VycmVudFRpbHRBbmdsZSpNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUykqdGhpcy55RmFjdG9yO1xuXHRcdHRoaXMudGFyZ2V0T2JqZWN0LnogPSBwb3MueiArIHRoaXMuZGlzdGFuY2UqTWF0aC5jb3ModGhpcy5faUN1cnJlbnRQYW5BbmdsZSpNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUykqTWF0aC5jb3ModGhpcy5faUN1cnJlbnRUaWx0QW5nbGUqTWF0aENvbnN0cy5ERUdSRUVTX1RPX1JBRElBTlMpO1xuXG5cdFx0dGhpcy5fdXBBeGlzLnggPSAtTWF0aC5zaW4odGhpcy5faUN1cnJlbnRQYW5BbmdsZSpNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUykqTWF0aC5zaW4odGhpcy5faUN1cnJlbnRUaWx0QW5nbGUqTWF0aENvbnN0cy5ERUdSRUVTX1RPX1JBRElBTlMpO1xuXHRcdHRoaXMuX3VwQXhpcy55ID0gTWF0aC5jb3ModGhpcy5faUN1cnJlbnRUaWx0QW5nbGUqTWF0aENvbnN0cy5ERUdSRUVTX1RPX1JBRElBTlMpO1xuXHRcdHRoaXMuX3VwQXhpcy56ID0gLU1hdGguY29zKHRoaXMuX2lDdXJyZW50UGFuQW5nbGUqTWF0aENvbnN0cy5ERUdSRUVTX1RPX1JBRElBTlMpKk1hdGguc2luKHRoaXMuX2lDdXJyZW50VGlsdEFuZ2xlKk1hdGhDb25zdHMuREVHUkVFU19UT19SQURJQU5TKTtcblxuXHRcdGlmICh0aGlzLl9wVGFyZ2V0T2JqZWN0KSB7XG5cdFx0XHRpZiAodGhpcy5fcExvb2tBdFBvc2l0aW9uKVxuXHRcdFx0XHR0aGlzLl9wVGFyZ2V0T2JqZWN0Lmxvb2tBdCh0aGlzLl9wTG9va0F0UG9zaXRpb24sIHRoaXMuX3VwQXhpcyk7XG5cdFx0XHRlbHNlIGlmICh0aGlzLl9wTG9va0F0T2JqZWN0KVxuXHRcdFx0XHR0aGlzLl9wVGFyZ2V0T2JqZWN0Lmxvb2tBdCh0aGlzLl9wTG9va0F0T2JqZWN0LnNjZW5lPyB0aGlzLl9wTG9va0F0T2JqZWN0LnNjZW5lUG9zaXRpb24gOiB0aGlzLl9wTG9va0F0T2JqZWN0LnRyYW5zZm9ybS5wb3NpdGlvbiwgdGhpcy5fdXBBeGlzKTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0ID0gSG92ZXJDb250cm9sbGVyOyJdfQ== \ No newline at end of file diff --git a/lib/controllers/HoverController.ts b/lib/controllers/HoverController.ts new file mode 100644 index 00000000..672d1b4b --- /dev/null +++ b/lib/controllers/HoverController.ts @@ -0,0 +1,318 @@ +import LookAtController = require("awayjs-core/lib/controllers/LookAtController"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** + * Extended camera used to hover round a specified target object. + * + * @see away.containers.View + */ +class HoverController extends LookAtController +{ + public _iCurrentPanAngle:number = 0; + public _iCurrentTiltAngle:number = 90; + + private _panAngle:number = 0; + private _tiltAngle:number = 90; + private _distance:number = 1000; + private _minPanAngle:number = -Infinity; + private _maxPanAngle:number = Infinity; + private _minTiltAngle:number = -90; + private _maxTiltAngle:number = 90; + private _steps:number = 8; + private _yFactor:number = 2; + private _wrapPanAngle:boolean = false; + private _upAxis:Vector3D = new Vector3D(); + + /** + * Fractional step taken each time the hover() method is called. Defaults to 8. + * + * Affects the speed at which the tiltAngle and panAngle resolve to their targets. + * + * @see #tiltAngle + * @see #panAngle + */ + public get steps():number + { + return this._steps; + } + + public set steps(val:number) + { + val = (val < 1)? 1 : val; + + if (this._steps == val) + return; + + this._steps = val; + + this.pNotifyUpdate(); + } + + /** + * Rotation of the camera in degrees around the y axis. Defaults to 0. + */ + public get panAngle():number + { + return this._panAngle; + } + + public set panAngle(val:number) + { + val = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, val)); + + if (this._panAngle == val) + return; + + this._panAngle = val; + + this.pNotifyUpdate(); + } + + /** + * Elevation angle of the camera in degrees. Defaults to 90. + */ + public get tiltAngle():number + { + return this._tiltAngle; + } + + public set tiltAngle(val:number) + { + val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); + + if (this._tiltAngle == val) + return; + + this._tiltAngle = val; + + this.pNotifyUpdate(); + } + + /** + * Distance between the camera and the specified target. Defaults to 1000. + */ + public get distance():number + { + return this._distance; + } + + public set distance(val:number) + { + if (this._distance == val) + return; + + this._distance = val; + + this.pNotifyUpdate(); + } + + /** + * Minimum bounds for the panAngle. Defaults to -Infinity. + * + * @see #panAngle + */ + public get minPanAngle():number + { + return this._minPanAngle; + } + + public set minPanAngle(val:number) + { + if (this._minPanAngle == val) + return; + + this._minPanAngle = val; + + this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); + } + + /** + * Maximum bounds for the panAngle. Defaults to Infinity. + * + * @see #panAngle + */ + public get maxPanAngle():number + { + return this._maxPanAngle; + } + + public set maxPanAngle(val:number) + { + if (this._maxPanAngle == val) + return; + + this._maxPanAngle = val; + + this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); + } + + /** + * Minimum bounds for the tiltAngle. Defaults to -90. + * + * @see #tiltAngle + */ + public get minTiltAngle():number + { + return this._minTiltAngle; + } + + public set minTiltAngle(val:number) + { + if (this._minTiltAngle == val) + return; + + this._minTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + } + + /** + * Maximum bounds for the tiltAngle. Defaults to 90. + * + * @see #tiltAngle + */ + public get maxTiltAngle():number + { + return this._maxTiltAngle; + } + + public set maxTiltAngle(val:number) + { + if (this._maxTiltAngle == val) + return; + + this._maxTiltAngle = val; + + this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); + } + + /** + * Fractional difference in distance between the horizontal camera orientation and vertical camera orientation. Defaults to 2. + * + * @see #distance + */ + public get yFactor():number + { + return this._yFactor; + } + + public set yFactor(val:number) + { + if (this._yFactor == val) + return; + + this._yFactor = val; + + this.pNotifyUpdate(); + } + + /** + * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. + */ + public get wrapPanAngle():boolean + { + return this._wrapPanAngle; + } + + public set wrapPanAngle(val:boolean) + { + if (this._wrapPanAngle == val) + return; + + this._wrapPanAngle = val; + + this.pNotifyUpdate(); + } + + /** + * Creates a new HoverController object. + */ + constructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, panAngle:number = 0, tiltAngle:number = 90, distance:number = 1000, minTiltAngle:number = -90, maxTiltAngle:number = 90, minPanAngle:number = null, maxPanAngle:number = null, steps:number = 8, yFactor:number = 2, wrapPanAngle:boolean = false) + { + super(targetObject, lookAtObject); + + this.distance = distance; + this.panAngle = panAngle; + this.tiltAngle = tiltAngle; + this.minPanAngle = ( minPanAngle != null )? minPanAngle : -Infinity; + this.maxPanAngle = ( maxPanAngle != null )? maxPanAngle : Infinity; + this.minTiltAngle = minTiltAngle; + this.maxTiltAngle = maxTiltAngle; + this.steps = steps; + this.yFactor = yFactor; + this.wrapPanAngle = wrapPanAngle; + + //values passed in contrustor are applied immediately + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + + /** + * Updates the current tilt angle and pan angle values. + * + * Values are calculated using the defined tiltAngle, panAngle and steps variables. + * + * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. + * + * @see #tiltAngle + * @see #panAngle + * @see #steps + */ + public update(interpolate:boolean = true) + { + if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { + + this.pNotifyUpdate(); + + if (this._wrapPanAngle) { + if (this._panAngle < 0) { + this._iCurrentPanAngle += this._panAngle%360 + 360 - this._panAngle; + this._panAngle = this._panAngle%360 + 360; + } else { + this._iCurrentPanAngle += this._panAngle%360 - this._panAngle; + this._panAngle = this._panAngle%360; + } + + while (this._panAngle - this._iCurrentPanAngle < -180) + this._iCurrentPanAngle -= 360; + + while (this._panAngle - this._iCurrentPanAngle > 180) + this._iCurrentPanAngle += 360; + } + + if (interpolate) { + this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle)/(this.steps + 1); + this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle)/(this.steps + 1); + } else { + this._iCurrentPanAngle = this._panAngle; + this._iCurrentTiltAngle = this._tiltAngle; + } + + //snap coords if angle differences are close + if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { + this._iCurrentTiltAngle = this._tiltAngle; + this._iCurrentPanAngle = this._panAngle; + } + } + + var pos:Vector3D = (this.lookAtObject)? this.lookAtObject.transform.position : (this.lookAtPosition)? this.lookAtPosition : this._pOrigin; + this.targetObject.x = pos.x + this.distance*Math.sin(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); + this.targetObject.y = pos.y + this.distance*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS)*this.yFactor; + this.targetObject.z = pos.z + this.distance*Math.cos(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); + + this._upAxis.x = -Math.sin(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); + this._upAxis.y = Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); + this._upAxis.z = -Math.cos(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); + + if (this._pTargetObject) { + if (this._pLookAtPosition) + this._pTargetObject.lookAt(this._pLookAtPosition, this._upAxis); + else if (this._pLookAtObject) + this._pTargetObject.lookAt(this._pLookAtObject.scene? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position, this._upAxis); + } + } +} + +export = HoverController; \ No newline at end of file diff --git a/lib/controllers/LookAtController.js b/lib/controllers/LookAtController.js new file mode 100755 index 00000000..b97fb5ba --- /dev/null +++ b/lib/controllers/LookAtController.js @@ -0,0 +1,93 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var DisplayObjectEvent = require("awayjs-core/lib/events/DisplayObjectEvent"); + +var LookAtController = (function (_super) { + __extends(LookAtController, _super); + function LookAtController(targetObject, lookAtObject) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof lookAtObject === "undefined") { lookAtObject = null; } + var _this = this; + _super.call(this, targetObject); + this._pOrigin = new Vector3D(0.0, 0.0, 0.0); + + this._onLookAtObjectChangedDelegate = function (event) { + return _this.onLookAtObjectChanged(event); + }; + + if (lookAtObject) + this.lookAtObject = lookAtObject; + else + this.lookAtPosition = new Vector3D(); + } + Object.defineProperty(LookAtController.prototype, "lookAtPosition", { + get: function () { + return this._pLookAtPosition; + }, + set: function (val) { + if (this._pLookAtObject) { + this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + this._pLookAtObject = null; + } + + this._pLookAtPosition = val; + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LookAtController.prototype, "lookAtObject", { + get: function () { + return this._pLookAtObject; + }, + set: function (val) { + if (this._pLookAtPosition) + this._pLookAtPosition = null; + + if (this._pLookAtObject == val) + return; + + if (this._pLookAtObject) + this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + + this._pLookAtObject = val; + + if (this._pLookAtObject) + this._pLookAtObject.addEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + + this.pNotifyUpdate(); + }, + enumerable: true, + configurable: true + }); + + + //@override + LookAtController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + if (this._pTargetObject) { + if (this._pLookAtPosition) + this._pTargetObject.lookAt(this._pLookAtPosition); + else if (this._pLookAtObject) + this._pTargetObject.lookAt(this._pLookAtObject.scene ? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position); + } + }; + + LookAtController.prototype.onLookAtObjectChanged = function (event) { + this.pNotifyUpdate(); + }; + return LookAtController; +})(ControllerBase); + +module.exports = LookAtController; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRyb2xsZXJzL0xvb2tBdENvbnRyb2xsZXIudHMiXSwibmFtZXMiOlsiTG9va0F0Q29udHJvbGxlciIsIkxvb2tBdENvbnRyb2xsZXIuY29uc3RydWN0b3IiLCJMb29rQXRDb250cm9sbGVyLnVwZGF0ZSIsIkxvb2tBdENvbnRyb2xsZXIub25Mb29rQXRPYmplY3RDaGFuZ2VkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwRUFBZ0Y7O0FBRWhGLDREQUFvRTtBQUNwRSw2RUFBa0Y7O0FBRWxGO0lBQStCQSxtQ0FBY0E7SUFRNUNBLDBCQUFZQSxZQUFpQ0EsRUFBRUEsWUFBaUNBO1FBQXBFQywyQ0FBQUEsWUFBWUEsR0FBaUJBLElBQUlBO0FBQUFBLFFBQUVBLDJDQUFBQSxZQUFZQSxHQUFpQkEsSUFBSUE7QUFBQUEsUUFBaEZBLGlCQVVDQTtRQVJBQSxXQUFNQSxPQUFBQSxZQUFZQSxDQUFDQTtRQU5wQkEsS0FBT0EsUUFBUUEsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1FBUXREQSxJQUFJQSxDQUFDQSw4QkFBOEJBLEdBQUdBLFVBQUNBLEtBQXdCQTttQkFBS0EsS0FBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUFqQ0EsQ0FBaUNBOztRQUVyR0EsSUFBSUEsWUFBWUE7WUFDZkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsWUFBWUE7O1lBRWhDQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUN2Q0EsQ0FBQ0E7SUFFREQ7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQTtRQUM3QkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBMEJBLEdBQVlBO1lBRXJDQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFFQTtnQkFDeEJBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLG1CQUFtQkEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxzQkFBc0JBLEVBQUVBLElBQUlBLENBQUNBLDhCQUE4QkEsQ0FBQ0E7Z0JBQ3ZIQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxJQUFJQTthQUMxQkE7O1lBRURBLElBQUlBLENBQUNBLGdCQUFnQkEsR0FBR0EsR0FBR0E7WUFDM0JBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO1FBQ3JCQSxDQUFDQTs7OztBQVhBQTs7SUFhREE7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsY0FBY0E7UUFDM0JBLENBQUNBO1FBRURBLEtBQUFBLFVBQXdCQSxHQUFpQkE7WUFFeENBLElBQUlBLElBQUlBLENBQUNBLGdCQUFnQkE7Z0JBQ3hCQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLElBQUlBLENBQUNBOztZQUU5QkEsSUFBSUEsSUFBSUEsQ0FBQ0EsY0FBY0EsSUFBSUEsR0FBR0E7Z0JBQzdCQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsSUFBSUEsQ0FBQ0EsY0FBY0E7Z0JBQ3RCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxtQkFBbUJBLENBQUNBLGtCQUFrQkEsQ0FBQ0Esc0JBQXNCQSxFQUFFQSxJQUFJQSxDQUFDQSw4QkFBOEJBLENBQUNBLENBQUNBOztZQUV6SEEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsR0FBR0E7O1lBRXpCQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQTtnQkFDdEJBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLGdCQUFnQkEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxzQkFBc0JBLEVBQUVBLElBQUlBLENBQUNBLDhCQUE4QkEsQ0FBQ0EsQ0FBQ0E7O1lBRXRIQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTtRQUNyQkEsQ0FBQ0E7Ozs7QUFuQkFBOztJQXNCREEsV0FEV0E7d0NBQ1hBLFVBQWNBLFdBQTBCQTtRQUExQkUsMENBQUFBLFdBQVdBLEdBQVdBLElBQUlBO0FBQUFBLFFBRXZDQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFFQTtZQUN4QkEsSUFBSUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQTtnQkFDeEJBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0E7aUJBQzdDQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQTtnQkFDM0JBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLEtBQUtBLEdBQUVBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFNBQVNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO1NBQ25JQTtJQUNGQSxDQUFDQTs7SUFFREYsbURBQUFBLFVBQThCQSxLQUF3QkE7UUFFckRHLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO0lBQ3JCQSxDQUFDQTtJQUNGSCx3QkFBQ0E7QUFBREEsQ0FBQ0EsRUEzRThCLGNBQWMsRUEyRTVDOztBQUVELGlDQUEwQixDQUFBIiwiZmlsZSI6ImNvbnRyb2xsZXJzL0xvb2tBdENvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29udHJvbGxlckJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udHJvbGxlcnMvQ29udHJvbGxlckJhc2VcIik7XG5pbXBvcnQgRGlzcGxheU9iamVjdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvRGlzcGxheU9iamVjdFwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RFdmVudFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0Rpc3BsYXlPYmplY3RFdmVudFwiKTtcblxuY2xhc3MgTG9va0F0Q29udHJvbGxlciBleHRlbmRzIENvbnRyb2xsZXJCYXNlXG57XG5cdHB1YmxpYyBfcExvb2tBdFBvc2l0aW9uOlZlY3RvcjNEO1xuXHRwdWJsaWMgX3BMb29rQXRPYmplY3Q6RGlzcGxheU9iamVjdDtcblx0cHVibGljIF9wT3JpZ2luOlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKDAuMCwgMC4wLCAwLjApO1xuXG5cdHByaXZhdGUgX29uTG9va0F0T2JqZWN0Q2hhbmdlZERlbGVnYXRlOihldmVudDpEaXNwbGF5T2JqZWN0RXZlbnQpID0+IHZvaWQ7XG5cblx0Y29uc3RydWN0b3IodGFyZ2V0T2JqZWN0OkRpc3BsYXlPYmplY3QgPSBudWxsLCBsb29rQXRPYmplY3Q6RGlzcGxheU9iamVjdCA9IG51bGwpXG5cdHtcblx0XHRzdXBlcih0YXJnZXRPYmplY3QpO1xuXG5cdFx0dGhpcy5fb25Mb29rQXRPYmplY3RDaGFuZ2VkRGVsZWdhdGUgPSAoZXZlbnQ6RGlzcGxheU9iamVjdEV2ZW50KSA9PiB0aGlzLm9uTG9va0F0T2JqZWN0Q2hhbmdlZChldmVudCk7XG5cblx0XHRpZiAobG9va0F0T2JqZWN0KVxuXHRcdFx0dGhpcy5sb29rQXRPYmplY3QgPSBsb29rQXRPYmplY3Q7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5sb29rQXRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzRCgpO1xuXHR9XG5cblx0cHVibGljIGdldCBsb29rQXRQb3NpdGlvbigpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcExvb2tBdFBvc2l0aW9uO1xuXHR9XG5cblx0cHVibGljIHNldCBsb29rQXRQb3NpdGlvbih2YWw6VmVjdG9yM0QpXG5cdHtcblx0XHRpZiAodGhpcy5fcExvb2tBdE9iamVjdCkge1xuXHRcdFx0dGhpcy5fcExvb2tBdE9iamVjdC5yZW1vdmVFdmVudExpc3RlbmVyKERpc3BsYXlPYmplY3RFdmVudC5TQ0VORVRSQU5TRk9STV9DSEFOR0VELCB0aGlzLl9vbkxvb2tBdE9iamVjdENoYW5nZWREZWxlZ2F0ZSk7XG5cdFx0XHR0aGlzLl9wTG9va0F0T2JqZWN0ID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9wTG9va0F0UG9zaXRpb24gPSB2YWw7XG5cdFx0dGhpcy5wTm90aWZ5VXBkYXRlKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGxvb2tBdE9iamVjdCgpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wTG9va0F0T2JqZWN0O1xuXHR9XG5cblx0cHVibGljIHNldCBsb29rQXRPYmplY3QodmFsOkRpc3BsYXlPYmplY3QpXG5cdHtcblx0XHRpZiAodGhpcy5fcExvb2tBdFBvc2l0aW9uKVxuXHRcdFx0dGhpcy5fcExvb2tBdFBvc2l0aW9uID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLl9wTG9va0F0T2JqZWN0ID09IHZhbClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLl9wTG9va0F0T2JqZWN0KVxuXHRcdFx0dGhpcy5fcExvb2tBdE9iamVjdC5yZW1vdmVFdmVudExpc3RlbmVyKERpc3BsYXlPYmplY3RFdmVudC5TQ0VORVRSQU5TRk9STV9DSEFOR0VELCB0aGlzLl9vbkxvb2tBdE9iamVjdENoYW5nZWREZWxlZ2F0ZSk7XG5cblx0XHR0aGlzLl9wTG9va0F0T2JqZWN0ID0gdmFsO1xuXG5cdFx0aWYgKHRoaXMuX3BMb29rQXRPYmplY3QpXG5cdFx0XHR0aGlzLl9wTG9va0F0T2JqZWN0LmFkZEV2ZW50TGlzdGVuZXIoRGlzcGxheU9iamVjdEV2ZW50LlNDRU5FVFJBTlNGT1JNX0NIQU5HRUQsIHRoaXMuX29uTG9va0F0T2JqZWN0Q2hhbmdlZERlbGVnYXRlKTtcblxuXHRcdHRoaXMucE5vdGlmeVVwZGF0ZSgpO1xuXHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIHVwZGF0ZShpbnRlcnBvbGF0ZTpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdGlmICh0aGlzLl9wVGFyZ2V0T2JqZWN0KSB7XG5cdFx0XHRpZiAodGhpcy5fcExvb2tBdFBvc2l0aW9uKVxuXHRcdFx0XHR0aGlzLl9wVGFyZ2V0T2JqZWN0Lmxvb2tBdCh0aGlzLl9wTG9va0F0UG9zaXRpb24pO1xuXHRcdFx0ZWxzZSBpZiAodGhpcy5fcExvb2tBdE9iamVjdClcblx0XHRcdFx0dGhpcy5fcFRhcmdldE9iamVjdC5sb29rQXQodGhpcy5fcExvb2tBdE9iamVjdC5zY2VuZT8gdGhpcy5fcExvb2tBdE9iamVjdC5zY2VuZVBvc2l0aW9uIDogdGhpcy5fcExvb2tBdE9iamVjdC50cmFuc2Zvcm0ucG9zaXRpb24pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgb25Mb29rQXRPYmplY3RDaGFuZ2VkKGV2ZW50OkRpc3BsYXlPYmplY3RFdmVudClcblx0e1xuXHRcdHRoaXMucE5vdGlmeVVwZGF0ZSgpO1xuXHR9XG59XG5cbmV4cG9ydCA9IExvb2tBdENvbnRyb2xsZXI7Il19 \ No newline at end of file diff --git a/lib/controllers/LookAtController.ts b/lib/controllers/LookAtController.ts new file mode 100644 index 00000000..859d4230 --- /dev/null +++ b/lib/controllers/LookAtController.ts @@ -0,0 +1,83 @@ +import ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import DisplayObjectEvent = require("awayjs-core/lib/events/DisplayObjectEvent"); + +class LookAtController extends ControllerBase +{ + public _pLookAtPosition:Vector3D; + public _pLookAtObject:DisplayObject; + public _pOrigin:Vector3D = new Vector3D(0.0, 0.0, 0.0); + + private _onLookAtObjectChangedDelegate:(event:DisplayObjectEvent) => void; + + constructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null) + { + super(targetObject); + + this._onLookAtObjectChangedDelegate = (event:DisplayObjectEvent) => this.onLookAtObjectChanged(event); + + if (lookAtObject) + this.lookAtObject = lookAtObject; + else + this.lookAtPosition = new Vector3D(); + } + + public get lookAtPosition():Vector3D + { + return this._pLookAtPosition; + } + + public set lookAtPosition(val:Vector3D) + { + if (this._pLookAtObject) { + this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + this._pLookAtObject = null; + } + + this._pLookAtPosition = val; + this.pNotifyUpdate(); + } + + public get lookAtObject():DisplayObject + { + return this._pLookAtObject; + } + + public set lookAtObject(val:DisplayObject) + { + if (this._pLookAtPosition) + this._pLookAtPosition = null; + + if (this._pLookAtObject == val) + return; + + if (this._pLookAtObject) + this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + + this._pLookAtObject = val; + + if (this._pLookAtObject) + this._pLookAtObject.addEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); + + this.pNotifyUpdate(); + } + + //@override + public update(interpolate:boolean = true) + { + if (this._pTargetObject) { + if (this._pLookAtPosition) + this._pTargetObject.lookAt(this._pLookAtPosition); + else if (this._pLookAtObject) + this._pTargetObject.lookAt(this._pLookAtObject.scene? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position); + } + } + + private onLookAtObjectChanged(event:DisplayObjectEvent) + { + this.pNotifyUpdate(); + } +} + +export = LookAtController; \ No newline at end of file diff --git a/lib/controllers/SpringController.js b/lib/controllers/SpringController.js new file mode 100755 index 00000000..62b1f1f6 --- /dev/null +++ b/lib/controllers/SpringController.js @@ -0,0 +1,77 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var LookAtController = require("awayjs-core/lib/controllers/LookAtController"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* Uses spring physics to animate the target object towards a position that is +* defined as the lookAtTarget object's position plus the vector defined by the +* positionOffset property. +*/ +var SpringController = (function (_super) { + __extends(SpringController, _super); + function SpringController(targetObject, lookAtObject, stiffness, mass, damping) { + if (typeof targetObject === "undefined") { targetObject = null; } + if (typeof lookAtObject === "undefined") { lookAtObject = null; } + if (typeof stiffness === "undefined") { stiffness = 1; } + if (typeof mass === "undefined") { mass = 40; } + if (typeof damping === "undefined") { damping = 4; } + _super.call(this, targetObject, lookAtObject); + /** + * Offset of spring center from target in target object space, ie: Where the camera should ideally be in the target object space. + */ + this.positionOffset = new Vector3D(0, 500, -1000); + + this.stiffness = stiffness; + this.damping = damping; + this.mass = mass; + + this._velocity = new Vector3D(); + this._dv = new Vector3D(); + this._stretch = new Vector3D(); + this._force = new Vector3D(); + this._acceleration = new Vector3D(); + this._desiredPosition = new Vector3D(); + } + SpringController.prototype.update = function (interpolate) { + if (typeof interpolate === "undefined") { interpolate = true; } + var offs; + + if (!this._pLookAtObject || !this._pTargetObject) + return; + + offs = this._pLookAtObject.transform.matrix3D.deltaTransformVector(this.positionOffset); + this._desiredPosition.x = this._pLookAtObject.x + offs.x; + this._desiredPosition.y = this._pLookAtObject.y + offs.y; + this._desiredPosition.z = this._pLookAtObject.z + offs.z; + + this._stretch = this._pTargetObject.transform.position.add(this._desiredPosition); + this._stretch.scaleBy(-this.stiffness); + + this._dv.copyFrom(this._velocity); + this._dv.scaleBy(this.damping); + + this._force.x = this._stretch.x - this._dv.x; + this._force.y = this._stretch.y - this._dv.y; + this._force.z = this._stretch.z - this._dv.z; + + this._acceleration.copyFrom(this._force); + this._acceleration.scaleBy(1 / this.mass); + + this._velocity.incrementBy(this._acceleration); + + this._pTargetObject.transform.position = this._pTargetObject.transform.position.add(this._velocity); + + _super.prototype.update.call(this); + }; + return SpringController; +})(LookAtController); + +module.exports = SpringController; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbnRyb2xsZXJzL1NwcmluZ0NvbnRyb2xsZXIudHMiXSwibmFtZXMiOlsiU3ByaW5nQ29udHJvbGxlciIsIlNwcmluZ0NvbnRyb2xsZXIuY29uc3RydWN0b3IiLCJTcHJpbmdDb250cm9sbGVyLnVwZGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOEVBQW9GOztBQUVwRiw0REFBb0U7O0FBRXBFOzs7O0VBSUc7QUFDSDtJQUErQkEsbUNBQWdCQTtJQStCOUNBLDBCQUFZQSxZQUFpQ0EsRUFBRUEsWUFBaUNBLEVBQUVBLFNBQW9CQSxFQUFFQSxJQUFnQkEsRUFBRUEsT0FBa0JBO1FBQWhJQywyQ0FBQUEsWUFBWUEsR0FBaUJBLElBQUlBO0FBQUFBLFFBQUVBLDJDQUFBQSxZQUFZQSxHQUFpQkEsSUFBSUE7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLG1DQUFBQSxJQUFJQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUFFQSxzQ0FBQUEsT0FBT0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFFM0lBLFdBQU1BLE9BQUFBLFlBQVlBLEVBQUVBLFlBQVlBLENBQUNBO1FBUGxDQTs7VUFFR0E7UUFDSEEsS0FBT0EsY0FBY0EsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7O1FBTTVEQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxTQUFTQTtRQUMxQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsT0FBT0E7UUFDdEJBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBOztRQUVoQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7UUFDL0JBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBO1FBQ3pCQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTtRQUM5QkEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBO1FBQ25DQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBO0lBRXZDQSxDQUFDQTtJQUVERCxvQ0FBQUEsVUFBY0EsV0FBMEJBO1FBQTFCRSwwQ0FBQUEsV0FBV0EsR0FBV0EsSUFBSUE7QUFBQUEsUUFFdkNBLElBQUlBLElBQUlBOztRQUVSQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQTtZQUMvQ0EsTUFBT0EsQ0FBQUE7O1FBRVJBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFNBQVNBLENBQUNBLFFBQVFBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0E7UUFDdkZBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7UUFDeERBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7UUFDeERBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7O1FBRXhEQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxTQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBO1FBQ2pGQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTs7UUFFdENBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBO1FBQ2pDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQTs7UUFFOUJBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1FBQzVDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtRQUM1Q0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1FBRTVDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtRQUN4Q0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7O1FBRXZDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQTs7UUFFOUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFNBQVNBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFNBQVNBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBOztRQUVuR0EsZ0JBQUtBLENBQUNBLE1BQU1BLEtBQUNBLEtBQUFBLENBQUNBO0lBQ2ZBLENBQUNBO0lBQ0ZGLHdCQUFDQTtBQUFEQSxDQUFDQSxFQS9FOEIsZ0JBQWdCLEVBK0U5Qzs7QUFFRCxpQ0FBMEIsQ0FBQSIsImZpbGUiOiJjb250cm9sbGVycy9TcHJpbmdDb250cm9sbGVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExvb2tBdENvbnRyb2xsZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udHJvbGxlcnMvTG9va0F0Q29udHJvbGxlclwiKTtcbmltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5cbi8qKlxuICogVXNlcyBzcHJpbmcgcGh5c2ljcyB0byBhbmltYXRlIHRoZSB0YXJnZXQgb2JqZWN0IHRvd2FyZHMgYSBwb3NpdGlvbiB0aGF0IGlzXG4gKiBkZWZpbmVkIGFzIHRoZSBsb29rQXRUYXJnZXQgb2JqZWN0J3MgcG9zaXRpb24gcGx1cyB0aGUgdmVjdG9yIGRlZmluZWQgYnkgdGhlXG4gKiBwb3NpdGlvbk9mZnNldCBwcm9wZXJ0eS5cbiAqL1xuY2xhc3MgU3ByaW5nQ29udHJvbGxlciBleHRlbmRzIExvb2tBdENvbnRyb2xsZXJcbntcblx0cHJpdmF0ZSBfdmVsb2NpdHk6VmVjdG9yM0Q7XG5cdHByaXZhdGUgX2R2OlZlY3RvcjNEO1xuXHRwcml2YXRlIF9zdHJldGNoOlZlY3RvcjNEO1xuXHRwcml2YXRlIF9mb3JjZTpWZWN0b3IzRDtcblx0cHJpdmF0ZSBfYWNjZWxlcmF0aW9uOlZlY3RvcjNEO1xuXHRwcml2YXRlIF9kZXNpcmVkUG9zaXRpb246VmVjdG9yM0Q7XG5cblx0LyoqXG5cdCAqIFN0aWZmbmVzcyBvZiB0aGUgc3ByaW5nLCBob3cgaGFyZCBpcyBpdCB0byBleHRlbmQuIFRoZSBoaWdoZXIgaXQgaXMsIHRoZSBtb3JlIFwiZml4ZWRcIiB0aGUgY2FtIHdpbGwgYmUuXG5cdCAqIEEgbnVtYmVyIGJldHdlZW4gMSBhbmQgMjAgaXMgcmVjb21tZW5kZWQuXG5cdCAqL1xuXHRwdWJsaWMgc3RpZmZuZXNzOm51bWJlcjtcblxuXHQvKipcblx0ICogRGFtcGluZyBpcyB0aGUgc3ByaW5nIGludGVybmFsIGZyaWN0aW9uLCBvciBob3cgbXVjaCBpdCByZXNpc3RzIHRoZSBcImJvaW5nZ2dnZ1wiIGVmZmVjdC4gVG9vIGhpZ2ggYW5kIHlvdSdsbCBsb3NlIGl0IVxuXHQgKiBBIG51bWJlciBiZXR3ZWVuIDEgYW5kIDIwIGlzIHJlY29tbWVuZGVkLlxuXHQgKi9cblx0cHVibGljIGRhbXBpbmc6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBNYXNzIG9mIHRoZSBjYW1lcmEsIGlmIG92ZXIgMTIwIGFuZCBpdCdsbCBiZSB2ZXJ5IGhlYXZ5IHRvIG1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgbWFzczpudW1iZXI7XG5cblx0LyoqXG5cdCAqIE9mZnNldCBvZiBzcHJpbmcgY2VudGVyIGZyb20gdGFyZ2V0IGluIHRhcmdldCBvYmplY3Qgc3BhY2UsIGllOiBXaGVyZSB0aGUgY2FtZXJhIHNob3VsZCBpZGVhbGx5IGJlIGluIHRoZSB0YXJnZXQgb2JqZWN0IHNwYWNlLlxuXHQgKi9cblx0cHVibGljIHBvc2l0aW9uT2Zmc2V0OlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKDAsIDUwMCwgLTEwMDApO1xuXG5cdGNvbnN0cnVjdG9yKHRhcmdldE9iamVjdDpEaXNwbGF5T2JqZWN0ID0gbnVsbCwgbG9va0F0T2JqZWN0OkRpc3BsYXlPYmplY3QgPSBudWxsLCBzdGlmZm5lc3M6bnVtYmVyID0gMSwgbWFzczpudW1iZXIgPSA0MCwgZGFtcGluZzpudW1iZXIgPSA0KVxuXHR7XG5cdFx0c3VwZXIodGFyZ2V0T2JqZWN0LCBsb29rQXRPYmplY3QpO1xuXG5cdFx0dGhpcy5zdGlmZm5lc3MgPSBzdGlmZm5lc3M7XG5cdFx0dGhpcy5kYW1waW5nID0gZGFtcGluZztcblx0XHR0aGlzLm1hc3MgPSBtYXNzO1xuXG5cdFx0dGhpcy5fdmVsb2NpdHkgPSBuZXcgVmVjdG9yM0QoKTtcblx0XHR0aGlzLl9kdiA9IG5ldyBWZWN0b3IzRCgpO1xuXHRcdHRoaXMuX3N0cmV0Y2ggPSBuZXcgVmVjdG9yM0QoKTtcblx0XHR0aGlzLl9mb3JjZSA9IG5ldyBWZWN0b3IzRCgpO1xuXHRcdHRoaXMuX2FjY2VsZXJhdGlvbiA9IG5ldyBWZWN0b3IzRCgpO1xuXHRcdHRoaXMuX2Rlc2lyZWRQb3NpdGlvbiA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdH1cblxuXHRwdWJsaWMgdXBkYXRlKGludGVycG9sYXRlOmJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0dmFyIG9mZnM6VmVjdG9yM0Q7XG5cblx0XHRpZiAoIXRoaXMuX3BMb29rQXRPYmplY3QgfHwgIXRoaXMuX3BUYXJnZXRPYmplY3QpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRvZmZzID0gdGhpcy5fcExvb2tBdE9iamVjdC50cmFuc2Zvcm0ubWF0cml4M0QuZGVsdGFUcmFuc2Zvcm1WZWN0b3IodGhpcy5wb3NpdGlvbk9mZnNldCk7XG5cdFx0dGhpcy5fZGVzaXJlZFBvc2l0aW9uLnggPSB0aGlzLl9wTG9va0F0T2JqZWN0LnggKyBvZmZzLng7XG5cdFx0dGhpcy5fZGVzaXJlZFBvc2l0aW9uLnkgPSB0aGlzLl9wTG9va0F0T2JqZWN0LnkgKyBvZmZzLnk7XG5cdFx0dGhpcy5fZGVzaXJlZFBvc2l0aW9uLnogPSB0aGlzLl9wTG9va0F0T2JqZWN0LnogKyBvZmZzLno7XG5cblx0XHR0aGlzLl9zdHJldGNoID0gdGhpcy5fcFRhcmdldE9iamVjdC50cmFuc2Zvcm0ucG9zaXRpb24uYWRkKHRoaXMuX2Rlc2lyZWRQb3NpdGlvbik7XG5cdFx0dGhpcy5fc3RyZXRjaC5zY2FsZUJ5KC10aGlzLnN0aWZmbmVzcyk7XG5cblx0XHR0aGlzLl9kdi5jb3B5RnJvbSh0aGlzLl92ZWxvY2l0eSk7XG5cdFx0dGhpcy5fZHYuc2NhbGVCeSh0aGlzLmRhbXBpbmcpO1xuXG5cdFx0dGhpcy5fZm9yY2UueCA9IHRoaXMuX3N0cmV0Y2gueCAtIHRoaXMuX2R2Lng7XG5cdFx0dGhpcy5fZm9yY2UueSA9IHRoaXMuX3N0cmV0Y2gueSAtIHRoaXMuX2R2Lnk7XG5cdFx0dGhpcy5fZm9yY2UueiA9IHRoaXMuX3N0cmV0Y2gueiAtIHRoaXMuX2R2Lno7XG5cblx0XHR0aGlzLl9hY2NlbGVyYXRpb24uY29weUZyb20odGhpcy5fZm9yY2UpO1xuXHRcdHRoaXMuX2FjY2VsZXJhdGlvbi5zY2FsZUJ5KDEvdGhpcy5tYXNzKTtcblxuXHRcdHRoaXMuX3ZlbG9jaXR5LmluY3JlbWVudEJ5KHRoaXMuX2FjY2VsZXJhdGlvbik7XG5cblx0XHR0aGlzLl9wVGFyZ2V0T2JqZWN0LnRyYW5zZm9ybS5wb3NpdGlvbiA9IHRoaXMuX3BUYXJnZXRPYmplY3QudHJhbnNmb3JtLnBvc2l0aW9uLmFkZCh0aGlzLl92ZWxvY2l0eSk7XG5cblx0XHRzdXBlci51cGRhdGUoKTtcblx0fVxufVxuXG5leHBvcnQgPSBTcHJpbmdDb250cm9sbGVyOyJdfQ== \ No newline at end of file diff --git a/lib/controllers/SpringController.ts b/lib/controllers/SpringController.ts new file mode 100644 index 00000000..b52f0523 --- /dev/null +++ b/lib/controllers/SpringController.ts @@ -0,0 +1,91 @@ +import LookAtController = require("awayjs-core/lib/controllers/LookAtController"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** + * Uses spring physics to animate the target object towards a position that is + * defined as the lookAtTarget object's position plus the vector defined by the + * positionOffset property. + */ +class SpringController extends LookAtController +{ + private _velocity:Vector3D; + private _dv:Vector3D; + private _stretch:Vector3D; + private _force:Vector3D; + private _acceleration:Vector3D; + private _desiredPosition:Vector3D; + + /** + * Stiffness of the spring, how hard is it to extend. The higher it is, the more "fixed" the cam will be. + * A number between 1 and 20 is recommended. + */ + public stiffness:number; + + /** + * Damping is the spring internal friction, or how much it resists the "boinggggg" effect. Too high and you'll lose it! + * A number between 1 and 20 is recommended. + */ + public damping:number; + + /** + * Mass of the camera, if over 120 and it'll be very heavy to move. + */ + public mass:number; + + /** + * Offset of spring center from target in target object space, ie: Where the camera should ideally be in the target object space. + */ + public positionOffset:Vector3D = new Vector3D(0, 500, -1000); + + constructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, stiffness:number = 1, mass:number = 40, damping:number = 4) + { + super(targetObject, lookAtObject); + + this.stiffness = stiffness; + this.damping = damping; + this.mass = mass; + + this._velocity = new Vector3D(); + this._dv = new Vector3D(); + this._stretch = new Vector3D(); + this._force = new Vector3D(); + this._acceleration = new Vector3D(); + this._desiredPosition = new Vector3D(); + + } + + public update(interpolate:boolean = true) + { + var offs:Vector3D; + + if (!this._pLookAtObject || !this._pTargetObject) + return; + + offs = this._pLookAtObject.transform.matrix3D.deltaTransformVector(this.positionOffset); + this._desiredPosition.x = this._pLookAtObject.x + offs.x; + this._desiredPosition.y = this._pLookAtObject.y + offs.y; + this._desiredPosition.z = this._pLookAtObject.z + offs.z; + + this._stretch = this._pTargetObject.transform.position.add(this._desiredPosition); + this._stretch.scaleBy(-this.stiffness); + + this._dv.copyFrom(this._velocity); + this._dv.scaleBy(this.damping); + + this._force.x = this._stretch.x - this._dv.x; + this._force.y = this._stretch.y - this._dv.y; + this._force.z = this._stretch.z - this._dv.z; + + this._acceleration.copyFrom(this._force); + this._acceleration.scaleBy(1/this.mass); + + this._velocity.incrementBy(this._acceleration); + + this._pTargetObject.transform.position = this._pTargetObject.transform.position.add(this._velocity); + + super.update(); + } +} + +export = SpringController; \ No newline at end of file diff --git a/lib/core/base/AlignmentMode.js b/lib/core/base/AlignmentMode.js new file mode 100755 index 00000000..29e3cdd2 --- /dev/null +++ b/lib/core/base/AlignmentMode.js @@ -0,0 +1,15 @@ +/** +* +*/ +var AlignmentMode = (function () { + function AlignmentMode() { + } + AlignmentMode.REGISTRATION_POINT = "registrationPoint"; + + AlignmentMode.PIVOT_POINT = "pivot"; + return AlignmentMode; +})(); + +module.exports = AlignmentMode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9BbGlnbm1lbnRNb2RlLnRzIl0sIm5hbWVzIjpbIkFsaWdubWVudE1vZGUiLCJBbGlnbm1lbnRNb2RlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7RUFFRztBQUNIO0lBQUFBO0lBV0FDLENBQUNBO0FBQUFELElBTkFBLG1DQUEwQ0EsbUJBQW1CQTs7SUFLN0RBLDRCQUFtQ0EsT0FBT0E7SUFDM0NBLHFCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9BbGlnbm1lbnRNb2RlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKlxuICovXG5jbGFzcyBBbGlnbm1lbnRNb2RlXG57XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBSRUdJU1RSQVRJT05fUE9JTlQ6c3RyaW5nID0gXCJyZWdpc3RyYXRpb25Qb2ludFwiO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBQSVZPVF9QT0lOVDpzdHJpbmcgPSBcInBpdm90XCI7XG59XG5cbmV4cG9ydCA9IEFsaWdubWVudE1vZGU7Il19 \ No newline at end of file diff --git a/lib/core/base/AlignmentMode.ts b/lib/core/base/AlignmentMode.ts new file mode 100644 index 00000000..f77a9a06 --- /dev/null +++ b/lib/core/base/AlignmentMode.ts @@ -0,0 +1,17 @@ +/** + * + */ +class AlignmentMode +{ + /** + * + */ + public static REGISTRATION_POINT:string = "registrationPoint"; + + /** + * + */ + public static PIVOT_POINT:string = "pivot"; +} + +export = AlignmentMode; \ No newline at end of file diff --git a/lib/core/base/BitmapData.js b/lib/core/base/BitmapData.js new file mode 100755 index 00000000..02cb90e9 --- /dev/null +++ b/lib/core/base/BitmapData.js @@ -0,0 +1,513 @@ +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +var ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +/** +* +*/ +var BitmapData = (function () { + /** + * + * @param width + * @param height + * @param transparent + * @param fillColor + */ + function BitmapData(width, height, transparent, fillColor) { + if (typeof transparent === "undefined") { transparent = true; } + if (typeof fillColor === "undefined") { fillColor = null; } + this._alpha = 0; + this._locked = false; + this._transparent = transparent; + this._imageCanvas = document.createElement("canvas"); + this._imageCanvas.width = width; + this._imageCanvas.height = height; + this._context = this._imageCanvas.getContext("2d"); + this._rect = new Rectangle(0, 0, width, height); + + if (fillColor != null) { + if (this._transparent) { + this._alpha = ColorUtils.float32ColorToARGB(fillColor)[0] / 255; + } else { + this._alpha = 1; + } + + this.fillRect(this._rect, fillColor); + } + } + /** + * + */ + BitmapData.prototype.dispose = function () { + this._context = null; + this._imageCanvas = null; + this._imageData = null; + this._rect = null; + this._transparent = null; + this._locked = null; + }; + + /** + * + */ + BitmapData.prototype.lock = function () { + this._locked = true; + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + }; + + /** + * + */ + BitmapData.prototype.unlock = function () { + this._locked = false; + + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + this._imageData = null; + } + }; + + /** + * + * @param x + * @param y + * @param color + */ + BitmapData.prototype.getPixel = function (x, y) { + var r; + var g; + var b; + var a; + + if (!this._locked) { + var pixelData = this._context.getImageData(x, y, 1, 1); + + r = pixelData.data[0]; + g = pixelData.data[1]; + b = pixelData.data[2]; + a = pixelData.data[3]; + } else { + var index = (x + y * this._imageCanvas.width) * 4; + + if (!this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + r = this._imageData.data[index + 0]; + g = this._imageData.data[index + 1]; + b = this._imageData.data[index + 2]; + a = this._imageData.data[index + 3]; + } + + if (!this._locked) { + this._imageData = null; + } + + return (a << 24) | (r << 16) | (g << 8) | b; + }; + + /** + * + * @param x + * @param y + * @param color + */ + BitmapData.prototype.setPixel = function (x, y, color) { + var argb = ColorUtils.float32ColorToARGB(color); + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var index = (x + y * this._imageCanvas.width) * 4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = 255; + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + /** + * + * @param rect + * @param inputByteArray + */ + BitmapData.prototype.setPixels = function (rect, inputByteArray) { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + inputByteArray.position = 0; + var i, j, index; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + index = (i + rect.x + (j + rect.y) * this._imageCanvas.width) * 4; + + this._imageData.data[index + 0] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 1] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 2] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 3] = inputByteArray.readUnsignedInt(); + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + /** + * + * @param x + * @param y + * @param color + */ + BitmapData.prototype.setPixel32 = function (x, y, color) { + var argb = ColorUtils.float32ColorToARGB(color); + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var index = (x + y * this._imageCanvas.width) * 4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = argb[0]; + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + BitmapData.prototype.setVector = function (rect, inputVector) { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var i, j, index, argb; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + argb = ColorUtils.float32ColorToARGB(inputVector[i + j * rect.width]); + index = (i + rect.x + (j + rect.y) * this._imageCanvas.width) * 4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = argb[0]; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + BitmapData.prototype.drawImage = function (img, sourceRect, destRect) { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + } + + this._drawImage(img, sourceRect, destRect); + + if (this._imageData) { + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } + } else { + this._drawImage(img, sourceRect, destRect); + } + }; + + BitmapData.prototype._drawImage = function (img, sourceRect, destRect) { + if (img instanceof BitmapData) + this._context.drawImage(img.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + else if (img instanceof HTMLImageElement) + this._context.drawImage(img, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + }; + + BitmapData.prototype.copyPixels = function (bmpd, sourceRect, destRect) { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + } + + this._copyPixels(bmpd, sourceRect, destRect); + + if (this._imageData) { + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } + } else { + this._copyPixels(bmpd, sourceRect, destRect); + } + }; + + BitmapData.prototype._copyPixels = function (bmpd, sourceRect, destRect) { + if (bmpd instanceof BitmapData) { + this._context.drawImage(bmpd.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + } else if (bmpd instanceof HTMLImageElement) { + this._context.drawImage(bmpd, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + } + }; + + /** + * + * @param rect + * @param color + */ + BitmapData.prototype.fillRect = function (rect, color) { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) apply fill + // 3) read _imageData back out + if (this._imageData) + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + + this._context.fillStyle = this.hexToRGBACSS(color); + this._context.fillRect(rect.x, rect.y, rect.width, rect.height); + + if (this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } else { + this._context.fillStyle = this.hexToRGBACSS(color); + this._context.fillRect(rect.x, rect.y, rect.width, rect.height); + } + }; + + BitmapData.prototype.draw = function (source, matrix) { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + if (this._imageData) + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + + this._draw(source, matrix); + + if (this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } else { + this._draw(source, matrix); + } + }; + + BitmapData.prototype._draw = function (source, matrix) { + if (source instanceof BitmapData) { + this._context.save(); + + if (matrix != null) + this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); + + this._context.drawImage(source.canvas, 0, 0); + this._context.restore(); + } else if (source instanceof HTMLImageElement) { + this._context.save(); + + if (matrix != null) + this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); + + this._context.drawImage(source, 0, 0); + this._context.restore(); + } + }; + + BitmapData.prototype.copyChannel = function (sourceBitmap, sourceRect, destPoint, sourceChannel, destChannel) { + var imageData = sourceBitmap.imageData; + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var sourceData = sourceBitmap.imageData.data; + var destData = this._imageData.data; + + var sourceOffset = Math.round(Math.log(sourceChannel) / Math.log(2)); + var destOffset = Math.round(Math.log(destChannel) / Math.log(2)); + + var i, j, sourceIndex, destIndex; + for (i = 0; i < sourceRect.width; ++i) { + for (j = 0; j < sourceRect.height; ++j) { + sourceIndex = (i + sourceRect.x + (j + sourceRect.y) * sourceBitmap.width) * 4; + destIndex = (i + destPoint.x + (j + destPoint.y) * this.width) * 4; + + destData[destIndex + destOffset] = sourceData[sourceIndex + sourceOffset]; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + BitmapData.prototype.colorTransform = function (rect, colorTransform) { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var data = this._imageData.data; + + var i, j, index; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + index = (i + rect.x + (j + rect.y) * this.width) * 4; + + data[index] = data[index] * colorTransform.redMultiplier + colorTransform.redOffset; + data[index + 1] = data[index + 1] * colorTransform.greenMultiplier + colorTransform.greenOffset; + data[index + 2] = data[index + 2] * colorTransform.blueMultiplier + colorTransform.blueOffset; + data[index + 3] = data[index + 3] * colorTransform.alphaMultiplier + colorTransform.alphaOffset; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + }; + + + Object.defineProperty(BitmapData.prototype, "imageData", { + /** + * + * @returns {ImageData} + */ + get: function () { + return this._context.getImageData(0, 0, this._rect.width, this._rect.height); + }, + /** + * + * @param {ImageData} + */ + set: function (value) { + this._context.putImageData(value, 0, 0); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BitmapData.prototype, "width", { + /** + * + * @returns {number} + */ + get: function () { + return this._imageCanvas.width; + }, + /** + * + * @param {number} + */ + set: function (value) { + this._rect.width = value; + this._imageCanvas.width = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapData.prototype, "height", { + /** + * + * @returns {number} + */ + get: function () { + return this._imageCanvas.height; + }, + /** + * + * @param {number} + */ + set: function (value) { + this._rect.height = value; + this._imageCanvas.height = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapData.prototype, "rect", { + /** + * + * @param {Rectangle} + */ + get: function () { + return this._rect; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BitmapData.prototype, "canvas", { + /** + * + * @returns {HTMLCanvasElement} + */ + get: function () { + return this._imageCanvas; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(BitmapData.prototype, "context", { + /** + * + * @returns {HTMLCanvasElement} + */ + get: function () { + return this._context; + }, + enumerable: true, + configurable: true + }); + + // Private + /** + * convert decimal value to Hex + */ + BitmapData.prototype.hexToRGBACSS = function (d) { + var argb = ColorUtils.float32ColorToARGB(d); + + if (this._transparent == false) { + argb[0] = 1; + + return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] + ')'; + } + + return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] / 255 + ')'; + }; + return BitmapData; +})(); + +module.exports = BitmapData; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9CaXRtYXBEYXRhLnRzIl0sIm5hbWVzIjpbIkJpdG1hcERhdGEiLCJCaXRtYXBEYXRhLmNvbnN0cnVjdG9yIiwiQml0bWFwRGF0YS5kaXNwb3NlIiwiQml0bWFwRGF0YS5sb2NrIiwiQml0bWFwRGF0YS51bmxvY2siLCJCaXRtYXBEYXRhLmdldFBpeGVsIiwiQml0bWFwRGF0YS5zZXRQaXhlbCIsIkJpdG1hcERhdGEuc2V0UGl4ZWxzIiwiQml0bWFwRGF0YS5zZXRQaXhlbDMyIiwiQml0bWFwRGF0YS5zZXRWZWN0b3IiLCJCaXRtYXBEYXRhLmRyYXdJbWFnZSIsIkJpdG1hcERhdGEuX2RyYXdJbWFnZSIsIkJpdG1hcERhdGEuY29weVBpeGVscyIsIkJpdG1hcERhdGEuX2NvcHlQaXhlbHMiLCJCaXRtYXBEYXRhLmZpbGxSZWN0IiwiQml0bWFwRGF0YS5kcmF3IiwiQml0bWFwRGF0YS5fZHJhdyIsIkJpdG1hcERhdGEuY29weUNoYW5uZWwiLCJCaXRtYXBEYXRhLmNvbG9yVHJhbnNmb3JtIiwiQml0bWFwRGF0YS5oZXhUb1JHQkFDU1MiXSwibWFwcGluZ3MiOiJBQUFBLDhEQUVxRTs7QUFHckUsNERBQW1FOztBQUVuRTs7RUFFRztBQUNIO0lBa0JDQTs7Ozs7O01BREdBO0lBQ0hBLG9CQUFZQSxLQUFZQSxFQUFFQSxNQUFhQSxFQUFFQSxXQUEwQkEsRUFBRUEsU0FBdUJBO1FBQW5EQywwQ0FBQUEsV0FBV0EsR0FBV0EsSUFBSUE7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLElBQUlBO0FBQUFBLFFBWDVGQSxLQUFRQSxNQUFNQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUMxQkEsS0FBUUEsT0FBT0EsR0FBV0EsS0FBS0EsQ0FBQ0E7UUFhL0JBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLFdBQVdBO1FBQy9CQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUF1QkEsUUFBUUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7UUFDeEVBLElB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QSxDQUFDQSxDQUFDQSxDQUFDQTtTQUVyQkEsS0FBTUE7WUFDTkEsSUFBSUEsS0FBS0EsR0FBVUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7O1lBRXBEQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQTtnQkFDbkJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBOztZQUV6RkEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDbkNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBO1lBQ25DQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUNuQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FFbkNBOztRQUVEQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQTtZQUNsQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsSUFBSUE7U0FDdEJBOztRQUVEQSxPQUFPQSxDQUFDQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtJQUM1Q0EsQ0FBQ0E7O0lBUURMOzs7OztNQURHQTtvQ0FDSEEsVUFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLEtBQVlBO1FBRWpDTSxJQUFJQSxJQUFJQSxHQUFZQSxVQUFVQSxDQUFDQSxrQkFBa0JBLENBQUNBLEtBQUtBLENBQUNBOztRQUV4REEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0E7WUFDaEJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBOztRQUV6RkEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBRUE7WUFDcEJBLElBQUlBLEtBQUtBLEdBQVVBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEtBQUtBLENBQUNBLEdBQUNBLENBQUNBOztZQUVwREEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDekNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO1lBQ3pDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUN6Q0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0E7U0FDckNBOztRQUVEQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQTtZQUNsQkEsSUFBSUEs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UUFBUUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDekZBLEtBQU1BO1lBQ05BLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLFNBQVNBLEdBQUdBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEtBQUtBLENBQUNBO1lBQ2xEQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUMvREE7SUFDRkEsQ0FBQ0E7O0lBU0RkLDRCQUFBQSxVQUFZQSxNQUFVQSxFQUFFQSxNQUFjQTtRQUVyQ2UsSUFBSUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUE7WUFFakJBLHVCQUF1QkE7WUFDdkJBLEVBQUVBO1lBQ0ZBLHlDQUF5Q0E7WUFDekNBLHNCQUFzQkE7WUFDdEJBLG1DQUFtQ0E7WUFFbkNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBO2dCQUNsQkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsZ0JBQWdCQTtBQUFqQkE7WUFFbkRBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLEVBQUVBLE1BQU1BLENBQUNBOztZQUUxQkEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUE7Z0JBQ2xCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtTQUN6RkEsS0FBTUE7WUFDTkEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsRUFBRUEsTUFBTUEsQ0FBQ0E7U0FDMUJBO0lBQ0ZBLENBQUNBOztJQUlEZiw2QkFBQUEsVUFBY0EsTUFBVUEsRUFBRUEsTUFBYUE7UUFFdENnQixJQUFJQSxNQUFNQSxZQUFZQSxVQUFVQSxDQUFFQTtZQUNqQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7O1lBRXBCQSxJQUFJQSxNQUFNQSxJQUFJQSxJQUFJQTtnQkFDakJBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLFlBQVlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBLEVBQUVBLEVBQUVBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBOztZQUUxRkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7WUFDNUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO1NBRXZCQSxNQUFNQSxJQUFJQSxNQUFNQSxZQUFZQSxnQkFBZ0JBLENBQUVBO1lBQzlDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTs7WUFFcEJBLElBQUlBLE1BQU1BLElBQUlBLElBQUlBO2dCQUNqQkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsTUFBTUEsQ0FBQ0EsRUFBRUEsRUFBRUEsTUFBTUEsQ0FB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Q0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0E7U0FDOUVBOztRQUVEQSxPQUFPQSxPQUFPQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQTtJQUNuRkEsQ0FBQ0E7SUFDRm5CLGtCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9CaXRtYXBEYXRhLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbG9yVHJhbnNmb3JtXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9Db2xvclRyYW5zZm9ybVwiKTtcbmltcG9ydCBNYXRyaXhcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXhcIik7XG5pbXBvcnQgUmVjdGFuZ2xlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1JlY3RhbmdsZVwiKTtcbmltcG9ydCBQb2ludFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1BvaW50XCIpO1xuaW1wb3J0IEJ5dGVBcnJheVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL0J5dGVBcnJheVwiKTtcbmltcG9ydCBDb2xvclV0aWxzXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvQ29sb3JVdGlsc1wiKTtcblxuLyoqXG4gKlxuICovXG5jbGFzcyBCaXRtYXBEYXRhXG57XG5cdHByaXZhdGUgX2ltYWdlQ2FudmFzOkhUTUxDYW52YXNFbGVtZW50O1xuXHRwcml2YXRlIF9jb250ZXh0OkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcblx0cHJpdmF0ZSBfaW1hZ2VEYXRhOkltYWdlRGF0YTtcblx0cHJpdmF0ZSBfcmVjdDpSZWN0YW5nbGU7XG5cdHByaXZhdGUgX3RyYW5zcGFyZW50OmJvb2xlYW47XG5cdHByaXZhdGUgX2FscGhhOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX2xvY2tlZDpib29sZWFuID0gZmFsc2U7XG5cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHdpZHRoXG5cdCAqIEBwYXJhbSBoZWlnaHRcblx0ICogQHBhcmFtIHRyYW5zcGFyZW50XG5cdCAqIEBwYXJhbSBmaWxsQ29sb3Jcblx0ICovXG5cdGNvbnN0cnVjdG9yKHdpZHRoOm51bWJlciwgaGVpZ2h0Om51bWJlciwgdHJhbnNwYXJlbnQ6Ym9vbGVhbiA9IHRydWUsIGZpbGxDb2xvcjpudW1iZXIgPSBudWxsKVxuXHR7XG5cblx0XHR0aGlzLl90cmFuc3BhcmVudCA9IHRyYW5zcGFyZW50O1xuXHRcdHRoaXMuX2ltYWdlQ2FudmFzID0gPEhUTUxDYW52YXNFbGVtZW50PiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuXHRcdHRoaXMuX2ltYWdlQ2FudmFzLndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy5faW1hZ2VDYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdHRoaXMuX2NvbnRleHQgPSB0aGlzLl9pbWFnZUNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG5cdFx0dGhpcy5fcmVjdCA9IG5ldyBSZWN0YW5nbGUoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG5cblx0XHRpZiAoZmlsbENvbG9yICE9IG51bGwpIHtcblxuXHRcdFx0aWYgKHRoaXMuX3RyYW5zcGFyZW50KSB7XG5cdFx0XHRcdHRoaXMuX2FscGhhID0gQ29sb3JVdGlscy5mbG9hdDMyQ29sb3JUb0FSR0IoZmlsbENvbG9yKVswXS8yNTU7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9hbHBoYSA9IDE7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZmlsbFJlY3QodGhpcy5fcmVjdCwgZmlsbENvbG9yKTtcblxuXHRcdH1cblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHR0aGlzLl9jb250ZXh0ID0gbnVsbDtcblx0XHR0aGlzLl9pbWFnZUNhbnZhcyA9IG51bGw7XG5cdFx0dGhpcy5faW1hZ2VEYXRhID0gbnVsbDtcblx0XHR0aGlzLl9yZWN0ID0gbnVsbDtcblx0XHR0aGlzLl90cmFuc3BhcmVudCA9IG51bGw7XG5cdFx0dGhpcy5fbG9ja2VkID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGxvY2soKVxuXHR7XG5cdFx0dGhpcy5fbG9ja2VkID0gdHJ1ZTtcblx0XHR0aGlzLl9pbWFnZURhdGEgPSB0aGlzLl9jb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLl9yZWN0LndpZHRoLCB0aGlzLl9yZWN0LmhlaWdodCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyB1bmxvY2soKVxuXHR7XG5cdFx0dGhpcy5fbG9ja2VkID0gZmFsc2U7XG5cblx0XHRpZiAodGhpcy5faW1hZ2VEYXRhKSB7XG5cdFx0XHR0aGlzLl9jb250ZXh0LnB1dEltYWdlRGF0YSh0aGlzLl9pbWFnZURhdGEsIDAsIDApOyAvLyBhdCBjb29yZHMgMCwwXG5cdFx0XHR0aGlzLl9pbWFnZURhdGEgPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0geFxuXHQgKiBAcGFyYW0geVxuXHQgKiBAcGFyYW0gY29sb3Jcblx0ICovXG5cdHB1YmxpYyBnZXRQaXhlbCh4LCB5KTpudW1iZXJcblx0e1xuXHRcdHZhciByOm51bWJlcjtcblx0XHR2YXIgZzpudW1iZXI7XG5cdFx0dmFyIGI6bnVtYmVyO1xuXHRcdHZhciBhOm51bWJlcjtcblxuXHRcdGlmICghdGhpcy5fbG9ja2VkKSB7XG5cdFx0XHR2YXIgcGl4ZWxEYXRhOkltYWdlRGF0YSA9IHRoaXMuX2NvbnRleHQuZ2V0SW1hZ2VEYXRhKHgsIHksIDEsIDEpO1xuXG5cdFx0XHRyID0gcGl4ZWxEYXRhLmRhdGFbMF07XG5cdFx0XHRnID0gcGl4ZWxEYXRhLmRhdGFbMV07XG5cdFx0XHRiID0gcGl4ZWxEYXRhLmRhdGFbMl07XG5cdFx0XHRhID0gcGl4ZWxEYXRhLmRhdGFbM107XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIGluZGV4Om51bWJlciA9ICh4ICsgeSp0aGlzLl9pbWFnZUNhbnZhcy53aWR0aCkqNDtcblxuXHRcdFx0aWYgKCF0aGlzLl9pbWFnZURhdGEpXG5cdFx0XHRcdHRoaXMuX2ltYWdlRGF0YSA9IHRoaXMuX2NvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMuX3JlY3Qud2lkdGgsIHRoaXMuX3JlY3QuaGVpZ2h0KTtcblxuXHRcdFx0ciA9IHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgMF07XG5cdFx0XHRnID0gdGhpcy5faW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAxXTtcblx0XHRcdGIgPSB0aGlzLl9pbWFnZURhdGEuZGF0YVtpbmRleCArIDJdO1xuXHRcdFx0YSA9IHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgM107XG5cblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuX2xvY2tlZCkge1xuXHRcdFx0dGhpcy5faW1hZ2VEYXRhID0gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gKGEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB4XG5cdCAqIEBwYXJhbSB5XG5cdCAqIEBwYXJhbSBjb2xvclxuXHQgKi9cblx0cHVibGljIHNldFBpeGVsKHgsIHksIGNvbG9yOm51bWJlcilcblx0e1xuXHRcdHZhciBhcmdiOm51bWJlcltdID0gQ29sb3JVdGlscy5mbG9hdDMyQ29sb3JUb0FSR0IoY29sb3IpO1xuXG5cdFx0aWYgKCF0aGlzLl9sb2NrZWQpXG5cdFx0XHR0aGlzLl9pbWFnZURhdGEgPSB0aGlzLl9jb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLl9yZWN0LndpZHRoLCB0aGlzLl9yZWN0LmhlaWdodCk7XG5cblx0XHRpZiAodGhpcy5faW1hZ2VEYXRhKSB7XG5cdFx0XHR2YXIgaW5kZXg6bnVtYmVyID0gKHggKyB5KnRoaXMuX2ltYWdlQ2FudmFzLndpZHRoKSo0O1xuXG5cdFx0XHR0aGlzLl9pbWFnZURhdGEuZGF0YVtpbmRleCArIDBdID0gYXJnYlsxXTtcblx0XHRcdHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgMV0gPSBhcmdiWzJdO1xuXHRcdFx0dGhpcy5faW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAyXSA9IGFyZ2JbM107XG5cdFx0XHR0aGlzLl9pbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID0gMjU1O1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5fbG9ja2VkKSB7XG5cdFx0XHR0aGlzLl9jb250ZXh0LnB1dEltYWdlRGF0YSh0aGlzLl9pbWFnZURhdGEsIDAsIDApO1xuXHRcdFx0dGhpcy5faW1hZ2VEYXRhID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHJlY3Rcblx0ICogQHBhcmFtIGlucHV0Qnl0ZUFycmF5XG5cdCAqL1xuXHRwdWJsaWMgc2V0UGl4ZWxzKHJlY3Q6UmVjdGFuZ2xlLCBpbnB1dEJ5dGVBcnJheTpCeXRlQXJyYXkpXG5cdHtcblx0XHRpZiAoIXRoaXMuX2xvY2tlZClcblx0XHRcdHRoaXMuX2ltYWdlRGF0YSA9IHRoaXMuX2NvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMuX3JlY3Qud2lkdGgsIHRoaXMuX3JlY3QuaGVpZ2h0KTtcblxuXHRcdGlmICh0aGlzLl9pbWFnZURhdGEpIHtcblx0XHRcdGlucHV0Qnl0ZUFycmF5LnBvc2l0aW9uID0gMDtcblx0XHRcdHZhciBpOm51bWJlciAvKnVpbnQqLywgajpudW1iZXIgLyp1aW50Ki8sIGluZGV4Om51bWJlciAvKnVpbnQqLztcblx0XHRcdGZvciAoaSA9IDA7IGkgPCByZWN0LndpZHRoOyArK2kpIHtcblx0XHRcdFx0Zm9yIChqID0gMDsgaiA8IHJlY3QuaGVpZ2h0OyArK2opIHtcblx0XHRcdFx0XHRpbmRleCA9IChpICsgcmVjdC54ICsgKGogKyByZWN0LnkpKnRoaXMuX2ltYWdlQ2FudmFzLndpZHRoKSo0O1xuXG5cdFx0XHRcdFx0dGhpcy5faW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAwXSA9IGlucHV0Qnl0ZUFycmF5LnJlYWRVbnNpZ25lZEludCgpO1xuXHRcdFx0XHRcdHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgMV0gPSBpbnB1dEJ5dGVBcnJheS5yZWFkVW5zaWduZWRJbnQoKTtcblx0XHRcdFx0XHR0aGlzLl9pbWFnZURhdGEuZGF0YVtpbmRleCArIDJdID0gaW5wdXRCeXRlQXJyYXkucmVhZFVuc2lnbmVkSW50KCk7XG5cdFx0XHRcdFx0dGhpcy5faW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAzXSA9IGlucHV0Qnl0ZUFycmF5LnJlYWRVbnNpZ25lZEludCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLl9sb2NrZWQpIHtcblx0XHRcdHRoaXMuX2NvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuX2ltYWdlRGF0YSwgMCwgMCk7XG5cdFx0XHR0aGlzLl9pbWFnZURhdGEgPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0geFxuXHQgKiBAcGFyYW0geVxuXHQgKiBAcGFyYW0gY29sb3Jcblx0ICovXG5cdHB1YmxpYyBzZXRQaXhlbDMyKHgsIHksIGNvbG9yOm51bWJlcilcblx0e1xuXHRcdHZhciBhcmdiOm51bWJlcltdID0gQ29sb3JVdGlscy5mbG9hdDMyQ29sb3JUb0FSR0IoY29sb3IpO1xuXG5cdFx0aWYgKCF0aGlzLl9sb2NrZWQpXG5cdFx0XHR0aGlzLl9pbWFnZURhdGEgPSB0aGlzLl9jb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLl9yZWN0LndpZHRoLCB0aGlzLl9yZWN0LmhlaWdodCk7XG5cblx0XHRpZiAodGhpcy5faW1hZ2VEYXRhKSB7XG5cdFx0XHR2YXIgaW5kZXg6bnVtYmVyID0gKHggKyB5KnRoaXMuX2ltYWdlQ2FudmFzLndpZHRoKSo0O1xuXG5cdFx0XHR0aGlzLl9pbWFnZURhdGEuZGF0YVtpbmRleCArIDBdID0gYXJnYlsxXTtcblx0XHRcdHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgMV0gPSBhcmdiWzJdO1xuXHRcdFx0dGhpcy5faW1hZ2VEYXRhLmRhdGFbaW5kZXggKyAyXSA9IGFyZ2JbM107XG5cdFx0XHR0aGlzLl9pbWFnZURhdGEuZGF0YVtpbmRleCArIDNdID0gYXJnYlswXTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuX2xvY2tlZCkge1xuXHRcdFx0dGhpcy5fY29udGV4dC5wdXRJbWFnZURhdGEodGhpcy5faW1hZ2VEYXRhLCAwLCAwKTtcblx0XHRcdHRoaXMuX2ltYWdlRGF0YSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHNldFZlY3RvcihyZWN0OlJlY3RhbmdsZSwgaW5wdXRWZWN0b3I6QXJyYXk8bnVtYmVyPilcblx0e1xuXHRcdGlmICghdGhpcy5fbG9ja2VkKVxuXHRcdFx0dGhpcy5faW1hZ2VEYXRhID0gdGhpcy5fY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy5fcmVjdC53aWR0aCwgdGhpcy5fcmVjdC5oZWlnaHQpO1xuXG5cdFx0aWYgKHRoaXMuX2ltYWdlRGF0YSkge1xuXHRcdFx0dmFyIGk6bnVtYmVyIC8qdWludCovLCBqOm51bWJlciAvKnVpbnQqLywgaW5kZXg6bnVtYmVyIC8qdWludCovLCBhcmdiOm51bWJlcltdIC8qdWludCovO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHJlY3Qud2lkdGg7ICsraSkge1xuXHRcdFx0XHRmb3IgKGogPSAwOyBqIDwgcmVjdC5oZWlnaHQ7ICsraikge1xuXHRcdFx0XHRcdGFyZ2IgPSBDb2xvclV0aWxzLmZsb2F0MzJDb2xvclRvQVJHQihpbnB1dFZlY3RvcltpICsgaipyZWN0LndpZHRoXSk7XG5cdFx0XHRcdFx0aW5kZXggPSAoaSArIHJlY3QueCArIChqICsgcmVjdC55KSp0aGlzLl9pbWFnZUNhbnZhcy53aWR0aCkqNDtcblxuXHRcdFx0XHRcdHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgMF0gPSBhcmdiWzFdO1xuXHRcdFx0XHRcdHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgMV0gPSBhcmdiWzJdO1xuXHRcdFx0XHRcdHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgMl0gPSBhcmdiWzNdO1xuXHRcdFx0XHRcdHRoaXMuX2ltYWdlRGF0YS5kYXRhW2luZGV4ICsgM10gPSBhcmdiWzBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLl9sb2NrZWQpIHtcblx0XHRcdHRoaXMuX2NvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuX2ltYWdlRGF0YSwgMCwgMCk7XG5cdFx0XHR0aGlzLl9pbWFnZURhdGEgPSBudWxsO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb3B5IGFuIEhUTUxJbWFnZUVsZW1lbnQgb3IgQml0bWFwRGF0YSBvYmplY3Rcblx0ICpcblx0ICogQHBhcmFtIGltZyB7Qml0bWFwRGF0YX0gLyB7SFRNTEltYWdlRWxlbWVudH1cblx0ICogQHBhcmFtIHNvdXJjZVJlY3QgLSBzb3VyY2UgcmVjdGFuZ2UgdG8gY29weSBmcm9tXG5cdCAqIEBwYXJhbSBkZXN0UmVjdCAtIGRlc3RpbmF0b2luIHJlY3RhbmdlIHRvIGNvcHkgdG9cblx0ICovXG5cdHB1YmxpYyBkcmF3SW1hZ2UoaW1nOkJpdG1hcERhdGEsIHNvdXJjZVJlY3Q6UmVjdGFuZ2xlLCBkZXN0UmVjdDpSZWN0YW5nbGUpO1xuXHRwdWJsaWMgZHJhd0ltYWdlKGltZzpIVE1MSW1hZ2VFbGVtZW50LCBzb3VyY2VSZWN0OlJlY3RhbmdsZSwgZGVzdFJlY3Q6UmVjdGFuZ2xlKTtcblx0cHVibGljIGRyYXdJbWFnZShpbWc6YW55LCBzb3VyY2VSZWN0OlJlY3RhbmdsZSwgZGVzdFJlY3Q6UmVjdGFuZ2xlKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2xvY2tlZCkge1xuXHRcdFx0Ly8gSWYgY2FudmFzIGlzIGxvY2tlZDpcblx0XHRcdC8vXG5cdFx0XHQvLyAgICAgIDEpIGNvcHkgaW1hZ2UgZGF0YSBiYWNrIHRvIGNhbnZhc1xuXHRcdFx0Ly8gICAgICAyKSBkcmF3IG9iamVjdFxuXHRcdFx0Ly8gICAgICAzKSByZWFkIF9pbWFnZURhdGEgYmFjayBvdXRcblxuXHRcdFx0aWYgKHRoaXMuX2ltYWdlRGF0YSkge1xuXHRcdFx0XHR0aGlzLl9jb250ZXh0LnB1dEltYWdlRGF0YSh0aGlzLl9pbWFnZURhdGEsIDAsIDApOyAvLyBhdCBjb29yZHMgMCwwXG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2RyYXdJbWFnZShpbWcsIHNvdXJjZVJlY3QsIGRlc3RSZWN0KTtcblxuXHRcdFx0aWYgKHRoaXMuX2ltYWdlRGF0YSkge1xuXHRcdFx0XHR0aGlzLl9pbWFnZURhdGEgPSB0aGlzLl9jb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLl9yZWN0LndpZHRoLCB0aGlzLl9yZWN0LmhlaWdodCk7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fZHJhd0ltYWdlKGltZywgc291cmNlUmVjdCwgZGVzdFJlY3QpXG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfZHJhd0ltYWdlKGltZzpCaXRtYXBEYXRhLCBzb3VyY2VSZWN0OlJlY3RhbmdsZSwgZGVzdFJlY3Q6UmVjdGFuZ2xlKTtcblx0cHJpdmF0ZSBfZHJhd0ltYWdlKGltZzpIVE1MSW1hZ2VFbGVtZW50LCBzb3VyY2VSZWN0OlJlY3RhbmdsZSwgZGVzdFJlY3Q6UmVjdGFuZ2xlKTtcblx0cHJpdmF0ZSBfZHJhd0ltYWdlKGltZzphbnksIHNvdXJjZVJlY3Q6UmVjdGFuZ2xlLCBkZXN0UmVjdDpSZWN0YW5nbGUpXG5cdHtcblx0XHRpZiAoaW1nIGluc3RhbmNlb2YgQml0bWFwRGF0YSlcblx0XHRcdHRoaXMuX2NvbnRleHQuZHJhd0ltYWdlKGltZy5jYW52YXMsIHNvdXJjZVJlY3QueCwgc291cmNlUmVjdC55LCBzb3VyY2VSZWN0LndpZHRoLCBzb3VyY2VSZWN0LmhlaWdodCwgZGVzdFJlY3QueCwgZGVzdFJlY3QueSwgZGVzdFJlY3Qud2lkdGgsIGRlc3RSZWN0LmhlaWdodCk7XG5cdFx0ZWxzZSBpZiAoaW1nIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudClcblx0XHRcdHRoaXMuX2NvbnRleHQuZHJhd0ltYWdlKGltZywgc291cmNlUmVjdC54LCBzb3VyY2VSZWN0LnksIHNvdXJjZVJlY3Qud2lkdGgsIHNvdXJjZVJlY3QuaGVpZ2h0LCBkZXN0UmVjdC54LCBkZXN0UmVjdC55LCBkZXN0UmVjdC53aWR0aCwgZGVzdFJlY3QuaGVpZ2h0KTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gYm1wZFxuXHQgKiBAcGFyYW0gc291cmNlUmVjdFxuXHQgKiBAcGFyYW0gZGVzdFJlY3Rcblx0ICovXG5cdHB1YmxpYyBjb3B5UGl4ZWxzKGJtcGQ6Qml0bWFwRGF0YSwgc291cmNlUmVjdDpSZWN0YW5nbGUsIGRlc3RSZWN0OlJlY3RhbmdsZSk7XG5cdHB1YmxpYyBjb3B5UGl4ZWxzKGJtcGQ6SFRNTEltYWdlRWxlbWVudCwgc291cmNlUmVjdDpSZWN0YW5nbGUsIGRlc3RSZWN0OlJlY3RhbmdsZSk7XG5cdHB1YmxpYyBjb3B5UGl4ZWxzKGJtcGQ6YW55LCBzb3VyY2VSZWN0OlJlY3RhbmdsZSwgZGVzdFJlY3Q6UmVjdGFuZ2xlKVxuXHR7XG5cblx0XHRpZiAodGhpcy5fbG9ja2VkKSB7XG5cblx0XHRcdC8vIElmIGNhbnZhcyBpcyBsb2NrZWQ6XG5cdFx0XHQvL1xuXHRcdFx0Ly8gICAgICAxKSBjb3B5IGltYWdlIGRhdGEgYmFjayB0byBjYW52YXNcblx0XHRcdC8vICAgICAgMikgZHJhdyBvYmplY3Rcblx0XHRcdC8vICAgICAgMykgcmVhZCBfaW1hZ2VEYXRhIGJhY2sgb3V0XG5cblx0XHRcdGlmICh0aGlzLl9pbWFnZURhdGEpIHtcblx0XHRcdFx0dGhpcy5fY29udGV4dC5wdXRJbWFnZURhdGEodGhpcy5faW1hZ2VEYXRhLCAwLCAwKTsgLy8gYXQgY29vcmRzIDAsMFxuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLl9jb3B5UGl4ZWxzKGJtcGQsIHNvdXJjZVJlY3QsIGRlc3RSZWN0KTtcblxuXHRcdFx0aWYgKHRoaXMuX2ltYWdlRGF0YSkge1xuXHRcdFx0XHR0aGlzLl9pbWFnZURhdGEgPSB0aGlzLl9jb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB0aGlzLl9yZWN0LndpZHRoLCB0aGlzLl9yZWN0LmhlaWdodCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2NvcHlQaXhlbHMoYm1wZCwgc291cmNlUmVjdCwgZGVzdFJlY3QpO1xuXHRcdH1cblxuXHR9XG5cblx0cHJpdmF0ZSBfY29weVBpeGVscyhibXBkOkJpdG1hcERhdGEsIHNvdXJjZVJlY3Q6UmVjdGFuZ2xlLCBkZXN0UmVjdDpSZWN0YW5nbGUpO1xuXHRwcml2YXRlIF9jb3B5UGl4ZWxzKGJtcGQ6SFRNTEltYWdlRWxlbWVudCwgc291cmNlUmVjdDpSZWN0YW5nbGUsIGRlc3RSZWN0OlJlY3RhbmdsZSk7XG5cdHByaXZhdGUgX2NvcHlQaXhlbHMoYm1wZDphbnksIHNvdXJjZVJlY3Q6UmVjdGFuZ2xlLCBkZXN0UmVjdDpSZWN0YW5nbGUpXG5cdHtcblxuXHRcdGlmIChibXBkIGluc3RhbmNlb2YgQml0bWFwRGF0YSkge1xuXHRcdFx0dGhpcy5fY29udGV4dC5kcmF3SW1hZ2UoYm1wZC5jYW52YXMsIHNvdXJjZVJlY3QueCwgc291cmNlUmVjdC55LCBzb3VyY2VSZWN0LndpZHRoLCBzb3VyY2VSZWN0LmhlaWdodCwgZGVzdFJlY3QueCwgZGVzdFJlY3QueSwgZGVzdFJlY3Qud2lkdGgsIGRlc3RSZWN0LmhlaWdodCk7XG5cdFx0fSBlbHNlIGlmIChibXBkIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkge1xuXHRcdFx0dGhpcy5fY29udGV4dC5kcmF3SW1hZ2UoYm1wZCwgc291cmNlUmVjdC54LCBzb3VyY2VSZWN0LnksIHNvdXJjZVJlY3Qud2lkdGgsIHNvdXJjZVJlY3QuaGVpZ2h0LCBkZXN0UmVjdC54LCBkZXN0UmVjdC55LCBkZXN0UmVjdC53aWR0aCwgZGVzdFJlY3QuaGVpZ2h0KTtcblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVjdFxuXHQgKiBAcGFyYW0gY29sb3Jcblx0ICovXG5cdHB1YmxpYyBmaWxsUmVjdChyZWN0OlJlY3RhbmdsZSwgY29sb3I6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2xvY2tlZCkge1xuXG5cdFx0XHQvLyBJZiBjYW52YXMgaXMgbG9ja2VkOlxuXHRcdFx0Ly9cblx0XHRcdC8vICAgICAgMSkgY29weSBpbWFnZSBkYXRhIGJhY2sgdG8gY2FudmFzXG5cdFx0XHQvLyAgICAgIDIpIGFwcGx5IGZpbGxcblx0XHRcdC8vICAgICAgMykgcmVhZCBfaW1hZ2VEYXRhIGJhY2sgb3V0XG5cblx0XHRcdGlmICh0aGlzLl9pbWFnZURhdGEpXG5cdFx0XHRcdHRoaXMuX2NvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuX2ltYWdlRGF0YSwgMCwgMCk7IC8vIGF0IGNvb3JkcyAwLDBcblxuXHRcdFx0dGhpcy5fY29udGV4dC5maWxsU3R5bGUgPSB0aGlzLmhleFRvUkdCQUNTUyhjb2xvcik7XG5cdFx0XHR0aGlzLl9jb250ZXh0LmZpbGxSZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG5cblx0XHRcdGlmICh0aGlzLl9pbWFnZURhdGEpXG5cdFx0XHRcdHRoaXMuX2ltYWdlRGF0YSA9IHRoaXMuX2NvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMuX3JlY3Qud2lkdGgsIHRoaXMuX3JlY3QuaGVpZ2h0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fY29udGV4dC5maWxsU3R5bGUgPSB0aGlzLmhleFRvUkdCQUNTUyhjb2xvcik7XG5cdFx0XHR0aGlzLl9jb250ZXh0LmZpbGxSZWN0KHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2Vcblx0ICogQHBhcmFtIG1hdHJpeFxuXHQgKi9cblx0cHVibGljIGRyYXcoc291cmNlOkJpdG1hcERhdGEsIG1hdHJpeD86TWF0cml4KTtcblx0cHVibGljIGRyYXcoc291cmNlOkhUTUxJbWFnZUVsZW1lbnQsIG1hdHJpeD86TWF0cml4KTtcblx0cHVibGljIGRyYXcoc291cmNlOmFueSwgbWF0cml4PzpNYXRyaXgpXG5cdHtcblx0XHRpZiAodGhpcy5fbG9ja2VkKSB7XG5cblx0XHRcdC8vIElmIGNhbnZhcyBpcyBsb2NrZWQ6XG5cdFx0XHQvL1xuXHRcdFx0Ly8gICAgICAxKSBjb3B5IGltYWdlIGRhdGEgYmFjayB0byBjYW52YXNcblx0XHRcdC8vICAgICAgMikgZHJhdyBvYmplY3Rcblx0XHRcdC8vICAgICAgMykgcmVhZCBfaW1hZ2VEYXRhIGJhY2sgb3V0XG5cblx0XHRcdGlmICh0aGlzLl9pbWFnZURhdGEpXG5cdFx0XHRcdHRoaXMuX2NvbnRleHQucHV0SW1hZ2VEYXRhKHRoaXMuX2ltYWdlRGF0YSwgMCwgMCk7IC8vIGF0IGNvb3JkcyAwLDBcblxuXHRcdFx0dGhpcy5fZHJhdyhzb3VyY2UsIG1hdHJpeCk7XG5cblx0XHRcdGlmICh0aGlzLl9pbWFnZURhdGEpXG5cdFx0XHRcdHRoaXMuX2ltYWdlRGF0YSA9IHRoaXMuX2NvbnRleHQuZ2V0SW1hZ2VEYXRhKDAsIDAsIHRoaXMuX3JlY3Qud2lkdGgsIHRoaXMuX3JlY3QuaGVpZ2h0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fZHJhdyhzb3VyY2UsIG1hdHJpeCk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBfZHJhdyhzb3VyY2U6Qml0bWFwRGF0YSwgbWF0cml4Ok1hdHJpeCk7XG5cdHByaXZhdGUgX2RyYXcoc291cmNlOkhUTUxJbWFnZUVsZW1lbnQsIG1hdHJpeDpNYXRyaXgpO1xuXHRwcml2YXRlIF9kcmF3KHNvdXJjZTphbnksIG1hdHJpeDpNYXRyaXgpXG5cdHtcblx0XHRpZiAoc291cmNlIGluc3RhbmNlb2YgQml0bWFwRGF0YSkge1xuXHRcdFx0dGhpcy5fY29udGV4dC5zYXZlKCk7XG5cblx0XHRcdGlmIChtYXRyaXggIT0gbnVsbClcblx0XHRcdFx0dGhpcy5fY29udGV4dC5zZXRUcmFuc2Zvcm0obWF0cml4LmEsIG1hdHJpeC5iLCBtYXRyaXguYywgbWF0cml4LmQsIG1hdHJpeC50eCwgbWF0cml4LnR5KTtcblxuXHRcdFx0dGhpcy5fY29udGV4dC5kcmF3SW1hZ2Uoc291cmNlLmNhbnZhcywgMCwgMClcblx0XHRcdHRoaXMuX2NvbnRleHQucmVzdG9yZSgpO1xuXG5cdFx0fSBlbHNlIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG5cdFx0XHR0aGlzLl9jb250ZXh0LnNhdmUoKTtcblxuXHRcdFx0aWYgKG1hdHJpeCAhPSBudWxsKVxuXHRcdFx0XHR0aGlzLl9jb250ZXh0LnNldFRyYW5zZm9ybShtYXRyaXguYSwgbWF0cml4LmIsIG1hdHJpeC5jLCBtYXRyaXguZCwgbWF0cml4LnR4LCBtYXRyaXgudHkpO1xuXG5cdFx0XHR0aGlzLl9jb250ZXh0LmRyYXdJbWFnZShzb3VyY2UsIDAsIDApXG5cdFx0XHR0aGlzLl9jb250ZXh0LnJlc3RvcmUoKTtcblx0XHR9XG5cblx0fVxuXG5cdHB1YmxpYyBjb3B5Q2hhbm5lbChzb3VyY2VCaXRtYXA6Qml0bWFwRGF0YSwgc291cmNlUmVjdDpSZWN0YW5nbGUsIGRlc3RQb2ludDpQb2ludCwgc291cmNlQ2hhbm5lbDpudW1iZXIsIGRlc3RDaGFubmVsOm51bWJlcilcblx0e1xuXHRcdHZhciBpbWFnZURhdGE6SW1hZ2VEYXRhID0gc291cmNlQml0bWFwLmltYWdlRGF0YTtcblxuXHRcdGlmICghdGhpcy5fbG9ja2VkKVxuXHRcdFx0dGhpcy5faW1hZ2VEYXRhID0gdGhpcy5fY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy5fcmVjdC53aWR0aCwgdGhpcy5fcmVjdC5oZWlnaHQpO1xuXG5cdFx0aWYgKHRoaXMuX2ltYWdlRGF0YSkge1xuXHRcdFx0dmFyIHNvdXJjZURhdGE6VWludDhBcnJheSA9IHNvdXJjZUJpdG1hcC5pbWFnZURhdGEuZGF0YTtcblx0XHRcdHZhciBkZXN0RGF0YTpVaW50OEFycmF5ID0gdGhpcy5faW1hZ2VEYXRhLmRhdGE7XG5cblx0XHRcdHZhciBzb3VyY2VPZmZzZXQ6bnVtYmVyID0gTWF0aC5yb3VuZChNYXRoLmxvZyhzb3VyY2VDaGFubmVsKS9NYXRoLmxvZygyKSk7XG5cdFx0XHR2YXIgZGVzdE9mZnNldDpudW1iZXIgPSBNYXRoLnJvdW5kKE1hdGgubG9nKGRlc3RDaGFubmVsKS9NYXRoLmxvZygyKSk7XG5cblx0XHRcdHZhciBpOm51bWJlciAvKnVpbnQqLywgajpudW1iZXIgLyp1aW50Ki8sIHNvdXJjZUluZGV4Om51bWJlciAvKnVpbnQqLywgZGVzdEluZGV4Om51bWJlciAvKnVpbnQqLztcblx0XHRcdGZvciAoaSA9IDA7IGkgPCBzb3VyY2VSZWN0LndpZHRoOyArK2kpIHtcblx0XHRcdFx0Zm9yIChqID0gMDsgaiA8IHNvdXJjZVJlY3QuaGVpZ2h0OyArK2opIHtcblx0XHRcdFx0XHRzb3VyY2VJbmRleCA9IChpICsgc291cmNlUmVjdC54ICsgKGogKyBzb3VyY2VSZWN0LnkpKnNvdXJjZUJpdG1hcC53aWR0aCkqNDtcblx0XHRcdFx0XHRkZXN0SW5kZXggPSAoaSArIGRlc3RQb2ludC54ICsgKGogKyBkZXN0UG9pbnQueSkqdGhpcy53aWR0aCkqNDtcblxuXHRcdFx0XHRcdGRlc3REYXRhW2Rlc3RJbmRleCArIGRlc3RPZmZzZXRdID0gc291cmNlRGF0YVtzb3VyY2VJbmRleCArIHNvdXJjZU9mZnNldF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuX2xvY2tlZCkge1xuXHRcdFx0dGhpcy5fY29udGV4dC5wdXRJbWFnZURhdGEodGhpcy5faW1hZ2VEYXRhLCAwLCAwKTtcblx0XHRcdHRoaXMuX2ltYWdlRGF0YSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNvbG9yVHJhbnNmb3JtKHJlY3Q6UmVjdGFuZ2xlLCBjb2xvclRyYW5zZm9ybTpDb2xvclRyYW5zZm9ybSlcblx0e1xuXHRcdGlmICghdGhpcy5fbG9ja2VkKVxuXHRcdFx0dGhpcy5faW1hZ2VEYXRhID0gdGhpcy5fY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy5fcmVjdC53aWR0aCwgdGhpcy5fcmVjdC5oZWlnaHQpO1xuXG5cdFx0aWYgKHRoaXMuX2ltYWdlRGF0YSkge1xuXHRcdFx0dmFyIGRhdGE6VWludDhBcnJheSA9IHRoaXMuX2ltYWdlRGF0YS5kYXRhO1xuXG5cdFx0XHR2YXIgaTpudW1iZXIgLyp1aW50Ki8sIGo6bnVtYmVyIC8qdWludCovLCBpbmRleDpudW1iZXIgLyp1aW50Ki87XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgcmVjdC53aWR0aDsgKytpKSB7XG5cdFx0XHRcdGZvciAoaiA9IDA7IGogPCByZWN0LmhlaWdodDsgKytqKSB7XG5cdFx0XHRcdFx0aW5kZXggPSAoaSArIHJlY3QueCArIChqICsgcmVjdC55KSp0aGlzLndpZHRoKSo0O1xuXG5cdFx0XHRcdFx0ZGF0YVtpbmRleF0gPSBkYXRhW2luZGV4XSpjb2xvclRyYW5zZm9ybS5yZWRNdWx0aXBsaWVyICsgY29sb3JUcmFuc2Zvcm0ucmVkT2Zmc2V0O1xuXHRcdFx0XHRcdGRhdGFbaW5kZXggKyAxXSA9IGRhdGFbaW5kZXggKyAxXSpjb2xvclRyYW5zZm9ybS5ncmVlbk11bHRpcGxpZXIgKyBjb2xvclRyYW5zZm9ybS5ncmVlbk9mZnNldDtcblx0XHRcdFx0XHRkYXRhW2luZGV4ICsgMl0gPSBkYXRhW2luZGV4ICsgMl0qY29sb3JUcmFuc2Zvcm0uYmx1ZU11bHRpcGxpZXIgKyBjb2xvclRyYW5zZm9ybS5ibHVlT2Zmc2V0O1xuXHRcdFx0XHRcdGRhdGFbaW5kZXggKyAzXSA9IGRhdGFbaW5kZXggKyAzXSpjb2xvclRyYW5zZm9ybS5hbHBoYU11bHRpcGxpZXIgKyBjb2xvclRyYW5zZm9ybS5hbHBoYU9mZnNldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghdGhpcy5fbG9ja2VkKSB7XG5cdFx0XHR0aGlzLl9jb250ZXh0LnB1dEltYWdlRGF0YSh0aGlzLl9pbWFnZURhdGEsIDAsIDApO1xuXHRcdFx0dGhpcy5faW1hZ2VEYXRhID0gbnVsbDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHtJbWFnZURhdGF9XG5cdCAqL1xuXHRwdWJsaWMgc2V0IGltYWdlRGF0YSh2YWx1ZTpJbWFnZURhdGEpXG5cdHtcblx0XHR0aGlzLl9jb250ZXh0LnB1dEltYWdlRGF0YSh2YWx1ZSwgMCwgMCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge0ltYWdlRGF0YX1cblx0ICovXG5cdHB1YmxpYyBnZXQgaW1hZ2VEYXRhKCk6SW1hZ2VEYXRhXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY29udGV4dC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy5fcmVjdC53aWR0aCwgdGhpcy5fcmVjdC5oZWlnaHQpXG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge251bWJlcn1cblx0ICovXG5cdHB1YmxpYyBnZXQgd2lkdGgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiA8bnVtYmVyPiB0aGlzLl9pbWFnZUNhbnZhcy53aWR0aDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge251bWJlcn1cblx0ICovXG5cdHB1YmxpYyBzZXQgd2lkdGgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fcmVjdC53aWR0aCA9IHZhbHVlO1xuXHRcdHRoaXMuX2ltYWdlQ2FudmFzLndpZHRoID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge251bWJlcn1cblx0ICovXG5cdHB1YmxpYyBnZXQgaGVpZ2h0KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gPG51bWJlcj4gdGhpcy5faW1hZ2VDYW52YXMuaGVpZ2h0O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB7bnVtYmVyfVxuXHQgKi9cblx0cHVibGljIHNldCBoZWlnaHQodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fcmVjdC5oZWlnaHQgPSB2YWx1ZTtcblx0XHR0aGlzLl9pbWFnZUNhbnZhcy5oZWlnaHQgPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0ge1JlY3RhbmdsZX1cblx0ICovXG5cdHB1YmxpYyBnZXQgcmVjdCgpOlJlY3RhbmdsZVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3JlY3Q7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge0hUTUxDYW52YXNFbGVtZW50fVxuXHQgKi9cblx0cHVibGljIGdldCBjYW52YXMoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2ltYWdlQ2FudmFzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtIVE1MQ2FudmFzRWxlbWVudH1cblx0ICovXG5cdHB1YmxpYyBnZXQgY29udGV4dCgpOkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbnRleHQ7XG5cdH1cblxuXHQvLyBQcml2YXRlXG5cblx0LyoqXG5cdCAqIGNvbnZlcnQgZGVjaW1hbCB2YWx1ZSB0byBIZXhcblx0ICovXG5cdHByaXZhdGUgaGV4VG9SR0JBQ1NTKGQ6bnVtYmVyKTpzdHJpbmdcblx0e1xuXHRcdHZhciBhcmdiOm51bWJlcltdID0gQ29sb3JVdGlscy5mbG9hdDMyQ29sb3JUb0FSR0IoZCk7XG5cblx0XHRpZiAodGhpcy5fdHJhbnNwYXJlbnQgPT0gZmFsc2UpIHtcblx0XHRcdGFyZ2JbMF0gPSAxO1xuXG5cdFx0XHRyZXR1cm4gJ3JnYmEoJyArIGFyZ2JbMV0gKyAnLCcgKyBhcmdiWzJdICsgJywnICsgYXJnYlszXSArICcsJyArIGFyZ2JbMF0gKyAnKSc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICdyZ2JhKCcgKyBhcmdiWzFdICsgJywnICsgYXJnYlsyXSArICcsJyArIGFyZ2JbM10gKyAnLCcgKyBhcmdiWzBdLzI1NSArICcpJztcblx0fVxufVxuXG5leHBvcnQgPSBCaXRtYXBEYXRhOyJdfQ== \ No newline at end of file diff --git a/lib/core/base/BitmapData.ts b/lib/core/base/BitmapData.ts new file mode 100644 index 00000000..f45bd177 --- /dev/null +++ b/lib/core/base/BitmapData.ts @@ -0,0 +1,575 @@ +import ColorTransform = require("awayjs-core/lib/core/geom/ColorTransform"); +import Matrix = require("awayjs-core/lib/core/geom/Matrix"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import Point = require("awayjs-core/lib/core/geom/Point"); +import ByteArray = require("awayjs-core/lib/utils/ByteArray"); +import ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +/** + * + */ +class BitmapData +{ + private _imageCanvas:HTMLCanvasElement; + private _context:CanvasRenderingContext2D; + private _imageData:ImageData; + private _rect:Rectangle; + private _transparent:boolean; + private _alpha:number = 0; + private _locked:boolean = false; + + + /** + * + * @param width + * @param height + * @param transparent + * @param fillColor + */ + constructor(width:number, height:number, transparent:boolean = true, fillColor:number = null) + { + + this._transparent = transparent; + this._imageCanvas = document.createElement("canvas"); + this._imageCanvas.width = width; + this._imageCanvas.height = height; + this._context = this._imageCanvas.getContext("2d"); + this._rect = new Rectangle(0, 0, width, height); + + if (fillColor != null) { + + if (this._transparent) { + this._alpha = ColorUtils.float32ColorToARGB(fillColor)[0]/255; + } else { + this._alpha = 1; + } + + this.fillRect(this._rect, fillColor); + + } + + } + + /** + * + */ + public dispose() + { + this._context = null; + this._imageCanvas = null; + this._imageData = null; + this._rect = null; + this._transparent = null; + this._locked = null; + } + + /** + * + */ + public lock() + { + this._locked = true; + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } + + /** + * + */ + public unlock() + { + this._locked = false; + + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + this._imageData = null; + } + } + + /** + * + * @param x + * @param y + * @param color + */ + public getPixel(x, y):number + { + var r:number; + var g:number; + var b:number; + var a:number; + + if (!this._locked) { + var pixelData:ImageData = this._context.getImageData(x, y, 1, 1); + + r = pixelData.data[0]; + g = pixelData.data[1]; + b = pixelData.data[2]; + a = pixelData.data[3]; + + } else { + var index:number = (x + y*this._imageCanvas.width)*4; + + if (!this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + r = this._imageData.data[index + 0]; + g = this._imageData.data[index + 1]; + b = this._imageData.data[index + 2]; + a = this._imageData.data[index + 3]; + + } + + if (!this._locked) { + this._imageData = null; + } + + return (a << 24) | (r << 16) | (g << 8) | b; + } + + /** + * + * @param x + * @param y + * @param color + */ + public setPixel(x, y, color:number) + { + var argb:number[] = ColorUtils.float32ColorToARGB(color); + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var index:number = (x + y*this._imageCanvas.width)*4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = 255; + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + } + + /** + * + * @param rect + * @param inputByteArray + */ + public setPixels(rect:Rectangle, inputByteArray:ByteArray) + { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + inputByteArray.position = 0; + var i:number /*uint*/, j:number /*uint*/, index:number /*uint*/; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + index = (i + rect.x + (j + rect.y)*this._imageCanvas.width)*4; + + this._imageData.data[index + 0] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 1] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 2] = inputByteArray.readUnsignedInt(); + this._imageData.data[index + 3] = inputByteArray.readUnsignedInt(); + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + } + + /** + * + * @param x + * @param y + * @param color + */ + public setPixel32(x, y, color:number) + { + var argb:number[] = ColorUtils.float32ColorToARGB(color); + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var index:number = (x + y*this._imageCanvas.width)*4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = argb[0]; + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + } + + public setVector(rect:Rectangle, inputVector:Array) + { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var i:number /*uint*/, j:number /*uint*/, index:number /*uint*/, argb:number[] /*uint*/; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + argb = ColorUtils.float32ColorToARGB(inputVector[i + j*rect.width]); + index = (i + rect.x + (j + rect.y)*this._imageCanvas.width)*4; + + this._imageData.data[index + 0] = argb[1]; + this._imageData.data[index + 1] = argb[2]; + this._imageData.data[index + 2] = argb[3]; + this._imageData.data[index + 3] = argb[0]; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + } + + /** + * Copy an HTMLImageElement or BitmapData object + * + * @param img {BitmapData} / {HTMLImageElement} + * @param sourceRect - source rectange to copy from + * @param destRect - destinatoin rectange to copy to + */ + public drawImage(img:BitmapData, sourceRect:Rectangle, destRect:Rectangle); + public drawImage(img:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle); + public drawImage(img:any, sourceRect:Rectangle, destRect:Rectangle) + { + if (this._locked) { + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + } + + this._drawImage(img, sourceRect, destRect); + + if (this._imageData) { + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } + + } else { + this._drawImage(img, sourceRect, destRect) + } + } + + private _drawImage(img:BitmapData, sourceRect:Rectangle, destRect:Rectangle); + private _drawImage(img:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle); + private _drawImage(img:any, sourceRect:Rectangle, destRect:Rectangle) + { + if (img instanceof BitmapData) + this._context.drawImage(img.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + else if (img instanceof HTMLImageElement) + this._context.drawImage(img, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + } + + /** + * + * @param bmpd + * @param sourceRect + * @param destRect + */ + public copyPixels(bmpd:BitmapData, sourceRect:Rectangle, destRect:Rectangle); + public copyPixels(bmpd:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle); + public copyPixels(bmpd:any, sourceRect:Rectangle, destRect:Rectangle) + { + + if (this._locked) { + + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + + if (this._imageData) { + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + } + + this._copyPixels(bmpd, sourceRect, destRect); + + if (this._imageData) { + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } + } else { + this._copyPixels(bmpd, sourceRect, destRect); + } + + } + + private _copyPixels(bmpd:BitmapData, sourceRect:Rectangle, destRect:Rectangle); + private _copyPixels(bmpd:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle); + private _copyPixels(bmpd:any, sourceRect:Rectangle, destRect:Rectangle) + { + + if (bmpd instanceof BitmapData) { + this._context.drawImage(bmpd.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + } else if (bmpd instanceof HTMLImageElement) { + this._context.drawImage(bmpd, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); + } + + } + + /** + * + * @param rect + * @param color + */ + public fillRect(rect:Rectangle, color:number) + { + if (this._locked) { + + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) apply fill + // 3) read _imageData back out + + if (this._imageData) + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + + this._context.fillStyle = this.hexToRGBACSS(color); + this._context.fillRect(rect.x, rect.y, rect.width, rect.height); + + if (this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } else { + this._context.fillStyle = this.hexToRGBACSS(color); + this._context.fillRect(rect.x, rect.y, rect.width, rect.height); + } + } + + /** + * + * @param source + * @param matrix + */ + public draw(source:BitmapData, matrix?:Matrix); + public draw(source:HTMLImageElement, matrix?:Matrix); + public draw(source:any, matrix?:Matrix) + { + if (this._locked) { + + // If canvas is locked: + // + // 1) copy image data back to canvas + // 2) draw object + // 3) read _imageData back out + + if (this._imageData) + this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 + + this._draw(source, matrix); + + if (this._imageData) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + } else { + this._draw(source, matrix); + } + } + + private _draw(source:BitmapData, matrix:Matrix); + private _draw(source:HTMLImageElement, matrix:Matrix); + private _draw(source:any, matrix:Matrix) + { + if (source instanceof BitmapData) { + this._context.save(); + + if (matrix != null) + this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); + + this._context.drawImage(source.canvas, 0, 0) + this._context.restore(); + + } else if (source instanceof HTMLImageElement) { + this._context.save(); + + if (matrix != null) + this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); + + this._context.drawImage(source, 0, 0) + this._context.restore(); + } + + } + + public copyChannel(sourceBitmap:BitmapData, sourceRect:Rectangle, destPoint:Point, sourceChannel:number, destChannel:number) + { + var imageData:ImageData = sourceBitmap.imageData; + + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var sourceData:Array = sourceBitmap.imageData.data; + var destData:Array = this._imageData.data; + + var sourceOffset:number = Math.round(Math.log(sourceChannel)/Math.log(2)); + var destOffset:number = Math.round(Math.log(destChannel)/Math.log(2)); + + var i:number /*uint*/, j:number /*uint*/, sourceIndex:number /*uint*/, destIndex:number /*uint*/; + for (i = 0; i < sourceRect.width; ++i) { + for (j = 0; j < sourceRect.height; ++j) { + sourceIndex = (i + sourceRect.x + (j + sourceRect.y)*sourceBitmap.width)*4; + destIndex = (i + destPoint.x + (j + destPoint.y)*this.width)*4; + + destData[destIndex + destOffset] = sourceData[sourceIndex + sourceOffset]; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + } + + public colorTransform(rect:Rectangle, colorTransform:ColorTransform) + { + if (!this._locked) + this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); + + if (this._imageData) { + var data:Array = this._imageData.data; + + var i:number /*uint*/, j:number /*uint*/, index:number /*uint*/; + for (i = 0; i < rect.width; ++i) { + for (j = 0; j < rect.height; ++j) { + index = (i + rect.x + (j + rect.y)*this.width)*4; + + data[index] = data[index]*colorTransform.redMultiplier + colorTransform.redOffset; + data[index + 1] = data[index + 1]*colorTransform.greenMultiplier + colorTransform.greenOffset; + data[index + 2] = data[index + 2]*colorTransform.blueMultiplier + colorTransform.blueOffset; + data[index + 3] = data[index + 3]*colorTransform.alphaMultiplier + colorTransform.alphaOffset; + } + } + } + + if (!this._locked) { + this._context.putImageData(this._imageData, 0, 0); + this._imageData = null; + } + } + + /** + * + * @param {ImageData} + */ + public set imageData(value:ImageData) + { + this._context.putImageData(value, 0, 0); + } + + /** + * + * @returns {ImageData} + */ + public get imageData():ImageData + { + return this._context.getImageData(0, 0, this._rect.width, this._rect.height) + } + + /** + * + * @returns {number} + */ + public get width():number + { + return this._imageCanvas.width; + } + + /** + * + * @param {number} + */ + public set width(value:number) + { + this._rect.width = value; + this._imageCanvas.width = value; + } + + /** + * + * @returns {number} + */ + public get height():number + { + return this._imageCanvas.height; + } + + /** + * + * @param {number} + */ + public set height(value:number) + { + this._rect.height = value; + this._imageCanvas.height = value; + } + + /** + * + * @param {Rectangle} + */ + public get rect():Rectangle + { + return this._rect; + } + + /** + * + * @returns {HTMLCanvasElement} + */ + public get canvas() + { + return this._imageCanvas; + } + + /** + * + * @returns {HTMLCanvasElement} + */ + public get context():CanvasRenderingContext2D + { + return this._context; + } + + // Private + + /** + * convert decimal value to Hex + */ + private hexToRGBACSS(d:number):string + { + var argb:number[] = ColorUtils.float32ColorToARGB(d); + + if (this._transparent == false) { + argb[0] = 1; + + return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] + ')'; + } + + return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0]/255 + ')'; + } +} + +export = BitmapData; \ No newline at end of file diff --git a/lib/core/base/BitmapDataChannel.js b/lib/core/base/BitmapDataChannel.js new file mode 100755 index 00000000..7ed73578 --- /dev/null +++ b/lib/core/base/BitmapDataChannel.js @@ -0,0 +1,13 @@ +var BitmapDataChannel = (function () { + function BitmapDataChannel() { + } + BitmapDataChannel.ALPHA = 8; + BitmapDataChannel.BLUE = 4; + BitmapDataChannel.GREEN = 2; + BitmapDataChannel.RED = 1; + return BitmapDataChannel; +})(); + +module.exports = BitmapDataChannel; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9CaXRtYXBEYXRhQ2hhbm5lbC50cyJdLCJuYW1lcyI6WyJCaXRtYXBEYXRhQ2hhbm5lbCIsIkJpdG1hcERhdGFDaGFubmVsLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtJQUFBQTtJQU1BQyxDQUFDQTtBQUFBRCxJQUpBQSwwQkFBc0NBLENBQUNBO0lBQ3ZDQSx5QkFBcUNBLENBQUNBO0lBQ3RDQSwwQkFBc0NBLENBQUNBO0lBQ3ZDQSx3QkFBb0NBLENBQUNBO0lBQ3RDQSx5QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxrQ0FBMkIsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvQml0bWFwRGF0YUNoYW5uZWwuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBCaXRtYXBEYXRhQ2hhbm5lbFxue1xuXHRwdWJsaWMgc3RhdGljIEFMUEhBOm51bWJlciAvKnVpbnQqLyA9IDg7XG5cdHB1YmxpYyBzdGF0aWMgQkxVRTpudW1iZXIgLyp1aW50Ki8gPSA0O1xuXHRwdWJsaWMgc3RhdGljIEdSRUVOOm51bWJlciAvKnVpbnQqLyA9IDI7XG5cdHB1YmxpYyBzdGF0aWMgUkVEOm51bWJlciAvKnVpbnQqLyA9IDE7XG59XG5cbmV4cG9ydCA9IEJpdG1hcERhdGFDaGFubmVsOyJdfQ== \ No newline at end of file diff --git a/lib/core/base/BitmapDataChannel.ts b/lib/core/base/BitmapDataChannel.ts new file mode 100644 index 00000000..3c3f4493 --- /dev/null +++ b/lib/core/base/BitmapDataChannel.ts @@ -0,0 +1,9 @@ +class BitmapDataChannel +{ + public static ALPHA:number /*uint*/ = 8; + public static BLUE:number /*uint*/ = 4; + public static GREEN:number /*uint*/ = 2; + public static RED:number /*uint*/ = 1; +} + +export = BitmapDataChannel; \ No newline at end of file diff --git a/lib/core/base/BlendMode.js b/lib/core/base/BlendMode.js new file mode 100755 index 00000000..a11c6bc5 --- /dev/null +++ b/lib/core/base/BlendMode.js @@ -0,0 +1,48 @@ +/** +* A class that provides constant values for visual blend mode effects. These +* constants are used in the following: +*
    +*
  • The blendMode property of the +* flash.display.DisplayObject class.
  • +*
  • The blendMode parameter of the draw() +* method of the flash.display.BitmapData class
  • +*
+*/ +var BlendMode = (function () { + function BlendMode() { + } + BlendMode.ADD = "add"; + + BlendMode.ALPHA = "alpha"; + + BlendMode.DARKEN = "darken"; + + BlendMode.DIFFERENCE = "difference"; + + BlendMode.ERASE = "erase"; + + BlendMode.HARDLIGHT = "hardlight"; + + BlendMode.INVERT = "invert"; + + BlendMode.LAYER = "layer"; + + BlendMode.LIGHTEN = "lighten"; + + BlendMode.MULTIPLY = "multiply"; + + BlendMode.NORMAL = "normal"; + + BlendMode.OVERLAY = "overlay"; + + BlendMode.SCREEN = "screen"; + + BlendMode.SHADER = "shader"; + + BlendMode.SUBTRACT = "subtract"; + return BlendMode; +})(); + +module.exports = BlendMode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9CbGVuZE1vZGUudHMiXSwibmFtZXMiOlsiQmxlbmRNb2RlIiwiQmxlbmRNb2RlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0VBU0c7QUFDSDtJQUFBQTtJQWlMQUMsQ0FBQ0E7QUFBQUQsSUFyS0FBLGdCQUEyQkEsS0FBS0E7O0lBVWhDQSxrQkFBNkJBLE9BQU9BOztJQWNwQ0EsbUJBQThCQSxRQUFRQTs7SUFhdENBLHVCQUFrQ0EsWUFBWUE7O0lBUzlDQSxrQkFBNkJBLE9BQU9BOztJQVlwQ0Esc0JBQWlDQSxXQUFXQTs7SUFLNUNBLG1CQUE4QkEsUUFBUUE7O0lBWXRDQSxrQkFBNkJBLE9BQU9BOztJQWNwQ0Esb0JBQStCQSxTQUFTQTs7SUFleENBLHFCQUFnQ0EsVUFBVUE7O0lBTzFDQSxtQkFBOEJBLFFBQVFBOztJQVl0Q0Esb0JBQStCQSxTQUFTQTs7SUFReENBLG1CQUE4QkEsUUFBUUE7O0lBcUJ0Q0EsbUJBQThCQSxRQUFRQTs7SUFZdENBLHFCQUFnQ0EsVUFBVUE7SUFDM0NBLGlCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDBCQUFtQixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9CbGVuZE1vZGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEEgY2xhc3MgdGhhdCBwcm92aWRlcyBjb25zdGFudCB2YWx1ZXMgZm9yIHZpc3VhbCBibGVuZCBtb2RlIGVmZmVjdHMuIFRoZXNlXG4gKiBjb25zdGFudHMgYXJlIHVzZWQgaW4gdGhlIGZvbGxvd2luZzpcbiAqIDx1bD5cbiAqICAgPGxpPiBUaGUgPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGVcbiAqIGZsYXNoLmRpc3BsYXkuRGlzcGxheU9iamVjdCBjbGFzcy48L2xpPlxuICogICA8bGk+IFRoZSA8Y29kZT5ibGVuZE1vZGU8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGUgPGNvZGU+ZHJhdygpPC9jb2RlPlxuICogbWV0aG9kIG9mIHRoZSBmbGFzaC5kaXNwbGF5LkJpdG1hcERhdGEgY2xhc3M8L2xpPlxuICogPC91bD5cbiAqL1xuY2xhc3MgQmxlbmRNb2RlXG57XG5cdC8qKlxuXHQgKiBBZGRzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnN0aXR1ZW50IGNvbG9ycyBvZiB0aGUgZGlzcGxheSBvYmplY3QgdG8gdGhlXG5cdCAqIGNvbG9ycyBvZiBpdHMgYmFja2dyb3VuZCwgYXBwbHlpbmcgYSBjZWlsaW5nIG9mIDB4RkYuIFRoaXMgc2V0dGluZyBpc1xuXHQgKiBjb21tb25seSB1c2VkIGZvciBhbmltYXRpbmcgYSBsaWdodGVuaW5nIGRpc3NvbHZlIGJldHdlZW4gdHdvIG9iamVjdHMuXG5cdCAqXG5cdCAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgZGlzcGxheSBvYmplY3QgaGFzIGEgcGl4ZWwgd2l0aCBhbiBSR0IgdmFsdWUgb2Zcblx0ICogMHhBQUE2MzMsIGFuZCB0aGUgYmFja2dyb3VuZCBwaXhlbCBoYXMgYW4gUkdCIHZhbHVlIG9mIDB4REQyMjAwLCB0aGVcblx0ICogcmVzdWx0aW5nIFJHQiB2YWx1ZSBmb3IgdGhlIGRpc3BsYXllZCBwaXhlbCBpcyAweEZGQzgzMyhiZWNhdXNlIDB4QUEgK1xuXHQgKiAweEREID4gMHhGRiwgMHhBNiArIDB4MjIgPSAweEM4LCBhbmQgMHgzMyArIDB4MDAgPSAweDMzKS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEFERDpzdHJpbmcgPSBcImFkZFwiO1xuXG5cdC8qKlxuXHQgKiBBcHBsaWVzIHRoZSBhbHBoYSB2YWx1ZSBvZiBlYWNoIHBpeGVsIG9mIHRoZSBkaXNwbGF5IG9iamVjdCB0byB0aGVcblx0ICogYmFja2dyb3VuZC4gVGhpcyByZXF1aXJlcyB0aGUgPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGVcblx0ICogcGFyZW50IGRpc3BsYXkgb2JqZWN0IGJlIHNldCB0b1xuXHQgKiA8Y29kZT5hd2F5LmJhc2UuQmxlbmRNb2RlLkxBWUVSPC9jb2RlPi5cblx0ICpcblx0ICogPHA+Tm90IHN1cHBvcnRlZCB1bmRlciBHUFUgcmVuZGVyaW5nLjwvcD5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQUxQSEE6c3RyaW5nID0gXCJhbHBoYVwiO1xuXG5cdC8qKlxuXHQgKiBTZWxlY3RzIHRoZSBkYXJrZXIgb2YgdGhlIGNvbnN0aXR1ZW50IGNvbG9ycyBvZiB0aGUgZGlzcGxheSBvYmplY3QgYW5kIHRoZVxuXHQgKiBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQodGhlIGNvbG9ycyB3aXRoIHRoZSBzbWFsbGVyIHZhbHVlcykuIFRoaXNcblx0ICogc2V0dGluZyBpcyBjb21tb25seSB1c2VkIGZvciBzdXBlcmltcG9zaW5nIHR5cGUuXG5cdCAqXG5cdCAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgZGlzcGxheSBvYmplY3QgaGFzIGEgcGl4ZWwgd2l0aCBhbiBSR0IgdmFsdWUgb2Zcblx0ICogMHhGRkNDMzMsIGFuZCB0aGUgYmFja2dyb3VuZCBwaXhlbCBoYXMgYW4gUkdCIHZhbHVlIG9mIDB4RERGODAwLCB0aGVcblx0ICogcmVzdWx0aW5nIFJHQiB2YWx1ZSBmb3IgdGhlIGRpc3BsYXllZCBwaXhlbCBpcyAweEREQ0MwMChiZWNhdXNlIDB4RkYgPlxuXHQgKiAweERELCAweENDIDwgMHhGOCwgYW5kIDB4MzMgPiAweDAwID0gMzMpLjwvcD5cblx0ICpcblx0ICogPHA+Tm90IHN1cHBvcnRlZCB1bmRlciBHUFUgcmVuZGVyaW5nLjwvcD5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgREFSS0VOOnN0cmluZyA9IFwiZGFya2VuXCI7XG5cblx0LyoqXG5cdCAqIENvbXBhcmVzIHRoZSBjb25zdGl0dWVudCBjb2xvcnMgb2YgdGhlIGRpc3BsYXkgb2JqZWN0IHdpdGggdGhlIGNvbG9ycyBvZlxuXHQgKiBpdHMgYmFja2dyb3VuZCwgYW5kIHN1YnRyYWN0cyB0aGUgZGFya2VyIG9mIHRoZSB2YWx1ZXMgb2YgdGhlIHR3b1xuXHQgKiBjb25zdGl0dWVudCBjb2xvcnMgZnJvbSB0aGUgbGlnaHRlciB2YWx1ZS4gVGhpcyBzZXR0aW5nIGlzIGNvbW1vbmx5IHVzZWRcblx0ICogZm9yIG1vcmUgdmlicmFudCBjb2xvcnMuXG5cdCAqXG5cdCAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgZGlzcGxheSBvYmplY3QgaGFzIGEgcGl4ZWwgd2l0aCBhbiBSR0IgdmFsdWUgb2Zcblx0ICogMHhGRkNDMzMsIGFuZCB0aGUgYmFja2dyb3VuZCBwaXhlbCBoYXMgYW4gUkdCIHZhbHVlIG9mIDB4RERGODAwLCB0aGVcblx0ICogcmVzdWx0aW5nIFJHQiB2YWx1ZSBmb3IgdGhlIGRpc3BsYXllZCBwaXhlbCBpcyAweDIyMkMzMyhiZWNhdXNlIDB4RkYgLVxuXHQgKiAweEREID0gMHgyMiwgMHhGOCAtIDB4Q0MgPSAweDJDLCBhbmQgMHgzMyAtIDB4MDAgPSAweDMzKS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIERJRkZFUkVOQ0U6c3RyaW5nID0gXCJkaWZmZXJlbmNlXCI7XG5cblx0LyoqXG5cdCAqIEVyYXNlcyB0aGUgYmFja2dyb3VuZCBiYXNlZCBvbiB0aGUgYWxwaGEgdmFsdWUgb2YgdGhlIGRpc3BsYXkgb2JqZWN0LiBUaGlzXG5cdCAqIHByb2Nlc3MgcmVxdWlyZXMgdGhhdCB0aGUgPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgcGFyZW50XG5cdCAqIGRpc3BsYXkgb2JqZWN0IGJlIHNldCB0byA8Y29kZT5mbGFzaC5kaXNwbGF5LkJsZW5kTW9kZS5MQVlFUjwvY29kZT4uXG5cdCAqXG5cdCAqIDxwPk5vdCBzdXBwb3J0ZWQgdW5kZXIgR1BVIHJlbmRlcmluZy48L3A+XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEVSQVNFOnN0cmluZyA9IFwiZXJhc2VcIjtcblxuXHQvKipcblx0ICogQWRqdXN0cyB0aGUgY29sb3Igb2YgZWFjaCBwaXhlbCBiYXNlZCBvbiB0aGUgZGFya25lc3Mgb2YgdGhlIGRpc3BsYXlcblx0ICogb2JqZWN0LiBJZiB0aGUgZGlzcGxheSBvYmplY3QgaXMgbGlnaHRlciB0aGFuIDUwJSBncmF5LCB0aGUgZGlzcGxheSBvYmplY3Rcblx0ICogYW5kIGJhY2tncm91bmQgY29sb3JzIGFyZSBzY3JlZW5lZCwgd2hpY2ggcmVzdWx0cyBpbiBhIGxpZ2h0ZXIgY29sb3IuIElmXG5cdCAqIHRoZSBkaXNwbGF5IG9iamVjdCBpcyBkYXJrZXIgdGhhbiA1MCUgZ3JheSwgdGhlIGNvbG9ycyBhcmUgbXVsdGlwbGllZCxcblx0ICogd2hpY2ggcmVzdWx0cyBpbiBhIGRhcmtlciBjb2xvci4gVGhpcyBzZXR0aW5nIGlzIGNvbW1vbmx5IHVzZWQgZm9yIHNoYWRpbmdcblx0ICogZWZmZWN0cy5cblx0ICpcblx0ICogPHA+Tm90IHN1cHBvcnRlZCB1bmRlciBHUFUgcmVuZGVyaW5nLjwvcD5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgSEFSRExJR0hUOnN0cmluZyA9IFwiaGFyZGxpZ2h0XCI7XG5cblx0LyoqXG5cdCAqIEludmVydHMgdGhlIGJhY2tncm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIElOVkVSVDpzdHJpbmcgPSBcImludmVydFwiO1xuXG5cdC8qKlxuXHQgKiBGb3JjZXMgdGhlIGNyZWF0aW9uIG9mIGEgdHJhbnNwYXJlbmN5IGdyb3VwIGZvciB0aGUgZGlzcGxheSBvYmplY3QuIFRoaXNcblx0ICogbWVhbnMgdGhhdCB0aGUgZGlzcGxheSBvYmplY3QgaXMgcHJlY29tcG9zZWQgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyIGJlZm9yZVxuXHQgKiBpdCBpcyBwcm9jZXNzZWQgZnVydGhlci4gVGhlIHByZWNvbXBvc2l0aW9uIGlzIGRvbmUgYXV0b21hdGljYWxseSBpZiB0aGVcblx0ICogZGlzcGxheSBvYmplY3QgaXMgcHJlY2FjaGVkIGJ5IG1lYW5zIG9mIGJpdG1hcCBjYWNoaW5nIG9yIGlmIHRoZSBkaXNwbGF5XG5cdCAqIG9iamVjdCBpcyBhIGRpc3BsYXkgb2JqZWN0IGNvbnRhaW5lciB0aGF0IGhhcyBhdCBsZWFzdCBvbmUgY2hpbGQgb2JqZWN0XG5cdCAqIHdpdGggYSA8Y29kZT5ibGVuZE1vZGU8L2NvZGU+IHNldHRpbmcgb3RoZXIgdGhhbiA8Y29kZT5cIm5vcm1hbFwiPC9jb2RlPi5cblx0ICpcblx0ICogPHA+Tm90IHN1cHBvcnRlZCB1bmRlciBHUFUgcmVuZGVyaW5nLjwvcD5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTEFZRVI6c3RyaW5nID0gXCJsYXllclwiO1xuXG5cdC8qKlxuXHQgKiBTZWxlY3RzIHRoZSBsaWdodGVyIG9mIHRoZSBjb25zdGl0dWVudCBjb2xvcnMgb2YgdGhlIGRpc3BsYXkgb2JqZWN0IGFuZFxuXHQgKiB0aGUgY29sb3JzIG9mIHRoZSBiYWNrZ3JvdW5kKHRoZSBjb2xvcnMgd2l0aCB0aGUgbGFyZ2VyIHZhbHVlcykuIFRoaXNcblx0ICogc2V0dGluZyBpcyBjb21tb25seSB1c2VkIGZvciBzdXBlcmltcG9zaW5nIHR5cGUuXG5cdCAqXG5cdCAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgZGlzcGxheSBvYmplY3QgaGFzIGEgcGl4ZWwgd2l0aCBhbiBSR0IgdmFsdWUgb2Zcblx0ICogMHhGRkNDMzMsIGFuZCB0aGUgYmFja2dyb3VuZCBwaXhlbCBoYXMgYW4gUkdCIHZhbHVlIG9mIDB4RERGODAwLCB0aGVcblx0ICogcmVzdWx0aW5nIFJHQiB2YWx1ZSBmb3IgdGhlIGRpc3BsYXllZCBwaXhlbCBpcyAweEZGRjgzMyhiZWNhdXNlIDB4RkYgPlxuXHQgKiAweERELCAweENDIDwgMHhGOCwgYW5kIDB4MzMgPiAweDAwID0gMzMpLjwvcD5cblx0ICpcblx0ICogPHA+Tm90IHN1cHBvcnRlZCB1bmRlciBHUFUgcmVuZGVyaW5nLjwvcD5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTElHSFRFTjpzdHJpbmcgPSBcImxpZ2h0ZW5cIjtcblxuXHQvKipcblx0ICogTXVsdGlwbGllcyB0aGUgdmFsdWVzIG9mIHRoZSBkaXNwbGF5IG9iamVjdCBjb25zdGl0dWVudCBjb2xvcnMgYnkgdGhlXG5cdCAqIGNvbnN0aXR1ZW50IGNvbG9ycyBvZiB0aGUgYmFja2dyb3VuZCBjb2xvciwgYW5kIG5vcm1hbGl6ZXMgYnkgZGl2aWRpbmcgYnlcblx0ICogMHhGRiwgcmVzdWx0aW5nIGluIGRhcmtlciBjb2xvcnMuIFRoaXMgc2V0dGluZyBpcyBjb21tb25seSB1c2VkIGZvclxuXHQgKiBzaGFkb3dzIGFuZCBkZXB0aCBlZmZlY3RzLlxuXHQgKlxuXHQgKiA8cD5Gb3IgZXhhbXBsZSwgaWYgYSBjb25zdGl0dWVudCBjb2xvcihzdWNoIGFzIHJlZCkgb2Ygb25lIHBpeGVsIGluIHRoZVxuXHQgKiBkaXNwbGF5IG9iamVjdCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgY29sb3Igb2YgdGhlIHBpeGVsIGluIHRoZSBiYWNrZ3JvdW5kXG5cdCAqIGJvdGggaGF2ZSB0aGUgdmFsdWUgMHg4OCwgdGhlIG11bHRpcGxpZWQgcmVzdWx0IGlzIDB4NDg0MC4gRGl2aWRpbmcgYnlcblx0ICogMHhGRiB5aWVsZHMgYSB2YWx1ZSBvZiAweDQ4IGZvciB0aGF0IGNvbnN0aXR1ZW50IGNvbG9yLCB3aGljaCBpcyBhIGRhcmtlclxuXHQgKiBzaGFkZSB0aGFuIHRoZSBjb2xvciBvZiB0aGUgZGlzcGxheSBvYmplY3Qgb3IgdGhlIGNvbG9yIG9mIHRoZVxuXHQgKiBiYWNrZ3JvdW5kLjwvcD5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTVVMVElQTFk6c3RyaW5nID0gXCJtdWx0aXBseVwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgZGlzcGxheSBvYmplY3QgYXBwZWFycyBpbiBmcm9udCBvZiB0aGUgYmFja2dyb3VuZC4gUGl4ZWwgdmFsdWVzIG9mIHRoZVxuXHQgKiBkaXNwbGF5IG9iamVjdCBvdmVycmlkZSB0aGUgcGl4ZWwgdmFsdWVzIG9mIHRoZSBiYWNrZ3JvdW5kLiBXaGVyZSB0aGVcblx0ICogZGlzcGxheSBvYmplY3QgaXMgdHJhbnNwYXJlbnQsIHRoZSBiYWNrZ3JvdW5kIGlzIHZpc2libGUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5PUk1BTDpzdHJpbmcgPSBcIm5vcm1hbFwiO1xuXG5cdC8qKlxuXHQgKiBBZGp1c3RzIHRoZSBjb2xvciBvZiBlYWNoIHBpeGVsIGJhc2VkIG9uIHRoZSBkYXJrbmVzcyBvZiB0aGUgYmFja2dyb3VuZC5cblx0ICogSWYgdGhlIGJhY2tncm91bmQgaXMgbGlnaHRlciB0aGFuIDUwJSBncmF5LCB0aGUgZGlzcGxheSBvYmplY3QgYW5kXG5cdCAqIGJhY2tncm91bmQgY29sb3JzIGFyZSBzY3JlZW5lZCwgd2hpY2ggcmVzdWx0cyBpbiBhIGxpZ2h0ZXIgY29sb3IuIElmIHRoZVxuXHQgKiBiYWNrZ3JvdW5kIGlzIGRhcmtlciB0aGFuIDUwJSBncmF5LCB0aGUgY29sb3JzIGFyZSBtdWx0aXBsaWVkLCB3aGljaFxuXHQgKiByZXN1bHRzIGluIGEgZGFya2VyIGNvbG9yLiBUaGlzIHNldHRpbmcgaXMgY29tbW9ubHkgdXNlZCBmb3Igc2hhZGluZ1xuXHQgKiBlZmZlY3RzLlxuXHQgKlxuXHQgKiA8cD5Ob3Qgc3VwcG9ydGVkIHVuZGVyIEdQVSByZW5kZXJpbmcuPC9wPlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBPVkVSTEFZOnN0cmluZyA9IFwib3ZlcmxheVwiO1xuXG5cdC8qKlxuXHQgKiBNdWx0aXBsaWVzIHRoZSBjb21wbGVtZW50KGludmVyc2UpIG9mIHRoZSBkaXNwbGF5IG9iamVjdCBjb2xvciBieSB0aGVcblx0ICogY29tcGxlbWVudCBvZiB0aGUgYmFja2dyb3VuZCBjb2xvciwgcmVzdWx0aW5nIGluIGEgYmxlYWNoaW5nIGVmZmVjdC4gVGhpc1xuXHQgKiBzZXR0aW5nIGlzIGNvbW1vbmx5IHVzZWQgZm9yIGhpZ2hsaWdodHMgb3IgdG8gcmVtb3ZlIGJsYWNrIGFyZWFzIG9mIHRoZVxuXHQgKiBkaXNwbGF5IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgU0NSRUVOOnN0cmluZyA9IFwic2NyZWVuXCI7XG5cblx0LyoqXG5cdCAqIFVzZXMgYSBzaGFkZXIgdG8gZGVmaW5lIHRoZSBibGVuZCBiZXR3ZWVuIG9iamVjdHMuXG5cdCAqXG5cdCAqIDxwPlNldHRpbmcgdGhlIDxjb2RlPmJsZW5kU2hhZGVyPC9jb2RlPiBwcm9wZXJ0eSB0byBhIFNoYWRlciBpbnN0YW5jZVxuXHQgKiBhdXRvbWF0aWNhbGx5IHNldHMgdGhlIGRpc3BsYXkgb2JqZWN0J3MgPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBwcm9wZXJ0eSB0b1xuXHQgKiA8Y29kZT5CbGVuZE1vZGUuU0hBREVSPC9jb2RlPi4gSWYgdGhlIDxjb2RlPmJsZW5kTW9kZTwvY29kZT4gcHJvcGVydHkgaXNcblx0ICogc2V0IHRvIDxjb2RlPkJsZW5kTW9kZS5TSEFERVI8L2NvZGU+IHdpdGhvdXQgZmlyc3Qgc2V0dGluZyB0aGVcblx0ICogPGNvZGU+YmxlbmRTaGFkZXI8L2NvZGU+IHByb3BlcnR5LCB0aGUgPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBwcm9wZXJ0eSBpc1xuXHQgKiBzZXQgdG8gPGNvZGU+QmxlbmRNb2RlLk5PUk1BTDwvY29kZT4gaW5zdGVhZC4gSWYgdGhlXG5cdCAqIDxjb2RlPmJsZW5kU2hhZGVyPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQod2hpY2ggc2V0cyB0aGVcblx0ICogPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBwcm9wZXJ0eSB0byA8Y29kZT5CbGVuZE1vZGUuU0hBREVSPC9jb2RlPiksIHRoZW5cblx0ICogbGF0ZXIgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5ibGVuZE1vZGU8L2NvZGU+IHByb3BlcnR5IGlzIGNoYW5nZWQsIHRoZVxuXHQgKiBibGVuZCBtb2RlIGNhbiBiZSByZXNldCB0byB1c2UgdGhlIGJsZW5kIHNoYWRlciBzaW1wbHkgYnkgc2V0dGluZyB0aGVcblx0ICogPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBwcm9wZXJ0eSB0byA8Y29kZT5CbGVuZE1vZGUuU0hBREVSPC9jb2RlPi4gVGhlXG5cdCAqIDxjb2RlPmJsZW5kU2hhZGVyPC9jb2RlPiBwcm9wZXJ0eSBkb2VzIG5vdCBuZWVkIHRvIGJlIHNldCBhZ2FpbiBleGNlcHQgdG9cblx0ICogY2hhbmdlIHRoZSBzaGFkZXIgdGhhdCdzIHVzZWQgdG8gZGVmaW5lIHRoZSBibGVuZCBtb2RlLjwvcD5cblx0ICpcblx0ICogPHA+Tm90IHN1cHBvcnRlZCB1bmRlciBHUFUgcmVuZGVyaW5nLjwvcD5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgU0hBREVSOnN0cmluZyA9IFwic2hhZGVyXCI7XG5cblx0LyoqXG5cdCAqIFN1YnRyYWN0cyB0aGUgdmFsdWVzIG9mIHRoZSBjb25zdGl0dWVudCBjb2xvcnMgaW4gdGhlIGRpc3BsYXkgb2JqZWN0IGZyb21cblx0ICogdGhlIHZhbHVlcyBvZiB0aGUgYmFja2dyb3VuZCBjb2xvciwgYXBwbHlpbmcgYSBmbG9vciBvZiAwLiBUaGlzIHNldHRpbmcgaXNcblx0ICogY29tbW9ubHkgdXNlZCBmb3IgYW5pbWF0aW5nIGEgZGFya2VuaW5nIGRpc3NvbHZlIGJldHdlZW4gdHdvIG9iamVjdHMuXG5cdCAqXG5cdCAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgZGlzcGxheSBvYmplY3QgaGFzIGEgcGl4ZWwgd2l0aCBhbiBSR0IgdmFsdWUgb2Zcblx0ICogMHhBQTIyMzMsIGFuZCB0aGUgYmFja2dyb3VuZCBwaXhlbCBoYXMgYW4gUkdCIHZhbHVlIG9mIDB4RERBNjAwLCB0aGVcblx0ICogcmVzdWx0aW5nIFJHQiB2YWx1ZSBmb3IgdGhlIGRpc3BsYXllZCBwaXhlbCBpcyAweDMzODQwMChiZWNhdXNlIDB4REQgLVxuXHQgKiAweEFBID0gMHgzMywgMHhBNiAtIDB4MjIgPSAweDg0LCBhbmQgMHgwMCAtIDB4MzMgPCAweDAwKS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFNVQlRSQUNUOnN0cmluZyA9IFwic3VidHJhY3RcIjtcbn1cblxuZXhwb3J0ID0gQmxlbmRNb2RlOyJdfQ== \ No newline at end of file diff --git a/lib/core/base/BlendMode.ts b/lib/core/base/BlendMode.ts new file mode 100644 index 00000000..e65b6b2f --- /dev/null +++ b/lib/core/base/BlendMode.ts @@ -0,0 +1,190 @@ +/** + * A class that provides constant values for visual blend mode effects. These + * constants are used in the following: + *
    + *
  • The blendMode property of the + * flash.display.DisplayObject class.
  • + *
  • The blendMode parameter of the draw() + * method of the flash.display.BitmapData class
  • + *
+ */ +class BlendMode +{ + /** + * Adds the values of the constituent colors of the display object to the + * colors of its background, applying a ceiling of 0xFF. This setting is + * commonly used for animating a lightening dissolve between two objects. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xAAA633, and the background pixel has an RGB value of 0xDD2200, the + * resulting RGB value for the displayed pixel is 0xFFC833(because 0xAA + + * 0xDD > 0xFF, 0xA6 + 0x22 = 0xC8, and 0x33 + 0x00 = 0x33).

+ */ + public static ADD:string = "add"; + + /** + * Applies the alpha value of each pixel of the display object to the + * background. This requires the blendMode property of the + * parent display object be set to + * away.base.BlendMode.LAYER. + * + *

Not supported under GPU rendering.

+ */ + public static ALPHA:string = "alpha"; + + /** + * Selects the darker of the constituent colors of the display object and the + * colors of the background(the colors with the smaller values). This + * setting is commonly used for superimposing type. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the + * resulting RGB value for the displayed pixel is 0xDDCC00(because 0xFF > + * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

+ * + *

Not supported under GPU rendering.

+ */ + public static DARKEN:string = "darken"; + + /** + * Compares the constituent colors of the display object with the colors of + * its background, and subtracts the darker of the values of the two + * constituent colors from the lighter value. This setting is commonly used + * for more vibrant colors. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the + * resulting RGB value for the displayed pixel is 0x222C33(because 0xFF - + * 0xDD = 0x22, 0xF8 - 0xCC = 0x2C, and 0x33 - 0x00 = 0x33).

+ */ + public static DIFFERENCE:string = "difference"; + + /** + * Erases the background based on the alpha value of the display object. This + * process requires that the blendMode property of the parent + * display object be set to flash.display.BlendMode.LAYER. + * + *

Not supported under GPU rendering.

+ */ + public static ERASE:string = "erase"; + + /** + * Adjusts the color of each pixel based on the darkness of the display + * object. If the display object is lighter than 50% gray, the display object + * and background colors are screened, which results in a lighter color. If + * the display object is darker than 50% gray, the colors are multiplied, + * which results in a darker color. This setting is commonly used for shading + * effects. + * + *

Not supported under GPU rendering.

+ */ + public static HARDLIGHT:string = "hardlight"; + + /** + * Inverts the background. + */ + public static INVERT:string = "invert"; + + /** + * Forces the creation of a transparency group for the display object. This + * means that the display object is precomposed in a temporary buffer before + * it is processed further. The precomposition is done automatically if the + * display object is precached by means of bitmap caching or if the display + * object is a display object container that has at least one child object + * with a blendMode setting other than "normal". + * + *

Not supported under GPU rendering.

+ */ + public static LAYER:string = "layer"; + + /** + * Selects the lighter of the constituent colors of the display object and + * the colors of the background(the colors with the larger values). This + * setting is commonly used for superimposing type. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the + * resulting RGB value for the displayed pixel is 0xFFF833(because 0xFF > + * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

+ * + *

Not supported under GPU rendering.

+ */ + public static LIGHTEN:string = "lighten"; + + /** + * Multiplies the values of the display object constituent colors by the + * constituent colors of the background color, and normalizes by dividing by + * 0xFF, resulting in darker colors. This setting is commonly used for + * shadows and depth effects. + * + *

For example, if a constituent color(such as red) of one pixel in the + * display object and the corresponding color of the pixel in the background + * both have the value 0x88, the multiplied result is 0x4840. Dividing by + * 0xFF yields a value of 0x48 for that constituent color, which is a darker + * shade than the color of the display object or the color of the + * background.

+ */ + public static MULTIPLY:string = "multiply"; + + /** + * The display object appears in front of the background. Pixel values of the + * display object override the pixel values of the background. Where the + * display object is transparent, the background is visible. + */ + public static NORMAL:string = "normal"; + + /** + * Adjusts the color of each pixel based on the darkness of the background. + * If the background is lighter than 50% gray, the display object and + * background colors are screened, which results in a lighter color. If the + * background is darker than 50% gray, the colors are multiplied, which + * results in a darker color. This setting is commonly used for shading + * effects. + * + *

Not supported under GPU rendering.

+ */ + public static OVERLAY:string = "overlay"; + + /** + * Multiplies the complement(inverse) of the display object color by the + * complement of the background color, resulting in a bleaching effect. This + * setting is commonly used for highlights or to remove black areas of the + * display object. + */ + public static SCREEN:string = "screen"; + + /** + * Uses a shader to define the blend between objects. + * + *

Setting the blendShader property to a Shader instance + * automatically sets the display object's blendMode property to + * BlendMode.SHADER. If the blendMode property is + * set to BlendMode.SHADER without first setting the + * blendShader property, the blendMode property is + * set to BlendMode.NORMAL instead. If the + * blendShader property is set(which sets the + * blendMode property to BlendMode.SHADER), then + * later the value of the blendMode property is changed, the + * blend mode can be reset to use the blend shader simply by setting the + * blendMode property to BlendMode.SHADER. The + * blendShader property does not need to be set again except to + * change the shader that's used to define the blend mode.

+ * + *

Not supported under GPU rendering.

+ */ + public static SHADER:string = "shader"; + + /** + * Subtracts the values of the constituent colors in the display object from + * the values of the background color, applying a floor of 0. This setting is + * commonly used for animating a darkening dissolve between two objects. + * + *

For example, if the display object has a pixel with an RGB value of + * 0xAA2233, and the background pixel has an RGB value of 0xDDA600, the + * resulting RGB value for the displayed pixel is 0x338400(because 0xDD - + * 0xAA = 0x33, 0xA6 - 0x22 = 0x84, and 0x00 - 0x33 < 0x00).

+ */ + public static SUBTRACT:string = "subtract"; +} + +export = BlendMode; \ No newline at end of file diff --git a/lib/core/base/CapsStyle.js b/lib/core/base/CapsStyle.js new file mode 100755 index 00000000..d3d5b346 --- /dev/null +++ b/lib/core/base/CapsStyle.js @@ -0,0 +1,21 @@ +/** +* The CapsStyle class is an enumeration of constant values that specify the +* caps style to use in drawing lines. The constants are provided for use as +* values in the caps parameter of the +* flash.display.Graphics.lineStyle() method. You can specify the +* following three types of caps: +*/ +var CapsStyle = (function () { + function CapsStyle() { + } + CapsStyle.ROUND = "round"; + + CapsStyle.NONE = "none"; + + CapsStyle.SQUARE = "square"; + return CapsStyle; +})(); + +module.exports = CapsStyle; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9DYXBzU3R5bGUudHMiXSwibmFtZXMiOlsiQ2Fwc1N0eWxlIiwiQ2Fwc1N0eWxlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0VBTUc7QUFDSDtJQUFBQTtJQW1CQUMsQ0FBQ0E7QUFBQUQsSUFiQUEsa0JBQTZCQSxPQUFPQTs7SUFNcENBLGlCQUE0QkEsTUFBTUE7O0lBTWxDQSxtQkFBOEJBLFFBQVFBO0lBQ3ZDQSxpQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCwwQkFBbUIsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvQ2Fwc1N0eWxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgQ2Fwc1N0eWxlIGNsYXNzIGlzIGFuIGVudW1lcmF0aW9uIG9mIGNvbnN0YW50IHZhbHVlcyB0aGF0IHNwZWNpZnkgdGhlXG4gKiBjYXBzIHN0eWxlIHRvIHVzZSBpbiBkcmF3aW5nIGxpbmVzLiBUaGUgY29uc3RhbnRzIGFyZSBwcm92aWRlZCBmb3IgdXNlIGFzXG4gKiB2YWx1ZXMgaW4gdGhlIDxjb2RlPmNhcHM8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGVcbiAqIDxjb2RlPmZsYXNoLmRpc3BsYXkuR3JhcGhpY3MubGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZC4gWW91IGNhbiBzcGVjaWZ5IHRoZVxuICogZm9sbG93aW5nIHRocmVlIHR5cGVzIG9mIGNhcHM6XG4gKi9cbmNsYXNzIENhcHNTdHlsZVxue1xuXHQvKipcblx0ICogVXNlZCB0byBzcGVjaWZ5IHJvdW5kIGNhcHMgaW4gdGhlIDxjb2RlPmNhcHM8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGVcblx0ICogPGNvZGU+Zmxhc2guZGlzcGxheS5HcmFwaGljcy5saW5lU3R5bGUoKTwvY29kZT4gbWV0aG9kLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBST1VORDpzdHJpbmcgPSBcInJvdW5kXCI7XG5cblx0LyoqXG5cdCAqIFVzZWQgdG8gc3BlY2lmeSBubyBjYXBzIGluIHRoZSA8Y29kZT5jYXBzPC9jb2RlPiBwYXJhbWV0ZXIgb2YgdGhlXG5cdCAqIDxjb2RlPmZsYXNoLmRpc3BsYXkuR3JhcGhpY3MubGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTk9ORTpzdHJpbmcgPSBcIm5vbmVcIjtcblxuXHQvKipcblx0ICogVXNlZCB0byBzcGVjaWZ5IHNxdWFyZSBjYXBzIGluIHRoZSA8Y29kZT5jYXBzPC9jb2RlPiBwYXJhbWV0ZXIgb2YgdGhlXG5cdCAqIDxjb2RlPmZsYXNoLmRpc3BsYXkuR3JhcGhpY3MubGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgU1FVQVJFOnN0cmluZyA9IFwic3F1YXJlXCI7XG59XG5cbmV4cG9ydCA9IENhcHNTdHlsZTsiXX0= \ No newline at end of file diff --git a/lib/core/base/CapsStyle.ts b/lib/core/base/CapsStyle.ts new file mode 100644 index 00000000..da0c71f5 --- /dev/null +++ b/lib/core/base/CapsStyle.ts @@ -0,0 +1,29 @@ +/** + * The CapsStyle class is an enumeration of constant values that specify the + * caps style to use in drawing lines. The constants are provided for use as + * values in the caps parameter of the + * flash.display.Graphics.lineStyle() method. You can specify the + * following three types of caps: + */ +class CapsStyle +{ + /** + * Used to specify round caps in the caps parameter of the + * flash.display.Graphics.lineStyle() method. + */ + public static ROUND:string = "round"; + + /** + * Used to specify no caps in the caps parameter of the + * flash.display.Graphics.lineStyle() method. + */ + public static NONE:string = "none"; + + /** + * Used to specify square caps in the caps parameter of the + * flash.display.Graphics.lineStyle() method. + */ + public static SQUARE:string = "square"; +} + +export = CapsStyle; \ No newline at end of file diff --git a/lib/core/base/DisplayObject.js b/lib/core/base/DisplayObject.js new file mode 100755 index 00000000..bf17a246 --- /dev/null +++ b/lib/core/base/DisplayObject.js @@ -0,0 +1,2131 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AxisAlignedBoundingBox = require("awayjs-core/lib/bounds/AxisAlignedBoundingBox"); + +var AlignmentMode = require("awayjs-core/lib/core/base/AlignmentMode"); + +var OrientationMode = require("awayjs-core/lib/core/base/OrientationMode"); + +var MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +var Point = require("awayjs-core/lib/core/geom/Point"); + +var Transform = require("awayjs-core/lib/core/geom/Transform"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var DisplayObjectEvent = require("awayjs-core/lib/events/DisplayObjectEvent"); +var SceneEvent = require("awayjs-core/lib/events/SceneEvent"); + +/** +* The DisplayObject class is the base class for all objects that can be +* placed on the display list. The display list manages all objects displayed +* in flash. Use the DisplayObjectContainer class to arrange the +* display objects in the display list. DisplayObjectContainer objects can +* have child display objects, while other display objects, such as Shape and +* TextField objects, are "leaf" nodes that have only parents and siblings, no +* children. +* +*

The DisplayObject class supports basic functionality like the x +* and y position of an object, as well as more advanced properties of +* the object such as its transformation matrix.

+* +*

DisplayObject is an abstract base class; therefore, you cannot call +* DisplayObject directly. Invoking new DisplayObject() throws an +* ArgumentError exception.

+* +*

All display objects inherit from the DisplayObject class.

+* +*

The DisplayObject class itself does not include any APIs for rendering +* content onscreen. For that reason, if you want create a custom subclass of +* the DisplayObject class, you will want to extend one of its subclasses that +* do have APIs for rendering content onscreen, such as the Shape, Sprite, +* Bitmap, SimpleButton, TextField, or MovieClip class.

+* +*

The DisplayObject class contains several broadcast events. Normally, the +* target of any particular event is a specific DisplayObject instance. For +* example, the target of an added event is the specific +* DisplayObject instance that was added to the display list. Having a single +* target restricts the placement of event listeners to that target and in +* some cases the target's ancestors on the display list. With broadcast +* events, however, the target is not a specific DisplayObject instance, but +* rather all DisplayObject instances, including those that are not on the +* display list. This means that you can add a listener to any DisplayObject +* instance to listen for broadcast events. In addition to the broadcast +* events listed in the DisplayObject class's Events table, the DisplayObject +* class also inherits two broadcast events from the EventDispatcher class: +* activate and deactivate.

+* +*

Some properties previously used in the ActionScript 1.0 and 2.0 +* MovieClip, TextField, and Button classes(such as _alpha, +* _height, _name, _width, +* _x, _y, and others) have equivalents in the +* ActionScript 3.0 DisplayObject class that are renamed so that they no +* longer begin with the underscore(_) character.

+* +*

For more information, see the "Display Programming" chapter of the +* ActionScript 3.0 Developer's Guide.

+* +* @event added Dispatched when a display object is added to the +* display list. The following methods trigger this +* event: +* DisplayObjectContainer.addChild(), +* DisplayObjectContainer.addChildAt(). +* @event addedToStage Dispatched when a display object is added to the on +* stage display list, either directly or through the +* addition of a sub tree in which the display object +* is contained. The following methods trigger this +* event: +* DisplayObjectContainer.addChild(), +* DisplayObjectContainer.addChildAt(). +* @event enterFrame [broadcast event] Dispatched when the playhead is +* entering a new frame. If the playhead is not +* moving, or if there is only one frame, this event +* is dispatched continuously in conjunction with the +* frame rate. This event is a broadcast event, which +* means that it is dispatched by all display objects +* with a listener registered for this event. +* @event exitFrame [broadcast event] Dispatched when the playhead is +* exiting the current frame. All frame scripts have +* been run. If the playhead is not moving, or if +* there is only one frame, this event is dispatched +* continuously in conjunction with the frame rate. +* This event is a broadcast event, which means that +* it is dispatched by all display objects with a +* listener registered for this event. +* @event frameConstructed [broadcast event] Dispatched after the constructors +* of frame display objects have run but before frame +* scripts have run. If the playhead is not moving, or +* if there is only one frame, this event is +* dispatched continuously in conjunction with the +* frame rate. This event is a broadcast event, which +* means that it is dispatched by all display objects +* with a listener registered for this event. +* @event removed Dispatched when a display object is about to be +* removed from the display list. Two methods of the +* DisplayObjectContainer class generate this event: +* removeChild() and +* removeChildAt(). +* +*

The following methods of a +* DisplayObjectContainer object also generate this +* event if an object must be removed to make room for +* the new object: addChild(), +* addChildAt(), and +* setChildIndex().

+* @event removedFromStage Dispatched when a display object is about to be +* removed from the display list, either directly or +* through the removal of a sub tree in which the +* display object is contained. Two methods of the +* DisplayObjectContainer class generate this event: +* removeChild() and +* removeChildAt(). +* +*

The following methods of a +* DisplayObjectContainer object also generate this +* event if an object must be removed to make room for +* the new object: addChild(), +* addChildAt(), and +* setChildIndex().

+* @event render [broadcast event] Dispatched when the display list +* is about to be updated and rendered. This event +* provides the last opportunity for objects listening +* for this event to make changes before the display +* list is rendered. You must call the +* invalidate() method of the Stage +* object each time you want a render +* event to be dispatched. Render events +* are dispatched to an object only if there is mutual +* trust between it and the object that called +* Stage.invalidate(). This event is a +* broadcast event, which means that it is dispatched +* by all display objects with a listener registered +* for this event. +* +*

Note: This event is not dispatched if the +* display is not rendering. This is the case when the +* content is either minimized or obscured.

+*/ +var DisplayObject = (function (_super) { + __extends(DisplayObject, _super); + /** + * Creates a new DisplayObject instance. + */ + function DisplayObject() { + _super.call(this); + this._pSceneTransform = new Matrix3D(); + this._pSceneTransformDirty = true; + this._matrix3D = new Matrix3D(); + this._matrix3DDirty = true; + this._inverseSceneTransform = new Matrix3D(); + this._inverseSceneTransformDirty = true; + this._scenePosition = new Vector3D(); + this._scenePositionDirty = true; + this._explicitVisibility = true; + this._pImplicitVisibility = true; + this._explicitMouseEnabled = true; + this._pImplicitMouseEnabled = true; + this._positionDirty = true; + this._rotationDirty = true; + this._scaleDirty = true; + this._rotationX = 0; + this._rotationY = 0; + this._rotationZ = 0; + this._eulers = new Vector3D(); + this._flipY = new Matrix3D(); + this._zOffset = 0; + this._pScaleX = 1; + this._pScaleY = 1; + this._pScaleZ = 1; + this._x = 0; + this._y = 0; + this._z = 0; + this._pivot = new Vector3D(); + this._orientationMatrix = new Matrix3D(); + this._pivotZero = true; + this._pivotDirty = true; + this._pos = new Vector3D(); + this._rot = new Vector3D(); + this._sca = new Vector3D(); + this._pIgnoreTransform = false; + this._pBoundsInvalid = true; + this._worldBoundsInvalid = true; + this._pRenderables = new Array(); + /** + * + */ + this.alignmentMode = AlignmentMode.REGISTRATION_POINT; + /** + * + */ + this.castsShadows = true; + /** + * + */ + this.orientationMode = OrientationMode.DEFAULT; + + // Cached vector of transformation components used when + // recomposing the transform matrix in updateTransform() + this._transformComponents = new Array(3); //_transformComponents = new Vector.(3, true); + + this._transformComponents[0] = this._pos; + this._transformComponents[1] = this._rot; + this._transformComponents[2] = this._sca; + + //creation of associated transform object + this._transform = new Transform(this); + + this._matrix3D.identity(); + + this._flipY.appendScale(1, -1, 1); + + this._pBounds = this.pCreateDefaultBoundingVolume(); + + this._worldBounds = this.pCreateDefaultBoundingVolume(); + } + Object.defineProperty(DisplayObject.prototype, "bounds", { + /** + * + */ + get: function () { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._pBounds; + }, + set: function (value) { + if (this._pBounds == value) + return; + + this._pBounds = value; + + this._worldBounds = value.clone(); + + this.pInvalidateBounds(); + + if (this._boundsVisible) + this._partitionNode._iUpdateEntityBounds(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "depth", { + /** + * Indicates the depth of the display object, in pixels. The depth is + * calculated based on the bounds of the content of the display object. When + * you set the depth property, the scaleZ property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content (such as an empty sprite) has a depth of 0, even if you try to + * set depth to a different value.

+ */ + get: function () { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._depth; + }, + set: function (val) { + if (this._depth == val) + return; + + this._depth == val; + + this._pScaleZ = val / this.bounds.aabb.depth; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "eulers", { + /** + * Defines the rotation of the 3d object as a Vector3D object containing euler angles for rotation around x, y and z axis. + */ + get: function () { + this._eulers.x = this._rotationX * MathConsts.RADIANS_TO_DEGREES; + this._eulers.y = this._rotationY * MathConsts.RADIANS_TO_DEGREES; + this._eulers.z = this._rotationZ * MathConsts.RADIANS_TO_DEGREES; + + return this._eulers; + }, + set: function (value) { + this._rotationX = value.x * MathConsts.DEGREES_TO_RADIANS; + this._rotationY = value.y * MathConsts.DEGREES_TO_RADIANS; + this._rotationZ = value.z * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "height", { + /** + * An indexed array that contains each filter object currently associated + * with the display object. The flash.filters package contains several + * classes that define specific filters you can use. + * + *

Filters can be applied in Flash Professional at design time, or at run + * time by using ActionScript code. To apply a filter by using ActionScript, + * you must make a temporary copy of the entire filters array, + * modify the temporary array, then assign the value of the temporary array + * back to the filters array. You cannot directly add a new + * filter object to the filters array.

+ * + *

To add a filter by using ActionScript, perform the following steps + * (assume that the target display object is named + * myDisplayObject):

+ * + *
    + *
  1. Create a new filter object by using the constructor method of your + * chosen filter class.
  2. + *
  3. Assign the value of the myDisplayObject.filters array + * to a temporary array, such as one named myFilters.
  4. + *
  5. Add the new filter object to the myFilters temporary + * array.
  6. + *
  7. Assign the value of the temporary array to the + * myDisplayObject.filters array.
  8. + *
+ * + *

If the filters array is undefined, you do not need to use + * a temporary array. Instead, you can directly assign an array literal that + * contains one or more filter objects that you create. The first example in + * the Examples section adds a drop shadow filter by using code that handles + * both defined and undefined filters arrays.

+ * + *

To modify an existing filter object, you must use the technique of + * modifying a copy of the filters array:

+ * + *
    + *
  1. Assign the value of the filters array to a temporary + * array, such as one named myFilters.
  2. + *
  3. Modify the property by using the temporary array, + * myFilters. For example, to set the quality property of the + * first filter in the array, you could use the following code: + * myFilters[0].quality = 1;
  4. + *
  5. Assign the value of the temporary array to the filters + * array.
  6. + *
+ * + *

At load time, if a display object has an associated filter, it is + * marked to cache itself as a transparent bitmap. From this point forward, + * as long as the display object has a valid filter list, the player caches + * the display object as a bitmap. This source bitmap is used as a source + * image for the filter effects. Each display object usually has two bitmaps: + * one with the original unfiltered source display object and another for the + * final image after filtering. The final image is used when rendering. As + * long as the display object does not change, the final image does not need + * updating.

+ * + *

The flash.filters package includes classes for filters. For example, to + * create a DropShadow filter, you would write:

+ * + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader output type is not compatible with + * this operation(the shader must specify a + * pixel4 output). + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader doesn't specify any image input or + * the first input is not an image4 input. + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader specifies an image input that isn't + * provided. + * @throws ArgumentError When filters includes a ShaderFilter, a + * ByteArray or Vector. instance as a shader + * input, and the width and + * height properties aren't specified for + * the ShaderInput object, or the specified values + * don't match the amount of data in the input data. + * See the ShaderInput.input property for + * more information. + */ + // public filters:Array; + /** + * Indicates the height of the display object, in pixels. The height is + * calculated based on the bounds of the content of the display object. When + * you set the height property, the scaleY property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content (such as an empty sprite) has a height of 0, even if you try to + * set height to a different value.

+ */ + get: function () { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._height; + }, + set: function (val) { + if (this._height == val) + return; + + this._height == val; + + this._pScaleY = val / this.bounds.aabb.height; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "index", { + /** + * Indicates the instance container index of the DisplayObject. The object can be + * identified in the child list of its parent display object container by + * calling the getChildByIndex() method of the display object + * container. + * + *

If the DisplayObject has no parent container, index defaults to 0.

+ */ + get: function () { + if (this._pParent) + return this._pParent.getChildIndex(this); + + return 0; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "inverseSceneTransform", { + /** + * + */ + get: function () { + if (this._inverseSceneTransformDirty) { + this._inverseSceneTransform.copyFrom(this.sceneTransform); + this._inverseSceneTransform.invert(); + this._inverseSceneTransformDirty = false; + } + return this._inverseSceneTransform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "ignoreTransform", { + /** + * + */ + get: function () { + return this._pIgnoreTransform; + }, + set: function (value) { + if (this._pIgnoreTransform == value) + return; + + this._pIgnoreTransform = value; + + if (value) { + this._pSceneTransform.identity(); + this._scenePosition.setTo(0, 0, 0); + } + + this.pInvalidateSceneTransform(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "isEntity", { + /** + * + */ + get: function () { + return this._pIsEntity; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "loaderInfo", { + /** + * Returns a LoaderInfo object containing information about loading the file + * to which this display object belongs. The loaderInfo property + * is defined only for the root display object of a SWF file or for a loaded + * Bitmap(not for a Bitmap that is drawn with ActionScript). To find the + * loaderInfo object associated with the SWF file that contains + * a display object named myDisplayObject, use + * myDisplayObject.root.loaderInfo. + * + *

A large SWF file can monitor its download by calling + * this.root.loaderInfo.addEventListener(Event.COMPLETE, + * func).

+ */ + get: function () { + return this._loaderInfo; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "mouseEnabled", { + /** + * Specifies whether this object receives mouse, or other user input, + * messages. The default value is true, which means that by + * default any InteractiveObject instance that is on the display list + * receives mouse events or other user input events. If + * mouseEnabled is set to false, the instance does + * not receive any mouse events(or other user input events like keyboard + * events). Any children of this instance on the display list are not + * affected. To change the mouseEnabled behavior for all + * children of an object on the display list, use + * flash.display.DisplayObjectContainer.mouseChildren. + * + *

No event is dispatched by setting this property. You must use the + * addEventListener() method to create interactive + * functionality.

+ */ + get: function () { + return this._explicitMouseEnabled; + }, + set: function (value) { + if (this._explicitMouseEnabled == value) + return; + + this._explicitMouseEnabled = value; + + this._pUpdateImplicitMouseEnabled(this._pParent ? this._pParent.mouseChildren : true); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "mouseX", { + /** + * Indicates the x coordinate of the mouse or user input device position, in + * pixels. + * + *

Note: For a DisplayObject that has been rotated, the returned x + * coordinate will reflect the non-rotated object.

+ */ + get: function () { + return this._mouseX; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "mouseY", { + /** + * Indicates the y coordinate of the mouse or user input device position, in + * pixels. + * + *

Note: For a DisplayObject that has been rotated, the returned y + * coordinate will reflect the non-rotated object.

+ */ + get: function () { + return this._mouseY; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "parent", { + /** + * Indicates the DisplayObjectContainer object that contains this display + * object. Use the parent property to specify a relative path to + * display objects that are above the current display object in the display + * list hierarchy. + * + *

You can use parent to move up multiple levels in the + * display list as in the following:

+ * + * @throws SecurityError The parent display object belongs to a security + * sandbox to which you do not have access. You can + * avoid this situation by having the parent movie call + * the Security.allowDomain() method. + */ + get: function () { + return this._pParent; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "partition", { + /** + * + */ + get: function () { + return this._explicitPartition; + }, + set: function (value) { + if (this._explicitPartition == value) + return; + + if (this._pScene && this._explicitPartition) + this._pScene.iUnregisterPartition(this._explicitPartition); + + this._explicitPartition = value; + + if (this._pScene && value) + this._pScene.iRegisterPartition(value); + + this._pUpdateImplicitPartition(this._pParent ? this._pParent._iAssignedPartition : null); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "partitionNode", { + /** + * + */ + get: function () { + if (!this._partitionNode) + this._partitionNode = this.pCreateEntityPartitionNode(); + + return this._partitionNode; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "pickingCollider", { + /** + * + */ + get: function () { + return this._pPickingCollider; + }, + set: function (value) { + this._pPickingCollider = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "pivot", { + /** + * Defines the local point around which the object rotates. + */ + get: function () { + return this._pivot; + }, + set: function (pivot) { + this._pivot = pivot.clone(); + + this.invalidatePivot(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "root", { + /** + * For a display object in a loaded SWF file, the root property + * is the top-most display object in the portion of the display list's tree + * structure represented by that SWF file. For a Bitmap object representing a + * loaded image file, the root property is the Bitmap object + * itself. For the instance of the main class of the first SWF file loaded, + * the root property is the display object itself. The + * root property of the Stage object is the Stage object itself. + * The root property is set to null for any display + * object that has not been added to the display list, unless it has been + * added to a display object container that is off the display list but that + * is a child of the top-most display object in a loaded SWF file. + * + *

For example, if you create a new Sprite object by calling the + * Sprite() constructor method, its root property + * is null until you add it to the display list(or to a display + * object container that is off the display list but that is a child of the + * top-most display object in a SWF file).

+ * + *

For a loaded SWF file, even though the Loader object used to load the + * file may not be on the display list, the top-most display object in the + * SWF file has its root property set to itself. The Loader + * object does not have its root property set until it is added + * as a child of a display object for which the root property is + * set.

+ */ + get: function () { + return this._root; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "rotationX", { + /** + * Indicates the x-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + get: function () { + return this._rotationX * MathConsts.RADIANS_TO_DEGREES; + }, + set: function (val) { + if (this.rotationX == val) + return; + + this._rotationX = val * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "rotationY", { + /** + * Indicates the y-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + get: function () { + return this._rotationY * MathConsts.RADIANS_TO_DEGREES; + }, + set: function (val) { + if (this.rotationY == val) + return; + + this._rotationY = val * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "rotationZ", { + /** + * Indicates the z-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + get: function () { + return this._rotationZ * MathConsts.RADIANS_TO_DEGREES; + }, + set: function (val) { + if (this.rotationZ == val) + return; + + this._rotationZ = val * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "scaleX", { + /** + * Indicates the horizontal scale(percentage) of the object as applied from + * the registration point. The default registration point is(0,0). 1.0 + * equals 100% scale. + * + *

Scaling the local coordinate system changes the x and + * y property values, which are defined in whole pixels.

+ */ + get: function () { + return this._pScaleX; + }, + set: function (val) { + if (this._pScaleX == val) + return; + + this._pScaleX = val; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "scaleY", { + /** + * Indicates the vertical scale(percentage) of an object as applied from the + * registration point of the object. The default registration point is(0,0). + * 1.0 is 100% scale. + * + *

Scaling the local coordinate system changes the x and + * y property values, which are defined in whole pixels.

+ */ + get: function () { + return this._pScaleY; + }, + set: function (val) { + if (this._pScaleY == val) + return; + + this._pScaleY = val; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "scaleZ", { + /** + * Indicates the depth scale(percentage) of an object as applied from the + * registration point of the object. The default registration point is(0,0). + * 1.0 is 100% scale. + * + *

Scaling the local coordinate system changes the x, + * y and z property values, which are defined in + * whole pixels.

+ */ + get: function () { + return this._pScaleZ; + }, + set: function (val) { + if (this._pScaleZ == val) + return; + + this._pScaleZ = val; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "scene", { + /** + * + */ + get: function () { + return this._pScene; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "scenePosition", { + /** + * + */ + get: function () { + if (this._scenePositionDirty) { + if (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) { + var pivotScale = new Vector3D(this._pivot.x / this._pScaleX, this._pivot.y / this._pScaleY, this._pivot.z / this._pScaleZ); + this._scenePosition = this.sceneTransform.transformVector(pivotScale); + //this._scenePosition.decrementBy(new Vector3D(this._pivot.x*this._pScaleX, this._pivot.y*this._pScaleY, this._pivot.z*this._pScaleZ)); + } else { + this.sceneTransform.copyColumnTo(3, this._scenePosition); + } + + this._scenePositionDirty = false; + } + return this._scenePosition; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "sceneTransform", { + get: function () { + if (this._pSceneTransformDirty) + this.pUpdateSceneTransform(); + + return this._pSceneTransform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "shaderPickingDetails", { + /** + * + */ + get: function () { + return this._shaderPickingDetails; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "boundsVisible", { + /** + * + */ + get: function () { + return this._boundsVisible; + }, + set: function (value) { + if (value == this._boundsVisible) + return; + + this._boundsVisible = value; + + this._partitionNode.boundsVisible = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "transform", { + /** + * An object with properties pertaining to a display object's matrix, color + * transform, and pixel bounds. The specific properties - matrix, + * colorTransform, and three read-only properties + * (concatenatedMatrix, concatenatedColorTransform, + * and pixelBounds) - are described in the entry for the + * Transform class. + * + *

Each of the transform object's properties is itself an object. This + * concept is important because the only way to set new values for the matrix + * or colorTransform objects is to create a new object and copy that object + * into the transform.matrix or transform.colorTransform property.

+ * + *

For example, to increase the tx value of a display + * object's matrix, you must make a copy of the entire matrix object, then + * copy the new object into the matrix property of the transform object:

+ *
 public myMatrix:Matrix =
+        * myDisplayObject.transform.matrix; myMatrix.tx += 10;
+        * myDisplayObject.transform.matrix = myMatrix; 
+ * + *

You cannot directly set the tx property. The following + * code has no effect on myDisplayObject:

+ *
 myDisplayObject.transform.matrix.tx +=
+        * 10; 
+ * + *

You can also copy an entire transform object and assign it to another + * display object's transform property. For example, the following code + * copies the entire transform object from myOldDisplayObj to + * myNewDisplayObj:

+ * myNewDisplayObj.transform = myOldDisplayObj.transform; + * + *

The resulting display object, myNewDisplayObj, now has the + * same values for its matrix, color transform, and pixel bounds as the old + * display object, myOldDisplayObj.

+ * + *

Note that AIR for TV devices use hardware acceleration, if it is + * available, for color transforms.

+ */ + get: function () { + return this._transform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "visible", { + /** + * Whether or not the display object is visible. Display objects that are not + * visible are disabled. For example, if visible=false for an + * InteractiveObject instance, it cannot be clicked. + */ + get: function () { + return this._explicitVisibility; + }, + set: function (value) { + if (this._explicitVisibility == value) + return; + + this._explicitVisibility = value; + + this._pUpdateImplicitVisibility(this._pParent ? this._pParent._iIsVisible() : true); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "width", { + /** + * Indicates the width of the display object, in pixels. The width is + * calculated based on the bounds of the content of the display object. When + * you set the width property, the scaleX property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content(such as an empty sprite) has a width of 0, even if you try to set + * width to a different value.

+ */ + get: function () { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._width; + }, + set: function (val) { + if (this._width == val) + return; + + this._width == val; + + this._pScaleX = val / this.bounds.aabb.width; + + this.invalidateScale(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "worldBounds", { + /** + * + */ + get: function () { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the bounds of the entity, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + if (this._worldBoundsInvalid) { + this._worldBoundsInvalid = false; + this._worldBounds.transformFrom(this.bounds, this.sceneTransform); + } + + return this._worldBounds; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "x", { + /** + * Indicates the x coordinate of the DisplayObject instance relative + * to the local coordinates of the parent DisplayObjectContainer. If the + * object is inside a DisplayObjectContainer that has transformations, it is + * in the local coordinate system of the enclosing DisplayObjectContainer. + * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the + * DisplayObjectContainer's children inherit a coordinate system that is + * rotated 90° counterclockwise. The object's coordinates refer to the + * registration point position. + */ + get: function () { + return this._x; + }, + set: function (val) { + if (this._x == val) + return; + + this._x = val; + + this.invalidatePosition(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "y", { + /** + * Indicates the y coordinate of the DisplayObject instance relative + * to the local coordinates of the parent DisplayObjectContainer. If the + * object is inside a DisplayObjectContainer that has transformations, it is + * in the local coordinate system of the enclosing DisplayObjectContainer. + * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the + * DisplayObjectContainer's children inherit a coordinate system that is + * rotated 90° counterclockwise. The object's coordinates refer to the + * registration point position. + */ + get: function () { + return this._y; + }, + set: function (val) { + if (this._y == val) + return; + + this._y = val; + + this.invalidatePosition(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "z", { + /** + * Indicates the z coordinate position along the z-axis of the DisplayObject + * instance relative to the 3D parent container. The z property is used for + * 3D coordinates, not screen or pixel coordinates. + * + *

When you set a z property for a display object to + * something other than the default value of 0, a corresponding + * Matrix3D object is automatically created. for adjusting a display object's + * position and orientation in three dimensions. When working with the + * z-axis, the existing behavior of x and y properties changes from screen or + * pixel coordinates to positions relative to the 3D parent container.

+ * + *

For example, a child of the _root at position x = 100, y = + * 100, z = 200 is not drawn at pixel location(100,100). The child is drawn + * wherever the 3D projection calculation puts it. The calculation is:

+ * + *

(x~~cameraFocalLength/cameraRelativeZPosition, + * y~~cameraFocalLength/cameraRelativeZPosition)

+ */ + get: function () { + return this._z; + }, + set: function (val) { + if (this._z == val) + return; + + this._z = val; + + this.invalidatePosition(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "zOffset", { + /** + * + */ + get: function () { + return this._zOffset; + }, + set: function (value) { + this._zOffset = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * + */ + DisplayObject.prototype.addEventListener = function (type, listener) { + _super.prototype.addEventListener.call(this, type, listener); + + switch (type) { + case DisplayObjectEvent.POSITION_CHANGED: + this._listenToPositionChanged = true; + break; + case DisplayObjectEvent.ROTATION_CHANGED: + this._listenToRotationChanged = true; + break; + case DisplayObjectEvent.SCALE_CHANGED: + this._listenToScaleChanged = true; + break; + } + }; + + /** + * + */ + DisplayObject.prototype.clone = function () { + var clone = new DisplayObject(); + clone.pivot = this.pivot; + clone._iMatrix3D = this._iMatrix3D; + clone.name = name; + + // todo: implement for all subtypes + return clone; + }; + + /** + * + */ + DisplayObject.prototype.dispose = function () { + if (this.parent) + this.parent.removeChild(this); + + while (this._pRenderables.length) + this._pRenderables[0].dispose(); + }; + + /** + * @inheritDoc + */ + DisplayObject.prototype.disposeAsset = function () { + this.dispose(); + }; + + /** + * Returns a rectangle that defines the area of the display object relative + * to the coordinate system of the targetCoordinateSpace object. + * Consider the following code, which shows how the rectangle returned can + * vary depending on the targetCoordinateSpace parameter that + * you pass to the method: + * + *

Note: Use the localToGlobal() and + * globalToLocal() methods to convert the display object's local + * coordinates to display coordinates, or display coordinates to local + * coordinates, respectively.

+ * + *

The getBounds() method is similar to the + * getRect() method; however, the Rectangle returned by the + * getBounds() method includes any strokes on shapes, whereas + * the Rectangle returned by the getRect() method does not. For + * an example, see the description of the getRect() method.

+ * + * @param targetCoordinateSpace The display object that defines the + * coordinate system to use. + * @return The rectangle that defines the area of the display object relative + * to the targetCoordinateSpace object's coordinate + * system. + */ + DisplayObject.prototype.getBounds = function (targetCoordinateSpace) { + return this._bounds; + }; + + /** + * Returns a rectangle that defines the boundary of the display object, based + * on the coordinate system defined by the targetCoordinateSpace + * parameter, excluding any strokes on shapes. The values that the + * getRect() method returns are the same or smaller than those + * returned by the getBounds() method. + * + *

Note: Use localToGlobal() and + * globalToLocal() methods to convert the display object's local + * coordinates to Stage coordinates, or Stage coordinates to local + * coordinates, respectively.

+ * + * @param targetCoordinateSpace The display object that defines the + * coordinate system to use. + * @return The rectangle that defines the area of the display object relative + * to the targetCoordinateSpace object's coordinate + * system. + */ + DisplayObject.prototype.getRect = function (targetCoordinateSpace) { + return this._bounds; + }; + + /** + * Converts the point object from the Stage(global) coordinates + * to the display object's(local) coordinates. + * + *

To use this method, first create an instance of the Point class. The + * x and y values that you assign represent global coordinates + * because they relate to the origin(0,0) of the main display area. Then + * pass the Point instance as the parameter to the + * globalToLocal() method. The method returns a new Point object + * with x and y values that relate to the origin of the display + * object instead of the origin of the Stage.

+ * + * @param point An object created with the Point class. The Point object + * specifies the x and y coordinates as + * properties. + * @return A Point object with coordinates relative to the display object. + */ + DisplayObject.prototype.globalToLocal = function (point) { + return point; + }; + + /** + * Converts a two-dimensional point from the Stage(global) coordinates to a + * three-dimensional display object's(local) coordinates. + * + *

To use this method, first create an instance of the Point class. The x + * and y values that you assign to the Point object represent global + * coordinates because they are relative to the origin(0,0) of the main + * display area. Then pass the Point object to the + * globalToLocal3D() method as the point parameter. + * The method returns three-dimensional coordinates as a Vector3D object + * containing x, y, and z values that + * are relative to the origin of the three-dimensional display object.

+ * + * @param point A two dimensional Point object representing global x and y + * coordinates. + * @return A Vector3D object with coordinates relative to the + * three-dimensional display object. + */ + DisplayObject.prototype.globalToLocal3D = function (point) { + return new Vector3D(); + }; + + /** + * Evaluates the bounding box of the display object to see if it overlaps or + * intersects with the bounding box of the obj display object. + * + * @param obj The display object to test against. + * @return true if the bounding boxes of the display objects + * intersect; false if not. + */ + DisplayObject.prototype.hitTestObject = function (obj) { + return false; + }; + + /** + * Evaluates the display object to see if it overlaps or intersects with the + * point specified by the x and y parameters. The + * x and y parameters specify a point in the + * coordinate space of the Stage, not the display object container that + * contains the display object(unless that display object container is the + * Stage). + * + * @param x The x coordinate to test against this object. + * @param y The y coordinate to test against this object. + * @param shapeFlag Whether to check against the actual pixels of the object + * (true) or the bounding box + * (false). + * @return true if the display object overlaps or intersects + * with the specified point; false otherwise. + */ + DisplayObject.prototype.hitTestPoint = function (x, y, shapeFlag) { + if (typeof shapeFlag === "undefined") { shapeFlag = false; } + return false; + }; + + /** + * @inheritDoc + */ + DisplayObject.prototype.isIntersectingRay = function (rayPosition, rayDirection) { + var localRayPosition = this.inverseSceneTransform.transformVector(rayPosition); + var localRayDirection = this.inverseSceneTransform.deltaTransformVector(rayDirection); + var pickingCollisionVO = this._iPickingCollisionVO; + + if (!pickingCollisionVO.localNormal) + pickingCollisionVO.localNormal = new Vector3D(); + + var rayEntryDistance = this.bounds.rayIntersection(localRayPosition, localRayDirection, pickingCollisionVO.localNormal); + + if (rayEntryDistance < 0) + return false; + + pickingCollisionVO.rayEntryDistance = rayEntryDistance; + pickingCollisionVO.localRayPosition = localRayPosition; + pickingCollisionVO.localRayDirection = localRayDirection; + pickingCollisionVO.rayPosition = rayPosition; + pickingCollisionVO.rayDirection = rayDirection; + pickingCollisionVO.rayOriginIsInsideBounds = rayEntryDistance == 0; + + return true; + }; + + /** + * Converts a three-dimensional point of the three-dimensional display + * object's(local) coordinates to a two-dimensional point in the Stage + * (global) coordinates. + * + *

For example, you can only use two-dimensional coordinates(x,y) to draw + * with the display.Graphics methods. To draw a + * three-dimensional object, you need to map the three-dimensional + * coordinates of a display object to two-dimensional coordinates. First, + * create an instance of the Vector3D class that holds the x-, y-, and z- + * coordinates of the three-dimensional display object. Then pass the + * Vector3D object to the local3DToGlobal() method as the + * point3d parameter. The method returns a two-dimensional Point + * object that can be used with the Graphics API to draw the + * three-dimensional object.

+ * + * @param point3d A Vector3D object containing either a three-dimensional + * point or the coordinates of the three-dimensional display + * object. + * @return A two-dimensional point representing a three-dimensional point in + * two-dimensional space. + */ + DisplayObject.prototype.local3DToGlobal = function (point3d) { + return new Point(); + }; + + /** + * Rotates the 3d object around to face a point defined relative to the local coordinates of the parent ObjectContainer3D. + * + * @param target The vector defining the point to be looked at + * @param upAxis An optional vector used to define the desired up orientation of the 3d object after rotation has occurred + */ + DisplayObject.prototype.lookAt = function (target, upAxis) { + if (typeof upAxis === "undefined") { upAxis = null; } + var yAxis; + var zAxis; + var xAxis; + var raw; + + if (upAxis == null) + upAxis = Vector3D.Y_AXIS; + else + upAxis.normalize(); + + zAxis = target.subtract(this._iMatrix3D.position); + zAxis.normalize(); + + xAxis = upAxis.crossProduct(zAxis); + xAxis.normalize(); + + if (xAxis.length < 0.05) { + xAxis.x = upAxis.y; + xAxis.y = upAxis.x; + xAxis.z = 0; + xAxis.normalize(); + } + + yAxis = zAxis.crossProduct(xAxis); + + raw = Matrix3DUtils.RAW_DATA_CONTAINER; + + raw[0] = xAxis.x; + raw[1] = xAxis.y; + raw[2] = xAxis.z; + raw[3] = 0; + + raw[4] = yAxis.x; + raw[5] = yAxis.y; + raw[6] = yAxis.z; + raw[7] = 0; + + raw[8] = zAxis.x; + raw[9] = zAxis.y; + raw[10] = zAxis.z; + raw[11] = 0; + + var m = new Matrix3D(); + m.copyRawDataFrom(raw); + + var vec = m.decompose()[1]; + + this._rotationX = vec.x; + this._rotationY = vec.y; + this._rotationZ = vec.z; + + this.invalidateRotation(); + }; + + /** + * Converts the point object from the display object's(local) + * coordinates to the Stage(global) coordinates. + * + *

This method allows you to convert any given x and y + * coordinates from values that are relative to the origin(0,0) of a + * specific display object(local coordinates) to values that are relative to + * the origin of the Stage(global coordinates).

+ * + *

To use this method, first create an instance of the Point class. The + * x and y values that you assign represent local coordinates + * because they relate to the origin of the display object.

+ * + *

You then pass the Point instance that you created as the parameter to + * the localToGlobal() method. The method returns a new Point + * object with x and y values that relate to the origin of the + * Stage instead of the origin of the display object.

+ * + * @param point The name or identifier of a point created with the Point + * class, specifying the x and y coordinates as + * properties. + * @return A Point object with coordinates relative to the Stage. + */ + DisplayObject.prototype.localToGlobal = function (point) { + return new Point(); + }; + + /** + * Moves the 3d object directly to a point in space + * + * @param dx The amount of movement along the local x axis. + * @param dy The amount of movement along the local y axis. + * @param dz The amount of movement along the local z axis. + */ + DisplayObject.prototype.moveTo = function (dx, dy, dz) { + if (this._x == dx && this._y == dy && this._z == dz) + return; + + this._x = dx; + this._y = dy; + this._z = dz; + + this.invalidatePosition(); + }; + + /** + * Moves the local point around which the object rotates. + * + * @param dx The amount of movement along the local x axis. + * @param dy The amount of movement along the local y axis. + * @param dz The amount of movement along the local z axis. + */ + DisplayObject.prototype.movePivot = function (dx, dy, dz) { + if (this._pivot == null) + this._pivot = new Vector3D(); + + this._pivot.x += dx; + this._pivot.y += dy; + this._pivot.z += dz; + + this.invalidatePivot(); + }; + + /** + * Rotates the 3d object around it's local x-axis + * + * @param angle The amount of rotation in degrees + */ + DisplayObject.prototype.pitch = function (angle) { + this.rotate(Vector3D.X_AXIS, angle); + }; + + /** + * + */ + DisplayObject.prototype.getRenderSceneTransform = function (camera) { + if (this.orientationMode == OrientationMode.CAMERA_PLANE) { + var comps = camera.sceneTransform.decompose(); + var scale = comps[2]; + comps[0] = this.scenePosition; + scale.x = this._pScaleX; + scale.y = this._pScaleY; + scale.z = this._pScaleZ; + this._orientationMatrix.recompose(comps); + + //add in case of pivot + if (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) + this._orientationMatrix.prependTranslation(-this._pivot.x / this._pScaleX, -this._pivot.y / this._pScaleY, -this._pivot.z / this._pScaleZ); + + return this._orientationMatrix; + } + + return this.sceneTransform; + }; + + /** + * Rotates the 3d object around it's local z-axis + * + * @param angle The amount of rotation in degrees + */ + DisplayObject.prototype.roll = function (angle) { + this.rotate(Vector3D.Z_AXIS, angle); + }; + + /** + * Rotates the 3d object around an axis by a defined angle + * + * @param axis The vector defining the axis of rotation + * @param angle The amount of rotation in degrees + */ + DisplayObject.prototype.rotate = function (axis, angle) { + var m = new Matrix3D(); + m.prependRotation(angle, axis); + + var vec = m.decompose()[1]; + + this._rotationX += vec.x; + this._rotationY += vec.y; + this._rotationZ += vec.z; + + this.invalidateRotation(); + }; + + /** + * Rotates the 3d object directly to a euler angle + * + * @param ax The angle in degrees of the rotation around the x axis. + * @param ay The angle in degrees of the rotation around the y axis. + * @param az The angle in degrees of the rotation around the z axis. + */ + DisplayObject.prototype.rotateTo = function (ax, ay, az) { + this._rotationX = ax * MathConsts.DEGREES_TO_RADIANS; + this._rotationY = ay * MathConsts.DEGREES_TO_RADIANS; + this._rotationZ = az * MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + }; + + /** + * + */ + DisplayObject.prototype.removeEventListener = function (type, listener) { + _super.prototype.removeEventListener.call(this, type, listener); + + if (this.hasEventListener(type, listener)) + return; + + switch (type) { + case DisplayObjectEvent.POSITION_CHANGED: + this._listenToPositionChanged = false; + break; + + case DisplayObjectEvent.ROTATION_CHANGED: + this._listenToRotationChanged = false; + break; + + case DisplayObjectEvent.SCALE_CHANGED: + this._listenToScaleChanged = false; + break; + } + }; + + /** + * Moves the 3d object along a vector by a defined length + * + * @param axis The vector defining the axis of movement + * @param distance The length of the movement + */ + DisplayObject.prototype.translate = function (axis, distance) { + var x = axis.x, y = axis.y, z = axis.z; + var len = distance / Math.sqrt(x * x + y * y + z * z); + + this._x += x * len; + this._y += y * len; + this._z += z * len; + + this.invalidatePosition(); + }; + + /** + * Moves the 3d object along a vector by a defined length + * + * @param axis The vector defining the axis of movement + * @param distance The length of the movement + */ + DisplayObject.prototype.translateLocal = function (axis, distance) { + var x = axis.x, y = axis.y, z = axis.z; + var len = distance / Math.sqrt(x * x + y * y + z * z); + + this._iMatrix3D.prependTranslation(x * len, y * len, z * len); + + this._matrix3D.copyColumnTo(3, this._pos); + + this._x = this._pos.x; + this._y = this._pos.y; + this._z = this._pos.z; + + this.invalidatePosition(); + }; + + /** + * Rotates the 3d object around it's local y-axis + * + * @param angle The amount of rotation in degrees + */ + DisplayObject.prototype.yaw = function (angle) { + this.rotate(Vector3D.Y_AXIS, angle); + }; + + Object.defineProperty(DisplayObject.prototype, "_iAssignedPartition", { + /** + * @internal + */ + get: function () { + return this._pImplicitPartition; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DisplayObject.prototype, "_iMatrix3D", { + /** + * The transformation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + * + * @internal + */ + get: function () { + if (this._matrix3DDirty) + this._pUpdateMatrix3D(); + + return this._matrix3D; + }, + set: function (val) { + // TODO: From AS3 - Do we still need this in JS ? + //ridiculous matrix error + /* + if (!val.rawData[0]) { + + var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + val.copyRawDataTo(raw); + raw[0] = this._smallestNumber; + val.copyRawDataFrom(raw); + } + //*/ + var elements = val.decompose(); + var vec; + + vec = elements[0]; + + if (this._x != vec.x || this._y != vec.y || this._z != vec.z) { + this._x = vec.x; + this._y = vec.y; + this._z = vec.z; + + this.invalidatePosition(); + } + + vec = elements[1]; + + if (this._rotationX != vec.x || this._rotationY != vec.y || this._rotationZ != vec.z) { + this._rotationX = vec.x; + this._rotationY = vec.y; + this._rotationZ = vec.z; + + this.invalidateRotation(); + } + + vec = elements[2]; + + if (this._pScaleX != vec.x || this._pScaleY != vec.y || this._pScaleZ != vec.z) { + this._pScaleX = vec.x; + this._pScaleY = vec.y; + this._pScaleZ = vec.z; + + this.invalidateScale(); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DisplayObject.prototype, "_iPickingCollisionVO", { + /** + * @internal + */ + get: function () { + if (!this._pPickingCollisionVO) + this._pPickingCollisionVO = new PickingCollisionVO(this); + + return this._pPickingCollisionVO; + }, + enumerable: true, + configurable: true + }); + + /** + * @internal + */ + DisplayObject.prototype.iSetParent = function (value) { + this._pParent = value; + + if (value) { + this._pUpdateImplicitMouseEnabled(value.mouseChildren); + this._pUpdateImplicitVisibility(value._iIsVisible()); + this._pUpdateImplicitPartition(value._iAssignedPartition); + this._iSetScene(value._pScene); + } else { + this._pUpdateImplicitMouseEnabled(true); + this._pUpdateImplicitVisibility(true); + this._pUpdateImplicitPartition(null); + + this._iSetScene(null); + } + }; + + /** + * @protected + */ + DisplayObject.prototype.pCreateDefaultBoundingVolume = function () { + // point lights should be using sphere bounds + // directional lights should be using null bounds + return new AxisAlignedBoundingBox(); + }; + + /** + * @protected + */ + DisplayObject.prototype.pCreateEntityPartitionNode = function () { + throw new AbstractMethodError(); + }; + + /** + * @protected + */ + DisplayObject.prototype.pInvalidateBounds = function () { + this._pBoundsInvalid = true; + this._worldBoundsInvalid = true; + + if (this.isEntity) + this.invalidatePartition(); + }; + + /** + * @protected + */ + DisplayObject.prototype.pInvalidateSceneTransform = function () { + this._pSceneTransformDirty = !this._pIgnoreTransform; + this._inverseSceneTransformDirty = !this._pIgnoreTransform; + this._scenePositionDirty = !this._pIgnoreTransform; + + this._worldBoundsInvalid = !this._pIgnoreTransform; + + if (this.isEntity) + this.invalidatePartition(); + + if (this._listenToSceneTransformChanged) + this.notifySceneTransformChange(); + }; + + /** + * @protected + */ + DisplayObject.prototype.pUpdateBounds = function () { + this._width = this._pBounds.aabb.width * this._pScaleX; + this._height = this._pBounds.aabb.height * this._pScaleY; + this._depth = this._pBounds.aabb.depth * this._pScaleZ; + + this._pBoundsInvalid = false; + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateImplicitMouseEnabled = function (value) { + this._pImplicitMouseEnabled = this._explicitMouseEnabled && value; + + // If there is a parent and this child does not have a picking collider, use its parent's picking collider. + if (this._pImplicitMouseEnabled && this._pParent && !this._pPickingCollider) + this._pPickingCollider = this._pParent._pPickingCollider; + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateImplicitPartition = function (value) { + // assign parent implicit partition if no explicit one is given + this._pImplicitPartition = this._explicitPartition || value; + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateImplicitVisibility = function (value) { + this._pImplicitVisibility = this._explicitVisibility && value; + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateMatrix3D = function () { + this._pos.x = this._x; + this._pos.y = this._y; + this._pos.z = this._z; + + this._rot.x = this._rotationX; + this._rot.y = this._rotationY; + this._rot.z = this._rotationZ; + + this._sca.x = this._pScaleX; + this._sca.y = this._pScaleY; + this._sca.z = this._pScaleZ; + + this._matrix3D.recompose(this._transformComponents); + + if (!this._pivotZero) { + this._matrix3D.prependTranslation(-this._pivot.x / this._pScaleX, -this._pivot.y / this._pScaleY, -this._pivot.z / this._pScaleZ); + if (this.alignmentMode != AlignmentMode.PIVOT_POINT) + this._matrix3D.appendTranslation(this._pivot.x, this._pivot.y, this._pivot.z); + } + + this._matrix3DDirty = false; + this._positionDirty = false; + this._rotationDirty = false; + this._scaleDirty = false; + this._pivotDirty = false; + }; + + /** + * @protected + */ + DisplayObject.prototype.pUpdateSceneTransform = function () { + if (this._pParent && !this._pParent._iIsRoot) { + this._pSceneTransform.copyFrom(this._pParent.sceneTransform); + this._pSceneTransform.prepend(this._iMatrix3D); + } else { + this._pSceneTransform.copyFrom(this._iMatrix3D); + } + + this._pSceneTransformDirty = false; + }; + + DisplayObject.prototype._iAddRenderable = function (renderable) { + this._pRenderables.push(renderable); + + return renderable; + }; + + DisplayObject.prototype._iRemoveRenderable = function (renderable) { + var index = this._pRenderables.indexOf(renderable); + + this._pRenderables.splice(index, 1); + + return renderable; + }; + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + DisplayObject.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { + return false; + }; + + /** + * + */ + DisplayObject.prototype._iInternalUpdate = function () { + if (this._iController) + this._iController.update(); + }; + + /** + * @internal + */ + DisplayObject.prototype._iIsVisible = function () { + return this._pImplicitVisibility; + }; + + /** + * @internal + */ + DisplayObject.prototype._iIsMouseEnabled = function () { + return this._pImplicitMouseEnabled; + }; + + /** + * @internal + */ + DisplayObject.prototype._iSetScene = function (value) { + // test to see if we're switching roots while we're already using a scene partition + /* + if (value == null) + this._oldScene = this._pScene; + + if (this._explicitPartition && this._oldScene && this._oldScene != this._pScene) + this.partition = null; + + if (value) + this._oldScene = null; + + // end of stupid partition test code + //*/ + if (this._pScene == value) + return; + + this._pUpdateScene(value); + + if (!this._pSceneTransformDirty && !this._pIgnoreTransform) + this.pInvalidateSceneTransform(); + }; + + /** + * @protected + */ + DisplayObject.prototype._pUpdateScene = function (value) { + if (this._pScene) { + this._pScene.dispatchEvent(new SceneEvent(SceneEvent.REMOVED_FROM_SCENE, this)); + + //unregister entity from current scene + this._pScene.iUnregisterEntity(this); + } + + this._pScene = value; + + if (value) { + value.dispatchEvent(new SceneEvent(SceneEvent.ADDED_TO_SCENE, this)); + + //register entity with new scene + value.iRegisterEntity(this); + } + + this.notifySceneChange(); + }; + + /** + * @private + */ + DisplayObject.prototype.notifyPositionChanged = function () { + if (!this._positionChanged) + this._positionChanged = new DisplayObjectEvent(DisplayObjectEvent.POSITION_CHANGED, this); + + this.dispatchEvent(this._positionChanged); + }; + + /** + * @private + */ + DisplayObject.prototype.notifyRotationChanged = function () { + if (!this._rotationChanged) + this._rotationChanged = new DisplayObjectEvent(DisplayObjectEvent.ROTATION_CHANGED, this); + + this.dispatchEvent(this._rotationChanged); + }; + + /** + * @private + */ + DisplayObject.prototype.notifyScaleChanged = function () { + if (!this._scaleChanged) + this._scaleChanged = new DisplayObjectEvent(DisplayObjectEvent.SCALE_CHANGED, this); + + this.dispatchEvent(this._scaleChanged); + }; + + /** + * @private + */ + DisplayObject.prototype.notifySceneChange = function () { + if (this._listenToSceneChanged) { + if (!this._scenechanged) + this._scenechanged = new DisplayObjectEvent(DisplayObjectEvent.SCENE_CHANGED, this); + + this.dispatchEvent(this._scenechanged); + } + }; + + /** + * @private + */ + DisplayObject.prototype.notifySceneTransformChange = function () { + if (!this._sceneTransformChanged) + this._sceneTransformChanged = new DisplayObjectEvent(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this); + + this.dispatchEvent(this._sceneTransformChanged); + }; + + /** + * Invalidates the 3D transformation matrix, causing it to be updated upon the next request + * + * @private + */ + DisplayObject.prototype.invalidateMatrix3D = function () { + if (this._matrix3DDirty) + return; + + this._matrix3DDirty = true; + + if (!this._pSceneTransformDirty && !this._pIgnoreTransform) + this.pInvalidateSceneTransform(); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidatePartition = function () { + if (this._iAssignedPartition) + this._iAssignedPartition.iMarkForUpdate(this); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidatePivot = function () { + this._pivotZero = (this._pivot.x == 0) && (this._pivot.y == 0) && (this._pivot.z == 0); + + if (this._pivotDirty) + return; + + this._pivotDirty = true; + + this.invalidateMatrix3D(); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidatePosition = function () { + if (this._positionDirty) + return; + + this._positionDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToPositionChanged) + this.notifyPositionChanged(); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidateRotation = function () { + if (this._rotationDirty) + return; + + this._rotationDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToRotationChanged) + this.notifyRotationChanged(); + }; + + /** + * @private + */ + DisplayObject.prototype.invalidateScale = function () { + if (this._scaleDirty) + return; + + this._scaleDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToScaleChanged) + this.notifyScaleChanged(); + }; + return DisplayObject; +})(NamedAssetBase); + +module.exports = DisplayObject; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9EaXNwbGF5T2JqZWN0LnRzIl0sIm5hbWVzIjpbIkRpc3BsYXlPYmplY3QiLCJEaXNwbGF5T2JqZWN0LmNvbnN0cnVjdG9yIiwiRGlzcGxheU9iamVjdC5hZGRFdmVudExpc3RlbmVyIiwiRGlzcGxheU9iamVjdC5jbG9uZSIsIkRpc3BsYXlPYmplY3QuZGlzcG9zZSIsIkRpc3BsYXlPYmplY3QuZGlzcG9zZUFzc2V0IiwiRGlzcGxheU9iamVjdC5nZXRCb3VuZHMiLCJEaXNwbGF5T2JqZWN0LmdldFJlY3QiLCJEaXNwbGF5T2JqZWN0Lmdsb2JhbFRvTG9jYWwiLCJEaXNwbGF5T2JqZWN0Lmdsb2JhbFRvTG9jYWwzRCIsIkRpc3BsYXlPYmplY3QuaGl0VGVzdE9iamVjdCIsIkRpc3BsYXlPYmplY3QuaGl0VGVzdFBvaW50IiwiRGlzcGxheU9iamVjdC5pc0ludGVyc2VjdGluZ1JheSIsIkRpc3BsYXlPYmplY3QubG9jYWwzRFRvR2xvYmFsIiwiRGlzcGxheU9iamVjdC5sb29rQXQiLCJEaXNwbGF5T2JqZWN0LmxvY2FsVG9HbG9iYWwiLCJEaXNwbGF5T2JqZWN0Lm1vdmVUbyIsIkRpc3BsYXlPYmplY3QubW92ZVBpdm90IiwiRGlzcGxheU9iamVjdC5waXRjaCIsIkRpc3BsYXlPYmplY3QuZ2V0UmVuZGVyU2NlbmVUcmFuc2Zvcm0iLCJEaXNwbGF5T2JqZWN0LnJvbGwiLCJEaXNwbGF5T2JqZWN0LnJvdGF0ZSIsIkRpc3BsYXlPYmplY3Qucm90YXRlVG8iLCJEaXNwbGF5T2JqZWN0LnJlbW92ZUV2ZW50TGlzdGVuZXIiLCJEaXNwbGF5T2JqZWN0LnRyYW5zbGF0ZSIsIkRpc3BsYXlPYmplY3QudHJhbnNsYXRlTG9jYWwiLCJEaXNwbGF5T2JqZWN0LnlhdyIsIkRpc3BsYXlPYmplY3QuaVNldFBhcmVudCIsIkRpc3BsYXlPYmplY3QucENyZWF0ZURlZmF1bHRCb3VuZGluZ1ZvbHVtZSIsIkRpc3BsYXlPYmplY3QucENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUiLCJEaXNwbGF5T2JqZWN0LnBJbnZhbGlkYXRlQm91bmRzIiwiRGlzcGxheU9iamVjdC5wSW52YWxpZGF0ZVNjZW5lVHJhbnNmb3JtIiwiRGlzcGxheU9iamVjdC5wVXBkYXRlQm91bmRzIiwiRGlzcGxheU9iamVjdC5fcFVwZGF0ZUltcGxpY2l0TW91c2VFbmFibGVkIiwiRGlzcGxheU9iamVjdC5fcFVwZGF0ZUltcGxpY2l0UGFydGl0aW9uIiwiRGlzcGxheU9iamVjdC5fcFVwZGF0ZUltcGxpY2l0VmlzaWJpbGl0eSIsIkRpc3BsYXlPYmplY3QuX3BVcGRhdGVNYXRyaXgzRCIsIkRpc3BsYXlPYmplY3QucFVwZGF0ZVNjZW5lVHJhbnNmb3JtIiwiRGlzcGxheU9iamVjdC5faUFkZFJlbmRlcmFibGUiLCJEaXNwbGF5T2JqZWN0Ll9pUmVtb3ZlUmVuZGVyYWJsZSIsIkRpc3BsYXlPYmplY3QuX2lUZXN0Q29sbGlzaW9uIiwiRGlzcGxheU9iamVjdC5faUludGVybmFsVXBkYXRlIiwiRGlzcGxheU9iamVjdC5faUlzVmlzaWJsZSIsIkRpc3BsYXlPYmplY3QuX2lJc01vdXNlRW5hYmxlZCIsIkRpc3BsYXlPYmplY3QuX2lTZXRTY2VuZSIsIkRpc3BsYXlPYmplY3QuX3BVcGRhdGVTY2VuZSIsIkRpc3BsYXlPYmplY3Qubm90aWZ5UG9zaXRpb25DaGFuZ2VkIiwiRGlzcGxheU9iamVjdC5ub3RpZnlSb3RhdGlvbkNoYW5nZWQiLCJEaXNwbGF5T2JqZWN0Lm5vdGlmeVNjYWxlQ2hhbmdlZCIsIkRpc3BsYXlPYmplY3Qubm90aWZ5U2NlbmVDaGFuZ2UiLCJEaXNwbGF5T2JqZWN0Lm5vdGlmeVNjZW5lVHJhbnNmb3JtQ2hhbmdlIiwiRGlzcGxheU9iamVjdC5pbnZhbGlkYXRlTWF0cml4M0QiLCJEaXNwbGF5T2JqZWN0LmludmFsaWRhdGVQYXJ0aXRpb24iLCJEaXNwbGF5T2JqZWN0LmludmFsaWRhdGVQaXZvdCIsIkRpc3BsYXlPYmplY3QuaW52YWxpZGF0ZVBvc2l0aW9uIiwiRGlzcGxheU9iamVjdC5pbnZhbGlkYXRlUm90YXRpb24iLCJEaXNwbGF5T2JqZWN0LmludmFsaWRhdGVTY2FsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscUZBQXlGOztBQUt6RixzRUFBNEU7O0FBRzVFLDBFQUFnRjs7QUFFaEYsZ0VBQXVFO0FBQ3ZFLDREQUFvRTtBQUNwRSxzRUFBNEU7QUFDNUUsc0RBQThEOztBQUU5RCw4REFBcUU7QUFDckUsNERBQW9FOztBQUlwRSxnRkFBcUY7O0FBRXJGLDJFQUFpRjs7QUFFakYsK0VBQW9GO0FBQ3BGLDZFQUFrRjtBQUNsRiw2REFBb0U7O0FBR3BFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWdJRztBQUNIO0lBQTRCQSxnQ0FBY0E7SUEwcEN6Q0E7O01BREdBO0lBQ0hBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBO1FBOW9DUkEsS0FBT0EsZ0JBQWdCQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNsREEsS0FBT0EscUJBQXFCQSxHQUFXQSxJQUFJQSxDQUFDQTtRQVU1Q0EsS0FBUUEsU0FBU0EsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDNUNBLEtBQVFBLGNBQWNBLEdBQVdBLElBQUlBLENBQUNBO1FBRXRDQSxLQUFRQSxzQkFBc0JBLEdBQVlBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO1FBQ3pEQSxLQUFRQSwyQkFBMkJBLEdBQVdBLElBQUlBLENBQUNBO1FBQ25EQSxLQUFRQSxjQUFjQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNqREEsS0FBUUEsbUJBQW1CQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUMzQ0EsS0FBUUEsbUJBQW1CQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUMzQ0Es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Q0FBQ0EsQ0FBQ0E7WUFDbEJBLEtBQUtBLENBQUNBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLENBQUNBO1lBQ2xCQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNYQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUNqQkE7O1FBRURBLEtBQUtBLEdBQUdBLEtBQUtBLENBQUNBLFlBQVlBLENBQUNBLEtBQUtBLENBQUNBOztRQUVqQ0EsR0FBR0EsR0FBR0EsYUFBYUEsQ0FBQ0Esa0JBQWtCQTs7UUFFdENBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBO1FBQ2hCQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUNoQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDaEJBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBOztRQUVWQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUNoQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDaEJBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBO1FBQ2hCQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFVkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDaEJBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBO1FBQ2hCQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUNqQkEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1FBRVhBLElBQUlBLENBQUNBLEdBQVlBLElBQUlBLFFBQVFBLENB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Q0EsRUFBRUEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsRUFBRUEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7Z0JBQzdEQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQTtnQkFDZkEsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7Z0JBQ2ZBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBOztnQkFFZkEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxDQUFDQTthQUN6QkE7O1lBRURBLEdBQUdBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBOztZQUVqQkEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7Z0JBQ3JGQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQTtnQkFDdkJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBO2dCQUN2QkEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O2dCQUV2QkEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxDQUFDQTthQUN6QkE7O1lBRURBLEdBQUdBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBOztZQUVqQkEsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7Z0JBQy9FQSxJQUFJQSxDQUFD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QSxDQUFDQSxFQUFFQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsRUFBRUE7UUFDckJBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBOztRQUVyQkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUE7UUFDN0JBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBO1FBQzdCQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQTs7UUFFN0JBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBO1FBQzNCQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxRQUFRQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUE7O1FBRTNCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBOztRQUVuREEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBRUE7WUFDckJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7WUFDM0hBLElBQUlBLElBQUlBLENBQUNBLGFBQWFBLElBQUlBLGFB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QSxNQUFPQSxDQUFBQTs7UUFFUkEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsSUFBSUE7O1FBRTFCQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLENBQUNBOztRQUV6QkEsSUFBSUEsSUFBSUEsQ0FBQ0Esd0JBQXdCQTtZQUNoQ0EsSUFBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUMvQkEsQ0FBQ0E7O0lBS0R2RDs7TUFER0E7OENBQ0hBO1FBRUN3RCxJQUFJQSxJQUFJQSxDQUFDQSxXQUFXQTtZQUNuQkEsTUFBT0EsQ0FBQUE7O1FBRVJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLElBQUlBOztRQUV2QkEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxDQUFDQTs7UUFFekJBLElBQUlBLElBQUlBLENBQUNBLHFCQUFxQkE7WUFDN0JBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDNUJBLENBQUNBO0lBQ0Z4RCxxQkFBQ0E7QUFBREEsQ0FBQ0EsRUEvcUUyQixjQUFjLEVBK3FFekM7O0FBRUQsOEJBQXVCLENBQUEiLCJmaWxlIjoiY29yZS9iYXNlL0Rpc3BsYXlPYmplY3QuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXhpc0FsaWduZWRCb3VuZGluZ0JveFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2JvdW5kcy9BeGlzQWxpZ25lZEJvdW5kaW5nQm94XCIpO1xuaW1wb3J0IEJvdW5kaW5nVm9sdW1lQmFzZVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYm91bmRzL0JvdW5kaW5nVm9sdW1lQmFzZVwiKTtcbmltcG9ydCBEaXNwbGF5T2JqZWN0Q29udGFpbmVyXHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udGFpbmVycy9EaXNwbGF5T2JqZWN0Q29udGFpbmVyXCIpO1xuaW1wb3J0IFNjZW5lXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1NjZW5lXCIpO1xuaW1wb3J0IENvbnRyb2xsZXJCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRyb2xsZXJzL0NvbnRyb2xsZXJCYXNlXCIpO1xuaW1wb3J0IEFsaWdubWVudE1vZGVcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0FsaWdubWVudE1vZGVcIik7XG5pbXBvcnQgQmxlbmRNb2RlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0JsZW5kTW9kZVwiKTtcbmltcG9ydCBMb2FkZXJJbmZvXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0xvYWRlckluZm9cIik7XG5pbXBvcnQgT3JpZW50YXRpb25Nb2RlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9PcmllbnRhdGlvbk1vZGVcIik7XG5pbXBvcnQgSUJpdG1hcERyYXdhYmxlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JQml0bWFwRHJhd2FibGVcIik7XG5pbXBvcnQgTWF0aENvbnN0c1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRoQ29uc3RzXCIpO1xuaW1wb3J0IE1hdHJpeDNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RcIik7XG5pbXBvcnQgTWF0cml4M0RVdGlsc1x0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RVdGlsc1wiKTtcbmltcG9ydCBQb2ludFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1BvaW50XCIpO1xuaW1wb3J0IFJlY3RhbmdsZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9SZWN0YW5nbGVcIik7XG5pbXBvcnQgVHJhbnNmb3JtXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1RyYW5zZm9ybVwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuaW1wb3J0IEVudGl0eU5vZGVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9FbnRpdHlOb2RlXCIpO1xuaW1wb3J0IFBhcnRpdGlvblx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGFydGl0aW9uL1BhcnRpdGlvblwiKTtcbmltcG9ydCBJUGlja2luZ0NvbGxpZGVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGljay9JUGlja2luZ0NvbGxpZGVyXCIpO1xuaW1wb3J0IFBpY2tpbmdDb2xsaXNpb25WT1x0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9waWNrL1BpY2tpbmdDb2xsaXNpb25WT1wiKTtcbmltcG9ydCBJUmVuZGVyYWJsZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcG9vbC9JUmVuZGVyYWJsZVwiKTtcbmltcG9ydCBOYW1lZEFzc2V0QmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvTmFtZWRBc3NldEJhc2VcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9DYW1lcmFcIik7XG5pbXBvcnQgQWJzdHJhY3RNZXRob2RFcnJvclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Fic3RyYWN0TWV0aG9kRXJyb3JcIik7XG5pbXBvcnQgRGlzcGxheU9iamVjdEV2ZW50XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRGlzcGxheU9iamVjdEV2ZW50XCIpO1xuaW1wb3J0IFNjZW5lRXZlbnRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvU2NlbmVFdmVudFwiKTtcbmltcG9ydCBQcmVmYWJCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcHJlZmFicy9QcmVmYWJCYXNlXCIpO1xuXG4vKipcbiAqIFRoZSBEaXNwbGF5T2JqZWN0IGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNhbiBiZVxuICogcGxhY2VkIG9uIHRoZSBkaXNwbGF5IGxpc3QuIFRoZSBkaXNwbGF5IGxpc3QgbWFuYWdlcyBhbGwgb2JqZWN0cyBkaXNwbGF5ZWRcbiAqIGluIGZsYXNoLiBVc2UgdGhlIERpc3BsYXlPYmplY3RDb250YWluZXIgY2xhc3MgdG8gYXJyYW5nZSB0aGVcbiAqIGRpc3BsYXkgb2JqZWN0cyBpbiB0aGUgZGlzcGxheSBsaXN0LiBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIG9iamVjdHMgY2FuXG4gKiBoYXZlIGNoaWxkIGRpc3BsYXkgb2JqZWN0cywgd2hpbGUgb3RoZXIgZGlzcGxheSBvYmplY3RzLCBzdWNoIGFzIFNoYXBlIGFuZFxuICogVGV4dEZpZWxkIG9iamVjdHMsIGFyZSBcImxlYWZcIiBub2RlcyB0aGF0IGhhdmUgb25seSBwYXJlbnRzIGFuZCBzaWJsaW5ncywgbm9cbiAqIGNoaWxkcmVuLlxuICpcbiAqIDxwPlRoZSBEaXNwbGF5T2JqZWN0IGNsYXNzIHN1cHBvcnRzIGJhc2ljIGZ1bmN0aW9uYWxpdHkgbGlrZSB0aGUgPGk+eDwvaT5cbiAqIGFuZCA8aT55PC9pPiBwb3NpdGlvbiBvZiBhbiBvYmplY3QsIGFzIHdlbGwgYXMgbW9yZSBhZHZhbmNlZCBwcm9wZXJ0aWVzIG9mXG4gKiB0aGUgb2JqZWN0IHN1Y2ggYXMgaXRzIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4gPC9wPlxuICpcbiAqIDxwPkRpc3BsYXlPYmplY3QgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzczsgdGhlcmVmb3JlLCB5b3UgY2Fubm90IGNhbGxcbiAqIERpc3BsYXlPYmplY3QgZGlyZWN0bHkuIEludm9raW5nIDxjb2RlPm5ldyBEaXNwbGF5T2JqZWN0KCk8L2NvZGU+IHRocm93cyBhblxuICogPGNvZGU+QXJndW1lbnRFcnJvcjwvY29kZT4gZXhjZXB0aW9uLiA8L3A+XG4gKlxuICogPHA+QWxsIGRpc3BsYXkgb2JqZWN0cyBpbmhlcml0IGZyb20gdGhlIERpc3BsYXlPYmplY3QgY2xhc3MuPC9wPlxuICpcbiAqIDxwPlRoZSBEaXNwbGF5T2JqZWN0IGNsYXNzIGl0c2VsZiBkb2VzIG5vdCBpbmNsdWRlIGFueSBBUElzIGZvciByZW5kZXJpbmdcbiAqIGNvbnRlbnQgb25zY3JlZW4uIEZvciB0aGF0IHJlYXNvbiwgaWYgeW91IHdhbnQgY3JlYXRlIGEgY3VzdG9tIHN1YmNsYXNzIG9mXG4gKiB0aGUgRGlzcGxheU9iamVjdCBjbGFzcywgeW91IHdpbGwgd2FudCB0byBleHRlbmQgb25lIG9mIGl0cyBzdWJjbGFzc2VzIHRoYXRcbiAqIGRvIGhhdmUgQVBJcyBmb3IgcmVuZGVyaW5nIGNvbnRlbnQgb25zY3JlZW4sIHN1Y2ggYXMgdGhlIFNoYXBlLCBTcHJpdGUsXG4gKiBCaXRtYXAsIFNpbXBsZUJ1dHRvbiwgVGV4dEZpZWxkLCBvciBNb3ZpZUNsaXAgY2xhc3MuPC9wPlxuICpcbiAqIDxwPlRoZSBEaXNwbGF5T2JqZWN0IGNsYXNzIGNvbnRhaW5zIHNldmVyYWwgYnJvYWRjYXN0IGV2ZW50cy4gTm9ybWFsbHksIHRoZVxuICogdGFyZ2V0IG9mIGFueSBwYXJ0aWN1bGFyIGV2ZW50IGlzIGEgc3BlY2lmaWMgRGlzcGxheU9iamVjdCBpbnN0YW5jZS4gRm9yXG4gKiBleGFtcGxlLCB0aGUgdGFyZ2V0IG9mIGFuIDxjb2RlPmFkZGVkPC9jb2RlPiBldmVudCBpcyB0aGUgc3BlY2lmaWNcbiAqIERpc3BsYXlPYmplY3QgaW5zdGFuY2UgdGhhdCB3YXMgYWRkZWQgdG8gdGhlIGRpc3BsYXkgbGlzdC4gSGF2aW5nIGEgc2luZ2xlXG4gKiB0YXJnZXQgcmVzdHJpY3RzIHRoZSBwbGFjZW1lbnQgb2YgZXZlbnQgbGlzdGVuZXJzIHRvIHRoYXQgdGFyZ2V0IGFuZCBpblxuICogc29tZSBjYXNlcyB0aGUgdGFyZ2V0J3MgYW5jZXN0b3JzIG9uIHRoZSBkaXNwbGF5IGxpc3QuIFdpdGggYnJvYWRjYXN0XG4gKiBldmVudHMsIGhvd2V2ZXIsIHRoZSB0YXJnZXQgaXMgbm90IGEgc3BlY2lmaWMgRGlzcGxheU9iamVjdCBpbnN0YW5jZSwgYnV0XG4gKiByYXRoZXIgYWxsIERpc3BsYXlPYmplY3QgaW5zdGFuY2VzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgbm90IG9uIHRoZVxuICogZGlzcGxheSBsaXN0LiBUaGlzIG1lYW5zIHRoYXQgeW91IGNhbiBhZGQgYSBsaXN0ZW5lciB0byBhbnkgRGlzcGxheU9iamVjdFxuICogaW5zdGFuY2UgdG8gbGlzdGVuIGZvciBicm9hZGNhc3QgZXZlbnRzLiBJbiBhZGRpdGlvbiB0byB0aGUgYnJvYWRjYXN0XG4gKiBldmVudHMgbGlzdGVkIGluIHRoZSBEaXNwbGF5T2JqZWN0IGNsYXNzJ3MgRXZlbnRzIHRhYmxlLCB0aGUgRGlzcGxheU9iamVjdFxuICogY2xhc3MgYWxzbyBpbmhlcml0cyB0d28gYnJvYWRjYXN0IGV2ZW50cyBmcm9tIHRoZSBFdmVudERpc3BhdGNoZXIgY2xhc3M6XG4gKiA8Y29kZT5hY3RpdmF0ZTwvY29kZT4gYW5kIDxjb2RlPmRlYWN0aXZhdGU8L2NvZGU+LjwvcD5cbiAqXG4gKiA8cD5Tb21lIHByb3BlcnRpZXMgcHJldmlvdXNseSB1c2VkIGluIHRoZSBBY3Rpb25TY3JpcHQgMS4wIGFuZCAyLjBcbiAqIE1vdmllQ2xpcCwgVGV4dEZpZWxkLCBhbmQgQnV0dG9uIGNsYXNzZXMoc3VjaCBhcyA8Y29kZT5fYWxwaGE8L2NvZGU+LFxuICogPGNvZGU+X2hlaWdodDwvY29kZT4sIDxjb2RlPl9uYW1lPC9jb2RlPiwgPGNvZGU+X3dpZHRoPC9jb2RlPixcbiAqIDxjb2RlPl94PC9jb2RlPiwgPGNvZGU+X3k8L2NvZGU+LCBhbmQgb3RoZXJzKSBoYXZlIGVxdWl2YWxlbnRzIGluIHRoZVxuICogQWN0aW9uU2NyaXB0IDMuMCBEaXNwbGF5T2JqZWN0IGNsYXNzIHRoYXQgYXJlIHJlbmFtZWQgc28gdGhhdCB0aGV5IG5vXG4gKiBsb25nZXIgYmVnaW4gd2l0aCB0aGUgdW5kZXJzY29yZShfKSBjaGFyYWN0ZXIuPC9wPlxuICpcbiAqIDxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFwiRGlzcGxheSBQcm9ncmFtbWluZ1wiIGNoYXB0ZXIgb2YgdGhlXG4gKiA8aT5BY3Rpb25TY3JpcHQgMy4wIERldmVsb3BlcidzIEd1aWRlPC9pPi48L3A+XG4gKiBcbiAqIEBldmVudCBhZGRlZCAgICAgICAgICAgIERpc3BhdGNoZWQgd2hlbiBhIGRpc3BsYXkgb2JqZWN0IGlzIGFkZGVkIHRvIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBsaXN0LiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgdHJpZ2dlciB0aGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkRpc3BsYXlPYmplY3RDb250YWluZXIuYWRkQ2hpbGQoKTwvY29kZT4sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLmFkZENoaWxkQXQoKTwvY29kZT4uXG4gKiBAZXZlbnQgYWRkZWRUb1N0YWdlICAgICBEaXNwYXRjaGVkIHdoZW4gYSBkaXNwbGF5IG9iamVjdCBpcyBhZGRlZCB0byB0aGUgb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlIGRpc3BsYXkgbGlzdCwgZWl0aGVyIGRpcmVjdGx5IG9yIHRocm91Z2ggdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbiBvZiBhIHN1YiB0cmVlIGluIHdoaWNoIHRoZSBkaXNwbGF5IG9iamVjdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgaXMgY29udGFpbmVkLiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgdHJpZ2dlciB0aGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkRpc3BsYXlPYmplY3RDb250YWluZXIuYWRkQ2hpbGQoKTwvY29kZT4sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLmFkZENoaWxkQXQoKTwvY29kZT4uXG4gKiBAZXZlbnQgZW50ZXJGcmFtZSAgICAgICBbYnJvYWRjYXN0IGV2ZW50XSBEaXNwYXRjaGVkIHdoZW4gdGhlIHBsYXloZWFkIGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBlbnRlcmluZyBhIG5ldyBmcmFtZS4gSWYgdGhlIHBsYXloZWFkIGlzIG5vdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgbW92aW5nLCBvciBpZiB0aGVyZSBpcyBvbmx5IG9uZSBmcmFtZSwgdGhpcyBldmVudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgaXMgZGlzcGF0Y2hlZCBjb250aW51b3VzbHkgaW4gY29uanVuY3Rpb24gd2l0aCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIHJhdGUuIFRoaXMgZXZlbnQgaXMgYSBicm9hZGNhc3QgZXZlbnQsIHdoaWNoXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBtZWFucyB0aGF0IGl0IGlzIGRpc3BhdGNoZWQgYnkgYWxsIGRpc3BsYXkgb2JqZWN0c1xuICogICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZXZlbnQuXG4gKiBAZXZlbnQgZXhpdEZyYW1lICAgICAgICBbYnJvYWRjYXN0IGV2ZW50XSBEaXNwYXRjaGVkIHdoZW4gdGhlIHBsYXloZWFkIGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBleGl0aW5nIHRoZSBjdXJyZW50IGZyYW1lLiBBbGwgZnJhbWUgc2NyaXB0cyBoYXZlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIHJ1bi4gSWYgdGhlIHBsYXloZWFkIGlzIG5vdCBtb3ZpbmcsIG9yIGlmXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBvbmx5IG9uZSBmcmFtZSwgdGhpcyBldmVudCBpcyBkaXNwYXRjaGVkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzbHkgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZnJhbWUgcmF0ZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZXZlbnQgaXMgYSBicm9hZGNhc3QgZXZlbnQsIHdoaWNoIG1lYW5zIHRoYXRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIGRpc3BhdGNoZWQgYnkgYWxsIGRpc3BsYXkgb2JqZWN0cyB3aXRoIGFcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyIHJlZ2lzdGVyZWQgZm9yIHRoaXMgZXZlbnQuXG4gKiBAZXZlbnQgZnJhbWVDb25zdHJ1Y3RlZCBbYnJvYWRjYXN0IGV2ZW50XSBEaXNwYXRjaGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvcnNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGZyYW1lIGRpc3BsYXkgb2JqZWN0cyBoYXZlIHJ1biBidXQgYmVmb3JlIGZyYW1lXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzIGhhdmUgcnVuLiBJZiB0aGUgcGxheWhlYWQgaXMgbm90IG1vdmluZywgb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZXJlIGlzIG9ubHkgb25lIGZyYW1lLCB0aGlzIGV2ZW50IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVkIGNvbnRpbnVvdXNseSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgcmF0ZS4gVGhpcyBldmVudCBpcyBhIGJyb2FkY2FzdCBldmVudCwgd2hpY2hcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIHRoYXQgaXQgaXMgZGlzcGF0Y2hlZCBieSBhbGwgZGlzcGxheSBvYmplY3RzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgbGlzdGVuZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyBldmVudC5cbiAqIEBldmVudCByZW1vdmVkICAgICAgICAgIERpc3BhdGNoZWQgd2hlbiBhIGRpc3BsYXkgb2JqZWN0IGlzIGFib3V0IHRvIGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIGZyb20gdGhlIGRpc3BsYXkgbGlzdC4gVHdvIG1ldGhvZHMgb2YgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIGNsYXNzIGdlbmVyYXRlIHRoaXMgZXZlbnQ6XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5yZW1vdmVDaGlsZCgpPC9jb2RlPiBhbmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnJlbW92ZUNoaWxkQXQoKTwvY29kZT4uXG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgPHA+VGhlIGZvbGxvd2luZyBtZXRob2RzIG9mIGFcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXlPYmplY3RDb250YWluZXIgb2JqZWN0IGFsc28gZ2VuZXJhdGUgdGhpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaWYgYW4gb2JqZWN0IG11c3QgYmUgcmVtb3ZlZCB0byBtYWtlIHJvb20gZm9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmV3IG9iamVjdDogPGNvZGU+YWRkQ2hpbGQoKTwvY29kZT4sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5hZGRDaGlsZEF0KCk8L2NvZGU+LCBhbmRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNldENoaWxkSW5kZXgoKTwvY29kZT4uIDwvcD5cbiAqIEBldmVudCByZW1vdmVkRnJvbVN0YWdlIERpc3BhdGNoZWQgd2hlbiBhIGRpc3BsYXkgb2JqZWN0IGlzIGFib3V0IHRvIGJlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIGZyb20gdGhlIGRpc3BsYXkgbGlzdCwgZWl0aGVyIGRpcmVjdGx5IG9yXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdWdoIHRoZSByZW1vdmFsIG9mIGEgc3ViIHRyZWUgaW4gd2hpY2ggdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IG9iamVjdCBpcyBjb250YWluZWQuIFR3byBtZXRob2RzIG9mIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgRGlzcGxheU9iamVjdENvbnRhaW5lciBjbGFzcyBnZW5lcmF0ZSB0aGlzIGV2ZW50OlxuICogICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cmVtb3ZlQ2hpbGQoKTwvY29kZT4gYW5kXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5yZW1vdmVDaGlsZEF0KCk8L2NvZGU+LlxuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvZiBhXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIG9iamVjdCBhbHNvIGdlbmVyYXRlIHRoaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IGlmIGFuIG9iamVjdCBtdXN0IGJlIHJlbW92ZWQgdG8gbWFrZSByb29tIGZvclxuICogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5ldyBvYmplY3Q6IDxjb2RlPmFkZENoaWxkKCk8L2NvZGU+LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+YWRkQ2hpbGRBdCgpPC9jb2RlPiwgYW5kXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5zZXRDaGlsZEluZGV4KCk8L2NvZGU+LiA8L3A+XG4gKiBAZXZlbnQgcmVuZGVyICAgICAgICAgICBbYnJvYWRjYXN0IGV2ZW50XSBEaXNwYXRjaGVkIHdoZW4gdGhlIGRpc3BsYXkgbGlzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWJvdXQgdG8gYmUgdXBkYXRlZCBhbmQgcmVuZGVyZWQuIFRoaXMgZXZlbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzIHRoZSBsYXN0IG9wcG9ydHVuaXR5IGZvciBvYmplY3RzIGxpc3RlbmluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgZXZlbnQgdG8gbWFrZSBjaGFuZ2VzIGJlZm9yZSB0aGUgZGlzcGxheVxuICogICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBpcyByZW5kZXJlZC4gWW91IG11c3QgY2FsbCB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmludmFsaWRhdGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBTdGFnZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0IGVhY2ggdGltZSB5b3Ugd2FudCBhIDxjb2RlPnJlbmRlcjwvY29kZT5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IHRvIGJlIGRpc3BhdGNoZWQuIDxjb2RlPlJlbmRlcjwvY29kZT4gZXZlbnRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZGlzcGF0Y2hlZCB0byBhbiBvYmplY3Qgb25seSBpZiB0aGVyZSBpcyBtdXR1YWxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0IGJldHdlZW4gaXQgYW5kIHRoZSBvYmplY3QgdGhhdCBjYWxsZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlN0YWdlLmludmFsaWRhdGUoKTwvY29kZT4uIFRoaXMgZXZlbnQgaXMgYVxuICogICAgICAgICAgICAgICAgICAgICAgICAgYnJvYWRjYXN0IGV2ZW50LCB3aGljaCBtZWFucyB0aGF0IGl0IGlzIGRpc3BhdGNoZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGFsbCBkaXNwbGF5IG9iamVjdHMgd2l0aCBhIGxpc3RlbmVyIHJlZ2lzdGVyZWRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIGV2ZW50LlxuICpcbiAqICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjxiPk5vdGU6IDwvYj5UaGlzIGV2ZW50IGlzIG5vdCBkaXNwYXRjaGVkIGlmIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBpcyBub3QgcmVuZGVyaW5nLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50IGlzIGVpdGhlciBtaW5pbWl6ZWQgb3Igb2JzY3VyZWQuIDwvcD5cbiAqL1xuY2xhc3MgRGlzcGxheU9iamVjdCBleHRlbmRzIE5hbWVkQXNzZXRCYXNlIGltcGxlbWVudHMgSUJpdG1hcERyYXdhYmxlXG57XG5cdHByaXZhdGUgX2xvYWRlckluZm86TG9hZGVySW5mbztcblx0cHJpdmF0ZSBfbW91c2VYOm51bWJlcjtcblx0cHJpdmF0ZSBfbW91c2VZOm51bWJlcjtcblx0cHJpdmF0ZSBfcm9vdDpEaXNwbGF5T2JqZWN0Q29udGFpbmVyO1xuXHRwcml2YXRlIF9ib3VuZHM6UmVjdGFuZ2xlO1xuXHRwcml2YXRlIF9ib3VuZHNWaXNpYmxlOmJvb2xlYW47XG5cdHByaXZhdGUgX2RlcHRoOm51bWJlcjtcblx0cHJpdmF0ZSBfaGVpZ2h0Om51bWJlcjtcblx0cHJpdmF0ZSBfd2lkdGg6bnVtYmVyO1xuXG5cdHB1YmxpYyBfcFNjZW5lOlNjZW5lO1xuXHRwdWJsaWMgX3BQYXJlbnQ6RGlzcGxheU9iamVjdENvbnRhaW5lcjtcblx0cHVibGljIF9wU2NlbmVUcmFuc2Zvcm06TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoKTtcblx0cHVibGljIF9wU2NlbmVUcmFuc2Zvcm1EaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHVibGljIF9wSXNFbnRpdHk6Ym9vbGVhbjtcblxuXHRwcml2YXRlIF9leHBsaWNpdFBhcnRpdGlvbjpQYXJ0aXRpb247XG5cdHB1YmxpYyBfcEltcGxpY2l0UGFydGl0aW9uOlBhcnRpdGlvbjtcblx0cHJpdmF0ZSBfcGFydGl0aW9uTm9kZTpFbnRpdHlOb2RlO1xuXG5cdHByaXZhdGUgX3NjZW5lVHJhbnNmb3JtQ2hhbmdlZDpEaXNwbGF5T2JqZWN0RXZlbnQ7XG5cdHByaXZhdGUgX3NjZW5lY2hhbmdlZDpEaXNwbGF5T2JqZWN0RXZlbnQ7XG5cdHByaXZhdGUgX3RyYW5zZm9ybTpUcmFuc2Zvcm07XG5cdHByaXZhdGUgX21hdHJpeDNEOk1hdHJpeDNEID0gbmV3IE1hdHJpeDNEKCk7XG5cdHByaXZhdGUgX21hdHJpeDNERGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHJpdmF0ZSBfaW52ZXJzZVNjZW5lVHJhbnNmb3JtOk1hdHJpeDNEID0gbmV3IE1hdHJpeDNEKCk7XG5cdHByaXZhdGUgX2ludmVyc2VTY2VuZVRyYW5zZm9ybURpcnR5OmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9zY2VuZVBvc2l0aW9uOlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCk7XG5cdHByaXZhdGUgX3NjZW5lUG9zaXRpb25EaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfZXhwbGljaXRWaXNpYmlsaXR5OmJvb2xlYW4gPSB0cnVlO1xuXHRwdWJsaWMgX3BJbXBsaWNpdFZpc2liaWxpdHk6Ym9vbGVhbiA9IHRydWU7XG5cdHByaXZhdGUgX2V4cGxpY2l0TW91c2VFbmFibGVkOmJvb2xlYW4gPSB0cnVlO1xuXHRwdWJsaWMgX3BJbXBsaWNpdE1vdXNlRW5hYmxlZDpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfbGlzdGVuVG9TY2VuZVRyYW5zZm9ybUNoYW5nZWQ6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfbGlzdGVuVG9TY2VuZUNoYW5nZWQ6Ym9vbGVhbjtcblxuXHRwcml2YXRlIF9wb3NpdGlvbkRpcnR5OmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9yb3RhdGlvbkRpcnR5OmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9zY2FsZURpcnR5OmJvb2xlYW4gPSB0cnVlO1xuXG5cdHByaXZhdGUgX3Bvc2l0aW9uQ2hhbmdlZDpEaXNwbGF5T2JqZWN0RXZlbnQ7XG5cdHByaXZhdGUgX3JvdGF0aW9uQ2hhbmdlZDpEaXNwbGF5T2JqZWN0RXZlbnQ7XG5cdHByaXZhdGUgX3NjYWxlQ2hhbmdlZDpEaXNwbGF5T2JqZWN0RXZlbnQ7XG5cblx0cHJpdmF0ZSBfcm90YXRpb25YOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX3JvdGF0aW9uWTpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9yb3RhdGlvblo6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfZXVsZXJzOlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCk7XG5cdHByaXZhdGUgX2ZsaXBZOk1hdHJpeDNEID0gbmV3IE1hdHJpeDNEKCk7XG5cblx0cHJpdmF0ZSBfbGlzdGVuVG9Qb3NpdGlvbkNoYW5nZWQ6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfbGlzdGVuVG9Sb3RhdGlvbkNoYW5nZWQ6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfbGlzdGVuVG9TY2FsZUNoYW5nZWQ6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfek9mZnNldDpudW1iZXIgPSAwO1xuXG5cdHB1YmxpYyBfcFNjYWxlWDpudW1iZXIgPSAxO1xuXHRwdWJsaWMgX3BTY2FsZVk6bnVtYmVyID0gMTtcblx0cHVibGljIF9wU2NhbGVaOm51bWJlciA9IDE7XG5cdHByaXZhdGUgX3g6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfeTpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF96Om51bWJlciA9IDA7XG5cdHByaXZhdGUgX3Bpdm90OlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCk7XG5cdHByaXZhdGUgX29yaWVudGF0aW9uTWF0cml4Ok1hdHJpeDNEID0gbmV3IE1hdHJpeDNEKCk7XG5cdHByaXZhdGUgX3Bpdm90WmVybzpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfcGl2b3REaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfcG9zOlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCk7XG5cdHByaXZhdGUgX3JvdDpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRCgpO1xuXHRwcml2YXRlIF9zY2E6VmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoKTtcblx0cHJpdmF0ZSBfdHJhbnNmb3JtQ29tcG9uZW50czpBcnJheTxWZWN0b3IzRD47XG5cblx0cHVibGljIF9wSWdub3JlVHJhbnNmb3JtOmJvb2xlYW4gPSBmYWxzZTtcblxuXHRwcml2YXRlIF9zaGFkZXJQaWNraW5nRGV0YWlsczpib29sZWFuO1xuXG5cdHB1YmxpYyBfcFBpY2tpbmdDb2xsaXNpb25WTzpQaWNraW5nQ29sbGlzaW9uVk87XG5cblx0cHVibGljIF9wQm91bmRzOkJvdW5kaW5nVm9sdW1lQmFzZTtcblx0cHVibGljIF9wQm91bmRzSW52YWxpZDpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfd29ybGRCb3VuZHM6Qm91bmRpbmdWb2x1bWVCYXNlO1xuXHRwcml2YXRlIF93b3JsZEJvdW5kc0ludmFsaWQ6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHVibGljIF9wUGlja2luZ0NvbGxpZGVyOklQaWNraW5nQ29sbGlkZXI7XG5cblx0cHVibGljIF9wUmVuZGVyYWJsZXM6QXJyYXk8SVJlbmRlcmFibGU+ID0gbmV3IEFycmF5PElSZW5kZXJhYmxlPigpO1xuXG5cdHB1YmxpYyBfaVNvdXJjZVByZWZhYjpQcmVmYWJCYXNlO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGFsaWdubWVudE1vZGU6c3RyaW5nID0gQWxpZ25tZW50TW9kZS5SRUdJU1RSQVRJT05fUE9JTlQ7XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGUgYWxwaGEgdHJhbnNwYXJlbmN5IHZhbHVlIG9mIHRoZSBvYmplY3Qgc3BlY2lmaWVkLiBWYWxpZFxuXHQgKiB2YWx1ZXMgYXJlIDAoZnVsbHkgdHJhbnNwYXJlbnQpIHRvIDEoZnVsbHkgb3BhcXVlKS4gVGhlIGRlZmF1bHQgdmFsdWUgaXNcblx0ICogMS4gRGlzcGxheSBvYmplY3RzIHdpdGggPGNvZGU+YWxwaGE8L2NvZGU+IHNldCB0byAwIDxpPmFyZTwvaT4gYWN0aXZlLFxuXHQgKiBldmVuIHRob3VnaCB0aGV5IGFyZSBpbnZpc2libGUuXG5cdCAqL1xuXHRwdWJsaWMgYWxwaGE6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBBIHZhbHVlIGZyb20gdGhlIEJsZW5kTW9kZSBjbGFzcyB0aGF0IHNwZWNpZmllcyB3aGljaCBibGVuZCBtb2RlIHRvIHVzZS4gQVxuXHQgKiBiaXRtYXAgY2FuIGJlIGRyYXduIGludGVybmFsbHkgaW4gdHdvIHdheXMuIElmIHlvdSBoYXZlIGEgYmxlbmQgbW9kZVxuXHQgKiBlbmFibGVkIG9yIGFuIGV4dGVybmFsIGNsaXBwaW5nIG1hc2ssIHRoZSBiaXRtYXAgaXMgZHJhd24gYnkgYWRkaW5nIGFcblx0ICogYml0bWFwLWZpbGxlZCBzcXVhcmUgc2hhcGUgdG8gdGhlIHZlY3RvciByZW5kZXIuIElmIHlvdSBhdHRlbXB0IHRvIHNldFxuXHQgKiB0aGlzIHByb3BlcnR5IHRvIGFuIGludmFsaWQgdmFsdWUsIEZsYXNoIHJ1bnRpbWVzIHNldCB0aGUgdmFsdWUgdG9cblx0ICogPGNvZGU+QmxlbmRNb2RlLk5PUk1BTDwvY29kZT4uXG5cdCAqXG5cdCAqIDxwPlRoZSA8Y29kZT5ibGVuZE1vZGU8L2NvZGU+IHByb3BlcnR5IGFmZmVjdHMgZWFjaCBwaXhlbCBvZiB0aGUgZGlzcGxheVxuXHQgKiBvYmplY3QuIEVhY2ggcGl4ZWwgaXMgY29tcG9zZWQgb2YgdGhyZWUgY29uc3RpdHVlbnQgY29sb3JzKHJlZCwgZ3JlZW4sXG5cdCAqIGFuZCBibHVlKSwgYW5kIGVhY2ggY29uc3RpdHVlbnQgY29sb3IgaGFzIGEgdmFsdWUgYmV0d2VlbiAweDAwIGFuZCAweEZGLlxuXHQgKiBGbGFzaCBQbGF5ZXIgb3IgQWRvYmUgQUlSIGNvbXBhcmVzIGVhY2ggY29uc3RpdHVlbnQgY29sb3Igb2Ygb25lIHBpeGVsIGluXG5cdCAqIHRoZSBtb3ZpZSBjbGlwIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgY29sb3Igb2YgdGhlIHBpeGVsIGluIHRoZVxuXHQgKiBiYWNrZ3JvdW5kLiBGb3IgZXhhbXBsZSwgaWYgPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBpcyBzZXQgdG9cblx0ICogPGNvZGU+QmxlbmRNb2RlLkxJR0hURU48L2NvZGU+LCBGbGFzaCBQbGF5ZXIgb3IgQWRvYmUgQUlSIGNvbXBhcmVzIHRoZSByZWRcblx0ICogdmFsdWUgb2YgdGhlIGRpc3BsYXkgb2JqZWN0IHdpdGggdGhlIHJlZCB2YWx1ZSBvZiB0aGUgYmFja2dyb3VuZCwgYW5kIHVzZXNcblx0ICogdGhlIGxpZ2h0ZXIgb2YgdGhlIHR3byBhcyB0aGUgdmFsdWUgZm9yIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBkaXNwbGF5ZWRcblx0ICogY29sb3IuPC9wPlxuXHQgKlxuXHQgKiA8cD5UaGUgZm9sbG93aW5nIHRhYmxlIGRlc2NyaWJlcyB0aGUgPGNvZGU+YmxlbmRNb2RlPC9jb2RlPiBzZXR0aW5ncy4gVGhlXG5cdCAqIEJsZW5kTW9kZSBjbGFzcyBkZWZpbmVzIHN0cmluZyB2YWx1ZXMgeW91IGNhbiB1c2UuIFRoZSBpbGx1c3RyYXRpb25zIGluXG5cdCAqIHRoZSB0YWJsZSBzaG93IDxjb2RlPmJsZW5kTW9kZTwvY29kZT4gdmFsdWVzIGFwcGxpZWQgdG8gYSBjaXJjdWxhciBkaXNwbGF5XG5cdCAqIG9iamVjdCgyKSBzdXBlcmltcG9zZWQgb24gYW5vdGhlciBkaXNwbGF5IG9iamVjdCgxKS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgYmxlbmRNb2RlOkJsZW5kTW9kZTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgYm91bmRzKCk6Qm91bmRpbmdWb2x1bWVCYXNlXG5cdHtcblx0XHRpZiAodGhpcy5fcEJvdW5kc0ludmFsaWQpXG5cdFx0XHR0aGlzLnBVcGRhdGVCb3VuZHMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9wQm91bmRzO1xuXHR9XG5cblx0cHVibGljIHNldCBib3VuZHModmFsdWU6Qm91bmRpbmdWb2x1bWVCYXNlKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BCb3VuZHMgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9wQm91bmRzID0gdmFsdWU7XG5cblx0XHR0aGlzLl93b3JsZEJvdW5kcyA9IHZhbHVlLmNsb25lKCk7XG5cblx0XHR0aGlzLnBJbnZhbGlkYXRlQm91bmRzKCk7XG5cblx0XHRpZiAodGhpcy5fYm91bmRzVmlzaWJsZSlcblx0XHRcdHRoaXMuX3BhcnRpdGlvbk5vZGUuX2lVcGRhdGVFbnRpdHlCb3VuZHMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIE5NRSB3aWxsIHVzZSB0aGUgc29mdHdhcmUgcmVuZGVyZXIgdG8gY2FjaGVcblx0ICogYW4gaW50ZXJuYWwgYml0bWFwIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkaXNwbGF5IG9iamVjdC4gRm9yIG5hdGl2ZSB0YXJnZXRzLFxuXHQgKiB0aGlzIGlzIG9mdGVuIG11Y2ggc2xvd2VyIHRoYW4gdGhlIGRlZmF1bHQgaGFyZHdhcmUgcmVuZGVyZXIuIFdoZW4geW91XG5cdCAqIGFyZSB1c2luZyB0aGUgRmxhc2ggdGFyZ2V0LCB0aGlzIGNhY2hpbmcgbWF5IGluY3JlYXNlIHBlcmZvcm1hbmNlIGZvciBkaXNwbGF5XG5cdCAqIG9iamVjdHMgdGhhdCBjb250YWluIGNvbXBsZXggdmVjdG9yIGNvbnRlbnQuXG5cdCAqXG5cdCAqIDxwPkFsbCB2ZWN0b3IgZGF0YSBmb3IgYSBkaXNwbGF5IG9iamVjdCB0aGF0IGhhcyBhIGNhY2hlZCBiaXRtYXAgaXMgZHJhd25cblx0ICogdG8gdGhlIGJpdG1hcCBpbnN0ZWFkIG9mIHRoZSBtYWluIGRpc3BsYXkuIElmXG5cdCAqIDxjb2RlPmNhY2hlQXNCaXRtYXBNYXRyaXg8L2NvZGU+IGlzIG51bGwgb3IgdW5zdXBwb3J0ZWQsIHRoZSBiaXRtYXAgaXNcblx0ICogdGhlbiBjb3BpZWQgdG8gdGhlIG1haW4gZGlzcGxheSBhcyB1bnN0cmV0Y2hlZCwgdW5yb3RhdGVkIHBpeGVscyBzbmFwcGVkXG5cdCAqIHRvIHRoZSBuZWFyZXN0IHBpeGVsIGJvdW5kYXJpZXMuIFBpeGVscyBhcmUgbWFwcGVkIDEgdG8gMSB3aXRoIHRoZSBwYXJlbnRcblx0ICogb2JqZWN0LiBJZiB0aGUgYm91bmRzIG9mIHRoZSBiaXRtYXAgY2hhbmdlLCB0aGUgYml0bWFwIGlzIHJlY3JlYXRlZFxuXHQgKiBpbnN0ZWFkIG9mIGJlaW5nIHN0cmV0Y2hlZC48L3A+XG5cdCAqXG5cdCAqIDxwPklmIDxjb2RlPmNhY2hlQXNCaXRtYXBNYXRyaXg8L2NvZGU+IGlzIG5vbi1udWxsIGFuZCBzdXBwb3J0ZWQsIHRoZVxuXHQgKiBvYmplY3QgaXMgZHJhd24gdG8gdGhlIG9mZi1zY3JlZW4gYml0bWFwIHVzaW5nIHRoYXQgbWF0cml4IGFuZCB0aGVcblx0ICogc3RyZXRjaGVkIGFuZC9vciByb3RhdGVkIHJlc3VsdHMgb2YgdGhhdCByZW5kZXJpbmcgYXJlIHVzZWQgdG8gZHJhdyB0aGVcblx0ICogb2JqZWN0IHRvIHRoZSBtYWluIGRpc3BsYXkuPC9wPlxuXHQgKlxuXHQgKiA8cD5ObyBpbnRlcm5hbCBiaXRtYXAgaXMgY3JlYXRlZCB1bmxlc3MgdGhlIDxjb2RlPmNhY2hlQXNCaXRtYXA8L2NvZGU+XG5cdCAqIHByb3BlcnR5IGlzIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPi48L3A+XG5cdCAqXG5cdCAqIDxwPkFmdGVyIHlvdSBzZXQgdGhlIDxjb2RlPmNhY2hlQXNCaXRtYXA8L2NvZGU+IHByb3BlcnR5IHRvXG5cdCAqIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgcmVuZGVyaW5nIGRvZXMgbm90IGNoYW5nZSwgaG93ZXZlciB0aGUgZGlzcGxheVxuXHQgKiBvYmplY3QgcGVyZm9ybXMgcGl4ZWwgc25hcHBpbmcgYXV0b21hdGljYWxseS4gVGhlIGFuaW1hdGlvbiBzcGVlZCBjYW4gYmVcblx0ICogc2lnbmlmaWNhbnRseSBmYXN0ZXIgZGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5IG9mIHRoZSB2ZWN0b3IgY29udGVudC5cblx0ICogPC9wPlxuXHQgKlxuXHQgKiA8cD5UaGUgPGNvZGU+Y2FjaGVBc0JpdG1hcDwvY29kZT4gcHJvcGVydHkgaXMgYXV0b21hdGljYWxseSBzZXQgdG9cblx0ICogPGNvZGU+dHJ1ZTwvY29kZT4gd2hlbmV2ZXIgeW91IGFwcGx5IGEgZmlsdGVyIHRvIGEgZGlzcGxheSBvYmplY3Qod2hlblxuXHQgKiBpdHMgPGNvZGU+ZmlsdGVyPC9jb2RlPiBhcnJheSBpcyBub3QgZW1wdHkpLCBhbmQgaWYgYSBkaXNwbGF5IG9iamVjdCBoYXMgYVxuXHQgKiBmaWx0ZXIgYXBwbGllZCB0byBpdCwgPGNvZGU+Y2FjaGVBc0JpdG1hcDwvY29kZT4gaXMgcmVwb3J0ZWQgYXNcblx0ICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIHRoYXQgZGlzcGxheSBvYmplY3QsIGV2ZW4gaWYgeW91IHNldCB0aGUgcHJvcGVydHkgdG9cblx0ICogPGNvZGU+ZmFsc2U8L2NvZGU+LiBJZiB5b3UgY2xlYXIgYWxsIGZpbHRlcnMgZm9yIGEgZGlzcGxheSBvYmplY3QsIHRoZVxuXHQgKiA8Y29kZT5jYWNoZUFzQml0bWFwPC9jb2RlPiBzZXR0aW5nIGNoYW5nZXMgdG8gd2hhdCBpdCB3YXMgbGFzdCBzZXQgdG8uPC9wPlxuXHQgKlxuXHQgKiA8cD5BIGRpc3BsYXkgb2JqZWN0IGRvZXMgbm90IHVzZSBhIGJpdG1hcCBldmVuIGlmIHRoZVxuXHQgKiA8Y29kZT5jYWNoZUFzQml0bWFwPC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kXG5cdCAqIGluc3RlYWQgcmVuZGVycyBmcm9tIHZlY3RvciBkYXRhIGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6PC9wPlxuXHQgKlxuXHQgKiA8dWw+XG5cdCAqICAgPGxpPlRoZSBiaXRtYXAgaXMgdG9vIGxhcmdlLiBJbiBBSVIgMS41IGFuZCBGbGFzaCBQbGF5ZXIgMTAsIHRoZSBtYXhpbXVtXG5cdCAqIHNpemUgZm9yIGEgYml0bWFwIGltYWdlIGlzIDgsMTkxIHBpeGVscyBpbiB3aWR0aCBvciBoZWlnaHQsIGFuZCB0aGUgdG90YWxcblx0ICogbnVtYmVyIG9mIHBpeGVscyBjYW5ub3QgZXhjZWVkIDE2LDc3NywyMTUgcGl4ZWxzLihTbywgaWYgYSBiaXRtYXAgaW1hZ2Vcblx0ICogaXMgOCwxOTEgcGl4ZWxzIHdpZGUsIGl0IGNhbiBvbmx5IGJlIDIsMDQ4IHBpeGVscyBoaWdoLikgSW4gRmxhc2ggUGxheWVyIDlcblx0ICogYW5kIGVhcmxpZXIsIHRoZSBsaW1pdGF0aW9uIGlzIGlzIDI4ODAgcGl4ZWxzIGluIGhlaWdodCBhbmQgMiw4ODAgcGl4ZWxzXG5cdCAqIGluIHdpZHRoLjwvbGk+XG5cdCAqICAgPGxpPlRoZSBiaXRtYXAgZmFpbHMgdG8gYWxsb2NhdGUob3V0IG9mIG1lbW9yeSBlcnJvcikuIDwvbGk+XG5cdCAqIDwvdWw+XG5cdCAqXG5cdCAqIDxwPlRoZSA8Y29kZT5jYWNoZUFzQml0bWFwPC9jb2RlPiBwcm9wZXJ0eSBpcyBiZXN0IHVzZWQgd2l0aCBtb3ZpZSBjbGlwc1xuXHQgKiB0aGF0IGhhdmUgbW9zdGx5IHN0YXRpYyBjb250ZW50IGFuZCB0aGF0IGRvIG5vdCBzY2FsZSBhbmQgcm90YXRlXG5cdCAqIGZyZXF1ZW50bHkuIFdpdGggc3VjaCBtb3ZpZSBjbGlwcywgPGNvZGU+Y2FjaGVBc0JpdG1hcDwvY29kZT4gY2FuIGxlYWQgdG9cblx0ICogcGVyZm9ybWFuY2UgaW5jcmVhc2VzIHdoZW4gdGhlIG1vdmllIGNsaXAgaXMgdHJhbnNsYXRlZCh3aGVuIGl0cyA8aT54PC9pPlxuXHQgKiBhbmQgPGk+eTwvaT4gcG9zaXRpb24gaXMgY2hhbmdlZCkuPC9wPlxuXHQgKi9cblx0cHVibGljIGNhY2hlQXNCaXRtYXA6Ym9vbGVhbjtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBjYXN0c1NoYWRvd3M6Ym9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGUgZGVwdGggb2YgdGhlIGRpc3BsYXkgb2JqZWN0LCBpbiBwaXhlbHMuIFRoZSBkZXB0aCBpc1xuXHQgKiBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBib3VuZHMgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIGRpc3BsYXkgb2JqZWN0LiBXaGVuXG5cdCAqIHlvdSBzZXQgdGhlIDxjb2RlPmRlcHRoPC9jb2RlPiBwcm9wZXJ0eSwgdGhlIDxjb2RlPnNjYWxlWjwvY29kZT4gcHJvcGVydHlcblx0ICogaXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHksIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgY29kZTpcblx0ICpcblx0ICogPHA+RXhjZXB0IGZvciBUZXh0RmllbGQgYW5kIFZpZGVvIG9iamVjdHMsIGEgZGlzcGxheSBvYmplY3Qgd2l0aCBub1xuXHQgKiBjb250ZW50IChzdWNoIGFzIGFuIGVtcHR5IHNwcml0ZSkgaGFzIGEgZGVwdGggb2YgMCwgZXZlbiBpZiB5b3UgdHJ5IHRvXG5cdCAqIHNldCA8Y29kZT5kZXB0aDwvY29kZT4gdG8gYSBkaWZmZXJlbnQgdmFsdWUuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBkZXB0aCgpOm51bWJlclxuXHR7XG5cdFx0aWYgKHRoaXMuX3BCb3VuZHNJbnZhbGlkKVxuXHRcdFx0dGhpcy5wVXBkYXRlQm91bmRzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZGVwdGg7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGRlcHRoKHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fZGVwdGggPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fZGVwdGggPT0gdmFsO1xuXG5cdFx0dGhpcy5fcFNjYWxlWiA9IHZhbC90aGlzLmJvdW5kcy5hYWJiLmRlcHRoO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlU2NhbGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSByb3RhdGlvbiBvZiB0aGUgM2Qgb2JqZWN0IGFzIGEgPGNvZGU+VmVjdG9yM0Q8L2NvZGU+IG9iamVjdCBjb250YWluaW5nIGV1bGVyIGFuZ2xlcyBmb3Igcm90YXRpb24gYXJvdW5kIHgsIHkgYW5kIHogYXhpcy5cblx0ICovXG5cdHB1YmxpYyBnZXQgZXVsZXJzKCk6VmVjdG9yM0Rcblx0e1xuXHRcdHRoaXMuX2V1bGVycy54ID0gdGhpcy5fcm90YXRpb25YKk1hdGhDb25zdHMuUkFESUFOU19UT19ERUdSRUVTO1xuXHRcdHRoaXMuX2V1bGVycy55ID0gdGhpcy5fcm90YXRpb25ZKk1hdGhDb25zdHMuUkFESUFOU19UT19ERUdSRUVTO1xuXHRcdHRoaXMuX2V1bGVycy56ID0gdGhpcy5fcm90YXRpb25aKk1hdGhDb25zdHMuUkFESUFOU19UT19ERUdSRUVTO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2V1bGVycztcblx0fVxuXG5cdHB1YmxpYyBzZXQgZXVsZXJzKHZhbHVlOlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy5fcm90YXRpb25YID0gdmFsdWUueCpNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUztcblx0XHR0aGlzLl9yb3RhdGlvblkgPSB2YWx1ZS55Kk1hdGhDb25zdHMuREVHUkVFU19UT19SQURJQU5TO1xuXHRcdHRoaXMuX3JvdGF0aW9uWiA9IHZhbHVlLnoqTWF0aENvbnN0cy5ERUdSRUVTX1RPX1JBRElBTlM7XG5cblx0XHR0aGlzLmludmFsaWRhdGVSb3RhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFuIG9iamVjdCB0aGF0IGNhbiBjb250YWluIGFueSBleHRyYSBkYXRhLlxuXHQgKi9cblx0cHVibGljIGV4dHJhOk9iamVjdDtcblxuXHQvKipcblx0ICogQW4gaW5kZXhlZCBhcnJheSB0aGF0IGNvbnRhaW5zIGVhY2ggZmlsdGVyIG9iamVjdCBjdXJyZW50bHkgYXNzb2NpYXRlZFxuXHQgKiB3aXRoIHRoZSBkaXNwbGF5IG9iamVjdC4gVGhlIGZsYXNoLmZpbHRlcnMgcGFja2FnZSBjb250YWlucyBzZXZlcmFsXG5cdCAqIGNsYXNzZXMgdGhhdCBkZWZpbmUgc3BlY2lmaWMgZmlsdGVycyB5b3UgY2FuIHVzZS5cblx0ICpcblx0ICogPHA+RmlsdGVycyBjYW4gYmUgYXBwbGllZCBpbiBGbGFzaCBQcm9mZXNzaW9uYWwgYXQgZGVzaWduIHRpbWUsIG9yIGF0IHJ1blxuXHQgKiB0aW1lIGJ5IHVzaW5nIEFjdGlvblNjcmlwdCBjb2RlLiBUbyBhcHBseSBhIGZpbHRlciBieSB1c2luZyBBY3Rpb25TY3JpcHQsXG5cdCAqIHlvdSBtdXN0IG1ha2UgYSB0ZW1wb3JhcnkgY29weSBvZiB0aGUgZW50aXJlIDxjb2RlPmZpbHRlcnM8L2NvZGU+IGFycmF5LFxuXHQgKiBtb2RpZnkgdGhlIHRlbXBvcmFyeSBhcnJheSwgdGhlbiBhc3NpZ24gdGhlIHZhbHVlIG9mIHRoZSB0ZW1wb3JhcnkgYXJyYXlcblx0ICogYmFjayB0byB0aGUgPGNvZGU+ZmlsdGVyczwvY29kZT4gYXJyYXkuIFlvdSBjYW5ub3QgZGlyZWN0bHkgYWRkIGEgbmV3XG5cdCAqIGZpbHRlciBvYmplY3QgdG8gdGhlIDxjb2RlPmZpbHRlcnM8L2NvZGU+IGFycmF5LjwvcD5cblx0ICpcblx0ICogPHA+VG8gYWRkIGEgZmlsdGVyIGJ5IHVzaW5nIEFjdGlvblNjcmlwdCwgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzXG5cdCAqIChhc3N1bWUgdGhhdCB0aGUgdGFyZ2V0IGRpc3BsYXkgb2JqZWN0IGlzIG5hbWVkXG5cdCAqIDxjb2RlPm15RGlzcGxheU9iamVjdDwvY29kZT4pOjwvcD5cblx0ICpcblx0ICogPG9sPlxuXHQgKiAgIDxsaT5DcmVhdGUgYSBuZXcgZmlsdGVyIG9iamVjdCBieSB1c2luZyB0aGUgY29uc3RydWN0b3IgbWV0aG9kIG9mIHlvdXJcblx0ICogY2hvc2VuIGZpbHRlciBjbGFzcy48L2xpPlxuXHQgKiAgIDxsaT5Bc3NpZ24gdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5teURpc3BsYXlPYmplY3QuZmlsdGVyczwvY29kZT4gYXJyYXlcblx0ICogdG8gYSB0ZW1wb3JhcnkgYXJyYXksIHN1Y2ggYXMgb25lIG5hbWVkIDxjb2RlPm15RmlsdGVyczwvY29kZT4uPC9saT5cblx0ICogICA8bGk+QWRkIHRoZSBuZXcgZmlsdGVyIG9iamVjdCB0byB0aGUgPGNvZGU+bXlGaWx0ZXJzPC9jb2RlPiB0ZW1wb3Jhcnlcblx0ICogYXJyYXkuPC9saT5cblx0ICogICA8bGk+QXNzaWduIHRoZSB2YWx1ZSBvZiB0aGUgdGVtcG9yYXJ5IGFycmF5IHRvIHRoZVxuXHQgKiA8Y29kZT5teURpc3BsYXlPYmplY3QuZmlsdGVyczwvY29kZT4gYXJyYXkuPC9saT5cblx0ICogPC9vbD5cblx0ICpcblx0ICogPHA+SWYgdGhlIDxjb2RlPmZpbHRlcnM8L2NvZGU+IGFycmF5IGlzIHVuZGVmaW5lZCwgeW91IGRvIG5vdCBuZWVkIHRvIHVzZVxuXHQgKiBhIHRlbXBvcmFyeSBhcnJheS4gSW5zdGVhZCwgeW91IGNhbiBkaXJlY3RseSBhc3NpZ24gYW4gYXJyYXkgbGl0ZXJhbCB0aGF0XG5cdCAqIGNvbnRhaW5zIG9uZSBvciBtb3JlIGZpbHRlciBvYmplY3RzIHRoYXQgeW91IGNyZWF0ZS4gVGhlIGZpcnN0IGV4YW1wbGUgaW5cblx0ICogdGhlIEV4YW1wbGVzIHNlY3Rpb24gYWRkcyBhIGRyb3Agc2hhZG93IGZpbHRlciBieSB1c2luZyBjb2RlIHRoYXQgaGFuZGxlc1xuXHQgKiBib3RoIGRlZmluZWQgYW5kIHVuZGVmaW5lZCA8Y29kZT5maWx0ZXJzPC9jb2RlPiBhcnJheXMuPC9wPlxuXHQgKlxuXHQgKiA8cD5UbyBtb2RpZnkgYW4gZXhpc3RpbmcgZmlsdGVyIG9iamVjdCwgeW91IG11c3QgdXNlIHRoZSB0ZWNobmlxdWUgb2Zcblx0ICogbW9kaWZ5aW5nIGEgY29weSBvZiB0aGUgPGNvZGU+ZmlsdGVyczwvY29kZT4gYXJyYXk6PC9wPlxuXHQgKlxuXHQgKiA8b2w+XG5cdCAqICAgPGxpPkFzc2lnbiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPmZpbHRlcnM8L2NvZGU+IGFycmF5IHRvIGEgdGVtcG9yYXJ5XG5cdCAqIGFycmF5LCBzdWNoIGFzIG9uZSBuYW1lZCA8Y29kZT5teUZpbHRlcnM8L2NvZGU+LjwvbGk+XG5cdCAqICAgPGxpPk1vZGlmeSB0aGUgcHJvcGVydHkgYnkgdXNpbmcgdGhlIHRlbXBvcmFyeSBhcnJheSxcblx0ICogPGNvZGU+bXlGaWx0ZXJzPC9jb2RlPi4gRm9yIGV4YW1wbGUsIHRvIHNldCB0aGUgcXVhbGl0eSBwcm9wZXJ0eSBvZiB0aGVcblx0ICogZmlyc3QgZmlsdGVyIGluIHRoZSBhcnJheSwgeW91IGNvdWxkIHVzZSB0aGUgZm9sbG93aW5nIGNvZGU6XG5cdCAqIDxjb2RlPm15RmlsdGVyc1swXS5xdWFsaXR5ID0gMTs8L2NvZGU+PC9saT5cblx0ICogICA8bGk+QXNzaWduIHRoZSB2YWx1ZSBvZiB0aGUgdGVtcG9yYXJ5IGFycmF5IHRvIHRoZSA8Y29kZT5maWx0ZXJzPC9jb2RlPlxuXHQgKiBhcnJheS48L2xpPlxuXHQgKiA8L29sPlxuXHQgKlxuXHQgKiA8cD5BdCBsb2FkIHRpbWUsIGlmIGEgZGlzcGxheSBvYmplY3QgaGFzIGFuIGFzc29jaWF0ZWQgZmlsdGVyLCBpdCBpc1xuXHQgKiBtYXJrZWQgdG8gY2FjaGUgaXRzZWxmIGFzIGEgdHJhbnNwYXJlbnQgYml0bWFwLiBGcm9tIHRoaXMgcG9pbnQgZm9yd2FyZCxcblx0ICogYXMgbG9uZyBhcyB0aGUgZGlzcGxheSBvYmplY3QgaGFzIGEgdmFsaWQgZmlsdGVyIGxpc3QsIHRoZSBwbGF5ZXIgY2FjaGVzXG5cdCAqIHRoZSBkaXNwbGF5IG9iamVjdCBhcyBhIGJpdG1hcC4gVGhpcyBzb3VyY2UgYml0bWFwIGlzIHVzZWQgYXMgYSBzb3VyY2Vcblx0ICogaW1hZ2UgZm9yIHRoZSBmaWx0ZXIgZWZmZWN0cy4gRWFjaCBkaXNwbGF5IG9iamVjdCB1c3VhbGx5IGhhcyB0d28gYml0bWFwczpcblx0ICogb25lIHdpdGggdGhlIG9yaWdpbmFsIHVuZmlsdGVyZWQgc291cmNlIGRpc3BsYXkgb2JqZWN0IGFuZCBhbm90aGVyIGZvciB0aGVcblx0ICogZmluYWwgaW1hZ2UgYWZ0ZXIgZmlsdGVyaW5nLiBUaGUgZmluYWwgaW1hZ2UgaXMgdXNlZCB3aGVuIHJlbmRlcmluZy4gQXNcblx0ICogbG9uZyBhcyB0aGUgZGlzcGxheSBvYmplY3QgZG9lcyBub3QgY2hhbmdlLCB0aGUgZmluYWwgaW1hZ2UgZG9lcyBub3QgbmVlZFxuXHQgKiB1cGRhdGluZy48L3A+XG5cdCAqXG5cdCAqIDxwPlRoZSBmbGFzaC5maWx0ZXJzIHBhY2thZ2UgaW5jbHVkZXMgY2xhc3NlcyBmb3IgZmlsdGVycy4gRm9yIGV4YW1wbGUsIHRvXG5cdCAqIGNyZWF0ZSBhIERyb3BTaGFkb3cgZmlsdGVyLCB5b3Ugd291bGQgd3JpdGU6PC9wPlxuXHQgKlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgV2hlbiA8Y29kZT5maWx0ZXJzPC9jb2RlPiBpbmNsdWRlcyBhIFNoYWRlckZpbHRlclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBzaGFkZXIgb3V0cHV0IHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBvcGVyYXRpb24odGhlIHNoYWRlciBtdXN0IHNwZWNpZnkgYVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+cGl4ZWw0PC9jb2RlPiBvdXRwdXQpLlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgV2hlbiA8Y29kZT5maWx0ZXJzPC9jb2RlPiBpbmNsdWRlcyBhIFNoYWRlckZpbHRlclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBzaGFkZXIgZG9lc24ndCBzcGVjaWZ5IGFueSBpbWFnZSBpbnB1dCBvclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IGlucHV0IGlzIG5vdCBhbiA8Y29kZT5pbWFnZTQ8L2NvZGU+IGlucHV0LlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgV2hlbiA8Y29kZT5maWx0ZXJzPC9jb2RlPiBpbmNsdWRlcyBhIFNoYWRlckZpbHRlclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBzaGFkZXIgc3BlY2lmaWVzIGFuIGltYWdlIGlucHV0IHRoYXQgaXNuJ3Rcblx0ICogICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkLlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgV2hlbiA8Y29kZT5maWx0ZXJzPC9jb2RlPiBpbmNsdWRlcyBhIFNoYWRlckZpbHRlciwgYVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5IG9yIFZlY3Rvci48TnVtYmVyPiBpbnN0YW5jZSBhcyBhIHNoYWRlclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFuZCB0aGUgPGNvZGU+d2lkdGg8L2NvZGU+IGFuZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+aGVpZ2h0PC9jb2RlPiBwcm9wZXJ0aWVzIGFyZW4ndCBzcGVjaWZpZWQgZm9yXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgU2hhZGVySW5wdXQgb2JqZWN0LCBvciB0aGUgc3BlY2lmaWVkIHZhbHVlc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgbWF0Y2ggdGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSBpbnB1dCBkYXRhLlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSA8Y29kZT5TaGFkZXJJbnB1dC5pbnB1dDwvY29kZT4gcHJvcGVydHkgZm9yXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGluZm9ybWF0aW9uLlxuXHQgKi9cbi8vXHRcdHB1YmxpYyBmaWx0ZXJzOkFycmF5PER5bmFtaWM+O1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIGhlaWdodCBvZiB0aGUgZGlzcGxheSBvYmplY3QsIGluIHBpeGVscy4gVGhlIGhlaWdodCBpc1xuXHQgKiBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBib3VuZHMgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIGRpc3BsYXkgb2JqZWN0LiBXaGVuXG5cdCAqIHlvdSBzZXQgdGhlIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydHksIHRoZSA8Y29kZT5zY2FsZVk8L2NvZGU+IHByb3BlcnR5XG5cdCAqIGlzIGFkanVzdGVkIGFjY29yZGluZ2x5LCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGNvZGU6XG5cdCAqXG5cdCAqIDxwPkV4Y2VwdCBmb3IgVGV4dEZpZWxkIGFuZCBWaWRlbyBvYmplY3RzLCBhIGRpc3BsYXkgb2JqZWN0IHdpdGggbm9cblx0ICogY29udGVudCAoc3VjaCBhcyBhbiBlbXB0eSBzcHJpdGUpIGhhcyBhIGhlaWdodCBvZiAwLCBldmVuIGlmIHlvdSB0cnkgdG9cblx0ICogc2V0IDxjb2RlPmhlaWdodDwvY29kZT4gdG8gYSBkaWZmZXJlbnQgdmFsdWUuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBoZWlnaHQoKTpudW1iZXJcblx0e1xuXHRcdGlmICh0aGlzLl9wQm91bmRzSW52YWxpZClcblx0XHRcdHRoaXMucFVwZGF0ZUJvdW5kcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2hlaWdodDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgaGVpZ2h0KHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5faGVpZ2h0ID09IHZhbClcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2hlaWdodCA9PSB2YWw7XG5cblx0XHR0aGlzLl9wU2NhbGVZID0gdmFsL3RoaXMuYm91bmRzLmFhYmIuaGVpZ2h0O1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlU2NhbGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIGluc3RhbmNlIGNvbnRhaW5lciBpbmRleCBvZiB0aGUgRGlzcGxheU9iamVjdC4gVGhlIG9iamVjdCBjYW4gYmVcblx0ICogaWRlbnRpZmllZCBpbiB0aGUgY2hpbGQgbGlzdCBvZiBpdHMgcGFyZW50IGRpc3BsYXkgb2JqZWN0IGNvbnRhaW5lciBieVxuXHQgKiBjYWxsaW5nIHRoZSA8Y29kZT5nZXRDaGlsZEJ5SW5kZXgoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBkaXNwbGF5IG9iamVjdFxuXHQgKiBjb250YWluZXIuXG5cdCAqXG5cdCAqIDxwPklmIHRoZSBEaXNwbGF5T2JqZWN0IGhhcyBubyBwYXJlbnQgY29udGFpbmVyLCBpbmRleCBkZWZhdWx0cyB0byAwLjwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgaW5kZXgoKTpudW1iZXJcblx0e1xuXHRcdGlmICh0aGlzLl9wUGFyZW50KVxuXHRcdFx0cmV0dXJuIHRoaXMuX3BQYXJlbnQuZ2V0Q2hpbGRJbmRleCh0aGlzKTtcblxuXHRcdHJldHVybiAwO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGludmVyc2VTY2VuZVRyYW5zZm9ybSgpOk1hdHJpeDNEXG5cdHtcblx0XHRpZiAodGhpcy5faW52ZXJzZVNjZW5lVHJhbnNmb3JtRGlydHkpIHtcblx0XHRcdHRoaXMuX2ludmVyc2VTY2VuZVRyYW5zZm9ybS5jb3B5RnJvbSh0aGlzLnNjZW5lVHJhbnNmb3JtKTtcblx0XHRcdHRoaXMuX2ludmVyc2VTY2VuZVRyYW5zZm9ybS5pbnZlcnQoKTtcblx0XHRcdHRoaXMuX2ludmVyc2VTY2VuZVRyYW5zZm9ybURpcnR5ID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9pbnZlcnNlU2NlbmVUcmFuc2Zvcm07XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgaWdub3JlVHJhbnNmb3JtKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BJZ25vcmVUcmFuc2Zvcm07XG5cdH1cblxuXHRwdWJsaWMgc2V0IGlnbm9yZVRyYW5zZm9ybSh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BJZ25vcmVUcmFuc2Zvcm0gPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9wSWdub3JlVHJhbnNmb3JtID0gdmFsdWU7XG5cblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdHRoaXMuX3BTY2VuZVRyYW5zZm9ybS5pZGVudGl0eSgpO1xuXHRcdFx0dGhpcy5fc2NlbmVQb3NpdGlvbi5zZXRUbygwLCAwLCAwKTtcblx0XHR9XG5cblx0XHR0aGlzLnBJbnZhbGlkYXRlU2NlbmVUcmFuc2Zvcm0oKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBpc0VudGl0eSgpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcElzRW50aXR5O1xuXHR9XG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgTG9hZGVySW5mbyBvYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCBsb2FkaW5nIHRoZSBmaWxlXG5cdCAqIHRvIHdoaWNoIHRoaXMgZGlzcGxheSBvYmplY3QgYmVsb25ncy4gVGhlIDxjb2RlPmxvYWRlckluZm88L2NvZGU+IHByb3BlcnR5XG5cdCAqIGlzIGRlZmluZWQgb25seSBmb3IgdGhlIHJvb3QgZGlzcGxheSBvYmplY3Qgb2YgYSBTV0YgZmlsZSBvciBmb3IgYSBsb2FkZWRcblx0ICogQml0bWFwKG5vdCBmb3IgYSBCaXRtYXAgdGhhdCBpcyBkcmF3biB3aXRoIEFjdGlvblNjcmlwdCkuIFRvIGZpbmQgdGhlXG5cdCAqIDxjb2RlPmxvYWRlckluZm88L2NvZGU+IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIFNXRiBmaWxlIHRoYXQgY29udGFpbnNcblx0ICogYSBkaXNwbGF5IG9iamVjdCBuYW1lZCA8Y29kZT5teURpc3BsYXlPYmplY3Q8L2NvZGU+LCB1c2Vcblx0ICogPGNvZGU+bXlEaXNwbGF5T2JqZWN0LnJvb3QubG9hZGVySW5mbzwvY29kZT4uXG5cdCAqXG5cdCAqIDxwPkEgbGFyZ2UgU1dGIGZpbGUgY2FuIG1vbml0b3IgaXRzIGRvd25sb2FkIGJ5IGNhbGxpbmdcblx0ICogPGNvZGU+dGhpcy5yb290LmxvYWRlckluZm8uYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT01QTEVURSxcblx0ICogZnVuYyk8L2NvZGU+LjwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgbG9hZGVySW5mbygpOkxvYWRlckluZm9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9sb2FkZXJJbmZvO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBjYWxsaW5nIGRpc3BsYXkgb2JqZWN0IGlzIG1hc2tlZCBieSB0aGUgc3BlY2lmaWVkIDxjb2RlPm1hc2s8L2NvZGU+XG5cdCAqIG9iamVjdC4gVG8gZW5zdXJlIHRoYXQgbWFza2luZyB3b3JrcyB3aGVuIHRoZSBTdGFnZSBpcyBzY2FsZWQsIHRoZVxuXHQgKiA8Y29kZT5tYXNrPC9jb2RlPiBkaXNwbGF5IG9iamVjdCBtdXN0IGJlIGluIGFuIGFjdGl2ZSBwYXJ0IG9mIHRoZSBkaXNwbGF5XG5cdCAqIGxpc3QuIFRoZSA8Y29kZT5tYXNrPC9jb2RlPiBvYmplY3QgaXRzZWxmIGlzIG5vdCBkcmF3bi4gU2V0XG5cdCAqIDxjb2RlPm1hc2s8L2NvZGU+IHRvIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSB0aGUgbWFzay5cblx0ICpcblx0ICogPHA+VG8gYmUgYWJsZSB0byBzY2FsZSBhIG1hc2sgb2JqZWN0LCBpdCBtdXN0IGJlIG9uIHRoZSBkaXNwbGF5IGxpc3QuIFRvXG5cdCAqIGJlIGFibGUgdG8gZHJhZyBhIG1hc2sgU3ByaXRlIG9iamVjdChieSBjYWxsaW5nIGl0c1xuXHQgKiA8Y29kZT5zdGFydERyYWcoKTwvY29kZT4gbWV0aG9kKSwgaXQgbXVzdCBiZSBvbiB0aGUgZGlzcGxheSBsaXN0LiBUbyBjYWxsXG5cdCAqIHRoZSA8Y29kZT5zdGFydERyYWcoKTwvY29kZT4gbWV0aG9kIGZvciBhIG1hc2sgc3ByaXRlIGJhc2VkIG9uIGFcblx0ICogPGNvZGU+bW91c2VEb3duPC9jb2RlPiBldmVudCBiZWluZyBkaXNwYXRjaGVkIGJ5IHRoZSBzcHJpdGUsIHNldCB0aGVcblx0ICogc3ByaXRlJ3MgPGNvZGU+YnV0dG9uTW9kZTwvY29kZT4gcHJvcGVydHkgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC9wPlxuXHQgKlxuXHQgKiA8cD5XaGVuIGRpc3BsYXkgb2JqZWN0cyBhcmUgY2FjaGVkIGJ5IHNldHRpbmcgdGhlXG5cdCAqIDxjb2RlPmNhY2hlQXNCaXRtYXA8L2NvZGU+IHByb3BlcnR5IHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuIHRoZVxuXHQgKiA8Y29kZT5jYWNoZUFzQml0bWFwTWF0cml4PC9jb2RlPiBwcm9wZXJ0eSB0byBhIE1hdHJpeCBvYmplY3QsIGJvdGggdGhlXG5cdCAqIG1hc2sgYW5kIHRoZSBkaXNwbGF5IG9iamVjdCBiZWluZyBtYXNrZWQgbXVzdCBiZSBwYXJ0IG9mIHRoZSBzYW1lIGNhY2hlZFxuXHQgKiBiaXRtYXAuIFRodXMsIGlmIHRoZSBkaXNwbGF5IG9iamVjdCBpcyBjYWNoZWQsIHRoZW4gdGhlIG1hc2sgbXVzdCBiZSBhXG5cdCAqIGNoaWxkIG9mIHRoZSBkaXNwbGF5IG9iamVjdC4gSWYgYW4gYW5jZXN0b3Igb2YgdGhlIGRpc3BsYXkgb2JqZWN0IG9uIHRoZVxuXHQgKiBkaXNwbGF5IGxpc3QgaXMgY2FjaGVkLCB0aGVuIHRoZSBtYXNrIG11c3QgYmUgYSBjaGlsZCBvZiB0aGF0IGFuY2VzdG9yIG9yXG5cdCAqIG9uZSBvZiBpdHMgZGVzY2VuZGVudHMuIElmIG1vcmUgdGhhbiBvbmUgYW5jZXN0b3Igb2YgdGhlIG1hc2tlZCBvYmplY3QgaXNcblx0ICogY2FjaGVkLCB0aGVuIHRoZSBtYXNrIG11c3QgYmUgYSBkZXNjZW5kZW50IG9mIHRoZSBjYWNoZWQgY29udGFpbmVyIGNsb3Nlc3Rcblx0ICogdG8gdGhlIG1hc2tlZCBvYmplY3QgaW4gdGhlIGRpc3BsYXkgbGlzdC48L3A+XG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU6PC9iPiBBIHNpbmdsZSA8Y29kZT5tYXNrPC9jb2RlPiBvYmplY3QgY2Fubm90IGJlIHVzZWQgdG8gbWFza1xuXHQgKiBtb3JlIHRoYW4gb25lIGNhbGxpbmcgZGlzcGxheSBvYmplY3QuIFdoZW4gdGhlIDxjb2RlPm1hc2s8L2NvZGU+IGlzXG5cdCAqIGFzc2lnbmVkIHRvIGEgc2Vjb25kIGRpc3BsYXkgb2JqZWN0LCBpdCBpcyByZW1vdmVkIGFzIHRoZSBtYXNrIG9mIHRoZVxuXHQgKiBmaXJzdCBvYmplY3QsIGFuZCB0aGF0IG9iamVjdCdzIDxjb2RlPm1hc2s8L2NvZGU+IHByb3BlcnR5IGJlY29tZXNcblx0ICogPGNvZGU+bnVsbDwvY29kZT4uPC9wPlxuXHQgKi9cblx0cHVibGljIG1hc2s6RGlzcGxheU9iamVjdDtcblxuXHQvKipcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBvYmplY3QgcmVjZWl2ZXMgbW91c2UsIG9yIG90aGVyIHVzZXIgaW5wdXQsXG5cdCAqIG1lc3NhZ2VzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT50cnVlPC9jb2RlPiwgd2hpY2ggbWVhbnMgdGhhdCBieVxuXHQgKiBkZWZhdWx0IGFueSBJbnRlcmFjdGl2ZU9iamVjdCBpbnN0YW5jZSB0aGF0IGlzIG9uIHRoZSBkaXNwbGF5IGxpc3Rcblx0ICogcmVjZWl2ZXMgbW91c2UgZXZlbnRzIG9yIG90aGVyIHVzZXIgaW5wdXQgZXZlbnRzLiBJZlxuXHQgKiA8Y29kZT5tb3VzZUVuYWJsZWQ8L2NvZGU+IGlzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBpbnN0YW5jZSBkb2VzXG5cdCAqIG5vdCByZWNlaXZlIGFueSBtb3VzZSBldmVudHMob3Igb3RoZXIgdXNlciBpbnB1dCBldmVudHMgbGlrZSBrZXlib2FyZFxuXHQgKiBldmVudHMpLiBBbnkgY2hpbGRyZW4gb2YgdGhpcyBpbnN0YW5jZSBvbiB0aGUgZGlzcGxheSBsaXN0IGFyZSBub3Rcblx0ICogYWZmZWN0ZWQuIFRvIGNoYW5nZSB0aGUgPGNvZGU+bW91c2VFbmFibGVkPC9jb2RlPiBiZWhhdmlvciBmb3IgYWxsXG5cdCAqIGNoaWxkcmVuIG9mIGFuIG9iamVjdCBvbiB0aGUgZGlzcGxheSBsaXN0LCB1c2Vcblx0ICogPGNvZGU+Zmxhc2guZGlzcGxheS5EaXNwbGF5T2JqZWN0Q29udGFpbmVyLm1vdXNlQ2hpbGRyZW48L2NvZGU+LlxuXHQgKlxuXHQgKiA8cD4gTm8gZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBzZXR0aW5nIHRoaXMgcHJvcGVydHkuIFlvdSBtdXN0IHVzZSB0aGVcblx0ICogPGNvZGU+YWRkRXZlbnRMaXN0ZW5lcigpPC9jb2RlPiBtZXRob2QgdG8gY3JlYXRlIGludGVyYWN0aXZlXG5cdCAqIGZ1bmN0aW9uYWxpdHkuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBtb3VzZUVuYWJsZWQoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZXhwbGljaXRNb3VzZUVuYWJsZWQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1vdXNlRW5hYmxlZCh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2V4cGxpY2l0TW91c2VFbmFibGVkID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fZXhwbGljaXRNb3VzZUVuYWJsZWQgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BVcGRhdGVJbXBsaWNpdE1vdXNlRW5hYmxlZCh0aGlzLl9wUGFyZW50PyB0aGlzLl9wUGFyZW50Lm1vdXNlQ2hpbGRyZW4gOiB0cnVlKTtcblx0fVxuXG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSBtb3VzZSBvciB1c2VyIGlucHV0IGRldmljZSBwb3NpdGlvbiwgaW5cblx0ICogcGl4ZWxzLlxuXHQgKlxuXHQgKiA8cD48Yj5Ob3RlPC9iPjogRm9yIGEgRGlzcGxheU9iamVjdCB0aGF0IGhhcyBiZWVuIHJvdGF0ZWQsIHRoZSByZXR1cm5lZCB4XG5cdCAqIGNvb3JkaW5hdGUgd2lsbCByZWZsZWN0IHRoZSBub24tcm90YXRlZCBvYmplY3QuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBtb3VzZVgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9tb3VzZVg7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSB5IGNvb3JkaW5hdGUgb2YgdGhlIG1vdXNlIG9yIHVzZXIgaW5wdXQgZGV2aWNlIHBvc2l0aW9uLCBpblxuXHQgKiBwaXhlbHMuXG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU8L2I+OiBGb3IgYSBEaXNwbGF5T2JqZWN0IHRoYXQgaGFzIGJlZW4gcm90YXRlZCwgdGhlIHJldHVybmVkIHlcblx0ICogY29vcmRpbmF0ZSB3aWxsIHJlZmxlY3QgdGhlIG5vbi1yb3RhdGVkIG9iamVjdC48L3A+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1vdXNlWSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21vdXNlWTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIGluc3RhbmNlIG5hbWUgb2YgdGhlIERpc3BsYXlPYmplY3QuIFRoZSBvYmplY3QgY2FuIGJlXG5cdCAqIGlkZW50aWZpZWQgaW4gdGhlIGNoaWxkIGxpc3Qgb2YgaXRzIHBhcmVudCBkaXNwbGF5IG9iamVjdCBjb250YWluZXIgYnlcblx0ICogY2FsbGluZyB0aGUgPGNvZGU+Z2V0Q2hpbGRCeU5hbWUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBkaXNwbGF5IG9iamVjdFxuXHQgKiBjb250YWluZXIuXG5cdCAqXG5cdCAqIEB0aHJvd3MgSWxsZWdhbE9wZXJhdGlvbkVycm9yIElmIHlvdSBhcmUgYXR0ZW1wdGluZyB0byBzZXQgdGhpcyBwcm9wZXJ0eVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBhbiBvYmplY3QgdGhhdCB3YXMgcGxhY2VkIG9uIHRoZSB0aW1lbGluZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgRmxhc2ggYXV0aG9yaW5nIHRvb2wuXG5cdCAqL1xuXHRwdWJsaWMgbmFtZTpzdHJpbmc7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgb3JpZW50YXRpb25Nb2RlOnN0cmluZyA9IE9yaWVudGF0aW9uTW9kZS5ERUZBVUxUO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIERpc3BsYXlPYmplY3RDb250YWluZXIgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhpcyBkaXNwbGF5XG5cdCAqIG9iamVjdC4gVXNlIHRoZSA8Y29kZT5wYXJlbnQ8L2NvZGU+IHByb3BlcnR5IHRvIHNwZWNpZnkgYSByZWxhdGl2ZSBwYXRoIHRvXG5cdCAqIGRpc3BsYXkgb2JqZWN0cyB0aGF0IGFyZSBhYm92ZSB0aGUgY3VycmVudCBkaXNwbGF5IG9iamVjdCBpbiB0aGUgZGlzcGxheVxuXHQgKiBsaXN0IGhpZXJhcmNoeS5cblx0ICpcblx0ICogPHA+WW91IGNhbiB1c2UgPGNvZGU+cGFyZW50PC9jb2RlPiB0byBtb3ZlIHVwIG11bHRpcGxlIGxldmVscyBpbiB0aGVcblx0ICogZGlzcGxheSBsaXN0IGFzIGluIHRoZSBmb2xsb3dpbmc6PC9wPlxuXHQgKlxuXHQgKiBAdGhyb3dzIFNlY3VyaXR5RXJyb3IgVGhlIHBhcmVudCBkaXNwbGF5IG9iamVjdCBiZWxvbmdzIHRvIGEgc2VjdXJpdHlcblx0ICogICAgICAgICAgICAgICAgICAgICAgIHNhbmRib3ggdG8gd2hpY2ggeW91IGRvIG5vdCBoYXZlIGFjY2Vzcy4gWW91IGNhblxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgdGhpcyBzaXR1YXRpb24gYnkgaGF2aW5nIHRoZSBwYXJlbnQgbW92aWUgY2FsbFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIDxjb2RlPlNlY3VyaXR5LmFsbG93RG9tYWluKCk8L2NvZGU+IG1ldGhvZC5cblx0ICovXG5cdHB1YmxpYyBnZXQgcGFyZW50KCk6RGlzcGxheU9iamVjdENvbnRhaW5lclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BQYXJlbnQ7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgcGFydGl0aW9uKCk6UGFydGl0aW9uXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZXhwbGljaXRQYXJ0aXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2V0IHBhcnRpdGlvbih2YWx1ZTpQYXJ0aXRpb24pXG5cdHtcblx0XHRpZiAodGhpcy5fZXhwbGljaXRQYXJ0aXRpb24gPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5fcFNjZW5lICYmIHRoaXMuX2V4cGxpY2l0UGFydGl0aW9uKVxuXHRcdFx0dGhpcy5fcFNjZW5lLmlVbnJlZ2lzdGVyUGFydGl0aW9uKHRoaXMuX2V4cGxpY2l0UGFydGl0aW9uKTtcblxuXHRcdHRoaXMuX2V4cGxpY2l0UGFydGl0aW9uID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5fcFNjZW5lICYmIHZhbHVlKVxuXHRcdFx0dGhpcy5fcFNjZW5lLmlSZWdpc3RlclBhcnRpdGlvbih2YWx1ZSk7XG5cblx0XHR0aGlzLl9wVXBkYXRlSW1wbGljaXRQYXJ0aXRpb24odGhpcy5fcFBhcmVudD8gdGhpcy5fcFBhcmVudC5faUFzc2lnbmVkUGFydGl0aW9uIDogbnVsbCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgcGFydGl0aW9uTm9kZSgpOkVudGl0eU5vZGVcblx0e1xuXHRcdGlmICghdGhpcy5fcGFydGl0aW9uTm9kZSlcblx0XHRcdHRoaXMuX3BhcnRpdGlvbk5vZGUgPSB0aGlzLnBDcmVhdGVFbnRpdHlQYXJ0aXRpb25Ob2RlKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fcGFydGl0aW9uTm9kZTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBwaWNraW5nQ29sbGlkZXIoKTpJUGlja2luZ0NvbGxpZGVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFBpY2tpbmdDb2xsaWRlcjtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcGlja2luZ0NvbGxpZGVyKHZhbHVlOklQaWNraW5nQ29sbGlkZXIpXG5cdHtcblx0XHR0aGlzLl9wUGlja2luZ0NvbGxpZGVyID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgbG9jYWwgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSBvYmplY3Qgcm90YXRlcy5cblx0ICovXG5cdHB1YmxpYyBnZXQgcGl2b3QoKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3Bpdm90O1xuXHR9XG5cblxuXHRwdWJsaWMgc2V0IHBpdm90KHBpdm90OlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy5fcGl2b3QgPSBwaXZvdC5jbG9uZSgpO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlUGl2b3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGb3IgYSBkaXNwbGF5IG9iamVjdCBpbiBhIGxvYWRlZCBTV0YgZmlsZSwgdGhlIDxjb2RlPnJvb3Q8L2NvZGU+IHByb3BlcnR5XG5cdCAqIGlzIHRoZSB0b3AtbW9zdCBkaXNwbGF5IG9iamVjdCBpbiB0aGUgcG9ydGlvbiBvZiB0aGUgZGlzcGxheSBsaXN0J3MgdHJlZVxuXHQgKiBzdHJ1Y3R1cmUgcmVwcmVzZW50ZWQgYnkgdGhhdCBTV0YgZmlsZS4gRm9yIGEgQml0bWFwIG9iamVjdCByZXByZXNlbnRpbmcgYVxuXHQgKiBsb2FkZWQgaW1hZ2UgZmlsZSwgdGhlIDxjb2RlPnJvb3Q8L2NvZGU+IHByb3BlcnR5IGlzIHRoZSBCaXRtYXAgb2JqZWN0XG5cdCAqIGl0c2VsZi4gRm9yIHRoZSBpbnN0YW5jZSBvZiB0aGUgbWFpbiBjbGFzcyBvZiB0aGUgZmlyc3QgU1dGIGZpbGUgbG9hZGVkLFxuXHQgKiB0aGUgPGNvZGU+cm9vdDwvY29kZT4gcHJvcGVydHkgaXMgdGhlIGRpc3BsYXkgb2JqZWN0IGl0c2VsZi4gVGhlXG5cdCAqIDxjb2RlPnJvb3Q8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBTdGFnZSBvYmplY3QgaXMgdGhlIFN0YWdlIG9iamVjdCBpdHNlbGYuXG5cdCAqIFRoZSA8Y29kZT5yb290PC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGFueSBkaXNwbGF5XG5cdCAqIG9iamVjdCB0aGF0IGhhcyBub3QgYmVlbiBhZGRlZCB0byB0aGUgZGlzcGxheSBsaXN0LCB1bmxlc3MgaXQgaGFzIGJlZW5cblx0ICogYWRkZWQgdG8gYSBkaXNwbGF5IG9iamVjdCBjb250YWluZXIgdGhhdCBpcyBvZmYgdGhlIGRpc3BsYXkgbGlzdCBidXQgdGhhdFxuXHQgKiBpcyBhIGNoaWxkIG9mIHRoZSB0b3AtbW9zdCBkaXNwbGF5IG9iamVjdCBpbiBhIGxvYWRlZCBTV0YgZmlsZS5cblx0ICpcblx0ICogPHA+Rm9yIGV4YW1wbGUsIGlmIHlvdSBjcmVhdGUgYSBuZXcgU3ByaXRlIG9iamVjdCBieSBjYWxsaW5nIHRoZVxuXHQgKiA8Y29kZT5TcHJpdGUoKTwvY29kZT4gY29uc3RydWN0b3IgbWV0aG9kLCBpdHMgPGNvZGU+cm9vdDwvY29kZT4gcHJvcGVydHlcblx0ICogaXMgPGNvZGU+bnVsbDwvY29kZT4gdW50aWwgeW91IGFkZCBpdCB0byB0aGUgZGlzcGxheSBsaXN0KG9yIHRvIGEgZGlzcGxheVxuXHQgKiBvYmplY3QgY29udGFpbmVyIHRoYXQgaXMgb2ZmIHRoZSBkaXNwbGF5IGxpc3QgYnV0IHRoYXQgaXMgYSBjaGlsZCBvZiB0aGVcblx0ICogdG9wLW1vc3QgZGlzcGxheSBvYmplY3QgaW4gYSBTV0YgZmlsZSkuPC9wPlxuXHQgKlxuXHQgKiA8cD5Gb3IgYSBsb2FkZWQgU1dGIGZpbGUsIGV2ZW4gdGhvdWdoIHRoZSBMb2FkZXIgb2JqZWN0IHVzZWQgdG8gbG9hZCB0aGVcblx0ICogZmlsZSBtYXkgbm90IGJlIG9uIHRoZSBkaXNwbGF5IGxpc3QsIHRoZSB0b3AtbW9zdCBkaXNwbGF5IG9iamVjdCBpbiB0aGVcblx0ICogU1dGIGZpbGUgaGFzIGl0cyA8Y29kZT5yb290PC9jb2RlPiBwcm9wZXJ0eSBzZXQgdG8gaXRzZWxmLiBUaGUgTG9hZGVyXG5cdCAqIG9iamVjdCBkb2VzIG5vdCBoYXZlIGl0cyA8Y29kZT5yb290PC9jb2RlPiBwcm9wZXJ0eSBzZXQgdW50aWwgaXQgaXMgYWRkZWRcblx0ICogYXMgYSBjaGlsZCBvZiBhIGRpc3BsYXkgb2JqZWN0IGZvciB3aGljaCB0aGUgPGNvZGU+cm9vdDwvY29kZT4gcHJvcGVydHkgaXNcblx0ICogc2V0LjwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgcm9vdCgpOkRpc3BsYXlPYmplY3RDb250YWluZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9yb290O1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGUgcm90YXRpb24gb2YgdGhlIERpc3BsYXlPYmplY3QgaW5zdGFuY2UsIGluIGRlZ3JlZXMsIGZyb20gaXRzXG5cdCAqIG9yaWdpbmFsIG9yaWVudGF0aW9uLiBWYWx1ZXMgZnJvbSAwIHRvIDE4MCByZXByZXNlbnQgY2xvY2t3aXNlIHJvdGF0aW9uO1xuXHQgKiB2YWx1ZXMgZnJvbSAwIHRvIC0xODAgcmVwcmVzZW50IGNvdW50ZXJjbG9ja3dpc2Ugcm90YXRpb24uIFZhbHVlcyBvdXRzaWRlXG5cdCAqIHRoaXMgcmFuZ2UgYXJlIGFkZGVkIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSAzNjAgdG8gb2J0YWluIGEgdmFsdWUgd2l0aGluXG5cdCAqIHRoZSByYW5nZS4gRm9yIGV4YW1wbGUsIHRoZSBzdGF0ZW1lbnQgPGNvZGU+bXlfdmlkZW8ucm90YXRpb24gPSA0NTA8L2NvZGU+XG5cdCAqIGlzIHRoZSBzYW1lIGFzIDxjb2RlPiBteV92aWRlby5yb3RhdGlvbiA9IDkwPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyByb3RhdGlvbjpudW1iZXI7IC8vVE9ET1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIHgtYXhpcyByb3RhdGlvbiBvZiB0aGUgRGlzcGxheU9iamVjdCBpbnN0YW5jZSwgaW4gZGVncmVlcyxcblx0ICogZnJvbSBpdHMgb3JpZ2luYWwgb3JpZW50YXRpb24gcmVsYXRpdmUgdG8gdGhlIDNEIHBhcmVudCBjb250YWluZXIuIFZhbHVlc1xuXHQgKiBmcm9tIDAgdG8gMTgwIHJlcHJlc2VudCBjbG9ja3dpc2Ugcm90YXRpb247IHZhbHVlcyBmcm9tIDAgdG8gLTE4MFxuXHQgKiByZXByZXNlbnQgY291bnRlcmNsb2Nrd2lzZSByb3RhdGlvbi4gVmFsdWVzIG91dHNpZGUgdGhpcyByYW5nZSBhcmUgYWRkZWRcblx0ICogdG8gb3Igc3VidHJhY3RlZCBmcm9tIDM2MCB0byBvYnRhaW4gYSB2YWx1ZSB3aXRoaW4gdGhlIHJhbmdlLlxuXHQgKi9cblx0cHVibGljIGdldCByb3RhdGlvblgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9yb3RhdGlvblgqTWF0aENvbnN0cy5SQURJQU5TX1RPX0RFR1JFRVM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHJvdGF0aW9uWCh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMucm90YXRpb25YID09IHZhbClcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3JvdGF0aW9uWCA9IHZhbCpNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUztcblxuXHRcdHRoaXMuaW52YWxpZGF0ZVJvdGF0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSB5LWF4aXMgcm90YXRpb24gb2YgdGhlIERpc3BsYXlPYmplY3QgaW5zdGFuY2UsIGluIGRlZ3JlZXMsXG5cdCAqIGZyb20gaXRzIG9yaWdpbmFsIG9yaWVudGF0aW9uIHJlbGF0aXZlIHRvIHRoZSAzRCBwYXJlbnQgY29udGFpbmVyLiBWYWx1ZXNcblx0ICogZnJvbSAwIHRvIDE4MCByZXByZXNlbnQgY2xvY2t3aXNlIHJvdGF0aW9uOyB2YWx1ZXMgZnJvbSAwIHRvIC0xODBcblx0ICogcmVwcmVzZW50IGNvdW50ZXJjbG9ja3dpc2Ugcm90YXRpb24uIFZhbHVlcyBvdXRzaWRlIHRoaXMgcmFuZ2UgYXJlIGFkZGVkXG5cdCAqIHRvIG9yIHN1YnRyYWN0ZWQgZnJvbSAzNjAgdG8gb2J0YWluIGEgdmFsdWUgd2l0aGluIHRoZSByYW5nZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgcm90YXRpb25ZKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcm90YXRpb25ZKk1hdGhDb25zdHMuUkFESUFOU19UT19ERUdSRUVTO1xuXHR9XG5cblx0cHVibGljIHNldCByb3RhdGlvblkodmFsOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLnJvdGF0aW9uWSA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9yb3RhdGlvblkgPSB2YWwqTWF0aENvbnN0cy5ERUdSRUVTX1RPX1JBRElBTlM7XG5cblx0XHR0aGlzLmludmFsaWRhdGVSb3RhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGUgei1heGlzIHJvdGF0aW9uIG9mIHRoZSBEaXNwbGF5T2JqZWN0IGluc3RhbmNlLCBpbiBkZWdyZWVzLFxuXHQgKiBmcm9tIGl0cyBvcmlnaW5hbCBvcmllbnRhdGlvbiByZWxhdGl2ZSB0byB0aGUgM0QgcGFyZW50IGNvbnRhaW5lci4gVmFsdWVzXG5cdCAqIGZyb20gMCB0byAxODAgcmVwcmVzZW50IGNsb2Nrd2lzZSByb3RhdGlvbjsgdmFsdWVzIGZyb20gMCB0byAtMTgwXG5cdCAqIHJlcHJlc2VudCBjb3VudGVyY2xvY2t3aXNlIHJvdGF0aW9uLiBWYWx1ZXMgb3V0c2lkZSB0aGlzIHJhbmdlIGFyZSBhZGRlZFxuXHQgKiB0byBvciBzdWJ0cmFjdGVkIGZyb20gMzYwIHRvIG9idGFpbiBhIHZhbHVlIHdpdGhpbiB0aGUgcmFuZ2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHJvdGF0aW9uWigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3JvdGF0aW9uWipNYXRoQ29uc3RzLlJBRElBTlNfVE9fREVHUkVFUztcblx0fVxuXG5cdHB1YmxpYyBzZXQgcm90YXRpb25aKHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5yb3RhdGlvblogPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcm90YXRpb25aID0gdmFsKk1hdGhDb25zdHMuREVHUkVFU19UT19SQURJQU5TO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlUm90YXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY3VycmVudCBzY2FsaW5nIGdyaWQgdGhhdCBpcyBpbiBlZmZlY3QuIElmIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPixcblx0ICogdGhlIGVudGlyZSBkaXNwbGF5IG9iamVjdCBpcyBzY2FsZWQgbm9ybWFsbHkgd2hlbiBhbnkgc2NhbGUgdHJhbnNmb3JtYXRpb25cblx0ICogaXMgYXBwbGllZC5cblx0ICpcblx0ICogPHA+V2hlbiB5b3UgZGVmaW5lIHRoZSA8Y29kZT5zY2FsZTlHcmlkPC9jb2RlPiBwcm9wZXJ0eSwgdGhlIGRpc3BsYXlcblx0ICogb2JqZWN0IGlzIGRpdmlkZWQgaW50byBhIGdyaWQgd2l0aCBuaW5lIHJlZ2lvbnMgYmFzZWQgb24gdGhlXG5cdCAqIDxjb2RlPnNjYWxlOUdyaWQ8L2NvZGU+IHJlY3RhbmdsZSwgd2hpY2ggZGVmaW5lcyB0aGUgY2VudGVyIHJlZ2lvbiBvZiB0aGVcblx0ICogZ3JpZC4gVGhlIGVpZ2h0IG90aGVyIHJlZ2lvbnMgb2YgdGhlIGdyaWQgYXJlIHRoZSBmb2xsb3dpbmcgYXJlYXM6IDwvcD5cblx0ICpcblx0ICogPHVsPlxuXHQgKiAgIDxsaT5UaGUgdXBwZXItbGVmdCBjb3JuZXIgb3V0c2lkZSBvZiB0aGUgcmVjdGFuZ2xlPC9saT5cblx0ICogICA8bGk+VGhlIGFyZWEgYWJvdmUgdGhlIHJlY3RhbmdsZSA8L2xpPlxuXHQgKiAgIDxsaT5UaGUgdXBwZXItcmlnaHQgY29ybmVyIG91dHNpZGUgb2YgdGhlIHJlY3RhbmdsZTwvbGk+XG5cdCAqICAgPGxpPlRoZSBhcmVhIHRvIHRoZSBsZWZ0IG9mIHRoZSByZWN0YW5nbGU8L2xpPlxuXHQgKiAgIDxsaT5UaGUgYXJlYSB0byB0aGUgcmlnaHQgb2YgdGhlIHJlY3RhbmdsZTwvbGk+XG5cdCAqICAgPGxpPlRoZSBsb3dlci1sZWZ0IGNvcm5lciBvdXRzaWRlIG9mIHRoZSByZWN0YW5nbGU8L2xpPlxuXHQgKiAgIDxsaT5UaGUgYXJlYSBiZWxvdyB0aGUgcmVjdGFuZ2xlPC9saT5cblx0ICogICA8bGk+VGhlIGxvd2VyLXJpZ2h0IGNvcm5lciBvdXRzaWRlIG9mIHRoZSByZWN0YW5nbGU8L2xpPlxuXHQgKiA8L3VsPlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIHRoaW5rIG9mIHRoZSBlaWdodCByZWdpb25zIG91dHNpZGUgb2YgdGhlIGNlbnRlcihkZWZpbmVkIGJ5XG5cdCAqIHRoZSByZWN0YW5nbGUpIGFzIGJlaW5nIGxpa2UgYSBwaWN0dXJlIGZyYW1lIHRoYXQgaGFzIHNwZWNpYWwgcnVsZXNcblx0ICogYXBwbGllZCB0byBpdCB3aGVuIHNjYWxlZC48L3A+XG5cdCAqXG5cdCAqIDxwPldoZW4gdGhlIDxjb2RlPnNjYWxlOUdyaWQ8L2NvZGU+IHByb3BlcnR5IGlzIHNldCBhbmQgYSBkaXNwbGF5IG9iamVjdFxuXHQgKiBpcyBzY2FsZWQsIGFsbCB0ZXh0IGFuZCBncmFkaWVudHMgYXJlIHNjYWxlZCBub3JtYWxseTsgaG93ZXZlciwgZm9yIG90aGVyXG5cdCAqIHR5cGVzIG9mIG9iamVjdHMgdGhlIGZvbGxvd2luZyBydWxlcyBhcHBseTo8L3A+XG5cdCAqXG5cdCAqIDx1bD5cblx0ICogICA8bGk+Q29udGVudCBpbiB0aGUgY2VudGVyIHJlZ2lvbiBpcyBzY2FsZWQgbm9ybWFsbHkuIDwvbGk+XG5cdCAqICAgPGxpPkNvbnRlbnQgaW4gdGhlIGNvcm5lcnMgaXMgbm90IHNjYWxlZC4gPC9saT5cblx0ICogICA8bGk+Q29udGVudCBpbiB0aGUgdG9wIGFuZCBib3R0b20gcmVnaW9ucyBpcyBzY2FsZWQgaG9yaXpvbnRhbGx5IG9ubHkuXG5cdCAqIENvbnRlbnQgaW4gdGhlIGxlZnQgYW5kIHJpZ2h0IHJlZ2lvbnMgaXMgc2NhbGVkIHZlcnRpY2FsbHkgb25seS48L2xpPlxuXHQgKiAgIDxsaT5BbGwgZmlsbHMoaW5jbHVkaW5nIGJpdG1hcHMsIHZpZGVvLCBhbmQgZ3JhZGllbnRzKSBhcmUgc3RyZXRjaGVkIHRvXG5cdCAqIGZpdCB0aGVpciBzaGFwZXMuPC9saT5cblx0ICogPC91bD5cblx0ICpcblx0ICogPHA+SWYgYSBkaXNwbGF5IG9iamVjdCBpcyByb3RhdGVkLCBhbGwgc3Vic2VxdWVudCBzY2FsaW5nIGlzIG5vcm1hbChhbmRcblx0ICogdGhlIDxjb2RlPnNjYWxlOUdyaWQ8L2NvZGU+IHByb3BlcnR5IGlzIGlnbm9yZWQpLjwvcD5cblx0ICpcblx0ICogPHA+Rm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgZGlzcGxheSBvYmplY3QgYW5kIGEgcmVjdGFuZ2xlIHRoYXRcblx0ICogaXMgYXBwbGllZCBhcyB0aGUgZGlzcGxheSBvYmplY3QncyA8Y29kZT5zY2FsZTlHcmlkPC9jb2RlPjo8L3A+XG5cdCAqXG5cdCAqIDxwPkEgY29tbW9uIHVzZSBmb3Igc2V0dGluZyA8Y29kZT5zY2FsZTlHcmlkPC9jb2RlPiBpcyB0byBzZXQgdXAgYSBkaXNwbGF5XG5cdCAqIG9iamVjdCB0byBiZSB1c2VkIGFzIGEgY29tcG9uZW50LCBpbiB3aGljaCBlZGdlIHJlZ2lvbnMgcmV0YWluIHRoZSBzYW1lXG5cdCAqIHdpZHRoIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBzY2FsZWQuPC9wPlxuXHQgKlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgSWYgeW91IHBhc3MgYW4gaW52YWxpZCBhcmd1bWVudCB0byB0aGUgbWV0aG9kLlxuXHQgKi9cblx0cHVibGljIHNjYWxlOUdyaWQ6UmVjdGFuZ2xlO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIGhvcml6b250YWwgc2NhbGUocGVyY2VudGFnZSkgb2YgdGhlIG9iamVjdCBhcyBhcHBsaWVkIGZyb21cblx0ICogdGhlIHJlZ2lzdHJhdGlvbiBwb2ludC4gVGhlIGRlZmF1bHQgcmVnaXN0cmF0aW9uIHBvaW50IGlzKDAsMCkuIDEuMFxuXHQgKiBlcXVhbHMgMTAwJSBzY2FsZS5cblx0ICpcblx0ICogPHA+U2NhbGluZyB0aGUgbG9jYWwgY29vcmRpbmF0ZSBzeXN0ZW0gY2hhbmdlcyB0aGUgPGNvZGU+eDwvY29kZT4gYW5kXG5cdCAqIDxjb2RlPnk8L2NvZGU+IHByb3BlcnR5IHZhbHVlcywgd2hpY2ggYXJlIGRlZmluZWQgaW4gd2hvbGUgcGl4ZWxzLiA8L3A+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNjYWxlWCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BTY2FsZVg7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHNjYWxlWCh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BTY2FsZVggPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcFNjYWxlWCA9IHZhbDtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZVNjYWxlKCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSB2ZXJ0aWNhbCBzY2FsZShwZXJjZW50YWdlKSBvZiBhbiBvYmplY3QgYXMgYXBwbGllZCBmcm9tIHRoZVxuXHQgKiByZWdpc3RyYXRpb24gcG9pbnQgb2YgdGhlIG9iamVjdC4gVGhlIGRlZmF1bHQgcmVnaXN0cmF0aW9uIHBvaW50IGlzKDAsMCkuXG5cdCAqIDEuMCBpcyAxMDAlIHNjYWxlLlxuXHQgKlxuXHQgKiA8cD5TY2FsaW5nIHRoZSBsb2NhbCBjb29yZGluYXRlIHN5c3RlbSBjaGFuZ2VzIHRoZSA8Y29kZT54PC9jb2RlPiBhbmRcblx0ICogPGNvZGU+eTwvY29kZT4gcHJvcGVydHkgdmFsdWVzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiB3aG9sZSBwaXhlbHMuIDwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2NhbGVZKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFNjYWxlWTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2NhbGVZKHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fcFNjYWxlWSA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9wU2NhbGVZID0gdmFsO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlU2NhbGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIGRlcHRoIHNjYWxlKHBlcmNlbnRhZ2UpIG9mIGFuIG9iamVjdCBhcyBhcHBsaWVkIGZyb20gdGhlXG5cdCAqIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgb2JqZWN0LiBUaGUgZGVmYXVsdCByZWdpc3RyYXRpb24gcG9pbnQgaXMoMCwwKS5cblx0ICogMS4wIGlzIDEwMCUgc2NhbGUuXG5cdCAqXG5cdCAqIDxwPlNjYWxpbmcgdGhlIGxvY2FsIGNvb3JkaW5hdGUgc3lzdGVtIGNoYW5nZXMgdGhlIDxjb2RlPng8L2NvZGU+LFxuXHQgKiA8Y29kZT55PC9jb2RlPiBhbmQgPGNvZGU+ejwvY29kZT4gcHJvcGVydHkgdmFsdWVzLCB3aGljaCBhcmUgZGVmaW5lZCBpblxuXHQgKiB3aG9sZSBwaXhlbHMuIDwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2NhbGVaKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFNjYWxlWjtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2NhbGVaKHZhbDpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fcFNjYWxlWiA9PSB2YWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9wU2NhbGVaID0gdmFsO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlU2NhbGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBzY2VuZSgpOlNjZW5lXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFNjZW5lO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNjZW5lUG9zaXRpb24oKTpWZWN0b3IzRFxuXHR7XG5cdFx0aWYgKHRoaXMuX3NjZW5lUG9zaXRpb25EaXJ0eSkge1xuXHRcdFx0aWYgKCF0aGlzLl9waXZvdFplcm8gJiYgdGhpcy5hbGlnbm1lbnRNb2RlID09IEFsaWdubWVudE1vZGUuUElWT1RfUE9JTlQpIHtcblx0XHRcdFx0dmFyIHBpdm90U2NhbGU6VmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QodGhpcy5fcGl2b3QueC90aGlzLl9wU2NhbGVYLCB0aGlzLl9waXZvdC55L3RoaXMuX3BTY2FsZVksIHRoaXMuX3Bpdm90LnovdGhpcy5fcFNjYWxlWilcblx0XHRcdFx0XHR0aGlzLl9zY2VuZVBvc2l0aW9uID0gdGhpcy5zY2VuZVRyYW5zZm9ybS50cmFuc2Zvcm1WZWN0b3IocGl2b3RTY2FsZSk7XG5cdFx0XHRcdC8vdGhpcy5fc2NlbmVQb3NpdGlvbi5kZWNyZW1lbnRCeShuZXcgVmVjdG9yM0QodGhpcy5fcGl2b3QueCp0aGlzLl9wU2NhbGVYLCB0aGlzLl9waXZvdC55KnRoaXMuX3BTY2FsZVksIHRoaXMuX3Bpdm90LnoqdGhpcy5fcFNjYWxlWikpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zY2VuZVRyYW5zZm9ybS5jb3B5Q29sdW1uVG8oMywgdGhpcy5fc2NlbmVQb3NpdGlvbik7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3NjZW5lUG9zaXRpb25EaXJ0eSA9IGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5fc2NlbmVQb3NpdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBnZXQgc2NlbmVUcmFuc2Zvcm0oKTpNYXRyaXgzRFxuXHR7XG5cdFx0aWYgKHRoaXMuX3BTY2VuZVRyYW5zZm9ybURpcnR5KVxuXHRcdFx0dGhpcy5wVXBkYXRlU2NlbmVUcmFuc2Zvcm0oKTtcblxuXHRcdHJldHVybiB0aGlzLl9wU2NlbmVUcmFuc2Zvcm07XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHNjcm9sbCByZWN0YW5nbGUgYm91bmRzIG9mIHRoZSBkaXNwbGF5IG9iamVjdC4gVGhlIGRpc3BsYXkgb2JqZWN0IGlzXG5cdCAqIGNyb3BwZWQgdG8gdGhlIHNpemUgZGVmaW5lZCBieSB0aGUgcmVjdGFuZ2xlLCBhbmQgaXQgc2Nyb2xscyB3aXRoaW4gdGhlXG5cdCAqIHJlY3RhbmdsZSB3aGVuIHlvdSBjaGFuZ2UgdGhlIDxjb2RlPng8L2NvZGU+IGFuZCA8Y29kZT55PC9jb2RlPiBwcm9wZXJ0aWVzXG5cdCAqIG9mIHRoZSA8Y29kZT5zY3JvbGxSZWN0PC9jb2RlPiBvYmplY3QuXG5cdCAqXG5cdCAqIDxwPlRoZSBwcm9wZXJ0aWVzIG9mIHRoZSA8Y29kZT5zY3JvbGxSZWN0PC9jb2RlPiBSZWN0YW5nbGUgb2JqZWN0IHVzZSB0aGVcblx0ICogZGlzcGxheSBvYmplY3QncyBjb29yZGluYXRlIHNwYWNlIGFuZCBhcmUgc2NhbGVkIGp1c3QgbGlrZSB0aGUgb3ZlcmFsbFxuXHQgKiBkaXNwbGF5IG9iamVjdC4gVGhlIGNvcm5lciBib3VuZHMgb2YgdGhlIGNyb3BwZWQgd2luZG93IG9uIHRoZSBzY3JvbGxpbmdcblx0ICogZGlzcGxheSBvYmplY3QgYXJlIHRoZSBvcmlnaW4gb2YgdGhlIGRpc3BsYXkgb2JqZWN0KDAsMCkgYW5kIHRoZSBwb2ludFxuXHQgKiBkZWZpbmVkIGJ5IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUuIFRoZXkgYXJlIG5vdCBjZW50ZXJlZFxuXHQgKiBhcm91bmQgdGhlIG9yaWdpbiwgYnV0IHVzZSB0aGUgb3JpZ2luIHRvIGRlZmluZSB0aGUgdXBwZXItbGVmdCBjb3JuZXIgb2Zcblx0ICogdGhlIGFyZWEuIEEgc2Nyb2xsZWQgZGlzcGxheSBvYmplY3QgYWx3YXlzIHNjcm9sbHMgaW4gd2hvbGUgcGl4ZWxcblx0ICogaW5jcmVtZW50cy4gPC9wPlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIHNjcm9sbCBhbiBvYmplY3QgbGVmdCBhbmQgcmlnaHQgYnkgc2V0dGluZyB0aGUgPGNvZGU+eDwvY29kZT5cblx0ICogcHJvcGVydHkgb2YgdGhlIDxjb2RlPnNjcm9sbFJlY3Q8L2NvZGU+IFJlY3RhbmdsZSBvYmplY3QuIFlvdSBjYW4gc2Nyb2xsXG5cdCAqIGFuIG9iamVjdCB1cCBhbmQgZG93biBieSBzZXR0aW5nIHRoZSA8Y29kZT55PC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGVcblx0ICogPGNvZGU+c2Nyb2xsUmVjdDwvY29kZT4gUmVjdGFuZ2xlIG9iamVjdC4gSWYgdGhlIGRpc3BsYXkgb2JqZWN0IGlzIHJvdGF0ZWRcblx0ICogOTDCsCBhbmQgeW91IHNjcm9sbCBpdCBsZWZ0IGFuZCByaWdodCwgdGhlIGRpc3BsYXkgb2JqZWN0IGFjdHVhbGx5IHNjcm9sbHNcblx0ICogdXAgYW5kIGRvd24uPC9wPlxuXHQgKi9cblx0cHVibGljIHNjcm9sbFJlY3Q6UmVjdGFuZ2xlO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBzaGFkZXJQaWNraW5nRGV0YWlscygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9zaGFkZXJQaWNraW5nRGV0YWlscztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBib3VuZHNWaXNpYmxlKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JvdW5kc1Zpc2libGU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGJvdW5kc1Zpc2libGUodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9ib3VuZHNWaXNpYmxlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fYm91bmRzVmlzaWJsZSA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcGFydGl0aW9uTm9kZS5ib3VuZHNWaXNpYmxlID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyBwZXJ0YWluaW5nIHRvIGEgZGlzcGxheSBvYmplY3QncyBtYXRyaXgsIGNvbG9yXG5cdCAqIHRyYW5zZm9ybSwgYW5kIHBpeGVsIGJvdW5kcy4gVGhlIHNwZWNpZmljIHByb3BlcnRpZXMgIC0gIG1hdHJpeCxcblx0ICogY29sb3JUcmFuc2Zvcm0sIGFuZCB0aHJlZSByZWFkLW9ubHkgcHJvcGVydGllc1xuXHQgKiAoPGNvZGU+Y29uY2F0ZW5hdGVkTWF0cml4PC9jb2RlPiwgPGNvZGU+Y29uY2F0ZW5hdGVkQ29sb3JUcmFuc2Zvcm08L2NvZGU+LFxuXHQgKiBhbmQgPGNvZGU+cGl4ZWxCb3VuZHM8L2NvZGU+KSAgLSAgYXJlIGRlc2NyaWJlZCBpbiB0aGUgZW50cnkgZm9yIHRoZVxuXHQgKiBUcmFuc2Zvcm0gY2xhc3MuXG5cdCAqXG5cdCAqIDxwPkVhY2ggb2YgdGhlIHRyYW5zZm9ybSBvYmplY3QncyBwcm9wZXJ0aWVzIGlzIGl0c2VsZiBhbiBvYmplY3QuIFRoaXNcblx0ICogY29uY2VwdCBpcyBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgb25seSB3YXkgdG8gc2V0IG5ldyB2YWx1ZXMgZm9yIHRoZSBtYXRyaXhcblx0ICogb3IgY29sb3JUcmFuc2Zvcm0gb2JqZWN0cyBpcyB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGFuZCBjb3B5IHRoYXQgb2JqZWN0XG5cdCAqIGludG8gdGhlIHRyYW5zZm9ybS5tYXRyaXggb3IgdHJhbnNmb3JtLmNvbG9yVHJhbnNmb3JtIHByb3BlcnR5LjwvcD5cblx0ICpcblx0ICogPHA+Rm9yIGV4YW1wbGUsIHRvIGluY3JlYXNlIHRoZSA8Y29kZT50eDwvY29kZT4gdmFsdWUgb2YgYSBkaXNwbGF5XG5cdCAqIG9iamVjdCdzIG1hdHJpeCwgeW91IG11c3QgbWFrZSBhIGNvcHkgb2YgdGhlIGVudGlyZSBtYXRyaXggb2JqZWN0LCB0aGVuXG5cdCAqIGNvcHkgdGhlIG5ldyBvYmplY3QgaW50byB0aGUgbWF0cml4IHByb3BlcnR5IG9mIHRoZSB0cmFuc2Zvcm0gb2JqZWN0OjwvcD5cblx0ICogPHByZSB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPjxjb2RlPiBwdWJsaWMgbXlNYXRyaXg6TWF0cml4ID1cblx0ICogbXlEaXNwbGF5T2JqZWN0LnRyYW5zZm9ybS5tYXRyaXg7IG15TWF0cml4LnR4ICs9IDEwO1xuXHQgKiBteURpc3BsYXlPYmplY3QudHJhbnNmb3JtLm1hdHJpeCA9IG15TWF0cml4OyA8L2NvZGU+PC9wcmU+XG5cdCAqXG5cdCAqIDxwPllvdSBjYW5ub3QgZGlyZWN0bHkgc2V0IHRoZSA8Y29kZT50eDwvY29kZT4gcHJvcGVydHkuIFRoZSBmb2xsb3dpbmdcblx0ICogY29kZSBoYXMgbm8gZWZmZWN0IG9uIDxjb2RlPm15RGlzcGxheU9iamVjdDwvY29kZT46IDwvcD5cblx0ICogPHByZSB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPjxjb2RlPiBteURpc3BsYXlPYmplY3QudHJhbnNmb3JtLm1hdHJpeC50eCArPVxuXHQgKiAxMDsgPC9jb2RlPjwvcHJlPlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIGFsc28gY29weSBhbiBlbnRpcmUgdHJhbnNmb3JtIG9iamVjdCBhbmQgYXNzaWduIGl0IHRvIGFub3RoZXJcblx0ICogZGlzcGxheSBvYmplY3QncyB0cmFuc2Zvcm0gcHJvcGVydHkuIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNvZGVcblx0ICogY29waWVzIHRoZSBlbnRpcmUgdHJhbnNmb3JtIG9iamVjdCBmcm9tIDxjb2RlPm15T2xkRGlzcGxheU9iajwvY29kZT4gdG9cblx0ICogPGNvZGU+bXlOZXdEaXNwbGF5T2JqPC9jb2RlPjo8L3A+XG5cdCAqIDxjb2RlPm15TmV3RGlzcGxheU9iai50cmFuc2Zvcm0gPSBteU9sZERpc3BsYXlPYmoudHJhbnNmb3JtOzwvY29kZT5cblx0ICpcblx0ICogPHA+VGhlIHJlc3VsdGluZyBkaXNwbGF5IG9iamVjdCwgPGNvZGU+bXlOZXdEaXNwbGF5T2JqPC9jb2RlPiwgbm93IGhhcyB0aGVcblx0ICogc2FtZSB2YWx1ZXMgZm9yIGl0cyBtYXRyaXgsIGNvbG9yIHRyYW5zZm9ybSwgYW5kIHBpeGVsIGJvdW5kcyBhcyB0aGUgb2xkXG5cdCAqIGRpc3BsYXkgb2JqZWN0LCA8Y29kZT5teU9sZERpc3BsYXlPYmo8L2NvZGU+LjwvcD5cblx0ICpcblx0ICogPHA+Tm90ZSB0aGF0IEFJUiBmb3IgVFYgZGV2aWNlcyB1c2UgaGFyZHdhcmUgYWNjZWxlcmF0aW9uLCBpZiBpdCBpc1xuXHQgKiBhdmFpbGFibGUsIGZvciBjb2xvciB0cmFuc2Zvcm1zLjwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgdHJhbnNmb3JtKCk6VHJhbnNmb3JtXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdHJhbnNmb3JtO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZXRoZXIgb3Igbm90IHRoZSBkaXNwbGF5IG9iamVjdCBpcyB2aXNpYmxlLiBEaXNwbGF5IG9iamVjdHMgdGhhdCBhcmUgbm90XG5cdCAqIHZpc2libGUgYXJlIGRpc2FibGVkLiBGb3IgZXhhbXBsZSwgaWYgPGNvZGU+dmlzaWJsZT1mYWxzZTwvY29kZT4gZm9yIGFuXG5cdCAqIEludGVyYWN0aXZlT2JqZWN0IGluc3RhbmNlLCBpdCBjYW5ub3QgYmUgY2xpY2tlZC5cblx0ICovXG5cdHB1YmxpYyBnZXQgdmlzaWJsZSgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9leHBsaWNpdFZpc2liaWxpdHk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHZpc2libGUodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9leHBsaWNpdFZpc2liaWxpdHkgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9leHBsaWNpdFZpc2liaWxpdHkgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BVcGRhdGVJbXBsaWNpdFZpc2liaWxpdHkodGhpcy5fcFBhcmVudD8gdGhpcy5fcFBhcmVudC5faUlzVmlzaWJsZSgpIDogdHJ1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSB3aWR0aCBvZiB0aGUgZGlzcGxheSBvYmplY3QsIGluIHBpeGVscy4gVGhlIHdpZHRoIGlzXG5cdCAqIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGJvdW5kcyBvZiB0aGUgY29udGVudCBvZiB0aGUgZGlzcGxheSBvYmplY3QuIFdoZW5cblx0ICogeW91IHNldCB0aGUgPGNvZGU+d2lkdGg8L2NvZGU+IHByb3BlcnR5LCB0aGUgPGNvZGU+c2NhbGVYPC9jb2RlPiBwcm9wZXJ0eVxuXHQgKiBpcyBhZGp1c3RlZCBhY2NvcmRpbmdseSwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBjb2RlOlxuXHQgKlxuXHQgKiA8cD5FeGNlcHQgZm9yIFRleHRGaWVsZCBhbmQgVmlkZW8gb2JqZWN0cywgYSBkaXNwbGF5IG9iamVjdCB3aXRoIG5vXG5cdCAqIGNvbnRlbnQoc3VjaCBhcyBhbiBlbXB0eSBzcHJpdGUpIGhhcyBhIHdpZHRoIG9mIDAsIGV2ZW4gaWYgeW91IHRyeSB0byBzZXRcblx0ICogPGNvZGU+d2lkdGg8L2NvZGU+IHRvIGEgZGlmZmVyZW50IHZhbHVlLjwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgd2lkdGgoKTpudW1iZXJcblx0e1xuXHRcdGlmICh0aGlzLl9wQm91bmRzSW52YWxpZClcblx0XHRcdHRoaXMucFVwZGF0ZUJvdW5kcygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3dpZHRoO1xuXHR9XG5cblx0cHVibGljIHNldCB3aWR0aCh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3dpZHRoID09IHZhbClcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3dpZHRoID09IHZhbDtcblxuXHRcdHRoaXMuX3BTY2FsZVggPSB2YWwvdGhpcy5ib3VuZHMuYWFiYi53aWR0aDtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZVNjYWxlKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgd29ybGRCb3VuZHMoKTpCb3VuZGluZ1ZvbHVtZUJhc2Vcblx0e1xuXHRcdC8vIFNpbmNlIHRoaXMgZ2V0dGVyIGlzIGludm9rZWQgZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSByZW5kZXIgbG9vcCwgYW5kXG5cdFx0Ly8gdGhlIHByZWZhYiBjb25zdHJ1Y3QgY291bGQgYWZmZWN0IHRoZSBib3VuZHMgb2YgdGhlIGVudGl0eSwgdGhlIHByZWZhYiBpc1xuXHRcdC8vIHZhbGlkYXRlZCBoZXJlIHRvIGdpdmUgaXQgYSBjaGFuY2UgdG8gcmVidWlsZC5cblx0XHRpZiAodGhpcy5faVNvdXJjZVByZWZhYilcblx0XHRcdHRoaXMuX2lTb3VyY2VQcmVmYWIuX2lWYWxpZGF0ZSgpO1xuXG5cdFx0aWYgKHRoaXMuX3dvcmxkQm91bmRzSW52YWxpZCkge1xuXHRcdFx0dGhpcy5fd29ybGRCb3VuZHNJbnZhbGlkID0gZmFsc2U7XG5cdFx0XHR0aGlzLl93b3JsZEJvdW5kcy50cmFuc2Zvcm1Gcm9tKHRoaXMuYm91bmRzLCB0aGlzLnNjZW5lVHJhbnNmb3JtKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fd29ybGRCb3VuZHM7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSA8aT54PC9pPiBjb29yZGluYXRlIG9mIHRoZSBEaXNwbGF5T2JqZWN0IGluc3RhbmNlIHJlbGF0aXZlXG5cdCAqIHRvIHRoZSBsb2NhbCBjb29yZGluYXRlcyBvZiB0aGUgcGFyZW50IERpc3BsYXlPYmplY3RDb250YWluZXIuIElmIHRoZVxuXHQgKiBvYmplY3QgaXMgaW5zaWRlIGEgRGlzcGxheU9iamVjdENvbnRhaW5lciB0aGF0IGhhcyB0cmFuc2Zvcm1hdGlvbnMsIGl0IGlzXG5cdCAqIGluIHRoZSBsb2NhbCBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgZW5jbG9zaW5nIERpc3BsYXlPYmplY3RDb250YWluZXIuXG5cdCAqIFRodXMsIGZvciBhIERpc3BsYXlPYmplY3RDb250YWluZXIgcm90YXRlZCA5MMKwIGNvdW50ZXJjbG9ja3dpc2UsIHRoZVxuXHQgKiBEaXNwbGF5T2JqZWN0Q29udGFpbmVyJ3MgY2hpbGRyZW4gaW5oZXJpdCBhIGNvb3JkaW5hdGUgc3lzdGVtIHRoYXQgaXNcblx0ICogcm90YXRlZCA5MMKwIGNvdW50ZXJjbG9ja3dpc2UuIFRoZSBvYmplY3QncyBjb29yZGluYXRlcyByZWZlciB0byB0aGVcblx0ICogcmVnaXN0cmF0aW9uIHBvaW50IHBvc2l0aW9uLlxuXHQgKi9cblx0cHVibGljIGdldCB4KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5feDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgeCh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3ggPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5feCA9IHZhbDtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZVBvc2l0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSA8aT55PC9pPiBjb29yZGluYXRlIG9mIHRoZSBEaXNwbGF5T2JqZWN0IGluc3RhbmNlIHJlbGF0aXZlXG5cdCAqIHRvIHRoZSBsb2NhbCBjb29yZGluYXRlcyBvZiB0aGUgcGFyZW50IERpc3BsYXlPYmplY3RDb250YWluZXIuIElmIHRoZVxuXHQgKiBvYmplY3QgaXMgaW5zaWRlIGEgRGlzcGxheU9iamVjdENvbnRhaW5lciB0aGF0IGhhcyB0cmFuc2Zvcm1hdGlvbnMsIGl0IGlzXG5cdCAqIGluIHRoZSBsb2NhbCBjb29yZGluYXRlIHN5c3RlbSBvZiB0aGUgZW5jbG9zaW5nIERpc3BsYXlPYmplY3RDb250YWluZXIuXG5cdCAqIFRodXMsIGZvciBhIERpc3BsYXlPYmplY3RDb250YWluZXIgcm90YXRlZCA5MMKwIGNvdW50ZXJjbG9ja3dpc2UsIHRoZVxuXHQgKiBEaXNwbGF5T2JqZWN0Q29udGFpbmVyJ3MgY2hpbGRyZW4gaW5oZXJpdCBhIGNvb3JkaW5hdGUgc3lzdGVtIHRoYXQgaXNcblx0ICogcm90YXRlZCA5MMKwIGNvdW50ZXJjbG9ja3dpc2UuIFRoZSBvYmplY3QncyBjb29yZGluYXRlcyByZWZlciB0byB0aGVcblx0ICogcmVnaXN0cmF0aW9uIHBvaW50IHBvc2l0aW9uLlxuXHQgKi9cblx0cHVibGljIGdldCB5KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5feTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgeSh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3kgPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5feSA9IHZhbDtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZVBvc2l0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSB6IGNvb3JkaW5hdGUgcG9zaXRpb24gYWxvbmcgdGhlIHotYXhpcyBvZiB0aGUgRGlzcGxheU9iamVjdFxuXHQgKiBpbnN0YW5jZSByZWxhdGl2ZSB0byB0aGUgM0QgcGFyZW50IGNvbnRhaW5lci4gVGhlIHogcHJvcGVydHkgaXMgdXNlZCBmb3Jcblx0ICogM0QgY29vcmRpbmF0ZXMsIG5vdCBzY3JlZW4gb3IgcGl4ZWwgY29vcmRpbmF0ZXMuXG5cdCAqXG5cdCAqIDxwPldoZW4geW91IHNldCBhIDxjb2RlPno8L2NvZGU+IHByb3BlcnR5IGZvciBhIGRpc3BsYXkgb2JqZWN0IHRvXG5cdCAqIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IHZhbHVlIG9mIDxjb2RlPjA8L2NvZGU+LCBhIGNvcnJlc3BvbmRpbmdcblx0ICogTWF0cml4M0Qgb2JqZWN0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4gZm9yIGFkanVzdGluZyBhIGRpc3BsYXkgb2JqZWN0J3Ncblx0ICogcG9zaXRpb24gYW5kIG9yaWVudGF0aW9uIGluIHRocmVlIGRpbWVuc2lvbnMuIFdoZW4gd29ya2luZyB3aXRoIHRoZVxuXHQgKiB6LWF4aXMsIHRoZSBleGlzdGluZyBiZWhhdmlvciBvZiB4IGFuZCB5IHByb3BlcnRpZXMgY2hhbmdlcyBmcm9tIHNjcmVlbiBvclxuXHQgKiBwaXhlbCBjb29yZGluYXRlcyB0byBwb3NpdGlvbnMgcmVsYXRpdmUgdG8gdGhlIDNEIHBhcmVudCBjb250YWluZXIuPC9wPlxuXHQgKlxuXHQgKiA8cD5Gb3IgZXhhbXBsZSwgYSBjaGlsZCBvZiB0aGUgPGNvZGU+X3Jvb3Q8L2NvZGU+IGF0IHBvc2l0aW9uIHggPSAxMDAsIHkgPVxuXHQgKiAxMDAsIHogPSAyMDAgaXMgbm90IGRyYXduIGF0IHBpeGVsIGxvY2F0aW9uKDEwMCwxMDApLiBUaGUgY2hpbGQgaXMgZHJhd25cblx0ICogd2hlcmV2ZXIgdGhlIDNEIHByb2plY3Rpb24gY2FsY3VsYXRpb24gcHV0cyBpdC4gVGhlIGNhbGN1bGF0aW9uIGlzOjwvcD5cblx0ICpcblx0ICogPHA+PGNvZGU+KHh+fmNhbWVyYUZvY2FsTGVuZ3RoL2NhbWVyYVJlbGF0aXZlWlBvc2l0aW9uLFxuXHQgKiB5fn5jYW1lcmFGb2NhbExlbmd0aC9jYW1lcmFSZWxhdGl2ZVpQb3NpdGlvbik8L2NvZGU+PC9wPlxuXHQgKi9cblx0cHVibGljIGdldCB6KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fejtcblx0fVxuXG5cdHB1YmxpYyBzZXQgeih2YWw6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3ogPT0gdmFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5feiA9IHZhbDtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZVBvc2l0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgek9mZnNldCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3pPZmZzZXQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHpPZmZzZXQodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fek9mZnNldCA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+RGlzcGxheU9iamVjdDwvY29kZT4gaW5zdGFuY2UuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0Ly8gQ2FjaGVkIHZlY3RvciBvZiB0cmFuc2Zvcm1hdGlvbiBjb21wb25lbnRzIHVzZWQgd2hlblxuXHRcdC8vIHJlY29tcG9zaW5nIHRoZSB0cmFuc2Zvcm0gbWF0cml4IGluIHVwZGF0ZVRyYW5zZm9ybSgpXG5cblx0XHR0aGlzLl90cmFuc2Zvcm1Db21wb25lbnRzID0gbmV3IEFycmF5PFZlY3RvcjNEPigzKTsvL190cmFuc2Zvcm1Db21wb25lbnRzID0gbmV3IFZlY3Rvci48VmVjdG9yM0Q+KDMsIHRydWUpO1xuXG5cdFx0dGhpcy5fdHJhbnNmb3JtQ29tcG9uZW50c1swXSA9IHRoaXMuX3Bvcztcblx0XHR0aGlzLl90cmFuc2Zvcm1Db21wb25lbnRzWzFdID0gdGhpcy5fcm90O1xuXHRcdHRoaXMuX3RyYW5zZm9ybUNvbXBvbmVudHNbMl0gPSB0aGlzLl9zY2E7XG5cblx0XHQvL2NyZWF0aW9uIG9mIGFzc29jaWF0ZWQgdHJhbnNmb3JtIG9iamVjdFxuXHRcdHRoaXMuX3RyYW5zZm9ybSA9IG5ldyBUcmFuc2Zvcm0odGhpcyk7XG5cblx0XHR0aGlzLl9tYXRyaXgzRC5pZGVudGl0eSgpO1xuXG5cdFx0dGhpcy5fZmxpcFkuYXBwZW5kU2NhbGUoMSwgLTEsIDEpO1xuXG5cdFx0dGhpcy5fcEJvdW5kcyA9IHRoaXMucENyZWF0ZURlZmF1bHRCb3VuZGluZ1ZvbHVtZSgpO1xuXG5cdFx0dGhpcy5fd29ybGRCb3VuZHMgPSB0aGlzLnBDcmVhdGVEZWZhdWx0Qm91bmRpbmdWb2x1bWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uKVxuXHR7XG5cdFx0c3VwZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG5cblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgRGlzcGxheU9iamVjdEV2ZW50LlBPU0lUSU9OX0NIQU5HRUQ6XG5cdFx0XHRcdHRoaXMuX2xpc3RlblRvUG9zaXRpb25DaGFuZ2VkID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIERpc3BsYXlPYmplY3RFdmVudC5ST1RBVElPTl9DSEFOR0VEOlxuXHRcdFx0XHR0aGlzLl9saXN0ZW5Ub1JvdGF0aW9uQ2hhbmdlZCA9IHRydWU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBEaXNwbGF5T2JqZWN0RXZlbnQuU0NBTEVfQ0hBTkdFRDpcblx0XHRcdFx0dGhpcy5fbGlzdGVuVG9TY2FsZUNoYW5nZWQgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHZhciBjbG9uZTpEaXNwbGF5T2JqZWN0ID0gbmV3IERpc3BsYXlPYmplY3QoKTtcblx0XHRjbG9uZS5waXZvdCA9IHRoaXMucGl2b3Q7XG5cdFx0Y2xvbmUuX2lNYXRyaXgzRCA9IHRoaXMuX2lNYXRyaXgzRDtcblx0XHRjbG9uZS5uYW1lID0gbmFtZTtcblxuXHRcdC8vIHRvZG86IGltcGxlbWVudCBmb3IgYWxsIHN1YnR5cGVzXG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHRpZiAodGhpcy5wYXJlbnQpXG5cdFx0XHR0aGlzLnBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTtcblxuXHRcdHdoaWxlICh0aGlzLl9wUmVuZGVyYWJsZXMubGVuZ3RoKVxuXHRcdFx0dGhpcy5fcFJlbmRlcmFibGVzWzBdLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIGRpc3Bvc2VBc3NldCgpXG5cdHtcblx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgcmVjdGFuZ2xlIHRoYXQgZGVmaW5lcyB0aGUgYXJlYSBvZiB0aGUgZGlzcGxheSBvYmplY3QgcmVsYXRpdmVcblx0ICogdG8gdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mIHRoZSA8Y29kZT50YXJnZXRDb29yZGluYXRlU3BhY2U8L2NvZGU+IG9iamVjdC5cblx0ICogQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBjb2RlLCB3aGljaCBzaG93cyBob3cgdGhlIHJlY3RhbmdsZSByZXR1cm5lZCBjYW5cblx0ICogdmFyeSBkZXBlbmRpbmcgb24gdGhlIDxjb2RlPnRhcmdldENvb3JkaW5hdGVTcGFjZTwvY29kZT4gcGFyYW1ldGVyIHRoYXRcblx0ICogeW91IHBhc3MgdG8gdGhlIG1ldGhvZDpcblx0ICpcblx0ICogPHA+PGI+Tm90ZTo8L2I+IFVzZSB0aGUgPGNvZGU+bG9jYWxUb0dsb2JhbCgpPC9jb2RlPiBhbmRcblx0ICogPGNvZGU+Z2xvYmFsVG9Mb2NhbCgpPC9jb2RlPiBtZXRob2RzIHRvIGNvbnZlcnQgdGhlIGRpc3BsYXkgb2JqZWN0J3MgbG9jYWxcblx0ICogY29vcmRpbmF0ZXMgdG8gZGlzcGxheSBjb29yZGluYXRlcywgb3IgZGlzcGxheSBjb29yZGluYXRlcyB0byBsb2NhbFxuXHQgKiBjb29yZGluYXRlcywgcmVzcGVjdGl2ZWx5LjwvcD5cblx0ICpcblx0ICogPHA+VGhlIDxjb2RlPmdldEJvdW5kcygpPC9jb2RlPiBtZXRob2QgaXMgc2ltaWxhciB0byB0aGVcblx0ICogPGNvZGU+Z2V0UmVjdCgpPC9jb2RlPiBtZXRob2Q7IGhvd2V2ZXIsIHRoZSBSZWN0YW5nbGUgcmV0dXJuZWQgYnkgdGhlXG5cdCAqIDxjb2RlPmdldEJvdW5kcygpPC9jb2RlPiBtZXRob2QgaW5jbHVkZXMgYW55IHN0cm9rZXMgb24gc2hhcGVzLCB3aGVyZWFzXG5cdCAqIHRoZSBSZWN0YW5nbGUgcmV0dXJuZWQgYnkgdGhlIDxjb2RlPmdldFJlY3QoKTwvY29kZT4gbWV0aG9kIGRvZXMgbm90LiBGb3Jcblx0ICogYW4gZXhhbXBsZSwgc2VlIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgPGNvZGU+Z2V0UmVjdCgpPC9jb2RlPiBtZXRob2QuPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFyZ2V0Q29vcmRpbmF0ZVNwYWNlIFRoZSBkaXNwbGF5IG9iamVjdCB0aGF0IGRlZmluZXMgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gdXNlLlxuXHQgKiBAcmV0dXJuIFRoZSByZWN0YW5nbGUgdGhhdCBkZWZpbmVzIHRoZSBhcmVhIG9mIHRoZSBkaXNwbGF5IG9iamVjdCByZWxhdGl2ZVxuXHQgKiAgICAgICAgIHRvIHRoZSA8Y29kZT50YXJnZXRDb29yZGluYXRlU3BhY2U8L2NvZGU+IG9iamVjdCdzIGNvb3JkaW5hdGVcblx0ICogICAgICAgICBzeXN0ZW0uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Qm91bmRzKHRhcmdldENvb3JkaW5hdGVTcGFjZTpEaXNwbGF5T2JqZWN0KTpSZWN0YW5nbGVcblx0e1xuXHRcdHJldHVybiB0aGlzLl9ib3VuZHM7IC8vVE9ET1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSByZWN0YW5nbGUgdGhhdCBkZWZpbmVzIHRoZSBib3VuZGFyeSBvZiB0aGUgZGlzcGxheSBvYmplY3QsIGJhc2VkXG5cdCAqIG9uIHRoZSBjb29yZGluYXRlIHN5c3RlbSBkZWZpbmVkIGJ5IHRoZSA8Y29kZT50YXJnZXRDb29yZGluYXRlU3BhY2U8L2NvZGU+XG5cdCAqIHBhcmFtZXRlciwgZXhjbHVkaW5nIGFueSBzdHJva2VzIG9uIHNoYXBlcy4gVGhlIHZhbHVlcyB0aGF0IHRoZVxuXHQgKiA8Y29kZT5nZXRSZWN0KCk8L2NvZGU+IG1ldGhvZCByZXR1cm5zIGFyZSB0aGUgc2FtZSBvciBzbWFsbGVyIHRoYW4gdGhvc2Vcblx0ICogcmV0dXJuZWQgYnkgdGhlIDxjb2RlPmdldEJvdW5kcygpPC9jb2RlPiBtZXRob2QuXG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU6PC9iPiBVc2UgPGNvZGU+bG9jYWxUb0dsb2JhbCgpPC9jb2RlPiBhbmRcblx0ICogPGNvZGU+Z2xvYmFsVG9Mb2NhbCgpPC9jb2RlPiBtZXRob2RzIHRvIGNvbnZlcnQgdGhlIGRpc3BsYXkgb2JqZWN0J3MgbG9jYWxcblx0ICogY29vcmRpbmF0ZXMgdG8gU3RhZ2UgY29vcmRpbmF0ZXMsIG9yIFN0YWdlIGNvb3JkaW5hdGVzIHRvIGxvY2FsXG5cdCAqIGNvb3JkaW5hdGVzLCByZXNwZWN0aXZlbHkuPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFyZ2V0Q29vcmRpbmF0ZVNwYWNlIFRoZSBkaXNwbGF5IG9iamVjdCB0aGF0IGRlZmluZXMgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZSBzeXN0ZW0gdG8gdXNlLlxuXHQgKiBAcmV0dXJuIFRoZSByZWN0YW5nbGUgdGhhdCBkZWZpbmVzIHRoZSBhcmVhIG9mIHRoZSBkaXNwbGF5IG9iamVjdCByZWxhdGl2ZVxuXHQgKiAgICAgICAgIHRvIHRoZSA8Y29kZT50YXJnZXRDb29yZGluYXRlU3BhY2U8L2NvZGU+IG9iamVjdCdzIGNvb3JkaW5hdGVcblx0ICogICAgICAgICBzeXN0ZW0uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UmVjdCh0YXJnZXRDb29yZGluYXRlU3BhY2U6RGlzcGxheU9iamVjdCk6UmVjdGFuZ2xlXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYm91bmRzOyAvL1RPRE9cblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgPGNvZGU+cG9pbnQ8L2NvZGU+IG9iamVjdCBmcm9tIHRoZSBTdGFnZShnbG9iYWwpIGNvb3JkaW5hdGVzXG5cdCAqIHRvIHRoZSBkaXNwbGF5IG9iamVjdCdzKGxvY2FsKSBjb29yZGluYXRlcy5cblx0ICpcblx0ICogPHA+VG8gdXNlIHRoaXMgbWV0aG9kLCBmaXJzdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFBvaW50IGNsYXNzLiBUaGVcblx0ICogPGk+eDwvaT4gYW5kIDxpPnk8L2k+IHZhbHVlcyB0aGF0IHlvdSBhc3NpZ24gcmVwcmVzZW50IGdsb2JhbCBjb29yZGluYXRlc1xuXHQgKiBiZWNhdXNlIHRoZXkgcmVsYXRlIHRvIHRoZSBvcmlnaW4oMCwwKSBvZiB0aGUgbWFpbiBkaXNwbGF5IGFyZWEuIFRoZW5cblx0ICogcGFzcyB0aGUgUG9pbnQgaW5zdGFuY2UgYXMgdGhlIHBhcmFtZXRlciB0byB0aGVcblx0ICogPGNvZGU+Z2xvYmFsVG9Mb2NhbCgpPC9jb2RlPiBtZXRob2QuIFRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBQb2ludCBvYmplY3Rcblx0ICogd2l0aCA8aT54PC9pPiBhbmQgPGk+eTwvaT4gdmFsdWVzIHRoYXQgcmVsYXRlIHRvIHRoZSBvcmlnaW4gb2YgdGhlIGRpc3BsYXlcblx0ICogb2JqZWN0IGluc3RlYWQgb2YgdGhlIG9yaWdpbiBvZiB0aGUgU3RhZ2UuPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gcG9pbnQgQW4gb2JqZWN0IGNyZWF0ZWQgd2l0aCB0aGUgUG9pbnQgY2xhc3MuIFRoZSBQb2ludCBvYmplY3Rcblx0ICogICAgICAgICAgICAgIHNwZWNpZmllcyB0aGUgPGk+eDwvaT4gYW5kIDxpPnk8L2k+IGNvb3JkaW5hdGVzIGFzXG5cdCAqICAgICAgICAgICAgICBwcm9wZXJ0aWVzLlxuXHQgKiBAcmV0dXJuIEEgUG9pbnQgb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgcmVsYXRpdmUgdG8gdGhlIGRpc3BsYXkgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGdsb2JhbFRvTG9jYWwocG9pbnQ6UG9pbnQpOlBvaW50XG5cdHtcblx0XHRyZXR1cm4gcG9pbnQ7IC8vVE9ET1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgdHdvLWRpbWVuc2lvbmFsIHBvaW50IGZyb20gdGhlIFN0YWdlKGdsb2JhbCkgY29vcmRpbmF0ZXMgdG8gYVxuXHQgKiB0aHJlZS1kaW1lbnNpb25hbCBkaXNwbGF5IG9iamVjdCdzKGxvY2FsKSBjb29yZGluYXRlcy5cblx0ICpcblx0ICogPHA+VG8gdXNlIHRoaXMgbWV0aG9kLCBmaXJzdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFBvaW50IGNsYXNzLiBUaGUgeFxuXHQgKiBhbmQgeSB2YWx1ZXMgdGhhdCB5b3UgYXNzaWduIHRvIHRoZSBQb2ludCBvYmplY3QgcmVwcmVzZW50IGdsb2JhbFxuXHQgKiBjb29yZGluYXRlcyBiZWNhdXNlIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4oMCwwKSBvZiB0aGUgbWFpblxuXHQgKiBkaXNwbGF5IGFyZWEuIFRoZW4gcGFzcyB0aGUgUG9pbnQgb2JqZWN0IHRvIHRoZVxuXHQgKiA8Y29kZT5nbG9iYWxUb0xvY2FsM0QoKTwvY29kZT4gbWV0aG9kIGFzIHRoZSA8Y29kZT5wb2ludDwvY29kZT4gcGFyYW1ldGVyLlxuXHQgKiBUaGUgbWV0aG9kIHJldHVybnMgdGhyZWUtZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMgYXMgYSBWZWN0b3IzRCBvYmplY3Rcblx0ICogY29udGFpbmluZyA8Y29kZT54PC9jb2RlPiwgPGNvZGU+eTwvY29kZT4sIGFuZCA8Y29kZT56PC9jb2RlPiB2YWx1ZXMgdGhhdFxuXHQgKiBhcmUgcmVsYXRpdmUgdG8gdGhlIG9yaWdpbiBvZiB0aGUgdGhyZWUtZGltZW5zaW9uYWwgZGlzcGxheSBvYmplY3QuPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gcG9pbnQgQSB0d28gZGltZW5zaW9uYWwgUG9pbnQgb2JqZWN0IHJlcHJlc2VudGluZyBnbG9iYWwgeCBhbmQgeVxuXHQgKiAgICAgICAgICAgICAgY29vcmRpbmF0ZXMuXG5cdCAqIEByZXR1cm4gQSBWZWN0b3IzRCBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGVcblx0ICogICAgICAgICB0aHJlZS1kaW1lbnNpb25hbCBkaXNwbGF5IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBnbG9iYWxUb0xvY2FsM0QocG9pbnQ6UG9pbnQpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gbmV3IFZlY3RvcjNEKCk7IC8vVE9ET1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlcyB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSBkaXNwbGF5IG9iamVjdCB0byBzZWUgaWYgaXQgb3ZlcmxhcHMgb3Jcblx0ICogaW50ZXJzZWN0cyB3aXRoIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIDxjb2RlPm9iajwvY29kZT4gZGlzcGxheSBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBvYmogVGhlIGRpc3BsYXkgb2JqZWN0IHRvIHRlc3QgYWdhaW5zdC5cblx0ICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYm91bmRpbmcgYm94ZXMgb2YgdGhlIGRpc3BsYXkgb2JqZWN0c1xuXHQgKiAgICAgICAgIGludGVyc2VjdDsgPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIG5vdC5cblx0ICovXG5cdHB1YmxpYyBoaXRUZXN0T2JqZWN0KG9iajpEaXNwbGF5T2JqZWN0KTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gZmFsc2U7IC8vVE9ET1xuXHR9XG5cblx0LyoqXG5cdCAqIEV2YWx1YXRlcyB0aGUgZGlzcGxheSBvYmplY3QgdG8gc2VlIGlmIGl0IG92ZXJsYXBzIG9yIGludGVyc2VjdHMgd2l0aCB0aGVcblx0ICogcG9pbnQgc3BlY2lmaWVkIGJ5IHRoZSA8Y29kZT54PC9jb2RlPiBhbmQgPGNvZGU+eTwvY29kZT4gcGFyYW1ldGVycy4gVGhlXG5cdCAqIDxjb2RlPng8L2NvZGU+IGFuZCA8Y29kZT55PC9jb2RlPiBwYXJhbWV0ZXJzIHNwZWNpZnkgYSBwb2ludCBpbiB0aGVcblx0ICogY29vcmRpbmF0ZSBzcGFjZSBvZiB0aGUgU3RhZ2UsIG5vdCB0aGUgZGlzcGxheSBvYmplY3QgY29udGFpbmVyIHRoYXRcblx0ICogY29udGFpbnMgdGhlIGRpc3BsYXkgb2JqZWN0KHVubGVzcyB0aGF0IGRpc3BsYXkgb2JqZWN0IGNvbnRhaW5lciBpcyB0aGVcblx0ICogU3RhZ2UpLlxuXHQgKlxuXHQgKiBAcGFyYW0geCAgICAgICAgIFRoZSA8aT54PC9pPiBjb29yZGluYXRlIHRvIHRlc3QgYWdhaW5zdCB0aGlzIG9iamVjdC5cblx0ICogQHBhcmFtIHkgICAgICAgICBUaGUgPGk+eTwvaT4gY29vcmRpbmF0ZSB0byB0ZXN0IGFnYWluc3QgdGhpcyBvYmplY3QuXG5cdCAqIEBwYXJhbSBzaGFwZUZsYWcgV2hldGhlciB0byBjaGVjayBhZ2FpbnN0IHRoZSBhY3R1YWwgcGl4ZWxzIG9mIHRoZSBvYmplY3Rcblx0ICogICAgICAgICAgICAgICAgICg8Y29kZT50cnVlPC9jb2RlPikgb3IgdGhlIGJvdW5kaW5nIGJveFxuXHQgKiAgICAgICAgICAgICAgICAgKDxjb2RlPmZhbHNlPC9jb2RlPikuXG5cdCAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGRpc3BsYXkgb2JqZWN0IG92ZXJsYXBzIG9yIGludGVyc2VjdHNcblx0ICogICAgICAgICB3aXRoIHRoZSBzcGVjaWZpZWQgcG9pbnQ7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGl0VGVzdFBvaW50KHg6bnVtYmVyLCB5Om51bWJlciwgc2hhcGVGbGFnOmJvb2xlYW4gPSBmYWxzZSk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIGZhbHNlOyAvL1RPRE9cblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIGlzSW50ZXJzZWN0aW5nUmF5KHJheVBvc2l0aW9uOlZlY3RvcjNELCByYXlEaXJlY3Rpb246VmVjdG9yM0QpOmJvb2xlYW5cblx0e1xuXHRcdHZhciBsb2NhbFJheVBvc2l0aW9uOlZlY3RvcjNEID0gdGhpcy5pbnZlcnNlU2NlbmVUcmFuc2Zvcm0udHJhbnNmb3JtVmVjdG9yKHJheVBvc2l0aW9uKTtcblx0XHR2YXIgbG9jYWxSYXlEaXJlY3Rpb246VmVjdG9yM0QgPSB0aGlzLmludmVyc2VTY2VuZVRyYW5zZm9ybS5kZWx0YVRyYW5zZm9ybVZlY3RvcihyYXlEaXJlY3Rpb24pO1xuXHRcdHZhciBwaWNraW5nQ29sbGlzaW9uVk86UGlja2luZ0NvbGxpc2lvblZPID0gdGhpcy5faVBpY2tpbmdDb2xsaXNpb25WTztcblxuXHRcdGlmICghcGlja2luZ0NvbGxpc2lvblZPLmxvY2FsTm9ybWFsKVxuXHRcdFx0cGlja2luZ0NvbGxpc2lvblZPLmxvY2FsTm9ybWFsID0gbmV3IFZlY3RvcjNEKCk7XG5cblx0XHR2YXIgcmF5RW50cnlEaXN0YW5jZTpudW1iZXIgPSB0aGlzLmJvdW5kcy5yYXlJbnRlcnNlY3Rpb24obG9jYWxSYXlQb3NpdGlvbiwgbG9jYWxSYXlEaXJlY3Rpb24sIHBpY2tpbmdDb2xsaXNpb25WTy5sb2NhbE5vcm1hbCk7XG5cblx0XHRpZiAocmF5RW50cnlEaXN0YW5jZSA8IDApXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRwaWNraW5nQ29sbGlzaW9uVk8ucmF5RW50cnlEaXN0YW5jZSA9IHJheUVudHJ5RGlzdGFuY2U7XG5cdFx0cGlja2luZ0NvbGxpc2lvblZPLmxvY2FsUmF5UG9zaXRpb24gPSBsb2NhbFJheVBvc2l0aW9uO1xuXHRcdHBpY2tpbmdDb2xsaXNpb25WTy5sb2NhbFJheURpcmVjdGlvbiA9IGxvY2FsUmF5RGlyZWN0aW9uO1xuXHRcdHBpY2tpbmdDb2xsaXNpb25WTy5yYXlQb3NpdGlvbiA9IHJheVBvc2l0aW9uO1xuXHRcdHBpY2tpbmdDb2xsaXNpb25WTy5yYXlEaXJlY3Rpb24gPSByYXlEaXJlY3Rpb247XG5cdFx0cGlja2luZ0NvbGxpc2lvblZPLnJheU9yaWdpbklzSW5zaWRlQm91bmRzID0gcmF5RW50cnlEaXN0YW5jZSA9PSAwO1xuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYSB0aHJlZS1kaW1lbnNpb25hbCBwb2ludCBvZiB0aGUgdGhyZWUtZGltZW5zaW9uYWwgZGlzcGxheVxuXHQgKiBvYmplY3Qncyhsb2NhbCkgY29vcmRpbmF0ZXMgdG8gYSB0d28tZGltZW5zaW9uYWwgcG9pbnQgaW4gdGhlIFN0YWdlXG5cdCAqIChnbG9iYWwpIGNvb3JkaW5hdGVzLlxuXHQgKlxuXHQgKiA8cD5Gb3IgZXhhbXBsZSwgeW91IGNhbiBvbmx5IHVzZSB0d28tZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMoeCx5KSB0byBkcmF3XG5cdCAqIHdpdGggdGhlIDxjb2RlPmRpc3BsYXkuR3JhcGhpY3M8L2NvZGU+IG1ldGhvZHMuIFRvIGRyYXcgYVxuXHQgKiB0aHJlZS1kaW1lbnNpb25hbCBvYmplY3QsIHlvdSBuZWVkIHRvIG1hcCB0aGUgdGhyZWUtZGltZW5zaW9uYWxcblx0ICogY29vcmRpbmF0ZXMgb2YgYSBkaXNwbGF5IG9iamVjdCB0byB0d28tZGltZW5zaW9uYWwgY29vcmRpbmF0ZXMuIEZpcnN0LFxuXHQgKiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIFZlY3RvcjNEIGNsYXNzIHRoYXQgaG9sZHMgdGhlIHgtLCB5LSwgYW5kIHotXG5cdCAqIGNvb3JkaW5hdGVzIG9mIHRoZSB0aHJlZS1kaW1lbnNpb25hbCBkaXNwbGF5IG9iamVjdC4gVGhlbiBwYXNzIHRoZVxuXHQgKiBWZWN0b3IzRCBvYmplY3QgdG8gdGhlIDxjb2RlPmxvY2FsM0RUb0dsb2JhbCgpPC9jb2RlPiBtZXRob2QgYXMgdGhlXG5cdCAqIDxjb2RlPnBvaW50M2Q8L2NvZGU+IHBhcmFtZXRlci4gVGhlIG1ldGhvZCByZXR1cm5zIGEgdHdvLWRpbWVuc2lvbmFsIFBvaW50XG5cdCAqIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIEdyYXBoaWNzIEFQSSB0byBkcmF3IHRoZVxuXHQgKiB0aHJlZS1kaW1lbnNpb25hbCBvYmplY3QuPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gcG9pbnQzZCBBIFZlY3RvcjNEIG9iamVjdCBjb250YWluaW5nIGVpdGhlciBhIHRocmVlLWRpbWVuc2lvbmFsXG5cdCAqICAgICAgICAgICAgICAgIHBvaW50IG9yIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgdGhyZWUtZGltZW5zaW9uYWwgZGlzcGxheVxuXHQgKiAgICAgICAgICAgICAgICBvYmplY3QuXG5cdCAqIEByZXR1cm4gQSB0d28tZGltZW5zaW9uYWwgcG9pbnQgcmVwcmVzZW50aW5nIGEgdGhyZWUtZGltZW5zaW9uYWwgcG9pbnQgaW5cblx0ICogICAgICAgICB0d28tZGltZW5zaW9uYWwgc3BhY2UuXG5cdCAqL1xuXHRwdWJsaWMgbG9jYWwzRFRvR2xvYmFsKHBvaW50M2Q6VmVjdG9yM0QpOlBvaW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IFBvaW50KCk7IC8vVE9ET1xuXHR9XG5cblx0LyoqXG5cdCAqIFJvdGF0ZXMgdGhlIDNkIG9iamVjdCBhcm91bmQgdG8gZmFjZSBhIHBvaW50IGRlZmluZWQgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIGNvb3JkaW5hdGVzIG9mIHRoZSBwYXJlbnQgPGNvZGU+T2JqZWN0Q29udGFpbmVyM0Q8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0gICAgdGFyZ2V0ICAgICAgICBUaGUgdmVjdG9yIGRlZmluaW5nIHRoZSBwb2ludCB0byBiZSBsb29rZWQgYXRcblx0ICogQHBhcmFtICAgIHVwQXhpcyAgICAgICAgQW4gb3B0aW9uYWwgdmVjdG9yIHVzZWQgdG8gZGVmaW5lIHRoZSBkZXNpcmVkIHVwIG9yaWVudGF0aW9uIG9mIHRoZSAzZCBvYmplY3QgYWZ0ZXIgcm90YXRpb24gaGFzIG9jY3VycmVkXG5cdCAqL1xuXHRwdWJsaWMgbG9va0F0KHRhcmdldDpWZWN0b3IzRCwgdXBBeGlzOlZlY3RvcjNEID0gbnVsbClcblx0e1xuXG5cdFx0dmFyIHlBeGlzOlZlY3RvcjNEO1xuXHRcdHZhciB6QXhpczpWZWN0b3IzRDtcblx0XHR2YXIgeEF4aXM6VmVjdG9yM0Q7XG5cdFx0dmFyIHJhdzpBcnJheTxudW1iZXI+O1xuXG5cdFx0aWYgKHVwQXhpcyA9PSBudWxsKVxuXHRcdFx0dXBBeGlzID0gVmVjdG9yM0QuWV9BWElTO1xuXHRcdGVsc2Vcblx0XHRcdHVwQXhpcy5ub3JtYWxpemUoKTtcblxuXHRcdHpBeGlzID0gdGFyZ2V0LnN1YnRyYWN0KHRoaXMuX2lNYXRyaXgzRC5wb3NpdGlvbik7XG5cdFx0ekF4aXMubm9ybWFsaXplKCk7XG5cblx0XHR4QXhpcyA9IHVwQXhpcy5jcm9zc1Byb2R1Y3QoekF4aXMpO1xuXHRcdHhBeGlzLm5vcm1hbGl6ZSgpO1xuXG5cdFx0aWYgKHhBeGlzLmxlbmd0aCA8IDAuMDUpIHtcblx0XHRcdHhBeGlzLnggPSB1cEF4aXMueTtcblx0XHRcdHhBeGlzLnkgPSB1cEF4aXMueDtcblx0XHRcdHhBeGlzLnogPSAwO1xuXHRcdFx0eEF4aXMubm9ybWFsaXplKCk7XG5cdFx0fVxuXG5cdFx0eUF4aXMgPSB6QXhpcy5jcm9zc1Byb2R1Y3QoeEF4aXMpO1xuXG5cdFx0cmF3ID0gTWF0cml4M0RVdGlscy5SQVdfREFUQV9DT05UQUlORVI7XG5cblx0XHRyYXdbMF0gPSB4QXhpcy54O1xuXHRcdHJhd1sxXSA9IHhBeGlzLnk7XG5cdFx0cmF3WzJdID0geEF4aXMuejtcblx0XHRyYXdbM10gPSAwO1xuXG5cdFx0cmF3WzRdID0geUF4aXMueDtcblx0XHRyYXdbNV0gPSB5QXhpcy55O1xuXHRcdHJhd1s2XSA9IHlBeGlzLno7XG5cdFx0cmF3WzddID0gMDtcblxuXHRcdHJhd1s4XSA9IHpBeGlzLng7XG5cdFx0cmF3WzldID0gekF4aXMueTtcblx0XHRyYXdbMTBdID0gekF4aXMuejtcblx0XHRyYXdbMTFdID0gMDtcblxuXHRcdHZhciBtOk1hdHJpeDNEID0gbmV3IE1hdHJpeDNEKCk7XG5cdFx0bS5jb3B5UmF3RGF0YUZyb20ocmF3KTtcblxuXHRcdHZhciB2ZWM6VmVjdG9yM0QgPSBtLmRlY29tcG9zZSgpWzFdO1xuXG5cdFx0dGhpcy5fcm90YXRpb25YID0gdmVjLng7XG5cdFx0dGhpcy5fcm90YXRpb25ZID0gdmVjLnk7XG5cdFx0dGhpcy5fcm90YXRpb25aID0gdmVjLno7XG5cblx0XHR0aGlzLmludmFsaWRhdGVSb3RhdGlvbigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSA8Y29kZT5wb2ludDwvY29kZT4gb2JqZWN0IGZyb20gdGhlIGRpc3BsYXkgb2JqZWN0J3MobG9jYWwpXG5cdCAqIGNvb3JkaW5hdGVzIHRvIHRoZSBTdGFnZShnbG9iYWwpIGNvb3JkaW5hdGVzLlxuXHQgKlxuXHQgKiA8cD5UaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIGNvbnZlcnQgYW55IGdpdmVuIDxpPng8L2k+IGFuZCA8aT55PC9pPlxuXHQgKiBjb29yZGluYXRlcyBmcm9tIHZhbHVlcyB0aGF0IGFyZSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luKDAsMCkgb2YgYVxuXHQgKiBzcGVjaWZpYyBkaXNwbGF5IG9iamVjdChsb2NhbCBjb29yZGluYXRlcykgdG8gdmFsdWVzIHRoYXQgYXJlIHJlbGF0aXZlIHRvXG5cdCAqIHRoZSBvcmlnaW4gb2YgdGhlIFN0YWdlKGdsb2JhbCBjb29yZGluYXRlcykuPC9wPlxuXHQgKlxuXHQgKiA8cD5UbyB1c2UgdGhpcyBtZXRob2QsIGZpcnN0IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgUG9pbnQgY2xhc3MuIFRoZVxuXHQgKiA8aT54PC9pPiBhbmQgPGk+eTwvaT4gdmFsdWVzIHRoYXQgeW91IGFzc2lnbiByZXByZXNlbnQgbG9jYWwgY29vcmRpbmF0ZXNcblx0ICogYmVjYXVzZSB0aGV5IHJlbGF0ZSB0byB0aGUgb3JpZ2luIG9mIHRoZSBkaXNwbGF5IG9iamVjdC48L3A+XG5cdCAqXG5cdCAqIDxwPllvdSB0aGVuIHBhc3MgdGhlIFBvaW50IGluc3RhbmNlIHRoYXQgeW91IGNyZWF0ZWQgYXMgdGhlIHBhcmFtZXRlciB0b1xuXHQgKiB0aGUgPGNvZGU+bG9jYWxUb0dsb2JhbCgpPC9jb2RlPiBtZXRob2QuIFRoZSBtZXRob2QgcmV0dXJucyBhIG5ldyBQb2ludFxuXHQgKiBvYmplY3Qgd2l0aCA8aT54PC9pPiBhbmQgPGk+eTwvaT4gdmFsdWVzIHRoYXQgcmVsYXRlIHRvIHRoZSBvcmlnaW4gb2YgdGhlXG5cdCAqIFN0YWdlIGluc3RlYWQgb2YgdGhlIG9yaWdpbiBvZiB0aGUgZGlzcGxheSBvYmplY3QuPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gcG9pbnQgVGhlIG5hbWUgb3IgaWRlbnRpZmllciBvZiBhIHBvaW50IGNyZWF0ZWQgd2l0aCB0aGUgUG9pbnRcblx0ICogICAgICAgICAgICAgIGNsYXNzLCBzcGVjaWZ5aW5nIHRoZSA8aT54PC9pPiBhbmQgPGk+eTwvaT4gY29vcmRpbmF0ZXMgYXNcblx0ICogICAgICAgICAgICAgIHByb3BlcnRpZXMuXG5cdCAqIEByZXR1cm4gQSBQb2ludCBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgU3RhZ2UuXG5cdCAqL1xuXHRwdWJsaWMgbG9jYWxUb0dsb2JhbChwb2ludDpQb2ludCk6UG9pbnRcblx0e1xuXHRcdHJldHVybiBuZXcgUG9pbnQoKTsgLy9UT0RPXG5cdH1cblxuXHQvKipcblx0ICogTW92ZXMgdGhlIDNkIG9iamVjdCBkaXJlY3RseSB0byBhIHBvaW50IGluIHNwYWNlXG5cdCAqXG5cdCAqIEBwYXJhbSAgICBkeCAgICAgICAgVGhlIGFtb3VudCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgbG9jYWwgeCBheGlzLlxuXHQgKiBAcGFyYW0gICAgZHkgICAgICAgIFRoZSBhbW91bnQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGxvY2FsIHkgYXhpcy5cblx0ICogQHBhcmFtICAgIGR6ICAgICAgICBUaGUgYW1vdW50IG9mIG1vdmVtZW50IGFsb25nIHRoZSBsb2NhbCB6IGF4aXMuXG5cdCAqL1xuXG5cdHB1YmxpYyBtb3ZlVG8oZHg6bnVtYmVyLCBkeTpudW1iZXIsIGR6Om51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl94ID09IGR4ICYmIHRoaXMuX3kgPT0gZHkgJiYgdGhpcy5feiA9PSBkeilcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3ggPSBkeDtcblx0XHR0aGlzLl95ID0gZHk7XG5cdFx0dGhpcy5feiA9IGR6O1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlUG9zaXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb3ZlcyB0aGUgbG9jYWwgcG9pbnQgYXJvdW5kIHdoaWNoIHRoZSBvYmplY3Qgcm90YXRlcy5cblx0ICpcblx0ICogQHBhcmFtICAgIGR4ICAgICAgICBUaGUgYW1vdW50IG9mIG1vdmVtZW50IGFsb25nIHRoZSBsb2NhbCB4IGF4aXMuXG5cdCAqIEBwYXJhbSAgICBkeSAgICAgICAgVGhlIGFtb3VudCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgbG9jYWwgeSBheGlzLlxuXHQgKiBAcGFyYW0gICAgZHogICAgICAgIFRoZSBhbW91bnQgb2YgbW92ZW1lbnQgYWxvbmcgdGhlIGxvY2FsIHogYXhpcy5cblx0ICovXG5cdHB1YmxpYyBtb3ZlUGl2b3QoZHg6bnVtYmVyLCBkeTpudW1iZXIsIGR6Om51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9waXZvdCA9PSBudWxsKVxuXHRcdFx0dGhpcy5fcGl2b3QgPSBuZXcgVmVjdG9yM0QoKTtcblxuXHRcdHRoaXMuX3Bpdm90LnggKz0gZHg7XG5cdFx0dGhpcy5fcGl2b3QueSArPSBkeTtcblx0XHR0aGlzLl9waXZvdC56ICs9IGR6O1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlUGl2b3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSb3RhdGVzIHRoZSAzZCBvYmplY3QgYXJvdW5kIGl0J3MgbG9jYWwgeC1heGlzXG5cdCAqXG5cdCAqIEBwYXJhbSAgICBhbmdsZSAgICAgICAgVGhlIGFtb3VudCBvZiByb3RhdGlvbiBpbiBkZWdyZWVzXG5cdCAqL1xuXHRwdWJsaWMgcGl0Y2goYW5nbGU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5yb3RhdGUoVmVjdG9yM0QuWF9BWElTLCBhbmdsZSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXRSZW5kZXJTY2VuZVRyYW5zZm9ybShjYW1lcmE6Q2FtZXJhKTpNYXRyaXgzRFxuXHR7XG5cdFx0aWYgKHRoaXMub3JpZW50YXRpb25Nb2RlID09IE9yaWVudGF0aW9uTW9kZS5DQU1FUkFfUExBTkUpIHtcblx0XHRcdHZhciBjb21wczpBcnJheTxWZWN0b3IzRD4gPSBjYW1lcmEuc2NlbmVUcmFuc2Zvcm0uZGVjb21wb3NlKCk7XG5cdFx0XHR2YXIgc2NhbGU6VmVjdG9yM0QgPSBjb21wc1syXTtcblx0XHRcdGNvbXBzWzBdID0gdGhpcy5zY2VuZVBvc2l0aW9uO1xuXHRcdFx0c2NhbGUueCA9IHRoaXMuX3BTY2FsZVg7XG5cdFx0XHRzY2FsZS55ID0gdGhpcy5fcFNjYWxlWTtcblx0XHRcdHNjYWxlLnogPSB0aGlzLl9wU2NhbGVaO1xuXHRcdFx0dGhpcy5fb3JpZW50YXRpb25NYXRyaXgucmVjb21wb3NlKGNvbXBzKTtcblxuXHRcdFx0Ly9hZGQgaW4gY2FzZSBvZiBwaXZvdFxuXHRcdFx0aWYgKCF0aGlzLl9waXZvdFplcm8gJiYgdGhpcy5hbGlnbm1lbnRNb2RlID09IEFsaWdubWVudE1vZGUuUElWT1RfUE9JTlQpXG5cdFx0XHRcdHRoaXMuX29yaWVudGF0aW9uTWF0cml4LnByZXBlbmRUcmFuc2xhdGlvbigtdGhpcy5fcGl2b3QueC90aGlzLl9wU2NhbGVYLCAtdGhpcy5fcGl2b3QueS90aGlzLl9wU2NhbGVZLCAtdGhpcy5fcGl2b3Quei90aGlzLl9wU2NhbGVaKTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uTWF0cml4O1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnNjZW5lVHJhbnNmb3JtO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJvdGF0ZXMgdGhlIDNkIG9iamVjdCBhcm91bmQgaXQncyBsb2NhbCB6LWF4aXNcblx0ICpcblx0ICogQHBhcmFtICAgIGFuZ2xlICAgICAgICBUaGUgYW1vdW50IG9mIHJvdGF0aW9uIGluIGRlZ3JlZXNcblx0ICovXG5cdHB1YmxpYyByb2xsKGFuZ2xlOm51bWJlcilcblx0e1xuXHRcdHRoaXMucm90YXRlKFZlY3RvcjNELlpfQVhJUywgYW5nbGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJvdGF0ZXMgdGhlIDNkIG9iamVjdCBhcm91bmQgYW4gYXhpcyBieSBhIGRlZmluZWQgYW5nbGVcblx0ICpcblx0ICogQHBhcmFtICAgIGF4aXMgICAgICAgIFRoZSB2ZWN0b3IgZGVmaW5pbmcgdGhlIGF4aXMgb2Ygcm90YXRpb25cblx0ICogQHBhcmFtICAgIGFuZ2xlICAgICAgICBUaGUgYW1vdW50IG9mIHJvdGF0aW9uIGluIGRlZ3JlZXNcblx0ICovXG5cdHB1YmxpYyByb3RhdGUoYXhpczpWZWN0b3IzRCwgYW5nbGU6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIG06TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoKTtcblx0XHRtLnByZXBlbmRSb3RhdGlvbihhbmdsZSwgYXhpcyk7XG5cblx0XHR2YXIgdmVjOlZlY3RvcjNEID0gbS5kZWNvbXBvc2UoKVsxXTtcblxuXHRcdHRoaXMuX3JvdGF0aW9uWCArPSB2ZWMueDtcblx0XHR0aGlzLl9yb3RhdGlvblkgKz0gdmVjLnk7XG5cdFx0dGhpcy5fcm90YXRpb25aICs9IHZlYy56O1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlUm90YXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSb3RhdGVzIHRoZSAzZCBvYmplY3QgZGlyZWN0bHkgdG8gYSBldWxlciBhbmdsZVxuXHQgKlxuXHQgKiBAcGFyYW0gICAgYXggICAgICAgIFRoZSBhbmdsZSBpbiBkZWdyZWVzIG9mIHRoZSByb3RhdGlvbiBhcm91bmQgdGhlIHggYXhpcy5cblx0ICogQHBhcmFtICAgIGF5ICAgICAgICBUaGUgYW5nbGUgaW4gZGVncmVlcyBvZiB0aGUgcm90YXRpb24gYXJvdW5kIHRoZSB5IGF4aXMuXG5cdCAqIEBwYXJhbSAgICBheiAgICAgICAgVGhlIGFuZ2xlIGluIGRlZ3JlZXMgb2YgdGhlIHJvdGF0aW9uIGFyb3VuZCB0aGUgeiBheGlzLlxuXHQgKi9cblx0cHVibGljIHJvdGF0ZVRvKGF4Om51bWJlciwgYXk6bnVtYmVyLCBhejpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9yb3RhdGlvblggPSBheCpNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUztcblx0XHR0aGlzLl9yb3RhdGlvblkgPSBheSpNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUztcblx0XHR0aGlzLl9yb3RhdGlvblogPSBheipNYXRoQ29uc3RzLkRFR1JFRVNfVE9fUkFESUFOUztcblxuXHRcdHRoaXMuaW52YWxpZGF0ZVJvdGF0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbilcblx0e1xuXHRcdHN1cGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xuXG5cdFx0aWYgKHRoaXMuaGFzRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRzd2l0Y2ggKHR5cGUpIHtcblx0XHRcdGNhc2UgRGlzcGxheU9iamVjdEV2ZW50LlBPU0lUSU9OX0NIQU5HRUQ6XG5cdFx0XHRcdHRoaXMuX2xpc3RlblRvUG9zaXRpb25DaGFuZ2VkID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIERpc3BsYXlPYmplY3RFdmVudC5ST1RBVElPTl9DSEFOR0VEOlxuXHRcdFx0XHR0aGlzLl9saXN0ZW5Ub1JvdGF0aW9uQ2hhbmdlZCA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0Y2FzZSBEaXNwbGF5T2JqZWN0RXZlbnQuU0NBTEVfQ0hBTkdFRDpcblx0XHRcdFx0dGhpcy5fbGlzdGVuVG9TY2FsZUNoYW5nZWQgPSBmYWxzZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIE1vdmVzIHRoZSAzZCBvYmplY3QgYWxvbmcgYSB2ZWN0b3IgYnkgYSBkZWZpbmVkIGxlbmd0aFxuXHQgKlxuXHQgKiBAcGFyYW0gICAgYXhpcyAgICAgICAgVGhlIHZlY3RvciBkZWZpbmluZyB0aGUgYXhpcyBvZiBtb3ZlbWVudFxuXHQgKiBAcGFyYW0gICAgZGlzdGFuY2UgICAgVGhlIGxlbmd0aCBvZiB0aGUgbW92ZW1lbnRcblx0ICovXG5cdHB1YmxpYyB0cmFuc2xhdGUoYXhpczpWZWN0b3IzRCwgZGlzdGFuY2U6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIHg6bnVtYmVyID0gYXhpcy54LCB5Om51bWJlciA9IGF4aXMueSwgejpudW1iZXIgPSBheGlzLno7XG5cdFx0dmFyIGxlbjpudW1iZXIgPSBkaXN0YW5jZS9NYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcblxuXHRcdHRoaXMuX3ggKz0geCpsZW47XG5cdFx0dGhpcy5feSArPSB5Kmxlbjtcblx0XHR0aGlzLl96ICs9IHoqbGVuO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlUG9zaXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb3ZlcyB0aGUgM2Qgb2JqZWN0IGFsb25nIGEgdmVjdG9yIGJ5IGEgZGVmaW5lZCBsZW5ndGhcblx0ICpcblx0ICogQHBhcmFtICAgIGF4aXMgICAgICAgIFRoZSB2ZWN0b3IgZGVmaW5pbmcgdGhlIGF4aXMgb2YgbW92ZW1lbnRcblx0ICogQHBhcmFtICAgIGRpc3RhbmNlICAgIFRoZSBsZW5ndGggb2YgdGhlIG1vdmVtZW50XG5cdCAqL1xuXHRwdWJsaWMgdHJhbnNsYXRlTG9jYWwoYXhpczpWZWN0b3IzRCwgZGlzdGFuY2U6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIHg6bnVtYmVyID0gYXhpcy54LCB5Om51bWJlciA9IGF4aXMueSwgejpudW1iZXIgPSBheGlzLno7XG5cdFx0dmFyIGxlbjpudW1iZXIgPSBkaXN0YW5jZS9NYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcblxuXHRcdHRoaXMuX2lNYXRyaXgzRC5wcmVwZW5kVHJhbnNsYXRpb24oeCpsZW4sIHkqbGVuLCB6Kmxlbik7XG5cblx0XHR0aGlzLl9tYXRyaXgzRC5jb3B5Q29sdW1uVG8oMywgdGhpcy5fcG9zKTtcblxuXHRcdHRoaXMuX3ggPSB0aGlzLl9wb3MueDtcblx0XHR0aGlzLl95ID0gdGhpcy5fcG9zLnk7XG5cdFx0dGhpcy5feiA9IHRoaXMuX3Bvcy56O1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlUG9zaXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSb3RhdGVzIHRoZSAzZCBvYmplY3QgYXJvdW5kIGl0J3MgbG9jYWwgeS1heGlzXG5cdCAqXG5cdCAqIEBwYXJhbSAgICBhbmdsZSAgICAgICAgVGhlIGFtb3VudCBvZiByb3RhdGlvbiBpbiBkZWdyZWVzXG5cdCAqL1xuXHRwdWJsaWMgeWF3KGFuZ2xlOm51bWJlcilcblx0e1xuXHRcdHRoaXMucm90YXRlKFZlY3RvcjNELllfQVhJUywgYW5nbGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIF9pQ29udHJvbGxlcjpDb250cm9sbGVyQmFzZTtcblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IF9pQXNzaWduZWRQYXJ0aXRpb24oKTpQYXJ0aXRpb25cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wSW1wbGljaXRQYXJ0aXRpb247XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSAzZCBvYmplY3QsIHJlbGF0aXZlIHRvIHRoZSBsb2NhbCBjb29yZGluYXRlcyBvZiB0aGUgcGFyZW50IDxjb2RlPk9iamVjdENvbnRhaW5lcjNEPC9jb2RlPi5cblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IF9pTWF0cml4M0QoKTpNYXRyaXgzRFxuXHR7XG5cdFx0aWYgKHRoaXMuX21hdHJpeDNERGlydHkpXG5cdFx0XHR0aGlzLl9wVXBkYXRlTWF0cml4M0QoKTtcblxuXHRcdHJldHVybiB0aGlzLl9tYXRyaXgzRDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgX2lNYXRyaXgzRCh2YWw6TWF0cml4M0QpXG5cdHtcblxuXHRcdC8vIFRPRE86IEZyb20gQVMzIC0gRG8gd2Ugc3RpbGwgbmVlZCB0aGlzIGluIEpTID9cblx0XHQvL3JpZGljdWxvdXMgbWF0cml4IGVycm9yXG5cdFx0Lypcblx0XHRpZiAoIXZhbC5yYXdEYXRhWzBdKSB7XG5cblx0XHRcdHZhciByYXc6bnVtYmVyW10gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblx0XHRcdHZhbC5jb3B5UmF3RGF0YVRvKHJhdyk7XG5cdFx0XHRyYXdbMF0gPSB0aGlzLl9zbWFsbGVzdE51bWJlcjtcblx0XHRcdHZhbC5jb3B5UmF3RGF0YUZyb20ocmF3KTtcblx0XHR9XG5cdFx0Ly8qL1xuXHRcdHZhciBlbGVtZW50czpBcnJheTxWZWN0b3IzRD4gPSB2YWwuZGVjb21wb3NlKCk7XG5cdFx0dmFyIHZlYzpWZWN0b3IzRDtcblxuXHRcdHZlYyA9IGVsZW1lbnRzWzBdO1xuXG5cdFx0aWYgKHRoaXMuX3ggIT0gdmVjLnggfHwgdGhpcy5feSAhPSB2ZWMueSB8fCB0aGlzLl96ICE9IHZlYy56KSB7XG5cdFx0XHR0aGlzLl94ID0gdmVjLng7XG5cdFx0XHR0aGlzLl95ID0gdmVjLnk7XG5cdFx0XHR0aGlzLl96ID0gdmVjLno7XG5cblx0XHRcdHRoaXMuaW52YWxpZGF0ZVBvc2l0aW9uKCk7XG5cdFx0fVxuXG5cdFx0dmVjID0gZWxlbWVudHNbMV07XG5cblx0XHRpZiAodGhpcy5fcm90YXRpb25YICE9IHZlYy54IHx8IHRoaXMuX3JvdGF0aW9uWSAhPSB2ZWMueSB8fCB0aGlzLl9yb3RhdGlvblogIT0gdmVjLnopIHtcblx0XHRcdHRoaXMuX3JvdGF0aW9uWCA9IHZlYy54O1xuXHRcdFx0dGhpcy5fcm90YXRpb25ZID0gdmVjLnk7XG5cdFx0XHR0aGlzLl9yb3RhdGlvblogPSB2ZWMuejtcblxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlUm90YXRpb24oKTtcblx0XHR9XG5cblx0XHR2ZWMgPSBlbGVtZW50c1syXTtcblxuXHRcdGlmICh0aGlzLl9wU2NhbGVYICE9IHZlYy54IHx8IHRoaXMuX3BTY2FsZVkgIT0gdmVjLnkgfHwgdGhpcy5fcFNjYWxlWiAhPSB2ZWMueikge1xuXHRcdFx0dGhpcy5fcFNjYWxlWCA9IHZlYy54O1xuXHRcdFx0dGhpcy5fcFNjYWxlWSA9IHZlYy55O1xuXHRcdFx0dGhpcy5fcFNjYWxlWiA9IHZlYy56O1xuXG5cdFx0XHR0aGlzLmludmFsaWRhdGVTY2FsZSgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBnZXQgX2lQaWNraW5nQ29sbGlzaW9uVk8oKTpQaWNraW5nQ29sbGlzaW9uVk9cblx0e1xuXHRcdGlmICghdGhpcy5fcFBpY2tpbmdDb2xsaXNpb25WTylcblx0XHRcdHRoaXMuX3BQaWNraW5nQ29sbGlzaW9uVk8gPSBuZXcgUGlja2luZ0NvbGxpc2lvblZPKHRoaXMpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3BQaWNraW5nQ29sbGlzaW9uVk87XG5cdH1cblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgaVNldFBhcmVudCh2YWx1ZTpEaXNwbGF5T2JqZWN0Q29udGFpbmVyKVxuXHR7XG5cdFx0dGhpcy5fcFBhcmVudCA9IHZhbHVlO1xuXG5cdFx0aWYgKHZhbHVlKSB7XG5cdFx0XHR0aGlzLl9wVXBkYXRlSW1wbGljaXRNb3VzZUVuYWJsZWQodmFsdWUubW91c2VDaGlsZHJlbik7XG5cdFx0XHR0aGlzLl9wVXBkYXRlSW1wbGljaXRWaXNpYmlsaXR5KHZhbHVlLl9pSXNWaXNpYmxlKCkpO1xuXHRcdFx0dGhpcy5fcFVwZGF0ZUltcGxpY2l0UGFydGl0aW9uKHZhbHVlLl9pQXNzaWduZWRQYXJ0aXRpb24pO1xuXHRcdFx0dGhpcy5faVNldFNjZW5lKHZhbHVlLl9wU2NlbmUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9wVXBkYXRlSW1wbGljaXRNb3VzZUVuYWJsZWQodHJ1ZSk7XG5cdFx0XHR0aGlzLl9wVXBkYXRlSW1wbGljaXRWaXNpYmlsaXR5KHRydWUpO1xuXHRcdFx0dGhpcy5fcFVwZGF0ZUltcGxpY2l0UGFydGl0aW9uKG51bGwpO1xuXG5cdFx0XHR0aGlzLl9pU2V0U2NlbmUobnVsbCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBwQ3JlYXRlRGVmYXVsdEJvdW5kaW5nVm9sdW1lKCk6Qm91bmRpbmdWb2x1bWVCYXNlXG5cdHtcblx0XHQvLyBwb2ludCBsaWdodHMgc2hvdWxkIGJlIHVzaW5nIHNwaGVyZSBib3VuZHNcblx0XHQvLyBkaXJlY3Rpb25hbCBsaWdodHMgc2hvdWxkIGJlIHVzaW5nIG51bGwgYm91bmRzXG5cdFx0cmV0dXJuIG5ldyBBeGlzQWxpZ25lZEJvdW5kaW5nQm94KCk7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBDcmVhdGVFbnRpdHlQYXJ0aXRpb25Ob2RlKCk6RW50aXR5Tm9kZVxuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgcEludmFsaWRhdGVCb3VuZHMoKVxuXHR7XG5cdFx0dGhpcy5fcEJvdW5kc0ludmFsaWQgPSB0cnVlO1xuXHRcdHRoaXMuX3dvcmxkQm91bmRzSW52YWxpZCA9IHRydWU7XG5cblxuXHRcdGlmICh0aGlzLmlzRW50aXR5KVxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlUGFydGl0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBJbnZhbGlkYXRlU2NlbmVUcmFuc2Zvcm0oKVxuXHR7XG5cdFx0dGhpcy5fcFNjZW5lVHJhbnNmb3JtRGlydHkgPSAhdGhpcy5fcElnbm9yZVRyYW5zZm9ybTtcblx0XHR0aGlzLl9pbnZlcnNlU2NlbmVUcmFuc2Zvcm1EaXJ0eSA9ICF0aGlzLl9wSWdub3JlVHJhbnNmb3JtO1xuXHRcdHRoaXMuX3NjZW5lUG9zaXRpb25EaXJ0eSA9ICF0aGlzLl9wSWdub3JlVHJhbnNmb3JtO1xuXG5cdFx0dGhpcy5fd29ybGRCb3VuZHNJbnZhbGlkID0gIXRoaXMuX3BJZ25vcmVUcmFuc2Zvcm07XG5cblx0XHRpZiAodGhpcy5pc0VudGl0eSlcblx0XHRcdHRoaXMuaW52YWxpZGF0ZVBhcnRpdGlvbigpO1xuXG5cdFx0aWYgKHRoaXMuX2xpc3RlblRvU2NlbmVUcmFuc2Zvcm1DaGFuZ2VkKVxuXHRcdFx0dGhpcy5ub3RpZnlTY2VuZVRyYW5zZm9ybUNoYW5nZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBwVXBkYXRlQm91bmRzKClcblx0e1xuXHRcdHRoaXMuX3dpZHRoID0gdGhpcy5fcEJvdW5kcy5hYWJiLndpZHRoKnRoaXMuX3BTY2FsZVg7XG5cdFx0dGhpcy5faGVpZ2h0ID0gdGhpcy5fcEJvdW5kcy5hYWJiLmhlaWdodCp0aGlzLl9wU2NhbGVZO1xuXHRcdHRoaXMuX2RlcHRoID0gdGhpcy5fcEJvdW5kcy5hYWJiLmRlcHRoKnRoaXMuX3BTY2FsZVo7XG5cblx0XHR0aGlzLl9wQm91bmRzSW52YWxpZCA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBfcFVwZGF0ZUltcGxpY2l0TW91c2VFbmFibGVkKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHR0aGlzLl9wSW1wbGljaXRNb3VzZUVuYWJsZWQgPSB0aGlzLl9leHBsaWNpdE1vdXNlRW5hYmxlZCAmJiB2YWx1ZTtcblxuXHRcdC8vIElmIHRoZXJlIGlzIGEgcGFyZW50IGFuZCB0aGlzIGNoaWxkIGRvZXMgbm90IGhhdmUgYSBwaWNraW5nIGNvbGxpZGVyLCB1c2UgaXRzIHBhcmVudCdzIHBpY2tpbmcgY29sbGlkZXIuXG5cdFx0aWYgKHRoaXMuX3BJbXBsaWNpdE1vdXNlRW5hYmxlZCAmJiB0aGlzLl9wUGFyZW50ICYmICF0aGlzLl9wUGlja2luZ0NvbGxpZGVyKVxuXHRcdFx0dGhpcy5fcFBpY2tpbmdDb2xsaWRlciA9ICB0aGlzLl9wUGFyZW50Ll9wUGlja2luZ0NvbGxpZGVyO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBfcFVwZGF0ZUltcGxpY2l0UGFydGl0aW9uKHZhbHVlOlBhcnRpdGlvbilcblx0e1xuXHRcdC8vIGFzc2lnbiBwYXJlbnQgaW1wbGljaXQgcGFydGl0aW9uIGlmIG5vIGV4cGxpY2l0IG9uZSBpcyBnaXZlblxuXHRcdHRoaXMuX3BJbXBsaWNpdFBhcnRpdGlvbiA9IHRoaXMuX2V4cGxpY2l0UGFydGl0aW9uIHx8IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBfcFVwZGF0ZUltcGxpY2l0VmlzaWJpbGl0eSh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0dGhpcy5fcEltcGxpY2l0VmlzaWJpbGl0eSA9IHRoaXMuX2V4cGxpY2l0VmlzaWJpbGl0eSAmJiB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgX3BVcGRhdGVNYXRyaXgzRCgpXG5cdHtcblxuXHRcdHRoaXMuX3Bvcy54ID0gdGhpcy5feDtcblx0XHR0aGlzLl9wb3MueSA9IHRoaXMuX3k7XG5cdFx0dGhpcy5fcG9zLnogPSB0aGlzLl96O1xuXG5cdFx0dGhpcy5fcm90LnggPSB0aGlzLl9yb3RhdGlvblg7XG5cdFx0dGhpcy5fcm90LnkgPSB0aGlzLl9yb3RhdGlvblk7XG5cdFx0dGhpcy5fcm90LnogPSB0aGlzLl9yb3RhdGlvblo7XG5cblx0XHR0aGlzLl9zY2EueCA9IHRoaXMuX3BTY2FsZVg7XG5cdFx0dGhpcy5fc2NhLnkgPSB0aGlzLl9wU2NhbGVZO1xuXHRcdHRoaXMuX3NjYS56ID0gdGhpcy5fcFNjYWxlWjtcblxuXHRcdHRoaXMuX21hdHJpeDNELnJlY29tcG9zZSh0aGlzLl90cmFuc2Zvcm1Db21wb25lbnRzKTtcblxuXHRcdGlmICghdGhpcy5fcGl2b3RaZXJvKSB7XG5cdFx0XHR0aGlzLl9tYXRyaXgzRC5wcmVwZW5kVHJhbnNsYXRpb24oLXRoaXMuX3Bpdm90LngvdGhpcy5fcFNjYWxlWCwgLXRoaXMuX3Bpdm90LnkvdGhpcy5fcFNjYWxlWSwgLXRoaXMuX3Bpdm90LnovdGhpcy5fcFNjYWxlWik7XG5cdFx0XHRpZiAodGhpcy5hbGlnbm1lbnRNb2RlICE9IEFsaWdubWVudE1vZGUuUElWT1RfUE9JTlQpXG5cdFx0XHRcdHRoaXMuX21hdHJpeDNELmFwcGVuZFRyYW5zbGF0aW9uKHRoaXMuX3Bpdm90LngsIHRoaXMuX3Bpdm90LnksIHRoaXMuX3Bpdm90LnopO1xuXHRcdH1cblxuXHRcdHRoaXMuX21hdHJpeDNERGlydHkgPSBmYWxzZTtcblx0XHR0aGlzLl9wb3NpdGlvbkRpcnR5ID0gZmFsc2U7XG5cdFx0dGhpcy5fcm90YXRpb25EaXJ0eSA9IGZhbHNlO1xuXHRcdHRoaXMuX3NjYWxlRGlydHkgPSBmYWxzZTtcblx0XHR0aGlzLl9waXZvdERpcnR5ID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBVcGRhdGVTY2VuZVRyYW5zZm9ybSgpXG5cdHtcblx0XHRpZiAodGhpcy5fcFBhcmVudCAmJiAhdGhpcy5fcFBhcmVudC5faUlzUm9vdCkge1xuXHRcdFx0dGhpcy5fcFNjZW5lVHJhbnNmb3JtLmNvcHlGcm9tKHRoaXMuX3BQYXJlbnQuc2NlbmVUcmFuc2Zvcm0pO1xuXHRcdFx0dGhpcy5fcFNjZW5lVHJhbnNmb3JtLnByZXBlbmQodGhpcy5faU1hdHJpeDNEKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fcFNjZW5lVHJhbnNmb3JtLmNvcHlGcm9tKHRoaXMuX2lNYXRyaXgzRCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcFNjZW5lVHJhbnNmb3JtRGlydHkgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBfaUFkZFJlbmRlcmFibGUocmVuZGVyYWJsZTpJUmVuZGVyYWJsZSk6SVJlbmRlcmFibGVcblx0e1xuXHRcdHRoaXMuX3BSZW5kZXJhYmxlcy5wdXNoKHJlbmRlcmFibGUpO1xuXG5cdFx0cmV0dXJuIHJlbmRlcmFibGU7XG5cdH1cblxuXG5cdHB1YmxpYyBfaVJlbW92ZVJlbmRlcmFibGUocmVuZGVyYWJsZTpJUmVuZGVyYWJsZSk6SVJlbmRlcmFibGVcblx0e1xuXHRcdHZhciBpbmRleDpudW1iZXIgPSB0aGlzLl9wUmVuZGVyYWJsZXMuaW5kZXhPZihyZW5kZXJhYmxlKTtcblxuXHRcdHRoaXMuX3BSZW5kZXJhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuXG5cdFx0cmV0dXJuIHJlbmRlcmFibGU7XG5cdH1cblxuXHQvKipcblx0ICogLy9UT0RPXG5cdCAqXG5cdCAqIEBwYXJhbSBzaG9ydGVzdENvbGxpc2lvbkRpc3RhbmNlXG5cdCAqIEBwYXJhbSBmaW5kQ2xvc2VzdFxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX2lUZXN0Q29sbGlzaW9uKHNob3J0ZXN0Q29sbGlzaW9uRGlzdGFuY2U6bnVtYmVyLCBmaW5kQ2xvc2VzdDpib29sZWFuKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBfaUludGVybmFsVXBkYXRlKClcblx0e1xuXHRcdGlmICh0aGlzLl9pQ29udHJvbGxlcilcblx0XHRcdHRoaXMuX2lDb250cm9sbGVyLnVwZGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIF9pSXNWaXNpYmxlKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BJbXBsaWNpdFZpc2liaWxpdHk7XG5cdH1cblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX2lJc01vdXNlRW5hYmxlZCgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wSW1wbGljaXRNb3VzZUVuYWJsZWQ7XG5cdH1cblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX2lTZXRTY2VuZSh2YWx1ZTpTY2VuZSlcblx0e1xuXHRcdC8vIHRlc3QgdG8gc2VlIGlmIHdlJ3JlIHN3aXRjaGluZyByb290cyB3aGlsZSB3ZSdyZSBhbHJlYWR5IHVzaW5nIGEgc2NlbmUgcGFydGl0aW9uXG5cdFx0Lypcblx0XHRpZiAodmFsdWUgPT0gbnVsbClcblx0XHRcdHRoaXMuX29sZFNjZW5lID0gdGhpcy5fcFNjZW5lO1xuXG5cdFx0aWYgKHRoaXMuX2V4cGxpY2l0UGFydGl0aW9uICYmIHRoaXMuX29sZFNjZW5lICYmIHRoaXMuX29sZFNjZW5lICE9IHRoaXMuX3BTY2VuZSlcblx0XHRcdHRoaXMucGFydGl0aW9uID0gbnVsbDtcblxuXHRcdGlmICh2YWx1ZSlcblx0XHRcdHRoaXMuX29sZFNjZW5lID0gbnVsbDtcblxuXHRcdC8vIGVuZCBvZiBzdHVwaWQgcGFydGl0aW9uIHRlc3QgY29kZVxuXHRcdC8vKi9cblxuXHRcdGlmICh0aGlzLl9wU2NlbmUgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9wVXBkYXRlU2NlbmUodmFsdWUpO1xuXG5cdFx0aWYgKCF0aGlzLl9wU2NlbmVUcmFuc2Zvcm1EaXJ0eSAmJiAhdGhpcy5fcElnbm9yZVRyYW5zZm9ybSlcblx0XHRcdHRoaXMucEludmFsaWRhdGVTY2VuZVRyYW5zZm9ybSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBfcFVwZGF0ZVNjZW5lKHZhbHVlOlNjZW5lKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BTY2VuZSkge1xuXHRcdFx0dGhpcy5fcFNjZW5lLmRpc3BhdGNoRXZlbnQobmV3IFNjZW5lRXZlbnQoU2NlbmVFdmVudC5SRU1PVkVEX0ZST01fU0NFTkUsIHRoaXMpKTtcblxuXHRcdFx0Ly91bnJlZ2lzdGVyIGVudGl0eSBmcm9tIGN1cnJlbnQgc2NlbmVcblx0XHRcdHRoaXMuX3BTY2VuZS5pVW5yZWdpc3RlckVudGl0eSh0aGlzKTtcblx0XHR9XG5cblx0XHR0aGlzLl9wU2NlbmUgPSB2YWx1ZTtcblxuXHRcdGlmICh2YWx1ZSkge1xuXHRcdFx0dmFsdWUuZGlzcGF0Y2hFdmVudChuZXcgU2NlbmVFdmVudChTY2VuZUV2ZW50LkFEREVEX1RPX1NDRU5FLCB0aGlzKSk7XG5cblx0XHRcdC8vcmVnaXN0ZXIgZW50aXR5IHdpdGggbmV3IHNjZW5lXG5cdFx0XHR2YWx1ZS5pUmVnaXN0ZXJFbnRpdHkodGhpcyk7XG5cdFx0fVxuXG5cdFx0dGhpcy5ub3RpZnlTY2VuZUNoYW5nZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIG5vdGlmeVBvc2l0aW9uQ2hhbmdlZCgpXG5cdHtcblx0XHRpZiAoIXRoaXMuX3Bvc2l0aW9uQ2hhbmdlZClcblx0XHRcdHRoaXMuX3Bvc2l0aW9uQ2hhbmdlZCA9IG5ldyBEaXNwbGF5T2JqZWN0RXZlbnQoRGlzcGxheU9iamVjdEV2ZW50LlBPU0lUSU9OX0NIQU5HRUQsIHRoaXMpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX3Bvc2l0aW9uQ2hhbmdlZCk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgbm90aWZ5Um90YXRpb25DaGFuZ2VkKClcblx0e1xuXHRcdGlmICghdGhpcy5fcm90YXRpb25DaGFuZ2VkKVxuXHRcdFx0dGhpcy5fcm90YXRpb25DaGFuZ2VkID0gbmV3IERpc3BsYXlPYmplY3RFdmVudChEaXNwbGF5T2JqZWN0RXZlbnQuUk9UQVRJT05fQ0hBTkdFRCwgdGhpcyk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQodGhpcy5fcm90YXRpb25DaGFuZ2VkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJpdmF0ZSBub3RpZnlTY2FsZUNoYW5nZWQoKVxuXHR7XG5cdFx0aWYgKCF0aGlzLl9zY2FsZUNoYW5nZWQpXG5cdFx0XHR0aGlzLl9zY2FsZUNoYW5nZWQgPSBuZXcgRGlzcGxheU9iamVjdEV2ZW50KERpc3BsYXlPYmplY3RFdmVudC5TQ0FMRV9DSEFOR0VELCB0aGlzKTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9zY2FsZUNoYW5nZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIG5vdGlmeVNjZW5lQ2hhbmdlKClcblx0e1xuXHRcdGlmICh0aGlzLl9saXN0ZW5Ub1NjZW5lQ2hhbmdlZCkge1xuXHRcdFx0aWYgKCF0aGlzLl9zY2VuZWNoYW5nZWQpXG5cdFx0XHRcdHRoaXMuX3NjZW5lY2hhbmdlZCA9IG5ldyBEaXNwbGF5T2JqZWN0RXZlbnQoRGlzcGxheU9iamVjdEV2ZW50LlNDRU5FX0NIQU5HRUQsIHRoaXMpO1xuXG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQodGhpcy5fc2NlbmVjaGFuZ2VkKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgbm90aWZ5U2NlbmVUcmFuc2Zvcm1DaGFuZ2UoKVxuXHR7XG5cdFx0aWYgKCF0aGlzLl9zY2VuZVRyYW5zZm9ybUNoYW5nZWQpXG5cdFx0XHR0aGlzLl9zY2VuZVRyYW5zZm9ybUNoYW5nZWQgPSBuZXcgRGlzcGxheU9iamVjdEV2ZW50KERpc3BsYXlPYmplY3RFdmVudC5TQ0VORVRSQU5TRk9STV9DSEFOR0VELCB0aGlzKTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9zY2VuZVRyYW5zZm9ybUNoYW5nZWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEludmFsaWRhdGVzIHRoZSAzRCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgsIGNhdXNpbmcgaXQgdG8gYmUgdXBkYXRlZCB1cG9uIHRoZSBuZXh0IHJlcXVlc3Rcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgaW52YWxpZGF0ZU1hdHJpeDNEKCk6dm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMuX21hdHJpeDNERGlydHkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9tYXRyaXgzRERpcnR5ID0gdHJ1ZTtcblxuXHRcdGlmICghdGhpcy5fcFNjZW5lVHJhbnNmb3JtRGlydHkgJiYgIXRoaXMuX3BJZ25vcmVUcmFuc2Zvcm0pXG5cdFx0XHR0aGlzLnBJbnZhbGlkYXRlU2NlbmVUcmFuc2Zvcm0oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJpdmF0ZSBpbnZhbGlkYXRlUGFydGl0aW9uKClcblx0e1xuXHRcdGlmICh0aGlzLl9pQXNzaWduZWRQYXJ0aXRpb24pXG5cdFx0XHR0aGlzLl9pQXNzaWduZWRQYXJ0aXRpb24uaU1hcmtGb3JVcGRhdGUodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgaW52YWxpZGF0ZVBpdm90KClcblx0e1xuXHRcdHRoaXMuX3Bpdm90WmVybyA9ICh0aGlzLl9waXZvdC54ID09IDApICYmICh0aGlzLl9waXZvdC55ID09IDApICYmICh0aGlzLl9waXZvdC56ID09IDApO1xuXG5cdFx0aWYgKHRoaXMuX3Bpdm90RGlydHkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9waXZvdERpcnR5ID0gdHJ1ZTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZU1hdHJpeDNEKCk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgaW52YWxpZGF0ZVBvc2l0aW9uKClcblx0e1xuXHRcdGlmICh0aGlzLl9wb3NpdGlvbkRpcnR5KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcG9zaXRpb25EaXJ0eSA9IHRydWU7XG5cblx0XHR0aGlzLmludmFsaWRhdGVNYXRyaXgzRCgpO1xuXG5cdFx0aWYgKHRoaXMuX2xpc3RlblRvUG9zaXRpb25DaGFuZ2VkKVxuXHRcdFx0dGhpcy5ub3RpZnlQb3NpdGlvbkNoYW5nZWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJpdmF0ZSBpbnZhbGlkYXRlUm90YXRpb24oKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3JvdGF0aW9uRGlydHkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9yb3RhdGlvbkRpcnR5ID0gdHJ1ZTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZU1hdHJpeDNEKCk7XG5cblx0XHRpZiAodGhpcy5fbGlzdGVuVG9Sb3RhdGlvbkNoYW5nZWQpXG5cdFx0XHR0aGlzLm5vdGlmeVJvdGF0aW9uQ2hhbmdlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIGludmFsaWRhdGVTY2FsZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fc2NhbGVEaXJ0eSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3NjYWxlRGlydHkgPSB0cnVlO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlTWF0cml4M0QoKTtcblxuXHRcdGlmICh0aGlzLl9saXN0ZW5Ub1NjYWxlQ2hhbmdlZClcblx0XHRcdHRoaXMubm90aWZ5U2NhbGVDaGFuZ2VkKCk7XG5cdH1cbn1cblxuZXhwb3J0ID0gRGlzcGxheU9iamVjdDsiXX0= \ No newline at end of file diff --git a/lib/core/base/DisplayObject.ts b/lib/core/base/DisplayObject.ts new file mode 100644 index 00000000..42e4f420 --- /dev/null +++ b/lib/core/base/DisplayObject.ts @@ -0,0 +1,2384 @@ +import AxisAlignedBoundingBox = require("awayjs-core/lib/bounds/AxisAlignedBoundingBox"); +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +import Scene = require("awayjs-core/lib/containers/Scene"); +import ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); +import AlignmentMode = require("awayjs-core/lib/core/base/AlignmentMode"); +import BlendMode = require("awayjs-core/lib/core/base/BlendMode"); +import LoaderInfo = require("awayjs-core/lib/core/base/LoaderInfo"); +import OrientationMode = require("awayjs-core/lib/core/base/OrientationMode"); +import IBitmapDrawable = require("awayjs-core/lib/core/base/IBitmapDrawable"); +import MathConsts = require("awayjs-core/lib/core/geom/MathConsts"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +import Point = require("awayjs-core/lib/core/geom/Point"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import Transform = require("awayjs-core/lib/core/geom/Transform"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import Partition = require("awayjs-core/lib/core/partition/Partition"); +import IPickingCollider = require("awayjs-core/lib/core/pick/IPickingCollider"); +import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import DisplayObjectEvent = require("awayjs-core/lib/events/DisplayObjectEvent"); +import SceneEvent = require("awayjs-core/lib/events/SceneEvent"); +import PrefabBase = require("awayjs-core/lib/prefabs/PrefabBase"); + +/** + * The DisplayObject class is the base class for all objects that can be + * placed on the display list. The display list manages all objects displayed + * in flash. Use the DisplayObjectContainer class to arrange the + * display objects in the display list. DisplayObjectContainer objects can + * have child display objects, while other display objects, such as Shape and + * TextField objects, are "leaf" nodes that have only parents and siblings, no + * children. + * + *

The DisplayObject class supports basic functionality like the x + * and y position of an object, as well as more advanced properties of + * the object such as its transformation matrix.

+ * + *

DisplayObject is an abstract base class; therefore, you cannot call + * DisplayObject directly. Invoking new DisplayObject() throws an + * ArgumentError exception.

+ * + *

All display objects inherit from the DisplayObject class.

+ * + *

The DisplayObject class itself does not include any APIs for rendering + * content onscreen. For that reason, if you want create a custom subclass of + * the DisplayObject class, you will want to extend one of its subclasses that + * do have APIs for rendering content onscreen, such as the Shape, Sprite, + * Bitmap, SimpleButton, TextField, or MovieClip class.

+ * + *

The DisplayObject class contains several broadcast events. Normally, the + * target of any particular event is a specific DisplayObject instance. For + * example, the target of an added event is the specific + * DisplayObject instance that was added to the display list. Having a single + * target restricts the placement of event listeners to that target and in + * some cases the target's ancestors on the display list. With broadcast + * events, however, the target is not a specific DisplayObject instance, but + * rather all DisplayObject instances, including those that are not on the + * display list. This means that you can add a listener to any DisplayObject + * instance to listen for broadcast events. In addition to the broadcast + * events listed in the DisplayObject class's Events table, the DisplayObject + * class also inherits two broadcast events from the EventDispatcher class: + * activate and deactivate.

+ * + *

Some properties previously used in the ActionScript 1.0 and 2.0 + * MovieClip, TextField, and Button classes(such as _alpha, + * _height, _name, _width, + * _x, _y, and others) have equivalents in the + * ActionScript 3.0 DisplayObject class that are renamed so that they no + * longer begin with the underscore(_) character.

+ * + *

For more information, see the "Display Programming" chapter of the + * ActionScript 3.0 Developer's Guide.

+ * + * @event added Dispatched when a display object is added to the + * display list. The following methods trigger this + * event: + * DisplayObjectContainer.addChild(), + * DisplayObjectContainer.addChildAt(). + * @event addedToStage Dispatched when a display object is added to the on + * stage display list, either directly or through the + * addition of a sub tree in which the display object + * is contained. The following methods trigger this + * event: + * DisplayObjectContainer.addChild(), + * DisplayObjectContainer.addChildAt(). + * @event enterFrame [broadcast event] Dispatched when the playhead is + * entering a new frame. If the playhead is not + * moving, or if there is only one frame, this event + * is dispatched continuously in conjunction with the + * frame rate. This event is a broadcast event, which + * means that it is dispatched by all display objects + * with a listener registered for this event. + * @event exitFrame [broadcast event] Dispatched when the playhead is + * exiting the current frame. All frame scripts have + * been run. If the playhead is not moving, or if + * there is only one frame, this event is dispatched + * continuously in conjunction with the frame rate. + * This event is a broadcast event, which means that + * it is dispatched by all display objects with a + * listener registered for this event. + * @event frameConstructed [broadcast event] Dispatched after the constructors + * of frame display objects have run but before frame + * scripts have run. If the playhead is not moving, or + * if there is only one frame, this event is + * dispatched continuously in conjunction with the + * frame rate. This event is a broadcast event, which + * means that it is dispatched by all display objects + * with a listener registered for this event. + * @event removed Dispatched when a display object is about to be + * removed from the display list. Two methods of the + * DisplayObjectContainer class generate this event: + * removeChild() and + * removeChildAt(). + * + *

The following methods of a + * DisplayObjectContainer object also generate this + * event if an object must be removed to make room for + * the new object: addChild(), + * addChildAt(), and + * setChildIndex().

+ * @event removedFromStage Dispatched when a display object is about to be + * removed from the display list, either directly or + * through the removal of a sub tree in which the + * display object is contained. Two methods of the + * DisplayObjectContainer class generate this event: + * removeChild() and + * removeChildAt(). + * + *

The following methods of a + * DisplayObjectContainer object also generate this + * event if an object must be removed to make room for + * the new object: addChild(), + * addChildAt(), and + * setChildIndex().

+ * @event render [broadcast event] Dispatched when the display list + * is about to be updated and rendered. This event + * provides the last opportunity for objects listening + * for this event to make changes before the display + * list is rendered. You must call the + * invalidate() method of the Stage + * object each time you want a render + * event to be dispatched. Render events + * are dispatched to an object only if there is mutual + * trust between it and the object that called + * Stage.invalidate(). This event is a + * broadcast event, which means that it is dispatched + * by all display objects with a listener registered + * for this event. + * + *

Note: This event is not dispatched if the + * display is not rendering. This is the case when the + * content is either minimized or obscured.

+ */ +class DisplayObject extends NamedAssetBase implements IBitmapDrawable +{ + private _loaderInfo:LoaderInfo; + private _mouseX:number; + private _mouseY:number; + private _root:DisplayObjectContainer; + private _bounds:Rectangle; + private _boundsVisible:boolean; + private _depth:number; + private _height:number; + private _width:number; + + public _pScene:Scene; + public _pParent:DisplayObjectContainer; + public _pSceneTransform:Matrix3D = new Matrix3D(); + public _pSceneTransformDirty:boolean = true; + public _pIsEntity:boolean; + + private _explicitPartition:Partition; + public _pImplicitPartition:Partition; + private _partitionNode:EntityNode; + + private _sceneTransformChanged:DisplayObjectEvent; + private _scenechanged:DisplayObjectEvent; + private _transform:Transform; + private _matrix3D:Matrix3D = new Matrix3D(); + private _matrix3DDirty:boolean = true; + + private _inverseSceneTransform:Matrix3D = new Matrix3D(); + private _inverseSceneTransformDirty:boolean = true; + private _scenePosition:Vector3D = new Vector3D(); + private _scenePositionDirty:boolean = true; + private _explicitVisibility:boolean = true; + public _pImplicitVisibility:boolean = true; + private _explicitMouseEnabled:boolean = true; + public _pImplicitMouseEnabled:boolean = true; + private _listenToSceneTransformChanged:boolean; + private _listenToSceneChanged:boolean; + + private _positionDirty:boolean = true; + private _rotationDirty:boolean = true; + private _scaleDirty:boolean = true; + + private _positionChanged:DisplayObjectEvent; + private _rotationChanged:DisplayObjectEvent; + private _scaleChanged:DisplayObjectEvent; + + private _rotationX:number = 0; + private _rotationY:number = 0; + private _rotationZ:number = 0; + private _eulers:Vector3D = new Vector3D(); + private _flipY:Matrix3D = new Matrix3D(); + + private _listenToPositionChanged:boolean; + private _listenToRotationChanged:boolean; + private _listenToScaleChanged:boolean; + private _zOffset:number = 0; + + public _pScaleX:number = 1; + public _pScaleY:number = 1; + public _pScaleZ:number = 1; + private _x:number = 0; + private _y:number = 0; + private _z:number = 0; + private _pivot:Vector3D = new Vector3D(); + private _orientationMatrix:Matrix3D = new Matrix3D(); + private _pivotZero:boolean = true; + private _pivotDirty:boolean = true; + private _pos:Vector3D = new Vector3D(); + private _rot:Vector3D = new Vector3D(); + private _sca:Vector3D = new Vector3D(); + private _transformComponents:Array; + + public _pIgnoreTransform:boolean = false; + + private _shaderPickingDetails:boolean; + + public _pPickingCollisionVO:PickingCollisionVO; + + public _pBounds:BoundingVolumeBase; + public _pBoundsInvalid:boolean = true; + private _worldBounds:BoundingVolumeBase; + private _worldBoundsInvalid:boolean = true; + + public _pPickingCollider:IPickingCollider; + + public _pRenderables:Array = new Array(); + + public _iSourcePrefab:PrefabBase; + + /** + * + */ + public alignmentMode:string = AlignmentMode.REGISTRATION_POINT; + + /** + * Indicates the alpha transparency value of the object specified. Valid + * values are 0(fully transparent) to 1(fully opaque). The default value is + * 1. Display objects with alpha set to 0 are active, + * even though they are invisible. + */ + public alpha:number; + + /** + * A value from the BlendMode class that specifies which blend mode to use. A + * bitmap can be drawn internally in two ways. If you have a blend mode + * enabled or an external clipping mask, the bitmap is drawn by adding a + * bitmap-filled square shape to the vector render. If you attempt to set + * this property to an invalid value, Flash runtimes set the value to + * BlendMode.NORMAL. + * + *

The blendMode property affects each pixel of the display + * object. Each pixel is composed of three constituent colors(red, green, + * and blue), and each constituent color has a value between 0x00 and 0xFF. + * Flash Player or Adobe AIR compares each constituent color of one pixel in + * the movie clip with the corresponding color of the pixel in the + * background. For example, if blendMode is set to + * BlendMode.LIGHTEN, Flash Player or Adobe AIR compares the red + * value of the display object with the red value of the background, and uses + * the lighter of the two as the value for the red component of the displayed + * color.

+ * + *

The following table describes the blendMode settings. The + * BlendMode class defines string values you can use. The illustrations in + * the table show blendMode values applied to a circular display + * object(2) superimposed on another display object(1).

+ */ + public blendMode:BlendMode; + + /** + * + */ + public get bounds():BoundingVolumeBase + { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._pBounds; + } + + public set bounds(value:BoundingVolumeBase) + { + if (this._pBounds == value) + return; + + this._pBounds = value; + + this._worldBounds = value.clone(); + + this.pInvalidateBounds(); + + if (this._boundsVisible) + this._partitionNode._iUpdateEntityBounds(); + } + + /** + * If set to true, NME will use the software renderer to cache + * an internal bitmap representation of the display object. For native targets, + * this is often much slower than the default hardware renderer. When you + * are using the Flash target, this caching may increase performance for display + * objects that contain complex vector content. + * + *

All vector data for a display object that has a cached bitmap is drawn + * to the bitmap instead of the main display. If + * cacheAsBitmapMatrix is null or unsupported, the bitmap is + * then copied to the main display as unstretched, unrotated pixels snapped + * to the nearest pixel boundaries. Pixels are mapped 1 to 1 with the parent + * object. If the bounds of the bitmap change, the bitmap is recreated + * instead of being stretched.

+ * + *

If cacheAsBitmapMatrix is non-null and supported, the + * object is drawn to the off-screen bitmap using that matrix and the + * stretched and/or rotated results of that rendering are used to draw the + * object to the main display.

+ * + *

No internal bitmap is created unless the cacheAsBitmap + * property is set to true.

+ * + *

After you set the cacheAsBitmap property to + * true, the rendering does not change, however the display + * object performs pixel snapping automatically. The animation speed can be + * significantly faster depending on the complexity of the vector content. + *

+ * + *

The cacheAsBitmap property is automatically set to + * true whenever you apply a filter to a display object(when + * its filter array is not empty), and if a display object has a + * filter applied to it, cacheAsBitmap is reported as + * true for that display object, even if you set the property to + * false. If you clear all filters for a display object, the + * cacheAsBitmap setting changes to what it was last set to.

+ * + *

A display object does not use a bitmap even if the + * cacheAsBitmap property is set to true and + * instead renders from vector data in the following cases:

+ * + *
    + *
  • The bitmap is too large. In AIR 1.5 and Flash Player 10, the maximum + * size for a bitmap image is 8,191 pixels in width or height, and the total + * number of pixels cannot exceed 16,777,215 pixels.(So, if a bitmap image + * is 8,191 pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 + * and earlier, the limitation is is 2880 pixels in height and 2,880 pixels + * in width.
  • + *
  • The bitmap fails to allocate(out of memory error).
  • + *
+ * + *

The cacheAsBitmap property is best used with movie clips + * that have mostly static content and that do not scale and rotate + * frequently. With such movie clips, cacheAsBitmap can lead to + * performance increases when the movie clip is translated(when its x + * and y position is changed).

+ */ + public cacheAsBitmap:boolean; + + /** + * + */ + public castsShadows:boolean = true; + + /** + * Indicates the depth of the display object, in pixels. The depth is + * calculated based on the bounds of the content of the display object. When + * you set the depth property, the scaleZ property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content (such as an empty sprite) has a depth of 0, even if you try to + * set depth to a different value.

+ */ + public get depth():number + { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._depth; + } + + public set depth(val:number) + { + if (this._depth == val) + return; + + this._depth == val; + + this._pScaleZ = val/this.bounds.aabb.depth; + + this.invalidateScale(); + } + + /** + * Defines the rotation of the 3d object as a Vector3D object containing euler angles for rotation around x, y and z axis. + */ + public get eulers():Vector3D + { + this._eulers.x = this._rotationX*MathConsts.RADIANS_TO_DEGREES; + this._eulers.y = this._rotationY*MathConsts.RADIANS_TO_DEGREES; + this._eulers.z = this._rotationZ*MathConsts.RADIANS_TO_DEGREES; + + return this._eulers; + } + + public set eulers(value:Vector3D) + { + this._rotationX = value.x*MathConsts.DEGREES_TO_RADIANS; + this._rotationY = value.y*MathConsts.DEGREES_TO_RADIANS; + this._rotationZ = value.z*MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + } + + /** + * An object that can contain any extra data. + */ + public extra:Object; + + /** + * An indexed array that contains each filter object currently associated + * with the display object. The flash.filters package contains several + * classes that define specific filters you can use. + * + *

Filters can be applied in Flash Professional at design time, or at run + * time by using ActionScript code. To apply a filter by using ActionScript, + * you must make a temporary copy of the entire filters array, + * modify the temporary array, then assign the value of the temporary array + * back to the filters array. You cannot directly add a new + * filter object to the filters array.

+ * + *

To add a filter by using ActionScript, perform the following steps + * (assume that the target display object is named + * myDisplayObject):

+ * + *
    + *
  1. Create a new filter object by using the constructor method of your + * chosen filter class.
  2. + *
  3. Assign the value of the myDisplayObject.filters array + * to a temporary array, such as one named myFilters.
  4. + *
  5. Add the new filter object to the myFilters temporary + * array.
  6. + *
  7. Assign the value of the temporary array to the + * myDisplayObject.filters array.
  8. + *
+ * + *

If the filters array is undefined, you do not need to use + * a temporary array. Instead, you can directly assign an array literal that + * contains one or more filter objects that you create. The first example in + * the Examples section adds a drop shadow filter by using code that handles + * both defined and undefined filters arrays.

+ * + *

To modify an existing filter object, you must use the technique of + * modifying a copy of the filters array:

+ * + *
    + *
  1. Assign the value of the filters array to a temporary + * array, such as one named myFilters.
  2. + *
  3. Modify the property by using the temporary array, + * myFilters. For example, to set the quality property of the + * first filter in the array, you could use the following code: + * myFilters[0].quality = 1;
  4. + *
  5. Assign the value of the temporary array to the filters + * array.
  6. + *
+ * + *

At load time, if a display object has an associated filter, it is + * marked to cache itself as a transparent bitmap. From this point forward, + * as long as the display object has a valid filter list, the player caches + * the display object as a bitmap. This source bitmap is used as a source + * image for the filter effects. Each display object usually has two bitmaps: + * one with the original unfiltered source display object and another for the + * final image after filtering. The final image is used when rendering. As + * long as the display object does not change, the final image does not need + * updating.

+ * + *

The flash.filters package includes classes for filters. For example, to + * create a DropShadow filter, you would write:

+ * + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader output type is not compatible with + * this operation(the shader must specify a + * pixel4 output). + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader doesn't specify any image input or + * the first input is not an image4 input. + * @throws ArgumentError When filters includes a ShaderFilter + * and the shader specifies an image input that isn't + * provided. + * @throws ArgumentError When filters includes a ShaderFilter, a + * ByteArray or Vector. instance as a shader + * input, and the width and + * height properties aren't specified for + * the ShaderInput object, or the specified values + * don't match the amount of data in the input data. + * See the ShaderInput.input property for + * more information. + */ +// public filters:Array; + + /** + * Indicates the height of the display object, in pixels. The height is + * calculated based on the bounds of the content of the display object. When + * you set the height property, the scaleY property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content (such as an empty sprite) has a height of 0, even if you try to + * set height to a different value.

+ */ + public get height():number + { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._height; + } + + public set height(val:number) + { + if (this._height == val) + return; + + this._height == val; + + this._pScaleY = val/this.bounds.aabb.height; + + this.invalidateScale(); + } + + /** + * Indicates the instance container index of the DisplayObject. The object can be + * identified in the child list of its parent display object container by + * calling the getChildByIndex() method of the display object + * container. + * + *

If the DisplayObject has no parent container, index defaults to 0.

+ */ + public get index():number + { + if (this._pParent) + return this._pParent.getChildIndex(this); + + return 0; + } + + /** + * + */ + public get inverseSceneTransform():Matrix3D + { + if (this._inverseSceneTransformDirty) { + this._inverseSceneTransform.copyFrom(this.sceneTransform); + this._inverseSceneTransform.invert(); + this._inverseSceneTransformDirty = false; + } + return this._inverseSceneTransform; + } + + /** + * + */ + public get ignoreTransform():boolean + { + return this._pIgnoreTransform; + } + + public set ignoreTransform(value:boolean) + { + if (this._pIgnoreTransform == value) + return; + + this._pIgnoreTransform = value; + + if (value) { + this._pSceneTransform.identity(); + this._scenePosition.setTo(0, 0, 0); + } + + this.pInvalidateSceneTransform(); + } + + /** + * + */ + public get isEntity() + { + return this._pIsEntity; + } + /** + * Returns a LoaderInfo object containing information about loading the file + * to which this display object belongs. The loaderInfo property + * is defined only for the root display object of a SWF file or for a loaded + * Bitmap(not for a Bitmap that is drawn with ActionScript). To find the + * loaderInfo object associated with the SWF file that contains + * a display object named myDisplayObject, use + * myDisplayObject.root.loaderInfo. + * + *

A large SWF file can monitor its download by calling + * this.root.loaderInfo.addEventListener(Event.COMPLETE, + * func).

+ */ + public get loaderInfo():LoaderInfo + { + return this._loaderInfo; + } + + /** + * The calling display object is masked by the specified mask + * object. To ensure that masking works when the Stage is scaled, the + * mask display object must be in an active part of the display + * list. The mask object itself is not drawn. Set + * mask to null to remove the mask. + * + *

To be able to scale a mask object, it must be on the display list. To + * be able to drag a mask Sprite object(by calling its + * startDrag() method), it must be on the display list. To call + * the startDrag() method for a mask sprite based on a + * mouseDown event being dispatched by the sprite, set the + * sprite's buttonMode property to true.

+ * + *

When display objects are cached by setting the + * cacheAsBitmap property to true an the + * cacheAsBitmapMatrix property to a Matrix object, both the + * mask and the display object being masked must be part of the same cached + * bitmap. Thus, if the display object is cached, then the mask must be a + * child of the display object. If an ancestor of the display object on the + * display list is cached, then the mask must be a child of that ancestor or + * one of its descendents. If more than one ancestor of the masked object is + * cached, then the mask must be a descendent of the cached container closest + * to the masked object in the display list.

+ * + *

Note: A single mask object cannot be used to mask + * more than one calling display object. When the mask is + * assigned to a second display object, it is removed as the mask of the + * first object, and that object's mask property becomes + * null.

+ */ + public mask:DisplayObject; + + /** + * Specifies whether this object receives mouse, or other user input, + * messages. The default value is true, which means that by + * default any InteractiveObject instance that is on the display list + * receives mouse events or other user input events. If + * mouseEnabled is set to false, the instance does + * not receive any mouse events(or other user input events like keyboard + * events). Any children of this instance on the display list are not + * affected. To change the mouseEnabled behavior for all + * children of an object on the display list, use + * flash.display.DisplayObjectContainer.mouseChildren. + * + *

No event is dispatched by setting this property. You must use the + * addEventListener() method to create interactive + * functionality.

+ */ + public get mouseEnabled():boolean + { + return this._explicitMouseEnabled; + } + + public set mouseEnabled(value:boolean) + { + if (this._explicitMouseEnabled == value) + return; + + this._explicitMouseEnabled = value; + + this._pUpdateImplicitMouseEnabled(this._pParent? this._pParent.mouseChildren : true); + } + + + /** + * Indicates the x coordinate of the mouse or user input device position, in + * pixels. + * + *

Note: For a DisplayObject that has been rotated, the returned x + * coordinate will reflect the non-rotated object.

+ */ + public get mouseX():number + { + return this._mouseX; + } + + /** + * Indicates the y coordinate of the mouse or user input device position, in + * pixels. + * + *

Note: For a DisplayObject that has been rotated, the returned y + * coordinate will reflect the non-rotated object.

+ */ + public get mouseY():number + { + return this._mouseY; + } + + /** + * Indicates the instance name of the DisplayObject. The object can be + * identified in the child list of its parent display object container by + * calling the getChildByName() method of the display object + * container. + * + * @throws IllegalOperationError If you are attempting to set this property + * on an object that was placed on the timeline + * in the Flash authoring tool. + */ + public name:string; + + /** + * + */ + public orientationMode:string = OrientationMode.DEFAULT; + + /** + * Indicates the DisplayObjectContainer object that contains this display + * object. Use the parent property to specify a relative path to + * display objects that are above the current display object in the display + * list hierarchy. + * + *

You can use parent to move up multiple levels in the + * display list as in the following:

+ * + * @throws SecurityError The parent display object belongs to a security + * sandbox to which you do not have access. You can + * avoid this situation by having the parent movie call + * the Security.allowDomain() method. + */ + public get parent():DisplayObjectContainer + { + return this._pParent; + } + + /** + * + */ + public get partition():Partition + { + return this._explicitPartition; + } + + public set partition(value:Partition) + { + if (this._explicitPartition == value) + return; + + if (this._pScene && this._explicitPartition) + this._pScene.iUnregisterPartition(this._explicitPartition); + + this._explicitPartition = value; + + if (this._pScene && value) + this._pScene.iRegisterPartition(value); + + this._pUpdateImplicitPartition(this._pParent? this._pParent._iAssignedPartition : null); + } + + /** + * + */ + public get partitionNode():EntityNode + { + if (!this._partitionNode) + this._partitionNode = this.pCreateEntityPartitionNode(); + + return this._partitionNode; + } + + /** + * + */ + public get pickingCollider():IPickingCollider + { + return this._pPickingCollider; + } + + public set pickingCollider(value:IPickingCollider) + { + this._pPickingCollider = value; + } + + /** + * Defines the local point around which the object rotates. + */ + public get pivot():Vector3D + { + return this._pivot; + } + + + public set pivot(pivot:Vector3D) + { + this._pivot = pivot.clone(); + + this.invalidatePivot(); + } + + /** + * For a display object in a loaded SWF file, the root property + * is the top-most display object in the portion of the display list's tree + * structure represented by that SWF file. For a Bitmap object representing a + * loaded image file, the root property is the Bitmap object + * itself. For the instance of the main class of the first SWF file loaded, + * the root property is the display object itself. The + * root property of the Stage object is the Stage object itself. + * The root property is set to null for any display + * object that has not been added to the display list, unless it has been + * added to a display object container that is off the display list but that + * is a child of the top-most display object in a loaded SWF file. + * + *

For example, if you create a new Sprite object by calling the + * Sprite() constructor method, its root property + * is null until you add it to the display list(or to a display + * object container that is off the display list but that is a child of the + * top-most display object in a SWF file).

+ * + *

For a loaded SWF file, even though the Loader object used to load the + * file may not be on the display list, the top-most display object in the + * SWF file has its root property set to itself. The Loader + * object does not have its root property set until it is added + * as a child of a display object for which the root property is + * set.

+ */ + public get root():DisplayObjectContainer + { + return this._root; + } + + /** + * Indicates the rotation of the DisplayObject instance, in degrees, from its + * original orientation. Values from 0 to 180 represent clockwise rotation; + * values from 0 to -180 represent counterclockwise rotation. Values outside + * this range are added to or subtracted from 360 to obtain a value within + * the range. For example, the statement my_video.rotation = 450 + * is the same as my_video.rotation = 90. + */ + public rotation:number; //TODO + + /** + * Indicates the x-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + public get rotationX():number + { + return this._rotationX*MathConsts.RADIANS_TO_DEGREES; + } + + public set rotationX(val:number) + { + if (this.rotationX == val) + return; + + this._rotationX = val*MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + } + + /** + * Indicates the y-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + public get rotationY():number + { + return this._rotationY*MathConsts.RADIANS_TO_DEGREES; + } + + public set rotationY(val:number) + { + if (this.rotationY == val) + return; + + this._rotationY = val*MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + } + + /** + * Indicates the z-axis rotation of the DisplayObject instance, in degrees, + * from its original orientation relative to the 3D parent container. Values + * from 0 to 180 represent clockwise rotation; values from 0 to -180 + * represent counterclockwise rotation. Values outside this range are added + * to or subtracted from 360 to obtain a value within the range. + */ + public get rotationZ():number + { + return this._rotationZ*MathConsts.RADIANS_TO_DEGREES; + } + + public set rotationZ(val:number) + { + if (this.rotationZ == val) + return; + + this._rotationZ = val*MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + } + + /** + * The current scaling grid that is in effect. If set to null, + * the entire display object is scaled normally when any scale transformation + * is applied. + * + *

When you define the scale9Grid property, the display + * object is divided into a grid with nine regions based on the + * scale9Grid rectangle, which defines the center region of the + * grid. The eight other regions of the grid are the following areas:

+ * + *
    + *
  • The upper-left corner outside of the rectangle
  • + *
  • The area above the rectangle
  • + *
  • The upper-right corner outside of the rectangle
  • + *
  • The area to the left of the rectangle
  • + *
  • The area to the right of the rectangle
  • + *
  • The lower-left corner outside of the rectangle
  • + *
  • The area below the rectangle
  • + *
  • The lower-right corner outside of the rectangle
  • + *
+ * + *

You can think of the eight regions outside of the center(defined by + * the rectangle) as being like a picture frame that has special rules + * applied to it when scaled.

+ * + *

When the scale9Grid property is set and a display object + * is scaled, all text and gradients are scaled normally; however, for other + * types of objects the following rules apply:

+ * + *
    + *
  • Content in the center region is scaled normally.
  • + *
  • Content in the corners is not scaled.
  • + *
  • Content in the top and bottom regions is scaled horizontally only. + * Content in the left and right regions is scaled vertically only.
  • + *
  • All fills(including bitmaps, video, and gradients) are stretched to + * fit their shapes.
  • + *
+ * + *

If a display object is rotated, all subsequent scaling is normal(and + * the scale9Grid property is ignored).

+ * + *

For example, consider the following display object and a rectangle that + * is applied as the display object's scale9Grid:

+ * + *

A common use for setting scale9Grid is to set up a display + * object to be used as a component, in which edge regions retain the same + * width when the component is scaled.

+ * + * @throws ArgumentError If you pass an invalid argument to the method. + */ + public scale9Grid:Rectangle; + + /** + * Indicates the horizontal scale(percentage) of the object as applied from + * the registration point. The default registration point is(0,0). 1.0 + * equals 100% scale. + * + *

Scaling the local coordinate system changes the x and + * y property values, which are defined in whole pixels.

+ */ + public get scaleX():number + { + return this._pScaleX; + } + + public set scaleX(val:number) + { + if (this._pScaleX == val) + return; + + this._pScaleX = val; + + this.invalidateScale(); + } + + /** + * Indicates the vertical scale(percentage) of an object as applied from the + * registration point of the object. The default registration point is(0,0). + * 1.0 is 100% scale. + * + *

Scaling the local coordinate system changes the x and + * y property values, which are defined in whole pixels.

+ */ + public get scaleY():number + { + return this._pScaleY; + } + + public set scaleY(val:number) + { + if (this._pScaleY == val) + return; + + this._pScaleY = val; + + this.invalidateScale(); + } + + /** + * Indicates the depth scale(percentage) of an object as applied from the + * registration point of the object. The default registration point is(0,0). + * 1.0 is 100% scale. + * + *

Scaling the local coordinate system changes the x, + * y and z property values, which are defined in + * whole pixels.

+ */ + public get scaleZ():number + { + return this._pScaleZ; + } + + public set scaleZ(val:number) + { + if (this._pScaleZ == val) + return; + + this._pScaleZ = val; + + this.invalidateScale(); + } + + /** + * + */ + public get scene():Scene + { + return this._pScene; + } + + /** + * + */ + public get scenePosition():Vector3D + { + if (this._scenePositionDirty) { + if (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) { + var pivotScale:Vector3D = new Vector3D(this._pivot.x/this._pScaleX, this._pivot.y/this._pScaleY, this._pivot.z/this._pScaleZ) + this._scenePosition = this.sceneTransform.transformVector(pivotScale); + //this._scenePosition.decrementBy(new Vector3D(this._pivot.x*this._pScaleX, this._pivot.y*this._pScaleY, this._pivot.z*this._pScaleZ)); + } else { + this.sceneTransform.copyColumnTo(3, this._scenePosition); + } + + this._scenePositionDirty = false; + } + return this._scenePosition; + } + + public get sceneTransform():Matrix3D + { + if (this._pSceneTransformDirty) + this.pUpdateSceneTransform(); + + return this._pSceneTransform; + } + + /** + * The scroll rectangle bounds of the display object. The display object is + * cropped to the size defined by the rectangle, and it scrolls within the + * rectangle when you change the x and y properties + * of the scrollRect object. + * + *

The properties of the scrollRect Rectangle object use the + * display object's coordinate space and are scaled just like the overall + * display object. The corner bounds of the cropped window on the scrolling + * display object are the origin of the display object(0,0) and the point + * defined by the width and height of the rectangle. They are not centered + * around the origin, but use the origin to define the upper-left corner of + * the area. A scrolled display object always scrolls in whole pixel + * increments.

+ * + *

You can scroll an object left and right by setting the x + * property of the scrollRect Rectangle object. You can scroll + * an object up and down by setting the y property of the + * scrollRect Rectangle object. If the display object is rotated + * 90° and you scroll it left and right, the display object actually scrolls + * up and down.

+ */ + public scrollRect:Rectangle; + + /** + * + */ + public get shaderPickingDetails():boolean + { + return this._shaderPickingDetails; + } + + /** + * + */ + public get boundsVisible():boolean + { + return this._boundsVisible; + } + + public set boundsVisible(value:boolean) + { + if (value == this._boundsVisible) + return; + + this._boundsVisible = value; + + this._partitionNode.boundsVisible = value; + } + + /** + * An object with properties pertaining to a display object's matrix, color + * transform, and pixel bounds. The specific properties - matrix, + * colorTransform, and three read-only properties + * (concatenatedMatrix, concatenatedColorTransform, + * and pixelBounds) - are described in the entry for the + * Transform class. + * + *

Each of the transform object's properties is itself an object. This + * concept is important because the only way to set new values for the matrix + * or colorTransform objects is to create a new object and copy that object + * into the transform.matrix or transform.colorTransform property.

+ * + *

For example, to increase the tx value of a display + * object's matrix, you must make a copy of the entire matrix object, then + * copy the new object into the matrix property of the transform object:

+ *
 public myMatrix:Matrix =
+	 * myDisplayObject.transform.matrix; myMatrix.tx += 10;
+	 * myDisplayObject.transform.matrix = myMatrix; 
+ * + *

You cannot directly set the tx property. The following + * code has no effect on myDisplayObject:

+ *
 myDisplayObject.transform.matrix.tx +=
+	 * 10; 
+ * + *

You can also copy an entire transform object and assign it to another + * display object's transform property. For example, the following code + * copies the entire transform object from myOldDisplayObj to + * myNewDisplayObj:

+ * myNewDisplayObj.transform = myOldDisplayObj.transform; + * + *

The resulting display object, myNewDisplayObj, now has the + * same values for its matrix, color transform, and pixel bounds as the old + * display object, myOldDisplayObj.

+ * + *

Note that AIR for TV devices use hardware acceleration, if it is + * available, for color transforms.

+ */ + public get transform():Transform + { + return this._transform; + } + + /** + * Whether or not the display object is visible. Display objects that are not + * visible are disabled. For example, if visible=false for an + * InteractiveObject instance, it cannot be clicked. + */ + public get visible():boolean + { + return this._explicitVisibility; + } + + public set visible(value:boolean) + { + if (this._explicitVisibility == value) + return; + + this._explicitVisibility = value; + + this._pUpdateImplicitVisibility(this._pParent? this._pParent._iIsVisible() : true); + } + + /** + * Indicates the width of the display object, in pixels. The width is + * calculated based on the bounds of the content of the display object. When + * you set the width property, the scaleX property + * is adjusted accordingly, as shown in the following code: + * + *

Except for TextField and Video objects, a display object with no + * content(such as an empty sprite) has a width of 0, even if you try to set + * width to a different value.

+ */ + public get width():number + { + if (this._pBoundsInvalid) + this.pUpdateBounds(); + + return this._width; + } + + public set width(val:number) + { + if (this._width == val) + return; + + this._width == val; + + this._pScaleX = val/this.bounds.aabb.width; + + this.invalidateScale(); + } + + /** + * + */ + public get worldBounds():BoundingVolumeBase + { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the bounds of the entity, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + if (this._worldBoundsInvalid) { + this._worldBoundsInvalid = false; + this._worldBounds.transformFrom(this.bounds, this.sceneTransform); + } + + return this._worldBounds; + } + + /** + * Indicates the x coordinate of the DisplayObject instance relative + * to the local coordinates of the parent DisplayObjectContainer. If the + * object is inside a DisplayObjectContainer that has transformations, it is + * in the local coordinate system of the enclosing DisplayObjectContainer. + * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the + * DisplayObjectContainer's children inherit a coordinate system that is + * rotated 90° counterclockwise. The object's coordinates refer to the + * registration point position. + */ + public get x():number + { + return this._x; + } + + public set x(val:number) + { + if (this._x == val) + return; + + this._x = val; + + this.invalidatePosition(); + } + + /** + * Indicates the y coordinate of the DisplayObject instance relative + * to the local coordinates of the parent DisplayObjectContainer. If the + * object is inside a DisplayObjectContainer that has transformations, it is + * in the local coordinate system of the enclosing DisplayObjectContainer. + * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the + * DisplayObjectContainer's children inherit a coordinate system that is + * rotated 90° counterclockwise. The object's coordinates refer to the + * registration point position. + */ + public get y():number + { + return this._y; + } + + public set y(val:number) + { + if (this._y == val) + return; + + this._y = val; + + this.invalidatePosition(); + } + + /** + * Indicates the z coordinate position along the z-axis of the DisplayObject + * instance relative to the 3D parent container. The z property is used for + * 3D coordinates, not screen or pixel coordinates. + * + *

When you set a z property for a display object to + * something other than the default value of 0, a corresponding + * Matrix3D object is automatically created. for adjusting a display object's + * position and orientation in three dimensions. When working with the + * z-axis, the existing behavior of x and y properties changes from screen or + * pixel coordinates to positions relative to the 3D parent container.

+ * + *

For example, a child of the _root at position x = 100, y = + * 100, z = 200 is not drawn at pixel location(100,100). The child is drawn + * wherever the 3D projection calculation puts it. The calculation is:

+ * + *

(x~~cameraFocalLength/cameraRelativeZPosition, + * y~~cameraFocalLength/cameraRelativeZPosition)

+ */ + public get z():number + { + return this._z; + } + + public set z(val:number) + { + if (this._z == val) + return; + + this._z = val; + + this.invalidatePosition(); + } + + /** + * + */ + public get zOffset():number + { + return this._zOffset; + } + + public set zOffset(value:number) + { + this._zOffset = value; + } + + /** + * Creates a new DisplayObject instance. + */ + constructor() + { + super(); + + // Cached vector of transformation components used when + // recomposing the transform matrix in updateTransform() + + this._transformComponents = new Array(3);//_transformComponents = new Vector.(3, true); + + this._transformComponents[0] = this._pos; + this._transformComponents[1] = this._rot; + this._transformComponents[2] = this._sca; + + //creation of associated transform object + this._transform = new Transform(this); + + this._matrix3D.identity(); + + this._flipY.appendScale(1, -1, 1); + + this._pBounds = this.pCreateDefaultBoundingVolume(); + + this._worldBounds = this.pCreateDefaultBoundingVolume(); + } + + /** + * + */ + public addEventListener(type:string, listener:Function) + { + super.addEventListener(type, listener); + + switch (type) { + case DisplayObjectEvent.POSITION_CHANGED: + this._listenToPositionChanged = true; + break; + case DisplayObjectEvent.ROTATION_CHANGED: + this._listenToRotationChanged = true; + break; + case DisplayObjectEvent.SCALE_CHANGED: + this._listenToScaleChanged = true; + break; + } + } + + /** + * + */ + public clone():DisplayObject + { + var clone:DisplayObject = new DisplayObject(); + clone.pivot = this.pivot; + clone._iMatrix3D = this._iMatrix3D; + clone.name = name; + + // todo: implement for all subtypes + return clone; + } + + /** + * + */ + public dispose() + { + if (this.parent) + this.parent.removeChild(this); + + while (this._pRenderables.length) + this._pRenderables[0].dispose(); + } + + /** + * @inheritDoc + */ + public disposeAsset() + { + this.dispose(); + } + + /** + * Returns a rectangle that defines the area of the display object relative + * to the coordinate system of the targetCoordinateSpace object. + * Consider the following code, which shows how the rectangle returned can + * vary depending on the targetCoordinateSpace parameter that + * you pass to the method: + * + *

Note: Use the localToGlobal() and + * globalToLocal() methods to convert the display object's local + * coordinates to display coordinates, or display coordinates to local + * coordinates, respectively.

+ * + *

The getBounds() method is similar to the + * getRect() method; however, the Rectangle returned by the + * getBounds() method includes any strokes on shapes, whereas + * the Rectangle returned by the getRect() method does not. For + * an example, see the description of the getRect() method.

+ * + * @param targetCoordinateSpace The display object that defines the + * coordinate system to use. + * @return The rectangle that defines the area of the display object relative + * to the targetCoordinateSpace object's coordinate + * system. + */ + public getBounds(targetCoordinateSpace:DisplayObject):Rectangle + { + return this._bounds; //TODO + } + + /** + * Returns a rectangle that defines the boundary of the display object, based + * on the coordinate system defined by the targetCoordinateSpace + * parameter, excluding any strokes on shapes. The values that the + * getRect() method returns are the same or smaller than those + * returned by the getBounds() method. + * + *

Note: Use localToGlobal() and + * globalToLocal() methods to convert the display object's local + * coordinates to Stage coordinates, or Stage coordinates to local + * coordinates, respectively.

+ * + * @param targetCoordinateSpace The display object that defines the + * coordinate system to use. + * @return The rectangle that defines the area of the display object relative + * to the targetCoordinateSpace object's coordinate + * system. + */ + public getRect(targetCoordinateSpace:DisplayObject):Rectangle + { + return this._bounds; //TODO + } + + /** + * Converts the point object from the Stage(global) coordinates + * to the display object's(local) coordinates. + * + *

To use this method, first create an instance of the Point class. The + * x and y values that you assign represent global coordinates + * because they relate to the origin(0,0) of the main display area. Then + * pass the Point instance as the parameter to the + * globalToLocal() method. The method returns a new Point object + * with x and y values that relate to the origin of the display + * object instead of the origin of the Stage.

+ * + * @param point An object created with the Point class. The Point object + * specifies the x and y coordinates as + * properties. + * @return A Point object with coordinates relative to the display object. + */ + public globalToLocal(point:Point):Point + { + return point; //TODO + } + + /** + * Converts a two-dimensional point from the Stage(global) coordinates to a + * three-dimensional display object's(local) coordinates. + * + *

To use this method, first create an instance of the Point class. The x + * and y values that you assign to the Point object represent global + * coordinates because they are relative to the origin(0,0) of the main + * display area. Then pass the Point object to the + * globalToLocal3D() method as the point parameter. + * The method returns three-dimensional coordinates as a Vector3D object + * containing x, y, and z values that + * are relative to the origin of the three-dimensional display object.

+ * + * @param point A two dimensional Point object representing global x and y + * coordinates. + * @return A Vector3D object with coordinates relative to the + * three-dimensional display object. + */ + public globalToLocal3D(point:Point):Vector3D + { + return new Vector3D(); //TODO + } + + /** + * Evaluates the bounding box of the display object to see if it overlaps or + * intersects with the bounding box of the obj display object. + * + * @param obj The display object to test against. + * @return true if the bounding boxes of the display objects + * intersect; false if not. + */ + public hitTestObject(obj:DisplayObject):boolean + { + return false; //TODO + } + + /** + * Evaluates the display object to see if it overlaps or intersects with the + * point specified by the x and y parameters. The + * x and y parameters specify a point in the + * coordinate space of the Stage, not the display object container that + * contains the display object(unless that display object container is the + * Stage). + * + * @param x The x coordinate to test against this object. + * @param y The y coordinate to test against this object. + * @param shapeFlag Whether to check against the actual pixels of the object + * (true) or the bounding box + * (false). + * @return true if the display object overlaps or intersects + * with the specified point; false otherwise. + */ + public hitTestPoint(x:number, y:number, shapeFlag:boolean = false):boolean + { + return false; //TODO + } + + /** + * @inheritDoc + */ + public isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean + { + var localRayPosition:Vector3D = this.inverseSceneTransform.transformVector(rayPosition); + var localRayDirection:Vector3D = this.inverseSceneTransform.deltaTransformVector(rayDirection); + var pickingCollisionVO:PickingCollisionVO = this._iPickingCollisionVO; + + if (!pickingCollisionVO.localNormal) + pickingCollisionVO.localNormal = new Vector3D(); + + var rayEntryDistance:number = this.bounds.rayIntersection(localRayPosition, localRayDirection, pickingCollisionVO.localNormal); + + if (rayEntryDistance < 0) + return false; + + pickingCollisionVO.rayEntryDistance = rayEntryDistance; + pickingCollisionVO.localRayPosition = localRayPosition; + pickingCollisionVO.localRayDirection = localRayDirection; + pickingCollisionVO.rayPosition = rayPosition; + pickingCollisionVO.rayDirection = rayDirection; + pickingCollisionVO.rayOriginIsInsideBounds = rayEntryDistance == 0; + + return true; + } + + /** + * Converts a three-dimensional point of the three-dimensional display + * object's(local) coordinates to a two-dimensional point in the Stage + * (global) coordinates. + * + *

For example, you can only use two-dimensional coordinates(x,y) to draw + * with the display.Graphics methods. To draw a + * three-dimensional object, you need to map the three-dimensional + * coordinates of a display object to two-dimensional coordinates. First, + * create an instance of the Vector3D class that holds the x-, y-, and z- + * coordinates of the three-dimensional display object. Then pass the + * Vector3D object to the local3DToGlobal() method as the + * point3d parameter. The method returns a two-dimensional Point + * object that can be used with the Graphics API to draw the + * three-dimensional object.

+ * + * @param point3d A Vector3D object containing either a three-dimensional + * point or the coordinates of the three-dimensional display + * object. + * @return A two-dimensional point representing a three-dimensional point in + * two-dimensional space. + */ + public local3DToGlobal(point3d:Vector3D):Point + { + return new Point(); //TODO + } + + /** + * Rotates the 3d object around to face a point defined relative to the local coordinates of the parent ObjectContainer3D. + * + * @param target The vector defining the point to be looked at + * @param upAxis An optional vector used to define the desired up orientation of the 3d object after rotation has occurred + */ + public lookAt(target:Vector3D, upAxis:Vector3D = null) + { + + var yAxis:Vector3D; + var zAxis:Vector3D; + var xAxis:Vector3D; + var raw:Array; + + if (upAxis == null) + upAxis = Vector3D.Y_AXIS; + else + upAxis.normalize(); + + zAxis = target.subtract(this._iMatrix3D.position); + zAxis.normalize(); + + xAxis = upAxis.crossProduct(zAxis); + xAxis.normalize(); + + if (xAxis.length < 0.05) { + xAxis.x = upAxis.y; + xAxis.y = upAxis.x; + xAxis.z = 0; + xAxis.normalize(); + } + + yAxis = zAxis.crossProduct(xAxis); + + raw = Matrix3DUtils.RAW_DATA_CONTAINER; + + raw[0] = xAxis.x; + raw[1] = xAxis.y; + raw[2] = xAxis.z; + raw[3] = 0; + + raw[4] = yAxis.x; + raw[5] = yAxis.y; + raw[6] = yAxis.z; + raw[7] = 0; + + raw[8] = zAxis.x; + raw[9] = zAxis.y; + raw[10] = zAxis.z; + raw[11] = 0; + + var m:Matrix3D = new Matrix3D(); + m.copyRawDataFrom(raw); + + var vec:Vector3D = m.decompose()[1]; + + this._rotationX = vec.x; + this._rotationY = vec.y; + this._rotationZ = vec.z; + + this.invalidateRotation(); + } + + /** + * Converts the point object from the display object's(local) + * coordinates to the Stage(global) coordinates. + * + *

This method allows you to convert any given x and y + * coordinates from values that are relative to the origin(0,0) of a + * specific display object(local coordinates) to values that are relative to + * the origin of the Stage(global coordinates).

+ * + *

To use this method, first create an instance of the Point class. The + * x and y values that you assign represent local coordinates + * because they relate to the origin of the display object.

+ * + *

You then pass the Point instance that you created as the parameter to + * the localToGlobal() method. The method returns a new Point + * object with x and y values that relate to the origin of the + * Stage instead of the origin of the display object.

+ * + * @param point The name or identifier of a point created with the Point + * class, specifying the x and y coordinates as + * properties. + * @return A Point object with coordinates relative to the Stage. + */ + public localToGlobal(point:Point):Point + { + return new Point(); //TODO + } + + /** + * Moves the 3d object directly to a point in space + * + * @param dx The amount of movement along the local x axis. + * @param dy The amount of movement along the local y axis. + * @param dz The amount of movement along the local z axis. + */ + + public moveTo(dx:number, dy:number, dz:number) + { + if (this._x == dx && this._y == dy && this._z == dz) + return; + + this._x = dx; + this._y = dy; + this._z = dz; + + this.invalidatePosition(); + } + + /** + * Moves the local point around which the object rotates. + * + * @param dx The amount of movement along the local x axis. + * @param dy The amount of movement along the local y axis. + * @param dz The amount of movement along the local z axis. + */ + public movePivot(dx:number, dy:number, dz:number) + { + if (this._pivot == null) + this._pivot = new Vector3D(); + + this._pivot.x += dx; + this._pivot.y += dy; + this._pivot.z += dz; + + this.invalidatePivot(); + } + + /** + * Rotates the 3d object around it's local x-axis + * + * @param angle The amount of rotation in degrees + */ + public pitch(angle:number) + { + this.rotate(Vector3D.X_AXIS, angle); + } + + /** + * + */ + public getRenderSceneTransform(camera:Camera):Matrix3D + { + if (this.orientationMode == OrientationMode.CAMERA_PLANE) { + var comps:Array = camera.sceneTransform.decompose(); + var scale:Vector3D = comps[2]; + comps[0] = this.scenePosition; + scale.x = this._pScaleX; + scale.y = this._pScaleY; + scale.z = this._pScaleZ; + this._orientationMatrix.recompose(comps); + + //add in case of pivot + if (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) + this._orientationMatrix.prependTranslation(-this._pivot.x/this._pScaleX, -this._pivot.y/this._pScaleY, -this._pivot.z/this._pScaleZ); + + return this._orientationMatrix; + } + + return this.sceneTransform; + } + + /** + * Rotates the 3d object around it's local z-axis + * + * @param angle The amount of rotation in degrees + */ + public roll(angle:number) + { + this.rotate(Vector3D.Z_AXIS, angle); + } + + /** + * Rotates the 3d object around an axis by a defined angle + * + * @param axis The vector defining the axis of rotation + * @param angle The amount of rotation in degrees + */ + public rotate(axis:Vector3D, angle:number) + { + var m:Matrix3D = new Matrix3D(); + m.prependRotation(angle, axis); + + var vec:Vector3D = m.decompose()[1]; + + this._rotationX += vec.x; + this._rotationY += vec.y; + this._rotationZ += vec.z; + + this.invalidateRotation(); + } + + /** + * Rotates the 3d object directly to a euler angle + * + * @param ax The angle in degrees of the rotation around the x axis. + * @param ay The angle in degrees of the rotation around the y axis. + * @param az The angle in degrees of the rotation around the z axis. + */ + public rotateTo(ax:number, ay:number, az:number) + { + this._rotationX = ax*MathConsts.DEGREES_TO_RADIANS; + this._rotationY = ay*MathConsts.DEGREES_TO_RADIANS; + this._rotationZ = az*MathConsts.DEGREES_TO_RADIANS; + + this.invalidateRotation(); + } + + /** + * + */ + public removeEventListener(type:string, listener:Function) + { + super.removeEventListener(type, listener); + + if (this.hasEventListener(type, listener)) + return; + + switch (type) { + case DisplayObjectEvent.POSITION_CHANGED: + this._listenToPositionChanged = false; + break; + + case DisplayObjectEvent.ROTATION_CHANGED: + this._listenToRotationChanged = false; + break; + + case DisplayObjectEvent.SCALE_CHANGED: + this._listenToScaleChanged = false; + break; + } + } + + /** + * Moves the 3d object along a vector by a defined length + * + * @param axis The vector defining the axis of movement + * @param distance The length of the movement + */ + public translate(axis:Vector3D, distance:number) + { + var x:number = axis.x, y:number = axis.y, z:number = axis.z; + var len:number = distance/Math.sqrt(x*x + y*y + z*z); + + this._x += x*len; + this._y += y*len; + this._z += z*len; + + this.invalidatePosition(); + } + + /** + * Moves the 3d object along a vector by a defined length + * + * @param axis The vector defining the axis of movement + * @param distance The length of the movement + */ + public translateLocal(axis:Vector3D, distance:number) + { + var x:number = axis.x, y:number = axis.y, z:number = axis.z; + var len:number = distance/Math.sqrt(x*x + y*y + z*z); + + this._iMatrix3D.prependTranslation(x*len, y*len, z*len); + + this._matrix3D.copyColumnTo(3, this._pos); + + this._x = this._pos.x; + this._y = this._pos.y; + this._z = this._pos.z; + + this.invalidatePosition(); + } + + /** + * Rotates the 3d object around it's local y-axis + * + * @param angle The amount of rotation in degrees + */ + public yaw(angle:number) + { + this.rotate(Vector3D.Y_AXIS, angle); + } + + /** + * @internal + */ + public _iController:ControllerBase; + + /** + * @internal + */ + public get _iAssignedPartition():Partition + { + return this._pImplicitPartition; + } + + /** + * The transformation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + * + * @internal + */ + public get _iMatrix3D():Matrix3D + { + if (this._matrix3DDirty) + this._pUpdateMatrix3D(); + + return this._matrix3D; + } + + public set _iMatrix3D(val:Matrix3D) + { + + // TODO: From AS3 - Do we still need this in JS ? + //ridiculous matrix error + /* + if (!val.rawData[0]) { + + var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + val.copyRawDataTo(raw); + raw[0] = this._smallestNumber; + val.copyRawDataFrom(raw); + } + //*/ + var elements:Array = val.decompose(); + var vec:Vector3D; + + vec = elements[0]; + + if (this._x != vec.x || this._y != vec.y || this._z != vec.z) { + this._x = vec.x; + this._y = vec.y; + this._z = vec.z; + + this.invalidatePosition(); + } + + vec = elements[1]; + + if (this._rotationX != vec.x || this._rotationY != vec.y || this._rotationZ != vec.z) { + this._rotationX = vec.x; + this._rotationY = vec.y; + this._rotationZ = vec.z; + + this.invalidateRotation(); + } + + vec = elements[2]; + + if (this._pScaleX != vec.x || this._pScaleY != vec.y || this._pScaleZ != vec.z) { + this._pScaleX = vec.x; + this._pScaleY = vec.y; + this._pScaleZ = vec.z; + + this.invalidateScale(); + } + } + + /** + * @internal + */ + public get _iPickingCollisionVO():PickingCollisionVO + { + if (!this._pPickingCollisionVO) + this._pPickingCollisionVO = new PickingCollisionVO(this); + + return this._pPickingCollisionVO; + } + + /** + * @internal + */ + public iSetParent(value:DisplayObjectContainer) + { + this._pParent = value; + + if (value) { + this._pUpdateImplicitMouseEnabled(value.mouseChildren); + this._pUpdateImplicitVisibility(value._iIsVisible()); + this._pUpdateImplicitPartition(value._iAssignedPartition); + this._iSetScene(value._pScene); + } else { + this._pUpdateImplicitMouseEnabled(true); + this._pUpdateImplicitVisibility(true); + this._pUpdateImplicitPartition(null); + + this._iSetScene(null); + } + } + + /** + * @protected + */ + public pCreateDefaultBoundingVolume():BoundingVolumeBase + { + // point lights should be using sphere bounds + // directional lights should be using null bounds + return new AxisAlignedBoundingBox(); + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():EntityNode + { + throw new AbstractMethodError(); + } + + /** + * @protected + */ + public pInvalidateBounds() + { + this._pBoundsInvalid = true; + this._worldBoundsInvalid = true; + + + if (this.isEntity) + this.invalidatePartition(); + } + + /** + * @protected + */ + public pInvalidateSceneTransform() + { + this._pSceneTransformDirty = !this._pIgnoreTransform; + this._inverseSceneTransformDirty = !this._pIgnoreTransform; + this._scenePositionDirty = !this._pIgnoreTransform; + + this._worldBoundsInvalid = !this._pIgnoreTransform; + + if (this.isEntity) + this.invalidatePartition(); + + if (this._listenToSceneTransformChanged) + this.notifySceneTransformChange(); + } + + /** + * @protected + */ + public pUpdateBounds() + { + this._width = this._pBounds.aabb.width*this._pScaleX; + this._height = this._pBounds.aabb.height*this._pScaleY; + this._depth = this._pBounds.aabb.depth*this._pScaleZ; + + this._pBoundsInvalid = false; + } + + /** + * @protected + */ + public _pUpdateImplicitMouseEnabled(value:boolean) + { + this._pImplicitMouseEnabled = this._explicitMouseEnabled && value; + + // If there is a parent and this child does not have a picking collider, use its parent's picking collider. + if (this._pImplicitMouseEnabled && this._pParent && !this._pPickingCollider) + this._pPickingCollider = this._pParent._pPickingCollider; + } + + /** + * @protected + */ + public _pUpdateImplicitPartition(value:Partition) + { + // assign parent implicit partition if no explicit one is given + this._pImplicitPartition = this._explicitPartition || value; + } + + /** + * @protected + */ + public _pUpdateImplicitVisibility(value:boolean) + { + this._pImplicitVisibility = this._explicitVisibility && value; + } + + /** + * @protected + */ + public _pUpdateMatrix3D() + { + + this._pos.x = this._x; + this._pos.y = this._y; + this._pos.z = this._z; + + this._rot.x = this._rotationX; + this._rot.y = this._rotationY; + this._rot.z = this._rotationZ; + + this._sca.x = this._pScaleX; + this._sca.y = this._pScaleY; + this._sca.z = this._pScaleZ; + + this._matrix3D.recompose(this._transformComponents); + + if (!this._pivotZero) { + this._matrix3D.prependTranslation(-this._pivot.x/this._pScaleX, -this._pivot.y/this._pScaleY, -this._pivot.z/this._pScaleZ); + if (this.alignmentMode != AlignmentMode.PIVOT_POINT) + this._matrix3D.appendTranslation(this._pivot.x, this._pivot.y, this._pivot.z); + } + + this._matrix3DDirty = false; + this._positionDirty = false; + this._rotationDirty = false; + this._scaleDirty = false; + this._pivotDirty = false; + } + + /** + * @protected + */ + public pUpdateSceneTransform() + { + if (this._pParent && !this._pParent._iIsRoot) { + this._pSceneTransform.copyFrom(this._pParent.sceneTransform); + this._pSceneTransform.prepend(this._iMatrix3D); + } else { + this._pSceneTransform.copyFrom(this._iMatrix3D); + } + + this._pSceneTransformDirty = false; + } + + public _iAddRenderable(renderable:IRenderable):IRenderable + { + this._pRenderables.push(renderable); + + return renderable; + } + + + public _iRemoveRenderable(renderable:IRenderable):IRenderable + { + var index:number = this._pRenderables.indexOf(renderable); + + this._pRenderables.splice(index, 1); + + return renderable; + } + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + public _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean + { + return false; + } + + /** + * + */ + public _iInternalUpdate() + { + if (this._iController) + this._iController.update(); + } + + /** + * @internal + */ + public _iIsVisible():boolean + { + return this._pImplicitVisibility; + } + + /** + * @internal + */ + public _iIsMouseEnabled():boolean + { + return this._pImplicitMouseEnabled; + } + + /** + * @internal + */ + public _iSetScene(value:Scene) + { + // test to see if we're switching roots while we're already using a scene partition + /* + if (value == null) + this._oldScene = this._pScene; + + if (this._explicitPartition && this._oldScene && this._oldScene != this._pScene) + this.partition = null; + + if (value) + this._oldScene = null; + + // end of stupid partition test code + //*/ + + if (this._pScene == value) + return; + + this._pUpdateScene(value); + + if (!this._pSceneTransformDirty && !this._pIgnoreTransform) + this.pInvalidateSceneTransform(); + } + + /** + * @protected + */ + public _pUpdateScene(value:Scene) + { + if (this._pScene) { + this._pScene.dispatchEvent(new SceneEvent(SceneEvent.REMOVED_FROM_SCENE, this)); + + //unregister entity from current scene + this._pScene.iUnregisterEntity(this); + } + + this._pScene = value; + + if (value) { + value.dispatchEvent(new SceneEvent(SceneEvent.ADDED_TO_SCENE, this)); + + //register entity with new scene + value.iRegisterEntity(this); + } + + this.notifySceneChange(); + } + + /** + * @private + */ + private notifyPositionChanged() + { + if (!this._positionChanged) + this._positionChanged = new DisplayObjectEvent(DisplayObjectEvent.POSITION_CHANGED, this); + + this.dispatchEvent(this._positionChanged); + } + + /** + * @private + */ + private notifyRotationChanged() + { + if (!this._rotationChanged) + this._rotationChanged = new DisplayObjectEvent(DisplayObjectEvent.ROTATION_CHANGED, this); + + this.dispatchEvent(this._rotationChanged); + } + + /** + * @private + */ + private notifyScaleChanged() + { + if (!this._scaleChanged) + this._scaleChanged = new DisplayObjectEvent(DisplayObjectEvent.SCALE_CHANGED, this); + + this.dispatchEvent(this._scaleChanged); + } + + /** + * @private + */ + private notifySceneChange() + { + if (this._listenToSceneChanged) { + if (!this._scenechanged) + this._scenechanged = new DisplayObjectEvent(DisplayObjectEvent.SCENE_CHANGED, this); + + this.dispatchEvent(this._scenechanged); + } + } + + /** + * @private + */ + private notifySceneTransformChange() + { + if (!this._sceneTransformChanged) + this._sceneTransformChanged = new DisplayObjectEvent(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this); + + this.dispatchEvent(this._sceneTransformChanged); + } + + /** + * Invalidates the 3D transformation matrix, causing it to be updated upon the next request + * + * @private + */ + private invalidateMatrix3D():void + { + if (this._matrix3DDirty) + return; + + this._matrix3DDirty = true; + + if (!this._pSceneTransformDirty && !this._pIgnoreTransform) + this.pInvalidateSceneTransform(); + } + + /** + * @private + */ + private invalidatePartition() + { + if (this._iAssignedPartition) + this._iAssignedPartition.iMarkForUpdate(this); + } + + /** + * @private + */ + private invalidatePivot() + { + this._pivotZero = (this._pivot.x == 0) && (this._pivot.y == 0) && (this._pivot.z == 0); + + if (this._pivotDirty) + return; + + this._pivotDirty = true; + + this.invalidateMatrix3D(); + } + + /** + * @private + */ + private invalidatePosition() + { + if (this._positionDirty) + return; + + this._positionDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToPositionChanged) + this.notifyPositionChanged(); + } + + /** + * @private + */ + private invalidateRotation() + { + if (this._rotationDirty) + return; + + this._rotationDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToRotationChanged) + this.notifyRotationChanged(); + } + + /** + * @private + */ + private invalidateScale() + { + if (this._scaleDirty) + return; + + this._scaleDirty = true; + + this.invalidateMatrix3D(); + + if (this._listenToScaleChanged) + this.notifyScaleChanged(); + } +} + +export = DisplayObject; \ No newline at end of file diff --git a/lib/core/base/Geometry.js b/lib/core/base/Geometry.js new file mode 100755 index 00000000..11a293c0 --- /dev/null +++ b/lib/core/base/Geometry.js @@ -0,0 +1,155 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +var GeometryEvent = require("awayjs-core/lib/events/GeometryEvent"); + +/** +* +* Geometry is a collection of SubGeometries, each of which contain the actual geometrical data such as vertices, +* normals, uvs, etc. It also contains a reference to an animation class, which defines how the geometry moves. +* A Geometry object is assigned to a Mesh, a scene graph occurence of the geometry, which in turn assigns +* the SubGeometries to its respective TriangleSubMesh objects. +* +* +* +* @see away.core.base.SubGeometry +* @see away.entities.Mesh +* +* @class Geometry +*/ +var Geometry = (function (_super) { + __extends(Geometry, _super); + /** + * Creates a new Geometry object. + */ + function Geometry() { + _super.call(this); + + this._subGeometries = new Array(); + } + Object.defineProperty(Geometry.prototype, "assetType", { + get: function () { + return AssetType.GEOMETRY; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Geometry.prototype, "subGeometries", { + /** + * A collection of TriangleSubGeometry objects, each of which contain geometrical data such as vertices, normals, etc. + */ + get: function () { + return this._subGeometries; + }, + enumerable: true, + configurable: true + }); + + Geometry.prototype.getSubGeometries = function () { + return this._subGeometries; + }; + + Geometry.prototype.applyTransformation = function (transform) { + var len = this._subGeometries.length; + for (var i = 0; i < len; ++i) + this._subGeometries[i].applyTransformation(transform); + }; + + /** + * Adds a new TriangleSubGeometry object to the list. + * @param subGeometry The TriangleSubGeometry object to be added. + */ + Geometry.prototype.addSubGeometry = function (subGeometry) { + this._subGeometries.push(subGeometry); + + subGeometry.parentGeometry = this; + + if (this.hasEventListener(GeometryEvent.SUB_GEOMETRY_ADDED)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.SUB_GEOMETRY_ADDED, subGeometry)); + + this.iInvalidateBounds(subGeometry); + }; + + /** + * Removes a new TriangleSubGeometry object from the list. + * @param subGeometry The TriangleSubGeometry object to be removed. + */ + Geometry.prototype.removeSubGeometry = function (subGeometry) { + this._subGeometries.splice(this._subGeometries.indexOf(subGeometry), 1); + + subGeometry.parentGeometry = null; + + if (this.hasEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.SUB_GEOMETRY_REMOVED, subGeometry)); + + this.iInvalidateBounds(subGeometry); + }; + + /** + * Clones the geometry. + * @return An exact duplicate of the current Geometry object. + */ + Geometry.prototype.clone = function () { + var clone = new Geometry(); + var len = this._subGeometries.length; + + for (var i = 0; i < len; ++i) + clone.addSubGeometry(this._subGeometries[i].clone()); + + return clone; + }; + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + Geometry.prototype.scale = function (scale) { + var numSubGeoms = this._subGeometries.length; + for (var i = 0; i < numSubGeoms; ++i) + this._subGeometries[i].scale(scale); + }; + + /** + * Clears all resources used by the Geometry object, including SubGeometries. + */ + Geometry.prototype.dispose = function () { + var numSubGeoms = this._subGeometries.length; + + for (var i = 0; i < numSubGeoms; ++i) { + var subGeom = this._subGeometries[0]; + this.removeSubGeometry(subGeom); + subGeom.dispose(); + } + }; + + /** + * Scales the uv coordinates (tiling) + * @param scaleU The amount by which to scale on the u axis. Default is 1; + * @param scaleV The amount by which to scale on the v axis. Default is 1; + */ + Geometry.prototype.scaleUV = function (scaleU, scaleV) { + if (typeof scaleU === "undefined") { scaleU = 1; } + if (typeof scaleV === "undefined") { scaleV = 1; } + var numSubGeoms = this._subGeometries.length; + + for (var i = 0; i < numSubGeoms; ++i) + this._subGeometries[i].scaleUV(scaleU, scaleV); + }; + + Geometry.prototype.iInvalidateBounds = function (subGeom) { + if (this.hasEventListener(GeometryEvent.BOUNDS_INVALID)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.BOUNDS_INVALID, subGeom)); + }; + return Geometry; +})(NamedAssetBase); + +module.exports = Geometry; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9HZW9tZXRyeS50cyJdLCJuYW1lcyI6WyJHZW9tZXRyeSIsIkdlb21ldHJ5LmNvbnN0cnVjdG9yIiwiR2VvbWV0cnkuZ2V0U3ViR2VvbWV0cmllcyIsIkdlb21ldHJ5LmFwcGx5VHJhbnNmb3JtYXRpb24iLCJHZW9tZXRyeS5hZGRTdWJHZW9tZXRyeSIsIkdlb21ldHJ5LnJlbW92ZVN1Ykdlb21ldHJ5IiwiR2VvbWV0cnkuY2xvbmUiLCJHZW9tZXRyeS5zY2FsZSIsIkdlb21ldHJ5LmRpc3Bvc2UiLCJHZW9tZXRyeS5zY2FsZVVWIiwiR2VvbWV0cnkuaUludmFsaWRhdGVCb3VuZHMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGlFQUV3RTs7QUFFeEUsMkVBQWlGO0FBQ2pGLG1FQUF5RTs7QUFFekU7Ozs7Ozs7Ozs7Ozs7RUFhRztBQUNIO0lBQXVCQSwyQkFBY0E7SUF5QnBDQTs7TUFER0E7SUFDSEE7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBLEtBQUtBLENBQWtCQSxDQUFDQTtJQUNuREEsQ0FBQ0E7SUExQkREO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLFNBQVNBLENBQUNBLFFBQVFBO1FBQzFCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsY0FBY0E7UUFDM0JBLENBQUNBOzs7O0FBQUFBO0lBRURBLHNDQUFBQTtRQUVDRSxPQUFPQSxJQUFJQSxDQUFDQSxjQUFjQTtJQUMzQkEsQ0FBQ0E7O0lBWURGLHlDQUFBQSxVQUEyQkEsU0FBa0JBO1FBRTVDRyxJQUFJQSxHQUFHQSxHQUFVQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQTtRQUMzQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsRUFBRUEsQ0FBQ0E7WUFDbENBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7SUFDeERBLENBQUNBOztJQU1ESDs7O01BREdBO3dDQUNIQSxVQUFzQkEsV0FBMkJBO1FBRWhESSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQTs7UUFFckNBLFdBQVdBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBOztRQUVqQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxhQUFhQSxDQUFDQSxrQkFBa0JBLENBQUNBO1lBQzFEQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxJQUFJQSxhQUFhQSxDQUFDQSxhQUFhQSxDQUFDQSxrQkFBa0JBLEVBQUVBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBOztRQUV0RkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxXQUFXQSxDQUFDQTtJQUNwQ0EsQ0FBQ0E7O0lBTURKOzs7TUFER0E7MkNBQ0hBLFVBQXlCQSxXQUEyQkE7UUFFbkRLLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLE9BQU9BLENBQUNBLFdBQVdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBOztRQUV2RUEsV0FBV0EsQ0FBQ0EsY0FBY0EsR0FBR0EsSUFBSUE7O1FBRWpDQSxJQUFJQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGFBQWFBLENBQUNBLG9CQUFvQkEsQ0FBQ0E7WUFDNURBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLElBQUlBLGFBQWFBLENBQUNBLGFBQWFBLENBQUNBLG9CQUFvQkEsRUFBRUEsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRXhGQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFdBQVdBLENBQUNBO0lBQ3BDQSxDQUFDQTs7SUFNREw7OztNQURHQTsrQkFDSEE7UUFFQ00sSUFBSUEsS0FBS0EsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7UUFDbkNBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BOztRQUUzQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsRUFBRUEsQ0FBQ0E7WUFDbENBLEtBQUtBLENBQUNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBOztRQUV0REEsT0FBT0EsS0FBS0E7SUFDYkEsQ0FBQ0E7O0lBTUROOzs7TUFER0E7K0JBQ0hBLFVBQWFBLEtBQVlBO1FBRXhCTyxJQUFJQSxXQUFXQSxHQUFVQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQTtRQUNuREEsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsV0FBV0EsRUFBRUEsRUFBRUEsQ0FBQ0E7WUFDMUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0lBQ3RDQSxDQUFDQTs7SUFLRFA7O01BREdBO2lDQUNIQTtRQUVDUSxJQUFJQSxXQUFXQSxHQUFVQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQTs7UUFFbkRBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLFdBQVdBLEVBQUVBLEVBQUVBLENBQUNBLENBQUVBO1lBQzVDQSxJQUFJQSxPQUFPQSxHQUFtQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDcERBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7WUFDL0JBLE9BQU9BLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO1NBQ2pCQTtJQUNGQSxDQUFDQTs7SUFPRFI7Ozs7TUFER0E7aUNBQ0hBLFVBQWVBLE1BQWlCQSxFQUFFQSxNQUFpQkE7UUFBcENTLHFDQUFBQSxNQUFNQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxxQ0FBQUEsTUFBTUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFFbERBLElBQUlBLFdBQVdBLEdBQVVBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BOztRQUVuREEsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsV0FBV0EsRUFBRUEsRUFBRUEsQ0FBQ0E7WUFDMUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLE1BQU1BLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBO0lBQ2pEQSxDQUFDQTs7SUFFRFQsdUNBQUFBLFVBQXlCQSxPQUF1QkE7UUFFL0NVLElBQUlBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsY0FBY0EsQ0FBQ0E7WUFDdERBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLElBQUlBLGFBQWFBLENBQUNBLGFBQWFBLENBQUNBLGNBQWNBLEVBQUVBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO0lBQy9FQSxDQUFDQTtJQUNGVixnQkFBQ0E7QUFBREEsQ0FBQ0EsRUFqSXNCLGNBQWMsRUFpSXBDOztBQUVELHlCQUFrQixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9HZW9tZXRyeS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTdWJHZW9tZXRyeUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1N1Ykdlb21ldHJ5QmFzZVwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IEFzc2V0VHlwZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldFR5cGVcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IE5hbWVkQXNzZXRCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9OYW1lZEFzc2V0QmFzZVwiKTtcbmltcG9ydCBHZW9tZXRyeUV2ZW50XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9HZW9tZXRyeUV2ZW50XCIpO1xuXG4vKipcbiAqXG4gKiBHZW9tZXRyeSBpcyBhIGNvbGxlY3Rpb24gb2YgU3ViR2VvbWV0cmllcywgZWFjaCBvZiB3aGljaCBjb250YWluIHRoZSBhY3R1YWwgZ2VvbWV0cmljYWwgZGF0YSBzdWNoIGFzIHZlcnRpY2VzLFxuICogbm9ybWFscywgdXZzLCBldGMuIEl0IGFsc28gY29udGFpbnMgYSByZWZlcmVuY2UgdG8gYW4gYW5pbWF0aW9uIGNsYXNzLCB3aGljaCBkZWZpbmVzIGhvdyB0aGUgZ2VvbWV0cnkgbW92ZXMuXG4gKiBBIEdlb21ldHJ5IG9iamVjdCBpcyBhc3NpZ25lZCB0byBhIE1lc2gsIGEgc2NlbmUgZ3JhcGggb2NjdXJlbmNlIG9mIHRoZSBnZW9tZXRyeSwgd2hpY2ggaW4gdHVybiBhc3NpZ25zXG4gKiB0aGUgU3ViR2VvbWV0cmllcyB0byBpdHMgcmVzcGVjdGl2ZSBUcmlhbmdsZVN1Yk1lc2ggb2JqZWN0cy5cbiAqXG4gKlxuICpcbiAqIEBzZWUgYXdheS5jb3JlLmJhc2UuU3ViR2VvbWV0cnlcbiAqIEBzZWUgYXdheS5lbnRpdGllcy5NZXNoXG4gKlxuICogQGNsYXNzIEdlb21ldHJ5XG4gKi9cbmNsYXNzIEdlb21ldHJ5IGV4dGVuZHMgTmFtZWRBc3NldEJhc2UgaW1wbGVtZW50cyBJQXNzZXRcbntcblx0cHJpdmF0ZSBfc3ViR2VvbWV0cmllczpBcnJheTxTdWJHZW9tZXRyeUJhc2U+O1xuXG5cdHB1YmxpYyBnZXQgYXNzZXRUeXBlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRUeXBlLkdFT01FVFJZO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgY29sbGVjdGlvbiBvZiBUcmlhbmdsZVN1Ykdlb21ldHJ5IG9iamVjdHMsIGVhY2ggb2Ygd2hpY2ggY29udGFpbiBnZW9tZXRyaWNhbCBkYXRhIHN1Y2ggYXMgdmVydGljZXMsIG5vcm1hbHMsIGV0Yy5cblx0ICovXG5cdHB1YmxpYyBnZXQgc3ViR2VvbWV0cmllcygpOkFycmF5PFN1Ykdlb21ldHJ5QmFzZT5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9zdWJHZW9tZXRyaWVzO1xuXHR9XG5cblx0cHVibGljIGdldFN1Ykdlb21ldHJpZXMoKTpBcnJheTxTdWJHZW9tZXRyeUJhc2U+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc3ViR2VvbWV0cmllcztcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IEdlb21ldHJ5IG9iamVjdC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9zdWJHZW9tZXRyaWVzID0gbmV3IEFycmF5PFN1Ykdlb21ldHJ5QmFzZT4oKTtcblx0fVxuXG5cdHB1YmxpYyBhcHBseVRyYW5zZm9ybWF0aW9uKHRyYW5zZm9ybTpNYXRyaXgzRClcblx0e1xuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fc3ViR2VvbWV0cmllcy5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyArK2kpXG5cdFx0XHR0aGlzLl9zdWJHZW9tZXRyaWVzW2ldLmFwcGx5VHJhbnNmb3JtYXRpb24odHJhbnNmb3JtKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIGEgbmV3IFRyaWFuZ2xlU3ViR2VvbWV0cnkgb2JqZWN0IHRvIHRoZSBsaXN0LlxuXHQgKiBAcGFyYW0gc3ViR2VvbWV0cnkgVGhlIFRyaWFuZ2xlU3ViR2VvbWV0cnkgb2JqZWN0IHRvIGJlIGFkZGVkLlxuXHQgKi9cblx0cHVibGljIGFkZFN1Ykdlb21ldHJ5KHN1Ykdlb21ldHJ5OlN1Ykdlb21ldHJ5QmFzZSlcblx0e1xuXHRcdHRoaXMuX3N1Ykdlb21ldHJpZXMucHVzaChzdWJHZW9tZXRyeSk7XG5cblx0XHRzdWJHZW9tZXRyeS5wYXJlbnRHZW9tZXRyeSA9IHRoaXM7XG5cblx0XHRpZiAodGhpcy5oYXNFdmVudExpc3RlbmVyKEdlb21ldHJ5RXZlbnQuU1VCX0dFT01FVFJZX0FEREVEKSlcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgR2VvbWV0cnlFdmVudChHZW9tZXRyeUV2ZW50LlNVQl9HRU9NRVRSWV9BRERFRCwgc3ViR2VvbWV0cnkpKTtcblxuXHRcdHRoaXMuaUludmFsaWRhdGVCb3VuZHMoc3ViR2VvbWV0cnkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBuZXcgVHJpYW5nbGVTdWJHZW9tZXRyeSBvYmplY3QgZnJvbSB0aGUgbGlzdC5cblx0ICogQHBhcmFtIHN1Ykdlb21ldHJ5IFRoZSBUcmlhbmdsZVN1Ykdlb21ldHJ5IG9iamVjdCB0byBiZSByZW1vdmVkLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVN1Ykdlb21ldHJ5KHN1Ykdlb21ldHJ5OlN1Ykdlb21ldHJ5QmFzZSlcblx0e1xuXHRcdHRoaXMuX3N1Ykdlb21ldHJpZXMuc3BsaWNlKHRoaXMuX3N1Ykdlb21ldHJpZXMuaW5kZXhPZihzdWJHZW9tZXRyeSksIDEpO1xuXG5cdFx0c3ViR2VvbWV0cnkucGFyZW50R2VvbWV0cnkgPSBudWxsO1xuXG5cdFx0aWYgKHRoaXMuaGFzRXZlbnRMaXN0ZW5lcihHZW9tZXRyeUV2ZW50LlNVQl9HRU9NRVRSWV9SRU1PVkVEKSlcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgR2VvbWV0cnlFdmVudChHZW9tZXRyeUV2ZW50LlNVQl9HRU9NRVRSWV9SRU1PVkVELCBzdWJHZW9tZXRyeSkpO1xuXG5cdFx0dGhpcy5pSW52YWxpZGF0ZUJvdW5kcyhzdWJHZW9tZXRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvbmVzIHRoZSBnZW9tZXRyeS5cblx0ICogQHJldHVybiBBbiBleGFjdCBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgR2VvbWV0cnkgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGNsb25lKCk6R2VvbWV0cnlcblx0e1xuXHRcdHZhciBjbG9uZTpHZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fc3ViR2VvbWV0cmllcy5sZW5ndGg7XG5cblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCBsZW47ICsraSlcblx0XHRcdGNsb25lLmFkZFN1Ykdlb21ldHJ5KHRoaXMuX3N1Ykdlb21ldHJpZXNbaV0uY2xvbmUoKSk7XG5cblx0XHRyZXR1cm4gY2xvbmU7XG5cdH1cblxuXHQvKipcblx0ICogU2NhbGVzIHRoZSBnZW9tZXRyeS5cblx0ICogQHBhcmFtIHNjYWxlIFRoZSBhbW91bnQgYnkgd2hpY2ggdG8gc2NhbGUuXG5cdCAqL1xuXHRwdWJsaWMgc2NhbGUoc2NhbGU6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIG51bVN1Ykdlb21zOm51bWJlciA9IHRoaXMuX3N1Ykdlb21ldHJpZXMubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IG51bVN1Ykdlb21zOyArK2kpXG5cdFx0XHR0aGlzLl9zdWJHZW9tZXRyaWVzW2ldLnNjYWxlKHNjYWxlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbGVhcnMgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBHZW9tZXRyeSBvYmplY3QsIGluY2x1ZGluZyBTdWJHZW9tZXRyaWVzLlxuXHQgKi9cblx0cHVibGljIGRpc3Bvc2UoKVxuXHR7XG5cdFx0dmFyIG51bVN1Ykdlb21zOm51bWJlciA9IHRoaXMuX3N1Ykdlb21ldHJpZXMubGVuZ3RoO1xuXG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbnVtU3ViR2VvbXM7ICsraSkge1xuXHRcdFx0dmFyIHN1Ykdlb206U3ViR2VvbWV0cnlCYXNlID0gdGhpcy5fc3ViR2VvbWV0cmllc1swXTtcblx0XHRcdHRoaXMucmVtb3ZlU3ViR2VvbWV0cnkoc3ViR2VvbSk7XG5cdFx0XHRzdWJHZW9tLmRpc3Bvc2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogU2NhbGVzIHRoZSB1diBjb29yZGluYXRlcyAodGlsaW5nKVxuXHQgKiBAcGFyYW0gc2NhbGVVIFRoZSBhbW91bnQgYnkgd2hpY2ggdG8gc2NhbGUgb24gdGhlIHUgYXhpcy4gRGVmYXVsdCBpcyAxO1xuXHQgKiBAcGFyYW0gc2NhbGVWIFRoZSBhbW91bnQgYnkgd2hpY2ggdG8gc2NhbGUgb24gdGhlIHYgYXhpcy4gRGVmYXVsdCBpcyAxO1xuXHQgKi9cblx0cHVibGljIHNjYWxlVVYoc2NhbGVVOm51bWJlciA9IDEsIHNjYWxlVjpudW1iZXIgPSAxKVxuXHR7XG5cdFx0dmFyIG51bVN1Ykdlb21zOm51bWJlciA9IHRoaXMuX3N1Ykdlb21ldHJpZXMubGVuZ3RoO1xuXG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbnVtU3ViR2VvbXM7ICsraSlcblx0XHRcdHRoaXMuX3N1Ykdlb21ldHJpZXNbaV0uc2NhbGVVVihzY2FsZVUsIHNjYWxlVik7XG5cdH1cblxuXHRwdWJsaWMgaUludmFsaWRhdGVCb3VuZHMoc3ViR2VvbTpTdWJHZW9tZXRyeUJhc2UpXG5cdHtcblx0XHRpZiAodGhpcy5oYXNFdmVudExpc3RlbmVyKEdlb21ldHJ5RXZlbnQuQk9VTkRTX0lOVkFMSUQpKVxuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBHZW9tZXRyeUV2ZW50KEdlb21ldHJ5RXZlbnQuQk9VTkRTX0lOVkFMSUQsIHN1Ykdlb20pKTtcblx0fVxufVxuXG5leHBvcnQgPSBHZW9tZXRyeTsiXX0= \ No newline at end of file diff --git a/lib/core/base/Geometry.ts b/lib/core/base/Geometry.ts new file mode 100644 index 00000000..9ea6193d --- /dev/null +++ b/lib/core/base/Geometry.ts @@ -0,0 +1,153 @@ +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import GeometryEvent = require("awayjs-core/lib/events/GeometryEvent"); + +/** + * + * Geometry is a collection of SubGeometries, each of which contain the actual geometrical data such as vertices, + * normals, uvs, etc. It also contains a reference to an animation class, which defines how the geometry moves. + * A Geometry object is assigned to a Mesh, a scene graph occurence of the geometry, which in turn assigns + * the SubGeometries to its respective TriangleSubMesh objects. + * + * + * + * @see away.core.base.SubGeometry + * @see away.entities.Mesh + * + * @class Geometry + */ +class Geometry extends NamedAssetBase implements IAsset +{ + private _subGeometries:Array; + + public get assetType():string + { + return AssetType.GEOMETRY; + } + + /** + * A collection of TriangleSubGeometry objects, each of which contain geometrical data such as vertices, normals, etc. + */ + public get subGeometries():Array + { + return this._subGeometries; + } + + public getSubGeometries():Array + { + return this._subGeometries; + } + + /** + * Creates a new Geometry object. + */ + constructor() + { + super(); + + this._subGeometries = new Array(); + } + + public applyTransformation(transform:Matrix3D) + { + var len:number = this._subGeometries.length; + for (var i:number = 0; i < len; ++i) + this._subGeometries[i].applyTransformation(transform); + } + + /** + * Adds a new TriangleSubGeometry object to the list. + * @param subGeometry The TriangleSubGeometry object to be added. + */ + public addSubGeometry(subGeometry:SubGeometryBase) + { + this._subGeometries.push(subGeometry); + + subGeometry.parentGeometry = this; + + if (this.hasEventListener(GeometryEvent.SUB_GEOMETRY_ADDED)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.SUB_GEOMETRY_ADDED, subGeometry)); + + this.iInvalidateBounds(subGeometry); + } + + /** + * Removes a new TriangleSubGeometry object from the list. + * @param subGeometry The TriangleSubGeometry object to be removed. + */ + public removeSubGeometry(subGeometry:SubGeometryBase) + { + this._subGeometries.splice(this._subGeometries.indexOf(subGeometry), 1); + + subGeometry.parentGeometry = null; + + if (this.hasEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.SUB_GEOMETRY_REMOVED, subGeometry)); + + this.iInvalidateBounds(subGeometry); + } + + /** + * Clones the geometry. + * @return An exact duplicate of the current Geometry object. + */ + public clone():Geometry + { + var clone:Geometry = new Geometry(); + var len:number = this._subGeometries.length; + + for (var i:number = 0; i < len; ++i) + clone.addSubGeometry(this._subGeometries[i].clone()); + + return clone; + } + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + public scale(scale:number) + { + var numSubGeoms:number = this._subGeometries.length; + for (var i:number = 0; i < numSubGeoms; ++i) + this._subGeometries[i].scale(scale); + } + + /** + * Clears all resources used by the Geometry object, including SubGeometries. + */ + public dispose() + { + var numSubGeoms:number = this._subGeometries.length; + + for (var i:number = 0; i < numSubGeoms; ++i) { + var subGeom:SubGeometryBase = this._subGeometries[0]; + this.removeSubGeometry(subGeom); + subGeom.dispose(); + } + } + + /** + * Scales the uv coordinates (tiling) + * @param scaleU The amount by which to scale on the u axis. Default is 1; + * @param scaleV The amount by which to scale on the v axis. Default is 1; + */ + public scaleUV(scaleU:number = 1, scaleV:number = 1) + { + var numSubGeoms:number = this._subGeometries.length; + + for (var i:number = 0; i < numSubGeoms; ++i) + this._subGeometries[i].scaleUV(scaleU, scaleV); + } + + public iInvalidateBounds(subGeom:SubGeometryBase) + { + if (this.hasEventListener(GeometryEvent.BOUNDS_INVALID)) + this.dispatchEvent(new GeometryEvent(GeometryEvent.BOUNDS_INVALID, subGeom)); + } +} + +export = Geometry; \ No newline at end of file diff --git a/lib/core/base/GradientType.js b/lib/core/base/GradientType.js new file mode 100755 index 00000000..66408d43 --- /dev/null +++ b/lib/core/base/GradientType.js @@ -0,0 +1,18 @@ +/** +* The GradientType class provides values for the type parameter +* in the beginGradientFill() and +* lineGradientStyle() methods of the flash.display.Graphics +* class. +*/ +var GradientType = (function () { + function GradientType() { + } + GradientType.LINEAR = "linear"; + + GradientType.RADIAL = "radial"; + return GradientType; +})(); + +module.exports = GradientType; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9HcmFkaWVudFR5cGUudHMiXSwibmFtZXMiOlsiR3JhZGllbnRUeXBlIiwiR3JhZGllbnRUeXBlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7RUFLRztBQUNIO0lBQUFBO0lBV0FDLENBQUNBO0FBQUFELElBTkFBLHNCQUE4QkEsUUFBUUE7O0lBS3RDQSxzQkFBOEJBLFFBQVFBO0lBQ3ZDQSxvQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCw2QkFBc0IsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvR3JhZGllbnRUeXBlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgR3JhZGllbnRUeXBlIGNsYXNzIHByb3ZpZGVzIHZhbHVlcyBmb3IgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IHBhcmFtZXRlclxuICogaW4gdGhlIDxjb2RlPmJlZ2luR3JhZGllbnRGaWxsKCk8L2NvZGU+IGFuZFxuICogPGNvZGU+bGluZUdyYWRpZW50U3R5bGUoKTwvY29kZT4gbWV0aG9kcyBvZiB0aGUgZmxhc2guZGlzcGxheS5HcmFwaGljc1xuICogY2xhc3MuXG4gKi9cbmNsYXNzIEdyYWRpZW50VHlwZVxue1xuXHQvKipcblx0ICogVmFsdWUgdXNlZCB0byBzcGVjaWZ5IGEgbGluZWFyIGdyYWRpZW50IGZpbGwuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIExJTkVBUjpzdHJpbmcgPSBcImxpbmVhclwiO1xuXG5cdC8qKlxuXHQgKiBWYWx1ZSB1c2VkIHRvIHNwZWNpZnkgYSByYWRpYWwgZ3JhZGllbnQgZmlsbC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUkFESUFMOnN0cmluZyA9IFwicmFkaWFsXCI7XG59XG5cbmV4cG9ydCA9IEdyYWRpZW50VHlwZTsiXX0= \ No newline at end of file diff --git a/lib/core/base/GradientType.ts b/lib/core/base/GradientType.ts new file mode 100644 index 00000000..70caf8d2 --- /dev/null +++ b/lib/core/base/GradientType.ts @@ -0,0 +1,20 @@ +/** + * The GradientType class provides values for the type parameter + * in the beginGradientFill() and + * lineGradientStyle() methods of the flash.display.Graphics + * class. + */ +class GradientType +{ + /** + * Value used to specify a linear gradient fill. + */ + public static LINEAR:string = "linear"; + + /** + * Value used to specify a radial gradient fill. + */ + public static RADIAL:string = "radial"; +} + +export = GradientType; \ No newline at end of file diff --git a/lib/core/base/Graphics.js b/lib/core/base/Graphics.js new file mode 100755 index 00000000..be2c7e84 --- /dev/null +++ b/lib/core/base/Graphics.js @@ -0,0 +1,845 @@ +/** +* The Graphics class contains a set of methods that you can use to create a +* vector shape. Display objects that support drawing include Sprite and Shape +* objects. Each of these classes includes a graphics property +* that is a Graphics object. The following are among those helper functions +* provided for ease of use: drawRect(), +* drawRoundRect(), drawCircle(), and +* drawEllipse(). +* +*

You cannot create a Graphics object directly from ActionScript code. If +* you call new Graphics(), an exception is thrown.

+* +*

The Graphics class is final; it cannot be subclassed.

+*/ +var Graphics = (function () { + function Graphics() { + } + /** + * Fills a drawing area with a bitmap image. The bitmap can be repeated or + * tiled to fill the area. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param bitmap A transparent or opaque bitmap image that contains the bits + * to be displayed. + * @param matrix A matrix object(of the flash.geom.Matrix class), which you + * can use to define transformations on the bitmap. For + * example, you can use the following matrix to rotate a bitmap + * by 45 degrees(pi/4 radians): + * @param repeat If true, the bitmap image repeats in a tiled + * pattern. If false, the bitmap image does not + * repeat, and the edges of the bitmap are used for any fill + * area that extends beyond the bitmap. + * + *

For example, consider the following bitmap(a 20 x + * 20-pixel checkerboard pattern):

+ * + *

When repeat is set to true(as + * in the following example), the bitmap fill repeats the + * bitmap:

+ * + *

When repeat is set to false, + * the bitmap fill uses the edge pixels for the fill area + * outside the bitmap:

+ * @param smooth If false, upscaled bitmap images are rendered + * by using a nearest-neighbor algorithm and look pixelated. If + * true, upscaled bitmap images are rendered by + * using a bilinear algorithm. Rendering by using the nearest + * neighbor algorithm is faster. + */ + Graphics.prototype.beginBitmapFill = function (bitmap, matrix, repeat, smooth) { + if (typeof matrix === "undefined") { matrix = null; } + if (typeof repeat === "undefined") { repeat = true; } + if (typeof smooth === "undefined") { smooth = false; } + }; + + /** + * Specifies a simple one-color fill that subsequent calls to other Graphics + * methods(such as lineTo() or drawCircle()) use + * when drawing. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param color The color of the fill(0xRRGGBB). + * @param alpha The alpha value of the fill(0.0 to 1.0). + */ + Graphics.prototype.beginFill = function (color /*int*/ , alpha) { + if (typeof alpha === "undefined") { alpha = 1; } + }; + + /** + * Specifies a gradient fill used by subsequent calls to other Graphics + * methods(such as lineTo() or drawCircle()) for + * the object. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param type A value from the GradientType class that + * specifies which gradient type to use: + * GradientType.LINEAR or + * GradientType.RADIAL. + * @param colors An array of RGB hexadecimal color values used + * in the gradient; for example, red is 0xFF0000, + * blue is 0x0000FF, and so on. You can specify + * up to 15 colors. For each color, specify a + * corresponding value in the alphas and ratios + * parameters. + * @param alphas An array of alpha values for the corresponding + * colors in the colors array; valid values are 0 + * to 1. If the value is less than 0, the default + * is 0. If the value is greater than 1, the + * default is 1. + * @param ratios An array of color distribution ratios; valid + * values are 0-255. This value defines the + * percentage of the width where the color is + * sampled at 100%. The value 0 represents the + * left position in the gradient box, and 255 + * represents the right position in the gradient + * box. + * @param matrix A transformation matrix as defined by the + * flash.geom.Matrix class. The flash.geom.Matrix + * class includes a + * createGradientBox() method, which + * lets you conveniently set up the matrix for use + * with the beginGradientFill() + * method. + * @param spreadMethod A value from the SpreadMethod class that + * specifies which spread method to use, either: + * SpreadMethod.PAD, + * SpreadMethod.REFLECT, or + * SpreadMethod.REPEAT. + * + *

For example, consider a simple linear + * gradient between two colors:

+ * + *

This example uses + * SpreadMethod.PAD for the spread + * method, and the gradient fill looks like the + * following:

+ * + *

If you use SpreadMethod.REFLECT + * for the spread method, the gradient fill looks + * like the following:

+ * + *

If you use SpreadMethod.REPEAT + * for the spread method, the gradient fill looks + * like the following:

+ * @param interpolationMethod A value from the InterpolationMethod class that + * specifies which value to use: + * InterpolationMethod.LINEAR_RGB or + * InterpolationMethod.RGB + * + *

For example, consider a simple linear + * gradient between two colors(with the + * spreadMethod parameter set to + * SpreadMethod.REFLECT). The + * different interpolation methods affect the + * appearance as follows:

+ * @param focalPointRatio A number that controls the location of the + * focal point of the gradient. 0 means that the + * focal point is in the center. 1 means that the + * focal point is at one border of the gradient + * circle. -1 means that the focal point is at the + * other border of the gradient circle. A value + * less than -1 or greater than 1 is rounded to -1 + * or 1. For example, the following example shows + * a focalPointRatio set to 0.75: + * @throws ArgumentError If the type parameter is not valid. + */ + Graphics.prototype.beginGradientFill = function (type, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio) { + if (typeof matrix === "undefined") { matrix = null; } + if (typeof spreadMethod === "undefined") { spreadMethod = "pad"; } + if (typeof interpolationMethod === "undefined") { interpolationMethod = "rgb"; } + if (typeof focalPointRatio === "undefined") { focalPointRatio = 0; } + }; + + /** + * Specifies a shader fill used by subsequent calls to other Graphics methods + * (such as lineTo() or drawCircle()) for the + * object. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + *

Shader fills are not supported under GPU rendering; filled areas will + * be colored cyan.

+ * + * @param shader The shader to use for the fill. This Shader instance is not + * required to specify an image input. However, if an image + * input is specified in the shader, the input must be provided + * manually. To specify the input, set the input + * property of the corresponding ShaderInput property of the + * Shader.data property. + * + *

When you pass a Shader instance as an argument the shader + * is copied internally. The drawing fill operation uses that + * internal copy, not a reference to the original shader. Any + * changes made to the shader, such as changing a parameter + * value, input, or bytecode, are not applied to the copied + * shader that's used for the fill.

+ * @param matrix A matrix object(of the flash.geom.Matrix class), which you + * can use to define transformations on the shader. For + * example, you can use the following matrix to rotate a shader + * by 45 degrees(pi/4 radians): + * + *

The coordinates received in the shader are based on the + * matrix that is specified for the matrix + * parameter. For a default(null) matrix, the + * coordinates in the shader are local pixel coordinates which + * can be used to sample an input.

+ * @throws ArgumentError When the shader output type is not compatible with + * this operation(the shader must specify a + * pixel3 or pixel4 output). + * @throws ArgumentError When the shader specifies an image input that isn't + * provided. + * @throws ArgumentError When a ByteArray or Vector. instance is used + * as an input and the width and + * height properties aren't specified for + * the ShaderInput, or the specified values don't match + * the amount of data in the input object. See the + * ShaderInput.input property for more + * information. + */ + // public beginShaderFill(shader:Shader, matrix:Matrix = null) + // { + // + // } + /** + * Clears the graphics that were drawn to this Graphics object, and resets + * fill and line style settings. + * + */ + Graphics.prototype.clear = function () { + }; + + /** + * Copies all of drawing commands from the source Graphics object into the + * calling Graphics object. + * + * @param sourceGraphics The Graphics object from which to copy the drawing + * commands. + */ + Graphics.prototype.copyFrom = function (sourceGraphics) { + }; + + /** + * Draws a cubic Bezier curve from the current drawing position to the + * specified anchor point. Cubic Bezier curves consist of two anchor points + * and two control points. The curve interpolates the two anchor points and + * curves toward the two control points. + * + * The four points you use to draw a cubic Bezier curve with the + * cubicCurveTo() method are as follows: + * + *
    + *
  • The current drawing position is the first anchor point.
  • + *
  • The anchorX and anchorY parameters specify the second anchor point. + *
  • + *
  • The controlX1 and controlY1 parameters + * specify the first control point.
  • + *
  • The controlX2 and controlY2 parameters + * specify the second control point.
  • + *
+ * + * If you call the cubicCurveTo() method before calling the + * moveTo() method, your curve starts at position (0, 0). + * + * If the cubicCurveTo() method succeeds, the Flash runtime sets + * the current drawing position to (anchorX, + * anchorY). If the cubicCurveTo() method fails, + * the current drawing position remains unchanged. + * + * If your movie clip contains content created with the Flash drawing tools, + * the results of calls to the cubicCurveTo() method are drawn + * underneath that content. + * + * @param controlX1 Specifies the horizontal position of the first control + * point relative to the registration point of the parent + * display object. + * @param controlY1 Specifies the vertical position of the first control + * point relative to the registration point of the parent + * display object. + * @param controlX2 Specifies the horizontal position of the second control + * point relative to the registration point of the parent + * display object. + * @param controlY2 Specifies the vertical position of the second control + * point relative to the registration point of the parent + * display object. + * @param anchorX Specifies the horizontal position of the anchor point + * relative to the registration point of the parent display + * object. + * @param anchorY Specifies the vertical position of the anchor point + * relative to the registration point of the parent display + * object. + */ + Graphics.prototype.cubicCurveTo = function (controlX1, controlY1, controlX2, controlY2, anchorX, anchorY) { + }; + + /** + * Draws a curve using the current line style from the current drawing + * position to(anchorX, anchorY) and using the control point that + * (controlX, controlY) specifies. The current + * drawing position is then set to(anchorX, + * anchorY). If the movie clip in which you are drawing contains + * content created with the Flash drawing tools, calls to the + * curveTo() method are drawn underneath this content. If you + * call the curveTo() method before any calls to the + * moveTo() method, the default of the current drawing position + * is(0, 0). If any of the parameters are missing, this method fails and the + * current drawing position is not changed. + * + *

The curve drawn is a quadratic Bezier curve. Quadratic Bezier curves + * consist of two anchor points and one control point. The curve interpolates + * the two anchor points and curves toward the control point.

+ * + * @param controlX A number that specifies the horizontal position of the + * control point relative to the registration point of the + * parent display object. + * @param controlY A number that specifies the vertical position of the + * control point relative to the registration point of the + * parent display object. + * @param anchorX A number that specifies the horizontal position of the + * next anchor point relative to the registration point of + * the parent display object. + * @param anchorY A number that specifies the vertical position of the next + * anchor point relative to the registration point of the + * parent display object. + */ + Graphics.prototype.curveTo = function (controlX, controlY, anchorX, anchorY) { + }; + + /** + * Draws a circle. Set the line style, fill, or both before you call the + * drawCircle() method, by calling the linestyle(), + * lineGradientStyle(), beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. + * + * @param x The x location of the center of the circle relative + * to the registration point of the parent display object(in + * pixels). + * @param y The y location of the center of the circle relative + * to the registration point of the parent display object(in + * pixels). + * @param radius The radius of the circle(in pixels). + */ + Graphics.prototype.drawCircle = function (x, y, radius) { + }; + + /** + * Draws an ellipse. Set the line style, fill, or both before you call the + * drawEllipse() method, by calling the + * linestyle(), lineGradientStyle(), + * beginFill(), beginGradientFill(), or + * beginBitmapFill() method. + * + * @param x The x location of the top-left of the bounding-box of + * the ellipse relative to the registration point of the parent + * display object(in pixels). + * @param y The y location of the top left of the bounding-box of + * the ellipse relative to the registration point of the parent + * display object(in pixels). + * @param width The width of the ellipse(in pixels). + * @param height The height of the ellipse(in pixels). + */ + Graphics.prototype.drawEllipse = function (x, y, width, height) { + }; + + /** + * Submits a series of IGraphicsData instances for drawing. This method + * accepts a Vector containing objects including paths, fills, and strokes + * that implement the IGraphicsData interface. A Vector of IGraphicsData + * instances can refer to a part of a shape, or a complex fully defined set + * of data for rendering a complete shape. + * + *

Graphics paths can contain other graphics paths. If the + * graphicsData Vector includes a path, that path and all its + * sub-paths are rendered during this operation.

+ * + */ + Graphics.prototype.drawGraphicsData = function (graphicsData) { + }; + + /** + * Submits a series of commands for drawing. The drawPath() + * method uses vector arrays to consolidate individual moveTo(), + * lineTo(), and curveTo() drawing commands into a + * single call. The drawPath() method parameters combine drawing + * commands with x- and y-coordinate value pairs and a drawing direction. The + * drawing commands are values from the GraphicsPathCommand class. The x- and + * y-coordinate value pairs are Numbers in an array where each pair defines a + * coordinate location. The drawing direction is a value from the + * GraphicsPathWinding class. + * + *

Generally, drawings render faster with drawPath() than + * with a series of individual lineTo() and + * curveTo() methods.

+ * + *

The drawPath() method uses a uses a floating computation + * so rotation and scaling of shapes is more accurate and gives better + * results. However, curves submitted using the drawPath() + * method can have small sub-pixel alignment errors when used in conjunction + * with the lineTo() and curveTo() methods.

+ * + *

The drawPath() method also uses slightly different rules + * for filling and drawing lines. They are:

+ * + *
    + *
  • When a fill is applied to rendering a path: + *
      + *
    • A sub-path of less than 3 points is not rendered.(But note that the + * stroke rendering will still occur, consistent with the rules for strokes + * below.)
    • + *
    • A sub-path that isn't closed(the end point is not equal to the + * begin point) is implicitly closed.
    • + *
    + *
  • + *
  • When a stroke is applied to rendering a path: + *
      + *
    • The sub-paths can be composed of any number of points.
    • + *
    • The sub-path is never implicitly closed.
    • + *
    + *
  • + *
+ * + * @param winding Specifies the winding rule using a value defined in the + * GraphicsPathWinding class. + */ + Graphics.prototype.drawPath = function (commands, data, winding) { + }; + + /** + * Draws a rectangle. Set the line style, fill, or both before you call the + * drawRect() method, by calling the linestyle(), + * lineGradientStyle(), beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. + * + * @param x A number indicating the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number indicating the vertical position relative to the + * registration point of the parent display object(in pixels). + * @param width The width of the rectangle(in pixels). + * @param height The height of the rectangle(in pixels). + * @throws ArgumentError If the width or height + * parameters are not a number + * (Number.NaN). + */ + Graphics.prototype.drawRect = function (x, y, width, height) { + }; + + /** + * Draws a rounded rectangle. Set the line style, fill, or both before you + * call the drawRoundRect() method, by calling the + * linestyle(), lineGradientStyle(), + * beginFill(), beginGradientFill(), or + * beginBitmapFill() method. + * + * @param x A number indicating the horizontal position relative + * to the registration point of the parent display + * object(in pixels). + * @param y A number indicating the vertical position relative to + * the registration point of the parent display object + * (in pixels). + * @param width The width of the round rectangle(in pixels). + * @param height The height of the round rectangle(in pixels). + * @param ellipseWidth The width of the ellipse used to draw the rounded + * corners(in pixels). + * @param ellipseHeight The height of the ellipse used to draw the rounded + * corners(in pixels). Optional; if no value is + * specified, the default value matches that provided + * for the ellipseWidth parameter. + * @throws ArgumentError If the width, height, + * ellipseWidth or + * ellipseHeight parameters are not a + * number(Number.NaN). + */ + Graphics.prototype.drawRoundRect = function (x, y, width, height, ellipseWidth, ellipseHeight) { + if (typeof ellipseHeight === "undefined") { ellipseHeight = NaN; } + }; + + //public drawRoundRectComplex(x:Float, y:Float, width:Float, height:Float, topLeftRadius:Float, topRightRadius:Float, bottomLeftRadius:Float, bottomRightRadius:Float):Void; + /** + * Renders a set of triangles, typically to distort bitmaps and give them a + * three-dimensional appearance. The drawTriangles() method maps + * either the current fill, or a bitmap fill, to the triangle faces using a + * set of(u,v) coordinates. + * + *

Any type of fill can be used, but if the fill has a transform matrix + * that transform matrix is ignored.

+ * + *

A uvtData parameter improves texture mapping when a + * bitmap fill is used.

+ * + * @param culling Specifies whether to render triangles that face in a + * specified direction. This parameter prevents the rendering + * of triangles that cannot be seen in the current view. This + * parameter can be set to any value defined by the + * TriangleCulling class. + */ + Graphics.prototype.drawTriangles = function (vertices, indices, uvtData, culling) { + if (typeof indices === "undefined") { indices = null; } + if (typeof uvtData === "undefined") { uvtData = null; } + if (typeof culling === "undefined") { culling = null; } + }; + + /** + * Applies a fill to the lines and curves that were added since the last call + * to the beginFill(), beginGradientFill(), or + * beginBitmapFill() method. Flash uses the fill that was + * specified in the previous call to the beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. If the current drawing position does not equal the previous + * position specified in a moveTo() method and a fill is + * defined, the path is closed with a line and then filled. + * + */ + Graphics.prototype.endFill = function () { + }; + + /** + * Specifies a bitmap to use for the line stroke when drawing lines. + * + *

The bitmap line style is used for subsequent calls to Graphics methods + * such as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineStyle() or lineGradientStyle() methods, or + * the lineBitmapStyle() method again with different parameters. + *

+ * + *

You can call the lineBitmapStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineBitmapStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param bitmap The bitmap to use for the line stroke. + * @param matrix An optional transformation matrix as defined by the + * flash.geom.Matrix class. The matrix can be used to scale or + * otherwise manipulate the bitmap before applying it to the + * line style. + * @param repeat Whether to repeat the bitmap in a tiled fashion. + * @param smooth Whether smoothing should be applied to the bitmap. + */ + Graphics.prototype.lineBitmapStyle = function (bitmap, matrix, repeat, smooth) { + if (typeof matrix === "undefined") { matrix = null; } + if (typeof repeat === "undefined") { repeat = true; } + if (typeof smooth === "undefined") { smooth = false; } + }; + + /** + * Specifies a gradient to use for the stroke when drawing lines. + * + *

The gradient line style is used for subsequent calls to Graphics + * methods such as the lineTo() methods or the + * drawCircle() method. The line style remains in effect until + * you call the lineStyle() or lineBitmapStyle() + * methods, or the lineGradientStyle() method again with + * different parameters.

+ * + *

You can call the lineGradientStyle() method in the middle + * of drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineGradientStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param type A value from the GradientType class that + * specifies which gradient type to use, either + * GradientType.LINEAR or GradientType.RADIAL. + * @param colors An array of RGB hexadecimal color values used + * in the gradient; for example, red is 0xFF0000, + * blue is 0x0000FF, and so on. You can specify + * up to 15 colors. For each color, specify a + * corresponding value in the alphas and ratios + * parameters. + * @param alphas An array of alpha values for the corresponding + * colors in the colors array; valid values are 0 + * to 1. If the value is less than 0, the default + * is 0. If the value is greater than 1, the + * default is 1. + * @param ratios An array of color distribution ratios; valid + * values are 0-255. This value defines the + * percentage of the width where the color is + * sampled at 100%. The value 0 represents the + * left position in the gradient box, and 255 + * represents the right position in the gradient + * box. + * @param matrix A transformation matrix as defined by the + * flash.geom.Matrix class. The flash.geom.Matrix + * class includes a + * createGradientBox() method, which + * lets you conveniently set up the matrix for use + * with the lineGradientStyle() + * method. + * @param spreadMethod A value from the SpreadMethod class that + * specifies which spread method to use: + * @param interpolationMethod A value from the InterpolationMethod class that + * specifies which value to use. For example, + * consider a simple linear gradient between two + * colors(with the spreadMethod + * parameter set to + * SpreadMethod.REFLECT). The + * different interpolation methods affect the + * appearance as follows: + * @param focalPointRatio A number that controls the location of the + * focal point of the gradient. The value 0 means + * the focal point is in the center. The value 1 + * means the focal point is at one border of the + * gradient circle. The value -1 means that the + * focal point is at the other border of the + * gradient circle. Values less than -1 or greater + * than 1 are rounded to -1 or 1. The following + * image shows a gradient with a + * focalPointRatio of -0.75: + */ + Graphics.prototype.lineGradientStyle = function (type, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio) { + if (typeof matrix === "undefined") { matrix = null; } + if (typeof spreadMethod === "undefined") { spreadMethod = null; } + if (typeof interpolationMethod === "undefined") { interpolationMethod = null; } + if (typeof focalPointRatio === "undefined") { focalPointRatio = 0; } + }; + + /** + * Specifies a shader to use for the line stroke when drawing lines. + * + *

The shader line style is used for subsequent calls to Graphics methods + * such as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineStyle() or lineGradientStyle() methods, or + * the lineBitmapStyle() method again with different parameters. + *

+ * + *

You can call the lineShaderStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineShaderStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param shader The shader to use for the line stroke. + * @param matrix An optional transformation matrix as defined by the + * flash.geom.Matrix class. The matrix can be used to scale or + * otherwise manipulate the bitmap before applying it to the + * line style. + */ + // public lineShaderStyle(shader:Shader, matrix:Matrix = null) + // { + // + // } + /** + * Specifies a line style used for subsequent calls to Graphics methods such + * as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineGradientStyle() method, the + * lineBitmapStyle() method, or the lineStyle() + * method with different parameters. + * + *

You can call the lineStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within the path.

+ * + *

Note: Calls to the clear() method set the line + * style back to undefined.

+ * + *

Note: Flash Lite 4 supports only the first three parameters + * (thickness, color, and alpha).

+ * + * @param thickness An integer that indicates the thickness of the line in + * points; valid values are 0-255. If a number is not + * specified, or if the parameter is undefined, a line is + * not drawn. If a value of less than 0 is passed, the + * default is 0. The value 0 indicates hairline + * thickness; the maximum thickness is 255. If a value + * greater than 255 is passed, the default is 255. + * @param color A hexadecimal color value of the line; for example, + * red is 0xFF0000, blue is 0x0000FF, and so on. If a + * value is not indicated, the default is 0x000000 + * (black). Optional. + * @param alpha A number that indicates the alpha value of the color + * of the line; valid values are 0 to 1. If a value is + * not indicated, the default is 1(solid). If the value + * is less than 0, the default is 0. If the value is + * greater than 1, the default is 1. + * @param pixelHinting(Not supported in Flash Lite 4) A Boolean value that + * specifies whether to hint strokes to full pixels. This + * affects both the position of anchors of a curve and + * the line stroke size itself. With + * pixelHinting set to true, + * line widths are adjusted to full pixel widths. With + * pixelHinting set to false, + * disjoints can appear for curves and straight lines. + * For example, the following illustrations show how + * Flash Player or Adobe AIR renders two rounded + * rectangles that are identical, except that the + * pixelHinting parameter used in the + * lineStyle() method is set differently + * (the images are scaled by 200%, to emphasize the + * difference): + * + *

If a value is not supplied, the line does not use + * pixel hinting.

+ * @param scaleMode (Not supported in Flash Lite 4) A value from the + * LineScaleMode class that specifies which scale mode to + * use: + *
    + *
  • LineScaleMode.NORMAL - Always + * scale the line thickness when the object is scaled + * (the default).
  • + *
  • LineScaleMode.NONE - Never scale + * the line thickness.
  • + *
  • LineScaleMode.VERTICAL - Do not + * scale the line thickness if the object is scaled + * vertically only. For example, consider the + * following circles, drawn with a one-pixel line, and + * each with the scaleMode parameter set to + * LineScaleMode.VERTICAL. The circle on the + * left is scaled vertically only, and the circle on the + * right is scaled both vertically and horizontally: + *
  • + *
  • LineScaleMode.HORIZONTAL - Do not + * scale the line thickness if the object is scaled + * horizontally only. For example, consider the + * following circles, drawn with a one-pixel line, and + * each with the scaleMode parameter set to + * LineScaleMode.HORIZONTAL. The circle on + * the left is scaled horizontally only, and the circle + * on the right is scaled both vertically and + * horizontally:
  • + *
+ * @param caps (Not supported in Flash Lite 4) A value from the + * CapsStyle class that specifies the type of caps at the + * end of lines. Valid values are: + * CapsStyle.NONE, + * CapsStyle.ROUND, and + * CapsStyle.SQUARE. If a value is not + * indicated, Flash uses round caps. + * + *

For example, the following illustrations show the + * different capsStyle settings. For each + * setting, the illustration shows a blue line with a + * thickness of 30(for which the capsStyle + * applies), and a superimposed black line with a + * thickness of 1(for which no capsStyle + * applies):

+ * @param joints (Not supported in Flash Lite 4) A value from the + * JointStyle class that specifies the type of joint + * appearance used at angles. Valid values are: + * JointStyle.BEVEL, + * JointStyle.MITER, and + * JointStyle.ROUND. If a value is not + * indicated, Flash uses round joints. + * + *

For example, the following illustrations show the + * different joints settings. For each + * setting, the illustration shows an angled blue line + * with a thickness of 30(for which the + * jointStyle applies), and a superimposed + * angled black line with a thickness of 1(for which no + * jointStyle applies):

+ * + *

Note: For joints set to + * JointStyle.MITER, you can use the + * miterLimit parameter to limit the length + * of the miter.

+ * @param miterLimit (Not supported in Flash Lite 4) A number that + * indicates the limit at which a miter is cut off. Valid + * values range from 1 to 255(and values outside that + * range are rounded to 1 or 255). This value is only + * used if the jointStyle is set to + * "miter". The miterLimit + * value represents the length that a miter can extend + * beyond the point at which the lines meet to form a + * joint. The value expresses a factor of the line + * thickness. For example, with a + * miterLimit factor of 2.5 and a + * thickness of 10 pixels, the miter is cut + * off at 25 pixels. + * + *

For example, consider the following angled lines, + * each drawn with a thickness of 20, but + * with miterLimit set to 1, 2, and 4. + * Superimposed are black reference lines showing the + * meeting points of the joints:

+ * + *

Notice that a given miterLimit value + * has a specific maximum angle for which the miter is + * cut off. The following table lists some examples:

+ */ + Graphics.prototype.lineStyle = function (thickness, color, alpha, pixelHinting, scaleMode, caps, joints, miterLimit) { + if (typeof thickness === "undefined") { thickness = 0; } + if (typeof color === "undefined") { color = 0; } + if (typeof alpha === "undefined") { alpha = 1; } + if (typeof pixelHinting === "undefined") { pixelHinting = false; } + if (typeof scaleMode === "undefined") { scaleMode = null; } + if (typeof caps === "undefined") { caps = null; } + if (typeof joints === "undefined") { joints = null; } + if (typeof miterLimit === "undefined") { miterLimit = 3; } + }; + + /** + * Draws a line using the current line style from the current drawing + * position to(x, y); the current drawing position + * is then set to(x, y). If the display object in + * which you are drawing contains content that was created with the Flash + * drawing tools, calls to the lineTo() method are drawn + * underneath the content. If you call lineTo() before any calls + * to the moveTo() method, the default position for the current + * drawing is(0, 0). If any of the parameters are missing, this + * method fails and the current drawing position is not changed. + * + * @param x A number that indicates the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number that indicates the vertical position relative to the + * registration point of the parent display object(in pixels). + */ + Graphics.prototype.lineTo = function (x, y) { + }; + + /** + * Moves the current drawing position to(x, y). If + * any of the parameters are missing, this method fails and the current + * drawing position is not changed. + * + * @param x A number that indicates the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number that indicates the vertical position relative to the + * registration point of the parent display object(in pixels). + */ + Graphics.prototype.moveTo = function (x, y) { + }; + return Graphics; +})(); + +module.exports = Graphics; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9HcmFwaGljcy50cyJdLCJuYW1lcyI6WyJHcmFwaGljcyIsIkdyYXBoaWNzLmNvbnN0cnVjdG9yIiwiR3JhcGhpY3MuYmVnaW5CaXRtYXBGaWxsIiwiR3JhcGhpY3MuYmVnaW5GaWxsIiwiR3JhcGhpY3MuYmVnaW5HcmFkaWVudEZpbGwiLCJHcmFwaGljcy5jbGVhciIsIkdyYXBoaWNzLmNvcHlGcm9tIiwiR3JhcGhpY3MuY3ViaWNDdXJ2ZVRvIiwiR3JhcGhpY3MuY3VydmVUbyIsIkdyYXBoaWNzLmRyYXdDaXJjbGUiLCJHcmFwaGljcy5kcmF3RWxsaXBzZSIsIkdyYXBoaWNzLmRyYXdHcmFwaGljc0RhdGEiLCJHcmFwaGljcy5kcmF3UGF0aCIsIkdyYXBoaWNzLmRyYXdSZWN0IiwiR3JhcGhpY3MuZHJhd1JvdW5kUmVjdCIsIkdyYXBoaWNzLmRyYXdUcmlhbmdsZXMiLCJHcmFwaGljcy5lbmRGaWxsIiwiR3JhcGhpY3MubGluZUJpdG1hcFN0eWxlIiwiR3JhcGhpY3MubGluZUdyYWRpZW50U3R5bGUiLCJHcmFwaGljcy5saW5lU3R5bGUiLCJHcmFwaGljcy5saW5lVG8iLCJHcmFwaGljcy5tb3ZlVG8iXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7O0VBeUJHO0FBQ0g7SUFBQUE7SUF3MEJBQyxDQUFDQTtBQUFBRCxJQWp5QkFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFER0E7eUNBQ0hBLFVBQXVCQSxNQUFpQkEsRUFBRUEsTUFBb0JBLEVBQUVBLE1BQXFCQSxFQUFFQSxNQUFzQkE7UUFBbkVFLHFDQUFBQSxNQUFNQSxHQUFVQSxJQUFJQTtBQUFBQSxRQUFFQSxxQ0FBQUEsTUFBTUEsR0FBV0EsSUFBSUE7QUFBQUEsUUFBRUEscUNBQUFBLE1BQU1BLEdBQVdBLEtBQUtBO0FBQUFBLElBRzdHQSxDQUFDQTs7SUFnQkRGOzs7Ozs7Ozs7Ozs7O01BREdBO21DQUNIQSxVQUFpQkEsS0FBWUEsQ0FBQ0EsT0FB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LEVBQUVBLFNBQThCQSxFQUFFQSxJQUFxQkEsRUFBRUEsTUFBd0JBLEVBQUVBLFVBQXFCQTtRQUF0TW1CLHdDQUFBQSxTQUFTQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxvQ0FBQUEsS0FBS0EsR0FBa0JBLENBQUNBO0FBQUFBLFFBQUVBLG9DQUFBQSxLQUFLQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSwyQ0FBQUEsWUFBWUEsR0FBV0EsS0FBS0E7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQWlCQSxJQUFJQTtBQUFBQSxRQUFFQSxtQ0FBQUEsSUFBSUEsR0FBYUEsSUFBSUE7QUFBQUEsUUFBRUEscUNBQUFBLE1BQU1BLEdBQWNBLElBQUlBO0FBQUFBLFFBQUVBLHlDQUFBQSxVQUFVQSxHQUFVQSxDQUFDQTtBQUFBQSxJQUd2TkEsQ0FBQ0E7O0lBa0JEbkI7Ozs7Ozs7Ozs7Ozs7OztNQURHQTtnQ0FDSEEsVUFBY0EsQ0FBUUEsRUFBRUEsQ0FBUUE7SUFHaENvQixDQUFDQTs7SUFZRHBCOzs7Ozs7Ozs7TUFER0E7Z0NBQ0hBLFVBQWNBLENBQVFBLEVBQUVBLENBQVFBO0lBR2hDcUIsQ0FBQ0E7SUFDRnJCLGdCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELHlCQUFrQixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9HcmFwaGljcy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRtYXBEYXRhXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0JpdG1hcERhdGFcIik7XG5pbXBvcnQgQ2Fwc1N0eWxlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0NhcHNTdHlsZVwiKTtcbmltcG9ydCBHcmFkaWVudFR5cGVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvR3JhZGllbnRUeXBlXCIpO1xuaW1wb3J0IEdyYXBoaWNzUGF0aFdpbmRpbmdcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9HcmFwaGljc1BhdGhXaW5kaW5nXCIpO1xuaW1wb3J0IElHcmFwaGljc0RhdGFcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0lHcmFwaGljc0RhdGFcIik7XG5pbXBvcnQgSW50ZXJwb2xhdGlvbk1ldGhvZFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0ludGVycG9sYXRpb25NZXRob2RcIik7XG5pbXBvcnQgSm9pbnRTdHlsZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9Kb2ludFN0eWxlXCIpO1xuaW1wb3J0IExpbmVTY2FsZU1vZGVcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0xpbmVTY2FsZU1vZGVcIik7XG5pbXBvcnQgVHJpYW5nbGVDdWxsaW5nXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9UcmlhbmdsZUN1bGxpbmdcIik7XG5pbXBvcnQgU3ByZWFkTWV0aG9kXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1NwcmVhZE1ldGhvZFwiKTtcbmltcG9ydCBNYXRyaXhcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXhcIik7XG5cbi8qKlxuICogVGhlIEdyYXBoaWNzIGNsYXNzIGNvbnRhaW5zIGEgc2V0IG9mIG1ldGhvZHMgdGhhdCB5b3UgY2FuIHVzZSB0byBjcmVhdGUgYVxuICogdmVjdG9yIHNoYXBlLiBEaXNwbGF5IG9iamVjdHMgdGhhdCBzdXBwb3J0IGRyYXdpbmcgaW5jbHVkZSBTcHJpdGUgYW5kIFNoYXBlXG4gKiBvYmplY3RzLiBFYWNoIG9mIHRoZXNlIGNsYXNzZXMgaW5jbHVkZXMgYSA8Y29kZT5ncmFwaGljczwvY29kZT4gcHJvcGVydHlcbiAqIHRoYXQgaXMgYSBHcmFwaGljcyBvYmplY3QuIFRoZSBmb2xsb3dpbmcgYXJlIGFtb25nIHRob3NlIGhlbHBlciBmdW5jdGlvbnNcbiAqIHByb3ZpZGVkIGZvciBlYXNlIG9mIHVzZTogPGNvZGU+ZHJhd1JlY3QoKTwvY29kZT4sXG4gKiA8Y29kZT5kcmF3Um91bmRSZWN0KCk8L2NvZGU+LCA8Y29kZT5kcmF3Q2lyY2xlKCk8L2NvZGU+LCBhbmRcbiAqIDxjb2RlPmRyYXdFbGxpcHNlKCk8L2NvZGU+LlxuICpcbiAqIDxwPllvdSBjYW5ub3QgY3JlYXRlIGEgR3JhcGhpY3Mgb2JqZWN0IGRpcmVjdGx5IGZyb20gQWN0aW9uU2NyaXB0IGNvZGUuIElmXG4gKiB5b3UgY2FsbCA8Y29kZT5uZXcgR3JhcGhpY3MoKTwvY29kZT4sIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uPC9wPlxuICpcbiAqIDxwPlRoZSBHcmFwaGljcyBjbGFzcyBpcyBmaW5hbDsgaXQgY2Fubm90IGJlIHN1YmNsYXNzZWQuPC9wPlxuICovXG5jbGFzcyBHcmFwaGljc1xue1xuXHQvKipcblx0ICogRmlsbHMgYSBkcmF3aW5nIGFyZWEgd2l0aCBhIGJpdG1hcCBpbWFnZS4gVGhlIGJpdG1hcCBjYW4gYmUgcmVwZWF0ZWQgb3Jcblx0ICogdGlsZWQgdG8gZmlsbCB0aGUgYXJlYS4gVGhlIGZpbGwgcmVtYWlucyBpbiBlZmZlY3QgdW50aWwgeW91IGNhbGwgdGhlXG5cdCAqIDxjb2RlPmJlZ2luRmlsbCgpPC9jb2RlPiwgPGNvZGU+YmVnaW5CaXRtYXBGaWxsKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5iZWdpbkdyYWRpZW50RmlsbCgpPC9jb2RlPiwgb3IgPGNvZGU+YmVnaW5TaGFkZXJGaWxsKCk8L2NvZGU+XG5cdCAqIG1ldGhvZC4gQ2FsbGluZyB0aGUgPGNvZGU+Y2xlYXIoKTwvY29kZT4gbWV0aG9kIGNsZWFycyB0aGUgZmlsbC5cblx0ICpcblx0ICogPHA+VGhlIGFwcGxpY2F0aW9uIHJlbmRlcnMgdGhlIGZpbGwgd2hlbmV2ZXIgdGhyZWUgb3IgbW9yZSBwb2ludHMgYXJlXG5cdCAqIGRyYXduLCBvciB3aGVuIHRoZSA8Y29kZT5lbmRGaWxsKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIDwvcD5cblx0ICpcblx0ICogQHBhcmFtIGJpdG1hcCBBIHRyYW5zcGFyZW50IG9yIG9wYXF1ZSBiaXRtYXAgaW1hZ2UgdGhhdCBjb250YWlucyB0aGUgYml0c1xuXHQgKiAgICAgICAgICAgICAgIHRvIGJlIGRpc3BsYXllZC5cblx0ICogQHBhcmFtIG1hdHJpeCBBIG1hdHJpeCBvYmplY3Qob2YgdGhlIGZsYXNoLmdlb20uTWF0cml4IGNsYXNzKSwgd2hpY2ggeW91XG5cdCAqICAgICAgICAgICAgICAgY2FuIHVzZSB0byBkZWZpbmUgdHJhbnNmb3JtYXRpb25zIG9uIHRoZSBiaXRtYXAuIEZvclxuXHQgKiAgICAgICAgICAgICAgIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgbWF0cml4IHRvIHJvdGF0ZSBhIGJpdG1hcFxuXHQgKiAgICAgICAgICAgICAgIGJ5IDQ1IGRlZ3JlZXMocGkvNCByYWRpYW5zKTpcblx0ICogQHBhcmFtIHJlcGVhdCBJZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGJpdG1hcCBpbWFnZSByZXBlYXRzIGluIGEgdGlsZWRcblx0ICogICAgICAgICAgICAgICBwYXR0ZXJuLiBJZiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBiaXRtYXAgaW1hZ2UgZG9lcyBub3Rcblx0ICogICAgICAgICAgICAgICByZXBlYXQsIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGJpdG1hcCBhcmUgdXNlZCBmb3IgYW55IGZpbGxcblx0ICogICAgICAgICAgICAgICBhcmVhIHRoYXQgZXh0ZW5kcyBiZXlvbmQgdGhlIGJpdG1hcC5cblx0ICpcblx0ICogICAgICAgICAgICAgICA8cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBiaXRtYXAoYSAyMCB4XG5cdCAqICAgICAgICAgICAgICAgMjAtcGl4ZWwgY2hlY2tlcmJvYXJkIHBhdHRlcm4pOjwvcD5cblx0ICpcblx0ICogICAgICAgICAgICAgICA8cD5XaGVuIDxjb2RlPnJlcGVhdDwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+KGFzXG5cdCAqICAgICAgICAgICAgICAgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlKSwgdGhlIGJpdG1hcCBmaWxsIHJlcGVhdHMgdGhlXG5cdCAqICAgICAgICAgICAgICAgYml0bWFwOjwvcD5cblx0ICpcblx0ICogICAgICAgICAgICAgICA8cD5XaGVuIDxjb2RlPnJlcGVhdDwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPixcblx0ICogICAgICAgICAgICAgICB0aGUgYml0bWFwIGZpbGwgdXNlcyB0aGUgZWRnZSBwaXhlbHMgZm9yIHRoZSBmaWxsIGFyZWFcblx0ICogICAgICAgICAgICAgICBvdXRzaWRlIHRoZSBiaXRtYXA6PC9wPlxuXHQgKiBAcGFyYW0gc21vb3RoIElmIDxjb2RlPmZhbHNlPC9jb2RlPiwgdXBzY2FsZWQgYml0bWFwIGltYWdlcyBhcmUgcmVuZGVyZWRcblx0ICogICAgICAgICAgICAgICBieSB1c2luZyBhIG5lYXJlc3QtbmVpZ2hib3IgYWxnb3JpdGhtIGFuZCBsb29rIHBpeGVsYXRlZC4gSWZcblx0ICogICAgICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiwgdXBzY2FsZWQgYml0bWFwIGltYWdlcyBhcmUgcmVuZGVyZWQgYnlcblx0ICogICAgICAgICAgICAgICB1c2luZyBhIGJpbGluZWFyIGFsZ29yaXRobS4gUmVuZGVyaW5nIGJ5IHVzaW5nIHRoZSBuZWFyZXN0XG5cdCAqICAgICAgICAgICAgICAgbmVpZ2hib3IgYWxnb3JpdGhtIGlzIGZhc3Rlci5cblx0ICovXG5cdHB1YmxpYyBiZWdpbkJpdG1hcEZpbGwoYml0bWFwOkJpdG1hcERhdGEsIG1hdHJpeDpNYXRyaXggPSBudWxsLCByZXBlYXQ6Ym9vbGVhbiA9IHRydWUsIHNtb290aDpib29sZWFuID0gZmFsc2UpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyBhIHNpbXBsZSBvbmUtY29sb3IgZmlsbCB0aGF0IHN1YnNlcXVlbnQgY2FsbHMgdG8gb3RoZXIgR3JhcGhpY3Ncblx0ICogbWV0aG9kcyhzdWNoIGFzIDxjb2RlPmxpbmVUbygpPC9jb2RlPiBvciA8Y29kZT5kcmF3Q2lyY2xlKCk8L2NvZGU+KSB1c2Vcblx0ICogd2hlbiBkcmF3aW5nLiBUaGUgZmlsbCByZW1haW5zIGluIGVmZmVjdCB1bnRpbCB5b3UgY2FsbCB0aGVcblx0ICogPGNvZGU+YmVnaW5GaWxsKCk8L2NvZGU+LCA8Y29kZT5iZWdpbkJpdG1hcEZpbGwoKTwvY29kZT4sXG5cdCAqIDxjb2RlPmJlZ2luR3JhZGllbnRGaWxsKCk8L2NvZGU+LCBvciA8Y29kZT5iZWdpblNoYWRlckZpbGwoKTwvY29kZT5cblx0ICogbWV0aG9kLiBDYWxsaW5nIHRoZSA8Y29kZT5jbGVhcigpPC9jb2RlPiBtZXRob2QgY2xlYXJzIHRoZSBmaWxsLlxuXHQgKlxuXHQgKiA8cD5UaGUgYXBwbGljYXRpb24gcmVuZGVycyB0aGUgZmlsbCB3aGVuZXZlciB0aHJlZSBvciBtb3JlIHBvaW50cyBhcmVcblx0ICogZHJhd24sIG9yIHdoZW4gdGhlIDxjb2RlPmVuZEZpbGwoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC48L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBjb2xvciBUaGUgY29sb3Igb2YgdGhlIGZpbGwoMHhSUkdHQkIpLlxuXHQgKiBAcGFyYW0gYWxwaGEgVGhlIGFscGhhIHZhbHVlIG9mIHRoZSBmaWxsKDAuMCB0byAxLjApLlxuXHQgKi9cblx0cHVibGljIGJlZ2luRmlsbChjb2xvcjpudW1iZXIgLyppbnQqLywgYWxwaGE6bnVtYmVyID0gMSlcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogU3BlY2lmaWVzIGEgZ3JhZGllbnQgZmlsbCB1c2VkIGJ5IHN1YnNlcXVlbnQgY2FsbHMgdG8gb3RoZXIgR3JhcGhpY3Ncblx0ICogbWV0aG9kcyhzdWNoIGFzIDxjb2RlPmxpbmVUbygpPC9jb2RlPiBvciA8Y29kZT5kcmF3Q2lyY2xlKCk8L2NvZGU+KSBmb3Jcblx0ICogdGhlIG9iamVjdC4gVGhlIGZpbGwgcmVtYWlucyBpbiBlZmZlY3QgdW50aWwgeW91IGNhbGwgdGhlXG5cdCAqIDxjb2RlPmJlZ2luRmlsbCgpPC9jb2RlPiwgPGNvZGU+YmVnaW5CaXRtYXBGaWxsKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5iZWdpbkdyYWRpZW50RmlsbCgpPC9jb2RlPiwgb3IgPGNvZGU+YmVnaW5TaGFkZXJGaWxsKCk8L2NvZGU+XG5cdCAqIG1ldGhvZC4gQ2FsbGluZyB0aGUgPGNvZGU+Y2xlYXIoKTwvY29kZT4gbWV0aG9kIGNsZWFycyB0aGUgZmlsbC5cblx0ICpcblx0ICogPHA+VGhlIGFwcGxpY2F0aW9uIHJlbmRlcnMgdGhlIGZpbGwgd2hlbmV2ZXIgdGhyZWUgb3IgbW9yZSBwb2ludHMgYXJlXG5cdCAqIGRyYXduLCBvciB3aGVuIHRoZSA8Y29kZT5lbmRGaWxsKCk8L2NvZGU+IG1ldGhvZCBpcyBjYWxsZWQuIDwvcD5cblx0ICpcblx0ICogQHBhcmFtIHR5cGUgICAgICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIHRoZSBHcmFkaWVudFR5cGUgY2xhc3MgdGhhdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZXMgd2hpY2ggZ3JhZGllbnQgdHlwZSB0byB1c2U6XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkdyYWRpZW50VHlwZS5MSU5FQVI8L2NvZGU+IG9yXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkdyYWRpZW50VHlwZS5SQURJQUw8L2NvZGU+LlxuXHQgKiBAcGFyYW0gY29sb3JzICAgICAgICAgICAgICBBbiBhcnJheSBvZiBSR0IgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWVzIHVzZWRcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGdyYWRpZW50OyBmb3IgZXhhbXBsZSwgcmVkIGlzIDB4RkYwMDAwLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBibHVlIGlzIDB4MDAwMEZGLCBhbmQgc28gb24uIFlvdSBjYW4gc3BlY2lmeVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cCB0byAxNSBjb2xvcnMuIEZvciBlYWNoIGNvbG9yLCBzcGVjaWZ5IGFcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgYWxwaGFzIGFuZCByYXRpb3Ncblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5cblx0ICogQHBhcmFtIGFscGhhcyAgICAgICAgICAgICAgQW4gYXJyYXkgb2YgYWxwaGEgdmFsdWVzIGZvciB0aGUgY29ycmVzcG9uZGluZ1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMgaW4gdGhlIGNvbG9ycyBhcnJheTsgdmFsaWQgdmFsdWVzIGFyZSAwXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIDEuIElmIHRoZSB2YWx1ZSBpcyBsZXNzIHRoYW4gMCwgdGhlIGRlZmF1bHRcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgMC4gSWYgdGhlIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAxLlxuXHQgKiBAcGFyYW0gcmF0aW9zICAgICAgICAgICAgICBBbiBhcnJheSBvZiBjb2xvciBkaXN0cmlidXRpb24gcmF0aW9zOyB2YWxpZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgYXJlIDAtMjU1LiBUaGlzIHZhbHVlIGRlZmluZXMgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnRhZ2Ugb2YgdGhlIHdpZHRoIHdoZXJlIHRoZSBjb2xvciBpc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVkIGF0IDEwMCUuIFRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgcG9zaXRpb24gaW4gdGhlIGdyYWRpZW50IGJveCwgYW5kIDI1NVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRzIHRoZSByaWdodCBwb3NpdGlvbiBpbiB0aGUgZ3JhZGllbnRcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm94LlxuXHQgKiBAcGFyYW0gbWF0cml4ICAgICAgICAgICAgICBBIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhcyBkZWZpbmVkIGJ5IHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFzaC5nZW9tLk1hdHJpeCBjbGFzcy4gVGhlIGZsYXNoLmdlb20uTWF0cml4XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGluY2x1ZGVzIGFcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+Y3JlYXRlR3JhZGllbnRCb3goKTwvY29kZT4gbWV0aG9kLCB3aGljaFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXRzIHlvdSBjb252ZW5pZW50bHkgc2V0IHVwIHRoZSBtYXRyaXggZm9yIHVzZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSA8Y29kZT5iZWdpbkdyYWRpZW50RmlsbCgpPC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuXG5cdCAqIEBwYXJhbSBzcHJlYWRNZXRob2QgICAgICAgIEEgdmFsdWUgZnJvbSB0aGUgU3ByZWFkTWV0aG9kIGNsYXNzIHRoYXRcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoaWNoIHNwcmVhZCBtZXRob2QgdG8gdXNlLCBlaXRoZXI6XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlNwcmVhZE1ldGhvZC5QQUQ8L2NvZGU+LFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5TcHJlYWRNZXRob2QuUkVGTEVDVDwvY29kZT4sIG9yXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlNwcmVhZE1ldGhvZC5SRVBFQVQ8L2NvZGU+LlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBzaW1wbGUgbGluZWFyXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50IGJldHdlZW4gdHdvIGNvbG9yczo8L3A+XG5cdCAqXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlRoaXMgZXhhbXBsZSB1c2VzXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlNwcmVhZE1ldGhvZC5QQUQ8L2NvZGU+IGZvciB0aGUgc3ByZWFkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwgYW5kIHRoZSBncmFkaWVudCBmaWxsIGxvb2tzIGxpa2UgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZzo8L3A+XG5cdCAqXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPklmIHlvdSB1c2UgPGNvZGU+U3ByZWFkTWV0aG9kLlJFRkxFQ1Q8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgc3ByZWFkIG1ldGhvZCwgdGhlIGdyYWRpZW50IGZpbGwgbG9va3Ncblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlrZSB0aGUgZm9sbG93aW5nOjwvcD5cblx0ICpcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+SWYgeW91IHVzZSA8Y29kZT5TcHJlYWRNZXRob2QuUkVQRUFUPC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHNwcmVhZCBtZXRob2QsIHRoZSBncmFkaWVudCBmaWxsIGxvb2tzXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpa2UgdGhlIGZvbGxvd2luZzo8L3A+XG5cdCAqIEBwYXJhbSBpbnRlcnBvbGF0aW9uTWV0aG9kIEEgdmFsdWUgZnJvbSB0aGUgSW50ZXJwb2xhdGlvbk1ldGhvZCBjbGFzcyB0aGF0XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGljaCB2YWx1ZSB0byB1c2U6XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkludGVycG9sYXRpb25NZXRob2QuTElORUFSX1JHQjwvY29kZT4gb3Jcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+SW50ZXJwb2xhdGlvbk1ldGhvZC5SR0I8L2NvZGU+XG5cdCAqXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPkZvciBleGFtcGxlLCBjb25zaWRlciBhIHNpbXBsZSBsaW5lYXJcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnQgYmV0d2VlbiB0d28gY29sb3JzKHdpdGggdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnNwcmVhZE1ldGhvZDwvY29kZT4gcGFyYW1ldGVyIHNldCB0b1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5TcHJlYWRNZXRob2QuUkVGTEVDVDwvY29kZT4pLiBUaGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGludGVycG9sYXRpb24gbWV0aG9kcyBhZmZlY3QgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2UgYXMgZm9sbG93czogPC9wPlxuXHQgKiBAcGFyYW0gZm9jYWxQb2ludFJhdGlvICAgICBBIG51bWJlciB0aGF0IGNvbnRyb2xzIHRoZSBsb2NhdGlvbiBvZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWwgcG9pbnQgb2YgdGhlIGdyYWRpZW50LiAwIG1lYW5zIHRoYXQgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsIHBvaW50IGlzIGluIHRoZSBjZW50ZXIuIDEgbWVhbnMgdGhhdCB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWwgcG9pbnQgaXMgYXQgb25lIGJvcmRlciBvZiB0aGUgZ3JhZGllbnRcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lyY2xlLiAtMSBtZWFucyB0aGF0IHRoZSBmb2NhbCBwb2ludCBpcyBhdCB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgYm9yZGVyIG9mIHRoZSBncmFkaWVudCBjaXJjbGUuIEEgdmFsdWVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIC0xIG9yIGdyZWF0ZXIgdGhhbiAxIGlzIHJvdW5kZWQgdG8gLTFcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgMS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93c1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIDxjb2RlPmZvY2FsUG9pbnRSYXRpbzwvY29kZT4gc2V0IHRvIDAuNzU6XG5cdCAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciBJZiB0aGUgPGNvZGU+dHlwZTwvY29kZT4gcGFyYW1ldGVyIGlzIG5vdCB2YWxpZC5cblx0ICovXG5cdHB1YmxpYyBiZWdpbkdyYWRpZW50RmlsbCh0eXBlOkdyYWRpZW50VHlwZSwgY29sb3JzOkFycmF5PG51bWJlciAvKmludCovPiwgYWxwaGFzOkFycmF5PG51bWJlcj4sIHJhdGlvczpBcnJheTxudW1iZXIgLyppbnQqLz4sIG1hdHJpeDpNYXRyaXggPSBudWxsLCBzcHJlYWRNZXRob2Q6c3RyaW5nID0gXCJwYWRcIiwgaW50ZXJwb2xhdGlvbk1ldGhvZDpzdHJpbmcgPSBcInJnYlwiLCBmb2NhbFBvaW50UmF0aW86bnVtYmVyID0gMClcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogU3BlY2lmaWVzIGEgc2hhZGVyIGZpbGwgdXNlZCBieSBzdWJzZXF1ZW50IGNhbGxzIHRvIG90aGVyIEdyYXBoaWNzIG1ldGhvZHNcblx0ICogKHN1Y2ggYXMgPGNvZGU+bGluZVRvKCk8L2NvZGU+IG9yIDxjb2RlPmRyYXdDaXJjbGUoKTwvY29kZT4pIGZvciB0aGVcblx0ICogb2JqZWN0LiBUaGUgZmlsbCByZW1haW5zIGluIGVmZmVjdCB1bnRpbCB5b3UgY2FsbCB0aGVcblx0ICogPGNvZGU+YmVnaW5GaWxsKCk8L2NvZGU+LCA8Y29kZT5iZWdpbkJpdG1hcEZpbGwoKTwvY29kZT4sXG5cdCAqIDxjb2RlPmJlZ2luR3JhZGllbnRGaWxsKCk8L2NvZGU+LCBvciA8Y29kZT5iZWdpblNoYWRlckZpbGwoKTwvY29kZT5cblx0ICogbWV0aG9kLiBDYWxsaW5nIHRoZSA8Y29kZT5jbGVhcigpPC9jb2RlPiBtZXRob2QgY2xlYXJzIHRoZSBmaWxsLlxuXHQgKlxuXHQgKiA8cD5UaGUgYXBwbGljYXRpb24gcmVuZGVycyB0aGUgZmlsbCB3aGVuZXZlciB0aHJlZSBvciBtb3JlIHBvaW50cyBhcmVcblx0ICogZHJhd24sIG9yIHdoZW4gdGhlIDxjb2RlPmVuZEZpbGwoKTwvY29kZT4gbWV0aG9kIGlzIGNhbGxlZC48L3A+XG5cdCAqXG5cdCAqIDxwPlNoYWRlciBmaWxscyBhcmUgbm90IHN1cHBvcnRlZCB1bmRlciBHUFUgcmVuZGVyaW5nOyBmaWxsZWQgYXJlYXMgd2lsbFxuXHQgKiBiZSBjb2xvcmVkIGN5YW4uPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gc2hhZGVyIFRoZSBzaGFkZXIgdG8gdXNlIGZvciB0aGUgZmlsbC4gVGhpcyBTaGFkZXIgaW5zdGFuY2UgaXMgbm90XG5cdCAqICAgICAgICAgICAgICAgcmVxdWlyZWQgdG8gc3BlY2lmeSBhbiBpbWFnZSBpbnB1dC4gSG93ZXZlciwgaWYgYW4gaW1hZ2Vcblx0ICogICAgICAgICAgICAgICBpbnB1dCBpcyBzcGVjaWZpZWQgaW4gdGhlIHNoYWRlciwgdGhlIGlucHV0IG11c3QgYmUgcHJvdmlkZWRcblx0ICogICAgICAgICAgICAgICBtYW51YWxseS4gVG8gc3BlY2lmeSB0aGUgaW5wdXQsIHNldCB0aGUgPGNvZGU+aW5wdXQ8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgcHJvcGVydHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgU2hhZGVySW5wdXQgcHJvcGVydHkgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgPGNvZGU+U2hhZGVyLmRhdGE8L2NvZGU+IHByb3BlcnR5LlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgIDxwPldoZW4geW91IHBhc3MgYSBTaGFkZXIgaW5zdGFuY2UgYXMgYW4gYXJndW1lbnQgdGhlIHNoYWRlclxuXHQgKiAgICAgICAgICAgICAgIGlzIGNvcGllZCBpbnRlcm5hbGx5LiBUaGUgZHJhd2luZyBmaWxsIG9wZXJhdGlvbiB1c2VzIHRoYXRcblx0ICogICAgICAgICAgICAgICBpbnRlcm5hbCBjb3B5LCBub3QgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIHNoYWRlci4gQW55XG5cdCAqICAgICAgICAgICAgICAgY2hhbmdlcyBtYWRlIHRvIHRoZSBzaGFkZXIsIHN1Y2ggYXMgY2hhbmdpbmcgYSBwYXJhbWV0ZXJcblx0ICogICAgICAgICAgICAgICB2YWx1ZSwgaW5wdXQsIG9yIGJ5dGVjb2RlLCBhcmUgbm90IGFwcGxpZWQgdG8gdGhlIGNvcGllZFxuXHQgKiAgICAgICAgICAgICAgIHNoYWRlciB0aGF0J3MgdXNlZCBmb3IgdGhlIGZpbGwuPC9wPlxuXHQgKiBAcGFyYW0gbWF0cml4IEEgbWF0cml4IG9iamVjdChvZiB0aGUgZmxhc2guZ2VvbS5NYXRyaXggY2xhc3MpLCB3aGljaCB5b3Vcblx0ICogICAgICAgICAgICAgICBjYW4gdXNlIHRvIGRlZmluZSB0cmFuc2Zvcm1hdGlvbnMgb24gdGhlIHNoYWRlci4gRm9yXG5cdCAqICAgICAgICAgICAgICAgZXhhbXBsZSwgeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBtYXRyaXggdG8gcm90YXRlIGEgc2hhZGVyXG5cdCAqICAgICAgICAgICAgICAgYnkgNDUgZGVncmVlcyhwaS80IHJhZGlhbnMpOlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgIDxwPlRoZSBjb29yZGluYXRlcyByZWNlaXZlZCBpbiB0aGUgc2hhZGVyIGFyZSBiYXNlZCBvbiB0aGVcblx0ICogICAgICAgICAgICAgICBtYXRyaXggdGhhdCBpcyBzcGVjaWZpZWQgZm9yIHRoZSA8Y29kZT5tYXRyaXg8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgcGFyYW1ldGVyLiBGb3IgYSBkZWZhdWx0KDxjb2RlPm51bGw8L2NvZGU+KSBtYXRyaXgsIHRoZVxuXHQgKiAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzIGluIHRoZSBzaGFkZXIgYXJlIGxvY2FsIHBpeGVsIGNvb3JkaW5hdGVzIHdoaWNoXG5cdCAqICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgdG8gc2FtcGxlIGFuIGlucHV0LjwvcD5cblx0ICogQHRocm93cyBBcmd1bWVudEVycm9yIFdoZW4gdGhlIHNoYWRlciBvdXRwdXQgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG9wZXJhdGlvbih0aGUgc2hhZGVyIG11c3Qgc3BlY2lmeSBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT5waXhlbDM8L2NvZGU+IG9yIDxjb2RlPnBpeGVsNDwvY29kZT4gb3V0cHV0KS5cblx0ICogQHRocm93cyBBcmd1bWVudEVycm9yIFdoZW4gdGhlIHNoYWRlciBzcGVjaWZpZXMgYW4gaW1hZ2UgaW5wdXQgdGhhdCBpc24ndFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQuXG5cdCAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciBXaGVuIGEgQnl0ZUFycmF5IG9yIFZlY3Rvci48TnVtYmVyPiBpbnN0YW5jZSBpcyB1c2VkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBhcyBhbiBpbnB1dCBhbmQgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiBhbmRcblx0ICogICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcyBhcmVuJ3Qgc3BlY2lmaWVkIGZvclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNoYWRlcklucHV0LCBvciB0aGUgc3BlY2lmaWVkIHZhbHVlcyBkb24ndCBtYXRjaFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFtb3VudCBvZiBkYXRhIGluIHRoZSBpbnB1dCBvYmplY3QuIFNlZSB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlNoYWRlcklucHV0LmlucHV0PC9jb2RlPiBwcm9wZXJ0eSBmb3IgbW9yZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24uXG5cdCAqL1xuLy9cdFx0cHVibGljIGJlZ2luU2hhZGVyRmlsbChzaGFkZXI6U2hhZGVyLCBtYXRyaXg6TWF0cml4ID0gbnVsbClcbi8vXHRcdHtcbi8vXG4vL1x0XHR9XG5cblx0LyoqXG5cdCAqIENsZWFycyB0aGUgZ3JhcGhpY3MgdGhhdCB3ZXJlIGRyYXduIHRvIHRoaXMgR3JhcGhpY3Mgb2JqZWN0LCBhbmQgcmVzZXRzXG5cdCAqIGZpbGwgYW5kIGxpbmUgc3R5bGUgc2V0dGluZ3MuXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXIoKVxuXHR7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBDb3BpZXMgYWxsIG9mIGRyYXdpbmcgY29tbWFuZHMgZnJvbSB0aGUgc291cmNlIEdyYXBoaWNzIG9iamVjdCBpbnRvIHRoZVxuXHQgKiBjYWxsaW5nIEdyYXBoaWNzIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZUdyYXBoaWNzIFRoZSBHcmFwaGljcyBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHRoZSBkcmF3aW5nXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kcy5cblx0ICovXG5cdHB1YmxpYyBjb3B5RnJvbShzb3VyY2VHcmFwaGljczpHcmFwaGljcylcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogRHJhd3MgYSBjdWJpYyBCZXppZXIgY3VydmUgZnJvbSB0aGUgY3VycmVudCBkcmF3aW5nIHBvc2l0aW9uIHRvIHRoZVxuXHQgKiBzcGVjaWZpZWQgYW5jaG9yIHBvaW50LiBDdWJpYyBCZXppZXIgY3VydmVzIGNvbnNpc3Qgb2YgdHdvIGFuY2hvciBwb2ludHNcblx0ICogYW5kIHR3byBjb250cm9sIHBvaW50cy4gVGhlIGN1cnZlIGludGVycG9sYXRlcyB0aGUgdHdvIGFuY2hvciBwb2ludHMgYW5kXG5cdCAqIGN1cnZlcyB0b3dhcmQgdGhlIHR3byBjb250cm9sIHBvaW50cy5cblx0ICpcblx0ICogVGhlIGZvdXIgcG9pbnRzIHlvdSB1c2UgdG8gZHJhdyBhIGN1YmljIEJlemllciBjdXJ2ZSB3aXRoIHRoZVxuXHQgKiA8Y29kZT5jdWJpY0N1cnZlVG8oKTwvY29kZT4gbWV0aG9kIGFyZSBhcyBmb2xsb3dzOlxuXHQgKlxuXHQgKiA8dWw+XG5cdCAqICAgPGxpPlRoZSBjdXJyZW50IGRyYXdpbmcgcG9zaXRpb24gaXMgdGhlIGZpcnN0IGFuY2hvciBwb2ludC4gPC9saT5cblx0ICogICA8bGk+VGhlIGFuY2hvclggYW5kIGFuY2hvclkgcGFyYW1ldGVycyBzcGVjaWZ5IHRoZSBzZWNvbmQgYW5jaG9yIHBvaW50LlxuXHQgKiAgIDwvbGk+XG5cdCAqICAgPGxpPlRoZSA8Y29kZT5jb250cm9sWDE8L2NvZGU+IGFuZCA8Y29kZT5jb250cm9sWTE8L2NvZGU+IHBhcmFtZXRlcnNcblx0ICogICBzcGVjaWZ5IHRoZSBmaXJzdCBjb250cm9sIHBvaW50LjwvbGk+XG5cdCAqICAgPGxpPlRoZSA8Y29kZT5jb250cm9sWDI8L2NvZGU+IGFuZCA8Y29kZT5jb250cm9sWTI8L2NvZGU+IHBhcmFtZXRlcnNcblx0ICogICBzcGVjaWZ5IHRoZSBzZWNvbmQgY29udHJvbCBwb2ludC48L2xpPlxuXHQgKiA8L3VsPlxuXHQgKlxuXHQgKiBJZiB5b3UgY2FsbCB0aGUgPGNvZGU+Y3ViaWNDdXJ2ZVRvKCk8L2NvZGU+IG1ldGhvZCBiZWZvcmUgY2FsbGluZyB0aGVcblx0ICogPGNvZGU+bW92ZVRvKCk8L2NvZGU+IG1ldGhvZCwgeW91ciBjdXJ2ZSBzdGFydHMgYXQgcG9zaXRpb24gKDAsIDApLlxuXHQgKlxuXHQgKiBJZiB0aGUgPGNvZGU+Y3ViaWNDdXJ2ZVRvKCk8L2NvZGU+IG1ldGhvZCBzdWNjZWVkcywgdGhlIEZsYXNoIHJ1bnRpbWUgc2V0c1xuXHQgKiB0aGUgY3VycmVudCBkcmF3aW5nIHBvc2l0aW9uIHRvICg8Y29kZT5hbmNob3JYPC9jb2RlPixcblx0ICogPGNvZGU+YW5jaG9yWTwvY29kZT4pLiBJZiB0aGUgPGNvZGU+Y3ViaWNDdXJ2ZVRvKCk8L2NvZGU+IG1ldGhvZCBmYWlscyxcblx0ICogdGhlIGN1cnJlbnQgZHJhd2luZyBwb3NpdGlvbiByZW1haW5zIHVuY2hhbmdlZC5cblx0ICpcblx0ICogSWYgeW91ciBtb3ZpZSBjbGlwIGNvbnRhaW5zIGNvbnRlbnQgY3JlYXRlZCB3aXRoIHRoZSBGbGFzaCBkcmF3aW5nIHRvb2xzLFxuXHQgKiB0aGUgcmVzdWx0cyBvZiBjYWxscyB0byB0aGUgPGNvZGU+Y3ViaWNDdXJ2ZVRvKCk8L2NvZGU+IG1ldGhvZCBhcmUgZHJhd25cblx0ICogdW5kZXJuZWF0aCB0aGF0IGNvbnRlbnQuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb250cm9sWDEgU3BlY2lmaWVzIHRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjb250cm9sXG5cdCAqICAgICAgICAgICAgICAgICAgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50XG5cdCAqICAgICAgICAgICAgICAgICAgZGlzcGxheSBvYmplY3QuXG5cdCAqIEBwYXJhbSBjb250cm9sWTEgU3BlY2lmaWVzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY29udHJvbFxuXHQgKiAgICAgICAgICAgICAgICAgIHBvaW50IHJlbGF0aXZlIHRvIHRoZSByZWdpc3RyYXRpb24gcG9pbnQgb2YgdGhlIHBhcmVudFxuXHQgKiAgICAgICAgICAgICAgICAgIGRpc3BsYXkgb2JqZWN0LlxuXHQgKiBAcGFyYW0gY29udHJvbFgyIFNwZWNpZmllcyB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgc2Vjb25kIGNvbnRyb2xcblx0ICogICAgICAgICAgICAgICAgICBwb2ludCByZWxhdGl2ZSB0byB0aGUgcmVnaXN0cmF0aW9uIHBvaW50IG9mIHRoZSBwYXJlbnRcblx0ICogICAgICAgICAgICAgICAgICBkaXNwbGF5IG9iamVjdC5cblx0ICogQHBhcmFtIGNvbnRyb2xZMiBTcGVjaWZpZXMgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmQgY29udHJvbFxuXHQgKiAgICAgICAgICAgICAgICAgIHBvaW50IHJlbGF0aXZlIHRvIHRoZSByZWdpc3RyYXRpb24gcG9pbnQgb2YgdGhlIHBhcmVudFxuXHQgKiAgICAgICAgICAgICAgICAgIGRpc3BsYXkgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYW5jaG9yWCAgIFNwZWNpZmllcyB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBvZiB0aGUgYW5jaG9yIHBvaW50XG5cdCAqICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50IGRpc3BsYXlcblx0ICogICAgICAgICAgICAgICAgICBvYmplY3QuXG5cdCAqIEBwYXJhbSBhbmNob3JZICAgU3BlY2lmaWVzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0aGUgYW5jaG9yIHBvaW50XG5cdCAqICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50IGRpc3BsYXlcblx0ICogICAgICAgICAgICAgICAgICBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY3ViaWNDdXJ2ZVRvKGNvbnRyb2xYMTpudW1iZXIsIGNvbnRyb2xZMTpudW1iZXIsIGNvbnRyb2xYMjpudW1iZXIsIGNvbnRyb2xZMjpudW1iZXIsIGFuY2hvclg6bnVtYmVyLCBhbmNob3JZOm51bWJlcilcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogRHJhd3MgYSBjdXJ2ZSB1c2luZyB0aGUgY3VycmVudCBsaW5lIHN0eWxlIGZyb20gdGhlIGN1cnJlbnQgZHJhd2luZ1xuXHQgKiBwb3NpdGlvbiB0byhhbmNob3JYLCBhbmNob3JZKSBhbmQgdXNpbmcgdGhlIGNvbnRyb2wgcG9pbnQgdGhhdFxuXHQgKiAoPGNvZGU+Y29udHJvbFg8L2NvZGU+LCA8Y29kZT5jb250cm9sWTwvY29kZT4pIHNwZWNpZmllcy4gVGhlIGN1cnJlbnRcblx0ICogZHJhd2luZyBwb3NpdGlvbiBpcyB0aGVuIHNldCB0byg8Y29kZT5hbmNob3JYPC9jb2RlPixcblx0ICogPGNvZGU+YW5jaG9yWTwvY29kZT4pLiBJZiB0aGUgbW92aWUgY2xpcCBpbiB3aGljaCB5b3UgYXJlIGRyYXdpbmcgY29udGFpbnNcblx0ICogY29udGVudCBjcmVhdGVkIHdpdGggdGhlIEZsYXNoIGRyYXdpbmcgdG9vbHMsIGNhbGxzIHRvIHRoZVxuXHQgKiA8Y29kZT5jdXJ2ZVRvKCk8L2NvZGU+IG1ldGhvZCBhcmUgZHJhd24gdW5kZXJuZWF0aCB0aGlzIGNvbnRlbnQuIElmIHlvdVxuXHQgKiBjYWxsIHRoZSA8Y29kZT5jdXJ2ZVRvKCk8L2NvZGU+IG1ldGhvZCBiZWZvcmUgYW55IGNhbGxzIHRvIHRoZVxuXHQgKiA8Y29kZT5tb3ZlVG8oKTwvY29kZT4gbWV0aG9kLCB0aGUgZGVmYXVsdCBvZiB0aGUgY3VycmVudCBkcmF3aW5nIHBvc2l0aW9uXG5cdCAqIGlzKDAsIDApLiBJZiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcsIHRoaXMgbWV0aG9kIGZhaWxzIGFuZCB0aGVcblx0ICogY3VycmVudCBkcmF3aW5nIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkLlxuXHQgKlxuXHQgKiA8cD5UaGUgY3VydmUgZHJhd24gaXMgYSBxdWFkcmF0aWMgQmV6aWVyIGN1cnZlLiBRdWFkcmF0aWMgQmV6aWVyIGN1cnZlc1xuXHQgKiBjb25zaXN0IG9mIHR3byBhbmNob3IgcG9pbnRzIGFuZCBvbmUgY29udHJvbCBwb2ludC4gVGhlIGN1cnZlIGludGVycG9sYXRlc1xuXHQgKiB0aGUgdHdvIGFuY2hvciBwb2ludHMgYW5kIGN1cnZlcyB0b3dhcmQgdGhlIGNvbnRyb2wgcG9pbnQuIDwvcD5cblx0ICpcblx0ICogQHBhcmFtIGNvbnRyb2xYIEEgbnVtYmVyIHRoYXQgc3BlY2lmaWVzIHRoZSBob3Jpem9udGFsIHBvc2l0aW9uIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgY29udHJvbCBwb2ludCByZWxhdGl2ZSB0byB0aGUgcmVnaXN0cmF0aW9uIHBvaW50IG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgcGFyZW50IGRpc3BsYXkgb2JqZWN0LlxuXHQgKiBAcGFyYW0gY29udHJvbFkgQSBudW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgY29udHJvbCBwb2ludCByZWxhdGl2ZSB0byB0aGUgcmVnaXN0cmF0aW9uIHBvaW50IG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgcGFyZW50IGRpc3BsYXkgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYW5jaG9yWCAgQSBudW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgICBuZXh0IGFuY2hvciBwb2ludCByZWxhdGl2ZSB0byB0aGUgcmVnaXN0cmF0aW9uIHBvaW50IG9mXG5cdCAqICAgICAgICAgICAgICAgICB0aGUgcGFyZW50IGRpc3BsYXkgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYW5jaG9yWSAgQSBudW1iZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIG9mIHRoZSBuZXh0XG5cdCAqICAgICAgICAgICAgICAgICBhbmNob3IgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGVcblx0ICogICAgICAgICAgICAgICAgIHBhcmVudCBkaXNwbGF5IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBjdXJ2ZVRvKGNvbnRyb2xYOm51bWJlciwgY29udHJvbFk6bnVtYmVyLCBhbmNob3JYOm51bWJlciwgYW5jaG9yWTpudW1iZXIpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIERyYXdzIGEgY2lyY2xlLiBTZXQgdGhlIGxpbmUgc3R5bGUsIGZpbGwsIG9yIGJvdGggYmVmb3JlIHlvdSBjYWxsIHRoZVxuXHQgKiA8Y29kZT5kcmF3Q2lyY2xlKCk8L2NvZGU+IG1ldGhvZCwgYnkgY2FsbGluZyB0aGUgPGNvZGU+bGluZXN0eWxlKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5saW5lR3JhZGllbnRTdHlsZSgpPC9jb2RlPiwgPGNvZGU+YmVnaW5GaWxsKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5iZWdpbkdyYWRpZW50RmlsbCgpPC9jb2RlPiwgb3IgPGNvZGU+YmVnaW5CaXRtYXBGaWxsKCk8L2NvZGU+XG5cdCAqIG1ldGhvZC5cblx0ICpcblx0ICogQHBhcmFtIHggICAgICBUaGUgPGk+eDwvaT4gbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlIHJlbGF0aXZlXG5cdCAqICAgICAgICAgICAgICAgdG8gdGhlIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50IGRpc3BsYXkgb2JqZWN0KGluXG5cdCAqICAgICAgICAgICAgICAgcGl4ZWxzKS5cblx0ICogQHBhcmFtIHkgICAgICBUaGUgPGk+eTwvaT4gbG9jYXRpb24gb2YgdGhlIGNlbnRlciBvZiB0aGUgY2lyY2xlIHJlbGF0aXZlXG5cdCAqICAgICAgICAgICAgICAgdG8gdGhlIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50IGRpc3BsYXkgb2JqZWN0KGluXG5cdCAqICAgICAgICAgICAgICAgcGl4ZWxzKS5cblx0ICogQHBhcmFtIHJhZGl1cyBUaGUgcmFkaXVzIG9mIHRoZSBjaXJjbGUoaW4gcGl4ZWxzKS5cblx0ICovXG5cdHB1YmxpYyBkcmF3Q2lyY2xlKHg6bnVtYmVyLCB5Om51bWJlciwgcmFkaXVzOm51bWJlcilcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogRHJhd3MgYW4gZWxsaXBzZS4gU2V0IHRoZSBsaW5lIHN0eWxlLCBmaWxsLCBvciBib3RoIGJlZm9yZSB5b3UgY2FsbCB0aGVcblx0ICogPGNvZGU+ZHJhd0VsbGlwc2UoKTwvY29kZT4gbWV0aG9kLCBieSBjYWxsaW5nIHRoZVxuXHQgKiA8Y29kZT5saW5lc3R5bGUoKTwvY29kZT4sIDxjb2RlPmxpbmVHcmFkaWVudFN0eWxlKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5iZWdpbkZpbGwoKTwvY29kZT4sIDxjb2RlPmJlZ2luR3JhZGllbnRGaWxsKCk8L2NvZGU+LCBvclxuXHQgKiA8Y29kZT5iZWdpbkJpdG1hcEZpbGwoKTwvY29kZT4gbWV0aG9kLlxuXHQgKlxuXHQgKiBAcGFyYW0geCAgICAgIFRoZSA8aT54PC9pPiBsb2NhdGlvbiBvZiB0aGUgdG9wLWxlZnQgb2YgdGhlIGJvdW5kaW5nLWJveCBvZlxuXHQgKiAgICAgICAgICAgICAgIHRoZSBlbGxpcHNlIHJlbGF0aXZlIHRvIHRoZSByZWdpc3RyYXRpb24gcG9pbnQgb2YgdGhlIHBhcmVudFxuXHQgKiAgICAgICAgICAgICAgIGRpc3BsYXkgb2JqZWN0KGluIHBpeGVscykuXG5cdCAqIEBwYXJhbSB5ICAgICAgVGhlIDxpPnk8L2k+IGxvY2F0aW9uIG9mIHRoZSB0b3AgbGVmdCBvZiB0aGUgYm91bmRpbmctYm94IG9mXG5cdCAqICAgICAgICAgICAgICAgdGhlIGVsbGlwc2UgcmVsYXRpdmUgdG8gdGhlIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50XG5cdCAqICAgICAgICAgICAgICAgZGlzcGxheSBvYmplY3QoaW4gcGl4ZWxzKS5cblx0ICogQHBhcmFtIHdpZHRoICBUaGUgd2lkdGggb2YgdGhlIGVsbGlwc2UoaW4gcGl4ZWxzKS5cblx0ICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSBlbGxpcHNlKGluIHBpeGVscykuXG5cdCAqL1xuXHRwdWJsaWMgZHJhd0VsbGlwc2UoeDpudW1iZXIsIHk6bnVtYmVyLCB3aWR0aDpudW1iZXIsIGhlaWdodDpudW1iZXIpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdHMgYSBzZXJpZXMgb2YgSUdyYXBoaWNzRGF0YSBpbnN0YW5jZXMgZm9yIGRyYXdpbmcuIFRoaXMgbWV0aG9kXG5cdCAqIGFjY2VwdHMgYSBWZWN0b3IgY29udGFpbmluZyBvYmplY3RzIGluY2x1ZGluZyBwYXRocywgZmlsbHMsIGFuZCBzdHJva2VzXG5cdCAqIHRoYXQgaW1wbGVtZW50IHRoZSBJR3JhcGhpY3NEYXRhIGludGVyZmFjZS4gQSBWZWN0b3Igb2YgSUdyYXBoaWNzRGF0YVxuXHQgKiBpbnN0YW5jZXMgY2FuIHJlZmVyIHRvIGEgcGFydCBvZiBhIHNoYXBlLCBvciBhIGNvbXBsZXggZnVsbHkgZGVmaW5lZCBzZXRcblx0ICogb2YgZGF0YSBmb3IgcmVuZGVyaW5nIGEgY29tcGxldGUgc2hhcGUuXG5cdCAqXG5cdCAqIDxwPiBHcmFwaGljcyBwYXRocyBjYW4gY29udGFpbiBvdGhlciBncmFwaGljcyBwYXRocy4gSWYgdGhlXG5cdCAqIDxjb2RlPmdyYXBoaWNzRGF0YTwvY29kZT4gVmVjdG9yIGluY2x1ZGVzIGEgcGF0aCwgdGhhdCBwYXRoIGFuZCBhbGwgaXRzXG5cdCAqIHN1Yi1wYXRocyBhcmUgcmVuZGVyZWQgZHVyaW5nIHRoaXMgb3BlcmF0aW9uLiA8L3A+XG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZHJhd0dyYXBoaWNzRGF0YShncmFwaGljc0RhdGE6QXJyYXk8SUdyYXBoaWNzRGF0YT4pXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFN1Ym1pdHMgYSBzZXJpZXMgb2YgY29tbWFuZHMgZm9yIGRyYXdpbmcuIFRoZSA8Y29kZT5kcmF3UGF0aCgpPC9jb2RlPlxuXHQgKiBtZXRob2QgdXNlcyB2ZWN0b3IgYXJyYXlzIHRvIGNvbnNvbGlkYXRlIGluZGl2aWR1YWwgPGNvZGU+bW92ZVRvKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5saW5lVG8oKTwvY29kZT4sIGFuZCA8Y29kZT5jdXJ2ZVRvKCk8L2NvZGU+IGRyYXdpbmcgY29tbWFuZHMgaW50byBhXG5cdCAqIHNpbmdsZSBjYWxsLiBUaGUgPGNvZGU+ZHJhd1BhdGgoKTwvY29kZT4gbWV0aG9kIHBhcmFtZXRlcnMgY29tYmluZSBkcmF3aW5nXG5cdCAqIGNvbW1hbmRzIHdpdGggeC0gYW5kIHktY29vcmRpbmF0ZSB2YWx1ZSBwYWlycyBhbmQgYSBkcmF3aW5nIGRpcmVjdGlvbi4gVGhlXG5cdCAqIGRyYXdpbmcgY29tbWFuZHMgYXJlIHZhbHVlcyBmcm9tIHRoZSBHcmFwaGljc1BhdGhDb21tYW5kIGNsYXNzLiBUaGUgeC0gYW5kXG5cdCAqIHktY29vcmRpbmF0ZSB2YWx1ZSBwYWlycyBhcmUgTnVtYmVycyBpbiBhbiBhcnJheSB3aGVyZSBlYWNoIHBhaXIgZGVmaW5lcyBhXG5cdCAqIGNvb3JkaW5hdGUgbG9jYXRpb24uIFRoZSBkcmF3aW5nIGRpcmVjdGlvbiBpcyBhIHZhbHVlIGZyb20gdGhlXG5cdCAqIEdyYXBoaWNzUGF0aFdpbmRpbmcgY2xhc3MuXG5cdCAqXG5cdCAqIDxwPiBHZW5lcmFsbHksIGRyYXdpbmdzIHJlbmRlciBmYXN0ZXIgd2l0aCA8Y29kZT5kcmF3UGF0aCgpPC9jb2RlPiB0aGFuXG5cdCAqIHdpdGggYSBzZXJpZXMgb2YgaW5kaXZpZHVhbCA8Y29kZT5saW5lVG8oKTwvY29kZT4gYW5kXG5cdCAqIDxjb2RlPmN1cnZlVG8oKTwvY29kZT4gbWV0aG9kcy4gPC9wPlxuXHQgKlxuXHQgKiA8cD4gVGhlIDxjb2RlPmRyYXdQYXRoKCk8L2NvZGU+IG1ldGhvZCB1c2VzIGEgdXNlcyBhIGZsb2F0aW5nIGNvbXB1dGF0aW9uXG5cdCAqIHNvIHJvdGF0aW9uIGFuZCBzY2FsaW5nIG9mIHNoYXBlcyBpcyBtb3JlIGFjY3VyYXRlIGFuZCBnaXZlcyBiZXR0ZXJcblx0ICogcmVzdWx0cy4gSG93ZXZlciwgY3VydmVzIHN1Ym1pdHRlZCB1c2luZyB0aGUgPGNvZGU+ZHJhd1BhdGgoKTwvY29kZT5cblx0ICogbWV0aG9kIGNhbiBoYXZlIHNtYWxsIHN1Yi1waXhlbCBhbGlnbm1lbnQgZXJyb3JzIHdoZW4gdXNlZCBpbiBjb25qdW5jdGlvblxuXHQgKiB3aXRoIHRoZSA8Y29kZT5saW5lVG8oKTwvY29kZT4gYW5kIDxjb2RlPmN1cnZlVG8oKTwvY29kZT4gbWV0aG9kcy4gPC9wPlxuXHQgKlxuXHQgKiA8cD4gVGhlIDxjb2RlPmRyYXdQYXRoKCk8L2NvZGU+IG1ldGhvZCBhbHNvIHVzZXMgc2xpZ2h0bHkgZGlmZmVyZW50IHJ1bGVzXG5cdCAqIGZvciBmaWxsaW5nIGFuZCBkcmF3aW5nIGxpbmVzLiBUaGV5IGFyZTogPC9wPlxuXHQgKlxuXHQgKiA8dWw+XG5cdCAqICAgPGxpPldoZW4gYSBmaWxsIGlzIGFwcGxpZWQgdG8gcmVuZGVyaW5nIGEgcGF0aDpcblx0ICogPHVsPlxuXHQgKiAgIDxsaT5BIHN1Yi1wYXRoIG9mIGxlc3MgdGhhbiAzIHBvaW50cyBpcyBub3QgcmVuZGVyZWQuKEJ1dCBub3RlIHRoYXQgdGhlXG5cdCAqIHN0cm9rZSByZW5kZXJpbmcgd2lsbCBzdGlsbCBvY2N1ciwgY29uc2lzdGVudCB3aXRoIHRoZSBydWxlcyBmb3Igc3Ryb2tlc1xuXHQgKiBiZWxvdy4pPC9saT5cblx0ICogICA8bGk+QSBzdWItcGF0aCB0aGF0IGlzbid0IGNsb3NlZCh0aGUgZW5kIHBvaW50IGlzIG5vdCBlcXVhbCB0byB0aGVcblx0ICogYmVnaW4gcG9pbnQpIGlzIGltcGxpY2l0bHkgY2xvc2VkLjwvbGk+XG5cdCAqIDwvdWw+XG5cdCAqIDwvbGk+XG5cdCAqICAgPGxpPldoZW4gYSBzdHJva2UgaXMgYXBwbGllZCB0byByZW5kZXJpbmcgYSBwYXRoOlxuXHQgKiA8dWw+XG5cdCAqICAgPGxpPlRoZSBzdWItcGF0aHMgY2FuIGJlIGNvbXBvc2VkIG9mIGFueSBudW1iZXIgb2YgcG9pbnRzLjwvbGk+XG5cdCAqICAgPGxpPlRoZSBzdWItcGF0aCBpcyBuZXZlciBpbXBsaWNpdGx5IGNsb3NlZC48L2xpPlxuXHQgKiA8L3VsPlxuXHQgKiA8L2xpPlxuXHQgKiA8L3VsPlxuXHQgKlxuXHQgKiBAcGFyYW0gd2luZGluZyBTcGVjaWZpZXMgdGhlIHdpbmRpbmcgcnVsZSB1c2luZyBhIHZhbHVlIGRlZmluZWQgaW4gdGhlXG5cdCAqICAgICAgICAgICAgICAgIEdyYXBoaWNzUGF0aFdpbmRpbmcgY2xhc3MuXG5cdCAqL1xuXHRwdWJsaWMgZHJhd1BhdGgoY29tbWFuZHM6QXJyYXk8bnVtYmVyIC8qaW50Ki8+LCBkYXRhOkFycmF5PG51bWJlcj4sIHdpbmRpbmc6R3JhcGhpY3NQYXRoV2luZGluZylcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogRHJhd3MgYSByZWN0YW5nbGUuIFNldCB0aGUgbGluZSBzdHlsZSwgZmlsbCwgb3IgYm90aCBiZWZvcmUgeW91IGNhbGwgdGhlXG5cdCAqIDxjb2RlPmRyYXdSZWN0KCk8L2NvZGU+IG1ldGhvZCwgYnkgY2FsbGluZyB0aGUgPGNvZGU+bGluZXN0eWxlKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5saW5lR3JhZGllbnRTdHlsZSgpPC9jb2RlPiwgPGNvZGU+YmVnaW5GaWxsKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5iZWdpbkdyYWRpZW50RmlsbCgpPC9jb2RlPiwgb3IgPGNvZGU+YmVnaW5CaXRtYXBGaWxsKCk8L2NvZGU+XG5cdCAqIG1ldGhvZC5cblx0ICpcblx0ICogQHBhcmFtIHggICAgICBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSBob3Jpem9udGFsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZVxuXHQgKiAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50IGRpc3BsYXkgb2JqZWN0KGluIHBpeGVscykuXG5cdCAqIEBwYXJhbSB5ICAgICAgQSBudW1iZXIgaW5kaWNhdGluZyB0aGUgdmVydGljYWwgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlXG5cdCAqICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uIHBvaW50IG9mIHRoZSBwYXJlbnQgZGlzcGxheSBvYmplY3QoaW4gcGl4ZWxzKS5cblx0ICogQHBhcmFtIHdpZHRoICBUaGUgd2lkdGggb2YgdGhlIHJlY3RhbmdsZShpbiBwaXhlbHMpLlxuXHQgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHJlY3RhbmdsZShpbiBwaXhlbHMpLlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgSWYgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiBvciA8Y29kZT5oZWlnaHQ8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBub3QgYSBudW1iZXJcblx0ICogICAgICAgICAgICAgICAgICAgICAgKDxjb2RlPk51bWJlci5OYU48L2NvZGU+KS5cblx0ICovXG5cdHB1YmxpYyBkcmF3UmVjdCh4Om51bWJlciwgeTpudW1iZXIsIHdpZHRoOm51bWJlciwgaGVpZ2h0Om51bWJlcilcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogRHJhd3MgYSByb3VuZGVkIHJlY3RhbmdsZS4gU2V0IHRoZSBsaW5lIHN0eWxlLCBmaWxsLCBvciBib3RoIGJlZm9yZSB5b3Vcblx0ICogY2FsbCB0aGUgPGNvZGU+ZHJhd1JvdW5kUmVjdCgpPC9jb2RlPiBtZXRob2QsIGJ5IGNhbGxpbmcgdGhlXG5cdCAqIDxjb2RlPmxpbmVzdHlsZSgpPC9jb2RlPiwgPGNvZGU+bGluZUdyYWRpZW50U3R5bGUoKTwvY29kZT4sXG5cdCAqIDxjb2RlPmJlZ2luRmlsbCgpPC9jb2RlPiwgPGNvZGU+YmVnaW5HcmFkaWVudEZpbGwoKTwvY29kZT4sIG9yXG5cdCAqIDxjb2RlPmJlZ2luQml0bWFwRmlsbCgpPC9jb2RlPiBtZXRob2QuXG5cdCAqXG5cdCAqIEBwYXJhbSB4ICAgICAgICAgICAgIEEgbnVtYmVyIGluZGljYXRpbmcgdGhlIGhvcml6b250YWwgcG9zaXRpb24gcmVsYXRpdmVcblx0ICogICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50IGRpc3BsYXlcblx0ICogICAgICAgICAgICAgICAgICAgICAgb2JqZWN0KGluIHBpeGVscykuXG5cdCAqIEBwYXJhbSB5ICAgICAgICAgICAgIEEgbnVtYmVyIGluZGljYXRpbmcgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIHJlbGF0aXZlIHRvXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWdpc3RyYXRpb24gcG9pbnQgb2YgdGhlIHBhcmVudCBkaXNwbGF5IG9iamVjdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIChpbiBwaXhlbHMpLlxuXHQgKiBAcGFyYW0gd2lkdGggICAgICAgICBUaGUgd2lkdGggb2YgdGhlIHJvdW5kIHJlY3RhbmdsZShpbiBwaXhlbHMpLlxuXHQgKiBAcGFyYW0gaGVpZ2h0ICAgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSByb3VuZCByZWN0YW5nbGUoaW4gcGl4ZWxzKS5cblx0ICogQHBhcmFtIGVsbGlwc2VXaWR0aCAgVGhlIHdpZHRoIG9mIHRoZSBlbGxpcHNlIHVzZWQgdG8gZHJhdyB0aGUgcm91bmRlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBjb3JuZXJzKGluIHBpeGVscykuXG5cdCAqIEBwYXJhbSBlbGxpcHNlSGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIGVsbGlwc2UgdXNlZCB0byBkcmF3IHRoZSByb3VuZGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGNvcm5lcnMoaW4gcGl4ZWxzKS4gT3B0aW9uYWw7IGlmIG5vIHZhbHVlIGlzXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgdmFsdWUgbWF0Y2hlcyB0aGF0IHByb3ZpZGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgPGNvZGU+ZWxsaXBzZVdpZHRoPC9jb2RlPiBwYXJhbWV0ZXIuXG5cdCAqIEB0aHJvd3MgQXJndW1lbnRFcnJvciBJZiB0aGUgPGNvZGU+d2lkdGg8L2NvZGU+LCA8Y29kZT5oZWlnaHQ8L2NvZGU+LFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+ZWxsaXBzZVdpZHRoPC9jb2RlPiBvclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+ZWxsaXBzZUhlaWdodDwvY29kZT4gcGFyYW1ldGVycyBhcmUgbm90IGFcblx0ICogICAgICAgICAgICAgICAgICAgICAgIG51bWJlcig8Y29kZT5OdW1iZXIuTmFOPC9jb2RlPikuXG5cdCAqL1xuXHRwdWJsaWMgZHJhd1JvdW5kUmVjdCh4Om51bWJlciwgeTpudW1iZXIsIHdpZHRoOm51bWJlciwgaGVpZ2h0Om51bWJlciwgZWxsaXBzZVdpZHRoOm51bWJlciwgZWxsaXBzZUhlaWdodDpudW1iZXIgPSBOYU4pXG5cdHtcblxuXHR9XG5cblx0Ly9wdWJsaWMgZHJhd1JvdW5kUmVjdENvbXBsZXgoeDpGbG9hdCwgeTpGbG9hdCwgd2lkdGg6RmxvYXQsIGhlaWdodDpGbG9hdCwgdG9wTGVmdFJhZGl1czpGbG9hdCwgdG9wUmlnaHRSYWRpdXM6RmxvYXQsIGJvdHRvbUxlZnRSYWRpdXM6RmxvYXQsIGJvdHRvbVJpZ2h0UmFkaXVzOkZsb2F0KTpWb2lkO1xuXG5cdC8qKlxuXHQgKiBSZW5kZXJzIGEgc2V0IG9mIHRyaWFuZ2xlcywgdHlwaWNhbGx5IHRvIGRpc3RvcnQgYml0bWFwcyBhbmQgZ2l2ZSB0aGVtIGFcblx0ICogdGhyZWUtZGltZW5zaW9uYWwgYXBwZWFyYW5jZS4gVGhlIDxjb2RlPmRyYXdUcmlhbmdsZXMoKTwvY29kZT4gbWV0aG9kIG1hcHNcblx0ICogZWl0aGVyIHRoZSBjdXJyZW50IGZpbGwsIG9yIGEgYml0bWFwIGZpbGwsIHRvIHRoZSB0cmlhbmdsZSBmYWNlcyB1c2luZyBhXG5cdCAqIHNldCBvZih1LHYpIGNvb3JkaW5hdGVzLlxuXHQgKlxuXHQgKiA8cD4gQW55IHR5cGUgb2YgZmlsbCBjYW4gYmUgdXNlZCwgYnV0IGlmIHRoZSBmaWxsIGhhcyBhIHRyYW5zZm9ybSBtYXRyaXhcblx0ICogdGhhdCB0cmFuc2Zvcm0gbWF0cml4IGlzIGlnbm9yZWQuIDwvcD5cblx0ICpcblx0ICogPHA+IEEgPGNvZGU+dXZ0RGF0YTwvY29kZT4gcGFyYW1ldGVyIGltcHJvdmVzIHRleHR1cmUgbWFwcGluZyB3aGVuIGFcblx0ICogYml0bWFwIGZpbGwgaXMgdXNlZC4gPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gY3VsbGluZyBTcGVjaWZpZXMgd2hldGhlciB0byByZW5kZXIgdHJpYW5nbGVzIHRoYXQgZmFjZSBpbiBhXG5cdCAqICAgICAgICAgICAgICAgIHNwZWNpZmllZCBkaXJlY3Rpb24uIFRoaXMgcGFyYW1ldGVyIHByZXZlbnRzIHRoZSByZW5kZXJpbmdcblx0ICogICAgICAgICAgICAgICAgb2YgdHJpYW5nbGVzIHRoYXQgY2Fubm90IGJlIHNlZW4gaW4gdGhlIGN1cnJlbnQgdmlldy4gVGhpc1xuXHQgKiAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byBhbnkgdmFsdWUgZGVmaW5lZCBieSB0aGVcblx0ICogICAgICAgICAgICAgICAgVHJpYW5nbGVDdWxsaW5nIGNsYXNzLlxuXHQgKi9cblx0cHVibGljIGRyYXdUcmlhbmdsZXModmVydGljZXM6QXJyYXk8bnVtYmVyPiwgaW5kaWNlczpBcnJheTxudW1iZXIgLyppbnQqLz4gPSBudWxsLCB1dnREYXRhOkFycmF5PG51bWJlcj4gPSBudWxsLCBjdWxsaW5nOlRyaWFuZ2xlQ3VsbGluZyA9IG51bGwpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGxpZXMgYSBmaWxsIHRvIHRoZSBsaW5lcyBhbmQgY3VydmVzIHRoYXQgd2VyZSBhZGRlZCBzaW5jZSB0aGUgbGFzdCBjYWxsXG5cdCAqIHRvIHRoZSA8Y29kZT5iZWdpbkZpbGwoKTwvY29kZT4sIDxjb2RlPmJlZ2luR3JhZGllbnRGaWxsKCk8L2NvZGU+LCBvclxuXHQgKiA8Y29kZT5iZWdpbkJpdG1hcEZpbGwoKTwvY29kZT4gbWV0aG9kLiBGbGFzaCB1c2VzIHRoZSBmaWxsIHRoYXQgd2FzXG5cdCAqIHNwZWNpZmllZCBpbiB0aGUgcHJldmlvdXMgY2FsbCB0byB0aGUgPGNvZGU+YmVnaW5GaWxsKCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5iZWdpbkdyYWRpZW50RmlsbCgpPC9jb2RlPiwgb3IgPGNvZGU+YmVnaW5CaXRtYXBGaWxsKCk8L2NvZGU+XG5cdCAqIG1ldGhvZC4gSWYgdGhlIGN1cnJlbnQgZHJhd2luZyBwb3NpdGlvbiBkb2VzIG5vdCBlcXVhbCB0aGUgcHJldmlvdXNcblx0ICogcG9zaXRpb24gc3BlY2lmaWVkIGluIGEgPGNvZGU+bW92ZVRvKCk8L2NvZGU+IG1ldGhvZCBhbmQgYSBmaWxsIGlzXG5cdCAqIGRlZmluZWQsIHRoZSBwYXRoIGlzIGNsb3NlZCB3aXRoIGEgbGluZSBhbmQgdGhlbiBmaWxsZWQuXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZW5kRmlsbCgpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyBhIGJpdG1hcCB0byB1c2UgZm9yIHRoZSBsaW5lIHN0cm9rZSB3aGVuIGRyYXdpbmcgbGluZXMuXG5cdCAqXG5cdCAqIDxwPlRoZSBiaXRtYXAgbGluZSBzdHlsZSBpcyB1c2VkIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIEdyYXBoaWNzIG1ldGhvZHNcblx0ICogc3VjaCBhcyB0aGUgPGNvZGU+bGluZVRvKCk8L2NvZGU+IG1ldGhvZCBvciB0aGUgPGNvZGU+ZHJhd0NpcmNsZSgpPC9jb2RlPlxuXHQgKiBtZXRob2QuIFRoZSBsaW5lIHN0eWxlIHJlbWFpbnMgaW4gZWZmZWN0IHVudGlsIHlvdSBjYWxsIHRoZVxuXHQgKiA8Y29kZT5saW5lU3R5bGUoKTwvY29kZT4gb3IgPGNvZGU+bGluZUdyYWRpZW50U3R5bGUoKTwvY29kZT4gbWV0aG9kcywgb3Jcblx0ICogdGhlIDxjb2RlPmxpbmVCaXRtYXBTdHlsZSgpPC9jb2RlPiBtZXRob2QgYWdhaW4gd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycy5cblx0ICogPC9wPlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIGNhbGwgdGhlIDxjb2RlPmxpbmVCaXRtYXBTdHlsZSgpPC9jb2RlPiBtZXRob2QgaW4gdGhlIG1pZGRsZSBvZlxuXHQgKiBkcmF3aW5nIGEgcGF0aCB0byBzcGVjaWZ5IGRpZmZlcmVudCBzdHlsZXMgZm9yIGRpZmZlcmVudCBsaW5lIHNlZ21lbnRzXG5cdCAqIHdpdGhpbiBhIHBhdGguIDwvcD5cblx0ICpcblx0ICogPHA+Q2FsbCB0aGUgPGNvZGU+bGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZCBiZWZvcmUgeW91IGNhbGwgdGhlXG5cdCAqIDxjb2RlPmxpbmVCaXRtYXBTdHlsZSgpPC9jb2RlPiBtZXRob2QgdG8gZW5hYmxlIGEgc3Ryb2tlLCBvciBlbHNlIHRoZVxuXHQgKiB2YWx1ZSBvZiB0aGUgbGluZSBzdHlsZSBpcyA8Y29kZT51bmRlZmluZWQ8L2NvZGU+LjwvcD5cblx0ICpcblx0ICogPHA+Q2FsbHMgdG8gdGhlIDxjb2RlPmNsZWFyKCk8L2NvZGU+IG1ldGhvZCBzZXQgdGhlIGxpbmUgc3R5bGUgYmFjayB0b1xuXHQgKiA8Y29kZT51bmRlZmluZWQ8L2NvZGU+LiA8L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBiaXRtYXAgVGhlIGJpdG1hcCB0byB1c2UgZm9yIHRoZSBsaW5lIHN0cm9rZS5cblx0ICogQHBhcmFtIG1hdHJpeCBBbiBvcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYXMgZGVmaW5lZCBieSB0aGVcblx0ICogICAgICAgICAgICAgICBmbGFzaC5nZW9tLk1hdHJpeCBjbGFzcy4gVGhlIG1hdHJpeCBjYW4gYmUgdXNlZCB0byBzY2FsZSBvclxuXHQgKiAgICAgICAgICAgICAgIG90aGVyd2lzZSBtYW5pcHVsYXRlIHRoZSBiaXRtYXAgYmVmb3JlIGFwcGx5aW5nIGl0IHRvIHRoZVxuXHQgKiAgICAgICAgICAgICAgIGxpbmUgc3R5bGUuXG5cdCAqIEBwYXJhbSByZXBlYXQgV2hldGhlciB0byByZXBlYXQgdGhlIGJpdG1hcCBpbiBhIHRpbGVkIGZhc2hpb24uXG5cdCAqIEBwYXJhbSBzbW9vdGggV2hldGhlciBzbW9vdGhpbmcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIGJpdG1hcC5cblx0ICovXG5cdHB1YmxpYyBsaW5lQml0bWFwU3R5bGUoYml0bWFwOkJpdG1hcERhdGEsIG1hdHJpeDpNYXRyaXggPSBudWxsLCByZXBlYXQ6Ym9vbGVhbiA9IHRydWUsIHNtb290aDpib29sZWFuID0gZmFsc2UpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyBhIGdyYWRpZW50IHRvIHVzZSBmb3IgdGhlIHN0cm9rZSB3aGVuIGRyYXdpbmcgbGluZXMuXG5cdCAqXG5cdCAqIDxwPlRoZSBncmFkaWVudCBsaW5lIHN0eWxlIGlzIHVzZWQgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gR3JhcGhpY3Ncblx0ICogbWV0aG9kcyBzdWNoIGFzIHRoZSA8Y29kZT5saW5lVG8oKTwvY29kZT4gbWV0aG9kcyBvciB0aGVcblx0ICogPGNvZGU+ZHJhd0NpcmNsZSgpPC9jb2RlPiBtZXRob2QuIFRoZSBsaW5lIHN0eWxlIHJlbWFpbnMgaW4gZWZmZWN0IHVudGlsXG5cdCAqIHlvdSBjYWxsIHRoZSA8Y29kZT5saW5lU3R5bGUoKTwvY29kZT4gb3IgPGNvZGU+bGluZUJpdG1hcFN0eWxlKCk8L2NvZGU+XG5cdCAqIG1ldGhvZHMsIG9yIHRoZSA8Y29kZT5saW5lR3JhZGllbnRTdHlsZSgpPC9jb2RlPiBtZXRob2QgYWdhaW4gd2l0aFxuXHQgKiBkaWZmZXJlbnQgcGFyYW1ldGVycy4gPC9wPlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIGNhbGwgdGhlIDxjb2RlPmxpbmVHcmFkaWVudFN0eWxlKCk8L2NvZGU+IG1ldGhvZCBpbiB0aGUgbWlkZGxlXG5cdCAqIG9mIGRyYXdpbmcgYSBwYXRoIHRvIHNwZWNpZnkgZGlmZmVyZW50IHN0eWxlcyBmb3IgZGlmZmVyZW50IGxpbmUgc2VnbWVudHNcblx0ICogd2l0aGluIGEgcGF0aC4gPC9wPlxuXHQgKlxuXHQgKiA8cD5DYWxsIHRoZSA8Y29kZT5saW5lU3R5bGUoKTwvY29kZT4gbWV0aG9kIGJlZm9yZSB5b3UgY2FsbCB0aGVcblx0ICogPGNvZGU+bGluZUdyYWRpZW50U3R5bGUoKTwvY29kZT4gbWV0aG9kIHRvIGVuYWJsZSBhIHN0cm9rZSwgb3IgZWxzZSB0aGVcblx0ICogdmFsdWUgb2YgdGhlIGxpbmUgc3R5bGUgaXMgPGNvZGU+dW5kZWZpbmVkPC9jb2RlPi48L3A+XG5cdCAqXG5cdCAqIDxwPkNhbGxzIHRvIHRoZSA8Y29kZT5jbGVhcigpPC9jb2RlPiBtZXRob2Qgc2V0IHRoZSBsaW5lIHN0eWxlIGJhY2sgdG9cblx0ICogPGNvZGU+dW5kZWZpbmVkPC9jb2RlPi4gPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgICAgICBBIHZhbHVlIGZyb20gdGhlIEdyYWRpZW50VHlwZSBjbGFzcyB0aGF0XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGljaCBncmFkaWVudCB0eXBlIHRvIHVzZSwgZWl0aGVyXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYWRpZW50VHlwZS5MSU5FQVIgb3IgR3JhZGllbnRUeXBlLlJBRElBTC5cblx0ICogQHBhcmFtIGNvbG9ycyAgICAgICAgICAgICAgQW4gYXJyYXkgb2YgUkdCIGhleGFkZWNpbWFsIGNvbG9yIHZhbHVlcyB1c2VkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBncmFkaWVudDsgZm9yIGV4YW1wbGUsIHJlZCBpcyAweEZGMDAwMCxcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmx1ZSBpcyAweDAwMDBGRiwgYW5kIHNvIG9uLiBZb3UgY2FuIHNwZWNpZnlcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXAgdG8gMTUgY29sb3JzLiBGb3IgZWFjaCBjb2xvciwgc3BlY2lmeSBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gdGhlIGFscGhhcyBhbmQgcmF0aW9zXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuXG5cdCAqIEBwYXJhbSBhbHBoYXMgICAgICAgICAgICAgIEFuIGFycmF5IG9mIGFscGhhIHZhbHVlcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmdcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzIGluIHRoZSBjb2xvcnMgYXJyYXk7IHZhbGlkIHZhbHVlcyBhcmUgMFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byAxLiBJZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIDAsIHRoZSBkZWZhdWx0XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIDAuIElmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMSwgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgaXMgMS5cblx0ICogQHBhcmFtIHJhdGlvcyAgICAgICAgICAgICAgQW4gYXJyYXkgb2YgY29sb3IgZGlzdHJpYnV0aW9uIHJhdGlvczsgdmFsaWRcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIGFyZSAwLTI1NS4gVGhpcyB2YWx1ZSBkZWZpbmVzIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJjZW50YWdlIG9mIHRoZSB3aWR0aCB3aGVyZSB0aGUgY29sb3IgaXNcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlZCBhdCAxMDAlLiBUaGUgdmFsdWUgMCByZXByZXNlbnRzIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IHBvc2l0aW9uIGluIHRoZSBncmFkaWVudCBib3gsIGFuZCAyNTVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyB0aGUgcmlnaHQgcG9zaXRpb24gaW4gdGhlIGdyYWRpZW50XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJveC5cblx0ICogQHBhcmFtIG1hdHJpeCAgICAgICAgICAgICAgQSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggYXMgZGVmaW5lZCBieSB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhc2guZ2VvbS5NYXRyaXggY2xhc3MuIFRoZSBmbGFzaC5nZW9tLk1hdHJpeFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcyBpbmNsdWRlcyBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmNyZWF0ZUdyYWRpZW50Qm94KCk8L2NvZGU+IG1ldGhvZCwgd2hpY2hcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0cyB5b3UgY29udmVuaWVudGx5IHNldCB1cCB0aGUgbWF0cml4IGZvciB1c2Vcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgPGNvZGU+bGluZUdyYWRpZW50U3R5bGUoKTwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLlxuXHQgKiBAcGFyYW0gc3ByZWFkTWV0aG9kICAgICAgICBBIHZhbHVlIGZyb20gdGhlIFNwcmVhZE1ldGhvZCBjbGFzcyB0aGF0XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGljaCBzcHJlYWQgbWV0aG9kIHRvIHVzZTpcblx0ICogQHBhcmFtIGludGVycG9sYXRpb25NZXRob2QgQSB2YWx1ZSBmcm9tIHRoZSBJbnRlcnBvbGF0aW9uTWV0aG9kIGNsYXNzIHRoYXRcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHdoaWNoIHZhbHVlIHRvIHVzZS4gRm9yIGV4YW1wbGUsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyIGEgc2ltcGxlIGxpbmVhciBncmFkaWVudCBiZXR3ZWVuIHR3b1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnMod2l0aCB0aGUgPGNvZGU+c3ByZWFkTWV0aG9kPC9jb2RlPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgc2V0IHRvXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPlNwcmVhZE1ldGhvZC5SRUZMRUNUPC9jb2RlPikuIFRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgaW50ZXJwb2xhdGlvbiBtZXRob2RzIGFmZmVjdCB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyYW5jZSBhcyBmb2xsb3dzOlxuXHQgKiBAcGFyYW0gZm9jYWxQb2ludFJhdGlvICAgICBBIG51bWJlciB0aGF0IGNvbnRyb2xzIHRoZSBsb2NhdGlvbiBvZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9jYWwgcG9pbnQgb2YgdGhlIGdyYWRpZW50LiBUaGUgdmFsdWUgMCBtZWFuc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZm9jYWwgcG9pbnQgaXMgaW4gdGhlIGNlbnRlci4gVGhlIHZhbHVlIDFcblx0ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbnMgdGhlIGZvY2FsIHBvaW50IGlzIGF0IG9uZSBib3JkZXIgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50IGNpcmNsZS4gVGhlIHZhbHVlIC0xIG1lYW5zIHRoYXQgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvY2FsIHBvaW50IGlzIGF0IHRoZSBvdGhlciBib3JkZXIgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50IGNpcmNsZS4gVmFsdWVzIGxlc3MgdGhhbiAtMSBvciBncmVhdGVyXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gMSBhcmUgcm91bmRlZCB0byAtMSBvciAxLiBUaGUgZm9sbG93aW5nXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlIHNob3dzIGEgZ3JhZGllbnQgd2l0aCBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmZvY2FsUG9pbnRSYXRpbzwvY29kZT4gb2YgLTAuNzU6XG5cdCAqL1xuXHRwdWJsaWMgbGluZUdyYWRpZW50U3R5bGUodHlwZTpHcmFkaWVudFR5cGUsIGNvbG9yczpBcnJheTxudW1iZXIgLyppbnQqLz4sIGFscGhhczpBcnJheTxudW1iZXI+LCByYXRpb3M6QXJyYXk8bnVtYmVyPiwgbWF0cml4Ok1hdHJpeCA9IG51bGwsIHNwcmVhZE1ldGhvZDpTcHJlYWRNZXRob2QgPSBudWxsLCBpbnRlcnBvbGF0aW9uTWV0aG9kOkludGVycG9sYXRpb25NZXRob2QgPSBudWxsLCBmb2NhbFBvaW50UmF0aW86bnVtYmVyID0gMClcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogU3BlY2lmaWVzIGEgc2hhZGVyIHRvIHVzZSBmb3IgdGhlIGxpbmUgc3Ryb2tlIHdoZW4gZHJhd2luZyBsaW5lcy5cblx0ICpcblx0ICogPHA+VGhlIHNoYWRlciBsaW5lIHN0eWxlIGlzIHVzZWQgZm9yIHN1YnNlcXVlbnQgY2FsbHMgdG8gR3JhcGhpY3MgbWV0aG9kc1xuXHQgKiBzdWNoIGFzIHRoZSA8Y29kZT5saW5lVG8oKTwvY29kZT4gbWV0aG9kIG9yIHRoZSA8Y29kZT5kcmF3Q2lyY2xlKCk8L2NvZGU+XG5cdCAqIG1ldGhvZC4gVGhlIGxpbmUgc3R5bGUgcmVtYWlucyBpbiBlZmZlY3QgdW50aWwgeW91IGNhbGwgdGhlXG5cdCAqIDxjb2RlPmxpbmVTdHlsZSgpPC9jb2RlPiBvciA8Y29kZT5saW5lR3JhZGllbnRTdHlsZSgpPC9jb2RlPiBtZXRob2RzLCBvclxuXHQgKiB0aGUgPGNvZGU+bGluZUJpdG1hcFN0eWxlKCk8L2NvZGU+IG1ldGhvZCBhZ2FpbiB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLlxuXHQgKiA8L3A+XG5cdCAqXG5cdCAqIDxwPllvdSBjYW4gY2FsbCB0aGUgPGNvZGU+bGluZVNoYWRlclN0eWxlKCk8L2NvZGU+IG1ldGhvZCBpbiB0aGUgbWlkZGxlIG9mXG5cdCAqIGRyYXdpbmcgYSBwYXRoIHRvIHNwZWNpZnkgZGlmZmVyZW50IHN0eWxlcyBmb3IgZGlmZmVyZW50IGxpbmUgc2VnbWVudHNcblx0ICogd2l0aGluIGEgcGF0aC4gPC9wPlxuXHQgKlxuXHQgKiA8cD5DYWxsIHRoZSA8Y29kZT5saW5lU3R5bGUoKTwvY29kZT4gbWV0aG9kIGJlZm9yZSB5b3UgY2FsbCB0aGVcblx0ICogPGNvZGU+bGluZVNoYWRlclN0eWxlKCk8L2NvZGU+IG1ldGhvZCB0byBlbmFibGUgYSBzdHJva2UsIG9yIGVsc2UgdGhlXG5cdCAqIHZhbHVlIG9mIHRoZSBsaW5lIHN0eWxlIGlzIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4uPC9wPlxuXHQgKlxuXHQgKiA8cD5DYWxscyB0byB0aGUgPGNvZGU+Y2xlYXIoKTwvY29kZT4gbWV0aG9kIHNldCB0aGUgbGluZSBzdHlsZSBiYWNrIHRvXG5cdCAqIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4uIDwvcD5cblx0ICpcblx0ICogQHBhcmFtIHNoYWRlciBUaGUgc2hhZGVyIHRvIHVzZSBmb3IgdGhlIGxpbmUgc3Ryb2tlLlxuXHQgKiBAcGFyYW0gbWF0cml4IEFuIG9wdGlvbmFsIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCBhcyBkZWZpbmVkIGJ5IHRoZVxuXHQgKiAgICAgICAgICAgICAgIGZsYXNoLmdlb20uTWF0cml4IGNsYXNzLiBUaGUgbWF0cml4IGNhbiBiZSB1c2VkIHRvIHNjYWxlIG9yXG5cdCAqICAgICAgICAgICAgICAgb3RoZXJ3aXNlIG1hbmlwdWxhdGUgdGhlIGJpdG1hcCBiZWZvcmUgYXBwbHlpbmcgaXQgdG8gdGhlXG5cdCAqICAgICAgICAgICAgICAgbGluZSBzdHlsZS5cblx0ICovXG4vL1x0XHRwdWJsaWMgbGluZVNoYWRlclN0eWxlKHNoYWRlcjpTaGFkZXIsIG1hdHJpeDpNYXRyaXggPSBudWxsKVxuLy9cdFx0e1xuLy9cbi8vXHRcdH1cblxuXHQvKipcblx0ICogU3BlY2lmaWVzIGEgbGluZSBzdHlsZSB1c2VkIGZvciBzdWJzZXF1ZW50IGNhbGxzIHRvIEdyYXBoaWNzIG1ldGhvZHMgc3VjaFxuXHQgKiBhcyB0aGUgPGNvZGU+bGluZVRvKCk8L2NvZGU+IG1ldGhvZCBvciB0aGUgPGNvZGU+ZHJhd0NpcmNsZSgpPC9jb2RlPlxuXHQgKiBtZXRob2QuIFRoZSBsaW5lIHN0eWxlIHJlbWFpbnMgaW4gZWZmZWN0IHVudGlsIHlvdSBjYWxsIHRoZVxuXHQgKiA8Y29kZT5saW5lR3JhZGllbnRTdHlsZSgpPC9jb2RlPiBtZXRob2QsIHRoZVxuXHQgKiA8Y29kZT5saW5lQml0bWFwU3R5bGUoKTwvY29kZT4gbWV0aG9kLCBvciB0aGUgPGNvZGU+bGluZVN0eWxlKCk8L2NvZGU+XG5cdCAqIG1ldGhvZCB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIGNhbGwgdGhlIDxjb2RlPmxpbmVTdHlsZSgpPC9jb2RlPiBtZXRob2QgaW4gdGhlIG1pZGRsZSBvZlxuXHQgKiBkcmF3aW5nIGEgcGF0aCB0byBzcGVjaWZ5IGRpZmZlcmVudCBzdHlsZXMgZm9yIGRpZmZlcmVudCBsaW5lIHNlZ21lbnRzXG5cdCAqIHdpdGhpbiB0aGUgcGF0aC48L3A+XG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU6IDwvYj5DYWxscyB0byB0aGUgPGNvZGU+Y2xlYXIoKTwvY29kZT4gbWV0aG9kIHNldCB0aGUgbGluZVxuXHQgKiBzdHlsZSBiYWNrIHRvIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4uPC9wPlxuXHQgKlxuXHQgKiA8cD48Yj5Ob3RlOiA8L2I+Rmxhc2ggTGl0ZSA0IHN1cHBvcnRzIG9ubHkgdGhlIGZpcnN0IHRocmVlIHBhcmFtZXRlcnNcblx0ICogKDxjb2RlPnRoaWNrbmVzczwvY29kZT4sIDxjb2RlPmNvbG9yPC9jb2RlPiwgYW5kIDxjb2RlPmFscGhhPC9jb2RlPikuPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gdGhpY2tuZXNzICAgIEFuIGludGVnZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIHRoaWNrbmVzcyBvZiB0aGUgbGluZSBpblxuXHQgKiAgICAgICAgICAgICAgICAgICAgIHBvaW50czsgdmFsaWQgdmFsdWVzIGFyZSAwLTI1NS4gSWYgYSBudW1iZXIgaXMgbm90XG5cdCAqICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBvciBpZiB0aGUgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCwgYSBsaW5lIGlzXG5cdCAqICAgICAgICAgICAgICAgICAgICAgbm90IGRyYXduLiBJZiBhIHZhbHVlIG9mIGxlc3MgdGhhbiAwIGlzIHBhc3NlZCwgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyAwLiBUaGUgdmFsdWUgMCBpbmRpY2F0ZXMgaGFpcmxpbmVcblx0ICogICAgICAgICAgICAgICAgICAgICB0aGlja25lc3M7IHRoZSBtYXhpbXVtIHRoaWNrbmVzcyBpcyAyNTUuIElmIGEgdmFsdWVcblx0ICogICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMjU1IGlzIHBhc3NlZCwgdGhlIGRlZmF1bHQgaXMgMjU1LlxuXHQgKiBAcGFyYW0gY29sb3IgICAgICAgIEEgaGV4YWRlY2ltYWwgY29sb3IgdmFsdWUgb2YgdGhlIGxpbmU7IGZvciBleGFtcGxlLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIHJlZCBpcyAweEZGMDAwMCwgYmx1ZSBpcyAweDAwMDBGRiwgYW5kIHNvIG9uLiBJZiBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgbm90IGluZGljYXRlZCwgdGhlIGRlZmF1bHQgaXMgMHgwMDAwMDBcblx0ICogICAgICAgICAgICAgICAgICAgIChibGFjaykuIE9wdGlvbmFsLlxuXHQgKiBAcGFyYW0gYWxwaGEgICAgICAgIEEgbnVtYmVyIHRoYXQgaW5kaWNhdGVzIHRoZSBhbHBoYSB2YWx1ZSBvZiB0aGUgY29sb3Jcblx0ICogICAgICAgICAgICAgICAgICAgICBvZiB0aGUgbGluZTsgdmFsaWQgdmFsdWVzIGFyZSAwIHRvIDEuIElmIGEgdmFsdWUgaXNcblx0ICogICAgICAgICAgICAgICAgICAgICBub3QgaW5kaWNhdGVkLCB0aGUgZGVmYXVsdCBpcyAxKHNvbGlkKS4gSWYgdGhlIHZhbHVlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgaXMgbGVzcyB0aGFuIDAsIHRoZSBkZWZhdWx0IGlzIDAuIElmIHRoZSB2YWx1ZSBpc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgIGdyZWF0ZXIgdGhhbiAxLCB0aGUgZGVmYXVsdCBpcyAxLlxuXHQgKiBAcGFyYW0gcGl4ZWxIaW50aW5nKE5vdCBzdXBwb3J0ZWQgaW4gRmxhc2ggTGl0ZSA0KSBBIEJvb2xlYW4gdmFsdWUgdGhhdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyB3aGV0aGVyIHRvIGhpbnQgc3Ryb2tlcyB0byBmdWxsIHBpeGVscy4gVGhpc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgIGFmZmVjdHMgYm90aCB0aGUgcG9zaXRpb24gb2YgYW5jaG9ycyBvZiBhIGN1cnZlIGFuZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5lIHN0cm9rZSBzaXplIGl0c2VsZi4gV2l0aFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnBpeGVsSGludGluZzwvY29kZT4gc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIGxpbmUgd2lkdGhzIGFyZSBhZGp1c3RlZCB0byBmdWxsIHBpeGVsIHdpZHRocy4gV2l0aFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnBpeGVsSGludGluZzwvY29kZT4gc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPixcblx0ICogICAgICAgICAgICAgICAgICAgICBkaXNqb2ludHMgY2FuIGFwcGVhciBmb3IgY3VydmVzIGFuZCBzdHJhaWdodCBsaW5lcy5cblx0ICogICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbGx1c3RyYXRpb25zIHNob3cgaG93XG5cdCAqICAgICAgICAgICAgICAgICAgICAgRmxhc2ggUGxheWVyIG9yIEFkb2JlIEFJUiByZW5kZXJzIHR3byByb3VuZGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlcyB0aGF0IGFyZSBpZGVudGljYWwsIGV4Y2VwdCB0aGF0IHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnBpeGVsSGludGluZzwvY29kZT4gcGFyYW1ldGVyIHVzZWQgaW4gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZCBpcyBzZXQgZGlmZmVyZW50bHlcblx0ICogICAgICAgICAgICAgICAgICAgICh0aGUgaW1hZ2VzIGFyZSBzY2FsZWQgYnkgMjAwJSwgdG8gZW1waGFzaXplIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2UpOlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxwPklmIGEgdmFsdWUgaXMgbm90IHN1cHBsaWVkLCB0aGUgbGluZSBkb2VzIG5vdCB1c2Vcblx0ICogICAgICAgICAgICAgICAgICAgICBwaXhlbCBoaW50aW5nLjwvcD5cblx0ICogQHBhcmFtIHNjYWxlTW9kZSAgIChOb3Qgc3VwcG9ydGVkIGluIEZsYXNoIExpdGUgNCkgQSB2YWx1ZSBmcm9tIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIExpbmVTY2FsZU1vZGUgY2xhc3MgdGhhdCBzcGVjaWZpZXMgd2hpY2ggc2NhbGUgbW9kZSB0b1xuXHQgKiAgICAgICAgICAgICAgICAgICAgIHVzZTpcblx0ICogICAgICAgICAgICAgICAgICAgICA8dWw+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICA8bGk+IDxjb2RlPkxpbmVTY2FsZU1vZGUuTk9STUFMPC9jb2RlPiAtIEFsd2F5c1xuXHQgKiAgICAgICAgICAgICAgICAgICAgIHNjYWxlIHRoZSBsaW5lIHRoaWNrbmVzcyB3aGVuIHRoZSBvYmplY3QgaXMgc2NhbGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAodGhlIGRlZmF1bHQpLiA8L2xpPlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPGxpPiA8Y29kZT5MaW5lU2NhbGVNb2RlLk5PTkU8L2NvZGU+IC0gTmV2ZXIgc2NhbGVcblx0ICogICAgICAgICAgICAgICAgICAgICB0aGUgbGluZSB0aGlja25lc3MuIDwvbGk+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICA8bGk+IDxjb2RlPkxpbmVTY2FsZU1vZGUuVkVSVElDQUw8L2NvZGU+IC0gRG8gbm90XG5cdCAqICAgICAgICAgICAgICAgICAgICAgc2NhbGUgdGhlIGxpbmUgdGhpY2tuZXNzIGlmIHRoZSBvYmplY3QgaXMgc2NhbGVkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgdmVydGljYWxseSA8aT5vbmx5PC9pPi4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBjaXJjbGVzLCBkcmF3biB3aXRoIGEgb25lLXBpeGVsIGxpbmUsIGFuZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIGVhY2ggd2l0aCB0aGUgPGNvZGU+c2NhbGVNb2RlPC9jb2RlPiBwYXJhbWV0ZXIgc2V0IHRvXG5cdCAqICAgICAgICAgICAgICAgICAgICAgPGNvZGU+TGluZVNjYWxlTW9kZS5WRVJUSUNBTDwvY29kZT4uIFRoZSBjaXJjbGUgb24gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgbGVmdCBpcyBzY2FsZWQgdmVydGljYWxseSBvbmx5LCBhbmQgdGhlIGNpcmNsZSBvbiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICByaWdodCBpcyBzY2FsZWQgYm90aCB2ZXJ0aWNhbGx5IGFuZCBob3Jpem9udGFsbHk6XG5cdCAqICAgICAgICAgICAgICAgICAgICAgPC9saT5cblx0ICogICAgICAgICAgICAgICAgICAgICAgIDxsaT4gPGNvZGU+TGluZVNjYWxlTW9kZS5IT1JJWk9OVEFMPC9jb2RlPiAtIERvIG5vdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIHNjYWxlIHRoZSBsaW5lIHRoaWNrbmVzcyBpZiB0aGUgb2JqZWN0IGlzIHNjYWxlZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIGhvcml6b250YWxseSA8aT5vbmx5PC9pPi4gRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBjaXJjbGVzLCBkcmF3biB3aXRoIGEgb25lLXBpeGVsIGxpbmUsIGFuZFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIGVhY2ggd2l0aCB0aGUgPGNvZGU+c2NhbGVNb2RlPC9jb2RlPiBwYXJhbWV0ZXIgc2V0IHRvXG5cdCAqICAgICAgICAgICAgICAgICAgICAgPGNvZGU+TGluZVNjYWxlTW9kZS5IT1JJWk9OVEFMPC9jb2RlPi4gVGhlIGNpcmNsZSBvblxuXHQgKiAgICAgICAgICAgICAgICAgICAgIHRoZSBsZWZ0IGlzIHNjYWxlZCBob3Jpem9udGFsbHkgb25seSwgYW5kIHRoZSBjaXJjbGVcblx0ICogICAgICAgICAgICAgICAgICAgICBvbiB0aGUgcmlnaHQgaXMgc2NhbGVkIGJvdGggdmVydGljYWxseSBhbmRcblx0ICogICAgICAgICAgICAgICAgICAgICBob3Jpem9udGFsbHk6ICAgPC9saT5cblx0ICogICAgICAgICAgICAgICAgICAgICA8L3VsPlxuXHQgKiBAcGFyYW0gY2FwcyAgICAgICAgKE5vdCBzdXBwb3J0ZWQgaW4gRmxhc2ggTGl0ZSA0KSBBIHZhbHVlIGZyb20gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgQ2Fwc1N0eWxlIGNsYXNzIHRoYXQgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIGNhcHMgYXQgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgZW5kIG9mIGxpbmVzLiBWYWxpZCB2YWx1ZXMgYXJlOlxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkNhcHNTdHlsZS5OT05FPC9jb2RlPixcblx0ICogICAgICAgICAgICAgICAgICAgICA8Y29kZT5DYXBzU3R5bGUuUk9VTkQ8L2NvZGU+LCBhbmRcblx0ICogICAgICAgICAgICAgICAgICAgICA8Y29kZT5DYXBzU3R5bGUuU1FVQVJFPC9jb2RlPi4gSWYgYSB2YWx1ZSBpcyBub3Rcblx0ICogICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZWQsIEZsYXNoIHVzZXMgcm91bmQgY2Fwcy5cblx0ICpcblx0ICogICAgICAgICAgICAgICAgICAgICA8cD5Gb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBpbGx1c3RyYXRpb25zIHNob3cgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IDxjb2RlPmNhcHNTdHlsZTwvY29kZT4gc2V0dGluZ3MuIEZvciBlYWNoXG5cdCAqICAgICAgICAgICAgICAgICAgICAgc2V0dGluZywgdGhlIGlsbHVzdHJhdGlvbiBzaG93cyBhIGJsdWUgbGluZSB3aXRoIGFcblx0ICogICAgICAgICAgICAgICAgICAgICB0aGlja25lc3Mgb2YgMzAoZm9yIHdoaWNoIHRoZSA8Y29kZT5jYXBzU3R5bGU8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgYXBwbGllcyksIGFuZCBhIHN1cGVyaW1wb3NlZCBibGFjayBsaW5lIHdpdGggYVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIHRoaWNrbmVzcyBvZiAxKGZvciB3aGljaCBubyA8Y29kZT5jYXBzU3R5bGU8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgYXBwbGllcyk6IDwvcD5cblx0ICogQHBhcmFtIGpvaW50cyAgICAgIChOb3Qgc3VwcG9ydGVkIGluIEZsYXNoIExpdGUgNCkgQSB2YWx1ZSBmcm9tIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIEpvaW50U3R5bGUgY2xhc3MgdGhhdCBzcGVjaWZpZXMgdGhlIHR5cGUgb2Ygam9pbnRcblx0ICogICAgICAgICAgICAgICAgICAgICBhcHBlYXJhbmNlIHVzZWQgYXQgYW5nbGVzLiBWYWxpZCB2YWx1ZXMgYXJlOlxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkpvaW50U3R5bGUuQkVWRUw8L2NvZGU+LFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkpvaW50U3R5bGUuTUlURVI8L2NvZGU+LCBhbmRcblx0ICogICAgICAgICAgICAgICAgICAgICA8Y29kZT5Kb2ludFN0eWxlLlJPVU5EPC9jb2RlPi4gSWYgYSB2YWx1ZSBpcyBub3Rcblx0ICogICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZWQsIEZsYXNoIHVzZXMgcm91bmQgam9pbnRzLlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxwPkZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGlsbHVzdHJhdGlvbnMgc2hvdyB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgPGNvZGU+am9pbnRzPC9jb2RlPiBzZXR0aW5ncy4gRm9yIGVhY2hcblx0ICogICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLCB0aGUgaWxsdXN0cmF0aW9uIHNob3dzIGFuIGFuZ2xlZCBibHVlIGxpbmVcblx0ICogICAgICAgICAgICAgICAgICAgICB3aXRoIGEgdGhpY2tuZXNzIG9mIDMwKGZvciB3aGljaCB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICA8Y29kZT5qb2ludFN0eWxlPC9jb2RlPiBhcHBsaWVzKSwgYW5kIGEgc3VwZXJpbXBvc2VkXG5cdCAqICAgICAgICAgICAgICAgICAgICAgYW5nbGVkIGJsYWNrIGxpbmUgd2l0aCBhIHRoaWNrbmVzcyBvZiAxKGZvciB3aGljaCBub1xuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPmpvaW50U3R5bGU8L2NvZGU+IGFwcGxpZXMpOiA8L3A+XG5cdCAqXG5cdCAqICAgICAgICAgICAgICAgICAgICAgPHA+PGI+Tm90ZTo8L2I+IEZvciA8Y29kZT5qb2ludHM8L2NvZGU+IHNldCB0b1xuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPkpvaW50U3R5bGUuTUlURVI8L2NvZGU+LCB5b3UgY2FuIHVzZSB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICA8Y29kZT5taXRlckxpbWl0PC9jb2RlPiBwYXJhbWV0ZXIgdG8gbGltaXQgdGhlIGxlbmd0aFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBtaXRlci48L3A+XG5cdCAqIEBwYXJhbSBtaXRlckxpbWl0ICAoTm90IHN1cHBvcnRlZCBpbiBGbGFzaCBMaXRlIDQpIEEgbnVtYmVyIHRoYXRcblx0ICogICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGxpbWl0IGF0IHdoaWNoIGEgbWl0ZXIgaXMgY3V0IG9mZi4gVmFsaWRcblx0ICogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgcmFuZ2UgZnJvbSAxIHRvIDI1NShhbmQgdmFsdWVzIG91dHNpZGUgdGhhdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgIHJhbmdlIGFyZSByb3VuZGVkIHRvIDEgb3IgMjU1KS4gVGhpcyB2YWx1ZSBpcyBvbmx5XG5cdCAqICAgICAgICAgICAgICAgICAgICAgdXNlZCBpZiB0aGUgPGNvZGU+am9pbnRTdHlsZTwvY29kZT4gaXMgc2V0IHRvXG5cdCAqICAgICAgICAgICAgICAgICAgICAgPGNvZGU+XCJtaXRlclwiPC9jb2RlPi4gVGhlIDxjb2RlPm1pdGVyTGltaXQ8L2NvZGU+XG5cdCAqICAgICAgICAgICAgICAgICAgICAgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGVuZ3RoIHRoYXQgYSBtaXRlciBjYW4gZXh0ZW5kXG5cdCAqICAgICAgICAgICAgICAgICAgICAgYmV5b25kIHRoZSBwb2ludCBhdCB3aGljaCB0aGUgbGluZXMgbWVldCB0byBmb3JtIGFcblx0ICogICAgICAgICAgICAgICAgICAgICBqb2ludC4gVGhlIHZhbHVlIGV4cHJlc3NlcyBhIGZhY3RvciBvZiB0aGUgbGluZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnRoaWNrbmVzczwvY29kZT4uIEZvciBleGFtcGxlLCB3aXRoIGFcblx0ICogICAgICAgICAgICAgICAgICAgICA8Y29kZT5taXRlckxpbWl0PC9jb2RlPiBmYWN0b3Igb2YgMi41IGFuZCBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgPGNvZGU+dGhpY2tuZXNzPC9jb2RlPiBvZiAxMCBwaXhlbHMsIHRoZSBtaXRlciBpcyBjdXRcblx0ICogICAgICAgICAgICAgICAgICAgICBvZmYgYXQgMjUgcGl4ZWxzLlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxwPkZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGFuZ2xlZCBsaW5lcyxcblx0ICogICAgICAgICAgICAgICAgICAgICBlYWNoIGRyYXduIHdpdGggYSA8Y29kZT50aGlja25lc3M8L2NvZGU+IG9mIDIwLCBidXRcblx0ICogICAgICAgICAgICAgICAgICAgICB3aXRoIDxjb2RlPm1pdGVyTGltaXQ8L2NvZGU+IHNldCB0byAxLCAyLCBhbmQgNC5cblx0ICogICAgICAgICAgICAgICAgICAgICBTdXBlcmltcG9zZWQgYXJlIGJsYWNrIHJlZmVyZW5jZSBsaW5lcyBzaG93aW5nIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgIG1lZXRpbmcgcG9pbnRzIG9mIHRoZSBqb2ludHM6PC9wPlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICAgICAgIDxwPk5vdGljZSB0aGF0IGEgZ2l2ZW4gPGNvZGU+bWl0ZXJMaW1pdDwvY29kZT4gdmFsdWVcblx0ICogICAgICAgICAgICAgICAgICAgICBoYXMgYSBzcGVjaWZpYyBtYXhpbXVtIGFuZ2xlIGZvciB3aGljaCB0aGUgbWl0ZXIgaXNcblx0ICogICAgICAgICAgICAgICAgICAgICBjdXQgb2ZmLiBUaGUgZm9sbG93aW5nIHRhYmxlIGxpc3RzIHNvbWUgZXhhbXBsZXM6PC9wPlxuXHQgKi9cblx0cHVibGljIGxpbmVTdHlsZSh0aGlja25lc3M6bnVtYmVyID0gMCwgY29sb3I6bnVtYmVyIC8qaW50Ki8gPSAwLCBhbHBoYTpudW1iZXIgPSAxLCBwaXhlbEhpbnRpbmc6Ym9vbGVhbiA9IGZhbHNlLCBzY2FsZU1vZGU6TGluZVNjYWxlTW9kZSA9IG51bGwsIGNhcHM6Q2Fwc1N0eWxlID0gbnVsbCwgam9pbnRzOkpvaW50U3R5bGUgPSBudWxsLCBtaXRlckxpbWl0Om51bWJlciA9IDMpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIERyYXdzIGEgbGluZSB1c2luZyB0aGUgY3VycmVudCBsaW5lIHN0eWxlIGZyb20gdGhlIGN1cnJlbnQgZHJhd2luZ1xuXHQgKiBwb3NpdGlvbiB0byg8Y29kZT54PC9jb2RlPiwgPGNvZGU+eTwvY29kZT4pOyB0aGUgY3VycmVudCBkcmF3aW5nIHBvc2l0aW9uXG5cdCAqIGlzIHRoZW4gc2V0IHRvKDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPikuIElmIHRoZSBkaXNwbGF5IG9iamVjdCBpblxuXHQgKiB3aGljaCB5b3UgYXJlIGRyYXdpbmcgY29udGFpbnMgY29udGVudCB0aGF0IHdhcyBjcmVhdGVkIHdpdGggdGhlIEZsYXNoXG5cdCAqIGRyYXdpbmcgdG9vbHMsIGNhbGxzIHRvIHRoZSA8Y29kZT5saW5lVG8oKTwvY29kZT4gbWV0aG9kIGFyZSBkcmF3blxuXHQgKiB1bmRlcm5lYXRoIHRoZSBjb250ZW50LiBJZiB5b3UgY2FsbCA8Y29kZT5saW5lVG8oKTwvY29kZT4gYmVmb3JlIGFueSBjYWxsc1xuXHQgKiB0byB0aGUgPGNvZGU+bW92ZVRvKCk8L2NvZGU+IG1ldGhvZCwgdGhlIGRlZmF1bHQgcG9zaXRpb24gZm9yIHRoZSBjdXJyZW50XG5cdCAqIGRyYXdpbmcgaXMoPGk+MCwgMDwvaT4pLiBJZiBhbnkgb2YgdGhlIHBhcmFtZXRlcnMgYXJlIG1pc3NpbmcsIHRoaXNcblx0ICogbWV0aG9kIGZhaWxzIGFuZCB0aGUgY3VycmVudCBkcmF3aW5nIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkLlxuXHQgKlxuXHQgKiBAcGFyYW0geCBBIG51bWJlciB0aGF0IGluZGljYXRlcyB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGVcblx0ICogICAgICAgICAgcmVnaXN0cmF0aW9uIHBvaW50IG9mIHRoZSBwYXJlbnQgZGlzcGxheSBvYmplY3QoaW4gcGl4ZWxzKS5cblx0ICogQHBhcmFtIHkgQSBudW1iZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIHZlcnRpY2FsIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZVxuXHQgKiAgICAgICAgICByZWdpc3RyYXRpb24gcG9pbnQgb2YgdGhlIHBhcmVudCBkaXNwbGF5IG9iamVjdChpbiBwaXhlbHMpLlxuXHQgKi9cblx0cHVibGljIGxpbmVUbyh4Om51bWJlciwgeTpudW1iZXIpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIE1vdmVzIHRoZSBjdXJyZW50IGRyYXdpbmcgcG9zaXRpb24gdG8oPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+KS4gSWZcblx0ICogYW55IG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSBtaXNzaW5nLCB0aGlzIG1ldGhvZCBmYWlscyBhbmQgdGhlIGN1cnJlbnRcblx0ICogZHJhd2luZyBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZC5cblx0ICpcblx0ICogQHBhcmFtIHggQSBudW1iZXIgdGhhdCBpbmRpY2F0ZXMgdGhlIGhvcml6b250YWwgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlXG5cdCAqICAgICAgICAgIHJlZ2lzdHJhdGlvbiBwb2ludCBvZiB0aGUgcGFyZW50IGRpc3BsYXkgb2JqZWN0KGluIHBpeGVscykuXG5cdCAqIEBwYXJhbSB5IEEgbnVtYmVyIHRoYXQgaW5kaWNhdGVzIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGVcblx0ICogICAgICAgICAgcmVnaXN0cmF0aW9uIHBvaW50IG9mIHRoZSBwYXJlbnQgZGlzcGxheSBvYmplY3QoaW4gcGl4ZWxzKS5cblx0ICovXG5cdHB1YmxpYyBtb3ZlVG8oeDpudW1iZXIsIHk6bnVtYmVyKVxuXHR7XG5cblx0fVxufVxuXG5leHBvcnQgPSBHcmFwaGljczsiXX0= \ No newline at end of file diff --git a/lib/core/base/Graphics.ts b/lib/core/base/Graphics.ts new file mode 100644 index 00000000..81af61a6 --- /dev/null +++ b/lib/core/base/Graphics.ts @@ -0,0 +1,869 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import CapsStyle = require("awayjs-core/lib/core/base/CapsStyle"); +import GradientType = require("awayjs-core/lib/core/base/GradientType"); +import GraphicsPathWinding = require("awayjs-core/lib/core/base/GraphicsPathWinding"); +import IGraphicsData = require("awayjs-core/lib/core/base/IGraphicsData"); +import InterpolationMethod = require("awayjs-core/lib/core/base/InterpolationMethod"); +import JointStyle = require("awayjs-core/lib/core/base/JointStyle"); +import LineScaleMode = require("awayjs-core/lib/core/base/LineScaleMode"); +import TriangleCulling = require("awayjs-core/lib/core/base/TriangleCulling"); +import SpreadMethod = require("awayjs-core/lib/core/base/SpreadMethod"); +import Matrix = require("awayjs-core/lib/core/geom/Matrix"); + +/** + * The Graphics class contains a set of methods that you can use to create a + * vector shape. Display objects that support drawing include Sprite and Shape + * objects. Each of these classes includes a graphics property + * that is a Graphics object. The following are among those helper functions + * provided for ease of use: drawRect(), + * drawRoundRect(), drawCircle(), and + * drawEllipse(). + * + *

You cannot create a Graphics object directly from ActionScript code. If + * you call new Graphics(), an exception is thrown.

+ * + *

The Graphics class is final; it cannot be subclassed.

+ */ +class Graphics +{ + /** + * Fills a drawing area with a bitmap image. The bitmap can be repeated or + * tiled to fill the area. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param bitmap A transparent or opaque bitmap image that contains the bits + * to be displayed. + * @param matrix A matrix object(of the flash.geom.Matrix class), which you + * can use to define transformations on the bitmap. For + * example, you can use the following matrix to rotate a bitmap + * by 45 degrees(pi/4 radians): + * @param repeat If true, the bitmap image repeats in a tiled + * pattern. If false, the bitmap image does not + * repeat, and the edges of the bitmap are used for any fill + * area that extends beyond the bitmap. + * + *

For example, consider the following bitmap(a 20 x + * 20-pixel checkerboard pattern):

+ * + *

When repeat is set to true(as + * in the following example), the bitmap fill repeats the + * bitmap:

+ * + *

When repeat is set to false, + * the bitmap fill uses the edge pixels for the fill area + * outside the bitmap:

+ * @param smooth If false, upscaled bitmap images are rendered + * by using a nearest-neighbor algorithm and look pixelated. If + * true, upscaled bitmap images are rendered by + * using a bilinear algorithm. Rendering by using the nearest + * neighbor algorithm is faster. + */ + public beginBitmapFill(bitmap:BitmapData, matrix:Matrix = null, repeat:boolean = true, smooth:boolean = false) + { + + } + + /** + * Specifies a simple one-color fill that subsequent calls to other Graphics + * methods(such as lineTo() or drawCircle()) use + * when drawing. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param color The color of the fill(0xRRGGBB). + * @param alpha The alpha value of the fill(0.0 to 1.0). + */ + public beginFill(color:number /*int*/, alpha:number = 1) + { + + } + + /** + * Specifies a gradient fill used by subsequent calls to other Graphics + * methods(such as lineTo() or drawCircle()) for + * the object. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + * @param type A value from the GradientType class that + * specifies which gradient type to use: + * GradientType.LINEAR or + * GradientType.RADIAL. + * @param colors An array of RGB hexadecimal color values used + * in the gradient; for example, red is 0xFF0000, + * blue is 0x0000FF, and so on. You can specify + * up to 15 colors. For each color, specify a + * corresponding value in the alphas and ratios + * parameters. + * @param alphas An array of alpha values for the corresponding + * colors in the colors array; valid values are 0 + * to 1. If the value is less than 0, the default + * is 0. If the value is greater than 1, the + * default is 1. + * @param ratios An array of color distribution ratios; valid + * values are 0-255. This value defines the + * percentage of the width where the color is + * sampled at 100%. The value 0 represents the + * left position in the gradient box, and 255 + * represents the right position in the gradient + * box. + * @param matrix A transformation matrix as defined by the + * flash.geom.Matrix class. The flash.geom.Matrix + * class includes a + * createGradientBox() method, which + * lets you conveniently set up the matrix for use + * with the beginGradientFill() + * method. + * @param spreadMethod A value from the SpreadMethod class that + * specifies which spread method to use, either: + * SpreadMethod.PAD, + * SpreadMethod.REFLECT, or + * SpreadMethod.REPEAT. + * + *

For example, consider a simple linear + * gradient between two colors:

+ * + *

This example uses + * SpreadMethod.PAD for the spread + * method, and the gradient fill looks like the + * following:

+ * + *

If you use SpreadMethod.REFLECT + * for the spread method, the gradient fill looks + * like the following:

+ * + *

If you use SpreadMethod.REPEAT + * for the spread method, the gradient fill looks + * like the following:

+ * @param interpolationMethod A value from the InterpolationMethod class that + * specifies which value to use: + * InterpolationMethod.LINEAR_RGB or + * InterpolationMethod.RGB + * + *

For example, consider a simple linear + * gradient between two colors(with the + * spreadMethod parameter set to + * SpreadMethod.REFLECT). The + * different interpolation methods affect the + * appearance as follows:

+ * @param focalPointRatio A number that controls the location of the + * focal point of the gradient. 0 means that the + * focal point is in the center. 1 means that the + * focal point is at one border of the gradient + * circle. -1 means that the focal point is at the + * other border of the gradient circle. A value + * less than -1 or greater than 1 is rounded to -1 + * or 1. For example, the following example shows + * a focalPointRatio set to 0.75: + * @throws ArgumentError If the type parameter is not valid. + */ + public beginGradientFill(type:GradientType, colors:Array, alphas:Array, ratios:Array, matrix:Matrix = null, spreadMethod:string = "pad", interpolationMethod:string = "rgb", focalPointRatio:number = 0) + { + + } + + /** + * Specifies a shader fill used by subsequent calls to other Graphics methods + * (such as lineTo() or drawCircle()) for the + * object. The fill remains in effect until you call the + * beginFill(), beginBitmapFill(), + * beginGradientFill(), or beginShaderFill() + * method. Calling the clear() method clears the fill. + * + *

The application renders the fill whenever three or more points are + * drawn, or when the endFill() method is called.

+ * + *

Shader fills are not supported under GPU rendering; filled areas will + * be colored cyan.

+ * + * @param shader The shader to use for the fill. This Shader instance is not + * required to specify an image input. However, if an image + * input is specified in the shader, the input must be provided + * manually. To specify the input, set the input + * property of the corresponding ShaderInput property of the + * Shader.data property. + * + *

When you pass a Shader instance as an argument the shader + * is copied internally. The drawing fill operation uses that + * internal copy, not a reference to the original shader. Any + * changes made to the shader, such as changing a parameter + * value, input, or bytecode, are not applied to the copied + * shader that's used for the fill.

+ * @param matrix A matrix object(of the flash.geom.Matrix class), which you + * can use to define transformations on the shader. For + * example, you can use the following matrix to rotate a shader + * by 45 degrees(pi/4 radians): + * + *

The coordinates received in the shader are based on the + * matrix that is specified for the matrix + * parameter. For a default(null) matrix, the + * coordinates in the shader are local pixel coordinates which + * can be used to sample an input.

+ * @throws ArgumentError When the shader output type is not compatible with + * this operation(the shader must specify a + * pixel3 or pixel4 output). + * @throws ArgumentError When the shader specifies an image input that isn't + * provided. + * @throws ArgumentError When a ByteArray or Vector. instance is used + * as an input and the width and + * height properties aren't specified for + * the ShaderInput, or the specified values don't match + * the amount of data in the input object. See the + * ShaderInput.input property for more + * information. + */ +// public beginShaderFill(shader:Shader, matrix:Matrix = null) +// { +// +// } + + /** + * Clears the graphics that were drawn to this Graphics object, and resets + * fill and line style settings. + * + */ + public clear() + { + + } + + /** + * Copies all of drawing commands from the source Graphics object into the + * calling Graphics object. + * + * @param sourceGraphics The Graphics object from which to copy the drawing + * commands. + */ + public copyFrom(sourceGraphics:Graphics) + { + + } + + /** + * Draws a cubic Bezier curve from the current drawing position to the + * specified anchor point. Cubic Bezier curves consist of two anchor points + * and two control points. The curve interpolates the two anchor points and + * curves toward the two control points. + * + * The four points you use to draw a cubic Bezier curve with the + * cubicCurveTo() method are as follows: + * + *
    + *
  • The current drawing position is the first anchor point.
  • + *
  • The anchorX and anchorY parameters specify the second anchor point. + *
  • + *
  • The controlX1 and controlY1 parameters + * specify the first control point.
  • + *
  • The controlX2 and controlY2 parameters + * specify the second control point.
  • + *
+ * + * If you call the cubicCurveTo() method before calling the + * moveTo() method, your curve starts at position (0, 0). + * + * If the cubicCurveTo() method succeeds, the Flash runtime sets + * the current drawing position to (anchorX, + * anchorY). If the cubicCurveTo() method fails, + * the current drawing position remains unchanged. + * + * If your movie clip contains content created with the Flash drawing tools, + * the results of calls to the cubicCurveTo() method are drawn + * underneath that content. + * + * @param controlX1 Specifies the horizontal position of the first control + * point relative to the registration point of the parent + * display object. + * @param controlY1 Specifies the vertical position of the first control + * point relative to the registration point of the parent + * display object. + * @param controlX2 Specifies the horizontal position of the second control + * point relative to the registration point of the parent + * display object. + * @param controlY2 Specifies the vertical position of the second control + * point relative to the registration point of the parent + * display object. + * @param anchorX Specifies the horizontal position of the anchor point + * relative to the registration point of the parent display + * object. + * @param anchorY Specifies the vertical position of the anchor point + * relative to the registration point of the parent display + * object. + */ + public cubicCurveTo(controlX1:number, controlY1:number, controlX2:number, controlY2:number, anchorX:number, anchorY:number) + { + + } + + /** + * Draws a curve using the current line style from the current drawing + * position to(anchorX, anchorY) and using the control point that + * (controlX, controlY) specifies. The current + * drawing position is then set to(anchorX, + * anchorY). If the movie clip in which you are drawing contains + * content created with the Flash drawing tools, calls to the + * curveTo() method are drawn underneath this content. If you + * call the curveTo() method before any calls to the + * moveTo() method, the default of the current drawing position + * is(0, 0). If any of the parameters are missing, this method fails and the + * current drawing position is not changed. + * + *

The curve drawn is a quadratic Bezier curve. Quadratic Bezier curves + * consist of two anchor points and one control point. The curve interpolates + * the two anchor points and curves toward the control point.

+ * + * @param controlX A number that specifies the horizontal position of the + * control point relative to the registration point of the + * parent display object. + * @param controlY A number that specifies the vertical position of the + * control point relative to the registration point of the + * parent display object. + * @param anchorX A number that specifies the horizontal position of the + * next anchor point relative to the registration point of + * the parent display object. + * @param anchorY A number that specifies the vertical position of the next + * anchor point relative to the registration point of the + * parent display object. + */ + public curveTo(controlX:number, controlY:number, anchorX:number, anchorY:number) + { + + } + + /** + * Draws a circle. Set the line style, fill, or both before you call the + * drawCircle() method, by calling the linestyle(), + * lineGradientStyle(), beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. + * + * @param x The x location of the center of the circle relative + * to the registration point of the parent display object(in + * pixels). + * @param y The y location of the center of the circle relative + * to the registration point of the parent display object(in + * pixels). + * @param radius The radius of the circle(in pixels). + */ + public drawCircle(x:number, y:number, radius:number) + { + + } + + /** + * Draws an ellipse. Set the line style, fill, or both before you call the + * drawEllipse() method, by calling the + * linestyle(), lineGradientStyle(), + * beginFill(), beginGradientFill(), or + * beginBitmapFill() method. + * + * @param x The x location of the top-left of the bounding-box of + * the ellipse relative to the registration point of the parent + * display object(in pixels). + * @param y The y location of the top left of the bounding-box of + * the ellipse relative to the registration point of the parent + * display object(in pixels). + * @param width The width of the ellipse(in pixels). + * @param height The height of the ellipse(in pixels). + */ + public drawEllipse(x:number, y:number, width:number, height:number) + { + + } + + /** + * Submits a series of IGraphicsData instances for drawing. This method + * accepts a Vector containing objects including paths, fills, and strokes + * that implement the IGraphicsData interface. A Vector of IGraphicsData + * instances can refer to a part of a shape, or a complex fully defined set + * of data for rendering a complete shape. + * + *

Graphics paths can contain other graphics paths. If the + * graphicsData Vector includes a path, that path and all its + * sub-paths are rendered during this operation.

+ * + */ + public drawGraphicsData(graphicsData:Array) + { + + } + + /** + * Submits a series of commands for drawing. The drawPath() + * method uses vector arrays to consolidate individual moveTo(), + * lineTo(), and curveTo() drawing commands into a + * single call. The drawPath() method parameters combine drawing + * commands with x- and y-coordinate value pairs and a drawing direction. The + * drawing commands are values from the GraphicsPathCommand class. The x- and + * y-coordinate value pairs are Numbers in an array where each pair defines a + * coordinate location. The drawing direction is a value from the + * GraphicsPathWinding class. + * + *

Generally, drawings render faster with drawPath() than + * with a series of individual lineTo() and + * curveTo() methods.

+ * + *

The drawPath() method uses a uses a floating computation + * so rotation and scaling of shapes is more accurate and gives better + * results. However, curves submitted using the drawPath() + * method can have small sub-pixel alignment errors when used in conjunction + * with the lineTo() and curveTo() methods.

+ * + *

The drawPath() method also uses slightly different rules + * for filling and drawing lines. They are:

+ * + *
    + *
  • When a fill is applied to rendering a path: + *
      + *
    • A sub-path of less than 3 points is not rendered.(But note that the + * stroke rendering will still occur, consistent with the rules for strokes + * below.)
    • + *
    • A sub-path that isn't closed(the end point is not equal to the + * begin point) is implicitly closed.
    • + *
    + *
  • + *
  • When a stroke is applied to rendering a path: + *
      + *
    • The sub-paths can be composed of any number of points.
    • + *
    • The sub-path is never implicitly closed.
    • + *
    + *
  • + *
+ * + * @param winding Specifies the winding rule using a value defined in the + * GraphicsPathWinding class. + */ + public drawPath(commands:Array, data:Array, winding:GraphicsPathWinding) + { + + } + + /** + * Draws a rectangle. Set the line style, fill, or both before you call the + * drawRect() method, by calling the linestyle(), + * lineGradientStyle(), beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. + * + * @param x A number indicating the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number indicating the vertical position relative to the + * registration point of the parent display object(in pixels). + * @param width The width of the rectangle(in pixels). + * @param height The height of the rectangle(in pixels). + * @throws ArgumentError If the width or height + * parameters are not a number + * (Number.NaN). + */ + public drawRect(x:number, y:number, width:number, height:number) + { + + } + + /** + * Draws a rounded rectangle. Set the line style, fill, or both before you + * call the drawRoundRect() method, by calling the + * linestyle(), lineGradientStyle(), + * beginFill(), beginGradientFill(), or + * beginBitmapFill() method. + * + * @param x A number indicating the horizontal position relative + * to the registration point of the parent display + * object(in pixels). + * @param y A number indicating the vertical position relative to + * the registration point of the parent display object + * (in pixels). + * @param width The width of the round rectangle(in pixels). + * @param height The height of the round rectangle(in pixels). + * @param ellipseWidth The width of the ellipse used to draw the rounded + * corners(in pixels). + * @param ellipseHeight The height of the ellipse used to draw the rounded + * corners(in pixels). Optional; if no value is + * specified, the default value matches that provided + * for the ellipseWidth parameter. + * @throws ArgumentError If the width, height, + * ellipseWidth or + * ellipseHeight parameters are not a + * number(Number.NaN). + */ + public drawRoundRect(x:number, y:number, width:number, height:number, ellipseWidth:number, ellipseHeight:number = NaN) + { + + } + + //public drawRoundRectComplex(x:Float, y:Float, width:Float, height:Float, topLeftRadius:Float, topRightRadius:Float, bottomLeftRadius:Float, bottomRightRadius:Float):Void; + + /** + * Renders a set of triangles, typically to distort bitmaps and give them a + * three-dimensional appearance. The drawTriangles() method maps + * either the current fill, or a bitmap fill, to the triangle faces using a + * set of(u,v) coordinates. + * + *

Any type of fill can be used, but if the fill has a transform matrix + * that transform matrix is ignored.

+ * + *

A uvtData parameter improves texture mapping when a + * bitmap fill is used.

+ * + * @param culling Specifies whether to render triangles that face in a + * specified direction. This parameter prevents the rendering + * of triangles that cannot be seen in the current view. This + * parameter can be set to any value defined by the + * TriangleCulling class. + */ + public drawTriangles(vertices:Array, indices:Array = null, uvtData:Array = null, culling:TriangleCulling = null) + { + + } + + /** + * Applies a fill to the lines and curves that were added since the last call + * to the beginFill(), beginGradientFill(), or + * beginBitmapFill() method. Flash uses the fill that was + * specified in the previous call to the beginFill(), + * beginGradientFill(), or beginBitmapFill() + * method. If the current drawing position does not equal the previous + * position specified in a moveTo() method and a fill is + * defined, the path is closed with a line and then filled. + * + */ + public endFill() + { + + } + + /** + * Specifies a bitmap to use for the line stroke when drawing lines. + * + *

The bitmap line style is used for subsequent calls to Graphics methods + * such as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineStyle() or lineGradientStyle() methods, or + * the lineBitmapStyle() method again with different parameters. + *

+ * + *

You can call the lineBitmapStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineBitmapStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param bitmap The bitmap to use for the line stroke. + * @param matrix An optional transformation matrix as defined by the + * flash.geom.Matrix class. The matrix can be used to scale or + * otherwise manipulate the bitmap before applying it to the + * line style. + * @param repeat Whether to repeat the bitmap in a tiled fashion. + * @param smooth Whether smoothing should be applied to the bitmap. + */ + public lineBitmapStyle(bitmap:BitmapData, matrix:Matrix = null, repeat:boolean = true, smooth:boolean = false) + { + + } + + /** + * Specifies a gradient to use for the stroke when drawing lines. + * + *

The gradient line style is used for subsequent calls to Graphics + * methods such as the lineTo() methods or the + * drawCircle() method. The line style remains in effect until + * you call the lineStyle() or lineBitmapStyle() + * methods, or the lineGradientStyle() method again with + * different parameters.

+ * + *

You can call the lineGradientStyle() method in the middle + * of drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineGradientStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param type A value from the GradientType class that + * specifies which gradient type to use, either + * GradientType.LINEAR or GradientType.RADIAL. + * @param colors An array of RGB hexadecimal color values used + * in the gradient; for example, red is 0xFF0000, + * blue is 0x0000FF, and so on. You can specify + * up to 15 colors. For each color, specify a + * corresponding value in the alphas and ratios + * parameters. + * @param alphas An array of alpha values for the corresponding + * colors in the colors array; valid values are 0 + * to 1. If the value is less than 0, the default + * is 0. If the value is greater than 1, the + * default is 1. + * @param ratios An array of color distribution ratios; valid + * values are 0-255. This value defines the + * percentage of the width where the color is + * sampled at 100%. The value 0 represents the + * left position in the gradient box, and 255 + * represents the right position in the gradient + * box. + * @param matrix A transformation matrix as defined by the + * flash.geom.Matrix class. The flash.geom.Matrix + * class includes a + * createGradientBox() method, which + * lets you conveniently set up the matrix for use + * with the lineGradientStyle() + * method. + * @param spreadMethod A value from the SpreadMethod class that + * specifies which spread method to use: + * @param interpolationMethod A value from the InterpolationMethod class that + * specifies which value to use. For example, + * consider a simple linear gradient between two + * colors(with the spreadMethod + * parameter set to + * SpreadMethod.REFLECT). The + * different interpolation methods affect the + * appearance as follows: + * @param focalPointRatio A number that controls the location of the + * focal point of the gradient. The value 0 means + * the focal point is in the center. The value 1 + * means the focal point is at one border of the + * gradient circle. The value -1 means that the + * focal point is at the other border of the + * gradient circle. Values less than -1 or greater + * than 1 are rounded to -1 or 1. The following + * image shows a gradient with a + * focalPointRatio of -0.75: + */ + public lineGradientStyle(type:GradientType, colors:Array, alphas:Array, ratios:Array, matrix:Matrix = null, spreadMethod:SpreadMethod = null, interpolationMethod:InterpolationMethod = null, focalPointRatio:number = 0) + { + + } + + /** + * Specifies a shader to use for the line stroke when drawing lines. + * + *

The shader line style is used for subsequent calls to Graphics methods + * such as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineStyle() or lineGradientStyle() methods, or + * the lineBitmapStyle() method again with different parameters. + *

+ * + *

You can call the lineShaderStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within a path.

+ * + *

Call the lineStyle() method before you call the + * lineShaderStyle() method to enable a stroke, or else the + * value of the line style is undefined.

+ * + *

Calls to the clear() method set the line style back to + * undefined.

+ * + * @param shader The shader to use for the line stroke. + * @param matrix An optional transformation matrix as defined by the + * flash.geom.Matrix class. The matrix can be used to scale or + * otherwise manipulate the bitmap before applying it to the + * line style. + */ +// public lineShaderStyle(shader:Shader, matrix:Matrix = null) +// { +// +// } + + /** + * Specifies a line style used for subsequent calls to Graphics methods such + * as the lineTo() method or the drawCircle() + * method. The line style remains in effect until you call the + * lineGradientStyle() method, the + * lineBitmapStyle() method, or the lineStyle() + * method with different parameters. + * + *

You can call the lineStyle() method in the middle of + * drawing a path to specify different styles for different line segments + * within the path.

+ * + *

Note: Calls to the clear() method set the line + * style back to undefined.

+ * + *

Note: Flash Lite 4 supports only the first three parameters + * (thickness, color, and alpha).

+ * + * @param thickness An integer that indicates the thickness of the line in + * points; valid values are 0-255. If a number is not + * specified, or if the parameter is undefined, a line is + * not drawn. If a value of less than 0 is passed, the + * default is 0. The value 0 indicates hairline + * thickness; the maximum thickness is 255. If a value + * greater than 255 is passed, the default is 255. + * @param color A hexadecimal color value of the line; for example, + * red is 0xFF0000, blue is 0x0000FF, and so on. If a + * value is not indicated, the default is 0x000000 + * (black). Optional. + * @param alpha A number that indicates the alpha value of the color + * of the line; valid values are 0 to 1. If a value is + * not indicated, the default is 1(solid). If the value + * is less than 0, the default is 0. If the value is + * greater than 1, the default is 1. + * @param pixelHinting(Not supported in Flash Lite 4) A Boolean value that + * specifies whether to hint strokes to full pixels. This + * affects both the position of anchors of a curve and + * the line stroke size itself. With + * pixelHinting set to true, + * line widths are adjusted to full pixel widths. With + * pixelHinting set to false, + * disjoints can appear for curves and straight lines. + * For example, the following illustrations show how + * Flash Player or Adobe AIR renders two rounded + * rectangles that are identical, except that the + * pixelHinting parameter used in the + * lineStyle() method is set differently + * (the images are scaled by 200%, to emphasize the + * difference): + * + *

If a value is not supplied, the line does not use + * pixel hinting.

+ * @param scaleMode (Not supported in Flash Lite 4) A value from the + * LineScaleMode class that specifies which scale mode to + * use: + *
    + *
  • LineScaleMode.NORMAL - Always + * scale the line thickness when the object is scaled + * (the default).
  • + *
  • LineScaleMode.NONE - Never scale + * the line thickness.
  • + *
  • LineScaleMode.VERTICAL - Do not + * scale the line thickness if the object is scaled + * vertically only. For example, consider the + * following circles, drawn with a one-pixel line, and + * each with the scaleMode parameter set to + * LineScaleMode.VERTICAL. The circle on the + * left is scaled vertically only, and the circle on the + * right is scaled both vertically and horizontally: + *
  • + *
  • LineScaleMode.HORIZONTAL - Do not + * scale the line thickness if the object is scaled + * horizontally only. For example, consider the + * following circles, drawn with a one-pixel line, and + * each with the scaleMode parameter set to + * LineScaleMode.HORIZONTAL. The circle on + * the left is scaled horizontally only, and the circle + * on the right is scaled both vertically and + * horizontally:
  • + *
+ * @param caps (Not supported in Flash Lite 4) A value from the + * CapsStyle class that specifies the type of caps at the + * end of lines. Valid values are: + * CapsStyle.NONE, + * CapsStyle.ROUND, and + * CapsStyle.SQUARE. If a value is not + * indicated, Flash uses round caps. + * + *

For example, the following illustrations show the + * different capsStyle settings. For each + * setting, the illustration shows a blue line with a + * thickness of 30(for which the capsStyle + * applies), and a superimposed black line with a + * thickness of 1(for which no capsStyle + * applies):

+ * @param joints (Not supported in Flash Lite 4) A value from the + * JointStyle class that specifies the type of joint + * appearance used at angles. Valid values are: + * JointStyle.BEVEL, + * JointStyle.MITER, and + * JointStyle.ROUND. If a value is not + * indicated, Flash uses round joints. + * + *

For example, the following illustrations show the + * different joints settings. For each + * setting, the illustration shows an angled blue line + * with a thickness of 30(for which the + * jointStyle applies), and a superimposed + * angled black line with a thickness of 1(for which no + * jointStyle applies):

+ * + *

Note: For joints set to + * JointStyle.MITER, you can use the + * miterLimit parameter to limit the length + * of the miter.

+ * @param miterLimit (Not supported in Flash Lite 4) A number that + * indicates the limit at which a miter is cut off. Valid + * values range from 1 to 255(and values outside that + * range are rounded to 1 or 255). This value is only + * used if the jointStyle is set to + * "miter". The miterLimit + * value represents the length that a miter can extend + * beyond the point at which the lines meet to form a + * joint. The value expresses a factor of the line + * thickness. For example, with a + * miterLimit factor of 2.5 and a + * thickness of 10 pixels, the miter is cut + * off at 25 pixels. + * + *

For example, consider the following angled lines, + * each drawn with a thickness of 20, but + * with miterLimit set to 1, 2, and 4. + * Superimposed are black reference lines showing the + * meeting points of the joints:

+ * + *

Notice that a given miterLimit value + * has a specific maximum angle for which the miter is + * cut off. The following table lists some examples:

+ */ + public lineStyle(thickness:number = 0, color:number /*int*/ = 0, alpha:number = 1, pixelHinting:boolean = false, scaleMode:LineScaleMode = null, caps:CapsStyle = null, joints:JointStyle = null, miterLimit:number = 3) + { + + } + + /** + * Draws a line using the current line style from the current drawing + * position to(x, y); the current drawing position + * is then set to(x, y). If the display object in + * which you are drawing contains content that was created with the Flash + * drawing tools, calls to the lineTo() method are drawn + * underneath the content. If you call lineTo() before any calls + * to the moveTo() method, the default position for the current + * drawing is(0, 0). If any of the parameters are missing, this + * method fails and the current drawing position is not changed. + * + * @param x A number that indicates the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number that indicates the vertical position relative to the + * registration point of the parent display object(in pixels). + */ + public lineTo(x:number, y:number) + { + + } + + /** + * Moves the current drawing position to(x, y). If + * any of the parameters are missing, this method fails and the current + * drawing position is not changed. + * + * @param x A number that indicates the horizontal position relative to the + * registration point of the parent display object(in pixels). + * @param y A number that indicates the vertical position relative to the + * registration point of the parent display object(in pixels). + */ + public moveTo(x:number, y:number) + { + + } +} + +export = Graphics; \ No newline at end of file diff --git a/lib/core/base/GraphicsPathWinding.js b/lib/core/base/GraphicsPathWinding.js new file mode 100755 index 00000000..469bc946 --- /dev/null +++ b/lib/core/base/GraphicsPathWinding.js @@ -0,0 +1,21 @@ +/** +* The GraphicsPathWinding class provides values for the +* flash.display.GraphicsPath.winding property and the +* flash.display.Graphics.drawPath() method to determine the +* direction to draw a path. A clockwise path is positively wound, and a +* counter-clockwise path is negatively wound: +* +*

When paths intersect or overlap, the winding direction determines the +* rules for filling the areas created by the intersection or overlap:

+*/ +var GraphicsPathWinding = (function () { + function GraphicsPathWinding() { + } + GraphicsPathWinding.EVEN_ODD = "evenOdd"; + GraphicsPathWinding.NON_ZERO = "nonZero"; + return GraphicsPathWinding; +})(); + +module.exports = GraphicsPathWinding; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9HcmFwaGljc1BhdGhXaW5kaW5nLnRzIl0sIm5hbWVzIjpbIkdyYXBoaWNzUGF0aFdpbmRpbmciLCJHcmFwaGljc1BhdGhXaW5kaW5nLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0VBU0c7QUFDSDtJQUFBQTtJQUlBQyxDQUFDQTtBQUFBRCxJQUZBQSwrQkFBZ0NBLFNBQVNBO0lBQ3pDQSwrQkFBZ0NBLFNBQVNBO0lBQzFDQSwyQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxvQ0FBNkIsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvR3JhcGhpY3NQYXRoV2luZGluZy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIEdyYXBoaWNzUGF0aFdpbmRpbmcgY2xhc3MgcHJvdmlkZXMgdmFsdWVzIGZvciB0aGVcbiAqIDxjb2RlPmZsYXNoLmRpc3BsYXkuR3JhcGhpY3NQYXRoLndpbmRpbmc8L2NvZGU+IHByb3BlcnR5IGFuZCB0aGVcbiAqIDxjb2RlPmZsYXNoLmRpc3BsYXkuR3JhcGhpY3MuZHJhd1BhdGgoKTwvY29kZT4gbWV0aG9kIHRvIGRldGVybWluZSB0aGVcbiAqIGRpcmVjdGlvbiB0byBkcmF3IGEgcGF0aC4gQSBjbG9ja3dpc2UgcGF0aCBpcyBwb3NpdGl2ZWx5IHdvdW5kLCBhbmQgYVxuICogY291bnRlci1jbG9ja3dpc2UgcGF0aCBpcyBuZWdhdGl2ZWx5IHdvdW5kOlxuICpcbiAqIDxwPiBXaGVuIHBhdGhzIGludGVyc2VjdCBvciBvdmVybGFwLCB0aGUgd2luZGluZyBkaXJlY3Rpb24gZGV0ZXJtaW5lcyB0aGVcbiAqIHJ1bGVzIGZvciBmaWxsaW5nIHRoZSBhcmVhcyBjcmVhdGVkIGJ5IHRoZSBpbnRlcnNlY3Rpb24gb3Igb3ZlcmxhcDo8L3A+XG4gKi9cbmNsYXNzIEdyYXBoaWNzUGF0aFdpbmRpbmdcbntcblx0cHVibGljIHN0YXRpYyBFVkVOX09ERDpzdHJpbmcgPSBcImV2ZW5PZGRcIjtcblx0cHVibGljIHN0YXRpYyBOT05fWkVSTzpzdHJpbmcgPSBcIm5vblplcm9cIjtcbn1cblxuZXhwb3J0ID0gR3JhcGhpY3NQYXRoV2luZGluZzsiXX0= \ No newline at end of file diff --git a/src/away/core/base/GraphicsPathWinding.ts b/lib/core/base/GraphicsPathWinding.ts similarity index 71% rename from src/away/core/base/GraphicsPathWinding.ts rename to lib/core/base/GraphicsPathWinding.ts index 822c0d97..c4a95b97 100644 --- a/src/away/core/base/GraphicsPathWinding.ts +++ b/lib/core/base/GraphicsPathWinding.ts @@ -1,5 +1,3 @@ -/// - /** * The GraphicsPathWinding class provides values for the * flash.display.GraphicsPath.winding property and the @@ -10,11 +8,10 @@ *

When paths intersect or overlap, the winding direction determines the * rules for filling the areas created by the intersection or overlap:

*/ -module away.base +class GraphicsPathWinding { - export class GraphicsPathWinding - { - public static EVEN_ODD:string = "evenOdd"; - public static NON_ZERO:string = "nonZero"; - } + public static EVEN_ODD:string = "evenOdd"; + public static NON_ZERO:string = "nonZero"; } + +export = GraphicsPathWinding; \ No newline at end of file diff --git a/lib/core/base/IBitmapDrawable.js b/lib/core/base/IBitmapDrawable.js new file mode 100755 index 00000000..934f4b53 --- /dev/null +++ b/lib/core/base/IBitmapDrawable.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9JQml0bWFwRHJhd2FibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFlQSIsImZpbGUiOiJjb3JlL2Jhc2UvSUJpdG1hcERyYXdhYmxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgSUJpdG1hcERyYXdhYmxlIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBvYmplY3RzIHRoYXQgY2FuIGJlIHBhc3NlZCBhcyB0aGVcbiAqIHNvdXJjZSBwYXJhbWV0ZXIgb2YgdGhlIDxjb2RlPmRyYXcoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBCaXRtYXBEYXRhIGNsYXNzLiBUaGVzZVxuICogb2JqZWN0cyBhcmUgb2YgdHlwZSBCaXRtYXBEYXRhIG9yIERpc3BsYXlPYmplY3QuXG4gKiBcbiAqIEBzZWUgYXdheS5iYXNlLkJpdG1hcERhdGEjZHJhdygpXG4gKiBAc2VlIGF3YXkuYmFzZS5CaXRtYXBEYXRhXG4gKiBAc2VlIGF3YXkuYmFzZS5EaXNwbGF5T2JqZWN0XG4gKi9cbmludGVyZmFjZSBJQml0bWFwRHJhd2FibGVcbntcblxufVxuXG5leHBvcnQgPSBJQml0bWFwRHJhd2FibGU7XG4iXX0= \ No newline at end of file diff --git a/src/away/core/base/IBitmapDrawable.ts b/lib/core/base/IBitmapDrawable.ts similarity index 76% rename from src/away/core/base/IBitmapDrawable.ts rename to lib/core/base/IBitmapDrawable.ts index 4c5c3407..9160f6e4 100644 --- a/src/away/core/base/IBitmapDrawable.ts +++ b/lib/core/base/IBitmapDrawable.ts @@ -1,5 +1,3 @@ -/// - /** * The IBitmapDrawable interface is implemented by objects that can be passed as the * source parameter of the draw() method of the BitmapData class. These @@ -9,10 +7,9 @@ * @see away.base.BitmapData * @see away.base.DisplayObject */ -module away.base +interface IBitmapDrawable { - export interface IBitmapDrawable - { - } } + +export = IBitmapDrawable; diff --git a/lib/core/base/IGraphicsData.js b/lib/core/base/IGraphicsData.js new file mode 100755 index 00000000..7ced277d --- /dev/null +++ b/lib/core/base/IGraphicsData.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9JR3JhcGhpY3NEYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBZXVCIiwiZmlsZSI6ImNvcmUvYmFzZS9JR3JhcGhpY3NEYXRhLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGRlZmluZSBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVycyBpbiB0aGVcbiAqIDxjb2RlPmF3YXkuYmFzZS5HcmFwaGljczwvY29kZT4gbWV0aG9kcywgaW5jbHVkaW5nIGZpbGxzLCBzdHJva2VzLCBhbmQgcGF0aHMuIFVzZVxuICogdGhlIGltcGxlbWVudG9yIGNsYXNzZXMgb2YgdGhpcyBpbnRlcmZhY2UgdG8gY3JlYXRlIGFuZCBtYW5hZ2UgZHJhd2luZyBwcm9wZXJ0eVxuICogZGF0YSwgYW5kIHRvIHJldXNlIHRoZSBzYW1lIGRhdGEgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMuIFRoZW4sIHVzZSB0aGUgbWV0aG9kcyBvZlxuICogdGhlIEdyYXBoaWNzIGNsYXNzIHRvIHJlbmRlciB0aGUgZHJhd2luZyBvYmplY3RzLlxuICogXG4gKiBAc2VlIGF3YXkuYmFzZS5HcmFwaGljcy5kcmF3R3JhcGhpY3NEYXRhKClcbiAqIEBzZWUgYXdheS5iYXNlLkdyYXBoaWNzLnJlYWRHcmFwaGljc0RhdGEoKVxuICovXG5pbnRlcmZhY2UgSUdyYXBoaWNzRGF0YVxue1xuXG59XG5cbmV4cG9ydCA9IElHcmFwaGljc0RhdGE7Il19 \ No newline at end of file diff --git a/src/away/core/base/IGraphicsData.ts b/lib/core/base/IGraphicsData.ts similarity index 83% rename from src/away/core/base/IGraphicsData.ts rename to lib/core/base/IGraphicsData.ts index 8260ed6c..24f09716 100644 --- a/src/away/core/base/IGraphicsData.ts +++ b/lib/core/base/IGraphicsData.ts @@ -1,5 +1,3 @@ -/// - /** * This interface is used to define objects that can be used as parameters in the * away.base.Graphics methods, including fills, strokes, and paths. Use @@ -10,9 +8,9 @@ * @see away.base.Graphics.drawGraphicsData() * @see away.base.Graphics.readGraphicsData() */ -module away.base +interface IGraphicsData { - export interface IGraphicsData - { - } -} \ No newline at end of file + +} + +export = IGraphicsData; \ No newline at end of file diff --git a/lib/core/base/IMaterialOwner.js b/lib/core/base/IMaterialOwner.js new file mode 100755 index 00000000..757ba1a7 --- /dev/null +++ b/lib/core/base/IMaterialOwner.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9JTWF0ZXJpYWxPd25lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQW9Ed0IiLCJmaWxlIjoiY29yZS9iYXNlL0lNYXRlcmlhbE93bmVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElBbmltYXRvclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2FuaW1hdG9ycy9JQW5pbWF0b3JcIik7XG5pbXBvcnQgVVZUcmFuc2Zvcm1cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVVZUcmFuc2Zvcm1cIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IElSZW5kZXJhYmxlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0lSZW5kZXJhYmxlXCIpO1xuaW1wb3J0IElSZW5kZXJlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcmVuZGVyL0lSZW5kZXJlclwiKTtcbmltcG9ydCBNYXRlcmlhbEJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvTWF0ZXJpYWxCYXNlXCIpO1xuXG4vKipcbiAqIElNYXRlcmlhbE93bmVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGNhbiB1c2UgbWF0ZXJpYWxzLlxuICpcbiAqIEBpbnRlcmZhY2UgYXdheS5iYXNlLklNYXRlcmlhbE93bmVyXG4gKi9cbmludGVyZmFjZSBJTWF0ZXJpYWxPd25lciBleHRlbmRzIElBc3NldFxue1xuXHQvKipcblx0ICogVGhlIGFuaW1hdGlvbiB1c2VkIGJ5IHRoZSBtYXRlcmlhbCBvd25lciB0byBhc3NlbWJsZSB0aGUgdmVydGV4IGNvZGUuXG5cdCAqL1xuXHRhbmltYXRvcjpJQW5pbWF0b3I7XG5cblx0LyoqXG5cdCAqIFRoZSBtYXRlcmlhbCB3aXRoIHdoaWNoIHRvIHJlbmRlciB0aGUgb2JqZWN0LlxuXHQgKi9cblx0bWF0ZXJpYWw6TWF0ZXJpYWxCYXNlO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0dXZUcmFuc2Zvcm06VVZUcmFuc2Zvcm07XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSByZW5kZXJhYmxlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaUFkZFJlbmRlcmFibGUocmVuZGVyYWJsZTpJUmVuZGVyYWJsZSk6SVJlbmRlcmFibGU7XG5cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHJlbmRlcmFibGVcblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9pUmVtb3ZlUmVuZGVyYWJsZShyZW5kZXJhYmxlOklSZW5kZXJhYmxlKTpJUmVuZGVyYWJsZTtcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHJlbmRlcmVyXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaUNvbGxlY3RSZW5kZXJhYmxlKHJlbmRlcmVyOklSZW5kZXJlcilcbn1cblxuZXhwb3J0ID0gSU1hdGVyaWFsT3duZXI7Il19 \ No newline at end of file diff --git a/lib/core/base/IMaterialOwner.ts b/lib/core/base/IMaterialOwner.ts new file mode 100644 index 00000000..be3baf27 --- /dev/null +++ b/lib/core/base/IMaterialOwner.ts @@ -0,0 +1,53 @@ +import IAnimator = require("awayjs-core/lib/animators/IAnimator"); +import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * IMaterialOwner provides an interface for objects that can use materials. + * + * @interface away.base.IMaterialOwner + */ +interface IMaterialOwner extends IAsset +{ + /** + * The animation used by the material owner to assemble the vertex code. + */ + animator:IAnimator; + + /** + * The material with which to render the object. + */ + material:MaterialBase; + + /** + * + */ + uvTransform:UVTransform; + + /** + * + * @param renderable + * @private + */ + _iAddRenderable(renderable:IRenderable):IRenderable; + + + /** + * + * @param renderable + * @private + */ + _iRemoveRenderable(renderable:IRenderable):IRenderable; + + /** + * + * @param renderer + * @private + */ + _iCollectRenderable(renderer:IRenderer) +} + +export = IMaterialOwner; \ No newline at end of file diff --git a/lib/core/base/IStage.js b/lib/core/base/IStage.js new file mode 100755 index 00000000..e1d7f8f1 --- /dev/null +++ b/lib/core/base/IStage.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9JU3RhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFXQSIsImZpbGUiOiJjb3JlL2Jhc2UvSVN0YWdlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgSVN0YWdlIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBvYmplY3RzIHRoYXQgY29udHJvbCB0aGUgcmVuZGVyaW5nIGNvbnRleHRcbiAqIG9mIHRoZSBBd2F5SlMgU3RhZ2UgYXJlYVxuICpcbiAqL1xuaW50ZXJmYWNlIElTdGFnZVxue1xuXG59XG5cbmV4cG9ydCA9IElTdGFnZTtcbiJdfQ== \ No newline at end of file diff --git a/lib/core/base/IStage.ts b/lib/core/base/IStage.ts new file mode 100644 index 00000000..40dc6b43 --- /dev/null +++ b/lib/core/base/IStage.ts @@ -0,0 +1,11 @@ +/** + * The IStage interface is implemented by objects that control the rendering context + * of the AwayJS Stage area + * + */ +interface IStage +{ + +} + +export = IStage; diff --git a/lib/core/base/ISubMesh.js b/lib/core/base/ISubMesh.js new file mode 100755 index 00000000..9252b342 --- /dev/null +++ b/lib/core/base/ISubMesh.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9JU3ViTWVzaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQXdCa0IiLCJmaWxlIjoiY29yZS9iYXNlL0lTdWJNZXNoLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElNYXRlcmlhbE93bmVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JTWF0ZXJpYWxPd25lclwiKTtcbmltcG9ydCBTdWJHZW9tZXRyeUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1N1Ykdlb21ldHJ5QmFzZVwiKTtcbmltcG9ydCBNZXNoXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL01lc2hcIik7XG5pbXBvcnQgTWF0ZXJpYWxCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvbWF0ZXJpYWxzL01hdGVyaWFsQmFzZVwiKTtcblxuLyoqXG4gKiBJU3ViTWVzaCBpcyBhbiBpbnRlcmZhY2UgZm9yIG9iamVjdCBTdWJNZXNoIHRoYXQgaXMgdXNlZCB0b1xuICogYXBwbHkgYSBtYXRlcmlhbCB0byBhIFN1Ykdlb21ldHJ5IGNsYXNzXG4gKlxuICogQGNsYXNzIGF3YXkuYmFzZS5JU3ViTWVzaFxuICovXG5pbnRlcmZhY2UgSVN1Yk1lc2ggZXh0ZW5kcyBJTWF0ZXJpYWxPd25lclxue1xuXHRzdWJHZW9tZXRyeTpTdWJHZW9tZXRyeUJhc2U7XG5cblx0cGFyZW50TWVzaDpNZXNoO1xuXG5cdF9pSW5kZXg6bnVtYmVyO1xuXG5cdF9pSW52YWxpZGF0ZVJlbmRlcmFibGVHZW9tZXRyeSgpO1xuXG5cdF9pR2V0RXhwbGljaXRNYXRlcmlhbCgpOk1hdGVyaWFsQmFzZTtcbn1cblxuZXhwb3J0ID0gSVN1Yk1lc2g7Il19 \ No newline at end of file diff --git a/lib/core/base/ISubMesh.ts b/lib/core/base/ISubMesh.ts new file mode 100644 index 00000000..b2b852ad --- /dev/null +++ b/lib/core/base/ISubMesh.ts @@ -0,0 +1,25 @@ +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import Mesh = require("awayjs-core/lib/entities/Mesh"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * ISubMesh is an interface for object SubMesh that is used to + * apply a material to a SubGeometry class + * + * @class away.base.ISubMesh + */ +interface ISubMesh extends IMaterialOwner +{ + subGeometry:SubGeometryBase; + + parentMesh:Mesh; + + _iIndex:number; + + _iInvalidateRenderableGeometry(); + + _iGetExplicitMaterial():MaterialBase; +} + +export = ISubMesh; \ No newline at end of file diff --git a/lib/core/base/ISubMeshClass.js b/lib/core/base/ISubMeshClass.js new file mode 100755 index 00000000..6d117841 --- /dev/null +++ b/lib/core/base/ISubMeshClass.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9JU3ViTWVzaENsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBbUJ1QiIsImZpbGUiOiJjb3JlL2Jhc2UvSVN1Yk1lc2hDbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJU3ViTWVzaFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0lTdWJNZXNoXCIpO1xuaW1wb3J0IFN1Ykdlb21ldHJ5QmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvU3ViR2VvbWV0cnlCYXNlXCIpO1xuaW1wb3J0IE1lc2hcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvTWVzaFwiKTtcbmltcG9ydCBNYXRlcmlhbEJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvTWF0ZXJpYWxCYXNlXCIpO1xuXG4vKipcbiAqIElTdWJNZXNoQ2xhc3MgaXMgYW4gaW50ZXJmYWNlIGZvciB0aGUgY29uc3RydWN0YWJsZSBjbGFzcyBkZWZpbml0aW9uIElTdWJNZXNoIHRoYXQgaXMgdXNlZCB0b1xuICogYXBwbHkgYSBtYXRlcmlhbCB0byBhIFN1Ykdlb21ldHJ5IGNsYXNzXG4gKlxuICogQGNsYXNzIGF3YXkuYmFzZS5JU3ViTWVzaENsYXNzXG4gKi9cbmludGVyZmFjZSBJU3ViTWVzaENsYXNzXG57XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0bmV3KHN1Ykdlb21ldHJ5OlN1Ykdlb21ldHJ5QmFzZSwgcGFyZW50TWVzaDpNZXNoLCBtYXRlcmlhbD86TWF0ZXJpYWxCYXNlKTpJU3ViTWVzaDtcbn1cblxuZXhwb3J0ID0gSVN1Yk1lc2hDbGFzczsiXX0= \ No newline at end of file diff --git a/lib/core/base/ISubMeshClass.ts b/lib/core/base/ISubMeshClass.ts new file mode 100644 index 00000000..d8f3a2db --- /dev/null +++ b/lib/core/base/ISubMeshClass.ts @@ -0,0 +1,20 @@ +import ISubMesh = require("awayjs-core/lib/core/base/ISubMesh"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import Mesh = require("awayjs-core/lib/entities/Mesh"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * ISubMeshClass is an interface for the constructable class definition ISubMesh that is used to + * apply a material to a SubGeometry class + * + * @class away.base.ISubMeshClass + */ +interface ISubMeshClass +{ + /** + * + */ + new(subGeometry:SubGeometryBase, parentMesh:Mesh, material?:MaterialBase):ISubMesh; +} + +export = ISubMeshClass; \ No newline at end of file diff --git a/lib/core/base/InterpolationMethod.js b/lib/core/base/InterpolationMethod.js new file mode 100755 index 00000000..f9fd14c3 --- /dev/null +++ b/lib/core/base/InterpolationMethod.js @@ -0,0 +1,19 @@ +/** +* The InterpolationMethod class provides values for the +* interpolationMethod parameter in the +* Graphics.beginGradientFill() and +* Graphics.lineGradientStyle() methods. This parameter +* determines the RGB space to use when rendering the gradient. +*/ +var InterpolationMethod = (function () { + function InterpolationMethod() { + } + InterpolationMethod.LINEAR_RGB = "linearRGB"; + + InterpolationMethod.RGB = "rgb"; + return InterpolationMethod; +})(); + +module.exports = InterpolationMethod; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9JbnRlcnBvbGF0aW9uTWV0aG9kLnRzIl0sIm5hbWVzIjpbIkludGVycG9sYXRpb25NZXRob2QiLCJJbnRlcnBvbGF0aW9uTWV0aG9kLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0VBTUc7QUFDSDtJQUFBQTtJQThCQUMsQ0FBQ0E7QUFBQUQsSUFmQUEsaUNBQWtDQSxXQUFXQTs7SUFjN0NBLDBCQUEyQkEsS0FBS0E7SUFDakNBLDJCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELG9DQUE2QixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9JbnRlcnBvbGF0aW9uTWV0aG9kLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgSW50ZXJwb2xhdGlvbk1ldGhvZCBjbGFzcyBwcm92aWRlcyB2YWx1ZXMgZm9yIHRoZVxuICogPGNvZGU+aW50ZXJwb2xhdGlvbk1ldGhvZDwvY29kZT4gcGFyYW1ldGVyIGluIHRoZVxuICogPGNvZGU+R3JhcGhpY3MuYmVnaW5HcmFkaWVudEZpbGwoKTwvY29kZT4gYW5kXG4gKiA8Y29kZT5HcmFwaGljcy5saW5lR3JhZGllbnRTdHlsZSgpPC9jb2RlPiBtZXRob2RzLiBUaGlzIHBhcmFtZXRlclxuICogZGV0ZXJtaW5lcyB0aGUgUkdCIHNwYWNlIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGUgZ3JhZGllbnQuXG4gKi9cbmNsYXNzIEludGVycG9sYXRpb25NZXRob2RcbntcblxuXHQvKipcblx0ICogU3BlY2lmaWVzIHRoYXQgdGhlIFJHQiBpbnRlcnBvbGF0aW9uIG1ldGhvZCBzaG91bGQgYmUgdXNlZC4gVGhpcyBtZWFuc1xuXHQgKiB0aGF0IHRoZSBncmFkaWVudCBpcyByZW5kZXJlZCB3aXRoIGV4cG9uZW50aWFsIHNSR0Ioc3RhbmRhcmQgUkdCKSBzcGFjZS5cblx0ICogVGhlIHNSR0Igc3BhY2UgaXMgYSBXM0MtZW5kb3JzZWQgc3RhbmRhcmQgdGhhdCBkZWZpbmVzIGEgbm9uLWxpbmVhclxuXHQgKiBjb252ZXJzaW9uIGJldHdlZW4gcmVkLCBncmVlbiwgYW5kIGJsdWUgY29tcG9uZW50IHZhbHVlcyBhbmQgdGhlIGFjdHVhbFxuXHQgKiBpbnRlbnNpdHkgb2YgdGhlIHZpc2libGUgY29tcG9uZW50IGNvbG9yLlxuXHQgKlxuXHQgKiA8cD5Gb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBzaW1wbGUgbGluZWFyIGdyYWRpZW50IGJldHdlZW4gdHdvIGNvbG9ycyh3aXRoXG5cdCAqIHRoZSA8Y29kZT5zcHJlYWRNZXRob2Q8L2NvZGU+IHBhcmFtZXRlciBzZXQgdG9cblx0ICogPGNvZGU+U3ByZWFkTWV0aG9kLlJFRkxFQ1Q8L2NvZGU+KS4gVGhlIGRpZmZlcmVudCBpbnRlcnBvbGF0aW9uIG1ldGhvZHNcblx0ICogYWZmZWN0IHRoZSBhcHBlYXJhbmNlIGFzIGZvbGxvd3M6IDwvcD5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTElORUFSX1JHQjpzdHJpbmcgPSBcImxpbmVhclJHQlwiO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgdGhhdCB0aGUgUkdCIGludGVycG9sYXRpb24gbWV0aG9kIHNob3VsZCBiZSB1c2VkLiBUaGlzIG1lYW5zXG5cdCAqIHRoYXQgdGhlIGdyYWRpZW50IGlzIHJlbmRlcmVkIHdpdGggZXhwb25lbnRpYWwgc1JHQihzdGFuZGFyZCBSR0IpIHNwYWNlLlxuXHQgKiBUaGUgc1JHQiBzcGFjZSBpcyBhIFczQy1lbmRvcnNlZCBzdGFuZGFyZCB0aGF0IGRlZmluZXMgYSBub24tbGluZWFyXG5cdCAqIGNvbnZlcnNpb24gYmV0d2VlbiByZWQsIGdyZWVuLCBhbmQgYmx1ZSBjb21wb25lbnQgdmFsdWVzIGFuZCB0aGUgYWN0dWFsXG5cdCAqIGludGVuc2l0eSBvZiB0aGUgdmlzaWJsZSBjb21wb25lbnQgY29sb3IuXG5cdCAqXG5cdCAqIDxwPkZvciBleGFtcGxlLCBjb25zaWRlciBhIHNpbXBsZSBsaW5lYXIgZ3JhZGllbnQgYmV0d2VlbiB0d28gY29sb3JzKHdpdGhcblx0ICogdGhlIDxjb2RlPnNwcmVhZE1ldGhvZDwvY29kZT4gcGFyYW1ldGVyIHNldCB0b1xuXHQgKiA8Y29kZT5TcHJlYWRNZXRob2QuUkVGTEVDVDwvY29kZT4pLiBUaGUgZGlmZmVyZW50IGludGVycG9sYXRpb24gbWV0aG9kc1xuXHQgKiBhZmZlY3QgdGhlIGFwcGVhcmFuY2UgYXMgZm9sbG93czogPC9wPlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBSR0I6c3RyaW5nID0gXCJyZ2JcIjtcbn1cblxuZXhwb3J0ID0gSW50ZXJwb2xhdGlvbk1ldGhvZDsiXX0= \ No newline at end of file diff --git a/lib/core/base/InterpolationMethod.ts b/lib/core/base/InterpolationMethod.ts new file mode 100644 index 00000000..e11aeb80 --- /dev/null +++ b/lib/core/base/InterpolationMethod.ts @@ -0,0 +1,40 @@ +/** + * The InterpolationMethod class provides values for the + * interpolationMethod parameter in the + * Graphics.beginGradientFill() and + * Graphics.lineGradientStyle() methods. This parameter + * determines the RGB space to use when rendering the gradient. + */ +class InterpolationMethod +{ + + /** + * Specifies that the RGB interpolation method should be used. This means + * that the gradient is rendered with exponential sRGB(standard RGB) space. + * The sRGB space is a W3C-endorsed standard that defines a non-linear + * conversion between red, green, and blue component values and the actual + * intensity of the visible component color. + * + *

For example, consider a simple linear gradient between two colors(with + * the spreadMethod parameter set to + * SpreadMethod.REFLECT). The different interpolation methods + * affect the appearance as follows:

+ */ + public static LINEAR_RGB:string = "linearRGB"; + + /** + * Specifies that the RGB interpolation method should be used. This means + * that the gradient is rendered with exponential sRGB(standard RGB) space. + * The sRGB space is a W3C-endorsed standard that defines a non-linear + * conversion between red, green, and blue component values and the actual + * intensity of the visible component color. + * + *

For example, consider a simple linear gradient between two colors(with + * the spreadMethod parameter set to + * SpreadMethod.REFLECT). The different interpolation methods + * affect the appearance as follows:

+ */ + public static RGB:string = "rgb"; +} + +export = InterpolationMethod; \ No newline at end of file diff --git a/lib/core/base/JointStyle.js b/lib/core/base/JointStyle.js new file mode 100755 index 00000000..3d6c7554 --- /dev/null +++ b/lib/core/base/JointStyle.js @@ -0,0 +1,22 @@ +/** +* The JointStyle class is an enumeration of constant values that specify the +* joint style to use in drawing lines. These constants are provided for use +* as values in the joints parameter of the +* flash.display.Graphics.lineStyle() method. The method supports +* three types of joints: miter, round, and bevel, as the following example +* shows: +*/ +var JointStyle = (function () { + function JointStyle() { + } + JointStyle.BEVEL = "bevel"; + + JointStyle.MITER = "miter"; + + JointStyle.ROUND = "round"; + return JointStyle; +})(); + +module.exports = JointStyle; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9Kb2ludFN0eWxlLnRzIl0sIm5hbWVzIjpbIkpvaW50U3R5bGUiLCJKb2ludFN0eWxlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztFQU9HO0FBQ0g7SUFBQUE7SUFtQkFDLENBQUNBO0FBQUFELElBYkFBLG1CQUE2QkEsT0FBT0E7O0lBTXBDQSxtQkFBNkJBLE9BQU9BOztJQU1wQ0EsbUJBQTZCQSxPQUFPQTtJQUNyQ0Esa0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsMkJBQW9CLENBQUEiLCJmaWxlIjoiY29yZS9iYXNlL0pvaW50U3R5bGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBKb2ludFN0eWxlIGNsYXNzIGlzIGFuIGVudW1lcmF0aW9uIG9mIGNvbnN0YW50IHZhbHVlcyB0aGF0IHNwZWNpZnkgdGhlXG4gKiBqb2ludCBzdHlsZSB0byB1c2UgaW4gZHJhd2luZyBsaW5lcy4gVGhlc2UgY29uc3RhbnRzIGFyZSBwcm92aWRlZCBmb3IgdXNlXG4gKiBhcyB2YWx1ZXMgaW4gdGhlIDxjb2RlPmpvaW50czwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZVxuICogPGNvZGU+Zmxhc2guZGlzcGxheS5HcmFwaGljcy5saW5lU3R5bGUoKTwvY29kZT4gbWV0aG9kLiBUaGUgbWV0aG9kIHN1cHBvcnRzXG4gKiB0aHJlZSB0eXBlcyBvZiBqb2ludHM6IG1pdGVyLCByb3VuZCwgYW5kIGJldmVsLCBhcyB0aGUgZm9sbG93aW5nIGV4YW1wbGVcbiAqIHNob3dzOlxuICovXG5jbGFzcyBKb2ludFN0eWxlXG57XG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgYmV2ZWxlZCBqb2ludHMgaW4gdGhlIDxjb2RlPmpvaW50czwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZVxuXHQgKiA8Y29kZT5mbGFzaC5kaXNwbGF5LkdyYXBoaWNzLmxpbmVTdHlsZSgpPC9jb2RlPiBtZXRob2QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEJFVkVMOnN0cmluZyA9IFwiYmV2ZWxcIjtcblxuXHQvKipcblx0ICogU3BlY2lmaWVzIG1pdGVyZWQgam9pbnRzIGluIHRoZSA8Y29kZT5qb2ludHM8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGVcblx0ICogPGNvZGU+Zmxhc2guZGlzcGxheS5HcmFwaGljcy5saW5lU3R5bGUoKTwvY29kZT4gbWV0aG9kLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBNSVRFUjpzdHJpbmcgPSBcIm1pdGVyXCI7XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyByb3VuZCBqb2ludHMgaW4gdGhlIDxjb2RlPmpvaW50czwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZVxuXHQgKiA8Y29kZT5mbGFzaC5kaXNwbGF5LkdyYXBoaWNzLmxpbmVTdHlsZSgpPC9jb2RlPiBtZXRob2QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFJPVU5EOnN0cmluZyA9IFwicm91bmRcIjtcbn1cblxuZXhwb3J0ID0gSm9pbnRTdHlsZTsiXX0= \ No newline at end of file diff --git a/lib/core/base/JointStyle.ts b/lib/core/base/JointStyle.ts new file mode 100644 index 00000000..eccbbfeb --- /dev/null +++ b/lib/core/base/JointStyle.ts @@ -0,0 +1,30 @@ +/** + * The JointStyle class is an enumeration of constant values that specify the + * joint style to use in drawing lines. These constants are provided for use + * as values in the joints parameter of the + * flash.display.Graphics.lineStyle() method. The method supports + * three types of joints: miter, round, and bevel, as the following example + * shows: + */ +class JointStyle +{ + /** + * Specifies beveled joints in the joints parameter of the + * flash.display.Graphics.lineStyle() method. + */ + public static BEVEL:string = "bevel"; + + /** + * Specifies mitered joints in the joints parameter of the + * flash.display.Graphics.lineStyle() method. + */ + public static MITER:string = "miter"; + + /** + * Specifies round joints in the joints parameter of the + * flash.display.Graphics.lineStyle() method. + */ + public static ROUND:string = "round"; +} + +export = JointStyle; \ No newline at end of file diff --git a/lib/core/base/LightBase.js b/lib/core/base/LightBase.js new file mode 100755 index 00000000..3860cab4 --- /dev/null +++ b/lib/core/base/LightBase.js @@ -0,0 +1,198 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var LightEvent = require("awayjs-core/lib/events/LightEvent"); + +var LightBase = (function (_super) { + __extends(LightBase, _super); + function LightBase() { + _super.call(this); + this._color = 0xffffff; + this._colorR = 1; + this._colorG = 1; + this._colorB = 1; + this._ambientColor = 0xffffff; + this._ambient = 0; + this._iAmbientR = 0; + this._iAmbientG = 0; + this._iAmbientB = 0; + this._specular = 1; + this._iSpecularR = 1; + this._iSpecularG = 1; + this._iSpecularB = 1; + this._diffuse = 1; + this._iDiffuseR = 1; + this._iDiffuseG = 1; + this._iDiffuseB = 1; + this._castsShadows = false; + } + Object.defineProperty(LightBase.prototype, "castsShadows", { + get: function () { + return this._castsShadows; + }, + set: function (value) { + if (this._castsShadows == value) + return; + + this._castsShadows = value; + + if (value) { + if (this._shadowMapper == null) + this._shadowMapper = this.pCreateShadowMapper(); + + this._shadowMapper.light = this; + } else { + this._shadowMapper.dispose(); + this._shadowMapper = null; + } + + //*/ + this.dispatchEvent(new LightEvent(LightEvent.CASTS_SHADOW_CHANGE)); + }, + enumerable: true, + configurable: true + }); + + + LightBase.prototype.pCreateShadowMapper = function () { + throw new AbstractMethodError(); + }; + + Object.defineProperty(LightBase.prototype, "specular", { + get: function () { + return this._specular; + }, + set: function (value) { + if (value < 0) + value = 0; + + this._specular = value; + this.updateSpecular(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightBase.prototype, "diffuse", { + get: function () { + return this._diffuse; + }, + set: function (value) { + if (value < 0) + value = 0; + + this._diffuse = value; + this.updateDiffuse(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightBase.prototype, "color", { + get: function () { + return this._color; + }, + set: function (value) { + this._color = value; + this._colorR = ((this._color >> 16) & 0xff) / 0xff; + this._colorG = ((this._color >> 8) & 0xff) / 0xff; + this._colorB = (this._color & 0xff) / 0xff; + + this.updateDiffuse(); + this.updateSpecular(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightBase.prototype, "ambient", { + get: function () { + return this._ambient; + }, + set: function (value) { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + this._ambient = value; + this.updateAmbient(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightBase.prototype, "ambientColor", { + get: function () { + return this._ambientColor; + }, + set: function (value) { + this._ambientColor = value; + this.updateAmbient(); + }, + enumerable: true, + configurable: true + }); + + + LightBase.prototype.updateAmbient = function () { + this._iAmbientR = ((this._ambientColor >> 16) & 0xff) / 0xff * this._ambient; + this._iAmbientG = ((this._ambientColor >> 8) & 0xff) / 0xff * this._ambient; + this._iAmbientB = (this._ambientColor & 0xff) / 0xff * this._ambient; + }; + + LightBase.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { + if (typeof target === "undefined") { target = null; } + throw new AbstractMethodError(); + }; + + Object.defineProperty(LightBase.prototype, "assetType", { + //@override + get: function () { + return AssetType.LIGHT; + }, + enumerable: true, + configurable: true + }); + + LightBase.prototype.updateSpecular = function () { + this._iSpecularR = this._colorR * this._specular; + this._iSpecularG = this._colorG * this._specular; + this._iSpecularB = this._colorB * this._specular; + }; + + LightBase.prototype.updateDiffuse = function () { + this._iDiffuseR = this._colorR * this._diffuse; + this._iDiffuseG = this._colorG * this._diffuse; + this._iDiffuseB = this._colorB * this._diffuse; + }; + + Object.defineProperty(LightBase.prototype, "shadowMapper", { + get: function () { + return this._shadowMapper; + }, + set: function (value) { + this._shadowMapper = value; + this._shadowMapper.light = this; + }, + enumerable: true, + configurable: true + }); + + return LightBase; +})(DisplayObjectContainer); + +module.exports = LightBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9MaWdodEJhc2UudHMiXSwibmFtZXMiOlsiTGlnaHRCYXNlIiwiTGlnaHRCYXNlLmNvbnN0cnVjdG9yIiwiTGlnaHRCYXNlLnBDcmVhdGVTaGFkb3dNYXBwZXIiLCJMaWdodEJhc2UudXBkYXRlQW1iaWVudCIsIkxpZ2h0QmFzZS5pR2V0T2JqZWN0UHJvamVjdGlvbk1hdHJpeCIsIkxpZ2h0QmFzZS51cGRhdGVTcGVjdWxhciIsIkxpZ2h0QmFzZS51cGRhdGVEaWZmdXNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx5RkFBNkY7QUFDN0YsaUVBQXdFOztBQUl4RSwrRUFBb0Y7QUFDcEYsNkRBQW9FOztBQUdwRTtJQUF3QkEsNEJBQXNCQTtJQTJCN0NBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBO1FBM0JSQSxLQUFRQSxNQUFNQSxHQUFVQSxRQUFRQSxDQUFDQTtRQUNqQ0EsS0FBUUEsT0FBT0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDM0JBLEtBQVFBLE9BQU9BLEdBQVVBLENBQUNBLENBQUNBO1FBQzNCQSxLQUFRQSxPQUFPQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUUzQkEsS0FBUUEsYUFBYUEsR0FBVUEsUUFBUUEsQ0FBQ0E7UUFDeENBLEtBQVFBLFFBQVFBLEdBQVVBLENBQUNBLENBQUNBO1FBQzVCQSxLQUFPQSxVQUFVQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUM3QkEsS0FBT0EsVUFBVUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLEtBQU9BLFVBQVVBLEdBQVVBLENBQUNBLENBQUNBO1FBRTdCQSxLQUFRQSxTQUFTQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUM3QkEsS0FBT0EsV0FBV0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDOUJBLEtBQU9BLFdBQVdBLEdBQVVBLENBQUNBLENBQUNBO1FBQzlCQSxLQUFPQSxXQUFXQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUU5QkEsS0FBUUEsUUFBUUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLEtBQU9B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Q0EsQ0FBQ0E7Ozs7QUFOQUE7SUFPRkEsaUJBQUNBO0FBQURBLENBQUNBLEVBL0t1QixzQkFBc0IsRUErSzdDOztBQUVELDBCQUFtQixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9MaWdodEJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlzcGxheU9iamVjdENvbnRhaW5lclx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRhaW5lcnMvRGlzcGxheU9iamVjdENvbnRhaW5lclwiKTtcbmltcG9ydCBBc3NldFR5cGVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRUeXBlXCIpO1xuaW1wb3J0IE1hdHJpeDNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9DYW1lcmFcIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcbmltcG9ydCBBYnN0cmFjdE1ldGhvZEVycm9yXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQWJzdHJhY3RNZXRob2RFcnJvclwiKTtcbmltcG9ydCBMaWdodEV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0xpZ2h0RXZlbnRcIik7XG5pbXBvcnQgU2hhZG93TWFwcGVyQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvc2hhZG93bWFwcGVycy9TaGFkb3dNYXBwZXJCYXNlXCIpO1xuXG5jbGFzcyBMaWdodEJhc2UgZXh0ZW5kcyBEaXNwbGF5T2JqZWN0Q29udGFpbmVyXG57XG5cdHByaXZhdGUgX2NvbG9yOm51bWJlciA9IDB4ZmZmZmZmO1xuXHRwcml2YXRlIF9jb2xvclI6bnVtYmVyID0gMTtcblx0cHJpdmF0ZSBfY29sb3JHOm51bWJlciA9IDE7XG5cdHByaXZhdGUgX2NvbG9yQjpudW1iZXIgPSAxO1xuXG5cdHByaXZhdGUgX2FtYmllbnRDb2xvcjpudW1iZXIgPSAweGZmZmZmZjtcblx0cHJpdmF0ZSBfYW1iaWVudDpudW1iZXIgPSAwO1xuXHRwdWJsaWMgX2lBbWJpZW50UjpudW1iZXIgPSAwO1xuXHRwdWJsaWMgX2lBbWJpZW50RzpudW1iZXIgPSAwO1xuXHRwdWJsaWMgX2lBbWJpZW50QjpudW1iZXIgPSAwO1xuXG5cdHByaXZhdGUgX3NwZWN1bGFyOm51bWJlciA9IDE7XG5cdHB1YmxpYyBfaVNwZWN1bGFyUjpudW1iZXIgPSAxO1xuXHRwdWJsaWMgX2lTcGVjdWxhckc6bnVtYmVyID0gMTtcblx0cHVibGljIF9pU3BlY3VsYXJCOm51bWJlciA9IDE7XG5cblx0cHJpdmF0ZSBfZGlmZnVzZTpudW1iZXIgPSAxO1xuXHRwdWJsaWMgX2lEaWZmdXNlUjpudW1iZXIgPSAxO1xuXHRwdWJsaWMgX2lEaWZmdXNlRzpudW1iZXIgPSAxO1xuXHRwdWJsaWMgX2lEaWZmdXNlQjpudW1iZXIgPSAxO1xuXG5cdHByaXZhdGUgX2Nhc3RzU2hhZG93czpib29sZWFuID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBfc2hhZG93TWFwcGVyOlNoYWRvd01hcHBlckJhc2U7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgY2FzdHNTaGFkb3dzKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2Nhc3RzU2hhZG93cztcblx0fVxuXG5cdHB1YmxpYyBzZXQgY2FzdHNTaGFkb3dzKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHRpZiAodGhpcy5fY2FzdHNTaGFkb3dzID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fY2FzdHNTaGFkb3dzID0gdmFsdWU7XG5cblx0XHRpZiAodmFsdWUpIHtcblx0XHRcdGlmICh0aGlzLl9zaGFkb3dNYXBwZXIgPT0gbnVsbClcblx0XHRcdFx0dGhpcy5fc2hhZG93TWFwcGVyID0gdGhpcy5wQ3JlYXRlU2hhZG93TWFwcGVyKCk7XG5cblx0XHRcdHRoaXMuX3NoYWRvd01hcHBlci5saWdodCA9IHRoaXM7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX3NoYWRvd01hcHBlci5kaXNwb3NlKCk7XG5cdFx0XHR0aGlzLl9zaGFkb3dNYXBwZXIgPSBudWxsO1xuXHRcdH1cblx0XHQvLyovXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBMaWdodEV2ZW50KExpZ2h0RXZlbnQuQ0FTVFNfU0hBRE9XX0NIQU5HRSkpO1xuXHR9XG5cblx0cHVibGljIHBDcmVhdGVTaGFkb3dNYXBwZXIoKTpTaGFkb3dNYXBwZXJCYXNlXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0cHVibGljIGdldCBzcGVjdWxhcigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NwZWN1bGFyO1xuXHR9XG5cblx0cHVibGljIHNldCBzcGVjdWxhcih2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodmFsdWUgPCAwKVxuXHRcdFx0dmFsdWUgPSAwO1xuXG5cdFx0dGhpcy5fc3BlY3VsYXIgPSB2YWx1ZTtcblx0XHR0aGlzLnVwZGF0ZVNwZWN1bGFyKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRpZmZ1c2UoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kaWZmdXNlO1xuXHR9XG5cblx0cHVibGljIHNldCBkaWZmdXNlKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA8IDApXG5cdFx0XHR2YWx1ZSA9IDA7XG5cblx0XHR0aGlzLl9kaWZmdXNlID0gdmFsdWU7XG5cdFx0dGhpcy51cGRhdGVEaWZmdXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGNvbG9yKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY29sb3I7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGNvbG9yKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX2NvbG9yID0gdmFsdWU7XG5cdFx0dGhpcy5fY29sb3JSID0gKCh0aGlzLl9jb2xvciA+PiAxNikgJiAweGZmKS8weGZmO1xuXHRcdHRoaXMuX2NvbG9yRyA9ICgodGhpcy5fY29sb3IgPj4gOCkgJiAweGZmKS8weGZmO1xuXHRcdHRoaXMuX2NvbG9yQiA9ICh0aGlzLl9jb2xvciAmIDB4ZmYpLzB4ZmY7XG5cblx0XHR0aGlzLnVwZGF0ZURpZmZ1c2UoKTtcblx0XHR0aGlzLnVwZGF0ZVNwZWN1bGFyKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGFtYmllbnQoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9hbWJpZW50O1xuXHR9XG5cblx0cHVibGljIHNldCBhbWJpZW50KHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA8IDApXG5cdFx0XHR2YWx1ZSA9IDA7XG5cdFx0ZWxzZSBpZiAodmFsdWUgPiAxKVxuXHRcdFx0dmFsdWUgPSAxO1xuXG5cdFx0dGhpcy5fYW1iaWVudCA9IHZhbHVlO1xuXHRcdHRoaXMudXBkYXRlQW1iaWVudCgpO1xuXHR9XG5cblx0cHVibGljIGdldCBhbWJpZW50Q29sb3IoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9hbWJpZW50Q29sb3I7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGFtYmllbnRDb2xvcih2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9hbWJpZW50Q29sb3IgPSB2YWx1ZTtcblx0XHR0aGlzLnVwZGF0ZUFtYmllbnQoKTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlQW1iaWVudCgpXG5cdHtcblx0XHR0aGlzLl9pQW1iaWVudFIgPSAoKHRoaXMuX2FtYmllbnRDb2xvciA+PiAxNikgJiAweGZmKS8weGZmKnRoaXMuX2FtYmllbnQ7XG5cdFx0dGhpcy5faUFtYmllbnRHID0gKCh0aGlzLl9hbWJpZW50Q29sb3IgPj4gOCkgJiAweGZmKS8weGZmKnRoaXMuX2FtYmllbnQ7XG5cdFx0dGhpcy5faUFtYmllbnRCID0gKHRoaXMuX2FtYmllbnRDb2xvciAmIDB4ZmYpLzB4ZmYqdGhpcy5fYW1iaWVudDtcblx0fVxuXG5cdHB1YmxpYyBpR2V0T2JqZWN0UHJvamVjdGlvbk1hdHJpeChlbnRpdHk6SUVudGl0eSwgY2FtZXJhOkNhbWVyYSwgdGFyZ2V0Ok1hdHJpeDNEID0gbnVsbCk6TWF0cml4M0Rcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgZ2V0IGFzc2V0VHlwZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIEFzc2V0VHlwZS5MSUdIVDtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlU3BlY3VsYXIoKVxuXHR7XG5cdFx0dGhpcy5faVNwZWN1bGFyUiA9IHRoaXMuX2NvbG9yUip0aGlzLl9zcGVjdWxhcjtcblx0XHR0aGlzLl9pU3BlY3VsYXJHID0gdGhpcy5fY29sb3JHKnRoaXMuX3NwZWN1bGFyO1xuXHRcdHRoaXMuX2lTcGVjdWxhckIgPSB0aGlzLl9jb2xvckIqdGhpcy5fc3BlY3VsYXI7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZURpZmZ1c2UoKVxuXHR7XG5cdFx0dGhpcy5faURpZmZ1c2VSID0gdGhpcy5fY29sb3JSKnRoaXMuX2RpZmZ1c2U7XG5cdFx0dGhpcy5faURpZmZ1c2VHID0gdGhpcy5fY29sb3JHKnRoaXMuX2RpZmZ1c2U7XG5cdFx0dGhpcy5faURpZmZ1c2VCID0gdGhpcy5fY29sb3JCKnRoaXMuX2RpZmZ1c2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHNoYWRvd01hcHBlcigpOlNoYWRvd01hcHBlckJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zaGFkb3dNYXBwZXI7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHNoYWRvd01hcHBlcih2YWx1ZTpTaGFkb3dNYXBwZXJCYXNlKVxuXHR7XG5cdFx0dGhpcy5fc2hhZG93TWFwcGVyID0gdmFsdWU7XG5cdFx0dGhpcy5fc2hhZG93TWFwcGVyLmxpZ2h0ID0gdGhpcztcblx0fVxufVxuXG5leHBvcnQgPSBMaWdodEJhc2U7Il19 \ No newline at end of file diff --git a/lib/core/base/LightBase.ts b/lib/core/base/LightBase.ts new file mode 100644 index 00000000..e4d9fcc4 --- /dev/null +++ b/lib/core/base/LightBase.ts @@ -0,0 +1,187 @@ +import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import LightEvent = require("awayjs-core/lib/events/LightEvent"); +import ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); + +class LightBase extends DisplayObjectContainer +{ + private _color:number = 0xffffff; + private _colorR:number = 1; + private _colorG:number = 1; + private _colorB:number = 1; + + private _ambientColor:number = 0xffffff; + private _ambient:number = 0; + public _iAmbientR:number = 0; + public _iAmbientG:number = 0; + public _iAmbientB:number = 0; + + private _specular:number = 1; + public _iSpecularR:number = 1; + public _iSpecularG:number = 1; + public _iSpecularB:number = 1; + + private _diffuse:number = 1; + public _iDiffuseR:number = 1; + public _iDiffuseG:number = 1; + public _iDiffuseB:number = 1; + + private _castsShadows:boolean = false; + + private _shadowMapper:ShadowMapperBase; + + constructor() + { + super(); + } + + public get castsShadows():boolean + { + return this._castsShadows; + } + + public set castsShadows(value:boolean) + { + if (this._castsShadows == value) + return; + + this._castsShadows = value; + + if (value) { + if (this._shadowMapper == null) + this._shadowMapper = this.pCreateShadowMapper(); + + this._shadowMapper.light = this; + } else { + this._shadowMapper.dispose(); + this._shadowMapper = null; + } + //*/ + this.dispatchEvent(new LightEvent(LightEvent.CASTS_SHADOW_CHANGE)); + } + + public pCreateShadowMapper():ShadowMapperBase + { + throw new AbstractMethodError(); + } + + public get specular():number + { + return this._specular; + } + + public set specular(value:number) + { + if (value < 0) + value = 0; + + this._specular = value; + this.updateSpecular(); + } + + public get diffuse():number + { + return this._diffuse; + } + + public set diffuse(value:number) + { + if (value < 0) + value = 0; + + this._diffuse = value; + this.updateDiffuse(); + } + + public get color():number + { + return this._color; + } + + public set color(value:number) + { + this._color = value; + this._colorR = ((this._color >> 16) & 0xff)/0xff; + this._colorG = ((this._color >> 8) & 0xff)/0xff; + this._colorB = (this._color & 0xff)/0xff; + + this.updateDiffuse(); + this.updateSpecular(); + } + + public get ambient():number + { + return this._ambient; + } + + public set ambient(value:number) + { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + this._ambient = value; + this.updateAmbient(); + } + + public get ambientColor():number + { + return this._ambientColor; + } + + public set ambientColor(value:number) + { + this._ambientColor = value; + this.updateAmbient(); + } + + private updateAmbient() + { + this._iAmbientR = ((this._ambientColor >> 16) & 0xff)/0xff*this._ambient; + this._iAmbientG = ((this._ambientColor >> 8) & 0xff)/0xff*this._ambient; + this._iAmbientB = (this._ambientColor & 0xff)/0xff*this._ambient; + } + + public iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D + { + throw new AbstractMethodError(); + } + + //@override + public get assetType():string + { + return AssetType.LIGHT; + } + + private updateSpecular() + { + this._iSpecularR = this._colorR*this._specular; + this._iSpecularG = this._colorG*this._specular; + this._iSpecularB = this._colorB*this._specular; + } + + private updateDiffuse() + { + this._iDiffuseR = this._colorR*this._diffuse; + this._iDiffuseG = this._colorG*this._diffuse; + this._iDiffuseB = this._colorB*this._diffuse; + } + + public get shadowMapper():ShadowMapperBase + { + return this._shadowMapper; + } + + public set shadowMapper(value:ShadowMapperBase) + { + this._shadowMapper = value; + this._shadowMapper.light = this; + } +} + +export = LightBase; \ No newline at end of file diff --git a/lib/core/base/LineScaleMode.js b/lib/core/base/LineScaleMode.js new file mode 100755 index 00000000..e66bc657 --- /dev/null +++ b/lib/core/base/LineScaleMode.js @@ -0,0 +1,20 @@ +/** +* The LineScaleMode class provides values for the scaleMode +* parameter in the Graphics.lineStyle() method. +*/ +var LineScaleMode = (function () { + function LineScaleMode() { + } + LineScaleMode.HORIZONTAL = "horizontal"; + + LineScaleMode.NONE = "none"; + + LineScaleMode.NORMAL = "normal"; + + LineScaleMode.VERTICAL = "vertical"; + return LineScaleMode; +})(); + +module.exports = LineScaleMode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9MaW5lU2NhbGVNb2RlLnRzIl0sIm5hbWVzIjpbIkxpbmVTY2FsZU1vZGUiLCJMaW5lU2NhbGVNb2RlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0VBR0c7QUFDSDtJQUFBQTtJQW9DQUMsQ0FBQ0E7QUFBQUQsSUF6QkFBLDJCQUFrQ0EsWUFBWUE7O0lBTTlDQSxxQkFBNEJBLE1BQU1BOztJQU9sQ0EsdUJBQThCQSxRQUFRQTs7SUFXdENBLHlCQUFnQ0EsVUFBVUE7SUFDM0NBLHFCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9MaW5lU2NhbGVNb2RlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgTGluZVNjYWxlTW9kZSBjbGFzcyBwcm92aWRlcyB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5zY2FsZU1vZGU8L2NvZGU+XG4gKiBwYXJhbWV0ZXIgaW4gdGhlIDxjb2RlPkdyYXBoaWNzLmxpbmVTdHlsZSgpPC9jb2RlPiBtZXRob2QuXG4gKi9cbmNsYXNzIExpbmVTY2FsZU1vZGVcbntcblx0LyoqXG5cdCAqIFdpdGggdGhpcyBzZXR0aW5nIHVzZWQgYXMgdGhlIDxjb2RlPnNjYWxlTW9kZTwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZVxuXHQgKiA8Y29kZT5saW5lU3R5bGUoKTwvY29kZT4gbWV0aG9kLCB0aGUgdGhpY2tuZXNzIG9mIHRoZSBsaW5lIHNjYWxlc1xuXHQgKiA8aT5vbmx5PC9pPiB2ZXJ0aWNhbGx5LiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBjaXJjbGVzLCBkcmF3blxuXHQgKiB3aXRoIGEgb25lLXBpeGVsIGxpbmUsIGFuZCBlYWNoIHdpdGggdGhlIDxjb2RlPnNjYWxlTW9kZTwvY29kZT4gcGFyYW1ldGVyXG5cdCAqIHNldCB0byA8Y29kZT5MaW5lU2NhbGVNb2RlLlZFUlRJQ0FMPC9jb2RlPi4gVGhlIGNpcmNsZSBvbiB0aGUgbGVmdCBpc1xuXHQgKiBzY2FsZWQgb25seSB2ZXJ0aWNhbGx5LCBhbmQgdGhlIGNpcmNsZSBvbiB0aGUgcmlnaHQgaXMgc2NhbGVkIGJvdGhcblx0ICogdmVydGljYWxseSBhbmQgaG9yaXpvbnRhbGx5LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBIT1JJWk9OVEFMOnN0cmluZyA9IFwiaG9yaXpvbnRhbFwiO1xuXG5cdC8qKlxuXHQgKiBXaXRoIHRoaXMgc2V0dGluZyB1c2VkIGFzIHRoZSA8Y29kZT5zY2FsZU1vZGU8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGVcblx0ICogPGNvZGU+bGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZCwgdGhlIHRoaWNrbmVzcyBvZiB0aGUgbGluZSBuZXZlciBzY2FsZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5PTkU6c3RyaW5nID0gXCJub25lXCI7XG5cblx0LyoqXG5cdCAqIFdpdGggdGhpcyBzZXR0aW5nIHVzZWQgYXMgdGhlIDxjb2RlPnNjYWxlTW9kZTwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZVxuXHQgKiA8Y29kZT5saW5lU3R5bGUoKTwvY29kZT4gbWV0aG9kLCB0aGUgdGhpY2tuZXNzIG9mIHRoZSBsaW5lIGFsd2F5cyBzY2FsZXNcblx0ICogd2hlbiB0aGUgb2JqZWN0IGlzIHNjYWxlZCh0aGUgZGVmYXVsdCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5PUk1BTDpzdHJpbmcgPSBcIm5vcm1hbFwiO1xuXG5cdC8qKlxuXHQgKiBXaXRoIHRoaXMgc2V0dGluZyB1c2VkIGFzIHRoZSA8Y29kZT5zY2FsZU1vZGU8L2NvZGU+IHBhcmFtZXRlciBvZiB0aGVcblx0ICogPGNvZGU+bGluZVN0eWxlKCk8L2NvZGU+IG1ldGhvZCwgdGhlIHRoaWNrbmVzcyBvZiB0aGUgbGluZSBzY2FsZXNcblx0ICogPGk+b25seTwvaT4gaG9yaXpvbnRhbGx5LiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBjaXJjbGVzLFxuXHQgKiBkcmF3biB3aXRoIGEgb25lLXBpeGVsIGxpbmUsIGFuZCBlYWNoIHdpdGggdGhlIDxjb2RlPnNjYWxlTW9kZTwvY29kZT5cblx0ICogcGFyYW1ldGVyIHNldCB0byA8Y29kZT5MaW5lU2NhbGVNb2RlLkhPUklaT05UQUw8L2NvZGU+LiBUaGUgY2lyY2xlIG9uIHRoZVxuXHQgKiBsZWZ0IGlzIHNjYWxlZCBvbmx5IGhvcml6b250YWxseSwgYW5kIHRoZSBjaXJjbGUgb24gdGhlIHJpZ2h0IGlzIHNjYWxlZFxuXHQgKiBib3RoIHZlcnRpY2FsbHkgYW5kIGhvcml6b250YWxseS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgVkVSVElDQUw6c3RyaW5nID0gXCJ2ZXJ0aWNhbFwiO1xufVxuXG5leHBvcnQgPSBMaW5lU2NhbGVNb2RlOyJdfQ== \ No newline at end of file diff --git a/lib/core/base/LineScaleMode.ts b/lib/core/base/LineScaleMode.ts new file mode 100644 index 00000000..c130ce87 --- /dev/null +++ b/lib/core/base/LineScaleMode.ts @@ -0,0 +1,43 @@ +/** + * The LineScaleMode class provides values for the scaleMode + * parameter in the Graphics.lineStyle() method. + */ +class LineScaleMode +{ + /** + * With this setting used as the scaleMode parameter of the + * lineStyle() method, the thickness of the line scales + * only vertically. For example, consider the following circles, drawn + * with a one-pixel line, and each with the scaleMode parameter + * set to LineScaleMode.VERTICAL. The circle on the left is + * scaled only vertically, and the circle on the right is scaled both + * vertically and horizontally. + */ + public static HORIZONTAL:string = "horizontal"; + + /** + * With this setting used as the scaleMode parameter of the + * lineStyle() method, the thickness of the line never scales. + */ + public static NONE:string = "none"; + + /** + * With this setting used as the scaleMode parameter of the + * lineStyle() method, the thickness of the line always scales + * when the object is scaled(the default). + */ + public static NORMAL:string = "normal"; + + /** + * With this setting used as the scaleMode parameter of the + * lineStyle() method, the thickness of the line scales + * only horizontally. For example, consider the following circles, + * drawn with a one-pixel line, and each with the scaleMode + * parameter set to LineScaleMode.HORIZONTAL. The circle on the + * left is scaled only horizontally, and the circle on the right is scaled + * both vertically and horizontally. + */ + public static VERTICAL:string = "vertical"; +} + +export = LineScaleMode; \ No newline at end of file diff --git a/lib/core/base/LineSubGeometry.js b/lib/core/base/LineSubGeometry.js new file mode 100755 index 00000000..e8a2af40 --- /dev/null +++ b/lib/core/base/LineSubGeometry.js @@ -0,0 +1,431 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var LineSubMesh = require("awayjs-core/lib/core/base/LineSubMesh"); +var SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +var TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +var SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** +* @class LineSubGeometry +*/ +var LineSubGeometry = (function (_super) { + __extends(LineSubGeometry, _super); + /** + * + */ + function LineSubGeometry() { + _super.call(this, true); + this._positionsDirty = true; + this._boundingPositionDirty = true; + this._thicknessDirty = true; + this._colorsDirty = true; + + this._pSubMeshClass = LineSubMesh; + } + LineSubGeometry.prototype._pUpdateStrideOffset = function () { + this._pOffset[LineSubGeometry.VERTEX_DATA] = 0; + + var stride = 0; + this._pOffset[LineSubGeometry.START_POSITION_DATA] = stride; + stride += 3; + + this._pOffset[LineSubGeometry.END_POSITION_DATA] = stride; + stride += 3; + + this._pOffset[LineSubGeometry.THICKNESS_DATA] = stride; + stride += 1; + + this._pOffset[LineSubGeometry.COLOR_DATA] = stride; + stride += 4; + + this._pStride[LineSubGeometry.VERTEX_DATA] = stride; + this._pStride[LineSubGeometry.START_POSITION_DATA] = stride; + this._pStride[LineSubGeometry.END_POSITION_DATA] = stride; + this._pStride[LineSubGeometry.THICKNESS_DATA] = stride; + this._pStride[LineSubGeometry.COLOR_DATA] = stride; + + var len = this._pNumVertices * stride; + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + + this._pStrideOffsetDirty = false; + }; + + Object.defineProperty(LineSubGeometry.prototype, "vertices", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + if (this._thicknessDirty) + this.updateThickness(this._thickness); + + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._pVertices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "startPositions", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + return this._startPositions; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "endPositions", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + return this._endPositions; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "thickness", { + /** + * + */ + get: function () { + if (this._thicknessDirty) + this.updateThickness(this._thickness); + + return this._thickness; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "startColors", { + /** + * + */ + get: function () { + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._startColors; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "endColors", { + /** + * + */ + get: function () { + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._endColors; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubGeometry.prototype, "numSegments", { + /** + * The total amount of segments in the TriangleSubGeometry. + */ + get: function () { + return this._numSegments; + }, + enumerable: true, + configurable: true + }); + + LineSubGeometry.prototype.getBoundingPositions = function () { + if (this._boundingPositionDirty) + this._boundingPositions = this.startPositions.concat(this.endPositions); + + return this._boundingPositions; + }; + + /** + * + */ + LineSubGeometry.prototype.updatePositions = function (startValues, endValues) { + var i; + var j; + var values; + var index; + var stride; + var positions; + var indices; + + this._startPositions = startValues; + + if (this._startPositions == null) + this._startPositions = new Array(); + + this._endPositions = endValues; + + if (this._endPositions == null) + this._endPositions = new Array(); + + this._boundingPositionDirty = true; + + this._numSegments = this._startPositions.length / 3; + + this._pNumVertices = this._numSegments * 4; + + var lenV = this._pNumVertices * this.getStride(LineSubGeometry.VERTEX_DATA); + + if (this._pVertices == null) + this._pVertices = new Array(lenV); + else if (this._pVertices.length != lenV) + this._pVertices.length = lenV; + + i = 0; + j = 0; + index = this.getOffset(LineSubGeometry.START_POSITION_DATA); + stride = this.getStride(LineSubGeometry.START_POSITION_DATA); + positions = this._pVertices; + indices = new Array(); + + while (i < startValues.length) { + values = (index / stride & 1) ? endValues : startValues; + positions[index] = values[i]; + positions[index + 1] = values[i + 1]; + positions[index + 2] = values[i + 2]; + + values = (index / stride & 1) ? startValues : endValues; + positions[index + 3] = values[i]; + positions[index + 4] = values[i + 1]; + positions[index + 5] = values[i + 2]; + + if (++j == 4) { + var o = index / stride - 3; + indices.push(o, o + 1, o + 2, o + 3, o + 2, o + 1); + j = 0; + i += 3; + } + + index += stride; + } + + this.updateIndices(indices); + + this.pInvalidateBounds(); + + this.notifyPositionsUpdate(); + + this._positionsDirty = false; + }; + + /** + * Updates the thickness. + */ + LineSubGeometry.prototype.updateThickness = function (values) { + var i; + var j; + var index; + var offset; + var stride; + var thickness; + + this._thickness = values; + + if (values != null) { + i = 0; + j = 0; + offset = this.getOffset(LineSubGeometry.THICKNESS_DATA); + stride = this.getStride(LineSubGeometry.THICKNESS_DATA); + thickness = this._pVertices; + + index = offset; + while (i < values.length) { + thickness[index] = (Math.floor(0.5 * (index - offset) / stride + 0.5) & 1) ? -values[i] : values[i]; + + if (++j == 4) { + j = 0; + i++; + } + index += stride; + } + } + + this.notifyThicknessUpdate(); + + this._thicknessDirty = false; + }; + + /** + * + */ + LineSubGeometry.prototype.updateColors = function (startValues, endValues) { + var i; + var j; + var values; + var index; + var offset; + var stride; + var colors; + + this._startColors = startValues; + + this._endColors = endValues; + + //default to white + if (this._startColors == null) { + this._startColors = new Array(this._numSegments * 4); + + i = 0; + while (i < this._startColors.length) + this._startColors[i++] = 1; + } + + if (this._endColors == null) { + this._endColors = new Array(this._numSegments * 4); + + i = 0; + while (i < this._endColors.length) + this._endColors[i++] = 1; + } + + i = 0; + j = 0; + offset = this.getOffset(LineSubGeometry.COLOR_DATA); + stride = this.getStride(LineSubGeometry.COLOR_DATA); + colors = this._pVertices; + + index = offset; + + while (i < this._startColors.length) { + values = ((index - offset) / stride & 1) ? this._endColors : this._startColors; + colors[index] = values[i]; + colors[index + 1] = values[i + 1]; + colors[index + 2] = values[i + 2]; + colors[index + 3] = values[i + 3]; + + if (++j == 4) { + j = 0; + i += 4; + } + + index += stride; + } + + this.notifyColorsUpdate(); + + this._colorsDirty = false; + }; + + /** + * + */ + LineSubGeometry.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + this._startPositions = null; + this._endPositions = null; + this._thickness = null; + this._startColors = null; + this._endColors = null; + }; + + /** + * @protected + */ + LineSubGeometry.prototype.pInvalidateBounds = function () { + if (this.parentGeometry) + this.parentGeometry.iInvalidateBounds(this); + }; + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + LineSubGeometry.prototype.clone = function () { + var clone = new LineSubGeometry(); + clone.updateIndices(this._pIndices.concat()); + clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); + clone.updateThickness(this._thickness.concat()); + clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); + + return clone; + }; + + LineSubGeometry.prototype._pNotifyVerticesUpdate = function () { + this._pStrideOffsetDirty = true; + + this.notifyPositionsUpdate(); + this.notifyThicknessUpdate(); + this.notifyColorsUpdate(); + }; + + LineSubGeometry.prototype.notifyPositionsUpdate = function () { + if (this._positionsDirty) + return; + + this._positionsDirty = true; + + if (!this._positionsUpdated) + this._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); + + this.dispatchEvent(this._positionsUpdated); + }; + + LineSubGeometry.prototype.notifyThicknessUpdate = function () { + if (this._thicknessDirty) + return; + + this._thicknessDirty = true; + + if (!this._thicknessUpdated) + this._thicknessUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.THICKNESS_DATA); + + this.dispatchEvent(this._thicknessUpdated); + }; + + LineSubGeometry.prototype.notifyColorsUpdate = function () { + if (this._colorsDirty) + return; + + this._colorsDirty = true; + + if (!this._colorUpdated) + this._colorUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.COLOR_DATA); + + this.dispatchEvent(this._colorUpdated); + }; + LineSubGeometry.VERTEX_DATA = "vertices"; + LineSubGeometry.START_POSITION_DATA = "startPositions"; + LineSubGeometry.END_POSITION_DATA = "endPositions"; + LineSubGeometry.THICKNESS_DATA = "thickness"; + LineSubGeometry.COLOR_DATA = "colors"; + + LineSubGeometry.POSITION_FORMAT = "float3"; + LineSubGeometry.COLOR_FORMAT = "float4"; + LineSubGeometry.THICKNESS_FORMAT = "float1"; + return LineSubGeometry; +})(SubGeometryBase); + +module.exports = LineSubGeometry; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9MaW5lU3ViR2VvbWV0cnkudHMiXSwibmFtZXMiOlsiTGluZVN1Ykdlb21ldHJ5IiwiTGluZVN1Ykdlb21ldHJ5LmNvbnN0cnVjdG9yIiwiTGluZVN1Ykdlb21ldHJ5Ll9wVXBkYXRlU3RyaWRlT2Zmc2V0IiwiTGluZVN1Ykdlb21ldHJ5LmdldEJvdW5kaW5nUG9zaXRpb25zIiwiTGluZVN1Ykdlb21ldHJ5LnVwZGF0ZVBvc2l0aW9ucyIsIkxpbmVTdWJHZW9tZXRyeS51cGRhdGVUaGlja25lc3MiLCJMaW5lU3ViR2VvbWV0cnkudXBkYXRlQ29sb3JzIiwiTGluZVN1Ykdlb21ldHJ5LmRpc3Bvc2UiLCJMaW5lU3ViR2VvbWV0cnkucEludmFsaWRhdGVCb3VuZHMiLCJMaW5lU3ViR2VvbWV0cnkuY2xvbmUiLCJMaW5lU3ViR2VvbWV0cnkuX3BOb3RpZnlWZXJ0aWNlc1VwZGF0ZSIsIkxpbmVTdWJHZW9tZXRyeS5ub3RpZnlQb3NpdGlvbnNVcGRhdGUiLCJMaW5lU3ViR2VvbWV0cnkubm90aWZ5VGhpY2tuZXNzVXBkYXRlIiwiTGluZVN1Ykdlb21ldHJ5Lm5vdGlmeUNvbG9yc1VwZGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0VBRXlFO0FBQ3pFLDBFQUFnRjtBQUNoRixrRkFBdUY7QUFDdkYseUVBQStFOztBQUUvRTs7RUFFRztBQUNIO0lBQThCQSxrQ0FBZUE7SUFtSjVDQTs7TUFER0E7SUFDSEE7UUFFQ0MsV0FBTUEsT0FBQUEsSUFBSUEsQ0FBQ0E7UUF4SVpBLEtBQVFBLGVBQWVBLEdBQVdBLElBQUlBLENBQUNBO1FBQ3ZDQSxLQUFRQSxzQkFBc0JBLEdBQUdBLElBQUlBLENBQUNBO1FBQ3RDQSxLQUFRQSxlQUFlQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUN2Q0EsS0FBUUEsWUFBWUEsR0FBV0EsSUFBSUEsQ0FBQ0E7O1FBdUluQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsV0FBV0E7SUFDbENBLENBQUNBO0lBekhERCxpREFBQUE7UUFFQ0UsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1FBRTlDQSxJQUFJQSxNQUFNQSxHQUFVQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxHQUFHQSxNQUFNQTtRQUMzREEsTUFBTUEsSUFBSUEsQ0FBQ0E7O1FBRVhBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLGVBQWVBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsR0FBR0EsTUFBTUE7UUFDekRBLE1BQU1BLElBQUlBLENBQUNBOztRQUVYQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxlQUFlQSxDQUFDQSxjQUFjQSxDQUFDQSxHQUFHQSxNQUFNQTtRQUN0REEsTUFBTUEsSUFBSUEsQ0FBQ0E7O1FBRVhBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLGVBQWVBLENBQUNBLFVBQVVBLENBQUNBLEdBQUdBLE1BQU1BO1FBQ2xEQSxNQUFNQSxJQUFJQSxDQUFDQTs7UUFFWEEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsTUFBTUE7UUFDbkRBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLGVBQWVBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsR0FBR0EsTUFBTUE7UUFDM0RBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLGVBQWVBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsR0FBR0EsTUFBTUE7UUFDekRBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLGVBQWVBLENBQUNBLGNBQWNBLENBQUNBLEdBQUdBLE1BQU1BO1FBQ3REQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxlQUFlQSxDQUFDQSxVQUFVQSxDQUFDQSxHQUFHQSxNQUFNQTs7UUFFbERBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLGFBQWFBLEdBQUNBLE1BQU1BOztRQUUxQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsSUFBSUEsSUFBSUE7WUFDMUJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLEdBQUdBLENBQUNBO2FBQ3BDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxJQUFJQSxHQUFHQTtZQUNyQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsR0FBR0EsR0FBR0EsQ0FBQ0E7O1FBRTlCQSxJQUFJQSxDQUFDQSxtQkFBbUJBLEdBQUdBLEtBQUtBO0lBQ2pDQSxDQUFDQTs7SUFLREY7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLElBQUlBLENBQUNBLGVBQWVBO2dCQUN2QkEsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0E7O1lBRWhFQSxJQUFJQSxJQUFJQSxDQUFDQSxlQUFlQTtnQkFDdkJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBOztZQUV2Q0EsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUE7Z0JBQ3BCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTs7WUFFdkRBLE9BQU9BLElBQUlBLENBQUNBLFVBQVVBO1FBQ3ZCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsZUFBZUE7Z0JBQ3ZCQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTs7WUFFaEVBLE9BQU9BLElBQUlBLENBQUNBLGVBQWVBO1FBQzVCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsZUFBZUE7Z0JBQ3ZCQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTs7WUFFaEVBLE9BQU9BLElBQUlBLENBQUNBLGFBQWFBO1FBQzFCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsZUFBZUE7Z0JBQ3ZCQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTs7WUFFdkNBLE9BQU9BLElBQUlBLENBQUNBLFVBQVVBO1FBQ3ZCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUE7Z0JBQ3BCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTs7WUFFdkRBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBO1FBQ3pCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUE7Z0JBQ3BCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxFQUFFQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTs7WUFFdkRBLE9BQU9BLElBQUlBLENBQUNBLFVBQVVBO1FBQ3ZCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUE7UUFDekJBLENBQUNBOzs7O0FBQUFBO0lBWURBLGlEQUFBQTtRQUVDRyxJQUFJQSxJQUFJQSxDQUFDQSxzQkFBc0JBO1lBQzlCQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBOztRQUV6RUEsT0FBT0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQTtJQUMvQkEsQ0FBQ0E7O0lBS0RIOztNQURHQTtnREFDSEEsVUFBdUJBLFdBQXlCQSxFQUFFQSxTQUF1QkE7UUFFeEVJLElBQUlBLENBQUNBO1FBQ0xBLElBQUlBLENBQUNBO1FBQ0xBLElBQUlBLE1BQU1BO1FBQ1ZBLElBQUlBLEtBQUtBO1FBQ1RBLElBQUlBLE1BQU1BO1FBQ1ZBLElBQUlBLFNBQVNBO1FBQ2JBLElBQUlBLE9BQU9BOztRQUVYQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxXQUFXQTs7UUFFbENBLElBQUlBLElBQUlBLENBQUNBLGVBQWVBLElBQUlBLElBQUlBO1lBQy9CQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxDQUFDQSxDQUFDQTs7UUFFNUNBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLFNBQVNBOztRQUU5QkEsSUFBSUEsSUFBSUEsQ0FBQ0EsYUFBYUEsSUFBSUEsSUFBSUE7WUFDN0JBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLENBQUNBLENBQUNBOztRQUUxQ0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxHQUFHQSxJQUFJQTs7UUFFbENBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLE1BQU1BLEdBQUNBLENBQUNBOztRQUVqREEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBQ0EsQ0FBQ0E7O1FBRXhDQSxJQUFJQSxJQUFJQSxHQUFVQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxlQUFlQSxDQUFDQSxXQUFXQSxDQUFDQTs7UUFFaEZBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLElBQUlBLElBQUlBO1lBQzFCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxJQUFJQSxDQUFDQTthQUNyQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsSUFBSUEsSUFBSUE7WUFDdENBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBOztRQUUvQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDTEEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDTEEsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQTtRQUMzREEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQTtRQUM1REEsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUE7UUFDM0JBLE9BQU9BLEdBQUdBLElBQUlBLEtBQUtBLENBQUNBLENBQUNBOztRQUVyQkEsT0FBT0EsQ0FBQ0EsR0FBR0EsV0FBV0EsQ0FBQ0EsTUFBTUEsQ0FBRUE7WUFDOUJBLE1BQU1BLEdBQUdBLENBQUNBLEtBQUtBLEdBQUNBLE1BQU1BLEdBQUdBLENBQUNBLENBQUNBLEdBQUVBLFNBQVNBLEdBQUdBLFdBQVdBO1lBQ3BEQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUM1QkEsU0FBU0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDcENBLFNBQVNBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBOztZQUVwQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsS0FBS0EsR0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBRUEsV0FBV0EsR0FBR0EsU0FBU0E7WUFDcERBLFNBQVNBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLENBQUNBLENB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Z0JBQWdCQSxDQUFDQSxnQkFBZ0JBLEVBQUVBLGVBQWVBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBOztRQUUxR0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0E7SUFDdkNBLENBQUNBO0lBeGFEYiw4QkFBbUNBLFVBQVVBO0lBQzdDQSxzQ0FBMkNBLGdCQUFnQkE7SUFDM0RBLG9DQUF5Q0EsY0FBY0E7SUFDdkRBLGlDQUFzQ0EsV0FBV0E7SUFDakRBLDZCQUFrQ0EsUUFBUUE7O0lBRzFDQSxrQ0FBdUNBLFFBQVFBO0lBQy9DQSwrQkFBb0NBLFFBQVFBO0lBQzVDQSxtQ0FBd0NBLFFBQVFBO0lBZ2FqREEsdUJBQUNBO0FBQURBLENBQUNBLEVBM2E2QixlQUFlLEVBMmE1Qzs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvTGluZVN1Ykdlb21ldHJ5LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpc3BsYXlPYmplY3RDb250YWluZXJcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL0Rpc3BsYXlPYmplY3RDb250YWluZXJcIik7XG5pbXBvcnQgR2VvbWV0cnlcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9HZW9tZXRyeVwiKTtcbmltcG9ydCBMaW5lU3ViTWVzaFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaW5lU3ViTWVzaFwiKTtcbmltcG9ydCBTdWJHZW9tZXRyeUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1N1Ykdlb21ldHJ5QmFzZVwiKTtcbmltcG9ydCBUcmlhbmdsZVN1Ykdlb21ldHJ5XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvVHJpYW5nbGVTdWJHZW9tZXRyeVwiKTtcbmltcG9ydCBTdWJHZW9tZXRyeUV2ZW50XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9TdWJHZW9tZXRyeUV2ZW50XCIpO1xuXG4vKipcbiAqIEBjbGFzcyBMaW5lU3ViR2VvbWV0cnlcbiAqL1xuY2xhc3MgTGluZVN1Ykdlb21ldHJ5IGV4dGVuZHMgU3ViR2VvbWV0cnlCYXNlXG57XG5cdHB1YmxpYyBzdGF0aWMgVkVSVEVYX0RBVEE6c3RyaW5nID0gXCJ2ZXJ0aWNlc1wiO1xuXHRwdWJsaWMgc3RhdGljIFNUQVJUX1BPU0lUSU9OX0RBVEE6c3RyaW5nID0gXCJzdGFydFBvc2l0aW9uc1wiO1xuXHRwdWJsaWMgc3RhdGljIEVORF9QT1NJVElPTl9EQVRBOnN0cmluZyA9IFwiZW5kUG9zaXRpb25zXCI7XG5cdHB1YmxpYyBzdGF0aWMgVEhJQ0tORVNTX0RBVEE6c3RyaW5nID0gXCJ0aGlja25lc3NcIjtcblx0cHVibGljIHN0YXRpYyBDT0xPUl9EQVRBOnN0cmluZyA9IFwiY29sb3JzXCI7XG5cblx0Ly9UT0RPIC0gbW92ZSB0aGVzZSB0byBTdGFnZUdMXG5cdHB1YmxpYyBzdGF0aWMgUE9TSVRJT05fRk9STUFUOnN0cmluZyA9IFwiZmxvYXQzXCI7XG5cdHB1YmxpYyBzdGF0aWMgQ09MT1JfRk9STUFUOnN0cmluZyA9IFwiZmxvYXQ0XCI7XG5cdHB1YmxpYyBzdGF0aWMgVEhJQ0tORVNTX0ZPUk1BVDpzdHJpbmcgPSBcImZsb2F0MVwiO1xuXG5cdHByaXZhdGUgX3Bvc2l0aW9uc0RpcnR5OmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9ib3VuZGluZ1Bvc2l0aW9uRGlydHkgPSB0cnVlO1xuXHRwcml2YXRlIF90aGlja25lc3NEaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfY29sb3JzRGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHJpdmF0ZSBfc3RhcnRQb3NpdGlvbnM6QXJyYXk8bnVtYmVyPjtcblx0cHJpdmF0ZSBfZW5kUG9zaXRpb25zOkFycmF5PG51bWJlcj47XG5cdHByaXZhdGUgX2JvdW5kaW5nUG9zaXRpb25zOkFycmF5PG51bWJlcj5cblx0cHJpdmF0ZSBfdGhpY2tuZXNzOkFycmF5PG51bWJlcj47XG5cdHByaXZhdGUgX3N0YXJ0Q29sb3JzOkFycmF5PG51bWJlcj47XG5cdHByaXZhdGUgX2VuZENvbG9yczpBcnJheTxudW1iZXI+O1xuXG5cdHByaXZhdGUgX251bVNlZ21lbnRzOm51bWJlcjtcblxuXHRwcml2YXRlIF9wb3NpdGlvbnNVcGRhdGVkOlN1Ykdlb21ldHJ5RXZlbnQ7XG5cdHByaXZhdGUgX3RoaWNrbmVzc1VwZGF0ZWQ6U3ViR2VvbWV0cnlFdmVudDtcblx0cHJpdmF0ZSBfY29sb3JVcGRhdGVkOlN1Ykdlb21ldHJ5RXZlbnQ7XG5cblx0cHVibGljIF9wVXBkYXRlU3RyaWRlT2Zmc2V0KClcblx0e1xuXHRcdHRoaXMuX3BPZmZzZXRbTGluZVN1Ykdlb21ldHJ5LlZFUlRFWF9EQVRBXSA9IDA7XG5cblx0XHR2YXIgc3RyaWRlOm51bWJlciA9IDA7XG5cdFx0dGhpcy5fcE9mZnNldFtMaW5lU3ViR2VvbWV0cnkuU1RBUlRfUE9TSVRJT05fREFUQV0gPSBzdHJpZGU7XG5cdFx0c3RyaWRlICs9IDM7XG5cblx0XHR0aGlzLl9wT2Zmc2V0W0xpbmVTdWJHZW9tZXRyeS5FTkRfUE9TSVRJT05fREFUQV0gPSBzdHJpZGU7XG5cdFx0c3RyaWRlICs9IDM7XG5cblx0XHR0aGlzLl9wT2Zmc2V0W0xpbmVTdWJHZW9tZXRyeS5USElDS05FU1NfREFUQV0gPSBzdHJpZGU7XG5cdFx0c3RyaWRlICs9IDE7XG5cblx0XHR0aGlzLl9wT2Zmc2V0W0xpbmVTdWJHZW9tZXRyeS5DT0xPUl9EQVRBXSA9IHN0cmlkZTtcblx0XHRzdHJpZGUgKz0gNDtcblxuXHRcdHRoaXMuX3BTdHJpZGVbTGluZVN1Ykdlb21ldHJ5LlZFUlRFWF9EQVRBXSA9IHN0cmlkZTtcblx0XHR0aGlzLl9wU3RyaWRlW0xpbmVTdWJHZW9tZXRyeS5TVEFSVF9QT1NJVElPTl9EQVRBXSA9IHN0cmlkZTtcblx0XHR0aGlzLl9wU3RyaWRlW0xpbmVTdWJHZW9tZXRyeS5FTkRfUE9TSVRJT05fREFUQV0gPSBzdHJpZGU7XG5cdFx0dGhpcy5fcFN0cmlkZVtMaW5lU3ViR2VvbWV0cnkuVEhJQ0tORVNTX0RBVEFdID0gc3RyaWRlO1xuXHRcdHRoaXMuX3BTdHJpZGVbTGluZVN1Ykdlb21ldHJ5LkNPTE9SX0RBVEFdID0gc3RyaWRlO1xuXG5cdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9wTnVtVmVydGljZXMqc3RyaWRlO1xuXG5cdFx0aWYgKHRoaXMuX3BWZXJ0aWNlcyA9PSBudWxsKVxuXHRcdFx0dGhpcy5fcFZlcnRpY2VzID0gbmV3IEFycmF5PG51bWJlcj4obGVuKTtcblx0XHRlbHNlIGlmICh0aGlzLl9wVmVydGljZXMubGVuZ3RoICE9IGxlbilcblx0XHRcdHRoaXMuX3BWZXJ0aWNlcy5sZW5ndGggPSBsZW47XG5cblx0XHR0aGlzLl9wU3RyaWRlT2Zmc2V0RGlydHkgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBcblx0ICovXG5cdHB1YmxpYyBnZXQgdmVydGljZXMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRpZiAodGhpcy5fcG9zaXRpb25zRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZVBvc2l0aW9ucyh0aGlzLl9zdGFydFBvc2l0aW9ucywgdGhpcy5fZW5kUG9zaXRpb25zKTtcblxuXHRcdGlmICh0aGlzLl90aGlja25lc3NEaXJ0eSlcblx0XHRcdHRoaXMudXBkYXRlVGhpY2tuZXNzKHRoaXMuX3RoaWNrbmVzcyk7XG5cblx0XHRpZiAodGhpcy5fY29sb3JzRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZUNvbG9ycyh0aGlzLl9zdGFydENvbG9ycywgdGhpcy5fZW5kQ29sb3JzKTtcblxuXHRcdHJldHVybiB0aGlzLl9wVmVydGljZXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgc3RhcnRQb3NpdGlvbnMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRpZiAodGhpcy5fcG9zaXRpb25zRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZVBvc2l0aW9ucyh0aGlzLl9zdGFydFBvc2l0aW9ucywgdGhpcy5fZW5kUG9zaXRpb25zKTtcblxuXHRcdHJldHVybiB0aGlzLl9zdGFydFBvc2l0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBlbmRQb3NpdGlvbnMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRpZiAodGhpcy5fcG9zaXRpb25zRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZVBvc2l0aW9ucyh0aGlzLl9zdGFydFBvc2l0aW9ucywgdGhpcy5fZW5kUG9zaXRpb25zKTtcblxuXHRcdHJldHVybiB0aGlzLl9lbmRQb3NpdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgdGhpY2tuZXNzKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKHRoaXMuX3RoaWNrbmVzc0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVUaGlja25lc3ModGhpcy5fdGhpY2tuZXNzKTtcblxuXHRcdHJldHVybiB0aGlzLl90aGlja25lc3M7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgc3RhcnRDb2xvcnMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRpZiAodGhpcy5fY29sb3JzRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZUNvbG9ycyh0aGlzLl9zdGFydENvbG9ycywgdGhpcy5fZW5kQ29sb3JzKTtcblxuXHRcdHJldHVybiB0aGlzLl9zdGFydENvbG9ycztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBlbmRDb2xvcnMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRpZiAodGhpcy5fY29sb3JzRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZUNvbG9ycyh0aGlzLl9zdGFydENvbG9ycywgdGhpcy5fZW5kQ29sb3JzKTtcblxuXHRcdHJldHVybiB0aGlzLl9lbmRDb2xvcnM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRvdGFsIGFtb3VudCBvZiBzZWdtZW50cyBpbiB0aGUgVHJpYW5nbGVTdWJHZW9tZXRyeS5cblx0ICovXG5cdHB1YmxpYyBnZXQgbnVtU2VnbWVudHMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9udW1TZWdtZW50cztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0c3VwZXIodHJ1ZSk7XG5cblx0XHR0aGlzLl9wU3ViTWVzaENsYXNzID0gTGluZVN1Yk1lc2g7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Qm91bmRpbmdQb3NpdGlvbnMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRpZiAodGhpcy5fYm91bmRpbmdQb3NpdGlvbkRpcnR5KVxuXHRcdFx0dGhpcy5fYm91bmRpbmdQb3NpdGlvbnMgPSB0aGlzLnN0YXJ0UG9zaXRpb25zLmNvbmNhdCh0aGlzLmVuZFBvc2l0aW9ucyk7XG5cblx0XHRyZXR1cm4gdGhpcy5fYm91bmRpbmdQb3NpdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyB1cGRhdGVQb3NpdGlvbnMoc3RhcnRWYWx1ZXM6QXJyYXk8bnVtYmVyPiwgZW5kVmFsdWVzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGo6bnVtYmVyO1xuXHRcdHZhciB2YWx1ZXM6QXJyYXk8bnVtYmVyPlxuXHRcdHZhciBpbmRleDpudW1iZXI7XG5cdFx0dmFyIHN0cmlkZTpudW1iZXI7XG5cdFx0dmFyIHBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdHZhciBpbmRpY2VzOkFycmF5PG51bWJlcj47XG5cblx0XHR0aGlzLl9zdGFydFBvc2l0aW9ucyA9IHN0YXJ0VmFsdWVzO1xuXG5cdFx0aWYgKHRoaXMuX3N0YXJ0UG9zaXRpb25zID09IG51bGwpXG5cdFx0XHR0aGlzLl9zdGFydFBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cblx0XHR0aGlzLl9lbmRQb3NpdGlvbnMgPSBlbmRWYWx1ZXM7XG5cblx0XHRpZiAodGhpcy5fZW5kUG9zaXRpb25zID09IG51bGwpXG5cdFx0XHR0aGlzLl9lbmRQb3NpdGlvbnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG5cdFx0dGhpcy5fYm91bmRpbmdQb3NpdGlvbkRpcnR5ID0gdHJ1ZTtcblxuXHRcdHRoaXMuX251bVNlZ21lbnRzID0gdGhpcy5fc3RhcnRQb3NpdGlvbnMubGVuZ3RoLzM7XG5cblx0XHR0aGlzLl9wTnVtVmVydGljZXMgPSB0aGlzLl9udW1TZWdtZW50cyo0O1xuXG5cdFx0dmFyIGxlblY6bnVtYmVyID0gdGhpcy5fcE51bVZlcnRpY2VzKnRoaXMuZ2V0U3RyaWRlKExpbmVTdWJHZW9tZXRyeS5WRVJURVhfREFUQSk7XG5cblx0XHRpZiAodGhpcy5fcFZlcnRpY2VzID09IG51bGwpXG5cdFx0XHR0aGlzLl9wVmVydGljZXMgPSBuZXcgQXJyYXk8bnVtYmVyPihsZW5WKTtcblx0XHRlbHNlIGlmICh0aGlzLl9wVmVydGljZXMubGVuZ3RoICE9IGxlblYpXG5cdFx0XHR0aGlzLl9wVmVydGljZXMubGVuZ3RoID0gbGVuVjtcblxuXHRcdGkgPSAwO1xuXHRcdGogPSAwO1xuXHRcdGluZGV4ID0gdGhpcy5nZXRPZmZzZXQoTGluZVN1Ykdlb21ldHJ5LlNUQVJUX1BPU0lUSU9OX0RBVEEpO1xuXHRcdHN0cmlkZSA9IHRoaXMuZ2V0U3RyaWRlKExpbmVTdWJHZW9tZXRyeS5TVEFSVF9QT1NJVElPTl9EQVRBKTtcblx0XHRwb3NpdGlvbnMgPSB0aGlzLl9wVmVydGljZXM7XG5cdFx0aW5kaWNlcyA9IG5ldyBBcnJheSgpO1xuXG5cdFx0d2hpbGUgKGkgPCBzdGFydFZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdHZhbHVlcyA9IChpbmRleC9zdHJpZGUgJiAxKT8gZW5kVmFsdWVzIDogc3RhcnRWYWx1ZXM7XG5cdFx0XHRwb3NpdGlvbnNbaW5kZXhdID0gdmFsdWVzW2ldO1xuXHRcdFx0cG9zaXRpb25zW2luZGV4ICsgMV0gPSB2YWx1ZXNbaSArIDFdO1xuXHRcdFx0cG9zaXRpb25zW2luZGV4ICsgMl0gPSB2YWx1ZXNbaSArIDJdO1xuXG5cdFx0XHR2YWx1ZXMgPSAoaW5kZXgvc3RyaWRlICYgMSk/IHN0YXJ0VmFsdWVzIDogZW5kVmFsdWVzO1xuXHRcdFx0cG9zaXRpb25zW2luZGV4ICsgM10gPSB2YWx1ZXNbaV07XG5cdFx0XHRwb3NpdGlvbnNbaW5kZXggKyA0XSA9IHZhbHVlc1tpICsgMV07XG5cdFx0XHRwb3NpdGlvbnNbaW5kZXggKyA1XSA9IHZhbHVlc1tpICsgMl07XG5cblx0XHRcdGlmICgrK2ogPT0gNCkge1xuXHRcdFx0XHR2YXIgbzpudW1iZXIgPSBpbmRleC9zdHJpZGUgLSAzO1xuXHRcdFx0XHRpbmRpY2VzLnB1c2gobywgbyArIDEsIG8gKyAyLCBvICsgMywgbyArIDIsIG8gKyAxKTtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdGkgKz0gMztcblx0XHRcdH1cblxuXHRcdFx0aW5kZXggKz0gc3RyaWRlO1xuXHRcdH1cblxuXHRcdHRoaXMudXBkYXRlSW5kaWNlcyhpbmRpY2VzKTtcblxuXHRcdHRoaXMucEludmFsaWRhdGVCb3VuZHMoKTtcblxuXHRcdHRoaXMubm90aWZ5UG9zaXRpb25zVXBkYXRlKCk7XG5cblx0XHR0aGlzLl9wb3NpdGlvbnNEaXJ0eSA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIHRoaWNrbmVzcy5cblx0ICovXG5cdHB1YmxpYyB1cGRhdGVUaGlja25lc3ModmFsdWVzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGo6bnVtYmVyO1xuXHRcdHZhciBpbmRleDpudW1iZXI7XG5cdFx0dmFyIG9mZnNldDpudW1iZXI7XG5cdFx0dmFyIHN0cmlkZTpudW1iZXI7XG5cdFx0dmFyIHRoaWNrbmVzczpBcnJheTxudW1iZXI+O1xuXG5cdFx0dGhpcy5fdGhpY2tuZXNzID0gdmFsdWVzO1xuXG5cdFx0aWYgKHZhbHVlcyAhPSBudWxsKSB7XG5cdFx0XHRpID0gMDtcblx0XHRcdGogPSAwO1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5nZXRPZmZzZXQoTGluZVN1Ykdlb21ldHJ5LlRISUNLTkVTU19EQVRBKTtcblx0XHRcdHN0cmlkZSA9IHRoaXMuZ2V0U3RyaWRlKExpbmVTdWJHZW9tZXRyeS5USElDS05FU1NfREFUQSk7XG5cdFx0XHR0aGlja25lc3MgPSB0aGlzLl9wVmVydGljZXM7XG5cblx0XHRcdGluZGV4ID0gb2Zmc2V0XG5cdFx0XHR3aGlsZSAoaSA8IHZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0dGhpY2tuZXNzW2luZGV4XSA9IChNYXRoLmZsb29yKDAuNSooaW5kZXggLSBvZmZzZXQpL3N0cmlkZSArIDAuNSkgJiAxKT8gLXZhbHVlc1tpXSA6IHZhbHVlc1tpXTtcblxuXHRcdFx0XHRpZiAoKytqID09IDQpIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHRpKys7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXggKz0gc3RyaWRlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMubm90aWZ5VGhpY2tuZXNzVXBkYXRlKCk7XG5cblx0XHR0aGlzLl90aGlja25lc3NEaXJ0eSA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlQ29sb3JzKHN0YXJ0VmFsdWVzOkFycmF5PG51bWJlcj4sIGVuZFZhbHVlczpBcnJheTxudW1iZXI+KVxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyO1xuXHRcdHZhciBqOm51bWJlcjtcblx0XHR2YXIgdmFsdWVzOkFycmF5PG51bWJlcj5cblx0XHR2YXIgaW5kZXg6bnVtYmVyO1xuXHRcdHZhciBvZmZzZXQ6bnVtYmVyO1xuXHRcdHZhciBzdHJpZGU6bnVtYmVyO1xuXHRcdHZhciBjb2xvcnM6QXJyYXk8bnVtYmVyPjtcblxuXHRcdHRoaXMuX3N0YXJ0Q29sb3JzID0gc3RhcnRWYWx1ZXM7XG5cblx0XHR0aGlzLl9lbmRDb2xvcnMgPSBlbmRWYWx1ZXM7XG5cblx0XHQvL2RlZmF1bHQgdG8gd2hpdGVcblx0XHRpZiAodGhpcy5fc3RhcnRDb2xvcnMgPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5fc3RhcnRDb2xvcnMgPSBuZXcgQXJyYXkodGhpcy5fbnVtU2VnbWVudHMqNCk7XG5cblx0XHRcdGkgPSAwO1xuXHRcdFx0d2hpbGUgKGkgPCB0aGlzLl9zdGFydENvbG9ycy5sZW5ndGgpXG5cdFx0XHRcdHRoaXMuX3N0YXJ0Q29sb3JzW2krK10gPSAxO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9lbmRDb2xvcnMgPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5fZW5kQ29sb3JzID0gbmV3IEFycmF5KHRoaXMuX251bVNlZ21lbnRzKjQpO1xuXG5cdFx0XHRpID0gMDtcblx0XHRcdHdoaWxlIChpIDwgdGhpcy5fZW5kQ29sb3JzLmxlbmd0aClcblx0XHRcdFx0dGhpcy5fZW5kQ29sb3JzW2krK10gPSAxO1xuXHRcdH1cblxuXHRcdGkgPSAwO1xuXHRcdGogPSAwO1xuXHRcdG9mZnNldCA9IHRoaXMuZ2V0T2Zmc2V0KExpbmVTdWJHZW9tZXRyeS5DT0xPUl9EQVRBKTtcblx0XHRzdHJpZGUgPSB0aGlzLmdldFN0cmlkZShMaW5lU3ViR2VvbWV0cnkuQ09MT1JfREFUQSk7XG5cdFx0Y29sb3JzID0gdGhpcy5fcFZlcnRpY2VzO1xuXG5cdFx0aW5kZXggPSBvZmZzZXQ7XG5cblx0XHR3aGlsZSAoaSA8IHRoaXMuX3N0YXJ0Q29sb3JzLmxlbmd0aCkge1xuXHRcdFx0dmFsdWVzID0gKChpbmRleCAtIG9mZnNldCkvc3RyaWRlICYgMSk/IHRoaXMuX2VuZENvbG9ycyA6IHRoaXMuX3N0YXJ0Q29sb3JzO1xuXHRcdFx0Y29sb3JzW2luZGV4XSA9IHZhbHVlc1tpXTtcblx0XHRcdGNvbG9yc1tpbmRleCArIDFdID0gdmFsdWVzW2kgKyAxXTtcblx0XHRcdGNvbG9yc1tpbmRleCArIDJdID0gdmFsdWVzW2kgKyAyXTtcblx0XHRcdGNvbG9yc1tpbmRleCArIDNdID0gdmFsdWVzW2kgKyAzXTtcblxuXHRcdFx0aWYgKCsraiA9PSA0KSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRpICs9IDQ7XG5cdFx0XHR9XG5cblx0XHRcdGluZGV4ICs9IHN0cmlkZTtcblx0XHR9XG5cblx0XHR0aGlzLm5vdGlmeUNvbG9yc1VwZGF0ZSgpO1xuXG5cdFx0dGhpcy5fY29sb3JzRGlydHkgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGRpc3Bvc2UoKVxuXHR7XG5cdFx0c3VwZXIuZGlzcG9zZSgpO1xuXG5cdFx0dGhpcy5fc3RhcnRQb3NpdGlvbnMgPSBudWxsO1xuXHRcdHRoaXMuX2VuZFBvc2l0aW9ucyA9IG51bGw7XG5cdFx0dGhpcy5fdGhpY2tuZXNzID0gbnVsbDtcblx0XHR0aGlzLl9zdGFydENvbG9ycyA9IG51bGw7XG5cdFx0dGhpcy5fZW5kQ29sb3JzID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgcEludmFsaWRhdGVCb3VuZHMoKVxuXHR7XG5cdFx0aWYgKHRoaXMucGFyZW50R2VvbWV0cnkpXG5cdFx0XHR0aGlzLnBhcmVudEdlb21ldHJ5LmlJbnZhbGlkYXRlQm91bmRzKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBHZW9tZXRyeSBvYmplY3QgdGhhdCAnb3ducycgdGhpcyBUcmlhbmdsZVN1Ykdlb21ldHJ5IG9iamVjdC5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHB1YmxpYyBwYXJlbnRHZW9tZXRyeTpHZW9tZXRyeTtcblxuXHQvKipcblx0ICogQ2xvbmVzIHRoZSBjdXJyZW50IG9iamVjdFxuXHQgKiBAcmV0dXJuIEFuIGV4YWN0IGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY2xvbmUoKTpMaW5lU3ViR2VvbWV0cnlcblx0e1xuXHRcdHZhciBjbG9uZTpMaW5lU3ViR2VvbWV0cnkgPSBuZXcgTGluZVN1Ykdlb21ldHJ5KCk7XG5cdFx0Y2xvbmUudXBkYXRlSW5kaWNlcyh0aGlzLl9wSW5kaWNlcy5jb25jYXQoKSk7XG5cdFx0Y2xvbmUudXBkYXRlUG9zaXRpb25zKHRoaXMuX3N0YXJ0UG9zaXRpb25zLmNvbmNhdCgpLCB0aGlzLl9lbmRQb3NpdGlvbnMuY29uY2F0KCkpO1xuXHRcdGNsb25lLnVwZGF0ZVRoaWNrbmVzcyh0aGlzLl90aGlja25lc3MuY29uY2F0KCkpO1xuXHRcdGNsb25lLnVwZGF0ZVBvc2l0aW9ucyh0aGlzLl9zdGFydFBvc2l0aW9ucy5jb25jYXQoKSwgdGhpcy5fZW5kUG9zaXRpb25zLmNvbmNhdCgpKTtcblxuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdHB1YmxpYyBfcE5vdGlmeVZlcnRpY2VzVXBkYXRlKClcblx0e1xuXHRcdHRoaXMuX3BTdHJpZGVPZmZzZXREaXJ0eSA9IHRydWU7XG5cblx0XHR0aGlzLm5vdGlmeVBvc2l0aW9uc1VwZGF0ZSgpO1xuXHRcdHRoaXMubm90aWZ5VGhpY2tuZXNzVXBkYXRlKCk7XG5cdFx0dGhpcy5ub3RpZnlDb2xvcnNVcGRhdGUoKTtcblx0fVxuXG5cdHByaXZhdGUgbm90aWZ5UG9zaXRpb25zVXBkYXRlKClcblx0e1xuXHRcdGlmICh0aGlzLl9wb3NpdGlvbnNEaXJ0eSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3Bvc2l0aW9uc0RpcnR5ID0gdHJ1ZTtcblxuXHRcdGlmICghdGhpcy5fcG9zaXRpb25zVXBkYXRlZClcblx0XHRcdHRoaXMuX3Bvc2l0aW9uc1VwZGF0ZWQgPSBuZXcgU3ViR2VvbWV0cnlFdmVudChTdWJHZW9tZXRyeUV2ZW50LlZFUlRJQ0VTX1VQREFURUQsIFRyaWFuZ2xlU3ViR2VvbWV0cnkuUE9TSVRJT05fREFUQSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQodGhpcy5fcG9zaXRpb25zVXBkYXRlZCk7XG5cdH1cblxuXHRwcml2YXRlIG5vdGlmeVRoaWNrbmVzc1VwZGF0ZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fdGhpY2tuZXNzRGlydHkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl90aGlja25lc3NEaXJ0eSA9IHRydWU7XG5cblx0XHRpZiAoIXRoaXMuX3RoaWNrbmVzc1VwZGF0ZWQpXG5cdFx0XHR0aGlzLl90aGlja25lc3NVcGRhdGVkID0gbmV3IFN1Ykdlb21ldHJ5RXZlbnQoU3ViR2VvbWV0cnlFdmVudC5WRVJUSUNFU19VUERBVEVELCBMaW5lU3ViR2VvbWV0cnkuVEhJQ0tORVNTX0RBVEEpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX3RoaWNrbmVzc1VwZGF0ZWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBub3RpZnlDb2xvcnNVcGRhdGUoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2NvbG9yc0RpcnR5KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fY29sb3JzRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKCF0aGlzLl9jb2xvclVwZGF0ZWQpXG5cdFx0XHR0aGlzLl9jb2xvclVwZGF0ZWQgPSBuZXcgU3ViR2VvbWV0cnlFdmVudChTdWJHZW9tZXRyeUV2ZW50LlZFUlRJQ0VTX1VQREFURUQsIExpbmVTdWJHZW9tZXRyeS5DT0xPUl9EQVRBKTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9jb2xvclVwZGF0ZWQpO1xuXHR9XG59XG5cbmV4cG9ydCA9IExpbmVTdWJHZW9tZXRyeTsiXX0= \ No newline at end of file diff --git a/lib/core/base/LineSubGeometry.ts b/lib/core/base/LineSubGeometry.ts new file mode 100644 index 00000000..2f3f6474 --- /dev/null +++ b/lib/core/base/LineSubGeometry.ts @@ -0,0 +1,440 @@ +import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +import Geometry = require("awayjs-core/lib/core/base/Geometry"); +import LineSubMesh = require("awayjs-core/lib/core/base/LineSubMesh"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** + * @class LineSubGeometry + */ +class LineSubGeometry extends SubGeometryBase +{ + public static VERTEX_DATA:string = "vertices"; + public static START_POSITION_DATA:string = "startPositions"; + public static END_POSITION_DATA:string = "endPositions"; + public static THICKNESS_DATA:string = "thickness"; + public static COLOR_DATA:string = "colors"; + + //TODO - move these to StageGL + public static POSITION_FORMAT:string = "float3"; + public static COLOR_FORMAT:string = "float4"; + public static THICKNESS_FORMAT:string = "float1"; + + private _positionsDirty:boolean = true; + private _boundingPositionDirty = true; + private _thicknessDirty:boolean = true; + private _colorsDirty:boolean = true; + + private _startPositions:Array; + private _endPositions:Array; + private _boundingPositions:Array + private _thickness:Array; + private _startColors:Array; + private _endColors:Array; + + private _numSegments:number; + + private _positionsUpdated:SubGeometryEvent; + private _thicknessUpdated:SubGeometryEvent; + private _colorUpdated:SubGeometryEvent; + + public _pUpdateStrideOffset() + { + this._pOffset[LineSubGeometry.VERTEX_DATA] = 0; + + var stride:number = 0; + this._pOffset[LineSubGeometry.START_POSITION_DATA] = stride; + stride += 3; + + this._pOffset[LineSubGeometry.END_POSITION_DATA] = stride; + stride += 3; + + this._pOffset[LineSubGeometry.THICKNESS_DATA] = stride; + stride += 1; + + this._pOffset[LineSubGeometry.COLOR_DATA] = stride; + stride += 4; + + this._pStride[LineSubGeometry.VERTEX_DATA] = stride; + this._pStride[LineSubGeometry.START_POSITION_DATA] = stride; + this._pStride[LineSubGeometry.END_POSITION_DATA] = stride; + this._pStride[LineSubGeometry.THICKNESS_DATA] = stride; + this._pStride[LineSubGeometry.COLOR_DATA] = stride; + + var len:number = this._pNumVertices*stride; + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + + this._pStrideOffsetDirty = false; + } + + /** + * + */ + public get vertices():Array + { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + if (this._thicknessDirty) + this.updateThickness(this._thickness); + + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._pVertices; + } + + /** + * + */ + public get startPositions():Array + { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + return this._startPositions; + } + + /** + * + */ + public get endPositions():Array + { + if (this._positionsDirty) + this.updatePositions(this._startPositions, this._endPositions); + + return this._endPositions; + } + + /** + * + */ + public get thickness():Array + { + if (this._thicknessDirty) + this.updateThickness(this._thickness); + + return this._thickness; + } + + /** + * + */ + public get startColors():Array + { + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._startColors; + } + + /** + * + */ + public get endColors():Array + { + if (this._colorsDirty) + this.updateColors(this._startColors, this._endColors); + + return this._endColors; + } + + /** + * The total amount of segments in the TriangleSubGeometry. + */ + public get numSegments():number + { + return this._numSegments; + } + + /** + * + */ + constructor() + { + super(true); + + this._pSubMeshClass = LineSubMesh; + } + + public getBoundingPositions():Array + { + if (this._boundingPositionDirty) + this._boundingPositions = this.startPositions.concat(this.endPositions); + + return this._boundingPositions; + } + + /** + * + */ + public updatePositions(startValues:Array, endValues:Array) + { + var i:number; + var j:number; + var values:Array + var index:number; + var stride:number; + var positions:Array; + var indices:Array; + + this._startPositions = startValues; + + if (this._startPositions == null) + this._startPositions = new Array(); + + this._endPositions = endValues; + + if (this._endPositions == null) + this._endPositions = new Array(); + + this._boundingPositionDirty = true; + + this._numSegments = this._startPositions.length/3; + + this._pNumVertices = this._numSegments*4; + + var lenV:number = this._pNumVertices*this.getStride(LineSubGeometry.VERTEX_DATA); + + if (this._pVertices == null) + this._pVertices = new Array(lenV); + else if (this._pVertices.length != lenV) + this._pVertices.length = lenV; + + i = 0; + j = 0; + index = this.getOffset(LineSubGeometry.START_POSITION_DATA); + stride = this.getStride(LineSubGeometry.START_POSITION_DATA); + positions = this._pVertices; + indices = new Array(); + + while (i < startValues.length) { + values = (index/stride & 1)? endValues : startValues; + positions[index] = values[i]; + positions[index + 1] = values[i + 1]; + positions[index + 2] = values[i + 2]; + + values = (index/stride & 1)? startValues : endValues; + positions[index + 3] = values[i]; + positions[index + 4] = values[i + 1]; + positions[index + 5] = values[i + 2]; + + if (++j == 4) { + var o:number = index/stride - 3; + indices.push(o, o + 1, o + 2, o + 3, o + 2, o + 1); + j = 0; + i += 3; + } + + index += stride; + } + + this.updateIndices(indices); + + this.pInvalidateBounds(); + + this.notifyPositionsUpdate(); + + this._positionsDirty = false; + } + + /** + * Updates the thickness. + */ + public updateThickness(values:Array) + { + var i:number; + var j:number; + var index:number; + var offset:number; + var stride:number; + var thickness:Array; + + this._thickness = values; + + if (values != null) { + i = 0; + j = 0; + offset = this.getOffset(LineSubGeometry.THICKNESS_DATA); + stride = this.getStride(LineSubGeometry.THICKNESS_DATA); + thickness = this._pVertices; + + index = offset + while (i < values.length) { + thickness[index] = (Math.floor(0.5*(index - offset)/stride + 0.5) & 1)? -values[i] : values[i]; + + if (++j == 4) { + j = 0; + i++; + } + index += stride; + } + } + + this.notifyThicknessUpdate(); + + this._thicknessDirty = false; + } + + /** + * + */ + public updateColors(startValues:Array, endValues:Array) + { + var i:number; + var j:number; + var values:Array + var index:number; + var offset:number; + var stride:number; + var colors:Array; + + this._startColors = startValues; + + this._endColors = endValues; + + //default to white + if (this._startColors == null) { + this._startColors = new Array(this._numSegments*4); + + i = 0; + while (i < this._startColors.length) + this._startColors[i++] = 1; + } + + if (this._endColors == null) { + this._endColors = new Array(this._numSegments*4); + + i = 0; + while (i < this._endColors.length) + this._endColors[i++] = 1; + } + + i = 0; + j = 0; + offset = this.getOffset(LineSubGeometry.COLOR_DATA); + stride = this.getStride(LineSubGeometry.COLOR_DATA); + colors = this._pVertices; + + index = offset; + + while (i < this._startColors.length) { + values = ((index - offset)/stride & 1)? this._endColors : this._startColors; + colors[index] = values[i]; + colors[index + 1] = values[i + 1]; + colors[index + 2] = values[i + 2]; + colors[index + 3] = values[i + 3]; + + if (++j == 4) { + j = 0; + i += 4; + } + + index += stride; + } + + this.notifyColorsUpdate(); + + this._colorsDirty = false; + } + + /** + * + */ + public dispose() + { + super.dispose(); + + this._startPositions = null; + this._endPositions = null; + this._thickness = null; + this._startColors = null; + this._endColors = null; + } + + /** + * @protected + */ + public pInvalidateBounds() + { + if (this.parentGeometry) + this.parentGeometry.iInvalidateBounds(this); + } + + /** + * The Geometry object that 'owns' this TriangleSubGeometry object. + * + * @private + */ + public parentGeometry:Geometry; + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + public clone():LineSubGeometry + { + var clone:LineSubGeometry = new LineSubGeometry(); + clone.updateIndices(this._pIndices.concat()); + clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); + clone.updateThickness(this._thickness.concat()); + clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); + + return clone; + } + + public _pNotifyVerticesUpdate() + { + this._pStrideOffsetDirty = true; + + this.notifyPositionsUpdate(); + this.notifyThicknessUpdate(); + this.notifyColorsUpdate(); + } + + private notifyPositionsUpdate() + { + if (this._positionsDirty) + return; + + this._positionsDirty = true; + + if (!this._positionsUpdated) + this._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); + + this.dispatchEvent(this._positionsUpdated); + } + + private notifyThicknessUpdate() + { + if (this._thicknessDirty) + return; + + this._thicknessDirty = true; + + if (!this._thicknessUpdated) + this._thicknessUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.THICKNESS_DATA); + + this.dispatchEvent(this._thicknessUpdated); + } + + private notifyColorsUpdate() + { + if (this._colorsDirty) + return; + + this._colorsDirty = true; + + if (!this._colorUpdated) + this._colorUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.COLOR_DATA); + + this.dispatchEvent(this._colorUpdated); + } +} + +export = LineSubGeometry; \ No newline at end of file diff --git a/lib/core/base/LineSubMesh.js b/lib/core/base/LineSubMesh.js new file mode 100755 index 00000000..901e9523 --- /dev/null +++ b/lib/core/base/LineSubMesh.js @@ -0,0 +1,74 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var SubMeshBase = require("awayjs-core/lib/core/base/SubMeshBase"); +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +/** +* LineSubMesh wraps a LineSubGeometry as a scene graph instantiation. A LineSubMesh is owned by a Mesh object. +* +* +* @see away.base.LineSubGeometry +* @see away.entities.Mesh +* +* @class away.base.LineSubMesh +*/ +var LineSubMesh = (function (_super) { + __extends(LineSubMesh, _super); + /** + * Creates a new LineSubMesh object + * @param subGeometry The LineSubGeometry object which provides the geometry data for this LineSubMesh. + * @param parentMesh The Mesh object to which this LineSubMesh belongs. + * @param material An optional material used to render this LineSubMesh. + */ + function LineSubMesh(subGeometry, parentMesh, material) { + if (typeof material === "undefined") { material = null; } + _super.call(this); + + this._pParentMesh = parentMesh; + this._subGeometry = subGeometry; + this.material = material; + } + Object.defineProperty(LineSubMesh.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.LINE_SUB_MESH; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSubMesh.prototype, "subGeometry", { + /** + * The LineSubGeometry object which provides the geometry data for this LineSubMesh. + */ + get: function () { + return this._subGeometry; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + LineSubMesh.prototype.dispose = function () { + this.material = null; + + _super.prototype.dispose.call(this); + }; + + LineSubMesh.prototype._iCollectRenderable = function (renderer) { + renderer.applyLineSubMesh(this); + }; + return LineSubMesh; +})(SubMeshBase); + +module.exports = LineSubMesh; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9MaW5lU3ViTWVzaC50cyJdLCJuYW1lcyI6WyJMaW5lU3ViTWVzaCIsIkxpbmVTdWJNZXNoLmNvbnN0cnVjdG9yIiwiTGluZVN1Yk1lc2guZGlzcG9zZSIsIkxpbmVTdWJNZXNoLl9pQ29sbGVjdFJlbmRlcmFibGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtFQUV5RTtBQUN6RSxpRUFBd0U7O0FBS3hFOzs7Ozs7OztFQVFHO0FBQ0g7SUFBMEJBLDhCQUFXQTtJQTBCcENBOzs7OztNQURHQTtJQUNIQSxxQkFBWUEsV0FBMkJBLEVBQUVBLFVBQWVBLEVBQUVBLFFBQTRCQTtRQUE1QkMsdUNBQUFBLFFBQVFBLEdBQWdCQSxJQUFJQTtBQUFBQSxRQUVyRkEsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLFVBQVVBO1FBQzlCQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxXQUFXQTtRQUMvQkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsUUFBUUE7SUFDekJBLENBQUNBO0lBMUJERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsU0FBU0EsQ0FBQ0EsYUFBYUE7UUFDL0JBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFvQkRBOztNQURHQTtvQ0FDSEE7UUFFQ0UsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUE7O1FBRXBCQSxnQkFBS0EsQ0FBQ0EsT0FBT0EsS0FBQ0EsS0FBQUEsQ0FBQ0E7SUFDaEJBLENBQUNBOztJQUVERiw0Q0FBQUEsVUFBMkJBLFFBQWtCQTtRQUU1Q0csUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7SUFDRkgsbUJBQUNBO0FBQURBLENBQUNBLEVBakR5QixXQUFXLEVBaURwQzs7QUFFRCw0QkFBcUIsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvTGluZVN1Yk1lc2guanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSVN1Yk1lc2hcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JU3ViTWVzaFwiKTtcbmltcG9ydCBMaW5lU3ViR2VvbWV0cnlcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0xpbmVTdWJHZW9tZXRyeVwiKTtcbmltcG9ydCBTdWJNZXNoQmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9TdWJNZXNoQmFzZVwiKTtcbmltcG9ydCBBc3NldFR5cGVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRUeXBlXCIpO1xuaW1wb3J0IElSZW5kZXJlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcmVuZGVyL0lSZW5kZXJlclwiKTtcbmltcG9ydCBNZXNoXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL01lc2hcIik7XG5pbXBvcnQgTWF0ZXJpYWxCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvbWF0ZXJpYWxzL01hdGVyaWFsQmFzZVwiKTtcblxuLyoqXG4gKiBMaW5lU3ViTWVzaCB3cmFwcyBhIExpbmVTdWJHZW9tZXRyeSBhcyBhIHNjZW5lIGdyYXBoIGluc3RhbnRpYXRpb24uIEEgTGluZVN1Yk1lc2ggaXMgb3duZWQgYnkgYSBNZXNoIG9iamVjdC5cbiAqXG4gKlxuICogQHNlZSBhd2F5LmJhc2UuTGluZVN1Ykdlb21ldHJ5XG4gKiBAc2VlIGF3YXkuZW50aXRpZXMuTWVzaFxuICpcbiAqIEBjbGFzcyBhd2F5LmJhc2UuTGluZVN1Yk1lc2hcbiAqL1xuY2xhc3MgTGluZVN1Yk1lc2ggZXh0ZW5kcyBTdWJNZXNoQmFzZSBpbXBsZW1lbnRzIElTdWJNZXNoXG57XG5cdHByaXZhdGUgX3N1Ykdlb21ldHJ5OkxpbmVTdWJHZW9tZXRyeTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgYXNzZXRUeXBlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRUeXBlLkxJTkVfU1VCX01FU0g7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIExpbmVTdWJHZW9tZXRyeSBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIGdlb21ldHJ5IGRhdGEgZm9yIHRoaXMgTGluZVN1Yk1lc2guXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHN1Ykdlb21ldHJ5KCk6TGluZVN1Ykdlb21ldHJ5XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc3ViR2VvbWV0cnk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBMaW5lU3ViTWVzaCBvYmplY3Rcblx0ICogQHBhcmFtIHN1Ykdlb21ldHJ5IFRoZSBMaW5lU3ViR2VvbWV0cnkgb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBnZW9tZXRyeSBkYXRhIGZvciB0aGlzIExpbmVTdWJNZXNoLlxuXHQgKiBAcGFyYW0gcGFyZW50TWVzaCBUaGUgTWVzaCBvYmplY3QgdG8gd2hpY2ggdGhpcyBMaW5lU3ViTWVzaCBiZWxvbmdzLlxuXHQgKiBAcGFyYW0gbWF0ZXJpYWwgQW4gb3B0aW9uYWwgbWF0ZXJpYWwgdXNlZCB0byByZW5kZXIgdGhpcyBMaW5lU3ViTWVzaC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHN1Ykdlb21ldHJ5OkxpbmVTdWJHZW9tZXRyeSwgcGFyZW50TWVzaDpNZXNoLCBtYXRlcmlhbDpNYXRlcmlhbEJhc2UgPSBudWxsKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX3BQYXJlbnRNZXNoID0gcGFyZW50TWVzaDtcblx0XHR0aGlzLl9zdWJHZW9tZXRyeSA9IHN1Ykdlb21ldHJ5O1xuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGRpc3Bvc2UoKVxuXHR7XG5cdFx0dGhpcy5tYXRlcmlhbCA9IG51bGw7XG5cblx0XHRzdXBlci5kaXNwb3NlKCk7XG5cdH1cblxuXHRwdWJsaWMgX2lDb2xsZWN0UmVuZGVyYWJsZShyZW5kZXJlcjpJUmVuZGVyZXIpXG5cdHtcblx0XHRyZW5kZXJlci5hcHBseUxpbmVTdWJNZXNoKHRoaXMpO1xuXHR9XG59XG5cbmV4cG9ydCA9IExpbmVTdWJNZXNoOyJdfQ== \ No newline at end of file diff --git a/lib/core/base/LineSubMesh.ts b/lib/core/base/LineSubMesh.ts new file mode 100644 index 00000000..a9eb5f8b --- /dev/null +++ b/lib/core/base/LineSubMesh.ts @@ -0,0 +1,69 @@ +import ISubMesh = require("awayjs-core/lib/core/base/ISubMesh"); +import LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +import SubMeshBase = require("awayjs-core/lib/core/base/SubMeshBase"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Mesh = require("awayjs-core/lib/entities/Mesh"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * LineSubMesh wraps a LineSubGeometry as a scene graph instantiation. A LineSubMesh is owned by a Mesh object. + * + * + * @see away.base.LineSubGeometry + * @see away.entities.Mesh + * + * @class away.base.LineSubMesh + */ +class LineSubMesh extends SubMeshBase implements ISubMesh +{ + private _subGeometry:LineSubGeometry; + + /** + * + */ + public get assetType():string + { + return AssetType.LINE_SUB_MESH; + } + + /** + * The LineSubGeometry object which provides the geometry data for this LineSubMesh. + */ + public get subGeometry():LineSubGeometry + { + return this._subGeometry; + } + + /** + * Creates a new LineSubMesh object + * @param subGeometry The LineSubGeometry object which provides the geometry data for this LineSubMesh. + * @param parentMesh The Mesh object to which this LineSubMesh belongs. + * @param material An optional material used to render this LineSubMesh. + */ + constructor(subGeometry:LineSubGeometry, parentMesh:Mesh, material:MaterialBase = null) + { + super(); + + this._pParentMesh = parentMesh; + this._subGeometry = subGeometry; + this.material = material; + } + + /** + * + */ + public dispose() + { + this.material = null; + + super.dispose(); + } + + public _iCollectRenderable(renderer:IRenderer) + { + renderer.applyLineSubMesh(this); + } +} + +export = LineSubMesh; \ No newline at end of file diff --git a/lib/core/base/LoaderInfo.js b/lib/core/base/LoaderInfo.js new file mode 100755 index 00000000..c1b658de --- /dev/null +++ b/lib/core/base/LoaderInfo.js @@ -0,0 +1,259 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +/** +* The LoaderInfo class provides information about a loaded SWF file or a +* loaded image file(JPEG, GIF, or PNG). LoaderInfo objects are available for +* any display object. The information provided includes load progress, the +* URLs of the loader and loaded content, the number of bytes total for the +* media, and the nominal height and width of the media. +* +*

You can access LoaderInfo objects in two ways:

+* +*
    +*
  • The contentLoaderInfo property of a flash.display.Loader +* object - The contentLoaderInfo property is always available +* for any Loader object. For a Loader object that has not called the +* load() or loadBytes() method, or that has not +* sufficiently loaded, attempting to access many of the properties of the +* contentLoaderInfo property throws an error.
  • +*
  • The loaderInfo property of a display object.
  • +*
+* +*

The contentLoaderInfo property of a Loader object provides +* information about the content that the Loader object is loading, whereas +* the loaderInfo property of a DisplayObject provides +* information about the root SWF file for that display object.

+* +*

When you use a Loader object to load a display object(such as a SWF +* file or a bitmap), the loaderInfo property of the display +* object is the same as the contentLoaderInfo property of the +* Loader object(DisplayObject.loaderInfo = +* Loader.contentLoaderInfo). Because the instance of the main class of +* the SWF file has no Loader object, the loaderInfo property is +* the only way to access the LoaderInfo for the instance of the main class of +* the SWF file.

+* +*

The following diagram shows the different uses of the LoaderInfo +* object - for the instance of the main class of the SWF file, for the +* contentLoaderInfo property of a Loader object, and for the +* loaderInfo property of a loaded object:

+* +*

When a loading operation is not complete, some properties of the +* contentLoaderInfo property of a Loader object are not +* available. You can obtain some properties, such as +* bytesLoaded, bytesTotal, url, +* loaderURL, and applicationDomain. When the +* loaderInfo object dispatches the init event, you +* can access all properties of the loaderInfo object and the +* loaded image or SWF file.

+* +*

Note: All properties of LoaderInfo objects are read-only.

+* +*

The EventDispatcher.dispatchEvent() method is not +* applicable to LoaderInfo objects. If you call dispatchEvent() +* on a LoaderInfo object, an IllegalOperationError exception is thrown.

+* +* @event complete Dispatched when data has loaded successfully. In other +* words, it is dispatched when all the content has been +* downloaded and the loading has finished. The +* complete event is always dispatched after +* the init event. The init event +* is dispatched when the object is ready to access, though +* the content may still be downloading. +* @event httpStatus Dispatched when a network request is made over HTTP and +* an HTTP status code can be detected. +* @event init Dispatched when the properties and methods of a loaded +* SWF file are accessible and ready for use. The content, +* however, can still be downloading. A LoaderInfo object +* dispatches the init event when the following +* conditions exist: +*
    +*
  • All properties and methods associated with the +* loaded object and those associated with the LoaderInfo +* object are accessible.
  • +*
  • The constructors for all child objects have +* completed.
  • +*
  • All ActionScript code in the first frame of the +* loaded SWF's main timeline has been executed.
  • +*
+* +*

For example, an Event.INIT is dispatched +* when the first frame of a movie or animation is loaded. +* The movie is then accessible and can be added to the +* display list. The complete movie, however, can take +* longer to download. The Event.COMPLETE is +* only dispatched once the full movie is loaded.

+* +*

The init event always precedes the +* complete event.

+* @event ioError Dispatched when an input or output error occurs that +* causes a load operation to fail. +* @event open Dispatched when a load operation starts. +* @event progress Dispatched when data is received as the download +* operation progresses. +* @event unload Dispatched by a LoaderInfo object whenever a loaded +* object is removed by using the unload() +* method of the Loader object, or when a second load is +* performed by the same Loader object and the original +* content is removed prior to the load beginning. +*/ +var LoaderInfo = (function (_super) { + __extends(LoaderInfo, _super); + function LoaderInfo() { + _super.apply(this, arguments); + } + Object.defineProperty(LoaderInfo.prototype, "bytes", { + /** + * The bytes associated with a LoaderInfo object. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the loaded object due to security + * restrictions. This situation can occur, for + * instance, when a Loader object attempts to access + * the contentLoaderInfo.content property + * and it is not granted security permission to access + * the loaded content. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + get: function () { + return this._bytes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "bytesLoaded", { + /** + * The number of bytes that are loaded for the media. When this number equals + * the value of bytesTotal, all of the bytes are loaded. + */ + get: function () { + return this._bytesLoaded; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "bytesTotal", { + /** + * The number of compressed bytes in the entire media file. + * + *

Before the first progress event is dispatched by this + * LoaderInfo object's corresponding Loader object, bytesTotal + * is 0. After the first progress event from the Loader object, + * bytesTotal reflects the actual number of bytes to be + * downloaded.

+ */ + get: function () { + return this._bytesTotal; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "content", { + /** + * The loaded object associated with this LoaderInfo object. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the loaded object due to security + * restrictions. This situation can occur, for + * instance, when a Loader object attempts to access + * the contentLoaderInfo.content property + * and it is not granted security permission to access + * the loaded content. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + get: function () { + return this._content; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "contentType", { + /** + * The MIME type of the loaded file. The value is null if not + * enough of the file has loaded in order to determine the type. The + * following list gives the possible values: + *
    + *
  • "application/x-shockwave-flash"
  • + *
  • "image/jpeg"
  • + *
  • "image/gif"
  • + *
  • "image/png"
  • + *
+ */ + get: function () { + return this._contentType; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "loader", { + /** + * The Loader object associated with this LoaderInfo object. If this + * LoaderInfo object is the loaderInfo property of the instance + * of the main class of the SWF file, no Loader object is associated. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the Loader object because of security + * restrictions. This can occur, for instance, when a + * loaded SWF file attempts to access its + * loaderInfo.loader property and it is + * not granted security permission to access the + * loading SWF file. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + get: function () { + return this._loader; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderInfo.prototype, "url", { + /** + * The URL of the media being loaded. + * + *

Before the first progress event is dispatched by this + * LoaderInfo object's corresponding Loader object, the value of the + * url property might reflect only the initial URL specified in + * the call to the load() method of the Loader object. After the + * first progress event, the url property reflects + * the media's final URL, after any redirects and relative URLs are + * resolved.

+ * + *

In some cases, the value of the url property is truncated; + * see the isURLInaccessible property for details.

+ */ + get: function () { + return this._url; + }, + enumerable: true, + configurable: true + }); + return LoaderInfo; +})(EventDispatcher); + +module.exports = LoaderInfo; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9Mb2FkZXJJbmZvLnRzIl0sIm5hbWVzIjpbIkxvYWRlckluZm8iLCJMb2FkZXJJbmZvLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1RUFFNkU7O0FBRzdFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFnR0c7QUFDSDtJQUF5QkEsNkJBQWVBO0lBQXhDQTtRQUF5QkMsNkJBQWVBO0lBbUl4Q0EsQ0FBQ0E7QUFBQUQsSUExR0FBO1FBQUFBOzs7Ozs7Ozs7Ozs7Ozs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsTUFBTUE7UUFDbkJBLENBQUNBOzs7O0FBQUFBO0lBTURBO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUE7UUFDekJBLENBQUNBOzs7O0FBQUFBO0lBV0RBO1FBQUFBOzs7Ozs7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxXQUFXQTtRQUN4QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFrQkRBO1FBQUFBOzs7Ozs7Ozs7Ozs7Ozs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBOzs7O0FBQUFBO0lBYURBO1FBQUFBOzs7Ozs7Ozs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBO1FBQ3pCQSxDQUFDQTs7OztBQUFBQTtJQW9CREE7UUFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQWdCREE7UUFBQUE7Ozs7Ozs7Ozs7Ozs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsSUFBSUE7UUFDakJBLENBQUNBOzs7O0FBQUFBLElBQ0ZBLGtCQUFDQTtBQUFEQSxDQUFDQSxFQW5Jd0IsZUFBZSxFQW1JdkM7O0FBRUQsMkJBQW9CLENBQUEiLCJmaWxlIjoiY29yZS9iYXNlL0xvYWRlckluZm8uanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9hZGVyXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL0xvYWRlclwiKTtcbmltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnREaXNwYXRjaGVyXCIpO1xuaW1wb3J0IEJ5dGVBcnJheVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL0J5dGVBcnJheVwiKTtcblxuLyoqXG4gKiBUaGUgTG9hZGVySW5mbyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIGxvYWRlZCBTV0YgZmlsZSBvciBhXG4gKiBsb2FkZWQgaW1hZ2UgZmlsZShKUEVHLCBHSUYsIG9yIFBORykuIExvYWRlckluZm8gb2JqZWN0cyBhcmUgYXZhaWxhYmxlIGZvclxuICogYW55IGRpc3BsYXkgb2JqZWN0LiBUaGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgaW5jbHVkZXMgbG9hZCBwcm9ncmVzcywgdGhlXG4gKiBVUkxzIG9mIHRoZSBsb2FkZXIgYW5kIGxvYWRlZCBjb250ZW50LCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvdGFsIGZvciB0aGVcbiAqIG1lZGlhLCBhbmQgdGhlIG5vbWluYWwgaGVpZ2h0IGFuZCB3aWR0aCBvZiB0aGUgbWVkaWEuXG4gKlxuICogPHA+WW91IGNhbiBhY2Nlc3MgTG9hZGVySW5mbyBvYmplY3RzIGluIHR3byB3YXlzOiA8L3A+XG4gKlxuICogPHVsPlxuICogICA8bGk+VGhlIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBvZiBhIGZsYXNoLmRpc3BsYXkuTG9hZGVyXG4gKiBvYmplY3QgLSAgVGhlIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBpcyBhbHdheXMgYXZhaWxhYmxlXG4gKiBmb3IgYW55IExvYWRlciBvYmplY3QuIEZvciBhIExvYWRlciBvYmplY3QgdGhhdCBoYXMgbm90IGNhbGxlZCB0aGVcbiAqIDxjb2RlPmxvYWQoKTwvY29kZT4gb3IgPGNvZGU+bG9hZEJ5dGVzKCk8L2NvZGU+IG1ldGhvZCwgb3IgdGhhdCBoYXMgbm90XG4gKiBzdWZmaWNpZW50bHkgbG9hZGVkLCBhdHRlbXB0aW5nIHRvIGFjY2VzcyBtYW55IG9mIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZVxuICogPGNvZGU+Y29udGVudExvYWRlckluZm88L2NvZGU+IHByb3BlcnR5IHRocm93cyBhbiBlcnJvci48L2xpPlxuICogICA8bGk+VGhlIDxjb2RlPmxvYWRlckluZm88L2NvZGU+IHByb3BlcnR5IG9mIGEgZGlzcGxheSBvYmplY3QuIDwvbGk+XG4gKiA8L3VsPlxuICpcbiAqIDxwPlRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT4gcHJvcGVydHkgb2YgYSBMb2FkZXIgb2JqZWN0IHByb3ZpZGVzXG4gKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGVudCB0aGF0IHRoZSBMb2FkZXIgb2JqZWN0IGlzIGxvYWRpbmcsIHdoZXJlYXNcbiAqIHRoZSA8Y29kZT5sb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBvZiBhIERpc3BsYXlPYmplY3QgcHJvdmlkZXNcbiAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSByb290IFNXRiBmaWxlIGZvciB0aGF0IGRpc3BsYXkgb2JqZWN0LiA8L3A+XG4gKlxuICogPHA+V2hlbiB5b3UgdXNlIGEgTG9hZGVyIG9iamVjdCB0byBsb2FkIGEgZGlzcGxheSBvYmplY3Qoc3VjaCBhcyBhIFNXRlxuICogZmlsZSBvciBhIGJpdG1hcCksIHRoZSA8Y29kZT5sb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgZGlzcGxheVxuICogb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoZSA8Y29kZT5jb250ZW50TG9hZGVySW5mbzwvY29kZT4gcHJvcGVydHkgb2YgdGhlXG4gKiBMb2FkZXIgb2JqZWN0KDxjb2RlPkRpc3BsYXlPYmplY3QubG9hZGVySW5mbyA9XG4gKiBMb2FkZXIuY29udGVudExvYWRlckluZm88L2NvZGU+KS4gQmVjYXVzZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIG1haW4gY2xhc3Mgb2ZcbiAqIHRoZSBTV0YgZmlsZSBoYXMgbm8gTG9hZGVyIG9iamVjdCwgdGhlIDxjb2RlPmxvYWRlckluZm88L2NvZGU+IHByb3BlcnR5IGlzXG4gKiB0aGUgb25seSB3YXkgdG8gYWNjZXNzIHRoZSBMb2FkZXJJbmZvIGZvciB0aGUgaW5zdGFuY2Ugb2YgdGhlIG1haW4gY2xhc3Mgb2ZcbiAqIHRoZSBTV0YgZmlsZS48L3A+XG4gKlxuICogPHA+VGhlIGZvbGxvd2luZyBkaWFncmFtIHNob3dzIHRoZSBkaWZmZXJlbnQgdXNlcyBvZiB0aGUgTG9hZGVySW5mb1xuICogb2JqZWN0IC0gZm9yIHRoZSBpbnN0YW5jZSBvZiB0aGUgbWFpbiBjbGFzcyBvZiB0aGUgU1dGIGZpbGUsIGZvciB0aGVcbiAqIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBvZiBhIExvYWRlciBvYmplY3QsIGFuZCBmb3IgdGhlXG4gKiA8Y29kZT5sb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBvZiBhIGxvYWRlZCBvYmplY3Q6PC9wPlxuICpcbiAqIDxwPldoZW4gYSBsb2FkaW5nIG9wZXJhdGlvbiBpcyBub3QgY29tcGxldGUsIHNvbWUgcHJvcGVydGllcyBvZiB0aGVcbiAqIDxjb2RlPmNvbnRlbnRMb2FkZXJJbmZvPC9jb2RlPiBwcm9wZXJ0eSBvZiBhIExvYWRlciBvYmplY3QgYXJlIG5vdFxuICogYXZhaWxhYmxlLiBZb3UgY2FuIG9idGFpbiBzb21lIHByb3BlcnRpZXMsIHN1Y2ggYXNcbiAqIDxjb2RlPmJ5dGVzTG9hZGVkPC9jb2RlPiwgPGNvZGU+Ynl0ZXNUb3RhbDwvY29kZT4sIDxjb2RlPnVybDwvY29kZT4sXG4gKiA8Y29kZT5sb2FkZXJVUkw8L2NvZGU+LCBhbmQgPGNvZGU+YXBwbGljYXRpb25Eb21haW48L2NvZGU+LiBXaGVuIHRoZVxuICogPGNvZGU+bG9hZGVySW5mbzwvY29kZT4gb2JqZWN0IGRpc3BhdGNoZXMgdGhlIDxjb2RlPmluaXQ8L2NvZGU+IGV2ZW50LCB5b3VcbiAqIGNhbiBhY2Nlc3MgYWxsIHByb3BlcnRpZXMgb2YgdGhlIDxjb2RlPmxvYWRlckluZm88L2NvZGU+IG9iamVjdCBhbmQgdGhlXG4gKiBsb2FkZWQgaW1hZ2Ugb3IgU1dGIGZpbGUuPC9wPlxuICpcbiAqIDxwPjxiPk5vdGU6PC9iPiBBbGwgcHJvcGVydGllcyBvZiBMb2FkZXJJbmZvIG9iamVjdHMgYXJlIHJlYWQtb25seS48L3A+XG4gKlxuICogPHA+VGhlIDxjb2RlPkV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KCk8L2NvZGU+IG1ldGhvZCBpcyBub3RcbiAqIGFwcGxpY2FibGUgdG8gTG9hZGVySW5mbyBvYmplY3RzLiBJZiB5b3UgY2FsbCA8Y29kZT5kaXNwYXRjaEV2ZW50KCk8L2NvZGU+XG4gKiBvbiBhIExvYWRlckluZm8gb2JqZWN0LCBhbiBJbGxlZ2FsT3BlcmF0aW9uRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi48L3A+XG4gKiBcbiAqIEBldmVudCBjb21wbGV0ZSAgIERpc3BhdGNoZWQgd2hlbiBkYXRhIGhhcyBsb2FkZWQgc3VjY2Vzc2Z1bGx5LiBJbiBvdGhlclxuICogICAgICAgICAgICAgICAgICAgd29yZHMsIGl0IGlzIGRpc3BhdGNoZWQgd2hlbiBhbGwgdGhlIGNvbnRlbnQgaGFzIGJlZW5cbiAqICAgICAgICAgICAgICAgICAgIGRvd25sb2FkZWQgYW5kIHRoZSBsb2FkaW5nIGhhcyBmaW5pc2hlZC4gVGhlXG4gKiAgICAgICAgICAgICAgICAgICA8Y29kZT5jb21wbGV0ZTwvY29kZT4gZXZlbnQgaXMgYWx3YXlzIGRpc3BhdGNoZWQgYWZ0ZXJcbiAqICAgICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5pbml0PC9jb2RlPiBldmVudC4gVGhlIDxjb2RlPmluaXQ8L2NvZGU+IGV2ZW50XG4gKiAgICAgICAgICAgICAgICAgICBpcyBkaXNwYXRjaGVkIHdoZW4gdGhlIG9iamVjdCBpcyByZWFkeSB0byBhY2Nlc3MsIHRob3VnaFxuICogICAgICAgICAgICAgICAgICAgdGhlIGNvbnRlbnQgbWF5IHN0aWxsIGJlIGRvd25sb2FkaW5nLlxuICogQGV2ZW50IGh0dHBTdGF0dXMgRGlzcGF0Y2hlZCB3aGVuIGEgbmV0d29yayByZXF1ZXN0IGlzIG1hZGUgb3ZlciBIVFRQIGFuZFxuICogICAgICAgICAgICAgICAgICAgYW4gSFRUUCBzdGF0dXMgY29kZSBjYW4gYmUgZGV0ZWN0ZWQuXG4gKiBAZXZlbnQgaW5pdCAgICAgICBEaXNwYXRjaGVkIHdoZW4gdGhlIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgb2YgYSBsb2FkZWRcbiAqICAgICAgICAgICAgICAgICAgIFNXRiBmaWxlIGFyZSBhY2Nlc3NpYmxlIGFuZCByZWFkeSBmb3IgdXNlLiBUaGUgY29udGVudCxcbiAqICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIsIGNhbiBzdGlsbCBiZSBkb3dubG9hZGluZy4gQSBMb2FkZXJJbmZvIG9iamVjdFxuICogICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hlcyB0aGUgPGNvZGU+aW5pdDwvY29kZT4gZXZlbnQgd2hlbiB0aGUgZm9sbG93aW5nXG4gKiAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zIGV4aXN0OlxuICogICAgICAgICAgICAgICAgICAgPHVsPlxuICogICAgICAgICAgICAgICAgICAgICA8bGk+QWxsIHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgYXNzb2NpYXRlZCB3aXRoIHRoZVxuICogICAgICAgICAgICAgICAgICAgbG9hZGVkIG9iamVjdCBhbmQgdGhvc2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBMb2FkZXJJbmZvXG4gKiAgICAgICAgICAgICAgICAgICBvYmplY3QgYXJlIGFjY2Vzc2libGUuPC9saT5cbiAqICAgICAgICAgICAgICAgICAgICAgPGxpPlRoZSBjb25zdHJ1Y3RvcnMgZm9yIGFsbCBjaGlsZCBvYmplY3RzIGhhdmVcbiAqICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZC48L2xpPlxuICogICAgICAgICAgICAgICAgICAgICA8bGk+QWxsIEFjdGlvblNjcmlwdCBjb2RlIGluIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGVcbiAqICAgICAgICAgICAgICAgICAgIGxvYWRlZCBTV0YncyBtYWluIHRpbWVsaW5lIGhhcyBiZWVuIGV4ZWN1dGVkLjwvbGk+XG4gKiAgICAgICAgICAgICAgICAgICA8L3VsPlxuICpcbiAqICAgICAgICAgICAgICAgICAgIDxwPkZvciBleGFtcGxlLCBhbiA8Y29kZT5FdmVudC5JTklUPC9jb2RlPiBpcyBkaXNwYXRjaGVkXG4gKiAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBmaXJzdCBmcmFtZSBvZiBhIG1vdmllIG9yIGFuaW1hdGlvbiBpcyBsb2FkZWQuXG4gKiAgICAgICAgICAgICAgICAgICBUaGUgbW92aWUgaXMgdGhlbiBhY2Nlc3NpYmxlIGFuZCBjYW4gYmUgYWRkZWQgdG8gdGhlXG4gKiAgICAgICAgICAgICAgICAgICBkaXNwbGF5IGxpc3QuIFRoZSBjb21wbGV0ZSBtb3ZpZSwgaG93ZXZlciwgY2FuIHRha2VcbiAqICAgICAgICAgICAgICAgICAgIGxvbmdlciB0byBkb3dubG9hZC4gVGhlIDxjb2RlPkV2ZW50LkNPTVBMRVRFPC9jb2RlPiBpc1xuICogICAgICAgICAgICAgICAgICAgb25seSBkaXNwYXRjaGVkIG9uY2UgdGhlIGZ1bGwgbW92aWUgaXMgbG9hZGVkLjwvcD5cbiAqXG4gKiAgICAgICAgICAgICAgICAgICA8cD5UaGUgPGNvZGU+aW5pdDwvY29kZT4gZXZlbnQgYWx3YXlzIHByZWNlZGVzIHRoZVxuICogICAgICAgICAgICAgICAgICAgPGNvZGU+Y29tcGxldGU8L2NvZGU+IGV2ZW50LjwvcD5cbiAqIEBldmVudCBpb0Vycm9yICAgIERpc3BhdGNoZWQgd2hlbiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzIHRoYXRcbiAqICAgICAgICAgICAgICAgICAgIGNhdXNlcyBhIGxvYWQgb3BlcmF0aW9uIHRvIGZhaWwuXG4gKiBAZXZlbnQgb3BlbiAgICAgICBEaXNwYXRjaGVkIHdoZW4gYSBsb2FkIG9wZXJhdGlvbiBzdGFydHMuXG4gKiBAZXZlbnQgcHJvZ3Jlc3MgICBEaXNwYXRjaGVkIHdoZW4gZGF0YSBpcyByZWNlaXZlZCBhcyB0aGUgZG93bmxvYWRcbiAqICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiBwcm9ncmVzc2VzLlxuICogQGV2ZW50IHVubG9hZCAgICAgRGlzcGF0Y2hlZCBieSBhIExvYWRlckluZm8gb2JqZWN0IHdoZW5ldmVyIGEgbG9hZGVkXG4gKiAgICAgICAgICAgICAgICAgICBvYmplY3QgaXMgcmVtb3ZlZCBieSB1c2luZyB0aGUgPGNvZGU+dW5sb2FkKCk8L2NvZGU+XG4gKiAgICAgICAgICAgICAgICAgICBtZXRob2Qgb2YgdGhlIExvYWRlciBvYmplY3QsIG9yIHdoZW4gYSBzZWNvbmQgbG9hZCBpc1xuICogICAgICAgICAgICAgICAgICAgcGVyZm9ybWVkIGJ5IHRoZSBzYW1lIExvYWRlciBvYmplY3QgYW5kIHRoZSBvcmlnaW5hbFxuICogICAgICAgICAgICAgICAgICAgY29udGVudCBpcyByZW1vdmVkIHByaW9yIHRvIHRoZSBsb2FkIGJlZ2lubmluZy5cbiAqL1xuY2xhc3MgTG9hZGVySW5mbyBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlclxue1xuXHRwcml2YXRlIF9ieXRlczpCeXRlQXJyYXk7XG5cdHByaXZhdGUgX2J5dGVzTG9hZGVkOm51bWJlcjtcblx0cHJpdmF0ZSBfYnl0ZXNUb3RhbDpudW1iZXI7XG5cdHByaXZhdGUgX2NvbnRlbnQ6RGlzcGxheU9iamVjdDtcblx0cHJpdmF0ZSBfY29udGVudFR5cGU6c3RyaW5nO1xuXHRwcml2YXRlIF9sb2FkZXI6TG9hZGVyO1xuXHRwcml2YXRlIF91cmw6c3RyaW5nO1xuXHQvKipcblx0ICogVGhlIGJ5dGVzIGFzc29jaWF0ZWQgd2l0aCBhIExvYWRlckluZm8gb2JqZWN0LlxuXHQgKiBcblx0ICogQHRocm93cyBTZWN1cml0eUVycm9yIElmIHRoZSBvYmplY3QgYWNjZXNzaW5nIHRoaXMgQVBJIGlzIHByZXZlbnRlZCBmcm9tXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NpbmcgdGhlIGxvYWRlZCBvYmplY3QgZHVlIHRvIHNlY3VyaXR5XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbnMuIFRoaXMgc2l0dWF0aW9uIGNhbiBvY2N1ciwgZm9yXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgd2hlbiBhIExvYWRlciBvYmplY3QgYXR0ZW1wdHMgdG8gYWNjZXNzXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm8uY29udGVudDwvY29kZT4gcHJvcGVydHlcblx0ICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBpdCBpcyBub3QgZ3JhbnRlZCBzZWN1cml0eSBwZXJtaXNzaW9uIHRvIGFjY2Vzc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxvYWRlZCBjb250ZW50LlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzZWN1cml0eSwgc2VlIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgRmxhc2ggUGxheWVyIERldmVsb3BlciBDZW50ZXIgVG9waWM6IDxhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cDovL3d3dy5hZG9iZS5jb20vZ28vZGV2bmV0X3NlY3VyaXR5X2VuXCJcblx0ICogICAgICAgICAgICAgICAgICAgICAgIHNjb3BlPVwiZXh0ZXJuYWxcIj5TZWN1cml0eTwvYT4uPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBieXRlcygpOkJ5dGVBcnJheVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2J5dGVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgbG9hZGVkIGZvciB0aGUgbWVkaWEuIFdoZW4gdGhpcyBudW1iZXIgZXF1YWxzXG5cdCAqIHRoZSB2YWx1ZSBvZiA8Y29kZT5ieXRlc1RvdGFsPC9jb2RlPiwgYWxsIG9mIHRoZSBieXRlcyBhcmUgbG9hZGVkLlxuXHQgKi9cblx0cHVibGljIGdldCBieXRlc0xvYWRlZCgpOm51bWJlciAvKmludCovXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYnl0ZXNMb2FkZWQ7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiBjb21wcmVzc2VkIGJ5dGVzIGluIHRoZSBlbnRpcmUgbWVkaWEgZmlsZS5cblx0ICpcblx0ICogPHA+QmVmb3JlIHRoZSBmaXJzdCA8Y29kZT5wcm9ncmVzczwvY29kZT4gZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSB0aGlzXG5cdCAqIExvYWRlckluZm8gb2JqZWN0J3MgY29ycmVzcG9uZGluZyBMb2FkZXIgb2JqZWN0LCA8Y29kZT5ieXRlc1RvdGFsPC9jb2RlPlxuXHQgKiBpcyAwLiBBZnRlciB0aGUgZmlyc3QgPGNvZGU+cHJvZ3Jlc3M8L2NvZGU+IGV2ZW50IGZyb20gdGhlIExvYWRlciBvYmplY3QsXG5cdCAqIDxjb2RlPmJ5dGVzVG90YWw8L2NvZGU+IHJlZmxlY3RzIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlXG5cdCAqIGRvd25sb2FkZWQuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBieXRlc1RvdGFsKCk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9ieXRlc1RvdGFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBsb2FkZWQgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIExvYWRlckluZm8gb2JqZWN0LlxuXHQgKiBcblx0ICogQHRocm93cyBTZWN1cml0eUVycm9yIElmIHRoZSBvYmplY3QgYWNjZXNzaW5nIHRoaXMgQVBJIGlzIHByZXZlbnRlZCBmcm9tXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NpbmcgdGhlIGxvYWRlZCBvYmplY3QgZHVlIHRvIHNlY3VyaXR5XG5cdCAqICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGlvbnMuIFRoaXMgc2l0dWF0aW9uIGNhbiBvY2N1ciwgZm9yXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSwgd2hlbiBhIExvYWRlciBvYmplY3QgYXR0ZW1wdHMgdG8gYWNjZXNzXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+Y29udGVudExvYWRlckluZm8uY29udGVudDwvY29kZT4gcHJvcGVydHlcblx0ICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBpdCBpcyBub3QgZ3JhbnRlZCBzZWN1cml0eSBwZXJtaXNzaW9uIHRvIGFjY2Vzc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxvYWRlZCBjb250ZW50LlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzZWN1cml0eSwgc2VlIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgRmxhc2ggUGxheWVyIERldmVsb3BlciBDZW50ZXIgVG9waWM6IDxhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cDovL3d3dy5hZG9iZS5jb20vZ28vZGV2bmV0X3NlY3VyaXR5X2VuXCJcblx0ICogICAgICAgICAgICAgICAgICAgICAgIHNjb3BlPVwiZXh0ZXJuYWxcIj5TZWN1cml0eTwvYT4uPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBjb250ZW50KCk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIE1JTUUgdHlwZSBvZiB0aGUgbG9hZGVkIGZpbGUuIFRoZSB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3Rcblx0ICogZW5vdWdoIG9mIHRoZSBmaWxlIGhhcyBsb2FkZWQgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSB0eXBlLiBUaGVcblx0ICogZm9sbG93aW5nIGxpc3QgZ2l2ZXMgdGhlIHBvc3NpYmxlIHZhbHVlczpcblx0ICogPHVsPlxuXHQgKiAgIDxsaT48Y29kZT5cImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoXCI8L2NvZGU+PC9saT5cblx0ICogICA8bGk+PGNvZGU+XCJpbWFnZS9qcGVnXCI8L2NvZGU+PC9saT5cblx0ICogICA8bGk+PGNvZGU+XCJpbWFnZS9naWZcIjwvY29kZT48L2xpPlxuXHQgKiAgIDxsaT48Y29kZT5cImltYWdlL3BuZ1wiPC9jb2RlPjwvbGk+XG5cdCAqIDwvdWw+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGNvbnRlbnRUeXBlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY29udGVudFR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIExvYWRlciBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTG9hZGVySW5mbyBvYmplY3QuIElmIHRoaXNcblx0ICogTG9hZGVySW5mbyBvYmplY3QgaXMgdGhlIDxjb2RlPmxvYWRlckluZm88L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBpbnN0YW5jZVxuXHQgKiBvZiB0aGUgbWFpbiBjbGFzcyBvZiB0aGUgU1dGIGZpbGUsIG5vIExvYWRlciBvYmplY3QgaXMgYXNzb2NpYXRlZC5cblx0ICogXG5cdCAqIEB0aHJvd3MgU2VjdXJpdHlFcnJvciBJZiB0aGUgb2JqZWN0IGFjY2Vzc2luZyB0aGlzIEFQSSBpcyBwcmV2ZW50ZWQgZnJvbVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzaW5nIHRoZSBMb2FkZXIgb2JqZWN0IGJlY2F1c2Ugb2Ygc2VjdXJpdHlcblx0ICogICAgICAgICAgICAgICAgICAgICAgIHJlc3RyaWN0aW9ucy4gVGhpcyBjYW4gb2NjdXIsIGZvciBpbnN0YW5jZSwgd2hlbiBhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQgU1dGIGZpbGUgYXR0ZW1wdHMgdG8gYWNjZXNzIGl0c1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+bG9hZGVySW5mby5sb2FkZXI8L2NvZGU+IHByb3BlcnR5IGFuZCBpdCBpc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgbm90IGdyYW50ZWQgc2VjdXJpdHkgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nIFNXRiBmaWxlLlxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBzZWN1cml0eSwgc2VlIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgRmxhc2ggUGxheWVyIERldmVsb3BlciBDZW50ZXIgVG9waWM6IDxhXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cDovL3d3dy5hZG9iZS5jb20vZ28vZGV2bmV0X3NlY3VyaXR5X2VuXCJcblx0ICogICAgICAgICAgICAgICAgICAgICAgIHNjb3BlPVwiZXh0ZXJuYWxcIj5TZWN1cml0eTwvYT4uPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBsb2FkZXIoKTpMb2FkZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9sb2FkZXI7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIFVSTCBvZiB0aGUgbWVkaWEgYmVpbmcgbG9hZGVkLlxuXHQgKlxuXHQgKiA8cD5CZWZvcmUgdGhlIGZpcnN0IDxjb2RlPnByb2dyZXNzPC9jb2RlPiBldmVudCBpcyBkaXNwYXRjaGVkIGJ5IHRoaXNcblx0ICogTG9hZGVySW5mbyBvYmplY3QncyBjb3JyZXNwb25kaW5nIExvYWRlciBvYmplY3QsIHRoZSB2YWx1ZSBvZiB0aGVcblx0ICogPGNvZGU+dXJsPC9jb2RlPiBwcm9wZXJ0eSBtaWdodCByZWZsZWN0IG9ubHkgdGhlIGluaXRpYWwgVVJMIHNwZWNpZmllZCBpblxuXHQgKiB0aGUgY2FsbCB0byB0aGUgPGNvZGU+bG9hZCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIExvYWRlciBvYmplY3QuIEFmdGVyIHRoZVxuXHQgKiBmaXJzdCA8Y29kZT5wcm9ncmVzczwvY29kZT4gZXZlbnQsIHRoZSA8Y29kZT51cmw8L2NvZGU+IHByb3BlcnR5IHJlZmxlY3RzXG5cdCAqIHRoZSBtZWRpYSdzIGZpbmFsIFVSTCwgYWZ0ZXIgYW55IHJlZGlyZWN0cyBhbmQgcmVsYXRpdmUgVVJMcyBhcmVcblx0ICogcmVzb2x2ZWQuPC9wPlxuXHQgKlxuXHQgKiA8cD5JbiBzb21lIGNhc2VzLCB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnVybDwvY29kZT4gcHJvcGVydHkgaXMgdHJ1bmNhdGVkO1xuXHQgKiBzZWUgdGhlIDxjb2RlPmlzVVJMSW5hY2Nlc3NpYmxlPC9jb2RlPiBwcm9wZXJ0eSBmb3IgZGV0YWlscy48L3A+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHVybCgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3VybDtcblx0fVxufVxuXG5leHBvcnQgPSBMb2FkZXJJbmZvOyJdfQ== \ No newline at end of file diff --git a/src/away/core/base/LoaderInfo.ts b/lib/core/base/LoaderInfo.ts similarity index 51% rename from src/away/core/base/LoaderInfo.ts rename to lib/core/base/LoaderInfo.ts index bdc92bb8..9c9898dd 100644 --- a/src/away/core/base/LoaderInfo.ts +++ b/lib/core/base/LoaderInfo.ts @@ -1,4 +1,7 @@ -/// +import Loader = require("awayjs-core/lib/containers/Loader"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import ByteArray = require("awayjs-core/lib/utils/ByteArray"); /** * The LoaderInfo class provides information about a loaded SWF file or a @@ -97,138 +100,137 @@ * performed by the same Loader object and the original * content is removed prior to the load beginning. */ -module away.base +class LoaderInfo extends EventDispatcher { - export class LoaderInfo extends away.events.EventDispatcher + private _bytes:ByteArray; + private _bytesLoaded:number; + private _bytesTotal:number; + private _content:DisplayObject; + private _contentType:string; + private _loader:Loader; + private _url:string; + /** + * The bytes associated with a LoaderInfo object. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the loaded object due to security + * restrictions. This situation can occur, for + * instance, when a Loader object attempts to access + * the contentLoaderInfo.content property + * and it is not granted security permission to access + * the loaded content. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + public get bytes():ByteArray { - private _bytes:away.utils.ByteArray; - private _bytesLoaded:number; - private _bytesTotal:number; - private _content:DisplayObject; - private _contentType:string; - private _loader:away.containers.Loader; - private _url:string; - /** - * The bytes associated with a LoaderInfo object. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the loaded object due to security - * restrictions. This situation can occur, for - * instance, when a Loader object attempts to access - * the contentLoaderInfo.content property - * and it is not granted security permission to access - * the loaded content. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - public get bytes():away.utils.ByteArray - { - return this._bytes; - } - - /** - * The number of bytes that are loaded for the media. When this number equals - * the value of bytesTotal, all of the bytes are loaded. - */ - public get bytesLoaded():number /*int*/ - { - return this._bytesLoaded; - } - - /** - * The number of compressed bytes in the entire media file. - * - *

Before the first progress event is dispatched by this - * LoaderInfo object's corresponding Loader object, bytesTotal - * is 0. After the first progress event from the Loader object, - * bytesTotal reflects the actual number of bytes to be - * downloaded.

- */ - public get bytesTotal():number /*int*/ - { - return this._bytesTotal; - } - - /** - * The loaded object associated with this LoaderInfo object. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the loaded object due to security - * restrictions. This situation can occur, for - * instance, when a Loader object attempts to access - * the contentLoaderInfo.content property - * and it is not granted security permission to access - * the loaded content. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - public get content():DisplayObject - { - return this._content; - } - - /** - * The MIME type of the loaded file. The value is null if not - * enough of the file has loaded in order to determine the type. The - * following list gives the possible values: - *
    - *
  • "application/x-shockwave-flash"
  • - *
  • "image/jpeg"
  • - *
  • "image/gif"
  • - *
  • "image/png"
  • - *
- */ - public get contentType():string - { - return this._contentType; - } - - /** - * The Loader object associated with this LoaderInfo object. If this - * LoaderInfo object is the loaderInfo property of the instance - * of the main class of the SWF file, no Loader object is associated. - * - * @throws SecurityError If the object accessing this API is prevented from - * accessing the Loader object because of security - * restrictions. This can occur, for instance, when a - * loaded SWF file attempts to access its - * loaderInfo.loader property and it is - * not granted security permission to access the - * loading SWF file. - * - *

For more information related to security, see the - * Flash Player Developer Center Topic: Security.

- */ - public get loader():away.containers.Loader - { - return this._loader; - } - - /** - * The URL of the media being loaded. - * - *

Before the first progress event is dispatched by this - * LoaderInfo object's corresponding Loader object, the value of the - * url property might reflect only the initial URL specified in - * the call to the load() method of the Loader object. After the - * first progress event, the url property reflects - * the media's final URL, after any redirects and relative URLs are - * resolved.

- * - *

In some cases, the value of the url property is truncated; - * see the isURLInaccessible property for details.

- */ - public get url():string - { - return this._url; - } + return this._bytes; + } + + /** + * The number of bytes that are loaded for the media. When this number equals + * the value of bytesTotal, all of the bytes are loaded. + */ + public get bytesLoaded():number /*int*/ + { + return this._bytesLoaded; + } + + /** + * The number of compressed bytes in the entire media file. + * + *

Before the first progress event is dispatched by this + * LoaderInfo object's corresponding Loader object, bytesTotal + * is 0. After the first progress event from the Loader object, + * bytesTotal reflects the actual number of bytes to be + * downloaded.

+ */ + public get bytesTotal():number /*int*/ + { + return this._bytesTotal; + } + + /** + * The loaded object associated with this LoaderInfo object. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the loaded object due to security + * restrictions. This situation can occur, for + * instance, when a Loader object attempts to access + * the contentLoaderInfo.content property + * and it is not granted security permission to access + * the loaded content. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + public get content():DisplayObject + { + return this._content; + } + + /** + * The MIME type of the loaded file. The value is null if not + * enough of the file has loaded in order to determine the type. The + * following list gives the possible values: + *
    + *
  • "application/x-shockwave-flash"
  • + *
  • "image/jpeg"
  • + *
  • "image/gif"
  • + *
  • "image/png"
  • + *
+ */ + public get contentType():string + { + return this._contentType; + } + + /** + * The Loader object associated with this LoaderInfo object. If this + * LoaderInfo object is the loaderInfo property of the instance + * of the main class of the SWF file, no Loader object is associated. + * + * @throws SecurityError If the object accessing this API is prevented from + * accessing the Loader object because of security + * restrictions. This can occur, for instance, when a + * loaded SWF file attempts to access its + * loaderInfo.loader property and it is + * not granted security permission to access the + * loading SWF file. + * + *

For more information related to security, see the + * Flash Player Developer Center Topic: Security.

+ */ + public get loader():Loader + { + return this._loader; + } + + /** + * The URL of the media being loaded. + * + *

Before the first progress event is dispatched by this + * LoaderInfo object's corresponding Loader object, the value of the + * url property might reflect only the initial URL specified in + * the call to the load() method of the Loader object. After the + * first progress event, the url property reflects + * the media's final URL, after any redirects and relative URLs are + * resolved.

+ * + *

In some cases, the value of the url property is truncated; + * see the isURLInaccessible property for details.

+ */ + public get url():string + { + return this._url; } } + +export = LoaderInfo; \ No newline at end of file diff --git a/lib/core/base/OrientationMode.js b/lib/core/base/OrientationMode.js new file mode 100755 index 00000000..bc05ee91 --- /dev/null +++ b/lib/core/base/OrientationMode.js @@ -0,0 +1,14 @@ +var OrientationMode = (function () { + function OrientationMode() { + } + OrientationMode.DEFAULT = "default"; + + OrientationMode.CAMERA_PLANE = "cameraPlane"; + + OrientationMode.CAMERA_POSITION = "cameraPosition"; + return OrientationMode; +})(); + +module.exports = OrientationMode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9PcmllbnRhdGlvbk1vZGUudHMiXSwibmFtZXMiOlsiT3JpZW50YXRpb25Nb2RlIiwiT3JpZW50YXRpb25Nb2RlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtJQUFBQTtJQWdCQUMsQ0FBQ0E7QUFBQUQsSUFYQUEsMEJBQStCQSxTQUFTQTs7SUFLeENBLCtCQUFvQ0EsYUFBYUE7O0lBS2pEQSxrQ0FBdUNBLGdCQUFnQkE7SUFDeERBLHVCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELGdDQUF5QixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9PcmllbnRhdGlvbk1vZGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBPcmllbnRhdGlvbk1vZGVcbntcblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIERFRkFVTFQ6c3RyaW5nID0gXCJkZWZhdWx0XCI7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIENBTUVSQV9QTEFORTpzdHJpbmcgPSBcImNhbWVyYVBsYW5lXCI7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIENBTUVSQV9QT1NJVElPTjpzdHJpbmcgPSBcImNhbWVyYVBvc2l0aW9uXCI7XG59XG5cbmV4cG9ydCA9IE9yaWVudGF0aW9uTW9kZTsiXX0= \ No newline at end of file diff --git a/lib/core/base/OrientationMode.ts b/lib/core/base/OrientationMode.ts new file mode 100644 index 00000000..de223cce --- /dev/null +++ b/lib/core/base/OrientationMode.ts @@ -0,0 +1,19 @@ +class OrientationMode +{ + /** + * + */ + public static DEFAULT:string = "default"; + + /** + * + */ + public static CAMERA_PLANE:string = "cameraPlane"; + + /** + * + */ + public static CAMERA_POSITION:string = "cameraPosition"; +} + +export = OrientationMode; \ No newline at end of file diff --git a/lib/core/base/PixelSnapping.js b/lib/core/base/PixelSnapping.js new file mode 100755 index 00000000..4bf3ee27 --- /dev/null +++ b/lib/core/base/PixelSnapping.js @@ -0,0 +1,19 @@ +/** +* The PixelSnapping class is an enumeration of constant values for setting +* the pixel snapping options by using the pixelSnapping property +* of a Bitmap object. +*/ +var PixelSnapping = (function () { + function PixelSnapping() { + } + PixelSnapping.ALWAYS = "always"; + + PixelSnapping.AUTO = "auto"; + + PixelSnapping.NEVER = "never"; + return PixelSnapping; +})(); + +module.exports = PixelSnapping; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9QaXhlbFNuYXBwaW5nLnRzIl0sIm5hbWVzIjpbIlBpeGVsU25hcHBpbmciLCJQaXhlbFNuYXBwaW5nLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztFQUlHO0FBQ0g7SUFBQUE7SUF5QkFDLENBQUNBO0FBQUFELElBbEJBQSx1QkFBOEJBLFFBQVFBOztJQVd0Q0EscUJBQTRCQSxNQUFNQTs7SUFNbENBLHNCQUE2QkEsT0FBT0E7SUFDckNBLHFCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9QaXhlbFNuYXBwaW5nLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgUGl4ZWxTbmFwcGluZyBjbGFzcyBpcyBhbiBlbnVtZXJhdGlvbiBvZiBjb25zdGFudCB2YWx1ZXMgZm9yIHNldHRpbmdcbiAqIHRoZSBwaXhlbCBzbmFwcGluZyBvcHRpb25zIGJ5IHVzaW5nIHRoZSA8Y29kZT5waXhlbFNuYXBwaW5nPC9jb2RlPiBwcm9wZXJ0eVxuICogb2YgYSBCaXRtYXAgb2JqZWN0LlxuICovXG5jbGFzcyBQaXhlbFNuYXBwaW5nXG57XG5cdC8qKlxuXHQgKiBBIGNvbnN0YW50IHZhbHVlIHVzZWQgaW4gdGhlIDxjb2RlPnBpeGVsU25hcHBpbmc8L2NvZGU+IHByb3BlcnR5IG9mIGFcblx0ICogQml0bWFwIG9iamVjdCB0byBzcGVjaWZ5IHRoYXQgdGhlIGJpdG1hcCBpbWFnZSBpcyBhbHdheXMgc25hcHBlZCB0byB0aGVcblx0ICogbmVhcmVzdCBwaXhlbCwgaW5kZXBlbmRlbnQgb2YgYW55IHRyYW5zZm9ybWF0aW9uLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBBTFdBWVM6c3RyaW5nID0gXCJhbHdheXNcIjtcblxuXHQvKipcblx0ICogQSBjb25zdGFudCB2YWx1ZSB1c2VkIGluIHRoZSA8Y29kZT5waXhlbFNuYXBwaW5nPC9jb2RlPiBwcm9wZXJ0eSBvZiBhXG5cdCAqIEJpdG1hcCBvYmplY3QgdG8gc3BlY2lmeSB0aGF0IHRoZSBiaXRtYXAgaW1hZ2UgaXMgc25hcHBlZCB0byB0aGUgbmVhcmVzdFxuXHQgKiBwaXhlbCBpZiBpdCBpcyBkcmF3biB3aXRoIG5vIHJvdGF0aW9uIG9yIHNrZXcgYW5kIGl0IGlzIGRyYXduIGF0IGEgc2NhbGVcblx0ICogZmFjdG9yIG9mIDk5LjklIHRvIDEwMC4xJS4gSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgc2F0aXNmaWVkLCB0aGUgaW1hZ2UgaXNcblx0ICogZHJhd24gYXQgMTAwJSBzY2FsZSwgc25hcHBlZCB0byB0aGUgbmVhcmVzdCBwaXhlbC4gSW50ZXJuYWxseSwgdGhpc1xuXHQgKiBzZXR0aW5nIGFsbG93cyB0aGUgaW1hZ2UgdG8gYmUgZHJhd24gYXMgZmFzdCBhcyBwb3NzaWJsZSBieSB1c2luZyB0aGVcblx0ICogdmVjdG9yIHJlbmRlcmVyLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBBVVRPOnN0cmluZyA9IFwiYXV0b1wiO1xuXG5cdC8qKlxuXHQgKiBBIGNvbnN0YW50IHZhbHVlIHVzZWQgaW4gdGhlIDxjb2RlPnBpeGVsU25hcHBpbmc8L2NvZGU+IHByb3BlcnR5IG9mIGFcblx0ICogQml0bWFwIG9iamVjdCB0byBzcGVjaWZ5IHRoYXQgbm8gcGl4ZWwgc25hcHBpbmcgb2NjdXJzLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBORVZFUjpzdHJpbmcgPSBcIm5ldmVyXCI7XG59XG5cbmV4cG9ydCA9IFBpeGVsU25hcHBpbmc7Il19 \ No newline at end of file diff --git a/lib/core/base/PixelSnapping.ts b/lib/core/base/PixelSnapping.ts new file mode 100644 index 00000000..eff755dd --- /dev/null +++ b/lib/core/base/PixelSnapping.ts @@ -0,0 +1,33 @@ +/** + * The PixelSnapping class is an enumeration of constant values for setting + * the pixel snapping options by using the pixelSnapping property + * of a Bitmap object. + */ +class PixelSnapping +{ + /** + * A constant value used in the pixelSnapping property of a + * Bitmap object to specify that the bitmap image is always snapped to the + * nearest pixel, independent of any transformation. + */ + public static ALWAYS:string = "always"; + + /** + * A constant value used in the pixelSnapping property of a + * Bitmap object to specify that the bitmap image is snapped to the nearest + * pixel if it is drawn with no rotation or skew and it is drawn at a scale + * factor of 99.9% to 100.1%. If these conditions are satisfied, the image is + * drawn at 100% scale, snapped to the nearest pixel. Internally, this + * setting allows the image to be drawn as fast as possible by using the + * vector renderer. + */ + public static AUTO:string = "auto"; + + /** + * A constant value used in the pixelSnapping property of a + * Bitmap object to specify that no pixel snapping occurs. + */ + public static NEVER:string = "never"; +} + +export = PixelSnapping; \ No newline at end of file diff --git a/lib/core/base/SpreadMethod.js b/lib/core/base/SpreadMethod.js new file mode 100755 index 00000000..ac1b5343 --- /dev/null +++ b/lib/core/base/SpreadMethod.js @@ -0,0 +1,22 @@ +/** +* The SpreadMethod class provides values for the spreadMethod +* parameter in the beginGradientFill() and +* lineGradientStyle() methods of the Graphics class. +* +*

The following example shows the same gradient fill using various spread +* methods:

+*/ +var SpreadMethod = (function () { + function SpreadMethod() { + } + SpreadMethod.PAD = "pad"; + + SpreadMethod.REFLECT = "reflect"; + + SpreadMethod.REPEAT = "repeat"; + return SpreadMethod; +})(); + +module.exports = SpreadMethod; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9TcHJlYWRNZXRob2QudHMiXSwibmFtZXMiOlsiU3ByZWFkTWV0aG9kIiwiU3ByZWFkTWV0aG9kLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztFQU9HO0FBQ0g7SUFBQUE7SUFnQkFDLENBQUNBO0FBQUFELElBWEFBLG1CQUEyQkEsS0FBS0E7O0lBS2hDQSx1QkFBK0JBLFNBQVNBOztJQUt4Q0Esc0JBQThCQSxRQUFRQTtJQUN2Q0Esb0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsNkJBQXNCLENBQUEiLCJmaWxlIjoiY29yZS9iYXNlL1NwcmVhZE1ldGhvZC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIFNwcmVhZE1ldGhvZCBjbGFzcyBwcm92aWRlcyB2YWx1ZXMgZm9yIHRoZSA8Y29kZT5zcHJlYWRNZXRob2Q8L2NvZGU+XG4gKiBwYXJhbWV0ZXIgaW4gdGhlIDxjb2RlPmJlZ2luR3JhZGllbnRGaWxsKCk8L2NvZGU+IGFuZFxuICogPGNvZGU+bGluZUdyYWRpZW50U3R5bGUoKTwvY29kZT4gbWV0aG9kcyBvZiB0aGUgR3JhcGhpY3MgY2xhc3MuXG4gKlxuICogPHA+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSBzYW1lIGdyYWRpZW50IGZpbGwgdXNpbmcgdmFyaW91cyBzcHJlYWRcbiAqIG1ldGhvZHM6PC9wPlxuICovXG5jbGFzcyBTcHJlYWRNZXRob2Rcbntcblx0LyoqXG5cdCAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFkaWVudCB1c2UgdGhlIDxpPnBhZDwvaT4gc3ByZWFkIG1ldGhvZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUEFEOnN0cmluZyA9IFwicGFkXCI7XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFkaWVudCB1c2UgdGhlIDxpPnJlZmxlY3Q8L2k+IHNwcmVhZCBtZXRob2QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFJFRkxFQ1Q6c3RyaW5nID0gXCJyZWZsZWN0XCI7XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB0aGF0IHRoZSBncmFkaWVudCB1c2UgdGhlIDxpPnJlcGVhdDwvaT4gc3ByZWFkIG1ldGhvZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUkVQRUFUOnN0cmluZyA9IFwicmVwZWF0XCI7XG59XG5cbmV4cG9ydCA9IFNwcmVhZE1ldGhvZDsiXX0= \ No newline at end of file diff --git a/lib/core/base/SpreadMethod.ts b/lib/core/base/SpreadMethod.ts new file mode 100644 index 00000000..d83d0fe9 --- /dev/null +++ b/lib/core/base/SpreadMethod.ts @@ -0,0 +1,27 @@ +/** + * The SpreadMethod class provides values for the spreadMethod + * parameter in the beginGradientFill() and + * lineGradientStyle() methods of the Graphics class. + * + *

The following example shows the same gradient fill using various spread + * methods:

+ */ +class SpreadMethod +{ + /** + * Specifies that the gradient use the pad spread method. + */ + public static PAD:string = "pad"; + + /** + * Specifies that the gradient use the reflect spread method. + */ + public static REFLECT:string = "reflect"; + + /** + * Specifies that the gradient use the repeat spread method. + */ + public static REPEAT:string = "repeat"; +} + +export = SpreadMethod; \ No newline at end of file diff --git a/lib/core/base/SubGeometryBase.js b/lib/core/base/SubGeometryBase.js new file mode 100755 index 00000000..33419560 --- /dev/null +++ b/lib/core/base/SubGeometryBase.js @@ -0,0 +1,204 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** +* @class away.base.TriangleSubGeometry +*/ +var SubGeometryBase = (function (_super) { + __extends(SubGeometryBase, _super); + /** + * + */ + function SubGeometryBase(concatenatedArrays) { + _super.call(this); + this._pStrideOffsetDirty = true; + this._pConcatenateArrays = true; + this._pStride = new Object(); + this._pOffset = new Object(); + + this._pConcatenateArrays = concatenatedArrays; + } + SubGeometryBase.prototype._pUpdateStrideOffset = function () { + throw new AbstractMethodError(); + }; + + Object.defineProperty(SubGeometryBase.prototype, "subMeshClass", { + get: function () { + return this._pSubMeshClass; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubGeometryBase.prototype, "concatenateArrays", { + /** + * + */ + get: function () { + return this._pConcatenateArrays; + }, + set: function (value) { + if (this._pConcatenateArrays == value) + return; + + this._pConcatenateArrays = value; + + this._pStrideOffsetDirty = true; + + if (value) + this._pNotifyVerticesUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(SubGeometryBase.prototype, "indices", { + /** + * The raw index data that define the faces. + */ + get: function () { + return this._pIndices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubGeometryBase.prototype, "vertices", { + /** + * + */ + get: function () { + this.updateVertices(); + + return this._pVertices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubGeometryBase.prototype, "numTriangles", { + /** + * The total amount of triangles in the TriangleSubGeometry. + */ + get: function () { + return this._numTriangles; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubGeometryBase.prototype, "numVertices", { + get: function () { + return this._pNumVertices; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + SubGeometryBase.prototype.getStride = function (dataType) { + if (this._pStrideOffsetDirty) + this._pUpdateStrideOffset(); + + return this._pStride[dataType]; + }; + + /** + * + */ + SubGeometryBase.prototype.getOffset = function (dataType) { + if (this._pStrideOffsetDirty) + this._pUpdateStrideOffset(); + + return this._pOffset[dataType]; + }; + + SubGeometryBase.prototype.updateVertices = function () { + throw new AbstractMethodError(); + }; + + /** + * + */ + SubGeometryBase.prototype.dispose = function () { + this._pIndices = null; + this._pVertices = null; + }; + + /** + * Updates the face indices of the TriangleSubGeometry. + * + * @param indices The face indices to upload. + */ + SubGeometryBase.prototype.updateIndices = function (indices) { + this._pIndices = indices; + this._numIndices = indices.length; + + this._numTriangles = this._numIndices / 3; + + this.notifyIndicesUpdate(); + }; + + /** + * @protected + */ + SubGeometryBase.prototype.pInvalidateBounds = function () { + if (this.parentGeometry) + this.parentGeometry.iInvalidateBounds(this); + }; + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + SubGeometryBase.prototype.clone = function () { + throw new AbstractMethodError(); + }; + + SubGeometryBase.prototype.applyTransformation = function (transform) { + }; + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + SubGeometryBase.prototype.scale = function (scale) { + }; + + SubGeometryBase.prototype.scaleUV = function (scaleU, scaleV) { + if (typeof scaleU === "undefined") { scaleU = 1; } + if (typeof scaleV === "undefined") { scaleV = 1; } + }; + + SubGeometryBase.prototype.getBoundingPositions = function () { + throw new AbstractMethodError(); + }; + + SubGeometryBase.prototype.notifyIndicesUpdate = function () { + if (!this._indicesUpdated) + this._indicesUpdated = new SubGeometryEvent(SubGeometryEvent.INDICES_UPDATED); + + this.dispatchEvent(this._indicesUpdated); + }; + + SubGeometryBase.prototype._pNotifyVerticesUpdate = function () { + throw new AbstractMethodError(); + }; + SubGeometryBase.VERTEX_DATA = "vertices"; + return SubGeometryBase; +})(NamedAssetBase); + +module.exports = SubGeometryBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9TdWJHZW9tZXRyeUJhc2UudHMiXSwibmFtZXMiOlsiU3ViR2VvbWV0cnlCYXNlIiwiU3ViR2VvbWV0cnlCYXNlLmNvbnN0cnVjdG9yIiwiU3ViR2VvbWV0cnlCYXNlLl9wVXBkYXRlU3RyaWRlT2Zmc2V0IiwiU3ViR2VvbWV0cnlCYXNlLmdldFN0cmlkZSIsIlN1Ykdlb21ldHJ5QmFzZS5nZXRPZmZzZXQiLCJTdWJHZW9tZXRyeUJhc2UudXBkYXRlVmVydGljZXMiLCJTdWJHZW9tZXRyeUJhc2UuZGlzcG9zZSIsIlN1Ykdlb21ldHJ5QmFzZS51cGRhdGVJbmRpY2VzIiwiU3ViR2VvbWV0cnlCYXNlLnBJbnZhbGlkYXRlQm91bmRzIiwiU3ViR2VvbWV0cnlCYXNlLmNsb25lIiwiU3ViR2VvbWV0cnlCYXNlLmFwcGx5VHJhbnNmb3JtYXRpb24iLCJTdWJHZW9tZXRyeUJhc2Uuc2NhbGUiLCJTdWJHZW9tZXRyeUJhc2Uuc2NhbGVVViIsIlN1Ykdlb21ldHJ5QmFzZS5nZXRCb3VuZGluZ1Bvc2l0aW9ucyIsIlN1Ykdlb21ldHJ5QmFzZS5ub3RpZnlJbmRpY2VzVXBkYXRlIiwiU3ViR2VvbWV0cnlCYXNlLl9wTm90aWZ5VmVydGljZXNVcGRhdGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDJFQUVpRjs7QUFHakYsK0VBQW9GO0FBQ3BGLHlFQUErRTs7QUFFL0U7O0VBRUc7QUFDSDtJQUE4QkEsa0NBQWNBO0lBdUYzQ0E7O01BREdBO0lBQ0hBLHlCQUFZQSxrQkFBMEJBO1FBRXJDQyxXQUFNQSxLQUFBQSxDQUFDQTtRQXJGUkEsS0FBT0EsbUJBQW1CQSxHQUFXQSxJQUFJQSxDQUFDQTtRQVMxQ0EsS0FBT0EsbUJBQW1CQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUkxQ0EsS0FBT0EsUUFBUUEsR0FBVUEsSUFBSUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDdENBLEtBQU9BLFFBQVFBLEdBQVVBLElBQUlBLE1BQU1BLENBQUNBLENBQUNBLENB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Q0EsQ0FBQ0E7SUFDaENBLENBQUNBOztJQUVEVCxnREFBQUEsVUFBMkJBLFNBQWtCQTtJQUc3Q1UsQ0FBQ0E7O0lBTURWOzs7TUFER0E7c0NBQ0hBLFVBQWFBLEtBQVlBO0lBR3pCVyxDQUFDQTs7SUFFRFgsb0NBQUFBLFVBQWVBLE1BQWlCQSxFQUFFQSxNQUFpQkE7UUFBcENZLHFDQUFBQSxNQUFNQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxxQ0FBQUEsTUFBTUEsR0FBVUEsQ0FBQ0E7QUFBQUEsSUFHbkRBLENBQUNBOztJQUVEWixpREFBQUE7UUFFQ2EsTUFBTUEsSUFBSUEsbUJBQW1CQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7O0lBRURiLGdEQUFBQTtRQUVDYyxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQTtZQUN4QkEsSUFBSUEsQ0FBQ0EsZUFBZUEsR0FBR0EsSUFBSUEsZ0JBQWdCQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBOztRQUUvRUEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0E7SUFDekNBLENBQUNBOztJQUVEZCxtREFBQUE7UUFFQ2UsTUFBTUEsSUFBSUEsbUJBQW1CQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7SUEzTURmLDhCQUFtQ0EsVUFBVUE7SUE0TTlDQSx1QkFBQ0E7QUFBREEsQ0FBQ0EsRUE5TTZCLGNBQWMsRUE4TTNDOztBQUVELGdDQUF5QixDQUFBIiwiZmlsZSI6ImNvcmUvYmFzZS9TdWJHZW9tZXRyeUJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgR2VvbWV0cnlcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9HZW9tZXRyeVwiKTtcbmltcG9ydCBJU3ViTWVzaENsYXNzXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JU3ViTWVzaENsYXNzXCIpO1xuaW1wb3J0IE5hbWVkQXNzZXRCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9OYW1lZEFzc2V0QmFzZVwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFJlY3RhbmdsZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9SZWN0YW5nbGVcIik7XG5pbXBvcnQgQWJzdHJhY3RNZXRob2RFcnJvclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Fic3RyYWN0TWV0aG9kRXJyb3JcIik7XG5pbXBvcnQgU3ViR2VvbWV0cnlFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvU3ViR2VvbWV0cnlFdmVudFwiKTtcblxuLyoqXG4gKiBAY2xhc3MgYXdheS5iYXNlLlRyaWFuZ2xlU3ViR2VvbWV0cnlcbiAqL1xuY2xhc3MgU3ViR2VvbWV0cnlCYXNlIGV4dGVuZHMgTmFtZWRBc3NldEJhc2Vcbntcblx0cHVibGljIHN0YXRpYyBWRVJURVhfREFUQTpzdHJpbmcgPSBcInZlcnRpY2VzXCI7XG5cblx0cHVibGljIF9wU3RyaWRlT2Zmc2V0RGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHVibGljIF9wSW5kaWNlczpBcnJheTxudW1iZXI+IC8qdWludCovO1xuXHRwdWJsaWMgX3BWZXJ0aWNlczpBcnJheTxudW1iZXI+O1xuXG5cdHByaXZhdGUgX251bUluZGljZXM6bnVtYmVyO1xuXHRwcml2YXRlIF9udW1UcmlhbmdsZXM6bnVtYmVyO1xuXHRwdWJsaWMgX3BOdW1WZXJ0aWNlczpudW1iZXI7XG5cblx0cHVibGljIF9wQ29uY2F0ZW5hdGVBcnJheXM6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHJpdmF0ZSBfaW5kaWNlc1VwZGF0ZWQ6U3ViR2VvbWV0cnlFdmVudDtcblxuXHRwdWJsaWMgX3BTdHJpZGU6T2JqZWN0ID0gbmV3IE9iamVjdCgpO1xuXHRwdWJsaWMgX3BPZmZzZXQ6T2JqZWN0ID0gbmV3IE9iamVjdCgpO1xuXG5cdHB1YmxpYyBfcFVwZGF0ZVN0cmlkZU9mZnNldCgpXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0cHVibGljIF9wU3ViTWVzaENsYXNzOklTdWJNZXNoQ2xhc3M7XG5cblx0cHVibGljIGdldCBzdWJNZXNoQ2xhc3MoKTpJU3ViTWVzaENsYXNzXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFN1Yk1lc2hDbGFzcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBjb25jYXRlbmF0ZUFycmF5cygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wQ29uY2F0ZW5hdGVBcnJheXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGNvbmNhdGVuYXRlQXJyYXlzKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHRpZiAodGhpcy5fcENvbmNhdGVuYXRlQXJyYXlzID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcENvbmNhdGVuYXRlQXJyYXlzID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wU3RyaWRlT2Zmc2V0RGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKHZhbHVlKVxuXHRcdFx0dGhpcy5fcE5vdGlmeVZlcnRpY2VzVXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHJhdyBpbmRleCBkYXRhIHRoYXQgZGVmaW5lIHRoZSBmYWNlcy5cblx0ICovXG5cdHB1YmxpYyBnZXQgaW5kaWNlcygpOkFycmF5PG51bWJlcj5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wSW5kaWNlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBcblx0ICovXG5cdHB1YmxpYyBnZXQgdmVydGljZXMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHR0aGlzLnVwZGF0ZVZlcnRpY2VzKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fcFZlcnRpY2VzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0b3RhbCBhbW91bnQgb2YgdHJpYW5nbGVzIGluIHRoZSBUcmlhbmdsZVN1Ykdlb21ldHJ5LlxuXHQgKi9cblx0cHVibGljIGdldCBudW1UcmlhbmdsZXMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9udW1UcmlhbmdsZXM7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IG51bVZlcnRpY2VzKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcE51bVZlcnRpY2VzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihjb25jYXRlbmF0ZWRBcnJheXM6Ym9vbGVhbilcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9wQ29uY2F0ZW5hdGVBcnJheXMgPSBjb25jYXRlbmF0ZWRBcnJheXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXRTdHJpZGUoZGF0YVR5cGU6c3RyaW5nKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BTdHJpZGVPZmZzZXREaXJ0eSlcblx0XHRcdHRoaXMuX3BVcGRhdGVTdHJpZGVPZmZzZXQoKTtcblxuXHRcdHJldHVybiB0aGlzLl9wU3RyaWRlW2RhdGFUeXBlXTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldE9mZnNldChkYXRhVHlwZTpzdHJpbmcpXG5cdHtcblx0XHRpZiAodGhpcy5fcFN0cmlkZU9mZnNldERpcnR5KVxuXHRcdFx0dGhpcy5fcFVwZGF0ZVN0cmlkZU9mZnNldCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3BPZmZzZXRbZGF0YVR5cGVdO1xuXHR9XG5cblx0cHVibGljIHVwZGF0ZVZlcnRpY2VzKClcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBkaXNwb3NlKClcblx0e1xuXHRcdHRoaXMuX3BJbmRpY2VzID0gbnVsbDtcblx0XHR0aGlzLl9wVmVydGljZXMgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGZhY2UgaW5kaWNlcyBvZiB0aGUgVHJpYW5nbGVTdWJHZW9tZXRyeS5cblx0ICpcblx0ICogQHBhcmFtIGluZGljZXMgVGhlIGZhY2UgaW5kaWNlcyB0byB1cGxvYWQuXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlSW5kaWNlcyhpbmRpY2VzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR0aGlzLl9wSW5kaWNlcyA9IGluZGljZXM7XG5cdFx0dGhpcy5fbnVtSW5kaWNlcyA9IGluZGljZXMubGVuZ3RoO1xuXG5cdFx0dGhpcy5fbnVtVHJpYW5nbGVzID0gdGhpcy5fbnVtSW5kaWNlcy8zO1xuXG5cdFx0dGhpcy5ub3RpZnlJbmRpY2VzVXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBJbnZhbGlkYXRlQm91bmRzKClcblx0e1xuXHRcdGlmICh0aGlzLnBhcmVudEdlb21ldHJ5KVxuXHRcdFx0dGhpcy5wYXJlbnRHZW9tZXRyeS5pSW52YWxpZGF0ZUJvdW5kcyh0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgR2VvbWV0cnkgb2JqZWN0IHRoYXQgJ293bnMnIHRoaXMgVHJpYW5nbGVTdWJHZW9tZXRyeSBvYmplY3QuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwdWJsaWMgcGFyZW50R2VvbWV0cnk6R2VvbWV0cnk7XG5cblx0LyoqXG5cdCAqIENsb25lcyB0aGUgY3VycmVudCBvYmplY3Rcblx0ICogQHJldHVybiBBbiBleGFjdCBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGNsb25lKCk6U3ViR2VvbWV0cnlCYXNlXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0cHVibGljIGFwcGx5VHJhbnNmb3JtYXRpb24odHJhbnNmb3JtOk1hdHJpeDNEKVxuXHR7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBTY2FsZXMgdGhlIGdlb21ldHJ5LlxuXHQgKiBAcGFyYW0gc2NhbGUgVGhlIGFtb3VudCBieSB3aGljaCB0byBzY2FsZS5cblx0ICovXG5cdHB1YmxpYyBzY2FsZShzY2FsZTpudW1iZXIpXG5cdHtcblxuXHR9XG5cblx0cHVibGljIHNjYWxlVVYoc2NhbGVVOm51bWJlciA9IDEsIHNjYWxlVjpudW1iZXIgPSAxKVxuXHR7XG5cblx0fVxuXG5cdHB1YmxpYyBnZXRCb3VuZGluZ1Bvc2l0aW9ucygpOkFycmF5PG51bWJlcj5cblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHRwcml2YXRlIG5vdGlmeUluZGljZXNVcGRhdGUoKVxuXHR7XG5cdFx0aWYgKCF0aGlzLl9pbmRpY2VzVXBkYXRlZClcblx0XHRcdHRoaXMuX2luZGljZXNVcGRhdGVkID0gbmV3IFN1Ykdlb21ldHJ5RXZlbnQoU3ViR2VvbWV0cnlFdmVudC5JTkRJQ0VTX1VQREFURUQpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX2luZGljZXNVcGRhdGVkKTtcblx0fVxuXG5cdHB1YmxpYyBfcE5vdGlmeVZlcnRpY2VzVXBkYXRlKClcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cbn1cblxuZXhwb3J0ID0gU3ViR2VvbWV0cnlCYXNlOyJdfQ== \ No newline at end of file diff --git a/lib/core/base/SubGeometryBase.ts b/lib/core/base/SubGeometryBase.ts new file mode 100644 index 00000000..e01e86f7 --- /dev/null +++ b/lib/core/base/SubGeometryBase.ts @@ -0,0 +1,220 @@ +import Geometry = require("awayjs-core/lib/core/base/Geometry"); +import ISubMeshClass = require("awayjs-core/lib/core/base/ISubMeshClass"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** + * @class away.base.TriangleSubGeometry + */ +class SubGeometryBase extends NamedAssetBase +{ + public static VERTEX_DATA:string = "vertices"; + + public _pStrideOffsetDirty:boolean = true; + + public _pIndices:Array /*uint*/; + public _pVertices:Array; + + private _numIndices:number; + private _numTriangles:number; + public _pNumVertices:number; + + public _pConcatenateArrays:boolean = true; + + private _indicesUpdated:SubGeometryEvent; + + public _pStride:Object = new Object(); + public _pOffset:Object = new Object(); + + public _pUpdateStrideOffset() + { + throw new AbstractMethodError(); + } + + public _pSubMeshClass:ISubMeshClass; + + public get subMeshClass():ISubMeshClass + { + return this._pSubMeshClass; + } + + /** + * + */ + public get concatenateArrays():boolean + { + return this._pConcatenateArrays; + } + + public set concatenateArrays(value:boolean) + { + if (this._pConcatenateArrays == value) + return; + + this._pConcatenateArrays = value; + + this._pStrideOffsetDirty = true; + + if (value) + this._pNotifyVerticesUpdate(); + } + + /** + * The raw index data that define the faces. + */ + public get indices():Array + { + return this._pIndices; + } + + /** + * + */ + public get vertices():Array + { + this.updateVertices(); + + return this._pVertices; + } + + /** + * The total amount of triangles in the TriangleSubGeometry. + */ + public get numTriangles():number + { + return this._numTriangles; + } + + public get numVertices():number + { + return this._pNumVertices; + } + + /** + * + */ + constructor(concatenatedArrays:boolean) + { + super(); + + this._pConcatenateArrays = concatenatedArrays; + } + + /** + * + */ + public getStride(dataType:string) + { + if (this._pStrideOffsetDirty) + this._pUpdateStrideOffset(); + + return this._pStride[dataType]; + } + + /** + * + */ + public getOffset(dataType:string) + { + if (this._pStrideOffsetDirty) + this._pUpdateStrideOffset(); + + return this._pOffset[dataType]; + } + + public updateVertices() + { + throw new AbstractMethodError(); + } + + /** + * + */ + public dispose() + { + this._pIndices = null; + this._pVertices = null; + } + + /** + * Updates the face indices of the TriangleSubGeometry. + * + * @param indices The face indices to upload. + */ + public updateIndices(indices:Array) + { + this._pIndices = indices; + this._numIndices = indices.length; + + this._numTriangles = this._numIndices/3; + + this.notifyIndicesUpdate(); + } + + /** + * @protected + */ + public pInvalidateBounds() + { + if (this.parentGeometry) + this.parentGeometry.iInvalidateBounds(this); + } + + /** + * The Geometry object that 'owns' this TriangleSubGeometry object. + * + * @private + */ + public parentGeometry:Geometry; + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + public clone():SubGeometryBase + { + throw new AbstractMethodError(); + } + + public applyTransformation(transform:Matrix3D) + { + + } + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + public scale(scale:number) + { + + } + + public scaleUV(scaleU:number = 1, scaleV:number = 1) + { + + } + + public getBoundingPositions():Array + { + throw new AbstractMethodError(); + } + + private notifyIndicesUpdate() + { + if (!this._indicesUpdated) + this._indicesUpdated = new SubGeometryEvent(SubGeometryEvent.INDICES_UPDATED); + + this.dispatchEvent(this._indicesUpdated); + } + + public _pNotifyVerticesUpdate() + { + throw new AbstractMethodError(); + } +} + +export = SubGeometryBase; \ No newline at end of file diff --git a/lib/core/base/SubMeshBase.js b/lib/core/base/SubMeshBase.js new file mode 100755 index 00000000..961652f5 --- /dev/null +++ b/lib/core/base/SubMeshBase.js @@ -0,0 +1,157 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +/** +* SubMeshBase wraps a TriangleSubGeometry as a scene graph instantiation. A SubMeshBase is owned by a Mesh object. +* +* +* @see away.base.TriangleSubGeometry +* @see away.entities.Mesh +* +* @class away.base.SubMeshBase +*/ +var SubMeshBase = (function (_super) { + __extends(SubMeshBase, _super); + /** + * Creates a new SubMeshBase object + */ + function SubMeshBase() { + _super.call(this); + this._iIndex = 0; + this._renderables = new Array(); + } + Object.defineProperty(SubMeshBase.prototype, "animator", { + //TODO test shader picking + // public get shaderPickingDetails():boolean + // { + // + // return this.sourceEntity.shaderPickingDetails; + // } + /** + * The animator object that provides the state for the TriangleSubMesh's animation. + */ + get: function () { + return this._pParentMesh.animator; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubMeshBase.prototype, "material", { + /** + * The material used to render the current TriangleSubMesh. If set to null, its parent Mesh's material will be used instead. + */ + get: function () { + return this._material || this._pParentMesh.material; + }, + set: function (value) { + if (this.material) + this.material.iRemoveOwner(this); + + this._material = value; + + if (this.material) + this.material.iAddOwner(this); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(SubMeshBase.prototype, "sceneTransform", { + /** + * The scene transform object that transforms from model to world space. + */ + get: function () { + return this._pParentMesh.sceneTransform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubMeshBase.prototype, "parentMesh", { + /** + * The entity that that initially provided the IRenderable to the render pipeline (ie: the owning Mesh object). + */ + get: function () { + return this._pParentMesh; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(SubMeshBase.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform || this._pParentMesh.uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * + */ + SubMeshBase.prototype.dispose = function () { + this.material = null; + + var len = this._renderables.length; + for (var i = 0; i < len; i++) + this._renderables[i].dispose(); + }; + + /** + * + * @param camera + * @returns {away.geom.Matrix3D} + */ + SubMeshBase.prototype.getRenderSceneTransform = function (camera) { + return this._pParentMesh.getRenderSceneTransform(camera); + }; + + SubMeshBase.prototype._iAddRenderable = function (renderable) { + this._renderables.push(renderable); + + return renderable; + }; + + SubMeshBase.prototype._iRemoveRenderable = function (renderable) { + var index = this._renderables.indexOf(renderable); + + this._renderables.splice(index, 1); + + return renderable; + }; + + SubMeshBase.prototype._iInvalidateRenderableGeometry = function () { + var len = this._renderables.length; + for (var i = 0; i < len; i++) + this._renderables[i].invalidateGeometry(); + }; + + SubMeshBase.prototype._iCollectRenderable = function (renderer) { + throw new AbstractMethodError(); + }; + + SubMeshBase.prototype._iGetExplicitMaterial = function () { + return this._material; + }; + return SubMeshBase; +})(NamedAssetBase); + +module.exports = SubMeshBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9TdWJNZXNoQmFzZS50cyJdLCJuYW1lcyI6WyJTdWJNZXNoQmFzZSIsIlN1Yk1lc2hCYXNlLmNvbnN0cnVjdG9yIiwiU3ViTWVzaEJhc2UuZGlzcG9zZSIsIlN1Yk1lc2hCYXNlLmdldFJlbmRlclNjZW5lVHJhbnNmb3JtIiwiU3ViTWVzaEJhc2UuX2lBZGRSZW5kZXJhYmxlIiwiU3ViTWVzaEJhc2UuX2lSZW1vdmVSZW5kZXJhYmxlIiwiU3ViTWVzaEJhc2UuX2lJbnZhbGlkYXRlUmVuZGVyYWJsZUdlb21ldHJ5IiwiU3ViTWVzaEJhc2UuX2lDb2xsZWN0UmVuZGVyYWJsZSIsIlN1Yk1lc2hCYXNlLl9pR2V0RXhwbGljaXRNYXRlcmlhbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkVBR2lGOztBQUtqRiwrRUFBb0Y7O0FBR3BGOzs7Ozs7OztFQVFHO0FBQ0g7SUFBMEJBLDhCQUFjQTtJQTRFdkNBOztNQURHQTtJQUNIQTtRQUVDQyxXQUFNQSxLQUFBQSxDQUFDQTtRQXpFUkEsS0FBT0EsT0FBT0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFHMUJBLEtBQVFBLFlBQVlBLEdBQXNCQSxJQUFJQSxLQUFLQSxDQUFjQSxDQUFDQSxDQUFDQTtJQXVFbkVBLENBQUNBO0lBM0RERDtRQUFBQSwwQkFWMEJBO1FBQzNCQSw2Q0FBNkNBO1FBQzdDQSxLQUFLQTtRQUNMQSxFQUFFQTtRQUNGQSxtREFBbURBO1FBQ25EQSxLQUFLQTtRQUVKQTs7VUFFR0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsUUFBUUE7UUFDbENBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxTQUFTQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxRQUFRQTtRQUNwREEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBb0JBLEtBQWtCQTtZQUVyQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUE7Z0JBQ2hCQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTs7WUFFbENBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLEtBQUtBOztZQUV0QkEsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUE7Z0JBQ2hCQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUNoQ0EsQ0FBQ0E7Ozs7QUFYQUE7O0lBZ0JEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsY0FBY0E7UUFDeENBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBLElBQUlBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLFdBQVdBO1FBQzFEQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF1QkEsS0FBaUJBO1lBRXZDQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxLQUFLQTtRQUMxQkEsQ0FBQ0E7Ozs7QUFMQUE7O0lBa0JEQTs7TUFER0E7b0NBQ0hBO1FBRUNFLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBOztRQUVwQkEsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsTUFBTUE7UUFDekNBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBO1lBQ2xDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUNqQ0EsQ0FBQ0E7O0lBT0RGOzs7O01BREdBO29EQUNIQSxVQUErQkEsTUFBYUE7UUFFM0NHLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLHVCQUF1QkEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7SUFDekRBLENBQUNBOztJQUVESCx3Q0FBQUEsVUFBdUJBLFVBQXNCQTtRQUU1Q0ksSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0E7O1FBRWxDQSxPQUFPQSxVQUFVQTtJQUNsQkEsQ0FBQ0E7O0lBR0RKLDJDQUFBQSxVQUEwQkEsVUFBc0JBO1FBRS9DSyxJQUFJQSxLQUFLQSxHQUFVQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxPQUFPQSxDQUFDQSxVQUFVQSxDQUFDQTs7UUFFeERBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLENBQUNBOztRQUVsQ0EsT0FBT0EsVUFBVUE7SUFDbEJBLENBQUNBOztJQUVETCx1REFBQUE7UUFFQ00sSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsTUFBTUE7UUFDekNBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBO1lBQ2xDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxrQkFBa0JBLENBQUNBLENBQUNBLENBQUNBO0lBQzVDQSxDQUFDQTs7SUFFRE4sNENBQUFBLFVBQTJCQSxRQUFrQkE7UUFFNUNPLE1BQU1BLElBQUlBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7SUFDaENBLENBQUNBOztJQUVEUCw4Q0FBQUE7UUFFQ1EsT0FBT0EsSUFBSUEsQ0FBQ0EsU0FBU0E7SUFDdEJBLENBQUNBO0lBQ0ZSLG1CQUFDQTtBQUFEQSxDQUFDQSxFQXhJeUIsY0FBYyxFQXdJdkM7O0FBRUQsNEJBQXFCLENBQUEiLCJmaWxlIjoiY29yZS9iYXNlL1N1Yk1lc2hCYXNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElBbmltYXRvclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2FuaW1hdG9ycy9JQW5pbWF0b3JcIik7XG5pbXBvcnQgTWF0cml4M0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBVVlRyYW5zZm9ybVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9VVlRyYW5zZm9ybVwiKTtcbmltcG9ydCBOYW1lZEFzc2V0QmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvTmFtZWRBc3NldEJhc2VcIik7XG5pbXBvcnQgSVJlbmRlcmFibGVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvSVJlbmRlcmFibGVcIik7XG5pbXBvcnQgSVJlbmRlcmVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvSVJlbmRlcmVyXCIpO1xuaW1wb3J0IENhbWVyYVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvQ2FtZXJhXCIpO1xuaW1wb3J0IE1lc2hcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvTWVzaFwiKTtcbmltcG9ydCBBYnN0cmFjdE1ldGhvZEVycm9yXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQWJzdHJhY3RNZXRob2RFcnJvclwiKTtcbmltcG9ydCBNYXRlcmlhbEJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvTWF0ZXJpYWxCYXNlXCIpO1xuXG4vKipcbiAqIFN1Yk1lc2hCYXNlIHdyYXBzIGEgVHJpYW5nbGVTdWJHZW9tZXRyeSBhcyBhIHNjZW5lIGdyYXBoIGluc3RhbnRpYXRpb24uIEEgU3ViTWVzaEJhc2UgaXMgb3duZWQgYnkgYSBNZXNoIG9iamVjdC5cbiAqXG4gKlxuICogQHNlZSBhd2F5LmJhc2UuVHJpYW5nbGVTdWJHZW9tZXRyeVxuICogQHNlZSBhd2F5LmVudGl0aWVzLk1lc2hcbiAqXG4gKiBAY2xhc3MgYXdheS5iYXNlLlN1Yk1lc2hCYXNlXG4gKi9cbmNsYXNzIFN1Yk1lc2hCYXNlIGV4dGVuZHMgTmFtZWRBc3NldEJhc2Vcbntcblx0cHVibGljIF9wUGFyZW50TWVzaDpNZXNoO1xuXHRwdWJsaWMgX3V2VHJhbnNmb3JtOlVWVHJhbnNmb3JtO1xuXG5cdHB1YmxpYyBfaUluZGV4Om51bWJlciA9IDA7XG5cblx0cHVibGljIF9tYXRlcmlhbDpNYXRlcmlhbEJhc2U7XG5cdHByaXZhdGUgX3JlbmRlcmFibGVzOkFycmF5PElSZW5kZXJhYmxlPiA9IG5ldyBBcnJheTxJUmVuZGVyYWJsZT4oKTtcblxuXHQvL1RPRE8gdGVzdCBzaGFkZXIgcGlja2luZ1xuLy9cdFx0cHVibGljIGdldCBzaGFkZXJQaWNraW5nRGV0YWlscygpOmJvb2xlYW5cbi8vXHRcdHtcbi8vXG4vL1x0XHRcdHJldHVybiB0aGlzLnNvdXJjZUVudGl0eS5zaGFkZXJQaWNraW5nRGV0YWlscztcbi8vXHRcdH1cblxuXHQvKipcblx0ICogVGhlIGFuaW1hdG9yIG9iamVjdCB0aGF0IHByb3ZpZGVzIHRoZSBzdGF0ZSBmb3IgdGhlIFRyaWFuZ2xlU3ViTWVzaCdzIGFuaW1hdGlvbi5cblx0ICovXG5cdHB1YmxpYyBnZXQgYW5pbWF0b3IoKTpJQW5pbWF0b3Jcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wUGFyZW50TWVzaC5hbmltYXRvcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWF0ZXJpYWwgdXNlZCB0byByZW5kZXIgdGhlIGN1cnJlbnQgVHJpYW5nbGVTdWJNZXNoLiBJZiBzZXQgdG8gbnVsbCwgaXRzIHBhcmVudCBNZXNoJ3MgbWF0ZXJpYWwgd2lsbCBiZSB1c2VkIGluc3RlYWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1hdGVyaWFsKCk6TWF0ZXJpYWxCYXNlXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWF0ZXJpYWwgfHwgdGhpcy5fcFBhcmVudE1lc2gubWF0ZXJpYWw7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1hdGVyaWFsKHZhbHVlOk1hdGVyaWFsQmFzZSlcblx0e1xuXHRcdGlmICh0aGlzLm1hdGVyaWFsKVxuXHRcdFx0dGhpcy5tYXRlcmlhbC5pUmVtb3ZlT3duZXIodGhpcyk7XG5cblx0XHR0aGlzLl9tYXRlcmlhbCA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMubWF0ZXJpYWwpXG5cdFx0XHR0aGlzLm1hdGVyaWFsLmlBZGRPd25lcih0aGlzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgc2NlbmUgdHJhbnNmb3JtIG9iamVjdCB0aGF0IHRyYW5zZm9ybXMgZnJvbSBtb2RlbCB0byB3b3JsZCBzcGFjZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2NlbmVUcmFuc2Zvcm0oKTpNYXRyaXgzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BQYXJlbnRNZXNoLnNjZW5lVHJhbnNmb3JtO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBlbnRpdHkgdGhhdCB0aGF0IGluaXRpYWxseSBwcm92aWRlZCB0aGUgSVJlbmRlcmFibGUgdG8gdGhlIHJlbmRlciBwaXBlbGluZSAoaWU6IHRoZSBvd25pbmcgTWVzaCBvYmplY3QpLlxuXHQgKi9cblx0cHVibGljIGdldCBwYXJlbnRNZXNoKCk6TWVzaFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BQYXJlbnRNZXNoO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHV2VHJhbnNmb3JtKCk6VVZUcmFuc2Zvcm1cblx0e1xuXHRcdHJldHVybiB0aGlzLl91dlRyYW5zZm9ybSB8fCB0aGlzLl9wUGFyZW50TWVzaC51dlRyYW5zZm9ybTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgdXZUcmFuc2Zvcm0odmFsdWU6VVZUcmFuc2Zvcm0pXG5cdHtcblx0XHR0aGlzLl91dlRyYW5zZm9ybSA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgU3ViTWVzaEJhc2Ugb2JqZWN0XG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHR0aGlzLm1hdGVyaWFsID0gbnVsbDtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fcmVuZGVyYWJsZXMubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKVxuXHRcdFx0dGhpcy5fcmVuZGVyYWJsZXNbaV0uZGlzcG9zZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBjYW1lcmFcblx0ICogQHJldHVybnMge2F3YXkuZ2VvbS5NYXRyaXgzRH1cblx0ICovXG5cdHB1YmxpYyBnZXRSZW5kZXJTY2VuZVRyYW5zZm9ybShjYW1lcmE6Q2FtZXJhKTpNYXRyaXgzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BQYXJlbnRNZXNoLmdldFJlbmRlclNjZW5lVHJhbnNmb3JtKGNhbWVyYSk7XG5cdH1cblxuXHRwdWJsaWMgX2lBZGRSZW5kZXJhYmxlKHJlbmRlcmFibGU6SVJlbmRlcmFibGUpOklSZW5kZXJhYmxlXG5cdHtcblx0XHR0aGlzLl9yZW5kZXJhYmxlcy5wdXNoKHJlbmRlcmFibGUpO1xuXG5cdFx0cmV0dXJuIHJlbmRlcmFibGU7XG5cdH1cblxuXG5cdHB1YmxpYyBfaVJlbW92ZVJlbmRlcmFibGUocmVuZGVyYWJsZTpJUmVuZGVyYWJsZSk6SVJlbmRlcmFibGVcblx0e1xuXHRcdHZhciBpbmRleDpudW1iZXIgPSB0aGlzLl9yZW5kZXJhYmxlcy5pbmRleE9mKHJlbmRlcmFibGUpO1xuXG5cdFx0dGhpcy5fcmVuZGVyYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuXHRcdHJldHVybiByZW5kZXJhYmxlO1xuXHR9XG5cblx0cHVibGljIF9pSW52YWxpZGF0ZVJlbmRlcmFibGVHZW9tZXRyeSgpXG5cdHtcblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX3JlbmRlcmFibGVzLmxlbmd0aDtcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCBsZW47IGkrKylcblx0XHRcdHRoaXMuX3JlbmRlcmFibGVzW2ldLmludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHR9XG5cblx0cHVibGljIF9pQ29sbGVjdFJlbmRlcmFibGUocmVuZGVyZXI6SVJlbmRlcmVyKVxuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdHB1YmxpYyBfaUdldEV4cGxpY2l0TWF0ZXJpYWwoKTpNYXRlcmlhbEJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9tYXRlcmlhbDtcblx0fVxufVxuXG5leHBvcnQgPSBTdWJNZXNoQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/core/base/SubMeshBase.ts b/lib/core/base/SubMeshBase.ts new file mode 100644 index 00000000..248bb97a --- /dev/null +++ b/lib/core/base/SubMeshBase.ts @@ -0,0 +1,159 @@ +import IAnimator = require("awayjs-core/lib/animators/IAnimator"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import Mesh = require("awayjs-core/lib/entities/Mesh"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * SubMeshBase wraps a TriangleSubGeometry as a scene graph instantiation. A SubMeshBase is owned by a Mesh object. + * + * + * @see away.base.TriangleSubGeometry + * @see away.entities.Mesh + * + * @class away.base.SubMeshBase + */ +class SubMeshBase extends NamedAssetBase +{ + public _pParentMesh:Mesh; + public _uvTransform:UVTransform; + + public _iIndex:number = 0; + + public _material:MaterialBase; + private _renderables:Array = new Array(); + + //TODO test shader picking +// public get shaderPickingDetails():boolean +// { +// +// return this.sourceEntity.shaderPickingDetails; +// } + + /** + * The animator object that provides the state for the TriangleSubMesh's animation. + */ + public get animator():IAnimator + { + return this._pParentMesh.animator; + } + + /** + * The material used to render the current TriangleSubMesh. If set to null, its parent Mesh's material will be used instead. + */ + public get material():MaterialBase + { + return this._material || this._pParentMesh.material; + } + + public set material(value:MaterialBase) + { + if (this.material) + this.material.iRemoveOwner(this); + + this._material = value; + + if (this.material) + this.material.iAddOwner(this); + } + + /** + * The scene transform object that transforms from model to world space. + */ + public get sceneTransform():Matrix3D + { + return this._pParentMesh.sceneTransform; + } + + /** + * The entity that that initially provided the IRenderable to the render pipeline (ie: the owning Mesh object). + */ + public get parentMesh():Mesh + { + return this._pParentMesh; + } + + /** + * + */ + public get uvTransform():UVTransform + { + return this._uvTransform || this._pParentMesh.uvTransform; + } + + public set uvTransform(value:UVTransform) + { + this._uvTransform = value; + } + + /** + * Creates a new SubMeshBase object + */ + constructor() + { + super(); + } + + /** + * + */ + public dispose() + { + this.material = null; + + var len:number = this._renderables.length; + for (var i:number = 0; i < len; i++) + this._renderables[i].dispose(); + } + + /** + * + * @param camera + * @returns {away.geom.Matrix3D} + */ + public getRenderSceneTransform(camera:Camera):Matrix3D + { + return this._pParentMesh.getRenderSceneTransform(camera); + } + + public _iAddRenderable(renderable:IRenderable):IRenderable + { + this._renderables.push(renderable); + + return renderable; + } + + + public _iRemoveRenderable(renderable:IRenderable):IRenderable + { + var index:number = this._renderables.indexOf(renderable); + + this._renderables.splice(index, 1); + + return renderable; + } + + public _iInvalidateRenderableGeometry() + { + var len:number = this._renderables.length; + for (var i:number = 0; i < len; i++) + this._renderables[i].invalidateGeometry(); + } + + public _iCollectRenderable(renderer:IRenderer) + { + throw new AbstractMethodError(); + } + + public _iGetExplicitMaterial():MaterialBase + { + return this._material; + } +} + +export = SubMeshBase; \ No newline at end of file diff --git a/lib/core/base/TriangleCulling.js b/lib/core/base/TriangleCulling.js new file mode 100755 index 00000000..7d89fab3 --- /dev/null +++ b/lib/core/base/TriangleCulling.js @@ -0,0 +1,35 @@ +/** +* Defines codes for culling algorithms that determine which triangles not to +* render when drawing triangle paths. +* +*

The terms POSITIVE and NEGATIVE refer to the +* sign of a triangle's normal along the z-axis. The normal is a 3D vector +* that is perpendicular to the surface of the triangle.

+* +*

A triangle whose vertices 0, 1, and 2 are arranged in a clockwise order +* has a positive normal value. That is, its normal points in a positive +* z-axis direction, away from the current view point. When the +* TriangleCulling.POSITIVE algorithm is used, triangles with +* positive normals are not rendered. Another term for this is backface +* culling.

+* +*

A triangle whose vertices are arranged in a counter-clockwise order has +* a negative normal value. That is, its normal points in a negative z-axis +* direction, toward the current view point. When the +* TriangleCulling.NEGATIVE algorithm is used, triangles with +* negative normals will not be rendered.

+*/ +var TriangleCulling = (function () { + function TriangleCulling() { + } + TriangleCulling.NEGATIVE = "negative"; + + TriangleCulling.NONE = "none"; + + TriangleCulling.POSITIVE = "positive"; + return TriangleCulling; +})(); + +module.exports = TriangleCulling; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9UcmlhbmdsZUN1bGxpbmcudHMiXSwibmFtZXMiOlsiVHJpYW5nbGVDdWxsaW5nIiwiVHJpYW5nbGVDdWxsaW5nLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvQkc7QUFDSDtJQUFBQTtJQWlCQUMsQ0FBQ0E7QUFBQUQsSUFaQUEsMkJBQWdDQSxVQUFVQTs7SUFLMUNBLHVCQUE0QkEsTUFBTUE7O0lBTWxDQSwyQkFBZ0NBLFVBQVVBO0lBQzNDQSx1QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvVHJpYW5nbGVDdWxsaW5nLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZWZpbmVzIGNvZGVzIGZvciBjdWxsaW5nIGFsZ29yaXRobXMgdGhhdCBkZXRlcm1pbmUgd2hpY2ggdHJpYW5nbGVzIG5vdCB0b1xuICogcmVuZGVyIHdoZW4gZHJhd2luZyB0cmlhbmdsZSBwYXRocy5cbiAqXG4gKiA8cD4gVGhlIHRlcm1zIDxjb2RlPlBPU0lUSVZFPC9jb2RlPiBhbmQgPGNvZGU+TkVHQVRJVkU8L2NvZGU+IHJlZmVyIHRvIHRoZVxuICogc2lnbiBvZiBhIHRyaWFuZ2xlJ3Mgbm9ybWFsIGFsb25nIHRoZSB6LWF4aXMuIFRoZSBub3JtYWwgaXMgYSAzRCB2ZWN0b3JcbiAqIHRoYXQgaXMgcGVycGVuZGljdWxhciB0byB0aGUgc3VyZmFjZSBvZiB0aGUgdHJpYW5nbGUuIDwvcD5cbiAqXG4gKiA8cD4gQSB0cmlhbmdsZSB3aG9zZSB2ZXJ0aWNlcyAwLCAxLCBhbmQgMiBhcmUgYXJyYW5nZWQgaW4gYSBjbG9ja3dpc2Ugb3JkZXJcbiAqIGhhcyBhIHBvc2l0aXZlIG5vcm1hbCB2YWx1ZS4gVGhhdCBpcywgaXRzIG5vcm1hbCBwb2ludHMgaW4gYSBwb3NpdGl2ZVxuICogei1heGlzIGRpcmVjdGlvbiwgYXdheSBmcm9tIHRoZSBjdXJyZW50IHZpZXcgcG9pbnQuIFdoZW4gdGhlXG4gKiA8Y29kZT5UcmlhbmdsZUN1bGxpbmcuUE9TSVRJVkU8L2NvZGU+IGFsZ29yaXRobSBpcyB1c2VkLCB0cmlhbmdsZXMgd2l0aFxuICogcG9zaXRpdmUgbm9ybWFscyBhcmUgbm90IHJlbmRlcmVkLiBBbm90aGVyIHRlcm0gZm9yIHRoaXMgaXMgYmFja2ZhY2VcbiAqIGN1bGxpbmcuIDwvcD5cbiAqXG4gKiA8cD4gQSB0cmlhbmdsZSB3aG9zZSB2ZXJ0aWNlcyBhcmUgYXJyYW5nZWQgaW4gYSBjb3VudGVyLWNsb2Nrd2lzZSBvcmRlciBoYXNcbiAqIGEgbmVnYXRpdmUgbm9ybWFsIHZhbHVlLiBUaGF0IGlzLCBpdHMgbm9ybWFsIHBvaW50cyBpbiBhIG5lZ2F0aXZlIHotYXhpc1xuICogZGlyZWN0aW9uLCB0b3dhcmQgdGhlIGN1cnJlbnQgdmlldyBwb2ludC4gV2hlbiB0aGVcbiAqIDxjb2RlPlRyaWFuZ2xlQ3VsbGluZy5ORUdBVElWRTwvY29kZT4gYWxnb3JpdGhtIGlzIHVzZWQsIHRyaWFuZ2xlcyB3aXRoXG4gKiBuZWdhdGl2ZSBub3JtYWxzIHdpbGwgbm90IGJlIHJlbmRlcmVkLiA8L3A+XG4gKi9cbmNsYXNzIFRyaWFuZ2xlQ3VsbGluZ1xue1xuXHQvKipcblx0ICogU3BlY2lmaWVzIGN1bGxpbmcgb2YgYWxsIHRyaWFuZ2xlcyBmYWNpbmcgdG93YXJkIHRoZSBjdXJyZW50IHZpZXcgcG9pbnQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5FR0FUSVZFOnN0cmluZyA9IFwibmVnYXRpdmVcIjtcblxuXHQvKipcblx0ICogU3BlY2lmaWVzIG5vIGN1bGxpbmcuIEFsbCB0cmlhbmdsZXMgaW4gdGhlIHBhdGggYXJlIHJlbmRlcmVkLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBOT05FOnN0cmluZyA9IFwibm9uZVwiO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgY3VsbGluZyBvZiBhbGwgdHJpYW5nbGVzIGZhY2luZyBhd2F5IGZyb20gdGhlIGN1cnJlbnQgdmlld1xuXHQgKiBwb2ludC4gVGhpcyBpcyBhbHNvIGtub3duIGFzIGJhY2tmYWNlIGN1bGxpbmcuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFBPU0lUSVZFOnN0cmluZyA9IFwicG9zaXRpdmVcIjtcbn1cblxuZXhwb3J0ID0gVHJpYW5nbGVDdWxsaW5nOyJdfQ== \ No newline at end of file diff --git a/src/away/core/base/TriangleCulling.ts b/lib/core/base/TriangleCulling.ts similarity index 66% rename from src/away/core/base/TriangleCulling.ts rename to lib/core/base/TriangleCulling.ts index db056d02..dcda6506 100644 --- a/src/away/core/base/TriangleCulling.ts +++ b/lib/core/base/TriangleCulling.ts @@ -1,5 +1,3 @@ -/// - /** * Defines codes for culling algorithms that determine which triangles not to * render when drawing triangle paths. @@ -21,24 +19,23 @@ * TriangleCulling.NEGATIVE algorithm is used, triangles with * negative normals will not be rendered.

*/ -module away.base +class TriangleCulling { - export class TriangleCulling - { - /** - * Specifies culling of all triangles facing toward the current view point. - */ - public static NEGATIVE:string = "negative"; + /** + * Specifies culling of all triangles facing toward the current view point. + */ + public static NEGATIVE:string = "negative"; - /** - * Specifies no culling. All triangles in the path are rendered. - */ - public static NONE:string = "none"; + /** + * Specifies no culling. All triangles in the path are rendered. + */ + public static NONE:string = "none"; - /** - * Specifies culling of all triangles facing away from the current view - * point. This is also known as backface culling. - */ - public static POSITIVE:string = "positive"; - } + /** + * Specifies culling of all triangles facing away from the current view + * point. This is also known as backface culling. + */ + public static POSITIVE:string = "positive"; } + +export = TriangleCulling; \ No newline at end of file diff --git a/lib/core/base/TriangleSubGeometry.js b/lib/core/base/TriangleSubGeometry.js new file mode 100755 index 00000000..1140f01b --- /dev/null +++ b/lib/core/base/TriangleSubGeometry.js @@ -0,0 +1,1453 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +var TriangleSubMesh = require("awayjs-core/lib/core/base/TriangleSubMesh"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** +* @class away.base.TriangleSubGeometry +*/ +var TriangleSubGeometry = (function (_super) { + __extends(TriangleSubGeometry, _super); + /** + * + */ + function TriangleSubGeometry(concatenatedArrays) { + _super.call(this, concatenatedArrays); + this._positionsDirty = true; + this._faceNormalsDirty = true; + this._faceTangentsDirty = true; + this._vertexNormalsDirty = true; + this._vertexTangentsDirty = true; + this._uvsDirty = true; + this._secondaryUVsDirty = true; + this._jointIndicesDirty = true; + this._jointWeightsDirty = true; + this._concatenateArrays = true; + this._autoDeriveNormals = true; + this._autoDeriveTangents = true; + this._autoDeriveUVs = false; + this._useFaceWeights = false; + this._scaleU = 1; + this._scaleV = 1; + + this._pSubMeshClass = TriangleSubMesh; + } + Object.defineProperty(TriangleSubGeometry.prototype, "scaleU", { + /** + * + */ + get: function () { + return this._scaleU; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "scaleV", { + /** + * + */ + get: function () { + return this._scaleV; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "useCondensedIndices", { + /** + * Offers the option of enabling GPU accelerated animation on skeletons larger than 32 joints + * by condensing the number of joint index values required per mesh. Only applicable to + * skeleton animations that utilise more than one mesh object. Defaults to false. + */ + get: function () { + return this._useCondensedIndices; + }, + set: function (value) { + if (this._useCondensedIndices == value) + return; + + this._useCondensedIndices = value; + + this.notifyJointIndicesUpdate(); + }, + enumerable: true, + configurable: true + }); + + + TriangleSubGeometry.prototype._pUpdateStrideOffset = function () { + if (this._concatenateArrays) { + this._pOffset[TriangleSubGeometry.VERTEX_DATA] = 0; + + //always have positions + this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; + var stride = 3; + + if (this._vertexNormals != null) { + this._pOffset[TriangleSubGeometry.NORMAL_DATA] = stride; + stride += 3; + } + + if (this._vertexTangents != null) { + this._pOffset[TriangleSubGeometry.TANGENT_DATA] = stride; + stride += 3; + } + + if (this._uvs != null) { + this._pOffset[TriangleSubGeometry.UV_DATA] = stride; + stride += 2; + } + + if (this._secondaryUVs != null) { + this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; + stride += 2; + } + + if (this._jointIndices != null) { + this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; + stride += this._jointsPerVertex; + } + + if (this._jointWeights != null) { + this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; + stride += this._jointsPerVertex; + } + + this._pStride[TriangleSubGeometry.VERTEX_DATA] = stride; + this._pStride[TriangleSubGeometry.POSITION_DATA] = stride; + this._pStride[TriangleSubGeometry.NORMAL_DATA] = stride; + this._pStride[TriangleSubGeometry.TANGENT_DATA] = stride; + this._pStride[TriangleSubGeometry.UV_DATA] = stride; + this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; + this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; + this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; + + var len = this._pNumVertices * stride; + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + } else { + this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; + this._pOffset[TriangleSubGeometry.NORMAL_DATA] = 0; + this._pOffset[TriangleSubGeometry.TANGENT_DATA] = 0; + this._pOffset[TriangleSubGeometry.UV_DATA] = 0; + this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = 0; + this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = 0; + this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = 0; + + this._pStride[TriangleSubGeometry.POSITION_DATA] = 3; + this._pStride[TriangleSubGeometry.NORMAL_DATA] = 3; + this._pStride[TriangleSubGeometry.TANGENT_DATA] = 3; + this._pStride[TriangleSubGeometry.UV_DATA] = 2; + this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = 2; + this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = this._jointsPerVertex; + this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = this._jointsPerVertex; + } + + this._pStrideOffsetDirty = false; + }; + + Object.defineProperty(TriangleSubGeometry.prototype, "jointsPerVertex", { + /** + * + */ + get: function () { + return this._jointsPerVertex; + }, + set: function (value) { + if (this._jointsPerVertex == value) + return; + + this._jointsPerVertex = value; + + this._pStrideOffsetDirty = true; + + if (this._pConcatenateArrays) + this._pNotifyVerticesUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveUVs", { + /** + * Defines whether a UV buffer should be automatically generated to contain dummy UV coordinates. + * Set to true if a geometry lacks UV data but uses a material that requires it, or leave as false + * in cases where UV data is explicitly defined or the material does not require UV data. + */ + get: function () { + return this._autoDeriveUVs; + }, + set: function (value) { + if (this._autoDeriveUVs == value) + return; + + this._autoDeriveUVs = value; + + if (value) + this.notifyUVsUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveNormals", { + /** + * True if the vertex normals should be derived from the geometry, false if the vertex normals are set + * explicitly. + */ + get: function () { + return this._autoDeriveNormals; + }, + set: function (value) { + if (this._autoDeriveNormals == value) + return; + + this._autoDeriveNormals = value; + + if (value) + this.notifyNormalsUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "autoDeriveTangents", { + /** + * True if the vertex tangents should be derived from the geometry, false if the vertex normals are set + * explicitly. + */ + get: function () { + return this._autoDeriveTangents; + }, + set: function (value) { + if (this._autoDeriveTangents == value) + return; + + this._autoDeriveTangents = value; + + if (value) + this.notifyTangentsUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "vertices", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._positions); + + if (this._vertexNormalsDirty) + this.updateVertexNormals(this._vertexNormals); + + if (this._vertexTangentsDirty) + this.updateVertexTangents(this._vertexTangents); + + if (this._uvsDirty) + this.updateUVs(this._uvs); + + if (this._secondaryUVsDirty) + this.updateSecondaryUVs(this._secondaryUVs); + + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + if (this._jointWeightsDirty) + this.updateJointWeights(this._jointWeights); + + return this._pVertices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "positions", { + /** + * + */ + get: function () { + if (this._positionsDirty) + this.updatePositions(this._positions); + + return this._positions; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "vertexNormals", { + /** + * + */ + get: function () { + if (this._vertexNormalsDirty) + this.updateVertexNormals(this._vertexNormals); + + return this._vertexNormals; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "vertexTangents", { + /** + * + */ + get: function () { + if (this._vertexTangentsDirty) + this.updateVertexTangents(this._vertexTangents); + + return this._vertexTangents; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "faceNormals", { + /** + * The raw data of the face normals, in the same order as the faces are listed in the index list. + */ + get: function () { + if (this._faceNormalsDirty) + this.updateFaceNormals(); + + return this._faceNormals; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "faceTangents", { + /** + * The raw data of the face tangets, in the same order as the faces are listed in the index list. + */ + get: function () { + if (this._faceTangentsDirty) + this.updateFaceTangents(); + + return this._faceTangents; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "uvs", { + /** + * + */ + get: function () { + if (this._uvsDirty) + this.updateUVs(this._uvs); + + return this._uvs; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "secondaryUVs", { + /** + * + */ + get: function () { + if (this._secondaryUVsDirty) + this.updateSecondaryUVs(this._secondaryUVs); + + return this._secondaryUVs; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "jointIndices", { + /** + * + */ + get: function () { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + if (this._useCondensedIndices) + return this._condensedJointIndices; + + return this._jointIndices; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "jointWeights", { + /** + * + */ + get: function () { + if (this._jointWeightsDirty) + this.updateJointWeights(this._jointWeights); + + return this._jointWeights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "useFaceWeights", { + /** + * Indicates whether or not to take the size of faces into account when auto-deriving vertex normals and tangents. + */ + get: function () { + return this._useFaceWeights; + }, + set: function (value) { + if (this._useFaceWeights == value) + return; + + this._useFaceWeights = value; + + if (this._autoDeriveNormals) + this.notifyNormalsUpdate(); + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + this._faceNormalsDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TriangleSubGeometry.prototype, "numCondensedJoints", { + get: function () { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + return this._numCondensedJoints; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubGeometry.prototype, "condensedIndexLookUp", { + get: function () { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + return this._condensedIndexLookUp; + }, + enumerable: true, + configurable: true + }); + + TriangleSubGeometry.prototype.getBoundingPositions = function () { + if (this._positionsDirty) + this.updatePositions(this._positions); + + return this._positions; + }; + + /** + * + */ + TriangleSubGeometry.prototype.updatePositions = function (values) { + var i; + var index; + var stride; + var positions; + + this._positions = values; + + if (this._positions == null) + this._positions = new Array(); + + this._pNumVertices = this._positions.length / 3; + + if (this._concatenateArrays) { + var len = this._pNumVertices * this.getStride(TriangleSubGeometry.VERTEX_DATA); + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + + i = 0; + index = this.getOffset(TriangleSubGeometry.POSITION_DATA); + stride = this.getStride(TriangleSubGeometry.POSITION_DATA); + positions = this._pVertices; + + while (i < values.length) { + positions[index] = values[i++]; + positions[index + 1] = values[i++]; + positions[index + 2] = values[i++]; + index += stride; + } + } + + if (this._autoDeriveNormals) + this.notifyNormalsUpdate(); + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + if (this._autoDeriveUVs) + this.notifyUVsUpdate(); + + this.pInvalidateBounds(); + + this.notifyPositionsUpdate(); + + this._positionsDirty = false; + }; + + /** + * Updates the vertex normals based on the geometry. + */ + TriangleSubGeometry.prototype.updateVertexNormals = function (values) { + var i; + var index; + var offset; + var stride; + var normals; + + if (!this._autoDeriveNormals) { + if ((this._vertexNormals == null || values == null) && (this._vertexNormals != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + this._vertexNormals = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); + normals = this._pVertices; + + while (i < values.length) { + normals[index] = values[i++]; + normals[index + 1] = values[i++]; + normals[index + 2] = values[i++]; + index += stride; + } + } + } else { + if (this._vertexNormals == null) { + this._vertexNormals = new Array(this._positions.length); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + if (this._faceNormalsDirty) + this.updateFaceNormals(); + + offset = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); + + //autoderived normals + normals = this._concatenateArrays ? this._pVertices : this._vertexNormals; + + var f1 = 0; + var f2 = 1; + var f3 = 2; + + index = offset; + + //clear normal values + var lenV = normals.length; + while (index < lenV) { + normals[index] = 0; + normals[index + 1] = 0; + normals[index + 2] = 0; + index += stride; + } + + var k = 0; + var lenI = this._pIndices.length; + var weight; + + i = 0; + + while (i < lenI) { + weight = this._useFaceWeights ? this._faceWeights[k++] : 1; + index = offset + this._pIndices[i++] * stride; + normals[index] += this._faceNormals[f1] * weight; + normals[index + 1] += this._faceNormals[f2] * weight; + normals[index + 2] += this._faceNormals[f3] * weight; + index = offset + this._pIndices[i++] * stride; + normals[index] += this._faceNormals[f1] * weight; + normals[index + 1] += this._faceNormals[f2] * weight; + normals[index + 2] += this._faceNormals[f3] * weight; + index = offset + this._pIndices[i++] * stride; + normals[index] += this._faceNormals[f1] * weight; + normals[index + 1] += this._faceNormals[f2] * weight; + normals[index + 2] += this._faceNormals[f3] * weight; + f1 += 3; + f2 += 3; + f3 += 3; + } + + i = 0; + index = offset; + + while (index < lenV) { + var vx = normals[index]; + var vy = normals[index + 1]; + var vz = normals[index + 2]; + var d = 1.0 / Math.sqrt(vx * vx + vy * vy + vz * vz); + + if (this._concatenateArrays) { + this._vertexNormals[i++] = normals[index] = vx * d; + this._vertexNormals[i++] = normals[index + 1] = vy * d; + this._vertexNormals[i++] = normals[index + 2] = vz * d; + } else { + normals[index] = vx * d; + normals[index + 1] = vy * d; + normals[index + 2] = vz * d; + } + + index += stride; + } + } + + this.notifyNormalsUpdate(); + + this._vertexNormalsDirty = false; + }; + + /** + * Updates the vertex tangents based on the geometry. + */ + TriangleSubGeometry.prototype.updateVertexTangents = function (values) { + var i; + var index; + var offset; + var stride; + var tangents; + + if (!this._autoDeriveTangents) { + if ((this._vertexTangents == null || values == null) && (this._vertexTangents != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + this._vertexTangents = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); + tangents = this._pVertices; + + while (i < values.length) { + tangents[index] = values[i++]; + tangents[index + 1] = values[i++]; + tangents[index + 2] = values[i++]; + index += stride; + } + } + } else { + if (this._vertexTangents == null) { + this._vertexTangents = new Array(this._positions.length); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + if (this._faceTangentsDirty) + this.updateFaceTangents(); + + offset = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); + + //autoderived tangents + tangents = this._concatenateArrays ? this._pVertices : this._vertexTangents; + + index = offset; + + //clear tangent values + var lenV = tangents.length; + while (index < lenV) { + tangents[index] = 0; + tangents[index + 1] = 0; + tangents[index + 2] = 0; + + index += stride; + } + + var k = 0; + var weight; + var f1 = 0; + var f2 = 1; + var f3 = 2; + + i = 0; + + //collect face tangents + var lenI = this._pIndices.length; + while (i < lenI) { + weight = this._useFaceWeights ? this._faceWeights[k++] : 1; + index = offset + this._pIndices[i++] * stride; + tangents[index++] += this._faceTangents[f1] * weight; + tangents[index++] += this._faceTangents[f2] * weight; + tangents[index] += this._faceTangents[f3] * weight; + index = offset + this._pIndices[i++] * stride; + tangents[index++] += this._faceTangents[f1] * weight; + tangents[index++] += this._faceTangents[f2] * weight; + tangents[index] += this._faceTangents[f3] * weight; + index = offset + this._pIndices[i++] * stride; + tangents[index++] += this._faceTangents[f1] * weight; + tangents[index++] += this._faceTangents[f2] * weight; + tangents[index] += this._faceTangents[f3] * weight; + f1 += 3; + f2 += 3; + f3 += 3; + } + + i = 0; + index = offset; + + while (index < lenV) { + var vx = tangents[index]; + var vy = tangents[index + 1]; + var vz = tangents[index + 2]; + var d = 1.0 / Math.sqrt(vx * vx + vy * vy + vz * vz); + + if (this._concatenateArrays) { + this._vertexTangents[i++] = tangents[index] = vx * d; + this._vertexTangents[i++] = tangents[index + 1] = vy * d; + this._vertexTangents[i++] = tangents[index + 2] = vz * d; + } else { + tangents[index] = vx * d; + tangents[index + 1] = vy * d; + tangents[index + 2] = vz * d; + } + + index += stride; + } + } + + this.notifyTangentsUpdate(); + + this._vertexTangentsDirty = false; + }; + + /** + * Updates the uvs based on the geometry. + */ + TriangleSubGeometry.prototype.updateUVs = function (values) { + var i; + var index; + var offset; + var stride; + var uvs; + + if (!this._autoDeriveUVs) { + if ((this._uvs == null || values == null) && (this._uvs != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + this._uvs = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.UV_DATA); + stride = this.getStride(TriangleSubGeometry.UV_DATA); + uvs = this._pVertices; + + while (i < values.length) { + uvs[index] = values[i++]; + uvs[index + 1] = values[i++]; + index += stride; + } + } + } else { + if (this._uvs == null) { + this._uvs = new Array(this._positions.length * 2 / 3); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + offset = this.getOffset(TriangleSubGeometry.UV_DATA); + stride = this.getStride(TriangleSubGeometry.UV_DATA); + + //autoderived uvs + uvs = this._concatenateArrays ? this._pVertices : this._uvs; + + i = 0; + index = offset; + var uvIdx = 0; + + //clear uv values + var lenV = uvs.length; + while (index < lenV) { + if (this._concatenateArrays) { + this._uvs[i++] = uvs[index] = uvIdx * .5; + this._uvs[i++] = uvs[index + 1] = 1.0 - (uvIdx & 1); + } else { + uvs[index] = uvIdx * .5; + uvs[index + 1] = 1.0 - (uvIdx & 1); + } + + if (++uvIdx == 3) + uvIdx = 0; + + index += stride; + } + } + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + this.notifyUVsUpdate(); + + this._uvsDirty = false; + }; + + /** + * Updates the secondary uvs based on the geometry. + */ + TriangleSubGeometry.prototype.updateSecondaryUVs = function (values) { + var i; + var index; + var offset; + var stride; + var uvs; + + if (this._concatenateArrays && (this._secondaryUVs == null || values == null) && (this._secondaryUVs != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._secondaryUVs = values; + + if (values != null && this._concatenateArrays) { + offset = this.getOffset(TriangleSubGeometry.SECONDARY_UV_DATA); + stride = this.getStride(TriangleSubGeometry.SECONDARY_UV_DATA); + + i = 0; + index = offset; + uvs = this._pVertices; + + while (i < values.length) { + uvs[index] = values[i++]; + uvs[index + 1] = values[i++]; + index += stride; + } + } + + this.notifySecondaryUVsUpdate(); + + this._secondaryUVsDirty = false; + }; + + /** + * Updates the joint indices + */ + TriangleSubGeometry.prototype.updateJointIndices = function (values) { + var i; + var j; + var index; + var offset; + var stride; + var jointIndices; + + if (this._concatenateArrays && (this._jointIndices == null || values == null) && (this._jointIndices != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._jointIndices = values; + + if (values != null) { + offset = this.getOffset(TriangleSubGeometry.JOINT_INDEX_DATA); + stride = this.getStride(TriangleSubGeometry.JOINT_INDEX_DATA); + if (this._useCondensedIndices) { + i = 0; + j = 0; + index = offset; + jointIndices = this._concatenateArrays ? this._pVertices : this._condensedJointIndices; + var oldIndex; + var newIndex = 0; + var dic = new Object(); + + if (!this._concatenateArrays) + this._condensedJointIndices = new Array(values.length); + + this._condensedIndexLookUp = new Array(); + + while (i < values.length) { + for (j = 0; j < this._jointsPerVertex; j++) { + oldIndex = values[i++]; + + // if we encounter a new index, assign it a new condensed index + if (dic[oldIndex] == undefined) { + dic[oldIndex] = newIndex * 3; //3 required for the three vectors that store the matrix + this._condensedIndexLookUp[newIndex++] = oldIndex; + } + jointIndices[index + j] = dic[oldIndex]; + } + index += stride; + } + this._numCondensedJoints = newIndex; + } else if (this._concatenateArrays) { + i = 0; + index = offset; + jointIndices = this._pVertices; + + while (i < values.length) { + j = 0; + while (j < this._jointsPerVertex) + jointIndices[index + j++] = values[i++]; + index += stride; + } + } + } + + this.notifyJointIndicesUpdate(); + + this._jointIndicesDirty = false; + }; + + /** + * Updates the joint weights. + */ + TriangleSubGeometry.prototype.updateJointWeights = function (values) { + var i; + var j; + var index; + var offset; + var stride; + var jointWeights; + + if (this._concatenateArrays && (this._jointWeights == null || values == null) && (this._jointWeights != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._jointWeights = values; + + if (values != null && this._concatenateArrays) { + offset = this.getOffset(TriangleSubGeometry.JOINT_WEIGHT_DATA); + stride = this.getStride(TriangleSubGeometry.JOINT_WEIGHT_DATA); + + i = 0; + index = offset; + jointWeights = this._pVertices; + + while (i < values.length) { + j = 0; + while (j < this._jointsPerVertex) + jointWeights[index + j++] = values[i++]; + index += stride; + } + } + + this.notifyJointWeightsUpdate(); + + this._jointWeightsDirty = false; + }; + + /** + * + */ + TriangleSubGeometry.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + this._positions = null; + this._vertexNormals = null; + this._vertexTangents = null; + this._uvs = null; + this._secondaryUVs = null; + this._jointIndices = null; + this._jointWeights = null; + + this._faceNormals = null; + this._faceWeights = null; + this._faceTangents = null; + }; + + /** + * Updates the face indices of the TriangleSubGeometry. + * + * @param indices The face indices to upload. + */ + TriangleSubGeometry.prototype.updateIndices = function (indices) { + _super.prototype.updateIndices.call(this, indices); + + this._faceNormalsDirty = true; + + if (this._autoDeriveNormals) + this._vertexNormalsDirty = true; + + if (this._autoDeriveTangents) + this._vertexTangentsDirty = true; + + if (this._autoDeriveUVs) + this._uvsDirty = true; + }; + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + TriangleSubGeometry.prototype.clone = function () { + var clone = new TriangleSubGeometry(this._concatenateArrays); + clone.updateIndices(this._pIndices.concat()); + clone.updatePositions(this._positions.concat()); + + if (this._vertexNormals && !this._autoDeriveNormals) + clone.updateVertexNormals(this._vertexNormals.concat()); + else + clone.updateVertexNormals(null); + + if (this._uvs && !this._autoDeriveUVs) + clone.updateUVs(this._uvs.concat()); + else + clone.updateUVs(null); + + if (this._vertexTangents && !this._autoDeriveTangents) + clone.updateVertexTangents(this._vertexTangents.concat()); + else + clone.updateVertexTangents(null); + + if (this._secondaryUVs) + clone.updateSecondaryUVs(this._secondaryUVs.concat()); + + if (this._jointIndices) { + clone.jointsPerVertex = this._jointsPerVertex; + clone.updateJointIndices(this._jointIndices.concat()); + } + + if (this._jointWeights) + clone.updateJointWeights(this._jointWeights.concat()); + + return clone; + }; + + TriangleSubGeometry.prototype.scaleUV = function (scaleU, scaleV) { + if (typeof scaleU === "undefined") { scaleU = 1; } + if (typeof scaleV === "undefined") { scaleV = 1; } + var index; + var offset; + var stride; + var uvs; + + uvs = this._uvs; + + var ratioU = scaleU / this._scaleU; + var ratioV = scaleV / this._scaleV; + + this._scaleU = scaleU; + this._scaleV = scaleV; + + var len = uvs.length; + + offset = 0; + stride = 2; + + index = offset; + + while (index < len) { + uvs[index] *= ratioU; + uvs[index + 1] *= ratioV; + index += stride; + } + + this.notifyUVsUpdate(); + }; + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + TriangleSubGeometry.prototype.scale = function (scale) { + var i; + var index; + var offset; + var stride; + var positions; + + positions = this._positions; + + var len = positions.length; + + offset = 0; + stride = 3; + + i = 0; + index = offset; + while (i < len) { + positions[index] *= scale; + positions[index + 1] *= scale; + positions[index + 2] *= scale; + + i += 3; + index += stride; + } + + this.notifyPositionsUpdate(); + }; + + TriangleSubGeometry.prototype.applyTransformation = function (transform) { + var positions; + var normals; + var tangents; + + if (this._concatenateArrays) { + positions = this._pVertices; + normals = this._pVertices; + tangents = this._pVertices; + } else { + positions = this._positions; + normals = this._vertexNormals; + tangents = this._vertexTangents; + } + + var len = this._positions.length / 3; + var i; + var i1; + var i2; + var vector = new Vector3D(); + + var bakeNormals = this._vertexNormals != null; + var bakeTangents = this._vertexTangents != null; + var invTranspose; + + if (bakeNormals || bakeTangents) { + invTranspose = transform.clone(); + invTranspose.invert(); + invTranspose.transpose(); + } + + var vi0 = this.getOffset(TriangleSubGeometry.POSITION_DATA); + var ni0 = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + var ti0 = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + + var vStride = this.getStride(TriangleSubGeometry.POSITION_DATA); + var nStride = this.getStride(TriangleSubGeometry.NORMAL_DATA); + var tStride = this.getStride(TriangleSubGeometry.TANGENT_DATA); + + for (i = 0; i < len; ++i) { + i1 = vi0 + 1; + i2 = vi0 + 2; + + // bake position + vector.x = positions[vi0]; + vector.y = positions[i1]; + vector.z = positions[i2]; + vector = transform.transformVector(vector); + positions[vi0] = vector.x; + positions[i1] = vector.y; + positions[i2] = vector.z; + vi0 += vStride; + + // bake normal + if (bakeNormals) { + i1 = ni0 + 1; + i2 = ni0 + 2; + vector.x = normals[ni0]; + vector.y = normals[i1]; + vector.z = normals[i2]; + vector = invTranspose.deltaTransformVector(vector); + vector.normalize(); + normals[ni0] = vector.x; + normals[i1] = vector.y; + normals[i2] = vector.z; + ni0 += nStride; + } + + // bake tangent + if (bakeTangents) { + i1 = ti0 + 1; + i2 = ti0 + 2; + vector.x = tangents[ti0]; + vector.y = tangents[i1]; + vector.z = tangents[i2]; + vector = invTranspose.deltaTransformVector(vector); + vector.normalize(); + tangents[ti0] = vector.x; + tangents[i1] = vector.y; + tangents[i2] = vector.z; + ti0 += tStride; + } + } + + this.notifyPositionsUpdate(); + this.notifyNormalsUpdate(); + this.notifyTangentsUpdate(); + }; + + /** + * Updates the tangents for each face. + */ + TriangleSubGeometry.prototype.updateFaceTangents = function () { + var i = 0; + var index1; + var index2; + var index3; + var vi; + var v0; + var dv1; + var dv2; + var denom; + var x0, y0, z0; + var dx1, dy1, dz1; + var dx2, dy2, dz2; + var cx, cy, cz; + + var positions = this._positions; + var uvs = this._uvs; + + var len = this._pIndices.length; + + if (this._faceTangents == null) + this._faceTangents = new Array(len); + + while (i < len) { + index1 = this._pIndices[i]; + index2 = this._pIndices[i + 1]; + index3 = this._pIndices[i + 2]; + + v0 = uvs[index1 * 2 + 1]; + dv1 = uvs[index2 * 2 + 1] - v0; + dv2 = uvs[index3 * 2 + 1] - v0; + + vi = index1 * 3; + x0 = positions[vi]; + y0 = positions[vi + 1]; + z0 = positions[vi + 2]; + vi = index2 * 3; + dx1 = positions[vi] - x0; + dy1 = positions[vi + 1] - y0; + dz1 = positions[vi + 2] - z0; + vi = index3 * 3; + dx2 = positions[vi] - x0; + dy2 = positions[vi + 1] - y0; + dz2 = positions[vi + 2] - z0; + + cx = dv2 * dx1 - dv1 * dx2; + cy = dv2 * dy1 - dv1 * dy2; + cz = dv2 * dz1 - dv1 * dz2; + denom = 1 / Math.sqrt(cx * cx + cy * cy + cz * cz); + + this._faceTangents[i++] = denom * cx; + this._faceTangents[i++] = denom * cy; + this._faceTangents[i++] = denom * cz; + } + + this._faceTangentsDirty = false; + }; + + /** + * Updates the normals for each face. + */ + TriangleSubGeometry.prototype.updateFaceNormals = function () { + var i = 0; + var j = 0; + var k = 0; + var index; + var offset; + var stride; + + var x1, x2, x3; + var y1, y2, y3; + var z1, z2, z3; + var dx1, dy1, dz1; + var dx2, dy2, dz2; + var cx, cy, cz; + var d; + + var positions = this._positions; + + var len = this._pIndices.length; + + if (this._faceNormals == null) + this._faceNormals = new Array(len); + + if (this._useFaceWeights && this._faceWeights == null) + this._faceWeights = new Array(len / 3); + + while (i < len) { + index = this._pIndices[i++] * 3; + x1 = positions[index]; + y1 = positions[index + 1]; + z1 = positions[index + 2]; + index = this._pIndices[i++] * 3; + x2 = positions[index]; + y2 = positions[index + 1]; + z2 = positions[index + 2]; + index = this._pIndices[i++] * 3; + x3 = positions[index]; + y3 = positions[index + 1]; + z3 = positions[index + 2]; + dx1 = x3 - x1; + dy1 = y3 - y1; + dz1 = z3 - z1; + dx2 = x2 - x1; + dy2 = y2 - y1; + dz2 = z2 - z1; + cx = dz1 * dy2 - dy1 * dz2; + cy = dx1 * dz2 - dz1 * dx2; + cz = dy1 * dx2 - dx1 * dy2; + d = Math.sqrt(cx * cx + cy * cy + cz * cz); + + // length of cross product = 2*triangle area + if (this._useFaceWeights) { + var w = d * 10000; + + if (w < 1) + w = 1; + + this._faceWeights[k++] = w; + } + + d = 1 / d; + + this._faceNormals[j++] = cx * d; + this._faceNormals[j++] = cy * d; + this._faceNormals[j++] = cz * d; + } + + this._faceNormalsDirty = false; + }; + + TriangleSubGeometry.prototype._pNotifyVerticesUpdate = function () { + this._pStrideOffsetDirty = true; + + this.notifyPositionsUpdate(); + this.notifyNormalsUpdate(); + this.notifyTangentsUpdate(); + this.notifyUVsUpdate(); + this.notifySecondaryUVsUpdate(); + this.notifyJointIndicesUpdate(); + this.notifyJointWeightsUpdate(); + }; + + TriangleSubGeometry.prototype.notifyPositionsUpdate = function () { + if (this._positionsDirty) + return; + + this._positionsDirty = true; + + if (!this._positionsUpdated) + this._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); + + this.dispatchEvent(this._positionsUpdated); + }; + + TriangleSubGeometry.prototype.notifyNormalsUpdate = function () { + if (this._vertexNormalsDirty) + return; + + this._vertexNormalsDirty = true; + + if (!this._normalsUpdated) + this._normalsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.NORMAL_DATA); + + this.dispatchEvent(this._normalsUpdated); + }; + + TriangleSubGeometry.prototype.notifyTangentsUpdate = function () { + if (this._vertexTangentsDirty) + return; + + this._vertexTangentsDirty = true; + + if (!this._tangentsUpdated) + this._tangentsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.TANGENT_DATA); + + this.dispatchEvent(this._tangentsUpdated); + }; + + TriangleSubGeometry.prototype.notifyUVsUpdate = function () { + if (this._uvsDirty) + return; + + this._uvsDirty = true; + + if (!this._uvsUpdated) + this._uvsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.UV_DATA); + + this.dispatchEvent(this._uvsUpdated); + }; + + TriangleSubGeometry.prototype.notifySecondaryUVsUpdate = function () { + if (this._secondaryUVsDirty) + return; + + this._secondaryUVsDirty = true; + + if (!this._secondaryUVsUpdated) + this._secondaryUVsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.SECONDARY_UV_DATA); + + this.dispatchEvent(this._secondaryUVsUpdated); + }; + + TriangleSubGeometry.prototype.notifyJointIndicesUpdate = function () { + if (this._jointIndicesDirty) + return; + + this._jointIndicesDirty = true; + + if (!this._jointIndicesUpdated) + this._jointIndicesUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_INDEX_DATA); + + this.dispatchEvent(this._jointIndicesUpdated); + }; + + TriangleSubGeometry.prototype.notifyJointWeightsUpdate = function () { + if (this._jointWeightsDirty) + return; + + this._jointWeightsDirty = true; + + if (!this._jointWeightsUpdated) + this._jointWeightsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_WEIGHT_DATA); + + this.dispatchEvent(this._jointWeightsUpdated); + }; + TriangleSubGeometry.POSITION_DATA = "positions"; + TriangleSubGeometry.NORMAL_DATA = "vertexNormals"; + TriangleSubGeometry.TANGENT_DATA = "vertexTangents"; + TriangleSubGeometry.UV_DATA = "uvs"; + TriangleSubGeometry.SECONDARY_UV_DATA = "secondaryUVs"; + TriangleSubGeometry.JOINT_INDEX_DATA = "jointIndices"; + TriangleSubGeometry.JOINT_WEIGHT_DATA = "jointWeights"; + + TriangleSubGeometry.POSITION_FORMAT = "float3"; + TriangleSubGeometry.NORMAL_FORMAT = "float3"; + TriangleSubGeometry.TANGENT_FORMAT = "float3"; + TriangleSubGeometry.UV_FORMAT = "float2"; + TriangleSubGeometry.SECONDARY_UV_FORMAT = "float2"; + return TriangleSubGeometry; +})(SubGeometryBase); + +module.exports = TriangleSubGeometry; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9UcmlhbmdsZVN1Ykdlb21ldHJ5LnRzIl0sIm5hbWVzIjpbIlRyaWFuZ2xlU3ViR2VvbWV0cnkiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5LmNvbnN0cnVjdG9yIiwiVHJpYW5nbGVTdWJHZW9tZXRyeS5fcFVwZGF0ZVN0cmlkZU9mZnNldCIsIlRyaWFuZ2xlU3ViR2VvbWV0cnkuZ2V0Qm91bmRpbmdQb3NpdGlvbnMiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5LnVwZGF0ZVBvc2l0aW9ucyIsIlRyaWFuZ2xlU3ViR2VvbWV0cnkudXBkYXRlVmVydGV4Tm9ybWFscyIsIlRyaWFuZ2xlU3ViR2VvbWV0cnkudXBkYXRlVmVydGV4VGFuZ2VudHMiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5LnVwZGF0ZVVWcyIsIlRyaWFuZ2xlU3ViR2VvbWV0cnkudXBkYXRlU2Vjb25kYXJ5VVZzIiwiVHJpYW5nbGVTdWJHZW9tZXRyeS51cGRhdGVKb2ludEluZGljZXMiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5LnVwZGF0ZUpvaW50V2VpZ2h0cyIsIlRyaWFuZ2xlU3ViR2VvbWV0cnkuZGlzcG9zZSIsIlRyaWFuZ2xlU3ViR2VvbWV0cnkudXBkYXRlSW5kaWNlcyIsIlRyaWFuZ2xlU3ViR2VvbWV0cnkuY2xvbmUiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5LnNjYWxlVVYiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5LnNjYWxlIiwiVHJpYW5nbGVTdWJHZW9tZXRyeS5hcHBseVRyYW5zZm9ybWF0aW9uIiwiVHJpYW5nbGVTdWJHZW9tZXRyeS51cGRhdGVGYWNlVGFuZ2VudHMiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5LnVwZGF0ZUZhY2VOb3JtYWxzIiwiVHJpYW5nbGVTdWJHZW9tZXRyeS5fcE5vdGlmeVZlcnRpY2VzVXBkYXRlIiwiVHJpYW5nbGVTdWJHZW9tZXRyeS5ub3RpZnlQb3NpdGlvbnNVcGRhdGUiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5Lm5vdGlmeU5vcm1hbHNVcGRhdGUiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5Lm5vdGlmeVRhbmdlbnRzVXBkYXRlIiwiVHJpYW5nbGVTdWJHZW9tZXRyeS5ub3RpZnlVVnNVcGRhdGUiLCJUcmlhbmdsZVN1Ykdlb21ldHJ5Lm5vdGlmeVNlY29uZGFyeVVWc1VwZGF0ZSIsIlRyaWFuZ2xlU3ViR2VvbWV0cnkubm90aWZ5Sm9pbnRJbmRpY2VzVXBkYXRlIiwiVHJpYW5nbGVTdWJHZW9tZXRyeS5ub3RpZnlKb2ludFdlaWdodHNVcGRhdGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBFQUFnRjtBQUNoRiwwRUFBZ0Y7O0FBRWhGLDREQUFvRTtBQUNwRSx5RUFBK0U7O0FBRS9FOztFQUVHO0FBQ0g7SUFBa0NBLHNDQUFlQTtJQSthaERBOztNQURHQTtJQUNIQSw2QkFBWUEsa0JBQTBCQTtRQUVyQ0MsV0FBTUEsT0FBQUEsa0JBQWtCQSxDQUFDQTtRQWhhMUJBLEtBQVFBLGVBQWVBLEdBQVdBLElBQUlBLENBQUNBO1FBQ3ZDQSxLQUFRQSxpQkFBaUJBLEdBQVdBLElBQUlBLENBQUNBO1FBQ3pDQSxLQUFRQSxrQkFBa0JBLEdBQVdBLElBQUlBLENBQUNBO1FBQzFDQSxLQUFRQSxtQkFBbUJBLEdBQVdBLElBQUlBLENBQUNBO1FBQzNDQSxLQUFRQSxvQkFBb0JBLEdBQVdBLElBQUlBLENBQUNBO1FBQzVDQSxLQUFRQSxTQUFTQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUNqQ0EsS0FBUUEsa0JBQWtCQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUMxQ0EsS0FBUUEsa0JBQWtCQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUMxQ0EsS0FBUUEsa0JBQWtCQSxHQUFXQSxJQUFJQSxDQUFDQTtRQWlCMUNBLEtBQVFBLGtCQUFrQkEsR0FBV0EsSUFBSUEsQ0FBQ0E7UUFDMUNBLEtBQVFBLGtCQUFrQkEsR0FBV0EsSUFBSUEsQ0FBQ0E7UUFDMUNBLEtBQVFBLG1CQUFtQkEsR0FBV0EsSUFBSUEsQ0FBQ0E7UUFDM0NBLEtBQVFBLGNBQWNBLEdBQVdBLEtBQUtBLENBQUNBO1FBQ3ZDQSxLQUFRQSxlQUFlQSxHQUFXQSxLQUFLQSxDQUFDQTtRQU14Q0EsS0FBUUEsT0FBT0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDM0JBLEtBQVFBLE9BQU9BLEdBQVVBLENBQUNBLENBQUNBOztRQThYMUJBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLGVBQWVBO0lBQ3RDQSxDQUFDQTtJQWxYREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsT0FBT0E7UUFDcEJBLENBQUNBOzs7O0FBQUFBO0lBT0RBO1FBQUFBOzs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLG9CQUFvQkE7UUFDakNBLENBQUNBO1FBRURBLEtBQUFBLFVBQStCQSxLQUFhQTtZQUUzQ0EsSUFBSUEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxJQUFJQSxLQUFLQTtnQkFDckNBLE1BQU9BLENBQUFBOztZQUVSQSxJQUFJQSxDQUFDQSxvQkFBb0JBLEdBQUdBLEtBQUtBOztZQUVqQ0EsSUFBSUEsQ0FBQ0Esd0JBQXdCQSxDQUFDQSxDQUFDQTtRQUNoQ0EsQ0FBQ0E7Ozs7QUFWQUE7O0lBWURBLHFEQUFBQTtRQUVDRSxJQUFJQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUVBO1lBQzVCQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLFdBQVdBLENBQUNBLEdBQUdBLENBQUNBOztZQUVsREEsdUJBQXVCQTtZQUN2QkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxhQUFhQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNwREEsSUFBSUEsTUFBTUEsR0FBVUEsQ0FBQ0E7O1lBRXJCQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxJQUFJQSxDQUFFQTtnQkFDaENBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsTUFBTUE7Z0JBQ3ZEQSxNQUFNQSxJQUFJQSxDQUFDQTthQUNYQTs7WUFFREEsSUFBSUEsSUFBSUEsQ0FBQ0EsZUFBZUEsSUFBSUEsSUFBSUEsQ0FBRUE7Z0JBQ2pDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLFlBQVlBLENBQUNBLEdBQUdBLE1BQU1BO2dCQUN4REEsTUFBTUEsSUFBSUEsQ0FBQ0E7YUFDWEE7O1lBRURBLElBQUlBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLElBQUlBLENBQUVBO2dCQUN0QkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxNQUFNQTtnQkFDbkRBLE1BQU1BLElBQUlBLENBQUNBO2FBQ1hBOztZQUVEQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxJQUFJQSxJQUFJQSxDQUFFQTtnQkFDL0JBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxNQUFNQTtnQkFDN0RBLE1BQU1BLElBQUlBLENBQUNBO2FBQ1hBOztZQUVEQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxJQUFJQSxJQUFJQSxDQUFFQTtnQkFDL0JBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxNQUFNQTtnQkFDNURBLE1BQU1BLElBQUlBLElBQUlBLENBQUNBLGdCQUFnQkE7YUFDL0JBOztZQUVEQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxJQUFJQSxJQUFJQSxDQUFFQTtnQkFDL0JBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxNQUFNQTtnQkFDN0RBLE1BQU1BLElBQUlBLElBQUlBLENBQUNBLGdCQUFnQkE7YUFDL0JBOztZQUVEQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLFdBQVdBLENBQUNBLEdBQUdBLE1BQU1BO1lBQ3ZEQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLGFBQWFBLENBQUNBLEdBQUdBLE1BQU1BO1lBQ3pEQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLFdBQVdBLENBQUNBLEdBQUdBLE1BQU1BO1lBQ3ZEQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLFlBQVlBLENBQUNBLEdBQUdBLE1BQU1BO1lBQ3hEQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLE9BQU9BLENBQUNBLEdBQUdBLE1BQU1BO1lBQ25EQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsR0FBR0EsTUFBTUE7WUFDN0RBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxHQUFHQSxNQUFNQTtZQUM1REEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxpQkFBaUJBLENBQUNBLEdBQUdBLE1BQU1BOztZQUU3REEsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBQ0EsTUFBTUE7O1lBRTFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxJQUFJQSxJQUFJQTtnQkFDMUJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLEdBQUdBLENBQUNBO2lCQUNwQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsSUFBSUEsR0FBR0E7Z0JBQ3JDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxHQUFHQSxHQUFHQSxDQUFDQTtTQUU5QkEsS0FBTUE7WUFDTkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxhQUFhQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNwREEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxXQUFXQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNsREEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxZQUFZQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNuREEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUM5Q0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxpQkFBaUJBLENBQUNBLEdBQUdBLENBQUNBO1lBQ3hEQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDdkRBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxDQUFDQTs7WUFFeERBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDcERBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDbERBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDbkRBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDOUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUN4REEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkE7WUFDM0VBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBO1NBQzVFQTs7UUFFREEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxHQUFHQSxLQUFLQTtJQUNqQ0EsQ0FBQ0E7O0lBS0RGO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxnQkFBZ0JBO1FBQzdCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUEyQkEsS0FBWUE7WUFFdENBLElBQUlBLElBQUlBLENBQUNBLGdCQUFnQkEsSUFBSUEsS0FBS0E7Z0JBQ2pDQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxLQUFLQTs7WUFFN0JBLElBQUlBLENBQUNBLG1CQUFtQkEsR0FBR0EsSUFBSUE7O1lBRS9CQSxJQUFJQSxJQUFJQSxDQUFDQSxtQkFBbUJBO2dCQUMzQkEsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNoQ0EsQ0FBQ0E7Ozs7QUFiQUE7O0lBb0JEQTtRQUFBQTs7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxjQUFjQTtRQUMzQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBeUJBLEtBQWFBO1lBRXJDQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxLQUFLQTtnQkFDL0JBLE1BQU9BLENBQUFBOztZQUVSQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxLQUFLQTs7WUFFM0JBLElBQUlBLEtBQUtBO2dCQUNSQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFYQUE7O0lBaUJEQTtRQUFBQTs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGtCQUFrQkE7UUFDL0JBLENBQUNBO1FBRURBLEtBQUFBLFVBQTZCQSxLQUFhQTtZQUV6Q0EsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxJQUFJQSxLQUFLQTtnQkFDbkNBLE1BQU9BLENBQUFBOztZQUVSQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUdBLEtBQUtBOztZQUUvQkEsSUFBSUEsS0FBS0E7Z0JBQ1JBLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLENBQUNBOzs7O0FBWEFBOztJQWlCREE7UUFBQUE7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxtQkFBbUJBO1FBQ2hDQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUE4QkEsS0FBYUE7WUFFMUNBLElBQUlBLElBQUlBLENBQUNBLG1CQUFtQkEsSUFBSUEsS0FBS0E7Z0JBQ3BDQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxHQUFHQSxLQUFLQTs7WUFFaENBLElBQUlBLEtBQUtBO2dCQUNSQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBLENBQUNBO1FBQzlCQSxDQUFDQTs7OztBQVhBQTs7SUFnQkRBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxJQUFJQSxJQUFJQSxDQUFDQSxlQUFlQTtnQkFDdkJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBOztZQUV2Q0EsSUFBSUEsSUFBSUEsQ0FBQ0EsbUJBQW1CQTtnQkFDM0JBLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7O1lBRS9DQSxJQUFJQSxJQUFJQSxDQUFDQSxvQkFBb0JBO2dCQUM1QkEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQTs7WUFFakRBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBO2dCQUNqQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7O1lBRTNCQSxJQUFJQSxJQUFJQSxDQUFDQSxrQkFBa0JBO2dCQUMxQkEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTs7WUFFN0NBLElBQUlBLElBQUlBLENBQUNBLGtCQUFrQkE7Z0JBQzFCQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBOztZQUU3Q0EsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQTtnQkFDMUJBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0E7O1lBRTdDQSxPQUFPQSxJQUFJQSxDQUFDQSxVQUFVQTtRQUN2QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLElBQUlBLENBQUNBLGVBQWVBO2dCQUN2QkEsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7O1lBRXZDQSxPQUFPQSxJQUFJQSxDQUFDQSxVQUFVQTtRQUN2QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLElBQUlBLENBQUNBLG1CQUFtQkE7Z0JBQzNCQSxJQUFJQSxDQUFDQSxtQkFBbUJBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBOztZQUUvQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsY0FBY0E7UUFDM0JBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxJQUFJQSxJQUFJQSxDQUFDQSxvQkFBb0JBO2dCQUM1QkEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQTs7WUFFakRBLE9BQU9BLElBQUlBLENBQUNBLGVBQWVBO1FBQzVCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsaUJBQWlCQTtnQkFDekJBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1lBRTFCQSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLElBQUlBLENBQUNBLGtCQUFrQkE7Z0JBQzFCQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLENBQUNBLENBQUNBOztZQUUzQkEsT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDMUJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQTtnQkFDakJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBOztZQUUzQkEsT0FBT0EsSUFBSUEsQ0FBQ0EsSUFBSUE7UUFDakJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxJQUFJQSxJQUFJQSxDQUFDQSxrQkFBa0JBO2dCQUMxQkEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQTs7WUFFN0NBLE9BQU9BLElBQUlBLENBQUNBLGFBQWFBO1FBQzFCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQTtnQkFDMUJBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0E7O1lBRTdDQSxJQUFJQSxJQUFJQSxDQUFDQSxvQkFBb0JBO2dCQUM1QkEsT0FBT0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQTs7WUFFcENBLE9BQU9BLElBQUlBLENBQUNBLGFBQWFBO1FBQzFCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQTtnQkFDMUJBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0E7O1lBRTdDQSxPQUFPQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUMxQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGVBQWVBO1FBQzVCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUEwQkEsS0FBYUE7WUFFdENBLElBQUlBLElBQUlBLENBQUNBLGVBQWVBLElBQUlBLEtBQUtBO2dCQUNoQ0EsTUFBT0EsQ0FBQUE7O1lBRVJBLElBQUlBLENBQUNBLGVBQWVBLEdBQUdBLEtBQUtBOztZQUU1QkEsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQTtnQkFDMUJBLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1lBRTVCQSxJQUFJQSxJQUFJQSxDQUFDQSxtQkFBbUJBO2dCQUMzQkEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxDQUFDQSxDQUFDQTs7WUFFN0JBLElBQUlBLENBQUNBLGlCQUFpQkEsR0FBR0EsSUFBSUE7UUFDOUJBLENBQUNBOzs7O0FBaEJBQTs7SUFrQkRBO1FBQUFBLEtBQUFBO1lBRUNBLElBQUlBLElBQUlBLENBQUNBLGtCQUFrQkE7Z0JBQzFCQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBOztZQUU3Q0EsT0FBT0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQTtRQUNoQ0EsQ0FBQ0E7Ozs7QUFBQUE7SUFFREE7UUFBQUEsS0FBQUE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQTtnQkFDMUJBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0E7O1lBRTdDQSxPQUFPQSxJQUFJQSxDQUFDQSxxQkFBcUJBO1FBQ2xDQSxDQUFDQTs7OztBQUFBQTtJQVlEQSxxREFBQUE7UUFFQ0csSUFBSUEsSUFBSUEsQ0FBQ0EsZUFBZUE7WUFDdkJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBOztRQUV2Q0EsT0FBT0EsSUFBSUEsQ0FBQ0EsVUFBVUE7SUFDdkJBLENBQUNBOztJQUtESDs7TUFER0E7b0RBQ0hBLFVBQXVCQSxNQUFvQkE7UUFFMUNJLElBQUlBLENBQUNBO1FBQ0xBLElBQUlBLEtBQUtBO1FBQ1RBLElBQUlBLE1BQU1BO1FBQ1ZBLElBQUlBLFNBQVNBOztRQUViQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxNQUFNQTs7UUFFeEJBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLElBQUlBLElBQUlBO1lBQzFCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxDQUFDQSxDQUFDQTs7UUFFdkNBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLE1BQU1BLEdBQUNBLENBQUNBOztRQUU3Q0EsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFFQTtZQUM1QkEsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxXQUFXQSxDQUFDQTs7WUFFbkZBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLElBQUlBLElBQUlBO2dCQUMxQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsR0FBR0EsQ0FBQ0E7aUJBQ3BDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxJQUFJQSxHQUFHQTtnQkFDckNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBOztZQUU5QkEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDTEEsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxhQUFhQSxDQUFDQTtZQUN6REEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxhQUFhQSxDQUFDQTtZQUMxREEsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUE7O1lBRTNCQSxPQUFPQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFFQTtnQkFDekJBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLENBQUNBO2dCQUM5QkEsU0FBU0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7Z0JBQ2xDQSxTQUFTQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQTtnQkFDbENBLEtBQUtBLElBQUlBLE1BQU1BO2FBQ2ZBO1NBQ0RBOztRQUVEQSxJQUFJQSxJQUFJQSxDQUFDQSxrQkFBa0JBO1lBQzFCQSxJQUFJQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBOztRQUU1QkEsSUFBSUEsSUFBSUEsQ0FBQ0EsbUJBQW1CQTtZQUMzQkEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFN0JBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBO1lBQ3RCQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQSxDQUFBQTs7UUFFdkJBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7O1FBRXhCQSxJQUFJQSxDQUFDQSxxQkFBcUJBLENBQUNBLENBQUNBOztRQUU1QkEsSUFBSUEsQ0FBQ0EsZUFBZUEsR0FBR0EsS0FBS0E7SUFDN0JBLENBQUNBOztJQUtESjs7TUFER0E7d0RBQ0hBLFVBQTJCQSxNQUFvQkE7UUFFOUNLLElBQUlBLENBQUNBO1FBQ0xBLElBQUlBLEtBQUtBO1FBQ1RBLElBQUlBLE1BQU1BO1FBQ1ZBLElBQUlBLE1BQU1BO1FBQ1ZBLElBQUlBLE9BQU9BOztRQUVYQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUVBO1lBQzdCQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxJQUFJQSxJQUFJQSxNQUFNQSxJQUFJQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxJQUFJQSxJQUFJQSxNQUFNQSxJQUFJQSxJQUFJQSxDQUFDQSxDQUFFQTtnQkFDdkdBLElBQUlBLElBQUlBLENBQUNBLGtCQUFrQkE7b0JBQzFCQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLENBQUNBOztvQkFFN0JBLElBQUlBLENBQUNBLG1CQUFtQkEsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDakNBOztZQUVEQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxNQUFNQTs7WUFFNUJBLElBQUlBLE1BQU1BLElBQUlBLElBQUlBLElBQUlBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBRUE7Z0JBQzlDQSxDQUFDQSxHQUFHQSxDQUFDQTtnQkFDTEEsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxXQUFXQSxDQUFDQTtnQkFDdkRBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7Z0JBQ3hEQSxPQUFPQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQTs7Z0JBRXpCQSxPQUFPQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFFQTtvQkFDekJBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLENBQUNBO29CQUM1QkEsT0FBT0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7b0JBQ2hDQSxPQUFPQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQTtvQkFDaENBLEtBQUtBLElBQUlBLE1BQU1BO2lCQUNmQTthQUNEQTtTQUNEQSxLQUFNQTtZQUNOQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxJQUFJQSxDQUFFQTtnQkFDaENBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLE1BQU1BLENBQUNBOztnQkFFL0RBLElBQUlBLElBQUlBLENBQUNBLGtCQUFrQkE7b0JBQzFCQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLENBQUNBOztvQkFFN0JBLElBQUlBLENBQUNBLG1CQUFtQkEsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDakNBOztZQUVEQSxJQUFJQSxJQUFJQSxDQUFDQSxpQkFBaUJBO2dCQUN6QkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQSxDQUFDQTs7WUFFMUJBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7WUFDeERBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7O1lBRXhEQSxxQkFBcUJBO1lBQ3JCQSxPQUFPQSxHQUFHQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUVBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBOztZQUV4RUEsSUFBSUEsRUFBRUEsR0FBVUEsQ0FBQ0E7WUFDakJBLElBQUlBLEVBQUVBLEdBQVVBLENBQUNBO1lBQ2pCQSxJQUFJQSxFQUFFQSxHQUFVQSxDQUFDQTs7WUFFakJBLEtBQUtBLEdBQUdBLE1BQU1BOztZQUVkQSxxQkFBcUJBO1lBQ3JCQSxJQUFJQSxJQUFJQSxHQUFVQSxPQUFPQSxDQUFDQSxNQUFNQTtZQUNoQ0EsT0FBT0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBRUE7Z0JBQ3BCQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQTtnQkFDbEJBLE9BQU9BLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO2dCQUN0QkEsT0FBT0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7Z0JBQ3RCQSxLQUFLQSxJQUFJQSxNQUFNQTthQUNmQTs7WUFFREEsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7WUFDaEJBLElBQUlBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BO1lBQ3ZDQSxJQUFJQSxNQUFNQTs7WUFFVkEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1lBR0xBLE9BQU9BLENBQUNBLEdBQUdBLElBQUlBLENBQUVBO2dCQUNoQkEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZUFBZUEsR0FBRUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7Z0JBQ3pEQSxLQUFLQSxHQUFHQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxNQUFNQTtnQkFDM0NBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLE1BQU1BO2dCQUM5Q0EsT0FBT0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUE7Z0JBQ2xEQSxPQUFPQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxNQUFNQTtnQkFDbERBLEtBQUtBLEdBQUdBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLE1BQU1BO2dCQUMzQ0EsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUE7Z0JBQzlDQSxPQUFPQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxNQUFNQTtnQkFDbERBLE9BQU9BLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLE1BQU1BO2dCQUNsREEsS0FBS0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUE7Z0JBQzNDQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxNQUFNQTtnQkFDOUNBLE9BQU9BLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLE1BQU1BO2dCQUNsREEsT0FBT0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUE7Z0JBQ2xEQSxFQUFFQSxJQUFJQSxDQUFDQTtnQkFDUEEsRUFBRUEsSUFBSUEsQ0FBQ0E7Z0JBQ1BBLEVBQUVBLElBQUlBLENBQUNBO2FBQ1BBOztZQUVEQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNMQSxLQUFLQSxHQUFHQSxNQUFNQTs7WUFHZEEsT0FBT0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBRUE7Z0JBQ3BCQSxJQUFJQSxFQUFFQSxHQUFVQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQTtnQkFDOUJBLElBQUlBLEVBQUVBLEdBQVVBLE9BQU9BLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBO2dCQUNsQ0EsSUFBSUEsRUFBRUEsR0FBVUEsT0FBT0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7Z0JBQ2xDQSxJQUFJQSxDQUFD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LEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO2dCQUN2QkEsUUFBUUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O2dCQUV2QkEsS0FBS0EsSUFBSUEsTUFBTUE7YUFDZkE7O1lBRURBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBO1lBQ2hCQSxJQUFJQSxNQUFNQTtZQUNWQSxJQUFJQSxFQUFFQSxHQUFVQSxDQUFDQTtZQUNqQkEsSUFBSUEsRUFBRUEsR0FBVUEsQ0FBQ0E7WUFDakJBLElBQUlBLEVBQUVBLEdBQVVBLENBQUNBOztZQUVqQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1lBRUxBLHVCQUF1QkE7WUFDdkJBLElBQUlBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BO1lBQ3ZDQSxPQUFPQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFFQTtnQkFDaEJBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGVBQWVBLEdBQUVBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO2dCQUN6REEsS0FBS0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUE7Z0JBQzNDQSxRQUFRQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxNQUFNQTtnQkFDbERBLFFBQVFBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLE1BQU1BO2dCQUNsREEsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUE7Z0JBQ2hEQSxLQUFLQSxHQUFHQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxNQUFNQTtnQkFDM0NBLFFBQVFBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLE1BQU1BO2dCQUNsREEsUUFBUUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUE7Z0JBQ2xEQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxNQUFNQTtnQkFDaERBLEtBQUtBLEdBQUdBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLE1BQU1BO2dCQUMzQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUE7Z0JBQ2xEQSxRQUFRQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxNQUFNQTtnQkFDbERBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLE1BQU1BO2dCQUNoREEsRUFBRUEsSUFBSUEsQ0FBQ0E7Z0JBQ1BBLEVBQUVBLElBQUlBLENBQUNBO2dCQUNQQSxFQUFFQSxJQUFJQSxDQUFDQTthQUNQQTs7WUFFREEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDTEEsS0FBS0EsR0FBR0EsTUFBTUE7O1lBR2RBLE9BQU9BLEtBQUtBLEdBQUdBLElBQUlBLENBQUVBO2dCQUNwQkEsSUFBSUEsRUFBRUEsR0FBVUEsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7Z0JBQy9CQSxJQUFJQSxFQUFFQSxHQUFVQSxRQUFRQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQTtnQkFDbkNBLElBQUlBLEVBQUVBLEdBQVVBLFFBQVFBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBO2dCQUNuQ0EsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsQ0FBQ0E7O2dCQUVuREEsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFFQTtvQkFDNUJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLENBQUNBO29CQUNsREEsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsQ0FBQ0E7b0JBQ3REQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxRQUFRQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxDQUFDQTtpQkFDdERBLEtBQU1BO29CQUNOQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxDQUFDQTtvQkFDdEJBLFFBQVFBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLENBQUNBO29CQUMxQkEsUUFBUUEsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsQ0FBQ0E7aUJBQzFCQTs7Z0JBRURBLEtBQUtBLElBQUlBLE1BQU1BO2FBQ2ZBO1NBQ0RBOztRQUVEQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENB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LE1BQU1BLEdBQVVBLE1BQU1BLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BO1FBQ3ZDQSxJQUFJQSxNQUFNQSxHQUFVQSxNQUFNQSxHQUFDQSxJQUFJQSxDQUFDQSxPQUFPQTs7UUFFdkNBLElBQUlBLENBQUNBLE9BQU9BLEdBQUdBLE1BQU1BO1FBQ3JCQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxNQUFNQTs7UUFFckJBLElBQUlBLEdBQUdBLEdBQVVBLEdBQUdBLENBQUNBLE1BQU1BOztRQUUzQkEsTUFBTUEsR0FBR0EsQ0FBQ0E7UUFDVkEsTUFBTUEsR0FBR0EsQ0FBQ0E7O1FBRVZBLEtBQUtBLEdBQUdBLE1BQU1BOztRQUVkQSxPQUFPQSxLQUFLQSxHQUFHQSxHQUFHQSxDQUFFQTtZQUNuQkEsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsTUFBTUE7WUFDcEJBLEdBQUdBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLE1BQU1BO1lBQ3hCQSxLQUFLQSxJQUFJQSxNQUFNQTtTQUNmQTs7UUFFREEsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0E7SUFDdkJBLENBQUNBOztJQU1EZDs7O01BREdBOzBDQUNIQSxVQUFhQSxLQUFZQTtRQUV4QmUsSUFBSUEsQ0FBQ0E7UUFDTEEsSUFBSUEsS0FBS0E7UUFDVEEsSUFBSUEsTUFBTUE7UUFDVkEsSUFBSUEsTUFBTUE7UUFDVkEsSUFBSUEsU0FBU0E7O1FBRWJBLFNBQVNBLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBOztRQUUzQkEsSUFBSUEsR0FBR0EsR0FBVUEsU0FBU0EsQ0FBQ0EsTUFBTUE7O1FBRWpDQSxNQUFNQSxHQUFHQSxDQUFDQTtRQUNWQSxNQUFNQSxHQUFHQSxDQUFDQTs7UUFFVkEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDTEEsS0FBS0EsR0FBR0EsTUFBTUE7UUFDZEEsT0FBT0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBRUE7WUFDZkEsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsS0FBS0E7WUFDekJBLFNB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LEVBQUVBLENBQUNBO1lBQ2xCQSxFQUFFQSxHQUFHQSxTQUFTQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUN0QkEsRUFBRUEsR0FBR0EsU0FBU0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDdEJBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUNBLENBQUNBO1lBQ2JBLEdBQUdBLEdBQUdBLFNBQVNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO1lBQ3hCQSxHQUFHQSxHQUFHQSxTQUFTQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTtZQUM1QkEsR0FBR0EsR0FBR0EsU0FBU0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7WUFDNUJBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUNBLENBQUNBO1lBQ2JBLEdBQUdBLEdBQUdBLFNBQVNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO1lBQ3hCQSxHQUFHQSxHQUFHQSxTQUFTQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTtZQUM1QkEsR0FBR0EsR0FBR0EsU0FBU0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7O1lBRTVCQSxFQUFFQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQTtZQUN0QkEsRUFBRUEsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0E7WUFDdEJBLEVBQUVBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBO1lBQ3RCQSxLQUFLQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxDQUFDQTs7WUFFMUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEtBQUtBLEdBQUNBLEVBQUVBO1lBQ2xDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxLQUFLQSxHQUFDQSxFQUFFQTtZQUNsQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBQ0EsRUFBRUE7U0FDbENBOztRQUVEQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUdBLEtBQUtBO0lBQ2hDQSxDQUFDQTs7SUFLRGpCOztNQURHQTtzREFDSEE7UUFFQ2tCLElBQUlBLENBQUNBLEdBQVVBLENBQUNBO1FBQ2hCQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQTtRQUNoQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7UUFDaEJBLElBQUlBLEtBQUtBO1FBQ1RBLElBQUlBLE1BQU1BO1FBQ1ZBLElBQUlBLE1BQU1BOztRQUVWQSxJQUFJQSxFQUFFQSxFQUFTQSxFQUFFQSxFQUFTQSxFQUFFQTtRQUM1QkEsSUFBSUEsRUFBRUEsRUFBU0EsRUFBRUEsRUFBU0EsRUFBRUE7UUFDNUJBLElBQUlBLEVBQUVBLEVBQVNBLEVBQUVBLEVBQVNBLEVBQUVBO1FBQzVCQSxJQUFJQSxHQUFHQSxFQUFTQSxHQUFHQSxFQUFTQSxHQUFHQTtRQUMvQkEsSUFBSUEsR0FBR0EsRUFBU0EsR0FBR0EsRUFBU0EsR0FBR0E7UUFDL0JBLElBQUlBLEVBQUVBLEVBQVNBLEVBQUVBLEVBQVNBLEVBQUVBO1FBQzVCQSxJQUFJQSxDQUFDQTs7UUFFTEEsSUFBSUEsU0FBU0EsR0FBaUJBLElBQUlBLENBQUNBLFVBQVVBOztRQUU3Q0EsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUE7O1FBRXRDQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxJQUFJQSxJQUFJQTtZQUM1QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1FBRTVDQSxJQUFJQSxJQUFJQSxDQUFDQSxlQUFlQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxJQUFJQSxJQUFJQTtZQUNwREEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRTlDQSxPQUFPQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFFQTtZQUNmQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFDQSxDQUFDQTtZQUM3QkEsRUFBRUEsR0FBR0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7WUFDckJBLEVBQUVBLEdBQUdBLFNBQVNBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBO1lBQ3pCQSxFQUFFQSxHQUFHQSxTQUFTQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUN6QkEsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7WUFDN0JBLEVBQUVBLEdBQUdBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3JCQSxFQUFFQSxHQUFHQSxTQUFTQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUN6QkEsRUFBRUEsR0FBR0EsU0FBU0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDekJBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLENBQUNBO1lBQzdCQSxFQUFFQSxHQUFHQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUNyQkEsRUFBRUEsR0FBR0EsU0FBU0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDekJBLEVBQUVBLEdBQUdBLFNBQVNBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBO1lBQ3pCQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQTtZQUNiQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQTtZQUNiQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQTtZQUNiQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQTtZQUNiQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQTtZQUNiQSxHQUFHQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQTtZQUNiQSxFQUFFQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQTtZQUN0QkEsRUFBRUEsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0E7WUFDdEJBLEVBQUVBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBO1lBQ3RCQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxDQUFDQTs7WUFDcENBLDRDQUE0Q0E7WUFFNUNBLElBQUlBLElBQUlBLENBQUNBLGVBQWVBLENBQUVBO2dCQUN6QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsR0FBQ0EsS0FBS0E7O2dCQUV0QkEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ1JBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBOztnQkFFUEEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7YUFDMUJBOztZQUVEQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQTs7WUFFUEEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsQ0FBQ0E7WUFDN0JBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdB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Q0FBQ0E7O1FBRTVIQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBO0lBQzlDQSxDQUFDQTtJQS81Q0QxQixvQ0FBcUNBLFdBQVdBO0lBQ2hEQSxrQ0FBbUNBLGVBQWVBO0lBQ2xEQSxtQ0FBb0NBLGdCQUFnQkE7SUFDcERBLDhCQUErQkEsS0FBS0E7SUFDcENBLHdDQUF5Q0EsY0FBY0E7SUFDdkRBLHVDQUF3Q0EsY0FBY0E7SUFDdERBLHdDQUF5Q0EsY0FBY0E7O0lBR3ZEQSxzQ0FBdUNBLFFBQVFBO0lBQy9DQSxvQ0FBcUNBLFFBQVFBO0lBQzdDQSxxQ0FBc0NBLFFBQVFBO0lBQzlDQSxnQ0FBaUNBLFFBQVFBO0lBQ3pDQSwwQ0FBMkNBLFFBQVFBO0lBbTVDcERBLDJCQUFDQTtBQUFEQSxDQUFDQSxFQWw2Q2lDLGVBQWUsRUFrNkNoRDs7QUFFRCxvQ0FBNkIsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvVHJpYW5nbGVTdWJHZW9tZXRyeS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTdWJHZW9tZXRyeUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1N1Ykdlb21ldHJ5QmFzZVwiKTtcbmltcG9ydCBUcmlhbmdsZVN1Yk1lc2hcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1RyaWFuZ2xlU3ViTWVzaFwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgU3ViR2VvbWV0cnlFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvU3ViR2VvbWV0cnlFdmVudFwiKTtcblxuLyoqXG4gKiBAY2xhc3MgYXdheS5iYXNlLlRyaWFuZ2xlU3ViR2VvbWV0cnlcbiAqL1xuY2xhc3MgVHJpYW5nbGVTdWJHZW9tZXRyeSBleHRlbmRzIFN1Ykdlb21ldHJ5QmFzZVxue1xuXHRwdWJsaWMgc3RhdGljIFBPU0lUSU9OX0RBVEE6c3RyaW5nID0gXCJwb3NpdGlvbnNcIjtcblx0cHVibGljIHN0YXRpYyBOT1JNQUxfREFUQTpzdHJpbmcgPSBcInZlcnRleE5vcm1hbHNcIjtcblx0cHVibGljIHN0YXRpYyBUQU5HRU5UX0RBVEE6c3RyaW5nID0gXCJ2ZXJ0ZXhUYW5nZW50c1wiO1xuXHRwdWJsaWMgc3RhdGljIFVWX0RBVEE6c3RyaW5nID0gXCJ1dnNcIjtcblx0cHVibGljIHN0YXRpYyBTRUNPTkRBUllfVVZfREFUQTpzdHJpbmcgPSBcInNlY29uZGFyeVVWc1wiO1xuXHRwdWJsaWMgc3RhdGljIEpPSU5UX0lOREVYX0RBVEE6c3RyaW5nID0gXCJqb2ludEluZGljZXNcIjtcblx0cHVibGljIHN0YXRpYyBKT0lOVF9XRUlHSFRfREFUQTpzdHJpbmcgPSBcImpvaW50V2VpZ2h0c1wiO1xuXG5cdC8vVE9ETyAtIG1vdmUgdGhlc2UgdG8gU3RhZ2VHTFxuXHRwdWJsaWMgc3RhdGljIFBPU0lUSU9OX0ZPUk1BVDpzdHJpbmcgPSBcImZsb2F0M1wiO1xuXHRwdWJsaWMgc3RhdGljIE5PUk1BTF9GT1JNQVQ6c3RyaW5nID0gXCJmbG9hdDNcIjtcblx0cHVibGljIHN0YXRpYyBUQU5HRU5UX0ZPUk1BVDpzdHJpbmcgPSBcImZsb2F0M1wiO1xuXHRwdWJsaWMgc3RhdGljIFVWX0ZPUk1BVDpzdHJpbmcgPSBcImZsb2F0MlwiO1xuXHRwdWJsaWMgc3RhdGljIFNFQ09OREFSWV9VVl9GT1JNQVQ6c3RyaW5nID0gXCJmbG9hdDJcIjtcblxuXHRwcml2YXRlIF9wb3NpdGlvbnNEaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfZmFjZU5vcm1hbHNEaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfZmFjZVRhbmdlbnRzRGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cdHByaXZhdGUgX3ZlcnRleE5vcm1hbHNEaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfdmVydGV4VGFuZ2VudHNEaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfdXZzRGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cdHByaXZhdGUgX3NlY29uZGFyeVVWc0RpcnR5OmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9qb2ludEluZGljZXNEaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfam9pbnRXZWlnaHRzRGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHJpdmF0ZSBfcG9zaXRpb25zOkFycmF5PG51bWJlcj47XG5cdHByaXZhdGUgX3ZlcnRleE5vcm1hbHM6QXJyYXk8bnVtYmVyPjtcblx0cHJpdmF0ZSBfdmVydGV4VGFuZ2VudHM6QXJyYXk8bnVtYmVyPjtcblx0cHJpdmF0ZSBfdXZzOkFycmF5PG51bWJlcj47XG5cdHByaXZhdGUgX3NlY29uZGFyeVVWczpBcnJheTxudW1iZXI+O1xuXHRwcml2YXRlIF9qb2ludEluZGljZXM6QXJyYXk8bnVtYmVyPjtcblx0cHJpdmF0ZSBfam9pbnRXZWlnaHRzOkFycmF5PG51bWJlcj47XG5cblx0cHJpdmF0ZSBfdXNlQ29uZGVuc2VkSW5kaWNlczpib29sZWFuO1xuXHRwcml2YXRlIF9jb25kZW5zZWRKb2ludEluZGljZXM6QXJyYXk8bnVtYmVyPjtcblx0cHJpdmF0ZSBfY29uZGVuc2VkSW5kZXhMb29rVXA6QXJyYXk8bnVtYmVyPjtcblx0cHJpdmF0ZSBfbnVtQ29uZGVuc2VkSm9pbnRzOm51bWJlcjtcblxuXHRwcml2YXRlIF9qb2ludHNQZXJWZXJ0ZXg6bnVtYmVyO1xuXG5cdHByaXZhdGUgX2NvbmNhdGVuYXRlQXJyYXlzOmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9hdXRvRGVyaXZlTm9ybWFsczpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfYXV0b0Rlcml2ZVRhbmdlbnRzOmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9hdXRvRGVyaXZlVVZzOmJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSBfdXNlRmFjZVdlaWdodHM6Ym9vbGVhbiA9IGZhbHNlO1xuXG5cdHByaXZhdGUgX2ZhY2VOb3JtYWxzOkFycmF5PG51bWJlcj47XG5cdHByaXZhdGUgX2ZhY2VUYW5nZW50czpBcnJheTxudW1iZXI+O1xuXHRwcml2YXRlIF9mYWNlV2VpZ2h0czpBcnJheTxudW1iZXI+O1xuXG5cdHByaXZhdGUgX3NjYWxlVTpudW1iZXIgPSAxO1xuXHRwcml2YXRlIF9zY2FsZVY6bnVtYmVyID0gMTtcblxuXHRwcml2YXRlIF9wb3NpdGlvbnNVcGRhdGVkOlN1Ykdlb21ldHJ5RXZlbnQ7XG5cdHByaXZhdGUgX25vcm1hbHNVcGRhdGVkOlN1Ykdlb21ldHJ5RXZlbnQ7XG5cdHByaXZhdGUgX3RhbmdlbnRzVXBkYXRlZDpTdWJHZW9tZXRyeUV2ZW50O1xuXHRwcml2YXRlIF91dnNVcGRhdGVkOlN1Ykdlb21ldHJ5RXZlbnQ7XG5cdHByaXZhdGUgX3NlY29uZGFyeVVWc1VwZGF0ZWQ6U3ViR2VvbWV0cnlFdmVudDtcblx0cHJpdmF0ZSBfam9pbnRJbmRpY2VzVXBkYXRlZDpTdWJHZW9tZXRyeUV2ZW50O1xuXHRwcml2YXRlIF9qb2ludFdlaWdodHNVcGRhdGVkOlN1Ykdlb21ldHJ5RXZlbnQ7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNjYWxlVSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NjYWxlVTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBzY2FsZVYoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zY2FsZVY7XG5cdH1cblxuXHQvKipcblx0ICogT2ZmZXJzIHRoZSBvcHRpb24gb2YgZW5hYmxpbmcgR1BVIGFjY2VsZXJhdGVkIGFuaW1hdGlvbiBvbiBza2VsZXRvbnMgbGFyZ2VyIHRoYW4gMzIgam9pbnRzXG5cdCAqIGJ5IGNvbmRlbnNpbmcgdGhlIG51bWJlciBvZiBqb2ludCBpbmRleCB2YWx1ZXMgcmVxdWlyZWQgcGVyIG1lc2guIE9ubHkgYXBwbGljYWJsZSB0b1xuXHQgKiBza2VsZXRvbiBhbmltYXRpb25zIHRoYXQgdXRpbGlzZSBtb3JlIHRoYW4gb25lIG1lc2ggb2JqZWN0LiBEZWZhdWx0cyB0byBmYWxzZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgdXNlQ29uZGVuc2VkSW5kaWNlcygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl91c2VDb25kZW5zZWRJbmRpY2VzO1xuXHR9XG5cblx0cHVibGljIHNldCB1c2VDb25kZW5zZWRJbmRpY2VzKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHRpZiAodGhpcy5fdXNlQ29uZGVuc2VkSW5kaWNlcyA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3VzZUNvbmRlbnNlZEluZGljZXMgPSB2YWx1ZTtcblxuXHRcdHRoaXMubm90aWZ5Sm9pbnRJbmRpY2VzVXBkYXRlKCk7XG5cdH1cblxuXHRwdWJsaWMgX3BVcGRhdGVTdHJpZGVPZmZzZXQoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKSB7XG5cdFx0XHR0aGlzLl9wT2Zmc2V0W1RyaWFuZ2xlU3ViR2VvbWV0cnkuVkVSVEVYX0RBVEFdID0gMDtcblxuXHRcdFx0Ly9hbHdheXMgaGF2ZSBwb3NpdGlvbnNcblx0XHRcdHRoaXMuX3BPZmZzZXRbVHJpYW5nbGVTdWJHZW9tZXRyeS5QT1NJVElPTl9EQVRBXSA9IDA7XG5cdFx0XHR2YXIgc3RyaWRlOm51bWJlciA9IDM7XG5cblx0XHRcdGlmICh0aGlzLl92ZXJ0ZXhOb3JtYWxzICE9IG51bGwpIHtcblx0XHRcdFx0dGhpcy5fcE9mZnNldFtUcmlhbmdsZVN1Ykdlb21ldHJ5Lk5PUk1BTF9EQVRBXSA9IHN0cmlkZTtcblx0XHRcdFx0c3RyaWRlICs9IDM7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl92ZXJ0ZXhUYW5nZW50cyAhPSBudWxsKSB7XG5cdFx0XHRcdHRoaXMuX3BPZmZzZXRbVHJpYW5nbGVTdWJHZW9tZXRyeS5UQU5HRU5UX0RBVEFdID0gc3RyaWRlO1xuXHRcdFx0XHRzdHJpZGUgKz0gMztcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX3V2cyAhPSBudWxsKSB7XG5cdFx0XHRcdHRoaXMuX3BPZmZzZXRbVHJpYW5nbGVTdWJHZW9tZXRyeS5VVl9EQVRBXSA9IHN0cmlkZTtcblx0XHRcdFx0c3RyaWRlICs9IDI7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLl9zZWNvbmRhcnlVVnMgIT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLl9wT2Zmc2V0W1RyaWFuZ2xlU3ViR2VvbWV0cnkuU0VDT05EQVJZX1VWX0RBVEFdID0gc3RyaWRlO1xuXHRcdFx0XHRzdHJpZGUgKz0gMjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2pvaW50SW5kaWNlcyAhPSBudWxsKSB7XG5cdFx0XHRcdHRoaXMuX3BPZmZzZXRbVHJpYW5nbGVTdWJHZW9tZXRyeS5KT0lOVF9JTkRFWF9EQVRBXSA9IHN0cmlkZTtcblx0XHRcdFx0c3RyaWRlICs9IHRoaXMuX2pvaW50c1BlclZlcnRleDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2pvaW50V2VpZ2h0cyAhPSBudWxsKSB7XG5cdFx0XHRcdHRoaXMuX3BPZmZzZXRbVHJpYW5nbGVTdWJHZW9tZXRyeS5KT0lOVF9XRUlHSFRfREFUQV0gPSBzdHJpZGU7XG5cdFx0XHRcdHN0cmlkZSArPSB0aGlzLl9qb2ludHNQZXJWZXJ0ZXg7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3BTdHJpZGVbVHJpYW5nbGVTdWJHZW9tZXRyeS5WRVJURVhfREFUQV0gPSBzdHJpZGU7XG5cdFx0XHR0aGlzLl9wU3RyaWRlW1RyaWFuZ2xlU3ViR2VvbWV0cnkuUE9TSVRJT05fREFUQV0gPSBzdHJpZGU7XG5cdFx0XHR0aGlzLl9wU3RyaWRlW1RyaWFuZ2xlU3ViR2VvbWV0cnkuTk9STUFMX0RBVEFdID0gc3RyaWRlO1xuXHRcdFx0dGhpcy5fcFN0cmlkZVtUcmlhbmdsZVN1Ykdlb21ldHJ5LlRBTkdFTlRfREFUQV0gPSBzdHJpZGU7XG5cdFx0XHR0aGlzLl9wU3RyaWRlW1RyaWFuZ2xlU3ViR2VvbWV0cnkuVVZfREFUQV0gPSBzdHJpZGU7XG5cdFx0XHR0aGlzLl9wU3RyaWRlW1RyaWFuZ2xlU3ViR2VvbWV0cnkuU0VDT05EQVJZX1VWX0RBVEFdID0gc3RyaWRlO1xuXHRcdFx0dGhpcy5fcFN0cmlkZVtUcmlhbmdsZVN1Ykdlb21ldHJ5LkpPSU5UX0lOREVYX0RBVEFdID0gc3RyaWRlO1xuXHRcdFx0dGhpcy5fcFN0cmlkZVtUcmlhbmdsZVN1Ykdlb21ldHJ5LkpPSU5UX1dFSUdIVF9EQVRBXSA9IHN0cmlkZTtcblxuXHRcdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9wTnVtVmVydGljZXMqc3RyaWRlO1xuXG5cdFx0XHRpZiAodGhpcy5fcFZlcnRpY2VzID09IG51bGwpXG5cdFx0XHRcdHRoaXMuX3BWZXJ0aWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KGxlbik7XG5cdFx0XHRlbHNlIGlmICh0aGlzLl9wVmVydGljZXMubGVuZ3RoICE9IGxlbilcblx0XHRcdFx0dGhpcy5fcFZlcnRpY2VzLmxlbmd0aCA9IGxlbjtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9wT2Zmc2V0W1RyaWFuZ2xlU3ViR2VvbWV0cnkuUE9TSVRJT05fREFUQV0gPSAwO1xuXHRcdFx0dGhpcy5fcE9mZnNldFtUcmlhbmdsZVN1Ykdlb21ldHJ5Lk5PUk1BTF9EQVRBXSA9IDA7XG5cdFx0XHR0aGlzLl9wT2Zmc2V0W1RyaWFuZ2xlU3ViR2VvbWV0cnkuVEFOR0VOVF9EQVRBXSA9IDA7XG5cdFx0XHR0aGlzLl9wT2Zmc2V0W1RyaWFuZ2xlU3ViR2VvbWV0cnkuVVZfREFUQV0gPSAwO1xuXHRcdFx0dGhpcy5fcE9mZnNldFtUcmlhbmdsZVN1Ykdlb21ldHJ5LlNFQ09OREFSWV9VVl9EQVRBXSA9IDA7XG5cdFx0XHR0aGlzLl9wT2Zmc2V0W1RyaWFuZ2xlU3ViR2VvbWV0cnkuSk9JTlRfSU5ERVhfREFUQV0gPSAwO1xuXHRcdFx0dGhpcy5fcE9mZnNldFtUcmlhbmdsZVN1Ykdlb21ldHJ5LkpPSU5UX1dFSUdIVF9EQVRBXSA9IDA7XG5cblx0XHRcdHRoaXMuX3BTdHJpZGVbVHJpYW5nbGVTdWJHZW9tZXRyeS5QT1NJVElPTl9EQVRBXSA9IDM7XG5cdFx0XHR0aGlzLl9wU3RyaWRlW1RyaWFuZ2xlU3ViR2VvbWV0cnkuTk9STUFMX0RBVEFdID0gMztcblx0XHRcdHRoaXMuX3BTdHJpZGVbVHJpYW5nbGVTdWJHZW9tZXRyeS5UQU5HRU5UX0RBVEFdID0gMztcblx0XHRcdHRoaXMuX3BTdHJpZGVbVHJpYW5nbGVTdWJHZW9tZXRyeS5VVl9EQVRBXSA9IDI7XG5cdFx0XHR0aGlzLl9wU3RyaWRlW1RyaWFuZ2xlU3ViR2VvbWV0cnkuU0VDT05EQVJZX1VWX0RBVEFdID0gMjtcblx0XHRcdHRoaXMuX3BTdHJpZGVbVHJpYW5nbGVTdWJHZW9tZXRyeS5KT0lOVF9JTkRFWF9EQVRBXSA9IHRoaXMuX2pvaW50c1BlclZlcnRleDtcblx0XHRcdHRoaXMuX3BTdHJpZGVbVHJpYW5nbGVTdWJHZW9tZXRyeS5KT0lOVF9XRUlHSFRfREFUQV0gPSB0aGlzLl9qb2ludHNQZXJWZXJ0ZXg7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcFN0cmlkZU9mZnNldERpcnR5ID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgam9pbnRzUGVyVmVydGV4KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fam9pbnRzUGVyVmVydGV4O1xuXHR9XG5cblx0cHVibGljIHNldCBqb2ludHNQZXJWZXJ0ZXgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2pvaW50c1BlclZlcnRleCA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2pvaW50c1BlclZlcnRleCA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcFN0cmlkZU9mZnNldERpcnR5ID0gdHJ1ZTtcblxuXHRcdGlmICh0aGlzLl9wQ29uY2F0ZW5hdGVBcnJheXMpXG5cdFx0XHR0aGlzLl9wTm90aWZ5VmVydGljZXNVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgYSBVViBidWZmZXIgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIHRvIGNvbnRhaW4gZHVtbXkgVVYgY29vcmRpbmF0ZXMuXG5cdCAqIFNldCB0byB0cnVlIGlmIGEgZ2VvbWV0cnkgbGFja3MgVVYgZGF0YSBidXQgdXNlcyBhIG1hdGVyaWFsIHRoYXQgcmVxdWlyZXMgaXQsIG9yIGxlYXZlIGFzIGZhbHNlXG5cdCAqIGluIGNhc2VzIHdoZXJlIFVWIGRhdGEgaXMgZXhwbGljaXRseSBkZWZpbmVkIG9yIHRoZSBtYXRlcmlhbCBkb2VzIG5vdCByZXF1aXJlIFVWIGRhdGEuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGF1dG9EZXJpdmVVVnMoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYXV0b0Rlcml2ZVVWcztcblx0fVxuXG5cdHB1YmxpYyBzZXQgYXV0b0Rlcml2ZVVWcyh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2F1dG9EZXJpdmVVVnMgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9hdXRvRGVyaXZlVVZzID0gdmFsdWU7XG5cblx0XHRpZiAodmFsdWUpXG5cdFx0XHR0aGlzLm5vdGlmeVVWc1VwZGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRydWUgaWYgdGhlIHZlcnRleCBub3JtYWxzIHNob3VsZCBiZSBkZXJpdmVkIGZyb20gdGhlIGdlb21ldHJ5LCBmYWxzZSBpZiB0aGUgdmVydGV4IG5vcm1hbHMgYXJlIHNldFxuXHQgKiBleHBsaWNpdGx5LlxuXHQgKi9cblx0cHVibGljIGdldCBhdXRvRGVyaXZlTm9ybWFscygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9hdXRvRGVyaXZlTm9ybWFscztcblx0fVxuXG5cdHB1YmxpYyBzZXQgYXV0b0Rlcml2ZU5vcm1hbHModmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9hdXRvRGVyaXZlTm9ybWFscyA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2F1dG9EZXJpdmVOb3JtYWxzID0gdmFsdWU7XG5cblx0XHRpZiAodmFsdWUpXG5cdFx0XHR0aGlzLm5vdGlmeU5vcm1hbHNVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUcnVlIGlmIHRoZSB2ZXJ0ZXggdGFuZ2VudHMgc2hvdWxkIGJlIGRlcml2ZWQgZnJvbSB0aGUgZ2VvbWV0cnksIGZhbHNlIGlmIHRoZSB2ZXJ0ZXggbm9ybWFscyBhcmUgc2V0XG5cdCAqIGV4cGxpY2l0bHkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGF1dG9EZXJpdmVUYW5nZW50cygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9hdXRvRGVyaXZlVGFuZ2VudHM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGF1dG9EZXJpdmVUYW5nZW50cyh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2F1dG9EZXJpdmVUYW5nZW50cyA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2F1dG9EZXJpdmVUYW5nZW50cyA9IHZhbHVlO1xuXG5cdFx0aWYgKHZhbHVlKVxuXHRcdFx0dGhpcy5ub3RpZnlUYW5nZW50c1VwZGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHZlcnRpY2VzKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKHRoaXMuX3Bvc2l0aW9uc0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVQb3NpdGlvbnModGhpcy5fcG9zaXRpb25zKTtcblxuXHRcdGlmICh0aGlzLl92ZXJ0ZXhOb3JtYWxzRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZVZlcnRleE5vcm1hbHModGhpcy5fdmVydGV4Tm9ybWFscyk7XG5cblx0XHRpZiAodGhpcy5fdmVydGV4VGFuZ2VudHNEaXJ0eSlcblx0XHRcdHRoaXMudXBkYXRlVmVydGV4VGFuZ2VudHModGhpcy5fdmVydGV4VGFuZ2VudHMpO1xuXG5cdFx0aWYgKHRoaXMuX3V2c0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVVVnModGhpcy5fdXZzKTtcblxuXHRcdGlmICh0aGlzLl9zZWNvbmRhcnlVVnNEaXJ0eSlcblx0XHRcdHRoaXMudXBkYXRlU2Vjb25kYXJ5VVZzKHRoaXMuX3NlY29uZGFyeVVWcyk7XG5cblx0XHRpZiAodGhpcy5fam9pbnRJbmRpY2VzRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZUpvaW50SW5kaWNlcyh0aGlzLl9qb2ludEluZGljZXMpO1xuXG5cdFx0aWYgKHRoaXMuX2pvaW50V2VpZ2h0c0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVKb2ludFdlaWdodHModGhpcy5fam9pbnRXZWlnaHRzKTtcblxuXHRcdHJldHVybiB0aGlzLl9wVmVydGljZXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgcG9zaXRpb25zKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKHRoaXMuX3Bvc2l0aW9uc0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVQb3NpdGlvbnModGhpcy5fcG9zaXRpb25zKTtcblxuXHRcdHJldHVybiB0aGlzLl9wb3NpdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgdmVydGV4Tm9ybWFscygpOkFycmF5PG51bWJlcj5cblx0e1xuXHRcdGlmICh0aGlzLl92ZXJ0ZXhOb3JtYWxzRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZVZlcnRleE5vcm1hbHModGhpcy5fdmVydGV4Tm9ybWFscyk7XG5cblx0XHRyZXR1cm4gdGhpcy5fdmVydGV4Tm9ybWFscztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB2ZXJ0ZXhUYW5nZW50cygpOkFycmF5PG51bWJlcj5cblx0e1xuXHRcdGlmICh0aGlzLl92ZXJ0ZXhUYW5nZW50c0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVWZXJ0ZXhUYW5nZW50cyh0aGlzLl92ZXJ0ZXhUYW5nZW50cyk7XG5cblx0XHRyZXR1cm4gdGhpcy5fdmVydGV4VGFuZ2VudHM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHJhdyBkYXRhIG9mIHRoZSBmYWNlIG5vcm1hbHMsIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBmYWNlcyBhcmUgbGlzdGVkIGluIHRoZSBpbmRleCBsaXN0LlxuXHQgKi9cblx0cHVibGljIGdldCBmYWNlTm9ybWFscygpOkFycmF5PG51bWJlcj5cblx0e1xuXHRcdGlmICh0aGlzLl9mYWNlTm9ybWFsc0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVGYWNlTm9ybWFscygpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2ZhY2VOb3JtYWxzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSByYXcgZGF0YSBvZiB0aGUgZmFjZSB0YW5nZXRzLCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgZmFjZXMgYXJlIGxpc3RlZCBpbiB0aGUgaW5kZXggbGlzdC5cblx0ICovXG5cdHB1YmxpYyBnZXQgZmFjZVRhbmdlbnRzKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKHRoaXMuX2ZhY2VUYW5nZW50c0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVGYWNlVGFuZ2VudHMoKTtcblxuXHRcdHJldHVybiB0aGlzLl9mYWNlVGFuZ2VudHM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgdXZzKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKHRoaXMuX3V2c0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVVVnModGhpcy5fdXZzKTtcblxuXHRcdHJldHVybiB0aGlzLl91dnM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgc2Vjb25kYXJ5VVZzKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKHRoaXMuX3NlY29uZGFyeVVWc0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVTZWNvbmRhcnlVVnModGhpcy5fc2Vjb25kYXJ5VVZzKTtcblxuXHRcdHJldHVybiB0aGlzLl9zZWNvbmRhcnlVVnM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgam9pbnRJbmRpY2VzKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKHRoaXMuX2pvaW50SW5kaWNlc0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVKb2ludEluZGljZXModGhpcy5fam9pbnRJbmRpY2VzKTtcblxuXHRcdGlmICh0aGlzLl91c2VDb25kZW5zZWRJbmRpY2VzKVxuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbmRlbnNlZEpvaW50SW5kaWNlcztcblxuXHRcdHJldHVybiB0aGlzLl9qb2ludEluZGljZXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgam9pbnRXZWlnaHRzKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKHRoaXMuX2pvaW50V2VpZ2h0c0RpcnR5KVxuXHRcdFx0dGhpcy51cGRhdGVKb2ludFdlaWdodHModGhpcy5fam9pbnRXZWlnaHRzKTtcblxuXHRcdHJldHVybiB0aGlzLl9qb2ludFdlaWdodHM7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRvIHRha2UgdGhlIHNpemUgb2YgZmFjZXMgaW50byBhY2NvdW50IHdoZW4gYXV0by1kZXJpdmluZyB2ZXJ0ZXggbm9ybWFscyBhbmQgdGFuZ2VudHMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHVzZUZhY2VXZWlnaHRzKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3VzZUZhY2VXZWlnaHRzO1xuXHR9XG5cblx0cHVibGljIHNldCB1c2VGYWNlV2VpZ2h0cyh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3VzZUZhY2VXZWlnaHRzID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fdXNlRmFjZVdlaWdodHMgPSB2YWx1ZTtcblxuXHRcdGlmICh0aGlzLl9hdXRvRGVyaXZlTm9ybWFscylcblx0XHRcdHRoaXMubm90aWZ5Tm9ybWFsc1VwZGF0ZSgpO1xuXG5cdFx0aWYgKHRoaXMuX2F1dG9EZXJpdmVUYW5nZW50cylcblx0XHRcdHRoaXMubm90aWZ5VGFuZ2VudHNVcGRhdGUoKTtcblxuXHRcdHRoaXMuX2ZhY2VOb3JtYWxzRGlydHkgPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGdldCBudW1Db25kZW5zZWRKb2ludHMoKTpudW1iZXJcblx0e1xuXHRcdGlmICh0aGlzLl9qb2ludEluZGljZXNEaXJ0eSlcblx0XHRcdHRoaXMudXBkYXRlSm9pbnRJbmRpY2VzKHRoaXMuX2pvaW50SW5kaWNlcyk7XG5cblx0XHRyZXR1cm4gdGhpcy5fbnVtQ29uZGVuc2VkSm9pbnRzO1xuXHR9XG5cblx0cHVibGljIGdldCBjb25kZW5zZWRJbmRleExvb2tVcCgpOkFycmF5PG51bWJlcj5cblx0e1xuXHRcdGlmICh0aGlzLl9qb2ludEluZGljZXNEaXJ0eSlcblx0XHRcdHRoaXMudXBkYXRlSm9pbnRJbmRpY2VzKHRoaXMuX2pvaW50SW5kaWNlcyk7XG5cblx0XHRyZXR1cm4gdGhpcy5fY29uZGVuc2VkSW5kZXhMb29rVXA7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdGNvbnN0cnVjdG9yKGNvbmNhdGVuYXRlZEFycmF5czpib29sZWFuKVxuXHR7XG5cdFx0c3VwZXIoY29uY2F0ZW5hdGVkQXJyYXlzKTtcblxuXHRcdHRoaXMuX3BTdWJNZXNoQ2xhc3MgPSBUcmlhbmdsZVN1Yk1lc2g7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Qm91bmRpbmdQb3NpdGlvbnMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRpZiAodGhpcy5fcG9zaXRpb25zRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZVBvc2l0aW9ucyh0aGlzLl9wb3NpdGlvbnMpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3Bvc2l0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHVwZGF0ZVBvc2l0aW9ucyh2YWx1ZXM6QXJyYXk8bnVtYmVyPilcblx0e1xuXHRcdHZhciBpOm51bWJlcjtcblx0XHR2YXIgaW5kZXg6bnVtYmVyO1xuXHRcdHZhciBzdHJpZGU6bnVtYmVyO1xuXHRcdHZhciBwb3NpdGlvbnM6QXJyYXk8bnVtYmVyPjtcblxuXHRcdHRoaXMuX3Bvc2l0aW9ucyA9IHZhbHVlcztcblxuXHRcdGlmICh0aGlzLl9wb3NpdGlvbnMgPT0gbnVsbClcblx0XHRcdHRoaXMuX3Bvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cblx0XHR0aGlzLl9wTnVtVmVydGljZXMgPSB0aGlzLl9wb3NpdGlvbnMubGVuZ3RoLzM7XG5cblx0XHRpZiAodGhpcy5fY29uY2F0ZW5hdGVBcnJheXMpIHtcblx0XHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fcE51bVZlcnRpY2VzKnRoaXMuZ2V0U3RyaWRlKFRyaWFuZ2xlU3ViR2VvbWV0cnkuVkVSVEVYX0RBVEEpO1xuXG5cdFx0XHRpZiAodGhpcy5fcFZlcnRpY2VzID09IG51bGwpXG5cdFx0XHRcdHRoaXMuX3BWZXJ0aWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KGxlbik7XG5cdFx0XHRlbHNlIGlmICh0aGlzLl9wVmVydGljZXMubGVuZ3RoICE9IGxlbilcblx0XHRcdFx0dGhpcy5fcFZlcnRpY2VzLmxlbmd0aCA9IGxlbjtcblxuXHRcdFx0aSA9IDA7XG5cdFx0XHRpbmRleCA9IHRoaXMuZ2V0T2Zmc2V0KFRyaWFuZ2xlU3ViR2VvbWV0cnkuUE9TSVRJT05fREFUQSk7XG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFN0cmlkZShUcmlhbmdsZVN1Ykdlb21ldHJ5LlBPU0lUSU9OX0RBVEEpO1xuXHRcdFx0cG9zaXRpb25zID0gdGhpcy5fcFZlcnRpY2VzO1xuXG5cdFx0XHR3aGlsZSAoaSA8IHZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0cG9zaXRpb25zW2luZGV4XSA9IHZhbHVlc1tpKytdO1xuXHRcdFx0XHRwb3NpdGlvbnNbaW5kZXggKyAxXSA9IHZhbHVlc1tpKytdO1xuXHRcdFx0XHRwb3NpdGlvbnNbaW5kZXggKyAyXSA9IHZhbHVlc1tpKytdO1xuXHRcdFx0XHRpbmRleCArPSBzdHJpZGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2F1dG9EZXJpdmVOb3JtYWxzKVxuXHRcdFx0dGhpcy5ub3RpZnlOb3JtYWxzVXBkYXRlKCk7XG5cblx0XHRpZiAodGhpcy5fYXV0b0Rlcml2ZVRhbmdlbnRzKVxuXHRcdFx0dGhpcy5ub3RpZnlUYW5nZW50c1VwZGF0ZSgpO1xuXG5cdFx0aWYgKHRoaXMuX2F1dG9EZXJpdmVVVnMpXG5cdFx0XHR0aGlzLm5vdGlmeVVWc1VwZGF0ZSgpXG5cblx0XHR0aGlzLnBJbnZhbGlkYXRlQm91bmRzKCk7XG5cblx0XHR0aGlzLm5vdGlmeVBvc2l0aW9uc1VwZGF0ZSgpO1xuXG5cdFx0dGhpcy5fcG9zaXRpb25zRGlydHkgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSB2ZXJ0ZXggbm9ybWFscyBiYXNlZCBvbiB0aGUgZ2VvbWV0cnkuXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlVmVydGV4Tm9ybWFscyh2YWx1ZXM6QXJyYXk8bnVtYmVyPilcblx0e1xuXHRcdHZhciBpOm51bWJlcjtcblx0XHR2YXIgaW5kZXg6bnVtYmVyO1xuXHRcdHZhciBvZmZzZXQ6bnVtYmVyO1xuXHRcdHZhciBzdHJpZGU6bnVtYmVyO1xuXHRcdHZhciBub3JtYWxzOkFycmF5PG51bWJlcj47XG5cblx0XHRpZiAoIXRoaXMuX2F1dG9EZXJpdmVOb3JtYWxzKSB7XG5cdFx0XHRpZiAoKHRoaXMuX3ZlcnRleE5vcm1hbHMgPT0gbnVsbCB8fCB2YWx1ZXMgPT0gbnVsbCkgJiYgKHRoaXMuX3ZlcnRleE5vcm1hbHMgIT0gbnVsbCB8fCB2YWx1ZXMgIT0gbnVsbCkpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKVxuXHRcdFx0XHRcdHRoaXMuX3BOb3RpZnlWZXJ0aWNlc1VwZGF0ZSgpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5fcFN0cmlkZU9mZnNldERpcnR5ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fdmVydGV4Tm9ybWFscyA9IHZhbHVlcztcblxuXHRcdFx0aWYgKHZhbHVlcyAhPSBudWxsICYmIHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKSB7XG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRpbmRleCA9IHRoaXMuZ2V0T2Zmc2V0KFRyaWFuZ2xlU3ViR2VvbWV0cnkuTk9STUFMX0RBVEEpO1xuXHRcdFx0XHRzdHJpZGUgPSB0aGlzLmdldFN0cmlkZShUcmlhbmdsZVN1Ykdlb21ldHJ5Lk5PUk1BTF9EQVRBKTtcblx0XHRcdFx0bm9ybWFscyA9IHRoaXMuX3BWZXJ0aWNlcztcblxuXHRcdFx0XHR3aGlsZSAoaSA8IHZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRub3JtYWxzW2luZGV4XSA9IHZhbHVlc1tpKytdO1xuXHRcdFx0XHRcdG5vcm1hbHNbaW5kZXggKyAxXSA9IHZhbHVlc1tpKytdO1xuXHRcdFx0XHRcdG5vcm1hbHNbaW5kZXggKyAyXSA9IHZhbHVlc1tpKytdO1xuXHRcdFx0XHRcdGluZGV4ICs9IHN0cmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy5fdmVydGV4Tm9ybWFscyA9PSBudWxsKSB7XG5cdFx0XHRcdHRoaXMuX3ZlcnRleE5vcm1hbHMgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLl9wb3NpdGlvbnMubGVuZ3RoKTtcblxuXHRcdFx0XHRpZiAodGhpcy5fY29uY2F0ZW5hdGVBcnJheXMpXG5cdFx0XHRcdFx0dGhpcy5fcE5vdGlmeVZlcnRpY2VzVXBkYXRlKCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLl9wU3RyaWRlT2Zmc2V0RGlydHkgPSB0cnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fZmFjZU5vcm1hbHNEaXJ0eSlcblx0XHRcdFx0dGhpcy51cGRhdGVGYWNlTm9ybWFscygpO1xuXG5cdFx0XHRvZmZzZXQgPSB0aGlzLmdldE9mZnNldChUcmlhbmdsZVN1Ykdlb21ldHJ5Lk5PUk1BTF9EQVRBKTtcblx0XHRcdHN0cmlkZSA9IHRoaXMuZ2V0U3RyaWRlKFRyaWFuZ2xlU3ViR2VvbWV0cnkuTk9STUFMX0RBVEEpO1xuXG5cdFx0XHQvL2F1dG9kZXJpdmVkIG5vcm1hbHNcblx0XHRcdG5vcm1hbHMgPSB0aGlzLl9jb25jYXRlbmF0ZUFycmF5cz8gdGhpcy5fcFZlcnRpY2VzIDogdGhpcy5fdmVydGV4Tm9ybWFscztcblxuXHRcdFx0dmFyIGYxOm51bWJlciA9IDA7XG5cdFx0XHR2YXIgZjI6bnVtYmVyID0gMTtcblx0XHRcdHZhciBmMzpudW1iZXIgPSAyO1xuXG5cdFx0XHRpbmRleCA9IG9mZnNldDtcblxuXHRcdFx0Ly9jbGVhciBub3JtYWwgdmFsdWVzXG5cdFx0XHR2YXIgbGVuVjpudW1iZXIgPSBub3JtYWxzLmxlbmd0aDtcblx0XHRcdHdoaWxlIChpbmRleCA8IGxlblYpIHtcblx0XHRcdFx0bm9ybWFsc1tpbmRleF0gPSAwO1xuXHRcdFx0XHRub3JtYWxzW2luZGV4ICsgMV0gPSAwO1xuXHRcdFx0XHRub3JtYWxzW2luZGV4ICsgMl0gPSAwO1xuXHRcdFx0XHRpbmRleCArPSBzdHJpZGU7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBrOm51bWJlciA9IDA7XG5cdFx0XHR2YXIgbGVuSTpudW1iZXIgPSB0aGlzLl9wSW5kaWNlcy5sZW5ndGg7XG5cdFx0XHR2YXIgd2VpZ2h0Om51bWJlcjtcblxuXHRcdFx0aSA9IDA7XG5cblx0XHRcdC8vY29sbGVjdCBmYWNlIG5vcm1hbHNcblx0XHRcdHdoaWxlIChpIDwgbGVuSSkge1xuXHRcdFx0XHR3ZWlnaHQgPSB0aGlzLl91c2VGYWNlV2VpZ2h0cz8gdGhpcy5fZmFjZVdlaWdodHNbaysrXSA6IDE7XG5cdFx0XHRcdGluZGV4ID0gb2Zmc2V0ICsgdGhpcy5fcEluZGljZXNbaSsrXSpzdHJpZGU7XG5cdFx0XHRcdG5vcm1hbHNbaW5kZXhdICs9IHRoaXMuX2ZhY2VOb3JtYWxzW2YxXSp3ZWlnaHQ7XG5cdFx0XHRcdG5vcm1hbHNbaW5kZXggKyAxXSArPSB0aGlzLl9mYWNlTm9ybWFsc1tmMl0qd2VpZ2h0O1xuXHRcdFx0XHRub3JtYWxzW2luZGV4ICsgMl0gKz0gdGhpcy5fZmFjZU5vcm1hbHNbZjNdKndlaWdodDtcblx0XHRcdFx0aW5kZXggPSBvZmZzZXQgKyB0aGlzLl9wSW5kaWNlc1tpKytdKnN0cmlkZTtcblx0XHRcdFx0bm9ybWFsc1tpbmRleF0gKz0gdGhpcy5fZmFjZU5vcm1hbHNbZjFdKndlaWdodDtcblx0XHRcdFx0bm9ybWFsc1tpbmRleCArIDFdICs9IHRoaXMuX2ZhY2VOb3JtYWxzW2YyXSp3ZWlnaHQ7XG5cdFx0XHRcdG5vcm1hbHNbaW5kZXggKyAyXSArPSB0aGlzLl9mYWNlTm9ybWFsc1tmM10qd2VpZ2h0O1xuXHRcdFx0XHRpbmRleCA9IG9mZnNldCArIHRoaXMuX3BJbmRpY2VzW2krK10qc3RyaWRlO1xuXHRcdFx0XHRub3JtYWxzW2luZGV4XSArPSB0aGlzLl9mYWNlTm9ybWFsc1tmMV0qd2VpZ2h0O1xuXHRcdFx0XHRub3JtYWxzW2luZGV4ICsgMV0gKz0gdGhpcy5fZmFjZU5vcm1hbHNbZjJdKndlaWdodDtcblx0XHRcdFx0bm9ybWFsc1tpbmRleCArIDJdICs9IHRoaXMuX2ZhY2VOb3JtYWxzW2YzXSp3ZWlnaHQ7XG5cdFx0XHRcdGYxICs9IDM7XG5cdFx0XHRcdGYyICs9IDM7XG5cdFx0XHRcdGYzICs9IDM7XG5cdFx0XHR9XG5cblx0XHRcdGkgPSAwO1xuXHRcdFx0aW5kZXggPSBvZmZzZXQ7XG5cblx0XHRcdC8vYXZlcmFnZSBub3JtYWxzIGNvbGxlY3Rpb25zXG5cdFx0XHR3aGlsZSAoaW5kZXggPCBsZW5WKSB7XG5cdFx0XHRcdHZhciB2eDpudW1iZXIgPSBub3JtYWxzW2luZGV4XTtcblx0XHRcdFx0dmFyIHZ5Om51bWJlciA9IG5vcm1hbHNbaW5kZXggKyAxXTtcblx0XHRcdFx0dmFyIHZ6Om51bWJlciA9IG5vcm1hbHNbaW5kZXggKyAyXTtcblx0XHRcdFx0dmFyIGQ6bnVtYmVyID0gMS4wL01hdGguc3FydCh2eCp2eCArIHZ5KnZ5ICsgdnoqdnopO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9jb25jYXRlbmF0ZUFycmF5cykge1xuXHRcdFx0XHRcdHRoaXMuX3ZlcnRleE5vcm1hbHNbaSsrXSA9IG5vcm1hbHNbaW5kZXhdID0gdngqZDtcblx0XHRcdFx0XHR0aGlzLl92ZXJ0ZXhOb3JtYWxzW2krK10gPSBub3JtYWxzW2luZGV4ICsgMV0gPSB2eSpkO1xuXHRcdFx0XHRcdHRoaXMuX3ZlcnRleE5vcm1hbHNbaSsrXSA9IG5vcm1hbHNbaW5kZXggKyAyXSA9IHZ6KmQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bm9ybWFsc1tpbmRleF0gPSB2eCpkO1xuXHRcdFx0XHRcdG5vcm1hbHNbaW5kZXggKyAxXSA9IHZ5KmQ7XG5cdFx0XHRcdFx0bm9ybWFsc1tpbmRleCArIDJdID0gdnoqZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGluZGV4ICs9IHN0cmlkZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLm5vdGlmeU5vcm1hbHNVcGRhdGUoKTtcblxuXHRcdHRoaXMuX3ZlcnRleE5vcm1hbHNEaXJ0eSA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIHZlcnRleCB0YW5nZW50cyBiYXNlZCBvbiB0aGUgZ2VvbWV0cnkuXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlVmVydGV4VGFuZ2VudHModmFsdWVzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGluZGV4Om51bWJlcjtcblx0XHR2YXIgb2Zmc2V0Om51bWJlcjtcblx0XHR2YXIgc3RyaWRlOm51bWJlcjtcblx0XHR2YXIgdGFuZ2VudHM6QXJyYXk8bnVtYmVyPjtcblxuXHRcdGlmICghdGhpcy5fYXV0b0Rlcml2ZVRhbmdlbnRzKSB7XG5cdFx0XHRpZiAoKHRoaXMuX3ZlcnRleFRhbmdlbnRzID09IG51bGwgfHwgdmFsdWVzID09IG51bGwpICYmICh0aGlzLl92ZXJ0ZXhUYW5nZW50cyAhPSBudWxsIHx8IHZhbHVlcyAhPSBudWxsKSkge1xuXHRcdFx0XHRpZiAodGhpcy5fY29uY2F0ZW5hdGVBcnJheXMpXG5cdFx0XHRcdFx0dGhpcy5fcE5vdGlmeVZlcnRpY2VzVXBkYXRlKCk7XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLl9wU3RyaWRlT2Zmc2V0RGlydHkgPSB0cnVlO1xuXHRcdFx0fVxuXG5cblx0XHRcdHRoaXMuX3ZlcnRleFRhbmdlbnRzID0gdmFsdWVzO1xuXG5cdFx0XHRpZiAodmFsdWVzICE9IG51bGwgJiYgdGhpcy5fY29uY2F0ZW5hdGVBcnJheXMpIHtcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdGluZGV4ID0gdGhpcy5nZXRPZmZzZXQoVHJpYW5nbGVTdWJHZW9tZXRyeS5UQU5HRU5UX0RBVEEpO1xuXHRcdFx0XHRzdHJpZGUgPSB0aGlzLmdldFN0cmlkZShUcmlhbmdsZVN1Ykdlb21ldHJ5LlRBTkdFTlRfREFUQSk7XG5cdFx0XHRcdHRhbmdlbnRzID0gdGhpcy5fcFZlcnRpY2VzO1xuXG5cdFx0XHRcdHdoaWxlIChpIDwgdmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHRhbmdlbnRzW2luZGV4XSA9IHZhbHVlc1tpKytdO1xuXHRcdFx0XHRcdHRhbmdlbnRzW2luZGV4ICsgMV0gPSB2YWx1ZXNbaSsrXTtcblx0XHRcdFx0XHR0YW5nZW50c1tpbmRleCArIDJdID0gdmFsdWVzW2krK107XG5cdFx0XHRcdFx0aW5kZXggKz0gc3RyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLl92ZXJ0ZXhUYW5nZW50cyA9PSBudWxsKSB7XG5cdFx0XHRcdHRoaXMuX3ZlcnRleFRhbmdlbnRzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5fcG9zaXRpb25zLmxlbmd0aCk7XG5cblx0XHRcdFx0aWYgKHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKVxuXHRcdFx0XHRcdHRoaXMuX3BOb3RpZnlWZXJ0aWNlc1VwZGF0ZSgpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5fcFN0cmlkZU9mZnNldERpcnR5ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2ZhY2VUYW5nZW50c0RpcnR5KVxuXHRcdFx0XHR0aGlzLnVwZGF0ZUZhY2VUYW5nZW50cygpO1xuXG5cdFx0XHRvZmZzZXQgPSB0aGlzLmdldE9mZnNldChUcmlhbmdsZVN1Ykdlb21ldHJ5LlRBTkdFTlRfREFUQSk7XG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFN0cmlkZShUcmlhbmdsZVN1Ykdlb21ldHJ5LlRBTkdFTlRfREFUQSk7XG5cblx0XHRcdC8vYXV0b2Rlcml2ZWQgdGFuZ2VudHNcblx0XHRcdHRhbmdlbnRzID0gdGhpcy5fY29uY2F0ZW5hdGVBcnJheXM/IHRoaXMuX3BWZXJ0aWNlcyA6IHRoaXMuX3ZlcnRleFRhbmdlbnRzO1xuXG5cdFx0XHRpbmRleCA9IG9mZnNldDtcblxuXHRcdFx0Ly9jbGVhciB0YW5nZW50IHZhbHVlc1xuXHRcdFx0dmFyIGxlblY6bnVtYmVyID0gdGFuZ2VudHMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGluZGV4IDwgbGVuVikge1xuXHRcdFx0XHR0YW5nZW50c1tpbmRleF0gPSAwO1xuXHRcdFx0XHR0YW5nZW50c1tpbmRleCArIDFdID0gMDtcblx0XHRcdFx0dGFuZ2VudHNbaW5kZXggKyAyXSA9IDA7XG5cblx0XHRcdFx0aW5kZXggKz0gc3RyaWRlO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgazpudW1iZXIgPSAwO1xuXHRcdFx0dmFyIHdlaWdodDpudW1iZXI7XG5cdFx0XHR2YXIgZjE6bnVtYmVyID0gMDtcblx0XHRcdHZhciBmMjpudW1iZXIgPSAxO1xuXHRcdFx0dmFyIGYzOm51bWJlciA9IDI7XG5cblx0XHRcdGkgPSAwO1xuXG5cdFx0XHQvL2NvbGxlY3QgZmFjZSB0YW5nZW50c1xuXHRcdFx0dmFyIGxlbkk6bnVtYmVyID0gdGhpcy5fcEluZGljZXMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGkgPCBsZW5JKSB7XG5cdFx0XHRcdHdlaWdodCA9IHRoaXMuX3VzZUZhY2VXZWlnaHRzPyB0aGlzLl9mYWNlV2VpZ2h0c1trKytdIDogMTtcblx0XHRcdFx0aW5kZXggPSBvZmZzZXQgKyB0aGlzLl9wSW5kaWNlc1tpKytdKnN0cmlkZTtcblx0XHRcdFx0dGFuZ2VudHNbaW5kZXgrK10gKz0gdGhpcy5fZmFjZVRhbmdlbnRzW2YxXSp3ZWlnaHQ7XG5cdFx0XHRcdHRhbmdlbnRzW2luZGV4KytdICs9IHRoaXMuX2ZhY2VUYW5nZW50c1tmMl0qd2VpZ2h0O1xuXHRcdFx0XHR0YW5nZW50c1tpbmRleF0gKz0gdGhpcy5fZmFjZVRhbmdlbnRzW2YzXSp3ZWlnaHQ7XG5cdFx0XHRcdGluZGV4ID0gb2Zmc2V0ICsgdGhpcy5fcEluZGljZXNbaSsrXSpzdHJpZGU7XG5cdFx0XHRcdHRhbmdlbnRzW2luZGV4KytdICs9IHRoaXMuX2ZhY2VUYW5nZW50c1tmMV0qd2VpZ2h0O1xuXHRcdFx0XHR0YW5nZW50c1tpbmRleCsrXSArPSB0aGlzLl9mYWNlVGFuZ2VudHNbZjJdKndlaWdodDtcblx0XHRcdFx0dGFuZ2VudHNbaW5kZXhdICs9IHRoaXMuX2ZhY2VUYW5nZW50c1tmM10qd2VpZ2h0O1xuXHRcdFx0XHRpbmRleCA9IG9mZnNldCArIHRoaXMuX3BJbmRpY2VzW2krK10qc3RyaWRlO1xuXHRcdFx0XHR0YW5nZW50c1tpbmRleCsrXSArPSB0aGlzLl9mYWNlVGFuZ2VudHNbZjFdKndlaWdodDtcblx0XHRcdFx0dGFuZ2VudHNbaW5kZXgrK10gKz0gdGhpcy5fZmFjZVRhbmdlbnRzW2YyXSp3ZWlnaHQ7XG5cdFx0XHRcdHRhbmdlbnRzW2luZGV4XSArPSB0aGlzLl9mYWNlVGFuZ2VudHNbZjNdKndlaWdodDtcblx0XHRcdFx0ZjEgKz0gMztcblx0XHRcdFx0ZjIgKz0gMztcblx0XHRcdFx0ZjMgKz0gMztcblx0XHRcdH1cblxuXHRcdFx0aSA9IDA7XG5cdFx0XHRpbmRleCA9IG9mZnNldDtcblxuXHRcdFx0Ly9hdmVyYWdlIHRhbmdlbnRzIGNvbGxlY3Rpb25zXG5cdFx0XHR3aGlsZSAoaW5kZXggPCBsZW5WKSB7XG5cdFx0XHRcdHZhciB2eDpudW1iZXIgPSB0YW5nZW50c1tpbmRleF07XG5cdFx0XHRcdHZhciB2eTpudW1iZXIgPSB0YW5nZW50c1tpbmRleCArIDFdO1xuXHRcdFx0XHR2YXIgdno6bnVtYmVyID0gdGFuZ2VudHNbaW5kZXggKyAyXTtcblx0XHRcdFx0dmFyIGQ6bnVtYmVyID0gMS4wL01hdGguc3FydCh2eCp2eCArIHZ5KnZ5ICsgdnoqdnopO1xuXG5cdFx0XHRcdGlmICh0aGlzLl9jb25jYXRlbmF0ZUFycmF5cykge1xuXHRcdFx0XHRcdHRoaXMuX3ZlcnRleFRhbmdlbnRzW2krK10gPSB0YW5nZW50c1tpbmRleF0gPSB2eCpkO1xuXHRcdFx0XHRcdHRoaXMuX3ZlcnRleFRhbmdlbnRzW2krK10gPSB0YW5nZW50c1tpbmRleCArIDFdID0gdnkqZDtcblx0XHRcdFx0XHR0aGlzLl92ZXJ0ZXhUYW5nZW50c1tpKytdID0gdGFuZ2VudHNbaW5kZXggKyAyXSA9IHZ6KmQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGFuZ2VudHNbaW5kZXhdID0gdngqZDtcblx0XHRcdFx0XHR0YW5nZW50c1tpbmRleCArIDFdID0gdnkqZDtcblx0XHRcdFx0XHR0YW5nZW50c1tpbmRleCArIDJdID0gdnoqZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGluZGV4ICs9IHN0cmlkZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLm5vdGlmeVRhbmdlbnRzVXBkYXRlKCk7XG5cblx0XHR0aGlzLl92ZXJ0ZXhUYW5nZW50c0RpcnR5ID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgdXZzIGJhc2VkIG9uIHRoZSBnZW9tZXRyeS5cblx0ICovXG5cdHB1YmxpYyB1cGRhdGVVVnModmFsdWVzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGluZGV4Om51bWJlcjtcblx0XHR2YXIgb2Zmc2V0Om51bWJlcjtcblx0XHR2YXIgc3RyaWRlOm51bWJlcjtcblx0XHR2YXIgdXZzOkFycmF5PG51bWJlcj47XG5cblx0XHRpZiAoIXRoaXMuX2F1dG9EZXJpdmVVVnMpIHtcblx0XHRcdGlmICgodGhpcy5fdXZzID09IG51bGwgfHwgdmFsdWVzID09IG51bGwpICYmICh0aGlzLl91dnMgIT0gbnVsbCB8fCB2YWx1ZXMgIT0gbnVsbCkpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKVxuXHRcdFx0XHRcdHRoaXMuX3BOb3RpZnlWZXJ0aWNlc1VwZGF0ZSgpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5fcFN0cmlkZU9mZnNldERpcnR5ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fdXZzID0gdmFsdWVzO1xuXG5cdFx0XHRpZiAodmFsdWVzICE9IG51bGwgJiYgdGhpcy5fY29uY2F0ZW5hdGVBcnJheXMpIHtcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdGluZGV4ID0gdGhpcy5nZXRPZmZzZXQoVHJpYW5nbGVTdWJHZW9tZXRyeS5VVl9EQVRBKTtcblx0XHRcdFx0c3RyaWRlID0gdGhpcy5nZXRTdHJpZGUoVHJpYW5nbGVTdWJHZW9tZXRyeS5VVl9EQVRBKTtcblx0XHRcdFx0dXZzID0gdGhpcy5fcFZlcnRpY2VzO1xuXG5cdFx0XHRcdHdoaWxlIChpIDwgdmFsdWVzLmxlbmd0aCkge1xuXHRcdFx0XHRcdHV2c1tpbmRleF0gPSB2YWx1ZXNbaSsrXTtcblx0XHRcdFx0XHR1dnNbaW5kZXggKyAxXSA9IHZhbHVlc1tpKytdO1xuXHRcdFx0XHRcdGluZGV4ICs9IHN0cmlkZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLl91dnMgPT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLl91dnMgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLl9wb3NpdGlvbnMubGVuZ3RoKjIvMyk7XG5cblx0XHRcdFx0aWYgKHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKVxuXHRcdFx0XHRcdHRoaXMuX3BOb3RpZnlWZXJ0aWNlc1VwZGF0ZSgpO1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5fcFN0cmlkZU9mZnNldERpcnR5ID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0b2Zmc2V0ID0gdGhpcy5nZXRPZmZzZXQoVHJpYW5nbGVTdWJHZW9tZXRyeS5VVl9EQVRBKTtcblx0XHRcdHN0cmlkZSA9IHRoaXMuZ2V0U3RyaWRlKFRyaWFuZ2xlU3ViR2VvbWV0cnkuVVZfREFUQSk7XG5cblx0XHRcdC8vYXV0b2Rlcml2ZWQgdXZzXG5cdFx0XHR1dnMgPSB0aGlzLl9jb25jYXRlbmF0ZUFycmF5cz8gdGhpcy5fcFZlcnRpY2VzIDogdGhpcy5fdXZzO1xuXG5cdFx0XHRpID0gMDtcblx0XHRcdGluZGV4ID0gb2Zmc2V0O1xuXHRcdFx0dmFyIHV2SWR4Om51bWJlciA9IDA7XG5cblx0XHRcdC8vY2xlYXIgdXYgdmFsdWVzXG5cdFx0XHR2YXIgbGVuVjpudW1iZXIgPSB1dnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKGluZGV4IDwgbGVuVikge1xuXHRcdFx0XHRpZiAodGhpcy5fY29uY2F0ZW5hdGVBcnJheXMpIHtcblx0XHRcdFx0XHR0aGlzLl91dnNbaSsrXSA9IHV2c1tpbmRleF0gPSB1dklkeCouNTtcblx0XHRcdFx0XHR0aGlzLl91dnNbaSsrXSA9IHV2c1tpbmRleCArIDFdID0gMS4wIC0gKHV2SWR4ICYgMSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dXZzW2luZGV4XSA9IHV2SWR4Ki41O1xuXHRcdFx0XHRcdHV2c1tpbmRleCArIDFdID0gMS4wIC0gKHV2SWR4ICYgMSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoKyt1dklkeCA9PSAzKVxuXHRcdFx0XHRcdHV2SWR4ID0gMDtcblxuXHRcdFx0XHRpbmRleCArPSBzdHJpZGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2F1dG9EZXJpdmVUYW5nZW50cylcblx0XHRcdHRoaXMubm90aWZ5VGFuZ2VudHNVcGRhdGUoKTtcblxuXHRcdHRoaXMubm90aWZ5VVZzVXBkYXRlKCk7XG5cblx0XHR0aGlzLl91dnNEaXJ0eSA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIHNlY29uZGFyeSB1dnMgYmFzZWQgb24gdGhlIGdlb21ldHJ5LlxuXHQgKi9cblx0cHVibGljIHVwZGF0ZVNlY29uZGFyeVVWcyh2YWx1ZXM6QXJyYXk8bnVtYmVyPilcblx0e1xuXHRcdHZhciBpOm51bWJlcjtcblx0XHR2YXIgaW5kZXg6bnVtYmVyO1xuXHRcdHZhciBvZmZzZXQ6bnVtYmVyO1xuXHRcdHZhciBzdHJpZGU6bnVtYmVyO1xuXHRcdHZhciB1dnM6QXJyYXk8bnVtYmVyPjtcblxuXHRcdGlmICh0aGlzLl9jb25jYXRlbmF0ZUFycmF5cyAmJiAodGhpcy5fc2Vjb25kYXJ5VVZzID09IG51bGwgfHwgdmFsdWVzID09IG51bGwpICYmICh0aGlzLl9zZWNvbmRhcnlVVnMgIT0gbnVsbCB8fCB2YWx1ZXMgIT0gbnVsbCkpXG5cdFx0XHR0aGlzLl9wTm90aWZ5VmVydGljZXNVcGRhdGUoKTtcblxuXHRcdHRoaXMuX3NlY29uZGFyeVVWcyA9IHZhbHVlcztcblxuXHRcdGlmICh2YWx1ZXMgIT0gbnVsbCAmJiB0aGlzLl9jb25jYXRlbmF0ZUFycmF5cykge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5nZXRPZmZzZXQoVHJpYW5nbGVTdWJHZW9tZXRyeS5TRUNPTkRBUllfVVZfREFUQSk7XG5cdFx0XHRzdHJpZGUgPSB0aGlzLmdldFN0cmlkZShUcmlhbmdsZVN1Ykdlb21ldHJ5LlNFQ09OREFSWV9VVl9EQVRBKTtcblxuXHRcdFx0aSA9IDA7XG5cdFx0XHRpbmRleCA9IG9mZnNldDtcblx0XHRcdHV2cyA9IHRoaXMuX3BWZXJ0aWNlcztcblxuXHRcdFx0d2hpbGUgKGkgPCB2YWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHV2c1tpbmRleF0gPSB2YWx1ZXNbaSsrXTtcblx0XHRcdFx0dXZzW2luZGV4ICsgMV0gPSB2YWx1ZXNbaSsrXTtcblx0XHRcdFx0aW5kZXggKz0gc3RyaWRlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMubm90aWZ5U2Vjb25kYXJ5VVZzVXBkYXRlKCk7XG5cblx0XHR0aGlzLl9zZWNvbmRhcnlVVnNEaXJ0eSA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGpvaW50IGluZGljZXNcblx0ICovXG5cdHB1YmxpYyB1cGRhdGVKb2ludEluZGljZXModmFsdWVzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGo6bnVtYmVyO1xuXHRcdHZhciBpbmRleDpudW1iZXI7XG5cdFx0dmFyIG9mZnNldDpudW1iZXI7XG5cdFx0dmFyIHN0cmlkZTpudW1iZXI7XG5cdFx0dmFyIGpvaW50SW5kaWNlczpBcnJheTxudW1iZXI+O1xuXG5cdFx0aWYgKHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzICYmICh0aGlzLl9qb2ludEluZGljZXMgPT0gbnVsbCB8fCB2YWx1ZXMgPT0gbnVsbCkgJiYgKHRoaXMuX2pvaW50SW5kaWNlcyAhPSBudWxsIHx8IHZhbHVlcyAhPSBudWxsKSlcblx0XHRcdHRoaXMuX3BOb3RpZnlWZXJ0aWNlc1VwZGF0ZSgpO1xuXG5cdFx0dGhpcy5fam9pbnRJbmRpY2VzID0gdmFsdWVzO1xuXG5cdFx0aWYgKHZhbHVlcyAhPSBudWxsKSB7XG5cdFx0XHRvZmZzZXQgPSB0aGlzLmdldE9mZnNldChUcmlhbmdsZVN1Ykdlb21ldHJ5LkpPSU5UX0lOREVYX0RBVEEpO1xuXHRcdFx0c3RyaWRlID0gdGhpcy5nZXRTdHJpZGUoVHJpYW5nbGVTdWJHZW9tZXRyeS5KT0lOVF9JTkRFWF9EQVRBKTtcblx0XHRcdGlmICh0aGlzLl91c2VDb25kZW5zZWRJbmRpY2VzKSB7XG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRqID0gMDtcblx0XHRcdFx0aW5kZXggPSBvZmZzZXQ7XG5cdFx0XHRcdGpvaW50SW5kaWNlcyA9IHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzPyB0aGlzLl9wVmVydGljZXMgOiB0aGlzLl9jb25kZW5zZWRKb2ludEluZGljZXM7XG5cdFx0XHRcdHZhciBvbGRJbmRleDpudW1iZXI7XG5cdFx0XHRcdHZhciBuZXdJbmRleDpudW1iZXIgPSAwO1xuXHRcdFx0XHR2YXIgZGljOk9iamVjdCA9IG5ldyBPYmplY3QoKTtcblxuXHRcdFx0XHRpZiAoIXRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKVxuXHRcdFx0XHRcdHRoaXMuX2NvbmRlbnNlZEpvaW50SW5kaWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KHZhbHVlcy5sZW5ndGgpO1xuXG5cdFx0XHRcdHRoaXMuX2NvbmRlbnNlZEluZGV4TG9va1VwID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblxuXHRcdFx0XHR3aGlsZSAoaSA8IHZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRmb3IgKGogPSAwOyBqIDwgdGhpcy5fam9pbnRzUGVyVmVydGV4OyBqKyspIHtcblx0XHRcdFx0XHRcdG9sZEluZGV4ID0gdmFsdWVzW2krK107XG5cblx0XHRcdFx0XHRcdC8vIGlmIHdlIGVuY291bnRlciBhIG5ldyBpbmRleCwgYXNzaWduIGl0IGEgbmV3IGNvbmRlbnNlZCBpbmRleFxuXHRcdFx0XHRcdFx0aWYgKGRpY1tvbGRJbmRleF0gPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdGRpY1tvbGRJbmRleF0gPSBuZXdJbmRleCozOyAvLzMgcmVxdWlyZWQgZm9yIHRoZSB0aHJlZSB2ZWN0b3JzIHRoYXQgc3RvcmUgdGhlIG1hdHJpeFxuXHRcdFx0XHRcdFx0XHR0aGlzLl9jb25kZW5zZWRJbmRleExvb2tVcFtuZXdJbmRleCsrXSA9IG9sZEluZGV4O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0am9pbnRJbmRpY2VzW2luZGV4ICsgal0gPSBkaWNbb2xkSW5kZXhdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpbmRleCArPSBzdHJpZGU7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5fbnVtQ29uZGVuc2VkSm9pbnRzID0gbmV3SW5kZXg7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKSB7XG5cblx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdGluZGV4ID0gb2Zmc2V0O1xuXHRcdFx0XHRqb2ludEluZGljZXMgPSB0aGlzLl9wVmVydGljZXM7XG5cblx0XHRcdFx0d2hpbGUgKGkgPCB2YWx1ZXMubGVuZ3RoKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKGogPCB0aGlzLl9qb2ludHNQZXJWZXJ0ZXgpXG5cdFx0XHRcdFx0XHRqb2ludEluZGljZXNbaW5kZXggKyBqKytdID0gdmFsdWVzW2krK107XG5cdFx0XHRcdFx0aW5kZXggKz0gc3RyaWRlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5ub3RpZnlKb2ludEluZGljZXNVcGRhdGUoKTtcblxuXHRcdHRoaXMuX2pvaW50SW5kaWNlc0RpcnR5ID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgam9pbnQgd2VpZ2h0cy5cblx0ICovXG5cdHB1YmxpYyB1cGRhdGVKb2ludFdlaWdodHModmFsdWVzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGo6bnVtYmVyO1xuXHRcdHZhciBpbmRleDpudW1iZXI7XG5cdFx0dmFyIG9mZnNldDpudW1iZXI7XG5cdFx0dmFyIHN0cmlkZTpudW1iZXI7XG5cdFx0dmFyIGpvaW50V2VpZ2h0czpBcnJheTxudW1iZXI+O1xuXG5cdFx0aWYgKHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzICYmICh0aGlzLl9qb2ludFdlaWdodHMgPT0gbnVsbCB8fCB2YWx1ZXMgPT0gbnVsbCkgJiYgKHRoaXMuX2pvaW50V2VpZ2h0cyAhPSBudWxsIHx8IHZhbHVlcyAhPSBudWxsKSlcblx0XHRcdHRoaXMuX3BOb3RpZnlWZXJ0aWNlc1VwZGF0ZSgpO1xuXG5cdFx0dGhpcy5fam9pbnRXZWlnaHRzID0gdmFsdWVzO1xuXG5cdFx0aWYgKHZhbHVlcyAhPSBudWxsICYmIHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKSB7XG5cdFx0XHRvZmZzZXQgPSB0aGlzLmdldE9mZnNldChUcmlhbmdsZVN1Ykdlb21ldHJ5LkpPSU5UX1dFSUdIVF9EQVRBKTtcblx0XHRcdHN0cmlkZSA9IHRoaXMuZ2V0U3RyaWRlKFRyaWFuZ2xlU3ViR2VvbWV0cnkuSk9JTlRfV0VJR0hUX0RBVEEpO1xuXG5cdFx0XHRpID0gMDtcblx0XHRcdGluZGV4ID0gb2Zmc2V0O1xuXHRcdFx0am9pbnRXZWlnaHRzID0gdGhpcy5fcFZlcnRpY2VzO1xuXG5cdFx0XHR3aGlsZSAoaSA8IHZhbHVlcy5sZW5ndGgpIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlIChqIDwgdGhpcy5fam9pbnRzUGVyVmVydGV4KVxuXHRcdFx0XHRcdGpvaW50V2VpZ2h0c1tpbmRleCArIGorK10gPSB2YWx1ZXNbaSsrXTtcblx0XHRcdFx0aW5kZXggKz0gc3RyaWRlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMubm90aWZ5Sm9pbnRXZWlnaHRzVXBkYXRlKCk7XG5cblx0XHR0aGlzLl9qb2ludFdlaWdodHNEaXJ0eSA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHRzdXBlci5kaXNwb3NlKCk7XG5cblx0XHR0aGlzLl9wb3NpdGlvbnMgPSBudWxsO1xuXHRcdHRoaXMuX3ZlcnRleE5vcm1hbHMgPSBudWxsO1xuXHRcdHRoaXMuX3ZlcnRleFRhbmdlbnRzID0gbnVsbDtcblx0XHR0aGlzLl91dnMgPSBudWxsO1xuXHRcdHRoaXMuX3NlY29uZGFyeVVWcyA9IG51bGw7XG5cdFx0dGhpcy5fam9pbnRJbmRpY2VzID0gbnVsbDtcblx0XHR0aGlzLl9qb2ludFdlaWdodHMgPSBudWxsO1xuXG5cdFx0dGhpcy5fZmFjZU5vcm1hbHMgPSBudWxsO1xuXHRcdHRoaXMuX2ZhY2VXZWlnaHRzID0gbnVsbDtcblx0XHR0aGlzLl9mYWNlVGFuZ2VudHMgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGZhY2UgaW5kaWNlcyBvZiB0aGUgVHJpYW5nbGVTdWJHZW9tZXRyeS5cblx0ICpcblx0ICogQHBhcmFtIGluZGljZXMgVGhlIGZhY2UgaW5kaWNlcyB0byB1cGxvYWQuXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlSW5kaWNlcyhpbmRpY2VzOkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHRzdXBlci51cGRhdGVJbmRpY2VzKGluZGljZXMpO1xuXG5cdFx0dGhpcy5fZmFjZU5vcm1hbHNEaXJ0eSA9IHRydWU7XG5cblx0XHRpZiAodGhpcy5fYXV0b0Rlcml2ZU5vcm1hbHMpXG5cdFx0XHR0aGlzLl92ZXJ0ZXhOb3JtYWxzRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKHRoaXMuX2F1dG9EZXJpdmVUYW5nZW50cylcblx0XHRcdHRoaXMuX3ZlcnRleFRhbmdlbnRzRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKHRoaXMuX2F1dG9EZXJpdmVVVnMpXG5cdFx0XHR0aGlzLl91dnNEaXJ0eSA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvbmVzIHRoZSBjdXJyZW50IG9iamVjdFxuXHQgKiBAcmV0dXJuIEFuIGV4YWN0IGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY2xvbmUoKTpUcmlhbmdsZVN1Ykdlb21ldHJ5XG5cdHtcblx0XHR2YXIgY2xvbmU6VHJpYW5nbGVTdWJHZW9tZXRyeSA9IG5ldyBUcmlhbmdsZVN1Ykdlb21ldHJ5KHRoaXMuX2NvbmNhdGVuYXRlQXJyYXlzKTtcblx0XHRjbG9uZS51cGRhdGVJbmRpY2VzKHRoaXMuX3BJbmRpY2VzLmNvbmNhdCgpKTtcblx0XHRjbG9uZS51cGRhdGVQb3NpdGlvbnModGhpcy5fcG9zaXRpb25zLmNvbmNhdCgpKTtcblxuXHRcdGlmICh0aGlzLl92ZXJ0ZXhOb3JtYWxzICYmICF0aGlzLl9hdXRvRGVyaXZlTm9ybWFscylcblx0XHRcdGNsb25lLnVwZGF0ZVZlcnRleE5vcm1hbHModGhpcy5fdmVydGV4Tm9ybWFscy5jb25jYXQoKSk7XG5cdFx0ZWxzZVxuXHRcdFx0Y2xvbmUudXBkYXRlVmVydGV4Tm9ybWFscyhudWxsKTtcblxuXHRcdGlmICh0aGlzLl91dnMgJiYgIXRoaXMuX2F1dG9EZXJpdmVVVnMpXG5cdFx0XHRjbG9uZS51cGRhdGVVVnModGhpcy5fdXZzLmNvbmNhdCgpKTtcblx0XHRlbHNlXG5cdFx0XHRjbG9uZS51cGRhdGVVVnMobnVsbCk7XG5cblx0XHRpZiAodGhpcy5fdmVydGV4VGFuZ2VudHMgJiYgIXRoaXMuX2F1dG9EZXJpdmVUYW5nZW50cylcblx0XHRcdGNsb25lLnVwZGF0ZVZlcnRleFRhbmdlbnRzKHRoaXMuX3ZlcnRleFRhbmdlbnRzLmNvbmNhdCgpKTtcblx0XHRlbHNlXG5cdFx0XHRjbG9uZS51cGRhdGVWZXJ0ZXhUYW5nZW50cyhudWxsKTtcblxuXHRcdGlmICh0aGlzLl9zZWNvbmRhcnlVVnMpXG5cdFx0XHRjbG9uZS51cGRhdGVTZWNvbmRhcnlVVnModGhpcy5fc2Vjb25kYXJ5VVZzLmNvbmNhdCgpKTtcblxuXHRcdGlmICh0aGlzLl9qb2ludEluZGljZXMpIHtcblx0XHRcdGNsb25lLmpvaW50c1BlclZlcnRleCA9IHRoaXMuX2pvaW50c1BlclZlcnRleDtcblx0XHRcdGNsb25lLnVwZGF0ZUpvaW50SW5kaWNlcyh0aGlzLl9qb2ludEluZGljZXMuY29uY2F0KCkpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9qb2ludFdlaWdodHMpXG5cdFx0XHRjbG9uZS51cGRhdGVKb2ludFdlaWdodHModGhpcy5fam9pbnRXZWlnaHRzLmNvbmNhdCgpKTtcblxuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdHB1YmxpYyBzY2FsZVVWKHNjYWxlVTpudW1iZXIgPSAxLCBzY2FsZVY6bnVtYmVyID0gMSlcblx0e1xuXHRcdHZhciBpbmRleDpudW1iZXI7XG5cdFx0dmFyIG9mZnNldDpudW1iZXI7XG5cdFx0dmFyIHN0cmlkZTpudW1iZXI7XG5cdFx0dmFyIHV2czpBcnJheTxudW1iZXI+O1xuXG5cdFx0dXZzID0gdGhpcy5fdXZzO1xuXG5cdFx0dmFyIHJhdGlvVTpudW1iZXIgPSBzY2FsZVUvdGhpcy5fc2NhbGVVO1xuXHRcdHZhciByYXRpb1Y6bnVtYmVyID0gc2NhbGVWL3RoaXMuX3NjYWxlVjtcblxuXHRcdHRoaXMuX3NjYWxlVSA9IHNjYWxlVTtcblx0XHR0aGlzLl9zY2FsZVYgPSBzY2FsZVY7XG5cblx0XHR2YXIgbGVuOm51bWJlciA9IHV2cy5sZW5ndGg7XG5cblx0XHRvZmZzZXQgPSAwO1xuXHRcdHN0cmlkZSA9IDI7XG5cblx0XHRpbmRleCA9IG9mZnNldDtcblxuXHRcdHdoaWxlIChpbmRleCA8IGxlbikge1xuXHRcdFx0dXZzW2luZGV4XSAqPSByYXRpb1U7XG5cdFx0XHR1dnNbaW5kZXggKyAxXSAqPSByYXRpb1Y7XG5cdFx0XHRpbmRleCArPSBzdHJpZGU7XG5cdFx0fVxuXG5cdFx0dGhpcy5ub3RpZnlVVnNVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTY2FsZXMgdGhlIGdlb21ldHJ5LlxuXHQgKiBAcGFyYW0gc2NhbGUgVGhlIGFtb3VudCBieSB3aGljaCB0byBzY2FsZS5cblx0ICovXG5cdHB1YmxpYyBzY2FsZShzY2FsZTpudW1iZXIpXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGluZGV4Om51bWJlcjtcblx0XHR2YXIgb2Zmc2V0Om51bWJlcjtcblx0XHR2YXIgc3RyaWRlOm51bWJlcjtcblx0XHR2YXIgcG9zaXRpb25zOkFycmF5PG51bWJlcj47XG5cblx0XHRwb3NpdGlvbnMgPSB0aGlzLl9wb3NpdGlvbnM7XG5cblx0XHR2YXIgbGVuOm51bWJlciA9IHBvc2l0aW9ucy5sZW5ndGg7XG5cblx0XHRvZmZzZXQgPSAwO1xuXHRcdHN0cmlkZSA9IDM7XG5cblx0XHRpID0gMDtcblx0XHRpbmRleCA9IG9mZnNldDtcblx0XHR3aGlsZSAoaSA8IGxlbikge1xuXHRcdFx0cG9zaXRpb25zW2luZGV4XSAqPSBzY2FsZTtcblx0XHRcdHBvc2l0aW9uc1tpbmRleCArIDFdICo9IHNjYWxlO1xuXHRcdFx0cG9zaXRpb25zW2luZGV4ICsgMl0gKj0gc2NhbGU7XG5cblx0XHRcdGkgKz0gMztcblx0XHRcdGluZGV4ICs9IHN0cmlkZTtcblx0XHR9XG5cblx0XHR0aGlzLm5vdGlmeVBvc2l0aW9uc1VwZGF0ZSgpO1xuXHR9XG5cblx0cHVibGljIGFwcGx5VHJhbnNmb3JtYXRpb24odHJhbnNmb3JtOk1hdHJpeDNEKVxuXHR7XG5cdFx0dmFyIHBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdHZhciBub3JtYWxzOkFycmF5PG51bWJlcj47XG5cdFx0dmFyIHRhbmdlbnRzOkFycmF5PG51bWJlcj47XG5cblx0XHRpZiAodGhpcy5fY29uY2F0ZW5hdGVBcnJheXMpIHtcblx0XHRcdHBvc2l0aW9ucyA9IHRoaXMuX3BWZXJ0aWNlcztcblx0XHRcdG5vcm1hbHMgPSB0aGlzLl9wVmVydGljZXM7XG5cdFx0XHR0YW5nZW50cyA9IHRoaXMuX3BWZXJ0aWNlcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zaXRpb25zID0gdGhpcy5fcG9zaXRpb25zO1xuXHRcdFx0bm9ybWFscyA9IHRoaXMuX3ZlcnRleE5vcm1hbHM7XG5cdFx0XHR0YW5nZW50cyA9IHRoaXMuX3ZlcnRleFRhbmdlbnRzO1xuXHRcdH1cblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fcG9zaXRpb25zLmxlbmd0aC8zO1xuXHRcdHZhciBpOm51bWJlcjtcblx0XHR2YXIgaTE6bnVtYmVyO1xuXHRcdHZhciBpMjpudW1iZXI7XG5cdFx0dmFyIHZlY3RvcjpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdFx0dmFyIGJha2VOb3JtYWxzOmJvb2xlYW4gPSB0aGlzLl92ZXJ0ZXhOb3JtYWxzICE9IG51bGw7XG5cdFx0dmFyIGJha2VUYW5nZW50czpib29sZWFuID0gdGhpcy5fdmVydGV4VGFuZ2VudHMgIT0gbnVsbDtcblx0XHR2YXIgaW52VHJhbnNwb3NlOk1hdHJpeDNEO1xuXG5cdFx0aWYgKGJha2VOb3JtYWxzIHx8IGJha2VUYW5nZW50cykge1xuXHRcdFx0aW52VHJhbnNwb3NlID0gdHJhbnNmb3JtLmNsb25lKCk7XG5cdFx0XHRpbnZUcmFuc3Bvc2UuaW52ZXJ0KCk7XG5cdFx0XHRpbnZUcmFuc3Bvc2UudHJhbnNwb3NlKCk7XG5cdFx0fVxuXG5cdFx0dmFyIHZpMDpudW1iZXIgPSB0aGlzLmdldE9mZnNldChUcmlhbmdsZVN1Ykdlb21ldHJ5LlBPU0lUSU9OX0RBVEEpO1xuXHRcdHZhciBuaTA6bnVtYmVyID0gdGhpcy5nZXRPZmZzZXQoVHJpYW5nbGVTdWJHZW9tZXRyeS5OT1JNQUxfREFUQSk7XG5cdFx0dmFyIHRpMDpudW1iZXIgPSB0aGlzLmdldE9mZnNldChUcmlhbmdsZVN1Ykdlb21ldHJ5LlRBTkdFTlRfREFUQSk7XG5cblx0XHR2YXIgdlN0cmlkZTpudW1iZXIgPSB0aGlzLmdldFN0cmlkZShUcmlhbmdsZVN1Ykdlb21ldHJ5LlBPU0lUSU9OX0RBVEEpO1xuXHRcdHZhciBuU3RyaWRlOm51bWJlciA9IHRoaXMuZ2V0U3RyaWRlKFRyaWFuZ2xlU3ViR2VvbWV0cnkuTk9STUFMX0RBVEEpO1xuXHRcdHZhciB0U3RyaWRlOm51bWJlciA9IHRoaXMuZ2V0U3RyaWRlKFRyaWFuZ2xlU3ViR2VvbWV0cnkuVEFOR0VOVF9EQVRBKTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkge1xuXHRcdFx0aTEgPSB2aTAgKyAxO1xuXHRcdFx0aTIgPSB2aTAgKyAyO1xuXG5cdFx0XHQvLyBiYWtlIHBvc2l0aW9uXG5cdFx0XHR2ZWN0b3IueCA9IHBvc2l0aW9uc1t2aTBdO1xuXHRcdFx0dmVjdG9yLnkgPSBwb3NpdGlvbnNbaTFdO1xuXHRcdFx0dmVjdG9yLnogPSBwb3NpdGlvbnNbaTJdO1xuXHRcdFx0dmVjdG9yID0gdHJhbnNmb3JtLnRyYW5zZm9ybVZlY3Rvcih2ZWN0b3IpO1xuXHRcdFx0cG9zaXRpb25zW3ZpMF0gPSB2ZWN0b3IueDtcblx0XHRcdHBvc2l0aW9uc1tpMV0gPSB2ZWN0b3IueTtcblx0XHRcdHBvc2l0aW9uc1tpMl0gPSB2ZWN0b3Iuejtcblx0XHRcdHZpMCArPSB2U3RyaWRlO1xuXG5cdFx0XHQvLyBiYWtlIG5vcm1hbFxuXHRcdFx0aWYgKGJha2VOb3JtYWxzKSB7XG5cdFx0XHRcdGkxID0gbmkwICsgMTtcblx0XHRcdFx0aTIgPSBuaTAgKyAyO1xuXHRcdFx0XHR2ZWN0b3IueCA9IG5vcm1hbHNbbmkwXTtcblx0XHRcdFx0dmVjdG9yLnkgPSBub3JtYWxzW2kxXTtcblx0XHRcdFx0dmVjdG9yLnogPSBub3JtYWxzW2kyXTtcblx0XHRcdFx0dmVjdG9yID0gaW52VHJhbnNwb3NlLmRlbHRhVHJhbnNmb3JtVmVjdG9yKHZlY3Rvcik7XG5cdFx0XHRcdHZlY3Rvci5ub3JtYWxpemUoKTtcblx0XHRcdFx0bm9ybWFsc1tuaTBdID0gdmVjdG9yLng7XG5cdFx0XHRcdG5vcm1hbHNbaTFdID0gdmVjdG9yLnk7XG5cdFx0XHRcdG5vcm1hbHNbaTJdID0gdmVjdG9yLno7XG5cdFx0XHRcdG5pMCArPSBuU3RyaWRlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBiYWtlIHRhbmdlbnRcblx0XHRcdGlmIChiYWtlVGFuZ2VudHMpIHtcblx0XHRcdFx0aTEgPSB0aTAgKyAxO1xuXHRcdFx0XHRpMiA9IHRpMCArIDI7XG5cdFx0XHRcdHZlY3Rvci54ID0gdGFuZ2VudHNbdGkwXTtcblx0XHRcdFx0dmVjdG9yLnkgPSB0YW5nZW50c1tpMV07XG5cdFx0XHRcdHZlY3Rvci56ID0gdGFuZ2VudHNbaTJdO1xuXHRcdFx0XHR2ZWN0b3IgPSBpbnZUcmFuc3Bvc2UuZGVsdGFUcmFuc2Zvcm1WZWN0b3IodmVjdG9yKTtcblx0XHRcdFx0dmVjdG9yLm5vcm1hbGl6ZSgpO1xuXHRcdFx0XHR0YW5nZW50c1t0aTBdID0gdmVjdG9yLng7XG5cdFx0XHRcdHRhbmdlbnRzW2kxXSA9IHZlY3Rvci55O1xuXHRcdFx0XHR0YW5nZW50c1tpMl0gPSB2ZWN0b3Iuejtcblx0XHRcdFx0dGkwICs9IHRTdHJpZGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5ub3RpZnlQb3NpdGlvbnNVcGRhdGUoKTtcblx0XHR0aGlzLm5vdGlmeU5vcm1hbHNVcGRhdGUoKTtcblx0XHR0aGlzLm5vdGlmeVRhbmdlbnRzVXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgdGFuZ2VudHMgZm9yIGVhY2ggZmFjZS5cblx0ICovXG5cdHByaXZhdGUgdXBkYXRlRmFjZVRhbmdlbnRzKClcblx0e1xuXHRcdHZhciBpOm51bWJlciA9IDA7XG5cdFx0dmFyIGluZGV4MTpudW1iZXI7XG5cdFx0dmFyIGluZGV4MjpudW1iZXI7XG5cdFx0dmFyIGluZGV4MzpudW1iZXI7XG5cdFx0dmFyIHZpOm51bWJlcjtcblx0XHR2YXIgdjA6bnVtYmVyO1xuXHRcdHZhciBkdjE6bnVtYmVyO1xuXHRcdHZhciBkdjI6bnVtYmVyO1xuXHRcdHZhciBkZW5vbTpudW1iZXI7XG5cdFx0dmFyIHgwOm51bWJlciwgeTA6bnVtYmVyLCB6MDpudW1iZXI7XG5cdFx0dmFyIGR4MTpudW1iZXIsIGR5MTpudW1iZXIsIGR6MTpudW1iZXI7XG5cdFx0dmFyIGR4MjpudW1iZXIsIGR5MjpudW1iZXIsIGR6MjpudW1iZXI7XG5cdFx0dmFyIGN4Om51bWJlciwgY3k6bnVtYmVyLCBjejpudW1iZXI7XG5cblx0XHR2YXIgcG9zaXRpb25zOkFycmF5PG51bWJlcj4gPSB0aGlzLl9wb3NpdGlvbnNcblx0XHR2YXIgdXZzOkFycmF5PG51bWJlcj4gPSB0aGlzLl91dnM7XG5cblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX3BJbmRpY2VzLmxlbmd0aDtcblxuXHRcdGlmICh0aGlzLl9mYWNlVGFuZ2VudHMgPT0gbnVsbClcblx0XHRcdHRoaXMuX2ZhY2VUYW5nZW50cyA9IG5ldyBBcnJheTxudW1iZXI+KGxlbik7XG5cblx0XHR3aGlsZSAoaSA8IGxlbikge1xuXHRcdFx0aW5kZXgxID0gdGhpcy5fcEluZGljZXNbaV07XG5cdFx0XHRpbmRleDIgPSB0aGlzLl9wSW5kaWNlc1tpICsgMV07XG5cdFx0XHRpbmRleDMgPSB0aGlzLl9wSW5kaWNlc1tpICsgMl07XG5cblx0XHRcdHYwID0gdXZzW2luZGV4MSoyICsgMV07XG5cdFx0XHRkdjEgPSB1dnNbaW5kZXgyKjIgKyAxXSAtIHYwO1xuXHRcdFx0ZHYyID0gdXZzW2luZGV4MyoyICsgMV0gLSB2MDtcblxuXHRcdFx0dmkgPSBpbmRleDEqMztcblx0XHRcdHgwID0gcG9zaXRpb25zW3ZpXTtcblx0XHRcdHkwID0gcG9zaXRpb25zW3ZpICsgMV07XG5cdFx0XHR6MCA9IHBvc2l0aW9uc1t2aSArIDJdO1xuXHRcdFx0dmkgPSBpbmRleDIqMztcblx0XHRcdGR4MSA9IHBvc2l0aW9uc1t2aV0gLSB4MDtcblx0XHRcdGR5MSA9IHBvc2l0aW9uc1t2aSArIDFdIC0geTA7XG5cdFx0XHRkejEgPSBwb3NpdGlvbnNbdmkgKyAyXSAtIHowO1xuXHRcdFx0dmkgPSBpbmRleDMqMztcblx0XHRcdGR4MiA9IHBvc2l0aW9uc1t2aV0gLSB4MDtcblx0XHRcdGR5MiA9IHBvc2l0aW9uc1t2aSArIDFdIC0geTA7XG5cdFx0XHRkejIgPSBwb3NpdGlvbnNbdmkgKyAyXSAtIHowO1xuXG5cdFx0XHRjeCA9IGR2MipkeDEgLSBkdjEqZHgyO1xuXHRcdFx0Y3kgPSBkdjIqZHkxIC0gZHYxKmR5Mjtcblx0XHRcdGN6ID0gZHYyKmR6MSAtIGR2MSpkejI7XG5cdFx0XHRkZW5vbSA9IDEvTWF0aC5zcXJ0KGN4KmN4ICsgY3kqY3kgKyBjeipjeik7XG5cblx0XHRcdHRoaXMuX2ZhY2VUYW5nZW50c1tpKytdID0gZGVub20qY3g7XG5cdFx0XHR0aGlzLl9mYWNlVGFuZ2VudHNbaSsrXSA9IGRlbm9tKmN5O1xuXHRcdFx0dGhpcy5fZmFjZVRhbmdlbnRzW2krK10gPSBkZW5vbSpjejtcblx0XHR9XG5cblx0XHR0aGlzLl9mYWNlVGFuZ2VudHNEaXJ0eSA9IGZhbHNlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIG5vcm1hbHMgZm9yIGVhY2ggZmFjZS5cblx0ICovXG5cdHByaXZhdGUgdXBkYXRlRmFjZU5vcm1hbHMoKVxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyID0gMDtcblx0XHR2YXIgajpudW1iZXIgPSAwO1xuXHRcdHZhciBrOm51bWJlciA9IDA7XG5cdFx0dmFyIGluZGV4Om51bWJlcjtcblx0XHR2YXIgb2Zmc2V0Om51bWJlcjtcblx0XHR2YXIgc3RyaWRlOm51bWJlcjtcblxuXHRcdHZhciB4MTpudW1iZXIsIHgyOm51bWJlciwgeDM6bnVtYmVyO1xuXHRcdHZhciB5MTpudW1iZXIsIHkyOm51bWJlciwgeTM6bnVtYmVyO1xuXHRcdHZhciB6MTpudW1iZXIsIHoyOm51bWJlciwgejM6bnVtYmVyO1xuXHRcdHZhciBkeDE6bnVtYmVyLCBkeTE6bnVtYmVyLCBkejE6bnVtYmVyO1xuXHRcdHZhciBkeDI6bnVtYmVyLCBkeTI6bnVtYmVyLCBkejI6bnVtYmVyO1xuXHRcdHZhciBjeDpudW1iZXIsIGN5Om51bWJlciwgY3o6bnVtYmVyO1xuXHRcdHZhciBkOm51bWJlcjtcblxuXHRcdHZhciBwb3NpdGlvbnM6QXJyYXk8bnVtYmVyPiA9IHRoaXMuX3Bvc2l0aW9ucztcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fcEluZGljZXMubGVuZ3RoO1xuXG5cdFx0aWYgKHRoaXMuX2ZhY2VOb3JtYWxzID09IG51bGwpXG5cdFx0XHR0aGlzLl9mYWNlTm9ybWFscyA9IG5ldyBBcnJheTxudW1iZXI+KGxlbik7XG5cblx0XHRpZiAodGhpcy5fdXNlRmFjZVdlaWdodHMgJiYgdGhpcy5fZmFjZVdlaWdodHMgPT0gbnVsbClcblx0XHRcdHRoaXMuX2ZhY2VXZWlnaHRzID0gbmV3IEFycmF5PG51bWJlcj4obGVuLzMpO1xuXG5cdFx0d2hpbGUgKGkgPCBsZW4pIHtcblx0XHRcdGluZGV4ID0gdGhpcy5fcEluZGljZXNbaSsrXSozO1xuXHRcdFx0eDEgPSBwb3NpdGlvbnNbaW5kZXhdO1xuXHRcdFx0eTEgPSBwb3NpdGlvbnNbaW5kZXggKyAxXTtcblx0XHRcdHoxID0gcG9zaXRpb25zW2luZGV4ICsgMl07XG5cdFx0XHRpbmRleCA9IHRoaXMuX3BJbmRpY2VzW2krK10qMztcblx0XHRcdHgyID0gcG9zaXRpb25zW2luZGV4XTtcblx0XHRcdHkyID0gcG9zaXRpb25zW2luZGV4ICsgMV07XG5cdFx0XHR6MiA9IHBvc2l0aW9uc1tpbmRleCArIDJdO1xuXHRcdFx0aW5kZXggPSB0aGlzLl9wSW5kaWNlc1tpKytdKjM7XG5cdFx0XHR4MyA9IHBvc2l0aW9uc1tpbmRleF07XG5cdFx0XHR5MyA9IHBvc2l0aW9uc1tpbmRleCArIDFdO1xuXHRcdFx0ejMgPSBwb3NpdGlvbnNbaW5kZXggKyAyXTtcblx0XHRcdGR4MSA9IHgzIC0geDE7XG5cdFx0XHRkeTEgPSB5MyAtIHkxO1xuXHRcdFx0ZHoxID0gejMgLSB6MTtcblx0XHRcdGR4MiA9IHgyIC0geDE7XG5cdFx0XHRkeTIgPSB5MiAtIHkxO1xuXHRcdFx0ZHoyID0gejIgLSB6MTtcblx0XHRcdGN4ID0gZHoxKmR5MiAtIGR5MSpkejI7XG5cdFx0XHRjeSA9IGR4MSpkejIgLSBkejEqZHgyO1xuXHRcdFx0Y3ogPSBkeTEqZHgyIC0gZHgxKmR5Mjtcblx0XHRcdGQgPSBNYXRoLnNxcnQoY3gqY3ggKyBjeSpjeSArIGN6KmN6KTtcblx0XHRcdC8vIGxlbmd0aCBvZiBjcm9zcyBwcm9kdWN0ID0gMip0cmlhbmdsZSBhcmVhXG5cblx0XHRcdGlmICh0aGlzLl91c2VGYWNlV2VpZ2h0cykge1xuXHRcdFx0XHR2YXIgdzpudW1iZXIgPSBkKjEwMDAwO1xuXG5cdFx0XHRcdGlmICh3IDwgMSlcblx0XHRcdFx0XHR3ID0gMTtcblxuXHRcdFx0XHR0aGlzLl9mYWNlV2VpZ2h0c1trKytdID0gdztcblx0XHRcdH1cblxuXHRcdFx0ZCA9IDEvZDtcblxuXHRcdFx0dGhpcy5fZmFjZU5vcm1hbHNbaisrXSA9IGN4KmQ7XG5cdFx0XHR0aGlzLl9mYWNlTm9ybWFsc1tqKytdID0gY3kqZDtcblx0XHRcdHRoaXMuX2ZhY2VOb3JtYWxzW2orK10gPSBjeipkO1xuXHRcdH1cblxuXHRcdHRoaXMuX2ZhY2VOb3JtYWxzRGlydHkgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBfcE5vdGlmeVZlcnRpY2VzVXBkYXRlKClcblx0e1xuXHRcdHRoaXMuX3BTdHJpZGVPZmZzZXREaXJ0eSA9IHRydWU7XG5cblx0XHR0aGlzLm5vdGlmeVBvc2l0aW9uc1VwZGF0ZSgpO1xuXHRcdHRoaXMubm90aWZ5Tm9ybWFsc1VwZGF0ZSgpO1xuXHRcdHRoaXMubm90aWZ5VGFuZ2VudHNVcGRhdGUoKTtcblx0XHR0aGlzLm5vdGlmeVVWc1VwZGF0ZSgpO1xuXHRcdHRoaXMubm90aWZ5U2Vjb25kYXJ5VVZzVXBkYXRlKCk7XG5cdFx0dGhpcy5ub3RpZnlKb2ludEluZGljZXNVcGRhdGUoKTtcblx0XHR0aGlzLm5vdGlmeUpvaW50V2VpZ2h0c1VwZGF0ZSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBub3RpZnlQb3NpdGlvbnNVcGRhdGUoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3Bvc2l0aW9uc0RpcnR5KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcG9zaXRpb25zRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKCF0aGlzLl9wb3NpdGlvbnNVcGRhdGVkKVxuXHRcdFx0dGhpcy5fcG9zaXRpb25zVXBkYXRlZCA9IG5ldyBTdWJHZW9tZXRyeUV2ZW50KFN1Ykdlb21ldHJ5RXZlbnQuVkVSVElDRVNfVVBEQVRFRCwgVHJpYW5nbGVTdWJHZW9tZXRyeS5QT1NJVElPTl9EQVRBKTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9wb3NpdGlvbnNVcGRhdGVkKTtcblx0fVxuXG5cdHByaXZhdGUgbm90aWZ5Tm9ybWFsc1VwZGF0ZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fdmVydGV4Tm9ybWFsc0RpcnR5KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fdmVydGV4Tm9ybWFsc0RpcnR5ID0gdHJ1ZTtcblxuXHRcdGlmICghdGhpcy5fbm9ybWFsc1VwZGF0ZWQpXG5cdFx0XHR0aGlzLl9ub3JtYWxzVXBkYXRlZCA9IG5ldyBTdWJHZW9tZXRyeUV2ZW50KFN1Ykdlb21ldHJ5RXZlbnQuVkVSVElDRVNfVVBEQVRFRCwgVHJpYW5nbGVTdWJHZW9tZXRyeS5OT1JNQUxfREFUQSk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQodGhpcy5fbm9ybWFsc1VwZGF0ZWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBub3RpZnlUYW5nZW50c1VwZGF0ZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fdmVydGV4VGFuZ2VudHNEaXJ0eSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3ZlcnRleFRhbmdlbnRzRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKCF0aGlzLl90YW5nZW50c1VwZGF0ZWQpXG5cdFx0XHR0aGlzLl90YW5nZW50c1VwZGF0ZWQgPSBuZXcgU3ViR2VvbWV0cnlFdmVudChTdWJHZW9tZXRyeUV2ZW50LlZFUlRJQ0VTX1VQREFURUQsIFRyaWFuZ2xlU3ViR2VvbWV0cnkuVEFOR0VOVF9EQVRBKTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl90YW5nZW50c1VwZGF0ZWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBub3RpZnlVVnNVcGRhdGUoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3V2c0RpcnR5KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fdXZzRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKCF0aGlzLl91dnNVcGRhdGVkKVxuXHRcdFx0dGhpcy5fdXZzVXBkYXRlZCA9IG5ldyBTdWJHZW9tZXRyeUV2ZW50KFN1Ykdlb21ldHJ5RXZlbnQuVkVSVElDRVNfVVBEQVRFRCwgVHJpYW5nbGVTdWJHZW9tZXRyeS5VVl9EQVRBKTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl91dnNVcGRhdGVkKTtcblx0fVxuXG5cdHByaXZhdGUgbm90aWZ5U2Vjb25kYXJ5VVZzVXBkYXRlKClcblx0e1xuXHRcdGlmICh0aGlzLl9zZWNvbmRhcnlVVnNEaXJ0eSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3NlY29uZGFyeVVWc0RpcnR5ID0gdHJ1ZTtcblxuXHRcdGlmICghdGhpcy5fc2Vjb25kYXJ5VVZzVXBkYXRlZClcblx0XHRcdHRoaXMuX3NlY29uZGFyeVVWc1VwZGF0ZWQgPSBuZXcgU3ViR2VvbWV0cnlFdmVudChTdWJHZW9tZXRyeUV2ZW50LlZFUlRJQ0VTX1VQREFURUQsIFRyaWFuZ2xlU3ViR2VvbWV0cnkuU0VDT05EQVJZX1VWX0RBVEEpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX3NlY29uZGFyeVVWc1VwZGF0ZWQpO1xuXHR9XG5cblx0cHJpdmF0ZSBub3RpZnlKb2ludEluZGljZXNVcGRhdGUoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2pvaW50SW5kaWNlc0RpcnR5KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fam9pbnRJbmRpY2VzRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKCF0aGlzLl9qb2ludEluZGljZXNVcGRhdGVkKVxuXHRcdFx0dGhpcy5fam9pbnRJbmRpY2VzVXBkYXRlZCA9IG5ldyBTdWJHZW9tZXRyeUV2ZW50KFN1Ykdlb21ldHJ5RXZlbnQuVkVSVElDRVNfVVBEQVRFRCwgVHJpYW5nbGVTdWJHZW9tZXRyeS5KT0lOVF9JTkRFWF9EQVRBKTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9qb2ludEluZGljZXNVcGRhdGVkKTtcblx0fVxuXG5cdHByaXZhdGUgbm90aWZ5Sm9pbnRXZWlnaHRzVXBkYXRlKClcblx0e1xuXHRcdGlmICh0aGlzLl9qb2ludFdlaWdodHNEaXJ0eSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2pvaW50V2VpZ2h0c0RpcnR5ID0gdHJ1ZTtcblxuXHRcdGlmICghdGhpcy5fam9pbnRXZWlnaHRzVXBkYXRlZClcblx0XHRcdHRoaXMuX2pvaW50V2VpZ2h0c1VwZGF0ZWQgPSBuZXcgU3ViR2VvbWV0cnlFdmVudChTdWJHZW9tZXRyeUV2ZW50LlZFUlRJQ0VTX1VQREFURUQsIFRyaWFuZ2xlU3ViR2VvbWV0cnkuSk9JTlRfV0VJR0hUX0RBVEEpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX2pvaW50V2VpZ2h0c1VwZGF0ZWQpO1xuXHR9XG59XG5cbmV4cG9ydCA9IFRyaWFuZ2xlU3ViR2VvbWV0cnk7Il19 \ No newline at end of file diff --git a/lib/core/base/TriangleSubGeometry.ts b/lib/core/base/TriangleSubGeometry.ts new file mode 100644 index 00000000..e4dcc6a2 --- /dev/null +++ b/lib/core/base/TriangleSubGeometry.ts @@ -0,0 +1,1454 @@ +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubMesh = require("awayjs-core/lib/core/base/TriangleSubMesh"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import SubGeometryEvent = require("awayjs-core/lib/events/SubGeometryEvent"); + +/** + * @class away.base.TriangleSubGeometry + */ +class TriangleSubGeometry extends SubGeometryBase +{ + public static POSITION_DATA:string = "positions"; + public static NORMAL_DATA:string = "vertexNormals"; + public static TANGENT_DATA:string = "vertexTangents"; + public static UV_DATA:string = "uvs"; + public static SECONDARY_UV_DATA:string = "secondaryUVs"; + public static JOINT_INDEX_DATA:string = "jointIndices"; + public static JOINT_WEIGHT_DATA:string = "jointWeights"; + + //TODO - move these to StageGL + public static POSITION_FORMAT:string = "float3"; + public static NORMAL_FORMAT:string = "float3"; + public static TANGENT_FORMAT:string = "float3"; + public static UV_FORMAT:string = "float2"; + public static SECONDARY_UV_FORMAT:string = "float2"; + + private _positionsDirty:boolean = true; + private _faceNormalsDirty:boolean = true; + private _faceTangentsDirty:boolean = true; + private _vertexNormalsDirty:boolean = true; + private _vertexTangentsDirty:boolean = true; + private _uvsDirty:boolean = true; + private _secondaryUVsDirty:boolean = true; + private _jointIndicesDirty:boolean = true; + private _jointWeightsDirty:boolean = true; + + private _positions:Array; + private _vertexNormals:Array; + private _vertexTangents:Array; + private _uvs:Array; + private _secondaryUVs:Array; + private _jointIndices:Array; + private _jointWeights:Array; + + private _useCondensedIndices:boolean; + private _condensedJointIndices:Array; + private _condensedIndexLookUp:Array; + private _numCondensedJoints:number; + + private _jointsPerVertex:number; + + private _concatenateArrays:boolean = true; + private _autoDeriveNormals:boolean = true; + private _autoDeriveTangents:boolean = true; + private _autoDeriveUVs:boolean = false; + private _useFaceWeights:boolean = false; + + private _faceNormals:Array; + private _faceTangents:Array; + private _faceWeights:Array; + + private _scaleU:number = 1; + private _scaleV:number = 1; + + private _positionsUpdated:SubGeometryEvent; + private _normalsUpdated:SubGeometryEvent; + private _tangentsUpdated:SubGeometryEvent; + private _uvsUpdated:SubGeometryEvent; + private _secondaryUVsUpdated:SubGeometryEvent; + private _jointIndicesUpdated:SubGeometryEvent; + private _jointWeightsUpdated:SubGeometryEvent; + + /** + * + */ + public get scaleU():number + { + return this._scaleU; + } + + /** + * + */ + public get scaleV():number + { + return this._scaleV; + } + + /** + * Offers the option of enabling GPU accelerated animation on skeletons larger than 32 joints + * by condensing the number of joint index values required per mesh. Only applicable to + * skeleton animations that utilise more than one mesh object. Defaults to false. + */ + public get useCondensedIndices():boolean + { + return this._useCondensedIndices; + } + + public set useCondensedIndices(value:boolean) + { + if (this._useCondensedIndices == value) + return; + + this._useCondensedIndices = value; + + this.notifyJointIndicesUpdate(); + } + + public _pUpdateStrideOffset() + { + if (this._concatenateArrays) { + this._pOffset[TriangleSubGeometry.VERTEX_DATA] = 0; + + //always have positions + this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; + var stride:number = 3; + + if (this._vertexNormals != null) { + this._pOffset[TriangleSubGeometry.NORMAL_DATA] = stride; + stride += 3; + } + + if (this._vertexTangents != null) { + this._pOffset[TriangleSubGeometry.TANGENT_DATA] = stride; + stride += 3; + } + + if (this._uvs != null) { + this._pOffset[TriangleSubGeometry.UV_DATA] = stride; + stride += 2; + } + + if (this._secondaryUVs != null) { + this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; + stride += 2; + } + + if (this._jointIndices != null) { + this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; + stride += this._jointsPerVertex; + } + + if (this._jointWeights != null) { + this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; + stride += this._jointsPerVertex; + } + + this._pStride[TriangleSubGeometry.VERTEX_DATA] = stride; + this._pStride[TriangleSubGeometry.POSITION_DATA] = stride; + this._pStride[TriangleSubGeometry.NORMAL_DATA] = stride; + this._pStride[TriangleSubGeometry.TANGENT_DATA] = stride; + this._pStride[TriangleSubGeometry.UV_DATA] = stride; + this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; + this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; + this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; + + var len:number = this._pNumVertices*stride; + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + + } else { + this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; + this._pOffset[TriangleSubGeometry.NORMAL_DATA] = 0; + this._pOffset[TriangleSubGeometry.TANGENT_DATA] = 0; + this._pOffset[TriangleSubGeometry.UV_DATA] = 0; + this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = 0; + this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = 0; + this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = 0; + + this._pStride[TriangleSubGeometry.POSITION_DATA] = 3; + this._pStride[TriangleSubGeometry.NORMAL_DATA] = 3; + this._pStride[TriangleSubGeometry.TANGENT_DATA] = 3; + this._pStride[TriangleSubGeometry.UV_DATA] = 2; + this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = 2; + this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = this._jointsPerVertex; + this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = this._jointsPerVertex; + } + + this._pStrideOffsetDirty = false; + } + + /** + * + */ + public get jointsPerVertex():number + { + return this._jointsPerVertex; + } + + public set jointsPerVertex(value:number) + { + if (this._jointsPerVertex == value) + return; + + this._jointsPerVertex = value; + + this._pStrideOffsetDirty = true; + + if (this._pConcatenateArrays) + this._pNotifyVerticesUpdate(); + } + + /** + * Defines whether a UV buffer should be automatically generated to contain dummy UV coordinates. + * Set to true if a geometry lacks UV data but uses a material that requires it, or leave as false + * in cases where UV data is explicitly defined or the material does not require UV data. + */ + public get autoDeriveUVs():boolean + { + return this._autoDeriveUVs; + } + + public set autoDeriveUVs(value:boolean) + { + if (this._autoDeriveUVs == value) + return; + + this._autoDeriveUVs = value; + + if (value) + this.notifyUVsUpdate(); + } + + /** + * True if the vertex normals should be derived from the geometry, false if the vertex normals are set + * explicitly. + */ + public get autoDeriveNormals():boolean + { + return this._autoDeriveNormals; + } + + public set autoDeriveNormals(value:boolean) + { + if (this._autoDeriveNormals == value) + return; + + this._autoDeriveNormals = value; + + if (value) + this.notifyNormalsUpdate(); + } + + /** + * True if the vertex tangents should be derived from the geometry, false if the vertex normals are set + * explicitly. + */ + public get autoDeriveTangents():boolean + { + return this._autoDeriveTangents; + } + + public set autoDeriveTangents(value:boolean) + { + if (this._autoDeriveTangents == value) + return; + + this._autoDeriveTangents = value; + + if (value) + this.notifyTangentsUpdate(); + } + + /** + * + */ + public get vertices():Array + { + if (this._positionsDirty) + this.updatePositions(this._positions); + + if (this._vertexNormalsDirty) + this.updateVertexNormals(this._vertexNormals); + + if (this._vertexTangentsDirty) + this.updateVertexTangents(this._vertexTangents); + + if (this._uvsDirty) + this.updateUVs(this._uvs); + + if (this._secondaryUVsDirty) + this.updateSecondaryUVs(this._secondaryUVs); + + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + if (this._jointWeightsDirty) + this.updateJointWeights(this._jointWeights); + + return this._pVertices; + } + + /** + * + */ + public get positions():Array + { + if (this._positionsDirty) + this.updatePositions(this._positions); + + return this._positions; + } + + /** + * + */ + public get vertexNormals():Array + { + if (this._vertexNormalsDirty) + this.updateVertexNormals(this._vertexNormals); + + return this._vertexNormals; + } + + /** + * + */ + public get vertexTangents():Array + { + if (this._vertexTangentsDirty) + this.updateVertexTangents(this._vertexTangents); + + return this._vertexTangents; + } + + /** + * The raw data of the face normals, in the same order as the faces are listed in the index list. + */ + public get faceNormals():Array + { + if (this._faceNormalsDirty) + this.updateFaceNormals(); + + return this._faceNormals; + } + + /** + * The raw data of the face tangets, in the same order as the faces are listed in the index list. + */ + public get faceTangents():Array + { + if (this._faceTangentsDirty) + this.updateFaceTangents(); + + return this._faceTangents; + } + + /** + * + */ + public get uvs():Array + { + if (this._uvsDirty) + this.updateUVs(this._uvs); + + return this._uvs; + } + + /** + * + */ + public get secondaryUVs():Array + { + if (this._secondaryUVsDirty) + this.updateSecondaryUVs(this._secondaryUVs); + + return this._secondaryUVs; + } + + /** + * + */ + public get jointIndices():Array + { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + if (this._useCondensedIndices) + return this._condensedJointIndices; + + return this._jointIndices; + } + + /** + * + */ + public get jointWeights():Array + { + if (this._jointWeightsDirty) + this.updateJointWeights(this._jointWeights); + + return this._jointWeights; + } + + /** + * Indicates whether or not to take the size of faces into account when auto-deriving vertex normals and tangents. + */ + public get useFaceWeights():boolean + { + return this._useFaceWeights; + } + + public set useFaceWeights(value:boolean) + { + if (this._useFaceWeights == value) + return; + + this._useFaceWeights = value; + + if (this._autoDeriveNormals) + this.notifyNormalsUpdate(); + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + this._faceNormalsDirty = true; + } + + public get numCondensedJoints():number + { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + return this._numCondensedJoints; + } + + public get condensedIndexLookUp():Array + { + if (this._jointIndicesDirty) + this.updateJointIndices(this._jointIndices); + + return this._condensedIndexLookUp; + } + + /** + * + */ + constructor(concatenatedArrays:boolean) + { + super(concatenatedArrays); + + this._pSubMeshClass = TriangleSubMesh; + } + + public getBoundingPositions():Array + { + if (this._positionsDirty) + this.updatePositions(this._positions); + + return this._positions; + } + + /** + * + */ + public updatePositions(values:Array) + { + var i:number; + var index:number; + var stride:number; + var positions:Array; + + this._positions = values; + + if (this._positions == null) + this._positions = new Array(); + + this._pNumVertices = this._positions.length/3; + + if (this._concatenateArrays) { + var len:number = this._pNumVertices*this.getStride(TriangleSubGeometry.VERTEX_DATA); + + if (this._pVertices == null) + this._pVertices = new Array(len); + else if (this._pVertices.length != len) + this._pVertices.length = len; + + i = 0; + index = this.getOffset(TriangleSubGeometry.POSITION_DATA); + stride = this.getStride(TriangleSubGeometry.POSITION_DATA); + positions = this._pVertices; + + while (i < values.length) { + positions[index] = values[i++]; + positions[index + 1] = values[i++]; + positions[index + 2] = values[i++]; + index += stride; + } + } + + if (this._autoDeriveNormals) + this.notifyNormalsUpdate(); + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + if (this._autoDeriveUVs) + this.notifyUVsUpdate() + + this.pInvalidateBounds(); + + this.notifyPositionsUpdate(); + + this._positionsDirty = false; + } + + /** + * Updates the vertex normals based on the geometry. + */ + public updateVertexNormals(values:Array) + { + var i:number; + var index:number; + var offset:number; + var stride:number; + var normals:Array; + + if (!this._autoDeriveNormals) { + if ((this._vertexNormals == null || values == null) && (this._vertexNormals != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + this._vertexNormals = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); + normals = this._pVertices; + + while (i < values.length) { + normals[index] = values[i++]; + normals[index + 1] = values[i++]; + normals[index + 2] = values[i++]; + index += stride; + } + } + } else { + if (this._vertexNormals == null) { + this._vertexNormals = new Array(this._positions.length); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + if (this._faceNormalsDirty) + this.updateFaceNormals(); + + offset = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); + + //autoderived normals + normals = this._concatenateArrays? this._pVertices : this._vertexNormals; + + var f1:number = 0; + var f2:number = 1; + var f3:number = 2; + + index = offset; + + //clear normal values + var lenV:number = normals.length; + while (index < lenV) { + normals[index] = 0; + normals[index + 1] = 0; + normals[index + 2] = 0; + index += stride; + } + + var k:number = 0; + var lenI:number = this._pIndices.length; + var weight:number; + + i = 0; + + //collect face normals + while (i < lenI) { + weight = this._useFaceWeights? this._faceWeights[k++] : 1; + index = offset + this._pIndices[i++]*stride; + normals[index] += this._faceNormals[f1]*weight; + normals[index + 1] += this._faceNormals[f2]*weight; + normals[index + 2] += this._faceNormals[f3]*weight; + index = offset + this._pIndices[i++]*stride; + normals[index] += this._faceNormals[f1]*weight; + normals[index + 1] += this._faceNormals[f2]*weight; + normals[index + 2] += this._faceNormals[f3]*weight; + index = offset + this._pIndices[i++]*stride; + normals[index] += this._faceNormals[f1]*weight; + normals[index + 1] += this._faceNormals[f2]*weight; + normals[index + 2] += this._faceNormals[f3]*weight; + f1 += 3; + f2 += 3; + f3 += 3; + } + + i = 0; + index = offset; + + //average normals collections + while (index < lenV) { + var vx:number = normals[index]; + var vy:number = normals[index + 1]; + var vz:number = normals[index + 2]; + var d:number = 1.0/Math.sqrt(vx*vx + vy*vy + vz*vz); + + if (this._concatenateArrays) { + this._vertexNormals[i++] = normals[index] = vx*d; + this._vertexNormals[i++] = normals[index + 1] = vy*d; + this._vertexNormals[i++] = normals[index + 2] = vz*d; + } else { + normals[index] = vx*d; + normals[index + 1] = vy*d; + normals[index + 2] = vz*d; + } + + index += stride; + } + } + + this.notifyNormalsUpdate(); + + this._vertexNormalsDirty = false; + } + + /** + * Updates the vertex tangents based on the geometry. + */ + public updateVertexTangents(values:Array) + { + var i:number; + var index:number; + var offset:number; + var stride:number; + var tangents:Array; + + if (!this._autoDeriveTangents) { + if ((this._vertexTangents == null || values == null) && (this._vertexTangents != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + + this._vertexTangents = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); + tangents = this._pVertices; + + while (i < values.length) { + tangents[index] = values[i++]; + tangents[index + 1] = values[i++]; + tangents[index + 2] = values[i++]; + index += stride; + } + } + } else { + if (this._vertexTangents == null) { + this._vertexTangents = new Array(this._positions.length); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + if (this._faceTangentsDirty) + this.updateFaceTangents(); + + offset = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); + + //autoderived tangents + tangents = this._concatenateArrays? this._pVertices : this._vertexTangents; + + index = offset; + + //clear tangent values + var lenV:number = tangents.length; + while (index < lenV) { + tangents[index] = 0; + tangents[index + 1] = 0; + tangents[index + 2] = 0; + + index += stride; + } + + var k:number = 0; + var weight:number; + var f1:number = 0; + var f2:number = 1; + var f3:number = 2; + + i = 0; + + //collect face tangents + var lenI:number = this._pIndices.length; + while (i < lenI) { + weight = this._useFaceWeights? this._faceWeights[k++] : 1; + index = offset + this._pIndices[i++]*stride; + tangents[index++] += this._faceTangents[f1]*weight; + tangents[index++] += this._faceTangents[f2]*weight; + tangents[index] += this._faceTangents[f3]*weight; + index = offset + this._pIndices[i++]*stride; + tangents[index++] += this._faceTangents[f1]*weight; + tangents[index++] += this._faceTangents[f2]*weight; + tangents[index] += this._faceTangents[f3]*weight; + index = offset + this._pIndices[i++]*stride; + tangents[index++] += this._faceTangents[f1]*weight; + tangents[index++] += this._faceTangents[f2]*weight; + tangents[index] += this._faceTangents[f3]*weight; + f1 += 3; + f2 += 3; + f3 += 3; + } + + i = 0; + index = offset; + + //average tangents collections + while (index < lenV) { + var vx:number = tangents[index]; + var vy:number = tangents[index + 1]; + var vz:number = tangents[index + 2]; + var d:number = 1.0/Math.sqrt(vx*vx + vy*vy + vz*vz); + + if (this._concatenateArrays) { + this._vertexTangents[i++] = tangents[index] = vx*d; + this._vertexTangents[i++] = tangents[index + 1] = vy*d; + this._vertexTangents[i++] = tangents[index + 2] = vz*d; + } else { + tangents[index] = vx*d; + tangents[index + 1] = vy*d; + tangents[index + 2] = vz*d; + } + + index += stride; + } + } + + this.notifyTangentsUpdate(); + + this._vertexTangentsDirty = false; + } + + /** + * Updates the uvs based on the geometry. + */ + public updateUVs(values:Array) + { + var i:number; + var index:number; + var offset:number; + var stride:number; + var uvs:Array; + + if (!this._autoDeriveUVs) { + if ((this._uvs == null || values == null) && (this._uvs != null || values != null)) { + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + this._uvs = values; + + if (values != null && this._concatenateArrays) { + i = 0; + index = this.getOffset(TriangleSubGeometry.UV_DATA); + stride = this.getStride(TriangleSubGeometry.UV_DATA); + uvs = this._pVertices; + + while (i < values.length) { + uvs[index] = values[i++]; + uvs[index + 1] = values[i++]; + index += stride; + } + } + + } else { + if (this._uvs == null) { + this._uvs = new Array(this._positions.length*2/3); + + if (this._concatenateArrays) + this._pNotifyVerticesUpdate(); + else + this._pStrideOffsetDirty = true; + } + + offset = this.getOffset(TriangleSubGeometry.UV_DATA); + stride = this.getStride(TriangleSubGeometry.UV_DATA); + + //autoderived uvs + uvs = this._concatenateArrays? this._pVertices : this._uvs; + + i = 0; + index = offset; + var uvIdx:number = 0; + + //clear uv values + var lenV:number = uvs.length; + while (index < lenV) { + if (this._concatenateArrays) { + this._uvs[i++] = uvs[index] = uvIdx*.5; + this._uvs[i++] = uvs[index + 1] = 1.0 - (uvIdx & 1); + } else { + uvs[index] = uvIdx*.5; + uvs[index + 1] = 1.0 - (uvIdx & 1); + } + + if (++uvIdx == 3) + uvIdx = 0; + + index += stride; + } + } + + if (this._autoDeriveTangents) + this.notifyTangentsUpdate(); + + this.notifyUVsUpdate(); + + this._uvsDirty = false; + } + + /** + * Updates the secondary uvs based on the geometry. + */ + public updateSecondaryUVs(values:Array) + { + var i:number; + var index:number; + var offset:number; + var stride:number; + var uvs:Array; + + if (this._concatenateArrays && (this._secondaryUVs == null || values == null) && (this._secondaryUVs != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._secondaryUVs = values; + + if (values != null && this._concatenateArrays) { + offset = this.getOffset(TriangleSubGeometry.SECONDARY_UV_DATA); + stride = this.getStride(TriangleSubGeometry.SECONDARY_UV_DATA); + + i = 0; + index = offset; + uvs = this._pVertices; + + while (i < values.length) { + uvs[index] = values[i++]; + uvs[index + 1] = values[i++]; + index += stride; + } + } + + this.notifySecondaryUVsUpdate(); + + this._secondaryUVsDirty = false; + } + + /** + * Updates the joint indices + */ + public updateJointIndices(values:Array) + { + var i:number; + var j:number; + var index:number; + var offset:number; + var stride:number; + var jointIndices:Array; + + if (this._concatenateArrays && (this._jointIndices == null || values == null) && (this._jointIndices != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._jointIndices = values; + + if (values != null) { + offset = this.getOffset(TriangleSubGeometry.JOINT_INDEX_DATA); + stride = this.getStride(TriangleSubGeometry.JOINT_INDEX_DATA); + if (this._useCondensedIndices) { + i = 0; + j = 0; + index = offset; + jointIndices = this._concatenateArrays? this._pVertices : this._condensedJointIndices; + var oldIndex:number; + var newIndex:number = 0; + var dic:Object = new Object(); + + if (!this._concatenateArrays) + this._condensedJointIndices = new Array(values.length); + + this._condensedIndexLookUp = new Array(); + + while (i < values.length) { + for (j = 0; j < this._jointsPerVertex; j++) { + oldIndex = values[i++]; + + // if we encounter a new index, assign it a new condensed index + if (dic[oldIndex] == undefined) { + dic[oldIndex] = newIndex*3; //3 required for the three vectors that store the matrix + this._condensedIndexLookUp[newIndex++] = oldIndex; + } + jointIndices[index + j] = dic[oldIndex]; + } + index += stride; + } + this._numCondensedJoints = newIndex; + } else if (this._concatenateArrays) { + + i = 0; + index = offset; + jointIndices = this._pVertices; + + while (i < values.length) { + j = 0; + while (j < this._jointsPerVertex) + jointIndices[index + j++] = values[i++]; + index += stride; + } + } + } + + this.notifyJointIndicesUpdate(); + + this._jointIndicesDirty = false; + } + + /** + * Updates the joint weights. + */ + public updateJointWeights(values:Array) + { + var i:number; + var j:number; + var index:number; + var offset:number; + var stride:number; + var jointWeights:Array; + + if (this._concatenateArrays && (this._jointWeights == null || values == null) && (this._jointWeights != null || values != null)) + this._pNotifyVerticesUpdate(); + + this._jointWeights = values; + + if (values != null && this._concatenateArrays) { + offset = this.getOffset(TriangleSubGeometry.JOINT_WEIGHT_DATA); + stride = this.getStride(TriangleSubGeometry.JOINT_WEIGHT_DATA); + + i = 0; + index = offset; + jointWeights = this._pVertices; + + while (i < values.length) { + j = 0; + while (j < this._jointsPerVertex) + jointWeights[index + j++] = values[i++]; + index += stride; + } + } + + this.notifyJointWeightsUpdate(); + + this._jointWeightsDirty = false; + } + + /** + * + */ + public dispose() + { + super.dispose(); + + this._positions = null; + this._vertexNormals = null; + this._vertexTangents = null; + this._uvs = null; + this._secondaryUVs = null; + this._jointIndices = null; + this._jointWeights = null; + + this._faceNormals = null; + this._faceWeights = null; + this._faceTangents = null; + } + + /** + * Updates the face indices of the TriangleSubGeometry. + * + * @param indices The face indices to upload. + */ + public updateIndices(indices:Array) + { + super.updateIndices(indices); + + this._faceNormalsDirty = true; + + if (this._autoDeriveNormals) + this._vertexNormalsDirty = true; + + if (this._autoDeriveTangents) + this._vertexTangentsDirty = true; + + if (this._autoDeriveUVs) + this._uvsDirty = true; + } + + /** + * Clones the current object + * @return An exact duplicate of the current object. + */ + public clone():TriangleSubGeometry + { + var clone:TriangleSubGeometry = new TriangleSubGeometry(this._concatenateArrays); + clone.updateIndices(this._pIndices.concat()); + clone.updatePositions(this._positions.concat()); + + if (this._vertexNormals && !this._autoDeriveNormals) + clone.updateVertexNormals(this._vertexNormals.concat()); + else + clone.updateVertexNormals(null); + + if (this._uvs && !this._autoDeriveUVs) + clone.updateUVs(this._uvs.concat()); + else + clone.updateUVs(null); + + if (this._vertexTangents && !this._autoDeriveTangents) + clone.updateVertexTangents(this._vertexTangents.concat()); + else + clone.updateVertexTangents(null); + + if (this._secondaryUVs) + clone.updateSecondaryUVs(this._secondaryUVs.concat()); + + if (this._jointIndices) { + clone.jointsPerVertex = this._jointsPerVertex; + clone.updateJointIndices(this._jointIndices.concat()); + } + + if (this._jointWeights) + clone.updateJointWeights(this._jointWeights.concat()); + + return clone; + } + + public scaleUV(scaleU:number = 1, scaleV:number = 1) + { + var index:number; + var offset:number; + var stride:number; + var uvs:Array; + + uvs = this._uvs; + + var ratioU:number = scaleU/this._scaleU; + var ratioV:number = scaleV/this._scaleV; + + this._scaleU = scaleU; + this._scaleV = scaleV; + + var len:number = uvs.length; + + offset = 0; + stride = 2; + + index = offset; + + while (index < len) { + uvs[index] *= ratioU; + uvs[index + 1] *= ratioV; + index += stride; + } + + this.notifyUVsUpdate(); + } + + /** + * Scales the geometry. + * @param scale The amount by which to scale. + */ + public scale(scale:number) + { + var i:number; + var index:number; + var offset:number; + var stride:number; + var positions:Array; + + positions = this._positions; + + var len:number = positions.length; + + offset = 0; + stride = 3; + + i = 0; + index = offset; + while (i < len) { + positions[index] *= scale; + positions[index + 1] *= scale; + positions[index + 2] *= scale; + + i += 3; + index += stride; + } + + this.notifyPositionsUpdate(); + } + + public applyTransformation(transform:Matrix3D) + { + var positions:Array; + var normals:Array; + var tangents:Array; + + if (this._concatenateArrays) { + positions = this._pVertices; + normals = this._pVertices; + tangents = this._pVertices; + } else { + positions = this._positions; + normals = this._vertexNormals; + tangents = this._vertexTangents; + } + + var len:number = this._positions.length/3; + var i:number; + var i1:number; + var i2:number; + var vector:Vector3D = new Vector3D(); + + var bakeNormals:boolean = this._vertexNormals != null; + var bakeTangents:boolean = this._vertexTangents != null; + var invTranspose:Matrix3D; + + if (bakeNormals || bakeTangents) { + invTranspose = transform.clone(); + invTranspose.invert(); + invTranspose.transpose(); + } + + var vi0:number = this.getOffset(TriangleSubGeometry.POSITION_DATA); + var ni0:number = this.getOffset(TriangleSubGeometry.NORMAL_DATA); + var ti0:number = this.getOffset(TriangleSubGeometry.TANGENT_DATA); + + var vStride:number = this.getStride(TriangleSubGeometry.POSITION_DATA); + var nStride:number = this.getStride(TriangleSubGeometry.NORMAL_DATA); + var tStride:number = this.getStride(TriangleSubGeometry.TANGENT_DATA); + + for (i = 0; i < len; ++i) { + i1 = vi0 + 1; + i2 = vi0 + 2; + + // bake position + vector.x = positions[vi0]; + vector.y = positions[i1]; + vector.z = positions[i2]; + vector = transform.transformVector(vector); + positions[vi0] = vector.x; + positions[i1] = vector.y; + positions[i2] = vector.z; + vi0 += vStride; + + // bake normal + if (bakeNormals) { + i1 = ni0 + 1; + i2 = ni0 + 2; + vector.x = normals[ni0]; + vector.y = normals[i1]; + vector.z = normals[i2]; + vector = invTranspose.deltaTransformVector(vector); + vector.normalize(); + normals[ni0] = vector.x; + normals[i1] = vector.y; + normals[i2] = vector.z; + ni0 += nStride; + } + + // bake tangent + if (bakeTangents) { + i1 = ti0 + 1; + i2 = ti0 + 2; + vector.x = tangents[ti0]; + vector.y = tangents[i1]; + vector.z = tangents[i2]; + vector = invTranspose.deltaTransformVector(vector); + vector.normalize(); + tangents[ti0] = vector.x; + tangents[i1] = vector.y; + tangents[i2] = vector.z; + ti0 += tStride; + } + } + + this.notifyPositionsUpdate(); + this.notifyNormalsUpdate(); + this.notifyTangentsUpdate(); + } + + /** + * Updates the tangents for each face. + */ + private updateFaceTangents() + { + var i:number = 0; + var index1:number; + var index2:number; + var index3:number; + var vi:number; + var v0:number; + var dv1:number; + var dv2:number; + var denom:number; + var x0:number, y0:number, z0:number; + var dx1:number, dy1:number, dz1:number; + var dx2:number, dy2:number, dz2:number; + var cx:number, cy:number, cz:number; + + var positions:Array = this._positions + var uvs:Array = this._uvs; + + var len:number = this._pIndices.length; + + if (this._faceTangents == null) + this._faceTangents = new Array(len); + + while (i < len) { + index1 = this._pIndices[i]; + index2 = this._pIndices[i + 1]; + index3 = this._pIndices[i + 2]; + + v0 = uvs[index1*2 + 1]; + dv1 = uvs[index2*2 + 1] - v0; + dv2 = uvs[index3*2 + 1] - v0; + + vi = index1*3; + x0 = positions[vi]; + y0 = positions[vi + 1]; + z0 = positions[vi + 2]; + vi = index2*3; + dx1 = positions[vi] - x0; + dy1 = positions[vi + 1] - y0; + dz1 = positions[vi + 2] - z0; + vi = index3*3; + dx2 = positions[vi] - x0; + dy2 = positions[vi + 1] - y0; + dz2 = positions[vi + 2] - z0; + + cx = dv2*dx1 - dv1*dx2; + cy = dv2*dy1 - dv1*dy2; + cz = dv2*dz1 - dv1*dz2; + denom = 1/Math.sqrt(cx*cx + cy*cy + cz*cz); + + this._faceTangents[i++] = denom*cx; + this._faceTangents[i++] = denom*cy; + this._faceTangents[i++] = denom*cz; + } + + this._faceTangentsDirty = false; + } + + /** + * Updates the normals for each face. + */ + private updateFaceNormals() + { + var i:number = 0; + var j:number = 0; + var k:number = 0; + var index:number; + var offset:number; + var stride:number; + + var x1:number, x2:number, x3:number; + var y1:number, y2:number, y3:number; + var z1:number, z2:number, z3:number; + var dx1:number, dy1:number, dz1:number; + var dx2:number, dy2:number, dz2:number; + var cx:number, cy:number, cz:number; + var d:number; + + var positions:Array = this._positions; + + var len:number = this._pIndices.length; + + if (this._faceNormals == null) + this._faceNormals = new Array(len); + + if (this._useFaceWeights && this._faceWeights == null) + this._faceWeights = new Array(len/3); + + while (i < len) { + index = this._pIndices[i++]*3; + x1 = positions[index]; + y1 = positions[index + 1]; + z1 = positions[index + 2]; + index = this._pIndices[i++]*3; + x2 = positions[index]; + y2 = positions[index + 1]; + z2 = positions[index + 2]; + index = this._pIndices[i++]*3; + x3 = positions[index]; + y3 = positions[index + 1]; + z3 = positions[index + 2]; + dx1 = x3 - x1; + dy1 = y3 - y1; + dz1 = z3 - z1; + dx2 = x2 - x1; + dy2 = y2 - y1; + dz2 = z2 - z1; + cx = dz1*dy2 - dy1*dz2; + cy = dx1*dz2 - dz1*dx2; + cz = dy1*dx2 - dx1*dy2; + d = Math.sqrt(cx*cx + cy*cy + cz*cz); + // length of cross product = 2*triangle area + + if (this._useFaceWeights) { + var w:number = d*10000; + + if (w < 1) + w = 1; + + this._faceWeights[k++] = w; + } + + d = 1/d; + + this._faceNormals[j++] = cx*d; + this._faceNormals[j++] = cy*d; + this._faceNormals[j++] = cz*d; + } + + this._faceNormalsDirty = false; + } + + public _pNotifyVerticesUpdate() + { + this._pStrideOffsetDirty = true; + + this.notifyPositionsUpdate(); + this.notifyNormalsUpdate(); + this.notifyTangentsUpdate(); + this.notifyUVsUpdate(); + this.notifySecondaryUVsUpdate(); + this.notifyJointIndicesUpdate(); + this.notifyJointWeightsUpdate(); + } + + private notifyPositionsUpdate() + { + if (this._positionsDirty) + return; + + this._positionsDirty = true; + + if (!this._positionsUpdated) + this._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); + + this.dispatchEvent(this._positionsUpdated); + } + + private notifyNormalsUpdate() + { + if (this._vertexNormalsDirty) + return; + + this._vertexNormalsDirty = true; + + if (!this._normalsUpdated) + this._normalsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.NORMAL_DATA); + + this.dispatchEvent(this._normalsUpdated); + } + + private notifyTangentsUpdate() + { + if (this._vertexTangentsDirty) + return; + + this._vertexTangentsDirty = true; + + if (!this._tangentsUpdated) + this._tangentsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.TANGENT_DATA); + + this.dispatchEvent(this._tangentsUpdated); + } + + private notifyUVsUpdate() + { + if (this._uvsDirty) + return; + + this._uvsDirty = true; + + if (!this._uvsUpdated) + this._uvsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.UV_DATA); + + this.dispatchEvent(this._uvsUpdated); + } + + private notifySecondaryUVsUpdate() + { + if (this._secondaryUVsDirty) + return; + + this._secondaryUVsDirty = true; + + if (!this._secondaryUVsUpdated) + this._secondaryUVsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.SECONDARY_UV_DATA); + + this.dispatchEvent(this._secondaryUVsUpdated); + } + + private notifyJointIndicesUpdate() + { + if (this._jointIndicesDirty) + return; + + this._jointIndicesDirty = true; + + if (!this._jointIndicesUpdated) + this._jointIndicesUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_INDEX_DATA); + + this.dispatchEvent(this._jointIndicesUpdated); + } + + private notifyJointWeightsUpdate() + { + if (this._jointWeightsDirty) + return; + + this._jointWeightsDirty = true; + + if (!this._jointWeightsUpdated) + this._jointWeightsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_WEIGHT_DATA); + + this.dispatchEvent(this._jointWeightsUpdated); + } +} + +export = TriangleSubGeometry; \ No newline at end of file diff --git a/lib/core/base/TriangleSubMesh.js b/lib/core/base/TriangleSubMesh.js new file mode 100755 index 00000000..3fb26d46 --- /dev/null +++ b/lib/core/base/TriangleSubMesh.js @@ -0,0 +1,73 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var SubMeshBase = require("awayjs-core/lib/core/base/SubMeshBase"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +/** +* TriangleSubMesh wraps a TriangleSubGeometry as a scene graph instantiation. A TriangleSubMesh is owned by a Mesh object. +* +* +* @see away.base.TriangleSubGeometry +* @see away.entities.Mesh +* +* @class away.base.TriangleSubMesh +*/ +var TriangleSubMesh = (function (_super) { + __extends(TriangleSubMesh, _super); + /** + * Creates a new TriangleSubMesh object + * @param subGeometry The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. + * @param parentMesh The Mesh object to which this TriangleSubMesh belongs. + * @param material An optional material used to render this TriangleSubMesh. + */ + function TriangleSubMesh(subGeometry, parentMesh, material) { + if (typeof material === "undefined") { material = null; } + _super.call(this); + + this._pParentMesh = parentMesh; + this._subGeometry = subGeometry; + this.material = material; + } + Object.defineProperty(TriangleSubMesh.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.TRIANGLE_SUB_MESH; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TriangleSubMesh.prototype, "subGeometry", { + /** + * The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. + */ + get: function () { + return this._subGeometry; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + TriangleSubMesh.prototype.dispose = function () { + _super.prototype.dispose.call(this); + }; + + TriangleSubMesh.prototype._iCollectRenderable = function (renderer) { + renderer.applyTriangleSubMesh(this); + }; + return TriangleSubMesh; +})(SubMeshBase); + +module.exports = TriangleSubMesh; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvYmFzZS9UcmlhbmdsZVN1Yk1lc2gudHMiXSwibmFtZXMiOlsiVHJpYW5nbGVTdWJNZXNoIiwiVHJpYW5nbGVTdWJNZXNoLmNvbnN0cnVjdG9yIiwiVHJpYW5nbGVTdWJNZXNoLmRpc3Bvc2UiLCJUcmlhbmdsZVN1Yk1lc2guX2lDb2xsZWN0UmVuZGVyYWJsZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0VBQ3lFOztBQUV6RSxpRUFBd0U7O0FBS3hFOzs7Ozs7OztFQVFHO0FBQ0g7SUFBOEJBLGtDQUFXQTtJQTBCeENBOzs7OztNQURHQTtJQUNIQSx5QkFBWUEsV0FBK0JBLEVBQUVBLFVBQWVBLEVBQUVBLFFBQTRCQTtRQUE1QkMsdUNBQUFBLFFBQVFBLEdBQWdCQSxJQUFJQTtBQUFBQSxRQUV6RkEsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLFVBQVVBO1FBQzlCQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxXQUFXQTtRQUMvQkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsUUFBUUE7SUFDekJBLENBQUNBO0lBMUJERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsU0FBU0EsQ0FBQ0EsaUJBQWlCQTtRQUNuQ0EsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBO1FBQ3pCQSxDQUFDQTs7OztBQUFBQTtJQW9CREE7O01BREdBO3dDQUNIQTtRQUVDRSxnQkFBS0EsQ0FBQ0EsT0FBT0EsS0FBQ0EsS0FBQUEsQ0FBQ0E7SUFDaEJBLENBQUNBOztJQUVERixnREFBQUEsVUFBMkJBLFFBQWtCQTtRQUU1Q0csUUFBUUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxJQUFJQSxDQUFDQTtJQUNwQ0EsQ0FBQ0E7SUFDRkgsdUJBQUNBO0FBQURBLENBQUNBLEVBL0M2QixXQUFXLEVBK0N4Qzs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJjb3JlL2Jhc2UvVHJpYW5nbGVTdWJNZXNoLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElTdWJNZXNoXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvSVN1Yk1lc2hcIik7XG5pbXBvcnQgU3ViTWVzaEJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvU3ViTWVzaEJhc2VcIik7XG5pbXBvcnQgVHJpYW5nbGVTdWJHZW9tZXRyeVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1RyaWFuZ2xlU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgQXNzZXRUeXBlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0VHlwZVwiKTtcbmltcG9ydCBJUmVuZGVyZXJcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9JUmVuZGVyZXJcIik7XG5pbXBvcnQgTWVzaFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9NZXNoXCIpO1xuaW1wb3J0IE1hdGVyaWFsQmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9NYXRlcmlhbEJhc2VcIik7XG5cbi8qKlxuICogVHJpYW5nbGVTdWJNZXNoIHdyYXBzIGEgVHJpYW5nbGVTdWJHZW9tZXRyeSBhcyBhIHNjZW5lIGdyYXBoIGluc3RhbnRpYXRpb24uIEEgVHJpYW5nbGVTdWJNZXNoIGlzIG93bmVkIGJ5IGEgTWVzaCBvYmplY3QuXG4gKlxuICpcbiAqIEBzZWUgYXdheS5iYXNlLlRyaWFuZ2xlU3ViR2VvbWV0cnlcbiAqIEBzZWUgYXdheS5lbnRpdGllcy5NZXNoXG4gKlxuICogQGNsYXNzIGF3YXkuYmFzZS5UcmlhbmdsZVN1Yk1lc2hcbiAqL1xuY2xhc3MgVHJpYW5nbGVTdWJNZXNoIGV4dGVuZHMgU3ViTWVzaEJhc2UgaW1wbGVtZW50cyBJU3ViTWVzaFxue1xuXHRwcml2YXRlIF9zdWJHZW9tZXRyeTpUcmlhbmdsZVN1Ykdlb21ldHJ5O1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBhc3NldFR5cGUoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBBc3NldFR5cGUuVFJJQU5HTEVfU1VCX01FU0g7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIFRyaWFuZ2xlU3ViR2VvbWV0cnkgb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBnZW9tZXRyeSBkYXRhIGZvciB0aGlzIFRyaWFuZ2xlU3ViTWVzaC5cblx0ICovXG5cdHB1YmxpYyBnZXQgc3ViR2VvbWV0cnkoKTpUcmlhbmdsZVN1Ykdlb21ldHJ5XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc3ViR2VvbWV0cnk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBUcmlhbmdsZVN1Yk1lc2ggb2JqZWN0XG5cdCAqIEBwYXJhbSBzdWJHZW9tZXRyeSBUaGUgVHJpYW5nbGVTdWJHZW9tZXRyeSBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIGdlb21ldHJ5IGRhdGEgZm9yIHRoaXMgVHJpYW5nbGVTdWJNZXNoLlxuXHQgKiBAcGFyYW0gcGFyZW50TWVzaCBUaGUgTWVzaCBvYmplY3QgdG8gd2hpY2ggdGhpcyBUcmlhbmdsZVN1Yk1lc2ggYmVsb25ncy5cblx0ICogQHBhcmFtIG1hdGVyaWFsIEFuIG9wdGlvbmFsIG1hdGVyaWFsIHVzZWQgdG8gcmVuZGVyIHRoaXMgVHJpYW5nbGVTdWJNZXNoLlxuXHQgKi9cblx0Y29uc3RydWN0b3Ioc3ViR2VvbWV0cnk6VHJpYW5nbGVTdWJHZW9tZXRyeSwgcGFyZW50TWVzaDpNZXNoLCBtYXRlcmlhbDpNYXRlcmlhbEJhc2UgPSBudWxsKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX3BQYXJlbnRNZXNoID0gcGFyZW50TWVzaDtcblx0XHR0aGlzLl9zdWJHZW9tZXRyeSA9IHN1Ykdlb21ldHJ5O1xuXHRcdHRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGRpc3Bvc2UoKVxuXHR7XG5cdFx0c3VwZXIuZGlzcG9zZSgpO1xuXHR9XG5cblx0cHVibGljIF9pQ29sbGVjdFJlbmRlcmFibGUocmVuZGVyZXI6SVJlbmRlcmVyKVxuXHR7XG5cdFx0cmVuZGVyZXIuYXBwbHlUcmlhbmdsZVN1Yk1lc2godGhpcyk7XG5cdH1cbn1cblxuZXhwb3J0ID0gVHJpYW5nbGVTdWJNZXNoOyJdfQ== \ No newline at end of file diff --git a/lib/core/base/TriangleSubMesh.ts b/lib/core/base/TriangleSubMesh.ts new file mode 100644 index 00000000..5078810f --- /dev/null +++ b/lib/core/base/TriangleSubMesh.ts @@ -0,0 +1,67 @@ +import ISubMesh = require("awayjs-core/lib/core/base/ISubMesh"); +import SubMeshBase = require("awayjs-core/lib/core/base/SubMeshBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Mesh = require("awayjs-core/lib/entities/Mesh"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * TriangleSubMesh wraps a TriangleSubGeometry as a scene graph instantiation. A TriangleSubMesh is owned by a Mesh object. + * + * + * @see away.base.TriangleSubGeometry + * @see away.entities.Mesh + * + * @class away.base.TriangleSubMesh + */ +class TriangleSubMesh extends SubMeshBase implements ISubMesh +{ + private _subGeometry:TriangleSubGeometry; + + /** + * + */ + public get assetType():string + { + return AssetType.TRIANGLE_SUB_MESH; + } + + /** + * The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. + */ + public get subGeometry():TriangleSubGeometry + { + return this._subGeometry; + } + + /** + * Creates a new TriangleSubMesh object + * @param subGeometry The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. + * @param parentMesh The Mesh object to which this TriangleSubMesh belongs. + * @param material An optional material used to render this TriangleSubMesh. + */ + constructor(subGeometry:TriangleSubGeometry, parentMesh:Mesh, material:MaterialBase = null) + { + super(); + + this._pParentMesh = parentMesh; + this._subGeometry = subGeometry; + this.material = material; + } + + /** + * + */ + public dispose() + { + super.dispose(); + } + + public _iCollectRenderable(renderer:IRenderer) + { + renderer.applyTriangleSubMesh(this); + } +} + +export = TriangleSubMesh; \ No newline at end of file diff --git a/lib/core/display/ContextMode.js b/lib/core/display/ContextMode.js new file mode 100755 index 00000000..c494c6c3 --- /dev/null +++ b/lib/core/display/ContextMode.js @@ -0,0 +1,13 @@ +var ContextMode = (function () { + function ContextMode() { + } + ContextMode.AUTO = "auto"; + ContextMode.WEBGL = "webgl"; + ContextMode.FLASH = "flash"; + ContextMode.NATIVE = "native"; + return ContextMode; +})(); + +module.exports = ContextMode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZGlzcGxheS9Db250ZXh0TW9kZS50cyJdLCJuYW1lcyI6WyJDb250ZXh0TW9kZSIsIkNvbnRleHRNb2RlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtJQUFBQTtJQU1BQyxDQUFDQTtBQUFBRCxJQUpBQSxtQkFBcUJBLE1BQU1BO0lBQzNCQSxvQkFBc0JBLE9BQU9BO0lBQzdCQSxvQkFBc0JBLE9BQU9BO0lBQzdCQSxxQkFBdUJBLFFBQVFBO0lBQ2hDQSxtQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCw0QkFBcUIsQ0FBQSIsImZpbGUiOiJjb3JlL2Rpc3BsYXkvQ29udGV4dE1vZGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBDb250ZXh0TW9kZVxue1xuXHRzdGF0aWMgQVVUTzpzdHJpbmcgPSBcImF1dG9cIjtcblx0c3RhdGljIFdFQkdMOnN0cmluZyA9IFwid2ViZ2xcIjtcblx0c3RhdGljIEZMQVNIOnN0cmluZyA9IFwiZmxhc2hcIjtcblx0c3RhdGljIE5BVElWRTpzdHJpbmcgPSBcIm5hdGl2ZVwiO1xufVxuXG5leHBvcnQgPSBDb250ZXh0TW9kZTsiXX0= \ No newline at end of file diff --git a/lib/core/display/ContextMode.ts b/lib/core/display/ContextMode.ts new file mode 100644 index 00000000..7ceb34aa --- /dev/null +++ b/lib/core/display/ContextMode.ts @@ -0,0 +1,9 @@ +class ContextMode +{ + static AUTO:string = "auto"; + static WEBGL:string = "webgl"; + static FLASH:string = "flash"; + static NATIVE:string = "native"; +} + +export = ContextMode; \ No newline at end of file diff --git a/lib/core/display/IContext.js b/lib/core/display/IContext.js new file mode 100755 index 00000000..79814dbe --- /dev/null +++ b/lib/core/display/IContext.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZGlzcGxheS9JQ29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQXFCa0IiLCJmaWxlIjoiY29yZS9kaXNwbGF5L0lDb250ZXh0LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlY3RhbmdsZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9SZWN0YW5nbGVcIik7XG5cbi8qKlxuICpcbiAqIEBjbGFzcyBhd2F5LmJhc2UuSUNvbnRleHRcbiAqL1xuaW50ZXJmYWNlIElDb250ZXh0XG57XG5cdGNvbnRhaW5lcjpIVE1MRWxlbWVudDtcblxuXHRjbGVhcihyZWQ/OiBudW1iZXIsIGdyZWVuPzogbnVtYmVyLCBibHVlPzogbnVtYmVyLCBhbHBoYT86IG51bWJlciwgZGVwdGg/OiBudW1iZXIsIHN0ZW5jaWw/OiBudW1iZXIsIG1hc2s/OiBudW1iZXIpO1xuXG5cdGNvbmZpZ3VyZUJhY2tCdWZmZXIod2lkdGg6bnVtYmVyLCBoZWlnaHQ6bnVtYmVyLCBhbnRpQWxpYXM6bnVtYmVyLCBlbmFibGVEZXB0aEFuZFN0ZW5jaWw/OmJvb2xlYW4pO1xuXG5cdGRpc3Bvc2UoKTtcblxuXHRwcmVzZW50KCk7XG5cblx0c2V0U2Npc3NvclJlY3RhbmdsZShyZWN0OlJlY3RhbmdsZSk7XG59XG5cbmV4cG9ydCA9IElDb250ZXh0OyJdfQ== \ No newline at end of file diff --git a/lib/core/display/IContext.ts b/lib/core/display/IContext.ts new file mode 100644 index 00000000..1732d78a --- /dev/null +++ b/lib/core/display/IContext.ts @@ -0,0 +1,22 @@ +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +/** + * + * @class away.base.IContext + */ +interface IContext +{ + container:HTMLElement; + + clear(red?: number, green?: number, blue?: number, alpha?: number, depth?: number, stencil?: number, mask?: number); + + configureBackBuffer(width:number, height:number, antiAlias:number, enableDepthAndStencil?:boolean); + + dispose(); + + present(); + + setScissorRectangle(rect:Rectangle); +} + +export = IContext; \ No newline at end of file diff --git a/lib/core/geom/Box.js b/lib/core/geom/Box.js new file mode 100755 index 00000000..8b79b28d --- /dev/null +++ b/lib/core/geom/Box.js @@ -0,0 +1,603 @@ +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* A Box object is an area defined by its position, as indicated by its +* top-left-front corner point(x, y, z) and by its width, +* height and depth. +* +* +*

The x, y, z, width, +* height depth properties of the Box class are +* independent of each other; changing the value of one property has no effect +* on the others. However, the right, bottom and +* back properties are integrally related to those six +* properties. For example, if you change the value of the right +* property, the value of the width property changes; if you +* change the bottom property, the value of the +* height property changes.

+* +*

The following methods and properties use Box objects:

+* +*
    +*
  • The bounds property of the DisplayObject class
  • +*
+* +*

You can use the new Box() constructor to create a +* Box object.

+* +*

Note: The Box class does not define a cubic Shape +* display object. +*/ +var Box = (function () { + /** + * Creates a new Box object with the top-left-front corner specified by the + * x, y and z parameters and with the + * specified width, height and depth + * parameters. If you call this public without parameters, a box with + * x, y, z, width, + * height and depth properties set to 0 is created. + * + * @param x The x coordinate of the top-left-front corner of the + * box. + * @param y The y coordinate of the top-left-front corner of the + * box. + * @param z The z coordinate of the top-left-front corner of the + * box. + * @param width The width of the box, in pixels. + * @param height The height of the box, in pixels. + * @param depth The depth of the box, in pixels. + */ + function Box(x, y, z, width, height, depth) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof z === "undefined") { z = 0; } + if (typeof width === "undefined") { width = 0; } + if (typeof height === "undefined") { height = 0; } + if (typeof depth === "undefined") { depth = 0; } + this.x = x; + this.y = y; + this.z = z; + this.width = width; + this.height = height; + this.depth = depth; + } + Object.defineProperty(Box.prototype, "back", { + /** + * The sum of the z and height properties. + */ + get: function () { + return this.z + this.depth; + }, + set: function (val) { + this.depth = val - this.z; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "bottom", { + /** + * The sum of the y and height properties. + */ + get: function () { + return this.y + this.height; + }, + set: function (val) { + this.height = val - this.y; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "bottomRightBack", { + /** + * The location of the Box object's bottom-right corner, determined by the + * values of the right and bottom properties. + */ + get: function () { + if (this._bottomRightBack == null) + this._bottomRightBack = new Vector3D(); + + this._bottomRightBack.x = this.x + this.width; + this._bottomRightBack.y = this.y + this.height; + this._bottomRightBack.z = this.z + this.depth; + + return this._bottomRightBack; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Box.prototype, "front", { + /** + * The z coordinate of the top-left-front corner of the box. Changing + * the front property of a Box object has no effect on the + * x, y, width and height + * properties. However it does affect the depth property, + * whereas changing the z value does not affect the + * depth property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + get: function () { + return this.z; + }, + set: function (val) { + this.depth += this.z - val; + this.z = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "left", { + /** + * The x coordinate of the top-left corner of the box. Changing the + * left property of a Box object has no effect on the + * y and height properties. However it does affect + * the width property, whereas changing the x value + * does not affect the width property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + get: function () { + return this.x; + }, + set: function (val) { + this.width += this.x - val; + this.x = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "right", { + /** + * The sum of the x and width properties. + */ + get: function () { + return this.x + this.width; + }, + set: function (val) { + this.width = val - this.x; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "size", { + /** + * The size of the Box object, expressed as a Vector3D object with the + * values of the width, height and + * depth properties. + */ + get: function () { + if (this._size == null) + this._size = new Vector3D(); + + this._size.x = this.width; + this._size.y = this.height; + this._size.z = this.depth; + + return this._size; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Box.prototype, "top", { + /** + * The y coordinate of the top-left-front corner of the box. Changing + * the top property of a Box object has no effect on the + * x and width properties. However it does affect + * the height property, whereas changing the y + * value does not affect the height property. + * + *

The value of the top property is equal to the value of the + * y property.

+ */ + get: function () { + return this.y; + }, + set: function (val) { + this.height += (this.y - val); + this.y = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Box.prototype, "topLeftFront", { + /** + * The location of the Box object's top-left-front corner, determined by the + * x, y and z coordinates of the point. + */ + get: function () { + if (this._topLeftFront == null) + this._topLeftFront = new Vector3D(); + + this._topLeftFront.x = this.x; + this._topLeftFront.y = this.y; + this._topLeftFront.z = this.z; + + return this._topLeftFront; + }, + enumerable: true, + configurable: true + }); + + /** + * Returns a new Box object with the same values for the x, + * y, z, width, height + * and depth properties as the original Box object. + * + * @return A new Box object with the same values for the x, + * y, z, width, + * height and depth properties as the + * original Box object. + */ + Box.prototype.clone = function () { + return new Box(this.x, this.y, this.z, this.width, this.height, this.depth); + }; + + /** + * Determines whether the specified position is contained within the cubic + * region defined by this Box object. + * + * @param x The x coordinate(horizontal component) of the position. + * @param y The y coordinate(vertical component) of the position. + * @param z The z coordinate(longitudinal component) of the position. + * @return A value of true if the Box object contains the + * specified position; otherwise false. + */ + Box.prototype.contains = function (x, y, z) { + return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y && this.z <= z && this.z + this.depth >= z); + }; + + /** + * Determines whether the specified position is contained within the cubic + * region defined by this Box object. This method is similar to the + * Box.contains() method, except that it takes a Vector3D + * object as a parameter. + * + * @param position The position, as represented by its x, y and + * z coordinates. + * @return A value of true if the Box object contains the + * specified position; otherwise false. + */ + Box.prototype.containsPoint = function (position) { + return (this.x <= position.x && this.x + this.width >= position.x && this.y <= position.y && this.y + this.height >= position.y && this.z <= position.z && this.z + this.depth >= position.z); + }; + + /** + * Determines whether the Box object specified by the box + * parameter is contained within this Box object. A Box object is said to + * contain another if the second Box object falls entirely within the + * boundaries of the first. + * + * @param box The Box object being checked. + * @return A value of true if the Box object that you specify + * is contained by this Box object; otherwise false. + */ + Box.prototype.containsRect = function (box) { + return (this.x <= box.x && this.x + this.width >= box.x + box.width && this.y <= box.y && this.y + this.height >= box.y + box.height && this.z <= box.z && this.z + this.depth >= box.z + box.depth); + }; + + /** + * Copies all of box data from the source Box object into the calling + * Box object. + * + * @param sourceBox The Box object from which to copy the data. + */ + Box.prototype.copyFrom = function (sourceBox) { + //TODO + }; + + /** + * Determines whether the object specified in the toCompare + * parameter is equal to this Box object. This method compares the + * x, y, z, width, + * height and depth properties of an object against + * the same properties of this Box object. + * + * @param toCompare The box to compare to this Box object. + * @return A value of true if the object has exactly the same + * values for the x, y, z, + * width, height and depth + * properties as this Box object; otherwise false. + */ + Box.prototype.equals = function (toCompare) { + return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && this.width == toCompare.width && this.height == toCompare.height && this.depth == toCompare.depth); + }; + + /** + * Increases the size of the Box object by the specified amounts, in + * pixels. The center point of the Box object stays the same, and its + * size increases to the left and right by the dx value, to + * the top and the bottom by the dy value, and to + * the front and the back by the dz value. + * + * @param dx The value to be added to the left and the right of the Box + * object. The following equation is used to calculate the new + * width and position of the box: + * @param dy The value to be added to the top and the bottom of the Box + * object. The following equation is used to calculate the new + * height and position of the box: + * @param dz The value to be added to the front and the back of the Box + * object. The following equation is used to calculate the new + * depth and position of the box: + */ + Box.prototype.inflate = function (dx, dy, dz) { + this.x -= dx / 2; + this.y -= dy / 2; + this.z -= dz / 2; + this.width += dx / 2; + this.height += dy / 2; + this.depth += dz / 2; + }; + + /** + * Increases the size of the Box object. This method is similar to the + * Box.inflate() method except it takes a Vector3D object as + * a parameter. + * + *

The following two code examples give the same result:

+ * + * @param delta The x property of this Vector3D object is used to + * increase the horizontal dimension of the Box object. + * The y property is used to increase the vertical + * dimension of the Box object. + * The z property is used to increase the + * longitudinal dimension of the Box object. + */ + Box.prototype.inflatePoint = function (delta) { + this.x -= delta.x / 2; + this.y -= delta.y / 2; + this.z -= delta.z / 2; + this.width += delta.x / 2; + this.height += delta.y / 2; + this.depth += delta.z / 2; + }; + + /** + * If the Box object specified in the toIntersect parameter + * intersects with this Box object, returns the area of intersection + * as a Box object. If the boxes do not intersect, this method returns an + * empty Box object with its properties set to 0. + * + * @param toIntersect The Box object to compare against to see if it + * intersects with this Box object. + * @return A Box object that equals the area of intersection. If the + * boxes do not intersect, this method returns an empty Box + * object; that is, a box with its x, y, + * z, width, height, and + * depth properties set to 0. + */ + Box.prototype.intersection = function (toIntersect) { + if (this.intersects(toIntersect)) { + var i = new Box(); + + if (this.x > toIntersect.x) { + i.x = this.x; + i.width = toIntersect.x - this.x + toIntersect.width; + + if (i.width > this.width) + i.width = this.width; + } else { + i.x = toIntersect.x; + i.width = this.x - toIntersect.x + this.width; + + if (i.width > toIntersect.width) + i.width = toIntersect.width; + } + + if (this.y > toIntersect.y) { + i.y = this.y; + i.height = toIntersect.y - this.y + toIntersect.height; + + if (i.height > this.height) + i.height = this.height; + } else { + i.y = toIntersect.y; + i.height = this.y - toIntersect.y + this.height; + + if (i.height > toIntersect.height) + i.height = toIntersect.height; + } + + if (this.z > toIntersect.z) { + i.z = this.z; + i.depth = toIntersect.z - this.z + toIntersect.depth; + + if (i.depth > this.depth) + i.depth = this.depth; + } else { + i.z = toIntersect.z; + i.depth = this.z - toIntersect.z + this.depth; + + if (i.depth > toIntersect.depth) + i.depth = toIntersect.depth; + } + + return i; + } + + return new Box(); + }; + + /** + * Determines whether the object specified in the toIntersect + * parameter intersects with this Box object. This method checks the + * x, y, z, width, + * height, and depth properties of the specified + * Box object to see if it intersects with this Box object. + * + * @param toIntersect The Box object to compare against this Box object. + * @return A value of true if the specified object intersects + * with this Box object; otherwise false. + */ + Box.prototype.intersects = function (toIntersect) { + return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height && this.z + this.depth > toIntersect.z && this.z < toIntersect.z + toIntersect.depth); + }; + + /** + * Determines whether or not this Box object is empty. + * + * @return A value of true if the Box object's width, height or + * depth is less than or equal to 0; otherwise false. + */ + Box.prototype.isEmpty = function () { + return (this.x == 0 && this.y == 0 && this.z == 0 && this.width == 0 && this.height == 0 && this.depth == 0); + }; + + /** + * Adjusts the location of the Box object, as determined by its + * top-left-front corner, by the specified amounts. + * + * @param dx Moves the x value of the Box object by this amount. + * @param dy Moves the y value of the Box object by this amount. + * @param dz Moves the z value of the Box object by this amount. + */ + Box.prototype.offset = function (dx, dy, dz) { + this.x += dx; + this.y += dy; + this.z += dz; + }; + + /** + * Adjusts the location of the Box object using a Vector3D object as a + * parameter. This method is similar to the Box.offset() + * method, except that it takes a Vector3D object as a parameter. + * + * @param position A Vector3D object to use to offset this Box object. + */ + Box.prototype.offsetPosition = function (position) { + this.x += position.x; + this.y += position.y; + this.z += position.z; + }; + + /** + * Sets all of the Box object's properties to 0. A Box object is empty if its + * width, height or depth is less than or equal to 0. + * + *

This method sets the values of the x, y, + * z, width, height, and + * depth properties to 0.

+ * + */ + Box.prototype.setEmpty = function () { + this.x = 0; + this.y = 0; + this.z = 0; + this.width = 0; + this.height = 0; + this.depth = 0; + }; + + /** + * Sets the members of Box to the specified values + * + * @param xa The x coordinate of the top-left-front corner of the + * box. + * @param ya The y coordinate of the top-left-front corner of the + * box. + * @param yz The z coordinate of the top-left-front corner of the + * box. + * @param widtha The width of the box, in pixels. + * @param heighta The height of the box, in pixels. + * @param deptha The depth of the box, in pixels. + */ + Box.prototype.setTo = function (xa, ya, za, widtha, heighta, deptha) { + this.x = xa; + this.y = ya; + this.z = za; + this.width = widtha; + this.height = heighta; + this.depth = deptha; + }; + + /** + * Builds and returns a string that lists the horizontal, vertical and + * longitudinal positions and the width, height and depth of the Box object. + * + * @return A string listing the value of each of the following properties of + * the Box object: x, y, z, + * width, height, and depth. + */ + Box.prototype.toString = function () { + return "[Box] (x=" + this.x + ", y=" + this.y + ", z=" + this.z + ", width=" + this.width + ", height=" + this.height + ", depth=" + this.depth + ")"; + }; + + /** + * Adds two boxes together to create a new Box object, by filling + * in the horizontal, vertical and longitudinal space between the two boxes. + * + *

Note: The union() method ignores boxes with + * 0 as the height, width or depth value, such as: var + * box2:Box = new Box(300,300,300,50,50,0);

+ * + * @param toUnion A Box object to add to this Box object. + * @return A new Box object that is the union of the two boxes. + */ + Box.prototype.union = function (toUnion) { + var u = new Box(); + + if (this.x < toUnion.x) { + u.x = this.x; + u.width = toUnion.x - this.x + toUnion.width; + + if (u.width < this.width) + u.width = this.width; + } else { + u.x = toUnion.x; + u.width = this.x - toUnion.x + this.width; + + if (u.width < toUnion.width) + u.width = toUnion.width; + } + + if (this.y < toUnion.y) { + u.y = this.y; + u.height = toUnion.y - this.y + toUnion.height; + + if (u.height < this.height) + u.height = this.height; + } else { + u.y = toUnion.y; + u.height = this.y - toUnion.y + this.height; + + if (u.height < toUnion.height) + u.height = toUnion.height; + } + + if (this.z < toUnion.z) { + u.z = this.z; + u.depth = toUnion.z - this.z + toUnion.depth; + + if (u.depth < this.depth) + u.depth = this.depth; + } else { + u.z = toUnion.z; + u.depth = this.z - toUnion.z + this.depth; + + if (u.depth < toUnion.depth) + u.depth = toUnion.depth; + } + + return u; + }; + return Box; +})(); + +module.exports = Box; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9Cb3gudHMiXSwibmFtZXMiOlsiQm94IiwiQm94LmNvbnN0cnVjdG9yIiwiQm94LmNsb25lIiwiQm94LmNvbnRhaW5zIiwiQm94LmNvbnRhaW5zUG9pbnQiLCJCb3guY29udGFpbnNSZWN0IiwiQm94LmNvcHlGcm9tIiwiQm94LmVxdWFscyIsIkJveC5pbmZsYXRlIiwiQm94LmluZmxhdGVQb2ludCIsIkJveC5pbnRlcnNlY3Rpb24iLCJCb3guaW50ZXJzZWN0cyIsIkJveC5pc0VtcHR5IiwiQm94Lm9mZnNldCIsIkJveC5vZmZzZXRQb3NpdGlvbiIsIkJveC5zZXRFbXB0eSIsIkJveC5zZXRUbyIsIkJveC50b1N0cmluZyIsIkJveC51bmlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsNERBQW9FOztBQUVwRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMkJHO0FBQ0g7SUFzT0NBOzs7Ozs7Ozs7Ozs7Ozs7OztNQURHQTtJQUNIQSxhQUFZQSxDQUFZQSxFQUFFQSxDQUFZQSxFQUFFQSxDQUFZQSxFQUFFQSxLQUFnQkEsRUFBRUEsTUFBaUJBLEVBQUVBLEtBQWdCQTtRQUEvRkMsZ0NBQUFBLENBQUNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLGdDQUFBQSxDQUFDQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxnQ0FBQUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsb0NBQUFBLEtBQUtBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLHFDQUFBQSxNQUFNQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxvQ0FBQUEsS0FBS0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFFMUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1ZBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1ZBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1ZBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLEtBQUtBO1FBQ2xCQSxJQUFJ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QSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQTtZQUMxQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7O1lBRXpCQSxPQUFPQSxJQUFJQSxDQUFDQSxLQUFLQTtRQUNsQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFZREE7UUFBQUE7Ozs7Ozs7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUNkQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFlQSxHQUFVQTtZQUV4QkEsSUFBSUEsQ0FBQ0EsTUFBTUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0E7WUFDN0JBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBO1FBQ2JBLENBQUNBOzs7O0FBTkFBOztJQVlEQTtRQUFBQTs7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLElBQUlBLENBQUNBLGFBQWFBLElBQUlBLElBQUlBO2dCQUM3QkEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1lBRXJDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUM3QkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDN0JBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBOztZQUU3QkEsT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDMUJBLENBQUNBOzs7O0FBQUFBO0lBd0NEQTs7Ozs7Ozs7O01BREdBOzBCQUNIQTtRQUVDRSxPQUFPQSxJQUFJQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTtJQUM1RUEsQ0FBQ0E7O0lBWURGOzs7Ozs7Ozs7TUFER0E7NkJBQ0hBLFVBQWdCQSxDQUFRQSxFQUFFQSxDQUFRQSxFQUFFQSxDQUFRQTtRQUUzQ0csT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7SUFDeElBLENBQUNBOztJQWFESDs7Ozs7Ozs7OztNQURHQTtrQ0FDSEEsVUFBcUJBLFFBQWlCQTtRQUVyQ0ksT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDOUxBLENBQUNBOztJQVlESjs7Ozs7Ozs7O01BREdBO2lDQUNIQSxVQUFvQkEsR0FBT0E7UUFFMUJLLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEtBQUtBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLE1BQU1BLElBQUlBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBO0lBQ3JNQSxDQUFDQTs7SUFRREw7Ozs7O01BREdBOzZCQUNIQSxVQUFnQkEsU0FBYUE7UUFFNUJNLE1BQU1BO0lBQ1BBLENBQUNBOztJQWVETjs7Ozs7Ozs7Ozs7O01BREdBOzJCQUNIQSxVQUFjQSxTQUFhQTtRQUUxQk8sT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsU0FBU0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsU0FBU0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsU0FBU0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsS0FBS0EsSUFBSUEsU0FBU0EsQ0FBQ0EsS0FBS0EsSUFBSUEsSUFBSUEsQ0FBQ0EsTUFBTUEsSUFBSUEsU0FBU0EsQ0FBQ0EsTUFBTUEsSUFBSUEsSUFBSUEsQ0FBQ0EsS0FBS0EsSUFBSUEsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7SUFDdExBLENB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OUJBLENBQUNBLENBQUNBLEtBQUtBLEdBQUdBLFdBQVdBLENBQUNBLEtBQUtBLENBQUNBO2FBQzdCQTs7WUFFREEsT0FBT0EsQ0FBQ0E7U0FDUkE7O1FBRURBLE9BQU9BLElBQUlBLEdBQUdBLENBQUNBLENBQUNBO0lBQ2pCQSxDQUFDQTs7SUFhRFY7Ozs7Ozs7Ozs7TUFER0E7K0JBQ0hBLFVBQWtCQSxXQUFlQTtRQUVoQ1csT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsV0FBV0EsQ0FBQ0EsS0FBS0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsV0FBV0EsQ0FBQ0EsTUFBTUEsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsV0FBV0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7SUFDdlFBLENBQUNBOztJQVFEWDs7Ozs7TUFER0E7NEJBQ0hBO1FBRUNZLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO0lB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Q0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7O1lBRXpDQSxJQUFJQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxPQUFPQSxDQUFDQSxLQUFLQTtnQkFDMUJBLENBQUNBLENBQUNBLEtBQUtBLEdBQUdBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBO1NBQ3pCQTs7UUFFREEsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7WUFDdkJBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBO1lBQ1pBLENBQUNBLENBQUNBLE1BQU1BLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLE1BQU1BOztZQUU5Q0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7Z0JBQ3pCQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUN4QkEsS0FBTUE7WUFDTkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7WUFDZkEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7O1lBRTNDQSxJQUFJQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxPQUFPQSxDQUFDQSxNQUFNQTtnQkFDNUJBLENBQUNBLENBQUNBLE1BQU1BLEdBQUdBLE9BQU9BLENBQUNBLE1BQU1BLENBQUNBO1NBQzNCQTs7UUFFREEsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7WUFDdkJBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBO1lBQ1pBLENBQUNBLENBQUNBLEtBQUtBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLEtBQUtBOztZQUU1Q0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7Z0JBQ3ZCQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUN0QkEsS0FBTUE7WUFDTkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7WUFDZkEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7O1lBRXpDQSxJQUFJQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxPQUFPQSxDQUFDQSxLQUFLQTtnQkFDMUJBLENBQUNBLENBQUNBLEtBQUtBLEdBQUdBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBO1NBQ3pCQTs7UUFFREEsT0FBT0EsQ0FBQ0E7SUFDVEEsQ0FBQ0E7SUFDRmxCLFdBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsb0JBQWEsQ0FBQSIsImZpbGUiOiJjb3JlL2dlb20vQm94LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5cbi8qKlxuICogQSBCb3ggb2JqZWN0IGlzIGFuIGFyZWEgZGVmaW5lZCBieSBpdHMgcG9zaXRpb24sIGFzIGluZGljYXRlZCBieSBpdHNcbiAqIHRvcC1sZWZ0LWZyb250IGNvcm5lciBwb2ludCg8aT54PC9pPiwgPGk+eTwvaT4sIDxpPno8L2k+KSBhbmQgYnkgaXRzIHdpZHRoLFxuICogaGVpZ2h0IGFuZCBkZXB0aC5cbiAqXG4gKlxuICogPHA+VGhlIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPiwgPGNvZGU+ejwvY29kZT4sIDxjb2RlPndpZHRoPC9jb2RlPixcbiAqIDxjb2RlPmhlaWdodDwvY29kZT4gPGNvZGU+ZGVwdGg8L2NvZGU+IHByb3BlcnRpZXMgb2YgdGhlIEJveCBjbGFzcyBhcmVcbiAqIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXI7IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBvbmUgcHJvcGVydHkgaGFzIG5vIGVmZmVjdFxuICogb24gdGhlIG90aGVycy4gSG93ZXZlciwgdGhlIDxjb2RlPnJpZ2h0PC9jb2RlPiwgPGNvZGU+Ym90dG9tPC9jb2RlPiBhbmRcbiAqIDxjb2RlPmJhY2s8L2NvZGU+IHByb3BlcnRpZXMgYXJlIGludGVncmFsbHkgcmVsYXRlZCB0byB0aG9zZSBzaXhcbiAqIHByb3BlcnRpZXMuIEZvciBleGFtcGxlLCBpZiB5b3UgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+cmlnaHQ8L2NvZGU+XG4gKiBwcm9wZXJ0eSwgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT53aWR0aDwvY29kZT4gcHJvcGVydHkgY2hhbmdlczsgaWYgeW91XG4gKiBjaGFuZ2UgdGhlIDxjb2RlPmJvdHRvbTwvY29kZT4gcHJvcGVydHksIHRoZSB2YWx1ZSBvZiB0aGVcbiAqIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydHkgY2hhbmdlcy4gPC9wPlxuICpcbiAqIDxwPlRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhbmQgcHJvcGVydGllcyB1c2UgQm94IG9iamVjdHM6PC9wPlxuICpcbiAqIDx1bD5cbiAqICAgPGxpPlRoZSA8Y29kZT5ib3VuZHM8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBEaXNwbGF5T2JqZWN0IGNsYXNzPC9saT5cbiAqIDwvdWw+XG4gKlxuICogPHA+WW91IGNhbiB1c2UgdGhlIDxjb2RlPm5ldyBCb3goKTwvY29kZT4gY29uc3RydWN0b3IgdG8gY3JlYXRlIGFcbiAqIEJveCBvYmplY3QuPC9wPlxuICpcbiAqIDxwPjxiPk5vdGU6PC9iPiBUaGUgQm94IGNsYXNzIGRvZXMgbm90IGRlZmluZSBhIGN1YmljIFNoYXBlXG4gKiBkaXNwbGF5IG9iamVjdC5cbiAqL1xuY2xhc3MgQm94XG57XG5cdHByaXZhdGUgX3NpemU6VmVjdG9yM0Q7XG5cdHByaXZhdGUgX2JvdHRvbVJpZ2h0QmFjazpWZWN0b3IzRDtcblx0cHJpdmF0ZSBfdG9wTGVmdEZyb250OlZlY3RvcjNEO1xuXG5cdC8qKlxuXHQgKiBUaGUgaGVpZ2h0IG9mIHRoZSBib3gsIGluIHBpeGVscy4gQ2hhbmdpbmcgdGhlIDxjb2RlPmhlaWdodDwvY29kZT4gdmFsdWVcblx0ICogb2YgYSBCb3ggb2JqZWN0IGhhcyBubyBlZmZlY3Qgb24gdGhlIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPixcblx0ICogPGNvZGU+ejwvY29kZT4sIDxjb2RlPmRlcHRoPC9jb2RlPiBhbmQgPGNvZGU+d2lkdGg8L2NvZGU+IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRwdWJsaWMgaGVpZ2h0Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHdpZHRoIG9mIHRoZSBib3gsIGluIHBpeGVscy4gQ2hhbmdpbmcgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiB2YWx1ZVxuXHQgKiBvZiBhIEJveCBvYmplY3QgaGFzIG5vIGVmZmVjdCBvbiB0aGUgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LFxuXHQgKiA8Y29kZT56PC9jb2RlPiwgPGNvZGU+ZGVwdGg8L2NvZGU+IGFuZCA8Y29kZT5oZWlnaHQ8L2NvZGU+IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRwdWJsaWMgd2lkdGg6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgZGVvdGggb2YgdGhlIGJveCwgaW4gcGl4ZWxzLiBDaGFuZ2luZyB0aGUgPGNvZGU+ZGVwdGg8L2NvZGU+IHZhbHVlXG5cdCAqIG9mIGEgQm94IG9iamVjdCBoYXMgbm8gZWZmZWN0IG9uIHRoZSA8Y29kZT54PC9jb2RlPiwgPGNvZGU+eTwvY29kZT4sXG5cdCAqIDxjb2RlPno8L2NvZGU+LCA8Y29kZT53aWR0aDwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcy5cblx0ICovXG5cdHB1YmxpYyBkZXB0aDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSA8aT54PC9pPiBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdC1mcm9udCBjb3JuZXIgb2YgdGhlIGJveC5cblx0ICogQ2hhbmdpbmcgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT54PC9jb2RlPiBwcm9wZXJ0eSBvZiBhIEJveCBvYmplY3QgaGFzIG5vXG5cdCAqIGVmZmVjdCBvbiB0aGUgPGNvZGU+eTwvY29kZT4sIDxjb2RlPno8L2NvZGU+LCA8Y29kZT53aWR0aDwvY29kZT4sXG5cdCAqIDxjb2RlPmhlaWdodDwvY29kZT4gYW5kIDxjb2RlPmRlcHRoPC9jb2RlPiBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiA8cD5UaGUgdmFsdWUgb2YgdGhlIDxjb2RlPng8L2NvZGU+IHByb3BlcnR5IGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGVcblx0ICogPGNvZGU+bGVmdDwvY29kZT4gcHJvcGVydHkuPC9wPlxuXHQgKi9cblx0cHVibGljIHg6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgPGk+eTwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQtZnJvbnQgY29ybmVyIG9mIHRoZSBib3guXG5cdCAqIENoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+eTwvY29kZT4gcHJvcGVydHkgb2YgYSBCb3ggb2JqZWN0IGhhcyBub1xuXHQgKiBlZmZlY3Qgb24gdGhlIDxjb2RlPng8L2NvZGU+LCA8Y29kZT56PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+LFxuXHQgKiA8Y29kZT5oZWlnaHQ8L2NvZGU+IGFuZCA8Y29kZT5kZXB0aDwvY29kZT4gcHJvcGVydGllcy5cblx0ICpcblx0ICogPHA+VGhlIHZhbHVlIG9mIHRoZSA8Y29kZT55PC9jb2RlPiBwcm9wZXJ0eSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlXG5cdCAqIDxjb2RlPnRvcDwvY29kZT4gcHJvcGVydHkuPC9wPlxuXHQgKi9cblx0cHVibGljIHk6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgPGk+eTwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQtZnJvbnQgY29ybmVyIG9mIHRoZSBib3guXG5cdCAqIENoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+ejwvY29kZT4gcHJvcGVydHkgb2YgYSBCb3ggb2JqZWN0IGhhcyBub1xuXHQgKiBlZmZlY3Qgb24gdGhlIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+LFxuXHQgKiA8Y29kZT5oZWlnaHQ8L2NvZGU+IGFuZCA8Y29kZT5kZXB0aDwvY29kZT4gcHJvcGVydGllcy5cblx0ICpcblx0ICogPHA+VGhlIHZhbHVlIG9mIHRoZSA8Y29kZT56PC9jb2RlPiBwcm9wZXJ0eSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlXG5cdCAqIDxjb2RlPmZyb250PC9jb2RlPiBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgejpudW1iZXJcblxuXHQvKipcblx0ICogVGhlIHN1bSBvZiB0aGUgPGNvZGU+ejwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcy5cblx0ICovXG5cdHB1YmxpYyBnZXQgYmFjaygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMueiArIHRoaXMuZGVwdGg7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGJhY2sodmFsOm51bWJlcilcblx0e1xuXHRcdHRoaXMuZGVwdGggPSB2YWwgLSB0aGlzLno7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHN1bSBvZiB0aGUgPGNvZGU+eTwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcy5cblx0ICovXG5cdHB1YmxpYyBnZXQgYm90dG9tKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy55ICsgdGhpcy5oZWlnaHQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGJvdHRvbSh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5oZWlnaHQgPSB2YWwgLSB0aGlzLnk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGxvY2F0aW9uIG9mIHRoZSBCb3ggb2JqZWN0J3MgYm90dG9tLXJpZ2h0IGNvcm5lciwgZGV0ZXJtaW5lZCBieSB0aGVcblx0ICogdmFsdWVzIG9mIHRoZSA8Y29kZT5yaWdodDwvY29kZT4gYW5kIDxjb2RlPmJvdHRvbTwvY29kZT4gcHJvcGVydGllcy5cblx0ICovXG5cdHB1YmxpYyBnZXQgYm90dG9tUmlnaHRCYWNrKCk6VmVjdG9yM0Rcblx0e1xuXHRcdGlmICh0aGlzLl9ib3R0b21SaWdodEJhY2sgPT0gbnVsbClcblx0XHRcdHRoaXMuX2JvdHRvbVJpZ2h0QmFjayA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdFx0dGhpcy5fYm90dG9tUmlnaHRCYWNrLnggPSB0aGlzLnggKyB0aGlzLndpZHRoO1xuXHRcdHRoaXMuX2JvdHRvbVJpZ2h0QmFjay55ID0gdGhpcy55ICsgdGhpcy5oZWlnaHQ7XG5cdFx0dGhpcy5fYm90dG9tUmlnaHRCYWNrLnogPSB0aGlzLnogKyB0aGlzLmRlcHRoO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2JvdHRvbVJpZ2h0QmFjaztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgPGk+ejwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQtZnJvbnQgY29ybmVyIG9mIHRoZSBib3guIENoYW5naW5nXG5cdCAqIHRoZSA8Y29kZT5mcm9udDwvY29kZT4gcHJvcGVydHkgb2YgYSBCb3ggb2JqZWN0IGhhcyBubyBlZmZlY3Qgb24gdGhlXG5cdCAqIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+IGFuZCA8Y29kZT5oZWlnaHQ8L2NvZGU+XG5cdCAqIHByb3BlcnRpZXMuIEhvd2V2ZXIgaXQgZG9lcyBhZmZlY3QgdGhlIDxjb2RlPmRlcHRoPC9jb2RlPiBwcm9wZXJ0eSxcblx0ICogd2hlcmVhcyBjaGFuZ2luZyB0aGUgPGNvZGU+ejwvY29kZT4gdmFsdWUgZG9lcyA8aT5ub3Q8L2k+IGFmZmVjdCB0aGVcblx0ICogPGNvZGU+ZGVwdGg8L2NvZGU+IHByb3BlcnR5LlxuXHQgKlxuXHQgKiA8cD5UaGUgdmFsdWUgb2YgdGhlIDxjb2RlPmxlZnQ8L2NvZGU+IHByb3BlcnR5IGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZlxuXHQgKiB0aGUgPGNvZGU+eDwvY29kZT4gcHJvcGVydHkuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBmcm9udCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuejtcblx0fVxuXG5cdHB1YmxpYyBzZXQgZnJvbnQodmFsOm51bWJlcilcblx0e1xuXHRcdHRoaXMuZGVwdGggKz0gdGhpcy56IC0gdmFsO1xuXHRcdHRoaXMueiA9IHZhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgPGk+eDwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBib3guIENoYW5naW5nIHRoZVxuXHQgKiA8Y29kZT5sZWZ0PC9jb2RlPiBwcm9wZXJ0eSBvZiBhIEJveCBvYmplY3QgaGFzIG5vIGVmZmVjdCBvbiB0aGVcblx0ICogPGNvZGU+eTwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcy4gSG93ZXZlciBpdCBkb2VzIGFmZmVjdFxuXHQgKiB0aGUgPGNvZGU+d2lkdGg8L2NvZGU+IHByb3BlcnR5LCB3aGVyZWFzIGNoYW5naW5nIHRoZSA8Y29kZT54PC9jb2RlPiB2YWx1ZVxuXHQgKiBkb2VzIDxpPm5vdDwvaT4gYWZmZWN0IHRoZSA8Y29kZT53aWR0aDwvY29kZT4gcHJvcGVydHkuXG5cdCAqXG5cdCAqIDxwPlRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+bGVmdDwvY29kZT4gcHJvcGVydHkgaXMgZXF1YWwgdG8gdGhlIHZhbHVlIG9mXG5cdCAqIHRoZSA8Y29kZT54PC9jb2RlPiBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGxlZnQoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLng7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGxlZnQodmFsOm51bWJlcilcblx0e1xuXHRcdHRoaXMud2lkdGggKz0gdGhpcy54IC0gdmFsO1xuXHRcdHRoaXMueCA9IHZhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgc3VtIG9mIHRoZSA8Y29kZT54PC9jb2RlPiBhbmQgPGNvZGU+d2lkdGg8L2NvZGU+IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHJpZ2h0KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy54ICsgdGhpcy53aWR0aDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcmlnaHQodmFsOm51bWJlcilcblx0e1xuXHRcdHRoaXMud2lkdGggPSB2YWwgLSB0aGlzLng7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHNpemUgb2YgdGhlIEJveCBvYmplY3QsIGV4cHJlc3NlZCBhcyBhIFZlY3RvcjNEIG9iamVjdCB3aXRoIHRoZVxuXHQgKiB2YWx1ZXMgb2YgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiwgPGNvZGU+aGVpZ2h0PC9jb2RlPiBhbmRcblx0ICogPGNvZGU+ZGVwdGg8L2NvZGU+IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNpemUoKTpWZWN0b3IzRFxuXHR7XG5cdFx0aWYgKHRoaXMuX3NpemUgPT0gbnVsbClcblx0XHRcdHRoaXMuX3NpemUgPSBuZXcgVmVjdG9yM0QoKTtcblxuXHRcdHRoaXMuX3NpemUueCA9IHRoaXMud2lkdGg7XG5cdFx0dGhpcy5fc2l6ZS55ID0gdGhpcy5oZWlnaHQ7XG5cdFx0dGhpcy5fc2l6ZS56ID0gdGhpcy5kZXB0aDtcblxuXHRcdHJldHVybiB0aGlzLl9zaXplO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSA8aT55PC9pPiBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdC1mcm9udCBjb3JuZXIgb2YgdGhlIGJveC4gQ2hhbmdpbmdcblx0ICogdGhlIDxjb2RlPnRvcDwvY29kZT4gcHJvcGVydHkgb2YgYSBCb3ggb2JqZWN0IGhhcyBubyBlZmZlY3Qgb24gdGhlXG5cdCAqIDxjb2RlPng8L2NvZGU+IGFuZCA8Y29kZT53aWR0aDwvY29kZT4gcHJvcGVydGllcy4gSG93ZXZlciBpdCBkb2VzIGFmZmVjdFxuXHQgKiB0aGUgPGNvZGU+aGVpZ2h0PC9jb2RlPiBwcm9wZXJ0eSwgd2hlcmVhcyBjaGFuZ2luZyB0aGUgPGNvZGU+eTwvY29kZT5cblx0ICogdmFsdWUgZG9lcyA8aT5ub3Q8L2k+IGFmZmVjdCB0aGUgPGNvZGU+aGVpZ2h0PC9jb2RlPiBwcm9wZXJ0eS5cblx0ICpcblx0ICogPHA+VGhlIHZhbHVlIG9mIHRoZSA8Y29kZT50b3A8L2NvZGU+IHByb3BlcnR5IGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGVcblx0ICogPGNvZGU+eTwvY29kZT4gcHJvcGVydHkuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCB0b3AoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLnk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHRvcCh2YWw6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5oZWlnaHQgKz0gKHRoaXMueSAtIHZhbCk7XG5cdFx0dGhpcy55ID0gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgQm94IG9iamVjdCdzIHRvcC1sZWZ0LWZyb250IGNvcm5lciwgZGV0ZXJtaW5lZCBieSB0aGVcblx0ICogPGk+eDwvaT4sIDxpPnk8L2k+IGFuZCA8aT56PC9pPiBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHRvcExlZnRGcm9udCgpOlZlY3RvcjNEXG5cdHtcblx0XHRpZiAodGhpcy5fdG9wTGVmdEZyb250ID09IG51bGwpXG5cdFx0XHR0aGlzLl90b3BMZWZ0RnJvbnQgPSBuZXcgVmVjdG9yM0QoKTtcblxuXHRcdHRoaXMuX3RvcExlZnRGcm9udC54ID0gdGhpcy54O1xuXHRcdHRoaXMuX3RvcExlZnRGcm9udC55ID0gdGhpcy55O1xuXHRcdHRoaXMuX3RvcExlZnRGcm9udC56ID0gdGhpcy56O1xuXG5cdFx0cmV0dXJuIHRoaXMuX3RvcExlZnRGcm9udDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IEJveCBvYmplY3Qgd2l0aCB0aGUgdG9wLWxlZnQtZnJvbnQgY29ybmVyIHNwZWNpZmllZCBieSB0aGVcblx0ICogPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+IGFuZCA8Y29kZT56PC9jb2RlPiBwYXJhbWV0ZXJzIGFuZCB3aXRoIHRoZVxuXHQgKiBzcGVjaWZpZWQgPGNvZGU+d2lkdGg8L2NvZGU+LCA8Y29kZT5oZWlnaHQ8L2NvZGU+IGFuZCA8Y29kZT5kZXB0aDwvY29kZT5cblx0ICogcGFyYW1ldGVycy4gSWYgeW91IGNhbGwgdGhpcyBwdWJsaWMgd2l0aG91dCBwYXJhbWV0ZXJzLCBhIGJveCB3aXRoXG5cdCAqIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPiwgPGNvZGU+ejwvY29kZT4sIDxjb2RlPndpZHRoPC9jb2RlPixcblx0ICogPGNvZGU+aGVpZ2h0PC9jb2RlPiBhbmQgPGNvZGU+ZGVwdGg8L2NvZGU+IHByb3BlcnRpZXMgc2V0IHRvIDAgaXMgY3JlYXRlZC5cblx0ICpcblx0ICogQHBhcmFtIHggICAgICBUaGUgPGk+eDwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQtZnJvbnQgY29ybmVyIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgIGJveC5cblx0ICogQHBhcmFtIHkgICAgICBUaGUgPGk+eTwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQtZnJvbnQgY29ybmVyIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgIGJveC5cblx0ICogQHBhcmFtIHogICAgICBUaGUgPGk+ejwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQtZnJvbnQgY29ybmVyIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgIGJveC5cblx0ICogQHBhcmFtIHdpZHRoICBUaGUgd2lkdGggb2YgdGhlIGJveCwgaW4gcGl4ZWxzLlxuXHQgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIGJveCwgaW4gcGl4ZWxzLlxuXHQgKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBib3gsIGluIHBpeGVscy5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHg6bnVtYmVyID0gMCwgeTpudW1iZXIgPSAwLCB6Om51bWJlciA9IDAsIHdpZHRoOm51bWJlciA9IDAsIGhlaWdodDpudW1iZXIgPSAwLCBkZXB0aDpudW1iZXIgPSAwKVxuXHR7XG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoO1xuXHRcdHRoaXMuaGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdHRoaXMuZGVwdGggPSBkZXB0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgbmV3IEJveCBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgZm9yIHRoZSA8Y29kZT54PC9jb2RlPixcblx0ICogPGNvZGU+eTwvY29kZT4sIDxjb2RlPno8L2NvZGU+LCA8Y29kZT53aWR0aDwvY29kZT4sIDxjb2RlPmhlaWdodDwvY29kZT5cblx0ICogYW5kIDxjb2RlPmRlcHRoPC9jb2RlPiBwcm9wZXJ0aWVzIGFzIHRoZSBvcmlnaW5hbCBCb3ggb2JqZWN0LlxuXHQgKlxuXHQgKiBAcmV0dXJuIEEgbmV3IEJveCBvYmplY3Qgd2l0aCB0aGUgc2FtZSB2YWx1ZXMgZm9yIHRoZSA8Y29kZT54PC9jb2RlPixcblx0ICogICAgICAgICA8Y29kZT55PC9jb2RlPiwgPGNvZGU+ejwvY29kZT4sIDxjb2RlPndpZHRoPC9jb2RlPixcblx0ICogICAgICAgICA8Y29kZT5oZWlnaHQ8L2NvZGU+IGFuZCA8Y29kZT5kZXB0aDwvY29kZT4gcHJvcGVydGllcyBhcyB0aGVcblx0ICogICAgICAgICBvcmlnaW5hbCBCb3ggb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGNsb25lKCk6Qm94XG5cdHtcblx0XHRyZXR1cm4gbmV3IEJveCh0aGlzLngsIHRoaXMueSwgdGhpcy56LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCwgdGhpcy5kZXB0aCk7XG5cdH1cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgY3ViaWNcblx0ICogcmVnaW9uIGRlZmluZWQgYnkgdGhpcyBCb3ggb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0geCBUaGUgPGk+eDwvaT4gY29vcmRpbmF0ZShob3Jpem9udGFsIGNvbXBvbmVudCkgb2YgdGhlIHBvc2l0aW9uLlxuXHQgKiBAcGFyYW0geSBUaGUgPGk+eTwvaT4gY29vcmRpbmF0ZSh2ZXJ0aWNhbCBjb21wb25lbnQpIG9mIHRoZSBwb3NpdGlvbi5cblx0ICogQHBhcmFtIHogVGhlIDxpPno8L2k+IGNvb3JkaW5hdGUobG9uZ2l0dWRpbmFsIGNvbXBvbmVudCkgb2YgdGhlIHBvc2l0aW9uLlxuXHQgKiBAcmV0dXJuIEEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIEJveCBvYmplY3QgY29udGFpbnMgdGhlXG5cdCAqICAgICAgICAgc3BlY2lmaWVkIHBvc2l0aW9uOyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGNvbnRhaW5zKHg6bnVtYmVyLCB5Om51bWJlciwgejpudW1iZXIpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy54IDw9IHggJiYgdGhpcy54ICsgdGhpcy53aWR0aCA+PSB4ICYmIHRoaXMueSA8PSB5ICYmIHRoaXMueSArIHRoaXMuaGVpZ2h0ID49IHkgJiYgdGhpcy56IDw9IHogJiYgdGhpcy56ICsgdGhpcy5kZXB0aCA+PSB6KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpcyBjb250YWluZWQgd2l0aGluIHRoZSBjdWJpY1xuXHQgKiByZWdpb24gZGVmaW5lZCBieSB0aGlzIEJveCBvYmplY3QuIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gdGhlXG5cdCAqIDxjb2RlPkJveC5jb250YWlucygpPC9jb2RlPiBtZXRob2QsIGV4Y2VwdCB0aGF0IGl0IHRha2VzIGEgVmVjdG9yM0Rcblx0ICogb2JqZWN0IGFzIGEgcGFyYW1ldGVyLlxuXHQgKlxuXHQgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uLCBhcyByZXByZXNlbnRlZCBieSBpdHMgPGk+eDwvaT4sIDxpPnk8L2k+IGFuZFxuXHQgKiAgICAgICAgICAgICAgICAgPGk+ejwvaT4gY29vcmRpbmF0ZXMuXG5cdCAqIEByZXR1cm4gQSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgQm94IG9iamVjdCBjb250YWlucyB0aGVcblx0ICogICAgICAgICBzcGVjaWZpZWQgcG9zaXRpb247IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgY29udGFpbnNQb2ludChwb3NpdGlvbjpWZWN0b3IzRCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnggPD0gcG9zaXRpb24ueCAmJiB0aGlzLnggKyB0aGlzLndpZHRoID49IHBvc2l0aW9uLnggJiYgdGhpcy55IDw9IHBvc2l0aW9uLnkgJiYgdGhpcy55ICsgdGhpcy5oZWlnaHQgPj0gcG9zaXRpb24ueSAmJiB0aGlzLnogPD0gcG9zaXRpb24ueiAmJiB0aGlzLnogKyB0aGlzLmRlcHRoID49IHBvc2l0aW9uLnopO1xuXHR9XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgQm94IG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPmJveDwvY29kZT5cblx0ICogcGFyYW1ldGVyIGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBCb3ggb2JqZWN0LiBBIEJveCBvYmplY3QgaXMgc2FpZCB0b1xuXHQgKiBjb250YWluIGFub3RoZXIgaWYgdGhlIHNlY29uZCBCb3ggb2JqZWN0IGZhbGxzIGVudGlyZWx5IHdpdGhpbiB0aGVcblx0ICogYm91bmRhcmllcyBvZiB0aGUgZmlyc3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBib3ggVGhlIEJveCBvYmplY3QgYmVpbmcgY2hlY2tlZC5cblx0ICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBCb3ggb2JqZWN0IHRoYXQgeW91IHNwZWNpZnlcblx0ICogICAgICAgICBpcyBjb250YWluZWQgYnkgdGhpcyBCb3ggb2JqZWN0OyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGNvbnRhaW5zUmVjdChib3g6Qm94KTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMueCA8PSBib3gueCAmJiB0aGlzLnggKyB0aGlzLndpZHRoID49IGJveC54ICsgYm94LndpZHRoICYmIHRoaXMueSA8PSBib3gueSAmJiB0aGlzLnkgKyB0aGlzLmhlaWdodCA+PSBib3gueSArIGJveC5oZWlnaHQgJiYgdGhpcy56IDw9IGJveC56ICYmIHRoaXMueiArIHRoaXMuZGVwdGggPj0gYm94LnogKyBib3guZGVwdGgpXG5cdH1cblxuXHQvKipcblx0ICogQ29waWVzIGFsbCBvZiBib3ggZGF0YSBmcm9tIHRoZSBzb3VyY2UgQm94IG9iamVjdCBpbnRvIHRoZSBjYWxsaW5nXG5cdCAqIEJveCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2VCb3ggVGhlIEJveCBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHRoZSBkYXRhLlxuXHQgKi9cblx0cHVibGljIGNvcHlGcm9tKHNvdXJjZUJveDpCb3gpXG5cdHtcblx0XHQvL1RPRE9cblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG9iamVjdCBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPnRvQ29tcGFyZTwvY29kZT5cblx0ICogcGFyYW1ldGVyIGlzIGVxdWFsIHRvIHRoaXMgQm94IG9iamVjdC4gVGhpcyBtZXRob2QgY29tcGFyZXMgdGhlXG5cdCAqIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPiwgPGNvZGU+ejwvY29kZT4sIDxjb2RlPndpZHRoPC9jb2RlPixcblx0ICogPGNvZGU+aGVpZ2h0PC9jb2RlPiBhbmQgPGNvZGU+ZGVwdGg8L2NvZGU+IHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0IGFnYWluc3Rcblx0ICogdGhlIHNhbWUgcHJvcGVydGllcyBvZiB0aGlzIEJveCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB0b0NvbXBhcmUgVGhlIGJveCB0byBjb21wYXJlIHRvIHRoaXMgQm94IG9iamVjdC5cblx0ICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBvYmplY3QgaGFzIGV4YWN0bHkgdGhlIHNhbWVcblx0ICogICAgICAgICB2YWx1ZXMgZm9yIHRoZSA8Y29kZT54PC9jb2RlPiwgPGNvZGU+eTwvY29kZT4sIDxjb2RlPno8L2NvZGU+LFxuXHQgKiAgICAgICAgIDxjb2RlPndpZHRoPC9jb2RlPiwgPGNvZGU+aGVpZ2h0PC9jb2RlPiBhbmQgPGNvZGU+ZGVwdGg8L2NvZGU+XG5cdCAqICAgICAgICAgcHJvcGVydGllcyBhcyB0aGlzIEJveCBvYmplY3Q7IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgZXF1YWxzKHRvQ29tcGFyZTpCb3gpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy54ID09IHRvQ29tcGFyZS54ICYmIHRoaXMueSA9PSB0b0NvbXBhcmUueSAmJiB0aGlzLnogPT0gdG9Db21wYXJlLnogJiYgdGhpcy53aWR0aCA9PSB0b0NvbXBhcmUud2lkdGggJiYgdGhpcy5oZWlnaHQgPT0gdG9Db21wYXJlLmhlaWdodCAmJiB0aGlzLmRlcHRoID09IHRvQ29tcGFyZS5kZXB0aClcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIEJveCBvYmplY3QgYnkgdGhlIHNwZWNpZmllZCBhbW91bnRzLCBpblxuXHQgKiBwaXhlbHMuIFRoZSBjZW50ZXIgcG9pbnQgb2YgdGhlIEJveCBvYmplY3Qgc3RheXMgdGhlIHNhbWUsIGFuZCBpdHNcblx0ICogc2l6ZSBpbmNyZWFzZXMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGJ5IHRoZSA8Y29kZT5keDwvY29kZT4gdmFsdWUsIHRvXG5cdCAqIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gYnkgdGhlIDxjb2RlPmR5PC9jb2RlPiB2YWx1ZSwgYW5kIHRvXG5cdCAqIHRoZSBmcm9udCBhbmQgdGhlIGJhY2sgYnkgdGhlIDxjb2RlPmR6PC9jb2RlPiB2YWx1ZS5cblx0ICpcblx0ICogQHBhcmFtIGR4IFRoZSB2YWx1ZSB0byBiZSBhZGRlZCB0byB0aGUgbGVmdCBhbmQgdGhlIHJpZ2h0IG9mIHRoZSBCb3hcblx0ICogICAgICAgICAgIG9iamVjdC4gVGhlIGZvbGxvd2luZyBlcXVhdGlvbiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmV3XG5cdCAqICAgICAgICAgICB3aWR0aCBhbmQgcG9zaXRpb24gb2YgdGhlIGJveDpcblx0ICogQHBhcmFtIGR5IFRoZSB2YWx1ZSB0byBiZSBhZGRlZCB0byB0aGUgdG9wIGFuZCB0aGUgYm90dG9tIG9mIHRoZSBCb3hcblx0ICogICAgICAgICAgIG9iamVjdC4gVGhlIGZvbGxvd2luZyBlcXVhdGlvbiBpcyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbmV3XG5cdCAqICAgICAgICAgICBoZWlnaHQgYW5kIHBvc2l0aW9uIG9mIHRoZSBib3g6XG5cdCAqIEBwYXJhbSBkeiBUaGUgdmFsdWUgdG8gYmUgYWRkZWQgdG8gdGhlIGZyb250IGFuZCB0aGUgYmFjayBvZiB0aGUgQm94XG5cdCAqICAgICAgICAgICBvYmplY3QuIFRoZSBmb2xsb3dpbmcgZXF1YXRpb24gaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5ld1xuXHQgKiAgICAgICAgICAgZGVwdGggYW5kIHBvc2l0aW9uIG9mIHRoZSBib3g6XG5cdCAqL1xuXHRwdWJsaWMgaW5mbGF0ZShkeDpudW1iZXIsIGR5Om51bWJlciwgZHo6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy54IC09IGR4LzI7XG5cdFx0dGhpcy55IC09IGR5LzI7XG5cdFx0dGhpcy56IC09IGR6LzI7XG5cdFx0dGhpcy53aWR0aCArPSBkeC8yO1xuXHRcdHRoaXMuaGVpZ2h0ICs9IGR5LzI7XG5cdFx0dGhpcy5kZXB0aCArPSBkei8yO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUgQm94IG9iamVjdC4gVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB0aGVcblx0ICogPGNvZGU+Qm94LmluZmxhdGUoKTwvY29kZT4gbWV0aG9kIGV4Y2VwdCBpdCB0YWtlcyBhIFZlY3RvcjNEIG9iamVjdCBhc1xuXHQgKiBhIHBhcmFtZXRlci5cblx0ICpcblx0ICogPHA+VGhlIGZvbGxvd2luZyB0d28gY29kZSBleGFtcGxlcyBnaXZlIHRoZSBzYW1lIHJlc3VsdDo8L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBkZWx0YSBUaGUgPGNvZGU+eDwvY29kZT4gcHJvcGVydHkgb2YgdGhpcyBWZWN0b3IzRCBvYmplY3QgaXMgdXNlZCB0b1xuXHQgKiAgICAgICAgICAgICAgaW5jcmVhc2UgdGhlIGhvcml6b250YWwgZGltZW5zaW9uIG9mIHRoZSBCb3ggb2JqZWN0LlxuXHQgKiAgICAgICAgICAgICAgVGhlIDxjb2RlPnk8L2NvZGU+IHByb3BlcnR5IGlzIHVzZWQgdG8gaW5jcmVhc2UgdGhlIHZlcnRpY2FsXG5cdCAqICAgICAgICAgICAgICBkaW1lbnNpb24gb2YgdGhlIEJveCBvYmplY3QuXG5cdCAqICAgICAgICAgICAgICBUaGUgPGNvZGU+ejwvY29kZT4gcHJvcGVydHkgaXMgdXNlZCB0byBpbmNyZWFzZSB0aGVcblx0ICogICAgICAgICAgICAgIGxvbmdpdHVkaW5hbCBkaW1lbnNpb24gb2YgdGhlIEJveCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgaW5mbGF0ZVBvaW50KGRlbHRhOlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy54IC09IGRlbHRhLngvMjtcblx0XHR0aGlzLnkgLT0gZGVsdGEueS8yO1xuXHRcdHRoaXMueiAtPSBkZWx0YS56LzI7XG5cdFx0dGhpcy53aWR0aCArPSBkZWx0YS54LzI7XG5cdFx0dGhpcy5oZWlnaHQgKz0gZGVsdGEueS8yO1xuXHRcdHRoaXMuZGVwdGggKz0gZGVsdGEuei8yO1xuXHR9XG5cblx0LyoqXG5cdCAqIElmIHRoZSBCb3ggb2JqZWN0IHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+dG9JbnRlcnNlY3Q8L2NvZGU+IHBhcmFtZXRlclxuXHQgKiBpbnRlcnNlY3RzIHdpdGggdGhpcyBCb3ggb2JqZWN0LCByZXR1cm5zIHRoZSBhcmVhIG9mIGludGVyc2VjdGlvblxuXHQgKiBhcyBhIEJveCBvYmplY3QuIElmIHRoZSBib3hlcyBkbyBub3QgaW50ZXJzZWN0LCB0aGlzIG1ldGhvZCByZXR1cm5zIGFuXG5cdCAqIGVtcHR5IEJveCBvYmplY3Qgd2l0aCBpdHMgcHJvcGVydGllcyBzZXQgdG8gMC5cblx0ICpcblx0ICogQHBhcmFtIHRvSW50ZXJzZWN0IFRoZSBCb3ggb2JqZWN0IHRvIGNvbXBhcmUgYWdhaW5zdCB0byBzZWUgaWYgaXRcblx0ICogICAgICAgICAgICAgICAgICAgIGludGVyc2VjdHMgd2l0aCB0aGlzIEJveCBvYmplY3QuXG5cdCAqIEByZXR1cm4gQSBCb3ggb2JqZWN0IHRoYXQgZXF1YWxzIHRoZSBhcmVhIG9mIGludGVyc2VjdGlvbi4gSWYgdGhlXG5cdCAqICAgICAgICAgYm94ZXMgZG8gbm90IGludGVyc2VjdCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBCb3hcblx0ICogICAgICAgICBvYmplY3Q7IHRoYXQgaXMsIGEgYm94IHdpdGggaXRzIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPixcblx0ICogICAgICAgICA8Y29kZT56PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+LCAgPGNvZGU+aGVpZ2h0PC9jb2RlPiwgYW5kXG5cdCAqICAgICAgICAgPGNvZGU+ZGVwdGg8L2NvZGU+IHByb3BlcnRpZXMgc2V0IHRvIDAuXG5cdCAqL1xuXHRwdWJsaWMgaW50ZXJzZWN0aW9uKHRvSW50ZXJzZWN0OkJveCk6Qm94XG5cdHtcblx0XHRpZiAodGhpcy5pbnRlcnNlY3RzKHRvSW50ZXJzZWN0KSkge1xuXHRcdFx0dmFyIGk6Qm94ID0gbmV3IEJveCgpO1xuXG5cdFx0XHRpZiAodGhpcy54ID4gdG9JbnRlcnNlY3QueCkge1xuXHRcdFx0XHRpLnggPSB0aGlzLng7XG5cdFx0XHRcdGkud2lkdGggPSB0b0ludGVyc2VjdC54IC0gdGhpcy54ICsgdG9JbnRlcnNlY3Qud2lkdGg7XG5cblx0XHRcdFx0aWYgKGkud2lkdGggPiB0aGlzLndpZHRoKVxuXHRcdFx0XHRcdGkud2lkdGggPSB0aGlzLndpZHRoO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aS54ID0gdG9JbnRlcnNlY3QueDtcblx0XHRcdFx0aS53aWR0aCA9IHRoaXMueCAtIHRvSW50ZXJzZWN0LnggKyB0aGlzLndpZHRoO1xuXG5cdFx0XHRcdGlmIChpLndpZHRoID4gdG9JbnRlcnNlY3Qud2lkdGgpXG5cdFx0XHRcdFx0aS53aWR0aCA9IHRvSW50ZXJzZWN0LndpZHRoO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy55ID4gdG9JbnRlcnNlY3QueSkge1xuXHRcdFx0XHRpLnkgPSB0aGlzLnk7XG5cdFx0XHRcdGkuaGVpZ2h0ID0gdG9JbnRlcnNlY3QueSAtIHRoaXMueSArIHRvSW50ZXJzZWN0LmhlaWdodDtcblxuXHRcdFx0XHRpZiAoaS5oZWlnaHQgPiB0aGlzLmhlaWdodClcblx0XHRcdFx0XHRpLmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aS55ID0gdG9JbnRlcnNlY3QueTtcblx0XHRcdFx0aS5oZWlnaHQgPSB0aGlzLnkgLSB0b0ludGVyc2VjdC55ICsgdGhpcy5oZWlnaHQ7XG5cblx0XHRcdFx0aWYgKGkuaGVpZ2h0ID4gdG9JbnRlcnNlY3QuaGVpZ2h0KVxuXHRcdFx0XHRcdGkuaGVpZ2h0ID0gdG9JbnRlcnNlY3QuaGVpZ2h0O1xuXHRcdFx0fVxuXG5cblx0XHRcdGlmICh0aGlzLnogPiB0b0ludGVyc2VjdC56KSB7XG5cdFx0XHRcdGkueiA9IHRoaXMuejtcblx0XHRcdFx0aS5kZXB0aCA9IHRvSW50ZXJzZWN0LnogLSB0aGlzLnogKyB0b0ludGVyc2VjdC5kZXB0aDtcblxuXHRcdFx0XHRpZiAoaS5kZXB0aCA+IHRoaXMuZGVwdGgpXG5cdFx0XHRcdFx0aS5kZXB0aCA9IHRoaXMuZGVwdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpLnogPSB0b0ludGVyc2VjdC56O1xuXHRcdFx0XHRpLmRlcHRoID0gdGhpcy56IC0gdG9JbnRlcnNlY3QueiArIHRoaXMuZGVwdGg7XG5cblx0XHRcdFx0aWYgKGkuZGVwdGggPiB0b0ludGVyc2VjdC5kZXB0aClcblx0XHRcdFx0XHRpLmRlcHRoID0gdG9JbnRlcnNlY3QuZGVwdGg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQm94KCk7XG5cdH1cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBvYmplY3Qgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT50b0ludGVyc2VjdDwvY29kZT5cblx0ICogcGFyYW1ldGVyIGludGVyc2VjdHMgd2l0aCB0aGlzIEJveCBvYmplY3QuIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGVcblx0ICogPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCA8Y29kZT56PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+LFxuXHQgKiA8Y29kZT5oZWlnaHQ8L2NvZGU+LCBhbmQgPGNvZGU+ZGVwdGg8L2NvZGU+IHByb3BlcnRpZXMgb2YgdGhlIHNwZWNpZmllZFxuXHQgKiBCb3ggb2JqZWN0IHRvIHNlZSBpZiBpdCBpbnRlcnNlY3RzIHdpdGggdGhpcyBCb3ggb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gdG9JbnRlcnNlY3QgVGhlIEJveCBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0IHRoaXMgQm94IG9iamVjdC5cblx0ICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGludGVyc2VjdHNcblx0ICogICAgICAgICB3aXRoIHRoaXMgQm94IG9iamVjdDsgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBpbnRlcnNlY3RzKHRvSW50ZXJzZWN0OkJveCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnggKyB0aGlzLndpZHRoID4gdG9JbnRlcnNlY3QueCAmJiB0aGlzLnggPCB0b0ludGVyc2VjdC54ICsgdG9JbnRlcnNlY3Qud2lkdGggJiYgdGhpcy55ICsgdGhpcy5oZWlnaHQgPiB0b0ludGVyc2VjdC55ICYmIHRoaXMueSA8IHRvSW50ZXJzZWN0LnkgKyB0b0ludGVyc2VjdC5oZWlnaHQgJiYgdGhpcy56ICsgdGhpcy5kZXB0aCA+IHRvSW50ZXJzZWN0LnogJiYgdGhpcy56IDwgdG9JbnRlcnNlY3QueiArIHRvSW50ZXJzZWN0LmRlcHRoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoaXMgQm94IG9iamVjdCBpcyBlbXB0eS5cblx0ICpcblx0ICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBCb3ggb2JqZWN0J3Mgd2lkdGgsIGhlaWdodCBvclxuXHQgKiAgICAgICAgIGRlcHRoIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAwOyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGlzRW1wdHkoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gKHRoaXMueCA9PSAwICYmIHRoaXMueSA9PSAwICYmIHRoaXMueiA9PSAwICYmIHRoaXMud2lkdGggPT0gMCAmJiB0aGlzLmhlaWdodCA9PSAwICYmIHRoaXMuZGVwdGggPT0gMCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRqdXN0cyB0aGUgbG9jYXRpb24gb2YgdGhlIEJveCBvYmplY3QsIGFzIGRldGVybWluZWQgYnkgaXRzXG5cdCAqIHRvcC1sZWZ0LWZyb250IGNvcm5lciwgYnkgdGhlIHNwZWNpZmllZCBhbW91bnRzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZHggTW92ZXMgdGhlIDxpPng8L2k+IHZhbHVlIG9mIHRoZSBCb3ggb2JqZWN0IGJ5IHRoaXMgYW1vdW50LlxuXHQgKiBAcGFyYW0gZHkgTW92ZXMgdGhlIDxpPnk8L2k+IHZhbHVlIG9mIHRoZSBCb3ggb2JqZWN0IGJ5IHRoaXMgYW1vdW50LlxuXHQgKiBAcGFyYW0gZHogTW92ZXMgdGhlIDxpPno8L2k+IHZhbHVlIG9mIHRoZSBCb3ggb2JqZWN0IGJ5IHRoaXMgYW1vdW50LlxuXHQgKi9cblx0cHVibGljIG9mZnNldChkeDpudW1iZXIsIGR5Om51bWJlciwgZHo6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy54ICs9IGR4O1xuXHRcdHRoaXMueSArPSBkeTtcblx0XHR0aGlzLnogKz0gZHo7XG5cdH1cblxuXHQvKipcblx0ICogQWRqdXN0cyB0aGUgbG9jYXRpb24gb2YgdGhlIEJveCBvYmplY3QgdXNpbmcgYSBWZWN0b3IzRCBvYmplY3QgYXMgYVxuXHQgKiBwYXJhbWV0ZXIuIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gdGhlIDxjb2RlPkJveC5vZmZzZXQoKTwvY29kZT5cblx0ICogbWV0aG9kLCBleGNlcHQgdGhhdCBpdCB0YWtlcyBhIFZlY3RvcjNEIG9iamVjdCBhcyBhIHBhcmFtZXRlci5cblx0ICpcblx0ICogQHBhcmFtIHBvc2l0aW9uIEEgVmVjdG9yM0Qgb2JqZWN0IHRvIHVzZSB0byBvZmZzZXQgdGhpcyBCb3ggb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIG9mZnNldFBvc2l0aW9uKHBvc2l0aW9uOlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy54ICs9IHBvc2l0aW9uLng7XG5cdFx0dGhpcy55ICs9IHBvc2l0aW9uLnk7XG5cdFx0dGhpcy56ICs9IHBvc2l0aW9uLno7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBhbGwgb2YgdGhlIEJveCBvYmplY3QncyBwcm9wZXJ0aWVzIHRvIDAuIEEgQm94IG9iamVjdCBpcyBlbXB0eSBpZiBpdHNcblx0ICogd2lkdGgsIGhlaWdodCBvciBkZXB0aCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMC5cblx0ICpcblx0ICogPHA+IFRoaXMgbWV0aG9kIHNldHMgdGhlIHZhbHVlcyBvZiB0aGUgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LFxuXHQgKiA8Y29kZT56PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+LCA8Y29kZT5oZWlnaHQ8L2NvZGU+LCBhbmRcblx0ICogPGNvZGU+ZGVwdGg8L2NvZGU+IHByb3BlcnRpZXMgdG8gMC48L3A+XG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgc2V0RW1wdHkoKVxuXHR7XG5cdFx0dGhpcy54ID0gMDtcblx0XHR0aGlzLnkgPSAwO1xuXHRcdHRoaXMueiA9IDA7XG5cdFx0dGhpcy53aWR0aCA9IDA7XG5cdFx0dGhpcy5oZWlnaHQgPSAwO1xuXHRcdHRoaXMuZGVwdGggPSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG1lbWJlcnMgb2YgQm94IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVzXG5cdCAqXG5cdCAqIEBwYXJhbSB4YSAgICAgIFRoZSA8aT54PC9pPiBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdC1mcm9udCBjb3JuZXIgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgIGJveC5cblx0ICogQHBhcmFtIHlhICAgICAgVGhlIDxpPnk8L2k+IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0LWZyb250IGNvcm5lciBvZiB0aGVcblx0ICogICAgICAgICAgICAgICAgYm94LlxuXHQgKiBAcGFyYW0geXogICAgICBUaGUgPGk+ejwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQtZnJvbnQgY29ybmVyIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICBib3guXG5cdCAqIEBwYXJhbSB3aWR0aGEgIFRoZSB3aWR0aCBvZiB0aGUgYm94LCBpbiBwaXhlbHMuXG5cdCAqIEBwYXJhbSBoZWlnaHRhIFRoZSBoZWlnaHQgb2YgdGhlIGJveCwgaW4gcGl4ZWxzLlxuXHQgKiBAcGFyYW0gZGVwdGhhICBUaGUgZGVwdGggb2YgdGhlIGJveCwgaW4gcGl4ZWxzLlxuXHQgKi9cblx0cHVibGljIHNldFRvKHhhOm51bWJlciwgeWE6bnVtYmVyLCB6YTpudW1iZXIsIHdpZHRoYTpudW1iZXIsIGhlaWdodGE6bnVtYmVyLCBkZXB0aGE6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy54ID0geGE7XG5cdFx0dGhpcy55ID0geWE7XG5cdFx0dGhpcy56ID0gemE7XG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoYTtcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodGE7XG5cdFx0dGhpcy5kZXB0aCA9IGRlcHRoYTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgYW5kIHJldHVybnMgYSBzdHJpbmcgdGhhdCBsaXN0cyB0aGUgaG9yaXpvbnRhbCwgdmVydGljYWwgYW5kXG5cdCAqIGxvbmdpdHVkaW5hbCBwb3NpdGlvbnMgYW5kIHRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBkZXB0aCBvZiB0aGUgQm94IG9iamVjdC5cblx0ICpcblx0ICogQHJldHVybiBBIHN0cmluZyBsaXN0aW5nIHRoZSB2YWx1ZSBvZiBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBvZlxuXHQgKiAgICAgICAgIHRoZSBCb3ggb2JqZWN0OiA8Y29kZT54PC9jb2RlPiwgPGNvZGU+eTwvY29kZT4sIDxjb2RlPno8L2NvZGU+LFxuXHQgKiAgICAgICAgIDxjb2RlPndpZHRoPC9jb2RlPiwgPGNvZGU+aGVpZ2h0PC9jb2RlPiwgYW5kIDxjb2RlPmRlcHRoPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyB0b1N0cmluZygpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIFwiW0JveF0gKHg9XCIgKyB0aGlzLnggKyBcIiwgeT1cIiArIHRoaXMueSArIFwiLCB6PVwiICsgdGhpcy56ICsgXCIsIHdpZHRoPVwiICsgdGhpcy53aWR0aCArIFwiLCBoZWlnaHQ9XCIgKyB0aGlzLmhlaWdodCArIFwiLCBkZXB0aD1cIiArIHRoaXMuZGVwdGggKyBcIilcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHR3byBib3hlcyB0b2dldGhlciB0byBjcmVhdGUgYSBuZXcgQm94IG9iamVjdCwgYnkgZmlsbGluZ1xuXHQgKiBpbiB0aGUgaG9yaXpvbnRhbCwgdmVydGljYWwgYW5kIGxvbmdpdHVkaW5hbCBzcGFjZSBiZXR3ZWVuIHRoZSB0d28gYm94ZXMuXG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU6PC9iPiBUaGUgPGNvZGU+dW5pb24oKTwvY29kZT4gbWV0aG9kIGlnbm9yZXMgYm94ZXMgd2l0aFxuXHQgKiA8Y29kZT4wPC9jb2RlPiBhcyB0aGUgaGVpZ2h0LCB3aWR0aCBvciBkZXB0aCB2YWx1ZSwgc3VjaCBhczogPGNvZGU+dmFyXG5cdCAqIGJveDI6Qm94ID0gbmV3IEJveCgzMDAsMzAwLDMwMCw1MCw1MCwwKTs8L2NvZGU+PC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gdG9VbmlvbiBBIEJveCBvYmplY3QgdG8gYWRkIHRvIHRoaXMgQm94IG9iamVjdC5cblx0ICogQHJldHVybiBBIG5ldyBCb3ggb2JqZWN0IHRoYXQgaXMgdGhlIHVuaW9uIG9mIHRoZSB0d28gYm94ZXMuXG5cdCAqL1xuXHRwdWJsaWMgdW5pb24odG9VbmlvbjpCb3gpOkJveFxuXHR7XG5cdFx0dmFyIHU6Qm94ID0gbmV3IEJveCgpO1xuXG5cdFx0aWYgKHRoaXMueCA8IHRvVW5pb24ueCkge1xuXHRcdFx0dS54ID0gdGhpcy54O1xuXHRcdFx0dS53aWR0aCA9IHRvVW5pb24ueCAtIHRoaXMueCArIHRvVW5pb24ud2lkdGg7XG5cblx0XHRcdGlmICh1LndpZHRoIDwgdGhpcy53aWR0aClcblx0XHRcdFx0dS53aWR0aCA9IHRoaXMud2lkdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHUueCA9IHRvVW5pb24ueDtcblx0XHRcdHUud2lkdGggPSB0aGlzLnggLSB0b1VuaW9uLnggKyB0aGlzLndpZHRoO1xuXG5cdFx0XHRpZiAodS53aWR0aCA8IHRvVW5pb24ud2lkdGgpXG5cdFx0XHRcdHUud2lkdGggPSB0b1VuaW9uLndpZHRoO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnkgPCB0b1VuaW9uLnkpIHtcblx0XHRcdHUueSA9IHRoaXMueTtcblx0XHRcdHUuaGVpZ2h0ID0gdG9Vbmlvbi55IC0gdGhpcy55ICsgdG9Vbmlvbi5oZWlnaHQ7XG5cblx0XHRcdGlmICh1LmhlaWdodCA8IHRoaXMuaGVpZ2h0KVxuXHRcdFx0XHR1LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1LnkgPSB0b1VuaW9uLnk7XG5cdFx0XHR1LmhlaWdodCA9IHRoaXMueSAtIHRvVW5pb24ueSArIHRoaXMuaGVpZ2h0O1xuXG5cdFx0XHRpZiAodS5oZWlnaHQgPCB0b1VuaW9uLmhlaWdodClcblx0XHRcdFx0dS5oZWlnaHQgPSB0b1VuaW9uLmhlaWdodDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy56IDwgdG9Vbmlvbi56KSB7XG5cdFx0XHR1LnogPSB0aGlzLno7XG5cdFx0XHR1LmRlcHRoID0gdG9Vbmlvbi56IC0gdGhpcy56ICsgdG9Vbmlvbi5kZXB0aDtcblxuXHRcdFx0aWYgKHUuZGVwdGggPCB0aGlzLmRlcHRoKVxuXHRcdFx0XHR1LmRlcHRoID0gdGhpcy5kZXB0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dS56ID0gdG9Vbmlvbi56O1xuXHRcdFx0dS5kZXB0aCA9IHRoaXMueiAtIHRvVW5pb24ueiArIHRoaXMuZGVwdGg7XG5cblx0XHRcdGlmICh1LmRlcHRoIDwgdG9Vbmlvbi5kZXB0aClcblx0XHRcdFx0dS5kZXB0aCA9IHRvVW5pb24uZGVwdGg7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHU7XG5cdH1cbn1cblxuZXhwb3J0ID0gQm94OyJdfQ== \ No newline at end of file diff --git a/lib/core/geom/Box.ts b/lib/core/geom/Box.ts new file mode 100644 index 00000000..94fffc4d --- /dev/null +++ b/lib/core/geom/Box.ts @@ -0,0 +1,652 @@ +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** + * A Box object is an area defined by its position, as indicated by its + * top-left-front corner point(x, y, z) and by its width, + * height and depth. + * + * + *

The x, y, z, width, + * height depth properties of the Box class are + * independent of each other; changing the value of one property has no effect + * on the others. However, the right, bottom and + * back properties are integrally related to those six + * properties. For example, if you change the value of the right + * property, the value of the width property changes; if you + * change the bottom property, the value of the + * height property changes.

+ * + *

The following methods and properties use Box objects:

+ * + *
    + *
  • The bounds property of the DisplayObject class
  • + *
+ * + *

You can use the new Box() constructor to create a + * Box object.

+ * + *

Note: The Box class does not define a cubic Shape + * display object. + */ +class Box +{ + private _size:Vector3D; + private _bottomRightBack:Vector3D; + private _topLeftFront:Vector3D; + + /** + * The height of the box, in pixels. Changing the height value + * of a Box object has no effect on the x, y, + * z, depth and width properties. + */ + public height:number; + + /** + * The width of the box, in pixels. Changing the width value + * of a Box object has no effect on the x, y, + * z, depth and height properties. + */ + public width:number; + + /** + * The deoth of the box, in pixels. Changing the depth value + * of a Box object has no effect on the x, y, + * z, width and height properties. + */ + public depth:number; + + /** + * The x coordinate of the top-left-front corner of the box. + * Changing the value of the x property of a Box object has no + * effect on the y, z, width, + * height and depth properties. + * + *

The value of the x property is equal to the value of the + * left property.

+ */ + public x:number; + + /** + * The y coordinate of the top-left-front corner of the box. + * Changing the value of the y property of a Box object has no + * effect on the x, z, width, + * height and depth properties. + * + *

The value of the y property is equal to the value of the + * top property.

+ */ + public y:number; + + /** + * The y coordinate of the top-left-front corner of the box. + * Changing the value of the z property of a Box object has no + * effect on the x, y, width, + * height and depth properties. + * + *

The value of the z property is equal to the value of the + * front property.

+ */ + public z:number + + /** + * The sum of the z and height properties. + */ + public get back():number + { + return this.z + this.depth; + } + + public set back(val:number) + { + this.depth = val - this.z; + } + + /** + * The sum of the y and height properties. + */ + public get bottom():number + { + return this.y + this.height; + } + + public set bottom(val:number) + { + this.height = val - this.y; + } + + /** + * The location of the Box object's bottom-right corner, determined by the + * values of the right and bottom properties. + */ + public get bottomRightBack():Vector3D + { + if (this._bottomRightBack == null) + this._bottomRightBack = new Vector3D(); + + this._bottomRightBack.x = this.x + this.width; + this._bottomRightBack.y = this.y + this.height; + this._bottomRightBack.z = this.z + this.depth; + + return this._bottomRightBack; + } + + /** + * The z coordinate of the top-left-front corner of the box. Changing + * the front property of a Box object has no effect on the + * x, y, width and height + * properties. However it does affect the depth property, + * whereas changing the z value does not affect the + * depth property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + public get front():number + { + return this.z; + } + + public set front(val:number) + { + this.depth += this.z - val; + this.z = val; + } + + /** + * The x coordinate of the top-left corner of the box. Changing the + * left property of a Box object has no effect on the + * y and height properties. However it does affect + * the width property, whereas changing the x value + * does not affect the width property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + public get left():number + { + return this.x; + } + + public set left(val:number) + { + this.width += this.x - val; + this.x = val; + } + + /** + * The sum of the x and width properties. + */ + public get right():number + { + return this.x + this.width; + } + + public set right(val:number) + { + this.width = val - this.x; + } + + /** + * The size of the Box object, expressed as a Vector3D object with the + * values of the width, height and + * depth properties. + */ + public get size():Vector3D + { + if (this._size == null) + this._size = new Vector3D(); + + this._size.x = this.width; + this._size.y = this.height; + this._size.z = this.depth; + + return this._size; + } + + /** + * The y coordinate of the top-left-front corner of the box. Changing + * the top property of a Box object has no effect on the + * x and width properties. However it does affect + * the height property, whereas changing the y + * value does not affect the height property. + * + *

The value of the top property is equal to the value of the + * y property.

+ */ + public get top():number + { + return this.y; + } + + public set top(val:number) + { + this.height += (this.y - val); + this.y = val; + } + + /** + * The location of the Box object's top-left-front corner, determined by the + * x, y and z coordinates of the point. + */ + public get topLeftFront():Vector3D + { + if (this._topLeftFront == null) + this._topLeftFront = new Vector3D(); + + this._topLeftFront.x = this.x; + this._topLeftFront.y = this.y; + this._topLeftFront.z = this.z; + + return this._topLeftFront; + } + + /** + * Creates a new Box object with the top-left-front corner specified by the + * x, y and z parameters and with the + * specified width, height and depth + * parameters. If you call this public without parameters, a box with + * x, y, z, width, + * height and depth properties set to 0 is created. + * + * @param x The x coordinate of the top-left-front corner of the + * box. + * @param y The y coordinate of the top-left-front corner of the + * box. + * @param z The z coordinate of the top-left-front corner of the + * box. + * @param width The width of the box, in pixels. + * @param height The height of the box, in pixels. + * @param depth The depth of the box, in pixels. + */ + constructor(x:number = 0, y:number = 0, z:number = 0, width:number = 0, height:number = 0, depth:number = 0) + { + this.x = x; + this.y = y; + this.z = z; + this.width = width; + this.height = height; + this.depth = depth; + } + + /** + * Returns a new Box object with the same values for the x, + * y, z, width, height + * and depth properties as the original Box object. + * + * @return A new Box object with the same values for the x, + * y, z, width, + * height and depth properties as the + * original Box object. + */ + public clone():Box + { + return new Box(this.x, this.y, this.z, this.width, this.height, this.depth); + } + + /** + * Determines whether the specified position is contained within the cubic + * region defined by this Box object. + * + * @param x The x coordinate(horizontal component) of the position. + * @param y The y coordinate(vertical component) of the position. + * @param z The z coordinate(longitudinal component) of the position. + * @return A value of true if the Box object contains the + * specified position; otherwise false. + */ + public contains(x:number, y:number, z:number):boolean + { + return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y && this.z <= z && this.z + this.depth >= z); + } + + /** + * Determines whether the specified position is contained within the cubic + * region defined by this Box object. This method is similar to the + * Box.contains() method, except that it takes a Vector3D + * object as a parameter. + * + * @param position The position, as represented by its x, y and + * z coordinates. + * @return A value of true if the Box object contains the + * specified position; otherwise false. + */ + public containsPoint(position:Vector3D):boolean + { + return (this.x <= position.x && this.x + this.width >= position.x && this.y <= position.y && this.y + this.height >= position.y && this.z <= position.z && this.z + this.depth >= position.z); + } + + /** + * Determines whether the Box object specified by the box + * parameter is contained within this Box object. A Box object is said to + * contain another if the second Box object falls entirely within the + * boundaries of the first. + * + * @param box The Box object being checked. + * @return A value of true if the Box object that you specify + * is contained by this Box object; otherwise false. + */ + public containsRect(box:Box):boolean + { + return (this.x <= box.x && this.x + this.width >= box.x + box.width && this.y <= box.y && this.y + this.height >= box.y + box.height && this.z <= box.z && this.z + this.depth >= box.z + box.depth) + } + + /** + * Copies all of box data from the source Box object into the calling + * Box object. + * + * @param sourceBox The Box object from which to copy the data. + */ + public copyFrom(sourceBox:Box) + { + //TODO + } + + /** + * Determines whether the object specified in the toCompare + * parameter is equal to this Box object. This method compares the + * x, y, z, width, + * height and depth properties of an object against + * the same properties of this Box object. + * + * @param toCompare The box to compare to this Box object. + * @return A value of true if the object has exactly the same + * values for the x, y, z, + * width, height and depth + * properties as this Box object; otherwise false. + */ + public equals(toCompare:Box):boolean + { + return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && this.width == toCompare.width && this.height == toCompare.height && this.depth == toCompare.depth) + } + + /** + * Increases the size of the Box object by the specified amounts, in + * pixels. The center point of the Box object stays the same, and its + * size increases to the left and right by the dx value, to + * the top and the bottom by the dy value, and to + * the front and the back by the dz value. + * + * @param dx The value to be added to the left and the right of the Box + * object. The following equation is used to calculate the new + * width and position of the box: + * @param dy The value to be added to the top and the bottom of the Box + * object. The following equation is used to calculate the new + * height and position of the box: + * @param dz The value to be added to the front and the back of the Box + * object. The following equation is used to calculate the new + * depth and position of the box: + */ + public inflate(dx:number, dy:number, dz:number) + { + this.x -= dx/2; + this.y -= dy/2; + this.z -= dz/2; + this.width += dx/2; + this.height += dy/2; + this.depth += dz/2; + } + + /** + * Increases the size of the Box object. This method is similar to the + * Box.inflate() method except it takes a Vector3D object as + * a parameter. + * + *

The following two code examples give the same result:

+ * + * @param delta The x property of this Vector3D object is used to + * increase the horizontal dimension of the Box object. + * The y property is used to increase the vertical + * dimension of the Box object. + * The z property is used to increase the + * longitudinal dimension of the Box object. + */ + public inflatePoint(delta:Vector3D) + { + this.x -= delta.x/2; + this.y -= delta.y/2; + this.z -= delta.z/2; + this.width += delta.x/2; + this.height += delta.y/2; + this.depth += delta.z/2; + } + + /** + * If the Box object specified in the toIntersect parameter + * intersects with this Box object, returns the area of intersection + * as a Box object. If the boxes do not intersect, this method returns an + * empty Box object with its properties set to 0. + * + * @param toIntersect The Box object to compare against to see if it + * intersects with this Box object. + * @return A Box object that equals the area of intersection. If the + * boxes do not intersect, this method returns an empty Box + * object; that is, a box with its x, y, + * z, width, height, and + * depth properties set to 0. + */ + public intersection(toIntersect:Box):Box + { + if (this.intersects(toIntersect)) { + var i:Box = new Box(); + + if (this.x > toIntersect.x) { + i.x = this.x; + i.width = toIntersect.x - this.x + toIntersect.width; + + if (i.width > this.width) + i.width = this.width; + } else { + i.x = toIntersect.x; + i.width = this.x - toIntersect.x + this.width; + + if (i.width > toIntersect.width) + i.width = toIntersect.width; + } + + if (this.y > toIntersect.y) { + i.y = this.y; + i.height = toIntersect.y - this.y + toIntersect.height; + + if (i.height > this.height) + i.height = this.height; + } else { + i.y = toIntersect.y; + i.height = this.y - toIntersect.y + this.height; + + if (i.height > toIntersect.height) + i.height = toIntersect.height; + } + + + if (this.z > toIntersect.z) { + i.z = this.z; + i.depth = toIntersect.z - this.z + toIntersect.depth; + + if (i.depth > this.depth) + i.depth = this.depth; + } else { + i.z = toIntersect.z; + i.depth = this.z - toIntersect.z + this.depth; + + if (i.depth > toIntersect.depth) + i.depth = toIntersect.depth; + } + + return i; + } + + return new Box(); + } + + /** + * Determines whether the object specified in the toIntersect + * parameter intersects with this Box object. This method checks the + * x, y, z, width, + * height, and depth properties of the specified + * Box object to see if it intersects with this Box object. + * + * @param toIntersect The Box object to compare against this Box object. + * @return A value of true if the specified object intersects + * with this Box object; otherwise false. + */ + public intersects(toIntersect:Box):boolean + { + return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height && this.z + this.depth > toIntersect.z && this.z < toIntersect.z + toIntersect.depth); + } + + /** + * Determines whether or not this Box object is empty. + * + * @return A value of true if the Box object's width, height or + * depth is less than or equal to 0; otherwise false. + */ + public isEmpty():boolean + { + return (this.x == 0 && this.y == 0 && this.z == 0 && this.width == 0 && this.height == 0 && this.depth == 0); + } + + /** + * Adjusts the location of the Box object, as determined by its + * top-left-front corner, by the specified amounts. + * + * @param dx Moves the x value of the Box object by this amount. + * @param dy Moves the y value of the Box object by this amount. + * @param dz Moves the z value of the Box object by this amount. + */ + public offset(dx:number, dy:number, dz:number) + { + this.x += dx; + this.y += dy; + this.z += dz; + } + + /** + * Adjusts the location of the Box object using a Vector3D object as a + * parameter. This method is similar to the Box.offset() + * method, except that it takes a Vector3D object as a parameter. + * + * @param position A Vector3D object to use to offset this Box object. + */ + public offsetPosition(position:Vector3D) + { + this.x += position.x; + this.y += position.y; + this.z += position.z; + } + + /** + * Sets all of the Box object's properties to 0. A Box object is empty if its + * width, height or depth is less than or equal to 0. + * + *

This method sets the values of the x, y, + * z, width, height, and + * depth properties to 0.

+ * + */ + public setEmpty() + { + this.x = 0; + this.y = 0; + this.z = 0; + this.width = 0; + this.height = 0; + this.depth = 0; + } + + /** + * Sets the members of Box to the specified values + * + * @param xa The x coordinate of the top-left-front corner of the + * box. + * @param ya The y coordinate of the top-left-front corner of the + * box. + * @param yz The z coordinate of the top-left-front corner of the + * box. + * @param widtha The width of the box, in pixels. + * @param heighta The height of the box, in pixels. + * @param deptha The depth of the box, in pixels. + */ + public setTo(xa:number, ya:number, za:number, widtha:number, heighta:number, deptha:number) + { + this.x = xa; + this.y = ya; + this.z = za; + this.width = widtha; + this.height = heighta; + this.depth = deptha; + } + + /** + * Builds and returns a string that lists the horizontal, vertical and + * longitudinal positions and the width, height and depth of the Box object. + * + * @return A string listing the value of each of the following properties of + * the Box object: x, y, z, + * width, height, and depth. + */ + public toString():string + { + return "[Box] (x=" + this.x + ", y=" + this.y + ", z=" + this.z + ", width=" + this.width + ", height=" + this.height + ", depth=" + this.depth + ")"; + } + + /** + * Adds two boxes together to create a new Box object, by filling + * in the horizontal, vertical and longitudinal space between the two boxes. + * + *

Note: The union() method ignores boxes with + * 0 as the height, width or depth value, such as: var + * box2:Box = new Box(300,300,300,50,50,0);

+ * + * @param toUnion A Box object to add to this Box object. + * @return A new Box object that is the union of the two boxes. + */ + public union(toUnion:Box):Box + { + var u:Box = new Box(); + + if (this.x < toUnion.x) { + u.x = this.x; + u.width = toUnion.x - this.x + toUnion.width; + + if (u.width < this.width) + u.width = this.width; + } else { + u.x = toUnion.x; + u.width = this.x - toUnion.x + this.width; + + if (u.width < toUnion.width) + u.width = toUnion.width; + } + + if (this.y < toUnion.y) { + u.y = this.y; + u.height = toUnion.y - this.y + toUnion.height; + + if (u.height < this.height) + u.height = this.height; + } else { + u.y = toUnion.y; + u.height = this.y - toUnion.y + this.height; + + if (u.height < toUnion.height) + u.height = toUnion.height; + } + + if (this.z < toUnion.z) { + u.z = this.z; + u.depth = toUnion.z - this.z + toUnion.depth; + + if (u.depth < this.depth) + u.depth = this.depth; + } else { + u.z = toUnion.z; + u.depth = this.z - toUnion.z + this.depth; + + if (u.depth < toUnion.depth) + u.depth = toUnion.depth; + } + + return u; + } +} + +export = Box; \ No newline at end of file diff --git a/lib/core/geom/ColorTransform.js b/lib/core/geom/ColorTransform.js new file mode 100755 index 00000000..8c330f86 --- /dev/null +++ b/lib/core/geom/ColorTransform.js @@ -0,0 +1,141 @@ +var ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +/** +* The ColorTransform class lets you adjust the color values in a display +* object. The color adjustment or color transformation can be applied +* to all four channels: red, green, blue, and alpha transparency. +* +*

When a ColorTransform object is applied to a display object, a new value +* for each color channel is calculated like this:

+* +*
    +*
  • New red value = (old red value * redMultiplier) + +* redOffset
  • +*
  • New green value = (old green value * greenMultiplier) + +* greenOffset
  • +*
  • New blue value = (old blue value * blueMultiplier) + +* blueOffset
  • +*
  • New alpha value = (old alpha value * alphaMultiplier) + +* alphaOffset
  • +*
+* +*

If any of the color channel values is greater than 255 after the +* calculation, it is set to 255. If it is less than 0, it is set to 0.

+* +*

You can use ColorTransform objects in the following ways:

+* +*
    +*
  • In the colorTransform parameter of the +* colorTransform() method of the BitmapData class
  • +*
  • As the colorTransform property of a Transform object +* (which can be used as the transform property of a display +* object)
  • +*
+* +*

You must use the new ColorTransform() constructor to create +* a ColorTransform object before you can call the methods of the +* ColorTransform object.

+* +*

Color transformations do not apply to the background color of a movie +* clip(such as a loaded SWF object). They apply only to graphics and symbols +* that are attached to the movie clip.

+*/ +var ColorTransform = (function () { + /** + * Creates a ColorTransform object for a display object with the specified + * color channel values and alpha values. + * + * @param redMultiplier The value for the red multiplier, in the range from + * 0 to 1. + * @param greenMultiplier The value for the green multiplier, in the range + * from 0 to 1. + * @param blueMultiplier The value for the blue multiplier, in the range + * from 0 to 1. + * @param alphaMultiplier The value for the alpha transparency multiplier, in + * the range from 0 to 1. + * @param redOffset The offset value for the red color channel, in the + * range from -255 to 255. + * @param greenOffset The offset value for the green color channel, in + * the range from -255 to 255. + * @param blueOffset The offset for the blue color channel value, in the + * range from -255 to 255. + * @param alphaOffset The offset for alpha transparency channel value, in + * the range from -255 to 255. + */ + function ColorTransform(redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier, redOffset, greenOffset, blueOffset, alphaOffset) { + if (typeof redMultiplier === "undefined") { redMultiplier = 1; } + if (typeof greenMultiplier === "undefined") { greenMultiplier = 1; } + if (typeof blueMultiplier === "undefined") { blueMultiplier = 1; } + if (typeof alphaMultiplier === "undefined") { alphaMultiplier = 1; } + if (typeof redOffset === "undefined") { redOffset = 0; } + if (typeof greenOffset === "undefined") { greenOffset = 0; } + if (typeof blueOffset === "undefined") { blueOffset = 0; } + if (typeof alphaOffset === "undefined") { alphaOffset = 0; } + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaMultiplier = alphaMultiplier; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + this.alphaOffset = alphaOffset; + } + Object.defineProperty(ColorTransform.prototype, "color", { + /** + * The RGB color value for a ColorTransform object. + * + *

When you set this property, it changes the three color offset values + * (redOffset, greenOffset, and + * blueOffset) accordingly, and it sets the three color + * multiplier values(redMultiplier, + * greenMultiplier, and blueMultiplier) to 0. The + * alpha transparency multiplier and offset values do not change.

+ * + *

When you pass a value for this property, use the format + * 0xRRGGBB. RR, GG, and BB each consist of two + * hexadecimal digits that specify the offset of each color component. The 0x + * tells the ActionScript compiler that the number is a hexadecimal + * value.

+ */ + get: function () { + return ((this.redOffset << 16) | (this.greenOffset << 8) | this.blueOffset); + }, + set: function (value) { + var argb = ColorUtils.float32ColorToARGB(value); + + this.redOffset = argb[1]; //(value >> 16) & 0xFF; + this.greenOffset = argb[2]; //(value >> 8) & 0xFF; + this.blueOffset = argb[3]; //value & 0xFF; + + this.redMultiplier = 0; + this.greenMultiplier = 0; + this.blueMultiplier = 0; + }, + enumerable: true, + configurable: true + }); + + + /** + * Concatenates the ColorTranform object specified by the second + * parameter with the current ColorTransform object and sets the current + * object as the result, which is an additive combination of the two color + * transformations. When you apply the concatenated ColorTransform object, + * the effect is the same as applying the second color + * transformation after the original color transformation. + * + * @param second The ColorTransform object to be combined with the current + * ColorTransform object. + */ + ColorTransform.prototype.concat = function (second) { + this.redMultiplier += second.redMultiplier; + this.greenMultiplier += second.greenMultiplier; + this.blueMultiplier += second.blueMultiplier; + this.alphaMultiplier += second.alphaMultiplier; + }; + return ColorTransform; +})(); + +module.exports = ColorTransform; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9Db2xvclRyYW5zZm9ybS50cyJdLCJuYW1lcyI6WyJDb2xvclRyYW5zZm9ybSIsIkNvbG9yVHJhbnNmb3JtLmNvbnN0cnVjdG9yIiwiQ29sb3JUcmFuc2Zvcm0uY29uY2F0Il0sIm1hcHBpbmdzIjoiQUFBQSw0REFBbUU7O0FBRW5FOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF1Q0c7QUFDSDtJQTRHQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BREdBO0lBQ0hBLHdCQUFZQSxhQUF3QkEsRUFBRUEsZUFBMEJBLEVBQUVBLGNBQXlCQSxFQUFFQSxlQUEwQkEsRUFBRUEsU0FBb0JBLEVBQUVBLFdBQXNCQSxFQUFFQSxVQUFxQkEsRUFBRUEsV0FBc0JBO1FBQXhNQyw0Q0FBQUEsYUFBYUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsOENBQUFBLGVBQWVBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLDZDQUFBQSxjQUFjQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSw4Q0FBQUEsZUFBZUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLDBDQUFBQSxXQUFXQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSx5Q0FBQUEsVUFBVUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsMENBQUFBLFdBQVdBLEdBQVVBLENBQUNBO0FBQUFBLFFBRW5OQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxhQUFhQTtRQUNsQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsR0FBR0EsZUFBZUE7UUFDdENBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLGNBQWNBO1FBQ3BDQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxlQUFlQTtRQUN0Q0EsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsU0FBU0E7UUFDMUJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLFdBQVdBO1FBQzlCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxVQUFVQTtRQUM1QkEsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsV0FBV0E7SUFDL0JBLENBQUNBO0lBakRERDtRQUFBQTs7Ozs7Ozs7Ozs7Ozs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU1BLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUVBLElBQUlBLENBQUNBLFdBQVdBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBO1FBQzVFQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFpQkEsS0FBWUE7WUFFNUJBLElBQUlBLElBQUlBLEdBQVlBLFVBQVVBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7O1lBRXhEQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFHQSx1QkFBdUJBO1lBQ2xEQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFHQSxzQkFBc0JBO1lBQ25EQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFHQSxlQUFlQTs7WUFFM0NBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLENBQUNBO1lBQ3RCQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxDQUFDQTtZQUN4QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsQ0FBQ0E7UUFDeEJBLENBQUNBOzs7O0FBYkFBOztJQTJEREE7Ozs7Ozs7Ozs7TUFER0E7c0NBQ0hBLFVBQWNBLE1BQXFCQTtRQUVsQ0UsSUFBSUEsQ0FBQ0EsYUFBYUEsSUFBSUEsTUFBTUEsQ0FBQ0EsYUFBYUE7UUFDMUNBLElBQUlBLENBQUNBLGVBQWVBLElBQUlBLE1BQU1BLENBQUNBLGVBQWVBO1FBQzlDQSxJQUFJQSxDQUFDQSxjQUFjQSxJQUFJQSxNQUFNQSxDQUFDQSxjQUFjQTtRQUM1Q0EsSUFBSUEsQ0FBQ0EsZUFBZUEsSUFBSUEsTUFBTUEsQ0FBQ0EsZUFBZUE7SUFDL0NBLENBQUNBO0lBQ0ZGLHNCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELCtCQUF3QixDQUFBIiwiZmlsZSI6ImNvcmUvZ2VvbS9Db2xvclRyYW5zZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb2xvclV0aWxzXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvQ29sb3JVdGlsc1wiKTtcblxuLyoqXG4gKiBUaGUgQ29sb3JUcmFuc2Zvcm0gY2xhc3MgbGV0cyB5b3UgYWRqdXN0IHRoZSBjb2xvciB2YWx1ZXMgaW4gYSBkaXNwbGF5XG4gKiBvYmplY3QuIFRoZSBjb2xvciBhZGp1c3RtZW50IG9yIDxpPmNvbG9yIHRyYW5zZm9ybWF0aW9uPC9pPiBjYW4gYmUgYXBwbGllZFxuICogdG8gYWxsIGZvdXIgY2hhbm5lbHM6IHJlZCwgZ3JlZW4sIGJsdWUsIGFuZCBhbHBoYSB0cmFuc3BhcmVuY3kuXG4gKlxuICogPHA+V2hlbiBhIENvbG9yVHJhbnNmb3JtIG9iamVjdCBpcyBhcHBsaWVkIHRvIGEgZGlzcGxheSBvYmplY3QsIGEgbmV3IHZhbHVlXG4gKiBmb3IgZWFjaCBjb2xvciBjaGFubmVsIGlzIGNhbGN1bGF0ZWQgbGlrZSB0aGlzOjwvcD5cbiAqXG4gKiA8dWw+XG4gKiAgIDxsaT5OZXcgcmVkIHZhbHVlID0gKG9sZCByZWQgdmFsdWUgKiA8Y29kZT5yZWRNdWx0aXBsaWVyPC9jb2RlPikgK1xuICogPGNvZGU+cmVkT2Zmc2V0PC9jb2RlPjwvbGk+XG4gKiAgIDxsaT5OZXcgZ3JlZW4gdmFsdWUgPSAob2xkIGdyZWVuIHZhbHVlICogPGNvZGU+Z3JlZW5NdWx0aXBsaWVyPC9jb2RlPikgK1xuICogPGNvZGU+Z3JlZW5PZmZzZXQ8L2NvZGU+PC9saT5cbiAqICAgPGxpPk5ldyBibHVlIHZhbHVlID0gKG9sZCBibHVlIHZhbHVlICogPGNvZGU+Ymx1ZU11bHRpcGxpZXI8L2NvZGU+KSArXG4gKiA8Y29kZT5ibHVlT2Zmc2V0PC9jb2RlPjwvbGk+XG4gKiAgIDxsaT5OZXcgYWxwaGEgdmFsdWUgPSAob2xkIGFscGhhIHZhbHVlICogPGNvZGU+YWxwaGFNdWx0aXBsaWVyPC9jb2RlPikgK1xuICogPGNvZGU+YWxwaGFPZmZzZXQ8L2NvZGU+PC9saT5cbiAqIDwvdWw+XG4gKlxuICogPHA+SWYgYW55IG9mIHRoZSBjb2xvciBjaGFubmVsIHZhbHVlcyBpcyBncmVhdGVyIHRoYW4gMjU1IGFmdGVyIHRoZVxuICogY2FsY3VsYXRpb24sIGl0IGlzIHNldCB0byAyNTUuIElmIGl0IGlzIGxlc3MgdGhhbiAwLCBpdCBpcyBzZXQgdG8gMC48L3A+XG4gKlxuICogPHA+WW91IGNhbiB1c2UgQ29sb3JUcmFuc2Zvcm0gb2JqZWN0cyBpbiB0aGUgZm9sbG93aW5nIHdheXM6PC9wPlxuICpcbiAqIDx1bD5cbiAqICAgPGxpPkluIHRoZSA8Y29kZT5jb2xvclRyYW5zZm9ybTwvY29kZT4gcGFyYW1ldGVyIG9mIHRoZVxuICogPGNvZGU+Y29sb3JUcmFuc2Zvcm0oKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBCaXRtYXBEYXRhIGNsYXNzPC9saT5cbiAqICAgPGxpPkFzIHRoZSA8Y29kZT5jb2xvclRyYW5zZm9ybTwvY29kZT4gcHJvcGVydHkgb2YgYSBUcmFuc2Zvcm0gb2JqZWN0XG4gKiAod2hpY2ggY2FuIGJlIHVzZWQgYXMgdGhlIDxjb2RlPnRyYW5zZm9ybTwvY29kZT4gcHJvcGVydHkgb2YgYSBkaXNwbGF5XG4gKiBvYmplY3QpPC9saT5cbiAqIDwvdWw+XG4gKlxuICogPHA+WW91IG11c3QgdXNlIHRoZSA8Y29kZT5uZXcgQ29sb3JUcmFuc2Zvcm0oKTwvY29kZT4gY29uc3RydWN0b3IgdG8gY3JlYXRlXG4gKiBhIENvbG9yVHJhbnNmb3JtIG9iamVjdCBiZWZvcmUgeW91IGNhbiBjYWxsIHRoZSBtZXRob2RzIG9mIHRoZVxuICogQ29sb3JUcmFuc2Zvcm0gb2JqZWN0LjwvcD5cbiAqXG4gKiA8cD5Db2xvciB0cmFuc2Zvcm1hdGlvbnMgZG8gbm90IGFwcGx5IHRvIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIGEgbW92aWVcbiAqIGNsaXAoc3VjaCBhcyBhIGxvYWRlZCBTV0Ygb2JqZWN0KS4gVGhleSBhcHBseSBvbmx5IHRvIGdyYXBoaWNzIGFuZCBzeW1ib2xzXG4gKiB0aGF0IGFyZSBhdHRhY2hlZCB0byB0aGUgbW92aWUgY2xpcC48L3A+XG4gKi9cbmNsYXNzIENvbG9yVHJhbnNmb3JtXG57XG5cdC8qKlxuXHQgKiBBIGRlY2ltYWwgdmFsdWUgdGhhdCBpcyBtdWx0aXBsaWVkIHdpdGggdGhlIGFscGhhIHRyYW5zcGFyZW5jeSBjaGFubmVsXG5cdCAqIHZhbHVlLlxuXHQgKlxuXHQgKiA8cD5JZiB5b3Ugc2V0IHRoZSBhbHBoYSB0cmFuc3BhcmVuY3kgdmFsdWUgb2YgYSBkaXNwbGF5IG9iamVjdCBkaXJlY3RseSBieVxuXHQgKiB1c2luZyB0aGUgPGNvZGU+YWxwaGE8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBEaXNwbGF5T2JqZWN0IGluc3RhbmNlLCBpdFxuXHQgKiBhZmZlY3RzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+YWxwaGFNdWx0aXBsaWVyPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGF0XG5cdCAqIGRpc3BsYXkgb2JqZWN0J3MgPGNvZGU+dHJhbnNmb3JtLmNvbG9yVHJhbnNmb3JtPC9jb2RlPiBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgYWxwaGFNdWx0aXBsaWVyOm51bWJlcjtcblxuXHQvKipcblx0ICogQSBudW1iZXIgZnJvbSAtMjU1IHRvIDI1NSB0aGF0IGlzIGFkZGVkIHRvIHRoZSBhbHBoYSB0cmFuc3BhcmVuY3kgY2hhbm5lbFxuXHQgKiB2YWx1ZSBhZnRlciBpdCBoYXMgYmVlbiBtdWx0aXBsaWVkIGJ5IHRoZSA8Y29kZT5hbHBoYU11bHRpcGxpZXI8L2NvZGU+XG5cdCAqIHZhbHVlLlxuXHQgKi9cblx0cHVibGljIGFscGhhT2Zmc2V0Om51bWJlcjtcblxuXHQvKipcblx0ICogQSBkZWNpbWFsIHZhbHVlIHRoYXQgaXMgbXVsdGlwbGllZCB3aXRoIHRoZSBibHVlIGNoYW5uZWwgdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgYmx1ZU11bHRpcGxpZXI6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBBIG51bWJlciBmcm9tIC0yNTUgdG8gMjU1IHRoYXQgaXMgYWRkZWQgdG8gdGhlIGJsdWUgY2hhbm5lbCB2YWx1ZSBhZnRlciBpdFxuXHQgKiBoYXMgYmVlbiBtdWx0aXBsaWVkIGJ5IHRoZSA8Y29kZT5ibHVlTXVsdGlwbGllcjwvY29kZT4gdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgYmx1ZU9mZnNldDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIEEgZGVjaW1hbCB2YWx1ZSB0aGF0IGlzIG11bHRpcGxpZWQgd2l0aCB0aGUgZ3JlZW4gY2hhbm5lbCB2YWx1ZS5cblx0ICovXG5cdHB1YmxpYyBncmVlbk11bHRpcGxpZXI6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBBIG51bWJlciBmcm9tIC0yNTUgdG8gMjU1IHRoYXQgaXMgYWRkZWQgdG8gdGhlIGdyZWVuIGNoYW5uZWwgdmFsdWUgYWZ0ZXJcblx0ICogaXQgaGFzIGJlZW4gbXVsdGlwbGllZCBieSB0aGUgPGNvZGU+Z3JlZW5NdWx0aXBsaWVyPC9jb2RlPiB2YWx1ZS5cblx0ICovXG5cdHB1YmxpYyBncmVlbk9mZnNldDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIEEgZGVjaW1hbCB2YWx1ZSB0aGF0IGlzIG11bHRpcGxpZWQgd2l0aCB0aGUgcmVkIGNoYW5uZWwgdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgcmVkTXVsdGlwbGllcjpudW1iZXI7XG5cblx0LyoqXG5cdCAqIEEgbnVtYmVyIGZyb20gLTI1NSB0byAyNTUgdGhhdCBpcyBhZGRlZCB0byB0aGUgcmVkIGNoYW5uZWwgdmFsdWUgYWZ0ZXIgaXRcblx0ICogaGFzIGJlZW4gbXVsdGlwbGllZCBieSB0aGUgPGNvZGU+cmVkTXVsdGlwbGllcjwvY29kZT4gdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgcmVkT2Zmc2V0Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIFJHQiBjb2xvciB2YWx1ZSBmb3IgYSBDb2xvclRyYW5zZm9ybSBvYmplY3QuXG5cdCAqXG5cdCAqIDxwPldoZW4geW91IHNldCB0aGlzIHByb3BlcnR5LCBpdCBjaGFuZ2VzIHRoZSB0aHJlZSBjb2xvciBvZmZzZXQgdmFsdWVzXG5cdCAqICg8Y29kZT5yZWRPZmZzZXQ8L2NvZGU+LCA8Y29kZT5ncmVlbk9mZnNldDwvY29kZT4sIGFuZFxuXHQgKiA8Y29kZT5ibHVlT2Zmc2V0PC9jb2RlPikgYWNjb3JkaW5nbHksIGFuZCBpdCBzZXRzIHRoZSB0aHJlZSBjb2xvclxuXHQgKiBtdWx0aXBsaWVyIHZhbHVlcyg8Y29kZT5yZWRNdWx0aXBsaWVyPC9jb2RlPixcblx0ICogPGNvZGU+Z3JlZW5NdWx0aXBsaWVyPC9jb2RlPiwgYW5kIDxjb2RlPmJsdWVNdWx0aXBsaWVyPC9jb2RlPikgdG8gMC4gVGhlXG5cdCAqIGFscGhhIHRyYW5zcGFyZW5jeSBtdWx0aXBsaWVyIGFuZCBvZmZzZXQgdmFsdWVzIGRvIG5vdCBjaGFuZ2UuPC9wPlxuXHQgKlxuXHQgKiA8cD5XaGVuIHlvdSBwYXNzIGEgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHksIHVzZSB0aGUgZm9ybWF0XG5cdCAqIDB4PGk+UlJHR0JCPC9pPi4gPGk+UlI8L2k+LCA8aT5HRzwvaT4sIGFuZCA8aT5CQjwvaT4gZWFjaCBjb25zaXN0IG9mIHR3b1xuXHQgKiBoZXhhZGVjaW1hbCBkaWdpdHMgdGhhdCBzcGVjaWZ5IHRoZSBvZmZzZXQgb2YgZWFjaCBjb2xvciBjb21wb25lbnQuIFRoZSAweFxuXHQgKiB0ZWxscyB0aGUgQWN0aW9uU2NyaXB0IGNvbXBpbGVyIHRoYXQgdGhlIG51bWJlciBpcyBhIGhleGFkZWNpbWFsXG5cdCAqIHZhbHVlLjwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgY29sb3IoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybigodGhpcy5yZWRPZmZzZXQgPDwgMTYpIHwgKCB0aGlzLmdyZWVuT2Zmc2V0IDw8IDgpIHwgdGhpcy5ibHVlT2Zmc2V0KTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgY29sb3IodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIGFyZ2I6bnVtYmVyW10gPSBDb2xvclV0aWxzLmZsb2F0MzJDb2xvclRvQVJHQih2YWx1ZSk7XG5cblx0XHR0aGlzLnJlZE9mZnNldCA9IGFyZ2JbMV07ICAvLyh2YWx1ZSA+PiAxNikgJiAweEZGO1xuXHRcdHRoaXMuZ3JlZW5PZmZzZXQgPSBhcmdiWzJdOyAgLy8odmFsdWUgPj4gOCkgJiAweEZGO1xuXHRcdHRoaXMuYmx1ZU9mZnNldCA9IGFyZ2JbM107ICAvL3ZhbHVlICYgMHhGRjtcblxuXHRcdHRoaXMucmVkTXVsdGlwbGllciA9IDA7XG5cdFx0dGhpcy5ncmVlbk11bHRpcGxpZXIgPSAwO1xuXHRcdHRoaXMuYmx1ZU11bHRpcGxpZXIgPSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBDb2xvclRyYW5zZm9ybSBvYmplY3QgZm9yIGEgZGlzcGxheSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkXG5cdCAqIGNvbG9yIGNoYW5uZWwgdmFsdWVzIGFuZCBhbHBoYSB2YWx1ZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSByZWRNdWx0aXBsaWVyICAgVGhlIHZhbHVlIGZvciB0aGUgcmVkIG11bHRpcGxpZXIsIGluIHRoZSByYW5nZSBmcm9tXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgMCB0byAxLlxuXHQgKiBAcGFyYW0gZ3JlZW5NdWx0aXBsaWVyIFRoZSB2YWx1ZSBmb3IgdGhlIGdyZWVuIG11bHRpcGxpZXIsIGluIHRoZSByYW5nZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gMCB0byAxLlxuXHQgKiBAcGFyYW0gYmx1ZU11bHRpcGxpZXIgIFRoZSB2YWx1ZSBmb3IgdGhlIGJsdWUgbXVsdGlwbGllciwgaW4gdGhlIHJhbmdlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAwIHRvIDEuXG5cdCAqIEBwYXJhbSBhbHBoYU11bHRpcGxpZXIgVGhlIHZhbHVlIGZvciB0aGUgYWxwaGEgdHJhbnNwYXJlbmN5IG11bHRpcGxpZXIsIGluXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmdlIGZyb20gMCB0byAxLlxuXHQgKiBAcGFyYW0gcmVkT2Zmc2V0ICAgICAgIFRoZSBvZmZzZXQgdmFsdWUgZm9yIHRoZSByZWQgY29sb3IgY2hhbm5lbCwgaW4gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UgZnJvbSAtMjU1IHRvIDI1NS5cblx0ICogQHBhcmFtIGdyZWVuT2Zmc2V0ICAgICBUaGUgb2Zmc2V0IHZhbHVlIGZvciB0aGUgZ3JlZW4gY29sb3IgY2hhbm5lbCwgaW5cblx0ICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmFuZ2UgZnJvbSAtMjU1IHRvIDI1NS5cblx0ICogQHBhcmFtIGJsdWVPZmZzZXQgICAgICBUaGUgb2Zmc2V0IGZvciB0aGUgYmx1ZSBjb2xvciBjaGFubmVsIHZhbHVlLCBpbiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgICAgICByYW5nZSBmcm9tIC0yNTUgdG8gMjU1LlxuXHQgKiBAcGFyYW0gYWxwaGFPZmZzZXQgICAgIFRoZSBvZmZzZXQgZm9yIGFscGhhIHRyYW5zcGFyZW5jeSBjaGFubmVsIHZhbHVlLCBpblxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByYW5nZSBmcm9tIC0yNTUgdG8gMjU1LlxuXHQgKi9cblx0Y29uc3RydWN0b3IocmVkTXVsdGlwbGllcjpudW1iZXIgPSAxLCBncmVlbk11bHRpcGxpZXI6bnVtYmVyID0gMSwgYmx1ZU11bHRpcGxpZXI6bnVtYmVyID0gMSwgYWxwaGFNdWx0aXBsaWVyOm51bWJlciA9IDEsIHJlZE9mZnNldDpudW1iZXIgPSAwLCBncmVlbk9mZnNldDpudW1iZXIgPSAwLCBibHVlT2Zmc2V0Om51bWJlciA9IDAsIGFscGhhT2Zmc2V0Om51bWJlciA9IDApXG5cdHtcblx0XHR0aGlzLnJlZE11bHRpcGxpZXIgPSByZWRNdWx0aXBsaWVyO1xuXHRcdHRoaXMuZ3JlZW5NdWx0aXBsaWVyID0gZ3JlZW5NdWx0aXBsaWVyO1xuXHRcdHRoaXMuYmx1ZU11bHRpcGxpZXIgPSBibHVlTXVsdGlwbGllcjtcblx0XHR0aGlzLmFscGhhTXVsdGlwbGllciA9IGFscGhhTXVsdGlwbGllcjtcblx0XHR0aGlzLnJlZE9mZnNldCA9IHJlZE9mZnNldDtcblx0XHR0aGlzLmdyZWVuT2Zmc2V0ID0gZ3JlZW5PZmZzZXQ7XG5cdFx0dGhpcy5ibHVlT2Zmc2V0ID0gYmx1ZU9mZnNldDtcblx0XHR0aGlzLmFscGhhT2Zmc2V0ID0gYWxwaGFPZmZzZXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ29uY2F0ZW5hdGVzIHRoZSBDb2xvclRyYW5mb3JtIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnNlY29uZDwvY29kZT5cblx0ICogcGFyYW1ldGVyIHdpdGggdGhlIGN1cnJlbnQgQ29sb3JUcmFuc2Zvcm0gb2JqZWN0IGFuZCBzZXRzIHRoZSBjdXJyZW50XG5cdCAqIG9iamVjdCBhcyB0aGUgcmVzdWx0LCB3aGljaCBpcyBhbiBhZGRpdGl2ZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIGNvbG9yXG5cdCAqIHRyYW5zZm9ybWF0aW9ucy4gV2hlbiB5b3UgYXBwbHkgdGhlIGNvbmNhdGVuYXRlZCBDb2xvclRyYW5zZm9ybSBvYmplY3QsXG5cdCAqIHRoZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMgYXBwbHlpbmcgdGhlIDxjb2RlPnNlY29uZDwvY29kZT4gY29sb3Jcblx0ICogdHJhbnNmb3JtYXRpb24gYWZ0ZXIgdGhlIDxpPm9yaWdpbmFsPC9pPiBjb2xvciB0cmFuc2Zvcm1hdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHNlY29uZCBUaGUgQ29sb3JUcmFuc2Zvcm0gb2JqZWN0IHRvIGJlIGNvbWJpbmVkIHdpdGggdGhlIGN1cnJlbnRcblx0ICogICAgICAgICAgICAgICBDb2xvclRyYW5zZm9ybSBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY29uY2F0KHNlY29uZDpDb2xvclRyYW5zZm9ybSk6dm9pZFxuXHR7XG5cdFx0dGhpcy5yZWRNdWx0aXBsaWVyICs9IHNlY29uZC5yZWRNdWx0aXBsaWVyO1xuXHRcdHRoaXMuZ3JlZW5NdWx0aXBsaWVyICs9IHNlY29uZC5ncmVlbk11bHRpcGxpZXI7XG5cdFx0dGhpcy5ibHVlTXVsdGlwbGllciArPSBzZWNvbmQuYmx1ZU11bHRpcGxpZXI7XG5cdFx0dGhpcy5hbHBoYU11bHRpcGxpZXIgKz0gc2Vjb25kLmFscGhhTXVsdGlwbGllcjtcblx0fVxufVxuXG5leHBvcnQgPSBDb2xvclRyYW5zZm9ybTsiXX0= \ No newline at end of file diff --git a/lib/core/geom/ColorTransform.ts b/lib/core/geom/ColorTransform.ts new file mode 100644 index 00000000..c160dc7c --- /dev/null +++ b/lib/core/geom/ColorTransform.ts @@ -0,0 +1,183 @@ +import ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +/** + * The ColorTransform class lets you adjust the color values in a display + * object. The color adjustment or color transformation can be applied + * to all four channels: red, green, blue, and alpha transparency. + * + *

When a ColorTransform object is applied to a display object, a new value + * for each color channel is calculated like this:

+ * + *
    + *
  • New red value = (old red value * redMultiplier) + + * redOffset
  • + *
  • New green value = (old green value * greenMultiplier) + + * greenOffset
  • + *
  • New blue value = (old blue value * blueMultiplier) + + * blueOffset
  • + *
  • New alpha value = (old alpha value * alphaMultiplier) + + * alphaOffset
  • + *
+ * + *

If any of the color channel values is greater than 255 after the + * calculation, it is set to 255. If it is less than 0, it is set to 0.

+ * + *

You can use ColorTransform objects in the following ways:

+ * + *
    + *
  • In the colorTransform parameter of the + * colorTransform() method of the BitmapData class
  • + *
  • As the colorTransform property of a Transform object + * (which can be used as the transform property of a display + * object)
  • + *
+ * + *

You must use the new ColorTransform() constructor to create + * a ColorTransform object before you can call the methods of the + * ColorTransform object.

+ * + *

Color transformations do not apply to the background color of a movie + * clip(such as a loaded SWF object). They apply only to graphics and symbols + * that are attached to the movie clip.

+ */ +class ColorTransform +{ + /** + * A decimal value that is multiplied with the alpha transparency channel + * value. + * + *

If you set the alpha transparency value of a display object directly by + * using the alpha property of the DisplayObject instance, it + * affects the value of the alphaMultiplier property of that + * display object's transform.colorTransform property.

+ */ + public alphaMultiplier:number; + + /** + * A number from -255 to 255 that is added to the alpha transparency channel + * value after it has been multiplied by the alphaMultiplier + * value. + */ + public alphaOffset:number; + + /** + * A decimal value that is multiplied with the blue channel value. + */ + public blueMultiplier:number; + + /** + * A number from -255 to 255 that is added to the blue channel value after it + * has been multiplied by the blueMultiplier value. + */ + public blueOffset:number; + + /** + * A decimal value that is multiplied with the green channel value. + */ + public greenMultiplier:number; + + /** + * A number from -255 to 255 that is added to the green channel value after + * it has been multiplied by the greenMultiplier value. + */ + public greenOffset:number; + + /** + * A decimal value that is multiplied with the red channel value. + */ + public redMultiplier:number; + + /** + * A number from -255 to 255 that is added to the red channel value after it + * has been multiplied by the redMultiplier value. + */ + public redOffset:number; + + /** + * The RGB color value for a ColorTransform object. + * + *

When you set this property, it changes the three color offset values + * (redOffset, greenOffset, and + * blueOffset) accordingly, and it sets the three color + * multiplier values(redMultiplier, + * greenMultiplier, and blueMultiplier) to 0. The + * alpha transparency multiplier and offset values do not change.

+ * + *

When you pass a value for this property, use the format + * 0xRRGGBB. RR, GG, and BB each consist of two + * hexadecimal digits that specify the offset of each color component. The 0x + * tells the ActionScript compiler that the number is a hexadecimal + * value.

+ */ + public get color():number + { + return((this.redOffset << 16) | ( this.greenOffset << 8) | this.blueOffset); + } + + public set color(value:number) + { + var argb:number[] = ColorUtils.float32ColorToARGB(value); + + this.redOffset = argb[1]; //(value >> 16) & 0xFF; + this.greenOffset = argb[2]; //(value >> 8) & 0xFF; + this.blueOffset = argb[3]; //value & 0xFF; + + this.redMultiplier = 0; + this.greenMultiplier = 0; + this.blueMultiplier = 0; + } + + /** + * Creates a ColorTransform object for a display object with the specified + * color channel values and alpha values. + * + * @param redMultiplier The value for the red multiplier, in the range from + * 0 to 1. + * @param greenMultiplier The value for the green multiplier, in the range + * from 0 to 1. + * @param blueMultiplier The value for the blue multiplier, in the range + * from 0 to 1. + * @param alphaMultiplier The value for the alpha transparency multiplier, in + * the range from 0 to 1. + * @param redOffset The offset value for the red color channel, in the + * range from -255 to 255. + * @param greenOffset The offset value for the green color channel, in + * the range from -255 to 255. + * @param blueOffset The offset for the blue color channel value, in the + * range from -255 to 255. + * @param alphaOffset The offset for alpha transparency channel value, in + * the range from -255 to 255. + */ + constructor(redMultiplier:number = 1, greenMultiplier:number = 1, blueMultiplier:number = 1, alphaMultiplier:number = 1, redOffset:number = 0, greenOffset:number = 0, blueOffset:number = 0, alphaOffset:number = 0) + { + this.redMultiplier = redMultiplier; + this.greenMultiplier = greenMultiplier; + this.blueMultiplier = blueMultiplier; + this.alphaMultiplier = alphaMultiplier; + this.redOffset = redOffset; + this.greenOffset = greenOffset; + this.blueOffset = blueOffset; + this.alphaOffset = alphaOffset; + } + + /** + * Concatenates the ColorTranform object specified by the second + * parameter with the current ColorTransform object and sets the current + * object as the result, which is an additive combination of the two color + * transformations. When you apply the concatenated ColorTransform object, + * the effect is the same as applying the second color + * transformation after the original color transformation. + * + * @param second The ColorTransform object to be combined with the current + * ColorTransform object. + */ + public concat(second:ColorTransform):void + { + this.redMultiplier += second.redMultiplier; + this.greenMultiplier += second.greenMultiplier; + this.blueMultiplier += second.blueMultiplier; + this.alphaMultiplier += second.alphaMultiplier; + } +} + +export = ColorTransform; \ No newline at end of file diff --git a/lib/core/geom/MathConsts.js b/lib/core/geom/MathConsts.js new file mode 100755 index 00000000..f4efeeb4 --- /dev/null +++ b/lib/core/geom/MathConsts.js @@ -0,0 +1,15 @@ +/** +* MathConsts provides some commonly used mathematical constants +*/ +var MathConsts = (function () { + function MathConsts() { + } + MathConsts.RADIANS_TO_DEGREES = 180 / Math.PI; + + MathConsts.DEGREES_TO_RADIANS = Math.PI / 180; + return MathConsts; +})(); + +module.exports = MathConsts; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9NYXRoQ29uc3RzLnRzIl0sIm5hbWVzIjpbIk1hdGhDb25zdHMiLCJNYXRoQ29uc3RzLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7RUFFRTtBQUNGO0lBQUFBO0lBV0FDLENBQUNBO0FBQUFELElBTkFBLGdDQUEwQ0EsR0FBR0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUE7O0lBS3JEQSxnQ0FBMENBLElBQUlBLENBQUNBLEVBQUVBLEdBQUNBLEdBQUdBO0lBQ3REQSxrQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCwyQkFBb0IsQ0FBQSIsImZpbGUiOiJjb3JlL2dlb20vTWF0aENvbnN0cy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuKiBNYXRoQ29uc3RzIHByb3ZpZGVzIHNvbWUgY29tbW9ubHkgdXNlZCBtYXRoZW1hdGljYWwgY29uc3RhbnRzXG4qL1xuY2xhc3MgTWF0aENvbnN0c1xue1xuXHQvKipcblx0ICogVGhlIGFtb3VudCB0byBtdWx0aXBseSB3aXRoIHdoZW4gY29udmVydGluZyByYWRpYW5zIHRvIGRlZ3JlZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFJBRElBTlNfVE9fREVHUkVFUzpudW1iZXIgPSAxODAvTWF0aC5QSTtcblxuXHQvKipcblx0ICogVGhlIGFtb3VudCB0byBtdWx0aXBseSB3aXRoIHdoZW4gY29udmVydGluZyBkZWdyZWVzIHRvIHJhZGlhbnMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIERFR1JFRVNfVE9fUkFESUFOUzpudW1iZXIgPSBNYXRoLlBJLzE4MDtcbn1cblxuZXhwb3J0ID0gTWF0aENvbnN0czsiXX0= \ No newline at end of file diff --git a/lib/core/geom/MathConsts.ts b/lib/core/geom/MathConsts.ts new file mode 100644 index 00000000..5e8f0b57 --- /dev/null +++ b/lib/core/geom/MathConsts.ts @@ -0,0 +1,17 @@ +/** +* MathConsts provides some commonly used mathematical constants +*/ +class MathConsts +{ + /** + * The amount to multiply with when converting radians to degrees. + */ + public static RADIANS_TO_DEGREES:number = 180/Math.PI; + + /** + * The amount to multiply with when converting degrees to radians. + */ + public static DEGREES_TO_RADIANS:number = Math.PI/180; +} + +export = MathConsts; \ No newline at end of file diff --git a/lib/core/geom/Matrix.js b/lib/core/geom/Matrix.js new file mode 100755 index 00000000..6dec9e8e --- /dev/null +++ b/lib/core/geom/Matrix.js @@ -0,0 +1,534 @@ +var Point = require("awayjs-core/lib/core/geom/Point"); + +var ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); + +/** +* The Matrix class represents a transformation matrix that determines how to +* map points from one coordinate space to another. You can perform various +* graphical transformations on a display object by setting the properties of +* a Matrix object, applying that Matrix object to the matrix +* property of a Transform object, and then applying that Transform object as +* the transform property of the display object. These +* transformation functions include translation(x and y +* repositioning), rotation, scaling, and skewing. +* +*

Together these types of transformations are known as affine +* transformations. Affine transformations preserve the straightness of +* lines while transforming, so that parallel lines stay parallel.

+* +*

To apply a transformation matrix to a display object, you create a +* Transform object, set its matrix property to the +* transformation matrix, and then set the transform property of +* the display object to the Transform object. Matrix objects are also used as +* parameters of some methods, such as the following:

+* +*
    +*
  • The draw() method of a BitmapData object
  • +*
  • The beginBitmapFill() method, +* beginGradientFill() method, or +* lineGradientStyle() method of a Graphics object
  • +*
+* +*

A transformation matrix object is a 3 x 3 matrix with the following +* contents:

+* +*

In traditional transformation matrixes, the u, +* v, and w properties provide extra capabilities. +* The Matrix class can only operate in two-dimensional space, so it always +* assumes that the property values u and v are 0.0, +* and that the property value w is 1.0. The effective values of +* the matrix are as follows:

+* +*

You can get and set the values of all six of the other properties in a +* Matrix object: a, b, c, +* d, tx, and ty.

+* +*

The Matrix class supports the four major types of transformations: +* translation, scaling, rotation, and skewing. You can set three of these +* transformations by using specialized methods, as described in the following +* table:

+* +*

Each transformation function alters the current matrix properties so +* that you can effectively combine multiple transformations. To do this, you +* call more than one transformation function before applying the matrix to +* its display object target(by using the transform property of +* that display object).

+* +*

Use the new Matrix() constructor to create a Matrix object +* before you can call the methods of the Matrix object.

+*/ +var Matrix = (function () { + /** + * Creates a new Matrix object with the specified parameters. In matrix + * notation, the properties are organized like this: + * + *

If you do not provide any parameters to the new Matrix() + * constructor, it creates an identity matrix with the following + * values:

+ * + *

In matrix notation, the identity matrix looks like this:

+ * + * @param a The value that affects the positioning of pixels along the + * x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the + * y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the + * x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the + * y axis when scaling or rotating an image.. + * @param tx The distance by which to translate each point along the x + * axis. + * @param ty The distance by which to translate each point along the y + * axis. + */ + function Matrix(a, b, c, d, tx, ty) { + if (typeof a === "undefined") { a = 1; } + if (typeof b === "undefined") { b = 0; } + if (typeof c === "undefined") { c = 0; } + if (typeof d === "undefined") { d = 1; } + if (typeof tx === "undefined") { tx = 0; } + if (typeof ty === "undefined") { ty = 0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + /** + * Returns a new Matrix object that is a clone of this matrix, with an exact + * copy of the contained object. + * + * @return A Matrix object. + */ + Matrix.prototype.clone = function () { + return new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty); + }; + + /** + * Concatenates a matrix with the current matrix, effectively combining the + * geometric effects of the two. In mathematical terms, concatenating two + * matrixes is the same as combining them using matrix multiplication. + * + *

For example, if matrix m1 scales an object by a factor of + * four, and matrix m2 rotates an object by 1.5707963267949 + * radians(Math.PI/2), then m1.concat(m2) + * transforms m1 into a matrix that scales an object by a factor + * of four and rotates the object by Math.PI/2 radians.

+ * + *

This method replaces the source matrix with the concatenated matrix. If + * you want to concatenate two matrixes without altering either of the two + * source matrixes, first copy the source matrix by using the + * clone() method, as shown in the Class Examples section.

+ * + * @param matrix The matrix to be concatenated to the source matrix. + */ + Matrix.prototype.concat = function (matrix) { + var a1 = this.a * matrix.a + this.b * matrix.c; + this.b = this.a * matrix.b + this.b * matrix.d; + this.a = a1; + + var c1 = this.c * matrix.a + this.d * matrix.c; + this.d = this.c * matrix.b + this.d * matrix.d; + + this.c = c1; + + var tx1 = this.tx * matrix.a + this.ty * matrix.c + matrix.tx; + this.ty = this.tx * matrix.b + this.ty * matrix.d + matrix.ty; + this.tx = tx1; + }; + + /** + * Copies a Vector3D object into specific column of the calling Matrix3D + * object. + * + * @param column The column from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + Matrix.prototype.copyColumnFrom = function (column, vector3D) { + if (column > 2) { + throw "Column " + column + " out of bounds (2)"; + } else if (column == 0) { + this.a = vector3D.x; + this.c = vector3D.y; + } else if (column == 1) { + this.b = vector3D.x; + this.d = vector3D.y; + } else { + this.tx = vector3D.x; + this.ty = vector3D.y; + } + }; + + /** + * Copies specific column of the calling Matrix object into the Vector3D + * object. The w element of the Vector3D object will not be changed. + * + * @param column The column from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + Matrix.prototype.copyColumnTo = function (column, vector3D) { + if (column > 2) { + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 2]"); + } else if (column == 0) { + vector3D.x = this.a; + vector3D.y = this.c; + vector3D.z = 0; + } else if (column == 1) { + vector3D.x = this.b; + vector3D.y = this.d; + vector3D.z = 0; + } else { + vector3D.x = this.tx; + vector3D.y = this.ty; + vector3D.z = 1; + } + }; + + /** + * Copies all of the matrix data from the source Point object into the + * calling Matrix object. + * + * @param sourceMatrix The Matrix object from which to copy the data. + */ + Matrix.prototype.copyFrom = function (sourceMatrix) { + this.a = sourceMatrix.a; + this.b = sourceMatrix.b; + this.c = sourceMatrix.c; + this.d = sourceMatrix.d; + this.tx = sourceMatrix.tx; + this.ty = sourceMatrix.ty; + }; + + /** + * Copies a Vector3D object into specific row of the calling Matrix object. + * + * @param row The row from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + Matrix.prototype.copyRowFrom = function (row, vector3D) { + if (row > 2) { + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); + } else if (row == 0) { + this.a = vector3D.x; + this.c = vector3D.y; + } else if (row == 1) { + this.b = vector3D.x; + this.d = vector3D.y; + } else { + this.tx = vector3D.x; + this.ty = vector3D.y; + } + }; + + /** + * Copies specific row of the calling Matrix object into the Vector3D object. + * The w element of the Vector3D object will not be changed. + * + * @param row The row from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + Matrix.prototype.copyRowTo = function (row, vector3D) { + if (row > 2) { + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); + } else if (row == 0) { + vector3D.x = this.a; + vector3D.y = this.b; + vector3D.z = this.tx; + } else if (row == 1) { + vector3D.x = this.c; + vector3D.y = this.d; + vector3D.z = this.ty; + } else { + vector3D.setTo(0, 0, 1); + } + }; + + /** + * Includes parameters for scaling, rotation, and translation. When applied + * to a matrix it sets the matrix's values based on those parameters. + * + *

Using the createBox() method lets you obtain the same + * matrix as you would if you applied the identity(), + * rotate(), scale(), and translate() + * methods in succession. For example, mat1.createBox(2,2,Math.PI/4, + * 100, 100) has the same effect as the following:

+ * + * @param scaleX The factor by which to scale horizontally. + * @param scaleY The factor by which scale vertically. + * @param rotation The amount to rotate, in radians. + * @param tx The number of pixels to translate(move) to the right + * along the x axis. + * @param ty The number of pixels to translate(move) down along the + * y axis. + */ + Matrix.prototype.createBox = function (scaleX, scaleY, rotation, tx, ty) { + if (typeof rotation === "undefined") { rotation = 0; } + if (typeof tx === "undefined") { tx = 0; } + if (typeof ty === "undefined") { ty = 0; } + this.a = scaleX; + this.d = scaleY; + this.b = rotation; + this.tx = tx; + this.ty = ty; + }; + + /** + * Creates the specific style of matrix expected by the + * beginGradientFill() and lineGradientStyle() + * methods of the Graphics class. Width and height are scaled to a + * scaleX/scaleY pair and the + * tx/ty values are offset by half the width and + * height. + * + *

For example, consider a gradient with the following + * characteristics:

+ * + *
    + *
  • GradientType.LINEAR
  • + *
  • Two colors, green and blue, with the ratios array set to [0, + * 255]
  • + *
  • SpreadMethod.PAD
  • + *
  • InterpolationMethod.LINEAR_RGB
  • + *
+ * + *

The following illustrations show gradients in which the matrix was + * defined using the createGradientBox() method with different + * parameter settings:

+ * + * @param width The width of the gradient box. + * @param height The height of the gradient box. + * @param rotation The amount to rotate, in radians. + * @param tx The distance, in pixels, to translate to the right along + * the x axis. This value is offset by half of the + * width parameter. + * @param ty The distance, in pixels, to translate down along the + * y axis. This value is offset by half of the + * height parameter. + */ + Matrix.prototype.createGradientBox = function (width, height, rotation, tx, ty) { + if (typeof rotation === "undefined") { rotation = 0; } + if (typeof tx === "undefined") { tx = 0; } + if (typeof ty === "undefined") { ty = 0; } + this.a = width / 1638.4; + this.d = height / 1638.4; + + if (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 = this.c = 0; + } + + this.tx = tx + width / 2; + this.ty = ty + height / 2; + }; + + /** + * Given a point in the pretransform coordinate space, returns the + * coordinates of that point after the transformation occurs. Unlike the + * standard transformation applied using the transformPoint() + * method, the deltaTransformPoint() method's transformation + * does not consider the translation parameters tx and + * ty. + * + * @param point The point for which you want to get the result of the matrix + * transformation. + * @return The point resulting from applying the matrix transformation. + */ + Matrix.prototype.deltaTransformPoint = function (point) { + return new Point(point.x * this.a + point.y * this.c, point.x * this.b + point.y * this.d); + }; + + /** + * Sets each matrix property to a value that causes a null transformation. An + * object transformed by applying an identity matrix will be identical to the + * original. + * + *

After calling the identity() method, the resulting matrix + * has the following properties: a=1, b=0, + * c=0, d=1, tx=0, + * ty=0.

+ * + *

In matrix notation, the identity matrix looks like this:

+ * + */ + Matrix.prototype.identity = function () { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.tx = 0; + this.ty = 0; + }; + + /** + * Performs the opposite transformation of the original matrix. You can apply + * an inverted matrix to an object to undo the transformation performed when + * applying the original matrix. + */ + Matrix.prototype.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.tx = -this.tx; + this.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.ty = -this.b * this.tx - this.d * this.ty; + this.tx = tx1; + } + }; + + /** + * Returns a new Matrix object that is a clone of this matrix, with an exact + * copy of the contained object. + * + * @param matrix The matrix for which you want to get the result of the matrix + * transformation. + * @return A Matrix object. + */ + Matrix.prototype.multiply = function (matrix) { + var result = new Matrix(); + + result.a = this.a * matrix.a + this.b * matrix.c; + result.b = this.a * matrix.b + this.b * matrix.d; + result.c = this.c * matrix.a + this.d * matrix.c; + result.d = this.c * matrix.b + this.d * matrix.d; + + result.tx = this.tx * matrix.a + this.ty * matrix.c + matrix.tx; + result.ty = this.tx * matrix.b + this.ty * matrix.d + matrix.ty; + + return result; + }; + + /** + * Applies a rotation transformation to the Matrix object. + * + *

The rotate() method alters the a, + * b, c, and d properties of the + * Matrix object. In matrix notation, this is the same as concatenating the + * current matrix with the following:

+ * + * @param angle The rotation angle in radians. + */ + Matrix.prototype.rotate = function (angle) { + var cos = Math.cos(angle); + var sin = Math.sin(angle); + + 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.ty = this.tx * sin + this.ty * cos; + this.tx = tx1; + }; + + /** + * Applies a scaling transformation to the matrix. The x axis is + * multiplied by sx, and the y axis it is multiplied by + * sy. + * + *

The scale() method alters the a and + * d properties of the Matrix object. In matrix notation, this + * is the same as concatenating the current matrix with the following + * matrix:

+ * + * @param sx A multiplier used to scale the object along the x axis. + * @param sy A multiplier used to scale the object along the y axis. + */ + Matrix.prototype.scale = function (sx, sy) { + this.a *= sx; + this.b *= sy; + + this.c *= sx; + this.d *= sy; + + this.tx *= sx; + this.ty *= sy; + }; + + /** + * Sets the members of Matrix to the specified values. + * + * @param a The value that affects the positioning of pixels along the + * x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the + * y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the + * x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the + * y axis when scaling or rotating an image.. + * @param tx The distance by which to translate each point along the x + * axis. + * @param ty The distance by which to translate each point along the y + * axis. + */ + Matrix.prototype.setTo = function (a, b, c, d, tx, ty) { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + }; + + /** + * Returns a text value listing the properties of the Matrix object. + * + * @return A string containing the values of the properties of the Matrix + * object: a, b, c, + * d, tx, and ty. + */ + Matrix.prototype.toString = function () { + return "[Matrix] (a=" + this.a + ", b=" + this.b + ", c=" + this.c + ", d=" + this.d + ", tx=" + this.tx + ", ty=" + this.ty + ")"; + }; + + /** + * Returns the result of applying the geometric transformation represented by + * the Matrix object to the specified point. + * + * @param point The point for which you want to get the result of the Matrix + * transformation. + * @return The point resulting from applying the Matrix transformation. + */ + Matrix.prototype.transformPoint = function (point) { + return new Point(point.x * this.a + point.y * this.c + this.tx, point.x * this.b + point.y * this.d + this.ty); + }; + + /** + * Translates the matrix along the x and y axes, as specified + * by the dx and dy parameters. + * + * @param dx The amount of movement along the x axis to the right, in + * pixels. + * @param dy The amount of movement down along the y axis, in pixels. + */ + Matrix.prototype.translate = function (dx, dy) { + this.tx += dx; + this.ty += dy; + }; + return Matrix; +})(); + +module.exports = Matrix; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9NYXRyaXgudHMiXSwibmFtZXMiOlsiTWF0cml4IiwiTWF0cml4LmNvbnN0cnVjdG9yIiwiTWF0cml4LmNsb25lIiwiTWF0cml4LmNvbmNhdCIsIk1hdHJpeC5jb3B5Q29sdW1uRnJvbSIsIk1hdHJpeC5jb3B5Q29sdW1uVG8iLCJNYXRyaXguY29weUZyb20iLCJNYXRyaXguY29weVJvd0Zyb20iLCJNYXRyaXguY29weVJvd1RvIiwiTWF0cml4LmNyZWF0ZUJveCIsIk1hdHJpeC5jcmVhdGVHcmFkaWVudEJveCIsIk1hdHJpeC5kZWx0YVRyYW5zZm9ybVBvaW50IiwiTWF0cml4LmlkZW50aXR5IiwiTWF0cml4LmludmVydCIsIk1hdHJpeC5tdWx0aXBseSIsIk1hdHJpeC5yb3RhdGUiLCJNYXRyaXguc2NhbGUiLCJNYXRyaXguc2V0VG8iLCJNYXRyaXgudG9TdHJpbmciLCJNYXRyaXgudHJhbnNmb3JtUG9pbnQiLCJNYXRyaXgudHJhbnNsYXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxzREFBOEQ7O0FBRTlELG1FQUF5RTs7QUFFekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXNERztBQUNIO0lBMkRDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztNQURHQTtJQUNIQSxnQkFBWUEsQ0FBWUEsRUFBRUEsQ0FBWUEsRUFBRUEsQ0FBWUEsRUFBRUEsQ0FBWUEsRUFBRUEsRUFBYUEsRUFBRUEsRUFBYUE7UUFBcEZDLGdDQUFBQSxDQUFDQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxnQ0FBQUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsZ0NBQUFBLENBQUNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLGdDQUFBQSxDQUFDQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxpQ0FBQUEsRUFBRUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsaUNBQUFBLEVBQUVBLEdBQVVBLENBQUNBO0FBQUFBLFFBRS9GQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQTtRQUNaQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQTtJQUNiQSxDQUFDQTtJQVFERDs7Ozs7TUFER0E7NkJBQ0hBO1FBRUNFLE9BQU9BLElBQUlBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBO0lBQ3BFQSxDQUFDQTs7SUFvQkRGOzs7Ozs7Ozs7Ozs7Ozs7OztNQURHQTs4QkFDSEEsVUFBY0EsTUFBYUE7UUFFMUJHLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQzFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtRQUMxQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7O1FBRVhBLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQzFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTs7UUFFMUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBOztRQUVYQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxFQUFFQTtRQUN6REEsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsQ0FBQ0EsRUFBRUE7UUFDekRBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLEdBQUdBO0lBQ2RBLENBQUNBOztJQVNESDs7Ozs7O01BREdBO3NDQUNIQSxVQUFzQkEsTUFBYUEsRUFBRUEsUUFBaUJBO1FBRXJESSxJQUFJQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFFQTtZQUNmQSxNQUFNQSxTQUFTQSxHQUFHQSxNQUFNQSxHQUFHQSxvQkFBb0JBO1NBQy9DQSxNQUFNQSxJQUFJQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUN2QkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO1NBQ25CQSxNQUFNQSxJQUFJQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUN2QkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO1NBQ25CQSxLQUFNQTtZQUNOQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtZQUNwQkEsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBO0lBQ0ZBLENBQUNBOztJQVNESjs7Ozs7O01BREdBO29DQUNIQSxVQUFvQkEsTUFBYUEsRUFBRUEsUUFBaUJBO1FBRW5ESyxJQUFJQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFFQTtZQUNmQSxNQUFNQSxJQUFJQSxhQUFhQSxDQUFDQSx3QkFBd0JBLEdBQUdBLE1BQU1BLEdBQUdBLDRCQUE0QkEsQ0FBQ0E7U0FDekZBLE1BQU1BLElBQUlBLE1BQU1BLElBQUlBLENBQUNBLENBQUVBO1lBQ3ZCQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNuQkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1NBQ2RBLE1BQU1BLElBQUlBLE1BQU1BLElBQUlBLENBQUNBLENBQUVBO1lBQ3ZCQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNuQkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1NBQ2RBLEtBQU1BO1lBQ05BLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBO1lBQ3BCQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxFQUFFQTtZQUNwQkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FDZEE7SUFDRkEsQ0FBQ0E7O0lBUURMOzs7OztNQURHQTtnQ0FDSEEsVUFBZ0JBLFlBQW1CQTtRQUVsQ00sSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsWUFBWUEsQ0FBQ0EsQ0FBQ0E7UUFDdkJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLFlBQVlBLENBQUNBLENBQUNBO1FBQ3ZCQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxZQUFZQSxDQUFDQSxDQUFDQTtRQUN2QkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsWUFBWUEsQ0FBQ0EsQ0FBQ0E7UUFDdkJBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLFlBQVlBLENBQUNBLEVBQUVBO1FBQ3pCQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxZQUFZQSxDQUFDQSxFQUFFQTtJQUMxQkEsQ0FBQ0E7O0lBUUROOzs7OztNQURHQTttQ0FDSEEsVUFBbUJBLEdBQVVBLEVBQUVBLFFBQWlCQTtRQUUvQ08sSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBRUE7WUFDWkEsTUFBTUEsSUFBSUEsYUFBYUEsQ0FBQ0EscUJBQXFCQSxHQUFHQSxHQUFHQSxHQUFHQSw0QkFBNEJBLENBQUNBO1NBQ25GQSxNQUFNQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUNwQkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO1NBQ25CQSxNQUFNQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUNwQkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO1NBQ25CQSxLQUFNQTtZQUNOQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtZQUNwQkEsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBO0lBQ0ZBLENBQUNBOztJQVNEUDs7Ozs7O01BREdBO2lDQUNIQSxVQUFpQkEsR0FBVUEsRUFBRUEsUUFBaUJBO1FBRTdDUSxJQUFJQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFFQTtZQUNaQSxNQUFNQSxJQUFJQSxhQUFhQSxDQUFDQSxxQkFBcUJBLEdBQUdBLEdBQUdBLEdBQUdBLDRCQUE0QkEsQ0FBQ0E7U0FDbkZBLE1BQU1BLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLENBQUVBO1lBQ3BCQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNuQkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBO1NBQ3BCQSxNQUFNQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUNwQkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDbkJBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBO1lBQ25CQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxFQUFFQTtTQUNwQkEsS0FBTUE7WUFDTkEsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDdkJBO0lBQ0ZBLENBQUNBOztJQW9CRFI7Ozs7Ozs7Ozs7Ozs7Ozs7O01BREdBO2lDQUNIQSxVQUFpQkEsTUFBYUEsRUFBRUEsTUFBYUEsRUFBRUEsUUFBbUJBLEVBQUVBLEVBQWFBLEVBQUVBLEVBQWFBO1FBQWpEUyx1Q0FBQUEsUUFBUUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsaUNBQUFBLEVBQUVBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLGlDQUFBQSxFQUFFQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUUvRkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUE7UUFDZkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUE7UUFDZkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUE7UUFDakJBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBO1FBQ1pBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBO0lBQ2JBLENBQUNBOztJQW1DRFQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BREdBO3lDQUNIQSxVQUF5QkEsS0FBWUEsRUFBRUEsTUFBYUEsRUFBRUEsUUFBbUJBLEVBQUVBLEVBQWFBLEVBQUVBLEVBQWFBO1FBQWpEVSx1Q0FBQUEsUUFBUUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsaUNBQUFBLEVBQUVBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLGlDQUFBQSxFQUFFQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUV0R0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBQ0EsTUFBTUE7UUFDckJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLE1BQU1BLEdBQUNBLE1BQU1BOztRQUV0QkEsSUFBSUEsUUFBUUEsSUFBSUEsR0FBR0EsQ0FBRUE7WUFDcEJBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBO1lBQzVCQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQTs7WUFFNUJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBO1lBQ25CQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNwQkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7WUFDYkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7U0FDYkEsS0FBTUE7WUFDTkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FDbkJBOztRQUVEQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxLQUFLQSxHQUFDQSxDQUFDQTtRQUN0QkEsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0Es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R0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7UUFDNUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQzVDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTs7UUFFNUNBLE1BQU1BLENBQUNBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLEVBQUVBO1FBQzNEQSxNQUFNQSxDQUFDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxFQUFFQTs7UUFFM0RBLE9BQU9BLE1BQU1BO0lBQ2RBLENBQUNBOztJQVlEZDs7Ozs7Ozs7O01BREdBOzhCQUNIQSxVQUFjQSxLQUFZQTtRQUV6QmUsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFDekJBLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBOztRQUV6QkEsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsR0FBR0E7UUFDaENBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEdBQUdBO1FBQ2hDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTs7UUFFWEEsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsR0FBR0E7UUFDaENBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEdBQUdBO1FBQ2hDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTs7UUFFWEEsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBQ0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBQ0EsR0FBR0E7UUFDbkNBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBLEdBQUNBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBLEdBQUNBLEdBQUdBO1FBQ25DQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxHQUFHQTtJQUNkQSxDQUFDQTs7SUFlRGY7Ozs7Ozs7Ozs7OztNQURHQTs2QkFDSEEsVUFBYUEsRUFBU0EsRUFBRUEsRUFBU0E7UUFFaENnQixJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxFQUFFQTtRQUNaQSxJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxFQUFFQTs7UUFFWkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUE7UUFDWkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUE7O1FBRVpBLElBQUlBLENBQUNBLEVBQUVBLElBQUlBLEVBQUVBO1FBQ2JBLElBQUlBLENBQUNBLEVBQUVBLElBQUlBLEVBQUVBO0lBQ2RBLENBQUNBOztJQWtCRGhCOzs7Ozs7Ozs7Ozs7Ozs7TUFER0E7NkJBQ0hBLFVBQWFBLENBQVFBLEVBQUVBLENBQVFBLEVBQUVBLENBQVFBLEVBQUVBLENBQVFBLEVBQUVBLEVBQVNBLEVBQUVBLEVBQVNBO1FBRXhFaUIsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDVkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDVkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDVkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDVkEsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUE7UUFDWkEsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUE7SUFDYkEsQ0FBQ0E7O0lBU0RqQjs7Ozs7O01BREdBO2dDQUNIQTtRQUVDa0IsT0FBT0EsY0FBY0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBR0E7SUFDbklBLENBQUNBOztJQVVEbEI7Ozs7Ozs7TUFER0E7c0NBQ0hBLFVBQXNCQSxLQUFXQTtRQUVoQ21CLE9BQU9BLElBQUlBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBO0lBQ3ZHQSxDQUFDQTs7SUFVRG5COzs7Ozs7O01BREdBO2lDQUNIQSxVQUFpQkEsRUFBU0EsRUFBRUEsRUFBU0E7UUFFcENvQixJQUFJQSxDQUFDQSxFQUFFQSxJQUFJQSxFQUFFQTtRQUNiQSxJQUFJQSxDQUFDQSxFQUFFQSxJQUFJQSxFQUFFQTtJQUNkQSxDQUFDQTtJQUNGcEIsY0FBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCx1QkFBZ0IsQ0FBQSIsImZpbGUiOiJjb3JlL2dlb20vTWF0cml4LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBvaW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUG9pbnRcIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBBcmd1bWVudEVycm9yXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9Bcmd1bWVudEVycm9yXCIpO1xuXG4vKipcbiAqIFRoZSBNYXRyaXggY2xhc3MgcmVwcmVzZW50cyBhIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCB0aGF0IGRldGVybWluZXMgaG93IHRvXG4gKiBtYXAgcG9pbnRzIGZyb20gb25lIGNvb3JkaW5hdGUgc3BhY2UgdG8gYW5vdGhlci4gWW91IGNhbiBwZXJmb3JtIHZhcmlvdXNcbiAqIGdyYXBoaWNhbCB0cmFuc2Zvcm1hdGlvbnMgb24gYSBkaXNwbGF5IG9iamVjdCBieSBzZXR0aW5nIHRoZSBwcm9wZXJ0aWVzIG9mXG4gKiBhIE1hdHJpeCBvYmplY3QsIGFwcGx5aW5nIHRoYXQgTWF0cml4IG9iamVjdCB0byB0aGUgPGNvZGU+bWF0cml4PC9jb2RlPlxuICogcHJvcGVydHkgb2YgYSBUcmFuc2Zvcm0gb2JqZWN0LCBhbmQgdGhlbiBhcHBseWluZyB0aGF0IFRyYW5zZm9ybSBvYmplY3QgYXNcbiAqIHRoZSA8Y29kZT50cmFuc2Zvcm08L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBkaXNwbGF5IG9iamVjdC4gVGhlc2VcbiAqIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucyBpbmNsdWRlIHRyYW5zbGF0aW9uKDxpPng8L2k+IGFuZCA8aT55PC9pPlxuICogcmVwb3NpdGlvbmluZyksIHJvdGF0aW9uLCBzY2FsaW5nLCBhbmQgc2tld2luZy5cbiAqXG4gKiA8cD5Ub2dldGhlciB0aGVzZSB0eXBlcyBvZiB0cmFuc2Zvcm1hdGlvbnMgYXJlIGtub3duIGFzIDxpPmFmZmluZVxuICogdHJhbnNmb3JtYXRpb25zPC9pPi4gQWZmaW5lIHRyYW5zZm9ybWF0aW9ucyBwcmVzZXJ2ZSB0aGUgc3RyYWlnaHRuZXNzIG9mXG4gKiBsaW5lcyB3aGlsZSB0cmFuc2Zvcm1pbmcsIHNvIHRoYXQgcGFyYWxsZWwgbGluZXMgc3RheSBwYXJhbGxlbC48L3A+XG4gKlxuICogPHA+VG8gYXBwbHkgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdG8gYSBkaXNwbGF5IG9iamVjdCwgeW91IGNyZWF0ZSBhXG4gKiBUcmFuc2Zvcm0gb2JqZWN0LCBzZXQgaXRzIDxjb2RlPm1hdHJpeDwvY29kZT4gcHJvcGVydHkgdG8gdGhlXG4gKiB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgsIGFuZCB0aGVuIHNldCB0aGUgPGNvZGU+dHJhbnNmb3JtPC9jb2RlPiBwcm9wZXJ0eSBvZlxuICogdGhlIGRpc3BsYXkgb2JqZWN0IHRvIHRoZSBUcmFuc2Zvcm0gb2JqZWN0LiBNYXRyaXggb2JqZWN0cyBhcmUgYWxzbyB1c2VkIGFzXG4gKiBwYXJhbWV0ZXJzIG9mIHNvbWUgbWV0aG9kcywgc3VjaCBhcyB0aGUgZm9sbG93aW5nOjwvcD5cbiAqXG4gKiA8dWw+XG4gKiAgIDxsaT5UaGUgPGNvZGU+ZHJhdygpPC9jb2RlPiBtZXRob2Qgb2YgYSBCaXRtYXBEYXRhIG9iamVjdDwvbGk+XG4gKiAgIDxsaT5UaGUgPGNvZGU+YmVnaW5CaXRtYXBGaWxsKCk8L2NvZGU+IG1ldGhvZCxcbiAqIDxjb2RlPmJlZ2luR3JhZGllbnRGaWxsKCk8L2NvZGU+IG1ldGhvZCwgb3JcbiAqIDxjb2RlPmxpbmVHcmFkaWVudFN0eWxlKCk8L2NvZGU+IG1ldGhvZCBvZiBhIEdyYXBoaWNzIG9iamVjdDwvbGk+XG4gKiA8L3VsPlxuICpcbiAqIDxwPkEgdHJhbnNmb3JtYXRpb24gbWF0cml4IG9iamVjdCBpcyBhIDMgeCAzIG1hdHJpeCB3aXRoIHRoZSBmb2xsb3dpbmdcbiAqIGNvbnRlbnRzOjwvcD5cbiAqXG4gKiA8cD5JbiB0cmFkaXRpb25hbCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhlcywgdGhlIDxjb2RlPnU8L2NvZGU+LFxuICogPGNvZGU+djwvY29kZT4sIGFuZCA8Y29kZT53PC9jb2RlPiBwcm9wZXJ0aWVzIHByb3ZpZGUgZXh0cmEgY2FwYWJpbGl0aWVzLlxuICogVGhlIE1hdHJpeCBjbGFzcyBjYW4gb25seSBvcGVyYXRlIGluIHR3by1kaW1lbnNpb25hbCBzcGFjZSwgc28gaXQgYWx3YXlzXG4gKiBhc3N1bWVzIHRoYXQgdGhlIHByb3BlcnR5IHZhbHVlcyA8Y29kZT51PC9jb2RlPiBhbmQgPGNvZGU+djwvY29kZT4gYXJlIDAuMCxcbiAqIGFuZCB0aGF0IHRoZSBwcm9wZXJ0eSB2YWx1ZSA8Y29kZT53PC9jb2RlPiBpcyAxLjAuIFRoZSBlZmZlY3RpdmUgdmFsdWVzIG9mXG4gKiB0aGUgbWF0cml4IGFyZSBhcyBmb2xsb3dzOjwvcD5cbiAqXG4gKiA8cD5Zb3UgY2FuIGdldCBhbmQgc2V0IHRoZSB2YWx1ZXMgb2YgYWxsIHNpeCBvZiB0aGUgb3RoZXIgcHJvcGVydGllcyBpbiBhXG4gKiBNYXRyaXggb2JqZWN0OiA8Y29kZT5hPC9jb2RlPiwgPGNvZGU+YjwvY29kZT4sIDxjb2RlPmM8L2NvZGU+LFxuICogPGNvZGU+ZDwvY29kZT4sIDxjb2RlPnR4PC9jb2RlPiwgYW5kIDxjb2RlPnR5PC9jb2RlPi48L3A+XG4gKlxuICogPHA+VGhlIE1hdHJpeCBjbGFzcyBzdXBwb3J0cyB0aGUgZm91ciBtYWpvciB0eXBlcyBvZiB0cmFuc2Zvcm1hdGlvbnM6XG4gKiB0cmFuc2xhdGlvbiwgc2NhbGluZywgcm90YXRpb24sIGFuZCBza2V3aW5nLiBZb3UgY2FuIHNldCB0aHJlZSBvZiB0aGVzZVxuICogdHJhbnNmb3JtYXRpb25zIGJ5IHVzaW5nIHNwZWNpYWxpemVkIG1ldGhvZHMsIGFzIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nXG4gKiB0YWJsZTogPC9wPlxuICpcbiAqIDxwPkVhY2ggdHJhbnNmb3JtYXRpb24gZnVuY3Rpb24gYWx0ZXJzIHRoZSBjdXJyZW50IG1hdHJpeCBwcm9wZXJ0aWVzIHNvXG4gKiB0aGF0IHlvdSBjYW4gZWZmZWN0aXZlbHkgY29tYmluZSBtdWx0aXBsZSB0cmFuc2Zvcm1hdGlvbnMuIFRvIGRvIHRoaXMsIHlvdVxuICogY2FsbCBtb3JlIHRoYW4gb25lIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGJlZm9yZSBhcHBseWluZyB0aGUgbWF0cml4IHRvXG4gKiBpdHMgZGlzcGxheSBvYmplY3QgdGFyZ2V0KGJ5IHVzaW5nIHRoZSA8Y29kZT50cmFuc2Zvcm08L2NvZGU+IHByb3BlcnR5IG9mXG4gKiB0aGF0IGRpc3BsYXkgb2JqZWN0KS48L3A+XG4gKlxuICogPHA+VXNlIHRoZSA8Y29kZT5uZXcgTWF0cml4KCk8L2NvZGU+IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhIE1hdHJpeCBvYmplY3RcbiAqIGJlZm9yZSB5b3UgY2FuIGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIE1hdHJpeCBvYmplY3QuPC9wPlxuICovXG5jbGFzcyBNYXRyaXhcbntcblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHBvc2l0aW9uaW5nIG9mIHBpeGVscyBhbG9uZyB0aGUgPGk+eDwvaT4gYXhpc1xuXHQgKiB3aGVuIHNjYWxpbmcgb3Igcm90YXRpbmcgYW4gaW1hZ2UuXG5cdCAqL1xuXHRwdWJsaWMgYTpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHBvc2l0aW9uaW5nIG9mIHBpeGVscyBhbG9uZyB0aGUgPGk+eTwvaT4gYXhpc1xuXHQgKiB3aGVuIHJvdGF0aW5nIG9yIHNrZXdpbmcgYW4gaW1hZ2UuXG5cdCAqL1xuXHRwdWJsaWMgYjpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHBvc2l0aW9uaW5nIG9mIHBpeGVscyBhbG9uZyB0aGUgPGk+eDwvaT4gYXhpc1xuXHQgKiB3aGVuIHJvdGF0aW5nIG9yIHNrZXdpbmcgYW4gaW1hZ2UuXG5cdCAqL1xuXHRwdWJsaWMgYzpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHBvc2l0aW9uaW5nIG9mIHBpeGVscyBhbG9uZyB0aGUgPGk+eTwvaT4gYXhpc1xuXHQgKiB3aGVuIHNjYWxpbmcgb3Igcm90YXRpbmcgYW4gaW1hZ2UuXG5cdCAqL1xuXHRwdWJsaWMgZDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSBkaXN0YW5jZSBieSB3aGljaCB0byB0cmFuc2xhdGUgZWFjaCBwb2ludCBhbG9uZyB0aGUgPGk+eDwvaT4gYXhpcy5cblx0ICovXG5cdHB1YmxpYyB0eDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSBkaXN0YW5jZSBieSB3aGljaCB0byB0cmFuc2xhdGUgZWFjaCBwb2ludCBhbG9uZyB0aGUgPGk+eTwvaT4gYXhpcy5cblx0ICovXG5cdHB1YmxpYyB0eTpudW1iZXI7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgTWF0cml4IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gSW4gbWF0cml4XG5cdCAqIG5vdGF0aW9uLCB0aGUgcHJvcGVydGllcyBhcmUgb3JnYW5pemVkIGxpa2UgdGhpczpcblx0ICpcblx0ICogPHA+SWYgeW91IGRvIG5vdCBwcm92aWRlIGFueSBwYXJhbWV0ZXJzIHRvIHRoZSA8Y29kZT5uZXcgTWF0cml4KCk8L2NvZGU+XG5cdCAqIGNvbnN0cnVjdG9yLCBpdCBjcmVhdGVzIGFuIDxpPmlkZW50aXR5IG1hdHJpeDwvaT4gd2l0aCB0aGUgZm9sbG93aW5nXG5cdCAqIHZhbHVlczo8L3A+XG5cdCAqXG5cdCAqIDxwPkluIG1hdHJpeCBub3RhdGlvbiwgdGhlIGlkZW50aXR5IG1hdHJpeCBsb29rcyBsaWtlIHRoaXM6PC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gYSAgVGhlIHZhbHVlIHRoYXQgYWZmZWN0cyB0aGUgcG9zaXRpb25pbmcgb2YgcGl4ZWxzIGFsb25nIHRoZVxuXHQgKiAgICAgICAgICAgPGk+eDwvaT4gYXhpcyB3aGVuIHNjYWxpbmcgb3Igcm90YXRpbmcgYW4gaW1hZ2UuXG5cdCAqIEBwYXJhbSBiICBUaGUgdmFsdWUgdGhhdCBhZmZlY3RzIHRoZSBwb3NpdGlvbmluZyBvZiBwaXhlbHMgYWxvbmcgdGhlXG5cdCAqICAgICAgICAgICA8aT55PC9pPiBheGlzIHdoZW4gcm90YXRpbmcgb3Igc2tld2luZyBhbiBpbWFnZS5cblx0ICogQHBhcmFtIGMgIFRoZSB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHBvc2l0aW9uaW5nIG9mIHBpeGVscyBhbG9uZyB0aGVcblx0ICogICAgICAgICAgIDxpPng8L2k+IGF4aXMgd2hlbiByb3RhdGluZyBvciBza2V3aW5nIGFuIGltYWdlLlxuXHQgKiBAcGFyYW0gZCAgVGhlIHZhbHVlIHRoYXQgYWZmZWN0cyB0aGUgcG9zaXRpb25pbmcgb2YgcGl4ZWxzIGFsb25nIHRoZVxuXHQgKiAgICAgICAgICAgPGk+eTwvaT4gYXhpcyB3aGVuIHNjYWxpbmcgb3Igcm90YXRpbmcgYW4gaW1hZ2UuLlxuXHQgKiBAcGFyYW0gdHggVGhlIGRpc3RhbmNlIGJ5IHdoaWNoIHRvIHRyYW5zbGF0ZSBlYWNoIHBvaW50IGFsb25nIHRoZSA8aT54PC9pPlxuXHQgKiAgICAgICAgICAgYXhpcy5cblx0ICogQHBhcmFtIHR5IFRoZSBkaXN0YW5jZSBieSB3aGljaCB0byB0cmFuc2xhdGUgZWFjaCBwb2ludCBhbG9uZyB0aGUgPGk+eTwvaT5cblx0ICogICAgICAgICAgIGF4aXMuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihhOm51bWJlciA9IDEsIGI6bnVtYmVyID0gMCwgYzpudW1iZXIgPSAwLCBkOm51bWJlciA9IDEsIHR4Om51bWJlciA9IDAsIHR5Om51bWJlciA9IDApXG5cdHtcblx0XHR0aGlzLmEgPSBhO1xuXHRcdHRoaXMuYiA9IGI7XG5cdFx0dGhpcy5jID0gYztcblx0XHR0aGlzLmQgPSBkO1xuXHRcdHRoaXMudHggPSB0eDtcblx0XHR0aGlzLnR5ID0gdHk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG5ldyBNYXRyaXggb2JqZWN0IHRoYXQgaXMgYSBjbG9uZSBvZiB0aGlzIG1hdHJpeCwgd2l0aCBhbiBleGFjdFxuXHQgKiBjb3B5IG9mIHRoZSBjb250YWluZWQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcmV0dXJuIEEgTWF0cml4IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOk1hdHJpeFxuXHR7XG5cdFx0cmV0dXJuIG5ldyBNYXRyaXgodGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdGhpcy5kLCB0aGlzLnR4LCB0aGlzLnR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25jYXRlbmF0ZXMgYSBtYXRyaXggd2l0aCB0aGUgY3VycmVudCBtYXRyaXgsIGVmZmVjdGl2ZWx5IGNvbWJpbmluZyB0aGVcblx0ICogZ2VvbWV0cmljIGVmZmVjdHMgb2YgdGhlIHR3by4gSW4gbWF0aGVtYXRpY2FsIHRlcm1zLCBjb25jYXRlbmF0aW5nIHR3b1xuXHQgKiBtYXRyaXhlcyBpcyB0aGUgc2FtZSBhcyBjb21iaW5pbmcgdGhlbSB1c2luZyBtYXRyaXggbXVsdGlwbGljYXRpb24uXG5cdCAqXG5cdCAqIDxwPkZvciBleGFtcGxlLCBpZiBtYXRyaXggPGNvZGU+bTE8L2NvZGU+IHNjYWxlcyBhbiBvYmplY3QgYnkgYSBmYWN0b3Igb2Zcblx0ICogZm91ciwgYW5kIG1hdHJpeCA8Y29kZT5tMjwvY29kZT4gcm90YXRlcyBhbiBvYmplY3QgYnkgMS41NzA3OTYzMjY3OTQ5XG5cdCAqIHJhZGlhbnMoPGNvZGU+TWF0aC5QSS8yPC9jb2RlPiksIHRoZW4gPGNvZGU+bTEuY29uY2F0KG0yKTwvY29kZT5cblx0ICogdHJhbnNmb3JtcyA8Y29kZT5tMTwvY29kZT4gaW50byBhIG1hdHJpeCB0aGF0IHNjYWxlcyBhbiBvYmplY3QgYnkgYSBmYWN0b3Jcblx0ICogb2YgZm91ciBhbmQgcm90YXRlcyB0aGUgb2JqZWN0IGJ5IDxjb2RlPk1hdGguUEkvMjwvY29kZT4gcmFkaWFucy4gPC9wPlxuXHQgKlxuXHQgKiA8cD5UaGlzIG1ldGhvZCByZXBsYWNlcyB0aGUgc291cmNlIG1hdHJpeCB3aXRoIHRoZSBjb25jYXRlbmF0ZWQgbWF0cml4LiBJZlxuXHQgKiB5b3Ugd2FudCB0byBjb25jYXRlbmF0ZSB0d28gbWF0cml4ZXMgd2l0aG91dCBhbHRlcmluZyBlaXRoZXIgb2YgdGhlIHR3b1xuXHQgKiBzb3VyY2UgbWF0cml4ZXMsIGZpcnN0IGNvcHkgdGhlIHNvdXJjZSBtYXRyaXggYnkgdXNpbmcgdGhlXG5cdCAqIDxjb2RlPmNsb25lKCk8L2NvZGU+IG1ldGhvZCwgYXMgc2hvd24gaW4gdGhlIENsYXNzIEV4YW1wbGVzIHNlY3Rpb24uPC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gbWF0cml4IFRoZSBtYXRyaXggdG8gYmUgY29uY2F0ZW5hdGVkIHRvIHRoZSBzb3VyY2UgbWF0cml4LlxuXHQgKi9cblx0cHVibGljIGNvbmNhdChtYXRyaXg6TWF0cml4KTp2b2lkXG5cdHtcblx0XHR2YXIgYTEgPSB0aGlzLmEqbWF0cml4LmEgKyB0aGlzLmIqbWF0cml4LmM7XG5cdFx0dGhpcy5iID0gdGhpcy5hKm1hdHJpeC5iICsgdGhpcy5iKm1hdHJpeC5kO1xuXHRcdHRoaXMuYSA9IGExO1xuXG5cdFx0dmFyIGMxID0gdGhpcy5jKm1hdHJpeC5hICsgdGhpcy5kKm1hdHJpeC5jO1xuXHRcdHRoaXMuZCA9IHRoaXMuYyptYXRyaXguYiArIHRoaXMuZCptYXRyaXguZDtcblxuXHRcdHRoaXMuYyA9IGMxO1xuXG5cdFx0dmFyIHR4MSA9IHRoaXMudHgqbWF0cml4LmEgKyB0aGlzLnR5Km1hdHJpeC5jICsgbWF0cml4LnR4O1xuXHRcdHRoaXMudHkgPSB0aGlzLnR4Km1hdHJpeC5iICsgdGhpcy50eSptYXRyaXguZCArIG1hdHJpeC50eTtcblx0XHR0aGlzLnR4ID0gdHgxO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvcGllcyBhIFZlY3RvcjNEIG9iamVjdCBpbnRvIHNwZWNpZmljIGNvbHVtbiBvZiB0aGUgY2FsbGluZyBNYXRyaXgzRFxuXHQgKiBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBjb2x1bW4gICBUaGUgY29sdW1uIGZyb20gd2hpY2ggdG8gY29weSB0aGUgZGF0YSBmcm9tLlxuXHQgKiBAcGFyYW0gdmVjdG9yM0QgVGhlIFZlY3RvcjNEIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgdGhlIGRhdGEuXG5cdCAqL1xuXHRwdWJsaWMgY29weUNvbHVtbkZyb20oY29sdW1uOm51bWJlciwgdmVjdG9yM0Q6VmVjdG9yM0QpOnZvaWRcblx0e1xuXHRcdGlmIChjb2x1bW4gPiAyKSB7XG5cdFx0XHR0aHJvdyBcIkNvbHVtbiBcIiArIGNvbHVtbiArIFwiIG91dCBvZiBib3VuZHMgKDIpXCI7XG5cdFx0fSBlbHNlIGlmIChjb2x1bW4gPT0gMCkge1xuXHRcdFx0dGhpcy5hID0gdmVjdG9yM0QueDtcblx0XHRcdHRoaXMuYyA9IHZlY3RvcjNELnk7XG5cdFx0fSBlbHNlIGlmIChjb2x1bW4gPT0gMSkge1xuXHRcdFx0dGhpcy5iID0gdmVjdG9yM0QueDtcblx0XHRcdHRoaXMuZCA9IHZlY3RvcjNELnk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMudHggPSB2ZWN0b3IzRC54O1xuXHRcdFx0dGhpcy50eSA9IHZlY3RvcjNELnk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENvcGllcyBzcGVjaWZpYyBjb2x1bW4gb2YgdGhlIGNhbGxpbmcgTWF0cml4IG9iamVjdCBpbnRvIHRoZSBWZWN0b3IzRFxuXHQgKiBvYmplY3QuIFRoZSB3IGVsZW1lbnQgb2YgdGhlIFZlY3RvcjNEIG9iamVjdCB3aWxsIG5vdCBiZSBjaGFuZ2VkLlxuXHQgKlxuXHQgKiBAcGFyYW0gY29sdW1uICAgVGhlIGNvbHVtbiBmcm9tIHdoaWNoIHRvIGNvcHkgdGhlIGRhdGEgZnJvbS5cblx0ICogQHBhcmFtIHZlY3RvcjNEIFRoZSBWZWN0b3IzRCBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHRoZSBkYXRhLlxuXHQgKi9cblx0cHVibGljIGNvcHlDb2x1bW5Ubyhjb2x1bW46bnVtYmVyLCB2ZWN0b3IzRDpWZWN0b3IzRCk6dm9pZFxuXHR7XG5cdFx0aWYgKGNvbHVtbiA+IDIpIHtcblx0XHRcdHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiQXJndW1lbnRFcnJvciwgQ29sdW1uIFwiICsgY29sdW1uICsgXCIgb3V0IG9mIGJvdW5kcyBbMCwgLi4uLCAyXVwiKTtcblx0XHR9IGVsc2UgaWYgKGNvbHVtbiA9PSAwKSB7XG5cdFx0XHR2ZWN0b3IzRC54ID0gdGhpcy5hO1xuXHRcdFx0dmVjdG9yM0QueSA9IHRoaXMuYztcblx0XHRcdHZlY3RvcjNELnogPSAwO1xuXHRcdH0gZWxzZSBpZiAoY29sdW1uID09IDEpIHtcblx0XHRcdHZlY3RvcjNELnggPSB0aGlzLmI7XG5cdFx0XHR2ZWN0b3IzRC55ID0gdGhpcy5kO1xuXHRcdFx0dmVjdG9yM0QueiA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZlY3RvcjNELnggPSB0aGlzLnR4O1xuXHRcdFx0dmVjdG9yM0QueSA9IHRoaXMudHk7XG5cdFx0XHR2ZWN0b3IzRC56ID0gMTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29waWVzIGFsbCBvZiB0aGUgbWF0cml4IGRhdGEgZnJvbSB0aGUgc291cmNlIFBvaW50IG9iamVjdCBpbnRvIHRoZVxuXHQgKiBjYWxsaW5nIE1hdHJpeCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2VNYXRyaXggVGhlIE1hdHJpeCBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHRoZSBkYXRhLlxuXHQgKi9cblx0cHVibGljIGNvcHlGcm9tKHNvdXJjZU1hdHJpeDpNYXRyaXgpOnZvaWRcblx0e1xuXHRcdHRoaXMuYSA9IHNvdXJjZU1hdHJpeC5hO1xuXHRcdHRoaXMuYiA9IHNvdXJjZU1hdHJpeC5iO1xuXHRcdHRoaXMuYyA9IHNvdXJjZU1hdHJpeC5jO1xuXHRcdHRoaXMuZCA9IHNvdXJjZU1hdHJpeC5kO1xuXHRcdHRoaXMudHggPSBzb3VyY2VNYXRyaXgudHg7XG5cdFx0dGhpcy50eSA9IHNvdXJjZU1hdHJpeC50eTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3BpZXMgYSBWZWN0b3IzRCBvYmplY3QgaW50byBzcGVjaWZpYyByb3cgb2YgdGhlIGNhbGxpbmcgTWF0cml4IG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIHJvdyAgICAgIFRoZSByb3cgZnJvbSB3aGljaCB0byBjb3B5IHRoZSBkYXRhIGZyb20uXG5cdCAqIEBwYXJhbSB2ZWN0b3IzRCBUaGUgVmVjdG9yM0Qgb2JqZWN0IGZyb20gd2hpY2ggdG8gY29weSB0aGUgZGF0YS5cblx0ICovXG5cdHB1YmxpYyBjb3B5Um93RnJvbShyb3c6bnVtYmVyLCB2ZWN0b3IzRDpWZWN0b3IzRCk6dm9pZFxuXHR7XG5cdFx0aWYgKHJvdyA+IDIpIHtcblx0XHRcdHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiQXJndW1lbnRFcnJvciwgUm93IFwiICsgcm93ICsgXCIgb3V0IG9mIGJvdW5kcyBbMCwgLi4uLCAyXVwiKTtcblx0XHR9IGVsc2UgaWYgKHJvdyA9PSAwKSB7XG5cdFx0XHR0aGlzLmEgPSB2ZWN0b3IzRC54O1xuXHRcdFx0dGhpcy5jID0gdmVjdG9yM0QueTtcblx0XHR9IGVsc2UgaWYgKHJvdyA9PSAxKSB7XG5cdFx0XHR0aGlzLmIgPSB2ZWN0b3IzRC54O1xuXHRcdFx0dGhpcy5kID0gdmVjdG9yM0QueTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy50eCA9IHZlY3RvcjNELng7XG5cdFx0XHR0aGlzLnR5ID0gdmVjdG9yM0QueTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29waWVzIHNwZWNpZmljIHJvdyBvZiB0aGUgY2FsbGluZyBNYXRyaXggb2JqZWN0IGludG8gdGhlIFZlY3RvcjNEIG9iamVjdC5cblx0ICogVGhlIHcgZWxlbWVudCBvZiB0aGUgVmVjdG9yM0Qgb2JqZWN0IHdpbGwgbm90IGJlIGNoYW5nZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSByb3cgICAgICBUaGUgcm93IGZyb20gd2hpY2ggdG8gY29weSB0aGUgZGF0YSBmcm9tLlxuXHQgKiBAcGFyYW0gdmVjdG9yM0QgVGhlIFZlY3RvcjNEIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNvcHkgdGhlIGRhdGEuXG5cdCAqL1xuXHRwdWJsaWMgY29weVJvd1RvKHJvdzpudW1iZXIsIHZlY3RvcjNEOlZlY3RvcjNEKTp2b2lkXG5cdHtcblx0XHRpZiAocm93ID4gMikge1xuXHRcdFx0dGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJBcmd1bWVudEVycm9yLCBSb3cgXCIgKyByb3cgKyBcIiBvdXQgb2YgYm91bmRzIFswLCAuLi4sIDJdXCIpO1xuXHRcdH0gZWxzZSBpZiAocm93ID09IDApIHtcblx0XHRcdHZlY3RvcjNELnggPSB0aGlzLmE7XG5cdFx0XHR2ZWN0b3IzRC55ID0gdGhpcy5iO1xuXHRcdFx0dmVjdG9yM0QueiA9IHRoaXMudHg7XG5cdFx0fSBlbHNlIGlmIChyb3cgPT0gMSkge1xuXHRcdFx0dmVjdG9yM0QueCA9IHRoaXMuYztcblx0XHRcdHZlY3RvcjNELnkgPSB0aGlzLmQ7XG5cdFx0XHR2ZWN0b3IzRC56ID0gdGhpcy50eTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmVjdG9yM0Quc2V0VG8oMCwgMCwgMSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEluY2x1ZGVzIHBhcmFtZXRlcnMgZm9yIHNjYWxpbmcsIHJvdGF0aW9uLCBhbmQgdHJhbnNsYXRpb24uIFdoZW4gYXBwbGllZFxuXHQgKiB0byBhIG1hdHJpeCBpdCBzZXRzIHRoZSBtYXRyaXgncyB2YWx1ZXMgYmFzZWQgb24gdGhvc2UgcGFyYW1ldGVycy5cblx0ICpcblx0ICogPHA+VXNpbmcgdGhlIDxjb2RlPmNyZWF0ZUJveCgpPC9jb2RlPiBtZXRob2QgbGV0cyB5b3Ugb2J0YWluIHRoZSBzYW1lXG5cdCAqIG1hdHJpeCBhcyB5b3Ugd291bGQgaWYgeW91IGFwcGxpZWQgdGhlIDxjb2RlPmlkZW50aXR5KCk8L2NvZGU+LFxuXHQgKiA8Y29kZT5yb3RhdGUoKTwvY29kZT4sIDxjb2RlPnNjYWxlKCk8L2NvZGU+LCBhbmQgPGNvZGU+dHJhbnNsYXRlKCk8L2NvZGU+XG5cdCAqIG1ldGhvZHMgaW4gc3VjY2Vzc2lvbi4gRm9yIGV4YW1wbGUsIDxjb2RlPm1hdDEuY3JlYXRlQm94KDIsMixNYXRoLlBJLzQsXG5cdCAqIDEwMCwgMTAwKTwvY29kZT4gaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgZm9sbG93aW5nOjwvcD5cblx0ICpcblx0ICogQHBhcmFtIHNjYWxlWCAgIFRoZSBmYWN0b3IgYnkgd2hpY2ggdG8gc2NhbGUgaG9yaXpvbnRhbGx5LlxuXHQgKiBAcGFyYW0gc2NhbGVZICAgVGhlIGZhY3RvciBieSB3aGljaCBzY2FsZSB2ZXJ0aWNhbGx5LlxuXHQgKiBAcGFyYW0gcm90YXRpb24gVGhlIGFtb3VudCB0byByb3RhdGUsIGluIHJhZGlhbnMuXG5cdCAqIEBwYXJhbSB0eCAgICAgICBUaGUgbnVtYmVyIG9mIHBpeGVscyB0byB0cmFuc2xhdGUobW92ZSkgdG8gdGhlIHJpZ2h0XG5cdCAqICAgICAgICAgICAgICAgICBhbG9uZyB0aGUgPGk+eDwvaT4gYXhpcy5cblx0ICogQHBhcmFtIHR5ICAgICAgIFRoZSBudW1iZXIgb2YgcGl4ZWxzIHRvIHRyYW5zbGF0ZShtb3ZlKSBkb3duIGFsb25nIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgPGk+eTwvaT4gYXhpcy5cblx0ICovXG5cdHB1YmxpYyBjcmVhdGVCb3goc2NhbGVYOm51bWJlciwgc2NhbGVZOm51bWJlciwgcm90YXRpb246bnVtYmVyID0gMCwgdHg6bnVtYmVyID0gMCwgdHk6bnVtYmVyID0gMCk6dm9pZFxuXHR7XG5cdFx0dGhpcy5hID0gc2NhbGVYO1xuXHRcdHRoaXMuZCA9IHNjYWxlWTtcblx0XHR0aGlzLmIgPSByb3RhdGlvbjtcblx0XHR0aGlzLnR4ID0gdHg7XG5cdFx0dGhpcy50eSA9IHR5O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIHNwZWNpZmljIHN0eWxlIG9mIG1hdHJpeCBleHBlY3RlZCBieSB0aGVcblx0ICogPGNvZGU+YmVnaW5HcmFkaWVudEZpbGwoKTwvY29kZT4gYW5kIDxjb2RlPmxpbmVHcmFkaWVudFN0eWxlKCk8L2NvZGU+XG5cdCAqIG1ldGhvZHMgb2YgdGhlIEdyYXBoaWNzIGNsYXNzLiBXaWR0aCBhbmQgaGVpZ2h0IGFyZSBzY2FsZWQgdG8gYVxuXHQgKiA8Y29kZT5zY2FsZVg8L2NvZGU+Lzxjb2RlPnNjYWxlWTwvY29kZT4gcGFpciBhbmQgdGhlXG5cdCAqIDxjb2RlPnR4PC9jb2RlPi88Y29kZT50eTwvY29kZT4gdmFsdWVzIGFyZSBvZmZzZXQgYnkgaGFsZiB0aGUgd2lkdGggYW5kXG5cdCAqIGhlaWdodC5cblx0ICpcblx0ICogPHA+Rm9yIGV4YW1wbGUsIGNvbnNpZGVyIGEgZ3JhZGllbnQgd2l0aCB0aGUgZm9sbG93aW5nXG5cdCAqIGNoYXJhY3RlcmlzdGljczo8L3A+XG5cdCAqXG5cdCAqIDx1bD5cblx0ICogICA8bGk+PGNvZGU+R3JhZGllbnRUeXBlLkxJTkVBUjwvY29kZT48L2xpPlxuXHQgKiAgIDxsaT5Ud28gY29sb3JzLCBncmVlbiBhbmQgYmx1ZSwgd2l0aCB0aGUgcmF0aW9zIGFycmF5IHNldCB0byA8Y29kZT5bMCxcblx0ICogMjU1XTwvY29kZT48L2xpPlxuXHQgKiAgIDxsaT48Y29kZT5TcHJlYWRNZXRob2QuUEFEPC9jb2RlPjwvbGk+XG5cdCAqICAgPGxpPjxjb2RlPkludGVycG9sYXRpb25NZXRob2QuTElORUFSX1JHQjwvY29kZT48L2xpPlxuXHQgKiA8L3VsPlxuXHQgKlxuXHQgKiA8cD5UaGUgZm9sbG93aW5nIGlsbHVzdHJhdGlvbnMgc2hvdyBncmFkaWVudHMgaW4gd2hpY2ggdGhlIG1hdHJpeCB3YXNcblx0ICogZGVmaW5lZCB1c2luZyB0aGUgPGNvZGU+Y3JlYXRlR3JhZGllbnRCb3goKTwvY29kZT4gbWV0aG9kIHdpdGggZGlmZmVyZW50XG5cdCAqIHBhcmFtZXRlciBzZXR0aW5nczo8L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSB3aWR0aCAgICBUaGUgd2lkdGggb2YgdGhlIGdyYWRpZW50IGJveC5cblx0ICogQHBhcmFtIGhlaWdodCAgIFRoZSBoZWlnaHQgb2YgdGhlIGdyYWRpZW50IGJveC5cblx0ICogQHBhcmFtIHJvdGF0aW9uIFRoZSBhbW91bnQgdG8gcm90YXRlLCBpbiByYWRpYW5zLlxuXHQgKiBAcGFyYW0gdHggICAgICAgVGhlIGRpc3RhbmNlLCBpbiBwaXhlbHMsIHRvIHRyYW5zbGF0ZSB0byB0aGUgcmlnaHQgYWxvbmdcblx0ICogICAgICAgICAgICAgICAgIHRoZSA8aT54PC9pPiBheGlzLiBUaGlzIHZhbHVlIGlzIG9mZnNldCBieSBoYWxmIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgPGNvZGU+d2lkdGg8L2NvZGU+IHBhcmFtZXRlci5cblx0ICogQHBhcmFtIHR5ICAgICAgIFRoZSBkaXN0YW5jZSwgaW4gcGl4ZWxzLCB0byB0cmFuc2xhdGUgZG93biBhbG9uZyB0aGVcblx0ICogICAgICAgICAgICAgICAgIDxpPnk8L2k+IGF4aXMuIFRoaXMgdmFsdWUgaXMgb2Zmc2V0IGJ5IGhhbGYgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgICA8Y29kZT5oZWlnaHQ8L2NvZGU+IHBhcmFtZXRlci5cblx0ICovXG5cdHB1YmxpYyBjcmVhdGVHcmFkaWVudEJveCh3aWR0aDpudW1iZXIsIGhlaWdodDpudW1iZXIsIHJvdGF0aW9uOm51bWJlciA9IDAsIHR4Om51bWJlciA9IDAsIHR5Om51bWJlciA9IDApOnZvaWRcblx0e1xuXHRcdHRoaXMuYSA9IHdpZHRoLzE2MzguNDtcblx0XHR0aGlzLmQgPSBoZWlnaHQvMTYzOC40O1xuXG5cdFx0aWYgKHJvdGF0aW9uICE9IDAuMCkge1xuXHRcdFx0dmFyIGNvcyA9IE1hdGguY29zKHJvdGF0aW9uKTtcblx0XHRcdHZhciBzaW4gPSBNYXRoLnNpbihyb3RhdGlvbik7XG5cblx0XHRcdHRoaXMuYiA9IHNpbip0aGlzLmQ7XG5cdFx0XHR0aGlzLmMgPSAtc2luKnRoaXMuYTtcblx0XHRcdHRoaXMuYSAqPSBjb3M7XG5cdFx0XHR0aGlzLmQgKj0gY29zO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmIgPSB0aGlzLmMgPSAwO1xuXHRcdH1cblxuXHRcdHRoaXMudHggPSB0eCArIHdpZHRoLzI7XG5cdFx0dGhpcy50eSA9IHR5ICsgaGVpZ2h0LzI7XG5cdH1cblxuXHQvKipcblx0ICogR2l2ZW4gYSBwb2ludCBpbiB0aGUgcHJldHJhbnNmb3JtIGNvb3JkaW5hdGUgc3BhY2UsIHJldHVybnMgdGhlXG5cdCAqIGNvb3JkaW5hdGVzIG9mIHRoYXQgcG9pbnQgYWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9uIG9jY3Vycy4gVW5saWtlIHRoZVxuXHQgKiBzdGFuZGFyZCB0cmFuc2Zvcm1hdGlvbiBhcHBsaWVkIHVzaW5nIHRoZSA8Y29kZT50cmFuc2Zvcm1Qb2ludCgpPC9jb2RlPlxuXHQgKiBtZXRob2QsIHRoZSA8Y29kZT5kZWx0YVRyYW5zZm9ybVBvaW50KCk8L2NvZGU+IG1ldGhvZCdzIHRyYW5zZm9ybWF0aW9uXG5cdCAqIGRvZXMgbm90IGNvbnNpZGVyIHRoZSB0cmFuc2xhdGlvbiBwYXJhbWV0ZXJzIDxjb2RlPnR4PC9jb2RlPiBhbmRcblx0ICogPGNvZGU+dHk8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0gcG9pbnQgVGhlIHBvaW50IGZvciB3aGljaCB5b3Ugd2FudCB0byBnZXQgdGhlIHJlc3VsdCBvZiB0aGUgbWF0cml4XG5cdCAqICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi5cblx0ICogQHJldHVybiBUaGUgcG9pbnQgcmVzdWx0aW5nIGZyb20gYXBwbHlpbmcgdGhlIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbi5cblx0ICovXG5cdHB1YmxpYyBkZWx0YVRyYW5zZm9ybVBvaW50KHBvaW50OlBvaW50KTpQb2ludFxuXHR7XG5cdFx0cmV0dXJuIG5ldyBQb2ludChwb2ludC54KnRoaXMuYSArIHBvaW50LnkqdGhpcy5jLCBwb2ludC54KnRoaXMuYiArIHBvaW50LnkqdGhpcy5kKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGVhY2ggbWF0cml4IHByb3BlcnR5IHRvIGEgdmFsdWUgdGhhdCBjYXVzZXMgYSBudWxsIHRyYW5zZm9ybWF0aW9uLiBBblxuXHQgKiBvYmplY3QgdHJhbnNmb3JtZWQgYnkgYXBwbHlpbmcgYW4gaWRlbnRpdHkgbWF0cml4IHdpbGwgYmUgaWRlbnRpY2FsIHRvIHRoZVxuXHQgKiBvcmlnaW5hbC5cblx0ICpcblx0ICogPHA+QWZ0ZXIgY2FsbGluZyB0aGUgPGNvZGU+aWRlbnRpdHkoKTwvY29kZT4gbWV0aG9kLCB0aGUgcmVzdWx0aW5nIG1hdHJpeFxuXHQgKiBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOiA8Y29kZT5hPC9jb2RlPj0xLCA8Y29kZT5iPC9jb2RlPj0wLFxuXHQgKiA8Y29kZT5jPC9jb2RlPj0wLCA8Y29kZT5kPC9jb2RlPj0xLCA8Y29kZT50eDwvY29kZT49MCxcblx0ICogPGNvZGU+dHk8L2NvZGU+PTAuPC9wPlxuXHQgKlxuXHQgKiA8cD5JbiBtYXRyaXggbm90YXRpb24sIHRoZSBpZGVudGl0eSBtYXRyaXggbG9va3MgbGlrZSB0aGlzOjwvcD5cblx0ICpcblx0ICovXG5cdHB1YmxpYyBpZGVudGl0eSgpOnZvaWRcblx0e1xuXHRcdHRoaXMuYSA9IDE7XG5cdFx0dGhpcy5iID0gMDtcblx0XHR0aGlzLmMgPSAwO1xuXHRcdHRoaXMuZCA9IDE7XG5cdFx0dGhpcy50eCA9IDA7XG5cdFx0dGhpcy50eSA9IDA7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgdGhlIG9wcG9zaXRlIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBtYXRyaXguIFlvdSBjYW4gYXBwbHlcblx0ICogYW4gaW52ZXJ0ZWQgbWF0cml4IHRvIGFuIG9iamVjdCB0byB1bmRvIHRoZSB0cmFuc2Zvcm1hdGlvbiBwZXJmb3JtZWQgd2hlblxuXHQgKiBhcHBseWluZyB0aGUgb3JpZ2luYWwgbWF0cml4LlxuXHQgKi9cblx0cHVibGljIGludmVydCgpOnZvaWRcblx0e1xuXHRcdHZhciBub3JtID0gdGhpcy5hKnRoaXMuZCAtIHRoaXMuYip0aGlzLmM7XG5cblx0XHRpZiAobm9ybSA9PSAwKSB7XG5cdFx0XHR0aGlzLmEgPSB0aGlzLmIgPSB0aGlzLmMgPSB0aGlzLmQgPSAwO1xuXHRcdFx0dGhpcy50eCA9IC10aGlzLnR4O1xuXHRcdFx0dGhpcy50eSA9IC10aGlzLnR5O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRub3JtID0gMS4wL25vcm07XG5cdFx0XHR2YXIgYTEgPSB0aGlzLmQqbm9ybTtcblx0XHRcdHRoaXMuZCA9IHRoaXMuYSpub3JtO1xuXHRcdFx0dGhpcy5hID0gYTE7XG5cdFx0XHR0aGlzLmIgKj0gLW5vcm07XG5cdFx0XHR0aGlzLmMgKj0gLW5vcm07XG5cblx0XHRcdHZhciB0eDEgPSAtdGhpcy5hKnRoaXMudHggLSB0aGlzLmMqdGhpcy50eTtcblx0XHRcdHRoaXMudHkgPSAtdGhpcy5iKnRoaXMudHggLSB0aGlzLmQqdGhpcy50eTtcblx0XHRcdHRoaXMudHggPSB0eDE7XG5cdFx0fVxuXHR9XG5cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG5ldyBNYXRyaXggb2JqZWN0IHRoYXQgaXMgYSBjbG9uZSBvZiB0aGlzIG1hdHJpeCwgd2l0aCBhbiBleGFjdFxuXHQgKiBjb3B5IG9mIHRoZSBjb250YWluZWQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWF0cml4IFRoZSBtYXRyaXggZm9yIHdoaWNoIHlvdSB3YW50IHRvIGdldCB0aGUgcmVzdWx0IG9mIHRoZSBtYXRyaXhcblx0ICogICAgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi5cblx0ICogQHJldHVybiBBIE1hdHJpeCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgbXVsdGlwbHkobWF0cml4Ok1hdHJpeCk6TWF0cml4XG5cdHtcblx0XHR2YXIgcmVzdWx0ID0gbmV3IE1hdHJpeCgpO1xuXG5cdFx0cmVzdWx0LmEgPSB0aGlzLmEqbWF0cml4LmEgKyB0aGlzLmIqbWF0cml4LmM7XG5cdFx0cmVzdWx0LmIgPSB0aGlzLmEqbWF0cml4LmIgKyB0aGlzLmIqbWF0cml4LmQ7XG5cdFx0cmVzdWx0LmMgPSB0aGlzLmMqbWF0cml4LmEgKyB0aGlzLmQqbWF0cml4LmM7XG5cdFx0cmVzdWx0LmQgPSB0aGlzLmMqbWF0cml4LmIgKyB0aGlzLmQqbWF0cml4LmQ7XG5cblx0XHRyZXN1bHQudHggPSB0aGlzLnR4Km1hdHJpeC5hICsgdGhpcy50eSptYXRyaXguYyArIG1hdHJpeC50eDtcblx0XHRyZXN1bHQudHkgPSB0aGlzLnR4Km1hdHJpeC5iICsgdGhpcy50eSptYXRyaXguZCArIG1hdHJpeC50eTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQXBwbGllcyBhIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBNYXRyaXggb2JqZWN0LlxuXHQgKlxuXHQgKiA8cD5UaGUgPGNvZGU+cm90YXRlKCk8L2NvZGU+IG1ldGhvZCBhbHRlcnMgdGhlIDxjb2RlPmE8L2NvZGU+LFxuXHQgKiA8Y29kZT5iPC9jb2RlPiwgPGNvZGU+YzwvY29kZT4sIGFuZCA8Y29kZT5kPC9jb2RlPiBwcm9wZXJ0aWVzIG9mIHRoZVxuXHQgKiBNYXRyaXggb2JqZWN0LiBJbiBtYXRyaXggbm90YXRpb24sIHRoaXMgaXMgdGhlIHNhbWUgYXMgY29uY2F0ZW5hdGluZyB0aGVcblx0ICogY3VycmVudCBtYXRyaXggd2l0aCB0aGUgZm9sbG93aW5nOjwvcD5cblx0ICpcblx0ICogQHBhcmFtIGFuZ2xlIFRoZSByb3RhdGlvbiBhbmdsZSBpbiByYWRpYW5zLlxuXHQgKi9cblx0cHVibGljIHJvdGF0ZShhbmdsZTpudW1iZXIpOnZvaWRcblx0e1xuXHRcdHZhciBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG5cdFx0dmFyIHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcblxuXHRcdHZhciBhMSA9IHRoaXMuYSpjb3MgLSB0aGlzLmIqc2luO1xuXHRcdHRoaXMuYiA9IHRoaXMuYSpzaW4gKyB0aGlzLmIqY29zO1xuXHRcdHRoaXMuYSA9IGExO1xuXG5cdFx0dmFyIGMxID0gdGhpcy5jKmNvcyAtIHRoaXMuZCpzaW47XG5cdFx0dGhpcy5kID0gdGhpcy5jKnNpbiArIHRoaXMuZCpjb3M7XG5cdFx0dGhpcy5jID0gYzE7XG5cblx0XHR2YXIgdHgxID0gdGhpcy50eCpjb3MgLSB0aGlzLnR5KnNpbjtcblx0XHR0aGlzLnR5ID0gdGhpcy50eCpzaW4gKyB0aGlzLnR5KmNvcztcblx0XHR0aGlzLnR4ID0gdHgxO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGxpZXMgYSBzY2FsaW5nIHRyYW5zZm9ybWF0aW9uIHRvIHRoZSBtYXRyaXguIFRoZSA8aT54PC9pPiBheGlzIGlzXG5cdCAqIG11bHRpcGxpZWQgYnkgPGNvZGU+c3g8L2NvZGU+LCBhbmQgdGhlIDxpPnk8L2k+IGF4aXMgaXQgaXMgbXVsdGlwbGllZCBieVxuXHQgKiA8Y29kZT5zeTwvY29kZT4uXG5cdCAqXG5cdCAqIDxwPlRoZSA8Y29kZT5zY2FsZSgpPC9jb2RlPiBtZXRob2QgYWx0ZXJzIHRoZSA8Y29kZT5hPC9jb2RlPiBhbmRcblx0ICogPGNvZGU+ZDwvY29kZT4gcHJvcGVydGllcyBvZiB0aGUgTWF0cml4IG9iamVjdC4gSW4gbWF0cml4IG5vdGF0aW9uLCB0aGlzXG5cdCAqIGlzIHRoZSBzYW1lIGFzIGNvbmNhdGVuYXRpbmcgdGhlIGN1cnJlbnQgbWF0cml4IHdpdGggdGhlIGZvbGxvd2luZ1xuXHQgKiBtYXRyaXg6PC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gc3ggQSBtdWx0aXBsaWVyIHVzZWQgdG8gc2NhbGUgdGhlIG9iamVjdCBhbG9uZyB0aGUgPGk+eDwvaT4gYXhpcy5cblx0ICogQHBhcmFtIHN5IEEgbXVsdGlwbGllciB1c2VkIHRvIHNjYWxlIHRoZSBvYmplY3QgYWxvbmcgdGhlIDxpPnk8L2k+IGF4aXMuXG5cdCAqL1xuXHRwdWJsaWMgc2NhbGUoc3g6bnVtYmVyLCBzeTpudW1iZXIpOnZvaWRcblx0e1xuXHRcdHRoaXMuYSAqPSBzeDtcblx0XHR0aGlzLmIgKj0gc3k7XG5cblx0XHR0aGlzLmMgKj0gc3g7XG5cdFx0dGhpcy5kICo9IHN5O1xuXG5cdFx0dGhpcy50eCAqPSBzeDtcblx0XHR0aGlzLnR5ICo9IHN5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIG1lbWJlcnMgb2YgTWF0cml4IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gYSAgVGhlIHZhbHVlIHRoYXQgYWZmZWN0cyB0aGUgcG9zaXRpb25pbmcgb2YgcGl4ZWxzIGFsb25nIHRoZVxuXHQgKiAgICAgICAgICAgPGk+eDwvaT4gYXhpcyB3aGVuIHNjYWxpbmcgb3Igcm90YXRpbmcgYW4gaW1hZ2UuXG5cdCAqIEBwYXJhbSBiICBUaGUgdmFsdWUgdGhhdCBhZmZlY3RzIHRoZSBwb3NpdGlvbmluZyBvZiBwaXhlbHMgYWxvbmcgdGhlXG5cdCAqICAgICAgICAgICA8aT55PC9pPiBheGlzIHdoZW4gcm90YXRpbmcgb3Igc2tld2luZyBhbiBpbWFnZS5cblx0ICogQHBhcmFtIGMgIFRoZSB2YWx1ZSB0aGF0IGFmZmVjdHMgdGhlIHBvc2l0aW9uaW5nIG9mIHBpeGVscyBhbG9uZyB0aGVcblx0ICogICAgICAgICAgIDxpPng8L2k+IGF4aXMgd2hlbiByb3RhdGluZyBvciBza2V3aW5nIGFuIGltYWdlLlxuXHQgKiBAcGFyYW0gZCAgVGhlIHZhbHVlIHRoYXQgYWZmZWN0cyB0aGUgcG9zaXRpb25pbmcgb2YgcGl4ZWxzIGFsb25nIHRoZVxuXHQgKiAgICAgICAgICAgPGk+eTwvaT4gYXhpcyB3aGVuIHNjYWxpbmcgb3Igcm90YXRpbmcgYW4gaW1hZ2UuLlxuXHQgKiBAcGFyYW0gdHggVGhlIGRpc3RhbmNlIGJ5IHdoaWNoIHRvIHRyYW5zbGF0ZSBlYWNoIHBvaW50IGFsb25nIHRoZSA8aT54PC9pPlxuXHQgKiAgICAgICAgICAgYXhpcy5cblx0ICogQHBhcmFtIHR5IFRoZSBkaXN0YW5jZSBieSB3aGljaCB0byB0cmFuc2xhdGUgZWFjaCBwb2ludCBhbG9uZyB0aGUgPGk+eTwvaT5cblx0ICogICAgICAgICAgIGF4aXMuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VG8oYTpudW1iZXIsIGI6bnVtYmVyLCBjOm51bWJlciwgZDpudW1iZXIsIHR4Om51bWJlciwgdHk6bnVtYmVyKTp2b2lkXG5cdHtcblx0XHR0aGlzLmEgPSBhO1xuXHRcdHRoaXMuYiA9IGI7XG5cdFx0dGhpcy5jID0gYztcblx0XHR0aGlzLmQgPSBkO1xuXHRcdHRoaXMudHggPSB0eDtcblx0XHR0aGlzLnR5ID0gdHk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIHRleHQgdmFsdWUgbGlzdGluZyB0aGUgcHJvcGVydGllcyBvZiB0aGUgTWF0cml4IG9iamVjdC5cblx0ICpcblx0ICogQHJldHVybiBBIHN0cmluZyBjb250YWluaW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIE1hdHJpeFxuXHQgKiAgICAgICAgIG9iamVjdDogPGNvZGU+YTwvY29kZT4sIDxjb2RlPmI8L2NvZGU+LCA8Y29kZT5jPC9jb2RlPixcblx0ICogICAgICAgICA8Y29kZT5kPC9jb2RlPiwgPGNvZGU+dHg8L2NvZGU+LCBhbmQgPGNvZGU+dHk8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIHRvU3RyaW5nKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gXCJbTWF0cml4XSAoYT1cIiArIHRoaXMuYSArIFwiLCBiPVwiICsgdGhpcy5iICsgXCIsIGM9XCIgKyB0aGlzLmMgKyBcIiwgZD1cIiArIHRoaXMuZCArIFwiLCB0eD1cIiArIHRoaXMudHggKyBcIiwgdHk9XCIgKyB0aGlzLnR5ICsgXCIpXCI7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGFwcGx5aW5nIHRoZSBnZW9tZXRyaWMgdHJhbnNmb3JtYXRpb24gcmVwcmVzZW50ZWQgYnlcblx0ICogdGhlIE1hdHJpeCBvYmplY3QgdG8gdGhlIHNwZWNpZmllZCBwb2ludC5cblx0ICpcblx0ICogQHBhcmFtIHBvaW50IFRoZSBwb2ludCBmb3Igd2hpY2ggeW91IHdhbnQgdG8gZ2V0IHRoZSByZXN1bHQgb2YgdGhlIE1hdHJpeFxuXHQgKiAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24uXG5cdCAqIEByZXR1cm4gVGhlIHBvaW50IHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nIHRoZSBNYXRyaXggdHJhbnNmb3JtYXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgdHJhbnNmb3JtUG9pbnQocG9pbnQ6UG9pbnQpOlBvaW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IFBvaW50KHBvaW50LngqdGhpcy5hICsgcG9pbnQueSp0aGlzLmMgKyB0aGlzLnR4LCBwb2ludC54KnRoaXMuYiArIHBvaW50LnkqdGhpcy5kICsgdGhpcy50eSk7XG5cdH1cblxuXHQvKipcblx0ICogVHJhbnNsYXRlcyB0aGUgbWF0cml4IGFsb25nIHRoZSA8aT54PC9pPiBhbmQgPGk+eTwvaT4gYXhlcywgYXMgc3BlY2lmaWVkXG5cdCAqIGJ5IHRoZSA8Y29kZT5keDwvY29kZT4gYW5kIDxjb2RlPmR5PC9jb2RlPiBwYXJhbWV0ZXJzLlxuXHQgKlxuXHQgKiBAcGFyYW0gZHggVGhlIGFtb3VudCBvZiBtb3ZlbWVudCBhbG9uZyB0aGUgPGk+eDwvaT4gYXhpcyB0byB0aGUgcmlnaHQsIGluXG5cdCAqICAgICAgICAgICBwaXhlbHMuXG5cdCAqIEBwYXJhbSBkeSBUaGUgYW1vdW50IG9mIG1vdmVtZW50IGRvd24gYWxvbmcgdGhlIDxpPnk8L2k+IGF4aXMsIGluIHBpeGVscy5cblx0ICovXG5cdHB1YmxpYyB0cmFuc2xhdGUoZHg6bnVtYmVyLCBkeTpudW1iZXIpOnZvaWRcblx0e1xuXHRcdHRoaXMudHggKz0gZHg7XG5cdFx0dGhpcy50eSArPSBkeTtcblx0fVxufVxuXG5leHBvcnQgPSBNYXRyaXg7Il19 \ No newline at end of file diff --git a/lib/core/geom/Matrix.ts b/lib/core/geom/Matrix.ts new file mode 100644 index 00000000..c479861d --- /dev/null +++ b/lib/core/geom/Matrix.ts @@ -0,0 +1,576 @@ +import Point = require("awayjs-core/lib/core/geom/Point"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); + +/** + * The Matrix class represents a transformation matrix that determines how to + * map points from one coordinate space to another. You can perform various + * graphical transformations on a display object by setting the properties of + * a Matrix object, applying that Matrix object to the matrix + * property of a Transform object, and then applying that Transform object as + * the transform property of the display object. These + * transformation functions include translation(x and y + * repositioning), rotation, scaling, and skewing. + * + *

Together these types of transformations are known as affine + * transformations. Affine transformations preserve the straightness of + * lines while transforming, so that parallel lines stay parallel.

+ * + *

To apply a transformation matrix to a display object, you create a + * Transform object, set its matrix property to the + * transformation matrix, and then set the transform property of + * the display object to the Transform object. Matrix objects are also used as + * parameters of some methods, such as the following:

+ * + *
    + *
  • The draw() method of a BitmapData object
  • + *
  • The beginBitmapFill() method, + * beginGradientFill() method, or + * lineGradientStyle() method of a Graphics object
  • + *
+ * + *

A transformation matrix object is a 3 x 3 matrix with the following + * contents:

+ * + *

In traditional transformation matrixes, the u, + * v, and w properties provide extra capabilities. + * The Matrix class can only operate in two-dimensional space, so it always + * assumes that the property values u and v are 0.0, + * and that the property value w is 1.0. The effective values of + * the matrix are as follows:

+ * + *

You can get and set the values of all six of the other properties in a + * Matrix object: a, b, c, + * d, tx, and ty.

+ * + *

The Matrix class supports the four major types of transformations: + * translation, scaling, rotation, and skewing. You can set three of these + * transformations by using specialized methods, as described in the following + * table:

+ * + *

Each transformation function alters the current matrix properties so + * that you can effectively combine multiple transformations. To do this, you + * call more than one transformation function before applying the matrix to + * its display object target(by using the transform property of + * that display object).

+ * + *

Use the new Matrix() constructor to create a Matrix object + * before you can call the methods of the Matrix object.

+ */ +class Matrix +{ + /** + * The value that affects the positioning of pixels along the x axis + * when scaling or rotating an image. + */ + public a:number; + + /** + * The value that affects the positioning of pixels along the y axis + * when rotating or skewing an image. + */ + public b:number; + + /** + * The value that affects the positioning of pixels along the x axis + * when rotating or skewing an image. + */ + public c:number; + + /** + * The value that affects the positioning of pixels along the y axis + * when scaling or rotating an image. + */ + public d:number; + + /** + * The distance by which to translate each point along the x axis. + */ + public tx:number; + + /** + * The distance by which to translate each point along the y axis. + */ + public ty:number; + + /** + * Creates a new Matrix object with the specified parameters. In matrix + * notation, the properties are organized like this: + * + *

If you do not provide any parameters to the new Matrix() + * constructor, it creates an identity matrix with the following + * values:

+ * + *

In matrix notation, the identity matrix looks like this:

+ * + * @param a The value that affects the positioning of pixels along the + * x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the + * y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the + * x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the + * y axis when scaling or rotating an image.. + * @param tx The distance by which to translate each point along the x + * axis. + * @param ty The distance by which to translate each point along the y + * axis. + */ + constructor(a:number = 1, b:number = 0, c:number = 0, d:number = 1, tx:number = 0, ty:number = 0) + { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + + /** + * Returns a new Matrix object that is a clone of this matrix, with an exact + * copy of the contained object. + * + * @return A Matrix object. + */ + public clone():Matrix + { + return new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty); + } + + /** + * Concatenates a matrix with the current matrix, effectively combining the + * geometric effects of the two. In mathematical terms, concatenating two + * matrixes is the same as combining them using matrix multiplication. + * + *

For example, if matrix m1 scales an object by a factor of + * four, and matrix m2 rotates an object by 1.5707963267949 + * radians(Math.PI/2), then m1.concat(m2) + * transforms m1 into a matrix that scales an object by a factor + * of four and rotates the object by Math.PI/2 radians.

+ * + *

This method replaces the source matrix with the concatenated matrix. If + * you want to concatenate two matrixes without altering either of the two + * source matrixes, first copy the source matrix by using the + * clone() method, as shown in the Class Examples section.

+ * + * @param matrix The matrix to be concatenated to the source matrix. + */ + public concat(matrix:Matrix):void + { + var a1 = this.a*matrix.a + this.b*matrix.c; + this.b = this.a*matrix.b + this.b*matrix.d; + this.a = a1; + + var c1 = this.c*matrix.a + this.d*matrix.c; + this.d = this.c*matrix.b + this.d*matrix.d; + + this.c = c1; + + var tx1 = this.tx*matrix.a + this.ty*matrix.c + matrix.tx; + this.ty = this.tx*matrix.b + this.ty*matrix.d + matrix.ty; + this.tx = tx1; + } + + /** + * Copies a Vector3D object into specific column of the calling Matrix3D + * object. + * + * @param column The column from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + public copyColumnFrom(column:number, vector3D:Vector3D):void + { + if (column > 2) { + throw "Column " + column + " out of bounds (2)"; + } else if (column == 0) { + this.a = vector3D.x; + this.c = vector3D.y; + } else if (column == 1) { + this.b = vector3D.x; + this.d = vector3D.y; + } else { + this.tx = vector3D.x; + this.ty = vector3D.y; + } + } + + /** + * Copies specific column of the calling Matrix object into the Vector3D + * object. The w element of the Vector3D object will not be changed. + * + * @param column The column from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + public copyColumnTo(column:number, vector3D:Vector3D):void + { + if (column > 2) { + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 2]"); + } else if (column == 0) { + vector3D.x = this.a; + vector3D.y = this.c; + vector3D.z = 0; + } else if (column == 1) { + vector3D.x = this.b; + vector3D.y = this.d; + vector3D.z = 0; + } else { + vector3D.x = this.tx; + vector3D.y = this.ty; + vector3D.z = 1; + } + } + + /** + * Copies all of the matrix data from the source Point object into the + * calling Matrix object. + * + * @param sourceMatrix The Matrix object from which to copy the data. + */ + public copyFrom(sourceMatrix:Matrix):void + { + this.a = sourceMatrix.a; + this.b = sourceMatrix.b; + this.c = sourceMatrix.c; + this.d = sourceMatrix.d; + this.tx = sourceMatrix.tx; + this.ty = sourceMatrix.ty; + } + + /** + * Copies a Vector3D object into specific row of the calling Matrix object. + * + * @param row The row from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + public copyRowFrom(row:number, vector3D:Vector3D):void + { + if (row > 2) { + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); + } else if (row == 0) { + this.a = vector3D.x; + this.c = vector3D.y; + } else if (row == 1) { + this.b = vector3D.x; + this.d = vector3D.y; + } else { + this.tx = vector3D.x; + this.ty = vector3D.y; + } + } + + /** + * Copies specific row of the calling Matrix object into the Vector3D object. + * The w element of the Vector3D object will not be changed. + * + * @param row The row from which to copy the data from. + * @param vector3D The Vector3D object from which to copy the data. + */ + public copyRowTo(row:number, vector3D:Vector3D):void + { + if (row > 2) { + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); + } else if (row == 0) { + vector3D.x = this.a; + vector3D.y = this.b; + vector3D.z = this.tx; + } else if (row == 1) { + vector3D.x = this.c; + vector3D.y = this.d; + vector3D.z = this.ty; + } else { + vector3D.setTo(0, 0, 1); + } + } + + /** + * Includes parameters for scaling, rotation, and translation. When applied + * to a matrix it sets the matrix's values based on those parameters. + * + *

Using the createBox() method lets you obtain the same + * matrix as you would if you applied the identity(), + * rotate(), scale(), and translate() + * methods in succession. For example, mat1.createBox(2,2,Math.PI/4, + * 100, 100) has the same effect as the following:

+ * + * @param scaleX The factor by which to scale horizontally. + * @param scaleY The factor by which scale vertically. + * @param rotation The amount to rotate, in radians. + * @param tx The number of pixels to translate(move) to the right + * along the x axis. + * @param ty The number of pixels to translate(move) down along the + * y axis. + */ + public createBox(scaleX:number, scaleY:number, rotation:number = 0, tx:number = 0, ty:number = 0):void + { + this.a = scaleX; + this.d = scaleY; + this.b = rotation; + this.tx = tx; + this.ty = ty; + } + + /** + * Creates the specific style of matrix expected by the + * beginGradientFill() and lineGradientStyle() + * methods of the Graphics class. Width and height are scaled to a + * scaleX/scaleY pair and the + * tx/ty values are offset by half the width and + * height. + * + *

For example, consider a gradient with the following + * characteristics:

+ * + *
    + *
  • GradientType.LINEAR
  • + *
  • Two colors, green and blue, with the ratios array set to [0, + * 255]
  • + *
  • SpreadMethod.PAD
  • + *
  • InterpolationMethod.LINEAR_RGB
  • + *
+ * + *

The following illustrations show gradients in which the matrix was + * defined using the createGradientBox() method with different + * parameter settings:

+ * + * @param width The width of the gradient box. + * @param height The height of the gradient box. + * @param rotation The amount to rotate, in radians. + * @param tx The distance, in pixels, to translate to the right along + * the x axis. This value is offset by half of the + * width parameter. + * @param ty The distance, in pixels, to translate down along the + * y axis. This value is offset by half of the + * height parameter. + */ + public createGradientBox(width:number, height:number, rotation:number = 0, tx:number = 0, ty:number = 0):void + { + this.a = width/1638.4; + this.d = height/1638.4; + + if (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 = this.c = 0; + } + + this.tx = tx + width/2; + this.ty = ty + height/2; + } + + /** + * Given a point in the pretransform coordinate space, returns the + * coordinates of that point after the transformation occurs. Unlike the + * standard transformation applied using the transformPoint() + * method, the deltaTransformPoint() method's transformation + * does not consider the translation parameters tx and + * ty. + * + * @param point The point for which you want to get the result of the matrix + * transformation. + * @return The point resulting from applying the matrix transformation. + */ + public deltaTransformPoint(point:Point):Point + { + return new Point(point.x*this.a + point.y*this.c, point.x*this.b + point.y*this.d); + } + + /** + * Sets each matrix property to a value that causes a null transformation. An + * object transformed by applying an identity matrix will be identical to the + * original. + * + *

After calling the identity() method, the resulting matrix + * has the following properties: a=1, b=0, + * c=0, d=1, tx=0, + * ty=0.

+ * + *

In matrix notation, the identity matrix looks like this:

+ * + */ + public identity():void + { + this.a = 1; + this.b = 0; + this.c = 0; + this.d = 1; + this.tx = 0; + this.ty = 0; + } + + /** + * Performs the opposite transformation of the original matrix. You can apply + * an inverted matrix to an object to undo the transformation performed when + * applying the original matrix. + */ + public invert():void + { + var norm = this.a*this.d - this.b*this.c; + + if (norm == 0) { + this.a = this.b = this.c = this.d = 0; + this.tx = -this.tx; + this.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.ty = -this.b*this.tx - this.d*this.ty; + this.tx = tx1; + } + } + + + /** + * Returns a new Matrix object that is a clone of this matrix, with an exact + * copy of the contained object. + * + * @param matrix The matrix for which you want to get the result of the matrix + * transformation. + * @return A Matrix object. + */ + public multiply(matrix:Matrix):Matrix + { + var result = new Matrix(); + + result.a = this.a*matrix.a + this.b*matrix.c; + result.b = this.a*matrix.b + this.b*matrix.d; + result.c = this.c*matrix.a + this.d*matrix.c; + result.d = this.c*matrix.b + this.d*matrix.d; + + result.tx = this.tx*matrix.a + this.ty*matrix.c + matrix.tx; + result.ty = this.tx*matrix.b + this.ty*matrix.d + matrix.ty; + + return result; + } + + /** + * Applies a rotation transformation to the Matrix object. + * + *

The rotate() method alters the a, + * b, c, and d properties of the + * Matrix object. In matrix notation, this is the same as concatenating the + * current matrix with the following:

+ * + * @param angle The rotation angle in radians. + */ + public rotate(angle:number):void + { + var cos = Math.cos(angle); + var sin = Math.sin(angle); + + 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.ty = this.tx*sin + this.ty*cos; + this.tx = tx1; + } + + /** + * Applies a scaling transformation to the matrix. The x axis is + * multiplied by sx, and the y axis it is multiplied by + * sy. + * + *

The scale() method alters the a and + * d properties of the Matrix object. In matrix notation, this + * is the same as concatenating the current matrix with the following + * matrix:

+ * + * @param sx A multiplier used to scale the object along the x axis. + * @param sy A multiplier used to scale the object along the y axis. + */ + public scale(sx:number, sy:number):void + { + this.a *= sx; + this.b *= sy; + + this.c *= sx; + this.d *= sy; + + this.tx *= sx; + this.ty *= sy; + } + + /** + * Sets the members of Matrix to the specified values. + * + * @param a The value that affects the positioning of pixels along the + * x axis when scaling or rotating an image. + * @param b The value that affects the positioning of pixels along the + * y axis when rotating or skewing an image. + * @param c The value that affects the positioning of pixels along the + * x axis when rotating or skewing an image. + * @param d The value that affects the positioning of pixels along the + * y axis when scaling or rotating an image.. + * @param tx The distance by which to translate each point along the x + * axis. + * @param ty The distance by which to translate each point along the y + * axis. + */ + public setTo(a:number, b:number, c:number, d:number, tx:number, ty:number):void + { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + this.tx = tx; + this.ty = ty; + } + + /** + * Returns a text value listing the properties of the Matrix object. + * + * @return A string containing the values of the properties of the Matrix + * object: a, b, c, + * d, tx, and ty. + */ + public toString():string + { + return "[Matrix] (a=" + this.a + ", b=" + this.b + ", c=" + this.c + ", d=" + this.d + ", tx=" + this.tx + ", ty=" + this.ty + ")"; + } + + /** + * Returns the result of applying the geometric transformation represented by + * the Matrix object to the specified point. + * + * @param point The point for which you want to get the result of the Matrix + * transformation. + * @return The point resulting from applying the Matrix transformation. + */ + public transformPoint(point:Point):Point + { + return new Point(point.x*this.a + point.y*this.c + this.tx, point.x*this.b + point.y*this.d + this.ty); + } + + /** + * Translates the matrix along the x and y axes, as specified + * by the dx and dy parameters. + * + * @param dx The amount of movement along the x axis to the right, in + * pixels. + * @param dy The amount of movement down along the y axis, in pixels. + */ + public translate(dx:number, dy:number):void + { + this.tx += dx; + this.ty += dy; + } +} + +export = Matrix; \ No newline at end of file diff --git a/lib/core/geom/Matrix3D.js b/lib/core/geom/Matrix3D.js new file mode 100755 index 00000000..ac4048db --- /dev/null +++ b/lib/core/geom/Matrix3D.js @@ -0,0 +1,653 @@ +var Orientation3D = require("awayjs-core/lib/core/geom/Orientation3D"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); + +var Matrix3D = (function () { + /** + * Creates a Matrix3D object. + */ + function Matrix3D(v) { + if (typeof v === "undefined") { v = null; } + if (v != null && v.length == 16) + this.rawData = v.concat(); + else + this.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + } + /** + * Appends the matrix by multiplying another Matrix3D object by the current Matrix3D object. + */ + Matrix3D.prototype.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; + }; + + /** + * Appends an incremental rotation to a Matrix3D object. + */ + Matrix3D.prototype.appendRotation = function (degrees, axis) { + var m = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); + + this.append(m); + }; + + /** + * Appends an incremental scale change along the x, y, and z axes to a Matrix3D object. + */ + Matrix3D.prototype.appendScale = function (xScale, yScale, zScale) { + this.append(new 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])); + }; + + /** + * Appends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. + */ + Matrix3D.prototype.appendTranslation = function (x, y, z) { + this.rawData[12] += x; + this.rawData[13] += y; + this.rawData[14] += z; + }; + + /** + * Returns a new Matrix3D object that is an exact copy of the current Matrix3D object. + */ + Matrix3D.prototype.clone = function () { + return new Matrix3D(this.rawData.slice(0)); + }; + + /** + * Copies a Vector3D object into specific column of the calling Matrix3D object. + */ + Matrix3D.prototype.copyColumnFrom = function (column, vector3D) { + switch (column) { + case 0: + this.rawData[0] = vector3D.x; + this.rawData[1] = vector3D.y; + this.rawData[2] = vector3D.z; + this.rawData[3] = vector3D.w; + break; + case 1: + this.rawData[4] = vector3D.x; + this.rawData[5] = vector3D.y; + this.rawData[6] = vector3D.z; + this.rawData[7] = vector3D.w; + break; + case 2: + this.rawData[8] = vector3D.x; + this.rawData[9] = vector3D.y; + this.rawData[10] = vector3D.z; + this.rawData[11] = vector3D.w; + break; + case 3: + this.rawData[12] = vector3D.x; + this.rawData[13] = vector3D.y; + this.rawData[14] = vector3D.z; + this.rawData[15] = vector3D.w; + break; + default: + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); + } + }; + + /** + * Copies specific column of the calling Matrix3D object into the Vector3D object. + */ + Matrix3D.prototype.copyColumnTo = function (column, vector3D) { + switch (column) { + case 0: + vector3D.x = this.rawData[0]; + vector3D.y = this.rawData[1]; + vector3D.z = this.rawData[2]; + vector3D.w = this.rawData[3]; + break; + case 1: + vector3D.x = this.rawData[4]; + vector3D.y = this.rawData[5]; + vector3D.z = this.rawData[6]; + vector3D.w = this.rawData[7]; + break; + case 2: + vector3D.x = this.rawData[8]; + vector3D.y = this.rawData[9]; + vector3D.z = this.rawData[10]; + vector3D.w = this.rawData[11]; + break; + case 3: + vector3D.x = this.rawData[12]; + vector3D.y = this.rawData[13]; + vector3D.z = this.rawData[14]; + vector3D.w = this.rawData[15]; + break; + default: + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); + } + }; + + /** + * Copies all of the matrix data from the source Matrix3D object into the calling Matrix3D object. + */ + Matrix3D.prototype.copyFrom = function (sourceMatrix3D) { + var len = sourceMatrix3D.rawData.length; + for (var c = 0; c < len; c++) + this.rawData[c] = sourceMatrix3D.rawData[c]; + }; + + Matrix3D.prototype.copyRawDataFrom = function (vector, index, transpose) { + if (typeof index === "undefined") { index = 0; } + if (typeof transpose === "undefined") { transpose = false; } + if (transpose) + this.transpose(); + + var len = vector.length - index; + for (var c = 0; c < len; c++) + this.rawData[c] = vector[c + index]; + + if (transpose) + this.transpose(); + }; + + Matrix3D.prototype.copyRawDataTo = function (vector, index, transpose) { + if (typeof index === "undefined") { index = 0; } + if (typeof transpose === "undefined") { transpose = false; } + if (transpose) + this.transpose(); + + var len = this.rawData.length; + for (var c = 0; c < len; c++) + vector[c + index] = this.rawData[c]; + + if (transpose) + this.transpose(); + }; + + /** + * Copies a Vector3D object into specific row of the calling Matrix3D object. + */ + Matrix3D.prototype.copyRowFrom = function (row, vector3D) { + switch (row) { + case 0: + this.rawData[0] = vector3D.x; + this.rawData[4] = vector3D.y; + this.rawData[8] = vector3D.z; + this.rawData[12] = vector3D.w; + break; + case 1: + this.rawData[1] = vector3D.x; + this.rawData[5] = vector3D.y; + this.rawData[9] = vector3D.z; + this.rawData[13] = vector3D.w; + break; + case 2: + this.rawData[2] = vector3D.x; + this.rawData[6] = vector3D.y; + this.rawData[10] = vector3D.z; + this.rawData[14] = vector3D.w; + break; + case 3: + this.rawData[3] = vector3D.x; + this.rawData[7] = vector3D.y; + this.rawData[11] = vector3D.z; + this.rawData[15] = vector3D.w; + break; + default: + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); + } + }; + + /** + * Copies specific row of the calling Matrix3D object into the Vector3D object. + */ + Matrix3D.prototype.copyRowTo = function (row, vector3D) { + switch (row) { + case 0: + vector3D.x = this.rawData[0]; + vector3D.y = this.rawData[4]; + vector3D.z = this.rawData[8]; + vector3D.w = this.rawData[12]; + break; + case 1: + vector3D.x = this.rawData[1]; + vector3D.y = this.rawData[5]; + vector3D.z = this.rawData[9]; + vector3D.w = this.rawData[13]; + break; + case 2: + vector3D.x = this.rawData[2]; + vector3D.y = this.rawData[6]; + vector3D.z = this.rawData[10]; + vector3D.w = this.rawData[14]; + break; + case 3: + vector3D.x = this.rawData[3]; + vector3D.y = this.rawData[7]; + vector3D.z = this.rawData[11]; + vector3D.w = this.rawData[15]; + break; + default: + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); + } + }; + + /** + * Copies this Matrix3D object into a destination Matrix3D object. + */ + Matrix3D.prototype.copyToMatrix3D = function (dest) { + dest.rawData = this.rawData.slice(0); + }; + + /** + * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector3D objects. + */ + Matrix3D.prototype.decompose = function (orientationStyle) { + if (typeof orientationStyle === "undefined") { orientationStyle = "eulerAngles"; } + var q; + + // Initial Tests - Not OK + var vec = []; + var m = this.clone(); + var mr = m.rawData; + + var pos = new Vector3D(mr[12], mr[13], mr[14]); + mr[12] = 0; + mr[13] = 0; + mr[14] = 0; + + var scale = new 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 Vector3D(); + + switch (orientationStyle) { + case Orientation3D.AXIS_ANGLE: + rot.w = Math.acos((mr[0] + mr[5] + mr[10] - 1) / 2); + + var len = Math.sqrt((mr[6] - mr[9]) * (mr[6] - mr[9]) + (mr[8] - mr[2]) * (mr[8] - mr[2]) + (mr[1] - mr[4]) * (mr[1] - mr[4])); + rot.x = (mr[6] - mr[9]) / len; + rot.y = (mr[8] - mr[2]) / len; + rot.z = (mr[1] - mr[4]) / len; + + break; + case Orientation3D.QUATERNION: + var tr = mr[0] + mr[5] + mr[10]; + + if (tr > 0) { + rot.w = Math.sqrt(1 + tr) / 2; + + rot.x = (mr[6] - mr[9]) / (4 * rot.w); + rot.y = (mr[8] - mr[2]) / (4 * rot.w); + rot.z = (mr[1] - mr[4]) / (4 * rot.w); + } else if ((mr[0] > mr[5]) && (mr[0] > mr[10])) { + rot.x = Math.sqrt(1 + mr[0] - mr[5] - mr[10]) / 2; + + rot.w = (mr[6] - mr[9]) / (4 * rot.x); + rot.y = (mr[1] + mr[4]) / (4 * rot.x); + rot.z = (mr[8] + mr[2]) / (4 * rot.x); + } else if (mr[5] > mr[10]) { + rot.y = Math.sqrt(1 + mr[5] - mr[0] - mr[10]) / 2; + + rot.x = (mr[1] + mr[4]) / (4 * rot.y); + rot.w = (mr[8] - mr[2]) / (4 * rot.y); + rot.z = (mr[6] + mr[9]) / (4 * rot.y); + } else { + rot.z = Math.sqrt(1 + mr[10] - mr[0] - mr[5]) / 2; + + rot.x = (mr[8] + mr[2]) / (4 * rot.z); + rot.y = (mr[6] + mr[9]) / (4 * rot.z); + rot.w = (mr[1] - mr[4]) / (4 * rot.z); + } + + break; + case Orientation3D.EULER_ANGLES: + rot.y = Math.asin(-mr[2]); + + //var cos:number = Math.cos(rot.y); + if (mr[2] != 1 && mr[2] != -1) { + 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]); + } + + break; + } + + vec.push(pos); + vec.push(rot); + vec.push(scale); + + return vec; + }; + + /** + * Uses the transformation matrix without its translation elements to transform a Vector3D object from one space + * coordinate to another. + */ + Matrix3D.prototype.deltaTransformVector = function (v) { + var x = v.x; + var y = v.y; + var z = v.z; + + return new Vector3D((x * this.rawData[0] + y * this.rawData[4] + z * this.rawData[8]), (x * this.rawData[1] + y * this.rawData[5] + z * this.rawData[9]), (x * this.rawData[2] + y * this.rawData[6] + z * this.rawData[10]), (x * this.rawData[3] + y * this.rawData[7] + z * this.rawData[11])); + }; + + /** + * Converts the current matrix to an identity or unit matrix. + */ + Matrix3D.prototype.identity = function () { + this.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]; + }; + + /** + * [static] Interpolates the translation, rotation, and scale transformation of one matrix toward those of the target matrix. + */ + Matrix3D.interpolate = function (thisMat, toMat, percent) { + var m = new Matrix3D(); + for (var i = 0; i < 16; ++i) + m.rawData[i] = thisMat.rawData[i] + (toMat.rawData[i] - thisMat.rawData[i]) * percent; + + return m; + }; + + /** + * Interpolates this matrix towards the translation, rotation, and scale transformations of the target matrix. + */ + Matrix3D.prototype.interpolateTo = function (toMat, percent) { + for (var i = 0; i < 16; ++i) + this.rawData[i] = this.rawData[i] + (toMat.rawData[i] - this.rawData[i]) * percent; + }; + + /** + * Inverts the current matrix. + */ + Matrix3D.prototype.invert = function () { + var d = this.determinant; + 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 invertable; + }; + + /* TODO implement pointAt + public pointAt( pos:Vector3D, at:Vector3D = null, up:Vector3D = null ) + { + } + */ + /** + * Prepends a matrix by multiplying the current Matrix3D object by another Matrix3D object. + */ + Matrix3D.prototype.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; + }; + + /** + * Prepends an incremental rotation to a Matrix3D object. + */ + Matrix3D.prototype.prependRotation = function (degrees, axis) { + var m = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); + + /* + if ( pivot != null ) + { + var p:Vector3D = pivot; + m.appendTranslation( p.x, p.y, p.z ); + } + */ + this.prepend(m); + }; + + /** + * Prepends an incremental scale change along the x, y, and z axes to a Matrix3D object. + */ + Matrix3D.prototype.prependScale = function (xScale, yScale, zScale) { + // Initial Tests - OK + this.prepend(new Matrix3D([xScale, 0, 0, 0, 0, yScale, 0, 0, 0, 0, zScale, 0, 0, 0, 0, 1])); + }; + + /** + * Prepends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. + */ + Matrix3D.prototype.prependTranslation = function (x, y, z) { + // Initial Tests - OK + var m = new Matrix3D(); + m.position = new Vector3D(x, y, z); + this.prepend(m); + }; + + // TODO orientationStyle + /** + * Sets the transformation matrix's translation, rotation, and scale settings. + */ + Matrix3D.prototype.recompose = function (components) { + // Initial Tests - OK + if (components.length < 3) + return false; + + //components[2].x == 0 || components[2].y == 0 || components[2].z == 0) return false; + this.identity(); + this.appendScale(components[2].x, components[2].y, components[2].z); + + var angle; + angle = -components[1].x; + this.append(new 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 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 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.position = components[0]; + this.rawData[15] = 1; + + return true; + }; + + Matrix3D.prototype.transformVector = function (v) { + var x = v.x; + var y = v.y; + var z = v.z; + + return new 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]), (x * this.rawData[3] + y * this.rawData[7] + z * this.rawData[11] + this.rawData[15])); + }; + + /** + * Uses the transformation matrix to transform a Vector of Numbers from one coordinate space to another. + */ + Matrix3D.prototype.transformVectors = function (vin, vout) { + // Initial Tests - OK + var i = 0; + var x = 0, y = 0, z = 0; + + while (i + 3 <= vin.length) { + 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; + } + }; + + /** + * Converts the current Matrix3D object to a matrix where the rows and columns are swapped. + */ + Matrix3D.prototype.transpose = function () { + // Initial Tests - OK + var oRawData = this.rawData.slice(0); + + 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]; + }; + + Matrix3D.getAxisRotation = function (x, y, z, degrees) { + // internal class use by rotations which have been tested + var m = new Matrix3D(); + + var rad = degrees * (Math.PI / 180); + var c = Math.cos(rad); + var s = Math.sin(rad); + var t = 1 - c; + var tmp1, tmp2; + + m.rawData[0] = c + x * x * t; + m.rawData[5] = c + y * y * t; + m.rawData[10] = c + z * z * t; + + tmp1 = x * y * t; + tmp2 = z * s; + m.rawData[1] = tmp1 + tmp2; + m.rawData[4] = tmp1 - tmp2; + tmp1 = x * z * t; + tmp2 = y * s; + m.rawData[8] = tmp1 + tmp2; + m.rawData[2] = tmp1 - tmp2; + tmp1 = y * z * t; + tmp2 = x * s; + m.rawData[9] = tmp1 - tmp2; + m.rawData[6] = tmp1 + tmp2; + + return m; + }; + + Object.defineProperty(Matrix3D.prototype, "determinant", { + /** + * [read-only] A Number that determines whether a matrix is invertible. + */ + get: function () { + return ((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])); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Matrix3D.prototype, "position", { + /** + * A Vector3D object that holds the position, the 3D coordinate (x,y,z) of a display object within the + * transformation's frame of reference. + */ + get: function () { + return new Vector3D(this.rawData[12], this.rawData[13], this.rawData[14]); + }, + set: function (value) { + this.rawData[12] = value.x; + this.rawData[13] = value.y; + this.rawData[14] = value.z; + }, + enumerable: true, + configurable: true + }); + + + Matrix3D.prototype.toFixed = function (decimalPlace) { + var magnitude = Math.pow(10, decimalPlace); + return "matrix3d(" + Math.round(this.rawData[0] * magnitude) / magnitude + "," + Math.round(this.rawData[1] * magnitude) / magnitude + "," + Math.round(this.rawData[2] * magnitude) / magnitude + "," + Math.round(this.rawData[3] * magnitude) / magnitude + "," + Math.round(this.rawData[4] * magnitude) / magnitude + "," + Math.round(this.rawData[5] * magnitude) / magnitude + "," + Math.round(this.rawData[6] * magnitude) / magnitude + "," + Math.round(this.rawData[7] * magnitude) / magnitude + "," + Math.round(this.rawData[8] * magnitude) / magnitude + "," + Math.round(this.rawData[9] * magnitude) / magnitude + "," + Math.round(this.rawData[10] * magnitude) / magnitude + "," + Math.round(this.rawData[11] * magnitude) / magnitude + "," + Math.round(this.rawData[12] * magnitude) / magnitude + "," + Math.round(this.rawData[13] * magnitude) / magnitude + "," + Math.round(this.rawData[14] * magnitude) / magnitude + "," + Math.round(this.rawData[15] * magnitude) / magnitude + ")"; + }; + + Matrix3D.prototype.toString = function () { + return "matrix3d(" + Math.round(this.rawData[0] * 1000) / 1000 + "," + Math.round(this.rawData[1] * 1000) / 1000 + "," + Math.round(this.rawData[2] * 1000) / 1000 + "," + Math.round(this.rawData[3] * 1000) / 1000 + "," + Math.round(this.rawData[4] * 1000) / 1000 + "," + Math.round(this.rawData[5] * 1000) / 1000 + "," + Math.round(this.rawData[6] * 1000) / 1000 + "," + Math.round(this.rawData[7] * 1000) / 1000 + "," + Math.round(this.rawData[8] * 1000) / 1000 + "," + Math.round(this.rawData[9] * 1000) / 1000 + "," + Math.round(this.rawData[10] * 1000) / 1000 + "," + Math.round(this.rawData[11] * 1000) / 1000 + "," + Math.round(this.rawData[12] * 1000) / 1000 + "," + Math.round(this.rawData[13] * 1000) / 1000 + "," + Math.round(this.rawData[14] * 1000) / 1000 + "," + Math.round(this.rawData[15] * 1000) / 1000 + ")"; + }; + return Matrix3D; +})(); + +module.exports = Matrix3D; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9NYXRyaXgzRC50cyJdLCJuYW1lcyI6WyJNYXRyaXgzRCIsIk1hdHJpeDNELmNvbnN0cnVjdG9yIiwiTWF0cml4M0QuYXBwZW5kIiwiTWF0cml4M0QuYXBwZW5kUm90YXRpb24iLCJNYXRyaXgzRC5hcHBlbmRTY2FsZSIsIk1hdHJpeDNELmFwcGVuZFRyYW5zbGF0aW9uIiwiTWF0cml4M0QuY2xvbmUiLCJNYXRyaXgzRC5jb3B5Q29sdW1uRnJvbSIsIk1hdHJpeDNELmNvcHlDb2x1bW5UbyIsIk1hdHJpeDNELmNvcHlGcm9tIiwiTWF0cml4M0QuY29weVJhd0RhdGFGcm9tIiwiTWF0cml4M0QuY29weVJhd0RhdGFUbyIsIk1hdHJpeDNELmNvcHlSb3dGcm9tIiwiTWF0cml4M0QuY29weVJvd1RvIiwiTWF0cml4M0QuY29weVRvTWF0cml4M0QiLCJNYXRyaXgzRC5kZWNvbXBvc2UiLCJNYXRyaXgzRC5kZWx0YVRyYW5zZm9ybVZlY3RvciIsIk1hdHJpeDNELmlkZW50aXR5IiwiTWF0cml4M0QuaW50ZXJwb2xhdGUiLCJNYXRyaXgzRC5pbnRlcnBvbGF0ZVRvIiwiTWF0cml4M0QuaW52ZXJ0IiwiTWF0cml4M0QucHJlcGVuZCIsIk1hdHJpeDNELnByZXBlbmRSb3RhdGlvbiIsIk1hdHJpeDNELnByZXBlbmRTY2FsZSIsIk1hdHJpeDNELnByZXBlbmRUcmFuc2xhdGlvbiIsIk1hdHJpeDNELnJlY29tcG9zZSIsIk1hdHJpeDNELnRyYW5zZm9ybVZlY3RvciIsIk1hdHJpeDNELnRyYW5zZm9ybVZlY3RvcnMiLCJNYXRyaXgzRC50cmFuc3Bvc2UiLCJNYXRyaXgzRC5nZXRBeGlzUm90YXRpb24iLCJNYXRyaXgzRC50b0ZpeGVkIiwiTWF0cml4M0QudG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBLHNFQUE0RTs7QUFFNUUsNERBQW9FO0FBQ3BFLG1FQUF5RTs7QUFFekU7SUFhQ0E7O01BREdBO0lBQ0hBLGtCQUFZQSxDQUFpQkE7UUFBakJDLGdDQUFBQSxDQUFDQSxHQUFZQSxJQUFJQTtBQUFBQSxRQUU1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsSUFBSUEsRUFBRUE7WUFDOUJBLElBQUlBLENBQUNBLE9BQU9BLEdBQUdBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBOztZQUV6QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsQ0FBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBRUEsQ0FBQ0E7SUFDcEVBLENBQUNBO0lBS0REOztNQURHQTtnQ0FDSEEsVUFBY0EsR0FBWUE7UUFFekJFLElBQUlBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBOztRQUU5OUJBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO1FBQy9EQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUMvREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDL0RBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBOztRQUUvREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDL0RBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO1FBQy9EQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUMvREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7O1FBRS9EQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUMvREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDL0RBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO1FBQ2hFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTs7UUFFaEVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO1FBQ2hFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUNoRUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDaEVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO0lBQ2pFQSxDQUFDQTs7SUFLREY7O01BREdBO3dDQUNIQSxVQUFzQkEsT0FBY0EsRUFBRUEsSUFBYUE7UUFFbERHLElBQUlBLENBQUNBLEdBQVlBLFFBQVFBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLE9BQU9BLENBQUNBOztRQUUxRUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDZkEsQ0FBQ0E7O0lBS0RIOztNQURHQTtxQ0FDSEEsVUFBbUJBLE1BQWFBLEVBQUVBLE1BQWFBLEVBQUVBLE1BQWFBO1FBRTdESSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFFQSxNQUFNQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxNQUFNQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxNQUFNQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFFQSxDQUFDQSxDQUFDQTtJQUN2SEEsQ0FBQ0E7O0lBS0RKOztNQURHQTsyQ0FDSEEsVUFBeUJBLENBQVFBLEVBQUVBLENBQVFBLEVBQUVBLENBQVFBO1FBRXBESyxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBO0lBQ3RCQSxDQUFDQTs7SUFLREw7O01BREdBOytCQUNIQTtRQUVDTSxPQUFPQSxJQUFJQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUMzQ0EsQ0FBQ0E7O0lBS0ROOztNQURHQTt3Q0FDSEEsVUFBc0JBLE1BQWFBLEVBQUVBLFFBQWlCQTtRQUVyRE8sUUFBUUEsTUFBTUEsQ0FBQ0E7WUFDZEEsS0FBS0EsQ0FBQ0E7Z0JBQ0xBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUM5QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsQ0FBQ0EsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQzlCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxDQUFDQSxDQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtnQkFDOUJBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUM5QkEsS0FBTUE7QUFBQUEsWUFDUEEsS0FBS0EsQ0FBQ0E7Z0JBQ0xBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUM5QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsQ0FBQ0EsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQzlCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxDQUFDQSxDQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtnQkFDOUJBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUM5QkEsS0FBTUE7QUFBQUEsWUFDUEEsS0FBS0EsQ0FBQ0E7Z0JBQ0xBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUM5QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsQ0FBQ0EsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQzlCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxFQUFFQSxDQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtnQkFDL0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLEVBQUVBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUMvQkEsS0FBTUE7QUFBQUEsWUFDUEEsS0FBS0EsQ0FBQ0E7Z0JBQ0xBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLEVBQUVBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUMvQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsRUFBRUEsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQy9CQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxFQUFFQSxDQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtnQkFDL0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLEVBQUVBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUMvQkEsS0FBTUE7QUFBQUEsWUFDUEE7Z0JBQ0NBLE1BQU1BLElBQUlBLGFBQWFBLENBQUNBLHdCQUF3QkEsR0FBR0EsTUFBTUEsR0FBR0EsNEJBQTRCQSxDQUFDQTtBQUFDQSxTQUMzRkE7SUFDRkEsQ0FBQ0E7O0lBS0RQOztNQURHQTtzQ0FDSEEsVUFBb0JBLE1BQWFBLEVBQUVBLFFBQWlCQTtRQUVuRFEsUUFBUUEsTUFBTUEsQ0FBQ0E7WUFDZEEsS0FBS0EsQ0FBQ0E7Z0JBQ0xBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBO2dCQUM5QkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsQ0FBQ0EsQ0FBRUE7Z0JBQzlCQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxDQUFDQSxDQUFFQTtnQkFDOUJBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBO2dCQUM5QkEsS0FBTUE7QUFBQUEsWUFDUEEsS0FBS0EsQ0FBQ0E7Z0JBQ0xBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBO2dCQUM5QkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsQ0FBQ0EsQ0FBRUE7Z0JBQzlCQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxDQUFDQSxDQUFFQTtnQkFDOUJBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBO2dCQUM5QkEsS0FBTUE7QUFBQUEsWUFDUEEsS0FBS0EsQ0FBQ0E7Z0JBQ0xBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBO2dCQUM5QkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsQ0FBQ0EsQ0FBRUE7Z0JBQzlCQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxFQUFFQSxDQUFFQTtnQkFDL0JBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLEVBQUVBLENBQUVBO2dCQUMvQkEsS0FBTUE7QUFBQUEsWUFDUEEsS0FBS0EsQ0FBQ0E7Z0JBQ0xBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLEVBQUVBLENBQUVBO2dCQUMvQkEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsRUFBRUEsQ0FBRUE7Z0JBQy9CQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxFQUFFQSxDQUFFQTtnQkFDL0JBLFFBQVFBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLEVBQUVBLENBQUVBO2dCQUMvQkEsS0FBTUE7QUFBQUEsWUFDUEE7Z0JBQ0NBLE1BQU1BLElBQUlBLGFBQWFBLENBQUNBLHdCQUF3QkEsR0FB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QUFFQSxDQUFDQSxDQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtnQkFDOUJBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLENBQUNBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUM5QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsRUFBRUEsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQy9CQSxLQUFNQTtBQUFBQSxZQUNQQSxLQUFLQSxDQUFDQTtnQkFDTEEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsQ0FBQ0EsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQzlCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxDQUFDQSxDQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtnQkFDOUJBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLEVBQUVBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUMvQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsRUFBRUEsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQy9CQSxLQUFNQTtBQUFBQSxZQUNQQSxLQUFLQSxDQUFDQTtnQkFDTEEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsQ0FBQ0EsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQzlCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFFQSxDQUFDQSxDQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQTtnQkFDOUJBLElBQUlBLENBQUNBLE9BQU9BLENBQUVBLEVBQUVBLENBQUVBLEdBQUdBLFFBQVFBLENBQUNBLENBQUNBO2dCQUMvQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBRUEsRUFBRUEsQ0FBRUEsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7Z0JBQy9CQSxLQUFNQTtBQUFBQSxZQUNQQTtnQkFDQ0EsTUFBTUEsSUFBSUEsYUFBYUEsQ0FBQ0EscUJBQXFCQSxHQUFHQSxHQUFHQSxHQUFHQSw0QkFBNEJBLENBQUNBO0FBQUNBLFNB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SUFBSUEsR0FBR0EsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDdkRBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1ZBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1ZBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztRQUVWQSxJQUFJQSxLQUFLQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTs7UUFFbkNBLEtBQUtBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1FBQzVEQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUM1REEsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7O1FBRTlEQSxJQUFJQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNsSEEsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRXBCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUNoQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDaEJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLENBQUNBLENBQUNBO1FBQ2hCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUNoQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDaEJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLENBQUNBLENBQUNBO1FBQ2hCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUNoQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDaEJBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLEtBQUtBLENBQUNBLENBQUNBOztRQUVqQkEsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7O1FBRXhCQSxRQUFRQSxnQkFBZ0JBLENBQUNBO1lBQ3hCQSxLQUFLQSxhQUFhQSxDQUFDQSxVQUFVQTtnQkFFNUJBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBOztnQkFFakRBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2dCQUMvSEEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsR0FBR0E7Z0JBQzNCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxHQUFHQTtnQkFDM0JBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLEdBQUdBOztnQkFFM0JBLEtBQU1BO0FBQUFBLFlBQ1BBLEtBQUtBLGFBQWFBLENBQUNBLFVBQVVBO2dCQUU1QkEsSUFBSUEsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7O2dCQUUvQkEsSUFBSUEsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBRUE7b0JBQ1hBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEdBQUNBLENBQUNBOztvQkFFM0JBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLEdBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO29CQUNqQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7b0JBQ2pDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDakNBLE1BQU1BLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUVBO29CQUMvQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7O29CQUUvQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7b0JBQ2pDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtvQkFDakNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLEdBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2lCQUNqQ0EsTUFBTUEsSUFBSUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBRUE7b0JBQzFCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQTs7b0JBRS9DQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtvQkFDakNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLEdBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO29CQUNqQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2pDQSxLQUFNQTtvQkFDTkEsR0FBR0EsQ0FBQ0Es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Q0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDMVFBLENBQUNBOztJQUtEaEI7O01BREdBO2tDQUNIQTtRQUVDaUIsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBRUE7SUFDakVBLENBQUNBOztJQUtEakI7O01BREdBOzJCQUNIQSxVQUFtQkEsT0FBZ0JBLEVBQUVBLEtBQWNBLEVBQUVBLE9BQWNBO1FBRWxFa0IsSUFBSUEsQ0FBQ0EsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7UUFDL0JBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBO1lBQ2pDQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxPQUFPQSxDQUFDQTs7UUFFckZBLE9BQU9BLENBQUNBO0lBQ1RBLENBQUNBOztJQUtEbEI7O01BREdBO3VDQUNIQSxVQUFxQkEsS0FBY0EsRUFBRUEsT0FBY0E7UUFFbERtQixLQUFLQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQTtZQUNqQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsT0FBT0EsQ0FBQ0E7SUFDbkZBLENBQUNBOztJQUtEbkI7O01BREdBO2dDQUNIQTtRQUVDb0IsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsV0FBV0E7UUFDeEJBLElBQUlBLFVBQVVBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLGFBQWFBOztRQUU1Q0EsSUFBSUEsVUFBVUEsQ0FBRUE7WUFDZkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7WUFDUEEsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDaENBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO1lBQ2hDQSxJQUFJQSxHQUFHQSxHQUFVQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUNoQ0EsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDakNBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO1lBQ2hDQSxJQUFJQSxHQUFHQSxHQUFVQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUNoQ0EsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDaENBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBO1lBQ2pDQSxJQUFJQSxHQUFHQSxHQUFVQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUNoQ0EsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDaENBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBO1lBQ2pDQSxJQUFJQSxHQUFHQSxHQUFVQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNqQ0EsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDaENBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO1lBQ2hDQSxJQUFJQSxHQUFHQSxHQUFVQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNqQ0EsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7O1lBRWpDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUNqR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDbEdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLENBQUNBO1lBQ2pHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUNsR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDbEdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLENBQUNBO1lBQ2pHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUNsR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDakdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLENBQUNBO1lBQ2pHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUNsR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDbEdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLENBQUNBO1lBQ25HQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUNuR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDbEdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLENBQUNBLENBQUNBO1lBQ25HQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxDQUFDQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNsR0E7UUFDREEsT0FBT0EsVUFBVUE7SUFDbEJBLENBQUNBOztJQVdEcEI7Ozs7TUFMR0E7SUFFSEE7O01BRUdBO2lDQUNIQSxVQUFlQSxHQUFZQTtRQUUxQnFCLElBQUlBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBOztRQUU5OUJBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO1FBQy9EQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUMvREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDL0RBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBOztRQUUvREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDL0RBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO1FBQy9EQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUMvREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7O1FBRS9EQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUMvREEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDL0RBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO1FBQ2hFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTs7UUFFaEVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO1FBQ2hFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUNoRUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDaEVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO0lBQ2pFQSxDQUFDQTs7SUFLRHJCOztNQURHQTt5Q0FDSEEsVUFBdUJBLE9BQWNBLEVBQUVBLElBQWFBO1FBRW5Ec0IsSUFBSUEsQ0FBQ0EsR0FBWUEsUUFBUUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsT0FBT0EsQ0FBQ0E7O1FBRTFFQTs7Ozs7O1VBTUdBO1FBQ0hBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO0lBQ2hCQSxDQUFDQTs7SUFLRHRCOztNQURHQTtzQ0FDSEEsVUFBb0JBLE1BQWFBLEVBQUVBLE1BQWFBLEVBQUVBLE1BQWFBO1FBRzlEdUIscUJBQXFCQTtRQUVyQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBRUEsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBRUEsQ0FBQ0EsQ0FBQ0E7SUFDOUZBLENBQUNBOztJQUtEdkI7O01BREdBOzRDQUNIQSxVQUEwQkEsQ0FBUUEsRUFBRUEsQ0FBUUEsRUFBRUEsQ0FBUUE7UUFHckR3QixxQkFBcUJBO1FBRXJCQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTtRQUN0QkEsQ0FBQ0EsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDbENBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO0lBQ2hCQSxDQUFDQTs7SUFNRHhCLHdCQUp3QkE7SUFDeEJBOztNQUVHQTttQ0FDSEEsVUFBaUJBLFVBQXFCQTtRQUdyQ3lCLHFCQUFxQkE7UUFFckJBLElBQUlBLFVBQVVBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBO1lBQUVBLE9BQU9BLEtBQUtBLENBQUFBOztRQUV2Q0EscUZBQXFGQTtRQUVyRkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7UUFDZkEsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRW5FQSxJQUFJQSxLQUFLQTtRQUNUQSxLQUFLQSxHQUFHQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUN4QkEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDcklBLEtBQUtBLEdBQUdBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1FBQ3hCQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNwSUEsS0FBS0EsR0FBR0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDeEJBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBOztRQUVwSUEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztRQUVwQkEsT0FBT0EsSUFBSUE7SUFDWkEsQ0FBQ0E7O0lBRUR6QixxQ0FBQUEsVUFBdUJBLENBQVVBO1FBRWhDMEIsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDbEJBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLENBQUNBLENBQUNBO1FBQ2xCQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFbEJBLE9BQU9BLElBQUlBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO0lBQ3RWQSxDQUFDQTs7SUFLRDFCOztNQURHQTswQ0FDSEEsVUFBd0JBLEdBQVlBLEVBQUVBLElBQWFBO1FBR2xEMkIscUJBQXFCQTtRQUVyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7UUFDaEJBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQVVBLENBQUNBOztRQUU1Q0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsTUFBTUEsQ0FBRUE7WUFDM0JBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1lBQ1ZBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1lBQ2RBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1lBQ2RBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBO1lBQ3RGQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUMxRkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDM0ZBLENBQUNBLElBQUlBLENBQUNBO1NBQ05BO0lBQ0ZBLENBQUNBOztJQUtEM0I7O01BREdBO21DQUNIQTtRQUdDNEIscUJBQXFCQTtRQUVyQkEsSUFBSUEsUUFBUUEsR0FBWUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRTdDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUM3QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLEVBQUVBLENBQUNBO1FBQzlCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUM3QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLEVBQUVBLENBQUNBO1FBQzlCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUM3QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLEVBQUVBLENBQUNBO1FBQy9CQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUM5QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDOUJBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBLEVBQUVBLENBQUNBO0lBQ2hDQSxDQUFDQTs7SUFFRDVCLDJCQUFBQSxVQUF1QkEsQ0FBUUEsRUFBRUEsQ0FBUUEsRUFBRUEsQ0FBUUEsRUFBRUEsT0FBY0E7UUFHbEU2Qix5REFBeURBO1FBRXpEQSxJQUFJQSxDQUFDQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTs7UUFFL0JBLElBQUlBLEdBQUdBLEdBQUdBLE9BQU9BLEdBQUNBLENBQUVBLElBQUlBLENBQUNBLEVBQUVBLEdBQUNBLEdBQUdBLENBQUVBO1FBQ2pDQSxJQUFJQSxDQUFDQSxHQUFVQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUM1QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDNUJBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ3BCQSxJQUFJQSxJQUFJQSxFQUFTQSxJQUFJQTs7UUFFckJBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEdBQUNBLENBQUNBO1FBQ3hCQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUN4QkEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7O1FBRXpCQSxJQUFJQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUNaQSxJQUFJQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUNWQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFHQSxJQUFJQTtRQUMxQkEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBR0EsSUFBSUE7UUFDMUJBLElBQUlBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEdBQUNBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBO1FBQ1ZBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUdBLElBQUlBO1FBQzFCQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFHQSxJQUFJQTtRQUMxQkEsSUFBSUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7UUFDWkEsSUFBSUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7UUFDVkEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBR0EsSUFBSUE7UUFDMUJBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUdBLElBQUlBOztRQUUxQkEsT0FBT0EsQ0FBQ0E7SUFDVEEsQ0FBQ0E7O0lBS0Q3QjtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBVUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDeDFCQSxDQUFDQTs7OztBQUFBQTtJQU1EQTtRQUFBQTs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1FBQzFFQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFvQkEsS0FBY0E7WUFFakNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBO1lBQzFCQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQTtZQUMxQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDM0JBLENBQUNBOzs7O0FBUEFBOztJQVNEQSw2QkFBQUEsVUFBZUEsWUFBbUJBO1FBRWpDOEIsSUFBSUEsU0FBU0EsR0FBVUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsRUFBRUEsWUFBWUEsQ0FBQ0E7UUFDakRBLE9BQU9BLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLFNBQVNBLENBQUNBLEdBQUNBLFNBQVNBLEdBQUdBLEdBQUdBO0lBQ3o1QkEsQ0FBQ0E7O0lBRUQ5Qiw4QkFBQUE7UUFFQytCLE9BQU9BLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLEdBQUdBO0lBQ3p2QkEsQ0FBQ0E7SUFDRi9CLGdCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELHlCQUFrQixDQUFBIiwiZmlsZSI6ImNvcmUvZ2VvbS9NYXRyaXgzRC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBPcmllbnRhdGlvbjNEXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9PcmllbnRhdGlvbjNEXCIpO1xuaW1wb3J0IFF1YXRlcm5pb25cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUXVhdGVybmlvblwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuaW1wb3J0IEFyZ3VtZW50RXJyb3JcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0FyZ3VtZW50RXJyb3JcIik7XG5cbmNsYXNzIE1hdHJpeDNEXG57XG5cdC8qKlxuXHQgKiBBIFZlY3RvciBvZiAxNiBOdW1iZXJzLCB3aGVyZSBldmVyeSBmb3VyIGVsZW1lbnRzIGlzIGEgY29sdW1uIG9mIGEgNHg0IG1hdHJpeC5cblx0ICpcblx0ICogPHA+QW4gZXhjZXB0aW9uIGlzIHRocm93biBpZiB0aGUgcmF3RGF0YSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBtYXRyaXggdGhhdCBpcyBub3QgaW52ZXJ0aWJsZS4gVGhlIE1hdHJpeDNEXG5cdCAqIG9iamVjdCBtdXN0IGJlIGludmVydGlibGUuIElmIGEgbm9uLWludmVydGlibGUgbWF0cml4IGlzIG5lZWRlZCwgY3JlYXRlIGEgc3ViY2xhc3Mgb2YgdGhlIE1hdHJpeDNEIG9iamVjdC48L3A+XG5cdCAqL1xuXHRwdWJsaWMgcmF3RGF0YTpudW1iZXJbXTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIE1hdHJpeDNEIG9iamVjdC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHY6bnVtYmVyW10gPSBudWxsKVxuXHR7XG5cdFx0aWYgKHYgIT0gbnVsbCAmJiB2Lmxlbmd0aCA9PSAxNilcblx0XHRcdHRoaXMucmF3RGF0YSA9IHYuY29uY2F0KCk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhpcy5yYXdEYXRhID0gWyAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxIF07XG5cdH1cblxuXHQvKipcblx0ICogQXBwZW5kcyB0aGUgbWF0cml4IGJ5IG11bHRpcGx5aW5nIGFub3RoZXIgTWF0cml4M0Qgb2JqZWN0IGJ5IHRoZSBjdXJyZW50IE1hdHJpeDNEIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBhcHBlbmQobGhzOk1hdHJpeDNEKVxuXHR7XG5cdFx0dmFyIG0xMTE6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzBdLCBtMTIxOm51bWJlciA9IHRoaXMucmF3RGF0YVs0XSwgbTEzMTpudW1iZXIgPSB0aGlzLnJhd0RhdGFbOF0sIG0xNDE6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzEyXSwgbTExMjpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMV0sIG0xMjI6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzVdLCBtMTMyOm51bWJlciA9IHRoaXMucmF3RGF0YVs5XSwgbTE0MjpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMTNdLCBtMTEzOm51bWJlciA9IHRoaXMucmF3RGF0YVsyXSwgbTEyMzpudW1iZXIgPSB0aGlzLnJhd0RhdGFbNl0sIG0xMzM6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzEwXSwgbTE0MzpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMTRdLCBtMTE0Om51bWJlciA9IHRoaXMucmF3RGF0YVszXSwgbTEyNDpudW1iZXIgPSB0aGlzLnJhd0RhdGFbN10sIG0xMzQ6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzExXSwgbTE0NDpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMTVdLCBtMjExOm51bWJlciA9IGxocy5yYXdEYXRhWzBdLCBtMjIxOm51bWJlciA9IGxocy5yYXdEYXRhWzRdLCBtMjMxOm51bWJlciA9IGxocy5yYXdEYXRhWzhdLCBtMjQxOm51bWJlciA9IGxocy5yYXdEYXRhWzEyXSwgbTIxMjpudW1iZXIgPSBsaHMucmF3RGF0YVsxXSwgbTIyMjpudW1iZXIgPSBsaHMucmF3RGF0YVs1XSwgbTIzMjpudW1iZXIgPSBsaHMucmF3RGF0YVs5XSwgbTI0MjpudW1iZXIgPSBsaHMucmF3RGF0YVsxM10sIG0yMTM6bnVtYmVyID0gbGhzLnJhd0RhdGFbMl0sIG0yMjM6bnVtYmVyID0gbGhzLnJhd0RhdGFbNl0sIG0yMzM6bnVtYmVyID0gbGhzLnJhd0RhdGFbMTBdLCBtMjQzOm51bWJlciA9IGxocy5yYXdEYXRhWzE0XSwgbTIxNDpudW1iZXIgPSBsaHMucmF3RGF0YVszXSwgbTIyNDpudW1iZXIgPSBsaHMucmF3RGF0YVs3XSwgbTIzNDpudW1iZXIgPSBsaHMucmF3RGF0YVsxMV0sIG0yNDQ6bnVtYmVyID0gbGhzLnJhd0RhdGFbMTVdO1xuXG5cdFx0dGhpcy5yYXdEYXRhWzBdID0gbTExMSptMjExICsgbTExMiptMjIxICsgbTExMyptMjMxICsgbTExNCptMjQxO1xuXHRcdHRoaXMucmF3RGF0YVsxXSA9IG0xMTEqbTIxMiArIG0xMTIqbTIyMiArIG0xMTMqbTIzMiArIG0xMTQqbTI0Mjtcblx0XHR0aGlzLnJhd0RhdGFbMl0gPSBtMTExKm0yMTMgKyBtMTEyKm0yMjMgKyBtMTEzKm0yMzMgKyBtMTE0Km0yNDM7XG5cdFx0dGhpcy5yYXdEYXRhWzNdID0gbTExMSptMjE0ICsgbTExMiptMjI0ICsgbTExMyptMjM0ICsgbTExNCptMjQ0O1xuXG5cdFx0dGhpcy5yYXdEYXRhWzRdID0gbTEyMSptMjExICsgbTEyMiptMjIxICsgbTEyMyptMjMxICsgbTEyNCptMjQxO1xuXHRcdHRoaXMucmF3RGF0YVs1XSA9IG0xMjEqbTIxMiArIG0xMjIqbTIyMiArIG0xMjMqbTIzMiArIG0xMjQqbTI0Mjtcblx0XHR0aGlzLnJhd0RhdGFbNl0gPSBtMTIxKm0yMTMgKyBtMTIyKm0yMjMgKyBtMTIzKm0yMzMgKyBtMTI0Km0yNDM7XG5cdFx0dGhpcy5yYXdEYXRhWzddID0gbTEyMSptMjE0ICsgbTEyMiptMjI0ICsgbTEyMyptMjM0ICsgbTEyNCptMjQ0O1xuXG5cdFx0dGhpcy5yYXdEYXRhWzhdID0gbTEzMSptMjExICsgbTEzMiptMjIxICsgbTEzMyptMjMxICsgbTEzNCptMjQxO1xuXHRcdHRoaXMucmF3RGF0YVs5XSA9IG0xMzEqbTIxMiArIG0xMzIqbTIyMiArIG0xMzMqbTIzMiArIG0xMzQqbTI0Mjtcblx0XHR0aGlzLnJhd0RhdGFbMTBdID0gbTEzMSptMjEzICsgbTEzMiptMjIzICsgbTEzMyptMjMzICsgbTEzNCptMjQzO1xuXHRcdHRoaXMucmF3RGF0YVsxMV0gPSBtMTMxKm0yMTQgKyBtMTMyKm0yMjQgKyBtMTMzKm0yMzQgKyBtMTM0Km0yNDQ7XG5cblx0XHR0aGlzLnJhd0RhdGFbMTJdID0gbTE0MSptMjExICsgbTE0MiptMjIxICsgbTE0MyptMjMxICsgbTE0NCptMjQxO1xuXHRcdHRoaXMucmF3RGF0YVsxM10gPSBtMTQxKm0yMTIgKyBtMTQyKm0yMjIgKyBtMTQzKm0yMzIgKyBtMTQ0Km0yNDI7XG5cdFx0dGhpcy5yYXdEYXRhWzE0XSA9IG0xNDEqbTIxMyArIG0xNDIqbTIyMyArIG0xNDMqbTIzMyArIG0xNDQqbTI0Mztcblx0XHR0aGlzLnJhd0RhdGFbMTVdID0gbTE0MSptMjE0ICsgbTE0MiptMjI0ICsgbTE0MyptMjM0ICsgbTE0NCptMjQ0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGVuZHMgYW4gaW5jcmVtZW50YWwgcm90YXRpb24gdG8gYSBNYXRyaXgzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgYXBwZW5kUm90YXRpb24oZGVncmVlczpudW1iZXIsIGF4aXM6VmVjdG9yM0QpOnZvaWQgLy8sIHBpdm90OlZlY3RvcjNEID0gbnVsbCApXG5cdHtcblx0XHR2YXIgbTpNYXRyaXgzRCA9IE1hdHJpeDNELmdldEF4aXNSb3RhdGlvbihheGlzLngsIGF4aXMueSwgYXhpcy56LCBkZWdyZWVzKTtcblxuXHRcdHRoaXMuYXBwZW5kKG0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGVuZHMgYW4gaW5jcmVtZW50YWwgc2NhbGUgY2hhbmdlIGFsb25nIHRoZSB4LCB5LCBhbmQgeiBheGVzIHRvIGEgTWF0cml4M0Qgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGFwcGVuZFNjYWxlKHhTY2FsZTpudW1iZXIsIHlTY2FsZTpudW1iZXIsIHpTY2FsZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLmFwcGVuZChuZXcgTWF0cml4M0QoWyB4U2NhbGUsIDAuMCwgMC4wLCAwLjAsIDAuMCwgeVNjYWxlLCAwLjAsIDAuMCwgMC4wLCAwLjAsIHpTY2FsZSwgMC4wLCAwLjAsIDAuMCwgMC4wLCAxLjAgXSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGVuZHMgYW4gaW5jcmVtZW50YWwgdHJhbnNsYXRpb24sIGEgcmVwb3NpdGlvbmluZyBhbG9uZyB0aGUgeCwgeSwgYW5kIHogYXhlcywgdG8gYSBNYXRyaXgzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgYXBwZW5kVHJhbnNsYXRpb24oeDpudW1iZXIsIHk6bnVtYmVyLCB6Om51bWJlcilcblx0e1xuXHRcdHRoaXMucmF3RGF0YVsxMl0gKz0geDtcblx0XHR0aGlzLnJhd0RhdGFbMTNdICs9IHk7XG5cdFx0dGhpcy5yYXdEYXRhWzE0XSArPSB6O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBuZXcgTWF0cml4M0Qgb2JqZWN0IHRoYXQgaXMgYW4gZXhhY3QgY29weSBvZiB0aGUgY3VycmVudCBNYXRyaXgzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY2xvbmUoKTpNYXRyaXgzRFxuXHR7XG5cdFx0cmV0dXJuIG5ldyBNYXRyaXgzRCh0aGlzLnJhd0RhdGEuc2xpY2UoMCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvcGllcyBhIFZlY3RvcjNEIG9iamVjdCBpbnRvIHNwZWNpZmljIGNvbHVtbiBvZiB0aGUgY2FsbGluZyBNYXRyaXgzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY29weUNvbHVtbkZyb20oY29sdW1uOm51bWJlciwgdmVjdG9yM0Q6VmVjdG9yM0QpXG5cdHtcblx0XHRzd2l0Y2ggKGNvbHVtbikge1xuXHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDAgXSA9IHZlY3RvcjNELng7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgMSBdID0gdmVjdG9yM0QueTtcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyAyIF0gPSB2ZWN0b3IzRC56O1xuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDMgXSA9IHZlY3RvcjNELnc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDQgXSA9IHZlY3RvcjNELng7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgNSBdID0gdmVjdG9yM0QueTtcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyA2IF0gPSB2ZWN0b3IzRC56O1xuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDcgXSA9IHZlY3RvcjNELnc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDggXSA9IHZlY3RvcjNELng7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgOSBdID0gdmVjdG9yM0QueTtcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyAxMCBdID0gdmVjdG9yM0Quejtcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyAxMSBdID0gdmVjdG9yM0Qudztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDM6XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgMTIgXSA9IHZlY3RvcjNELng7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgMTMgXSA9IHZlY3RvcjNELnk7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgMTQgXSA9IHZlY3RvcjNELno7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgMTUgXSA9IHZlY3RvcjNELnc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJBcmd1bWVudEVycm9yLCBDb2x1bW4gXCIgKyBjb2x1bW4gKyBcIiBvdXQgb2YgYm91bmRzIFswLCAuLi4sIDNdXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb3BpZXMgc3BlY2lmaWMgY29sdW1uIG9mIHRoZSBjYWxsaW5nIE1hdHJpeDNEIG9iamVjdCBpbnRvIHRoZSBWZWN0b3IzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY29weUNvbHVtblRvKGNvbHVtbjpudW1iZXIsIHZlY3RvcjNEOlZlY3RvcjNEKVxuXHR7XG5cdFx0c3dpdGNoIChjb2x1bW4pIHtcblx0XHRcdGNhc2UgMDpcblx0XHRcdFx0dmVjdG9yM0QueCA9IHRoaXMucmF3RGF0YVsgMCBdO1xuXHRcdFx0XHR2ZWN0b3IzRC55ID0gdGhpcy5yYXdEYXRhWyAxIF07XG5cdFx0XHRcdHZlY3RvcjNELnogPSB0aGlzLnJhd0RhdGFbIDIgXTtcblx0XHRcdFx0dmVjdG9yM0QudyA9IHRoaXMucmF3RGF0YVsgMyBdO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0dmVjdG9yM0QueCA9IHRoaXMucmF3RGF0YVsgNCBdO1xuXHRcdFx0XHR2ZWN0b3IzRC55ID0gdGhpcy5yYXdEYXRhWyA1IF07XG5cdFx0XHRcdHZlY3RvcjNELnogPSB0aGlzLnJhd0RhdGFbIDYgXTtcblx0XHRcdFx0dmVjdG9yM0QudyA9IHRoaXMucmF3RGF0YVsgNyBdO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0dmVjdG9yM0QueCA9IHRoaXMucmF3RGF0YVsgOCBdO1xuXHRcdFx0XHR2ZWN0b3IzRC55ID0gdGhpcy5yYXdEYXRhWyA5IF07XG5cdFx0XHRcdHZlY3RvcjNELnogPSB0aGlzLnJhd0RhdGFbIDEwIF07XG5cdFx0XHRcdHZlY3RvcjNELncgPSB0aGlzLnJhd0RhdGFbIDExIF07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHR2ZWN0b3IzRC54ID0gdGhpcy5yYXdEYXRhWyAxMiBdO1xuXHRcdFx0XHR2ZWN0b3IzRC55ID0gdGhpcy5yYXdEYXRhWyAxMyBdO1xuXHRcdFx0XHR2ZWN0b3IzRC56ID0gdGhpcy5yYXdEYXRhWyAxNCBdO1xuXHRcdFx0XHR2ZWN0b3IzRC53ID0gdGhpcy5yYXdEYXRhWyAxNSBdO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBBcmd1bWVudEVycm9yKFwiQXJndW1lbnRFcnJvciwgQ29sdW1uIFwiICsgY29sdW1uICsgXCIgb3V0IG9mIGJvdW5kcyBbMCwgLi4uLCAzXVwiKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ29waWVzIGFsbCBvZiB0aGUgbWF0cml4IGRhdGEgZnJvbSB0aGUgc291cmNlIE1hdHJpeDNEIG9iamVjdCBpbnRvIHRoZSBjYWxsaW5nIE1hdHJpeDNEIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBjb3B5RnJvbShzb3VyY2VNYXRyaXgzRDpNYXRyaXgzRClcblx0e1xuXHRcdHZhciBsZW46bnVtYmVyID0gc291cmNlTWF0cml4M0QucmF3RGF0YS5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgYzpudW1iZXIgPSAwOyBjIDwgbGVuOyBjKyspXG5cdFx0XHR0aGlzLnJhd0RhdGFbY10gPSBzb3VyY2VNYXRyaXgzRC5yYXdEYXRhW2NdO1xuXHR9XG5cblx0cHVibGljIGNvcHlSYXdEYXRhRnJvbSh2ZWN0b3I6bnVtYmVyW10sIGluZGV4Om51bWJlciA9IDAsIHRyYW5zcG9zZTpib29sZWFuID0gZmFsc2UpOnZvaWRcblx0e1xuXHRcdGlmICh0cmFuc3Bvc2UpXG5cdFx0XHR0aGlzLnRyYW5zcG9zZSgpO1xuXG5cdFx0dmFyIGxlbjpudW1iZXIgPSB2ZWN0b3IubGVuZ3RoIC0gaW5kZXg7XG5cdFx0Zm9yICh2YXIgYzpudW1iZXIgPSAwOyBjIDwgbGVuOyBjKyspXG5cdFx0XHR0aGlzLnJhd0RhdGFbY10gPSB2ZWN0b3JbYyArIGluZGV4XTtcblxuXHRcdGlmICh0cmFuc3Bvc2UpXG5cdFx0XHR0aGlzLnRyYW5zcG9zZSgpO1xuXHR9XG5cblx0cHVibGljIGNvcHlSYXdEYXRhVG8odmVjdG9yOm51bWJlcltdLCBpbmRleDpudW1iZXIgPSAwLCB0cmFuc3Bvc2U6Ym9vbGVhbiA9IGZhbHNlKVxuXHR7XG5cdFx0aWYgKHRyYW5zcG9zZSlcblx0XHRcdHRoaXMudHJhbnNwb3NlKCk7XG5cblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMucmF3RGF0YS5sZW5ndGhcblx0XHRmb3IgKHZhciBjOm51bWJlciA9IDA7IGMgPCBsZW47IGMrKylcblx0XHRcdHZlY3RvcltjICsgaW5kZXggXSA9IHRoaXMucmF3RGF0YVtjXTtcblxuXHRcdGlmICh0cmFuc3Bvc2UpXG5cdFx0XHR0aGlzLnRyYW5zcG9zZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvcGllcyBhIFZlY3RvcjNEIG9iamVjdCBpbnRvIHNwZWNpZmljIHJvdyBvZiB0aGUgY2FsbGluZyBNYXRyaXgzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY29weVJvd0Zyb20ocm93Om51bWJlciwgdmVjdG9yM0Q6VmVjdG9yM0QpXG5cdHtcblx0XHRzd2l0Y2ggKHJvdykge1xuXHRcdFx0Y2FzZSAwOlxuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDAgXSA9IHZlY3RvcjNELng7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgNCBdID0gdmVjdG9yM0QueTtcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyA4IF0gPSB2ZWN0b3IzRC56O1xuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDEyIF0gPSB2ZWN0b3IzRC53O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyAxIF0gPSB2ZWN0b3IzRC54O1xuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDUgXSA9IHZlY3RvcjNELnk7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgOSBdID0gdmVjdG9yM0Quejtcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyAxMyBdID0gdmVjdG9yM0Qudztcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgMiBdID0gdmVjdG9yM0QueDtcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyA2IF0gPSB2ZWN0b3IzRC55O1xuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDEwIF0gPSB2ZWN0b3IzRC56O1xuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDE0IF0gPSB2ZWN0b3IzRC53O1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMzpcblx0XHRcdFx0dGhpcy5yYXdEYXRhWyAzIF0gPSB2ZWN0b3IzRC54O1xuXHRcdFx0XHR0aGlzLnJhd0RhdGFbIDcgXSA9IHZlY3RvcjNELnk7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgMTEgXSA9IHZlY3RvcjNELno7XG5cdFx0XHRcdHRoaXMucmF3RGF0YVsgMTUgXSA9IHZlY3RvcjNELnc7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJBcmd1bWVudEVycm9yLCBSb3cgXCIgKyByb3cgKyBcIiBvdXQgb2YgYm91bmRzIFswLCAuLi4sIDNdXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb3BpZXMgc3BlY2lmaWMgcm93IG9mIHRoZSBjYWxsaW5nIE1hdHJpeDNEIG9iamVjdCBpbnRvIHRoZSBWZWN0b3IzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgY29weVJvd1RvKHJvdzpudW1iZXIsIHZlY3RvcjNEOlZlY3RvcjNEKVxuXHR7XG5cdFx0c3dpdGNoIChyb3cpIHtcblx0XHRcdGNhc2UgMDpcblx0XHRcdFx0dmVjdG9yM0QueCA9IHRoaXMucmF3RGF0YVsgMCBdO1xuXHRcdFx0XHR2ZWN0b3IzRC55ID0gdGhpcy5yYXdEYXRhWyA0IF07XG5cdFx0XHRcdHZlY3RvcjNELnogPSB0aGlzLnJhd0RhdGFbIDggXTtcblx0XHRcdFx0dmVjdG9yM0QudyA9IHRoaXMucmF3RGF0YVsgMTIgXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHZlY3RvcjNELnggPSB0aGlzLnJhd0RhdGFbIDEgXTtcblx0XHRcdFx0dmVjdG9yM0QueSA9IHRoaXMucmF3RGF0YVsgNSBdO1xuXHRcdFx0XHR2ZWN0b3IzRC56ID0gdGhpcy5yYXdEYXRhWyA5IF07XG5cdFx0XHRcdHZlY3RvcjNELncgPSB0aGlzLnJhd0RhdGFbIDEzIF07XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAyOlxuXHRcdFx0XHR2ZWN0b3IzRC54ID0gdGhpcy5yYXdEYXRhWyAyIF07XG5cdFx0XHRcdHZlY3RvcjNELnkgPSB0aGlzLnJhd0RhdGFbIDYgXTtcblx0XHRcdFx0dmVjdG9yM0QueiA9IHRoaXMucmF3RGF0YVsgMTAgXTtcblx0XHRcdFx0dmVjdG9yM0QudyA9IHRoaXMucmF3RGF0YVsgMTQgXTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDM6XG5cdFx0XHRcdHZlY3RvcjNELnggPSB0aGlzLnJhd0RhdGFbIDMgXTtcblx0XHRcdFx0dmVjdG9yM0QueSA9IHRoaXMucmF3RGF0YVsgNyBdO1xuXHRcdFx0XHR2ZWN0b3IzRC56ID0gdGhpcy5yYXdEYXRhWyAxMSBdO1xuXHRcdFx0XHR2ZWN0b3IzRC53ID0gdGhpcy5yYXdEYXRhWyAxNSBdXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhyb3cgbmV3IEFyZ3VtZW50RXJyb3IoXCJBcmd1bWVudEVycm9yLCBSb3cgXCIgKyByb3cgKyBcIiBvdXQgb2YgYm91bmRzIFswLCAuLi4sIDNdXCIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb3BpZXMgdGhpcyBNYXRyaXgzRCBvYmplY3QgaW50byBhIGRlc3RpbmF0aW9uIE1hdHJpeDNEIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBjb3B5VG9NYXRyaXgzRChkZXN0Ok1hdHJpeDNEKVxuXHR7XG5cdFx0ZGVzdC5yYXdEYXRhID0gdGhpcy5yYXdEYXRhLnNsaWNlKDApO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCdzIHRyYW5zbGF0aW9uLCByb3RhdGlvbiwgYW5kIHNjYWxlIHNldHRpbmdzIGFzIGEgVmVjdG9yIG9mIHRocmVlIFZlY3RvcjNEIG9iamVjdHMuXG5cdCAqL1xuXHRwdWJsaWMgZGVjb21wb3NlKG9yaWVudGF0aW9uU3R5bGU6c3RyaW5nID0gXCJldWxlckFuZ2xlc1wiKTpWZWN0b3IzRFtdXG5cdHtcblx0XHR2YXIgcTpRdWF0ZXJuaW9uO1xuXG5cdFx0Ly8gSW5pdGlhbCBUZXN0cyAtIE5vdCBPS1xuXG5cdFx0dmFyIHZlYzpWZWN0b3IzRFtdID0gW107XG5cdFx0dmFyIG0gPSB0aGlzLmNsb25lKCk7XG5cdFx0dmFyIG1yID0gbS5yYXdEYXRhO1xuXG5cdFx0dmFyIHBvczpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRChtclsxMl0sIG1yWzEzXSwgbXJbMTRdKTtcblx0XHRtclsxMl0gPSAwO1xuXHRcdG1yWzEzXSA9IDA7XG5cdFx0bXJbMTRdID0gMDtcblxuXHRcdHZhciBzY2FsZTpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdFx0c2NhbGUueCA9IE1hdGguc3FydChtclswXSptclswXSArIG1yWzFdKm1yWzFdICsgbXJbMl0qbXJbMl0pO1xuXHRcdHNjYWxlLnkgPSBNYXRoLnNxcnQobXJbNF0qbXJbNF0gKyBtcls1XSptcls1XSArIG1yWzZdKm1yWzZdKTtcblx0XHRzY2FsZS56ID0gTWF0aC5zcXJ0KG1yWzhdKm1yWzhdICsgbXJbOV0qbXJbOV0gKyBtclsxMF0qbXJbMTBdKTtcblxuXHRcdGlmIChtclswXSoobXJbNV0qbXJbMTBdIC0gbXJbNl0qbXJbOV0pIC0gbXJbMV0qKG1yWzRdKm1yWzEwXSAtIG1yWzZdKm1yWzhdKSArIG1yWzJdKihtcls0XSptcls5XSAtIG1yWzVdKm1yWzhdKSA8IDApXG5cdFx0XHRzY2FsZS56ID0gLXNjYWxlLno7XG5cblx0XHRtclswXSAvPSBzY2FsZS54O1xuXHRcdG1yWzFdIC89IHNjYWxlLng7XG5cdFx0bXJbMl0gLz0gc2NhbGUueDtcblx0XHRtcls0XSAvPSBzY2FsZS55O1xuXHRcdG1yWzVdIC89IHNjYWxlLnk7XG5cdFx0bXJbNl0gLz0gc2NhbGUueTtcblx0XHRtcls4XSAvPSBzY2FsZS56O1xuXHRcdG1yWzldIC89IHNjYWxlLno7XG5cdFx0bXJbMTBdIC89IHNjYWxlLno7XG5cblx0XHR2YXIgcm90ID0gbmV3IFZlY3RvcjNEKCk7XG5cblx0XHRzd2l0Y2ggKG9yaWVudGF0aW9uU3R5bGUpIHtcblx0XHRcdGNhc2UgT3JpZW50YXRpb24zRC5BWElTX0FOR0xFOlxuXG5cdFx0XHRcdHJvdC53ID0gTWF0aC5hY29zKChtclswXSArIG1yWzVdICsgbXJbMTBdIC0gMSkvMik7XG5cblx0XHRcdFx0dmFyIGxlbjpudW1iZXIgPSBNYXRoLnNxcnQoKG1yWzZdIC0gbXJbOV0pKihtcls2XSAtIG1yWzldKSArIChtcls4XSAtIG1yWzJdKSoobXJbOF0gLSBtclsyXSkgKyAobXJbMV0gLSBtcls0XSkqKG1yWzFdIC0gbXJbNF0pKTtcblx0XHRcdFx0cm90LnggPSAobXJbNl0gLSBtcls5XSkvbGVuO1xuXHRcdFx0XHRyb3QueSA9IChtcls4XSAtIG1yWzJdKS9sZW47XG5cdFx0XHRcdHJvdC56ID0gKG1yWzFdIC0gbXJbNF0pL2xlbjtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgT3JpZW50YXRpb24zRC5RVUFURVJOSU9OOlxuXG5cdFx0XHRcdHZhciB0ciA9IG1yWzBdICsgbXJbNV0gKyBtclsxMF07XG5cblx0XHRcdFx0aWYgKHRyID4gMCkge1xuXHRcdFx0XHRcdHJvdC53ID0gTWF0aC5zcXJ0KDEgKyB0cikvMjtcblxuXHRcdFx0XHRcdHJvdC54ID0gKG1yWzZdIC0gbXJbOV0pLyg0KnJvdC53KTtcblx0XHRcdFx0XHRyb3QueSA9IChtcls4XSAtIG1yWzJdKS8oNCpyb3Qudyk7XG5cdFx0XHRcdFx0cm90LnogPSAobXJbMV0gLSBtcls0XSkvKDQqcm90LncpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKChtclswXSA+IG1yWzVdKSAmJiAobXJbMF0gPiBtclsxMF0pKSB7XG5cdFx0XHRcdFx0cm90LnggPSBNYXRoLnNxcnQoMSArIG1yWzBdIC0gbXJbNV0gLSBtclsxMF0pLzI7XG5cblx0XHRcdFx0XHRyb3QudyA9IChtcls2XSAtIG1yWzldKS8oNCpyb3QueCk7XG5cdFx0XHRcdFx0cm90LnkgPSAobXJbMV0gKyBtcls0XSkvKDQqcm90LngpO1xuXHRcdFx0XHRcdHJvdC56ID0gKG1yWzhdICsgbXJbMl0pLyg0KnJvdC54KTtcblx0XHRcdFx0fSBlbHNlIGlmIChtcls1XSA+IG1yWzEwXSkge1xuXHRcdFx0XHRcdHJvdC55ID0gTWF0aC5zcXJ0KDEgKyBtcls1XSAtIG1yWzBdIC0gbXJbMTBdKS8yO1xuXG5cdFx0XHRcdFx0cm90LnggPSAobXJbMV0gKyBtcls0XSkvKDQqcm90LnkpO1xuXHRcdFx0XHRcdHJvdC53ID0gKG1yWzhdIC0gbXJbMl0pLyg0KnJvdC55KTtcblx0XHRcdFx0XHRyb3QueiA9IChtcls2XSArIG1yWzldKS8oNCpyb3QueSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cm90LnogPSBNYXRoLnNxcnQoMSArIG1yWzEwXSAtIG1yWzBdIC0gbXJbNV0pLzI7XG5cblx0XHRcdFx0XHRyb3QueCA9IChtcls4XSArIG1yWzJdKS8oNCpyb3Queik7XG5cdFx0XHRcdFx0cm90LnkgPSAobXJbNl0gKyBtcls5XSkvKDQqcm90LnopO1xuXHRcdFx0XHRcdHJvdC53ID0gKG1yWzFdIC0gbXJbNF0pLyg0KnJvdC56KTtcblx0XHRcdFx0fVxuXG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIE9yaWVudGF0aW9uM0QuRVVMRVJfQU5HTEVTOlxuXG5cdFx0XHRcdHJvdC55ID0gTWF0aC5hc2luKC1tclsyXSk7XG5cblx0XHRcdFx0Ly92YXIgY29zOm51bWJlciA9IE1hdGguY29zKHJvdC55KTtcblxuXHRcdFx0XHRpZiAobXJbMl0gIT0gMSAmJiBtclsyXSAhPSAtMSkge1xuXHRcdFx0XHRcdHJvdC54ID0gTWF0aC5hdGFuMihtcls2XSwgbXJbMTBdKTtcblx0XHRcdFx0XHRyb3QueiA9IE1hdGguYXRhbjIobXJbMV0sIG1yWzBdKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRyb3QueiA9IDA7XG5cdFx0XHRcdFx0cm90LnggPSBNYXRoLmF0YW4yKG1yWzRdLCBtcls1XSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHR2ZWMucHVzaChwb3MpO1xuXHRcdHZlYy5wdXNoKHJvdCk7XG5cdFx0dmVjLnB1c2goc2NhbGUpO1xuXG5cdFx0cmV0dXJuIHZlYztcblx0fVxuXG5cdC8qKlxuXHQgKiBVc2VzIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggd2l0aG91dCBpdHMgdHJhbnNsYXRpb24gZWxlbWVudHMgdG8gdHJhbnNmb3JtIGEgVmVjdG9yM0Qgb2JqZWN0IGZyb20gb25lIHNwYWNlXG5cdCAqIGNvb3JkaW5hdGUgdG8gYW5vdGhlci5cblx0ICovXG5cdHB1YmxpYyBkZWx0YVRyYW5zZm9ybVZlY3Rvcih2OlZlY3RvcjNEKTpWZWN0b3IzRFxuXHR7XG5cdFx0dmFyIHg6bnVtYmVyID0gdi54O1xuXHRcdHZhciB5Om51bWJlciA9IHYueTtcblx0XHR2YXIgejpudW1iZXIgPSB2Lno7XG5cblx0XHRyZXR1cm4gbmV3IFZlY3RvcjNEKCh4KnRoaXMucmF3RGF0YVswXSArIHkqdGhpcy5yYXdEYXRhWzRdICsgeip0aGlzLnJhd0RhdGFbOF0pLCAoeCp0aGlzLnJhd0RhdGFbMV0gKyB5KnRoaXMucmF3RGF0YVs1XSArIHoqdGhpcy5yYXdEYXRhWzldKSwgKHgqdGhpcy5yYXdEYXRhWzJdICsgeSp0aGlzLnJhd0RhdGFbNl0gKyB6KnRoaXMucmF3RGF0YVsxMF0pLCAoeCp0aGlzLnJhd0RhdGFbM10gKyB5KnRoaXMucmF3RGF0YVs3XSArIHoqdGhpcy5yYXdEYXRhWzExXSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBjdXJyZW50IG1hdHJpeCB0byBhbiBpZGVudGl0eSBvciB1bml0IG1hdHJpeC5cblx0ICovXG5cdHB1YmxpYyBpZGVudGl0eSgpXG5cdHtcblx0XHR0aGlzLnJhd0RhdGEgPSBbMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSBdO1xuXHR9XG5cblx0LyoqXG5cdCAqIFtzdGF0aWNdIEludGVycG9sYXRlcyB0aGUgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBhbmQgc2NhbGUgdHJhbnNmb3JtYXRpb24gb2Ygb25lIG1hdHJpeCB0b3dhcmQgdGhvc2Ugb2YgdGhlIHRhcmdldCBtYXRyaXguXG5cdCAqL1xuXHRzdGF0aWMgaW50ZXJwb2xhdGUodGhpc01hdDpNYXRyaXgzRCwgdG9NYXQ6TWF0cml4M0QsIHBlcmNlbnQ6bnVtYmVyKTpNYXRyaXgzRFxuXHR7XG5cdFx0dmFyIG06TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoKTtcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCAxNjsgKytpKVxuXHRcdFx0bS5yYXdEYXRhW2ldID0gdGhpc01hdC5yYXdEYXRhW2ldICsgKHRvTWF0LnJhd0RhdGFbaV0gLSB0aGlzTWF0LnJhd0RhdGFbaV0pKnBlcmNlbnQ7XG5cblx0XHRyZXR1cm4gbTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnRlcnBvbGF0ZXMgdGhpcyBtYXRyaXggdG93YXJkcyB0aGUgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBhbmQgc2NhbGUgdHJhbnNmb3JtYXRpb25zIG9mIHRoZSB0YXJnZXQgbWF0cml4LlxuXHQgKi9cblx0cHVibGljIGludGVycG9sYXRlVG8odG9NYXQ6TWF0cml4M0QsIHBlcmNlbnQ6bnVtYmVyKVxuXHR7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgMTY7ICsraSlcblx0XHRcdHRoaXMucmF3RGF0YVtpXSA9IHRoaXMucmF3RGF0YVtpXSArICh0b01hdC5yYXdEYXRhW2ldIC0gdGhpcy5yYXdEYXRhW2ldKSpwZXJjZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIEludmVydHMgdGhlIGN1cnJlbnQgbWF0cml4LlxuXHQgKi9cblx0cHVibGljIGludmVydCgpOmJvb2xlYW5cblx0e1xuXHRcdHZhciBkID0gdGhpcy5kZXRlcm1pbmFudDtcblx0XHR2YXIgaW52ZXJ0YWJsZSA9IE1hdGguYWJzKGQpID4gMC4wMDAwMDAwMDAwMTtcblxuXHRcdGlmIChpbnZlcnRhYmxlKSB7XG5cdFx0XHRkID0gMS9kO1xuXHRcdFx0dmFyIG0xMTpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMF07XG5cdFx0XHR2YXIgbTIxOm51bWJlciA9IHRoaXMucmF3RGF0YVs0XTtcblx0XHRcdHZhciBtMzE6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzhdO1xuXHRcdFx0dmFyIG00MTpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMTJdO1xuXHRcdFx0dmFyIG0xMjpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMV07XG5cdFx0XHR2YXIgbTIyOm51bWJlciA9IHRoaXMucmF3RGF0YVs1XTtcblx0XHRcdHZhciBtMzI6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzldO1xuXHRcdFx0dmFyIG00MjpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMTNdO1xuXHRcdFx0dmFyIG0xMzpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMl07XG5cdFx0XHR2YXIgbTIzOm51bWJlciA9IHRoaXMucmF3RGF0YVs2XTtcblx0XHRcdHZhciBtMzM6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzEwXTtcblx0XHRcdHZhciBtNDM6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzE0XTtcblx0XHRcdHZhciBtMTQ6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzNdO1xuXHRcdFx0dmFyIG0yNDpudW1iZXIgPSB0aGlzLnJhd0RhdGFbN107XG5cdFx0XHR2YXIgbTM0Om51bWJlciA9IHRoaXMucmF3RGF0YVsxMV07XG5cdFx0XHR2YXIgbTQ0Om51bWJlciA9IHRoaXMucmF3RGF0YVsxNV07XG5cblx0XHRcdHRoaXMucmF3RGF0YVswXSA9IGQqKG0yMioobTMzKm00NCAtIG00MyptMzQpIC0gbTMyKihtMjMqbTQ0IC0gbTQzKm0yNCkgKyBtNDIqKG0yMyptMzQgLSBtMzMqbTI0KSk7XG5cdFx0XHR0aGlzLnJhd0RhdGFbMV0gPSAtZCoobTEyKihtMzMqbTQ0IC0gbTQzKm0zNCkgLSBtMzIqKG0xMyptNDQgLSBtNDMqbTE0KSArIG00MioobTEzKm0zNCAtIG0zMyptMTQpKTtcblx0XHRcdHRoaXMucmF3RGF0YVsyXSA9IGQqKG0xMioobTIzKm00NCAtIG00MyptMjQpIC0gbTIyKihtMTMqbTQ0IC0gbTQzKm0xNCkgKyBtNDIqKG0xMyptMjQgLSBtMjMqbTE0KSk7XG5cdFx0XHR0aGlzLnJhd0RhdGFbM10gPSAtZCoobTEyKihtMjMqbTM0IC0gbTMzKm0yNCkgLSBtMjIqKG0xMyptMzQgLSBtMzMqbTE0KSArIG0zMioobTEzKm0yNCAtIG0yMyptMTQpKTtcblx0XHRcdHRoaXMucmF3RGF0YVs0XSA9IC1kKihtMjEqKG0zMyptNDQgLSBtNDMqbTM0KSAtIG0zMSoobTIzKm00NCAtIG00MyptMjQpICsgbTQxKihtMjMqbTM0IC0gbTMzKm0yNCkpO1xuXHRcdFx0dGhpcy5yYXdEYXRhWzVdID0gZCoobTExKihtMzMqbTQ0IC0gbTQzKm0zNCkgLSBtMzEqKG0xMyptNDQgLSBtNDMqbTE0KSArIG00MSoobTEzKm0zNCAtIG0zMyptMTQpKTtcblx0XHRcdHRoaXMucmF3RGF0YVs2XSA9IC1kKihtMTEqKG0yMyptNDQgLSBtNDMqbTI0KSAtIG0yMSoobTEzKm00NCAtIG00MyptMTQpICsgbTQxKihtMTMqbTI0IC0gbTIzKm0xNCkpO1xuXHRcdFx0dGhpcy5yYXdEYXRhWzddID0gZCoobTExKihtMjMqbTM0IC0gbTMzKm0yNCkgLSBtMjEqKG0xMyptMzQgLSBtMzMqbTE0KSArIG0zMSoobTEzKm0yNCAtIG0yMyptMTQpKTtcblx0XHRcdHRoaXMucmF3RGF0YVs4XSA9IGQqKG0yMSoobTMyKm00NCAtIG00MiptMzQpIC0gbTMxKihtMjIqbTQ0IC0gbTQyKm0yNCkgKyBtNDEqKG0yMiptMzQgLSBtMzIqbTI0KSk7XG5cdFx0XHR0aGlzLnJhd0RhdGFbOV0gPSAtZCoobTExKihtMzIqbTQ0IC0gbTQyKm0zNCkgLSBtMzEqKG0xMiptNDQgLSBtNDIqbTE0KSArIG00MSoobTEyKm0zNCAtIG0zMiptMTQpKTtcblx0XHRcdHRoaXMucmF3RGF0YVsxMF0gPSBkKihtMTEqKG0yMiptNDQgLSBtNDIqbTI0KSAtIG0yMSoobTEyKm00NCAtIG00MiptMTQpICsgbTQxKihtMTIqbTI0IC0gbTIyKm0xNCkpO1xuXHRcdFx0dGhpcy5yYXdEYXRhWzExXSA9IC1kKihtMTEqKG0yMiptMzQgLSBtMzIqbTI0KSAtIG0yMSoobTEyKm0zNCAtIG0zMiptMTQpICsgbTMxKihtMTIqbTI0IC0gbTIyKm0xNCkpO1xuXHRcdFx0dGhpcy5yYXdEYXRhWzEyXSA9IC1kKihtMjEqKG0zMiptNDMgLSBtNDIqbTMzKSAtIG0zMSoobTIyKm00MyAtIG00MiptMjMpICsgbTQxKihtMjIqbTMzIC0gbTMyKm0yMykpO1xuXHRcdFx0dGhpcy5yYXdEYXRhWzEzXSA9IGQqKG0xMSoobTMyKm00MyAtIG00MiptMzMpIC0gbTMxKihtMTIqbTQzIC0gbTQyKm0xMykgKyBtNDEqKG0xMiptMzMgLSBtMzIqbTEzKSk7XG5cdFx0XHR0aGlzLnJhd0RhdGFbMTRdID0gLWQqKG0xMSoobTIyKm00MyAtIG00MiptMjMpIC0gbTIxKihtMTIqbTQzIC0gbTQyKm0xMykgKyBtNDEqKG0xMiptMjMgLSBtMjIqbTEzKSk7XG5cdFx0XHR0aGlzLnJhd0RhdGFbMTVdID0gZCoobTExKihtMjIqbTMzIC0gbTMyKm0yMykgLSBtMjEqKG0xMiptMzMgLSBtMzIqbTEzKSArIG0zMSoobTEyKm0yMyAtIG0yMiptMTMpKTtcblx0XHR9XG5cdFx0cmV0dXJuIGludmVydGFibGU7XG5cdH1cblxuXHQvKiBUT0RPIGltcGxlbWVudCBwb2ludEF0XG5cdCBwdWJsaWMgcG9pbnRBdCggcG9zOlZlY3RvcjNELCBhdDpWZWN0b3IzRCA9IG51bGwsIHVwOlZlY3RvcjNEID0gbnVsbCApXG5cdCB7XG5cdCB9XG5cdCAqL1xuXG5cdC8qKlxuXHQgKiBQcmVwZW5kcyBhIG1hdHJpeCBieSBtdWx0aXBseWluZyB0aGUgY3VycmVudCBNYXRyaXgzRCBvYmplY3QgYnkgYW5vdGhlciBNYXRyaXgzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgcHJlcGVuZChyaHM6TWF0cml4M0QpXG5cdHtcblx0XHR2YXIgbTExMTpudW1iZXIgPSByaHMucmF3RGF0YVswXSwgbTEyMTpudW1iZXIgPSByaHMucmF3RGF0YVs0XSwgbTEzMTpudW1iZXIgPSByaHMucmF3RGF0YVs4XSwgbTE0MTpudW1iZXIgPSByaHMucmF3RGF0YVsxMl0sIG0xMTI6bnVtYmVyID0gcmhzLnJhd0RhdGFbMV0sIG0xMjI6bnVtYmVyID0gcmhzLnJhd0RhdGFbNV0sIG0xMzI6bnVtYmVyID0gcmhzLnJhd0RhdGFbOV0sIG0xNDI6bnVtYmVyID0gcmhzLnJhd0RhdGFbMTNdLCBtMTEzOm51bWJlciA9IHJocy5yYXdEYXRhWzJdLCBtMTIzOm51bWJlciA9IHJocy5yYXdEYXRhWzZdLCBtMTMzOm51bWJlciA9IHJocy5yYXdEYXRhWzEwXSwgbTE0MzpudW1iZXIgPSByaHMucmF3RGF0YVsxNF0sIG0xMTQ6bnVtYmVyID0gcmhzLnJhd0RhdGFbM10sIG0xMjQ6bnVtYmVyID0gcmhzLnJhd0RhdGFbN10sIG0xMzQ6bnVtYmVyID0gcmhzLnJhd0RhdGFbMTFdLCBtMTQ0Om51bWJlciA9IHJocy5yYXdEYXRhWzE1XSwgbTIxMTpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMF0sIG0yMjE6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzRdLCBtMjMxOm51bWJlciA9IHRoaXMucmF3RGF0YVs4XSwgbTI0MTpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMTJdLCBtMjEyOm51bWJlciA9IHRoaXMucmF3RGF0YVsxXSwgbTIyMjpudW1iZXIgPSB0aGlzLnJhd0RhdGFbNV0sIG0yMzI6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzldLCBtMjQyOm51bWJlciA9IHRoaXMucmF3RGF0YVsxM10sIG0yMTM6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzJdLCBtMjIzOm51bWJlciA9IHRoaXMucmF3RGF0YVs2XSwgbTIzMzpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMTBdLCBtMjQzOm51bWJlciA9IHRoaXMucmF3RGF0YVsxNF0sIG0yMTQ6bnVtYmVyID0gdGhpcy5yYXdEYXRhWzNdLCBtMjI0Om51bWJlciA9IHRoaXMucmF3RGF0YVs3XSwgbTIzNDpudW1iZXIgPSB0aGlzLnJhd0RhdGFbMTFdLCBtMjQ0Om51bWJlciA9IHRoaXMucmF3RGF0YVsxNV07XG5cblx0XHR0aGlzLnJhd0RhdGFbMF0gPSBtMTExKm0yMTEgKyBtMTEyKm0yMjEgKyBtMTEzKm0yMzEgKyBtMTE0Km0yNDE7XG5cdFx0dGhpcy5yYXdEYXRhWzFdID0gbTExMSptMjEyICsgbTExMiptMjIyICsgbTExMyptMjMyICsgbTExNCptMjQyO1xuXHRcdHRoaXMucmF3RGF0YVsyXSA9IG0xMTEqbTIxMyArIG0xMTIqbTIyMyArIG0xMTMqbTIzMyArIG0xMTQqbTI0Mztcblx0XHR0aGlzLnJhd0RhdGFbM10gPSBtMTExKm0yMTQgKyBtMTEyKm0yMjQgKyBtMTEzKm0yMzQgKyBtMTE0Km0yNDQ7XG5cblx0XHR0aGlzLnJhd0RhdGFbNF0gPSBtMTIxKm0yMTEgKyBtMTIyKm0yMjEgKyBtMTIzKm0yMzEgKyBtMTI0Km0yNDE7XG5cdFx0dGhpcy5yYXdEYXRhWzVdID0gbTEyMSptMjEyICsgbTEyMiptMjIyICsgbTEyMyptMjMyICsgbTEyNCptMjQyO1xuXHRcdHRoaXMucmF3RGF0YVs2XSA9IG0xMjEqbTIxMyArIG0xMjIqbTIyMyArIG0xMjMqbTIzMyArIG0xMjQqbTI0Mztcblx0XHR0aGlzLnJhd0RhdGFbN10gPSBtMTIxKm0yMTQgKyBtMTIyKm0yMjQgKyBtMTIzKm0yMzQgKyBtMTI0Km0yNDQ7XG5cblx0XHR0aGlzLnJhd0RhdGFbOF0gPSBtMTMxKm0yMTEgKyBtMTMyKm0yMjEgKyBtMTMzKm0yMzEgKyBtMTM0Km0yNDE7XG5cdFx0dGhpcy5yYXdEYXRhWzldID0gbTEzMSptMjEyICsgbTEzMiptMjIyICsgbTEzMyptMjMyICsgbTEzNCptMjQyO1xuXHRcdHRoaXMucmF3RGF0YVsxMF0gPSBtMTMxKm0yMTMgKyBtMTMyKm0yMjMgKyBtMTMzKm0yMzMgKyBtMTM0Km0yNDM7XG5cdFx0dGhpcy5yYXdEYXRhWzExXSA9IG0xMzEqbTIxNCArIG0xMzIqbTIyNCArIG0xMzMqbTIzNCArIG0xMzQqbTI0NDtcblxuXHRcdHRoaXMucmF3RGF0YVsxMl0gPSBtMTQxKm0yMTEgKyBtMTQyKm0yMjEgKyBtMTQzKm0yMzEgKyBtMTQ0Km0yNDE7XG5cdFx0dGhpcy5yYXdEYXRhWzEzXSA9IG0xNDEqbTIxMiArIG0xNDIqbTIyMiArIG0xNDMqbTIzMiArIG0xNDQqbTI0Mjtcblx0XHR0aGlzLnJhd0RhdGFbMTRdID0gbTE0MSptMjEzICsgbTE0MiptMjIzICsgbTE0MyptMjMzICsgbTE0NCptMjQzO1xuXHRcdHRoaXMucmF3RGF0YVsxNV0gPSBtMTQxKm0yMTQgKyBtMTQyKm0yMjQgKyBtMTQzKm0yMzQgKyBtMTQ0Km0yNDQ7XG5cdH1cblxuXHQvKipcblx0ICogUHJlcGVuZHMgYW4gaW5jcmVtZW50YWwgcm90YXRpb24gdG8gYSBNYXRyaXgzRCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgcHJlcGVuZFJvdGF0aW9uKGRlZ3JlZXM6bnVtYmVyLCBheGlzOlZlY3RvcjNEKSAvLywgcGl2b3Q6VmVjdG9yM0QgPSBudWxsIClcblx0e1xuXHRcdHZhciBtOk1hdHJpeDNEID0gTWF0cml4M0QuZ2V0QXhpc1JvdGF0aW9uKGF4aXMueCwgYXhpcy55LCBheGlzLnosIGRlZ3JlZXMpO1xuXG5cdFx0Lypcblx0XHQgaWYgKCBwaXZvdCAhPSBudWxsIClcblx0XHQge1xuXHRcdCB2YXIgcDpWZWN0b3IzRCA9IHBpdm90O1xuXHRcdCBtLmFwcGVuZFRyYW5zbGF0aW9uKCBwLngsIHAueSwgcC56ICk7XG5cdFx0IH1cblx0XHQgKi9cblx0XHR0aGlzLnByZXBlbmQobSk7XG5cdH1cblxuXHQvKipcblx0ICogUHJlcGVuZHMgYW4gaW5jcmVtZW50YWwgc2NhbGUgY2hhbmdlIGFsb25nIHRoZSB4LCB5LCBhbmQgeiBheGVzIHRvIGEgTWF0cml4M0Qgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIHByZXBlbmRTY2FsZSh4U2NhbGU6bnVtYmVyLCB5U2NhbGU6bnVtYmVyLCB6U2NhbGU6bnVtYmVyKVxuXHR7XG5cblx0XHQvLyBJbml0aWFsIFRlc3RzIC0gT0tcblxuXHRcdHRoaXMucHJlcGVuZChuZXcgTWF0cml4M0QoWyB4U2NhbGUsIDAsIDAsIDAsIDAsIHlTY2FsZSwgMCwgMCwgMCwgMCwgelNjYWxlLCAwLCAwLCAwLCAwLCAxIF0pKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmVwZW5kcyBhbiBpbmNyZW1lbnRhbCB0cmFuc2xhdGlvbiwgYSByZXBvc2l0aW9uaW5nIGFsb25nIHRoZSB4LCB5LCBhbmQgeiBheGVzLCB0byBhIE1hdHJpeDNEIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBwcmVwZW5kVHJhbnNsYXRpb24oeDpudW1iZXIsIHk6bnVtYmVyLCB6Om51bWJlcilcblx0e1xuXG5cdFx0Ly8gSW5pdGlhbCBUZXN0cyAtIE9LXG5cblx0XHR2YXIgbSA9IG5ldyBNYXRyaXgzRCgpO1xuXHRcdG0ucG9zaXRpb24gPSBuZXcgVmVjdG9yM0QoeCwgeSwgeik7XG5cdFx0dGhpcy5wcmVwZW5kKG0pO1xuXHR9XG5cblx0Ly8gVE9ETyBvcmllbnRhdGlvblN0eWxlXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXgncyB0cmFuc2xhdGlvbiwgcm90YXRpb24sIGFuZCBzY2FsZSBzZXR0aW5ncy5cblx0ICovXG5cdHB1YmxpYyByZWNvbXBvc2UoY29tcG9uZW50czpWZWN0b3IzRFtdKTpib29sZWFuXG5cdHtcblxuXHRcdC8vIEluaXRpYWwgVGVzdHMgLSBPS1xuXG5cdFx0aWYgKGNvbXBvbmVudHMubGVuZ3RoIDwgMykgcmV0dXJuIGZhbHNlXG5cblx0XHQvL2NvbXBvbmVudHNbMl0ueCA9PSAwIHx8IGNvbXBvbmVudHNbMl0ueSA9PSAwIHx8IGNvbXBvbmVudHNbMl0ueiA9PSAwKSByZXR1cm4gZmFsc2U7XG5cblx0XHR0aGlzLmlkZW50aXR5KCk7XG5cdFx0dGhpcy5hcHBlbmRTY2FsZShjb21wb25lbnRzWzJdLngsIGNvbXBvbmVudHNbMl0ueSwgY29tcG9uZW50c1syXS56KTtcblxuXHRcdHZhciBhbmdsZTpudW1iZXI7XG5cdFx0YW5nbGUgPSAtY29tcG9uZW50c1sxXS54O1xuXHRcdHRoaXMuYXBwZW5kKG5ldyBNYXRyaXgzRChbMSwgMCwgMCwgMCwgMCwgTWF0aC5jb3MoYW5nbGUpLCAtTWF0aC5zaW4oYW5nbGUpLCAwLCAwLCBNYXRoLnNpbihhbmdsZSksIE1hdGguY29zKGFuZ2xlKSwgMCwgMCwgMCwgMCAsIDBdKSk7XG5cdFx0YW5nbGUgPSAtY29tcG9uZW50c1sxXS55O1xuXHRcdHRoaXMuYXBwZW5kKG5ldyBNYXRyaXgzRChbTWF0aC5jb3MoYW5nbGUpLCAwLCBNYXRoLnNpbihhbmdsZSksIDAsIDAsIDEsIDAsIDAsIC1NYXRoLnNpbihhbmdsZSksIDAsIE1hdGguY29zKGFuZ2xlKSwgMCwgMCwgMCwgMCwgMF0pKTtcblx0XHRhbmdsZSA9IC1jb21wb25lbnRzWzFdLno7XG5cdFx0dGhpcy5hcHBlbmQobmV3IE1hdHJpeDNEKFtNYXRoLmNvcyhhbmdsZSksIC1NYXRoLnNpbihhbmdsZSksIDAsIDAsIE1hdGguc2luKGFuZ2xlKSwgTWF0aC5jb3MoYW5nbGUpLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAwXSkpO1xuXG5cdFx0dGhpcy5wb3NpdGlvbiA9IGNvbXBvbmVudHNbMF07XG5cdFx0dGhpcy5yYXdEYXRhWzE1XSA9IDE7XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyB0cmFuc2Zvcm1WZWN0b3IodjpWZWN0b3IzRCk6VmVjdG9yM0Rcblx0e1xuXHRcdHZhciB4Om51bWJlciA9IHYueDtcblx0XHR2YXIgeTpudW1iZXIgPSB2Lnk7XG5cdFx0dmFyIHo6bnVtYmVyID0gdi56O1xuXG5cdFx0cmV0dXJuIG5ldyBWZWN0b3IzRCgoeCp0aGlzLnJhd0RhdGFbMF0gKyB5KnRoaXMucmF3RGF0YVs0XSArIHoqdGhpcy5yYXdEYXRhWzhdICsgdGhpcy5yYXdEYXRhWzEyXSksICh4KnRoaXMucmF3RGF0YVsxXSArIHkqdGhpcy5yYXdEYXRhWzVdICsgeip0aGlzLnJhd0RhdGFbOV0gKyB0aGlzLnJhd0RhdGFbMTNdKSwgKHgqdGhpcy5yYXdEYXRhWzJdICsgeSp0aGlzLnJhd0RhdGFbNl0gKyB6KnRoaXMucmF3RGF0YVsxMF0gKyB0aGlzLnJhd0RhdGFbMTRdKSwgKHgqdGhpcy5yYXdEYXRhWzNdICsgeSp0aGlzLnJhd0RhdGFbN10gKyB6KnRoaXMucmF3RGF0YVsxMV0gKyB0aGlzLnJhd0RhdGFbMTVdKSk7XG5cdH1cblxuXHQvKipcblx0ICogVXNlcyB0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRvIHRyYW5zZm9ybSBhIFZlY3RvciBvZiBOdW1iZXJzIGZyb20gb25lIGNvb3JkaW5hdGUgc3BhY2UgdG8gYW5vdGhlci5cblx0ICovXG5cdHB1YmxpYyB0cmFuc2Zvcm1WZWN0b3JzKHZpbjpudW1iZXJbXSwgdm91dDpudW1iZXJbXSlcblx0e1xuXG5cdFx0Ly8gSW5pdGlhbCBUZXN0cyAtIE9LXG5cblx0XHR2YXIgaTpudW1iZXIgPSAwO1xuXHRcdHZhciB4Om51bWJlciA9IDAsIHk6bnVtYmVyID0gMCwgejpudW1iZXIgPSAwO1xuXG5cdFx0d2hpbGUgKGkgKyAzIDw9IHZpbi5sZW5ndGgpIHtcblx0XHRcdHggPSB2aW5baV07XG5cdFx0XHR5ID0gdmluW2kgKyAxXTtcblx0XHRcdHogPSB2aW5baSArIDJdO1xuXHRcdFx0dm91dFtpXSA9IHgqdGhpcy5yYXdEYXRhWzBdICsgeSp0aGlzLnJhd0RhdGFbNF0gKyB6KnRoaXMucmF3RGF0YVs4XSArIHRoaXMucmF3RGF0YVsxMl07XG5cdFx0XHR2b3V0W2kgKyAxXSA9IHgqdGhpcy5yYXdEYXRhWzFdICsgeSp0aGlzLnJhd0RhdGFbNV0gKyB6KnRoaXMucmF3RGF0YVs5XSArIHRoaXMucmF3RGF0YVsxM107XG5cdFx0XHR2b3V0W2kgKyAyXSA9IHgqdGhpcy5yYXdEYXRhWzJdICsgeSp0aGlzLnJhd0RhdGFbNl0gKyB6KnRoaXMucmF3RGF0YVsxMF0gKyB0aGlzLnJhd0RhdGFbMTRdO1xuXHRcdFx0aSArPSAzO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyB0aGUgY3VycmVudCBNYXRyaXgzRCBvYmplY3QgdG8gYSBtYXRyaXggd2hlcmUgdGhlIHJvd3MgYW5kIGNvbHVtbnMgYXJlIHN3YXBwZWQuXG5cdCAqL1xuXHRwdWJsaWMgdHJhbnNwb3NlKClcblx0e1xuXG5cdFx0Ly8gSW5pdGlhbCBUZXN0cyAtIE9LXG5cblx0XHR2YXIgb1Jhd0RhdGE6bnVtYmVyW10gPSB0aGlzLnJhd0RhdGEuc2xpY2UoMCk7XG5cblx0XHR0aGlzLnJhd0RhdGFbMV0gPSBvUmF3RGF0YVs0XTtcblx0XHR0aGlzLnJhd0RhdGFbMl0gPSBvUmF3RGF0YVs4XTtcblx0XHR0aGlzLnJhd0RhdGFbM10gPSBvUmF3RGF0YVsxMl07XG5cdFx0dGhpcy5yYXdEYXRhWzRdID0gb1Jhd0RhdGFbMV07XG5cdFx0dGhpcy5yYXdEYXRhWzZdID0gb1Jhd0RhdGFbOV07XG5cdFx0dGhpcy5yYXdEYXRhWzddID0gb1Jhd0RhdGFbMTNdO1xuXHRcdHRoaXMucmF3RGF0YVs4XSA9IG9SYXdEYXRhWzJdO1xuXHRcdHRoaXMucmF3RGF0YVs5XSA9IG9SYXdEYXRhWzZdO1xuXHRcdHRoaXMucmF3RGF0YVsxMV0gPSBvUmF3RGF0YVsxNF07XG5cdFx0dGhpcy5yYXdEYXRhWzEyXSA9IG9SYXdEYXRhWzNdO1xuXHRcdHRoaXMucmF3RGF0YVsxM10gPSBvUmF3RGF0YVs3XTtcblx0XHR0aGlzLnJhd0RhdGFbMTRdID0gb1Jhd0RhdGFbMTFdO1xuXHR9XG5cblx0c3RhdGljIGdldEF4aXNSb3RhdGlvbih4Om51bWJlciwgeTpudW1iZXIsIHo6bnVtYmVyLCBkZWdyZWVzOm51bWJlcik6TWF0cml4M0Rcblx0e1xuXG5cdFx0Ly8gaW50ZXJuYWwgY2xhc3MgdXNlIGJ5IHJvdGF0aW9ucyB3aGljaCBoYXZlIGJlZW4gdGVzdGVkXG5cblx0XHR2YXIgbTpNYXRyaXgzRCA9IG5ldyBNYXRyaXgzRCgpO1xuXG5cdFx0dmFyIHJhZCA9IGRlZ3JlZXMqKCBNYXRoLlBJLzE4MCApO1xuXHRcdHZhciBjOm51bWJlciA9IE1hdGguY29zKHJhZCk7XG5cdFx0dmFyIHM6bnVtYmVyID0gTWF0aC5zaW4ocmFkKTtcblx0XHR2YXIgdDpudW1iZXIgPSAxIC0gYztcblx0XHR2YXIgdG1wMTpudW1iZXIsIHRtcDI6bnVtYmVyO1xuXG5cdFx0bS5yYXdEYXRhWzBdID0gYyArIHgqeCp0O1xuXHRcdG0ucmF3RGF0YVs1XSA9IGMgKyB5KnkqdDtcblx0XHRtLnJhd0RhdGFbMTBdID0gYyArIHoqeip0O1xuXG5cdFx0dG1wMSA9IHgqeSp0O1xuXHRcdHRtcDIgPSB6KnM7XG5cdFx0bS5yYXdEYXRhWzFdID0gdG1wMSArIHRtcDI7XG5cdFx0bS5yYXdEYXRhWzRdID0gdG1wMSAtIHRtcDI7XG5cdFx0dG1wMSA9IHgqeip0O1xuXHRcdHRtcDIgPSB5KnM7XG5cdFx0bS5yYXdEYXRhWzhdID0gdG1wMSArIHRtcDI7XG5cdFx0bS5yYXdEYXRhWzJdID0gdG1wMSAtIHRtcDI7XG5cdFx0dG1wMSA9IHkqeip0O1xuXHRcdHRtcDIgPSB4KnM7XG5cdFx0bS5yYXdEYXRhWzldID0gdG1wMSAtIHRtcDI7XG5cdFx0bS5yYXdEYXRhWzZdID0gdG1wMSArIHRtcDI7XG5cblx0XHRyZXR1cm4gbTtcblx0fVxuXG5cdC8qKlxuXHQgKiBbcmVhZC1vbmx5XSBBIE51bWJlciB0aGF0IGRldGVybWluZXMgd2hldGhlciBhIG1hdHJpeCBpcyBpbnZlcnRpYmxlLlxuXHQgKi9cblx0cHVibGljIGdldCBkZXRlcm1pbmFudCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuICAgICgodGhpcy5yYXdEYXRhWzBdKnRoaXMucmF3RGF0YVs1XSAtIHRoaXMucmF3RGF0YVs0XSp0aGlzLnJhd0RhdGFbMV0pKih0aGlzLnJhd0RhdGFbMTBdKnRoaXMucmF3RGF0YVsxNV0gLSB0aGlzLnJhd0RhdGFbMTRdKnRoaXMucmF3RGF0YVsxMV0pIC0gKHRoaXMucmF3RGF0YVswXSp0aGlzLnJhd0RhdGFbOV0gLSB0aGlzLnJhd0RhdGFbOF0qdGhpcy5yYXdEYXRhWzFdKSoodGhpcy5yYXdEYXRhWzZdKnRoaXMucmF3RGF0YVsxNV0gLSB0aGlzLnJhd0RhdGFbMTRdKnRoaXMucmF3RGF0YVs3XSkgKyAodGhpcy5yYXdEYXRhWzBdKnRoaXMucmF3RGF0YVsxM10gLSB0aGlzLnJhd0RhdGFbMTJdKnRoaXMucmF3RGF0YVsxXSkqKHRoaXMucmF3RGF0YVs2XSp0aGlzLnJhd0RhdGFbMTFdIC0gdGhpcy5yYXdEYXRhWzEwXSp0aGlzLnJhd0RhdGFbN10pICsgKHRoaXMucmF3RGF0YVs0XSp0aGlzLnJhd0RhdGFbOV0gLSB0aGlzLnJhd0RhdGFbOF0qdGhpcy5yYXdEYXRhWzVdKSoodGhpcy5yYXdEYXRhWzJdKnRoaXMucmF3RGF0YVsxNV0gLSB0aGlzLnJhd0RhdGFbMTRdKnRoaXMucmF3RGF0YVszXSkgLSAodGhpcy5yYXdEYXRhWzRdKnRoaXMucmF3RGF0YVsxM10gLSB0aGlzLnJhd0RhdGFbMTJdKnRoaXMucmF3RGF0YVs1XSkqKHRoaXMucmF3RGF0YVsyXSp0aGlzLnJhd0RhdGFbMTFdIC0gdGhpcy5yYXdEYXRhWzEwXSp0aGlzLnJhd0RhdGFbM10pICsgKHRoaXMucmF3RGF0YVs4XSp0aGlzLnJhd0RhdGFbMTNdIC0gdGhpcy5yYXdEYXRhWzEyXSp0aGlzLnJhd0RhdGFbOV0pKih0aGlzLnJhd0RhdGFbMl0qdGhpcy5yYXdEYXRhWzddIC0gdGhpcy5yYXdEYXRhWzZdKnRoaXMucmF3RGF0YVszXSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgVmVjdG9yM0Qgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIHBvc2l0aW9uLCB0aGUgM0QgY29vcmRpbmF0ZSAoeCx5LHopIG9mIGEgZGlzcGxheSBvYmplY3Qgd2l0aGluIHRoZVxuXHQgKiB0cmFuc2Zvcm1hdGlvbidzIGZyYW1lIG9mIHJlZmVyZW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgcG9zaXRpb24oKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIG5ldyBWZWN0b3IzRCh0aGlzLnJhd0RhdGFbMTJdLCB0aGlzLnJhd0RhdGFbMTNdLCB0aGlzLnJhd0RhdGFbMTRdKTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcG9zaXRpb24odmFsdWU6VmVjdG9yM0QpXG5cdHtcblx0XHR0aGlzLnJhd0RhdGFbMTJdID0gdmFsdWUueDtcblx0XHR0aGlzLnJhd0RhdGFbMTNdID0gdmFsdWUueTtcblx0XHR0aGlzLnJhd0RhdGFbMTRdID0gdmFsdWUuejtcblx0fVxuXG5cdHB1YmxpYyB0b0ZpeGVkKGRlY2ltYWxQbGFjZTpudW1iZXIpOnN0cmluZ1xuXHR7XG5cdFx0dmFyIG1hZ25pdHVkZTpudW1iZXIgPSBNYXRoLnBvdygxMCwgZGVjaW1hbFBsYWNlKTtcblx0XHRyZXR1cm4gXCJtYXRyaXgzZChcIiArIE1hdGgucm91bmQodGhpcy5yYXdEYXRhWzBdKm1hZ25pdHVkZSkvbWFnbml0dWRlICsgXCIsXCIgKyBNYXRoLnJvdW5kKHRoaXMucmF3RGF0YVsxXSptYWduaXR1ZGUpL21hZ25pdHVkZSArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbMl0qbWFnbml0dWRlKS9tYWduaXR1ZGUgKyBcIixcIiArIE1hdGgucm91bmQodGhpcy5yYXdEYXRhWzNdKm1hZ25pdHVkZSkvbWFnbml0dWRlICsgXCIsXCIgKyBNYXRoLnJvdW5kKHRoaXMucmF3RGF0YVs0XSptYWduaXR1ZGUpL21hZ25pdHVkZSArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbNV0qbWFnbml0dWRlKS9tYWduaXR1ZGUgKyBcIixcIiArIE1hdGgucm91bmQodGhpcy5yYXdEYXRhWzZdKm1hZ25pdHVkZSkvbWFnbml0dWRlICsgXCIsXCIgKyBNYXRoLnJvdW5kKHRoaXMucmF3RGF0YVs3XSptYWduaXR1ZGUpL21hZ25pdHVkZSArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbOF0qbWFnbml0dWRlKS9tYWduaXR1ZGUgKyBcIixcIiArIE1hdGgucm91bmQodGhpcy5yYXdEYXRhWzldKm1hZ25pdHVkZSkvbWFnbml0dWRlICsgXCIsXCIgKyBNYXRoLnJvdW5kKHRoaXMucmF3RGF0YVsxMF0qbWFnbml0dWRlKS9tYWduaXR1ZGUgKyBcIixcIiArIE1hdGgucm91bmQodGhpcy5yYXdEYXRhWzExXSptYWduaXR1ZGUpL21hZ25pdHVkZSArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbMTJdKm1hZ25pdHVkZSkvbWFnbml0dWRlICsgXCIsXCIgKyBNYXRoLnJvdW5kKHRoaXMucmF3RGF0YVsxM10qbWFnbml0dWRlKS9tYWduaXR1ZGUgKyBcIixcIiArIE1hdGgucm91bmQodGhpcy5yYXdEYXRhWzE0XSptYWduaXR1ZGUpL21hZ25pdHVkZSArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbMTVdKm1hZ25pdHVkZSkvbWFnbml0dWRlICsgXCIpXCI7XG5cdH1cblxuXHRwdWJsaWMgdG9TdHJpbmcoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBcIm1hdHJpeDNkKFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbMF0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbMV0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbMl0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbM10qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbNF0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbNV0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbNl0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbN10qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbOF0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbOV0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbMTBdKjEwMDApLzEwMDAgKyBcIixcIiArIE1hdGgucm91bmQodGhpcy5yYXdEYXRhWzExXSoxMDAwKS8xMDAwICsgXCIsXCIgKyBNYXRoLnJvdW5kKHRoaXMucmF3RGF0YVsxMl0qMTAwMCkvMTAwMCArIFwiLFwiICsgTWF0aC5yb3VuZCh0aGlzLnJhd0RhdGFbMTNdKjEwMDApLzEwMDAgKyBcIixcIiArIE1hdGgucm91bmQodGhpcy5yYXdEYXRhWzE0XSoxMDAwKS8xMDAwICsgXCIsXCIgKyBNYXRoLnJvdW5kKHRoaXMucmF3RGF0YVsxNV0qMTAwMCkvMTAwMCArIFwiKVwiO1xuXHR9XG59XG5cbmV4cG9ydCA9IE1hdHJpeDNEOyJdfQ== \ No newline at end of file diff --git a/lib/core/geom/Matrix3D.ts b/lib/core/geom/Matrix3D.ts new file mode 100644 index 00000000..4bfabc5a --- /dev/null +++ b/lib/core/geom/Matrix3D.ts @@ -0,0 +1,699 @@ +import Orientation3D = require("awayjs-core/lib/core/geom/Orientation3D"); +import Quaternion = require("awayjs-core/lib/core/geom/Quaternion"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); + +class Matrix3D +{ + /** + * A Vector of 16 Numbers, where every four elements is a column of a 4x4 matrix. + * + *

An exception is thrown if the rawData property is set to a matrix that is not invertible. The Matrix3D + * object must be invertible. If a non-invertible matrix is needed, create a subclass of the Matrix3D object.

+ */ + public rawData:number[]; + + /** + * Creates a Matrix3D object. + */ + constructor(v:number[] = null) + { + if (v != null && v.length == 16) + this.rawData = v.concat(); + else + this.rawData = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]; + } + + /** + * Appends the matrix by multiplying another Matrix3D object by the current Matrix3D object. + */ + public append(lhs:Matrix3D) + { + var m111:number = this.rawData[0], m121:number = this.rawData[4], m131:number = this.rawData[8], m141:number = this.rawData[12], m112:number = this.rawData[1], m122:number = this.rawData[5], m132:number = this.rawData[9], m142:number = this.rawData[13], m113:number = this.rawData[2], m123:number = this.rawData[6], m133:number = this.rawData[10], m143:number = this.rawData[14], m114:number = this.rawData[3], m124:number = this.rawData[7], m134:number = this.rawData[11], m144:number = this.rawData[15], m211:number = lhs.rawData[0], m221:number = lhs.rawData[4], m231:number = lhs.rawData[8], m241:number = lhs.rawData[12], m212:number = lhs.rawData[1], m222:number = lhs.rawData[5], m232:number = lhs.rawData[9], m242:number = lhs.rawData[13], m213:number = lhs.rawData[2], m223:number = lhs.rawData[6], m233:number = lhs.rawData[10], m243:number = lhs.rawData[14], m214:number = lhs.rawData[3], m224:number = lhs.rawData[7], m234:number = lhs.rawData[11], m244:number = 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; + } + + /** + * Appends an incremental rotation to a Matrix3D object. + */ + public appendRotation(degrees:number, axis:Vector3D):void //, pivot:Vector3D = null ) + { + var m:Matrix3D = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); + + this.append(m); + } + + /** + * Appends an incremental scale change along the x, y, and z axes to a Matrix3D object. + */ + public appendScale(xScale:number, yScale:number, zScale:number) + { + this.append(new 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 ])); + } + + /** + * Appends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. + */ + public appendTranslation(x:number, y:number, z:number) + { + this.rawData[12] += x; + this.rawData[13] += y; + this.rawData[14] += z; + } + + /** + * Returns a new Matrix3D object that is an exact copy of the current Matrix3D object. + */ + public clone():Matrix3D + { + return new Matrix3D(this.rawData.slice(0)); + } + + /** + * Copies a Vector3D object into specific column of the calling Matrix3D object. + */ + public copyColumnFrom(column:number, vector3D:Vector3D) + { + switch (column) { + case 0: + this.rawData[ 0 ] = vector3D.x; + this.rawData[ 1 ] = vector3D.y; + this.rawData[ 2 ] = vector3D.z; + this.rawData[ 3 ] = vector3D.w; + break; + case 1: + this.rawData[ 4 ] = vector3D.x; + this.rawData[ 5 ] = vector3D.y; + this.rawData[ 6 ] = vector3D.z; + this.rawData[ 7 ] = vector3D.w; + break; + case 2: + this.rawData[ 8 ] = vector3D.x; + this.rawData[ 9 ] = vector3D.y; + this.rawData[ 10 ] = vector3D.z; + this.rawData[ 11 ] = vector3D.w; + break; + case 3: + this.rawData[ 12 ] = vector3D.x; + this.rawData[ 13 ] = vector3D.y; + this.rawData[ 14 ] = vector3D.z; + this.rawData[ 15 ] = vector3D.w; + break; + default: + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); + } + } + + /** + * Copies specific column of the calling Matrix3D object into the Vector3D object. + */ + public copyColumnTo(column:number, vector3D:Vector3D) + { + switch (column) { + case 0: + vector3D.x = this.rawData[ 0 ]; + vector3D.y = this.rawData[ 1 ]; + vector3D.z = this.rawData[ 2 ]; + vector3D.w = this.rawData[ 3 ]; + break; + case 1: + vector3D.x = this.rawData[ 4 ]; + vector3D.y = this.rawData[ 5 ]; + vector3D.z = this.rawData[ 6 ]; + vector3D.w = this.rawData[ 7 ]; + break; + case 2: + vector3D.x = this.rawData[ 8 ]; + vector3D.y = this.rawData[ 9 ]; + vector3D.z = this.rawData[ 10 ]; + vector3D.w = this.rawData[ 11 ]; + break; + case 3: + vector3D.x = this.rawData[ 12 ]; + vector3D.y = this.rawData[ 13 ]; + vector3D.z = this.rawData[ 14 ]; + vector3D.w = this.rawData[ 15 ]; + break; + default: + throw new ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); + } + } + + /** + * Copies all of the matrix data from the source Matrix3D object into the calling Matrix3D object. + */ + public copyFrom(sourceMatrix3D:Matrix3D) + { + var len:number = sourceMatrix3D.rawData.length; + for (var c:number = 0; c < len; c++) + this.rawData[c] = sourceMatrix3D.rawData[c]; + } + + public copyRawDataFrom(vector:number[], index:number = 0, transpose:boolean = false):void + { + if (transpose) + this.transpose(); + + var len:number = vector.length - index; + for (var c:number = 0; c < len; c++) + this.rawData[c] = vector[c + index]; + + if (transpose) + this.transpose(); + } + + public copyRawDataTo(vector:number[], index:number = 0, transpose:boolean = false) + { + if (transpose) + this.transpose(); + + var len:number = this.rawData.length + for (var c:number = 0; c < len; c++) + vector[c + index ] = this.rawData[c]; + + if (transpose) + this.transpose(); + } + + /** + * Copies a Vector3D object into specific row of the calling Matrix3D object. + */ + public copyRowFrom(row:number, vector3D:Vector3D) + { + switch (row) { + case 0: + this.rawData[ 0 ] = vector3D.x; + this.rawData[ 4 ] = vector3D.y; + this.rawData[ 8 ] = vector3D.z; + this.rawData[ 12 ] = vector3D.w; + break; + case 1: + this.rawData[ 1 ] = vector3D.x; + this.rawData[ 5 ] = vector3D.y; + this.rawData[ 9 ] = vector3D.z; + this.rawData[ 13 ] = vector3D.w; + break; + case 2: + this.rawData[ 2 ] = vector3D.x; + this.rawData[ 6 ] = vector3D.y; + this.rawData[ 10 ] = vector3D.z; + this.rawData[ 14 ] = vector3D.w; + break; + case 3: + this.rawData[ 3 ] = vector3D.x; + this.rawData[ 7 ] = vector3D.y; + this.rawData[ 11 ] = vector3D.z; + this.rawData[ 15 ] = vector3D.w; + break; + default: + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); + } + } + + /** + * Copies specific row of the calling Matrix3D object into the Vector3D object. + */ + public copyRowTo(row:number, vector3D:Vector3D) + { + switch (row) { + case 0: + vector3D.x = this.rawData[ 0 ]; + vector3D.y = this.rawData[ 4 ]; + vector3D.z = this.rawData[ 8 ]; + vector3D.w = this.rawData[ 12 ]; + break; + case 1: + vector3D.x = this.rawData[ 1 ]; + vector3D.y = this.rawData[ 5 ]; + vector3D.z = this.rawData[ 9 ]; + vector3D.w = this.rawData[ 13 ]; + break; + case 2: + vector3D.x = this.rawData[ 2 ]; + vector3D.y = this.rawData[ 6 ]; + vector3D.z = this.rawData[ 10 ]; + vector3D.w = this.rawData[ 14 ]; + break; + case 3: + vector3D.x = this.rawData[ 3 ]; + vector3D.y = this.rawData[ 7 ]; + vector3D.z = this.rawData[ 11 ]; + vector3D.w = this.rawData[ 15 ] + break; + default: + throw new ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); + } + } + + /** + * Copies this Matrix3D object into a destination Matrix3D object. + */ + public copyToMatrix3D(dest:Matrix3D) + { + dest.rawData = this.rawData.slice(0); + } + + /** + * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector3D objects. + */ + public decompose(orientationStyle:string = "eulerAngles"):Vector3D[] + { + var q:Quaternion; + + // Initial Tests - Not OK + + var vec:Vector3D[] = []; + var m = this.clone(); + var mr = m.rawData; + + var pos:Vector3D = new Vector3D(mr[12], mr[13], mr[14]); + mr[12] = 0; + mr[13] = 0; + mr[14] = 0; + + var scale:Vector3D = new 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 Vector3D(); + + switch (orientationStyle) { + case Orientation3D.AXIS_ANGLE: + + rot.w = Math.acos((mr[0] + mr[5] + mr[10] - 1)/2); + + var len:number = Math.sqrt((mr[6] - mr[9])*(mr[6] - mr[9]) + (mr[8] - mr[2])*(mr[8] - mr[2]) + (mr[1] - mr[4])*(mr[1] - mr[4])); + rot.x = (mr[6] - mr[9])/len; + rot.y = (mr[8] - mr[2])/len; + rot.z = (mr[1] - mr[4])/len; + + break; + case Orientation3D.QUATERNION: + + var tr = mr[0] + mr[5] + mr[10]; + + if (tr > 0) { + rot.w = Math.sqrt(1 + tr)/2; + + rot.x = (mr[6] - mr[9])/(4*rot.w); + rot.y = (mr[8] - mr[2])/(4*rot.w); + rot.z = (mr[1] - mr[4])/(4*rot.w); + } else if ((mr[0] > mr[5]) && (mr[0] > mr[10])) { + rot.x = Math.sqrt(1 + mr[0] - mr[5] - mr[10])/2; + + rot.w = (mr[6] - mr[9])/(4*rot.x); + rot.y = (mr[1] + mr[4])/(4*rot.x); + rot.z = (mr[8] + mr[2])/(4*rot.x); + } else if (mr[5] > mr[10]) { + rot.y = Math.sqrt(1 + mr[5] - mr[0] - mr[10])/2; + + rot.x = (mr[1] + mr[4])/(4*rot.y); + rot.w = (mr[8] - mr[2])/(4*rot.y); + rot.z = (mr[6] + mr[9])/(4*rot.y); + } else { + rot.z = Math.sqrt(1 + mr[10] - mr[0] - mr[5])/2; + + rot.x = (mr[8] + mr[2])/(4*rot.z); + rot.y = (mr[6] + mr[9])/(4*rot.z); + rot.w = (mr[1] - mr[4])/(4*rot.z); + } + + + break; + case Orientation3D.EULER_ANGLES: + + rot.y = Math.asin(-mr[2]); + + //var cos:number = Math.cos(rot.y); + + if (mr[2] != 1 && mr[2] != -1) { + 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]); + } + + break; + } + + vec.push(pos); + vec.push(rot); + vec.push(scale); + + return vec; + } + + /** + * Uses the transformation matrix without its translation elements to transform a Vector3D object from one space + * coordinate to another. + */ + public deltaTransformVector(v:Vector3D):Vector3D + { + var x:number = v.x; + var y:number = v.y; + var z:number = v.z; + + return new Vector3D((x*this.rawData[0] + y*this.rawData[4] + z*this.rawData[8]), (x*this.rawData[1] + y*this.rawData[5] + z*this.rawData[9]), (x*this.rawData[2] + y*this.rawData[6] + z*this.rawData[10]), (x*this.rawData[3] + y*this.rawData[7] + z*this.rawData[11])); + } + + /** + * Converts the current matrix to an identity or unit matrix. + */ + public identity() + { + this.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]; + } + + /** + * [static] Interpolates the translation, rotation, and scale transformation of one matrix toward those of the target matrix. + */ + static interpolate(thisMat:Matrix3D, toMat:Matrix3D, percent:number):Matrix3D + { + var m:Matrix3D = new Matrix3D(); + for (var i:number = 0; i < 16; ++i) + m.rawData[i] = thisMat.rawData[i] + (toMat.rawData[i] - thisMat.rawData[i])*percent; + + return m; + } + + /** + * Interpolates this matrix towards the translation, rotation, and scale transformations of the target matrix. + */ + public interpolateTo(toMat:Matrix3D, percent:number) + { + for (var i:number = 0; i < 16; ++i) + this.rawData[i] = this.rawData[i] + (toMat.rawData[i] - this.rawData[i])*percent; + } + + /** + * Inverts the current matrix. + */ + public invert():boolean + { + var d = this.determinant; + var invertable = Math.abs(d) > 0.00000000001; + + if (invertable) { + d = 1/d; + var m11:number = this.rawData[0]; + var m21:number = this.rawData[4]; + var m31:number = this.rawData[8]; + var m41:number = this.rawData[12]; + var m12:number = this.rawData[1]; + var m22:number = this.rawData[5]; + var m32:number = this.rawData[9]; + var m42:number = this.rawData[13]; + var m13:number = this.rawData[2]; + var m23:number = this.rawData[6]; + var m33:number = this.rawData[10]; + var m43:number = this.rawData[14]; + var m14:number = this.rawData[3]; + var m24:number = this.rawData[7]; + var m34:number = this.rawData[11]; + var m44:number = 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 invertable; + } + + /* TODO implement pointAt + public pointAt( pos:Vector3D, at:Vector3D = null, up:Vector3D = null ) + { + } + */ + + /** + * Prepends a matrix by multiplying the current Matrix3D object by another Matrix3D object. + */ + public prepend(rhs:Matrix3D) + { + var m111:number = rhs.rawData[0], m121:number = rhs.rawData[4], m131:number = rhs.rawData[8], m141:number = rhs.rawData[12], m112:number = rhs.rawData[1], m122:number = rhs.rawData[5], m132:number = rhs.rawData[9], m142:number = rhs.rawData[13], m113:number = rhs.rawData[2], m123:number = rhs.rawData[6], m133:number = rhs.rawData[10], m143:number = rhs.rawData[14], m114:number = rhs.rawData[3], m124:number = rhs.rawData[7], m134:number = rhs.rawData[11], m144:number = rhs.rawData[15], m211:number = this.rawData[0], m221:number = this.rawData[4], m231:number = this.rawData[8], m241:number = this.rawData[12], m212:number = this.rawData[1], m222:number = this.rawData[5], m232:number = this.rawData[9], m242:number = this.rawData[13], m213:number = this.rawData[2], m223:number = this.rawData[6], m233:number = this.rawData[10], m243:number = this.rawData[14], m214:number = this.rawData[3], m224:number = this.rawData[7], m234:number = this.rawData[11], m244:number = 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; + } + + /** + * Prepends an incremental rotation to a Matrix3D object. + */ + public prependRotation(degrees:number, axis:Vector3D) //, pivot:Vector3D = null ) + { + var m:Matrix3D = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); + + /* + if ( pivot != null ) + { + var p:Vector3D = pivot; + m.appendTranslation( p.x, p.y, p.z ); + } + */ + this.prepend(m); + } + + /** + * Prepends an incremental scale change along the x, y, and z axes to a Matrix3D object. + */ + public prependScale(xScale:number, yScale:number, zScale:number) + { + + // Initial Tests - OK + + this.prepend(new Matrix3D([ xScale, 0, 0, 0, 0, yScale, 0, 0, 0, 0, zScale, 0, 0, 0, 0, 1 ])); + } + + /** + * Prepends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. + */ + public prependTranslation(x:number, y:number, z:number) + { + + // Initial Tests - OK + + var m = new Matrix3D(); + m.position = new Vector3D(x, y, z); + this.prepend(m); + } + + // TODO orientationStyle + /** + * Sets the transformation matrix's translation, rotation, and scale settings. + */ + public recompose(components:Vector3D[]):boolean + { + + // Initial Tests - OK + + if (components.length < 3) return false + + //components[2].x == 0 || components[2].y == 0 || components[2].z == 0) return false; + + this.identity(); + this.appendScale(components[2].x, components[2].y, components[2].z); + + var angle:number; + angle = -components[1].x; + this.append(new 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 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 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.position = components[0]; + this.rawData[15] = 1; + + return true; + } + + public transformVector(v:Vector3D):Vector3D + { + var x:number = v.x; + var y:number = v.y; + var z:number = v.z; + + return new 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]), (x*this.rawData[3] + y*this.rawData[7] + z*this.rawData[11] + this.rawData[15])); + } + + /** + * Uses the transformation matrix to transform a Vector of Numbers from one coordinate space to another. + */ + public transformVectors(vin:number[], vout:number[]) + { + + // Initial Tests - OK + + var i:number = 0; + var x:number = 0, y:number = 0, z:number = 0; + + while (i + 3 <= vin.length) { + 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; + } + } + + /** + * Converts the current Matrix3D object to a matrix where the rows and columns are swapped. + */ + public transpose() + { + + // Initial Tests - OK + + var oRawData:number[] = this.rawData.slice(0); + + 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]; + } + + static getAxisRotation(x:number, y:number, z:number, degrees:number):Matrix3D + { + + // internal class use by rotations which have been tested + + var m:Matrix3D = new Matrix3D(); + + var rad = degrees*( Math.PI/180 ); + var c:number = Math.cos(rad); + var s:number = Math.sin(rad); + var t:number = 1 - c; + var tmp1:number, tmp2:number; + + m.rawData[0] = c + x*x*t; + m.rawData[5] = c + y*y*t; + m.rawData[10] = c + z*z*t; + + tmp1 = x*y*t; + tmp2 = z*s; + m.rawData[1] = tmp1 + tmp2; + m.rawData[4] = tmp1 - tmp2; + tmp1 = x*z*t; + tmp2 = y*s; + m.rawData[8] = tmp1 + tmp2; + m.rawData[2] = tmp1 - tmp2; + tmp1 = y*z*t; + tmp2 = x*s; + m.rawData[9] = tmp1 - tmp2; + m.rawData[6] = tmp1 + tmp2; + + return m; + } + + /** + * [read-only] A Number that determines whether a matrix is invertible. + */ + public get determinant():number + { + return ((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])); + } + + /** + * A Vector3D object that holds the position, the 3D coordinate (x,y,z) of a display object within the + * transformation's frame of reference. + */ + public get position():Vector3D + { + return new Vector3D(this.rawData[12], this.rawData[13], this.rawData[14]); + } + + public set position(value:Vector3D) + { + this.rawData[12] = value.x; + this.rawData[13] = value.y; + this.rawData[14] = value.z; + } + + public toFixed(decimalPlace:number):string + { + var magnitude:number = Math.pow(10, decimalPlace); + return "matrix3d(" + Math.round(this.rawData[0]*magnitude)/magnitude + "," + Math.round(this.rawData[1]*magnitude)/magnitude + "," + Math.round(this.rawData[2]*magnitude)/magnitude + "," + Math.round(this.rawData[3]*magnitude)/magnitude + "," + Math.round(this.rawData[4]*magnitude)/magnitude + "," + Math.round(this.rawData[5]*magnitude)/magnitude + "," + Math.round(this.rawData[6]*magnitude)/magnitude + "," + Math.round(this.rawData[7]*magnitude)/magnitude + "," + Math.round(this.rawData[8]*magnitude)/magnitude + "," + Math.round(this.rawData[9]*magnitude)/magnitude + "," + Math.round(this.rawData[10]*magnitude)/magnitude + "," + Math.round(this.rawData[11]*magnitude)/magnitude + "," + Math.round(this.rawData[12]*magnitude)/magnitude + "," + Math.round(this.rawData[13]*magnitude)/magnitude + "," + Math.round(this.rawData[14]*magnitude)/magnitude + "," + Math.round(this.rawData[15]*magnitude)/magnitude + ")"; + } + + public toString():string + { + return "matrix3d(" + Math.round(this.rawData[0]*1000)/1000 + "," + Math.round(this.rawData[1]*1000)/1000 + "," + Math.round(this.rawData[2]*1000)/1000 + "," + Math.round(this.rawData[3]*1000)/1000 + "," + Math.round(this.rawData[4]*1000)/1000 + "," + Math.round(this.rawData[5]*1000)/1000 + "," + Math.round(this.rawData[6]*1000)/1000 + "," + Math.round(this.rawData[7]*1000)/1000 + "," + Math.round(this.rawData[8]*1000)/1000 + "," + Math.round(this.rawData[9]*1000)/1000 + "," + Math.round(this.rawData[10]*1000)/1000 + "," + Math.round(this.rawData[11]*1000)/1000 + "," + Math.round(this.rawData[12]*1000)/1000 + "," + Math.round(this.rawData[13]*1000)/1000 + "," + Math.round(this.rawData[14]*1000)/1000 + "," + Math.round(this.rawData[15]*1000)/1000 + ")"; + } +} + +export = Matrix3D; \ No newline at end of file diff --git a/lib/core/geom/Matrix3DUtils.js b/lib/core/geom/Matrix3DUtils.js new file mode 100755 index 00000000..e41f862a --- /dev/null +++ b/lib/core/geom/Matrix3DUtils.js @@ -0,0 +1,304 @@ +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* away.geom.Matrix3DUtils provides additional Matrix3D functions. +*/ +var Matrix3DUtils = (function () { + function Matrix3DUtils() { + } + /** + * Fills the 3d matrix object with values representing the transformation made by the given quaternion. + * + * @param quarternion The quarterion object to convert. + */ + Matrix3DUtils.quaternion2matrix = function (quarternion, m) { + if (typeof m === "undefined") { m = null; } + var x = quarternion.x; + var y = quarternion.y; + var z = quarternion.z; + var w = quarternion.w; + + var xx = x * x; + var xy = x * y; + var xz = x * z; + var xw = x * w; + + var yy = y * y; + var yz = y * z; + var yw = y * w; + + var zz = z * z; + var zw = z * w; + + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + raw[0] = 1 - 2 * (yy + zz); + raw[1] = 2 * (xy + zw); + raw[2] = 2 * (xz - yw); + raw[4] = 2 * (xy - zw); + raw[5] = 1 - 2 * (xx + zz); + raw[6] = 2 * (yz + xw); + raw[8] = 2 * (xz + yw); + raw[9] = 2 * (yz - xw); + raw[10] = 1 - 2 * (xx + yy); + raw[3] = raw[7] = raw[11] = raw[12] = raw[13] = raw[14] = 0; + raw[15] = 1; + + if (m) { + m.copyRawDataFrom(raw); + return m; + } else + return new Matrix3D(raw); + }; + + /** + * Returns a normalised Vector3D object representing the forward vector of the given matrix. + * @param m The Matrix3D object to use to get the forward vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The forward vector + */ + Matrix3DUtils.getForward = function (m, v) { + if (typeof v === "undefined") { v = null; } + //v ||= new Vector3D(0.0, 0.0, 0.0); + if (v === null) { + v = new Vector3D(0.0, 0.0, 0.0); + } + + m.copyColumnTo(2, v); + v.normalize(); + + return v; + }; + + /** + * Returns a normalised Vector3D object representing the up vector of the given matrix. + * @param m The Matrix3D object to use to get the up vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The up vector + */ + Matrix3DUtils.getUp = function (m, v) { + //v ||= new Vector3D(0.0, 0.0, 0.0); + if (typeof v === "undefined") { v = null; } + if (v === null) { + v = new Vector3D(0.0, 0.0, 0.0); + } + + m.copyColumnTo(1, v); + v.normalize(); + + return v; + }; + + /** + * Returns a normalised Vector3D object representing the right vector of the given matrix. + * @param m The Matrix3D object to use to get the right vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The right vector + */ + Matrix3DUtils.getRight = function (m, v) { + if (typeof v === "undefined") { v = null; } + //v ||= new Vector3D(0.0, 0.0, 0.0); + if (v === null) { + v = new Vector3D(0.0, 0.0, 0.0); + } + + m.copyColumnTo(0, v); + v.normalize(); + + return v; + }; + + /** + * Returns a boolean value representing whether there is any significant difference between the two given 3d matrices. + */ + Matrix3DUtils.compare = function (m1, m2) { + var r1 = Matrix3DUtils.RAW_DATA_CONTAINER; + var r2 = m2.rawData; + m1.copyRawDataTo(r1); + + for (var i = 0; i < 16; ++i) { + if (r1[i] != r2[i]) + return false; + } + + return true; + }; + + Matrix3DUtils.lookAt = function (matrix, pos, dir, up) { + var dirN; + var upN; + var lftN; + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + + lftN = dir.crossProduct(up); + lftN.normalize(); + + upN = lftN.crossProduct(dir); + upN.normalize(); + dirN = dir.clone(); + dirN.normalize(); + + raw[0] = lftN.x; + raw[1] = upN.x; + raw[2] = -dirN.x; + raw[3] = 0.0; + + raw[4] = lftN.y; + raw[5] = upN.y; + raw[6] = -dirN.y; + raw[7] = 0.0; + + raw[8] = lftN.z; + raw[9] = upN.z; + raw[10] = -dirN.z; + raw[11] = 0.0; + + raw[12] = -lftN.dotProduct(pos); + raw[13] = -upN.dotProduct(pos); + raw[14] = dirN.dotProduct(pos); + raw[15] = 1.0; + + matrix.copyRawDataFrom(raw); + }; + + Matrix3DUtils.reflection = function (plane, target) { + if (typeof target === "undefined") { target = null; } + if (target === null) + target = new Matrix3D(); + + var a = plane.a, b = plane.b, c = plane.c, d = plane.d; + var rawData = Matrix3DUtils.RAW_DATA_CONTAINER; + var ab2 = -2 * a * b; + var ac2 = -2 * a * c; + var bc2 = -2 * b * c; + + // reflection matrix + rawData[0] = 1 - 2 * a * a; + rawData[4] = ab2; + rawData[8] = ac2; + rawData[12] = -2 * a * d; + rawData[1] = ab2; + rawData[5] = 1 - 2 * b * b; + rawData[9] = bc2; + rawData[13] = -2 * b * d; + rawData[2] = ac2; + rawData[6] = bc2; + rawData[10] = 1 - 2 * c * c; + rawData[14] = -2 * c * d; + rawData[3] = 0; + rawData[7] = 0; + rawData[11] = 0; + rawData[15] = 1; + target.copyRawDataFrom(rawData); + + return target; + }; + + Matrix3DUtils.transformVector = function (matrix, vector, result) { + if (typeof result === "undefined") { result = null; } + if (!result) + result = new Vector3D(); + + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a = raw[0]; + var e = raw[1]; + var i = raw[2]; + var m = raw[3]; + var b = raw[4]; + var f = raw[5]; + var j = raw[6]; + var n = raw[7]; + var c = raw[8]; + var g = raw[9]; + var k = raw[10]; + var o = raw[11]; + var d = raw[12]; + var h = raw[13]; + var l = raw[14]; + var p = raw[15]; + + var x = vector.x; + var y = vector.y; + var z = vector.z; + result.x = a * x + b * y + c * z + d; + result.y = e * x + f * y + g * z + h; + result.z = i * x + j * y + k * z + l; + result.w = m * x + n * y + o * z + p; + return result; + }; + + Matrix3DUtils.deltaTransformVector = function (matrix, vector, result) { + if (typeof result === "undefined") { result = null; } + if (!result) + result = new Vector3D(); + + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a = raw[0]; + var e = raw[1]; + var i = raw[2]; + var m = raw[3]; + var b = raw[4]; + var f = raw[5]; + var j = raw[6]; + var n = raw[7]; + var c = raw[8]; + var g = raw[9]; + var k = raw[10]; + var o = raw[11]; + var x = vector.x; + var y = vector.y; + var z = vector.z; + result.x = a * x + b * y + c * z; + result.y = e * x + f * y + g * z; + result.z = i * x + j * y + k * z; + result.w = m * x + n * y + o * z; + return result; + }; + + Matrix3DUtils.getTranslation = function (transform, result) { + if (typeof result === "undefined") { result = null; } + if (!result) + result = new Vector3D(); + + transform.copyColumnTo(3, result); + return result; + }; + + Matrix3DUtils.deltaTransformVectors = function (matrix, vin, vout) { + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a = raw[0]; + var e = raw[1]; + var i = raw[2]; + var m = raw[3]; + var b = raw[4]; + var f = raw[5]; + var j = raw[6]; + var n = raw[7]; + var c = raw[8]; + var g = raw[9]; + var k = raw[10]; + var o = raw[11]; + var outIndex = 0; + var length = vin.length; + for (var index = 0; index < length; index += 3) { + var x = vin[index]; + var y = vin[index + 1]; + var z = vin[index + 2]; + vout[outIndex++] = a * x + b * y + c * z; + vout[outIndex++] = e * x + f * y + g * z; + vout[outIndex++] = i * x + j * y + k * z; + } + }; + Matrix3DUtils.RAW_DATA_CONTAINER = new Array(16); + + Matrix3DUtils.CALCULATION_MATRIX = new Matrix3D(); + return Matrix3DUtils; +})(); + +module.exports = Matrix3DUtils; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9NYXRyaXgzRFV0aWxzLnRzIl0sIm5hbWVzIjpbIk1hdHJpeDNEVXRpbHMiLCJNYXRyaXgzRFV0aWxzLmNvbnN0cnVjdG9yIiwiTWF0cml4M0RVdGlscy5xdWF0ZXJuaW9uMm1hdHJpeCIsIk1hdHJpeDNEVXRpbHMuZ2V0Rm9yd2FyZCIsIk1hdHJpeDNEVXRpbHMuZ2V0VXAiLCJNYXRyaXgzRFV0aWxzLmdldFJpZ2h0IiwiTWF0cml4M0RVdGlscy5jb21wYXJlIiwiTWF0cml4M0RVdGlscy5sb29rQXQiLCJNYXRyaXgzRFV0aWxzLnJlZmxlY3Rpb24iLCJNYXRyaXgzRFV0aWxzLnRyYW5zZm9ybVZlY3RvciIsIk1hdHJpeDNEVXRpbHMuZGVsdGFUcmFuc2Zvcm1WZWN0b3IiLCJNYXRyaXgzRFV0aWxzLmdldFRyYW5zbGF0aW9uIiwiTWF0cml4M0RVdGlscy5kZWx0YVRyYW5zZm9ybVZlY3RvcnMiXSwibWFwcGluZ3MiOiJBQUFBLDREQUNvRTs7QUFFcEUsNERBQW9FOztBQUdwRTs7RUFFRztBQUNIO0lBQUFBO0lBaVRBQyxDQUFDQTtBQUFBRCxJQWxTQUE7Ozs7TUFER0E7c0NBQ0hBLFVBQWdDQSxXQUFzQkEsRUFBRUEsQ0FBaUJBO1FBQWpCRSxnQ0FBQUEsQ0FBQ0EsR0FBWUEsSUFBSUE7QUFBQUEsUUFFeEVBLElBQUlBLENBQUNBLEdBQVVBLFdBQVdBLENBQUNBLENBQUNBO1FBQzVCQSxJQUFJQSxDQUFDQSxHQUFVQSxXQUFXQSxDQUFDQSxDQUFDQTtRQUM1QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsV0FBV0EsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLElBQUlBLENBQUNBLEdBQVVBLFdBQVdBLENBQUNBLENBQUNBOztRQUU1QkEsSUFBSUEsRUFBRUEsR0FBVUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7UUFDbkJBLElBQUlBLEVBQUVBLEdBQVVBLENBQUNBLEdBQUNBLENBQUNBO1FBQ25CQSxJQUFJQSxFQUFFQSxHQUFVQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUNuQkEsSUFBSUEsRUFBRUEsR0FBVUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7O1FBRW5CQSxJQUFJQSxFQUFFQSxHQUFVQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUNuQkEsSUFBSUEsRUFBRUEsR0FBVUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7UUFDbkJBLElBQUlBLEVBQUVBLEdBQVVBLENBQUNBLEdBQUNBLENBQUNBOztRQUVuQkEsSUFBSUEsRUFBRUEsR0FBVUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7UUFDbkJBLElBQUlBLEVBQUVBLEdBQVVBLENBQUNBLEdBQUNBLENBQUNBOztRQUVuQkEsSUFBSUEsR0FBR0EsR0FBWUEsYUFBYUEsQ0FBQ0Esa0JBQWtCQTtRQUNuREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0E7UUFDeEJBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBO1FBQ3BCQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxDQUFDQTtRQUNwQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0E7UUFDcEJBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBO1FBQ3hCQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxDQUFDQTtRQUNwQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0E7UUFDcEJBLEdBQUdBLENBQUNB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QUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBO1FBQ3RCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUN0QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7UUFDdEJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBO1FBQ3RCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUN0QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7O1FBRXRCQSxJQUFJQSxDQUFDQSxHQUFVQSxNQUFNQSxDQUFDQSxDQUFDQTtRQUN2QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7UUFDdkJBLElBQUlBLENBQUNBLEdBQVVBLE1BQU1BLENBQUNBLENBQUNBO1FBQ3ZCQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNwQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDcENBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ3BDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNwQ0EsT0FBT0EsTUFBTUE7SUFDZEEsQ0FBQ0E7O0lBRURULHFDQUFBQSxVQUFtQ0EsTUFBZUEsRUFBRUEsTUFBZUEsRUFBRUEsTUFBc0JBO1FBQXRCVSxxQ0FBQUEsTUFBTUEsR0FBWUEsSUFBSUE7QUFBQUEsUUFFMUZBLElBQUlBLENBQUNBLE1BQU1BO1lBQ1ZBLE1BQU1BLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBOztRQUV6QkEsSUFBSUEsR0FBR0EsR0FBaUJBLGFBQWFBLENBQUNBLGtCQUFrQkE7UUFDeERBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEdBQUdBLENBQUNBO1FBQ3pCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7UUFDdEJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBO1FBQ3RCQSxJQUFJQSxDQUFDQSxHQUFVQSxNQUFNQSxDQUFDQSxDQUFDQTtRQUN2QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7UUFDdkJBLElBQUlBLENBQUNBLEdBQVVBLE1BQU1BLENBQUNBLENBQUNBO1FBQ3ZCQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNoQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDaENBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ2hDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNoQ0EsT0FBT0EsTUFBTUE7SUFDZEEsQ0FBQ0E7O0lBRURWLCtCQUFBQSxVQUE2QkEsU0FBa0JBLEVBQUVBLE1BQXNCQTtRQUF0QlcscUNBQUFBLE1BQU1BLEdBQVlBLElBQUlBO0FBQUFBLFFBRXRFQSxJQUFHQSxDQUFDQSxNQUFNQTtZQUNUQSxNQUFNQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFekJBLFNBQVNBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBO1FBQ2pDQSxPQUFPQSxNQUFNQTtJQUNkQSxDQUFDQTs7SUFFRFgsc0NBQUFBLFVBQW9DQSxNQUFlQSxFQUFFQSxHQUFpQkEsRUFBRUEsSUFBa0JBO1FBRXpGWSxJQUFJQSxHQUFHQSxHQUFpQkEsYUFBYUEsQ0FBQ0Esa0JBQWtCQTtRQUN4REEsTUFBTUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDekJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckJBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUN0QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7UUFDdEJBLElBQUlBLFFBQVFBLEdBQVVBLENBQUNBO1FBQ3ZCQSxJQUFJQSxNQUFNQSxHQUFVQSxHQUFHQSxDQUFDQSxNQUFNQTtRQUM5QkEsS0FBSUEsSUFBSUEsS0FBS0EsR0FBVUEsQ0FBQ0EsRUFBRUEsS0FBS0EsR0FBQ0EsTUFBTUEsRUFBRUEsS0FBS0EsSUFBRUEsQ0FBQ0EsQ0FBRUE7WUFDakRBLElBQUlBLENBQUNBLEdBQVVBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3pCQSxJQUFJQSxDQUFDQSxHQUFVQSxHQUFHQSxDQUFDQSxLQUFLQSxHQUFDQSxDQUFDQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsR0FBR0EsQ0FBQ0EsS0FBS0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDM0JBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1lBQ3hDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUN4Q0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FDeENBO0lBQ0ZBLENBQUNBO0lBM1NEWixtQ0FBNENBLElBQUlBLEtBQUtBLENBQVNBLEVBQUVBLENBQUNBOztJQUdqRUEsbUNBQTRDQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTtJQXlTM0RBLHFCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6ImNvcmUvZ2VvbS9NYXRyaXgzRFV0aWxzLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFF1YXRlcm5pb25cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUXVhdGVybmlvblwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFBsYW5lM0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9QbGFuZTNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5cblxuLyoqXG4gKiBhd2F5Lmdlb20uTWF0cml4M0RVdGlscyBwcm92aWRlcyBhZGRpdGlvbmFsIE1hdHJpeDNEIGZ1bmN0aW9ucy5cbiAqL1xuY2xhc3MgTWF0cml4M0RVdGlsc1xue1xuXHQvKipcblx0ICogQSByZWZlcmVuY2UgdG8gYSBWZWN0b3IgdG8gYmUgdXNlZCBhcyBhIHRlbXBvcmFyeSByYXcgZGF0YSBjb250YWluZXIsIHRvIHByZXZlbnQgb2JqZWN0IGNyZWF0aW9uLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBSQVdfREFUQV9DT05UQUlORVI6bnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigxNik7XG5cdC8vcHVibGljIHN0YXRpYyBSQVdfREFUQV9DT05UQUlORVI6bnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigxNik7XG5cblx0cHVibGljIHN0YXRpYyBDQUxDVUxBVElPTl9NQVRSSVg6TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoKTtcblxuXHQvKipcblx0ICogRmlsbHMgdGhlIDNkIG1hdHJpeCBvYmplY3Qgd2l0aCB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbiBtYWRlIGJ5IHRoZSBnaXZlbiBxdWF0ZXJuaW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gICAgcXVhcnRlcm5pb24gICAgVGhlIHF1YXJ0ZXJpb24gb2JqZWN0IHRvIGNvbnZlcnQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHF1YXRlcm5pb24ybWF0cml4KHF1YXJ0ZXJuaW9uOlF1YXRlcm5pb24sIG06TWF0cml4M0QgPSBudWxsKTpNYXRyaXgzRFxuXHR7XG5cdFx0dmFyIHg6bnVtYmVyID0gcXVhcnRlcm5pb24ueDtcblx0XHR2YXIgeTpudW1iZXIgPSBxdWFydGVybmlvbi55O1xuXHRcdHZhciB6Om51bWJlciA9IHF1YXJ0ZXJuaW9uLno7XG5cdFx0dmFyIHc6bnVtYmVyID0gcXVhcnRlcm5pb24udztcblxuXHRcdHZhciB4eDpudW1iZXIgPSB4Kng7XG5cdFx0dmFyIHh5Om51bWJlciA9IHgqeTtcblx0XHR2YXIgeHo6bnVtYmVyID0geCp6O1xuXHRcdHZhciB4dzpudW1iZXIgPSB4Knc7XG5cblx0XHR2YXIgeXk6bnVtYmVyID0geSp5O1xuXHRcdHZhciB5ejpudW1iZXIgPSB5Kno7XG5cdFx0dmFyIHl3Om51bWJlciA9IHkqdztcblxuXHRcdHZhciB6ejpudW1iZXIgPSB6Kno7XG5cdFx0dmFyIHp3Om51bWJlciA9IHoqdztcblxuXHRcdHZhciByYXc6bnVtYmVyW10gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblx0XHRyYXdbMF0gPSAxIC0gMiooeXkgKyB6eik7XG5cdFx0cmF3WzFdID0gMiooeHkgKyB6dyk7XG5cdFx0cmF3WzJdID0gMiooeHogLSB5dyk7XG5cdFx0cmF3WzRdID0gMiooeHkgLSB6dyk7XG5cdFx0cmF3WzVdID0gMSAtIDIqKHh4ICsgenopO1xuXHRcdHJhd1s2XSA9IDIqKHl6ICsgeHcpO1xuXHRcdHJhd1s4XSA9IDIqKHh6ICsgeXcpO1xuXHRcdHJhd1s5XSA9IDIqKHl6IC0geHcpO1xuXHRcdHJhd1sxMF0gPSAxIC0gMiooeHggKyB5eSk7XG5cdFx0cmF3WzNdID0gcmF3WzddID0gcmF3WzExXSA9IHJhd1sxMl0gPSByYXdbMTNdID0gcmF3WzE0XSA9IDA7XG5cdFx0cmF3WzE1XSA9IDE7XG5cblx0XHRpZiAobSkge1xuXHRcdFx0bS5jb3B5UmF3RGF0YUZyb20ocmF3KTtcblx0XHRcdHJldHVybiBtO1xuXHRcdH0gZWxzZVxuXHRcdFx0cmV0dXJuIG5ldyBNYXRyaXgzRChyYXcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBub3JtYWxpc2VkIDxjb2RlPlZlY3RvcjNEPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmb3J3YXJkIHZlY3RvciBvZiB0aGUgZ2l2ZW4gbWF0cml4LlxuXHQgKiBAcGFyYW0gICAgbSAgICAgICAgVGhlIE1hdHJpeDNEIG9iamVjdCB0byB1c2UgdG8gZ2V0IHRoZSBmb3J3YXJkIHZlY3RvclxuXHQgKiBAcGFyYW0gICAgdiAgICAgICAgW29wdGlvbmFsXSBBIHZlY3RvciBob2xkZXIgdG8gcHJldmVudCBtYWtlIG5ldyBWZWN0b3IzRCBpbnN0YW5jZSBpZiBhbHJlYWR5IGV4aXN0cy4gRGVmYXVsdCBpcyBudWxsLlxuXHQgKiBAcmV0dXJuICAgICAgICAgICAgVGhlIGZvcndhcmQgdmVjdG9yXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldEZvcndhcmQobTpNYXRyaXgzRCwgdjpWZWN0b3IzRCA9IG51bGwpOlZlY3RvcjNEXG5cdHtcblx0XHQvL3YgfHw9IG5ldyBWZWN0b3IzRCgwLjAsIDAuMCwgMC4wKTtcblx0XHRpZiAodiA9PT0gbnVsbCkge1xuXG5cdFx0XHR2ID0gbmV3IFZlY3RvcjNEKDAuMCwgMC4wLCAwLjApO1xuXG5cdFx0fVxuXG5cdFx0bS5jb3B5Q29sdW1uVG8oMiwgdik7XG5cdFx0di5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB2O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBub3JtYWxpc2VkIDxjb2RlPlZlY3RvcjNEPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB1cCB2ZWN0b3Igb2YgdGhlIGdpdmVuIG1hdHJpeC5cblx0ICogQHBhcmFtICAgIG0gICAgICAgIFRoZSBNYXRyaXgzRCBvYmplY3QgdG8gdXNlIHRvIGdldCB0aGUgdXAgdmVjdG9yXG5cdCAqIEBwYXJhbSAgICB2ICAgICAgICBbb3B0aW9uYWxdIEEgdmVjdG9yIGhvbGRlciB0byBwcmV2ZW50IG1ha2UgbmV3IFZlY3RvcjNEIGluc3RhbmNlIGlmIGFscmVhZHkgZXhpc3RzLiBEZWZhdWx0IGlzIG51bGwuXG5cdCAqIEByZXR1cm4gICAgICAgICAgICBUaGUgdXAgdmVjdG9yXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFVwKG06TWF0cml4M0QsIHY6VmVjdG9yM0QgPSBudWxsKTpWZWN0b3IzRFxuXHR7XG5cdFx0Ly92IHx8PSBuZXcgVmVjdG9yM0QoMC4wLCAwLjAsIDAuMCk7XG5cblx0XHRpZiAodiA9PT0gbnVsbCkge1xuXG5cdFx0XHR2ID0gbmV3IFZlY3RvcjNEKDAuMCwgMC4wLCAwLjApO1xuXG5cdFx0fVxuXG5cdFx0bS5jb3B5Q29sdW1uVG8oMSwgdik7XG5cdFx0di5ub3JtYWxpemUoKTtcblxuXHRcdHJldHVybiB2O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBub3JtYWxpc2VkIDxjb2RlPlZlY3RvcjNEPC9jb2RlPiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSByaWdodCB2ZWN0b3Igb2YgdGhlIGdpdmVuIG1hdHJpeC5cblx0ICogQHBhcmFtICAgIG0gICAgICAgIFRoZSBNYXRyaXgzRCBvYmplY3QgdG8gdXNlIHRvIGdldCB0aGUgcmlnaHQgdmVjdG9yXG5cdCAqIEBwYXJhbSAgICB2ICAgICAgICBbb3B0aW9uYWxdIEEgdmVjdG9yIGhvbGRlciB0byBwcmV2ZW50IG1ha2UgbmV3IFZlY3RvcjNEIGluc3RhbmNlIGlmIGFscmVhZHkgZXhpc3RzLiBEZWZhdWx0IGlzIG51bGwuXG5cdCAqIEByZXR1cm4gICAgICAgICAgICBUaGUgcmlnaHQgdmVjdG9yXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFJpZ2h0KG06TWF0cml4M0QsIHY6VmVjdG9yM0QgPSBudWxsKTpWZWN0b3IzRFxuXHR7XG5cdFx0Ly92IHx8PSBuZXcgVmVjdG9yM0QoMC4wLCAwLjAsIDAuMCk7XG5cdFx0aWYgKHYgPT09IG51bGwpIHtcblxuXHRcdFx0diA9IG5ldyBWZWN0b3IzRCgwLjAsIDAuMCwgMC4wKTtcblxuXHRcdH1cblxuXHRcdG0uY29weUNvbHVtblRvKDAsIHYpO1xuXHRcdHYubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gdjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSByZXByZXNlbnRpbmcgd2hldGhlciB0aGVyZSBpcyBhbnkgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gM2QgbWF0cmljZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGNvbXBhcmUobTE6TWF0cml4M0QsIG0yOk1hdHJpeDNEKTpib29sZWFuXG5cdHtcblx0XHR2YXIgcjE6bnVtYmVyW10gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblx0XHR2YXIgcjI6bnVtYmVyW10gPSBtMi5yYXdEYXRhO1xuXHRcdG0xLmNvcHlSYXdEYXRhVG8ocjEpO1xuXG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgMTY7ICsraSkge1xuXHRcdFx0aWYgKHIxW2ldICE9IHIyW2ldKVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGxvb2tBdChtYXRyaXg6TWF0cml4M0QsIHBvczpWZWN0b3IzRCwgZGlyOlZlY3RvcjNELCB1cDpWZWN0b3IzRClcblx0e1xuXHRcdHZhciBkaXJOOlZlY3RvcjNEO1xuXHRcdHZhciB1cE46VmVjdG9yM0Q7XG5cdFx0dmFyIGxmdE46VmVjdG9yM0Q7XG5cdFx0dmFyIHJhdzpudW1iZXJbXSA9IE1hdHJpeDNEVXRpbHMuUkFXX0RBVEFfQ09OVEFJTkVSO1xuXG5cdFx0bGZ0TiA9IGRpci5jcm9zc1Byb2R1Y3QodXApO1xuXHRcdGxmdE4ubm9ybWFsaXplKCk7XG5cblx0XHR1cE4gPSBsZnROLmNyb3NzUHJvZHVjdChkaXIpO1xuXHRcdHVwTi5ub3JtYWxpemUoKTtcblx0XHRkaXJOID0gZGlyLmNsb25lKCk7XG5cdFx0ZGlyTi5ub3JtYWxpemUoKTtcblxuXHRcdHJhd1swXSA9IGxmdE4ueDtcblx0XHRyYXdbMV0gPSB1cE4ueDtcblx0XHRyYXdbMl0gPSAtZGlyTi54O1xuXHRcdHJhd1szXSA9IDAuMDtcblxuXHRcdHJhd1s0XSA9IGxmdE4ueTtcblx0XHRyYXdbNV0gPSB1cE4ueTtcblx0XHRyYXdbNl0gPSAtZGlyTi55O1xuXHRcdHJhd1s3XSA9IDAuMDtcblxuXHRcdHJhd1s4XSA9IGxmdE4uejtcblx0XHRyYXdbOV0gPSB1cE4uejtcblx0XHRyYXdbMTBdID0gLWRpck4uejtcblx0XHRyYXdbMTFdID0gMC4wO1xuXG5cdFx0cmF3WzEyXSA9IC1sZnROLmRvdFByb2R1Y3QocG9zKTtcblx0XHRyYXdbMTNdID0gLXVwTi5kb3RQcm9kdWN0KHBvcyk7XG5cdFx0cmF3WzE0XSA9IGRpck4uZG90UHJvZHVjdChwb3MpO1xuXHRcdHJhd1sxNV0gPSAxLjA7XG5cblx0XHRtYXRyaXguY29weVJhd0RhdGFGcm9tKHJhdyk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHJlZmxlY3Rpb24ocGxhbmU6UGxhbmUzRCwgdGFyZ2V0Ok1hdHJpeDNEID0gbnVsbCk6TWF0cml4M0Rcblx0e1xuXHRcdGlmICh0YXJnZXQgPT09IG51bGwpXG5cdFx0XHR0YXJnZXQgPSBuZXcgTWF0cml4M0QoKTtcblxuXHRcdHZhciBhOm51bWJlciA9IHBsYW5lLmEsIGI6bnVtYmVyID0gcGxhbmUuYiwgYzpudW1iZXIgPSBwbGFuZS5jLCBkOm51bWJlciA9IHBsYW5lLmQ7XG5cdFx0dmFyIHJhd0RhdGE6bnVtYmVyW10gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblx0XHR2YXIgYWIyOm51bWJlciA9IC0yKmEqYjtcblx0XHR2YXIgYWMyOm51bWJlciA9IC0yKmEqYztcblx0XHR2YXIgYmMyOm51bWJlciA9IC0yKmIqYztcblx0XHQvLyByZWZsZWN0aW9uIG1hdHJpeFxuXHRcdHJhd0RhdGFbMF0gPSAxIC0gMiphKmE7XG5cdFx0cmF3RGF0YVs0XSA9IGFiMjtcblx0XHRyYXdEYXRhWzhdID0gYWMyO1xuXHRcdHJhd0RhdGFbMTJdID0gLTIqYSpkO1xuXHRcdHJhd0RhdGFbMV0gPSBhYjI7XG5cdFx0cmF3RGF0YVs1XSA9IDEgLSAyKmIqYjtcblx0XHRyYXdEYXRhWzldID0gYmMyO1xuXHRcdHJhd0RhdGFbMTNdID0gLTIqYipkO1xuXHRcdHJhd0RhdGFbMl0gPSBhYzI7XG5cdFx0cmF3RGF0YVs2XSA9IGJjMjtcblx0XHRyYXdEYXRhWzEwXSA9IDEgLSAyKmMqYztcblx0XHRyYXdEYXRhWzE0XSA9IC0yKmMqZDtcblx0XHRyYXdEYXRhWzNdID0gMDtcblx0XHRyYXdEYXRhWzddID0gMDtcblx0XHRyYXdEYXRhWzExXSA9IDA7XG5cdFx0cmF3RGF0YVsxNV0gPSAxO1xuXHRcdHRhcmdldC5jb3B5UmF3RGF0YUZyb20ocmF3RGF0YSk7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9XG5cblxuXHRwdWJsaWMgc3RhdGljIHRyYW5zZm9ybVZlY3RvcihtYXRyaXg6TWF0cml4M0QsIHZlY3RvcjpWZWN0b3IzRCwgcmVzdWx0OlZlY3RvcjNEID0gbnVsbCk6VmVjdG9yM0Rcblx0e1xuXHRcdGlmICghcmVzdWx0KVxuXHRcdFx0cmVzdWx0ID0gbmV3IFZlY3RvcjNEKCk7XG5cblx0XHR2YXIgcmF3OkFycmF5PG51bWJlcj4gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblx0XHRtYXRyaXguY29weVJhd0RhdGFUbyhyYXcpO1xuXHRcdHZhciBhOm51bWJlciA9IHJhd1swXTtcblx0XHR2YXIgZTpudW1iZXIgPSByYXdbMV07XG5cdFx0dmFyIGk6bnVtYmVyID0gcmF3WzJdO1xuXHRcdHZhciBtOm51bWJlciA9IHJhd1szXTtcblx0XHR2YXIgYjpudW1iZXIgPSByYXdbNF07XG5cdFx0dmFyIGY6bnVtYmVyID0gcmF3WzVdO1xuXHRcdHZhciBqOm51bWJlciA9IHJhd1s2XTtcblx0XHR2YXIgbjpudW1iZXIgPSByYXdbN107XG5cdFx0dmFyIGM6bnVtYmVyID0gcmF3WzhdO1xuXHRcdHZhciBnOm51bWJlciA9IHJhd1s5XTtcblx0XHR2YXIgazpudW1iZXIgPSByYXdbMTBdO1xuXHRcdHZhciBvOm51bWJlciA9IHJhd1sxMV07XG5cdFx0dmFyIGQ6bnVtYmVyID0gcmF3WzEyXTtcblx0XHR2YXIgaDpudW1iZXIgPSByYXdbMTNdO1xuXHRcdHZhciBsOm51bWJlciA9IHJhd1sxNF07XG5cdFx0dmFyIHA6bnVtYmVyID0gcmF3WzE1XTtcblxuXHRcdHZhciB4Om51bWJlciA9IHZlY3Rvci54O1xuXHRcdHZhciB5Om51bWJlciA9IHZlY3Rvci55O1xuXHRcdHZhciB6Om51bWJlciA9IHZlY3Rvci56O1xuXHRcdHJlc3VsdC54ID0gYSAqIHggKyBiICogeSArIGMgKiB6ICsgZDtcblx0XHRyZXN1bHQueSA9IGUgKiB4ICsgZiAqIHkgKyBnICogeiArIGg7XG5cdFx0cmVzdWx0LnogPSBpICogeCArIGogKiB5ICsgayAqIHogKyBsO1xuXHRcdHJlc3VsdC53ID0gbSAqIHggKyBuICogeSArIG8gKiB6ICsgcDtcblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBkZWx0YVRyYW5zZm9ybVZlY3RvcihtYXRyaXg6TWF0cml4M0QsIHZlY3RvcjpWZWN0b3IzRCwgcmVzdWx0OlZlY3RvcjNEID0gbnVsbCk6VmVjdG9yM0Rcblx0e1xuXHRcdGlmICghcmVzdWx0KVxuXHRcdFx0cmVzdWx0ID0gbmV3IFZlY3RvcjNEKCk7XG5cblx0XHR2YXIgcmF3OkFycmF5PG51bWJlcj4gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblx0XHRtYXRyaXguY29weVJhd0RhdGFUbyhyYXcpO1xuXHRcdHZhciBhOm51bWJlciA9IHJhd1swXTtcblx0XHR2YXIgZTpudW1iZXIgPSByYXdbMV07XG5cdFx0dmFyIGk6bnVtYmVyID0gcmF3WzJdO1xuXHRcdHZhciBtOm51bWJlciA9IHJhd1szXTtcblx0XHR2YXIgYjpudW1iZXIgPSByYXdbNF07XG5cdFx0dmFyIGY6bnVtYmVyID0gcmF3WzVdO1xuXHRcdHZhciBqOm51bWJlciA9IHJhd1s2XTtcblx0XHR2YXIgbjpudW1iZXIgPSByYXdbN107XG5cdFx0dmFyIGM6bnVtYmVyID0gcmF3WzhdO1xuXHRcdHZhciBnOm51bWJlciA9IHJhd1s5XTtcblx0XHR2YXIgazpudW1iZXIgPSByYXdbMTBdO1xuXHRcdHZhciBvOm51bWJlciA9IHJhd1sxMV07XG5cdFx0dmFyIHg6bnVtYmVyID0gdmVjdG9yLng7XG5cdFx0dmFyIHk6bnVtYmVyID0gdmVjdG9yLnk7XG5cdFx0dmFyIHo6bnVtYmVyID0gdmVjdG9yLno7XG5cdFx0cmVzdWx0LnggPSBhICogeCArIGIgKiB5ICsgYyAqIHo7XG5cdFx0cmVzdWx0LnkgPSBlICogeCArIGYgKiB5ICsgZyAqIHo7XG5cdFx0cmVzdWx0LnogPSBpICogeCArIGogKiB5ICsgayAqIHo7XG5cdFx0cmVzdWx0LncgPSBtICogeCArIG4gKiB5ICsgbyAqIHo7XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VHJhbnNsYXRpb24odHJhbnNmb3JtOk1hdHJpeDNELCByZXN1bHQ6VmVjdG9yM0QgPSBudWxsKTpWZWN0b3IzRFxuXHR7XG5cdFx0aWYoIXJlc3VsdClcblx0XHRcdHJlc3VsdCA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdFx0dHJhbnNmb3JtLmNvcHlDb2x1bW5UbygzLCByZXN1bHQpO1xuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGRlbHRhVHJhbnNmb3JtVmVjdG9ycyhtYXRyaXg6TWF0cml4M0QsIHZpbjpBcnJheTxudW1iZXI+LCB2b3V0OkFycmF5PG51bWJlcj4pXG5cdHtcblx0XHR2YXIgcmF3OkFycmF5PG51bWJlcj4gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblx0XHRtYXRyaXguY29weVJhd0RhdGFUbyhyYXcpO1xuXHRcdHZhciBhOm51bWJlciA9IHJhd1swXTtcblx0XHR2YXIgZTpudW1iZXIgPSByYXdbMV07XG5cdFx0dmFyIGk6bnVtYmVyID0gcmF3WzJdO1xuXHRcdHZhciBtOm51bWJlciA9IHJhd1szXTtcblx0XHR2YXIgYjpudW1iZXIgPSByYXdbNF07XG5cdFx0dmFyIGY6bnVtYmVyID0gcmF3WzVdO1xuXHRcdHZhciBqOm51bWJlciA9IHJhd1s2XTtcblx0XHR2YXIgbjpudW1iZXIgPSByYXdbN107XG5cdFx0dmFyIGM6bnVtYmVyID0gcmF3WzhdO1xuXHRcdHZhciBnOm51bWJlciA9IHJhd1s5XTtcblx0XHR2YXIgazpudW1iZXIgPSByYXdbMTBdO1xuXHRcdHZhciBvOm51bWJlciA9IHJhd1sxMV07XG5cdFx0dmFyIG91dEluZGV4Om51bWJlciA9IDA7XG5cdFx0dmFyIGxlbmd0aDpudW1iZXIgPSB2aW4ubGVuZ3RoO1xuXHRcdGZvcih2YXIgaW5kZXg6bnVtYmVyID0gMDsgaW5kZXg8bGVuZ3RoOyBpbmRleCs9Mykge1xuXHRcdFx0dmFyIHg6bnVtYmVyID0gdmluW2luZGV4XTtcblx0XHRcdHZhciB5Om51bWJlciA9IHZpbltpbmRleCsxXTtcblx0XHRcdHZhciB6Om51bWJlciA9IHZpbltpbmRleCsyXTtcblx0XHRcdHZvdXRbb3V0SW5kZXgrK10gPSBhICogeCArIGIgKiB5ICsgYyAqIHo7XG5cdFx0XHR2b3V0W291dEluZGV4KytdID0gZSAqIHggKyBmICogeSArIGcgKiB6O1xuXHRcdFx0dm91dFtvdXRJbmRleCsrXSA9IGkgKiB4ICsgaiAqIHkgKyBrICogejtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0ID0gTWF0cml4M0RVdGlsczsiXX0= \ No newline at end of file diff --git a/lib/core/geom/Matrix3DUtils.ts b/lib/core/geom/Matrix3DUtils.ts new file mode 100644 index 00000000..715a8c5b --- /dev/null +++ b/lib/core/geom/Matrix3DUtils.ts @@ -0,0 +1,317 @@ +import Quaternion = require("awayjs-core/lib/core/geom/Quaternion"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + + +/** + * away.geom.Matrix3DUtils provides additional Matrix3D functions. + */ +class Matrix3DUtils +{ + /** + * A reference to a Vector to be used as a temporary raw data container, to prevent object creation. + */ + public static RAW_DATA_CONTAINER:number[] = new Array(16); + //public static RAW_DATA_CONTAINER:number[] = new Array(16); + + public static CALCULATION_MATRIX:Matrix3D = new Matrix3D(); + + /** + * Fills the 3d matrix object with values representing the transformation made by the given quaternion. + * + * @param quarternion The quarterion object to convert. + */ + public static quaternion2matrix(quarternion:Quaternion, m:Matrix3D = null):Matrix3D + { + var x:number = quarternion.x; + var y:number = quarternion.y; + var z:number = quarternion.z; + var w:number = quarternion.w; + + var xx:number = x*x; + var xy:number = x*y; + var xz:number = x*z; + var xw:number = x*w; + + var yy:number = y*y; + var yz:number = y*z; + var yw:number = y*w; + + var zz:number = z*z; + var zw:number = z*w; + + var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + raw[0] = 1 - 2*(yy + zz); + raw[1] = 2*(xy + zw); + raw[2] = 2*(xz - yw); + raw[4] = 2*(xy - zw); + raw[5] = 1 - 2*(xx + zz); + raw[6] = 2*(yz + xw); + raw[8] = 2*(xz + yw); + raw[9] = 2*(yz - xw); + raw[10] = 1 - 2*(xx + yy); + raw[3] = raw[7] = raw[11] = raw[12] = raw[13] = raw[14] = 0; + raw[15] = 1; + + if (m) { + m.copyRawDataFrom(raw); + return m; + } else + return new Matrix3D(raw); + } + + /** + * Returns a normalised Vector3D object representing the forward vector of the given matrix. + * @param m The Matrix3D object to use to get the forward vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The forward vector + */ + public static getForward(m:Matrix3D, v:Vector3D = null):Vector3D + { + //v ||= new Vector3D(0.0, 0.0, 0.0); + if (v === null) { + + v = new Vector3D(0.0, 0.0, 0.0); + + } + + m.copyColumnTo(2, v); + v.normalize(); + + return v; + } + + /** + * Returns a normalised Vector3D object representing the up vector of the given matrix. + * @param m The Matrix3D object to use to get the up vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The up vector + */ + public static getUp(m:Matrix3D, v:Vector3D = null):Vector3D + { + //v ||= new Vector3D(0.0, 0.0, 0.0); + + if (v === null) { + + v = new Vector3D(0.0, 0.0, 0.0); + + } + + m.copyColumnTo(1, v); + v.normalize(); + + return v; + } + + /** + * Returns a normalised Vector3D object representing the right vector of the given matrix. + * @param m The Matrix3D object to use to get the right vector + * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. + * @return The right vector + */ + public static getRight(m:Matrix3D, v:Vector3D = null):Vector3D + { + //v ||= new Vector3D(0.0, 0.0, 0.0); + if (v === null) { + + v = new Vector3D(0.0, 0.0, 0.0); + + } + + m.copyColumnTo(0, v); + v.normalize(); + + return v; + } + + /** + * Returns a boolean value representing whether there is any significant difference between the two given 3d matrices. + */ + public static compare(m1:Matrix3D, m2:Matrix3D):boolean + { + var r1:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + var r2:number[] = m2.rawData; + m1.copyRawDataTo(r1); + + for (var i:number = 0; i < 16; ++i) { + if (r1[i] != r2[i]) + return false; + } + + return true; + } + + public static lookAt(matrix:Matrix3D, pos:Vector3D, dir:Vector3D, up:Vector3D) + { + var dirN:Vector3D; + var upN:Vector3D; + var lftN:Vector3D; + var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + + lftN = dir.crossProduct(up); + lftN.normalize(); + + upN = lftN.crossProduct(dir); + upN.normalize(); + dirN = dir.clone(); + dirN.normalize(); + + raw[0] = lftN.x; + raw[1] = upN.x; + raw[2] = -dirN.x; + raw[3] = 0.0; + + raw[4] = lftN.y; + raw[5] = upN.y; + raw[6] = -dirN.y; + raw[7] = 0.0; + + raw[8] = lftN.z; + raw[9] = upN.z; + raw[10] = -dirN.z; + raw[11] = 0.0; + + raw[12] = -lftN.dotProduct(pos); + raw[13] = -upN.dotProduct(pos); + raw[14] = dirN.dotProduct(pos); + raw[15] = 1.0; + + matrix.copyRawDataFrom(raw); + } + + public static reflection(plane:Plane3D, target:Matrix3D = null):Matrix3D + { + if (target === null) + target = new Matrix3D(); + + var a:number = plane.a, b:number = plane.b, c:number = plane.c, d:number = plane.d; + var rawData:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + var ab2:number = -2*a*b; + var ac2:number = -2*a*c; + var bc2:number = -2*b*c; + // reflection matrix + rawData[0] = 1 - 2*a*a; + rawData[4] = ab2; + rawData[8] = ac2; + rawData[12] = -2*a*d; + rawData[1] = ab2; + rawData[5] = 1 - 2*b*b; + rawData[9] = bc2; + rawData[13] = -2*b*d; + rawData[2] = ac2; + rawData[6] = bc2; + rawData[10] = 1 - 2*c*c; + rawData[14] = -2*c*d; + rawData[3] = 0; + rawData[7] = 0; + rawData[11] = 0; + rawData[15] = 1; + target.copyRawDataFrom(rawData); + + return target; + } + + + public static transformVector(matrix:Matrix3D, vector:Vector3D, result:Vector3D = null):Vector3D + { + if (!result) + result = new Vector3D(); + + var raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a:number = raw[0]; + var e:number = raw[1]; + var i:number = raw[2]; + var m:number = raw[3]; + var b:number = raw[4]; + var f:number = raw[5]; + var j:number = raw[6]; + var n:number = raw[7]; + var c:number = raw[8]; + var g:number = raw[9]; + var k:number = raw[10]; + var o:number = raw[11]; + var d:number = raw[12]; + var h:number = raw[13]; + var l:number = raw[14]; + var p:number = raw[15]; + + var x:number = vector.x; + var y:number = vector.y; + var z:number = vector.z; + result.x = a * x + b * y + c * z + d; + result.y = e * x + f * y + g * z + h; + result.z = i * x + j * y + k * z + l; + result.w = m * x + n * y + o * z + p; + return result; + } + + public static deltaTransformVector(matrix:Matrix3D, vector:Vector3D, result:Vector3D = null):Vector3D + { + if (!result) + result = new Vector3D(); + + var raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a:number = raw[0]; + var e:number = raw[1]; + var i:number = raw[2]; + var m:number = raw[3]; + var b:number = raw[4]; + var f:number = raw[5]; + var j:number = raw[6]; + var n:number = raw[7]; + var c:number = raw[8]; + var g:number = raw[9]; + var k:number = raw[10]; + var o:number = raw[11]; + var x:number = vector.x; + var y:number = vector.y; + var z:number = vector.z; + result.x = a * x + b * y + c * z; + result.y = e * x + f * y + g * z; + result.z = i * x + j * y + k * z; + result.w = m * x + n * y + o * z; + return result; + } + + public static getTranslation(transform:Matrix3D, result:Vector3D = null):Vector3D + { + if(!result) + result = new Vector3D(); + + transform.copyColumnTo(3, result); + return result; + } + + public static deltaTransformVectors(matrix:Matrix3D, vin:Array, vout:Array) + { + var raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER; + matrix.copyRawDataTo(raw); + var a:number = raw[0]; + var e:number = raw[1]; + var i:number = raw[2]; + var m:number = raw[3]; + var b:number = raw[4]; + var f:number = raw[5]; + var j:number = raw[6]; + var n:number = raw[7]; + var c:number = raw[8]; + var g:number = raw[9]; + var k:number = raw[10]; + var o:number = raw[11]; + var outIndex:number = 0; + var length:number = vin.length; + for(var index:number = 0; indexThe PerspectiveProjection class provides an easy way to assign or modify +* the perspective transformations of a display object and all of its +* children. For more complex or custom perspective transformations, use the +* Matrix3D class. While the PerspectiveProjection class provides basic +* three-dimensional presentation properties, the Matrix3D class provides more +* detailed control over the three-dimensional presentation of display objects. +*

+* +*

Projection is a way of representing a three-dimensional object in a +* two-dimensional space, like a cube projected onto a computer screen. +* Perspective projection uses a viewing frustum (a rectangular pyramid) to +* model and project a three-dimensional world and its objects on the screen. +* The viewing frustum becomes increasingly wider as it moves further from the +* origin of the viewpoint. The origin of the viewpoint could be a camera or +* the eyes of an observer facing the screen. The projected perspective +* produces the illusion of three dimensions with depth and distance, where +* the objects closer to the screen appear larger than the objects farther +* from the screen.

+* +*

A default PerspectiveProjection object is a framework defined for +* perspective transformation of the root object, based on the field of view +* and aspect ratio (dimensions) of the stage. The projection center, the +* vanishing point, is set to the center of the stage, which means the +* three-dimensional display objects disappear toward the center of the stage +* as they move back in the z axis. The default viewpoint is at point (0,0) +* looking down the positive z axis. The y-axis points down toward the bottom +* of the screen. You can gain access to the root display object's perspective +* projection settings and change the field of view and projection center +* properties of the perspectiveProjection property through the root object's +* DisplayObject.transform property.

+* +*

You can also set a different perspective projection setting for a +* display object through the parent's perspective projection. First, create a +* PerspectiveProjection object and set its fieldOfView and +* projectionCenter properties. Next, assign the +* PerspectiveProjection object to the parent display object using the +* DisplayObject.transform property. The specified projection +* matrix and transformation will then apply to all the display object's +* three-dimensional children.

+* +*

To modify a perspective projection of the stage or root object: use the +* transform.matrix property of the root display object to gain +* access to the PerspectiveProjection object. Or, apply different perspective +* projection properties to a display object by setting the perspective +* projection properties of the display object's parent. The child display +* object inherits the new properties. Specifically, create a +* PerspectiveProjection object and set its properties, then assign the +* PerspectiveProjection object to the perspectiveProjection +* property of the parent display object's transform property. +* The specified projection transformation then applies to all the display +* object's three-dimensional children.

+* +*

Since both PerspectiveProjection and Matrix3D objects perform +* perspective transformations, do not assign both to a display object at the +* same time. Use the PerspectiveProjection object for focal length and +* projection center changes. For more control over the perspective +* transformation, create a perspective projection Matrix3D object.

+*/ +var PerspectiveProjection = (function () { + /** + * Creates an instance of a PerspectiveProjection object. + */ + function PerspectiveProjection() { + } + /** + * Returns the underlying Matrix3D object of the display object. + * + *

A display object, like the root object, can have a + * PerspectiveProjection object without needing a Matrix3D property + * defined for its transformations. In fact, use either a + * PerspectiveProjection or a Matrix3D object to specify the + * perspective transformation. If when using the PerspectiveProjection + * object, a Matrix3D object was needed, the toMatrix3D() + * method can retrieve the underlying Matrix3D object of the display + * object. For example, the toMatrix3D() method can be + * used with the Utils3D.projectVectors() method.

+ * + * @see away.geom.Matrix3D + */ + PerspectiveProjection.prototype.toMatrix3D = function () { + return this._matrix3D; + }; + return PerspectiveProjection; +})(); + +module.exports = PerspectiveProjection; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9QZXJzcGVjdGl2ZVByb2plY3Rpb24udHMiXSwibmFtZXMiOlsiUGVyc3BlY3RpdmVQcm9qZWN0aW9uIiwiUGVyc3BlY3RpdmVQcm9qZWN0aW9uLmNvbnN0cnVjdG9yIiwiUGVyc3BlY3RpdmVQcm9qZWN0aW9uLnRvTWF0cml4M0QiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBNkRHO0FBQ0g7SUFvRENBOztNQURHQTtJQUNIQTtJQUdBQyxDQUFDQTtJQWdCREQ7Ozs7Ozs7Ozs7Ozs7O01BREdBO2lEQUNIQTtRQUVDRSxPQUFPQSxJQUFJQSxDQUFDQSxTQUFTQTtJQUN0QkEsQ0FBQ0E7SUFDRkYsNkJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsc0NBQStCLENBQUEiLCJmaWxlIjoiY29yZS9nZW9tL1BlcnNwZWN0aXZlUHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFBvaW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUG9pbnRcIik7XG5cbi8qKlxuICogPHA+VGhlIFBlcnNwZWN0aXZlUHJvamVjdGlvbiBjbGFzcyBwcm92aWRlcyBhbiBlYXN5IHdheSB0byBhc3NpZ24gb3IgbW9kaWZ5XG4gKiB0aGUgcGVyc3BlY3RpdmUgdHJhbnNmb3JtYXRpb25zIG9mIGEgZGlzcGxheSBvYmplY3QgYW5kIGFsbCBvZiBpdHNcbiAqIGNoaWxkcmVuLiBGb3IgbW9yZSBjb21wbGV4IG9yIGN1c3RvbSBwZXJzcGVjdGl2ZSB0cmFuc2Zvcm1hdGlvbnMsIHVzZSB0aGVcbiAqIE1hdHJpeDNEIGNsYXNzLiBXaGlsZSB0aGUgUGVyc3BlY3RpdmVQcm9qZWN0aW9uIGNsYXNzIHByb3ZpZGVzIGJhc2ljXG4gKiB0aHJlZS1kaW1lbnNpb25hbCBwcmVzZW50YXRpb24gcHJvcGVydGllcywgdGhlIE1hdHJpeDNEIGNsYXNzIHByb3ZpZGVzIG1vcmVcbiAqIGRldGFpbGVkIGNvbnRyb2wgb3ZlciB0aGUgdGhyZWUtZGltZW5zaW9uYWwgcHJlc2VudGF0aW9uIG9mIGRpc3BsYXkgb2JqZWN0cy5cbiAqIDwvcD5cbiAqXG4gKiA8cD5Qcm9qZWN0aW9uIGlzIGEgd2F5IG9mIHJlcHJlc2VudGluZyBhIHRocmVlLWRpbWVuc2lvbmFsIG9iamVjdCBpbiBhXG4gKiB0d28tZGltZW5zaW9uYWwgc3BhY2UsIGxpa2UgYSBjdWJlIHByb2plY3RlZCBvbnRvIGEgY29tcHV0ZXIgc2NyZWVuLlxuICogUGVyc3BlY3RpdmUgcHJvamVjdGlvbiB1c2VzIGEgdmlld2luZyBmcnVzdHVtIChhIHJlY3Rhbmd1bGFyIHB5cmFtaWQpIHRvXG4gKiBtb2RlbCBhbmQgcHJvamVjdCBhIHRocmVlLWRpbWVuc2lvbmFsIHdvcmxkIGFuZCBpdHMgb2JqZWN0cyBvbiB0aGUgc2NyZWVuLlxuICogVGhlIHZpZXdpbmcgZnJ1c3R1bSBiZWNvbWVzIGluY3JlYXNpbmdseSB3aWRlciBhcyBpdCBtb3ZlcyBmdXJ0aGVyIGZyb20gdGhlXG4gKiBvcmlnaW4gb2YgdGhlIHZpZXdwb2ludC4gVGhlIG9yaWdpbiBvZiB0aGUgdmlld3BvaW50IGNvdWxkIGJlIGEgY2FtZXJhIG9yXG4gKiB0aGUgZXllcyBvZiBhbiBvYnNlcnZlciBmYWNpbmcgdGhlIHNjcmVlbi4gVGhlIHByb2plY3RlZCBwZXJzcGVjdGl2ZVxuICogcHJvZHVjZXMgdGhlIGlsbHVzaW9uIG9mIHRocmVlIGRpbWVuc2lvbnMgd2l0aCBkZXB0aCBhbmQgZGlzdGFuY2UsIHdoZXJlXG4gKiB0aGUgb2JqZWN0cyBjbG9zZXIgdG8gdGhlIHNjcmVlbiBhcHBlYXIgbGFyZ2VyIHRoYW4gdGhlIG9iamVjdHMgZmFydGhlclxuICogZnJvbSB0aGUgc2NyZWVuLjwvcD5cbiAqXG4gKiA8cD5BIGRlZmF1bHQgUGVyc3BlY3RpdmVQcm9qZWN0aW9uIG9iamVjdCBpcyBhIGZyYW1ld29yayBkZWZpbmVkIGZvclxuICogcGVyc3BlY3RpdmUgdHJhbnNmb3JtYXRpb24gb2YgdGhlIHJvb3Qgb2JqZWN0LCBiYXNlZCBvbiB0aGUgZmllbGQgb2Ygdmlld1xuICogYW5kIGFzcGVjdCByYXRpbyAoZGltZW5zaW9ucykgb2YgdGhlIHN0YWdlLiBUaGUgcHJvamVjdGlvbiBjZW50ZXIsIHRoZVxuICogdmFuaXNoaW5nIHBvaW50LCBpcyBzZXQgdG8gdGhlIGNlbnRlciBvZiB0aGUgc3RhZ2UsIHdoaWNoIG1lYW5zIHRoZVxuICogdGhyZWUtZGltZW5zaW9uYWwgZGlzcGxheSBvYmplY3RzIGRpc2FwcGVhciB0b3dhcmQgdGhlIGNlbnRlciBvZiB0aGUgc3RhZ2VcbiAqIGFzIHRoZXkgbW92ZSBiYWNrIGluIHRoZSB6IGF4aXMuIFRoZSBkZWZhdWx0IHZpZXdwb2ludCBpcyBhdCBwb2ludCAoMCwwKVxuICogbG9va2luZyBkb3duIHRoZSBwb3NpdGl2ZSB6IGF4aXMuIFRoZSB5LWF4aXMgcG9pbnRzIGRvd24gdG93YXJkIHRoZSBib3R0b21cbiAqIG9mIHRoZSBzY3JlZW4uIFlvdSBjYW4gZ2FpbiBhY2Nlc3MgdG8gdGhlIHJvb3QgZGlzcGxheSBvYmplY3QncyBwZXJzcGVjdGl2ZVxuICogcHJvamVjdGlvbiBzZXR0aW5ncyBhbmQgY2hhbmdlIHRoZSBmaWVsZCBvZiB2aWV3IGFuZCBwcm9qZWN0aW9uIGNlbnRlclxuICogcHJvcGVydGllcyBvZiB0aGUgcGVyc3BlY3RpdmVQcm9qZWN0aW9uIHByb3BlcnR5IHRocm91Z2ggdGhlIHJvb3Qgb2JqZWN0J3NcbiAqIDxjb2RlPkRpc3BsYXlPYmplY3QudHJhbnNmb3JtPC9jb2RlPiBwcm9wZXJ0eS48L3A+XG4gKlxuICogPHA+WW91IGNhbiBhbHNvIHNldCBhIGRpZmZlcmVudCBwZXJzcGVjdGl2ZSBwcm9qZWN0aW9uIHNldHRpbmcgZm9yIGFcbiAqIGRpc3BsYXkgb2JqZWN0IHRocm91Z2ggdGhlIHBhcmVudCdzIHBlcnNwZWN0aXZlIHByb2plY3Rpb24uIEZpcnN0LCBjcmVhdGUgYVxuICogUGVyc3BlY3RpdmVQcm9qZWN0aW9uIG9iamVjdCBhbmQgc2V0IGl0cyA8Y29kZT5maWVsZE9mVmlldzwvY29kZT4gYW5kXG4gKiA8Y29kZT5wcm9qZWN0aW9uQ2VudGVyPC9jb2RlPiBwcm9wZXJ0aWVzLiBOZXh0LCBhc3NpZ24gdGhlXG4gKiBQZXJzcGVjdGl2ZVByb2plY3Rpb24gb2JqZWN0IHRvIHRoZSBwYXJlbnQgZGlzcGxheSBvYmplY3QgdXNpbmcgdGhlXG4gKiA8Y29kZT5EaXNwbGF5T2JqZWN0LnRyYW5zZm9ybTwvY29kZT4gcHJvcGVydHkuIFRoZSBzcGVjaWZpZWQgcHJvamVjdGlvblxuICogbWF0cml4IGFuZCB0cmFuc2Zvcm1hdGlvbiB3aWxsIHRoZW4gYXBwbHkgdG8gYWxsIHRoZSBkaXNwbGF5IG9iamVjdCdzXG4gKiB0aHJlZS1kaW1lbnNpb25hbCBjaGlsZHJlbi48L3A+XG4gKlxuICogPHA+VG8gbW9kaWZ5IGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBvZiB0aGUgc3RhZ2Ugb3Igcm9vdCBvYmplY3Q6IHVzZSB0aGVcbiAqIDxjb2RlPnRyYW5zZm9ybS5tYXRyaXg8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSByb290IGRpc3BsYXkgb2JqZWN0IHRvIGdhaW5cbiAqIGFjY2VzcyB0byB0aGUgUGVyc3BlY3RpdmVQcm9qZWN0aW9uIG9iamVjdC4gT3IsIGFwcGx5IGRpZmZlcmVudCBwZXJzcGVjdGl2ZVxuICogcHJvamVjdGlvbiBwcm9wZXJ0aWVzIHRvIGEgZGlzcGxheSBvYmplY3QgYnkgc2V0dGluZyB0aGUgcGVyc3BlY3RpdmVcbiAqIHByb2plY3Rpb24gcHJvcGVydGllcyBvZiB0aGUgZGlzcGxheSBvYmplY3QncyBwYXJlbnQuIFRoZSBjaGlsZCBkaXNwbGF5XG4gKiBvYmplY3QgaW5oZXJpdHMgdGhlIG5ldyBwcm9wZXJ0aWVzLiBTcGVjaWZpY2FsbHksIGNyZWF0ZSBhXG4gKiBQZXJzcGVjdGl2ZVByb2plY3Rpb24gb2JqZWN0IGFuZCBzZXQgaXRzIHByb3BlcnRpZXMsIHRoZW4gYXNzaWduIHRoZVxuICogUGVyc3BlY3RpdmVQcm9qZWN0aW9uIG9iamVjdCB0byB0aGUgPGNvZGU+cGVyc3BlY3RpdmVQcm9qZWN0aW9uPC9jb2RlPlxuICogcHJvcGVydHkgb2YgdGhlIHBhcmVudCBkaXNwbGF5IG9iamVjdCdzIDxjb2RlPnRyYW5zZm9ybTwvY29kZT4gcHJvcGVydHkuXG4gKiBUaGUgc3BlY2lmaWVkIHByb2plY3Rpb24gdHJhbnNmb3JtYXRpb24gdGhlbiBhcHBsaWVzIHRvIGFsbCB0aGUgZGlzcGxheVxuICogb2JqZWN0J3MgdGhyZWUtZGltZW5zaW9uYWwgY2hpbGRyZW4uPC9wPlxuICpcbiAqIDxwPlNpbmNlIGJvdGggUGVyc3BlY3RpdmVQcm9qZWN0aW9uIGFuZCBNYXRyaXgzRCBvYmplY3RzIHBlcmZvcm1cbiAqIHBlcnNwZWN0aXZlIHRyYW5zZm9ybWF0aW9ucywgZG8gbm90IGFzc2lnbiBib3RoIHRvIGEgZGlzcGxheSBvYmplY3QgYXQgdGhlXG4gKiBzYW1lIHRpbWUuIFVzZSB0aGUgUGVyc3BlY3RpdmVQcm9qZWN0aW9uIG9iamVjdCBmb3IgZm9jYWwgbGVuZ3RoIGFuZFxuICogcHJvamVjdGlvbiBjZW50ZXIgY2hhbmdlcy4gRm9yIG1vcmUgY29udHJvbCBvdmVyIHRoZSBwZXJzcGVjdGl2ZVxuICogdHJhbnNmb3JtYXRpb24sIGNyZWF0ZSBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gTWF0cml4M0Qgb2JqZWN0LjwvcD5cbiAqL1xuY2xhc3MgUGVyc3BlY3RpdmVQcm9qZWN0aW9uXG57XG5cdHByaXZhdGUgX21hdHJpeDNEOk1hdHJpeDNEO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgYW4gYW5nbGUsIGFzIGEgZGVncmVlIGJldHdlZW4gMCBhbmQgMTgwLCBmb3IgdGhlIGZpZWxkIG9mXG5cdCAqIHZpZXcgaW4gdGhyZWUgZGltZW5zaW9ucy4gVGhpcyB2YWx1ZSBkZXRlcm1pbmVzIGhvdyBzdHJvbmcgdGhlXG5cdCAqIHBlcnNwZWN0aXZlIHRyYW5zZm9ybWF0aW9uIGFuZCBkaXN0b3J0aW9uIGFwcGx5IHRvIGFcblx0ICogdGhyZWUtZGltZW5zaW9uYWwgZGlzcGxheSBvYmplY3Qgd2l0aCBhIG5vbi16ZXJvIHotY29vcmRpbmF0ZS5cblx0ICpcblx0ICogPHA+QSBkZWdyZWUgY2xvc2UgdG8gMCBtZWFucyB0aGF0IHRoZSBzY3JlZW4ncyB0d28tZGltZW5zaW9uYWwgeC1cblx0ICogYW5kIHktY29vcmRpbmF0ZXMgYXJlIHJvdWdobHkgdGhlIHNhbWUgYXMgdGhlIHRocmVlLWRpbWVuc2lvbmFsIHgtLFxuXHQgKiB5LSwgYW5kIHotY29vcmRpbmF0ZXMgd2l0aCBsaXR0bGUgb3Igbm8gZGlzdG9ydGlvbi4gSW4gb3RoZXIgd29yZHMsXG5cdCAqIGZvciBhIHNtYWxsIGFuZ2xlLCBhIGRpc3BsYXkgb2JqZWN0IG1vdmluZyBkb3duIHRoZSB6IGF4aXMgYXBwZWFyc1xuXHQgKiB0byBzdGF5IG5lYXIgdGhlIHNhbWUgc2l6ZSBhbmQgbW92ZXMgbGl0dGxlLjwvcD5cblx0ICpcblx0ICogPHA+QSB2YWx1ZSBjbG9zZSB0byAxODAgZGVncmVlcyByZXN1bHRzIGluIGEgZmlzaGV5ZSBwcm9qZWN0aW9uIGVmZmVjdDpcblx0ICogcG9zaXRpb25zIHdpdGggYSB6IHZhbHVlIHNtYWxsZXIgdGhhbiAwIGFyZSBtYWduaWZpZWQsIHdoaWxlXG5cdCAqIHBvc2l0aW9ucyB3aXRoIGEgeiB2YWx1ZSBsYXJnZXIgdGhhbiAwIGFyZSBtaW5pbWl6ZWQuIFdpdGggYSBsYXJnZVxuXHQgKiBhbmdsZSwgYSBkaXNwbGF5IG9iamVjdCBtb3ZpbmcgZG93biB0aGUgeiBheGlzIGFwcGVhcnMgdG8gY2hhbmdlXG5cdCAqIHNpemUgcXVpY2tseSBhbmQgbW92ZXMgYSBncmVhdCBkaXN0YW5jZS4gSWYgdGhlIGZpZWxkIG9mIHZpZXcgaXNcblx0ICogc2V0IHRvIDAgb3IgMTgwLCBub3RoaW5nIGlzIHNlZW4gb24gdGhlIHNjcmVlbi48L3A+XG5cdCAqL1xuXHRwdWJsaWMgZmllbGRPZlZpZXc6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgZXllIG9yIHRoZSB2aWV3cG9pbnQncyBvcmlnaW4gKDAsMCwwKSBhbmRcblx0ICogdGhlIGRpc3BsYXkgb2JqZWN0IGxvY2F0ZWQgaW4gdGhlIHogYXhpcy4gRHVyaW5nIHRoZSBwZXJzcGVjdGl2ZVxuXHQgKiB0cmFuc2Zvcm1hdGlvbiwgdGhlIDxjb2RlPmZvY2FsTGVuZ3RoPC9jb2RlPiBpcyBjYWxjdWxhdGVkXG5cdCAqIGR5bmFtaWNhbGx5IHVzaW5nIHRoZSBhbmdsZSBvZiB0aGUgZmllbGQgb2YgdmlldyBhbmQgdGhlIHN0YWdlJ3Ncblx0ICogYXNwZWN0IHJhdGlvIChzdGFnZSB3aWR0aCBkaXZpZGVkIGJ5IHN0YWdlIGhlaWdodCkuXG5cdCAqXG5cdCAqIEBzZWUgYXdheS5nZW9tLlBlcnNwZWN0aXZlUHJvamVjdGlvbiNmaWVsZE9mVmlld1xuXHQgKi9cblx0cHVibGljIGZvY2FsTGVuZ3RoOm51bWJlcjtcblxuXHQvKipcblx0ICogQSB0d28tZGltZW5zaW9uYWwgcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBjZW50ZXIgb2YgdGhlIHByb2plY3Rpb24sXG5cdCAqIHRoZSB2YW5pc2hpbmcgcG9pbnQgZm9yIHRoZSBkaXNwbGF5IG9iamVjdC5cblx0ICpcblx0ICogPHA+VGhlIDxjb2RlPnByb2plY3Rpb25DZW50ZXI8L2NvZGU+IHByb3BlcnR5IGlzIGFuIG9mZnNldCB0byB0aGVcblx0ICogZGVmYXVsdCByZWdpc3RyYXRpb24gcG9pbnQgdGhhdCBpcyB0aGUgdXBwZXIgbGVmdCBvZiB0aGUgc3RhZ2UsXG5cdCAqIHBvaW50ICgwLDApLiBUaGUgZGVmYXVsdCBwcm9qZWN0aW9uIHRyYW5zZm9ybWF0aW9uIGNlbnRlciBpcyBpbiB0aGVcblx0ICogbWlkZGxlIG9mIHRoZSBzdGFnZSwgd2hpY2ggbWVhbnMgdGhlIHRocmVlLWRpbWVuc2lvbmFsIGRpc3BsYXlcblx0ICogb2JqZWN0cyBkaXNhcHBlYXIgdG93YXJkIHRoZSBjZW50ZXIgb2YgdGhlIHN0YWdlIGFzIHRoZXkgbW92ZVxuXHQgKiBiYWNrd2FyZHMgaW4gdGhlIHogYXhpcy48L3A+XG5cdCAqL1xuXHRwdWJsaWMgcHJvamVjdGlvbkNlbnRlcjpQb2ludDtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIFBlcnNwZWN0aXZlUHJvamVjdGlvbiBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblxuXHR9XG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIE1hdHJpeDNEIG9iamVjdCBvZiB0aGUgZGlzcGxheSBvYmplY3QuXG5cdCAqXG5cdCAqIDxwPkEgZGlzcGxheSBvYmplY3QsIGxpa2UgdGhlIHJvb3Qgb2JqZWN0LCBjYW4gaGF2ZSBhXG5cdCAqIFBlcnNwZWN0aXZlUHJvamVjdGlvbiBvYmplY3Qgd2l0aG91dCBuZWVkaW5nIGEgTWF0cml4M0QgcHJvcGVydHlcblx0ICogZGVmaW5lZCBmb3IgaXRzIHRyYW5zZm9ybWF0aW9ucy4gSW4gZmFjdCwgdXNlIGVpdGhlciBhXG5cdCAqIFBlcnNwZWN0aXZlUHJvamVjdGlvbiBvciBhIE1hdHJpeDNEIG9iamVjdCB0byBzcGVjaWZ5IHRoZVxuXHQgKiBwZXJzcGVjdGl2ZSB0cmFuc2Zvcm1hdGlvbi4gSWYgd2hlbiB1c2luZyB0aGUgUGVyc3BlY3RpdmVQcm9qZWN0aW9uXG5cdCAqIG9iamVjdCwgYSBNYXRyaXgzRCBvYmplY3Qgd2FzIG5lZWRlZCwgdGhlIDxjb2RlPnRvTWF0cml4M0QoKTwvY29kZT5cblx0ICogbWV0aG9kIGNhbiByZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBNYXRyaXgzRCBvYmplY3Qgb2YgdGhlIGRpc3BsYXlcblx0ICogb2JqZWN0LiBGb3IgZXhhbXBsZSwgdGhlIDxjb2RlPnRvTWF0cml4M0QoKTwvY29kZT4gbWV0aG9kIGNhbiBiZVxuXHQgKiB1c2VkIHdpdGggdGhlIDxjb2RlPlV0aWxzM0QucHJvamVjdFZlY3RvcnMoKTwvY29kZT4gbWV0aG9kLjwvcD5cblx0ICpcblx0ICogQHNlZSBhd2F5Lmdlb20uTWF0cml4M0Rcblx0ICovXG5cdHB1YmxpYyB0b01hdHJpeDNEKCk6TWF0cml4M0Rcblx0e1xuXHRcdHJldHVybiB0aGlzLl9tYXRyaXgzRDtcblx0fVxufVxuXG5leHBvcnQgPSBQZXJzcGVjdGl2ZVByb2plY3Rpb247Il19 \ No newline at end of file diff --git a/src/away/core/geom/PerspectiveProjection.ts b/lib/core/geom/PerspectiveProjection.ts similarity index 54% rename from src/away/core/geom/PerspectiveProjection.ts rename to lib/core/geom/PerspectiveProjection.ts index 995a28bc..2c44cf3b 100644 --- a/src/away/core/geom/PerspectiveProjection.ts +++ b/lib/core/geom/PerspectiveProjection.ts @@ -1,4 +1,5 @@ -/// +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Point = require("awayjs-core/lib/core/geom/Point"); /** *

The PerspectiveProjection class provides an easy way to assign or modify @@ -59,82 +60,81 @@ * projection center changes. For more control over the perspective * transformation, create a perspective projection Matrix3D object.

*/ -module away.geom +class PerspectiveProjection { - export class PerspectiveProjection - { - private _matrix3D:Matrix3D; + private _matrix3D:Matrix3D; - /** - * Specifies an angle, as a degree between 0 and 180, for the field of - * view in three dimensions. This value determines how strong the - * perspective transformation and distortion apply to a - * three-dimensional display object with a non-zero z-coordinate. - * - *

A degree close to 0 means that the screen's two-dimensional x- - * and y-coordinates are roughly the same as the three-dimensional x-, - * y-, and z-coordinates with little or no distortion. In other words, - * for a small angle, a display object moving down the z axis appears - * to stay near the same size and moves little.

- * - *

A value close to 180 degrees results in a fisheye projection effect: - * positions with a z value smaller than 0 are magnified, while - * positions with a z value larger than 0 are minimized. With a large - * angle, a display object moving down the z axis appears to change - * size quickly and moves a great distance. If the field of view is - * set to 0 or 180, nothing is seen on the screen.

- */ - public fieldOfView:number; + /** + * Specifies an angle, as a degree between 0 and 180, for the field of + * view in three dimensions. This value determines how strong the + * perspective transformation and distortion apply to a + * three-dimensional display object with a non-zero z-coordinate. + * + *

A degree close to 0 means that the screen's two-dimensional x- + * and y-coordinates are roughly the same as the three-dimensional x-, + * y-, and z-coordinates with little or no distortion. In other words, + * for a small angle, a display object moving down the z axis appears + * to stay near the same size and moves little.

+ * + *

A value close to 180 degrees results in a fisheye projection effect: + * positions with a z value smaller than 0 are magnified, while + * positions with a z value larger than 0 are minimized. With a large + * angle, a display object moving down the z axis appears to change + * size quickly and moves a great distance. If the field of view is + * set to 0 or 180, nothing is seen on the screen.

+ */ + public fieldOfView:number; - /** - * The distance between the eye or the viewpoint's origin (0,0,0) and - * the display object located in the z axis. During the perspective - * transformation, the focalLength is calculated - * dynamically using the angle of the field of view and the stage's - * aspect ratio (stage width divided by stage height). - * - * @see away.geom.PerspectiveProjection#fieldOfView - */ - public focalLength:number; + /** + * The distance between the eye or the viewpoint's origin (0,0,0) and + * the display object located in the z axis. During the perspective + * transformation, the focalLength is calculated + * dynamically using the angle of the field of view and the stage's + * aspect ratio (stage width divided by stage height). + * + * @see away.geom.PerspectiveProjection#fieldOfView + */ + public focalLength:number; - /** - * A two-dimensional point representing the center of the projection, - * the vanishing point for the display object. - * - *

The projectionCenter property is an offset to the - * default registration point that is the upper left of the stage, - * point (0,0). The default projection transformation center is in the - * middle of the stage, which means the three-dimensional display - * objects disappear toward the center of the stage as they move - * backwards in the z axis.

- */ - public projectionCenter:Point; + /** + * A two-dimensional point representing the center of the projection, + * the vanishing point for the display object. + * + *

The projectionCenter property is an offset to the + * default registration point that is the upper left of the stage, + * point (0,0). The default projection transformation center is in the + * middle of the stage, which means the three-dimensional display + * objects disappear toward the center of the stage as they move + * backwards in the z axis.

+ */ + public projectionCenter:Point; - /** - * Creates an instance of a PerspectiveProjection object. - */ - constructor() - { + /** + * Creates an instance of a PerspectiveProjection object. + */ + constructor() + { - } - /** - * Returns the underlying Matrix3D object of the display object. - * - *

A display object, like the root object, can have a - * PerspectiveProjection object without needing a Matrix3D property - * defined for its transformations. In fact, use either a - * PerspectiveProjection or a Matrix3D object to specify the - * perspective transformation. If when using the PerspectiveProjection - * object, a Matrix3D object was needed, the toMatrix3D() - * method can retrieve the underlying Matrix3D object of the display - * object. For example, the toMatrix3D() method can be - * used with the Utils3D.projectVectors() method.

- * - * @see away.geom.Matrix3D - */ - public toMatrix3D():Matrix3D - { - return this._matrix3D; - } } -} \ No newline at end of file + /** + * Returns the underlying Matrix3D object of the display object. + * + *

A display object, like the root object, can have a + * PerspectiveProjection object without needing a Matrix3D property + * defined for its transformations. In fact, use either a + * PerspectiveProjection or a Matrix3D object to specify the + * perspective transformation. If when using the PerspectiveProjection + * object, a Matrix3D object was needed, the toMatrix3D() + * method can retrieve the underlying Matrix3D object of the display + * object. For example, the toMatrix3D() method can be + * used with the Utils3D.projectVectors() method.

+ * + * @see away.geom.Matrix3D + */ + public toMatrix3D():Matrix3D + { + return this._matrix3D; + } +} + +export = PerspectiveProjection; \ No newline at end of file diff --git a/lib/core/geom/Plane3D.js b/lib/core/geom/Plane3D.js new file mode 100755 index 00000000..248fdf17 --- /dev/null +++ b/lib/core/geom/Plane3D.js @@ -0,0 +1,151 @@ +var PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); + +var Plane3D = (function () { + /** + * Create a Plane3D with ABCD coefficients + */ + function Plane3D(a, b, c, d) { + if (typeof a === "undefined") { a = 0; } + if (typeof b === "undefined") { b = 0; } + if (typeof c === "undefined") { c = 0; } + if (typeof d === "undefined") { d = 0; } + this.a = a; + this.b = b; + this.c = c; + this.d = d; + + if (a == 0 && b == 0) { + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + } else if (b == 0 && c == 0) { + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + } else if (a == 0 && c == 0) { + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + } else { + this._iAlignment = Plane3D.ALIGN_ANY; + } + } + /** + * Fills this Plane3D with the coefficients from 3 points in 3d space. + * @param p0 Vector3D + * @param p1 Vector3D + * @param p2 Vector3D + */ + Plane3D.prototype.fromPoints = function (p0, p1, p2) { + var d1x = p1.x - p0.x; + var d1y = p1.y - p0.y; + var d1z = p1.z - p0.z; + + var d2x = p2.x - p0.x; + var d2y = p2.y - p0.y; + var d2z = p2.z - p0.z; + + this.a = d1y * d2z - d1z * d2y; + this.b = d1z * d2x - d1x * d2z; + this.c = d1x * d2y - d1y * d2x; + this.d = this.a * p0.x + this.b * p0.y + this.c * p0.z; + + // not using epsilon, since a plane is infinite and a small incorrection can grow very large + if (this.a == 0 && this.b == 0) { + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + } else if (this.b == 0 && this.c == 0) { + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + } else if (this.a == 0 && this.c == 0) { + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + } else { + this._iAlignment = Plane3D.ALIGN_ANY; + } + }; + + /** + * Fills this Plane3D with the coefficients from the plane's normal and a point in 3d space. + * @param normal Vector3D + * @param point Vector3D + */ + Plane3D.prototype.fromNormalAndPoint = function (normal, point) { + this.a = normal.x; + this.b = normal.y; + this.c = normal.z; + this.d = this.a * point.x + this.b * point.y + this.c * point.z; + if (this.a == 0 && this.b == 0) { + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + } else if (this.b == 0 && this.c == 0) { + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + } else if (this.a == 0 && this.c == 0) { + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + } else { + this._iAlignment = Plane3D.ALIGN_ANY; + } + }; + + /** + * Normalize this Plane3D + * @return Plane3D This Plane3D. + */ + Plane3D.prototype.normalize = function () { + var len = 1 / Math.sqrt(this.a * this.a + this.b * this.b + this.c * this.c); + this.a *= len; + this.b *= len; + this.c *= len; + this.d *= len; + return this; + }; + + /** + * Returns the signed distance between this Plane3D and the point p. + * @param p Vector3D + * @returns Number + */ + Plane3D.prototype.distance = function (p) { + if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) { + return this.a * p.x - this.d; + } else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) { + return this.b * p.y - this.d; + } else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) { + return this.c * p.z - this.d; + } else { + return this.a * p.x + this.b * p.y + this.c * p.z - this.d; + } + }; + + /** + * Classify a point against this Plane3D. (in front, back or intersecting) + * @param p Vector3D + * @return int Plane3.FRONT or Plane3D.BACK or Plane3D.INTERSECT + */ + Plane3D.prototype.classifyPoint = function (p, epsilon) { + if (typeof epsilon === "undefined") { epsilon = 0.01; } + // check NaN + if (this.d != this.d) + return PlaneClassification.FRONT; + + var len; + if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) + len = this.a * p.x - this.d; + else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) + len = this.b * p.y - this.d; + else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) + len = this.c * p.z - this.d; + else + len = this.a * p.x + this.b * p.y + this.c * p.z - this.d; + + if (len < -epsilon) + return PlaneClassification.BACK; + else if (len > epsilon) + return PlaneClassification.FRONT; + else + return PlaneClassification.INTERSECT; + }; + + Plane3D.prototype.toString = function () { + return "Plane3D [a:" + this.a + ", b:" + this.b + ", c:" + this.c + ", d:" + this.d + "]"; + }; + Plane3D.ALIGN_ANY = 0; + Plane3D.ALIGN_XY_AXIS = 1; + Plane3D.ALIGN_YZ_AXIS = 2; + Plane3D.ALIGN_XZ_AXIS = 3; + return Plane3D; +})(); + +module.exports = Plane3D; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9QbGFuZTNELnRzIl0sIm5hbWVzIjpbIlBsYW5lM0QiLCJQbGFuZTNELmNvbnN0cnVjdG9yIiwiUGxhbmUzRC5mcm9tUG9pbnRzIiwiUGxhbmUzRC5mcm9tTm9ybWFsQW5kUG9pbnQiLCJQbGFuZTNELm5vcm1hbGl6ZSIsIlBsYW5lM0QuZGlzdGFuY2UiLCJQbGFuZTNELmNsYXNzaWZ5UG9pbnQiLCJQbGFuZTNELnRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiQUFBQSxrRkFBc0Y7O0FBR3RGO0lBaUNDQTs7TUFER0E7SUFDSEEsaUJBQVlBLENBQVlBLEVBQUVBLENBQVlBLEVBQUVBLENBQVlBLEVBQUVBLENBQVlBO1FBQXREQyxnQ0FBQUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsZ0NBQUFBLENBQUNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLGdDQUFBQSxDQUFDQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxnQ0FBQUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFFakVBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1ZBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1ZBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1ZBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBOztRQUVWQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUVyQkEsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsT0FBT0EsQ0FBQ0EsYUFBYUE7U0FFeENBLE1BQU1BLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUVBO1lBRTVCQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxPQUFPQSxDQUFDQSxhQUFhQTtTQUV4Q0EsTUFBTUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBRUE7WUFFNUJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLE9BQU9BLENBQUNBLGFBQWFBO1NBRXhDQSxLQUFNQTtZQUVOQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxPQUFPQSxDQUFDQSxTQUFTQTtTQUVwQ0E7SUFFRkEsQ0FBQ0E7SUFRREQ7Ozs7O01BREdBO21DQUNIQSxVQUFrQkEsRUFBV0EsRUFBRUEsRUFBV0EsRUFBRUEsRUFBV0E7UUFFdERFLElBQUlBLEdBQUdBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBO1FBQzVCQSxJQUFJQSxHQUFHQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUM1QkEsSUFBSUEsR0FBR0EsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7O1FBRTVCQSxJQUFJQSxHQUFHQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUM1QkEsSUFBSUEsR0FBR0EsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLElBQUlBLEdBQUdBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBOztRQUU1QkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBQ0EsR0FBR0E7UUFDMUJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUNBLEdBQUdBO1FBQzFCQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxHQUFHQTtRQUMxQkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0Es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TUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0E7SUFDMUZBLENBQUNBO0lBakxEUCxvQkFBaUNBLENBQUNBO0lBQ2xDQSx3QkFBcUNBLENBQUNBO0lBQ3RDQSx3QkFBcUNBLENBQUNBO0lBQ3RDQSx3QkFBcUNBLENBQUNBO0lBK0t2Q0EsZUFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCx3QkFBaUIsQ0FBQSIsImZpbGUiOiJjb3JlL2dlb20vUGxhbmUzRC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQbGFuZUNsYXNzaWZpY2F0aW9uXHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1BsYW5lQ2xhc3NpZmljYXRpb25cIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5cbmNsYXNzIFBsYW5lM0Rcbntcblx0LyoqXG5cdCAqIFRoZSBBIGNvZWZmaWNpZW50IG9mIHRoaXMgcGxhbmUuIChBbHNvIHRoZSB4IGRpbWVuc2lvbiBvZiB0aGUgcGxhbmUgbm9ybWFsKVxuXHQgKi9cblx0cHVibGljIGE6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgQiBjb2VmZmljaWVudCBvZiB0aGlzIHBsYW5lLiAoQWxzbyB0aGUgeSBkaW1lbnNpb24gb2YgdGhlIHBsYW5lIG5vcm1hbClcblx0ICovXG5cdHB1YmxpYyBiOm51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIEMgY29lZmZpY2llbnQgb2YgdGhpcyBwbGFuZS4gKEFsc28gdGhlIHogZGltZW5zaW9uIG9mIHRoZSBwbGFuZSBub3JtYWwpXG5cdCAqL1xuXHRwdWJsaWMgYzpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSBEIGNvZWZmaWNpZW50IG9mIHRoaXMgcGxhbmUuIChBbHNvIHRoZSBpbnZlcnNlIGRvdCBwcm9kdWN0IGJldHdlZW4gbm9ybWFsIGFuZCBwb2ludClcblx0ICovXG5cdHB1YmxpYyBkOm51bWJlcjtcblxuXHRwdWJsaWMgX2lBbGlnbm1lbnQ6bnVtYmVyO1xuXG5cdC8vIGluZGljYXRlcyB0aGUgYWxpZ25tZW50IG9mIHRoZSBwbGFuZVxuXHRwdWJsaWMgc3RhdGljIEFMSUdOX0FOWTpudW1iZXIgPSAwO1xuXHRwdWJsaWMgc3RhdGljIEFMSUdOX1hZX0FYSVM6bnVtYmVyID0gMTtcblx0cHVibGljIHN0YXRpYyBBTElHTl9ZWl9BWElTOm51bWJlciA9IDI7XG5cdHB1YmxpYyBzdGF0aWMgQUxJR05fWFpfQVhJUzpudW1iZXIgPSAzO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBQbGFuZTNEIHdpdGggQUJDRCBjb2VmZmljaWVudHNcblx0ICovXG5cdGNvbnN0cnVjdG9yKGE6bnVtYmVyID0gMCwgYjpudW1iZXIgPSAwLCBjOm51bWJlciA9IDAsIGQ6bnVtYmVyID0gMClcblx0e1xuXHRcdHRoaXMuYSA9IGE7XG5cdFx0dGhpcy5iID0gYjtcblx0XHR0aGlzLmMgPSBjO1xuXHRcdHRoaXMuZCA9IGQ7XG5cblx0XHRpZiAoYSA9PSAwICYmIGIgPT0gMCkge1xuXG5cdFx0XHR0aGlzLl9pQWxpZ25tZW50ID0gUGxhbmUzRC5BTElHTl9YWV9BWElTO1xuXG5cdFx0fSBlbHNlIGlmIChiID09IDAgJiYgYyA9PSAwKSB7XG5cblx0XHRcdHRoaXMuX2lBbGlnbm1lbnQgPSBQbGFuZTNELkFMSUdOX1laX0FYSVM7XG5cblx0XHR9IGVsc2UgaWYgKGEgPT0gMCAmJiBjID09IDApIHtcblxuXHRcdFx0dGhpcy5faUFsaWdubWVudCA9IFBsYW5lM0QuQUxJR05fWFpfQVhJUztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuX2lBbGlnbm1lbnQgPSBQbGFuZTNELkFMSUdOX0FOWTtcblxuXHRcdH1cblxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoaXMgUGxhbmUzRCB3aXRoIHRoZSBjb2VmZmljaWVudHMgZnJvbSAzIHBvaW50cyBpbiAzZCBzcGFjZS5cblx0ICogQHBhcmFtIHAwIFZlY3RvcjNEXG5cdCAqIEBwYXJhbSBwMSBWZWN0b3IzRFxuXHQgKiBAcGFyYW0gcDIgVmVjdG9yM0Rcblx0ICovXG5cdHB1YmxpYyBmcm9tUG9pbnRzKHAwOlZlY3RvcjNELCBwMTpWZWN0b3IzRCwgcDI6VmVjdG9yM0QpXG5cdHtcblx0XHR2YXIgZDF4Om51bWJlciA9IHAxLnggLSBwMC54O1xuXHRcdHZhciBkMXk6bnVtYmVyID0gcDEueSAtIHAwLnk7XG5cdFx0dmFyIGQxejpudW1iZXIgPSBwMS56IC0gcDAuejtcblxuXHRcdHZhciBkMng6bnVtYmVyID0gcDIueCAtIHAwLng7XG5cdFx0dmFyIGQyeTpudW1iZXIgPSBwMi55IC0gcDAueTtcblx0XHR2YXIgZDJ6Om51bWJlciA9IHAyLnogLSBwMC56O1xuXG5cdFx0dGhpcy5hID0gZDF5KmQyeiAtIGQxeipkMnk7XG5cdFx0dGhpcy5iID0gZDF6KmQyeCAtIGQxeCpkMno7XG5cdFx0dGhpcy5jID0gZDF4KmQyeSAtIGQxeSpkMng7XG5cdFx0dGhpcy5kID0gdGhpcy5hKnAwLnggKyB0aGlzLmIqcDAueSArIHRoaXMuYypwMC56O1xuXG5cdFx0Ly8gbm90IHVzaW5nIGVwc2lsb24sIHNpbmNlIGEgcGxhbmUgaXMgaW5maW5pdGUgYW5kIGEgc21hbGwgaW5jb3JyZWN0aW9uIGNhbiBncm93IHZlcnkgbGFyZ2Vcblx0XHRpZiAodGhpcy5hID09IDAgJiYgdGhpcy5iID09IDApIHtcblxuXHRcdFx0dGhpcy5faUFsaWdubWVudCA9IFBsYW5lM0QuQUxJR05fWFlfQVhJUztcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5iID09IDAgJiYgdGhpcy5jID09IDApIHtcblxuXHRcdFx0dGhpcy5faUFsaWdubWVudCA9IFBsYW5lM0QuQUxJR05fWVpfQVhJUztcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5hID09IDAgJiYgdGhpcy5jID09IDApIHtcblxuXHRcdFx0dGhpcy5faUFsaWdubWVudCA9IFBsYW5lM0QuQUxJR05fWFpfQVhJUztcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuX2lBbGlnbm1lbnQgPSBQbGFuZTNELkFMSUdOX0FOWTtcblxuXHRcdH1cblxuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoaXMgUGxhbmUzRCB3aXRoIHRoZSBjb2VmZmljaWVudHMgZnJvbSB0aGUgcGxhbmUncyBub3JtYWwgYW5kIGEgcG9pbnQgaW4gM2Qgc3BhY2UuXG5cdCAqIEBwYXJhbSBub3JtYWwgVmVjdG9yM0Rcblx0ICogQHBhcmFtIHBvaW50ICBWZWN0b3IzRFxuXHQgKi9cblx0cHVibGljIGZyb21Ob3JtYWxBbmRQb2ludChub3JtYWw6VmVjdG9yM0QsIHBvaW50OlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy5hID0gbm9ybWFsLng7XG5cdFx0dGhpcy5iID0gbm9ybWFsLnk7XG5cdFx0dGhpcy5jID0gbm9ybWFsLno7XG5cdFx0dGhpcy5kID0gdGhpcy5hKnBvaW50LnggKyB0aGlzLmIqcG9pbnQueSArIHRoaXMuYypwb2ludC56O1xuXHRcdGlmICh0aGlzLmEgPT0gMCAmJiB0aGlzLmIgPT0gMCkge1xuXG5cdFx0XHR0aGlzLl9pQWxpZ25tZW50ID0gUGxhbmUzRC5BTElHTl9YWV9BWElTO1xuXG5cdFx0fSBlbHNlIGlmICh0aGlzLmIgPT0gMCAmJiB0aGlzLmMgPT0gMCkge1xuXG5cdFx0XHR0aGlzLl9pQWxpZ25tZW50ID0gUGxhbmUzRC5BTElHTl9ZWl9BWElTO1xuXG5cdFx0fSBlbHNlIGlmICh0aGlzLmEgPT0gMCAmJiB0aGlzLmMgPT0gMCkge1xuXG5cdFx0XHR0aGlzLl9pQWxpZ25tZW50ID0gUGxhbmUzRC5BTElHTl9YWl9BWElTO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dGhpcy5faUFsaWdubWVudCA9IFBsYW5lM0QuQUxJR05fQU5ZO1xuXG5cdFx0fVxuXG5cdH1cblxuXHQvKipcblx0ICogTm9ybWFsaXplIHRoaXMgUGxhbmUzRFxuXHQgKiBAcmV0dXJuIFBsYW5lM0QgVGhpcyBQbGFuZTNELlxuXHQgKi9cblx0cHVibGljIG5vcm1hbGl6ZSgpOlBsYW5lM0Rcblx0e1xuXHRcdHZhciBsZW46bnVtYmVyID0gMS9NYXRoLnNxcnQodGhpcy5hKnRoaXMuYSArIHRoaXMuYip0aGlzLmIgKyB0aGlzLmMqdGhpcy5jKTtcblx0XHR0aGlzLmEgKj0gbGVuO1xuXHRcdHRoaXMuYiAqPSBsZW47XG5cdFx0dGhpcy5jICo9IGxlbjtcblx0XHR0aGlzLmQgKj0gbGVuO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHNpZ25lZCBkaXN0YW5jZSBiZXR3ZWVuIHRoaXMgUGxhbmUzRCBhbmQgdGhlIHBvaW50IHAuXG5cdCAqIEBwYXJhbSBwIFZlY3RvcjNEXG5cdCAqIEByZXR1cm5zIE51bWJlclxuXHQgKi9cblx0cHVibGljIGRpc3RhbmNlKHA6VmVjdG9yM0QpOm51bWJlclxuXHR7XG5cblx0XHRpZiAodGhpcy5faUFsaWdubWVudCA9PSBQbGFuZTNELkFMSUdOX1laX0FYSVMpIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuYSpwLnggLSB0aGlzLmQ7XG5cblx0XHR9IGVsc2UgaWYgKHRoaXMuX2lBbGlnbm1lbnQgPT0gUGxhbmUzRC5BTElHTl9YWl9BWElTKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5iKnAueSAtIHRoaXMuZDtcblx0XHR9XG5cblx0XHRlbHNlIGlmICh0aGlzLl9pQWxpZ25tZW50ID09IFBsYW5lM0QuQUxJR05fWFlfQVhJUykge1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5jKnAueiAtIHRoaXMuZDtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmEqcC54ICsgdGhpcy5iKnAueSArIHRoaXMuYypwLnogLSB0aGlzLmQ7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBDbGFzc2lmeSBhIHBvaW50IGFnYWluc3QgdGhpcyBQbGFuZTNELiAoaW4gZnJvbnQsIGJhY2sgb3IgaW50ZXJzZWN0aW5nKVxuXHQgKiBAcGFyYW0gcCBWZWN0b3IzRFxuXHQgKiBAcmV0dXJuIGludCBQbGFuZTMuRlJPTlQgb3IgUGxhbmUzRC5CQUNLIG9yIFBsYW5lM0QuSU5URVJTRUNUXG5cdCAqL1xuXHRwdWJsaWMgY2xhc3NpZnlQb2ludChwOlZlY3RvcjNELCBlcHNpbG9uOm51bWJlciA9IDAuMDEpOm51bWJlclxuXHR7XG5cdFx0Ly8gY2hlY2sgTmFOXG5cdFx0aWYgKHRoaXMuZCAhPSB0aGlzLmQpXG5cdFx0XHRyZXR1cm4gUGxhbmVDbGFzc2lmaWNhdGlvbi5GUk9OVDtcblxuXHRcdHZhciBsZW46bnVtYmVyO1xuXHRcdGlmICh0aGlzLl9pQWxpZ25tZW50ID09IFBsYW5lM0QuQUxJR05fWVpfQVhJUylcblx0XHRcdGxlbiA9IHRoaXMuYSpwLnggLSB0aGlzLmQ7IGVsc2UgaWYgKHRoaXMuX2lBbGlnbm1lbnQgPT0gUGxhbmUzRC5BTElHTl9YWl9BWElTKVxuXHRcdFx0bGVuID0gdGhpcy5iKnAueSAtIHRoaXMuZDsgZWxzZSBpZiAodGhpcy5faUFsaWdubWVudCA9PSBQbGFuZTNELkFMSUdOX1hZX0FYSVMpXG5cdFx0XHRsZW4gPSB0aGlzLmMqcC56IC0gdGhpcy5kOyBlbHNlXG5cdFx0XHRsZW4gPSB0aGlzLmEqcC54ICsgdGhpcy5iKnAueSArIHRoaXMuYypwLnogLSB0aGlzLmQ7XG5cblx0XHRpZiAobGVuIDwgLWVwc2lsb24pXG5cdFx0XHRyZXR1cm4gUGxhbmVDbGFzc2lmaWNhdGlvbi5CQUNLOyBlbHNlIGlmIChsZW4gPiBlcHNpbG9uKVxuXHRcdFx0cmV0dXJuIFBsYW5lQ2xhc3NpZmljYXRpb24uRlJPTlQ7IGVsc2Vcblx0XHRcdHJldHVybiBQbGFuZUNsYXNzaWZpY2F0aW9uLklOVEVSU0VDVDtcblx0fVxuXG5cdHB1YmxpYyB0b1N0cmluZygpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIFwiUGxhbmUzRCBbYTpcIiArIHRoaXMuYSArIFwiLCBiOlwiICsgdGhpcy5iICsgXCIsIGM6XCIgKyB0aGlzLmMgKyBcIiwgZDpcIiArIHRoaXMuZCArIFwiXVwiO1xuXHR9XG59XG5cbmV4cG9ydCA9IFBsYW5lM0Q7Il19 \ No newline at end of file diff --git a/lib/core/geom/Plane3D.ts b/lib/core/geom/Plane3D.ts new file mode 100644 index 00000000..a32c1b9b --- /dev/null +++ b/lib/core/geom/Plane3D.ts @@ -0,0 +1,209 @@ +import PlaneClassification = require("awayjs-core/lib/core/geom/PlaneClassification"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +class Plane3D +{ + /** + * The A coefficient of this plane. (Also the x dimension of the plane normal) + */ + public a:number; + + /** + * The B coefficient of this plane. (Also the y dimension of the plane normal) + */ + public b:number; + + /** + * The C coefficient of this plane. (Also the z dimension of the plane normal) + */ + public c:number; + + /** + * The D coefficient of this plane. (Also the inverse dot product between normal and point) + */ + public d:number; + + public _iAlignment:number; + + // indicates the alignment of the plane + public static ALIGN_ANY:number = 0; + public static ALIGN_XY_AXIS:number = 1; + public static ALIGN_YZ_AXIS:number = 2; + public static ALIGN_XZ_AXIS:number = 3; + + /** + * Create a Plane3D with ABCD coefficients + */ + constructor(a:number = 0, b:number = 0, c:number = 0, d:number = 0) + { + this.a = a; + this.b = b; + this.c = c; + this.d = d; + + if (a == 0 && b == 0) { + + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + + } else if (b == 0 && c == 0) { + + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + + } else if (a == 0 && c == 0) { + + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + + } else { + + this._iAlignment = Plane3D.ALIGN_ANY; + + } + + } + + /** + * Fills this Plane3D with the coefficients from 3 points in 3d space. + * @param p0 Vector3D + * @param p1 Vector3D + * @param p2 Vector3D + */ + public fromPoints(p0:Vector3D, p1:Vector3D, p2:Vector3D) + { + var d1x:number = p1.x - p0.x; + var d1y:number = p1.y - p0.y; + var d1z:number = p1.z - p0.z; + + var d2x:number = p2.x - p0.x; + var d2y:number = p2.y - p0.y; + var d2z:number = p2.z - p0.z; + + this.a = d1y*d2z - d1z*d2y; + this.b = d1z*d2x - d1x*d2z; + this.c = d1x*d2y - d1y*d2x; + this.d = this.a*p0.x + this.b*p0.y + this.c*p0.z; + + // not using epsilon, since a plane is infinite and a small incorrection can grow very large + if (this.a == 0 && this.b == 0) { + + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + + } else if (this.b == 0 && this.c == 0) { + + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + + } else if (this.a == 0 && this.c == 0) { + + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + + } else { + + this._iAlignment = Plane3D.ALIGN_ANY; + + } + + } + + /** + * Fills this Plane3D with the coefficients from the plane's normal and a point in 3d space. + * @param normal Vector3D + * @param point Vector3D + */ + public fromNormalAndPoint(normal:Vector3D, point:Vector3D) + { + this.a = normal.x; + this.b = normal.y; + this.c = normal.z; + this.d = this.a*point.x + this.b*point.y + this.c*point.z; + if (this.a == 0 && this.b == 0) { + + this._iAlignment = Plane3D.ALIGN_XY_AXIS; + + } else if (this.b == 0 && this.c == 0) { + + this._iAlignment = Plane3D.ALIGN_YZ_AXIS; + + } else if (this.a == 0 && this.c == 0) { + + this._iAlignment = Plane3D.ALIGN_XZ_AXIS; + + } else { + + this._iAlignment = Plane3D.ALIGN_ANY; + + } + + } + + /** + * Normalize this Plane3D + * @return Plane3D This Plane3D. + */ + public normalize():Plane3D + { + var len:number = 1/Math.sqrt(this.a*this.a + this.b*this.b + this.c*this.c); + this.a *= len; + this.b *= len; + this.c *= len; + this.d *= len; + return this; + } + + /** + * Returns the signed distance between this Plane3D and the point p. + * @param p Vector3D + * @returns Number + */ + public distance(p:Vector3D):number + { + + if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) { + + return this.a*p.x - this.d; + + } else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) { + return this.b*p.y - this.d; + } + + else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) { + + return this.c*p.z - this.d; + + } else { + + return this.a*p.x + this.b*p.y + this.c*p.z - this.d; + + } + + } + + /** + * Classify a point against this Plane3D. (in front, back or intersecting) + * @param p Vector3D + * @return int Plane3.FRONT or Plane3D.BACK or Plane3D.INTERSECT + */ + public classifyPoint(p:Vector3D, epsilon:number = 0.01):number + { + // check NaN + if (this.d != this.d) + return PlaneClassification.FRONT; + + var len:number; + if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) + len = this.a*p.x - this.d; else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) + len = this.b*p.y - this.d; else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) + len = this.c*p.z - this.d; else + len = this.a*p.x + this.b*p.y + this.c*p.z - this.d; + + if (len < -epsilon) + return PlaneClassification.BACK; else if (len > epsilon) + return PlaneClassification.FRONT; else + return PlaneClassification.INTERSECT; + } + + public toString():string + { + return "Plane3D [a:" + this.a + ", b:" + this.b + ", c:" + this.c + ", d:" + this.d + "]"; + } +} + +export = Plane3D; \ No newline at end of file diff --git a/lib/core/geom/PlaneClassification.js b/lib/core/geom/PlaneClassification.js new file mode 100755 index 00000000..d04cc192 --- /dev/null +++ b/lib/core/geom/PlaneClassification.js @@ -0,0 +1,15 @@ +var PlaneClassification = (function () { + function PlaneClassification() { + } + PlaneClassification.BACK = 0; + PlaneClassification.FRONT = 1; + + PlaneClassification.IN = 0; + PlaneClassification.OUT = 1; + PlaneClassification.INTERSECT = 2; + return PlaneClassification; +})(); + +module.exports = PlaneClassification; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9QbGFuZUNsYXNzaWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbIlBsYW5lQ2xhc3NpZmljYXRpb24iLCJQbGFuZUNsYXNzaWZpY2F0aW9uLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtJQUFBQTtJQVVBQyxDQUFDQTtBQUFBRCxJQVBBQSwyQkFBNEJBLENBQUNBO0lBQzdCQSw0QkFBNkJBLENBQUNBOztJQUU5QkEseUJBQTBCQSxDQUFDQTtJQUMzQkEsMEJBQTJCQSxDQUFDQTtJQUM1QkEsZ0NBQWlDQSxDQUFDQTtJQUVuQ0EsMkJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsb0NBQTZCLENBQUEiLCJmaWxlIjoiY29yZS9nZW9tL1BsYW5lQ2xhc3NpZmljYXRpb24uanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBQbGFuZUNsYXNzaWZpY2F0aW9uXG57XG5cdC8vIFwiYmFja1wiIGlzIHN5bm9ueW1vdXMgd2l0aCBcImluXCIsIGJ1dCB1c2VkIGZvciBwbGFuZXMgKGJhY2sgb2YgcGxhbmUgaXMgXCJpbnNpZGVcIiBhIHNvbGlkIHZvbHVtZSB3YWxsZWQgYnkgYSBwbGFuZSlcblx0cHVibGljIHN0YXRpYyBCQUNLOm51bWJlciA9IDA7XG5cdHB1YmxpYyBzdGF0aWMgRlJPTlQ6bnVtYmVyID0gMTtcblxuXHRwdWJsaWMgc3RhdGljIElOOm51bWJlciA9IDA7XG5cdHB1YmxpYyBzdGF0aWMgT1VUOm51bWJlciA9IDE7XG5cdHB1YmxpYyBzdGF0aWMgSU5URVJTRUNUOm51bWJlciA9IDI7XG5cbn1cblxuZXhwb3J0ID0gUGxhbmVDbGFzc2lmaWNhdGlvbjsiXX0= \ No newline at end of file diff --git a/lib/core/geom/PlaneClassification.ts b/lib/core/geom/PlaneClassification.ts new file mode 100644 index 00000000..578abfd5 --- /dev/null +++ b/lib/core/geom/PlaneClassification.ts @@ -0,0 +1,13 @@ +class PlaneClassification +{ + // "back" is synonymous with "in", but used for planes (back of plane is "inside" a solid volume walled by a plane) + public static BACK:number = 0; + public static FRONT:number = 1; + + public static IN:number = 0; + public static OUT:number = 1; + public static INTERSECT:number = 2; + +} + +export = PlaneClassification; \ No newline at end of file diff --git a/lib/core/geom/Point.js b/lib/core/geom/Point.js new file mode 100755 index 00000000..b172ca3c --- /dev/null +++ b/lib/core/geom/Point.js @@ -0,0 +1,195 @@ +/** +* The Point object represents a location in a two-dimensional coordinate +* system, where x represents the horizontal axis and y +* represents the vertical axis. +* +*

The following code creates a point at(0,0):

+* +*

Methods and properties of the following classes use Point objects:

+* +*
    +*
  • BitmapData
  • +*
  • DisplayObject
  • +*
  • DisplayObjectContainer
  • +*
  • DisplacementMapFilter
  • +*
  • NativeWindow
  • +*
  • Matrix
  • +*
  • Rectangle
  • +*
+* +*

You can use the new Point() constructor to create a Point +* object.

+*/ +var Point = (function () { + /** + * Creates a new point. If you pass no parameters to this method, a point is + * created at(0,0). + * + * @param x The horizontal coordinate. + * @param y The vertical coordinate. + */ + function Point(x, y) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + this.x = x; + this.y = y; + } + Object.defineProperty(Point.prototype, "length", { + /** + * The length of the line segment from(0,0) to this point. + */ + get: function () { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + enumerable: true, + configurable: true + }); + + /** + * Adds the coordinates of another point to the coordinates of this point to + * create a new point. + * + * @param v The point to be added. + * @return The new point. + */ + Point.prototype.add = function (v) { + return new Point(this.x + v.x, this.y + v.y); + }; + + /** + * Creates a copy of this Point object. + * + * @return The new Point object. + */ + Point.prototype.clone = function () { + return new Point(this.x, this.y); + }; + + Point.prototype.copyFrom = function (sourcePoint) { + }; + + /** + * Determines whether two points are equal. Two points are equal if they have + * the same x and y values. + * + * @param toCompare The point to be compared. + * @return A value of true if the object is equal to this Point + * object; false if it is not equal. + */ + Point.prototype.equals = function (toCompare) { + return (this.x == toCompare.x && this.y == toCompare.y); + }; + + /** + * Scales the line segment between(0,0) and the current point to a set + * length. + * + * @param thickness The scaling value. For example, if the current point is + * (0,5), and you normalize it to 1, the point returned is + * at(0,1). + */ + Point.prototype.normalize = function (thickness) { + if (typeof thickness === "undefined") { thickness = 1; } + if (this.length != 0) { + var invLength = thickness / this.length; + this.x *= invLength; + this.y *= invLength; + return; + } + throw "Cannot divide by zero length."; + }; + + /** + * Offsets the Point object by the specified amount. The value of + * dx is added to the original value of x to create the + * new x value. The value of dy is added to the original + * value of y to create the new y value. + * + * @param dx The amount by which to offset the horizontal coordinate, + * x. + * @param dy The amount by which to offset the vertical coordinate, y. + */ + Point.prototype.offset = function (dx, dy) { + this.x += dx; + this.y += dy; + }; + + Point.prototype.setTo = function (xa, ya) { + }; + + /** + * Subtracts the coordinates of another point from the coordinates of this + * point to create a new point. + * + * @param v The point to be subtracted. + * @return The new point. + */ + Point.prototype.subtract = function (v) { + return new Point(this.x - v.x, this.y - v.y); + }; + + /** + * Returns a string that contains the values of the x and y + * coordinates. The string has the form "(x=x, + * y=y)", so calling the toString() method for a + * point at 23,17 would return "(x=23, y=17)". + * + * @return The string representation of the coordinates. + */ + Point.prototype.toString = function () { + return "[Point] (x=" + this.x + ", y=" + this.y + ")"; + }; + + /** + * Returns the distance between pt1 and pt2. + * + * @param pt1 The first point. + * @param pt2 The second point. + * @return The distance between the first and second points. + */ + Point.distance = function (pt1, pt2) { + var dx = pt2.x - pt1.x; + var dy = pt2.y - pt1.y; + + return Math.sqrt(dx * dx + dy * dy); + }; + + /** + * Determines a point between two specified points. The parameter + * f determines where the new interpolated point is located + * relative to the two end points specified by parameters pt1 + * and pt2. The closer the value of the parameter f + * is to 1.0, the closer the interpolated point is to the first + * point(parameter pt1). The closer the value of the parameter + * f is to 0, the closer the interpolated point is to the second + * point(parameter pt2). + * + * @param pt1 The first point. + * @param pt2 The second point. + * @param f The level of interpolation between the two points. Indicates + * where the new point will be, along the line between + * pt1 and pt2. If f=1, + * pt1 is returned; if f=0, + * pt2 is returned. + * @return The new, interpolated point. + */ + Point.interpolate = function (pt1, pt2, f) { + return new Point(pt2.x + (pt1.x - pt2.x) * f, pt2.y + (pt1.y - pt2.y) * f); + }; + + /** + * Converts a pair of polar coordinates to a Cartesian point coordinate. + * + * @param len The length coordinate of the polar pair. + * @param angle The angle, in radians, of the polar pair. + * @return The Cartesian point. + */ + Point.polar = function (len, angle) { + return new Point(len * Math.cos(angle), len * Math.sin(angle)); + }; + return Point; +})(); + +module.exports = Point; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9Qb2ludC50cyJdLCJuYW1lcyI6WyJQb2ludCIsIlBvaW50LmNvbnN0cnVjdG9yIiwiUG9pbnQuYWRkIiwiUG9pbnQuY2xvbmUiLCJQb2ludC5jb3B5RnJvbSIsIlBvaW50LmVxdWFscyIsIlBvaW50Lm5vcm1hbGl6ZSIsIlBvaW50Lm9mZnNldCIsIlBvaW50LnNldFRvIiwiUG9pbnQuc3VidHJhY3QiLCJQb2ludC50b1N0cmluZyIsIlBvaW50LmRpc3RhbmNlIiwiUG9pbnQuaW50ZXJwb2xhdGUiLCJQb2ludC5wb2xhciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXFCRztBQUNIO0lBMkJDQTs7Ozs7O01BREdBO0lBQ0hBLGVBQVlBLENBQVlBLEVBQUVBLENBQVlBO1FBQTFCQyxnQ0FBQUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsZ0NBQUFBLENBQUNBLEdBQVVBLENBQUNBO0FBQUFBLFFBRXJDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtJQUNYQSxDQUFDQTtJQWhCREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO1FBQ2hEQSxDQUFDQTs7OztBQUFBQTtJQXNCREE7Ozs7OztNQURHQTswQkFDSEEsVUFBV0EsQ0FBT0E7UUFFakJFLE9BQU9BLElBQUlBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0lBQzdDQSxDQUFDQTs7SUFPREY7Ozs7TUFER0E7NEJBQ0hBO1FBRUNHLE9BQU9BLElBQUlBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0lBQ2pDQSxDQUFDQTs7SUFFREgsMkJBQUFBLFVBQWdCQSxXQUFpQkE7SUFHakNJLENBQUNBOztJQVVESjs7Ozs7OztNQURHQTs2QkFDSEEsVUFBY0EsU0FBZUE7UUFFNUJLLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBO0lBQ3hEQSxDQUFDQTs7SUFVREw7Ozs7Ozs7TUFER0E7Z0NBQ0hBLFVBQWlCQSxTQUFvQkE7UUFBcEJNLHdDQUFBQSxTQUFTQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUVwQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsTUFBTUEsSUFBSUEsQ0FBQ0EsQ0FBRUE7WUFDckJBLElBQUlBLFNBQVNBLEdBQUdBLFNBQVNBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BO1lBQ3JDQSxJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxTQUFTQTtZQUNuQkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsU0FBU0E7WUFDbkJBLE1BQU9BO1NBQ1BBO1FBQ0RBLE1BQU1BLCtCQUErQkE7SUFDdENBLENBQUNBOztJQVlETjs7Ozs7Ozs7O01BREdBOzZCQUNIQSxVQUFjQSxFQUFTQSxFQUFFQSxFQUFTQTtRQUVqQ08sSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUE7UUFDWkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUE7SUFDYkEsQ0FBQ0E7O0lBRURQLHdCQUFBQSxVQUFhQSxFQUFTQSxFQUFFQSxFQUFTQTtJQUdqQ1EsQ0FBQ0E7O0lBU0RSOzs7Ozs7TUFER0E7K0JBQ0hBLFVBQWdCQSxDQUFPQTtRQUV0QlMsT0FBT0EsSUFBSUEsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDN0NBLENBQUNBOztJQVVEVDs7Ozs7OztNQURHQTsrQkFDSEE7UUFFQ1UsT0FBT0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0E7SUFDdERBLENBQUNBOztJQVNEVjs7Ozs7O01BREdBO3FCQUNIQSxVQUF1QkEsR0FBU0EsRUFBRUEsR0FBU0E7UUFFMUNXLElBQUlBLEVBQUVBLEdBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBO1FBQzdCQSxJQUFJQSxFQUFFQSxHQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQTs7UUFFN0JBLE9BQU9BLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBLENBQUNBO0lBQ2hDQSxDQUFDQTs7SUFxQkRYOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFER0E7d0JBQ0hBLFVBQTBCQSxHQUFTQSxFQUFFQSxHQUFTQSxFQUFFQSxDQUFRQTtRQUV2RFksT0FBT0EsSUFBSUEsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDdkVBLENBQUNBOztJQVNEWjs7Ozs7O01BREdBO2tCQUNIQSxVQUFvQkEsR0FBVUEsRUFBRUEsS0FBWUE7UUFFM0NhLE9BQU9BLElBQUlBLEtBQUtBLENBQUNBLEdBQUdBLEdBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLEdBQUdBLEdBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0lBQzNEQSxDQUFDQTtJQUNGYixhQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELHNCQUFlLENBQ2YiLCJmaWxlIjoiY29yZS9nZW9tL1BvaW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgUG9pbnQgb2JqZWN0IHJlcHJlc2VudHMgYSBsb2NhdGlvbiBpbiBhIHR3by1kaW1lbnNpb25hbCBjb29yZGluYXRlXG4gKiBzeXN0ZW0sIHdoZXJlIDxpPng8L2k+IHJlcHJlc2VudHMgdGhlIGhvcml6b250YWwgYXhpcyBhbmQgPGk+eTwvaT5cbiAqIHJlcHJlc2VudHMgdGhlIHZlcnRpY2FsIGF4aXMuXG4gKlxuICogPHA+VGhlIGZvbGxvd2luZyBjb2RlIGNyZWF0ZXMgYSBwb2ludCBhdCgwLDApOjwvcD5cbiAqXG4gKiA8cD5NZXRob2RzIGFuZCBwcm9wZXJ0aWVzIG9mIHRoZSBmb2xsb3dpbmcgY2xhc3NlcyB1c2UgUG9pbnQgb2JqZWN0czo8L3A+XG4gKlxuICogPHVsPlxuICogICA8bGk+Qml0bWFwRGF0YTwvbGk+XG4gKiAgIDxsaT5EaXNwbGF5T2JqZWN0PC9saT5cbiAqICAgPGxpPkRpc3BsYXlPYmplY3RDb250YWluZXI8L2xpPlxuICogICA8bGk+RGlzcGxhY2VtZW50TWFwRmlsdGVyPC9saT5cbiAqICAgPGxpPk5hdGl2ZVdpbmRvdzwvbGk+XG4gKiAgIDxsaT5NYXRyaXg8L2xpPlxuICogICA8bGk+UmVjdGFuZ2xlPC9saT5cbiAqIDwvdWw+XG4gKlxuICogPHA+WW91IGNhbiB1c2UgdGhlIDxjb2RlPm5ldyBQb2ludCgpPC9jb2RlPiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBQb2ludFxuICogb2JqZWN0LjwvcD5cbiAqL1xuY2xhc3MgUG9pbnRcbntcblx0LyoqXG5cdCAqIFRoZSBob3Jpem9udGFsIGNvb3JkaW5hdGUgb2YgdGhlIHBvaW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuXHQgKi9cblx0cHVibGljIHg6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDAuXG5cdCAqL1xuXHRwdWJsaWMgeTpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSBsZW5ndGggb2YgdGhlIGxpbmUgc2VnbWVudCBmcm9tKDAsMCkgdG8gdGhpcyBwb2ludC5cblx0ICovXG5cdHB1YmxpYyBnZXQgbGVuZ3RoKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLnggKyB0aGlzLnkqdGhpcy55KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IHBvaW50LiBJZiB5b3UgcGFzcyBubyBwYXJhbWV0ZXJzIHRvIHRoaXMgbWV0aG9kLCBhIHBvaW50IGlzXG5cdCAqIGNyZWF0ZWQgYXQoMCwwKS5cblx0ICpcblx0ICogQHBhcmFtIHggVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZS5cblx0ICogQHBhcmFtIHkgVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih4Om51bWJlciA9IDAsIHk6bnVtYmVyID0gMClcblx0e1xuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRoZSBjb29yZGluYXRlcyBvZiBhbm90aGVyIHBvaW50IHRvIHRoZSBjb29yZGluYXRlcyBvZiB0aGlzIHBvaW50IHRvXG5cdCAqIGNyZWF0ZSBhIG5ldyBwb2ludC5cblx0ICpcblx0ICogQHBhcmFtIHYgVGhlIHBvaW50IHRvIGJlIGFkZGVkLlxuXHQgKiBAcmV0dXJuIFRoZSBuZXcgcG9pbnQuXG5cdCAqL1xuXHRwdWJsaWMgYWRkKHY6UG9pbnQpOlBvaW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IFBvaW50KHRoaXMueCArIHYueCwgdGhpcy55ICsgdi55KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIFBvaW50IG9iamVjdC5cblx0ICpcblx0ICogQHJldHVybiBUaGUgbmV3IFBvaW50IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOlBvaW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55KTtcblx0fVxuXG5cdHB1YmxpYyBjb3B5RnJvbShzb3VyY2VQb2ludDpQb2ludClcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byBwb2ludHMgYXJlIGVxdWFsLiBUd28gcG9pbnRzIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmVcblx0ICogdGhlIHNhbWUgPGk+eDwvaT4gYW5kIDxpPnk8L2k+IHZhbHVlcy5cblx0ICpcblx0ICogQHBhcmFtIHRvQ29tcGFyZSBUaGUgcG9pbnQgdG8gYmUgY29tcGFyZWQuXG5cdCAqIEByZXR1cm4gQSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgUG9pbnRcblx0ICogICAgICAgICBvYmplY3Q7IDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QgZXF1YWwuXG5cdCAqL1xuXHRwdWJsaWMgZXF1YWxzKHRvQ29tcGFyZTpQb2ludCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnggPT0gdG9Db21wYXJlLnggJiYgdGhpcy55ID09IHRvQ29tcGFyZS55KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTY2FsZXMgdGhlIGxpbmUgc2VnbWVudCBiZXR3ZWVuKDAsMCkgYW5kIHRoZSBjdXJyZW50IHBvaW50IHRvIGEgc2V0XG5cdCAqIGxlbmd0aC5cblx0ICpcblx0ICogQHBhcmFtIHRoaWNrbmVzcyBUaGUgc2NhbGluZyB2YWx1ZS4gRm9yIGV4YW1wbGUsIGlmIHRoZSBjdXJyZW50IHBvaW50IGlzXG5cdCAqICAgICAgICAgICAgICAgICAoMCw1KSwgYW5kIHlvdSBub3JtYWxpemUgaXQgdG8gMSwgdGhlIHBvaW50IHJldHVybmVkIGlzXG5cdCAqICAgICAgICAgICAgICAgICAgYXQoMCwxKS5cblx0ICovXG5cdHB1YmxpYyBub3JtYWxpemUodGhpY2tuZXNzOm51bWJlciA9IDEpXG5cdHtcblx0XHRpZiAodGhpcy5sZW5ndGggIT0gMCkge1xuXHRcdFx0dmFyIGludkxlbmd0aCA9IHRoaWNrbmVzcy90aGlzLmxlbmd0aDtcblx0XHRcdHRoaXMueCAqPSBpbnZMZW5ndGg7XG5cdFx0XHR0aGlzLnkgKj0gaW52TGVuZ3RoO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aHJvdyBcIkNhbm5vdCBkaXZpZGUgYnkgemVybyBsZW5ndGguXCI7XG5cdH1cblxuXHQvKipcblx0ICogT2Zmc2V0cyB0aGUgUG9pbnQgb2JqZWN0IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50LiBUaGUgdmFsdWUgb2Zcblx0ICogPGNvZGU+ZHg8L2NvZGU+IGlzIGFkZGVkIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiA8aT54PC9pPiB0byBjcmVhdGUgdGhlXG5cdCAqIG5ldyA8aT54PC9pPiB2YWx1ZS4gVGhlIHZhbHVlIG9mIDxjb2RlPmR5PC9jb2RlPiBpcyBhZGRlZCB0byB0aGUgb3JpZ2luYWxcblx0ICogdmFsdWUgb2YgPGk+eTwvaT4gdG8gY3JlYXRlIHRoZSBuZXcgPGk+eTwvaT4gdmFsdWUuXG5cdCAqXG5cdCAqIEBwYXJhbSBkeCBUaGUgYW1vdW50IGJ5IHdoaWNoIHRvIG9mZnNldCB0aGUgaG9yaXpvbnRhbCBjb29yZGluYXRlLFxuXHQgKiAgICAgICAgICAgPGk+eDwvaT4uXG5cdCAqIEBwYXJhbSBkeSBUaGUgYW1vdW50IGJ5IHdoaWNoIHRvIG9mZnNldCB0aGUgdmVydGljYWwgY29vcmRpbmF0ZSwgPGk+eTwvaT4uXG5cdCAqL1xuXHRwdWJsaWMgb2Zmc2V0KGR4Om51bWJlciwgZHk6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy54ICs9IGR4O1xuXHRcdHRoaXMueSArPSBkeTtcblx0fVxuXG5cdHB1YmxpYyBzZXRUbyh4YTpudW1iZXIsIHlhOm51bWJlcilcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogU3VidHJhY3RzIHRoZSBjb29yZGluYXRlcyBvZiBhbm90aGVyIHBvaW50IGZyb20gdGhlIGNvb3JkaW5hdGVzIG9mIHRoaXNcblx0ICogcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBvaW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gdiBUaGUgcG9pbnQgdG8gYmUgc3VidHJhY3RlZC5cblx0ICogQHJldHVybiBUaGUgbmV3IHBvaW50LlxuXHQgKi9cblx0cHVibGljIHN1YnRyYWN0KHY6UG9pbnQpOlBvaW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IFBvaW50KHRoaXMueCAtIHYueCwgdGhpcy55IC0gdi55KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgdGhlIHZhbHVlcyBvZiB0aGUgPGk+eDwvaT4gYW5kIDxpPnk8L2k+XG5cdCAqIGNvb3JkaW5hdGVzLiBUaGUgc3RyaW5nIGhhcyB0aGUgZm9ybSA8Y29kZT5cIih4PTxpPng8L2k+LFxuXHQgKiB5PTxpPnk8L2k+KVwiPC9jb2RlPiwgc28gY2FsbGluZyB0aGUgPGNvZGU+dG9TdHJpbmcoKTwvY29kZT4gbWV0aG9kIGZvciBhXG5cdCAqIHBvaW50IGF0IDIzLDE3IHdvdWxkIHJldHVybiA8Y29kZT5cIih4PTIzLCB5PTE3KVwiPC9jb2RlPi5cblx0ICpcblx0ICogQHJldHVybiBUaGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb29yZGluYXRlcy5cblx0ICovXG5cdHB1YmxpYyB0b1N0cmluZygpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIFwiW1BvaW50XSAoeD1cIiArIHRoaXMueCArIFwiLCB5PVwiICsgdGhpcy55ICsgXCIpXCI7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZGlzdGFuY2UgYmV0d2VlbiA8Y29kZT5wdDE8L2NvZGU+IGFuZCA8Y29kZT5wdDI8L2NvZGU+LlxuXHQgKlxuXHQgKiBAcGFyYW0gcHQxIFRoZSBmaXJzdCBwb2ludC5cblx0ICogQHBhcmFtIHB0MiBUaGUgc2Vjb25kIHBvaW50LlxuXHQgKiBAcmV0dXJuIFRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHBvaW50cy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZGlzdGFuY2UocHQxOlBvaW50LCBwdDI6UG9pbnQpOm51bWJlclxuXHR7XG5cdFx0dmFyIGR4Om51bWJlciA9IHB0Mi54IC0gcHQxLng7XG5cdFx0dmFyIGR5Om51bWJlciA9IHB0Mi55IC0gcHQxLnk7XG5cblx0XHRyZXR1cm4gTWF0aC5zcXJ0KGR4KmR4ICsgZHkqZHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgYSBwb2ludCBiZXR3ZWVuIHR3byBzcGVjaWZpZWQgcG9pbnRzLiBUaGUgcGFyYW1ldGVyXG5cdCAqIDxjb2RlPmY8L2NvZGU+IGRldGVybWluZXMgd2hlcmUgdGhlIG5ldyBpbnRlcnBvbGF0ZWQgcG9pbnQgaXMgbG9jYXRlZFxuXHQgKiByZWxhdGl2ZSB0byB0aGUgdHdvIGVuZCBwb2ludHMgc3BlY2lmaWVkIGJ5IHBhcmFtZXRlcnMgPGNvZGU+cHQxPC9jb2RlPlxuXHQgKiBhbmQgPGNvZGU+cHQyPC9jb2RlPi4gVGhlIGNsb3NlciB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciA8Y29kZT5mPC9jb2RlPlxuXHQgKiBpcyB0byA8Y29kZT4xLjA8L2NvZGU+LCB0aGUgY2xvc2VyIHRoZSBpbnRlcnBvbGF0ZWQgcG9pbnQgaXMgdG8gdGhlIGZpcnN0XG5cdCAqIHBvaW50KHBhcmFtZXRlciA8Y29kZT5wdDE8L2NvZGU+KS4gVGhlIGNsb3NlciB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlclxuXHQgKiA8Y29kZT5mPC9jb2RlPiBpcyB0byAwLCB0aGUgY2xvc2VyIHRoZSBpbnRlcnBvbGF0ZWQgcG9pbnQgaXMgdG8gdGhlIHNlY29uZFxuXHQgKiBwb2ludChwYXJhbWV0ZXIgPGNvZGU+cHQyPC9jb2RlPikuXG5cdCAqXG5cdCAqIEBwYXJhbSBwdDEgVGhlIGZpcnN0IHBvaW50LlxuXHQgKiBAcGFyYW0gcHQyIFRoZSBzZWNvbmQgcG9pbnQuXG5cdCAqIEBwYXJhbSBmICAgVGhlIGxldmVsIG9mIGludGVycG9sYXRpb24gYmV0d2VlbiB0aGUgdHdvIHBvaW50cy4gSW5kaWNhdGVzXG5cdCAqICAgICAgICAgICAgd2hlcmUgdGhlIG5ldyBwb2ludCB3aWxsIGJlLCBhbG9uZyB0aGUgbGluZSBiZXR3ZWVuXG5cdCAqICAgICAgICAgICAgPGNvZGU+cHQxPC9jb2RlPiBhbmQgPGNvZGU+cHQyPC9jb2RlPi4gSWYgPGNvZGU+ZjwvY29kZT49MSxcblx0ICogICAgICAgICAgICA8Y29kZT5wdDE8L2NvZGU+IGlzIHJldHVybmVkOyBpZiA8Y29kZT5mPC9jb2RlPj0wLFxuXHQgKiAgICAgICAgICAgIDxjb2RlPnB0MjwvY29kZT4gaXMgcmV0dXJuZWQuXG5cdCAqIEByZXR1cm4gVGhlIG5ldywgaW50ZXJwb2xhdGVkIHBvaW50LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBpbnRlcnBvbGF0ZShwdDE6UG9pbnQsIHB0MjpQb2ludCwgZjpudW1iZXIpOlBvaW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IFBvaW50KHB0Mi54ICsgKHB0MS54IC0gcHQyLngpKmYsIHB0Mi55ICsgKHB0MS55IC0gcHQyLnkpKmYpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGEgcGFpciBvZiBwb2xhciBjb29yZGluYXRlcyB0byBhIENhcnRlc2lhbiBwb2ludCBjb29yZGluYXRlLlxuXHQgKlxuXHQgKiBAcGFyYW0gbGVuICAgVGhlIGxlbmd0aCBjb29yZGluYXRlIG9mIHRoZSBwb2xhciBwYWlyLlxuXHQgKiBAcGFyYW0gYW5nbGUgVGhlIGFuZ2xlLCBpbiByYWRpYW5zLCBvZiB0aGUgcG9sYXIgcGFpci5cblx0ICogQHJldHVybiBUaGUgQ2FydGVzaWFuIHBvaW50LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBwb2xhcihsZW46bnVtYmVyLCBhbmdsZTpudW1iZXIpOlBvaW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IFBvaW50KGxlbipNYXRoLmNvcyhhbmdsZSksIGxlbipNYXRoLnNpbihhbmdsZSkpO1xuXHR9XG59XG5cbmV4cG9ydCA9IFBvaW50O1xuIl19 \ No newline at end of file diff --git a/lib/core/geom/Point.ts b/lib/core/geom/Point.ts new file mode 100644 index 00000000..1b892107 --- /dev/null +++ b/lib/core/geom/Point.ts @@ -0,0 +1,213 @@ +/** + * The Point object represents a location in a two-dimensional coordinate + * system, where x represents the horizontal axis and y + * represents the vertical axis. + * + *

The following code creates a point at(0,0):

+ * + *

Methods and properties of the following classes use Point objects:

+ * + *
    + *
  • BitmapData
  • + *
  • DisplayObject
  • + *
  • DisplayObjectContainer
  • + *
  • DisplacementMapFilter
  • + *
  • NativeWindow
  • + *
  • Matrix
  • + *
  • Rectangle
  • + *
+ * + *

You can use the new Point() constructor to create a Point + * object.

+ */ +class Point +{ + /** + * The horizontal coordinate of the point. The default value is 0. + */ + public x:number; + + /** + * The vertical coordinate of the point. The default value is 0. + */ + public y:number; + + /** + * The length of the line segment from(0,0) to this point. + */ + public get length():number + { + return Math.sqrt(this.x*this.x + this.y*this.y); + } + + /** + * Creates a new point. If you pass no parameters to this method, a point is + * created at(0,0). + * + * @param x The horizontal coordinate. + * @param y The vertical coordinate. + */ + constructor(x:number = 0, y:number = 0) + { + this.x = x; + this.y = y; + } + + /** + * Adds the coordinates of another point to the coordinates of this point to + * create a new point. + * + * @param v The point to be added. + * @return The new point. + */ + public add(v:Point):Point + { + return new Point(this.x + v.x, this.y + v.y); + } + + /** + * Creates a copy of this Point object. + * + * @return The new Point object. + */ + public clone():Point + { + return new Point(this.x, this.y); + } + + public copyFrom(sourcePoint:Point) + { + + } + + /** + * Determines whether two points are equal. Two points are equal if they have + * the same x and y values. + * + * @param toCompare The point to be compared. + * @return A value of true if the object is equal to this Point + * object; false if it is not equal. + */ + public equals(toCompare:Point):boolean + { + return (this.x == toCompare.x && this.y == toCompare.y); + } + + /** + * Scales the line segment between(0,0) and the current point to a set + * length. + * + * @param thickness The scaling value. For example, if the current point is + * (0,5), and you normalize it to 1, the point returned is + * at(0,1). + */ + public normalize(thickness:number = 1) + { + if (this.length != 0) { + var invLength = thickness/this.length; + this.x *= invLength; + this.y *= invLength; + return; + } + throw "Cannot divide by zero length."; + } + + /** + * Offsets the Point object by the specified amount. The value of + * dx is added to the original value of x to create the + * new x value. The value of dy is added to the original + * value of y to create the new y value. + * + * @param dx The amount by which to offset the horizontal coordinate, + * x. + * @param dy The amount by which to offset the vertical coordinate, y. + */ + public offset(dx:number, dy:number) + { + this.x += dx; + this.y += dy; + } + + public setTo(xa:number, ya:number) + { + + } + + /** + * Subtracts the coordinates of another point from the coordinates of this + * point to create a new point. + * + * @param v The point to be subtracted. + * @return The new point. + */ + public subtract(v:Point):Point + { + return new Point(this.x - v.x, this.y - v.y); + } + + /** + * Returns a string that contains the values of the x and y + * coordinates. The string has the form "(x=x, + * y=y)", so calling the toString() method for a + * point at 23,17 would return "(x=23, y=17)". + * + * @return The string representation of the coordinates. + */ + public toString():string + { + return "[Point] (x=" + this.x + ", y=" + this.y + ")"; + } + + /** + * Returns the distance between pt1 and pt2. + * + * @param pt1 The first point. + * @param pt2 The second point. + * @return The distance between the first and second points. + */ + public static distance(pt1:Point, pt2:Point):number + { + var dx:number = pt2.x - pt1.x; + var dy:number = pt2.y - pt1.y; + + return Math.sqrt(dx*dx + dy*dy); + } + + /** + * Determines a point between two specified points. The parameter + * f determines where the new interpolated point is located + * relative to the two end points specified by parameters pt1 + * and pt2. The closer the value of the parameter f + * is to 1.0, the closer the interpolated point is to the first + * point(parameter pt1). The closer the value of the parameter + * f is to 0, the closer the interpolated point is to the second + * point(parameter pt2). + * + * @param pt1 The first point. + * @param pt2 The second point. + * @param f The level of interpolation between the two points. Indicates + * where the new point will be, along the line between + * pt1 and pt2. If f=1, + * pt1 is returned; if f=0, + * pt2 is returned. + * @return The new, interpolated point. + */ + public static interpolate(pt1:Point, pt2:Point, f:number):Point + { + return new Point(pt2.x + (pt1.x - pt2.x)*f, pt2.y + (pt1.y - pt2.y)*f); + } + + /** + * Converts a pair of polar coordinates to a Cartesian point coordinate. + * + * @param len The length coordinate of the polar pair. + * @param angle The angle, in radians, of the polar pair. + * @return The Cartesian point. + */ + public static polar(len:number, angle:number):Point + { + return new Point(len*Math.cos(angle), len*Math.sin(angle)); + } +} + +export = Point; diff --git a/lib/core/geom/PoissonLookup.js b/lib/core/geom/PoissonLookup.js new file mode 100755 index 00000000..d43c14bd --- /dev/null +++ b/lib/core/geom/PoissonLookup.js @@ -0,0 +1,55 @@ +var PoissonLookup = (function () { + function PoissonLookup() { + } + PoissonLookup.initDistributions = function () { + // precalculated for best control + this._distributions = new Array(); + this._distributions[0] = new Array(0.3082841, 0.4320919); + this._distributions[1] = new Array(0.3082841, 0.4320919, -0.2274942, -0.6640266); + this._distributions[2] = new Array(0.8742689, 0.0009265686, -0.6864116, -0.5536607, -0.2325206, 0.7678371); + this._distributions[3] = new Array(0.3913446, -0.7084417, -0.7511101, -0.5935929, -0.2323436, 0.5320091, 0.8435315, 0.5035911); + this._distributions[4] = new Array(0.2122471, -0.5771395, -0.8543506, -0.1763534, 0.5189021, 0.8323698, -0.3616908, 0.5865368, 0.9523004, -0.04948437); + this._distributions[5] = new Array(0.5791035, 0.3496495, 0.2959551, -0.6006749, -0.2419119, -0.06879545, -0.7403072, 0.6110353, -0.04555973, 0.8059174, -0.5275017, -0.737129); + this._distributions[6] = new Array(0.06941478, 0.8519508, -0.7441907, 0.2426432, 0.6439992, -0.2405252, -0.1007523, -0.2327587, -0.6427067, -0.7248485, 0.8050759, 0.5492936, 0.3573822, -0.8824506); + this._distributions[7] = new Array(0.8509863, 0.4452587, -0.09507271, 0.2073005, 0.1706571, -0.6434793, 0.8029777, -0.2718274, -0.4401725, 0.8196304, 0.2715359, 0.8598521, -0.8121575, -0.006447683, -0.6486837, -0.7237598); + this._distributions[8] = new Array(0.6951686, -0.2680728, -0.04933243, 0.3710589, 0.6592212, 0.3661054, -0.01579228, -0.6909603, -0.3275101, -0.1756866, 0.3811549, 0.9218544, -0.216032, 0.9755028, -0.7065172, 0.3355389, -0.6579109, -0.6798355); + this._distributions[9] = new Array(0.6181276, -0.09790418, -0.2537868, -0.5570995, -0.1964931, 0.3459414, 0.3474613, -0.8885581, 0.5135743, 0.5753114, -0.9549091, 0.1480672, -0.8711916, -0.4293123, -0.6928071, 0.6190156, -0.13369, 0.8892705, 0.0548224, -0.1246777); + this._distributions[10] = new Array(0.4853027, -0.5080479, -0.1331675, -0.506597, 0.139575, 0.01316885, 0.803486, -0.07568797, 0.5240274, 0.4883182, -0.4334005, 0.1207938, -0.7794577, -0.3985141, 0.1576432, -0.9861221, -0.3712867, 0.6959021, 0.1517378, 0.9847429, -0.9762396, 0.1661073); + this._distributions[11] = new Array(-0.2790166, -0.01252619, 0.3389016, 0.3921154, 0.2408341, -0.313211, -0.8151779, -0.3898362, -0.6347761, 0.3486495, 0.09471484, -0.7722448, -0.1385674, 0.6364574, 0.2456331, 0.9295807, -0.3864306, -0.8247881, 0.6111673, -0.7164014, 0.8287669, 0.05466961, 0.837706, 0.5415626); + this._distributions[12] = new Array(0.056417, 0.3185693, -0.8245888, 0.1882799, 0.8575996, 0.1136829, 0.1070375, 0.875332, 0.4076743, -0.06000621, -0.4311306, 0.7239349, 0.2677574, -0.538472, -0.08486642, -0.2083647, -0.888989, -0.3906443, -0.4768958, -0.6664082, 0.09334993, -0.9861541, 0.808736, -0.455949, 0.5889823, 0.7660807); + this._distributions[13] = new Array(-0.2681346, -0.3955857, -0.1315102, -0.8852947, -0.5143692, 0.09551838, 0.4344836, -0.546945, -0.8620899, -0.3813288, 0.1650431, 0.02034803, -0.1543657, 0.3842218, -0.828457, 0.5376903, -0.6145, -0.7818927, -0.2639062, 0.8784655, 0.1912684, 0.9720125, 0.3135219, 0.5224229, 0.7850655, 0.4592297, 0.7465045, -0.1368916); + this._distributions[14] = new Array(0.4241029, 0.695281, 0.150511, -0.02304107, -0.2482675, 0.9120338, 0.8057325, 0.2622084, -0.2445909, 0.2765962, 0.8588713, -0.1772072, 0.3117845, -0.4385471, -0.3923851, -0.3298936, -0.1751254, -0.7405846, 0.6926506, -0.684163, -0.9304563, -0.3254691, -0.8533293, 0.1523024, 0.2510415, -0.917345, -0.6239773, -0.7105472, -0.6104624, 0.6041355); + this._distributions[15] = new Array(0.5844554, 0.06651045, 0.1343258, 0.6756578, 0.3799674, -0.6301104, 0.5590436, 0.7940555, 0.09574714, 0.02262517, 0.8697868, 0.393301, 0.003945862, -0.421735, 0.9043913, -0.2432393, -0.4844007, 0.7190998, -0.3201078, 0.2972371, -0.3852352, -0.6341155, -0.5413069, -0.09223081, -0.8468984, -0.5126905, 0.004156174, -0.8633173, -0.9681889, -0.03305046, -0.846509, 0.4414353); + this._distributions[16] = new Array(0.4506488, 0.657668, 0.4621297, 0.07441051, -0.2782125, 0.6201044, 0.9750003, 0.09110117, 0.1019436, 0.2986514, 0.03457398, 0.9631706, 0.542098, -0.5505635, 0.8675668, 0.4938077, -0.5414361, 0.2655292, -0.7941836, 0.6003053, -0.09847672, -0.1001604, -0.9316511, -0.08572888, 0.07286467, -0.611899, -0.5232627, -0.4082253, -0.5481608, -0.827938, -0.1551939, -0.9621193, 0.9220031, -0.3315949); + this._distributions[17] = new Array(0.197908, -0.4697656, -0.4474689, -0.3428435, 0.8529873, -0.2228634, 0.6022478, -0.5469642, 0.2545276, -0.931133, -0.1507547, -0.7855865, -0.07606658, 0.1011628, 0.3046715, 0.2785755, 0.4698432, -0.1064076, 0.6831254, 0.4152522, 0.1374381, 0.8363233, -0.2166121, 0.6682042, 0.5511393, 0.7996449, -0.4278994, 0.28836, -0.8875198, 0.2181732, -0.8772842, -0.2818254, -0.7000262, 0.5762185, -0.6062385, -0.7439126); + this._distributions[18] = new Array(0.6645703, -0.05678739, 0.5720971, 0.4533803, -0.07660709, 0.08802763, 0.5163431, -0.4426552, 0.1163455, -0.3404382, -0.4004807, -0.5046007, 0.2932099, -0.8201418, -0.5322125, 0.03834766, -0.1490209, -0.8817304, -0.8000439, -0.3509448, 0.5260983, 0.8421043, 0.1197811, 0.6963812, 0.9498612, 0.3122156, -0.9285746, 0.02120355, -0.6670724, 0.7217396, 0.9155889, -0.3510147, -0.271941, 0.4727852, 0.318879, 0.1634057, -0.2686755, 0.9253026); + this._distributions[19] = new Array(0.5064292, 0.422527, 0.8935515, -0.06610427, 0.1199719, 0.175568, 0.403388, -0.2003276, 0.1657927, 0.8154403, 0.9301245, 0.2929218, -0.1644068, 0.6201534, 0.7113559, -0.6589743, -0.3364046, -0.1799502, 0.02109996, -0.392765, -0.382213, 0.3219992, -0.9201946, 0.1207967, -0.726185, 0.4291916, -0.7443482, -0.2480059, -0.5147594, 0.7418784, 0.1935272, -0.7406143, -0.3643523, -0.5559214, -0.7147766, -0.6326278, -0.2524151, -0.9096627, 0.5161405, 0.7908453); + this._distributions[20] = new Array(0.7921003, -0.3032096, 0.5992879, -0.009052323, 0.2538549, -0.1872749, 0.7053444, 0.3677175, 0.5417761, -0.8170255, 0.9749611, 0.1210478, 0.1969143, -0.6117041, -0.1824499, -0.4634196, -0.1181338, -0.8668742, -0.3050112, -0.1352596, -0.4409327, -0.7082354, -0.03225285, 0.1171548, 0.3113096, 0.3250439, -0.8166144, -0.463995, -0.01014475, 0.4715334, -0.6868284, 0.05091889, -0.4011163, 0.2717285, -0.06756835, 0.8307694, -0.7938535, 0.4352129, -0.4663842, 0.7165329, 0.559729, 0.8093995); + this._distributions[21] = new Array(0.07832243, 0.426151, -0.3856795, 0.5799953, 0.01970797, 0.06706189, 0.4822682, 0.3014512, -0.1532982, 0.87485, -0.4959527, 0.07888043, 0.260601, -0.2304784, 0.4996209, 0.7167382, 0.585986, -0.04265174, -0.7679967, 0.5509416, -0.9041753, 0.1802134, -0.8407655, -0.4442826, -0.2058258, -0.2636995, -0.4984115, -0.5928579, 0.2926032, -0.7886473, -0.06933882, -0.621177, 0.578115, -0.4813387, 0.8981777, -0.3291056, 0.1942733, 0.9255584, 0.8084362, 0.5066984, 0.9920095, 0.03103104, -0.2403206, -0.9389018); + this._distributions[22] = new Array(-0.5691095, 0.1014316, -0.7788262, 0.384012, -0.8253665, -0.1645582, -0.1830993, 0.002997211, -0.2555013, -0.4177977, -0.6640869, -0.4794711, -0.2351242, 0.5850121, 0.02436554, 0.2825883, 0.006061143, -0.8200245, 0.1618791, -0.3063331, -0.3765897, -0.7249815, 0.6092919, -0.6769328, -0.5956934, 0.6957655, 0.5383642, 0.4522677, -0.1489165, 0.9125596, 0.4167473, 0.1335986, 0.1898309, 0.5874342, 0.2288171, 0.9624356, 0.7540846, -0.07672304, 0.8986252, 0.2788797, 0.3555991, -0.9262139, 0.8454325, -0.4027667, 0.4945236, -0.2935512); + this._distributions[23] = new Array(-0.4481403, -0.3758374, -0.8877251, 0.08739938, 0.05015831, -0.1339983, -0.4070427, -0.8534173, 0.1019274, -0.5503222, -0.445998, 0.1997541, -0.8686263, -0.2788867, -0.7695944, -0.6033704, -0.05515742, -0.885711, -0.7714347, 0.5790485, 0.3466263, -0.8799297, 0.4487582, -0.5321087, -0.2461368, 0.6053771, -0.05568117, 0.2457351, -0.4668669, 0.8523816, 0.8103387, -0.4255538, 0.4054182, -0.175663, -0.2802011, -0.08920153, 0.2665959, 0.382935, 0.555679, 0.1621837, 0.105246, 0.8420411, 0.6921161, 0.6902903, 0.880946, 0.2483067, 0.9699264, -0.1021767); + this._distributions[24] = new Array(-0.1703323, -0.3119385, 0.2916039, -0.2988263, -0.008472982, -0.9277695, -0.7730271, -0.3277904, 0.3440474, -0.6815342, -0.2910278, 0.03461745, -0.6764899, -0.657078, -0.3505501, -0.7311988, -0.03478927, 0.3258755, -0.6048835, 0.159423, 0.2035525, 0.02212214, 0.5116573, 0.2226856, 0.6664805, -0.2500189, 0.7147882, -0.6609634, 0.03030632, -0.5763278, -0.2516585, 0.6116219, -0.9434413, -0.0116792, 0.9061816, 0.2491155, 0.182867, 0.6076167, 0.286593, 0.9485695, -0.5992439, 0.6970096, -0.2082874, 0.9416641, 0.9880044, -0.1541709, -0.9122881, 0.331555, 0.7324886, 0.6725098); + this._distributions[25] = new Array(0.3869598, -0.04974834, 0.7168844, -0.0693711, -0.07166742, 0.1725325, 0.4599592, 0.3232779, 0.5872094, -0.4198674, 0.2442266, -0.625667, 0.1254557, 0.4500048, -0.2290154, -0.1803567, 0.890583, 0.3373493, 0.1256081, 0.7853789, -0.2676466, 0.5305805, -0.7063224, 0.252168, -0.3989835, 0.1189921, 0.09617215, -0.2451447, 0.6302541, 0.6085876, 0.9380925, -0.3234899, 0.5086241, -0.8573482, 0.03576187, -0.9876697, -0.0876712, -0.6365195, -0.5276513, 0.823456, -0.6935764, -0.2240411, -0.5212318, -0.5383121, -0.2116208, 0.9639363, -0.9840096, 0.02743555, -0.3991577, -0.8994547, -0.7830126, 0.614068); + this._distributions[26] = new Array(-0.8366601, 0.4464895, -0.5917366, -0.02073906, -0.9845258, 0.1635625, -0.3097973, 0.4379579, -0.5478154, 0.7173221, -0.1685888, 0.9261969, 0.01503595, 0.6046097, 0.4452421, 0.5449086, 0.0315687, 0.1944619, 0.3753404, 0.8688548, 0.4143643, 0.1396648, 0.8711032, 0.4304703, 0.7328773, 0.1461501, 0.6374492, -0.3521495, 0.145613, -0.1341466, 0.9040975, -0.135123, -0.7839059, -0.5450199, -0.516019, -0.3320859, -0.206158, -0.4431106, -0.9703014, -0.2368356, -0.2473119, -0.0864351, 0.2130725, -0.4604077, -0.003726701, -0.7122303, -0.4072131, -0.6833169, 0.1632999, -0.9776646, 0.4686888, -0.680495, -0.2293511, -0.9509777); + this._distributions[27] = new Array(0.107311, -0.1311369, -0.4194764, -0.3148777, 0.6171439, -0.2745973, 0.2796618, 0.1937153, -0.09106886, 0.4180236, 0.6044006, 0.05577846, 0.02927299, -0.6738263, -0.2580845, 0.1179939, -0.09023564, -0.3830024, 0.3570953, -0.5000587, 0.81591, -0.5518309, 0.9300217, -0.1257987, 0.4904627, -0.8381903, -0.3163182, -0.8632009, 0.1137595, -0.9875998, 0.8390043, 0.3538185, 0.2149114, 0.4993694, 0.5191584, 0.3833552, 0.5002763, 0.7061465, -0.2567276, 0.9068756, -0.5197366, 0.3467845, 0.03668867, 0.9734009, -0.5347553, 0.66747, -0.9028882, 0.1023768, -0.8967977, 0.412834, -0.5821944, 0.0426479, -0.8032165, -0.2397038, -0.5597343, -0.6358021); + this._distributions[28] = new Array(-0.6562496, -0.1781036, -0.9301494, 0.1185208, -0.3861143, -0.4153562, -0.1560799, -0.1099607, -0.5587025, 0.395218, -0.5322112, -0.699701, -0.5008639, 0.08726846, -0.970524, -0.1963461, -0.813577, -0.5185111, -0.1644458, 0.298, -0.3216791, 0.639982, 0.3315373, 0.3339162, 0.2383235, -0.00105722, 0.1137828, 0.5450742, -0.01899921, 0.8798413, 0.2849685, 0.8255596, 0.6974412, 0.2123175, 0.7588523, 0.5470437, 0.5102502, -0.1687844, 0.5853448, 0.8033476, 0.2590716, -0.5262504, 0.5607718, -0.6342825, 0.8666443, -0.1491841, 0.8341052, -0.4935003, -0.1568441, -0.6634066, 0.2512113, -0.8769391, -0.2559827, -0.9572457, -0.01928852, -0.3966542, -0.750667, 0.6409678); + this._distributions[29] = new Array(0.3454786, -0.04837726, 0.2649553, 0.2406852, 0.5599093, -0.3839145, -0.1111814, -0.05502108, 0.7586042, -0.05818377, 0.2519488, -0.4665135, -0.1264972, 0.2602723, -0.08766216, -0.3671907, 0.6428129, 0.3999204, -0.6105871, -0.1246869, -0.4589451, -0.7646643, -0.03021116, -0.7899352, -0.6036922, -0.4293956, -0.2481938, 0.6534185, 0.102798, 0.6784465, -0.6392644, 0.4821358, -0.6789002, 0.1779133, -0.9140783, -0.1989647, -0.9262617, 0.3381507, 0.4794891, -0.8093274, 0.3959447, 0.668478, 0.9602883, 0.2272305, -0.123672, 0.9210883, 0.2375148, 0.9523395, -0.52898, 0.7973378, -0.382433, 0.1228794, 0.695015, 0.6948439, 0.7530277, -0.6458191, 0.8777987, -0.3272956, 0.2318525, -0.962768); + this._distributions[30] = new Array(0.4518921, -0.1146195, 0.4720805, -0.4238748, 0.3655423, 0.1806341, 0.1589939, -0.23568, 0.7673324, -0.5149941, 0.01163658, 0.09045836, 0.7010971, 0.1245747, 0.7518286, -0.1855433, 0.4960719, 0.4601022, 0.2566979, -0.6308268, -0.0654714, -0.5126389, -0.1823319, -0.1343282, -0.1464312, 0.4883236, -0.3858738, 0.203523, 0.1484799, 0.4432284, -0.477109, -0.116241, 0.2719092, 0.7208626, 0.9104174, 0.3578536, -0.5956199, 0.7662588, -0.6996251, 0.3678654, -0.2514512, 0.9251933, 0.1275825, -0.9478135, -0.204608, -0.8611552, 0.4264838, -0.877443, 0.9854161, 0.05521112, 0.5912951, 0.7997434, 0.1140349, 0.982093, -0.9324368, -0.2094094, -0.42436, -0.6441524, -0.6722705, -0.3554261, -0.7844236, 0.08587621); + this._distributions[31] = new Array(-0.4206714, -0.5613642, -0.8733016, -0.3373051, -0.1046226, -0.2902999, -0.1318562, -0.8434365, 0.1145093, -0.5962623, -0.4965627, -0.1873259, -0.5011808, -0.8546229, -0.7165636, -0.5743566, 0.1090901, 0.2017643, 0.3404809, -0.220455, -0.1989015, 0.2372122, -0.4538706, 0.0979171, 0.4514146, -0.572846, 0.2314168, -0.8514503, -0.4247236, 0.5650803, -0.943347, 0.04514639, -0.1309718, 0.5221877, -0.7004157, 0.4561877, 0.6306441, 0.04448673, 0.4301621, 0.5766876, 0.1078042, 0.7245752, 0.3875354, 0.2794483, 0.702876, -0.2924213, 0.7360667, -0.6210318, 0.7486517, 0.6531103, 0.4898235, 0.8591025, 0.6549174, 0.3854057, -0.2596106, 0.7916998, 0.9251194, -0.05296265, -0.5620695, 0.820877, -0.01228026, 0.9937211, 0.9612103, 0.2628758); + }; + + PoissonLookup.getDistribution = function (n /*int*/ ) { + if (!this._distributions) + this.initDistributions(); + + if (n < 2 || n > 32) + return null; + + return this._distributions[n - 1]; + }; + return PoissonLookup; +})(); + +module.exports = PoissonLookup; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9Qb2lzc29uTG9va3VwLnRzIl0sIm5hbWVzIjpbIlBvaXNzb25Mb29rdXAiLCJQb2lzc29uTG9va3VwLmNvbnN0cnVjdG9yIiwiUG9pc3Nvbkxvb2t1cC5pbml0RGlzdHJpYnV0aW9ucyIsIlBvaXNzb25Mb29rdXAuZ2V0RGlzdHJpYnV0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQTtJQUFBQTtJQW9EQUMsQ0FBQ0E7QUFBQUQsSUFoREFBLGtDQUFBQTtRQUVDRSxpQ0FBaUNBO1FBQ2pDQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFnQkEsQ0FBQ0E7UUFDaERBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFNBQVNBLEVBQUVBLFNBQVNBLENBQUNBO1FBQ2hFQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUN4RkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsU0FBU0EsRUFBRUEsWUFBWUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsQ0FBQ0E7UUFDbEhBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLENBQUNBO1FBQ3RJQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxDQUFDQTtRQUM5SkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7UUFDdExBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLENBQUNBO1FBQzVNQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUNyT0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7UUFDM1BBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLE9BQU9BLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLENBQUNBO1FBQ2hSQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxRQUFRQSxFQUFFQSxVQUFVQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxDQUFDQTtRQUN0U0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsVUFBVUEsRUFBRUEsUUFBUUEsRUFBRUEsU0FBU0EsQ0FBQ0E7UUFDL1RBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLENBQUNBO1FBQ2xWQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUMxV0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsUUFBUUEsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsQ0FBQ0E7UUFDbllBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLFdBQVdBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFdBQVdBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLFNBQVNBLENBQUNBO1FBQ2hhQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxVQUFVQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUNuYkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsT0FBT0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7UUFDdGNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLENBQUNBO1FBQ2plQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxDQUFDQTtRQUNuZkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsV0FBV0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsU0FBU0EsQ0FBQ0E7UUFDbmhCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxVQUFVQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxPQUFPQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUNuaUJBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFdBQVdBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFdBQVdBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLENBQUNBO1FBQy9qQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsVUFBVUEsRUFBRUEsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7UUFDbGxCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxDQUFDQTtRQUMzbUJBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLENBQUNBO1FBQ2pvQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7UUFDenBCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxPQUFPQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxPQUFPQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUM1cUJBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLEtBQUtBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLFNBQVNBLENBQUNBO1FBQ25zQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsT0FBT0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7UUFDMXRCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxPQUFPQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxDQUFDQSxRQUFRQSxFQUFFQSxTQUFTQSxFQUFFQSxVQUFVQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxFQUFFQSxRQUFRQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxTQUFTQSxFQUFFQSxVQUFVQSxDQUFDQTtRQUMzdUJBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFFBQVFBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLEVBQUVBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLEVBQUVBLFNBQVNBLENBQUNBO0lBQ3p3QkEsQ0FBQ0E7O0lBRURGLGdDQUFBQSxVQUE4QkEsQ0FBUUEsQ0FBQ0EsT0FBT0E7UUFFN0NHLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBO1lBQ3ZCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBLENBQUNBOztRQUUxQkEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUE7WUFDbEJBLE9BQU9BLElBQUlBLENBQUNBOztRQUViQSxPQUFPQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtJQUNsQ0EsQ0FBQ0E7SUFDRkgscUJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsOEJBQXVCLENBQUEiLCJmaWxlIjoiY29yZS9nZW9tL1BvaXNzb25Mb29rdXAuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBQb2lzc29uTG9va3VwXG57XG5cdHB1YmxpYyBzdGF0aWMgX2Rpc3RyaWJ1dGlvbnM6QXJyYXk8QXJyYXk8bnVtYmVyPj47XG5cblx0cHVibGljIHN0YXRpYyBpbml0RGlzdHJpYnV0aW9ucygpOnZvaWRcblx0e1xuXHRcdC8vIHByZWNhbGN1bGF0ZWQgZm9yIGJlc3QgY29udHJvbFxuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnMgPSBuZXcgQXJyYXk8QXJyYXk8bnVtYmVyPj4oKTtcblx0XHR0aGlzLl9kaXN0cmlidXRpb25zWzBdID0gbmV3IEFycmF5PG51bWJlcj4oMC4zMDgyODQxLCAwLjQzMjA5MTkpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMV0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjMwODI4NDEsIDAuNDMyMDkxOSwgLTAuMjI3NDk0MiwgLTAuNjY0MDI2Nik7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1syXSA9IG5ldyBBcnJheTxudW1iZXI+KDAuODc0MjY4OSwgMC4wMDA5MjY1Njg2LCAtMC42ODY0MTE2LCAtMC41NTM2NjA3LCAtMC4yMzI1MjA2LCAwLjc2NzgzNzEpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbM10gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjM5MTM0NDYsIC0wLjcwODQ0MTcsIC0wLjc1MTExMDEsIC0wLjU5MzU5MjksIC0wLjIzMjM0MzYsIDAuNTMyMDA5MSwgMC44NDM1MzE1LCAwLjUwMzU5MTEpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbNF0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjIxMjI0NzEsIC0wLjU3NzEzOTUsIC0wLjg1NDM1MDYsIC0wLjE3NjM1MzQsIDAuNTE4OTAyMSwgMC44MzIzNjk4LCAtMC4zNjE2OTA4LCAwLjU4NjUzNjgsIDAuOTUyMzAwNCwgLTAuMDQ5NDg0MzcpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbNV0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjU3OTEwMzUsIDAuMzQ5NjQ5NSwgMC4yOTU5NTUxLCAtMC42MDA2NzQ5LCAtMC4yNDE5MTE5LCAtMC4wNjg3OTU0NSwgLTAuNzQwMzA3MiwgMC42MTEwMzUzLCAtMC4wNDU1NTk3MywgMC44MDU5MTc0LCAtMC41Mjc1MDE3LCAtMC43MzcxMjkpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbNl0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjA2OTQxNDc4LCAwLjg1MTk1MDgsIC0wLjc0NDE5MDcsIDAuMjQyNjQzMiwgMC42NDM5OTkyLCAtMC4yNDA1MjUyLCAtMC4xMDA3NTIzLCAtMC4yMzI3NTg3LCAtMC42NDI3MDY3LCAtMC43MjQ4NDg1LCAwLjgwNTA3NTksIDAuNTQ5MjkzNiwgMC4zNTczODIyLCAtMC44ODI0NTA2KTtcblx0XHR0aGlzLl9kaXN0cmlidXRpb25zWzddID0gbmV3IEFycmF5PG51bWJlcj4oMC44NTA5ODYzLCAwLjQ0NTI1ODcsIC0wLjA5NTA3MjcxLCAwLjIwNzMwMDUsIDAuMTcwNjU3MSwgLTAuNjQzNDc5MywgMC44MDI5Nzc3LCAtMC4yNzE4Mjc0LCAtMC40NDAxNzI1LCAwLjgxOTYzMDQsIDAuMjcxNTM1OSwgMC44NTk4NTIxLCAtMC44MTIxNTc1LCAtMC4wMDY0NDc2ODMsIC0wLjY0ODY4MzcsIC0wLjcyMzc1OTgpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbOF0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjY5NTE2ODYsIC0wLjI2ODA3MjgsIC0wLjA0OTMzMjQzLCAwLjM3MTA1ODksIDAuNjU5MjIxMiwgMC4zNjYxMDU0LCAtMC4wMTU3OTIyOCwgLTAuNjkwOTYwMywgLTAuMzI3NTEwMSwgLTAuMTc1Njg2NiwgMC4zODExNTQ5LCAwLjkyMTg1NDQsIC0wLjIxNjAzMiwgMC45NzU1MDI4LCAtMC43MDY1MTcyLCAwLjMzNTUzODksIC0wLjY1NzkxMDksIC0wLjY3OTgzNTUpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbOV0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjYxODEyNzYsIC0wLjA5NzkwNDE4LCAtMC4yNTM3ODY4LCAtMC41NTcwOTk1LCAtMC4xOTY0OTMxLCAwLjM0NTk0MTQsIDAuMzQ3NDYxMywgLTAuODg4NTU4MSwgMC41MTM1NzQzLCAwLjU3NTMxMTQsIC0wLjk1NDkwOTEsIDAuMTQ4MDY3MiwgLTAuODcxMTkxNiwgLTAuNDI5MzEyMywgLTAuNjkyODA3MSwgMC42MTkwMTU2LCAtMC4xMzM2OSwgMC44ODkyNzA1LCAwLjA1NDgyMjQsIC0wLjEyNDY3NzcpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMTBdID0gbmV3IEFycmF5PG51bWJlcj4oMC40ODUzMDI3LCAtMC41MDgwNDc5LCAtMC4xMzMxNjc1LCAtMC41MDY1OTcsIDAuMTM5NTc1LCAwLjAxMzE2ODg1LCAwLjgwMzQ4NiwgLTAuMDc1Njg3OTcsIDAuNTI0MDI3NCwgMC40ODgzMTgyLCAtMC40MzM0MDA1LCAwLjEyMDc5MzgsIC0wLjc3OTQ1NzcsIC0wLjM5ODUxNDEsIDAuMTU3NjQzMiwgLTAuOTg2MTIyMSwgLTAuMzcxMjg2NywgMC42OTU5MDIxLCAwLjE1MTczNzgsIDAuOTg0NzQyOSwgLTAuOTc2MjM5NiwgMC4xNjYxMDczKTtcblx0XHR0aGlzLl9kaXN0cmlidXRpb25zWzExXSA9IG5ldyBBcnJheTxudW1iZXI+KC0wLjI3OTAxNjYsIC0wLjAxMjUyNjE5LCAwLjMzODkwMTYsIDAuMzkyMTE1NCwgMC4yNDA4MzQxLCAtMC4zMTMyMTEsIC0wLjgxNTE3NzksIC0wLjM4OTgzNjIsIC0wLjYzNDc3NjEsIDAuMzQ4NjQ5NSwgMC4wOTQ3MTQ4NCwgLTAuNzcyMjQ0OCwgLTAuMTM4NTY3NCwgMC42MzY0NTc0LCAwLjI0NTYzMzEsIDAuOTI5NTgwNywgLTAuMzg2NDMwNiwgLTAuODI0Nzg4MSwgMC42MTExNjczLCAtMC43MTY0MDE0LCAwLjgyODc2NjksIDAuMDU0NjY5NjEsIDAuODM3NzA2LCAwLjU0MTU2MjYpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMTJdID0gbmV3IEFycmF5PG51bWJlcj4oMC4wNTY0MTcsIDAuMzE4NTY5MywgLTAuODI0NTg4OCwgMC4xODgyNzk5LCAwLjg1NzU5OTYsIDAuMTEzNjgyOSwgMC4xMDcwMzc1LCAwLjg3NTMzMiwgMC40MDc2NzQzLCAtMC4wNjAwMDYyMSwgLTAuNDMxMTMwNiwgMC43MjM5MzQ5LCAwLjI2Nzc1NzQsIC0wLjUzODQ3MiwgLTAuMDg0ODY2NDIsIC0wLjIwODM2NDcsIC0wLjg4ODk4OSwgLTAuMzkwNjQ0MywgLTAuNDc2ODk1OCwgLTAuNjY2NDA4MiwgMC4wOTMzNDk5MywgLTAuOTg2MTU0MSwgMC44MDg3MzYsIC0wLjQ1NTk0OSwgMC41ODg5ODIzLCAwLjc2NjA4MDcpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMTNdID0gbmV3IEFycmF5PG51bWJlcj4oLTAuMjY4MTM0NiwgLTAuMzk1NTg1NywgLTAuMTMxNTEwMiwgLTAuODg1Mjk0NywgLTAuNTE0MzY5MiwgMC4wOTU1MTgzOCwgMC40MzQ0ODM2LCAtMC41NDY5NDUsIC0wLjg2MjA4OTksIC0wLjM4MTMyODgsIDAuMTY1MDQzMSwgMC4wMjAzNDgwMywgLTAuMTU0MzY1NywgMC4zODQyMjE4LCAtMC44Mjg0NTcsIDAuNTM3NjkwMywgLTAuNjE0NSwgLTAuNzgxODkyNywgLTAuMjYzOTA2MiwgMC44Nzg0NjU1LCAwLjE5MTI2ODQsIDAuOTcyMDEyNSwgMC4zMTM1MjE5LCAwLjUyMjQyMjksIDAuNzg1MDY1NSwgMC40NTkyMjk3LCAwLjc0NjUwNDUsIC0wLjEzNjg5MTYpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMTRdID0gbmV3IEFycmF5PG51bWJlcj4oMC40MjQxMDI5LCAwLjY5NTI4MSwgMC4xNTA1MTEsIC0wLjAyMzA0MTA3LCAtMC4yNDgyNjc1LCAwLjkxMjAzMzgsIDAuODA1NzMyNSwgMC4yNjIyMDg0LCAtMC4yNDQ1OTA5LCAwLjI3NjU5NjIsIDAuODU4ODcxMywgLTAuMTc3MjA3MiwgMC4zMTE3ODQ1LCAtMC40Mzg1NDcxLCAtMC4zOTIzODUxLCAtMC4zMjk4OTM2LCAtMC4xNzUxMjU0LCAtMC43NDA1ODQ2LCAwLjY5MjY1MDYsIC0wLjY4NDE2MywgLTAuOTMwNDU2MywgLTAuMzI1NDY5MSwgLTAuODUzMzI5MywgMC4xNTIzMDI0LCAwLjI1MTA0MTUsIC0wLjkxNzM0NSwgLTAuNjIzOTc3MywgLTAuNzEwNTQ3MiwgLTAuNjEwNDYyNCwgMC42MDQxMzU1KTtcblx0XHR0aGlzLl9kaXN0cmlidXRpb25zWzE1XSA9IG5ldyBBcnJheTxudW1iZXI+KDAuNTg0NDU1NCwgMC4wNjY1MTA0NSwgMC4xMzQzMjU4LCAwLjY3NTY1NzgsIDAuMzc5OTY3NCwgLTAuNjMwMTEwNCwgMC41NTkwNDM2LCAwLjc5NDA1NTUsIDAuMDk1NzQ3MTQsIDAuMDIyNjI1MTcsIDAuODY5Nzg2OCwgMC4zOTMzMDEsIDAuMDAzOTQ1ODYyLCAtMC40MjE3MzUsIDAuOTA0MzkxMywgLTAuMjQzMjM5MywgLTAuNDg0NDAwNywgMC43MTkwOTk4LCAtMC4zMjAxMDc4LCAwLjI5NzIzNzEsIC0wLjM4NTIzNTIsIC0wLjYzNDExNTUsIC0wLjU0MTMwNjksIC0wLjA5MjIzMDgxLCAtMC44NDY4OTg0LCAtMC41MTI2OTA1LCAwLjAwNDE1NjE3NCwgLTAuODYzMzE3MywgLTAuOTY4MTg4OSwgLTAuMDMzMDUwNDYsIC0wLjg0NjUwOSwgMC40NDE0MzUzKTtcblx0XHR0aGlzLl9kaXN0cmlidXRpb25zWzE2XSA9IG5ldyBBcnJheTxudW1iZXI+KDAuNDUwNjQ4OCwgMC42NTc2NjgsIDAuNDYyMTI5NywgMC4wNzQ0MTA1MSwgLTAuMjc4MjEyNSwgMC42MjAxMDQ0LCAwLjk3NTAwMDMsIDAuMDkxMTAxMTcsIDAuMTAxOTQzNiwgMC4yOTg2NTE0LCAwLjAzNDU3Mzk4LCAwLjk2MzE3MDYsIDAuNTQyMDk4LCAtMC41NTA1NjM1LCAwLjg2NzU2NjgsIDAuNDkzODA3NywgLTAuNTQxNDM2MSwgMC4yNjU1MjkyLCAtMC43OTQxODM2LCAwLjYwMDMwNTMsIC0wLjA5ODQ3NjcyLCAtMC4xMDAxNjA0LCAtMC45MzE2NTExLCAtMC4wODU3Mjg4OCwgMC4wNzI4NjQ2NywgLTAuNjExODk5LCAtMC41MjMyNjI3LCAtMC40MDgyMjUzLCAtMC41NDgxNjA4LCAtMC44Mjc5MzgsIC0wLjE1NTE5MzksIC0wLjk2MjExOTMsIDAuOTIyMDAzMSwgLTAuMzMxNTk0OSk7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1sxN10gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjE5NzkwOCwgLTAuNDY5NzY1NiwgLTAuNDQ3NDY4OSwgLTAuMzQyODQzNSwgMC44NTI5ODczLCAtMC4yMjI4NjM0LCAwLjYwMjI0NzgsIC0wLjU0Njk2NDIsIDAuMjU0NTI3NiwgLTAuOTMxMTMzLCAtMC4xNTA3NTQ3LCAtMC43ODU1ODY1LCAtMC4wNzYwNjY1OCwgMC4xMDExNjI4LCAwLjMwNDY3MTUsIDAuMjc4NTc1NSwgMC40Njk4NDMyLCAtMC4xMDY0MDc2LCAwLjY4MzEyNTQsIDAuNDE1MjUyMiwgMC4xMzc0MzgxLCAwLjgzNjMyMzMsIC0wLjIxNjYxMjEsIDAuNjY4MjA0MiwgMC41NTExMzkzLCAwLjc5OTY0NDksIC0wLjQyNzg5OTQsIDAuMjg4MzYsIC0wLjg4NzUxOTgsIDAuMjE4MTczMiwgLTAuODc3Mjg0MiwgLTAuMjgxODI1NCwgLTAuNzAwMDI2MiwgMC41NzYyMTg1LCAtMC42MDYyMzg1LCAtMC43NDM5MTI2KTtcblx0XHR0aGlzLl9kaXN0cmlidXRpb25zWzE4XSA9IG5ldyBBcnJheTxudW1iZXI+KDAuNjY0NTcwMywgLTAuMDU2Nzg3MzksIDAuNTcyMDk3MSwgMC40NTMzODAzLCAtMC4wNzY2MDcwOSwgMC4wODgwMjc2MywgMC41MTYzNDMxLCAtMC40NDI2NTUyLCAwLjExNjM0NTUsIC0wLjM0MDQzODIsIC0wLjQwMDQ4MDcsIC0wLjUwNDYwMDcsIDAuMjkzMjA5OSwgLTAuODIwMTQxOCwgLTAuNTMyMjEyNSwgMC4wMzgzNDc2NiwgLTAuMTQ5MDIwOSwgLTAuODgxNzMwNCwgLTAuODAwMDQzOSwgLTAuMzUwOTQ0OCwgMC41MjYwOTgzLCAwLjg0MjEwNDMsIDAuMTE5NzgxMSwgMC42OTYzODEyLCAwLjk0OTg2MTIsIDAuMzEyMjE1NiwgLTAuOTI4NTc0NiwgMC4wMjEyMDM1NSwgLTAuNjY3MDcyNCwgMC43MjE3Mzk2LCAwLjkxNTU4ODksIC0wLjM1MTAxNDcsIC0wLjI3MTk0MSwgMC40NzI3ODUyLCAwLjMxODg3OSwgMC4xNjM0MDU3LCAtMC4yNjg2NzU1LCAwLjkyNTMwMjYpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMTldID0gbmV3IEFycmF5PG51bWJlcj4oMC41MDY0MjkyLCAwLjQyMjUyNywgMC44OTM1NTE1LCAtMC4wNjYxMDQyNywgMC4xMTk5NzE5LCAwLjE3NTU2OCwgMC40MDMzODgsIC0wLjIwMDMyNzYsIDAuMTY1NzkyNywgMC44MTU0NDAzLCAwLjkzMDEyNDUsIDAuMjkyOTIxOCwgLTAuMTY0NDA2OCwgMC42MjAxNTM0LCAwLjcxMTM1NTksIC0wLjY1ODk3NDMsIC0wLjMzNjQwNDYsIC0wLjE3OTk1MDIsIDAuMDIxMDk5OTYsIC0wLjM5Mjc2NSwgLTAuMzgyMjEzLCAwLjMyMTk5OTIsIC0wLjkyMDE5NDYsIDAuMTIwNzk2NywgLTAuNzI2MTg1LCAwLjQyOTE5MTYsIC0wLjc0NDM0ODIsIC0wLjI0ODAwNTksIC0wLjUxNDc1OTQsIDAuNzQxODc4NCwgMC4xOTM1MjcyLCAtMC43NDA2MTQzLCAtMC4zNjQzNTIzLCAtMC41NTU5MjE0LCAtMC43MTQ3NzY2LCAtMC42MzI2Mjc4LCAtMC4yNTI0MTUxLCAtMC45MDk2NjI3LCAwLjUxNjE0MDUsIDAuNzkwODQ1Myk7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1syMF0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjc5MjEwMDMsIC0wLjMwMzIwOTYsIDAuNTk5Mjg3OSwgLTAuMDA5MDUyMzIzLCAwLjI1Mzg1NDksIC0wLjE4NzI3NDksIDAuNzA1MzQ0NCwgMC4zNjc3MTc1LCAwLjU0MTc3NjEsIC0wLjgxNzAyNTUsIDAuOTc0OTYxMSwgMC4xMjEwNDc4LCAwLjE5NjkxNDMsIC0wLjYxMTcwNDEsIC0wLjE4MjQ0OTksIC0wLjQ2MzQxOTYsIC0wLjExODEzMzgsIC0wLjg2Njg3NDIsIC0wLjMwNTAxMTIsIC0wLjEzNTI1OTYsIC0wLjQ0MDkzMjcsIC0wLjcwODIzNTQsIC0wLjAzMjI1Mjg1LCAwLjExNzE1NDgsIDAuMzExMzA5NiwgMC4zMjUwNDM5LCAtMC44MTY2MTQ0LCAtMC40NjM5OTUsIC0wLjAxMDE0NDc1LCAwLjQ3MTUzMzQsIC0wLjY4NjgyODQsIDAuMDUwOTE4ODksIC0wLjQwMTExNjMsIDAuMjcxNzI4NSwgLTAuMDY3NTY4MzUsIDAuODMwNzY5NCwgLTAuNzkzODUzNSwgMC40MzUyMTI5LCAtMC40NjYzODQyLCAwLjcxNjUzMjksIDAuNTU5NzI5LCAwLjgwOTM5OTUpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMjFdID0gbmV3IEFycmF5PG51bWJlcj4oMC4wNzgzMjI0MywgMC40MjYxNTEsIC0wLjM4NTY3OTUsIDAuNTc5OTk1MywgMC4wMTk3MDc5NywgMC4wNjcwNjE4OSwgMC40ODIyNjgyLCAwLjMwMTQ1MTIsIC0wLjE1MzI5ODIsIDAuODc0ODUsIC0wLjQ5NTk1MjcsIDAuMDc4ODgwNDMsIDAuMjYwNjAxLCAtMC4yMzA0Nzg0LCAwLjQ5OTYyMDksIDAuNzE2NzM4MiwgMC41ODU5ODYsIC0wLjA0MjY1MTc0LCAtMC43Njc5OTY3LCAwLjU1MDk0MTYsIC0wLjkwNDE3NTMsIDAuMTgwMjEzNCwgLTAuODQwNzY1NSwgLTAuNDQ0MjgyNiwgLTAuMjA1ODI1OCwgLTAuMjYzNjk5NSwgLTAuNDk4NDExNSwgLTAuNTkyODU3OSwgMC4yOTI2MDMyLCAtMC43ODg2NDczLCAtMC4wNjkzMzg4MiwgLTAuNjIxMTc3LCAwLjU3ODExNSwgLTAuNDgxMzM4NywgMC44OTgxNzc3LCAtMC4zMjkxMDU2LCAwLjE5NDI3MzMsIDAuOTI1NTU4NCwgMC44MDg0MzYyLCAwLjUwNjY5ODQsIDAuOTkyMDA5NSwgMC4wMzEwMzEwNCwgLTAuMjQwMzIwNiwgLTAuOTM4OTAxOCk7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1syMl0gPSBuZXcgQXJyYXk8bnVtYmVyPigtMC41NjkxMDk1LCAwLjEwMTQzMTYsIC0wLjc3ODgyNjIsIDAuMzg0MDEyLCAtMC44MjUzNjY1LCAtMC4xNjQ1NTgyLCAtMC4xODMwOTkzLCAwLjAwMjk5NzIxMSwgLTAuMjU1NTAxMywgLTAuNDE3Nzk3NywgLTAuNjY0MDg2OSwgLTAuNDc5NDcxMSwgLTAuMjM1MTI0MiwgMC41ODUwMTIxLCAwLjAyNDM2NTU0LCAwLjI4MjU4ODMsIDAuMDA2MDYxMTQzLCAtMC44MjAwMjQ1LCAwLjE2MTg3OTEsIC0wLjMwNjMzMzEsIC0wLjM3NjU4OTcsIC0wLjcyNDk4MTUsIDAuNjA5MjkxOSwgLTAuNjc2OTMyOCwgLTAuNTk1NjkzNCwgMC42OTU3NjU1LCAwLjUzODM2NDIsIDAuNDUyMjY3NywgLTAuMTQ4OTE2NSwgMC45MTI1NTk2LCAwLjQxNjc0NzMsIDAuMTMzNTk4NiwgMC4xODk4MzA5LCAwLjU4NzQzNDIsIDAuMjI4ODE3MSwgMC45NjI0MzU2LCAwLjc1NDA4NDYsIC0wLjA3NjcyMzA0LCAwLjg5ODYyNTIsIDAuMjc4ODc5NywgMC4zNTU1OTkxLCAtMC45MjYyMTM5LCAwLjg0NTQzMjUsIC0wLjQwMjc2NjcsIDAuNDk0NTIzNiwgLTAuMjkzNTUxMik7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1syM10gPSBuZXcgQXJyYXk8bnVtYmVyPigtMC40NDgxNDAzLCAtMC4zNzU4Mzc0LCAtMC44ODc3MjUxLCAwLjA4NzM5OTM4LCAwLjA1MDE1ODMxLCAtMC4xMzM5OTgzLCAtMC40MDcwNDI3LCAtMC44NTM0MTczLCAwLjEwMTkyNzQsIC0wLjU1MDMyMjIsIC0wLjQ0NTk5OCwgMC4xOTk3NTQxLCAtMC44Njg2MjYzLCAtMC4yNzg4ODY3LCAtMC43Njk1OTQ0LCAtMC42MDMzNzA0LCAtMC4wNTUxNTc0MiwgLTAuODg1NzExLCAtMC43NzE0MzQ3LCAwLjU3OTA0ODUsIDAuMzQ2NjI2MywgLTAuODc5OTI5NywgMC40NDg3NTgyLCAtMC41MzIxMDg3LCAtMC4yNDYxMzY4LCAwLjYwNTM3NzEsIC0wLjA1NTY4MTE3LCAwLjI0NTczNTEsIC0wLjQ2Njg2NjksIDAuODUyMzgxNiwgMC44MTAzMzg3LCAtMC40MjU1NTM4LCAwLjQwNTQxODIsIC0wLjE3NTY2MywgLTAuMjgwMjAxMSwgLTAuMDg5MjAxNTMsIDAuMjY2NTk1OSwgMC4zODI5MzUsIDAuNTU1Njc5LCAwLjE2MjE4MzcsIDAuMTA1MjQ2LCAwLjg0MjA0MTEsIDAuNjkyMTE2MSwgMC42OTAyOTAzLCAwLjg4MDk0NiwgMC4yNDgzMDY3LCAwLjk2OTkyNjQsIC0wLjEwMjE3NjcpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMjRdID0gbmV3IEFycmF5PG51bWJlcj4oLTAuMTcwMzMyMywgLTAuMzExOTM4NSwgMC4yOTE2MDM5LCAtMC4yOTg4MjYzLCAtMC4wMDg0NzI5ODIsIC0wLjkyNzc2OTUsIC0wLjc3MzAyNzEsIC0wLjMyNzc5MDQsIDAuMzQ0MDQ3NCwgLTAuNjgxNTM0MiwgLTAuMjkxMDI3OCwgMC4wMzQ2MTc0NSwgLTAuNjc2NDg5OSwgLTAuNjU3MDc4LCAtMC4zNTA1NTAxLCAtMC43MzExOTg4LCAtMC4wMzQ3ODkyNywgMC4zMjU4NzU1LCAtMC42MDQ4ODM1LCAwLjE1OTQyMywgMC4yMDM1NTI1LCAwLjAyMjEyMjE0LCAwLjUxMTY1NzMsIDAuMjIyNjg1NiwgMC42NjY0ODA1LCAtMC4yNTAwMTg5LCAwLjcxNDc4ODIsIC0wLjY2MDk2MzQsIDAuMDMwMzA2MzIsIC0wLjU3NjMyNzgsIC0wLjI1MTY1ODUsIDAuNjExNjIxOSwgLTAuOTQzNDQxMywgLTAuMDExNjc5MiwgMC45MDYxODE2LCAwLjI0OTExNTUsIDAuMTgyODY3LCAwLjYwNzYxNjcsIDAuMjg2NTkzLCAwLjk0ODU2OTUsIC0wLjU5OTI0MzksIDAuNjk3MDA5NiwgLTAuMjA4Mjg3NCwgMC45NDE2NjQxLCAwLjk4ODAwNDQsIC0wLjE1NDE3MDksIC0wLjkxMjI4ODEsIDAuMzMxNTU1LCAwLjczMjQ4ODYsIDAuNjcyNTA5OCk7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1syNV0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjM4Njk1OTgsIC0wLjA0OTc0ODM0LCAwLjcxNjg4NDQsIC0wLjA2OTM3MTEsIC0wLjA3MTY2NzQyLCAwLjE3MjUzMjUsIDAuNDU5OTU5MiwgMC4zMjMyNzc5LCAwLjU4NzIwOTQsIC0wLjQxOTg2NzQsIDAuMjQ0MjI2NiwgLTAuNjI1NjY3LCAwLjEyNTQ1NTcsIDAuNDUwMDA0OCwgLTAuMjI5MDE1NCwgLTAuMTgwMzU2NywgMC44OTA1ODMsIDAuMzM3MzQ5MywgMC4xMjU2MDgxLCAwLjc4NTM3ODksIC0wLjI2NzY0NjYsIDAuNTMwNTgwNSwgLTAuNzA2MzIyNCwgMC4yNTIxNjgsIC0wLjM5ODk4MzUsIDAuMTE4OTkyMSwgMC4wOTYxNzIxNSwgLTAuMjQ1MTQ0NywgMC42MzAyNTQxLCAwLjYwODU4NzYsIDAuOTM4MDkyNSwgLTAuMzIzNDg5OSwgMC41MDg2MjQxLCAtMC44NTczNDgyLCAwLjAzNTc2MTg3LCAtMC45ODc2Njk3LCAtMC4wODc2NzEyLCAtMC42MzY1MTk1LCAtMC41Mjc2NTEzLCAwLjgyMzQ1NiwgLTAuNjkzNTc2NCwgLTAuMjI0MDQxMSwgLTAuNTIxMjMxOCwgLTAuNTM4MzEyMSwgLTAuMjExNjIwOCwgMC45NjM5MzYzLCAtMC45ODQwMDk2LCAwLjAyNzQzNTU1LCAtMC4zOTkxNTc3LCAtMC44OTk0NTQ3LCAtMC43ODMwMTI2LCAwLjYxNDA2OCk7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1syNl0gPSBuZXcgQXJyYXk8bnVtYmVyPigtMC44MzY2NjAxLCAwLjQ0NjQ4OTUsIC0wLjU5MTczNjYsIC0wLjAyMDczOTA2LCAtMC45ODQ1MjU4LCAwLjE2MzU2MjUsIC0wLjMwOTc5NzMsIDAuNDM3OTU3OSwgLTAuNTQ3ODE1NCwgMC43MTczMjIxLCAtMC4xNjg1ODg4LCAwLjkyNjE5NjksIDAuMDE1MDM1OTUsIDAuNjA0NjA5NywgMC40NDUyNDIxLCAwLjU0NDkwODYsIDAuMDMxNTY4NywgMC4xOTQ0NjE5LCAwLjM3NTM0MDQsIDAuODY4ODU0OCwgMC40MTQzNjQzLCAwLjEzOTY2NDgsIDAuODcxMTAzMiwgMC40MzA0NzAzLCAwLjczMjg3NzMsIDAuMTQ2MTUwMSwgMC42Mzc0NDkyLCAtMC4zNTIxNDk1LCAwLjE0NTYxMywgLTAuMTM0MTQ2NiwgMC45MDQwOTc1LCAtMC4xMzUxMjMsIC0wLjc4MzkwNTksIC0wLjU0NTAxOTksIC0wLjUxNjAxOSwgLTAuMzMyMDg1OSwgLTAuMjA2MTU4LCAtMC40NDMxMTA2LCAtMC45NzAzMDE0LCAtMC4yMzY4MzU2LCAtMC4yNDczMTE5LCAtMC4wODY0MzUxLCAwLjIxMzA3MjUsIC0wLjQ2MDQwNzcsIC0wLjAwMzcyNjcwMSwgLTAuNzEyMjMwMywgLTAuNDA3MjEzMSwgLTAuNjgzMzE2OSwgMC4xNjMyOTk5LCAtMC45Nzc2NjQ2LCAwLjQ2ODY4ODgsIC0wLjY4MDQ5NSwgLTAuMjI5MzUxMSwgLTAuOTUwOTc3Nyk7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1syN10gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjEwNzMxMSwgLTAuMTMxMTM2OSwgLTAuNDE5NDc2NCwgLTAuMzE0ODc3NywgMC42MTcxNDM5LCAtMC4yNzQ1OTczLCAwLjI3OTY2MTgsIDAuMTkzNzE1MywgLTAuMDkxMDY4ODYsIDAuNDE4MDIzNiwgMC42MDQ0MDA2LCAwLjA1NTc3ODQ2LCAwLjAyOTI3Mjk5LCAtMC42NzM4MjYzLCAtMC4yNTgwODQ1LCAwLjExNzk5MzksIC0wLjA5MDIzNTY0LCAtMC4zODMwMDI0LCAwLjM1NzA5NTMsIC0wLjUwMDA1ODcsIDAuODE1OTEsIC0wLjU1MTgzMDksIDAuOTMwMDIxNywgLTAuMTI1Nzk4NywgMC40OTA0NjI3LCAtMC44MzgxOTAzLCAtMC4zMTYzMTgyLCAtMC44NjMyMDA5LCAwLjExMzc1OTUsIC0wLjk4NzU5OTgsIDAuODM5MDA0MywgMC4zNTM4MTg1LCAwLjIxNDkxMTQsIDAuNDk5MzY5NCwgMC41MTkxNTg0LCAwLjM4MzM1NTIsIDAuNTAwMjc2MywgMC43MDYxNDY1LCAtMC4yNTY3Mjc2LCAwLjkwNjg3NTYsIC0wLjUxOTczNjYsIDAuMzQ2Nzg0NSwgMC4wMzY2ODg2NywgMC45NzM0MDA5LCAtMC41MzQ3NTUzLCAwLjY2NzQ3LCAtMC45MDI4ODgyLCAwLjEwMjM3NjgsIC0wLjg5Njc5NzcsIDAuNDEyODM0LCAtMC41ODIxOTQ0LCAwLjA0MjY0NzksIC0wLjgwMzIxNjUsIC0wLjIzOTcwMzgsIC0wLjU1OTczNDMsIC0wLjYzNTgwMjEpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMjhdID0gbmV3IEFycmF5PG51bWJlcj4oLTAuNjU2MjQ5NiwgLTAuMTc4MTAzNiwgLTAuOTMwMTQ5NCwgMC4xMTg1MjA4LCAtMC4zODYxMTQzLCAtMC40MTUzNTYyLCAtMC4xNTYwNzk5LCAtMC4xMDk5NjA3LCAtMC41NTg3MDI1LCAwLjM5NTIxOCwgLTAuNTMyMjExMiwgLTAuNjk5NzAxLCAtMC41MDA4NjM5LCAwLjA4NzI2ODQ2LCAtMC45NzA1MjQsIC0wLjE5NjM0NjEsIC0wLjgxMzU3NywgLTAuNTE4NTExMSwgLTAuMTY0NDQ1OCwgMC4yOTgsIC0wLjMyMTY3OTEsIDAuNjM5OTgyLCAwLjMzMTUzNzMsIDAuMzMzOTE2MiwgMC4yMzgzMjM1LCAtMC4wMDEwNTcyMiwgMC4xMTM3ODI4LCAwLjU0NTA3NDIsIC0wLjAxODk5OTIxLCAwLjg3OTg0MTMsIDAuMjg0OTY4NSwgMC44MjU1NTk2LCAwLjY5NzQ0MTIsIDAuMjEyMzE3NSwgMC43NTg4NTIzLCAwLjU0NzA0MzcsIDAuNTEwMjUwMiwgLTAuMTY4Nzg0NCwgMC41ODUzNDQ4LCAwLjgwMzM0NzYsIDAuMjU5MDcxNiwgLTAuNTI2MjUwNCwgMC41NjA3NzE4LCAtMC42MzQyODI1LCAwLjg2NjY0NDMsIC0wLjE0OTE4NDEsIDAuODM0MTA1MiwgLTAuNDkzNTAwMywgLTAuMTU2ODQ0MSwgLTAuNjYzNDA2NiwgMC4yNTEyMTEzLCAtMC44NzY5MzkxLCAtMC4yNTU5ODI3LCAtMC45NTcyNDU3LCAtMC4wMTkyODg1MiwgLTAuMzk2NjU0MiwgLTAuNzUwNjY3LCAwLjY0MDk2NzgpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMjldID0gbmV3IEFycmF5PG51bWJlcj4oMC4zNDU0Nzg2LCAtMC4wNDgzNzcyNiwgMC4yNjQ5NTUzLCAwLjI0MDY4NTIsIDAuNTU5OTA5MywgLTAuMzgzOTE0NSwgLTAuMTExMTgxNCwgLTAuMDU1MDIxMDgsIDAuNzU4NjA0MiwgLTAuMDU4MTgzNzcsIDAuMjUxOTQ4OCwgLTAuNDY2NTEzNSwgLTAuMTI2NDk3MiwgMC4yNjAyNzIzLCAtMC4wODc2NjIxNiwgLTAuMzY3MTkwNywgMC42NDI4MTI5LCAwLjM5OTkyMDQsIC0wLjYxMDU4NzEsIC0wLjEyNDY4NjksIC0wLjQ1ODk0NTEsIC0wLjc2NDY2NDMsIC0wLjAzMDIxMTE2LCAtMC43ODk5MzUyLCAtMC42MDM2OTIyLCAtMC40MjkzOTU2LCAtMC4yNDgxOTM4LCAwLjY1MzQxODUsIDAuMTAyNzk4LCAwLjY3ODQ0NjUsIC0wLjYzOTI2NDQsIDAuNDgyMTM1OCwgLTAuNjc4OTAwMiwgMC4xNzc5MTMzLCAtMC45MTQwNzgzLCAtMC4xOTg5NjQ3LCAtMC45MjYyNjE3LCAwLjMzODE1MDcsIDAuNDc5NDg5MSwgLTAuODA5MzI3NCwgMC4zOTU5NDQ3LCAwLjY2ODQ3OCwgMC45NjAyODgzLCAwLjIyNzIzMDUsIC0wLjEyMzY3MiwgMC45MjEwODgzLCAwLjIzNzUxNDgsIDAuOTUyMzM5NSwgLTAuNTI4OTgsIDAuNzk3MzM3OCwgLTAuMzgyNDMzLCAwLjEyMjg3OTQsIDAuNjk1MDE1LCAwLjY5NDg0MzksIDAuNzUzMDI3NywgLTAuNjQ1ODE5MSwgMC44Nzc3OTg3LCAtMC4zMjcyOTU2LCAwLjIzMTg1MjUsIC0wLjk2Mjc2OCk7XG5cdFx0dGhpcy5fZGlzdHJpYnV0aW9uc1szMF0gPSBuZXcgQXJyYXk8bnVtYmVyPigwLjQ1MTg5MjEsIC0wLjExNDYxOTUsIDAuNDcyMDgwNSwgLTAuNDIzODc0OCwgMC4zNjU1NDIzLCAwLjE4MDYzNDEsIDAuMTU4OTkzOSwgLTAuMjM1NjgsIDAuNzY3MzMyNCwgLTAuNTE0OTk0MSwgMC4wMTE2MzY1OCwgMC4wOTA0NTgzNiwgMC43MDEwOTcxLCAwLjEyNDU3NDcsIDAuNzUxODI4NiwgLTAuMTg1NTQzMywgMC40OTYwNzE5LCAwLjQ2MDEwMjIsIDAuMjU2Njk3OSwgLTAuNjMwODI2OCwgLTAuMDY1NDcxNCwgLTAuNTEyNjM4OSwgLTAuMTgyMzMxOSwgLTAuMTM0MzI4MiwgLTAuMTQ2NDMxMiwgMC40ODgzMjM2LCAtMC4zODU4NzM4LCAwLjIwMzUyMywgMC4xNDg0Nzk5LCAwLjQ0MzIyODQsIC0wLjQ3NzEwOSwgLTAuMTE2MjQxLCAwLjI3MTkwOTIsIDAuNzIwODYyNiwgMC45MTA0MTc0LCAwLjM1Nzg1MzYsIC0wLjU5NTYxOTksIDAuNzY2MjU4OCwgLTAuNjk5NjI1MSwgMC4zNjc4NjU0LCAtMC4yNTE0NTEyLCAwLjkyNTE5MzMsIDAuMTI3NTgyNSwgLTAuOTQ3ODEzNSwgLTAuMjA0NjA4LCAtMC44NjExNTUyLCAwLjQyNjQ4MzgsIC0wLjg3NzQ0MywgMC45ODU0MTYxLCAwLjA1NTIxMTEyLCAwLjU5MTI5NTEsIDAuNzk5NzQzNCwgMC4xMTQwMzQ5LCAwLjk4MjA5MywgLTAuOTMyNDM2OCwgLTAuMjA5NDA5NCwgLTAuNDI0MzYsIC0wLjY0NDE1MjQsIC0wLjY3MjI3MDUsIC0wLjM1NTQyNjEsIC0wLjc4NDQyMzYsIDAuMDg1ODc2MjEpO1xuXHRcdHRoaXMuX2Rpc3RyaWJ1dGlvbnNbMzFdID0gbmV3IEFycmF5PG51bWJlcj4oLTAuNDIwNjcxNCwgLTAuNTYxMzY0MiwgLTAuODczMzAxNiwgLTAuMzM3MzA1MSwgLTAuMTA0NjIyNiwgLTAuMjkwMjk5OSwgLTAuMTMxODU2MiwgLTAuODQzNDM2NSwgMC4xMTQ1MDkzLCAtMC41OTYyNjIzLCAtMC40OTY1NjI3LCAtMC4xODczMjU5LCAtMC41MDExODA4LCAtMC44NTQ2MjI5LCAtMC43MTY1NjM2LCAtMC41NzQzNTY2LCAwLjEwOTA5MDEsIDAuMjAxNzY0MywgMC4zNDA0ODA5LCAtMC4yMjA0NTUsIC0wLjE5ODkwMTUsIDAuMjM3MjEyMiwgLTAuNDUzODcwNiwgMC4wOTc5MTcxLCAwLjQ1MTQxNDYsIC0wLjU3Mjg0NiwgMC4yMzE0MTY4LCAtMC44NTE0NTAzLCAtMC40MjQ3MjM2LCAwLjU2NTA4MDMsIC0wLjk0MzM0NywgMC4wNDUxNDYzOSwgLTAuMTMwOTcxOCwgMC41MjIxODc3LCAtMC43MDA0MTU3LCAwLjQ1NjE4NzcsIDAuNjMwNjQ0MSwgMC4wNDQ0ODY3MywgMC40MzAxNjIxLCAwLjU3NjY4NzYsIDAuMTA3ODA0MiwgMC43MjQ1NzUyLCAwLjM4NzUzNTQsIDAuMjc5NDQ4MywgMC43MDI4NzYsIC0wLjI5MjQyMTMsIDAuNzM2MDY2NywgLTAuNjIxMDMxOCwgMC43NDg2NTE3LCAwLjY1MzExMDMsIDAuNDg5ODIzNSwgMC44NTkxMDI1LCAwLjY1NDkxNzQsIDAuMzg1NDA1NywgLTAuMjU5NjEwNiwgMC43OTE2OTk4LCAwLjkyNTExOTQsIC0wLjA1Mjk2MjY1LCAtMC41NjIwNjk1LCAwLjgyMDg3NywgLTAuMDEyMjgwMjYsIDAuOTkzNzIxMSwgMC45NjEyMTAzLCAwLjI2Mjg3NTgpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBnZXREaXN0cmlidXRpb24objpudW1iZXIgLyppbnQqLyk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0aWYgKCF0aGlzLl9kaXN0cmlidXRpb25zKVxuXHRcdFx0dGhpcy5pbml0RGlzdHJpYnV0aW9ucygpO1xuXG5cdFx0aWYgKG4gPCAyIHx8IG4gPiAzMilcblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2Rpc3RyaWJ1dGlvbnNbbiAtIDFdO1xuXHR9XG59XG5cbmV4cG9ydCA9IFBvaXNzb25Mb29rdXA7Il19 \ No newline at end of file diff --git a/lib/core/geom/PoissonLookup.ts b/lib/core/geom/PoissonLookup.ts new file mode 100644 index 00000000..a860d073 --- /dev/null +++ b/lib/core/geom/PoissonLookup.ts @@ -0,0 +1,55 @@ +class PoissonLookup +{ + public static _distributions:Array>; + + public static initDistributions():void + { + // precalculated for best control + this._distributions = new Array>(); + this._distributions[0] = new Array(0.3082841, 0.4320919); + this._distributions[1] = new Array(0.3082841, 0.4320919, -0.2274942, -0.6640266); + this._distributions[2] = new Array(0.8742689, 0.0009265686, -0.6864116, -0.5536607, -0.2325206, 0.7678371); + this._distributions[3] = new Array(0.3913446, -0.7084417, -0.7511101, -0.5935929, -0.2323436, 0.5320091, 0.8435315, 0.5035911); + this._distributions[4] = new Array(0.2122471, -0.5771395, -0.8543506, -0.1763534, 0.5189021, 0.8323698, -0.3616908, 0.5865368, 0.9523004, -0.04948437); + this._distributions[5] = new Array(0.5791035, 0.3496495, 0.2959551, -0.6006749, -0.2419119, -0.06879545, -0.7403072, 0.6110353, -0.04555973, 0.8059174, -0.5275017, -0.737129); + this._distributions[6] = new Array(0.06941478, 0.8519508, -0.7441907, 0.2426432, 0.6439992, -0.2405252, -0.1007523, -0.2327587, -0.6427067, -0.7248485, 0.8050759, 0.5492936, 0.3573822, -0.8824506); + this._distributions[7] = new Array(0.8509863, 0.4452587, -0.09507271, 0.2073005, 0.1706571, -0.6434793, 0.8029777, -0.2718274, -0.4401725, 0.8196304, 0.2715359, 0.8598521, -0.8121575, -0.006447683, -0.6486837, -0.7237598); + this._distributions[8] = new Array(0.6951686, -0.2680728, -0.04933243, 0.3710589, 0.6592212, 0.3661054, -0.01579228, -0.6909603, -0.3275101, -0.1756866, 0.3811549, 0.9218544, -0.216032, 0.9755028, -0.7065172, 0.3355389, -0.6579109, -0.6798355); + this._distributions[9] = new Array(0.6181276, -0.09790418, -0.2537868, -0.5570995, -0.1964931, 0.3459414, 0.3474613, -0.8885581, 0.5135743, 0.5753114, -0.9549091, 0.1480672, -0.8711916, -0.4293123, -0.6928071, 0.6190156, -0.13369, 0.8892705, 0.0548224, -0.1246777); + this._distributions[10] = new Array(0.4853027, -0.5080479, -0.1331675, -0.506597, 0.139575, 0.01316885, 0.803486, -0.07568797, 0.5240274, 0.4883182, -0.4334005, 0.1207938, -0.7794577, -0.3985141, 0.1576432, -0.9861221, -0.3712867, 0.6959021, 0.1517378, 0.9847429, -0.9762396, 0.1661073); + this._distributions[11] = new Array(-0.2790166, -0.01252619, 0.3389016, 0.3921154, 0.2408341, -0.313211, -0.8151779, -0.3898362, -0.6347761, 0.3486495, 0.09471484, -0.7722448, -0.1385674, 0.6364574, 0.2456331, 0.9295807, -0.3864306, -0.8247881, 0.6111673, -0.7164014, 0.8287669, 0.05466961, 0.837706, 0.5415626); + this._distributions[12] = new Array(0.056417, 0.3185693, -0.8245888, 0.1882799, 0.8575996, 0.1136829, 0.1070375, 0.875332, 0.4076743, -0.06000621, -0.4311306, 0.7239349, 0.2677574, -0.538472, -0.08486642, -0.2083647, -0.888989, -0.3906443, -0.4768958, -0.6664082, 0.09334993, -0.9861541, 0.808736, -0.455949, 0.5889823, 0.7660807); + this._distributions[13] = new Array(-0.2681346, -0.3955857, -0.1315102, -0.8852947, -0.5143692, 0.09551838, 0.4344836, -0.546945, -0.8620899, -0.3813288, 0.1650431, 0.02034803, -0.1543657, 0.3842218, -0.828457, 0.5376903, -0.6145, -0.7818927, -0.2639062, 0.8784655, 0.1912684, 0.9720125, 0.3135219, 0.5224229, 0.7850655, 0.4592297, 0.7465045, -0.1368916); + this._distributions[14] = new Array(0.4241029, 0.695281, 0.150511, -0.02304107, -0.2482675, 0.9120338, 0.8057325, 0.2622084, -0.2445909, 0.2765962, 0.8588713, -0.1772072, 0.3117845, -0.4385471, -0.3923851, -0.3298936, -0.1751254, -0.7405846, 0.6926506, -0.684163, -0.9304563, -0.3254691, -0.8533293, 0.1523024, 0.2510415, -0.917345, -0.6239773, -0.7105472, -0.6104624, 0.6041355); + this._distributions[15] = new Array(0.5844554, 0.06651045, 0.1343258, 0.6756578, 0.3799674, -0.6301104, 0.5590436, 0.7940555, 0.09574714, 0.02262517, 0.8697868, 0.393301, 0.003945862, -0.421735, 0.9043913, -0.2432393, -0.4844007, 0.7190998, -0.3201078, 0.2972371, -0.3852352, -0.6341155, -0.5413069, -0.09223081, -0.8468984, -0.5126905, 0.004156174, -0.8633173, -0.9681889, -0.03305046, -0.846509, 0.4414353); + this._distributions[16] = new Array(0.4506488, 0.657668, 0.4621297, 0.07441051, -0.2782125, 0.6201044, 0.9750003, 0.09110117, 0.1019436, 0.2986514, 0.03457398, 0.9631706, 0.542098, -0.5505635, 0.8675668, 0.4938077, -0.5414361, 0.2655292, -0.7941836, 0.6003053, -0.09847672, -0.1001604, -0.9316511, -0.08572888, 0.07286467, -0.611899, -0.5232627, -0.4082253, -0.5481608, -0.827938, -0.1551939, -0.9621193, 0.9220031, -0.3315949); + this._distributions[17] = new Array(0.197908, -0.4697656, -0.4474689, -0.3428435, 0.8529873, -0.2228634, 0.6022478, -0.5469642, 0.2545276, -0.931133, -0.1507547, -0.7855865, -0.07606658, 0.1011628, 0.3046715, 0.2785755, 0.4698432, -0.1064076, 0.6831254, 0.4152522, 0.1374381, 0.8363233, -0.2166121, 0.6682042, 0.5511393, 0.7996449, -0.4278994, 0.28836, -0.8875198, 0.2181732, -0.8772842, -0.2818254, -0.7000262, 0.5762185, -0.6062385, -0.7439126); + this._distributions[18] = new Array(0.6645703, -0.05678739, 0.5720971, 0.4533803, -0.07660709, 0.08802763, 0.5163431, -0.4426552, 0.1163455, -0.3404382, -0.4004807, -0.5046007, 0.2932099, -0.8201418, -0.5322125, 0.03834766, -0.1490209, -0.8817304, -0.8000439, -0.3509448, 0.5260983, 0.8421043, 0.1197811, 0.6963812, 0.9498612, 0.3122156, -0.9285746, 0.02120355, -0.6670724, 0.7217396, 0.9155889, -0.3510147, -0.271941, 0.4727852, 0.318879, 0.1634057, -0.2686755, 0.9253026); + this._distributions[19] = new Array(0.5064292, 0.422527, 0.8935515, -0.06610427, 0.1199719, 0.175568, 0.403388, -0.2003276, 0.1657927, 0.8154403, 0.9301245, 0.2929218, -0.1644068, 0.6201534, 0.7113559, -0.6589743, -0.3364046, -0.1799502, 0.02109996, -0.392765, -0.382213, 0.3219992, -0.9201946, 0.1207967, -0.726185, 0.4291916, -0.7443482, -0.2480059, -0.5147594, 0.7418784, 0.1935272, -0.7406143, -0.3643523, -0.5559214, -0.7147766, -0.6326278, -0.2524151, -0.9096627, 0.5161405, 0.7908453); + this._distributions[20] = new Array(0.7921003, -0.3032096, 0.5992879, -0.009052323, 0.2538549, -0.1872749, 0.7053444, 0.3677175, 0.5417761, -0.8170255, 0.9749611, 0.1210478, 0.1969143, -0.6117041, -0.1824499, -0.4634196, -0.1181338, -0.8668742, -0.3050112, -0.1352596, -0.4409327, -0.7082354, -0.03225285, 0.1171548, 0.3113096, 0.3250439, -0.8166144, -0.463995, -0.01014475, 0.4715334, -0.6868284, 0.05091889, -0.4011163, 0.2717285, -0.06756835, 0.8307694, -0.7938535, 0.4352129, -0.4663842, 0.7165329, 0.559729, 0.8093995); + this._distributions[21] = new Array(0.07832243, 0.426151, -0.3856795, 0.5799953, 0.01970797, 0.06706189, 0.4822682, 0.3014512, -0.1532982, 0.87485, -0.4959527, 0.07888043, 0.260601, -0.2304784, 0.4996209, 0.7167382, 0.585986, -0.04265174, -0.7679967, 0.5509416, -0.9041753, 0.1802134, -0.8407655, -0.4442826, -0.2058258, -0.2636995, -0.4984115, -0.5928579, 0.2926032, -0.7886473, -0.06933882, -0.621177, 0.578115, -0.4813387, 0.8981777, -0.3291056, 0.1942733, 0.9255584, 0.8084362, 0.5066984, 0.9920095, 0.03103104, -0.2403206, -0.9389018); + this._distributions[22] = new Array(-0.5691095, 0.1014316, -0.7788262, 0.384012, -0.8253665, -0.1645582, -0.1830993, 0.002997211, -0.2555013, -0.4177977, -0.6640869, -0.4794711, -0.2351242, 0.5850121, 0.02436554, 0.2825883, 0.006061143, -0.8200245, 0.1618791, -0.3063331, -0.3765897, -0.7249815, 0.6092919, -0.6769328, -0.5956934, 0.6957655, 0.5383642, 0.4522677, -0.1489165, 0.9125596, 0.4167473, 0.1335986, 0.1898309, 0.5874342, 0.2288171, 0.9624356, 0.7540846, -0.07672304, 0.8986252, 0.2788797, 0.3555991, -0.9262139, 0.8454325, -0.4027667, 0.4945236, -0.2935512); + this._distributions[23] = new Array(-0.4481403, -0.3758374, -0.8877251, 0.08739938, 0.05015831, -0.1339983, -0.4070427, -0.8534173, 0.1019274, -0.5503222, -0.445998, 0.1997541, -0.8686263, -0.2788867, -0.7695944, -0.6033704, -0.05515742, -0.885711, -0.7714347, 0.5790485, 0.3466263, -0.8799297, 0.4487582, -0.5321087, -0.2461368, 0.6053771, -0.05568117, 0.2457351, -0.4668669, 0.8523816, 0.8103387, -0.4255538, 0.4054182, -0.175663, -0.2802011, -0.08920153, 0.2665959, 0.382935, 0.555679, 0.1621837, 0.105246, 0.8420411, 0.6921161, 0.6902903, 0.880946, 0.2483067, 0.9699264, -0.1021767); + this._distributions[24] = new Array(-0.1703323, -0.3119385, 0.2916039, -0.2988263, -0.008472982, -0.9277695, -0.7730271, -0.3277904, 0.3440474, -0.6815342, -0.2910278, 0.03461745, -0.6764899, -0.657078, -0.3505501, -0.7311988, -0.03478927, 0.3258755, -0.6048835, 0.159423, 0.2035525, 0.02212214, 0.5116573, 0.2226856, 0.6664805, -0.2500189, 0.7147882, -0.6609634, 0.03030632, -0.5763278, -0.2516585, 0.6116219, -0.9434413, -0.0116792, 0.9061816, 0.2491155, 0.182867, 0.6076167, 0.286593, 0.9485695, -0.5992439, 0.6970096, -0.2082874, 0.9416641, 0.9880044, -0.1541709, -0.9122881, 0.331555, 0.7324886, 0.6725098); + this._distributions[25] = new Array(0.3869598, -0.04974834, 0.7168844, -0.0693711, -0.07166742, 0.1725325, 0.4599592, 0.3232779, 0.5872094, -0.4198674, 0.2442266, -0.625667, 0.1254557, 0.4500048, -0.2290154, -0.1803567, 0.890583, 0.3373493, 0.1256081, 0.7853789, -0.2676466, 0.5305805, -0.7063224, 0.252168, -0.3989835, 0.1189921, 0.09617215, -0.2451447, 0.6302541, 0.6085876, 0.9380925, -0.3234899, 0.5086241, -0.8573482, 0.03576187, -0.9876697, -0.0876712, -0.6365195, -0.5276513, 0.823456, -0.6935764, -0.2240411, -0.5212318, -0.5383121, -0.2116208, 0.9639363, -0.9840096, 0.02743555, -0.3991577, -0.8994547, -0.7830126, 0.614068); + this._distributions[26] = new Array(-0.8366601, 0.4464895, -0.5917366, -0.02073906, -0.9845258, 0.1635625, -0.3097973, 0.4379579, -0.5478154, 0.7173221, -0.1685888, 0.9261969, 0.01503595, 0.6046097, 0.4452421, 0.5449086, 0.0315687, 0.1944619, 0.3753404, 0.8688548, 0.4143643, 0.1396648, 0.8711032, 0.4304703, 0.7328773, 0.1461501, 0.6374492, -0.3521495, 0.145613, -0.1341466, 0.9040975, -0.135123, -0.7839059, -0.5450199, -0.516019, -0.3320859, -0.206158, -0.4431106, -0.9703014, -0.2368356, -0.2473119, -0.0864351, 0.2130725, -0.4604077, -0.003726701, -0.7122303, -0.4072131, -0.6833169, 0.1632999, -0.9776646, 0.4686888, -0.680495, -0.2293511, -0.9509777); + this._distributions[27] = new Array(0.107311, -0.1311369, -0.4194764, -0.3148777, 0.6171439, -0.2745973, 0.2796618, 0.1937153, -0.09106886, 0.4180236, 0.6044006, 0.05577846, 0.02927299, -0.6738263, -0.2580845, 0.1179939, -0.09023564, -0.3830024, 0.3570953, -0.5000587, 0.81591, -0.5518309, 0.9300217, -0.1257987, 0.4904627, -0.8381903, -0.3163182, -0.8632009, 0.1137595, -0.9875998, 0.8390043, 0.3538185, 0.2149114, 0.4993694, 0.5191584, 0.3833552, 0.5002763, 0.7061465, -0.2567276, 0.9068756, -0.5197366, 0.3467845, 0.03668867, 0.9734009, -0.5347553, 0.66747, -0.9028882, 0.1023768, -0.8967977, 0.412834, -0.5821944, 0.0426479, -0.8032165, -0.2397038, -0.5597343, -0.6358021); + this._distributions[28] = new Array(-0.6562496, -0.1781036, -0.9301494, 0.1185208, -0.3861143, -0.4153562, -0.1560799, -0.1099607, -0.5587025, 0.395218, -0.5322112, -0.699701, -0.5008639, 0.08726846, -0.970524, -0.1963461, -0.813577, -0.5185111, -0.1644458, 0.298, -0.3216791, 0.639982, 0.3315373, 0.3339162, 0.2383235, -0.00105722, 0.1137828, 0.5450742, -0.01899921, 0.8798413, 0.2849685, 0.8255596, 0.6974412, 0.2123175, 0.7588523, 0.5470437, 0.5102502, -0.1687844, 0.5853448, 0.8033476, 0.2590716, -0.5262504, 0.5607718, -0.6342825, 0.8666443, -0.1491841, 0.8341052, -0.4935003, -0.1568441, -0.6634066, 0.2512113, -0.8769391, -0.2559827, -0.9572457, -0.01928852, -0.3966542, -0.750667, 0.6409678); + this._distributions[29] = new Array(0.3454786, -0.04837726, 0.2649553, 0.2406852, 0.5599093, -0.3839145, -0.1111814, -0.05502108, 0.7586042, -0.05818377, 0.2519488, -0.4665135, -0.1264972, 0.2602723, -0.08766216, -0.3671907, 0.6428129, 0.3999204, -0.6105871, -0.1246869, -0.4589451, -0.7646643, -0.03021116, -0.7899352, -0.6036922, -0.4293956, -0.2481938, 0.6534185, 0.102798, 0.6784465, -0.6392644, 0.4821358, -0.6789002, 0.1779133, -0.9140783, -0.1989647, -0.9262617, 0.3381507, 0.4794891, -0.8093274, 0.3959447, 0.668478, 0.9602883, 0.2272305, -0.123672, 0.9210883, 0.2375148, 0.9523395, -0.52898, 0.7973378, -0.382433, 0.1228794, 0.695015, 0.6948439, 0.7530277, -0.6458191, 0.8777987, -0.3272956, 0.2318525, -0.962768); + this._distributions[30] = new Array(0.4518921, -0.1146195, 0.4720805, -0.4238748, 0.3655423, 0.1806341, 0.1589939, -0.23568, 0.7673324, -0.5149941, 0.01163658, 0.09045836, 0.7010971, 0.1245747, 0.7518286, -0.1855433, 0.4960719, 0.4601022, 0.2566979, -0.6308268, -0.0654714, -0.5126389, -0.1823319, -0.1343282, -0.1464312, 0.4883236, -0.3858738, 0.203523, 0.1484799, 0.4432284, -0.477109, -0.116241, 0.2719092, 0.7208626, 0.9104174, 0.3578536, -0.5956199, 0.7662588, -0.6996251, 0.3678654, -0.2514512, 0.9251933, 0.1275825, -0.9478135, -0.204608, -0.8611552, 0.4264838, -0.877443, 0.9854161, 0.05521112, 0.5912951, 0.7997434, 0.1140349, 0.982093, -0.9324368, -0.2094094, -0.42436, -0.6441524, -0.6722705, -0.3554261, -0.7844236, 0.08587621); + this._distributions[31] = new Array(-0.4206714, -0.5613642, -0.8733016, -0.3373051, -0.1046226, -0.2902999, -0.1318562, -0.8434365, 0.1145093, -0.5962623, -0.4965627, -0.1873259, -0.5011808, -0.8546229, -0.7165636, -0.5743566, 0.1090901, 0.2017643, 0.3404809, -0.220455, -0.1989015, 0.2372122, -0.4538706, 0.0979171, 0.4514146, -0.572846, 0.2314168, -0.8514503, -0.4247236, 0.5650803, -0.943347, 0.04514639, -0.1309718, 0.5221877, -0.7004157, 0.4561877, 0.6306441, 0.04448673, 0.4301621, 0.5766876, 0.1078042, 0.7245752, 0.3875354, 0.2794483, 0.702876, -0.2924213, 0.7360667, -0.6210318, 0.7486517, 0.6531103, 0.4898235, 0.8591025, 0.6549174, 0.3854057, -0.2596106, 0.7916998, 0.9251194, -0.05296265, -0.5620695, 0.820877, -0.01228026, 0.9937211, 0.9612103, 0.2628758); + } + + public static getDistribution(n:number /*int*/):Array + { + if (!this._distributions) + this.initDistributions(); + + if (n < 2 || n > 32) + return null; + + return this._distributions[n - 1]; + } +} + +export = PoissonLookup; \ No newline at end of file diff --git a/lib/core/geom/Quaternion.js b/lib/core/geom/Quaternion.js new file mode 100755 index 00000000..2ae9a54a --- /dev/null +++ b/lib/core/geom/Quaternion.js @@ -0,0 +1,371 @@ +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +var Orientation3D = require("awayjs-core/lib/core/geom/Orientation3D"); +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* A Quaternion object which can be used to represent rotations. +*/ +var Quaternion = (function () { + /** + * Creates a new Quaternion object. + * @param x The x value of the quaternion. + * @param y The y value of the quaternion. + * @param z The z value of the quaternion. + * @param w The w value of the quaternion. + */ + function Quaternion(x, y, z, w) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof z === "undefined") { z = 0; } + if (typeof w === "undefined") { w = 1; } + /** + * The x value of the quaternion. + */ + this.x = 0; + /** + * The y value of the quaternion. + */ + this.y = 0; + /** + * The z value of the quaternion. + */ + this.z = 0; + /** + * The w value of the quaternion. + */ + this.w = 1; + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + Object.defineProperty(Quaternion.prototype, "magnitude", { + /** + * Returns the magnitude of the quaternion object. + */ + get: function () { + return Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); + }, + enumerable: true, + configurable: true + }); + + /** + * Fills the quaternion object with the result from a multiplication of two quaternion objects. + * + * @param qa The first quaternion in the multiplication. + * @param qb The second quaternion in the multiplication. + */ + Quaternion.prototype.multiply = function (qa, qb) { + var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; + var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; + + this.w = w1 * w2 - x1 * x2 - y1 * y2 - z1 * z2; + this.x = w1 * x2 + x1 * w2 + y1 * z2 - z1 * y2; + this.y = w1 * y2 - x1 * z2 + y1 * w2 + z1 * x2; + this.z = w1 * z2 + x1 * y2 - y1 * x2 + z1 * w2; + }; + + Quaternion.prototype.multiplyVector = function (vector, target) { + if (typeof target === "undefined") { target = null; } + //target ||= new Quaternion(); + if (target === null) { + target = new Quaternion(); + } + + var x2 = vector.x; + var y2 = vector.y; + var z2 = vector.z; + + target.w = -this.x * x2 - this.y * y2 - this.z * z2; + target.x = this.w * x2 + this.y * z2 - this.z * y2; + target.y = this.w * y2 - this.x * z2 + this.z * x2; + target.z = this.w * z2 + this.x * y2 - this.y * x2; + + return target; + }; + + /** + * Fills the quaternion object with values representing the given rotation around a vector. + * + * @param axis The axis around which to rotate + * @param angle The angle in radians of the rotation. + */ + Quaternion.prototype.fromAxisAngle = function (axis, angle) { + var sin_a = Math.sin(angle / 2); + var cos_a = Math.cos(angle / 2); + + this.x = axis.x * sin_a; + this.y = axis.y * sin_a; + this.z = axis.z * sin_a; + this.w = cos_a; + + this.normalize(); + }; + + /** + * Spherically interpolates between two quaternions, providing an interpolation between rotations with constant angle change rate. + * @param qa The first quaternion to interpolate. + * @param qb The second quaternion to interpolate. + * @param t The interpolation weight, a value between 0 and 1. + */ + Quaternion.prototype.slerp = function (qa, qb, t) { + var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; + var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; + var dot = w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2; + + // shortest direction + if (dot < 0) { + dot = -dot; + w2 = -w2; + x2 = -x2; + y2 = -y2; + z2 = -z2; + } + + if (dot < 0.95) { + // interpolate angle linearly + var angle = Math.acos(dot); + var s = 1 / Math.sin(angle); + var s1 = Math.sin(angle * (1 - t)) * s; + var s2 = Math.sin(angle * t) * s; + this.w = w1 * s1 + w2 * s2; + this.x = x1 * s1 + x2 * s2; + this.y = y1 * s1 + y2 * s2; + this.z = z1 * s1 + z2 * s2; + } else { + // nearly identical angle, interpolate linearly + this.w = w1 + t * (w2 - w1); + this.x = x1 + t * (x2 - x1); + this.y = y1 + t * (y2 - y1); + this.z = z1 + t * (z2 - z1); + var len = 1.0 / Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); + this.w *= len; + this.x *= len; + this.y *= len; + this.z *= len; + } + }; + + /** + * Linearly interpolates between two quaternions. + * @param qa The first quaternion to interpolate. + * @param qb The second quaternion to interpolate. + * @param t The interpolation weight, a value between 0 and 1. + */ + Quaternion.prototype.lerp = function (qa, qb, t) { + var w1 = qa.w, x1 = qa.x, y1 = qa.y, z1 = qa.z; + var w2 = qb.w, x2 = qb.x, y2 = qb.y, z2 = qb.z; + var len; + + // shortest direction + if (w1 * w2 + x1 * x2 + y1 * y2 + z1 * z2 < 0) { + w2 = -w2; + x2 = -x2; + y2 = -y2; + z2 = -z2; + } + + this.w = w1 + t * (w2 - w1); + this.x = x1 + t * (x2 - x1); + this.y = y1 + t * (y2 - y1); + this.z = z1 + t * (z2 - z1); + + len = 1.0 / Math.sqrt(this.w * this.w + this.x * this.x + this.y * this.y + this.z * this.z); + this.w *= len; + this.x *= len; + this.y *= len; + this.z *= len; + }; + + /** + * Fills the quaternion object with values representing the given euler rotation. + * + * @param ax The angle in radians of the rotation around the ax axis. + * @param ay The angle in radians of the rotation around the ay axis. + * @param az The angle in radians of the rotation around the az axis. + */ + Quaternion.prototype.fromEulerAngles = function (ax, ay, az) { + var halfX = ax * .5, halfY = ay * .5, halfZ = az * .5; + var cosX = Math.cos(halfX), sinX = Math.sin(halfX); + var cosY = Math.cos(halfY), sinY = Math.sin(halfY); + var cosZ = Math.cos(halfZ), sinZ = Math.sin(halfZ); + + this.w = cosX * cosY * cosZ + sinX * sinY * sinZ; + this.x = sinX * cosY * cosZ - cosX * sinY * sinZ; + this.y = cosX * sinY * cosZ + sinX * cosY * sinZ; + this.z = cosX * cosY * sinZ - sinX * sinY * cosZ; + }; + + /** + * Fills a target Vector3D object with the Euler angles that form the rotation represented by this quaternion. + * @param target An optional Vector3D object to contain the Euler angles. If not provided, a new object is created. + * @return The Vector3D containing the Euler angles. + */ + Quaternion.prototype.toEulerAngles = function (target) { + if (typeof target === "undefined") { target = null; } + //target ||= new Vector3D(); + if (target === null) { + target = new Vector3D(); + } + + target.x = Math.atan2(2 * (this.w * this.x + this.y * this.z), 1 - 2 * (this.x * this.x + this.y * this.y)); + target.y = Math.asin(2 * (this.w * this.y - this.z * this.x)); + target.z = Math.atan2(2 * (this.w * this.z + this.x * this.y), 1 - 2 * (this.y * this.y + this.z * this.z)); + + return target; + }; + + /** + * Normalises the quaternion object. + */ + Quaternion.prototype.normalize = function (val) { + if (typeof val === "undefined") { val = 1; } + var mag = val / Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w); + + this.x *= mag; + this.y *= mag; + this.z *= mag; + this.w *= mag; + }; + + /** + * Used to trace the values of a quaternion. + * + * @return A string representation of the quaternion object. + */ + Quaternion.prototype.toString = function () { + return "{x:" + this.x + " y:" + this.y + " z:" + this.z + " w:" + this.w + "}"; + }; + + /** + * Converts the quaternion to a Matrix3D object representing an equivalent rotation. + * @param target An optional Matrix3D container to store the transformation in. If not provided, a new object is created. + * @return A Matrix3D object representing an equivalent rotation. + */ + Quaternion.prototype.toMatrix3D = function (target) { + if (typeof target === "undefined") { target = null; } + var rawData = Matrix3DUtils.RAW_DATA_CONTAINER; + var xy2 = 2.0 * this.x * this.y, xz2 = 2.0 * this.x * this.z, xw2 = 2.0 * this.x * this.w; + var yz2 = 2.0 * this.y * this.z, yw2 = 2.0 * this.y * this.w, zw2 = 2.0 * this.z * this.w; + var xx = this.x * this.x, yy = this.y * this.y, zz = this.z * this.z, ww = this.w * this.w; + + rawData[0] = xx - yy - zz + ww; + rawData[4] = xy2 - zw2; + rawData[8] = xz2 + yw2; + rawData[12] = 0; + rawData[1] = xy2 + zw2; + rawData[5] = -xx + yy - zz + ww; + rawData[9] = yz2 - xw2; + rawData[13] = 0; + rawData[2] = xz2 - yw2; + rawData[6] = yz2 + xw2; + rawData[10] = -xx - yy + zz + ww; + rawData[14] = 0; + rawData[3] = 0.0; + rawData[7] = 0.0; + rawData[11] = 0; + rawData[15] = 1; + + if (!target) + return new Matrix3D(rawData); + + target.copyRawDataFrom(rawData); + + return target; + }; + + /** + * Extracts a quaternion rotation matrix out of a given Matrix3D object. + * @param matrix The Matrix3D out of which the rotation will be extracted. + */ + Quaternion.prototype.fromMatrix = function (matrix) { + var v = matrix.decompose(Orientation3D.QUATERNION)[1]; + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = v.w; + }; + + /** + * Converts the quaternion to a Vector.<Number> matrix representation of a rotation equivalent to this quaternion. + * @param target The Vector.<Number> to contain the raw matrix data. + * @param exclude4thRow If true, the last row will be omitted, and a 4x3 matrix will be generated instead of a 4x4. + */ + Quaternion.prototype.toRawData = function (target, exclude4thRow) { + if (typeof exclude4thRow === "undefined") { exclude4thRow = false; } + var xy2 = 2.0 * this.x * this.y, xz2 = 2.0 * this.x * this.z, xw2 = 2.0 * this.x * this.w; + var yz2 = 2.0 * this.y * this.z, yw2 = 2.0 * this.y * this.w, zw2 = 2.0 * this.z * this.w; + var xx = this.x * this.x, yy = this.y * this.y, zz = this.z * this.z, ww = this.w * this.w; + + target[0] = xx - yy - zz + ww; + target[1] = xy2 - zw2; + target[2] = xz2 + yw2; + target[4] = xy2 + zw2; + target[5] = -xx + yy - zz + ww; + target[6] = yz2 - xw2; + target[8] = xz2 - yw2; + target[9] = yz2 + xw2; + target[10] = -xx - yy + zz + ww; + target[3] = target[7] = target[11] = 0; + + if (!exclude4thRow) { + target[12] = target[13] = target[14] = 0; + target[15] = 1; + } + }; + + /** + * Clones the quaternion. + * @return An exact duplicate of the current Quaternion. + */ + Quaternion.prototype.clone = function () { + return new Quaternion(this.x, this.y, this.z, this.w); + }; + + /** + * Rotates a point. + * @param vector The Vector3D object to be rotated. + * @param target An optional Vector3D object that will contain the rotated coordinates. If not provided, a new object will be created. + * @return A Vector3D object containing the rotated point. + */ + Quaternion.prototype.rotatePoint = function (vector, target) { + if (typeof target === "undefined") { target = null; } + var x1, y1, z1, w1; + var x2 = vector.x, y2 = vector.y, z2 = vector.z; + + //target ||= new Vector3D(); + if (target === null) { + target = new Vector3D(); + } + + // p*q' + w1 = -this.x * x2 - this.y * y2 - this.z * z2; + x1 = this.w * x2 + this.y * z2 - this.z * y2; + y1 = this.w * y2 - this.x * z2 + this.z * x2; + z1 = this.w * z2 + this.x * y2 - this.y * x2; + + target.x = -w1 * this.x + x1 * this.w - y1 * this.z + z1 * this.y; + target.y = -w1 * this.y + x1 * this.z + y1 * this.w - z1 * this.x; + target.z = -w1 * this.z - x1 * this.y + y1 * this.x + z1 * this.w; + + return target; + }; + + /** + * Copies the data from a quaternion into this instance. + * @param q The quaternion to copy from. + */ + Quaternion.prototype.copyFrom = function (q) { + this.x = q.x; + this.y = q.y; + this.z = q.z; + this.w = q.w; + }; + return Quaternion; +})(); + +module.exports = Quaternion; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9RdWF0ZXJuaW9uLnRzIl0sIm5hbWVzIjpbIlF1YXRlcm5pb24iLCJRdWF0ZXJuaW9uLmNvbnN0cnVjdG9yIiwiUXVhdGVybmlvbi5tdWx0aXBseSIsIlF1YXRlcm5pb24ubXVsdGlwbHlWZWN0b3IiLCJRdWF0ZXJuaW9uLmZyb21BeGlzQW5nbGUiLCJRdWF0ZXJuaW9uLnNsZXJwIiwiUXVhdGVybmlvbi5sZXJwIiwiUXVhdGVybmlvbi5mcm9tRXVsZXJBbmdsZXMiLCJRdWF0ZXJuaW9uLnRvRXVsZXJBbmdsZXMiLCJRdWF0ZXJuaW9uLm5vcm1hbGl6ZSIsIlF1YXRlcm5pb24udG9TdHJpbmciLCJRdWF0ZXJuaW9uLnRvTWF0cml4M0QiLCJRdWF0ZXJuaW9uLmZyb21NYXRyaXgiLCJRdWF0ZXJuaW9uLnRvUmF3RGF0YSIsIlF1YXRlcm5pb24uY2xvbmUiLCJRdWF0ZXJuaW9uLnJvdGF0ZVBvaW50IiwiUXVhdGVybmlvbi5jb3B5RnJvbSJdLCJtYXBwaW5ncyI6IkFBQUEsc0VBQTJFO0FBQzNFLHNFQUEyRTtBQUMzRSw0REFBbUU7QUFDbkUsNERBQW1FOztBQUVuRTs7RUFFRztBQUNIO0lBNkJDQTs7Ozs7O01BREdBO0lBQ0hBLG9CQUFZQSxDQUFZQSxFQUFFQSxDQUFZQSxFQUFFQSxDQUFZQSxFQUFFQSxDQUFZQTtRQUF0REMsZ0NBQUFBLENBQUNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLGdDQUFBQSxDQUFDQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxnQ0FBQUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsZ0NBQUFBLENBQUNBLEdBQVVBLENBQUNBO0FBQUFBLFFBM0JsRUE7O1VBRUdBO1FBQ0hBLEtBQU9BLENBQUNBLEdBQVVBLENBQUNBLENBQUNBO1FBRXBCQTs7VUFFR0E7UUFDSEEsS0FBT0EsQ0FBQ0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFFcEJBOztVQUVHQTtRQUNIQSxLQUFPQSxDQUFDQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUVwQkE7O1VBRUdBO1FBQ0hBLEtBQU9BLENBQUNBLEdBQVVBLENBQUNBLENBQUNBO1FBV25CQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtJQUNYQSxDQUFDQTtJQUtERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDaEZBLENBQUNBOzs7O0FBQUFBO0lBUURBOzs7OztNQURHQTtvQ0FDSEEsVUFBZ0JBLEVBQWFBLEVBQUVBLEVBQWFBO1FBRTNDRSxJQUFJQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUMxRUEsSUFBSUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7O1FBRTFFQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQTtRQUN0Q0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUE7UUFDdENBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBO1FBQ3RDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQTtJQUN2Q0EsQ0FBQ0E7O0lBRURGLHNDQUFBQSxVQUFzQkEsTUFBZUEsRUFBRUEsTUFBd0JBO1FBQXhCRyxxQ0FBQUEsTUFBTUEsR0FBY0EsSUFBSUE7QUFBQUEsUUFFOURBLDhCQUE4QkE7UUFDOUJBLElBQUlBLE1BQU1BLEtBQUtBLElBQUlBLENBQUVBO1lBQ3BCQSxNQUFNQSxHQUFHQSxJQUFJQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUV6QkE7O1FBR0RBLElBQUlBLEVBQUVBLEdBQVVBLE1BQU1BLENBQUNBLENBQUNBO1FBQ3hCQSxJQUFJQSxFQUFFQSxHQUFVQSxNQUFNQSxDQUFDQSxDQUFDQTtRQUN4QkEsSUFBSUEsRUFBRUEsR0FBVUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7O1FBRXhCQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQTtRQUM3Q0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7UUFDNUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBO1FBQzVDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQTs7UUFFNUNBLE9BQU9BLE1BQU1BO0lBQ2RBLENBQUNBOztJQVFESDs7Ozs7TUFER0E7eUNBQ0hBLFVBQXFCQSxJQUFhQSxFQUFFQSxLQUFZQTtRQUUvQ0ksSUFBSUEsS0FBS0EsR0FBVUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDcENBLElBQUlBLEtBQUtBLEdBQVVBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEdBQUNBLENBQUNBLENBQUNBOztRQUVwQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsS0FBS0E7UUFDckJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEtBQUtBO1FBQ3JCQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxLQUFLQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7O1FBRWRBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO0lBQ2pCQSxDQUFDQTs7SUFRREo7Ozs7O01BREdBO2lDQUNIQSxVQUFhQSxFQUFhQSxFQUFFQSxFQUFhQSxFQUFFQSxDQUFRQTtRQUVsREssSUFBSUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDMUVBLElBQUlBLEVBQUVBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBO1FBQzFFQSxJQUFJQSxHQUFHQSxHQUFVQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQTs7UUFFOUNBLHFCQUFxQkE7UUFDckJBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBLENBQUVBO1lBQ1pBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBO1lBQ1ZBLEVBQUVBLEdBQUdBLENBQUNBLEVBQUVBO1lBQ1JBLEVBQUVBLEdBQUdBLENBQUNBLEVBQUVBO1lBQ1JBLEVBQUVBLEdBQUdBLENBQUNBLEVBQUVBO1lBQ1JBLEVBQUVBLEdBQUdBLENBQUNBLEVBQUVBO1NBQ1JBOztRQUVEQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFFQTtZQUNmQSw2QkFBNkJBO1lBQzdCQSxJQUFJQSxLQUFLQSxHQUFVQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNqQ0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7WUFDaENBLElBQUlBLEVBQUVBLEdBQVVBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBO1lBQ3pDQSxJQUFJQSxFQUFFQSxHQUFVQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQTtZQUNuQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUE7WUFDdEJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBO1lBQ3RCQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQTtZQUN0QkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBQ0EsRUFBRUE7U0FDdEJBLEtBQU1BO1lBQ05BLCtDQUErQ0E7WUFDL0NBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBO1lBQ3pCQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxDQUFDQTtZQUN6QkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0E7WUFDekJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBO1lBQ3pCQSxJQUFJQSxHQUFHQSxHQUFVQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtZQUM3RkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7WUFDYkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7WUFDYkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7WUFDYkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7U0FDYkE7SUFDRkEsQ0FBQ0E7O0lBUURMOzs7OztNQURHQTtnQ0FDSEEsVUFBWUEsRUFBYUEsRUFBRUEsRUFBYUEsRUFBRUEsQ0FBUUE7UUFFakRNLElBQUlBLEVBQUVBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLEVBQUVBLENBQUNBLENBQUNBO1FBQzFFQSxJQUFJQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUMxRUEsSUFBSUEsR0FBR0E7O1FBRVBBLHFCQUFxQkE7UUFDckJBLElBQUlBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUNBLEVBQUVBLEdBQUdBLENBQUNBLENBQUVBO1lBQ3RDQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQTtZQUNSQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQTtZQUNSQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQTtZQUNSQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQTtTQUNSQTs7UUFFREEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0E7UUFDekJBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBO1FBQ3pCQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxDQUFDQTtRQUN6QkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0E7O1FBRXpCQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNsRkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7UUFDYkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7UUFDYkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7UUFDYkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0E7SUFDZEEsQ0FBQ0E7O0lBU0ROOzs7Ozs7TUFER0E7MkNBQ0hBLFVBQXVCQSxFQUFTQSxFQUFFQSxFQUFTQSxFQUFFQSxFQUFTQTtRQUVyRE8sSUFBSUEsS0FBS0EsR0FBVUEsRUFBRUEsR0FBQ0EsRUFBRUEsRUFBRUEsS0FBS0EsR0FBVUEsRUFBRUEsR0FBQ0EsRUFBRUEsRUFBRUEsS0FBS0EsR0FBVUEsRUFBRUEsR0FBQ0EsRUFBRUE7UUFDcEVBLElBQUlBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBO1FBQ2hFQSxJQUFJQSxJQUFJQSxHQUFVQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxFQUFFQSxJQUFJQSxHQUFVQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUNoRUEsSUFBSUEsSUFBSUEsR0FBVUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsSUFBSUEsR0FBVUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7O1FBRWhFQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFDQSxJQUFJQTtRQUN4Q0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBQ0EsSUFBSUEsR0FBQ0EsSUFBSUE7UUFDeENBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUNBLElBQUlBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBLEdBQUNBLElBQUlBO1FBQ3hDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFDQSxJQUFJQTtJQUN6Q0EsQ0FBQ0E7O0lBT0RQOzs7O01BREdBO3lDQUNIQSxVQUFxQkEsTUFBc0JBO1FBQXRCUSxxQ0FBQUEsTUFBTUEsR0FBWUEsSUFBSUE7QUFBQUEsUUFHMUNBLDRCQUE0QkE7UUFDNUJBLElBQUlBLE1BQU1BLEtBQUtBLElBQUlBLENBQUVBO1lBRXBCQSxNQUFNQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUV2QkE7O1FBRURBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1FBQy9GQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUN2REEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRS9GQSxPQUFPQSxNQUFNQTtJQUNkQSxDQUFDQTs7SUFLRFI7O01BREdBO3FDQUNIQSxVQUFpQkEsR0FBY0E7UUFBZFMsa0NBQUFBLEdBQUdBLEdBQVVBLENBQUNBO0FBQUFBLFFBRTlCQSxJQUFJQSxHQUFHQSxHQUFVQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFN0ZBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBO1FBQ2JBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBO1FBQ2JBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBO1FBQ2JBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBO0lBQ2RBLENBQUNBOztJQU9EVDs7OztNQURHQTtvQ0FDSEE7UUFFQ1UsT0FBT0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0E7SUFDL0VBLENBQUNBOztJQU9EVjs7OztNQURHQTtzQ0FDSEEsVUFBa0JBLE1BQXNCQTtRQUF0QlcscUNBQUFBLE1BQU1BLEdBQVlBLElBQUlBO0FBQUFBLFFBRXZDQSxJQUFJQSxPQUFPQSxHQUFZQSxhQUFhQSxDQUFDQSxrQkFBa0JBO1FBQ3ZEQSxJQUFJQSxHQUFHQSxHQUFVQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxHQUFVQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxHQUFVQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUNsR0EsSUFBSUEsR0FBR0EsR0FBVUEsR0FBR0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBVUEsR0FBR0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBVUEsR0FBR0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7UUFDbEdBLElBQUlBLEVBQUVBLEdBQVVBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBOztRQUU5R0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUE7UUFDOUJBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ3RCQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUN0QkEsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDZkEsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDdEJBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBO1FBQy9CQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUN0QkEsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDZkEsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDdEJBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ3RCQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQTtRQUNoQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDZkEsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0E7UUFDaEJBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBO1FBQ2hCQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNmQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFZkEsSUFBSUEsQ0FBQ0EsTUFBTUE7WUFDVkEsT0FBT0EsSUFBSUEsUUFBUUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7O1FBRTlCQSxNQUFNQSxDQUFDQSxlQUFlQSxDQUFDQSxPQUFPQSxDQUFDQTs7UUFFL0JBLE9BQU9BLE1BQU1BO0lBQ2RBLENBQUNBOztJQU1EWDs7O01BREdBO3NDQUNIQSxVQUFrQkEsTUFBZUE7UUFFaENZLElBQUlBLENBQUNBLEdBQVlBLE1BQU1BLENBQUNBLFNBQVNBLENBQUNBLGFBQWFBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1FBQzlEQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUNiQSxDQUFDQTs7SUFPRFo7Ozs7TUFER0E7cUNBQ0hBLFVBQWlCQSxNQUFlQSxFQUFFQSxhQUE2QkE7UUFBN0JhLDRDQUFBQSxhQUFhQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUU5REEsSUFBSUEsR0FBR0EsR0FBVUEsR0FBR0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBVUEsR0FBR0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsR0FBVUEsR0FBR0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7UUFDbEdBLElBQUlBLEdBQUdBLEdBQVVBLEdBQUdBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEdBQVVBLEdBQUdBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLEdBQVVBLEdBQUdBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBO1FBQ2xHQSxJQUFJQSxFQUFFQSxHQUFVQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFVQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTs7UUFFOUdBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBO1FBQzdCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUNyQkEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDckJBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ3JCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQTtRQUM5QkEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDckJBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ3JCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUNyQkEsTUFBTUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUE7UUFDL0JBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztRQUV0Q0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBRUE7WUFDbkJBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1lBQ3hDQSxNQUFNQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTtTQUNkQTtJQUNGQSxDQUFDQTs7SUFNRGI7OztNQURHQTtpQ0FDSEE7UUFFQ2MsT0FBT0EsSUFBSUEsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDdERBLENBQUNBOztJQVFEZDs7Ozs7TUFER0E7dUNBQ0hBLFVBQW1CQSxNQUFlQSxFQUFFQSxNQUFzQkE7UUFBdEJlLHFDQUFBQSxNQUFNQSxHQUFZQSxJQUFJQTtBQUFBQSxRQUV6REEsSUFBSUEsRUFBRUEsRUFBU0EsRUFBRUEsRUFBU0EsRUFBRUEsRUFBU0EsRUFBRUE7UUFDdkNBLElBQUlBLEVBQUVBLEdBQVVBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEdBQVVBLE1BQU1BLENBQUNBLENBQUNBOztRQUVwRUEsNEJBQTRCQTtRQUM1QkEsSUFBSUEsTUFBTUEsS0FBS0EsSUFBSUEsQ0FBRUE7WUFFcEJBLE1BQU1BLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBO1NBRXZCQTs7UUFFREEsT0FBT0E7UUFDUEEsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7UUFDdkNBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBO1FBQ3RDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQTtRQUN0Q0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7O1FBRXRDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUN6REEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7UUFDekRBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLElBQUlBLENBQUNBLENBQUNBOztRQUV6REEsT0FBT0EsTUFBTUE7SUFDZEEsQ0FBQ0E7O0lBTURmOzs7TUFER0E7b0NBQ0hBLFVBQWdCQSxDQUFZQTtRQUUzQmdCLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ1pBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ1pBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1FBQ1pBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO0lBQ2JBLENBQUNBO0lBQ0ZoQixrQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCwyQkFBb0IsQ0FBQSIsImZpbGUiOiJjb3JlL2dlb20vUXVhdGVybmlvbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXRyaXgzRFV0aWxzXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RVdGlsc1wiKTtcbmltcG9ydCBPcmllbnRhdGlvbjNEXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vT3JpZW50YXRpb24zRFwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcblxuLyoqXG4gKiBBIFF1YXRlcm5pb24gb2JqZWN0IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCByb3RhdGlvbnMuXG4gKi9cbmNsYXNzIFF1YXRlcm5pb25cbntcblx0LyoqXG5cdCAqIFRoZSB4IHZhbHVlIG9mIHRoZSBxdWF0ZXJuaW9uLlxuXHQgKi9cblx0cHVibGljIHg6bnVtYmVyID0gMDtcblxuXHQvKipcblx0ICogVGhlIHkgdmFsdWUgb2YgdGhlIHF1YXRlcm5pb24uXG5cdCAqL1xuXHRwdWJsaWMgeTpudW1iZXIgPSAwO1xuXG5cdC8qKlxuXHQgKiBUaGUgeiB2YWx1ZSBvZiB0aGUgcXVhdGVybmlvbi5cblx0ICovXG5cdHB1YmxpYyB6Om51bWJlciA9IDA7XG5cblx0LyoqXG5cdCAqIFRoZSB3IHZhbHVlIG9mIHRoZSBxdWF0ZXJuaW9uLlxuXHQgKi9cblx0cHVibGljIHc6bnVtYmVyID0gMTtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBRdWF0ZXJuaW9uIG9iamVjdC5cblx0ICogQHBhcmFtIHggVGhlIHggdmFsdWUgb2YgdGhlIHF1YXRlcm5pb24uXG5cdCAqIEBwYXJhbSB5IFRoZSB5IHZhbHVlIG9mIHRoZSBxdWF0ZXJuaW9uLlxuXHQgKiBAcGFyYW0geiBUaGUgeiB2YWx1ZSBvZiB0aGUgcXVhdGVybmlvbi5cblx0ICogQHBhcmFtIHcgVGhlIHcgdmFsdWUgb2YgdGhlIHF1YXRlcm5pb24uXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih4Om51bWJlciA9IDAsIHk6bnVtYmVyID0gMCwgejpudW1iZXIgPSAwLCB3Om51bWJlciA9IDEpXG5cdHtcblx0XHR0aGlzLnggPSB4O1xuXHRcdHRoaXMueSA9IHk7XG5cdFx0dGhpcy56ID0gejtcblx0XHR0aGlzLncgPSB3O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG1hZ25pdHVkZSBvZiB0aGUgcXVhdGVybmlvbiBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1hZ25pdHVkZSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIE1hdGguc3FydCh0aGlzLncqdGhpcy53ICsgdGhpcy54KnRoaXMueCArIHRoaXMueSp0aGlzLnkgKyB0aGlzLnoqdGhpcy56KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGaWxscyB0aGUgcXVhdGVybmlvbiBvYmplY3Qgd2l0aCB0aGUgcmVzdWx0IGZyb20gYSBtdWx0aXBsaWNhdGlvbiBvZiB0d28gcXVhdGVybmlvbiBvYmplY3RzLlxuXHQgKlxuXHQgKiBAcGFyYW0gICAgcWEgICAgVGhlIGZpcnN0IHF1YXRlcm5pb24gaW4gdGhlIG11bHRpcGxpY2F0aW9uLlxuXHQgKiBAcGFyYW0gICAgcWIgICAgVGhlIHNlY29uZCBxdWF0ZXJuaW9uIGluIHRoZSBtdWx0aXBsaWNhdGlvbi5cblx0ICovXG5cdHB1YmxpYyBtdWx0aXBseShxYTpRdWF0ZXJuaW9uLCBxYjpRdWF0ZXJuaW9uKVxuXHR7XG5cdFx0dmFyIHcxOm51bWJlciA9IHFhLncsIHgxOm51bWJlciA9IHFhLngsIHkxOm51bWJlciA9IHFhLnksIHoxOm51bWJlciA9IHFhLno7XG5cdFx0dmFyIHcyOm51bWJlciA9IHFiLncsIHgyOm51bWJlciA9IHFiLngsIHkyOm51bWJlciA9IHFiLnksIHoyOm51bWJlciA9IHFiLno7XG5cblx0XHR0aGlzLncgPSB3MSp3MiAtIHgxKngyIC0geTEqeTIgLSB6MSp6Mjtcblx0XHR0aGlzLnggPSB3MSp4MiArIHgxKncyICsgeTEqejIgLSB6MSp5Mjtcblx0XHR0aGlzLnkgPSB3MSp5MiAtIHgxKnoyICsgeTEqdzIgKyB6MSp4Mjtcblx0XHR0aGlzLnogPSB3MSp6MiArIHgxKnkyIC0geTEqeDIgKyB6MSp3Mjtcblx0fVxuXG5cdHB1YmxpYyBtdWx0aXBseVZlY3Rvcih2ZWN0b3I6VmVjdG9yM0QsIHRhcmdldDpRdWF0ZXJuaW9uID0gbnVsbCk6UXVhdGVybmlvblxuXHR7XG5cdFx0Ly90YXJnZXQgfHw9IG5ldyBRdWF0ZXJuaW9uKCk7XG5cdFx0aWYgKHRhcmdldCA9PT0gbnVsbCkge1xuXHRcdFx0dGFyZ2V0ID0gbmV3IFF1YXRlcm5pb24oKTtcblxuXHRcdH1cblxuXG5cdFx0dmFyIHgyOm51bWJlciA9IHZlY3Rvci54O1xuXHRcdHZhciB5MjpudW1iZXIgPSB2ZWN0b3IueTtcblx0XHR2YXIgejI6bnVtYmVyID0gdmVjdG9yLno7XG5cblx0XHR0YXJnZXQudyA9IC10aGlzLngqeDIgLSB0aGlzLnkqeTIgLSB0aGlzLnoqejI7XG5cdFx0dGFyZ2V0LnggPSB0aGlzLncqeDIgKyB0aGlzLnkqejIgLSB0aGlzLnoqeTI7XG5cdFx0dGFyZ2V0LnkgPSB0aGlzLncqeTIgLSB0aGlzLngqejIgKyB0aGlzLnoqeDI7XG5cdFx0dGFyZ2V0LnogPSB0aGlzLncqejIgKyB0aGlzLngqeTIgLSB0aGlzLnkqeDI7XG5cblx0XHRyZXR1cm4gdGFyZ2V0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBxdWF0ZXJuaW9uIG9iamVjdCB3aXRoIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIHJvdGF0aW9uIGFyb3VuZCBhIHZlY3Rvci5cblx0ICpcblx0ICogQHBhcmFtICAgIGF4aXMgICAgVGhlIGF4aXMgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZVxuXHQgKiBAcGFyYW0gICAgYW5nbGUgICAgVGhlIGFuZ2xlIGluIHJhZGlhbnMgb2YgdGhlIHJvdGF0aW9uLlxuXHQgKi9cblx0cHVibGljIGZyb21BeGlzQW5nbGUoYXhpczpWZWN0b3IzRCwgYW5nbGU6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIHNpbl9hOm51bWJlciA9IE1hdGguc2luKGFuZ2xlLzIpO1xuXHRcdHZhciBjb3NfYTpudW1iZXIgPSBNYXRoLmNvcyhhbmdsZS8yKTtcblxuXHRcdHRoaXMueCA9IGF4aXMueCpzaW5fYTtcblx0XHR0aGlzLnkgPSBheGlzLnkqc2luX2E7XG5cdFx0dGhpcy56ID0gYXhpcy56KnNpbl9hO1xuXHRcdHRoaXMudyA9IGNvc19hO1xuXG5cdFx0dGhpcy5ub3JtYWxpemUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTcGhlcmljYWxseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0d28gcXVhdGVybmlvbnMsIHByb3ZpZGluZyBhbiBpbnRlcnBvbGF0aW9uIGJldHdlZW4gcm90YXRpb25zIHdpdGggY29uc3RhbnQgYW5nbGUgY2hhbmdlIHJhdGUuXG5cdCAqIEBwYXJhbSBxYSBUaGUgZmlyc3QgcXVhdGVybmlvbiB0byBpbnRlcnBvbGF0ZS5cblx0ICogQHBhcmFtIHFiIFRoZSBzZWNvbmQgcXVhdGVybmlvbiB0byBpbnRlcnBvbGF0ZS5cblx0ICogQHBhcmFtIHQgVGhlIGludGVycG9sYXRpb24gd2VpZ2h0LCBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cblx0ICovXG5cdHB1YmxpYyBzbGVycChxYTpRdWF0ZXJuaW9uLCBxYjpRdWF0ZXJuaW9uLCB0Om51bWJlcilcblx0e1xuXHRcdHZhciB3MTpudW1iZXIgPSBxYS53LCB4MTpudW1iZXIgPSBxYS54LCB5MTpudW1iZXIgPSBxYS55LCB6MTpudW1iZXIgPSBxYS56O1xuXHRcdHZhciB3MjpudW1iZXIgPSBxYi53LCB4MjpudW1iZXIgPSBxYi54LCB5MjpudW1iZXIgPSBxYi55LCB6MjpudW1iZXIgPSBxYi56O1xuXHRcdHZhciBkb3Q6bnVtYmVyID0gdzEqdzIgKyB4MSp4MiArIHkxKnkyICsgejEqejI7XG5cblx0XHQvLyBzaG9ydGVzdCBkaXJlY3Rpb25cblx0XHRpZiAoZG90IDwgMCkge1xuXHRcdFx0ZG90ID0gLWRvdDtcblx0XHRcdHcyID0gLXcyO1xuXHRcdFx0eDIgPSAteDI7XG5cdFx0XHR5MiA9IC15Mjtcblx0XHRcdHoyID0gLXoyO1xuXHRcdH1cblxuXHRcdGlmIChkb3QgPCAwLjk1KSB7XG5cdFx0XHQvLyBpbnRlcnBvbGF0ZSBhbmdsZSBsaW5lYXJseVxuXHRcdFx0dmFyIGFuZ2xlOm51bWJlciA9IE1hdGguYWNvcyhkb3QpO1xuXHRcdFx0dmFyIHM6bnVtYmVyID0gMS9NYXRoLnNpbihhbmdsZSk7XG5cdFx0XHR2YXIgczE6bnVtYmVyID0gTWF0aC5zaW4oYW5nbGUqKDEgLSB0KSkqcztcblx0XHRcdHZhciBzMjpudW1iZXIgPSBNYXRoLnNpbihhbmdsZSp0KSpzO1xuXHRcdFx0dGhpcy53ID0gdzEqczEgKyB3MipzMjtcblx0XHRcdHRoaXMueCA9IHgxKnMxICsgeDIqczI7XG5cdFx0XHR0aGlzLnkgPSB5MSpzMSArIHkyKnMyO1xuXHRcdFx0dGhpcy56ID0gejEqczEgKyB6MipzMjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gbmVhcmx5IGlkZW50aWNhbCBhbmdsZSwgaW50ZXJwb2xhdGUgbGluZWFybHlcblx0XHRcdHRoaXMudyA9IHcxICsgdCoodzIgLSB3MSk7XG5cdFx0XHR0aGlzLnggPSB4MSArIHQqKHgyIC0geDEpO1xuXHRcdFx0dGhpcy55ID0geTEgKyB0Kih5MiAtIHkxKTtcblx0XHRcdHRoaXMueiA9IHoxICsgdCooejIgLSB6MSk7XG5cdFx0XHR2YXIgbGVuOm51bWJlciA9IDEuMC9NYXRoLnNxcnQodGhpcy53KnRoaXMudyArIHRoaXMueCp0aGlzLnggKyB0aGlzLnkqdGhpcy55ICsgdGhpcy56KnRoaXMueik7XG5cdFx0XHR0aGlzLncgKj0gbGVuO1xuXHRcdFx0dGhpcy54ICo9IGxlbjtcblx0XHRcdHRoaXMueSAqPSBsZW47XG5cdFx0XHR0aGlzLnogKj0gbGVuO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0d28gcXVhdGVybmlvbnMuXG5cdCAqIEBwYXJhbSBxYSBUaGUgZmlyc3QgcXVhdGVybmlvbiB0byBpbnRlcnBvbGF0ZS5cblx0ICogQHBhcmFtIHFiIFRoZSBzZWNvbmQgcXVhdGVybmlvbiB0byBpbnRlcnBvbGF0ZS5cblx0ICogQHBhcmFtIHQgVGhlIGludGVycG9sYXRpb24gd2VpZ2h0LCBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cblx0ICovXG5cdHB1YmxpYyBsZXJwKHFhOlF1YXRlcm5pb24sIHFiOlF1YXRlcm5pb24sIHQ6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIHcxOm51bWJlciA9IHFhLncsIHgxOm51bWJlciA9IHFhLngsIHkxOm51bWJlciA9IHFhLnksIHoxOm51bWJlciA9IHFhLno7XG5cdFx0dmFyIHcyOm51bWJlciA9IHFiLncsIHgyOm51bWJlciA9IHFiLngsIHkyOm51bWJlciA9IHFiLnksIHoyOm51bWJlciA9IHFiLno7XG5cdFx0dmFyIGxlbjpudW1iZXI7XG5cblx0XHQvLyBzaG9ydGVzdCBkaXJlY3Rpb25cblx0XHRpZiAodzEqdzIgKyB4MSp4MiArIHkxKnkyICsgejEqejIgPCAwKSB7XG5cdFx0XHR3MiA9IC13Mjtcblx0XHRcdHgyID0gLXgyO1xuXHRcdFx0eTIgPSAteTI7XG5cdFx0XHR6MiA9IC16Mjtcblx0XHR9XG5cblx0XHR0aGlzLncgPSB3MSArIHQqKHcyIC0gdzEpO1xuXHRcdHRoaXMueCA9IHgxICsgdCooeDIgLSB4MSk7XG5cdFx0dGhpcy55ID0geTEgKyB0Kih5MiAtIHkxKTtcblx0XHR0aGlzLnogPSB6MSArIHQqKHoyIC0gejEpO1xuXG5cdFx0bGVuID0gMS4wL01hdGguc3FydCh0aGlzLncqdGhpcy53ICsgdGhpcy54KnRoaXMueCArIHRoaXMueSp0aGlzLnkgKyB0aGlzLnoqdGhpcy56KTtcblx0XHR0aGlzLncgKj0gbGVuO1xuXHRcdHRoaXMueCAqPSBsZW47XG5cdFx0dGhpcy55ICo9IGxlbjtcblx0XHR0aGlzLnogKj0gbGVuO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIHRoZSBxdWF0ZXJuaW9uIG9iamVjdCB3aXRoIHZhbHVlcyByZXByZXNlbnRpbmcgdGhlIGdpdmVuIGV1bGVyIHJvdGF0aW9uLlxuXHQgKlxuXHQgKiBAcGFyYW0gICAgYXggICAgICAgIFRoZSBhbmdsZSBpbiByYWRpYW5zIG9mIHRoZSByb3RhdGlvbiBhcm91bmQgdGhlIGF4IGF4aXMuXG5cdCAqIEBwYXJhbSAgICBheSAgICAgICAgVGhlIGFuZ2xlIGluIHJhZGlhbnMgb2YgdGhlIHJvdGF0aW9uIGFyb3VuZCB0aGUgYXkgYXhpcy5cblx0ICogQHBhcmFtICAgIGF6ICAgICAgICBUaGUgYW5nbGUgaW4gcmFkaWFucyBvZiB0aGUgcm90YXRpb24gYXJvdW5kIHRoZSBheiBheGlzLlxuXHQgKi9cblx0cHVibGljIGZyb21FdWxlckFuZ2xlcyhheDpudW1iZXIsIGF5Om51bWJlciwgYXo6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIGhhbGZYOm51bWJlciA9IGF4Ki41LCBoYWxmWTpudW1iZXIgPSBheSouNSwgaGFsZlo6bnVtYmVyID0gYXoqLjU7XG5cdFx0dmFyIGNvc1g6bnVtYmVyID0gTWF0aC5jb3MoaGFsZlgpLCBzaW5YOm51bWJlciA9IE1hdGguc2luKGhhbGZYKTtcblx0XHR2YXIgY29zWTpudW1iZXIgPSBNYXRoLmNvcyhoYWxmWSksIHNpblk6bnVtYmVyID0gTWF0aC5zaW4oaGFsZlkpO1xuXHRcdHZhciBjb3NaOm51bWJlciA9IE1hdGguY29zKGhhbGZaKSwgc2luWjpudW1iZXIgPSBNYXRoLnNpbihoYWxmWik7XG5cblx0XHR0aGlzLncgPSBjb3NYKmNvc1kqY29zWiArIHNpblgqc2luWSpzaW5aO1xuXHRcdHRoaXMueCA9IHNpblgqY29zWSpjb3NaIC0gY29zWCpzaW5ZKnNpblo7XG5cdFx0dGhpcy55ID0gY29zWCpzaW5ZKmNvc1ogKyBzaW5YKmNvc1kqc2luWjtcblx0XHR0aGlzLnogPSBjb3NYKmNvc1kqc2luWiAtIHNpblgqc2luWSpjb3NaO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZpbGxzIGEgdGFyZ2V0IFZlY3RvcjNEIG9iamVjdCB3aXRoIHRoZSBFdWxlciBhbmdsZXMgdGhhdCBmb3JtIHRoZSByb3RhdGlvbiByZXByZXNlbnRlZCBieSB0aGlzIHF1YXRlcm5pb24uXG5cdCAqIEBwYXJhbSB0YXJnZXQgQW4gb3B0aW9uYWwgVmVjdG9yM0Qgb2JqZWN0IHRvIGNvbnRhaW4gdGhlIEV1bGVyIGFuZ2xlcy4gSWYgbm90IHByb3ZpZGVkLCBhIG5ldyBvYmplY3QgaXMgY3JlYXRlZC5cblx0ICogQHJldHVybiBUaGUgVmVjdG9yM0QgY29udGFpbmluZyB0aGUgRXVsZXIgYW5nbGVzLlxuXHQgKi9cblx0cHVibGljIHRvRXVsZXJBbmdsZXModGFyZ2V0OlZlY3RvcjNEID0gbnVsbCk6VmVjdG9yM0Rcblx0e1xuXG5cdFx0Ly90YXJnZXQgfHw9IG5ldyBWZWN0b3IzRCgpO1xuXHRcdGlmICh0YXJnZXQgPT09IG51bGwpIHtcblxuXHRcdFx0dGFyZ2V0ID0gbmV3IFZlY3RvcjNEKCk7XG5cblx0XHR9XG5cblx0XHR0YXJnZXQueCA9IE1hdGguYXRhbjIoMioodGhpcy53KnRoaXMueCArIHRoaXMueSp0aGlzLnopLCAxIC0gMioodGhpcy54KnRoaXMueCArIHRoaXMueSp0aGlzLnkpKTtcblx0XHR0YXJnZXQueSA9IE1hdGguYXNpbigyKih0aGlzLncqdGhpcy55IC0gdGhpcy56KnRoaXMueCkpO1xuXHRcdHRhcmdldC56ID0gTWF0aC5hdGFuMigyKih0aGlzLncqdGhpcy56ICsgdGhpcy54KnRoaXMueSksIDEgLSAyKih0aGlzLnkqdGhpcy55ICsgdGhpcy56KnRoaXMueikpO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblx0fVxuXG5cdC8qKlxuXHQgKiBOb3JtYWxpc2VzIHRoZSBxdWF0ZXJuaW9uIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBub3JtYWxpemUodmFsOm51bWJlciA9IDEpXG5cdHtcblx0XHR2YXIgbWFnOm51bWJlciA9IHZhbC9NYXRoLnNxcnQodGhpcy54KnRoaXMueCArIHRoaXMueSp0aGlzLnkgKyB0aGlzLnoqdGhpcy56ICsgdGhpcy53KnRoaXMudyk7XG5cblx0XHR0aGlzLnggKj0gbWFnO1xuXHRcdHRoaXMueSAqPSBtYWc7XG5cdFx0dGhpcy56ICo9IG1hZztcblx0XHR0aGlzLncgKj0gbWFnO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVzZWQgdG8gdHJhY2UgdGhlIHZhbHVlcyBvZiBhIHF1YXRlcm5pb24uXG5cdCAqXG5cdCAqIEByZXR1cm4gQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHF1YXRlcm5pb24gb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIHRvU3RyaW5nKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gXCJ7eDpcIiArIHRoaXMueCArIFwiIHk6XCIgKyB0aGlzLnkgKyBcIiB6OlwiICsgdGhpcy56ICsgXCIgdzpcIiArIHRoaXMudyArIFwifVwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIHRoZSBxdWF0ZXJuaW9uIHRvIGEgTWF0cml4M0Qgb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlcXVpdmFsZW50IHJvdGF0aW9uLlxuXHQgKiBAcGFyYW0gdGFyZ2V0IEFuIG9wdGlvbmFsIE1hdHJpeDNEIGNvbnRhaW5lciB0byBzdG9yZSB0aGUgdHJhbnNmb3JtYXRpb24gaW4uIElmIG5vdCBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IGlzIGNyZWF0ZWQuXG5cdCAqIEByZXR1cm4gQSBNYXRyaXgzRCBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGVxdWl2YWxlbnQgcm90YXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgdG9NYXRyaXgzRCh0YXJnZXQ6TWF0cml4M0QgPSBudWxsKTpNYXRyaXgzRFxuXHR7XG5cdFx0dmFyIHJhd0RhdGE6bnVtYmVyW10gPSBNYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjtcblx0XHR2YXIgeHkyOm51bWJlciA9IDIuMCp0aGlzLngqdGhpcy55LCB4ejI6bnVtYmVyID0gMi4wKnRoaXMueCp0aGlzLnosIHh3MjpudW1iZXIgPSAyLjAqdGhpcy54KnRoaXMudztcblx0XHR2YXIgeXoyOm51bWJlciA9IDIuMCp0aGlzLnkqdGhpcy56LCB5dzI6bnVtYmVyID0gMi4wKnRoaXMueSp0aGlzLncsIHp3MjpudW1iZXIgPSAyLjAqdGhpcy56KnRoaXMudztcblx0XHR2YXIgeHg6bnVtYmVyID0gdGhpcy54KnRoaXMueCwgeXk6bnVtYmVyID0gdGhpcy55KnRoaXMueSwgeno6bnVtYmVyID0gdGhpcy56KnRoaXMueiwgd3c6bnVtYmVyID0gdGhpcy53KnRoaXMudztcblxuXHRcdHJhd0RhdGFbMF0gPSB4eCAtIHl5IC0genogKyB3dztcblx0XHRyYXdEYXRhWzRdID0geHkyIC0gencyO1xuXHRcdHJhd0RhdGFbOF0gPSB4ejIgKyB5dzI7XG5cdFx0cmF3RGF0YVsxMl0gPSAwO1xuXHRcdHJhd0RhdGFbMV0gPSB4eTIgKyB6dzI7XG5cdFx0cmF3RGF0YVs1XSA9IC14eCArIHl5IC0genogKyB3dztcblx0XHRyYXdEYXRhWzldID0geXoyIC0geHcyO1xuXHRcdHJhd0RhdGFbMTNdID0gMDtcblx0XHRyYXdEYXRhWzJdID0geHoyIC0geXcyO1xuXHRcdHJhd0RhdGFbNl0gPSB5ejIgKyB4dzI7XG5cdFx0cmF3RGF0YVsxMF0gPSAteHggLSB5eSArIHp6ICsgd3c7XG5cdFx0cmF3RGF0YVsxNF0gPSAwO1xuXHRcdHJhd0RhdGFbM10gPSAwLjA7XG5cdFx0cmF3RGF0YVs3XSA9IDAuMDtcblx0XHRyYXdEYXRhWzExXSA9IDA7XG5cdFx0cmF3RGF0YVsxNV0gPSAxO1xuXG5cdFx0aWYgKCF0YXJnZXQpXG5cdFx0XHRyZXR1cm4gbmV3IE1hdHJpeDNEKHJhd0RhdGEpO1xuXG5cdFx0dGFyZ2V0LmNvcHlSYXdEYXRhRnJvbShyYXdEYXRhKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cdH1cblxuXHQvKipcblx0ICogRXh0cmFjdHMgYSBxdWF0ZXJuaW9uIHJvdGF0aW9uIG1hdHJpeCBvdXQgb2YgYSBnaXZlbiBNYXRyaXgzRCBvYmplY3QuXG5cdCAqIEBwYXJhbSBtYXRyaXggVGhlIE1hdHJpeDNEIG91dCBvZiB3aGljaCB0aGUgcm90YXRpb24gd2lsbCBiZSBleHRyYWN0ZWQuXG5cdCAqL1xuXHRwdWJsaWMgZnJvbU1hdHJpeChtYXRyaXg6TWF0cml4M0QpXG5cdHtcblx0XHR2YXIgdjpWZWN0b3IzRCA9IG1hdHJpeC5kZWNvbXBvc2UoT3JpZW50YXRpb24zRC5RVUFURVJOSU9OKVsxXTtcblx0XHR0aGlzLnggPSB2Lng7XG5cdFx0dGhpcy55ID0gdi55O1xuXHRcdHRoaXMueiA9IHYuejtcblx0XHR0aGlzLncgPSB2Lnc7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgdGhlIHF1YXRlcm5pb24gdG8gYSBWZWN0b3IuJmx0O051bWJlciZndDsgbWF0cml4IHJlcHJlc2VudGF0aW9uIG9mIGEgcm90YXRpb24gZXF1aXZhbGVudCB0byB0aGlzIHF1YXRlcm5pb24uXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIFZlY3Rvci4mbHQ7TnVtYmVyJmd0OyB0byBjb250YWluIHRoZSByYXcgbWF0cml4IGRhdGEuXG5cdCAqIEBwYXJhbSBleGNsdWRlNHRoUm93IElmIHRydWUsIHRoZSBsYXN0IHJvdyB3aWxsIGJlIG9taXR0ZWQsIGFuZCBhIDR4MyBtYXRyaXggd2lsbCBiZSBnZW5lcmF0ZWQgaW5zdGVhZCBvZiBhIDR4NC5cblx0ICovXG5cdHB1YmxpYyB0b1Jhd0RhdGEodGFyZ2V0Om51bWJlcltdLCBleGNsdWRlNHRoUm93OmJvb2xlYW4gPSBmYWxzZSlcblx0e1xuXHRcdHZhciB4eTI6bnVtYmVyID0gMi4wKnRoaXMueCp0aGlzLnksIHh6MjpudW1iZXIgPSAyLjAqdGhpcy54KnRoaXMueiwgeHcyOm51bWJlciA9IDIuMCp0aGlzLngqdGhpcy53O1xuXHRcdHZhciB5ejI6bnVtYmVyID0gMi4wKnRoaXMueSp0aGlzLnosIHl3MjpudW1iZXIgPSAyLjAqdGhpcy55KnRoaXMudywgencyOm51bWJlciA9IDIuMCp0aGlzLnoqdGhpcy53O1xuXHRcdHZhciB4eDpudW1iZXIgPSB0aGlzLngqdGhpcy54LCB5eTpudW1iZXIgPSB0aGlzLnkqdGhpcy55LCB6ejpudW1iZXIgPSB0aGlzLnoqdGhpcy56LCB3dzpudW1iZXIgPSB0aGlzLncqdGhpcy53O1xuXG5cdFx0dGFyZ2V0WzBdID0geHggLSB5eSAtIHp6ICsgd3c7XG5cdFx0dGFyZ2V0WzFdID0geHkyIC0gencyO1xuXHRcdHRhcmdldFsyXSA9IHh6MiArIHl3Mjtcblx0XHR0YXJnZXRbNF0gPSB4eTIgKyB6dzI7XG5cdFx0dGFyZ2V0WzVdID0gLXh4ICsgeXkgLSB6eiArIHd3O1xuXHRcdHRhcmdldFs2XSA9IHl6MiAtIHh3Mjtcblx0XHR0YXJnZXRbOF0gPSB4ejIgLSB5dzI7XG5cdFx0dGFyZ2V0WzldID0geXoyICsgeHcyO1xuXHRcdHRhcmdldFsxMF0gPSAteHggLSB5eSArIHp6ICsgd3c7XG5cdFx0dGFyZ2V0WzNdID0gdGFyZ2V0WzddID0gdGFyZ2V0WzExXSA9IDA7XG5cblx0XHRpZiAoIWV4Y2x1ZGU0dGhSb3cpIHtcblx0XHRcdHRhcmdldFsxMl0gPSB0YXJnZXRbMTNdID0gdGFyZ2V0WzE0XSA9IDA7XG5cdFx0XHR0YXJnZXRbMTVdID0gMTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2xvbmVzIHRoZSBxdWF0ZXJuaW9uLlxuXHQgKiBAcmV0dXJuIEFuIGV4YWN0IGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCBRdWF0ZXJuaW9uLlxuXHQgKi9cblx0cHVibGljIGNsb25lKCk6UXVhdGVybmlvblxuXHR7XG5cdFx0cmV0dXJuIG5ldyBRdWF0ZXJuaW9uKHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyk7XG5cdH1cblxuXHQvKipcblx0ICogUm90YXRlcyBhIHBvaW50LlxuXHQgKiBAcGFyYW0gdmVjdG9yIFRoZSBWZWN0b3IzRCBvYmplY3QgdG8gYmUgcm90YXRlZC5cblx0ICogQHBhcmFtIHRhcmdldCBBbiBvcHRpb25hbCBWZWN0b3IzRCBvYmplY3QgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIHJvdGF0ZWQgY29vcmRpbmF0ZXMuIElmIG5vdCBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZC5cblx0ICogQHJldHVybiBBIFZlY3RvcjNEIG9iamVjdCBjb250YWluaW5nIHRoZSByb3RhdGVkIHBvaW50LlxuXHQgKi9cblx0cHVibGljIHJvdGF0ZVBvaW50KHZlY3RvcjpWZWN0b3IzRCwgdGFyZ2V0OlZlY3RvcjNEID0gbnVsbCk6VmVjdG9yM0Rcblx0e1xuXHRcdHZhciB4MTpudW1iZXIsIHkxOm51bWJlciwgejE6bnVtYmVyLCB3MTpudW1iZXI7XG5cdFx0dmFyIHgyOm51bWJlciA9IHZlY3Rvci54LCB5MjpudW1iZXIgPSB2ZWN0b3IueSwgejI6bnVtYmVyID0gdmVjdG9yLno7XG5cblx0XHQvL3RhcmdldCB8fD0gbmV3IFZlY3RvcjNEKCk7XG5cdFx0aWYgKHRhcmdldCA9PT0gbnVsbCkge1xuXG5cdFx0XHR0YXJnZXQgPSBuZXcgVmVjdG9yM0QoKTtcblxuXHRcdH1cblxuXHRcdC8vIHAqcSdcblx0XHR3MSA9IC10aGlzLngqeDIgLSB0aGlzLnkqeTIgLSB0aGlzLnoqejI7XG5cdFx0eDEgPSB0aGlzLncqeDIgKyB0aGlzLnkqejIgLSB0aGlzLnoqeTI7XG5cdFx0eTEgPSB0aGlzLncqeTIgLSB0aGlzLngqejIgKyB0aGlzLnoqeDI7XG5cdFx0ejEgPSB0aGlzLncqejIgKyB0aGlzLngqeTIgLSB0aGlzLnkqeDI7XG5cblx0XHR0YXJnZXQueCA9IC13MSp0aGlzLnggKyB4MSp0aGlzLncgLSB5MSp0aGlzLnogKyB6MSp0aGlzLnk7XG5cdFx0dGFyZ2V0LnkgPSAtdzEqdGhpcy55ICsgeDEqdGhpcy56ICsgeTEqdGhpcy53IC0gejEqdGhpcy54O1xuXHRcdHRhcmdldC56ID0gLXcxKnRoaXMueiAtIHgxKnRoaXMueSArIHkxKnRoaXMueCArIHoxKnRoaXMudztcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cdH1cblxuXHQvKipcblx0ICogQ29waWVzIHRoZSBkYXRhIGZyb20gYSBxdWF0ZXJuaW9uIGludG8gdGhpcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHEgVGhlIHF1YXRlcm5pb24gdG8gY29weSBmcm9tLlxuXHQgKi9cblx0cHVibGljIGNvcHlGcm9tKHE6UXVhdGVybmlvbilcblx0e1xuXHRcdHRoaXMueCA9IHEueDtcblx0XHR0aGlzLnkgPSBxLnk7XG5cdFx0dGhpcy56ID0gcS56O1xuXHRcdHRoaXMudyA9IHEudztcblx0fVxufVxuXG5leHBvcnQgPSBRdWF0ZXJuaW9uOyJdfQ== \ No newline at end of file diff --git a/lib/core/geom/Quaternion.ts b/lib/core/geom/Quaternion.ts new file mode 100644 index 00000000..253e424c --- /dev/null +++ b/lib/core/geom/Quaternion.ts @@ -0,0 +1,384 @@ +import Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +import Orientation3D = require("awayjs-core/lib/core/geom/Orientation3D"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** + * A Quaternion object which can be used to represent rotations. + */ +class Quaternion +{ + /** + * The x value of the quaternion. + */ + public x:number = 0; + + /** + * The y value of the quaternion. + */ + public y:number = 0; + + /** + * The z value of the quaternion. + */ + public z:number = 0; + + /** + * The w value of the quaternion. + */ + public w:number = 1; + + /** + * Creates a new Quaternion object. + * @param x The x value of the quaternion. + * @param y The y value of the quaternion. + * @param z The z value of the quaternion. + * @param w The w value of the quaternion. + */ + constructor(x:number = 0, y:number = 0, z:number = 0, w:number = 1) + { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Returns the magnitude of the quaternion object. + */ + public get magnitude():number + { + return Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z); + } + + /** + * Fills the quaternion object with the result from a multiplication of two quaternion objects. + * + * @param qa The first quaternion in the multiplication. + * @param qb The second quaternion in the multiplication. + */ + public multiply(qa:Quaternion, qb:Quaternion) + { + var w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z; + var w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z; + + this.w = w1*w2 - x1*x2 - y1*y2 - z1*z2; + this.x = w1*x2 + x1*w2 + y1*z2 - z1*y2; + this.y = w1*y2 - x1*z2 + y1*w2 + z1*x2; + this.z = w1*z2 + x1*y2 - y1*x2 + z1*w2; + } + + public multiplyVector(vector:Vector3D, target:Quaternion = null):Quaternion + { + //target ||= new Quaternion(); + if (target === null) { + target = new Quaternion(); + + } + + + var x2:number = vector.x; + var y2:number = vector.y; + var z2:number = vector.z; + + target.w = -this.x*x2 - this.y*y2 - this.z*z2; + target.x = this.w*x2 + this.y*z2 - this.z*y2; + target.y = this.w*y2 - this.x*z2 + this.z*x2; + target.z = this.w*z2 + this.x*y2 - this.y*x2; + + return target; + } + + /** + * Fills the quaternion object with values representing the given rotation around a vector. + * + * @param axis The axis around which to rotate + * @param angle The angle in radians of the rotation. + */ + public fromAxisAngle(axis:Vector3D, angle:number) + { + var sin_a:number = Math.sin(angle/2); + var cos_a:number = Math.cos(angle/2); + + this.x = axis.x*sin_a; + this.y = axis.y*sin_a; + this.z = axis.z*sin_a; + this.w = cos_a; + + this.normalize(); + } + + /** + * Spherically interpolates between two quaternions, providing an interpolation between rotations with constant angle change rate. + * @param qa The first quaternion to interpolate. + * @param qb The second quaternion to interpolate. + * @param t The interpolation weight, a value between 0 and 1. + */ + public slerp(qa:Quaternion, qb:Quaternion, t:number) + { + var w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z; + var w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z; + var dot:number = w1*w2 + x1*x2 + y1*y2 + z1*z2; + + // shortest direction + if (dot < 0) { + dot = -dot; + w2 = -w2; + x2 = -x2; + y2 = -y2; + z2 = -z2; + } + + if (dot < 0.95) { + // interpolate angle linearly + var angle:number = Math.acos(dot); + var s:number = 1/Math.sin(angle); + var s1:number = Math.sin(angle*(1 - t))*s; + var s2:number = Math.sin(angle*t)*s; + this.w = w1*s1 + w2*s2; + this.x = x1*s1 + x2*s2; + this.y = y1*s1 + y2*s2; + this.z = z1*s1 + z2*s2; + } else { + // nearly identical angle, interpolate linearly + this.w = w1 + t*(w2 - w1); + this.x = x1 + t*(x2 - x1); + this.y = y1 + t*(y2 - y1); + this.z = z1 + t*(z2 - z1); + var len:number = 1.0/Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z); + this.w *= len; + this.x *= len; + this.y *= len; + this.z *= len; + } + } + + /** + * Linearly interpolates between two quaternions. + * @param qa The first quaternion to interpolate. + * @param qb The second quaternion to interpolate. + * @param t The interpolation weight, a value between 0 and 1. + */ + public lerp(qa:Quaternion, qb:Quaternion, t:number) + { + var w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z; + var w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z; + var len:number; + + // shortest direction + if (w1*w2 + x1*x2 + y1*y2 + z1*z2 < 0) { + w2 = -w2; + x2 = -x2; + y2 = -y2; + z2 = -z2; + } + + this.w = w1 + t*(w2 - w1); + this.x = x1 + t*(x2 - x1); + this.y = y1 + t*(y2 - y1); + this.z = z1 + t*(z2 - z1); + + len = 1.0/Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z); + this.w *= len; + this.x *= len; + this.y *= len; + this.z *= len; + } + + /** + * Fills the quaternion object with values representing the given euler rotation. + * + * @param ax The angle in radians of the rotation around the ax axis. + * @param ay The angle in radians of the rotation around the ay axis. + * @param az The angle in radians of the rotation around the az axis. + */ + public fromEulerAngles(ax:number, ay:number, az:number) + { + var halfX:number = ax*.5, halfY:number = ay*.5, halfZ:number = az*.5; + var cosX:number = Math.cos(halfX), sinX:number = Math.sin(halfX); + var cosY:number = Math.cos(halfY), sinY:number = Math.sin(halfY); + var cosZ:number = Math.cos(halfZ), sinZ:number = Math.sin(halfZ); + + this.w = cosX*cosY*cosZ + sinX*sinY*sinZ; + this.x = sinX*cosY*cosZ - cosX*sinY*sinZ; + this.y = cosX*sinY*cosZ + sinX*cosY*sinZ; + this.z = cosX*cosY*sinZ - sinX*sinY*cosZ; + } + + /** + * Fills a target Vector3D object with the Euler angles that form the rotation represented by this quaternion. + * @param target An optional Vector3D object to contain the Euler angles. If not provided, a new object is created. + * @return The Vector3D containing the Euler angles. + */ + public toEulerAngles(target:Vector3D = null):Vector3D + { + + //target ||= new Vector3D(); + if (target === null) { + + target = new Vector3D(); + + } + + target.x = Math.atan2(2*(this.w*this.x + this.y*this.z), 1 - 2*(this.x*this.x + this.y*this.y)); + target.y = Math.asin(2*(this.w*this.y - this.z*this.x)); + target.z = Math.atan2(2*(this.w*this.z + this.x*this.y), 1 - 2*(this.y*this.y + this.z*this.z)); + + return target; + } + + /** + * Normalises the quaternion object. + */ + public normalize(val:number = 1) + { + var mag:number = val/Math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z + this.w*this.w); + + this.x *= mag; + this.y *= mag; + this.z *= mag; + this.w *= mag; + } + + /** + * Used to trace the values of a quaternion. + * + * @return A string representation of the quaternion object. + */ + public toString():string + { + return "{x:" + this.x + " y:" + this.y + " z:" + this.z + " w:" + this.w + "}"; + } + + /** + * Converts the quaternion to a Matrix3D object representing an equivalent rotation. + * @param target An optional Matrix3D container to store the transformation in. If not provided, a new object is created. + * @return A Matrix3D object representing an equivalent rotation. + */ + public toMatrix3D(target:Matrix3D = null):Matrix3D + { + var rawData:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; + var xy2:number = 2.0*this.x*this.y, xz2:number = 2.0*this.x*this.z, xw2:number = 2.0*this.x*this.w; + var yz2:number = 2.0*this.y*this.z, yw2:number = 2.0*this.y*this.w, zw2:number = 2.0*this.z*this.w; + var xx:number = this.x*this.x, yy:number = this.y*this.y, zz:number = this.z*this.z, ww:number = this.w*this.w; + + rawData[0] = xx - yy - zz + ww; + rawData[4] = xy2 - zw2; + rawData[8] = xz2 + yw2; + rawData[12] = 0; + rawData[1] = xy2 + zw2; + rawData[5] = -xx + yy - zz + ww; + rawData[9] = yz2 - xw2; + rawData[13] = 0; + rawData[2] = xz2 - yw2; + rawData[6] = yz2 + xw2; + rawData[10] = -xx - yy + zz + ww; + rawData[14] = 0; + rawData[3] = 0.0; + rawData[7] = 0.0; + rawData[11] = 0; + rawData[15] = 1; + + if (!target) + return new Matrix3D(rawData); + + target.copyRawDataFrom(rawData); + + return target; + } + + /** + * Extracts a quaternion rotation matrix out of a given Matrix3D object. + * @param matrix The Matrix3D out of which the rotation will be extracted. + */ + public fromMatrix(matrix:Matrix3D) + { + var v:Vector3D = matrix.decompose(Orientation3D.QUATERNION)[1]; + this.x = v.x; + this.y = v.y; + this.z = v.z; + this.w = v.w; + } + + /** + * Converts the quaternion to a Vector.<Number> matrix representation of a rotation equivalent to this quaternion. + * @param target The Vector.<Number> to contain the raw matrix data. + * @param exclude4thRow If true, the last row will be omitted, and a 4x3 matrix will be generated instead of a 4x4. + */ + public toRawData(target:number[], exclude4thRow:boolean = false) + { + var xy2:number = 2.0*this.x*this.y, xz2:number = 2.0*this.x*this.z, xw2:number = 2.0*this.x*this.w; + var yz2:number = 2.0*this.y*this.z, yw2:number = 2.0*this.y*this.w, zw2:number = 2.0*this.z*this.w; + var xx:number = this.x*this.x, yy:number = this.y*this.y, zz:number = this.z*this.z, ww:number = this.w*this.w; + + target[0] = xx - yy - zz + ww; + target[1] = xy2 - zw2; + target[2] = xz2 + yw2; + target[4] = xy2 + zw2; + target[5] = -xx + yy - zz + ww; + target[6] = yz2 - xw2; + target[8] = xz2 - yw2; + target[9] = yz2 + xw2; + target[10] = -xx - yy + zz + ww; + target[3] = target[7] = target[11] = 0; + + if (!exclude4thRow) { + target[12] = target[13] = target[14] = 0; + target[15] = 1; + } + } + + /** + * Clones the quaternion. + * @return An exact duplicate of the current Quaternion. + */ + public clone():Quaternion + { + return new Quaternion(this.x, this.y, this.z, this.w); + } + + /** + * Rotates a point. + * @param vector The Vector3D object to be rotated. + * @param target An optional Vector3D object that will contain the rotated coordinates. If not provided, a new object will be created. + * @return A Vector3D object containing the rotated point. + */ + public rotatePoint(vector:Vector3D, target:Vector3D = null):Vector3D + { + var x1:number, y1:number, z1:number, w1:number; + var x2:number = vector.x, y2:number = vector.y, z2:number = vector.z; + + //target ||= new Vector3D(); + if (target === null) { + + target = new Vector3D(); + + } + + // p*q' + w1 = -this.x*x2 - this.y*y2 - this.z*z2; + x1 = this.w*x2 + this.y*z2 - this.z*y2; + y1 = this.w*y2 - this.x*z2 + this.z*x2; + z1 = this.w*z2 + this.x*y2 - this.y*x2; + + target.x = -w1*this.x + x1*this.w - y1*this.z + z1*this.y; + target.y = -w1*this.y + x1*this.z + y1*this.w - z1*this.x; + target.z = -w1*this.z - x1*this.y + y1*this.x + z1*this.w; + + return target; + } + + /** + * Copies the data from a quaternion into this instance. + * @param q The quaternion to copy from. + */ + public copyFrom(q:Quaternion) + { + this.x = q.x; + this.y = q.y; + this.z = q.z; + this.w = q.w; + } +} + +export = Quaternion; \ No newline at end of file diff --git a/lib/core/geom/Rectangle.js b/lib/core/geom/Rectangle.js new file mode 100755 index 00000000..fd1fa9f8 --- /dev/null +++ b/lib/core/geom/Rectangle.js @@ -0,0 +1,502 @@ +var Point = require("awayjs-core/lib/core/geom/Point"); + +/** +* A Rectangle object is an area defined by its position, as indicated by its +* top-left corner point(x, y) and by its width and its height. +* +* +*

The x, y, width, and +* height properties of the Rectangle class are independent of +* each other; changing the value of one property has no effect on the others. +* However, the right and bottom properties are +* integrally related to those four properties. For example, if you change the +* value of the right property, the value of the +* width property changes; if you change the bottom +* property, the value of the height property changes.

+* +*

The following methods and properties use Rectangle objects:

+* +*
    +*
  • The applyFilter(), colorTransform(), +* copyChannel(), copyPixels(), draw(), +* fillRect(), generateFilterRect(), +* getColorBoundsRect(), getPixels(), +* merge(), paletteMap(), +* pixelDisolve(), setPixels(), and +* threshold() methods, and the rect property of the +* BitmapData class
  • +*
  • The getBounds() and getRect() methods, and +* the scrollRect and scale9Grid properties of the +* DisplayObject class
  • +*
  • The getCharBoundaries() method of the TextField +* class
  • +*
  • The pixelBounds property of the Transform class
  • +*
  • The bounds parameter for the startDrag() +* method of the Sprite class
  • +*
  • The printArea parameter of the addPage() +* method of the PrintJob class
  • +*
+* +*

You can use the new Rectangle() constructor to create a +* Rectangle object.

+* +*

Note: The Rectangle class does not define a rectangular Shape +* display object. To draw a rectangular Shape object onscreen, use the +* drawRect() method of the Graphics class.

+*/ +var Rectangle = (function () { + /** + * Creates a new Rectangle object with the top-left corner specified by the + * x and y parameters and with the specified + * width and height parameters. If you call this + * public without parameters, a rectangle with x, + * y, width, and height properties set + * to 0 is created. + * + * @param x The x coordinate of the top-left corner of the + * rectangle. + * @param y The y coordinate of the top-left corner of the + * rectangle. + * @param width The width of the rectangle, in pixels. + * @param height The height of the rectangle, in pixels. + */ + function Rectangle(x, y, width, height) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof width === "undefined") { width = 0; } + if (typeof height === "undefined") { height = 0; } + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + Object.defineProperty(Rectangle.prototype, "bottom", { + /** + * The sum of the y and height properties. + */ + get: function () { + return this.y + this.height; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "bottomRight", { + /** + * The location of the Rectangle object's bottom-right corner, determined by + * the values of the right and bottom properties. + */ + get: function () { + if (this._bottomRight == null) + this._bottomRight = new Point(); + + this._bottomRight.x = this.x + this.width; + this._bottomRight.y = this.y + this.height; + + return this._bottomRight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "left", { + /** + * The x coordinate of the top-left corner of the rectangle. Changing + * the left property of a Rectangle object has no effect on the + * y and height properties. However it does affect + * the width property, whereas changing the x value + * does not affect the width property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + get: function () { + return this.x; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "right", { + /** + * The sum of the x and width properties. + */ + get: function () { + return this.x + this.width; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "size", { + /** + * The size of the Rectangle object, expressed as a Point object with the + * values of the width and height properties. + */ + get: function () { + if (this._size == null) + this._size = new Point(); + + this._size.x = this.width; + this._size.y = this.height; + + return this._size; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "top", { + /** + * The y coordinate of the top-left corner of the rectangle. Changing + * the top property of a Rectangle object has no effect on the + * x and width properties. However it does affect + * the height property, whereas changing the y + * value does not affect the height property. + * + *

The value of the top property is equal to the value of the + * y property.

+ */ + get: function () { + return this.y; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Rectangle.prototype, "topLeft", { + /** + * The location of the Rectangle object's top-left corner, determined by the + * x and y coordinates of the point. + */ + get: function () { + if (this._topLeft == null) + this._topLeft = new Point(); + + this._topLeft.x = this.x; + this._topLeft.y = this.y; + + return this._topLeft; + }, + enumerable: true, + configurable: true + }); + + /** + * Returns a new Rectangle object with the same values for the + * x, y, width, and + * height properties as the original Rectangle object. + * + * @return A new Rectangle object with the same values for the + * x, y, width, and + * height properties as the original Rectangle object. + */ + Rectangle.prototype.clone = function () { + return new Rectangle(this.x, this.y, this.width, this.height); + }; + + /** + * Determines whether the specified point is contained within the rectangular + * region defined by this Rectangle object. + * + * @param x The x coordinate(horizontal position) of the point. + * @param y The y coordinate(vertical position) of the point. + * @return A value of true if the Rectangle object contains the + * specified point; otherwise false. + */ + Rectangle.prototype.contains = function (x, y) { + return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y); + }; + + /** + * Determines whether the specified point is contained within the rectangular + * region defined by this Rectangle object. This method is similar to the + * Rectangle.contains() method, except that it takes a Point + * object as a parameter. + * + * @param point The point, as represented by its x and y + * coordinates. + * @return A value of true if the Rectangle object contains the + * specified point; otherwise false. + */ + Rectangle.prototype.containsPoint = function (point) { + return (this.x <= point.x && this.x + this.width >= point.x && this.y <= point.y && this.y + this.height >= point.y); + }; + + /** + * Determines whether the Rectangle object specified by the rect + * parameter is contained within this Rectangle object. A Rectangle object is + * said to contain another if the second Rectangle object falls entirely + * within the boundaries of the first. + * + * @param rect The Rectangle object being checked. + * @return A value of true if the Rectangle object that you + * specify is contained by this Rectangle object; otherwise + * false. + */ + Rectangle.prototype.containsRect = function (rect) { + return (this.x <= rect.x && this.x + this.width >= rect.x + rect.width && this.y <= rect.y && this.y + this.height >= rect.y + rect.height); + }; + + /** + * Copies all of rectangle data from the source Rectangle object into the + * calling Rectangle object. + * + * @param sourceRect The Rectangle object from which to copy the data. + */ + Rectangle.prototype.copyFrom = function (sourceRect) { + }; + + /** + * Determines whether the object specified in the toCompare + * parameter is equal to this Rectangle object. This method compares the + * x, y, width, and + * height properties of an object against the same properties of + * this Rectangle object. + * + * @param toCompare The rectangle to compare to this Rectangle object. + * @return A value of true if the object has exactly the same + * values for the x, y, width, + * and height properties as this Rectangle object; + * otherwise false. + */ + Rectangle.prototype.equals = function (toCompare) { + return (this.x == toCompare.x && this.y == toCompare.y && this.width == toCompare.width && this.height == toCompare.height); + }; + + /** + * Increases the size of the Rectangle object by the specified amounts, in + * pixels. The center point of the Rectangle object stays the same, and its + * size increases to the left and right by the dx value, and to + * the top and the bottom by the dy value. + * + * @param dx The value to be added to the left and the right of the Rectangle + * object. The following equation is used to calculate the new + * width and position of the rectangle: + * @param dy The value to be added to the top and the bottom of the + * Rectangle. The following equation is used to calculate the new + * height and position of the rectangle: + */ + Rectangle.prototype.inflate = function (dx, dy) { + this.x -= dx / 2; + this.y -= dy / 2; + this.width += dx / 2; + this.height += dy / 2; + }; + + /** + * Increases the size of the Rectangle object. This method is similar to the + * Rectangle.inflate() method except it takes a Point object as + * a parameter. + * + *

The following two code examples give the same result:

+ * + * @param point The x property of this Point object is used to + * increase the horizontal dimension of the Rectangle object. + * The y property is used to increase the vertical + * dimension of the Rectangle object. + */ + Rectangle.prototype.inflatePoint = function (point) { + this.x -= point.x / 2; + this.y -= point.y / 2; + this.width += point.x / 2; + this.height += point.y / 2; + }; + + /** + * If the Rectangle object specified in the toIntersect + * parameter intersects with this Rectangle object, returns the area of + * intersection as a Rectangle object. If the rectangles do not intersect, + * this method returns an empty Rectangle object with its properties set to + * 0. + * + * @param toIntersect The Rectangle object to compare against to see if it + * intersects with this Rectangle object. + * @return A Rectangle object that equals the area of intersection. If the + * rectangles do not intersect, this method returns an empty + * Rectangle object; that is, a rectangle with its x, + * y, width, and height + * properties set to 0. + */ + Rectangle.prototype.intersection = function (toIntersect) { + if (this.intersects(toIntersect)) { + var i = new Rectangle(); + + if (this.x > toIntersect.x) { + i.x = this.x; + i.width = toIntersect.x - this.x + toIntersect.width; + + if (i.width > this.width) + i.width = this.width; + } else { + i.x = toIntersect.x; + i.width = this.x - toIntersect.x + this.width; + + if (i.width > toIntersect.width) + i.width = toIntersect.width; + } + + if (this.y > toIntersect.y) { + i.y = this.y; + i.height = toIntersect.y - this.y + toIntersect.height; + + if (i.height > this.height) + i.height = this.height; + } else { + i.y = toIntersect.y; + i.height = this.y - toIntersect.y + this.height; + + if (i.height > toIntersect.height) + i.height = toIntersect.height; + } + + return i; + } + + return new Rectangle(); + }; + + /** + * Determines whether the object specified in the toIntersect + * parameter intersects with this Rectangle object. This method checks the + * x, y, width, and + * height properties of the specified Rectangle object to see if + * it intersects with this Rectangle object. + * + * @param toIntersect The Rectangle object to compare against this Rectangle + * object. + * @return A value of true if the specified object intersects + * with this Rectangle object; otherwise false. + */ + Rectangle.prototype.intersects = function (toIntersect) { + return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height); + }; + + /** + * Determines whether or not this Rectangle object is empty. + * + * @return A value of true if the Rectangle object's width or + * height is less than or equal to 0; otherwise false. + */ + Rectangle.prototype.isEmpty = function () { + return (this.x == 0 && this.y == 0 && this.width == 0 && this.height == 0); + }; + + /** + * Adjusts the location of the Rectangle object, as determined by its + * top-left corner, by the specified amounts. + * + * @param dx Moves the x value of the Rectangle object by this amount. + * @param dy Moves the y value of the Rectangle object by this amount. + */ + Rectangle.prototype.offset = function (dx, dy) { + this.x += dx; + this.y += dy; + }; + + /** + * Adjusts the location of the Rectangle object using a Point object as a + * parameter. This method is similar to the Rectangle.offset() + * method, except that it takes a Point object as a parameter. + * + * @param point A Point object to use to offset this Rectangle object. + */ + Rectangle.prototype.offsetPoint = function (point) { + this.x += point.x; + this.y += point.y; + }; + + /** + * Sets all of the Rectangle object's properties to 0. A Rectangle object is + * empty if its width or height is less than or equal to 0. + * + *

This method sets the values of the x, y, + * width, and height properties to 0.

+ * + */ + Rectangle.prototype.setEmpty = function () { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + }; + + /** + * Sets the members of Rectangle to the specified values + * + * @param xa The x coordinate of the top-left corner of the + * rectangle. + * @param ya The y coordinate of the top-left corner of the + * rectangle. + * @param widtha The width of the rectangle, in pixels. + * @param heighta The height of the rectangle, in pixels. + */ + Rectangle.prototype.setTo = function (xa, ya, widtha, heighta) { + this.x = xa; + this.y = ya; + this.width = widtha; + this.height = heighta; + }; + + /** + * Builds and returns a string that lists the horizontal and vertical + * positions and the width and height of the Rectangle object. + * + * @return A string listing the value of each of the following properties of + * the Rectangle object: x, y, + * width, and height. + */ + Rectangle.prototype.toString = function () { + return "[Rectangle] (x=" + this.x + ", y=" + this.y + ", width=" + this.width + ", height=" + this.height + ")"; + }; + + /** + * Adds two rectangles together to create a new Rectangle object, by filling + * in the horizontal and vertical space between the two rectangles. + * + *

Note: The union() method ignores rectangles with + * 0 as the height or width value, such as: var + * rect2:Rectangle = new Rectangle(300,300,50,0);

+ * + * @param toUnion A Rectangle object to add to this Rectangle object. + * @return A new Rectangle object that is the union of the two rectangles. + */ + Rectangle.prototype.union = function (toUnion) { + var u = new Rectangle(); + + if (this.x < toUnion.x) { + u.x = this.x; + u.width = toUnion.x - this.x + toUnion.width; + + if (u.width < this.width) + u.width = this.width; + } else { + u.x = toUnion.x; + u.width = this.x - toUnion.x + this.width; + + if (u.width < toUnion.width) + u.width = toUnion.width; + } + + if (this.y < toUnion.y) { + u.y = this.y; + u.height = toUnion.y - this.y + toUnion.height; + + if (u.height < this.height) + u.height = this.height; + } else { + u.y = toUnion.y; + u.height = this.y - toUnion.y + this.height; + + if (u.height < toUnion.height) + u.height = toUnion.height; + } + + return u; + }; + return Rectangle; +})(); + +module.exports = Rectangle; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9SZWN0YW5nbGUudHMiXSwibmFtZXMiOlsiUmVjdGFuZ2xlIiwiUmVjdGFuZ2xlLmNvbnN0cnVjdG9yIiwiUmVjdGFuZ2xlLmNsb25lIiwiUmVjdGFuZ2xlLmNvbnRhaW5zIiwiUmVjdGFuZ2xlLmNvbnRhaW5zUG9pbnQiLCJSZWN0YW5nbGUuY29udGFpbnNSZWN0IiwiUmVjdGFuZ2xlLmNvcHlGcm9tIiwiUmVjdGFuZ2xlLmVxdWFscyIsIlJlY3RhbmdsZS5pbmZsYXRlIiwiUmVjdGFuZ2xlLmluZmxhdGVQb2ludCIsIlJlY3RhbmdsZS5pbnRlcnNlY3Rpb24iLCJSZWN0YW5nbGUuaW50ZXJzZWN0cyIsIlJlY3RhbmdsZS5pc0VtcHR5IiwiUmVjdGFuZ2xlLm9mZnNldCIsIlJlY3RhbmdsZS5vZmZzZXRQb2ludCIsIlJlY3RhbmdsZS5zZXRFbXB0eSIsIlJlY3RhbmdsZS5zZXRUbyIsIlJlY3RhbmdsZS50b1N0cmluZyIsIlJlY3RhbmdsZS51bmlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQThEOztBQUU5RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTJDRztBQUNIO0lBb0pDQTs7Ozs7Ozs7Ozs7Ozs7TUFER0E7SUFDSEEsbUJBQVlBLENBQVlBLEVBQUVBLENBQVlBLEVBQUVBLEtBQWdCQSxFQUFFQSxNQUFpQkE7UUFBL0RDLGdDQUFBQSxDQUFDQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxnQ0FBQUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsb0NBQUFBLEtBQUtBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLHFDQUFBQSxNQUFNQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUUxRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDVkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDVkEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsS0FBS0E7UUFDbEJBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLE1BQU1BO0lBQ3JCQSxDQUFDQTtJQTdHREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BO1FBQzVCQSxDQUFDQTs7OztBQUFBQTtJQU1EQTtRQUFBQTs7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLElBQUlBLENBQUNBLFlBQVlBLElBQUlBLElBQUlBO2dCQUM1QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1lBRWpDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQTtZQUN6Q0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7O1lBRTFDQSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFZREE7UUFBQUE7Ozs7Ozs7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUNkQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7UUFDM0JBLENBQUNBOzs7O0FBQUFBO0lBTURBO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsS0FBS0EsSUFBSUEsSUFBSUE7Z0JBQ3JCQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTs7WUFFMUJBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBO1lBQ3pCQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxD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QSxVQUFhQSxPQUFpQkE7UUFFN0JrQixJQUFJQSxDQUFDQSxHQUFhQSxJQUFJQSxTQUFTQSxDQUFDQSxDQUFDQTs7UUFFakNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUVBO1lBQ3ZCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNaQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxLQUFLQTs7WUFFNUNBLElBQUlBLENBQUNBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBO2dCQUN2QkEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7U0FDdEJBLEtBQU1BO1lBQ05BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBO1lBQ2ZBLENBQUNBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBOztZQUV6Q0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsT0FBT0EsQ0FBQ0EsS0FBS0E7Z0JBQzFCQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUN6QkE7O1FBRURBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUVBO1lBQ3ZCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNaQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxNQUFNQTs7WUFFOUNBLElBQUlBLENBQUNBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BO2dCQUN6QkEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7U0FDeEJBLEtBQU1BO1lBQ05BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBO1lBQ2ZBLENBQUNBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BOztZQUUzQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsT0FBT0EsQ0FBQ0EsTUFBTUE7Z0JBQzVCQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxPQUFPQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUMzQkE7O1FBRURBLE9BQU9BLENBQUNBO0lBQ1RBLENBQUNBO0lBQ0ZsQixpQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCwwQkFBbUIsQ0FBQSIsImZpbGUiOiJjb3JlL2dlb20vUmVjdGFuZ2xlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFBvaW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUG9pbnRcIik7XG5cbi8qKlxuICogQSBSZWN0YW5nbGUgb2JqZWN0IGlzIGFuIGFyZWEgZGVmaW5lZCBieSBpdHMgcG9zaXRpb24sIGFzIGluZGljYXRlZCBieSBpdHNcbiAqIHRvcC1sZWZ0IGNvcm5lciBwb2ludCg8aT54PC9pPiwgPGk+eTwvaT4pIGFuZCBieSBpdHMgd2lkdGggYW5kIGl0cyBoZWlnaHQuXG4gKlxuICpcbiAqIDxwPlRoZSA8Y29kZT54PC9jb2RlPiwgPGNvZGU+eTwvY29kZT4sIDxjb2RlPndpZHRoPC9jb2RlPiwgYW5kXG4gKiA8Y29kZT5oZWlnaHQ8L2NvZGU+IHByb3BlcnRpZXMgb2YgdGhlIFJlY3RhbmdsZSBjbGFzcyBhcmUgaW5kZXBlbmRlbnQgb2ZcbiAqIGVhY2ggb3RoZXI7IGNoYW5naW5nIHRoZSB2YWx1ZSBvZiBvbmUgcHJvcGVydHkgaGFzIG5vIGVmZmVjdCBvbiB0aGUgb3RoZXJzLlxuICogSG93ZXZlciwgdGhlIDxjb2RlPnJpZ2h0PC9jb2RlPiBhbmQgPGNvZGU+Ym90dG9tPC9jb2RlPiBwcm9wZXJ0aWVzIGFyZVxuICogaW50ZWdyYWxseSByZWxhdGVkIHRvIHRob3NlIGZvdXIgcHJvcGVydGllcy4gRm9yIGV4YW1wbGUsIGlmIHlvdSBjaGFuZ2UgdGhlXG4gKiB2YWx1ZSBvZiB0aGUgPGNvZGU+cmlnaHQ8L2NvZGU+IHByb3BlcnR5LCB0aGUgdmFsdWUgb2YgdGhlXG4gKiA8Y29kZT53aWR0aDwvY29kZT4gcHJvcGVydHkgY2hhbmdlczsgaWYgeW91IGNoYW5nZSB0aGUgPGNvZGU+Ym90dG9tPC9jb2RlPlxuICogcHJvcGVydHksIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+aGVpZ2h0PC9jb2RlPiBwcm9wZXJ0eSBjaGFuZ2VzLiA8L3A+XG4gKlxuICogPHA+VGhlIGZvbGxvd2luZyBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzIHVzZSBSZWN0YW5nbGUgb2JqZWN0czo8L3A+XG4gKlxuICogPHVsPlxuICogICA8bGk+VGhlIDxjb2RlPmFwcGx5RmlsdGVyKCk8L2NvZGU+LCA8Y29kZT5jb2xvclRyYW5zZm9ybSgpPC9jb2RlPixcbiAqIDxjb2RlPmNvcHlDaGFubmVsKCk8L2NvZGU+LCA8Y29kZT5jb3B5UGl4ZWxzKCk8L2NvZGU+LCA8Y29kZT5kcmF3KCk8L2NvZGU+LFxuICogPGNvZGU+ZmlsbFJlY3QoKTwvY29kZT4sIDxjb2RlPmdlbmVyYXRlRmlsdGVyUmVjdCgpPC9jb2RlPixcbiAqIDxjb2RlPmdldENvbG9yQm91bmRzUmVjdCgpPC9jb2RlPiwgPGNvZGU+Z2V0UGl4ZWxzKCk8L2NvZGU+LFxuICogPGNvZGU+bWVyZ2UoKTwvY29kZT4sIDxjb2RlPnBhbGV0dGVNYXAoKTwvY29kZT4sXG4gKiA8Y29kZT5waXhlbERpc29sdmUoKTwvY29kZT4sIDxjb2RlPnNldFBpeGVscygpPC9jb2RlPiwgYW5kXG4gKiA8Y29kZT50aHJlc2hvbGQoKTwvY29kZT4gbWV0aG9kcywgYW5kIHRoZSA8Y29kZT5yZWN0PC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGVcbiAqIEJpdG1hcERhdGEgY2xhc3M8L2xpPlxuICogICA8bGk+VGhlIDxjb2RlPmdldEJvdW5kcygpPC9jb2RlPiBhbmQgPGNvZGU+Z2V0UmVjdCgpPC9jb2RlPiBtZXRob2RzLCBhbmRcbiAqIHRoZSA8Y29kZT5zY3JvbGxSZWN0PC9jb2RlPiBhbmQgPGNvZGU+c2NhbGU5R3JpZDwvY29kZT4gcHJvcGVydGllcyBvZiB0aGVcbiAqIERpc3BsYXlPYmplY3QgY2xhc3M8L2xpPlxuICogICA8bGk+VGhlIDxjb2RlPmdldENoYXJCb3VuZGFyaWVzKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUgVGV4dEZpZWxkXG4gKiBjbGFzczwvbGk+XG4gKiAgIDxsaT5UaGUgPGNvZGU+cGl4ZWxCb3VuZHM8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBUcmFuc2Zvcm0gY2xhc3M8L2xpPlxuICogICA8bGk+VGhlIDxjb2RlPmJvdW5kczwvY29kZT4gcGFyYW1ldGVyIGZvciB0aGUgPGNvZGU+c3RhcnREcmFnKCk8L2NvZGU+XG4gKiBtZXRob2Qgb2YgdGhlIFNwcml0ZSBjbGFzczwvbGk+XG4gKiAgIDxsaT5UaGUgPGNvZGU+cHJpbnRBcmVhPC9jb2RlPiBwYXJhbWV0ZXIgb2YgdGhlIDxjb2RlPmFkZFBhZ2UoKTwvY29kZT5cbiAqIG1ldGhvZCBvZiB0aGUgUHJpbnRKb2IgY2xhc3M8L2xpPlxuICogPC91bD5cbiAqXG4gKiA8cD5Zb3UgY2FuIHVzZSB0aGUgPGNvZGU+bmV3IFJlY3RhbmdsZSgpPC9jb2RlPiBjb25zdHJ1Y3RvciB0byBjcmVhdGUgYVxuICogUmVjdGFuZ2xlIG9iamVjdC48L3A+XG4gKlxuICogPHA+PGI+Tm90ZTo8L2I+IFRoZSBSZWN0YW5nbGUgY2xhc3MgZG9lcyBub3QgZGVmaW5lIGEgcmVjdGFuZ3VsYXIgU2hhcGVcbiAqIGRpc3BsYXkgb2JqZWN0LiBUbyBkcmF3IGEgcmVjdGFuZ3VsYXIgU2hhcGUgb2JqZWN0IG9uc2NyZWVuLCB1c2UgdGhlXG4gKiA8Y29kZT5kcmF3UmVjdCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIEdyYXBoaWNzIGNsYXNzLjwvcD5cbiAqL1xuY2xhc3MgUmVjdGFuZ2xlXG57XG5cdHByaXZhdGUgX3NpemU6UG9pbnQ7XG5cdHByaXZhdGUgX2JvdHRvbVJpZ2h0OlBvaW50O1xuXHRwcml2YXRlIF90b3BMZWZ0OlBvaW50O1xuXG5cdC8qKlxuXHQgKiBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHBpeGVscy4gQ2hhbmdpbmcgdGhlIDxjb2RlPmhlaWdodDwvY29kZT5cblx0ICogdmFsdWUgb2YgYSBSZWN0YW5nbGUgb2JqZWN0IGhhcyBubyBlZmZlY3Qgb24gdGhlIDxjb2RlPng8L2NvZGU+LFxuXHQgKiA8Y29kZT55PC9jb2RlPiwgYW5kIDxjb2RlPndpZHRoPC9jb2RlPiBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0cHVibGljIGhlaWdodDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiBwaXhlbHMuIENoYW5naW5nIHRoZSA8Y29kZT53aWR0aDwvY29kZT5cblx0ICogdmFsdWUgb2YgYSBSZWN0YW5nbGUgb2JqZWN0IGhhcyBubyBlZmZlY3Qgb24gdGhlIDxjb2RlPng8L2NvZGU+LFxuXHQgKiA8Y29kZT55PC9jb2RlPiwgYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcy5cblx0ICovXG5cdHB1YmxpYyB3aWR0aDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSA8aT54PC9pPiBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS4gQ2hhbmdpbmdcblx0ICogdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT54PC9jb2RlPiBwcm9wZXJ0eSBvZiBhIFJlY3RhbmdsZSBvYmplY3QgaGFzIG5vXG5cdCAqIGVmZmVjdCBvbiB0aGUgPGNvZGU+eTwvY29kZT4sIDxjb2RlPndpZHRoPC9jb2RlPiwgYW5kIDxjb2RlPmhlaWdodDwvY29kZT5cblx0ICogcHJvcGVydGllcy5cblx0ICpcblx0ICogPHA+VGhlIHZhbHVlIG9mIHRoZSA8Y29kZT54PC9jb2RlPiBwcm9wZXJ0eSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlXG5cdCAqIDxjb2RlPmxlZnQ8L2NvZGU+IHByb3BlcnR5LjwvcD5cblx0ICovXG5cdHB1YmxpYyB4Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIDxpPnk8L2k+IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlLiBDaGFuZ2luZ1xuXHQgKiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnk8L2NvZGU+IHByb3BlcnR5IG9mIGEgUmVjdGFuZ2xlIG9iamVjdCBoYXMgbm9cblx0ICogZWZmZWN0IG9uIHRoZSA8Y29kZT54PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+LCBhbmQgPGNvZGU+aGVpZ2h0PC9jb2RlPlxuXHQgKiBwcm9wZXJ0aWVzLlxuXHQgKlxuXHQgKiA8cD5UaGUgdmFsdWUgb2YgdGhlIDxjb2RlPnk8L2NvZGU+IHByb3BlcnR5IGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGVcblx0ICogPGNvZGU+dG9wPC9jb2RlPiBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgeTpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSBzdW0gb2YgdGhlIDxjb2RlPnk8L2NvZGU+IGFuZCA8Y29kZT5oZWlnaHQ8L2NvZGU+IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGJvdHRvbSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBsb2NhdGlvbiBvZiB0aGUgUmVjdGFuZ2xlIG9iamVjdCdzIGJvdHRvbS1yaWdodCBjb3JuZXIsIGRldGVybWluZWQgYnlcblx0ICogdGhlIHZhbHVlcyBvZiB0aGUgPGNvZGU+cmlnaHQ8L2NvZGU+IGFuZCA8Y29kZT5ib3R0b208L2NvZGU+IHByb3BlcnRpZXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGJvdHRvbVJpZ2h0KCk6UG9pbnRcblx0e1xuXHRcdGlmICh0aGlzLl9ib3R0b21SaWdodCA9PSBudWxsKVxuXHRcdFx0dGhpcy5fYm90dG9tUmlnaHQgPSBuZXcgUG9pbnQoKTtcblxuXHRcdHRoaXMuX2JvdHRvbVJpZ2h0LnggPSB0aGlzLnggKyB0aGlzLndpZHRoO1xuXHRcdHRoaXMuX2JvdHRvbVJpZ2h0LnkgPSB0aGlzLnkgKyB0aGlzLmhlaWdodDtcblxuXHRcdHJldHVybiB0aGlzLl9ib3R0b21SaWdodDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgPGk+eDwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUuIENoYW5naW5nXG5cdCAqIHRoZSA8Y29kZT5sZWZ0PC9jb2RlPiBwcm9wZXJ0eSBvZiBhIFJlY3RhbmdsZSBvYmplY3QgaGFzIG5vIGVmZmVjdCBvbiB0aGVcblx0ICogPGNvZGU+eTwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcy4gSG93ZXZlciBpdCBkb2VzIGFmZmVjdFxuXHQgKiB0aGUgPGNvZGU+d2lkdGg8L2NvZGU+IHByb3BlcnR5LCB3aGVyZWFzIGNoYW5naW5nIHRoZSA8Y29kZT54PC9jb2RlPiB2YWx1ZVxuXHQgKiBkb2VzIDxpPm5vdDwvaT4gYWZmZWN0IHRoZSA8Y29kZT53aWR0aDwvY29kZT4gcHJvcGVydHkuXG5cdCAqXG5cdCAqIDxwPlRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+bGVmdDwvY29kZT4gcHJvcGVydHkgaXMgZXF1YWwgdG8gdGhlIHZhbHVlIG9mXG5cdCAqIHRoZSA8Y29kZT54PC9jb2RlPiBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGxlZnQoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLng7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHN1bSBvZiB0aGUgPGNvZGU+eDwvY29kZT4gYW5kIDxjb2RlPndpZHRoPC9jb2RlPiBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0cHVibGljIGdldCByaWdodCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMueCArIHRoaXMud2lkdGg7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHNpemUgb2YgdGhlIFJlY3RhbmdsZSBvYmplY3QsIGV4cHJlc3NlZCBhcyBhIFBvaW50IG9iamVjdCB3aXRoIHRoZVxuXHQgKiB2YWx1ZXMgb2YgdGhlIDxjb2RlPndpZHRoPC9jb2RlPiBhbmQgPGNvZGU+aGVpZ2h0PC9jb2RlPiBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0cHVibGljIGdldCBzaXplKCk6UG9pbnRcblx0e1xuXHRcdGlmICh0aGlzLl9zaXplID09IG51bGwpXG5cdFx0XHR0aGlzLl9zaXplID0gbmV3IFBvaW50KCk7XG5cblx0XHR0aGlzLl9zaXplLnggPSB0aGlzLndpZHRoO1xuXHRcdHRoaXMuX3NpemUueSA9IHRoaXMuaGVpZ2h0O1xuXG5cdFx0cmV0dXJuIHRoaXMuX3NpemU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIDxpPnk8L2k+IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlLiBDaGFuZ2luZ1xuXHQgKiB0aGUgPGNvZGU+dG9wPC9jb2RlPiBwcm9wZXJ0eSBvZiBhIFJlY3RhbmdsZSBvYmplY3QgaGFzIG5vIGVmZmVjdCBvbiB0aGVcblx0ICogPGNvZGU+eDwvY29kZT4gYW5kIDxjb2RlPndpZHRoPC9jb2RlPiBwcm9wZXJ0aWVzLiBIb3dldmVyIGl0IGRvZXMgYWZmZWN0XG5cdCAqIHRoZSA8Y29kZT5oZWlnaHQ8L2NvZGU+IHByb3BlcnR5LCB3aGVyZWFzIGNoYW5naW5nIHRoZSA8Y29kZT55PC9jb2RlPlxuXHQgKiB2YWx1ZSBkb2VzIDxpPm5vdDwvaT4gYWZmZWN0IHRoZSA8Y29kZT5oZWlnaHQ8L2NvZGU+IHByb3BlcnR5LlxuXHQgKlxuXHQgKiA8cD5UaGUgdmFsdWUgb2YgdGhlIDxjb2RlPnRvcDwvY29kZT4gcHJvcGVydHkgaXMgZXF1YWwgdG8gdGhlIHZhbHVlIG9mIHRoZVxuXHQgKiA8Y29kZT55PC9jb2RlPiBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHRvcCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMueTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbG9jYXRpb24gb2YgdGhlIFJlY3RhbmdsZSBvYmplY3QncyB0b3AtbGVmdCBjb3JuZXIsIGRldGVybWluZWQgYnkgdGhlXG5cdCAqIDxpPng8L2k+IGFuZCA8aT55PC9pPiBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHRvcExlZnQoKTpQb2ludFxuXHR7XG5cdFx0aWYgKHRoaXMuX3RvcExlZnQgPT0gbnVsbClcblx0XHRcdHRoaXMuX3RvcExlZnQgPSBuZXcgUG9pbnQoKTtcblxuXHRcdHRoaXMuX3RvcExlZnQueCA9IHRoaXMueDtcblx0XHR0aGlzLl90b3BMZWZ0LnkgPSB0aGlzLnk7XG5cblx0XHRyZXR1cm4gdGhpcy5fdG9wTGVmdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFJlY3RhbmdsZSBvYmplY3Qgd2l0aCB0aGUgdG9wLWxlZnQgY29ybmVyIHNwZWNpZmllZCBieSB0aGVcblx0ICogPGNvZGU+eDwvY29kZT4gYW5kIDxjb2RlPnk8L2NvZGU+IHBhcmFtZXRlcnMgYW5kIHdpdGggdGhlIHNwZWNpZmllZFxuXHQgKiA8Y29kZT53aWR0aDwvY29kZT4gYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gcGFyYW1ldGVycy4gSWYgeW91IGNhbGwgdGhpc1xuXHQgKiBwdWJsaWMgd2l0aG91dCBwYXJhbWV0ZXJzLCBhIHJlY3RhbmdsZSB3aXRoIDxjb2RlPng8L2NvZGU+LFxuXHQgKiA8Y29kZT55PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+LCBhbmQgPGNvZGU+aGVpZ2h0PC9jb2RlPiBwcm9wZXJ0aWVzIHNldFxuXHQgKiB0byAwIGlzIGNyZWF0ZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSB4ICAgICAgVGhlIDxpPng8L2k+IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGVcblx0ICogICAgICAgICAgICAgICByZWN0YW5nbGUuXG5cdCAqIEBwYXJhbSB5ICAgICAgVGhlIDxpPnk8L2k+IGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGVcblx0ICogICAgICAgICAgICAgICByZWN0YW5nbGUuXG5cdCAqIEBwYXJhbSB3aWR0aCAgVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHBpeGVscy5cblx0ICogQHBhcmFtIGhlaWdodCBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUsIGluIHBpeGVscy5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHg6bnVtYmVyID0gMCwgeTpudW1iZXIgPSAwLCB3aWR0aDpudW1iZXIgPSAwLCBoZWlnaHQ6bnVtYmVyID0gMClcblx0e1xuXHRcdHRoaXMueCA9IHg7XG5cdFx0dGhpcy55ID0geTtcblx0XHR0aGlzLndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG5ldyBSZWN0YW5nbGUgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWVzIGZvciB0aGVcblx0ICogPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCA8Y29kZT53aWR0aDwvY29kZT4sIGFuZFxuXHQgKiA8Y29kZT5oZWlnaHQ8L2NvZGU+IHByb3BlcnRpZXMgYXMgdGhlIG9yaWdpbmFsIFJlY3RhbmdsZSBvYmplY3QuXG5cdCAqXG5cdCAqIEByZXR1cm4gQSBuZXcgUmVjdGFuZ2xlIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlcyBmb3IgdGhlXG5cdCAqICAgICAgICAgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCA8Y29kZT53aWR0aDwvY29kZT4sIGFuZFxuXHQgKiAgICAgICAgIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcyBhcyB0aGUgb3JpZ2luYWwgUmVjdGFuZ2xlIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOlJlY3RhbmdsZVxuXHR7XG5cdFx0cmV0dXJuIG5ldyBSZWN0YW5nbGUodGhpcy54LCB0aGlzLnksIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwb2ludCBpcyBjb250YWluZWQgd2l0aGluIHRoZSByZWN0YW5ndWxhclxuXHQgKiByZWdpb24gZGVmaW5lZCBieSB0aGlzIFJlY3RhbmdsZSBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSB4IFRoZSA8aT54PC9pPiBjb29yZGluYXRlKGhvcml6b250YWwgcG9zaXRpb24pIG9mIHRoZSBwb2ludC5cblx0ICogQHBhcmFtIHkgVGhlIDxpPnk8L2k+IGNvb3JkaW5hdGUodmVydGljYWwgcG9zaXRpb24pIG9mIHRoZSBwb2ludC5cblx0ICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBSZWN0YW5nbGUgb2JqZWN0IGNvbnRhaW5zIHRoZVxuXHQgKiAgICAgICAgIHNwZWNpZmllZCBwb2ludDsgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBjb250YWlucyh4Om51bWJlciwgeTpudW1iZXIpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy54IDw9IHggJiYgdGhpcy54ICsgdGhpcy53aWR0aCA+PSB4ICYmIHRoaXMueSA8PSB5ICYmIHRoaXMueSArIHRoaXMuaGVpZ2h0ID49IHkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIHBvaW50IGlzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHJlY3Rhbmd1bGFyXG5cdCAqIHJlZ2lvbiBkZWZpbmVkIGJ5IHRoaXMgUmVjdGFuZ2xlIG9iamVjdC4gVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byB0aGVcblx0ICogPGNvZGU+UmVjdGFuZ2xlLmNvbnRhaW5zKCk8L2NvZGU+IG1ldGhvZCwgZXhjZXB0IHRoYXQgaXQgdGFrZXMgYSBQb2ludFxuXHQgKiBvYmplY3QgYXMgYSBwYXJhbWV0ZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBwb2ludCBUaGUgcG9pbnQsIGFzIHJlcHJlc2VudGVkIGJ5IGl0cyA8aT54PC9pPiBhbmQgPGk+eTwvaT5cblx0ICogICAgICAgICAgICAgIGNvb3JkaW5hdGVzLlxuXHQgKiBAcmV0dXJuIEEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIFJlY3RhbmdsZSBvYmplY3QgY29udGFpbnMgdGhlXG5cdCAqICAgICAgICAgc3BlY2lmaWVkIHBvaW50OyBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGNvbnRhaW5zUG9pbnQocG9pbnQ6UG9pbnQpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy54IDw9IHBvaW50LnggJiYgdGhpcy54ICsgdGhpcy53aWR0aCA+PSBwb2ludC54ICYmIHRoaXMueSA8PSBwb2ludC55ICYmIHRoaXMueSArIHRoaXMuaGVpZ2h0ID49IHBvaW50LnkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgUmVjdGFuZ2xlIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPnJlY3Q8L2NvZGU+XG5cdCAqIHBhcmFtZXRlciBpcyBjb250YWluZWQgd2l0aGluIHRoaXMgUmVjdGFuZ2xlIG9iamVjdC4gQSBSZWN0YW5nbGUgb2JqZWN0IGlzXG5cdCAqIHNhaWQgdG8gY29udGFpbiBhbm90aGVyIGlmIHRoZSBzZWNvbmQgUmVjdGFuZ2xlIG9iamVjdCBmYWxscyBlbnRpcmVseVxuXHQgKiB3aXRoaW4gdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGZpcnN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVjdCBUaGUgUmVjdGFuZ2xlIG9iamVjdCBiZWluZyBjaGVja2VkLlxuXHQgKiBAcmV0dXJuIEEgdmFsdWUgb2YgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIFJlY3RhbmdsZSBvYmplY3QgdGhhdCB5b3Vcblx0ICogICAgICAgICBzcGVjaWZ5IGlzIGNvbnRhaW5lZCBieSB0aGlzIFJlY3RhbmdsZSBvYmplY3Q7IG90aGVyd2lzZVxuXHQgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBjb250YWluc1JlY3QocmVjdDpSZWN0YW5nbGUpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy54IDw9IHJlY3QueCAmJiB0aGlzLnggKyB0aGlzLndpZHRoID49IHJlY3QueCArIHJlY3Qud2lkdGggJiYgdGhpcy55IDw9IHJlY3QueSAmJiB0aGlzLnkgKyB0aGlzLmhlaWdodCA+PSByZWN0LnkgKyByZWN0LmhlaWdodClcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3BpZXMgYWxsIG9mIHJlY3RhbmdsZSBkYXRhIGZyb20gdGhlIHNvdXJjZSBSZWN0YW5nbGUgb2JqZWN0IGludG8gdGhlXG5cdCAqIGNhbGxpbmcgUmVjdGFuZ2xlIG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZVJlY3QgVGhlIFJlY3RhbmdsZSBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHRoZSBkYXRhLlxuXHQgKi9cblx0cHVibGljIGNvcHlGcm9tKHNvdXJjZVJlY3Q6UmVjdGFuZ2xlKVxuXHR7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG9iamVjdCBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPnRvQ29tcGFyZTwvY29kZT5cblx0ICogcGFyYW1ldGVyIGlzIGVxdWFsIHRvIHRoaXMgUmVjdGFuZ2xlIG9iamVjdC4gVGhpcyBtZXRob2QgY29tcGFyZXMgdGhlXG5cdCAqIDxjb2RlPng8L2NvZGU+LCA8Y29kZT55PC9jb2RlPiwgPGNvZGU+d2lkdGg8L2NvZGU+LCBhbmRcblx0ICogPGNvZGU+aGVpZ2h0PC9jb2RlPiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhZ2FpbnN0IHRoZSBzYW1lIHByb3BlcnRpZXMgb2Zcblx0ICogdGhpcyBSZWN0YW5nbGUgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gdG9Db21wYXJlIFRoZSByZWN0YW5nbGUgdG8gY29tcGFyZSB0byB0aGlzIFJlY3RhbmdsZSBvYmplY3QuXG5cdCAqIEByZXR1cm4gQSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGhhcyBleGFjdGx5IHRoZSBzYW1lXG5cdCAqICAgICAgICAgdmFsdWVzIGZvciB0aGUgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCA8Y29kZT53aWR0aDwvY29kZT4sXG5cdCAqICAgICAgICAgYW5kIDxjb2RlPmhlaWdodDwvY29kZT4gcHJvcGVydGllcyBhcyB0aGlzIFJlY3RhbmdsZSBvYmplY3Q7XG5cdCAqICAgICAgICAgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBlcXVhbHModG9Db21wYXJlOlJlY3RhbmdsZSk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuICh0aGlzLnggPT0gdG9Db21wYXJlLnggJiYgdGhpcy55ID09IHRvQ29tcGFyZS55ICYmIHRoaXMud2lkdGggPT0gdG9Db21wYXJlLndpZHRoICYmIHRoaXMuaGVpZ2h0ID09IHRvQ29tcGFyZS5oZWlnaHQpXG5cdH1cblxuXHQvKipcblx0ICogSW5jcmVhc2VzIHRoZSBzaXplIG9mIHRoZSBSZWN0YW5nbGUgb2JqZWN0IGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50cywgaW5cblx0ICogcGl4ZWxzLiBUaGUgY2VudGVyIHBvaW50IG9mIHRoZSBSZWN0YW5nbGUgb2JqZWN0IHN0YXlzIHRoZSBzYW1lLCBhbmQgaXRzXG5cdCAqIHNpemUgaW5jcmVhc2VzIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBieSB0aGUgPGNvZGU+ZHg8L2NvZGU+IHZhbHVlLCBhbmQgdG9cblx0ICogdGhlIHRvcCBhbmQgdGhlIGJvdHRvbSBieSB0aGUgPGNvZGU+ZHk8L2NvZGU+IHZhbHVlLlxuXHQgKlxuXHQgKiBAcGFyYW0gZHggVGhlIHZhbHVlIHRvIGJlIGFkZGVkIHRvIHRoZSBsZWZ0IGFuZCB0aGUgcmlnaHQgb2YgdGhlIFJlY3RhbmdsZVxuXHQgKiAgICAgICAgICAgb2JqZWN0LiBUaGUgZm9sbG93aW5nIGVxdWF0aW9uIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBuZXdcblx0ICogICAgICAgICAgIHdpZHRoIGFuZCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlOlxuXHQgKiBAcGFyYW0gZHkgVGhlIHZhbHVlIHRvIGJlIGFkZGVkIHRvIHRoZSB0b3AgYW5kIHRoZSBib3R0b20gb2YgdGhlXG5cdCAqICAgICAgICAgICBSZWN0YW5nbGUuIFRoZSBmb2xsb3dpbmcgZXF1YXRpb24gaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIG5ld1xuXHQgKiAgICAgICAgICAgaGVpZ2h0IGFuZCBwb3NpdGlvbiBvZiB0aGUgcmVjdGFuZ2xlOlxuXHQgKi9cblx0cHVibGljIGluZmxhdGUoZHg6bnVtYmVyLCBkeTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLnggLT0gZHgvMjtcblx0XHR0aGlzLnkgLT0gZHkvMjtcblx0XHR0aGlzLndpZHRoICs9IGR4LzI7XG5cdFx0dGhpcy5oZWlnaHQgKz0gZHkvMjtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIFJlY3RhbmdsZSBvYmplY3QuIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gdGhlXG5cdCAqIDxjb2RlPlJlY3RhbmdsZS5pbmZsYXRlKCk8L2NvZGU+IG1ldGhvZCBleGNlcHQgaXQgdGFrZXMgYSBQb2ludCBvYmplY3QgYXNcblx0ICogYSBwYXJhbWV0ZXIuXG5cdCAqXG5cdCAqIDxwPlRoZSBmb2xsb3dpbmcgdHdvIGNvZGUgZXhhbXBsZXMgZ2l2ZSB0aGUgc2FtZSByZXN1bHQ6PC9wPlxuXHQgKlxuXHQgKiBAcGFyYW0gcG9pbnQgVGhlIDxjb2RlPng8L2NvZGU+IHByb3BlcnR5IG9mIHRoaXMgUG9pbnQgb2JqZWN0IGlzIHVzZWQgdG9cblx0ICogICAgICAgICAgICAgIGluY3JlYXNlIHRoZSBob3Jpem9udGFsIGRpbWVuc2lvbiBvZiB0aGUgUmVjdGFuZ2xlIG9iamVjdC5cblx0ICogICAgICAgICAgICAgIFRoZSA8Y29kZT55PC9jb2RlPiBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluY3JlYXNlIHRoZSB2ZXJ0aWNhbFxuXHQgKiAgICAgICAgICAgICAgZGltZW5zaW9uIG9mIHRoZSBSZWN0YW5nbGUgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGluZmxhdGVQb2ludChwb2ludDpQb2ludClcblx0e1xuXHRcdHRoaXMueCAtPSBwb2ludC54LzI7XG5cdFx0dGhpcy55IC09IHBvaW50LnkvMjtcblx0XHR0aGlzLndpZHRoICs9IHBvaW50LngvMjtcblx0XHR0aGlzLmhlaWdodCArPSBwb2ludC55LzI7XG5cdH1cblxuXHQvKipcblx0ICogSWYgdGhlIFJlY3RhbmdsZSBvYmplY3Qgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT50b0ludGVyc2VjdDwvY29kZT5cblx0ICogcGFyYW1ldGVyIGludGVyc2VjdHMgd2l0aCB0aGlzIFJlY3RhbmdsZSBvYmplY3QsIHJldHVybnMgdGhlIGFyZWEgb2Zcblx0ICogaW50ZXJzZWN0aW9uIGFzIGEgUmVjdGFuZ2xlIG9iamVjdC4gSWYgdGhlIHJlY3RhbmdsZXMgZG8gbm90IGludGVyc2VjdCxcblx0ICogdGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBSZWN0YW5nbGUgb2JqZWN0IHdpdGggaXRzIHByb3BlcnRpZXMgc2V0IHRvXG5cdCAqIDAuXG5cdCAqXG5cdCAqIEBwYXJhbSB0b0ludGVyc2VjdCBUaGUgUmVjdGFuZ2xlIG9iamVjdCB0byBjb21wYXJlIGFnYWluc3QgdG8gc2VlIGlmIGl0XG5cdCAqICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3RzIHdpdGggdGhpcyBSZWN0YW5nbGUgb2JqZWN0LlxuXHQgKiBAcmV0dXJuIEEgUmVjdGFuZ2xlIG9iamVjdCB0aGF0IGVxdWFscyB0aGUgYXJlYSBvZiBpbnRlcnNlY3Rpb24uIElmIHRoZVxuXHQgKiAgICAgICAgIHJlY3RhbmdsZXMgZG8gbm90IGludGVyc2VjdCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBlbXB0eVxuXHQgKiAgICAgICAgIFJlY3RhbmdsZSBvYmplY3Q7IHRoYXQgaXMsIGEgcmVjdGFuZ2xlIHdpdGggaXRzIDxjb2RlPng8L2NvZGU+LFxuXHQgKiAgICAgICAgIDxjb2RlPnk8L2NvZGU+LCA8Y29kZT53aWR0aDwvY29kZT4sIGFuZCA8Y29kZT5oZWlnaHQ8L2NvZGU+XG5cdCAqICAgICAgICAgcHJvcGVydGllcyBzZXQgdG8gMC5cblx0ICovXG5cdHB1YmxpYyBpbnRlcnNlY3Rpb24odG9JbnRlcnNlY3Q6UmVjdGFuZ2xlKTpSZWN0YW5nbGVcblx0e1xuXHRcdGlmICh0aGlzLmludGVyc2VjdHModG9JbnRlcnNlY3QpKSB7XG5cdFx0XHR2YXIgaTpSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKCk7XG5cblx0XHRcdGlmICh0aGlzLnggPiB0b0ludGVyc2VjdC54KSB7XG5cdFx0XHRcdGkueCA9IHRoaXMueDtcblx0XHRcdFx0aS53aWR0aCA9IHRvSW50ZXJzZWN0LnggLSB0aGlzLnggKyB0b0ludGVyc2VjdC53aWR0aDtcblxuXHRcdFx0XHRpZiAoaS53aWR0aCA+IHRoaXMud2lkdGgpXG5cdFx0XHRcdFx0aS53aWR0aCA9IHRoaXMud2lkdGg7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpLnggPSB0b0ludGVyc2VjdC54O1xuXHRcdFx0XHRpLndpZHRoID0gdGhpcy54IC0gdG9JbnRlcnNlY3QueCArIHRoaXMud2lkdGg7XG5cblx0XHRcdFx0aWYgKGkud2lkdGggPiB0b0ludGVyc2VjdC53aWR0aClcblx0XHRcdFx0XHRpLndpZHRoID0gdG9JbnRlcnNlY3Qud2lkdGg7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnkgPiB0b0ludGVyc2VjdC55KSB7XG5cdFx0XHRcdGkueSA9IHRoaXMueTtcblx0XHRcdFx0aS5oZWlnaHQgPSB0b0ludGVyc2VjdC55IC0gdGhpcy55ICsgdG9JbnRlcnNlY3QuaGVpZ2h0O1xuXG5cdFx0XHRcdGlmIChpLmhlaWdodCA+IHRoaXMuaGVpZ2h0KVxuXHRcdFx0XHRcdGkuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpLnkgPSB0b0ludGVyc2VjdC55O1xuXHRcdFx0XHRpLmhlaWdodCA9IHRoaXMueSAtIHRvSW50ZXJzZWN0LnkgKyB0aGlzLmhlaWdodDtcblxuXHRcdFx0XHRpZiAoaS5oZWlnaHQgPiB0b0ludGVyc2VjdC5oZWlnaHQpXG5cdFx0XHRcdFx0aS5oZWlnaHQgPSB0b0ludGVyc2VjdC5oZWlnaHQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgUmVjdGFuZ2xlKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBvYmplY3Qgc3BlY2lmaWVkIGluIHRoZSA8Y29kZT50b0ludGVyc2VjdDwvY29kZT5cblx0ICogcGFyYW1ldGVyIGludGVyc2VjdHMgd2l0aCB0aGlzIFJlY3RhbmdsZSBvYmplY3QuIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGVcblx0ICogPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCA8Y29kZT53aWR0aDwvY29kZT4sIGFuZFxuXHQgKiA8Y29kZT5oZWlnaHQ8L2NvZGU+IHByb3BlcnRpZXMgb2YgdGhlIHNwZWNpZmllZCBSZWN0YW5nbGUgb2JqZWN0IHRvIHNlZSBpZlxuXHQgKiBpdCBpbnRlcnNlY3RzIHdpdGggdGhpcyBSZWN0YW5nbGUgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gdG9JbnRlcnNlY3QgVGhlIFJlY3RhbmdsZSBvYmplY3QgdG8gY29tcGFyZSBhZ2FpbnN0IHRoaXMgUmVjdGFuZ2xlXG5cdCAqICAgICAgICAgICAgICAgICAgICBvYmplY3QuXG5cdCAqIEByZXR1cm4gQSB2YWx1ZSBvZiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpbnRlcnNlY3RzXG5cdCAqICAgICAgICAgd2l0aCB0aGlzIFJlY3RhbmdsZSBvYmplY3Q7IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgaW50ZXJzZWN0cyh0b0ludGVyc2VjdDpSZWN0YW5nbGUpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy54ICsgdGhpcy53aWR0aCA+IHRvSW50ZXJzZWN0LnggJiYgdGhpcy54IDwgdG9JbnRlcnNlY3QueCArIHRvSW50ZXJzZWN0LndpZHRoICYmIHRoaXMueSArIHRoaXMuaGVpZ2h0ID4gdG9JbnRlcnNlY3QueSAmJiB0aGlzLnkgPCB0b0ludGVyc2VjdC55ICsgdG9JbnRlcnNlY3QuaGVpZ2h0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoaXMgUmVjdGFuZ2xlIG9iamVjdCBpcyBlbXB0eS5cblx0ICpcblx0ICogQHJldHVybiBBIHZhbHVlIG9mIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBSZWN0YW5nbGUgb2JqZWN0J3Mgd2lkdGggb3Jcblx0ICogICAgICAgICBoZWlnaHQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDA7IG90aGVyd2lzZSA8Y29kZT5mYWxzZTwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgaXNFbXB0eSgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy54ID09IDAgJiYgdGhpcy55ID09IDAgJiYgdGhpcy53aWR0aCA9PSAwICYmIHRoaXMuaGVpZ2h0ID09IDApO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkanVzdHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBSZWN0YW5nbGUgb2JqZWN0LCBhcyBkZXRlcm1pbmVkIGJ5IGl0c1xuXHQgKiB0b3AtbGVmdCBjb3JuZXIsIGJ5IHRoZSBzcGVjaWZpZWQgYW1vdW50cy5cblx0ICpcblx0ICogQHBhcmFtIGR4IE1vdmVzIHRoZSA8aT54PC9pPiB2YWx1ZSBvZiB0aGUgUmVjdGFuZ2xlIG9iamVjdCBieSB0aGlzIGFtb3VudC5cblx0ICogQHBhcmFtIGR5IE1vdmVzIHRoZSA8aT55PC9pPiB2YWx1ZSBvZiB0aGUgUmVjdGFuZ2xlIG9iamVjdCBieSB0aGlzIGFtb3VudC5cblx0ICovXG5cdHB1YmxpYyBvZmZzZXQoZHg6bnVtYmVyLCBkeTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLnggKz0gZHg7XG5cdFx0dGhpcy55ICs9IGR5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkanVzdHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBSZWN0YW5nbGUgb2JqZWN0IHVzaW5nIGEgUG9pbnQgb2JqZWN0IGFzIGFcblx0ICogcGFyYW1ldGVyLiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHRoZSA8Y29kZT5SZWN0YW5nbGUub2Zmc2V0KCk8L2NvZGU+XG5cdCAqIG1ldGhvZCwgZXhjZXB0IHRoYXQgaXQgdGFrZXMgYSBQb2ludCBvYmplY3QgYXMgYSBwYXJhbWV0ZXIuXG5cdCAqXG5cdCAqIEBwYXJhbSBwb2ludCBBIFBvaW50IG9iamVjdCB0byB1c2UgdG8gb2Zmc2V0IHRoaXMgUmVjdGFuZ2xlIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBvZmZzZXRQb2ludChwb2ludDpQb2ludClcblx0e1xuXHRcdHRoaXMueCArPSBwb2ludC54O1xuXHRcdHRoaXMueSArPSBwb2ludC55O1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYWxsIG9mIHRoZSBSZWN0YW5nbGUgb2JqZWN0J3MgcHJvcGVydGllcyB0byAwLiBBIFJlY3RhbmdsZSBvYmplY3QgaXNcblx0ICogZW1wdHkgaWYgaXRzIHdpZHRoIG9yIGhlaWdodCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMC5cblx0ICpcblx0ICogPHA+IFRoaXMgbWV0aG9kIHNldHMgdGhlIHZhbHVlcyBvZiB0aGUgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LFxuXHQgKiA8Y29kZT53aWR0aDwvY29kZT4sIGFuZCA8Y29kZT5oZWlnaHQ8L2NvZGU+IHByb3BlcnRpZXMgdG8gMC48L3A+XG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgc2V0RW1wdHkoKVxuXHR7XG5cdFx0dGhpcy54ID0gMDtcblx0XHR0aGlzLnkgPSAwO1xuXHRcdHRoaXMud2lkdGggPSAwO1xuXHRcdHRoaXMuaGVpZ2h0ID0gMDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBtZW1iZXJzIG9mIFJlY3RhbmdsZSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlc1xuXHQgKlxuXHQgKiBAcGFyYW0geGEgICAgICBUaGUgPGk+eDwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZVxuXHQgKiAgICAgICAgICAgICAgICByZWN0YW5nbGUuXG5cdCAqIEBwYXJhbSB5YSAgICAgIFRoZSA8aT55PC9pPiBjb29yZGluYXRlIG9mIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlXG5cdCAqICAgICAgICAgICAgICAgIHJlY3RhbmdsZS5cblx0ICogQHBhcmFtIHdpZHRoYSAgVGhlIHdpZHRoIG9mIHRoZSByZWN0YW5nbGUsIGluIHBpeGVscy5cblx0ICogQHBhcmFtIGhlaWdodGEgVGhlIGhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlLCBpbiBwaXhlbHMuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VG8oeGE6bnVtYmVyLCB5YTpudW1iZXIsIHdpZHRoYTpudW1iZXIsIGhlaWdodGE6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy54ID0geGE7XG5cdFx0dGhpcy55ID0geWE7XG5cdFx0dGhpcy53aWR0aCA9IHdpZHRoYTtcblx0XHR0aGlzLmhlaWdodCA9IGhlaWdodGE7XG5cdH1cblxuXHQvKipcblx0ICogQnVpbGRzIGFuZCByZXR1cm5zIGEgc3RyaW5nIHRoYXQgbGlzdHMgdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsXG5cdCAqIHBvc2l0aW9ucyBhbmQgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIFJlY3RhbmdsZSBvYmplY3QuXG5cdCAqXG5cdCAqIEByZXR1cm4gQSBzdHJpbmcgbGlzdGluZyB0aGUgdmFsdWUgb2YgZWFjaCBvZiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgb2Zcblx0ICogICAgICAgICB0aGUgUmVjdGFuZ2xlIG9iamVjdDogPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LFxuXHQgKiAgICAgICAgIDxjb2RlPndpZHRoPC9jb2RlPiwgYW5kIDxjb2RlPmhlaWdodDwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgdG9TdHJpbmcoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBcIltSZWN0YW5nbGVdICh4PVwiICsgdGhpcy54ICsgXCIsIHk9XCIgKyB0aGlzLnkgKyBcIiwgd2lkdGg9XCIgKyB0aGlzLndpZHRoICsgXCIsIGhlaWdodD1cIiArIHRoaXMuaGVpZ2h0ICsgXCIpXCI7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyB0d28gcmVjdGFuZ2xlcyB0b2dldGhlciB0byBjcmVhdGUgYSBuZXcgUmVjdGFuZ2xlIG9iamVjdCwgYnkgZmlsbGluZ1xuXHQgKiBpbiB0aGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc3BhY2UgYmV0d2VlbiB0aGUgdHdvIHJlY3RhbmdsZXMuXG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU6PC9iPiBUaGUgPGNvZGU+dW5pb24oKTwvY29kZT4gbWV0aG9kIGlnbm9yZXMgcmVjdGFuZ2xlcyB3aXRoXG5cdCAqIDxjb2RlPjA8L2NvZGU+IGFzIHRoZSBoZWlnaHQgb3Igd2lkdGggdmFsdWUsIHN1Y2ggYXM6IDxjb2RlPnZhclxuXHQgKiByZWN0MjpSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKDMwMCwzMDAsNTAsMCk7PC9jb2RlPjwvcD5cblx0ICpcblx0ICogQHBhcmFtIHRvVW5pb24gQSBSZWN0YW5nbGUgb2JqZWN0IHRvIGFkZCB0byB0aGlzIFJlY3RhbmdsZSBvYmplY3QuXG5cdCAqIEByZXR1cm4gQSBuZXcgUmVjdGFuZ2xlIG9iamVjdCB0aGF0IGlzIHRoZSB1bmlvbiBvZiB0aGUgdHdvIHJlY3RhbmdsZXMuXG5cdCAqL1xuXHRwdWJsaWMgdW5pb24odG9VbmlvbjpSZWN0YW5nbGUpOlJlY3RhbmdsZVxuXHR7XG5cdFx0dmFyIHU6UmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgpO1xuXG5cdFx0aWYgKHRoaXMueCA8IHRvVW5pb24ueCkge1xuXHRcdFx0dS54ID0gdGhpcy54O1xuXHRcdFx0dS53aWR0aCA9IHRvVW5pb24ueCAtIHRoaXMueCArIHRvVW5pb24ud2lkdGg7XG5cblx0XHRcdGlmICh1LndpZHRoIDwgdGhpcy53aWR0aClcblx0XHRcdFx0dS53aWR0aCA9IHRoaXMud2lkdGg7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHUueCA9IHRvVW5pb24ueDtcblx0XHRcdHUud2lkdGggPSB0aGlzLnggLSB0b1VuaW9uLnggKyB0aGlzLndpZHRoO1xuXG5cdFx0XHRpZiAodS53aWR0aCA8IHRvVW5pb24ud2lkdGgpXG5cdFx0XHRcdHUud2lkdGggPSB0b1VuaW9uLndpZHRoO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnkgPCB0b1VuaW9uLnkpIHtcblx0XHRcdHUueSA9IHRoaXMueTtcblx0XHRcdHUuaGVpZ2h0ID0gdG9Vbmlvbi55IC0gdGhpcy55ICsgdG9Vbmlvbi5oZWlnaHQ7XG5cblx0XHRcdGlmICh1LmhlaWdodCA8IHRoaXMuaGVpZ2h0KVxuXHRcdFx0XHR1LmhlaWdodCA9IHRoaXMuaGVpZ2h0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR1LnkgPSB0b1VuaW9uLnk7XG5cdFx0XHR1LmhlaWdodCA9IHRoaXMueSAtIHRvVW5pb24ueSArIHRoaXMuaGVpZ2h0O1xuXG5cdFx0XHRpZiAodS5oZWlnaHQgPCB0b1VuaW9uLmhlaWdodClcblx0XHRcdFx0dS5oZWlnaHQgPSB0b1VuaW9uLmhlaWdodDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdTtcblx0fVxufVxuXG5leHBvcnQgPSBSZWN0YW5nbGU7Il19 \ No newline at end of file diff --git a/lib/core/geom/Rectangle.ts b/lib/core/geom/Rectangle.ts new file mode 100644 index 00000000..25ce9cc2 --- /dev/null +++ b/lib/core/geom/Rectangle.ts @@ -0,0 +1,535 @@ +import Point = require("awayjs-core/lib/core/geom/Point"); + +/** + * A Rectangle object is an area defined by its position, as indicated by its + * top-left corner point(x, y) and by its width and its height. + * + * + *

The x, y, width, and + * height properties of the Rectangle class are independent of + * each other; changing the value of one property has no effect on the others. + * However, the right and bottom properties are + * integrally related to those four properties. For example, if you change the + * value of the right property, the value of the + * width property changes; if you change the bottom + * property, the value of the height property changes.

+ * + *

The following methods and properties use Rectangle objects:

+ * + *
    + *
  • The applyFilter(), colorTransform(), + * copyChannel(), copyPixels(), draw(), + * fillRect(), generateFilterRect(), + * getColorBoundsRect(), getPixels(), + * merge(), paletteMap(), + * pixelDisolve(), setPixels(), and + * threshold() methods, and the rect property of the + * BitmapData class
  • + *
  • The getBounds() and getRect() methods, and + * the scrollRect and scale9Grid properties of the + * DisplayObject class
  • + *
  • The getCharBoundaries() method of the TextField + * class
  • + *
  • The pixelBounds property of the Transform class
  • + *
  • The bounds parameter for the startDrag() + * method of the Sprite class
  • + *
  • The printArea parameter of the addPage() + * method of the PrintJob class
  • + *
+ * + *

You can use the new Rectangle() constructor to create a + * Rectangle object.

+ * + *

Note: The Rectangle class does not define a rectangular Shape + * display object. To draw a rectangular Shape object onscreen, use the + * drawRect() method of the Graphics class.

+ */ +class Rectangle +{ + private _size:Point; + private _bottomRight:Point; + private _topLeft:Point; + + /** + * The height of the rectangle, in pixels. Changing the height + * value of a Rectangle object has no effect on the x, + * y, and width properties. + */ + public height:number; + + /** + * The width of the rectangle, in pixels. Changing the width + * value of a Rectangle object has no effect on the x, + * y, and height properties. + */ + public width:number; + + /** + * The x coordinate of the top-left corner of the rectangle. Changing + * the value of the x property of a Rectangle object has no + * effect on the y, width, and height + * properties. + * + *

The value of the x property is equal to the value of the + * left property.

+ */ + public x:number; + + /** + * The y coordinate of the top-left corner of the rectangle. Changing + * the value of the y property of a Rectangle object has no + * effect on the x, width, and height + * properties. + * + *

The value of the y property is equal to the value of the + * top property.

+ */ + public y:number; + + /** + * The sum of the y and height properties. + */ + public get bottom():number + { + return this.y + this.height; + } + + /** + * The location of the Rectangle object's bottom-right corner, determined by + * the values of the right and bottom properties. + */ + public get bottomRight():Point + { + if (this._bottomRight == null) + this._bottomRight = new Point(); + + this._bottomRight.x = this.x + this.width; + this._bottomRight.y = this.y + this.height; + + return this._bottomRight; + } + + /** + * The x coordinate of the top-left corner of the rectangle. Changing + * the left property of a Rectangle object has no effect on the + * y and height properties. However it does affect + * the width property, whereas changing the x value + * does not affect the width property. + * + *

The value of the left property is equal to the value of + * the x property.

+ */ + public get left():number + { + return this.x; + } + + /** + * The sum of the x and width properties. + */ + public get right():number + { + return this.x + this.width; + } + + /** + * The size of the Rectangle object, expressed as a Point object with the + * values of the width and height properties. + */ + public get size():Point + { + if (this._size == null) + this._size = new Point(); + + this._size.x = this.width; + this._size.y = this.height; + + return this._size; + } + + /** + * The y coordinate of the top-left corner of the rectangle. Changing + * the top property of a Rectangle object has no effect on the + * x and width properties. However it does affect + * the height property, whereas changing the y + * value does not affect the height property. + * + *

The value of the top property is equal to the value of the + * y property.

+ */ + public get top():number + { + return this.y; + } + + /** + * The location of the Rectangle object's top-left corner, determined by the + * x and y coordinates of the point. + */ + public get topLeft():Point + { + if (this._topLeft == null) + this._topLeft = new Point(); + + this._topLeft.x = this.x; + this._topLeft.y = this.y; + + return this._topLeft; + } + + /** + * Creates a new Rectangle object with the top-left corner specified by the + * x and y parameters and with the specified + * width and height parameters. If you call this + * public without parameters, a rectangle with x, + * y, width, and height properties set + * to 0 is created. + * + * @param x The x coordinate of the top-left corner of the + * rectangle. + * @param y The y coordinate of the top-left corner of the + * rectangle. + * @param width The width of the rectangle, in pixels. + * @param height The height of the rectangle, in pixels. + */ + constructor(x:number = 0, y:number = 0, width:number = 0, height:number = 0) + { + this.x = x; + this.y = y; + this.width = width; + this.height = height; + } + + /** + * Returns a new Rectangle object with the same values for the + * x, y, width, and + * height properties as the original Rectangle object. + * + * @return A new Rectangle object with the same values for the + * x, y, width, and + * height properties as the original Rectangle object. + */ + public clone():Rectangle + { + return new Rectangle(this.x, this.y, this.width, this.height); + } + + /** + * Determines whether the specified point is contained within the rectangular + * region defined by this Rectangle object. + * + * @param x The x coordinate(horizontal position) of the point. + * @param y The y coordinate(vertical position) of the point. + * @return A value of true if the Rectangle object contains the + * specified point; otherwise false. + */ + public contains(x:number, y:number):boolean + { + return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y); + } + + /** + * Determines whether the specified point is contained within the rectangular + * region defined by this Rectangle object. This method is similar to the + * Rectangle.contains() method, except that it takes a Point + * object as a parameter. + * + * @param point The point, as represented by its x and y + * coordinates. + * @return A value of true if the Rectangle object contains the + * specified point; otherwise false. + */ + public containsPoint(point:Point):boolean + { + return (this.x <= point.x && this.x + this.width >= point.x && this.y <= point.y && this.y + this.height >= point.y); + } + + /** + * Determines whether the Rectangle object specified by the rect + * parameter is contained within this Rectangle object. A Rectangle object is + * said to contain another if the second Rectangle object falls entirely + * within the boundaries of the first. + * + * @param rect The Rectangle object being checked. + * @return A value of true if the Rectangle object that you + * specify is contained by this Rectangle object; otherwise + * false. + */ + public containsRect(rect:Rectangle):boolean + { + return (this.x <= rect.x && this.x + this.width >= rect.x + rect.width && this.y <= rect.y && this.y + this.height >= rect.y + rect.height) + } + + /** + * Copies all of rectangle data from the source Rectangle object into the + * calling Rectangle object. + * + * @param sourceRect The Rectangle object from which to copy the data. + */ + public copyFrom(sourceRect:Rectangle) + { + + } + + /** + * Determines whether the object specified in the toCompare + * parameter is equal to this Rectangle object. This method compares the + * x, y, width, and + * height properties of an object against the same properties of + * this Rectangle object. + * + * @param toCompare The rectangle to compare to this Rectangle object. + * @return A value of true if the object has exactly the same + * values for the x, y, width, + * and height properties as this Rectangle object; + * otherwise false. + */ + public equals(toCompare:Rectangle):boolean + { + return (this.x == toCompare.x && this.y == toCompare.y && this.width == toCompare.width && this.height == toCompare.height) + } + + /** + * Increases the size of the Rectangle object by the specified amounts, in + * pixels. The center point of the Rectangle object stays the same, and its + * size increases to the left and right by the dx value, and to + * the top and the bottom by the dy value. + * + * @param dx The value to be added to the left and the right of the Rectangle + * object. The following equation is used to calculate the new + * width and position of the rectangle: + * @param dy The value to be added to the top and the bottom of the + * Rectangle. The following equation is used to calculate the new + * height and position of the rectangle: + */ + public inflate(dx:number, dy:number) + { + this.x -= dx/2; + this.y -= dy/2; + this.width += dx/2; + this.height += dy/2; + } + + /** + * Increases the size of the Rectangle object. This method is similar to the + * Rectangle.inflate() method except it takes a Point object as + * a parameter. + * + *

The following two code examples give the same result:

+ * + * @param point The x property of this Point object is used to + * increase the horizontal dimension of the Rectangle object. + * The y property is used to increase the vertical + * dimension of the Rectangle object. + */ + public inflatePoint(point:Point) + { + this.x -= point.x/2; + this.y -= point.y/2; + this.width += point.x/2; + this.height += point.y/2; + } + + /** + * If the Rectangle object specified in the toIntersect + * parameter intersects with this Rectangle object, returns the area of + * intersection as a Rectangle object. If the rectangles do not intersect, + * this method returns an empty Rectangle object with its properties set to + * 0. + * + * @param toIntersect The Rectangle object to compare against to see if it + * intersects with this Rectangle object. + * @return A Rectangle object that equals the area of intersection. If the + * rectangles do not intersect, this method returns an empty + * Rectangle object; that is, a rectangle with its x, + * y, width, and height + * properties set to 0. + */ + public intersection(toIntersect:Rectangle):Rectangle + { + if (this.intersects(toIntersect)) { + var i:Rectangle = new Rectangle(); + + if (this.x > toIntersect.x) { + i.x = this.x; + i.width = toIntersect.x - this.x + toIntersect.width; + + if (i.width > this.width) + i.width = this.width; + } else { + i.x = toIntersect.x; + i.width = this.x - toIntersect.x + this.width; + + if (i.width > toIntersect.width) + i.width = toIntersect.width; + } + + if (this.y > toIntersect.y) { + i.y = this.y; + i.height = toIntersect.y - this.y + toIntersect.height; + + if (i.height > this.height) + i.height = this.height; + } else { + i.y = toIntersect.y; + i.height = this.y - toIntersect.y + this.height; + + if (i.height > toIntersect.height) + i.height = toIntersect.height; + } + + return i; + } + + return new Rectangle(); + } + + /** + * Determines whether the object specified in the toIntersect + * parameter intersects with this Rectangle object. This method checks the + * x, y, width, and + * height properties of the specified Rectangle object to see if + * it intersects with this Rectangle object. + * + * @param toIntersect The Rectangle object to compare against this Rectangle + * object. + * @return A value of true if the specified object intersects + * with this Rectangle object; otherwise false. + */ + public intersects(toIntersect:Rectangle):boolean + { + return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height); + } + + /** + * Determines whether or not this Rectangle object is empty. + * + * @return A value of true if the Rectangle object's width or + * height is less than or equal to 0; otherwise false. + */ + public isEmpty():boolean + { + return (this.x == 0 && this.y == 0 && this.width == 0 && this.height == 0); + } + + /** + * Adjusts the location of the Rectangle object, as determined by its + * top-left corner, by the specified amounts. + * + * @param dx Moves the x value of the Rectangle object by this amount. + * @param dy Moves the y value of the Rectangle object by this amount. + */ + public offset(dx:number, dy:number) + { + this.x += dx; + this.y += dy; + } + + /** + * Adjusts the location of the Rectangle object using a Point object as a + * parameter. This method is similar to the Rectangle.offset() + * method, except that it takes a Point object as a parameter. + * + * @param point A Point object to use to offset this Rectangle object. + */ + public offsetPoint(point:Point) + { + this.x += point.x; + this.y += point.y; + } + + /** + * Sets all of the Rectangle object's properties to 0. A Rectangle object is + * empty if its width or height is less than or equal to 0. + * + *

This method sets the values of the x, y, + * width, and height properties to 0.

+ * + */ + public setEmpty() + { + this.x = 0; + this.y = 0; + this.width = 0; + this.height = 0; + } + + /** + * Sets the members of Rectangle to the specified values + * + * @param xa The x coordinate of the top-left corner of the + * rectangle. + * @param ya The y coordinate of the top-left corner of the + * rectangle. + * @param widtha The width of the rectangle, in pixels. + * @param heighta The height of the rectangle, in pixels. + */ + public setTo(xa:number, ya:number, widtha:number, heighta:number) + { + this.x = xa; + this.y = ya; + this.width = widtha; + this.height = heighta; + } + + /** + * Builds and returns a string that lists the horizontal and vertical + * positions and the width and height of the Rectangle object. + * + * @return A string listing the value of each of the following properties of + * the Rectangle object: x, y, + * width, and height. + */ + public toString():string + { + return "[Rectangle] (x=" + this.x + ", y=" + this.y + ", width=" + this.width + ", height=" + this.height + ")"; + } + + /** + * Adds two rectangles together to create a new Rectangle object, by filling + * in the horizontal and vertical space between the two rectangles. + * + *

Note: The union() method ignores rectangles with + * 0 as the height or width value, such as: var + * rect2:Rectangle = new Rectangle(300,300,50,0);

+ * + * @param toUnion A Rectangle object to add to this Rectangle object. + * @return A new Rectangle object that is the union of the two rectangles. + */ + public union(toUnion:Rectangle):Rectangle + { + var u:Rectangle = new Rectangle(); + + if (this.x < toUnion.x) { + u.x = this.x; + u.width = toUnion.x - this.x + toUnion.width; + + if (u.width < this.width) + u.width = this.width; + } else { + u.x = toUnion.x; + u.width = this.x - toUnion.x + this.width; + + if (u.width < toUnion.width) + u.width = toUnion.width; + } + + if (this.y < toUnion.y) { + u.y = this.y; + u.height = toUnion.y - this.y + toUnion.height; + + if (u.height < this.height) + u.height = this.height; + } else { + u.y = toUnion.y; + u.height = this.y - toUnion.y + this.height; + + if (u.height < toUnion.height) + u.height = toUnion.height; + } + + return u; + } +} + +export = Rectangle; \ No newline at end of file diff --git a/lib/core/geom/Transform.js b/lib/core/geom/Transform.js new file mode 100755 index 00000000..2ad5553f --- /dev/null +++ b/lib/core/geom/Transform.js @@ -0,0 +1,341 @@ +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); + +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** +* The Transform class provides access to color adjustment properties and two- +* or three-dimensional transformation objects that can be applied to a +* display object. During the transformation, the color or the orientation and +* position of a display object is adjusted(offset) from the current values +* or coordinates to new values or coordinates. The Transform class also +* collects data about color and two-dimensional matrix transformations that +* are applied to a display object and all of its parent objects. You can +* access these combined transformations through the +* concatenatedColorTransform and concatenatedMatrix +* properties. +* +*

To apply color transformations: create a ColorTransform object, set the +* color adjustments using the object's methods and properties, and then +* assign the colorTransformation property of the +* transform property of the display object to the new +* ColorTransformation object.

+* +*

To apply two-dimensional transformations: create a Matrix object, set +* the matrix's two-dimensional transformation, and then assign the +* transform.matrix property of the display object to the new +* Matrix object.

+* +*

To apply three-dimensional transformations: start with a +* three-dimensional display object. A three-dimensional display object has a +* z property value other than zero. You do not need to create +* the Matrix3D object. For all three-dimensional objects, a Matrix3D object +* is created automatically when you assign a z value to a +* display object. You can access the display object's Matrix3D object through +* the display object's transform property. Using the methods of +* the Matrix3D class, you can add to or modify the existing transformation +* settings. Also, you can create a custom Matrix3D object, set the custom +* Matrix3D object's transformation elements, and then assign the new Matrix3D +* object to the display object using the transform.matrix +* property.

+* +*

To modify a perspective projection of the stage or root object: use the +* transform.matrix property of the root display object to gain +* access to the PerspectiveProjection object. Or, apply different perspective +* projection properties to a display object by setting the perspective +* projection properties of the display object's parent. The child display +* object inherits the new properties. Specifically, create a +* PerspectiveProjection object and set its properties, then assign the +* PerspectiveProjection object to the perspectiveProjection +* property of the parent display object's transform property. +* The specified projection transformation then applies to all the display +* object's three-dimensional children.

+* +*

Since both PerspectiveProjection and Matrix3D objects perform +* perspective transformations, do not assign both to a display object at the +* same time. Use the PerspectiveProjection object for focal length and +* projection center changes. For more control over the perspective +* transformation, create a perspective projection Matrix3D object.

+*/ +var Transform = (function () { + function Transform(displayObject) { + this._position = new Vector3D(); + this._displayObject = displayObject; + } + Object.defineProperty(Transform.prototype, "backVector", { + /** + * + */ + get: function () { + var director = Matrix3DUtils.getForward(this._displayObject._iMatrix3D); + director.negate(); + + return director; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "concatenatedColorTransform", { + /** + * A ColorTransform object representing the combined color transformations + * applied to the display object and all of its parent objects, back to the + * root level. If different color transformations have been applied at + * different levels, all of those transformations are concatenated into one + * ColorTransform object for this property. + */ + get: function () { + return this._concatenatedColorTransform; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "concatenatedMatrix", { + /** + * A Matrix object representing the combined transformation matrixes of the + * display object and all of its parent objects, back to the root level. If + * different transformation matrixes have been applied at different levels, + * all of those matrixes are concatenated into one matrix for this property. + * Also, for resizeable SWF content running in the browser, this property + * factors in the difference between stage coordinates and window coordinates + * due to window resizing. Thus, the property converts local coordinates to + * window coordinates, which may not be the same coordinate space as that of + * the Stage. + */ + get: function () { + return this._concatenatedMatrix; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "downVector", { + /** + * + */ + get: function () { + var director = Matrix3DUtils.getUp(this._displayObject._iMatrix3D); + director.negate(); + + return director; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "forwardVector", { + /** + * + */ + get: function () { + return Matrix3DUtils.getForward(this._displayObject._iMatrix3D); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "leftVector", { + /** + * + */ + get: function () { + var director = Matrix3DUtils.getRight(this._displayObject._iMatrix3D); + director.negate(); + + return director; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "matrix3D", { + /** + * Provides access to the Matrix3D object of a three-dimensional display + * object. The Matrix3D object represents a transformation matrix that + * determines the display object's position and orientation. A Matrix3D + * object can also perform perspective projection. + * + *

If the matrix property is set to a value(not + * null), the matrix3D property is + * null. And if the matrix3D property is set to a + * value(not null), the matrix property is + * null.

+ */ + get: function () { + return this._displayObject._iMatrix3D; + }, + set: function (val) { + this._displayObject._iMatrix3D = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Transform.prototype, "pixelBounds", { + /** + * A Rectangle object that defines the bounding rectangle of the display + * object on the stage. + */ + get: function () { + return this._pixelBounds; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "position", { + /** + * Defines the position of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + get: function () { + return this._displayObject._iMatrix3D.position; + }, + set: function (value) { + this._displayObject.x = value.x; + this._displayObject.y = value.y; + this._displayObject.z = value.z; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Transform.prototype, "rightVector", { + /** + * + */ + get: function () { + return Matrix3DUtils.getRight(this._displayObject._iMatrix3D); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Transform.prototype, "rotation", { + /** + * Defines the rotation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + get: function () { + return new Vector3D(this._displayObject.rotationX, this._displayObject.rotationY, this._displayObject.rotationZ); + }, + set: function (value) { + this._displayObject.rotationX = value.x; + this._displayObject.rotationY = value.y; + this._displayObject.rotationZ = value.z; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Transform.prototype, "scale", { + /** + * Defines the scale of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + get: function () { + return new Vector3D(this._displayObject.scaleX, this._displayObject.scaleY, this._displayObject.scaleZ); + }, + set: function (value) { + this._displayObject.scaleX = value.x; + this._displayObject.scaleY = value.y; + this._displayObject.scaleZ = value.z; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Transform.prototype, "upVector", { + /** + * + */ + get: function () { + return Matrix3DUtils.getUp(this._displayObject._iMatrix3D); + }, + enumerable: true, + configurable: true + }); + + /** + * Returns a Matrix3D object, which can transform the space of a specified + * display object in relation to the current display object's space. You can + * use the getRelativeMatrix3D() method to move one + * three-dimensional display object relative to another three-dimensional + * display object. + * + * @param relativeTo The display object relative to which the transformation + * occurs. To get a Matrix3D object relative to the stage, + * set the parameter to the root or + * stage object. To get the world-relative + * matrix of the display object, set the parameter to a + * display object that has a perspective transformation + * applied to it. + * @return A Matrix3D object that can be used to transform the space from the + * relativeTo display object to the current display + * object space. + */ + Transform.prototype.getRelativeMatrix3D = function (relativeTo) { + return new Matrix3D(); + }; + + /** + * Moves the 3d object forwards along it's local z axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveForward = function (distance) { + this._displayObject.translateLocal(Vector3D.Z_AXIS, distance); + }; + + /** + * Moves the 3d object backwards along it's local z axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveBackward = function (distance) { + this._displayObject.translateLocal(Vector3D.Z_AXIS, -distance); + }; + + /** + * Moves the 3d object backwards along it's local x axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveLeft = function (distance) { + this._displayObject.translateLocal(Vector3D.X_AXIS, -distance); + }; + + /** + * Moves the 3d object forwards along it's local x axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveRight = function (distance) { + this._displayObject.translateLocal(Vector3D.X_AXIS, distance); + }; + + /** + * Moves the 3d object forwards along it's local y axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveUp = function (distance) { + this._displayObject.translateLocal(Vector3D.Y_AXIS, distance); + }; + + /** + * Moves the 3d object backwards along it's local y axis + * + * @param distance The length of the movement + */ + Transform.prototype.moveDown = function (distance) { + this._displayObject.translateLocal(Vector3D.Y_AXIS, -distance); + }; + return Transform; +})(); + +module.exports = Transform; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9UcmFuc2Zvcm0udHMiXSwibmFtZXMiOlsiVHJhbnNmb3JtIiwiVHJhbnNmb3JtLmNvbnN0cnVjdG9yIiwiVHJhbnNmb3JtLmdldFJlbGF0aXZlTWF0cml4M0QiLCJUcmFuc2Zvcm0ubW92ZUZvcndhcmQiLCJUcmFuc2Zvcm0ubW92ZUJhY2t3YXJkIiwiVHJhbnNmb3JtLm1vdmVMZWZ0IiwiVHJhbnNmb3JtLm1vdmVSaWdodCIsIlRyYW5zZm9ybS5tb3ZlVXAiLCJUcmFuc2Zvcm0ubW92ZURvd24iXSwibWFwcGluZ3MiOiJBQUFBLDREQUdvRTtBQUNwRSxzRUFBNEU7O0FBRTVFLDREQUFvRTs7QUFHcEU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBcURHO0FBQ0g7SUEwTUNBLG1CQUFZQSxhQUEyQkE7UUFwTXZDQyxLQUFPQSxTQUFTQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQXNNMUNBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLGFBQWFBO0lBQ3BDQSxDQUFDQTtJQWxNREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLFFBQVFBLEdBQVlBLGFBQWFBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFVBQVVBLENBQUNBO1lBQ2hGQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTs7WUFFakJBLE9BQU9BLFFBQVFBO1FBQ2hCQSxDQUFDQTs7OztBQUFBQTtJQWlCREE7UUFBQUE7Ozs7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSwyQkFBMkJBO1FBQ3hDQSxDQUFDQTs7OztBQUFBQTtJQWFEQTtRQUFBQTs7Ozs7Ozs7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxtQkFBbUJBO1FBQ2hDQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsUUFBUUEsR0FBWUEsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsVUFBVUEsQ0FBQ0E7WUFDM0VBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBOztZQUVqQkEsT0FBT0EsUUFBUUE7UUFDaEJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxhQUFhQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxVQUFVQSxDQUFDQTtRQUNoRUEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLFFBQVFBLEdBQVlBLGFBQWFBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFVBQVVBLENBQUNBO1lBQzlFQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTs7WUFFakJBLE9BQU9BLFFBQVFBO1FBQ2hCQSxDQUFDQTs7OztBQUFBQTtJQTRCREE7UUFBQUE7Ozs7Ozs7Ozs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFVBQVVBO1FBQ3RDQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFvQkEsR0FBWUE7WUFFL0JBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFVBQVVBLEdBQUdBLEdBQUdBO1FBQ3JDQSxDQUFDQTs7OztBQUxBQTs7SUFzQkRBO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUE7UUFDekJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxVQUFVQSxDQUFDQSxRQUFRQTtRQUMvQ0EsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBb0JBLEtBQWNBO1lBRWpDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQTtZQUMvQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7WUFDL0JBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBO1FBQ2hDQSxDQUFDQTs7OztBQVBBQTs7SUFZREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLGFBQWFBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFVBQVVBLENBQUNBO1FBQzlEQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsRUFBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsRUFBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsQ0FBQ0E7UUFDakhBLENBQUNBO1FBRURBLEtBQUFBLFVBQW9CQSxLQUFjQTtZQUVqQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7WUFDdkNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFNBQVNBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBO1lBQ3ZDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxTQUFTQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQTtRQUN4Q0EsQ0FBQ0E7Ozs7QUFQQUE7O0lBWURBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxDQUFDQTtRQUN4R0EsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBaUJBLEtBQWNBO1lBRTlCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQTtZQUNwQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7WUFDcENBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBO1FBQ3JDQSxDQUFDQTs7OztBQVBBQTs7SUFZREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLFVBQVVBLENBQUNBO1FBQzNEQSxDQUFDQTs7OztBQUFBQTtJQXlCREE7Ozs7Ozs7Ozs7Ozs7Ozs7O01BREdBOzhDQUNIQSxVQUEyQkEsVUFBd0JBO1FBRWxERSxPQUFPQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTtJQUN0QkEsQ0FBQ0E7O0lBUURGOzs7O01BREdBO3NDQUNIQSxVQUFtQkEsUUFBZUE7UUFFakNHLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLGNBQWNBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLFFBQVFBLENBQUNBO0lBQzlEQSxDQUFDQTs7SUFPREg7Ozs7TUFER0E7dUNBQ0hBLFVBQW9CQSxRQUFlQTtRQUVsQ0ksSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7SUFDL0RBLENBQUNBOztJQVFESjs7OztNQUZHQTttQ0FFSEEsVUFBZ0JBLFFBQWVBO1FBRTlCSyxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxjQUFjQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxRQUFRQSxDQUFDQTtJQUMvREEsQ0FBQ0E7O0lBT0RMOzs7O01BREdBO29DQUNIQSxVQUFpQkEsUUFBZUE7UUFFL0JNLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLGNBQWNBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLFFBQVFBLENBQUNBO0lBQzlEQSxDQUFDQTs7SUFPRE47Ozs7TUFER0E7aUNBQ0hBLFVBQWNBLFFBQWVBO1FBRTVCTyxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxjQUFjQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxFQUFFQSxRQUFRQSxDQUFDQTtJQUM5REEsQ0FBQ0E7O0lBT0RQOzs7O01BREdBO21DQUNIQSxVQUFnQkEsUUFBZUE7UUFFOUJRLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLGNBQWNBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLFFBQVFBLENBQUNBO0lBQy9EQSxDQUFDQTtJQUNGUixpQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCwwQkFBbUIsQ0FDbkIiLCJmaWxlIjoiY29yZS9nZW9tL1RyYW5zZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IENvbG9yVHJhbnNmb3JtXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9Db2xvclRyYW5zZm9ybVwiKTtcbmltcG9ydCBNYXRyaXhcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXhcIik7XG5pbXBvcnQgTWF0cml4M0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBNYXRyaXgzRFV0aWxzXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFV0aWxzXCIpO1xuaW1wb3J0IFJlY3RhbmdsZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9SZWN0YW5nbGVcIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBQZXJzcGVjdGl2ZVByb2plY3Rpb25cdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9QZXJzcGVjdGl2ZVByb2plY3Rpb25cIik7XG5cbi8qKlxuICogVGhlIFRyYW5zZm9ybSBjbGFzcyBwcm92aWRlcyBhY2Nlc3MgdG8gY29sb3IgYWRqdXN0bWVudCBwcm9wZXJ0aWVzIGFuZCB0d28tXG4gKiBvciB0aHJlZS1kaW1lbnNpb25hbCB0cmFuc2Zvcm1hdGlvbiBvYmplY3RzIHRoYXQgY2FuIGJlIGFwcGxpZWQgdG8gYVxuICogZGlzcGxheSBvYmplY3QuIER1cmluZyB0aGUgdHJhbnNmb3JtYXRpb24sIHRoZSBjb2xvciBvciB0aGUgb3JpZW50YXRpb24gYW5kXG4gKiBwb3NpdGlvbiBvZiBhIGRpc3BsYXkgb2JqZWN0IGlzIGFkanVzdGVkKG9mZnNldCkgZnJvbSB0aGUgY3VycmVudCB2YWx1ZXNcbiAqIG9yIGNvb3JkaW5hdGVzIHRvIG5ldyB2YWx1ZXMgb3IgY29vcmRpbmF0ZXMuIFRoZSBUcmFuc2Zvcm0gY2xhc3MgYWxzb1xuICogY29sbGVjdHMgZGF0YSBhYm91dCBjb2xvciBhbmQgdHdvLWRpbWVuc2lvbmFsIG1hdHJpeCB0cmFuc2Zvcm1hdGlvbnMgdGhhdFxuICogYXJlIGFwcGxpZWQgdG8gYSBkaXNwbGF5IG9iamVjdCBhbmQgYWxsIG9mIGl0cyBwYXJlbnQgb2JqZWN0cy4gWW91IGNhblxuICogYWNjZXNzIHRoZXNlIGNvbWJpbmVkIHRyYW5zZm9ybWF0aW9ucyB0aHJvdWdoIHRoZVxuICogPGNvZGU+Y29uY2F0ZW5hdGVkQ29sb3JUcmFuc2Zvcm08L2NvZGU+IGFuZCA8Y29kZT5jb25jYXRlbmF0ZWRNYXRyaXg8L2NvZGU+XG4gKiBwcm9wZXJ0aWVzLlxuICpcbiAqIDxwPlRvIGFwcGx5IGNvbG9yIHRyYW5zZm9ybWF0aW9uczogY3JlYXRlIGEgQ29sb3JUcmFuc2Zvcm0gb2JqZWN0LCBzZXQgdGhlXG4gKiBjb2xvciBhZGp1c3RtZW50cyB1c2luZyB0aGUgb2JqZWN0J3MgbWV0aG9kcyBhbmQgcHJvcGVydGllcywgYW5kIHRoZW5cbiAqIGFzc2lnbiB0aGUgPGNvZGU+Y29sb3JUcmFuc2Zvcm1hdGlvbjwvY29kZT4gcHJvcGVydHkgb2YgdGhlXG4gKiA8Y29kZT50cmFuc2Zvcm08L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBkaXNwbGF5IG9iamVjdCB0byB0aGUgbmV3XG4gKiBDb2xvclRyYW5zZm9ybWF0aW9uIG9iamVjdC48L3A+XG4gKlxuICogPHA+VG8gYXBwbHkgdHdvLWRpbWVuc2lvbmFsIHRyYW5zZm9ybWF0aW9uczogY3JlYXRlIGEgTWF0cml4IG9iamVjdCwgc2V0XG4gKiB0aGUgbWF0cml4J3MgdHdvLWRpbWVuc2lvbmFsIHRyYW5zZm9ybWF0aW9uLCBhbmQgdGhlbiBhc3NpZ24gdGhlXG4gKiA8Y29kZT50cmFuc2Zvcm0ubWF0cml4PC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgZGlzcGxheSBvYmplY3QgdG8gdGhlIG5ld1xuICogTWF0cml4IG9iamVjdC48L3A+XG4gKlxuICogPHA+VG8gYXBwbHkgdGhyZWUtZGltZW5zaW9uYWwgdHJhbnNmb3JtYXRpb25zOiBzdGFydCB3aXRoIGFcbiAqIHRocmVlLWRpbWVuc2lvbmFsIGRpc3BsYXkgb2JqZWN0LiBBIHRocmVlLWRpbWVuc2lvbmFsIGRpc3BsYXkgb2JqZWN0IGhhcyBhXG4gKiA8Y29kZT56PC9jb2RlPiBwcm9wZXJ0eSB2YWx1ZSBvdGhlciB0aGFuIHplcm8uIFlvdSBkbyBub3QgbmVlZCB0byBjcmVhdGVcbiAqIHRoZSBNYXRyaXgzRCBvYmplY3QuIEZvciBhbGwgdGhyZWUtZGltZW5zaW9uYWwgb2JqZWN0cywgYSBNYXRyaXgzRCBvYmplY3RcbiAqIGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSB3aGVuIHlvdSBhc3NpZ24gYSA8Y29kZT56PC9jb2RlPiB2YWx1ZSB0byBhXG4gKiBkaXNwbGF5IG9iamVjdC4gWW91IGNhbiBhY2Nlc3MgdGhlIGRpc3BsYXkgb2JqZWN0J3MgTWF0cml4M0Qgb2JqZWN0IHRocm91Z2hcbiAqIHRoZSBkaXNwbGF5IG9iamVjdCdzIDxjb2RlPnRyYW5zZm9ybTwvY29kZT4gcHJvcGVydHkuIFVzaW5nIHRoZSBtZXRob2RzIG9mXG4gKiB0aGUgTWF0cml4M0QgY2xhc3MsIHlvdSBjYW4gYWRkIHRvIG9yIG1vZGlmeSB0aGUgZXhpc3RpbmcgdHJhbnNmb3JtYXRpb25cbiAqIHNldHRpbmdzLiBBbHNvLCB5b3UgY2FuIGNyZWF0ZSBhIGN1c3RvbSBNYXRyaXgzRCBvYmplY3QsIHNldCB0aGUgY3VzdG9tXG4gKiBNYXRyaXgzRCBvYmplY3QncyB0cmFuc2Zvcm1hdGlvbiBlbGVtZW50cywgYW5kIHRoZW4gYXNzaWduIHRoZSBuZXcgTWF0cml4M0RcbiAqIG9iamVjdCB0byB0aGUgZGlzcGxheSBvYmplY3QgdXNpbmcgdGhlIDxjb2RlPnRyYW5zZm9ybS5tYXRyaXg8L2NvZGU+XG4gKiBwcm9wZXJ0eS48L3A+XG4gKlxuICogPHA+VG8gbW9kaWZ5IGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBvZiB0aGUgc3RhZ2Ugb3Igcm9vdCBvYmplY3Q6IHVzZSB0aGVcbiAqIDxjb2RlPnRyYW5zZm9ybS5tYXRyaXg8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSByb290IGRpc3BsYXkgb2JqZWN0IHRvIGdhaW5cbiAqIGFjY2VzcyB0byB0aGUgUGVyc3BlY3RpdmVQcm9qZWN0aW9uIG9iamVjdC4gT3IsIGFwcGx5IGRpZmZlcmVudCBwZXJzcGVjdGl2ZVxuICogcHJvamVjdGlvbiBwcm9wZXJ0aWVzIHRvIGEgZGlzcGxheSBvYmplY3QgYnkgc2V0dGluZyB0aGUgcGVyc3BlY3RpdmVcbiAqIHByb2plY3Rpb24gcHJvcGVydGllcyBvZiB0aGUgZGlzcGxheSBvYmplY3QncyBwYXJlbnQuIFRoZSBjaGlsZCBkaXNwbGF5XG4gKiBvYmplY3QgaW5oZXJpdHMgdGhlIG5ldyBwcm9wZXJ0aWVzLiBTcGVjaWZpY2FsbHksIGNyZWF0ZSBhXG4gKiBQZXJzcGVjdGl2ZVByb2plY3Rpb24gb2JqZWN0IGFuZCBzZXQgaXRzIHByb3BlcnRpZXMsIHRoZW4gYXNzaWduIHRoZVxuICogUGVyc3BlY3RpdmVQcm9qZWN0aW9uIG9iamVjdCB0byB0aGUgPGNvZGU+cGVyc3BlY3RpdmVQcm9qZWN0aW9uPC9jb2RlPlxuICogcHJvcGVydHkgb2YgdGhlIHBhcmVudCBkaXNwbGF5IG9iamVjdCdzIDxjb2RlPnRyYW5zZm9ybTwvY29kZT4gcHJvcGVydHkuXG4gKiBUaGUgc3BlY2lmaWVkIHByb2plY3Rpb24gdHJhbnNmb3JtYXRpb24gdGhlbiBhcHBsaWVzIHRvIGFsbCB0aGUgZGlzcGxheVxuICogb2JqZWN0J3MgdGhyZWUtZGltZW5zaW9uYWwgY2hpbGRyZW4uPC9wPlxuICpcbiAqIDxwPlNpbmNlIGJvdGggUGVyc3BlY3RpdmVQcm9qZWN0aW9uIGFuZCBNYXRyaXgzRCBvYmplY3RzIHBlcmZvcm1cbiAqIHBlcnNwZWN0aXZlIHRyYW5zZm9ybWF0aW9ucywgZG8gbm90IGFzc2lnbiBib3RoIHRvIGEgZGlzcGxheSBvYmplY3QgYXQgdGhlXG4gKiBzYW1lIHRpbWUuIFVzZSB0aGUgUGVyc3BlY3RpdmVQcm9qZWN0aW9uIG9iamVjdCBmb3IgZm9jYWwgbGVuZ3RoIGFuZFxuICogcHJvamVjdGlvbiBjZW50ZXIgY2hhbmdlcy4gRm9yIG1vcmUgY29udHJvbCBvdmVyIHRoZSBwZXJzcGVjdGl2ZVxuICogdHJhbnNmb3JtYXRpb24sIGNyZWF0ZSBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gTWF0cml4M0Qgb2JqZWN0LjwvcD5cbiAqL1xuY2xhc3MgVHJhbnNmb3JtXG57XG5cdHByaXZhdGUgX2Rpc3BsYXlPYmplY3Q6RGlzcGxheU9iamVjdDtcblx0cHJpdmF0ZSBfY29uY2F0ZW5hdGVkQ29sb3JUcmFuc2Zvcm06Q29sb3JUcmFuc2Zvcm07XG5cdHByaXZhdGUgX2NvbmNhdGVuYXRlZE1hdHJpeDpNYXRyaXg7XG5cdHByaXZhdGUgX3BpeGVsQm91bmRzOlJlY3RhbmdsZTtcblx0cHVibGljIF9wb3NpdGlvbjpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBiYWNrVmVjdG9yKCk6VmVjdG9yM0Rcblx0e1xuXHRcdHZhciBkaXJlY3RvcjpWZWN0b3IzRCA9IE1hdHJpeDNEVXRpbHMuZ2V0Rm9yd2FyZCh0aGlzLl9kaXNwbGF5T2JqZWN0Ll9pTWF0cml4M0QpO1xuXHRcdGRpcmVjdG9yLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIGRpcmVjdG9yO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgQ29sb3JUcmFuc2Zvcm0gb2JqZWN0IGNvbnRhaW5pbmcgdmFsdWVzIHRoYXQgdW5pdmVyc2FsbHkgYWRqdXN0IHRoZVxuXHQgKiBjb2xvcnMgaW4gdGhlIGRpc3BsYXkgb2JqZWN0LlxuXHQgKiBcblx0ICogQHRocm93cyBUeXBlRXJyb3IgVGhlIGNvbG9yVHJhbnNmb3JtIGlzIG51bGwgd2hlbiBiZWluZyBzZXRcblx0ICovXG5cdHB1YmxpYyBjb2xvclRyYW5zZm9ybTpDb2xvclRyYW5zZm9ybTtcblxuXHQvKipcblx0ICogQSBDb2xvclRyYW5zZm9ybSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb21iaW5lZCBjb2xvciB0cmFuc2Zvcm1hdGlvbnNcblx0ICogYXBwbGllZCB0byB0aGUgZGlzcGxheSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgcGFyZW50IG9iamVjdHMsIGJhY2sgdG8gdGhlXG5cdCAqIHJvb3QgbGV2ZWwuIElmIGRpZmZlcmVudCBjb2xvciB0cmFuc2Zvcm1hdGlvbnMgaGF2ZSBiZWVuIGFwcGxpZWQgYXRcblx0ICogZGlmZmVyZW50IGxldmVscywgYWxsIG9mIHRob3NlIHRyYW5zZm9ybWF0aW9ucyBhcmUgY29uY2F0ZW5hdGVkIGludG8gb25lXG5cdCAqIENvbG9yVHJhbnNmb3JtIG9iamVjdCBmb3IgdGhpcyBwcm9wZXJ0eS5cblx0ICovXG5cdHB1YmxpYyBnZXQgY29uY2F0ZW5hdGVkQ29sb3JUcmFuc2Zvcm0oKTpDb2xvclRyYW5zZm9ybVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbmNhdGVuYXRlZENvbG9yVHJhbnNmb3JtOyAvL1RPRE9cblx0fVxuXG5cdC8qKlxuXHQgKiBBIE1hdHJpeCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb21iaW5lZCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhlcyBvZiB0aGVcblx0ICogZGlzcGxheSBvYmplY3QgYW5kIGFsbCBvZiBpdHMgcGFyZW50IG9iamVjdHMsIGJhY2sgdG8gdGhlIHJvb3QgbGV2ZWwuIElmXG5cdCAqIGRpZmZlcmVudCB0cmFuc2Zvcm1hdGlvbiBtYXRyaXhlcyBoYXZlIGJlZW4gYXBwbGllZCBhdCBkaWZmZXJlbnQgbGV2ZWxzLFxuXHQgKiBhbGwgb2YgdGhvc2UgbWF0cml4ZXMgYXJlIGNvbmNhdGVuYXRlZCBpbnRvIG9uZSBtYXRyaXggZm9yIHRoaXMgcHJvcGVydHkuXG5cdCAqIEFsc28sIGZvciByZXNpemVhYmxlIFNXRiBjb250ZW50IHJ1bm5pbmcgaW4gdGhlIGJyb3dzZXIsIHRoaXMgcHJvcGVydHlcblx0ICogZmFjdG9ycyBpbiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YWdlIGNvb3JkaW5hdGVzIGFuZCB3aW5kb3cgY29vcmRpbmF0ZXNcblx0ICogZHVlIHRvIHdpbmRvdyByZXNpemluZy4gVGh1cywgdGhlIHByb3BlcnR5IGNvbnZlcnRzIGxvY2FsIGNvb3JkaW5hdGVzIHRvXG5cdCAqIHdpbmRvdyBjb29yZGluYXRlcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgc2FtZSBjb29yZGluYXRlIHNwYWNlIGFzIHRoYXQgb2Zcblx0ICogdGhlIFN0YWdlLlxuXHQgKi9cblx0cHVibGljIGdldCBjb25jYXRlbmF0ZWRNYXRyaXgoKTpNYXRyaXhcblx0e1xuXHRcdHJldHVybiB0aGlzLl9jb25jYXRlbmF0ZWRNYXRyaXg7IC8vVE9ET1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGRvd25WZWN0b3IoKTpWZWN0b3IzRFxuXHR7XG5cdFx0dmFyIGRpcmVjdG9yOlZlY3RvcjNEID0gTWF0cml4M0RVdGlscy5nZXRVcCh0aGlzLl9kaXNwbGF5T2JqZWN0Ll9pTWF0cml4M0QpO1xuXHRcdGRpcmVjdG9yLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIGRpcmVjdG9yO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGZvcndhcmRWZWN0b3IoKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIE1hdHJpeDNEVXRpbHMuZ2V0Rm9yd2FyZCh0aGlzLl9kaXNwbGF5T2JqZWN0Ll9pTWF0cml4M0QpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGxlZnRWZWN0b3IoKTpWZWN0b3IzRFxuXHR7XG5cdFx0dmFyIGRpcmVjdG9yOlZlY3RvcjNEID0gTWF0cml4M0RVdGlscy5nZXRSaWdodCh0aGlzLl9kaXNwbGF5T2JqZWN0Ll9pTWF0cml4M0QpO1xuXHRcdGRpcmVjdG9yLm5lZ2F0ZSgpO1xuXG5cdFx0cmV0dXJuIGRpcmVjdG9yO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgTWF0cml4IG9iamVjdCBjb250YWluaW5nIHZhbHVlcyB0aGF0IGFsdGVyIHRoZSBzY2FsaW5nLCByb3RhdGlvbiwgYW5kXG5cdCAqIHRyYW5zbGF0aW9uIG9mIHRoZSBkaXNwbGF5IG9iamVjdC5cblx0ICpcblx0ICogPHA+SWYgdGhlIDxjb2RlPm1hdHJpeDwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIGEgdmFsdWUobm90XG5cdCAqIDxjb2RlPm51bGw8L2NvZGU+KSwgdGhlIDxjb2RlPm1hdHJpeDNEPC9jb2RlPiBwcm9wZXJ0eSBpc1xuXHQgKiA8Y29kZT5udWxsPC9jb2RlPi4gQW5kIGlmIHRoZSA8Y29kZT5tYXRyaXgzRDwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIGFcblx0ICogdmFsdWUobm90IDxjb2RlPm51bGw8L2NvZGU+KSwgdGhlIDxjb2RlPm1hdHJpeDwvY29kZT4gcHJvcGVydHkgaXNcblx0ICogPGNvZGU+bnVsbDwvY29kZT4uPC9wPlxuXHQgKiBcblx0ICogQHRocm93cyBUeXBlRXJyb3IgVGhlIG1hdHJpeCBpcyBudWxsIHdoZW4gYmVpbmcgc2V0XG5cdCAqL1xuXHRwdWJsaWMgbWF0cml4Ok1hdHJpeDtcblxuXHQvKipcblx0ICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBNYXRyaXgzRCBvYmplY3Qgb2YgYSB0aHJlZS1kaW1lbnNpb25hbCBkaXNwbGF5XG5cdCAqIG9iamVjdC4gVGhlIE1hdHJpeDNEIG9iamVjdCByZXByZXNlbnRzIGEgdHJhbnNmb3JtYXRpb24gbWF0cml4IHRoYXRcblx0ICogZGV0ZXJtaW5lcyB0aGUgZGlzcGxheSBvYmplY3QncyBwb3NpdGlvbiBhbmQgb3JpZW50YXRpb24uIEEgTWF0cml4M0Rcblx0ICogb2JqZWN0IGNhbiBhbHNvIHBlcmZvcm0gcGVyc3BlY3RpdmUgcHJvamVjdGlvbi5cblx0ICpcblx0ICogPHA+SWYgdGhlIDxjb2RlPm1hdHJpeDwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIGEgdmFsdWUobm90XG5cdCAqIDxjb2RlPm51bGw8L2NvZGU+KSwgdGhlIDxjb2RlPm1hdHJpeDNEPC9jb2RlPiBwcm9wZXJ0eSBpc1xuXHQgKiA8Y29kZT5udWxsPC9jb2RlPi4gQW5kIGlmIHRoZSA8Y29kZT5tYXRyaXgzRDwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIGFcblx0ICogdmFsdWUobm90IDxjb2RlPm51bGw8L2NvZGU+KSwgdGhlIDxjb2RlPm1hdHJpeDwvY29kZT4gcHJvcGVydHkgaXNcblx0ICogPGNvZGU+bnVsbDwvY29kZT4uPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBtYXRyaXgzRCgpOk1hdHJpeDNEXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGlzcGxheU9iamVjdC5faU1hdHJpeDNEO1xuXHR9XG5cblx0cHVibGljIHNldCBtYXRyaXgzRCh2YWw6TWF0cml4M0QpXG5cdHtcblx0XHR0aGlzLl9kaXNwbGF5T2JqZWN0Ll9pTWF0cml4M0QgPSB2YWw7XG5cdH1cblxuXHQvKipcblx0ICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBQZXJzcGVjdGl2ZVByb2plY3Rpb24gb2JqZWN0IG9mIGEgdGhyZWUtZGltZW5zaW9uYWxcblx0ICogZGlzcGxheSBvYmplY3QuIFRoZSBQZXJzcGVjdGl2ZVByb2plY3Rpb24gb2JqZWN0IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGVcblx0ICogcGVyc3BlY3RpdmUgdHJhbnNmb3JtYXRpb24gb2YgdGhlIHN0YWdlIG9yIHRvIGFzc2lnbiBhIHBlcnNwZWN0aXZlXG5cdCAqIHRyYW5zZm9ybWF0aW9uIHRvIGFsbCB0aGUgdGhyZWUtZGltZW5zaW9uYWwgY2hpbGRyZW4gb2YgYSBkaXNwbGF5IG9iamVjdC5cblx0ICpcblx0ICogPHA+QmFzZWQgb24gdGhlIGZpZWxkIG9mIHZpZXcgYW5kIGFzcGVjdCByYXRpbyhkaW1lbnNpb25zKSBvZiB0aGUgc3RhZ2UsXG5cdCAqIGEgZGVmYXVsdCBQZXJzcGVjdGl2ZVByb2plY3Rpb24gb2JqZWN0IGlzIGFzc2lnbmVkIHRvIHRoZSByb290IG9iamVjdC48L3A+XG5cdCAqL1xuXHRwdWJsaWMgcGVyc3BlY3RpdmVQcm9qZWN0aW9uOlBlcnNwZWN0aXZlUHJvamVjdGlvbjtcblxuXHQvKipcblx0ICogQSBSZWN0YW5nbGUgb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgYm91bmRpbmcgcmVjdGFuZ2xlIG9mIHRoZSBkaXNwbGF5XG5cdCAqIG9iamVjdCBvbiB0aGUgc3RhZ2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHBpeGVsQm91bmRzKCk6UmVjdGFuZ2xlXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcGl4ZWxCb3VuZHM7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgcG9zaXRpb24gb2YgdGhlIDNkIG9iamVjdCwgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIGNvb3JkaW5hdGVzIG9mIHRoZSBwYXJlbnQgPGNvZGU+T2JqZWN0Q29udGFpbmVyM0Q8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGdldCBwb3NpdGlvbigpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGlzcGxheU9iamVjdC5faU1hdHJpeDNELnBvc2l0aW9uXG5cdH1cblxuXHRwdWJsaWMgc2V0IHBvc2l0aW9uKHZhbHVlOlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy5fZGlzcGxheU9iamVjdC54ID0gdmFsdWUueDtcblx0XHR0aGlzLl9kaXNwbGF5T2JqZWN0LnkgPSB2YWx1ZS55O1xuXHRcdHRoaXMuX2Rpc3BsYXlPYmplY3QueiA9IHZhbHVlLno7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgcmlnaHRWZWN0b3IoKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIE1hdHJpeDNEVXRpbHMuZ2V0UmlnaHQodGhpcy5fZGlzcGxheU9iamVjdC5faU1hdHJpeDNEKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSByb3RhdGlvbiBvZiB0aGUgM2Qgb2JqZWN0LCByZWxhdGl2ZSB0byB0aGUgbG9jYWwgY29vcmRpbmF0ZXMgb2YgdGhlIHBhcmVudCA8Y29kZT5PYmplY3RDb250YWluZXIzRDwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHJvdGF0aW9uKCk6VmVjdG9yM0Rcblx0e1xuXHRcdHJldHVybiBuZXcgVmVjdG9yM0QodGhpcy5fZGlzcGxheU9iamVjdC5yb3RhdGlvblgsIHRoaXMuX2Rpc3BsYXlPYmplY3Qucm90YXRpb25ZLCB0aGlzLl9kaXNwbGF5T2JqZWN0LnJvdGF0aW9uWik7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHJvdGF0aW9uKHZhbHVlOlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy5fZGlzcGxheU9iamVjdC5yb3RhdGlvblggPSB2YWx1ZS54O1xuXHRcdHRoaXMuX2Rpc3BsYXlPYmplY3Qucm90YXRpb25ZID0gdmFsdWUueTtcblx0XHR0aGlzLl9kaXNwbGF5T2JqZWN0LnJvdGF0aW9uWiA9IHZhbHVlLno7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgc2NhbGUgb2YgdGhlIDNkIG9iamVjdCwgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIGNvb3JkaW5hdGVzIG9mIHRoZSBwYXJlbnQgPGNvZGU+T2JqZWN0Q29udGFpbmVyM0Q8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGdldCBzY2FsZSgpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gbmV3IFZlY3RvcjNEKHRoaXMuX2Rpc3BsYXlPYmplY3Quc2NhbGVYLCB0aGlzLl9kaXNwbGF5T2JqZWN0LnNjYWxlWSwgdGhpcy5fZGlzcGxheU9iamVjdC5zY2FsZVopO1xuXHR9XG5cblx0cHVibGljIHNldCBzY2FsZSh2YWx1ZTpWZWN0b3IzRClcblx0e1xuXHRcdHRoaXMuX2Rpc3BsYXlPYmplY3Quc2NhbGVYID0gdmFsdWUueDtcblx0XHR0aGlzLl9kaXNwbGF5T2JqZWN0LnNjYWxlWSA9IHZhbHVlLnk7XG5cdFx0dGhpcy5fZGlzcGxheU9iamVjdC5zY2FsZVogPSB2YWx1ZS56O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHVwVmVjdG9yKCk6VmVjdG9yM0Rcblx0e1xuXHRcdHJldHVybiBNYXRyaXgzRFV0aWxzLmdldFVwKHRoaXMuX2Rpc3BsYXlPYmplY3QuX2lNYXRyaXgzRCk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcihkaXNwbGF5T2JqZWN0OkRpc3BsYXlPYmplY3QpXG5cdHtcblx0XHR0aGlzLl9kaXNwbGF5T2JqZWN0ID0gZGlzcGxheU9iamVjdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgTWF0cml4M0Qgb2JqZWN0LCB3aGljaCBjYW4gdHJhbnNmb3JtIHRoZSBzcGFjZSBvZiBhIHNwZWNpZmllZFxuXHQgKiBkaXNwbGF5IG9iamVjdCBpbiByZWxhdGlvbiB0byB0aGUgY3VycmVudCBkaXNwbGF5IG9iamVjdCdzIHNwYWNlLiBZb3UgY2FuXG5cdCAqIHVzZSB0aGUgPGNvZGU+Z2V0UmVsYXRpdmVNYXRyaXgzRCgpPC9jb2RlPiBtZXRob2QgdG8gbW92ZSBvbmVcblx0ICogdGhyZWUtZGltZW5zaW9uYWwgZGlzcGxheSBvYmplY3QgcmVsYXRpdmUgdG8gYW5vdGhlciB0aHJlZS1kaW1lbnNpb25hbFxuXHQgKiBkaXNwbGF5IG9iamVjdC5cblx0ICogXG5cdCAqIEBwYXJhbSByZWxhdGl2ZVRvIFRoZSBkaXNwbGF5IG9iamVjdCByZWxhdGl2ZSB0byB3aGljaCB0aGUgdHJhbnNmb3JtYXRpb25cblx0ICogICAgICAgICAgICAgICAgICAgb2NjdXJzLiBUbyBnZXQgYSBNYXRyaXgzRCBvYmplY3QgcmVsYXRpdmUgdG8gdGhlIHN0YWdlLFxuXHQgKiAgICAgICAgICAgICAgICAgICBzZXQgdGhlIHBhcmFtZXRlciB0byB0aGUgPGNvZGU+cm9vdDwvY29kZT4gb3Jcblx0ICogICAgICAgICAgICAgICAgICAgPGNvZGU+c3RhZ2U8L2NvZGU+IG9iamVjdC4gVG8gZ2V0IHRoZSB3b3JsZC1yZWxhdGl2ZVxuXHQgKiAgICAgICAgICAgICAgICAgICBtYXRyaXggb2YgdGhlIGRpc3BsYXkgb2JqZWN0LCBzZXQgdGhlIHBhcmFtZXRlciB0byBhXG5cdCAqICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgb2JqZWN0IHRoYXQgaGFzIGEgcGVyc3BlY3RpdmUgdHJhbnNmb3JtYXRpb25cblx0ICogICAgICAgICAgICAgICAgICAgYXBwbGllZCB0byBpdC5cblx0ICogQHJldHVybiBBIE1hdHJpeDNEIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYW5zZm9ybSB0aGUgc3BhY2UgZnJvbSB0aGVcblx0ICogICAgICAgICA8Y29kZT5yZWxhdGl2ZVRvPC9jb2RlPiBkaXNwbGF5IG9iamVjdCB0byB0aGUgY3VycmVudCBkaXNwbGF5XG5cdCAqICAgICAgICAgb2JqZWN0IHNwYWNlLlxuXHQgKi9cblx0cHVibGljIGdldFJlbGF0aXZlTWF0cml4M0QocmVsYXRpdmVUbzpEaXNwbGF5T2JqZWN0KTpNYXRyaXgzRFxuXHR7XG5cdFx0cmV0dXJuIG5ldyBNYXRyaXgzRCgpOyAvL1RPRE9cblx0fVxuXG5cblx0LyoqXG5cdCAqIE1vdmVzIHRoZSAzZCBvYmplY3QgZm9yd2FyZHMgYWxvbmcgaXQncyBsb2NhbCB6IGF4aXNcblx0ICpcblx0ICogQHBhcmFtICAgIGRpc3RhbmNlICAgIFRoZSBsZW5ndGggb2YgdGhlIG1vdmVtZW50XG5cdCAqL1xuXHRwdWJsaWMgbW92ZUZvcndhcmQoZGlzdGFuY2U6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fZGlzcGxheU9iamVjdC50cmFuc2xhdGVMb2NhbChWZWN0b3IzRC5aX0FYSVMsIGRpc3RhbmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb3ZlcyB0aGUgM2Qgb2JqZWN0IGJhY2t3YXJkcyBhbG9uZyBpdCdzIGxvY2FsIHogYXhpc1xuXHQgKlxuXHQgKiBAcGFyYW0gICAgZGlzdGFuY2UgICAgVGhlIGxlbmd0aCBvZiB0aGUgbW92ZW1lbnRcblx0ICovXG5cdHB1YmxpYyBtb3ZlQmFja3dhcmQoZGlzdGFuY2U6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fZGlzcGxheU9iamVjdC50cmFuc2xhdGVMb2NhbChWZWN0b3IzRC5aX0FYSVMsIC1kaXN0YW5jZSk7XG5cdH1cblxuXHQvKipcblx0ICogTW92ZXMgdGhlIDNkIG9iamVjdCBiYWNrd2FyZHMgYWxvbmcgaXQncyBsb2NhbCB4IGF4aXNcblx0ICpcblx0ICogQHBhcmFtICAgIGRpc3RhbmNlICAgIFRoZSBsZW5ndGggb2YgdGhlIG1vdmVtZW50XG5cdCAqL1xuXG5cdHB1YmxpYyBtb3ZlTGVmdChkaXN0YW5jZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9kaXNwbGF5T2JqZWN0LnRyYW5zbGF0ZUxvY2FsKFZlY3RvcjNELlhfQVhJUywgLWRpc3RhbmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBNb3ZlcyB0aGUgM2Qgb2JqZWN0IGZvcndhcmRzIGFsb25nIGl0J3MgbG9jYWwgeCBheGlzXG5cdCAqXG5cdCAqIEBwYXJhbSAgICBkaXN0YW5jZSAgICBUaGUgbGVuZ3RoIG9mIHRoZSBtb3ZlbWVudFxuXHQgKi9cblx0cHVibGljIG1vdmVSaWdodChkaXN0YW5jZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9kaXNwbGF5T2JqZWN0LnRyYW5zbGF0ZUxvY2FsKFZlY3RvcjNELlhfQVhJUywgZGlzdGFuY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1vdmVzIHRoZSAzZCBvYmplY3QgZm9yd2FyZHMgYWxvbmcgaXQncyBsb2NhbCB5IGF4aXNcblx0ICpcblx0ICogQHBhcmFtICAgIGRpc3RhbmNlICAgIFRoZSBsZW5ndGggb2YgdGhlIG1vdmVtZW50XG5cdCAqL1xuXHRwdWJsaWMgbW92ZVVwKGRpc3RhbmNlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX2Rpc3BsYXlPYmplY3QudHJhbnNsYXRlTG9jYWwoVmVjdG9yM0QuWV9BWElTLCBkaXN0YW5jZSk7XG5cdH1cblxuXHQvKipcblx0ICogTW92ZXMgdGhlIDNkIG9iamVjdCBiYWNrd2FyZHMgYWxvbmcgaXQncyBsb2NhbCB5IGF4aXNcblx0ICpcblx0ICogQHBhcmFtICAgIGRpc3RhbmNlICAgIFRoZSBsZW5ndGggb2YgdGhlIG1vdmVtZW50XG5cdCAqL1xuXHRwdWJsaWMgbW92ZURvd24oZGlzdGFuY2U6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fZGlzcGxheU9iamVjdC50cmFuc2xhdGVMb2NhbChWZWN0b3IzRC5ZX0FYSVMsIC1kaXN0YW5jZSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gVHJhbnNmb3JtO1xuIl19 \ No newline at end of file diff --git a/lib/core/geom/Transform.ts b/lib/core/geom/Transform.ts new file mode 100644 index 00000000..f6671dfa --- /dev/null +++ b/lib/core/geom/Transform.ts @@ -0,0 +1,357 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import ColorTransform = require("awayjs-core/lib/core/geom/ColorTransform"); +import Matrix = require("awayjs-core/lib/core/geom/Matrix"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); + +/** + * The Transform class provides access to color adjustment properties and two- + * or three-dimensional transformation objects that can be applied to a + * display object. During the transformation, the color or the orientation and + * position of a display object is adjusted(offset) from the current values + * or coordinates to new values or coordinates. The Transform class also + * collects data about color and two-dimensional matrix transformations that + * are applied to a display object and all of its parent objects. You can + * access these combined transformations through the + * concatenatedColorTransform and concatenatedMatrix + * properties. + * + *

To apply color transformations: create a ColorTransform object, set the + * color adjustments using the object's methods and properties, and then + * assign the colorTransformation property of the + * transform property of the display object to the new + * ColorTransformation object.

+ * + *

To apply two-dimensional transformations: create a Matrix object, set + * the matrix's two-dimensional transformation, and then assign the + * transform.matrix property of the display object to the new + * Matrix object.

+ * + *

To apply three-dimensional transformations: start with a + * three-dimensional display object. A three-dimensional display object has a + * z property value other than zero. You do not need to create + * the Matrix3D object. For all three-dimensional objects, a Matrix3D object + * is created automatically when you assign a z value to a + * display object. You can access the display object's Matrix3D object through + * the display object's transform property. Using the methods of + * the Matrix3D class, you can add to or modify the existing transformation + * settings. Also, you can create a custom Matrix3D object, set the custom + * Matrix3D object's transformation elements, and then assign the new Matrix3D + * object to the display object using the transform.matrix + * property.

+ * + *

To modify a perspective projection of the stage or root object: use the + * transform.matrix property of the root display object to gain + * access to the PerspectiveProjection object. Or, apply different perspective + * projection properties to a display object by setting the perspective + * projection properties of the display object's parent. The child display + * object inherits the new properties. Specifically, create a + * PerspectiveProjection object and set its properties, then assign the + * PerspectiveProjection object to the perspectiveProjection + * property of the parent display object's transform property. + * The specified projection transformation then applies to all the display + * object's three-dimensional children.

+ * + *

Since both PerspectiveProjection and Matrix3D objects perform + * perspective transformations, do not assign both to a display object at the + * same time. Use the PerspectiveProjection object for focal length and + * projection center changes. For more control over the perspective + * transformation, create a perspective projection Matrix3D object.

+ */ +class Transform +{ + private _displayObject:DisplayObject; + private _concatenatedColorTransform:ColorTransform; + private _concatenatedMatrix:Matrix; + private _pixelBounds:Rectangle; + public _position:Vector3D = new Vector3D(); + + /** + * + */ + public get backVector():Vector3D + { + var director:Vector3D = Matrix3DUtils.getForward(this._displayObject._iMatrix3D); + director.negate(); + + return director; + } + + /** + * A ColorTransform object containing values that universally adjust the + * colors in the display object. + * + * @throws TypeError The colorTransform is null when being set + */ + public colorTransform:ColorTransform; + + /** + * A ColorTransform object representing the combined color transformations + * applied to the display object and all of its parent objects, back to the + * root level. If different color transformations have been applied at + * different levels, all of those transformations are concatenated into one + * ColorTransform object for this property. + */ + public get concatenatedColorTransform():ColorTransform + { + return this._concatenatedColorTransform; //TODO + } + + /** + * A Matrix object representing the combined transformation matrixes of the + * display object and all of its parent objects, back to the root level. If + * different transformation matrixes have been applied at different levels, + * all of those matrixes are concatenated into one matrix for this property. + * Also, for resizeable SWF content running in the browser, this property + * factors in the difference between stage coordinates and window coordinates + * due to window resizing. Thus, the property converts local coordinates to + * window coordinates, which may not be the same coordinate space as that of + * the Stage. + */ + public get concatenatedMatrix():Matrix + { + return this._concatenatedMatrix; //TODO + } + + /** + * + */ + public get downVector():Vector3D + { + var director:Vector3D = Matrix3DUtils.getUp(this._displayObject._iMatrix3D); + director.negate(); + + return director; + } + + /** + * + */ + public get forwardVector():Vector3D + { + return Matrix3DUtils.getForward(this._displayObject._iMatrix3D); + } + + /** + * + */ + public get leftVector():Vector3D + { + var director:Vector3D = Matrix3DUtils.getRight(this._displayObject._iMatrix3D); + director.negate(); + + return director; + } + + /** + * A Matrix object containing values that alter the scaling, rotation, and + * translation of the display object. + * + *

If the matrix property is set to a value(not + * null), the matrix3D property is + * null. And if the matrix3D property is set to a + * value(not null), the matrix property is + * null.

+ * + * @throws TypeError The matrix is null when being set + */ + public matrix:Matrix; + + /** + * Provides access to the Matrix3D object of a three-dimensional display + * object. The Matrix3D object represents a transformation matrix that + * determines the display object's position and orientation. A Matrix3D + * object can also perform perspective projection. + * + *

If the matrix property is set to a value(not + * null), the matrix3D property is + * null. And if the matrix3D property is set to a + * value(not null), the matrix property is + * null.

+ */ + public get matrix3D():Matrix3D + { + return this._displayObject._iMatrix3D; + } + + public set matrix3D(val:Matrix3D) + { + this._displayObject._iMatrix3D = val; + } + + /** + * Provides access to the PerspectiveProjection object of a three-dimensional + * display object. The PerspectiveProjection object can be used to modify the + * perspective transformation of the stage or to assign a perspective + * transformation to all the three-dimensional children of a display object. + * + *

Based on the field of view and aspect ratio(dimensions) of the stage, + * a default PerspectiveProjection object is assigned to the root object.

+ */ + public perspectiveProjection:PerspectiveProjection; + + /** + * A Rectangle object that defines the bounding rectangle of the display + * object on the stage. + */ + public get pixelBounds():Rectangle + { + return this._pixelBounds; + } + + /** + * Defines the position of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + public get position():Vector3D + { + return this._displayObject._iMatrix3D.position + } + + public set position(value:Vector3D) + { + this._displayObject.x = value.x; + this._displayObject.y = value.y; + this._displayObject.z = value.z; + } + + /** + * + */ + public get rightVector():Vector3D + { + return Matrix3DUtils.getRight(this._displayObject._iMatrix3D); + } + + /** + * Defines the rotation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + public get rotation():Vector3D + { + return new Vector3D(this._displayObject.rotationX, this._displayObject.rotationY, this._displayObject.rotationZ); + } + + public set rotation(value:Vector3D) + { + this._displayObject.rotationX = value.x; + this._displayObject.rotationY = value.y; + this._displayObject.rotationZ = value.z; + } + + /** + * Defines the scale of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. + */ + public get scale():Vector3D + { + return new Vector3D(this._displayObject.scaleX, this._displayObject.scaleY, this._displayObject.scaleZ); + } + + public set scale(value:Vector3D) + { + this._displayObject.scaleX = value.x; + this._displayObject.scaleY = value.y; + this._displayObject.scaleZ = value.z; + } + + /** + * + */ + public get upVector():Vector3D + { + return Matrix3DUtils.getUp(this._displayObject._iMatrix3D); + } + + constructor(displayObject:DisplayObject) + { + this._displayObject = displayObject; + } + + /** + * Returns a Matrix3D object, which can transform the space of a specified + * display object in relation to the current display object's space. You can + * use the getRelativeMatrix3D() method to move one + * three-dimensional display object relative to another three-dimensional + * display object. + * + * @param relativeTo The display object relative to which the transformation + * occurs. To get a Matrix3D object relative to the stage, + * set the parameter to the root or + * stage object. To get the world-relative + * matrix of the display object, set the parameter to a + * display object that has a perspective transformation + * applied to it. + * @return A Matrix3D object that can be used to transform the space from the + * relativeTo display object to the current display + * object space. + */ + public getRelativeMatrix3D(relativeTo:DisplayObject):Matrix3D + { + return new Matrix3D(); //TODO + } + + + /** + * Moves the 3d object forwards along it's local z axis + * + * @param distance The length of the movement + */ + public moveForward(distance:number) + { + this._displayObject.translateLocal(Vector3D.Z_AXIS, distance); + } + + /** + * Moves the 3d object backwards along it's local z axis + * + * @param distance The length of the movement + */ + public moveBackward(distance:number) + { + this._displayObject.translateLocal(Vector3D.Z_AXIS, -distance); + } + + /** + * Moves the 3d object backwards along it's local x axis + * + * @param distance The length of the movement + */ + + public moveLeft(distance:number) + { + this._displayObject.translateLocal(Vector3D.X_AXIS, -distance); + } + + /** + * Moves the 3d object forwards along it's local x axis + * + * @param distance The length of the movement + */ + public moveRight(distance:number) + { + this._displayObject.translateLocal(Vector3D.X_AXIS, distance); + } + + /** + * Moves the 3d object forwards along it's local y axis + * + * @param distance The length of the movement + */ + public moveUp(distance:number) + { + this._displayObject.translateLocal(Vector3D.Y_AXIS, distance); + } + + /** + * Moves the 3d object backwards along it's local y axis + * + * @param distance The length of the movement + */ + public moveDown(distance:number) + { + this._displayObject.translateLocal(Vector3D.Y_AXIS, -distance); + } +} + +export = Transform; diff --git a/lib/core/geom/UVTransform.js b/lib/core/geom/UVTransform.js new file mode 100755 index 00000000..fb1e9602 --- /dev/null +++ b/lib/core/geom/UVTransform.js @@ -0,0 +1,145 @@ +var Matrix = require("awayjs-core/lib/core/geom/Matrix"); + +var UVTransform = (function () { + function UVTransform() { + this._uvMatrix = new Matrix(); + this._rotation = 0; + this._scaleU = 1; + this._scaleV = 1; + this._offsetU = 0; + this._offsetV = 0; + } + Object.defineProperty(UVTransform.prototype, "offsetU", { + /** + * + */ + get: function () { + return this._offsetU; + }, + set: function (value) { + if (value == this._offsetU) + return; + + this._offsetU = value; + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "offsetV", { + /** + * + */ + get: function () { + return this._offsetV; + }, + set: function (value) { + if (value == this._offsetV) + return; + + this._offsetV = value; + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "rotation", { + /** + * + */ + get: function () { + return this._rotation; + }, + set: function (value) { + if (value == this._rotation) + return; + + this._rotation = value; + + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "scaleU", { + /** + * + */ + get: function () { + return this._scaleU; + }, + set: function (value) { + if (value == this._scaleU) + return; + + this._scaleU = value; + + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "scaleV", { + /** + * + */ + get: function () { + return this._scaleV; + }, + set: function (value) { + if (value == this._scaleV) + return; + + this._scaleV = value; + + this._uvMatrixDirty = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(UVTransform.prototype, "matrix", { + /** + * + */ + get: function () { + if (this._uvMatrixDirty) + this.updateUVMatrix(); + + return this._uvMatrix; + }, + enumerable: true, + configurable: true + }); + + /** + * @private + */ + UVTransform.prototype.updateUVMatrix = function () { + this._uvMatrix.identity(); + + if (this._rotation != 0) + this._uvMatrix.rotate(this._rotation); + + if (this._scaleU != 1 || this._scaleV != 1) + this._uvMatrix.scale(this._scaleU, this._scaleV); + + this._uvMatrix.translate(this._offsetU, this._offsetV); + + this._uvMatrixDirty = false; + }; + return UVTransform; +})(); + +module.exports = UVTransform; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9VVlRyYW5zZm9ybS50cyJdLCJuYW1lcyI6WyJVVlRyYW5zZm9ybSIsIlVWVHJhbnNmb3JtLmNvbnN0cnVjdG9yIiwiVVZUcmFuc2Zvcm0udXBkYXRlVVZNYXRyaXgiXSwibWFwcGluZ3MiOiJBQUFBLHdEQUFnRTs7QUFFaEU7SUErR0NBO1FBN0dBQyxLQUFRQSxTQUFTQSxHQUFVQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUd4Q0EsS0FBUUEsU0FBU0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLEtBQVFBLE9BQU9BLEdBQVVBLENBQUNBLENBQUNBO1FBQzNCQSxLQUFRQSxPQUFPQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUMzQkEsS0FBUUEsUUFBUUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLEtBQVFBLFFBQVFBLEdBQVVBLENBQUNBLENBQUNBO0lBd0c1QkEsQ0FBQ0E7SUFuR0REO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxRQUFRQTtRQUNyQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBbUJBLEtBQVlBO1lBRTlCQSxJQUFJQSxLQUFLQSxJQUFJQSxJQUFJQSxDQUFDQSxRQUFRQTtnQkFDekJBLE1BQU9BLENBQUFBOztZQUVSQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxLQUFLQTtZQUNyQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsSUFBSUE7UUFDM0JBLENBQUNBOzs7O0FBVEFBOztJQWNEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBO1FBRURBLEtBQUFBLFVBQW1CQSxLQUFZQTtZQUU5QkEsSUFBSUEsS0FBS0EsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUE7Z0JBQ3pCQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsS0FBS0E7WUFDckJBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBO1FBRTNCQSxDQUFDQTs7OztBQVZBQTs7SUFlREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFNBQVNBO1FBQ3RCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFvQkEsS0FBWUE7WUFFL0JBLElBQUlBLEtBQUtBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBO2dCQUMxQkEsTUFBT0EsQ0FBQUE7O1lBRVJBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLEtBQUtBOztZQUV0QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsSUFBSUE7UUFDM0JBLENBQUNBOzs7O0FBVkFBOztJQWVEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsT0FBT0E7UUFDcEJBLENBQUNBO1FBRURBLEtBQUFBLFVBQWtCQSxLQUFZQTtZQUU3QkEsSUFBSUEsS0FBS0EsSUFBSUEsSUFBSUEsQ0FBQ0EsT0FBT0E7Z0JBQ3hCQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsS0FBS0E7O1lBRXBCQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxJQUFJQTtRQUMzQkEsQ0FBQ0E7Ozs7QUFWQUE7O0lBZURBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxPQUFPQTtRQUNwQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBa0JBLEtBQVlBO1lBRTdCQSxJQUFJQSxLQUFLQSxJQUFJQSxJQUFJQSxDQUFDQSxPQUFPQTtnQkFDeEJBLE1BQU9BLENBQUFBOztZQUVSQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxLQUFLQTs7WUFFcEJBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBO1FBQzNCQSxDQUFDQTs7OztBQVZBQTs7SUFlREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBO2dCQUN0QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1lBRXZCQSxPQUFPQSxJQUFJQSxDQUFDQSxTQUFTQTtRQUN0QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFVREE7O01BREdBOzJDQUNIQTtRQUVDRSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQTs7UUFFekJBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBLElBQUlBLENBQUNBO1lBQ3RCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTs7UUFFdkNBLElBQUlBLElBQUlBLENBQUNBLE9BQU9BLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE9BQU9BLElBQUlBLENBQUNBO1lBQ3pDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQTs7UUFFbERBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBOztRQUV0REEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsS0FBS0E7SUFDNUJBLENBQUNBO0lBQ0ZGLG1CQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDRCQUFxQixDQUFBIiwiZmlsZSI6ImNvcmUvZ2VvbS9VVlRyYW5zZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXRyaXhcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXhcIik7XG5cbmNsYXNzIFVWVHJhbnNmb3JtXG57XG5cdHByaXZhdGUgX3V2TWF0cml4Ok1hdHJpeCA9IG5ldyBNYXRyaXgoKTtcblx0cHJpdmF0ZSBfdXZNYXRyaXhEaXJ0eTpib29sZWFuO1xuXG5cdHByaXZhdGUgX3JvdGF0aW9uOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX3NjYWxlVTpudW1iZXIgPSAxO1xuXHRwcml2YXRlIF9zY2FsZVY6bnVtYmVyID0gMTtcblx0cHJpdmF0ZSBfb2Zmc2V0VTpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9vZmZzZXRWOm51bWJlciA9IDA7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG9mZnNldFUoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9vZmZzZXRVO1xuXHR9XG5cblx0cHVibGljIHNldCBvZmZzZXRVKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9vZmZzZXRVKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fb2Zmc2V0VSA9IHZhbHVlO1xuXHRcdHRoaXMuX3V2TWF0cml4RGlydHkgPSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG9mZnNldFYoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9vZmZzZXRWO1xuXHR9XG5cblx0cHVibGljIHNldCBvZmZzZXRWKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9vZmZzZXRWKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fb2Zmc2V0ViA9IHZhbHVlO1xuXHRcdHRoaXMuX3V2TWF0cml4RGlydHkgPSB0cnVlO1xuXG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgcm90YXRpb24oKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9yb3RhdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcm90YXRpb24odmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHZhbHVlID09IHRoaXMuX3JvdGF0aW9uKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcm90YXRpb24gPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3V2TWF0cml4RGlydHkgPSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNjYWxlVSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NjYWxlVTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2NhbGVVKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9zY2FsZVUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9zY2FsZVUgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3V2TWF0cml4RGlydHkgPSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNjYWxlVigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NjYWxlVjtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2NhbGVWKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9zY2FsZVYpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9zY2FsZVYgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3V2TWF0cml4RGlydHkgPSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1hdHJpeCgpOk1hdHJpeFxuXHR7XG5cdFx0aWYgKHRoaXMuX3V2TWF0cml4RGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZVVWTWF0cml4KCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fdXZNYXRyaXg7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0fVxuXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIHVwZGF0ZVVWTWF0cml4KClcblx0e1xuXHRcdHRoaXMuX3V2TWF0cml4LmlkZW50aXR5KCk7XG5cblx0XHRpZiAodGhpcy5fcm90YXRpb24gIT0gMClcblx0XHRcdHRoaXMuX3V2TWF0cml4LnJvdGF0ZSh0aGlzLl9yb3RhdGlvbik7XG5cblx0XHRpZiAodGhpcy5fc2NhbGVVICE9IDEgfHwgdGhpcy5fc2NhbGVWICE9IDEpXG5cdFx0XHR0aGlzLl91dk1hdHJpeC5zY2FsZSh0aGlzLl9zY2FsZVUsIHRoaXMuX3NjYWxlVik7XG5cblx0XHR0aGlzLl91dk1hdHJpeC50cmFuc2xhdGUodGhpcy5fb2Zmc2V0VSwgdGhpcy5fb2Zmc2V0Vik7XG5cblx0XHR0aGlzLl91dk1hdHJpeERpcnR5ID0gZmFsc2U7XG5cdH1cbn1cblxuZXhwb3J0ID0gVVZUcmFuc2Zvcm07Il19 \ No newline at end of file diff --git a/lib/core/geom/UVTransform.ts b/lib/core/geom/UVTransform.ts new file mode 100644 index 00000000..996e5680 --- /dev/null +++ b/lib/core/geom/UVTransform.ts @@ -0,0 +1,138 @@ +import Matrix = require("awayjs-core/lib/core/geom/Matrix"); + +class UVTransform +{ + private _uvMatrix:Matrix = new Matrix(); + private _uvMatrixDirty:boolean; + + private _rotation:number = 0; + private _scaleU:number = 1; + private _scaleV:number = 1; + private _offsetU:number = 0; + private _offsetV:number = 0; + + /** + * + */ + public get offsetU():number + { + return this._offsetU; + } + + public set offsetU(value:number) + { + if (value == this._offsetU) + return; + + this._offsetU = value; + this._uvMatrixDirty = true; + } + + /** + * + */ + public get offsetV():number + { + return this._offsetV; + } + + public set offsetV(value:number) + { + if (value == this._offsetV) + return; + + this._offsetV = value; + this._uvMatrixDirty = true; + + } + + /** + * + */ + public get rotation():number + { + return this._rotation; + } + + public set rotation(value:number) + { + if (value == this._rotation) + return; + + this._rotation = value; + + this._uvMatrixDirty = true; + } + + /** + * + */ + public get scaleU():number + { + return this._scaleU; + } + + public set scaleU(value:number) + { + if (value == this._scaleU) + return; + + this._scaleU = value; + + this._uvMatrixDirty = true; + } + + /** + * + */ + public get scaleV():number + { + return this._scaleV; + } + + public set scaleV(value:number) + { + if (value == this._scaleV) + return; + + this._scaleV = value; + + this._uvMatrixDirty = true; + } + + /** + * + */ + public get matrix():Matrix + { + if (this._uvMatrixDirty) + this.updateUVMatrix(); + + return this._uvMatrix; + } + + constructor() + { + } + + + /** + * @private + */ + private updateUVMatrix() + { + this._uvMatrix.identity(); + + if (this._rotation != 0) + this._uvMatrix.rotate(this._rotation); + + if (this._scaleU != 1 || this._scaleV != 1) + this._uvMatrix.scale(this._scaleU, this._scaleV); + + this._uvMatrix.translate(this._offsetU, this._offsetV); + + this._uvMatrixDirty = false; + } +} + +export = UVTransform; \ No newline at end of file diff --git a/lib/core/geom/Vector3D.js b/lib/core/geom/Vector3D.js new file mode 100755 index 00000000..6ca1664a --- /dev/null +++ b/lib/core/geom/Vector3D.js @@ -0,0 +1,423 @@ +/** +* The Vector3D class represents a point or a location in the three-dimensional +* space using the Cartesian coordinates x, y, and z. As in a two-dimensional +* space, the x property represents the horizontal axis and the y property +* represents the vertical axis. In three-dimensional space, the z property +* represents depth. The value of the x property increases as the object moves +* to the right. The value of the y property increases as the object moves +* down. The z property increases as the object moves farther from the point +* of view. Using perspective projection and scaling, the object is seen to be +* bigger when near and smaller when farther away from the screen. As in a +* right-handed three-dimensional coordinate system, the positive z-axis points +* away from the viewer and the value of the z property increases as the object +* moves away from the viewer's eye. The origin point (0,0,0) of the global +* space is the upper-left corner of the stage. +* +*

The Vector3D class can also represent a direction, an arrow pointing from +* the origin of the coordinates, such as (0,0,0), to an endpoint; or a +* floating-point component of an RGB (Red, Green, Blue) color model.

+* +*

Quaternion notation introduces a fourth element, the w property, which +* provides additional orientation information. For example, the w property can +* define an angle of rotation of a Vector3D object. The combination of the +* angle of rotation and the coordinates x, y, and z can determine the display +* object's orientation. Here is a representation of Vector3D elements in +* matrix notation:

+*/ +var Vector3D = (function () { + /** + * Creates an instance of a Vector3D object. If you do not specify a + * parameter for the constructor, a Vector3D object is created with + * the elements (0,0,0,0). + * + * @param x The first element, such as the x coordinate. + * @param y The second element, such as the y coordinate. + * @param z The third element, such as the z coordinate. + * @param w An optional element for additional data such as the angle + * of rotation. + */ + function Vector3D(x, y, z, w) { + if (typeof x === "undefined") { x = 0; } + if (typeof y === "undefined") { y = 0; } + if (typeof z === "undefined") { z = 0; } + if (typeof w === "undefined") { w = 0; } + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + Object.defineProperty(Vector3D.prototype, "length", { + /** + * The length, magnitude, of the current Vector3D object from the + * origin (0,0,0) to the object's x, y, and z coordinates. The w + * property is ignored. A unit vector has a length or magnitude of + * one. + */ + get: function () { + return Math.sqrt(this.lengthSquared); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Vector3D.prototype, "lengthSquared", { + /** + * The square of the length of the current Vector3D object, calculated + * using the x, y, and z properties. The w property is ignored. Use the + * lengthSquared() method whenever possible instead of the + * slower Math.sqrt() method call of the + * Vector3D.length() method. + */ + get: function () { + return this.x * this.x + this.y * this.y + this.z * this.z; + }, + enumerable: true, + configurable: true + }); + + /** + * Adds the value of the x, y, and z elements of the current Vector3D + * object to the values of the x, y, and z elements of another Vector3D + * object. The add() method does not change the current + * Vector3D object. Instead, it returns a new Vector3D object with + * the new values. + * + *

The result of adding two vectors together is a resultant vector. + * One way to visualize the result is by drawing a vector from the + * origin or tail of the first vector to the end or head of the second + * vector. The resultant vector is the distance between the origin + * point of the first vector and the end point of the second vector. + *

+ */ + Vector3D.prototype.add = function (a) { + return new Vector3D(this.x + a.x, this.y + a.y, this.z + a.z, this.w + a.w); + }; + + /** + * Returns the angle in radians between two vectors. The returned angle + * is the smallest radian the first Vector3D object rotates until it + * aligns with the second Vector3D object. + * + *

The angleBetween() method is a static method. You + * can use it directly as a method of the Vector3D class.

+ * + *

To convert a degree to a radian, you can use the following + * formula:

+ * + *

radian = Math.PI/180 * degree

+ * + * @param a The first Vector3D object. + * @param b The second Vector3D object. + * @returns The angle between two Vector3D objects. + */ + Vector3D.angleBetween = function (a, b) { + return Math.acos(a.dotProduct(b) / (a.length * b.length)); + }; + + /** + * Returns a new Vector3D object that is an exact copy of the current + * Vector3D object. + * + * @returns A new Vector3D object that is a copy of the current + * Vector3D object. + */ + Vector3D.prototype.clone = function () { + return new Vector3D(this.x, this.y, this.z, this.w); + }; + + /** + * Copies all of vector data from the source Vector3D object into the + * calling Vector3D object. + * + * @param src The Vector3D object from which to copy the data. + */ + Vector3D.prototype.copyFrom = function (src) { + this.x = src.x; + this.y = src.y; + this.z = src.z; + this.w = src.w; + }; + + /** + * Returns a new Vector3D object that is perpendicular (at a right + * angle) to the current Vector3D and another Vector3D object. If the + * returned Vector3D object's coordinates are (0,0,0), then the two + * Vector3D objects are parallel to each other. + * + *

You can use the normalized cross product of two vertices of a + * polygon surface with the normalized vector of the camera or eye + * viewpoint to get a dot product. The value of the dot product can + * identify whether a surface of a three-dimensional object is hidden + * from the viewpoint.

+ * + * @param a A second Vector3D object. + * @returns A new Vector3D object that is perpendicular to the current + * Vector3D object and the Vector3D object specified as the + * parameter. + */ + Vector3D.prototype.crossProduct = function (a) { + return new 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); + }; + + /** + * Decrements the value of the x, y, and z elements of the current + * Vector3D object by the values of the x, y, and z elements of + * specified Vector3D object. Unlike the + * Vector3D.subtract() method, the + * decrementBy() method changes the current Vector3D + * object and does not return a new Vector3D object. + * + * @param a The Vector3D object containing the values to subtract from + * the current Vector3D object. + */ + Vector3D.prototype.decrementBy = function (a) { + this.x -= a.x; + this.y -= a.y; + this.z -= a.z; + }; + + /** + * Returns the distance between two Vector3D objects. The + * distance() method is a static method. You can use it + * directly as a method of the Vector3D class to get the Euclidean + * distance between two three-dimensional points. + * + * @param pt1 A Vector3D object as the first three-dimensional point. + * @param pt2 A Vector3D object as the second three-dimensional point. + * @returns The distance between two Vector3D objects. + */ + Vector3D.distance = function (pt1, pt2) { + var x = (pt1.x - pt2.x); + var y = (pt1.y - pt2.y); + var z = (pt1.z - pt2.z); + return Math.sqrt(x * x + y * y + z * z); + }; + + /** + * If the current Vector3D object and the one specified as the + * parameter are unit vertices, this method returns the cosine of the + * angle between the two vertices. Unit vertices are vertices that + * point to the same direction but their length is one. They remove the + * length of the vector as a factor in the result. You can use the + * normalize() method to convert a vector to a unit + * vector. + * + *

The dotProduct() method finds the angle between two + * vertices. It is also used in backface culling or lighting + * calculations. Backface culling is a procedure for determining which + * surfaces are hidden from the viewpoint. You can use the normalized + * vertices from the camera, or eye, viewpoint and the cross product of + * the vertices of a polygon surface to get the dot product. If the dot + * product is less than zero, then the surface is facing the camera or + * the viewer. If the two unit vertices are perpendicular to each + * other, they are orthogonal and the dot product is zero. If the two + * vertices are parallel to each other, the dot product is one.

+ * + * @param a The second Vector3D object. + * @returns A scalar which is the dot product of the current Vector3D + * object and the specified Vector3D object. + * + * @see away.geom.Vector3D#crossProduct() + * @see away.geom.Vector3D#normalize() + */ + Vector3D.prototype.dotProduct = function (a) { + return this.x * a.x + this.y * a.y + this.z * a.z; + }; + + /** + * Determines whether two Vector3D objects are equal by comparing the + * x, y, and z elements of the current Vector3D object with a + * specified Vector3D object. If the values of these elements are the + * same, the two Vector3D objects are equal. If the second optional + * parameter is set to true, all four elements of the Vector3D objects, + * including the w property, are compared. + */ + /** + * + * @param toCompare The Vector3D object to be compared with the current + * Vector3D object. + * @param allFour An optional parameter that specifies whether the w + * property of the Vector3D objects is used in the + * comparison. + * @returns A value of true if the specified Vector3D object is equal + * to the current Vector3D object; false if it is not equal. + */ + Vector3D.prototype.equals = function (toCompare, allFour) { + if (typeof allFour === "undefined") { allFour = false; } + return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && (!allFour || this.w == toCompare.w)); + }; + + /** + * Increments the value of the x, y, and z elements of the current + * Vector3D object by the values of the x, y, and z elements of a + * specified Vector3D object. Unlike the Vector3D.add() + * method, the incrementBy() method changes the current + * Vector3D object and does not return a new Vector3D object. + * + * @param a The Vector3D object to be added to the current Vector3D + * object. + */ + Vector3D.prototype.incrementBy = function (a) { + this.x += a.x; + this.y += a.y; + this.z += a.z; + }; + + /** + * Compares the elements of the current Vector3D object with the + * elements of a specified Vector3D object to determine whether they + * are nearly equal. The two Vector3D objects are nearly equal if the + * value of all the elements of the two vertices are equal, or the + * result of the comparison is within the tolerance range. The + * difference between two elements must be less than the number + * specified as the tolerance parameter. If the third optional + * parameter is set to true, all four elements of the + * Vector3D objects, including the w property, are + * compared. Otherwise, only the x, y, and z elements are included in + * the comparison. + */ + /** + * + * @param toCompare The Vector3D object to be compared with the current + * Vector3D object. + * @param tolerance A number determining the tolerance factor. If the + * difference between the values of the Vector3D + * element specified in the toCompare parameter and + * the current Vector3D element is less than the + * tolerance number, the two values are considered + * nearly equal. + * @param allFour An optional parameter that specifies whether the w + * property of the Vector3D objects is used in the + * comparison. + * @returns A value of true if the specified Vector3D object is nearly + * equal to the current Vector3D object; false if it is not + * equal. + * + * @see away.geom.Vector3D#equals() + */ + Vector3D.prototype.nearEquals = function (toCompare, tolerance, allFour) { + if (typeof allFour === "undefined") { allFour = true; } + 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)); + }; + + /** + * Sets the current Vector3D object to its inverse. The inverse object + * is also considered the opposite of the original object. The value of + * the x, y, and z properties of the current Vector3D object is changed + * to -x, -y, and -z. + */ + Vector3D.prototype.negate = function () { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + }; + + /** + * Converts a Vector3D object to a unit vector by dividing the first + * three elements (x, y, z) by the length of the vector. Unit vertices + * are vertices that have a direction but their length is one. They + * simplify vector calculations by removing length as a factor. + */ + /** + * Scales the line segment between(0,0) and the current point to a set + * length. + * + * @param thickness The scaling value. For example, if the current + * Vector3D object is (0,3,4), and you normalize it to + * 1, the point returned is at(0,0.6,0.8). + */ + Vector3D.prototype.normalize = function (thickness) { + if (typeof thickness === "undefined") { thickness = 1; } + if (this.length != 0) { + var invLength = thickness / this.length; + this.x *= invLength; + this.y *= invLength; + this.z *= invLength; + return; + } + }; + + /** + * Divides the value of the x, y, and + * z properties of the current Vector3D object by the + * value of its w property. + * + *

If the current Vector3D object is the result of multiplying a + * Vector3D object by a projection Matrix3D object, the w property can + * hold the transform value. The project() method then can + * complete the projection by dividing the elements by the + * w property. Use the Matrix3D.rawData + * property to create a projection Matrix3D object.

+ */ + Vector3D.prototype.project = function () { + this.x /= this.w; + this.y /= this.w; + this.z /= this.w; + }; + + /** + * Scales the current Vector3D object by a scalar, a magnitude. The + * Vector3D object's x, y, and z elements are multiplied by the scalar + * number specified in the parameter. For example, if the vector is + * scaled by ten, the result is a vector that is ten times longer. The + * scalar can also change the direction of the vector. Multiplying the + * vector by a negative number reverses its direction. + * + * @param s A multiplier (scalar) used to scale a Vector3D object. + + */ + Vector3D.prototype.scaleBy = function (s) { + this.x *= s; + this.y *= s; + this.z *= s; + }; + + /** + * Sets the members of Vector3D to the specified values + * + * @param xa The first element, such as the x coordinate. + * @param ya The second element, such as the y coordinate. + * @param za The third element, such as the z coordinate. + */ + Vector3D.prototype.setTo = function (xa, ya, za) { + this.x = xa; + this.y = ya; + this.z = za; + }; + + /** + * Subtracts the value of the x, y, and z elements of the current + * Vector3D object from the values of the x, y, and z elements of + * another Vector3D object. The subtract() method does not + * change the current Vector3D object. Instead, this method returns a + * new Vector3D object with the new values. + * + * @param a The Vector3D object to be subtracted from the current + * Vector3D object. + * @returns A new Vector3D object that is the difference between the + * current Vector3D and the specified Vector3D object. + * + * @see away.geom.Vector3D#decrementBy() + */ + Vector3D.prototype.subtract = function (a) { + return new Vector3D(this.x - a.x, this.y - a.y, this.z - a.z); + }; + + /** + * Returns a string representation of the current Vector3D object. The + * string contains the values of the x, y, and z properties. + */ + Vector3D.prototype.toString = function () { + return "[Vector3D] (x:" + this.x + " ,y:" + this.y + ", z" + this.z + ", w:" + this.w + ")"; + }; + Vector3D.X_AXIS = new Vector3D(1, 0, 0); + + Vector3D.Y_AXIS = new Vector3D(0, 1, 0); + + Vector3D.Z_AXIS = new Vector3D(0, 0, 1); + return Vector3D; +})(); + +module.exports = Vector3D; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvZ2VvbS9WZWN0b3IzRC50cyJdLCJuYW1lcyI6WyJWZWN0b3IzRCIsIlZlY3RvcjNELmNvbnN0cnVjdG9yIiwiVmVjdG9yM0QuYWRkIiwiVmVjdG9yM0QuYW5nbGVCZXR3ZWVuIiwiVmVjdG9yM0QuY2xvbmUiLCJWZWN0b3IzRC5jb3B5RnJvbSIsIlZlY3RvcjNELmNyb3NzUHJvZHVjdCIsIlZlY3RvcjNELmRlY3JlbWVudEJ5IiwiVmVjdG9yM0QuZGlzdGFuY2UiLCJWZWN0b3IzRC5kb3RQcm9kdWN0IiwiVmVjdG9yM0QuZXF1YWxzIiwiVmVjdG9yM0QuaW5jcmVtZW50QnkiLCJWZWN0b3IzRC5uZWFyRXF1YWxzIiwiVmVjdG9yM0QubmVnYXRlIiwiVmVjdG9yM0Qubm9ybWFsaXplIiwiVmVjdG9yM0QucHJvamVjdCIsIlZlY3RvcjNELnNjYWxlQnkiLCJWZWN0b3IzRC5zZXRUbyIsIlZlY3RvcjNELnN1YnRyYWN0IiwiVmVjdG9yM0QudG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBeUJHO0FBQ0g7SUE4RkNBOzs7Ozs7Ozs7O01BREdBO0lBQ0hBLGtCQUFZQSxDQUFZQSxFQUFFQSxDQUFZQSxFQUFFQSxDQUFZQSxFQUFFQSxDQUFZQTtRQUF0REMsZ0NBQUFBLENBQUNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLGdDQUFBQSxDQUFDQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxnQ0FBQUEsQ0FBQ0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsZ0NBQUFBLENBQUNBLEdBQVVBLENBQUNBO0FBQUFBLFFBRWpFQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNWQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtJQUNYQSxDQUFDQTtJQWxDREQ7UUFB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dXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIFZlY3RvcjNEIGNsYXNzIHJlcHJlc2VudHMgYSBwb2ludCBvciBhIGxvY2F0aW9uIGluIHRoZSB0aHJlZS1kaW1lbnNpb25hbFxuICogc3BhY2UgdXNpbmcgdGhlIENhcnRlc2lhbiBjb29yZGluYXRlcyB4LCB5LCBhbmQgei4gQXMgaW4gYSB0d28tZGltZW5zaW9uYWxcbiAqIHNwYWNlLCB0aGUgeCBwcm9wZXJ0eSByZXByZXNlbnRzIHRoZSBob3Jpem9udGFsIGF4aXMgYW5kIHRoZSB5IHByb3BlcnR5XG4gKiByZXByZXNlbnRzIHRoZSB2ZXJ0aWNhbCBheGlzLiBJbiB0aHJlZS1kaW1lbnNpb25hbCBzcGFjZSwgdGhlIHogcHJvcGVydHlcbiAqIHJlcHJlc2VudHMgZGVwdGguIFRoZSB2YWx1ZSBvZiB0aGUgeCBwcm9wZXJ0eSBpbmNyZWFzZXMgYXMgdGhlIG9iamVjdCBtb3Zlc1xuICogdG8gdGhlIHJpZ2h0LiBUaGUgdmFsdWUgb2YgdGhlIHkgcHJvcGVydHkgaW5jcmVhc2VzIGFzIHRoZSBvYmplY3QgbW92ZXNcbiAqIGRvd24uIFRoZSB6IHByb3BlcnR5IGluY3JlYXNlcyBhcyB0aGUgb2JqZWN0IG1vdmVzIGZhcnRoZXIgZnJvbSB0aGUgcG9pbnRcbiAqIG9mIHZpZXcuIFVzaW5nIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gYW5kIHNjYWxpbmcsIHRoZSBvYmplY3QgaXMgc2VlbiB0byBiZVxuICogYmlnZ2VyIHdoZW4gbmVhciBhbmQgc21hbGxlciB3aGVuIGZhcnRoZXIgYXdheSBmcm9tIHRoZSBzY3JlZW4uIEFzIGluIGFcbiAqIHJpZ2h0LWhhbmRlZCB0aHJlZS1kaW1lbnNpb25hbCBjb29yZGluYXRlIHN5c3RlbSwgdGhlIHBvc2l0aXZlIHotYXhpcyBwb2ludHNcbiAqIGF3YXkgZnJvbSB0aGUgdmlld2VyIGFuZCB0aGUgdmFsdWUgb2YgdGhlIHogcHJvcGVydHkgaW5jcmVhc2VzIGFzIHRoZSBvYmplY3RcbiAqIG1vdmVzIGF3YXkgZnJvbSB0aGUgdmlld2VyJ3MgZXllLiBUaGUgb3JpZ2luIHBvaW50ICgwLDAsMCkgb2YgdGhlIGdsb2JhbFxuICogc3BhY2UgaXMgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBzdGFnZS5cbiAqXG4gKiA8cD5UaGUgVmVjdG9yM0QgY2xhc3MgY2FuIGFsc28gcmVwcmVzZW50IGEgZGlyZWN0aW9uLCBhbiBhcnJvdyBwb2ludGluZyBmcm9tXG4gKiB0aGUgb3JpZ2luIG9mIHRoZSBjb29yZGluYXRlcywgc3VjaCBhcyAoMCwwLDApLCB0byBhbiBlbmRwb2ludDsgb3IgYVxuICogZmxvYXRpbmctcG9pbnQgY29tcG9uZW50IG9mIGFuIFJHQiAoUmVkLCBHcmVlbiwgQmx1ZSkgY29sb3IgbW9kZWwuPC9wPlxuICpcbiAqIDxwPlF1YXRlcm5pb24gbm90YXRpb24gaW50cm9kdWNlcyBhIGZvdXJ0aCBlbGVtZW50LCB0aGUgdyBwcm9wZXJ0eSwgd2hpY2hcbiAqIHByb3ZpZGVzIGFkZGl0aW9uYWwgb3JpZW50YXRpb24gaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB0aGUgdyBwcm9wZXJ0eSBjYW5cbiAqIGRlZmluZSBhbiBhbmdsZSBvZiByb3RhdGlvbiBvZiBhIFZlY3RvcjNEIG9iamVjdC4gVGhlIGNvbWJpbmF0aW9uIG9mIHRoZVxuICogYW5nbGUgb2Ygcm90YXRpb24gYW5kIHRoZSBjb29yZGluYXRlcyB4LCB5LCBhbmQgeiBjYW4gZGV0ZXJtaW5lIHRoZSBkaXNwbGF5XG4gKiBvYmplY3QncyBvcmllbnRhdGlvbi4gSGVyZSBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIFZlY3RvcjNEIGVsZW1lbnRzIGluXG4gKiBtYXRyaXggbm90YXRpb246PC9wPlxuICovXG5jbGFzcyBWZWN0b3IzRFxue1xuXHQvKipcblx0ICogVGhlIHggYXhpcyBkZWZpbmVkIGFzIGEgVmVjdG9yM0Qgb2JqZWN0IHdpdGggY29vcmRpbmF0ZXMgKDEsMCwwKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgWF9BWElTOlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKDEsIDAsIDApO1xuXG5cdC8qKlxuXHQgKiBUaGUgeSBheGlzIGRlZmluZWQgYXMgYSBWZWN0b3IzRCBvYmplY3Qgd2l0aCBjb29yZGluYXRlcyAoMCwxLDApLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBZX0FYSVM6VmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoMCwgMSwgMCk7XG5cblx0LyoqXG5cdCAqIFRoZSB6IGF4aXMgZGVmaW5lZCBhcyBhIFZlY3RvcjNEIG9iamVjdCB3aXRoIGNvb3JkaW5hdGVzICgwLDAsMSkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFpfQVhJUzpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRCgwLCAwLCAxKTtcblxuXHQvKipcblx0ICogVGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBWZWN0b3IzRCBvYmplY3QsIHN1Y2ggYXMgdGhlIHggY29vcmRpbmF0ZSBvZlxuXHQgKiBhIHBvaW50IGluIHRoZSB0aHJlZS1kaW1lbnNpb25hbCBzcGFjZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMC5cblx0ICovXG5cdHB1YmxpYyB4Om51bWJlcjtcblxuXHQvKlxuXHQgKlRoZSBzZWNvbmQgZWxlbWVudCBvZiBhIFZlY3RvcjNEIG9iamVjdCwgc3VjaCBhcyB0aGUgeSBjb29yZGluYXRlIG9mXG5cdCAqIGEgcG9pbnQgaW4gdGhlIHRocmVlLWRpbWVuc2lvbmFsIHNwYWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuXHQgKi9cblx0cHVibGljIHk6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgdGhpcmQgZWxlbWVudCBvZiBhIFZlY3RvcjNEIG9iamVjdCwgc3VjaCBhcyB0aGUgeSBjb29yZGluYXRlIG9mXG5cdCAqIGEgcG9pbnQgaW4gdGhlIHRocmVlLWRpbWVuc2lvbmFsIHNwYWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuXHQgKi9cblx0cHVibGljIHo6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUVGhlIGZvdXJ0aCBlbGVtZW50IG9mIGEgVmVjdG9yM0Qgb2JqZWN0IChpbiBhZGRpdGlvbiB0byB0aGUgeCwgeSxcblx0ICogYW5kIHogcHJvcGVydGllcykgY2FuIGhvbGQgZGF0YSBzdWNoIGFzIHRoZSBhbmdsZSBvZiByb3RhdGlvbi4gVGhlXG5cdCAqIGRlZmF1bHQgdmFsdWUgaXMgMC5cblx0ICpcblx0ICogPHA+UXVhdGVybmlvbiBub3RhdGlvbiBlbXBsb3lzIGFuIGFuZ2xlIGFzIHRoZSBmb3VydGggZWxlbWVudCBpblxuXHQgKiBpdHMgY2FsY3VsYXRpb24gb2YgdGhyZWUtZGltZW5zaW9uYWwgcm90YXRpb24uIFRoZSB3IHByb3BlcnR5IGNhblxuXHQgKiBiZSB1c2VkIHRvIGRlZmluZSB0aGUgYW5nbGUgb2Ygcm90YXRpb24gYWJvdXQgdGhlIFZlY3RvcjNEIG9iamVjdC5cblx0ICogVGhlIGNvbWJpbmF0aW9uIG9mIHRoZSByb3RhdGlvbiBhbmdsZSBhbmQgdGhlIGNvb3JkaW5hdGVzICh4LHkseilcblx0ICogZGV0ZXJtaW5lcyB0aGUgZGlzcGxheSBvYmplY3QncyBvcmllbnRhdGlvbi48L3A+XG5cdCAqXG5cdCAqIDxwPkluIGFkZGl0aW9uLCB0aGUgdyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBhcyBhIHBlcnNwZWN0aXZlIHdhcnBcblx0ICogZmFjdG9yIGZvciBhIHByb2plY3RlZCB0aHJlZS1kaW1lbnNpb25hbCBwb3NpdGlvbiBvciBhcyBhIHByb2plY3Rpb25cblx0ICogdHJhbnNmb3JtIHZhbHVlIGluIHJlcHJlc2VudGluZyBhIHRocmVlLWRpbWVuc2lvbmFsIGNvb3JkaW5hdGVcblx0ICogcHJvamVjdGVkIGludG8gdGhlIHR3by1kaW1lbnNpb25hbCBzcGFjZS4gRm9yIGV4YW1wbGUsIHlvdSBjYW5cblx0ICogY3JlYXRlIGEgcHJvamVjdGlvbiBtYXRyaXggdXNpbmcgdGhlIDxjb2RlPk1hdHJpeDNELnJhd0RhdGE8L2NvZGU+XG5cdCAqIHByb3BlcnR5LCB0aGF0LCB3aGVuIGFwcGxpZWQgdG8gYSBWZWN0b3IzRCBvYmplY3QsIHByb2R1Y2VzIGFcblx0ICogdHJhbnNmb3JtIHZhbHVlIGluIHRoZSBWZWN0b3IzRCBvYmplY3QncyBmb3VydGggZWxlbWVudCAodGhlIHdcblx0ICogcHJvcGVydHkpLiBEaXZpZGluZyB0aGUgVmVjdG9yM0Qgb2JqZWN0J3Mgb3RoZXIgZWxlbWVudHMgYnkgdGhlXG5cdCAqIHRyYW5zZm9ybSB2YWx1ZSB0aGVuIHByb2R1Y2VzIGEgcHJvamVjdGVkIFZlY3RvcjNEIG9iamVjdC4gWW91IGNhblxuXHQgKiB1c2UgdGhlIDxjb2RlPlZlY3RvcjNELnByb2plY3QoKTwvY29kZT4gbWV0aG9kIHRvIGRpdmlkZSB0aGUgZmlyc3Rcblx0ICogdGhyZWUgZWxlbWVudHMgb2YgYSBWZWN0b3IzRCBvYmplY3QgYnkgaXRzIGZvdXJ0aCBlbGVtZW50LjwvcD5cblx0ICovXG5cdHB1YmxpYyB3Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIGxlbmd0aCwgbWFnbml0dWRlLCBvZiB0aGUgY3VycmVudCBWZWN0b3IzRCBvYmplY3QgZnJvbSB0aGVcblx0ICogb3JpZ2luICgwLDAsMCkgdG8gdGhlIG9iamVjdCdzIHgsIHksIGFuZCB6IGNvb3JkaW5hdGVzLiBUaGUgd1xuXHQgKiBwcm9wZXJ0eSBpcyBpZ25vcmVkLiBBIHVuaXQgdmVjdG9yIGhhcyBhIGxlbmd0aCBvciBtYWduaXR1ZGUgb2Zcblx0ICogb25lLlxuXHQgKi9cblx0cHVibGljIGdldCBsZW5ndGgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiBNYXRoLnNxcnQodGhpcy5sZW5ndGhTcXVhcmVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgc3F1YXJlIG9mIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgVmVjdG9yM0Qgb2JqZWN0LCBjYWxjdWxhdGVkXG5cdCAqIHVzaW5nIHRoZSB4LCB5LCBhbmQgeiBwcm9wZXJ0aWVzLiBUaGUgdyBwcm9wZXJ0eSBpcyBpZ25vcmVkLiBVc2UgdGhlXG5cdCAqIDxjb2RlPmxlbmd0aFNxdWFyZWQoKTwvY29kZT4gbWV0aG9kIHdoZW5ldmVyIHBvc3NpYmxlIGluc3RlYWQgb2YgdGhlXG5cdCAqIHNsb3dlciA8Y29kZT5NYXRoLnNxcnQoKTwvY29kZT4gbWV0aG9kIGNhbGwgb2YgdGhlXG5cdCAqIDxjb2RlPlZlY3RvcjNELmxlbmd0aCgpPC9jb2RlPiBtZXRob2QuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGxlbmd0aFNxdWFyZWQoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLngqdGhpcy54ICsgdGhpcy55KnRoaXMueSArIHRoaXMueip0aGlzLno7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIFZlY3RvcjNEIG9iamVjdC4gSWYgeW91IGRvIG5vdCBzcGVjaWZ5IGFcblx0ICogcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IsIGEgVmVjdG9yM0Qgb2JqZWN0IGlzIGNyZWF0ZWQgd2l0aFxuXHQgKiB0aGUgZWxlbWVudHMgKDAsMCwwLDApLlxuXHQgKlxuXHQgKiBAcGFyYW0geCBUaGUgZmlyc3QgZWxlbWVudCwgc3VjaCBhcyB0aGUgeCBjb29yZGluYXRlLlxuXHQgKiBAcGFyYW0geSBUaGUgc2Vjb25kIGVsZW1lbnQsIHN1Y2ggYXMgdGhlIHkgY29vcmRpbmF0ZS5cblx0ICogQHBhcmFtIHogVGhlIHRoaXJkIGVsZW1lbnQsIHN1Y2ggYXMgdGhlIHogY29vcmRpbmF0ZS5cblx0ICogQHBhcmFtIHcgQW4gb3B0aW9uYWwgZWxlbWVudCBmb3IgYWRkaXRpb25hbCBkYXRhIHN1Y2ggYXMgdGhlIGFuZ2xlXG5cdCAqICAgICAgICAgIG9mIHJvdGF0aW9uLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoeDpudW1iZXIgPSAwLCB5Om51bWJlciA9IDAsIHo6bnVtYmVyID0gMCwgdzpudW1iZXIgPSAwKVxuXHR7XG5cdFx0dGhpcy54ID0geDtcblx0XHR0aGlzLnkgPSB5O1xuXHRcdHRoaXMueiA9IHo7XG5cdFx0dGhpcy53ID0gdztcblx0fVxuXG5cdC8qKlxuXHQgKiBBZGRzIHRoZSB2YWx1ZSBvZiB0aGUgeCwgeSwgYW5kIHogZWxlbWVudHMgb2YgdGhlIGN1cnJlbnQgVmVjdG9yM0Rcblx0ICogb2JqZWN0IHRvIHRoZSB2YWx1ZXMgb2YgdGhlIHgsIHksIGFuZCB6IGVsZW1lbnRzIG9mIGFub3RoZXIgVmVjdG9yM0Rcblx0ICogb2JqZWN0LiBUaGUgPGNvZGU+YWRkKCk8L2NvZGU+IG1ldGhvZCBkb2VzIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnRcblx0ICogVmVjdG9yM0Qgb2JqZWN0LiBJbnN0ZWFkLCBpdCByZXR1cm5zIGEgbmV3IFZlY3RvcjNEIG9iamVjdCB3aXRoXG5cdCAqIHRoZSBuZXcgdmFsdWVzLlxuXHQgKlxuXHQgKiA8cD5UaGUgcmVzdWx0IG9mIGFkZGluZyB0d28gdmVjdG9ycyB0b2dldGhlciBpcyBhIHJlc3VsdGFudCB2ZWN0b3IuXG5cdCAqIE9uZSB3YXkgdG8gdmlzdWFsaXplIHRoZSByZXN1bHQgaXMgYnkgZHJhd2luZyBhIHZlY3RvciBmcm9tIHRoZVxuXHQgKiBvcmlnaW4gb3IgdGFpbCBvZiB0aGUgZmlyc3QgdmVjdG9yIHRvIHRoZSBlbmQgb3IgaGVhZCBvZiB0aGUgc2Vjb25kXG5cdCAqIHZlY3Rvci4gVGhlIHJlc3VsdGFudCB2ZWN0b3IgaXMgdGhlIGRpc3RhbmNlIGJldHdlZW4gdGhlIG9yaWdpblxuXHQgKiBwb2ludCBvZiB0aGUgZmlyc3QgdmVjdG9yIGFuZCB0aGUgZW5kIHBvaW50IG9mIHRoZSBzZWNvbmQgdmVjdG9yLlxuXHQgKiA8L3A+XG5cdCAqL1xuXHRwdWJsaWMgYWRkKGE6VmVjdG9yM0QpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gbmV3IFZlY3RvcjNEKHRoaXMueCArIGEueCwgdGhpcy55ICsgYS55LCB0aGlzLnogKyBhLnosIHRoaXMudyArIGEudylcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBhbmdsZSBpbiByYWRpYW5zIGJldHdlZW4gdHdvIHZlY3RvcnMuIFRoZSByZXR1cm5lZCBhbmdsZVxuXHQgKiBpcyB0aGUgc21hbGxlc3QgcmFkaWFuIHRoZSBmaXJzdCBWZWN0b3IzRCBvYmplY3Qgcm90YXRlcyB1bnRpbCBpdFxuXHQgKiBhbGlnbnMgd2l0aCB0aGUgc2Vjb25kIFZlY3RvcjNEIG9iamVjdC5cblx0ICpcblx0ICogPHA+VGhlIDxjb2RlPmFuZ2xlQmV0d2VlbigpPC9jb2RlPiBtZXRob2QgaXMgYSBzdGF0aWMgbWV0aG9kLiBZb3Vcblx0ICogY2FuIHVzZSBpdCBkaXJlY3RseSBhcyBhIG1ldGhvZCBvZiB0aGUgVmVjdG9yM0QgY2xhc3MuPC9wPlxuXHQgKlxuXHQgKiA8cD5UbyBjb252ZXJ0IGEgZGVncmVlIHRvIGEgcmFkaWFuLCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nXG5cdCAqIGZvcm11bGE6PC9wPlxuXHQgKlxuXHQgKiA8cD48Y29kZT5yYWRpYW4gPSBNYXRoLlBJLzE4MCAqIGRlZ3JlZTwvY29kZT48L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBhIFRoZSBmaXJzdCBWZWN0b3IzRCBvYmplY3QuXG5cdCAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgVmVjdG9yM0Qgb2JqZWN0LlxuXHQgKiBAcmV0dXJucyBUaGUgYW5nbGUgYmV0d2VlbiB0d28gVmVjdG9yM0Qgb2JqZWN0cy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgYW5nbGVCZXR3ZWVuKGE6VmVjdG9yM0QsIGI6VmVjdG9yM0QpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIE1hdGguYWNvcyhhLmRvdFByb2R1Y3QoYikvKGEubGVuZ3RoKmIubGVuZ3RoKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG5ldyBWZWN0b3IzRCBvYmplY3QgdGhhdCBpcyBhbiBleGFjdCBjb3B5IG9mIHRoZSBjdXJyZW50XG5cdCAqIFZlY3RvcjNEIG9iamVjdC5cblx0ICpcblx0ICogQHJldHVybnMgQSBuZXcgVmVjdG9yM0Qgb2JqZWN0IHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBjdXJyZW50XG5cdCAqIFZlY3RvcjNEIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gbmV3IFZlY3RvcjNEKHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyk7XG5cdH1cblxuXHQvKipcblx0ICogQ29waWVzIGFsbCBvZiB2ZWN0b3IgZGF0YSBmcm9tIHRoZSBzb3VyY2UgVmVjdG9yM0Qgb2JqZWN0IGludG8gdGhlXG5cdCAqIGNhbGxpbmcgVmVjdG9yM0Qgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gc3JjIFRoZSBWZWN0b3IzRCBvYmplY3QgZnJvbSB3aGljaCB0byBjb3B5IHRoZSBkYXRhLlxuXHQgKi9cblx0cHVibGljIGNvcHlGcm9tKHNyYzpWZWN0b3IzRCk6dm9pZFxuXHR7XG5cdFx0dGhpcy54ID0gc3JjLng7XG5cdFx0dGhpcy55ID0gc3JjLnk7XG5cdFx0dGhpcy56ID0gc3JjLno7XG5cdFx0dGhpcy53ID0gc3JjLnc7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIG5ldyBWZWN0b3IzRCBvYmplY3QgdGhhdCBpcyBwZXJwZW5kaWN1bGFyIChhdCBhIHJpZ2h0XG5cdCAqIGFuZ2xlKSB0byB0aGUgY3VycmVudCBWZWN0b3IzRCBhbmQgYW5vdGhlciBWZWN0b3IzRCBvYmplY3QuIElmIHRoZVxuXHQgKiByZXR1cm5lZCBWZWN0b3IzRCBvYmplY3QncyBjb29yZGluYXRlcyBhcmUgKDAsMCwwKSwgdGhlbiB0aGUgdHdvXG5cdCAqIFZlY3RvcjNEIG9iamVjdHMgYXJlIHBhcmFsbGVsIHRvIGVhY2ggb3RoZXIuXG5cdCAqXG5cdCAqIDxwPllvdSBjYW4gdXNlIHRoZSBub3JtYWxpemVkIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlcnRpY2VzIG9mIGFcblx0ICogcG9seWdvbiBzdXJmYWNlIHdpdGggdGhlIG5vcm1hbGl6ZWQgdmVjdG9yIG9mIHRoZSBjYW1lcmEgb3IgZXllXG5cdCAqIHZpZXdwb2ludCB0byBnZXQgYSBkb3QgcHJvZHVjdC4gVGhlIHZhbHVlIG9mIHRoZSBkb3QgcHJvZHVjdCBjYW5cblx0ICogaWRlbnRpZnkgd2hldGhlciBhIHN1cmZhY2Ugb2YgYSB0aHJlZS1kaW1lbnNpb25hbCBvYmplY3QgaXMgaGlkZGVuXG5cdCAqIGZyb20gdGhlIHZpZXdwb2ludC48L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBhIEEgc2Vjb25kIFZlY3RvcjNEIG9iamVjdC5cblx0ICogQHJldHVybnMgQSBuZXcgVmVjdG9yM0Qgb2JqZWN0IHRoYXQgaXMgcGVycGVuZGljdWxhciB0byB0aGUgY3VycmVudFxuXHQgKiAgICAgICAgICBWZWN0b3IzRCBvYmplY3QgYW5kIHRoZSBWZWN0b3IzRCBvYmplY3Qgc3BlY2lmaWVkIGFzIHRoZVxuXHQgKiAgICAgICAgICBwYXJhbWV0ZXIuXG5cdCAqL1xuXHRwdWJsaWMgY3Jvc3NQcm9kdWN0KGE6VmVjdG9yM0QpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gbmV3IFZlY3RvcjNEKHRoaXMueSphLnogLSB0aGlzLnoqYS55LCB0aGlzLnoqYS54IC0gdGhpcy54KmEueiwgdGhpcy54KmEueSAtIHRoaXMueSphLngsIDEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlY3JlbWVudHMgdGhlIHZhbHVlIG9mIHRoZSB4LCB5LCBhbmQgeiBlbGVtZW50cyBvZiB0aGUgY3VycmVudFxuXHQgKiBWZWN0b3IzRCBvYmplY3QgYnkgdGhlIHZhbHVlcyBvZiB0aGUgeCwgeSwgYW5kIHogZWxlbWVudHMgb2Zcblx0ICogc3BlY2lmaWVkIFZlY3RvcjNEIG9iamVjdC4gVW5saWtlIHRoZVxuXHQgKiA8Y29kZT5WZWN0b3IzRC5zdWJ0cmFjdCgpPC9jb2RlPiBtZXRob2QsIHRoZVxuXHQgKiA8Y29kZT5kZWNyZW1lbnRCeSgpPC9jb2RlPiBtZXRob2QgY2hhbmdlcyB0aGUgY3VycmVudCBWZWN0b3IzRFxuXHQgKiBvYmplY3QgYW5kIGRvZXMgbm90IHJldHVybiBhIG5ldyBWZWN0b3IzRCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBhIFRoZSBWZWN0b3IzRCBvYmplY3QgY29udGFpbmluZyB0aGUgdmFsdWVzIHRvIHN1YnRyYWN0IGZyb21cblx0ICogICAgICAgICAgdGhlIGN1cnJlbnQgVmVjdG9yM0Qgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGRlY3JlbWVudEJ5KGE6VmVjdG9yM0QpXG5cdHtcblx0XHR0aGlzLnggLT0gYS54O1xuXHRcdHRoaXMueSAtPSBhLnk7XG5cdFx0dGhpcy56IC09IGEuejtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBWZWN0b3IzRCBvYmplY3RzLiBUaGVcblx0ICogPGNvZGU+ZGlzdGFuY2UoKTwvY29kZT4gbWV0aG9kIGlzIGEgc3RhdGljIG1ldGhvZC4gWW91IGNhbiB1c2UgaXRcblx0ICogZGlyZWN0bHkgYXMgYSBtZXRob2Qgb2YgdGhlIFZlY3RvcjNEIGNsYXNzIHRvIGdldCB0aGUgRXVjbGlkZWFuXG5cdCAqIGRpc3RhbmNlIGJldHdlZW4gdHdvIHRocmVlLWRpbWVuc2lvbmFsIHBvaW50cy5cblx0ICpcblx0ICogQHBhcmFtIHB0MSBBIFZlY3RvcjNEIG9iamVjdCBhcyB0aGUgZmlyc3QgdGhyZWUtZGltZW5zaW9uYWwgcG9pbnQuXG5cdCAqIEBwYXJhbSBwdDIgQSBWZWN0b3IzRCBvYmplY3QgYXMgdGhlIHNlY29uZCB0aHJlZS1kaW1lbnNpb25hbCBwb2ludC5cblx0ICogQHJldHVybnMgVGhlIGRpc3RhbmNlIGJldHdlZW4gdHdvIFZlY3RvcjNEIG9iamVjdHMuXG5cdCAqL1xuXHRzdGF0aWMgZGlzdGFuY2UocHQxOlZlY3RvcjNELCBwdDI6VmVjdG9yM0QpOm51bWJlclxuXHR7XG5cdFx0dmFyIHg6bnVtYmVyID0gKHB0MS54IC0gcHQyLngpO1xuXHRcdHZhciB5Om51bWJlciA9IChwdDEueSAtIHB0Mi55KTtcblx0XHR2YXIgejpudW1iZXIgPSAocHQxLnogLSBwdDIueik7XG5cdFx0cmV0dXJuIE1hdGguc3FydCh4KnggKyB5KnkgKyB6KnopO1xuXHR9XG5cblx0LyoqXG5cdCAqIElmIHRoZSBjdXJyZW50IFZlY3RvcjNEIG9iamVjdCBhbmQgdGhlIG9uZSBzcGVjaWZpZWQgYXMgdGhlXG5cdCAqIHBhcmFtZXRlciBhcmUgdW5pdCB2ZXJ0aWNlcywgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY29zaW5lIG9mIHRoZVxuXHQgKiBhbmdsZSBiZXR3ZWVuIHRoZSB0d28gdmVydGljZXMuIFVuaXQgdmVydGljZXMgYXJlIHZlcnRpY2VzIHRoYXRcblx0ICogcG9pbnQgdG8gdGhlIHNhbWUgZGlyZWN0aW9uIGJ1dCB0aGVpciBsZW5ndGggaXMgb25lLiBUaGV5IHJlbW92ZSB0aGVcblx0ICogbGVuZ3RoIG9mIHRoZSB2ZWN0b3IgYXMgYSBmYWN0b3IgaW4gdGhlIHJlc3VsdC4gWW91IGNhbiB1c2UgdGhlXG5cdCAqIDxjb2RlPm5vcm1hbGl6ZSgpPC9jb2RlPiBtZXRob2QgdG8gY29udmVydCBhIHZlY3RvciB0byBhIHVuaXRcblx0ICogdmVjdG9yLlxuXHQgKlxuXHQgKiA8cD5UaGUgPGNvZGU+ZG90UHJvZHVjdCgpPC9jb2RlPiBtZXRob2QgZmluZHMgdGhlIGFuZ2xlIGJldHdlZW4gdHdvXG5cdCAqIHZlcnRpY2VzLiBJdCBpcyBhbHNvIHVzZWQgaW4gYmFja2ZhY2UgY3VsbGluZyBvciBsaWdodGluZ1xuXHQgKiBjYWxjdWxhdGlvbnMuIEJhY2tmYWNlIGN1bGxpbmcgaXMgYSBwcm9jZWR1cmUgZm9yIGRldGVybWluaW5nIHdoaWNoXG5cdCAqIHN1cmZhY2VzIGFyZSBoaWRkZW4gZnJvbSB0aGUgdmlld3BvaW50LiBZb3UgY2FuIHVzZSB0aGUgbm9ybWFsaXplZFxuXHQgKiB2ZXJ0aWNlcyBmcm9tIHRoZSBjYW1lcmEsIG9yIGV5ZSwgdmlld3BvaW50IGFuZCB0aGUgY3Jvc3MgcHJvZHVjdCBvZlxuXHQgKiB0aGUgdmVydGljZXMgb2YgYSBwb2x5Z29uIHN1cmZhY2UgdG8gZ2V0IHRoZSBkb3QgcHJvZHVjdC4gSWYgdGhlIGRvdFxuXHQgKiBwcm9kdWN0IGlzIGxlc3MgdGhhbiB6ZXJvLCB0aGVuIHRoZSBzdXJmYWNlIGlzIGZhY2luZyB0aGUgY2FtZXJhIG9yXG5cdCAqIHRoZSB2aWV3ZXIuIElmIHRoZSB0d28gdW5pdCB2ZXJ0aWNlcyBhcmUgcGVycGVuZGljdWxhciB0byBlYWNoXG5cdCAqIG90aGVyLCB0aGV5IGFyZSBvcnRob2dvbmFsIGFuZCB0aGUgZG90IHByb2R1Y3QgaXMgemVyby4gSWYgdGhlIHR3b1xuXHQgKiB2ZXJ0aWNlcyBhcmUgcGFyYWxsZWwgdG8gZWFjaCBvdGhlciwgdGhlIGRvdCBwcm9kdWN0IGlzIG9uZS48L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBhIFRoZSBzZWNvbmQgVmVjdG9yM0Qgb2JqZWN0LlxuXHQgKiBAcmV0dXJucyBBIHNjYWxhciB3aGljaCBpcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGN1cnJlbnQgVmVjdG9yM0Rcblx0ICogICAgICAgICAgb2JqZWN0IGFuZCB0aGUgc3BlY2lmaWVkIFZlY3RvcjNEIG9iamVjdC5cblx0ICpcblx0ICogQHNlZSBhd2F5Lmdlb20uVmVjdG9yM0QjY3Jvc3NQcm9kdWN0KClcblx0ICogQHNlZSBhd2F5Lmdlb20uVmVjdG9yM0Qjbm9ybWFsaXplKClcblx0ICovXG5cdHB1YmxpYyBkb3RQcm9kdWN0KGE6VmVjdG9yM0QpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMueCphLnggKyB0aGlzLnkqYS55ICsgdGhpcy56KmEuejtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdHdvIFZlY3RvcjNEIG9iamVjdHMgYXJlIGVxdWFsIGJ5IGNvbXBhcmluZyB0aGVcblx0ICogeCwgeSwgYW5kIHogZWxlbWVudHMgb2YgdGhlIGN1cnJlbnQgVmVjdG9yM0Qgb2JqZWN0IHdpdGggYVxuXHQgKiBzcGVjaWZpZWQgVmVjdG9yM0Qgb2JqZWN0LiBJZiB0aGUgdmFsdWVzIG9mIHRoZXNlIGVsZW1lbnRzIGFyZSB0aGVcblx0ICogc2FtZSwgdGhlIHR3byBWZWN0b3IzRCBvYmplY3RzIGFyZSBlcXVhbC4gSWYgdGhlIHNlY29uZCBvcHRpb25hbFxuXHQgKiBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsIGFsbCBmb3VyIGVsZW1lbnRzIG9mIHRoZSBWZWN0b3IzRCBvYmplY3RzLFxuXHQgKiBpbmNsdWRpbmcgdGhlIHcgcHJvcGVydHksIGFyZSBjb21wYXJlZC5cblx0ICovXG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB0b0NvbXBhcmUgVGhlIFZlY3RvcjNEIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50XG5cdCAqICAgICAgICAgICAgICAgICAgVmVjdG9yM0Qgb2JqZWN0LlxuXHQgKiBAcGFyYW0gYWxsRm91ciAgIEFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSB3XG5cdCAqICAgICAgICAgICAgICAgICAgcHJvcGVydHkgb2YgdGhlIFZlY3RvcjNEIG9iamVjdHMgaXMgdXNlZCBpbiB0aGVcblx0ICogICAgICAgICAgICAgICAgICBjb21wYXJpc29uLlxuXHQgKiBAcmV0dXJucyBBIHZhbHVlIG9mIHRydWUgaWYgdGhlIHNwZWNpZmllZCBWZWN0b3IzRCBvYmplY3QgaXMgZXF1YWxcblx0ICogICAgICAgICAgdG8gdGhlIGN1cnJlbnQgVmVjdG9yM0Qgb2JqZWN0OyBmYWxzZSBpZiBpdCBpcyBub3QgZXF1YWwuXG5cdCAqL1xuXHRwdWJsaWMgZXF1YWxzKHRvQ29tcGFyZTpWZWN0b3IzRCwgYWxsRm91cjpib29sZWFuID0gZmFsc2UpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy54ID09IHRvQ29tcGFyZS54ICYmIHRoaXMueSA9PSB0b0NvbXBhcmUueSAmJiB0aGlzLnogPT0gdG9Db21wYXJlLnogJiYgKCFhbGxGb3VyIHx8IHRoaXMudyA9PSB0b0NvbXBhcmUudyApKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmNyZW1lbnRzIHRoZSB2YWx1ZSBvZiB0aGUgeCwgeSwgYW5kIHogZWxlbWVudHMgb2YgdGhlIGN1cnJlbnRcblx0ICogVmVjdG9yM0Qgb2JqZWN0IGJ5IHRoZSB2YWx1ZXMgb2YgdGhlIHgsIHksIGFuZCB6IGVsZW1lbnRzIG9mIGFcblx0ICogc3BlY2lmaWVkIFZlY3RvcjNEIG9iamVjdC4gVW5saWtlIHRoZSA8Y29kZT5WZWN0b3IzRC5hZGQoKTwvY29kZT5cblx0ICogbWV0aG9kLCB0aGUgPGNvZGU+aW5jcmVtZW50QnkoKTwvY29kZT4gbWV0aG9kIGNoYW5nZXMgdGhlIGN1cnJlbnRcblx0ICogVmVjdG9yM0Qgb2JqZWN0IGFuZCBkb2VzIG5vdCByZXR1cm4gYSBuZXcgVmVjdG9yM0Qgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gYSBUaGUgVmVjdG9yM0Qgb2JqZWN0IHRvIGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IFZlY3RvcjNEXG5cdCAqICAgICAgICAgIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBpbmNyZW1lbnRCeShhOlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy54ICs9IGEueDtcblx0XHR0aGlzLnkgKz0gYS55O1xuXHRcdHRoaXMueiArPSBhLno7XG5cdH1cblxuXHQvKipcblx0ICogQ29tcGFyZXMgdGhlIGVsZW1lbnRzIG9mIHRoZSBjdXJyZW50IFZlY3RvcjNEIG9iamVjdCB3aXRoIHRoZVxuXHQgKiBlbGVtZW50cyBvZiBhIHNwZWNpZmllZCBWZWN0b3IzRCBvYmplY3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhleVxuXHQgKiBhcmUgbmVhcmx5IGVxdWFsLiBUaGUgdHdvIFZlY3RvcjNEIG9iamVjdHMgYXJlIG5lYXJseSBlcXVhbCBpZiB0aGVcblx0ICogdmFsdWUgb2YgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgdHdvIHZlcnRpY2VzIGFyZSBlcXVhbCwgb3IgdGhlXG5cdCAqIHJlc3VsdCBvZiB0aGUgY29tcGFyaXNvbiBpcyB3aXRoaW4gdGhlIHRvbGVyYW5jZSByYW5nZS4gVGhlXG5cdCAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZWxlbWVudHMgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlclxuXHQgKiBzcGVjaWZpZWQgYXMgdGhlIHRvbGVyYW5jZSBwYXJhbWV0ZXIuIElmIHRoZSB0aGlyZCBvcHRpb25hbFxuXHQgKiBwYXJhbWV0ZXIgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBhbGwgZm91ciBlbGVtZW50cyBvZiB0aGVcblx0ICogVmVjdG9yM0Qgb2JqZWN0cywgaW5jbHVkaW5nIHRoZSA8Y29kZT53PC9jb2RlPiBwcm9wZXJ0eSwgYXJlXG5cdCAqIGNvbXBhcmVkLiBPdGhlcndpc2UsIG9ubHkgdGhlIHgsIHksIGFuZCB6IGVsZW1lbnRzIGFyZSBpbmNsdWRlZCBpblxuXHQgKiB0aGUgY29tcGFyaXNvbi5cblx0ICovXG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB0b0NvbXBhcmUgVGhlIFZlY3RvcjNEIG9iamVjdCB0byBiZSBjb21wYXJlZCB3aXRoIHRoZSBjdXJyZW50XG5cdCAqICAgICAgICAgICAgICAgICAgVmVjdG9yM0Qgb2JqZWN0LlxuXHQgKiBAcGFyYW0gdG9sZXJhbmNlIEEgbnVtYmVyIGRldGVybWluaW5nIHRoZSB0b2xlcmFuY2UgZmFjdG9yLiBJZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHZhbHVlcyBvZiB0aGUgVmVjdG9yM0Rcblx0ICogICAgICAgICAgICAgICAgICBlbGVtZW50IHNwZWNpZmllZCBpbiB0aGUgdG9Db21wYXJlIHBhcmFtZXRlciBhbmRcblx0ICogICAgICAgICAgICAgICAgICB0aGUgY3VycmVudCBWZWN0b3IzRCBlbGVtZW50IGlzIGxlc3MgdGhhbiB0aGVcblx0ICogICAgICAgICAgICAgICAgICB0b2xlcmFuY2UgbnVtYmVyLCB0aGUgdHdvIHZhbHVlcyBhcmUgY29uc2lkZXJlZFxuXHQgKiAgICAgICAgICAgICAgICAgIG5lYXJseSBlcXVhbC5cblx0ICogQHBhcmFtIGFsbEZvdXIgICBBbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgd2hldGhlciB0aGUgd1xuXHQgKiAgICAgICAgICAgICAgICAgIHByb3BlcnR5IG9mIHRoZSBWZWN0b3IzRCBvYmplY3RzIGlzIHVzZWQgaW4gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgY29tcGFyaXNvbi5cblx0ICogQHJldHVybnMgQSB2YWx1ZSBvZiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVmVjdG9yM0Qgb2JqZWN0IGlzIG5lYXJseVxuXHQgKiAgICAgICAgICBlcXVhbCB0byB0aGUgY3VycmVudCBWZWN0b3IzRCBvYmplY3Q7IGZhbHNlIGlmIGl0IGlzIG5vdFxuXHQgKiAgICAgICAgICBlcXVhbC5cblx0ICpcblx0ICogQHNlZSBhd2F5Lmdlb20uVmVjdG9yM0QjZXF1YWxzKClcblx0ICovXG5cdHB1YmxpYyBuZWFyRXF1YWxzKHRvQ29tcGFyZTpWZWN0b3IzRCwgdG9sZXJhbmNlOm51bWJlciwgYWxsRm91cjpib29sZWFuID0gdHJ1ZSk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuICgoTWF0aC5hYnModGhpcy54IC0gdG9Db21wYXJlLngpIDwgdG9sZXJhbmNlKSAmJiAoTWF0aC5hYnModGhpcy55IC0gdG9Db21wYXJlLnkpIDwgdG9sZXJhbmNlKSAmJiAoTWF0aC5hYnModGhpcy56IC0gdG9Db21wYXJlLnopIDwgdG9sZXJhbmNlKSAmJiAoIWFsbEZvdXIgfHwgTWF0aC5hYnModGhpcy53IC0gdG9Db21wYXJlLncpIDwgdG9sZXJhbmNlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgY3VycmVudCBWZWN0b3IzRCBvYmplY3QgdG8gaXRzIGludmVyc2UuIFRoZSBpbnZlcnNlIG9iamVjdFxuXHQgKiBpcyBhbHNvIGNvbnNpZGVyZWQgdGhlIG9wcG9zaXRlIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuIFRoZSB2YWx1ZSBvZlxuXHQgKiB0aGUgeCwgeSwgYW5kIHogcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBWZWN0b3IzRCBvYmplY3QgaXMgY2hhbmdlZFxuXHQgKiB0byAteCwgLXksIGFuZCAtei5cblx0ICovXG5cdHB1YmxpYyBuZWdhdGUoKTp2b2lkXG5cdHtcblx0XHR0aGlzLnggPSAtdGhpcy54O1xuXHRcdHRoaXMueSA9IC10aGlzLnk7XG5cdFx0dGhpcy56ID0gLXRoaXMuejtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhIFZlY3RvcjNEIG9iamVjdCB0byBhIHVuaXQgdmVjdG9yIGJ5IGRpdmlkaW5nIHRoZSBmaXJzdFxuXHQgKiB0aHJlZSBlbGVtZW50cyAoeCwgeSwgeikgYnkgdGhlIGxlbmd0aCBvZiB0aGUgdmVjdG9yLiBVbml0IHZlcnRpY2VzXG5cdCAqIGFyZSB2ZXJ0aWNlcyB0aGF0IGhhdmUgYSBkaXJlY3Rpb24gYnV0IHRoZWlyIGxlbmd0aCBpcyBvbmUuIFRoZXlcblx0ICogc2ltcGxpZnkgdmVjdG9yIGNhbGN1bGF0aW9ucyBieSByZW1vdmluZyBsZW5ndGggYXMgYSBmYWN0b3IuXG5cdCAqL1xuXHQvKipcblx0ICogU2NhbGVzIHRoZSBsaW5lIHNlZ21lbnQgYmV0d2VlbigwLDApIGFuZCB0aGUgY3VycmVudCBwb2ludCB0byBhIHNldFxuXHQgKiBsZW5ndGguXG5cdCAqXG5cdCAqIEBwYXJhbSB0aGlja25lc3MgVGhlIHNjYWxpbmcgdmFsdWUuIEZvciBleGFtcGxlLCBpZiB0aGUgY3VycmVudFxuXHQgKiAgICAgICAgICAgICAgICAgIFZlY3RvcjNEIG9iamVjdCBpcyAoMCwzLDQpLCBhbmQgeW91IG5vcm1hbGl6ZSBpdCB0b1xuXHQgKiAgICAgICAgICAgICAgICAgIDEsIHRoZSBwb2ludCByZXR1cm5lZCBpcyBhdCgwLDAuNiwwLjgpLlxuXHQgKi9cblx0cHVibGljIG5vcm1hbGl6ZSh0aGlja25lc3M6bnVtYmVyID0gMSlcblx0e1xuXHRcdGlmICh0aGlzLmxlbmd0aCAhPSAwKSB7XG5cdFx0XHR2YXIgaW52TGVuZ3RoID0gdGhpY2tuZXNzL3RoaXMubGVuZ3RoO1xuXHRcdFx0dGhpcy54ICo9IGludkxlbmd0aDtcblx0XHRcdHRoaXMueSAqPSBpbnZMZW5ndGg7XG5cdFx0XHR0aGlzLnogKj0gaW52TGVuZ3RoO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBEaXZpZGVzIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+eDwvY29kZT4sIDxjb2RlPnk8L2NvZGU+LCBhbmRcblx0ICogPGNvZGU+ejwvY29kZT4gcHJvcGVydGllcyBvZiB0aGUgY3VycmVudCBWZWN0b3IzRCBvYmplY3QgYnkgdGhlXG5cdCAqIHZhbHVlIG9mIGl0cyA8Y29kZT53PC9jb2RlPiBwcm9wZXJ0eS5cblx0ICpcblx0ICogPHA+SWYgdGhlIGN1cnJlbnQgVmVjdG9yM0Qgb2JqZWN0IGlzIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgYVxuXHQgKiBWZWN0b3IzRCBvYmplY3QgYnkgYSBwcm9qZWN0aW9uIE1hdHJpeDNEIG9iamVjdCwgdGhlIHcgcHJvcGVydHkgY2FuXG5cdCAqIGhvbGQgdGhlIHRyYW5zZm9ybSB2YWx1ZS4gVGhlIDxjb2RlPnByb2plY3QoKTwvY29kZT4gbWV0aG9kIHRoZW4gY2FuXG5cdCAqIGNvbXBsZXRlIHRoZSBwcm9qZWN0aW9uIGJ5IGRpdmlkaW5nIHRoZSBlbGVtZW50cyBieSB0aGVcblx0ICogPGNvZGU+dzwvY29kZT4gcHJvcGVydHkuIFVzZSB0aGUgPGNvZGU+TWF0cml4M0QucmF3RGF0YTwvY29kZT5cblx0ICogcHJvcGVydHkgdG8gY3JlYXRlIGEgcHJvamVjdGlvbiBNYXRyaXgzRCBvYmplY3QuPC9wPlxuXHQgKi9cblx0cHVibGljIHByb2plY3QoKTp2b2lkXG5cdHtcblx0XHR0aGlzLnggLz0gdGhpcy53O1xuXHRcdHRoaXMueSAvPSB0aGlzLnc7XG5cdFx0dGhpcy56IC89IHRoaXMudztcblx0fVxuXG5cdC8qKlxuXHQgKiBTY2FsZXMgdGhlIGN1cnJlbnQgVmVjdG9yM0Qgb2JqZWN0IGJ5IGEgc2NhbGFyLCBhIG1hZ25pdHVkZS4gVGhlXG5cdCAqIFZlY3RvcjNEIG9iamVjdCdzIHgsIHksIGFuZCB6IGVsZW1lbnRzIGFyZSBtdWx0aXBsaWVkIGJ5IHRoZSBzY2FsYXJcblx0ICogbnVtYmVyIHNwZWNpZmllZCBpbiB0aGUgcGFyYW1ldGVyLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHZlY3RvciBpc1xuXHQgKiBzY2FsZWQgYnkgdGVuLCB0aGUgcmVzdWx0IGlzIGEgdmVjdG9yIHRoYXQgaXMgdGVuIHRpbWVzIGxvbmdlci4gVGhlXG5cdCAqIHNjYWxhciBjYW4gYWxzbyBjaGFuZ2UgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdmVjdG9yLiBNdWx0aXBseWluZyB0aGVcblx0ICogdmVjdG9yIGJ5IGEgbmVnYXRpdmUgbnVtYmVyIHJldmVyc2VzIGl0cyBkaXJlY3Rpb24uXG5cdCAqXG5cdCAqIEBwYXJhbSBzIEEgbXVsdGlwbGllciAoc2NhbGFyKSB1c2VkIHRvIHNjYWxlIGEgVmVjdG9yM0Qgb2JqZWN0LlxuXG5cdCAqL1xuXHRwdWJsaWMgc2NhbGVCeShzOm51bWJlcik6dm9pZFxuXHR7XG5cdFx0dGhpcy54ICo9IHM7XG5cdFx0dGhpcy55ICo9IHM7XG5cdFx0dGhpcy56ICo9IHM7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyB0aGUgbWVtYmVycyBvZiBWZWN0b3IzRCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlc1xuXHQgKlxuXHQgKiBAcGFyYW0geGEgVGhlIGZpcnN0IGVsZW1lbnQsIHN1Y2ggYXMgdGhlIHggY29vcmRpbmF0ZS5cblx0ICogQHBhcmFtIHlhIFRoZSBzZWNvbmQgZWxlbWVudCwgc3VjaCBhcyB0aGUgeSBjb29yZGluYXRlLlxuXHQgKiBAcGFyYW0gemEgVGhlIHRoaXJkIGVsZW1lbnQsIHN1Y2ggYXMgdGhlIHogY29vcmRpbmF0ZS5cblx0ICovXG5cdHB1YmxpYyBzZXRUbyh4YTpudW1iZXIsIHlhOm51bWJlciwgemE6bnVtYmVyKTp2b2lkXG5cdHtcblx0XHR0aGlzLnggPSB4YTtcblx0XHR0aGlzLnkgPSB5YTtcblx0XHR0aGlzLnogPSB6YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJ0cmFjdHMgdGhlIHZhbHVlIG9mIHRoZSB4LCB5LCBhbmQgeiBlbGVtZW50cyBvZiB0aGUgY3VycmVudFxuXHQgKiBWZWN0b3IzRCBvYmplY3QgZnJvbSB0aGUgdmFsdWVzIG9mIHRoZSB4LCB5LCBhbmQgeiBlbGVtZW50cyBvZlxuXHQgKiBhbm90aGVyIFZlY3RvcjNEIG9iamVjdC4gVGhlIDxjb2RlPnN1YnRyYWN0KCk8L2NvZGU+IG1ldGhvZCBkb2VzIG5vdFxuXHQgKiBjaGFuZ2UgdGhlIGN1cnJlbnQgVmVjdG9yM0Qgb2JqZWN0LiBJbnN0ZWFkLCB0aGlzIG1ldGhvZCByZXR1cm5zIGFcblx0ICogbmV3IFZlY3RvcjNEIG9iamVjdCB3aXRoIHRoZSBuZXcgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gYSBUaGUgVmVjdG9yM0Qgb2JqZWN0IHRvIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgY3VycmVudFxuXHQgKiAgICAgICAgICBWZWN0b3IzRCBvYmplY3QuXG5cdCAqIEByZXR1cm5zIEEgbmV3IFZlY3RvcjNEIG9iamVjdCB0aGF0IGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlXG5cdCAqICAgICAgICAgIGN1cnJlbnQgVmVjdG9yM0QgYW5kIHRoZSBzcGVjaWZpZWQgVmVjdG9yM0Qgb2JqZWN0LlxuXHQgKlxuXHQgKiBAc2VlIGF3YXkuZ2VvbS5WZWN0b3IzRCNkZWNyZW1lbnRCeSgpXG5cdCAqL1xuXHRwdWJsaWMgc3VidHJhY3QoYTpWZWN0b3IzRCk6VmVjdG9yM0Rcblx0e1xuXHRcdHJldHVybiBuZXcgVmVjdG9yM0QodGhpcy54IC0gYS54LCB0aGlzLnkgLSBhLnksIHRoaXMueiAtIGEueik7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCBWZWN0b3IzRCBvYmplY3QuIFRoZVxuXHQgKiBzdHJpbmcgY29udGFpbnMgdGhlIHZhbHVlcyBvZiB0aGUgeCwgeSwgYW5kIHogcHJvcGVydGllcy5cblx0ICovXG5cdHB1YmxpYyB0b1N0cmluZygpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIFwiW1ZlY3RvcjNEXSAoeDpcIiArIHRoaXMueCArIFwiICx5OlwiICsgdGhpcy55ICsgXCIsIHpcIiArIHRoaXMueiArIFwiLCB3OlwiICsgdGhpcy53ICsgXCIpXCI7XG5cdH1cbn1cblxuZXhwb3J0ID0gVmVjdG9yM0Q7Il19 \ No newline at end of file diff --git a/lib/core/geom/Vector3D.ts b/lib/core/geom/Vector3D.ts new file mode 100644 index 00000000..ae160192 --- /dev/null +++ b/lib/core/geom/Vector3D.ts @@ -0,0 +1,483 @@ +/** + * The Vector3D class represents a point or a location in the three-dimensional + * space using the Cartesian coordinates x, y, and z. As in a two-dimensional + * space, the x property represents the horizontal axis and the y property + * represents the vertical axis. In three-dimensional space, the z property + * represents depth. The value of the x property increases as the object moves + * to the right. The value of the y property increases as the object moves + * down. The z property increases as the object moves farther from the point + * of view. Using perspective projection and scaling, the object is seen to be + * bigger when near and smaller when farther away from the screen. As in a + * right-handed three-dimensional coordinate system, the positive z-axis points + * away from the viewer and the value of the z property increases as the object + * moves away from the viewer's eye. The origin point (0,0,0) of the global + * space is the upper-left corner of the stage. + * + *

The Vector3D class can also represent a direction, an arrow pointing from + * the origin of the coordinates, such as (0,0,0), to an endpoint; or a + * floating-point component of an RGB (Red, Green, Blue) color model.

+ * + *

Quaternion notation introduces a fourth element, the w property, which + * provides additional orientation information. For example, the w property can + * define an angle of rotation of a Vector3D object. The combination of the + * angle of rotation and the coordinates x, y, and z can determine the display + * object's orientation. Here is a representation of Vector3D elements in + * matrix notation:

+ */ +class Vector3D +{ + /** + * The x axis defined as a Vector3D object with coordinates (1,0,0). + */ + public static X_AXIS:Vector3D = new Vector3D(1, 0, 0); + + /** + * The y axis defined as a Vector3D object with coordinates (0,1,0). + */ + public static Y_AXIS:Vector3D = new Vector3D(0, 1, 0); + + /** + * The z axis defined as a Vector3D object with coordinates (0,0,1). + */ + public static Z_AXIS:Vector3D = new Vector3D(0, 0, 1); + + /** + * The first element of a Vector3D object, such as the x coordinate of + * a point in the three-dimensional space. The default value is 0. + */ + public x:number; + + /* + *The second element of a Vector3D object, such as the y coordinate of + * a point in the three-dimensional space. The default value is 0. + */ + public y:number; + + /** + * The third element of a Vector3D object, such as the y coordinate of + * a point in the three-dimensional space. The default value is 0. + */ + public z:number; + + /** + * TThe fourth element of a Vector3D object (in addition to the x, y, + * and z properties) can hold data such as the angle of rotation. The + * default value is 0. + * + *

Quaternion notation employs an angle as the fourth element in + * its calculation of three-dimensional rotation. The w property can + * be used to define the angle of rotation about the Vector3D object. + * The combination of the rotation angle and the coordinates (x,y,z) + * determines the display object's orientation.

+ * + *

In addition, the w property can be used as a perspective warp + * factor for a projected three-dimensional position or as a projection + * transform value in representing a three-dimensional coordinate + * projected into the two-dimensional space. For example, you can + * create a projection matrix using the Matrix3D.rawData + * property, that, when applied to a Vector3D object, produces a + * transform value in the Vector3D object's fourth element (the w + * property). Dividing the Vector3D object's other elements by the + * transform value then produces a projected Vector3D object. You can + * use the Vector3D.project() method to divide the first + * three elements of a Vector3D object by its fourth element.

+ */ + public w:number; + + /** + * The length, magnitude, of the current Vector3D object from the + * origin (0,0,0) to the object's x, y, and z coordinates. The w + * property is ignored. A unit vector has a length or magnitude of + * one. + */ + public get length():number + { + return Math.sqrt(this.lengthSquared); + } + + /** + * The square of the length of the current Vector3D object, calculated + * using the x, y, and z properties. The w property is ignored. Use the + * lengthSquared() method whenever possible instead of the + * slower Math.sqrt() method call of the + * Vector3D.length() method. + */ + public get lengthSquared():number + { + return this.x*this.x + this.y*this.y + this.z*this.z; + } + + /** + * Creates an instance of a Vector3D object. If you do not specify a + * parameter for the constructor, a Vector3D object is created with + * the elements (0,0,0,0). + * + * @param x The first element, such as the x coordinate. + * @param y The second element, such as the y coordinate. + * @param z The third element, such as the z coordinate. + * @param w An optional element for additional data such as the angle + * of rotation. + */ + constructor(x:number = 0, y:number = 0, z:number = 0, w:number = 0) + { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + /** + * Adds the value of the x, y, and z elements of the current Vector3D + * object to the values of the x, y, and z elements of another Vector3D + * object. The add() method does not change the current + * Vector3D object. Instead, it returns a new Vector3D object with + * the new values. + * + *

The result of adding two vectors together is a resultant vector. + * One way to visualize the result is by drawing a vector from the + * origin or tail of the first vector to the end or head of the second + * vector. The resultant vector is the distance between the origin + * point of the first vector and the end point of the second vector. + *

+ */ + public add(a:Vector3D):Vector3D + { + return new Vector3D(this.x + a.x, this.y + a.y, this.z + a.z, this.w + a.w) + } + + /** + * Returns the angle in radians between two vectors. The returned angle + * is the smallest radian the first Vector3D object rotates until it + * aligns with the second Vector3D object. + * + *

The angleBetween() method is a static method. You + * can use it directly as a method of the Vector3D class.

+ * + *

To convert a degree to a radian, you can use the following + * formula:

+ * + *

radian = Math.PI/180 * degree

+ * + * @param a The first Vector3D object. + * @param b The second Vector3D object. + * @returns The angle between two Vector3D objects. + */ + public static angleBetween(a:Vector3D, b:Vector3D):number + { + return Math.acos(a.dotProduct(b)/(a.length*b.length)); + } + + /** + * Returns a new Vector3D object that is an exact copy of the current + * Vector3D object. + * + * @returns A new Vector3D object that is a copy of the current + * Vector3D object. + */ + public clone():Vector3D + { + return new Vector3D(this.x, this.y, this.z, this.w); + } + + /** + * Copies all of vector data from the source Vector3D object into the + * calling Vector3D object. + * + * @param src The Vector3D object from which to copy the data. + */ + public copyFrom(src:Vector3D):void + { + this.x = src.x; + this.y = src.y; + this.z = src.z; + this.w = src.w; + } + + /** + * Returns a new Vector3D object that is perpendicular (at a right + * angle) to the current Vector3D and another Vector3D object. If the + * returned Vector3D object's coordinates are (0,0,0), then the two + * Vector3D objects are parallel to each other. + * + *

You can use the normalized cross product of two vertices of a + * polygon surface with the normalized vector of the camera or eye + * viewpoint to get a dot product. The value of the dot product can + * identify whether a surface of a three-dimensional object is hidden + * from the viewpoint.

+ * + * @param a A second Vector3D object. + * @returns A new Vector3D object that is perpendicular to the current + * Vector3D object and the Vector3D object specified as the + * parameter. + */ + public crossProduct(a:Vector3D):Vector3D + { + return new 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); + } + + /** + * Decrements the value of the x, y, and z elements of the current + * Vector3D object by the values of the x, y, and z elements of + * specified Vector3D object. Unlike the + * Vector3D.subtract() method, the + * decrementBy() method changes the current Vector3D + * object and does not return a new Vector3D object. + * + * @param a The Vector3D object containing the values to subtract from + * the current Vector3D object. + */ + public decrementBy(a:Vector3D) + { + this.x -= a.x; + this.y -= a.y; + this.z -= a.z; + } + + /** + * Returns the distance between two Vector3D objects. The + * distance() method is a static method. You can use it + * directly as a method of the Vector3D class to get the Euclidean + * distance between two three-dimensional points. + * + * @param pt1 A Vector3D object as the first three-dimensional point. + * @param pt2 A Vector3D object as the second three-dimensional point. + * @returns The distance between two Vector3D objects. + */ + static distance(pt1:Vector3D, pt2:Vector3D):number + { + var x:number = (pt1.x - pt2.x); + var y:number = (pt1.y - pt2.y); + var z:number = (pt1.z - pt2.z); + return Math.sqrt(x*x + y*y + z*z); + } + + /** + * If the current Vector3D object and the one specified as the + * parameter are unit vertices, this method returns the cosine of the + * angle between the two vertices. Unit vertices are vertices that + * point to the same direction but their length is one. They remove the + * length of the vector as a factor in the result. You can use the + * normalize() method to convert a vector to a unit + * vector. + * + *

The dotProduct() method finds the angle between two + * vertices. It is also used in backface culling or lighting + * calculations. Backface culling is a procedure for determining which + * surfaces are hidden from the viewpoint. You can use the normalized + * vertices from the camera, or eye, viewpoint and the cross product of + * the vertices of a polygon surface to get the dot product. If the dot + * product is less than zero, then the surface is facing the camera or + * the viewer. If the two unit vertices are perpendicular to each + * other, they are orthogonal and the dot product is zero. If the two + * vertices are parallel to each other, the dot product is one.

+ * + * @param a The second Vector3D object. + * @returns A scalar which is the dot product of the current Vector3D + * object and the specified Vector3D object. + * + * @see away.geom.Vector3D#crossProduct() + * @see away.geom.Vector3D#normalize() + */ + public dotProduct(a:Vector3D):number + { + return this.x*a.x + this.y*a.y + this.z*a.z; + } + + /** + * Determines whether two Vector3D objects are equal by comparing the + * x, y, and z elements of the current Vector3D object with a + * specified Vector3D object. If the values of these elements are the + * same, the two Vector3D objects are equal. If the second optional + * parameter is set to true, all four elements of the Vector3D objects, + * including the w property, are compared. + */ + + /** + * + * @param toCompare The Vector3D object to be compared with the current + * Vector3D object. + * @param allFour An optional parameter that specifies whether the w + * property of the Vector3D objects is used in the + * comparison. + * @returns A value of true if the specified Vector3D object is equal + * to the current Vector3D object; false if it is not equal. + */ + public equals(toCompare:Vector3D, allFour:boolean = false):boolean + { + return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && (!allFour || this.w == toCompare.w )); + } + + /** + * Increments the value of the x, y, and z elements of the current + * Vector3D object by the values of the x, y, and z elements of a + * specified Vector3D object. Unlike the Vector3D.add() + * method, the incrementBy() method changes the current + * Vector3D object and does not return a new Vector3D object. + * + * @param a The Vector3D object to be added to the current Vector3D + * object. + */ + public incrementBy(a:Vector3D) + { + this.x += a.x; + this.y += a.y; + this.z += a.z; + } + + /** + * Compares the elements of the current Vector3D object with the + * elements of a specified Vector3D object to determine whether they + * are nearly equal. The two Vector3D objects are nearly equal if the + * value of all the elements of the two vertices are equal, or the + * result of the comparison is within the tolerance range. The + * difference between two elements must be less than the number + * specified as the tolerance parameter. If the third optional + * parameter is set to true, all four elements of the + * Vector3D objects, including the w property, are + * compared. Otherwise, only the x, y, and z elements are included in + * the comparison. + */ + + /** + * + * @param toCompare The Vector3D object to be compared with the current + * Vector3D object. + * @param tolerance A number determining the tolerance factor. If the + * difference between the values of the Vector3D + * element specified in the toCompare parameter and + * the current Vector3D element is less than the + * tolerance number, the two values are considered + * nearly equal. + * @param allFour An optional parameter that specifies whether the w + * property of the Vector3D objects is used in the + * comparison. + * @returns A value of true if the specified Vector3D object is nearly + * equal to the current Vector3D object; false if it is not + * equal. + * + * @see away.geom.Vector3D#equals() + */ + public nearEquals(toCompare:Vector3D, tolerance:number, allFour:boolean = true):boolean + { + 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)); + } + + /** + * Sets the current Vector3D object to its inverse. The inverse object + * is also considered the opposite of the original object. The value of + * the x, y, and z properties of the current Vector3D object is changed + * to -x, -y, and -z. + */ + public negate():void + { + this.x = -this.x; + this.y = -this.y; + this.z = -this.z; + } + + /** + * Converts a Vector3D object to a unit vector by dividing the first + * three elements (x, y, z) by the length of the vector. Unit vertices + * are vertices that have a direction but their length is one. They + * simplify vector calculations by removing length as a factor. + */ + /** + * Scales the line segment between(0,0) and the current point to a set + * length. + * + * @param thickness The scaling value. For example, if the current + * Vector3D object is (0,3,4), and you normalize it to + * 1, the point returned is at(0,0.6,0.8). + */ + public normalize(thickness:number = 1) + { + if (this.length != 0) { + var invLength = thickness/this.length; + this.x *= invLength; + this.y *= invLength; + this.z *= invLength; + return; + } + } + + /** + * Divides the value of the x, y, and + * z properties of the current Vector3D object by the + * value of its w property. + * + *

If the current Vector3D object is the result of multiplying a + * Vector3D object by a projection Matrix3D object, the w property can + * hold the transform value. The project() method then can + * complete the projection by dividing the elements by the + * w property. Use the Matrix3D.rawData + * property to create a projection Matrix3D object.

+ */ + public project():void + { + this.x /= this.w; + this.y /= this.w; + this.z /= this.w; + } + + /** + * Scales the current Vector3D object by a scalar, a magnitude. The + * Vector3D object's x, y, and z elements are multiplied by the scalar + * number specified in the parameter. For example, if the vector is + * scaled by ten, the result is a vector that is ten times longer. The + * scalar can also change the direction of the vector. Multiplying the + * vector by a negative number reverses its direction. + * + * @param s A multiplier (scalar) used to scale a Vector3D object. + + */ + public scaleBy(s:number):void + { + this.x *= s; + this.y *= s; + this.z *= s; + } + + /** + * Sets the members of Vector3D to the specified values + * + * @param xa The first element, such as the x coordinate. + * @param ya The second element, such as the y coordinate. + * @param za The third element, such as the z coordinate. + */ + public setTo(xa:number, ya:number, za:number):void + { + this.x = xa; + this.y = ya; + this.z = za; + } + + /** + * Subtracts the value of the x, y, and z elements of the current + * Vector3D object from the values of the x, y, and z elements of + * another Vector3D object. The subtract() method does not + * change the current Vector3D object. Instead, this method returns a + * new Vector3D object with the new values. + * + * @param a The Vector3D object to be subtracted from the current + * Vector3D object. + * @returns A new Vector3D object that is the difference between the + * current Vector3D and the specified Vector3D object. + * + * @see away.geom.Vector3D#decrementBy() + */ + public subtract(a:Vector3D):Vector3D + { + return new Vector3D(this.x - a.x, this.y - a.y, this.z - a.z); + } + + /** + * Returns a string representation of the current Vector3D object. The + * string contains the values of the x, y, and z properties. + */ + public toString():string + { + return "[Vector3D] (x:" + this.x + " ,y:" + this.y + ", z" + this.z + ", w:" + this.w + ")"; + } +} + +export = Vector3D; \ No newline at end of file diff --git a/lib/core/library/AssetLibrary.js b/lib/core/library/AssetLibrary.js new file mode 100755 index 00000000..d250ba59 --- /dev/null +++ b/lib/core/library/AssetLibrary.js @@ -0,0 +1,221 @@ +var AssetLibraryBundle = require("awayjs-core/lib/core/library/AssetLibraryBundle"); + +var AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); + +/** +* AssetLibrary enforces a singleton pattern and is not intended to be instanced. +* It's purpose is to allow access to the default library bundle through a set of static shortcut methods. +* If you are interested in creating multiple library bundles, please use the getBundle() method. +*/ +var AssetLibrary = (function () { + /** + * Creates a new AssetLibrary object. + * + */ + function AssetLibrary() { + } + //*/ + /** + * Returns an AssetLibrary bundle instance. If no key is given, returns the default bundle (which is + * similar to using the AssetLibraryBundle as a singleton). To keep several separated library bundles, + * pass a string key to this method to define which bundle should be returned. This is + * referred to as using the AssetLibraryBundle as a multiton. + * + * @param key Defines which multiton instance should be returned. + * @return An instance of the asset library + */ + AssetLibrary.getBundle = function (key) { + if (typeof key === "undefined") { key = 'default'; } + return AssetLibraryBundle.getInstance(key); + }; + + /** + * + */ + AssetLibrary.enableParser = function (parserClass) { + AssetLoader.enableParser(parserClass); + }; + + /** + * + */ + AssetLibrary.enableParsers = function (parserClasses) { + AssetLoader.enableParsers(parserClasses); + }; + + Object.defineProperty(AssetLibrary, "conflictStrategy", { + /** + * Short-hand for conflictStrategy property on default asset library bundle. + * + * @see AssetLibraryBundle.conflictStrategy + */ + get: function () { + return AssetLibrary.getBundle().conflictStrategy; + }, + set: function (val) { + AssetLibrary.getBundle().conflictStrategy = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLibrary, "conflictPrecedence", { + /** + * Short-hand for conflictPrecedence property on default asset library bundle. + * + * @see AssetLibraryBundle.conflictPrecedence + */ + get: function () { + return AssetLibrary.getBundle().conflictPrecedence; + }, + set: function (val) { + AssetLibrary.getBundle().conflictPrecedence = val; + }, + enumerable: true, + configurable: true + }); + + + /** + * Short-hand for createIterator() method on default asset library bundle. + * + * @see AssetLibraryBundle.createIterator() + */ + AssetLibrary.createIterator = function (assetTypeFilter, namespaceFilter, filterFunc) { + if (typeof assetTypeFilter === "undefined") { assetTypeFilter = null; } + if (typeof namespaceFilter === "undefined") { namespaceFilter = null; } + if (typeof filterFunc === "undefined") { filterFunc = null; } + return AssetLibrary.getBundle().createIterator(assetTypeFilter, namespaceFilter, filterFunc); + }; + + /** + * Short-hand for load() method on default asset library bundle. + * + * @see AssetLibraryBundle.load() + */ + AssetLibrary.load = function (req, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + return AssetLibrary.getBundle().load(req, context, ns, parser); + }; + + /** + * Short-hand for loadData() method on default asset library bundle. + * + * @see AssetLibraryBundle.loadData() + */ + AssetLibrary.loadData = function (data, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + return AssetLibrary.getBundle().loadData(data, context, ns, parser); + }; + + AssetLibrary.stopLoad = function () { + AssetLibrary.getBundle().stopAllLoadingSessions(); + }; + + /** + * Short-hand for getAsset() method on default asset library bundle. + * + * @see AssetLibraryBundle.getAsset() + */ + AssetLibrary.getAsset = function (name, ns) { + if (typeof ns === "undefined") { ns = null; } + return AssetLibrary.getBundle().getAsset(name, ns); + }; + + /** + * Short-hand for addEventListener() method on default asset library bundle. + */ + AssetLibrary.addEventListener = function (type, listener) { + AssetLibrary.getBundle().addEventListener(type, listener); + }; + + /** + * Short-hand for removeEventListener() method on default asset library bundle. + */ + AssetLibrary.removeEventListener = function (type, listener) { + AssetLibrary.getBundle().removeEventListener(type, listener); + }; + + /** + * Short-hand for hasEventListener() method on default asset library bundle. + + public static hasEventListener(type:string):boolean + { + return AssetLibrary.getBundle().hasEventListener(type); + } + + public static willTrigger(type:string):boolean + { + return getBundle().willTrigger(type); + } + */ + /** + * Short-hand for addAsset() method on default asset library bundle. + * + * @see AssetLibraryBundle.addAsset() + */ + AssetLibrary.addAsset = function (asset) { + AssetLibrary.getBundle().addAsset(asset); + }; + + /** + * Short-hand for removeAsset() method on default asset library bundle. + * + * @param asset The asset which should be removed from the library. + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAsset() + */ + AssetLibrary.removeAsset = function (asset, dispose) { + if (typeof dispose === "undefined") { dispose = true; } + AssetLibrary.getBundle().removeAsset(asset, dispose); + }; + + /** + * Short-hand for removeAssetByName() method on default asset library bundle. + * + * @param name The name of the asset to be removed. + * @param ns The namespace to which the desired asset belongs. + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAssetByName() + */ + AssetLibrary.removeAssetByName = function (name, ns, dispose) { + if (typeof ns === "undefined") { ns = null; } + if (typeof dispose === "undefined") { dispose = true; } + return AssetLibrary.getBundle().removeAssetByName(name, ns, dispose); + }; + + /** + * Short-hand for removeAllAssets() method on default asset library bundle. + * + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAllAssets() + */ + AssetLibrary.removeAllAssets = function (dispose) { + if (typeof dispose === "undefined") { dispose = true; } + AssetLibrary.getBundle().removeAllAssets(dispose); + }; + + /** + * Short-hand for removeNamespaceAssets() method on default asset library bundle. + * + * @see AssetLibraryBundle.removeNamespaceAssets() + */ + AssetLibrary.removeNamespaceAssets = function (ns, dispose) { + if (typeof ns === "undefined") { ns = null; } + if (typeof dispose === "undefined") { dispose = true; } + AssetLibrary.getBundle().removeNamespaceAssets(ns, dispose); + }; + return AssetLibrary; +})(); + +module.exports = AssetLibrary; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Bc3NldExpYnJhcnkudHMiXSwibmFtZXMiOlsiQXNzZXRMaWJyYXJ5IiwiQXNzZXRMaWJyYXJ5LmNvbnN0cnVjdG9yIiwiQXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSIsIkFzc2V0TGlicmFyeS5lbmFibGVQYXJzZXIiLCJBc3NldExpYnJhcnkuZW5hYmxlUGFyc2VycyIsIkFzc2V0TGlicmFyeS5jcmVhdGVJdGVyYXRvciIsIkFzc2V0TGlicmFyeS5sb2FkIiwiQXNzZXRMaWJyYXJ5LmxvYWREYXRhIiwiQXNzZXRMaWJyYXJ5LnN0b3BMb2FkIiwiQXNzZXRMaWJyYXJ5LmdldEFzc2V0IiwiQXNzZXRMaWJyYXJ5LmFkZEV2ZW50TGlzdGVuZXIiLCJBc3NldExpYnJhcnkucmVtb3ZlRXZlbnRMaXN0ZW5lciIsIkFzc2V0TGlicmFyeS5hZGRBc3NldCIsIkFzc2V0TGlicmFyeS5yZW1vdmVBc3NldCIsIkFzc2V0TGlicmFyeS5yZW1vdmVBc3NldEJ5TmFtZSIsIkFzc2V0TGlicmFyeS5yZW1vdmVBbGxBc3NldHMiLCJBc3NldExpYnJhcnkucmVtb3ZlTmFtZXNwYWNlQXNzZXRzIl0sIm1hcHBpbmdzIjoiQUFBQSxtRkFDd0Y7O0FBRXhGLHFFQUE0RTs7QUFPNUU7Ozs7RUFJRztBQUNIO0lBTUNBOzs7TUFER0E7SUFDSEE7SUFFQUMsQ0FBQ0E7SUFZREQsSUFWSUE7SUFDSkE7Ozs7Ozs7O01BUUdBOzZCQUNIQSxVQUF3QkEsR0FBc0JBO1FBQXRCRSxrQ0FBQUEsR0FBR0EsR0FBVUEsU0FBU0E7QUFBQUEsUUFFN0NBLE9BQU9BLGtCQUFrQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7SUFDM0NBLENBQUNBOztJQUtERjs7TUFER0E7Z0NBQ0hBLFVBQTJCQSxXQUFXQTtRQUVyQ0csV0FBV0EsQ0FBQ0EsWUFBWUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7SUFDdENBLENBQUNBOztJQUtESDs7TUFER0E7aUNBQ0hBLFVBQTRCQSxhQUEyQkE7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LEVBQUVBLE9BQXNCQTtRQUF4Q2dCLGlDQUFBQSxFQUFFQSxHQUFVQSxJQUFJQTtBQUFBQSxRQUFFQSxzQ0FBQUEsT0FBT0EsR0FBV0EsSUFBSUE7QUFBQUEsUUFFM0VBLFlBQVlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsRUFBRUEsRUFBRUEsT0FBT0EsQ0FBQ0E7SUFDNURBLENBQUNBO0lBQ0ZoQixvQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCw2QkFBc0IsQ0FBQSIsImZpbGUiOiJjb3JlL2xpYnJhcnkvQXNzZXRMaWJyYXJ5LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxSZXF1ZXN0XCIpO1xuaW1wb3J0IEFzc2V0TGlicmFyeUJ1bmRsZVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TGlicmFyeUJ1bmRsZVwiKTtcbmltcG9ydCBBc3NldExpYnJhcnlJdGVyYXRvclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TGlicmFyeUl0ZXJhdG9yXCIpO1xuaW1wb3J0IEFzc2V0TG9hZGVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TG9hZGVyXCIpO1xuaW1wb3J0IEFzc2V0TG9hZGVyQ29udGV4dFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TG9hZGVyQ29udGV4dFwiKTtcbmltcG9ydCBBc3NldExvYWRlclRva2VuXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldExvYWRlclRva2VuXCIpO1xuaW1wb3J0IENvbmZsaWN0U3RyYXRlZ3lCYXNlXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQ29uZmxpY3RTdHJhdGVneUJhc2VcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFBhcnNlckJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlckJhc2VcIik7XG5cbi8qKlxuICogQXNzZXRMaWJyYXJ5IGVuZm9yY2VzIGEgc2luZ2xldG9uIHBhdHRlcm4gYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW5jZWQuXG4gKiBJdCdzIHB1cnBvc2UgaXMgdG8gYWxsb3cgYWNjZXNzIHRvIHRoZSBkZWZhdWx0IGxpYnJhcnkgYnVuZGxlIHRocm91Z2ggYSBzZXQgb2Ygc3RhdGljIHNob3J0Y3V0IG1ldGhvZHMuXG4gKiBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gY3JlYXRpbmcgbXVsdGlwbGUgbGlicmFyeSBidW5kbGVzLCBwbGVhc2UgdXNlIHRoZSA8Y29kZT5nZXRCdW5kbGUoKTwvY29kZT4gbWV0aG9kLlxuICovXG5jbGFzcyBBc3NldExpYnJhcnlcbntcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+QXNzZXRMaWJyYXJ5PC9jb2RlPiBvYmplY3QuXG5cdCAqXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0fVxuXG5cdC8vKi9cblx0LyoqXG5cdCAqIFJldHVybnMgYW4gQXNzZXRMaWJyYXJ5IGJ1bmRsZSBpbnN0YW5jZS4gSWYgbm8ga2V5IGlzIGdpdmVuLCByZXR1cm5zIHRoZSBkZWZhdWx0IGJ1bmRsZSAod2hpY2ggaXNcblx0ICogc2ltaWxhciB0byB1c2luZyB0aGUgQXNzZXRMaWJyYXJ5QnVuZGxlIGFzIGEgc2luZ2xldG9uKS4gVG8ga2VlcCBzZXZlcmFsIHNlcGFyYXRlZCBsaWJyYXJ5IGJ1bmRsZXMsXG5cdCAqIHBhc3MgYSBzdHJpbmcga2V5IHRvIHRoaXMgbWV0aG9kIHRvIGRlZmluZSB3aGljaCBidW5kbGUgc2hvdWxkIGJlIHJldHVybmVkLiBUaGlzIGlzXG5cdCAqIHJlZmVycmVkIHRvIGFzIHVzaW5nIHRoZSBBc3NldExpYnJhcnlCdW5kbGUgYXMgYSBtdWx0aXRvbi5cblx0ICpcblx0ICogQHBhcmFtIGtleSBEZWZpbmVzIHdoaWNoIG11bHRpdG9uIGluc3RhbmNlIHNob3VsZCBiZSByZXR1cm5lZC5cblx0ICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB0aGUgYXNzZXQgbGlicmFyeVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRCdW5kbGUoa2V5OnN0cmluZyA9ICdkZWZhdWx0Jyk6QXNzZXRMaWJyYXJ5QnVuZGxlXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRMaWJyYXJ5QnVuZGxlLmdldEluc3RhbmNlKGtleSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZW5hYmxlUGFyc2VyKHBhcnNlckNsYXNzKVxuXHR7XG5cdFx0QXNzZXRMb2FkZXIuZW5hYmxlUGFyc2VyKHBhcnNlckNsYXNzKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBlbmFibGVQYXJzZXJzKHBhcnNlckNsYXNzZXM6QXJyYXk8T2JqZWN0Pilcblx0e1xuXHRcdEFzc2V0TG9hZGVyLmVuYWJsZVBhcnNlcnMocGFyc2VyQ2xhc3Nlcyk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvcnQtaGFuZCBmb3IgY29uZmxpY3RTdHJhdGVneSBwcm9wZXJ0eSBvbiBkZWZhdWx0IGFzc2V0IGxpYnJhcnkgYnVuZGxlLlxuXHQgKlxuXHQgKiBAc2VlIEFzc2V0TGlicmFyeUJ1bmRsZS5jb25mbGljdFN0cmF0ZWd5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldCBjb25mbGljdFN0cmF0ZWd5KCk6Q29uZmxpY3RTdHJhdGVneUJhc2Vcblx0e1xuXHRcdHJldHVybiBBc3NldExpYnJhcnkuZ2V0QnVuZGxlKCkuY29uZmxpY3RTdHJhdGVneTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgc2V0IGNvbmZsaWN0U3RyYXRlZ3kodmFsOkNvbmZsaWN0U3RyYXRlZ3lCYXNlKVxuXHR7XG5cdFx0QXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLmNvbmZsaWN0U3RyYXRlZ3kgPSB2YWw7XG5cdH1cblxuXHQvKipcblx0ICogU2hvcnQtaGFuZCBmb3IgY29uZmxpY3RQcmVjZWRlbmNlIHByb3BlcnR5IG9uIGRlZmF1bHQgYXNzZXQgbGlicmFyeSBidW5kbGUuXG5cdCAqXG5cdCAqIEBzZWUgQXNzZXRMaWJyYXJ5QnVuZGxlLmNvbmZsaWN0UHJlY2VkZW5jZVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXQgY29uZmxpY3RQcmVjZWRlbmNlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLmNvbmZsaWN0UHJlY2VkZW5jZTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgc2V0IGNvbmZsaWN0UHJlY2VkZW5jZSh2YWw6c3RyaW5nKVxuXHR7XG5cdFx0QXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLmNvbmZsaWN0UHJlY2VkZW5jZSA9IHZhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG9ydC1oYW5kIGZvciBjcmVhdGVJdGVyYXRvcigpIG1ldGhvZCBvbiBkZWZhdWx0IGFzc2V0IGxpYnJhcnkgYnVuZGxlLlxuXHQgKlxuXHQgKiBAc2VlIEFzc2V0TGlicmFyeUJ1bmRsZS5jcmVhdGVJdGVyYXRvcigpXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGNyZWF0ZUl0ZXJhdG9yKGFzc2V0VHlwZUZpbHRlcjpzdHJpbmcgPSBudWxsLCBuYW1lc3BhY2VGaWx0ZXI6c3RyaW5nID0gbnVsbCwgZmlsdGVyRnVuYyA9IG51bGwpOkFzc2V0TGlicmFyeUl0ZXJhdG9yXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLmNyZWF0ZUl0ZXJhdG9yKGFzc2V0VHlwZUZpbHRlciwgbmFtZXNwYWNlRmlsdGVyLCBmaWx0ZXJGdW5jKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG9ydC1oYW5kIGZvciBsb2FkKCkgbWV0aG9kIG9uIGRlZmF1bHQgYXNzZXQgbGlicmFyeSBidW5kbGUuXG5cdCAqXG5cdCAqIEBzZWUgQXNzZXRMaWJyYXJ5QnVuZGxlLmxvYWQoKVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBsb2FkKHJlcTpVUkxSZXF1ZXN0LCBjb250ZXh0OkFzc2V0TG9hZGVyQ29udGV4dCA9IG51bGwsIG5zOnN0cmluZyA9IG51bGwsIHBhcnNlcjpQYXJzZXJCYXNlID0gbnVsbCk6QXNzZXRMb2FkZXJUb2tlblxuXHR7XG5cdFx0cmV0dXJuIEFzc2V0TGlicmFyeS5nZXRCdW5kbGUoKS5sb2FkKHJlcSwgY29udGV4dCwgbnMsIHBhcnNlcik7XG5cdH1cblxuXHQvKipcblx0ICogU2hvcnQtaGFuZCBmb3IgbG9hZERhdGEoKSBtZXRob2Qgb24gZGVmYXVsdCBhc3NldCBsaWJyYXJ5IGJ1bmRsZS5cblx0ICpcblx0ICogQHNlZSBBc3NldExpYnJhcnlCdW5kbGUubG9hZERhdGEoKVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBsb2FkRGF0YShkYXRhOmFueSwgY29udGV4dDpBc3NldExvYWRlckNvbnRleHQgPSBudWxsLCBuczpzdHJpbmcgPSBudWxsLCBwYXJzZXI6UGFyc2VyQmFzZSA9IG51bGwpOkFzc2V0TG9hZGVyVG9rZW5cblx0e1xuXHRcdHJldHVybiBBc3NldExpYnJhcnkuZ2V0QnVuZGxlKCkubG9hZERhdGEoZGF0YSwgY29udGV4dCwgbnMsIHBhcnNlcik7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHN0b3BMb2FkKClcblx0e1xuXHRcdEFzc2V0TGlicmFyeS5nZXRCdW5kbGUoKS5zdG9wQWxsTG9hZGluZ1Nlc3Npb25zKCk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvcnQtaGFuZCBmb3IgZ2V0QXNzZXQoKSBtZXRob2Qgb24gZGVmYXVsdCBhc3NldCBsaWJyYXJ5IGJ1bmRsZS5cblx0ICpcblx0ICogQHNlZSBBc3NldExpYnJhcnlCdW5kbGUuZ2V0QXNzZXQoKVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRBc3NldChuYW1lOnN0cmluZywgbnM6c3RyaW5nID0gbnVsbCk6SUFzc2V0XG5cdHtcblx0XHRyZXR1cm4gQXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLmdldEFzc2V0KG5hbWUsIG5zKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG9ydC1oYW5kIGZvciBhZGRFdmVudExpc3RlbmVyKCkgbWV0aG9kIG9uIGRlZmF1bHQgYXNzZXQgbGlicmFyeSBidW5kbGUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uKVxuXHR7XG5cdFx0QXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3J0LWhhbmQgZm9yIHJlbW92ZUV2ZW50TGlzdGVuZXIoKSBtZXRob2Qgb24gZGVmYXVsdCBhc3NldCBsaWJyYXJ5IGJ1bmRsZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZywgbGlzdGVuZXI6RnVuY3Rpb24pXG5cdHtcblx0XHRBc3NldExpYnJhcnkuZ2V0QnVuZGxlKCkucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG5cdH1cblxuXHQvKipcblx0ICogU2hvcnQtaGFuZCBmb3IgaGFzRXZlbnRMaXN0ZW5lcigpIG1ldGhvZCBvbiBkZWZhdWx0IGFzc2V0IGxpYnJhcnkgYnVuZGxlLlxuXG5cdCBwdWJsaWMgc3RhdGljIGhhc0V2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcpOmJvb2xlYW5cblx0IHtcblx0XHRyZXR1cm4gQXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLmhhc0V2ZW50TGlzdGVuZXIodHlwZSk7XG5cdH1cblxuXHQgcHVibGljIHN0YXRpYyB3aWxsVHJpZ2dlcih0eXBlOnN0cmluZyk6Ym9vbGVhblxuXHQge1xuXHRcdHJldHVybiBnZXRCdW5kbGUoKS53aWxsVHJpZ2dlcih0eXBlKTtcblx0fVxuXHQgKi9cblxuXHQvKipcblx0ICogU2hvcnQtaGFuZCBmb3IgYWRkQXNzZXQoKSBtZXRob2Qgb24gZGVmYXVsdCBhc3NldCBsaWJyYXJ5IGJ1bmRsZS5cblx0ICpcblx0ICogQHNlZSBBc3NldExpYnJhcnlCdW5kbGUuYWRkQXNzZXQoKVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBhZGRBc3NldChhc3NldDpJQXNzZXQpXG5cdHtcblx0XHRBc3NldExpYnJhcnkuZ2V0QnVuZGxlKCkuYWRkQXNzZXQoYXNzZXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNob3J0LWhhbmQgZm9yIHJlbW92ZUFzc2V0KCkgbWV0aG9kIG9uIGRlZmF1bHQgYXNzZXQgbGlicmFyeSBidW5kbGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBhc3NldCBUaGUgYXNzZXQgd2hpY2ggc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlicmFyeS5cblx0ICogQHBhcmFtIGRpc3Bvc2UgRGVmaW5lcyB3aGV0aGVyIHRoZSBhc3NldHMgc2hvdWxkIGFsc28gYmUgZGlzcG9zZWQuXG5cdCAqXG5cdCAqIEBzZWUgQXNzZXRMaWJyYXJ5QnVuZGxlLnJlbW92ZUFzc2V0KClcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgcmVtb3ZlQXNzZXQoYXNzZXQ6SUFzc2V0LCBkaXNwb3NlOmJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0QXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLnJlbW92ZUFzc2V0KGFzc2V0LCBkaXNwb3NlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaG9ydC1oYW5kIGZvciByZW1vdmVBc3NldEJ5TmFtZSgpIG1ldGhvZCBvbiBkZWZhdWx0IGFzc2V0IGxpYnJhcnkgYnVuZGxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXNzZXQgdG8gYmUgcmVtb3ZlZC5cblx0ICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UgdG8gd2hpY2ggdGhlIGRlc2lyZWQgYXNzZXQgYmVsb25ncy5cblx0ICogQHBhcmFtIGRpc3Bvc2UgRGVmaW5lcyB3aGV0aGVyIHRoZSBhc3NldHMgc2hvdWxkIGFsc28gYmUgZGlzcG9zZWQuXG5cdCAqXG5cdCAqIEBzZWUgQXNzZXRMaWJyYXJ5QnVuZGxlLnJlbW92ZUFzc2V0QnlOYW1lKClcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgcmVtb3ZlQXNzZXRCeU5hbWUobmFtZTpzdHJpbmcsIG5zOnN0cmluZyA9IG51bGwsIGRpc3Bvc2U6Ym9vbGVhbiA9IHRydWUpOklBc3NldFxuXHR7XG5cdFx0cmV0dXJuIEFzc2V0TGlicmFyeS5nZXRCdW5kbGUoKS5yZW1vdmVBc3NldEJ5TmFtZShuYW1lLCBucywgZGlzcG9zZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvcnQtaGFuZCBmb3IgcmVtb3ZlQWxsQXNzZXRzKCkgbWV0aG9kIG9uIGRlZmF1bHQgYXNzZXQgbGlicmFyeSBidW5kbGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBkaXNwb3NlIERlZmluZXMgd2hldGhlciB0aGUgYXNzZXRzIHNob3VsZCBhbHNvIGJlIGRpc3Bvc2VkLlxuXHQgKlxuXHQgKiBAc2VlIEFzc2V0TGlicmFyeUJ1bmRsZS5yZW1vdmVBbGxBc3NldHMoKVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyByZW1vdmVBbGxBc3NldHMoZGlzcG9zZTpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdEFzc2V0TGlicmFyeS5nZXRCdW5kbGUoKS5yZW1vdmVBbGxBc3NldHMoZGlzcG9zZSk7XG5cdH1cblxuXHQvKipcblx0ICogU2hvcnQtaGFuZCBmb3IgcmVtb3ZlTmFtZXNwYWNlQXNzZXRzKCkgbWV0aG9kIG9uIGRlZmF1bHQgYXNzZXQgbGlicmFyeSBidW5kbGUuXG5cdCAqXG5cdCAqIEBzZWUgQXNzZXRMaWJyYXJ5QnVuZGxlLnJlbW92ZU5hbWVzcGFjZUFzc2V0cygpXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHJlbW92ZU5hbWVzcGFjZUFzc2V0cyhuczpzdHJpbmcgPSBudWxsLCBkaXNwb3NlOmJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0QXNzZXRMaWJyYXJ5LmdldEJ1bmRsZSgpLnJlbW92ZU5hbWVzcGFjZUFzc2V0cyhucywgZGlzcG9zZSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gQXNzZXRMaWJyYXJ5OyJdfQ== \ No newline at end of file diff --git a/lib/core/library/AssetLibrary.ts b/lib/core/library/AssetLibrary.ts new file mode 100644 index 00000000..6e31b0f8 --- /dev/null +++ b/lib/core/library/AssetLibrary.ts @@ -0,0 +1,222 @@ +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import AssetLibraryBundle = require("awayjs-core/lib/core/library/AssetLibraryBundle"); +import AssetLibraryIterator = require("awayjs-core/lib/core/library/AssetLibraryIterator"); +import AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); +import AssetLoaderContext = require("awayjs-core/lib/core/library/AssetLoaderContext"); +import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); +import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + +/** + * AssetLibrary enforces a singleton pattern and is not intended to be instanced. + * It's purpose is to allow access to the default library bundle through a set of static shortcut methods. + * If you are interested in creating multiple library bundles, please use the getBundle() method. + */ +class AssetLibrary +{ + /** + * Creates a new AssetLibrary object. + * + */ + constructor() + { + } + + //*/ + /** + * Returns an AssetLibrary bundle instance. If no key is given, returns the default bundle (which is + * similar to using the AssetLibraryBundle as a singleton). To keep several separated library bundles, + * pass a string key to this method to define which bundle should be returned. This is + * referred to as using the AssetLibraryBundle as a multiton. + * + * @param key Defines which multiton instance should be returned. + * @return An instance of the asset library + */ + public static getBundle(key:string = 'default'):AssetLibraryBundle + { + return AssetLibraryBundle.getInstance(key); + } + + /** + * + */ + public static enableParser(parserClass) + { + AssetLoader.enableParser(parserClass); + } + + /** + * + */ + public static enableParsers(parserClasses:Array) + { + AssetLoader.enableParsers(parserClasses); + } + + /** + * Short-hand for conflictStrategy property on default asset library bundle. + * + * @see AssetLibraryBundle.conflictStrategy + */ + public static get conflictStrategy():ConflictStrategyBase + { + return AssetLibrary.getBundle().conflictStrategy; + } + + public static set conflictStrategy(val:ConflictStrategyBase) + { + AssetLibrary.getBundle().conflictStrategy = val; + } + + /** + * Short-hand for conflictPrecedence property on default asset library bundle. + * + * @see AssetLibraryBundle.conflictPrecedence + */ + public static get conflictPrecedence():string + { + return AssetLibrary.getBundle().conflictPrecedence; + } + + public static set conflictPrecedence(val:string) + { + AssetLibrary.getBundle().conflictPrecedence = val; + } + + /** + * Short-hand for createIterator() method on default asset library bundle. + * + * @see AssetLibraryBundle.createIterator() + */ + public static createIterator(assetTypeFilter:string = null, namespaceFilter:string = null, filterFunc = null):AssetLibraryIterator + { + return AssetLibrary.getBundle().createIterator(assetTypeFilter, namespaceFilter, filterFunc); + } + + /** + * Short-hand for load() method on default asset library bundle. + * + * @see AssetLibraryBundle.load() + */ + public static load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken + { + return AssetLibrary.getBundle().load(req, context, ns, parser); + } + + /** + * Short-hand for loadData() method on default asset library bundle. + * + * @see AssetLibraryBundle.loadData() + */ + public static loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken + { + return AssetLibrary.getBundle().loadData(data, context, ns, parser); + } + + public static stopLoad() + { + AssetLibrary.getBundle().stopAllLoadingSessions(); + } + + /** + * Short-hand for getAsset() method on default asset library bundle. + * + * @see AssetLibraryBundle.getAsset() + */ + public static getAsset(name:string, ns:string = null):IAsset + { + return AssetLibrary.getBundle().getAsset(name, ns); + } + + /** + * Short-hand for addEventListener() method on default asset library bundle. + */ + public static addEventListener(type:string, listener:Function) + { + AssetLibrary.getBundle().addEventListener(type, listener); + } + + /** + * Short-hand for removeEventListener() method on default asset library bundle. + */ + public static removeEventListener(type:string, listener:Function) + { + AssetLibrary.getBundle().removeEventListener(type, listener); + } + + /** + * Short-hand for hasEventListener() method on default asset library bundle. + + public static hasEventListener(type:string):boolean + { + return AssetLibrary.getBundle().hasEventListener(type); + } + + public static willTrigger(type:string):boolean + { + return getBundle().willTrigger(type); + } + */ + + /** + * Short-hand for addAsset() method on default asset library bundle. + * + * @see AssetLibraryBundle.addAsset() + */ + public static addAsset(asset:IAsset) + { + AssetLibrary.getBundle().addAsset(asset); + } + + /** + * Short-hand for removeAsset() method on default asset library bundle. + * + * @param asset The asset which should be removed from the library. + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAsset() + */ + public static removeAsset(asset:IAsset, dispose:boolean = true) + { + AssetLibrary.getBundle().removeAsset(asset, dispose); + } + + /** + * Short-hand for removeAssetByName() method on default asset library bundle. + * + * @param name The name of the asset to be removed. + * @param ns The namespace to which the desired asset belongs. + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAssetByName() + */ + public static removeAssetByName(name:string, ns:string = null, dispose:boolean = true):IAsset + { + return AssetLibrary.getBundle().removeAssetByName(name, ns, dispose); + } + + /** + * Short-hand for removeAllAssets() method on default asset library bundle. + * + * @param dispose Defines whether the assets should also be disposed. + * + * @see AssetLibraryBundle.removeAllAssets() + */ + public static removeAllAssets(dispose:boolean = true) + { + AssetLibrary.getBundle().removeAllAssets(dispose); + } + + /** + * Short-hand for removeNamespaceAssets() method on default asset library bundle. + * + * @see AssetLibraryBundle.removeNamespaceAssets() + */ + public static removeNamespaceAssets(ns:string = null, dispose:boolean = true) + { + AssetLibrary.getBundle().removeNamespaceAssets(ns, dispose); + } +} + +export = AssetLibrary; \ No newline at end of file diff --git a/lib/core/library/AssetLibraryBundle.js b/lib/core/library/AssetLibraryBundle.js new file mode 100755 index 00000000..c5642ab9 --- /dev/null +++ b/lib/core/library/AssetLibraryBundle.js @@ -0,0 +1,595 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetLibraryIterator = require("awayjs-core/lib/core/library/AssetLibraryIterator"); +var AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); + +var ConflictPrecedence = require("awayjs-core/lib/core/library/ConflictPrecedence"); +var ConflictStrategy = require("awayjs-core/lib/core/library/ConflictStrategy"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var Error = require("awayjs-core/lib/errors/Error"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); + +/** +* AssetLibraryBundle enforces a multiton pattern and is not intended to be instanced directly. +* Its purpose is to create a container for 3D data management, both before and after parsing. +* If you are interested in creating multiple library bundles, please use the getInstance() method. +*/ +var AssetLibraryBundle = (function (_super) { + __extends(AssetLibraryBundle, _super); + /** + * Creates a new AssetLibraryBundle object. + * + * @param me A multiton enforcer for the AssetLibraryBundle ensuring it cannnot be instanced. + */ + function AssetLibraryBundle() { + var _this = this; + _super.call(this); + this._loadingSessionsGarbage = new Array(); + + this._assets = new Array(); //new Vector.; + this._assetDictionary = new Object(); + this._loadingSessions = new Array(); + + this.conflictStrategy = ConflictStrategy.IGNORE.create(); + this.conflictPrecedence = ConflictPrecedence.FAVOR_NEW; + + this._onAssetRenameDelegate = function (event) { + return _this.onAssetRename(event); + }; + this._onAssetConflictResolvedDelegate = function (event) { + return _this.onAssetConflictResolved(event); + }; + this._onResourceCompleteDelegate = function (event) { + return _this.onResourceComplete(event); + }; + this._onTextureSizeErrorDelegate = function (event) { + return _this.onTextureSizeError(event); + }; + this._onAssetCompleteDelegate = function (event) { + return _this.onAssetComplete(event); + }; + this._onLoadErrorDelegate = function (event) { + return _this.onLoadError(event); + }; + this._onParseErrorDelegate = function (event) { + return _this.onParseError(event); + }; + } + /** + * Returns an AssetLibraryBundle instance. If no key is given, returns the default bundle instance (which is + * similar to using the AssetLibraryBundle as a singleton.) To keep several separated library bundles, + * pass a string key to this method to define which bundle should be returned. This is + * referred to as using the AssetLibrary as a multiton. + * + * @param key Defines which multiton instance should be returned. + * @return An instance of the asset library + */ + AssetLibraryBundle.getInstance = function (key) { + if (typeof key === "undefined") { key = 'default'; } + if (!key) + key = 'default'; + + if (!AssetLibraryBundle._iInstances.hasOwnProperty(key)) + AssetLibraryBundle._iInstances[key] = new AssetLibraryBundle(); + + return AssetLibraryBundle._iInstances[key]; + }; + + /** + * + */ + AssetLibraryBundle.prototype.enableParser = function (parserClass) { + AssetLoader.enableParser(parserClass); + }; + + /** + * + */ + AssetLibraryBundle.prototype.enableParsers = function (parserClasses) { + AssetLoader.enableParsers(parserClasses); + }; + + Object.defineProperty(AssetLibraryBundle.prototype, "conflictStrategy", { + /** + * Defines which strategy should be used for resolving naming conflicts, when two library + * assets are given the same name. By default, ConflictStrategy.APPEND_NUM_SUFFIX + * is used which means that a numeric suffix is appended to one of the assets. The + * conflictPrecedence property defines which of the two conflicting assets will + * be renamed. + * + * @see naming.ConflictStrategy + * @see AssetLibrary.conflictPrecedence + */ + get: function () { + return this._strategy; + }, + set: function (val) { + if (!val) + throw new Error('namingStrategy must not be null. To ignore naming, use AssetLibrary.IGNORE'); + + this._strategy = val.create(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLibraryBundle.prototype, "conflictPrecedence", { + /** + * Defines which asset should have precedence when resolving a naming conflict between + * two assets of which one has just been renamed by the user or by a parser. By default + * ConflictPrecedence.FAVOR_NEW is used, meaning that the newly renamed + * asset will keep it's new name while the older asset gets renamed to not conflict. + * + * This property is ignored for conflict strategies that do not actually rename an + * asset automatically, such as ConflictStrategy.IGNORE and ConflictStrategy.THROW_ERROR. + * + * @see away.library.ConflictPrecedence + * @see away.library.ConflictStrategy + */ + get: function () { + return this._strategyPreference; + }, + set: function (val) { + this._strategyPreference = val; + }, + enumerable: true, + configurable: true + }); + + + /** + * Create an AssetLibraryIterator instance that can be used to iterate over the assets + * in this asset library instance. The iterator can filter assets on asset type and/or + * namespace. A "null" filter value means no filter of that type is used. + * + * @param assetTypeFilter Asset type to filter on (from the AssetType enum class.) Use + * null to not filter on asset type. + * @param namespaceFilter Namespace to filter on. Use null to not filter on namespace. + * @param filterFunc Callback function to use when deciding whether an asset should be + * included in the iteration or not. This needs to be a function that takes a single + * parameter of type IAsset and returns a boolean where true means it should be included. + * + * @see away.library.AssetType + */ + AssetLibraryBundle.prototype.createIterator = function (assetTypeFilter, namespaceFilter, filterFunc) { + if (typeof assetTypeFilter === "undefined") { assetTypeFilter = null; } + if (typeof namespaceFilter === "undefined") { namespaceFilter = null; } + if (typeof filterFunc === "undefined") { filterFunc = null; } + return new AssetLibraryIterator(this._assets, assetTypeFilter, namespaceFilter, filterFunc); + }; + + /** + * Loads a file and (optionally) all of its dependencies. + * + * @param req The URLRequest object containing the URL of the file to be loaded. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + * @return A handle to the retrieved resource. + */ + AssetLibraryBundle.prototype.load = function (req, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + var loader = new AssetLoader(); + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + this._loadingSessions.push(loader); + + loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + loader._iAddErrorHandler(this._onLoadErrorDelegate); + loader._iAddParseErrorHandler(this._onParseErrorDelegate); + + return loader.load(req, context, ns, parser); + }; + + /** + * Loads a resource from existing data in memory. + * + * @param data The data object containing all resource information. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + * @return A handle to the retrieved resource. + */ + AssetLibraryBundle.prototype.loadData = function (data, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + var loader = new AssetLoader(); + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + this._loadingSessions.push(loader); + + loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + loader._iAddErrorHandler(this._onLoadErrorDelegate); + loader._iAddParseErrorHandler(this._onParseErrorDelegate); + + return loader.loadData(data, '', context, ns, parser); + }; + + /** + * + */ + AssetLibraryBundle.prototype.getAsset = function (name, ns) { + //var asset : IAsset; + if (typeof ns === "undefined") { ns = null; } + if (this._assetDictDirty) + this.rehashAssetDict(); + + if (ns == null) + ns = NamedAssetBase.DEFAULT_NAMESPACE; + + if (!this._assetDictionary.hasOwnProperty(ns)) + return null; + + return this._assetDictionary[ns][name]; + }; + + /** + * Adds an asset to the asset library, first making sure that it's name is unique + * using the method defined by the conflictStrategy and + * conflictPrecedence properties. + */ + AssetLibraryBundle.prototype.addAsset = function (asset) { + var ns; + var old; + + // Bail if asset has already been added. + if (this._assets.indexOf(asset) >= 0) + return; + + old = this.getAsset(asset.name, asset.assetNamespace); + ns = asset.assetNamespace || NamedAssetBase.DEFAULT_NAMESPACE; + + if (old != null) + this._strategy.resolveConflict(asset, old, this._assetDictionary[ns], this._strategyPreference); + + //create unique-id (for now this is used in AwayBuilder only + //asset.id = IDUtil.createUID(); + // Add it + this._assets.push(asset); + + if (!this._assetDictionary.hasOwnProperty(ns)) + this._assetDictionary[ns] = new Object(); + + this._assetDictionary[ns][asset.name] = asset; + + asset.addEventListener(AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); + asset.addEventListener(AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); + }; + + /** + * Removes an asset from the library, and optionally disposes that asset by calling + * it's disposeAsset() method (which for most assets is implemented as a default + * version of that type's dispose() method. + * + * @param asset The asset which should be removed from this library. + * @param dispose Defines whether the assets should also be disposed. + */ + AssetLibraryBundle.prototype.removeAsset = function (asset, dispose) { + if (typeof dispose === "undefined") { dispose = true; } + var idx; + + this.removeAssetFromDict(asset); + + asset.removeEventListener(AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); + asset.removeEventListener(AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); + + idx = this._assets.indexOf(asset); + + if (idx >= 0) + this._assets.splice(idx, 1); + + if (dispose) + asset.dispose(); + }; + + /** + * Removes an asset which is specified using name and namespace. + * + * @param name The name of the asset to be removed. + * @param ns The namespace to which the desired asset belongs. + * @param dispose Defines whether the assets should also be disposed. + * + * @see away.library.AssetLibrary.removeAsset() + */ + AssetLibraryBundle.prototype.removeAssetByName = function (name, ns, dispose) { + if (typeof ns === "undefined") { ns = null; } + if (typeof dispose === "undefined") { dispose = true; } + var asset = this.getAsset(name, ns); + + if (asset) + this.removeAsset(asset, dispose); + + return asset; + }; + + /** + * Removes all assets from the asset library, optionally disposing them as they + * are removed. + * + * @param dispose Defines whether the assets should also be disposed. + */ + AssetLibraryBundle.prototype.removeAllAssets = function (dispose) { + if (typeof dispose === "undefined") { dispose = true; } + if (dispose) { + var asset; + + for (var c = 0; c < this._assets.length; c++) { + asset = this._assets[c]; + asset.dispose(); + } + /* + for each (asset in _assets) + asset.dispose(); + */ + } + + this._assets.length = 0; + this.rehashAssetDict(); + }; + + /** + * Removes all assets belonging to a particular namespace (null for default) + * from the asset library, and optionall disposes them by calling their + * disposeAsset() method. + * + * @param ns The namespace from which all assets should be removed. + * @param dispose Defines whether the assets should also be disposed. + * + * @see away.library.AssetLibrary.removeAsset() + */ + AssetLibraryBundle.prototype.removeNamespaceAssets = function (ns, dispose) { + if (typeof ns === "undefined") { ns = null; } + if (typeof dispose === "undefined") { dispose = true; } + var idx = 0; + var asset; + var old_assets; + + // Empty the assets vector after having stored a copy of it. + // The copy will be filled with all assets which weren't removed. + old_assets = this._assets.concat(); + this._assets.length = 0; + + if (ns == null) + ns = NamedAssetBase.DEFAULT_NAMESPACE; + + for (var d = 0; d < old_assets.length; d++) { + asset = old_assets[d]; + + // Remove from dict if in the supplied namespace. If not, + // transfer over to the new vector. + if (asset.assetNamespace == ns) { + if (dispose) + asset.dispose(); + + // Remove asset from dictionary, but don't try to auto-remove + // the namespace, which will trigger an unnecessarily expensive + // test that is not needed since we know that the namespace + // will be empty when loop finishes. + this.removeAssetFromDict(asset, false); + } else { + this._assets[idx++] = asset; + } + } + + /* + for each (asset in old_assets) { + // Remove from dict if in the supplied namespace. If not, + // transfer over to the new vector. + if (asset.assetNamespace == ns) { + if (dispose) + asset.dispose(); + + // Remove asset from dictionary, but don't try to auto-remove + // the namespace, which will trigger an unnecessarily expensive + // test that is not needed since we know that the namespace + // will be empty when loop finishes. + removeAssetFromDict(asset, false); + } else + _assets[idx++] = asset; + + } + */ + // Remove empty namespace + if (this._assetDictionary.hasOwnProperty(ns)) + delete this._assetDictionary[ns]; + }; + + AssetLibraryBundle.prototype.removeAssetFromDict = function (asset, autoRemoveEmptyNamespace) { + if (typeof autoRemoveEmptyNamespace === "undefined") { autoRemoveEmptyNamespace = true; } + if (this._assetDictDirty) + this.rehashAssetDict(); + + if (this._assetDictionary.hasOwnProperty(asset.assetNamespace)) { + if (this._assetDictionary[asset.assetNamespace].hasOwnProperty(asset.name)) + delete this._assetDictionary[asset.assetNamespace][asset.name]; + + if (autoRemoveEmptyNamespace) { + var key; + var empty = true; + + for (key in this._assetDictionary[asset.assetNamespace]) { + empty = false; + break; + } + + if (empty) + delete this._assetDictionary[asset.assetNamespace]; + } + } + }; + + AssetLibraryBundle.prototype.stopAllLoadingSessions = function () { + var i; + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + var length = this._loadingSessions.length; + + for (i = 0; i < length; i++) + this.killLoadingSession(this._loadingSessions[i]); + + this._loadingSessions = null; + }; + + AssetLibraryBundle.prototype.rehashAssetDict = function () { + var asset; + + this._assetDictionary = {}; + + var l = this._assets.length; + + for (var c = 0; c < l; c++) { + asset = this._assets[c]; + + if (!this._assetDictionary.hasOwnProperty(asset.assetNamespace)) + this._assetDictionary[asset.assetNamespace] = {}; + + this._assetDictionary[asset.assetNamespace][asset.name] = asset; + } + + this._assetDictDirty = false; + }; + + /** + * Called when a an error occurs during loading. + */ + AssetLibraryBundle.prototype.onLoadError = function (event) { + if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + }; + + /** + * Called when a an error occurs during parsing. + */ + AssetLibraryBundle.prototype.onParseError = function (event) { + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + }; + + AssetLibraryBundle.prototype.onAssetComplete = function (event) { + // Only add asset to library the first time. + if (event.type == AssetEvent.ASSET_COMPLETE) + this.addAsset(event.asset); + + this.dispatchEvent(event); + }; + + AssetLibraryBundle.prototype.onTextureSizeError = function (event) { + this.dispatchEvent(event); + }; + + /** + * Called when the resource and all of its dependencies was retrieved. + */ + AssetLibraryBundle.prototype.onResourceComplete = function (event) { + var _this = this; + var loader = event.target; + + this.dispatchEvent(event); + + var index = this._loadingSessions.indexOf(loader); + this._loadingSessions.splice(index, 1); + + // Add loader to a garbage array - for a collection sweep and kill + this._loadingSessionsGarbage.push(loader); + this._gcTimeoutIID = setTimeout(function () { + _this.loadingSessionGC(); + }, 100); + }; + + AssetLibraryBundle.prototype.loadingSessionGC = function () { + var loader; + + while (this._loadingSessionsGarbage.length > 0) { + loader = this._loadingSessionsGarbage.pop(); + this.killLoadingSession(loader); + } + + clearTimeout(this._gcTimeoutIID); + this._gcTimeoutIID = null; + }; + + AssetLibraryBundle.prototype.killLoadingSession = function (loader) { + loader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + loader.stop(); + }; + + /** + * Called when unespected error occurs + */ + /* + private onResourceError() : void + { + var msg:string = "Unexpected parser error"; + if(hasEventListener(LoaderEvent.DEPENDENCY_ERROR)){ + var re:LoaderEvent = new LoaderEvent(LoaderEvent.DEPENDENCY_ERROR, ""); + dispatchEvent(re); + } else{ + throw new Error(msg); + } + } + */ + AssetLibraryBundle.prototype.onAssetRename = function (event) { + var asset = event.target; + var old = this.getAsset(asset.assetNamespace, asset.name); + + if (old != null) { + this._strategy.resolveConflict(asset, old, this._assetDictionary[asset.assetNamespace], this._strategyPreference); + } else { + var dict = this._assetDictionary[event.asset.assetNamespace]; + + if (dict == null) + return; + + dict[event.assetPrevName] = null; + dict[event.asset.name] = event.asset; + } + }; + + AssetLibraryBundle.prototype.onAssetConflictResolved = function (event) { + this.dispatchEvent(event.clone()); + }; + AssetLibraryBundle._iInstances = new Object(); + return AssetLibraryBundle; +})(EventDispatcher); + +module.exports = AssetLibraryBundle; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Bc3NldExpYnJhcnlCdW5kbGUudHMiXSwibmFtZXMiOlsiQXNzZXRMaWJyYXJ5QnVuZGxlIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLmNvbnN0cnVjdG9yIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLmdldEluc3RhbmNlIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLmVuYWJsZVBhcnNlciIsIkFzc2V0TGlicmFyeUJ1bmRsZS5lbmFibGVQYXJzZXJzIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLmNyZWF0ZUl0ZXJhdG9yIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLmxvYWQiLCJBc3NldExpYnJhcnlCdW5kbGUubG9hZERhdGEiLCJBc3NldExpYnJhcnlCdW5kbGUuZ2V0QXNzZXQiLCJBc3NldExpYnJhcnlCdW5kbGUuYWRkQXNzZXQiLCJBc3NldExpYnJhcnlCdW5kbGUucmVtb3ZlQXNzZXQiLCJBc3NldExpYnJhcnlCdW5kbGUucmVtb3ZlQXNzZXRCeU5hbWUiLCJBc3NldExpYnJhcnlCdW5kbGUucmVtb3ZlQWxsQXNzZXRzIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLnJlbW92ZU5hbWVzcGFjZUFzc2V0cyIsIkFzc2V0TGlicmFyeUJ1bmRsZS5yZW1vdmVBc3NldEZyb21EaWN0IiwiQXNzZXRMaWJyYXJ5QnVuZGxlLnN0b3BBbGxMb2FkaW5nU2Vzc2lvbnMiLCJBc3NldExpYnJhcnlCdW5kbGUucmVoYXNoQXNzZXREaWN0IiwiQXNzZXRMaWJyYXJ5QnVuZGxlLm9uTG9hZEVycm9yIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLm9uUGFyc2VFcnJvciIsIkFzc2V0TGlicmFyeUJ1bmRsZS5vbkFzc2V0Q29tcGxldGUiLCJBc3NldExpYnJhcnlCdW5kbGUub25UZXh0dXJlU2l6ZUVycm9yIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLm9uUmVzb3VyY2VDb21wbGV0ZSIsIkFzc2V0TGlicmFyeUJ1bmRsZS5sb2FkaW5nU2Vzc2lvbkdDIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLmtpbGxMb2FkaW5nU2Vzc2lvbiIsIkFzc2V0TGlicmFyeUJ1bmRsZS5vbkFzc2V0UmVuYW1lIiwiQXNzZXRMaWJyYXJ5QnVuZGxlLm9uQXNzZXRDb25mbGljdFJlc29sdmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1RkFFNEY7QUFDNUYscUVBQTRFOztBQUc1RSxtRkFBd0Y7QUFDeEYsK0VBQXFGOztBQUVyRiwyRUFBaUY7O0FBRWpGLG1EQUEyRDtBQUMzRCw2REFBb0U7QUFDcEUsaUVBQXdFO0FBQ3hFLCtEQUFzRTtBQUN0RSx1RUFBNkU7QUFDN0UsK0RBQXNFOztBQUd0RTs7OztFQUlHO0FBQ0g7SUFBaUNBLHFDQUFlQTtJQTBCL0NBOzs7O01BREdBO0lBQ0hBO1FBQUFDLGlCQWtCQ0E7UUFoQkFBLFdBQU1BLEtBQUFBLENBQUNBO1FBbEJSQSxLQUFRQSx1QkFBdUJBLEdBQXNCQSxJQUFJQSxLQUFLQSxDQUFjQSxDQUFDQSxDQUFDQTs7UUFvQjdFQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxDQUFDQSxFQUFDQSxzQkFBc0JBO1FBQ3pEQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLElBQUlBLE1BQU1BLENBQUNBLENBQUNBO1FBQ3BDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLElBQUlBLEtBQUtBLENBQWNBLENBQUNBOztRQUVoREEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxnQkFBZ0JBLENBQUNBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQ3hEQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUdBLGtCQUFrQkEsQ0FBQ0EsU0FBU0E7O1FBRXREQSxJQUFJQSxDQUFDQSxzQkFBc0JBLEdBQUdBLFVBQUNBLEtBQWdCQTttQkFBS0EsS0FBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBekJBLENBQXlCQTtRQUM3RUEsSUFBSUEsQ0FBQ0EsZ0NBQWdDQSxHQUFHQSxVQUFDQSxLQUFnQkE7bUJBQUtBLEtBQUlBLENBQUNBLHVC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QSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxLQUFLQSxDQUFDQSxLQUFLQTtTQUNwQ0E7SUFDRkEsQ0FBQ0E7O0lBRUR4Qix1REFBQUEsVUFBZ0NBLEtBQWdCQTtRQUUvQ3lCLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO0lBQ2xDQSxDQUFDQTtJQWprQkR6QixpQ0FBbUNBLElBQUlBLE1BQU1BLENBQUNBLENBQUNBO0lBa2tCaERBLDBCQUFDQTtBQUFEQSxDQUFDQSxFQXBrQmdDLGVBQWUsRUFva0IvQzs7QUFFRCxtQ0FBNEIsQ0FBQSIsImZpbGUiOiJjb3JlL2xpYnJhcnkvQXNzZXRMaWJyYXJ5QnVuZGxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxSZXF1ZXN0XCIpO1xuaW1wb3J0IEFzc2V0TGlicmFyeVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldExpYnJhcnlcIik7XG5pbXBvcnQgQXNzZXRMaWJyYXJ5SXRlcmF0b3JcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldExpYnJhcnlJdGVyYXRvclwiKTtcbmltcG9ydCBBc3NldExvYWRlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldExvYWRlclwiKTtcbmltcG9ydCBBc3NldExvYWRlclRva2VuXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldExvYWRlclRva2VuXCIpO1xuaW1wb3J0IEFzc2V0TG9hZGVyQ29udGV4dFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TG9hZGVyQ29udGV4dFwiKTtcbmltcG9ydCBDb25mbGljdFByZWNlZGVuY2VcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Db25mbGljdFByZWNlZGVuY2VcIik7XG5pbXBvcnQgQ29uZmxpY3RTdHJhdGVneVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQ29uZmxpY3RTdHJhdGVneVwiKTtcbmltcG9ydCBDb25mbGljdFN0cmF0ZWd5QmFzZVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0NvbmZsaWN0U3RyYXRlZ3lCYXNlXCIpO1xuaW1wb3J0IE5hbWVkQXNzZXRCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9OYW1lZEFzc2V0QmFzZVwiKTtcbmltcG9ydCBJQXNzZXRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5pbXBvcnQgRXJyb3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9FcnJvclwiKTtcbmltcG9ydCBBc3NldEV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0Fzc2V0RXZlbnRcIik7XG5pbXBvcnQgSU9FcnJvckV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0lPRXJyb3JFdmVudFwiKTtcbmltcG9ydCBMb2FkZXJFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9Mb2FkZXJFdmVudFwiKTtcbmltcG9ydCBFdmVudERpc3BhdGNoZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiKTtcbmltcG9ydCBQYXJzZXJFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9QYXJzZXJFdmVudFwiKTtcbmltcG9ydCBQYXJzZXJCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcGFyc2Vycy9QYXJzZXJCYXNlXCIpO1xuXG4vKipcbiAqIEFzc2V0TGlicmFyeUJ1bmRsZSBlbmZvcmNlcyBhIG11bHRpdG9uIHBhdHRlcm4gYW5kIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW5jZWQgZGlyZWN0bHkuXG4gKiBJdHMgcHVycG9zZSBpcyB0byBjcmVhdGUgYSBjb250YWluZXIgZm9yIDNEIGRhdGEgbWFuYWdlbWVudCwgYm90aCBiZWZvcmUgYW5kIGFmdGVyIHBhcnNpbmcuXG4gKiBJZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gY3JlYXRpbmcgbXVsdGlwbGUgbGlicmFyeSBidW5kbGVzLCBwbGVhc2UgdXNlIHRoZSA8Y29kZT5nZXRJbnN0YW5jZSgpPC9jb2RlPiBtZXRob2QuXG4gKi9cbmNsYXNzIEFzc2V0TGlicmFyeUJ1bmRsZSBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlclxue1xuXHRwdWJsaWMgc3RhdGljIF9pSW5zdGFuY2VzOk9iamVjdCA9IG5ldyBPYmplY3QoKTtcblxuXHRwcml2YXRlIF9sb2FkaW5nU2Vzc2lvbnM6QXJyYXk8QXNzZXRMb2FkZXI+O1xuXHRwcml2YXRlIF9zdHJhdGVneTpDb25mbGljdFN0cmF0ZWd5QmFzZTtcblx0cHJpdmF0ZSBfc3RyYXRlZ3lQcmVmZXJlbmNlOnN0cmluZztcblx0cHJpdmF0ZSBfYXNzZXRzOkFycmF5PElBc3NldD47XG5cdHByaXZhdGUgX2Fzc2V0RGljdGlvbmFyeTpPYmplY3Q7XG5cdHByaXZhdGUgX2Fzc2V0RGljdERpcnR5OmJvb2xlYW47XG5cdHByaXZhdGUgX2xvYWRpbmdTZXNzaW9uc0dhcmJhZ2U6QXJyYXk8QXNzZXRMb2FkZXI+ID0gbmV3IEFycmF5PEFzc2V0TG9hZGVyPigpO1xuXHRwcml2YXRlIF9nY1RpbWVvdXRJSUQ6bnVtYmVyO1xuXG5cdHByaXZhdGUgX29uQXNzZXRSZW5hbWVEZWxlZ2F0ZTooZXZlbnQ6QXNzZXRFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25Bc3NldENvbmZsaWN0UmVzb2x2ZWREZWxlZ2F0ZTooZXZlbnQ6QXNzZXRFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25SZXNvdXJjZUNvbXBsZXRlRGVsZWdhdGU6KGV2ZW50OkxvYWRlckV2ZW50KSA9PiB2b2lkO1xuXHRwcml2YXRlIF9vblRleHR1cmVTaXplRXJyb3JEZWxlZ2F0ZTooZXZlbnQ6QXNzZXRFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25Bc3NldENvbXBsZXRlRGVsZWdhdGU6KGV2ZW50OkFzc2V0RXZlbnQpID0+IHZvaWQ7XG5cdHByaXZhdGUgX29uTG9hZEVycm9yRGVsZWdhdGU6KGV2ZW50OklPRXJyb3JFdmVudCkgPT4gYm9vbGVhbjtcblx0cHJpdmF0ZSBfb25QYXJzZUVycm9yRGVsZWdhdGU6KGV2ZW50OlBhcnNlckV2ZW50KSA9PiBib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPkFzc2V0TGlicmFyeUJ1bmRsZTwvY29kZT4gb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWUgQSBtdWx0aXRvbiBlbmZvcmNlciBmb3IgdGhlIEFzc2V0TGlicmFyeUJ1bmRsZSBlbnN1cmluZyBpdCBjYW5ubm90IGJlIGluc3RhbmNlZC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9hc3NldHMgPSBuZXcgQXJyYXk8SUFzc2V0PigpOy8vbmV3IFZlY3Rvci48SUFzc2V0Pjtcblx0XHR0aGlzLl9hc3NldERpY3Rpb25hcnkgPSBuZXcgT2JqZWN0KCk7XG5cdFx0dGhpcy5fbG9hZGluZ1Nlc3Npb25zID0gbmV3IEFycmF5PEFzc2V0TG9hZGVyPigpO1xuXG5cdFx0dGhpcy5jb25mbGljdFN0cmF0ZWd5ID0gQ29uZmxpY3RTdHJhdGVneS5JR05PUkUuY3JlYXRlKCk7XG5cdFx0dGhpcy5jb25mbGljdFByZWNlZGVuY2UgPSBDb25mbGljdFByZWNlZGVuY2UuRkFWT1JfTkVXO1xuXG5cdFx0dGhpcy5fb25Bc3NldFJlbmFtZURlbGVnYXRlID0gKGV2ZW50OkFzc2V0RXZlbnQpID0+IHRoaXMub25Bc3NldFJlbmFtZShldmVudCk7XG5cdFx0dGhpcy5fb25Bc3NldENvbmZsaWN0UmVzb2x2ZWREZWxlZ2F0ZSA9IChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uQXNzZXRDb25mbGljdFJlc29sdmVkKGV2ZW50KTtcblx0XHR0aGlzLl9vblJlc291cmNlQ29tcGxldGVEZWxlZ2F0ZSA9IChldmVudDpMb2FkZXJFdmVudCkgPT4gdGhpcy5vblJlc291cmNlQ29tcGxldGUoZXZlbnQpO1xuXHRcdHRoaXMuX29uVGV4dHVyZVNpemVFcnJvckRlbGVnYXRlID0gKGV2ZW50OkFzc2V0RXZlbnQpID0+IHRoaXMub25UZXh0dXJlU2l6ZUVycm9yKGV2ZW50KTtcblx0XHR0aGlzLl9vbkFzc2V0Q29tcGxldGVEZWxlZ2F0ZSA9IChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uQXNzZXRDb21wbGV0ZShldmVudCk7XG5cdFx0dGhpcy5fb25Mb2FkRXJyb3JEZWxlZ2F0ZSA9IChldmVudDpJT0Vycm9yRXZlbnQpID0+IHRoaXMub25Mb2FkRXJyb3IoZXZlbnQpO1xuXHRcdHRoaXMuX29uUGFyc2VFcnJvckRlbGVnYXRlID0gKGV2ZW50OlBhcnNlckV2ZW50KSA9PiB0aGlzLm9uUGFyc2VFcnJvcihldmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbiBBc3NldExpYnJhcnlCdW5kbGUgaW5zdGFuY2UuIElmIG5vIGtleSBpcyBnaXZlbiwgcmV0dXJucyB0aGUgZGVmYXVsdCBidW5kbGUgaW5zdGFuY2UgKHdoaWNoIGlzXG5cdCAqIHNpbWlsYXIgdG8gdXNpbmcgdGhlIEFzc2V0TGlicmFyeUJ1bmRsZSBhcyBhIHNpbmdsZXRvbi4pIFRvIGtlZXAgc2V2ZXJhbCBzZXBhcmF0ZWQgbGlicmFyeSBidW5kbGVzLFxuXHQgKiBwYXNzIGEgc3RyaW5nIGtleSB0byB0aGlzIG1ldGhvZCB0byBkZWZpbmUgd2hpY2ggYnVuZGxlIHNob3VsZCBiZSByZXR1cm5lZC4gVGhpcyBpc1xuXHQgKiByZWZlcnJlZCB0byBhcyB1c2luZyB0aGUgQXNzZXRMaWJyYXJ5IGFzIGEgbXVsdGl0b24uXG5cdCAqXG5cdCAqIEBwYXJhbSBrZXkgRGVmaW5lcyB3aGljaCBtdWx0aXRvbiBpbnN0YW5jZSBzaG91bGQgYmUgcmV0dXJuZWQuXG5cdCAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIGFzc2V0IGxpYnJhcnlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2Uoa2V5OnN0cmluZyA9ICdkZWZhdWx0Jyk6QXNzZXRMaWJyYXJ5QnVuZGxlXG5cdHtcblx0XHRpZiAoIWtleSlcblx0XHRcdGtleSA9ICdkZWZhdWx0JztcblxuXHRcdGlmICghQXNzZXRMaWJyYXJ5QnVuZGxlLl9pSW5zdGFuY2VzLmhhc093blByb3BlcnR5KGtleSkpXG5cdFx0XHRBc3NldExpYnJhcnlCdW5kbGUuX2lJbnN0YW5jZXNba2V5XSA9IG5ldyBBc3NldExpYnJhcnlCdW5kbGUoKTtcblxuXHRcdHJldHVybiBBc3NldExpYnJhcnlCdW5kbGUuX2lJbnN0YW5jZXNba2V5XTtcblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZW5hYmxlUGFyc2VyKHBhcnNlckNsYXNzOk9iamVjdClcblx0e1xuXHRcdEFzc2V0TG9hZGVyLmVuYWJsZVBhcnNlcihwYXJzZXJDbGFzcyk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBlbmFibGVQYXJzZXJzKHBhcnNlckNsYXNzZXM6T2JqZWN0W10pXG5cdHtcblx0XHRBc3NldExvYWRlci5lbmFibGVQYXJzZXJzKHBhcnNlckNsYXNzZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hpY2ggc3RyYXRlZ3kgc2hvdWxkIGJlIHVzZWQgZm9yIHJlc29sdmluZyBuYW1pbmcgY29uZmxpY3RzLCB3aGVuIHR3byBsaWJyYXJ5XG5cdCAqIGFzc2V0cyBhcmUgZ2l2ZW4gdGhlIHNhbWUgbmFtZS4gQnkgZGVmYXVsdCwgPGNvZGU+Q29uZmxpY3RTdHJhdGVneS5BUFBFTkRfTlVNX1NVRkZJWDwvY29kZT5cblx0ICogaXMgdXNlZCB3aGljaCBtZWFucyB0aGF0IGEgbnVtZXJpYyBzdWZmaXggaXMgYXBwZW5kZWQgdG8gb25lIG9mIHRoZSBhc3NldHMuIFRoZVxuXHQgKiA8Y29kZT5jb25mbGljdFByZWNlZGVuY2U8L2NvZGU+IHByb3BlcnR5IGRlZmluZXMgd2hpY2ggb2YgdGhlIHR3byBjb25mbGljdGluZyBhc3NldHMgd2lsbFxuXHQgKiBiZSByZW5hbWVkLlxuXHQgKlxuXHQgKiBAc2VlIG5hbWluZy5Db25mbGljdFN0cmF0ZWd5XG5cdCAqIEBzZWUgQXNzZXRMaWJyYXJ5LmNvbmZsaWN0UHJlY2VkZW5jZVxuXHQgKi9cblx0cHVibGljIGdldCBjb25mbGljdFN0cmF0ZWd5KCk6Q29uZmxpY3RTdHJhdGVneUJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zdHJhdGVneTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgY29uZmxpY3RTdHJhdGVneSh2YWw6Q29uZmxpY3RTdHJhdGVneUJhc2UpXG5cdHtcblxuXHRcdGlmICghdmFsKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCduYW1pbmdTdHJhdGVneSBtdXN0IG5vdCBiZSBudWxsLiBUbyBpZ25vcmUgbmFtaW5nLCB1c2UgQXNzZXRMaWJyYXJ5LklHTk9SRScpO1xuXG5cdFx0dGhpcy5fc3RyYXRlZ3kgPSB2YWwuY3JlYXRlKCk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHdoaWNoIGFzc2V0IHNob3VsZCBoYXZlIHByZWNlZGVuY2Ugd2hlbiByZXNvbHZpbmcgYSBuYW1pbmcgY29uZmxpY3QgYmV0d2VlblxuXHQgKiB0d28gYXNzZXRzIG9mIHdoaWNoIG9uZSBoYXMganVzdCBiZWVuIHJlbmFtZWQgYnkgdGhlIHVzZXIgb3IgYnkgYSBwYXJzZXIuIEJ5IGRlZmF1bHRcblx0ICogPGNvZGU+Q29uZmxpY3RQcmVjZWRlbmNlLkZBVk9SX05FVzwvY29kZT4gaXMgdXNlZCwgbWVhbmluZyB0aGF0IHRoZSBuZXdseSByZW5hbWVkXG5cdCAqIGFzc2V0IHdpbGwga2VlcCBpdCdzIG5ldyBuYW1lIHdoaWxlIHRoZSBvbGRlciBhc3NldCBnZXRzIHJlbmFtZWQgdG8gbm90IGNvbmZsaWN0LlxuXHQgKlxuXHQgKiBUaGlzIHByb3BlcnR5IGlzIGlnbm9yZWQgZm9yIGNvbmZsaWN0IHN0cmF0ZWdpZXMgdGhhdCBkbyBub3QgYWN0dWFsbHkgcmVuYW1lIGFuXG5cdCAqIGFzc2V0IGF1dG9tYXRpY2FsbHksIHN1Y2ggYXMgQ29uZmxpY3RTdHJhdGVneS5JR05PUkUgYW5kIENvbmZsaWN0U3RyYXRlZ3kuVEhST1dfRVJST1IuXG5cdCAqXG5cdCAqIEBzZWUgYXdheS5saWJyYXJ5LkNvbmZsaWN0UHJlY2VkZW5jZVxuXHQgKiBAc2VlIGF3YXkubGlicmFyeS5Db25mbGljdFN0cmF0ZWd5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGNvbmZsaWN0UHJlY2VkZW5jZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3N0cmF0ZWd5UHJlZmVyZW5jZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgY29uZmxpY3RQcmVjZWRlbmNlKHZhbDpzdHJpbmcpXG5cdHtcblx0XHR0aGlzLl9zdHJhdGVneVByZWZlcmVuY2UgPSB2YWw7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlIGFuIEFzc2V0TGlicmFyeUl0ZXJhdG9yIGluc3RhbmNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBhc3NldHNcblx0ICogaW4gdGhpcyBhc3NldCBsaWJyYXJ5IGluc3RhbmNlLiBUaGUgaXRlcmF0b3IgY2FuIGZpbHRlciBhc3NldHMgb24gYXNzZXQgdHlwZSBhbmQvb3Jcblx0ICogbmFtZXNwYWNlLiBBIFwibnVsbFwiIGZpbHRlciB2YWx1ZSBtZWFucyBubyBmaWx0ZXIgb2YgdGhhdCB0eXBlIGlzIHVzZWQuXG5cdCAqXG5cdCAqIEBwYXJhbSBhc3NldFR5cGVGaWx0ZXIgQXNzZXQgdHlwZSB0byBmaWx0ZXIgb24gKGZyb20gdGhlIEFzc2V0VHlwZSBlbnVtIGNsYXNzLikgVXNlXG5cdCAqIG51bGwgdG8gbm90IGZpbHRlciBvbiBhc3NldCB0eXBlLlxuXHQgKiBAcGFyYW0gbmFtZXNwYWNlRmlsdGVyIE5hbWVzcGFjZSB0byBmaWx0ZXIgb24uIFVzZSBudWxsIHRvIG5vdCBmaWx0ZXIgb24gbmFtZXNwYWNlLlxuXHQgKiBAcGFyYW0gZmlsdGVyRnVuYyBDYWxsYmFjayBmdW5jdGlvbiB0byB1c2Ugd2hlbiBkZWNpZGluZyB3aGV0aGVyIGFuIGFzc2V0IHNob3VsZCBiZVxuXHQgKiBpbmNsdWRlZCBpbiB0aGUgaXRlcmF0aW9uIG9yIG5vdC4gVGhpcyBuZWVkcyB0byBiZSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBzaW5nbGVcblx0ICogcGFyYW1ldGVyIG9mIHR5cGUgSUFzc2V0IGFuZCByZXR1cm5zIGEgYm9vbGVhbiB3aGVyZSB0cnVlIG1lYW5zIGl0IHNob3VsZCBiZSBpbmNsdWRlZC5cblx0ICpcblx0ICogQHNlZSBhd2F5LmxpYnJhcnkuQXNzZXRUeXBlXG5cdCAqL1xuXHRwdWJsaWMgY3JlYXRlSXRlcmF0b3IoYXNzZXRUeXBlRmlsdGVyOnN0cmluZyA9IG51bGwsIG5hbWVzcGFjZUZpbHRlcjpzdHJpbmcgPSBudWxsLCBmaWx0ZXJGdW5jID0gbnVsbCk6QXNzZXRMaWJyYXJ5SXRlcmF0b3Jcblx0e1xuXHRcdHJldHVybiBuZXcgQXNzZXRMaWJyYXJ5SXRlcmF0b3IodGhpcy5fYXNzZXRzLCBhc3NldFR5cGVGaWx0ZXIsIG5hbWVzcGFjZUZpbHRlciwgZmlsdGVyRnVuYyk7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZHMgYSBmaWxlIGFuZCAob3B0aW9uYWxseSkgYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMuXG5cdCAqXG5cdCAqIEBwYXJhbSByZXEgVGhlIFVSTFJlcXVlc3Qgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIFVSTCBvZiB0aGUgZmlsZSB0byBiZSBsb2FkZWQuXG5cdCAqIEBwYXJhbSBjb250ZXh0IEFuIG9wdGlvbmFsIGNvbnRleHQgb2JqZWN0IHByb3ZpZGluZyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGxvYWRpbmdcblx0ICogQHBhcmFtIG5zIEFuIG9wdGlvbmFsIG5hbWVzcGFjZSBzdHJpbmcgdW5kZXIgd2hpY2ggdGhlIGZpbGUgaXMgdG8gYmUgbG9hZGVkLCBhbGxvd2luZyB0aGUgZGlmZmVyZW50aWF0aW9uIG9mIHR3byByZXNvdXJjZXMgd2l0aCBpZGVudGljYWwgYXNzZXRzXG5cdCAqIEBwYXJhbSBwYXJzZXIgQW4gb3B0aW9uYWwgcGFyc2VyIG9iamVjdCBmb3IgdHJhbnNsYXRpbmcgdGhlIGxvYWRlZCBkYXRhIGludG8gYSB1c2FibGUgcmVzb3VyY2UuIElmIG5vdCBwcm92aWRlZCwgQXNzZXRMb2FkZXIgd2lsbCBhdHRlbXB0IHRvIGF1dG8tZGV0ZWN0IHRoZSBmaWxlIHR5cGUuXG5cdCAqIEByZXR1cm4gQSBoYW5kbGUgdG8gdGhlIHJldHJpZXZlZCByZXNvdXJjZS5cblx0ICovXG5cdHB1YmxpYyBsb2FkKHJlcTpVUkxSZXF1ZXN0LCBjb250ZXh0OkFzc2V0TG9hZGVyQ29udGV4dCA9IG51bGwsIG5zOnN0cmluZyA9IG51bGwsIHBhcnNlcjpQYXJzZXJCYXNlID0gbnVsbCk6QXNzZXRMb2FkZXJUb2tlblxuXHR7XG5cdFx0dmFyIGxvYWRlcjpBc3NldExvYWRlciA9IG5ldyBBc3NldExvYWRlcigpO1xuXG5cdFx0aWYgKCF0aGlzLl9sb2FkaW5nU2Vzc2lvbnMpXG5cdFx0XHR0aGlzLl9sb2FkaW5nU2Vzc2lvbnMgPSBuZXcgQXJyYXk8QXNzZXRMb2FkZXI+KCk7XG5cblx0XHR0aGlzLl9sb2FkaW5nU2Vzc2lvbnMucHVzaChsb2FkZXIpO1xuXG5cdFx0bG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoTG9hZGVyRXZlbnQuUkVTT1VSQ0VfQ09NUExFVEUsIHRoaXMuX29uUmVzb3VyY2VDb21wbGV0ZURlbGVnYXRlKTtcblx0XHRsb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LlRFWFRVUkVfU0laRV9FUlJPUiwgdGhpcy5fb25UZXh0dXJlU2l6ZUVycm9yRGVsZWdhdGUpO1xuXHRcdGxvYWRlci5hZGRFdmVudExpc3RlbmVyKEFzc2V0RXZlbnQuQVNTRVRfQ09NUExFVEUsIHRoaXMuX29uQXNzZXRDb21wbGV0ZURlbGVnYXRlKTtcblxuXHRcdC8vIEVycm9yIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgKHNlZSBkb2N1bWVudGF0aW9uIGZvciBhZGRFcnJvckhhbmRsZXIpXG5cdFx0bG9hZGVyLl9pQWRkRXJyb3JIYW5kbGVyKHRoaXMuX29uTG9hZEVycm9yRGVsZWdhdGUpO1xuXHRcdGxvYWRlci5faUFkZFBhcnNlRXJyb3JIYW5kbGVyKHRoaXMuX29uUGFyc2VFcnJvckRlbGVnYXRlKTtcblxuXHRcdHJldHVybiBsb2FkZXIubG9hZChyZXEsIGNvbnRleHQsIG5zLCBwYXJzZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIGEgcmVzb3VyY2UgZnJvbSBleGlzdGluZyBkYXRhIGluIG1lbW9yeS5cblx0ICpcblx0ICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHJlc291cmNlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCBBbiBvcHRpb25hbCBjb250ZXh0IG9iamVjdCBwcm92aWRpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciBsb2FkaW5nXG5cdCAqIEBwYXJhbSBucyBBbiBvcHRpb25hbCBuYW1lc3BhY2Ugc3RyaW5nIHVuZGVyIHdoaWNoIHRoZSBmaWxlIGlzIHRvIGJlIGxvYWRlZCwgYWxsb3dpbmcgdGhlIGRpZmZlcmVudGlhdGlvbiBvZiB0d28gcmVzb3VyY2VzIHdpdGggaWRlbnRpY2FsIGFzc2V0c1xuXHQgKiBAcGFyYW0gcGFyc2VyIEFuIG9wdGlvbmFsIHBhcnNlciBvYmplY3QgZm9yIHRyYW5zbGF0aW5nIHRoZSBsb2FkZWQgZGF0YSBpbnRvIGEgdXNhYmxlIHJlc291cmNlLiBJZiBub3QgcHJvdmlkZWQsIEFzc2V0TG9hZGVyIHdpbGwgYXR0ZW1wdCB0byBhdXRvLWRldGVjdCB0aGUgZmlsZSB0eXBlLlxuXHQgKiBAcmV0dXJuIEEgaGFuZGxlIHRvIHRoZSByZXRyaWV2ZWQgcmVzb3VyY2UuXG5cdCAqL1xuXHRwdWJsaWMgbG9hZERhdGEoZGF0YTphbnksIGNvbnRleHQ6QXNzZXRMb2FkZXJDb250ZXh0ID0gbnVsbCwgbnM6c3RyaW5nID0gbnVsbCwgcGFyc2VyOlBhcnNlckJhc2UgPSBudWxsKTpBc3NldExvYWRlclRva2VuXG5cdHtcblx0XHR2YXIgbG9hZGVyOkFzc2V0TG9hZGVyID0gbmV3IEFzc2V0TG9hZGVyKCk7XG5cblx0XHRpZiAoIXRoaXMuX2xvYWRpbmdTZXNzaW9ucylcblx0XHRcdHRoaXMuX2xvYWRpbmdTZXNzaW9ucyA9IG5ldyBBcnJheTxBc3NldExvYWRlcj4oKTtcblxuXHRcdHRoaXMuX2xvYWRpbmdTZXNzaW9ucy5wdXNoKGxvYWRlcik7XG5cblx0XHRsb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihMb2FkZXJFdmVudC5SRVNPVVJDRV9DT01QTEVURSwgdGhpcy5fb25SZXNvdXJjZUNvbXBsZXRlRGVsZWdhdGUpO1xuXHRcdGxvYWRlci5hZGRFdmVudExpc3RlbmVyKEFzc2V0RXZlbnQuVEVYVFVSRV9TSVpFX0VSUk9SLCB0aGlzLl9vblRleHR1cmVTaXplRXJyb3JEZWxlZ2F0ZSk7XG5cdFx0bG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoQXNzZXRFdmVudC5BU1NFVF9DT01QTEVURSwgdGhpcy5fb25Bc3NldENvbXBsZXRlRGVsZWdhdGUpO1xuXG5cdFx0Ly8gRXJyb3IgYXJlIGhhbmRsZWQgc2VwYXJhdGVseSAoc2VlIGRvY3VtZW50YXRpb24gZm9yIGFkZEVycm9ySGFuZGxlcilcblx0XHRsb2FkZXIuX2lBZGRFcnJvckhhbmRsZXIodGhpcy5fb25Mb2FkRXJyb3JEZWxlZ2F0ZSk7XG5cdFx0bG9hZGVyLl9pQWRkUGFyc2VFcnJvckhhbmRsZXIodGhpcy5fb25QYXJzZUVycm9yRGVsZWdhdGUpO1xuXG5cdFx0cmV0dXJuIGxvYWRlci5sb2FkRGF0YShkYXRhLCAnJywgY29udGV4dCwgbnMsIHBhcnNlcik7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXRBc3NldChuYW1lOnN0cmluZywgbnM6c3RyaW5nID0gbnVsbCk6SUFzc2V0XG5cdHtcblx0XHQvL3ZhciBhc3NldCA6IElBc3NldDtcblxuXHRcdGlmICh0aGlzLl9hc3NldERpY3REaXJ0eSlcblx0XHRcdHRoaXMucmVoYXNoQXNzZXREaWN0KCk7XG5cblx0XHRpZiAobnMgPT0gbnVsbClcblx0XHRcdG5zID0gTmFtZWRBc3NldEJhc2UuREVGQVVMVF9OQU1FU1BBQ0U7XG5cblx0XHRpZiAoIXRoaXMuX2Fzc2V0RGljdGlvbmFyeS5oYXNPd25Qcm9wZXJ0eShucykpXG5cdFx0XHRyZXR1cm4gbnVsbDtcblxuXHRcdHJldHVybiB0aGlzLl9hc3NldERpY3Rpb25hcnlbbnNdW25hbWVdO1xuXG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhbiBhc3NldCB0byB0aGUgYXNzZXQgbGlicmFyeSwgZmlyc3QgbWFraW5nIHN1cmUgdGhhdCBpdCdzIG5hbWUgaXMgdW5pcXVlXG5cdCAqIHVzaW5nIHRoZSBtZXRob2QgZGVmaW5lZCBieSB0aGUgPGNvZGU+Y29uZmxpY3RTdHJhdGVneTwvY29kZT4gYW5kXG5cdCAqIDxjb2RlPmNvbmZsaWN0UHJlY2VkZW5jZTwvY29kZT4gcHJvcGVydGllcy5cblx0ICovXG5cdHB1YmxpYyBhZGRBc3NldChhc3NldDpJQXNzZXQpXG5cdHtcblx0XHR2YXIgbnM6c3RyaW5nO1xuXHRcdHZhciBvbGQ6SUFzc2V0O1xuXG5cdFx0Ly8gQmFpbCBpZiBhc3NldCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkLlxuXHRcdGlmICh0aGlzLl9hc3NldHMuaW5kZXhPZihhc3NldCkgPj0gMClcblx0XHRcdHJldHVybjtcblxuXHRcdG9sZCA9IHRoaXMuZ2V0QXNzZXQoYXNzZXQubmFtZSwgYXNzZXQuYXNzZXROYW1lc3BhY2UpO1xuXHRcdG5zID0gYXNzZXQuYXNzZXROYW1lc3BhY2UgfHwgTmFtZWRBc3NldEJhc2UuREVGQVVMVF9OQU1FU1BBQ0U7XG5cblx0XHRpZiAob2xkICE9IG51bGwpXG5cdFx0XHR0aGlzLl9zdHJhdGVneS5yZXNvbHZlQ29uZmxpY3QoYXNzZXQsIG9sZCwgdGhpcy5fYXNzZXREaWN0aW9uYXJ5W25zXSwgdGhpcy5fc3RyYXRlZ3lQcmVmZXJlbmNlKTtcblxuXHRcdC8vY3JlYXRlIHVuaXF1ZS1pZCAoZm9yIG5vdyB0aGlzIGlzIHVzZWQgaW4gQXdheUJ1aWxkZXIgb25seVxuXHRcdC8vYXNzZXQuaWQgPSBJRFV0aWwuY3JlYXRlVUlEKCk7XG5cblx0XHQvLyBBZGQgaXRcblx0XHR0aGlzLl9hc3NldHMucHVzaChhc3NldCk7XG5cblx0XHRpZiAoIXRoaXMuX2Fzc2V0RGljdGlvbmFyeS5oYXNPd25Qcm9wZXJ0eShucykpXG5cdFx0XHR0aGlzLl9hc3NldERpY3Rpb25hcnlbbnNdID0gbmV3IE9iamVjdCgpO1xuXG5cdFx0dGhpcy5fYXNzZXREaWN0aW9uYXJ5W25zXVthc3NldC5uYW1lXSA9IGFzc2V0O1xuXG5cdFx0YXNzZXQuYWRkRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LkFTU0VUX1JFTkFNRSwgdGhpcy5fb25Bc3NldFJlbmFtZURlbGVnYXRlKTtcblx0XHRhc3NldC5hZGRFdmVudExpc3RlbmVyKEFzc2V0RXZlbnQuQVNTRVRfQ09ORkxJQ1RfUkVTT0xWRUQsIHRoaXMuX29uQXNzZXRDb25mbGljdFJlc29sdmVkRGVsZWdhdGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYW4gYXNzZXQgZnJvbSB0aGUgbGlicmFyeSwgYW5kIG9wdGlvbmFsbHkgZGlzcG9zZXMgdGhhdCBhc3NldCBieSBjYWxsaW5nXG5cdCAqIGl0J3MgZGlzcG9zZUFzc2V0KCkgbWV0aG9kICh3aGljaCBmb3IgbW9zdCBhc3NldHMgaXMgaW1wbGVtZW50ZWQgYXMgYSBkZWZhdWx0XG5cdCAqIHZlcnNpb24gb2YgdGhhdCB0eXBlJ3MgZGlzcG9zZSgpIG1ldGhvZC5cblx0ICpcblx0ICogQHBhcmFtIGFzc2V0IFRoZSBhc3NldCB3aGljaCBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIHRoaXMgbGlicmFyeS5cblx0ICogQHBhcmFtIGRpc3Bvc2UgRGVmaW5lcyB3aGV0aGVyIHRoZSBhc3NldHMgc2hvdWxkIGFsc28gYmUgZGlzcG9zZWQuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQXNzZXQoYXNzZXQ6SUFzc2V0LCBkaXNwb3NlOmJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0dmFyIGlkeDpudW1iZXI7XG5cblx0XHR0aGlzLnJlbW92ZUFzc2V0RnJvbURpY3QoYXNzZXQpO1xuXG5cdFx0YXNzZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LkFTU0VUX1JFTkFNRSwgdGhpcy5fb25Bc3NldFJlbmFtZURlbGVnYXRlKTtcblx0XHRhc3NldC5yZW1vdmVFdmVudExpc3RlbmVyKEFzc2V0RXZlbnQuQVNTRVRfQ09ORkxJQ1RfUkVTT0xWRUQsIHRoaXMuX29uQXNzZXRDb25mbGljdFJlc29sdmVkRGVsZWdhdGUpO1xuXG5cdFx0aWR4ID0gdGhpcy5fYXNzZXRzLmluZGV4T2YoYXNzZXQpO1xuXG5cdFx0aWYgKGlkeCA+PSAwKVxuXHRcdFx0dGhpcy5fYXNzZXRzLnNwbGljZShpZHgsIDEpO1xuXG5cdFx0aWYgKGRpc3Bvc2UpXG5cdFx0XHRhc3NldC5kaXNwb3NlKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhbiBhc3NldCB3aGljaCBpcyBzcGVjaWZpZWQgdXNpbmcgbmFtZSBhbmQgbmFtZXNwYWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgYXNzZXQgdG8gYmUgcmVtb3ZlZC5cblx0ICogQHBhcmFtIG5zIFRoZSBuYW1lc3BhY2UgdG8gd2hpY2ggdGhlIGRlc2lyZWQgYXNzZXQgYmVsb25ncy5cblx0ICogQHBhcmFtIGRpc3Bvc2UgRGVmaW5lcyB3aGV0aGVyIHRoZSBhc3NldHMgc2hvdWxkIGFsc28gYmUgZGlzcG9zZWQuXG5cdCAqXG5cdCAqIEBzZWUgYXdheS5saWJyYXJ5LkFzc2V0TGlicmFyeS5yZW1vdmVBc3NldCgpXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlQXNzZXRCeU5hbWUobmFtZTpzdHJpbmcsIG5zOnN0cmluZyA9IG51bGwsIGRpc3Bvc2U6Ym9vbGVhbiA9IHRydWUpOklBc3NldFxuXHR7XG5cblx0XHR2YXIgYXNzZXQ6SUFzc2V0ID0gdGhpcy5nZXRBc3NldChuYW1lLCBucyk7XG5cblx0XHRpZiAoYXNzZXQpXG5cdFx0XHR0aGlzLnJlbW92ZUFzc2V0KGFzc2V0LCBkaXNwb3NlKTtcblxuXHRcdHJldHVybiBhc3NldDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBhc3NldHMgZnJvbSB0aGUgYXNzZXQgbGlicmFyeSwgb3B0aW9uYWxseSBkaXNwb3NpbmcgdGhlbSBhcyB0aGV5XG5cdCAqIGFyZSByZW1vdmVkLlxuXHQgKlxuXHQgKiBAcGFyYW0gZGlzcG9zZSBEZWZpbmVzIHdoZXRoZXIgdGhlIGFzc2V0cyBzaG91bGQgYWxzbyBiZSBkaXNwb3NlZC5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVBbGxBc3NldHMoZGlzcG9zZTpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdGlmIChkaXNwb3NlKSB7XG5cdFx0XHR2YXIgYXNzZXQ6SUFzc2V0O1xuXG5cdFx0XHRmb3IgKHZhciBjOm51bWJlciA9IDA7IGMgPCB0aGlzLl9hc3NldHMubGVuZ3RoOyBjKyspIHtcblx0XHRcdFx0YXNzZXQgPSB0aGlzLl9hc3NldHNbIGMgXTtcblx0XHRcdFx0YXNzZXQuZGlzcG9zZSgpO1xuXHRcdFx0fVxuXHRcdFx0Lypcblx0XHRcdCBmb3IgZWFjaCAoYXNzZXQgaW4gX2Fzc2V0cylcblx0XHRcdCBhc3NldC5kaXNwb3NlKCk7XG5cdFx0XHQgKi9cblx0XHR9XG5cblx0XHR0aGlzLl9hc3NldHMubGVuZ3RoID0gMDtcblx0XHR0aGlzLnJlaGFzaEFzc2V0RGljdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIGFzc2V0cyBiZWxvbmdpbmcgdG8gYSBwYXJ0aWN1bGFyIG5hbWVzcGFjZSAobnVsbCBmb3IgZGVmYXVsdClcblx0ICogZnJvbSB0aGUgYXNzZXQgbGlicmFyeSwgYW5kIG9wdGlvbmFsbCBkaXNwb3NlcyB0aGVtIGJ5IGNhbGxpbmcgdGhlaXJcblx0ICogZGlzcG9zZUFzc2V0KCkgbWV0aG9kLlxuXHQgKlxuXHQgKiBAcGFyYW0gbnMgVGhlIG5hbWVzcGFjZSBmcm9tIHdoaWNoIGFsbCBhc3NldHMgc2hvdWxkIGJlIHJlbW92ZWQuXG5cdCAqIEBwYXJhbSBkaXNwb3NlIERlZmluZXMgd2hldGhlciB0aGUgYXNzZXRzIHNob3VsZCBhbHNvIGJlIGRpc3Bvc2VkLlxuXHQgKlxuXHQgKiBAc2VlIGF3YXkubGlicmFyeS5Bc3NldExpYnJhcnkucmVtb3ZlQXNzZXQoKVxuXHQgKi9cblx0cHVibGljIHJlbW92ZU5hbWVzcGFjZUFzc2V0cyhuczpzdHJpbmcgPSBudWxsLCBkaXNwb3NlOmJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0dmFyIGlkeDpudW1iZXIgPSAwO1xuXHRcdHZhciBhc3NldDpJQXNzZXQ7XG5cdFx0dmFyIG9sZF9hc3NldHM6SUFzc2V0W107XG5cblx0XHQvLyBFbXB0eSB0aGUgYXNzZXRzIHZlY3RvciBhZnRlciBoYXZpbmcgc3RvcmVkIGEgY29weSBvZiBpdC5cblx0XHQvLyBUaGUgY29weSB3aWxsIGJlIGZpbGxlZCB3aXRoIGFsbCBhc3NldHMgd2hpY2ggd2VyZW4ndCByZW1vdmVkLlxuXHRcdG9sZF9hc3NldHMgPSB0aGlzLl9hc3NldHMuY29uY2F0KCk7XG5cdFx0dGhpcy5fYXNzZXRzLmxlbmd0aCA9IDA7XG5cblx0XHRpZiAobnMgPT0gbnVsbClcblx0XHRcdG5zID0gTmFtZWRBc3NldEJhc2UuREVGQVVMVF9OQU1FU1BBQ0U7XG5cblx0XHRmb3IgKHZhciBkOm51bWJlciA9IDA7IGQgPCBvbGRfYXNzZXRzLmxlbmd0aDsgZCsrKSB7XG5cdFx0XHRhc3NldCA9IG9sZF9hc3NldHNbZF07XG5cblx0XHRcdC8vIFJlbW92ZSBmcm9tIGRpY3QgaWYgaW4gdGhlIHN1cHBsaWVkIG5hbWVzcGFjZS4gSWYgbm90LFxuXHRcdFx0Ly8gdHJhbnNmZXIgb3ZlciB0byB0aGUgbmV3IHZlY3Rvci5cblx0XHRcdGlmIChhc3NldC5hc3NldE5hbWVzcGFjZSA9PSBucykge1xuXHRcdFx0XHRpZiAoZGlzcG9zZSlcblx0XHRcdFx0XHRhc3NldC5kaXNwb3NlKCk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGFzc2V0IGZyb20gZGljdGlvbmFyeSwgYnV0IGRvbid0IHRyeSB0byBhdXRvLXJlbW92ZVxuXHRcdFx0XHQvLyB0aGUgbmFtZXNwYWNlLCB3aGljaCB3aWxsIHRyaWdnZXIgYW4gdW5uZWNlc3NhcmlseSBleHBlbnNpdmVcblx0XHRcdFx0Ly8gdGVzdCB0aGF0IGlzIG5vdCBuZWVkZWQgc2luY2Ugd2Uga25vdyB0aGF0IHRoZSBuYW1lc3BhY2Vcblx0XHRcdFx0Ly8gd2lsbCBiZSBlbXB0eSB3aGVuIGxvb3AgZmluaXNoZXMuXG5cdFx0XHRcdHRoaXMucmVtb3ZlQXNzZXRGcm9tRGljdChhc3NldCwgZmFsc2UpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5fYXNzZXRzW2lkeCsrXSA9IGFzc2V0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8qXG5cdFx0IGZvciBlYWNoIChhc3NldCBpbiBvbGRfYXNzZXRzKSB7XG5cdFx0IC8vIFJlbW92ZSBmcm9tIGRpY3QgaWYgaW4gdGhlIHN1cHBsaWVkIG5hbWVzcGFjZS4gSWYgbm90LFxuXHRcdCAvLyB0cmFuc2ZlciBvdmVyIHRvIHRoZSBuZXcgdmVjdG9yLlxuXHRcdCBpZiAoYXNzZXQuYXNzZXROYW1lc3BhY2UgPT0gbnMpIHtcblx0XHQgaWYgKGRpc3Bvc2UpXG5cdFx0IGFzc2V0LmRpc3Bvc2UoKTtcblxuXHRcdCAvLyBSZW1vdmUgYXNzZXQgZnJvbSBkaWN0aW9uYXJ5LCBidXQgZG9uJ3QgdHJ5IHRvIGF1dG8tcmVtb3ZlXG5cdFx0IC8vIHRoZSBuYW1lc3BhY2UsIHdoaWNoIHdpbGwgdHJpZ2dlciBhbiB1bm5lY2Vzc2FyaWx5IGV4cGVuc2l2ZVxuXHRcdCAvLyB0ZXN0IHRoYXQgaXMgbm90IG5lZWRlZCBzaW5jZSB3ZSBrbm93IHRoYXQgdGhlIG5hbWVzcGFjZVxuXHRcdCAvLyB3aWxsIGJlIGVtcHR5IHdoZW4gbG9vcCBmaW5pc2hlcy5cblx0XHQgcmVtb3ZlQXNzZXRGcm9tRGljdChhc3NldCwgZmFsc2UpO1xuXHRcdCB9IGVsc2Vcblx0XHQgX2Fzc2V0c1tpZHgrK10gPSBhc3NldDtcblxuXHRcdCB9XG5cdFx0ICovXG5cblx0XHQvLyBSZW1vdmUgZW1wdHkgbmFtZXNwYWNlXG5cdFx0aWYgKHRoaXMuX2Fzc2V0RGljdGlvbmFyeS5oYXNPd25Qcm9wZXJ0eShucykpXG5cdFx0XHRkZWxldGUgdGhpcy5fYXNzZXREaWN0aW9uYXJ5W25zXTtcblx0fVxuXG5cdHByaXZhdGUgcmVtb3ZlQXNzZXRGcm9tRGljdChhc3NldDpJQXNzZXQsIGF1dG9SZW1vdmVFbXB0eU5hbWVzcGFjZTpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdGlmICh0aGlzLl9hc3NldERpY3REaXJ0eSlcblx0XHRcdHRoaXMucmVoYXNoQXNzZXREaWN0KCk7XG5cblx0XHRpZiAodGhpcy5fYXNzZXREaWN0aW9uYXJ5Lmhhc093blByb3BlcnR5KGFzc2V0LmFzc2V0TmFtZXNwYWNlKSkge1xuXHRcdFx0aWYgKHRoaXMuX2Fzc2V0RGljdGlvbmFyeVthc3NldC5hc3NldE5hbWVzcGFjZV0uaGFzT3duUHJvcGVydHkoYXNzZXQubmFtZSkpXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLl9hc3NldERpY3Rpb25hcnlbYXNzZXQuYXNzZXROYW1lc3BhY2VdW2Fzc2V0Lm5hbWVdO1xuXG5cdFx0XHRpZiAoYXV0b1JlbW92ZUVtcHR5TmFtZXNwYWNlKSB7XG5cblx0XHRcdFx0dmFyIGtleTpzdHJpbmc7XG5cdFx0XHRcdHZhciBlbXB0eTpib29sZWFuID0gdHJ1ZTtcblxuXHRcdFx0XHRmb3IgKGtleSBpbiB0aGlzLl9hc3NldERpY3Rpb25hcnlbYXNzZXQuYXNzZXROYW1lc3BhY2VdKSB7XG5cdFx0XHRcdFx0ZW1wdHkgPSBmYWxzZTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChlbXB0eSlcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXNzZXREaWN0aW9uYXJ5W2Fzc2V0LmFzc2V0TmFtZXNwYWNlXTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc3RvcEFsbExvYWRpbmdTZXNzaW9ucygpXG5cdHtcblx0XHR2YXIgaTpudW1iZXI7XG5cblx0XHRpZiAoIXRoaXMuX2xvYWRpbmdTZXNzaW9ucylcblx0XHRcdHRoaXMuX2xvYWRpbmdTZXNzaW9ucyA9IG5ldyBBcnJheTxBc3NldExvYWRlcj4oKTtcblxuXHRcdHZhciBsZW5ndGg6bnVtYmVyID0gdGhpcy5fbG9hZGluZ1Nlc3Npb25zLmxlbmd0aDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKylcblx0XHRcdHRoaXMua2lsbExvYWRpbmdTZXNzaW9uKHRoaXMuX2xvYWRpbmdTZXNzaW9uc1tpXSk7XG5cblx0XHR0aGlzLl9sb2FkaW5nU2Vzc2lvbnMgPSBudWxsO1xuXHR9XG5cblx0cHJpdmF0ZSByZWhhc2hBc3NldERpY3QoKVxuXHR7XG5cdFx0dmFyIGFzc2V0OklBc3NldDtcblxuXHRcdHRoaXMuX2Fzc2V0RGljdGlvbmFyeSA9IHt9O1xuXG5cdFx0dmFyIGw6bnVtYmVyID0gdGhpcy5fYXNzZXRzLmxlbmd0aDtcblxuXHRcdGZvciAodmFyIGM6bnVtYmVyID0gMDsgYyA8IGw7IGMrKykge1xuXHRcdFx0YXNzZXQgPSB0aGlzLl9hc3NldHNbY107XG5cblx0XHRcdGlmICghdGhpcy5fYXNzZXREaWN0aW9uYXJ5Lmhhc093blByb3BlcnR5KGFzc2V0LmFzc2V0TmFtZXNwYWNlKSlcblx0XHRcdFx0dGhpcy5fYXNzZXREaWN0aW9uYXJ5W2Fzc2V0LmFzc2V0TmFtZXNwYWNlXSA9IHt9O1xuXG5cdFx0XHR0aGlzLl9hc3NldERpY3Rpb25hcnlbYXNzZXQuYXNzZXROYW1lc3BhY2VdW2Fzc2V0Lm5hbWVdID0gYXNzZXQ7XG5cblx0XHR9XG5cblx0XHR0aGlzLl9hc3NldERpY3REaXJ0eSA9IGZhbHNlO1xuXG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGxvYWRpbmcuXG5cdCAqL1xuXHRwcml2YXRlIG9uTG9hZEVycm9yKGV2ZW50OklPRXJyb3JFdmVudCk6Ym9vbGVhblxuXHR7XG5cdFx0aWYgKHRoaXMuaGFzRXZlbnRMaXN0ZW5lcihJT0Vycm9yRXZlbnQuSU9fRVJST1IpKSB7XG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHBhcnNpbmcuXG5cdCAqL1xuXHRwcml2YXRlIG9uUGFyc2VFcnJvcihldmVudDpQYXJzZXJFdmVudCk6Ym9vbGVhblxuXHR7XG5cdFx0aWYgKHRoaXMuaGFzRXZlbnRMaXN0ZW5lcihQYXJzZXJFdmVudC5QQVJTRV9FUlJPUikpIHtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgb25Bc3NldENvbXBsZXRlKGV2ZW50OkFzc2V0RXZlbnQpXG5cdHtcblx0XHQvLyBPbmx5IGFkZCBhc3NldCB0byBsaWJyYXJ5IHRoZSBmaXJzdCB0aW1lLlxuXHRcdGlmIChldmVudC50eXBlID09IEFzc2V0RXZlbnQuQVNTRVRfQ09NUExFVEUpXG5cdFx0XHR0aGlzLmFkZEFzc2V0KGV2ZW50LmFzc2V0KTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cblx0fVxuXG5cdHByaXZhdGUgb25UZXh0dXJlU2l6ZUVycm9yKGV2ZW50OkFzc2V0RXZlbnQpXG5cdHtcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIHRoZSByZXNvdXJjZSBhbmQgYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMgd2FzIHJldHJpZXZlZC5cblx0ICovXG5cdHByaXZhdGUgb25SZXNvdXJjZUNvbXBsZXRlKGV2ZW50OkxvYWRlckV2ZW50KVxuXHR7XG5cdFx0dmFyIGxvYWRlcjpBc3NldExvYWRlciA9IDxBc3NldExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblxuXHRcdHZhciBpbmRleDpudW1iZXIgPSB0aGlzLl9sb2FkaW5nU2Vzc2lvbnMuaW5kZXhPZihsb2FkZXIpO1xuXHRcdHRoaXMuX2xvYWRpbmdTZXNzaW9ucy5zcGxpY2UoaW5kZXgsIDEpO1xuXG5cdFx0Ly8gQWRkIGxvYWRlciB0byBhIGdhcmJhZ2UgYXJyYXkgLSBmb3IgYSBjb2xsZWN0aW9uIHN3ZWVwIGFuZCBraWxsXG5cdFx0dGhpcy5fbG9hZGluZ1Nlc3Npb25zR2FyYmFnZS5wdXNoKGxvYWRlcik7XG5cdFx0dGhpcy5fZ2NUaW1lb3V0SUlEID0gc2V0VGltZW91dCgoKSA9PiB7dGhpcy5sb2FkaW5nU2Vzc2lvbkdDKCl9LCAxMDApO1xuXHR9XG5cblx0cHJpdmF0ZSBsb2FkaW5nU2Vzc2lvbkdDKCk6dm9pZFxuXHR7XG5cdFx0dmFyIGxvYWRlcjpBc3NldExvYWRlcjtcblxuXHRcdHdoaWxlICh0aGlzLl9sb2FkaW5nU2Vzc2lvbnNHYXJiYWdlLmxlbmd0aCA+IDApIHtcblx0XHRcdGxvYWRlciA9IHRoaXMuX2xvYWRpbmdTZXNzaW9uc0dhcmJhZ2UucG9wKCk7XG5cdFx0XHR0aGlzLmtpbGxMb2FkaW5nU2Vzc2lvbihsb2FkZXIpO1xuXHRcdH1cblxuXHRcdGNsZWFyVGltZW91dCh0aGlzLl9nY1RpbWVvdXRJSUQpO1xuXHRcdHRoaXMuX2djVGltZW91dElJRCA9IG51bGw7XG5cblx0fVxuXG5cdHByaXZhdGUga2lsbExvYWRpbmdTZXNzaW9uKGxvYWRlcjpBc3NldExvYWRlcilcblx0e1xuXHRcdGxvYWRlci5yZW1vdmVFdmVudExpc3RlbmVyKExvYWRlckV2ZW50LlJFU09VUkNFX0NPTVBMRVRFLCB0aGlzLl9vblJlc291cmNlQ29tcGxldGVEZWxlZ2F0ZSk7XG5cdFx0bG9hZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoQXNzZXRFdmVudC5URVhUVVJFX1NJWkVfRVJST1IsIHRoaXMuX29uVGV4dHVyZVNpemVFcnJvckRlbGVnYXRlKTtcblx0XHRsb2FkZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LkFTU0VUX0NPTVBMRVRFLCB0aGlzLl9vbkFzc2V0Q29tcGxldGVEZWxlZ2F0ZSk7XG5cdFx0bG9hZGVyLnN0b3AoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiB1bmVzcGVjdGVkIGVycm9yIG9jY3Vyc1xuXHQgKi9cblx0Lypcblx0IHByaXZhdGUgb25SZXNvdXJjZUVycm9yKCkgOiB2b2lkXG5cdCB7XG5cdCB2YXIgbXNnOnN0cmluZyA9IFwiVW5leHBlY3RlZCBwYXJzZXIgZXJyb3JcIjtcblx0IGlmKGhhc0V2ZW50TGlzdGVuZXIoTG9hZGVyRXZlbnQuREVQRU5ERU5DWV9FUlJPUikpe1xuXHQgdmFyIHJlOkxvYWRlckV2ZW50ID0gbmV3IExvYWRlckV2ZW50KExvYWRlckV2ZW50LkRFUEVOREVOQ1lfRVJST1IsIFwiXCIpO1xuXHQgZGlzcGF0Y2hFdmVudChyZSk7XG5cdCB9IGVsc2V7XG5cdCB0aHJvdyBuZXcgRXJyb3IobXNnKTtcblx0IH1cblx0IH1cblx0ICovXG5cblx0cHJpdmF0ZSBvbkFzc2V0UmVuYW1lKGV2ZW50OkFzc2V0RXZlbnQpXG5cdHtcblx0XHR2YXIgYXNzZXQ6SUFzc2V0ID0gPElBc3NldCA+IGV2ZW50LnRhcmdldDsvLyBUT0RPOiB3YXMgZXYuY3VycmVudFRhcmdldCAtIHdhdGNoIHRoaXMgdmFyXG5cdFx0dmFyIG9sZDpJQXNzZXQgPSB0aGlzLmdldEFzc2V0KGFzc2V0LmFzc2V0TmFtZXNwYWNlLCBhc3NldC5uYW1lKTtcblxuXHRcdGlmIChvbGQgIT0gbnVsbCkge1xuXHRcdFx0dGhpcy5fc3RyYXRlZ3kucmVzb2x2ZUNvbmZsaWN0KGFzc2V0LCBvbGQsIHRoaXMuX2Fzc2V0RGljdGlvbmFyeVthc3NldC5hc3NldE5hbWVzcGFjZV0sIHRoaXMuX3N0cmF0ZWd5UHJlZmVyZW5jZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBkaWN0Ok9iamVjdCA9IHRoaXMuX2Fzc2V0RGljdGlvbmFyeVtldmVudC5hc3NldC5hc3NldE5hbWVzcGFjZV07XG5cblx0XHRcdGlmIChkaWN0ID09IG51bGwpXG5cdFx0XHRcdHJldHVybjtcblxuXHRcdFx0ZGljdFtldmVudC5hc3NldFByZXZOYW1lXSA9IG51bGw7XG5cdFx0XHRkaWN0W2V2ZW50LmFzc2V0Lm5hbWVdID0gZXZlbnQuYXNzZXQ7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBvbkFzc2V0Q29uZmxpY3RSZXNvbHZlZChldmVudDpBc3NldEV2ZW50KVxuXHR7XG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50LmNsb25lKCkpO1xuXHR9XG59XG5cbmV4cG9ydCA9IEFzc2V0TGlicmFyeUJ1bmRsZTsiXX0= \ No newline at end of file diff --git a/lib/core/library/AssetLibraryBundle.ts b/lib/core/library/AssetLibraryBundle.ts new file mode 100644 index 00000000..b45ae384 --- /dev/null +++ b/lib/core/library/AssetLibraryBundle.ts @@ -0,0 +1,607 @@ +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import AssetLibrary = require("awayjs-core/lib/core/library/AssetLibrary"); +import AssetLibraryIterator = require("awayjs-core/lib/core/library/AssetLibraryIterator"); +import AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); +import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); +import AssetLoaderContext = require("awayjs-core/lib/core/library/AssetLoaderContext"); +import ConflictPrecedence = require("awayjs-core/lib/core/library/ConflictPrecedence"); +import ConflictStrategy = require("awayjs-core/lib/core/library/ConflictStrategy"); +import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import Error = require("awayjs-core/lib/errors/Error"); +import AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +import IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +import LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + +/** + * AssetLibraryBundle enforces a multiton pattern and is not intended to be instanced directly. + * Its purpose is to create a container for 3D data management, both before and after parsing. + * If you are interested in creating multiple library bundles, please use the getInstance() method. + */ +class AssetLibraryBundle extends EventDispatcher +{ + public static _iInstances:Object = new Object(); + + private _loadingSessions:Array; + private _strategy:ConflictStrategyBase; + private _strategyPreference:string; + private _assets:Array; + private _assetDictionary:Object; + private _assetDictDirty:boolean; + private _loadingSessionsGarbage:Array = new Array(); + private _gcTimeoutIID:number; + + private _onAssetRenameDelegate:(event:AssetEvent) => void; + private _onAssetConflictResolvedDelegate:(event:AssetEvent) => void; + private _onResourceCompleteDelegate:(event:LoaderEvent) => void; + private _onTextureSizeErrorDelegate:(event:AssetEvent) => void; + private _onAssetCompleteDelegate:(event:AssetEvent) => void; + private _onLoadErrorDelegate:(event:IOErrorEvent) => boolean; + private _onParseErrorDelegate:(event:ParserEvent) => boolean; + + /** + * Creates a new AssetLibraryBundle object. + * + * @param me A multiton enforcer for the AssetLibraryBundle ensuring it cannnot be instanced. + */ + constructor() + { + super(); + + this._assets = new Array();//new Vector.; + this._assetDictionary = new Object(); + this._loadingSessions = new Array(); + + this.conflictStrategy = ConflictStrategy.IGNORE.create(); + this.conflictPrecedence = ConflictPrecedence.FAVOR_NEW; + + this._onAssetRenameDelegate = (event:AssetEvent) => this.onAssetRename(event); + this._onAssetConflictResolvedDelegate = (event:AssetEvent) => this.onAssetConflictResolved(event); + this._onResourceCompleteDelegate = (event:LoaderEvent) => this.onResourceComplete(event); + this._onTextureSizeErrorDelegate = (event:AssetEvent) => this.onTextureSizeError(event); + this._onAssetCompleteDelegate = (event:AssetEvent) => this.onAssetComplete(event); + this._onLoadErrorDelegate = (event:IOErrorEvent) => this.onLoadError(event); + this._onParseErrorDelegate = (event:ParserEvent) => this.onParseError(event); + } + + /** + * Returns an AssetLibraryBundle instance. If no key is given, returns the default bundle instance (which is + * similar to using the AssetLibraryBundle as a singleton.) To keep several separated library bundles, + * pass a string key to this method to define which bundle should be returned. This is + * referred to as using the AssetLibrary as a multiton. + * + * @param key Defines which multiton instance should be returned. + * @return An instance of the asset library + */ + public static getInstance(key:string = 'default'):AssetLibraryBundle + { + if (!key) + key = 'default'; + + if (!AssetLibraryBundle._iInstances.hasOwnProperty(key)) + AssetLibraryBundle._iInstances[key] = new AssetLibraryBundle(); + + return AssetLibraryBundle._iInstances[key]; + + } + + /** + * + */ + public enableParser(parserClass:Object) + { + AssetLoader.enableParser(parserClass); + } + + /** + * + */ + public enableParsers(parserClasses:Object[]) + { + AssetLoader.enableParsers(parserClasses); + } + + /** + * Defines which strategy should be used for resolving naming conflicts, when two library + * assets are given the same name. By default, ConflictStrategy.APPEND_NUM_SUFFIX + * is used which means that a numeric suffix is appended to one of the assets. The + * conflictPrecedence property defines which of the two conflicting assets will + * be renamed. + * + * @see naming.ConflictStrategy + * @see AssetLibrary.conflictPrecedence + */ + public get conflictStrategy():ConflictStrategyBase + { + return this._strategy; + } + + public set conflictStrategy(val:ConflictStrategyBase) + { + + if (!val) + throw new Error('namingStrategy must not be null. To ignore naming, use AssetLibrary.IGNORE'); + + this._strategy = val.create(); + + } + + /** + * Defines which asset should have precedence when resolving a naming conflict between + * two assets of which one has just been renamed by the user or by a parser. By default + * ConflictPrecedence.FAVOR_NEW is used, meaning that the newly renamed + * asset will keep it's new name while the older asset gets renamed to not conflict. + * + * This property is ignored for conflict strategies that do not actually rename an + * asset automatically, such as ConflictStrategy.IGNORE and ConflictStrategy.THROW_ERROR. + * + * @see away.library.ConflictPrecedence + * @see away.library.ConflictStrategy + */ + public get conflictPrecedence():string + { + return this._strategyPreference; + } + + public set conflictPrecedence(val:string) + { + this._strategyPreference = val; + } + + /** + * Create an AssetLibraryIterator instance that can be used to iterate over the assets + * in this asset library instance. The iterator can filter assets on asset type and/or + * namespace. A "null" filter value means no filter of that type is used. + * + * @param assetTypeFilter Asset type to filter on (from the AssetType enum class.) Use + * null to not filter on asset type. + * @param namespaceFilter Namespace to filter on. Use null to not filter on namespace. + * @param filterFunc Callback function to use when deciding whether an asset should be + * included in the iteration or not. This needs to be a function that takes a single + * parameter of type IAsset and returns a boolean where true means it should be included. + * + * @see away.library.AssetType + */ + public createIterator(assetTypeFilter:string = null, namespaceFilter:string = null, filterFunc = null):AssetLibraryIterator + { + return new AssetLibraryIterator(this._assets, assetTypeFilter, namespaceFilter, filterFunc); + } + + /** + * Loads a file and (optionally) all of its dependencies. + * + * @param req The URLRequest object containing the URL of the file to be loaded. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + * @return A handle to the retrieved resource. + */ + public load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken + { + var loader:AssetLoader = new AssetLoader(); + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + this._loadingSessions.push(loader); + + loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + loader._iAddErrorHandler(this._onLoadErrorDelegate); + loader._iAddParseErrorHandler(this._onParseErrorDelegate); + + return loader.load(req, context, ns, parser); + } + + /** + * Loads a resource from existing data in memory. + * + * @param data The data object containing all resource information. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + * @return A handle to the retrieved resource. + */ + public loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken + { + var loader:AssetLoader = new AssetLoader(); + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + this._loadingSessions.push(loader); + + loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + // Error are handled separately (see documentation for addErrorHandler) + loader._iAddErrorHandler(this._onLoadErrorDelegate); + loader._iAddParseErrorHandler(this._onParseErrorDelegate); + + return loader.loadData(data, '', context, ns, parser); + } + + /** + * + */ + public getAsset(name:string, ns:string = null):IAsset + { + //var asset : IAsset; + + if (this._assetDictDirty) + this.rehashAssetDict(); + + if (ns == null) + ns = NamedAssetBase.DEFAULT_NAMESPACE; + + if (!this._assetDictionary.hasOwnProperty(ns)) + return null; + + return this._assetDictionary[ns][name]; + + } + + /** + * Adds an asset to the asset library, first making sure that it's name is unique + * using the method defined by the conflictStrategy and + * conflictPrecedence properties. + */ + public addAsset(asset:IAsset) + { + var ns:string; + var old:IAsset; + + // Bail if asset has already been added. + if (this._assets.indexOf(asset) >= 0) + return; + + old = this.getAsset(asset.name, asset.assetNamespace); + ns = asset.assetNamespace || NamedAssetBase.DEFAULT_NAMESPACE; + + if (old != null) + this._strategy.resolveConflict(asset, old, this._assetDictionary[ns], this._strategyPreference); + + //create unique-id (for now this is used in AwayBuilder only + //asset.id = IDUtil.createUID(); + + // Add it + this._assets.push(asset); + + if (!this._assetDictionary.hasOwnProperty(ns)) + this._assetDictionary[ns] = new Object(); + + this._assetDictionary[ns][asset.name] = asset; + + asset.addEventListener(AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); + asset.addEventListener(AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); + } + + /** + * Removes an asset from the library, and optionally disposes that asset by calling + * it's disposeAsset() method (which for most assets is implemented as a default + * version of that type's dispose() method. + * + * @param asset The asset which should be removed from this library. + * @param dispose Defines whether the assets should also be disposed. + */ + public removeAsset(asset:IAsset, dispose:boolean = true) + { + var idx:number; + + this.removeAssetFromDict(asset); + + asset.removeEventListener(AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); + asset.removeEventListener(AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); + + idx = this._assets.indexOf(asset); + + if (idx >= 0) + this._assets.splice(idx, 1); + + if (dispose) + asset.dispose(); + } + + /** + * Removes an asset which is specified using name and namespace. + * + * @param name The name of the asset to be removed. + * @param ns The namespace to which the desired asset belongs. + * @param dispose Defines whether the assets should also be disposed. + * + * @see away.library.AssetLibrary.removeAsset() + */ + public removeAssetByName(name:string, ns:string = null, dispose:boolean = true):IAsset + { + + var asset:IAsset = this.getAsset(name, ns); + + if (asset) + this.removeAsset(asset, dispose); + + return asset; + } + + /** + * Removes all assets from the asset library, optionally disposing them as they + * are removed. + * + * @param dispose Defines whether the assets should also be disposed. + */ + public removeAllAssets(dispose:boolean = true) + { + if (dispose) { + var asset:IAsset; + + for (var c:number = 0; c < this._assets.length; c++) { + asset = this._assets[ c ]; + asset.dispose(); + } + /* + for each (asset in _assets) + asset.dispose(); + */ + } + + this._assets.length = 0; + this.rehashAssetDict(); + } + + /** + * Removes all assets belonging to a particular namespace (null for default) + * from the asset library, and optionall disposes them by calling their + * disposeAsset() method. + * + * @param ns The namespace from which all assets should be removed. + * @param dispose Defines whether the assets should also be disposed. + * + * @see away.library.AssetLibrary.removeAsset() + */ + public removeNamespaceAssets(ns:string = null, dispose:boolean = true) + { + var idx:number = 0; + var asset:IAsset; + var old_assets:IAsset[]; + + // Empty the assets vector after having stored a copy of it. + // The copy will be filled with all assets which weren't removed. + old_assets = this._assets.concat(); + this._assets.length = 0; + + if (ns == null) + ns = NamedAssetBase.DEFAULT_NAMESPACE; + + for (var d:number = 0; d < old_assets.length; d++) { + asset = old_assets[d]; + + // Remove from dict if in the supplied namespace. If not, + // transfer over to the new vector. + if (asset.assetNamespace == ns) { + if (dispose) + asset.dispose(); + + // Remove asset from dictionary, but don't try to auto-remove + // the namespace, which will trigger an unnecessarily expensive + // test that is not needed since we know that the namespace + // will be empty when loop finishes. + this.removeAssetFromDict(asset, false); + } else { + this._assets[idx++] = asset; + } + } + + /* + for each (asset in old_assets) { + // Remove from dict if in the supplied namespace. If not, + // transfer over to the new vector. + if (asset.assetNamespace == ns) { + if (dispose) + asset.dispose(); + + // Remove asset from dictionary, but don't try to auto-remove + // the namespace, which will trigger an unnecessarily expensive + // test that is not needed since we know that the namespace + // will be empty when loop finishes. + removeAssetFromDict(asset, false); + } else + _assets[idx++] = asset; + + } + */ + + // Remove empty namespace + if (this._assetDictionary.hasOwnProperty(ns)) + delete this._assetDictionary[ns]; + } + + private removeAssetFromDict(asset:IAsset, autoRemoveEmptyNamespace:boolean = true) + { + if (this._assetDictDirty) + this.rehashAssetDict(); + + if (this._assetDictionary.hasOwnProperty(asset.assetNamespace)) { + if (this._assetDictionary[asset.assetNamespace].hasOwnProperty(asset.name)) + delete this._assetDictionary[asset.assetNamespace][asset.name]; + + if (autoRemoveEmptyNamespace) { + + var key:string; + var empty:boolean = true; + + for (key in this._assetDictionary[asset.assetNamespace]) { + empty = false; + break; + } + + if (empty) + delete this._assetDictionary[asset.assetNamespace]; + } + } + } + + public stopAllLoadingSessions() + { + var i:number; + + if (!this._loadingSessions) + this._loadingSessions = new Array(); + + var length:number = this._loadingSessions.length; + + for (i = 0; i < length; i++) + this.killLoadingSession(this._loadingSessions[i]); + + this._loadingSessions = null; + } + + private rehashAssetDict() + { + var asset:IAsset; + + this._assetDictionary = {}; + + var l:number = this._assets.length; + + for (var c:number = 0; c < l; c++) { + asset = this._assets[c]; + + if (!this._assetDictionary.hasOwnProperty(asset.assetNamespace)) + this._assetDictionary[asset.assetNamespace] = {}; + + this._assetDictionary[asset.assetNamespace][asset.name] = asset; + + } + + this._assetDictDirty = false; + + } + + /** + * Called when a an error occurs during loading. + */ + private onLoadError(event:IOErrorEvent):boolean + { + if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + } + + /** + * Called when a an error occurs during parsing. + */ + private onParseError(event:ParserEvent):boolean + { + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + return true; + } else { + return false; + } + } + + private onAssetComplete(event:AssetEvent) + { + // Only add asset to library the first time. + if (event.type == AssetEvent.ASSET_COMPLETE) + this.addAsset(event.asset); + + this.dispatchEvent(event); + + } + + private onTextureSizeError(event:AssetEvent) + { + this.dispatchEvent(event); + } + + /** + * Called when the resource and all of its dependencies was retrieved. + */ + private onResourceComplete(event:LoaderEvent) + { + var loader:AssetLoader = event.target; + + this.dispatchEvent(event); + + var index:number = this._loadingSessions.indexOf(loader); + this._loadingSessions.splice(index, 1); + + // Add loader to a garbage array - for a collection sweep and kill + this._loadingSessionsGarbage.push(loader); + this._gcTimeoutIID = setTimeout(() => {this.loadingSessionGC()}, 100); + } + + private loadingSessionGC():void + { + var loader:AssetLoader; + + while (this._loadingSessionsGarbage.length > 0) { + loader = this._loadingSessionsGarbage.pop(); + this.killLoadingSession(loader); + } + + clearTimeout(this._gcTimeoutIID); + this._gcTimeoutIID = null; + + } + + private killLoadingSession(loader:AssetLoader) + { + loader.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); + loader.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + loader.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + loader.stop(); + } + + /** + * Called when unespected error occurs + */ + /* + private onResourceError() : void + { + var msg:string = "Unexpected parser error"; + if(hasEventListener(LoaderEvent.DEPENDENCY_ERROR)){ + var re:LoaderEvent = new LoaderEvent(LoaderEvent.DEPENDENCY_ERROR, ""); + dispatchEvent(re); + } else{ + throw new Error(msg); + } + } + */ + + private onAssetRename(event:AssetEvent) + { + var asset:IAsset = event.target;// TODO: was ev.currentTarget - watch this var + var old:IAsset = this.getAsset(asset.assetNamespace, asset.name); + + if (old != null) { + this._strategy.resolveConflict(asset, old, this._assetDictionary[asset.assetNamespace], this._strategyPreference); + } else { + var dict:Object = this._assetDictionary[event.asset.assetNamespace]; + + if (dict == null) + return; + + dict[event.assetPrevName] = null; + dict[event.asset.name] = event.asset; + } + } + + private onAssetConflictResolved(event:AssetEvent) + { + this.dispatchEvent(event.clone()); + } +} + +export = AssetLibraryBundle; \ No newline at end of file diff --git a/lib/core/library/AssetLibraryIterator.js b/lib/core/library/AssetLibraryIterator.js new file mode 100755 index 00000000..508f0697 --- /dev/null +++ b/lib/core/library/AssetLibraryIterator.js @@ -0,0 +1,95 @@ +var AssetLibraryIterator = (function () { + function AssetLibraryIterator(assets, assetTypeFilter, namespaceFilter, filterFunc) { + this._assets = assets; + this.filter(assetTypeFilter, namespaceFilter, filterFunc); + } + Object.defineProperty(AssetLibraryIterator.prototype, "currentAsset", { + get: function () { + // Return current, or null if no current + return (this._idx < this._filtered.length) ? this._filtered[this._idx] : null; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(AssetLibraryIterator.prototype, "numAssets", { + get: function () { + return this._filtered.length; + }, + enumerable: true, + configurable: true + }); + + AssetLibraryIterator.prototype.next = function () { + var next = null; + + if (this._idx < this._filtered.length) + next = this._filtered[this._idx]; + + this._idx++; + + return next; + }; + + AssetLibraryIterator.prototype.reset = function () { + this._idx = 0; + }; + + AssetLibraryIterator.prototype.setIndex = function (index) { + this._idx = index; + }; + + AssetLibraryIterator.prototype.filter = function (assetTypeFilter, namespaceFilter, filterFunc) { + if (assetTypeFilter || namespaceFilter) { + var idx; + var asset; + + idx = 0; + this._filtered = new Array(); //new Vector.; + + var l = this._assets.length; + + for (var c = 0; c < l; c++) { + asset = this._assets[c]; + + // Skip this assets if filtering on type and this is wrong type + if (assetTypeFilter && asset.assetType != assetTypeFilter) + continue; + + // Skip this asset if filtering on namespace and this is wrong namespace + if (namespaceFilter && asset.assetNamespace != namespaceFilter) + continue; + + // Skip this asset if a filter func has been provided and it returns false + if (filterFunc != null && !filterFunc(asset)) + continue; + + this._filtered[idx++] = asset; + } + /* + for each (asset in _assets) { + // Skip this assets if filtering on type and this is wrong type + if (assetTypeFilter && asset.assetType != assetTypeFilter) + continue; + + // Skip this asset if filtering on namespace and this is wrong namespace + if (namespaceFilter && asset.assetNamespace != namespaceFilter) + continue; + + // Skip this asset if a filter func has been provided and it returns false + if (filterFunc != null && !filterFunc(asset)) + continue; + + _filtered[idx++] = asset; + } + */ + } else { + this._filtered = this._assets; + } + }; + return AssetLibraryIterator; +})(); + +module.exports = AssetLibraryIterator; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Bc3NldExpYnJhcnlJdGVyYXRvci50cyJdLCJuYW1lcyI6WyJBc3NldExpYnJhcnlJdGVyYXRvciIsIkFzc2V0TGlicmFyeUl0ZXJhdG9yLmNvbnN0cnVjdG9yIiwiQXNzZXRMaWJyYXJ5SXRlcmF0b3IubmV4dCIsIkFzc2V0TGlicmFyeUl0ZXJhdG9yLnJlc2V0IiwiQXNzZXRMaWJyYXJ5SXRlcmF0b3Iuc2V0SW5kZXgiLCJBc3NldExpYnJhcnlJdGVyYXRvci5maWx0ZXIiXSwibWFwcGluZ3MiOiJBQUFBO0lBVUNBLDhCQUFZQSxNQUFvQkEsRUFBRUEsZUFBc0JBLEVBQUVBLGVBQXNCQSxFQUFFQSxVQUFVQTtRQUUzRkMsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsTUFBTUE7UUFDckJBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLGVBQWVBLEVBQUVBLGVBQWVBLEVBQUVBLFVBQVVBLENBQUNBO0lBQzFEQSxDQUFDQTtJQUVERDtRQUFBQSxLQUFBQTtZQUVDQSx3Q0FBd0NBO1lBQ3hDQSxPQUFPQSxDQUFFQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxNQUFNQSxDQUFFQSxHQUFFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFFQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFFQSxHQUFHQSxJQUFJQTtRQUNqRkEsQ0FBQ0E7Ozs7QUFBQUE7SUFFREE7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUE7UUFDN0JBLENBQUNBOzs7O0FBQUFBO0lBRURBLHNDQUFBQTtRQUVDRSxJQUFJQSxJQUFJQSxHQUFVQSxJQUFJQTs7UUFFdEJBLElBQUlBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BO1lBQ3BDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTs7UUFFbENBLElBQUlBLENBQUNBLElBQUlBLEVBQUVBOztRQUVYQSxPQUFPQSxJQUFJQTtJQUNaQSxDQUFDQTs7SUFFREYsdUNBQUFBO1FBRUNHLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBO0lBQ2RBLENBQUNBOztJQUVESCwwQ0FBQUEsVUFBZ0JBLEtBQVlBO1FBRTNCSSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxLQUFLQTtJQUNsQkEsQ0FBQ0E7O0lBRURKLHdDQUFBQSxVQUFlQSxlQUFzQkEsRUFBRUEsZUFBc0JBLEVBQUVBLFVBQVVBO1FBRXhFSyxJQUFJQSxlQUFlQSxJQUFJQSxlQUFlQSxDQUFFQTtZQUV2Q0EsSUFBSUEsR0FBR0E7WUFDUEEsSUFBSUEsS0FBS0E7O1lBR1RBLEdBQUdBLEdBQUdBLENBQUNBO1lBQ1BBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLENBQUNBLEVBQUNBLHNCQUFzQkE7O1lBRTNEQSxJQUFJQSxDQUFDQSxHQUFVQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQTs7WUFFbENBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUVBO2dCQUVsQ0EsS0FBS0EsR0FBWUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O2dCQUVoQ0EsK0RBQStEQTtnQkFDL0RBLElBQUlBLGVBQWVBLElBQUlBLEtBQUtBLENBQUNBLFNBQVNBLElBQUlBLGVBQWVBO29CQUN4REEsUUFBU0EsQ0FBQUE7O2dCQUVWQSx3RUFBd0VBO2dCQUN4RUEsSUFBSUEsZUFBZUEsSUFBSUEsS0FBS0EsQ0FBQ0EsY0FBY0EsSUFBSUEsZUFBZUE7b0JBQzdEQSxRQUFTQSxDQUFBQTs7Z0JBRVZBLDBFQUEwRUE7Z0JBQzFFQSxJQUFJQSxVQUFVQSxJQUFJQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQTtvQkFDM0NBLFFBQVNBLENBQUFBOztnQkFFVkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsR0FBR0EsS0FBS0E7YUFFN0JBO1lBRURBOzs7Ozs7Ozs7Ozs7Ozs7O2NBZ0JHQTtTQUVIQSxLQUFNQTtZQUNOQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQTtTQUM3QkE7SUFDRkEsQ0FBQ0E7SUFDRkwsNEJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQscUNBQThCLENBQUEiLCJmaWxlIjoiY29yZS9saWJyYXJ5L0Fzc2V0TGlicmFyeUl0ZXJhdG9yLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElBc3NldFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0lBc3NldFwiKTtcblxuY2xhc3MgQXNzZXRMaWJyYXJ5SXRlcmF0b3JcbntcblxuXHRwcml2YXRlICBfYXNzZXRzOkFycmF5PElBc3NldD47XG5cdHByaXZhdGUgX2ZpbHRlcmVkOkFycmF5PElBc3NldD47XG5cblx0cHJpdmF0ZSBfaWR4Om51bWJlcjtcblxuXHRjb25zdHJ1Y3Rvcihhc3NldHM6QXJyYXk8SUFzc2V0PiwgYXNzZXRUeXBlRmlsdGVyOnN0cmluZywgbmFtZXNwYWNlRmlsdGVyOnN0cmluZywgZmlsdGVyRnVuYylcblx0e1xuXHRcdHRoaXMuX2Fzc2V0cyA9IGFzc2V0cztcblx0XHR0aGlzLmZpbHRlcihhc3NldFR5cGVGaWx0ZXIsIG5hbWVzcGFjZUZpbHRlciwgZmlsdGVyRnVuYyk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGN1cnJlbnRBc3NldCgpOklBc3NldFxuXHR7XG5cdFx0Ly8gUmV0dXJuIGN1cnJlbnQsIG9yIG51bGwgaWYgbm8gY3VycmVudFxuXHRcdHJldHVybiAoIHRoaXMuX2lkeCA8IHRoaXMuX2ZpbHRlcmVkLmxlbmd0aCApPyB0aGlzLl9maWx0ZXJlZFsgdGhpcy5faWR4IF0gOiBudWxsO1xuXHR9XG5cblx0cHVibGljIGdldCBudW1Bc3NldHMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9maWx0ZXJlZC5sZW5ndGg7XG5cdH1cblxuXHRwdWJsaWMgbmV4dCgpOklBc3NldFxuXHR7XG5cdFx0dmFyIG5leHQ6SUFzc2V0ID0gbnVsbDtcblxuXHRcdGlmICh0aGlzLl9pZHggPCB0aGlzLl9maWx0ZXJlZC5sZW5ndGgpXG5cdFx0XHRuZXh0ID0gdGhpcy5fZmlsdGVyZWRbdGhpcy5faWR4XTtcblxuXHRcdHRoaXMuX2lkeCsrO1xuXG5cdFx0cmV0dXJuIG5leHQ7XG5cdH1cblxuXHRwdWJsaWMgcmVzZXQoKVxuXHR7XG5cdFx0dGhpcy5faWR4ID0gMDtcblx0fVxuXG5cdHB1YmxpYyBzZXRJbmRleChpbmRleDpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9pZHggPSBpbmRleDtcblx0fVxuXG5cdHByaXZhdGUgZmlsdGVyKGFzc2V0VHlwZUZpbHRlcjpzdHJpbmcsIG5hbWVzcGFjZUZpbHRlcjpzdHJpbmcsIGZpbHRlckZ1bmMpXG5cdHtcblx0XHRpZiAoYXNzZXRUeXBlRmlsdGVyIHx8IG5hbWVzcGFjZUZpbHRlcikge1xuXG5cdFx0XHR2YXIgaWR4Om51bWJlcjtcblx0XHRcdHZhciBhc3NldDpJQXNzZXQ7XG5cblxuXHRcdFx0aWR4ID0gMDtcblx0XHRcdHRoaXMuX2ZpbHRlcmVkID0gbmV3IEFycmF5PElBc3NldD4oKTsvL25ldyBWZWN0b3IuPElBc3NldD47XG5cblx0XHRcdHZhciBsOm51bWJlciA9IHRoaXMuX2Fzc2V0cy5sZW5ndGg7XG5cblx0XHRcdGZvciAodmFyIGM6bnVtYmVyID0gMDsgYyA8IGw7IGMrKykge1xuXG5cdFx0XHRcdGFzc2V0ID0gPElBc3NldD4gdGhpcy5fYXNzZXRzW2NdO1xuXG5cdFx0XHRcdC8vIFNraXAgdGhpcyBhc3NldHMgaWYgZmlsdGVyaW5nIG9uIHR5cGUgYW5kIHRoaXMgaXMgd3JvbmcgdHlwZVxuXHRcdFx0XHRpZiAoYXNzZXRUeXBlRmlsdGVyICYmIGFzc2V0LmFzc2V0VHlwZSAhPSBhc3NldFR5cGVGaWx0ZXIpXG5cdFx0XHRcdFx0Y29udGludWU7XG5cblx0XHRcdFx0Ly8gU2tpcCB0aGlzIGFzc2V0IGlmIGZpbHRlcmluZyBvbiBuYW1lc3BhY2UgYW5kIHRoaXMgaXMgd3JvbmcgbmFtZXNwYWNlXG5cdFx0XHRcdGlmIChuYW1lc3BhY2VGaWx0ZXIgJiYgYXNzZXQuYXNzZXROYW1lc3BhY2UgIT0gbmFtZXNwYWNlRmlsdGVyKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdC8vIFNraXAgdGhpcyBhc3NldCBpZiBhIGZpbHRlciBmdW5jIGhhcyBiZWVuIHByb3ZpZGVkIGFuZCBpdCByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmIChmaWx0ZXJGdW5jICE9IG51bGwgJiYgIWZpbHRlckZ1bmMoYXNzZXQpKVxuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXG5cdFx0XHRcdHRoaXMuX2ZpbHRlcmVkW2lkeCsrXSA9IGFzc2V0O1xuXG5cdFx0XHR9XG5cblx0XHRcdC8qXG5cdFx0XHQgZm9yIGVhY2ggKGFzc2V0IGluIF9hc3NldHMpIHtcblx0XHRcdCAvLyBTa2lwIHRoaXMgYXNzZXRzIGlmIGZpbHRlcmluZyBvbiB0eXBlIGFuZCB0aGlzIGlzIHdyb25nIHR5cGVcblx0XHRcdCBpZiAoYXNzZXRUeXBlRmlsdGVyICYmIGFzc2V0LmFzc2V0VHlwZSAhPSBhc3NldFR5cGVGaWx0ZXIpXG5cdFx0XHQgY29udGludWU7XG5cblx0XHRcdCAvLyBTa2lwIHRoaXMgYXNzZXQgaWYgZmlsdGVyaW5nIG9uIG5hbWVzcGFjZSBhbmQgdGhpcyBpcyB3cm9uZyBuYW1lc3BhY2Vcblx0XHRcdCBpZiAobmFtZXNwYWNlRmlsdGVyICYmIGFzc2V0LmFzc2V0TmFtZXNwYWNlICE9IG5hbWVzcGFjZUZpbHRlcilcblx0XHRcdCBjb250aW51ZTtcblxuXHRcdFx0IC8vIFNraXAgdGhpcyBhc3NldCBpZiBhIGZpbHRlciBmdW5jIGhhcyBiZWVuIHByb3ZpZGVkIGFuZCBpdCByZXR1cm5zIGZhbHNlXG5cdFx0XHQgaWYgKGZpbHRlckZ1bmMgIT0gbnVsbCAmJiAhZmlsdGVyRnVuYyhhc3NldCkpXG5cdFx0XHQgY29udGludWU7XG5cblx0XHRcdCBfZmlsdGVyZWRbaWR4KytdID0gYXNzZXQ7XG5cdFx0XHQgfVxuXHRcdFx0ICovXG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fZmlsdGVyZWQgPSB0aGlzLl9hc3NldHM7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCA9IEFzc2V0TGlicmFyeUl0ZXJhdG9yOyJdfQ== \ No newline at end of file diff --git a/lib/core/library/AssetLibraryIterator.ts b/lib/core/library/AssetLibraryIterator.ts new file mode 100644 index 00000000..3cda5616 --- /dev/null +++ b/lib/core/library/AssetLibraryIterator.ts @@ -0,0 +1,107 @@ +import IAsset = require("awayjs-core/lib/core/library/IAsset"); + +class AssetLibraryIterator +{ + + private _assets:Array; + private _filtered:Array; + + private _idx:number; + + constructor(assets:Array, assetTypeFilter:string, namespaceFilter:string, filterFunc) + { + this._assets = assets; + this.filter(assetTypeFilter, namespaceFilter, filterFunc); + } + + public get currentAsset():IAsset + { + // Return current, or null if no current + return ( this._idx < this._filtered.length )? this._filtered[ this._idx ] : null; + } + + public get numAssets():number + { + return this._filtered.length; + } + + public next():IAsset + { + var next:IAsset = null; + + if (this._idx < this._filtered.length) + next = this._filtered[this._idx]; + + this._idx++; + + return next; + } + + public reset() + { + this._idx = 0; + } + + public setIndex(index:number) + { + this._idx = index; + } + + private filter(assetTypeFilter:string, namespaceFilter:string, filterFunc) + { + if (assetTypeFilter || namespaceFilter) { + + var idx:number; + var asset:IAsset; + + + idx = 0; + this._filtered = new Array();//new Vector.; + + var l:number = this._assets.length; + + for (var c:number = 0; c < l; c++) { + + asset = this._assets[c]; + + // Skip this assets if filtering on type and this is wrong type + if (assetTypeFilter && asset.assetType != assetTypeFilter) + continue; + + // Skip this asset if filtering on namespace and this is wrong namespace + if (namespaceFilter && asset.assetNamespace != namespaceFilter) + continue; + + // Skip this asset if a filter func has been provided and it returns false + if (filterFunc != null && !filterFunc(asset)) + continue; + + this._filtered[idx++] = asset; + + } + + /* + for each (asset in _assets) { + // Skip this assets if filtering on type and this is wrong type + if (assetTypeFilter && asset.assetType != assetTypeFilter) + continue; + + // Skip this asset if filtering on namespace and this is wrong namespace + if (namespaceFilter && asset.assetNamespace != namespaceFilter) + continue; + + // Skip this asset if a filter func has been provided and it returns false + if (filterFunc != null && !filterFunc(asset)) + continue; + + _filtered[idx++] = asset; + } + */ + + } else { + this._filtered = this._assets; + } + } +} + +export = AssetLibraryIterator; \ No newline at end of file diff --git a/lib/core/library/AssetLoader.js b/lib/core/library/AssetLoader.js new file mode 100755 index 00000000..97abb3f5 --- /dev/null +++ b/lib/core/library/AssetLoader.js @@ -0,0 +1,651 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); +var URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); + +var Error = require("awayjs-core/lib/errors/Error"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var Event = require("awayjs-core/lib/events/Event"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +var CubeTextureParser = require("awayjs-core/lib/parsers/CubeTextureParser"); + +var ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); +var Texture2DParser = require("awayjs-core/lib/parsers/Texture2DParser"); + +/** +* Dispatched when any asset finishes parsing. Also see specific events for each +* individual asset type (meshes, materials et c.) +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="assetComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a full resource (including dependencies) finishes loading. +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] +/** +* Dispatched when a single dependency (which may be the main file of a resource) +* finishes loading. +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] +/** +* Dispatched when an error occurs during loading. I +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="loadError", type="away3d.events.LoaderEvent")] +/** +* Dispatched when an error occurs during parsing. +* +* @eventType away.events.ParserEvent +*/ +//[Event(name="parseError", type="away3d.events.ParserEvent")] +/** +* Dispatched when an image asset dimensions are not a power of 2 +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="textureSizeError", type="away3d.events.AssetEvent")] +/** +* AssetLoader can load any file format that away.supports (or for which a third-party parser +* has been plugged in) and it's dependencies. Events are dispatched when assets are encountered +* and for when the resource (or it's dependencies) have been loaded. +* +* The AssetLoader will not make assets available in any other way than through the dispatched +* events. To store assets and make them available at any point from any module in an application, +* use the AssetLibrary to load and manage assets. +* +* @see away.library.AssetLibrary +*/ +var AssetLoader = (function (_super) { + __extends(AssetLoader, _super); + /** + * Create a new ResourceLoadSession object. + */ + function AssetLoader(materialMode) { + if (typeof materialMode === "undefined") { materialMode = 0; } + var _this = this; + _super.call(this); + + this._materialMode = materialMode; + + this._stack = new Array(); + this._errorHandlers = new Array(); + this._parseErrorHandlers = new Array(); + + this._onReadyForDependenciesDelegate = function (event) { + return _this.onReadyForDependencies(event); + }; + this._onParseCompleteDelegate = function (event) { + return _this.onParseComplete(event); + }; + this._onParseErrorDelegate = function (event) { + return _this.onParseError(event); + }; + this._onLoadCompleteDelegate = function (event) { + return _this.onLoadComplete(event); + }; + this._onLoadErrorDelegate = function (event) { + return _this.onLoadError(event); + }; + this._onTextureSizeErrorDelegate = function (event) { + return _this.onTextureSizeError(event); + }; + this._onAssetCompleteDelegate = function (event) { + return _this.onAssetComplete(event); + }; + } + /** + * Enables a specific parser. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parser The parser class to enable. + * + * @see away.parsers.Parsers + */ + AssetLoader.enableParser = function (parser) { + if (AssetLoader._parsers.indexOf(parser) < 0) + AssetLoader._parsers.push(parser); + }; + + /** + * Enables a list of parsers. + * When no specific parser is set for a loading/parsing opperation, + * AssetLoader can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parsers A Vector of parser classes to enable. + * @see away.parsers.Parsers + */ + AssetLoader.enableParsers = function (parsers) { + for (var c = 0; c < parsers.length; c++) + AssetLoader.enableParser(parsers[c]); + }; + + Object.defineProperty(AssetLoader.prototype, "baseDependency", { + /** + * Returns the base dependency of the loader + */ + get: function () { + return this._baseDependency; + }, + enumerable: true, + configurable: true + }); + + /** + * Loads a file and (optionally) all of its dependencies. + * + * @param req The URLRequest object containing the URL of the file to be loaded. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + */ + AssetLoader.prototype.load = function (req, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + if (!this._token) { + this._token = new AssetLoaderToken(this); + + this._uri = req.url = req.url.replace(/\\/g, "/"); + this._context = context; + this._namespace = ns; + + this._baseDependency = new ResourceDependency('', req, null, parser, null); + this.retrieveDependency(this._baseDependency); + + return this._token; + } + + // TODO: Throw error (already loading) + return null; + }; + + /** + * Loads a resource from already loaded data. + * + * @param data The data object containing all resource information. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + */ + AssetLoader.prototype.loadData = function (data, id, context, ns, parser) { + if (typeof context === "undefined") { context = null; } + if (typeof ns === "undefined") { ns = null; } + if (typeof parser === "undefined") { parser = null; } + if (!this._token) { + this._token = new AssetLoaderToken(this); + + this._uri = id; + this._context = context; + this._namespace = ns; + + this._baseDependency = new ResourceDependency(id, null, data, parser, null); + this.retrieveDependency(this._baseDependency); + + return this._token; + } + + // TODO: Throw error (already loading) + return null; + }; + + /** + * Recursively retrieves the next to-be-loaded and parsed dependency on the stack, or pops the list off the + * stack when complete and continues on the top set. + * @param parser The parser that will translate the data into a usable resource. + */ + AssetLoader.prototype.retrieveNext = function (parser) { + if (typeof parser === "undefined") { parser = null; } + if (this._currentDependency.dependencies.length) { + var next = this._currentDependency.dependencies.pop(); + + this._stack.push(this._currentDependency); + this.retrieveDependency(next); + } else if (this._currentDependency.parser && this._currentDependency.parser.parsingPaused) { + this._currentDependency.parser._iResumeParsingAfterDependencies(); + this._stack.pop(); + } else if (this._stack.length) { + var prev = this._currentDependency; + + this._currentDependency = this._stack.pop(); + + if (prev._iSuccess) + prev.resolve(); + + this.retrieveNext(parser); + } else { + this.dispatchEvent(new LoaderEvent(LoaderEvent.RESOURCE_COMPLETE, this._uri, this._baseDependency.parser.content, this._baseDependency.assets)); + } + }; + + /** + * Retrieves a single dependency. + * @param parser The parser that will translate the data into a usable resource. + */ + AssetLoader.prototype.retrieveDependency = function (dependency) { + var data; + + if (this._context && this._context.materialMode != 0) + this._materialMode = this._context.materialMode; + + this._currentDependency = dependency; + + dependency._iLoader = new URLLoader(); + + this.addEventListeners(dependency._iLoader); + + // Get already loaded (or mapped) data if available + data = dependency.data; + + if (this._context && dependency.request && this._context._iHasDataForUrl(dependency.request.url)) + data = this._context._iGetDataForUrl(dependency.request.url); + + if (data) { + if (data.constructor === Function) + data = new data(); + + dependency._iSetData(data); + + if (dependency.retrieveAsRawData) { + // No need to parse. The parent parser is expecting this + // to be raw data so it can be passed directly. + dependency.resolve(); + + // Move on to next dependency + this.retrieveNext(); + } else { + this.parseDependency(dependency); + } + } else { + // Resolve URL and start loading + dependency.request.url = this.resolveDependencyUrl(dependency); + + if (dependency.retrieveAsRawData) { + // Always use binary for raw data loading + dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; + } else { + if (!dependency.parser) + dependency._iSetParser(this.getParserFromSuffix(dependency.request.url)); + + if (dependency.parser) { + dependency._iLoader.dataFormat = dependency.parser.dataFormat; + } else { + // Always use BINARY for unknown file formats. The thorough + // file type check will determine format after load, and if + // binary, a text load will have broken the file data. + dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; + } + } + + dependency._iLoader.load(dependency.request); + } + }; + + AssetLoader.prototype.joinUrl = function (base, end) { + if (end.charAt(0) == '/') + end = end.substr(1); + + if (base.length == 0) + return end; + + if (base.charAt(base.length - 1) == '/') + base = base.substr(0, base.length - 1); + + return base.concat('/', end); + }; + + AssetLoader.prototype.resolveDependencyUrl = function (dependency) { + var scheme_re; + var base; + var url = dependency.request.url; + + // Has the user re-mapped this URL? + if (this._context && this._context._iHasMappingForUrl(url)) + return this._context._iGetRemappedUrl(url); + + // This is the "base" dependency, i.e. the actual requested asset. + // We will not try to resolve this since the user can probably be + // thrusted to know this URL better than our automatic resolver. :) + if (url == this._uri) + return url; + + // Absolute URL? Check if starts with slash or a URL + // scheme definition (e.g. ftp://, http://, file://) + scheme_re = new RegExp('/^[a-zA-Z]{3,4}:\/\//'); + + if (url.charAt(0) == '/') { + if (this._context && this._context.overrideAbsolutePaths) + return this.joinUrl(this._context.dependencyBaseUrl, url); + else + return url; + } else if (scheme_re.test(url)) { + // If overriding full URLs, get rid of scheme (e.g. "http://") + // and replace with the dependencyBaseUrl defined by user. + if (this._context && this._context.overrideFullURLs) { + var noscheme_url = url.replace(scheme_re, ''); + return this.joinUrl(this._context.dependencyBaseUrl, noscheme_url); + } + } + + // Since not absolute, just get rid of base file name to find it's + // folder and then concatenate dynamic URL + if (this._context && this._context.dependencyBaseUrl) { + base = this._context.dependencyBaseUrl; + return this.joinUrl(base, url); + } else { + base = this._uri.substring(0, this._uri.lastIndexOf('/') + 1); + return this.joinUrl(base, url); + } + }; + + AssetLoader.prototype.retrieveParserDependencies = function () { + if (!this._currentDependency) + return; + + var parserDependancies = this._currentDependency.parser.dependencies; + var i, len = parserDependancies.length; + + for (i = 0; i < len; i++) + this._currentDependency.dependencies[i] = parserDependancies[i]; + + // Since more dependencies might be added eventually, empty this + // list so that the same dependency isn't retrieved more than once. + parserDependancies.length = 0; + + this._stack.push(this._currentDependency); + + this.retrieveNext(); + }; + + AssetLoader.prototype.resolveParserDependencies = function () { + this._currentDependency._iSuccess = true; + + // Retrieve any last dependencies remaining on this parser, or + // if none exists, just move on. + if (this._currentDependency.parser && this._currentDependency.parser.dependencies.length && (!this._context || this._context.includeDependencies)) + this.retrieveParserDependencies(); + else + this.retrieveNext(); + }; + + /** + * Called when a single dependency loading failed, and pushes further dependencies onto the stack. + * @param event + */ + AssetLoader.prototype.onLoadError = function (event) { + var handled; + var isDependency = (this._currentDependency != this._baseDependency); + var loader = event.target; + + this.removeEventListeners(loader); + + if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { + this.dispatchEvent(event); + handled = true; + } else { + // TODO: Consider not doing this even when AssetLoader does have it's own LOAD_ERROR listener + var i, len = this._errorHandlers.length; + for (i = 0; i < len; i++) + if (!handled) + handled = this._errorHandlers[i](event); + } + + if (handled) { + //if (isDependency && ! event.isDefaultPrevented()) { + if (isDependency) { + this._currentDependency.resolveFailure(); + this.retrieveNext(); + } else { + // Either this was the base file (last left in the stack) or + // default behavior was prevented by the handlers, and hence + // there is nothing more to do than clean up and bail. + this.dispose(); + return; + } + } else { + throw new Error(); + } + }; + + /** + * Called when a dependency parsing failed, and dispatches a ParserEvent.PARSE_ERROR + * @param event + */ + AssetLoader.prototype.onParseError = function (event) { + var handled; + + var isDependency = (this._currentDependency != this._baseDependency); + + var loader = event.target; + + this.removeEventListeners(loader); + + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + handled = true; + } else { + // TODO: Consider not doing this even when AssetLoader does + // have it's own LOAD_ERROR listener + var i, len = this._parseErrorHandlers.length; + + for (i = 0; i < len; i++) + if (!handled) + handled = this._parseErrorHandlers[i](event); + } + + if (handled) { + this.dispose(); + return; + } else { + throw new Error(event.message); + } + }; + + AssetLoader.prototype.onAssetComplete = function (event) { + // Add loaded asset to list of assets retrieved as part + // of the current dependency. This list will be inspected + // by the parent parser when dependency is resolved + if (this._currentDependency) + this._currentDependency.assets.push(event.asset); + + event.asset.resetAssetPath(event.asset.name, this._namespace); + + if (!this._currentDependency.suppresAssetEvents) + this.dispatchEvent(event); + }; + + AssetLoader.prototype.onReadyForDependencies = function (event) { + var parser = event.target; + + if (this._context && !this._context.includeDependencies) + parser._iResumeParsingAfterDependencies(); + else + this.retrieveParserDependencies(); + }; + + /** + * Called when a single dependency was parsed, and pushes further dependencies onto the stack. + * @param event + */ + AssetLoader.prototype.onLoadComplete = function (event) { + var loader = event.target; + + this.removeEventListeners(loader); + + // Resolve this dependency + this._currentDependency._iSetData(loader.data); + + if (this._currentDependency.retrieveAsRawData) { + // No need to parse this data, which should be returned as is + this.resolveParserDependencies(); + } else { + this.parseDependency(this._currentDependency); + } + }; + + /** + * Called when parsing is complete. + */ + AssetLoader.prototype.onParseComplete = function (event) { + var parser = event.target; + + this.resolveParserDependencies(); //resolve in front of removing listeners to allow any remaining asset events to propagate + + parser.removeEventListener(ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); + parser.removeEventListener(ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); + parser.removeEventListener(ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); + parser.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + parser.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + }; + + /** + * Called when an image is too large or it's dimensions are not a power of 2 + * @param event + */ + AssetLoader.prototype.onTextureSizeError = function (event) { + event.asset.name = this._currentDependency.resolveName(event.asset); + + this.dispatchEvent(event); + }; + + AssetLoader.prototype.addEventListeners = function (loader) { + loader.addEventListener(Event.COMPLETE, this._onLoadCompleteDelegate); + loader.addEventListener(IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); + }; + + AssetLoader.prototype.removeEventListeners = function (loader) { + loader.removeEventListener(Event.COMPLETE, this._onLoadCompleteDelegate); + loader.removeEventListener(IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); + }; + + AssetLoader.prototype.stop = function () { + this.dispose(); + }; + + AssetLoader.prototype.dispose = function () { + this._errorHandlers = null; + this._parseErrorHandlers = null; + this._context = null; + this._token = null; + this._stack = null; + + if (this._currentDependency && this._currentDependency._iLoader) + this.removeEventListeners(this._currentDependency._iLoader); + + this._currentDependency = null; + }; + + /** + * @private + * This method is used by other loader classes (e.g. Loader3D and AssetLibraryBundle) to + * add error event listeners to the AssetLoader instance. This system is used instead of + * the regular EventDispatcher system so that the AssetLibrary error handler can be sure + * that if hasEventListener() returns true, it's client code that's listening for the + * event. Secondly, functions added as error handler through this custom method are + * expected to return a boolean value indicating whether the event was handled (i.e. + * whether they in turn had any client code listening for the event.) If no handlers + * return true, the AssetLoader knows that the event wasn't handled and will throw an RTE. + */ + AssetLoader.prototype._iAddParseErrorHandler = function (handler) { + if (this._parseErrorHandlers.indexOf(handler) < 0) + this._parseErrorHandlers.push(handler); + }; + + AssetLoader.prototype._iAddErrorHandler = function (handler) { + if (this._errorHandlers.indexOf(handler) < 0) + this._errorHandlers.push(handler); + }; + + /** + * Guesses the parser to be used based on the file contents. + * @param data The data to be parsed. + * @param uri The url or id of the object to be parsed. + * @return An instance of the guessed parser. + */ + AssetLoader.prototype.getParserFromData = function (data) { + var len = AssetLoader._parsers.length; + + for (var i = len - 1; i >= 0; i--) + if (AssetLoader._parsers[i].supportsData(data)) + return new AssetLoader._parsers[i](); + + return null; + }; + + /** + * Initiates parsing of the loaded dependency. + * + * @param The dependency to be parsed. + */ + AssetLoader.prototype.parseDependency = function (dependency) { + var parser = dependency.parser; + + // If no parser has been defined, try to find one by letting + // all plugged in parsers inspect the actual data. + if (!parser) + dependency._iSetParser(parser = this.getParserFromData(dependency.data)); + + if (parser) { + parser.addEventListener(ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); + parser.addEventListener(ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); + parser.addEventListener(ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); + parser.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + parser.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + if (dependency.request && dependency.request.url) + parser._iFileName = dependency.request.url; + + parser.materialMode = this._materialMode; + + parser.parseAsync(dependency.data); + } else { + var message = "No parser defined. To enable all parsers for auto-detection, use Parsers.enableAllBundled()"; + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message)); + else + throw new Error(message); + } + }; + + /** + * Guesses the parser to be used based on the file extension. + * @return An instance of the guessed parser. + */ + AssetLoader.prototype.getParserFromSuffix = function (url) { + // Get rid of query string if any and extract extension + var base = (url.indexOf('?') > 0) ? url.split('?')[0] : url; + var fileExtension = base.substr(base.lastIndexOf('.') + 1).toLowerCase(); + + var len = AssetLoader._parsers.length; + + for (var i = len - 1; i >= 0; i--) { + var parserClass = AssetLoader._parsers[i]; + if (parserClass.supportsType(fileExtension)) + return new parserClass(); + } + + return null; + }; + AssetLoader._parsers = new Array(Texture2DParser, CubeTextureParser); + return AssetLoader; +})(EventDispatcher); + +module.exports = AssetLoader; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Bc3NldExvYWRlci50cyJdLCJuYW1lcyI6WyJBc3NldExvYWRlciIsIkFzc2V0TG9hZGVyLmNvbnN0cnVjdG9yIiwiQXNzZXRMb2FkZXIuZW5hYmxlUGFyc2VyIiwiQXNzZXRMb2FkZXIuZW5hYmxlUGFyc2VycyIsIkFzc2V0TG9hZGVyLmxvYWQiLCJBc3NldExvYWRlci5sb2FkRGF0YSIsIkFzc2V0TG9hZGVyLnJldHJpZXZlTmV4dCIsIkFzc2V0TG9hZGVyLnJldHJpZXZlRGVwZW5kZW5jeSIsIkFzc2V0TG9hZGVyLmpvaW5VcmwiLCJBc3NldExvYWRlci5yZXNvbHZlRGVwZW5kZW5jeVVybCIsIkFzc2V0TG9hZGVyLnJldHJpZXZlUGFyc2VyRGVwZW5kZW5jaWVzIiwiQXNzZXRMb2FkZXIucmVzb2x2ZVBhcnNlckRlcGVuZGVuY2llcyIsIkFzc2V0TG9hZGVyLm9uTG9hZEVycm9yIiwiQXNzZXRMb2FkZXIub25QYXJzZUVycm9yIiwiQXNzZXRMb2FkZXIub25Bc3NldENvbXBsZXRlIiwiQXNzZXRMb2FkZXIub25SZWFkeUZvckRlcGVuZGVuY2llcyIsIkFzc2V0TG9hZGVyLm9uTG9hZENvbXBsZXRlIiwiQXNzZXRMb2FkZXIub25QYXJzZUNvbXBsZXRlIiwiQXNzZXRMb2FkZXIub25UZXh0dXJlU2l6ZUVycm9yIiwiQXNzZXRMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcnMiLCJBc3NldExvYWRlci5yZW1vdmVFdmVudExpc3RlbmVycyIsIkFzc2V0TG9hZGVyLnN0b3AiLCJBc3NldExvYWRlci5kaXNwb3NlIiwiQXNzZXRMb2FkZXIuX2lBZGRQYXJzZUVycm9ySGFuZGxlciIsIkFzc2V0TG9hZGVyLl9pQWRkRXJyb3JIYW5kbGVyIiwiQXNzZXRMb2FkZXIuZ2V0UGFyc2VyRnJvbURhdGEiLCJBc3NldExvYWRlci5wYXJzZURlcGVuZGVuY3kiLCJBc3NldExvYWRlci5nZXRQYXJzZXJGcm9tU3VmZml4Il0sIm1hcHBpbmdzIjoiOzs7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RURBLE9BQU9BLElBQUlBO0lBQ1pBLENBQUNBO0lBemxCRDNCLHVCQUFxQ0EsSUFBSUEsS0FBS0EsQ0FBTUEsZUFBZUEsRUFBRUEsaUJBQWlCQSxDQUFDQTtJQTBsQnhGQSxtQkFBQ0E7QUFBREEsQ0FBQ0EsRUFubkJ5QixlQUFlLEVBbW5CeEM7O0FBRUQsNEJBQXFCLENBQUEiLCJmaWxlIjoiY29yZS9saWJyYXJ5L0Fzc2V0TG9hZGVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgQXNzZXRMb2FkZXJDb250ZXh0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRMb2FkZXJDb250ZXh0XCIpO1xuaW1wb3J0IEFzc2V0TG9hZGVyVG9rZW5cdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TG9hZGVyVG9rZW5cIik7XG5pbXBvcnQgVVJMTG9hZGVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMTG9hZGVyXCIpO1xuaW1wb3J0IFVSTExvYWRlckRhdGFGb3JtYXRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTExvYWRlckRhdGFGb3JtYXRcIik7XG5pbXBvcnQgVVJMUmVxdWVzdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTFJlcXVlc3RcIik7XG5pbXBvcnQgRXJyb3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9FcnJvclwiKTtcbmltcG9ydCBBc3NldEV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0Fzc2V0RXZlbnRcIik7XG5pbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcbmltcG9ydCBFdmVudERpc3BhdGNoZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiKTtcbmltcG9ydCBJT0Vycm9yRXZlbnRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvSU9FcnJvckV2ZW50XCIpO1xuaW1wb3J0IExvYWRlckV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0xvYWRlckV2ZW50XCIpO1xuaW1wb3J0IFBhcnNlckV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL1BhcnNlckV2ZW50XCIpO1xuaW1wb3J0IEN1YmVUZXh0dXJlUGFyc2VyXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL0N1YmVUZXh0dXJlUGFyc2VyXCIpO1xuaW1wb3J0IFBhcnNlckJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlckJhc2VcIik7XG5pbXBvcnQgUmVzb3VyY2VEZXBlbmRlbmN5XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1Jlc291cmNlRGVwZW5kZW5jeVwiKTtcbmltcG9ydCBUZXh0dXJlMkRQYXJzZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcGFyc2Vycy9UZXh0dXJlMkRQYXJzZXJcIik7XG5cbi8qKlxuICogRGlzcGF0Y2hlZCB3aGVuIGFueSBhc3NldCBmaW5pc2hlcyBwYXJzaW5nLiBBbHNvIHNlZSBzcGVjaWZpYyBldmVudHMgZm9yIGVhY2hcbiAqIGluZGl2aWR1YWwgYXNzZXQgdHlwZSAobWVzaGVzLCBtYXRlcmlhbHMgZXQgYy4pXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJhc3NldENvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYSBmdWxsIHJlc291cmNlIChpbmNsdWRpbmcgZGVwZW5kZW5jaWVzKSBmaW5pc2hlcyBsb2FkaW5nLlxuICpcbiAqIEBldmVudFR5cGUgYXdheS5ldmVudHMuTG9hZGVyRXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cInJlc291cmNlQ29tcGxldGVcIiwgdHlwZT1cImF3YXkzZC5ldmVudHMuTG9hZGVyRXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYSBzaW5nbGUgZGVwZW5kZW5jeSAod2hpY2ggbWF5IGJlIHRoZSBtYWluIGZpbGUgb2YgYSByZXNvdXJjZSlcbiAqIGZpbmlzaGVzIGxvYWRpbmcuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Mb2FkZXJFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwiZGVwZW5kZW5jeUNvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkxvYWRlckV2ZW50XCIpXVxuXG5cbi8qKlxuICogRGlzcGF0Y2hlZCB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbG9hZGluZy4gSVxuICpcbiAqIEBldmVudFR5cGUgYXdheS5ldmVudHMuTG9hZGVyRXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cImxvYWRFcnJvclwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5Mb2FkZXJFdmVudFwiKV1cblxuXG4vKipcbiAqIERpc3BhdGNoZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHBhcnNpbmcuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5QYXJzZXJFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwicGFyc2VFcnJvclwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5QYXJzZXJFdmVudFwiKV1cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYW4gaW1hZ2UgYXNzZXQgZGltZW5zaW9ucyBhcmUgbm90IGEgcG93ZXIgb2YgMlxuICpcbiAqIEBldmVudFR5cGUgYXdheS5ldmVudHMuQXNzZXRFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwidGV4dHVyZVNpemVFcnJvclwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5Bc3NldEV2ZW50XCIpXVxuXG4vKipcbiAqIEFzc2V0TG9hZGVyIGNhbiBsb2FkIGFueSBmaWxlIGZvcm1hdCB0aGF0IGF3YXkuc3VwcG9ydHMgKG9yIGZvciB3aGljaCBhIHRoaXJkLXBhcnR5IHBhcnNlclxuICogaGFzIGJlZW4gcGx1Z2dlZCBpbikgYW5kIGl0J3MgZGVwZW5kZW5jaWVzLiBFdmVudHMgYXJlIGRpc3BhdGNoZWQgd2hlbiBhc3NldHMgYXJlIGVuY291bnRlcmVkXG4gKiBhbmQgZm9yIHdoZW4gdGhlIHJlc291cmNlIChvciBpdCdzIGRlcGVuZGVuY2llcykgaGF2ZSBiZWVuIGxvYWRlZC5cbiAqXG4gKiBUaGUgQXNzZXRMb2FkZXIgd2lsbCBub3QgbWFrZSBhc3NldHMgYXZhaWxhYmxlIGluIGFueSBvdGhlciB3YXkgdGhhbiB0aHJvdWdoIHRoZSBkaXNwYXRjaGVkXG4gKiBldmVudHMuIFRvIHN0b3JlIGFzc2V0cyBhbmQgbWFrZSB0aGVtIGF2YWlsYWJsZSBhdCBhbnkgcG9pbnQgZnJvbSBhbnkgbW9kdWxlIGluIGFuIGFwcGxpY2F0aW9uLFxuICogdXNlIHRoZSBBc3NldExpYnJhcnkgdG8gbG9hZCBhbmQgbWFuYWdlIGFzc2V0cy5cbiAqXG4gKiBAc2VlIGF3YXkubGlicmFyeS5Bc3NldExpYnJhcnlcbiAqL1xuY2xhc3MgQXNzZXRMb2FkZXIgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXJcbntcblx0cHJpdmF0ZSBfY29udGV4dDpBc3NldExvYWRlckNvbnRleHQ7XG5cdHByaXZhdGUgX3Rva2VuOkFzc2V0TG9hZGVyVG9rZW47XG5cdHByaXZhdGUgX3VyaTpzdHJpbmc7XG5cdHByaXZhdGUgX2NvbnRlbnQ6RGlzcGxheU9iamVjdDtcblx0cHJpdmF0ZSBfbWF0ZXJpYWxNb2RlOm51bWJlcjtcblxuXHRwcml2YXRlIF9lcnJvckhhbmRsZXJzOkFycmF5PEZ1bmN0aW9uPjtcblx0cHJpdmF0ZSBfcGFyc2VFcnJvckhhbmRsZXJzOkFycmF5PEZ1bmN0aW9uPjtcblxuXHRwcml2YXRlIF9zdGFjazpBcnJheTxSZXNvdXJjZURlcGVuZGVuY3k+O1xuXHRwcml2YXRlIF9iYXNlRGVwZW5kZW5jeTpSZXNvdXJjZURlcGVuZGVuY3k7XG5cdHByaXZhdGUgX2N1cnJlbnREZXBlbmRlbmN5OlJlc291cmNlRGVwZW5kZW5jeTtcblx0cHJpdmF0ZSBfbmFtZXNwYWNlOnN0cmluZztcblxuXHRwcml2YXRlIF9vblJlYWR5Rm9yRGVwZW5kZW5jaWVzRGVsZWdhdGU6KGV2ZW50OlBhcnNlckV2ZW50KSA9PiB2b2lkO1xuXHRwcml2YXRlIF9vblBhcnNlQ29tcGxldGVEZWxlZ2F0ZTooZXZlbnQ6UGFyc2VyRXZlbnQpID0+IHZvaWQ7XG5cdHByaXZhdGUgX29uUGFyc2VFcnJvckRlbGVnYXRlOihldmVudDpQYXJzZXJFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25Mb2FkQ29tcGxldGVEZWxlZ2F0ZTooZXZlbnQ6RXZlbnQpID0+IHZvaWQ7XG5cdHByaXZhdGUgX29uTG9hZEVycm9yRGVsZWdhdGU6KGV2ZW50OklPRXJyb3JFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25UZXh0dXJlU2l6ZUVycm9yRGVsZWdhdGU6KGV2ZW50OkFzc2V0RXZlbnQpID0+IHZvaWQ7XG5cdHByaXZhdGUgX29uQXNzZXRDb21wbGV0ZURlbGVnYXRlOihldmVudDpBc3NldEV2ZW50KSA9PiB2b2lkO1xuXG5cdC8vIEltYWdlIHBhcnNlciBvbmx5IHBhcnNlciB0aGF0IGlzIGFkZGVkIGJ5IGRlZmF1bHQsIHRvIHNhdmUgZmlsZSBzaXplLlxuXHRwcml2YXRlIHN0YXRpYyBfcGFyc2VyczpBcnJheTxhbnk+ID0gbmV3IEFycmF5PGFueT4oVGV4dHVyZTJEUGFyc2VyLCBDdWJlVGV4dHVyZVBhcnNlcik7XG5cblx0LyoqXG5cdCAqIEVuYWJsZXMgYSBzcGVjaWZpYyBwYXJzZXIuXG5cdCAqIFdoZW4gbm8gc3BlY2lmaWMgcGFyc2VyIGlzIHNldCBmb3IgYSBsb2FkaW5nL3BhcnNpbmcgb3BwZXJhdGlvbixcblx0ICogbG9hZGVyM2QgY2FuIGF1dG9zZWxlY3QgdGhlIGNvcnJlY3QgcGFyc2VyIHRvIHVzZS5cblx0ICogQSBwYXJzZXIgbXVzdCBoYXZlIGJlZW4gZW5hYmxlZCwgdG8gYmUgY29uc2lkZXJlZCB3aGVuIGF1dG9zZWxlY3RpbmcgdGhlIHBhcnNlci5cblx0ICpcblx0ICogQHBhcmFtIHBhcnNlciBUaGUgcGFyc2VyIGNsYXNzIHRvIGVuYWJsZS5cblx0ICpcblx0ICogQHNlZSBhd2F5LnBhcnNlcnMuUGFyc2Vyc1xuXHQgKi9cblx0cHVibGljIHN0YXRpYyBlbmFibGVQYXJzZXIocGFyc2VyKVxuXHR7XG5cdFx0aWYgKEFzc2V0TG9hZGVyLl9wYXJzZXJzLmluZGV4T2YocGFyc2VyKSA8IDApXG5cdFx0XHRBc3NldExvYWRlci5fcGFyc2Vycy5wdXNoKHBhcnNlcik7XG5cdH1cblxuXHQvKipcblx0ICogRW5hYmxlcyBhIGxpc3Qgb2YgcGFyc2Vycy5cblx0ICogV2hlbiBubyBzcGVjaWZpYyBwYXJzZXIgaXMgc2V0IGZvciBhIGxvYWRpbmcvcGFyc2luZyBvcHBlcmF0aW9uLFxuXHQgKiBBc3NldExvYWRlciBjYW4gYXV0b3NlbGVjdCB0aGUgY29ycmVjdCBwYXJzZXIgdG8gdXNlLlxuXHQgKiBBIHBhcnNlciBtdXN0IGhhdmUgYmVlbiBlbmFibGVkLCB0byBiZSBjb25zaWRlcmVkIHdoZW4gYXV0b3NlbGVjdGluZyB0aGUgcGFyc2VyLlxuXHQgKlxuXHQgKiBAcGFyYW0gcGFyc2VycyBBIFZlY3RvciBvZiBwYXJzZXIgY2xhc3NlcyB0byBlbmFibGUuXG5cdCAqIEBzZWUgYXdheS5wYXJzZXJzLlBhcnNlcnNcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZW5hYmxlUGFyc2VycyhwYXJzZXJzOkFycmF5PE9iamVjdD4pXG5cdHtcblx0XHRmb3IgKHZhciBjOm51bWJlciA9IDA7IGMgPCBwYXJzZXJzLmxlbmd0aDsgYysrKVxuXHRcdFx0QXNzZXRMb2FkZXIuZW5hYmxlUGFyc2VyKHBhcnNlcnNbIGMgXSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgYmFzZSBkZXBlbmRlbmN5IG9mIHRoZSBsb2FkZXJcblx0ICovXG5cdHB1YmxpYyBnZXQgYmFzZURlcGVuZGVuY3koKTpSZXNvdXJjZURlcGVuZGVuY3lcblx0e1xuXHRcdHJldHVybiB0aGlzLl9iYXNlRGVwZW5kZW5jeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBuZXcgUmVzb3VyY2VMb2FkU2Vzc2lvbiBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihtYXRlcmlhbE1vZGU6bnVtYmVyID0gMClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9tYXRlcmlhbE1vZGUgPSBtYXRlcmlhbE1vZGU7XG5cblx0XHR0aGlzLl9zdGFjayA9IG5ldyBBcnJheTxSZXNvdXJjZURlcGVuZGVuY3k+KCk7XG5cdFx0dGhpcy5fZXJyb3JIYW5kbGVycyA9IG5ldyBBcnJheTxGdW5jdGlvbj4oKTtcblx0XHR0aGlzLl9wYXJzZUVycm9ySGFuZGxlcnMgPSBuZXcgQXJyYXk8RnVuY3Rpb24+KCk7XG5cblx0XHR0aGlzLl9vblJlYWR5Rm9yRGVwZW5kZW5jaWVzRGVsZWdhdGUgPSAoZXZlbnQ6UGFyc2VyRXZlbnQpID0+IHRoaXMub25SZWFkeUZvckRlcGVuZGVuY2llcyhldmVudCk7XG5cdFx0dGhpcy5fb25QYXJzZUNvbXBsZXRlRGVsZWdhdGUgPSAoZXZlbnQ6UGFyc2VyRXZlbnQpID0+IHRoaXMub25QYXJzZUNvbXBsZXRlKGV2ZW50KTtcblx0XHR0aGlzLl9vblBhcnNlRXJyb3JEZWxlZ2F0ZSA9IChldmVudDpQYXJzZXJFdmVudCkgPT4gdGhpcy5vblBhcnNlRXJyb3IoZXZlbnQpO1xuXHRcdHRoaXMuX29uTG9hZENvbXBsZXRlRGVsZWdhdGUgPSAoZXZlbnQ6RXZlbnQpID0+IHRoaXMub25Mb2FkQ29tcGxldGUoZXZlbnQpO1xuXHRcdHRoaXMuX29uTG9hZEVycm9yRGVsZWdhdGUgPSAoZXZlbnQ6SU9FcnJvckV2ZW50KSA9PiB0aGlzLm9uTG9hZEVycm9yKGV2ZW50KTtcblx0XHR0aGlzLl9vblRleHR1cmVTaXplRXJyb3JEZWxlZ2F0ZSA9IChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uVGV4dHVyZVNpemVFcnJvcihldmVudCk7XG5cdFx0dGhpcy5fb25Bc3NldENvbXBsZXRlRGVsZWdhdGUgPSAoZXZlbnQ6QXNzZXRFdmVudCkgPT4gdGhpcy5vbkFzc2V0Q29tcGxldGUoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExvYWRzIGEgZmlsZSBhbmQgKG9wdGlvbmFsbHkpIGFsbCBvZiBpdHMgZGVwZW5kZW5jaWVzLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVxIFRoZSBVUkxSZXF1ZXN0IG9iamVjdCBjb250YWluaW5nIHRoZSBVUkwgb2YgdGhlIGZpbGUgdG8gYmUgbG9hZGVkLlxuXHQgKiBAcGFyYW0gY29udGV4dCBBbiBvcHRpb25hbCBjb250ZXh0IG9iamVjdCBwcm92aWRpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciBsb2FkaW5nXG5cdCAqIEBwYXJhbSBucyBBbiBvcHRpb25hbCBuYW1lc3BhY2Ugc3RyaW5nIHVuZGVyIHdoaWNoIHRoZSBmaWxlIGlzIHRvIGJlIGxvYWRlZCwgYWxsb3dpbmcgdGhlIGRpZmZlcmVudGlhdGlvbiBvZiB0d28gcmVzb3VyY2VzIHdpdGggaWRlbnRpY2FsIGFzc2V0c1xuXHQgKiBAcGFyYW0gcGFyc2VyIEFuIG9wdGlvbmFsIHBhcnNlciBvYmplY3QgZm9yIHRyYW5zbGF0aW5nIHRoZSBsb2FkZWQgZGF0YSBpbnRvIGEgdXNhYmxlIHJlc291cmNlLiBJZiBub3QgcHJvdmlkZWQsIEFzc2V0TG9hZGVyIHdpbGwgYXR0ZW1wdCB0byBhdXRvLWRldGVjdCB0aGUgZmlsZSB0eXBlLlxuXHQgKi9cblx0cHVibGljIGxvYWQocmVxOlVSTFJlcXVlc3QsIGNvbnRleHQ6QXNzZXRMb2FkZXJDb250ZXh0ID0gbnVsbCwgbnM6c3RyaW5nID0gbnVsbCwgcGFyc2VyOlBhcnNlckJhc2UgPSBudWxsKTpBc3NldExvYWRlclRva2VuXG5cdHtcblx0XHRpZiAoIXRoaXMuX3Rva2VuKSB7XG5cdFx0XHR0aGlzLl90b2tlbiA9IG5ldyBBc3NldExvYWRlclRva2VuKHRoaXMpO1xuXG5cdFx0XHR0aGlzLl91cmkgPSByZXEudXJsID0gcmVxLnVybC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKTtcblx0XHRcdHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0dGhpcy5fbmFtZXNwYWNlID0gbnM7XG5cblx0XHRcdHRoaXMuX2Jhc2VEZXBlbmRlbmN5ID0gbmV3IFJlc291cmNlRGVwZW5kZW5jeSgnJywgcmVxLCBudWxsLCBwYXJzZXIsIG51bGwpO1xuXHRcdFx0dGhpcy5yZXRyaWV2ZURlcGVuZGVuY3kodGhpcy5fYmFzZURlcGVuZGVuY3kpO1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5fdG9rZW47XG5cdFx0fVxuXG5cdFx0Ly8gVE9ETzogVGhyb3cgZXJyb3IgKGFscmVhZHkgbG9hZGluZylcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBMb2FkcyBhIHJlc291cmNlIGZyb20gYWxyZWFkeSBsb2FkZWQgZGF0YS5cblx0ICpcblx0ICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHJlc291cmNlIGluZm9ybWF0aW9uLlxuXHQgKiBAcGFyYW0gY29udGV4dCBBbiBvcHRpb25hbCBjb250ZXh0IG9iamVjdCBwcm92aWRpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciBsb2FkaW5nXG5cdCAqIEBwYXJhbSBucyBBbiBvcHRpb25hbCBuYW1lc3BhY2Ugc3RyaW5nIHVuZGVyIHdoaWNoIHRoZSBmaWxlIGlzIHRvIGJlIGxvYWRlZCwgYWxsb3dpbmcgdGhlIGRpZmZlcmVudGlhdGlvbiBvZiB0d28gcmVzb3VyY2VzIHdpdGggaWRlbnRpY2FsIGFzc2V0c1xuXHQgKiBAcGFyYW0gcGFyc2VyIEFuIG9wdGlvbmFsIHBhcnNlciBvYmplY3QgZm9yIHRyYW5zbGF0aW5nIHRoZSBsb2FkZWQgZGF0YSBpbnRvIGEgdXNhYmxlIHJlc291cmNlLiBJZiBub3QgcHJvdmlkZWQsIEFzc2V0TG9hZGVyIHdpbGwgYXR0ZW1wdCB0byBhdXRvLWRldGVjdCB0aGUgZmlsZSB0eXBlLlxuXHQgKi9cblx0cHVibGljIGxvYWREYXRhKGRhdGE6YW55LCBpZDpzdHJpbmcsIGNvbnRleHQ6QXNzZXRMb2FkZXJDb250ZXh0ID0gbnVsbCwgbnM6c3RyaW5nID0gbnVsbCwgcGFyc2VyOlBhcnNlckJhc2UgPSBudWxsKTpBc3NldExvYWRlclRva2VuXG5cdHtcblx0XHRpZiAoIXRoaXMuX3Rva2VuKSB7XG5cdFx0XHR0aGlzLl90b2tlbiA9IG5ldyBBc3NldExvYWRlclRva2VuKHRoaXMpO1xuXG5cdFx0XHR0aGlzLl91cmkgPSBpZDtcblx0XHRcdHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuXHRcdFx0dGhpcy5fbmFtZXNwYWNlID0gbnM7XG5cblx0XHRcdHRoaXMuX2Jhc2VEZXBlbmRlbmN5ID0gbmV3IFJlc291cmNlRGVwZW5kZW5jeShpZCwgbnVsbCwgZGF0YSwgcGFyc2VyLCBudWxsKTtcblx0XHRcdHRoaXMucmV0cmlldmVEZXBlbmRlbmN5KHRoaXMuX2Jhc2VEZXBlbmRlbmN5KTtcblxuXHRcdFx0cmV0dXJuIHRoaXMuX3Rva2VuO1xuXHRcdH1cblxuXHRcdC8vIFRPRE86IFRocm93IGVycm9yIChhbHJlYWR5IGxvYWRpbmcpXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogUmVjdXJzaXZlbHkgcmV0cmlldmVzIHRoZSBuZXh0IHRvLWJlLWxvYWRlZCBhbmQgcGFyc2VkIGRlcGVuZGVuY3kgb24gdGhlIHN0YWNrLCBvciBwb3BzIHRoZSBsaXN0IG9mZiB0aGVcblx0ICogc3RhY2sgd2hlbiBjb21wbGV0ZSBhbmQgY29udGludWVzIG9uIHRoZSB0b3Agc2V0LlxuXHQgKiBAcGFyYW0gcGFyc2VyIFRoZSBwYXJzZXIgdGhhdCB3aWxsIHRyYW5zbGF0ZSB0aGUgZGF0YSBpbnRvIGEgdXNhYmxlIHJlc291cmNlLlxuXHQgKi9cblx0cHJpdmF0ZSByZXRyaWV2ZU5leHQocGFyc2VyOlBhcnNlckJhc2UgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5LmRlcGVuZGVuY2llcy5sZW5ndGgpIHtcblxuXHRcdFx0dmFyIG5leHQ6UmVzb3VyY2VEZXBlbmRlbmN5ID0gdGhpcy5fY3VycmVudERlcGVuZGVuY3kuZGVwZW5kZW5jaWVzLnBvcCgpO1xuXG5cdFx0XHR0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5KTtcblx0XHRcdHRoaXMucmV0cmlldmVEZXBlbmRlbmN5KG5leHQpO1xuXG5cdFx0fSBlbHNlIGlmICh0aGlzLl9jdXJyZW50RGVwZW5kZW5jeS5wYXJzZXIgJiYgdGhpcy5fY3VycmVudERlcGVuZGVuY3kucGFyc2VyLnBhcnNpbmdQYXVzZWQpIHtcblxuXHRcdFx0dGhpcy5fY3VycmVudERlcGVuZGVuY3kucGFyc2VyLl9pUmVzdW1lUGFyc2luZ0FmdGVyRGVwZW5kZW5jaWVzKCk7XG5cdFx0XHR0aGlzLl9zdGFjay5wb3AoKTtcblxuXHRcdH0gZWxzZSBpZiAodGhpcy5fc3RhY2subGVuZ3RoKSB7XG5cblx0XHRcdHZhciBwcmV2OlJlc291cmNlRGVwZW5kZW5jeSA9IHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5O1xuXG5cdFx0XHR0aGlzLl9jdXJyZW50RGVwZW5kZW5jeSA9IHRoaXMuX3N0YWNrLnBvcCgpO1xuXG5cdFx0XHRpZiAocHJldi5faVN1Y2Nlc3MpXG5cdFx0XHRcdHByZXYucmVzb2x2ZSgpO1xuXG5cdFx0XHR0aGlzLnJldHJpZXZlTmV4dChwYXJzZXIpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgTG9hZGVyRXZlbnQoTG9hZGVyRXZlbnQuUkVTT1VSQ0VfQ09NUExFVEUsIHRoaXMuX3VyaSwgdGhpcy5fYmFzZURlcGVuZGVuY3kucGFyc2VyLmNvbnRlbnQsIHRoaXMuX2Jhc2VEZXBlbmRlbmN5LmFzc2V0cykpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgYSBzaW5nbGUgZGVwZW5kZW5jeS5cblx0ICogQHBhcmFtIHBhcnNlciBUaGUgcGFyc2VyIHRoYXQgd2lsbCB0cmFuc2xhdGUgdGhlIGRhdGEgaW50byBhIHVzYWJsZSByZXNvdXJjZS5cblx0ICovXG5cdHByaXZhdGUgcmV0cmlldmVEZXBlbmRlbmN5KGRlcGVuZGVuY3k6UmVzb3VyY2VEZXBlbmRlbmN5KVxuXHR7XG5cdFx0dmFyIGRhdGE6YW55O1xuXG5cdFx0aWYgKHRoaXMuX2NvbnRleHQgJiYgdGhpcy5fY29udGV4dC5tYXRlcmlhbE1vZGUgIT0gMClcblx0XHRcdHRoaXMuX21hdGVyaWFsTW9kZSA9IHRoaXMuX2NvbnRleHQubWF0ZXJpYWxNb2RlO1xuXG5cdFx0dGhpcy5fY3VycmVudERlcGVuZGVuY3kgPSBkZXBlbmRlbmN5O1xuXG5cdFx0ZGVwZW5kZW5jeS5faUxvYWRlciA9IG5ldyBVUkxMb2FkZXIoKTtcblxuXHRcdHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoZGVwZW5kZW5jeS5faUxvYWRlcik7XG5cblx0XHQvLyBHZXQgYWxyZWFkeSBsb2FkZWQgKG9yIG1hcHBlZCkgZGF0YSBpZiBhdmFpbGFibGVcblx0XHRkYXRhID0gZGVwZW5kZW5jeS5kYXRhO1xuXG5cdFx0aWYgKHRoaXMuX2NvbnRleHQgJiYgZGVwZW5kZW5jeS5yZXF1ZXN0ICYmIHRoaXMuX2NvbnRleHQuX2lIYXNEYXRhRm9yVXJsKGRlcGVuZGVuY3kucmVxdWVzdC51cmwpKVxuXHRcdFx0ZGF0YSA9IHRoaXMuX2NvbnRleHQuX2lHZXREYXRhRm9yVXJsKGRlcGVuZGVuY3kucmVxdWVzdC51cmwpO1xuXG5cdFx0aWYgKGRhdGEpIHtcblx0XHRcdGlmIChkYXRhLmNvbnN0cnVjdG9yID09PSBGdW5jdGlvbilcblx0XHRcdFx0ZGF0YSA9IG5ldyBkYXRhKCk7XG5cblx0XHRcdGRlcGVuZGVuY3kuX2lTZXREYXRhKGRhdGEpO1xuXG5cdFx0XHRpZiAoZGVwZW5kZW5jeS5yZXRyaWV2ZUFzUmF3RGF0YSkge1xuXHRcdFx0XHQvLyBObyBuZWVkIHRvIHBhcnNlLiBUaGUgcGFyZW50IHBhcnNlciBpcyBleHBlY3RpbmcgdGhpc1xuXHRcdFx0XHQvLyB0byBiZSByYXcgZGF0YSBzbyBpdCBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5LlxuXHRcdFx0XHRkZXBlbmRlbmN5LnJlc29sdmUoKTtcblxuXHRcdFx0XHQvLyBNb3ZlIG9uIHRvIG5leHQgZGVwZW5kZW5jeVxuXHRcdFx0XHR0aGlzLnJldHJpZXZlTmV4dCgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLnBhcnNlRGVwZW5kZW5jeShkZXBlbmRlbmN5KTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBSZXNvbHZlIFVSTCBhbmQgc3RhcnQgbG9hZGluZ1xuXHRcdFx0ZGVwZW5kZW5jeS5yZXF1ZXN0LnVybCA9IHRoaXMucmVzb2x2ZURlcGVuZGVuY3lVcmwoZGVwZW5kZW5jeSk7XG5cblx0XHRcdGlmIChkZXBlbmRlbmN5LnJldHJpZXZlQXNSYXdEYXRhKSB7XG5cdFx0XHRcdC8vIEFsd2F5cyB1c2UgYmluYXJ5IGZvciByYXcgZGF0YSBsb2FkaW5nXG5cdFx0XHRcdGRlcGVuZGVuY3kuX2lMb2FkZXIuZGF0YUZvcm1hdCA9IFVSTExvYWRlckRhdGFGb3JtYXQuQklOQVJZO1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRpZiAoIWRlcGVuZGVuY3kucGFyc2VyKVxuXHRcdFx0XHRcdGRlcGVuZGVuY3kuX2lTZXRQYXJzZXIodGhpcy5nZXRQYXJzZXJGcm9tU3VmZml4KGRlcGVuZGVuY3kucmVxdWVzdC51cmwpKTtcblxuXHRcdFx0XHRpZiAoZGVwZW5kZW5jeS5wYXJzZXIpIHtcblx0XHRcdFx0XHRkZXBlbmRlbmN5Ll9pTG9hZGVyLmRhdGFGb3JtYXQgPSBkZXBlbmRlbmN5LnBhcnNlci5kYXRhRm9ybWF0O1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIEFsd2F5cyB1c2UgQklOQVJZIGZvciB1bmtub3duIGZpbGUgZm9ybWF0cy4gVGhlIHRob3JvdWdoXG5cdFx0XHRcdFx0Ly8gZmlsZSB0eXBlIGNoZWNrIHdpbGwgZGV0ZXJtaW5lIGZvcm1hdCBhZnRlciBsb2FkLCBhbmQgaWZcblx0XHRcdFx0XHQvLyBiaW5hcnksIGEgdGV4dCBsb2FkIHdpbGwgaGF2ZSBicm9rZW4gdGhlIGZpbGUgZGF0YS5cblx0XHRcdFx0XHRkZXBlbmRlbmN5Ll9pTG9hZGVyLmRhdGFGb3JtYXQgPSBVUkxMb2FkZXJEYXRhRm9ybWF0LkJJTkFSWTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRkZXBlbmRlbmN5Ll9pTG9hZGVyLmxvYWQoZGVwZW5kZW5jeS5yZXF1ZXN0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGpvaW5VcmwoYmFzZTpzdHJpbmcsIGVuZDpzdHJpbmcpOnN0cmluZ1xuXHR7XG5cdFx0aWYgKGVuZC5jaGFyQXQoMCkgPT0gJy8nKVxuXHRcdFx0ZW5kID0gZW5kLnN1YnN0cigxKTtcblxuXHRcdGlmIChiYXNlLmxlbmd0aCA9PSAwKVxuXHRcdFx0cmV0dXJuIGVuZDtcblxuXHRcdGlmIChiYXNlLmNoYXJBdChiYXNlLmxlbmd0aCAtIDEpID09ICcvJylcblx0XHRcdGJhc2UgPSBiYXNlLnN1YnN0cigwLCBiYXNlLmxlbmd0aCAtIDEpO1xuXG5cdFx0cmV0dXJuIGJhc2UuY29uY2F0KCcvJywgZW5kKTtcblxuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlRGVwZW5kZW5jeVVybChkZXBlbmRlbmN5OlJlc291cmNlRGVwZW5kZW5jeSk6c3RyaW5nXG5cdHtcblx0XHR2YXIgc2NoZW1lX3JlOlJlZ0V4cDtcblx0XHR2YXIgYmFzZTpzdHJpbmc7XG5cdFx0dmFyIHVybDpzdHJpbmcgPSBkZXBlbmRlbmN5LnJlcXVlc3QudXJsO1xuXG5cdFx0Ly8gSGFzIHRoZSB1c2VyIHJlLW1hcHBlZCB0aGlzIFVSTD9cblx0XHRpZiAodGhpcy5fY29udGV4dCAmJiB0aGlzLl9jb250ZXh0Ll9pSGFzTWFwcGluZ0ZvclVybCh1cmwpKVxuXHRcdFx0cmV0dXJuIHRoaXMuX2NvbnRleHQuX2lHZXRSZW1hcHBlZFVybCh1cmwpO1xuXG5cdFx0Ly8gVGhpcyBpcyB0aGUgXCJiYXNlXCIgZGVwZW5kZW5jeSwgaS5lLiB0aGUgYWN0dWFsIHJlcXVlc3RlZCBhc3NldC5cblx0XHQvLyBXZSB3aWxsIG5vdCB0cnkgdG8gcmVzb2x2ZSB0aGlzIHNpbmNlIHRoZSB1c2VyIGNhbiBwcm9iYWJseSBiZVxuXHRcdC8vIHRocnVzdGVkIHRvIGtub3cgdGhpcyBVUkwgYmV0dGVyIHRoYW4gb3VyIGF1dG9tYXRpYyByZXNvbHZlci4gOilcblx0XHRpZiAodXJsID09IHRoaXMuX3VyaSlcblx0XHRcdHJldHVybiB1cmw7XG5cblxuXHRcdC8vIEFic29sdXRlIFVSTD8gQ2hlY2sgaWYgc3RhcnRzIHdpdGggc2xhc2ggb3IgYSBVUkxcblx0XHQvLyBzY2hlbWUgZGVmaW5pdGlvbiAoZS5nLiBmdHA6Ly8sIGh0dHA6Ly8sIGZpbGU6Ly8pXG5cdFx0c2NoZW1lX3JlID0gbmV3IFJlZ0V4cCgnL15bYS16QS1aXXszLDR9OlxcL1xcLy8nKTtcblxuXHRcdGlmICh1cmwuY2hhckF0KDApID09ICcvJykge1xuXHRcdFx0aWYgKHRoaXMuX2NvbnRleHQgJiYgdGhpcy5fY29udGV4dC5vdmVycmlkZUFic29sdXRlUGF0aHMpXG5cdFx0XHRcdHJldHVybiB0aGlzLmpvaW5VcmwodGhpcy5fY29udGV4dC5kZXBlbmRlbmN5QmFzZVVybCwgdXJsKTsgZWxzZVxuXHRcdFx0XHRyZXR1cm4gdXJsO1xuXHRcdH0gZWxzZSBpZiAoc2NoZW1lX3JlLnRlc3QodXJsKSkge1xuXHRcdFx0Ly8gSWYgb3ZlcnJpZGluZyBmdWxsIFVSTHMsIGdldCByaWQgb2Ygc2NoZW1lIChlLmcuIFwiaHR0cDovL1wiKVxuXHRcdFx0Ly8gYW5kIHJlcGxhY2Ugd2l0aCB0aGUgZGVwZW5kZW5jeUJhc2VVcmwgZGVmaW5lZCBieSB1c2VyLlxuXHRcdFx0aWYgKHRoaXMuX2NvbnRleHQgJiYgdGhpcy5fY29udGV4dC5vdmVycmlkZUZ1bGxVUkxzKSB7XG5cblx0XHRcdFx0dmFyIG5vc2NoZW1lX3VybCA6IHN0cmluZyAgPSB1cmwucmVwbGFjZSggc2NoZW1lX3JlICwgJycgKTsvL3VybFsncmVwbGFjZSddKHNjaGVtZV9yZSk7XG5cdFx0XHRcdHJldHVybiB0aGlzLmpvaW5VcmwodGhpcy5fY29udGV4dC5kZXBlbmRlbmN5QmFzZVVybCwgPHN0cmluZz4gbm9zY2hlbWVfdXJsKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTaW5jZSBub3QgYWJzb2x1dGUsIGp1c3QgZ2V0IHJpZCBvZiBiYXNlIGZpbGUgbmFtZSB0byBmaW5kIGl0J3Ncblx0XHQvLyBmb2xkZXIgYW5kIHRoZW4gY29uY2F0ZW5hdGUgZHluYW1pYyBVUkxcblx0XHRpZiAodGhpcy5fY29udGV4dCAmJiB0aGlzLl9jb250ZXh0LmRlcGVuZGVuY3lCYXNlVXJsKSB7XG5cdFx0XHRiYXNlID0gdGhpcy5fY29udGV4dC5kZXBlbmRlbmN5QmFzZVVybDtcblx0XHRcdHJldHVybiB0aGlzLmpvaW5VcmwoYmFzZSwgdXJsKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0YmFzZSA9IHRoaXMuX3VyaS5zdWJzdHJpbmcoMCwgdGhpcy5fdXJpLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcblx0XHRcdHJldHVybiB0aGlzLmpvaW5VcmwoYmFzZSwgdXJsKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJldHJpZXZlUGFyc2VyRGVwZW5kZW5jaWVzKClcblx0e1xuXHRcdGlmICghdGhpcy5fY3VycmVudERlcGVuZGVuY3kpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR2YXIgcGFyc2VyRGVwZW5kYW5jaWVzID0gdGhpcy5fY3VycmVudERlcGVuZGVuY3kucGFyc2VyLmRlcGVuZGVuY2llc1xuXHRcdHZhciBpOm51bWJlciwgbGVuOm51bWJlciA9IHBhcnNlckRlcGVuZGFuY2llcy5sZW5ndGg7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG5cdFx0XHR0aGlzLl9jdXJyZW50RGVwZW5kZW5jeS5kZXBlbmRlbmNpZXNbaV0gPSBwYXJzZXJEZXBlbmRhbmNpZXNbaV07XG5cblxuXHRcdC8vIFNpbmNlIG1vcmUgZGVwZW5kZW5jaWVzIG1pZ2h0IGJlIGFkZGVkIGV2ZW50dWFsbHksIGVtcHR5IHRoaXNcblx0XHQvLyBsaXN0IHNvIHRoYXQgdGhlIHNhbWUgZGVwZW5kZW5jeSBpc24ndCByZXRyaWV2ZWQgbW9yZSB0aGFuIG9uY2UuXG5cdFx0cGFyc2VyRGVwZW5kYW5jaWVzLmxlbmd0aCA9IDA7XG5cblx0XHR0aGlzLl9zdGFjay5wdXNoKHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5KTtcblxuXHRcdHRoaXMucmV0cmlldmVOZXh0KCk7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVQYXJzZXJEZXBlbmRlbmNpZXMoKVxuXHR7XG5cdFx0dGhpcy5fY3VycmVudERlcGVuZGVuY3kuX2lTdWNjZXNzID0gdHJ1ZTtcblxuXHRcdC8vIFJldHJpZXZlIGFueSBsYXN0IGRlcGVuZGVuY2llcyByZW1haW5pbmcgb24gdGhpcyBwYXJzZXIsIG9yXG5cdFx0Ly8gaWYgbm9uZSBleGlzdHMsIGp1c3QgbW92ZSBvbi5cblx0XHRpZiAodGhpcy5fY3VycmVudERlcGVuZGVuY3kucGFyc2VyICYmIHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5LnBhcnNlci5kZXBlbmRlbmNpZXMubGVuZ3RoICYmICghdGhpcy5fY29udGV4dCB8fCB0aGlzLl9jb250ZXh0LmluY2x1ZGVEZXBlbmRlbmNpZXMpKS8vY29udGV4dCBtYXkgYmUgbnVsbFxuXHRcdFx0dGhpcy5yZXRyaWV2ZVBhcnNlckRlcGVuZGVuY2llcygpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMucmV0cmlldmVOZXh0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSBzaW5nbGUgZGVwZW5kZW5jeSBsb2FkaW5nIGZhaWxlZCwgYW5kIHB1c2hlcyBmdXJ0aGVyIGRlcGVuZGVuY2llcyBvbnRvIHRoZSBzdGFjay5cblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRwcml2YXRlIG9uTG9hZEVycm9yKGV2ZW50OklPRXJyb3JFdmVudClcblx0e1xuXHRcdHZhciBoYW5kbGVkOmJvb2xlYW47XG5cdFx0dmFyIGlzRGVwZW5kZW5jeTpib29sZWFuID0gKHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5ICE9IHRoaXMuX2Jhc2VEZXBlbmRlbmN5KTtcblx0XHR2YXIgbG9hZGVyOlVSTExvYWRlciA9IDxVUkxMb2FkZXI+IGV2ZW50LnRhcmdldDsvL1RPRE86IGtlZXAgb24gZXllIG9uIHRoaXMgb25lXG5cblx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKGxvYWRlcik7XG5cblx0XHRpZiAodGhpcy5oYXNFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiApKSB7XG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuXHRcdFx0aGFuZGxlZCA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRPRE86IENvbnNpZGVyIG5vdCBkb2luZyB0aGlzIGV2ZW4gd2hlbiBBc3NldExvYWRlciBkb2VzIGhhdmUgaXQncyBvd24gTE9BRF9FUlJPUiBsaXN0ZW5lclxuXHRcdFx0dmFyIGk6bnVtYmVyLCBsZW46bnVtYmVyID0gdGhpcy5fZXJyb3JIYW5kbGVycy5sZW5ndGg7XG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG5cdFx0XHRcdGlmICghaGFuZGxlZClcblx0XHRcdFx0XHRoYW5kbGVkID0gPGJvb2xlYW4+IHRoaXMuX2Vycm9ySGFuZGxlcnNbaV0oZXZlbnQpO1xuXHRcdH1cblxuXHRcdGlmIChoYW5kbGVkKSB7XG5cblx0XHRcdC8vaWYgKGlzRGVwZW5kZW5jeSAmJiAhIGV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG5cdFx0XHRpZiAoaXNEZXBlbmRlbmN5KSB7IC8vIFRPRE86IEpTIC8gQVMzIENoYW5nZSAtIHdlIGRvbid0IGhhdmUgaXNEZWZhdWx0UHJldmVudGVkIC0gc28gd2lsbCB0aGlzIHdvcmtcblxuXHRcdFx0XHR0aGlzLl9jdXJyZW50RGVwZW5kZW5jeS5yZXNvbHZlRmFpbHVyZSgpO1xuXHRcdFx0XHR0aGlzLnJldHJpZXZlTmV4dCgpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyBFaXRoZXIgdGhpcyB3YXMgdGhlIGJhc2UgZmlsZSAobGFzdCBsZWZ0IGluIHRoZSBzdGFjaykgb3Jcblx0XHRcdFx0Ly8gZGVmYXVsdCBiZWhhdmlvciB3YXMgcHJldmVudGVkIGJ5IHRoZSBoYW5kbGVycywgYW5kIGhlbmNlXG5cdFx0XHRcdC8vIHRoZXJlIGlzIG5vdGhpbmcgbW9yZSB0byBkbyB0aGFuIGNsZWFuIHVwIGFuZCBiYWlsLlxuXHRcdFx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEVycm9yIGV2ZW50IHdhcyBub3QgaGFuZGxlZCBieSBsaXN0ZW5lcnMgZGlyZWN0bHkgb24gQXNzZXRMb2FkZXIgb3Jcblx0XHRcdC8vIG9uIGFueSBvZiB0aGUgc3Vic2NyaWJlZCBsb2FkZXJzIChpbiB0aGUgbGlzdCBvZiBlcnJvciBoYW5kbGVycy4pXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSBkZXBlbmRlbmN5IHBhcnNpbmcgZmFpbGVkLCBhbmQgZGlzcGF0Y2hlcyBhIDxjb2RlPlBhcnNlckV2ZW50LlBBUlNFX0VSUk9SPC9jb2RlPlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdHByaXZhdGUgb25QYXJzZUVycm9yKGV2ZW50OlBhcnNlckV2ZW50KVxuXHR7XG5cdFx0dmFyIGhhbmRsZWQ6Ym9vbGVhbjtcblxuXHRcdHZhciBpc0RlcGVuZGVuY3k6Ym9vbGVhbiA9ICh0aGlzLl9jdXJyZW50RGVwZW5kZW5jeSAhPSB0aGlzLl9iYXNlRGVwZW5kZW5jeSk7XG5cblx0XHR2YXIgbG9hZGVyOlVSTExvYWRlciA9IDxVUkxMb2FkZXI+ZXZlbnQudGFyZ2V0O1xuXG5cdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVycyhsb2FkZXIpO1xuXG5cdFx0aWYgKHRoaXMuaGFzRXZlbnRMaXN0ZW5lcihQYXJzZXJFdmVudC5QQVJTRV9FUlJPUikpIHtcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdFx0XHRoYW5kbGVkID0gdHJ1ZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVE9ETzogQ29uc2lkZXIgbm90IGRvaW5nIHRoaXMgZXZlbiB3aGVuIEFzc2V0TG9hZGVyIGRvZXNcblx0XHRcdC8vIGhhdmUgaXQncyBvd24gTE9BRF9FUlJPUiBsaXN0ZW5lclxuXHRcdFx0dmFyIGk6bnVtYmVyLCBsZW46bnVtYmVyID0gdGhpcy5fcGFyc2VFcnJvckhhbmRsZXJzLmxlbmd0aDtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuXHRcdFx0XHRpZiAoIWhhbmRsZWQpXG5cdFx0XHRcdFx0aGFuZGxlZCA9IDxib29sZWFuPiB0aGlzLl9wYXJzZUVycm9ySGFuZGxlcnNbaV0oZXZlbnQpO1xuXHRcdH1cblxuXHRcdGlmIChoYW5kbGVkKSB7XG5cdFx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0XHRcdHJldHVybjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gRXJyb3IgZXZlbnQgd2FzIG5vdCBoYW5kbGVkIGJ5IGxpc3RlbmVycyBkaXJlY3RseSBvbiBBc3NldExvYWRlciBvclxuXHRcdFx0Ly8gb24gYW55IG9mIHRoZSBzdWJzY3JpYmVkIGxvYWRlcnMgKGluIHRoZSBsaXN0IG9mIGVycm9yIGhhbmRsZXJzLilcblx0XHRcdHRocm93IG5ldyBFcnJvcihldmVudC5tZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG9uQXNzZXRDb21wbGV0ZShldmVudDpBc3NldEV2ZW50KVxuXHR7XG5cdFx0Ly8gQWRkIGxvYWRlZCBhc3NldCB0byBsaXN0IG9mIGFzc2V0cyByZXRyaWV2ZWQgYXMgcGFydFxuXHRcdC8vIG9mIHRoZSBjdXJyZW50IGRlcGVuZGVuY3kuIFRoaXMgbGlzdCB3aWxsIGJlIGluc3BlY3RlZFxuXHRcdC8vIGJ5IHRoZSBwYXJlbnQgcGFyc2VyIHdoZW4gZGVwZW5kZW5jeSBpcyByZXNvbHZlZFxuXHRcdGlmICh0aGlzLl9jdXJyZW50RGVwZW5kZW5jeSlcblx0XHRcdHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5LmFzc2V0cy5wdXNoKGV2ZW50LmFzc2V0KTtcblxuXHRcdGV2ZW50LmFzc2V0LnJlc2V0QXNzZXRQYXRoKGV2ZW50LmFzc2V0Lm5hbWUsIHRoaXMuX25hbWVzcGFjZSk7XG5cblx0XHRpZiAoIXRoaXMuX2N1cnJlbnREZXBlbmRlbmN5LnN1cHByZXNBc3NldEV2ZW50cylcblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdH1cblxuXHRwcml2YXRlIG9uUmVhZHlGb3JEZXBlbmRlbmNpZXMoZXZlbnQ6UGFyc2VyRXZlbnQpXG5cdHtcblx0XHR2YXIgcGFyc2VyOlBhcnNlckJhc2UgPSA8UGFyc2VyQmFzZT4gZXZlbnQudGFyZ2V0O1xuXG5cdFx0aWYgKHRoaXMuX2NvbnRleHQgJiYgIXRoaXMuX2NvbnRleHQuaW5jbHVkZURlcGVuZGVuY2llcylcblx0XHRcdHBhcnNlci5faVJlc3VtZVBhcnNpbmdBZnRlckRlcGVuZGVuY2llcygpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMucmV0cmlldmVQYXJzZXJEZXBlbmRlbmNpZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIHNpbmdsZSBkZXBlbmRlbmN5IHdhcyBwYXJzZWQsIGFuZCBwdXNoZXMgZnVydGhlciBkZXBlbmRlbmNpZXMgb250byB0aGUgc3RhY2suXG5cdCAqIEBwYXJhbSBldmVudFxuXHQgKi9cblx0cHJpdmF0ZSBvbkxvYWRDb21wbGV0ZShldmVudDpFdmVudClcblx0e1xuXHRcdHZhciBsb2FkZXI6VVJMTG9hZGVyID0gPFVSTExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXG5cdFx0dGhpcy5yZW1vdmVFdmVudExpc3RlbmVycyhsb2FkZXIpO1xuXG5cdFx0Ly8gUmVzb2x2ZSB0aGlzIGRlcGVuZGVuY3lcblx0XHR0aGlzLl9jdXJyZW50RGVwZW5kZW5jeS5faVNldERhdGEobG9hZGVyLmRhdGEpO1xuXG5cdFx0aWYgKHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5LnJldHJpZXZlQXNSYXdEYXRhKSB7XG5cdFx0XHQvLyBObyBuZWVkIHRvIHBhcnNlIHRoaXMgZGF0YSwgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIGFzIGlzXG5cdFx0XHR0aGlzLnJlc29sdmVQYXJzZXJEZXBlbmRlbmNpZXMoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5wYXJzZURlcGVuZGVuY3kodGhpcy5fY3VycmVudERlcGVuZGVuY3kpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBwYXJzaW5nIGlzIGNvbXBsZXRlLlxuXHQgKi9cblx0cHJpdmF0ZSBvblBhcnNlQ29tcGxldGUoZXZlbnQ6UGFyc2VyRXZlbnQpOnZvaWRcblx0e1xuXHRcdHZhciBwYXJzZXI6UGFyc2VyQmFzZSA9IDxQYXJzZXJCYXNlPiBldmVudC50YXJnZXQ7XG5cblx0XHR0aGlzLnJlc29sdmVQYXJzZXJEZXBlbmRlbmNpZXMoKTsvL3Jlc29sdmUgaW4gZnJvbnQgb2YgcmVtb3ZpbmcgbGlzdGVuZXJzIHRvIGFsbG93IGFueSByZW1haW5pbmcgYXNzZXQgZXZlbnRzIHRvIHByb3BhZ2F0ZVxuXG5cdFx0cGFyc2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoUGFyc2VyRXZlbnQuUkVBRFlfRk9SX0RFUEVOREVOQ0lFUywgdGhpcy5fb25SZWFkeUZvckRlcGVuZGVuY2llc0RlbGVnYXRlKTtcblx0XHRwYXJzZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihQYXJzZXJFdmVudC5QQVJTRV9DT01QTEVURSwgdGhpcy5fb25QYXJzZUNvbXBsZXRlRGVsZWdhdGUpO1xuXHRcdHBhcnNlci5yZW1vdmVFdmVudExpc3RlbmVyKFBhcnNlckV2ZW50LlBBUlNFX0VSUk9SLCB0aGlzLl9vblBhcnNlRXJyb3JEZWxlZ2F0ZSk7XG5cdFx0cGFyc2VyLnJlbW92ZUV2ZW50TGlzdGVuZXIoQXNzZXRFdmVudC5URVhUVVJFX1NJWkVfRVJST1IsIHRoaXMuX29uVGV4dHVyZVNpemVFcnJvckRlbGVnYXRlKTtcblx0XHRwYXJzZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LkFTU0VUX0NPTVBMRVRFLCB0aGlzLl9vbkFzc2V0Q29tcGxldGVEZWxlZ2F0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4gaW1hZ2UgaXMgdG9vIGxhcmdlIG9yIGl0J3MgZGltZW5zaW9ucyBhcmUgbm90IGEgcG93ZXIgb2YgMlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdHByaXZhdGUgb25UZXh0dXJlU2l6ZUVycm9yKGV2ZW50OkFzc2V0RXZlbnQpXG5cdHtcblx0XHRldmVudC5hc3NldC5uYW1lID0gdGhpcy5fY3VycmVudERlcGVuZGVuY3kucmVzb2x2ZU5hbWUoZXZlbnQuYXNzZXQpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkRXZlbnRMaXN0ZW5lcnMobG9hZGVyOlVSTExvYWRlcilcblx0e1xuXHRcdGxvYWRlci5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTVBMRVRFLCB0aGlzLl9vbkxvYWRDb21wbGV0ZURlbGVnYXRlKTtcblx0XHRsb2FkZXIuYWRkRXZlbnRMaXN0ZW5lcihJT0Vycm9yRXZlbnQuSU9fRVJST1IsIHRoaXMuX29uTG9hZEVycm9yRGVsZWdhdGUpO1xuXHR9XG5cblx0cHJpdmF0ZSByZW1vdmVFdmVudExpc3RlbmVycyhsb2FkZXI6VVJMTG9hZGVyKVxuXHR7XG5cdFx0bG9hZGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnQuQ09NUExFVEUsIHRoaXMuX29uTG9hZENvbXBsZXRlRGVsZWdhdGUpO1xuXHRcdGxvYWRlci5yZW1vdmVFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiwgdGhpcy5fb25Mb2FkRXJyb3JEZWxlZ2F0ZSk7XG5cdH1cblxuXHRwdWJsaWMgc3RvcCgpXG5cdHtcblx0XHR0aGlzLmRpc3Bvc2UoKTtcblx0fVxuXG5cdHByaXZhdGUgZGlzcG9zZSgpXG5cdHtcblx0XHR0aGlzLl9lcnJvckhhbmRsZXJzID0gbnVsbDtcblx0XHR0aGlzLl9wYXJzZUVycm9ySGFuZGxlcnMgPSBudWxsO1xuXHRcdHRoaXMuX2NvbnRleHQgPSBudWxsO1xuXHRcdHRoaXMuX3Rva2VuID0gbnVsbDtcblx0XHR0aGlzLl9zdGFjayA9IG51bGw7XG5cblx0XHRpZiAodGhpcy5fY3VycmVudERlcGVuZGVuY3kgJiYgdGhpcy5fY3VycmVudERlcGVuZGVuY3kuX2lMb2FkZXIpXG5cdFx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5Ll9pTG9hZGVyKTtcblxuXHRcdHRoaXMuX2N1cnJlbnREZXBlbmRlbmN5ID0gbnVsbDtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgb3RoZXIgbG9hZGVyIGNsYXNzZXMgKGUuZy4gTG9hZGVyM0QgYW5kIEFzc2V0TGlicmFyeUJ1bmRsZSkgdG9cblx0ICogYWRkIGVycm9yIGV2ZW50IGxpc3RlbmVycyB0byB0aGUgQXNzZXRMb2FkZXIgaW5zdGFuY2UuIFRoaXMgc3lzdGVtIGlzIHVzZWQgaW5zdGVhZCBvZlxuXHQgKiB0aGUgcmVndWxhciBFdmVudERpc3BhdGNoZXIgc3lzdGVtIHNvIHRoYXQgdGhlIEFzc2V0TGlicmFyeSBlcnJvciBoYW5kbGVyIGNhbiBiZSBzdXJlXG5cdCAqIHRoYXQgaWYgaGFzRXZlbnRMaXN0ZW5lcigpIHJldHVybnMgdHJ1ZSwgaXQncyBjbGllbnQgY29kZSB0aGF0J3MgbGlzdGVuaW5nIGZvciB0aGVcblx0ICogZXZlbnQuIFNlY29uZGx5LCBmdW5jdGlvbnMgYWRkZWQgYXMgZXJyb3IgaGFuZGxlciB0aHJvdWdoIHRoaXMgY3VzdG9tIG1ldGhvZCBhcmVcblx0ICogZXhwZWN0ZWQgdG8gcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGV2ZW50IHdhcyBoYW5kbGVkIChpLmUuXG5cdCAqIHdoZXRoZXIgdGhleSBpbiB0dXJuIGhhZCBhbnkgY2xpZW50IGNvZGUgbGlzdGVuaW5nIGZvciB0aGUgZXZlbnQuKSBJZiBubyBoYW5kbGVyc1xuXHQgKiByZXR1cm4gdHJ1ZSwgdGhlIEFzc2V0TG9hZGVyIGtub3dzIHRoYXQgdGhlIGV2ZW50IHdhc24ndCBoYW5kbGVkIGFuZCB3aWxsIHRocm93IGFuIFJURS5cblx0ICovXG5cblx0cHVibGljIF9pQWRkUGFyc2VFcnJvckhhbmRsZXIoaGFuZGxlcilcblx0e1xuXHRcdGlmICh0aGlzLl9wYXJzZUVycm9ySGFuZGxlcnMuaW5kZXhPZihoYW5kbGVyKSA8IDApXG5cdFx0XHR0aGlzLl9wYXJzZUVycm9ySGFuZGxlcnMucHVzaChoYW5kbGVyKTtcblx0fVxuXG5cdHB1YmxpYyBfaUFkZEVycm9ySGFuZGxlcihoYW5kbGVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2Vycm9ySGFuZGxlcnMuaW5kZXhPZihoYW5kbGVyKSA8IDApXG5cdFx0XHR0aGlzLl9lcnJvckhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBHdWVzc2VzIHRoZSBwYXJzZXIgdG8gYmUgdXNlZCBiYXNlZCBvbiB0aGUgZmlsZSBjb250ZW50cy5cblx0ICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gYmUgcGFyc2VkLlxuXHQgKiBAcGFyYW0gdXJpIFRoZSB1cmwgb3IgaWQgb2YgdGhlIG9iamVjdCB0byBiZSBwYXJzZWQuXG5cdCAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIGd1ZXNzZWQgcGFyc2VyLlxuXHQgKi9cblx0cHJpdmF0ZSBnZXRQYXJzZXJGcm9tRGF0YShkYXRhOmFueSk6UGFyc2VyQmFzZVxuXHR7XG5cdFx0dmFyIGxlbjpudW1iZXIgPSBBc3NldExvYWRlci5fcGFyc2Vycy5sZW5ndGg7XG5cblx0XHQvLyBnbyBpbiByZXZlcnNlIG9yZGVyIHRvIGFsbG93IGFwcGxpY2F0aW9uIG92ZXJyaWRlIG9mIGRlZmF1bHQgcGFyc2VyIGFkZGVkIGluIGF3YXkucHJvcGVyXG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSBsZW4gLSAxOyBpID49IDA7IGktLSlcblx0XHRcdGlmIChBc3NldExvYWRlci5fcGFyc2Vyc1tpXS5zdXBwb3J0c0RhdGEoZGF0YSkpXG5cdFx0XHRcdHJldHVybiBuZXcgQXNzZXRMb2FkZXIuX3BhcnNlcnNbaV0oKTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblxuXHQvKipcblx0ICogSW5pdGlhdGVzIHBhcnNpbmcgb2YgdGhlIGxvYWRlZCBkZXBlbmRlbmN5LlxuXHQgKlxuXHQgKiBAcGFyYW0gVGhlIGRlcGVuZGVuY3kgdG8gYmUgcGFyc2VkLlxuXHQgKi9cblx0cHJpdmF0ZSBwYXJzZURlcGVuZGVuY3koZGVwZW5kZW5jeTpSZXNvdXJjZURlcGVuZGVuY3kpOnZvaWRcblx0e1xuXHRcdHZhciBwYXJzZXI6UGFyc2VyQmFzZSA9IGRlcGVuZGVuY3kucGFyc2VyO1xuXG5cdFx0Ly8gSWYgbm8gcGFyc2VyIGhhcyBiZWVuIGRlZmluZWQsIHRyeSB0byBmaW5kIG9uZSBieSBsZXR0aW5nXG5cdFx0Ly8gYWxsIHBsdWdnZWQgaW4gcGFyc2VycyBpbnNwZWN0IHRoZSBhY3R1YWwgZGF0YS5cblx0XHRpZiAoIXBhcnNlcilcblx0XHRcdGRlcGVuZGVuY3kuX2lTZXRQYXJzZXIocGFyc2VyID0gdGhpcy5nZXRQYXJzZXJGcm9tRGF0YShkZXBlbmRlbmN5LmRhdGEpKTtcblxuXHRcdGlmIChwYXJzZXIpIHtcblx0XHRcdHBhcnNlci5hZGRFdmVudExpc3RlbmVyKFBhcnNlckV2ZW50LlJFQURZX0ZPUl9ERVBFTkRFTkNJRVMsIHRoaXMuX29uUmVhZHlGb3JEZXBlbmRlbmNpZXNEZWxlZ2F0ZSk7XG5cdFx0XHRwYXJzZXIuYWRkRXZlbnRMaXN0ZW5lcihQYXJzZXJFdmVudC5QQVJTRV9DT01QTEVURSwgdGhpcy5fb25QYXJzZUNvbXBsZXRlRGVsZWdhdGUpO1xuXHRcdFx0cGFyc2VyLmFkZEV2ZW50TGlzdGVuZXIoUGFyc2VyRXZlbnQuUEFSU0VfRVJST1IsIHRoaXMuX29uUGFyc2VFcnJvckRlbGVnYXRlKTtcblx0XHRcdHBhcnNlci5hZGRFdmVudExpc3RlbmVyKEFzc2V0RXZlbnQuVEVYVFVSRV9TSVpFX0VSUk9SLCB0aGlzLl9vblRleHR1cmVTaXplRXJyb3JEZWxlZ2F0ZSk7XG5cdFx0XHRwYXJzZXIuYWRkRXZlbnRMaXN0ZW5lcihBc3NldEV2ZW50LkFTU0VUX0NPTVBMRVRFLCB0aGlzLl9vbkFzc2V0Q29tcGxldGVEZWxlZ2F0ZSk7XG5cblx0XHRcdGlmIChkZXBlbmRlbmN5LnJlcXVlc3QgJiYgZGVwZW5kZW5jeS5yZXF1ZXN0LnVybClcblx0XHRcdFx0cGFyc2VyLl9pRmlsZU5hbWUgPSBkZXBlbmRlbmN5LnJlcXVlc3QudXJsO1xuXG5cdFx0XHRwYXJzZXIubWF0ZXJpYWxNb2RlID0gdGhpcy5fbWF0ZXJpYWxNb2RlO1xuXG5cdFx0XHRwYXJzZXIucGFyc2VBc3luYyhkZXBlbmRlbmN5LmRhdGEpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciBtZXNzYWdlOnN0cmluZyA9IFwiTm8gcGFyc2VyIGRlZmluZWQuIFRvIGVuYWJsZSBhbGwgcGFyc2VycyBmb3IgYXV0by1kZXRlY3Rpb24sIHVzZSBQYXJzZXJzLmVuYWJsZUFsbEJ1bmRsZWQoKVwiXG5cdFx0XHRpZih0aGlzLmhhc0V2ZW50TGlzdGVuZXIoUGFyc2VyRXZlbnQuUEFSU0VfRVJST1IpKVxuXHRcdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFBhcnNlckV2ZW50KFBhcnNlckV2ZW50LlBBUlNFX0VSUk9SLCBtZXNzYWdlKSk7XG5cdFx0XHRlbHNlXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogR3Vlc3NlcyB0aGUgcGFyc2VyIHRvIGJlIHVzZWQgYmFzZWQgb24gdGhlIGZpbGUgZXh0ZW5zaW9uLlxuXHQgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHRoZSBndWVzc2VkIHBhcnNlci5cblx0ICovXG5cdHByaXZhdGUgZ2V0UGFyc2VyRnJvbVN1ZmZpeCh1cmw6c3RyaW5nKTpQYXJzZXJCYXNlXG5cdHtcblx0XHQvLyBHZXQgcmlkIG9mIHF1ZXJ5IHN0cmluZyBpZiBhbnkgYW5kIGV4dHJhY3QgZXh0ZW5zaW9uXG5cdFx0dmFyIGJhc2U6c3RyaW5nID0gKHVybC5pbmRleE9mKCc/JykgPiAwKT8gdXJsLnNwbGl0KCc/JylbMF0gOiB1cmw7XG5cdFx0dmFyIGZpbGVFeHRlbnNpb246c3RyaW5nID0gYmFzZS5zdWJzdHIoYmFzZS5sYXN0SW5kZXhPZignLicpICsgMSkudG9Mb3dlckNhc2UoKTtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gQXNzZXRMb2FkZXIuX3BhcnNlcnMubGVuZ3RoO1xuXG5cdFx0Ly8gZ28gaW4gcmV2ZXJzZSBvcmRlciB0byBhbGxvdyBhcHBsaWNhdGlvbiBvdmVycmlkZSBvZiBkZWZhdWx0IHBhcnNlciBhZGRlZCBpbiBhd2F5LnByb3BlclxuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gbGVuIC0gMTsgaSA+PSAwOyBpLS0pIHtcblx0XHRcdHZhciBwYXJzZXJDbGFzczphbnkgPSBBc3NldExvYWRlci5fcGFyc2Vyc1tpXTtcblx0XHRcdGlmIChwYXJzZXJDbGFzcy5zdXBwb3J0c1R5cGUoZmlsZUV4dGVuc2lvbikpXG5cdFx0XHRcdHJldHVybiBuZXcgcGFyc2VyQ2xhc3MoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxufVxuXG5leHBvcnQgPSBBc3NldExvYWRlcjsiXX0= \ No newline at end of file diff --git a/lib/core/library/AssetLoader.ts b/lib/core/library/AssetLoader.ts new file mode 100644 index 00000000..186f988e --- /dev/null +++ b/lib/core/library/AssetLoader.ts @@ -0,0 +1,707 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import AssetLoaderContext = require("awayjs-core/lib/core/library/AssetLoaderContext"); +import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import Error = require("awayjs-core/lib/errors/Error"); +import AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +import Event = require("awayjs-core/lib/events/Event"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +import LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +import ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +import CubeTextureParser = require("awayjs-core/lib/parsers/CubeTextureParser"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +import ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); +import Texture2DParser = require("awayjs-core/lib/parsers/Texture2DParser"); + +/** + * Dispatched when any asset finishes parsing. Also see specific events for each + * individual asset type (meshes, materials et c.) + * + * @eventType away.events.AssetEvent + */ +//[Event(name="assetComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when a full resource (including dependencies) finishes loading. + * + * @eventType away.events.LoaderEvent + */ +//[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] + + +/** + * Dispatched when a single dependency (which may be the main file of a resource) + * finishes loading. + * + * @eventType away.events.LoaderEvent + */ +//[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] + + +/** + * Dispatched when an error occurs during loading. I + * + * @eventType away.events.LoaderEvent + */ +//[Event(name="loadError", type="away3d.events.LoaderEvent")] + + +/** + * Dispatched when an error occurs during parsing. + * + * @eventType away.events.ParserEvent + */ +//[Event(name="parseError", type="away3d.events.ParserEvent")] + +/** + * Dispatched when an image asset dimensions are not a power of 2 + * + * @eventType away.events.AssetEvent + */ +//[Event(name="textureSizeError", type="away3d.events.AssetEvent")] + +/** + * AssetLoader can load any file format that away.supports (or for which a third-party parser + * has been plugged in) and it's dependencies. Events are dispatched when assets are encountered + * and for when the resource (or it's dependencies) have been loaded. + * + * The AssetLoader will not make assets available in any other way than through the dispatched + * events. To store assets and make them available at any point from any module in an application, + * use the AssetLibrary to load and manage assets. + * + * @see away.library.AssetLibrary + */ +class AssetLoader extends EventDispatcher +{ + private _context:AssetLoaderContext; + private _token:AssetLoaderToken; + private _uri:string; + private _content:DisplayObject; + private _materialMode:number; + + private _errorHandlers:Array; + private _parseErrorHandlers:Array; + + private _stack:Array; + private _baseDependency:ResourceDependency; + private _currentDependency:ResourceDependency; + private _namespace:string; + + private _onReadyForDependenciesDelegate:(event:ParserEvent) => void; + private _onParseCompleteDelegate:(event:ParserEvent) => void; + private _onParseErrorDelegate:(event:ParserEvent) => void; + private _onLoadCompleteDelegate:(event:Event) => void; + private _onLoadErrorDelegate:(event:IOErrorEvent) => void; + private _onTextureSizeErrorDelegate:(event:AssetEvent) => void; + private _onAssetCompleteDelegate:(event:AssetEvent) => void; + + // Image parser only parser that is added by default, to save file size. + private static _parsers:Array = new Array(Texture2DParser, CubeTextureParser); + + /** + * Enables a specific parser. + * When no specific parser is set for a loading/parsing opperation, + * loader3d can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parser The parser class to enable. + * + * @see away.parsers.Parsers + */ + public static enableParser(parser) + { + if (AssetLoader._parsers.indexOf(parser) < 0) + AssetLoader._parsers.push(parser); + } + + /** + * Enables a list of parsers. + * When no specific parser is set for a loading/parsing opperation, + * AssetLoader can autoselect the correct parser to use. + * A parser must have been enabled, to be considered when autoselecting the parser. + * + * @param parsers A Vector of parser classes to enable. + * @see away.parsers.Parsers + */ + public static enableParsers(parsers:Array) + { + for (var c:number = 0; c < parsers.length; c++) + AssetLoader.enableParser(parsers[ c ]); + } + + /** + * Returns the base dependency of the loader + */ + public get baseDependency():ResourceDependency + { + return this._baseDependency; + } + + /** + * Create a new ResourceLoadSession object. + */ + constructor(materialMode:number = 0) + { + super(); + + this._materialMode = materialMode; + + this._stack = new Array(); + this._errorHandlers = new Array(); + this._parseErrorHandlers = new Array(); + + this._onReadyForDependenciesDelegate = (event:ParserEvent) => this.onReadyForDependencies(event); + this._onParseCompleteDelegate = (event:ParserEvent) => this.onParseComplete(event); + this._onParseErrorDelegate = (event:ParserEvent) => this.onParseError(event); + this._onLoadCompleteDelegate = (event:Event) => this.onLoadComplete(event); + this._onLoadErrorDelegate = (event:IOErrorEvent) => this.onLoadError(event); + this._onTextureSizeErrorDelegate = (event:AssetEvent) => this.onTextureSizeError(event); + this._onAssetCompleteDelegate = (event:AssetEvent) => this.onAssetComplete(event); + } + + /** + * Loads a file and (optionally) all of its dependencies. + * + * @param req The URLRequest object containing the URL of the file to be loaded. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + */ + public load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken + { + if (!this._token) { + this._token = new AssetLoaderToken(this); + + this._uri = req.url = req.url.replace(/\\/g, "/"); + this._context = context; + this._namespace = ns; + + this._baseDependency = new ResourceDependency('', req, null, parser, null); + this.retrieveDependency(this._baseDependency); + + return this._token; + } + + // TODO: Throw error (already loading) + return null; + } + + /** + * Loads a resource from already loaded data. + * + * @param data The data object containing all resource information. + * @param context An optional context object providing additional parameters for loading + * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets + * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. + */ + public loadData(data:any, id:string, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken + { + if (!this._token) { + this._token = new AssetLoaderToken(this); + + this._uri = id; + this._context = context; + this._namespace = ns; + + this._baseDependency = new ResourceDependency(id, null, data, parser, null); + this.retrieveDependency(this._baseDependency); + + return this._token; + } + + // TODO: Throw error (already loading) + return null; + } + + /** + * Recursively retrieves the next to-be-loaded and parsed dependency on the stack, or pops the list off the + * stack when complete and continues on the top set. + * @param parser The parser that will translate the data into a usable resource. + */ + private retrieveNext(parser:ParserBase = null) + { + if (this._currentDependency.dependencies.length) { + + var next:ResourceDependency = this._currentDependency.dependencies.pop(); + + this._stack.push(this._currentDependency); + this.retrieveDependency(next); + + } else if (this._currentDependency.parser && this._currentDependency.parser.parsingPaused) { + + this._currentDependency.parser._iResumeParsingAfterDependencies(); + this._stack.pop(); + + } else if (this._stack.length) { + + var prev:ResourceDependency = this._currentDependency; + + this._currentDependency = this._stack.pop(); + + if (prev._iSuccess) + prev.resolve(); + + this.retrieveNext(parser); + + } else { + this.dispatchEvent(new LoaderEvent(LoaderEvent.RESOURCE_COMPLETE, this._uri, this._baseDependency.parser.content, this._baseDependency.assets)); + } + } + + /** + * Retrieves a single dependency. + * @param parser The parser that will translate the data into a usable resource. + */ + private retrieveDependency(dependency:ResourceDependency) + { + var data:any; + + if (this._context && this._context.materialMode != 0) + this._materialMode = this._context.materialMode; + + this._currentDependency = dependency; + + dependency._iLoader = new URLLoader(); + + this.addEventListeners(dependency._iLoader); + + // Get already loaded (or mapped) data if available + data = dependency.data; + + if (this._context && dependency.request && this._context._iHasDataForUrl(dependency.request.url)) + data = this._context._iGetDataForUrl(dependency.request.url); + + if (data) { + if (data.constructor === Function) + data = new data(); + + dependency._iSetData(data); + + if (dependency.retrieveAsRawData) { + // No need to parse. The parent parser is expecting this + // to be raw data so it can be passed directly. + dependency.resolve(); + + // Move on to next dependency + this.retrieveNext(); + + } else { + this.parseDependency(dependency); + } + + } else { + // Resolve URL and start loading + dependency.request.url = this.resolveDependencyUrl(dependency); + + if (dependency.retrieveAsRawData) { + // Always use binary for raw data loading + dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; + } else { + + if (!dependency.parser) + dependency._iSetParser(this.getParserFromSuffix(dependency.request.url)); + + if (dependency.parser) { + dependency._iLoader.dataFormat = dependency.parser.dataFormat; + } else { + // Always use BINARY for unknown file formats. The thorough + // file type check will determine format after load, and if + // binary, a text load will have broken the file data. + dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; + } + } + + dependency._iLoader.load(dependency.request); + } + } + + private joinUrl(base:string, end:string):string + { + if (end.charAt(0) == '/') + end = end.substr(1); + + if (base.length == 0) + return end; + + if (base.charAt(base.length - 1) == '/') + base = base.substr(0, base.length - 1); + + return base.concat('/', end); + + } + + private resolveDependencyUrl(dependency:ResourceDependency):string + { + var scheme_re:RegExp; + var base:string; + var url:string = dependency.request.url; + + // Has the user re-mapped this URL? + if (this._context && this._context._iHasMappingForUrl(url)) + return this._context._iGetRemappedUrl(url); + + // This is the "base" dependency, i.e. the actual requested asset. + // We will not try to resolve this since the user can probably be + // thrusted to know this URL better than our automatic resolver. :) + if (url == this._uri) + return url; + + + // Absolute URL? Check if starts with slash or a URL + // scheme definition (e.g. ftp://, http://, file://) + scheme_re = new RegExp('/^[a-zA-Z]{3,4}:\/\//'); + + if (url.charAt(0) == '/') { + if (this._context && this._context.overrideAbsolutePaths) + return this.joinUrl(this._context.dependencyBaseUrl, url); else + return url; + } else if (scheme_re.test(url)) { + // If overriding full URLs, get rid of scheme (e.g. "http://") + // and replace with the dependencyBaseUrl defined by user. + if (this._context && this._context.overrideFullURLs) { + + var noscheme_url : string = url.replace( scheme_re , '' );//url['replace'](scheme_re); + return this.joinUrl(this._context.dependencyBaseUrl, noscheme_url); + } + } + + // Since not absolute, just get rid of base file name to find it's + // folder and then concatenate dynamic URL + if (this._context && this._context.dependencyBaseUrl) { + base = this._context.dependencyBaseUrl; + return this.joinUrl(base, url); + } else { + base = this._uri.substring(0, this._uri.lastIndexOf('/') + 1); + return this.joinUrl(base, url); + } + } + + private retrieveParserDependencies() + { + if (!this._currentDependency) + return; + + var parserDependancies = this._currentDependency.parser.dependencies + var i:number, len:number = parserDependancies.length; + + for (i = 0; i < len; i++) + this._currentDependency.dependencies[i] = parserDependancies[i]; + + + // Since more dependencies might be added eventually, empty this + // list so that the same dependency isn't retrieved more than once. + parserDependancies.length = 0; + + this._stack.push(this._currentDependency); + + this.retrieveNext(); + } + + private resolveParserDependencies() + { + this._currentDependency._iSuccess = true; + + // Retrieve any last dependencies remaining on this parser, or + // if none exists, just move on. + if (this._currentDependency.parser && this._currentDependency.parser.dependencies.length && (!this._context || this._context.includeDependencies))//context may be null + this.retrieveParserDependencies(); + else + this.retrieveNext(); + } + + /** + * Called when a single dependency loading failed, and pushes further dependencies onto the stack. + * @param event + */ + private onLoadError(event:IOErrorEvent) + { + var handled:boolean; + var isDependency:boolean = (this._currentDependency != this._baseDependency); + var loader:URLLoader = event.target;//TODO: keep on eye on this one + + this.removeEventListeners(loader); + + if (this.hasEventListener(IOErrorEvent.IO_ERROR )) { + this.dispatchEvent(event); + handled = true; + } else { + // TODO: Consider not doing this even when AssetLoader does have it's own LOAD_ERROR listener + var i:number, len:number = this._errorHandlers.length; + for (i = 0; i < len; i++) + if (!handled) + handled = this._errorHandlers[i](event); + } + + if (handled) { + + //if (isDependency && ! event.isDefaultPrevented()) { + if (isDependency) { // TODO: JS / AS3 Change - we don't have isDefaultPrevented - so will this work + + this._currentDependency.resolveFailure(); + this.retrieveNext(); + + } else { + // Either this was the base file (last left in the stack) or + // default behavior was prevented by the handlers, and hence + // there is nothing more to do than clean up and bail. + this.dispose(); + return; + } + } else { + + // Error event was not handled by listeners directly on AssetLoader or + // on any of the subscribed loaders (in the list of error handlers.) + throw new Error(); + } + } + + /** + * Called when a dependency parsing failed, and dispatches a ParserEvent.PARSE_ERROR + * @param event + */ + private onParseError(event:ParserEvent) + { + var handled:boolean; + + var isDependency:boolean = (this._currentDependency != this._baseDependency); + + var loader:URLLoader = event.target; + + this.removeEventListeners(loader); + + if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { + this.dispatchEvent(event); + handled = true; + } else { + // TODO: Consider not doing this even when AssetLoader does + // have it's own LOAD_ERROR listener + var i:number, len:number = this._parseErrorHandlers.length; + + for (i = 0; i < len; i++) + if (!handled) + handled = this._parseErrorHandlers[i](event); + } + + if (handled) { + this.dispose(); + return; + } else { + // Error event was not handled by listeners directly on AssetLoader or + // on any of the subscribed loaders (in the list of error handlers.) + throw new Error(event.message); + } + } + + private onAssetComplete(event:AssetEvent) + { + // Add loaded asset to list of assets retrieved as part + // of the current dependency. This list will be inspected + // by the parent parser when dependency is resolved + if (this._currentDependency) + this._currentDependency.assets.push(event.asset); + + event.asset.resetAssetPath(event.asset.name, this._namespace); + + if (!this._currentDependency.suppresAssetEvents) + this.dispatchEvent(event); + } + + private onReadyForDependencies(event:ParserEvent) + { + var parser:ParserBase = event.target; + + if (this._context && !this._context.includeDependencies) + parser._iResumeParsingAfterDependencies(); + else + this.retrieveParserDependencies(); + } + + /** + * Called when a single dependency was parsed, and pushes further dependencies onto the stack. + * @param event + */ + private onLoadComplete(event:Event) + { + var loader:URLLoader = event.target; + + this.removeEventListeners(loader); + + // Resolve this dependency + this._currentDependency._iSetData(loader.data); + + if (this._currentDependency.retrieveAsRawData) { + // No need to parse this data, which should be returned as is + this.resolveParserDependencies(); + } else { + this.parseDependency(this._currentDependency); + } + } + + /** + * Called when parsing is complete. + */ + private onParseComplete(event:ParserEvent):void + { + var parser:ParserBase = event.target; + + this.resolveParserDependencies();//resolve in front of removing listeners to allow any remaining asset events to propagate + + parser.removeEventListener(ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); + parser.removeEventListener(ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); + parser.removeEventListener(ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); + parser.removeEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + parser.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + } + + /** + * Called when an image is too large or it's dimensions are not a power of 2 + * @param event + */ + private onTextureSizeError(event:AssetEvent) + { + event.asset.name = this._currentDependency.resolveName(event.asset); + + this.dispatchEvent(event); + } + + private addEventListeners(loader:URLLoader) + { + loader.addEventListener(Event.COMPLETE, this._onLoadCompleteDelegate); + loader.addEventListener(IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); + } + + private removeEventListeners(loader:URLLoader) + { + loader.removeEventListener(Event.COMPLETE, this._onLoadCompleteDelegate); + loader.removeEventListener(IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); + } + + public stop() + { + this.dispose(); + } + + private dispose() + { + this._errorHandlers = null; + this._parseErrorHandlers = null; + this._context = null; + this._token = null; + this._stack = null; + + if (this._currentDependency && this._currentDependency._iLoader) + this.removeEventListeners(this._currentDependency._iLoader); + + this._currentDependency = null; + + } + + /** + * @private + * This method is used by other loader classes (e.g. Loader3D and AssetLibraryBundle) to + * add error event listeners to the AssetLoader instance. This system is used instead of + * the regular EventDispatcher system so that the AssetLibrary error handler can be sure + * that if hasEventListener() returns true, it's client code that's listening for the + * event. Secondly, functions added as error handler through this custom method are + * expected to return a boolean value indicating whether the event was handled (i.e. + * whether they in turn had any client code listening for the event.) If no handlers + * return true, the AssetLoader knows that the event wasn't handled and will throw an RTE. + */ + + public _iAddParseErrorHandler(handler) + { + if (this._parseErrorHandlers.indexOf(handler) < 0) + this._parseErrorHandlers.push(handler); + } + + public _iAddErrorHandler(handler) + { + if (this._errorHandlers.indexOf(handler) < 0) + this._errorHandlers.push(handler); + } + + + /** + * Guesses the parser to be used based on the file contents. + * @param data The data to be parsed. + * @param uri The url or id of the object to be parsed. + * @return An instance of the guessed parser. + */ + private getParserFromData(data:any):ParserBase + { + var len:number = AssetLoader._parsers.length; + + // go in reverse order to allow application override of default parser added in away.proper + for (var i:number = len - 1; i >= 0; i--) + if (AssetLoader._parsers[i].supportsData(data)) + return new AssetLoader._parsers[i](); + + return null; + } + + + /** + * Initiates parsing of the loaded dependency. + * + * @param The dependency to be parsed. + */ + private parseDependency(dependency:ResourceDependency):void + { + var parser:ParserBase = dependency.parser; + + // If no parser has been defined, try to find one by letting + // all plugged in parsers inspect the actual data. + if (!parser) + dependency._iSetParser(parser = this.getParserFromData(dependency.data)); + + if (parser) { + parser.addEventListener(ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); + parser.addEventListener(ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); + parser.addEventListener(ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); + parser.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); + parser.addEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); + + if (dependency.request && dependency.request.url) + parser._iFileName = dependency.request.url; + + parser.materialMode = this._materialMode; + + parser.parseAsync(dependency.data); + + } else { + var message:string = "No parser defined. To enable all parsers for auto-detection, use Parsers.enableAllBundled()" + if(this.hasEventListener(ParserEvent.PARSE_ERROR)) + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message)); + else + throw new Error(message); + } + } + + /** + * Guesses the parser to be used based on the file extension. + * @return An instance of the guessed parser. + */ + private getParserFromSuffix(url:string):ParserBase + { + // Get rid of query string if any and extract extension + var base:string = (url.indexOf('?') > 0)? url.split('?')[0] : url; + var fileExtension:string = base.substr(base.lastIndexOf('.') + 1).toLowerCase(); + + var len:number = AssetLoader._parsers.length; + + // go in reverse order to allow application override of default parser added in away.proper + for (var i:number = len - 1; i >= 0; i--) { + var parserClass:any = AssetLoader._parsers[i]; + if (parserClass.supportsType(fileExtension)) + return new parserClass(); + } + + return null; + } +} + +export = AssetLoader; \ No newline at end of file diff --git a/lib/core/library/AssetLoaderContext.js b/lib/core/library/AssetLoaderContext.js new file mode 100755 index 00000000..fd4487a1 --- /dev/null +++ b/lib/core/library/AssetLoaderContext.js @@ -0,0 +1,168 @@ +var AssetLoaderContext = (function () { + /** + * AssetLoaderContext provides configuration for the AssetLoader load() and parse() operations. + * Use it to configure how (and if) dependencies are loaded, or to map dependency URLs to + * embedded data. + * + * @see away.loading.AssetLoader + */ + function AssetLoaderContext(includeDependencies, dependencyBaseUrl) { + if (typeof includeDependencies === "undefined") { includeDependencies = true; } + if (typeof dependencyBaseUrl === "undefined") { dependencyBaseUrl = null; } + this._includeDependencies = includeDependencies; + this._dependencyBaseUrl = dependencyBaseUrl || ''; + this._embeddedDataByUrl = {}; + this._remappedUrls = {}; + this._materialMode = AssetLoaderContext.UNDEFINED; + } + Object.defineProperty(AssetLoaderContext.prototype, "includeDependencies", { + /** + * Defines whether dependencies (all files except the one at the URL given to the load() or + * parseData() operations) should be automatically loaded. Defaults to true. + */ + get: function () { + return this._includeDependencies; + }, + set: function (val) { + this._includeDependencies = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLoaderContext.prototype, "materialMode", { + /** + * MaterialMode defines, if the Parser should create SinglePass or MultiPass Materials + * Options: + * 0 (Default / undefined) - All Parsers will create SinglePassMaterials, but the AWD2.1parser will create Materials as they are defined in the file + * 1 (Force SinglePass) - All Parsers create SinglePassMaterials + * 2 (Force MultiPass) - All Parsers will create MultiPassMaterials + * + */ + get: function () { + return this._materialMode; + }, + set: function (materialMode) { + this._materialMode = materialMode; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLoaderContext.prototype, "dependencyBaseUrl", { + /** + * A base URL that will be prepended to all relative dependency URLs found in a loaded resource. + * Absolute paths will not be affected by the value of this property. + */ + get: function () { + return this._dependencyBaseUrl; + }, + set: function (val) { + this._dependencyBaseUrl = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLoaderContext.prototype, "overrideAbsolutePaths", { + /** + * Defines whether absolute paths (defined as paths that begin with a "/") should be overridden + * with the dependencyBaseUrl defined in this context. If this is true, and the base path is + * "base", /path/to/asset.jpg will be resolved as base/path/to/asset.jpg. + */ + get: function () { + return this._overrideAbsPath; + }, + set: function (val) { + this._overrideAbsPath = val; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(AssetLoaderContext.prototype, "overrideFullURLs", { + /** + * Defines whether "full" URLs (defined as a URL that includes a scheme, e.g. http://) should be + * overridden with the dependencyBaseUrl defined in this context. If this is true, and the base + * path is "base", http://example.com/path/to/asset.jpg will be resolved as base/path/to/asset.jpg. + */ + get: function () { + return this._overrideFullUrls; + }, + set: function (val) { + this._overrideFullUrls = val; + }, + enumerable: true, + configurable: true + }); + + + /** + * Map a URL to another URL, so that files that are referred to by the original URL will instead + * be loaded from the new URL. Use this when your file structure does not match the one that is + * expected by the loaded file. + * + * @param originalUrl The original URL which is referenced in the loaded resource. + * @param newUrl The URL from which away.should load the resource instead. + * + * @see mapUrlToData() + */ + AssetLoaderContext.prototype.mapUrl = function (originalUrl, newUrl) { + this._remappedUrls[originalUrl] = newUrl; + }; + + /** + * Map a URL to embedded data, so that instead of trying to load a dependency from the URL at + * which it's referenced, the dependency data will be retrieved straight from the memory instead. + * + * @param originalUrl The original URL which is referenced in the loaded resource. + * @param data The embedded data. Can be ByteArray or a class which can be used to create a bytearray. + */ + AssetLoaderContext.prototype.mapUrlToData = function (originalUrl, data) { + this._embeddedDataByUrl[originalUrl] = data; + }; + + /** + * @private + * Defines whether embedded data has been mapped to a particular URL. + */ + AssetLoaderContext.prototype._iHasDataForUrl = function (url) { + return this._embeddedDataByUrl.hasOwnProperty(url); + }; + + /** + * @private + * Returns embedded data for a particular URL. + */ + AssetLoaderContext.prototype._iGetDataForUrl = function (url) { + return this._embeddedDataByUrl[url]; + }; + + /** + * @private + * Defines whether a replacement URL has been mapped to a particular URL. + */ + AssetLoaderContext.prototype._iHasMappingForUrl = function (url) { + return this._remappedUrls.hasOwnProperty(url); + }; + + /** + * @private + * Returns new (replacement) URL for a particular original URL. + */ + AssetLoaderContext.prototype._iGetRemappedUrl = function (originalUrl) { + return this._remappedUrls[originalUrl]; + }; + AssetLoaderContext.UNDEFINED = 0; + AssetLoaderContext.SINGLEPASS_MATERIALS = 1; + AssetLoaderContext.MULTIPASS_MATERIALS = 2; + return AssetLoaderContext; +})(); + +module.exports = AssetLoaderContext; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Bc3NldExvYWRlckNvbnRleHQudHMiXSwibmFtZXMiOlsiQXNzZXRMb2FkZXJDb250ZXh0IiwiQXNzZXRMb2FkZXJDb250ZXh0LmNvbnN0cnVjdG9yIiwiQXNzZXRMb2FkZXJDb250ZXh0Lm1hcFVybCIsIkFzc2V0TG9hZGVyQ29udGV4dC5tYXBVcmxUb0RhdGEiLCJBc3NldExvYWRlckNvbnRleHQuX2lIYXNEYXRhRm9yVXJsIiwiQXNzZXRMb2FkZXJDb250ZXh0Ll9pR2V0RGF0YUZvclVybCIsIkFzc2V0TG9hZGVyQ29udGV4dC5faUhhc01hcHBpbmdGb3JVcmwiLCJBc3NldExvYWRlckNvbnRleHQuX2lHZXRSZW1hcHBlZFVybCJdLCJtYXBwaW5ncyI6IkFBQUE7SUFzQkNBOzs7Ozs7TUFER0E7SUFDSEEsNEJBQVlBLG1CQUFrQ0EsRUFBRUEsaUJBQStCQTtRQUFuRUMsa0RBQUFBLG1CQUFtQkEsR0FBV0EsSUFBSUE7QUFBQUEsUUFBRUEsZ0RBQUFBLGlCQUFpQkEsR0FBVUEsSUFBSUE7QUFBQUEsUUFFOUVBLElBQUlBLENBQUNBLG9CQUFvQkEsR0FBR0EsbUJBQW1CQTtRQUMvQ0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxHQUFHQSxpQkFBaUJBLElBQUlBLEVBQUVBO1FBQ2pEQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUdBLEVBQUVBO1FBQzVCQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxFQUFFQTtRQUN2QkEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0Esa0JBQWtCQSxDQUFDQSxTQUFTQTtJQUNsREEsQ0FBQ0E7SUFNREQ7UUFBQUE7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxvQkFBb0JBO1FBQ2pDQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUErQkEsR0FBV0E7WUFFekNBLElBQUlBLENBQUNBLG9CQUFvQkEsR0FBR0EsR0FBR0E7UUFDaENBLENBQUNBOzs7O0FBTEFBOztJQWVEQTtRQUFBQTs7Ozs7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUMxQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBd0JBLFlBQW1CQTtZQUUxQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsWUFBWUE7UUFDbENBLENBQUNBOzs7O0FBTEFBOztJQVdEQTtRQUFBQTs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGtCQUFrQkE7UUFDL0JBLENBQUNBO1FBRURBLEtBQUFBLFVBQTZCQSxHQUFVQTtZQUV0Q0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxHQUFHQSxHQUFHQTtRQUM5QkEsQ0FBQ0E7Ozs7QUFMQUE7O0lBWURBO1FBQUFBOzs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGdCQUFnQkE7UUFDN0JBLENBQUNBO1FBRURBLEtBQUFBLFVBQWlDQSxHQUFXQTtZQUUzQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxHQUFHQTtRQUM1QkEsQ0FBQ0E7Ozs7QUFMQUE7O0lBWURBO1FBQUFBOzs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGlCQUFpQkE7UUFDOUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQTRCQSxHQUFXQTtZQUV0Q0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxHQUFHQTtRQUM3QkEsQ0FBQ0E7Ozs7QUFMQUE7O0lBaUJEQTs7Ozs7Ozs7O01BREdBOzBDQUNIQSxVQUFjQSxXQUFrQkEsRUFBRUEsTUFBYUE7UUFFOUNFLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLFdBQVdBLENBQUNBLEdBQUdBLE1BQU1BO0lBQ3pDQSxDQUFDQTs7SUFTREY7Ozs7OztNQURHQTtnREFDSEEsVUFBb0JBLFdBQWtCQSxFQUFFQSxJQUFRQTtRQUUvQ0csSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxXQUFXQSxDQUFDQSxHQUFHQSxJQUFJQTtJQUM1Q0EsQ0FBQ0E7O0lBTURIOzs7TUFER0E7bURBQ0hBLFVBQXVCQSxHQUFVQTtRQUVoQ0ksT0FBT0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxjQUFjQSxDQUFDQSxHQUFHQSxDQUFDQTtJQUNuREEsQ0FBQ0E7O0lBTURKOzs7TUFER0E7bURBQ0hBLFVBQXVCQSxHQUFVQTtRQUVoQ0ssT0FBT0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxHQUFHQSxDQUFDQTtJQUNwQ0EsQ0FBQ0E7O0lBTURMOzs7TUFER0E7c0RBQ0hBLFVBQTBCQSxHQUFVQTtRQUVuQ00sT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7SUFDOUNBLENBQUNBOztJQU1ETjs7O01BREdBO29EQUNIQSxVQUF3QkEsV0FBa0JBO1FBRXpDTyxPQUFPQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxXQUFXQSxDQUFDQTtJQUN2Q0EsQ0FBQ0E7SUF0S0RQLCtCQUFpQ0EsQ0FBQ0E7SUFDbENBLDBDQUE0Q0EsQ0FBQ0E7SUFDN0NBLHlDQUEyQ0EsQ0FBQ0E7SUFxSzdDQSwwQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxtQ0FBNEIsQ0FBQSIsImZpbGUiOiJjb3JlL2xpYnJhcnkvQXNzZXRMb2FkZXJDb250ZXh0LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgQXNzZXRMb2FkZXJDb250ZXh0XG57XG5cdHB1YmxpYyBzdGF0aWMgVU5ERUZJTkVEOm51bWJlciA9IDA7XG5cdHB1YmxpYyBzdGF0aWMgU0lOR0xFUEFTU19NQVRFUklBTFM6bnVtYmVyID0gMTtcblx0cHVibGljIHN0YXRpYyBNVUxUSVBBU1NfTUFURVJJQUxTOm51bWJlciA9IDI7XG5cblx0cHJpdmF0ZSBfaW5jbHVkZURlcGVuZGVuY2llczpib29sZWFuO1xuXHRwcml2YXRlIF9kZXBlbmRlbmN5QmFzZVVybDpzdHJpbmc7XG5cdHByaXZhdGUgX2VtYmVkZGVkRGF0YUJ5VXJsOk9iamVjdDtcblx0cHJpdmF0ZSBfcmVtYXBwZWRVcmxzOk9iamVjdDtcblx0cHJpdmF0ZSBfbWF0ZXJpYWxNb2RlOm51bWJlcjtcblxuXHRwcml2YXRlIF9vdmVycmlkZUFic1BhdGg6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfb3ZlcnJpZGVGdWxsVXJsczpib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBBc3NldExvYWRlckNvbnRleHQgcHJvdmlkZXMgY29uZmlndXJhdGlvbiBmb3IgdGhlIEFzc2V0TG9hZGVyIGxvYWQoKSBhbmQgcGFyc2UoKSBvcGVyYXRpb25zLlxuXHQgKiBVc2UgaXQgdG8gY29uZmlndXJlIGhvdyAoYW5kIGlmKSBkZXBlbmRlbmNpZXMgYXJlIGxvYWRlZCwgb3IgdG8gbWFwIGRlcGVuZGVuY3kgVVJMcyB0b1xuXHQgKiBlbWJlZGRlZCBkYXRhLlxuXHQgKlxuXHQgKiBAc2VlIGF3YXkubG9hZGluZy5Bc3NldExvYWRlclxuXHQgKi9cblx0Y29uc3RydWN0b3IoaW5jbHVkZURlcGVuZGVuY2llczpib29sZWFuID0gdHJ1ZSwgZGVwZW5kZW5jeUJhc2VVcmw6c3RyaW5nID0gbnVsbClcblx0e1xuXHRcdHRoaXMuX2luY2x1ZGVEZXBlbmRlbmNpZXMgPSBpbmNsdWRlRGVwZW5kZW5jaWVzO1xuXHRcdHRoaXMuX2RlcGVuZGVuY3lCYXNlVXJsID0gZGVwZW5kZW5jeUJhc2VVcmwgfHwgJyc7XG5cdFx0dGhpcy5fZW1iZWRkZWREYXRhQnlVcmwgPSB7fTtcblx0XHR0aGlzLl9yZW1hcHBlZFVybHMgPSB7fTtcblx0XHR0aGlzLl9tYXRlcmlhbE1vZGUgPSBBc3NldExvYWRlckNvbnRleHQuVU5ERUZJTkVEO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciBkZXBlbmRlbmNpZXMgKGFsbCBmaWxlcyBleGNlcHQgdGhlIG9uZSBhdCB0aGUgVVJMIGdpdmVuIHRvIHRoZSBsb2FkKCkgb3Jcblx0ICogcGFyc2VEYXRhKCkgb3BlcmF0aW9ucykgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgbG9hZGVkLiBEZWZhdWx0cyB0byB0cnVlLlxuXHQgKi9cblx0cHVibGljIGdldCBpbmNsdWRlRGVwZW5kZW5jaWVzKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2luY2x1ZGVEZXBlbmRlbmNpZXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGluY2x1ZGVEZXBlbmRlbmNpZXModmFsOmJvb2xlYW4pXG5cdHtcblx0XHR0aGlzLl9pbmNsdWRlRGVwZW5kZW5jaWVzID0gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hdGVyaWFsTW9kZSBkZWZpbmVzLCBpZiB0aGUgUGFyc2VyIHNob3VsZCBjcmVhdGUgU2luZ2xlUGFzcyBvciBNdWx0aVBhc3MgTWF0ZXJpYWxzXG5cdCAqIE9wdGlvbnM6XG5cdCAqIDAgKERlZmF1bHQgLyB1bmRlZmluZWQpIC0gQWxsIFBhcnNlcnMgd2lsbCBjcmVhdGUgU2luZ2xlUGFzc01hdGVyaWFscywgYnV0IHRoZSBBV0QyLjFwYXJzZXIgd2lsbCBjcmVhdGUgTWF0ZXJpYWxzIGFzIHRoZXkgYXJlIGRlZmluZWQgaW4gdGhlIGZpbGVcblx0ICogMSAoRm9yY2UgU2luZ2xlUGFzcykgLSBBbGwgUGFyc2VycyBjcmVhdGUgU2luZ2xlUGFzc01hdGVyaWFsc1xuXHQgKiAyIChGb3JjZSBNdWx0aVBhc3MpIC0gQWxsIFBhcnNlcnMgd2lsbCBjcmVhdGUgTXVsdGlQYXNzTWF0ZXJpYWxzXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1hdGVyaWFsTW9kZSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21hdGVyaWFsTW9kZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbWF0ZXJpYWxNb2RlKG1hdGVyaWFsTW9kZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9tYXRlcmlhbE1vZGUgPSBtYXRlcmlhbE1vZGU7XG5cdH1cblxuXHQvKipcblx0ICogQSBiYXNlIFVSTCB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIGFsbCByZWxhdGl2ZSBkZXBlbmRlbmN5IFVSTHMgZm91bmQgaW4gYSBsb2FkZWQgcmVzb3VyY2UuXG5cdCAqIEFic29sdXRlIHBhdGhzIHdpbGwgbm90IGJlIGFmZmVjdGVkIGJ5IHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5LlxuXHQgKi9cblx0cHVibGljIGdldCBkZXBlbmRlbmN5QmFzZVVybCgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RlcGVuZGVuY3lCYXNlVXJsO1xuXHR9XG5cblx0cHVibGljIHNldCBkZXBlbmRlbmN5QmFzZVVybCh2YWw6c3RyaW5nKVxuXHR7XG5cdFx0dGhpcy5fZGVwZW5kZW5jeUJhc2VVcmwgPSB2YWw7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIGFic29sdXRlIHBhdGhzIChkZWZpbmVkIGFzIHBhdGhzIHRoYXQgYmVnaW4gd2l0aCBhIFwiL1wiKSBzaG91bGQgYmUgb3ZlcnJpZGRlblxuXHQgKiB3aXRoIHRoZSBkZXBlbmRlbmN5QmFzZVVybCBkZWZpbmVkIGluIHRoaXMgY29udGV4dC4gSWYgdGhpcyBpcyB0cnVlLCBhbmQgdGhlIGJhc2UgcGF0aCBpc1xuXHQgKiBcImJhc2VcIiwgL3BhdGgvdG8vYXNzZXQuanBnIHdpbGwgYmUgcmVzb2x2ZWQgYXMgYmFzZS9wYXRoL3RvL2Fzc2V0LmpwZy5cblx0ICovXG5cdHB1YmxpYyBnZXQgb3ZlcnJpZGVBYnNvbHV0ZVBhdGhzKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX292ZXJyaWRlQWJzUGF0aDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgb3ZlcnJpZGVBYnNvbHV0ZVBhdGhzKHZhbDpib29sZWFuKVxuXHR7XG5cdFx0dGhpcy5fb3ZlcnJpZGVBYnNQYXRoID0gdmFsO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciBcImZ1bGxcIiBVUkxzIChkZWZpbmVkIGFzIGEgVVJMIHRoYXQgaW5jbHVkZXMgYSBzY2hlbWUsIGUuZy4gaHR0cDovLykgc2hvdWxkIGJlXG5cdCAqIG92ZXJyaWRkZW4gd2l0aCB0aGUgZGVwZW5kZW5jeUJhc2VVcmwgZGVmaW5lZCBpbiB0aGlzIGNvbnRleHQuIElmIHRoaXMgaXMgdHJ1ZSwgYW5kIHRoZSBiYXNlXG5cdCAqIHBhdGggaXMgXCJiYXNlXCIsIGh0dHA6Ly9leGFtcGxlLmNvbS9wYXRoL3RvL2Fzc2V0LmpwZyB3aWxsIGJlIHJlc29sdmVkIGFzIGJhc2UvcGF0aC90by9hc3NldC5qcGcuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG92ZXJyaWRlRnVsbFVSTHMoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fb3ZlcnJpZGVGdWxsVXJscztcblx0fVxuXG5cdHB1YmxpYyBzZXQgb3ZlcnJpZGVGdWxsVVJMcyh2YWw6Ym9vbGVhbilcblx0e1xuXHRcdHRoaXMuX292ZXJyaWRlRnVsbFVybHMgPSB2YWw7XG5cdH1cblxuXHQvKipcblx0ICogTWFwIGEgVVJMIHRvIGFub3RoZXIgVVJMLCBzbyB0aGF0IGZpbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5IHRoZSBvcmlnaW5hbCBVUkwgd2lsbCBpbnN0ZWFkXG5cdCAqIGJlIGxvYWRlZCBmcm9tIHRoZSBuZXcgVVJMLiBVc2UgdGhpcyB3aGVuIHlvdXIgZmlsZSBzdHJ1Y3R1cmUgZG9lcyBub3QgbWF0Y2ggdGhlIG9uZSB0aGF0IGlzXG5cdCAqIGV4cGVjdGVkIGJ5IHRoZSBsb2FkZWQgZmlsZS5cblx0ICpcblx0ICogQHBhcmFtIG9yaWdpbmFsVXJsIFRoZSBvcmlnaW5hbCBVUkwgd2hpY2ggaXMgcmVmZXJlbmNlZCBpbiB0aGUgbG9hZGVkIHJlc291cmNlLlxuXHQgKiBAcGFyYW0gbmV3VXJsIFRoZSBVUkwgZnJvbSB3aGljaCBhd2F5LnNob3VsZCBsb2FkIHRoZSByZXNvdXJjZSBpbnN0ZWFkLlxuXHQgKlxuXHQgKiBAc2VlIG1hcFVybFRvRGF0YSgpXG5cdCAqL1xuXHRwdWJsaWMgbWFwVXJsKG9yaWdpbmFsVXJsOnN0cmluZywgbmV3VXJsOnN0cmluZylcblx0e1xuXHRcdHRoaXMuX3JlbWFwcGVkVXJsc1tvcmlnaW5hbFVybF0gPSBuZXdVcmw7XG5cdH1cblxuXHQvKipcblx0ICogTWFwIGEgVVJMIHRvIGVtYmVkZGVkIGRhdGEsIHNvIHRoYXQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gbG9hZCBhIGRlcGVuZGVuY3kgZnJvbSB0aGUgVVJMIGF0XG5cdCAqIHdoaWNoIGl0J3MgcmVmZXJlbmNlZCwgdGhlIGRlcGVuZGVuY3kgZGF0YSB3aWxsIGJlIHJldHJpZXZlZCBzdHJhaWdodCBmcm9tIHRoZSBtZW1vcnkgaW5zdGVhZC5cblx0ICpcblx0ICogQHBhcmFtIG9yaWdpbmFsVXJsIFRoZSBvcmlnaW5hbCBVUkwgd2hpY2ggaXMgcmVmZXJlbmNlZCBpbiB0aGUgbG9hZGVkIHJlc291cmNlLlxuXHQgKiBAcGFyYW0gZGF0YSBUaGUgZW1iZWRkZWQgZGF0YS4gQ2FuIGJlIEJ5dGVBcnJheSBvciBhIGNsYXNzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIGJ5dGVhcnJheS5cblx0ICovXG5cdHB1YmxpYyBtYXBVcmxUb0RhdGEob3JpZ2luYWxVcmw6c3RyaW5nLCBkYXRhOmFueSlcblx0e1xuXHRcdHRoaXMuX2VtYmVkZGVkRGF0YUJ5VXJsW29yaWdpbmFsVXJsXSA9IGRhdGE7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogRGVmaW5lcyB3aGV0aGVyIGVtYmVkZGVkIGRhdGEgaGFzIGJlZW4gbWFwcGVkIHRvIGEgcGFydGljdWxhciBVUkwuXG5cdCAqL1xuXHRwdWJsaWMgX2lIYXNEYXRhRm9yVXJsKHVybDpzdHJpbmcpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9lbWJlZGRlZERhdGFCeVVybC5oYXNPd25Qcm9wZXJ0eSh1cmwpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqIFJldHVybnMgZW1iZWRkZWQgZGF0YSBmb3IgYSBwYXJ0aWN1bGFyIFVSTC5cblx0ICovXG5cdHB1YmxpYyBfaUdldERhdGFGb3JVcmwodXJsOnN0cmluZyk6YW55XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZW1iZWRkZWREYXRhQnlVcmxbdXJsXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgYSByZXBsYWNlbWVudCBVUkwgaGFzIGJlZW4gbWFwcGVkIHRvIGEgcGFydGljdWxhciBVUkwuXG5cdCAqL1xuXHRwdWJsaWMgX2lIYXNNYXBwaW5nRm9yVXJsKHVybDpzdHJpbmcpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9yZW1hcHBlZFVybHMuaGFzT3duUHJvcGVydHkodXJsKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBSZXR1cm5zIG5ldyAocmVwbGFjZW1lbnQpIFVSTCBmb3IgYSBwYXJ0aWN1bGFyIG9yaWdpbmFsIFVSTC5cblx0ICovXG5cdHB1YmxpYyBfaUdldFJlbWFwcGVkVXJsKG9yaWdpbmFsVXJsOnN0cmluZyk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcmVtYXBwZWRVcmxzW29yaWdpbmFsVXJsXTtcblx0fVxufVxuXG5leHBvcnQgPSBBc3NldExvYWRlckNvbnRleHQ7Il19 \ No newline at end of file diff --git a/lib/core/library/AssetLoaderContext.ts b/lib/core/library/AssetLoaderContext.ts new file mode 100644 index 00000000..1c8c331e --- /dev/null +++ b/lib/core/library/AssetLoaderContext.ts @@ -0,0 +1,172 @@ +class AssetLoaderContext +{ + public static UNDEFINED:number = 0; + public static SINGLEPASS_MATERIALS:number = 1; + public static MULTIPASS_MATERIALS:number = 2; + + private _includeDependencies:boolean; + private _dependencyBaseUrl:string; + private _embeddedDataByUrl:Object; + private _remappedUrls:Object; + private _materialMode:number; + + private _overrideAbsPath:boolean; + private _overrideFullUrls:boolean; + + /** + * AssetLoaderContext provides configuration for the AssetLoader load() and parse() operations. + * Use it to configure how (and if) dependencies are loaded, or to map dependency URLs to + * embedded data. + * + * @see away.loading.AssetLoader + */ + constructor(includeDependencies:boolean = true, dependencyBaseUrl:string = null) + { + this._includeDependencies = includeDependencies; + this._dependencyBaseUrl = dependencyBaseUrl || ''; + this._embeddedDataByUrl = {}; + this._remappedUrls = {}; + this._materialMode = AssetLoaderContext.UNDEFINED; + } + + /** + * Defines whether dependencies (all files except the one at the URL given to the load() or + * parseData() operations) should be automatically loaded. Defaults to true. + */ + public get includeDependencies():boolean + { + return this._includeDependencies; + } + + public set includeDependencies(val:boolean) + { + this._includeDependencies = val; + } + + /** + * MaterialMode defines, if the Parser should create SinglePass or MultiPass Materials + * Options: + * 0 (Default / undefined) - All Parsers will create SinglePassMaterials, but the AWD2.1parser will create Materials as they are defined in the file + * 1 (Force SinglePass) - All Parsers create SinglePassMaterials + * 2 (Force MultiPass) - All Parsers will create MultiPassMaterials + * + */ + public get materialMode():number + { + return this._materialMode; + } + + public set materialMode(materialMode:number) + { + this._materialMode = materialMode; + } + + /** + * A base URL that will be prepended to all relative dependency URLs found in a loaded resource. + * Absolute paths will not be affected by the value of this property. + */ + public get dependencyBaseUrl():string + { + return this._dependencyBaseUrl; + } + + public set dependencyBaseUrl(val:string) + { + this._dependencyBaseUrl = val; + } + + /** + * Defines whether absolute paths (defined as paths that begin with a "/") should be overridden + * with the dependencyBaseUrl defined in this context. If this is true, and the base path is + * "base", /path/to/asset.jpg will be resolved as base/path/to/asset.jpg. + */ + public get overrideAbsolutePaths():boolean + { + return this._overrideAbsPath; + } + + public set overrideAbsolutePaths(val:boolean) + { + this._overrideAbsPath = val; + } + + /** + * Defines whether "full" URLs (defined as a URL that includes a scheme, e.g. http://) should be + * overridden with the dependencyBaseUrl defined in this context. If this is true, and the base + * path is "base", http://example.com/path/to/asset.jpg will be resolved as base/path/to/asset.jpg. + */ + public get overrideFullURLs():boolean + { + return this._overrideFullUrls; + } + + public set overrideFullURLs(val:boolean) + { + this._overrideFullUrls = val; + } + + /** + * Map a URL to another URL, so that files that are referred to by the original URL will instead + * be loaded from the new URL. Use this when your file structure does not match the one that is + * expected by the loaded file. + * + * @param originalUrl The original URL which is referenced in the loaded resource. + * @param newUrl The URL from which away.should load the resource instead. + * + * @see mapUrlToData() + */ + public mapUrl(originalUrl:string, newUrl:string) + { + this._remappedUrls[originalUrl] = newUrl; + } + + /** + * Map a URL to embedded data, so that instead of trying to load a dependency from the URL at + * which it's referenced, the dependency data will be retrieved straight from the memory instead. + * + * @param originalUrl The original URL which is referenced in the loaded resource. + * @param data The embedded data. Can be ByteArray or a class which can be used to create a bytearray. + */ + public mapUrlToData(originalUrl:string, data:any) + { + this._embeddedDataByUrl[originalUrl] = data; + } + + /** + * @private + * Defines whether embedded data has been mapped to a particular URL. + */ + public _iHasDataForUrl(url:string):boolean + { + return this._embeddedDataByUrl.hasOwnProperty(url); + } + + /** + * @private + * Returns embedded data for a particular URL. + */ + public _iGetDataForUrl(url:string):any + { + return this._embeddedDataByUrl[url]; + } + + /** + * @private + * Defines whether a replacement URL has been mapped to a particular URL. + */ + public _iHasMappingForUrl(url:string):boolean + { + return this._remappedUrls.hasOwnProperty(url); + } + + /** + * @private + * Returns new (replacement) URL for a particular original URL. + */ + public _iGetRemappedUrl(originalUrl:string):string + { + return this._remappedUrls[originalUrl]; + } +} + +export = AssetLoaderContext; \ No newline at end of file diff --git a/lib/core/library/AssetLoaderToken.js b/lib/core/library/AssetLoaderToken.js new file mode 100755 index 00000000..2a09f192 --- /dev/null +++ b/lib/core/library/AssetLoaderToken.js @@ -0,0 +1,192 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +/** +* Dispatched when any asset finishes parsing. Also see specific events for each +* individual asset type (meshes, materials et c.) +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="assetComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a full resource (including dependencies) finishes loading. +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] +/** +* Dispatched when a single dependency (which may be the main file of a resource) +* finishes loading. +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] +/** +* Dispatched when an error occurs during loading. I +* +* @eventType away.events.LoaderEvent +*/ +//[Event(name="loadError", type="away3d.events.LoaderEvent")] +/** +* Dispatched when an error occurs during parsing. +* +* @eventType away.events.ParserEvent +*/ +//[Event(name="parseError", type="away3d.events.ParserEvent")] +/** +* Dispatched when a skybox asset has been costructed from a ressource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="skyboxComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a camera3d asset has been costructed from a ressource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="cameraComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a mesh asset has been costructed from a ressource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="meshComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a geometry asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="geometryComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a skeleton asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="skeletonComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a skeleton pose asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="skeletonPoseComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a container asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="containerComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a texture asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="textureComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a texture projector asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="textureProjectorComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a material asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="materialComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when a animator asset has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="animatorComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an animation set has been constructed from a group of animation state resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="animationSetComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an animation state has been constructed from a group of animation node resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="animationStateComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an animation node has been constructed from a resource. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="animationNodeComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an animation state transition has been constructed from a group of animation node resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="stateTransitionComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an light asset has been constructed from a resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="lightComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an light picker asset has been constructed from a resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="lightPickerComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an effect method asset has been constructed from a resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="effectMethodComplete", type="away3d.events.AssetEvent")] +/** +* Dispatched when an shadow map method asset has been constructed from a resources. +* +* @eventType away.events.AssetEvent +*/ +//[Event(name="shadowMapMethodComplete", type="away3d.events.AssetEvent")] +/** +* Instances of this class are returned as tokens by loading operations +* to provide an object on which events can be listened for in cases where +* the actual asset loader is not directly available (e.g. when using the +* AssetLibrary to perform the load.) +* +* By listening for events on this class instead of directly on the +* AssetLibrary, one can distinguish different loads from each other. +* +* The token will dispatch all events that the original AssetLoader dispatches, +* while not providing an interface to obstruct the load and is as such a +* safer return value for loader wrappers than the loader itself. +*/ +var AssetLoaderToken = (function (_super) { + __extends(AssetLoaderToken, _super); + function AssetLoaderToken(loader) { + _super.call(this); + + this._iLoader = loader; + } + AssetLoaderToken.prototype.addEventListener = function (type, listener) { + this._iLoader.addEventListener(type, listener); + }; + + AssetLoaderToken.prototype.removeEventListener = function (type, listener) { + this._iLoader.removeEventListener(type, listener); + }; + + AssetLoaderToken.prototype.hasEventListener = function (type, listener) { + if (typeof listener === "undefined") { listener = null; } + return this._iLoader.hasEventListener(type, listener); + }; + return AssetLoaderToken; +})(EventDispatcher); + +module.exports = AssetLoaderToken; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Bc3NldExvYWRlclRva2VuLnRzIl0sIm5hbWVzIjpbIkFzc2V0TG9hZGVyVG9rZW4iLCJBc3NldExvYWRlclRva2VuLmNvbnN0cnVjdG9yIiwiQXNzZXRMb2FkZXJUb2tlbi5hZGRFdmVudExpc3RlbmVyIiwiQXNzZXRMb2FkZXJUb2tlbi5yZW1vdmVFdmVudExpc3RlbmVyIiwiQXNzZXRMb2FkZXJUb2tlbi5oYXNFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSx1RUFDNkU7O0FBRTdFOzs7OztFQUtHO0FBQ0gsZ0VBQWdFO0FBR2hFOzs7O0VBSUc7QUFDSCxvRUFBb0U7QUFHcEU7Ozs7O0VBS0c7QUFDSCxzRUFBc0U7QUFHdEU7Ozs7RUFJRztBQUNILDZEQUE2RDtBQUc3RDs7OztFQUlHO0FBQ0gsOERBQThEO0FBRzlEOzs7O0VBSUc7QUFDSCxpRUFBaUU7QUFFakU7Ozs7RUFJRztBQUNILGlFQUFpRTtBQUVqRTs7OztFQUlHO0FBQ0gsK0RBQStEO0FBRS9EOzs7O0VBSUc7QUFDSCxtRUFBbUU7QUFFbkU7Ozs7RUFJRztBQUNILG1FQUFtRTtBQUVuRTs7OztFQUlHO0FBQ0gsdUVBQXVFO0FBRXZFOzs7O0VBSUc7QUFDSCxvRUFBb0U7QUFFcEU7Ozs7RUFJRztBQUNILGtFQUFrRTtBQUVsRTs7OztFQUlHO0FBQ0gsMkVBQTJFO0FBRzNFOzs7O0VBSUc7QUFDSCxtRUFBbUU7QUFHbkU7Ozs7RUFJRztBQUNILG1FQUFtRTtBQUduRTs7OztFQUlHO0FBQ0gsdUVBQXVFO0FBR3ZFOzs7O0VBSUc7QUFDSCx5RUFBeUU7QUFHekU7Ozs7RUFJRztBQUNILHdFQUF3RTtBQUd4RTs7OztFQUlHO0FBQ0gsMEVBQTBFO0FBRzFFOzs7O0VBSUc7QUFDSCxnRUFBZ0U7QUFHaEU7Ozs7RUFJRztBQUNILHNFQUFzRTtBQUd0RTs7OztFQUlHO0FBQ0gsdUVBQXVFO0FBR3ZFOzs7O0VBSUc7QUFDSCwwRUFBMEU7QUFFMUU7Ozs7Ozs7Ozs7OztFQVlHO0FBQ0g7SUFBK0JBLG1DQUFlQTtJQUk3Q0EsMEJBQVlBLE1BQWtCQTtRQUU3QkMsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLE1BQU1BO0lBQ3ZCQSxDQUFDQTtJQUVERCw4Q0FBQUEsVUFBd0JBLElBQVdBLEVBQUVBLFFBQWlCQTtRQUVyREUsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQTtJQUMvQ0EsQ0FBQ0E7O0lBR0RGLGlEQUFBQSxVQUEyQkEsSUFBV0EsRUFBRUEsUUFBaUJBO1FBRXhERyxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxtQkFBbUJBLENBQUNBLElBQUlBLEVBQUVBLFFBQVFBLENBQUNBO0lBQ2xEQSxDQUFDQTs7SUFFREgsOENBQUFBLFVBQXdCQSxJQUFXQSxFQUFFQSxRQUF3QkE7UUFBeEJJLHVDQUFBQSxRQUFRQSxHQUFZQSxJQUFJQTtBQUFBQSxRQUU1REEsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQTtJQUN0REEsQ0FBQ0E7SUFRRkosd0JBQUNBO0FBQURBLENBQUNBLEVBakM4QixlQUFlLEVBaUM3Qzs7QUFFRCxpQ0FBMEIsQ0FBQSIsImZpbGUiOiJjb3JlL2xpYnJhcnkvQXNzZXRMb2FkZXJUb2tlbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBBc3NldExvYWRlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldExvYWRlclwiKTtcbmltcG9ydCBFdmVudERpc3BhdGNoZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiKTtcblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYW55IGFzc2V0IGZpbmlzaGVzIHBhcnNpbmcuIEFsc28gc2VlIHNwZWNpZmljIGV2ZW50cyBmb3IgZWFjaFxuICogaW5kaXZpZHVhbCBhc3NldCB0eXBlIChtZXNoZXMsIG1hdGVyaWFscyBldCBjLilcbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkFzc2V0RXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cImFzc2V0Q29tcGxldGVcIiwgdHlwZT1cImF3YXkzZC5ldmVudHMuQXNzZXRFdmVudFwiKV1cblxuXG4vKipcbiAqIERpc3BhdGNoZWQgd2hlbiBhIGZ1bGwgcmVzb3VyY2UgKGluY2x1ZGluZyBkZXBlbmRlbmNpZXMpIGZpbmlzaGVzIGxvYWRpbmcuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Mb2FkZXJFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwicmVzb3VyY2VDb21wbGV0ZVwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5Mb2FkZXJFdmVudFwiKV1cblxuXG4vKipcbiAqIERpc3BhdGNoZWQgd2hlbiBhIHNpbmdsZSBkZXBlbmRlbmN5ICh3aGljaCBtYXkgYmUgdGhlIG1haW4gZmlsZSBvZiBhIHJlc291cmNlKVxuICogZmluaXNoZXMgbG9hZGluZy5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkxvYWRlckV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJkZXBlbmRlbmN5Q29tcGxldGVcIiwgdHlwZT1cImF3YXkzZC5ldmVudHMuTG9hZGVyRXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBsb2FkaW5nLiBJXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Mb2FkZXJFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwibG9hZEVycm9yXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkxvYWRlckV2ZW50XCIpXVxuXG5cbi8qKlxuICogRGlzcGF0Y2hlZCB3aGVuIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgcGFyc2luZy5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLlBhcnNlckV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJwYXJzZUVycm9yXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLlBhcnNlckV2ZW50XCIpXVxuXG5cbi8qKlxuICogRGlzcGF0Y2hlZCB3aGVuIGEgc2t5Ym94IGFzc2V0IGhhcyBiZWVuIGNvc3RydWN0ZWQgZnJvbSBhIHJlc3NvdXJjZS5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkFzc2V0RXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cInNreWJveENvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cbi8qKlxuICogRGlzcGF0Y2hlZCB3aGVuIGEgY2FtZXJhM2QgYXNzZXQgaGFzIGJlZW4gY29zdHJ1Y3RlZCBmcm9tIGEgcmVzc291cmNlLlxuICpcbiAqIEBldmVudFR5cGUgYXdheS5ldmVudHMuQXNzZXRFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwiY2FtZXJhQ29tcGxldGVcIiwgdHlwZT1cImF3YXkzZC5ldmVudHMuQXNzZXRFdmVudFwiKV1cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYSBtZXNoIGFzc2V0IGhhcyBiZWVuIGNvc3RydWN0ZWQgZnJvbSBhIHJlc3NvdXJjZS5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkFzc2V0RXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cIm1lc2hDb21wbGV0ZVwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5Bc3NldEV2ZW50XCIpXVxuXG4vKipcbiAqIERpc3BhdGNoZWQgd2hlbiBhIGdlb21ldHJ5IGFzc2V0IGhhcyBiZWVuIGNvbnN0cnVjdGVkIGZyb20gYSByZXNvdXJjZS5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkFzc2V0RXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cImdlb21ldHJ5Q29tcGxldGVcIiwgdHlwZT1cImF3YXkzZC5ldmVudHMuQXNzZXRFdmVudFwiKV1cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYSBza2VsZXRvbiBhc3NldCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBmcm9tIGEgcmVzb3VyY2UuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJza2VsZXRvbkNvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cbi8qKlxuICogRGlzcGF0Y2hlZCB3aGVuIGEgc2tlbGV0b24gcG9zZSBhc3NldCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBmcm9tIGEgcmVzb3VyY2UuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJza2VsZXRvblBvc2VDb21wbGV0ZVwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5Bc3NldEV2ZW50XCIpXVxuXG4vKipcbiAqIERpc3BhdGNoZWQgd2hlbiBhIGNvbnRhaW5lciBhc3NldCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBmcm9tIGEgcmVzb3VyY2UuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJjb250YWluZXJDb21wbGV0ZVwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5Bc3NldEV2ZW50XCIpXVxuXG4vKipcbiAqIERpc3BhdGNoZWQgd2hlbiBhIHRleHR1cmUgYXNzZXQgaGFzIGJlZW4gY29uc3RydWN0ZWQgZnJvbSBhIHJlc291cmNlLlxuICpcbiAqIEBldmVudFR5cGUgYXdheS5ldmVudHMuQXNzZXRFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwidGV4dHVyZUNvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cbi8qKlxuICogRGlzcGF0Y2hlZCB3aGVuIGEgdGV4dHVyZSBwcm9qZWN0b3IgYXNzZXQgaGFzIGJlZW4gY29uc3RydWN0ZWQgZnJvbSBhIHJlc291cmNlLlxuICpcbiAqIEBldmVudFR5cGUgYXdheS5ldmVudHMuQXNzZXRFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwidGV4dHVyZVByb2plY3RvckNvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYSBtYXRlcmlhbCBhc3NldCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBmcm9tIGEgcmVzb3VyY2UuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJtYXRlcmlhbENvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYSBhbmltYXRvciBhc3NldCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBmcm9tIGEgcmVzb3VyY2UuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJhbmltYXRvckNvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYW4gYW5pbWF0aW9uIHNldCBoYXMgYmVlbiBjb25zdHJ1Y3RlZCBmcm9tIGEgZ3JvdXAgb2YgYW5pbWF0aW9uIHN0YXRlIHJlc291cmNlcy5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkFzc2V0RXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cImFuaW1hdGlvblNldENvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYW4gYW5pbWF0aW9uIHN0YXRlIGhhcyBiZWVuIGNvbnN0cnVjdGVkIGZyb20gYSBncm91cCBvZiBhbmltYXRpb24gbm9kZSByZXNvdXJjZXMuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJhbmltYXRpb25TdGF0ZUNvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYW4gYW5pbWF0aW9uIG5vZGUgaGFzIGJlZW4gY29uc3RydWN0ZWQgZnJvbSBhIHJlc291cmNlLlxuICpcbiAqIEBldmVudFR5cGUgYXdheS5ldmVudHMuQXNzZXRFdmVudFxuICovXG4vL1tFdmVudChuYW1lPVwiYW5pbWF0aW9uTm9kZUNvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYW4gYW5pbWF0aW9uIHN0YXRlIHRyYW5zaXRpb24gaGFzIGJlZW4gY29uc3RydWN0ZWQgZnJvbSBhIGdyb3VwIG9mIGFuaW1hdGlvbiBub2RlIHJlc291cmNlcy5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkFzc2V0RXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cInN0YXRlVHJhbnNpdGlvbkNvbXBsZXRlXCIsIHR5cGU9XCJhd2F5M2QuZXZlbnRzLkFzc2V0RXZlbnRcIildXG5cblxuLyoqXG4gKiBEaXNwYXRjaGVkIHdoZW4gYW4gbGlnaHQgYXNzZXQgaGFzIGJlZW4gY29uc3RydWN0ZWQgZnJvbSBhIHJlc291cmNlcy5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkFzc2V0RXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cImxpZ2h0Q29tcGxldGVcIiwgdHlwZT1cImF3YXkzZC5ldmVudHMuQXNzZXRFdmVudFwiKV1cblxuXG4vKipcbiAqIERpc3BhdGNoZWQgd2hlbiBhbiBsaWdodCBwaWNrZXIgYXNzZXQgaGFzIGJlZW4gY29uc3RydWN0ZWQgZnJvbSBhIHJlc291cmNlcy5cbiAqXG4gKiBAZXZlbnRUeXBlIGF3YXkuZXZlbnRzLkFzc2V0RXZlbnRcbiAqL1xuLy9bRXZlbnQobmFtZT1cImxpZ2h0UGlja2VyQ29tcGxldGVcIiwgdHlwZT1cImF3YXkzZC5ldmVudHMuQXNzZXRFdmVudFwiKV1cblxuXG4vKipcbiAqIERpc3BhdGNoZWQgd2hlbiBhbiBlZmZlY3QgbWV0aG9kIGFzc2V0IGhhcyBiZWVuIGNvbnN0cnVjdGVkIGZyb20gYSByZXNvdXJjZXMuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJlZmZlY3RNZXRob2RDb21wbGV0ZVwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5Bc3NldEV2ZW50XCIpXVxuXG5cbi8qKlxuICogRGlzcGF0Y2hlZCB3aGVuIGFuIHNoYWRvdyBtYXAgbWV0aG9kIGFzc2V0IGhhcyBiZWVuIGNvbnN0cnVjdGVkIGZyb20gYSByZXNvdXJjZXMuXG4gKlxuICogQGV2ZW50VHlwZSBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbi8vW0V2ZW50KG5hbWU9XCJzaGFkb3dNYXBNZXRob2RDb21wbGV0ZVwiLCB0eXBlPVwiYXdheTNkLmV2ZW50cy5Bc3NldEV2ZW50XCIpXVxuXG4vKipcbiAqIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSByZXR1cm5lZCBhcyB0b2tlbnMgYnkgbG9hZGluZyBvcGVyYXRpb25zXG4gKiB0byBwcm92aWRlIGFuIG9iamVjdCBvbiB3aGljaCBldmVudHMgY2FuIGJlIGxpc3RlbmVkIGZvciBpbiBjYXNlcyB3aGVyZVxuICogdGhlIGFjdHVhbCBhc3NldCBsb2FkZXIgaXMgbm90IGRpcmVjdGx5IGF2YWlsYWJsZSAoZS5nLiB3aGVuIHVzaW5nIHRoZVxuICogQXNzZXRMaWJyYXJ5IHRvIHBlcmZvcm0gdGhlIGxvYWQuKVxuICpcbiAqIEJ5IGxpc3RlbmluZyBmb3IgZXZlbnRzIG9uIHRoaXMgY2xhc3MgaW5zdGVhZCBvZiBkaXJlY3RseSBvbiB0aGVcbiAqIEFzc2V0TGlicmFyeSwgb25lIGNhbiBkaXN0aW5ndWlzaCBkaWZmZXJlbnQgbG9hZHMgZnJvbSBlYWNoIG90aGVyLlxuICpcbiAqIFRoZSB0b2tlbiB3aWxsIGRpc3BhdGNoIGFsbCBldmVudHMgdGhhdCB0aGUgb3JpZ2luYWwgQXNzZXRMb2FkZXIgZGlzcGF0Y2hlcyxcbiAqIHdoaWxlIG5vdCBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIHRvIG9ic3RydWN0IHRoZSBsb2FkIGFuZCBpcyBhcyBzdWNoIGFcbiAqIHNhZmVyIHJldHVybiB2YWx1ZSBmb3IgbG9hZGVyIHdyYXBwZXJzIHRoYW4gdGhlIGxvYWRlciBpdHNlbGYuXG4gKi9cbmNsYXNzIEFzc2V0TG9hZGVyVG9rZW4gZXh0ZW5kcyBFdmVudERpc3BhdGNoZXJcbntcblx0cHVibGljIF9pTG9hZGVyOkFzc2V0TG9hZGVyO1xuXG5cdGNvbnN0cnVjdG9yKGxvYWRlcjpBc3NldExvYWRlcilcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9pTG9hZGVyID0gbG9hZGVyO1xuXHR9XG5cblx0cHVibGljIGFkZEV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uKVxuXHR7XG5cdFx0dGhpcy5faUxvYWRlci5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcblx0fVxuXG5cblx0cHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uKVxuXHR7XG5cdFx0dGhpcy5faUxvYWRlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGxpc3RlbmVyKTtcblx0fVxuXG5cdHB1YmxpYyBoYXNFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbiA9IG51bGwpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9pTG9hZGVyLmhhc0V2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xuXHR9XG5cblx0Lypcblx0IHB1YmxpYyB3aWxsVHJpZ2dlcih0eXBlOnN0cmluZyk6Ym9vbGVhblxuXHQge1xuXHQgcmV0dXJuIHRoaXMuX2lMb2FkZXIud2lsbFRyaWdnZXIodHlwZSk7XG5cdCB9XG5cdCAqL1xufVxuXG5leHBvcnQgPSBBc3NldExvYWRlclRva2VuOyJdfQ== \ No newline at end of file diff --git a/lib/core/library/AssetLoaderToken.ts b/lib/core/library/AssetLoaderToken.ts new file mode 100644 index 00000000..fb3ff676 --- /dev/null +++ b/lib/core/library/AssetLoaderToken.ts @@ -0,0 +1,237 @@ +import AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +/** + * Dispatched when any asset finishes parsing. Also see specific events for each + * individual asset type (meshes, materials et c.) + * + * @eventType away.events.AssetEvent + */ +//[Event(name="assetComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when a full resource (including dependencies) finishes loading. + * + * @eventType away.events.LoaderEvent + */ +//[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] + + +/** + * Dispatched when a single dependency (which may be the main file of a resource) + * finishes loading. + * + * @eventType away.events.LoaderEvent + */ +//[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] + + +/** + * Dispatched when an error occurs during loading. I + * + * @eventType away.events.LoaderEvent + */ +//[Event(name="loadError", type="away3d.events.LoaderEvent")] + + +/** + * Dispatched when an error occurs during parsing. + * + * @eventType away.events.ParserEvent + */ +//[Event(name="parseError", type="away3d.events.ParserEvent")] + + +/** + * Dispatched when a skybox asset has been costructed from a ressource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="skyboxComplete", type="away3d.events.AssetEvent")] + +/** + * Dispatched when a camera3d asset has been costructed from a ressource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="cameraComplete", type="away3d.events.AssetEvent")] + +/** + * Dispatched when a mesh asset has been costructed from a ressource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="meshComplete", type="away3d.events.AssetEvent")] + +/** + * Dispatched when a geometry asset has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="geometryComplete", type="away3d.events.AssetEvent")] + +/** + * Dispatched when a skeleton asset has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="skeletonComplete", type="away3d.events.AssetEvent")] + +/** + * Dispatched when a skeleton pose asset has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="skeletonPoseComplete", type="away3d.events.AssetEvent")] + +/** + * Dispatched when a container asset has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="containerComplete", type="away3d.events.AssetEvent")] + +/** + * Dispatched when a texture asset has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="textureComplete", type="away3d.events.AssetEvent")] + +/** + * Dispatched when a texture projector asset has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="textureProjectorComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when a material asset has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="materialComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when a animator asset has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="animatorComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when an animation set has been constructed from a group of animation state resources. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="animationSetComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when an animation state has been constructed from a group of animation node resources. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="animationStateComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when an animation node has been constructed from a resource. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="animationNodeComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when an animation state transition has been constructed from a group of animation node resources. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="stateTransitionComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when an light asset has been constructed from a resources. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="lightComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when an light picker asset has been constructed from a resources. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="lightPickerComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when an effect method asset has been constructed from a resources. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="effectMethodComplete", type="away3d.events.AssetEvent")] + + +/** + * Dispatched when an shadow map method asset has been constructed from a resources. + * + * @eventType away.events.AssetEvent + */ +//[Event(name="shadowMapMethodComplete", type="away3d.events.AssetEvent")] + +/** + * Instances of this class are returned as tokens by loading operations + * to provide an object on which events can be listened for in cases where + * the actual asset loader is not directly available (e.g. when using the + * AssetLibrary to perform the load.) + * + * By listening for events on this class instead of directly on the + * AssetLibrary, one can distinguish different loads from each other. + * + * The token will dispatch all events that the original AssetLoader dispatches, + * while not providing an interface to obstruct the load and is as such a + * safer return value for loader wrappers than the loader itself. + */ +class AssetLoaderToken extends EventDispatcher +{ + public _iLoader:AssetLoader; + + constructor(loader:AssetLoader) + { + super(); + + this._iLoader = loader; + } + + public addEventListener(type:string, listener:Function) + { + this._iLoader.addEventListener(type, listener); + } + + + public removeEventListener(type:string, listener:Function) + { + this._iLoader.removeEventListener(type, listener); + } + + public hasEventListener(type:string, listener:Function = null):boolean + { + return this._iLoader.hasEventListener(type, listener); + } + + /* + public willTrigger(type:string):boolean + { + return this._iLoader.willTrigger(type); + } + */ +} + +export = AssetLoaderToken; \ No newline at end of file diff --git a/lib/core/library/AssetType.js b/lib/core/library/AssetType.js new file mode 100755 index 00000000..243b9b6a --- /dev/null +++ b/lib/core/library/AssetType.js @@ -0,0 +1,33 @@ +var AssetType = (function () { + function AssetType() { + } + AssetType.ANIMATION_NODE = 'animationNode'; + AssetType.ANIMATION_SET = 'animationSet'; + AssetType.ANIMATION_STATE = 'animationState'; + AssetType.ANIMATOR = 'animator'; + AssetType.BILLBOARD = 'billboard'; + AssetType.CAMERA = 'camera'; + AssetType.CONTAINER = 'container'; + AssetType.EFFECTS_METHOD = 'effectsMethod'; + AssetType.GEOMETRY = 'geometry'; + AssetType.LINE_SEGMENT = 'lineSegment'; + AssetType.LIGHT = 'light'; + AssetType.LIGHT_PICKER = 'lightPicker'; + AssetType.MATERIAL = 'material'; + AssetType.MESH = 'mesh'; + AssetType.TRIANGLE_SUB_MESH = 'triangleSubMesh'; + AssetType.LINE_SUB_MESH = 'lineSubMesh'; + AssetType.PRIMITIVE_PREFAB = 'primitivePrefab'; + AssetType.SHADOW_MAP_METHOD = 'shadowMapMethod'; + AssetType.SKELETON = 'skeleton'; + AssetType.SKELETON_POSE = 'skeletonPose'; + AssetType.SKYBOX = 'skybox'; + AssetType.STATE_TRANSITION = 'stateTransition'; + AssetType.TEXTURE = 'texture'; + AssetType.TEXTURE_PROJECTOR = 'textureProjector'; + return AssetType; +})(); + +module.exports = AssetType; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Bc3NldFR5cGUudHMiXSwibmFtZXMiOlsiQXNzZXRUeXBlIiwiQXNzZXRUeXBlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtJQUFBQTtJQTBCQUMsQ0FBQ0E7QUFBQUQsSUF4QkFBLDJCQUFzQ0EsZUFBZUE7SUFDckRBLDBCQUFxQ0EsY0FBY0E7SUFDbkRBLDRCQUF1Q0EsZ0JBQWdCQTtJQUN2REEscUJBQWdDQSxVQUFVQTtJQUMxQ0Esc0JBQWlDQSxXQUFXQTtJQUM1Q0EsbUJBQThCQSxRQUFRQTtJQUN0Q0Esc0JBQWlDQSxXQUFXQTtJQUM1Q0EsMkJBQXNDQSxlQUFlQTtJQUNyREEscUJBQWdDQSxVQUFVQTtJQUMxQ0EseUJBQW9DQSxhQUFhQTtJQUNqREEsa0JBQTZCQSxPQUFPQTtJQUNwQ0EseUJBQW9DQSxhQUFhQTtJQUNqREEscUJBQWdDQSxVQUFVQTtJQUMxQ0EsaUJBQTRCQSxNQUFNQTtJQUNsQ0EsOEJBQXlDQSxpQkFBaUJBO0lBQzFEQSwwQkFBcUNBLGFBQWFBO0lBQ2xEQSw2QkFBd0NBLGlCQUFpQkE7SUFDekRBLDhCQUF5Q0EsaUJBQWlCQTtJQUMxREEscUJBQWdDQSxVQUFVQTtJQUMxQ0EsMEJBQXFDQSxjQUFjQTtJQUNuREEsbUJBQThCQSxRQUFRQTtJQUN0Q0EsNkJBQXdDQSxpQkFBaUJBO0lBQ3pEQSxvQkFBK0JBLFNBQVNBO0lBQ3hDQSw4QkFBeUNBLGtCQUFrQkE7SUFDNURBLGlCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDBCQUFtQixDQUFBIiwiZmlsZSI6ImNvcmUvbGlicmFyeS9Bc3NldFR5cGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBBc3NldFR5cGVcbntcblx0cHVibGljIHN0YXRpYyBBTklNQVRJT05fTk9ERTpzdHJpbmcgPSAnYW5pbWF0aW9uTm9kZSc7XG5cdHB1YmxpYyBzdGF0aWMgQU5JTUFUSU9OX1NFVDpzdHJpbmcgPSAnYW5pbWF0aW9uU2V0Jztcblx0cHVibGljIHN0YXRpYyBBTklNQVRJT05fU1RBVEU6c3RyaW5nID0gJ2FuaW1hdGlvblN0YXRlJztcblx0cHVibGljIHN0YXRpYyBBTklNQVRPUjpzdHJpbmcgPSAnYW5pbWF0b3InO1xuXHRwdWJsaWMgc3RhdGljIEJJTExCT0FSRDpzdHJpbmcgPSAnYmlsbGJvYXJkJztcblx0cHVibGljIHN0YXRpYyBDQU1FUkE6c3RyaW5nID0gJ2NhbWVyYSc7XG5cdHB1YmxpYyBzdGF0aWMgQ09OVEFJTkVSOnN0cmluZyA9ICdjb250YWluZXInO1xuXHRwdWJsaWMgc3RhdGljIEVGRkVDVFNfTUVUSE9EOnN0cmluZyA9ICdlZmZlY3RzTWV0aG9kJztcblx0cHVibGljIHN0YXRpYyBHRU9NRVRSWTpzdHJpbmcgPSAnZ2VvbWV0cnknO1xuXHRwdWJsaWMgc3RhdGljIExJTkVfU0VHTUVOVDpzdHJpbmcgPSAnbGluZVNlZ21lbnQnO1xuXHRwdWJsaWMgc3RhdGljIExJR0hUOnN0cmluZyA9ICdsaWdodCc7XG5cdHB1YmxpYyBzdGF0aWMgTElHSFRfUElDS0VSOnN0cmluZyA9ICdsaWdodFBpY2tlcic7XG5cdHB1YmxpYyBzdGF0aWMgTUFURVJJQUw6c3RyaW5nID0gJ21hdGVyaWFsJztcblx0cHVibGljIHN0YXRpYyBNRVNIOnN0cmluZyA9ICdtZXNoJztcblx0cHVibGljIHN0YXRpYyBUUklBTkdMRV9TVUJfTUVTSDpzdHJpbmcgPSAndHJpYW5nbGVTdWJNZXNoJztcblx0cHVibGljIHN0YXRpYyBMSU5FX1NVQl9NRVNIOnN0cmluZyA9ICdsaW5lU3ViTWVzaCc7XG5cdHB1YmxpYyBzdGF0aWMgUFJJTUlUSVZFX1BSRUZBQjpzdHJpbmcgPSAncHJpbWl0aXZlUHJlZmFiJztcblx0cHVibGljIHN0YXRpYyBTSEFET1dfTUFQX01FVEhPRDpzdHJpbmcgPSAnc2hhZG93TWFwTWV0aG9kJztcblx0cHVibGljIHN0YXRpYyBTS0VMRVRPTjpzdHJpbmcgPSAnc2tlbGV0b24nO1xuXHRwdWJsaWMgc3RhdGljIFNLRUxFVE9OX1BPU0U6c3RyaW5nID0gJ3NrZWxldG9uUG9zZSc7XG5cdHB1YmxpYyBzdGF0aWMgU0tZQk9YOnN0cmluZyA9ICdza3lib3gnO1xuXHRwdWJsaWMgc3RhdGljIFNUQVRFX1RSQU5TSVRJT046c3RyaW5nID0gJ3N0YXRlVHJhbnNpdGlvbic7XG5cdHB1YmxpYyBzdGF0aWMgVEVYVFVSRTpzdHJpbmcgPSAndGV4dHVyZSc7XG5cdHB1YmxpYyBzdGF0aWMgVEVYVFVSRV9QUk9KRUNUT1I6c3RyaW5nID0gJ3RleHR1cmVQcm9qZWN0b3InO1xufVxuXG5leHBvcnQgPSBBc3NldFR5cGU7Il19 \ No newline at end of file diff --git a/lib/core/library/AssetType.ts b/lib/core/library/AssetType.ts new file mode 100644 index 00000000..28df3481 --- /dev/null +++ b/lib/core/library/AssetType.ts @@ -0,0 +1,29 @@ +class AssetType +{ + public static ANIMATION_NODE:string = 'animationNode'; + public static ANIMATION_SET:string = 'animationSet'; + public static ANIMATION_STATE:string = 'animationState'; + public static ANIMATOR:string = 'animator'; + public static BILLBOARD:string = 'billboard'; + public static CAMERA:string = 'camera'; + public static CONTAINER:string = 'container'; + public static EFFECTS_METHOD:string = 'effectsMethod'; + public static GEOMETRY:string = 'geometry'; + public static LINE_SEGMENT:string = 'lineSegment'; + public static LIGHT:string = 'light'; + public static LIGHT_PICKER:string = 'lightPicker'; + public static MATERIAL:string = 'material'; + public static MESH:string = 'mesh'; + public static TRIANGLE_SUB_MESH:string = 'triangleSubMesh'; + public static LINE_SUB_MESH:string = 'lineSubMesh'; + public static PRIMITIVE_PREFAB:string = 'primitivePrefab'; + public static SHADOW_MAP_METHOD:string = 'shadowMapMethod'; + public static SKELETON:string = 'skeleton'; + public static SKELETON_POSE:string = 'skeletonPose'; + public static SKYBOX:string = 'skybox'; + public static STATE_TRANSITION:string = 'stateTransition'; + public static TEXTURE:string = 'texture'; + public static TEXTURE_PROJECTOR:string = 'textureProjector'; +} + +export = AssetType; \ No newline at end of file diff --git a/lib/core/library/ConflictPrecedence.js b/lib/core/library/ConflictPrecedence.js new file mode 100755 index 00000000..6f92fd4f --- /dev/null +++ b/lib/core/library/ConflictPrecedence.js @@ -0,0 +1,19 @@ +/** +* Enumaration class for precedence when resolving naming conflicts in the library. +* +* @see away.library.AssetLibrary.conflictPrecedence +* @see away.library.AssetLibrary.conflictStrategy +* @see away.library.naming.ConflictStrategy +*/ +var ConflictPrecedence = (function () { + function ConflictPrecedence() { + } + ConflictPrecedence.FAVOR_OLD = 'favorOld'; + + ConflictPrecedence.FAVOR_NEW = 'favorNew'; + return ConflictPrecedence; +})(); + +module.exports = ConflictPrecedence; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Db25mbGljdFByZWNlZGVuY2UudHMiXSwibmFtZXMiOlsiQ29uZmxpY3RQcmVjZWRlbmNlIiwiQ29uZmxpY3RQcmVjZWRlbmNlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0VBTUc7QUFDSDtJQUFBQTtJQWVBQyxDQUFDQTtBQUFBRCxJQVJBQSwrQkFBaUNBLFVBQVVBOztJQU8zQ0EsK0JBQWlDQSxVQUFVQTtJQUM1Q0EsMEJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsbUNBQTRCLENBQUEiLCJmaWxlIjoiY29yZS9saWJyYXJ5L0NvbmZsaWN0UHJlY2VkZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW51bWFyYXRpb24gY2xhc3MgZm9yIHByZWNlZGVuY2Ugd2hlbiByZXNvbHZpbmcgbmFtaW5nIGNvbmZsaWN0cyBpbiB0aGUgbGlicmFyeS5cbiAqXG4gKiBAc2VlIGF3YXkubGlicmFyeS5Bc3NldExpYnJhcnkuY29uZmxpY3RQcmVjZWRlbmNlXG4gKiBAc2VlIGF3YXkubGlicmFyeS5Bc3NldExpYnJhcnkuY29uZmxpY3RTdHJhdGVneVxuICogQHNlZSBhd2F5LmxpYnJhcnkubmFtaW5nLkNvbmZsaWN0U3RyYXRlZ3lcbiAqL1xuY2xhc3MgQ29uZmxpY3RQcmVjZWRlbmNlXG57XG5cdC8qKlxuXHQgKiBTaWduYWxzIHRoYXQgaW4gYSBjb25mbGljdCwgdGhlIHByZXZpb3VzIG93bmVyIG9mIHRoZSBjb25mbGljdGluZyBuYW1lXG5cdCAqIHNob3VsZCBiZSBmYXZvcmVkIChhbmQga2VlcCBpdCdzIG5hbWUpIGFuZCB0aGF0IHRoZSBuZXdseSByZW5hbWVkIGFzc2V0XG5cdCAqIGlzIHJldmVydGVkIHRvIGEgbm9uLWNvbmZsaWN0aW5nIG5hbWUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEZBVk9SX09MRDpzdHJpbmcgPSAnZmF2b3JPbGQnO1xuXG5cdC8qKlxuXHQgKiBTaWduYWxlcyB0aGF0IGluIGEgY29uZmxpY3QsIHRoZSBuZXdseSByZW5hbWVkIGFzc2V0IGlzIGZhdm9yZWQgKGFuZCBrZWVwc1xuXHQgKiBpdCdzIG5ld2x5IGRlZmluZWQgbmFtZSkgYW5kIHRoYXQgdGhlIHByZXZpb3VzIG93bmVyIG9mIHRoYXQgbmFtZSBnZXRzXG5cdCAqIHJlbmFtZWQgdG8gYSBub24tY29uZmxpY3RpbmcgbmFtZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRkFWT1JfTkVXOnN0cmluZyA9ICdmYXZvck5ldyc7XG59XG5cbmV4cG9ydCA9IENvbmZsaWN0UHJlY2VkZW5jZTsiXX0= \ No newline at end of file diff --git a/lib/core/library/ConflictPrecedence.ts b/lib/core/library/ConflictPrecedence.ts new file mode 100644 index 00000000..80f88b4f --- /dev/null +++ b/lib/core/library/ConflictPrecedence.ts @@ -0,0 +1,25 @@ +/** + * Enumaration class for precedence when resolving naming conflicts in the library. + * + * @see away.library.AssetLibrary.conflictPrecedence + * @see away.library.AssetLibrary.conflictStrategy + * @see away.library.naming.ConflictStrategy + */ +class ConflictPrecedence +{ + /** + * Signals that in a conflict, the previous owner of the conflicting name + * should be favored (and keep it's name) and that the newly renamed asset + * is reverted to a non-conflicting name. + */ + public static FAVOR_OLD:string = 'favorOld'; + + /** + * Signales that in a conflict, the newly renamed asset is favored (and keeps + * it's newly defined name) and that the previous owner of that name gets + * renamed to a non-conflicting name. + */ + public static FAVOR_NEW:string = 'favorNew'; +} + +export = ConflictPrecedence; \ No newline at end of file diff --git a/lib/core/library/ConflictStrategy.js b/lib/core/library/ConflictStrategy.js new file mode 100755 index 00000000..c3399798 --- /dev/null +++ b/lib/core/library/ConflictStrategy.js @@ -0,0 +1,30 @@ +var ErrorConflictStrategy = require("awayjs-core/lib/core/library/ErrorConflictStrategy"); +var IgnoreConflictStrategy = require("awayjs-core/lib/core/library/IgnoreConflictStrategy"); +var NumSuffixConflictStrategy = require("awayjs-core/lib/core/library/NumSuffixConflictStrategy"); + +/** +* Enumeration class for bundled conflict strategies. Set one of these values (or an +* instance of a self-defined sub-class of ConflictStrategyBase) to the conflictStrategy +* property on an AssetLibrary to define how that library resolves naming conflicts. +* +* The value of the AssetLibrary.conflictPrecedence property defines which +* of the conflicting assets will get to keep it's name, and which is renamed (if any.) +* +* @see away.library.AssetLibrary.conflictStrategy +* @see away.library.naming.ConflictStrategyBase +*/ +var ConflictStrategy = (function () { + function ConflictStrategy(include) { + //TODO: find out why typescript d.ts files do not include this class + } + ConflictStrategy.APPEND_NUM_SUFFIX = new NumSuffixConflictStrategy(); + + ConflictStrategy.IGNORE = new IgnoreConflictStrategy(); + + ConflictStrategy.THROW_ERROR = new ErrorConflictStrategy(); + return ConflictStrategy; +})(); + +module.exports = ConflictStrategy; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Db25mbGljdFN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbIkNvbmZsaWN0U3RyYXRlZ3kiLCJDb25mbGljdFN0cmF0ZWd5LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQSx5RkFDOEY7QUFDOUYsMkZBQWdHO0FBQ2hHLGlHQUFxRzs7QUFFckc7Ozs7Ozs7Ozs7RUFVRztBQUNIO0lBc0JDQSwwQkFBWUEsT0FBNkJBO1FBRXhDQyxvRUFBb0VBO0lBQ3JFQSxDQUFDQTtJQW5CREQscUNBQXVEQSxJQUFJQSx5QkFBeUJBLENBQUNBLENBQUNBOztJQU90RkEsMEJBQTRDQSxJQUFJQSxzQkFBc0JBLENBQUNBLENBQUNBOztJQU94RUEsK0JBQWlEQSxJQUFJQSxxQkFBcUJBLENBQUNBLENBQUNBO0lBTTdFQSx3QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxpQ0FBMEIsQ0FBQSIsImZpbGUiOiJjb3JlL2xpYnJhcnkvQ29uZmxpY3RTdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb25mbGljdFN0cmF0ZWd5QmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQ29uZmxpY3RTdHJhdGVneUJhc2VcIik7XG5pbXBvcnQgRXJyb3JDb25mbGljdFN0cmF0ZWd5XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvRXJyb3JDb25mbGljdFN0cmF0ZWd5XCIpO1xuaW1wb3J0IElnbm9yZUNvbmZsaWN0U3RyYXRlZ3lcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JZ25vcmVDb25mbGljdFN0cmF0ZWd5XCIpO1xuaW1wb3J0IE51bVN1ZmZpeENvbmZsaWN0U3RyYXRlZ3lcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvTnVtU3VmZml4Q29uZmxpY3RTdHJhdGVneVwiKTtcblxuLyoqXG4gKiBFbnVtZXJhdGlvbiBjbGFzcyBmb3IgYnVuZGxlZCBjb25mbGljdCBzdHJhdGVnaWVzLiBTZXQgb25lIG9mIHRoZXNlIHZhbHVlcyAob3IgYW5cbiAqIGluc3RhbmNlIG9mIGEgc2VsZi1kZWZpbmVkIHN1Yi1jbGFzcyBvZiBDb25mbGljdFN0cmF0ZWd5QmFzZSkgdG8gdGhlIGNvbmZsaWN0U3RyYXRlZ3lcbiAqIHByb3BlcnR5IG9uIGFuIEFzc2V0TGlicmFyeSB0byBkZWZpbmUgaG93IHRoYXQgbGlicmFyeSByZXNvbHZlcyBuYW1pbmcgY29uZmxpY3RzLlxuICpcbiAqIFRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+QXNzZXRMaWJyYXJ5LmNvbmZsaWN0UHJlY2VkZW5jZTwvY29kZT4gcHJvcGVydHkgZGVmaW5lcyB3aGljaFxuICogb2YgdGhlIGNvbmZsaWN0aW5nIGFzc2V0cyB3aWxsIGdldCB0byBrZWVwIGl0J3MgbmFtZSwgYW5kIHdoaWNoIGlzIHJlbmFtZWQgKGlmIGFueS4pXG4gKlxuICogQHNlZSBhd2F5LmxpYnJhcnkuQXNzZXRMaWJyYXJ5LmNvbmZsaWN0U3RyYXRlZ3lcbiAqIEBzZWUgYXdheS5saWJyYXJ5Lm5hbWluZy5Db25mbGljdFN0cmF0ZWd5QmFzZVxuICovXG5jbGFzcyBDb25mbGljdFN0cmF0ZWd5XG57XG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgdGhhdCBpbiBjYXNlIG9mIGEgbmFtaW5nIGNvbmZsaWN0LCBvbmUgb2YgdGhlIGFzc2V0cyB3aWxsIGJlIHJlbmFtZWQgYW5kXG5cdCAqIGEgbnVtZXJpYyBzdWZmaXggYXBwZW5kZWQgdG8gdGhlIGJhc2UgbmFtZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQVBQRU5EX05VTV9TVUZGSVg6Q29uZmxpY3RTdHJhdGVneUJhc2UgPSBuZXcgTnVtU3VmZml4Q29uZmxpY3RTdHJhdGVneSgpO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgdGhhdCBuYW1pbmcgY29uZmxpY3RzIHNob3VsZCBiZSBpZ25vcmVkLiBUaGlzIGlzIG5vdCByZWNvbW1lbmRlZCBpbiBtb3N0XG5cdCAqIGNhc2VzLCB1bmxlc3MgaXQgY2FuIGJlIDEwMCUgZ3VhcmFudGVlZCB0aGF0IHRoZSBhcHBsaWNhdGlvbiBkb2VzIG5vdCBjYXVzZSBuYW1pbmdcblx0ICogY29uZmxpY3RzIGluIHRoZSBsaWJyYXJ5IChpLmUuIHdoZW4gYW4gYXBwLWxldmVsIHN5c3RlbSBpcyBpbiBwbGFjZSB0byBwcmV2ZW50IHRoaXMuKVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBJR05PUkU6Q29uZmxpY3RTdHJhdGVneUJhc2UgPSBuZXcgSWdub3JlQ29uZmxpY3RTdHJhdGVneSgpO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgdGhhdCBhbiBlcnJvciBzaG91bGQgYmUgdGhyb3duIGlmIGEgbmFtaW5nIGNvbmZsaWN0IGlzIGRpc2NvdmVyZWQuIFVzZSB0aGlzXG5cdCAqIHRvIGJlIDEwMCUgc3VyZSB0aGF0IG5hbWluZyBjb25mbGljdHMgbmV2ZXIgb2NjdXIgdW5ub3RpY2VkLCBhbmQgd2hlbiBpdCdzIHVuZGVzaXJhYmxlXG5cdCAqIHRvIGhhdmUgdGhlIGxpYnJhcnkgYXV0b21hdGljYWxseSByZW5hbWUgYXNzZXRzIHRvIGF2b2lkIHN1Y2ggY29uZmxpY3RzLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBUSFJPV19FUlJPUjpDb25mbGljdFN0cmF0ZWd5QmFzZSA9IG5ldyBFcnJvckNvbmZsaWN0U3RyYXRlZ3koKTtcblxuXHRjb25zdHJ1Y3RvcihpbmNsdWRlPzpDb25mbGljdFN0cmF0ZWd5QmFzZSlcblx0e1xuXHRcdC8vVE9ETzogZmluZCBvdXQgd2h5IHR5cGVzY3JpcHQgZC50cyBmaWxlcyBkbyBub3QgaW5jbHVkZSB0aGlzIGNsYXNzXG5cdH1cbn1cblxuZXhwb3J0ID0gQ29uZmxpY3RTdHJhdGVneTsiXX0= \ No newline at end of file diff --git a/lib/core/library/ConflictStrategy.ts b/lib/core/library/ConflictStrategy.ts new file mode 100644 index 00000000..09359aad --- /dev/null +++ b/lib/core/library/ConflictStrategy.ts @@ -0,0 +1,45 @@ +import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); +import ErrorConflictStrategy = require("awayjs-core/lib/core/library/ErrorConflictStrategy"); +import IgnoreConflictStrategy = require("awayjs-core/lib/core/library/IgnoreConflictStrategy"); +import NumSuffixConflictStrategy = require("awayjs-core/lib/core/library/NumSuffixConflictStrategy"); + +/** + * Enumeration class for bundled conflict strategies. Set one of these values (or an + * instance of a self-defined sub-class of ConflictStrategyBase) to the conflictStrategy + * property on an AssetLibrary to define how that library resolves naming conflicts. + * + * The value of the AssetLibrary.conflictPrecedence property defines which + * of the conflicting assets will get to keep it's name, and which is renamed (if any.) + * + * @see away.library.AssetLibrary.conflictStrategy + * @see away.library.naming.ConflictStrategyBase + */ +class ConflictStrategy +{ + /** + * Specifies that in case of a naming conflict, one of the assets will be renamed and + * a numeric suffix appended to the base name. + */ + public static APPEND_NUM_SUFFIX:ConflictStrategyBase = new NumSuffixConflictStrategy(); + + /** + * Specifies that naming conflicts should be ignored. This is not recommended in most + * cases, unless it can be 100% guaranteed that the application does not cause naming + * conflicts in the library (i.e. when an app-level system is in place to prevent this.) + */ + public static IGNORE:ConflictStrategyBase = new IgnoreConflictStrategy(); + + /** + * Specifies that an error should be thrown if a naming conflict is discovered. Use this + * to be 100% sure that naming conflicts never occur unnoticed, and when it's undesirable + * to have the library automatically rename assets to avoid such conflicts. + */ + public static THROW_ERROR:ConflictStrategyBase = new ErrorConflictStrategy(); + + constructor(include?:ConflictStrategyBase) + { + //TODO: find out why typescript d.ts files do not include this class + } +} + +export = ConflictStrategy; \ No newline at end of file diff --git a/lib/core/library/ConflictStrategyBase.js b/lib/core/library/ConflictStrategyBase.js new file mode 100755 index 00000000..ce333cdc --- /dev/null +++ b/lib/core/library/ConflictStrategyBase.js @@ -0,0 +1,68 @@ +var ConflictPrecedence = require("awayjs-core/lib/core/library/ConflictPrecedence"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); + +/** +* Abstract base class for naming conflict resolution classes. Extend this to create a +* strategy class which the asset library can use to resolve asset naming conflicts, or +* use one of the bundled concrete strategy classes: +* +*
    +*
  • IgnoreConflictStrategy (ConflictStrategy.IGNORE)
  • +*
  • ErrorConflictStrategy (ConflictStrategy.THROW_ERROR)
  • +*
  • NumSuffixConflictStrategy (ConflictStrategy.APPEND_NUM_SUFFIX)
  • +*
+* +* @see away.library.AssetLibrary.conflictStrategy +* @see away.library.ConflictStrategy +* @see away.library.IgnoreConflictStrategy +* @see away.library.ErrorConflictStrategy +* @see away.library.NumSuffixConflictStrategy +*/ +var ConflictStrategyBase = (function () { + function ConflictStrategyBase() { + } + /** + * Resolve a naming conflict between two assets. Must be implemented by concrete strategy + * classes. + */ + ConflictStrategyBase.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { + throw new AbstractMethodError(); + }; + + /** + * Create instance of this conflict strategy. Used internally by the AssetLibrary to + * make sure the same strategy instance is not used in all AssetLibrary instances, which + * would break any state caching that happens inside the strategy class. + */ + ConflictStrategyBase.prototype.create = function () { + throw new AbstractMethodError(); + }; + + /** + * Provided as a convenience method for all conflict strategy classes, as a way to finalize + * the conflict resolution by applying the new names and dispatching the correct events. + */ + ConflictStrategyBase.prototype._pUpdateNames = function (ns, nonConflictingName, oldAsset, newAsset, assetsDictionary, precedence) { + var loser_prev_name; + var winner; + var loser; + + winner = (precedence === ConflictPrecedence.FAVOR_NEW) ? newAsset : oldAsset; + loser = (precedence === ConflictPrecedence.FAVOR_NEW) ? oldAsset : newAsset; + + loser_prev_name = loser.name; + + assetsDictionary[winner.name] = winner; + assetsDictionary[nonConflictingName] = loser; + loser.resetAssetPath(nonConflictingName, ns, false); + + loser.dispatchEvent(new AssetEvent(AssetEvent.ASSET_CONFLICT_RESOLVED, loser, loser_prev_name)); + }; + return ConflictStrategyBase; +})(); + +module.exports = ConflictStrategyBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9Db25mbGljdFN0cmF0ZWd5QmFzZS50cyJdLCJuYW1lcyI6WyJDb25mbGljdFN0cmF0ZWd5QmFzZSIsIkNvbmZsaWN0U3RyYXRlZ3lCYXNlLmNvbnN0cnVjdG9yIiwiQ29uZmxpY3RTdHJhdGVneUJhc2UucmVzb2x2ZUNvbmZsaWN0IiwiQ29uZmxpY3RTdHJhdGVneUJhc2UuY3JlYXRlIiwiQ29uZmxpY3RTdHJhdGVneUJhc2UuX3BVcGRhdGVOYW1lcyJdLCJtYXBwaW5ncyI6IkFBQUEsbUZBQXdGOztBQUV4RiwrRUFBb0Y7QUFDcEYsNkRBQW9FOztBQUVwRTs7Ozs7Ozs7Ozs7Ozs7OztFQWdCRztBQUNIO0lBR0NBO0lBRUFDLENBQUNBO0lBTUREOzs7TUFER0E7cURBQ0hBLFVBQXVCQSxZQUFtQkEsRUFBRUEsUUFBZUEsRUFBRUEsZ0JBQXVCQSxFQUFFQSxVQUFpQkE7UUFFdEdFLE1BQU1BLElBQUlBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7SUFDaENBLENBQUNBOztJQU9ERjs7OztNQURHQTs0Q0FDSEE7UUFFQ0csTUFBTUEsSUFBSUEsbUJBQW1CQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7O0lBTURIOzs7TUFER0E7bURBQ0hBLFVBQXFCQSxFQUFTQSxFQUFFQSxrQkFBeUJBLEVBQUVBLFFBQWVBLEVBQUVBLFFBQWVBLEVBQUVBLGdCQUF1QkEsRUFBRUEsVUFBaUJBO1FBRXRJSSxJQUFJQSxlQUFlQTtRQUNuQkEsSUFBSUEsTUFBTUE7UUFDVkEsSUFBSUEsS0FBS0E7O1FBRVRBLE1BQU1BLEdBQUdBLENBQUNBLFVBQVVBLEtBQUtBLGtCQUFrQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBRUEsUUFBUUEsR0FBR0EsUUFBUUE7UUFDM0VBLEtBQUtBLEdBQUdBLENBQUNBLFVBQVVBLEtBQUtBLGtCQUFrQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBRUEsUUFBUUEsR0FBR0EsUUFBUUE7O1FBRTFFQSxlQUFlQSxHQUFHQSxLQUFLQSxDQUFDQSxJQUFJQTs7UUFFNUJBLGdCQUFnQkEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsTUFBTUE7UUFDdENBLGdCQUFnQkEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxHQUFHQSxLQUFLQTtRQUM1Q0EsS0FBS0EsQ0FBQ0EsY0FBY0EsQ0FBQ0Esa0JBQWtCQSxFQUFFQSxFQUFFQSxFQUFFQSxLQUFLQSxDQUFDQTs7UUFFbkRBLEtBQUtBLENBQUNBLGFBQWFBLENBQUNBLElBQUlBLFVBQVVBLENBQUNBLFVBQVVBLENBQUNBLHVCQUF1QkEsRUFBRUEsS0FBS0EsRUFBRUEsZUFBZUEsQ0FBQ0EsQ0FBQ0E7SUFDaEdBLENBQUNBO0lBQ0ZKLDRCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELHFDQUE4QixDQUFBIiwiZmlsZSI6ImNvcmUvbGlicmFyeS9Db25mbGljdFN0cmF0ZWd5QmFzZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb25mbGljdFByZWNlZGVuY2VcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Db25mbGljdFByZWNlZGVuY2VcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IEFic3RyYWN0TWV0aG9kRXJyb3JcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9BYnN0cmFjdE1ldGhvZEVycm9yXCIpO1xuaW1wb3J0IEFzc2V0RXZlbnRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvQXNzZXRFdmVudFwiKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBuYW1pbmcgY29uZmxpY3QgcmVzb2x1dGlvbiBjbGFzc2VzLiBFeHRlbmQgdGhpcyB0byBjcmVhdGUgYVxuICogc3RyYXRlZ3kgY2xhc3Mgd2hpY2ggdGhlIGFzc2V0IGxpYnJhcnkgY2FuIHVzZSB0byByZXNvbHZlIGFzc2V0IG5hbWluZyBjb25mbGljdHMsIG9yXG4gKiB1c2Ugb25lIG9mIHRoZSBidW5kbGVkIGNvbmNyZXRlIHN0cmF0ZWd5IGNsYXNzZXM6XG4gKlxuICogPHVsPlxuICogICA8bGk+SWdub3JlQ29uZmxpY3RTdHJhdGVneSAoQ29uZmxpY3RTdHJhdGVneS5JR05PUkUpPC9saT5cbiAqICAgPGxpPkVycm9yQ29uZmxpY3RTdHJhdGVneSAoQ29uZmxpY3RTdHJhdGVneS5USFJPV19FUlJPUik8L2xpPlxuICogICA8bGk+TnVtU3VmZml4Q29uZmxpY3RTdHJhdGVneSAoQ29uZmxpY3RTdHJhdGVneS5BUFBFTkRfTlVNX1NVRkZJWCk8L2xpPlxuICogPC91bD5cbiAqXG4gKiBAc2VlIGF3YXkubGlicmFyeS5Bc3NldExpYnJhcnkuY29uZmxpY3RTdHJhdGVneVxuICogQHNlZSBhd2F5LmxpYnJhcnkuQ29uZmxpY3RTdHJhdGVneVxuICogQHNlZSBhd2F5LmxpYnJhcnkuSWdub3JlQ29uZmxpY3RTdHJhdGVneVxuICogQHNlZSBhd2F5LmxpYnJhcnkuRXJyb3JDb25mbGljdFN0cmF0ZWd5XG4gKiBAc2VlIGF3YXkubGlicmFyeS5OdW1TdWZmaXhDb25mbGljdFN0cmF0ZWd5XG4gKi9cbmNsYXNzIENvbmZsaWN0U3RyYXRlZ3lCYXNlXG57XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSBhIG5hbWluZyBjb25mbGljdCBiZXR3ZWVuIHR3byBhc3NldHMuIE11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY29uY3JldGUgc3RyYXRlZ3lcblx0ICogY2xhc3Nlcy5cblx0ICovXG5cdHB1YmxpYyByZXNvbHZlQ29uZmxpY3QoY2hhbmdlZEFzc2V0OklBc3NldCwgb2xkQXNzZXQ6SUFzc2V0LCBhc3NldHNEaWN0aW9uYXJ5Ok9iamVjdCwgcHJlY2VkZW5jZTpzdHJpbmcpXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBpbnN0YW5jZSBvZiB0aGlzIGNvbmZsaWN0IHN0cmF0ZWd5LiBVc2VkIGludGVybmFsbHkgYnkgdGhlIEFzc2V0TGlicmFyeSB0b1xuXHQgKiBtYWtlIHN1cmUgdGhlIHNhbWUgc3RyYXRlZ3kgaW5zdGFuY2UgaXMgbm90IHVzZWQgaW4gYWxsIEFzc2V0TGlicmFyeSBpbnN0YW5jZXMsIHdoaWNoXG5cdCAqIHdvdWxkIGJyZWFrIGFueSBzdGF0ZSBjYWNoaW5nIHRoYXQgaGFwcGVucyBpbnNpZGUgdGhlIHN0cmF0ZWd5IGNsYXNzLlxuXHQgKi9cblx0cHVibGljIGNyZWF0ZSgpOkNvbmZsaWN0U3RyYXRlZ3lCYXNlXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBhbGwgY29uZmxpY3Qgc3RyYXRlZ3kgY2xhc3NlcywgYXMgYSB3YXkgdG8gZmluYWxpemVcblx0ICogdGhlIGNvbmZsaWN0IHJlc29sdXRpb24gYnkgYXBwbHlpbmcgdGhlIG5ldyBuYW1lcyBhbmQgZGlzcGF0Y2hpbmcgdGhlIGNvcnJlY3QgZXZlbnRzLlxuXHQgKi9cblx0cHVibGljIF9wVXBkYXRlTmFtZXMobnM6c3RyaW5nLCBub25Db25mbGljdGluZ05hbWU6c3RyaW5nLCBvbGRBc3NldDpJQXNzZXQsIG5ld0Fzc2V0OklBc3NldCwgYXNzZXRzRGljdGlvbmFyeTpPYmplY3QsIHByZWNlZGVuY2U6c3RyaW5nKVxuXHR7XG5cdFx0dmFyIGxvc2VyX3ByZXZfbmFtZTpzdHJpbmc7XG5cdFx0dmFyIHdpbm5lcjpJQXNzZXQ7XG5cdFx0dmFyIGxvc2VyOklBc3NldDtcblxuXHRcdHdpbm5lciA9IChwcmVjZWRlbmNlID09PSBDb25mbGljdFByZWNlZGVuY2UuRkFWT1JfTkVXKT8gbmV3QXNzZXQgOiBvbGRBc3NldDtcblx0XHRsb3NlciA9IChwcmVjZWRlbmNlID09PSBDb25mbGljdFByZWNlZGVuY2UuRkFWT1JfTkVXKT8gb2xkQXNzZXQgOiBuZXdBc3NldDtcblxuXHRcdGxvc2VyX3ByZXZfbmFtZSA9IGxvc2VyLm5hbWU7XG5cblx0XHRhc3NldHNEaWN0aW9uYXJ5W3dpbm5lci5uYW1lXSA9IHdpbm5lcjtcblx0XHRhc3NldHNEaWN0aW9uYXJ5W25vbkNvbmZsaWN0aW5nTmFtZV0gPSBsb3Nlcjtcblx0XHRsb3Nlci5yZXNldEFzc2V0UGF0aChub25Db25mbGljdGluZ05hbWUsIG5zLCBmYWxzZSk7XG5cblx0XHRsb3Nlci5kaXNwYXRjaEV2ZW50KG5ldyBBc3NldEV2ZW50KEFzc2V0RXZlbnQuQVNTRVRfQ09ORkxJQ1RfUkVTT0xWRUQsIGxvc2VyLCBsb3Nlcl9wcmV2X25hbWUpKTtcblx0fVxufVxuXG5leHBvcnQgPSBDb25mbGljdFN0cmF0ZWd5QmFzZTsiXX0= \ No newline at end of file diff --git a/lib/core/library/ConflictStrategyBase.ts b/lib/core/library/ConflictStrategyBase.ts new file mode 100644 index 00000000..4607c36d --- /dev/null +++ b/lib/core/library/ConflictStrategyBase.ts @@ -0,0 +1,72 @@ +import ConflictPrecedence = require("awayjs-core/lib/core/library/ConflictPrecedence"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import AssetEvent = require("awayjs-core/lib/events/AssetEvent"); + +/** + * Abstract base class for naming conflict resolution classes. Extend this to create a + * strategy class which the asset library can use to resolve asset naming conflicts, or + * use one of the bundled concrete strategy classes: + * + *
    + *
  • IgnoreConflictStrategy (ConflictStrategy.IGNORE)
  • + *
  • ErrorConflictStrategy (ConflictStrategy.THROW_ERROR)
  • + *
  • NumSuffixConflictStrategy (ConflictStrategy.APPEND_NUM_SUFFIX)
  • + *
+ * + * @see away.library.AssetLibrary.conflictStrategy + * @see away.library.ConflictStrategy + * @see away.library.IgnoreConflictStrategy + * @see away.library.ErrorConflictStrategy + * @see away.library.NumSuffixConflictStrategy + */ +class ConflictStrategyBase +{ + + constructor() + { + } + + /** + * Resolve a naming conflict between two assets. Must be implemented by concrete strategy + * classes. + */ + public resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string) + { + throw new AbstractMethodError(); + } + + /** + * Create instance of this conflict strategy. Used internally by the AssetLibrary to + * make sure the same strategy instance is not used in all AssetLibrary instances, which + * would break any state caching that happens inside the strategy class. + */ + public create():ConflictStrategyBase + { + throw new AbstractMethodError(); + } + + /** + * Provided as a convenience method for all conflict strategy classes, as a way to finalize + * the conflict resolution by applying the new names and dispatching the correct events. + */ + public _pUpdateNames(ns:string, nonConflictingName:string, oldAsset:IAsset, newAsset:IAsset, assetsDictionary:Object, precedence:string) + { + var loser_prev_name:string; + var winner:IAsset; + var loser:IAsset; + + winner = (precedence === ConflictPrecedence.FAVOR_NEW)? newAsset : oldAsset; + loser = (precedence === ConflictPrecedence.FAVOR_NEW)? oldAsset : newAsset; + + loser_prev_name = loser.name; + + assetsDictionary[winner.name] = winner; + assetsDictionary[nonConflictingName] = loser; + loser.resetAssetPath(nonConflictingName, ns, false); + + loser.dispatchEvent(new AssetEvent(AssetEvent.ASSET_CONFLICT_RESOLVED, loser, loser_prev_name)); + } +} + +export = ConflictStrategyBase; \ No newline at end of file diff --git a/lib/core/library/ErrorConflictStrategy.js b/lib/core/library/ErrorConflictStrategy.js new file mode 100755 index 00000000..5a3c4a4b --- /dev/null +++ b/lib/core/library/ErrorConflictStrategy.js @@ -0,0 +1,28 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + +var Error = require("awayjs-core/lib/errors/Error"); + +var ErrorConflictStrategy = (function (_super) { + __extends(ErrorConflictStrategy, _super); + function ErrorConflictStrategy() { + _super.call(this); + } + ErrorConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { + throw new Error('Asset name collision while AssetLibrary.namingStrategy set to AssetLibrary.THROW_ERROR. Asset path: ' + changedAsset.assetFullPath); + }; + + ErrorConflictStrategy.prototype.create = function () { + return new ErrorConflictStrategy(); + }; + return ErrorConflictStrategy; +})(ConflictStrategyBase); + +module.exports = ErrorConflictStrategy; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9FcnJvckNvbmZsaWN0U3RyYXRlZ3kudHMiXSwibmFtZXMiOlsiRXJyb3JDb25mbGljdFN0cmF0ZWd5IiwiRXJyb3JDb25mbGljdFN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRXJyb3JDb25mbGljdFN0cmF0ZWd5LnJlc29sdmVDb25mbGljdCIsIkVycm9yQ29uZmxpY3RTdHJhdGVneS5jcmVhdGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVGQUE0Rjs7QUFFNUYsbURBQTJEOztBQUUzRDtJQUFvQ0Esd0NBQW9CQTtJQUV2REE7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7SUFDUkEsQ0FBQ0E7SUFFREQsa0RBQUFBLFVBQXVCQSxZQUFtQkEsRUFBRUEsUUFBZUEsRUFBRUEsZ0JBQXVCQSxFQUFFQSxVQUFpQkE7UUFFdEdFLE1BQU1BLElBQUlBLEtBQUtBLENBQUNBLHNHQUFzR0EsR0FBR0EsWUFBWUEsQ0FBQ0EsYUFBYUEsQ0FBQ0E7SUFDckpBLENBQUNBOztJQUVERix5Q0FBQUE7UUFFQ0csT0FBT0EsSUFBSUEscUJBQXFCQSxDQUFDQSxDQUFDQTtJQUNuQ0EsQ0FBQ0E7SUFDRkgsNkJBQUNBO0FBQURBLENBQUNBLEVBaEJtQyxvQkFBb0IsRUFnQnZEOztBQUVELHNDQUErQixDQUFBIiwiZmlsZSI6ImNvcmUvbGlicmFyeS9FcnJvckNvbmZsaWN0U3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29uZmxpY3RTdHJhdGVneUJhc2VcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Db25mbGljdFN0cmF0ZWd5QmFzZVwiKTtcbmltcG9ydCBJQXNzZXRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5pbXBvcnQgRXJyb3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9FcnJvclwiKTtcblxuY2xhc3MgRXJyb3JDb25mbGljdFN0cmF0ZWd5IGV4dGVuZHMgQ29uZmxpY3RTdHJhdGVneUJhc2Vcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlQ29uZmxpY3QoY2hhbmdlZEFzc2V0OklBc3NldCwgb2xkQXNzZXQ6SUFzc2V0LCBhc3NldHNEaWN0aW9uYXJ5Ok9iamVjdCwgcHJlY2VkZW5jZTpzdHJpbmcpXG5cdHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoJ0Fzc2V0IG5hbWUgY29sbGlzaW9uIHdoaWxlIEFzc2V0TGlicmFyeS5uYW1pbmdTdHJhdGVneSBzZXQgdG8gQXNzZXRMaWJyYXJ5LlRIUk9XX0VSUk9SLiBBc3NldCBwYXRoOiAnICsgY2hhbmdlZEFzc2V0LmFzc2V0RnVsbFBhdGgpO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZSgpOkNvbmZsaWN0U3RyYXRlZ3lCYXNlXG5cdHtcblx0XHRyZXR1cm4gbmV3IEVycm9yQ29uZmxpY3RTdHJhdGVneSgpO1xuXHR9XG59XG5cbmV4cG9ydCA9IEVycm9yQ29uZmxpY3RTdHJhdGVneTsiXX0= \ No newline at end of file diff --git a/lib/core/library/ErrorConflictStrategy.ts b/lib/core/library/ErrorConflictStrategy.ts new file mode 100644 index 00000000..17e6c489 --- /dev/null +++ b/lib/core/library/ErrorConflictStrategy.ts @@ -0,0 +1,23 @@ +import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import Error = require("awayjs-core/lib/errors/Error"); + +class ErrorConflictStrategy extends ConflictStrategyBase +{ + constructor() + { + super(); + } + + public resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string) + { + throw new Error('Asset name collision while AssetLibrary.namingStrategy set to AssetLibrary.THROW_ERROR. Asset path: ' + changedAsset.assetFullPath); + } + + public create():ConflictStrategyBase + { + return new ErrorConflictStrategy(); + } +} + +export = ErrorConflictStrategy; \ No newline at end of file diff --git a/lib/core/library/IAsset.js b/lib/core/library/IAsset.js new file mode 100755 index 00000000..0e86f364 --- /dev/null +++ b/lib/core/library/IAsset.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9JQXNzZXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoiY29yZS9saWJyYXJ5L0lBc3NldC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJRXZlbnREaXNwYXRjaGVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9JRXZlbnREaXNwYXRjaGVyXCIpO1xuXG5pbnRlcmZhY2UgSUFzc2V0IGV4dGVuZHMgSUV2ZW50RGlzcGF0Y2hlclxue1xuXHQvKipcblx0ICpcblx0ICovXG5cdG5hbWU6c3RyaW5nO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0aWQ6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0YXNzZXROYW1lc3BhY2U6c3RyaW5nO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0YXNzZXRUeXBlOnN0cmluZztcblxuXHQvKipcblx0ICpcblx0ICovXG5cdGFzc2V0RnVsbFBhdGg6QXJyYXk8c3RyaW5nPjtcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIG5hbWVcblx0ICogQHBhcmFtIG5zXG5cdCAqL1xuXHRhc3NldFBhdGhFcXVhbHMobmFtZTpzdHJpbmcsIG5zOnN0cmluZyk6Ym9vbGVhbjtcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIG5hbWVcblx0ICogQHBhcmFtIG5zXG5cdCAqIEBwYXJhbSBvdmVycmlkZU9yaWdpbmFsXG5cdCAqL1xuXHRyZXNldEFzc2V0UGF0aChuYW1lOnN0cmluZywgbnM6c3RyaW5nLCBvdmVycmlkZU9yaWdpbmFsPzpib29sZWFuKTp2b2lkO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0ZGlzcG9zZSgpO1xuXG59XG5cbmV4cG9ydCA9IElBc3NldDtcbiJdfQ== \ No newline at end of file diff --git a/lib/core/library/IAsset.ts b/lib/core/library/IAsset.ts new file mode 100644 index 00000000..5a339154 --- /dev/null +++ b/lib/core/library/IAsset.ts @@ -0,0 +1,52 @@ +import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); + +interface IAsset extends IEventDispatcher +{ + /** + * + */ + name:string; + + /** + * + */ + id:number; + + /** + * + */ + assetNamespace:string; + + /** + * + */ + assetType:string; + + /** + * + */ + assetFullPath:Array; + + /** + * + * @param name + * @param ns + */ + assetPathEquals(name:string, ns:string):boolean; + + /** + * + * @param name + * @param ns + * @param overrideOriginal + */ + resetAssetPath(name:string, ns:string, overrideOriginal?:boolean):void; + + /** + * + */ + dispose(); + +} + +export = IAsset; diff --git a/lib/core/library/IDUtil.js b/lib/core/library/IDUtil.js new file mode 100755 index 00000000..4fb25e83 --- /dev/null +++ b/lib/core/library/IDUtil.js @@ -0,0 +1,66 @@ +var IDUtil = (function () { + function IDUtil() { + } + /** + * Generates a UID (unique identifier) based on ActionScript's + * pseudo-random number generator and the current time. + * + *

The UID has the form + * "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" + * where X is a hexadecimal digit (0-9, A-F).

+ * + *

This UID will not be truly globally unique; but it is the best + * we can do without player support for UID generation.

+ * + * @return The newly-generated UID. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + IDUtil.createUID = function () { + var uid = new Array(36); + var index = 0; + + var i; + var j; + + for (i = 0; i < 8; i++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; + + for (i = 0; i < 3; i++) { + uid[index++] = 45; // charCode for "-" + + for (j = 0; j < 4; j++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; + } + + uid[index++] = 45; // charCode for "-" + + var time = new Date().getTime(); + + // Note: time is the number of milliseconds since 1970, + // which is currently more than one trillion. + // We use the low 8 hex digits of this number in the UID. + // Just in case the system clock has been reset to + // Jan 1-4, 1970 (in which case this number could have only + // 1-7 hex digits), we pad on the left with 7 zeros + // before taking the low digits. + var timeString = ("0000000" + time.toString(16).toUpperCase()).substr(-8); + + for (i = 0; i < 8; i++) + uid[index++] = timeString.charCodeAt(i); + + for (i = 0; i < 4; i++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random() * 16)]; + + return String.fromCharCode.apply(null, uid); + }; + IDUtil.ALPHA_CHAR_CODES = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70]; + return IDUtil; +})(); + +module.exports = IDUtil; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9JRFV0aWwudHMiXSwibmFtZXMiOlsiSURVdGlsIiwiSURVdGlsLmNvbnN0cnVjdG9yIiwiSURVdGlsLmNyZWF0ZVVJRCJdLCJtYXBwaW5ncyI6IkFBQUE7SUFBQUE7SUFnR0FDLENBQUNBO0FBQUFELElBdEVBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFER0E7dUJBQ0hBO1FBRUNFLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLEtBQUtBLENBQUNBLEVBQUVBLENBQUNBO1FBQ3ZCQSxJQUFJQSxLQUFLQSxHQUFVQSxDQUFDQTs7UUFFcEJBLElBQUlBLENBQUNBO1FBQ0xBLElBQUlBLENBQUNBOztRQUVMQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQTtZQUNyQkEsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsTUFBTUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFdEVBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUVBO1lBQ3ZCQSxHQUFHQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxFQUFFQSxtQkFBbUJBOztZQUV0Q0EsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUE7Z0JBQ3JCQSxHQUFHQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO1NBQ3RFQTs7UUFFREEsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFBRUEsbUJBQW1CQTs7UUFFdENBLElBQUlBLElBQUlBLEdBQVVBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBOztRQUN0Q0EsdURBQXVEQTtRQUN2REEsNkNBQTZDQTtRQUM3Q0EseURBQXlEQTtRQUN6REEsa0RBQWtEQTtRQUNsREEsMkRBQTJEQTtRQUMzREEsbURBQW1EQTtRQUNuREEsZ0NBQWdDQTtRQUNoQ0EsSUFBSUEsVUFBVUEsR0FBVUEsQ0FBQ0EsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRWhGQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQTtZQUNyQkEsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsVUFBVUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRXpDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQTtZQUNyQkEsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsTUFBTUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFdEVBLE9BQU9BLE1BQU1BLENBQUNBLFlBQVlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBO0lBQzVDQSxDQUFDQTtJQXpEREYsMEJBQWtDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQTtJQTBGbkdBLGNBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsdUJBQWdCLENBQUEiLCJmaWxlIjoiY29yZS9saWJyYXJ5L0lEVXRpbC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIElEVXRpbFxue1xuXHQvKipcblx0ICogIEBwcml2YXRlXG5cdCAqICBDaGFyIGNvZGVzIGZvciAwMTIzNDU2Nzg5QUJDREVGXG5cdCAqL1xuXHRwcml2YXRlIHN0YXRpYyBBTFBIQV9DSEFSX0NPREVTID0gWzQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA2NSwgNjYsIDY3LCA2OCwgNjksIDcwXTtcblxuXHQvKipcblx0ICogIEdlbmVyYXRlcyBhIFVJRCAodW5pcXVlIGlkZW50aWZpZXIpIGJhc2VkIG9uIEFjdGlvblNjcmlwdCdzXG5cdCAqICBwc2V1ZG8tcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYW5kIHRoZSBjdXJyZW50IHRpbWUuXG5cdCAqXG5cdCAqICA8cD5UaGUgVUlEIGhhcyB0aGUgZm9ybVxuXHQgKiAgPGNvZGU+XCJYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFhcIjwvY29kZT5cblx0ICogIHdoZXJlIFggaXMgYSBoZXhhZGVjaW1hbCBkaWdpdCAoMC05LCBBLUYpLjwvcD5cblx0ICpcblx0ICogIDxwPlRoaXMgVUlEIHdpbGwgbm90IGJlIHRydWx5IGdsb2JhbGx5IHVuaXF1ZTsgYnV0IGl0IGlzIHRoZSBiZXN0XG5cdCAqICB3ZSBjYW4gZG8gd2l0aG91dCBwbGF5ZXIgc3VwcG9ydCBmb3IgVUlEIGdlbmVyYXRpb24uPC9wPlxuXHQgKlxuXHQgKiAgQHJldHVybiBUaGUgbmV3bHktZ2VuZXJhdGVkIFVJRC5cblx0ICpcblx0ICogIEBsYW5ndmVyc2lvbiAzLjBcblx0ICogIEBwbGF5ZXJ2ZXJzaW9uIEZsYXNoIDlcblx0ICogIEBwbGF5ZXJ2ZXJzaW9uIEFJUiAxLjFcblx0ICogIEBwcm9kdWN0dmVyc2lvbiBGbGV4IDNcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgY3JlYXRlVUlEKCk6c3RyaW5nXG5cdHtcblx0XHR2YXIgdWlkID0gbmV3IEFycmF5KDM2KTtcblx0XHR2YXIgaW5kZXg6bnVtYmVyID0gMDtcblxuXHRcdHZhciBpOm51bWJlcjtcblx0XHR2YXIgajpudW1iZXI7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgODsgaSsrKVxuXHRcdFx0dWlkW2luZGV4KytdID0gSURVdGlsLkFMUEhBX0NIQVJfQ09ERVNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKjE2KV07XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7XG5cdFx0XHR1aWRbaW5kZXgrK10gPSA0NTsgLy8gY2hhckNvZGUgZm9yIFwiLVwiXG5cblx0XHRcdGZvciAoaiA9IDA7IGogPCA0OyBqKyspXG5cdFx0XHRcdHVpZFtpbmRleCsrXSA9IElEVXRpbC5BTFBIQV9DSEFSX0NPREVTW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSoxNildO1xuXHRcdH1cblxuXHRcdHVpZFtpbmRleCsrXSA9IDQ1OyAvLyBjaGFyQ29kZSBmb3IgXCItXCJcblxuXHRcdHZhciB0aW1lOm51bWJlciA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXHRcdC8vIE5vdGU6IHRpbWUgaXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgc2luY2UgMTk3MCxcblx0XHQvLyB3aGljaCBpcyBjdXJyZW50bHkgbW9yZSB0aGFuIG9uZSB0cmlsbGlvbi5cblx0XHQvLyBXZSB1c2UgdGhlIGxvdyA4IGhleCBkaWdpdHMgb2YgdGhpcyBudW1iZXIgaW4gdGhlIFVJRC5cblx0XHQvLyBKdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBjbG9jayBoYXMgYmVlbiByZXNldCB0b1xuXHRcdC8vIEphbiAxLTQsIDE5NzAgKGluIHdoaWNoIGNhc2UgdGhpcyBudW1iZXIgY291bGQgaGF2ZSBvbmx5XG5cdFx0Ly8gMS03IGhleCBkaWdpdHMpLCB3ZSBwYWQgb24gdGhlIGxlZnQgd2l0aCA3IHplcm9zXG5cdFx0Ly8gYmVmb3JlIHRha2luZyB0aGUgbG93IGRpZ2l0cy5cblx0XHR2YXIgdGltZVN0cmluZzpzdHJpbmcgPSAoXCIwMDAwMDAwXCIgKyB0aW1lLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpKS5zdWJzdHIoLTgpO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IDg7IGkrKylcblx0XHRcdHVpZFtpbmRleCsrXSA9IHRpbWVTdHJpbmcuY2hhckNvZGVBdChpKTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCA0OyBpKyspXG5cdFx0XHR1aWRbaW5kZXgrK10gPSBJRFV0aWwuQUxQSEFfQ0hBUl9DT0RFU1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTYpXTtcblxuXHRcdHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHVpZCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBhIGhleCBkaWdpdC5cblx0ICogQHByaXZhdGVcblxuXHQgcHJpdmF0ZSBzdGF0aWMgZ2V0RGlnaXQoaGV4OnN0cmluZyk6bnVtYmVyXG5cdCB7XG5cdFx0c3dpdGNoIChoZXgpIHtcblx0XHRcdGNhc2UgXCJBXCI6XG5cdFx0XHRjYXNlIFwiYVwiOlxuXHRcdFx0XHRyZXR1cm4gMTA7XG5cdFx0XHRjYXNlIFwiQlwiOlxuXHRcdFx0Y2FzZSBcImJcIjpcblx0XHRcdFx0cmV0dXJuIDExO1xuXHRcdFx0Y2FzZSBcIkNcIjpcblx0XHRcdGNhc2UgXCJjXCI6XG5cdFx0XHRcdHJldHVybiAxMjtcblx0XHRcdGNhc2UgXCJEXCI6XG5cdFx0XHRjYXNlIFwiZFwiOlxuXHRcdFx0XHRyZXR1cm4gMTM7XG5cdFx0XHRjYXNlIFwiRVwiOlxuXHRcdFx0Y2FzZSBcImVcIjpcblx0XHRcdFx0cmV0dXJuIDE0O1xuXHRcdFx0Y2FzZSBcIkZcIjpcblx0XHRcdGNhc2UgXCJmXCI6XG5cdFx0XHRcdHJldHVybiAxNTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBuZXcgdWludChoZXgpO1xuXHRcdH1cblx0fVxuXHQgKi9cblxufVxuXG5leHBvcnQgPSBJRFV0aWw7Il19 \ No newline at end of file diff --git a/lib/core/library/IDUtil.ts b/lib/core/library/IDUtil.ts new file mode 100644 index 00000000..8b524aa8 --- /dev/null +++ b/lib/core/library/IDUtil.ts @@ -0,0 +1,99 @@ +class IDUtil +{ + /** + * @private + * Char codes for 0123456789ABCDEF + */ + private static ALPHA_CHAR_CODES = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70]; + + /** + * Generates a UID (unique identifier) based on ActionScript's + * pseudo-random number generator and the current time. + * + *

The UID has the form + * "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" + * where X is a hexadecimal digit (0-9, A-F).

+ * + *

This UID will not be truly globally unique; but it is the best + * we can do without player support for UID generation.

+ * + * @return The newly-generated UID. + * + * @langversion 3.0 + * @playerversion Flash 9 + * @playerversion AIR 1.1 + * @productversion Flex 3 + */ + public static createUID():string + { + var uid = new Array(36); + var index:number = 0; + + var i:number; + var j:number; + + for (i = 0; i < 8; i++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)]; + + for (i = 0; i < 3; i++) { + uid[index++] = 45; // charCode for "-" + + for (j = 0; j < 4; j++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)]; + } + + uid[index++] = 45; // charCode for "-" + + var time:number = new Date().getTime(); + // Note: time is the number of milliseconds since 1970, + // which is currently more than one trillion. + // We use the low 8 hex digits of this number in the UID. + // Just in case the system clock has been reset to + // Jan 1-4, 1970 (in which case this number could have only + // 1-7 hex digits), we pad on the left with 7 zeros + // before taking the low digits. + var timeString:string = ("0000000" + time.toString(16).toUpperCase()).substr(-8); + + for (i = 0; i < 8; i++) + uid[index++] = timeString.charCodeAt(i); + + for (i = 0; i < 4; i++) + uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)]; + + return String.fromCharCode.apply(null, uid); + } + + /** + * Returns the decimal representation of a hex digit. + * @private + + private static getDigit(hex:string):number + { + switch (hex) { + case "A": + case "a": + return 10; + case "B": + case "b": + return 11; + case "C": + case "c": + return 12; + case "D": + case "d": + return 13; + case "E": + case "e": + return 14; + case "F": + case "f": + return 15; + default: + return new uint(hex); + } + } + */ + +} + +export = IDUtil; \ No newline at end of file diff --git a/lib/core/library/IgnoreConflictStrategy.js b/lib/core/library/IgnoreConflictStrategy.js new file mode 100755 index 00000000..a742f438 --- /dev/null +++ b/lib/core/library/IgnoreConflictStrategy.js @@ -0,0 +1,27 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + +var IgnoreConflictStrategy = (function (_super) { + __extends(IgnoreConflictStrategy, _super); + function IgnoreConflictStrategy() { + _super.call(this); + } + IgnoreConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { + // Do nothing, ignore the fact that there is a conflict. + return; + }; + + IgnoreConflictStrategy.prototype.create = function () { + return new IgnoreConflictStrategy(); + }; + return IgnoreConflictStrategy; +})(ConflictStrategyBase); + +module.exports = IgnoreConflictStrategy; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9JZ25vcmVDb25mbGljdFN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbIklnbm9yZUNvbmZsaWN0U3RyYXRlZ3kiLCJJZ25vcmVDb25mbGljdFN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiSWdub3JlQ29uZmxpY3RTdHJhdGVneS5yZXNvbHZlQ29uZmxpY3QiLCJJZ25vcmVDb25mbGljdFN0cmF0ZWd5LmNyZWF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdUZBQTRGOztBQUc1RjtJQUFxQ0EseUNBQW9CQTtJQUV4REE7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7SUFDUkEsQ0FBQ0E7SUFFREQsbURBQUFBLFVBQXVCQSxZQUFtQkEsRUFBRUEsUUFBZUEsRUFBRUEsZ0JBQXVCQSxFQUFFQSxVQUFpQkE7UUFFdEdFLHdEQUF3REE7UUFDeERBLE1BQU9BO0lBQ1JBLENBQUNBOztJQUVERiwwQ0FBQUE7UUFFQ0csT0FBT0EsSUFBSUEsc0JBQXNCQSxDQUFDQSxDQUFDQTtJQUNwQ0EsQ0FBQ0E7SUFDRkgsOEJBQUNBO0FBQURBLENBQUNBLEVBakJvQyxvQkFBb0IsRUFpQnhEOztBQUVELHVDQUFnQyxDQUFBIiwiZmlsZSI6ImNvcmUvbGlicmFyeS9JZ25vcmVDb25mbGljdFN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbmZsaWN0U3RyYXRlZ3lCYXNlXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQ29uZmxpY3RTdHJhdGVneUJhc2VcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuXG5jbGFzcyBJZ25vcmVDb25mbGljdFN0cmF0ZWd5IGV4dGVuZHMgQ29uZmxpY3RTdHJhdGVneUJhc2Vcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlQ29uZmxpY3QoY2hhbmdlZEFzc2V0OklBc3NldCwgb2xkQXNzZXQ6SUFzc2V0LCBhc3NldHNEaWN0aW9uYXJ5Ok9iamVjdCwgcHJlY2VkZW5jZTpzdHJpbmcpXG5cdHtcblx0XHQvLyBEbyBub3RoaW5nLCBpZ25vcmUgdGhlIGZhY3QgdGhhdCB0aGVyZSBpcyBhIGNvbmZsaWN0LlxuXHRcdHJldHVybjtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGUoKTpDb25mbGljdFN0cmF0ZWd5QmFzZVxuXHR7XG5cdFx0cmV0dXJuIG5ldyBJZ25vcmVDb25mbGljdFN0cmF0ZWd5KCk7XG5cdH1cbn1cblxuZXhwb3J0ID0gSWdub3JlQ29uZmxpY3RTdHJhdGVneTsiXX0= \ No newline at end of file diff --git a/lib/core/library/IgnoreConflictStrategy.ts b/lib/core/library/IgnoreConflictStrategy.ts new file mode 100644 index 00000000..d8aa0736 --- /dev/null +++ b/lib/core/library/IgnoreConflictStrategy.ts @@ -0,0 +1,23 @@ +import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); + +class IgnoreConflictStrategy extends ConflictStrategyBase +{ + constructor() + { + super(); + } + + public resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string) + { + // Do nothing, ignore the fact that there is a conflict. + return; + } + + public create():ConflictStrategyBase + { + return new IgnoreConflictStrategy(); + } +} + +export = IgnoreConflictStrategy; \ No newline at end of file diff --git a/lib/core/library/NamedAssetBase.js b/lib/core/library/NamedAssetBase.js new file mode 100755 index 00000000..8f1ece80 --- /dev/null +++ b/lib/core/library/NamedAssetBase.js @@ -0,0 +1,132 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +var NamedAssetBase = (function (_super) { + __extends(NamedAssetBase, _super); + function NamedAssetBase(name) { + if (typeof name === "undefined") { name = null; } + _super.call(this); + + this._id = NamedAssetBase.ID_COUNT++; + + if (name == null) + name = 'null'; + + this._name = name; + this._originalName = name; + + this.updateFullPath(); + } + Object.defineProperty(NamedAssetBase.prototype, "assetType", { + /** + * + */ + get: function () { + throw new AbstractMethodError(); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NamedAssetBase.prototype, "originalName", { + /** + * The original name used for this asset in the resource (e.g. file) in which + * it was found. This may not be the same as name, which may + * have changed due to of a name conflict. + */ + get: function () { + return this._originalName; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NamedAssetBase.prototype, "id", { + /** + * A unique id for the asset, used to identify assets in an associative array + */ + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NamedAssetBase.prototype, "name", { + get: function () { + return this._name; + }, + set: function (val) { + var prev; + + prev = this._name; + this._name = val; + + if (this._name == null) + this._name = 'null'; + + this.updateFullPath(); + + //if (hasEventListener(AssetEvent.ASSET_RENAME)) + this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_RENAME, this, prev)); + }, + enumerable: true, + configurable: true + }); + + + NamedAssetBase.prototype.dispose = function () { + throw new AbstractMethodError(); + }; + + Object.defineProperty(NamedAssetBase.prototype, "assetNamespace", { + get: function () { + return this._namespace; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NamedAssetBase.prototype, "assetFullPath", { + get: function () { + return this._full_path; + }, + enumerable: true, + configurable: true + }); + + NamedAssetBase.prototype.assetPathEquals = function (name, ns) { + return (this._name == name && (!ns || this._namespace == ns)); + }; + + NamedAssetBase.prototype.resetAssetPath = function (name, ns, overrideOriginal) { + if (typeof ns === "undefined") { ns = null; } + if (typeof overrideOriginal === "undefined") { overrideOriginal = true; } + this._name = name ? name : 'null'; + this._namespace = ns ? ns : NamedAssetBase.DEFAULT_NAMESPACE; + + if (overrideOriginal) + this._originalName = this._name; + + this.updateFullPath(); + }; + + NamedAssetBase.prototype.updateFullPath = function () { + this._full_path = [this._namespace, this._name]; + }; + NamedAssetBase.ID_COUNT = 0; + + NamedAssetBase.DEFAULT_NAMESPACE = 'default'; + return NamedAssetBase; +})(EventDispatcher); + +module.exports = NamedAssetBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9OYW1lZEFzc2V0QmFzZS50cyJdLCJuYW1lcyI6WyJOYW1lZEFzc2V0QmFzZSIsIk5hbWVkQXNzZXRCYXNlLmNvbnN0cnVjdG9yIiwiTmFtZWRBc3NldEJhc2UuZGlzcG9zZSIsIk5hbWVkQXNzZXRCYXNlLmFzc2V0UGF0aEVxdWFscyIsIk5hbWVkQXNzZXRCYXNlLnJlc2V0QXNzZXRQYXRoIiwiTmFtZWRBc3NldEJhc2UudXBkYXRlRnVsbFBhdGgiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLCtFQUNvRjtBQUNwRiw2REFBb0U7QUFDcEUsdUVBQTZFOztBQUU3RTtJQUE2QkEsaUNBQWVBO0lBWTNDQSx3QkFBWUEsSUFBa0JBO1FBQWxCQyxtQ0FBQUEsSUFBSUEsR0FBVUEsSUFBSUE7QUFBQUEsUUFFN0JBLFdBQU1BLEtBQUFBLENBQUNBOztRQUVQQSxJQUFJQSxDQUFDQSxHQUFHQSxHQUFHQSxjQUFjQSxDQUFDQSxRQUFRQSxFQUFFQTs7UUFFcENBLElBQUlBLElBQUlBLElBQUlBLElBQUlBO1lBQ2ZBLElBQUlBLEdBQUdBLE1BQU1BLENBQUNBOztRQUVmQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQTtRQUNqQkEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUE7O1FBRXpCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQTtJQUN0QkEsQ0FBQ0E7SUFLREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE1BQU1BLElBQUlBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7UUFDaENBLENBQUNBOzs7O0FBQUFBO0lBT0RBO1FBQUFBOzs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGFBQWFBO1FBQzFCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsR0FBR0E7UUFDaEJBLENBQUNBOzs7O0FBQUFBO0lBRURBO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLEtBQUtBO1FBQ2xCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFnQkEsR0FBVUE7WUFFekJBLElBQUlBLElBQUlBOztZQUVSQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQTtZQUNqQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsR0FBR0E7O1lBRWhCQSxJQUFJQSxJQUFJQSxDQUFDQSxLQUFLQSxJQUFJQSxJQUFJQTtnQkFDckJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLE1BQU1BLENBQUNBOztZQUVyQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7O1lBRXJCQSxnREFBZ0RBO1lBQ2hEQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxJQUFJQSxVQUFVQSxDQUFDQSxVQUFVQSxDQUFDQSxZQUFZQSxFQUFXQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUVqRkEsQ0FBQ0E7Ozs7QUFqQkFBOztJQW1CREEsbUNBQUFBO1FBRUNFLE1BQU1BLElBQUlBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7SUFDaENBLENBQUNBOztJQUVERjtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxVQUFVQTtRQUN2QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFFREE7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsVUFBVUE7UUFDdkJBLENBQUNBOzs7O0FBQUFBO0lBRURBLDJDQUFBQSxVQUF1QkEsSUFBV0EsRUFBRUEsRUFBU0E7UUFFNUNHLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLElBQUlBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLElBQUlBLEVBQUVBLENBQUNBLENBQUNBO0lBQzlEQSxDQUFDQTs7SUFFREgsMENBQUFBLFVBQXNCQSxJQUFXQSxFQUFFQSxFQUFnQkEsRUFBRUEsZ0JBQStCQTtRQUFqREksaUNBQUFBLEVBQUVBLEdBQVVBLElBQUlBO0FBQUFBLFFBQUVBLCtDQUFBQSxnQkFBZ0JBLEdBQVdBLElBQUlBO0FBQUFBLFFBR25GQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxHQUFFQSxJQUFJQSxHQUFHQSxNQUFNQTtRQUNoQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsRUFBRUEsR0FBRUEsRUFBRUEsR0FBR0EsY0FBY0EsQ0FBQ0EsaUJBQWlCQTs7UUFFM0RBLElBQUlBLGdCQUFnQkE7WUFDbkJBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBOztRQUVqQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7SUFDdEJBLENBQUNBOztJQUVESiwwQ0FBQUE7UUFFQ0ssSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBRUE7SUFDbERBLENBQUNBO0lBNUdETCwwQkFBZ0NBLENBQUNBOztJQVFqQ0EsbUNBQXlDQSxTQUFTQTtJQXFHbkRBLHNCQUFDQTtBQUFEQSxDQUFDQSxFQS9HNEIsZUFBZSxFQStHM0M7O0FBRUQsK0JBQXdCLENBQUEiLCJmaWxlIjoiY29yZS9saWJyYXJ5L05hbWVkQXNzZXRCYXNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElBc3NldFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0lBc3NldFwiKTtcbmltcG9ydCBBYnN0cmFjdE1ldGhvZEVycm9yXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQWJzdHJhY3RNZXRob2RFcnJvclwiKTtcbmltcG9ydCBBc3NldEV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0Fzc2V0RXZlbnRcIik7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudERpc3BhdGNoZXJcIik7XG5cbmNsYXNzIE5hbWVkQXNzZXRCYXNlIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyXG57XG5cdHB1YmxpYyBzdGF0aWMgSURfQ09VTlQ6bnVtYmVyID0gMDtcblxuXHRwcml2YXRlIF9vcmlnaW5hbE5hbWU6c3RyaW5nO1xuXHRwcml2YXRlIF9uYW1lc3BhY2U6c3RyaW5nO1xuXHRwcml2YXRlIF9uYW1lOnN0cmluZztcblx0cHJpdmF0ZSBfaWQ6bnVtYmVyO1xuXHRwcml2YXRlIF9mdWxsX3BhdGg6QXJyYXk8c3RyaW5nPjtcblxuXHRwdWJsaWMgc3RhdGljIERFRkFVTFRfTkFNRVNQQUNFOnN0cmluZyA9ICdkZWZhdWx0JztcblxuXHRjb25zdHJ1Y3RvcihuYW1lOnN0cmluZyA9IG51bGwpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5faWQgPSBOYW1lZEFzc2V0QmFzZS5JRF9DT1VOVCsrO1xuXG5cdFx0aWYgKG5hbWUgPT0gbnVsbClcblx0XHRcdG5hbWUgPSAnbnVsbCc7XG5cblx0XHR0aGlzLl9uYW1lID0gbmFtZTtcblx0XHR0aGlzLl9vcmlnaW5hbE5hbWUgPSBuYW1lO1xuXG5cdFx0dGhpcy51cGRhdGVGdWxsUGF0aCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGFzc2V0VHlwZSgpOnN0cmluZ1xuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgb3JpZ2luYWwgbmFtZSB1c2VkIGZvciB0aGlzIGFzc2V0IGluIHRoZSByZXNvdXJjZSAoZS5nLiBmaWxlKSBpbiB3aGljaFxuXHQgKiBpdCB3YXMgZm91bmQuIFRoaXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyA8Y29kZT5uYW1lPC9jb2RlPiwgd2hpY2ggbWF5XG5cdCAqIGhhdmUgY2hhbmdlZCBkdWUgdG8gb2YgYSBuYW1lIGNvbmZsaWN0LlxuXHQgKi9cblx0cHVibGljIGdldCBvcmlnaW5hbE5hbWUoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiB0aGlzLl9vcmlnaW5hbE5hbWU7XG5cdH1cblxuXHQvKipcblx0ICogQSB1bmlxdWUgaWQgZm9yIHRoZSBhc3NldCwgdXNlZCB0byBpZGVudGlmeSBhc3NldHMgaW4gYW4gYXNzb2NpYXRpdmUgYXJyYXlcblx0ICovXG5cdHB1YmxpYyBnZXQgaWQoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pZDtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbmFtZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX25hbWU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG5hbWUodmFsOnN0cmluZylcblx0e1xuXHRcdHZhciBwcmV2OnN0cmluZztcblxuXHRcdHByZXYgPSB0aGlzLl9uYW1lO1xuXHRcdHRoaXMuX25hbWUgPSB2YWw7XG5cblx0XHRpZiAodGhpcy5fbmFtZSA9PSBudWxsKVxuXHRcdFx0dGhpcy5fbmFtZSA9ICdudWxsJztcblxuXHRcdHRoaXMudXBkYXRlRnVsbFBhdGgoKTtcblxuXHRcdC8vaWYgKGhhc0V2ZW50TGlzdGVuZXIoQXNzZXRFdmVudC5BU1NFVF9SRU5BTUUpKVxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQXNzZXRFdmVudChBc3NldEV2ZW50LkFTU0VUX1JFTkFNRSwgPElBc3NldD4gdGhpcywgcHJldikpO1xuXG5cdH1cblxuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0cHVibGljIGdldCBhc3NldE5hbWVzcGFjZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX25hbWVzcGFjZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgYXNzZXRGdWxsUGF0aCgpOkFycmF5PHN0cmluZz5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9mdWxsX3BhdGg7XG5cdH1cblxuXHRwdWJsaWMgYXNzZXRQYXRoRXF1YWxzKG5hbWU6c3RyaW5nLCBuczpzdHJpbmcpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiAodGhpcy5fbmFtZSA9PSBuYW1lICYmICghbnMgfHwgdGhpcy5fbmFtZXNwYWNlID09IG5zKSk7XG5cdH1cblxuXHRwdWJsaWMgcmVzZXRBc3NldFBhdGgobmFtZTpzdHJpbmcsIG5zOnN0cmluZyA9IG51bGwsIG92ZXJyaWRlT3JpZ2luYWw6Ym9vbGVhbiA9IHRydWUpOnZvaWRcblx0e1xuXG5cdFx0dGhpcy5fbmFtZSA9IG5hbWU/IG5hbWUgOiAnbnVsbCc7XG5cdFx0dGhpcy5fbmFtZXNwYWNlID0gbnM/IG5zIDogTmFtZWRBc3NldEJhc2UuREVGQVVMVF9OQU1FU1BBQ0U7XG5cblx0XHRpZiAob3ZlcnJpZGVPcmlnaW5hbClcblx0XHRcdHRoaXMuX29yaWdpbmFsTmFtZSA9IHRoaXMuX25hbWU7XG5cblx0XHR0aGlzLnVwZGF0ZUZ1bGxQYXRoKCk7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZUZ1bGxQYXRoKCk6dm9pZFxuXHR7XG5cdFx0dGhpcy5fZnVsbF9wYXRoID0gWyB0aGlzLl9uYW1lc3BhY2UsIHRoaXMuX25hbWUgXTtcblx0fVxufVxuXG5leHBvcnQgPSBOYW1lZEFzc2V0QmFzZTsiXX0= \ No newline at end of file diff --git a/lib/core/library/NamedAssetBase.ts b/lib/core/library/NamedAssetBase.ts new file mode 100644 index 00000000..e4a4be19 --- /dev/null +++ b/lib/core/library/NamedAssetBase.ts @@ -0,0 +1,119 @@ +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +class NamedAssetBase extends EventDispatcher +{ + public static ID_COUNT:number = 0; + + private _originalName:string; + private _namespace:string; + private _name:string; + private _id:number; + private _full_path:Array; + + public static DEFAULT_NAMESPACE:string = 'default'; + + constructor(name:string = null) + { + super(); + + this._id = NamedAssetBase.ID_COUNT++; + + if (name == null) + name = 'null'; + + this._name = name; + this._originalName = name; + + this.updateFullPath(); + } + + /** + * + */ + public get assetType():string + { + throw new AbstractMethodError(); + } + + /** + * The original name used for this asset in the resource (e.g. file) in which + * it was found. This may not be the same as name, which may + * have changed due to of a name conflict. + */ + public get originalName():string + { + return this._originalName; + } + + /** + * A unique id for the asset, used to identify assets in an associative array + */ + public get id():number + { + return this._id; + } + + public get name():string + { + return this._name; + } + + public set name(val:string) + { + var prev:string; + + prev = this._name; + this._name = val; + + if (this._name == null) + this._name = 'null'; + + this.updateFullPath(); + + //if (hasEventListener(AssetEvent.ASSET_RENAME)) + this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_RENAME, this, prev)); + + } + + public dispose() + { + throw new AbstractMethodError(); + } + + public get assetNamespace():string + { + return this._namespace; + } + + public get assetFullPath():Array + { + return this._full_path; + } + + public assetPathEquals(name:string, ns:string):boolean + { + return (this._name == name && (!ns || this._namespace == ns)); + } + + public resetAssetPath(name:string, ns:string = null, overrideOriginal:boolean = true):void + { + + this._name = name? name : 'null'; + this._namespace = ns? ns : NamedAssetBase.DEFAULT_NAMESPACE; + + if (overrideOriginal) + this._originalName = this._name; + + this.updateFullPath(); + } + + private updateFullPath():void + { + this._full_path = [ this._namespace, this._name ]; + } +} + +export = NamedAssetBase; \ No newline at end of file diff --git a/lib/core/library/NumSuffixConflictStrategy.js b/lib/core/library/NumSuffixConflictStrategy.js new file mode 100755 index 00000000..8ebc6217 --- /dev/null +++ b/lib/core/library/NumSuffixConflictStrategy.js @@ -0,0 +1,64 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); + +var NumSuffixConflictStrategy = (function (_super) { + __extends(NumSuffixConflictStrategy, _super); + function NumSuffixConflictStrategy(separator) { + if (typeof separator === "undefined") { separator = '.'; } + _super.call(this); + + this._separator = separator; + this._next_suffix = {}; + } + NumSuffixConflictStrategy.prototype.resolveConflict = function (changedAsset, oldAsset, assetsDictionary, precedence) { + var orig; + var new_name; + var base; + var suffix; + + orig = changedAsset.name; + + if (orig.indexOf(this._separator) >= 0) { + // Name has an ocurrence of the separator, so get base name and suffix, + // unless suffix is non-numerical, in which case revert to zero and + // use entire name as base + base = orig.substring(0, orig.lastIndexOf(this._separator)); + suffix = parseInt(orig.substring(base.length - 1)); + + if (isNaN(suffix)) { + base = orig; + suffix = 0; + } + } else { + base = orig; + suffix = 0; + } + + if (suffix == 0 && this._next_suffix.hasOwnProperty(base)) { + suffix = this._next_suffix[base]; + } + + do { + suffix++; + + new_name = base.concat(this._separator, suffix.toString()); + } while(assetsDictionary.hasOwnProperty(new_name)); + + this._next_suffix[base] = suffix; + this._pUpdateNames(oldAsset.assetNamespace, new_name, oldAsset, changedAsset, assetsDictionary, precedence); + }; + + NumSuffixConflictStrategy.prototype.create = function () { + return new NumSuffixConflictStrategy(this._separator); + }; + return NumSuffixConflictStrategy; +})(ConflictStrategyBase); + +module.exports = NumSuffixConflictStrategy; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbGlicmFyeS9OdW1TdWZmaXhDb25mbGljdFN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbIk51bVN1ZmZpeENvbmZsaWN0U3RyYXRlZ3kiLCJOdW1TdWZmaXhDb25mbGljdFN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiTnVtU3VmZml4Q29uZmxpY3RTdHJhdGVneS5yZXNvbHZlQ29uZmxpY3QiLCJOdW1TdWZmaXhDb25mbGljdFN0cmF0ZWd5LmNyZWF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsdUZBQTRGOztBQUc1RjtJQUF3Q0EsNENBQW9CQTtJQUszREEsbUNBQVlBLFNBQXNCQTtRQUF0QkMsd0NBQUFBLFNBQVNBLEdBQVVBLEdBQUdBO0FBQUFBLFFBRWpDQSxXQUFNQSxLQUFBQSxDQUFDQTs7UUFFUEEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsU0FBU0E7UUFDM0JBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLEVBQUVBO0lBQ3ZCQSxDQUFDQTtJQUVERCxzREFBQUEsVUFBdUJBLFlBQW1CQSxFQUFFQSxRQUFlQSxFQUFFQSxnQkFBdUJBLEVBQUVBLFVBQWlCQTtRQUV0R0UsSUFBSUEsSUFBSUE7UUFDUkEsSUFBSUEsUUFBUUE7UUFDWkEsSUFBSUEsSUFBSUE7UUFDUkEsSUFBSUEsTUFBTUE7O1FBRVZBLElBQUlBLEdBQUdBLFlBQVlBLENBQUNBLElBQUlBOztRQUV4QkEsSUFBSUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBRUE7WUFDdkNBLHVFQUF1RUE7WUFDdkVBLG1FQUFtRUE7WUFDbkVBLDBCQUEwQkE7WUFDMUJBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1lBQzNEQSxNQUFNQSxHQUFHQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTs7WUFFbERBLElBQUlBLEtBQUtBLENBQUNBLE1BQU1BLENBQUNBLENBQUVBO2dCQUNsQkEsSUFBSUEsR0FBR0EsSUFBSUE7Z0JBQ1hBLE1BQU1BLEdBQUdBLENBQUNBO2FBQ1ZBO1NBRURBLEtBQU1BO1lBQ05BLElBQUlBLEdBQUdBLElBQUlBO1lBQ1hBLE1BQU1BLEdBQUdBLENBQUNBO1NBQ1ZBOztRQUVEQSxJQUFJQSxNQUFNQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUUxREEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FFaENBOztRQUlEQSxFQUFHQTtZQUVGQSxNQUFNQSxFQUFFQTs7WUFFUkEsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsTUFBTUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FFMURBLE1BQU1BLENBQUVBLGdCQUFnQkEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBRUE7O1FBRXBEQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFFQSxJQUFJQSxDQUFFQSxHQUFHQSxNQUFNQTtRQUNsQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsY0FBY0EsRUFBRUEsUUFBUUEsRUFBRUEsUUFBUUEsRUFBRUEsWUFBWUEsRUFBRUEsZ0JBQWdCQSxFQUFFQSxVQUFVQSxDQUFDQTtJQUU1R0EsQ0FBQ0E7O0lBRURGLDZDQUFBQTtRQUVDRyxPQUFPQSxJQUFJQSx5QkFBeUJBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBO0lBQ3REQSxDQUFDQTtJQUNGSCxpQ0FBQ0E7QUFBREEsQ0FBQ0EsRUFoRXVDLG9CQUFvQixFQWdFM0Q7O0FBRUQsMENBQW1DLENBQUEiLCJmaWxlIjoiY29yZS9saWJyYXJ5L051bVN1ZmZpeENvbmZsaWN0U3RyYXRlZ3kuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29uZmxpY3RTdHJhdGVneUJhc2VcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Db25mbGljdFN0cmF0ZWd5QmFzZVwiKTtcbmltcG9ydCBJQXNzZXRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5cbmNsYXNzIE51bVN1ZmZpeENvbmZsaWN0U3RyYXRlZ3kgZXh0ZW5kcyBDb25mbGljdFN0cmF0ZWd5QmFzZVxue1xuXHRwcml2YXRlIF9zZXBhcmF0b3I6c3RyaW5nO1xuXHRwcml2YXRlIF9uZXh0X3N1ZmZpeDpPYmplY3Q7XG5cblx0Y29uc3RydWN0b3Ioc2VwYXJhdG9yOnN0cmluZyA9ICcuJylcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9zZXBhcmF0b3IgPSBzZXBhcmF0b3I7XG5cdFx0dGhpcy5fbmV4dF9zdWZmaXggPSB7fTtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlQ29uZmxpY3QoY2hhbmdlZEFzc2V0OklBc3NldCwgb2xkQXNzZXQ6SUFzc2V0LCBhc3NldHNEaWN0aW9uYXJ5Ok9iamVjdCwgcHJlY2VkZW5jZTpzdHJpbmcpXG5cdHtcblx0XHR2YXIgb3JpZzpzdHJpbmc7XG5cdFx0dmFyIG5ld19uYW1lOnN0cmluZztcblx0XHR2YXIgYmFzZTpzdHJpbmc7XG5cdFx0dmFyIHN1ZmZpeDpudW1iZXI7XG5cblx0XHRvcmlnID0gY2hhbmdlZEFzc2V0Lm5hbWU7XG5cblx0XHRpZiAob3JpZy5pbmRleE9mKHRoaXMuX3NlcGFyYXRvcikgPj0gMCkge1xuXHRcdFx0Ly8gTmFtZSBoYXMgYW4gb2N1cnJlbmNlIG9mIHRoZSBzZXBhcmF0b3IsIHNvIGdldCBiYXNlIG5hbWUgYW5kIHN1ZmZpeCxcblx0XHRcdC8vIHVubGVzcyBzdWZmaXggaXMgbm9uLW51bWVyaWNhbCwgaW4gd2hpY2ggY2FzZSByZXZlcnQgdG8gemVybyBhbmRcblx0XHRcdC8vIHVzZSBlbnRpcmUgbmFtZSBhcyBiYXNlXG5cdFx0XHRiYXNlID0gb3JpZy5zdWJzdHJpbmcoMCwgb3JpZy5sYXN0SW5kZXhPZih0aGlzLl9zZXBhcmF0b3IpKTtcblx0XHRcdHN1ZmZpeCA9IHBhcnNlSW50KG9yaWcuc3Vic3RyaW5nKGJhc2UubGVuZ3RoIC0gMSkpO1xuXG5cdFx0XHRpZiAoaXNOYU4oc3VmZml4KSkge1xuXHRcdFx0XHRiYXNlID0gb3JpZztcblx0XHRcdFx0c3VmZml4ID0gMDtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRiYXNlID0gb3JpZztcblx0XHRcdHN1ZmZpeCA9IDA7XG5cdFx0fVxuXG5cdFx0aWYgKHN1ZmZpeCA9PSAwICYmIHRoaXMuX25leHRfc3VmZml4Lmhhc093blByb3BlcnR5KGJhc2UpKSB7XG5cblx0XHRcdHN1ZmZpeCA9IHRoaXMuX25leHRfc3VmZml4W2Jhc2VdO1xuXG5cdFx0fVxuXG5cdFx0Ly8gRmluZCB0aGUgZmlyc3Qgc3VmZml4ZWQgbmFtZSB0aGF0IGRvZXNcblx0XHQvLyBub3QgY29sbGlkZSB3aXRoIG90aGVyIG5hbWVzLlxuXHRcdGRvIHtcblxuXHRcdFx0c3VmZml4Kys7XG5cblx0XHRcdG5ld19uYW1lID0gYmFzZS5jb25jYXQodGhpcy5fc2VwYXJhdG9yLCBzdWZmaXgudG9TdHJpbmcoKSk7XG5cblx0XHR9IHdoaWxlIChhc3NldHNEaWN0aW9uYXJ5Lmhhc093blByb3BlcnR5KG5ld19uYW1lKSk7XG5cblx0XHR0aGlzLl9uZXh0X3N1ZmZpeFsgYmFzZSBdID0gc3VmZml4O1xuXHRcdHRoaXMuX3BVcGRhdGVOYW1lcyhvbGRBc3NldC5hc3NldE5hbWVzcGFjZSwgbmV3X25hbWUsIG9sZEFzc2V0LCBjaGFuZ2VkQXNzZXQsIGFzc2V0c0RpY3Rpb25hcnksIHByZWNlZGVuY2UpO1xuXG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlKCk6Q29uZmxpY3RTdHJhdGVneUJhc2Vcblx0e1xuXHRcdHJldHVybiBuZXcgTnVtU3VmZml4Q29uZmxpY3RTdHJhdGVneSh0aGlzLl9zZXBhcmF0b3IpO1xuXHR9XG59XG5cbmV4cG9ydCA9IE51bVN1ZmZpeENvbmZsaWN0U3RyYXRlZ3k7Il19 \ No newline at end of file diff --git a/lib/core/library/NumSuffixConflictStrategy.ts b/lib/core/library/NumSuffixConflictStrategy.ts new file mode 100644 index 00000000..8b7485b7 --- /dev/null +++ b/lib/core/library/NumSuffixConflictStrategy.ts @@ -0,0 +1,70 @@ +import ConflictStrategyBase = require("awayjs-core/lib/core/library/ConflictStrategyBase"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); + +class NumSuffixConflictStrategy extends ConflictStrategyBase +{ + private _separator:string; + private _next_suffix:Object; + + constructor(separator:string = '.') + { + super(); + + this._separator = separator; + this._next_suffix = {}; + } + + public resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string) + { + var orig:string; + var new_name:string; + var base:string; + var suffix:number; + + orig = changedAsset.name; + + if (orig.indexOf(this._separator) >= 0) { + // Name has an ocurrence of the separator, so get base name and suffix, + // unless suffix is non-numerical, in which case revert to zero and + // use entire name as base + base = orig.substring(0, orig.lastIndexOf(this._separator)); + suffix = parseInt(orig.substring(base.length - 1)); + + if (isNaN(suffix)) { + base = orig; + suffix = 0; + } + + } else { + base = orig; + suffix = 0; + } + + if (suffix == 0 && this._next_suffix.hasOwnProperty(base)) { + + suffix = this._next_suffix[base]; + + } + + // Find the first suffixed name that does + // not collide with other names. + do { + + suffix++; + + new_name = base.concat(this._separator, suffix.toString()); + + } while (assetsDictionary.hasOwnProperty(new_name)); + + this._next_suffix[ base ] = suffix; + this._pUpdateNames(oldAsset.assetNamespace, new_name, oldAsset, changedAsset, assetsDictionary, precedence); + + } + + public create():ConflictStrategyBase + { + return new NumSuffixConflictStrategy(this._separator); + } +} + +export = NumSuffixConflictStrategy; \ No newline at end of file diff --git a/lib/core/net/CrossDomainPolicy.js b/lib/core/net/CrossDomainPolicy.js new file mode 100755 index 00000000..cb858737 --- /dev/null +++ b/lib/core/net/CrossDomainPolicy.js @@ -0,0 +1,12 @@ +var CrossDomainPolicy = (function () { + function CrossDomainPolicy() { + } + CrossDomainPolicy.ANONYMOUS = 'anonymous'; + + CrossDomainPolicy.USE_CREDENTIALS = 'use-credentials'; + return CrossDomainPolicy; +})(); + +module.exports = CrossDomainPolicy; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbmV0L0Nyb3NzRG9tYWluUG9saWN5LnRzIl0sIm5hbWVzIjpbIkNyb3NzRG9tYWluUG9saWN5IiwiQ3Jvc3NEb21haW5Qb2xpY3kuY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBO0lBQUFBO0lBS0FDLENBQUNBO0FBQUFELElBSEFBLDhCQUFpQ0EsV0FBV0E7O0lBRTVDQSxvQ0FBdUNBLGlCQUFpQkE7SUFDekRBLHlCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELGtDQUEyQixDQUMzQiIsImZpbGUiOiJjb3JlL25ldC9Dcm9zc0RvbWFpblBvbGljeS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIENyb3NzRG9tYWluUG9saWN5XG57XG5cdHB1YmxpYyBzdGF0aWMgQU5PTllNT1VTOnN0cmluZyA9ICdhbm9ueW1vdXMnO1xuXG5cdHB1YmxpYyBzdGF0aWMgVVNFX0NSRURFTlRJQUxTOnN0cmluZyA9ICd1c2UtY3JlZGVudGlhbHMnO1xufVxuXG5leHBvcnQgPSBDcm9zc0RvbWFpblBvbGljeTtcbiJdfQ== \ No newline at end of file diff --git a/lib/core/net/CrossDomainPolicy.ts b/lib/core/net/CrossDomainPolicy.ts new file mode 100644 index 00000000..55998834 --- /dev/null +++ b/lib/core/net/CrossDomainPolicy.ts @@ -0,0 +1,8 @@ +class CrossDomainPolicy +{ + public static ANONYMOUS:string = 'anonymous'; + + public static USE_CREDENTIALS:string = 'use-credentials'; +} + +export = CrossDomainPolicy; diff --git a/lib/core/net/URLLoader.js b/lib/core/net/URLLoader.js new file mode 100755 index 00000000..c3983cc9 --- /dev/null +++ b/lib/core/net/URLLoader.js @@ -0,0 +1,415 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); + +var URLRequestMethod = require("awayjs-core/lib/core/net/URLRequestMethod"); +var URLVariables = require("awayjs-core/lib/core/net/URLVariables"); +var AwayEvent = require("awayjs-core/lib/events/Event"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var HTTPStatusEvent = require("awayjs-core/lib/events/HTTPStatusEvent"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var AwayProgressEvent = require("awayjs-core/lib/events/ProgressEvent"); + +/** +* The URLLoader is used to load a single file, as part of a resource. +* +* While URLLoader can be used directly, e.g. to create a third-party asset +* management system, it's recommended to use any of the classes Loader3D, AssetLoader +* and AssetLibrary instead in most cases. +* +* @see AssetLoader +* @see away.library.AssetLibrary +*/ +var URLLoader = (function (_super) { + __extends(URLLoader, _super); + /** + * Creates a new URLLoader object. + */ + function URLLoader() { + _super.call(this); + this._bytesLoaded = 0; + this._bytesTotal = 0; + this._dataFormat = URLLoaderDataFormat.TEXT; + this._loadError = false; + } + Object.defineProperty(URLLoader.prototype, "url", { + /** + * + */ + get: function () { + return this._request ? this._request.url : ''; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(URLLoader.prototype, "data", { + /** + * + */ + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(URLLoader.prototype, "dataFormat", { + get: function () { + return this._dataFormat; + }, + /** + * + * URLLoaderDataFormat.BINARY + * URLLoaderDataFormat.TEXT + * URLLoaderDataFormat.VARIABLES + * + * @param format + */ + set: function (format) { + this._dataFormat = format; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(URLLoader.prototype, "bytesLoaded", { + /** + * + * @returns {number} + */ + get: function () { + return this._bytesLoaded; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(URLLoader.prototype, "bytesTotal", { + /** + * + * @returns {number} + */ + get: function () { + return this._bytesTotal; + }, + enumerable: true, + configurable: true + }); + + /** + * Load a resource from a file. + * + * @param request The URLRequest object containing the URL of the object to be loaded. + */ + URLLoader.prototype.load = function (request) { + this._request = request; + + this.initXHR(); + + if (request.method === URLRequestMethod.POST) + this.postRequest(request); + else + this.getRequest(request); + }; + + /** + * + */ + URLLoader.prototype.close = function () { + this._XHR.abort(); + this.disposeXHR(); + }; + + /** + * + */ + URLLoader.prototype.dispose = function () { + if (this._XHR) + this._XHR.abort(); + + this.disposeXHR(); + + this._data = null; + this._dataFormat = null; + this._bytesLoaded = null; + this._bytesTotal = null; + }; + + /** + * + * @param xhr + * @param responseType + */ + URLLoader.prototype.setResponseType = function (xhr, responseType) { + switch (responseType) { + case URLLoaderDataFormat.ARRAY_BUFFER: + case URLLoaderDataFormat.BLOB: + case URLLoaderDataFormat.TEXT: + xhr.responseType = responseType; + break; + + case URLLoaderDataFormat.VARIABLES: + xhr.responseType = URLLoaderDataFormat.TEXT; + break; + + case URLLoaderDataFormat.BINARY: + xhr.responseType = ''; + break; + + default: + } + }; + + /** + * + * @param request {URLRequest} + */ + URLLoader.prototype.getRequest = function (request) { + try { + this._XHR.open(request.method, request.url, request.async); + this.setResponseType(this._XHR, this._dataFormat); + this._XHR.send(); // No data to send + } catch (e) { + this.handleXmlHttpRequestException(e); + } + }; + + /** + * + * @param request {URLRequest} + */ + URLLoader.prototype.postRequest = function (request) { + this._loadError = false; + + this._XHR.open(request.method, request.url, request.async); + + if (request.data != null) { + if (request.data instanceof URLVariables) { + var urlVars = request.data; + + try { + this._XHR.responseType = 'text'; + this._XHR.send(urlVars.formData); + } catch (e) { + this.handleXmlHttpRequestException(e); + } + } else { + this.setResponseType(this._XHR, this._dataFormat); + + if (request.data) + this._XHR.send(request.data); // TODO: Test + else + this._XHR.send(); // no data to send + } + } else { + this._XHR.send(); // No data to send + } + }; + + /** + * + * @param error {XMLHttpRequestException} + */ + URLLoader.prototype.handleXmlHttpRequestException = function (error /* */ ) { + switch (error.code) { + case 101: + break; + } + }; + + /** + * + */ + URLLoader.prototype.initXHR = function () { + var _this = this; + if (!this._XHR) { + this._XHR = new XMLHttpRequest(); + + this._XHR.onloadstart = function (event) { + return _this.onLoadStart(event); + }; // loadstart - When the request starts. + this._XHR.onprogress = function (event) { + return _this.onProgress(event); + }; // progress - While loading and sending data. + this._XHR.onabort = function (event) { + return _this.onAbort(event); + }; // abort - When the request has been aborted, either by invoking the abort() method or navigating away from the page. + this._XHR.onerror = function (event) { + return _this.onLoadError(event); + }; // error - When the request has failed. + this._XHR.onload = function (event) { + return _this.onLoadComplete(event); + }; // load - When the request has successfully completed. + this._XHR.ontimeout = function (event) { + return _this.onTimeOut(event); + }; // timeout - When the author specified timeout has passed before the request could complete. + this._XHR.onloadend = function (event) { + return _this.onLoadEnd(event); + }; // loadend - When the request has completed, regardless of whether or not it was successful. + this._XHR.onreadystatechange = function (event) { + return _this.onReadyStateChange(event); + }; // onreadystatechange - When XHR state changes + } + }; + + /** + * + */ + URLLoader.prototype.disposeXHR = function () { + if (this._XHR !== null) { + this._XHR.onloadstart = null; + this._XHR.onprogress = null; + this._XHR.onabort = null; + this._XHR.onerror = null; + this._XHR.onload = null; + this._XHR.ontimeout = null; + this._XHR.onloadend = null; + this._XHR = null; + } + }; + + /** + * + * @param source + */ + URLLoader.prototype.decodeURLVariables = function (source) { + var result = new Object(); + + source = source.split("+").join(" "); + + var tokens, re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(source)) + result[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + + return result; + }; + + // XMLHttpRequest - Event Handlers + /** + * When XHR state changes + * @param event + */ + URLLoader.prototype.onReadyStateChange = function (event) { + if (this._XHR.readyState == 4) { + if (this._XHR.status == 404) { + this._loadError = true; + + if (!this._loadErrorEvent) + this._loadErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR); + + this.dispatchEvent(this._loadErrorEvent); + } + + this.dispatchEvent(new HTTPStatusEvent(HTTPStatusEvent.HTTP_STATUS, this._XHR.status)); + } + }; + + /** + * When the request has completed, regardless of whether or not it was successful. + * @param event + */ + URLLoader.prototype.onLoadEnd = function (event) { + if (this._loadError === true) + return; + }; + + /** + * When the author specified timeout has passed before the request could complete. + * @param event + */ + URLLoader.prototype.onTimeOut = function (event) { + //TODO: Timeout not currently implemented ( also not part of AS3 API ) + }; + + /** + * When the request has been aborted, either by invoking the abort() method or navigating away from the page. + * @param event + */ + URLLoader.prototype.onAbort = function (event) { + // TODO: investigate whether this needs to be an IOError + }; + + /** + * While loading and sending data. + * @param event + */ + URLLoader.prototype.onProgress = function (event) { + if (!this._progressEvent) + this._progressEvent = new AwayProgressEvent(AwayProgressEvent.PROGRESS); + + this._progressEvent.bytesTotal = event.total; + this._progressEvent.bytesLoaded = event.loaded; + + this.dispatchEvent(this._progressEvent); + }; + + /** + * When the request starts. + * @param event + */ + URLLoader.prototype.onLoadStart = function (event) { + if (!this._loadStartEvent) + this._loadStartEvent = new AwayEvent(AwayEvent.OPEN); + + this.dispatchEvent(this._loadStartEvent); + }; + + /** + * When the request has successfully completed. + * @param event + */ + URLLoader.prototype.onLoadComplete = function (event) { + if (this._loadError === true) + return; + + switch (this._dataFormat) { + case URLLoaderDataFormat.TEXT: + this._data = this._XHR.responseText; + break; + + case URLLoaderDataFormat.VARIABLES: + this._data = this.decodeURLVariables(this._XHR.responseText); + break; + + case URLLoaderDataFormat.BLOB: + case URLLoaderDataFormat.ARRAY_BUFFER: + case URLLoaderDataFormat.BINARY: + this._data = this._XHR.response; + break; + + default: + this._data = this._XHR.responseText; + break; + } + + if (!this._loadCompleteEvent) + this._loadCompleteEvent = new AwayEvent(AwayEvent.COMPLETE); + + this.dispatchEvent(this._loadCompleteEvent); + }; + + /** + * When the request has failed. ( due to network issues ). + * @param event + */ + URLLoader.prototype.onLoadError = function (event) { + this._loadError = true; + + if (!this._loadErrorEvent) + this._loadErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR); + + this.dispatchEvent(this._loadErrorEvent); + }; + return URLLoader; +})(EventDispatcher); + +module.exports = URLLoader; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbmV0L1VSTExvYWRlci50cyJdLCJuYW1lcyI6WyJVUkxMb2FkZXIiLCJVUkxMb2FkZXIuY29uc3RydWN0b3IiLCJVUkxMb2FkZXIubG9hZCIsIlVSTExvYWRlci5jbG9zZSIsIlVSTExvYWRlci5kaXNwb3NlIiwiVVJMTG9hZGVyLnNldFJlc3BvbnNlVHlwZSIsIlVSTExvYWRlci5nZXRSZXF1ZXN0IiwiVVJMTG9hZGVyLnBvc3RSZXF1ZXN0IiwiVVJMTG9hZGVyLmhhbmRsZVhtbEh0dHBSZXF1ZXN0RXhjZXB0aW9uIiwiVVJMTG9hZGVyLmluaXRYSFIiLCJVUkxMb2FkZXIuZGlzcG9zZVhIUiIsIlVSTExvYWRlci5kZWNvZGVVUkxWYXJpYWJsZXMiLCJVUkxMb2FkZXIub25SZWFkeVN0YXRlQ2hhbmdlIiwiVVJMTG9hZGVyLm9uTG9hZEVuZCIsIlVSTExvYWRlci5vblRpbWVPdXQiLCJVUkxMb2FkZXIub25BYm9ydCIsIlVSTExvYWRlci5vblByb2dyZXNzIiwiVVJMTG9hZGVyLm9uTG9hZFN0YXJ0IiwiVVJMTG9hZGVyLm9uTG9hZENvbXBsZXRlIiwiVVJMTG9hZGVyLm9uTG9hZEVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpRkFBdUY7O0FBRXZGLDJFQUFrRjtBQUNsRixtRUFBMkU7QUFDM0UsdURBQStEO0FBQy9ELHVFQUE4RTtBQUM5RSx1RUFBOEU7QUFDOUUsaUVBQXlFO0FBQ3pFLHVFQUE2RTs7QUFFN0U7Ozs7Ozs7OztFQVNHO0FBQ0g7SUFBd0JBLDRCQUFlQTtJQW1CdENBOztNQURHQTtJQUNIQTtRQUVDQyxXQUFNQSxLQUFBQSxDQUFDQTtRQWxCUkEsS0FBUUEsWUFBWUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDaENBLEtBQVFBLFdBQVdBLEdBQVVBLENBQUNBLENBQUNBO1FBQy9CQSxLQUFRQSxXQUFXQSxHQUFVQSxtQkFBbUJBLENBQUNBLElBQUlBLENBQUNBO1FBQ3REQSxLQUFRQSxVQUFVQSxHQUFXQSxLQUFLQSxDQUFD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QUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQTtnQkFDbkNBLEtBQU1BO0FBQUFBLFNBQ1BBOztRQUVEQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxrQkFBa0JBO1lBQzNCQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUdBLElBQUlBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBOztRQUU3REEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQTtJQUM1Q0EsQ0FBQ0E7O0lBTURsQjs7O01BREdBO3NDQUNIQSxVQUFvQkEsS0FBV0E7UUFFOUJtQixJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQTs7UUFFdEJBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBO1lBQ3hCQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxJQUFJQSxZQUFZQSxDQUFDQSxZQUFZQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQTs7UUFFaEVBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBO0lBQ3pDQSxDQUFDQTtJQUNGbkIsaUJBQUNBO0FBQURBLENBQUNBLEVBM1l1QixlQUFlLEVBMll0Qzs7QUFFRCwwQkFBbUIsQ0FBQSIsImZpbGUiOiJjb3JlL25ldC9VUkxMb2FkZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVVJMTG9hZGVyRGF0YUZvcm1hdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxMb2FkZXJEYXRhRm9ybWF0XCIpO1xuaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTFJlcXVlc3RcIik7XG5pbXBvcnQgVVJMUmVxdWVzdE1ldGhvZFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTFJlcXVlc3RNZXRob2RcIik7XG5pbXBvcnQgVVJMVmFyaWFibGVzXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxWYXJpYWJsZXNcIik7XG5pbXBvcnQgQXdheUV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnRcIik7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiKTtcbmltcG9ydCBIVFRQU3RhdHVzRXZlbnRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvSFRUUFN0YXR1c0V2ZW50XCIpO1xuaW1wb3J0IElPRXJyb3JFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0lPRXJyb3JFdmVudFwiKTtcbmltcG9ydCBBd2F5UHJvZ3Jlc3NFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvUHJvZ3Jlc3NFdmVudFwiKTtcblxuLyoqXG4gKiBUaGUgVVJMTG9hZGVyIGlzIHVzZWQgdG8gbG9hZCBhIHNpbmdsZSBmaWxlLCBhcyBwYXJ0IG9mIGEgcmVzb3VyY2UuXG4gKlxuICogV2hpbGUgVVJMTG9hZGVyIGNhbiBiZSB1c2VkIGRpcmVjdGx5LCBlLmcuIHRvIGNyZWF0ZSBhIHRoaXJkLXBhcnR5IGFzc2V0XG4gKiBtYW5hZ2VtZW50IHN5c3RlbSwgaXQncyByZWNvbW1lbmRlZCB0byB1c2UgYW55IG9mIHRoZSBjbGFzc2VzIExvYWRlcjNELCBBc3NldExvYWRlclxuICogYW5kIEFzc2V0TGlicmFyeSBpbnN0ZWFkIGluIG1vc3QgY2FzZXMuXG4gKlxuICogQHNlZSBBc3NldExvYWRlclxuICogQHNlZSBhd2F5LmxpYnJhcnkuQXNzZXRMaWJyYXJ5XG4gKi9cbmNsYXNzIFVSTExvYWRlciBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlclxue1xuXHRwcml2YXRlIF9YSFI6WE1MSHR0cFJlcXVlc3Q7XG5cdHByaXZhdGUgX2J5dGVzTG9hZGVkOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX2J5dGVzVG90YWw6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfZGF0YUZvcm1hdDpzdHJpbmcgPSBVUkxMb2FkZXJEYXRhRm9ybWF0LlRFWFQ7XG5cdHByaXZhdGUgX2xvYWRFcnJvcjpib29sZWFuID0gZmFsc2U7XG5cblx0cHJpdmF0ZSBfcmVxdWVzdDpVUkxSZXF1ZXN0O1xuXHRwcml2YXRlIF9kYXRhOmFueTtcblxuXHRwcml2YXRlIF9sb2FkU3RhcnRFdmVudDpBd2F5RXZlbnQ7XG5cdHByaXZhdGUgX2xvYWRFcnJvckV2ZW50OklPRXJyb3JFdmVudDtcblx0cHJpdmF0ZSBfbG9hZENvbXBsZXRlRXZlbnQ6QXdheUV2ZW50O1xuXHRwcml2YXRlIF9wcm9ncmVzc0V2ZW50OkF3YXlQcm9ncmVzc0V2ZW50O1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFVSTExvYWRlciBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHVybCgpOnN0cmluZ1xuXHR7XG5cblx0XHRyZXR1cm4gdGhpcy5fcmVxdWVzdD8gdGhpcy5fcmVxdWVzdC51cmwgOiAnJztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBkYXRhKCk6YW55XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YTtcblx0fVxuXG5cblx0LyoqXG5cdCAqXG5cdCAqIFVSTExvYWRlckRhdGFGb3JtYXQuQklOQVJZXG5cdCAqIFVSTExvYWRlckRhdGFGb3JtYXQuVEVYVFxuXHQgKiBVUkxMb2FkZXJEYXRhRm9ybWF0LlZBUklBQkxFU1xuXHQgKlxuXHQgKiBAcGFyYW0gZm9ybWF0XG5cdCAqL1xuXHRwdWJsaWMgc2V0IGRhdGFGb3JtYXQoZm9ybWF0OnN0cmluZylcblx0e1xuXHRcdHRoaXMuX2RhdGFGb3JtYXQgPSBmb3JtYXQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRhdGFGb3JtYXQoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhRm9ybWF0O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGJ5dGVzTG9hZGVkKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYnl0ZXNMb2FkZWQ7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge251bWJlcn1cblx0ICovXG5cdHB1YmxpYyBnZXQgYnl0ZXNUb3RhbCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2J5dGVzVG90YWw7XG5cdH1cblxuXHQvKipcblx0ICogTG9hZCBhIHJlc291cmNlIGZyb20gYSBmaWxlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVxdWVzdCBUaGUgVVJMUmVxdWVzdCBvYmplY3QgY29udGFpbmluZyB0aGUgVVJMIG9mIHRoZSBvYmplY3QgdG8gYmUgbG9hZGVkLlxuXHQgKi9cblx0cHVibGljIGxvYWQocmVxdWVzdDpVUkxSZXF1ZXN0KTp2b2lkXG5cdHtcblx0XHR0aGlzLl9yZXF1ZXN0ID0gcmVxdWVzdDtcblxuXHRcdHRoaXMuaW5pdFhIUigpO1xuXG5cdFx0aWYgKHJlcXVlc3QubWV0aG9kID09PSBVUkxSZXF1ZXN0TWV0aG9kLlBPU1QpXG5cdFx0XHR0aGlzLnBvc3RSZXF1ZXN0KHJlcXVlc3QpO1xuXHRcdGVsc2Vcblx0XHRcdHRoaXMuZ2V0UmVxdWVzdChyZXF1ZXN0KTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGNsb3NlKCk6dm9pZFxuXHR7XG5cdFx0dGhpcy5fWEhSLmFib3J0KCk7XG5cdFx0dGhpcy5kaXNwb3NlWEhSKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBkaXNwb3NlKCk6dm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMuX1hIUilcblx0XHRcdHRoaXMuX1hIUi5hYm9ydCgpO1xuXG5cdFx0dGhpcy5kaXNwb3NlWEhSKCk7XG5cblx0XHR0aGlzLl9kYXRhID0gbnVsbDtcblx0XHR0aGlzLl9kYXRhRm9ybWF0ID0gbnVsbDtcblx0XHR0aGlzLl9ieXRlc0xvYWRlZCA9IG51bGw7XG5cdFx0dGhpcy5fYnl0ZXNUb3RhbCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHhoclxuXHQgKiBAcGFyYW0gcmVzcG9uc2VUeXBlXG5cdCAqL1xuXHRwcml2YXRlIHNldFJlc3BvbnNlVHlwZSh4aHI6WE1MSHR0cFJlcXVlc3QsIHJlc3BvbnNlVHlwZTpzdHJpbmcpOnZvaWRcblx0e1xuXHRcdHN3aXRjaCAocmVzcG9uc2VUeXBlKSB7XG5cdFx0XHRjYXNlIFVSTExvYWRlckRhdGFGb3JtYXQuQVJSQVlfQlVGRkVSOlxuXHRcdFx0Y2FzZSBVUkxMb2FkZXJEYXRhRm9ybWF0LkJMT0I6XG5cdFx0XHRjYXNlIFVSTExvYWRlckRhdGFGb3JtYXQuVEVYVDpcblx0XHRcdFx0eGhyLnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcblx0XHRcdFx0YnJlYWs7XG5cblx0XHRcdGNhc2UgVVJMTG9hZGVyRGF0YUZvcm1hdC5WQVJJQUJMRVM6XG5cdFx0XHRcdHhoci5yZXNwb25zZVR5cGUgPSBVUkxMb2FkZXJEYXRhRm9ybWF0LlRFWFQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFVSTExvYWRlckRhdGFGb3JtYXQuQklOQVJZOlxuXHRcdFx0XHR4aHIucmVzcG9uc2VUeXBlID0gJyc7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRkZWZhdWx0OlxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gcmVxdWVzdCB7VVJMUmVxdWVzdH1cblx0ICovXG5cdHByaXZhdGUgZ2V0UmVxdWVzdChyZXF1ZXN0OlVSTFJlcXVlc3QpOnZvaWRcblx0e1xuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLl9YSFIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwsIHJlcXVlc3QuYXN5bmMpO1xuXHRcdFx0dGhpcy5zZXRSZXNwb25zZVR5cGUodGhpcy5fWEhSLCB0aGlzLl9kYXRhRm9ybWF0KTtcblx0XHRcdHRoaXMuX1hIUi5zZW5kKCk7IC8vIE5vIGRhdGEgdG8gc2VuZFxuXHRcdH0gY2F0Y2ggKGUgLyogPFhNTEh0dHBSZXF1ZXN0RXhjZXB0aW9uPiAqLykge1xuXHRcdFx0dGhpcy5oYW5kbGVYbWxIdHRwUmVxdWVzdEV4Y2VwdGlvbihlKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHJlcXVlc3Qge1VSTFJlcXVlc3R9XG5cdCAqL1xuXHRwcml2YXRlIHBvc3RSZXF1ZXN0KHJlcXVlc3Q6VVJMUmVxdWVzdCk6dm9pZFxuXHR7XG5cdFx0dGhpcy5fbG9hZEVycm9yID0gZmFsc2U7XG5cblx0XHR0aGlzLl9YSFIub3BlbihyZXF1ZXN0Lm1ldGhvZCwgcmVxdWVzdC51cmwsIHJlcXVlc3QuYXN5bmMpO1xuXG5cdFx0aWYgKHJlcXVlc3QuZGF0YSAhPSBudWxsKSB7XG5cdFx0XHRpZiAocmVxdWVzdC5kYXRhIGluc3RhbmNlb2YgVVJMVmFyaWFibGVzKSB7XG5cdFx0XHRcdHZhciB1cmxWYXJzOlVSTFZhcmlhYmxlcyA9IDxVUkxWYXJpYWJsZXM+IHJlcXVlc3QuZGF0YTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdHRoaXMuX1hIUi5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG5cdFx0XHRcdFx0dGhpcy5fWEhSLnNlbmQodXJsVmFycy5mb3JtRGF0YSk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUgLyogPFhNTEh0dHBSZXF1ZXN0RXhjZXB0aW9uPiAqLykge1xuXHRcdFx0XHRcdHRoaXMuaGFuZGxlWG1sSHR0cFJlcXVlc3RFeGNlcHRpb24oZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuc2V0UmVzcG9uc2VUeXBlKHRoaXMuX1hIUiwgdGhpcy5fZGF0YUZvcm1hdCk7XG5cblx0XHRcdFx0aWYgKHJlcXVlc3QuZGF0YSlcblx0XHRcdFx0XHR0aGlzLl9YSFIuc2VuZChyZXF1ZXN0LmRhdGEpOyAvLyBUT0RPOiBUZXN0XG5cdFx0XHRcdGVsc2Vcblx0XHRcdFx0XHR0aGlzLl9YSFIuc2VuZCgpOyAvLyBubyBkYXRhIHRvIHNlbmRcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fWEhSLnNlbmQoKTsgLy8gTm8gZGF0YSB0byBzZW5kXG5cdFx0fVxuXG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGVycm9yIHtYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvbn1cblx0ICovXG5cdHByaXZhdGUgaGFuZGxlWG1sSHR0cFJlcXVlc3RFeGNlcHRpb24oZXJyb3I6YW55IC8qIDxYTUxIdHRwUmVxdWVzdEV4Y2VwdGlvbj4gKi8pOnZvaWRcblx0e1xuXHRcdHN3aXRjaCAoZXJyb3IuY29kZSkge1xuXG5cdFx0LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXHRcdCAqXG5cdFx0ICogIFhNTEh0dHBSZXF1ZXN0RXhjZXB0aW9uIHsgbWVzc2FnZTogXCJORVRXT1JLX0VSUjogWE1MSHR0cFJlcXVlc3QgRXhjZXB0aW9uIDEwMVwiLCBuYW1lOiBcIk5FVFdPUktfRVJSXCIsIGNvZGU6IDEwMSwgc3RhY2s6IFwiRXJyb3I6IEEgbmV0d29yayBlcnJvciBvY2N1cnJlZCBpbiBzeW5jaHJvbm91cyByZXHigKZcIixORVRXT1JLX0VSUjogMTAx4oCmIH1cblx0XHQgKiAgY29kZTogMTAxICwgbWVzc2FnZTogXCJORVRXT1JLX0VSUjogWE1MSHR0cFJlcXVlc3QgRXhjZXB0aW9uIDEwMVwiICwgIG5hbWU6IFwiTkVUV09SS19FUlJcIlxuXHRcdCAqXG5cdFx0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuXHRcdFx0Y2FzZSAxMDE6XG5cdFx0XHRcdC8vIE5vdGU6IG9uTG9hZEVycm9yIGV2ZW50IHRocm93cyBJT19FUlJPUiBldmVudCAtIHRoaXMgY2FzZSBpcyBhbHJlYWR5IENvdmVyZWRcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIGluaXRYSFIoKVxuXHR7XG5cdFx0aWYgKCF0aGlzLl9YSFIpIHtcblx0XHRcdHRoaXMuX1hIUiA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuXG5cdFx0XHR0aGlzLl9YSFIub25sb2Fkc3RhcnQgPSAoZXZlbnQ6UHJvZ3Jlc3NFdmVudCkgPT4gdGhpcy5vbkxvYWRTdGFydChldmVudCk7ICAgICAgICAgICAgICAgICAvLyBsb2Fkc3RhcnRcdCAgICAgICAgLSBXaGVuIHRoZSByZXF1ZXN0IHN0YXJ0cy5cblx0XHRcdHRoaXMuX1hIUi5vbnByb2dyZXNzID0gKGV2ZW50OlByb2dyZXNzRXZlbnQpID0+IHRoaXMub25Qcm9ncmVzcyhldmVudCk7XHQgICAgICAgICAgICAgICAgLy8gcHJvZ3Jlc3NcdCAgICAgICAgICAgIC0gV2hpbGUgbG9hZGluZyBhbmQgc2VuZGluZyBkYXRhLlxuXHRcdFx0dGhpcy5fWEhSLm9uYWJvcnQgPSAoZXZlbnQ6VUlFdmVudCkgPT4gdGhpcy5vbkFib3J0KGV2ZW50KTtcdCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3J0XHQgICAgICAgICAgICAtIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCwgZWl0aGVyIGJ5IGludm9raW5nIHRoZSBhYm9ydCgpIG1ldGhvZCBvciBuYXZpZ2F0aW5nIGF3YXkgZnJvbSB0aGUgcGFnZS5cblx0XHRcdHRoaXMuX1hIUi5vbmVycm9yID0gKGV2ZW50OkVycm9yRXZlbnQpID0+IHRoaXMub25Mb2FkRXJyb3IoZXZlbnQpOyAgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yXHQgICAgICAgICAgICAtIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGZhaWxlZC5cblx0XHRcdHRoaXMuX1hIUi5vbmxvYWQgPSAoZXZlbnQ6RXZlbnQpID0+IHRoaXMub25Mb2FkQ29tcGxldGUoZXZlbnQpOyAgICAgICAgICAgICAgICAgICAvLyBsb2FkXHQgICAgICAgICAgICAgICAgLSBXaGVuIHRoZSByZXF1ZXN0IGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLlxuXHRcdFx0dGhpcy5fWEhSLm9udGltZW91dCA9IChldmVudDpFdmVudCkgPT4gdGhpcy5vblRpbWVPdXQoZXZlbnQpOyAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVvdXRcdCAgICAgICAgICAgIC0gV2hlbiB0aGUgYXV0aG9yIHNwZWNpZmllZCB0aW1lb3V0IGhhcyBwYXNzZWQgYmVmb3JlIHRoZSByZXF1ZXN0IGNvdWxkIGNvbXBsZXRlLlxuXHRcdFx0dGhpcy5fWEhSLm9ubG9hZGVuZCA9IChldmVudDpQcm9ncmVzc0V2ZW50KSA9PiB0aGlzLm9uTG9hZEVuZChldmVudCk7ICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZGVuZFx0ICAgICAgICAgICAgLSBXaGVuIHRoZSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgaXQgd2FzIHN1Y2Nlc3NmdWwuXG5cdFx0XHR0aGlzLl9YSFIub25yZWFkeXN0YXRlY2hhbmdlID0gKGV2ZW50OkV2ZW50KSA9PiB0aGlzLm9uUmVhZHlTdGF0ZUNoYW5nZShldmVudCk7ICAgLy8gb25yZWFkeXN0YXRlY2hhbmdlICAgLSBXaGVuIFhIUiBzdGF0ZSBjaGFuZ2VzXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwcml2YXRlIGRpc3Bvc2VYSFIoKVxuXHR7XG5cdFx0aWYgKHRoaXMuX1hIUiAhPT0gbnVsbCkge1xuXHRcdFx0dGhpcy5fWEhSLm9ubG9hZHN0YXJ0ID0gbnVsbDtcblx0XHRcdHRoaXMuX1hIUi5vbnByb2dyZXNzID0gbnVsbDtcblx0XHRcdHRoaXMuX1hIUi5vbmFib3J0ID0gbnVsbDtcblx0XHRcdHRoaXMuX1hIUi5vbmVycm9yID0gbnVsbDtcblx0XHRcdHRoaXMuX1hIUi5vbmxvYWQgPSBudWxsO1xuXHRcdFx0dGhpcy5fWEhSLm9udGltZW91dCA9IG51bGw7XG5cdFx0XHR0aGlzLl9YSFIub25sb2FkZW5kID0gbnVsbDtcblx0XHRcdHRoaXMuX1hIUiA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2Vcblx0ICovXG5cdHB1YmxpYyBkZWNvZGVVUkxWYXJpYWJsZXMoc291cmNlOnN0cmluZyk6T2JqZWN0XG5cdHtcblx0XHR2YXIgcmVzdWx0Ok9iamVjdCA9IG5ldyBPYmplY3QoKTtcblxuXHRcdHNvdXJjZSA9IHNvdXJjZS5zcGxpdChcIitcIikuam9pbihcIiBcIik7XG5cblx0XHR2YXIgdG9rZW5zLCByZSA9IC9bPyZdPyhbXj1dKyk9KFteJl0qKS9nO1xuXG5cdFx0d2hpbGUgKHRva2VucyA9IHJlLmV4ZWMoc291cmNlKSlcblx0XHRcdHJlc3VsdFtkZWNvZGVVUklDb21wb25lbnQodG9rZW5zWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQodG9rZW5zWzJdKTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLyBYTUxIdHRwUmVxdWVzdCAtIEV2ZW50IEhhbmRsZXJzXG5cblx0LyoqXG5cdCAqIFdoZW4gWEhSIHN0YXRlIGNoYW5nZXNcblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRwcml2YXRlIG9uUmVhZHlTdGF0ZUNoYW5nZShldmVudDpFdmVudClcblx0e1xuXHRcdGlmICh0aGlzLl9YSFIucmVhZHlTdGF0ZSA9PSA0KSB7XG5cdFx0XHRpZiAodGhpcy5fWEhSLnN0YXR1cyA9PSA0MDQpIHtcblx0XHRcdFx0dGhpcy5fbG9hZEVycm9yID0gdHJ1ZTtcblxuXHRcdFx0XHRpZiAoIXRoaXMuX2xvYWRFcnJvckV2ZW50KVxuXHRcdFx0XHRcdHRoaXMuX2xvYWRFcnJvckV2ZW50ID0gbmV3IElPRXJyb3JFdmVudChJT0Vycm9yRXZlbnQuSU9fRVJST1IpO1xuXG5cdFx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9sb2FkRXJyb3JFdmVudCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgSFRUUFN0YXR1c0V2ZW50KEhUVFBTdGF0dXNFdmVudC5IVFRQX1NUQVRVUywgdGhpcy5fWEhSLnN0YXR1cykpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBjb21wbGV0ZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgaXQgd2FzIHN1Y2Nlc3NmdWwuXG5cdCAqIEBwYXJhbSBldmVudFxuXHQgKi9cblx0cHJpdmF0ZSBvbkxvYWRFbmQoZXZlbnQ6UHJvZ3Jlc3NFdmVudClcblx0e1xuXHRcdGlmICh0aGlzLl9sb2FkRXJyb3IgPT09IHRydWUpXG5cdFx0XHRyZXR1cm47XG5cdH1cblxuXHQvKipcblx0ICogV2hlbiB0aGUgYXV0aG9yIHNwZWNpZmllZCB0aW1lb3V0IGhhcyBwYXNzZWQgYmVmb3JlIHRoZSByZXF1ZXN0IGNvdWxkIGNvbXBsZXRlLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdHByaXZhdGUgb25UaW1lT3V0KGV2ZW50OkV2ZW50KVxuXHR7XG5cdFx0Ly9UT0RPOiBUaW1lb3V0IG5vdCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgKCBhbHNvIG5vdCBwYXJ0IG9mIEFTMyBBUEkgKVxuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gYWJvcnRlZCwgZWl0aGVyIGJ5IGludm9raW5nIHRoZSBhYm9ydCgpIG1ldGhvZCBvciBuYXZpZ2F0aW5nIGF3YXkgZnJvbSB0aGUgcGFnZS5cblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRwcml2YXRlIG9uQWJvcnQoZXZlbnQ6VUlFdmVudClcblx0e1xuXHRcdC8vIFRPRE86IGludmVzdGlnYXRlIHdoZXRoZXIgdGhpcyBuZWVkcyB0byBiZSBhbiBJT0Vycm9yXG5cdH1cblxuXHQvKipcblx0ICogV2hpbGUgbG9hZGluZyBhbmQgc2VuZGluZyBkYXRhLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdHByaXZhdGUgb25Qcm9ncmVzcyhldmVudDpQcm9ncmVzc0V2ZW50KVxuXHR7XG5cdFx0aWYgKCF0aGlzLl9wcm9ncmVzc0V2ZW50KVxuXHRcdFx0dGhpcy5fcHJvZ3Jlc3NFdmVudCA9IG5ldyBBd2F5UHJvZ3Jlc3NFdmVudChBd2F5UHJvZ3Jlc3NFdmVudC5QUk9HUkVTUyk7XG5cblx0XHR0aGlzLl9wcm9ncmVzc0V2ZW50LmJ5dGVzVG90YWwgPSBldmVudC50b3RhbDtcblx0XHR0aGlzLl9wcm9ncmVzc0V2ZW50LmJ5dGVzTG9hZGVkID0gZXZlbnQubG9hZGVkO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX3Byb2dyZXNzRXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZW4gdGhlIHJlcXVlc3Qgc3RhcnRzLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdHByaXZhdGUgb25Mb2FkU3RhcnQoZXZlbnQ6UHJvZ3Jlc3NFdmVudClcblx0e1xuXHRcdGlmICghdGhpcy5fbG9hZFN0YXJ0RXZlbnQpXG5cdFx0XHR0aGlzLl9sb2FkU3RhcnRFdmVudCA9IG5ldyBBd2F5RXZlbnQoQXdheUV2ZW50Lk9QRU4pO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX2xvYWRTdGFydEV2ZW50KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBXaGVuIHRoZSByZXF1ZXN0IGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdHByaXZhdGUgb25Mb2FkQ29tcGxldGUoZXZlbnQ6RXZlbnQpXG5cdHtcblx0XHRpZiAodGhpcy5fbG9hZEVycm9yID09PSB0cnVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0c3dpdGNoICh0aGlzLl9kYXRhRm9ybWF0KSB7XG5cdFx0XHRjYXNlIFVSTExvYWRlckRhdGFGb3JtYXQuVEVYVDpcblx0XHRcdFx0dGhpcy5fZGF0YSA9IHRoaXMuX1hIUi5yZXNwb25zZVRleHQ7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFVSTExvYWRlckRhdGFGb3JtYXQuVkFSSUFCTEVTOlxuXHRcdFx0XHR0aGlzLl9kYXRhID0gdGhpcy5kZWNvZGVVUkxWYXJpYWJsZXModGhpcy5fWEhSLnJlc3BvbnNlVGV4dCk7XG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0XHRjYXNlIFVSTExvYWRlckRhdGFGb3JtYXQuQkxPQjpcblx0XHRcdGNhc2UgVVJMTG9hZGVyRGF0YUZvcm1hdC5BUlJBWV9CVUZGRVI6XG5cdFx0XHRjYXNlIFVSTExvYWRlckRhdGFGb3JtYXQuQklOQVJZOlxuXHRcdFx0XHR0aGlzLl9kYXRhID0gdGhpcy5fWEhSLnJlc3BvbnNlO1xuXHRcdFx0XHRicmVhaztcblxuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0dGhpcy5fZGF0YSA9IHRoaXMuX1hIUi5yZXNwb25zZVRleHQ7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblxuXHRcdGlmICghdGhpcy5fbG9hZENvbXBsZXRlRXZlbnQpXG5cdFx0XHR0aGlzLl9sb2FkQ29tcGxldGVFdmVudCA9IG5ldyBBd2F5RXZlbnQoQXdheUV2ZW50LkNPTVBMRVRFKTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudCh0aGlzLl9sb2FkQ29tcGxldGVFdmVudCk7XG5cdH1cblxuXHQvKipcblx0ICogV2hlbiB0aGUgcmVxdWVzdCBoYXMgZmFpbGVkLiAoIGR1ZSB0byBuZXR3b3JrIGlzc3VlcyApLlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdHByaXZhdGUgb25Mb2FkRXJyb3IoZXZlbnQ6RXZlbnQpXG5cdHtcblx0XHR0aGlzLl9sb2FkRXJyb3IgPSB0cnVlO1xuXG5cdFx0aWYgKCF0aGlzLl9sb2FkRXJyb3JFdmVudClcblx0XHRcdHRoaXMuX2xvYWRFcnJvckV2ZW50ID0gbmV3IElPRXJyb3JFdmVudChJT0Vycm9yRXZlbnQuSU9fRVJST1IpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX2xvYWRFcnJvckV2ZW50KTtcblx0fVxufVxuXG5leHBvcnQgPSBVUkxMb2FkZXI7Il19 \ No newline at end of file diff --git a/lib/core/net/URLLoader.ts b/lib/core/net/URLLoader.ts new file mode 100644 index 00000000..fd7de366 --- /dev/null +++ b/lib/core/net/URLLoader.ts @@ -0,0 +1,418 @@ +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import URLRequestMethod = require("awayjs-core/lib/core/net/URLRequestMethod"); +import URLVariables = require("awayjs-core/lib/core/net/URLVariables"); +import AwayEvent = require("awayjs-core/lib/events/Event"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import HTTPStatusEvent = require("awayjs-core/lib/events/HTTPStatusEvent"); +import IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +import AwayProgressEvent = require("awayjs-core/lib/events/ProgressEvent"); + +/** + * The URLLoader is used to load a single file, as part of a resource. + * + * While URLLoader can be used directly, e.g. to create a third-party asset + * management system, it's recommended to use any of the classes Loader3D, AssetLoader + * and AssetLibrary instead in most cases. + * + * @see AssetLoader + * @see away.library.AssetLibrary + */ +class URLLoader extends EventDispatcher +{ + private _XHR:XMLHttpRequest; + private _bytesLoaded:number = 0; + private _bytesTotal:number = 0; + private _dataFormat:string = URLLoaderDataFormat.TEXT; + private _loadError:boolean = false; + + private _request:URLRequest; + private _data:any; + + private _loadStartEvent:AwayEvent; + private _loadErrorEvent:IOErrorEvent; + private _loadCompleteEvent:AwayEvent; + private _progressEvent:AwayProgressEvent; + + /** + * Creates a new URLLoader object. + */ + constructor() + { + super(); + } + + /** + * + */ + public get url():string + { + + return this._request? this._request.url : ''; + } + + /** + * + */ + public get data():any + { + return this._data; + } + + + /** + * + * URLLoaderDataFormat.BINARY + * URLLoaderDataFormat.TEXT + * URLLoaderDataFormat.VARIABLES + * + * @param format + */ + public set dataFormat(format:string) + { + this._dataFormat = format; + } + + public get dataFormat():string + { + return this._dataFormat; + } + + /** + * + * @returns {number} + */ + public get bytesLoaded():number + { + return this._bytesLoaded; + } + + /** + * + * @returns {number} + */ + public get bytesTotal():number + { + return this._bytesTotal; + } + + /** + * Load a resource from a file. + * + * @param request The URLRequest object containing the URL of the object to be loaded. + */ + public load(request:URLRequest):void + { + this._request = request; + + this.initXHR(); + + if (request.method === URLRequestMethod.POST) + this.postRequest(request); + else + this.getRequest(request); + } + + /** + * + */ + public close():void + { + this._XHR.abort(); + this.disposeXHR(); + } + + /** + * + */ + public dispose():void + { + if (this._XHR) + this._XHR.abort(); + + this.disposeXHR(); + + this._data = null; + this._dataFormat = null; + this._bytesLoaded = null; + this._bytesTotal = null; + } + + /** + * + * @param xhr + * @param responseType + */ + private setResponseType(xhr:XMLHttpRequest, responseType:string):void + { + switch (responseType) { + case URLLoaderDataFormat.ARRAY_BUFFER: + case URLLoaderDataFormat.BLOB: + case URLLoaderDataFormat.TEXT: + xhr.responseType = responseType; + break; + + case URLLoaderDataFormat.VARIABLES: + xhr.responseType = URLLoaderDataFormat.TEXT; + break; + + case URLLoaderDataFormat.BINARY: + xhr.responseType = ''; + break; + + default: + } + } + + /** + * + * @param request {URLRequest} + */ + private getRequest(request:URLRequest):void + { + try { + this._XHR.open(request.method, request.url, request.async); + this.setResponseType(this._XHR, this._dataFormat); + this._XHR.send(); // No data to send + } catch (e /* */) { + this.handleXmlHttpRequestException(e); + } + } + + /** + * + * @param request {URLRequest} + */ + private postRequest(request:URLRequest):void + { + this._loadError = false; + + this._XHR.open(request.method, request.url, request.async); + + if (request.data != null) { + if (request.data instanceof URLVariables) { + var urlVars:URLVariables = request.data; + + try { + this._XHR.responseType = 'text'; + this._XHR.send(urlVars.formData); + } catch (e /* */) { + this.handleXmlHttpRequestException(e); + } + } else { + this.setResponseType(this._XHR, this._dataFormat); + + if (request.data) + this._XHR.send(request.data); // TODO: Test + else + this._XHR.send(); // no data to send + } + } else { + this._XHR.send(); // No data to send + } + + } + + /** + * + * @param error {XMLHttpRequestException} + */ + private handleXmlHttpRequestException(error:any /* */):void + { + switch (error.code) { + + /****************************************************************************************************************************************************************************************************** + * + * XMLHttpRequestException { message: "NETWORK_ERR: XMLHttpRequest Exception 101", name: "NETWORK_ERR", code: 101, stack: "Error: A network error occurred in synchronous req…",NETWORK_ERR: 101… } + * code: 101 , message: "NETWORK_ERR: XMLHttpRequest Exception 101" , name: "NETWORK_ERR" + * + ******************************************************************************************************************************************************************************************************/ + + case 101: + // Note: onLoadError event throws IO_ERROR event - this case is already Covered + break; + } + } + + /** + * + */ + private initXHR() + { + if (!this._XHR) { + this._XHR = new XMLHttpRequest(); + + this._XHR.onloadstart = (event:ProgressEvent) => this.onLoadStart(event); // loadstart - When the request starts. + this._XHR.onprogress = (event:ProgressEvent) => this.onProgress(event); // progress - While loading and sending data. + this._XHR.onabort = (event:UIEvent) => this.onAbort(event); // abort - When the request has been aborted, either by invoking the abort() method or navigating away from the page. + this._XHR.onerror = (event:ErrorEvent) => this.onLoadError(event); // error - When the request has failed. + this._XHR.onload = (event:Event) => this.onLoadComplete(event); // load - When the request has successfully completed. + this._XHR.ontimeout = (event:Event) => this.onTimeOut(event); // timeout - When the author specified timeout has passed before the request could complete. + this._XHR.onloadend = (event:ProgressEvent) => this.onLoadEnd(event); // loadend - When the request has completed, regardless of whether or not it was successful. + this._XHR.onreadystatechange = (event:Event) => this.onReadyStateChange(event); // onreadystatechange - When XHR state changes + } + } + + /** + * + */ + private disposeXHR() + { + if (this._XHR !== null) { + this._XHR.onloadstart = null; + this._XHR.onprogress = null; + this._XHR.onabort = null; + this._XHR.onerror = null; + this._XHR.onload = null; + this._XHR.ontimeout = null; + this._XHR.onloadend = null; + this._XHR = null; + } + } + + /** + * + * @param source + */ + public decodeURLVariables(source:string):Object + { + var result:Object = new Object(); + + source = source.split("+").join(" "); + + var tokens, re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(source)) + result[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + + return result; + } + + // XMLHttpRequest - Event Handlers + + /** + * When XHR state changes + * @param event + */ + private onReadyStateChange(event:Event) + { + if (this._XHR.readyState == 4) { + if (this._XHR.status == 404) { + this._loadError = true; + + if (!this._loadErrorEvent) + this._loadErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR); + + this.dispatchEvent(this._loadErrorEvent); + } + + this.dispatchEvent(new HTTPStatusEvent(HTTPStatusEvent.HTTP_STATUS, this._XHR.status)); + } + } + + /** + * When the request has completed, regardless of whether or not it was successful. + * @param event + */ + private onLoadEnd(event:ProgressEvent) + { + if (this._loadError === true) + return; + } + + /** + * When the author specified timeout has passed before the request could complete. + * @param event + */ + private onTimeOut(event:Event) + { + //TODO: Timeout not currently implemented ( also not part of AS3 API ) + } + + /** + * When the request has been aborted, either by invoking the abort() method or navigating away from the page. + * @param event + */ + private onAbort(event:UIEvent) + { + // TODO: investigate whether this needs to be an IOError + } + + /** + * While loading and sending data. + * @param event + */ + private onProgress(event:ProgressEvent) + { + if (!this._progressEvent) + this._progressEvent = new AwayProgressEvent(AwayProgressEvent.PROGRESS); + + this._progressEvent.bytesTotal = event.total; + this._progressEvent.bytesLoaded = event.loaded; + + this.dispatchEvent(this._progressEvent); + } + + /** + * When the request starts. + * @param event + */ + private onLoadStart(event:ProgressEvent) + { + if (!this._loadStartEvent) + this._loadStartEvent = new AwayEvent(AwayEvent.OPEN); + + this.dispatchEvent(this._loadStartEvent); + } + + /** + * When the request has successfully completed. + * @param event + */ + private onLoadComplete(event:Event) + { + if (this._loadError === true) + return; + + switch (this._dataFormat) { + case URLLoaderDataFormat.TEXT: + this._data = this._XHR.responseText; + break; + + case URLLoaderDataFormat.VARIABLES: + this._data = this.decodeURLVariables(this._XHR.responseText); + break; + + case URLLoaderDataFormat.BLOB: + case URLLoaderDataFormat.ARRAY_BUFFER: + case URLLoaderDataFormat.BINARY: + this._data = this._XHR.response; + break; + + default: + this._data = this._XHR.responseText; + break; + } + + if (!this._loadCompleteEvent) + this._loadCompleteEvent = new AwayEvent(AwayEvent.COMPLETE); + + this.dispatchEvent(this._loadCompleteEvent); + } + + /** + * When the request has failed. ( due to network issues ). + * @param event + */ + private onLoadError(event:Event) + { + this._loadError = true; + + if (!this._loadErrorEvent) + this._loadErrorEvent = new IOErrorEvent(IOErrorEvent.IO_ERROR); + + this.dispatchEvent(this._loadErrorEvent); + } +} + +export = URLLoader; \ No newline at end of file diff --git a/lib/core/net/URLLoaderDataFormat.js b/lib/core/net/URLLoaderDataFormat.js new file mode 100755 index 00000000..1e8735c2 --- /dev/null +++ b/lib/core/net/URLLoaderDataFormat.js @@ -0,0 +1,18 @@ +var URLLoaderDataFormat = (function () { + function URLLoaderDataFormat() { + } + URLLoaderDataFormat.TEXT = "text"; + + URLLoaderDataFormat.VARIABLES = "variables"; + + URLLoaderDataFormat.BLOB = "blob"; + + URLLoaderDataFormat.ARRAY_BUFFER = "arraybuffer"; + + URLLoaderDataFormat.BINARY = "binary"; + return URLLoaderDataFormat; +})(); + +module.exports = URLLoaderDataFormat; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbmV0L1VSTExvYWRlckRhdGFGb3JtYXQudHMiXSwibmFtZXMiOlsiVVJMTG9hZGVyRGF0YUZvcm1hdCIsIlVSTExvYWRlckRhdGFGb3JtYXQuY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBO0lBQUFBO0lBK0JBQyxDQUFDQTtBQUFBRCxJQXpCQUEsMkJBQTRCQSxNQUFNQTs7SUFNbENBLGdDQUFpQ0EsV0FBV0E7O0lBTTVDQSwyQkFBNEJBLE1BQU1BOztJQU1sQ0EsbUNBQW9DQSxhQUFhQTs7SUFNakRBLDZCQUE4QkEsUUFBUUE7SUFDdkNBLDJCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELG9DQUE2QixDQUFBIiwiZmlsZSI6ImNvcmUvbmV0L1VSTExvYWRlckRhdGFGb3JtYXQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBVUkxMb2FkZXJEYXRhRm9ybWF0XG57XG5cdC8qKlxuXHQgKiBURVhUXG5cdCAqIEB0eXBlIHtzdHJpbmd9XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFRFWFQ6c3RyaW5nID0gXCJ0ZXh0XCI7XG5cblx0LyoqXG5cdCAqIFZhcmlhYmxlcyAvIFZhbHVlIFBhaXJzXG5cdCAqIEB0eXBlIHtzdHJpbmd9XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFZBUklBQkxFUzpzdHJpbmcgPSBcInZhcmlhYmxlc1wiO1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAdHlwZSB7c3RyaW5nfVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBCTE9COnN0cmluZyA9IFwiYmxvYlwiO1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAdHlwZSB7c3RyaW5nfVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBBUlJBWV9CVUZGRVI6c3RyaW5nID0gXCJhcnJheWJ1ZmZlclwiO1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAdHlwZSB7c3RyaW5nfVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBCSU5BUlk6c3RyaW5nID0gXCJiaW5hcnlcIjtcbn1cblxuZXhwb3J0ID0gVVJMTG9hZGVyRGF0YUZvcm1hdDsiXX0= \ No newline at end of file diff --git a/lib/core/net/URLLoaderDataFormat.ts b/lib/core/net/URLLoaderDataFormat.ts new file mode 100644 index 00000000..63bc29d4 --- /dev/null +++ b/lib/core/net/URLLoaderDataFormat.ts @@ -0,0 +1,34 @@ +class URLLoaderDataFormat +{ + /** + * TEXT + * @type {string} + */ + public static TEXT:string = "text"; + + /** + * Variables / Value Pairs + * @type {string} + */ + public static VARIABLES:string = "variables"; + + /** + * + * @type {string} + */ + public static BLOB:string = "blob"; + + /** + * + * @type {string} + */ + public static ARRAY_BUFFER:string = "arraybuffer"; + + /** + * + * @type {string} + */ + public static BINARY:string = "binary"; +} + +export = URLLoaderDataFormat; \ No newline at end of file diff --git a/lib/core/net/URLRequest.js b/lib/core/net/URLRequest.js new file mode 100755 index 00000000..66e5d4a6 --- /dev/null +++ b/lib/core/net/URLRequest.js @@ -0,0 +1,57 @@ +var URLRequestMethod = require("awayjs-core/lib/core/net/URLRequestMethod"); + +var URLRequest = (function () { + /** + + * @param url + */ + function URLRequest(url) { + if (typeof url === "undefined") { url = null; } + /** + * + * away.net.URLRequestMethod.GET + * away.net.URLRequestMethod.POST + * + * @type {string} + */ + this.method = URLRequestMethod.GET; + /** + * Use asynchronous XMLHttpRequest + * @type {boolean} + */ + this.async = true; + this._url = url; + } + Object.defineProperty(URLRequest.prototype, "url", { + /** + * + * @returns {string} + */ + get: function () { + return this._url; + }, + /** + * + * @param value + */ + set: function (value) { + this._url = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * dispose + */ + URLRequest.prototype.dispose = function () { + this.data = null; + this._url = null; + }; + return URLRequest; +})(); + +module.exports = URLRequest; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbmV0L1VSTFJlcXVlc3QudHMiXSwibmFtZXMiOlsiVVJMUmVxdWVzdCIsIlVSTFJlcXVlc3QuY29uc3RydWN0b3IiLCJVUkxSZXF1ZXN0LmRpc3Bvc2UiXSwibWFwcGluZ3MiOiJBQUFBLDJFQUFrRjs7QUFFbEY7SUFzQ0NBOzs7TUFER0E7SUFDSEEsb0JBQVlBLEdBQWlCQTtRQUFqQkMsa0NBQUFBLEdBQUdBLEdBQVVBLElBQUlBO0FBQUFBLFFBeEI3QkE7Ozs7OztVQU1HQTtRQUNIQSxLQUFPQSxNQUFNQSxHQUFVQSxnQkFBZ0JBLENBQUNBLEdBQUdBLENBQUNBO1FBRTVDQTs7O1VBR0dBO1FBQ0hBLEtBQU9BLEtBQUtBLEdBQVdBLElBQUlBLENBQUNBO1FBYTNCQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxHQUFHQTtJQUNoQkEsQ0FBQ0E7SUFNREQ7UUFBQUE7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxJQUFJQTtRQUNqQkEsQ0FBQ0E7UUFNREE7OztVQURHQTthQUNIQSxVQUFlQSxLQUFZQTtZQUUxQkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsS0FBS0E7UUFDbEJBLENBQUNBOzs7O0FBVEFBOztJQWNEQTs7TUFER0E7bUNBQ0hBO1FBRUNFLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBO1FBQ2hCQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQTtJQUNqQkEsQ0FBQ0E7SUFDRkYsa0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsMkJBQW9CLENBQUEiLCJmaWxlIjoiY29yZS9uZXQvVVJMUmVxdWVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVUkxSZXF1ZXN0TWV0aG9kXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMUmVxdWVzdE1ldGhvZFwiKTtcblxuY2xhc3MgVVJMUmVxdWVzdFxue1xuXHQvKlxuXHQgKiBUaGUgTUlNRSBjb250ZW50IHR5cGUgb2YgdGhlIGNvbnRlbnQgaW4gdGhlIHRoZSBkYXRhIHByb3BlcnR5LlxuXHQgKiBAdHlwZSB7c3RyaW5nfVxuXHQgKi9cblx0Ly9wdWJsaWMgY29udGVudFR5cGUgICAgICA6IHN0cmluZyA9ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOyAvL05vdGU6IE5vdCB1c2VkIGZvciBub3cuXG5cblx0LyoqXG5cdCAqIE9iamVjdCBjb250YWluaW5nIGRhdGEgdG8gYmUgdHJhbnNtaXRlZCB3aXRoIFVSTCBSZXF1ZXN0ICggVVJMIFZhcmlhYmxlcyAvIGJpbmFyeSAvIHN0cmluZyApXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZGF0YTphbnk7XG5cblx0LyoqXG5cdCAqXG5cdCAqIGF3YXkubmV0LlVSTFJlcXVlc3RNZXRob2QuR0VUXG5cdCAqIGF3YXkubmV0LlVSTFJlcXVlc3RNZXRob2QuUE9TVFxuXHQgKlxuXHQgKiBAdHlwZSB7c3RyaW5nfVxuXHQgKi9cblx0cHVibGljIG1ldGhvZDpzdHJpbmcgPSBVUkxSZXF1ZXN0TWV0aG9kLkdFVDtcblxuXHQvKipcblx0ICogVXNlIGFzeW5jaHJvbm91cyBYTUxIdHRwUmVxdWVzdFxuXHQgKiBAdHlwZSB7Ym9vbGVhbn1cblx0ICovXG5cdHB1YmxpYyBhc3luYzpib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHByaXZhdGUgX3VybDpzdHJpbmc7XG5cblx0LyoqXG5cblx0ICogQHBhcmFtIHVybFxuXHQgKi9cblx0Y29uc3RydWN0b3IodXJsOnN0cmluZyA9IG51bGwpXG5cdHtcblx0XHR0aGlzLl91cmwgPSB1cmw7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdHB1YmxpYyBnZXQgdXJsKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdXJsO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKi9cblx0cHVibGljIHNldCB1cmwodmFsdWU6c3RyaW5nKVxuXHR7XG5cdFx0dGhpcy5fdXJsID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogZGlzcG9zZVxuXHQgKi9cblx0cHVibGljIGRpc3Bvc2UoKTp2b2lkXG5cdHtcblx0XHR0aGlzLmRhdGEgPSBudWxsO1xuXHRcdHRoaXMuX3VybCA9IG51bGw7XG5cdH1cbn1cblxuZXhwb3J0ID0gVVJMUmVxdWVzdDsiXX0= \ No newline at end of file diff --git a/lib/core/net/URLRequest.ts b/lib/core/net/URLRequest.ts new file mode 100644 index 00000000..7c7f400a --- /dev/null +++ b/lib/core/net/URLRequest.ts @@ -0,0 +1,74 @@ +import URLRequestMethod = require("awayjs-core/lib/core/net/URLRequestMethod"); + +class URLRequest +{ + /* + * The MIME content type of the content in the the data property. + * @type {string} + */ + //public contentType : string = 'application/x-www-form-urlencoded'; //Note: Not used for now. + + /** + * Object containing data to be transmited with URL Request ( URL Variables / binary / string ) + * + */ + public data:any; + + /** + * + * away.net.URLRequestMethod.GET + * away.net.URLRequestMethod.POST + * + * @type {string} + */ + public method:string = URLRequestMethod.GET; + + /** + * Use asynchronous XMLHttpRequest + * @type {boolean} + */ + public async:boolean = true; + + /** + * + */ + private _url:string; + + /** + + * @param url + */ + constructor(url:string = null) + { + this._url = url; + } + + /** + * + * @returns {string} + */ + public get url():string + { + return this._url; + } + + /** + * + * @param value + */ + public set url(value:string) + { + this._url = value; + } + + /** + * dispose + */ + public dispose():void + { + this.data = null; + this._url = null; + } +} + +export = URLRequest; \ No newline at end of file diff --git a/lib/core/net/URLRequestMethod.js b/lib/core/net/URLRequestMethod.js new file mode 100755 index 00000000..1aafcd03 --- /dev/null +++ b/lib/core/net/URLRequestMethod.js @@ -0,0 +1,12 @@ +var URLRequestMethod = (function () { + function URLRequestMethod() { + } + URLRequestMethod.POST = 'POST'; + + URLRequestMethod.GET = 'GET'; + return URLRequestMethod; +})(); + +module.exports = URLRequestMethod; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbmV0L1VSTFJlcXVlc3RNZXRob2QudHMiXSwibmFtZXMiOlsiVVJMUmVxdWVzdE1ldGhvZCIsIlVSTFJlcXVlc3RNZXRob2QuY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBO0lBQUFBO0lBWUFDLENBQUNBO0FBQUFELElBTkFBLHdCQUE0QkEsTUFBTUE7O0lBS2xDQSx1QkFBMkJBLEtBQUtBO0lBQ2pDQSx3QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxpQ0FBMEIsQ0FBQSIsImZpbGUiOiJjb3JlL25ldC9VUkxSZXF1ZXN0TWV0aG9kLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgVVJMUmVxdWVzdE1ldGhvZFxue1xuXHQvKipcblx0ICpcblx0ICogQHR5cGUge3N0cmluZ31cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUE9TVDpzdHJpbmcgPSAnUE9TVCc7XG5cdC8qKlxuXHQgKlxuXHQgKiBAdHlwZSB7c3RyaW5nfVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBHRVQ6c3RyaW5nID0gJ0dFVCc7XG59XG5cbmV4cG9ydCA9IFVSTFJlcXVlc3RNZXRob2Q7Il19 \ No newline at end of file diff --git a/lib/core/net/URLRequestMethod.ts b/lib/core/net/URLRequestMethod.ts new file mode 100644 index 00000000..e321c0e5 --- /dev/null +++ b/lib/core/net/URLRequestMethod.ts @@ -0,0 +1,15 @@ +class URLRequestMethod +{ + /** + * + * @type {string} + */ + public static POST:string = 'POST'; + /** + * + * @type {string} + */ + public static GET:string = 'GET'; +} + +export = URLRequestMethod; \ No newline at end of file diff --git a/lib/core/net/URLVariables.js b/lib/core/net/URLVariables.js new file mode 100755 index 00000000..bec9b1f9 --- /dev/null +++ b/lib/core/net/URLVariables.js @@ -0,0 +1,74 @@ +var URLVariables = (function () { + /** + * + * @param source + */ + function URLVariables(source) { + if (typeof source === "undefined") { source = null; } + this._variables = new Object(); + if (source !== null) + this.decode(source); + } + /** + * + * @param source + */ + URLVariables.prototype.decode = function (source) { + source = source.split("+").join(" "); + + var tokens, re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(source)) + this._variables[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + }; + + /** + * + * @returns {string} + */ + URLVariables.prototype.toString = function () { + return ''; + }; + + Object.defineProperty(URLVariables.prototype, "variables", { + /** + * + * @returns {Object} + */ + get: function () { + return this._variables; + }, + /** + * + * @returns {Object} + */ + set: function (obj) { + this._variables = obj; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(URLVariables.prototype, "formData", { + /** + * + * @returns {Object} + */ + get: function () { + var fd = new FormData(); + + for (var s in this._variables) + fd.append(s, this._variables[s]); + + return fd; + }, + enumerable: true, + configurable: true + }); + + return URLVariables; +})(); + +module.exports = URLVariables; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvbmV0L1VSTFZhcmlhYmxlcy50cyJdLCJuYW1lcyI6WyJVUkxWYXJpYWJsZXMiLCJVUkxWYXJpYWJsZXMuY29uc3RydWN0b3IiLCJVUkxWYXJpYWJsZXMuZGVjb2RlIiwiVVJMVmFyaWFibGVzLnRvU3RyaW5nIl0sIm1hcHBpbmdzIjoiQUFBQTtJQVFDQTs7O01BREdBO0lBQ0hBLHNCQUFZQSxNQUFvQkE7UUFBcEJDLHFDQUFBQSxNQUFNQSxHQUFVQSxJQUFJQTtBQUFBQSxRQU5oQ0EsS0FBUUEsVUFBVUEsR0FBVUEsSUFBSUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFReENBLElBQUlBLE1BQU1BLEtBQUtBLElBQUlBO1lBQ2xCQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtJQUN0QkEsQ0FBQ0E7SUFNREQ7OztNQURHQTtvQ0FDSEEsVUFBY0EsTUFBYUE7UUFFMUJFLE1BQU1BLEdBQUdBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBOztRQUVwQ0EsSUFBSUEsTUFBTUEsRUFBRUEsRUFBRUEsR0FBR0EsdUJBQXVCQTs7UUFFeENBLE9BQU9BLE1BQU1BLEdBQUdBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBO1lBQzlCQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxrQkFBa0JBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLGtCQUFrQkEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDakZBLENBQUNBOztJQU1ERjs7O01BREdBO3NDQUNIQTtRQUVDRyxPQUFPQSxFQUFFQTtJQUNWQSxDQUFDQTs7SUFNREg7UUFBQUE7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxVQUFVQTtRQUN2QkEsQ0FBQ0E7UUFvQkRBOzs7VUFER0E7YUFDSEEsVUFBcUJBLEdBQVVBO1lBRTlCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxHQUFHQTtRQUN0QkEsQ0FBQ0E7Ozs7QUF2QkFBO0lBTURBO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsRUFBRUEsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7O1lBRWhDQSxLQUFLQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQTtnQkFDNUJBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBOztZQUVsQ0EsT0FBT0EsRUFBRUE7UUFDVkEsQ0FBQ0E7Ozs7QUFBQUE7SUFVRkEsb0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsNkJBQXNCLENBQUEiLCJmaWxlIjoiY29yZS9uZXQvVVJMVmFyaWFibGVzLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgVVJMVmFyaWFibGVzXG57XG5cdHByaXZhdGUgX3ZhcmlhYmxlczpPYmplY3QgPSBuZXcgT2JqZWN0KCk7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBzb3VyY2Vcblx0ICovXG5cdGNvbnN0cnVjdG9yKHNvdXJjZTpzdHJpbmcgPSBudWxsKVxuXHR7XG5cdFx0aWYgKHNvdXJjZSAhPT0gbnVsbClcblx0XHRcdHRoaXMuZGVjb2RlKHNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHNvdXJjZVxuXHQgKi9cblx0cHVibGljIGRlY29kZShzb3VyY2U6c3RyaW5nKTp2b2lkXG5cdHtcblx0XHRzb3VyY2UgPSBzb3VyY2Uuc3BsaXQoXCIrXCIpLmpvaW4oXCIgXCIpO1xuXG5cdFx0dmFyIHRva2VucywgcmUgPSAvWz8mXT8oW149XSspPShbXiZdKikvZztcblxuXHRcdHdoaWxlICh0b2tlbnMgPSByZS5leGVjKHNvdXJjZSkpXG5cdFx0XHR0aGlzLl92YXJpYWJsZXNbZGVjb2RlVVJJQ29tcG9uZW50KHRva2Vuc1sxXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KHRva2Vuc1syXSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdHB1YmxpYyB0b1N0cmluZygpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtPYmplY3R9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHZhcmlhYmxlcygpOk9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fVxuXHQgKi9cblx0cHVibGljIGdldCBmb3JtRGF0YSgpOkZvcm1EYXRhXG5cdHtcblx0XHR2YXIgZmQ6Rm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcblxuXHRcdGZvciAodmFyIHMgaW4gdGhpcy5fdmFyaWFibGVzKVxuXHRcdFx0ZmQuYXBwZW5kKHMsIHRoaXMuX3ZhcmlhYmxlc1tzXSk7XG5cblx0XHRyZXR1cm4gZmQ7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge09iamVjdH1cblx0ICovXG5cdHB1YmxpYyBzZXQgdmFyaWFibGVzKG9iajpPYmplY3QpXG5cdHtcblx0XHR0aGlzLl92YXJpYWJsZXMgPSBvYmo7XG5cdH1cbn1cblxuZXhwb3J0ID0gVVJMVmFyaWFibGVzOyJdfQ== \ No newline at end of file diff --git a/lib/core/net/URLVariables.ts b/lib/core/net/URLVariables.ts new file mode 100644 index 00000000..2e7eb1a7 --- /dev/null +++ b/lib/core/net/URLVariables.ts @@ -0,0 +1,71 @@ +class URLVariables +{ + private _variables:Object = new Object(); + + /** + * + * @param source + */ + constructor(source:string = null) + { + if (source !== null) + this.decode(source); + } + + /** + * + * @param source + */ + public decode(source:string):void + { + source = source.split("+").join(" "); + + var tokens, re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(source)) + this._variables[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + } + + /** + * + * @returns {string} + */ + public toString():string + { + return ''; + } + + /** + * + * @returns {Object} + */ + public get variables():Object + { + return this._variables; + } + + /** + * + * @returns {Object} + */ + public get formData():FormData + { + var fd:FormData = new FormData(); + + for (var s in this._variables) + fd.append(s, this._variables[s]); + + return fd; + } + + /** + * + * @returns {Object} + */ + public set variables(obj:Object) + { + this._variables = obj; + } +} + +export = URLVariables; \ No newline at end of file diff --git a/lib/core/partition/CameraNode.js b/lib/core/partition/CameraNode.js new file mode 100755 index 00000000..d7785037 --- /dev/null +++ b/lib/core/partition/CameraNode.js @@ -0,0 +1,28 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* @class away.partition.CameraNode +*/ +var CameraNode = (function (_super) { + __extends(CameraNode, _super); + function CameraNode(camera) { + _super.call(this, camera); + } + /** + * @inheritDoc + */ + CameraNode.prototype.acceptTraverser = function (traverser) { + // todo: dead end for now, if it has a debug mesh, then sure accept that + }; + return CameraNode; +})(EntityNode); + +module.exports = CameraNode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL0NhbWVyYU5vZGUudHMiXSwibmFtZXMiOlsiQ2FtZXJhTm9kZSIsIkNhbWVyYU5vZGUuY29uc3RydWN0b3IiLCJDYW1lcmFOb2RlLmFjY2VwdFRyYXZlcnNlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEscUVBQTZFOztBQUk3RTs7RUFFRztBQUNIO0lBQXlCQSw2QkFBVUE7SUFFbENBLG9CQUFZQSxNQUFjQTtRQUV6QkMsV0FBTUEsT0FBQUEsTUFBTUEsQ0FBQ0E7SUFDZEEsQ0FBQ0E7SUFLREQ7O01BREdBOzJDQUNIQSxVQUF1QkEsU0FBb0JBO1FBRTFDRSx3RUFBd0VBO0lBQ3pFQSxDQUFDQTtJQUNGRixrQkFBQ0E7QUFBREEsQ0FBQ0EsRUFkd0IsVUFBVSxFQWNsQzs7QUFFRCwyQkFBb0IsQ0FBQSIsImZpbGUiOiJjb3JlL3BhcnRpdGlvbi9DYW1lcmFOb2RlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVudGl0eU5vZGVcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGFydGl0aW9uL0VudGl0eU5vZGVcIik7XG5pbXBvcnQgSUNvbGxlY3Rvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9JQ29sbGVjdG9yXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcblxuLyoqXG4gKiBAY2xhc3MgYXdheS5wYXJ0aXRpb24uQ2FtZXJhTm9kZVxuICovXG5jbGFzcyBDYW1lcmFOb2RlIGV4dGVuZHMgRW50aXR5Tm9kZVxue1xuXHRjb25zdHJ1Y3RvcihjYW1lcmE6SUVudGl0eSlcblx0e1xuXHRcdHN1cGVyKGNhbWVyYSk7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBhY2NlcHRUcmF2ZXJzZXIodHJhdmVyc2VyOklDb2xsZWN0b3IpXG5cdHtcblx0XHQvLyB0b2RvOiBkZWFkIGVuZCBmb3Igbm93LCBpZiBpdCBoYXMgYSBkZWJ1ZyBtZXNoLCB0aGVuIHN1cmUgYWNjZXB0IHRoYXRcblx0fVxufVxuXG5leHBvcnQgPSBDYW1lcmFOb2RlOyJdfQ== \ No newline at end of file diff --git a/lib/core/partition/CameraNode.ts b/lib/core/partition/CameraNode.ts new file mode 100644 index 00000000..a97e73be --- /dev/null +++ b/lib/core/partition/CameraNode.ts @@ -0,0 +1,24 @@ +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.partition.CameraNode + */ +class CameraNode extends EntityNode +{ + constructor(camera:IEntity) + { + super(camera); + } + + /** + * @inheritDoc + */ + public acceptTraverser(traverser:ICollector) + { + // todo: dead end for now, if it has a debug mesh, then sure accept that + } +} + +export = CameraNode; \ No newline at end of file diff --git a/lib/core/partition/DirectionalLightNode.js b/lib/core/partition/DirectionalLightNode.js new file mode 100755 index 00000000..fcb8c252 --- /dev/null +++ b/lib/core/partition/DirectionalLightNode.js @@ -0,0 +1,43 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* @class away.partition.DirectionalLightNode +*/ +var DirectionalLightNode = (function (_super) { + __extends(DirectionalLightNode, _super); + /** + * + * @param directionalLight + */ + function DirectionalLightNode(directionalLight) { + _super.call(this, directionalLight); + + this._directionalLight = directionalLight; + } + /** + * @inheritDoc + */ + DirectionalLightNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applyDirectionalLight(this._directionalLight); + }; + + /** + * + * @returns {boolean} + */ + DirectionalLightNode.prototype.isCastingShadow = function () { + return false; + }; + return DirectionalLightNode; +})(EntityNode); + +module.exports = DirectionalLightNode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL0RpcmVjdGlvbmFsTGlnaHROb2RlLnRzIl0sIm5hbWVzIjpbIkRpcmVjdGlvbmFsTGlnaHROb2RlIiwiRGlyZWN0aW9uYWxMaWdodE5vZGUuY29uc3RydWN0b3IiLCJEaXJlY3Rpb25hbExpZ2h0Tm9kZS5hY2NlcHRUcmF2ZXJzZXIiLCJEaXJlY3Rpb25hbExpZ2h0Tm9kZS5pc0Nhc3RpbmdTaGFkb3ciXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFFQUE2RTs7QUFJN0U7O0VBRUc7QUFDSDtJQUFtQ0EsdUNBQVVBO0lBUTVDQTs7O01BREdBO0lBQ0hBLDhCQUFZQSxnQkFBd0JBO1FBRW5DQyxXQUFNQSxPQUFBQSxnQkFBZ0JBLENBQUNBOztRQUV2QkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxnQkFBZ0JBO0lBQzFDQSxDQUFDQTtJQUtERDs7TUFER0E7cURBQ0hBLFVBQXVCQSxTQUFvQkE7UUFFMUNFLElBQUlBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBO1lBQzVCQSxTQUFTQSxDQUFDQSxxQkFBcUJBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7SUFDMURBLENBQUNBOztJQU1ERjs7O01BREdBO3FEQUNIQTtRQUVDRyxPQUFPQSxLQUFLQTtJQUNiQSxDQUFDQTtJQUNGSCw0QkFBQ0E7QUFBREEsQ0FBQ0EsRUFoQ2tDLFVBQVUsRUFnQzVDOztBQUVELHFDQUE4QixDQUFBIiwiZmlsZSI6ImNvcmUvcGFydGl0aW9uL0RpcmVjdGlvbmFsTGlnaHROb2RlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVudGl0eU5vZGVcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGFydGl0aW9uL0VudGl0eU5vZGVcIik7XG5pbXBvcnQgSUNvbGxlY3Rvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9JQ29sbGVjdG9yXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcblxuLyoqXG4gKiBAY2xhc3MgYXdheS5wYXJ0aXRpb24uRGlyZWN0aW9uYWxMaWdodE5vZGVcbiAqL1xuY2xhc3MgRGlyZWN0aW9uYWxMaWdodE5vZGUgZXh0ZW5kcyBFbnRpdHlOb2RlXG57XG5cdHByaXZhdGUgX2RpcmVjdGlvbmFsTGlnaHQ6SUVudGl0eTtcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGRpcmVjdGlvbmFsTGlnaHRcblx0ICovXG5cdGNvbnN0cnVjdG9yKGRpcmVjdGlvbmFsTGlnaHQ6SUVudGl0eSlcblx0e1xuXHRcdHN1cGVyKGRpcmVjdGlvbmFsTGlnaHQpO1xuXG5cdFx0dGhpcy5fZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBhY2NlcHRUcmF2ZXJzZXIodHJhdmVyc2VyOklDb2xsZWN0b3IpXG5cdHtcblx0XHRpZiAodHJhdmVyc2VyLmVudGVyTm9kZSh0aGlzKSlcblx0XHRcdHRyYXZlcnNlci5hcHBseURpcmVjdGlvbmFsTGlnaHQodGhpcy5fZGlyZWN0aW9uYWxMaWdodCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRwdWJsaWMgaXNDYXN0aW5nU2hhZG93KCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmV4cG9ydCA9IERpcmVjdGlvbmFsTGlnaHROb2RlOyJdfQ== \ No newline at end of file diff --git a/lib/core/partition/DirectionalLightNode.ts b/lib/core/partition/DirectionalLightNode.ts new file mode 100644 index 00000000..188afa6b --- /dev/null +++ b/lib/core/partition/DirectionalLightNode.ts @@ -0,0 +1,42 @@ +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.partition.DirectionalLightNode + */ +class DirectionalLightNode extends EntityNode +{ + private _directionalLight:IEntity; + + /** + * + * @param directionalLight + */ + constructor(directionalLight:IEntity) + { + super(directionalLight); + + this._directionalLight = directionalLight; + } + + /** + * @inheritDoc + */ + public acceptTraverser(traverser:ICollector) + { + if (traverser.enterNode(this)) + traverser.applyDirectionalLight(this._directionalLight); + } + + /** + * + * @returns {boolean} + */ + public isCastingShadow():boolean + { + return false; + } +} + +export = DirectionalLightNode; \ No newline at end of file diff --git a/lib/core/partition/EntityNode.js b/lib/core/partition/EntityNode.js new file mode 100755 index 00000000..166e64d1 --- /dev/null +++ b/lib/core/partition/EntityNode.js @@ -0,0 +1,85 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); + +/** +* @class away.partition.EntityNode +*/ +var EntityNode = (function (_super) { + __extends(EntityNode, _super); + function EntityNode(entity) { + _super.call(this); + this._entity = entity; + this._iNumEntities = 1; + } + Object.defineProperty(EntityNode.prototype, "entity", { + get: function () { + return this._entity; + }, + enumerable: true, + configurable: true + }); + + EntityNode.prototype.removeFromParent = function () { + if (this._iParent) + this._iParent.iRemoveNode(this); + + this._iParent = null; + }; + + /** + * + * @returns {boolean} + */ + EntityNode.prototype.isCastingShadow = function () { + return this.entity.castsShadows; + }; + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + */ + EntityNode.prototype.isInFrustum = function (planes, numPlanes) { + if (!this._entity._iIsVisible()) + return false; + + return this._entity.worldBounds.isInFrustum(planes, numPlanes); + }; + + /** + * @inheritDoc + */ + EntityNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applyEntity(this._entity); + }; + + /** + * @inheritDoc + */ + EntityNode.prototype.isIntersectingRay = function (rayPosition, rayDirection) { + if (!this._entity._iIsVisible()) + return false; + + return this._entity.isIntersectingRay(rayPosition, rayDirection); + }; + + /** + * + * @protected + */ + EntityNode.prototype._pCreateBoundsPrimitive = function () { + return this._entity.bounds.boundingEntity; + }; + return EntityNode; +})(NodeBase); + +module.exports = EntityNode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL0VudGl0eU5vZGUudHMiXSwibmFtZXMiOlsiRW50aXR5Tm9kZSIsIkVudGl0eU5vZGUuY29uc3RydWN0b3IiLCJFbnRpdHlOb2RlLnJlbW92ZUZyb21QYXJlbnQiLCJFbnRpdHlOb2RlLmlzQ2FzdGluZ1NoYWRvdyIsIkVudGl0eU5vZGUuaXNJbkZydXN0dW0iLCJFbnRpdHlOb2RlLmFjY2VwdFRyYXZlcnNlciIsIkVudGl0eU5vZGUuaXNJbnRlcnNlY3RpbmdSYXkiLCJFbnRpdHlOb2RlLl9wQ3JlYXRlQm91bmRzUHJpbWl0aXZlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpRUFFMEU7O0FBSTFFOztFQUVHO0FBQ0g7SUFBeUJBLDZCQUFRQTtJQU1oQ0Esb0JBQVlBLE1BQWNBO1FBRXpCQyxXQUFNQSxLQUFBQSxDQUFDQTtRQUNQQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxNQUFNQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsQ0FBQ0E7SUFDdkJBLENBQUNBO0lBRUREO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQUVEQSx3Q0FBQUE7UUFFQ0UsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUE7WUFDaEJBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBOztRQUVqQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUE7SUFDckJBLENBQUNBOztJQU1ERjs7O01BREdBOzJDQUNIQTtRQUVDRyxPQUFPQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxZQUFZQTtJQUNoQ0EsQ0FBQ0E7O0lBUURIOzs7OztNQURHQTt1Q0FDSEEsVUFBbUJBLE1BQXFCQSxFQUFFQSxTQUFnQkE7UUFFekRJLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO1lBQzlCQSxPQUFPQSxLQUFLQSxDQUFDQTs7UUFFZEEsT0FBT0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsTUFBTUEsRUFBRUEsU0FBU0EsQ0FBQ0E7SUFDL0RBLENBQUNBOztJQUtESjs7TUFER0E7MkNBQ0hBLFVBQXVCQSxTQUFvQkE7UUFFMUNLLElBQUlBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBO1lBQzVCQSxTQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQTtJQUN0Q0EsQ0FBQ0E7O0lBS0RMOztNQURHQTs2Q0FDSEEsVUFBeUJBLFdBQW9CQSxFQUFFQSxZQUFxQkE7UUFFbkVNLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO1lBQzlCQSxPQUFPQSxLQUFLQSxDQUFDQTs7UUFFZEEsT0FBT0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxXQUFXQSxFQUFFQSxZQUFZQSxDQUFDQTtJQUNqRUEsQ0FBQ0E7O0lBTUROOzs7TUFER0E7bURBQ0hBO1FBRUNPLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLE1BQU1BLENBQUNBLGNBQWNBO0lBQzFDQSxDQUFDQTtJQUNGUCxrQkFBQ0E7QUFBREEsQ0FBQ0EsRUE3RXdCLFFBQVEsRUE2RWhDOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImNvcmUvcGFydGl0aW9uL0VudGl0eU5vZGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGxhbmUzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUGxhbmUzRFwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgTm9kZUJhc2VcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vTm9kZUJhc2VcIik7XG5pbXBvcnQgSUNvbGxlY3Rvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9JQ29sbGVjdG9yXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcblxuLyoqXG4gKiBAY2xhc3MgYXdheS5wYXJ0aXRpb24uRW50aXR5Tm9kZVxuICovXG5jbGFzcyBFbnRpdHlOb2RlIGV4dGVuZHMgTm9kZUJhc2VcbntcblxuXHRwcml2YXRlIF9lbnRpdHk6SUVudGl0eTtcblx0cHVibGljIF9pVXBkYXRlUXVldWVOZXh0OkVudGl0eU5vZGU7XG5cblx0Y29uc3RydWN0b3IoZW50aXR5OklFbnRpdHkpXG5cdHtcblx0XHRzdXBlcigpO1xuXHRcdHRoaXMuX2VudGl0eSA9IGVudGl0eTtcblx0XHR0aGlzLl9pTnVtRW50aXRpZXMgPSAxO1xuXHR9XG5cblx0cHVibGljIGdldCBlbnRpdHkoKTpJRW50aXR5XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZW50aXR5O1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUZyb21QYXJlbnQoKTp2b2lkXG5cdHtcblx0XHRpZiAodGhpcy5faVBhcmVudClcblx0XHRcdHRoaXMuX2lQYXJlbnQuaVJlbW92ZU5vZGUodGhpcyk7XG5cblx0XHR0aGlzLl9pUGFyZW50ID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdHB1YmxpYyBpc0Nhc3RpbmdTaGFkb3coKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5lbnRpdHkuY2FzdHNTaGFkb3dzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBwbGFuZXNcblx0ICogQHBhcmFtIG51bVBsYW5lc1xuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdHB1YmxpYyBpc0luRnJ1c3R1bShwbGFuZXM6QXJyYXk8UGxhbmUzRD4sIG51bVBsYW5lczpudW1iZXIpOmJvb2xlYW5cblx0e1xuXHRcdGlmICghdGhpcy5fZW50aXR5Ll9pSXNWaXNpYmxlKCkpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcy5fZW50aXR5LndvcmxkQm91bmRzLmlzSW5GcnVzdHVtKHBsYW5lcywgbnVtUGxhbmVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIGFjY2VwdFRyYXZlcnNlcih0cmF2ZXJzZXI6SUNvbGxlY3Rvcilcblx0e1xuXHRcdGlmICh0cmF2ZXJzZXIuZW50ZXJOb2RlKHRoaXMpKVxuXHRcdFx0dHJhdmVyc2VyLmFwcGx5RW50aXR5KHRoaXMuX2VudGl0eSk7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBpc0ludGVyc2VjdGluZ1JheShyYXlQb3NpdGlvbjpWZWN0b3IzRCwgcmF5RGlyZWN0aW9uOlZlY3RvcjNEKTpib29sZWFuXG5cdHtcblx0XHRpZiAoIXRoaXMuX2VudGl0eS5faUlzVmlzaWJsZSgpKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2VudGl0eS5pc0ludGVyc2VjdGluZ1JheShyYXlQb3NpdGlvbiwgcmF5RGlyZWN0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgX3BDcmVhdGVCb3VuZHNQcmltaXRpdmUoKTpJRW50aXR5XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZW50aXR5LmJvdW5kcy5ib3VuZGluZ0VudGl0eTtcblx0fVxufVxuXG5leHBvcnQgPSBFbnRpdHlOb2RlOyJdfQ== \ No newline at end of file diff --git a/lib/core/partition/EntityNode.ts b/lib/core/partition/EntityNode.ts new file mode 100644 index 00000000..8e941cd7 --- /dev/null +++ b/lib/core/partition/EntityNode.ts @@ -0,0 +1,89 @@ +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.partition.EntityNode + */ +class EntityNode extends NodeBase +{ + + private _entity:IEntity; + public _iUpdateQueueNext:EntityNode; + + constructor(entity:IEntity) + { + super(); + this._entity = entity; + this._iNumEntities = 1; + } + + public get entity():IEntity + { + return this._entity; + } + + public removeFromParent():void + { + if (this._iParent) + this._iParent.iRemoveNode(this); + + this._iParent = null; + } + + /** + * + * @returns {boolean} + */ + public isCastingShadow():boolean + { + return this.entity.castsShadows; + } + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + */ + public isInFrustum(planes:Array, numPlanes:number):boolean + { + if (!this._entity._iIsVisible()) + return false; + + return this._entity.worldBounds.isInFrustum(planes, numPlanes); + } + + /** + * @inheritDoc + */ + public acceptTraverser(traverser:ICollector) + { + if (traverser.enterNode(this)) + traverser.applyEntity(this._entity); + } + + /** + * @inheritDoc + */ + public isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean + { + if (!this._entity._iIsVisible()) + return false; + + return this._entity.isIntersectingRay(rayPosition, rayDirection); + } + + /** + * + * @protected + */ + public _pCreateBoundsPrimitive():IEntity + { + return this._entity.bounds.boundingEntity; + } +} + +export = EntityNode; \ No newline at end of file diff --git a/lib/core/partition/LightProbeNode.js b/lib/core/partition/LightProbeNode.js new file mode 100755 index 00000000..c847c9bc --- /dev/null +++ b/lib/core/partition/LightProbeNode.js @@ -0,0 +1,43 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* @class away.partition.LightProbeNode +*/ +var LightProbeNode = (function (_super) { + __extends(LightProbeNode, _super); + /** + * + * @param lightProbe + */ + function LightProbeNode(lightProbe) { + _super.call(this, lightProbe); + + this._lightProbe = lightProbe; + } + /** + * @inheritDoc + */ + LightProbeNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applyLightProbe(this._lightProbe); + }; + + /** + * + * @returns {boolean} + */ + LightProbeNode.prototype.isCastingShadow = function () { + return false; + }; + return LightProbeNode; +})(EntityNode); + +module.exports = LightProbeNode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL0xpZ2h0UHJvYmVOb2RlLnRzIl0sIm5hbWVzIjpbIkxpZ2h0UHJvYmVOb2RlIiwiTGlnaHRQcm9iZU5vZGUuY29uc3RydWN0b3IiLCJMaWdodFByb2JlTm9kZS5hY2NlcHRUcmF2ZXJzZXIiLCJMaWdodFByb2JlTm9kZS5pc0Nhc3RpbmdTaGFkb3ciXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFFQUE2RTs7QUFJN0U7O0VBRUc7QUFDSDtJQUE2QkEsaUNBQVVBO0lBUXRDQTs7O01BREdBO0lBQ0hBLHdCQUFZQSxVQUFrQkE7UUFFN0JDLFdBQU1BLE9BQUFBLFVBQVVBLENBQUNBOztRQUVqQkEsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsVUFBVUE7SUFDOUJBLENBQUNBO0lBS0REOztNQURHQTsrQ0FDSEEsVUFBdUJBLFNBQW9CQTtRQUUxQ0UsSUFBSUEsU0FBU0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0E7WUFDNUJBLFNBQVNBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO0lBQzlDQSxDQUFDQTs7SUFNREY7OztNQURHQTsrQ0FDSEE7UUFFQ0csT0FBT0EsS0FBS0E7SUFDYkEsQ0FBQ0E7SUFDRkgsc0JBQUNBO0FBQURBLENBQUNBLEVBaEM0QixVQUFVLEVBZ0N0Qzs7QUFFRCwrQkFBd0IsQ0FBQSIsImZpbGUiOiJjb3JlL3BhcnRpdGlvbi9MaWdodFByb2JlTm9kZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFbnRpdHlOb2RlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9FbnRpdHlOb2RlXCIpO1xuaW1wb3J0IElDb2xsZWN0b3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvdHJhdmVyc2UvSUNvbGxlY3RvclwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkucGFydGl0aW9uLkxpZ2h0UHJvYmVOb2RlXG4gKi9cbmNsYXNzIExpZ2h0UHJvYmVOb2RlIGV4dGVuZHMgRW50aXR5Tm9kZVxue1xuXHRwcml2YXRlIF9saWdodFByb2JlOklFbnRpdHk7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBsaWdodFByb2JlXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihsaWdodFByb2JlOklFbnRpdHkpXG5cdHtcblx0XHRzdXBlcihsaWdodFByb2JlKTtcblxuXHRcdHRoaXMuX2xpZ2h0UHJvYmUgPSBsaWdodFByb2JlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgYWNjZXB0VHJhdmVyc2VyKHRyYXZlcnNlcjpJQ29sbGVjdG9yKVxuXHR7XG5cdFx0aWYgKHRyYXZlcnNlci5lbnRlck5vZGUodGhpcykpXG5cdFx0XHR0cmF2ZXJzZXIuYXBwbHlMaWdodFByb2JlKHRoaXMuX2xpZ2h0UHJvYmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cHVibGljIGlzQ2FzdGluZ1NoYWRvdygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufVxuXG5leHBvcnQgPSBMaWdodFByb2JlTm9kZTsiXX0= \ No newline at end of file diff --git a/lib/core/partition/LightProbeNode.ts b/lib/core/partition/LightProbeNode.ts new file mode 100644 index 00000000..d249caad --- /dev/null +++ b/lib/core/partition/LightProbeNode.ts @@ -0,0 +1,42 @@ +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.partition.LightProbeNode + */ +class LightProbeNode extends EntityNode +{ + private _lightProbe:IEntity; + + /** + * + * @param lightProbe + */ + constructor(lightProbe:IEntity) + { + super(lightProbe); + + this._lightProbe = lightProbe; + } + + /** + * @inheritDoc + */ + public acceptTraverser(traverser:ICollector) + { + if (traverser.enterNode(this)) + traverser.applyLightProbe(this._lightProbe); + } + + /** + * + * @returns {boolean} + */ + public isCastingShadow():boolean + { + return false; + } +} + +export = LightProbeNode; \ No newline at end of file diff --git a/lib/core/partition/NodeBase.js b/lib/core/partition/NodeBase.js new file mode 100755 index 00000000..ee2a8dab --- /dev/null +++ b/lib/core/partition/NodeBase.js @@ -0,0 +1,221 @@ +/** +* @class away.partition.NodeBase +*/ +var NodeBase = (function () { + /** + * + */ + function NodeBase() { + this._pNumChildNodes = 0; + this._iNumEntities = 0; + this._pChildNodes = new Array(); + } + Object.defineProperty(NodeBase.prototype, "boundsVisible", { + /** + * + */ + get: function () { + return this._explicitBoundsVisible; + }, + set: function (value) { + if (this._explicitBoundsVisible == value) + return; + + this._explicitBoundsVisible = value; + + this._iUpdateImplicitBoundsVisible(this._iParent ? this._iParent.boundsChildrenVisible : false); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(NodeBase.prototype, "boundsChildrenVisible", { + get: function () { + return this._boundsChildrenVisible; + }, + set: function (value) { + if (this._boundsChildrenVisible == value) + return; + + this._boundsChildrenVisible = value; + + for (var i = 0; i < this._pNumChildNodes; ++i) + this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(NodeBase.prototype, "parent", { + /** + * + */ + get: function () { + return this._iParent; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(NodeBase.prototype, "_pNumEntities", { + /** + * + * @protected + */ + get: function () { + return this._iNumEntities; + }, + enumerable: true, + configurable: true + }); + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + * @internal + */ + NodeBase.prototype.isInFrustum = function (planes, numPlanes) { + return true; + }; + + /** + * + * @param rayPosition + * @param rayDirection + * @returns {boolean} + */ + NodeBase.prototype.isIntersectingRay = function (rayPosition, rayDirection) { + return true; + }; + + /** + * + * @returns {boolean} + */ + NodeBase.prototype.isCastingShadow = function () { + return true; + }; + + /** + * + * @param entity + * @returns {away.partition.NodeBase} + */ + NodeBase.prototype.findPartitionForEntity = function (entity) { + return this; + }; + + /** + * + * @param traverser + */ + NodeBase.prototype.acceptTraverser = function (traverser) { + if (this._pNumEntities == 0 && !this._implicitBoundsVisible) + return; + + if (traverser.enterNode(this)) { + var i = 0; + + while (i < this._pNumChildNodes) + this._pChildNodes[i++].acceptTraverser(traverser); + + if (this._implicitBoundsVisible) + this._pBoundsPrimitive.partitionNode.acceptTraverser(traverser); + } + }; + + /** + * + * @protected + */ + NodeBase.prototype._pCreateBoundsPrimitive = function () { + return null; + }; + + /** + * + * @param node + * @internal + */ + NodeBase.prototype.iAddNode = function (node) { + node._iParent = this; + this._iNumEntities += node._pNumEntities; + this._pChildNodes[this._pNumChildNodes++] = node; + + node._iUpdateImplicitBoundsVisible(this.boundsChildrenVisible); + + var numEntities = node._pNumEntities; + node = this; + + do { + node._iNumEntities += numEntities; + } while((node = node._iParent) != null); + }; + + /** + * + * @param node + * @internal + */ + NodeBase.prototype.iRemoveNode = function (node) { + var index = this._pChildNodes.indexOf(node); + this._pChildNodes[index] = this._pChildNodes[--this._pNumChildNodes]; + this._pChildNodes.pop(); + + node._iUpdateImplicitBoundsVisible(false); + + var numEntities = node._pNumEntities; + node = this; + + do { + node._pNumEntities -= numEntities; + } while((node = node._iParent) != null); + }; + + NodeBase.prototype._iUpdateImplicitBoundsVisible = function (value) { + if (this._implicitBoundsVisible == this._explicitBoundsVisible || value) + return; + + this._implicitBoundsVisible = this._explicitBoundsVisible || value; + + this._iUpdateEntityBounds(); + + for (var i = 0; i < this._pNumChildNodes; ++i) + this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); + }; + + /** + * @internal + */ + NodeBase.prototype._iIsBoundsVisible = function () { + return this._implicitBoundsVisible; + }; + + // public _pUpdateNumEntities(value:number) + // { + // var diff:number = value - this._pNumEntities; + // var node:NodeBase = this; + // + // do { + // node._pNumEntities += diff; + // } while ((node = node._iParent) != null); + // } + NodeBase.prototype._iUpdateEntityBounds = function () { + if (this._pBoundsPrimitive) { + this._pBoundsPrimitive.dispose(); + this._pBoundsPrimitive = null; + } + + if (this._implicitBoundsVisible) + this._pBoundsPrimitive = this._pCreateBoundsPrimitive(); + }; + return NodeBase; +})(); + +module.exports = NodeBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL05vZGVCYXNlLnRzIl0sIm5hbWVzIjpbIk5vZGVCYXNlIiwiTm9kZUJhc2UuY29uc3RydWN0b3IiLCJOb2RlQmFzZS5pc0luRnJ1c3R1bSIsIk5vZGVCYXNlLmlzSW50ZXJzZWN0aW5nUmF5IiwiTm9kZUJhc2UuaXNDYXN0aW5nU2hhZG93IiwiTm9kZUJhc2UuZmluZFBhcnRpdGlvbkZvckVudGl0eSIsIk5vZGVCYXNlLmFjY2VwdFRyYXZlcnNlciIsIk5vZGVCYXNlLl9wQ3JlYXRlQm91bmRzUHJpbWl0aXZlIiwiTm9kZUJhc2UuaUFkZE5vZGUiLCJOb2RlQmFzZS5pUmVtb3ZlTm9kZSIsIk5vZGVCYXNlLl9pVXBkYXRlSW1wbGljaXRCb3VuZHNWaXNpYmxlIiwiTm9kZUJhc2UuX2lJc0JvdW5kc1Zpc2libGUiLCJOb2RlQmFzZS5faVVwZGF0ZUVudGl0eUJvdW5kcyJdLCJtYXBwaW5ncyI6IkFBQUE7O0VBT0c7QUFDSDtJQW9FQ0E7O01BREdBO0lBQ0hBO1FBN0RBQyxLQUFPQSxlQUFlQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUdsQ0EsS0FBT0EsYUFBYUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUE0RC9CQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFXQSxDQUFDQTtJQUMxQ0EsQ0FBQ0E7SUF2REREO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxzQkFBc0JBO1FBQ25DQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF5QkEsS0FBYUE7WUFFckNBLElBQUlBLElBQUlBLENBQUNBLHNCQUFzQkEsSUFBSUEsS0FBS0E7Z0JBQ3ZDQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxHQUFHQSxLQUFLQTs7WUFFbkNBLElBQUlBLENBQUNBLDZCQUE2QkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EscUJBQXFCQSxH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Q0FBQ0E7WUFDbkRBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLDZCQUE2QkEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxDQUFDQTtJQUNsRkEsQ0FBQ0E7O0lBS0RWOztNQURHQTsyQ0FDSEE7UUFFQ1csT0FBT0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQTtJQUNuQ0EsQ0FBQ0E7O0lBWURYLDRDQVYyQ0E7SUFDNUNBLEtBQUtBO0lBQ0xBLGtEQUFrREE7SUFDbERBLDhCQUE4QkE7SUFDOUJBLEVBQUVBO0lBQ0ZBLFNBQVNBO0lBQ1RBLGlDQUFpQ0E7SUFDakNBLDhDQUE4Q0E7SUFDOUNBLEtBQUtBOzhDQUVKQTtRQUVDWSxJQUFJQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUVBO1lBQzNCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO1lBQ2hDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLElBQUlBO1NBQzdCQTs7UUFFREEsSUFBSUEsSUFBSUEsQ0FBQ0Esc0JBQXNCQTtZQUM5QkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxJQUFJQSxDQUFDQSx1QkFBdUJBLENBQUNBLENBQUNBLENBQUNBO0lBQzFEQSxDQUFDQTtJQUNGWixnQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCx5QkFBa0IsQ0FBQSIsImZpbGUiOiJjb3JlL3BhcnRpdGlvbi9Ob2RlQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQbGFuZTNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9QbGFuZTNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBJQ29sbGVjdG9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0lDb2xsZWN0b3JcIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9JRW50aXR5XCIpO1xuXG4vKipcbiAqIEBjbGFzcyBhd2F5LnBhcnRpdGlvbi5Ob2RlQmFzZVxuICovXG5jbGFzcyBOb2RlQmFzZVxue1xuXHRwcml2YXRlIF9ib3VuZHNDaGlsZHJlblZpc2libGU6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfZXhwbGljaXRCb3VuZHNWaXNpYmxlOmJvb2xlYW47XG5cdHByaXZhdGUgX2ltcGxpY2l0Qm91bmRzVmlzaWJsZTpib29sZWFuO1xuXHRwdWJsaWMgX2lQYXJlbnQ6Tm9kZUJhc2U7XG5cdHB1YmxpYyBfcENoaWxkTm9kZXM6QXJyYXk8Tm9kZUJhc2U+O1xuXHRwdWJsaWMgX3BOdW1DaGlsZE5vZGVzOm51bWJlciA9IDA7XG5cdHB1YmxpYyBfcEJvdW5kc1ByaW1pdGl2ZTpJRW50aXR5O1xuXG5cdHB1YmxpYyBfaU51bUVudGl0aWVzOm51bWJlciA9IDA7XG5cdHB1YmxpYyBfaUNvbGxlY3Rpb25NYXJrOm51bWJlcjsvLyA9IDA7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGJvdW5kc1Zpc2libGUoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZXhwbGljaXRCb3VuZHNWaXNpYmxlO1xuXHR9XG5cblx0cHVibGljIHNldCBib3VuZHNWaXNpYmxlKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHRpZiAodGhpcy5fZXhwbGljaXRCb3VuZHNWaXNpYmxlID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fZXhwbGljaXRCb3VuZHNWaXNpYmxlID0gdmFsdWU7XG5cblx0XHR0aGlzLl9pVXBkYXRlSW1wbGljaXRCb3VuZHNWaXNpYmxlKHRoaXMuX2lQYXJlbnQ/IHRoaXMuX2lQYXJlbnQuYm91bmRzQ2hpbGRyZW5WaXNpYmxlIDogZmFsc2UpO1xuXG5cdH1cblxuXHRwdWJsaWMgZ2V0IGJvdW5kc0NoaWxkcmVuVmlzaWJsZSgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9ib3VuZHNDaGlsZHJlblZpc2libGU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGJvdW5kc0NoaWxkcmVuVmlzaWJsZSh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2JvdW5kc0NoaWxkcmVuVmlzaWJsZSA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2JvdW5kc0NoaWxkcmVuVmlzaWJsZSA9IHZhbHVlO1xuXG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgdGhpcy5fcE51bUNoaWxkTm9kZXM7ICsraSlcblx0XHRcdHRoaXMuX3BDaGlsZE5vZGVzW2ldLl9pVXBkYXRlSW1wbGljaXRCb3VuZHNWaXNpYmxlKHRoaXMuX2JvdW5kc0NoaWxkcmVuVmlzaWJsZSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgcGFyZW50KCk6Tm9kZUJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9pUGFyZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBnZXQgX3BOdW1FbnRpdGllcygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2lOdW1FbnRpdGllcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5fcENoaWxkTm9kZXMgPSBuZXcgQXJyYXk8Tm9kZUJhc2U+KCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHBsYW5lc1xuXHQgKiBAcGFyYW0gbnVtUGxhbmVzXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBpc0luRnJ1c3R1bShwbGFuZXM6QXJyYXk8UGxhbmUzRD4sIG51bVBsYW5lczpudW1iZXIpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSByYXlQb3NpdGlvblxuXHQgKiBAcGFyYW0gcmF5RGlyZWN0aW9uXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cHVibGljIGlzSW50ZXJzZWN0aW5nUmF5KHJheVBvc2l0aW9uOlZlY3RvcjNELCByYXlEaXJlY3Rpb246VmVjdG9yM0QpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cHVibGljIGlzQ2FzdGluZ1NoYWRvdygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlcblx0ICogQHJldHVybnMge2F3YXkucGFydGl0aW9uLk5vZGVCYXNlfVxuXHQgKi9cblx0cHVibGljIGZpbmRQYXJ0aXRpb25Gb3JFbnRpdHkoZW50aXR5OklFbnRpdHkpOk5vZGVCYXNlXG5cdHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gdHJhdmVyc2VyXG5cdCAqL1xuXHRwdWJsaWMgYWNjZXB0VHJhdmVyc2VyKHRyYXZlcnNlcjpJQ29sbGVjdG9yKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BOdW1FbnRpdGllcyA9PSAwICYmICF0aGlzLl9pbXBsaWNpdEJvdW5kc1Zpc2libGUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodHJhdmVyc2VyLmVudGVyTm9kZSh0aGlzKSkge1xuXHRcdFx0dmFyIGk6bnVtYmVyID0gMDtcblxuXHRcdFx0d2hpbGUgKGkgPCB0aGlzLl9wTnVtQ2hpbGROb2Rlcylcblx0XHRcdFx0dGhpcy5fcENoaWxkTm9kZXNbaSsrXS5hY2NlcHRUcmF2ZXJzZXIodHJhdmVyc2VyKTtcblxuXHRcdFx0aWYgKHRoaXMuX2ltcGxpY2l0Qm91bmRzVmlzaWJsZSlcblx0XHRcdFx0dGhpcy5fcEJvdW5kc1ByaW1pdGl2ZS5wYXJ0aXRpb25Ob2RlLmFjY2VwdFRyYXZlcnNlcih0cmF2ZXJzZXIpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgX3BDcmVhdGVCb3VuZHNQcmltaXRpdmUoKTpJRW50aXR5XG5cdHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gbm9kZVxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBpQWRkTm9kZShub2RlOk5vZGVCYXNlKVxuXHR7XG5cdFx0bm9kZS5faVBhcmVudCA9IHRoaXM7XG5cdFx0dGhpcy5faU51bUVudGl0aWVzICs9IG5vZGUuX3BOdW1FbnRpdGllcztcblx0XHR0aGlzLl9wQ2hpbGROb2Rlc1sgdGhpcy5fcE51bUNoaWxkTm9kZXMrKyBdID0gbm9kZTtcblxuXHRcdG5vZGUuX2lVcGRhdGVJbXBsaWNpdEJvdW5kc1Zpc2libGUodGhpcy5ib3VuZHNDaGlsZHJlblZpc2libGUpO1xuXG5cdFx0dmFyIG51bUVudGl0aWVzOm51bWJlciA9IG5vZGUuX3BOdW1FbnRpdGllcztcblx0XHRub2RlID0gdGhpcztcblxuXHRcdGRvIHtcblx0XHRcdG5vZGUuX2lOdW1FbnRpdGllcyArPSBudW1FbnRpdGllcztcblx0XHR9IHdoaWxlICgobm9kZSA9IG5vZGUuX2lQYXJlbnQpICE9IG51bGwpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBub2RlXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGlSZW1vdmVOb2RlKG5vZGU6Tm9kZUJhc2UpXG5cdHtcblx0XHR2YXIgaW5kZXg6bnVtYmVyID0gdGhpcy5fcENoaWxkTm9kZXMuaW5kZXhPZihub2RlKTtcblx0XHR0aGlzLl9wQ2hpbGROb2Rlc1tpbmRleF0gPSB0aGlzLl9wQ2hpbGROb2Rlc1stLXRoaXMuX3BOdW1DaGlsZE5vZGVzXTtcblx0XHR0aGlzLl9wQ2hpbGROb2Rlcy5wb3AoKTtcblxuXHRcdG5vZGUuX2lVcGRhdGVJbXBsaWNpdEJvdW5kc1Zpc2libGUoZmFsc2UpO1xuXG5cdFx0dmFyIG51bUVudGl0aWVzOm51bWJlciA9IG5vZGUuX3BOdW1FbnRpdGllcztcblx0XHRub2RlID0gdGhpcztcblxuXHRcdGRvIHtcblx0XHRcdG5vZGUuX3BOdW1FbnRpdGllcyAtPSBudW1FbnRpdGllcztcblx0XHR9IHdoaWxlICgobm9kZSA9IG5vZGUuX2lQYXJlbnQpICE9IG51bGwpO1xuXHR9XG5cblx0cHJpdmF0ZSBfaVVwZGF0ZUltcGxpY2l0Qm91bmRzVmlzaWJsZSh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2ltcGxpY2l0Qm91bmRzVmlzaWJsZSA9PSB0aGlzLl9leHBsaWNpdEJvdW5kc1Zpc2libGUgfHwgdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9pbXBsaWNpdEJvdW5kc1Zpc2libGUgPSB0aGlzLl9leHBsaWNpdEJvdW5kc1Zpc2libGUgfHwgdmFsdWU7XG5cblx0XHR0aGlzLl9pVXBkYXRlRW50aXR5Qm91bmRzKCk7XG5cblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCB0aGlzLl9wTnVtQ2hpbGROb2RlczsgKytpKVxuXHRcdFx0dGhpcy5fcENoaWxkTm9kZXNbaV0uX2lVcGRhdGVJbXBsaWNpdEJvdW5kc1Zpc2libGUodGhpcy5fYm91bmRzQ2hpbGRyZW5WaXNpYmxlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBfaUlzQm91bmRzVmlzaWJsZSgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9pbXBsaWNpdEJvdW5kc1Zpc2libGU7XG5cdH1cblxuLy9cdFx0cHVibGljIF9wVXBkYXRlTnVtRW50aXRpZXModmFsdWU6bnVtYmVyKVxuLy9cdFx0e1xuLy9cdFx0XHR2YXIgZGlmZjpudW1iZXIgPSB2YWx1ZSAtIHRoaXMuX3BOdW1FbnRpdGllcztcbi8vXHRcdFx0dmFyIG5vZGU6Tm9kZUJhc2UgPSB0aGlzO1xuLy9cbi8vXHRcdFx0ZG8ge1xuLy9cdFx0XHRcdG5vZGUuX3BOdW1FbnRpdGllcyArPSBkaWZmO1xuLy9cdFx0XHR9IHdoaWxlICgobm9kZSA9IG5vZGUuX2lQYXJlbnQpICE9IG51bGwpO1xuLy9cdFx0fVxuXG5cdHB1YmxpYyBfaVVwZGF0ZUVudGl0eUJvdW5kcygpXG5cdHtcblx0XHRpZiAodGhpcy5fcEJvdW5kc1ByaW1pdGl2ZSkge1xuXHRcdFx0dGhpcy5fcEJvdW5kc1ByaW1pdGl2ZS5kaXNwb3NlKCk7XG5cdFx0XHR0aGlzLl9wQm91bmRzUHJpbWl0aXZlID0gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5faW1wbGljaXRCb3VuZHNWaXNpYmxlKVxuXHRcdFx0dGhpcy5fcEJvdW5kc1ByaW1pdGl2ZSA9IHRoaXMuX3BDcmVhdGVCb3VuZHNQcmltaXRpdmUoKTtcblx0fVxufVxuXG5leHBvcnQgPSBOb2RlQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/core/partition/NodeBase.ts b/lib/core/partition/NodeBase.ts new file mode 100644 index 00000000..4f32707e --- /dev/null +++ b/lib/core/partition/NodeBase.ts @@ -0,0 +1,238 @@ +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.partition.NodeBase + */ +class NodeBase +{ + private _boundsChildrenVisible:boolean; + private _explicitBoundsVisible:boolean; + private _implicitBoundsVisible:boolean; + public _iParent:NodeBase; + public _pChildNodes:Array; + public _pNumChildNodes:number = 0; + public _pBoundsPrimitive:IEntity; + + public _iNumEntities:number = 0; + public _iCollectionMark:number;// = 0; + + /** + * + */ + public get boundsVisible():boolean + { + return this._explicitBoundsVisible; + } + + public set boundsVisible(value:boolean) + { + if (this._explicitBoundsVisible == value) + return; + + this._explicitBoundsVisible = value; + + this._iUpdateImplicitBoundsVisible(this._iParent? this._iParent.boundsChildrenVisible : false); + + } + + public get boundsChildrenVisible():boolean + { + return this._boundsChildrenVisible; + } + + public set boundsChildrenVisible(value:boolean) + { + if (this._boundsChildrenVisible == value) + return; + + this._boundsChildrenVisible = value; + + for (var i:number = 0; i < this._pNumChildNodes; ++i) + this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); + } + + /** + * + */ + public get parent():NodeBase + { + return this._iParent; + } + + /** + * + * @protected + */ + public get _pNumEntities():number + { + return this._iNumEntities; + } + + /** + * + */ + constructor() + { + this._pChildNodes = new Array(); + } + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + * @internal + */ + public isInFrustum(planes:Array, numPlanes:number):boolean + { + return true; + } + + /** + * + * @param rayPosition + * @param rayDirection + * @returns {boolean} + */ + public isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean + { + return true; + } + + /** + * + * @returns {boolean} + */ + public isCastingShadow():boolean + { + return true; + } + + /** + * + * @param entity + * @returns {away.partition.NodeBase} + */ + public findPartitionForEntity(entity:IEntity):NodeBase + { + return this; + } + + /** + * + * @param traverser + */ + public acceptTraverser(traverser:ICollector) + { + if (this._pNumEntities == 0 && !this._implicitBoundsVisible) + return; + + if (traverser.enterNode(this)) { + var i:number = 0; + + while (i < this._pNumChildNodes) + this._pChildNodes[i++].acceptTraverser(traverser); + + if (this._implicitBoundsVisible) + this._pBoundsPrimitive.partitionNode.acceptTraverser(traverser); + } + } + + /** + * + * @protected + */ + public _pCreateBoundsPrimitive():IEntity + { + return null; + } + + /** + * + * @param node + * @internal + */ + public iAddNode(node:NodeBase) + { + node._iParent = this; + this._iNumEntities += node._pNumEntities; + this._pChildNodes[ this._pNumChildNodes++ ] = node; + + node._iUpdateImplicitBoundsVisible(this.boundsChildrenVisible); + + var numEntities:number = node._pNumEntities; + node = this; + + do { + node._iNumEntities += numEntities; + } while ((node = node._iParent) != null); + } + + /** + * + * @param node + * @internal + */ + public iRemoveNode(node:NodeBase) + { + var index:number = this._pChildNodes.indexOf(node); + this._pChildNodes[index] = this._pChildNodes[--this._pNumChildNodes]; + this._pChildNodes.pop(); + + node._iUpdateImplicitBoundsVisible(false); + + var numEntities:number = node._pNumEntities; + node = this; + + do { + node._pNumEntities -= numEntities; + } while ((node = node._iParent) != null); + } + + private _iUpdateImplicitBoundsVisible(value:boolean) + { + if (this._implicitBoundsVisible == this._explicitBoundsVisible || value) + return; + + this._implicitBoundsVisible = this._explicitBoundsVisible || value; + + this._iUpdateEntityBounds(); + + for (var i:number = 0; i < this._pNumChildNodes; ++i) + this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); + } + + /** + * @internal + */ + public _iIsBoundsVisible():boolean + { + return this._implicitBoundsVisible; + } + +// public _pUpdateNumEntities(value:number) +// { +// var diff:number = value - this._pNumEntities; +// var node:NodeBase = this; +// +// do { +// node._pNumEntities += diff; +// } while ((node = node._iParent) != null); +// } + + public _iUpdateEntityBounds() + { + if (this._pBoundsPrimitive) { + this._pBoundsPrimitive.dispose(); + this._pBoundsPrimitive = null; + } + + if (this._implicitBoundsVisible) + this._pBoundsPrimitive = this._pCreateBoundsPrimitive(); + } +} + +export = NodeBase; \ No newline at end of file diff --git a/lib/core/partition/NullNode.js b/lib/core/partition/NullNode.js new file mode 100755 index 00000000..29ad707b --- /dev/null +++ b/lib/core/partition/NullNode.js @@ -0,0 +1,12 @@ +/** +* @class away.partition.NullNode +*/ +var NullNode = (function () { + function NullNode() { + } + return NullNode; +})(); + +module.exports = NullNode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL051bGxOb2RlLnRzIl0sIm5hbWVzIjpbIk51bGxOb2RlIiwiTnVsbE5vZGUuY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBOztFQUVHO0FBQ0g7SUFFQ0E7SUFFQUMsQ0FBQ0E7SUFDRkQsZ0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQseUJBQWtCLENBQUEiLCJmaWxlIjoiY29yZS9wYXJ0aXRpb24vTnVsbE5vZGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBjbGFzcyBhd2F5LnBhcnRpdGlvbi5OdWxsTm9kZVxuICovXG5jbGFzcyBOdWxsTm9kZVxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0fVxufVxuXG5leHBvcnQgPSBOdWxsTm9kZTsiXX0= \ No newline at end of file diff --git a/lib/core/partition/NullNode.ts b/lib/core/partition/NullNode.ts new file mode 100644 index 00000000..df5a3d70 --- /dev/null +++ b/lib/core/partition/NullNode.ts @@ -0,0 +1,11 @@ +/** + * @class away.partition.NullNode + */ +class NullNode +{ + constructor() + { + } +} + +export = NullNode; \ No newline at end of file diff --git a/lib/core/partition/Partition.js b/lib/core/partition/Partition.js new file mode 100755 index 00000000..afeba3a4 --- /dev/null +++ b/lib/core/partition/Partition.js @@ -0,0 +1,95 @@ +var NullNode = require("awayjs-core/lib/core/partition/NullNode"); + +/** +* @class away.partition.Partition +*/ +var Partition = (function () { + function Partition(rootNode) { + this._updatesMade = false; + this._rootNode = rootNode || new NullNode(); + } + Object.defineProperty(Partition.prototype, "rootNode", { + get: function () { + return this._rootNode; + }, + enumerable: true, + configurable: true + }); + + Partition.prototype.traverse = function (traverser) { + if (this._updatesMade) + this.updateEntities(); + + this._rootNode.acceptTraverser(traverser); + }; + + Partition.prototype.iMarkForUpdate = function (entity) { + var node = entity.partitionNode; + var t = this._updateQueue; + + while (t) { + if (node == t) + return; + + t = t._iUpdateQueueNext; + } + + node._iUpdateQueueNext = this._updateQueue; + + this._updateQueue = node; + this._updatesMade = true; + }; + + Partition.prototype.iRemoveEntity = function (entity) { + var node = entity.partitionNode; + var t; + + node.removeFromParent(); + + if (node == this._updateQueue) { + this._updateQueue = node._iUpdateQueueNext; + } else { + t = this._updateQueue; + while (t && t._iUpdateQueueNext != node) + t = t._iUpdateQueueNext; + + if (t) + t._iUpdateQueueNext = node._iUpdateQueueNext; + } + + node._iUpdateQueueNext = null; + + if (!this._updateQueue) + this._updatesMade = false; + }; + + Partition.prototype.updateEntities = function () { + var node = this._updateQueue; + var targetNode; + var t; + this._updateQueue = null; + this._updatesMade = false; + + do { + targetNode = this._rootNode.findPartitionForEntity(node.entity); + + if (node.parent != targetNode) { + if (node) + node.removeFromParent(); + + targetNode.iAddNode(node); + } + + t = node._iUpdateQueueNext; + node._iUpdateQueueNext = null; + + //required for controllers with autoUpdate set to true + node.entity._iInternalUpdate(); + } while((node = t) != null); + }; + return Partition; +})(); + +module.exports = Partition; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL1BhcnRpdGlvbi50cyJdLCJuYW1lcyI6WyJQYXJ0aXRpb24iLCJQYXJ0aXRpb24uY29uc3RydWN0b3IiLCJQYXJ0aXRpb24udHJhdmVyc2UiLCJQYXJ0aXRpb24uaU1hcmtGb3JVcGRhdGUiLCJQYXJ0aXRpb24uaVJlbW92ZUVudGl0eSIsIlBhcnRpdGlvbi51cGRhdGVFbnRpdGllcyJdLCJtYXBwaW5ncyI6IkFBQUEsaUVBRzBFOztBQUcxRTs7RUFFRztBQUNIO0lBT0NBLG1CQUFZQSxRQUFpQkE7UUFIN0JDLEtBQVFBLFlBQVlBLEdBQVdBLEtBQUtBLENBQUNBO1FBS3BDQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxRQUFRQSxJQUFlQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTtJQUN2REEsQ0FBQ0E7SUFFREQ7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsU0FBU0E7UUFDdEJBLENBQUNBOzs7O0FBQUFBO0lBRURBLCtCQUFBQSxVQUFnQkEsU0FBb0JBO1FBRW5DRSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQTtZQUNwQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRXZCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxlQUFlQSxDQUFDQSxTQUFTQSxDQUFDQTtJQUMxQ0EsQ0FBQ0E7O0lBRURGLHFDQUFBQSxVQUFzQkEsTUFBb0JBO1FBRXpDRyxJQUFJQSxJQUFJQSxHQUFjQSxNQUFNQSxDQUFDQSxhQUFhQTtRQUMxQ0EsSUFBSUEsQ0FBQ0EsR0FBY0EsSUFBSUEsQ0FBQ0EsWUFBWUE7O1FBRXBDQSxPQUFPQSxDQUFDQSxDQUFFQTtZQUNUQSxJQUFJQSxJQUFJQSxJQUFJQSxDQUFDQTtnQkFDWkEsTUFBT0EsQ0FBQUE7O1lBRVJBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLGlCQUFpQkE7U0FDdkJBOztRQUVEQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLElBQUlBLENBQUNBLFlBQVlBOztRQUUxQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUE7UUFDeEJBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLElBQUlBO0lBQ3pCQSxDQUFDQTs7SUFFREgsb0NBQUFBLFVBQXFCQSxNQUFvQkE7UUFFeENJLElBQUlBLElBQUlBLEdBQWNBLE1BQU1BLENBQUNBLGFBQWFBO1FBQzFDQSxJQUFJQSxDQUFDQTs7UUFFTEEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQTs7UUFFdkJBLElBQUlBLElBQUlBLElBQUlBLElBQUlBLENBQUNBLFlBQVlBLENBQUVBO1lBQzlCQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBO1NBQzFDQSxLQUFNQTtZQUNOQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxZQUFZQTtZQUNyQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsaUJBQWlCQSxJQUFJQSxJQUFJQTtnQkFDdENBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLGlCQUFpQkEsQ0FBQ0E7O1lBRXpCQSxJQUFJQSxDQUFDQTtnQkFDSkEsQ0FBQ0EsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQzlDQTs7UUFFREEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxJQUFJQTs7UUFFN0JBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFlBQVlBO1lBQ3JCQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxLQUFLQSxDQUFDQTtJQUM1QkEsQ0FBQ0E7O0lBRURKLHFDQUFBQTtRQUVDSyxJQUFJQSxJQUFJQSxHQUFjQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN2Q0EsSUFBSUEsVUFBVUE7UUFDZEEsSUFBSUEsQ0FBQ0E7UUFDTEEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUE7UUFDeEJBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLEtBQUtBOztRQUV6QkEsRUFBR0E7WUFDRkEsVUFBVUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTs7WUFFL0RBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLElBQUlBLFVBQVVBLENBQUVBO2dCQUM5QkEsSUFBSUEsSUFBSUE7b0JBQ1BBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O2dCQUV6QkEsVUFBVUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7YUFDekJBOztZQUVEQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBO1lBQzFCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLElBQUlBOztZQUU3QkEsc0RBQXNEQTtZQUN0REEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQTtTQUU5QkEsTUFBTUEsQ0FBRUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBRUE7SUFDOUJBLENBQUNBO0lBQ0ZMLGlCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDBCQUFtQixDQUFBIiwiZmlsZSI6ImNvcmUvcGFydGl0aW9uL1BhcnRpdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgRW50aXR5Tm9kZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vRW50aXR5Tm9kZVwiKTtcbmltcG9ydCBOb2RlQmFzZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9Ob2RlQmFzZVwiKTtcbmltcG9ydCBOdWxsTm9kZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9OdWxsTm9kZVwiKTtcbmltcG9ydCBJQ29sbGVjdG9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0lDb2xsZWN0b3JcIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkucGFydGl0aW9uLlBhcnRpdGlvblxuICovXG5jbGFzcyBQYXJ0aXRpb25cbntcblxuXHRwdWJsaWMgX3Jvb3ROb2RlOk5vZGVCYXNlO1xuXHRwcml2YXRlIF91cGRhdGVzTWFkZTpCb29sZWFuID0gZmFsc2U7XG5cdHByaXZhdGUgX3VwZGF0ZVF1ZXVlOkVudGl0eU5vZGU7XG5cblx0Y29uc3RydWN0b3Iocm9vdE5vZGU6Tm9kZUJhc2UpXG5cdHtcblx0XHR0aGlzLl9yb290Tm9kZSA9IHJvb3ROb2RlIHx8IDxOb2RlQmFzZT4gbmV3IE51bGxOb2RlKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHJvb3ROb2RlKCk6Tm9kZUJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9yb290Tm9kZTtcblx0fVxuXG5cdHB1YmxpYyB0cmF2ZXJzZSh0cmF2ZXJzZXI6SUNvbGxlY3Rvcilcblx0e1xuXHRcdGlmICh0aGlzLl91cGRhdGVzTWFkZSlcblx0XHRcdHRoaXMudXBkYXRlRW50aXRpZXMoKTtcblxuXHRcdHRoaXMuX3Jvb3ROb2RlLmFjY2VwdFRyYXZlcnNlcih0cmF2ZXJzZXIpO1xuXHR9XG5cblx0cHVibGljIGlNYXJrRm9yVXBkYXRlKGVudGl0eTpEaXNwbGF5T2JqZWN0KVxuXHR7XG5cdFx0dmFyIG5vZGU6RW50aXR5Tm9kZSA9IGVudGl0eS5wYXJ0aXRpb25Ob2RlO1xuXHRcdHZhciB0OkVudGl0eU5vZGUgPSB0aGlzLl91cGRhdGVRdWV1ZTtcblxuXHRcdHdoaWxlICh0KSB7XG5cdFx0XHRpZiAobm9kZSA9PSB0KVxuXHRcdFx0XHRyZXR1cm47XG5cblx0XHRcdHQgPSB0Ll9pVXBkYXRlUXVldWVOZXh0O1xuXHRcdH1cblxuXHRcdG5vZGUuX2lVcGRhdGVRdWV1ZU5leHQgPSB0aGlzLl91cGRhdGVRdWV1ZTtcblxuXHRcdHRoaXMuX3VwZGF0ZVF1ZXVlID0gbm9kZTtcblx0XHR0aGlzLl91cGRhdGVzTWFkZSA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgaVJlbW92ZUVudGl0eShlbnRpdHk6RGlzcGxheU9iamVjdClcblx0e1xuXHRcdHZhciBub2RlOkVudGl0eU5vZGUgPSBlbnRpdHkucGFydGl0aW9uTm9kZTtcblx0XHR2YXIgdDpFbnRpdHlOb2RlO1xuXG5cdFx0bm9kZS5yZW1vdmVGcm9tUGFyZW50KCk7XG5cblx0XHRpZiAobm9kZSA9PSB0aGlzLl91cGRhdGVRdWV1ZSkge1xuXHRcdFx0dGhpcy5fdXBkYXRlUXVldWUgPSBub2RlLl9pVXBkYXRlUXVldWVOZXh0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0ID0gdGhpcy5fdXBkYXRlUXVldWU7XG5cdFx0XHR3aGlsZSAodCAmJiB0Ll9pVXBkYXRlUXVldWVOZXh0ICE9IG5vZGUpXG5cdFx0XHRcdHQgPSB0Ll9pVXBkYXRlUXVldWVOZXh0O1xuXG5cdFx0XHRpZiAodClcblx0XHRcdFx0dC5faVVwZGF0ZVF1ZXVlTmV4dCA9IG5vZGUuX2lVcGRhdGVRdWV1ZU5leHQ7XG5cdFx0fVxuXG5cdFx0bm9kZS5faVVwZGF0ZVF1ZXVlTmV4dCA9IG51bGw7XG5cblx0XHRpZiAoIXRoaXMuX3VwZGF0ZVF1ZXVlKVxuXHRcdFx0dGhpcy5fdXBkYXRlc01hZGUgPSBmYWxzZTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlRW50aXRpZXMoKVxuXHR7XG5cdFx0dmFyIG5vZGU6RW50aXR5Tm9kZSA9IHRoaXMuX3VwZGF0ZVF1ZXVlO1xuXHRcdHZhciB0YXJnZXROb2RlOk5vZGVCYXNlO1xuXHRcdHZhciB0OkVudGl0eU5vZGU7XG5cdFx0dGhpcy5fdXBkYXRlUXVldWUgPSBudWxsO1xuXHRcdHRoaXMuX3VwZGF0ZXNNYWRlID0gZmFsc2U7XG5cblx0XHRkbyB7XG5cdFx0XHR0YXJnZXROb2RlID0gdGhpcy5fcm9vdE5vZGUuZmluZFBhcnRpdGlvbkZvckVudGl0eShub2RlLmVudGl0eSk7XG5cblx0XHRcdGlmIChub2RlLnBhcmVudCAhPSB0YXJnZXROb2RlKSB7XG5cdFx0XHRcdGlmIChub2RlKVxuXHRcdFx0XHRcdG5vZGUucmVtb3ZlRnJvbVBhcmVudCgpO1xuXG5cdFx0XHRcdHRhcmdldE5vZGUuaUFkZE5vZGUobm9kZSk7XG5cdFx0XHR9XG5cblx0XHRcdHQgPSBub2RlLl9pVXBkYXRlUXVldWVOZXh0O1xuXHRcdFx0bm9kZS5faVVwZGF0ZVF1ZXVlTmV4dCA9IG51bGw7XG5cblx0XHRcdC8vcmVxdWlyZWQgZm9yIGNvbnRyb2xsZXJzIHdpdGggYXV0b1VwZGF0ZSBzZXQgdG8gdHJ1ZVxuXHRcdFx0bm9kZS5lbnRpdHkuX2lJbnRlcm5hbFVwZGF0ZSgpO1xuXG5cdFx0fSB3aGlsZSAoKG5vZGUgPSB0KSAhPSBudWxsKTtcblx0fVxufVxuXG5leHBvcnQgPSBQYXJ0aXRpb247Il19 \ No newline at end of file diff --git a/lib/core/partition/Partition.ts b/lib/core/partition/Partition.ts new file mode 100644 index 00000000..83e57f05 --- /dev/null +++ b/lib/core/partition/Partition.ts @@ -0,0 +1,105 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import NullNode = require("awayjs-core/lib/core/partition/NullNode"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + +/** + * @class away.partition.Partition + */ +class Partition +{ + + public _rootNode:NodeBase; + private _updatesMade:Boolean = false; + private _updateQueue:EntityNode; + + constructor(rootNode:NodeBase) + { + this._rootNode = rootNode || new NullNode(); + } + + public get rootNode():NodeBase + { + return this._rootNode; + } + + public traverse(traverser:ICollector) + { + if (this._updatesMade) + this.updateEntities(); + + this._rootNode.acceptTraverser(traverser); + } + + public iMarkForUpdate(entity:DisplayObject) + { + var node:EntityNode = entity.partitionNode; + var t:EntityNode = this._updateQueue; + + while (t) { + if (node == t) + return; + + t = t._iUpdateQueueNext; + } + + node._iUpdateQueueNext = this._updateQueue; + + this._updateQueue = node; + this._updatesMade = true; + } + + public iRemoveEntity(entity:DisplayObject) + { + var node:EntityNode = entity.partitionNode; + var t:EntityNode; + + node.removeFromParent(); + + if (node == this._updateQueue) { + this._updateQueue = node._iUpdateQueueNext; + } else { + t = this._updateQueue; + while (t && t._iUpdateQueueNext != node) + t = t._iUpdateQueueNext; + + if (t) + t._iUpdateQueueNext = node._iUpdateQueueNext; + } + + node._iUpdateQueueNext = null; + + if (!this._updateQueue) + this._updatesMade = false; + } + + private updateEntities() + { + var node:EntityNode = this._updateQueue; + var targetNode:NodeBase; + var t:EntityNode; + this._updateQueue = null; + this._updatesMade = false; + + do { + targetNode = this._rootNode.findPartitionForEntity(node.entity); + + if (node.parent != targetNode) { + if (node) + node.removeFromParent(); + + targetNode.iAddNode(node); + } + + t = node._iUpdateQueueNext; + node._iUpdateQueueNext = null; + + //required for controllers with autoUpdate set to true + node.entity._iInternalUpdate(); + + } while ((node = t) != null); + } +} + +export = Partition; \ No newline at end of file diff --git a/lib/core/partition/PointLightNode.js b/lib/core/partition/PointLightNode.js new file mode 100755 index 00000000..00ec8b6a --- /dev/null +++ b/lib/core/partition/PointLightNode.js @@ -0,0 +1,43 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* @class away.partition.PointLightNode +*/ +var PointLightNode = (function (_super) { + __extends(PointLightNode, _super); + /** + * + * @param pointLight + */ + function PointLightNode(pointLight) { + _super.call(this, pointLight); + + this._pointLight = pointLight; + } + /** + * @inheritDoc + */ + PointLightNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applyPointLight(this._pointLight); + }; + + /** + * + * @returns {boolean} + */ + PointLightNode.prototype.isCastingShadow = function () { + return false; + }; + return PointLightNode; +})(EntityNode); + +module.exports = PointLightNode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL1BvaW50TGlnaHROb2RlLnRzIl0sIm5hbWVzIjpbIlBvaW50TGlnaHROb2RlIiwiUG9pbnRMaWdodE5vZGUuY29uc3RydWN0b3IiLCJQb2ludExpZ2h0Tm9kZS5hY2NlcHRUcmF2ZXJzZXIiLCJQb2ludExpZ2h0Tm9kZS5pc0Nhc3RpbmdTaGFkb3ciXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFFQUM2RTs7QUFJN0U7O0VBRUc7QUFDSDtJQUE2QkEsaUNBQVVBO0lBUXRDQTs7O01BREdBO0lBQ0hBLHdCQUFZQSxVQUFrQkE7UUFFN0JDLFdBQU1BLE9BQUFBLFVBQVVBLENBQUNBOztRQUVqQkEsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsVUFBVUE7SUFDOUJBLENBQUNBO0lBS0REOztNQURHQTsrQ0FDSEEsVUFBdUJBLFNBQW9CQTtRQUUxQ0UsSUFBSUEsU0FBU0EsQ0FBQ0EsU0FBU0EsQ0FBWUEsSUFBSUEsQ0FBQ0E7WUFDdkNBLFNBQVNBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO0lBQzlDQSxDQUFDQTs7SUFNREY7OztNQURHQTsrQ0FDSEE7UUFFQ0csT0FBT0EsS0FBS0E7SUFDYkEsQ0FBQ0E7SUFDRkgsc0JBQUNBO0FBQURBLENBQUNBLEVBaEM0QixVQUFVLEVBZ0N0Qzs7QUFFRCwrQkFBd0IsQ0FBQSIsImZpbGUiOiJjb3JlL3BhcnRpdGlvbi9Qb2ludExpZ2h0Tm9kZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBOb2RlQmFzZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9Ob2RlQmFzZVwiKTtcbmltcG9ydCBFbnRpdHlOb2RlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9FbnRpdHlOb2RlXCIpO1xuaW1wb3J0IElDb2xsZWN0b3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvdHJhdmVyc2UvSUNvbGxlY3RvclwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkucGFydGl0aW9uLlBvaW50TGlnaHROb2RlXG4gKi9cbmNsYXNzIFBvaW50TGlnaHROb2RlIGV4dGVuZHMgRW50aXR5Tm9kZVxue1xuXHRwcml2YXRlIF9wb2ludExpZ2h0OklFbnRpdHk7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBwb2ludExpZ2h0XG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihwb2ludExpZ2h0OklFbnRpdHkpXG5cdHtcblx0XHRzdXBlcihwb2ludExpZ2h0KTtcblxuXHRcdHRoaXMuX3BvaW50TGlnaHQgPSBwb2ludExpZ2h0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgYWNjZXB0VHJhdmVyc2VyKHRyYXZlcnNlcjpJQ29sbGVjdG9yKVxuXHR7XG5cdFx0aWYgKHRyYXZlcnNlci5lbnRlck5vZGUoPE5vZGVCYXNlPiB0aGlzKSlcblx0XHRcdHRyYXZlcnNlci5hcHBseVBvaW50TGlnaHQodGhpcy5fcG9pbnRMaWdodCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqL1xuXHRwdWJsaWMgaXNDYXN0aW5nU2hhZG93KCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmV4cG9ydCA9IFBvaW50TGlnaHROb2RlOyJdfQ== \ No newline at end of file diff --git a/lib/core/partition/PointLightNode.ts b/lib/core/partition/PointLightNode.ts new file mode 100644 index 00000000..a366f0f6 --- /dev/null +++ b/lib/core/partition/PointLightNode.ts @@ -0,0 +1,43 @@ +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.partition.PointLightNode + */ +class PointLightNode extends EntityNode +{ + private _pointLight:IEntity; + + /** + * + * @param pointLight + */ + constructor(pointLight:IEntity) + { + super(pointLight); + + this._pointLight = pointLight; + } + + /** + * @inheritDoc + */ + public acceptTraverser(traverser:ICollector) + { + if (traverser.enterNode( this)) + traverser.applyPointLight(this._pointLight); + } + + /** + * + * @returns {boolean} + */ + public isCastingShadow():boolean + { + return false; + } +} + +export = PointLightNode; \ No newline at end of file diff --git a/lib/core/partition/SkyboxNode.js b/lib/core/partition/SkyboxNode.js new file mode 100755 index 00000000..569a770c --- /dev/null +++ b/lib/core/partition/SkyboxNode.js @@ -0,0 +1,51 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +/** +* SkyboxNode is a space partitioning leaf node that contains a Skybox object. +* +* @class away.partition.SkyboxNode +*/ +var SkyboxNode = (function (_super) { + __extends(SkyboxNode, _super); + /** + * Creates a new SkyboxNode object. + * @param skyBox The Skybox to be contained in the node. + */ + function SkyboxNode(skyBox) { + _super.call(this, skyBox); + + this._skyBox = skyBox; + } + /** + * @inheritDoc + */ + SkyboxNode.prototype.acceptTraverser = function (traverser) { + if (traverser.enterNode(this)) + traverser.applySkybox(this._skyBox); + }; + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + */ + SkyboxNode.prototype.isInFrustum = function (planes, numPlanes) { + if (!this._skyBox._iIsVisible) + return false; + + //a skybox is always in view unless its visibility is set to false + return true; + }; + return SkyboxNode; +})(EntityNode); + +module.exports = SkyboxNode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGFydGl0aW9uL1NreWJveE5vZGUudHMiXSwibmFtZXMiOlsiU2t5Ym94Tm9kZSIsIlNreWJveE5vZGUuY29uc3RydWN0b3IiLCJTa3lib3hOb2RlLmFjY2VwdFRyYXZlcnNlciIsIlNreWJveE5vZGUuaXNJbkZydXN0dW0iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHFFQUU2RTs7QUFJN0U7Ozs7RUFJRztBQUNIO0lBQXlCQSw2QkFBVUE7SUFRbENBOzs7TUFER0E7SUFDSEEsb0JBQVlBLE1BQWNBO1FBRXpCQyxXQUFNQSxPQUFBQSxNQUFNQSxDQUFDQTs7UUFFYkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsTUFBTUE7SUFDdEJBLENBQUNBO0lBS0REOztNQURHQTsyQ0FDSEEsVUFBdUJBLFNBQW9CQTtRQUUxQ0UsSUFBSUEsU0FBU0EsQ0FBQ0EsU0FBU0EsQ0FBWUEsSUFBSUEsQ0FBQ0E7WUFDdkNBLFNBQVNBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO0lBQ3RDQSxDQUFDQTs7SUFRREY7Ozs7O01BREdBO3VDQUNIQSxVQUFtQkEsTUFBcUJBLEVBQUVBLFNBQWdCQTtRQUV6REcsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsV0FBV0E7WUFDNUJBLE9BQU9BLEtBQUtBLENBQUNBOztRQUVkQSxrRUFBa0VBO1FBQ2xFQSxPQUFPQSxJQUFJQTtJQUNaQSxDQUFDQTtJQUNGSCxrQkFBQ0E7QUFBREEsQ0FBQ0EsRUF0Q3dCLFVBQVUsRUFzQ2xDOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImNvcmUvcGFydGl0aW9uL1NreWJveE5vZGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGxhbmUzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUGxhbmUzRFwiKTtcbmltcG9ydCBOb2RlQmFzZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9Ob2RlQmFzZVwiKTtcbmltcG9ydCBFbnRpdHlOb2RlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9FbnRpdHlOb2RlXCIpO1xuaW1wb3J0IElDb2xsZWN0b3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvdHJhdmVyc2UvSUNvbGxlY3RvclwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5cbi8qKlxuICogU2t5Ym94Tm9kZSBpcyBhIHNwYWNlIHBhcnRpdGlvbmluZyBsZWFmIG5vZGUgdGhhdCBjb250YWlucyBhIFNreWJveCBvYmplY3QuXG4gKlxuICogQGNsYXNzIGF3YXkucGFydGl0aW9uLlNreWJveE5vZGVcbiAqL1xuY2xhc3MgU2t5Ym94Tm9kZSBleHRlbmRzIEVudGl0eU5vZGVcbntcblx0cHJpdmF0ZSBfc2t5Qm94OklFbnRpdHk7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgU2t5Ym94Tm9kZSBvYmplY3QuXG5cdCAqIEBwYXJhbSBza3lCb3ggVGhlIFNreWJveCB0byBiZSBjb250YWluZWQgaW4gdGhlIG5vZGUuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcihza3lCb3g6SUVudGl0eSlcblx0e1xuXHRcdHN1cGVyKHNreUJveCk7XG5cblx0XHR0aGlzLl9za3lCb3ggPSBza3lCb3g7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBhY2NlcHRUcmF2ZXJzZXIodHJhdmVyc2VyOklDb2xsZWN0b3IpXG5cdHtcblx0XHRpZiAodHJhdmVyc2VyLmVudGVyTm9kZSg8Tm9kZUJhc2U+IHRoaXMpKVxuXHRcdFx0dHJhdmVyc2VyLmFwcGx5U2t5Ym94KHRoaXMuX3NreUJveCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHBsYW5lc1xuXHQgKiBAcGFyYW0gbnVtUGxhbmVzXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cHVibGljIGlzSW5GcnVzdHVtKHBsYW5lczpBcnJheTxQbGFuZTNEPiwgbnVtUGxhbmVzOm51bWJlcik6Ym9vbGVhblxuXHR7XG5cdFx0aWYgKCF0aGlzLl9za3lCb3guX2lJc1Zpc2libGUpXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cblx0XHQvL2Egc2t5Ym94IGlzIGFsd2F5cyBpbiB2aWV3IHVubGVzcyBpdHMgdmlzaWJpbGl0eSBpcyBzZXQgdG8gZmFsc2Vcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxufVxuXG5leHBvcnQgPSBTa3lib3hOb2RlOyJdfQ== \ No newline at end of file diff --git a/lib/core/partition/SkyboxNode.ts b/lib/core/partition/SkyboxNode.ts new file mode 100644 index 00000000..6dbcbca3 --- /dev/null +++ b/lib/core/partition/SkyboxNode.ts @@ -0,0 +1,52 @@ +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * SkyboxNode is a space partitioning leaf node that contains a Skybox object. + * + * @class away.partition.SkyboxNode + */ +class SkyboxNode extends EntityNode +{ + private _skyBox:IEntity; + + /** + * Creates a new SkyboxNode object. + * @param skyBox The Skybox to be contained in the node. + */ + constructor(skyBox:IEntity) + { + super(skyBox); + + this._skyBox = skyBox; + } + + /** + * @inheritDoc + */ + public acceptTraverser(traverser:ICollector) + { + if (traverser.enterNode( this)) + traverser.applySkybox(this._skyBox); + } + + /** + * + * @param planes + * @param numPlanes + * @returns {boolean} + */ + public isInFrustum(planes:Array, numPlanes:number):boolean + { + if (!this._skyBox._iIsVisible) + return false; + + //a skybox is always in view unless its visibility is set to false + return true; + } +} + +export = SkyboxNode; \ No newline at end of file diff --git a/lib/core/pick/IPicker.js b/lib/core/pick/IPicker.js new file mode 100755 index 00000000..424afc13 --- /dev/null +++ b/lib/core/pick/IPicker.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGljay9JUGlja2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBeUNpQiIsImZpbGUiOiJjb3JlL3BpY2svSVBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTY2VuZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1NjZW5lXCIpO1xuaW1wb3J0IFZpZXdcdFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1ZpZXdcIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuaW1wb3J0IFBpY2tpbmdDb2xsaXNpb25WT1x0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BpY2svUGlja2luZ0NvbGxpc2lvblZPXCIpO1xuXG4vKipcbiAqIFByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgcGlja2luZyBvYmplY3RzIHRoYXQgY2FuIHBpY2sgM2Qgb2JqZWN0cyBmcm9tIGEgdmlldyBvciBzY2VuZS5cbiAqXG4gKiBAaW50ZXJmYWNlIGF3YXkucGljay5JUGlja2VyXG4gKi9cbmludGVyZmFjZSBJUGlja2VyXG57XG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBjb2xsaXNpb24gb2JqZWN0IGZyb20gdGhlIHNjcmVlbiBjb29yZGluYXRlcyBvZiB0aGUgcGlja2luZyByYXkuXG5cdCAqXG5cdCAqIEBwYXJhbSB4IFRoZSB4IGNvb3JkaW5hdGUgb2YgdGhlIHBpY2tpbmcgcmF5IGluIHNjcmVlbi1zcGFjZS5cblx0ICogQHBhcmFtIHkgVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgcGlja2luZyByYXkgaW4gc2NyZWVuLXNwYWNlLlxuXHQgKiBAcGFyYW0gdmlldyBUaGUgdmlldyBvbiB3aGljaCB0aGUgcGlja2luZyBvYmplY3QgYWN0cy5cblx0ICovXG5cdGdldFZpZXdDb2xsaXNpb24oeDpudW1iZXIsIHk6bnVtYmVyLCB2aWV3OlZpZXcpOlBpY2tpbmdDb2xsaXNpb25WTztcblxuXHQvKipcblx0ICogR2V0cyB0aGUgY29sbGlzaW9uIG9iamVjdCBmcm9tIHRoZSBzY2VuZSBwb3NpdGlvbiBhbmQgZGlyZWN0aW9uIG9mIHRoZSBwaWNraW5nIHJheS5cblx0ICpcblx0ICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBvZiB0aGUgcGlja2luZyByYXkgaW4gc2NlbmUtc3BhY2UuXG5cdCAqIEBwYXJhbSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbiBvZiB0aGUgcGlja2luZyByYXkgaW4gc2NlbmUtc3BhY2UuXG5cdCAqIEBwYXJhbSBzY2VuZSBUaGUgc2NlbmUgb24gd2hpY2ggdGhlIHBpY2tpbmcgb2JqZWN0IGFjdHMuXG5cdCAqL1xuXHRnZXRTY2VuZUNvbGxpc2lvbihwb3NpdGlvbjpWZWN0b3IzRCwgZGlyZWN0aW9uOlZlY3RvcjNELCBzY2VuZTpTY2VuZSk6UGlja2luZ0NvbGxpc2lvblZPO1xuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBpY2tlciB0YWtlcyBhY2NvdW50IG9mIHRoZSBtb3VzZUVuYWJsZWQgcHJvcGVydGllcyBvZiBlbnRpdGllcy4gRGVmYXVsdHMgdG8gdHJ1ZS5cblx0ICovXG5cdG9ubHlNb3VzZUVuYWJsZWQ6Ym9vbGVhbjsgLy8gR0VUIC8gU0VUXG5cblx0LyoqXG5cdCAqIERpc3Bvc2VzIG1lbW9yeSB1c2VkIGJ5IHRoZSBJUGlja2VyIG9iamVjdFxuXHQgKi9cblx0ZGlzcG9zZSgpO1xufVxuXG5leHBvcnQgPSBJUGlja2VyOyJdfQ== \ No newline at end of file diff --git a/lib/core/pick/IPicker.ts b/lib/core/pick/IPicker.ts new file mode 100644 index 00000000..c9c360d4 --- /dev/null +++ b/lib/core/pick/IPicker.ts @@ -0,0 +1,42 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import View = require("awayjs-core/lib/containers/View"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); + +/** + * Provides an interface for picking objects that can pick 3d objects from a view or scene. + * + * @interface away.pick.IPicker + */ +interface IPicker +{ + /** + * Gets the collision object from the screen coordinates of the picking ray. + * + * @param x The x coordinate of the picking ray in screen-space. + * @param y The y coordinate of the picking ray in screen-space. + * @param view The view on which the picking object acts. + */ + getViewCollision(x:number, y:number, view:View):PickingCollisionVO; + + /** + * Gets the collision object from the scene position and direction of the picking ray. + * + * @param position The position of the picking ray in scene-space. + * @param direction The direction of the picking ray in scene-space. + * @param scene The scene on which the picking object acts. + */ + getSceneCollision(position:Vector3D, direction:Vector3D, scene:Scene):PickingCollisionVO; + + /** + * Determines whether the picker takes account of the mouseEnabled properties of entities. Defaults to true. + */ + onlyMouseEnabled:boolean; // GET / SET + + /** + * Disposes memory used by the IPicker object + */ + dispose(); +} + +export = IPicker; \ No newline at end of file diff --git a/lib/core/pick/IPickingCollider.js b/lib/core/pick/IPickingCollider.js new file mode 100755 index 00000000..24f8c123 --- /dev/null +++ b/lib/core/pick/IPickingCollider.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGljay9JUGlja2luZ0NvbGxpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBMkMwQiIsImZpbGUiOiJjb3JlL3BpY2svSVBpY2tpbmdDb2xsaWRlci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgUGlja2luZ0NvbGxpc2lvblZPXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGljay9QaWNraW5nQ29sbGlzaW9uVk9cIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9JRW50aXR5XCIpO1xuXG4vKipcbiAqIFByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgcGlja2luZyBjb2xsaWRlcnMgdGhhdCBjYW4gYmUgYXNzaWduZWQgdG8gaW5kaXZpZHVhbCBlbnRpdGllcyBpbiBhIHNjZW5lIGZvciBzcGVjaWZpYyBwaWNraW5nIGJlaGF2aW91ci5cbiAqIFVzZWQgd2l0aCB0aGUgPGNvZGU+UmF5Y2FzdFBpY2tlcjwvY29kZT4gcGlja2luZyBvYmplY3QuXG4gKlxuICogQHNlZSBhd2F5LmVudGl0aWVzLkVudGl0eSNwaWNraW5nQ29sbGlkZXJcbiAqIEBzZWUgYXdheS5waWNrLlJheWNhc3RQaWNrZXJcbiAqXG4gKiBAaW50ZXJmYWNlIGF3YXkucGljay5JUGlja2luZ0NvbGxpZGVyXG4gKi9cbmludGVyZmFjZSBJUGlja2luZ0NvbGxpZGVyXG57XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwb3NpdGlvbiBhbmQgZGlyZWN0aW9uIG9mIGEgcGlja2luZyByYXkgaW4gbG9jYWwgY29vcmRpbmF0ZXMgdG8gdGhlIGVudGl0eS5cblx0ICpcblx0ICogQHBhcmFtIGxvY2FsRGlyZWN0aW9uIFRoZSBwb3NpdGlvbiB2ZWN0b3IgaW4gbG9jYWwgY29vcmRpbmF0ZXNcblx0ICogQHBhcmFtIGxvY2FsUG9zaXRpb24gVGhlIGRpcmVjdGlvbiB2ZWN0b3IgaW4gbG9jYWwgY29vcmRpbmF0ZXNcblx0ICovXG5cdHNldExvY2FsUmF5KGxvY2FsUG9zaXRpb246VmVjdG9yM0QsIGxvY2FsRGlyZWN0aW9uOlZlY3RvcjNEKTtcblxuXHQvKipcblx0ICogVGVzdHMgYSA8Y29kZT5CaWxsYm9hcmQ8L2NvZGU+IG9iamVjdCBmb3IgYSBjb2xsaXNpb24gd2l0aCB0aGUgcGlja2luZyByYXkuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSBpbnN0YW5jZSB0byBiZSB0ZXN0ZWQuXG5cdCAqIEBwYXJhbSBwaWNraW5nQ29sbGlzaW9uVk8gVGhlIGNvbGxpc2lvbiBvYmplY3QgdXNlZCB0byBzdG9yZSB0aGUgY29sbGlzaW9uIHJlc3VsdHNcblx0ICogQHBhcmFtIHNob3J0ZXN0Q29sbGlzaW9uRGlzdGFuY2UgVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNob3J0ZXN0IGRpc3RhbmNlIHRvIGEgZGV0ZWN0ZWQgY29sbGlzaW9uIGFsb25nIHRoZSByYXkuXG5cdCAqL1xuXHR0ZXN0QmlsbGJvYXJkQ29sbGlzaW9uKGVudGl0eTpJRW50aXR5LCBwaWNraW5nQ29sbGlzaW9uVk86UGlja2luZ0NvbGxpc2lvblZPLCBzaG9ydGVzdENvbGxpc2lvbkRpc3RhbmNlOm51bWJlcik6Ym9vbGVhblxuXG5cdC8qKlxuXHQgKiBUZXN0cyBhIDxjb2RlPk1lc2g8L2NvZGU+IG9iamVjdCBmb3IgYSBjb2xsaXNpb24gd2l0aCB0aGUgcGlja2luZyByYXkuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSBpbnN0YW5jZSB0byBiZSB0ZXN0ZWQuXG5cdCAqIEBwYXJhbSBwaWNraW5nQ29sbGlzaW9uVk8gVGhlIGNvbGxpc2lvbiBvYmplY3QgdXNlZCB0byBzdG9yZSB0aGUgY29sbGlzaW9uIHJlc3VsdHNcblx0ICogQHBhcmFtIHNob3J0ZXN0Q29sbGlzaW9uRGlzdGFuY2UgVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNob3J0ZXN0IGRpc3RhbmNlIHRvIGEgZGV0ZWN0ZWQgY29sbGlzaW9uIGFsb25nIHRoZSByYXkuXG5cdCAqIEBwYXJhbSBmaW5kQ2xvc2VzdFxuXHQgKi9cblx0dGVzdE1lc2hDb2xsaXNpb24oZW50aXR5OklFbnRpdHksIHBpY2tpbmdDb2xsaXNpb25WTzpQaWNraW5nQ29sbGlzaW9uVk8sIHNob3J0ZXN0Q29sbGlzaW9uRGlzdGFuY2U6bnVtYmVyLCBmaW5kQ2xvc2VzdDpib29sZWFuKTpib29sZWFuXG59XG5cbmV4cG9ydCA9IElQaWNraW5nQ29sbGlkZXI7Il19 \ No newline at end of file diff --git a/lib/core/pick/IPickingCollider.ts b/lib/core/pick/IPickingCollider.ts new file mode 100644 index 00000000..f90b6b88 --- /dev/null +++ b/lib/core/pick/IPickingCollider.ts @@ -0,0 +1,44 @@ +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * Provides an interface for picking colliders that can be assigned to individual entities in a scene for specific picking behaviour. + * Used with the RaycastPicker picking object. + * + * @see away.entities.Entity#pickingCollider + * @see away.pick.RaycastPicker + * + * @interface away.pick.IPickingCollider + */ +interface IPickingCollider +{ + /** + * Sets the position and direction of a picking ray in local coordinates to the entity. + * + * @param localDirection The position vector in local coordinates + * @param localPosition The direction vector in local coordinates + */ + setLocalRay(localPosition:Vector3D, localDirection:Vector3D); + + /** + * Tests a Billboard object for a collision with the picking ray. + * + * @param entity The entity instance to be tested. + * @param pickingCollisionVO The collision object used to store the collision results + * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray. + */ + testBillboardCollision(entity:IEntity, pickingCollisionVO:PickingCollisionVO, shortestCollisionDistance:number):boolean + + /** + * Tests a Mesh object for a collision with the picking ray. + * + * @param entity The entity instance to be tested. + * @param pickingCollisionVO The collision object used to store the collision results + * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray. + * @param findClosest + */ + testMeshCollision(entity:IEntity, pickingCollisionVO:PickingCollisionVO, shortestCollisionDistance:number, findClosest:boolean):boolean +} + +export = IPickingCollider; \ No newline at end of file diff --git a/lib/core/pick/PickingCollisionVO.js b/lib/core/pick/PickingCollisionVO.js new file mode 100755 index 00000000..87af55b6 --- /dev/null +++ b/lib/core/pick/PickingCollisionVO.js @@ -0,0 +1,23 @@ +/** +* Value object for a picking collision returned by a picking collider. Created as unique objects on display objects +* +* @see away.base.DisplayObject#pickingCollisionVO +* @see away.core.pick.IPickingCollider +* +* @class away.pick.PickingCollisionVO +*/ +var PickingCollisionVO = (function () { + /** + * Creates a new PickingCollisionVO object. + * + * @param entity The entity to which this collision object belongs. + */ + function PickingCollisionVO(displayObject) { + this.displayObject = displayObject; + } + return PickingCollisionVO; +})(); + +module.exports = PickingCollisionVO; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGljay9QaWNraW5nQ29sbGlzaW9uVk8udHMiXSwibmFtZXMiOlsiUGlja2luZ0NvbGxpc2lvblZPIiwiUGlja2luZ0NvbGxpc2lvblZPLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztFQVlHO0FBQ0g7SUEwRUNBOzs7O01BREdBO0lBQ0hBLDRCQUFZQSxhQUEyQkE7UUFFdENDLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLGFBQWFBO0lBQ25DQSxDQUFDQTtJQUVGRCwwQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxtQ0FBNEIsQ0FBQSIsImZpbGUiOiJjb3JlL3BpY2svUGlja2luZ0NvbGxpc2lvblZPLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvRGlzcGxheU9iamVjdFwiKTtcbmltcG9ydCBJTWF0ZXJpYWxPd25lclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JTWF0ZXJpYWxPd25lclwiKTtcbmltcG9ydCBQb2ludFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUG9pbnRcIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuXG4vKipcbiAqIFZhbHVlIG9iamVjdCBmb3IgYSBwaWNraW5nIGNvbGxpc2lvbiByZXR1cm5lZCBieSBhIHBpY2tpbmcgY29sbGlkZXIuIENyZWF0ZWQgYXMgdW5pcXVlIG9iamVjdHMgb24gZGlzcGxheSBvYmplY3RzXG4gKlxuICogQHNlZSBhd2F5LmJhc2UuRGlzcGxheU9iamVjdCNwaWNraW5nQ29sbGlzaW9uVk9cbiAqIEBzZWUgYXdheS5jb3JlLnBpY2suSVBpY2tpbmdDb2xsaWRlclxuICpcbiAqIEBjbGFzcyBhd2F5LnBpY2suUGlja2luZ0NvbGxpc2lvblZPXG4gKi9cbmNsYXNzIFBpY2tpbmdDb2xsaXNpb25WT1xue1xuXHQvKipcblx0ICogVGhlIGRpc3BsYXkgb2JqZWN0IHRvIHdoaWNoIHRoaXMgY29sbGlzaW9uIG9iamVjdCBiZWxvbmdzLlxuXHQgKi9cblx0cHVibGljIGRpc3BsYXlPYmplY3Q6RGlzcGxheU9iamVjdDtcblxuXHQvKipcblx0ICogVGhlIGxvY2FsIHBvc2l0aW9uIG9mIHRoZSBjb2xsaXNpb24gb24gdGhlIGVudGl0eSdzIHN1cmZhY2UuXG5cdCAqL1xuXHRwdWJsaWMgbG9jYWxQb3NpdGlvbjpWZWN0b3IzRDtcblxuXHQvKipcblx0ICogVGhlIGxvY2FsIG5vcm1hbCB2ZWN0b3IgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb2xsaXNpb24uXG5cdCAqL1xuXHRwdWJsaWMgbG9jYWxOb3JtYWw6VmVjdG9yM0Q7XG5cblx0LyoqXG5cdCAqIFRoZSB1diBjb29yZGluYXRlIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgY29sbGlzaW9uLlxuXHQgKi9cblx0cHVibGljIHV2OlBvaW50O1xuXG5cdC8qKlxuXHQgKiBUaGUgaW5kZXggb2YgdGhlIGZhY2Ugd2hlcmUgdGhlIGV2ZW50IHRvb2sgcGwgYWNlLlxuXHQgKi9cblx0cHVibGljIGluZGV4Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIGluZGV4IG9mIHRoZSBzdWJHZW9tZXRyeSB3aGVyZSB0aGUgZXZlbnQgdG9vayBwbGFjZS5cblx0ICovXG4vL1x0XHRwdWJsaWMgc3ViR2VvbWV0cnlJbmRleDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgY29sbGlkaW5nIHJheSBpbiBsb2NhbCBjb29yZGluYXRlcy5cblx0ICovXG5cdHB1YmxpYyBsb2NhbFJheVBvc2l0aW9uOlZlY3RvcjNEO1xuXG5cdC8qKlxuXHQgKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBjb2xsaWRpbmcgcmF5IGluIGxvY2FsIGNvb3JkaW5hdGVzLlxuXHQgKi9cblx0cHVibGljIGxvY2FsUmF5RGlyZWN0aW9uOlZlY3RvcjNEO1xuXG5cdC8qKlxuXHQgKiBUaGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgdGhlIGNvbGxpZGluZyByYXkgaW4gc2NlbmUgY29vcmRpbmF0ZXMuXG5cdCAqL1xuXHRwdWJsaWMgcmF5UG9zaXRpb246VmVjdG9yM0Q7XG5cblx0LyoqXG5cdCAqIFRoZSBkaXJlY3Rpb24gb2YgdGhlIGNvbGxpZGluZyByYXkgaW4gc2NlbmUgY29vcmRpbmF0ZXMuXG5cdCAqL1xuXHRwdWJsaWMgcmF5RGlyZWN0aW9uOlZlY3RvcjNEO1xuXG5cdC8qKlxuXHQgKiBEZXRlcm1pbmVzIGlmIHRoZSByYXkgcG9zaXRpb24gaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgZW50aXR5IGJvdW5kcy5cblx0ICpcblx0ICogQHNlZSBhd2F5M2QuZW50aXRpZXMuRW50aXR5I2JvdW5kc1xuXHQgKi9cblx0cHVibGljIHJheU9yaWdpbklzSW5zaWRlQm91bmRzOmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIFRoZSBkaXN0YW5jZSBhbG9uZyB0aGUgcmF5IGZyb20gdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIHRvIHRoZSBjYWxjdWxhdGVkIGludGVyc2VjdGlvbiBlbnRyeSBwb2ludCB3aXRoIHRoZSBlbnRpdHkuXG5cdCAqL1xuXHRwdWJsaWMgcmF5RW50cnlEaXN0YW5jZTpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSBtYXRlcmlhbCBvd253ZXIgYXNzb2NpYXRlZCB3aXRoIGEgY29sbGlzaW9uLlxuXHQgKi9cblx0cHVibGljIG1hdGVyaWFsT3duZXI6SU1hdGVyaWFsT3duZXI7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+UGlja2luZ0NvbGxpc2lvblZPPC9jb2RlPiBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHkgVGhlIGVudGl0eSB0byB3aGljaCB0aGlzIGNvbGxpc2lvbiBvYmplY3QgYmVsb25ncy5cblx0ICovXG5cdGNvbnN0cnVjdG9yKGRpc3BsYXlPYmplY3Q6RGlzcGxheU9iamVjdClcblx0e1xuXHRcdHRoaXMuZGlzcGxheU9iamVjdCA9IGRpc3BsYXlPYmplY3Q7XG5cdH1cblxufVxuXG5leHBvcnQgPSBQaWNraW5nQ29sbGlzaW9uVk87Il19 \ No newline at end of file diff --git a/lib/core/pick/PickingCollisionVO.ts b/lib/core/pick/PickingCollisionVO.ts new file mode 100644 index 00000000..ba9b0a89 --- /dev/null +++ b/lib/core/pick/PickingCollisionVO.ts @@ -0,0 +1,95 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import Point = require("awayjs-core/lib/core/geom/Point"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +/** + * Value object for a picking collision returned by a picking collider. Created as unique objects on display objects + * + * @see away.base.DisplayObject#pickingCollisionVO + * @see away.core.pick.IPickingCollider + * + * @class away.pick.PickingCollisionVO + */ +class PickingCollisionVO +{ + /** + * The display object to which this collision object belongs. + */ + public displayObject:DisplayObject; + + /** + * The local position of the collision on the entity's surface. + */ + public localPosition:Vector3D; + + /** + * The local normal vector at the position of the collision. + */ + public localNormal:Vector3D; + + /** + * The uv coordinate at the position of the collision. + */ + public uv:Point; + + /** + * The index of the face where the event took pl ace. + */ + public index:number; + + /** + * The index of the subGeometry where the event took place. + */ +// public subGeometryIndex:number; + + /** + * The starting position of the colliding ray in local coordinates. + */ + public localRayPosition:Vector3D; + + /** + * The direction of the colliding ray in local coordinates. + */ + public localRayDirection:Vector3D; + + /** + * The starting position of the colliding ray in scene coordinates. + */ + public rayPosition:Vector3D; + + /** + * The direction of the colliding ray in scene coordinates. + */ + public rayDirection:Vector3D; + + /** + * Determines if the ray position is contained within the entity bounds. + * + * @see away3d.entities.Entity#bounds + */ + public rayOriginIsInsideBounds:boolean; + + /** + * The distance along the ray from the starting position to the calculated intersection entry point with the entity. + */ + public rayEntryDistance:number; + + /** + * The material ownwer associated with a collision. + */ + public materialOwner:IMaterialOwner; + + /** + * Creates a new PickingCollisionVO object. + * + * @param entity The entity to which this collision object belongs. + */ + constructor(displayObject:DisplayObject) + { + this.displayObject = displayObject; + } + +} + +export = PickingCollisionVO; \ No newline at end of file diff --git a/lib/core/pick/RaycastPicker.js b/lib/core/pick/RaycastPicker.js new file mode 100755 index 00000000..023aa80c --- /dev/null +++ b/lib/core/pick/RaycastPicker.js @@ -0,0 +1,187 @@ +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var RaycastCollector = require("awayjs-core/lib/core/traverse/RaycastCollector"); + +/** +* Picks a 3d object from a view or scene by 3D raycast calculations. +* Performs an initial coarse boundary calculation to return a subset of entities whose bounding volumes intersect with the specified ray, +* then triggers an optional picking collider on individual entity objects to further determine the precise values of the picking ray collision. +* +* @class away.pick.RaycastPicker +*/ +var RaycastPicker = (function () { + /** + * Creates a new RaycastPicker object. + * + * @param findClosestCollision Determines whether the picker searches for the closest bounds collision along the ray, + * or simply returns the first collision encountered. Defaults to false. + */ + function RaycastPicker(findClosestCollision) { + if (typeof findClosestCollision === "undefined") { findClosestCollision = false; } + this._ignoredEntities = []; + this._onlyMouseEnabled = true; + this._numEntities = 0; + this._raycastCollector = new RaycastCollector(); + + this._findClosestCollision = findClosestCollision; + this._entities = new Array(); + } + Object.defineProperty(RaycastPicker.prototype, "onlyMouseEnabled", { + /** + * @inheritDoc + */ + get: function () { + return this._onlyMouseEnabled; + }, + set: function (value) { + this._onlyMouseEnabled = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + RaycastPicker.prototype.getViewCollision = function (x, y, view) { + //update ray + var rayPosition = view.unproject(x, y, 0); + var rayDirection = view.unproject(x, y, 1).subtract(rayPosition); + + return this.getSceneCollision(rayPosition, rayDirection, view.scene); + }; + + /** + * @inheritDoc + */ + RaycastPicker.prototype.getSceneCollision = function (rayPosition, rayDirection, scene) { + //clear collector + this._raycastCollector.clear(); + + //setup ray vectors + this._raycastCollector.rayPosition = rayPosition; + this._raycastCollector.rayDirection = rayDirection; + + // collect entities to test + scene.traversePartitions(this._raycastCollector); + + this._numEntities = 0; + var node = this._raycastCollector.entityHead; + var entity; + + while (node) { + if (!this.isIgnored(entity = node.entity)) + this._entities[this._numEntities++] = entity; + + node = node.next; + } + + //early out if no collisions detected + if (!this._numEntities) + return null; + + return this.getPickingCollisionVO(this._raycastCollector); + }; + + // public getEntityCollision(position:Vector3D, direction:Vector3D, entities:Array):PickingCollisionVO + // { + // this._numEntities = 0; + // + // var entity:IEntity; + // var l:number = entities.length; + // + // for (var c:number = 0; c < l; c++) { + // entity = entities[c]; + // + // if (entity.isIntersectingRay(position, direction)) + // this._entities[this._numEntities++] = entity; + // } + // + // return this.getPickingCollisionVO(this._raycastCollector); + // } + RaycastPicker.prototype.setIgnoreList = function (entities) { + this._ignoredEntities = entities; + }; + + RaycastPicker.prototype.isIgnored = function (entity) { + if (this._onlyMouseEnabled && !entity._iIsMouseEnabled()) + return true; + + var len = this._ignoredEntities.length; + for (var i = 0; i < len; i++) + if (this._ignoredEntities[i] == entity) + return true; + + return false; + }; + + RaycastPicker.prototype.sortOnNearT = function (entity1, entity2) { + return entity1._iPickingCollisionVO.rayEntryDistance > entity2._iPickingCollisionVO.rayEntryDistance ? 1 : -1; + }; + + RaycastPicker.prototype.getPickingCollisionVO = function (collector) { + // trim before sorting + this._entities.length = this._numEntities; + + // Sort entities from closest to furthest. + this._entities = this._entities.sort(this.sortOnNearT); // TODO - test sort filter in JS + + // --------------------------------------------------------------------- + // Evaluate triangle collisions when needed. + // Replaces collision data provided by bounds collider with more precise data. + // --------------------------------------------------------------------- + var shortestCollisionDistance = Number.MAX_VALUE; + var bestCollisionVO; + var pickingCollisionVO; + var entity; + var i; + + for (i = 0; i < this._numEntities; ++i) { + entity = this._entities[i]; + pickingCollisionVO = entity._iPickingCollisionVO; + if (entity.pickingCollider) { + // If a collision exists, update the collision data and stop all checks. + if ((bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) && entity._iTestCollision(shortestCollisionDistance, this._findClosestCollision)) { + shortestCollisionDistance = pickingCollisionVO.rayEntryDistance; + bestCollisionVO = pickingCollisionVO; + if (!this._findClosestCollision) { + this.updateLocalPosition(pickingCollisionVO); + return pickingCollisionVO; + } + } + } else if (bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) { + // Note: a bounds collision with a ray origin inside its bounds is ONLY ever used + // to enable the detection of a corresponsding triangle collision. + // Therefore, bounds collisions with a ray origin inside its bounds can be ignored + // if it has been established that there is NO triangle collider to test + if (!pickingCollisionVO.rayOriginIsInsideBounds) { + this.updateLocalPosition(pickingCollisionVO); + return pickingCollisionVO; + } + } + } + + return bestCollisionVO; + }; + + RaycastPicker.prototype.updateLocalPosition = function (pickingCollisionVO) { + var collisionPos = (pickingCollisionVO.localPosition == null) ? new Vector3D() : pickingCollisionVO.localPosition; + + var rayDir = pickingCollisionVO.localRayDirection; + var rayPos = pickingCollisionVO.localRayPosition; + var t = pickingCollisionVO.rayEntryDistance; + collisionPos.x = rayPos.x + t * rayDir.x; + collisionPos.y = rayPos.y + t * rayDir.y; + collisionPos.z = rayPos.z + t * rayDir.z; + }; + + RaycastPicker.prototype.dispose = function () { + //TODO + }; + return RaycastPicker; +})(); + +module.exports = RaycastPicker; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcGljay9SYXljYXN0UGlja2VyLnRzIl0sIm5hbWVzIjpbIlJheWNhc3RQaWNrZXIiLCJSYXljYXN0UGlja2VyLmNvbnN0cnVjdG9yIiwiUmF5Y2FzdFBpY2tlci5nZXRWaWV3Q29sbGlzaW9uIiwiUmF5Y2FzdFBpY2tlci5nZXRTY2VuZUNvbGxpc2lvbiIsIlJheWNhc3RQaWNrZXIuc2V0SWdub3JlTGlzdCIsIlJheWNhc3RQaWNrZXIuaXNJZ25vcmVkIiwiUmF5Y2FzdFBpY2tlci5zb3J0T25OZWFyVCIsIlJheWNhc3RQaWNrZXIuZ2V0UGlja2luZ0NvbGxpc2lvblZPIiwiUmF5Y2FzdFBpY2tlci51cGRhdGVMb2NhbFBvc2l0aW9uIiwiUmF5Y2FzdFBpY2tlci5kaXNwb3NlIl0sIm1hcHBpbmdzIjoiQUFBQSw0REFFcUU7O0FBS3JFLGdGQUF1Rjs7QUFHdkY7Ozs7OztFQU1HO0FBQ0g7SUE4QkNBOzs7OztNQURHQTtJQUNIQSx1QkFBWUEsb0JBQW9DQTtRQUFwQ0MsbURBQUFBLG9CQUFvQkEsR0FBV0EsS0FBS0E7QUFBQUEsUUExQmhEQSxLQUFRQSxnQkFBZ0JBLEdBQUdBLEVBQUVBLENBQUNBO1FBQzlCQSxLQUFRQSxpQkFBaUJBLEdBQVdBLElBQUlBLENBQUNBO1FBR3pDQSxLQUFRQSxZQUFZQSxHQUFVQSxDQUFDQSxDQUFDQTtRQXdCL0JBLElBQUlBLENBQUNBLGlCQUFpQkEsR0FBR0EsSUFBSUEsZ0JBQWdCQSxDQUFDQSxDQUFDQTs7UUFFL0NBLElBQUlBLENBQUNBLHFCQUFxQkEsR0FBR0Esb0JBQW9CQTtRQUNqREEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBVUEsQ0FBQ0E7SUFDdENBLENBQUNBO0lBdEJERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQTtRQUM5QkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBNEJBLEtBQWFBO1lBRXhDQSxJQUFJQSxDQUFDQSxpQkFB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QU1BLEdBQVlBLGtCQUFrQkEsQ0FBQ0EsaUJBQWlCQTtRQUMxREEsSUFBSUEsTUFBTUEsR0FBWUEsa0JBQWtCQSxDQUFDQSxnQkFBZ0JBO1FBQ3pEQSxJQUFJQSxDQUFDQSxHQUFVQSxrQkFBa0JBLENBQUNBLGdCQUFnQkE7UUFDbERBLFlBQVlBLENBQUNBLENBQUNBLEdBQUdBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQ3RDQSxZQUFZQSxDQUFDQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtRQUN0Q0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7SUFDdkNBLENBQUNBOztJQUVEUixrQ0FBQUE7UUFFQ1MsTUFBTUE7SUFDUEEsQ0FBQ0E7SUFDRlQscUJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsOEJBQXVCLENBQUEiLCJmaWxlIjoiY29yZS9waWNrL1JheWNhc3RQaWNrZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2NlbmVcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udGFpbmVycy9TY2VuZVwiKTtcbmltcG9ydCBWaWV3XHRcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udGFpbmVycy9WaWV3XCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBJUGlja2VyXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGljay9JUGlja2VyXCIpO1xuaW1wb3J0IFBpY2tpbmdDb2xsaXNpb25WT1x0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BpY2svUGlja2luZ0NvbGxpc2lvblZPXCIpO1xuaW1wb3J0IEVudGl0eUxpc3RJdGVtXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0VudGl0eUxpc3RJdGVtXCIpO1xuaW1wb3J0IElDb2xsZWN0b3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvdHJhdmVyc2UvSUNvbGxlY3RvclwiKTtcbmltcG9ydCBSYXljYXN0Q29sbGVjdG9yXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9SYXljYXN0Q29sbGVjdG9yXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcblxuLyoqXG4gKiBQaWNrcyBhIDNkIG9iamVjdCBmcm9tIGEgdmlldyBvciBzY2VuZSBieSAzRCByYXljYXN0IGNhbGN1bGF0aW9ucy5cbiAqIFBlcmZvcm1zIGFuIGluaXRpYWwgY29hcnNlIGJvdW5kYXJ5IGNhbGN1bGF0aW9uIHRvIHJldHVybiBhIHN1YnNldCBvZiBlbnRpdGllcyB3aG9zZSBib3VuZGluZyB2b2x1bWVzIGludGVyc2VjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmF5LFxuICogdGhlbiB0cmlnZ2VycyBhbiBvcHRpb25hbCBwaWNraW5nIGNvbGxpZGVyIG9uIGluZGl2aWR1YWwgZW50aXR5IG9iamVjdHMgdG8gZnVydGhlciBkZXRlcm1pbmUgdGhlIHByZWNpc2UgdmFsdWVzIG9mIHRoZSBwaWNraW5nIHJheSBjb2xsaXNpb24uXG4gKlxuICogQGNsYXNzIGF3YXkucGljay5SYXljYXN0UGlja2VyXG4gKi9cbmNsYXNzIFJheWNhc3RQaWNrZXIgaW1wbGVtZW50cyBJUGlja2VyXG57XG5cdHByaXZhdGUgX2ZpbmRDbG9zZXN0Q29sbGlzaW9uOmJvb2xlYW47XG5cdHByaXZhdGUgX3JheWNhc3RDb2xsZWN0b3I6UmF5Y2FzdENvbGxlY3Rvcjtcblx0cHJpdmF0ZSBfaWdub3JlZEVudGl0aWVzID0gW107XG5cdHByaXZhdGUgX29ubHlNb3VzZUVuYWJsZWQ6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHJpdmF0ZSBfZW50aXRpZXM6QXJyYXk8SUVudGl0eT47XG5cdHByaXZhdGUgX251bUVudGl0aWVzOm51bWJlciA9IDA7XG5cdHByaXZhdGUgX2hhc0NvbGxpc2lvbnM6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBnZXQgb25seU1vdXNlRW5hYmxlZCgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9vbmx5TW91c2VFbmFibGVkO1xuXHR9XG5cblx0cHVibGljIHNldCBvbmx5TW91c2VFbmFibGVkKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHR0aGlzLl9vbmx5TW91c2VFbmFibGVkID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyA8Y29kZT5SYXljYXN0UGlja2VyPC9jb2RlPiBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBmaW5kQ2xvc2VzdENvbGxpc2lvbiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBpY2tlciBzZWFyY2hlcyBmb3IgdGhlIGNsb3Nlc3QgYm91bmRzIGNvbGxpc2lvbiBhbG9uZyB0aGUgcmF5LFxuXHQgKiBvciBzaW1wbHkgcmV0dXJucyB0aGUgZmlyc3QgY29sbGlzaW9uIGVuY291bnRlcmVkLiBEZWZhdWx0cyB0byBmYWxzZS5cblx0ICovXG5cdGNvbnN0cnVjdG9yKGZpbmRDbG9zZXN0Q29sbGlzaW9uOmJvb2xlYW4gPSBmYWxzZSlcblx0e1xuXHRcdHRoaXMuX3JheWNhc3RDb2xsZWN0b3IgPSBuZXcgUmF5Y2FzdENvbGxlY3RvcigpO1xuXG5cdFx0dGhpcy5fZmluZENsb3Nlc3RDb2xsaXNpb24gPSBmaW5kQ2xvc2VzdENvbGxpc2lvbjtcblx0XHR0aGlzLl9lbnRpdGllcyA9IG5ldyBBcnJheTxJRW50aXR5PigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Vmlld0NvbGxpc2lvbih4Om51bWJlciwgeTpudW1iZXIsIHZpZXc6Vmlldyk6UGlja2luZ0NvbGxpc2lvblZPXG5cdHtcblx0XHQvL3VwZGF0ZSByYXlcblx0XHR2YXIgcmF5UG9zaXRpb246VmVjdG9yM0QgPSB2aWV3LnVucHJvamVjdCh4LCB5LCAwKTtcblx0XHR2YXIgcmF5RGlyZWN0aW9uOlZlY3RvcjNEID0gdmlldy51bnByb2plY3QoeCwgeSwgMSkuc3VidHJhY3QocmF5UG9zaXRpb24pO1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0U2NlbmVDb2xsaXNpb24ocmF5UG9zaXRpb24sIHJheURpcmVjdGlvbiwgdmlldy5zY2VuZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBnZXRTY2VuZUNvbGxpc2lvbihyYXlQb3NpdGlvbjpWZWN0b3IzRCwgcmF5RGlyZWN0aW9uOlZlY3RvcjNELCBzY2VuZTpTY2VuZSk6UGlja2luZ0NvbGxpc2lvblZPXG5cdHtcblx0XHQvL2NsZWFyIGNvbGxlY3RvclxuXHRcdHRoaXMuX3JheWNhc3RDb2xsZWN0b3IuY2xlYXIoKTtcblxuXHRcdC8vc2V0dXAgcmF5IHZlY3RvcnNcblx0XHR0aGlzLl9yYXljYXN0Q29sbGVjdG9yLnJheVBvc2l0aW9uID0gcmF5UG9zaXRpb247XG5cdFx0dGhpcy5fcmF5Y2FzdENvbGxlY3Rvci5yYXlEaXJlY3Rpb24gPSByYXlEaXJlY3Rpb247XG5cblx0XHQvLyBjb2xsZWN0IGVudGl0aWVzIHRvIHRlc3Rcblx0XHRzY2VuZS50cmF2ZXJzZVBhcnRpdGlvbnModGhpcy5fcmF5Y2FzdENvbGxlY3Rvcik7XG5cblx0XHR0aGlzLl9udW1FbnRpdGllcyA9IDA7XG5cdFx0dmFyIG5vZGU6RW50aXR5TGlzdEl0ZW0gPSB0aGlzLl9yYXljYXN0Q29sbGVjdG9yLmVudGl0eUhlYWQ7XG5cdFx0dmFyIGVudGl0eTpJRW50aXR5O1xuXG5cdFx0d2hpbGUgKG5vZGUpIHtcblx0XHRcdGlmICghdGhpcy5pc0lnbm9yZWQoZW50aXR5ID0gbm9kZS5lbnRpdHkpKVxuXHRcdFx0XHR0aGlzLl9lbnRpdGllc1t0aGlzLl9udW1FbnRpdGllcysrXSA9IGVudGl0eTtcblxuXHRcdFx0bm9kZSA9IG5vZGUubmV4dDtcblx0XHR9XG5cblx0XHQvL2Vhcmx5IG91dCBpZiBubyBjb2xsaXNpb25zIGRldGVjdGVkXG5cdFx0aWYgKCF0aGlzLl9udW1FbnRpdGllcylcblx0XHRcdHJldHVybiBudWxsO1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UGlja2luZ0NvbGxpc2lvblZPKHRoaXMuX3JheWNhc3RDb2xsZWN0b3IpO1xuXHR9XG5cbi8vXHRcdHB1YmxpYyBnZXRFbnRpdHlDb2xsaXNpb24ocG9zaXRpb246VmVjdG9yM0QsIGRpcmVjdGlvbjpWZWN0b3IzRCwgZW50aXRpZXM6QXJyYXk8SUVudGl0eT4pOlBpY2tpbmdDb2xsaXNpb25WT1xuLy9cdFx0e1xuLy9cdFx0XHR0aGlzLl9udW1FbnRpdGllcyA9IDA7XG4vL1xuLy9cdFx0XHR2YXIgZW50aXR5OklFbnRpdHk7XG4vL1x0XHRcdHZhciBsOm51bWJlciA9IGVudGl0aWVzLmxlbmd0aDtcbi8vXG4vL1x0XHRcdGZvciAodmFyIGM6bnVtYmVyID0gMDsgYyA8IGw7IGMrKykge1xuLy9cdFx0XHRcdGVudGl0eSA9IGVudGl0aWVzW2NdO1xuLy9cbi8vXHRcdFx0XHRpZiAoZW50aXR5LmlzSW50ZXJzZWN0aW5nUmF5KHBvc2l0aW9uLCBkaXJlY3Rpb24pKVxuLy9cdFx0XHRcdFx0dGhpcy5fZW50aXRpZXNbdGhpcy5fbnVtRW50aXRpZXMrK10gPSBlbnRpdHk7XG4vL1x0XHRcdH1cbi8vXG4vL1x0XHRcdHJldHVybiB0aGlzLmdldFBpY2tpbmdDb2xsaXNpb25WTyh0aGlzLl9yYXljYXN0Q29sbGVjdG9yKTtcbi8vXHRcdH1cblxuXHRwdWJsaWMgc2V0SWdub3JlTGlzdChlbnRpdGllcylcblx0e1xuXHRcdHRoaXMuX2lnbm9yZWRFbnRpdGllcyA9IGVudGl0aWVzO1xuXHR9XG5cblx0cHJpdmF0ZSBpc0lnbm9yZWQoZW50aXR5OklFbnRpdHkpOmJvb2xlYW5cblx0e1xuXHRcdGlmICh0aGlzLl9vbmx5TW91c2VFbmFibGVkICYmICFlbnRpdHkuX2lJc01vdXNlRW5hYmxlZCgpKVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX2lnbm9yZWRFbnRpdGllcy5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspXG5cdFx0XHRpZiAodGhpcy5faWdub3JlZEVudGl0aWVzW2ldID09IGVudGl0eSlcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRwcml2YXRlIHNvcnRPbk5lYXJUKGVudGl0eTE6SUVudGl0eSwgZW50aXR5MjpJRW50aXR5KTpudW1iZXJcblx0e1xuXHRcdHJldHVybiBlbnRpdHkxLl9pUGlja2luZ0NvbGxpc2lvblZPLnJheUVudHJ5RGlzdGFuY2UgPiBlbnRpdHkyLl9pUGlja2luZ0NvbGxpc2lvblZPLnJheUVudHJ5RGlzdGFuY2U/IDEgOiAtMTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UGlja2luZ0NvbGxpc2lvblZPKGNvbGxlY3RvcjpJQ29sbGVjdG9yKTpQaWNraW5nQ29sbGlzaW9uVk9cblx0e1xuXHRcdC8vIHRyaW0gYmVmb3JlIHNvcnRpbmdcblx0XHR0aGlzLl9lbnRpdGllcy5sZW5ndGggPSB0aGlzLl9udW1FbnRpdGllcztcblxuXHRcdC8vIFNvcnQgZW50aXRpZXMgZnJvbSBjbG9zZXN0IHRvIGZ1cnRoZXN0LlxuXHRcdHRoaXMuX2VudGl0aWVzID0gdGhpcy5fZW50aXRpZXMuc29ydCh0aGlzLnNvcnRPbk5lYXJUKTsgLy8gVE9ETyAtIHRlc3Qgc29ydCBmaWx0ZXIgaW4gSlNcblxuXHRcdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIEV2YWx1YXRlIHRyaWFuZ2xlIGNvbGxpc2lvbnMgd2hlbiBuZWVkZWQuXG5cdFx0Ly8gUmVwbGFjZXMgY29sbGlzaW9uIGRhdGEgcHJvdmlkZWQgYnkgYm91bmRzIGNvbGxpZGVyIHdpdGggbW9yZSBwcmVjaXNlIGRhdGEuXG5cdFx0Ly8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR2YXIgc2hvcnRlc3RDb2xsaXNpb25EaXN0YW5jZTpudW1iZXIgPSBOdW1iZXIuTUFYX1ZBTFVFO1xuXHRcdHZhciBiZXN0Q29sbGlzaW9uVk86UGlja2luZ0NvbGxpc2lvblZPO1xuXHRcdHZhciBwaWNraW5nQ29sbGlzaW9uVk86UGlja2luZ0NvbGxpc2lvblZPO1xuXHRcdHZhciBlbnRpdHk6SUVudGl0eTtcblx0XHR2YXIgaTpudW1iZXI7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fbnVtRW50aXRpZXM7ICsraSkge1xuXHRcdFx0ZW50aXR5ID0gdGhpcy5fZW50aXRpZXNbaV07XG5cdFx0XHRwaWNraW5nQ29sbGlzaW9uVk8gPSBlbnRpdHkuX2lQaWNraW5nQ29sbGlzaW9uVk87XG5cdFx0XHRpZiAoZW50aXR5LnBpY2tpbmdDb2xsaWRlcikge1xuXHRcdFx0XHQvLyBJZiBhIGNvbGxpc2lvbiBleGlzdHMsIHVwZGF0ZSB0aGUgY29sbGlzaW9uIGRhdGEgYW5kIHN0b3AgYWxsIGNoZWNrcy5cblx0XHRcdFx0aWYgKChiZXN0Q29sbGlzaW9uVk8gPT0gbnVsbCB8fCBwaWNraW5nQ29sbGlzaW9uVk8ucmF5RW50cnlEaXN0YW5jZSA8IGJlc3RDb2xsaXNpb25WTy5yYXlFbnRyeURpc3RhbmNlKSAmJiBlbnRpdHkuX2lUZXN0Q29sbGlzaW9uKHNob3J0ZXN0Q29sbGlzaW9uRGlzdGFuY2UsIHRoaXMuX2ZpbmRDbG9zZXN0Q29sbGlzaW9uKSkge1xuXHRcdFx0XHRcdHNob3J0ZXN0Q29sbGlzaW9uRGlzdGFuY2UgPSBwaWNraW5nQ29sbGlzaW9uVk8ucmF5RW50cnlEaXN0YW5jZTtcblx0XHRcdFx0XHRiZXN0Q29sbGlzaW9uVk8gPSBwaWNraW5nQ29sbGlzaW9uVk87XG5cdFx0XHRcdFx0aWYgKCF0aGlzLl9maW5kQ2xvc2VzdENvbGxpc2lvbikge1xuXHRcdFx0XHRcdFx0dGhpcy51cGRhdGVMb2NhbFBvc2l0aW9uKHBpY2tpbmdDb2xsaXNpb25WTyk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcGlja2luZ0NvbGxpc2lvblZPO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChiZXN0Q29sbGlzaW9uVk8gPT0gbnVsbCB8fCBwaWNraW5nQ29sbGlzaW9uVk8ucmF5RW50cnlEaXN0YW5jZSA8IGJlc3RDb2xsaXNpb25WTy5yYXlFbnRyeURpc3RhbmNlKSB7IC8vIEEgYm91bmRzIGNvbGxpc2lvbiB3aXRoIG5vIHRyaWFuZ2xlIGNvbGxpZGVyIHN0b3BzIGFsbCBjaGVja3MuXG5cdFx0XHRcdC8vIE5vdGU6IGEgYm91bmRzIGNvbGxpc2lvbiB3aXRoIGEgcmF5IG9yaWdpbiBpbnNpZGUgaXRzIGJvdW5kcyBpcyBPTkxZIGV2ZXIgdXNlZFxuXHRcdFx0XHQvLyB0byBlbmFibGUgdGhlIGRldGVjdGlvbiBvZiBhIGNvcnJlc3BvbnNkaW5nIHRyaWFuZ2xlIGNvbGxpc2lvbi5cblx0XHRcdFx0Ly8gVGhlcmVmb3JlLCBib3VuZHMgY29sbGlzaW9ucyB3aXRoIGEgcmF5IG9yaWdpbiBpbnNpZGUgaXRzIGJvdW5kcyBjYW4gYmUgaWdub3JlZFxuXHRcdFx0XHQvLyBpZiBpdCBoYXMgYmVlbiBlc3RhYmxpc2hlZCB0aGF0IHRoZXJlIGlzIE5PIHRyaWFuZ2xlIGNvbGxpZGVyIHRvIHRlc3Rcblx0XHRcdFx0aWYgKCFwaWNraW5nQ29sbGlzaW9uVk8ucmF5T3JpZ2luSXNJbnNpZGVCb3VuZHMpIHtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZUxvY2FsUG9zaXRpb24ocGlja2luZ0NvbGxpc2lvblZPKTtcblx0XHRcdFx0XHRyZXR1cm4gcGlja2luZ0NvbGxpc2lvblZPO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGJlc3RDb2xsaXNpb25WTztcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlTG9jYWxQb3NpdGlvbihwaWNraW5nQ29sbGlzaW9uVk86UGlja2luZ0NvbGxpc2lvblZPKVxuXHR7XG5cdFx0dmFyIGNvbGxpc2lvblBvczpWZWN0b3IzRCA9ICggcGlja2luZ0NvbGxpc2lvblZPLmxvY2FsUG9zaXRpb24gPT0gbnVsbCApPyBuZXcgVmVjdG9yM0QoKSA6IHBpY2tpbmdDb2xsaXNpb25WTy5sb2NhbFBvc2l0aW9uO1xuXG5cdFx0dmFyIHJheURpcjpWZWN0b3IzRCA9IHBpY2tpbmdDb2xsaXNpb25WTy5sb2NhbFJheURpcmVjdGlvbjtcblx0XHR2YXIgcmF5UG9zOlZlY3RvcjNEID0gcGlja2luZ0NvbGxpc2lvblZPLmxvY2FsUmF5UG9zaXRpb247XG5cdFx0dmFyIHQ6bnVtYmVyID0gcGlja2luZ0NvbGxpc2lvblZPLnJheUVudHJ5RGlzdGFuY2U7XG5cdFx0Y29sbGlzaW9uUG9zLnggPSByYXlQb3MueCArIHQqcmF5RGlyLng7XG5cdFx0Y29sbGlzaW9uUG9zLnkgPSByYXlQb3MueSArIHQqcmF5RGlyLnk7XG5cdFx0Y29sbGlzaW9uUG9zLnogPSByYXlQb3MueiArIHQqcmF5RGlyLno7XG5cdH1cblxuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHQvL1RPRE9cblx0fVxufVxuXG5leHBvcnQgPSBSYXljYXN0UGlja2VyOyJdfQ== \ No newline at end of file diff --git a/lib/core/pick/RaycastPicker.ts b/lib/core/pick/RaycastPicker.ts new file mode 100644 index 00000000..e6a69421 --- /dev/null +++ b/lib/core/pick/RaycastPicker.ts @@ -0,0 +1,206 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import View = require("awayjs-core/lib/containers/View"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IPicker = require("awayjs-core/lib/core/pick/IPicker"); +import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); +import EntityListItem = require("awayjs-core/lib/core/pool/EntityListItem"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import RaycastCollector = require("awayjs-core/lib/core/traverse/RaycastCollector"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * Picks a 3d object from a view or scene by 3D raycast calculations. + * Performs an initial coarse boundary calculation to return a subset of entities whose bounding volumes intersect with the specified ray, + * then triggers an optional picking collider on individual entity objects to further determine the precise values of the picking ray collision. + * + * @class away.pick.RaycastPicker + */ +class RaycastPicker implements IPicker +{ + private _findClosestCollision:boolean; + private _raycastCollector:RaycastCollector; + private _ignoredEntities = []; + private _onlyMouseEnabled:boolean = true; + + private _entities:Array; + private _numEntities:number = 0; + private _hasCollisions:boolean; + + /** + * @inheritDoc + */ + public get onlyMouseEnabled():boolean + { + return this._onlyMouseEnabled; + } + + public set onlyMouseEnabled(value:boolean) + { + this._onlyMouseEnabled = value; + } + + /** + * Creates a new RaycastPicker object. + * + * @param findClosestCollision Determines whether the picker searches for the closest bounds collision along the ray, + * or simply returns the first collision encountered. Defaults to false. + */ + constructor(findClosestCollision:boolean = false) + { + this._raycastCollector = new RaycastCollector(); + + this._findClosestCollision = findClosestCollision; + this._entities = new Array(); + } + + /** + * @inheritDoc + */ + public getViewCollision(x:number, y:number, view:View):PickingCollisionVO + { + //update ray + var rayPosition:Vector3D = view.unproject(x, y, 0); + var rayDirection:Vector3D = view.unproject(x, y, 1).subtract(rayPosition); + + return this.getSceneCollision(rayPosition, rayDirection, view.scene); + } + + /** + * @inheritDoc + */ + public getSceneCollision(rayPosition:Vector3D, rayDirection:Vector3D, scene:Scene):PickingCollisionVO + { + //clear collector + this._raycastCollector.clear(); + + //setup ray vectors + this._raycastCollector.rayPosition = rayPosition; + this._raycastCollector.rayDirection = rayDirection; + + // collect entities to test + scene.traversePartitions(this._raycastCollector); + + this._numEntities = 0; + var node:EntityListItem = this._raycastCollector.entityHead; + var entity:IEntity; + + while (node) { + if (!this.isIgnored(entity = node.entity)) + this._entities[this._numEntities++] = entity; + + node = node.next; + } + + //early out if no collisions detected + if (!this._numEntities) + return null; + + return this.getPickingCollisionVO(this._raycastCollector); + } + +// public getEntityCollision(position:Vector3D, direction:Vector3D, entities:Array):PickingCollisionVO +// { +// this._numEntities = 0; +// +// var entity:IEntity; +// var l:number = entities.length; +// +// for (var c:number = 0; c < l; c++) { +// entity = entities[c]; +// +// if (entity.isIntersectingRay(position, direction)) +// this._entities[this._numEntities++] = entity; +// } +// +// return this.getPickingCollisionVO(this._raycastCollector); +// } + + public setIgnoreList(entities) + { + this._ignoredEntities = entities; + } + + private isIgnored(entity:IEntity):boolean + { + if (this._onlyMouseEnabled && !entity._iIsMouseEnabled()) + return true; + + var len:number = this._ignoredEntities.length; + for (var i:number = 0; i < len; i++) + if (this._ignoredEntities[i] == entity) + return true; + + return false; + } + + private sortOnNearT(entity1:IEntity, entity2:IEntity):number + { + return entity1._iPickingCollisionVO.rayEntryDistance > entity2._iPickingCollisionVO.rayEntryDistance? 1 : -1; + } + + private getPickingCollisionVO(collector:ICollector):PickingCollisionVO + { + // trim before sorting + this._entities.length = this._numEntities; + + // Sort entities from closest to furthest. + this._entities = this._entities.sort(this.sortOnNearT); // TODO - test sort filter in JS + + // --------------------------------------------------------------------- + // Evaluate triangle collisions when needed. + // Replaces collision data provided by bounds collider with more precise data. + // --------------------------------------------------------------------- + + var shortestCollisionDistance:number = Number.MAX_VALUE; + var bestCollisionVO:PickingCollisionVO; + var pickingCollisionVO:PickingCollisionVO; + var entity:IEntity; + var i:number; + + for (i = 0; i < this._numEntities; ++i) { + entity = this._entities[i]; + pickingCollisionVO = entity._iPickingCollisionVO; + if (entity.pickingCollider) { + // If a collision exists, update the collision data and stop all checks. + if ((bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) && entity._iTestCollision(shortestCollisionDistance, this._findClosestCollision)) { + shortestCollisionDistance = pickingCollisionVO.rayEntryDistance; + bestCollisionVO = pickingCollisionVO; + if (!this._findClosestCollision) { + this.updateLocalPosition(pickingCollisionVO); + return pickingCollisionVO; + } + } + } else if (bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) { // A bounds collision with no triangle collider stops all checks. + // Note: a bounds collision with a ray origin inside its bounds is ONLY ever used + // to enable the detection of a corresponsding triangle collision. + // Therefore, bounds collisions with a ray origin inside its bounds can be ignored + // if it has been established that there is NO triangle collider to test + if (!pickingCollisionVO.rayOriginIsInsideBounds) { + this.updateLocalPosition(pickingCollisionVO); + return pickingCollisionVO; + } + } + } + + return bestCollisionVO; + } + + private updateLocalPosition(pickingCollisionVO:PickingCollisionVO) + { + var collisionPos:Vector3D = ( pickingCollisionVO.localPosition == null )? new Vector3D() : pickingCollisionVO.localPosition; + + var rayDir:Vector3D = pickingCollisionVO.localRayDirection; + var rayPos:Vector3D = pickingCollisionVO.localRayPosition; + var t:number = pickingCollisionVO.rayEntryDistance; + collisionPos.x = rayPos.x + t*rayDir.x; + collisionPos.y = rayPos.y + t*rayDir.y; + collisionPos.z = rayPos.z + t*rayDir.z; + } + + public dispose() + { + //TODO + } +} + +export = RaycastPicker; \ No newline at end of file diff --git a/lib/core/pool/CSSBillboardRenderable.js b/lib/core/pool/CSSBillboardRenderable.js new file mode 100755 index 00000000..a8df4b9e --- /dev/null +++ b/lib/core/pool/CSSBillboardRenderable.js @@ -0,0 +1,41 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + +/** +* @class away.pool.RenderableListItem +*/ +var CSSBillboardRenderable = (function (_super) { + __extends(CSSBillboardRenderable, _super); + function CSSBillboardRenderable(pool, billboard) { + _super.call(this, pool, billboard, billboard); + + var div = document.createElement("div"); + div.onmousedown = function (event) { + return false; + }; + + this.htmlElement = div; + + var style = div.style; + + style.position = "absolute"; + style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; + + var img = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + billboard.material.id; + } + CSSBillboardRenderable.id = "billboard"; + return CSSBillboardRenderable; +})(CSSRenderableBase); + +module.exports = CSSBillboardRenderable; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9DU1NCaWxsYm9hcmRSZW5kZXJhYmxlLnRzIl0sIm5hbWVzIjpbIkNTU0JpbGxib2FyZFJlbmRlcmFibGUiLCJDU1NCaWxsYm9hcmRSZW5kZXJhYmxlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4RUFBb0Y7O0FBSXBGOztFQUVHO0FBQ0g7SUFBcUNBLHlDQUFpQkE7SUFJckRBLGdDQUFZQSxJQUFtQkEsRUFBRUEsU0FBbUJBO1FBRW5EQyxXQUFNQSxPQUFBQSxJQUFJQSxFQUFFQSxTQUFTQSxFQUFFQSxTQUFTQSxDQUFDQTs7UUFFakNBLElBQUlBLEdBQUdBLEdBQW1DQSxRQUFRQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUN2RUEsR0FBR0EsQ0FBQ0EsV0FBV0EsR0FBR0EsVUFBQ0EsS0FBZ0JBO21CQUFLQSxLQUFLQTtRQUFMQSxDQUFLQTs7UUFFN0NBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLEdBQUdBOztRQUV0QkEsSUFBSUEsS0FBS0EsR0FBd0JBLEdBQUdBLENBQUNBLEtBQUtBOztRQUUxQ0EsS0FBS0EsQ0FBQ0EsUUFBUUEsR0FBR0EsVUFBVUE7UUFDM0JBLEtBQUtBLENBQUNBLGVBQWVBLEdBQ2xCQSxLQUFLQSxDQUFDQSwwQkFBMEJBLENBQUNBLEdBQ2pDQSxLQUFLQSxDQUFDQSx1QkFBdUJBLENBQUNBLEdBQzlCQSxLQUFLQSxDQUFDQSxxQkFBcUJBLENBQUNBLEdBQzVCQSxLQUFLQSxDQUFDQSxzQkFBc0JBLENBQUNBLEdBQUdBLE9BQU9BOztRQUUxQ0EsSUFBSUEsR0FBR0EsR0FBbUNBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBOztRQUV2RUEsR0FBR0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1FBRXBCQSxHQUFHQSxDQUFDQSxTQUFTQSxHQUFHQSxVQUFVQSxHQUFHQSxTQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxFQUFFQTtJQUNuREEsQ0FBQ0E7SUF6QkRELDRCQUEwQkEsV0FBV0E7SUEwQnRDQSw4QkFBQ0E7QUFBREEsQ0FBQ0EsRUE1Qm9DLGlCQUFpQixFQTRCckQ7O0FBRUQsdUNBQWdDLENBQUEiLCJmaWxlIjoiY29yZS9wb29sL0NTU0JpbGxib2FyZFJlbmRlcmFibGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ1NTUmVuZGVyYWJsZUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0NTU1JlbmRlcmFibGVCYXNlXCIpO1xuaW1wb3J0IFJlbmRlcmFibGVQb29sXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL1JlbmRlcmFibGVQb29sXCIpO1xuaW1wb3J0IEJpbGxib2FyZFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvQmlsbGJvYXJkXCIpO1xuXG4vKipcbiAqIEBjbGFzcyBhd2F5LnBvb2wuUmVuZGVyYWJsZUxpc3RJdGVtXG4gKi9cbmNsYXNzIENTU0JpbGxib2FyZFJlbmRlcmFibGUgZXh0ZW5kcyBDU1NSZW5kZXJhYmxlQmFzZVxue1xuXHRwdWJsaWMgc3RhdGljIGlkOnN0cmluZyA9IFwiYmlsbGJvYXJkXCI7XG5cblx0Y29uc3RydWN0b3IocG9vbDpSZW5kZXJhYmxlUG9vbCwgYmlsbGJvYXJkOkJpbGxib2FyZClcblx0e1xuXHRcdHN1cGVyKHBvb2wsIGJpbGxib2FyZCwgYmlsbGJvYXJkKTtcblxuXHRcdHZhciBkaXY6SFRNTERpdkVsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0ZGl2Lm9ubW91c2Vkb3duID0gKGV2ZW50Ok1vdXNlRXZlbnQpID0+IGZhbHNlO1xuXG5cdFx0dGhpcy5odG1sRWxlbWVudCA9IGRpdjtcblxuXHRcdHZhciBzdHlsZTpNU1N0eWxlQ1NTUHJvcGVydGllcyA9IGRpdi5zdHlsZTtcblxuXHRcdHN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXHRcdHN0eWxlLnRyYW5zZm9ybU9yaWdpblxuXHRcdFx0PSBzdHlsZVtcIi13ZWJraXQtdHJhbnNmb3JtLW9yaWdpblwiXVxuXHRcdFx0PSBzdHlsZVtcIi1tb3otdHJhbnNmb3JtLW9yaWdpblwiXVxuXHRcdFx0PSBzdHlsZVtcIi1vLXRyYW5zZm9ybS1vcmlnaW5cIl1cblx0XHRcdD0gc3R5bGVbXCItbXMtdHJhbnNmb3JtLW9yaWdpblwiXSA9IFwiMCUgMCVcIjtcblxuXHRcdHZhciBpbWc6SFRNTERpdkVsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cblx0XHRkaXYuYXBwZW5kQ2hpbGQoaW1nKTtcblxuXHRcdGltZy5jbGFzc05hbWUgPSBcIm1hdGVyaWFsXCIgKyBiaWxsYm9hcmQubWF0ZXJpYWwuaWQ7XG5cdH1cbn1cblxuZXhwb3J0ID0gQ1NTQmlsbGJvYXJkUmVuZGVyYWJsZTsiXX0= \ No newline at end of file diff --git a/lib/core/pool/CSSBillboardRenderable.ts b/lib/core/pool/CSSBillboardRenderable.ts new file mode 100644 index 00000000..03af4719 --- /dev/null +++ b/lib/core/pool/CSSBillboardRenderable.ts @@ -0,0 +1,38 @@ +import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); +import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); +import Billboard = require("awayjs-core/lib/entities/Billboard"); + +/** + * @class away.pool.RenderableListItem + */ +class CSSBillboardRenderable extends CSSRenderableBase +{ + public static id:string = "billboard"; + + constructor(pool:RenderablePool, billboard:Billboard) + { + super(pool, billboard, billboard); + + var div:HTMLDivElement = document.createElement("div"); + div.onmousedown = (event:MouseEvent) => false; + + this.htmlElement = div; + + var style:MSStyleCSSProperties = div.style; + + style.position = "absolute"; + style.transformOrigin + = style["-webkit-transform-origin"] + = style["-moz-transform-origin"] + = style["-o-transform-origin"] + = style["-ms-transform-origin"] = "0% 0%"; + + var img:HTMLDivElement = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + billboard.material.id; + } +} + +export = CSSBillboardRenderable; \ No newline at end of file diff --git a/lib/core/pool/CSSLineSegmentRenderable.js b/lib/core/pool/CSSLineSegmentRenderable.js new file mode 100755 index 00000000..8d7200c8 --- /dev/null +++ b/lib/core/pool/CSSLineSegmentRenderable.js @@ -0,0 +1,41 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + +/** +* @class away.pool.RenderableListItem +*/ +var CSSLineSegmentRenderable = (function (_super) { + __extends(CSSLineSegmentRenderable, _super); + function CSSLineSegmentRenderable(pool, lineSegment) { + _super.call(this, pool, lineSegment, lineSegment); + + var div = document.createElement("div"); + div.onmousedown = function (event) { + return false; + }; + + this.htmlElement = div; + + var style = div.style; + + style.position = "absolute"; + style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; + + var img = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + lineSegment.material.id; + } + CSSLineSegmentRenderable.id = "lineSegment"; + return CSSLineSegmentRenderable; +})(CSSRenderableBase); + +module.exports = CSSLineSegmentRenderable; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9DU1NMaW5lU2VnbWVudFJlbmRlcmFibGUudHMiXSwibmFtZXMiOlsiQ1NTTGluZVNlZ21lbnRSZW5kZXJhYmxlIiwiQ1NTTGluZVNlZ21lbnRSZW5kZXJhYmxlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4RUFBb0Y7O0FBSXBGOztFQUVHO0FBQ0g7SUFBdUNBLDJDQUFpQkE7SUFJdkRBLGtDQUFZQSxJQUFtQkEsRUFBRUEsV0FBdUJBO1FBRXZEQyxXQUFNQSxPQUFBQSxJQUFJQSxFQUFFQSxXQUFXQSxFQUFFQSxXQUFXQSxDQUFDQTs7UUFFckNBLElBQUlBLEdBQUdBLEdBQW1DQSxRQUFRQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUN2RUEsR0FBR0EsQ0FBQ0EsV0FBV0EsR0FBR0EsVUFBQ0EsS0FBZ0JBO21CQUFLQSxLQUFLQTtRQUFMQSxDQUFLQTs7UUFFN0NBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLEdBQUdBOztRQUV0QkEsSUFBSUEsS0FBS0EsR0FBd0JBLEdBQUdBLENBQUNBLEtBQUtBOztRQUUxQ0EsS0FBS0EsQ0FBQ0EsUUFBUUEsR0FBR0EsVUFBVUE7UUFDM0JBLEtBQUtBLENBQUNBLGVBQWVBLEdBQ2xCQSxLQUFLQSxDQUFDQSwwQkFBMEJBLENBQUNBLEdBQ2pDQSxLQUFLQSxDQUFDQSx1QkFBdUJBLENBQUNBLEdBQzlCQSxLQUFLQSxDQUFDQSxxQkFBcUJBLENBQUNBLEdBQzVCQSxLQUFLQSxDQUFDQSxzQkFBc0JBLENBQUNBLEdBQUdBLE9BQU9BOztRQUUxQ0EsSUFBSUEsR0FBR0EsR0FBbUNBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBOztRQUV2RUEsR0FBR0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1FBRXBCQSxHQUFHQSxDQUFDQSxTQUFTQSxHQUFHQSxVQUFVQSxHQUFHQSxXQUFXQSxDQUFDQSxRQUFRQSxDQUFDQSxFQUFFQTtJQUNyREEsQ0FBQ0E7SUF6QkRELDhCQUEwQkEsYUFBYUE7SUEwQnhDQSxnQ0FBQ0E7QUFBREEsQ0FBQ0EsRUE1QnNDLGlCQUFpQixFQTRCdkQ7O0FBRUQseUNBQWtDLENBQUEiLCJmaWxlIjoiY29yZS9wb29sL0NTU0xpbmVTZWdtZW50UmVuZGVyYWJsZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDU1NSZW5kZXJhYmxlQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvQ1NTUmVuZGVyYWJsZUJhc2VcIik7XG5pbXBvcnQgUmVuZGVyYWJsZVBvb2xcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvUmVuZGVyYWJsZVBvb2xcIik7XG5pbXBvcnQgTGluZVNlZ21lbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0xpbmVTZWdtZW50XCIpO1xuXG4vKipcbiAqIEBjbGFzcyBhd2F5LnBvb2wuUmVuZGVyYWJsZUxpc3RJdGVtXG4gKi9cbmNsYXNzIENTU0xpbmVTZWdtZW50UmVuZGVyYWJsZSBleHRlbmRzIENTU1JlbmRlcmFibGVCYXNlXG57XG5cdHB1YmxpYyBzdGF0aWMgaWQ6c3RyaW5nID0gXCJsaW5lU2VnbWVudFwiO1xuXG5cdGNvbnN0cnVjdG9yKHBvb2w6UmVuZGVyYWJsZVBvb2wsIGxpbmVTZWdtZW50OkxpbmVTZWdtZW50KVxuXHR7XG5cdFx0c3VwZXIocG9vbCwgbGluZVNlZ21lbnQsIGxpbmVTZWdtZW50KTtcblxuXHRcdHZhciBkaXY6SFRNTERpdkVsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0ZGl2Lm9ubW91c2Vkb3duID0gKGV2ZW50Ok1vdXNlRXZlbnQpID0+IGZhbHNlO1xuXG5cdFx0dGhpcy5odG1sRWxlbWVudCA9IGRpdjtcblxuXHRcdHZhciBzdHlsZTpNU1N0eWxlQ1NTUHJvcGVydGllcyA9IGRpdi5zdHlsZTtcblxuXHRcdHN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXHRcdHN0eWxlLnRyYW5zZm9ybU9yaWdpblxuXHRcdFx0PSBzdHlsZVtcIi13ZWJraXQtdHJhbnNmb3JtLW9yaWdpblwiXVxuXHRcdFx0PSBzdHlsZVtcIi1tb3otdHJhbnNmb3JtLW9yaWdpblwiXVxuXHRcdFx0PSBzdHlsZVtcIi1vLXRyYW5zZm9ybS1vcmlnaW5cIl1cblx0XHRcdD0gc3R5bGVbXCItbXMtdHJhbnNmb3JtLW9yaWdpblwiXSA9IFwiMCUgMCVcIjtcblxuXHRcdHZhciBpbWc6SFRNTERpdkVsZW1lbnQgPSA8SFRNTERpdkVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cblx0XHRkaXYuYXBwZW5kQ2hpbGQoaW1nKTtcblxuXHRcdGltZy5jbGFzc05hbWUgPSBcIm1hdGVyaWFsXCIgKyBsaW5lU2VnbWVudC5tYXRlcmlhbC5pZDtcblx0fVxufVxuXG5leHBvcnQgPSBDU1NMaW5lU2VnbWVudFJlbmRlcmFibGU7Il19 \ No newline at end of file diff --git a/lib/core/pool/CSSLineSegmentRenderable.ts b/lib/core/pool/CSSLineSegmentRenderable.ts new file mode 100644 index 00000000..483a7678 --- /dev/null +++ b/lib/core/pool/CSSLineSegmentRenderable.ts @@ -0,0 +1,38 @@ +import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); +import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); +import LineSegment = require("awayjs-core/lib/entities/LineSegment"); + +/** + * @class away.pool.RenderableListItem + */ +class CSSLineSegmentRenderable extends CSSRenderableBase +{ + public static id:string = "lineSegment"; + + constructor(pool:RenderablePool, lineSegment:LineSegment) + { + super(pool, lineSegment, lineSegment); + + var div:HTMLDivElement = document.createElement("div"); + div.onmousedown = (event:MouseEvent) => false; + + this.htmlElement = div; + + var style:MSStyleCSSProperties = div.style; + + style.position = "absolute"; + style.transformOrigin + = style["-webkit-transform-origin"] + = style["-moz-transform-origin"] + = style["-o-transform-origin"] + = style["-ms-transform-origin"] = "0% 0%"; + + var img:HTMLDivElement = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + lineSegment.material.id; + } +} + +export = CSSLineSegmentRenderable; \ No newline at end of file diff --git a/lib/core/pool/CSSRenderableBase.js b/lib/core/pool/CSSRenderableBase.js new file mode 100755 index 00000000..698cc098 --- /dev/null +++ b/lib/core/pool/CSSRenderableBase.js @@ -0,0 +1,47 @@ +/** +* @class away.pool.RenderableListItem +*/ +var CSSRenderableBase = (function () { + /** + * + * @param sourceEntity + * @param material + * @param animator + */ + function CSSRenderableBase(pool, sourceEntity, materialOwner) { + //store a reference to the pool for later disposal + this._pool = pool; + + this.sourceEntity = sourceEntity; + this.materialOwner = materialOwner; + } + /** + * + */ + CSSRenderableBase.prototype.dispose = function () { + this._pool.disposeItem(this.materialOwner); + }; + + /** + * + */ + CSSRenderableBase.prototype.invalidateGeometry = function () { + }; + + /** + * + */ + CSSRenderableBase.prototype.invalidateIndexData = function () { + }; + + /** + * + */ + CSSRenderableBase.prototype.invalidateVertexData = function (dataType) { + }; + return CSSRenderableBase; +})(); + +module.exports = CSSRenderableBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9DU1NSZW5kZXJhYmxlQmFzZS50cyJdLCJuYW1lcyI6WyJDU1NSZW5kZXJhYmxlQmFzZSIsIkNTU1JlbmRlcmFibGVCYXNlLmNvbnN0cnVjdG9yIiwiQ1NTUmVuZGVyYWJsZUJhc2UuZGlzcG9zZSIsIkNTU1JlbmRlcmFibGVCYXNlLmludmFsaWRhdGVHZW9tZXRyeSIsIkNTU1JlbmRlcmFibGVCYXNlLmludmFsaWRhdGVJbmRleERhdGEiLCJDU1NSZW5kZXJhYmxlQmFzZS5pbnZhbGlkYXRlVmVydGV4RGF0YSJdLCJtYXBwaW5ncyI6IkFBQUE7O0VBUUc7QUFDSDtJQTBEQ0E7Ozs7O01BREdBO0lBQ0hBLDJCQUFZQSxJQUFtQkEsRUFBRUEsWUFBb0JBLEVBQUVBLGFBQTRCQTtRQUVsRkMsa0RBQWtEQTtRQUNsREEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUE7O1FBRWpCQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxZQUFZQTtRQUNoQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsYUFBYUE7SUFDbkNBLENBQUNBO0lBS0REOztNQURHQTswQ0FDSEE7UUFFQ0UsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0E7SUFDM0NBLENBQUNBOztJQUtERjs7TUFER0E7cURBQ0hBO0lBR0FHLENBQUNBOztJQUtESDs7TUFER0E7c0RBQ0hBO0lBR0FJLENBQUNBOztJQUtESjs7TUFER0E7dURBQ0hBLFVBQTRCQSxRQUFlQTtJQUczQ0ssQ0FBQ0E7SUFDRkwseUJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsa0NBQTJCLENBQUEiLCJmaWxlIjoiY29yZS9wb29sL0NTU1JlbmRlcmFibGVCYXNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElNYXRlcmlhbE93bmVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0lNYXRlcmlhbE93bmVyXCIpO1xuaW1wb3J0IE1hdHJpeDNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBJUmVuZGVyYWJsZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0lSZW5kZXJhYmxlXCIpO1xuaW1wb3J0IFJlbmRlcmFibGVQb29sXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL1JlbmRlcmFibGVQb29sXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcblxuLyoqXG4gKiBAY2xhc3MgYXdheS5wb29sLlJlbmRlcmFibGVMaXN0SXRlbVxuICovXG5jbGFzcyBDU1NSZW5kZXJhYmxlQmFzZSBpbXBsZW1lbnRzIElSZW5kZXJhYmxlXG57XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHJpdmF0ZSBfcG9vbDpSZW5kZXJhYmxlUG9vbDtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBuZXh0OkNTU1JlbmRlcmFibGVCYXNlO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIG1hdGVyaWFsSWQ6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHJlbmRlck9yZGVySWQ6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHpJbmRleDpudW1iZXI7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgY2FzY2FkZWQ6Ym9vbGVhbjtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyByZW5kZXJTY2VuZVRyYW5zZm9ybTpNYXRyaXgzRDtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBzb3VyY2VFbnRpdHk6SUVudGl0eTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBtYXRlcmlhbE93bmVyOklNYXRlcmlhbE93bmVyO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGh0bWxFbGVtZW50OkhUTUxFbGVtZW50O1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gc291cmNlRW50aXR5XG5cdCAqIEBwYXJhbSBtYXRlcmlhbFxuXHQgKiBAcGFyYW0gYW5pbWF0b3Jcblx0ICovXG5cdGNvbnN0cnVjdG9yKHBvb2w6UmVuZGVyYWJsZVBvb2wsIHNvdXJjZUVudGl0eTpJRW50aXR5LCBtYXRlcmlhbE93bmVyOklNYXRlcmlhbE93bmVyKVxuXHR7XG5cdFx0Ly9zdG9yZSBhIHJlZmVyZW5jZSB0byB0aGUgcG9vbCBmb3IgbGF0ZXIgZGlzcG9zYWxcblx0XHR0aGlzLl9wb29sID0gcG9vbDtcblxuXHRcdHRoaXMuc291cmNlRW50aXR5ID0gc291cmNlRW50aXR5O1xuXHRcdHRoaXMubWF0ZXJpYWxPd25lciA9IG1hdGVyaWFsT3duZXI7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBkaXNwb3NlKClcblx0e1xuXHRcdHRoaXMuX3Bvb2wuZGlzcG9zZUl0ZW0odGhpcy5tYXRlcmlhbE93bmVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGludmFsaWRhdGVHZW9tZXRyeSgpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgaW52YWxpZGF0ZUluZGV4RGF0YSgpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgaW52YWxpZGF0ZVZlcnRleERhdGEoZGF0YVR5cGU6c3RyaW5nKVxuXHR7XG5cblx0fVxufVxuXG5leHBvcnQgPSBDU1NSZW5kZXJhYmxlQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/core/pool/CSSRenderableBase.ts b/lib/core/pool/CSSRenderableBase.ts new file mode 100644 index 00000000..40fad5ef --- /dev/null +++ b/lib/core/pool/CSSRenderableBase.ts @@ -0,0 +1,110 @@ +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.pool.RenderableListItem + */ +class CSSRenderableBase implements IRenderable +{ + /** + * + */ + private _pool:RenderablePool; + + /** + * + */ + public next:CSSRenderableBase; + + /** + * + */ + public materialId:number; + + /** + * + */ + public renderOrderId:number; + + /** + * + */ + public zIndex:number; + + /** + * + */ + public cascaded:boolean; + + /** + * + */ + public renderSceneTransform:Matrix3D; + + /** + * + */ + public sourceEntity:IEntity; + + /** + * + */ + public materialOwner:IMaterialOwner; + + /** + * + */ + public htmlElement:HTMLElement; + + /** + * + * @param sourceEntity + * @param material + * @param animator + */ + constructor(pool:RenderablePool, sourceEntity:IEntity, materialOwner:IMaterialOwner) + { + //store a reference to the pool for later disposal + this._pool = pool; + + this.sourceEntity = sourceEntity; + this.materialOwner = materialOwner; + } + + /** + * + */ + public dispose() + { + this._pool.disposeItem(this.materialOwner); + } + + /** + * + */ + public invalidateGeometry() + { + + } + + /** + * + */ + public invalidateIndexData() + { + + } + + /** + * + */ + public invalidateVertexData(dataType:string) + { + + } +} + +export = CSSRenderableBase; \ No newline at end of file diff --git a/lib/core/pool/CSSSkyboxRenderable.js b/lib/core/pool/CSSSkyboxRenderable.js new file mode 100755 index 00000000..aaefdca8 --- /dev/null +++ b/lib/core/pool/CSSSkyboxRenderable.js @@ -0,0 +1,43 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); + +/** +* @class away.pool.CSSSkyboxRenderable +*/ +var CSSSkyboxRenderable = (function (_super) { + __extends(CSSSkyboxRenderable, _super); + function CSSSkyboxRenderable(pool, skyBox) { + _super.call(this, pool, skyBox, skyBox); + + var div = document.createElement("div"); + div.onmousedown = function (event) { + return false; + }; + + this.htmlElement = div; + + var style = div.style; + var img; + + //create the six images that make up the skybox + style.position = "absolute"; + style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; + + img = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + skyBox.material.id; + } + CSSSkyboxRenderable.id = "skybox"; + return CSSSkyboxRenderable; +})(CSSRenderableBase); + +module.exports = CSSSkyboxRenderable; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9DU1NTa3lib3hSZW5kZXJhYmxlLnRzIl0sIm5hbWVzIjpbIkNTU1NreWJveFJlbmRlcmFibGUiLCJDU1NTa3lib3hSZW5kZXJhYmxlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw4RUFBb0Y7O0FBS3BGOztFQUVHO0FBQ0g7SUFBa0NBLHNDQUFpQkE7SUFJbERBLDZCQUFZQSxJQUFtQkEsRUFBRUEsTUFBYUE7UUFFN0NDLFdBQU1BLE9BQUFBLElBQUlBLEVBQUVBLE1BQU1BLEVBQUVBLE1BQU1BLENBQUNBOztRQUUzQkEsSUFBSUEsR0FBR0EsR0FBbUNBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBO1FBQ3ZFQSxHQUFHQSxDQUFDQSxXQUFXQSxHQUFHQSxVQUFDQSxLQUFnQkE7bUJBQUtBLEtBQUtBO1FBQUxBLENBQUtBOztRQUU3Q0EsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsR0FBR0E7O1FBRXRCQSxJQUFJQSxLQUFLQSxHQUF3QkEsR0FBR0EsQ0FBQ0EsS0FBS0E7UUFDMUNBLElBQUlBLEdBQUdBOztRQUVQQSwrQ0FBK0NBO1FBQy9DQSxLQUFLQSxDQUFDQSxRQUFRQSxHQUFHQSxVQUFVQTtRQUMzQkEsS0FBS0EsQ0FBQ0EsZUFBZUEsR0FDbEJBLEtBQUtBLENBQUNBLDBCQUEwQkEsQ0FBQ0EsR0FDakNBLEtBQUtBLENBQUNBLHVCQUF1QkEsQ0FBQ0EsR0FDOUJBLEtBQUtBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsR0FDNUJBLEtBQUtBLENBQUNBLHNCQUFzQkEsQ0FBQ0EsR0FBR0EsT0FBT0E7O1FBRTFDQSxHQUFHQSxHQUFvQkEsUUFBUUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7O1FBRXBEQSxHQUFHQSxDQUFDQSxXQUFXQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFcEJBLEdBQUdBLENBQUNBLFNBQVNBLEdBQUdBLFVBQVVBLEdBQUdBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLEVBQUVBO0lBQ2hEQSxDQUFDQTtJQTNCREQseUJBQTBCQSxRQUFRQTtJQTRCbkNBLDJCQUFDQTtBQUFEQSxDQUFDQSxFQTlCaUMsaUJBQWlCLEVBOEJsRDs7QUFFRCxvQ0FBNkIsQ0FBQSIsImZpbGUiOiJjb3JlL3Bvb2wvQ1NTU2t5Ym94UmVuZGVyYWJsZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDU1NSZW5kZXJhYmxlQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvQ1NTUmVuZGVyYWJsZUJhc2VcIik7XG5pbXBvcnQgUmVuZGVyYWJsZVBvb2xcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvUmVuZGVyYWJsZVBvb2xcIik7XG5pbXBvcnQgU2t5Ym94XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL1NreWJveFwiKTtcblxuXG4vKipcbiAqIEBjbGFzcyBhd2F5LnBvb2wuQ1NTU2t5Ym94UmVuZGVyYWJsZVxuICovXG5jbGFzcyBDU1NTa3lib3hSZW5kZXJhYmxlIGV4dGVuZHMgQ1NTUmVuZGVyYWJsZUJhc2Vcbntcblx0cHVibGljIHN0YXRpYyBpZDpzdHJpbmcgPSBcInNreWJveFwiO1xuXG5cdGNvbnN0cnVjdG9yKHBvb2w6UmVuZGVyYWJsZVBvb2wsIHNreUJveDpTa3lib3gpXG5cdHtcblx0XHRzdXBlcihwb29sLCBza3lCb3gsIHNreUJveCk7XG5cblx0XHR2YXIgZGl2OkhUTUxEaXZFbGVtZW50ID0gPEhUTUxEaXZFbGVtZW50PiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXHRcdGRpdi5vbm1vdXNlZG93biA9IChldmVudDpNb3VzZUV2ZW50KSA9PiBmYWxzZTtcblxuXHRcdHRoaXMuaHRtbEVsZW1lbnQgPSBkaXY7XG5cblx0XHR2YXIgc3R5bGU6TVNTdHlsZUNTU1Byb3BlcnRpZXMgPSBkaXYuc3R5bGU7XG5cdFx0dmFyIGltZzpIVE1MRGl2RWxlbWVudDtcblxuXHRcdC8vY3JlYXRlIHRoZSBzaXggaW1hZ2VzIHRoYXQgbWFrZSB1cCB0aGUgc2t5Ym94XG5cdFx0c3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c3R5bGUudHJhbnNmb3JtT3JpZ2luXG5cdFx0XHQ9IHN0eWxlW1wiLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luXCJdXG5cdFx0XHQ9IHN0eWxlW1wiLW1vei10cmFuc2Zvcm0tb3JpZ2luXCJdXG5cdFx0XHQ9IHN0eWxlW1wiLW8tdHJhbnNmb3JtLW9yaWdpblwiXVxuXHRcdFx0PSBzdHlsZVtcIi1tcy10cmFuc2Zvcm0tb3JpZ2luXCJdID0gXCIwJSAwJVwiO1xuXG5cdFx0aW1nID0gPEhUTUxEaXZFbGVtZW50PiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG5cdFx0ZGl2LmFwcGVuZENoaWxkKGltZyk7XG5cblx0XHRpbWcuY2xhc3NOYW1lID0gXCJtYXRlcmlhbFwiICsgc2t5Qm94Lm1hdGVyaWFsLmlkO1xuXHR9XG59XG5cbmV4cG9ydCA9IENTU1NreWJveFJlbmRlcmFibGU7Il19 \ No newline at end of file diff --git a/lib/core/pool/CSSSkyboxRenderable.ts b/lib/core/pool/CSSSkyboxRenderable.ts new file mode 100644 index 00000000..44fec96f --- /dev/null +++ b/lib/core/pool/CSSSkyboxRenderable.ts @@ -0,0 +1,41 @@ +import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); +import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); +import Skybox = require("awayjs-core/lib/entities/Skybox"); + + +/** + * @class away.pool.CSSSkyboxRenderable + */ +class CSSSkyboxRenderable extends CSSRenderableBase +{ + public static id:string = "skybox"; + + constructor(pool:RenderablePool, skyBox:Skybox) + { + super(pool, skyBox, skyBox); + + var div:HTMLDivElement = document.createElement("div"); + div.onmousedown = (event:MouseEvent) => false; + + this.htmlElement = div; + + var style:MSStyleCSSProperties = div.style; + var img:HTMLDivElement; + + //create the six images that make up the skybox + style.position = "absolute"; + style.transformOrigin + = style["-webkit-transform-origin"] + = style["-moz-transform-origin"] + = style["-o-transform-origin"] + = style["-ms-transform-origin"] = "0% 0%"; + + img = document.createElement("div"); + + div.appendChild(img); + + img.className = "material" + skyBox.material.id; + } +} + +export = CSSSkyboxRenderable; \ No newline at end of file diff --git a/lib/core/pool/EntityListItem.js b/lib/core/pool/EntityListItem.js new file mode 100755 index 00000000..b6c873d6 --- /dev/null +++ b/lib/core/pool/EntityListItem.js @@ -0,0 +1,12 @@ +/** +* @class away.pool.EntityListItem +*/ +var EntityListItem = (function () { + function EntityListItem() { + } + return EntityListItem; +})(); + +module.exports = EntityListItem; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9FbnRpdHlMaXN0SXRlbS50cyJdLCJuYW1lcyI6WyJFbnRpdHlMaXN0SXRlbSIsIkVudGl0eUxpc3RJdGVtLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7RUFJRztBQUNIO0lBQUFBO0lBV0FDLENBQUNBO0FBQUFELElBQURBLHNCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELCtCQUF3QixDQUFBIiwiZmlsZSI6ImNvcmUvcG9vbC9FbnRpdHlMaXN0SXRlbS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkucG9vbC5FbnRpdHlMaXN0SXRlbVxuICovXG5jbGFzcyBFbnRpdHlMaXN0SXRlbVxue1xuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBlbnRpdHk6SUVudGl0eTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBuZXh0OkVudGl0eUxpc3RJdGVtO1xufVxuXG5leHBvcnQgPSBFbnRpdHlMaXN0SXRlbTsiXX0= \ No newline at end of file diff --git a/lib/core/pool/EntityListItem.ts b/lib/core/pool/EntityListItem.ts new file mode 100644 index 00000000..8648a9d8 --- /dev/null +++ b/lib/core/pool/EntityListItem.ts @@ -0,0 +1,19 @@ +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.pool.EntityListItem + */ +class EntityListItem +{ + /** + * + */ + public entity:IEntity; + + /** + * + */ + public next:EntityListItem; +} + +export = EntityListItem; \ No newline at end of file diff --git a/lib/core/pool/EntityListItemPool.js b/lib/core/pool/EntityListItemPool.js new file mode 100755 index 00000000..4f571dd3 --- /dev/null +++ b/lib/core/pool/EntityListItemPool.js @@ -0,0 +1,45 @@ +var EntityListItem = require("awayjs-core/lib/core/pool/EntityListItem"); + +/** +* @class away.pool.EntityListItemPool +*/ +var EntityListItemPool = (function () { + /** + * + */ + function EntityListItemPool() { + this._index = 0; + this._poolSize = 0; + this._pool = new Array(); + } + /** + * + */ + EntityListItemPool.prototype.getItem = function () { + var item; + if (this._index == this._poolSize) { + item = new EntityListItem(); + this._pool[this._index++] = item; + ++this._poolSize; + } else { + item = this._pool[this._index++]; + } + return item; + }; + + /** + * + */ + EntityListItemPool.prototype.freeAll = function () { + this._index = 0; + }; + + EntityListItemPool.prototype.dispose = function () { + this._pool.length = 0; + }; + return EntityListItemPool; +})(); + +module.exports = EntityListItemPool; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9FbnRpdHlMaXN0SXRlbVBvb2wudHMiXSwibmFtZXMiOlsiRW50aXR5TGlzdEl0ZW1Qb29sIiwiRW50aXR5TGlzdEl0ZW1Qb29sLmNvbnN0cnVjdG9yIiwiRW50aXR5TGlzdEl0ZW1Qb29sLmdldEl0ZW0iLCJFbnRpdHlMaXN0SXRlbVBvb2wuZnJlZUFsbCIsIkVudGl0eUxpc3RJdGVtUG9vbC5kaXNwb3NlIl0sIm1hcHBpbmdzIjoiQUFBQSx3RUFBK0U7O0FBRS9FOztFQUVHO0FBQ0g7SUFTQ0E7O01BREdBO0lBQ0hBO1FBTkFDLEtBQVFBLE1BQU1BLEdBQVVBLENBQUNBLENBQUNBO1FBQzFCQSxLQUFRQSxTQUFTQSxHQUFVQSxDQUFDQSxDQUFDQTtRQU81QkEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBaUJBLENBQUNBO0lBQ3pDQSxDQUFDQTtJQUtERDs7TUFER0E7MkNBQ0hBO1FBRUNFLElBQUlBLElBQUlBO1FBQ1JBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLElBQUlBLElBQUlBLENBQUNBLFNBQVNBLENBQUVBO1lBQ2xDQSxJQUFJQSxHQUFHQSxJQUFJQSxjQUFjQSxDQUFDQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUE7WUFDaENBLEVBQUVBLElBQUlBLENBQUNBLFNBQVNBO1NBQ2hCQSxLQUFNQTtZQUNOQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUNoQ0E7UUFDREEsT0FBT0EsSUFBSUE7SUFDWkEsQ0FBQ0E7O0lBS0RGOztNQURHQTsyQ0FDSEE7UUFFQ0csSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0E7SUFDaEJBLENBQUNBOztJQUVESCx1Q0FBQUE7UUFFQ0ksSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0E7SUFDdEJBLENBQUNBO0lBQ0ZKLDBCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELG1DQUE0QixDQUFBIiwiZmlsZSI6ImNvcmUvcG9vbC9FbnRpdHlMaXN0SXRlbVBvb2wuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRW50aXR5TGlzdEl0ZW1cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvRW50aXR5TGlzdEl0ZW1cIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkucG9vbC5FbnRpdHlMaXN0SXRlbVBvb2xcbiAqL1xuY2xhc3MgRW50aXR5TGlzdEl0ZW1Qb29sXG57XG5cdHByaXZhdGUgX3Bvb2w6QXJyYXk8RW50aXR5TGlzdEl0ZW0+O1xuXHRwcml2YXRlIF9pbmRleDpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9wb29sU2l6ZTpudW1iZXIgPSAwO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5fcG9vbCA9IG5ldyBBcnJheTxFbnRpdHlMaXN0SXRlbT4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldEl0ZW0oKTpFbnRpdHlMaXN0SXRlbVxuXHR7XG5cdFx0dmFyIGl0ZW06RW50aXR5TGlzdEl0ZW07XG5cdFx0aWYgKHRoaXMuX2luZGV4ID09IHRoaXMuX3Bvb2xTaXplKSB7XG5cdFx0XHRpdGVtID0gbmV3IEVudGl0eUxpc3RJdGVtKCk7XG5cdFx0XHR0aGlzLl9wb29sW3RoaXMuX2luZGV4KytdID0gaXRlbTtcblx0XHRcdCsrdGhpcy5fcG9vbFNpemU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGl0ZW0gPSB0aGlzLl9wb29sW3RoaXMuX2luZGV4KytdO1xuXHRcdH1cblx0XHRyZXR1cm4gaXRlbTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGZyZWVBbGwoKVxuXHR7XG5cdFx0dGhpcy5faW5kZXggPSAwO1xuXHR9XG5cblx0cHVibGljIGRpc3Bvc2UoKVxuXHR7XG5cdFx0dGhpcy5fcG9vbC5sZW5ndGggPSAwO1xuXHR9XG59XG5cbmV4cG9ydCA9IEVudGl0eUxpc3RJdGVtUG9vbDsiXX0= \ No newline at end of file diff --git a/lib/core/pool/EntityListItemPool.ts b/lib/core/pool/EntityListItemPool.ts new file mode 100644 index 00000000..b3df8c7b --- /dev/null +++ b/lib/core/pool/EntityListItemPool.ts @@ -0,0 +1,50 @@ +import EntityListItem = require("awayjs-core/lib/core/pool/EntityListItem"); + +/** + * @class away.pool.EntityListItemPool + */ +class EntityListItemPool +{ + private _pool:Array; + private _index:number = 0; + private _poolSize:number = 0; + + /** + * + */ + constructor() + { + this._pool = new Array(); + } + + /** + * + */ + public getItem():EntityListItem + { + var item:EntityListItem; + if (this._index == this._poolSize) { + item = new EntityListItem(); + this._pool[this._index++] = item; + ++this._poolSize; + } else { + item = this._pool[this._index++]; + } + return item; + } + + /** + * + */ + public freeAll() + { + this._index = 0; + } + + public dispose() + { + this._pool.length = 0; + } +} + +export = EntityListItemPool; \ No newline at end of file diff --git a/lib/core/pool/IMaterialData.js b/lib/core/pool/IMaterialData.js new file mode 100755 index 00000000..d45fad9a --- /dev/null +++ b/lib/core/pool/IMaterialData.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9JTWF0ZXJpYWxEYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBd0J1QiIsImZpbGUiOiJjb3JlL3Bvb2wvSU1hdGVyaWFsRGF0YS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSU1hdGVyaWFsRGF0YSBpcyBhbiBpbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcmVuZGVyaW5nIHBpcGVsaW5lIHRvIHJlbmRlciB0aGVcbiAqIGNvbnRlbnRzIG9mIGEgdGV4dHVyZVxuICpcbiAqIEBjbGFzcyBhd2F5LnBvb2wuSU1hdGVyaWFsRGF0YVxuICovXG5pbnRlcmZhY2UgSU1hdGVyaWFsRGF0YVxue1xuXHQvKipcblx0ICpcblx0ICovXG5cdGRpc3Bvc2UoKTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdGludmFsaWRhdGVNYXRlcmlhbCgpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0aW52YWxpZGF0ZUFuaW1hdGlvbigpO1xufVxuXG5leHBvcnQgPSBJTWF0ZXJpYWxEYXRhOyJdfQ== \ No newline at end of file diff --git a/lib/core/pool/IMaterialData.ts b/lib/core/pool/IMaterialData.ts new file mode 100644 index 00000000..c6816883 --- /dev/null +++ b/lib/core/pool/IMaterialData.ts @@ -0,0 +1,25 @@ +/** + * IMaterialData is an interface for classes that are used in the rendering pipeline to render the + * contents of a texture + * + * @class away.pool.IMaterialData + */ +interface IMaterialData +{ + /** + * + */ + dispose(); + + /** + * + */ + invalidateMaterial(); + + /** + * + */ + invalidateAnimation(); +} + +export = IMaterialData; \ No newline at end of file diff --git a/lib/core/pool/IMaterialPassData.js b/lib/core/pool/IMaterialPassData.js new file mode 100755 index 00000000..4630ff39 --- /dev/null +++ b/lib/core/pool/IMaterialPassData.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9JTWF0ZXJpYWxQYXNzRGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQTBCMkIiLCJmaWxlIjoiY29yZS9wb29sL0lNYXRlcmlhbFBhc3NEYXRhLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElNYXRlcmlhbFBhc3NcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvcGFzc2VzL0lNYXRlcmlhbFBhc3NcIik7XG5cbi8qKlxuICogSU1hdGVyaWFsUGFzc0RhdGEgaXMgYW4gaW50ZXJmYWNlIGZvciBjbGFzc2VzIHRoYXQgYXJlIHVzZWQgaW4gdGhlIHJlbmRlcmluZyBwaXBlbGluZSB0byByZW5kZXIgdGhlXG4gKiBjb250ZW50cyBvZiBhIG1hdGVyaWFsIHBhc3NcbiAqXG4gKiBAY2xhc3MgYXdheS5wb29sLklNYXRlcmlhbFBhc3NEYXRhXG4gKi9cbmludGVyZmFjZSBJTWF0ZXJpYWxQYXNzRGF0YVxue1xuXHQvKipcblx0ICpcblx0ICovXG5cdG1hdGVyaWFsUGFzczpJTWF0ZXJpYWxQYXNzO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0ZGlzcG9zZSgpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0aW52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgPSBJTWF0ZXJpYWxQYXNzRGF0YTsiXX0= \ No newline at end of file diff --git a/lib/core/pool/IMaterialPassData.ts b/lib/core/pool/IMaterialPassData.ts new file mode 100644 index 00000000..5caa12b8 --- /dev/null +++ b/lib/core/pool/IMaterialPassData.ts @@ -0,0 +1,27 @@ +import IMaterialPass = require("awayjs-core/lib/materials/passes/IMaterialPass"); + +/** + * IMaterialPassData is an interface for classes that are used in the rendering pipeline to render the + * contents of a material pass + * + * @class away.pool.IMaterialPassData + */ +interface IMaterialPassData +{ + /** + * + */ + materialPass:IMaterialPass; + + /** + * + */ + dispose(); + + /** + * + */ + invalidate(); +} + +export = IMaterialPassData; \ No newline at end of file diff --git a/lib/core/pool/IRenderable.js b/lib/core/pool/IRenderable.js new file mode 100755 index 00000000..565b160a --- /dev/null +++ b/lib/core/pool/IRenderable.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9JUmVuZGVyYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQStEcUIiLCJmaWxlIjoiY29yZS9wb29sL0lSZW5kZXJhYmxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElNYXRlcmlhbE93bmVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0lNYXRlcmlhbE93bmVyXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcblxuLyoqXG4gKiBJUmVuZGVyYWJsZSBpcyBhbiBpbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcmVuZGVyaW5nIHBpcGVsaW5lIHRvIHJlbmRlciB0aGVcbiAqIGNvbnRlbnRzIG9mIGEgcGFydGl0aW9uXG4gKlxuICogQGNsYXNzIGF3YXkucmVuZGVyLklSZW5kZXJhYmxlXG4gKi9cbmludGVyZmFjZSBJUmVuZGVyYWJsZVxue1xuXHQvKipcblx0ICpcblx0ICovXG5cdG5leHQ6SVJlbmRlcmFibGU7XG5cblxuXHQvKipcblx0ICpcblx0ICovXG5cdG1hdGVyaWFsSWQ6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0bWF0ZXJpYWxPd25lcjpJTWF0ZXJpYWxPd25lcjtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHNvdXJjZUVudGl0eTpJRW50aXR5O1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cmVuZGVyT3JkZXJJZDpudW1iZXI7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHR6SW5kZXg6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0ZGlzcG9zZSgpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0aW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRpbnZhbGlkYXRlSW5kZXhEYXRhKCk7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRpbnZhbGlkYXRlVmVydGV4RGF0YShkYXRhVHlwZTpzdHJpbmcpO1xufVxuXG5leHBvcnQgPSBJUmVuZGVyYWJsZTsiXX0= \ No newline at end of file diff --git a/lib/core/pool/IRenderable.ts b/lib/core/pool/IRenderable.ts new file mode 100644 index 00000000..26359648 --- /dev/null +++ b/lib/core/pool/IRenderable.ts @@ -0,0 +1,64 @@ +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * IRenderable is an interface for classes that are used in the rendering pipeline to render the + * contents of a partition + * + * @class away.render.IRenderable + */ +interface IRenderable +{ + /** + * + */ + next:IRenderable; + + + /** + * + */ + materialId:number; + + /** + * + */ + materialOwner:IMaterialOwner; + + /** + * + */ + sourceEntity:IEntity; + + /** + * + */ + renderOrderId:number; + + /** + * + */ + zIndex:number; + + /** + * + */ + dispose(); + + /** + * + */ + invalidateGeometry(); + + /** + * + */ + invalidateIndexData(); + + /** + * + */ + invalidateVertexData(dataType:string); +} + +export = IRenderable; \ No newline at end of file diff --git a/lib/core/pool/IRenderableClass.js b/lib/core/pool/IRenderableClass.js new file mode 100755 index 00000000..c9725b43 --- /dev/null +++ b/lib/core/pool/IRenderableClass.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9JUmVuZGVyYWJsZUNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBdUIwQiIsImZpbGUiOiJjb3JlL3Bvb2wvSVJlbmRlcmFibGVDbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJTWF0ZXJpYWxPd25lclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JTWF0ZXJpYWxPd25lclwiKTtcbmltcG9ydCBJUmVuZGVyYWJsZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0lSZW5kZXJhYmxlXCIpO1xuaW1wb3J0IFJlbmRlcmFibGVQb29sXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL1JlbmRlcmFibGVQb29sXCIpO1xuXG4vKipcbiAqIElSZW5kZXJhYmxlQ2xhc3MgaXMgYW4gaW50ZXJmYWNlIGZvciB0aGUgY29uc3RydWN0YWJsZSBjbGFzcyBkZWZpbml0aW9uIElSZW5kZXJhYmxlIHRoYXQgaXMgdXNlZCB0b1xuICogY3JlYXRlIHJlbmRlcmFibGUgb2JqZWN0cyBpbiB0aGUgcmVuZGVyaW5nIHBpcGVsaW5lIHRvIHJlbmRlciB0aGUgY29udGVudHMgb2YgYSBwYXJ0aXRpb25cbiAqXG4gKiBAY2xhc3MgYXdheS5yZW5kZXIuSVJlbmRlcmFibGVDbGFzc1xuICovXG5pbnRlcmZhY2UgSVJlbmRlcmFibGVDbGFzc1xue1xuXHQvKipcblx0ICpcblx0ICovXG5cdGlkOnN0cmluZztcblxuXHQvKipcblx0ICpcblx0ICovXG5cdG5ldyhwb29sOlJlbmRlcmFibGVQb29sLCBtYXRlcmlhbE93bmVyOklNYXRlcmlhbE93bmVyKTpJUmVuZGVyYWJsZTtcbn1cblxuZXhwb3J0ID0gSVJlbmRlcmFibGVDbGFzczsiXX0= \ No newline at end of file diff --git a/lib/core/pool/IRenderableClass.ts b/lib/core/pool/IRenderableClass.ts new file mode 100644 index 00000000..52b01d0f --- /dev/null +++ b/lib/core/pool/IRenderableClass.ts @@ -0,0 +1,24 @@ +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); + +/** + * IRenderableClass is an interface for the constructable class definition IRenderable that is used to + * create renderable objects in the rendering pipeline to render the contents of a partition + * + * @class away.render.IRenderableClass + */ +interface IRenderableClass +{ + /** + * + */ + id:string; + + /** + * + */ + new(pool:RenderablePool, materialOwner:IMaterialOwner):IRenderable; +} + +export = IRenderableClass; \ No newline at end of file diff --git a/lib/core/pool/ITextureData.js b/lib/core/pool/ITextureData.js new file mode 100755 index 00000000..bb3f15f1 --- /dev/null +++ b/lib/core/pool/ITextureData.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9JVGV4dHVyZURhdGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFtQnNCIiwiZmlsZSI6ImNvcmUvcG9vbC9JVGV4dHVyZURhdGEuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIElUZXh0dXJlRGF0YSBpcyBhbiBpbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcmVuZGVyaW5nIHBpcGVsaW5lIHRvIHJlbmRlciB0aGVcbiAqIGNvbnRlbnRzIG9mIGEgdGV4dHVyZVxuICpcbiAqIEBjbGFzcyBhd2F5LnBvb2wuSVRleHR1cmVEYXRhXG4gKi9cbmludGVyZmFjZSBJVGV4dHVyZURhdGFcbntcblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRkaXNwb3NlKCk7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRpbnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCA9IElUZXh0dXJlRGF0YTsiXX0= \ No newline at end of file diff --git a/lib/core/pool/ITextureData.ts b/lib/core/pool/ITextureData.ts new file mode 100644 index 00000000..731fa7e9 --- /dev/null +++ b/lib/core/pool/ITextureData.ts @@ -0,0 +1,20 @@ +/** + * ITextureData is an interface for classes that are used in the rendering pipeline to render the + * contents of a texture + * + * @class away.pool.ITextureData + */ +interface ITextureData +{ + /** + * + */ + dispose(); + + /** + * + */ + invalidate(); +} + +export = ITextureData; \ No newline at end of file diff --git a/lib/core/pool/RenderablePool.js b/lib/core/pool/RenderablePool.js new file mode 100755 index 00000000..f457f247 --- /dev/null +++ b/lib/core/pool/RenderablePool.js @@ -0,0 +1,65 @@ +/** +* @class away.pool.RenderablePool +*/ +var RenderablePool = (function () { + /** + * //TODO + * + * @param renderableClass + */ + function RenderablePool(renderableClass) { + this._pool = new Object(); + this._renderableClass = renderableClass; + } + /** + * //TODO + * + * @param materialOwner + * @returns IRenderable + */ + RenderablePool.prototype.getItem = function (materialOwner) { + return (this._pool[materialOwner.id] || (this._pool[materialOwner.id] = materialOwner._iAddRenderable(new this._renderableClass(this, materialOwner)))); + }; + + /** + * //TODO + * + * @param materialOwner + */ + RenderablePool.prototype.disposeItem = function (materialOwner) { + materialOwner._iRemoveRenderable(this._pool[materialOwner.id]); + + this._pool[materialOwner.id] = null; + }; + + /** + * //TODO + * + * @param renderableClass + * @returns RenderablePool + */ + RenderablePool.getPool = function (renderableClass) { + var pool = RenderablePool._pools[renderableClass.id]; + + if (pool != undefined) + return pool; + + return (RenderablePool._pools[renderableClass.id] = new RenderablePool(renderableClass)); + }; + + /** + * //TODO + * + * @param renderableClass + */ + RenderablePool.disposePool = function (renderableClass) { + if (RenderablePool._pools[renderableClass.id]) + RenderablePool._pools[renderableClass.id] = undefined; + }; + RenderablePool._pools = new Object(); + return RenderablePool; +})(); + +module.exports = RenderablePool; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcG9vbC9SZW5kZXJhYmxlUG9vbC50cyJdLCJuYW1lcyI6WyJSZW5kZXJhYmxlUG9vbCIsIlJlbmRlcmFibGVQb29sLmNvbnN0cnVjdG9yIiwiUmVuZGVyYWJsZVBvb2wuZ2V0SXRlbSIsIlJlbmRlcmFibGVQb29sLmRpc3Bvc2VJdGVtIiwiUmVuZGVyYWJsZVBvb2wuZ2V0UG9vbCIsIlJlbmRlcmFibGVQb29sLmRpc3Bvc2VQb29sIl0sIm1hcHBpbmdzIjoiQUFBQTs7RUFNRztBQUNIO0lBWUNBOzs7O01BREdBO0lBQ0hBLHdCQUFZQSxlQUFnQ0E7UUFSNUNDLEtBQVFBLEtBQUtBLEdBQVVBLElBQUlBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1FBVW5DQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLGVBQWVBO0lBQ3hDQSxDQUFDQTtJQVFERDs7Ozs7TUFER0E7dUNBQ0hBLFVBQWVBLGFBQTRCQTtRQUUxQ0UsT0FBcUJBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLGFBQWFBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLGFBQWFBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLGFBQWFBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsSUFBSUEsRUFBRUEsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDdEtBLENBQUNBOztJQU9ERjs7OztNQURHQTsyQ0FDSEEsVUFBbUJBLGFBQTRCQTtRQUU5Q0csYUFBYUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxhQUFhQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTs7UUFFOURBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLGFBQWFBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBO0lBQ3BDQSxDQUFDQTs7SUFRREg7Ozs7O01BREdBOzZCQUNIQSxVQUFzQkEsZUFBZ0NBO1FBRXJESSxJQUFJQSxJQUFJQSxHQUFrQkEsY0FBY0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7O1FBRW5FQSxJQUFJQSxJQUFJQSxJQUFJQSxTQUFTQTtZQUNwQkEsT0FBT0EsSUFBSUEsQ0FBQ0E7O1FBRWJBLE9BQXdCQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxDQUFDQSxlQUFlQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxjQUFjQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQTtJQUMxR0EsQ0FBQ0E7O0lBT0RKOzs7O01BREdBO2lDQUNIQSxVQUEwQkEsZUFBbUJBO1FBRTVDSyxJQUFJQSxjQUFjQSxDQUFDQSxNQUFNQSxDQUFDQSxlQUFlQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUM1Q0EsY0FBY0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0E7SUFDeERBLENBQUNBO0lBL0RETCx3QkFBK0JBLElBQUlBLE1BQU1BLENBQUNBLENBQUNBO0lBZ0U1Q0Esc0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsK0JBQXdCLENBQUEiLCJmaWxlIjoiY29yZS9wb29sL1JlbmRlcmFibGVQb29sLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElNYXRlcmlhbE93bmVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0lNYXRlcmlhbE93bmVyXCIpO1xuaW1wb3J0IElSZW5kZXJhYmxlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvSVJlbmRlcmFibGVcIik7XG5pbXBvcnQgSVJlbmRlcmFibGVDbGFzc1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcG9vbC9JUmVuZGVyYWJsZUNsYXNzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyBhd2F5LnBvb2wuUmVuZGVyYWJsZVBvb2xcbiAqL1xuY2xhc3MgUmVuZGVyYWJsZVBvb2xcbntcblx0cHJpdmF0ZSBzdGF0aWMgX3Bvb2xzOk9iamVjdCA9IG5ldyBPYmplY3QoKTtcblxuXHRwcml2YXRlIF9wb29sOk9iamVjdCA9IG5ldyBPYmplY3QoKTtcblx0cHJpdmF0ZSBfcmVuZGVyYWJsZUNsYXNzOklSZW5kZXJhYmxlQ2xhc3M7XG5cblx0LyoqXG5cdCAqIC8vVE9ET1xuXHQgKlxuXHQgKiBAcGFyYW0gcmVuZGVyYWJsZUNsYXNzXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihyZW5kZXJhYmxlQ2xhc3M6SVJlbmRlcmFibGVDbGFzcylcblx0e1xuXHRcdHRoaXMuX3JlbmRlcmFibGVDbGFzcyA9IHJlbmRlcmFibGVDbGFzcztcblx0fVxuXG5cdC8qKlxuXHQgKiAvL1RPRE9cblx0ICpcblx0ICogQHBhcmFtIG1hdGVyaWFsT3duZXJcblx0ICogQHJldHVybnMgSVJlbmRlcmFibGVcblx0ICovXG5cdHB1YmxpYyBnZXRJdGVtKG1hdGVyaWFsT3duZXI6SU1hdGVyaWFsT3duZXIpOklSZW5kZXJhYmxlXG5cdHtcblx0XHRyZXR1cm4gPElSZW5kZXJhYmxlPiAodGhpcy5fcG9vbFttYXRlcmlhbE93bmVyLmlkXSB8fCAodGhpcy5fcG9vbFttYXRlcmlhbE93bmVyLmlkXSA9IG1hdGVyaWFsT3duZXIuX2lBZGRSZW5kZXJhYmxlKG5ldyB0aGlzLl9yZW5kZXJhYmxlQ2xhc3ModGhpcywgbWF0ZXJpYWxPd25lcikpKSlcblx0fVxuXG5cdC8qKlxuXHQgKiAvL1RPRE9cblx0ICpcblx0ICogQHBhcmFtIG1hdGVyaWFsT3duZXJcblx0ICovXG5cdHB1YmxpYyBkaXNwb3NlSXRlbShtYXRlcmlhbE93bmVyOklNYXRlcmlhbE93bmVyKVxuXHR7XG5cdFx0bWF0ZXJpYWxPd25lci5faVJlbW92ZVJlbmRlcmFibGUodGhpcy5fcG9vbFttYXRlcmlhbE93bmVyLmlkXSk7XG5cblx0XHR0aGlzLl9wb29sW21hdGVyaWFsT3duZXIuaWRdID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiAvL1RPRE9cblx0ICpcblx0ICogQHBhcmFtIHJlbmRlcmFibGVDbGFzc1xuXHQgKiBAcmV0dXJucyBSZW5kZXJhYmxlUG9vbFxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRQb29sKHJlbmRlcmFibGVDbGFzczpJUmVuZGVyYWJsZUNsYXNzKTpSZW5kZXJhYmxlUG9vbFxuXHR7XG5cdFx0dmFyIHBvb2w6UmVuZGVyYWJsZVBvb2wgPSBSZW5kZXJhYmxlUG9vbC5fcG9vbHNbcmVuZGVyYWJsZUNsYXNzLmlkXTtcblxuXHRcdGlmIChwb29sICE9IHVuZGVmaW5lZClcblx0XHRcdHJldHVybiBwb29sO1xuXG5cdFx0cmV0dXJuIDxSZW5kZXJhYmxlUG9vbD4gKFJlbmRlcmFibGVQb29sLl9wb29sc1tyZW5kZXJhYmxlQ2xhc3MuaWRdID0gbmV3IFJlbmRlcmFibGVQb29sKHJlbmRlcmFibGVDbGFzcykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIC8vVE9ET1xuXHQgKlxuXHQgKiBAcGFyYW0gcmVuZGVyYWJsZUNsYXNzXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGRpc3Bvc2VQb29sKHJlbmRlcmFibGVDbGFzczphbnkpXG5cdHtcblx0XHRpZiAoUmVuZGVyYWJsZVBvb2wuX3Bvb2xzW3JlbmRlcmFibGVDbGFzcy5pZF0pXG5cdFx0XHRSZW5kZXJhYmxlUG9vbC5fcG9vbHNbcmVuZGVyYWJsZUNsYXNzLmlkXSA9IHVuZGVmaW5lZDtcblx0fVxufVxuXG5leHBvcnQgPSBSZW5kZXJhYmxlUG9vbDsiXX0= \ No newline at end of file diff --git a/lib/core/pool/RenderablePool.ts b/lib/core/pool/RenderablePool.ts new file mode 100644 index 00000000..bdb16037 --- /dev/null +++ b/lib/core/pool/RenderablePool.ts @@ -0,0 +1,76 @@ +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import IRenderableClass = require("awayjs-core/lib/core/pool/IRenderableClass"); + +/** + * @class away.pool.RenderablePool + */ +class RenderablePool +{ + private static _pools:Object = new Object(); + + private _pool:Object = new Object(); + private _renderableClass:IRenderableClass; + + /** + * //TODO + * + * @param renderableClass + */ + constructor(renderableClass:IRenderableClass) + { + this._renderableClass = renderableClass; + } + + /** + * //TODO + * + * @param materialOwner + * @returns IRenderable + */ + public getItem(materialOwner:IMaterialOwner):IRenderable + { + return (this._pool[materialOwner.id] || (this._pool[materialOwner.id] = materialOwner._iAddRenderable(new this._renderableClass(this, materialOwner)))) + } + + /** + * //TODO + * + * @param materialOwner + */ + public disposeItem(materialOwner:IMaterialOwner) + { + materialOwner._iRemoveRenderable(this._pool[materialOwner.id]); + + this._pool[materialOwner.id] = null; + } + + /** + * //TODO + * + * @param renderableClass + * @returns RenderablePool + */ + public static getPool(renderableClass:IRenderableClass):RenderablePool + { + var pool:RenderablePool = RenderablePool._pools[renderableClass.id]; + + if (pool != undefined) + return pool; + + return (RenderablePool._pools[renderableClass.id] = new RenderablePool(renderableClass)); + } + + /** + * //TODO + * + * @param renderableClass + */ + public static disposePool(renderableClass:any) + { + if (RenderablePool._pools[renderableClass.id]) + RenderablePool._pools[renderableClass.id] = undefined; + } +} + +export = RenderablePool; \ No newline at end of file diff --git a/lib/core/render/CSSDefaultRenderer.js b/lib/core/render/CSSDefaultRenderer.js new file mode 100755 index 00000000..3a90b2ff --- /dev/null +++ b/lib/core/render/CSSDefaultRenderer.js @@ -0,0 +1,207 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + +var CSSRendererBase = require("awayjs-core/lib/core/render/CSSRendererBase"); + +var CSSEntityCollector = require("awayjs-core/lib/core/traverse/CSSEntityCollector"); + +var CoordinateSystem = require("awayjs-core/lib/projections/CoordinateSystem"); + +/** +* The DefaultRenderer class provides the default rendering method. It renders the scene graph objects using the +* materials assigned to them. +* +* @class away.render.DefaultRenderer +*/ +var CSSDefaultRenderer = (function (_super) { + __extends(CSSDefaultRenderer, _super); + /** + * Creates a new CSSDefaultRenderer object. + */ + function CSSDefaultRenderer() { + _super.call(this); + this._contextMatrix = new Matrix3D(); + this._skyboxProjection = new Matrix3D(); + this._transform = new Matrix3D(); + + //create container for the renderer + this._container = document.createElement("div"); + this._container.style.overflow = "hidden"; + this._container.style.position = "absolute"; + + //add container to body + document.body.appendChild(this._container); + + //create conxtext for the renderer + this._context = document.createElement("div"); + this._contextStyle = this._context.style; + this._contextStyle.position = "absolute"; + this._contextStyle.transformStyle = this._contextStyle["-webkit-transform-style"] = this._contextStyle["-moz-transform-style"] = this._contextStyle["-o-transform-style"] = this._contextStyle["-ms-transform-style"] = "preserve-3d"; + this._contextStyle.transformOrigin = this._contextStyle["-webkit-transform-origin"] = this._contextStyle["-moz-transform-origin"] = this._contextStyle["-o-transform-origin"] = this._contextStyle["-ms-transform-origin"] = "0% 0%"; + + //add context to container + this._container.appendChild(this._context); + } + /** + * + * @param entityCollector + */ + CSSDefaultRenderer.prototype.render = function (entityCollector) { + _super.prototype.render.call(this, entityCollector); + + if (this._pBackBufferInvalid) + this.pUpdateBackBuffer(); + + this._iRender(entityCollector); + + this._pBackBufferInvalid = false; + }; + + /** + * @inheritDoc + */ + CSSDefaultRenderer.prototype.pDraw = function (entityCollector) { + // if (entityCollector.skyBox) { + // if (this._activeMaterial) + // this._activeMaterial.iDeactivate(this._pStageGL); + // + // this._activeMaterial = null; + // + // this._pContext.setDepthTest(false, away.gl.ContextGLCompareMode.ALWAYS); + // this.drawSkybox(entityCollector); + // + // } + // + // var which:number = target? DefaultRenderer.SCREEN_PASSES : DefaultRenderer.ALL_PASSES; + var sheet = document.styleSheets[document.styleSheets.length - 1]; + + for (var i = 0; i < sheet.cssRules.length; i++) { + var style = sheet.cssRules[i].style; + style.transform = style["-webkit-transform"] = style["-moz-transform"] = style["-o-transform"] = style["-ms-transform"] = (entityCollector.camera.projection.coordinateSystem == CoordinateSystem.RIGHT_HANDED) ? "" : "scale3d(1, -1, 1) translateY(-" + style.height + ")"; + } + + this.drawRenderables(this._renderableHead, entityCollector); + + // if (this._activeMaterial) + // this._activeMaterial.iDeactivate(this._pStageGL); + this._activeMaterial = null; + }; + + /** + * Updates the backbuffer properties. + */ + CSSDefaultRenderer.prototype.pUpdateBackBuffer = function () { + this._container.style.width = this._width + "px"; + this._container.style.height = this._height + "px"; + this._container.style.clip = "rect(0px, " + this._width + "px, " + this._height + "px, 0px)"; + + //update context matrix + this._contextMatrix.rawData[0] = this._width / 2; + this._contextMatrix.rawData[5] = -this._height / 2; + this._contextMatrix.rawData[10] = -1; //fix for innaccurate z-sort + this._contextMatrix.rawData[12] = this._width / 2; + this._contextMatrix.rawData[13] = this._height / 2; + + //update context tranform + this._contextStyle.transform = this._contextStyle["-webkit-transform"] = this._contextStyle["-moz-transform"] = this._contextStyle["-o-transform"] = this._contextStyle["-ms-transform"] = this._contextMatrix.toString(); + + this._pBackBufferInvalid = false; + }; + + /** + * Draw the skybox if present. + * @param entityCollector The EntityCollector containing all potentially visible information. + */ + CSSDefaultRenderer.prototype.drawSkybox = function (entityCollector) { + //TODO + }; + + /** + * Draw a list of renderables. + * @param renderables The renderables to draw. + * @param entityCollector The EntityCollector containing all potentially visible information. + */ + CSSDefaultRenderer.prototype.drawRenderables = function (item, entityCollector) { + var viewProjection = entityCollector.camera.viewProjection.clone(); + + while (item) { + this._activeMaterial = item.materialOwner.material; + + //serialise transform and apply to html element + this._transform.copyRawDataFrom(item.renderSceneTransform.rawData); + this._transform.append(viewProjection); + + var style = item.htmlElement.style; + + style.transform = style["-webkit-transform"] = style["-moz-transform"] = style["-o-transform"] = style["-ms-transform"] = this._transform.toString(); + + style.transformStyle = style["-webkit-transform-style"] = style["-moz-transform-style"] = style["-o-transform-style"] = style["-ms-transform-style"] = "preserve-3d"; + + //check if child requires adding to the view + if (!this._context.contains(item.htmlElement)) + this._context.appendChild(item.htmlElement); + + item = item.next; + } + // var numPasses:number; + // var j:number; + // var camera:away.entities.Camera = entityCollector.camera; + // var item2:away.render.CSSRenderableBase; + // + // while (item) { + // this._activeMaterial = item.material; + // + // this._activeMaterial.iUpdateMaterial(this._pContext); + // + // numPasses = this._activeMaterial._iNumPasses; + // + // j = 0; + // + // do { + // item2 = item; + // + // var rttMask:number = this._activeMaterial.iPassRendersToTexture(j)? 1 : 2; + // + // if ((rttMask & which) != 0) { + // this._activeMaterial.iActivatePass(j, this._pStageGL, camera); + // + // do { + // this._activeMaterial.iRenderPass(j, item2, this._pStageGL, entityCollector); + // + // item2 = item2.next; + // + // } while (item2 && item2.material == this._activeMaterial); + // + // this._activeMaterial.iDeactivatePass(j, this._pStageGL); + // + // } else { + // do { + // item2 = item2.next; + // + // } while (item2 && item2.renderable.material == this._activeMaterial); + // } + // } while (++j < numPasses); + // + // item = item2; + // } + }; + + CSSDefaultRenderer.prototype.dispose = function () { + _super.prototype.dispose.call(this); + //TODO + }; + + CSSDefaultRenderer.prototype._iCreateEntityCollector = function () { + return new CSSEntityCollector(); + }; + return CSSDefaultRenderer; +})(CSSRendererBase); + +module.exports = CSSDefaultRenderer; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcmVuZGVyL0NTU0RlZmF1bHRSZW5kZXJlci50cyJdLCJuYW1lcyI6WyJDU1NEZWZhdWx0UmVuZGVyZXIiLCJDU1NEZWZhdWx0UmVuZGVyZXIuY29uc3RydWN0b3IiLCJDU1NEZWZhdWx0UmVuZGVyZXIucmVuZGVyIiwiQ1NTRGVmYXVsdFJlbmRlcmVyLnBEcmF3IiwiQ1NTRGVmYXVsdFJlbmRlcmVyLnBVcGRhdGVCYWNrQnVmZmVyIiwiQ1NTRGVmYXVsdFJlbmRlcmVyLmRyYXdTa3lib3giLCJDU1NEZWZhdWx0UmVuZGVyZXIuZHJhd1JlbmRlcmFibGVzIiwiQ1NTRGVmYXVsdFJlbmRlcmVyLmRpc3Bvc2UiLCJDU1NEZWZhdWx0UmVuZGVyZXIuX2lDcmVhdGVFbnRpdHlDb2xsZWN0b3IiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDREQUFxRTs7QUFFckUsNEVBQW1GOztBQUVuRixvRkFBMEY7O0FBSTFGLDhFQUFxRjs7QUFHckY7Ozs7O0VBS0c7QUFDSDtJQUFpQ0EscUNBQWVBO0lBYy9DQTs7TUFER0E7SUFDSEE7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFYUkEsS0FBUUEsY0FBY0EsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFHakRBLEtBQVFBLGlCQUFpQkEsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDcERBLEtBQVFBLFVBQVVBLEdBQVlBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBOztRQVM1Q0EsbUNBQW1DQTtRQUNuQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsUUFBUUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFDL0NBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLENBQUNBLFFBQVFBLEdBQUdBLFFBQVFBO1FBQ3pDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxHQUFHQSxVQUFVQTs7UUFFM0NBLHVCQUF1QkE7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Q3RFQSxFQUFFQTtRQUNGQSxZQUFZQTtRQUNaQSxxRkFBcUZBO1FBQ3JGQSxFQUFFQTtRQUNGQSw0QkFBNEJBO1FBQzVCQSxFQUFFQTtRQUNGQSxrRUFBa0VBO1FBQ2xFQSxFQUFFQTtRQUNGQSxnRUFBZ0VBO1FBQ2hFQSxFQUFFQTtRQUNGQSxlQUFlQTtRQUNmQSxZQUFZQTtRQUNaQSw0QkFBNEJBO1FBQzVCQSxFQUFFQTtRQUNGQSw2RUFBNkVBO1FBQzdFQSxRQUFRQTtRQUNSQSxnQ0FBZ0NBO1FBQ2hDQSxFQUFFQTtRQUNGQSxtQkFBbUJBO1FBQ25CQSxNQUFNQTtJQUNMQSxDQUFDQTs7SUFFRE4sdUNBQUFBO1FBRUNPLGdCQUFLQSxDQUFDQSxPQUFPQSxLQUFDQSxLQUFBQSxDQUFDQTtRQUVmQSxNQUFNQTtJQUNQQSxDQUFDQTs7SUFHRFAsdURBQUFBO1FBRUNRLE9BQU9BLElBQUlBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0E7SUFDaENBLENBQUNBO0lBQ0ZSLDBCQUFDQTtBQUFEQSxDQUFDQSxFQWpPZ0MsZUFBZSxFQWlPL0M7O0FBRUQsbUNBQTRCLENBQUEiLCJmaWxlIjoiY29yZS9yZW5kZXIvQ1NTRGVmYXVsdFJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE1hdHJpeDNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBDU1NSZW5kZXJhYmxlQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvQ1NTUmVuZGVyYWJsZUJhc2VcIik7XG5pbXBvcnQgQ1NTUmVuZGVyZXJCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvQ1NTUmVuZGVyZXJCYXNlXCIpO1xuaW1wb3J0IElSZW5kZXJlclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvSVJlbmRlcmVyXCIpO1xuaW1wb3J0IENTU0VudGl0eUNvbGxlY3Rvclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0NTU0VudGl0eUNvbGxlY3RvclwiKTtcbmltcG9ydCBFbnRpdHlDb2xsZWN0b3JcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0VudGl0eUNvbGxlY3RvclwiKTtcbmltcG9ydCBJQ29sbGVjdG9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0lDb2xsZWN0b3JcIik7XG5pbXBvcnQgQ1NTTWF0ZXJpYWxCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvbWF0ZXJpYWxzL0NTU01hdGVyaWFsQmFzZVwiKTtcbmltcG9ydCBDb29yZGluYXRlU3lzdGVtXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcHJvamVjdGlvbnMvQ29vcmRpbmF0ZVN5c3RlbVwiKTtcblxuXG4vKipcbiAqIFRoZSBEZWZhdWx0UmVuZGVyZXIgY2xhc3MgcHJvdmlkZXMgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIG1ldGhvZC4gSXQgcmVuZGVycyB0aGUgc2NlbmUgZ3JhcGggb2JqZWN0cyB1c2luZyB0aGVcbiAqIG1hdGVyaWFscyBhc3NpZ25lZCB0byB0aGVtLlxuICpcbiAqIEBjbGFzcyBhd2F5LnJlbmRlci5EZWZhdWx0UmVuZGVyZXJcbiAqL1xuY2xhc3MgQ1NTRGVmYXVsdFJlbmRlcmVyIGV4dGVuZHMgQ1NTUmVuZGVyZXJCYXNlIGltcGxlbWVudHMgSVJlbmRlcmVyXG57XG5cdHByaXZhdGUgX2NvbnRhaW5lcjpIVE1MRGl2RWxlbWVudDtcblx0cHJpdmF0ZSBfY29udGV4dDpIVE1MRGl2RWxlbWVudDtcblx0cHJpdmF0ZSBfY29udGV4dFN0eWxlOk1TU3R5bGVDU1NQcm9wZXJ0aWVzO1xuXHRwcml2YXRlIF9jb250ZXh0TWF0cml4Ok1hdHJpeDNEID0gbmV3IE1hdHJpeDNEKCk7XG5cdFxuXHRwcml2YXRlIF9hY3RpdmVNYXRlcmlhbDpDU1NNYXRlcmlhbEJhc2U7XG5cdHByaXZhdGUgX3NreWJveFByb2plY3Rpb246TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoKTtcblx0cHJpdmF0ZSBfdHJhbnNmb3JtOk1hdHJpeDNEID0gbmV3IE1hdHJpeDNEKCk7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgQ1NTRGVmYXVsdFJlbmRlcmVyIG9iamVjdC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHQvL2NyZWF0ZSBjb250YWluZXIgZm9yIHRoZSByZW5kZXJlclxuXHRcdHRoaXMuX2NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5fY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcblx0XHR0aGlzLl9jb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0XG5cdFx0Ly9hZGQgY29udGFpbmVyIHRvIGJvZHlcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lcik7XG5cblx0XHQvL2NyZWF0ZSBjb254dGV4dCBmb3IgdGhlIHJlbmRlcmVyXG5cdFx0dGhpcy5fY29udGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG5cdFx0dGhpcy5fY29udGV4dFN0eWxlID0gdGhpcy5fY29udGV4dC5zdHlsZTtcblx0XHR0aGlzLl9jb250ZXh0U3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0dGhpcy5fY29udGV4dFN0eWxlLnRyYW5zZm9ybVN0eWxlXG5cdFx0XHQ9IHRoaXMuX2NvbnRleHRTdHlsZVtcIi13ZWJraXQtdHJhbnNmb3JtLXN0eWxlXCJdXG5cdFx0XHQ9IHRoaXMuX2NvbnRleHRTdHlsZVtcIi1tb3otdHJhbnNmb3JtLXN0eWxlXCJdXG5cdFx0XHQ9IHRoaXMuX2NvbnRleHRTdHlsZVtcIi1vLXRyYW5zZm9ybS1zdHlsZVwiXVxuXHRcdFx0PSB0aGlzLl9jb250ZXh0U3R5bGVbXCItbXMtdHJhbnNmb3JtLXN0eWxlXCJdID0gXCJwcmVzZXJ2ZS0zZFwiO1xuXHRcdHRoaXMuX2NvbnRleHRTdHlsZS50cmFuc2Zvcm1PcmlnaW5cblx0XHRcdD0gdGhpcy5fY29udGV4dFN0eWxlW1wiLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luXCJdXG5cdFx0XHQ9IHRoaXMuX2NvbnRleHRTdHlsZVtcIi1tb3otdHJhbnNmb3JtLW9yaWdpblwiXVxuXHRcdFx0PSB0aGlzLl9jb250ZXh0U3R5bGVbXCItby10cmFuc2Zvcm0tb3JpZ2luXCJdXG5cdFx0XHQ9IHRoaXMuX2NvbnRleHRTdHlsZVtcIi1tcy10cmFuc2Zvcm0tb3JpZ2luXCJdID0gXCIwJSAwJVwiO1xuXG5cdFx0Ly9hZGQgY29udGV4dCB0byBjb250YWluZXJcblx0XHR0aGlzLl9jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5fY29udGV4dCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGVudGl0eUNvbGxlY3RvclxuXHQgKi9cblx0cHVibGljIHJlbmRlcihlbnRpdHlDb2xsZWN0b3I6SUNvbGxlY3Rvcilcblx0e1xuXHRcdHN1cGVyLnJlbmRlcihlbnRpdHlDb2xsZWN0b3IpO1xuXG5cdFx0aWYgKHRoaXMuX3BCYWNrQnVmZmVySW52YWxpZCkvLyByZXNldCBvciB1cGRhdGUgcmVuZGVyIHNldHRpbmdzXG5cdFx0XHR0aGlzLnBVcGRhdGVCYWNrQnVmZmVyKCk7XG5cblx0XHR0aGlzLl9pUmVuZGVyKDxFbnRpdHlDb2xsZWN0b3I+IGVudGl0eUNvbGxlY3Rvcik7XG5cblx0XHR0aGlzLl9wQmFja0J1ZmZlckludmFsaWQgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIHBEcmF3KGVudGl0eUNvbGxlY3RvcjpFbnRpdHlDb2xsZWN0b3IpXG5cdHtcbi8vXHRcdFx0aWYgKGVudGl0eUNvbGxlY3Rvci5za3lCb3gpIHtcbi8vXHRcdFx0XHRpZiAodGhpcy5fYWN0aXZlTWF0ZXJpYWwpXG4vL1x0XHRcdFx0XHR0aGlzLl9hY3RpdmVNYXRlcmlhbC5pRGVhY3RpdmF0ZSh0aGlzLl9wU3RhZ2VHTCk7XG4vL1xuLy9cdFx0XHRcdHRoaXMuX2FjdGl2ZU1hdGVyaWFsID0gbnVsbDtcbi8vXG4vL1x0XHRcdFx0dGhpcy5fcENvbnRleHQuc2V0RGVwdGhUZXN0KGZhbHNlLCBhd2F5LmdsLkNvbnRleHRHTENvbXBhcmVNb2RlLkFMV0FZUyk7XG4vL1x0XHRcdFx0dGhpcy5kcmF3U2t5Ym94KGVudGl0eUNvbGxlY3Rvcik7XG4vL1xuLy9cdFx0XHR9XG4vL1xuLy9cdFx0XHR2YXIgd2hpY2g6bnVtYmVyID0gdGFyZ2V0PyBEZWZhdWx0UmVuZGVyZXIuU0NSRUVOX1BBU1NFUyA6IERlZmF1bHRSZW5kZXJlci5BTExfUEFTU0VTO1xuXG5cdFx0dmFyIHNoZWV0OkNTU1N0eWxlU2hlZXQgPSA8Q1NTU3R5bGVTaGVldD4gZG9jdW1lbnQuc3R5bGVTaGVldHNbZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoIC0gMV07XG5cblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCBzaGVldC5jc3NSdWxlcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHN0eWxlOk1TU3R5bGVDU1NQcm9wZXJ0aWVzID0gKDxDU1NTdHlsZVJ1bGU+IHNoZWV0LmNzc1J1bGVzW2ldKS5zdHlsZTtcblx0XHRcdHN0eWxlLnRyYW5zZm9ybVxuXHRcdFx0XHQ9IHN0eWxlW1wiLXdlYmtpdC10cmFuc2Zvcm1cIl1cblx0XHRcdFx0PSBzdHlsZVtcIi1tb3otdHJhbnNmb3JtXCJdXG5cdFx0XHRcdD0gc3R5bGVbXCItby10cmFuc2Zvcm1cIl1cblx0XHRcdFx0PSBzdHlsZVtcIi1tcy10cmFuc2Zvcm1cIl0gPSAoZW50aXR5Q29sbGVjdG9yLmNhbWVyYS5wcm9qZWN0aW9uLmNvb3JkaW5hdGVTeXN0ZW0gPT0gQ29vcmRpbmF0ZVN5c3RlbS5SSUdIVF9IQU5ERUQpPyBcIlwiIDogXCJzY2FsZTNkKDEsIC0xLCAxKSB0cmFuc2xhdGVZKC1cIiArIHN0eWxlLmhlaWdodCArIFwiKVwiO1xuXHRcdH1cblxuXHRcdHRoaXMuZHJhd1JlbmRlcmFibGVzKHRoaXMuX3JlbmRlcmFibGVIZWFkLCBlbnRpdHlDb2xsZWN0b3IpO1xuXG4vL1x0XHRcdGlmICh0aGlzLl9hY3RpdmVNYXRlcmlhbClcbi8vXHRcdFx0XHR0aGlzLl9hY3RpdmVNYXRlcmlhbC5pRGVhY3RpdmF0ZSh0aGlzLl9wU3RhZ2VHTCk7XG5cblx0XHR0aGlzLl9hY3RpdmVNYXRlcmlhbCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYmFja2J1ZmZlciBwcm9wZXJ0aWVzLlxuXHQgKi9cblx0cHVibGljIHBVcGRhdGVCYWNrQnVmZmVyKClcblx0e1xuXHRcdHRoaXMuX2NvbnRhaW5lci5zdHlsZS53aWR0aCA9IHRoaXMuX3dpZHRoICsgXCJweFwiO1xuXHRcdHRoaXMuX2NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB0aGlzLl9oZWlnaHQgKyBcInB4XCI7XG5cdFx0dGhpcy5fY29udGFpbmVyLnN0eWxlLmNsaXAgPSBcInJlY3QoMHB4LCBcIiArIHRoaXMuX3dpZHRoICsgXCJweCwgXCIgKyB0aGlzLl9oZWlnaHQgKyBcInB4LCAwcHgpXCI7XG5cblx0XHQvL3VwZGF0ZSBjb250ZXh0IG1hdHJpeFxuXHRcdHRoaXMuX2NvbnRleHRNYXRyaXgucmF3RGF0YVswXSA9IHRoaXMuX3dpZHRoLzI7XG5cdFx0dGhpcy5fY29udGV4dE1hdHJpeC5yYXdEYXRhWzVdID0gLXRoaXMuX2hlaWdodC8yO1xuXHRcdHRoaXMuX2NvbnRleHRNYXRyaXgucmF3RGF0YVsxMF0gPSAtMTsgLy9maXggZm9yIGlubmFjY3VyYXRlIHotc29ydFxuXHRcdHRoaXMuX2NvbnRleHRNYXRyaXgucmF3RGF0YVsxMl0gPSB0aGlzLl93aWR0aC8yO1xuXHRcdHRoaXMuX2NvbnRleHRNYXRyaXgucmF3RGF0YVsxM10gPSB0aGlzLl9oZWlnaHQvMjtcblxuXHRcdC8vdXBkYXRlIGNvbnRleHQgdHJhbmZvcm1cblx0XHR0aGlzLl9jb250ZXh0U3R5bGUudHJhbnNmb3JtXG5cdFx0XHQ9IHRoaXMuX2NvbnRleHRTdHlsZVtcIi13ZWJraXQtdHJhbnNmb3JtXCJdXG5cdFx0XHQ9IHRoaXMuX2NvbnRleHRTdHlsZVtcIi1tb3otdHJhbnNmb3JtXCJdXG5cdFx0XHQ9IHRoaXMuX2NvbnRleHRTdHlsZVtcIi1vLXRyYW5zZm9ybVwiXVxuXHRcdFx0PSB0aGlzLl9jb250ZXh0U3R5bGVbXCItbXMtdHJhbnNmb3JtXCJdID0gdGhpcy5fY29udGV4dE1hdHJpeC50b1N0cmluZygpO1xuXG5cdFx0dGhpcy5fcEJhY2tCdWZmZXJJbnZhbGlkID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogRHJhdyB0aGUgc2t5Ym94IGlmIHByZXNlbnQuXG5cdCAqIEBwYXJhbSBlbnRpdHlDb2xsZWN0b3IgVGhlIEVudGl0eUNvbGxlY3RvciBjb250YWluaW5nIGFsbCBwb3RlbnRpYWxseSB2aXNpYmxlIGluZm9ybWF0aW9uLlxuXHQgKi9cblx0cHJpdmF0ZSBkcmF3U2t5Ym94KGVudGl0eUNvbGxlY3RvcjpDU1NFbnRpdHlDb2xsZWN0b3IpXG5cdHtcblx0XHQvL1RPRE9cblx0fVxuXG5cdC8qKlxuXHQgKiBEcmF3IGEgbGlzdCBvZiByZW5kZXJhYmxlcy5cblx0ICogQHBhcmFtIHJlbmRlcmFibGVzIFRoZSByZW5kZXJhYmxlcyB0byBkcmF3LlxuXHQgKiBAcGFyYW0gZW50aXR5Q29sbGVjdG9yIFRoZSBFbnRpdHlDb2xsZWN0b3IgY29udGFpbmluZyBhbGwgcG90ZW50aWFsbHkgdmlzaWJsZSBpbmZvcm1hdGlvbi5cblx0ICovXG5cdHByaXZhdGUgZHJhd1JlbmRlcmFibGVzKGl0ZW06Q1NTUmVuZGVyYWJsZUJhc2UsIGVudGl0eUNvbGxlY3RvcjpFbnRpdHlDb2xsZWN0b3IpXG5cdHtcblx0XHR2YXIgdmlld1Byb2plY3Rpb246TWF0cml4M0QgPSBlbnRpdHlDb2xsZWN0b3IuY2FtZXJhLnZpZXdQcm9qZWN0aW9uLmNsb25lKCk7XG5cblx0XHR3aGlsZSAoaXRlbSkge1xuXHRcdFx0dGhpcy5fYWN0aXZlTWF0ZXJpYWwgPSA8Q1NTTWF0ZXJpYWxCYXNlPiBpdGVtLm1hdGVyaWFsT3duZXIubWF0ZXJpYWw7XG5cblx0XHRcdC8vc2VyaWFsaXNlIHRyYW5zZm9ybSBhbmQgYXBwbHkgdG8gaHRtbCBlbGVtZW50XG5cdFx0XHR0aGlzLl90cmFuc2Zvcm0uY29weVJhd0RhdGFGcm9tKGl0ZW0ucmVuZGVyU2NlbmVUcmFuc2Zvcm0ucmF3RGF0YSk7XG5cdFx0XHR0aGlzLl90cmFuc2Zvcm0uYXBwZW5kKHZpZXdQcm9qZWN0aW9uKTtcblxuXHRcdFx0dmFyIHN0eWxlOk1TU3R5bGVDU1NQcm9wZXJ0aWVzID0gaXRlbS5odG1sRWxlbWVudC5zdHlsZTtcblxuXHRcdFx0c3R5bGUudHJhbnNmb3JtXG5cdFx0XHRcdD0gc3R5bGVbXCItd2Via2l0LXRyYW5zZm9ybVwiXVxuXHRcdFx0XHQ9IHN0eWxlW1wiLW1vei10cmFuc2Zvcm1cIl1cblx0XHRcdFx0PSBzdHlsZVtcIi1vLXRyYW5zZm9ybVwiXVxuXHRcdFx0XHQ9IHN0eWxlW1wiLW1zLXRyYW5zZm9ybVwiXSA9IHRoaXMuX3RyYW5zZm9ybS50b1N0cmluZygpO1xuXG5cdFx0XHRzdHlsZS50cmFuc2Zvcm1TdHlsZVxuXHRcdFx0XHQ9IHN0eWxlW1wiLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGVcIl1cblx0XHRcdFx0PSBzdHlsZVtcIi1tb3otdHJhbnNmb3JtLXN0eWxlXCJdXG5cdFx0XHRcdD0gc3R5bGVbXCItby10cmFuc2Zvcm0tc3R5bGVcIl1cblx0XHRcdFx0PSBzdHlsZVtcIi1tcy10cmFuc2Zvcm0tc3R5bGVcIl0gPSBcInByZXNlcnZlLTNkXCI7XG5cblx0XHRcdC8vY2hlY2sgaWYgY2hpbGQgcmVxdWlyZXMgYWRkaW5nIHRvIHRoZSB2aWV3XG5cdFx0XHRpZiAoIXRoaXMuX2NvbnRleHQuY29udGFpbnMoaXRlbS5odG1sRWxlbWVudCkpXG5cdFx0XHRcdHRoaXMuX2NvbnRleHQuYXBwZW5kQ2hpbGQoaXRlbS5odG1sRWxlbWVudCk7XG5cblx0XHRcdGl0ZW0gPSBpdGVtLm5leHQ7XG5cdFx0fVxuXG4vL1x0XHRcdHZhciBudW1QYXNzZXM6bnVtYmVyO1xuLy9cdFx0XHR2YXIgajpudW1iZXI7XG4vL1x0XHRcdHZhciBjYW1lcmE6YXdheS5lbnRpdGllcy5DYW1lcmEgPSBlbnRpdHlDb2xsZWN0b3IuY2FtZXJhO1xuLy9cdFx0XHR2YXIgaXRlbTI6YXdheS5yZW5kZXIuQ1NTUmVuZGVyYWJsZUJhc2U7XG4vL1xuLy9cdFx0XHR3aGlsZSAoaXRlbSkge1xuLy9cdFx0XHRcdHRoaXMuX2FjdGl2ZU1hdGVyaWFsID0gaXRlbS5tYXRlcmlhbDtcbi8vXG4vL1x0XHRcdFx0dGhpcy5fYWN0aXZlTWF0ZXJpYWwuaVVwZGF0ZU1hdGVyaWFsKHRoaXMuX3BDb250ZXh0KTtcbi8vXG4vL1x0XHRcdFx0bnVtUGFzc2VzID0gdGhpcy5fYWN0aXZlTWF0ZXJpYWwuX2lOdW1QYXNzZXM7XG4vL1xuLy9cdFx0XHRcdGogPSAwO1xuLy9cbi8vXHRcdFx0XHRkbyB7XG4vL1x0XHRcdFx0XHRpdGVtMiA9IGl0ZW07XG4vL1xuLy9cdFx0XHRcdFx0dmFyIHJ0dE1hc2s6bnVtYmVyID0gdGhpcy5fYWN0aXZlTWF0ZXJpYWwuaVBhc3NSZW5kZXJzVG9UZXh0dXJlKGopPyAxIDogMjtcbi8vXG4vL1x0XHRcdFx0XHRpZiAoKHJ0dE1hc2sgJiB3aGljaCkgIT0gMCkge1xuLy9cdFx0XHRcdFx0XHR0aGlzLl9hY3RpdmVNYXRlcmlhbC5pQWN0aXZhdGVQYXNzKGosIHRoaXMuX3BTdGFnZUdMLCBjYW1lcmEpO1xuLy9cbi8vXHRcdFx0XHRcdFx0ZG8ge1xuLy9cdFx0XHRcdFx0XHRcdHRoaXMuX2FjdGl2ZU1hdGVyaWFsLmlSZW5kZXJQYXNzKGosIGl0ZW0yLCB0aGlzLl9wU3RhZ2VHTCwgZW50aXR5Q29sbGVjdG9yKTtcbi8vXG4vL1x0XHRcdFx0XHRcdFx0aXRlbTIgPSBpdGVtMi5uZXh0O1xuLy9cbi8vXHRcdFx0XHRcdFx0fSB3aGlsZSAoaXRlbTIgJiYgaXRlbTIubWF0ZXJpYWwgPT0gdGhpcy5fYWN0aXZlTWF0ZXJpYWwpO1xuLy9cbi8vXHRcdFx0XHRcdFx0dGhpcy5fYWN0aXZlTWF0ZXJpYWwuaURlYWN0aXZhdGVQYXNzKGosIHRoaXMuX3BTdGFnZUdMKTtcbi8vXG4vL1x0XHRcdFx0XHR9IGVsc2Uge1xuLy9cdFx0XHRcdFx0XHRkbyB7XG4vL1x0XHRcdFx0XHRcdFx0aXRlbTIgPSBpdGVtMi5uZXh0O1xuLy9cbi8vXHRcdFx0XHRcdFx0fSB3aGlsZSAoaXRlbTIgJiYgaXRlbTIucmVuZGVyYWJsZS5tYXRlcmlhbCA9PSB0aGlzLl9hY3RpdmVNYXRlcmlhbCk7XG4vL1x0XHRcdFx0XHR9XG4vL1x0XHRcdFx0fSB3aGlsZSAoKytqIDwgbnVtUGFzc2VzKTtcbi8vXG4vL1x0XHRcdFx0aXRlbSA9IGl0ZW0yO1xuLy9cdFx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHRzdXBlci5kaXNwb3NlKCk7XG5cblx0XHQvL1RPRE9cblx0fVxuXG5cblx0cHVibGljIF9pQ3JlYXRlRW50aXR5Q29sbGVjdG9yKCk6SUNvbGxlY3RvclxuXHR7XG5cdFx0cmV0dXJuIG5ldyBDU1NFbnRpdHlDb2xsZWN0b3IoKTtcblx0fVxufVxuXG5leHBvcnQgPSBDU1NEZWZhdWx0UmVuZGVyZXI7Il19 \ No newline at end of file diff --git a/lib/core/render/CSSDefaultRenderer.ts b/lib/core/render/CSSDefaultRenderer.ts new file mode 100644 index 00000000..92b7f417 --- /dev/null +++ b/lib/core/render/CSSDefaultRenderer.ts @@ -0,0 +1,245 @@ +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); +import CSSRendererBase = require("awayjs-core/lib/core/render/CSSRendererBase"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import CSSEntityCollector = require("awayjs-core/lib/core/traverse/CSSEntityCollector"); +import EntityCollector = require("awayjs-core/lib/core/traverse/EntityCollector"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); +import CoordinateSystem = require("awayjs-core/lib/projections/CoordinateSystem"); + + +/** + * The DefaultRenderer class provides the default rendering method. It renders the scene graph objects using the + * materials assigned to them. + * + * @class away.render.DefaultRenderer + */ +class CSSDefaultRenderer extends CSSRendererBase implements IRenderer +{ + private _container:HTMLDivElement; + private _context:HTMLDivElement; + private _contextStyle:MSStyleCSSProperties; + private _contextMatrix:Matrix3D = new Matrix3D(); + + private _activeMaterial:CSSMaterialBase; + private _skyboxProjection:Matrix3D = new Matrix3D(); + private _transform:Matrix3D = new Matrix3D(); + + /** + * Creates a new CSSDefaultRenderer object. + */ + constructor() + { + super(); + + //create container for the renderer + this._container = document.createElement("div"); + this._container.style.overflow = "hidden"; + this._container.style.position = "absolute"; + + //add container to body + document.body.appendChild(this._container); + + //create conxtext for the renderer + this._context = document.createElement("div"); + this._contextStyle = this._context.style; + this._contextStyle.position = "absolute"; + this._contextStyle.transformStyle + = this._contextStyle["-webkit-transform-style"] + = this._contextStyle["-moz-transform-style"] + = this._contextStyle["-o-transform-style"] + = this._contextStyle["-ms-transform-style"] = "preserve-3d"; + this._contextStyle.transformOrigin + = this._contextStyle["-webkit-transform-origin"] + = this._contextStyle["-moz-transform-origin"] + = this._contextStyle["-o-transform-origin"] + = this._contextStyle["-ms-transform-origin"] = "0% 0%"; + + //add context to container + this._container.appendChild(this._context); + } + + /** + * + * @param entityCollector + */ + public render(entityCollector:ICollector) + { + super.render(entityCollector); + + if (this._pBackBufferInvalid)// reset or update render settings + this.pUpdateBackBuffer(); + + this._iRender( entityCollector); + + this._pBackBufferInvalid = false; + } + + /** + * @inheritDoc + */ + public pDraw(entityCollector:EntityCollector) + { +// if (entityCollector.skyBox) { +// if (this._activeMaterial) +// this._activeMaterial.iDeactivate(this._pStageGL); +// +// this._activeMaterial = null; +// +// this._pContext.setDepthTest(false, away.gl.ContextGLCompareMode.ALWAYS); +// this.drawSkybox(entityCollector); +// +// } +// +// var which:number = target? DefaultRenderer.SCREEN_PASSES : DefaultRenderer.ALL_PASSES; + + var sheet:CSSStyleSheet = document.styleSheets[document.styleSheets.length - 1]; + + for (var i:number = 0; i < sheet.cssRules.length; i++) { + var style:MSStyleCSSProperties = ( sheet.cssRules[i]).style; + style.transform + = style["-webkit-transform"] + = style["-moz-transform"] + = style["-o-transform"] + = style["-ms-transform"] = (entityCollector.camera.projection.coordinateSystem == CoordinateSystem.RIGHT_HANDED)? "" : "scale3d(1, -1, 1) translateY(-" + style.height + ")"; + } + + this.drawRenderables(this._renderableHead, entityCollector); + +// if (this._activeMaterial) +// this._activeMaterial.iDeactivate(this._pStageGL); + + this._activeMaterial = null; + } + + /** + * Updates the backbuffer properties. + */ + public pUpdateBackBuffer() + { + this._container.style.width = this._width + "px"; + this._container.style.height = this._height + "px"; + this._container.style.clip = "rect(0px, " + this._width + "px, " + this._height + "px, 0px)"; + + //update context matrix + this._contextMatrix.rawData[0] = this._width/2; + this._contextMatrix.rawData[5] = -this._height/2; + this._contextMatrix.rawData[10] = -1; //fix for innaccurate z-sort + this._contextMatrix.rawData[12] = this._width/2; + this._contextMatrix.rawData[13] = this._height/2; + + //update context tranform + this._contextStyle.transform + = this._contextStyle["-webkit-transform"] + = this._contextStyle["-moz-transform"] + = this._contextStyle["-o-transform"] + = this._contextStyle["-ms-transform"] = this._contextMatrix.toString(); + + this._pBackBufferInvalid = false; + } + + /** + * Draw the skybox if present. + * @param entityCollector The EntityCollector containing all potentially visible information. + */ + private drawSkybox(entityCollector:CSSEntityCollector) + { + //TODO + } + + /** + * Draw a list of renderables. + * @param renderables The renderables to draw. + * @param entityCollector The EntityCollector containing all potentially visible information. + */ + private drawRenderables(item:CSSRenderableBase, entityCollector:EntityCollector) + { + var viewProjection:Matrix3D = entityCollector.camera.viewProjection.clone(); + + while (item) { + this._activeMaterial = item.materialOwner.material; + + //serialise transform and apply to html element + this._transform.copyRawDataFrom(item.renderSceneTransform.rawData); + this._transform.append(viewProjection); + + var style:MSStyleCSSProperties = item.htmlElement.style; + + style.transform + = style["-webkit-transform"] + = style["-moz-transform"] + = style["-o-transform"] + = style["-ms-transform"] = this._transform.toString(); + + style.transformStyle + = style["-webkit-transform-style"] + = style["-moz-transform-style"] + = style["-o-transform-style"] + = style["-ms-transform-style"] = "preserve-3d"; + + //check if child requires adding to the view + if (!this._context.contains(item.htmlElement)) + this._context.appendChild(item.htmlElement); + + item = item.next; + } + +// var numPasses:number; +// var j:number; +// var camera:away.entities.Camera = entityCollector.camera; +// var item2:away.render.CSSRenderableBase; +// +// while (item) { +// this._activeMaterial = item.material; +// +// this._activeMaterial.iUpdateMaterial(this._pContext); +// +// numPasses = this._activeMaterial._iNumPasses; +// +// j = 0; +// +// do { +// item2 = item; +// +// var rttMask:number = this._activeMaterial.iPassRendersToTexture(j)? 1 : 2; +// +// if ((rttMask & which) != 0) { +// this._activeMaterial.iActivatePass(j, this._pStageGL, camera); +// +// do { +// this._activeMaterial.iRenderPass(j, item2, this._pStageGL, entityCollector); +// +// item2 = item2.next; +// +// } while (item2 && item2.material == this._activeMaterial); +// +// this._activeMaterial.iDeactivatePass(j, this._pStageGL); +// +// } else { +// do { +// item2 = item2.next; +// +// } while (item2 && item2.renderable.material == this._activeMaterial); +// } +// } while (++j < numPasses); +// +// item = item2; +// } + } + + public dispose() + { + super.dispose(); + + //TODO + } + + + public _iCreateEntityCollector():ICollector + { + return new CSSEntityCollector(); + } +} + +export = CSSDefaultRenderer; \ No newline at end of file diff --git a/lib/core/render/CSSRendererBase.js b/lib/core/render/CSSRendererBase.js new file mode 100755 index 00000000..a75cd517 --- /dev/null +++ b/lib/core/render/CSSRendererBase.js @@ -0,0 +1,452 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Point = require("awayjs-core/lib/core/geom/Point"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +var CSSBillboardRenderable = require("awayjs-core/lib/core/pool/CSSBillboardRenderable"); +var CSSLineSegmentRenderable = require("awayjs-core/lib/core/pool/CSSLineSegmentRenderable"); + +var RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); + +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var RendererEvent = require("awayjs-core/lib/events/RendererEvent"); + +/** +* RendererBase forms an abstract base class for classes that are used in the rendering pipeline to render the +* contents of a partition +* +* @class away.render.RendererBase +*/ +var CSSRendererBase = (function (_super) { + __extends(CSSRendererBase, _super); + /** + * Creates a new RendererBase object. + */ + function CSSRendererBase(renderToTexture, forceSoftware, profile) { + if (typeof renderToTexture === "undefined") { renderToTexture = false; } + if (typeof forceSoftware === "undefined") { forceSoftware = false; } + if (typeof profile === "undefined") { profile = "baseline"; } + _super.call(this); + this._backgroundR = 0; + this._backgroundG = 0; + this._backgroundB = 0; + this._backgroundAlpha = 1; + this._shareContext = false; + this._pBackBufferInvalid = true; + this._depthTextureInvalid = true; + this._viewPort = new Rectangle(); + this._scissorRect = new Rectangle(); + this._localPos = new Point(); + this._globalPos = new Point(); + + this._billboardRenderablePool = RenderablePool.getPool(CSSBillboardRenderable); + this._lineSegmentRenderablePool = RenderablePool.getPool(CSSLineSegmentRenderable); + + this._viewPort = new Rectangle(); + + if (this._width == 0) + this.width = window.innerWidth; + + if (this._height == 0) + this.height = window.innerHeight; + } + Object.defineProperty(CSSRendererBase.prototype, "viewPort", { + /** + * A viewPort rectangle equivalent of the StageGL size and position. + */ + get: function () { + return this._viewPort; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CSSRendererBase.prototype, "scissorRect", { + /** + * A scissor rectangle equivalent of the view size and position. + */ + get: function () { + return this._scissorRect; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CSSRendererBase.prototype, "x", { + /** + * + */ + get: function () { + return this._localPos.x; + }, + set: function (value) { + if (this.x == value) + return; + + this.updateGlobalPos(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "y", { + /** + * + */ + get: function () { + return this._localPos.y; + }, + set: function (value) { + if (this.y == value) + return; + + this._globalPos.y = this._localPos.y = value; + + this.updateGlobalPos(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "width", { + /** + * + */ + get: function () { + return this._width; + }, + set: function (value) { + if (this._width == value) + return; + + this._width = value; + this._scissorRect.width = value; + this._viewPort.width = value; + + this._pBackBufferInvalid = true; + this._depthTextureInvalid = true; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "height", { + /** + * + */ + get: function () { + return this._height; + }, + set: function (value) { + if (this._height == value) + return; + + this._height = value; + this._scissorRect.height = value; + this._viewPort.height = value; + + this._pBackBufferInvalid = true; + this._depthTextureInvalid = true; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundR", { + /** + * The background color's red component, used when clearing. + * + * @private + */ + get: function () { + return this._backgroundR; + }, + set: function (value) { + if (this._backgroundR == value) + return; + + this._backgroundR = value; + + this._pBackBufferInvalid = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundG", { + /** + * The background color's green component, used when clearing. + * + * @private + */ + get: function () { + return this._backgroundG; + }, + set: function (value) { + if (this._backgroundG == value) + return; + + this._backgroundG = value; + + this._pBackBufferInvalid = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundB", { + /** + * The background color's blue component, used when clearing. + * + * @private + */ + get: function () { + return this._backgroundB; + }, + set: function (value) { + if (this._backgroundB == value) + return; + + this._backgroundB = value; + + this._pBackBufferInvalid = true; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CSSRendererBase.prototype, "shareContext", { + get: function () { + return this._shareContext; + }, + set: function (value) { + if (this._shareContext == value) + return; + + this._shareContext = value; + + this.updateGlobalPos(); + }, + enumerable: true, + configurable: true + }); + + + /** + * Disposes the resources used by the RendererBase. + */ + CSSRendererBase.prototype.dispose = function () { + /* + if (_backgroundImageRenderer) { + _backgroundImageRenderer.dispose(); + _backgroundImageRenderer = null; + } + */ + }; + + CSSRendererBase.prototype.render = function (entityCollector) { + this._viewportDirty = false; + this._scissorDirty = false; + }; + + /** + * Renders the potentially visible geometry to the back buffer or texture. + * @param entityCollector The EntityCollector object containing the potentially visible geometry. + * @param scissorRect + */ + CSSRendererBase.prototype._iRender = function (entityCollector, target, scissorRect, surfaceSelector) { + if (typeof target === "undefined") { target = null; } + if (typeof scissorRect === "undefined") { scissorRect = null; } + if (typeof surfaceSelector === "undefined") { surfaceSelector = 0; } + if (!entityCollector.entityHead) + return; + + this.pExecuteRender(entityCollector, scissorRect); + }; + + CSSRendererBase.prototype._iRenderCascades = function (entityCollector, target, numCascades, scissorRects, cameras) { + }; + CSSRendererBase.prototype.pCollectRenderables = function (entityCollector) { + //reset head values + this._renderableHead = null; + + //grab entity head + var item = entityCollector.entityHead; + + //set temp values for entry point and camera forward vector + this._pCamera = entityCollector.camera; + this._iEntryPoint = this._pCamera.scenePosition; + this._pCameraForward = this._pCamera.transform.forwardVector; + + while (item) { + item.entity._iCollectRenderables(this); + item = item.next; + } + }; + + /** + * Renders the potentially visible geometry to the back buffer or texture. Only executed if everything is set up. + * @param entityCollector The EntityCollector object containing the potentially visible geometry. + * @param scissorRect + */ + CSSRendererBase.prototype.pExecuteRender = function (entityCollector, scissorRect) { + if (typeof scissorRect === "undefined") { scissorRect = null; } + this.pCollectRenderables(entityCollector); + + this.pDraw(entityCollector); + }; + + /** + * Performs the actual drawing of dom objects to the target. + * + * @param entityCollector The EntityCollector object containing the potentially visible dom objects. + */ + CSSRendererBase.prototype.pDraw = function (entityCollector) { + throw new AbstractMethodError(); + }; + + Object.defineProperty(CSSRendererBase.prototype, "_iBackgroundAlpha", { + get: function () { + return this._backgroundAlpha; + }, + set: function (value) { + if (this._backgroundAlpha == value) + return; + + this._backgroundAlpha = value; + + this._pBackBufferInvalid = true; + }, + enumerable: true, + configurable: true + }); + + + /** + * + * @param billboard + */ + CSSRendererBase.prototype.applyBillboard = function (billboard) { + this._applyRenderable(this._billboardRenderablePool.getItem(billboard)); + }; + + /** + * + * @param lineSubMesh + */ + CSSRendererBase.prototype.applyLineSubMesh = function (lineSubMesh) { + //this._applyRenderable( this._billboardRenderablePool.getItem(lineSegment)); + }; + + /** + * + * @param skybox + */ + CSSRendererBase.prototype.applySkybox = function (skybox) { + }; + + /** + * + * @param triangleSubMesh + */ + CSSRendererBase.prototype.applyTriangleSubMesh = function (triangleSubMesh) { + }; + + /** + * + * @param renderable + * @private + */ + CSSRendererBase.prototype._applyRenderable = function (renderable) { + var material = renderable.materialOwner.material; + var entity = renderable.sourceEntity; + var position = entity.scenePosition; + + if (material) { + //set ids for faster referencing + renderable.materialId = material._iMaterialId; + + // renderable.renderOrderId = material._iRenderOrderId; + renderable.cascaded = false; + + // project onto camera's z-axis + position = this._iEntryPoint.subtract(position); + renderable.zIndex = entity.zOffset - position.dotProduct(this._pCameraForward); + + //store reference to scene transform + renderable.renderSceneTransform = renderable.sourceEntity.getRenderSceneTransform(this._pCamera); + + //store reference to next item in list + renderable.next = this._renderableHead; + this._renderableHead = renderable; + } + }; + + /** + * @private + */ + CSSRendererBase.prototype.notifyScissorUpdate = function () { + if (this._scissorDirty) + return; + + this._scissorDirty = true; + + if (!this._scissorUpdated) + this._scissorUpdated = new RendererEvent(RendererEvent.SCISSOR_UPDATED); + + this.dispatchEvent(this._scissorUpdated); + }; + + /** + * @private + */ + CSSRendererBase.prototype.notifyViewportUpdate = function () { + if (this._viewportDirty) + return; + + this._viewportDirty = true; + + if (!this._viewPortUpdated) + this._viewPortUpdated = new RendererEvent(RendererEvent.VIEWPORT_UPDATED); + + this.dispatchEvent(this._viewPortUpdated); + }; + + /** + * + */ + CSSRendererBase.prototype.updateGlobalPos = function () { + this._viewPort.x = this._globalPos.x; + this._viewPort.y = this._globalPos.y; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + }; + + CSSRendererBase.prototype._iCreateEntityCollector = function () { + throw new AbstractMethodError(); + }; + return CSSRendererBase; +})(EventDispatcher); + +module.exports = CSSRendererBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcmVuZGVyL0NTU1JlbmRlcmVyQmFzZS50cyJdLCJuYW1lcyI6WyJDU1NSZW5kZXJlckJhc2UiLCJDU1NSZW5kZXJlckJhc2UuY29uc3RydWN0b3IiLCJDU1NSZW5kZXJlckJhc2UuZGlzcG9zZSIsIkNTU1JlbmRlcmVyQmFzZS5yZW5kZXIiLCJDU1NSZW5kZXJlckJhc2UuX2lSZW5kZXIiLCJDU1NSZW5kZXJlckJhc2UuX2lSZW5kZXJDYXNjYWRlcyIsIkNTU1JlbmRlcmVyQmFzZS5wQ29sbGVjdFJlbmRlcmFibGVzIiwiQ1NTUmVuZGVyZXJCYXNlLnBFeGVjdXRlUmVuZGVyIiwiQ1NTUmVuZGVyZXJCYXNlLnBEcmF3IiwiQ1NTUmVuZGVyZXJCYXNlLmFwcGx5QmlsbGJvYXJkIiwiQ1NTUmVuZGVyZXJCYXNlLmFwcGx5TGluZVN1Yk1lc2giLCJDU1NSZW5kZXJlckJhc2UuYXBwbHlTa3lib3giLCJDU1NSZW5kZXJlckJhc2UuYXBwbHlUcmlhbmdsZVN1Yk1lc2giLCJDU1NSZW5kZXJlckJhc2UuX2FwcGx5UmVuZGVyYWJsZSIsIkNTU1JlbmRlcmVyQmFzZS5ub3RpZnlTY2lzc29yVXBkYXRlIiwiQ1NTUmVuZGVyZXJCYXNlLm5vdGlmeVZpZXdwb3J0VXBkYXRlIiwiQ1NTUmVuZGVyZXJCYXNlLnVwZGF0ZUdsb2JhbFBvcyIsIkNTU1JlbmRlcmVyQmFzZS5faUNyZWF0ZUVudGl0eUNvbGxlY3RvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsc0RBRStEO0FBQy9ELDhEQUFzRTs7QUFFdEUsd0ZBQTZGO0FBQzdGLDRGQUFpRzs7QUFHakcsd0VBQStFOztBQVUvRSwrRUFBcUY7QUFDckYsdUVBQThFO0FBQzlFLG1FQUEwRTs7QUFJMUU7Ozs7O0VBS0c7QUFDSDtJQUE4QkEsa0NBQWVBO0lBNEk1Q0E7O01BREdBO0lBQ0hBLHlCQUFZQSxlQUErQkEsRUFBRUEsYUFBNkJBLEVBQUVBLE9BQTJCQTtRQUEzRkMsOENBQUFBLGVBQWVBLEdBQVdBLEtBQUtB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QUFDQTtJQUNGakIsdUJBQUNBO0FBQURBLENBQUNBLEVBemI2QixlQUFlLEVBeWI1Qzs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJjb3JlL3JlbmRlci9DU1NSZW5kZXJlckJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTGluZVN1Yk1lc2hcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaW5lU3ViTWVzaFwiKTtcbmltcG9ydCBUcmlhbmdsZVN1Yk1lc2hcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvVHJpYW5nbGVTdWJNZXNoXCIpO1xuaW1wb3J0IFBvaW50XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9Qb2ludFwiKTtcbmltcG9ydCBSZWN0YW5nbGVcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9SZWN0YW5nbGVcIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuaW1wb3J0IENTU0JpbGxib2FyZFJlbmRlcmFibGVcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcG9vbC9DU1NCaWxsYm9hcmRSZW5kZXJhYmxlXCIpO1xuaW1wb3J0IENTU0xpbmVTZWdtZW50UmVuZGVyYWJsZVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0NTU0xpbmVTZWdtZW50UmVuZGVyYWJsZVwiKTtcbmltcG9ydCBDU1NSZW5kZXJhYmxlQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvQ1NTUmVuZGVyYWJsZUJhc2VcIik7XG5pbXBvcnQgRW50aXR5TGlzdEl0ZW1cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvRW50aXR5TGlzdEl0ZW1cIik7XG5pbXBvcnQgUmVuZGVyYWJsZVBvb2xcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvUmVuZGVyYWJsZVBvb2xcIik7XG5pbXBvcnQgSVJlbmRlcmVyXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9JUmVuZGVyZXJcIik7XG5pbXBvcnQgSUVudGl0eVNvcnRlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvc29ydC9JRW50aXR5U29ydGVyXCIpO1xuaW1wb3J0IENTU0VudGl0eUNvbGxlY3Rvclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0NTU0VudGl0eUNvbGxlY3RvclwiKTtcbmltcG9ydCBFbnRpdHlDb2xsZWN0b3JcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0VudGl0eUNvbGxlY3RvclwiKTtcbmltcG9ydCBJQ29sbGVjdG9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0lDb2xsZWN0b3JcIik7XG5pbXBvcnQgQmlsbGJvYXJkXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9CaWxsYm9hcmRcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5pbXBvcnQgU2t5Ym94XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL1NreWJveFwiKTtcbmltcG9ydCBBYnN0cmFjdE1ldGhvZEVycm9yXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9BYnN0cmFjdE1ldGhvZEVycm9yXCIpO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudERpc3BhdGNoZXJcIik7XG5pbXBvcnQgUmVuZGVyZXJFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9SZW5kZXJlckV2ZW50XCIpO1xuaW1wb3J0IENTU01hdGVyaWFsQmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9DU1NNYXRlcmlhbEJhc2VcIik7XG5pbXBvcnQgVGV4dHVyZVByb3h5QmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL1RleHR1cmVQcm94eUJhc2VcIik7XG5cbi8qKlxuICogUmVuZGVyZXJCYXNlIGZvcm1zIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGNsYXNzZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcmVuZGVyaW5nIHBpcGVsaW5lIHRvIHJlbmRlciB0aGVcbiAqIGNvbnRlbnRzIG9mIGEgcGFydGl0aW9uXG4gKlxuICogQGNsYXNzIGF3YXkucmVuZGVyLlJlbmRlcmVyQmFzZVxuICovXG5jbGFzcyBDU1NSZW5kZXJlckJhc2UgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXJcbntcblx0cHJpdmF0ZSBfYmlsbGJvYXJkUmVuZGVyYWJsZVBvb2w6UmVuZGVyYWJsZVBvb2w7XG5cdHByaXZhdGUgX2xpbmVTZWdtZW50UmVuZGVyYWJsZVBvb2w6UmVuZGVyYWJsZVBvb2w7XG5cblx0cHVibGljIF9wQ2FtZXJhOkNhbWVyYTtcblx0cHVibGljIF9pRW50cnlQb2ludDpWZWN0b3IzRDtcblx0cHVibGljIF9wQ2FtZXJhRm9yd2FyZDpWZWN0b3IzRDtcblxuXHRwcml2YXRlIF9iYWNrZ3JvdW5kUjpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9iYWNrZ3JvdW5kRzpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9iYWNrZ3JvdW5kQjpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9iYWNrZ3JvdW5kQWxwaGE6bnVtYmVyID0gMTtcblx0cHJpdmF0ZSBfc2hhcmVDb250ZXh0OmJvb2xlYW4gPSBmYWxzZTtcblxuXHRwdWJsaWMgX3BCYWNrQnVmZmVySW52YWxpZDpib29sZWFuID0gdHJ1ZTtcblx0cHVibGljIF9kZXB0aFRleHR1cmVJbnZhbGlkOmJvb2xlYW4gPSB0cnVlO1xuXG5cdHB1YmxpYyBfcmVuZGVyYWJsZUhlYWQ6Q1NTUmVuZGVyYWJsZUJhc2U7XG5cblx0cHVibGljIF93aWR0aDpudW1iZXI7XG5cdHB1YmxpYyBfaGVpZ2h0Om51bWJlcjtcblxuXHRwcml2YXRlIF92aWV3UG9ydDpSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKCk7XG5cdHByaXZhdGUgX3ZpZXdwb3J0RGlydHk6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfc2Npc3NvclJlY3Q6UmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgpO1xuXHRwcml2YXRlIF9zY2lzc29yRGlydHk6Ym9vbGVhbjtcblxuXHRwcml2YXRlIF9sb2NhbFBvczpQb2ludCA9IG5ldyBQb2ludCgpO1xuXHRwcml2YXRlIF9nbG9iYWxQb3M6UG9pbnQgPSBuZXcgUG9pbnQoKTtcblxuXHRwcml2YXRlIF9zY2lzc29yVXBkYXRlZDpSZW5kZXJlckV2ZW50O1xuXHRwcml2YXRlIF92aWV3UG9ydFVwZGF0ZWQ6UmVuZGVyZXJFdmVudDtcblxuXHQvKipcblx0ICogQSB2aWV3UG9ydCByZWN0YW5nbGUgZXF1aXZhbGVudCBvZiB0aGUgU3RhZ2VHTCBzaXplIGFuZCBwb3NpdGlvbi5cblx0ICovXG5cdHB1YmxpYyBnZXQgdmlld1BvcnQoKTpSZWN0YW5nbGVcblx0e1xuXHRcdHJldHVybiB0aGlzLl92aWV3UG9ydDtcblx0fVxuXG5cdC8qKlxuXHQgKiBBIHNjaXNzb3IgcmVjdGFuZ2xlIGVxdWl2YWxlbnQgb2YgdGhlIHZpZXcgc2l6ZSBhbmQgcG9zaXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNjaXNzb3JSZWN0KCk6UmVjdGFuZ2xlXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2Npc3NvclJlY3Q7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgeCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUG9zLng7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMueCA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMudXBkYXRlR2xvYmFsUG9zKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgeSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2xvY2FsUG9zLnk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHkodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMueSA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2dsb2JhbFBvcy55ID0gdGhpcy5fbG9jYWxQb3MueSA9IHZhbHVlO1xuXG5cdFx0dGhpcy51cGRhdGVHbG9iYWxQb3MoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB3aWR0aCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3dpZHRoO1xuXHR9XG5cblx0cHVibGljIHNldCB3aWR0aCh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fd2lkdGggPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl93aWR0aCA9IHZhbHVlO1xuXHRcdHRoaXMuX3NjaXNzb3JSZWN0LndpZHRoID0gdmFsdWU7XG5cdFx0dGhpcy5fdmlld1BvcnQud2lkdGggPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BCYWNrQnVmZmVySW52YWxpZCA9IHRydWU7XG5cdFx0dGhpcy5fZGVwdGhUZXh0dXJlSW52YWxpZCA9IHRydWU7XG5cblx0XHR0aGlzLm5vdGlmeVZpZXdwb3J0VXBkYXRlKCk7XG5cdFx0dGhpcy5ub3RpZnlTY2lzc29yVXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgaGVpZ2h0KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIHNldCBoZWlnaHQodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2hlaWdodCA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2hlaWdodCA9IHZhbHVlO1xuXHRcdHRoaXMuX3NjaXNzb3JSZWN0LmhlaWdodCA9IHZhbHVlO1xuXHRcdHRoaXMuX3ZpZXdQb3J0LmhlaWdodCA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEJhY2tCdWZmZXJJbnZhbGlkID0gdHJ1ZTtcblx0XHR0aGlzLl9kZXB0aFRleHR1cmVJbnZhbGlkID0gdHJ1ZTtcblxuXHRcdHRoaXMubm90aWZ5Vmlld3BvcnRVcGRhdGUoKTtcblx0XHR0aGlzLm5vdGlmeVNjaXNzb3JVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHJlbmRlcmFibGVTb3J0ZXI6SUVudGl0eVNvcnRlcjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBSZW5kZXJlckJhc2Ugb2JqZWN0LlxuXHQgKi9cblx0Y29uc3RydWN0b3IocmVuZGVyVG9UZXh0dXJlOmJvb2xlYW4gPSBmYWxzZSwgZm9yY2VTb2Z0d2FyZTpib29sZWFuID0gZmFsc2UsIHByb2ZpbGU6c3RyaW5nID0gXCJiYXNlbGluZVwiKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX2JpbGxib2FyZFJlbmRlcmFibGVQb29sID0gUmVuZGVyYWJsZVBvb2wuZ2V0UG9vbChDU1NCaWxsYm9hcmRSZW5kZXJhYmxlKTtcblx0XHR0aGlzLl9saW5lU2VnbWVudFJlbmRlcmFibGVQb29sID0gUmVuZGVyYWJsZVBvb2wuZ2V0UG9vbChDU1NMaW5lU2VnbWVudFJlbmRlcmFibGUpO1xuXG5cdFx0dGhpcy5fdmlld1BvcnQgPSBuZXcgUmVjdGFuZ2xlKCk7XG5cblx0XHRpZiAodGhpcy5fd2lkdGggPT0gMClcblx0XHRcdHRoaXMud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblxuXHRcdGlmICh0aGlzLl9oZWlnaHQgPT0gMClcblx0XHRcdHRoaXMuaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBiYWNrZ3JvdW5kIGNvbG9yJ3MgcmVkIGNvbXBvbmVudCwgdXNlZCB3aGVuIGNsZWFyaW5nLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHVibGljIGdldCBfaUJhY2tncm91bmRSKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYmFja2dyb3VuZFI7XG5cdH1cblxuXHRwdWJsaWMgc2V0IF9pQmFja2dyb3VuZFIodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2JhY2tncm91bmRSID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fYmFja2dyb3VuZFIgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BCYWNrQnVmZmVySW52YWxpZCA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJhY2tncm91bmQgY29sb3IncyBncmVlbiBjb21wb25lbnQsIHVzZWQgd2hlbiBjbGVhcmluZy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHB1YmxpYyBnZXQgX2lCYWNrZ3JvdW5kRygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JhY2tncm91bmRHO1xuXHR9XG5cblx0cHVibGljIHNldCBfaUJhY2tncm91bmRHKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9iYWNrZ3JvdW5kRyA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2JhY2tncm91bmRHID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wQmFja0J1ZmZlckludmFsaWQgPSB0cnVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBiYWNrZ3JvdW5kIGNvbG9yJ3MgYmx1ZSBjb21wb25lbnQsIHVzZWQgd2hlbiBjbGVhcmluZy5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHB1YmxpYyBnZXQgX2lCYWNrZ3JvdW5kQigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JhY2tncm91bmRCO1xuXHR9XG5cblx0cHVibGljIHNldCBfaUJhY2tncm91bmRCKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9iYWNrZ3JvdW5kQiA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2JhY2tncm91bmRCID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wQmFja0J1ZmZlckludmFsaWQgPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGdldCBzaGFyZUNvbnRleHQoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2hhcmVDb250ZXh0O1xuXHR9XG5cblx0cHVibGljIHNldCBzaGFyZUNvbnRleHQodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9zaGFyZUNvbnRleHQgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9zaGFyZUNvbnRleHQgPSB2YWx1ZTtcblxuXHRcdHRoaXMudXBkYXRlR2xvYmFsUG9zKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzcG9zZXMgdGhlIHJlc291cmNlcyB1c2VkIGJ5IHRoZSBSZW5kZXJlckJhc2UuXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHQvKlxuXHRcdCBpZiAoX2JhY2tncm91bmRJbWFnZVJlbmRlcmVyKSB7XG5cdFx0IF9iYWNrZ3JvdW5kSW1hZ2VSZW5kZXJlci5kaXNwb3NlKCk7XG5cdFx0IF9iYWNrZ3JvdW5kSW1hZ2VSZW5kZXJlciA9IG51bGw7XG5cdFx0IH1cblx0XHQgKi9cblx0fVxuXG5cdHB1YmxpYyByZW5kZXIoZW50aXR5Q29sbGVjdG9yOklDb2xsZWN0b3IpXG5cdHtcblx0XHR0aGlzLl92aWV3cG9ydERpcnR5ID0gZmFsc2U7XG5cdFx0dGhpcy5fc2Npc3NvckRpcnR5ID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogUmVuZGVycyB0aGUgcG90ZW50aWFsbHkgdmlzaWJsZSBnZW9tZXRyeSB0byB0aGUgYmFjayBidWZmZXIgb3IgdGV4dHVyZS5cblx0ICogQHBhcmFtIGVudGl0eUNvbGxlY3RvciBUaGUgRW50aXR5Q29sbGVjdG9yIG9iamVjdCBjb250YWluaW5nIHRoZSBwb3RlbnRpYWxseSB2aXNpYmxlIGdlb21ldHJ5LlxuXHQgKiBAcGFyYW0gc2Npc3NvclJlY3Rcblx0ICovXG5cdHB1YmxpYyBfaVJlbmRlcihlbnRpdHlDb2xsZWN0b3I6RW50aXR5Q29sbGVjdG9yLCB0YXJnZXQ6VGV4dHVyZVByb3h5QmFzZSA9IG51bGwsIHNjaXNzb3JSZWN0OlJlY3RhbmdsZSA9IG51bGwsIHN1cmZhY2VTZWxlY3RvcjpudW1iZXIgPSAwKVxuXHR7XG5cdFx0aWYgKCFlbnRpdHlDb2xsZWN0b3IuZW50aXR5SGVhZClcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMucEV4ZWN1dGVSZW5kZXIoZW50aXR5Q29sbGVjdG9yLCBzY2lzc29yUmVjdCk7XG5cdH1cblxuXHRwdWJsaWMgX2lSZW5kZXJDYXNjYWRlcyhlbnRpdHlDb2xsZWN0b3I6SUNvbGxlY3RvciwgdGFyZ2V0OlRleHR1cmVQcm94eUJhc2UsIG51bUNhc2NhZGVzOm51bWJlciwgc2Npc3NvclJlY3RzOkFycmF5PFJlY3RhbmdsZT4sIGNhbWVyYXM6QXJyYXk8Q2FtZXJhPilcblx0e1xuXG5cdH1cblx0cHVibGljIHBDb2xsZWN0UmVuZGVyYWJsZXMoZW50aXR5Q29sbGVjdG9yOklDb2xsZWN0b3IpXG5cdHtcblx0XHQvL3Jlc2V0IGhlYWQgdmFsdWVzXG5cdFx0dGhpcy5fcmVuZGVyYWJsZUhlYWQgPSBudWxsO1xuXG5cdFx0Ly9ncmFiIGVudGl0eSBoZWFkXG5cdFx0dmFyIGl0ZW06RW50aXR5TGlzdEl0ZW0gPSBlbnRpdHlDb2xsZWN0b3IuZW50aXR5SGVhZDtcblxuXHRcdC8vc2V0IHRlbXAgdmFsdWVzIGZvciBlbnRyeSBwb2ludCBhbmQgY2FtZXJhIGZvcndhcmQgdmVjdG9yXG5cdFx0dGhpcy5fcENhbWVyYSA9IGVudGl0eUNvbGxlY3Rvci5jYW1lcmE7XG5cdFx0dGhpcy5faUVudHJ5UG9pbnQgPSB0aGlzLl9wQ2FtZXJhLnNjZW5lUG9zaXRpb247XG5cdFx0dGhpcy5fcENhbWVyYUZvcndhcmQgPSB0aGlzLl9wQ2FtZXJhLnRyYW5zZm9ybS5mb3J3YXJkVmVjdG9yO1xuXG5cdFx0Ly9pdGVyYXRlIHRocm91Z2ggYWxsIGVudGl0aWVzXG5cdFx0d2hpbGUgKGl0ZW0pIHtcblx0XHRcdGl0ZW0uZW50aXR5Ll9pQ29sbGVjdFJlbmRlcmFibGVzKHRoaXMpO1xuXHRcdFx0aXRlbSA9IGl0ZW0ubmV4dDtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVuZGVycyB0aGUgcG90ZW50aWFsbHkgdmlzaWJsZSBnZW9tZXRyeSB0byB0aGUgYmFjayBidWZmZXIgb3IgdGV4dHVyZS4gT25seSBleGVjdXRlZCBpZiBldmVyeXRoaW5nIGlzIHNldCB1cC5cblx0ICogQHBhcmFtIGVudGl0eUNvbGxlY3RvciBUaGUgRW50aXR5Q29sbGVjdG9yIG9iamVjdCBjb250YWluaW5nIHRoZSBwb3RlbnRpYWxseSB2aXNpYmxlIGdlb21ldHJ5LlxuXHQgKiBAcGFyYW0gc2Npc3NvclJlY3Rcblx0ICovXG5cdHB1YmxpYyBwRXhlY3V0ZVJlbmRlcihlbnRpdHlDb2xsZWN0b3I6Q1NTRW50aXR5Q29sbGVjdG9yLCBzY2lzc29yUmVjdDpSZWN0YW5nbGUgPSBudWxsKVxuXHR7XG5cdFx0dGhpcy5wQ29sbGVjdFJlbmRlcmFibGVzKGVudGl0eUNvbGxlY3Rvcik7XG5cblx0XHR0aGlzLnBEcmF3KGVudGl0eUNvbGxlY3Rvcik7XG5cdH1cblxuXHQvKipcblx0ICogUGVyZm9ybXMgdGhlIGFjdHVhbCBkcmF3aW5nIG9mIGRvbSBvYmplY3RzIHRvIHRoZSB0YXJnZXQuXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlDb2xsZWN0b3IgVGhlIEVudGl0eUNvbGxlY3RvciBvYmplY3QgY29udGFpbmluZyB0aGUgcG90ZW50aWFsbHkgdmlzaWJsZSBkb20gb2JqZWN0cy5cblx0ICovXG5cdHB1YmxpYyBwRHJhdyhlbnRpdHlDb2xsZWN0b3I6Q1NTRW50aXR5Q29sbGVjdG9yKVxuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgX2lCYWNrZ3JvdW5kQWxwaGEoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQWxwaGE7XG5cdH1cblxuXHRwdWJsaWMgc2V0IF9pQmFja2dyb3VuZEFscGhhKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9iYWNrZ3JvdW5kQWxwaGEgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9iYWNrZ3JvdW5kQWxwaGEgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BCYWNrQnVmZmVySW52YWxpZCA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGJpbGxib2FyZFxuXHQgKi9cblx0cHVibGljIGFwcGx5QmlsbGJvYXJkKGJpbGxib2FyZDpCaWxsYm9hcmQpXG5cdHtcblx0XHR0aGlzLl9hcHBseVJlbmRlcmFibGUoPENTU1JlbmRlcmFibGVCYXNlPiB0aGlzLl9iaWxsYm9hcmRSZW5kZXJhYmxlUG9vbC5nZXRJdGVtKGJpbGxib2FyZCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBsaW5lU3ViTWVzaFxuXHQgKi9cblx0cHVibGljIGFwcGx5TGluZVN1Yk1lc2gobGluZVN1Yk1lc2g6TGluZVN1Yk1lc2gpXG5cdHtcblx0XHQvL3RoaXMuX2FwcGx5UmVuZGVyYWJsZSg8Q1NTUmVuZGVyYWJsZUJhc2U+IHRoaXMuX2JpbGxib2FyZFJlbmRlcmFibGVQb29sLmdldEl0ZW0obGluZVNlZ21lbnQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gc2t5Ym94XG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlTa3lib3goc2t5Ym94OlNreWJveClcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHRyaWFuZ2xlU3ViTWVzaFxuXHQgKi9cblx0cHVibGljIGFwcGx5VHJpYW5nbGVTdWJNZXNoKHRyaWFuZ2xlU3ViTWVzaDpUcmlhbmdsZVN1Yk1lc2gpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSByZW5kZXJhYmxlXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIF9hcHBseVJlbmRlcmFibGUocmVuZGVyYWJsZTpDU1NSZW5kZXJhYmxlQmFzZSlcblx0e1xuXHRcdHZhciBtYXRlcmlhbDpDU1NNYXRlcmlhbEJhc2UgPSA8Q1NTTWF0ZXJpYWxCYXNlPiByZW5kZXJhYmxlLm1hdGVyaWFsT3duZXIubWF0ZXJpYWw7XG5cdFx0dmFyIGVudGl0eTpJRW50aXR5ID0gcmVuZGVyYWJsZS5zb3VyY2VFbnRpdHk7XG5cdFx0dmFyIHBvc2l0aW9uOlZlY3RvcjNEID0gZW50aXR5LnNjZW5lUG9zaXRpb247XG5cblx0XHRpZiAobWF0ZXJpYWwpIHtcblx0XHRcdC8vc2V0IGlkcyBmb3IgZmFzdGVyIHJlZmVyZW5jaW5nXG5cdFx0XHRyZW5kZXJhYmxlLm1hdGVyaWFsSWQgPSBtYXRlcmlhbC5faU1hdGVyaWFsSWQ7XG4vL1x0XHRcdFx0cmVuZGVyYWJsZS5yZW5kZXJPcmRlcklkID0gbWF0ZXJpYWwuX2lSZW5kZXJPcmRlcklkO1xuXHRcdFx0cmVuZGVyYWJsZS5jYXNjYWRlZCA9IGZhbHNlO1xuXG5cdFx0XHQvLyBwcm9qZWN0IG9udG8gY2FtZXJhJ3Mgei1heGlzXG5cdFx0XHRwb3NpdGlvbiA9IHRoaXMuX2lFbnRyeVBvaW50LnN1YnRyYWN0KHBvc2l0aW9uKTtcblx0XHRcdHJlbmRlcmFibGUuekluZGV4ID0gZW50aXR5LnpPZmZzZXQgLSBwb3NpdGlvbi5kb3RQcm9kdWN0KHRoaXMuX3BDYW1lcmFGb3J3YXJkKTtcblxuXHRcdFx0Ly9zdG9yZSByZWZlcmVuY2UgdG8gc2NlbmUgdHJhbnNmb3JtXG5cdFx0XHRyZW5kZXJhYmxlLnJlbmRlclNjZW5lVHJhbnNmb3JtID0gcmVuZGVyYWJsZS5zb3VyY2VFbnRpdHkuZ2V0UmVuZGVyU2NlbmVUcmFuc2Zvcm0odGhpcy5fcENhbWVyYSk7XG5cblx0XHRcdC8vc3RvcmUgcmVmZXJlbmNlIHRvIG5leHQgaXRlbSBpbiBsaXN0XG5cdFx0XHRyZW5kZXJhYmxlLm5leHQgPSB0aGlzLl9yZW5kZXJhYmxlSGVhZDtcblx0XHRcdHRoaXMuX3JlbmRlcmFibGVIZWFkID0gcmVuZGVyYWJsZTtcblx0XHR9XG5cdH1cblxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJpdmF0ZSBub3RpZnlTY2lzc29yVXBkYXRlKClcblx0e1xuXHRcdGlmICh0aGlzLl9zY2lzc29yRGlydHkpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9zY2lzc29yRGlydHkgPSB0cnVlO1xuXG5cdFx0aWYgKCF0aGlzLl9zY2lzc29yVXBkYXRlZClcblx0XHRcdHRoaXMuX3NjaXNzb3JVcGRhdGVkID0gbmV3IFJlbmRlcmVyRXZlbnQoUmVuZGVyZXJFdmVudC5TQ0lTU09SX1VQREFURUQpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX3NjaXNzb3JVcGRhdGVkKTtcblx0fVxuXG5cblx0LyoqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIG5vdGlmeVZpZXdwb3J0VXBkYXRlKClcblx0e1xuXHRcdGlmICh0aGlzLl92aWV3cG9ydERpcnR5KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fdmlld3BvcnREaXJ0eSA9IHRydWU7XG5cblx0XHRpZiAoIXRoaXMuX3ZpZXdQb3J0VXBkYXRlZClcblx0XHRcdHRoaXMuX3ZpZXdQb3J0VXBkYXRlZCA9IG5ldyBSZW5kZXJlckV2ZW50KFJlbmRlcmVyRXZlbnQuVklFV1BPUlRfVVBEQVRFRCk7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQodGhpcy5fdmlld1BvcnRVcGRhdGVkKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHVwZGF0ZUdsb2JhbFBvcygpXG5cdHtcblx0XHR0aGlzLl92aWV3UG9ydC54ID0gdGhpcy5fZ2xvYmFsUG9zLng7XG5cdFx0dGhpcy5fdmlld1BvcnQueSA9IHRoaXMuX2dsb2JhbFBvcy55O1xuXG5cdFx0dGhpcy5ub3RpZnlWaWV3cG9ydFVwZGF0ZSgpO1xuXHRcdHRoaXMubm90aWZ5U2Npc3NvclVwZGF0ZSgpO1xuXHR9XG5cblxuXHRwdWJsaWMgX2lDcmVhdGVFbnRpdHlDb2xsZWN0b3IoKTpJQ29sbGVjdG9yXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG59XG5cbmV4cG9ydCA9IENTU1JlbmRlcmVyQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/core/render/CSSRendererBase.ts b/lib/core/render/CSSRendererBase.ts new file mode 100644 index 00000000..bdb78003 --- /dev/null +++ b/lib/core/render/CSSRendererBase.ts @@ -0,0 +1,475 @@ +import LineSubMesh = require("awayjs-core/lib/core/base/LineSubMesh"); +import TriangleSubMesh = require("awayjs-core/lib/core/base/TriangleSubMesh"); +import Point = require("awayjs-core/lib/core/geom/Point"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import CSSBillboardRenderable = require("awayjs-core/lib/core/pool/CSSBillboardRenderable"); +import CSSLineSegmentRenderable = require("awayjs-core/lib/core/pool/CSSLineSegmentRenderable"); +import CSSRenderableBase = require("awayjs-core/lib/core/pool/CSSRenderableBase"); +import EntityListItem = require("awayjs-core/lib/core/pool/EntityListItem"); +import RenderablePool = require("awayjs-core/lib/core/pool/RenderablePool"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import IEntitySorter = require("awayjs-core/lib/core/sort/IEntitySorter"); +import CSSEntityCollector = require("awayjs-core/lib/core/traverse/CSSEntityCollector"); +import EntityCollector = require("awayjs-core/lib/core/traverse/EntityCollector"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import Billboard = require("awayjs-core/lib/entities/Billboard"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import Skybox = require("awayjs-core/lib/entities/Skybox"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import RendererEvent = require("awayjs-core/lib/events/RendererEvent"); +import CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +/** + * RendererBase forms an abstract base class for classes that are used in the rendering pipeline to render the + * contents of a partition + * + * @class away.render.RendererBase + */ +class CSSRendererBase extends EventDispatcher +{ + private _billboardRenderablePool:RenderablePool; + private _lineSegmentRenderablePool:RenderablePool; + + public _pCamera:Camera; + public _iEntryPoint:Vector3D; + public _pCameraForward:Vector3D; + + private _backgroundR:number = 0; + private _backgroundG:number = 0; + private _backgroundB:number = 0; + private _backgroundAlpha:number = 1; + private _shareContext:boolean = false; + + public _pBackBufferInvalid:boolean = true; + public _depthTextureInvalid:boolean = true; + + public _renderableHead:CSSRenderableBase; + + public _width:number; + public _height:number; + + private _viewPort:Rectangle = new Rectangle(); + private _viewportDirty:boolean; + private _scissorRect:Rectangle = new Rectangle(); + private _scissorDirty:boolean; + + private _localPos:Point = new Point(); + private _globalPos:Point = new Point(); + + private _scissorUpdated:RendererEvent; + private _viewPortUpdated:RendererEvent; + + /** + * A viewPort rectangle equivalent of the StageGL size and position. + */ + public get viewPort():Rectangle + { + return this._viewPort; + } + + /** + * A scissor rectangle equivalent of the view size and position. + */ + public get scissorRect():Rectangle + { + return this._scissorRect; + } + + /** + * + */ + public get x():number + { + return this._localPos.x; + } + + public set x(value:number) + { + if (this.x == value) + return; + + this.updateGlobalPos(); + } + + /** + * + */ + public get y():number + { + return this._localPos.y; + } + + public set y(value:number) + { + if (this.y == value) + return; + + this._globalPos.y = this._localPos.y = value; + + this.updateGlobalPos(); + } + + /** + * + */ + public get width():number + { + return this._width; + } + + public set width(value:number) + { + if (this._width == value) + return; + + this._width = value; + this._scissorRect.width = value; + this._viewPort.width = value; + + this._pBackBufferInvalid = true; + this._depthTextureInvalid = true; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + } + + /** + * + */ + public get height():number + { + return this._height; + } + + public set height(value:number) + { + if (this._height == value) + return; + + this._height = value; + this._scissorRect.height = value; + this._viewPort.height = value; + + this._pBackBufferInvalid = true; + this._depthTextureInvalid = true; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + } + + /** + * + */ + public renderableSorter:IEntitySorter; + + /** + * Creates a new RendererBase object. + */ + constructor(renderToTexture:boolean = false, forceSoftware:boolean = false, profile:string = "baseline") + { + super(); + + this._billboardRenderablePool = RenderablePool.getPool(CSSBillboardRenderable); + this._lineSegmentRenderablePool = RenderablePool.getPool(CSSLineSegmentRenderable); + + this._viewPort = new Rectangle(); + + if (this._width == 0) + this.width = window.innerWidth; + + if (this._height == 0) + this.height = window.innerHeight; + } + + /** + * The background color's red component, used when clearing. + * + * @private + */ + public get _iBackgroundR():number + { + return this._backgroundR; + } + + public set _iBackgroundR(value:number) + { + if (this._backgroundR == value) + return; + + this._backgroundR = value; + + this._pBackBufferInvalid = true; + } + + /** + * The background color's green component, used when clearing. + * + * @private + */ + public get _iBackgroundG():number + { + return this._backgroundG; + } + + public set _iBackgroundG(value:number) + { + if (this._backgroundG == value) + return; + + this._backgroundG = value; + + this._pBackBufferInvalid = true; + } + + /** + * The background color's blue component, used when clearing. + * + * @private + */ + public get _iBackgroundB():number + { + return this._backgroundB; + } + + public set _iBackgroundB(value:number) + { + if (this._backgroundB == value) + return; + + this._backgroundB = value; + + this._pBackBufferInvalid = true; + } + + public get shareContext():boolean + { + return this._shareContext; + } + + public set shareContext(value:boolean) + { + if (this._shareContext == value) + return; + + this._shareContext = value; + + this.updateGlobalPos(); + } + + /** + * Disposes the resources used by the RendererBase. + */ + public dispose() + { + /* + if (_backgroundImageRenderer) { + _backgroundImageRenderer.dispose(); + _backgroundImageRenderer = null; + } + */ + } + + public render(entityCollector:ICollector) + { + this._viewportDirty = false; + this._scissorDirty = false; + } + + /** + * Renders the potentially visible geometry to the back buffer or texture. + * @param entityCollector The EntityCollector object containing the potentially visible geometry. + * @param scissorRect + */ + public _iRender(entityCollector:EntityCollector, target:TextureProxyBase = null, scissorRect:Rectangle = null, surfaceSelector:number = 0) + { + if (!entityCollector.entityHead) + return; + + this.pExecuteRender(entityCollector, scissorRect); + } + + public _iRenderCascades(entityCollector:ICollector, target:TextureProxyBase, numCascades:number, scissorRects:Array, cameras:Array) + { + + } + public pCollectRenderables(entityCollector:ICollector) + { + //reset head values + this._renderableHead = null; + + //grab entity head + var item:EntityListItem = entityCollector.entityHead; + + //set temp values for entry point and camera forward vector + this._pCamera = entityCollector.camera; + this._iEntryPoint = this._pCamera.scenePosition; + this._pCameraForward = this._pCamera.transform.forwardVector; + + //iterate through all entities + while (item) { + item.entity._iCollectRenderables(this); + item = item.next; + } + } + + /** + * Renders the potentially visible geometry to the back buffer or texture. Only executed if everything is set up. + * @param entityCollector The EntityCollector object containing the potentially visible geometry. + * @param scissorRect + */ + public pExecuteRender(entityCollector:CSSEntityCollector, scissorRect:Rectangle = null) + { + this.pCollectRenderables(entityCollector); + + this.pDraw(entityCollector); + } + + /** + * Performs the actual drawing of dom objects to the target. + * + * @param entityCollector The EntityCollector object containing the potentially visible dom objects. + */ + public pDraw(entityCollector:CSSEntityCollector) + { + throw new AbstractMethodError(); + } + + public get _iBackgroundAlpha():number + { + return this._backgroundAlpha; + } + + public set _iBackgroundAlpha(value:number) + { + if (this._backgroundAlpha == value) + return; + + this._backgroundAlpha = value; + + this._pBackBufferInvalid = true; + } + + /** + * + * @param billboard + */ + public applyBillboard(billboard:Billboard) + { + this._applyRenderable( this._billboardRenderablePool.getItem(billboard)); + } + + /** + * + * @param lineSubMesh + */ + public applyLineSubMesh(lineSubMesh:LineSubMesh) + { + //this._applyRenderable( this._billboardRenderablePool.getItem(lineSegment)); + } + + /** + * + * @param skybox + */ + public applySkybox(skybox:Skybox) + { + + } + + /** + * + * @param triangleSubMesh + */ + public applyTriangleSubMesh(triangleSubMesh:TriangleSubMesh) + { + + } + + /** + * + * @param renderable + * @private + */ + private _applyRenderable(renderable:CSSRenderableBase) + { + var material:CSSMaterialBase = renderable.materialOwner.material; + var entity:IEntity = renderable.sourceEntity; + var position:Vector3D = entity.scenePosition; + + if (material) { + //set ids for faster referencing + renderable.materialId = material._iMaterialId; +// renderable.renderOrderId = material._iRenderOrderId; + renderable.cascaded = false; + + // project onto camera's z-axis + position = this._iEntryPoint.subtract(position); + renderable.zIndex = entity.zOffset - position.dotProduct(this._pCameraForward); + + //store reference to scene transform + renderable.renderSceneTransform = renderable.sourceEntity.getRenderSceneTransform(this._pCamera); + + //store reference to next item in list + renderable.next = this._renderableHead; + this._renderableHead = renderable; + } + } + + + /** + * @private + */ + private notifyScissorUpdate() + { + if (this._scissorDirty) + return; + + this._scissorDirty = true; + + if (!this._scissorUpdated) + this._scissorUpdated = new RendererEvent(RendererEvent.SCISSOR_UPDATED); + + this.dispatchEvent(this._scissorUpdated); + } + + + /** + * @private + */ + private notifyViewportUpdate() + { + if (this._viewportDirty) + return; + + this._viewportDirty = true; + + if (!this._viewPortUpdated) + this._viewPortUpdated = new RendererEvent(RendererEvent.VIEWPORT_UPDATED); + + this.dispatchEvent(this._viewPortUpdated); + } + + /** + * + */ + public updateGlobalPos() + { + this._viewPort.x = this._globalPos.x; + this._viewPort.y = this._globalPos.y; + + this.notifyViewportUpdate(); + this.notifyScissorUpdate(); + } + + + public _iCreateEntityCollector():ICollector + { + throw new AbstractMethodError(); + } +} + +export = CSSRendererBase; \ No newline at end of file diff --git a/lib/core/render/IRenderer.js b/lib/core/render/IRenderer.js new file mode 100755 index 00000000..c47ca7e0 --- /dev/null +++ b/lib/core/render/IRenderer.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvcmVuZGVyL0lSZW5kZXJlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQXNIbUIiLCJmaWxlIjoiY29yZS9yZW5kZXIvSVJlbmRlcmVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExpbmVTdWJNZXNoXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvTGluZVN1Yk1lc2hcIik7XG5pbXBvcnQgVHJpYW5nbGVTdWJNZXNoXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1RyaWFuZ2xlU3ViTWVzaFwiKTtcbmltcG9ydCBSZWN0YW5nbGVcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9SZWN0YW5nbGVcIik7XG5pbXBvcnQgSUVudGl0eVNvcnRlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvc29ydC9JRW50aXR5U29ydGVyXCIpO1xuaW1wb3J0IElDb2xsZWN0b3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvdHJhdmVyc2UvSUNvbGxlY3RvclwiKTtcbmltcG9ydCBCaWxsYm9hcmRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0JpbGxib2FyZFwiKTtcbmltcG9ydCBDYW1lcmFcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvQ2FtZXJhXCIpO1xuaW1wb3J0IFNreWJveFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9Ta3lib3hcIik7XG5pbXBvcnQgSUV2ZW50RGlzcGF0Y2hlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9JRXZlbnREaXNwYXRjaGVyXCIpO1xuaW1wb3J0IFRleHR1cmVQcm94eUJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9UZXh0dXJlUHJveHlCYXNlXCIpO1xuXG4vKipcbiAqIElSZW5kZXJlciBpcyBhbiBpbnRlcmZhY2UgZm9yIGNsYXNzZXMgdGhhdCBhcmUgdXNlZCBpbiB0aGUgcmVuZGVyaW5nIHBpcGVsaW5lIHRvIHJlbmRlciB0aGVcbiAqIGNvbnRlbnRzIG9mIGEgcGFydGl0aW9uXG4gKlxuICogQGNsYXNzIGF3YXkucmVuZGVyLklSZW5kZXJlclxuICovXG5pbnRlcmZhY2UgSVJlbmRlcmVyIGV4dGVuZHMgSUV2ZW50RGlzcGF0Y2hlclxue1xuXHQvKipcblx0ICpcblx0ICovXG5cdHJlbmRlcmFibGVTb3J0ZXI6SUVudGl0eVNvcnRlcjtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHNoYXJlQ29udGV4dDpib29sZWFuO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0eDpudW1iZXIgLyp1aW50Ki87XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHR5Om51bWJlciAvKnVpbnQqLztcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHdpZHRoOm51bWJlciAvKnVpbnQqLztcblxuXHQvKipcblx0ICpcblx0ICovXG5cdGhlaWdodDpudW1iZXIgLyp1aW50Ki87XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHR2aWV3UG9ydDpSZWN0YW5nbGU7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRzY2lzc29yUmVjdDpSZWN0YW5nbGU7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBiaWxsYm9hcmRcblx0ICovXG5cdGFwcGx5QmlsbGJvYXJkKGJpbGxib2FyZDpCaWxsYm9hcmQpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gdHJpYW5nbGVTdWJNZXNoXG5cdCAqL1xuXHRhcHBseUxpbmVTdWJNZXNoKHRyaWFuZ2xlU3ViTWVzaDpMaW5lU3ViTWVzaCk7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB0cmlhbmdsZVN1Yk1lc2hcblx0ICovXG5cdGFwcGx5VHJpYW5nbGVTdWJNZXNoKHRyaWFuZ2xlU3ViTWVzaDpUcmlhbmdsZVN1Yk1lc2gpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0ZGlzcG9zZSgpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5Q29sbGVjdG9yXG5cdCAqL1xuXHRyZW5kZXIoZW50aXR5Q29sbGVjdG9yOklDb2xsZWN0b3IpO1xuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdF9pQmFja2dyb3VuZFI6bnVtYmVyIC8qdWludCovO1xuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdF9pQmFja2dyb3VuZEc6bnVtYmVyIC8qdWludCovO1xuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdF9pQmFja2dyb3VuZEI6bnVtYmVyIC8qdWludCovO1xuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdF9pQmFja2dyb3VuZEFscGhhOm51bWJlcjtcblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRfaUNyZWF0ZUVudGl0eUNvbGxlY3RvcigpOklDb2xsZWN0b3I7XG5cblx0X2lSZW5kZXIoZW50aXR5Q29sbGVjdG9yOklDb2xsZWN0b3IsIHRhcmdldD86VGV4dHVyZVByb3h5QmFzZSwgc2Npc3NvclJlY3Q/OlJlY3RhbmdsZSwgc3VyZmFjZVNlbGVjdG9yPzpudW1iZXIpO1xuXG5cdF9pUmVuZGVyQ2FzY2FkZXMoZW50aXR5Q29sbGVjdG9yOklDb2xsZWN0b3IsIHRhcmdldDpUZXh0dXJlUHJveHlCYXNlLCBudW1DYXNjYWRlczpudW1iZXIsIHNjaXNzb3JSZWN0czpBcnJheTxSZWN0YW5nbGU+LCBjYW1lcmFzOkFycmF5PENhbWVyYT4pXG59XG5cbmV4cG9ydCA9IElSZW5kZXJlcjsiXX0= \ No newline at end of file diff --git a/lib/core/render/IRenderer.ts b/lib/core/render/IRenderer.ts new file mode 100644 index 00000000..79d56602 --- /dev/null +++ b/lib/core/render/IRenderer.ts @@ -0,0 +1,119 @@ +import LineSubMesh = require("awayjs-core/lib/core/base/LineSubMesh"); +import TriangleSubMesh = require("awayjs-core/lib/core/base/TriangleSubMesh"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import IEntitySorter = require("awayjs-core/lib/core/sort/IEntitySorter"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import Billboard = require("awayjs-core/lib/entities/Billboard"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import Skybox = require("awayjs-core/lib/entities/Skybox"); +import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +/** + * IRenderer is an interface for classes that are used in the rendering pipeline to render the + * contents of a partition + * + * @class away.render.IRenderer + */ +interface IRenderer extends IEventDispatcher +{ + /** + * + */ + renderableSorter:IEntitySorter; + + /** + * + */ + shareContext:boolean; + + /** + * + */ + x:number /*uint*/; + + /** + * + */ + y:number /*uint*/; + + /** + * + */ + width:number /*uint*/; + + /** + * + */ + height:number /*uint*/; + + /** + * + */ + viewPort:Rectangle; + + /** + * + */ + scissorRect:Rectangle; + + /** + * + * @param billboard + */ + applyBillboard(billboard:Billboard); + + /** + * + * @param triangleSubMesh + */ + applyLineSubMesh(triangleSubMesh:LineSubMesh); + + /** + * + * @param triangleSubMesh + */ + applyTriangleSubMesh(triangleSubMesh:TriangleSubMesh); + + /** + * + */ + dispose(); + + /** + * + * @param entityCollector + */ + render(entityCollector:ICollector); + + /** + * @internal + */ + _iBackgroundR:number /*uint*/; + + /** + * @internal + */ + _iBackgroundG:number /*uint*/; + + /** + * @internal + */ + _iBackgroundB:number /*uint*/; + + /** + * @internal + */ + _iBackgroundAlpha:number; + + /** + * @internal + */ + _iCreateEntityCollector():ICollector; + + _iRender(entityCollector:ICollector, target?:TextureProxyBase, scissorRect?:Rectangle, surfaceSelector?:number); + + _iRenderCascades(entityCollector:ICollector, target:TextureProxyBase, numCascades:number, scissorRects:Array, cameras:Array) +} + +export = IRenderer; \ No newline at end of file diff --git a/lib/core/sort/IEntitySorter.js b/lib/core/sort/IEntitySorter.js new file mode 100755 index 00000000..0407b53b --- /dev/null +++ b/lib/core/sort/IEntitySorter.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvc29ydC9JRW50aXR5U29ydGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBWXVCIiwiZmlsZSI6ImNvcmUvc29ydC9JRW50aXR5U29ydGVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElSZW5kZXJhYmxlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvSVJlbmRlcmFibGVcIik7XG5cbi8qKlxuICogQGludGVyZmFjZSBhd2F5LnNvcnQuSUVudGl0eVNvcnRlclxuICovXG5pbnRlcmZhY2UgSUVudGl0eVNvcnRlclxue1xuXHRzb3J0QmxlbmRlZFJlbmRlcmFibGVzKGhlYWQ6SVJlbmRlcmFibGUpOklSZW5kZXJhYmxlO1xuXG5cdHNvcnRPcGFxdWVSZW5kZXJhYmxlcyhoZWFkOklSZW5kZXJhYmxlKTpJUmVuZGVyYWJsZTtcbn1cblxuZXhwb3J0ID0gSUVudGl0eVNvcnRlcjsiXX0= \ No newline at end of file diff --git a/lib/core/sort/IEntitySorter.ts b/lib/core/sort/IEntitySorter.ts new file mode 100644 index 00000000..5565487d --- /dev/null +++ b/lib/core/sort/IEntitySorter.ts @@ -0,0 +1,13 @@ +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); + +/** + * @interface away.sort.IEntitySorter + */ +interface IEntitySorter +{ + sortBlendedRenderables(head:IRenderable):IRenderable; + + sortOpaqueRenderables(head:IRenderable):IRenderable; +} + +export = IEntitySorter; \ No newline at end of file diff --git a/lib/core/sort/RenderableMergeSort.js b/lib/core/sort/RenderableMergeSort.js new file mode 100755 index 00000000..b3803b44 --- /dev/null +++ b/lib/core/sort/RenderableMergeSort.js @@ -0,0 +1,164 @@ +/** +* @class away.sort.RenderableMergeSort +*/ +var RenderableMergeSort = (function () { + function RenderableMergeSort() { + } + RenderableMergeSort.prototype.sortBlendedRenderables = function (head) { + var headB; + var fast; + var slow; + + if (!head || !head.next) { + return head; + } + + // split in two sublists + slow = head; + fast = head.next; + + while (fast) { + fast = fast.next; + if (fast) { + slow = slow.next; + fast = fast.next; + } + } + + headB = slow.next; + slow.next = null; + + // recurse + head = this.sortBlendedRenderables(head); + headB = this.sortBlendedRenderables(headB); + + // merge sublists while respecting order + var result; + var curr; + var l; + + if (!head) + return headB; + if (!headB) + return head; + + while (head && headB) { + if (head.zIndex < headB.zIndex) { + l = head; + head = head.next; + } else { + l = headB; + headB = headB.next; + } + + if (!result) + result = l; + else + curr.next = l; + + curr = l; + } + + if (head) + curr.next = head; + else if (headB) + curr.next = headB; + + return result; + }; + + RenderableMergeSort.prototype.sortOpaqueRenderables = function (head) { + var headB; + var fast, slow; + + if (!head || !head.next) { + return head; + } + + // split in two sublists + slow = head; + fast = head.next; + + while (fast) { + fast = fast.next; + if (fast) { + slow = slow.next; + fast = fast.next; + } + } + + headB = slow.next; + slow.next = null; + + // recurse + head = this.sortOpaqueRenderables(head); + headB = this.sortOpaqueRenderables(headB); + + // merge sublists while respecting order + var result; + var curr; + var l; + var cmp = 0; + + if (!head) + return headB; + if (!headB) + return head; + + while (head && headB && head != null && headB != null) { + // first sort per render order id (reduces program3D switches), + // then on material id (reduces setting props), + // then on zIndex (reduces overdraw) + var aid = head.renderOrderId; + var bid = headB.renderOrderId; + + if (aid == bid) { + var ma = head.materialId; + var mb = headB.materialId; + + if (ma == mb) { + if (head.zIndex < headB.zIndex) + cmp = 1; + else + cmp = -1; + } else if (ma > mb) { + cmp = 1; + } else { + cmp = -1; + } + } else if (aid > bid) { + cmp = 1; + } else { + cmp = -1; + } + + if (cmp < 0) { + l = head; + head = head.next; + } else { + l = headB; + headB = headB.next; + } + + if (!result) { + result = l; + curr = l; + } else { + curr.next = l; + curr = l; + } + } + + if (head) + curr.next = head; + else if (headB) + curr.next = headB; + + return result; + }; + return RenderableMergeSort; +})(); + +module.exports = RenderableMergeSort; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvc29ydC9SZW5kZXJhYmxlTWVyZ2VTb3J0LnRzIl0sIm5hbWVzIjpbIlJlbmRlcmFibGVNZXJnZVNvcnQiLCJSZW5kZXJhYmxlTWVyZ2VTb3J0LmNvbnN0cnVjdG9yIiwiUmVuZGVyYWJsZU1lcmdlU29ydC5zb3J0QmxlbmRlZFJlbmRlcmFibGVzIiwiUmVuZGVyYWJsZU1lcmdlU29ydC5zb3J0T3BhcXVlUmVuZGVyYWJsZXMiXSwibWFwcGluZ3MiOiJBQUFBOztFQUtHO0FBQ0g7SUFBQUE7SUF5SkFDLENBQUNBO0FBQUFELElBdkpBQSx1REFBQUEsVUFBOEJBLElBQWdCQTtRQUU3Q0UsSUFBSUEsS0FBS0E7UUFDVEEsSUFBSUEsSUFBSUE7UUFDUkEsSUFBSUEsSUFBSUE7O1FBRVJBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUVBO1lBQ3hCQSxPQUFPQSxJQUFJQTtTQUNYQTs7UUFFREEsd0JBQXdCQTtRQUN4QkEsSUFBSUEsR0FBR0EsSUFBSUE7UUFDWEEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUE7O1FBRWhCQSxPQUFPQSxJQUFJQSxDQUFFQTtZQUNaQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQTtZQUNoQkEsSUFBSUEsSUFBSUEsQ0FBRUE7Z0JBQ1RBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBO2dCQUNoQkEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUE7YUFDaEJBO1NBQ0RBOztRQUVEQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQTtRQUNqQkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUE7O1FBRWhCQSxVQUFVQTtRQUNWQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLElBQUlBLENBQUNBO1FBQ3hDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLEtBQUtBLENBQUNBOztRQUUxQ0Esd0NB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QSxNQUFNQTtJQUNkQSxDQUFDQTtJQUNGSCwyQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxvQ0FBNkIsQ0FBQSIsImZpbGUiOiJjb3JlL3NvcnQvUmVuZGVyYWJsZU1lcmdlU29ydC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJUmVuZGVyYWJsZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0lSZW5kZXJhYmxlXCIpO1xuaW1wb3J0IElFbnRpdHlTb3J0ZXJcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3NvcnQvSUVudGl0eVNvcnRlclwiKTtcblxuLyoqXG4gKiBAY2xhc3MgYXdheS5zb3J0LlJlbmRlcmFibGVNZXJnZVNvcnRcbiAqL1xuY2xhc3MgUmVuZGVyYWJsZU1lcmdlU29ydCBpbXBsZW1lbnRzIElFbnRpdHlTb3J0ZXJcbntcblx0cHVibGljIHNvcnRCbGVuZGVkUmVuZGVyYWJsZXMoaGVhZDpJUmVuZGVyYWJsZSk6SVJlbmRlcmFibGVcblx0e1xuXHRcdHZhciBoZWFkQjpJUmVuZGVyYWJsZTtcblx0XHR2YXIgZmFzdDpJUmVuZGVyYWJsZTtcblx0XHR2YXIgc2xvdzpJUmVuZGVyYWJsZTtcblxuXHRcdGlmICghaGVhZCB8fCAhaGVhZC5uZXh0KSB7XG5cdFx0XHRyZXR1cm4gaGVhZDtcblx0XHR9XG5cblx0XHQvLyBzcGxpdCBpbiB0d28gc3VibGlzdHNcblx0XHRzbG93ID0gaGVhZDtcblx0XHRmYXN0ID0gaGVhZC5uZXh0O1xuXG5cdFx0d2hpbGUgKGZhc3QpIHtcblx0XHRcdGZhc3QgPSBmYXN0Lm5leHQ7XG5cdFx0XHRpZiAoZmFzdCkge1xuXHRcdFx0XHRzbG93ID0gc2xvdy5uZXh0O1xuXHRcdFx0XHRmYXN0ID0gZmFzdC5uZXh0O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGhlYWRCID0gc2xvdy5uZXh0O1xuXHRcdHNsb3cubmV4dCA9IG51bGw7XG5cblx0XHQvLyByZWN1cnNlXG5cdFx0aGVhZCA9IHRoaXMuc29ydEJsZW5kZWRSZW5kZXJhYmxlcyhoZWFkKTtcblx0XHRoZWFkQiA9IHRoaXMuc29ydEJsZW5kZWRSZW5kZXJhYmxlcyhoZWFkQik7XG5cblx0XHQvLyBtZXJnZSBzdWJsaXN0cyB3aGlsZSByZXNwZWN0aW5nIG9yZGVyXG5cdFx0dmFyIHJlc3VsdDpJUmVuZGVyYWJsZTtcblx0XHR2YXIgY3VycjpJUmVuZGVyYWJsZTtcblx0XHR2YXIgbDpJUmVuZGVyYWJsZTtcblxuXHRcdGlmICghaGVhZClcblx0XHRcdHJldHVybiBoZWFkQjtcblx0XHRpZiAoIWhlYWRCKVxuXHRcdFx0cmV0dXJuIGhlYWQ7XG5cblx0XHR3aGlsZSAoaGVhZCAmJiBoZWFkQikge1xuXHRcdFx0aWYgKGhlYWQuekluZGV4IDwgaGVhZEIuekluZGV4KSB7XG5cdFx0XHRcdGwgPSBoZWFkO1xuXHRcdFx0XHRoZWFkID0gaGVhZC5uZXh0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0bCA9IGhlYWRCO1xuXHRcdFx0XHRoZWFkQiA9IGhlYWRCLm5leHQ7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghcmVzdWx0KVxuXHRcdFx0XHRyZXN1bHQgPSBsOyBlbHNlXG5cdFx0XHRcdGN1cnIubmV4dCA9IGw7XG5cblx0XHRcdGN1cnIgPSBsO1xuXHRcdH1cblxuXHRcdGlmIChoZWFkKVxuXHRcdFx0Y3Vyci5uZXh0ID0gaGVhZDsgZWxzZSBpZiAoaGVhZEIpXG5cdFx0XHRjdXJyLm5leHQgPSBoZWFkQjtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgc29ydE9wYXF1ZVJlbmRlcmFibGVzKGhlYWQ6SVJlbmRlcmFibGUpOklSZW5kZXJhYmxlXG5cdHtcblx0XHR2YXIgaGVhZEI6SVJlbmRlcmFibGU7XG5cdFx0dmFyIGZhc3Q6SVJlbmRlcmFibGUsIHNsb3c6SVJlbmRlcmFibGU7XG5cblx0XHRpZiAoIWhlYWQgfHwgIWhlYWQubmV4dCkge1xuXHRcdFx0cmV0dXJuIGhlYWQ7XG5cdFx0fVxuXG5cdFx0Ly8gc3BsaXQgaW4gdHdvIHN1Ymxpc3RzXG5cdFx0c2xvdyA9IGhlYWQ7XG5cdFx0ZmFzdCA9IGhlYWQubmV4dDtcblxuXHRcdHdoaWxlIChmYXN0KSB7XG5cdFx0XHRmYXN0ID0gZmFzdC5uZXh0O1xuXHRcdFx0aWYgKGZhc3QpIHtcblx0XHRcdFx0c2xvdyA9IHNsb3cubmV4dDtcblx0XHRcdFx0ZmFzdCA9IGZhc3QubmV4dDtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRoZWFkQiA9IHNsb3cubmV4dDtcblx0XHRzbG93Lm5leHQgPSBudWxsO1xuXG5cdFx0Ly8gcmVjdXJzZVxuXHRcdGhlYWQgPSB0aGlzLnNvcnRPcGFxdWVSZW5kZXJhYmxlcyhoZWFkKTtcblx0XHRoZWFkQiA9IHRoaXMuc29ydE9wYXF1ZVJlbmRlcmFibGVzKGhlYWRCKTtcblxuXHRcdC8vIG1lcmdlIHN1Ymxpc3RzIHdoaWxlIHJlc3BlY3Rpbmcgb3JkZXJcblx0XHR2YXIgcmVzdWx0OklSZW5kZXJhYmxlO1xuXHRcdHZhciBjdXJyOklSZW5kZXJhYmxlO1xuXHRcdHZhciBsOklSZW5kZXJhYmxlO1xuXHRcdHZhciBjbXA6bnVtYmVyID0gMDtcblxuXHRcdGlmICghaGVhZClcblx0XHRcdHJldHVybiBoZWFkQjtcblx0XHRpZiAoIWhlYWRCKVxuXHRcdFx0cmV0dXJuIGhlYWQ7XG5cblx0XHR3aGlsZSAoaGVhZCAmJiBoZWFkQiAmJiBoZWFkICE9IG51bGwgJiYgaGVhZEIgIT0gbnVsbCkge1xuXG5cdFx0XHQvLyBmaXJzdCBzb3J0IHBlciByZW5kZXIgb3JkZXIgaWQgKHJlZHVjZXMgcHJvZ3JhbTNEIHN3aXRjaGVzKSxcblx0XHRcdC8vIHRoZW4gb24gbWF0ZXJpYWwgaWQgKHJlZHVjZXMgc2V0dGluZyBwcm9wcyksXG5cdFx0XHQvLyB0aGVuIG9uIHpJbmRleCAocmVkdWNlcyBvdmVyZHJhdylcblx0XHRcdHZhciBhaWQ6bnVtYmVyID0gaGVhZC5yZW5kZXJPcmRlcklkO1xuXHRcdFx0dmFyIGJpZDpudW1iZXIgPSBoZWFkQi5yZW5kZXJPcmRlcklkO1xuXG5cdFx0XHRpZiAoYWlkID09IGJpZCkge1xuXHRcdFx0XHR2YXIgbWE6bnVtYmVyID0gaGVhZC5tYXRlcmlhbElkO1xuXHRcdFx0XHR2YXIgbWI6bnVtYmVyID0gaGVhZEIubWF0ZXJpYWxJZDtcblxuXHRcdFx0XHRpZiAobWEgPT0gbWIpIHtcblx0XHRcdFx0XHRpZiAoaGVhZC56SW5kZXggPCBoZWFkQi56SW5kZXgpXG5cdFx0XHRcdFx0XHRjbXAgPSAxOyBlbHNlXG5cdFx0XHRcdFx0XHRjbXAgPSAtMTtcblx0XHRcdFx0fSBlbHNlIGlmIChtYSA+IG1iKSB7XG5cdFx0XHRcdFx0Y21wID0gMTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjbXAgPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChhaWQgPiBiaWQpIHtcblx0XHRcdFx0Y21wID0gMTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNtcCA9IC0xO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY21wIDwgMCkge1xuXHRcdFx0XHRsID0gaGVhZDtcblx0XHRcdFx0aGVhZCA9IGhlYWQubmV4dDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGwgPSBoZWFkQjtcblx0XHRcdFx0aGVhZEIgPSBoZWFkQi5uZXh0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXJlc3VsdCkge1xuXHRcdFx0XHRyZXN1bHQgPSBsO1xuXHRcdFx0XHRjdXJyID0gbDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGN1cnIubmV4dCA9IGw7XG5cdFx0XHRcdGN1cnIgPSBsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChoZWFkKVxuXHRcdFx0Y3Vyci5uZXh0ID0gaGVhZDsgZWxzZSBpZiAoaGVhZEIpXG5cdFx0XHRjdXJyLm5leHQgPSBoZWFkQjtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cblxuZXhwb3J0ID0gUmVuZGVyYWJsZU1lcmdlU29ydDsiXX0= \ No newline at end of file diff --git a/lib/core/sort/RenderableMergeSort.ts b/lib/core/sort/RenderableMergeSort.ts new file mode 100644 index 00000000..f4f0529f --- /dev/null +++ b/lib/core/sort/RenderableMergeSort.ts @@ -0,0 +1,162 @@ +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import IEntitySorter = require("awayjs-core/lib/core/sort/IEntitySorter"); + +/** + * @class away.sort.RenderableMergeSort + */ +class RenderableMergeSort implements IEntitySorter +{ + public sortBlendedRenderables(head:IRenderable):IRenderable + { + var headB:IRenderable; + var fast:IRenderable; + var slow:IRenderable; + + if (!head || !head.next) { + return head; + } + + // split in two sublists + slow = head; + fast = head.next; + + while (fast) { + fast = fast.next; + if (fast) { + slow = slow.next; + fast = fast.next; + } + } + + headB = slow.next; + slow.next = null; + + // recurse + head = this.sortBlendedRenderables(head); + headB = this.sortBlendedRenderables(headB); + + // merge sublists while respecting order + var result:IRenderable; + var curr:IRenderable; + var l:IRenderable; + + if (!head) + return headB; + if (!headB) + return head; + + while (head && headB) { + if (head.zIndex < headB.zIndex) { + l = head; + head = head.next; + } else { + l = headB; + headB = headB.next; + } + + if (!result) + result = l; else + curr.next = l; + + curr = l; + } + + if (head) + curr.next = head; else if (headB) + curr.next = headB; + + return result; + } + + public sortOpaqueRenderables(head:IRenderable):IRenderable + { + var headB:IRenderable; + var fast:IRenderable, slow:IRenderable; + + if (!head || !head.next) { + return head; + } + + // split in two sublists + slow = head; + fast = head.next; + + while (fast) { + fast = fast.next; + if (fast) { + slow = slow.next; + fast = fast.next; + } + } + + headB = slow.next; + slow.next = null; + + // recurse + head = this.sortOpaqueRenderables(head); + headB = this.sortOpaqueRenderables(headB); + + // merge sublists while respecting order + var result:IRenderable; + var curr:IRenderable; + var l:IRenderable; + var cmp:number = 0; + + if (!head) + return headB; + if (!headB) + return head; + + while (head && headB && head != null && headB != null) { + + // first sort per render order id (reduces program3D switches), + // then on material id (reduces setting props), + // then on zIndex (reduces overdraw) + var aid:number = head.renderOrderId; + var bid:number = headB.renderOrderId; + + if (aid == bid) { + var ma:number = head.materialId; + var mb:number = headB.materialId; + + if (ma == mb) { + if (head.zIndex < headB.zIndex) + cmp = 1; else + cmp = -1; + } else if (ma > mb) { + cmp = 1; + } else { + cmp = -1; + } + } else if (aid > bid) { + cmp = 1; + } else { + cmp = -1; + } + + if (cmp < 0) { + l = head; + head = head.next; + } else { + l = headB; + headB = headB.next; + } + + if (!result) { + result = l; + curr = l; + } else { + curr.next = l; + curr = l; + } + } + + if (head) + curr.next = head; else if (headB) + curr.next = headB; + + return result; + } +} + +export = RenderableMergeSort; \ No newline at end of file diff --git a/lib/core/text/AntiAliasType.js b/lib/core/text/AntiAliasType.js new file mode 100755 index 00000000..4732d79a --- /dev/null +++ b/lib/core/text/AntiAliasType.js @@ -0,0 +1,16 @@ +/** +* The AntiAliasType class provides values for anti-aliasing in the +* away.text.TextField class. +*/ +var AntiAliasType = (function () { + function AntiAliasType() { + } + AntiAliasType.ADVANCED = "advanced"; + + AntiAliasType.NORMAL = "normal"; + return AntiAliasType; +})(); + +module.exports = AntiAliasType; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdGV4dC9BbnRpQWxpYXNUeXBlLnRzIl0sIm5hbWVzIjpbIkFudGlBbGlhc1R5cGUiLCJBbnRpQWxpYXNUeXBlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0VBR0c7QUFDSDtJQUFBQTtJQXFCQUMsQ0FBQ0E7QUFBQUQsSUFWQUEseUJBQWdDQSxVQUFVQTs7SUFTMUNBLHVCQUE4QkEsUUFBUUE7SUFDdkNBLHFCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6ImNvcmUvdGV4dC9BbnRpQWxpYXNUeXBlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgQW50aUFsaWFzVHlwZSBjbGFzcyBwcm92aWRlcyB2YWx1ZXMgZm9yIGFudGktYWxpYXNpbmcgaW4gdGhlXG4gKiBhd2F5LnRleHQuVGV4dEZpZWxkIGNsYXNzLlxuICovXG5jbGFzcyBBbnRpQWxpYXNUeXBlXG57XG5cdC8qKlxuXHQgKiBTZXRzIGFudGktYWxpYXNpbmcgdG8gYWR2YW5jZWQgYW50aS1hbGlhc2luZy4gQWR2YW5jZWQgYW50aS1hbGlhc2luZ1xuXHQgKiBhbGxvd3MgZm9udCBmYWNlcyB0byBiZSByZW5kZXJlZCBhdCB2ZXJ5IGhpZ2ggcXVhbGl0eSBhdCBzbWFsbCBzaXplcy4gSXRcblx0ICogaXMgYmVzdCB1c2VkIHdpdGggYXBwbGljYXRpb25zIHRoYXQgaGF2ZSBhIGxvdCBvZiBzbWFsbCB0ZXh0LiBBZHZhbmNlZFxuXHQgKiBhbnRpLWFsaWFzaW5nIGlzIG5vdCByZWNvbW1lbmRlZCBmb3IgdmVyeSBsYXJnZSBmb250cyhsYXJnZXIgdGhhbiA0OFxuXHQgKiBwb2ludHMpLiBUaGlzIGNvbnN0YW50IGlzIHVzZWQgZm9yIHRoZSA8Y29kZT5hbnRpQWxpYXNUeXBlPC9jb2RlPiBwcm9wZXJ0eVxuXHQgKiBpbiB0aGUgVGV4dEZpZWxkIGNsYXNzLiBVc2UgdGhlIHN5bnRheFxuXHQgKiA8Y29kZT5BbnRpQWxpYXNUeXBlLkFEVkFOQ0VEPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQURWQU5DRUQ6c3RyaW5nID0gXCJhZHZhbmNlZFwiO1xuXG5cdC8qKlxuXHQgKiBTZXRzIGFudGktYWxpYXNpbmcgdG8gdGhlIGFudGktYWxpYXNpbmcgdGhhdCBpcyB1c2VkIGluIEZsYXNoIFBsYXllciA3IGFuZFxuXHQgKiBlYXJsaWVyLiBUaGlzIHNldHRpbmcgaXMgcmVjb21tZW5kZWQgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IGRvIG5vdCBoYXZlIGFcblx0ICogbG90IG9mIHRleHQuIFRoaXMgY29uc3RhbnQgaXMgdXNlZCBmb3IgdGhlIDxjb2RlPmFudGlBbGlhc1R5cGU8L2NvZGU+XG5cdCAqIHByb3BlcnR5IGluIHRoZSBUZXh0RmllbGQgY2xhc3MuIFVzZSB0aGUgc3ludGF4XG5cdCAqIDxjb2RlPkFudGlBbGlhc1R5cGUuTk9STUFMPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTk9STUFMOnN0cmluZyA9IFwibm9ybWFsXCI7XG59XG5cbmV4cG9ydCA9IEFudGlBbGlhc1R5cGU7Il19 \ No newline at end of file diff --git a/lib/core/text/AntiAliasType.ts b/lib/core/text/AntiAliasType.ts new file mode 100644 index 00000000..bf4cf183 --- /dev/null +++ b/lib/core/text/AntiAliasType.ts @@ -0,0 +1,28 @@ +/** + * The AntiAliasType class provides values for anti-aliasing in the + * away.text.TextField class. + */ +class AntiAliasType +{ + /** + * Sets anti-aliasing to advanced anti-aliasing. Advanced anti-aliasing + * allows font faces to be rendered at very high quality at small sizes. It + * is best used with applications that have a lot of small text. Advanced + * anti-aliasing is not recommended for very large fonts(larger than 48 + * points). This constant is used for the antiAliasType property + * in the TextField class. Use the syntax + * AntiAliasType.ADVANCED. + */ + public static ADVANCED:string = "advanced"; + + /** + * Sets anti-aliasing to the anti-aliasing that is used in Flash Player 7 and + * earlier. This setting is recommended for applications that do not have a + * lot of text. This constant is used for the antiAliasType + * property in the TextField class. Use the syntax + * AntiAliasType.NORMAL. + */ + public static NORMAL:string = "normal"; +} + +export = AntiAliasType; \ No newline at end of file diff --git a/lib/core/text/GridFitType.js b/lib/core/text/GridFitType.js new file mode 100755 index 00000000..d7db27af --- /dev/null +++ b/lib/core/text/GridFitType.js @@ -0,0 +1,17 @@ +/** +* The GridFitType class defines values for grid fitting in the TextField class. +*/ +var GridFitType = (function () { + function GridFitType() { + } + GridFitType.NONE = "none"; + + GridFitType.PIXEL = "pixel"; + + GridFitType.SUBPIXEL = "subpixel"; + return GridFitType; +})(); + +module.exports = GridFitType; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdGV4dC9HcmlkRml0VHlwZS50cyJdLCJuYW1lcyI6WyJHcmlkRml0VHlwZSIsIkdyaWRGaXRUeXBlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7RUFFRztBQUNIO0lBQUFBO0lBOEJBQyxDQUFDQTtBQUFBRCxJQXJCQUEsbUJBQTRCQSxNQUFNQTs7SUFVbENBLG9CQUE2QkEsT0FBT0E7O0lBVXBDQSx1QkFBZ0NBLFVBQVVBO0lBQzNDQSxtQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCw0QkFBcUIsQ0FBQSIsImZpbGUiOiJjb3JlL3RleHQvR3JpZEZpdFR5cGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRoZSBHcmlkRml0VHlwZSBjbGFzcyBkZWZpbmVzIHZhbHVlcyBmb3IgZ3JpZCBmaXR0aW5nIGluIHRoZSBUZXh0RmllbGQgY2xhc3MuXG4gKi9cbmNsYXNzIEdyaWRGaXRUeXBlXG57XG5cdC8qKlxuXHQgKiBEb2Vzbid0IHNldCBncmlkIGZpdHRpbmcuIEhvcml6b250YWwgYW5kIHZlcnRpY2FsIGxpbmVzIGluIHRoZSBnbHlwaHMgYXJlXG5cdCAqIG5vdCBmb3JjZWQgdG8gdGhlIHBpeGVsIGdyaWQuIFRoaXMgY29uc3RhbnQgaXMgdXNlZCBpbiBzZXR0aW5nIHRoZVxuXHQgKiA8Y29kZT5ncmlkRml0VHlwZTwvY29kZT4gcHJvcGVydHkgb2YgdGhlIFRleHRGaWVsZCBjbGFzcy4gVGhpcyBpcyBvZnRlbiBhXG5cdCAqIGdvb2Qgc2V0dGluZyBmb3IgYW5pbWF0aW9uIG9yIGZvciBsYXJnZSBmb250IHNpemVzLiBVc2UgdGhlIHN5bnRheFxuXHQgKiA8Y29kZT5HcmlkRml0VHlwZS5OT05FPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTk9ORTpzdHJpbmcgPSBcIm5vbmVcIjtcblxuXHQvKipcblx0ICogRml0cyBzdHJvbmcgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgbGluZXMgdG8gdGhlIHBpeGVsIGdyaWQuIFRoaXMgY29uc3RhbnRcblx0ICogaXMgdXNlZCBpbiBzZXR0aW5nIHRoZSA8Y29kZT5ncmlkRml0VHlwZTwvY29kZT4gcHJvcGVydHkgb2YgdGhlIFRleHRGaWVsZFxuXHQgKiBjbGFzcy4gVGhpcyBzZXR0aW5nIG9ubHkgd29ya3MgZm9yIGxlZnQtanVzdGlmaWVkIHRleHQgZmllbGRzIGFuZCBhY3RzXG5cdCAqIGxpa2UgdGhlIDxjb2RlPkdyaWRGaXRUeXBlLlNVQlBJWEVMPC9jb2RlPiBjb25zdGFudCBpbiBzdGF0aWMgdGV4dC4gVGhpc1xuXHQgKiBzZXR0aW5nIGdlbmVyYWxseSBwcm92aWRlcyB0aGUgYmVzdCByZWFkYWJpbGl0eSBmb3IgbGVmdC1hbGlnbmVkIHRleHQuIFVzZVxuXHQgKiB0aGUgc3ludGF4IDxjb2RlPkdyaWRGaXRUeXBlLlBJWEVMPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUElYRUw6c3RyaW5nID0gXCJwaXhlbFwiO1xuXG5cdC8qKlxuXHQgKiBGaXRzIHN0cm9uZyBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBsaW5lcyB0byB0aGUgc3ViLXBpeGVsIGdyaWQgb24gTENEXG5cdCAqIG1vbml0b3JzLiAoUmVkLCBncmVlbiwgYW5kIGJsdWUgYXJlIGFjdHVhbCBwaXhlbHMgb24gYW4gTENEIHNjcmVlbi4pIFRoaXNcblx0ICogaXMgb2Z0ZW4gYSBnb29kIHNldHRpbmcgZm9yIHJpZ2h0LWFsaWduZWQgb3IgY2VudGVyLWFsaWduZWQgZHluYW1pYyB0ZXh0LFxuXHQgKiBhbmQgaXQgaXMgc29tZXRpbWVzIGEgdXNlZnVsIHRyYWRlb2ZmIGZvciBhbmltYXRpb24gdnMuIHRleHQgcXVhbGl0eS4gVGhpc1xuXHQgKiBjb25zdGFudCBpcyB1c2VkIGluIHNldHRpbmcgdGhlIDxjb2RlPmdyaWRGaXRUeXBlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGVcblx0ICogVGV4dEZpZWxkIGNsYXNzLiBVc2UgdGhlIHN5bnRheCA8Y29kZT5HcmlkRml0VHlwZS5TVUJQSVhFTDwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFNVQlBJWEVMOnN0cmluZyA9IFwic3VicGl4ZWxcIjtcbn1cblxuZXhwb3J0ID0gR3JpZEZpdFR5cGU7Il19 \ No newline at end of file diff --git a/lib/core/text/GridFitType.ts b/lib/core/text/GridFitType.ts new file mode 100644 index 00000000..4a203bcb --- /dev/null +++ b/lib/core/text/GridFitType.ts @@ -0,0 +1,36 @@ +/** + * The GridFitType class defines values for grid fitting in the TextField class. + */ +class GridFitType +{ + /** + * Doesn't set grid fitting. Horizontal and vertical lines in the glyphs are + * not forced to the pixel grid. This constant is used in setting the + * gridFitType property of the TextField class. This is often a + * good setting for animation or for large font sizes. Use the syntax + * GridFitType.NONE. + */ + public static NONE:string = "none"; + + /** + * Fits strong horizontal and vertical lines to the pixel grid. This constant + * is used in setting the gridFitType property of the TextField + * class. This setting only works for left-justified text fields and acts + * like the GridFitType.SUBPIXEL constant in static text. This + * setting generally provides the best readability for left-aligned text. Use + * the syntax GridFitType.PIXEL. + */ + public static PIXEL:string = "pixel"; + + /** + * Fits strong horizontal and vertical lines to the sub-pixel grid on LCD + * monitors. (Red, green, and blue are actual pixels on an LCD screen.) This + * is often a good setting for right-aligned or center-aligned dynamic text, + * and it is sometimes a useful tradeoff for animation vs. text quality. This + * constant is used in setting the gridFitType property of the + * TextField class. Use the syntax GridFitType.SUBPIXEL. + */ + public static SUBPIXEL:string = "subpixel"; +} + +export = GridFitType; \ No newline at end of file diff --git a/lib/core/text/TextFieldAutoSize.js b/lib/core/text/TextFieldAutoSize.js new file mode 100755 index 00000000..8b7e833f --- /dev/null +++ b/lib/core/text/TextFieldAutoSize.js @@ -0,0 +1,20 @@ +/** +* The TextFieldAutoSize class is an enumeration of constant values used in +* setting the autoSize property of the TextField class. +*/ +var TextFieldAutoSize = (function () { + function TextFieldAutoSize() { + } + TextFieldAutoSize.CENTER = "center"; + + TextFieldAutoSize.LEFT = "left"; + + TextFieldAutoSize.NONE = "none"; + + TextFieldAutoSize.RIGHT = "right"; + return TextFieldAutoSize; +})(); + +module.exports = TextFieldAutoSize; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdGV4dC9UZXh0RmllbGRBdXRvU2l6ZS50cyJdLCJuYW1lcyI6WyJUZXh0RmllbGRBdXRvU2l6ZSIsIlRleHRGaWVsZEF1dG9TaXplLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0VBR0c7QUFDSDtJQUFBQTtJQTJCQUMsQ0FBQ0E7QUFBQUQsSUFwQkFBLDJCQUE4QkEsUUFBUUE7O0lBT3RDQSx5QkFBNEJBLE1BQU1BOztJQUtsQ0EseUJBQTRCQSxNQUFNQTs7SUFPbENBLDBCQUE2QkEsT0FBT0E7SUFDckNBLHlCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELGtDQUEyQixDQUFBIiwiZmlsZSI6ImNvcmUvdGV4dC9UZXh0RmllbGRBdXRvU2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIFRleHRGaWVsZEF1dG9TaXplIGNsYXNzIGlzIGFuIGVudW1lcmF0aW9uIG9mIGNvbnN0YW50IHZhbHVlcyB1c2VkIGluXG4gKiBzZXR0aW5nIHRoZSA8Y29kZT5hdXRvU2l6ZTwvY29kZT4gcHJvcGVydHkgb2YgdGhlIFRleHRGaWVsZCBjbGFzcy5cbiAqL1xuY2xhc3MgVGV4dEZpZWxkQXV0b1NpemVcbntcblx0LyoqXG5cdCAqIFNwZWNpZmllcyB0aGF0IHRoZSB0ZXh0IGlzIHRvIGJlIHRyZWF0ZWQgYXMgY2VudGVyLWp1c3RpZmllZCB0ZXh0LiBBbnlcblx0ICogcmVzaXppbmcgb2YgYSBzaW5nbGUgbGluZSBvZiBhIHRleHQgZmllbGQgaXMgZXF1YWxseSBkaXN0cmlidXRlZCB0byBib3RoXG5cdCAqIHRoZSByaWdodCBhbmQgbGVmdCBzaWRlcy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQ0VOVEVSOnN0cmluZyA9IFwiY2VudGVyXCI7XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB0aGF0IHRoZSB0ZXh0IGlzIHRvIGJlIHRyZWF0ZWQgYXMgbGVmdC1qdXN0aWZpZWQgdGV4dCwgbWVhbmluZ1xuXHQgKiB0aGF0IHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHRleHQgZmllbGQgcmVtYWlucyBmaXhlZCBhbmQgYW55IHJlc2l6aW5nIG9mIGFcblx0ICogc2luZ2xlIGxpbmUgaXMgb24gdGhlIHJpZ2h0IHNpZGUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIExFRlQ6c3RyaW5nID0gXCJsZWZ0XCI7XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB0aGF0IG5vIHJlc2l6aW5nIGlzIHRvIG9jY3VyLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBOT05FOnN0cmluZyA9IFwibm9uZVwiO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgdGhhdCB0aGUgdGV4dCBpcyB0byBiZSB0cmVhdGVkIGFzIHJpZ2h0LWp1c3RpZmllZCB0ZXh0LCBtZWFuaW5nXG5cdCAqIHRoYXQgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHRleHQgZmllbGQgcmVtYWlucyBmaXhlZCBhbmQgYW55IHJlc2l6aW5nIG9mIGFcblx0ICogc2luZ2xlIGxpbmUgaXMgb24gdGhlIGxlZnQgc2lkZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUklHSFQ6c3RyaW5nID0gXCJyaWdodFwiO1xufVxuXG5leHBvcnQgPSBUZXh0RmllbGRBdXRvU2l6ZTsiXX0= \ No newline at end of file diff --git a/lib/core/text/TextFieldAutoSize.ts b/lib/core/text/TextFieldAutoSize.ts new file mode 100644 index 00000000..73556ec2 --- /dev/null +++ b/lib/core/text/TextFieldAutoSize.ts @@ -0,0 +1,34 @@ +/** + * The TextFieldAutoSize class is an enumeration of constant values used in + * setting the autoSize property of the TextField class. + */ +class TextFieldAutoSize +{ + /** + * Specifies that the text is to be treated as center-justified text. Any + * resizing of a single line of a text field is equally distributed to both + * the right and left sides. + */ + public static CENTER:string = "center"; + + /** + * Specifies that the text is to be treated as left-justified text, meaning + * that the left side of the text field remains fixed and any resizing of a + * single line is on the right side. + */ + public static LEFT:string = "left"; + + /** + * Specifies that no resizing is to occur. + */ + public static NONE:string = "none"; + + /** + * Specifies that the text is to be treated as right-justified text, meaning + * that the right side of the text field remains fixed and any resizing of a + * single line is on the left side. + */ + public static RIGHT:string = "right"; +} + +export = TextFieldAutoSize; \ No newline at end of file diff --git a/lib/core/text/TextFieldType.js b/lib/core/text/TextFieldType.js new file mode 100755 index 00000000..17e8c567 --- /dev/null +++ b/lib/core/text/TextFieldType.js @@ -0,0 +1,18 @@ +/** +* The TextFieldType class is an enumeration of constant values used in setting the +* type property of the TextField class. +* +* @see away.entities.TextField#type +*/ +var TextFieldType = (function () { + function TextFieldType() { + } + TextFieldType.DYNAMIC = "dynamic"; + + TextFieldType.INPUT = "input"; + return TextFieldType; +})(); + +module.exports = TextFieldType; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdGV4dC9UZXh0RmllbGRUeXBlLnRzIl0sIm5hbWVzIjpbIlRleHRGaWVsZFR5cGUiLCJUZXh0RmllbGRUeXBlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7RUFLRztBQUNIO0lBQUFBO0lBV0FDLENBQUNBO0FBQUFELElBTkFBLHdCQUErQkEsU0FBU0E7O0lBS3hDQSxzQkFBNkJBLE9BQU9BO0lBQ3JDQSxxQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCw4QkFBdUIsQ0FBQSIsImZpbGUiOiJjb3JlL3RleHQvVGV4dEZpZWxkVHlwZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVGhlIFRleHRGaWVsZFR5cGUgY2xhc3MgaXMgYW4gZW51bWVyYXRpb24gb2YgY29uc3RhbnQgdmFsdWVzIHVzZWQgaW4gc2V0dGluZyB0aGVcbiAqIDxjb2RlPnR5cGU8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBUZXh0RmllbGQgY2xhc3MuXG4gKlxuICogQHNlZSBhd2F5LmVudGl0aWVzLlRleHRGaWVsZCN0eXBlXG4gKi9cbmNsYXNzIFRleHRGaWVsZFR5cGVcbntcblx0LyoqXG5cdCAqIFVzZWQgdG8gc3BlY2lmeSBhIDxjb2RlPmR5bmFtaWM8L2NvZGU+IFRleHRGaWVsZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRFlOQU1JQzpzdHJpbmcgPSBcImR5bmFtaWNcIjtcblxuXHQvKipcblx0ICogVXNlZCB0byBzcGVjaWZ5IGFuIDxjb2RlPmlucHV0PC9jb2RlPiBUZXh0RmllbGQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIElOUFVUOnN0cmluZyA9IFwiaW5wdXRcIjtcbn1cblxuZXhwb3J0ID0gVGV4dEZpZWxkVHlwZTsiXX0= \ No newline at end of file diff --git a/lib/core/text/TextFieldType.ts b/lib/core/text/TextFieldType.ts new file mode 100644 index 00000000..d16dd95b --- /dev/null +++ b/lib/core/text/TextFieldType.ts @@ -0,0 +1,20 @@ +/** + * The TextFieldType class is an enumeration of constant values used in setting the + * type property of the TextField class. + * + * @see away.entities.TextField#type + */ +class TextFieldType +{ + /** + * Used to specify a dynamic TextField. + */ + public static DYNAMIC:string = "dynamic"; + + /** + * Used to specify an input TextField. + */ + public static INPUT:string = "input"; +} + +export = TextFieldType; \ No newline at end of file diff --git a/lib/core/text/TextFormat.js b/lib/core/text/TextFormat.js new file mode 100755 index 00000000..284424b2 --- /dev/null +++ b/lib/core/text/TextFormat.js @@ -0,0 +1,105 @@ +/** +* The TextFormat class represents character formatting information. Use the +* TextFormat class to create specific text formatting for text fields. You +* can apply text formatting to both static and dynamic text fields. The +* properties of the TextFormat class apply to device and embedded fonts. +* However, for embedded fonts, bold and italic text actually require specific +* fonts. If you want to display bold or italic text with an embedded font, +* you need to embed the bold and italic variations of that font. +* +*

You must use the constructor new TextFormat() to create a +* TextFormat object before setting its properties. When you apply a +* TextFormat object to a text field using the +* TextField.defaultTextFormat property or the +* TextField.setTextFormat() method, only its defined properties +* are applied. Use the TextField.defaultTextFormat property to +* apply formatting BEFORE you add text to the TextField, and the +* setTextFormat() method to add formatting AFTER you add text to +* the TextField. The TextFormat properties are null +* by default because if you don't provide values for the properties, Flash +* Player uses its own default formatting. The default formatting that Flash +* Player uses for each property(if property's value is null) is +* as follows:

+* +*

The default formatting for each property is also described in each +* property description.

+*/ +var TextFormat = (function () { + /** + * Creates a TextFormat object with the specified properties. You can then + * change the properties of the TextFormat object to change the formatting of + * text fields. + * + *

Any parameter may be set to null to indicate that it is + * not defined. All of the parameters are optional; any omitted parameters + * are treated as null.

+ * + * @param font The name of a font for text as a string. + * @param size An integer that indicates the size in pixels. + * @param color The color of text using this text format. A number + * containing three 8-bit RGB components; for example, + * 0xFF0000 is red, and 0x00FF00 is green. + * @param bold A Boolean value that indicates whether the text is + * boldface. + * @param italic A Boolean value that indicates whether the text is + * italicized. + * @param underline A Boolean value that indicates whether the text is + * underlined. + * @param url The URL to which the text in this text format + * hyperlinks. If url is an empty string, the + * text does not have a hyperlink. + * @param target The target window where the hyperlink is displayed. If + * the target window is an empty string, the text is + * displayed in the default target window + * _self. If the url parameter + * is set to an empty string or to the value + * null, you can get or set this property, + * but the property will have no effect. + * @param align The alignment of the paragraph, as a TextFormatAlign + * value. + * @param leftMargin Indicates the left margin of the paragraph, in pixels. + * @param rightMargin Indicates the right margin of the paragraph, in pixels. + * @param indent An integer that indicates the indentation from the left + * margin to the first character in the paragraph. + * @param leading A number that indicates the amount of leading vertical + * space between lines. + */ + function TextFormat(font, size, color, bold, italic, underline, url, target, align, leftMargin, rightMargin, indent, leading) { + if (typeof font === "undefined") { font = "Times New Roman"; } + if (typeof size === "undefined") { size = 12; } + if (typeof color === "undefined") { color = 0x000000; } + if (typeof bold === "undefined") { bold = false; } + if (typeof italic === "undefined") { italic = false; } + if (typeof underline === "undefined") { underline = false; } + if (typeof url === "undefined") { url = ""; } + if (typeof target === "undefined") { target = ""; } + if (typeof align === "undefined") { align = "left"; } + if (typeof leftMargin === "undefined") { leftMargin = 0; } + if (typeof rightMargin === "undefined") { rightMargin = 0; } + if (typeof indent === "undefined") { indent = 0; } + if (typeof leading === "undefined") { leading = 0; } + /** + * Specifies custom tab stops as an array of non-negative integers. Each tab + * stop is specified in pixels. If custom tab stops are not specified + * (null), the default tab stop is 4(average character width). + */ + this.tabStops = new Array(); + this.font = font; + this.size = size; + this.bold = bold; + this.italic = italic; + this.underline = underline; + this.url = url; + this.target = target; + this.align = align; + this.leftMargin = leftMargin; + this.rightMargin = rightMargin; + this.indent = indent; + this.leading = leading; + } + return TextFormat; +})(); + +module.exports = TextFormat; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdGV4dC9UZXh0Rm9ybWF0LnRzIl0sIm5hbWVzIjpbIlRleHRGb3JtYXQiLCJUZXh0Rm9ybWF0LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXlCRztBQUNIO0lBb01DQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFER0E7SUFDSEEsb0JBQVlBLElBQStCQSxFQUFFQSxJQUFnQkEsRUFBRUEsS0FBK0JBLEVBQUVBLElBQW9CQSxFQUFFQSxNQUFzQkEsRUFBRUEsU0FBeUJBLEVBQUVBLEdBQWVBLEVBQUVBLE1BQWtCQSxFQUFFQSxLQUFxQkEsRUFBRUEsVUFBcUJBLEVBQUVBLFdBQXNCQSxFQUFFQSxNQUFpQkEsRUFBRUEsT0FBa0JBO1FBQTdTQyxtQ0FBQUEsSUFBSUEsR0FBVUEsaUJBQWlCQTtBQUFBQSxRQUFFQSxtQ0FBQUEsSUFBSUEsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEsb0NBQUFBLEtBQUtBLEdBQWtCQSxRQUFRQTtBQUFBQSxRQUFFQSxtQ0FBQUEsSUFBSUEsR0FBV0EsS0FBS0E7QUFBQUEsUUFBRUEscUNBQUFBLE1BQU1BLEdBQVdBLEtBQUtBO0FBQUFBLFFBQUVBLHdDQUFBQSxTQUFTQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUFFQSxrQ0FBQUEsR0FBR0EsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEscUNBQUFBLE1BQU1BLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLG9DQUFBQSxLQUFLQSxHQUFVQSxNQUFNQTtBQUFBQSxRQUFFQSx5Q0FBQUEsVUFBVUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsMENBQUFBLFdBQVdBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLHFDQUFBQSxNQUFNQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxzQ0FBQUEsT0FBT0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFqRnpUQTs7OztVQUlHQTtRQUNIQSxLQUFPQSxRQUFRQSxHQUF5QkEsSUFBSUEsS0FBS0EsQ0FBU0EsQ0FBQ0EsQ0FBQ0E7UUE4RTNEQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQTtRQUNoQkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUE7UUFDaEJBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBO1FBQ2hCQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxNQUFNQTtRQUNwQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsU0FBU0E7UUFDMUJBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ2RBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLE1BQU1BO1FBQ3BCQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxLQUFLQTtRQUNsQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsVUFBVUE7UUFDNUJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLFdBQVdBO1FBQzlCQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxNQUFNQTtRQUNwQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsT0FBT0E7SUFDdkJBLENBQUNBO0lBQ0ZELGtCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImNvcmUvdGV4dC9UZXh0Rm9ybWF0LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgVGV4dEZvcm1hdCBjbGFzcyByZXByZXNlbnRzIGNoYXJhY3RlciBmb3JtYXR0aW5nIGluZm9ybWF0aW9uLiBVc2UgdGhlXG4gKiBUZXh0Rm9ybWF0IGNsYXNzIHRvIGNyZWF0ZSBzcGVjaWZpYyB0ZXh0IGZvcm1hdHRpbmcgZm9yIHRleHQgZmllbGRzLiBZb3VcbiAqIGNhbiBhcHBseSB0ZXh0IGZvcm1hdHRpbmcgdG8gYm90aCBzdGF0aWMgYW5kIGR5bmFtaWMgdGV4dCBmaWVsZHMuIFRoZVxuICogcHJvcGVydGllcyBvZiB0aGUgVGV4dEZvcm1hdCBjbGFzcyBhcHBseSB0byBkZXZpY2UgYW5kIGVtYmVkZGVkIGZvbnRzLlxuICogSG93ZXZlciwgZm9yIGVtYmVkZGVkIGZvbnRzLCBib2xkIGFuZCBpdGFsaWMgdGV4dCBhY3R1YWxseSByZXF1aXJlIHNwZWNpZmljXG4gKiBmb250cy4gSWYgeW91IHdhbnQgdG8gZGlzcGxheSBib2xkIG9yIGl0YWxpYyB0ZXh0IHdpdGggYW4gZW1iZWRkZWQgZm9udCxcbiAqIHlvdSBuZWVkIHRvIGVtYmVkIHRoZSBib2xkIGFuZCBpdGFsaWMgdmFyaWF0aW9ucyBvZiB0aGF0IGZvbnQuXG4gKlxuICogPHA+IFlvdSBtdXN0IHVzZSB0aGUgY29uc3RydWN0b3IgPGNvZGU+bmV3IFRleHRGb3JtYXQoKTwvY29kZT4gdG8gY3JlYXRlIGFcbiAqIFRleHRGb3JtYXQgb2JqZWN0IGJlZm9yZSBzZXR0aW5nIGl0cyBwcm9wZXJ0aWVzLiBXaGVuIHlvdSBhcHBseSBhXG4gKiBUZXh0Rm9ybWF0IG9iamVjdCB0byBhIHRleHQgZmllbGQgdXNpbmcgdGhlXG4gKiA8Y29kZT5UZXh0RmllbGQuZGVmYXVsdFRleHRGb3JtYXQ8L2NvZGU+IHByb3BlcnR5IG9yIHRoZVxuICogPGNvZGU+VGV4dEZpZWxkLnNldFRleHRGb3JtYXQoKTwvY29kZT4gbWV0aG9kLCBvbmx5IGl0cyBkZWZpbmVkIHByb3BlcnRpZXNcbiAqIGFyZSBhcHBsaWVkLiBVc2UgdGhlIDxjb2RlPlRleHRGaWVsZC5kZWZhdWx0VGV4dEZvcm1hdDwvY29kZT4gcHJvcGVydHkgdG9cbiAqIGFwcGx5IGZvcm1hdHRpbmcgQkVGT1JFIHlvdSBhZGQgdGV4dCB0byB0aGUgPGNvZGU+VGV4dEZpZWxkPC9jb2RlPiwgYW5kIHRoZVxuICogPGNvZGU+c2V0VGV4dEZvcm1hdCgpPC9jb2RlPiBtZXRob2QgdG8gYWRkIGZvcm1hdHRpbmcgQUZURVIgeW91IGFkZCB0ZXh0IHRvXG4gKiB0aGUgPGNvZGU+VGV4dEZpZWxkPC9jb2RlPi4gVGhlIFRleHRGb3JtYXQgcHJvcGVydGllcyBhcmUgPGNvZGU+bnVsbDwvY29kZT5cbiAqIGJ5IGRlZmF1bHQgYmVjYXVzZSBpZiB5b3UgZG9uJ3QgcHJvdmlkZSB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0aWVzLCBGbGFzaFxuICogUGxheWVyIHVzZXMgaXRzIG93biBkZWZhdWx0IGZvcm1hdHRpbmcuIFRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgdGhhdCBGbGFzaFxuICogUGxheWVyIHVzZXMgZm9yIGVhY2ggcHJvcGVydHkoaWYgcHJvcGVydHkncyB2YWx1ZSBpcyA8Y29kZT5udWxsPC9jb2RlPikgaXNcbiAqIGFzIGZvbGxvd3M6PC9wPlxuICpcbiAqIDxwPlRoZSBkZWZhdWx0IGZvcm1hdHRpbmcgZm9yIGVhY2ggcHJvcGVydHkgaXMgYWxzbyBkZXNjcmliZWQgaW4gZWFjaFxuICogcHJvcGVydHkgZGVzY3JpcHRpb24uPC9wPlxuICovXG5jbGFzcyBUZXh0Rm9ybWF0XG57XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGUgYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGguIFZhbGlkIHZhbHVlcyBhcmUgVGV4dEZvcm1hdEFsaWduXG5cdCAqIGNvbnN0YW50cy5cblx0ICpcblx0ICogQGRlZmF1bHQgVGV4dEZvcm1hdEFsaWduLkxFRlRcblx0ICogQHRocm93cyBBcmd1bWVudEVycm9yIFRoZSA8Y29kZT5hbGlnbjwvY29kZT4gc3BlY2lmaWVkIGlzIG5vdCBhIG1lbWJlciBvZlxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgZmxhc2gudGV4dC5UZXh0Rm9ybWF0QWxpZ24uXG5cdCAqL1xuXHRwdWJsaWMgYWxpZ246c3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIGJsb2NrIGluZGVudGF0aW9uIGluIHBpeGVscy4gQmxvY2sgaW5kZW50YXRpb24gaXMgYXBwbGllZCB0b1xuXHQgKiBhbiBlbnRpcmUgYmxvY2sgb2YgdGV4dDsgdGhhdCBpcywgdG8gYWxsIGxpbmVzIG9mIHRoZSB0ZXh0LiBJbiBjb250cmFzdCxcblx0ICogbm9ybWFsIGluZGVudGF0aW9uKDxjb2RlPlRleHRGb3JtYXQuaW5kZW50PC9jb2RlPikgYWZmZWN0cyBvbmx5IHRoZSBmaXJzdFxuXHQgKiBsaW5lIG9mIGVhY2ggcGFyYWdyYXBoLiBJZiB0aGlzIHByb3BlcnR5IGlzIDxjb2RlPm51bGw8L2NvZGU+LCB0aGVcblx0ICogVGV4dEZvcm1hdCBvYmplY3QgZG9lcyBub3Qgc3BlY2lmeSBibG9jayBpbmRlbnRhdGlvbihibG9jayBpbmRlbnRhdGlvbiBpc1xuXHQgKiAwKS5cblx0ICovXG5cdHB1YmxpYyBibG9ja0luZGVudDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB0ZXh0IGlzIGJvbGRmYWNlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpc1xuXHQgKiA8Y29kZT5udWxsPC9jb2RlPiwgd2hpY2ggbWVhbnMgbm8gYm9sZGZhY2UgaXMgdXNlZC4gSWYgdGhlIHZhbHVlIGlzXG5cdCAqIDxjb2RlPnRydWU8L2NvZGU+LCB0aGVuIHRoZSB0ZXh0IGlzIGJvbGRmYWNlLlxuXHQgKi9cblx0cHVibGljIGJvbGQ6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoYXQgdGhlIHRleHQgaXMgcGFydCBvZiBhIGJ1bGxldGVkIGxpc3QuIEluIGEgYnVsbGV0ZWQgbGlzdCxcblx0ICogZWFjaCBwYXJhZ3JhcGggb2YgdGV4dCBpcyBpbmRlbnRlZC4gVG8gdGhlIGxlZnQgb2YgdGhlIGZpcnN0IGxpbmUgb2YgZWFjaFxuXHQgKiBwYXJhZ3JhcGgsIGEgYnVsbGV0IHN5bWJvbCBpcyBkaXNwbGF5ZWQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzXG5cdCAqIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBtZWFucyBubyBidWxsZXRlZCBsaXN0IGlzIHVzZWQuXG5cdCAqL1xuXHRwdWJsaWMgYnVsbGV0OmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB0aGUgY29sb3Igb2YgdGhlIHRleHQuIEEgbnVtYmVyIGNvbnRhaW5pbmcgdGhyZWUgOC1iaXQgUkdCXG5cdCAqIGNvbXBvbmVudHM7IGZvciBleGFtcGxlLCAweEZGMDAwMCBpcyByZWQsIGFuZCAweDAwRkYwMCBpcyBncmVlbi4gVGhlXG5cdCAqIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHdoaWNoIG1lYW5zIHRoYXQgRmxhc2ggUGxheWVyIHVzZXMgdGhlXG5cdCAqIGNvbG9yIGJsYWNrKDB4MDAwMDAwKS5cblx0ICovXG5cdHB1YmxpYyBjb2xvcjpib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBUaGUgbmFtZSBvZiB0aGUgZm9udCBmb3IgdGV4dCBpbiB0aGlzIHRleHQgZm9ybWF0LCBhcyBhIHN0cmluZy4gVGhlXG5cdCAqIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHdoaWNoIG1lYW5zIHRoYXQgRmxhc2ggUGxheWVyIHVzZXNcblx0ICogVGltZXMgTmV3IFJvbWFuIGZvbnQgZm9yIHRoZSB0ZXh0LlxuXHQgKi9cblx0cHVibGljIGZvbnQ6c3RyaW5nO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIGluZGVudGF0aW9uIGZyb20gdGhlIGxlZnQgbWFyZ2luIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW5cblx0ICogdGhlIHBhcmFncmFwaC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4sIHdoaWNoIGluZGljYXRlc1xuXHQgKiB0aGF0IG5vIGluZGVudGF0aW9uIGlzIHVzZWQuXG5cdCAqL1xuXHRwdWJsaWMgaW5kZW50Om51bWJlcjtcblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGV4dCBpbiB0aGlzIHRleHQgZm9ybWF0IGlzIGl0YWxpY2l6ZWQuIFRoZSBkZWZhdWx0XG5cdCAqIHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBtZWFucyBubyBpdGFsaWNzIGFyZSB1c2VkLlxuXHQgKi9cblx0cHVibGljIGl0YWxpYzpib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBBIEJvb2xlYW4gdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBrZXJuaW5nIGlzIGVuYWJsZWRcblx0ICogKDxjb2RlPnRydWU8L2NvZGU+KSBvciBkaXNhYmxlZCg8Y29kZT5mYWxzZTwvY29kZT4pLiBLZXJuaW5nIGFkanVzdHMgdGhlXG5cdCAqIHBpeGVscyBiZXR3ZWVuIGNlcnRhaW4gY2hhcmFjdGVyIHBhaXJzIHRvIGltcHJvdmUgcmVhZGFiaWxpdHksIGFuZCBzaG91bGRcblx0ICogYmUgdXNlZCBvbmx5IHdoZW4gbmVjZXNzYXJ5LCBzdWNoIGFzIHdpdGggaGVhZGluZ3MgaW4gbGFyZ2UgZm9udHMuIEtlcm5pbmdcblx0ICogaXMgc3VwcG9ydGVkIGZvciBlbWJlZGRlZCBmb250cyBvbmx5LlxuXHQgKlxuXHQgKiA8cD5DZXJ0YWluIGZvbnRzIHN1Y2ggYXMgVmVyZGFuYSBhbmQgbW9ub3NwYWNlZCBmb250cywgc3VjaCBhcyBDb3VyaWVyXG5cdCAqIE5ldywgZG8gbm90IHN1cHBvcnQga2VybmluZy48L3A+XG5cdCAqXG5cdCAqIDxwPlRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBtZWFucyB0aGF0IGtlcm5pbmcgaXMgbm90XG5cdCAqIGVuYWJsZWQuPC9wPlxuXHQgKi9cblx0cHVibGljIGtlcm5pbmc6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogQW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIGFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZShjYWxsZWRcblx0ICogPGk+bGVhZGluZzwvaT4pIGJldHdlZW4gbGluZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LFxuXHQgKiB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgYW1vdW50IG9mIGxlYWRpbmcgdXNlZCBpcyAwLlxuXHQgKi9cblx0cHVibGljIGxlYWRpbmc6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgbGVmdCBtYXJnaW4gb2YgdGhlIHBhcmFncmFwaCwgaW4gcGl4ZWxzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpc1xuXHQgKiA8Y29kZT5udWxsPC9jb2RlPiwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIGxlZnQgbWFyZ2luIGlzIDAgcGl4ZWxzLlxuXHQgKi9cblx0cHVibGljIGxlZnRNYXJnaW46bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBBIG51bWJlciByZXByZXNlbnRpbmcgdGhlIGFtb3VudCBvZiBzcGFjZSB0aGF0IGlzIHVuaWZvcm1seSBkaXN0cmlidXRlZFxuXHQgKiBiZXR3ZWVuIGFsbCBjaGFyYWN0ZXJzLiBUaGUgdmFsdWUgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgYXJlXG5cdCAqIGFkZGVkIHRvIHRoZSBhZHZhbmNlIGFmdGVyIGVhY2ggY2hhcmFjdGVyLiBUaGUgZGVmYXVsdCB2YWx1ZSBpc1xuXHQgKiA8Y29kZT5udWxsPC9jb2RlPiwgd2hpY2ggbWVhbnMgdGhhdCAwIHBpeGVscyBvZiBsZXR0ZXIgc3BhY2luZyBpcyB1c2VkLlxuXHQgKiBZb3UgY2FuIHVzZSBkZWNpbWFsIHZhbHVlcyBzdWNoIGFzIDxjb2RlPjEuNzU8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGxldHRlclNwYWNpbmc6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgcmlnaHQgbWFyZ2luIG9mIHRoZSBwYXJhZ3JhcGgsIGluIHBpeGVscy4gVGhlIGRlZmF1bHQgdmFsdWUgaXNcblx0ICogPGNvZGU+bnVsbDwvY29kZT4sIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSByaWdodCBtYXJnaW4gaXMgMCBwaXhlbHMuXG5cdCAqL1xuXHRwdWJsaWMgcmlnaHRNYXJnaW46bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgc2l6ZSBpbiBwaXhlbHMgb2YgdGV4dCBpbiB0aGlzIHRleHQgZm9ybWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpc1xuXHQgKiA8Y29kZT5udWxsPC9jb2RlPiwgd2hpY2ggbWVhbnMgdGhhdCBhIHNpemUgb2YgMTIgaXMgdXNlZC5cblx0ICovXG5cdHB1YmxpYyBzaXplOm51bWJlcjtcblxuXHQvKipcblx0ICogU3BlY2lmaWVzIGN1c3RvbSB0YWIgc3RvcHMgYXMgYW4gYXJyYXkgb2Ygbm9uLW5lZ2F0aXZlIGludGVnZXJzLiBFYWNoIHRhYlxuXHQgKiBzdG9wIGlzIHNwZWNpZmllZCBpbiBwaXhlbHMuIElmIGN1c3RvbSB0YWIgc3RvcHMgYXJlIG5vdCBzcGVjaWZpZWRcblx0ICogKDxjb2RlPm51bGw8L2NvZGU+KSwgdGhlIGRlZmF1bHQgdGFiIHN0b3AgaXMgNChhdmVyYWdlIGNoYXJhY3RlciB3aWR0aCkuXG5cdCAqL1xuXHRwdWJsaWMgdGFiU3RvcHM6QXJyYXk8bnVtYmVyIC8qaW50Ki8+ID0gbmV3IEFycmF5PG51bWJlcj4oKTtcblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSB0YXJnZXQgd2luZG93IHdoZXJlIHRoZSBoeXBlcmxpbmsgaXMgZGlzcGxheWVkLiBJZiB0aGVcblx0ICogdGFyZ2V0IHdpbmRvdyBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSB0ZXh0IGlzIGRpc3BsYXllZCBpbiB0aGUgZGVmYXVsdFxuXHQgKiB0YXJnZXQgd2luZG93IDxjb2RlPl9zZWxmPC9jb2RlPi4gWW91IGNhbiBjaG9vc2UgYSBjdXN0b20gbmFtZSBvciBvbmUgb2Zcblx0ICogdGhlIGZvbGxvd2luZyBmb3VyIG5hbWVzOiA8Y29kZT5fc2VsZjwvY29kZT4gc3BlY2lmaWVzIHRoZSBjdXJyZW50IGZyYW1lXG5cdCAqIGluIHRoZSBjdXJyZW50IHdpbmRvdywgPGNvZGU+X2JsYW5rPC9jb2RlPiBzcGVjaWZpZXMgYSBuZXcgd2luZG93LFxuXHQgKiA8Y29kZT5fcGFyZW50PC9jb2RlPiBzcGVjaWZpZXMgdGhlIHBhcmVudCBvZiB0aGUgY3VycmVudCBmcmFtZSwgYW5kXG5cdCAqIDxjb2RlPl90b3A8L2NvZGU+IHNwZWNpZmllcyB0aGUgdG9wLWxldmVsIGZyYW1lIGluIHRoZSBjdXJyZW50IHdpbmRvdy4gSWZcblx0ICogdGhlIDxjb2RlPlRleHRGb3JtYXQudXJsPC9jb2RlPiBwcm9wZXJ0eSBpcyBhbiBlbXB0eSBzdHJpbmcgb3Jcblx0ICogPGNvZGU+bnVsbDwvY29kZT4sIHlvdSBjYW4gZ2V0IG9yIHNldCB0aGlzIHByb3BlcnR5LCBidXQgdGhlIHByb3BlcnR5IHdpbGxcblx0ICogaGF2ZSBubyBlZmZlY3QuXG5cdCAqL1xuXHRwdWJsaWMgdGFyZ2V0OnN0cmluZztcblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHQgdGhhdCB1c2VzIHRoaXMgdGV4dCBmb3JtYXQgaXMgdW5kZXJsaW5lZFxuXHQgKiAoPGNvZGU+dHJ1ZTwvY29kZT4pIG9yIG5vdCg8Y29kZT5mYWxzZTwvY29kZT4pLiBUaGlzIHVuZGVybGluaW5nIGlzXG5cdCAqIHNpbWlsYXIgdG8gdGhhdCBwcm9kdWNlZCBieSB0aGUgPGNvZGU+PFU+PC9jb2RlPiB0YWcsIGJ1dCB0aGUgbGF0dGVyIGlzXG5cdCAqIG5vdCB0cnVlIHVuZGVybGluaW5nLCBiZWNhdXNlIGl0IGRvZXMgbm90IHNraXAgZGVzY2VuZGVycyBjb3JyZWN0bHkuIFRoZVxuXHQgKiBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB1bmRlcmxpbmluZyBpc1xuXHQgKiBub3QgdXNlZC5cblx0ICovXG5cdHB1YmxpYyB1bmRlcmxpbmU6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHRoZSB0YXJnZXQgVVJMIGZvciB0aGUgdGV4dCBpbiB0aGlzIHRleHQgZm9ybWF0LiBJZiB0aGVcblx0ICogPGNvZGU+dXJsPC9jb2RlPiBwcm9wZXJ0eSBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSB0ZXh0IGRvZXMgbm90IGhhdmUgYVxuXHQgKiBoeXBlcmxpbmsuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxjb2RlPm51bGw8L2NvZGU+LCB3aGljaCBpbmRpY2F0ZXMgdGhhdFxuXHQgKiB0aGUgdGV4dCBkb2VzIG5vdCBoYXZlIGEgaHlwZXJsaW5rLlxuXHQgKlxuXHQgKiA8cD48Yj5Ob3RlOjwvYj4gVGhlIHRleHQgd2l0aCB0aGUgYXNzaWduZWQgdGV4dCBmb3JtYXQgbXVzdCBiZSBzZXQgd2l0aFxuXHQgKiB0aGUgPGNvZGU+aHRtbFRleHQ8L2NvZGU+IHByb3BlcnR5IGZvciB0aGUgaHlwZXJsaW5rIHRvIHdvcmsuPC9wPlxuXHQgKi9cblx0cHVibGljIHVybDpzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBUZXh0Rm9ybWF0IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvcGVydGllcy4gWW91IGNhbiB0aGVuXG5cdCAqIGNoYW5nZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgVGV4dEZvcm1hdCBvYmplY3QgdG8gY2hhbmdlIHRoZSBmb3JtYXR0aW5nIG9mXG5cdCAqIHRleHQgZmllbGRzLlxuXHQgKlxuXHQgKiA8cD5BbnkgcGFyYW1ldGVyIG1heSBiZSBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gdG8gaW5kaWNhdGUgdGhhdCBpdCBpc1xuXHQgKiBub3QgZGVmaW5lZC4gQWxsIG9mIHRoZSBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbDsgYW55IG9taXR0ZWQgcGFyYW1ldGVyc1xuXHQgKiBhcmUgdHJlYXRlZCBhcyA8Y29kZT5udWxsPC9jb2RlPi48L3A+XG5cdCAqXG5cdCAqIEBwYXJhbSBmb250ICAgICAgICBUaGUgbmFtZSBvZiBhIGZvbnQgZm9yIHRleHQgYXMgYSBzdHJpbmcuXG5cdCAqIEBwYXJhbSBzaXplICAgICAgICBBbiBpbnRlZ2VyIHRoYXQgaW5kaWNhdGVzIHRoZSBzaXplIGluIHBpeGVscy5cblx0ICogQHBhcmFtIGNvbG9yICAgICAgIFRoZSBjb2xvciBvZiB0ZXh0IHVzaW5nIHRoaXMgdGV4dCBmb3JtYXQuIEEgbnVtYmVyXG5cdCAqICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIHRocmVlIDgtYml0IFJHQiBjb21wb25lbnRzOyBmb3IgZXhhbXBsZSxcblx0ICogICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwIGlzIHJlZCwgYW5kIDB4MDBGRjAwIGlzIGdyZWVuLlxuXHQgKiBAcGFyYW0gYm9sZCAgICAgICAgQSBCb29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHQgaXNcblx0ICogICAgICAgICAgICAgICAgICAgIGJvbGRmYWNlLlxuXHQgKiBAcGFyYW0gaXRhbGljICAgICAgQSBCb29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHQgaXNcblx0ICogICAgICAgICAgICAgICAgICAgIGl0YWxpY2l6ZWQuXG5cdCAqIEBwYXJhbSB1bmRlcmxpbmUgICBBIEJvb2xlYW4gdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgdGV4dCBpc1xuXHQgKiAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lZC5cblx0ICogQHBhcmFtIHVybCAgICAgICAgIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHRleHQgaW4gdGhpcyB0ZXh0IGZvcm1hdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgaHlwZXJsaW5rcy4gSWYgPGNvZGU+dXJsPC9jb2RlPiBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICAgdGV4dCBkb2VzIG5vdCBoYXZlIGEgaHlwZXJsaW5rLlxuXHQgKiBAcGFyYW0gdGFyZ2V0ICAgICAgVGhlIHRhcmdldCB3aW5kb3cgd2hlcmUgdGhlIGh5cGVybGluayBpcyBkaXNwbGF5ZWQuIElmXG5cdCAqICAgICAgICAgICAgICAgICAgICB0aGUgdGFyZ2V0IHdpbmRvdyBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZSB0ZXh0IGlzXG5cdCAqICAgICAgICAgICAgICAgICAgICBkaXNwbGF5ZWQgaW4gdGhlIGRlZmF1bHQgdGFyZ2V0IHdpbmRvd1xuXHQgKiAgICAgICAgICAgICAgICAgICAgPGNvZGU+X3NlbGY8L2NvZGU+LiBJZiB0aGUgPGNvZGU+dXJsPC9jb2RlPiBwYXJhbWV0ZXJcblx0ICogICAgICAgICAgICAgICAgICAgIGlzIHNldCB0byBhbiBlbXB0eSBzdHJpbmcgb3IgdG8gdGhlIHZhbHVlXG5cdCAqICAgICAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgeW91IGNhbiBnZXQgb3Igc2V0IHRoaXMgcHJvcGVydHksXG5cdCAqICAgICAgICAgICAgICAgICAgICBidXQgdGhlIHByb3BlcnR5IHdpbGwgaGF2ZSBubyBlZmZlY3QuXG5cdCAqIEBwYXJhbSBhbGlnbiAgICAgICBUaGUgYWxpZ25tZW50IG9mIHRoZSBwYXJhZ3JhcGgsIGFzIGEgVGV4dEZvcm1hdEFsaWduXG5cdCAqICAgICAgICAgICAgICAgICAgICB2YWx1ZS5cblx0ICogQHBhcmFtIGxlZnRNYXJnaW4gIEluZGljYXRlcyB0aGUgbGVmdCBtYXJnaW4gb2YgdGhlIHBhcmFncmFwaCwgaW4gcGl4ZWxzLlxuXHQgKiBAcGFyYW0gcmlnaHRNYXJnaW4gSW5kaWNhdGVzIHRoZSByaWdodCBtYXJnaW4gb2YgdGhlIHBhcmFncmFwaCwgaW4gcGl4ZWxzLlxuXHQgKiBAcGFyYW0gaW5kZW50ICAgICAgQW4gaW50ZWdlciB0aGF0IGluZGljYXRlcyB0aGUgaW5kZW50YXRpb24gZnJvbSB0aGUgbGVmdFxuXHQgKiAgICAgICAgICAgICAgICAgICAgbWFyZ2luIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHBhcmFncmFwaC5cblx0ICogQHBhcmFtIGxlYWRpbmcgICAgIEEgbnVtYmVyIHRoYXQgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgbGVhZGluZyB2ZXJ0aWNhbFxuXHQgKiAgICAgICAgICAgICAgICAgICAgc3BhY2UgYmV0d2VlbiBsaW5lcy5cblx0ICovXG5cdGNvbnN0cnVjdG9yKGZvbnQ6c3RyaW5nID0gXCJUaW1lcyBOZXcgUm9tYW5cIiwgc2l6ZTpudW1iZXIgPSAxMiwgY29sb3I6bnVtYmVyIC8qaW50Ki8gPSAweDAwMDAwMCwgYm9sZDpib29sZWFuID0gZmFsc2UsIGl0YWxpYzpib29sZWFuID0gZmFsc2UsIHVuZGVybGluZTpib29sZWFuID0gZmFsc2UsIHVybDpzdHJpbmcgPSBcIlwiLCB0YXJnZXQ6c3RyaW5nID0gXCJcIiwgYWxpZ246c3RyaW5nID0gXCJsZWZ0XCIsIGxlZnRNYXJnaW46bnVtYmVyID0gMCwgcmlnaHRNYXJnaW46bnVtYmVyID0gMCwgaW5kZW50Om51bWJlciA9IDAsIGxlYWRpbmc6bnVtYmVyID0gMClcblx0e1xuXHRcdHRoaXMuZm9udCA9IGZvbnQ7XG5cdFx0dGhpcy5zaXplID0gc2l6ZTtcblx0XHR0aGlzLmJvbGQgPSBib2xkO1xuXHRcdHRoaXMuaXRhbGljID0gaXRhbGljO1xuXHRcdHRoaXMudW5kZXJsaW5lID0gdW5kZXJsaW5lO1xuXHRcdHRoaXMudXJsID0gdXJsO1xuXHRcdHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuXHRcdHRoaXMuYWxpZ24gPSBhbGlnbjtcblx0XHR0aGlzLmxlZnRNYXJnaW4gPSBsZWZ0TWFyZ2luO1xuXHRcdHRoaXMucmlnaHRNYXJnaW4gPSByaWdodE1hcmdpbjtcblx0XHR0aGlzLmluZGVudCA9IGluZGVudDtcblx0XHR0aGlzLmxlYWRpbmcgPSBsZWFkaW5nO1xuXHR9XG59XG5cbmV4cG9ydCA9IFRleHRGb3JtYXQ7Il19 \ No newline at end of file diff --git a/lib/core/text/TextFormat.ts b/lib/core/text/TextFormat.ts new file mode 100644 index 00000000..7bf77860 --- /dev/null +++ b/lib/core/text/TextFormat.ts @@ -0,0 +1,240 @@ +/** + * The TextFormat class represents character formatting information. Use the + * TextFormat class to create specific text formatting for text fields. You + * can apply text formatting to both static and dynamic text fields. The + * properties of the TextFormat class apply to device and embedded fonts. + * However, for embedded fonts, bold and italic text actually require specific + * fonts. If you want to display bold or italic text with an embedded font, + * you need to embed the bold and italic variations of that font. + * + *

You must use the constructor new TextFormat() to create a + * TextFormat object before setting its properties. When you apply a + * TextFormat object to a text field using the + * TextField.defaultTextFormat property or the + * TextField.setTextFormat() method, only its defined properties + * are applied. Use the TextField.defaultTextFormat property to + * apply formatting BEFORE you add text to the TextField, and the + * setTextFormat() method to add formatting AFTER you add text to + * the TextField. The TextFormat properties are null + * by default because if you don't provide values for the properties, Flash + * Player uses its own default formatting. The default formatting that Flash + * Player uses for each property(if property's value is null) is + * as follows:

+ * + *

The default formatting for each property is also described in each + * property description.

+ */ +class TextFormat +{ + + /** + * Indicates the alignment of the paragraph. Valid values are TextFormatAlign + * constants. + * + * @default TextFormatAlign.LEFT + * @throws ArgumentError The align specified is not a member of + * flash.text.TextFormatAlign. + */ + public align:string; + + /** + * Indicates the block indentation in pixels. Block indentation is applied to + * an entire block of text; that is, to all lines of the text. In contrast, + * normal indentation(TextFormat.indent) affects only the first + * line of each paragraph. If this property is null, the + * TextFormat object does not specify block indentation(block indentation is + * 0). + */ + public blockIndent:number; + + /** + * Specifies whether the text is boldface. The default value is + * null, which means no boldface is used. If the value is + * true, then the text is boldface. + */ + public bold:boolean; + + /** + * Indicates that the text is part of a bulleted list. In a bulleted list, + * each paragraph of text is indented. To the left of the first line of each + * paragraph, a bullet symbol is displayed. The default value is + * null, which means no bulleted list is used. + */ + public bullet:boolean; + + /** + * Indicates the color of the text. A number containing three 8-bit RGB + * components; for example, 0xFF0000 is red, and 0x00FF00 is green. The + * default value is null, which means that Flash Player uses the + * color black(0x000000). + */ + public color:boolean; + + /** + * The name of the font for text in this text format, as a string. The + * default value is null, which means that Flash Player uses + * Times New Roman font for the text. + */ + public font:string; + + /** + * Indicates the indentation from the left margin to the first character in + * the paragraph. The default value is null, which indicates + * that no indentation is used. + */ + public indent:number; + + /** + * Indicates whether text in this text format is italicized. The default + * value is null, which means no italics are used. + */ + public italic:boolean; + + /** + * A Boolean value that indicates whether kerning is enabled + * (true) or disabled(false). Kerning adjusts the + * pixels between certain character pairs to improve readability, and should + * be used only when necessary, such as with headings in large fonts. Kerning + * is supported for embedded fonts only. + * + *

Certain fonts such as Verdana and monospaced fonts, such as Courier + * New, do not support kerning.

+ * + *

The default value is null, which means that kerning is not + * enabled.

+ */ + public kerning:boolean; + + /** + * An integer representing the amount of vertical space(called + * leading) between lines. The default value is null, + * which indicates that the amount of leading used is 0. + */ + public leading:number; + + /** + * The left margin of the paragraph, in pixels. The default value is + * null, which indicates that the left margin is 0 pixels. + */ + public leftMargin:number; + + /** + * A number representing the amount of space that is uniformly distributed + * between all characters. The value specifies the number of pixels that are + * added to the advance after each character. The default value is + * null, which means that 0 pixels of letter spacing is used. + * You can use decimal values such as 1.75. + */ + public letterSpacing:number; + + /** + * The right margin of the paragraph, in pixels. The default value is + * null, which indicates that the right margin is 0 pixels. + */ + public rightMargin:number; + + /** + * The size in pixels of text in this text format. The default value is + * null, which means that a size of 12 is used. + */ + public size:number; + + /** + * Specifies custom tab stops as an array of non-negative integers. Each tab + * stop is specified in pixels. If custom tab stops are not specified + * (null), the default tab stop is 4(average character width). + */ + public tabStops:Array = new Array(); + + /** + * Indicates the target window where the hyperlink is displayed. If the + * target window is an empty string, the text is displayed in the default + * target window _self. You can choose a custom name or one of + * the following four names: _self specifies the current frame + * in the current window, _blank specifies a new window, + * _parent specifies the parent of the current frame, and + * _top specifies the top-level frame in the current window. If + * the TextFormat.url property is an empty string or + * null, you can get or set this property, but the property will + * have no effect. + */ + public target:string; + + /** + * Indicates whether the text that uses this text format is underlined + * (true) or not(false). This underlining is + * similar to that produced by the tag, but the latter is + * not true underlining, because it does not skip descenders correctly. The + * default value is null, which indicates that underlining is + * not used. + */ + public underline:boolean; + + /** + * Indicates the target URL for the text in this text format. If the + * url property is an empty string, the text does not have a + * hyperlink. The default value is null, which indicates that + * the text does not have a hyperlink. + * + *

Note: The text with the assigned text format must be set with + * the htmlText property for the hyperlink to work.

+ */ + public url:string; + + /** + * Creates a TextFormat object with the specified properties. You can then + * change the properties of the TextFormat object to change the formatting of + * text fields. + * + *

Any parameter may be set to null to indicate that it is + * not defined. All of the parameters are optional; any omitted parameters + * are treated as null.

+ * + * @param font The name of a font for text as a string. + * @param size An integer that indicates the size in pixels. + * @param color The color of text using this text format. A number + * containing three 8-bit RGB components; for example, + * 0xFF0000 is red, and 0x00FF00 is green. + * @param bold A Boolean value that indicates whether the text is + * boldface. + * @param italic A Boolean value that indicates whether the text is + * italicized. + * @param underline A Boolean value that indicates whether the text is + * underlined. + * @param url The URL to which the text in this text format + * hyperlinks. If url is an empty string, the + * text does not have a hyperlink. + * @param target The target window where the hyperlink is displayed. If + * the target window is an empty string, the text is + * displayed in the default target window + * _self. If the url parameter + * is set to an empty string or to the value + * null, you can get or set this property, + * but the property will have no effect. + * @param align The alignment of the paragraph, as a TextFormatAlign + * value. + * @param leftMargin Indicates the left margin of the paragraph, in pixels. + * @param rightMargin Indicates the right margin of the paragraph, in pixels. + * @param indent An integer that indicates the indentation from the left + * margin to the first character in the paragraph. + * @param leading A number that indicates the amount of leading vertical + * space between lines. + */ + constructor(font:string = "Times New Roman", size:number = 12, color:number /*int*/ = 0x000000, bold:boolean = false, italic:boolean = false, underline:boolean = false, url:string = "", target:string = "", align:string = "left", leftMargin:number = 0, rightMargin:number = 0, indent:number = 0, leading:number = 0) + { + this.font = font; + this.size = size; + this.bold = bold; + this.italic = italic; + this.underline = underline; + this.url = url; + this.target = target; + this.align = align; + this.leftMargin = leftMargin; + this.rightMargin = rightMargin; + this.indent = indent; + this.leading = leading; + } +} + +export = TextFormat; \ No newline at end of file diff --git a/lib/core/text/TextFormatAlign.js b/lib/core/text/TextFormatAlign.js new file mode 100755 index 00000000..c388b675 --- /dev/null +++ b/lib/core/text/TextFormatAlign.js @@ -0,0 +1,33 @@ +/** +* The TextFormatAlign class provides values for text alignment in the +* TextFormat class. +*/ +var TextFormatAlign = (function () { + function TextFormatAlign() { + /** + * Constant; centers the text in the text field. Use the syntax + * TextFormatAlign.CENTER. + */ + this.CENTER = "center"; + /** + * Constant; justifies text within the text field. Use the syntax + * TextFormatAlign.JUSTIFY. + */ + this.JUSTIFY = "justify"; + /** + * Constant; aligns text to the left within the text field. Use the syntax + * TextFormatAlign.LEFT. + */ + this.LEFT = "left"; + /** + * Constant; aligns text to the right within the text field. Use the syntax + * TextFormatAlign.RIGHT. + */ + this.RIGHT = "right"; + } + return TextFormatAlign; +})(); + +module.exports = TextFormatAlign; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdGV4dC9UZXh0Rm9ybWF0QWxpZ24udHMiXSwibmFtZXMiOlsiVGV4dEZvcm1hdEFsaWduIiwiVGV4dEZvcm1hdEFsaWduLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0VBR0c7QUFDSDtJQUFBQTtRQUVDQzs7O1VBR0dBO1FBQ0hBLEtBQU9BLE1BQU1BLEdBQVVBLFFBQVFBLENBQUNBO1FBRWhDQTs7O1VBR0dBO1FBQ0hBLEtBQU9BLE9BQU9BLEdBQVVBLFNBQVNBLENBQUNBO1FBRWxDQTs7O1VBR0dBO1FBQ0hBLEtBQU9BLElBQUlBLEdBQVVBLE1BQU1BLENBQUNBO1FBRTVCQTs7O1VBR0dBO1FBQ0hBLEtBQU9BLEtBQUtBLEdBQVVBLE9BQU9BLENBQUNBO0lBQy9CQSxDQUFDQTtBQUFBRCxJQUFEQSx1QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJjb3JlL3RleHQvVGV4dEZvcm1hdEFsaWduLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgVGV4dEZvcm1hdEFsaWduIGNsYXNzIHByb3ZpZGVzIHZhbHVlcyBmb3IgdGV4dCBhbGlnbm1lbnQgaW4gdGhlXG4gKiBUZXh0Rm9ybWF0IGNsYXNzLlxuICovXG5jbGFzcyBUZXh0Rm9ybWF0QWxpZ25cbntcblx0LyoqXG5cdCAqIENvbnN0YW50OyBjZW50ZXJzIHRoZSB0ZXh0IGluIHRoZSB0ZXh0IGZpZWxkLiBVc2UgdGhlIHN5bnRheFxuXHQgKiA8Y29kZT5UZXh0Rm9ybWF0QWxpZ24uQ0VOVEVSPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBDRU5URVI6c3RyaW5nID0gXCJjZW50ZXJcIjtcblxuXHQvKipcblx0ICogQ29uc3RhbnQ7IGp1c3RpZmllcyB0ZXh0IHdpdGhpbiB0aGUgdGV4dCBmaWVsZC4gVXNlIHRoZSBzeW50YXhcblx0ICogPGNvZGU+VGV4dEZvcm1hdEFsaWduLkpVU1RJRlk8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIEpVU1RJRlk6c3RyaW5nID0gXCJqdXN0aWZ5XCI7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50OyBhbGlnbnMgdGV4dCB0byB0aGUgbGVmdCB3aXRoaW4gdGhlIHRleHQgZmllbGQuIFVzZSB0aGUgc3ludGF4XG5cdCAqIDxjb2RlPlRleHRGb3JtYXRBbGlnbi5MRUZUPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBMRUZUOnN0cmluZyA9IFwibGVmdFwiO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudDsgYWxpZ25zIHRleHQgdG8gdGhlIHJpZ2h0IHdpdGhpbiB0aGUgdGV4dCBmaWVsZC4gVXNlIHRoZSBzeW50YXhcblx0ICogPGNvZGU+VGV4dEZvcm1hdEFsaWduLlJJR0hUPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBSSUdIVDpzdHJpbmcgPSBcInJpZ2h0XCI7XG59XG5cbmV4cG9ydCA9IFRleHRGb3JtYXRBbGlnbjsiXX0= \ No newline at end of file diff --git a/lib/core/text/TextFormatAlign.ts b/lib/core/text/TextFormatAlign.ts new file mode 100644 index 00000000..68003d87 --- /dev/null +++ b/lib/core/text/TextFormatAlign.ts @@ -0,0 +1,32 @@ +/** + * The TextFormatAlign class provides values for text alignment in the + * TextFormat class. + */ +class TextFormatAlign +{ + /** + * Constant; centers the text in the text field. Use the syntax + * TextFormatAlign.CENTER. + */ + public CENTER:string = "center"; + + /** + * Constant; justifies text within the text field. Use the syntax + * TextFormatAlign.JUSTIFY. + */ + public JUSTIFY:string = "justify"; + + /** + * Constant; aligns text to the left within the text field. Use the syntax + * TextFormatAlign.LEFT. + */ + public LEFT:string = "left"; + + /** + * Constant; aligns text to the right within the text field. Use the syntax + * TextFormatAlign.RIGHT. + */ + public RIGHT:string = "right"; +} + +export = TextFormatAlign; \ No newline at end of file diff --git a/lib/core/text/TextInteractionMode.js b/lib/core/text/TextInteractionMode.js new file mode 100755 index 00000000..9535e3f5 --- /dev/null +++ b/lib/core/text/TextInteractionMode.js @@ -0,0 +1,17 @@ +/** +* A class that defines the Interactive mode of a text field object. +* +* @see away.entities.TextField#textInteractionMode +*/ +var TextInteractionMode = (function () { + function TextInteractionMode() { + } + TextInteractionMode.NORMAL = "normal"; + + TextInteractionMode.SELECTION = "selection"; + return TextInteractionMode; +})(); + +module.exports = TextInteractionMode; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdGV4dC9UZXh0SW50ZXJhY3Rpb25Nb2RlLnRzIl0sIm5hbWVzIjpbIlRleHRJbnRlcmFjdGlvbk1vZGUiLCJUZXh0SW50ZXJhY3Rpb25Nb2RlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztFQUlHO0FBQ0g7SUFBQUE7SUFpQkFDLENBQUNBO0FBQUFELElBUkFBLDZCQUE4QkEsUUFBUUE7O0lBT3RDQSxnQ0FBaUNBLFdBQVdBO0lBQzdDQSwyQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxvQ0FBNkIsQ0FBQSIsImZpbGUiOiJjb3JlL3RleHQvVGV4dEludGVyYWN0aW9uTW9kZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSBjbGFzcyB0aGF0IGRlZmluZXMgdGhlIEludGVyYWN0aXZlIG1vZGUgb2YgYSB0ZXh0IGZpZWxkIG9iamVjdC5cbiAqXG4gKiBAc2VlIGF3YXkuZW50aXRpZXMuVGV4dEZpZWxkI3RleHRJbnRlcmFjdGlvbk1vZGVcbiAqL1xuY2xhc3MgVGV4dEludGVyYWN0aW9uTW9kZVxue1xuXHQvKipcblx0ICogVGhlIHRleHQgZmllbGQncyBkZWZhdWx0IGludGVyYWN0aW9uIG1vZGUgaXMgTk9STUFMIGFuZCBpdCB2YXJpZXMgYWNyb3NzXG5cdCAqIHBsYXRmb3JtLiBPbiBEZXNrdG9wLCB0aGUgbm9ybWFsIG1vZGUgaW1wbGllcyB0aGF0IHRoZSB0ZXh0IGZpZWxkIGlzIGluXG5cdCAqIHNjcm9sbGFibGUgKyBzZWxlY3Rpb24gbW9kZS4gT24gTW9iaWxlIHBsYXRmb3JtcyBsaWtlIEFuZHJvaWQsIG5vcm1hbCBtb2RlXG5cdCAqIGltcGxpZXMgdGhhdCB0aGUgdGV4dCBmaWVsZCBjYW4gb25seSBiZSBzY3JvbGxlZCBidXQgdGhlIHRleHQgY2FuIG5vdCBiZVxuXHQgKiBzZWxlY3RlZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTk9STUFMOnN0cmluZyA9IFwibm9ybWFsXCI7XG5cblx0LyoqXG5cdCAqIE9uIG1vYmlsZSBwbGF0Zm9ybXMgbGlrZSBBbmRyb2lkLCB0aGUgdGV4dCBmaWVsZCBzdGFydHMgaW4gbm9ybWFsIG1vZGVcblx0ICogKHdoaWNoIGltcGxpZXMgc2Nyb2xsIGFuZCBub24tc2VsZWN0YWJsZSBtb2RlKS4gVGhlIHVzZXIgY2FuIHN3aXRjaCB0b1xuXHQgKiBzZWxlY3Rpb24gbW9kZSB0aHJvdWdoIHRoZSBpbi1idWlsdCBjb250ZXh0IG1lbnUgb2YgdGhlIHRleHQgZmllbGQgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBTRUxFQ1RJT046c3RyaW5nID0gXCJzZWxlY3Rpb25cIjtcbn1cblxuZXhwb3J0ID0gVGV4dEludGVyYWN0aW9uTW9kZTsiXX0= \ No newline at end of file diff --git a/lib/core/text/TextInteractionMode.ts b/lib/core/text/TextInteractionMode.ts new file mode 100644 index 00000000..130f9ee4 --- /dev/null +++ b/lib/core/text/TextInteractionMode.ts @@ -0,0 +1,25 @@ +/** + * A class that defines the Interactive mode of a text field object. + * + * @see away.entities.TextField#textInteractionMode + */ +class TextInteractionMode +{ + /** + * The text field's default interaction mode is NORMAL and it varies across + * platform. On Desktop, the normal mode implies that the text field is in + * scrollable + selection mode. On Mobile platforms like Android, normal mode + * implies that the text field can only be scrolled but the text can not be + * selected. + */ + public static NORMAL:string = "normal"; + + /** + * On mobile platforms like Android, the text field starts in normal mode + * (which implies scroll and non-selectable mode). The user can switch to + * selection mode through the in-built context menu of the text field object. + */ + public static SELECTION:string = "selection"; +} + +export = TextInteractionMode; \ No newline at end of file diff --git a/lib/core/text/TextLineMetrics.js b/lib/core/text/TextLineMetrics.js new file mode 100755 index 00000000..2099f89e --- /dev/null +++ b/lib/core/text/TextLineMetrics.js @@ -0,0 +1,39 @@ +/** +* The TextLineMetrics class contains information about the text position and +* measurements of a line of text within a text field. All measurements are in +* pixels. Objects of this class are returned by the +* away.entities.TextField.getLineMetrics() method. +*/ +var TextLineMetrics = (function () { + /** + * Creates a TextLineMetrics object. The TextLineMetrics object contains + * information about the text metrics of a line of text in a text field. + * Objects of this class are returned by the + * away.entities.TextField.getLineMetrics() method. + * + * @param x The left position of the first character in pixels. + * @param width The width of the text of the selected lines (not + * necessarily the complete text) in pixels. + * @param height The height of the text of the selected lines (not + * necessarily the complete text) in pixels. + * @param ascent The length from the baseline to the top of the line + * height in pixels. + * @param descent The length from the baseline to the bottom depth of + * the line in pixels. + * @param leading The measurement of the vertical distance between the + * lines of text. + */ + function TextLineMetrics(x, width, height, ascent, descent, leading) { + if (typeof x === "undefined") { x = NaN; } + if (typeof width === "undefined") { width = NaN; } + if (typeof height === "undefined") { height = NaN; } + if (typeof ascent === "undefined") { ascent = NaN; } + if (typeof descent === "undefined") { descent = NaN; } + if (typeof leading === "undefined") { leading = NaN; } + } + return TextLineMetrics; +})(); + +module.exports = TextLineMetrics; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdGV4dC9UZXh0TGluZU1ldHJpY3MudHMiXSwibmFtZXMiOlsiVGV4dExpbmVNZXRyaWNzIiwiVGV4dExpbmVNZXRyaWNzLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7RUFLRztBQUNIO0lBNERDQTs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFER0E7SUFDSEEseUJBQVlBLENBQWNBLEVBQUVBLEtBQWtCQSxFQUFFQSxNQUFtQkEsRUFBRUEsTUFBbUJBLEVBQUVBLE9BQW9CQSxFQUFFQSxPQUFvQkE7UUFBeEhDLGdDQUFBQSxDQUFDQSxHQUFVQSxHQUFHQTtBQUFBQSxRQUFFQSxvQ0FBQUEsS0FBS0EsR0FBVUEsR0FBR0E7QUFBQUEsUUFBRUEscUNBQUFBLE1BQU1BLEdBQVVBLEdBQUdBO0FBQUFBLFFBQUVBLHFDQUFBQSxNQUFNQSxHQUFVQSxHQUFHQTtBQUFBQSxRQUFFQSxzQ0FBQUEsT0FBT0EsR0FBVUEsR0FBR0E7QUFBQUEsUUFBRUEsc0NBQUFBLE9BQU9BLEdBQVVBLEdBQUdBO0FBQUFBLElBR3BJQSxDQUFDQTtJQUNGRCx1QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJjb3JlL3RleHQvVGV4dExpbmVNZXRyaWNzLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgVGV4dExpbmVNZXRyaWNzIGNsYXNzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXh0IHBvc2l0aW9uIGFuZFxuICogbWVhc3VyZW1lbnRzIG9mIGEgbGluZSBvZiB0ZXh0IHdpdGhpbiBhIHRleHQgZmllbGQuIEFsbCBtZWFzdXJlbWVudHMgYXJlIGluXG4gKiBwaXhlbHMuIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcmUgcmV0dXJuZWQgYnkgdGhlIFxuICogPGNvZGU+YXdheS5lbnRpdGllcy5UZXh0RmllbGQuZ2V0TGluZU1ldHJpY3MoKTwvY29kZT4gbWV0aG9kLlxuICovXG5jbGFzcyBUZXh0TGluZU1ldHJpY3Ncbntcblx0LyoqXG5cdCAqIFRoZSBhc2NlbnQgdmFsdWUgb2YgdGhlIHRleHQgaXMgdGhlIGxlbmd0aCBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgdG9wIG9mXG5cdCAqIHRoZSBsaW5lIGhlaWdodCBpbiBwaXhlbHMuXG5cdCAqL1xuXHRwdWJsaWMgYXNjZW50Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIGRlc2NlbnQgdmFsdWUgb2YgdGhlIHRleHQgaXMgdGhlIGxlbmd0aCBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGVcblx0ICogYm90dG9tIGRlcHRoIG9mIHRoZSBsaW5lIGluIHBpeGVscy5cblx0ICovXG5cdHB1YmxpYyBkZXNjZW50Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIGhlaWdodCB2YWx1ZSBvZiB0aGUgdGV4dCBvZiB0aGUgc2VsZWN0ZWQgbGluZXMgKG5vdCBuZWNlc3NhcmlseSB0aGVcblx0ICogY29tcGxldGUgdGV4dCkgaW4gcGl4ZWxzLiBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0IGxpbmUgZG9lcyBub3QgaW5jbHVkZSB0aGVcblx0ICogZ3V0dGVyIGhlaWdodC5cblx0ICovXG5cdHB1YmxpYyBoZWlnaHQ6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgbGVhZGluZyB2YWx1ZSBpcyB0aGUgbWVhc3VyZW1lbnQgb2YgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdGhlXG5cdCAqIGxpbmVzIG9mIHRleHQuXG5cdCAqL1xuXHRwdWJsaWMgbGVhZGluZzpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSB3aWR0aCB2YWx1ZSBpcyB0aGUgd2lkdGggb2YgdGhlIHRleHQgb2YgdGhlIHNlbGVjdGVkIGxpbmVzIChub3Rcblx0ICogbmVjZXNzYXJpbHkgdGhlIGNvbXBsZXRlIHRleHQpIGluIHBpeGVscy4gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGxpbmUgaXNcblx0ICogbm90IHRoZSBzYW1lIGFzIHRoZSB3aWR0aCBvZiB0aGUgdGV4dCBmaWVsZC4gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGxpbmUgaXNcblx0ICogcmVsYXRpdmUgdG8gdGhlIHRleHQgZmllbGQgd2lkdGgsIG1pbnVzIHRoZSBndXR0ZXIgd2lkdGggb2YgNCBwaXhlbHNcblx0ICogKDIgcGl4ZWxzIG9uIGVhY2ggc2lkZSkuXG5cdCAqL1xuXHRwdWJsaWMgd2lkdGg6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgeCB2YWx1ZSBpcyB0aGUgbGVmdCBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHBpeGVscy4gVGhpc1xuXHQgKiB2YWx1ZSBpbmNsdWRlcyB0aGUgbWFyZ2luLCBpbmRlbnQgKGlmIGFueSksIGFuZCBndXR0ZXIgd2lkdGhzLlxuXHQgKi9cblx0cHVibGljIHg6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgVGV4dExpbmVNZXRyaWNzIG9iamVjdC4gVGhlIFRleHRMaW5lTWV0cmljcyBvYmplY3QgY29udGFpbnNcblx0ICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRleHQgbWV0cmljcyBvZiBhIGxpbmUgb2YgdGV4dCBpbiBhIHRleHQgZmllbGQuXG5cdCAqIE9iamVjdHMgb2YgdGhpcyBjbGFzcyBhcmUgcmV0dXJuZWQgYnkgdGhlXG5cdCAqIGF3YXkuZW50aXRpZXMuVGV4dEZpZWxkLmdldExpbmVNZXRyaWNzKCkgbWV0aG9kLlxuXHQgKlxuXHQgKiBAcGFyYW0geCAgICAgICAgICAgVGhlIGxlZnQgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiBwaXhlbHMuXG5cdCAqIEBwYXJhbSB3aWR0aCAgICAgICBUaGUgd2lkdGggb2YgdGhlIHRleHQgb2YgdGhlIHNlbGVjdGVkIGxpbmVzIChub3Rcblx0ICogICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBjb21wbGV0ZSB0ZXh0KSBpbiBwaXhlbHMuXG5cdCAqIEBwYXJhbSBoZWlnaHQgICAgICBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzZWxlY3RlZCBsaW5lcyAobm90XG5cdCAqICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgY29tcGxldGUgdGV4dCkgaW4gcGl4ZWxzLlxuXHQgKiBAcGFyYW0gYXNjZW50ICAgICAgVGhlIGxlbmd0aCBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgdG9wIG9mIHRoZSBsaW5lXG5cdCAqICAgICAgICAgICAgICAgICAgICBoZWlnaHQgaW4gcGl4ZWxzLlxuXHQgKiBAcGFyYW0gZGVzY2VudCAgICAgVGhlIGxlbmd0aCBmcm9tIHRoZSBiYXNlbGluZSB0byB0aGUgYm90dG9tIGRlcHRoIG9mXG5cdCAqICAgICAgICAgICAgICAgICAgICB0aGUgbGluZSBpbiBwaXhlbHMuXG5cdCAqIEBwYXJhbSBsZWFkaW5nICAgICBUaGUgbWVhc3VyZW1lbnQgb2YgdGhlIHZlcnRpY2FsIGRpc3RhbmNlIGJldHdlZW4gdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgICBsaW5lcyBvZiB0ZXh0LlxuXHQgKi9cblx0Y29uc3RydWN0b3IoeDpudW1iZXIgPSBOYU4sIHdpZHRoOm51bWJlciA9IE5hTiwgaGVpZ2h0Om51bWJlciA9IE5hTiwgYXNjZW50Om51bWJlciA9IE5hTiwgZGVzY2VudDpudW1iZXIgPSBOYU4sIGxlYWRpbmc6bnVtYmVyID0gTmFOKVxuXHR7XG5cblx0fVxufVxuXG5leHBvcnQgPSBUZXh0TGluZU1ldHJpY3M7Il19 \ No newline at end of file diff --git a/lib/core/text/TextLineMetrics.ts b/lib/core/text/TextLineMetrics.ts new file mode 100644 index 00000000..19437859 --- /dev/null +++ b/lib/core/text/TextLineMetrics.ts @@ -0,0 +1,73 @@ +/** + * The TextLineMetrics class contains information about the text position and + * measurements of a line of text within a text field. All measurements are in + * pixels. Objects of this class are returned by the + * away.entities.TextField.getLineMetrics() method. + */ +class TextLineMetrics +{ + /** + * The ascent value of the text is the length from the baseline to the top of + * the line height in pixels. + */ + public ascent:number; + + /** + * The descent value of the text is the length from the baseline to the + * bottom depth of the line in pixels. + */ + public descent:number; + + /** + * The height value of the text of the selected lines (not necessarily the + * complete text) in pixels. The height of the text line does not include the + * gutter height. + */ + public height:number; + + /** + * The leading value is the measurement of the vertical distance between the + * lines of text. + */ + public leading:number; + + /** + * The width value is the width of the text of the selected lines (not + * necessarily the complete text) in pixels. The width of the text line is + * not the same as the width of the text field. The width of the text line is + * relative to the text field width, minus the gutter width of 4 pixels + * (2 pixels on each side). + */ + public width:number; + + /** + * The x value is the left position of the first character in pixels. This + * value includes the margin, indent (if any), and gutter widths. + */ + public x:number; + + /** + * Creates a TextLineMetrics object. The TextLineMetrics object contains + * information about the text metrics of a line of text in a text field. + * Objects of this class are returned by the + * away.entities.TextField.getLineMetrics() method. + * + * @param x The left position of the first character in pixels. + * @param width The width of the text of the selected lines (not + * necessarily the complete text) in pixels. + * @param height The height of the text of the selected lines (not + * necessarily the complete text) in pixels. + * @param ascent The length from the baseline to the top of the line + * height in pixels. + * @param descent The length from the baseline to the bottom depth of + * the line in pixels. + * @param leading The measurement of the vertical distance between the + * lines of text. + */ + constructor(x:number = NaN, width:number = NaN, height:number = NaN, ascent:number = NaN, descent:number = NaN, leading:number = NaN) + { + + } +} + +export = TextLineMetrics; \ No newline at end of file diff --git a/lib/core/traverse/CSSEntityCollector.js b/lib/core/traverse/CSSEntityCollector.js new file mode 100755 index 00000000..dc034033 --- /dev/null +++ b/lib/core/traverse/CSSEntityCollector.js @@ -0,0 +1,22 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** +* @class away.traverse.CSSEntityCollector +*/ +var CSSEntityCollector = (function (_super) { + __extends(CSSEntityCollector, _super); + function CSSEntityCollector() { + _super.call(this); + } + return CSSEntityCollector; +})(CollectorBase); + +module.exports = CSSEntityCollector; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdHJhdmVyc2UvQ1NTRW50aXR5Q29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbIkNTU0VudGl0eUNvbGxlY3RvciIsIkNTU0VudGl0eUNvbGxlY3Rvci5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMEVBQWlGOztBQUdqRjs7RUFFRztBQUNIO0lBQWlDQSxxQ0FBYUE7SUFFN0NBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBO0lBQ1JBLENBQUNBO0lBQ0ZELDBCQUFDQTtBQUFEQSxDQUFDQSxFQU5nQyxhQUFhLEVBTTdDOztBQUVELG1DQUE0QixDQUFBIiwiZmlsZSI6ImNvcmUvdHJhdmVyc2UvQ1NTRW50aXR5Q29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvbGxlY3RvckJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0NvbGxlY3RvckJhc2VcIik7XG5pbXBvcnQgSUNvbGxlY3Rvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9JQ29sbGVjdG9yXCIpO1xuXG4vKipcbiAqIEBjbGFzcyBhd2F5LnRyYXZlcnNlLkNTU0VudGl0eUNvbGxlY3RvclxuICovXG5jbGFzcyBDU1NFbnRpdHlDb2xsZWN0b3IgZXh0ZW5kcyBDb2xsZWN0b3JCYXNlIGltcGxlbWVudHMgSUNvbGxlY3Rvclxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXHR9XG59XG5cbmV4cG9ydCA9IENTU0VudGl0eUNvbGxlY3RvcjsiXX0= \ No newline at end of file diff --git a/lib/core/traverse/CSSEntityCollector.ts b/lib/core/traverse/CSSEntityCollector.ts new file mode 100644 index 00000000..09d553d4 --- /dev/null +++ b/lib/core/traverse/CSSEntityCollector.ts @@ -0,0 +1,15 @@ +import CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); + +/** + * @class away.traverse.CSSEntityCollector + */ +class CSSEntityCollector extends CollectorBase implements ICollector +{ + constructor() + { + super(); + } +} + +export = CSSEntityCollector; \ No newline at end of file diff --git a/lib/core/traverse/CollectorBase.js b/lib/core/traverse/CollectorBase.js new file mode 100755 index 00000000..5cbc109e --- /dev/null +++ b/lib/core/traverse/CollectorBase.js @@ -0,0 +1,154 @@ +var EntityListItemPool = require("awayjs-core/lib/core/pool/EntityListItemPool"); + +/** +* @class away.traverse.CollectorBase +*/ +var CollectorBase = (function () { + function CollectorBase() { + this._numCullPlanes = 0; + this._pNumEntities = 0; + this._pNumInteractiveEntities = 0; + this._pEntityListItemPool = new EntityListItemPool(); + } + Object.defineProperty(CollectorBase.prototype, "camera", { + /** + * + */ + get: function () { + return this._pCamera; + }, + set: function (value) { + this._pCamera = value; + this._cullPlanes = this._pCamera.frustumPlanes; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CollectorBase.prototype, "cullPlanes", { + /** + * + */ + get: function () { + return this._customCullPlanes; + }, + set: function (value) { + this._customCullPlanes = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(CollectorBase.prototype, "entityHead", { + /** + * + */ + get: function () { + return this._pEntityHead; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CollectorBase.prototype, "numEntities", { + /** + * + */ + get: function () { + return this._pNumEntities; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CollectorBase.prototype, "numInteractiveEntities", { + /** + * + */ + get: function () { + return this._pNumInteractiveEntities; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + CollectorBase.prototype.clear = function () { + this._pNumEntities = this._pNumInteractiveEntities = 0; + this._cullPlanes = this._customCullPlanes ? this._customCullPlanes : (this._pCamera ? this._pCamera.frustumPlanes : null); + this._numCullPlanes = this._cullPlanes ? this._cullPlanes.length : 0; + this._pEntityHead = null; + this._pEntityListItemPool.freeAll(); + }; + + /** + * + * @param node + * @returns {boolean} + */ + CollectorBase.prototype.enterNode = function (node) { + var enter = this.scene._iCollectionMark != node._iCollectionMark && node.isInFrustum(this._cullPlanes, this._numCullPlanes); + + node._iCollectionMark = this.scene._iCollectionMark; + + return enter; + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applyDirectionalLight = function (entity) { + //don't do anything here + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applyEntity = function (entity) { + this._pNumEntities++; + + if (entity._iIsMouseEnabled()) + this._pNumInteractiveEntities++; + + var item = this._pEntityListItemPool.getItem(); + item.entity = entity; + + item.next = this._pEntityHead; + this._pEntityHead = item; + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applyLightProbe = function (entity) { + //don't do anything here + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applyPointLight = function (entity) { + //don't do anything here + }; + + /** + * + * @param entity + */ + CollectorBase.prototype.applySkybox = function (entity) { + //don't do anything here + }; + return CollectorBase; +})(); + +module.exports = CollectorBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdHJhdmVyc2UvQ29sbGVjdG9yQmFzZS50cyJdLCJuYW1lcyI6WyJDb2xsZWN0b3JCYXNlIiwiQ29sbGVjdG9yQmFzZS5jb25zdHJ1Y3RvciIsIkNvbGxlY3RvckJhc2UuY2xlYXIiLCJDb2xsZWN0b3JCYXNlLmVudGVyTm9kZSIsIkNvbGxlY3RvckJhc2UuYXBwbHlEaXJlY3Rpb25hbExpZ2h0IiwiQ29sbGVjdG9yQmFzZS5hcHBseUVudGl0eSIsIkNvbGxlY3RvckJhc2UuYXBwbHlMaWdodFByb2JlIiwiQ29sbGVjdG9yQmFzZS5hcHBseVBvaW50TGlnaHQiLCJDb2xsZWN0b3JCYXNlLmFwcGx5U2t5Ym94Il0sIm1hcHBpbmdzIjoiQUFBQSxnRkFHc0Y7O0FBT3RGOztFQUVHO0FBQ0g7SUFhQ0E7UUFKQUMsS0FBUUEsY0FBY0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDbENBLEtBQU9BLGFBQWFBLEdBQVVBLENBQUNBLENBQUNBO1FBQ2hDQSxLQUFPQSx3QkFBd0JBLEdBQVVBLENBQUNBLENBQUNBO1FBSTFDQSxJQUFJQSxDQUFDQSxvQkFBb0JBLEdBQUdBLElBQUlBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0E7SUFDckRBLENBQUNBO0lBS0REO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxRQUFRQTtRQUNyQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBa0JBLEtBQVlBO1lBRTdCQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxLQUFLQTtZQUNyQkEsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsYUFBYUE7UUFDL0NBLENBQUNBOzs7O0FBTkFBOztJQVdEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQTtRQUM5QkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBc0JBLEtBQW9CQTtZQUV6Q0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxLQUFLQTtRQUMvQkEsQ0FBQ0E7Ozs7QUFMQUE7O0lBVURBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGFBQWFBO1FBQzFCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0Esd0JBQXdCQTtRQUNyQ0EsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7O01BREdBO29DQUNIQTtRQUVDRSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSx3QkFBd0JBLEdBQUdBLENBQUNBO1FBQ3REQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUVBLElBQUlBLENBQUNBLGlCQUFpQkEsR0FBR0EsQ0FBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBRUE7UUFDekhBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBLENBQUNBLFdBQVdBLEdBQUVBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBO1FBQ25FQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQTtRQUN4QkEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQTtJQUNwQ0EsQ0FBQ0E7O0lBT0RGOzs7O01BREdBO3dDQUNIQSxVQUFpQkEsSUFBYUE7UUFFN0JHLElBQUlBLEtBQUtBLEdBQVdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLGdCQUFnQkEsSUFBSUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxJQUFJQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQTs7UUFFbklBLElBQUlBLENBQUNBLGdCQUFnQkEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsZ0JBQWdCQTs7UUFFbkRBLE9BQU9BLEtBQUtBO0lBQ2JBLENBQUNBOztJQU1ESDs7O01BREdBO29EQUNIQSxVQUE2QkEsTUFBY0E7UUFFMUNJLHdCQUF3QkE7SUFDekJBLENBQUNBOztJQU1ESjs7O01BREdBOzBDQUNIQSxVQUFtQkEsTUFBY0E7UUFFaENLLElBQUlBLENBQUNBLGFBQWFBLEVBQUVBOztRQUVwQkEsSUFBSUEsTUFBTUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQTtZQUM1QkEsSUFBSUEsQ0FBQ0Esd0JBQXdCQSxFQUFFQSxDQUFDQTs7UUFFakNBLElBQUlBLElBQUlBLEdBQWtCQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO1FBQzdEQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxNQUFNQTs7UUFFcEJBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLFlBQVlBO1FBQzdCQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQTtJQUN6QkEsQ0FBQ0E7O0lBTURMOzs7TUFER0E7OENBQ0hBLFVBQXVCQSxNQUFjQTtRQUVwQ00sd0JBQXdCQTtJQUN6QkEsQ0FBQ0E7O0lBTUROOzs7TUFER0E7OENBQ0hBLFVBQXVCQSxNQUFjQTtRQUVwQ08sd0JBQXdCQTtJQUN6QkEsQ0FBQ0E7O0lBTURQOzs7TUFER0E7MENBQ0hBLFVBQW1CQSxNQUFjQTtRQUVoQ1Esd0JBQXdCQTtJQUN6QkEsQ0FBQ0E7SUFDRlIscUJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsOEJBQXVCLENBQUEiLCJmaWxlIjoiY29yZS90cmF2ZXJzZS9Db2xsZWN0b3JCYXNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNjZW5lXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRhaW5lcnMvU2NlbmVcIik7XG5pbXBvcnQgUGxhbmUzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUGxhbmUzRFwiKTtcbmltcG9ydCBFbnRpdHlMaXN0SXRlbVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcG9vbC9FbnRpdHlMaXN0SXRlbVwiKTtcbmltcG9ydCBFbnRpdHlMaXN0SXRlbVBvb2xcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0VudGl0eUxpc3RJdGVtUG9vbFwiKTtcbmltcG9ydCBOb2RlQmFzZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9Ob2RlQmFzZVwiKTtcbmltcG9ydCBJUmVuZGVyZXJcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcmVuZGVyL0lSZW5kZXJlclwiKTtcbmltcG9ydCBJQ29sbGVjdG9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RyYXZlcnNlL0lDb2xsZWN0b3JcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkudHJhdmVyc2UuQ29sbGVjdG9yQmFzZVxuICovXG5jbGFzcyBDb2xsZWN0b3JCYXNlIGltcGxlbWVudHMgSUNvbGxlY3Rvclxue1xuXHRwdWJsaWMgc2NlbmU6U2NlbmU7XG5cblx0cHVibGljIF9wRW50aXR5SGVhZDpFbnRpdHlMaXN0SXRlbTtcblx0cHVibGljIF9wRW50aXR5TGlzdEl0ZW1Qb29sOkVudGl0eUxpc3RJdGVtUG9vbDtcblx0cHVibGljIF9wQ2FtZXJhOkNhbWVyYTtcblx0cHJpdmF0ZSBfY3VzdG9tQ3VsbFBsYW5lczpBcnJheTxQbGFuZTNEPjtcblx0cHJpdmF0ZSBfY3VsbFBsYW5lczpBcnJheTxQbGFuZTNEPjtcblx0cHJpdmF0ZSBfbnVtQ3VsbFBsYW5lczpudW1iZXIgPSAwO1xuXHRwdWJsaWMgX3BOdW1FbnRpdGllczpudW1iZXIgPSAwO1xuXHRwdWJsaWMgX3BOdW1JbnRlcmFjdGl2ZUVudGl0aWVzOm51bWJlciA9IDA7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5fcEVudGl0eUxpc3RJdGVtUG9vbCA9IG5ldyBFbnRpdHlMaXN0SXRlbVBvb2woKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBjYW1lcmEoKTpDYW1lcmFcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wQ2FtZXJhO1xuXHR9XG5cblx0cHVibGljIHNldCBjYW1lcmEodmFsdWU6Q2FtZXJhKVxuXHR7XG5cdFx0dGhpcy5fcENhbWVyYSA9IHZhbHVlO1xuXHRcdHRoaXMuX2N1bGxQbGFuZXMgPSB0aGlzLl9wQ2FtZXJhLmZydXN0dW1QbGFuZXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgY3VsbFBsYW5lcygpOkFycmF5PFBsYW5lM0Q+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY3VzdG9tQ3VsbFBsYW5lcztcblx0fVxuXG5cdHB1YmxpYyBzZXQgY3VsbFBsYW5lcyh2YWx1ZTpBcnJheTxQbGFuZTNEPilcblx0e1xuXHRcdHRoaXMuX2N1c3RvbUN1bGxQbGFuZXMgPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBlbnRpdHlIZWFkKCk6RW50aXR5TGlzdEl0ZW1cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wRW50aXR5SGVhZDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBudW1FbnRpdGllcygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BOdW1FbnRpdGllcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBudW1JbnRlcmFjdGl2ZUVudGl0aWVzKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcE51bUludGVyYWN0aXZlRW50aXRpZXM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBjbGVhcigpXG5cdHtcblx0XHR0aGlzLl9wTnVtRW50aXRpZXMgPSB0aGlzLl9wTnVtSW50ZXJhY3RpdmVFbnRpdGllcyA9IDA7XG5cdFx0dGhpcy5fY3VsbFBsYW5lcyA9IHRoaXMuX2N1c3RvbUN1bGxQbGFuZXM/IHRoaXMuX2N1c3RvbUN1bGxQbGFuZXMgOiAoIHRoaXMuX3BDYW1lcmE/IHRoaXMuX3BDYW1lcmEuZnJ1c3R1bVBsYW5lcyA6IG51bGwgKTtcblx0XHR0aGlzLl9udW1DdWxsUGxhbmVzID0gdGhpcy5fY3VsbFBsYW5lcz8gdGhpcy5fY3VsbFBsYW5lcy5sZW5ndGggOiAwO1xuXHRcdHRoaXMuX3BFbnRpdHlIZWFkID0gbnVsbDtcblx0XHR0aGlzLl9wRW50aXR5TGlzdEl0ZW1Qb29sLmZyZWVBbGwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gbm9kZVxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdHB1YmxpYyBlbnRlck5vZGUobm9kZTpOb2RlQmFzZSk6Ym9vbGVhblxuXHR7XG5cdFx0dmFyIGVudGVyOmJvb2xlYW4gPSB0aGlzLnNjZW5lLl9pQ29sbGVjdGlvbk1hcmsgIT0gbm9kZS5faUNvbGxlY3Rpb25NYXJrICYmIG5vZGUuaXNJbkZydXN0dW0odGhpcy5fY3VsbFBsYW5lcywgdGhpcy5fbnVtQ3VsbFBsYW5lcyk7XG5cblx0XHRub2RlLl9pQ29sbGVjdGlvbk1hcmsgPSB0aGlzLnNjZW5lLl9pQ29sbGVjdGlvbk1hcms7XG5cblx0XHRyZXR1cm4gZW50ZXI7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVxuXHQgKi9cblx0cHVibGljIGFwcGx5RGlyZWN0aW9uYWxMaWdodChlbnRpdHk6SUVudGl0eSlcblx0e1xuXHRcdC8vZG9uJ3QgZG8gYW55dGhpbmcgaGVyZVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlcblx0ICovXG5cdHB1YmxpYyBhcHBseUVudGl0eShlbnRpdHk6SUVudGl0eSlcblx0e1xuXHRcdHRoaXMuX3BOdW1FbnRpdGllcysrO1xuXG5cdFx0aWYgKGVudGl0eS5faUlzTW91c2VFbmFibGVkKCkpXG5cdFx0XHR0aGlzLl9wTnVtSW50ZXJhY3RpdmVFbnRpdGllcysrO1xuXG5cdFx0dmFyIGl0ZW06RW50aXR5TGlzdEl0ZW0gPSB0aGlzLl9wRW50aXR5TGlzdEl0ZW1Qb29sLmdldEl0ZW0oKTtcblx0XHRpdGVtLmVudGl0eSA9IGVudGl0eTtcblxuXHRcdGl0ZW0ubmV4dCA9IHRoaXMuX3BFbnRpdHlIZWFkO1xuXHRcdHRoaXMuX3BFbnRpdHlIZWFkID0gaXRlbTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5XG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlMaWdodFByb2JlKGVudGl0eTpJRW50aXR5KVxuXHR7XG5cdFx0Ly9kb24ndCBkbyBhbnl0aGluZyBoZXJlXG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVxuXHQgKi9cblx0cHVibGljIGFwcGx5UG9pbnRMaWdodChlbnRpdHk6SUVudGl0eSlcblx0e1xuXHRcdC8vZG9uJ3QgZG8gYW55dGhpbmcgaGVyZVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlcblx0ICovXG5cdHB1YmxpYyBhcHBseVNreWJveChlbnRpdHk6SUVudGl0eSlcblx0e1xuXHRcdC8vZG9uJ3QgZG8gYW55dGhpbmcgaGVyZVxuXHR9XG59XG5cbmV4cG9ydCA9IENvbGxlY3RvckJhc2U7Il19 \ No newline at end of file diff --git a/lib/core/traverse/CollectorBase.ts b/lib/core/traverse/CollectorBase.ts new file mode 100644 index 00000000..17fe2796 --- /dev/null +++ b/lib/core/traverse/CollectorBase.ts @@ -0,0 +1,164 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import EntityListItem = require("awayjs-core/lib/core/pool/EntityListItem"); +import EntityListItemPool = require("awayjs-core/lib/core/pool/EntityListItemPool"); +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.traverse.CollectorBase + */ +class CollectorBase implements ICollector +{ + public scene:Scene; + + public _pEntityHead:EntityListItem; + public _pEntityListItemPool:EntityListItemPool; + public _pCamera:Camera; + private _customCullPlanes:Array; + private _cullPlanes:Array; + private _numCullPlanes:number = 0; + public _pNumEntities:number = 0; + public _pNumInteractiveEntities:number = 0; + + constructor() + { + this._pEntityListItemPool = new EntityListItemPool(); + } + + /** + * + */ + public get camera():Camera + { + return this._pCamera; + } + + public set camera(value:Camera) + { + this._pCamera = value; + this._cullPlanes = this._pCamera.frustumPlanes; + } + + /** + * + */ + public get cullPlanes():Array + { + return this._customCullPlanes; + } + + public set cullPlanes(value:Array) + { + this._customCullPlanes = value; + } + + /** + * + */ + public get entityHead():EntityListItem + { + return this._pEntityHead; + } + + /** + * + */ + public get numEntities():number + { + return this._pNumEntities; + } + + /** + * + */ + public get numInteractiveEntities():number + { + return this._pNumInteractiveEntities; + } + + /** + * + */ + public clear() + { + this._pNumEntities = this._pNumInteractiveEntities = 0; + this._cullPlanes = this._customCullPlanes? this._customCullPlanes : ( this._pCamera? this._pCamera.frustumPlanes : null ); + this._numCullPlanes = this._cullPlanes? this._cullPlanes.length : 0; + this._pEntityHead = null; + this._pEntityListItemPool.freeAll(); + } + + /** + * + * @param node + * @returns {boolean} + */ + public enterNode(node:NodeBase):boolean + { + var enter:boolean = this.scene._iCollectionMark != node._iCollectionMark && node.isInFrustum(this._cullPlanes, this._numCullPlanes); + + node._iCollectionMark = this.scene._iCollectionMark; + + return enter; + } + + /** + * + * @param entity + */ + public applyDirectionalLight(entity:IEntity) + { + //don't do anything here + } + + /** + * + * @param entity + */ + public applyEntity(entity:IEntity) + { + this._pNumEntities++; + + if (entity._iIsMouseEnabled()) + this._pNumInteractiveEntities++; + + var item:EntityListItem = this._pEntityListItemPool.getItem(); + item.entity = entity; + + item.next = this._pEntityHead; + this._pEntityHead = item; + } + + /** + * + * @param entity + */ + public applyLightProbe(entity:IEntity) + { + //don't do anything here + } + + /** + * + * @param entity + */ + public applyPointLight(entity:IEntity) + { + //don't do anything here + } + + /** + * + * @param entity + */ + public applySkybox(entity:IEntity) + { + //don't do anything here + } +} + +export = CollectorBase; \ No newline at end of file diff --git a/lib/core/traverse/EntityCollector.js b/lib/core/traverse/EntityCollector.js new file mode 100755 index 00000000..35c1ff6e --- /dev/null +++ b/lib/core/traverse/EntityCollector.js @@ -0,0 +1,138 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** +* @class away.traverse.EntityCollector +*/ +var EntityCollector = (function (_super) { + __extends(EntityCollector, _super); + function EntityCollector() { + _super.call(this); + this._pNumLights = 0; + this._numDirectionalLights = 0; + this._numPointLights = 0; + this._numLightProbes = 0; + + this._pLights = new Array(); + this._directionalLights = new Array(); + this._pointLights = new Array(); + this._lightProbes = new Array(); + } + Object.defineProperty(EntityCollector.prototype, "directionalLights", { + /** + * + */ + get: function () { + return this._directionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(EntityCollector.prototype, "lightProbes", { + /** + * + */ + get: function () { + return this._lightProbes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(EntityCollector.prototype, "lights", { + /** + * + */ + get: function () { + return this._pLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(EntityCollector.prototype, "pointLights", { + /** + * + */ + get: function () { + return this._pointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(EntityCollector.prototype, "skyBox", { + /** + * + */ + get: function () { + return this._pSkybox; + }, + enumerable: true, + configurable: true + }); + + /** + * + * @param entity + */ + EntityCollector.prototype.applyDirectionalLight = function (entity) { + this._directionalLights[this._numDirectionalLights++] = entity; + }; + + /** + * + * @param entity + */ + EntityCollector.prototype.applyLightProbe = function (entity) { + this._lightProbes[this._numLightProbes++] = entity; + }; + + /** + * + * @param entity + */ + EntityCollector.prototype.applyPointLight = function (entity) { + this._pointLights[this._numPointLights++] = entity; + }; + + /** + * + * @param entity + */ + EntityCollector.prototype.applySkybox = function (entity) { + this._pSkybox = entity; + }; + + /** + * + */ + EntityCollector.prototype.clear = function () { + _super.prototype.clear.call(this); + + this._pSkybox = null; + + if (this._pNumLights > 0) + this._pLights.length = this._pNumLights = 0; + + if (this._numDirectionalLights > 0) + this._directionalLights.length = this._numDirectionalLights = 0; + + if (this._numPointLights > 0) + this._pointLights.length = this._numPointLights = 0; + + if (this._numLightProbes > 0) + this._lightProbes.length = this._numLightProbes = 0; + }; + return EntityCollector; +})(CollectorBase); + +module.exports = EntityCollector; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdHJhdmVyc2UvRW50aXR5Q29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbIkVudGl0eUNvbGxlY3RvciIsIkVudGl0eUNvbGxlY3Rvci5jb25zdHJ1Y3RvciIsIkVudGl0eUNvbGxlY3Rvci5hcHBseURpcmVjdGlvbmFsTGlnaHQiLCJFbnRpdHlDb2xsZWN0b3IuYXBwbHlMaWdodFByb2JlIiwiRW50aXR5Q29sbGVjdG9yLmFwcGx5UG9pbnRMaWdodCIsIkVudGl0eUNvbGxlY3Rvci5hcHBseVNreWJveCIsIkVudGl0eUNvbGxlY3Rvci5jbGVhciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMEVBQ2lGOztBQU9qRjs7RUFFRztBQUNIO0lBQThCQSxrQ0FBYUE7SUFzRDFDQTtRQUVDQyxXQUFNQSxLQUFBQSxDQUFDQTtRQWhEUkEsS0FBT0EsV0FBV0EsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFFOUJBLEtBQVFBLHFCQUFxQkEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDekNBLEtBQVFBLGVBQWVBLEdBQVVBLENBQUNBLENBQUNBO1FBQ25DQSxLQUFRQSxlQUFlQSxHQUFVQSxDQUFDQSxDQUFDQTs7UUE4Q2xDQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFZQSxDQUFDQTtRQUN0Q0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFtQkEsQ0FBQ0E7UUFDdkRBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLElBQUlBLEtBQUtBLENBQWFBLENBQUNBO1FBQzNDQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFhQSxDQUFDQTtJQUM1Q0EsQ0FBQ0E7SUE3Q0REO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxrQkFBa0JBO1FBQy9CQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUE7UUFDekJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxRQUFRQTtRQUNyQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBO1FBQ3pCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBOzs7O0FBQUFBO0lBZ0JEQTs7O01BREdBO3NEQUNIQSxVQUE2QkEsTUFBY0E7UUFFMUNFLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBRUEsSUFBSUEsQ0FBQ0EscUJBQXFCQSxFQUFFQSxDQUFFQSxHQUFzQkEsTUFBTUE7SUFDcEZBLENBQUNBOztJQU1ERjs7O01BREdBO2dEQUNIQSxVQUF1QkEsTUFBY0E7UUFFcENHLElBQUlBLENBQUNBLFlBQVlBLENBQUVBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUVBLEdBQWdCQSxNQUFNQTtJQUNsRUEsQ0FBQ0E7O0lBTURIOzs7TUFER0E7Z0RBQ0hBLFVBQXVCQSxNQUFjQTtRQUVwQ0ksSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBRUEsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsQ0FBRUEsR0FBZ0JBLE1BQU1BO0lBQ2xFQSxDQUFDQTs7SUFNREo7OztNQURHQTs0Q0FDSEEsVUFBbUJBLE1BQWNBO1FBRWhDSyxJQUFJQSxDQUFDQSxRQUFRQSxHQUFZQSxNQUFNQTtJQUNoQ0EsQ0FBQ0E7O0lBS0RMOztNQURHQTtzQ0FDSEE7UUFFQ00sZ0JBQUtBLENBQUNBLEtBQUtBLEtBQUNBLEtBQUFBLENBQUNBOztRQUViQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQTs7UUFFcEJBLElBQUlBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLENBQUNBO1lBQ3ZCQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxDQUFDQSxDQUFDQTs7UUFFN0NBLElBQUlBLElBQUlBLENBQUNBLHFCQUFxQkEsR0FBR0EsQ0FBQ0E7WUFDakNBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EscUJBQXFCQSxHQUFHQSxDQUFDQSxDQUFDQTs7UUFFakVBLElBQUlBLElBQUlBLENBQUNBLGVBQWVBLEdBQUdBLENBQUNBO1lBQzNCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxDQUFDQSxDQUFDQTs7UUFFckRBLElBQUlBLElBQUlBLENBQUNBLGVBQWVBLEdBQUdBLENBQUNBO1lBQzNCQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxDQUFDQSxDQUFDQTtJQUN0REEsQ0FBQ0E7SUFDRk4sdUJBQUNBO0FBQURBLENBQUNBLEVBekg2QixhQUFhLEVBeUgxQzs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJjb3JlL3RyYXZlcnNlL0VudGl0eUNvbGxlY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMaWdodEJhc2VcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaWdodEJhc2VcIik7XG5pbXBvcnQgQ29sbGVjdG9yQmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvdHJhdmVyc2UvQ29sbGVjdG9yQmFzZVwiKTtcbmltcG9ydCBEaXJlY3Rpb25hbExpZ2h0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvRGlyZWN0aW9uYWxMaWdodFwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5pbXBvcnQgTGlnaHRQcm9iZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvTGlnaHRQcm9iZVwiKTtcbmltcG9ydCBQb2ludExpZ2h0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9Qb2ludExpZ2h0XCIpO1xuaW1wb3J0IFNreWJveFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9Ta3lib3hcIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkudHJhdmVyc2UuRW50aXR5Q29sbGVjdG9yXG4gKi9cbmNsYXNzIEVudGl0eUNvbGxlY3RvciBleHRlbmRzIENvbGxlY3RvckJhc2Vcbntcblx0cHVibGljIF9wU2t5Ym94OlNreWJveDtcblx0cHVibGljIF9wTGlnaHRzOkFycmF5PExpZ2h0QmFzZT47XG5cdHByaXZhdGUgX2RpcmVjdGlvbmFsTGlnaHRzOkFycmF5PERpcmVjdGlvbmFsTGlnaHQ+O1xuXHRwcml2YXRlIF9wb2ludExpZ2h0czpBcnJheTxQb2ludExpZ2h0Pjtcblx0cHJpdmF0ZSBfbGlnaHRQcm9iZXM6QXJyYXk8TGlnaHRQcm9iZT47XG5cblx0cHVibGljIF9wTnVtTGlnaHRzOm51bWJlciA9IDA7XG5cblx0cHJpdmF0ZSBfbnVtRGlyZWN0aW9uYWxMaWdodHM6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfbnVtUG9pbnRMaWdodHM6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfbnVtTGlnaHRQcm9iZXM6bnVtYmVyID0gMDtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgZGlyZWN0aW9uYWxMaWdodHMoKTpBcnJheTxEaXJlY3Rpb25hbExpZ2h0PlxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RpcmVjdGlvbmFsTGlnaHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGxpZ2h0UHJvYmVzKCk6QXJyYXk8TGlnaHRQcm9iZT5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9saWdodFByb2Jlcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBsaWdodHMoKTpBcnJheTxMaWdodEJhc2U+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcExpZ2h0cztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBwb2ludExpZ2h0cygpOkFycmF5PFBvaW50TGlnaHQ+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcG9pbnRMaWdodHM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgc2t5Qm94KCk6U2t5Ym94XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFNreWJveDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9wTGlnaHRzID0gbmV3IEFycmF5PExpZ2h0QmFzZT4oKTtcblx0XHR0aGlzLl9kaXJlY3Rpb25hbExpZ2h0cyA9IG5ldyBBcnJheTxEaXJlY3Rpb25hbExpZ2h0PigpO1xuXHRcdHRoaXMuX3BvaW50TGlnaHRzID0gbmV3IEFycmF5PFBvaW50TGlnaHQ+KCk7XG5cdFx0dGhpcy5fbGlnaHRQcm9iZXMgPSBuZXcgQXJyYXk8TGlnaHRQcm9iZT4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5XG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlEaXJlY3Rpb25hbExpZ2h0KGVudGl0eTpJRW50aXR5KVxuXHR7XG5cdFx0dGhpcy5fZGlyZWN0aW9uYWxMaWdodHNbIHRoaXMuX251bURpcmVjdGlvbmFsTGlnaHRzKysgXSA9IDxEaXJlY3Rpb25hbExpZ2h0PiBlbnRpdHk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVxuXHQgKi9cblx0cHVibGljIGFwcGx5TGlnaHRQcm9iZShlbnRpdHk6SUVudGl0eSlcblx0e1xuXHRcdHRoaXMuX2xpZ2h0UHJvYmVzWyB0aGlzLl9udW1MaWdodFByb2JlcysrIF0gPSA8TGlnaHRQcm9iZT4gZW50aXR5O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlcblx0ICovXG5cdHB1YmxpYyBhcHBseVBvaW50TGlnaHQoZW50aXR5OklFbnRpdHkpXG5cdHtcblx0XHR0aGlzLl9wb2ludExpZ2h0c1sgdGhpcy5fbnVtUG9pbnRMaWdodHMrKyBdID0gPFBvaW50TGlnaHQ+IGVudGl0eTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5XG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlTa3lib3goZW50aXR5OklFbnRpdHkpXG5cdHtcblx0XHR0aGlzLl9wU2t5Ym94ID0gPFNreWJveD4gZW50aXR5O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXIoKVxuXHR7XG5cdFx0c3VwZXIuY2xlYXIoKTtcblxuXHRcdHRoaXMuX3BTa3lib3ggPSBudWxsO1xuXG5cdFx0aWYgKHRoaXMuX3BOdW1MaWdodHMgPiAwKVxuXHRcdFx0dGhpcy5fcExpZ2h0cy5sZW5ndGggPSB0aGlzLl9wTnVtTGlnaHRzID0gMDtcblxuXHRcdGlmICh0aGlzLl9udW1EaXJlY3Rpb25hbExpZ2h0cyA+IDApXG5cdFx0XHR0aGlzLl9kaXJlY3Rpb25hbExpZ2h0cy5sZW5ndGggPSB0aGlzLl9udW1EaXJlY3Rpb25hbExpZ2h0cyA9IDA7XG5cblx0XHRpZiAodGhpcy5fbnVtUG9pbnRMaWdodHMgPiAwKVxuXHRcdFx0dGhpcy5fcG9pbnRMaWdodHMubGVuZ3RoID0gdGhpcy5fbnVtUG9pbnRMaWdodHMgPSAwO1xuXG5cdFx0aWYgKHRoaXMuX251bUxpZ2h0UHJvYmVzID4gMClcblx0XHRcdHRoaXMuX2xpZ2h0UHJvYmVzLmxlbmd0aCA9IHRoaXMuX251bUxpZ2h0UHJvYmVzID0gMDtcblx0fVxufVxuXG5leHBvcnQgPSBFbnRpdHlDb2xsZWN0b3I7Il19 \ No newline at end of file diff --git a/lib/core/traverse/EntityCollector.ts b/lib/core/traverse/EntityCollector.ts new file mode 100644 index 00000000..587b4eea --- /dev/null +++ b/lib/core/traverse/EntityCollector.ts @@ -0,0 +1,135 @@ +import LightBase = require("awayjs-core/lib/core/base/LightBase"); +import CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); +import DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import LightProbe = require("awayjs-core/lib/entities/LightProbe"); +import PointLight = require("awayjs-core/lib/entities/PointLight"); +import Skybox = require("awayjs-core/lib/entities/Skybox"); + +/** + * @class away.traverse.EntityCollector + */ +class EntityCollector extends CollectorBase +{ + public _pSkybox:Skybox; + public _pLights:Array; + private _directionalLights:Array; + private _pointLights:Array; + private _lightProbes:Array; + + public _pNumLights:number = 0; + + private _numDirectionalLights:number = 0; + private _numPointLights:number = 0; + private _numLightProbes:number = 0; + + /** + * + */ + public get directionalLights():Array + { + return this._directionalLights; + } + + /** + * + */ + public get lightProbes():Array + { + return this._lightProbes; + } + + /** + * + */ + public get lights():Array + { + return this._pLights; + } + + /** + * + */ + public get pointLights():Array + { + return this._pointLights; + } + + /** + * + */ + public get skyBox():Skybox + { + return this._pSkybox; + } + + constructor() + { + super(); + + this._pLights = new Array(); + this._directionalLights = new Array(); + this._pointLights = new Array(); + this._lightProbes = new Array(); + } + + /** + * + * @param entity + */ + public applyDirectionalLight(entity:IEntity) + { + this._directionalLights[ this._numDirectionalLights++ ] = entity; + } + + /** + * + * @param entity + */ + public applyLightProbe(entity:IEntity) + { + this._lightProbes[ this._numLightProbes++ ] = entity; + } + + /** + * + * @param entity + */ + public applyPointLight(entity:IEntity) + { + this._pointLights[ this._numPointLights++ ] = entity; + } + + /** + * + * @param entity + */ + public applySkybox(entity:IEntity) + { + this._pSkybox = entity; + } + + /** + * + */ + public clear() + { + super.clear(); + + this._pSkybox = null; + + if (this._pNumLights > 0) + this._pLights.length = this._pNumLights = 0; + + if (this._numDirectionalLights > 0) + this._directionalLights.length = this._numDirectionalLights = 0; + + if (this._numPointLights > 0) + this._pointLights.length = this._numPointLights = 0; + + if (this._numLightProbes > 0) + this._lightProbes.length = this._numLightProbes = 0; + } +} + +export = EntityCollector; \ No newline at end of file diff --git a/lib/core/traverse/ICollector.js b/lib/core/traverse/ICollector.js new file mode 100755 index 00000000..ea9b6ff2 --- /dev/null +++ b/lib/core/traverse/ICollector.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdHJhdmVyc2UvSUNvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQStFb0IiLCJmaWxlIjoiY29yZS90cmF2ZXJzZS9JQ29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNjZW5lXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRhaW5lcnMvU2NlbmVcIik7XG5pbXBvcnQgTm9kZUJhc2VcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vTm9kZUJhc2VcIik7XG5pbXBvcnQgRGlyZWN0aW9uYWxMaWdodFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0RpcmVjdGlvbmFsTGlnaHRcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkudHJhdmVyc2UuSUNvbGxlY3RvclxuICovXG5pbnRlcmZhY2UgSUNvbGxlY3Rvclxue1xuXHQvKipcblx0ICpcblx0ICovXG5cdGNhbWVyYTpDYW1lcmE7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRzY2VuZTpTY2VuZTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdG51bUVudGl0aWVzOm51bWJlcjtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdG51bUludGVyYWN0aXZlRW50aXRpZXM6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y2xlYXIoKTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdGVudGl0eUhlYWQ7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBub2RlXG5cdCAqL1xuXHRlbnRlck5vZGUobm9kZTpOb2RlQmFzZSk6Ym9vbGVhbjtcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVxuXHQgKi9cblx0YXBwbHlEaXJlY3Rpb25hbExpZ2h0KGVudGl0eTpJRW50aXR5KTtcblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIGVudGl0eVxuXHQgKi9cblx0YXBwbHlFbnRpdHkoZW50aXR5OklFbnRpdHkpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5XG5cdCAqL1xuXHRhcHBseUxpZ2h0UHJvYmUoZW50aXR5OklFbnRpdHkpO1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZW50aXR5XG5cdCAqL1xuXHRhcHBseVBvaW50TGlnaHQoZW50aXR5OklFbnRpdHkpO1xuXG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBlbnRpdHlcblx0ICovXG5cdGFwcGx5U2t5Ym94KGVudGl0eTpJRW50aXR5KTtcbn1cblxuZXhwb3J0ID0gSUNvbGxlY3RvcjsiXX0= \ No newline at end of file diff --git a/lib/core/traverse/ICollector.ts b/lib/core/traverse/ICollector.ts new file mode 100644 index 00000000..b63b1468 --- /dev/null +++ b/lib/core/traverse/ICollector.ts @@ -0,0 +1,80 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * @class away.traverse.ICollector + */ +interface ICollector +{ + /** + * + */ + camera:Camera; + + /** + * + */ + scene:Scene; + + /** + * + */ + numEntities:number; + + /** + * + */ + numInteractiveEntities:number; + + /** + * + */ + clear(); + + /** + * + */ + entityHead; + + /** + * + * @param node + */ + enterNode(node:NodeBase):boolean; + + /** + * + * @param entity + */ + applyDirectionalLight(entity:IEntity); + + /** + * + * @param entity + */ + applyEntity(entity:IEntity); + + /** + * + * @param entity + */ + applyLightProbe(entity:IEntity); + + /** + * + * @param entity + */ + applyPointLight(entity:IEntity); + + + /** + * + * @param entity + */ + applySkybox(entity:IEntity); +} + +export = ICollector; \ No newline at end of file diff --git a/lib/core/traverse/RaycastCollector.js b/lib/core/traverse/RaycastCollector.js new file mode 100755 index 00000000..007d0695 --- /dev/null +++ b/lib/core/traverse/RaycastCollector.js @@ -0,0 +1,74 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** +* The RaycastCollector class is a traverser for scene partitions that collects all scene graph entities that are +* considered intersecting with the defined ray. +* +* @see away.partition.Partition +* @see away.entities.IEntity +* +* @class away.traverse.RaycastCollector +*/ +var RaycastCollector = (function (_super) { + __extends(RaycastCollector, _super); + /** + * Creates a new RaycastCollector object. + */ + function RaycastCollector() { + _super.call(this); + this._rayPosition = new Vector3D(); + this._rayDirection = new Vector3D(); + this._iCollectionMark = 0; + } + Object.defineProperty(RaycastCollector.prototype, "rayPosition", { + /** + * Provides the starting position of the ray. + */ + get: function () { + return this._rayPosition; + }, + set: function (value) { + this._rayPosition = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(RaycastCollector.prototype, "rayDirection", { + /** + * Provides the direction vector of the ray. + */ + get: function () { + return this._rayDirection; + }, + set: function (value) { + this._rayDirection = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * Returns true if the current node is at least partly in the frustum. If so, the partition node knows to pass on the traverser to its children. + * + * @param node The Partition3DNode object to frustum-test. + */ + RaycastCollector.prototype.enterNode = function (node) { + return node.isIntersectingRay(this._rayPosition, this._rayDirection); + }; + return RaycastCollector; +})(CollectorBase); + +module.exports = RaycastCollector; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdHJhdmVyc2UvUmF5Y2FzdENvbGxlY3Rvci50cyJdLCJuYW1lcyI6WyJSYXljYXN0Q29sbGVjdG9yIiwiUmF5Y2FzdENvbGxlY3Rvci5jb25zdHJ1Y3RvciIsIlJheWNhc3RDb2xsZWN0b3IuZW50ZXJOb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0REFBcUU7O0FBRXJFLDBFQUFpRjs7QUFJakY7Ozs7Ozs7O0VBUUc7QUFDSDtJQUErQkEsbUNBQWFBO0lBb0MzQ0E7O01BREdBO0lBQ0hBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBO1FBcENSQSxLQUFRQSxZQUFZQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUMvQ0EsS0FBUUEsYUFBYUEsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFFaERBLEtBQU9BLGdCQUFnQkEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7SUFrQ25DQSxDQUFDQTtJQTdCREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBO1FBQ3pCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF1QkEsS0FBY0E7WUFFcENBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLEtBQUtBO1FBQzFCQSxDQUFDQTs7OztBQUxBQTs7SUFVREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGFBQWFBO1FBQzFCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF3QkEsS0FBY0E7WUFFckNBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLEtBQUtBO1FBQzNCQSxDQUFDQTs7OztBQUxBQTs7SUFvQkRBOzs7O01BREdBOzJDQUNIQSxVQUFpQkEsSUFBYUE7UUFFN0JFLE9BQU9BLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsRUFBRUEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0E7SUFDckVBLENBQUNBO0lBQ0ZGLHdCQUFDQTtBQUFEQSxDQUFDQSxFQWxEOEIsYUFBYSxFQWtEM0M7O0FBRUQsaUNBQTBCLENBQUEiLCJmaWxlIjoiY29yZS90cmF2ZXJzZS9SYXljYXN0Q29sbGVjdG9yLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBOb2RlQmFzZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9Ob2RlQmFzZVwiKTtcbmltcG9ydCBDb2xsZWN0b3JCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9Db2xsZWN0b3JCYXNlXCIpO1xuaW1wb3J0IENhbWVyYVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9DYW1lcmFcIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9JRW50aXR5XCIpO1xuXG4vKipcbiAqIFRoZSBSYXljYXN0Q29sbGVjdG9yIGNsYXNzIGlzIGEgdHJhdmVyc2VyIGZvciBzY2VuZSBwYXJ0aXRpb25zIHRoYXQgY29sbGVjdHMgYWxsIHNjZW5lIGdyYXBoIGVudGl0aWVzIHRoYXQgYXJlXG4gKiBjb25zaWRlcmVkIGludGVyc2VjdGluZyB3aXRoIHRoZSBkZWZpbmVkIHJheS5cbiAqXG4gKiBAc2VlIGF3YXkucGFydGl0aW9uLlBhcnRpdGlvblxuICogQHNlZSBhd2F5LmVudGl0aWVzLklFbnRpdHlcbiAqXG4gKiBAY2xhc3MgYXdheS50cmF2ZXJzZS5SYXljYXN0Q29sbGVjdG9yXG4gKi9cbmNsYXNzIFJheWNhc3RDb2xsZWN0b3IgZXh0ZW5kcyBDb2xsZWN0b3JCYXNlXG57XG5cdHByaXZhdGUgX3JheVBvc2l0aW9uOlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCk7XG5cdHByaXZhdGUgX3JheURpcmVjdGlvbjpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdHB1YmxpYyBfaUNvbGxlY3Rpb25NYXJrOm51bWJlciA9IDA7XG5cblx0LyoqXG5cdCAqIFByb3ZpZGVzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcmF5LlxuXHQgKi9cblx0cHVibGljIGdldCByYXlQb3NpdGlvbigpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcmF5UG9zaXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2V0IHJheVBvc2l0aW9uKHZhbHVlOlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy5fcmF5UG9zaXRpb24gPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBQcm92aWRlcyB0aGUgZGlyZWN0aW9uIHZlY3RvciBvZiB0aGUgcmF5LlxuXHQgKi9cblx0cHVibGljIGdldCByYXlEaXJlY3Rpb24oKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3JheURpcmVjdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcmF5RGlyZWN0aW9uKHZhbHVlOlZlY3RvcjNEKVxuXHR7XG5cdFx0dGhpcy5fcmF5RGlyZWN0aW9uID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBSYXljYXN0Q29sbGVjdG9yIG9iamVjdC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgYXQgbGVhc3QgcGFydGx5IGluIHRoZSBmcnVzdHVtLiBJZiBzbywgdGhlIHBhcnRpdGlvbiBub2RlIGtub3dzIHRvIHBhc3Mgb24gdGhlIHRyYXZlcnNlciB0byBpdHMgY2hpbGRyZW4uXG5cdCAqXG5cdCAqIEBwYXJhbSBub2RlIFRoZSBQYXJ0aXRpb24zRE5vZGUgb2JqZWN0IHRvIGZydXN0dW0tdGVzdC5cblx0ICovXG5cdHB1YmxpYyBlbnRlck5vZGUobm9kZTpOb2RlQmFzZSk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIG5vZGUuaXNJbnRlcnNlY3RpbmdSYXkodGhpcy5fcmF5UG9zaXRpb24sIHRoaXMuX3JheURpcmVjdGlvbik7XG5cdH1cbn1cblxuZXhwb3J0ID0gUmF5Y2FzdENvbGxlY3RvcjsiXX0= \ No newline at end of file diff --git a/lib/core/traverse/RaycastCollector.ts b/lib/core/traverse/RaycastCollector.ts new file mode 100644 index 00000000..9045e2fd --- /dev/null +++ b/lib/core/traverse/RaycastCollector.ts @@ -0,0 +1,68 @@ +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); + +/** + * The RaycastCollector class is a traverser for scene partitions that collects all scene graph entities that are + * considered intersecting with the defined ray. + * + * @see away.partition.Partition + * @see away.entities.IEntity + * + * @class away.traverse.RaycastCollector + */ +class RaycastCollector extends CollectorBase +{ + private _rayPosition:Vector3D = new Vector3D(); + private _rayDirection:Vector3D = new Vector3D(); + + public _iCollectionMark:number = 0; + + /** + * Provides the starting position of the ray. + */ + public get rayPosition():Vector3D + { + return this._rayPosition; + } + + public set rayPosition(value:Vector3D) + { + this._rayPosition = value; + } + + /** + * Provides the direction vector of the ray. + */ + public get rayDirection():Vector3D + { + return this._rayDirection; + } + + public set rayDirection(value:Vector3D) + { + this._rayDirection = value; + } + + /** + * Creates a new RaycastCollector object. + */ + constructor() + { + super(); + } + + /** + * Returns true if the current node is at least partly in the frustum. If so, the partition node knows to pass on the traverser to its children. + * + * @param node The Partition3DNode object to frustum-test. + */ + public enterNode(node:NodeBase):boolean + { + return node.isIntersectingRay(this._rayPosition, this._rayDirection); + } +} + +export = RaycastCollector; \ No newline at end of file diff --git a/lib/core/traverse/ShadowCasterCollector.js b/lib/core/traverse/ShadowCasterCollector.js new file mode 100755 index 00000000..c18a4054 --- /dev/null +++ b/lib/core/traverse/ShadowCasterCollector.js @@ -0,0 +1,36 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** +* @class away.traverse.ShadowCasterCollector +*/ +var ShadowCasterCollector = (function (_super) { + __extends(ShadowCasterCollector, _super); + function ShadowCasterCollector() { + _super.call(this); + } + /** + * + */ + ShadowCasterCollector.prototype.enterNode = function (node) { + var enter = this.scene._iCollectionMark != node._iCollectionMark && node.isCastingShadow(); + + if (!enter) { + node._iCollectionMark = this.scene._iCollectionMark; + + return false; + } + + return _super.prototype.enterNode.call(this, node); + }; + return ShadowCasterCollector; +})(CollectorBase); + +module.exports = ShadowCasterCollector; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdHJhdmVyc2UvU2hhZG93Q2FzdGVyQ29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbIlNoYWRvd0Nhc3RlckNvbGxlY3RvciIsIlNoYWRvd0Nhc3RlckNvbGxlY3Rvci5jb25zdHJ1Y3RvciIsIlNoYWRvd0Nhc3RlckNvbGxlY3Rvci5lbnRlck5vZGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDBFQUNpRjs7QUFFakY7O0VBRUc7QUFDSDtJQUFvQ0Esd0NBQWFBO0lBRWhEQTtRQUVDQyxXQUFNQSxLQUFBQSxDQUFDQTtJQUNSQSxDQUFDQTtJQUtERDs7TUFER0E7Z0RBQ0hBLFVBQWlCQSxJQUFhQTtRQUU3QkUsSUFBSUEsS0FBS0EsR0FBV0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsZ0JBQWdCQSxJQUFJQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLElBQUlBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBOztRQUVsR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBRUE7WUFDWEEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxnQkFBZ0JBOztZQUVuREEsT0FBT0EsS0FBS0E7U0FDWkE7O1FBRURBLE9BQU9BLGdCQUFLQSxDQUFDQSxTQUFTQSxLQUFDQSxPQUFBQSxJQUFJQSxDQUFDQTtJQUM3QkEsQ0FBQ0E7SUFDRkYsNkJBQUNBO0FBQURBLENBQUNBLEVBdEJtQyxhQUFhLEVBc0JoRDs7QUFFRCxzQ0FBK0IsQ0FBQSIsImZpbGUiOiJjb3JlL3RyYXZlcnNlL1NoYWRvd0Nhc3RlckNvbGxlY3Rvci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBOb2RlQmFzZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9Ob2RlQmFzZVwiKTtcbmltcG9ydCBDb2xsZWN0b3JCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9Db2xsZWN0b3JCYXNlXCIpO1xuXG4vKipcbiAqIEBjbGFzcyBhd2F5LnRyYXZlcnNlLlNoYWRvd0Nhc3RlckNvbGxlY3RvclxuICovXG5jbGFzcyBTaGFkb3dDYXN0ZXJDb2xsZWN0b3IgZXh0ZW5kcyBDb2xsZWN0b3JCYXNlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBlbnRlck5vZGUobm9kZTpOb2RlQmFzZSk6Ym9vbGVhblxuXHR7XG5cdFx0dmFyIGVudGVyOmJvb2xlYW4gPSB0aGlzLnNjZW5lLl9pQ29sbGVjdGlvbk1hcmsgIT0gbm9kZS5faUNvbGxlY3Rpb25NYXJrICYmIG5vZGUuaXNDYXN0aW5nU2hhZG93KCk7XG5cblx0XHRpZiAoIWVudGVyKSB7XG5cdFx0XHRub2RlLl9pQ29sbGVjdGlvbk1hcmsgPSB0aGlzLnNjZW5lLl9pQ29sbGVjdGlvbk1hcms7XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3VwZXIuZW50ZXJOb2RlKG5vZGUpO1xuXHR9XG59XG5cbmV4cG9ydCA9IFNoYWRvd0Nhc3RlckNvbGxlY3RvcjsiXX0= \ No newline at end of file diff --git a/lib/core/traverse/ShadowCasterCollector.ts b/lib/core/traverse/ShadowCasterCollector.ts new file mode 100644 index 00000000..6cb61ddb --- /dev/null +++ b/lib/core/traverse/ShadowCasterCollector.ts @@ -0,0 +1,31 @@ +import NodeBase = require("awayjs-core/lib/core/partition/NodeBase"); +import CollectorBase = require("awayjs-core/lib/core/traverse/CollectorBase"); + +/** + * @class away.traverse.ShadowCasterCollector + */ +class ShadowCasterCollector extends CollectorBase +{ + constructor() + { + super(); + } + + /** + * + */ + public enterNode(node:NodeBase):boolean + { + var enter:boolean = this.scene._iCollectionMark != node._iCollectionMark && node.isCastingShadow(); + + if (!enter) { + node._iCollectionMark = this.scene._iCollectionMark; + + return false; + } + + return super.enterNode(node); + } +} + +export = ShadowCasterCollector; \ No newline at end of file diff --git a/lib/core/ui/Keyboard.js b/lib/core/ui/Keyboard.js new file mode 100755 index 00000000..1286bf57 --- /dev/null +++ b/lib/core/ui/Keyboard.js @@ -0,0 +1,414 @@ +var Keyboard = (function () { + function Keyboard() { + } + Keyboard.A = 65; + + Keyboard.ALTERNATE = 18; + + Keyboard.AUDIO = 0x01000017; + + Keyboard.B = 66; + + Keyboard.BACK = 0x01000016; + + Keyboard.BACKQUOTE = 192; + + Keyboard.BACKSLASH = 220; + + Keyboard.BACKSPACE = 8; + + Keyboard.BLUE = 0x01000003; + + Keyboard.C = 67; + + Keyboard.CAPS_LOCK = 20; + + Keyboard.CHANNEL_DOWN = 0x01000005; + + Keyboard.CHANNEL_UP = 0x01000005; + + Keyboard.COMMA = 188; + + Keyboard.COMMAND = 15; + + Keyboard.CONTROL = 17; + + Keyboard.D = 68; + + Keyboard.DELETE = 46; + + Keyboard.DOWN = 40; + + Keyboard.DVR = 0x01000019; + + Keyboard.E = 69; + + Keyboard.END = 35; + + Keyboard.ENTER = 13; + + Keyboard.EQUAL = 187; + + Keyboard.ESCAPE = 27; + + Keyboard.EXIT = 0x01000015; + + Keyboard.F = 70; + + Keyboard.F1 = 112; + + Keyboard.F10 = 121; + + Keyboard.F11 = 122; + + Keyboard.F12 = 123; + + Keyboard.F13 = 124; + + Keyboard.F14 = 125; + + Keyboard.F15 = 126; + + Keyboard.F2 = 113; + + Keyboard.F3 = 114; + + Keyboard.F4 = 115; + + Keyboard.F5 = 116; + + Keyboard.F6 = 117; + + Keyboard.F7 = 118; + + Keyboard.F8 = 119; + + Keyboard.F9 = 120; + + Keyboard.FAST_FORWARD = 0x0100000A; + + Keyboard.G = 71; + + Keyboard.GREEN = 0x01000001; + + Keyboard.GUIDE = 0x01000014; + + Keyboard.H = 72; + + Keyboard.HELP = 0x0100001D; + + Keyboard.HOME = 36; + + Keyboard.I = 73; + + Keyboard.INFO = 0x01000013; + + Keyboard.INPUT = 0x0100001B; + + Keyboard.INSERT = 45; + + Keyboard.J = 74; + + Keyboard.K = 75; + + Keyboard.KEYNAME_BEGIN = "Begin"; + + Keyboard.KEYNAME_BREAK = "Break"; + + Keyboard.KEYNAME_CLEARDISPLAY = "ClrDsp"; + + Keyboard.KEYNAME_CLEARLINE = "ClrLn"; + + Keyboard.KEYNAME_DELETE = "Delete"; + + Keyboard.KEYNAME_DELETECHAR = "DelChr"; + + Keyboard.KEYNAME_DELETELINE = "DelLn"; + + Keyboard.KEYNAME_DOWNARROW = "Down"; + + Keyboard.KEYNAME_END = "End"; + + Keyboard.KEYNAME_EXECUTE = "Exec"; + + Keyboard.KEYNAME_F1 = "F1"; + + Keyboard.KEYNAME_F10 = "F10"; + + Keyboard.KEYNAME_F11 = "F11"; + + Keyboard.KEYNAME_F12 = "F12"; + + Keyboard.KEYNAME_F13 = "F13"; + + Keyboard.KEYNAME_F14 = "F14"; + + Keyboard.KEYNAME_F15 = "F15"; + + Keyboard.KEYNAME_F16 = "F16"; + + Keyboard.KEYNAME_F17 = "F17"; + + Keyboard.KEYNAME_F18 = "F18"; + + Keyboard.KEYNAME_F19 = "F19"; + + Keyboard.KEYNAME_F2 = "F2"; + + Keyboard.KEYNAME_F20 = "F20"; + + Keyboard.KEYNAME_F21 = "F21"; + + Keyboard.KEYNAME_F22 = "F22"; + + Keyboard.KEYNAME_F23 = "F23"; + + Keyboard.KEYNAME_F24 = "F24"; + + Keyboard.KEYNAME_F25 = "F25"; + + Keyboard.KEYNAME_F26 = "F26"; + + Keyboard.KEYNAME_F27 = "F27"; + + Keyboard.KEYNAME_F28 = "F28"; + + Keyboard.KEYNAME_F29 = "F29"; + + Keyboard.KEYNAME_F3 = "F3"; + + Keyboard.KEYNAME_F30 = "F30"; + + Keyboard.KEYNAME_F31 = "F31"; + + Keyboard.KEYNAME_F32 = "F32"; + + Keyboard.KEYNAME_F33 = "F33"; + + Keyboard.KEYNAME_F34 = "F34"; + + Keyboard.KEYNAME_F35 = "F35"; + + Keyboard.KEYNAME_F4 = "F4"; + + Keyboard.KEYNAME_F5 = "F5"; + + Keyboard.KEYNAME_F6 = "F6"; + + Keyboard.KEYNAME_F7 = "F7"; + + Keyboard.KEYNAME_F8 = "F8"; + + Keyboard.KEYNAME_F9 = "F9"; + + Keyboard.KEYNAME_FIND = "Find"; + + Keyboard.KEYNAME_HELP = "Help"; + + Keyboard.KEYNAME_HOME = "Home"; + + Keyboard.KEYNAME_INSERT = "Insert"; + + Keyboard.KEYNAME_INSERTCHAR = "InsChr"; + + Keyboard.KEYNAME_INSERTLINE = "LnsLn"; + + Keyboard.KEYNAME_LEFTARROW = "Left"; + + Keyboard.KEYNAME_MENU = "Menu"; + + Keyboard.KEYNAME_MODESWITCH = "ModeSw"; + + Keyboard.KEYNAME_NEXT = "Next"; + + Keyboard.KEYNAME_PAGEDOWN = "PgDn"; + + Keyboard.KEYNAME_PAGEUP = "PgUp"; + + Keyboard.KEYNAME_PAUSE = "Pause"; + + Keyboard.KEYNAME_PREV = "Prev"; + + Keyboard.KEYNAME_PRINT = "Print"; + + Keyboard.KEYNAME_PRINTSCREEN = "PrntScrn"; + + Keyboard.KEYNAME_REDO = "Redo"; + + Keyboard.KEYNAME_RESET = "Reset"; + + Keyboard.KEYNAME_RIGHTARROW = "Right"; + + Keyboard.KEYNAME_SCROLLLOCK = "ScrlLck"; + + Keyboard.KEYNAME_SELECT = "Select"; + + Keyboard.KEYNAME_STOP = "Stop"; + + Keyboard.KEYNAME_SYSREQ = "SysReq"; + + Keyboard.KEYNAME_SYSTEM = "Sys"; + + Keyboard.KEYNAME_UNDO = "Undo"; + + Keyboard.KEYNAME_UPARROW = "Up"; + + Keyboard.KEYNAME_USER = "User"; + + Keyboard.L = 76; + + Keyboard.LAST = 0x01000011; + + Keyboard.LEFT = 37; + + Keyboard.LEFTBRACKET = 219; + + Keyboard.LIVE = 0x01000010; + + Keyboard.M = 77; + + Keyboard.MASTER_SHELL = 0x0100001E; + + Keyboard.MENU = 0x01000012; + + Keyboard.MINUS = 189; + + Keyboard.N = 78; + + Keyboard.NEXT = 0x0100000E; + + Keyboard.NUMBER_0 = 48; + + Keyboard.NUMBER_1 = 49; + + Keyboard.NUMBER_2 = 50; + + Keyboard.NUMBER_3 = 51; + + Keyboard.NUMBER_4 = 52; + + Keyboard.NUMBER_5 = 53; + + Keyboard.NUMBER_6 = 54; + + Keyboard.NUMBER_7 = 55; + + Keyboard.NUMBER_8 = 56; + + Keyboard.NUMBER_9 = 57; + + Keyboard.NUMPAD = 21; + + Keyboard.NUMPAD_0 = 96; + + Keyboard.NUMPAD_1 = 97; + + Keyboard.NUMPAD_2 = 98; + + Keyboard.NUMPAD_3 = 99; + + Keyboard.NUMPAD_4 = 100; + + Keyboard.NUMPAD_5 = 101; + + Keyboard.NUMPAD_6 = 102; + + Keyboard.NUMPAD_7 = 103; + + Keyboard.NUMPAD_8 = 104; + + Keyboard.NUMPAD_9 = 105; + + Keyboard.NUMPAD_ADD = 107; + + Keyboard.NUMPAD_DECIMAL = 110; + + Keyboard.NUMPAD_DIVIDE = 111; + + Keyboard.NUMPAD_ENTER = 108; + + Keyboard.NUMPAD_MULTIPLY = 106; + + Keyboard.NUMPAD_SUBTRACT = 109; + + Keyboard.O = 79; + + Keyboard.P = 80; + + Keyboard.PAGE_DOWN = 34; + + Keyboard.PAGE_UP = 33; + + Keyboard.PAUSE = 0x01000008; + + Keyboard.PERIOD = 190; + + Keyboard.PLAY = 0x01000007; + + Keyboard.PREVIOUS = 0x0100000F; + + Keyboard.Q = 81; + + Keyboard.QUOTE = 222; + + Keyboard.R = 82; + + Keyboard.RECORD = 0x01000006; + + Keyboard.RED = 0x01000000; + + Keyboard.REWIND = 0x0100000B; + + Keyboard.RIGHT = 39; + + Keyboard.RIGHTBRACKET = 221; + + Keyboard.S = 83; + + Keyboard.SEARCH = 0x0100001F; + + Keyboard.SEMICOLON = 186; + + Keyboard.SETUP = 0x0100001C; + + Keyboard.SHIFT = 16; + + Keyboard.SKIP_BACKWARD = 0x0100000D; + + Keyboard.SKIP_FORWARD = 0x0100000C; + + Keyboard.SLASH = 191; + + Keyboard.SPACE = 32; + + Keyboard.STOP = 0x01000009; + + Keyboard.SUBTITLE = 0x01000018; + + Keyboard.T = 84; + + Keyboard.TAB = 9; + + Keyboard.U = 85; + + Keyboard.UP = 38; + + Keyboard.V = 86; + + Keyboard.VOD = 0x0100001A; + + Keyboard.W = 87; + + Keyboard.X = 88; + + Keyboard.Y = 89; + + Keyboard.YELLOW = 0x01000002; + + Keyboard.Z = 90; + return Keyboard; +})(); + +module.exports = Keyboard; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvcmUvdWkvS2V5Ym9hcmQudHMiXSwibmFtZXMiOlsiS2V5Ym9hcmQiLCJLZXlib2FyZC5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQUE7SUFBQUE7SUErL0JBQyxDQUFDQTtBQUFBRCxJQTEvQkFBLGFBQWtDQSxFQUFFQTs7SUFLcENBLHFCQUEwQ0EsRUFBRUE7O0lBSzVDQSxpQkFBc0NBLFVBQVVBOztJQUtoREEsYUFBa0NBLEVBQUVBOztJQUtwQ0EsZ0JBQXFDQSxVQUFVQTs7SUFLL0NBLHFCQUEwQ0EsR0FBR0E7O0lBSzdDQSxxQkFBMENBLEdBQUdBOztJQUs3Q0EscUJBQTBDQSxDQUFDQTs7SUFLM0NBLGdCQUFxQ0EsVUFBVUE7O0lBSy9DQSxhQUFrQ0EsRUFBRUE7O0lBS3BDQSxxQkFBMENBLEVBQUVBOztJQUs1Q0Esd0JBQTZDQSxVQUFVQTs7SUFLdkRBLHNCQUEyQ0EsVUFBVUE7O0lBS3JEQSxpQkFBc0NBLEdBQUdBOztJQU16Q0EsbUJBQXdDQSxFQUFFQTs7SUFLMUNBLG1CQUF3Q0EsRUFBRUE7O0lBVTFDQSxhQUFrQ0EsRUFBRUE7O0lBS3BDQSxrQkFBdUNBLEVBQUVBOztJQUt6Q0EsZ0JBQXFDQSxFQUFFQTs7SUFLdkNBLGVBQW9DQSxVQUFVQTs7SUFLOUNBLGFBQWtDQSxFQUFFQTs7SUFLcENBLGVBQW9DQSxFQUFFQTs7SUFLdENBLGlCQUFzQ0EsRUFBRUE7O0lBS3hDQSxpQkFBc0NBLEdBQUdBOztJQUt6Q0Esa0JBQXVDQSxFQUFFQTs7SUFLekNBLGdCQUFxQ0EsVUFBVUE7O0lBSy9DQSxhQUFrQ0EsRUFBRUE7O0lBS3BDQSxjQUFtQ0EsR0FBR0E7O0lBS3RDQSxlQUFvQ0EsR0FBR0E7O0lBS3ZDQSxlQUFvQ0EsR0FBR0E7O0lBS3ZDQSxlQUFvQ0EsR0FBR0E7O0lBS3ZDQSxlQUFvQ0EsR0FBR0E7O0lBS3ZDQSxlQUFvQ0EsR0FBR0E7O0lBS3ZDQSxlQUFvQ0EsR0FBR0E7O0lBS3ZDQSxjQUFtQ0EsR0FBR0E7O0lBS3RDQSxjQUFt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a0NBLEVBQUVBOztJQUtwQ0Esa0JBQXVDQSxVQUFVQTs7SUFLakRBLGFBQWtDQSxFQUFFQTtJQUVyQ0EsZ0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQseUJBQWtCLENBQUEiLCJmaWxlIjoiY29yZS91aS9LZXlib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIEtleWJvYXJkXG57XG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgQSBrZXkgKDY1KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQTpudW1iZXIgLyp1aW50Ki8gPSA2NTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIEFsdGVybmF0ZSAoT3B0aW9uKSBrZXkgICgxOCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEFMVEVSTkFURTpudW1iZXIgLyp1aW50Ki8gPSAxODtcblxuXHQvKipcblx0ICogU2VsZWN0IHRoZSBhdWRpbyBtb2RlXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEFVRElPOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMTc7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBCIGtleSAoNjYpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBCOm51bWJlciAvKnVpbnQqLyA9IDY2O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm4gdG8gcHJldmlvdXMgcGFnZSBpbiBhcHBsaWNhdGlvblxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBCQUNLOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMTY7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBgIGtleSAoMTkyKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQkFDS1FVT1RFOm51bWJlciAvKnVpbnQqLyA9IDE5MjtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIFxcIGtleSAoMjIwKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQkFDS1NMQVNIOm51bWJlciAvKnVpbnQqLyA9IDIyMDtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIEJhY2tzcGFjZSBrZXkgKDgpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBCQUNLU1BBQ0U6bnVtYmVyIC8qdWludCovID0gODtcblxuXHQvKipcblx0ICogQmx1ZSBmdW5jdGlvbiBrZXkgYnV0dG9uXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEJMVUU6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAwMztcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIEMga2V5ICg2NykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEM6bnVtYmVyIC8qdWludCovID0gNjc7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBDYXBzIExvY2sga2V5ICgyMCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIENBUFNfTE9DSzpudW1iZXIgLyp1aW50Ki8gPSAyMDtcblxuXHQvKipcblx0ICogQ2hhbm5lbCBkb3duXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIENIQU5ORUxfRE9XTjpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDA1O1xuXG5cdC8qKlxuXHQgKiBDaGFubmVsIHVwXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIENIQU5ORUxfVVA6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAwNTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlICwga2V5ICgxODgpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBDT01NQTpudW1iZXIgLyp1aW50Ki8gPSAxODg7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgTWFjIGNvbW1hbmQga2V5ICgxNSkuIFRoaXMgY29uc3RhbnQgaXNcblx0ICogY3VycmVudGx5IG9ubHkgdXNlZCBmb3Igc2V0dGluZyBtZW51IGtleSBlcXVpdmFsZW50cy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQ09NTUFORDpudW1iZXIgLyp1aW50Ki8gPSAxNTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIENvbnRyb2wga2V5ICgxNykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIENPTlRST0w6bnVtYmVyIC8qdWludCovID0gMTc7XG5cblx0LyoqXG5cdCAqIEFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIHRoZSBkZWZpbmVkIGtleSBuYW1lIGNvbnN0YW50cy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQ2hhckNvZGVTdHJpbmdzOkFycmF5PGFueT47XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBEIGtleSAoNjgpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBEOm51bWJlciAvKnVpbnQqLyA9IDY4O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRGVsZXRlIGtleSAoNDYpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBERUxFVEU6bnVtYmVyIC8qdWludCovID0gNDY7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBEb3duIEFycm93IGtleSAoNDApLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBET1dOOm51bWJlciAvKnVpbnQqLyA9IDQwO1xuXG5cdC8qKlxuXHQgKiBFbmdhZ2UgRFZSIGFwcGxpY2F0aW9uIG1vZGVcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRFZSOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMTk7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBFIGtleSAoNjkpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBFOm51bWJlciAvKnVpbnQqLyA9IDY5O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRW5kIGtleSAoMzUpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBFTkQ6bnVtYmVyIC8qdWludCovID0gMzU7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBFbnRlciBrZXkgKDEzKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRU5URVI6bnVtYmVyIC8qdWludCovID0gMTM7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSA9IGtleSAoMTg3KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRVFVQUw6bnVtYmVyIC8qdWludCovID0gMTg3O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRXNjYXBlIGtleSAoMjcpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBFU0NBUEU6bnVtYmVyIC8qdWludCovID0gMjc7XG5cblx0LyoqXG5cdCAqIEV4aXRzIGN1cnJlbnQgYXBwbGljYXRpb24gbW9kZVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBFWElUOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMTU7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBGIGtleSAoNzApLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBGOm51bWJlciAvKnVpbnQqLyA9IDcwO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRjEga2V5ICgxMTIpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBGMTpudW1iZXIgLyp1aW50Ki8gPSAxMTI7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBGMTAga2V5ICgxMjEpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBGMTA6bnVtYmVyIC8qdWludCovID0gMTIxO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRjExIGtleSAoMTIyKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRjExOm51bWJlciAvKnVpbnQqLyA9IDEyMjtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIEYxMiBrZXkgKDEyMykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEYxMjpudW1iZXIgLyp1aW50Ki8gPSAxMjM7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBGMTMga2V5ICgxMjQpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBGMTM6bnVtYmVyIC8qdWludCovID0gMTI0O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRjE0IGtleSAoMTI1KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRjE0Om51bWJlciAvKnVpbnQqLyA9IDEyNTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIEYxNSBrZXkgKDEyNikuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEYxNTpudW1iZXIgLyp1aW50Ki8gPSAxMjY7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBGMiBrZXkgKDExMykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEYyOm51bWJlciAvKnVpbnQqLyA9IDExMztcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIEYzIGtleSAoMTE0KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRjM6bnVtYmVyIC8qdWludCovID0gMTE0O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRjQga2V5ICgxMTUpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBGNDpudW1iZXIgLyp1aW50Ki8gPSAxMTU7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBGNSBrZXkgKDExNikuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEY1Om51bWJlciAvKnVpbnQqLyA9IDExNjtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIEY2IGtleSAoMTE3KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRjY6bnVtYmVyIC8qdWludCovID0gMTE3O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRjcga2V5ICgxMTgpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBGNzpudW1iZXIgLyp1aW50Ki8gPSAxMTg7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBGOCBrZXkgKDExOSkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEY4Om51bWJlciAvKnVpbnQqLyA9IDExOTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIEY5IGtleSAoMTIwKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRjk6bnVtYmVyIC8qdWludCovID0gMTIwO1xuXG5cdC8qKlxuXHQgKiBFbmdhZ2UgZmFzdC1mb3J3YXJkIHRyYW5zcG9ydCBtb2RlXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEZBU1RfRk9SV0FSRDpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDBBO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgRyBrZXkgKDcxKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgRzpudW1iZXIgLyp1aW50Ki8gPSA3MTtcblxuXHQvKipcblx0ICogR3JlZW4gZnVuY3Rpb24ga2V5IGJ1dHRvblxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBHUkVFTjpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDAxO1xuXG5cdC8qKlxuXHQgKiBFbmdhZ2UgcHJvZ3JhbSBndWlkZVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBHVUlERTpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDE0O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgSCBrZXkgKDcyKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgSDpudW1iZXIgLyp1aW50Ki8gPSA3MjtcblxuXHQvKipcblx0ICogRW5nYWdlIGhlbHAgYXBwbGljYXRpb24gb3IgY29udGV4dC1zZW5zaXRpdmUgaGVscFxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBIRUxQOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMUQ7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBIb21lIGtleSAoMzYpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBIT01FOm51bWJlciAvKnVpbnQqLyA9IDM2O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgSSBrZXkgKDczKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgSTpudW1iZXIgLyp1aW50Ki8gPSA3MztcblxuXHQvKipcblx0ICogSW5mbyBidXR0b25cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgSU5GTzpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDEzO1xuXG5cdC8qKlxuXHQgKiBDeWNsZSBpbnB1dFxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBJTlBVVDpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDFCO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgSW5zZXJ0IGtleSAoNDUpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBJTlNFUlQ6bnVtYmVyIC8qdWludCovID0gNDU7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBKIGtleSAoNzQpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBKOm51bWJlciAvKnVpbnQqLyA9IDc0O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgSyBrZXkgKDc1KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgSzpudW1iZXIgLyp1aW50Ki8gPSA3NTtcblxuXHQvKipcblx0ICogVGhlIEJlZ2luIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0JFR0lOOnN0cmluZyA9IFwiQmVnaW5cIjtcblxuXHQvKipcblx0ICogVGhlIEJyZWFrIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0JSRUFLOnN0cmluZyA9IFwiQnJlYWtcIjtcblxuXHQvKipcblx0ICogVGhlIENsZWFyIERpc3BsYXkga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfQ0xFQVJESVNQTEFZOnN0cmluZyA9IFwiQ2xyRHNwXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBDbGVhciBMaW5lIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0NMRUFSTElORTpzdHJpbmcgPSBcIkNsckxuXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBEZWxldGUga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfREVMRVRFOnN0cmluZyA9IFwiRGVsZXRlXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBEZWxldGUgQ2hhcmFjdGVyIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0RFTEVURUNIQVI6c3RyaW5nID0gXCJEZWxDaHJcIjtcblxuXHQvKipcblx0ICogVGhlIERlbGV0ZSBMaW5lIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0RFTEVURUxJTkU6c3RyaW5nID0gXCJEZWxMblwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgZG93biBhcnJvd1xuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0RPV05BUlJPVzpzdHJpbmcgPSBcIkRvd25cIjtcblxuXHQvKipcblx0ICogVGhlIEVuZCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9FTkQ6c3RyaW5nID0gXCJFbmRcIjtcblxuXHQvKipcblx0ICogVGhlIEV4ZWN1dGUga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfRVhFQ1VURTpzdHJpbmcgPSBcIkV4ZWNcIjtcblxuXHQvKipcblx0ICogVGhlIEYxIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0YxOnN0cmluZyA9IFwiRjFcIjtcblxuXHQvKipcblx0ICogVGhlIEYxMCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTA6c3RyaW5nID0gXCJGMTBcIjtcblxuXHQvKipcblx0ICogVGhlIEYxMSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTE6c3RyaW5nID0gXCJGMTFcIjtcblxuXHQvKipcblx0ICogVGhlIEYxMiBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTI6c3RyaW5nID0gXCJGMTJcIjtcblxuXHQvKipcblx0ICogVGhlIEYxMyBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTM6c3RyaW5nID0gXCJGMTNcIjtcblxuXHQvKipcblx0ICogVGhlIEYxNCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTQ6c3RyaW5nID0gXCJGMTRcIjtcblxuXHQvKipcblx0ICogVGhlIEYxNSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTU6c3RyaW5nID0gXCJGMTVcIjtcblxuXHQvKipcblx0ICogVGhlIEYxNiBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTY6c3RyaW5nID0gXCJGMTZcIjtcblxuXHQvKipcblx0ICogVGhlIEYxNyBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTc6c3RyaW5nID0gXCJGMTdcIjtcblxuXHQvKipcblx0ICogVGhlIEYxOCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTg6c3RyaW5nID0gXCJGMThcIjtcblxuXHQvKipcblx0ICogVGhlIEYxOSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMTk6c3RyaW5nID0gXCJGMTlcIjtcblxuXHQvKipcblx0ICogVGhlIEYyIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0YyOnN0cmluZyA9IFwiRjJcIjtcblxuXHQvKipcblx0ICogVGhlIEYyMCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjA6c3RyaW5nID0gXCJGMjBcIjtcblxuXHQvKipcblx0ICogVGhlIEYyMSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjE6c3RyaW5nID0gXCJGMjFcIjtcblxuXHQvKipcblx0ICogVGhlIEYyMiBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjI6c3RyaW5nID0gXCJGMjJcIjtcblxuXHQvKipcblx0ICogVGhlIEYyMyBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjM6c3RyaW5nID0gXCJGMjNcIjtcblxuXHQvKipcblx0ICogVGhlIEYyNCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjQ6c3RyaW5nID0gXCJGMjRcIjtcblxuXHQvKipcblx0ICogVGhlIEYyNSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjU6c3RyaW5nID0gXCJGMjVcIjtcblxuXHQvKipcblx0ICogVGhlIEYyNiBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjY6c3RyaW5nID0gXCJGMjZcIjtcblxuXHQvKipcblx0ICogVGhlIEYyNyBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjc6c3RyaW5nID0gXCJGMjdcIjtcblxuXHQvKipcblx0ICogVGhlIEYyOCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjg6c3RyaW5nID0gXCJGMjhcIjtcblxuXHQvKipcblx0ICogVGhlIEYyOSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMjk6c3RyaW5nID0gXCJGMjlcIjtcblxuXHQvKipcblx0ICogVGhlIEYzIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0YzOnN0cmluZyA9IFwiRjNcIjtcblxuXHQvKipcblx0ICogVGhlIEYzMCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMzA6c3RyaW5nID0gXCJGMzBcIjtcblxuXHQvKipcblx0ICogVGhlIEYzMSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMzE6c3RyaW5nID0gXCJGMzFcIjtcblxuXHQvKipcblx0ICogVGhlIEYzMiBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMzI6c3RyaW5nID0gXCJGMzJcIjtcblxuXHQvKipcblx0ICogVGhlIEYzMyBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMzM6c3RyaW5nID0gXCJGMzNcIjtcblxuXHQvKipcblx0ICogVGhlIEYzNCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMzQ6c3RyaW5nID0gXCJGMzRcIjtcblxuXHQvKipcblx0ICogVGhlIEYzNSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9GMzU6c3RyaW5nID0gXCJGMzVcIjtcblxuXHQvKipcblx0ICogVGhlIEY0IGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0Y0OnN0cmluZyA9IFwiRjRcIjtcblxuXHQvKipcblx0ICogVGhlIEY1IGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0Y1OnN0cmluZyA9IFwiRjVcIjtcblxuXHQvKipcblx0ICogVGhlIEY2IGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0Y2OnN0cmluZyA9IFwiRjZcIjtcblxuXHQvKipcblx0ICogVGhlIEY3IGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0Y3OnN0cmluZyA9IFwiRjdcIjtcblxuXHQvKipcblx0ICogVGhlIEY4IGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0Y4OnN0cmluZyA9IFwiRjhcIjtcblxuXHQvKipcblx0ICogVGhlIEY5IGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX0Y5OnN0cmluZyA9IFwiRjlcIjtcblxuXHQvKipcblx0ICogVGhlIEZpbmQga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfRklORDpzdHJpbmcgPSBcIkZpbmRcIjtcblxuXHQvKipcblx0ICogVGhlIEhlbHAga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfSEVMUDpzdHJpbmcgPSBcIkhlbHBcIjtcblxuXHQvKipcblx0ICogVGhlIEhvbWUga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfSE9NRTpzdHJpbmcgPSBcIkhvbWVcIjtcblxuXHQvKipcblx0ICogVGhlIEluc2VydCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9JTlNFUlQ6c3RyaW5nID0gXCJJbnNlcnRcIjtcblxuXHQvKipcblx0ICogVGhlIEluc2VydCBDaGFyYWN0ZXIga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfSU5TRVJUQ0hBUjpzdHJpbmcgPSBcIkluc0NoclwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgSW5zZXJ0IExpbmUga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfSU5TRVJUTElORTpzdHJpbmcgPSBcIkxuc0xuXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBsZWZ0IGFycm93XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfTEVGVEFSUk9XOnN0cmluZyA9IFwiTGVmdFwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgTWVudSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9NRU5VOnN0cmluZyA9IFwiTWVudVwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgTW9kZSBTd2l0Y2gga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfTU9ERVNXSVRDSDpzdHJpbmcgPSBcIk1vZGVTd1wiO1xuXG5cdC8qKlxuXHQgKiBUaGUgTmV4dCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9ORVhUOnN0cmluZyA9IFwiTmV4dFwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgUGFnZSBEb3duIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX1BBR0VET1dOOnN0cmluZyA9IFwiUGdEblwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgUGFnZSBVcCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9QQUdFVVA6c3RyaW5nID0gXCJQZ1VwXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBQYXVzZSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9QQVVTRTpzdHJpbmcgPSBcIlBhdXNlXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBQcmV2aW91cyBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9QUkVWOnN0cmluZyA9IFwiUHJldlwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgUFJJTlQga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfUFJJTlQ6c3RyaW5nID0gXCJQcmludFwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgUFJJTlQgU2NyZWVuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfUFJJTlRTQ1JFRU46c3RyaW5nID0gXCJQcm50U2NyblwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgUmVkbyBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9SRURPOnN0cmluZyA9IFwiUmVkb1wiO1xuXG5cdC8qKlxuXHQgKiBUaGUgUmVzZXQga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfUkVTRVQ6c3RyaW5nID0gXCJSZXNldFwiO1xuXG5cdC8qKlxuXHQgKiBUaGUgcmlnaHQgYXJyb3dcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9SSUdIVEFSUk9XOnN0cmluZyA9IFwiUmlnaHRcIjtcblxuXHQvKipcblx0ICogVGhlIFNjcm9sbCBMb2NrIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX1NDUk9MTExPQ0s6c3RyaW5nID0gXCJTY3JsTGNrXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBTZWxlY3Qga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfU0VMRUNUOnN0cmluZyA9IFwiU2VsZWN0XCI7XG5cblx0LyoqXG5cdCAqIFRoZSBTdG9wIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX1NUT1A6c3RyaW5nID0gXCJTdG9wXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBTeXN0ZW0gUmVxdWVzdCBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9TWVNSRVE6c3RyaW5nID0gXCJTeXNSZXFcIjtcblxuXHQvKipcblx0ICogVGhlIFN5c3RlbSBrZXlcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgS0VZTkFNRV9TWVNURU06c3RyaW5nID0gXCJTeXNcIjtcblxuXHQvKipcblx0ICogVGhlIFVuZG8ga2V5XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfVU5ETzpzdHJpbmcgPSBcIlVuZG9cIjtcblxuXHQvKipcblx0ICogVGhlIHVwIGFycm93XG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEtFWU5BTUVfVVBBUlJPVzpzdHJpbmcgPSBcIlVwXCI7XG5cblx0LyoqXG5cdCAqIFRoZSBVc2VyIGtleVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBLRVlOQU1FX1VTRVI6c3RyaW5nID0gXCJVc2VyXCI7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBMIGtleSAoNzYpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBMOm51bWJlciAvKnVpbnQqLyA9IDc2O1xuXG5cdC8qKlxuXHQgKiBXYXRjaCBsYXN0IGNoYW5uZWwgb3Igc2hvdyB3YXRjaGVkXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIExBU1Q6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAxMTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIExlZnQgQXJyb3cga2V5ICgzNykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIExFRlQ6bnVtYmVyIC8qdWludCovID0gMzc7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBbIGtleSAoMjE5KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTEVGVEJSQUNLRVQ6bnVtYmVyIC8qdWludCovID0gMjE5O1xuXG5cdC8qKlxuXHQgKiBSZXR1cm4gdG8gbGl2ZSBbcG9zaXRpb24gaW4gYnJvYWRjYXN0XVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBMSVZFOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMTA7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBNIGtleSAoNzcpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBNOm51bWJlciAvKnVpbnQqLyA9IDc3O1xuXG5cdC8qKlxuXHQgKiBFbmdhZ2UgXCJNYXN0ZXIgU2hlbGxcIiBlLmcuIFRpVm8gb3Igb3RoZXIgdmVuZG9yIGJ1dHRvblxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBNQVNURVJfU0hFTEw6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAxRTtcblxuXHQvKipcblx0ICogRW5nYWdlIG1lbnVcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTUVOVTpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDEyO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgLSBrZXkgKDE4OSkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE1JTlVTOm51bWJlciAvKnVpbnQqLyA9IDE4OTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIE4ga2V5ICg3OCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE46bnVtYmVyIC8qdWludCovID0gNzg7XG5cblx0LyoqXG5cdCAqIFNraXAgdG8gbmV4dCB0cmFjayBvciBjaGFwdGVyXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5FWFQ6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAwRTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIDAga2V5ICg0OCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTUJFUl8wOm51bWJlciAvKnVpbnQqLyA9IDQ4O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgMSBrZXkgKDQ5KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNQkVSXzE6bnVtYmVyIC8qdWludCovID0gNDk7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSAyIGtleSAoNTApLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBOVU1CRVJfMjpudW1iZXIgLyp1aW50Ki8gPSA1MDtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIDMga2V5ICg1MSkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTUJFUl8zOm51bWJlciAvKnVpbnQqLyA9IDUxO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgNCBrZXkgKDUyKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNQkVSXzQ6bnVtYmVyIC8qdWludCovID0gNTI7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSA1IGtleSAoNTMpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBOVU1CRVJfNTpudW1iZXIgLyp1aW50Ki8gPSA1MztcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIDYga2V5ICg1NCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTUJFUl82Om51bWJlciAvKnVpbnQqLyA9IDU0O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgNyBrZXkgKDU1KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNQkVSXzc6bnVtYmVyIC8qdWludCovID0gNTU7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSA4IGtleSAoNTYpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBOVU1CRVJfODpudW1iZXIgLyp1aW50Ki8gPSA1NjtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIDkga2V5ICg1NykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTUJFUl85Om51bWJlciAvKnVpbnQqLyA9IDU3O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIHBzZXVkby1rZXkgY29kZSBmb3IgdGhlIHRoZSBudW1iZXIgcGFkICgyMSkuIFVzZSB0byBzZXQgbnVtcGFkIG1vZGlmaWVyIG9uIGtleSBlcXVpdmFsZW50c1xuXHQgKi9cblx0cHVibGljIHN0YXRpYyBOVU1QQUQ6bnVtYmVyIC8qdWludCovID0gMjE7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBudW1iZXIgMCBrZXkgb24gdGhlIG51bWJlciBwYWQgKDk2KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNUEFEXzA6bnVtYmVyIC8qdWludCovID0gOTY7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBudW1iZXIgMSBrZXkgb24gdGhlIG51bWJlciBwYWQgKDk3KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNUEFEXzE6bnVtYmVyIC8qdWludCovID0gOTc7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBudW1iZXIgMiBrZXkgb24gdGhlIG51bWJlciBwYWQgKDk4KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNUEFEXzI6bnVtYmVyIC8qdWludCovID0gOTg7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBudW1iZXIgMyBrZXkgb24gdGhlIG51bWJlciBwYWQgKDk5KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNUEFEXzM6bnVtYmVyIC8qdWludCovID0gOTk7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBudW1iZXIgNCBrZXkgb24gdGhlIG51bWJlciBwYWQgKDEwMCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTVBBRF80Om51bWJlciAvKnVpbnQqLyA9IDEwMDtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIG51bWJlciA1IGtleSBvbiB0aGUgbnVtYmVyIHBhZCAoMTAxKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNUEFEXzU6bnVtYmVyIC8qdWludCovID0gMTAxO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgbnVtYmVyIDYga2V5IG9uIHRoZSBudW1iZXIgcGFkICgxMDIpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBOVU1QQURfNjpudW1iZXIgLyp1aW50Ki8gPSAxMDI7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBudW1iZXIgNyBrZXkgb24gdGhlIG51bWJlciBwYWQgKDEwMykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTVBBRF83Om51bWJlciAvKnVpbnQqLyA9IDEwMztcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIG51bWJlciA4IGtleSBvbiB0aGUgbnVtYmVyIHBhZCAoMTA0KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNUEFEXzg6bnVtYmVyIC8qdWludCovID0gMTA0O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgbnVtYmVyIDkga2V5IG9uIHRoZSBudW1iZXIgcGFkICgxMDUpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBOVU1QQURfOTpudW1iZXIgLyp1aW50Ki8gPSAxMDU7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBhZGRpdGlvbiBrZXkgb24gdGhlIG51bWJlciBwYWQgKDEwNykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTVBBRF9BREQ6bnVtYmVyIC8qdWludCovID0gMTA3O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgZGVjaW1hbCBrZXkgb24gdGhlIG51bWJlciBwYWQgKDExMCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTVBBRF9ERUNJTUFMOm51bWJlciAvKnVpbnQqLyA9IDExMDtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIGRpdmlzaW9uIGtleSBvbiB0aGUgbnVtYmVyIHBhZCAoMTExKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTlVNUEFEX0RJVklERTpudW1iZXIgLyp1aW50Ki8gPSAxMTE7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBFbnRlciBrZXkgb24gdGhlIG51bWJlciBwYWQgKDEwOCkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTVBBRF9FTlRFUjpudW1iZXIgLyp1aW50Ki8gPSAxMDg7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBtdWx0aXBsaWNhdGlvbiBrZXkgb24gdGhlIG51bWJlciBwYWQgKDEwNikuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTVBBRF9NVUxUSVBMWTpudW1iZXIgLyp1aW50Ki8gPSAxMDY7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBzdWJ0cmFjdGlvbiBrZXkgb24gdGhlIG51bWJlciBwYWQgKDEwOSkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE5VTVBBRF9TVUJUUkFDVDpudW1iZXIgLyp1aW50Ki8gPSAxMDk7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBPIGtleSAoNzkpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBPOm51bWJlciAvKnVpbnQqLyA9IDc5O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgUCBrZXkgKDgwKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUDpudW1iZXIgLyp1aW50Ki8gPSA4MDtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIFBhZ2UgRG93biBrZXkgKDM0KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUEFHRV9ET1dOOm51bWJlciAvKnVpbnQqLyA9IDM0O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgUGFnZSBVcCBrZXkgKDMzKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUEFHRV9VUDpudW1iZXIgLyp1aW50Ki8gPSAzMztcblxuXHQvKipcblx0ICogRW5nYWdlIHBhdXNlIHRyYW5zcG9ydCBtb2RlXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFBBVVNFOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMDg7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSAuIGtleSAoMTkwKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUEVSSU9EOm51bWJlciAvKnVpbnQqLyA9IDE5MDtcblxuXHQvKipcblx0ICogRW5nYWdlIHBsYXkgdHJhbnNwb3J0IG1vZGVcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUExBWTpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDA3O1xuXG5cdC8qKlxuXHQgKiBTa2lwIHRvIHByZXZpb3VzIHRyYWNrIG9yIGNoYXB0ZXJcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUFJFVklPVVM6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAwRjtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIFEga2V5ICg4MSkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFE6bnVtYmVyIC8qdWludCovID0gODE7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSAnIGtleSAoMjIyKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUVVPVEU6bnVtYmVyIC8qdWludCovID0gMjIyO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgUiBrZXkgKDgyKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUjpudW1iZXIgLyp1aW50Ki8gPSA4MjtcblxuXHQvKipcblx0ICogUmVjb3JkIGl0ZW0gb3IgZW5nYWdlIHJlY29yZCB0cmFuc3BvcnQgbW9kZVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBSRUNPUkQ6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAwNjtcblxuXHQvKipcblx0ICogUmVkIGZ1bmN0aW9uIGtleSBidXR0b25cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUkVEOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMDA7XG5cblx0LyoqXG5cdCAqIEVuZ2FnZSByZXdpbmQgdHJhbnNwb3J0IG1vZGVcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUkVXSU5EOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMEI7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBSaWdodCBBcnJvdyBrZXkgKDM5KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUklHSFQ6bnVtYmVyIC8qdWludCovID0gMzk7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBdIGtleSAoMjIxKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUklHSFRCUkFDS0VUOm51bWJlciAvKnVpbnQqLyA9IDIyMTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIFMga2V5ICg4MykuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFM6bnVtYmVyIC8qdWludCovID0gODM7XG5cblx0LyoqXG5cdCAqIFNlYXJjaCBidXR0b25cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgU0VBUkNIOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMUY7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSA7IGtleSAoMTg2KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgU0VNSUNPTE9OOm51bWJlciAvKnVpbnQqLyA9IDE4NjtcblxuXHQvKipcblx0ICogRW5nYWdlIHNldHVwIGFwcGxpY2F0aW9uIG9yIG1lbnVcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgU0VUVVA6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAxQztcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIFNoaWZ0IGtleSAoMTYpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBTSElGVDpudW1iZXIgLyp1aW50Ki8gPSAxNjtcblxuXHQvKipcblx0ICogUXVpY2sgc2tpcCBiYWNrd2FyZCAodXN1YWxseSA3LTEwIHNlY29uZHMpXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFNLSVBfQkFDS1dBUkQ6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAwRDtcblxuXHQvKipcblx0ICogUXVpY2sgc2tpcCBhaGVhZCAodXN1YWxseSAzMCBzZWNvbmRzKVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBTS0lQX0ZPUldBUkQ6bnVtYmVyIC8qdWludCovID0gMHgwMTAwMDAwQztcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIC8ga2V5ICgxOTEpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBTTEFTSDpudW1iZXIgLyp1aW50Ki8gPSAxOTE7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBTcGFjZWJhciAoMzIpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBTUEFDRTpudW1iZXIgLyp1aW50Ki8gPSAzMjtcblxuXHQvKipcblx0ICogRW5nYWdlIHN0b3AgdHJhbnNwb3J0IG1vZGVcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgU1RPUDpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDA5O1xuXG5cdC8qKlxuXHQgKiBUb2dnbGUgc3VidGl0bGVzXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFNVQlRJVExFOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMTg7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBUIGtleSAoODQpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBUOm51bWJlciAvKnVpbnQqLyA9IDg0O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgVGFiIGtleSAoOSkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFRBQjpudW1iZXIgLyp1aW50Ki8gPSA5O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgVSBrZXkgKDg1KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgVTpudW1iZXIgLyp1aW50Ki8gPSA4NTtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIFVwIEFycm93IGtleSAoMzgpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBVUDpudW1iZXIgLyp1aW50Ki8gPSAzODtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIFYga2V5ICg4NikuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFY6bnVtYmVyIC8qdWludCovID0gODY7XG5cblx0LyoqXG5cdCAqIEVuZ2FnZSB2aWRlby1vbi1kZW1hbmRcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgVk9EOm51bWJlciAvKnVpbnQqLyA9IDB4MDEwMDAwMUE7XG5cblx0LyoqXG5cdCAqIENvbnN0YW50IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IGNvZGUgdmFsdWUgZm9yIHRoZSBXIGtleSAoODcpLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBXOm51bWJlciAvKnVpbnQqLyA9IDg3O1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgWCBrZXkgKDg4KS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgWDpudW1iZXIgLyp1aW50Ki8gPSA4ODtcblxuXHQvKipcblx0ICogQ29uc3RhbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgY29kZSB2YWx1ZSBmb3IgdGhlIFkga2V5ICg4OSkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFk6bnVtYmVyIC8qdWludCovID0gODk7XG5cblx0LyoqXG5cdCAqIFllbGxvdyBmdW5jdGlvbiBrZXkgYnV0dG9uXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFlFTExPVzpudW1iZXIgLyp1aW50Ki8gPSAweDAxMDAwMDAyO1xuXG5cdC8qKlxuXHQgKiBDb25zdGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBjb2RlIHZhbHVlIGZvciB0aGUgWiBrZXkgKDkwKS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgWjpudW1iZXIgLyp1aW50Ki8gPSA5MDtcblxufVxuXG5leHBvcnQgPSBLZXlib2FyZDsiXX0= \ No newline at end of file diff --git a/lib/core/ui/Keyboard.ts b/lib/core/ui/Keyboard.ts new file mode 100644 index 00000000..bd728928 --- /dev/null +++ b/lib/core/ui/Keyboard.ts @@ -0,0 +1,1026 @@ +class Keyboard +{ + /** + * Constant associated with the key code value for the A key (65). + */ + public static A:number /*uint*/ = 65; + + /** + * Constant associated with the key code value for the Alternate (Option) key (18). + */ + public static ALTERNATE:number /*uint*/ = 18; + + /** + * Select the audio mode + */ + public static AUDIO:number /*uint*/ = 0x01000017; + + /** + * Constant associated with the key code value for the B key (66). + */ + public static B:number /*uint*/ = 66; + + /** + * Return to previous page in application + */ + public static BACK:number /*uint*/ = 0x01000016; + + /** + * Constant associated with the key code value for the ` key (192). + */ + public static BACKQUOTE:number /*uint*/ = 192; + + /** + * Constant associated with the key code value for the \ key (220). + */ + public static BACKSLASH:number /*uint*/ = 220; + + /** + * Constant associated with the key code value for the Backspace key (8). + */ + public static BACKSPACE:number /*uint*/ = 8; + + /** + * Blue function key button + */ + public static BLUE:number /*uint*/ = 0x01000003; + + /** + * Constant associated with the key code value for the C key (67). + */ + public static C:number /*uint*/ = 67; + + /** + * Constant associated with the key code value for the Caps Lock key (20). + */ + public static CAPS_LOCK:number /*uint*/ = 20; + + /** + * Channel down + */ + public static CHANNEL_DOWN:number /*uint*/ = 0x01000005; + + /** + * Channel up + */ + public static CHANNEL_UP:number /*uint*/ = 0x01000005; + + /** + * Constant associated with the key code value for the , key (188). + */ + public static COMMA:number /*uint*/ = 188; + + /** + * Constant associated with the Mac command key (15). This constant is + * currently only used for setting menu key equivalents. + */ + public static COMMAND:number /*uint*/ = 15; + + /** + * Constant associated with the key code value for the Control key (17). + */ + public static CONTROL:number /*uint*/ = 17; + + /** + * An array containing all the defined key name constants. + */ + public static CharCodeStrings:Array; + + /** + * Constant associated with the key code value for the D key (68). + */ + public static D:number /*uint*/ = 68; + + /** + * Constant associated with the key code value for the Delete key (46). + */ + public static DELETE:number /*uint*/ = 46; + + /** + * Constant associated with the key code value for the Down Arrow key (40). + */ + public static DOWN:number /*uint*/ = 40; + + /** + * Engage DVR application mode + */ + public static DVR:number /*uint*/ = 0x01000019; + + /** + * Constant associated with the key code value for the E key (69). + */ + public static E:number /*uint*/ = 69; + + /** + * Constant associated with the key code value for the End key (35). + */ + public static END:number /*uint*/ = 35; + + /** + * Constant associated with the key code value for the Enter key (13). + */ + public static ENTER:number /*uint*/ = 13; + + /** + * Constant associated with the key code value for the = key (187). + */ + public static EQUAL:number /*uint*/ = 187; + + /** + * Constant associated with the key code value for the Escape key (27). + */ + public static ESCAPE:number /*uint*/ = 27; + + /** + * Exits current application mode + */ + public static EXIT:number /*uint*/ = 0x01000015; + + /** + * Constant associated with the key code value for the F key (70). + */ + public static F:number /*uint*/ = 70; + + /** + * Constant associated with the key code value for the F1 key (112). + */ + public static F1:number /*uint*/ = 112; + + /** + * Constant associated with the key code value for the F10 key (121). + */ + public static F10:number /*uint*/ = 121; + + /** + * Constant associated with the key code value for the F11 key (122). + */ + public static F11:number /*uint*/ = 122; + + /** + * Constant associated with the key code value for the F12 key (123). + */ + public static F12:number /*uint*/ = 123; + + /** + * Constant associated with the key code value for the F13 key (124). + */ + public static F13:number /*uint*/ = 124; + + /** + * Constant associated with the key code value for the F14 key (125). + */ + public static F14:number /*uint*/ = 125; + + /** + * Constant associated with the key code value for the F15 key (126). + */ + public static F15:number /*uint*/ = 126; + + /** + * Constant associated with the key code value for the F2 key (113). + */ + public static F2:number /*uint*/ = 113; + + /** + * Constant associated with the key code value for the F3 key (114). + */ + public static F3:number /*uint*/ = 114; + + /** + * Constant associated with the key code value for the F4 key (115). + */ + public static F4:number /*uint*/ = 115; + + /** + * Constant associated with the key code value for the F5 key (116). + */ + public static F5:number /*uint*/ = 116; + + /** + * Constant associated with the key code value for the F6 key (117). + */ + public static F6:number /*uint*/ = 117; + + /** + * Constant associated with the key code value for the F7 key (118). + */ + public static F7:number /*uint*/ = 118; + + /** + * Constant associated with the key code value for the F8 key (119). + */ + public static F8:number /*uint*/ = 119; + + /** + * Constant associated with the key code value for the F9 key (120). + */ + public static F9:number /*uint*/ = 120; + + /** + * Engage fast-forward transport mode + */ + public static FAST_FORWARD:number /*uint*/ = 0x0100000A; + + /** + * Constant associated with the key code value for the G key (71). + */ + public static G:number /*uint*/ = 71; + + /** + * Green function key button + */ + public static GREEN:number /*uint*/ = 0x01000001; + + /** + * Engage program guide + */ + public static GUIDE:number /*uint*/ = 0x01000014; + + /** + * Constant associated with the key code value for the H key (72). + */ + public static H:number /*uint*/ = 72; + + /** + * Engage help application or context-sensitive help + */ + public static HELP:number /*uint*/ = 0x0100001D; + + /** + * Constant associated with the key code value for the Home key (36). + */ + public static HOME:number /*uint*/ = 36; + + /** + * Constant associated with the key code value for the I key (73). + */ + public static I:number /*uint*/ = 73; + + /** + * Info button + */ + public static INFO:number /*uint*/ = 0x01000013; + + /** + * Cycle input + */ + public static INPUT:number /*uint*/ = 0x0100001B; + + /** + * Constant associated with the key code value for the Insert key (45). + */ + public static INSERT:number /*uint*/ = 45; + + /** + * Constant associated with the key code value for the J key (74). + */ + public static J:number /*uint*/ = 74; + + /** + * Constant associated with the key code value for the K key (75). + */ + public static K:number /*uint*/ = 75; + + /** + * The Begin key + */ + public static KEYNAME_BEGIN:string = "Begin"; + + /** + * The Break key + */ + public static KEYNAME_BREAK:string = "Break"; + + /** + * The Clear Display key + */ + public static KEYNAME_CLEARDISPLAY:string = "ClrDsp"; + + /** + * The Clear Line key + */ + public static KEYNAME_CLEARLINE:string = "ClrLn"; + + /** + * The Delete key + */ + public static KEYNAME_DELETE:string = "Delete"; + + /** + * The Delete Character key + */ + public static KEYNAME_DELETECHAR:string = "DelChr"; + + /** + * The Delete Line key + */ + public static KEYNAME_DELETELINE:string = "DelLn"; + + /** + * The down arrow + */ + public static KEYNAME_DOWNARROW:string = "Down"; + + /** + * The End key + */ + public static KEYNAME_END:string = "End"; + + /** + * The Execute key + */ + public static KEYNAME_EXECUTE:string = "Exec"; + + /** + * The F1 key + */ + public static KEYNAME_F1:string = "F1"; + + /** + * The F10 key + */ + public static KEYNAME_F10:string = "F10"; + + /** + * The F11 key + */ + public static KEYNAME_F11:string = "F11"; + + /** + * The F12 key + */ + public static KEYNAME_F12:string = "F12"; + + /** + * The F13 key + */ + public static KEYNAME_F13:string = "F13"; + + /** + * The F14 key + */ + public static KEYNAME_F14:string = "F14"; + + /** + * The F15 key + */ + public static KEYNAME_F15:string = "F15"; + + /** + * The F16 key + */ + public static KEYNAME_F16:string = "F16"; + + /** + * The F17 key + */ + public static KEYNAME_F17:string = "F17"; + + /** + * The F18 key + */ + public static KEYNAME_F18:string = "F18"; + + /** + * The F19 key + */ + public static KEYNAME_F19:string = "F19"; + + /** + * The F2 key + */ + public static KEYNAME_F2:string = "F2"; + + /** + * The F20 key + */ + public static KEYNAME_F20:string = "F20"; + + /** + * The F21 key + */ + public static KEYNAME_F21:string = "F21"; + + /** + * The F22 key + */ + public static KEYNAME_F22:string = "F22"; + + /** + * The F23 key + */ + public static KEYNAME_F23:string = "F23"; + + /** + * The F24 key + */ + public static KEYNAME_F24:string = "F24"; + + /** + * The F25 key + */ + public static KEYNAME_F25:string = "F25"; + + /** + * The F26 key + */ + public static KEYNAME_F26:string = "F26"; + + /** + * The F27 key + */ + public static KEYNAME_F27:string = "F27"; + + /** + * The F28 key + */ + public static KEYNAME_F28:string = "F28"; + + /** + * The F29 key + */ + public static KEYNAME_F29:string = "F29"; + + /** + * The F3 key + */ + public static KEYNAME_F3:string = "F3"; + + /** + * The F30 key + */ + public static KEYNAME_F30:string = "F30"; + + /** + * The F31 key + */ + public static KEYNAME_F31:string = "F31"; + + /** + * The F32 key + */ + public static KEYNAME_F32:string = "F32"; + + /** + * The F33 key + */ + public static KEYNAME_F33:string = "F33"; + + /** + * The F34 key + */ + public static KEYNAME_F34:string = "F34"; + + /** + * The F35 key + */ + public static KEYNAME_F35:string = "F35"; + + /** + * The F4 key + */ + public static KEYNAME_F4:string = "F4"; + + /** + * The F5 key + */ + public static KEYNAME_F5:string = "F5"; + + /** + * The F6 key + */ + public static KEYNAME_F6:string = "F6"; + + /** + * The F7 key + */ + public static KEYNAME_F7:string = "F7"; + + /** + * The F8 key + */ + public static KEYNAME_F8:string = "F8"; + + /** + * The F9 key + */ + public static KEYNAME_F9:string = "F9"; + + /** + * The Find key + */ + public static KEYNAME_FIND:string = "Find"; + + /** + * The Help key + */ + public static KEYNAME_HELP:string = "Help"; + + /** + * The Home key + */ + public static KEYNAME_HOME:string = "Home"; + + /** + * The Insert key + */ + public static KEYNAME_INSERT:string = "Insert"; + + /** + * The Insert Character key + */ + public static KEYNAME_INSERTCHAR:string = "InsChr"; + + /** + * The Insert Line key + */ + public static KEYNAME_INSERTLINE:string = "LnsLn"; + + /** + * The left arrow + */ + public static KEYNAME_LEFTARROW:string = "Left"; + + /** + * The Menu key + */ + public static KEYNAME_MENU:string = "Menu"; + + /** + * The Mode Switch key + */ + public static KEYNAME_MODESWITCH:string = "ModeSw"; + + /** + * The Next key + */ + public static KEYNAME_NEXT:string = "Next"; + + /** + * The Page Down key + */ + public static KEYNAME_PAGEDOWN:string = "PgDn"; + + /** + * The Page Up key + */ + public static KEYNAME_PAGEUP:string = "PgUp"; + + /** + * The Pause key + */ + public static KEYNAME_PAUSE:string = "Pause"; + + /** + * The Previous key + */ + public static KEYNAME_PREV:string = "Prev"; + + /** + * The PRINT key + */ + public static KEYNAME_PRINT:string = "Print"; + + /** + * The PRINT Screen + */ + public static KEYNAME_PRINTSCREEN:string = "PrntScrn"; + + /** + * The Redo key + */ + public static KEYNAME_REDO:string = "Redo"; + + /** + * The Reset key + */ + public static KEYNAME_RESET:string = "Reset"; + + /** + * The right arrow + */ + public static KEYNAME_RIGHTARROW:string = "Right"; + + /** + * The Scroll Lock key + */ + public static KEYNAME_SCROLLLOCK:string = "ScrlLck"; + + /** + * The Select key + */ + public static KEYNAME_SELECT:string = "Select"; + + /** + * The Stop key + */ + public static KEYNAME_STOP:string = "Stop"; + + /** + * The System Request key + */ + public static KEYNAME_SYSREQ:string = "SysReq"; + + /** + * The System key + */ + public static KEYNAME_SYSTEM:string = "Sys"; + + /** + * The Undo key + */ + public static KEYNAME_UNDO:string = "Undo"; + + /** + * The up arrow + */ + public static KEYNAME_UPARROW:string = "Up"; + + /** + * The User key + */ + public static KEYNAME_USER:string = "User"; + + /** + * Constant associated with the key code value for the L key (76). + */ + public static L:number /*uint*/ = 76; + + /** + * Watch last channel or show watched + */ + public static LAST:number /*uint*/ = 0x01000011; + + /** + * Constant associated with the key code value for the Left Arrow key (37). + */ + public static LEFT:number /*uint*/ = 37; + + /** + * Constant associated with the key code value for the [ key (219). + */ + public static LEFTBRACKET:number /*uint*/ = 219; + + /** + * Return to live [position in broadcast] + */ + public static LIVE:number /*uint*/ = 0x01000010; + + /** + * Constant associated with the key code value for the M key (77). + */ + public static M:number /*uint*/ = 77; + + /** + * Engage "Master Shell" e.g. TiVo or other vendor button + */ + public static MASTER_SHELL:number /*uint*/ = 0x0100001E; + + /** + * Engage menu + */ + public static MENU:number /*uint*/ = 0x01000012; + + /** + * Constant associated with the key code value for the - key (189). + */ + public static MINUS:number /*uint*/ = 189; + + /** + * Constant associated with the key code value for the N key (78). + */ + public static N:number /*uint*/ = 78; + + /** + * Skip to next track or chapter + */ + public static NEXT:number /*uint*/ = 0x0100000E; + + /** + * Constant associated with the key code value for the 0 key (48). + */ + public static NUMBER_0:number /*uint*/ = 48; + + /** + * Constant associated with the key code value for the 1 key (49). + */ + public static NUMBER_1:number /*uint*/ = 49; + + /** + * Constant associated with the key code value for the 2 key (50). + */ + public static NUMBER_2:number /*uint*/ = 50; + + /** + * Constant associated with the key code value for the 3 key (51). + */ + public static NUMBER_3:number /*uint*/ = 51; + + /** + * Constant associated with the key code value for the 4 key (52). + */ + public static NUMBER_4:number /*uint*/ = 52; + + /** + * Constant associated with the key code value for the 5 key (53). + */ + public static NUMBER_5:number /*uint*/ = 53; + + /** + * Constant associated with the key code value for the 6 key (54). + */ + public static NUMBER_6:number /*uint*/ = 54; + + /** + * Constant associated with the key code value for the 7 key (55). + */ + public static NUMBER_7:number /*uint*/ = 55; + + /** + * Constant associated with the key code value for the 8 key (56). + */ + public static NUMBER_8:number /*uint*/ = 56; + + /** + * Constant associated with the key code value for the 9 key (57). + */ + public static NUMBER_9:number /*uint*/ = 57; + + /** + * Constant associated with the pseudo-key code for the the number pad (21). Use to set numpad modifier on key equivalents + */ + public static NUMPAD:number /*uint*/ = 21; + + /** + * Constant associated with the key code value for the number 0 key on the number pad (96). + */ + public static NUMPAD_0:number /*uint*/ = 96; + + /** + * Constant associated with the key code value for the number 1 key on the number pad (97). + */ + public static NUMPAD_1:number /*uint*/ = 97; + + /** + * Constant associated with the key code value for the number 2 key on the number pad (98). + */ + public static NUMPAD_2:number /*uint*/ = 98; + + /** + * Constant associated with the key code value for the number 3 key on the number pad (99). + */ + public static NUMPAD_3:number /*uint*/ = 99; + + /** + * Constant associated with the key code value for the number 4 key on the number pad (100). + */ + public static NUMPAD_4:number /*uint*/ = 100; + + /** + * Constant associated with the key code value for the number 5 key on the number pad (101). + */ + public static NUMPAD_5:number /*uint*/ = 101; + + /** + * Constant associated with the key code value for the number 6 key on the number pad (102). + */ + public static NUMPAD_6:number /*uint*/ = 102; + + /** + * Constant associated with the key code value for the number 7 key on the number pad (103). + */ + public static NUMPAD_7:number /*uint*/ = 103; + + /** + * Constant associated with the key code value for the number 8 key on the number pad (104). + */ + public static NUMPAD_8:number /*uint*/ = 104; + + /** + * Constant associated with the key code value for the number 9 key on the number pad (105). + */ + public static NUMPAD_9:number /*uint*/ = 105; + + /** + * Constant associated with the key code value for the addition key on the number pad (107). + */ + public static NUMPAD_ADD:number /*uint*/ = 107; + + /** + * Constant associated with the key code value for the decimal key on the number pad (110). + */ + public static NUMPAD_DECIMAL:number /*uint*/ = 110; + + /** + * Constant associated with the key code value for the division key on the number pad (111). + */ + public static NUMPAD_DIVIDE:number /*uint*/ = 111; + + /** + * Constant associated with the key code value for the Enter key on the number pad (108). + */ + public static NUMPAD_ENTER:number /*uint*/ = 108; + + /** + * Constant associated with the key code value for the multiplication key on the number pad (106). + */ + public static NUMPAD_MULTIPLY:number /*uint*/ = 106; + + /** + * Constant associated with the key code value for the subtraction key on the number pad (109). + */ + public static NUMPAD_SUBTRACT:number /*uint*/ = 109; + + /** + * Constant associated with the key code value for the O key (79). + */ + public static O:number /*uint*/ = 79; + + /** + * Constant associated with the key code value for the P key (80). + */ + public static P:number /*uint*/ = 80; + + /** + * Constant associated with the key code value for the Page Down key (34). + */ + public static PAGE_DOWN:number /*uint*/ = 34; + + /** + * Constant associated with the key code value for the Page Up key (33). + */ + public static PAGE_UP:number /*uint*/ = 33; + + /** + * Engage pause transport mode + */ + public static PAUSE:number /*uint*/ = 0x01000008; + + /** + * Constant associated with the key code value for the . key (190). + */ + public static PERIOD:number /*uint*/ = 190; + + /** + * Engage play transport mode + */ + public static PLAY:number /*uint*/ = 0x01000007; + + /** + * Skip to previous track or chapter + */ + public static PREVIOUS:number /*uint*/ = 0x0100000F; + + /** + * Constant associated with the key code value for the Q key (81). + */ + public static Q:number /*uint*/ = 81; + + /** + * Constant associated with the key code value for the ' key (222). + */ + public static QUOTE:number /*uint*/ = 222; + + /** + * Constant associated with the key code value for the R key (82). + */ + public static R:number /*uint*/ = 82; + + /** + * Record item or engage record transport mode + */ + public static RECORD:number /*uint*/ = 0x01000006; + + /** + * Red function key button + */ + public static RED:number /*uint*/ = 0x01000000; + + /** + * Engage rewind transport mode + */ + public static REWIND:number /*uint*/ = 0x0100000B; + + /** + * Constant associated with the key code value for the Right Arrow key (39). + */ + public static RIGHT:number /*uint*/ = 39; + + /** + * Constant associated with the key code value for the ] key (221). + */ + public static RIGHTBRACKET:number /*uint*/ = 221; + + /** + * Constant associated with the key code value for the S key (83). + */ + public static S:number /*uint*/ = 83; + + /** + * Search button + */ + public static SEARCH:number /*uint*/ = 0x0100001F; + + /** + * Constant associated with the key code value for the ; key (186). + */ + public static SEMICOLON:number /*uint*/ = 186; + + /** + * Engage setup application or menu + */ + public static SETUP:number /*uint*/ = 0x0100001C; + + /** + * Constant associated with the key code value for the Shift key (16). + */ + public static SHIFT:number /*uint*/ = 16; + + /** + * Quick skip backward (usually 7-10 seconds) + */ + public static SKIP_BACKWARD:number /*uint*/ = 0x0100000D; + + /** + * Quick skip ahead (usually 30 seconds) + */ + public static SKIP_FORWARD:number /*uint*/ = 0x0100000C; + + /** + * Constant associated with the key code value for the / key (191). + */ + public static SLASH:number /*uint*/ = 191; + + /** + * Constant associated with the key code value for the Spacebar (32). + */ + public static SPACE:number /*uint*/ = 32; + + /** + * Engage stop transport mode + */ + public static STOP:number /*uint*/ = 0x01000009; + + /** + * Toggle subtitles + */ + public static SUBTITLE:number /*uint*/ = 0x01000018; + + /** + * Constant associated with the key code value for the T key (84). + */ + public static T:number /*uint*/ = 84; + + /** + * Constant associated with the key code value for the Tab key (9). + */ + public static TAB:number /*uint*/ = 9; + + /** + * Constant associated with the key code value for the U key (85). + */ + public static U:number /*uint*/ = 85; + + /** + * Constant associated with the key code value for the Up Arrow key (38). + */ + public static UP:number /*uint*/ = 38; + + /** + * Constant associated with the key code value for the V key (86). + */ + public static V:number /*uint*/ = 86; + + /** + * Engage video-on-demand + */ + public static VOD:number /*uint*/ = 0x0100001A; + + /** + * Constant associated with the key code value for the W key (87). + */ + public static W:number /*uint*/ = 87; + + /** + * Constant associated with the key code value for the X key (88). + */ + public static X:number /*uint*/ = 88; + + /** + * Constant associated with the key code value for the Y key (89). + */ + public static Y:number /*uint*/ = 89; + + /** + * Yellow function key button + */ + public static YELLOW:number /*uint*/ = 0x01000002; + + /** + * Constant associated with the key code value for the Z key (90). + */ + public static Z:number /*uint*/ = 90; + +} + +export = Keyboard; \ No newline at end of file diff --git a/lib/entities/Billboard.js b/lib/entities/Billboard.js new file mode 100755 index 00000000..c0f037d2 --- /dev/null +++ b/lib/entities/Billboard.js @@ -0,0 +1,215 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +var MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); + +/** +* The Billboard class represents display objects that represent bitmap images. +* These can be images that you load with the flash.Assets or +* flash.display.Loader classes, or they can be images that you +* create with the Billboard() constructor. +* +*

The Billboard() constructor allows you to create a Billboard +* object that contains a reference to a BitmapData object. After you create a +* Billboard object, use the addChild() or addChildAt() +* method of the parent DisplayObjectContainer instance to place the bitmap on +* the display list.

+* +*

A Billboard object can share its BitmapData reference among several Billboard +* objects, independent of translation or rotation properties. Because you can +* create multiple Billboard objects that reference the same BitmapData object, +* multiple display objects can use the same complex BitmapData object without +* incurring the memory overhead of a BitmapData object for each display +* object instance.

+* +*

A BitmapData object can be drawn to the screen by a Billboard object in one +* of two ways: by using the default hardware renderer with a single hardware surface, +* or by using the slower software renderer when 3D acceleration is not available.

+* +*

If you would prefer to perform a batch rendering command, rather than using a +* single surface for each Billboard object, you can also draw to the screen using the +* drawTiles() or drawTriangles() methods which are +* available to flash.display.Tilesheet and flash.display.Graphics +* objects.

+* +*

Note: The Billboard class is not a subclass of the InteractiveObject +* class, so it cannot dispatch mouse events. However, you can use the +* addEventListener() method of the display object container that +* contains the Billboard object.

+*/ +var Billboard = (function (_super) { + __extends(Billboard, _super); + function Billboard(material, pixelSnapping, smoothing) { + if (typeof pixelSnapping === "undefined") { pixelSnapping = "auto"; } + if (typeof smoothing === "undefined") { smoothing = false; } + var _this = this; + _super.call(this); + + this._pIsEntity = true; + + this.onSizeChangedDelegate = function (event) { + return _this.onSizeChanged(event); + }; + + this.material = material; + + this._billboardWidth = material.width; + this._billboardHeight = material.height; + } + Object.defineProperty(Billboard.prototype, "animator", { + /** + * Defines the animator of the mesh. Act on the mesh's geometry. Defaults to null + */ + get: function () { + return this._animator; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Billboard.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.BILLBOARD; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Billboard.prototype, "billboardHeight", { + /** + * + */ + get: function () { + return this._billboardHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Billboard.prototype, "billboardWidth", { + /** + * + */ + get: function () { + return this._billboardWidth; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Billboard.prototype, "material", { + /** + * + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + if (this._material) { + this._material.iRemoveOwner(this); + this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + + this._material = value; + + if (this._material) { + this._material.iAddOwner(this); + this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Billboard.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * @protected + */ + Billboard.prototype.pCreateEntityPartitionNode = function () { + return new EntityNode(this); + }; + + /** + * @protected + */ + Billboard.prototype.pUpdateBounds = function () { + this._pBounds.fromExtremes(0, 0, 0, this._billboardWidth, this._billboardHeight, 0); + + _super.prototype.pUpdateBounds.call(this); + }; + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + Billboard.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { + return this._pPickingCollider.testBillboardCollision(this, this._pPickingCollisionVO, shortestCollisionDistance); + }; + + /** + * @private + */ + Billboard.prototype.onSizeChanged = function (event) { + this._billboardWidth = this._material.width; + this._billboardHeight = this._material.height; + + this._pBoundsInvalid = true; + + var len = this._pRenderables.length; + for (var i = 0; i < len; i++) + this._pRenderables[i].invalidateVertexData("vertices"); //TODO + }; + + Billboard.prototype._iCollectRenderables = function (renderer) { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + }; + + Billboard.prototype._iCollectRenderable = function (renderer) { + renderer.applyBillboard(this); + }; + return Billboard; +})(DisplayObject); + +module.exports = Billboard; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL0JpbGxib2FyZC50cyJdLCJuYW1lcyI6WyJCaWxsYm9hcmQiLCJCaWxsYm9hcmQuY29uc3RydWN0b3IiLCJCaWxsYm9hcmQucENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUiLCJCaWxsYm9hcmQucFVwZGF0ZUJvdW5kcyIsIkJpbGxib2FyZC5faVRlc3RDb2xsaXNpb24iLCJCaWxsYm9hcmQub25TaXplQ2hhbmdlZCIsIkJpbGxib2FyZC5faUNvbGxlY3RSZW5kZXJhYmxlcyIsIkJpbGxib2FyZC5faUNvbGxlY3RSZW5kZXJhYmxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzRUFFNEU7O0FBSTVFLGlFQUF3RTtBQUN4RSxxRUFBNEU7O0FBRzVFLG1FQUF5RTs7QUFHekU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlDRztBQUVIO0lBQXdCQSw0QkFBYUE7SUFnSHBDQSxtQkFBWUEsUUFBcUJBLEVBQUVBLGFBQTZCQSxFQUFFQSxTQUF5QkE7UUFBeERDLDRDQUFBQSxhQUFhQSxHQUFVQSxNQUFNQTtBQUFBQSxRQUFFQSx3Q0FBQUEsU0FBU0EsR0FBV0EsS0FBS0E7QUFBQUEsUUFBM0ZBLGlCQVlDQTtRQVZBQSxXQUFNQSxLQUFBQSxDQUFDQTs7UUFFUEEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsSUFBSUE7O1FBRXRCQSxJQUFJQSxDQUFDQSxxQkFBcUJBLEdBQUdBLFVBQUNBLEtBQW1CQTttQkFBS0EsS0FBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBekJBLENBQXlCQTs7UUFFL0VBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLFFBQVFBOztRQUV4QkEsSUFBSUEsQ0FBQ0EsZUFBZUEsR0FBR0EsUUFBUUEsQ0FBQ0EsS0FBS0E7UUFDckNBLElBQUlBLENBQUNBLGdCQUFnQkEsR0FBR0EsUUFBUUEsQ0FBQ0EsTUFBTUE7SUFDeENBLENBQUNBO0lBL0dERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0Es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QSxFQUFFQSxDQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxDQUFDQSxFQUFFQTtZQUNsQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxVQUFVQSxDQUFDQSxFQUFFQSxNQUFNQTtBQUFQQSxJQUN6REEsQ0FBQ0E7O0lBRURMLDJDQUFBQSxVQUE0QkEsUUFBa0JBO1FBRTdDTSx1RUFBdUVBO1FBQ3ZFQSxrRUFBa0VBO1FBQ2xFQSxpREFBaURBO1FBQ2pEQSxJQUFJQSxJQUFJQSxDQUFDQSxjQUFjQTtZQUN0QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRWxDQSxJQUFJQSxDQUFDQSxtQkFBbUJBLENBQUNBLFFBQVFBLENBQUNBO0lBQ25DQSxDQUFDQTs7SUFFRE4sMENBQUFBLFVBQTJCQSxRQUFrQkE7UUFFNUNPLFFBQVFBLENBQUNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBO0lBQzlCQSxDQUFDQTtJQUNGUCxpQkFBQ0E7QUFBREEsQ0FBQ0EsRUE1THVCLGFBQWEsRUE0THBDOztBQUVELDBCQUFtQixDQUFBIiwiZmlsZSI6ImVudGl0aWVzL0JpbGxib2FyZC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJQW5pbWF0b3JcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9hbmltYXRvcnMvSUFuaW1hdG9yXCIpO1xuaW1wb3J0IEJpdG1hcERhdGFcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvQml0bWFwRGF0YVwiKTtcbmltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IElNYXRlcmlhbE93bmVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JTWF0ZXJpYWxPd25lclwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFVWVHJhbnNmb3JtXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1VWVHJhbnNmb3JtXCIpO1xuaW1wb3J0IEFzc2V0VHlwZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldFR5cGVcIik7XG5pbXBvcnQgRW50aXR5Tm9kZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGFydGl0aW9uL0VudGl0eU5vZGVcIik7XG5pbXBvcnQgSVJlbmRlcmVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvSVJlbmRlcmVyXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5pbXBvcnQgTWF0ZXJpYWxFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvTWF0ZXJpYWxFdmVudFwiKTtcbmltcG9ydCBNYXRlcmlhbEJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvTWF0ZXJpYWxCYXNlXCIpO1xuXG4vKipcbiAqIFRoZSBCaWxsYm9hcmQgY2xhc3MgcmVwcmVzZW50cyBkaXNwbGF5IG9iamVjdHMgdGhhdCByZXByZXNlbnQgYml0bWFwIGltYWdlcy5cbiAqIFRoZXNlIGNhbiBiZSBpbWFnZXMgdGhhdCB5b3UgbG9hZCB3aXRoIHRoZSA8Y29kZT5mbGFzaC5Bc3NldHM8L2NvZGU+IG9yXG4gKiA8Y29kZT5mbGFzaC5kaXNwbGF5LkxvYWRlcjwvY29kZT4gY2xhc3Nlcywgb3IgdGhleSBjYW4gYmUgaW1hZ2VzIHRoYXQgeW91XG4gKiBjcmVhdGUgd2l0aCB0aGUgPGNvZGU+QmlsbGJvYXJkKCk8L2NvZGU+IGNvbnN0cnVjdG9yLlxuICpcbiAqIDxwPlRoZSA8Y29kZT5CaWxsYm9hcmQoKTwvY29kZT4gY29uc3RydWN0b3IgYWxsb3dzIHlvdSB0byBjcmVhdGUgYSBCaWxsYm9hcmRcbiAqIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgQml0bWFwRGF0YSBvYmplY3QuIEFmdGVyIHlvdSBjcmVhdGUgYVxuICogQmlsbGJvYXJkIG9iamVjdCwgdXNlIHRoZSA8Y29kZT5hZGRDaGlsZCgpPC9jb2RlPiBvciA8Y29kZT5hZGRDaGlsZEF0KCk8L2NvZGU+XG4gKiBtZXRob2Qgb2YgdGhlIHBhcmVudCBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIGluc3RhbmNlIHRvIHBsYWNlIHRoZSBiaXRtYXAgb25cbiAqIHRoZSBkaXNwbGF5IGxpc3QuPC9wPlxuICpcbiAqIDxwPkEgQmlsbGJvYXJkIG9iamVjdCBjYW4gc2hhcmUgaXRzIEJpdG1hcERhdGEgcmVmZXJlbmNlIGFtb25nIHNldmVyYWwgQmlsbGJvYXJkXG4gKiBvYmplY3RzLCBpbmRlcGVuZGVudCBvZiB0cmFuc2xhdGlvbiBvciByb3RhdGlvbiBwcm9wZXJ0aWVzLiBCZWNhdXNlIHlvdSBjYW5cbiAqIGNyZWF0ZSBtdWx0aXBsZSBCaWxsYm9hcmQgb2JqZWN0cyB0aGF0IHJlZmVyZW5jZSB0aGUgc2FtZSBCaXRtYXBEYXRhIG9iamVjdCxcbiAqIG11bHRpcGxlIGRpc3BsYXkgb2JqZWN0cyBjYW4gdXNlIHRoZSBzYW1lIGNvbXBsZXggQml0bWFwRGF0YSBvYmplY3Qgd2l0aG91dFxuICogaW5jdXJyaW5nIHRoZSBtZW1vcnkgb3ZlcmhlYWQgb2YgYSBCaXRtYXBEYXRhIG9iamVjdCBmb3IgZWFjaCBkaXNwbGF5XG4gKiBvYmplY3QgaW5zdGFuY2UuPC9wPlxuICpcbiAqIDxwPkEgQml0bWFwRGF0YSBvYmplY3QgY2FuIGJlIGRyYXduIHRvIHRoZSBzY3JlZW4gYnkgYSBCaWxsYm9hcmQgb2JqZWN0IGluIG9uZVxuICogb2YgdHdvIHdheXM6IGJ5IHVzaW5nIHRoZSBkZWZhdWx0IGhhcmR3YXJlIHJlbmRlcmVyIHdpdGggYSBzaW5nbGUgaGFyZHdhcmUgc3VyZmFjZSxcbiAqIG9yIGJ5IHVzaW5nIHRoZSBzbG93ZXIgc29mdHdhcmUgcmVuZGVyZXIgd2hlbiAzRCBhY2NlbGVyYXRpb24gaXMgbm90IGF2YWlsYWJsZS48L3A+XG4gKlxuICogPHA+SWYgeW91IHdvdWxkIHByZWZlciB0byBwZXJmb3JtIGEgYmF0Y2ggcmVuZGVyaW5nIGNvbW1hbmQsIHJhdGhlciB0aGFuIHVzaW5nIGFcbiAqIHNpbmdsZSBzdXJmYWNlIGZvciBlYWNoIEJpbGxib2FyZCBvYmplY3QsIHlvdSBjYW4gYWxzbyBkcmF3IHRvIHRoZSBzY3JlZW4gdXNpbmcgdGhlXG4gKiA8Y29kZT5kcmF3VGlsZXMoKTwvY29kZT4gb3IgPGNvZGU+ZHJhd1RyaWFuZ2xlcygpPC9jb2RlPiBtZXRob2RzIHdoaWNoIGFyZVxuICogYXZhaWxhYmxlIHRvIDxjb2RlPmZsYXNoLmRpc3BsYXkuVGlsZXNoZWV0PC9jb2RlPiBhbmQgPGNvZGU+Zmxhc2guZGlzcGxheS5HcmFwaGljc1xuICogb2JqZWN0cy48L2NvZGU+PC9wPlxuICpcbiAqIDxwPjxiPk5vdGU6PC9iPiBUaGUgQmlsbGJvYXJkIGNsYXNzIGlzIG5vdCBhIHN1YmNsYXNzIG9mIHRoZSBJbnRlcmFjdGl2ZU9iamVjdFxuICogY2xhc3MsIHNvIGl0IGNhbm5vdCBkaXNwYXRjaCBtb3VzZSBldmVudHMuIEhvd2V2ZXIsIHlvdSBjYW4gdXNlIHRoZVxuICogPGNvZGU+YWRkRXZlbnRMaXN0ZW5lcigpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIGRpc3BsYXkgb2JqZWN0IGNvbnRhaW5lciB0aGF0XG4gKiBjb250YWlucyB0aGUgQmlsbGJvYXJkIG9iamVjdC48L3A+XG4gKi9cblxuY2xhc3MgQmlsbGJvYXJkIGV4dGVuZHMgRGlzcGxheU9iamVjdCBpbXBsZW1lbnRzIElFbnRpdHksIElNYXRlcmlhbE93bmVyXG57XG5cdHByaXZhdGUgX2FuaW1hdG9yOklBbmltYXRvcjtcblx0cHJpdmF0ZSBfYmlsbGJvYXJkV2lkdGg6bnVtYmVyO1xuXHRwcml2YXRlIF9iaWxsYm9hcmRIZWlnaHQ6bnVtYmVyO1xuXHRwcml2YXRlIF9tYXRlcmlhbDpNYXRlcmlhbEJhc2U7XG5cdHByaXZhdGUgX3V2VHJhbnNmb3JtOlVWVHJhbnNmb3JtO1xuXG5cdHByaXZhdGUgb25TaXplQ2hhbmdlZERlbGVnYXRlOihldmVudDpNYXRlcmlhbEV2ZW50KSA9PiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSBhbmltYXRvciBvZiB0aGUgbWVzaC4gQWN0IG9uIHRoZSBtZXNoJ3MgZ2VvbWV0cnkuIERlZmF1bHRzIHRvIG51bGxcblx0ICovXG5cdHB1YmxpYyBnZXQgYW5pbWF0b3IoKTpJQW5pbWF0b3Jcblx0e1xuXHRcdHJldHVybiB0aGlzLl9hbmltYXRvcjtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBhc3NldFR5cGUoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBBc3NldFR5cGUuQklMTEJPQVJEO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBCaXRtYXBEYXRhIG9iamVjdCBiZWluZyByZWZlcmVuY2VkLlxuXHQgKi9cblx0cHVibGljIGJpdG1hcERhdGE6Qml0bWFwRGF0YTsgLy9UT0RPXG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGJpbGxib2FyZEhlaWdodCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JpbGxib2FyZEhlaWdodDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBiaWxsYm9hcmRXaWR0aCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JpbGxib2FyZFdpZHRoO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1hdGVyaWFsKCk6TWF0ZXJpYWxCYXNlXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWF0ZXJpYWw7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1hdGVyaWFsKHZhbHVlOk1hdGVyaWFsQmFzZSlcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9tYXRlcmlhbClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLl9tYXRlcmlhbCkge1xuXHRcdFx0dGhpcy5fbWF0ZXJpYWwuaVJlbW92ZU93bmVyKHRoaXMpO1xuXHRcdFx0dGhpcy5fbWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihNYXRlcmlhbEV2ZW50LlNJWkVfQ0hBTkdFRCwgdGhpcy5vblNpemVDaGFuZ2VkRGVsZWdhdGUpO1xuXHRcdH1cblxuXG5cdFx0dGhpcy5fbWF0ZXJpYWwgPSB2YWx1ZTtcblxuXHRcdGlmICh0aGlzLl9tYXRlcmlhbCkge1xuXHRcdFx0dGhpcy5fbWF0ZXJpYWwuaUFkZE93bmVyKHRoaXMpO1xuXHRcdFx0dGhpcy5fbWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lcihNYXRlcmlhbEV2ZW50LlNJWkVfQ0hBTkdFRCwgdGhpcy5vblNpemVDaGFuZ2VkRGVsZWdhdGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgQmlsbGJvYXJkIG9iamVjdCBpcyBzbmFwcGVkIHRvIHRoZSBuZWFyZXN0IHBpeGVsLlxuXHQgKiBUaGlzIHZhbHVlIGlzIGlnbm9yZWQgaW4gdGhlIG5hdGl2ZSBhbmQgSFRNTDUgdGFyZ2V0cy5cblx0ICogVGhlIFBpeGVsU25hcHBpbmcgY2xhc3MgaW5jbHVkZXMgcG9zc2libGUgdmFsdWVzOlxuXHQgKiA8dWw+XG5cdCAqICAgPGxpPjxjb2RlPlBpeGVsU25hcHBpbmcuTkVWRVI8L2NvZGU+IC0gTm8gcGl4ZWwgc25hcHBpbmcgb2NjdXJzLjwvbGk+XG5cdCAqICAgPGxpPjxjb2RlPlBpeGVsU25hcHBpbmcuQUxXQVlTPC9jb2RlPiAtIFRoZSBpbWFnZSBpcyBhbHdheXMgc25hcHBlZCB0b1xuXHQgKiB0aGUgbmVhcmVzdCBwaXhlbCwgaW5kZXBlbmRlbnQgb2YgdHJhbnNmb3JtYXRpb24uPC9saT5cblx0ICogICA8bGk+PGNvZGU+UGl4ZWxTbmFwcGluZy5BVVRPPC9jb2RlPiAtIFRoZSBpbWFnZSBpcyBzbmFwcGVkIHRvIHRoZVxuXHQgKiBuZWFyZXN0IHBpeGVsIGlmIGl0IGlzIGRyYXduIHdpdGggbm8gcm90YXRpb24gb3Igc2tldyBhbmQgaXQgaXMgZHJhd24gYXQgYVxuXHQgKiBzY2FsZSBmYWN0b3Igb2YgOTkuOSUgdG8gMTAwLjElLiBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQsIHRoZVxuXHQgKiBiaXRtYXAgaW1hZ2UgaXMgZHJhd24gYXQgMTAwJSBzY2FsZSwgc25hcHBlZCB0byB0aGUgbmVhcmVzdCBwaXhlbC5cblx0ICogV2hlbiB0YXJnZXRpbmcgRmxhc2ggUGxheWVyLCB0aGlzIHZhbHVlIGFsbG93cyB0aGUgaW1hZ2UgdG8gYmUgZHJhd24gYXMgZmFzdFxuXHQgKiBhcyBwb3NzaWJsZSB1c2luZyB0aGUgaW50ZXJuYWwgdmVjdG9yIHJlbmRlcmVyLjwvbGk+XG5cdCAqIDwvdWw+XG5cdCAqL1xuXHRwdWJsaWMgcGl4ZWxTbmFwcGluZzpzdHJpbmc7IC8vVE9ET1xuXG5cdC8qKlxuXHQgKiBDb250cm9scyB3aGV0aGVyIG9yIG5vdCB0aGUgYml0bWFwIGlzIHNtb290aGVkIHdoZW4gc2NhbGVkLiBJZlxuXHQgKiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIGJpdG1hcCBpcyBzbW9vdGhlZCB3aGVuIHNjYWxlZC4gSWZcblx0ICogPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgYml0bWFwIGlzIG5vdCBzbW9vdGhlZCB3aGVuIHNjYWxlZC5cblx0ICovXG5cdHB1YmxpYyBzbW9vdGhpbmc6Ym9vbGVhbjsgLy9UT0RPXG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHV2VHJhbnNmb3JtKCk6VVZUcmFuc2Zvcm1cblx0e1xuXHRcdHJldHVybiB0aGlzLl91dlRyYW5zZm9ybTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgdXZUcmFuc2Zvcm0odmFsdWU6VVZUcmFuc2Zvcm0pXG5cdHtcblx0XHR0aGlzLl91dlRyYW5zZm9ybSA9IHZhbHVlO1xuXHR9XG5cblx0Y29uc3RydWN0b3IobWF0ZXJpYWw6TWF0ZXJpYWxCYXNlLCBwaXhlbFNuYXBwaW5nOnN0cmluZyA9IFwiYXV0b1wiLCBzbW9vdGhpbmc6Ym9vbGVhbiA9IGZhbHNlKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX3BJc0VudGl0eSA9IHRydWU7XG5cblx0XHR0aGlzLm9uU2l6ZUNoYW5nZWREZWxlZ2F0ZSA9IChldmVudDpNYXRlcmlhbEV2ZW50KSA9PiB0aGlzLm9uU2l6ZUNoYW5nZWQoZXZlbnQpO1xuXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG5cdFx0dGhpcy5fYmlsbGJvYXJkV2lkdGggPSBtYXRlcmlhbC53aWR0aDtcblx0XHR0aGlzLl9iaWxsYm9hcmRIZWlnaHQgPSBtYXRlcmlhbC5oZWlnaHQ7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBDcmVhdGVFbnRpdHlQYXJ0aXRpb25Ob2RlKCk6RW50aXR5Tm9kZVxuXHR7XG5cdFx0cmV0dXJuIG5ldyBFbnRpdHlOb2RlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBwVXBkYXRlQm91bmRzKClcblx0e1xuXHRcdHRoaXMuX3BCb3VuZHMuZnJvbUV4dHJlbWVzKDAsIDAsIDAsIHRoaXMuX2JpbGxib2FyZFdpZHRoLCB0aGlzLl9iaWxsYm9hcmRIZWlnaHQsIDApO1xuXG5cdFx0c3VwZXIucFVwZGF0ZUJvdW5kcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIC8vVE9ET1xuXHQgKlxuXHQgKiBAcGFyYW0gc2hvcnRlc3RDb2xsaXNpb25EaXN0YW5jZVxuXHQgKiBAcGFyYW0gZmluZENsb3Nlc3Rcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIF9pVGVzdENvbGxpc2lvbihzaG9ydGVzdENvbGxpc2lvbkRpc3RhbmNlOm51bWJlciwgZmluZENsb3Nlc3Q6Ym9vbGVhbik6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BQaWNraW5nQ29sbGlkZXIudGVzdEJpbGxib2FyZENvbGxpc2lvbih0aGlzLCB0aGlzLl9wUGlja2luZ0NvbGxpc2lvblZPLCBzaG9ydGVzdENvbGxpc2lvbkRpc3RhbmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJpdmF0ZSBvblNpemVDaGFuZ2VkKGV2ZW50Ok1hdGVyaWFsRXZlbnQpXG5cdHtcblx0XHR0aGlzLl9iaWxsYm9hcmRXaWR0aCA9IHRoaXMuX21hdGVyaWFsLndpZHRoO1xuXHRcdHRoaXMuX2JpbGxib2FyZEhlaWdodCA9IHRoaXMuX21hdGVyaWFsLmhlaWdodDtcblxuXHRcdHRoaXMuX3BCb3VuZHNJbnZhbGlkID0gdHJ1ZTtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fcFJlbmRlcmFibGVzLmxlbmd0aDtcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCBsZW47IGkrKylcblx0XHRcdHRoaXMuX3BSZW5kZXJhYmxlc1tpXS5pbnZhbGlkYXRlVmVydGV4RGF0YShcInZlcnRpY2VzXCIpOyAvL1RPRE9cblx0fVxuXG5cdHB1YmxpYyBfaUNvbGxlY3RSZW5kZXJhYmxlcyhyZW5kZXJlcjpJUmVuZGVyZXIpXG5cdHtcblx0XHQvLyBTaW5jZSB0aGlzIGdldHRlciBpcyBpbnZva2VkIGV2ZXJ5IGl0ZXJhdGlvbiBvZiB0aGUgcmVuZGVyIGxvb3AsIGFuZFxuXHRcdC8vIHRoZSBwcmVmYWIgY29uc3RydWN0IGNvdWxkIGFmZmVjdCB0aGUgc3ViLW1lc2hlcywgdGhlIHByZWZhYiBpc1xuXHRcdC8vIHZhbGlkYXRlZCBoZXJlIHRvIGdpdmUgaXQgYSBjaGFuY2UgdG8gcmVidWlsZC5cblx0XHRpZiAodGhpcy5faVNvdXJjZVByZWZhYilcblx0XHRcdHRoaXMuX2lTb3VyY2VQcmVmYWIuX2lWYWxpZGF0ZSgpO1xuXG5cdFx0dGhpcy5faUNvbGxlY3RSZW5kZXJhYmxlKHJlbmRlcmVyKTtcblx0fVxuXG5cdHB1YmxpYyBfaUNvbGxlY3RSZW5kZXJhYmxlKHJlbmRlcmVyOklSZW5kZXJlcilcblx0e1xuXHRcdHJlbmRlcmVyLmFwcGx5QmlsbGJvYXJkKHRoaXMpO1xuXHR9XG59XG5cbmV4cG9ydCA9IEJpbGxib2FyZDsiXX0= \ No newline at end of file diff --git a/lib/entities/Billboard.ts b/lib/entities/Billboard.ts new file mode 100644 index 00000000..b3caee9a --- /dev/null +++ b/lib/entities/Billboard.ts @@ -0,0 +1,239 @@ +import IAnimator = require("awayjs-core/lib/animators/IAnimator"); +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * The Billboard class represents display objects that represent bitmap images. + * These can be images that you load with the flash.Assets or + * flash.display.Loader classes, or they can be images that you + * create with the Billboard() constructor. + * + *

The Billboard() constructor allows you to create a Billboard + * object that contains a reference to a BitmapData object. After you create a + * Billboard object, use the addChild() or addChildAt() + * method of the parent DisplayObjectContainer instance to place the bitmap on + * the display list.

+ * + *

A Billboard object can share its BitmapData reference among several Billboard + * objects, independent of translation or rotation properties. Because you can + * create multiple Billboard objects that reference the same BitmapData object, + * multiple display objects can use the same complex BitmapData object without + * incurring the memory overhead of a BitmapData object for each display + * object instance.

+ * + *

A BitmapData object can be drawn to the screen by a Billboard object in one + * of two ways: by using the default hardware renderer with a single hardware surface, + * or by using the slower software renderer when 3D acceleration is not available.

+ * + *

If you would prefer to perform a batch rendering command, rather than using a + * single surface for each Billboard object, you can also draw to the screen using the + * drawTiles() or drawTriangles() methods which are + * available to flash.display.Tilesheet and flash.display.Graphics + * objects.

+ * + *

Note: The Billboard class is not a subclass of the InteractiveObject + * class, so it cannot dispatch mouse events. However, you can use the + * addEventListener() method of the display object container that + * contains the Billboard object.

+ */ + +class Billboard extends DisplayObject implements IEntity, IMaterialOwner +{ + private _animator:IAnimator; + private _billboardWidth:number; + private _billboardHeight:number; + private _material:MaterialBase; + private _uvTransform:UVTransform; + + private onSizeChangedDelegate:(event:MaterialEvent) => void; + + /** + * Defines the animator of the mesh. Act on the mesh's geometry. Defaults to null + */ + public get animator():IAnimator + { + return this._animator; + } + + /** + * + */ + public get assetType():string + { + return AssetType.BILLBOARD; + } + + /** + * The BitmapData object being referenced. + */ + public bitmapData:BitmapData; //TODO + + /** + * + */ + public get billboardHeight():number + { + return this._billboardHeight; + } + + /** + * + */ + public get billboardWidth():number + { + return this._billboardWidth; + } + + /** + * + */ + public get material():MaterialBase + { + return this._material; + } + + public set material(value:MaterialBase) + { + if (value == this._material) + return; + + if (this._material) { + this._material.iRemoveOwner(this); + this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + + + this._material = value; + + if (this._material) { + this._material.iAddOwner(this); + this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + } + + /** + * Controls whether or not the Billboard object is snapped to the nearest pixel. + * This value is ignored in the native and HTML5 targets. + * The PixelSnapping class includes possible values: + *
    + *
  • PixelSnapping.NEVER - No pixel snapping occurs.
  • + *
  • PixelSnapping.ALWAYS - The image is always snapped to + * the nearest pixel, independent of transformation.
  • + *
  • PixelSnapping.AUTO - The image is snapped to the + * nearest pixel if it is drawn with no rotation or skew and it is drawn at a + * scale factor of 99.9% to 100.1%. If these conditions are satisfied, the + * bitmap image is drawn at 100% scale, snapped to the nearest pixel. + * When targeting Flash Player, this value allows the image to be drawn as fast + * as possible using the internal vector renderer.
  • + *
+ */ + public pixelSnapping:string; //TODO + + /** + * Controls whether or not the bitmap is smoothed when scaled. If + * true, the bitmap is smoothed when scaled. If + * false, the bitmap is not smoothed when scaled. + */ + public smoothing:boolean; //TODO + + /** + * + */ + public get uvTransform():UVTransform + { + return this._uvTransform; + } + + public set uvTransform(value:UVTransform) + { + this._uvTransform = value; + } + + constructor(material:MaterialBase, pixelSnapping:string = "auto", smoothing:boolean = false) + { + super(); + + this._pIsEntity = true; + + this.onSizeChangedDelegate = (event:MaterialEvent) => this.onSizeChanged(event); + + this.material = material; + + this._billboardWidth = material.width; + this._billboardHeight = material.height; + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():EntityNode + { + return new EntityNode(this); + } + + /** + * @protected + */ + public pUpdateBounds() + { + this._pBounds.fromExtremes(0, 0, 0, this._billboardWidth, this._billboardHeight, 0); + + super.pUpdateBounds(); + } + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + public _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean + { + return this._pPickingCollider.testBillboardCollision(this, this._pPickingCollisionVO, shortestCollisionDistance); + } + + /** + * @private + */ + private onSizeChanged(event:MaterialEvent) + { + this._billboardWidth = this._material.width; + this._billboardHeight = this._material.height; + + this._pBoundsInvalid = true; + + var len:number = this._pRenderables.length; + for (var i:number = 0; i < len; i++) + this._pRenderables[i].invalidateVertexData("vertices"); //TODO + } + + public _iCollectRenderables(renderer:IRenderer) + { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + } + + public _iCollectRenderable(renderer:IRenderer) + { + renderer.applyBillboard(this); + } +} + +export = Billboard; \ No newline at end of file diff --git a/lib/entities/Camera.js b/lib/entities/Camera.js new file mode 100755 index 00000000..7f0e8133 --- /dev/null +++ b/lib/entities/Camera.js @@ -0,0 +1,294 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var CameraNode = require("awayjs-core/lib/core/partition/CameraNode"); + +var CameraEvent = require("awayjs-core/lib/events/CameraEvent"); +var ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); + +var PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); + +var Camera = (function (_super) { + __extends(Camera, _super); + function Camera(projection) { + if (typeof projection === "undefined") { projection = null; } + var _this = this; + _super.call(this); + this._viewProjection = new Matrix3D(); + this._viewProjectionDirty = true; + this._frustumPlanesDirty = true; + + this._pIsEntity = true; + + this._onProjectionMatrixChangedDelegate = function (event) { + return _this.onProjectionMatrixChanged(event); + }; + + this._projection = projection || new PerspectiveProjection(); + this._projection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + + this._frustumPlanes = []; + + for (var i = 0; i < 6; ++i) + this._frustumPlanes[i] = new Plane3D(); + + this.z = -1000; + } + Camera.prototype.pCreateDefaultBoundingVolume = function () { + return new NullBounds(); + }; + + /** + * @protected + */ + Camera.prototype.pCreateEntityPartitionNode = function () { + return new CameraNode(this); + }; + + Object.defineProperty(Camera.prototype, "assetType", { + //@override + get: function () { + return AssetType.CAMERA; + }, + enumerable: true, + configurable: true + }); + + Camera.prototype.onProjectionMatrixChanged = function (event) { + this._viewProjectionDirty = true; + this._frustumPlanesDirty = true; + this.dispatchEvent(event); + }; + + Object.defineProperty(Camera.prototype, "frustumPlanes", { + get: function () { + if (this._frustumPlanesDirty) + this.updateFrustum(); + + return this._frustumPlanes; + }, + enumerable: true, + configurable: true + }); + + Camera.prototype.updateFrustum = function () { + var a, b, c; + + //var d : Number; + var c11, c12, c13, c14; + var c21, c22, c23, c24; + var c31, c32, c33, c34; + var c41, c42, c43, c44; + var p; + var raw = new Array(16); + ; + var invLen; + this.viewProjection.copyRawDataTo(raw); + + c11 = raw[0]; + c12 = raw[4]; + c13 = raw[8]; + c14 = raw[12]; + c21 = raw[1]; + c22 = raw[5]; + c23 = raw[9]; + c24 = raw[13]; + c31 = raw[2]; + c32 = raw[6]; + c33 = raw[10]; + c34 = raw[14]; + c41 = raw[3]; + c42 = raw[7]; + c43 = raw[11]; + c44 = raw[15]; + + // left plane + p = this._frustumPlanes[0]; + a = c41 + c11; + b = c42 + c12; + c = c43 + c13; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = -(c44 + c14) * invLen; + + // right plane + p = this._frustumPlanes[1]; + a = c41 - c11; + b = c42 - c12; + c = c43 - c13; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = (c14 - c44) * invLen; + + // bottom + p = this._frustumPlanes[2]; + a = c41 + c21; + b = c42 + c22; + c = c43 + c23; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = -(c44 + c24) * invLen; + + // top + p = this._frustumPlanes[3]; + a = c41 - c21; + b = c42 - c22; + c = c43 - c23; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = (c24 - c44) * invLen; + + // near + p = this._frustumPlanes[4]; + a = c31; + b = c32; + c = c33; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = -c34 * invLen; + + // far + p = this._frustumPlanes[5]; + a = c41 - c31; + b = c42 - c32; + c = c43 - c33; + invLen = 1 / Math.sqrt(a * a + b * b + c * c); + p.a = a * invLen; + p.b = b * invLen; + p.c = c * invLen; + p.d = (c34 - c44) * invLen; + + this._frustumPlanesDirty = false; + }; + + /** + * @protected + */ + Camera.prototype.pInvalidateSceneTransform = function () { + _super.prototype.pInvalidateSceneTransform.call(this); + + this._viewProjectionDirty = true; + this._frustumPlanesDirty = true; + }; + + /** + * @protected + */ + Camera.prototype.pUpdateBounds = function () { + this._pBoundsInvalid = false; + this._pBounds.nullify(); + }; + + Object.defineProperty(Camera.prototype, "projection", { + /** + * + */ + get: function () { + return this._projection; + }, + set: function (value) { + if (this._projection == value) + return; + + if (!value) + throw new Error("Projection cannot be null!"); + + this._projection.removeEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + this._projection = value; + this._projection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + this.dispatchEvent(new CameraEvent(CameraEvent.PROJECTION_CHANGED, this)); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Camera.prototype, "viewProjection", { + /** + * + */ + get: function () { + if (this._viewProjectionDirty) { + this._viewProjection.copyFrom(this.inverseSceneTransform); + this._viewProjection.append(this._projection.matrix); + this._viewProjectionDirty = false; + } + + return this._viewProjection; + }, + enumerable: true, + configurable: true + }); + + /** + * Calculates the ray in scene space from the camera to the given normalized coordinates in screen space. + * + * @param nX The normalised x coordinate in screen space, -1 corresponds to the left edge of the viewport, 1 to the right. + * @param nY The normalised y coordinate in screen space, -1 corresponds to the top edge of the viewport, 1 to the bottom. + * @param sZ The z coordinate in screen space, representing the distance into the screen. + * @return The ray from the camera to the scene space position of the given screen coordinates. + */ + Camera.prototype.getRay = function (nX, nY, sZ) { + return this.sceneTransform.deltaTransformVector(this._projection.unproject(nX, nY, sZ)); + }; + + /** + * Calculates the normalised position in screen space of the given scene position. + * + * @param point3d the position vector of the scene coordinates to be projected. + * @return The normalised screen position of the given scene coordinates. + */ + Camera.prototype.project = function (point3d) { + return this._projection.project(this.inverseSceneTransform.transformVector(point3d)); + }; + + /** + * Calculates the scene position of the given normalized coordinates in screen space. + * + * @param nX The normalised x coordinate in screen space, minus the originX offset of the projection property. + * @param nY The normalised y coordinate in screen space, minus the originY offset of the projection property. + * @param sZ The z coordinate in screen space, representing the distance into the screen. + * @return The scene position of the given screen coordinates. + */ + Camera.prototype.unproject = function (nX, nY, sZ) { + return this.sceneTransform.transformVector(this._projection.unproject(nX, nY, sZ)); + }; + + Camera.prototype._iCollectRenderables = function (renderer) { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + }; + + Camera.prototype._iCollectRenderable = function (renderer) { + //nothing to do here + }; + return Camera; +})(DisplayObjectContainer); + +module.exports = Camera; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL0NhbWVyYS50cyJdLCJuYW1lcyI6WyJDYW1lcmEiLCJDYW1lcmEuY29uc3RydWN0b3IiLCJDYW1lcmEucENyZWF0ZURlZmF1bHRCb3VuZGluZ1ZvbHVtZSIsIkNhbWVyYS5wQ3JlYXRlRW50aXR5UGFydGl0aW9uTm9kZSIsIkNhbWVyYS5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkIiwiQ2FtZXJhLnVwZGF0ZUZydXN0dW0iLCJDYW1lcmEucEludmFsaWRhdGVTY2VuZVRyYW5zZm9ybSIsIkNhbWVyYS5wVXBkYXRlQm91bmRzIiwiQ2FtZXJhLmdldFJheSIsIkNhbWVyYS5wcm9qZWN0IiwiQ2FtZXJhLnVucHJvamVjdCIsIkNhbWVyYS5faUNvbGxlY3RSZW5kZXJhYmxlcyIsIkNhbWVyYS5faUNvbGxlY3RSZW5kZXJhYmxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw2REFDb0U7QUFDcEUseUZBQTZGO0FBQzdGLDREQUFvRTtBQUNwRSwwREFBa0U7O0FBRWxFLGlFQUF3RTtBQUN4RSxxRUFBNEU7O0FBSTVFLCtEQUFzRTtBQUN0RSx1RUFBNkU7O0FBRTdFLHdGQUE0Rjs7QUFFNUY7SUFBcUJBLHlCQUFzQkE7SUFTMUNBLGdCQUFZQSxVQUE2QkE7UUFBN0JDLHlDQUFBQSxVQUFVQSxHQUFlQSxJQUFJQTtBQUFBQSxRQUF6Q0EsaUJBa0JDQTtRQWhCQUEsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFUUkEsS0FBUUEsZUFBZUEsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDbERBLEtBQVFBLG9CQUFvQkEsR0FBV0EsSUFBSUEsQ0FBQ0E7UUFHNUNBLEtBQVFBLG1CQUFtQkEsR0FBV0EsSUFBSUEsQ0FBQ0E7O1FBTzFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQTs7UUFFdEJBLElBQUlBLENBQUNBLGtDQUFrQ0EsR0FBR0EsVUFBQ0EsS0FBcUJBO21CQUFLQSxLQUFJQSxDQUFDQSx5QkFBeUJBLENBQUNBLEtBQUtBLENBQUNBO1FBQXJDQSxDQUFxQ0E7O1FBRTFHQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxVQUFVQSxJQUFJQSxJQUFJQSxxQkFBcUJBLENBQUNBLENBQUNBO1FBQzVEQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGVBQWVBLENBQUNBLGNBQWNBLEVBQUVBLElBQUlBLENBQUNBLGtDQUFrQ0EsQ0FBQ0E7O1FBRTFHQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxFQUFFQTs7UUFFeEJBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO1lBQ2hDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFeENBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBO0lBRWZBLENBQUNBO0lBRURELGdEQUFBQTtRQUVDRSxPQUFPQSxJQUFJQSxVQUFVQSxDQUFDQSxDQUFDQTtJQUN4QkEsQ0FBQ0E7O0lBS0RGOztNQURHQTtrREFDSEE7UUFFQ0csT0FBT0EsSUFBSUEsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFDNUJBLENBQUNBOztJQUdESDtRQUFBQSxXQURXQTthQUNYQTtZQUVDQSxPQUFPQSxTQUFTQSxDQUFDQSxNQUFNQTtRQUN4QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFFREEsNkNBQUFBLFVBQWtDQSxLQUFxQkE7UUFFdERJLElBQUlBLENBQUNBLG9CQUFvQkEsR0FBR0EsSUFBSUE7UUFDaENBLElBQUlBLENBQUNBLG1CQUFtQkEsR0FBR0EsSUFBSUE7UUFDL0JBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBO0lBQzFCQSxDQUFDQTs7SUFFREo7UUFBQUEsS0FBQUE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsbUJBQW1CQTtnQkFDM0JBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBOztZQUV0QkEsT0FBT0EsSUFBSUEsQ0FBQ0EsY0FBY0E7UUFDM0JBLENBQUNBOzs7O0FBQUFBO0lBRURBLGlDQUFBQTtRQUVDSyxJQUFJQSxDQUFDQSxFQUFTQSxDQUFDQSxFQUFTQSxDQUFDQTs7UUFDekJBLGlCQUFpQkE7UUFDakJBLElBQUlBLEdBQUdBLEVBQVNBLEdBQUdBLEVBQVNBLEdBQUdBLEVBQVNBLEdBQUdBO1FBQzNDQSxJQUFJQSxHQUFHQSxFQUFTQSxHQUFHQSxFQUFTQSxHQUFHQSxFQUFTQSxHQUFHQTtRQUMzQ0EsSUFBSUEsR0FBR0EsRUFBU0EsR0FBR0EsRUFBU0EsR0FBR0EsRUFBU0EsR0FBR0E7UUFDM0NBLElBQUlBLEdBQUdBLEVBQVNBLEdBQUdBLEVBQVNBLEdBQUdBLEVBQVNBLEdBQUdBO1FBQzNDQSxJQUFJQSxDQUFDQTtRQUNMQSxJQUFJQSxHQUFHQSxHQUFZQSxJQUFJQSxLQUFLQSxDQUFTQSxFQUFFQSxDQUFDQTtRQUN4Q0EsQ0FBQ0E7UUFDREEsSUFBSUEsTUFBTUE7UUFDVkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsYUFBYUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1FBRXRDQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUNiQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUNiQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUNiQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUNiQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTtRQUNiQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTs7UUFFYkEsYUFBYUE7UUFDYkEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDMUJBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ2JBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ2JBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ2JBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBO1FBQ3JDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQTtRQUNkQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQTtRQUNkQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQTtRQUNkQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQTs7UUFFekJBLGNBQWNBO1FBQ2RBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBO1FBQzFCQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUNiQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUNiQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtRQUNiQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQTtRQUNyQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsTUFBTUE7UUFDZEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsTUFBTUE7UUFDZEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsTUFBTUE7UUFDZEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsTUFBTUE7O1FBRXhCQSxTQUFTQTtRQUNUQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUMxQkEsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDYkEsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDYkEsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7UUFDYkEsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDckNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLE1BQU1BO1FBQ2RBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLE1BQU1BO1FBQ2RBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLE1BQU1BO1FBQ2RBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUNBLE1BQU1BOztRQUV6QkEsTUFBTUE7UUFDTkEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDMUJBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ2JBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ2JBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLEdBQUdBO1FBQ2JBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBO1FBQ3JDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQTtRQUNkQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQTtRQUNkQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQTtRQUNkQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxHQUFDQSxNQUFNQTs7UUFFeEJBLE9BQU9BO1FBQ1BBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBO1FBQzFCQSxDQUFDQSxHQUFHQSxHQUFHQTtRQUNQQSxDQUFDQSxHQUFHQSxHQUFHQTtRQUNQQSxDQUFDQSxHQUFHQSxHQUFHQTtRQUNQQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQTtRQUNyQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsTUFBTUE7UUFDZEEs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b0JBQW9CQTtJQUNyQkEsQ0FBQ0E7SUFDRlosY0FBQ0E7QUFBREEsQ0FBQ0EsRUFoUm9CLHNCQUFzQixFQWdSMUM7O0FBRUQsdUJBQWdCLENBQUEiLCJmaWxlIjoiZW50aXRpZXMvQ2FtZXJhLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJvdW5kaW5nVm9sdW1lQmFzZVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYm91bmRzL0JvdW5kaW5nVm9sdW1lQmFzZVwiKTtcbmltcG9ydCBOdWxsQm91bmRzXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYm91bmRzL051bGxCb3VuZHNcIik7XG5pbXBvcnQgRGlzcGxheU9iamVjdENvbnRhaW5lclx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRhaW5lcnMvRGlzcGxheU9iamVjdENvbnRhaW5lclwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFBsYW5lM0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9QbGFuZTNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgQXNzZXRUeXBlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0VHlwZVwiKTtcbmltcG9ydCBDYW1lcmFOb2RlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vQ2FtZXJhTm9kZVwiKTtcbmltcG9ydCBFbnRpdHlOb2RlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vRW50aXR5Tm9kZVwiKTtcbmltcG9ydCBJUmVuZGVyZXJcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9JUmVuZGVyZXJcIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcbmltcG9ydCBDYW1lcmFFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9DYW1lcmFFdmVudFwiKTtcbmltcG9ydCBQcm9qZWN0aW9uRXZlbnRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL1Byb2plY3Rpb25FdmVudFwiKTtcbmltcG9ydCBJUHJvamVjdGlvblx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3Byb2plY3Rpb25zL0lQcm9qZWN0aW9uXCIpO1xuaW1wb3J0IFBlcnNwZWN0aXZlUHJvamVjdGlvblx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3Byb2plY3Rpb25zL1BlcnNwZWN0aXZlUHJvamVjdGlvblwiKTtcblxuY2xhc3MgQ2FtZXJhIGV4dGVuZHMgRGlzcGxheU9iamVjdENvbnRhaW5lciBpbXBsZW1lbnRzIElFbnRpdHlcbntcblx0cHJpdmF0ZSBfdmlld1Byb2plY3Rpb246TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoKTtcblx0cHJpdmF0ZSBfdmlld1Byb2plY3Rpb25EaXJ0eTpCb29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfcHJvamVjdGlvbjpJUHJvamVjdGlvbjtcblx0cHJpdmF0ZSBfZnJ1c3R1bVBsYW5lczpBcnJheTxQbGFuZTNEPjtcblx0cHJpdmF0ZSBfZnJ1c3R1bVBsYW5lc0RpcnR5OkJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkRGVsZWdhdGU6KGV2ZW50OlByb2plY3Rpb25FdmVudCkgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3Rvcihwcm9qZWN0aW9uOklQcm9qZWN0aW9uID0gbnVsbClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9wSXNFbnRpdHkgPSB0cnVlO1xuXG5cdFx0dGhpcy5fb25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZERlbGVnYXRlID0gKGV2ZW50OlByb2plY3Rpb25FdmVudCkgPT4gdGhpcy5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkKGV2ZW50KTtcblxuXHRcdHRoaXMuX3Byb2plY3Rpb24gPSBwcm9qZWN0aW9uIHx8IG5ldyBQZXJzcGVjdGl2ZVByb2plY3Rpb24oKTtcblx0XHR0aGlzLl9wcm9qZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoUHJvamVjdGlvbkV2ZW50Lk1BVFJJWF9DSEFOR0VELCB0aGlzLl9vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkRGVsZWdhdGUpO1xuXG5cdFx0dGhpcy5fZnJ1c3R1bVBsYW5lcyA9IFtdO1xuXG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgNjsgKytpKVxuXHRcdFx0dGhpcy5fZnJ1c3R1bVBsYW5lc1tpXSA9IG5ldyBQbGFuZTNEKCk7XG5cblx0XHR0aGlzLnogPSAtMTAwMDtcblxuXHR9XG5cblx0cHVibGljIHBDcmVhdGVEZWZhdWx0Qm91bmRpbmdWb2x1bWUoKTpCb3VuZGluZ1ZvbHVtZUJhc2Vcblx0e1xuXHRcdHJldHVybiBuZXcgTnVsbEJvdW5kcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBwQ3JlYXRlRW50aXR5UGFydGl0aW9uTm9kZSgpOkVudGl0eU5vZGVcblx0e1xuXHRcdHJldHVybiBuZXcgQ2FtZXJhTm9kZSh0aGlzKTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBnZXQgYXNzZXRUeXBlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRUeXBlLkNBTUVSQTtcblx0fVxuXG5cdHByaXZhdGUgb25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZChldmVudDpQcm9qZWN0aW9uRXZlbnQpXG5cdHtcblx0XHR0aGlzLl92aWV3UHJvamVjdGlvbkRpcnR5ID0gdHJ1ZTtcblx0XHR0aGlzLl9mcnVzdHVtUGxhbmVzRGlydHkgPSB0cnVlO1xuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGZydXN0dW1QbGFuZXMoKTpBcnJheTxQbGFuZTNEPlxuXHR7XG5cdFx0aWYgKHRoaXMuX2ZydXN0dW1QbGFuZXNEaXJ0eSlcblx0XHRcdHRoaXMudXBkYXRlRnJ1c3R1bSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX2ZydXN0dW1QbGFuZXM7XG5cdH1cblxuXHRwcml2YXRlIHVwZGF0ZUZydXN0dW0oKVxuXHR7XG5cdFx0dmFyIGE6bnVtYmVyLCBiOm51bWJlciwgYzpudW1iZXI7XG5cdFx0Ly92YXIgZCA6IE51bWJlcjtcblx0XHR2YXIgYzExOm51bWJlciwgYzEyOm51bWJlciwgYzEzOm51bWJlciwgYzE0Om51bWJlcjtcblx0XHR2YXIgYzIxOm51bWJlciwgYzIyOm51bWJlciwgYzIzOm51bWJlciwgYzI0Om51bWJlcjtcblx0XHR2YXIgYzMxOm51bWJlciwgYzMyOm51bWJlciwgYzMzOm51bWJlciwgYzM0Om51bWJlcjtcblx0XHR2YXIgYzQxOm51bWJlciwgYzQyOm51bWJlciwgYzQzOm51bWJlciwgYzQ0Om51bWJlcjtcblx0XHR2YXIgcDpQbGFuZTNEO1xuXHRcdHZhciByYXc6bnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPigxNik7XG5cdFx0Oy8vbmV3IEFycmF5KDE2ICk7YXdheS51dGlscy5NYXRyaXgzRFV0aWxzLlJBV19EQVRBX0NPTlRBSU5FUjsvL1tdO1xuXHRcdHZhciBpbnZMZW46bnVtYmVyO1xuXHRcdHRoaXMudmlld1Byb2plY3Rpb24uY29weVJhd0RhdGFUbyhyYXcpO1xuXG5cdFx0YzExID0gcmF3WzBdO1xuXHRcdGMxMiA9IHJhd1s0XTtcblx0XHRjMTMgPSByYXdbOF07XG5cdFx0YzE0ID0gcmF3WzEyXTtcblx0XHRjMjEgPSByYXdbMV07XG5cdFx0YzIyID0gcmF3WzVdO1xuXHRcdGMyMyA9IHJhd1s5XTtcblx0XHRjMjQgPSByYXdbMTNdO1xuXHRcdGMzMSA9IHJhd1syXTtcblx0XHRjMzIgPSByYXdbNl07XG5cdFx0YzMzID0gcmF3WzEwXTtcblx0XHRjMzQgPSByYXdbMTRdO1xuXHRcdGM0MSA9IHJhd1szXTtcblx0XHRjNDIgPSByYXdbN107XG5cdFx0YzQzID0gcmF3WzExXTtcblx0XHRjNDQgPSByYXdbMTVdO1xuXG5cdFx0Ly8gbGVmdCBwbGFuZVxuXHRcdHAgPSB0aGlzLl9mcnVzdHVtUGxhbmVzWzBdO1xuXHRcdGEgPSBjNDEgKyBjMTE7XG5cdFx0YiA9IGM0MiArIGMxMjtcblx0XHRjID0gYzQzICsgYzEzO1xuXHRcdGludkxlbiA9IDEvTWF0aC5zcXJ0KGEqYSArIGIqYiArIGMqYyk7XG5cdFx0cC5hID0gYSppbnZMZW47XG5cdFx0cC5iID0gYippbnZMZW47XG5cdFx0cC5jID0gYyppbnZMZW47XG5cdFx0cC5kID0gLShjNDQgKyBjMTQpKmludkxlbjtcblxuXHRcdC8vIHJpZ2h0IHBsYW5lXG5cdFx0cCA9IHRoaXMuX2ZydXN0dW1QbGFuZXNbMV07XG5cdFx0YSA9IGM0MSAtIGMxMTtcblx0XHRiID0gYzQyIC0gYzEyO1xuXHRcdGMgPSBjNDMgLSBjMTM7XG5cdFx0aW52TGVuID0gMS9NYXRoLnNxcnQoYSphICsgYipiICsgYypjKTtcblx0XHRwLmEgPSBhKmludkxlbjtcblx0XHRwLmIgPSBiKmludkxlbjtcblx0XHRwLmMgPSBjKmludkxlbjtcblx0XHRwLmQgPSAoYzE0IC0gYzQ0KSppbnZMZW47XG5cblx0XHQvLyBib3R0b21cblx0XHRwID0gdGhpcy5fZnJ1c3R1bVBsYW5lc1syXTtcblx0XHRhID0gYzQxICsgYzIxO1xuXHRcdGIgPSBjNDIgKyBjMjI7XG5cdFx0YyA9IGM0MyArIGMyMztcblx0XHRpbnZMZW4gPSAxL01hdGguc3FydChhKmEgKyBiKmIgKyBjKmMpO1xuXHRcdHAuYSA9IGEqaW52TGVuO1xuXHRcdHAuYiA9IGIqaW52TGVuO1xuXHRcdHAuYyA9IGMqaW52TGVuO1xuXHRcdHAuZCA9IC0oYzQ0ICsgYzI0KSppbnZMZW47XG5cblx0XHQvLyB0b3Bcblx0XHRwID0gdGhpcy5fZnJ1c3R1bVBsYW5lc1szXTtcblx0XHRhID0gYzQxIC0gYzIxO1xuXHRcdGIgPSBjNDIgLSBjMjI7XG5cdFx0YyA9IGM0MyAtIGMyMztcblx0XHRpbnZMZW4gPSAxL01hdGguc3FydChhKmEgKyBiKmIgKyBjKmMpO1xuXHRcdHAuYSA9IGEqaW52TGVuO1xuXHRcdHAuYiA9IGIqaW52TGVuO1xuXHRcdHAuYyA9IGMqaW52TGVuO1xuXHRcdHAuZCA9IChjMjQgLSBjNDQpKmludkxlbjtcblxuXHRcdC8vIG5lYXJcblx0XHRwID0gdGhpcy5fZnJ1c3R1bVBsYW5lc1s0XTtcblx0XHRhID0gYzMxO1xuXHRcdGIgPSBjMzI7XG5cdFx0YyA9IGMzMztcblx0XHRpbnZMZW4gPSAxL01hdGguc3FydChhKmEgKyBiKmIgKyBjKmMpO1xuXHRcdHAuYSA9IGEqaW52TGVuO1xuXHRcdHAuYiA9IGIqaW52TGVuO1xuXHRcdHAuYyA9IGMqaW52TGVuO1xuXHRcdHAuZCA9IC1jMzQqaW52TGVuO1xuXG5cdFx0Ly8gZmFyXG5cdFx0cCA9IHRoaXMuX2ZydXN0dW1QbGFuZXNbNV07XG5cdFx0YSA9IGM0MSAtIGMzMTtcblx0XHRiID0gYzQyIC0gYzMyO1xuXHRcdGMgPSBjNDMgLSBjMzM7XG5cdFx0aW52TGVuID0gMS9NYXRoLnNxcnQoYSphICsgYipiICsgYypjKTtcblx0XHRwLmEgPSBhKmludkxlbjtcblx0XHRwLmIgPSBiKmludkxlbjtcblx0XHRwLmMgPSBjKmludkxlbjtcblx0XHRwLmQgPSAoYzM0IC0gYzQ0KSppbnZMZW47XG5cblx0XHR0aGlzLl9mcnVzdHVtUGxhbmVzRGlydHkgPSBmYWxzZTtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBwSW52YWxpZGF0ZVNjZW5lVHJhbnNmb3JtKClcblx0e1xuXHRcdHN1cGVyLnBJbnZhbGlkYXRlU2NlbmVUcmFuc2Zvcm0oKTtcblxuXHRcdHRoaXMuX3ZpZXdQcm9qZWN0aW9uRGlydHkgPSB0cnVlO1xuXHRcdHRoaXMuX2ZydXN0dW1QbGFuZXNEaXJ0eSA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBVcGRhdGVCb3VuZHMoKVxuXHR7XG5cdFx0dGhpcy5fcEJvdW5kc0ludmFsaWQgPSBmYWxzZTtcblx0XHR0aGlzLl9wQm91bmRzLm51bGxpZnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBwcm9qZWN0aW9uKCk6SVByb2plY3Rpb25cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wcm9qZWN0aW9uO1xuXHR9XG5cblx0cHVibGljIHNldCBwcm9qZWN0aW9uKHZhbHVlOklQcm9qZWN0aW9uKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3Byb2plY3Rpb24gPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAoIXZhbHVlKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiUHJvamVjdGlvbiBjYW5ub3QgYmUgbnVsbCFcIik7XG5cblx0XHR0aGlzLl9wcm9qZWN0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoUHJvamVjdGlvbkV2ZW50Lk1BVFJJWF9DSEFOR0VELCB0aGlzLl9vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkRGVsZWdhdGUpO1xuXHRcdHRoaXMuX3Byb2plY3Rpb24gPSB2YWx1ZTtcblx0XHR0aGlzLl9wcm9qZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoUHJvamVjdGlvbkV2ZW50Lk1BVFJJWF9DSEFOR0VELCB0aGlzLl9vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkRGVsZWdhdGUpO1xuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ2FtZXJhRXZlbnQoQ2FtZXJhRXZlbnQuUFJPSkVDVElPTl9DSEFOR0VELCB0aGlzKSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgdmlld1Byb2plY3Rpb24oKTpNYXRyaXgzRFxuXHR7XG5cdFx0aWYgKHRoaXMuX3ZpZXdQcm9qZWN0aW9uRGlydHkpIHtcblx0XHRcdHRoaXMuX3ZpZXdQcm9qZWN0aW9uLmNvcHlGcm9tKHRoaXMuaW52ZXJzZVNjZW5lVHJhbnNmb3JtKTtcblx0XHRcdHRoaXMuX3ZpZXdQcm9qZWN0aW9uLmFwcGVuZCh0aGlzLl9wcm9qZWN0aW9uLm1hdHJpeCk7XG5cdFx0XHR0aGlzLl92aWV3UHJvamVjdGlvbkRpcnR5ID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX3ZpZXdQcm9qZWN0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIHJheSBpbiBzY2VuZSBzcGFjZSBmcm9tIHRoZSBjYW1lcmEgdG8gdGhlIGdpdmVuIG5vcm1hbGl6ZWQgY29vcmRpbmF0ZXMgaW4gc2NyZWVuIHNwYWNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gblggVGhlIG5vcm1hbGlzZWQgeCBjb29yZGluYXRlIGluIHNjcmVlbiBzcGFjZSwgLTEgY29ycmVzcG9uZHMgdG8gdGhlIGxlZnQgZWRnZSBvZiB0aGUgdmlld3BvcnQsIDEgdG8gdGhlIHJpZ2h0LlxuXHQgKiBAcGFyYW0gblkgVGhlIG5vcm1hbGlzZWQgeSBjb29yZGluYXRlIGluIHNjcmVlbiBzcGFjZSwgLTEgY29ycmVzcG9uZHMgdG8gdGhlIHRvcCBlZGdlIG9mIHRoZSB2aWV3cG9ydCwgMSB0byB0aGUgYm90dG9tLlxuXHQgKiBAcGFyYW0gc1ogVGhlIHogY29vcmRpbmF0ZSBpbiBzY3JlZW4gc3BhY2UsIHJlcHJlc2VudGluZyB0aGUgZGlzdGFuY2UgaW50byB0aGUgc2NyZWVuLlxuXHQgKiBAcmV0dXJuIFRoZSByYXkgZnJvbSB0aGUgY2FtZXJhIHRvIHRoZSBzY2VuZSBzcGFjZSBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gc2NyZWVuIGNvb3JkaW5hdGVzLlxuXHQgKi9cblx0cHVibGljIGdldFJheShuWDpudW1iZXIsIG5ZOm51bWJlciwgc1o6bnVtYmVyKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuc2NlbmVUcmFuc2Zvcm0uZGVsdGFUcmFuc2Zvcm1WZWN0b3IodGhpcy5fcHJvamVjdGlvbi51bnByb2plY3QoblgsIG5ZLCBzWikpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIG5vcm1hbGlzZWQgcG9zaXRpb24gaW4gc2NyZWVuIHNwYWNlIG9mIHRoZSBnaXZlbiBzY2VuZSBwb3NpdGlvbi5cblx0ICpcblx0ICogQHBhcmFtIHBvaW50M2QgdGhlIHBvc2l0aW9uIHZlY3RvciBvZiB0aGUgc2NlbmUgY29vcmRpbmF0ZXMgdG8gYmUgcHJvamVjdGVkLlxuXHQgKiBAcmV0dXJuIFRoZSBub3JtYWxpc2VkIHNjcmVlbiBwb3NpdGlvbiBvZiB0aGUgZ2l2ZW4gc2NlbmUgY29vcmRpbmF0ZXMuXG5cdCAqL1xuXHRwdWJsaWMgcHJvamVjdChwb2ludDNkOlZlY3RvcjNEKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3Byb2plY3Rpb24ucHJvamVjdCh0aGlzLmludmVyc2VTY2VuZVRyYW5zZm9ybS50cmFuc2Zvcm1WZWN0b3IocG9pbnQzZCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENhbGN1bGF0ZXMgdGhlIHNjZW5lIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBub3JtYWxpemVkIGNvb3JkaW5hdGVzIGluIHNjcmVlbiBzcGFjZS5cblx0ICpcblx0ICogQHBhcmFtIG5YIFRoZSBub3JtYWxpc2VkIHggY29vcmRpbmF0ZSBpbiBzY3JlZW4gc3BhY2UsIG1pbnVzIHRoZSBvcmlnaW5YIG9mZnNldCBvZiB0aGUgcHJvamVjdGlvbiBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIG5ZIFRoZSBub3JtYWxpc2VkIHkgY29vcmRpbmF0ZSBpbiBzY3JlZW4gc3BhY2UsIG1pbnVzIHRoZSBvcmlnaW5ZIG9mZnNldCBvZiB0aGUgcHJvamVjdGlvbiBwcm9wZXJ0eS5cblx0ICogQHBhcmFtIHNaIFRoZSB6IGNvb3JkaW5hdGUgaW4gc2NyZWVuIHNwYWNlLCByZXByZXNlbnRpbmcgdGhlIGRpc3RhbmNlIGludG8gdGhlIHNjcmVlbi5cblx0ICogQHJldHVybiBUaGUgc2NlbmUgcG9zaXRpb24gb2YgdGhlIGdpdmVuIHNjcmVlbiBjb29yZGluYXRlcy5cblx0ICovXG5cdHB1YmxpYyB1bnByb2plY3Qoblg6bnVtYmVyLCBuWTpudW1iZXIsIHNaOm51bWJlcik6VmVjdG9yM0Rcblx0e1xuXHRcdHJldHVybiB0aGlzLnNjZW5lVHJhbnNmb3JtLnRyYW5zZm9ybVZlY3Rvcih0aGlzLl9wcm9qZWN0aW9uLnVucHJvamVjdChuWCwgblksIHNaKSk7XG5cdH1cblxuXHRwdWJsaWMgX2lDb2xsZWN0UmVuZGVyYWJsZXMocmVuZGVyZXI6SVJlbmRlcmVyKVxuXHR7XG5cdFx0Ly8gU2luY2UgdGhpcyBnZXR0ZXIgaXMgaW52b2tlZCBldmVyeSBpdGVyYXRpb24gb2YgdGhlIHJlbmRlciBsb29wLCBhbmRcblx0XHQvLyB0aGUgcHJlZmFiIGNvbnN0cnVjdCBjb3VsZCBhZmZlY3QgdGhlIHN1Yi1tZXNoZXMsIHRoZSBwcmVmYWIgaXNcblx0XHQvLyB2YWxpZGF0ZWQgaGVyZSB0byBnaXZlIGl0IGEgY2hhbmNlIHRvIHJlYnVpbGQuXG5cdFx0aWYgKHRoaXMuX2lTb3VyY2VQcmVmYWIpXG5cdFx0XHR0aGlzLl9pU291cmNlUHJlZmFiLl9pVmFsaWRhdGUoKTtcblxuXHRcdHRoaXMuX2lDb2xsZWN0UmVuZGVyYWJsZShyZW5kZXJlcik7XG5cdH1cblxuXHRwdWJsaWMgX2lDb2xsZWN0UmVuZGVyYWJsZShyZW5kZXJlcjpJUmVuZGVyZXIpXG5cdHtcblx0XHQvL25vdGhpbmcgdG8gZG8gaGVyZVxuXHR9XG59XG5cbmV4cG9ydCA9IENhbWVyYTsiXX0= \ No newline at end of file diff --git a/lib/entities/Camera.ts b/lib/entities/Camera.ts new file mode 100644 index 00000000..46ea59ad --- /dev/null +++ b/lib/entities/Camera.ts @@ -0,0 +1,291 @@ +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import CameraNode = require("awayjs-core/lib/core/partition/CameraNode"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import CameraEvent = require("awayjs-core/lib/events/CameraEvent"); +import ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); +import IProjection = require("awayjs-core/lib/projections/IProjection"); +import PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); + +class Camera extends DisplayObjectContainer implements IEntity +{ + private _viewProjection:Matrix3D = new Matrix3D(); + private _viewProjectionDirty:Boolean = true; + private _projection:IProjection; + private _frustumPlanes:Array; + private _frustumPlanesDirty:Boolean = true; + private _onProjectionMatrixChangedDelegate:(event:ProjectionEvent) => void; + + constructor(projection:IProjection = null) + { + super(); + + this._pIsEntity = true; + + this._onProjectionMatrixChangedDelegate = (event:ProjectionEvent) => this.onProjectionMatrixChanged(event); + + this._projection = projection || new PerspectiveProjection(); + this._projection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + + this._frustumPlanes = []; + + for (var i:number = 0; i < 6; ++i) + this._frustumPlanes[i] = new Plane3D(); + + this.z = -1000; + + } + + public pCreateDefaultBoundingVolume():BoundingVolumeBase + { + return new NullBounds(); + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():EntityNode + { + return new CameraNode(this); + } + + //@override + public get assetType():string + { + return AssetType.CAMERA; + } + + private onProjectionMatrixChanged(event:ProjectionEvent) + { + this._viewProjectionDirty = true; + this._frustumPlanesDirty = true; + this.dispatchEvent(event); + } + + public get frustumPlanes():Array + { + if (this._frustumPlanesDirty) + this.updateFrustum(); + + return this._frustumPlanes; + } + + private updateFrustum() + { + var a:number, b:number, c:number; + //var d : Number; + var c11:number, c12:number, c13:number, c14:number; + var c21:number, c22:number, c23:number, c24:number; + var c31:number, c32:number, c33:number, c34:number; + var c41:number, c42:number, c43:number, c44:number; + var p:Plane3D; + var raw:number[] = new Array(16); + ;//new Array(16 );away.utils.Matrix3DUtils.RAW_DATA_CONTAINER;//[]; + var invLen:number; + this.viewProjection.copyRawDataTo(raw); + + c11 = raw[0]; + c12 = raw[4]; + c13 = raw[8]; + c14 = raw[12]; + c21 = raw[1]; + c22 = raw[5]; + c23 = raw[9]; + c24 = raw[13]; + c31 = raw[2]; + c32 = raw[6]; + c33 = raw[10]; + c34 = raw[14]; + c41 = raw[3]; + c42 = raw[7]; + c43 = raw[11]; + c44 = raw[15]; + + // left plane + p = this._frustumPlanes[0]; + a = c41 + c11; + b = c42 + c12; + c = c43 + c13; + invLen = 1/Math.sqrt(a*a + b*b + c*c); + p.a = a*invLen; + p.b = b*invLen; + p.c = c*invLen; + p.d = -(c44 + c14)*invLen; + + // right plane + p = this._frustumPlanes[1]; + a = c41 - c11; + b = c42 - c12; + c = c43 - c13; + invLen = 1/Math.sqrt(a*a + b*b + c*c); + p.a = a*invLen; + p.b = b*invLen; + p.c = c*invLen; + p.d = (c14 - c44)*invLen; + + // bottom + p = this._frustumPlanes[2]; + a = c41 + c21; + b = c42 + c22; + c = c43 + c23; + invLen = 1/Math.sqrt(a*a + b*b + c*c); + p.a = a*invLen; + p.b = b*invLen; + p.c = c*invLen; + p.d = -(c44 + c24)*invLen; + + // top + p = this._frustumPlanes[3]; + a = c41 - c21; + b = c42 - c22; + c = c43 - c23; + invLen = 1/Math.sqrt(a*a + b*b + c*c); + p.a = a*invLen; + p.b = b*invLen; + p.c = c*invLen; + p.d = (c24 - c44)*invLen; + + // near + p = this._frustumPlanes[4]; + a = c31; + b = c32; + c = c33; + invLen = 1/Math.sqrt(a*a + b*b + c*c); + p.a = a*invLen; + p.b = b*invLen; + p.c = c*invLen; + p.d = -c34*invLen; + + // far + p = this._frustumPlanes[5]; + a = c41 - c31; + b = c42 - c32; + c = c43 - c33; + invLen = 1/Math.sqrt(a*a + b*b + c*c); + p.a = a*invLen; + p.b = b*invLen; + p.c = c*invLen; + p.d = (c34 - c44)*invLen; + + this._frustumPlanesDirty = false; + + } + + /** + * @protected + */ + public pInvalidateSceneTransform() + { + super.pInvalidateSceneTransform(); + + this._viewProjectionDirty = true; + this._frustumPlanesDirty = true; + } + + /** + * @protected + */ + public pUpdateBounds() + { + this._pBoundsInvalid = false; + this._pBounds.nullify(); + } + + /** + * + */ + public get projection():IProjection + { + return this._projection; + } + + public set projection(value:IProjection) + { + if (this._projection == value) + return; + + if (!value) + throw new Error("Projection cannot be null!"); + + this._projection.removeEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + this._projection = value; + this._projection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + this.dispatchEvent(new CameraEvent(CameraEvent.PROJECTION_CHANGED, this)); + } + + /** + * + */ + public get viewProjection():Matrix3D + { + if (this._viewProjectionDirty) { + this._viewProjection.copyFrom(this.inverseSceneTransform); + this._viewProjection.append(this._projection.matrix); + this._viewProjectionDirty = false; + } + + return this._viewProjection; + } + + /** + * Calculates the ray in scene space from the camera to the given normalized coordinates in screen space. + * + * @param nX The normalised x coordinate in screen space, -1 corresponds to the left edge of the viewport, 1 to the right. + * @param nY The normalised y coordinate in screen space, -1 corresponds to the top edge of the viewport, 1 to the bottom. + * @param sZ The z coordinate in screen space, representing the distance into the screen. + * @return The ray from the camera to the scene space position of the given screen coordinates. + */ + public getRay(nX:number, nY:number, sZ:number):Vector3D + { + return this.sceneTransform.deltaTransformVector(this._projection.unproject(nX, nY, sZ)); + } + + /** + * Calculates the normalised position in screen space of the given scene position. + * + * @param point3d the position vector of the scene coordinates to be projected. + * @return The normalised screen position of the given scene coordinates. + */ + public project(point3d:Vector3D):Vector3D + { + return this._projection.project(this.inverseSceneTransform.transformVector(point3d)); + } + + /** + * Calculates the scene position of the given normalized coordinates in screen space. + * + * @param nX The normalised x coordinate in screen space, minus the originX offset of the projection property. + * @param nY The normalised y coordinate in screen space, minus the originY offset of the projection property. + * @param sZ The z coordinate in screen space, representing the distance into the screen. + * @return The scene position of the given screen coordinates. + */ + public unproject(nX:number, nY:number, sZ:number):Vector3D + { + return this.sceneTransform.transformVector(this._projection.unproject(nX, nY, sZ)); + } + + public _iCollectRenderables(renderer:IRenderer) + { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + } + + public _iCollectRenderable(renderer:IRenderer) + { + //nothing to do here + } +} + +export = Camera; \ No newline at end of file diff --git a/lib/entities/DirectionalLight.js b/lib/entities/DirectionalLight.js new file mode 100755 index 00000000..7188e66e --- /dev/null +++ b/lib/entities/DirectionalLight.js @@ -0,0 +1,169 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +var LightBase = require("awayjs-core/lib/core/base/LightBase"); +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var DirectionalLightNode = require("awayjs-core/lib/core/partition/DirectionalLightNode"); + +var DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + +var DirectionalLight = (function (_super) { + __extends(DirectionalLight, _super); + function DirectionalLight(xDir, yDir, zDir) { + if (typeof xDir === "undefined") { xDir = 0; } + if (typeof yDir === "undefined") { yDir = -1; } + if (typeof zDir === "undefined") { zDir = 1; } + _super.call(this); + + this._pIsEntity = true; + + this.direction = new Vector3D(xDir, yDir, zDir); + + this._sceneDirection = new Vector3D(); + } + Object.defineProperty(DirectionalLight.prototype, "sceneDirection", { + get: function () { + if (this._pSceneTransformDirty) + this.pUpdateSceneTransform(); + + return this._sceneDirection; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DirectionalLight.prototype, "direction", { + get: function () { + return this._direction; + }, + set: function (value) { + this._direction = value; + + if (!this._tmpLookAt) + this._tmpLookAt = new Vector3D(); + + this._tmpLookAt.x = this.x + this._direction.x; + this._tmpLookAt.y = this.y + this._direction.y; + this._tmpLookAt.z = this.z + this._direction.z; + + this.lookAt(this._tmpLookAt); + }, + enumerable: true, + configurable: true + }); + + + /** + * + * @returns {away.bounds.NullBounds} + */ + DirectionalLight.prototype.pCreateDefaultBoundingVolume = function () { + //directional lights are to be considered global, hence always in view + return new NullBounds(); + }; + + /** + * + */ + DirectionalLight.prototype.pUpdateBounds = function () { + }; + + //@override + DirectionalLight.prototype.pUpdateSceneTransform = function () { + _super.prototype.pUpdateSceneTransform.call(this); + this.sceneTransform.copyColumnTo(2, this._sceneDirection); + this._sceneDirection.normalize(); + }; + + //@override + DirectionalLight.prototype.pCreateShadowMapper = function () { + return new DirectionalShadowMapper(); + }; + + /** + * @protected + */ + DirectionalLight.prototype.pCreateEntityPartitionNode = function () { + return new DirectionalLightNode(this); + }; + + //override + DirectionalLight.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { + if (typeof target === "undefined") { target = null; } + var raw = new Array(); + var bounds = entity.bounds; + var m = new Matrix3D(); + + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this.inverseSceneTransform); + + if (!this._projAABBPoints) + this._projAABBPoints = []; + + m.transformVectors(bounds.aabbPoints, this._projAABBPoints); + + var xMin = Infinity, xMax = -Infinity; + var yMin = Infinity, yMax = -Infinity; + var zMin = Infinity, zMax = -Infinity; + var d; + for (var i = 0; i < 24;) { + d = this._projAABBPoints[i++]; + + if (d < xMin) + xMin = d; + + if (d > xMax) + xMax = d; + + d = this._projAABBPoints[i++]; + + if (d < yMin) + yMin = d; + + if (d > yMax) + yMax = d; + + d = this._projAABBPoints[i++]; + + if (d < zMin) + zMin = d; + + if (d > zMax) + zMax = d; + } + + var invXRange = 1 / (xMax - xMin); + var invYRange = 1 / (yMax - yMin); + var invZRange = 1 / (zMax - zMin); + raw[0] = 2 * invXRange; + raw[5] = 2 * invYRange; + raw[10] = invZRange; + raw[12] = -(xMax + xMin) * invXRange; + raw[13] = -(yMax + yMin) * invYRange; + raw[14] = -zMin * invZRange; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + raw[15] = 1; + + if (!target) + target = new Matrix3D(); + + target.copyRawDataFrom(raw); + target.prepend(m); + + return target; + }; + + DirectionalLight.prototype._iCollectRenderables = function (renderer) { + //nothing to do here + }; + return DirectionalLight; +})(LightBase); + +module.exports = DirectionalLight; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL0RpcmVjdGlvbmFsTGlnaHQudHMiXSwibmFtZXMiOlsiRGlyZWN0aW9uYWxMaWdodCIsIkRpcmVjdGlvbmFsTGlnaHQuY29uc3RydWN0b3IiLCJEaXJlY3Rpb25hbExpZ2h0LnBDcmVhdGVEZWZhdWx0Qm91bmRpbmdWb2x1bWUiLCJEaXJlY3Rpb25hbExpZ2h0LnBVcGRhdGVCb3VuZHMiLCJEaXJlY3Rpb25hbExpZ2h0LnBVcGRhdGVTY2VuZVRyYW5zZm9ybSIsIkRpcmVjdGlvbmFsTGlnaHQucENyZWF0ZVNoYWRvd01hcHBlciIsIkRpcmVjdGlvbmFsTGlnaHQucENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUiLCJEaXJlY3Rpb25hbExpZ2h0LmlHZXRPYmplY3RQcm9qZWN0aW9uTWF0cml4IiwiRGlyZWN0aW9uYWxMaWdodC5faUNvbGxlY3RSZW5kZXJhYmxlcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNkRBQ3FFO0FBQ3JFLDhEQUFzRTtBQUN0RSw0REFBcUU7QUFDckUsNERBQXFFO0FBQ3JFLHlGQUErRjs7QUFLL0Ysd0dBQTZHOztBQUU3RztJQUErQkEsbUNBQVNBO0lBT3ZDQSwwQkFBWUEsSUFBZUEsRUFBRUEsSUFBZ0JBLEVBQUVBLElBQWVBO1FBQWxEQyxtQ0FBQUEsSUFBSUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsbUNBQUFBLElBQUlBLEdBQVVBLENBQUNBLENBQUNBO0FBQUFBLFFBQUVBLG1DQUFBQSxJQUFJQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUU3REEsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBOztRQUV0QkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsSUFBSUEsRUFBRUEsSUFBSUEsRUFBRUEsSUFBSUEsQ0FBQ0E7O1FBRS9DQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTtJQUN0Q0Es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SUEsR0FBVUEsQ0FBQ0EsUUFBUUE7UUFDbkRBLElBQUlBLElBQUlBLEdBQVVBLFFBQVFBLEVBQUVBLElBQUlBLEdBQVVBLENBQUNBLFFBQVFBO1FBQ25EQSxJQUFJQSxJQUFJQSxHQUFVQSxRQUFRQSxFQUFFQSxJQUFJQSxHQUFVQSxDQUFDQSxRQUFRQTtRQUNuREEsSUFBSUEsQ0FBQ0E7UUFDTEEsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFBR0E7WUFDL0JBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBOztZQUU3QkEsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUE7Z0JBQ1hBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBOztZQUVWQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQTtnQkFDWEEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1lBRVZBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBOztZQUU3QkEsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUE7Z0JBQ1hBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBOztZQUVWQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQTtnQkFDWEEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1lBRVZBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBOztZQUU3QkEsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUE7Z0JBQ1hBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBOztZQUVWQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQTtnQkFDWEEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDVkE7O1FBRURBLElBQUlBLFNBQVNBLEdBQVVBLENBQUNBLEdBQUNBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBO1FBQ3RDQSxJQUFJQSxTQUFTQSxHQUFVQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQTtRQUN0Q0EsSUFBSUEsU0FBU0EsR0FBVUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDdENBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLFNBQVNBO1FBQ3BCQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxTQUFTQTtRQUNwQkEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsU0FBU0E7UUFDbkJBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLEdBQUNBLFNBQVNBO1FBQ2xDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxHQUFDQSxTQUFTQTtRQUNsQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsU0FBU0E7UUFDekJBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ25GQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFWEEsSUFBSUEsQ0FBQ0EsTUFBTUE7WUFDVkEsTUFBTUEsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRXpCQSxNQUFNQSxDQUFDQSxlQUFlQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUMzQkEsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRWpCQSxPQUFPQSxNQUFNQTtJQUNkQSxDQUFDQTs7SUFFRFAsa0RBQUFBLFVBQTRCQSxRQUFrQkE7UUFFN0NRLG9CQUFvQkE7SUFDckJBLENBQUNBO0lBQ0ZSLHdCQUFDQTtBQUFEQSxDQUFDQSxFQTFKOEIsU0FBUyxFQTBKdkM7O0FBRUQsaUNBQTBCLENBQUEiLCJmaWxlIjoiZW50aXRpZXMvRGlyZWN0aW9uYWxMaWdodC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCb3VuZGluZ1ZvbHVtZUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYm91bmRzL0JvdW5kaW5nVm9sdW1lQmFzZVwiKTtcbmltcG9ydCBOdWxsQm91bmRzXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ib3VuZHMvTnVsbEJvdW5kc1wiKTtcbmltcG9ydCBMaWdodEJhc2VcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaWdodEJhc2VcIik7XG5pbXBvcnQgTWF0cml4M0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBEaXJlY3Rpb25hbExpZ2h0Tm9kZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9EaXJlY3Rpb25hbExpZ2h0Tm9kZVwiKTtcbmltcG9ydCBFbnRpdHlOb2RlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9FbnRpdHlOb2RlXCIpO1xuaW1wb3J0IElSZW5kZXJlclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvSVJlbmRlcmVyXCIpO1xuaW1wb3J0IENhbWVyYVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9DYW1lcmFcIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9JRW50aXR5XCIpO1xuaW1wb3J0IERpcmVjdGlvbmFsU2hhZG93TWFwcGVyXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvc2hhZG93bWFwcGVycy9EaXJlY3Rpb25hbFNoYWRvd01hcHBlclwiKTtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodCBleHRlbmRzIExpZ2h0QmFzZSBpbXBsZW1lbnRzIElFbnRpdHlcbntcblx0cHJpdmF0ZSBfZGlyZWN0aW9uOlZlY3RvcjNEO1xuXHRwcml2YXRlIF90bXBMb29rQXQ6VmVjdG9yM0Q7XG5cdHByaXZhdGUgX3NjZW5lRGlyZWN0aW9uOlZlY3RvcjNEO1xuXHRwcml2YXRlIF9wcm9qQUFCQlBvaW50czpBcnJheTxudW1iZXI+O1xuXG5cdGNvbnN0cnVjdG9yKHhEaXI6bnVtYmVyID0gMCwgeURpcjpudW1iZXIgPSAtMSwgekRpcjpudW1iZXIgPSAxKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX3BJc0VudGl0eSA9IHRydWU7XG5cblx0XHR0aGlzLmRpcmVjdGlvbiA9IG5ldyBWZWN0b3IzRCh4RGlyLCB5RGlyLCB6RGlyKTtcblxuXHRcdHRoaXMuX3NjZW5lRGlyZWN0aW9uID0gbmV3IFZlY3RvcjNEKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHNjZW5lRGlyZWN0aW9uKCk6VmVjdG9yM0Rcblx0e1xuXHRcdGlmICh0aGlzLl9wU2NlbmVUcmFuc2Zvcm1EaXJ0eSlcblx0XHRcdHRoaXMucFVwZGF0ZVNjZW5lVHJhbnNmb3JtKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fc2NlbmVEaXJlY3Rpb247XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRpcmVjdGlvbigpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuXHR9XG5cblx0cHVibGljIHNldCBkaXJlY3Rpb24odmFsdWU6VmVjdG9yM0QpXG5cdHtcblx0XHR0aGlzLl9kaXJlY3Rpb24gPSB2YWx1ZTtcblxuXHRcdGlmICghdGhpcy5fdG1wTG9va0F0KVxuXHRcdFx0dGhpcy5fdG1wTG9va0F0ID0gbmV3IFZlY3RvcjNEKCk7XG5cblx0XHR0aGlzLl90bXBMb29rQXQueCA9IHRoaXMueCArIHRoaXMuX2RpcmVjdGlvbi54O1xuXHRcdHRoaXMuX3RtcExvb2tBdC55ID0gdGhpcy55ICsgdGhpcy5fZGlyZWN0aW9uLnk7XG5cdFx0dGhpcy5fdG1wTG9va0F0LnogPSB0aGlzLnogKyB0aGlzLl9kaXJlY3Rpb24uejtcblxuXHRcdHRoaXMubG9va0F0KHRoaXMuX3RtcExvb2tBdCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge2F3YXkuYm91bmRzLk51bGxCb3VuZHN9XG5cdCAqL1xuXHRwdWJsaWMgcENyZWF0ZURlZmF1bHRCb3VuZGluZ1ZvbHVtZSgpOkJvdW5kaW5nVm9sdW1lQmFzZVxuXHR7XG5cdFx0Ly9kaXJlY3Rpb25hbCBsaWdodHMgYXJlIHRvIGJlIGNvbnNpZGVyZWQgZ2xvYmFsLCBoZW5jZSBhbHdheXMgaW4gdmlld1xuXHRcdHJldHVybiBuZXcgTnVsbEJvdW5kcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgcFVwZGF0ZUJvdW5kcygpXG5cdHtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBwVXBkYXRlU2NlbmVUcmFuc2Zvcm0oKVxuXHR7XG5cdFx0c3VwZXIucFVwZGF0ZVNjZW5lVHJhbnNmb3JtKCk7XG5cdFx0dGhpcy5zY2VuZVRyYW5zZm9ybS5jb3B5Q29sdW1uVG8oMiwgdGhpcy5fc2NlbmVEaXJlY3Rpb24pO1xuXHRcdHRoaXMuX3NjZW5lRGlyZWN0aW9uLm5vcm1hbGl6ZSgpO1xuXHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIHBDcmVhdGVTaGFkb3dNYXBwZXIoKTpEaXJlY3Rpb25hbFNoYWRvd01hcHBlclxuXHR7XG5cdFx0cmV0dXJuIG5ldyBEaXJlY3Rpb25hbFNoYWRvd01hcHBlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBwQ3JlYXRlRW50aXR5UGFydGl0aW9uTm9kZSgpOkVudGl0eU5vZGVcblx0e1xuXHRcdHJldHVybiBuZXcgRGlyZWN0aW9uYWxMaWdodE5vZGUodGhpcyk7XG5cdH1cblxuXHQvL292ZXJyaWRlXG5cdHB1YmxpYyBpR2V0T2JqZWN0UHJvamVjdGlvbk1hdHJpeChlbnRpdHk6SUVudGl0eSwgY2FtZXJhOkNhbWVyYSwgdGFyZ2V0Ok1hdHJpeDNEID0gbnVsbCk6TWF0cml4M0Rcblx0e1xuXHRcdHZhciByYXc6QXJyYXk8bnVtYmVyPiA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cdFx0dmFyIGJvdW5kczpCb3VuZGluZ1ZvbHVtZUJhc2UgPSBlbnRpdHkuYm91bmRzO1xuXHRcdHZhciBtOk1hdHJpeDNEID0gbmV3IE1hdHJpeDNEKCk7XG5cblx0XHRtLmNvcHlGcm9tKGVudGl0eS5nZXRSZW5kZXJTY2VuZVRyYW5zZm9ybShjYW1lcmEpKTtcblx0XHRtLmFwcGVuZCh0aGlzLmludmVyc2VTY2VuZVRyYW5zZm9ybSk7XG5cblx0XHRpZiAoIXRoaXMuX3Byb2pBQUJCUG9pbnRzKVxuXHRcdFx0dGhpcy5fcHJvakFBQkJQb2ludHMgPSBbXTtcblxuXHRcdG0udHJhbnNmb3JtVmVjdG9ycyhib3VuZHMuYWFiYlBvaW50cywgdGhpcy5fcHJvakFBQkJQb2ludHMpO1xuXG5cdFx0dmFyIHhNaW46bnVtYmVyID0gSW5maW5pdHksIHhNYXg6bnVtYmVyID0gLUluZmluaXR5O1xuXHRcdHZhciB5TWluOm51bWJlciA9IEluZmluaXR5LCB5TWF4Om51bWJlciA9IC1JbmZpbml0eTtcblx0XHR2YXIgek1pbjpudW1iZXIgPSBJbmZpbml0eSwgek1heDpudW1iZXIgPSAtSW5maW5pdHk7XG5cdFx0dmFyIGQ6bnVtYmVyO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IDI0Oykge1xuXHRcdFx0ZCA9IHRoaXMuX3Byb2pBQUJCUG9pbnRzW2krK107XG5cblx0XHRcdGlmIChkIDwgeE1pbilcblx0XHRcdFx0eE1pbiA9IGQ7XG5cblx0XHRcdGlmIChkID4geE1heClcblx0XHRcdFx0eE1heCA9IGQ7XG5cblx0XHRcdGQgPSB0aGlzLl9wcm9qQUFCQlBvaW50c1tpKytdO1xuXG5cdFx0XHRpZiAoZCA8IHlNaW4pXG5cdFx0XHRcdHlNaW4gPSBkO1xuXG5cdFx0XHRpZiAoZCA+IHlNYXgpXG5cdFx0XHRcdHlNYXggPSBkO1xuXG5cdFx0XHRkID0gdGhpcy5fcHJvakFBQkJQb2ludHNbaSsrXTtcblxuXHRcdFx0aWYgKGQgPCB6TWluKVxuXHRcdFx0XHR6TWluID0gZDtcblxuXHRcdFx0aWYgKGQgPiB6TWF4KVxuXHRcdFx0XHR6TWF4ID0gZDtcblx0XHR9XG5cblx0XHR2YXIgaW52WFJhbmdlOm51bWJlciA9IDEvKHhNYXggLSB4TWluKTtcblx0XHR2YXIgaW52WVJhbmdlOm51bWJlciA9IDEvKHlNYXggLSB5TWluKTtcblx0XHR2YXIgaW52WlJhbmdlOm51bWJlciA9IDEvKHpNYXggLSB6TWluKTtcblx0XHRyYXdbMF0gPSAyKmludlhSYW5nZTtcblx0XHRyYXdbNV0gPSAyKmludllSYW5nZTtcblx0XHRyYXdbMTBdID0gaW52WlJhbmdlO1xuXHRcdHJhd1sxMl0gPSAtKHhNYXggKyB4TWluKSppbnZYUmFuZ2U7XG5cdFx0cmF3WzEzXSA9IC0oeU1heCArIHlNaW4pKmludllSYW5nZTtcblx0XHRyYXdbMTRdID0gLXpNaW4qaW52WlJhbmdlO1xuXHRcdHJhd1sxXSA9IHJhd1syXSA9IHJhd1szXSA9IHJhd1s0XSA9IHJhd1s2XSA9IHJhd1s3XSA9IHJhd1s4XSA9IHJhd1s5XSA9IHJhd1sxMV0gPSAwO1xuXHRcdHJhd1sxNV0gPSAxO1xuXG5cdFx0aWYgKCF0YXJnZXQpXG5cdFx0XHR0YXJnZXQgPSBuZXcgTWF0cml4M0QoKTtcblxuXHRcdHRhcmdldC5jb3B5UmF3RGF0YUZyb20ocmF3KTtcblx0XHR0YXJnZXQucHJlcGVuZChtKTtcblxuXHRcdHJldHVybiB0YXJnZXQ7XG5cdH1cblxuXHRwdWJsaWMgX2lDb2xsZWN0UmVuZGVyYWJsZXMocmVuZGVyZXI6SVJlbmRlcmVyKVxuXHR7XG5cdFx0Ly9ub3RoaW5nIHRvIGRvIGhlcmVcblx0fVxufVxuXG5leHBvcnQgPSBEaXJlY3Rpb25hbExpZ2h0OyJdfQ== \ No newline at end of file diff --git a/lib/entities/DirectionalLight.ts b/lib/entities/DirectionalLight.ts new file mode 100644 index 00000000..dabd0b80 --- /dev/null +++ b/lib/entities/DirectionalLight.ts @@ -0,0 +1,169 @@ +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +import LightBase = require("awayjs-core/lib/core/base/LightBase"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import DirectionalLightNode = require("awayjs-core/lib/core/partition/DirectionalLightNode"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + +class DirectionalLight extends LightBase implements IEntity +{ + private _direction:Vector3D; + private _tmpLookAt:Vector3D; + private _sceneDirection:Vector3D; + private _projAABBPoints:Array; + + constructor(xDir:number = 0, yDir:number = -1, zDir:number = 1) + { + super(); + + this._pIsEntity = true; + + this.direction = new Vector3D(xDir, yDir, zDir); + + this._sceneDirection = new Vector3D(); + } + + public get sceneDirection():Vector3D + { + if (this._pSceneTransformDirty) + this.pUpdateSceneTransform(); + + return this._sceneDirection; + } + + public get direction():Vector3D + { + return this._direction; + } + + public set direction(value:Vector3D) + { + this._direction = value; + + if (!this._tmpLookAt) + this._tmpLookAt = new Vector3D(); + + this._tmpLookAt.x = this.x + this._direction.x; + this._tmpLookAt.y = this.y + this._direction.y; + this._tmpLookAt.z = this.z + this._direction.z; + + this.lookAt(this._tmpLookAt); + } + + /** + * + * @returns {away.bounds.NullBounds} + */ + public pCreateDefaultBoundingVolume():BoundingVolumeBase + { + //directional lights are to be considered global, hence always in view + return new NullBounds(); + } + + /** + * + */ + public pUpdateBounds() + { + } + + //@override + public pUpdateSceneTransform() + { + super.pUpdateSceneTransform(); + this.sceneTransform.copyColumnTo(2, this._sceneDirection); + this._sceneDirection.normalize(); + } + + //@override + public pCreateShadowMapper():DirectionalShadowMapper + { + return new DirectionalShadowMapper(); + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():EntityNode + { + return new DirectionalLightNode(this); + } + + //override + public iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D + { + var raw:Array = new Array(); + var bounds:BoundingVolumeBase = entity.bounds; + var m:Matrix3D = new Matrix3D(); + + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this.inverseSceneTransform); + + if (!this._projAABBPoints) + this._projAABBPoints = []; + + m.transformVectors(bounds.aabbPoints, this._projAABBPoints); + + var xMin:number = Infinity, xMax:number = -Infinity; + var yMin:number = Infinity, yMax:number = -Infinity; + var zMin:number = Infinity, zMax:number = -Infinity; + var d:number; + for (var i:number = 0; i < 24;) { + d = this._projAABBPoints[i++]; + + if (d < xMin) + xMin = d; + + if (d > xMax) + xMax = d; + + d = this._projAABBPoints[i++]; + + if (d < yMin) + yMin = d; + + if (d > yMax) + yMax = d; + + d = this._projAABBPoints[i++]; + + if (d < zMin) + zMin = d; + + if (d > zMax) + zMax = d; + } + + var invXRange:number = 1/(xMax - xMin); + var invYRange:number = 1/(yMax - yMin); + var invZRange:number = 1/(zMax - zMin); + raw[0] = 2*invXRange; + raw[5] = 2*invYRange; + raw[10] = invZRange; + raw[12] = -(xMax + xMin)*invXRange; + raw[13] = -(yMax + yMin)*invYRange; + raw[14] = -zMin*invZRange; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + raw[15] = 1; + + if (!target) + target = new Matrix3D(); + + target.copyRawDataFrom(raw); + target.prepend(m); + + return target; + } + + public _iCollectRenderables(renderer:IRenderer) + { + //nothing to do here + } +} + +export = DirectionalLight; \ No newline at end of file diff --git a/lib/entities/IEntity.js b/lib/entities/IEntity.js new file mode 100755 index 00000000..f12e9273 --- /dev/null +++ b/lib/entities/IEntity.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL0lFbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEiLCJmaWxlIjoiZW50aXRpZXMvSUVudGl0eS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCb3VuZGluZ1ZvbHVtZUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYm91bmRzL0JvdW5kaW5nVm9sdW1lQmFzZVwiKTtcbmltcG9ydCBTY2VuZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1NjZW5lXCIpO1xuaW1wb3J0IENvbnRyb2xsZXJCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udHJvbGxlcnMvQ29udHJvbGxlckJhc2VcIik7XG5pbXBvcnQgTWF0cml4M0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFRyYW5zZm9ybVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1RyYW5zZm9ybVwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5pbXBvcnQgUGFydGl0aW9uXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9QYXJ0aXRpb25cIik7XG5pbXBvcnQgRW50aXR5Tm9kZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vRW50aXR5Tm9kZVwiKTtcbmltcG9ydCBJUGlja2luZ0NvbGxpZGVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9waWNrL0lQaWNraW5nQ29sbGlkZXJcIik7XG5pbXBvcnQgUGlja2luZ0NvbGxpc2lvblZPXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGljay9QaWNraW5nQ29sbGlzaW9uVk9cIik7XG5pbXBvcnQgSVJlbmRlcmVyXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9JUmVuZGVyZXJcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcblxuaW50ZXJmYWNlIElFbnRpdHkgZXh0ZW5kcyBJQXNzZXRcbntcblx0eDpudW1iZXI7XG5cdHk6bnVtYmVyO1xuXHR6Om51bWJlcjtcblxuXHRyb3RhdGlvblg6bnVtYmVyO1xuXHRyb3RhdGlvblk6bnVtYmVyO1xuXHRyb3RhdGlvblo6bnVtYmVyO1xuXG5cdHNjYWxlWDpudW1iZXI7XG5cdHNjYWxlWTpudW1iZXI7XG5cdHNjYWxlWjpudW1iZXI7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRib3VuZHM6Qm91bmRpbmdWb2x1bWVCYXNlO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0Y2FzdHNTaGFkb3dzOmJvb2xlYW47XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRpbnZlcnNlU2NlbmVUcmFuc2Zvcm06TWF0cml4M0Q7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwYXJ0aXRpb25Ob2RlOkVudGl0eU5vZGU7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwaWNraW5nQ29sbGlkZXI6SVBpY2tpbmdDb2xsaWRlcjtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHRyYW5zZm9ybTpUcmFuc2Zvcm07XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRzY2VuZTpTY2VuZTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHNjZW5lUG9zaXRpb246VmVjdG9yM0Q7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRzY2VuZVRyYW5zZm9ybTpNYXRyaXgzRDtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHdvcmxkQm91bmRzOkJvdW5kaW5nVm9sdW1lQmFzZTtcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHpPZmZzZXQ6bnVtYmVyXG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRpc0ludGVyc2VjdGluZ1JheShyYXlQb3NpdGlvbjpWZWN0b3IzRCwgcmF5RGlyZWN0aW9uOlZlY3RvcjNEKTpib29sZWFuO1xuXG5cdC8qKlxuXHQgKlxuXHQgKlxuXHQgKiBAcGFyYW0gdGFyZ2V0XG5cdCAqIEBwYXJhbSB1cEF4aXNcblx0ICovXG5cdGxvb2tBdCh0YXJnZXQ6VmVjdG9yM0QsIHVwQXhpcz86VmVjdG9yM0QpO1xuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdF9pUGlja2luZ0NvbGxpc2lvblZPOlBpY2tpbmdDb2xsaXNpb25WTztcblxuXHQvKipcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRfaUNvbnRyb2xsZXI6Q29udHJvbGxlckJhc2U7XG5cblx0LyoqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0X2lBc3NpZ25lZFBhcnRpdGlvbjpQYXJ0aXRpb247XG5cblx0LyoqXG5cdCAqIC8vVE9ET1xuXHQgKlxuXHQgKiBAcGFyYW0gc2hvcnRlc3RDb2xsaXNpb25EaXN0YW5jZVxuXHQgKiBAcGFyYW0gZmluZENsb3Nlc3Rcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0X2lUZXN0Q29sbGlzaW9uKHNob3J0ZXN0Q29sbGlzaW9uRGlzdGFuY2U6bnVtYmVyLCBmaW5kQ2xvc2VzdDpib29sZWFuKTpib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdF9pSXNNb3VzZUVuYWJsZWQoKTpib29sZWFuXG5cblx0LyoqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0X2lJc1Zpc2libGUoKTpib29sZWFuXG5cblx0X2lJbnRlcm5hbFVwZGF0ZSgpXG5cblx0LyoqXG5cdCAqIFRoZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggdGhhdCB0cmFuc2Zvcm1zIGZyb20gbW9kZWwgdG8gd29ybGQgc3BhY2UsIGFkYXB0ZWQgd2l0aCBhbnkgc3BlY2lhbCBvcGVyYXRpb25zIG5lZWRlZCB0byByZW5kZXIuXG5cdCAqIEZvciBleGFtcGxlLCBhc3N1cmluZyBjZXJ0YWluIGFsaWduZWRuZXNzIHdoaWNoIGlzIG5vdCBpbmhlcmVudCBpbiB0aGUgc2NlbmUgdHJhbnNmb3JtLiBCeSBkZWZhdWx0LCB0aGlzIHdvdWxkXG5cdCAqIHJldHVybiB0aGUgc2NlbmUgdHJhbnNmb3JtLlxuXHQgKi9cblx0Z2V0UmVuZGVyU2NlbmVUcmFuc2Zvcm0oY2FtZXJhOkNhbWVyYSk6TWF0cml4M0Q7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSByZW5kZXJlclxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2lDb2xsZWN0UmVuZGVyYWJsZXMocmVuZGVyZXI6SVJlbmRlcmVyKTtcbn1cblxuZXhwb3J0ID0gSUVudGl0eTsiXX0= \ No newline at end of file diff --git a/lib/entities/IEntity.ts b/lib/entities/IEntity.ts new file mode 100644 index 00000000..f74db530 --- /dev/null +++ b/lib/entities/IEntity.ts @@ -0,0 +1,150 @@ +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import Scene = require("awayjs-core/lib/containers/Scene"); +import ControllerBase = require("awayjs-core/lib/controllers/ControllerBase"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Transform = require("awayjs-core/lib/core/geom/Transform"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import Partition = require("awayjs-core/lib/core/partition/Partition"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import IPickingCollider = require("awayjs-core/lib/core/pick/IPickingCollider"); +import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Camera = require("awayjs-core/lib/entities/Camera"); + +interface IEntity extends IAsset +{ + x:number; + y:number; + z:number; + + rotationX:number; + rotationY:number; + rotationZ:number; + + scaleX:number; + scaleY:number; + scaleZ:number; + + /** + * + */ + bounds:BoundingVolumeBase; + + /** + * + */ + castsShadows:boolean; + + /** + * + */ + inverseSceneTransform:Matrix3D; + + /** + * + */ + partitionNode:EntityNode; + + /** + * + */ + pickingCollider:IPickingCollider; + + /** + * + */ + transform:Transform; + + /** + * + */ + scene:Scene; + + /** + * + */ + scenePosition:Vector3D; + + /** + * + */ + sceneTransform:Matrix3D; + + /** + * + */ + worldBounds:BoundingVolumeBase; + + /** + * + */ + zOffset:number + + /** + * + */ + isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean; + + /** + * + * + * @param target + * @param upAxis + */ + lookAt(target:Vector3D, upAxis?:Vector3D); + + /** + * @internal + */ + _iPickingCollisionVO:PickingCollisionVO; + + /** + * @internal + */ + _iController:ControllerBase; + + /** + * @internal + */ + _iAssignedPartition:Partition; + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean; + + /** + * @internal + */ + _iIsMouseEnabled():boolean + + /** + * @internal + */ + _iIsVisible():boolean + + _iInternalUpdate() + + /** + * The transformation matrix that transforms from model to world space, adapted with any special operations needed to render. + * For example, assuring certain alignedness which is not inherent in the scene transform. By default, this would + * return the scene transform. + */ + getRenderSceneTransform(camera:Camera):Matrix3D; + + /** + * + * @param renderer + * @private + */ + _iCollectRenderables(renderer:IRenderer); +} + +export = IEntity; \ No newline at end of file diff --git a/lib/entities/LightProbe.js b/lib/entities/LightProbe.js new file mode 100755 index 00000000..c529e398 --- /dev/null +++ b/lib/entities/LightProbe.js @@ -0,0 +1,80 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +var LightBase = require("awayjs-core/lib/core/base/LightBase"); + +var LightProbeNode = require("awayjs-core/lib/core/partition/LightProbeNode"); + +var Error = require("awayjs-core/lib/errors/Error"); + +var LightProbe = (function (_super) { + __extends(LightProbe, _super); + function LightProbe(diffuseMap, specularMap) { + if (typeof specularMap === "undefined") { specularMap = null; } + _super.call(this); + + this._pIsEntity = true; + + this._diffuseMap = diffuseMap; + this._specularMap = specularMap; + } + Object.defineProperty(LightProbe.prototype, "diffuseMap", { + get: function () { + return this._diffuseMap; + }, + set: function (value) { + this._diffuseMap = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LightProbe.prototype, "specularMap", { + get: function () { + return this._specularMap; + }, + set: function (value) { + this._specularMap = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * @protected + */ + LightProbe.prototype.pCreateEntityPartitionNode = function () { + return new LightProbeNode(this); + }; + + //@override + LightProbe.prototype.pUpdateBounds = function () { + this._pBoundsInvalid = false; + }; + + //@override + LightProbe.prototype.pCreateDefaultBoundingVolume = function () { + return new NullBounds(); + }; + + //@override + LightProbe.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { + if (typeof target === "undefined") { target = null; } + throw new Error("Object projection matrices are not supported for LightProbe objects!"); + }; + + LightProbe.prototype._iCollectRenderables = function (renderer) { + //nothing to do here + }; + return LightProbe; +})(LightBase); + +module.exports = LightProbe; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL0xpZ2h0UHJvYmUudHMiXSwibmFtZXMiOlsiTGlnaHRQcm9iZSIsIkxpZ2h0UHJvYmUuY29uc3RydWN0b3IiLCJMaWdodFByb2JlLnBDcmVhdGVFbnRpdHlQYXJ0aXRpb25Ob2RlIiwiTGlnaHRQcm9iZS5wVXBkYXRlQm91bmRzIiwiTGlnaHRQcm9iZS5wQ3JlYXRlRGVmYXVsdEJvdW5kaW5nVm9sdW1lIiwiTGlnaHRQcm9iZS5pR2V0T2JqZWN0UHJvamVjdGlvbk1hdHJpeCIsIkxpZ2h0UHJvYmUuX2lDb2xsZWN0UmVuZGVyYWJsZXMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZEQUNxRTtBQUNyRSw4REFBc0U7O0FBSXRFLDZFQUFvRjs7QUFJcEYsbURBQTREOztBQUc1RDtJQUF5QkEsNkJBQVNBO0lBS2pDQSxvQkFBWUEsVUFBMEJBLEVBQUVBLFdBQWtDQTtRQUFsQ0MsMENBQUFBLFdBQVdBLEdBQW1CQSxJQUFJQTtBQUFBQSxRQUV6RUEsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBOztRQUV0QkEsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsVUFBVUE7UUFDN0JBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLFdBQVdBO0lBQ2hDQSxDQUFDQTtJQUVERDtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxXQUFXQTtRQUN4QkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBc0JBLEtBQXFCQTtZQUUxQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsS0FBS0E7UUFDekJBLENBQUNBOzs7O0FBTEFBOztJQU9EQTtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN6QkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBdUJBLEtBQXFCQTtZQUUzQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsS0FBS0E7UUFDMUJBLENBQUNBOzs7O0FBTEFBOztJQVVEQTs7TUFER0E7c0RBQ0hBO1FBRUNFLE9BQU9BLElBQUlBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBO0lBQ2hDQSxDQUFDQTs7SUFHREYsV0FEV0E7eUNBQ1hBO1FBRUNHLElBQUlBLENBQUNBLGVBQWVBLEdBQUdBLEtBQUtBO0lBQzdCQSxDQUFDQTs7SUFHREgsV0FEV0E7d0RBQ1hBO1FBRUNJLE9BQU9BLElBQUlBLFVBQVVBLENBQUNBLENBQUNBO0lBQ3hCQSxDQUFDQTs7SUFHREosV0FEV0E7c0RBQ1hBLFVBQWtDQSxNQUFjQSxFQUFFQSxNQUFhQSxFQUFFQSxNQUFzQkE7UUFBdEJLLHFDQUFBQSxNQUFNQSxHQUFZQSxJQUFJQTtBQUFBQSxRQUV0RkEsTUFBTUEsSUFBSUEsS0FBS0EsQ0FBQ0Esc0VBQXNFQSxDQUFDQTtJQUN4RkEsQ0FBQ0E7O0lBRURMLDRDQUFBQSxVQUE0QkEsUUFBa0JBO1FBRTdDTSxvQkFBb0JBO0lBQ3JCQSxDQUFDQTtJQUNGTixrQkFBQ0E7QUFBREEsQ0FBQ0EsRUFqRXdCLFNBQVMsRUFpRWpDOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImVudGl0aWVzL0xpZ2h0UHJvYmUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQm91bmRpbmdWb2x1bWVCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2JvdW5kcy9Cb3VuZGluZ1ZvbHVtZUJhc2VcIik7XG5pbXBvcnQgTnVsbEJvdW5kc1x0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYm91bmRzL051bGxCb3VuZHNcIik7XG5pbXBvcnQgTGlnaHRCYXNlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvTGlnaHRCYXNlXCIpO1xuaW1wb3J0IE1hdHJpeDNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgRW50aXR5Tm9kZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vRW50aXR5Tm9kZVwiKTtcbmltcG9ydCBMaWdodFByb2JlTm9kZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcGFydGl0aW9uL0xpZ2h0UHJvYmVOb2RlXCIpO1xuaW1wb3J0IElSZW5kZXJlclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvSVJlbmRlcmVyXCIpO1xuaW1wb3J0IENhbWVyYVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9DYW1lcmFcIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9JRW50aXR5XCIpO1xuaW1wb3J0IEVycm9yXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9FcnJvclwiKTtcbmltcG9ydCBDdWJlVGV4dHVyZUJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9DdWJlVGV4dHVyZUJhc2VcIik7XG5cbmNsYXNzIExpZ2h0UHJvYmUgZXh0ZW5kcyBMaWdodEJhc2UgaW1wbGVtZW50cyBJRW50aXR5XG57XG5cdHByaXZhdGUgX2RpZmZ1c2VNYXA6Q3ViZVRleHR1cmVCYXNlO1xuXHRwcml2YXRlIF9zcGVjdWxhck1hcDpDdWJlVGV4dHVyZUJhc2U7XG5cblx0Y29uc3RydWN0b3IoZGlmZnVzZU1hcDpDdWJlVGV4dHVyZUJhc2UsIHNwZWN1bGFyTWFwOkN1YmVUZXh0dXJlQmFzZSA9IG51bGwpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fcElzRW50aXR5ID0gdHJ1ZTtcblxuXHRcdHRoaXMuX2RpZmZ1c2VNYXAgPSBkaWZmdXNlTWFwO1xuXHRcdHRoaXMuX3NwZWN1bGFyTWFwID0gc3BlY3VsYXJNYXA7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRpZmZ1c2VNYXAoKTpDdWJlVGV4dHVyZUJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kaWZmdXNlTWFwO1xuXHR9XG5cblx0cHVibGljIHNldCBkaWZmdXNlTWFwKHZhbHVlOkN1YmVUZXh0dXJlQmFzZSlcblx0e1xuXHRcdHRoaXMuX2RpZmZ1c2VNYXAgPSB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgc3BlY3VsYXJNYXAoKTpDdWJlVGV4dHVyZUJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zcGVjdWxhck1hcDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc3BlY3VsYXJNYXAodmFsdWU6Q3ViZVRleHR1cmVCYXNlKVxuXHR7XG5cdFx0dGhpcy5fc3BlY3VsYXJNYXAgPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgcENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUoKTpFbnRpdHlOb2RlXG5cdHtcblx0XHRyZXR1cm4gbmV3IExpZ2h0UHJvYmVOb2RlKHRoaXMpO1xuXHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIHBVcGRhdGVCb3VuZHMoKVxuXHR7XG5cdFx0dGhpcy5fcEJvdW5kc0ludmFsaWQgPSBmYWxzZTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBwQ3JlYXRlRGVmYXVsdEJvdW5kaW5nVm9sdW1lKCk6Qm91bmRpbmdWb2x1bWVCYXNlXG5cdHtcblx0XHRyZXR1cm4gbmV3IE51bGxCb3VuZHMoKTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBpR2V0T2JqZWN0UHJvamVjdGlvbk1hdHJpeChlbnRpdHk6SUVudGl0eSwgY2FtZXJhOkNhbWVyYSwgdGFyZ2V0Ok1hdHJpeDNEID0gbnVsbCk6TWF0cml4M0Rcblx0e1xuXHRcdHRocm93IG5ldyBFcnJvcihcIk9iamVjdCBwcm9qZWN0aW9uIG1hdHJpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBMaWdodFByb2JlIG9iamVjdHMhXCIpO1xuXHR9XG5cblx0cHVibGljIF9pQ29sbGVjdFJlbmRlcmFibGVzKHJlbmRlcmVyOklSZW5kZXJlcilcblx0e1xuXHRcdC8vbm90aGluZyB0byBkbyBoZXJlXG5cdH1cbn1cblxuZXhwb3J0ID0gTGlnaHRQcm9iZTsiXX0= \ No newline at end of file diff --git a/lib/entities/LightProbe.ts b/lib/entities/LightProbe.ts new file mode 100644 index 00000000..944473a7 --- /dev/null +++ b/lib/entities/LightProbe.ts @@ -0,0 +1,81 @@ +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +import LightBase = require("awayjs-core/lib/core/base/LightBase"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import LightProbeNode = require("awayjs-core/lib/core/partition/LightProbeNode"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import Error = require("awayjs-core/lib/errors/Error"); +import CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); + +class LightProbe extends LightBase implements IEntity +{ + private _diffuseMap:CubeTextureBase; + private _specularMap:CubeTextureBase; + + constructor(diffuseMap:CubeTextureBase, specularMap:CubeTextureBase = null) + { + super(); + + this._pIsEntity = true; + + this._diffuseMap = diffuseMap; + this._specularMap = specularMap; + } + + public get diffuseMap():CubeTextureBase + { + return this._diffuseMap; + } + + public set diffuseMap(value:CubeTextureBase) + { + this._diffuseMap = value; + } + + public get specularMap():CubeTextureBase + { + return this._specularMap; + } + + public set specularMap(value:CubeTextureBase) + { + this._specularMap = value; + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():EntityNode + { + return new LightProbeNode(this); + } + + //@override + public pUpdateBounds() + { + this._pBoundsInvalid = false; + } + + //@override + public pCreateDefaultBoundingVolume():BoundingVolumeBase + { + return new NullBounds(); + } + + //@override + public iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D + { + throw new Error("Object projection matrices are not supported for LightProbe objects!"); + } + + public _iCollectRenderables(renderer:IRenderer) + { + //nothing to do here + } +} + +export = LightProbe; \ No newline at end of file diff --git a/lib/entities/LineSegment.js b/lib/entities/LineSegment.js new file mode 100755 index 00000000..7d07f157 --- /dev/null +++ b/lib/entities/LineSegment.js @@ -0,0 +1,227 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +var MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); + +/** +* A Line Segment primitive. +*/ +var LineSegment = (function (_super) { + __extends(LineSegment, _super); + /** + * Create a line segment + * + * @param startPosition Start position of the line segment + * @param endPosition Ending position of the line segment + * @param thickness Thickness of the line + */ + function LineSegment(material, startPosition, endPosition, thickness) { + if (typeof thickness === "undefined") { thickness = 1; } + var _this = this; + _super.call(this); + + this._pIsEntity = true; + + this.onSizeChangedDelegate = function (event) { + return _this.onSizeChanged(event); + }; + + this.material = material; + + this._startPosition = startPosition; + this._endPosition = endPosition; + this._halfThickness = thickness * 0.5; + } + Object.defineProperty(LineSegment.prototype, "animator", { + /** + * Defines the animator of the line segment. Act on the line segment's geometry. Defaults to null + */ + get: function () { + return this._animator; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSegment.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.LINE_SEGMENT; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSegment.prototype, "startPostion", { + /** + * + */ + get: function () { + return this._startPosition; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSegment.prototype, "startPosition", { + set: function (value) { + if (this._startPosition == value) + return; + + this._startPosition = value; + + this.notifyRenderableUpdate(); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LineSegment.prototype, "endPosition", { + /** + * + */ + get: function () { + return this._endPosition; + }, + set: function (value) { + if (this._endPosition == value) + return; + + this._endPosition = value; + + this.notifyRenderableUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LineSegment.prototype, "material", { + /** + * + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + if (this._material) { + this._material.iRemoveOwner(this); + this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + + this._material = value; + + if (this._material) { + this._material.iAddOwner(this); + this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LineSegment.prototype, "thickness", { + /** + * + */ + get: function () { + return this._halfThickness * 2; + }, + set: function (value) { + if (this._halfThickness == value) + return; + + this._halfThickness = value * 0.5; + + this.notifyRenderableUpdate(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(LineSegment.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + LineSegment.prototype.dispose = function () { + this._startPosition = null; + this._endPosition = null; + }; + + /** + * @protected + */ + LineSegment.prototype.pCreateEntityPartitionNode = function () { + return new EntityNode(this); + }; + + /** + * @protected + */ + LineSegment.prototype.pUpdateBounds = function () { + this._pBounds.fromExtremes(this._startPosition.x, this._startPosition.y, this._startPosition.z, this._endPosition.x, this._endPosition.y, this._endPosition.z); + + _super.prototype.pUpdateBounds.call(this); + }; + + /** + * @private + */ + LineSegment.prototype.onSizeChanged = function (event) { + this.notifyRenderableUpdate(); + }; + + /** + * @private + */ + LineSegment.prototype.notifyRenderableUpdate = function () { + var len = this._pRenderables.length; + for (var i = 0; i < len; i++) + this._pRenderables[i].invalidateVertexData("vertices"); //TODO + }; + + LineSegment.prototype._iCollectRenderables = function (renderer) { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + }; + + LineSegment.prototype._iCollectRenderable = function (renderer) { + //TODO + }; + return LineSegment; +})(DisplayObject); + +module.exports = LineSegment; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL0xpbmVTZWdtZW50LnRzIl0sIm5hbWVzIjpbIkxpbmVTZWdtZW50IiwiTGluZVNlZ21lbnQuY29uc3RydWN0b3IiLCJMaW5lU2VnbWVudC5kaXNwb3NlIiwiTGluZVNlZ21lbnQucENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUiLCJMaW5lU2VnbWVudC5wVXBkYXRlQm91bmRzIiwiTGluZVNlZ21lbnQub25TaXplQ2hhbmdlZCIsIkxpbmVTZWdtZW50Lm5vdGlmeVJlbmRlcmFibGVVcGRhdGUiLCJMaW5lU2VnbWVudC5faUNvbGxlY3RSZW5kZXJhYmxlcyIsIkxpbmVTZWdtZW50Ll9pQ29sbGVjdFJlbmRlcmFibGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNFQUM2RTs7QUFLN0UsaUVBQXlFO0FBQ3pFLHFFQUE2RTs7QUFFN0UsbUVBQTBFOztBQUkxRTs7RUFFRztBQUNIO0lBQTBCQSw4QkFBYUE7SUFrSXRDQTs7Ozs7O01BREdBO0lBQ0hBLHFCQUFZQSxRQUFxQkEsRUFBRUEsYUFBc0JBLEVBQUVBLFdBQW9CQSxFQUFFQSxTQUFvQkE7UUFBcEJDLHdDQUFBQSxTQUFTQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFyR0EsaUJBYUNBO1FBWEFBLFdBQU1BLEtBQUFBLENBQUNBOztRQUVQQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQTs7UUFFdEJBLElBQUlBLENBQUNBLHFCQUFxQkEsR0FBR0EsVUFBQ0EsS0FBbUJBO21CQUFLQSxLQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUF6QkEsQ0FBeUJBOztRQUUvRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsUUFBUUE7O1FBRXhCQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxhQUFhQTtRQUNuQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsV0FBV0E7UUFDL0JBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLFNBQVNBLEdBQUNBLEdBQUdBO0lBQ3BDQSxDQUFDQTtJ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QSxDQUFDQSxjQUFjQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFbENBLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7SUFDbkNBLENBQUNBOztJQUVEUCw0Q0FBQUEsVUFBMkJBLFFBQWtCQTtRQUU1Q1EsTUFBTUE7SUFDUEEsQ0FBQ0E7SUFDRlIsbUJBQUNBO0FBQURBLENBQUNBLEVBMU15QixhQUFhLEVBME10Qzs7QUFFRCw0QkFBcUIsQ0FBQSIsImZpbGUiOiJlbnRpdGllcy9MaW5lU2VnbWVudC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJQW5pbWF0b3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2FuaW1hdG9ycy9JQW5pbWF0b3JcIik7XG5pbXBvcnQgRGlzcGxheU9iamVjdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IElNYXRlcmlhbE93bmVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0lNYXRlcmlhbE93bmVyXCIpO1xuaW1wb3J0IE1hdHJpeDNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBVVlRyYW5zZm9ybVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1VWVHJhbnNmb3JtXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBBc3NldFR5cGVcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldFR5cGVcIik7XG5pbXBvcnQgRW50aXR5Tm9kZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vRW50aXR5Tm9kZVwiKTtcbmltcG9ydCBJUmVuZGVyZXJcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcmVuZGVyL0lSZW5kZXJlclwiKTtcbmltcG9ydCBNYXRlcmlhbEV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL01hdGVyaWFsRXZlbnRcIik7XG5pbXBvcnQgSUVudGl0eVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9JRW50aXR5XCIpO1xuaW1wb3J0IE1hdGVyaWFsQmFzZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvbWF0ZXJpYWxzL01hdGVyaWFsQmFzZVwiKTtcblxuLyoqXG4gKiBBIExpbmUgU2VnbWVudCBwcmltaXRpdmUuXG4gKi9cbmNsYXNzIExpbmVTZWdtZW50IGV4dGVuZHMgRGlzcGxheU9iamVjdCBpbXBsZW1lbnRzIElFbnRpdHksIElNYXRlcmlhbE93bmVyXG57XG5cdHByaXZhdGUgX2FuaW1hdG9yOklBbmltYXRvcjtcblx0cHJpdmF0ZSBfbWF0ZXJpYWw6TWF0ZXJpYWxCYXNlO1xuXHRwcml2YXRlIF91dlRyYW5zZm9ybTpVVlRyYW5zZm9ybTtcblxuXHRwcml2YXRlIG9uU2l6ZUNoYW5nZWREZWxlZ2F0ZTooZXZlbnQ6TWF0ZXJpYWxFdmVudCkgPT4gdm9pZDtcblxuXHRwdWJsaWMgX3N0YXJ0UG9zaXRpb246VmVjdG9yM0Q7XG5cdHB1YmxpYyBfZW5kUG9zaXRpb246VmVjdG9yM0Q7XG5cdHB1YmxpYyBfaGFsZlRoaWNrbmVzczpudW1iZXI7XG5cblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgYW5pbWF0b3Igb2YgdGhlIGxpbmUgc2VnbWVudC4gQWN0IG9uIHRoZSBsaW5lIHNlZ21lbnQncyBnZW9tZXRyeS4gRGVmYXVsdHMgdG8gbnVsbFxuXHQgKi9cblx0cHVibGljIGdldCBhbmltYXRvcigpOklBbmltYXRvclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2FuaW1hdG9yO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGFzc2V0VHlwZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIEFzc2V0VHlwZS5MSU5FX1NFR01FTlQ7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgc3RhcnRQb3N0aW9uKCk6VmVjdG9yM0Rcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zdGFydFBvc2l0aW9uO1xuXHR9XG5cblx0cHVibGljIHNldCBzdGFydFBvc2l0aW9uKHZhbHVlOlZlY3RvcjNEKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3N0YXJ0UG9zaXRpb24gPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9zdGFydFBvc2l0aW9uID0gdmFsdWU7XG5cblx0XHR0aGlzLm5vdGlmeVJlbmRlcmFibGVVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBlbmRQb3NpdGlvbigpOlZlY3RvcjNEXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZW5kUG9zaXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2V0IGVuZFBvc2l0aW9uKHZhbHVlOlZlY3RvcjNEKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2VuZFBvc2l0aW9uID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fZW5kUG9zaXRpb24gPSB2YWx1ZTtcblxuXHRcdHRoaXMubm90aWZ5UmVuZGVyYWJsZVVwZGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG1hdGVyaWFsKCk6TWF0ZXJpYWxCYXNlXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWF0ZXJpYWw7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1hdGVyaWFsKHZhbHVlOk1hdGVyaWFsQmFzZSlcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9tYXRlcmlhbClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh0aGlzLl9tYXRlcmlhbCkge1xuXHRcdFx0dGhpcy5fbWF0ZXJpYWwuaVJlbW92ZU93bmVyKHRoaXMpO1xuXHRcdFx0dGhpcy5fbWF0ZXJpYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihNYXRlcmlhbEV2ZW50LlNJWkVfQ0hBTkdFRCwgdGhpcy5vblNpemVDaGFuZ2VkRGVsZWdhdGUpO1xuXHRcdH1cblxuXG5cdFx0dGhpcy5fbWF0ZXJpYWwgPSB2YWx1ZTtcblxuXHRcdGlmICh0aGlzLl9tYXRlcmlhbCkge1xuXHRcdFx0dGhpcy5fbWF0ZXJpYWwuaUFkZE93bmVyKHRoaXMpO1xuXHRcdFx0dGhpcy5fbWF0ZXJpYWwuYWRkRXZlbnRMaXN0ZW5lcihNYXRlcmlhbEV2ZW50LlNJWkVfQ0hBTkdFRCwgdGhpcy5vblNpemVDaGFuZ2VkRGVsZWdhdGUpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB0aGlja25lc3MoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9oYWxmVGhpY2tuZXNzKjI7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHRoaWNrbmVzcyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5faGFsZlRoaWNrbmVzcyA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2hhbGZUaGlja25lc3MgPSB2YWx1ZSowLjU7XG5cblx0XHR0aGlzLm5vdGlmeVJlbmRlcmFibGVVcGRhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB1dlRyYW5zZm9ybSgpOlVWVHJhbnNmb3JtXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdXZUcmFuc2Zvcm07XG5cdH1cblxuXHRwdWJsaWMgc2V0IHV2VHJhbnNmb3JtKHZhbHVlOlVWVHJhbnNmb3JtKVxuXHR7XG5cdFx0dGhpcy5fdXZUcmFuc2Zvcm0gPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBsaW5lIHNlZ21lbnRcblx0ICpcblx0ICogQHBhcmFtIHN0YXJ0UG9zaXRpb24gU3RhcnQgcG9zaXRpb24gb2YgdGhlIGxpbmUgc2VnbWVudFxuXHQgKiBAcGFyYW0gZW5kUG9zaXRpb24gRW5kaW5nIHBvc2l0aW9uIG9mIHRoZSBsaW5lIHNlZ21lbnRcblx0ICogQHBhcmFtIHRoaWNrbmVzcyBUaGlja25lc3Mgb2YgdGhlIGxpbmVcblx0ICovXG5cdGNvbnN0cnVjdG9yKG1hdGVyaWFsOk1hdGVyaWFsQmFzZSwgc3RhcnRQb3NpdGlvbjpWZWN0b3IzRCwgZW5kUG9zaXRpb246VmVjdG9yM0QsIHRoaWNrbmVzczpudW1iZXIgPSAxKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX3BJc0VudGl0eSA9IHRydWU7XG5cblx0XHR0aGlzLm9uU2l6ZUNoYW5nZWREZWxlZ2F0ZSA9IChldmVudDpNYXRlcmlhbEV2ZW50KSA9PiB0aGlzLm9uU2l6ZUNoYW5nZWQoZXZlbnQpO1xuXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXG5cdFx0dGhpcy5fc3RhcnRQb3NpdGlvbiA9IHN0YXJ0UG9zaXRpb247XG5cdFx0dGhpcy5fZW5kUG9zaXRpb24gPSBlbmRQb3NpdGlvbjtcblx0XHR0aGlzLl9oYWxmVGhpY2tuZXNzID0gdGhpY2tuZXNzKjAuNTtcblx0fVxuXG5cdHB1YmxpYyBkaXNwb3NlKClcblx0e1xuXHRcdHRoaXMuX3N0YXJ0UG9zaXRpb24gPSBudWxsO1xuXHRcdHRoaXMuX2VuZFBvc2l0aW9uID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgcENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUoKTpFbnRpdHlOb2RlXG5cdHtcblx0XHRyZXR1cm4gbmV3IEVudGl0eU5vZGUodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBVcGRhdGVCb3VuZHMoKVxuXHR7XG5cdFx0dGhpcy5fcEJvdW5kcy5mcm9tRXh0cmVtZXModGhpcy5fc3RhcnRQb3NpdGlvbi54LCB0aGlzLl9zdGFydFBvc2l0aW9uLnksIHRoaXMuX3N0YXJ0UG9zaXRpb24ueiwgdGhpcy5fZW5kUG9zaXRpb24ueCwgdGhpcy5fZW5kUG9zaXRpb24ueSwgdGhpcy5fZW5kUG9zaXRpb24ueik7XG5cblx0XHRzdXBlci5wVXBkYXRlQm91bmRzKCk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgb25TaXplQ2hhbmdlZChldmVudDpNYXRlcmlhbEV2ZW50KVxuXHR7XG5cdFx0dGhpcy5ub3RpZnlSZW5kZXJhYmxlVXBkYXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgbm90aWZ5UmVuZGVyYWJsZVVwZGF0ZSgpXG5cdHtcblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX3BSZW5kZXJhYmxlcy5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspXG5cdFx0XHR0aGlzLl9wUmVuZGVyYWJsZXNbaV0uaW52YWxpZGF0ZVZlcnRleERhdGEoXCJ2ZXJ0aWNlc1wiKTsgLy9UT0RPXG5cdH1cblxuXHRwdWJsaWMgX2lDb2xsZWN0UmVuZGVyYWJsZXMocmVuZGVyZXI6SVJlbmRlcmVyKVxuXHR7XG5cdFx0Ly8gU2luY2UgdGhpcyBnZXR0ZXIgaXMgaW52b2tlZCBldmVyeSBpdGVyYXRpb24gb2YgdGhlIHJlbmRlciBsb29wLCBhbmRcblx0XHQvLyB0aGUgcHJlZmFiIGNvbnN0cnVjdCBjb3VsZCBhZmZlY3QgdGhlIHN1Yi1tZXNoZXMsIHRoZSBwcmVmYWIgaXNcblx0XHQvLyB2YWxpZGF0ZWQgaGVyZSB0byBnaXZlIGl0IGEgY2hhbmNlIHRvIHJlYnVpbGQuXG5cdFx0aWYgKHRoaXMuX2lTb3VyY2VQcmVmYWIpXG5cdFx0XHR0aGlzLl9pU291cmNlUHJlZmFiLl9pVmFsaWRhdGUoKTtcblxuXHRcdHRoaXMuX2lDb2xsZWN0UmVuZGVyYWJsZShyZW5kZXJlcik7XG5cdH1cblxuXHRwdWJsaWMgX2lDb2xsZWN0UmVuZGVyYWJsZShyZW5kZXJlcjpJUmVuZGVyZXIpXG5cdHtcblx0XHQvL1RPRE9cblx0fVxufVxuXG5leHBvcnQgPSBMaW5lU2VnbWVudDsiXX0= \ No newline at end of file diff --git a/lib/entities/LineSegment.ts b/lib/entities/LineSegment.ts new file mode 100644 index 00000000..23686df7 --- /dev/null +++ b/lib/entities/LineSegment.ts @@ -0,0 +1,221 @@ +import IAnimator = require("awayjs-core/lib/animators/IAnimator"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * A Line Segment primitive. + */ +class LineSegment extends DisplayObject implements IEntity, IMaterialOwner +{ + private _animator:IAnimator; + private _material:MaterialBase; + private _uvTransform:UVTransform; + + private onSizeChangedDelegate:(event:MaterialEvent) => void; + + public _startPosition:Vector3D; + public _endPosition:Vector3D; + public _halfThickness:number; + + + /** + * Defines the animator of the line segment. Act on the line segment's geometry. Defaults to null + */ + public get animator():IAnimator + { + return this._animator; + } + + /** + * + */ + public get assetType():string + { + return AssetType.LINE_SEGMENT; + } + + /** + * + */ + public get startPostion():Vector3D + { + return this._startPosition; + } + + public set startPosition(value:Vector3D) + { + if (this._startPosition == value) + return; + + this._startPosition = value; + + this.notifyRenderableUpdate(); + } + + /** + * + */ + public get endPosition():Vector3D + { + return this._endPosition; + } + + public set endPosition(value:Vector3D) + { + if (this._endPosition == value) + return; + + this._endPosition = value; + + this.notifyRenderableUpdate(); + } + + /** + * + */ + public get material():MaterialBase + { + return this._material; + } + + public set material(value:MaterialBase) + { + if (value == this._material) + return; + + if (this._material) { + this._material.iRemoveOwner(this); + this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + + + this._material = value; + + if (this._material) { + this._material.iAddOwner(this); + this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); + } + } + + /** + * + */ + public get thickness():number + { + return this._halfThickness*2; + } + + public set thickness(value:number) + { + if (this._halfThickness == value) + return; + + this._halfThickness = value*0.5; + + this.notifyRenderableUpdate(); + } + + /** + * + */ + public get uvTransform():UVTransform + { + return this._uvTransform; + } + + public set uvTransform(value:UVTransform) + { + this._uvTransform = value; + } + + /** + * Create a line segment + * + * @param startPosition Start position of the line segment + * @param endPosition Ending position of the line segment + * @param thickness Thickness of the line + */ + constructor(material:MaterialBase, startPosition:Vector3D, endPosition:Vector3D, thickness:number = 1) + { + super(); + + this._pIsEntity = true; + + this.onSizeChangedDelegate = (event:MaterialEvent) => this.onSizeChanged(event); + + this.material = material; + + this._startPosition = startPosition; + this._endPosition = endPosition; + this._halfThickness = thickness*0.5; + } + + public dispose() + { + this._startPosition = null; + this._endPosition = null; + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():EntityNode + { + return new EntityNode(this); + } + + /** + * @protected + */ + public pUpdateBounds() + { + this._pBounds.fromExtremes(this._startPosition.x, this._startPosition.y, this._startPosition.z, this._endPosition.x, this._endPosition.y, this._endPosition.z); + + super.pUpdateBounds(); + } + + /** + * @private + */ + private onSizeChanged(event:MaterialEvent) + { + this.notifyRenderableUpdate(); + } + + /** + * @private + */ + private notifyRenderableUpdate() + { + var len:number = this._pRenderables.length; + for (var i:number = 0; i < len; i++) + this._pRenderables[i].invalidateVertexData("vertices"); //TODO + } + + public _iCollectRenderables(renderer:IRenderer) + { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + this._iCollectRenderable(renderer); + } + + public _iCollectRenderable(renderer:IRenderer) + { + //TODO + } +} + +export = LineSegment; \ No newline at end of file diff --git a/lib/entities/Mesh.js b/lib/entities/Mesh.js new file mode 100755 index 00000000..883d2144 --- /dev/null +++ b/lib/entities/Mesh.js @@ -0,0 +1,452 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); + +var Geometry = require("awayjs-core/lib/core/base/Geometry"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); + +var GeometryEvent = require("awayjs-core/lib/events/GeometryEvent"); + +/** +* Mesh is an instance of a Geometry, augmenting it with a presence in the scene graph, a material, and an animation +* state. It consists out of SubMeshes, which in turn correspond to SubGeometries. SubMeshes allow different parts +* of the geometry to be assigned different materials. +*/ +var Mesh = (function (_super) { + __extends(Mesh, _super); + /** + * Create a new Mesh object. + * + * @param geometry The geometry used by the mesh that provides it with its shape. + * @param material [optional] The material with which to render the Mesh. + */ + function Mesh(geometry, material) { + if (typeof material === "undefined") { material = null; } + var _this = this; + _super.call(this); + this._castsShadows = true; + this._shareAnimationGeometry = true; + + this._pIsEntity = true; + + this._subMeshes = new Array(); + + this._onGeometryBoundsInvalidDelegate = function (event) { + return _this.onGeometryBoundsInvalid(event); + }; + this._onSubGeometryAddedDelegate = function (event) { + return _this.onSubGeometryAdded(event); + }; + this._onSubGeometryRemovedDelegate = function (event) { + return _this.onSubGeometryRemoved(event); + }; + + //this should never happen, but if people insist on trying to create their meshes before they have geometry to fill it, it becomes necessary + this.geometry = geometry || new Geometry(); + + this.material = material; + } + Object.defineProperty(Mesh.prototype, "animator", { + /** + * Defines the animator of the mesh. Act on the mesh's geometry. Default value is null. + */ + get: function () { + return this._animator; + }, + set: function (value) { + if (this._animator) + this._animator.removeOwner(this); + + this._animator = value; + + var len = this._subMeshes.length; + var subMesh; + + for (var i = 0; i < len; ++i) { + subMesh = this._subMeshes[i]; + + // cause material to be unregistered and registered again to work with the new animation type (if possible) + if (subMesh.material) { + subMesh.material.iRemoveOwner(subMesh); + subMesh.material.iAddOwner(subMesh); + } + + //invalidate any existing renderables in case they need to pull new geometry + subMesh._iInvalidateRenderableGeometry(); + } + + if (this._animator) + this._animator.addOwner(this); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.MESH; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Mesh.prototype, "castsShadows", { + /** + * Indicates whether or not the Mesh can cast shadows. Default value is true. + */ + get: function () { + return this._castsShadows; + }, + set: function (value) { + this._castsShadows = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "geometry", { + /** + * The geometry used by the mesh that provides it with its shape. + */ + get: function () { + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + return this._geometry; + }, + set: function (value) { + var i; + + if (this._geometry) { + this._geometry.removeEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); + this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); + this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); + + for (i = 0; i < this._subMeshes.length; ++i) + this._subMeshes[i].dispose(); + + this._subMeshes.length = 0; + } + + this._geometry = value; + + if (this._geometry) { + this._geometry.addEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); + this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); + this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); + + var subGeoms = this._geometry.subGeometries; + + for (i = 0; i < subGeoms.length; ++i) + this.addSubMesh(subGeoms[i]); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "material", { + /** + * The material with which to render the Mesh. + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + var i; + var len = this._subMeshes.length; + var subMesh; + + for (i = 0; i < len; i++) + if (this._material && (subMesh = this._subMeshes[i]).material == this._material) + this._material.iRemoveOwner(subMesh); + + this._material = value; + + for (i = 0; i < len; i++) + if (this._material && (subMesh = this._subMeshes[i]).material == this._material) + this._material.iAddOwner(subMesh); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "shareAnimationGeometry", { + /** + * Indicates whether or not the mesh share the same animation geometry. + */ + get: function () { + return this._shareAnimationGeometry; + }, + set: function (value) { + this._shareAnimationGeometry = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Mesh.prototype, "subMeshes", { + /** + * The SubMeshes out of which the Mesh consists. Every SubMesh can be assigned a material to override the Mesh's + * material. + */ + get: function () { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + return this._subMeshes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Mesh.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * + */ + Mesh.prototype.bakeTransformations = function () { + this.geometry.applyTransformation(this._iMatrix3D); + this._iMatrix3D.identity(); + }; + + /** + * @inheritDoc + */ + Mesh.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + this.material = null; + this.geometry = null; + }; + + /** + * Disposes mesh including the animator and children. This is a merely a convenience method. + * @return + */ + Mesh.prototype.disposeWithAnimatorAndChildren = function () { + this.disposeWithChildren(); + + if (this._animator) + this._animator.dispose(); + }; + + /** + * Clones this Mesh instance along with all it's children, while re-using the same + * material, geometry and animation set. The returned result will be a copy of this mesh, + * containing copies of all of it's children. + * + * Properties that are re-used (i.e. not cloned) by the new copy include name, + * geometry, and material. Properties that are cloned or created anew for the copy + * include subMeshes, children of the mesh, and the animator. + * + * If you want to copy just the mesh, reusing it's geometry and material while not + * cloning it's children, the simplest way is to create a new mesh manually: + * + * + * var clone : Mesh = new Mesh(original.geometry, original.material); + * + */ + Mesh.prototype.clone = function () { + var clone = new Mesh(this._geometry, this._material); + + clone._iMatrix3D = this._iMatrix3D; + clone.pivot = this.pivot; + clone.partition = this.partition; + clone.bounds = this.bounds.clone(); + + clone.name = this.name; + clone.castsShadows = this.castsShadows; + clone.shareAnimationGeometry = this.shareAnimationGeometry; + clone.mouseEnabled = this.mouseEnabled; + clone.mouseChildren = this.mouseChildren; + + //this is of course no proper cloning + //maybe use this instead?: http://blog.another-d-mention.ro/programming/how-to-clone-duplicate-an-object-in-actionscript-3/ + clone.extra = this.extra; + + var len = this._subMeshes.length; + for (var i = 0; i < len; ++i) + clone._subMeshes[i].material = this._subMeshes[i]._iGetExplicitMaterial(); + + len = this.numChildren; + var obj; + + for (i = 0; i < len; ++i) { + obj = this.getChildAt(i).clone(); + clone.addChild(obj); + } + + if (this._animator) + clone.animator = this._animator.clone(); + + return clone; + }; + + /** + * //TODO + * + * @param subGeometry + * @returns {SubMeshBase} + */ + Mesh.prototype.getSubMeshFromSubGeometry = function (subGeometry) { + return this._subMeshes[this._geometry.subGeometries.indexOf(subGeometry)]; + }; + + /** + * @protected + */ + Mesh.prototype.pCreateEntityPartitionNode = function () { + return new EntityNode(this); + }; + + /** + * //TODO + * + * @protected + */ + Mesh.prototype.pUpdateBounds = function () { + this._pBounds.fromGeometry(this._geometry); + + _super.prototype.pUpdateBounds.call(this); + }; + + /** + * //TODO + * + * @private + */ + Mesh.prototype.onGeometryBoundsInvalid = function (event) { + this.pInvalidateBounds(); + }; + + /** + * Called when a SubGeometry was added to the Geometry. + * + * @private + */ + Mesh.prototype.onSubGeometryAdded = function (event) { + this.addSubMesh(event.subGeometry); + }; + + /** + * Called when a SubGeometry was removed from the Geometry. + * + * @private + */ + Mesh.prototype.onSubGeometryRemoved = function (event) { + var subMesh; + var subGeom = event.subGeometry; + var len = this._subMeshes.length; + var i; + + for (i = 0; i < len; ++i) { + subMesh = this._subMeshes[i]; + + if (subMesh.subGeometry == subGeom) { + subMesh.dispose(); + + this._subMeshes.splice(i, 1); + + break; + } + } + + --len; + for (; i < len; ++i) + this._subMeshes[i]._iIndex = i; + }; + + /** + * Adds a SubMeshBase wrapping a SubGeometry. + * + * @param subGeometry + */ + Mesh.prototype.addSubMesh = function (subGeometry) { + var SubMeshClass = subGeometry.subMeshClass; + + var subMesh = new SubMeshClass(subGeometry, this, null); + var len = this._subMeshes.length; + + subMesh._iIndex = len; + + this._subMeshes[len] = subMesh; + + this.pInvalidateBounds(); + }; + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + Mesh.prototype._iTestCollision = function (shortestCollisionDistance, findClosest) { + return this._pPickingCollider.testMeshCollision(this, this._pPickingCollisionVO, shortestCollisionDistance, findClosest); + }; + + /** + * + * @param renderer + * + * @internal + */ + Mesh.prototype._iCollectRenderables = function (renderer) { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + var len = this._subMeshes.length; + for (var i = 0; i < len; i++) + this._subMeshes[i]._iCollectRenderable(renderer); + }; + + Mesh.prototype._iInvalidateRenderableGeometries = function () { + var len = this._subMeshes.length; + for (var i = 0; i < len; ++i) + this._subMeshes[i]._iInvalidateRenderableGeometry(); + }; + return Mesh; +})(DisplayObjectContainer); + +module.exports = Mesh; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL01lc2gudHMiXSwibmFtZXMiOlsiTWVzaCIsIk1lc2guY29uc3RydWN0b3IiLCJNZXNoLmJha2VUcmFuc2Zvcm1hdGlvbnMiLCJNZXNoLmRpc3Bvc2UiLCJNZXNoLmRpc3Bvc2VXaXRoQW5pbWF0b3JBbmRDaGlsZHJlbiIsIk1lc2guY2xvbmUiLCJNZXNoLmdldFN1Yk1lc2hGcm9tU3ViR2VvbWV0cnkiLCJNZXNoLnBDcmVhdGVFbnRpdHlQYXJ0aXRpb25Ob2RlIiwiTWVzaC5wVXBkYXRlQm91bmRzIiwiTWVzaC5vbkdlb21ldHJ5Qm91bmRzSW52YWxpZCIsIk1lc2gub25TdWJHZW9tZXRyeUFkZGVkIiwiTWVzaC5vblN1Ykdlb21ldHJ5UmVtb3ZlZCIsIk1lc2guYWRkU3ViTWVzaCIsIk1lc2guX2lUZXN0Q29sbGlzaW9uIiwiTWVzaC5faUNvbGxlY3RSZW5kZXJhYmxlcyIsIk1lc2guX2lJbnZhbGlkYXRlUmVuZGVyYWJsZUdlb21ldHJpZXMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHlGQUM4Rjs7QUFFOUYsNERBQXFFOztBQU1yRSxpRUFBeUU7QUFDekUscUVBQTZFOztBQUU3RSxtRUFBMEU7O0FBSTFFOzs7O0VBSUc7QUFDSDtJQUFtQkEsdUJBQXNCQTtJQTJMeENBOzs7OztNQURHQTtJQUNIQSxjQUFZQSxRQUFpQkEsRUFBRUEsUUFBNEJBO1FBQTVCQyx1Q0FBQUEsUUFBUUEsR0FBZ0JBLElBQUlBO0FBQUFBLFFBQTNEQSxpQkFnQkNBO1FBZEFBLFdBQU1BLEtBQUFBLENBQUNBO1FBckxSQSxLQUFRQSxhQUFhQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUNyQ0EsS0FBUUEsdUJBQXVCQSxHQUFXQSxJQUFJQSxDQUFDQTs7UUFzTDlDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQTs7UUFFdEJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBLEtBQUtBLENBQVdBLENBQUNBOztRQUV2Q0EsSUFBSUEsQ0FBQ0EsZ0NBQWdDQSxHQUFHQSxVQUFDQSxLQUFtQkE7bUJBQUtBLEtBQUlBLENBQUNBLHVCQUF1QkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBbkNBLENBQW1DQTtRQUNwR0EsSUFBSUEsQ0FBQ0EsMkJBQTJCQSxHQUFHQSxVQUFDQSxLQUFtQkE7bUJBQUtBLEtBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBOUJBLENBQThCQTtRQUMxRkEsSUFBSUEsQ0FBQ0EsNkJBQTZCQSxHQUFHQSxVQUFDQSxLQUFtQkE7bUJBQUtBLEtBQUlBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBaENBLENBQWdDQTs7UUFFOUZBLDRJQUE0SUE7UUFDNUlBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLFFBQVFBLElBQUlBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBOztRQUUxQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsUUFBUUE7SUFDekJBLENBQUNBO0lBekxERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsU0FBU0E7UUFDdEJBLENBQUNBO1FBRURBLEtBQUFBLFVBQW9CQSxLQUFlQTtZQUVsQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsU0FBU0E7Z0JBQ2pCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTs7WUFFbENBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLEtBQUtBOztZQUV0QkEsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUE7WUFDdkNBLElBQUlBLE9BQU9BOztZQUVYQSxLQUFLQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDcENBLE9BQU9BLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBOztnQkFFNUJBLDJHQUEyR0E7Z0JBQzNHQSxJQUFJQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFFQTtvQkFDckJBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLFlBQVlBLENBQUNBLE9BQU9BLENBQUNBO29CQUN0Q0EsT0FBT0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0E7aUJBQ25DQTs7Z0JBRURBLDRFQUE0RUE7Z0JBQzVFQSxPQUFPQSxDQUFDQSw4QkFBOEJBLENBQUNBLENBQUNBO2FBQ3hDQTs7WUFFREEsSUFBSUEsSUFBSUEsQ0FBQ0EsU0FBU0E7Z0JBQ2pCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUNoQ0EsQ0FBQ0E7Ozs7QUEzQkFBOztJQWdDREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLFNBQVNBLENBQUNBLElBQUlBO1FBQ3RCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDMUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXdCQSxLQUFhQTtZQUVwQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsS0FBS0E7UUFDM0JBLENBQUNBOzs7O0FBTEFBOztJQVVEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsY0FBY0E7Z0JBQ3RCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTs7WUFFbENBLE9BQU9BLElBQUlBLENBQUNBLFNBQVNBO1FBQ3RCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFvQkEsS0FBY0E7WUFFakNBLElBQUlBLENBQUNBOztZQUVMQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFFQTtnQkFDbkJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsY0FBY0EsRUFBRUEsSUFBSUEsQ0FBQ0EsZ0NBQWdDQSxDQUFDQTtnQkFDdkdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsYUFBYUEsQ0FBQ0Esa0JBQWtCQSxFQUFFQSxJQUFJQSxDQUFDQSwyQkFBMkJBLENBQUNBO2dCQUN0R0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxhQUFhQSxDQUFDQSxvQkFBb0JBLEVBQUVBLElBQUlBLENBQUNBLDZCQUE2QkEsQ0FBQ0E7O2dCQUUxR0EsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0E7b0JBQzFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTs7Z0JBRTlCQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQTthQUMxQkE7O1lBRURBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLEtBQUtBOztZQUV0QkEsSUFBSUEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBRUE7Z0JBRW5CQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGFBQWFBLENBQUNBLGNBQWNBLEVBQUVBLElBQUlBLENBQUNBLGdDQUFnQ0EsQ0FBQ0E7Z0JBQ3BHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGFBQWFBLENBQUNBLGtCQUFrQkEsRUFBRUEsSUFBSUEsQ0FBQ0EsMkJBQTJCQSxDQUFDQTtnQkFDbkdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsYUFBYUEsQ0FBQ0Esb0JBQW9CQSxFQUFFQSxJQUFJQSxDQUFDQSw2QkFBNkJBLENBQUNBOztnQkFFdkdBLElBQUlBLFFBQVFBLEdBQTBCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxhQUFhQTs7Z0JBRWxFQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxRQUFRQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQTtvQkFDbkNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzlCQTtRQUNGQSxDQUFDQTs7OztBQTlCQUE7O0lBbUNEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsU0FBU0E7UUFDdEJBLENBQUNBO1FBRURBLEtBQUFBLFVBQW9CQSxLQUFrQkE7WUFFckNBLElBQUlBLEtBQUtBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBO2dCQUMxQkEsTUFBT0EsQ0FBQUE7O1lBRVJBLElBQUlBLENBQUNBO1lBQ0xBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLE1BQU1BO1lBQ3ZDQSxJQUFJQSxPQUFPQTs7WUFFWEEsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsQ0FBQ0EsRUFBRUE7Z0JBQ3ZCQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxRQUFRQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQTtvQkFDOUVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLFlBQVlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBOztZQUV2Q0EsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsS0FBS0E7O1lBRXRCQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxDQUFDQSxFQUFFQTtnQkFDdkJBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBLElBQUlBLENBQUNBLE9BQU9BLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBO29CQUM5RUEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7UUFDckNBLENBQUNBOzs7O0FBcEJBQTs7SUF5QkRBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSx1QkFBdUJBO1FBQ3BDQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFrQ0EsS0FBYUE7WUFFOUNBLElBQUlBLENBQUNBLHVCQUF1QkEsR0FBR0EsS0FBS0E7UUFDckNBLENBQUNBOzs7O0FBTEFBOztJQVdEQTtRQUFBQTs7O1VBREdBO2FBQ0hBO1lBRUNBLHVFQUF1RUE7WUFDdkVBLGtFQUFrRUE7WUFDbEVBLGlEQUFpREE7WUFDakRBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBO2dCQUN0QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1lBRWxDQSxPQUFPQSxJQUFJQSxDQUFDQSxVQUFVQTtRQUN2QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBO1FBQ3pCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF1QkEsS0FBaUJBO1lBRXZDQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxLQUFLQTtRQUMxQkEsQ0FBQ0E7Ozs7QUFMQUE7O0lBa0NEQTs7TUFER0E7eUNBQ0hBO1FBRUNFLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0E7UUFDbERBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO0lBQzNCQSxDQUFDQTs7SUFLREY7O01BREdBOzZCQUNIQTtRQUVDRyxnQkFBS0EsQ0FBQ0EsT0FBT0EsS0FBQ0EsS0FBQUEsQ0FBQ0E7O1FBRWZBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBO1FBQ3BCQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxJQUFJQTtJQUNyQkEsQ0FBQ0E7O0lBTURIOzs7TUFER0E7b0RBQ0hBO1FBRUNJLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7O1FBRXpCQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQTtZQUNsQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDM0JBLENBQUNBOztJQWtCREo7Ozs7Ozs7Ozs7Ozs7OztNQURHQTsyQkFDSEE7UUFFQ0ssSUFBSUEsS0FBS0EsR0FBUUEsSUFBSUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsRUFBRUEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7O1FBRXpEQSxLQUFLQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQTtRQUNsQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7UUFDeEJBLEtBQUtBLENBQUNBLFNBQVNBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBO1FBQ2hDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTs7UUFHbENBLEtBQUtBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBO1FBQ3RCQSxLQUFLQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN0Q0EsS0FBS0EsQ0FBQ0Esc0JBQXNCQSxHQUFHQSxJQUFJQSxDQUFDQSxzQkFBc0JBO1FBQzFEQSxLQUFLQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN0Q0EsS0FBS0EsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUE7O1FBQ3hDQSxxQ0FBcUNBO1FBQ3JDQSwySEFBMkhBO1FBQzNIQSxLQUFLQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQTs7UUFFeEJBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLE1BQU1BO1FBQ3ZDQSxLQUFLQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxFQUFFQSxDQUFDQTtZQUNsQ0EsS0FBS0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFHM0VBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLFdBQVdBO1FBQ3RCQSxJQUFJQSxHQUFHQTs7UUFFUEEsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBRUE7WUFDekJBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1lBQ2hDQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUEwQkEsR0FBR0EsQ0FBQ0E7U0FDNUNBOztRQUVEQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQTtZQUNqQkEsS0FBS0EsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRXpDQSxPQUFPQSxLQUFLQTtJQUNiQSxDQUFDQTs7SUFRREw7Ozs7O01BREdBOytDQUNIQSxVQUFpQ0EsV0FBMkJBO1FBRTNETSxPQUFPQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxhQUFhQSxDQUFDQSxPQUFPQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTtJQUMxRUEsQ0FBQ0E7O0lBS0ROOztNQURHQTtnREFDSEE7UUFFQ08sT0FBT0EsSUFBSUEsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFDNUJBLENBQUNBOztJQU9EUDs7OztNQURHQTttQ0FDSEE7UUFFQ1EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7O1FBRTFDQSxnQkFBS0EsQ0FBQ0EsYUFBYUEsS0FBQ0EsS0FBQUEsQ0FBQ0E7SUFDdEJBLENBQUNBOztJQU9EUjs7OztNQURHQTs2Q0FDSEEsVUFBZ0NBLEtBQW1CQTtRQUVsRFMsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtJQUN6QkEsQ0FBQ0E7O0lBT0RUOzs7O01BREdBO3dDQUNIQSxVQUEyQkEsS0FBbUJBO1FBRTdDVSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQSxXQUFXQSxDQUFDQTtJQUNuQ0EsQ0FBQ0E7O0lBT0RWOzs7O01BREdBOzBDQUNIQSxVQUE2QkEsS0FBbUJBO1FBRS9DVyxJQUFJQSxPQUFPQTtRQUNYQSxJQUFJQSxPQUFPQSxHQUFtQkEsS0FBS0EsQ0FBQ0EsV0FBV0E7UUFDL0NBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLE1BQU1BO1FBQ3ZDQSxJQUFJQSxDQUFDQTs7UUFNTEEsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBRUE7WUFFekJBLE9BQU9BLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBOztZQUU1QkEsSUFBSUEsT0FBT0EsQ0FBQ0EsV0FBV0EsSUFBSUEsT0FBT0EsQ0FBRUE7Z0JBQ25DQSxPQUFPQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQTs7Z0JBRWpCQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTs7Z0JBRTVCQSxLQUFNQTthQUNOQTtTQUNEQTs7UUFFREEsRUFBRUEsR0FBR0E7UUFDTEEsT0FBT0EsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsRUFBRUEsQ0FBQ0E7WUFDbEJBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLE9BQU9BLEdBQUdBLENBQUNBLENBQUNBO0lBQ2pDQSxDQUFDQTs7SUFPRFg7Ozs7TUFER0E7Z0NBQ0hBLFVBQW1CQSxXQUEyQkE7UUFFN0NZLElBQUlBLFlBQVlBLEdBQWlCQSxXQUFXQSxDQUFDQSxZQUFZQTs7UUFFekRBLElBQUlBLE9BQU9BLEdBQVlBLElBQUlBLFlBQVlBLENBQUNBLFdBQVdBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLENBQUNBO1FBQ2hFQSxJQUFJQSxHQUFHQSxHQUFVQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQTs7UUFFdkNBLE9BQU9BLENBQUNBLE9BQU9BLEdBQUdBLEdBQUdBOztRQUVyQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0E7O1FBRTlCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO0lBQ3pCQSxDQUFDQTs7SUFXRFo7Ozs7Ozs7O01BREdBO3FDQUNIQSxVQUF1QkEseUJBQWdDQSxFQUFFQSxXQUFtQkE7UUFFM0VhLE9BQU9BLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxvQkFBb0JBLEVBQUVBLHlCQUF5QkEsRUFBRUEsV0FBV0EsQ0FBQ0E7SUFDekhBLENBQUNBOztJQVFEYjs7Ozs7TUFER0E7MENBQ0hBLFVBQTRCQSxRQUFrQkE7UUFFN0NjLHVFQUF1RUE7UUFDdkVBLGtFQUFrRUE7UUFDbEVBLGlEQUFpREE7UUFDakRBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBO1lBQ3RCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFbENBLElBQUlBLEdBQUdBLEdBQW1CQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQTtRQUNoREEsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBbUJBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBO1lBQzNDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO0lBQ25EQSxDQUFDQTs7SUFFRGQsa0RBQUFBO1FBRUNlLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLE1BQU1BO1FBQ3ZDQSxLQUFLQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxFQUFFQSxDQUFDQTtZQUNsQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsOEJBQThCQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUN0REEsQ0FBQ0E7SUFDRmYsWUFBQ0E7QUFBREEsQ0FBQ0EsRUFsYmtCLHNCQUFzQixFQWtieEM7O0FBRUQscUJBQWMsQ0FBQSIsImZpbGUiOiJlbnRpdGllcy9NZXNoLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElBbmltYXRvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYW5pbWF0b3JzL0lBbmltYXRvclwiKTtcbmltcG9ydCBEaXNwbGF5T2JqZWN0Q29udGFpbmVyXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL0Rpc3BsYXlPYmplY3RDb250YWluZXJcIik7XG5pbXBvcnQgRGlzcGxheU9iamVjdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IEdlb21ldHJ5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9HZW9tZXRyeVwiKTtcbmltcG9ydCBJU3ViTWVzaFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvSVN1Yk1lc2hcIik7XG5pbXBvcnQgSVN1Yk1lc2hDbGFzc1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JU3ViTWVzaENsYXNzXCIpO1xuaW1wb3J0IFRyaWFuZ2xlU3ViR2VvbWV0cnlcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1RyaWFuZ2xlU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgU3ViR2VvbWV0cnlCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1N1Ykdlb21ldHJ5QmFzZVwiKTtcbmltcG9ydCBVVlRyYW5zZm9ybVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1VWVHJhbnNmb3JtXCIpO1xuaW1wb3J0IEFzc2V0VHlwZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0VHlwZVwiKTtcbmltcG9ydCBFbnRpdHlOb2RlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9FbnRpdHlOb2RlXCIpO1xuaW1wb3J0IElSZW5kZXJlclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvSVJlbmRlcmVyXCIpO1xuaW1wb3J0IEdlb21ldHJ5RXZlbnRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvR2VvbWV0cnlFdmVudFwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5pbXBvcnQgTWF0ZXJpYWxCYXNlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvTWF0ZXJpYWxCYXNlXCIpO1xuXG4vKipcbiAqIE1lc2ggaXMgYW4gaW5zdGFuY2Ugb2YgYSBHZW9tZXRyeSwgYXVnbWVudGluZyBpdCB3aXRoIGEgcHJlc2VuY2UgaW4gdGhlIHNjZW5lIGdyYXBoLCBhIG1hdGVyaWFsLCBhbmQgYW4gYW5pbWF0aW9uXG4gKiBzdGF0ZS4gSXQgY29uc2lzdHMgb3V0IG9mIFN1Yk1lc2hlcywgd2hpY2ggaW4gdHVybiBjb3JyZXNwb25kIHRvIFN1Ykdlb21ldHJpZXMuIFN1Yk1lc2hlcyBhbGxvdyBkaWZmZXJlbnQgcGFydHNcbiAqIG9mIHRoZSBnZW9tZXRyeSB0byBiZSBhc3NpZ25lZCBkaWZmZXJlbnQgbWF0ZXJpYWxzLlxuICovXG5jbGFzcyBNZXNoIGV4dGVuZHMgRGlzcGxheU9iamVjdENvbnRhaW5lciBpbXBsZW1lbnRzIElFbnRpdHlcbntcblx0cHJpdmF0ZSBfdXZUcmFuc2Zvcm06VVZUcmFuc2Zvcm07XG5cblx0cHJpdmF0ZSBfc3ViTWVzaGVzOkFycmF5PElTdWJNZXNoPjtcblx0cHJpdmF0ZSBfZ2VvbWV0cnk6R2VvbWV0cnk7XG5cdHByaXZhdGUgX21hdGVyaWFsOk1hdGVyaWFsQmFzZTtcblx0cHJpdmF0ZSBfYW5pbWF0b3I6SUFuaW1hdG9yO1xuXHRwcml2YXRlIF9jYXN0c1NoYWRvd3M6Ym9vbGVhbiA9IHRydWU7XG5cdHByaXZhdGUgX3NoYXJlQW5pbWF0aW9uR2VvbWV0cnk6Ym9vbGVhbiA9IHRydWU7XG5cblx0cHJpdmF0ZSBfb25HZW9tZXRyeUJvdW5kc0ludmFsaWREZWxlZ2F0ZTooZXZlbnQ6R2VvbWV0cnlFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25TdWJHZW9tZXRyeUFkZGVkRGVsZWdhdGU6KGV2ZW50Okdlb21ldHJ5RXZlbnQpID0+IHZvaWQ7XG5cdHByaXZhdGUgX29uU3ViR2VvbWV0cnlSZW1vdmVkRGVsZWdhdGU6KGV2ZW50Okdlb21ldHJ5RXZlbnQpID0+IHZvaWQ7XG5cblx0LyoqXG5cdCAqIERlZmluZXMgdGhlIGFuaW1hdG9yIG9mIHRoZSBtZXNoLiBBY3Qgb24gdGhlIG1lc2gncyBnZW9tZXRyeS4gIERlZmF1bHQgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGFuaW1hdG9yKCk6SUFuaW1hdG9yXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYW5pbWF0b3I7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGFuaW1hdG9yKHZhbHVlOklBbmltYXRvcilcblx0e1xuXHRcdGlmICh0aGlzLl9hbmltYXRvcilcblx0XHRcdHRoaXMuX2FuaW1hdG9yLnJlbW92ZU93bmVyKHRoaXMpO1xuXG5cdFx0dGhpcy5fYW5pbWF0b3IgPSB2YWx1ZTtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fc3ViTWVzaGVzLmxlbmd0aDtcblx0XHR2YXIgc3ViTWVzaDpJU3ViTWVzaDtcblxuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRzdWJNZXNoID0gdGhpcy5fc3ViTWVzaGVzW2ldO1xuXG5cdFx0XHQvLyBjYXVzZSBtYXRlcmlhbCB0byBiZSB1bnJlZ2lzdGVyZWQgYW5kIHJlZ2lzdGVyZWQgYWdhaW4gdG8gd29yayB3aXRoIHRoZSBuZXcgYW5pbWF0aW9uIHR5cGUgKGlmIHBvc3NpYmxlKVxuXHRcdFx0aWYgKHN1Yk1lc2gubWF0ZXJpYWwpIHtcblx0XHRcdFx0c3ViTWVzaC5tYXRlcmlhbC5pUmVtb3ZlT3duZXIoc3ViTWVzaCk7XG5cdFx0XHRcdHN1Yk1lc2gubWF0ZXJpYWwuaUFkZE93bmVyKHN1Yk1lc2gpO1xuXHRcdFx0fVxuXG5cdFx0XHQvL2ludmFsaWRhdGUgYW55IGV4aXN0aW5nIHJlbmRlcmFibGVzIGluIGNhc2UgdGhleSBuZWVkIHRvIHB1bGwgbmV3IGdlb21ldHJ5XG5cdFx0XHRzdWJNZXNoLl9pSW52YWxpZGF0ZVJlbmRlcmFibGVHZW9tZXRyeSgpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9hbmltYXRvcilcblx0XHRcdHRoaXMuX2FuaW1hdG9yLmFkZE93bmVyKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGFzc2V0VHlwZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIEFzc2V0VHlwZS5NRVNIO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgTWVzaCBjYW4gY2FzdCBzaGFkb3dzLiBEZWZhdWx0IHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGdldCBjYXN0c1NoYWRvd3MoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2FzdHNTaGFkb3dzO1xuXHR9XG5cblx0cHVibGljIHNldCBjYXN0c1NoYWRvd3ModmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdHRoaXMuX2Nhc3RzU2hhZG93cyA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBnZW9tZXRyeSB1c2VkIGJ5IHRoZSBtZXNoIHRoYXQgcHJvdmlkZXMgaXQgd2l0aCBpdHMgc2hhcGUuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGdlb21ldHJ5KCk6R2VvbWV0cnlcblx0e1xuXHRcdGlmICh0aGlzLl9pU291cmNlUHJlZmFiKVxuXHRcdFx0dGhpcy5faVNvdXJjZVByZWZhYi5faVZhbGlkYXRlKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZ2VvbWV0cnk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGdlb21ldHJ5KHZhbHVlOkdlb21ldHJ5KVxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyO1xuXG5cdFx0aWYgKHRoaXMuX2dlb21ldHJ5KSB7XG5cdFx0XHR0aGlzLl9nZW9tZXRyeS5yZW1vdmVFdmVudExpc3RlbmVyKEdlb21ldHJ5RXZlbnQuQk9VTkRTX0lOVkFMSUQsIHRoaXMuX29uR2VvbWV0cnlCb3VuZHNJbnZhbGlkRGVsZWdhdGUpO1xuXHRcdFx0dGhpcy5fZ2VvbWV0cnkucmVtb3ZlRXZlbnRMaXN0ZW5lcihHZW9tZXRyeUV2ZW50LlNVQl9HRU9NRVRSWV9BRERFRCwgdGhpcy5fb25TdWJHZW9tZXRyeUFkZGVkRGVsZWdhdGUpO1xuXHRcdFx0dGhpcy5fZ2VvbWV0cnkucmVtb3ZlRXZlbnRMaXN0ZW5lcihHZW9tZXRyeUV2ZW50LlNVQl9HRU9NRVRSWV9SRU1PVkVELCB0aGlzLl9vblN1Ykdlb21ldHJ5UmVtb3ZlZERlbGVnYXRlKTtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX3N1Yk1lc2hlcy5sZW5ndGg7ICsraSlcblx0XHRcdFx0dGhpcy5fc3ViTWVzaGVzW2ldLmRpc3Bvc2UoKTtcblxuXHRcdFx0dGhpcy5fc3ViTWVzaGVzLmxlbmd0aCA9IDA7XG5cdFx0fVxuXG5cdFx0dGhpcy5fZ2VvbWV0cnkgPSB2YWx1ZTtcblxuXHRcdGlmICh0aGlzLl9nZW9tZXRyeSkge1xuXG5cdFx0XHR0aGlzLl9nZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKEdlb21ldHJ5RXZlbnQuQk9VTkRTX0lOVkFMSUQsIHRoaXMuX29uR2VvbWV0cnlCb3VuZHNJbnZhbGlkRGVsZWdhdGUpO1xuXHRcdFx0dGhpcy5fZ2VvbWV0cnkuYWRkRXZlbnRMaXN0ZW5lcihHZW9tZXRyeUV2ZW50LlNVQl9HRU9NRVRSWV9BRERFRCwgdGhpcy5fb25TdWJHZW9tZXRyeUFkZGVkRGVsZWdhdGUpO1xuXHRcdFx0dGhpcy5fZ2VvbWV0cnkuYWRkRXZlbnRMaXN0ZW5lcihHZW9tZXRyeUV2ZW50LlNVQl9HRU9NRVRSWV9SRU1PVkVELCB0aGlzLl9vblN1Ykdlb21ldHJ5UmVtb3ZlZERlbGVnYXRlKTtcblxuXHRcdFx0dmFyIHN1Ykdlb21zOkFycmF5PFN1Ykdlb21ldHJ5QmFzZT4gPSB0aGlzLl9nZW9tZXRyeS5zdWJHZW9tZXRyaWVzO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgc3ViR2VvbXMubGVuZ3RoOyArK2kpXG5cdFx0XHRcdHRoaXMuYWRkU3ViTWVzaChzdWJHZW9tc1tpXSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtYXRlcmlhbCB3aXRoIHdoaWNoIHRvIHJlbmRlciB0aGUgTWVzaC5cblx0ICovXG5cdHB1YmxpYyBnZXQgbWF0ZXJpYWwoKTpNYXRlcmlhbEJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9tYXRlcmlhbDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbWF0ZXJpYWwodmFsdWU6TWF0ZXJpYWxCYXNlKVxuXHR7XG5cdFx0aWYgKHZhbHVlID09IHRoaXMuX21hdGVyaWFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dmFyIGk6bnVtYmVyO1xuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fc3ViTWVzaGVzLmxlbmd0aDtcblx0XHR2YXIgc3ViTWVzaDpJU3ViTWVzaDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcblx0XHRcdGlmICh0aGlzLl9tYXRlcmlhbCAmJiAoc3ViTWVzaCA9IHRoaXMuX3N1Yk1lc2hlc1tpXSkubWF0ZXJpYWwgPT0gdGhpcy5fbWF0ZXJpYWwpXG5cdFx0XHRcdHRoaXMuX21hdGVyaWFsLmlSZW1vdmVPd25lcihzdWJNZXNoKTtcblxuXHRcdHRoaXMuX21hdGVyaWFsID0gdmFsdWU7XG5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspXG5cdFx0XHRpZiAodGhpcy5fbWF0ZXJpYWwgJiYgKHN1Yk1lc2ggPSB0aGlzLl9zdWJNZXNoZXNbaV0pLm1hdGVyaWFsID09IHRoaXMuX21hdGVyaWFsKVxuXHRcdFx0XHR0aGlzLl9tYXRlcmlhbC5pQWRkT3duZXIoc3ViTWVzaCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBtZXNoIHNoYXJlIHRoZSBzYW1lIGFuaW1hdGlvbiBnZW9tZXRyeS5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2hhcmVBbmltYXRpb25HZW9tZXRyeSgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9zaGFyZUFuaW1hdGlvbkdlb21ldHJ5O1xuXHR9XG5cblx0cHVibGljIHNldCBzaGFyZUFuaW1hdGlvbkdlb21ldHJ5KHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHR0aGlzLl9zaGFyZUFuaW1hdGlvbkdlb21ldHJ5ID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIFN1Yk1lc2hlcyBvdXQgb2Ygd2hpY2ggdGhlIE1lc2ggY29uc2lzdHMuIEV2ZXJ5IFN1Yk1lc2ggY2FuIGJlIGFzc2lnbmVkIGEgbWF0ZXJpYWwgdG8gb3ZlcnJpZGUgdGhlIE1lc2gnc1xuXHQgKiBtYXRlcmlhbC5cblx0ICovXG5cdHB1YmxpYyBnZXQgc3ViTWVzaGVzKCk6QXJyYXk8SVN1Yk1lc2g+XG5cdHtcblx0XHQvLyBTaW5jZSB0aGlzIGdldHRlciBpcyBpbnZva2VkIGV2ZXJ5IGl0ZXJhdGlvbiBvZiB0aGUgcmVuZGVyIGxvb3AsIGFuZFxuXHRcdC8vIHRoZSBwcmVmYWIgY29uc3RydWN0IGNvdWxkIGFmZmVjdCB0aGUgc3ViLW1lc2hlcywgdGhlIHByZWZhYiBpc1xuXHRcdC8vIHZhbGlkYXRlZCBoZXJlIHRvIGdpdmUgaXQgYSBjaGFuY2UgdG8gcmVidWlsZC5cblx0XHRpZiAodGhpcy5faVNvdXJjZVByZWZhYilcblx0XHRcdHRoaXMuX2lTb3VyY2VQcmVmYWIuX2lWYWxpZGF0ZSgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuX3N1Yk1lc2hlcztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB1dlRyYW5zZm9ybSgpOlVWVHJhbnNmb3JtXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdXZUcmFuc2Zvcm07XG5cdH1cblxuXHRwdWJsaWMgc2V0IHV2VHJhbnNmb3JtKHZhbHVlOlVWVHJhbnNmb3JtKVxuXHR7XG5cdFx0dGhpcy5fdXZUcmFuc2Zvcm0gPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBuZXcgTWVzaCBvYmplY3QuXG5cdCAqXG5cdCAqIEBwYXJhbSBnZW9tZXRyeSAgICAgICAgICAgICAgICAgICAgVGhlIGdlb21ldHJ5IHVzZWQgYnkgdGhlIG1lc2ggdGhhdCBwcm92aWRlcyBpdCB3aXRoIGl0cyBzaGFwZS5cblx0ICogQHBhcmFtIG1hdGVyaWFsICAgIFtvcHRpb25hbF0gICAgICAgIFRoZSBtYXRlcmlhbCB3aXRoIHdoaWNoIHRvIHJlbmRlciB0aGUgTWVzaC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKGdlb21ldHJ5Okdlb21ldHJ5LCBtYXRlcmlhbDpNYXRlcmlhbEJhc2UgPSBudWxsKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX3BJc0VudGl0eSA9IHRydWU7XG5cblx0XHR0aGlzLl9zdWJNZXNoZXMgPSBuZXcgQXJyYXk8SVN1Yk1lc2g+KCk7XG5cblx0XHR0aGlzLl9vbkdlb21ldHJ5Qm91bmRzSW52YWxpZERlbGVnYXRlID0gKGV2ZW50Okdlb21ldHJ5RXZlbnQpID0+IHRoaXMub25HZW9tZXRyeUJvdW5kc0ludmFsaWQoZXZlbnQpO1xuXHRcdHRoaXMuX29uU3ViR2VvbWV0cnlBZGRlZERlbGVnYXRlID0gKGV2ZW50Okdlb21ldHJ5RXZlbnQpID0+IHRoaXMub25TdWJHZW9tZXRyeUFkZGVkKGV2ZW50KTtcblx0XHR0aGlzLl9vblN1Ykdlb21ldHJ5UmVtb3ZlZERlbGVnYXRlID0gKGV2ZW50Okdlb21ldHJ5RXZlbnQpID0+IHRoaXMub25TdWJHZW9tZXRyeVJlbW92ZWQoZXZlbnQpO1xuXG5cdFx0Ly90aGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBpZiBwZW9wbGUgaW5zaXN0IG9uIHRyeWluZyB0byBjcmVhdGUgdGhlaXIgbWVzaGVzIGJlZm9yZSB0aGV5IGhhdmUgZ2VvbWV0cnkgdG8gZmlsbCBpdCwgaXQgYmVjb21lcyBuZWNlc3Nhcnlcblx0XHR0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgfHwgbmV3IEdlb21ldHJ5KCk7XG5cblx0XHR0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWw7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBiYWtlVHJhbnNmb3JtYXRpb25zKClcblx0e1xuXHRcdHRoaXMuZ2VvbWV0cnkuYXBwbHlUcmFuc2Zvcm1hdGlvbih0aGlzLl9pTWF0cml4M0QpO1xuXHRcdHRoaXMuX2lNYXRyaXgzRC5pZGVudGl0eSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHRzdXBlci5kaXNwb3NlKCk7XG5cblx0XHR0aGlzLm1hdGVyaWFsID0gbnVsbDtcblx0XHR0aGlzLmdlb21ldHJ5ID0gbnVsbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBEaXNwb3NlcyBtZXNoIGluY2x1ZGluZyB0aGUgYW5pbWF0b3IgYW5kIGNoaWxkcmVuLiBUaGlzIGlzIGEgbWVyZWx5IGEgY29udmVuaWVuY2UgbWV0aG9kLlxuXHQgKiBAcmV0dXJuXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZVdpdGhBbmltYXRvckFuZENoaWxkcmVuKClcblx0e1xuXHRcdHRoaXMuZGlzcG9zZVdpdGhDaGlsZHJlbigpO1xuXG5cdFx0IGlmICh0aGlzLl9hbmltYXRvcilcblx0XHRcdHRoaXMuX2FuaW1hdG9yLmRpc3Bvc2UoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9uZXMgdGhpcyBNZXNoIGluc3RhbmNlIGFsb25nIHdpdGggYWxsIGl0J3MgY2hpbGRyZW4sIHdoaWxlIHJlLXVzaW5nIHRoZSBzYW1lXG5cdCAqIG1hdGVyaWFsLCBnZW9tZXRyeSBhbmQgYW5pbWF0aW9uIHNldC4gVGhlIHJldHVybmVkIHJlc3VsdCB3aWxsIGJlIGEgY29weSBvZiB0aGlzIG1lc2gsXG5cdCAqIGNvbnRhaW5pbmcgY29waWVzIG9mIGFsbCBvZiBpdCdzIGNoaWxkcmVuLlxuXHQgKlxuXHQgKiBQcm9wZXJ0aWVzIHRoYXQgYXJlIHJlLXVzZWQgKGkuZS4gbm90IGNsb25lZCkgYnkgdGhlIG5ldyBjb3B5IGluY2x1ZGUgbmFtZSxcblx0ICogZ2VvbWV0cnksIGFuZCBtYXRlcmlhbC4gUHJvcGVydGllcyB0aGF0IGFyZSBjbG9uZWQgb3IgY3JlYXRlZCBhbmV3IGZvciB0aGUgY29weVxuXHQgKiBpbmNsdWRlIHN1Yk1lc2hlcywgY2hpbGRyZW4gb2YgdGhlIG1lc2gsIGFuZCB0aGUgYW5pbWF0b3IuXG5cdCAqXG5cdCAqIElmIHlvdSB3YW50IHRvIGNvcHkganVzdCB0aGUgbWVzaCwgcmV1c2luZyBpdCdzIGdlb21ldHJ5IGFuZCBtYXRlcmlhbCB3aGlsZSBub3Rcblx0ICogY2xvbmluZyBpdCdzIGNoaWxkcmVuLCB0aGUgc2ltcGxlc3Qgd2F5IGlzIHRvIGNyZWF0ZSBhIG5ldyBtZXNoIG1hbnVhbGx5OlxuXHQgKlxuXHQgKiA8Y29kZT5cblx0ICogdmFyIGNsb25lIDogTWVzaCA9IG5ldyBNZXNoKG9yaWdpbmFsLmdlb21ldHJ5LCBvcmlnaW5hbC5tYXRlcmlhbCk7XG5cdCAqIDwvY29kZT5cblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHZhciBjbG9uZTpNZXNoID0gbmV3IE1lc2godGhpcy5fZ2VvbWV0cnksIHRoaXMuX21hdGVyaWFsKTtcblxuXHRcdGNsb25lLl9pTWF0cml4M0QgPSB0aGlzLl9pTWF0cml4M0Q7XG5cdFx0Y2xvbmUucGl2b3QgPSB0aGlzLnBpdm90O1xuXHRcdGNsb25lLnBhcnRpdGlvbiA9IHRoaXMucGFydGl0aW9uO1xuXHRcdGNsb25lLmJvdW5kcyA9IHRoaXMuYm91bmRzLmNsb25lKCk7XG5cblxuXHRcdGNsb25lLm5hbWUgPSB0aGlzLm5hbWU7XG5cdFx0Y2xvbmUuY2FzdHNTaGFkb3dzID0gdGhpcy5jYXN0c1NoYWRvd3M7XG5cdFx0Y2xvbmUuc2hhcmVBbmltYXRpb25HZW9tZXRyeSA9IHRoaXMuc2hhcmVBbmltYXRpb25HZW9tZXRyeTtcblx0XHRjbG9uZS5tb3VzZUVuYWJsZWQgPSB0aGlzLm1vdXNlRW5hYmxlZDtcblx0XHRjbG9uZS5tb3VzZUNoaWxkcmVuID0gdGhpcy5tb3VzZUNoaWxkcmVuO1xuXHRcdC8vdGhpcyBpcyBvZiBjb3Vyc2Ugbm8gcHJvcGVyIGNsb25pbmdcblx0XHQvL21heWJlIHVzZSB0aGlzIGluc3RlYWQ/OiBodHRwOi8vYmxvZy5hbm90aGVyLWQtbWVudGlvbi5yby9wcm9ncmFtbWluZy9ob3ctdG8tY2xvbmUtZHVwbGljYXRlLWFuLW9iamVjdC1pbi1hY3Rpb25zY3JpcHQtMy9cblx0XHRjbG9uZS5leHRyYSA9IHRoaXMuZXh0cmE7XG5cblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX3N1Yk1lc2hlcy5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyArK2kpXG5cdFx0XHRjbG9uZS5fc3ViTWVzaGVzW2ldLm1hdGVyaWFsID0gdGhpcy5fc3ViTWVzaGVzW2ldLl9pR2V0RXhwbGljaXRNYXRlcmlhbCgpO1xuXG5cblx0XHRsZW4gPSB0aGlzLm51bUNoaWxkcmVuO1xuXHRcdHZhciBvYmo6YW55O1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRvYmogPSB0aGlzLmdldENoaWxkQXQoaSkuY2xvbmUoKTtcblx0XHRcdGNsb25lLmFkZENoaWxkKDxEaXNwbGF5T2JqZWN0Q29udGFpbmVyPiBvYmopO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl9hbmltYXRvcilcblx0XHRcdGNsb25lLmFuaW1hdG9yID0gdGhpcy5fYW5pbWF0b3IuY2xvbmUoKTtcblxuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdC8qKlxuXHQgKiAvL1RPRE9cblx0ICpcblx0ICogQHBhcmFtIHN1Ykdlb21ldHJ5XG5cdCAqIEByZXR1cm5zIHtTdWJNZXNoQmFzZX1cblx0ICovXG5cdHB1YmxpYyBnZXRTdWJNZXNoRnJvbVN1Ykdlb21ldHJ5KHN1Ykdlb21ldHJ5OlN1Ykdlb21ldHJ5QmFzZSk6SVN1Yk1lc2hcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zdWJNZXNoZXNbdGhpcy5fZ2VvbWV0cnkuc3ViR2VvbWV0cmllcy5pbmRleE9mKHN1Ykdlb21ldHJ5KV07XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBDcmVhdGVFbnRpdHlQYXJ0aXRpb25Ob2RlKCk6RW50aXR5Tm9kZVxuXHR7XG5cdFx0cmV0dXJuIG5ldyBFbnRpdHlOb2RlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIC8vVE9ET1xuXHQgKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgcFVwZGF0ZUJvdW5kcygpXG5cdHtcblx0XHR0aGlzLl9wQm91bmRzLmZyb21HZW9tZXRyeSh0aGlzLl9nZW9tZXRyeSk7XG5cblx0XHRzdXBlci5wVXBkYXRlQm91bmRzKCk7XG5cdH1cblxuXHQvKipcblx0ICogLy9UT0RPXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcml2YXRlIG9uR2VvbWV0cnlCb3VuZHNJbnZhbGlkKGV2ZW50Okdlb21ldHJ5RXZlbnQpXG5cdHtcblx0XHR0aGlzLnBJbnZhbGlkYXRlQm91bmRzKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSBTdWJHZW9tZXRyeSB3YXMgYWRkZWQgdG8gdGhlIEdlb21ldHJ5LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJpdmF0ZSBvblN1Ykdlb21ldHJ5QWRkZWQoZXZlbnQ6R2VvbWV0cnlFdmVudClcblx0e1xuXHRcdHRoaXMuYWRkU3ViTWVzaChldmVudC5zdWJHZW9tZXRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYSBTdWJHZW9tZXRyeSB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBHZW9tZXRyeS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgb25TdWJHZW9tZXRyeVJlbW92ZWQoZXZlbnQ6R2VvbWV0cnlFdmVudClcblx0e1xuXHRcdHZhciBzdWJNZXNoOklTdWJNZXNoO1xuXHRcdHZhciBzdWJHZW9tOlN1Ykdlb21ldHJ5QmFzZSA9IGV2ZW50LnN1Ykdlb21ldHJ5O1xuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fc3ViTWVzaGVzLmxlbmd0aDtcblx0XHR2YXIgaTpudW1iZXI7XG5cblx0XHQvLyBJbXBvcnRhbnQhIFRoaXMgaGFzIHRvIGJlIGRvbmUgaGVyZSwgYW5kIG5vdCBkZWxheWVkIHVudGlsIHRoZVxuXHRcdC8vIG5leHQgcmVuZGVyIGxvb3AsIHNpbmNlIHRoaXMgbWF5IGJlIGNhdXNlZCBieSB0aGUgZ2VvbWV0cnkgYmVpbmdcblx0XHQvLyByZWJ1aWx0IElOIFRIRSBSRU5ERVIgTE9PUC4gSW52YWxpZGF0aW5nIGFuZCB3YWl0aW5nIHdpbGwgZGVsYXlcblx0XHQvLyBpdCB1bnRpbCB0aGUgTkVYVCBSRU5ERVIgRlJBTUUgd2hpY2ggaXMgcHJvYmFibHkgbm90IGRlc2lyYWJsZS5cblx0XHRmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcblxuXHRcdFx0c3ViTWVzaCA9IHRoaXMuX3N1Yk1lc2hlc1tpXTtcblxuXHRcdFx0aWYgKHN1Yk1lc2guc3ViR2VvbWV0cnkgPT0gc3ViR2VvbSkge1xuXHRcdFx0XHRzdWJNZXNoLmRpc3Bvc2UoKTtcblxuXHRcdFx0XHR0aGlzLl9zdWJNZXNoZXMuc3BsaWNlKGksIDEpO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC0tbGVuO1xuXHRcdGZvciAoOyBpIDwgbGVuOyArK2kpXG5cdFx0XHR0aGlzLl9zdWJNZXNoZXNbaV0uX2lJbmRleCA9IGk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIFN1Yk1lc2hCYXNlIHdyYXBwaW5nIGEgU3ViR2VvbWV0cnkuXG5cdCAqXG5cdCAqIEBwYXJhbSBzdWJHZW9tZXRyeVxuXHQgKi9cblx0cHJpdmF0ZSBhZGRTdWJNZXNoKHN1Ykdlb21ldHJ5OlN1Ykdlb21ldHJ5QmFzZSlcblx0e1xuXHRcdHZhciBTdWJNZXNoQ2xhc3M6SVN1Yk1lc2hDbGFzcyA9IHN1Ykdlb21ldHJ5LnN1Yk1lc2hDbGFzcztcblxuXHRcdHZhciBzdWJNZXNoOklTdWJNZXNoID0gbmV3IFN1Yk1lc2hDbGFzcyhzdWJHZW9tZXRyeSwgdGhpcywgbnVsbCk7XG5cdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9zdWJNZXNoZXMubGVuZ3RoO1xuXG5cdFx0c3ViTWVzaC5faUluZGV4ID0gbGVuO1xuXG5cdFx0dGhpcy5fc3ViTWVzaGVzW2xlbl0gPSBzdWJNZXNoO1xuXG5cdFx0dGhpcy5wSW52YWxpZGF0ZUJvdW5kcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIC8vVE9ET1xuXHQgKlxuXHQgKiBAcGFyYW0gc2hvcnRlc3RDb2xsaXNpb25EaXN0YW5jZVxuXHQgKiBAcGFyYW0gZmluZENsb3Nlc3Rcblx0ICogQHJldHVybnMge2Jvb2xlYW59XG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIF9pVGVzdENvbGxpc2lvbihzaG9ydGVzdENvbGxpc2lvbkRpc3RhbmNlOm51bWJlciwgZmluZENsb3Nlc3Q6Ym9vbGVhbik6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BQaWNraW5nQ29sbGlkZXIudGVzdE1lc2hDb2xsaXNpb24odGhpcywgdGhpcy5fcFBpY2tpbmdDb2xsaXNpb25WTywgc2hvcnRlc3RDb2xsaXNpb25EaXN0YW5jZSwgZmluZENsb3Nlc3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSByZW5kZXJlclxuXHQgKlxuXHQgKiBAaW50ZXJuYWxcblx0ICovXG5cdHB1YmxpYyBfaUNvbGxlY3RSZW5kZXJhYmxlcyhyZW5kZXJlcjpJUmVuZGVyZXIpXG5cdHtcblx0XHQvLyBTaW5jZSB0aGlzIGdldHRlciBpcyBpbnZva2VkIGV2ZXJ5IGl0ZXJhdGlvbiBvZiB0aGUgcmVuZGVyIGxvb3AsIGFuZFxuXHRcdC8vIHRoZSBwcmVmYWIgY29uc3RydWN0IGNvdWxkIGFmZmVjdCB0aGUgc3ViLW1lc2hlcywgdGhlIHByZWZhYiBpc1xuXHRcdC8vIHZhbGlkYXRlZCBoZXJlIHRvIGdpdmUgaXQgYSBjaGFuY2UgdG8gcmVidWlsZC5cblx0XHRpZiAodGhpcy5faVNvdXJjZVByZWZhYilcblx0XHRcdHRoaXMuX2lTb3VyY2VQcmVmYWIuX2lWYWxpZGF0ZSgpO1xuXG5cdFx0dmFyIGxlbjpudW1iZXIgLyp1aW50Ki8gPSB0aGlzLl9zdWJNZXNoZXMubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyIC8qdWludCovID0gMDsgaSA8IGxlbjsgaSsrKVxuXHRcdFx0dGhpcy5fc3ViTWVzaGVzW2ldLl9pQ29sbGVjdFJlbmRlcmFibGUocmVuZGVyZXIpO1xuXHR9XG5cblx0cHVibGljIF9pSW52YWxpZGF0ZVJlbmRlcmFibGVHZW9tZXRyaWVzKClcblx0e1xuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fc3ViTWVzaGVzLmxlbmd0aDtcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCBsZW47ICsraSlcblx0XHRcdHRoaXMuX3N1Yk1lc2hlc1tpXS5faUludmFsaWRhdGVSZW5kZXJhYmxlR2VvbWV0cnkoKTtcblx0fVxufVxuXG5leHBvcnQgPSBNZXNoOyJdfQ== \ No newline at end of file diff --git a/lib/entities/Mesh.ts b/lib/entities/Mesh.ts new file mode 100644 index 00000000..d3f90d38 --- /dev/null +++ b/lib/entities/Mesh.ts @@ -0,0 +1,458 @@ +import IAnimator = require("awayjs-core/lib/animators/IAnimator"); +import DisplayObjectContainer = require("awayjs-core/lib/containers/DisplayObjectContainer"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Geometry = require("awayjs-core/lib/core/base/Geometry"); +import ISubMesh = require("awayjs-core/lib/core/base/ISubMesh"); +import ISubMeshClass = require("awayjs-core/lib/core/base/ISubMeshClass"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import GeometryEvent = require("awayjs-core/lib/events/GeometryEvent"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * Mesh is an instance of a Geometry, augmenting it with a presence in the scene graph, a material, and an animation + * state. It consists out of SubMeshes, which in turn correspond to SubGeometries. SubMeshes allow different parts + * of the geometry to be assigned different materials. + */ +class Mesh extends DisplayObjectContainer implements IEntity +{ + private _uvTransform:UVTransform; + + private _subMeshes:Array; + private _geometry:Geometry; + private _material:MaterialBase; + private _animator:IAnimator; + private _castsShadows:boolean = true; + private _shareAnimationGeometry:boolean = true; + + private _onGeometryBoundsInvalidDelegate:(event:GeometryEvent) => void; + private _onSubGeometryAddedDelegate:(event:GeometryEvent) => void; + private _onSubGeometryRemovedDelegate:(event:GeometryEvent) => void; + + /** + * Defines the animator of the mesh. Act on the mesh's geometry. Default value is null. + */ + public get animator():IAnimator + { + return this._animator; + } + + public set animator(value:IAnimator) + { + if (this._animator) + this._animator.removeOwner(this); + + this._animator = value; + + var len:number = this._subMeshes.length; + var subMesh:ISubMesh; + + for (var i:number = 0; i < len; ++i) { + subMesh = this._subMeshes[i]; + + // cause material to be unregistered and registered again to work with the new animation type (if possible) + if (subMesh.material) { + subMesh.material.iRemoveOwner(subMesh); + subMesh.material.iAddOwner(subMesh); + } + + //invalidate any existing renderables in case they need to pull new geometry + subMesh._iInvalidateRenderableGeometry(); + } + + if (this._animator) + this._animator.addOwner(this); + } + + /** + * + */ + public get assetType():string + { + return AssetType.MESH; + } + + /** + * Indicates whether or not the Mesh can cast shadows. Default value is true. + */ + public get castsShadows():boolean + { + return this._castsShadows; + } + + public set castsShadows(value:boolean) + { + this._castsShadows = value; + } + + /** + * The geometry used by the mesh that provides it with its shape. + */ + public get geometry():Geometry + { + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + return this._geometry; + } + + public set geometry(value:Geometry) + { + var i:number; + + if (this._geometry) { + this._geometry.removeEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); + this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); + this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); + + for (i = 0; i < this._subMeshes.length; ++i) + this._subMeshes[i].dispose(); + + this._subMeshes.length = 0; + } + + this._geometry = value; + + if (this._geometry) { + + this._geometry.addEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); + this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); + this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); + + var subGeoms:Array = this._geometry.subGeometries; + + for (i = 0; i < subGeoms.length; ++i) + this.addSubMesh(subGeoms[i]); + } + } + + /** + * The material with which to render the Mesh. + */ + public get material():MaterialBase + { + return this._material; + } + + public set material(value:MaterialBase) + { + if (value == this._material) + return; + + var i:number; + var len:number = this._subMeshes.length; + var subMesh:ISubMesh; + + for (i = 0; i < len; i++) + if (this._material && (subMesh = this._subMeshes[i]).material == this._material) + this._material.iRemoveOwner(subMesh); + + this._material = value; + + for (i = 0; i < len; i++) + if (this._material && (subMesh = this._subMeshes[i]).material == this._material) + this._material.iAddOwner(subMesh); + } + + /** + * Indicates whether or not the mesh share the same animation geometry. + */ + public get shareAnimationGeometry():boolean + { + return this._shareAnimationGeometry; + } + + public set shareAnimationGeometry(value:boolean) + { + this._shareAnimationGeometry = value; + } + + /** + * The SubMeshes out of which the Mesh consists. Every SubMesh can be assigned a material to override the Mesh's + * material. + */ + public get subMeshes():Array + { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + return this._subMeshes; + } + + /** + * + */ + public get uvTransform():UVTransform + { + return this._uvTransform; + } + + public set uvTransform(value:UVTransform) + { + this._uvTransform = value; + } + + /** + * Create a new Mesh object. + * + * @param geometry The geometry used by the mesh that provides it with its shape. + * @param material [optional] The material with which to render the Mesh. + */ + constructor(geometry:Geometry, material:MaterialBase = null) + { + super(); + + this._pIsEntity = true; + + this._subMeshes = new Array(); + + this._onGeometryBoundsInvalidDelegate = (event:GeometryEvent) => this.onGeometryBoundsInvalid(event); + this._onSubGeometryAddedDelegate = (event:GeometryEvent) => this.onSubGeometryAdded(event); + this._onSubGeometryRemovedDelegate = (event:GeometryEvent) => this.onSubGeometryRemoved(event); + + //this should never happen, but if people insist on trying to create their meshes before they have geometry to fill it, it becomes necessary + this.geometry = geometry || new Geometry(); + + this.material = material; + } + + /** + * + */ + public bakeTransformations() + { + this.geometry.applyTransformation(this._iMatrix3D); + this._iMatrix3D.identity(); + } + + /** + * @inheritDoc + */ + public dispose() + { + super.dispose(); + + this.material = null; + this.geometry = null; + } + + /** + * Disposes mesh including the animator and children. This is a merely a convenience method. + * @return + */ + public disposeWithAnimatorAndChildren() + { + this.disposeWithChildren(); + + if (this._animator) + this._animator.dispose(); + } + + /** + * Clones this Mesh instance along with all it's children, while re-using the same + * material, geometry and animation set. The returned result will be a copy of this mesh, + * containing copies of all of it's children. + * + * Properties that are re-used (i.e. not cloned) by the new copy include name, + * geometry, and material. Properties that are cloned or created anew for the copy + * include subMeshes, children of the mesh, and the animator. + * + * If you want to copy just the mesh, reusing it's geometry and material while not + * cloning it's children, the simplest way is to create a new mesh manually: + * + * + * var clone : Mesh = new Mesh(original.geometry, original.material); + * + */ + public clone():DisplayObject + { + var clone:Mesh = new Mesh(this._geometry, this._material); + + clone._iMatrix3D = this._iMatrix3D; + clone.pivot = this.pivot; + clone.partition = this.partition; + clone.bounds = this.bounds.clone(); + + + clone.name = this.name; + clone.castsShadows = this.castsShadows; + clone.shareAnimationGeometry = this.shareAnimationGeometry; + clone.mouseEnabled = this.mouseEnabled; + clone.mouseChildren = this.mouseChildren; + //this is of course no proper cloning + //maybe use this instead?: http://blog.another-d-mention.ro/programming/how-to-clone-duplicate-an-object-in-actionscript-3/ + clone.extra = this.extra; + + var len:number = this._subMeshes.length; + for (var i:number = 0; i < len; ++i) + clone._subMeshes[i].material = this._subMeshes[i]._iGetExplicitMaterial(); + + + len = this.numChildren; + var obj:any; + + for (i = 0; i < len; ++i) { + obj = this.getChildAt(i).clone(); + clone.addChild( obj); + } + + if (this._animator) + clone.animator = this._animator.clone(); + + return clone; + } + + /** + * //TODO + * + * @param subGeometry + * @returns {SubMeshBase} + */ + public getSubMeshFromSubGeometry(subGeometry:SubGeometryBase):ISubMesh + { + return this._subMeshes[this._geometry.subGeometries.indexOf(subGeometry)]; + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():EntityNode + { + return new EntityNode(this); + } + + /** + * //TODO + * + * @protected + */ + public pUpdateBounds() + { + this._pBounds.fromGeometry(this._geometry); + + super.pUpdateBounds(); + } + + /** + * //TODO + * + * @private + */ + private onGeometryBoundsInvalid(event:GeometryEvent) + { + this.pInvalidateBounds(); + } + + /** + * Called when a SubGeometry was added to the Geometry. + * + * @private + */ + private onSubGeometryAdded(event:GeometryEvent) + { + this.addSubMesh(event.subGeometry); + } + + /** + * Called when a SubGeometry was removed from the Geometry. + * + * @private + */ + private onSubGeometryRemoved(event:GeometryEvent) + { + var subMesh:ISubMesh; + var subGeom:SubGeometryBase = event.subGeometry; + var len:number = this._subMeshes.length; + var i:number; + + // Important! This has to be done here, and not delayed until the + // next render loop, since this may be caused by the geometry being + // rebuilt IN THE RENDER LOOP. Invalidating and waiting will delay + // it until the NEXT RENDER FRAME which is probably not desirable. + for (i = 0; i < len; ++i) { + + subMesh = this._subMeshes[i]; + + if (subMesh.subGeometry == subGeom) { + subMesh.dispose(); + + this._subMeshes.splice(i, 1); + + break; + } + } + + --len; + for (; i < len; ++i) + this._subMeshes[i]._iIndex = i; + } + + /** + * Adds a SubMeshBase wrapping a SubGeometry. + * + * @param subGeometry + */ + private addSubMesh(subGeometry:SubGeometryBase) + { + var SubMeshClass:ISubMeshClass = subGeometry.subMeshClass; + + var subMesh:ISubMesh = new SubMeshClass(subGeometry, this, null); + var len:number = this._subMeshes.length; + + subMesh._iIndex = len; + + this._subMeshes[len] = subMesh; + + this.pInvalidateBounds(); + } + + /** + * //TODO + * + * @param shortestCollisionDistance + * @param findClosest + * @returns {boolean} + * + * @internal + */ + public _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean + { + return this._pPickingCollider.testMeshCollision(this, this._pPickingCollisionVO, shortestCollisionDistance, findClosest); + } + + /** + * + * @param renderer + * + * @internal + */ + public _iCollectRenderables(renderer:IRenderer) + { + // Since this getter is invoked every iteration of the render loop, and + // the prefab construct could affect the sub-meshes, the prefab is + // validated here to give it a chance to rebuild. + if (this._iSourcePrefab) + this._iSourcePrefab._iValidate(); + + var len:number /*uint*/ = this._subMeshes.length; + for (var i:number /*uint*/ = 0; i < len; i++) + this._subMeshes[i]._iCollectRenderable(renderer); + } + + public _iInvalidateRenderableGeometries() + { + var len:number = this._subMeshes.length; + for (var i:number = 0; i < len; ++i) + this._subMeshes[i]._iInvalidateRenderableGeometry(); + } +} + +export = Mesh; \ No newline at end of file diff --git a/lib/entities/PointLight.js b/lib/entities/PointLight.js new file mode 100755 index 00000000..216ac5fb --- /dev/null +++ b/lib/entities/PointLight.js @@ -0,0 +1,145 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BoundingSphere = require("awayjs-core/lib/bounds/BoundingSphere"); + +var LightBase = require("awayjs-core/lib/core/base/LightBase"); + +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var PointLightNode = require("awayjs-core/lib/core/partition/PointLightNode"); + +var CubeMapShadowMapper = require("awayjs-core/lib/materials/shadowmappers/CubeMapShadowMapper"); + +var PointLight = (function (_super) { + __extends(PointLight, _super); + function PointLight() { + _super.call(this); + this._pRadius = 90000; + this._pFallOff = 100000; + + this._pIsEntity = true; + + this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); + } + PointLight.prototype.pCreateShadowMapper = function () { + return new CubeMapShadowMapper(); + }; + + Object.defineProperty(PointLight.prototype, "radius", { + get: function () { + return this._pRadius; + }, + set: function (value) { + this._pRadius = value; + + if (this._pRadius < 0) { + this._pRadius = 0; + } else if (this._pRadius > this._pFallOff) { + this._pFallOff = this._pRadius; + this.pInvalidateBounds(); + } + this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); + }, + enumerable: true, + configurable: true + }); + + + PointLight.prototype.iFallOffFactor = function () { + return this._pFallOffFactor; + }; + + Object.defineProperty(PointLight.prototype, "fallOff", { + get: function () { + return this._pFallOff; + }, + set: function (value) { + this._pFallOff = value; + + if (this._pFallOff < 0) + this._pFallOff = 0; + + if (this._pFallOff < this._pRadius) + this._pRadius = this._pFallOff; + + this._pFallOffFactor = 1 / (this._pFallOff * this._pFallOff - this._pRadius * this._pRadius); + this.pInvalidateBounds(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @protected + */ + PointLight.prototype.pCreateEntityPartitionNode = function () { + return new PointLightNode(this); + }; + + PointLight.prototype.pUpdateBounds = function () { + this._pBounds.fromSphere(new Vector3D(), this._pFallOff); + this._pBoundsInvalid = false; + }; + + PointLight.prototype.pCreateDefaultBoundingVolume = function () { + //point lights are culled based on their falloff radius + return new BoundingSphere(); + }; + + PointLight.prototype.iGetObjectProjectionMatrix = function (entity, camera, target) { + if (typeof target === "undefined") { target = null; } + var raw = new Array(16); + var bounds = entity.bounds; + var m = new Matrix3D(); + + // todo: do not use lookAt on Light + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this._pParent.inverseSceneTransform); + this.lookAt(m.position); + + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this.inverseSceneTransform); + + var box = bounds.aabb; + var v1 = m.deltaTransformVector(new Vector3D(box.left, box.bottom, box.front)); + var v2 = m.deltaTransformVector(new Vector3D(box.right, box.top, box.back)); + var d1 = v1.x * v1.x + v1.y * v1.y + v1.z * v1.z; + var d2 = v2.x * v2.x + v2.y * v2.y + v2.z * v2.z; + var d = Math.sqrt(d1 > d2 ? d1 : d2); + var zMin; + var zMax; + + var z = m.rawData[14]; + zMin = z - d; + zMax = z + d; + + raw[5] = raw[0] = zMin / d; + raw[10] = zMax / (zMax - zMin); + raw[11] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[12] = raw[13] = raw[15] = 0; + raw[14] = -zMin * raw[10]; + + if (!target) + target = new Matrix3D(); + + target.copyRawDataFrom(raw); + target.prepend(m); + + return target; + }; + + PointLight.prototype._iCollectRenderables = function (renderer) { + //nothing to do here + }; + return PointLight; +})(LightBase); + +module.exports = PointLight; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL1BvaW50TGlnaHQudHMiXSwibmFtZXMiOlsiUG9pbnRMaWdodCIsIlBvaW50TGlnaHQuY29uc3RydWN0b3IiLCJQb2ludExpZ2h0LnBDcmVhdGVTaGFkb3dNYXBwZXIiLCJQb2ludExpZ2h0LmlGYWxsT2ZmRmFjdG9yIiwiUG9pbnRMaWdodC5wQ3JlYXRlRW50aXR5UGFydGl0aW9uTm9kZSIsIlBvaW50TGlnaHQucFVwZGF0ZUJvdW5kcyIsIlBvaW50TGlnaHQucENyZWF0ZURlZmF1bHRCb3VuZGluZ1ZvbHVtZSIsIlBvaW50TGlnaHQuaUdldE9iamVjdFByb2plY3Rpb25NYXRyaXgiLCJQb2ludExpZ2h0Ll9pQ29sbGVjdFJlbmRlcmFibGVzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxxRUFBNEU7O0FBRTVFLDhEQUFzRTs7QUFFdEUsNERBQXFFO0FBQ3JFLDREQUFxRTs7QUFFckUsNkVBQW9GOztBQUlwRixnR0FBc0c7O0FBRXRHO0lBQXlCQSw2QkFBU0E7SUFNakNBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBO1FBTlJBLEtBQU9BLFFBQVFBLEdBQVVBLEtBQUtBLENBQUNBO1FBQy9CQSxLQUFPQSxTQUFTQSxHQUFVQSxNQUFNQSxDQUFDQTs7UUFPaENBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBOztRQUV0QkEsSUFBSUEsQ0FBQ0EsZUFBZUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7SUFDdkZBLENBQUNBO0lBRURELDJDQUFBQTtRQUVDRSxPQUFPQSxJQUFJQSxtQkFBbUJBLENBQUNBLENBQUNBO0lBQ2pDQSxDQUFDQTs7SUFFREY7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBO1FBRURBLEtBQUFB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LENBQUNBLENBQUNBLFFBQVFBLENBQUNBOztRQUV2QkEsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsdUJBQXVCQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtRQUNsREEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQTs7UUFFcENBLElBQUlBLEdBQUdBLEdBQU9BLE1BQU1BLENBQUNBLElBQUlBO1FBQ3pCQSxJQUFJQSxFQUFFQSxHQUFZQSxDQUFDQSxDQUFDQSxvQkFBb0JBLENBQUNBLElBQUlBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLE1BQU1BLEVBQUVBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1FBQ3ZGQSxJQUFJQSxFQUFFQSxHQUFZQSxDQUFDQSxDQUFDQSxvQkFBb0JBLENBQUNBLElBQUlBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1FBQ3BGQSxJQUFJQSxFQUFFQSxHQUFVQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUNqREEsSUFBSUEsRUFBRUEsR0FBVUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDakRBLElBQUlBLENBQUNBLEdBQVVBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBO1FBQzFDQSxJQUFJQSxJQUFJQTtRQUNSQSxJQUFJQSxJQUFJQTs7UUFFUkEsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7UUFDNUJBLElBQUlBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1pBLElBQUlBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBOztRQUVaQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxDQUFDQTtRQUN4QkEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDNUJBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1hBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ3ZHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxHQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQTs7UUFFdkJBLElBQUlBLENBQUNBLE1BQU1BO1lBQ1ZBLE1BQU1BLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBOztRQUV6QkEsTUFBTUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDM0JBLE1BQU1BLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBOztRQUVqQkEsT0FBT0EsTUFBTUE7SUFDZEEsQ0FBQ0E7O0lBRURQLDRDQUFBQSxVQUE0QkEsUUFBa0JBO1FBRTdDUSxvQkFBb0JBO0lBQ3JCQSxDQUFDQTtJQUNGUixrQkFBQ0E7QUFBREEsQ0FBQ0EsRUFoSXdCLFNBQVMsRUFnSWpDOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImVudGl0aWVzL1BvaW50TGlnaHQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQm91bmRpbmdTcGhlcmVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ib3VuZHMvQm91bmRpbmdTcGhlcmVcIik7XG5pbXBvcnQgQm91bmRpbmdWb2x1bWVCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2JvdW5kcy9Cb3VuZGluZ1ZvbHVtZUJhc2VcIik7XG5pbXBvcnQgTGlnaHRCYXNlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvTGlnaHRCYXNlXCIpO1xuaW1wb3J0IEJveFx0XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9Cb3hcIik7XG5pbXBvcnQgTWF0cml4M0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBFbnRpdHlOb2RlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9FbnRpdHlOb2RlXCIpO1xuaW1wb3J0IFBvaW50TGlnaHROb2RlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wYXJ0aXRpb24vUG9pbnRMaWdodE5vZGVcIik7XG5pbXBvcnQgSVJlbmRlcmVyXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9JUmVuZGVyZXJcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBJRW50aXR5XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0lFbnRpdHlcIik7XG5pbXBvcnQgQ3ViZU1hcFNoYWRvd01hcHBlclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvc2hhZG93bWFwcGVycy9DdWJlTWFwU2hhZG93TWFwcGVyXCIpO1xuXG5jbGFzcyBQb2ludExpZ2h0IGV4dGVuZHMgTGlnaHRCYXNlIGltcGxlbWVudHMgSUVudGl0eVxue1xuXHRwdWJsaWMgX3BSYWRpdXM6bnVtYmVyID0gOTAwMDA7XG5cdHB1YmxpYyBfcEZhbGxPZmY6bnVtYmVyID0gMTAwMDAwO1xuXHRwdWJsaWMgX3BGYWxsT2ZmRmFjdG9yOm51bWJlcjtcblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fcElzRW50aXR5ID0gdHJ1ZTtcblxuXHRcdHRoaXMuX3BGYWxsT2ZmRmFjdG9yID0gMS8odGhpcy5fcEZhbGxPZmYqdGhpcy5fcEZhbGxPZmYgLSB0aGlzLl9wUmFkaXVzKnRoaXMuX3BSYWRpdXMpO1xuXHR9XG5cblx0cHVibGljIHBDcmVhdGVTaGFkb3dNYXBwZXIoKTpDdWJlTWFwU2hhZG93TWFwcGVyXG5cdHtcblx0XHRyZXR1cm4gbmV3IEN1YmVNYXBTaGFkb3dNYXBwZXIoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgcmFkaXVzKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFJhZGl1cztcblx0fVxuXG5cdHB1YmxpYyBzZXQgcmFkaXVzKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3BSYWRpdXMgPSB2YWx1ZTtcblxuXHRcdGlmICh0aGlzLl9wUmFkaXVzIDwgMCkge1xuXHRcdFx0dGhpcy5fcFJhZGl1cyA9IDA7XG5cdFx0fSBlbHNlIGlmICh0aGlzLl9wUmFkaXVzID4gdGhpcy5fcEZhbGxPZmYpIHtcblx0XHRcdHRoaXMuX3BGYWxsT2ZmID0gdGhpcy5fcFJhZGl1cztcblx0XHRcdHRoaXMucEludmFsaWRhdGVCb3VuZHMoKTtcblx0XHR9XG5cdFx0dGhpcy5fcEZhbGxPZmZGYWN0b3IgPSAxLyggdGhpcy5fcEZhbGxPZmYqdGhpcy5fcEZhbGxPZmYgLSB0aGlzLl9wUmFkaXVzKnRoaXMuX3BSYWRpdXMgKTtcblx0fVxuXG5cdHB1YmxpYyBpRmFsbE9mZkZhY3RvcigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BGYWxsT2ZmRmFjdG9yO1xuXHR9XG5cblx0cHVibGljIGdldCBmYWxsT2ZmKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcEZhbGxPZmY7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGZhbGxPZmYodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fcEZhbGxPZmYgPSB2YWx1ZTtcblxuXHRcdGlmICh0aGlzLl9wRmFsbE9mZiA8IDApXG5cdFx0XHR0aGlzLl9wRmFsbE9mZiA9IDA7XG5cblx0XHRpZiAodGhpcy5fcEZhbGxPZmYgPCB0aGlzLl9wUmFkaXVzKVxuXHRcdFx0dGhpcy5fcFJhZGl1cyA9IHRoaXMuX3BGYWxsT2ZmO1xuXG5cdFx0dGhpcy5fcEZhbGxPZmZGYWN0b3IgPSAxLyggdGhpcy5fcEZhbGxPZmYqdGhpcy5fcEZhbGxPZmYgLSB0aGlzLl9wUmFkaXVzKnRoaXMuX3BSYWRpdXMpO1xuXHRcdHRoaXMucEludmFsaWRhdGVCb3VuZHMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgcENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUoKTpFbnRpdHlOb2RlXG5cdHtcblx0XHRyZXR1cm4gbmV3IFBvaW50TGlnaHROb2RlKHRoaXMpO1xuXHR9XG5cblx0cHVibGljIHBVcGRhdGVCb3VuZHMoKVxuXHR7XG5cdFx0dGhpcy5fcEJvdW5kcy5mcm9tU3BoZXJlKG5ldyBWZWN0b3IzRCgpLCB0aGlzLl9wRmFsbE9mZik7XG5cdFx0dGhpcy5fcEJvdW5kc0ludmFsaWQgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBwQ3JlYXRlRGVmYXVsdEJvdW5kaW5nVm9sdW1lKCk6Qm91bmRpbmdWb2x1bWVCYXNlXG5cdHtcblx0XHQvL3BvaW50IGxpZ2h0cyBhcmUgY3VsbGVkIGJhc2VkIG9uIHRoZWlyIGZhbGxvZmYgcmFkaXVzXG5cdFx0cmV0dXJuIG5ldyBCb3VuZGluZ1NwaGVyZSgpO1xuXHR9XG5cblx0cHVibGljIGlHZXRPYmplY3RQcm9qZWN0aW9uTWF0cml4KGVudGl0eTpJRW50aXR5LCBjYW1lcmE6Q2FtZXJhLCB0YXJnZXQ6TWF0cml4M0QgPSBudWxsKTpNYXRyaXgzRFxuXHR7XG5cdFx0dmFyIHJhdzpudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KDE2KTtcblx0XHR2YXIgYm91bmRzOkJvdW5kaW5nVm9sdW1lQmFzZSA9IGVudGl0eS5ib3VuZHM7XG5cdFx0dmFyIG06TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoKTtcblxuXHRcdC8vIHRvZG86IGRvIG5vdCB1c2UgbG9va0F0IG9uIExpZ2h0XG5cdFx0bS5jb3B5RnJvbShlbnRpdHkuZ2V0UmVuZGVyU2NlbmVUcmFuc2Zvcm0oY2FtZXJhKSk7XG5cdFx0bS5hcHBlbmQodGhpcy5fcFBhcmVudC5pbnZlcnNlU2NlbmVUcmFuc2Zvcm0pO1xuXHRcdHRoaXMubG9va0F0KG0ucG9zaXRpb24pO1xuXG5cdFx0bS5jb3B5RnJvbShlbnRpdHkuZ2V0UmVuZGVyU2NlbmVUcmFuc2Zvcm0oY2FtZXJhKSk7XG5cdFx0bS5hcHBlbmQodGhpcy5pbnZlcnNlU2NlbmVUcmFuc2Zvcm0pO1xuXG5cdFx0dmFyIGJveDpCb3ggPSBib3VuZHMuYWFiYjtcblx0XHR2YXIgdjE6VmVjdG9yM0QgPSBtLmRlbHRhVHJhbnNmb3JtVmVjdG9yKG5ldyBWZWN0b3IzRChib3gubGVmdCwgYm94LmJvdHRvbSwgYm94LmZyb250KSk7XG5cdFx0dmFyIHYyOlZlY3RvcjNEID0gbS5kZWx0YVRyYW5zZm9ybVZlY3RvcihuZXcgVmVjdG9yM0QoYm94LnJpZ2h0LCBib3gudG9wLCBib3guYmFjaykpO1xuXHRcdHZhciBkMTpudW1iZXIgPSB2MS54KnYxLnggKyB2MS55KnYxLnkgKyB2MS56KnYxLno7XG5cdFx0dmFyIGQyOm51bWJlciA9IHYyLngqdjIueCArIHYyLnkqdjIueSArIHYyLnoqdjIuejtcblx0XHR2YXIgZDpudW1iZXIgPSBNYXRoLnNxcnQoZDEgPiBkMj8gZDEgOiBkMik7XG5cdFx0dmFyIHpNaW46bnVtYmVyO1xuXHRcdHZhciB6TWF4Om51bWJlcjtcblxuXHRcdHZhciB6Om51bWJlciA9IG0ucmF3RGF0YVsxNF07XG5cdFx0ek1pbiA9IHogLSBkO1xuXHRcdHpNYXggPSB6ICsgZDtcblxuXHRcdHJhd1s1XSA9IHJhd1swXSA9IHpNaW4vZDtcblx0XHRyYXdbMTBdID0gek1heC8oek1heCAtIHpNaW4pO1xuXHRcdHJhd1sxMV0gPSAxO1xuXHRcdHJhd1sxXSA9IHJhd1syXSA9IHJhd1szXSA9IHJhd1s0XSA9IHJhd1s2XSA9IHJhd1s3XSA9IHJhd1s4XSA9IHJhd1s5XSA9IHJhd1sxMl0gPSByYXdbMTNdID0gcmF3WzE1XSA9IDA7XG5cdFx0cmF3WzE0XSA9IC16TWluKnJhd1sxMF07XG5cblx0XHRpZiAoIXRhcmdldClcblx0XHRcdHRhcmdldCA9IG5ldyBNYXRyaXgzRCgpO1xuXG5cdFx0dGFyZ2V0LmNvcHlSYXdEYXRhRnJvbShyYXcpO1xuXHRcdHRhcmdldC5wcmVwZW5kKG0pO1xuXG5cdFx0cmV0dXJuIHRhcmdldDtcblx0fVxuXG5cdHB1YmxpYyBfaUNvbGxlY3RSZW5kZXJhYmxlcyhyZW5kZXJlcjpJUmVuZGVyZXIpXG5cdHtcblx0XHQvL25vdGhpbmcgdG8gZG8gaGVyZVxuXHR9XG59XG5cbmV4cG9ydCA9IFBvaW50TGlnaHQ7Il19 \ No newline at end of file diff --git a/lib/entities/PointLight.ts b/lib/entities/PointLight.ts new file mode 100644 index 00000000..7be5d57c --- /dev/null +++ b/lib/entities/PointLight.ts @@ -0,0 +1,144 @@ +import BoundingSphere = require("awayjs-core/lib/bounds/BoundingSphere"); +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import LightBase = require("awayjs-core/lib/core/base/LightBase"); +import Box = require("awayjs-core/lib/core/geom/Box"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import EntityNode = require("awayjs-core/lib/core/partition/EntityNode"); +import PointLightNode = require("awayjs-core/lib/core/partition/PointLightNode"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import CubeMapShadowMapper = require("awayjs-core/lib/materials/shadowmappers/CubeMapShadowMapper"); + +class PointLight extends LightBase implements IEntity +{ + public _pRadius:number = 90000; + public _pFallOff:number = 100000; + public _pFallOffFactor:number; + + constructor() + { + super(); + + this._pIsEntity = true; + + this._pFallOffFactor = 1/(this._pFallOff*this._pFallOff - this._pRadius*this._pRadius); + } + + public pCreateShadowMapper():CubeMapShadowMapper + { + return new CubeMapShadowMapper(); + } + + public get radius():number + { + return this._pRadius; + } + + public set radius(value:number) + { + this._pRadius = value; + + if (this._pRadius < 0) { + this._pRadius = 0; + } else if (this._pRadius > this._pFallOff) { + this._pFallOff = this._pRadius; + this.pInvalidateBounds(); + } + this._pFallOffFactor = 1/( this._pFallOff*this._pFallOff - this._pRadius*this._pRadius ); + } + + public iFallOffFactor():number + { + return this._pFallOffFactor; + } + + public get fallOff():number + { + return this._pFallOff; + } + + public set fallOff(value:number) + { + this._pFallOff = value; + + if (this._pFallOff < 0) + this._pFallOff = 0; + + if (this._pFallOff < this._pRadius) + this._pRadius = this._pFallOff; + + this._pFallOffFactor = 1/( this._pFallOff*this._pFallOff - this._pRadius*this._pRadius); + this.pInvalidateBounds(); + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():EntityNode + { + return new PointLightNode(this); + } + + public pUpdateBounds() + { + this._pBounds.fromSphere(new Vector3D(), this._pFallOff); + this._pBoundsInvalid = false; + } + + public pCreateDefaultBoundingVolume():BoundingVolumeBase + { + //point lights are culled based on their falloff radius + return new BoundingSphere(); + } + + public iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D + { + var raw:number[] = new Array(16); + var bounds:BoundingVolumeBase = entity.bounds; + var m:Matrix3D = new Matrix3D(); + + // todo: do not use lookAt on Light + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this._pParent.inverseSceneTransform); + this.lookAt(m.position); + + m.copyFrom(entity.getRenderSceneTransform(camera)); + m.append(this.inverseSceneTransform); + + var box:Box = bounds.aabb; + var v1:Vector3D = m.deltaTransformVector(new Vector3D(box.left, box.bottom, box.front)); + var v2:Vector3D = m.deltaTransformVector(new Vector3D(box.right, box.top, box.back)); + var d1:number = v1.x*v1.x + v1.y*v1.y + v1.z*v1.z; + var d2:number = v2.x*v2.x + v2.y*v2.y + v2.z*v2.z; + var d:number = Math.sqrt(d1 > d2? d1 : d2); + var zMin:number; + var zMax:number; + + var z:number = m.rawData[14]; + zMin = z - d; + zMax = z + d; + + raw[5] = raw[0] = zMin/d; + raw[10] = zMax/(zMax - zMin); + raw[11] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[12] = raw[13] = raw[15] = 0; + raw[14] = -zMin*raw[10]; + + if (!target) + target = new Matrix3D(); + + target.copyRawDataFrom(raw); + target.prepend(m); + + return target; + } + + public _iCollectRenderables(renderer:IRenderer) + { + //nothing to do here + } +} + +export = PointLight; \ No newline at end of file diff --git a/lib/entities/Shape.js b/lib/entities/Shape.js new file mode 100755 index 00000000..ef8ee1f2 --- /dev/null +++ b/lib/entities/Shape.js @@ -0,0 +1,47 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +/** +* This class is used to create lightweight shapes using the ActionScript +* drawing application program interface(API). The Shape class includes a +* graphics property, which lets you access methods from the +* Graphics class. +* +*

The Sprite class also includes a graphicsproperty, and it +* includes other features not available to the Shape class. For example, a +* Sprite object is a display object container, whereas a Shape object is not +* (and cannot contain child display objects). For this reason, Shape objects +* consume less memory than Sprite objects that contain the same graphics. +* However, a Sprite object supports user input events, while a Shape object +* does not.

+*/ +var Shape = (function (_super) { + __extends(Shape, _super); + /** + * Creates a new Shape object. + */ + function Shape() { + _super.call(this); + } + Object.defineProperty(Shape.prototype, "graphics", { + /** + * Specifies the Graphics object belonging to this Shape object, where vector + * drawing commands can occur. + */ + get: function () { + return this._graphics; + }, + enumerable: true, + configurable: true + }); + return Shape; +})(DisplayObject); + +module.exports = Shape; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL1NoYXBlLnRzIl0sIm5hbWVzIjpbIlNoYXBlIiwiU2hhcGUuY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNFQUE2RTs7QUFHN0U7Ozs7Ozs7Ozs7Ozs7RUFhRztBQUNIO0lBQW9CQSx3QkFBYUE7SUFnQmhDQTs7TUFER0E7SUFDSEE7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7SUFDUkEsQ0FBQ0E7SUFYREQ7UUFBQUE7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxTQUFTQTtRQUN0QkEsQ0FBQ0E7Ozs7QUFBQUEsSUFTRkEsYUFBQ0E7QUFBREEsQ0FBQ0EsRUFwQm1CLGFBQWEsRUFvQmhDOztBQUVELHNCQUFlLENBQUEiLCJmaWxlIjoiZW50aXRpZXMvU2hhcGUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlzcGxheU9iamVjdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IEdyYXBoaWNzXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9HcmFwaGljc1wiKTtcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIGxpZ2h0d2VpZ2h0IHNoYXBlcyB1c2luZyB0aGUgQWN0aW9uU2NyaXB0XG4gKiBkcmF3aW5nIGFwcGxpY2F0aW9uIHByb2dyYW0gaW50ZXJmYWNlKEFQSSkuIFRoZSBTaGFwZSBjbGFzcyBpbmNsdWRlcyBhXG4gKiA8Y29kZT5ncmFwaGljczwvY29kZT4gcHJvcGVydHksIHdoaWNoIGxldHMgeW91IGFjY2VzcyBtZXRob2RzIGZyb20gdGhlXG4gKiBHcmFwaGljcyBjbGFzcy5cbiAqXG4gKiA8cD5UaGUgU3ByaXRlIGNsYXNzIGFsc28gaW5jbHVkZXMgYSA8Y29kZT5ncmFwaGljczwvY29kZT5wcm9wZXJ0eSwgYW5kIGl0XG4gKiBpbmNsdWRlcyBvdGhlciBmZWF0dXJlcyBub3QgYXZhaWxhYmxlIHRvIHRoZSBTaGFwZSBjbGFzcy4gRm9yIGV4YW1wbGUsIGFcbiAqIFNwcml0ZSBvYmplY3QgaXMgYSBkaXNwbGF5IG9iamVjdCBjb250YWluZXIsIHdoZXJlYXMgYSBTaGFwZSBvYmplY3QgaXMgbm90XG4gKiAoYW5kIGNhbm5vdCBjb250YWluIGNoaWxkIGRpc3BsYXkgb2JqZWN0cykuIEZvciB0aGlzIHJlYXNvbiwgU2hhcGUgb2JqZWN0c1xuICogY29uc3VtZSBsZXNzIG1lbW9yeSB0aGFuIFNwcml0ZSBvYmplY3RzIHRoYXQgY29udGFpbiB0aGUgc2FtZSBncmFwaGljcy5cbiAqIEhvd2V2ZXIsIGEgU3ByaXRlIG9iamVjdCBzdXBwb3J0cyB1c2VyIGlucHV0IGV2ZW50cywgd2hpbGUgYSBTaGFwZSBvYmplY3RcbiAqIGRvZXMgbm90LjwvcD5cbiAqL1xuY2xhc3MgU2hhcGUgZXh0ZW5kcyBEaXNwbGF5T2JqZWN0XG57XG5cdHByaXZhdGUgX2dyYXBoaWNzOkdyYXBoaWNzO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgdGhlIEdyYXBoaWNzIG9iamVjdCBiZWxvbmdpbmcgdG8gdGhpcyBTaGFwZSBvYmplY3QsIHdoZXJlIHZlY3RvclxuXHQgKiBkcmF3aW5nIGNvbW1hbmRzIGNhbiBvY2N1ci5cblx0ICovXG5cdGdldCBncmFwaGljcygpOkdyYXBoaWNzXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZ3JhcGhpY3M7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBTaGFwZSBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXHR9XG59XG5cbmV4cG9ydCA9IFNoYXBlOyJdfQ== \ No newline at end of file diff --git a/src/away/entities/Shape.ts b/lib/entities/Shape.ts similarity index 61% rename from src/away/entities/Shape.ts rename to lib/entities/Shape.ts index 3f6dbdf5..1281d812 100644 --- a/src/away/entities/Shape.ts +++ b/lib/entities/Shape.ts @@ -1,4 +1,5 @@ -/// +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Graphics = require("awayjs-core/lib/core/base/Graphics"); /** * This class is used to create lightweight shapes using the ActionScript @@ -14,28 +15,26 @@ * However, a Sprite object supports user input events, while a Shape object * does not.

*/ -module away.entities +class Shape extends DisplayObject { - export class Shape extends away.base.DisplayObject - { - private _graphics:away.base.Graphics; + private _graphics:Graphics; - /** - * Specifies the Graphics object belonging to this Shape object, where vector - * drawing commands can occur. - */ - get graphics():away.base.Graphics - { - return this._graphics; - } + /** + * Specifies the Graphics object belonging to this Shape object, where vector + * drawing commands can occur. + */ + get graphics():Graphics + { + return this._graphics; + } - /** - * Creates a new Shape object. - */ - constructor() - { - super(); - } + /** + * Creates a new Shape object. + */ + constructor() + { + super(); } } +export = Shape; \ No newline at end of file diff --git a/lib/entities/Skybox.js b/lib/entities/Skybox.js new file mode 100755 index 00000000..1c2ae106 --- /dev/null +++ b/lib/entities/Skybox.js @@ -0,0 +1,134 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var SkyboxNode = require("awayjs-core/lib/core/partition/SkyboxNode"); + +/** +* A Skybox class is used to render a sky in the scene. It's always considered static and 'at infinity', and as +* such it's always centered at the camera's position and sized to exactly fit within the camera's frustum, ensuring +* the sky box is always as large as possible without being clipped. +*/ +var Skybox = (function (_super) { + __extends(Skybox, _super); + /** + * Create a new Skybox object. + * + * @param material The material with which to render the Skybox. + */ + function Skybox(material) { + _super.call(this); + + this._pIsEntity = true; + + this.material = material; + } + Object.defineProperty(Skybox.prototype, "animator", { + get: function () { + return this._animator; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Skybox.prototype, "uvTransform", { + /** + * + */ + get: function () { + return this._uvTransform; + }, + set: function (value) { + this._uvTransform = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Skybox.prototype, "material", { + /** + * The material with which to render the Skybox. + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + if (this._material) + this._material.iRemoveOwner(this); + + this._material = value; + + if (this._material) + this._material.iAddOwner(this); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Skybox.prototype, "assetType", { + get: function () { + return AssetType.SKYBOX; + }, + enumerable: true, + configurable: true + }); + + /** + * @protected + */ + Skybox.prototype.pInvalidateBounds = function () { + // dead end + }; + + /** + * @protected + */ + Skybox.prototype.pCreateEntityPartitionNode = function () { + return new SkyboxNode(this); + }; + + /** + * @protected + */ + Skybox.prototype.pCreateDefaultBoundingVolume = function () { + return new NullBounds(); + }; + + /** + * @protected + */ + Skybox.prototype.pUpdateBounds = function () { + this._pBoundsInvalid = false; + }; + + Object.defineProperty(Skybox.prototype, "castsShadows", { + get: function () { + return false; + }, + enumerable: true, + configurable: true + }); + + Skybox.prototype._iCollectRenderables = function (renderer) { + //skybox do not get collected in the standard entity list + }; + + Skybox.prototype._iCollectRenderable = function (renderer) { + }; + return Skybox; +})(DisplayObject); + +module.exports = Skybox; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL1NreWJveC50cyJdLCJuYW1lcyI6WyJTa3lib3giLCJTa3lib3guY29uc3RydWN0b3IiLCJTa3lib3gucEludmFsaWRhdGVCb3VuZHMiLCJTa3lib3gucENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUiLCJTa3lib3gucENyZWF0ZURlZmF1bHRCb3VuZGluZ1ZvbHVtZSIsIlNreWJveC5wVXBkYXRlQm91bmRzIiwiU2t5Ym94Ll9pQ29sbGVjdFJlbmRlcmFibGVzIiwiU2t5Ym94Ll9pQ29sbGVjdFJlbmRlcmFibGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZEQUVxRTtBQUNyRSxzRUFBNkU7O0FBRzdFLGlFQUF5RTtBQUN6RSxxRUFBNkU7O0FBSzdFOzs7O0VBSUc7QUFDSDtJQUFxQkEseUJBQWFBO0lBOEJqQ0E7Ozs7TUFER0E7SUFDSEEsZ0JBQVlBLFFBQXFCQTtRQUVoQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBOztRQUV0QkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsUUFBUUE7SUFDekJBLENBQUNBO0lBOUJERDtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxTQUFTQTtRQUN0QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBO1FBQ3pCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF1QkEsS0FBaUJBO1lBRXZDQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxLQUFLQTtRQUMxQkEsQ0FBQ0E7Ozs7QUFMQUE7O0lBd0JEQTtRQUFBQTs7VUFERUE7YUFDRkE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsU0FBU0E7UUFDdEJBLENBQUNBO1FBRURBLEtBQUFBLFVBQW9CQSxLQUFrQkE7WUFFckNBLElBQUlBLEtBQUtBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBO2dCQUMxQkEsTUFBT0EsQ0FBQUE7O1lBRVJBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBO2dCQUNqQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsWUFBWUEsQ0FBa0JBLElBQUlBLENBQUNBLENBQUNBOztZQUVwREEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsS0FBS0E7O1lBRXRCQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQTtnQkFDakJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLFNBQVNBLENBQWtCQSxJQUFJQSxDQUFDQSxDQUFDQTtRQUNsREEsQ0FBQ0E7Ozs7QUFkQUE7O0lBZ0JEQTtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxTQUFTQSxDQUFDQSxNQUFNQTtRQUN4QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7O01BREdBO3lDQUNIQTtRQUVDRSxXQUFXQTtJQUNaQSxDQUFDQTs7SUFLREY7O01BREdBO2tEQUNIQTtRQUVDRyxPQUFPQSxJQUFJQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQTtJQUM1QkEsQ0FBQ0E7O0lBS0RIOztNQURHQTtvREFDSEE7UUFFQ0ksT0FBNEJBLElBQUlBLFVBQVVBLENBQUNBLENBQUNBO0lBQzdDQSxDQUFDQTs7SUFLREo7O01BREdBO3FDQUNIQTtRQUVDSyxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxLQUFLQTtJQUM3QkEsQ0FBQ0E7O0lBRURMO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLEtBQUtBO1FBQ2JBLENBQUNBOzs7O0FBQUFBO0lBRURBLHdDQUFBQSxVQUE0QkEsUUFBa0JBO1FBRTdDTSx5REFBeURBO0lBQzFEQSxDQUFDQTs7SUFFRE4sdUNBQUFBLFVBQTJCQSxRQUFrQkE7SUFHN0NPLENBQUNBO0lBQ0ZQLGNBQUNBO0FBQURBLENBQUNBLEVBaEhvQixhQUFhLEVBZ0hqQzs7QUFFRCx1QkFBZ0IsQ0FBQSIsImZpbGUiOiJlbnRpdGllcy9Ta3lib3guanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUFuaW1hdG9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9hbmltYXRvcnMvSUFuaW1hdG9yXCIpO1xuaW1wb3J0IEJvdW5kaW5nVm9sdW1lQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ib3VuZHMvQm91bmRpbmdWb2x1bWVCYXNlXCIpO1xuaW1wb3J0IE51bGxCb3VuZHNcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2JvdW5kcy9OdWxsQm91bmRzXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvRGlzcGxheU9iamVjdFwiKTtcbmltcG9ydCBJTWF0ZXJpYWxPd25lclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JTWF0ZXJpYWxPd25lclwiKTtcbmltcG9ydCBVVlRyYW5zZm9ybVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1VWVHJhbnNmb3JtXCIpO1xuaW1wb3J0IEFzc2V0VHlwZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0VHlwZVwiKTtcbmltcG9ydCBTa3lib3hOb2RlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3BhcnRpdGlvbi9Ta3lib3hOb2RlXCIpO1xuaW1wb3J0IElSZW5kZXJlclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvSVJlbmRlcmVyXCIpO1xuaW1wb3J0IElFbnRpdHlcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvSUVudGl0eVwiKTtcbmltcG9ydCBNYXRlcmlhbEJhc2VcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9NYXRlcmlhbEJhc2VcIik7XG5cbi8qKlxuICogQSBTa3lib3ggY2xhc3MgaXMgdXNlZCB0byByZW5kZXIgYSBza3kgaW4gdGhlIHNjZW5lLiBJdCdzIGFsd2F5cyBjb25zaWRlcmVkIHN0YXRpYyBhbmQgJ2F0IGluZmluaXR5JywgYW5kIGFzXG4gKiBzdWNoIGl0J3MgYWx3YXlzIGNlbnRlcmVkIGF0IHRoZSBjYW1lcmEncyBwb3NpdGlvbiBhbmQgc2l6ZWQgdG8gZXhhY3RseSBmaXQgd2l0aGluIHRoZSBjYW1lcmEncyBmcnVzdHVtLCBlbnN1cmluZ1xuICogdGhlIHNreSBib3ggaXMgYWx3YXlzIGFzIGxhcmdlIGFzIHBvc3NpYmxlIHdpdGhvdXQgYmVpbmcgY2xpcHBlZC5cbiAqL1xuY2xhc3MgU2t5Ym94IGV4dGVuZHMgRGlzcGxheU9iamVjdCBpbXBsZW1lbnRzIElFbnRpdHksIElNYXRlcmlhbE93bmVyXG57XG5cdHByaXZhdGUgX3V2VHJhbnNmb3JtOlVWVHJhbnNmb3JtO1xuXG5cdHByaXZhdGUgX21hdGVyaWFsOk1hdGVyaWFsQmFzZTtcblx0cHJpdmF0ZSBfYW5pbWF0b3I6SUFuaW1hdG9yO1xuXG5cdHB1YmxpYyBnZXQgYW5pbWF0b3IoKTpJQW5pbWF0b3Jcblx0e1xuXHRcdHJldHVybiB0aGlzLl9hbmltYXRvcjtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB1dlRyYW5zZm9ybSgpOlVWVHJhbnNmb3JtXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdXZUcmFuc2Zvcm07XG5cdH1cblxuXHRwdWJsaWMgc2V0IHV2VHJhbnNmb3JtKHZhbHVlOlVWVHJhbnNmb3JtKVxuXHR7XG5cdFx0dGhpcy5fdXZUcmFuc2Zvcm0gPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBuZXcgU2t5Ym94IG9iamVjdC5cblx0ICpcblx0ICogQHBhcmFtIG1hdGVyaWFsXHRUaGUgbWF0ZXJpYWwgd2l0aCB3aGljaCB0byByZW5kZXIgdGhlIFNreWJveC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKG1hdGVyaWFsOk1hdGVyaWFsQmFzZSlcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9wSXNFbnRpdHkgPSB0cnVlO1xuXG5cdFx0dGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsO1xuXHR9XG5cbi8qKlxuICogVGhlIG1hdGVyaWFsIHdpdGggd2hpY2ggdG8gcmVuZGVyIHRoZSBTa3lib3guXG4gKi9cblx0cHVibGljIGdldCBtYXRlcmlhbCgpOk1hdGVyaWFsQmFzZVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21hdGVyaWFsO1xuXHR9XG5cblx0cHVibGljIHNldCBtYXRlcmlhbCh2YWx1ZTpNYXRlcmlhbEJhc2UpXG5cdHtcblx0XHRpZiAodmFsdWUgPT0gdGhpcy5fbWF0ZXJpYWwpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5fbWF0ZXJpYWwpXG5cdFx0XHR0aGlzLl9tYXRlcmlhbC5pUmVtb3ZlT3duZXIoPElNYXRlcmlhbE93bmVyPiB0aGlzKTtcblxuXHRcdHRoaXMuX21hdGVyaWFsID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5fbWF0ZXJpYWwpXG5cdFx0XHR0aGlzLl9tYXRlcmlhbC5pQWRkT3duZXIoPElNYXRlcmlhbE93bmVyPiB0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgYXNzZXRUeXBlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRUeXBlLlNLWUJPWDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgcEludmFsaWRhdGVCb3VuZHMoKVxuXHR7XG5cdFx0Ly8gZGVhZCBlbmRcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRwdWJsaWMgcENyZWF0ZUVudGl0eVBhcnRpdGlvbk5vZGUoKTpTa3lib3hOb2RlXG5cdHtcblx0XHRyZXR1cm4gbmV3IFNreWJveE5vZGUodGhpcyk7XG5cdH1cblxuXHQvKipcblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0cHVibGljIHBDcmVhdGVEZWZhdWx0Qm91bmRpbmdWb2x1bWUoKTpCb3VuZGluZ1ZvbHVtZUJhc2Vcblx0e1xuXHRcdHJldHVybiA8Qm91bmRpbmdWb2x1bWVCYXNlPiBuZXcgTnVsbEJvdW5kcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdHB1YmxpYyBwVXBkYXRlQm91bmRzKClcblx0e1xuXHRcdHRoaXMuX3BCb3VuZHNJbnZhbGlkID0gZmFsc2U7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGNhc3RzU2hhZG93cygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiBmYWxzZTsgLy9UT0RPXG5cdH1cblxuXHRwdWJsaWMgX2lDb2xsZWN0UmVuZGVyYWJsZXMocmVuZGVyZXI6SVJlbmRlcmVyKVxuXHR7XG5cdFx0Ly9za3lib3ggZG8gbm90IGdldCBjb2xsZWN0ZWQgaW4gdGhlIHN0YW5kYXJkIGVudGl0eSBsaXN0XG5cdH1cblxuXHRwdWJsaWMgX2lDb2xsZWN0UmVuZGVyYWJsZShyZW5kZXJlcjpJUmVuZGVyZXIpXG5cdHtcblxuXHR9XG59XG5cbmV4cG9ydCA9IFNreWJveDsiXX0= \ No newline at end of file diff --git a/lib/entities/Skybox.ts b/lib/entities/Skybox.ts new file mode 100755 index 00000000..395bb2da --- /dev/null +++ b/lib/entities/Skybox.ts @@ -0,0 +1,132 @@ +import IAnimator = require("awayjs-core/lib/animators/IAnimator"); +import BoundingVolumeBase = require("awayjs-core/lib/bounds/BoundingVolumeBase"); +import NullBounds = require("awayjs-core/lib/bounds/NullBounds"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import UVTransform = require("awayjs-core/lib/core/geom/UVTransform"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import SkyboxNode = require("awayjs-core/lib/core/partition/SkyboxNode"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import IEntity = require("awayjs-core/lib/entities/IEntity"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * A Skybox class is used to render a sky in the scene. It's always considered static and 'at infinity', and as + * such it's always centered at the camera's position and sized to exactly fit within the camera's frustum, ensuring + * the sky box is always as large as possible without being clipped. + */ +class Skybox extends DisplayObject implements IEntity, IMaterialOwner +{ + private _uvTransform:UVTransform; + + private _material:MaterialBase; + private _animator:IAnimator; + + public get animator():IAnimator + { + return this._animator; + } + + /** + * + */ + public get uvTransform():UVTransform + { + return this._uvTransform; + } + + public set uvTransform(value:UVTransform) + { + this._uvTransform = value; + } + + /** + * Create a new Skybox object. + * + * @param material The material with which to render the Skybox. + */ + constructor(material:MaterialBase) + { + super(); + + this._pIsEntity = true; + + this.material = material; + } + +/** + * The material with which to render the Skybox. + */ + public get material():MaterialBase + { + return this._material; + } + + public set material(value:MaterialBase) + { + if (value == this._material) + return; + + if (this._material) + this._material.iRemoveOwner( this); + + this._material = value; + + if (this._material) + this._material.iAddOwner( this); + } + + public get assetType():string + { + return AssetType.SKYBOX; + } + + /** + * @protected + */ + public pInvalidateBounds() + { + // dead end + } + + /** + * @protected + */ + public pCreateEntityPartitionNode():SkyboxNode + { + return new SkyboxNode(this); + } + + /** + * @protected + */ + public pCreateDefaultBoundingVolume():BoundingVolumeBase + { + return new NullBounds(); + } + + /** + * @protected + */ + public pUpdateBounds() + { + this._pBoundsInvalid = false; + } + + public get castsShadows():boolean + { + return false; //TODO + } + + public _iCollectRenderables(renderer:IRenderer) + { + //skybox do not get collected in the standard entity list + } + + public _iCollectRenderable(renderer:IRenderer) + { + + } +} + +export = Skybox; \ No newline at end of file diff --git a/lib/entities/TextField.js b/lib/entities/TextField.js new file mode 100755 index 00000000..c8581df5 --- /dev/null +++ b/lib/entities/TextField.js @@ -0,0 +1,603 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); + +/** +* The TextField class is used to create display objects for text display and +* input. You can use the TextField class to +* perform low-level text rendering. However, in Flex, you typically use the +* Label, Text, TextArea, and TextInput controls to process text. You can give a text field an instance name in the +* Property inspector and use the methods and properties of the TextField +* class to manipulate it with ActionScript. TextField instance names are +* displayed in the Movie Explorer and in the Insert Target Path dialog box in +* the Actions panel. +* +*

To create a text field dynamically, use the TextField() +* constructor.

+* +*

The methods of the TextField class let you set, select, and manipulate +* text in a dynamic or input text field that you create during authoring or +* at runtime.

+* +*

ActionScript provides several ways to format your text at runtime. The +* TextFormat class lets you set character and paragraph formatting for +* TextField objects. You can apply Cascading Style Sheets(CSS) styles to +* text fields by using the TextField.styleSheet property and the +* StyleSheet class. You can use CSS to style built-in HTML tags, define new +* formatting tags, or apply styles. You can assign HTML formatted text, which +* optionally uses CSS styles, directly to a text field. HTML text that you +* assign to a text field can contain embedded media(movie clips, SWF files, +* GIF files, PNG files, and JPEG files). The text wraps around the embedded +* media in the same way that a web browser wraps text around media embedded +* in an HTML document.

+* +*

Flash Player supports a subset of HTML tags that you can use to format +* text. See the list of supported HTML tags in the description of the +* htmlText property.

+* +* @event change Dispatched after a control value is +* modified, unlike the +* textInput event, which is +* dispatched before the value is modified. +* Unlike the W3C DOM Event Model version of +* the change event, which +* dispatches the event only after the +* control loses focus, the ActionScript 3.0 +* version of the change event +* is dispatched any time the control +* changes. For example, if a user types text +* into a text field, a change +* event is dispatched after every keystroke. +* @event link Dispatched when a user clicks a hyperlink +* in an HTML-enabled text field, where the +* URL begins with "event:". The remainder of +* the URL after "event:" is placed in the +* text property of the LINK event. +* +*

Note: The default behavior, +* adding the text to the text field, occurs +* only when Flash Player generates the +* event, which in this case happens when a +* user attempts to input text. You cannot +* put text into a text field by sending it +* textInput events.

+* @event scroll Dispatched by a TextField object +* after the user scrolls. +* @event textInput Flash Player dispatches the +* textInput event when a user +* enters one or more characters of text. +* Various text input methods can generate +* this event, including standard keyboards, +* input method editors(IMEs), voice or +* speech recognition systems, and even the +* act of pasting plain text with no +* formatting or style information. +* @event textInteractionModeChange Flash Player dispatches the +* textInteractionModeChange +* event when a user changes the interaction +* mode of a text field. for example on +* Android, one can toggle from NORMAL mode +* to SELECTION mode using context menu +* options +*/ +var TextField = (function (_super) { + __extends(TextField, _super); + /** + * Creates a new TextField instance. After you create the TextField instance, + * call the addChild() or addChildAt() method of + * the parent DisplayObjectContainer object to add the TextField instance to + * the display list. + * + *

The default size for a text field is 100 x 100 pixels.

+ */ + function TextField() { + _super.call(this); + this._text = ""; + } + Object.defineProperty(TextField.prototype, "bottomScrollV", { + /** + * An integer(1-based index) that indicates the bottommost line that is + * currently visible in the specified text field. Think of the text field as + * a window onto a block of text. The scrollV property is the + * 1-based index of the topmost visible line in the window. + * + *

All the text between the lines indicated by scrollV and + * bottomScrollV is currently visible in the text field.

+ */ + get: function () { + return this._bottomScrollV; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "caretIndex", { + /** + * The index of the insertion point(caret) position. If no insertion point + * is displayed, the value is the position the insertion point would be if + * you restored focus to the field(typically where the insertion point last + * was, or 0 if the field has not had focus). + * + *

Selection span indexes are zero-based(for example, the first position + * is 0, the second position is 1, and so on).

+ */ + get: function () { + return this._caretIndex; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "length", { + /** + * The number of characters in a text field. A character such as tab + * (\t) counts as one character. + */ + get: function () { + return this._length; + }, + enumerable: true, + configurable: true + }); + + /** + * The maximum value of scrollH. + */ + TextField.prototype.maxScrollH = function () { + return this._maxScrollH; + }; + + /** + * The maximum value of scrollV. + */ + TextField.prototype.maxScrollV = function () { + return this._maxScrollV; + }; + + Object.defineProperty(TextField.prototype, "numLines", { + /** + * Defines the number of text lines in a multiline text field. If + * wordWrap property is set to true, the number of + * lines increases when text wraps. + */ + get: function () { + return this._numLines; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "selectionBeginIndex", { + /** + * The zero-based character index value of the first character in the current + * selection. For example, the first character is 0, the second character is + * 1, and so on. If no text is selected, this property is the value of + * caretIndex. + */ + get: function () { + return this._selectionBeginIndex; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "selectionEndIndex", { + /** + * The zero-based character index value of the last character in the current + * selection. For example, the first character is 0, the second character is + * 1, and so on. If no text is selected, this property is the value of + * caretIndex. + */ + get: function () { + return this._selectionEndIndex; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "text", { + /** + * A string that is the current text in the text field. Lines are separated + * by the carriage return character('\r', ASCII 13). This + * property contains unformatted text in the text field, without HTML tags. + * + *

To get the text in HTML form, use the htmlText + * property.

+ */ + get: function () { + return this._text; + }, + set: function (value) { + if (this._text == value) + return; + + this._text = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TextField.prototype, "textHeight", { + /** + * The height of the text in pixels. + */ + get: function () { + return this._textHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "textInteractionMode", { + /** + * The interaction mode property, Default value is + * TextInteractionMode.NORMAL. On mobile platforms, the normal mode implies + * that the text can be scrolled but not selected. One can switch to the + * selectable mode through the in-built context menu on the text field. On + * Desktop, the normal mode implies that the text is in scrollable as well as + * selection mode. + */ + get: function () { + return this._textInteractionMode; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextField.prototype, "textWidth", { + /** + * The width of the text in pixels. + */ + get: function () { + return this._textWidth; + }, + enumerable: true, + configurable: true + }); + + /** + * Appends the string specified by the newText parameter to the + * end of the text of the text field. This method is more efficient than an + * addition assignment(+=) on a text property + * (such as someTextField.text += moreText), particularly for a + * text field that contains a significant amount of content. + * + * @param newText The string to append to the existing text. + */ + TextField.prototype.appendText = function (newText) { + //TODO + }; + + /** + * Returns a rectangle that is the bounding box of the character. + * + * @param charIndex The zero-based index value for the character(for + * example, the first position is 0, the second position is + * 1, and so on). + * @return A rectangle with x and y minimum and + * maximum values defining the bounding box of the character. + */ + TextField.prototype.getCharBoundaries = function (charIndex) { + return this._charBoundaries; + }; + + /** + * Returns the zero-based index value of the character at the point specified + * by the x and y parameters. + * + * @param x The x coordinate of the character. + * @param y The y coordinate of the character. + * @return The zero-based index value of the character(for example, the + * first position is 0, the second position is 1, and so on). Returns + * -1 if the point is not over any character. + */ + TextField.prototype.getCharIndexAtPoint = function (x, y) { + return this._charIndexAtPoint; + }; + + /** + * Given a character index, returns the index of the first character in the + * same paragraph. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return The zero-based index value of the first character in the same + * paragraph. + * @throws RangeError The character index specified is out of range. + */ + TextField.prototype.getFirstCharInParagraph = function (charIndex /*int*/ ) { + return this._firstCharInParagraph; + }; + + /** + * Returns a DisplayObject reference for the given id, for an + * image or SWF file that has been added to an HTML-formatted text field by + * using an tag. The tag is in the + * following format: + * + *

 

+ * + * @param id The id to match(in the id attribute + * of the tag). + * @return The display object corresponding to the image or SWF file with the + * matching id attribute in the tag + * of the text field. For media loaded from an external source, this + * object is a Loader object, and, once loaded, the media object is a + * child of that Loader object. For media embedded in the SWF file, + * it is the loaded object. If no tag with the + * matching id exists, the method returns + * null. + */ + TextField.prototype.getImageReference = function (id) { + return this._imageReference; + }; + + /** + * Returns the zero-based index value of the line at the point specified by + * the x and y parameters. + * + * @param x The x coordinate of the line. + * @param y The y coordinate of the line. + * @return The zero-based index value of the line(for example, the first + * line is 0, the second line is 1, and so on). Returns -1 if the + * point is not over any line. + */ + TextField.prototype.getLineIndexAtPoint = function (x, y) { + return this._lineIndexAtPoint; + }; + + /** + * Returns the zero-based index value of the line containing the character + * specified by the charIndex parameter. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return The zero-based index value of the line. + * @throws RangeError The character index specified is out of range. + */ + TextField.prototype.getLineIndexOfChar = function (charIndex /*int*/ ) { + return this._lineIndexOfChar; + }; + + /** + * Returns the number of characters in a specific text line. + * + * @param lineIndex The line number for which you want the length. + * @return The number of characters in the line. + * @throws RangeError The line number specified is out of range. + */ + TextField.prototype.getLineLength = function (lineIndex /*int*/ ) { + return this._lineLength; + }; + + /** + * Returns metrics information about a given text line. + * + * @param lineIndex The line number for which you want metrics information. + * @return A TextLineMetrics object. + * @throws RangeError The line number specified is out of range. + */ + TextField.prototype.getLineMetrics = function (lineIndex /*int*/ ) { + return this._lineMetrics; + }; + + /** + * Returns the character index of the first character in the line that the + * lineIndex parameter specifies. + * + * @param lineIndex The zero-based index value of the line(for example, the + * first line is 0, the second line is 1, and so on). + * @return The zero-based index value of the first character in the line. + * @throws RangeError The line number specified is out of range. + */ + TextField.prototype.getLineOffset = function (lineIndex /*int*/ ) { + return this._lineOffset; + }; + + /** + * Returns the text of the line specified by the lineIndex + * parameter. + * + * @param lineIndex The zero-based index value of the line(for example, the + * first line is 0, the second line is 1, and so on). + * @return The text string contained in the specified line. + * @throws RangeError The line number specified is out of range. + */ + TextField.prototype.getLineText = function (lineIndex /*int*/ ) { + return this._lineText; + }; + + /** + * Given a character index, returns the length of the paragraph containing + * the given character. The length is relative to the first character in the + * paragraph(as returned by getFirstCharInParagraph()), not to + * the character index passed in. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return Returns the number of characters in the paragraph. + * @throws RangeError The character index specified is out of range. + */ + TextField.prototype.getParagraphLength = function (charIndex /*int*/ ) { + return this._paragraphLength; + }; + + /** + * Returns a TextFormat object that contains formatting information for the + * range of text that the beginIndex and endIndex + * parameters specify. Only properties that are common to the entire text + * specified are set in the resulting TextFormat object. Any property that is + * mixed, meaning that it has different values at different points in + * the text, has a value of null. + * + *

If you do not specify values for these parameters, this method is + * applied to all the text in the text field.

+ * + *

The following table describes three possible usages:

+ * + * @return The TextFormat object that represents the formatting properties + * for the specified text. + * @throws RangeError The beginIndex or endIndex + * specified is out of range. + */ + TextField.prototype.getTextFormat = function (beginIndex, endIndex) { + if (typeof beginIndex === "undefined") { beginIndex = -1; } + if (typeof endIndex === "undefined") { endIndex = -1; } + return this._textFormat; + }; + + /** + * Replaces the current selection with the contents of the value + * parameter. The text is inserted at the position of the current selection, + * using the current default character format and default paragraph format. + * The text is not treated as HTML. + * + *

You can use the replaceSelectedText() method to insert and + * delete text without disrupting the character and paragraph formatting of + * the rest of the text.

+ * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + * @param value The string to replace the currently selected text. + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + TextField.prototype.replaceSelectedText = function (value) { + }; + + /** + * Replaces the range of characters that the beginIndex and + * endIndex parameters specify with the contents of the + * newText parameter. As designed, the text from + * beginIndex to endIndex-1 is replaced. + * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + * @param beginIndex The zero-based index value for the start position of the + * replacement range. + * @param endIndex The zero-based index position of the first character + * after the desired text span. + * @param newText The text to use to replace the specified range of + * characters. + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + TextField.prototype.replaceText = function (beginIndex /*int*/ , endIndex /*int*/ , newText) { + }; + + /** + * Sets as selected the text designated by the index values of the first and + * last characters, which are specified with the beginIndex and + * endIndex parameters. If the two parameter values are the + * same, this method sets the insertion point, as if you set the + * caretIndex property. + * + * @param beginIndex The zero-based index value of the first character in the + * selection(for example, the first character is 0, the + * second character is 1, and so on). + * @param endIndex The zero-based index value of the last character in the + * selection. + */ + TextField.prototype.setSelection = function (beginIndex /*int*/ , endIndex /*int*/ ) { + }; + + /** + * Applies the text formatting that the format parameter + * specifies to the specified text in a text field. The value of + * format must be a TextFormat object that specifies the desired + * text formatting changes. Only the non-null properties of + * format are applied to the text field. Any property of + * format that is set to null is not applied. By + * default, all of the properties of a newly created TextFormat object are + * set to null. + * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + *

The setTextFormat() method changes the text formatting + * applied to a range of characters or to the entire body of text in a text + * field. To apply the properties of format to all text in the text field, do + * not specify values for beginIndex and endIndex. + * To apply the properties of the format to a range of text, specify values + * for the beginIndex and the endIndex parameters. + * You can use the length property to determine the index + * values.

+ * + *

The two types of formatting information in a TextFormat object are + * character level formatting and paragraph level formatting. Each character + * in a text field can have its own character formatting settings, such as + * font name, font size, bold, and italic.

+ * + *

For paragraphs, the first character of the paragraph is examined for + * the paragraph formatting settings for the entire paragraph. Examples of + * paragraph formatting settings are left margin, right margin, and + * indentation.

+ * + *

Any text inserted manually by the user, or replaced by the + * replaceSelectedText() method, receives the default text field + * formatting for new text, and not the formatting specified for the text + * insertion point. To set the default formatting for new text, use + * defaultTextFormat.

+ * + * @param format A TextFormat object that contains character and paragraph + * formatting information. + * @throws Error This method cannot be used on a text field with a style + * sheet. + * @throws RangeError The beginIndex or endIndex + * specified is out of range. + */ + TextField.prototype.setTextFormat = function (format, beginIndex, endIndex) { + if (typeof beginIndex === "undefined") { beginIndex = -1; } + if (typeof endIndex === "undefined") { endIndex = -1; } + }; + + /** + * Returns true if an embedded font is available with the specified + * fontName and fontStyle where + * Font.fontType is flash.text.FontType.EMBEDDED. + * Starting with Flash Player 10, two kinds of embedded fonts can appear in a + * SWF file. Normal embedded fonts are only used with TextField objects. CFF + * embedded fonts are only used with the flash.text.engine classes. The two + * types are distinguished by the fontType property of the + * Font class, as returned by the enumerateFonts() + * function. + * + *

TextField cannot use a font of type EMBEDDED_CFF. If + * embedFonts is set to true and the only font + * available at run time with the specified name and style is of type + * EMBEDDED_CFF, Flash Player fails to render the text, as if no + * embedded font were available with the specified name and style.

+ * + *

If both EMBEDDED and EMBEDDED_CFF fonts are + * available with the same name and style, the EMBEDDED font is + * selected and text renders with the EMBEDDED font.

+ * + * @param fontName The name of the embedded font to check. + * @param fontStyle Specifies the font style to check. Use + * flash.text.FontStyle + * @return true if a compatible embedded font is available, + * otherwise false. + * @throws ArgumentError The fontStyle specified is not a member + * of flash.text.FontStyle. + */ + TextField.isFontCompatible = function (fontName, fontStyle) { + return false; + }; + return TextField; +})(DisplayObject); + +module.exports = TextField; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL1RleHRGaWVsZC50cyJdLCJuYW1lcyI6WyJUZXh0RmllbGQiLCJUZXh0RmllbGQuY29uc3RydWN0b3IiLCJUZXh0RmllbGQubWF4U2Nyb2xsSCIsIlRleHRGaWVsZC5tYXhTY3JvbGxWIiwiVGV4dEZpZWxkLmFwcGVuZFRleHQiLCJUZXh0RmllbGQuZ2V0Q2hhckJvdW5kYXJpZXMiLCJUZXh0RmllbGQuZ2V0Q2hhckluZGV4QXRQb2ludCIsIlRleHRGaWVsZC5nZXRGaXJzdENoYXJJblBhcmFncmFwaCIsIlRleHRGaWVsZC5nZXRJbWFnZVJlZmVyZW5jZSIsIlRleHRGaWVsZC5nZXRMaW5lSW5kZXhBdFBvaW50IiwiVGV4dEZpZWxkLmdldExpbmVJbmRleE9mQ2hhciIsIlRleHRGaWVsZC5nZXRMaW5lTGVuZ3RoIiwiVGV4dEZpZWxkLmdldExpbmVNZXRyaWNzIiwiVGV4dEZpZWxkLmdldExpbmVPZmZzZXQiLCJUZXh0RmllbGQuZ2V0TGluZVRleHQiLCJUZXh0RmllbGQuZ2V0UGFyYWdyYXBoTGVuZ3RoIiwiVGV4dEZpZWxkLmdldFRleHRGb3JtYXQiLCJUZXh0RmllbGQucmVwbGFjZVNlbGVjdGVkVGV4dCIsIlRleHRGaWVsZC5yZXBsYWNlVGV4dCIsIlRleHRGaWVsZC5zZXRTZWxlY3Rpb24iLCJUZXh0RmllbGQuc2V0VGV4dEZvcm1hdCIsIlRleHRGaWVsZC5pc0ZvbnRDb21wYXRpYmxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxzRUFBNkU7O0FBVTdFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUE4RUc7QUFDSDtJQUF3QkEsNEJBQWFBO0lBcWxCcENBOzs7Ozs7O01BREdBO0lBQ0hBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBO1FBN2tCUkEsS0FBUUEsS0FBS0EsR0FBVUEsRUFBRUEsQ0FBQ0E7SUE4a0IxQkEsQ0FBQ0E7SUE3Y0RE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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFER0E7d0NBQ0hBLFVBQXFCQSxNQUFpQkEsRUFBRUEsVUFBOEJBLEVBQUVBLFFBQTRCQTtRQUE1RG9CLHlDQUFBQSxVQUFVQSxHQUFrQkEsQ0FBQ0EsQ0FBQ0E7QUFBQUEsUUFBRUEsdUNBQUFBLFFBQVFBLEdBQWtCQSxDQUFDQSxDQUFDQTtBQUFBQSxJQUdwR0EsQ0FBQ0E7O0lBK0JEcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFER0E7aUNBQ0hBLFVBQStCQSxRQUFlQSxFQUFFQSxTQUFnQkE7UUFFL0RxQixPQUFPQSxLQUFLQTtJQUNiQSxDQUFDQTtJQUNGckIsaUJBQUNBO0FBQURBLENBQUNBLEVBMTdCdUIsYUFBYSxFQTA3QnBDOztBQUVELDBCQUFtQixDQUFBIiwiZmlsZSI6ImVudGl0aWVzL1RleHRGaWVsZC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgUmVjdGFuZ2xlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUmVjdGFuZ2xlXCIpO1xuaW1wb3J0IEFudGlBbGlhc1R5cGVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RleHQvQW50aUFsaWFzVHlwZVwiKTtcbmltcG9ydCBHcmlkRml0VHlwZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90ZXh0L0dyaWRGaXRUeXBlXCIpO1xuaW1wb3J0IFRleHRGaWVsZEF1dG9TaXplXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvdGV4dC9UZXh0RmllbGRBdXRvU2l6ZVwiKTtcbmltcG9ydCBUZXh0RmllbGRUeXBlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90ZXh0L1RleHRGaWVsZFR5cGVcIik7XG5pbXBvcnQgVGV4dEZvcm1hdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90ZXh0L1RleHRGb3JtYXRcIik7XG5pbXBvcnQgVGV4dEludGVyYWN0aW9uTW9kZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RleHQvVGV4dEludGVyYWN0aW9uTW9kZVwiKTtcbmltcG9ydCBUZXh0TGluZU1ldHJpY3NcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3RleHQvVGV4dExpbmVNZXRyaWNzXCIpO1xuXG4vKipcbiAqIFRoZSBUZXh0RmllbGQgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgZGlzcGxheSBvYmplY3RzIGZvciB0ZXh0IGRpc3BsYXkgYW5kXG4gKiBpbnB1dC4gPHBoIG91dHB1dGNsYXNzPVwiZmxleG9ubHlcIj5Zb3UgY2FuIHVzZSB0aGUgVGV4dEZpZWxkIGNsYXNzIHRvXG4gKiBwZXJmb3JtIGxvdy1sZXZlbCB0ZXh0IHJlbmRlcmluZy4gSG93ZXZlciwgaW4gRmxleCwgeW91IHR5cGljYWxseSB1c2UgdGhlXG4gKiBMYWJlbCwgVGV4dCwgVGV4dEFyZWEsIGFuZCBUZXh0SW5wdXQgY29udHJvbHMgdG8gcHJvY2VzcyB0ZXh0LiA8cGhcbiAqIG91dHB1dGNsYXNzPVwiZmxhc2hvbmx5XCI+WW91IGNhbiBnaXZlIGEgdGV4dCBmaWVsZCBhbiBpbnN0YW5jZSBuYW1lIGluIHRoZVxuICogUHJvcGVydHkgaW5zcGVjdG9yIGFuZCB1c2UgdGhlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIFRleHRGaWVsZFxuICogY2xhc3MgdG8gbWFuaXB1bGF0ZSBpdCB3aXRoIEFjdGlvblNjcmlwdC4gVGV4dEZpZWxkIGluc3RhbmNlIG5hbWVzIGFyZVxuICogZGlzcGxheWVkIGluIHRoZSBNb3ZpZSBFeHBsb3JlciBhbmQgaW4gdGhlIEluc2VydCBUYXJnZXQgUGF0aCBkaWFsb2cgYm94IGluXG4gKiB0aGUgQWN0aW9ucyBwYW5lbC5cbiAqXG4gKiA8cD5UbyBjcmVhdGUgYSB0ZXh0IGZpZWxkIGR5bmFtaWNhbGx5LCB1c2UgdGhlIDxjb2RlPlRleHRGaWVsZCgpPC9jb2RlPlxuICogY29uc3RydWN0b3IuPC9wPlxuICpcbiAqIDxwPlRoZSBtZXRob2RzIG9mIHRoZSBUZXh0RmllbGQgY2xhc3MgbGV0IHlvdSBzZXQsIHNlbGVjdCwgYW5kIG1hbmlwdWxhdGVcbiAqIHRleHQgaW4gYSBkeW5hbWljIG9yIGlucHV0IHRleHQgZmllbGQgdGhhdCB5b3UgY3JlYXRlIGR1cmluZyBhdXRob3Jpbmcgb3JcbiAqIGF0IHJ1bnRpbWUuIDwvcD5cbiAqXG4gKiA8cD5BY3Rpb25TY3JpcHQgcHJvdmlkZXMgc2V2ZXJhbCB3YXlzIHRvIGZvcm1hdCB5b3VyIHRleHQgYXQgcnVudGltZS4gVGhlXG4gKiBUZXh0Rm9ybWF0IGNsYXNzIGxldHMgeW91IHNldCBjaGFyYWN0ZXIgYW5kIHBhcmFncmFwaCBmb3JtYXR0aW5nIGZvclxuICogVGV4dEZpZWxkIG9iamVjdHMuIFlvdSBjYW4gYXBwbHkgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0cyhDU1MpIHN0eWxlcyB0b1xuICogdGV4dCBmaWVsZHMgYnkgdXNpbmcgdGhlIDxjb2RlPlRleHRGaWVsZC5zdHlsZVNoZWV0PC9jb2RlPiBwcm9wZXJ0eSBhbmQgdGhlXG4gKiBTdHlsZVNoZWV0IGNsYXNzLiBZb3UgY2FuIHVzZSBDU1MgdG8gc3R5bGUgYnVpbHQtaW4gSFRNTCB0YWdzLCBkZWZpbmUgbmV3XG4gKiBmb3JtYXR0aW5nIHRhZ3MsIG9yIGFwcGx5IHN0eWxlcy4gWW91IGNhbiBhc3NpZ24gSFRNTCBmb3JtYXR0ZWQgdGV4dCwgd2hpY2hcbiAqIG9wdGlvbmFsbHkgdXNlcyBDU1Mgc3R5bGVzLCBkaXJlY3RseSB0byBhIHRleHQgZmllbGQuIEhUTUwgdGV4dCB0aGF0IHlvdVxuICogYXNzaWduIHRvIGEgdGV4dCBmaWVsZCBjYW4gY29udGFpbiBlbWJlZGRlZCBtZWRpYShtb3ZpZSBjbGlwcywgU1dGIGZpbGVzLFxuICogR0lGIGZpbGVzLCBQTkcgZmlsZXMsIGFuZCBKUEVHIGZpbGVzKS4gVGhlIHRleHQgd3JhcHMgYXJvdW5kIHRoZSBlbWJlZGRlZFxuICogbWVkaWEgaW4gdGhlIHNhbWUgd2F5IHRoYXQgYSB3ZWIgYnJvd3NlciB3cmFwcyB0ZXh0IGFyb3VuZCBtZWRpYSBlbWJlZGRlZFxuICogaW4gYW4gSFRNTCBkb2N1bWVudC4gPC9wPlxuICpcbiAqIDxwPkZsYXNoIFBsYXllciBzdXBwb3J0cyBhIHN1YnNldCBvZiBIVE1MIHRhZ3MgdGhhdCB5b3UgY2FuIHVzZSB0byBmb3JtYXRcbiAqIHRleHQuIFNlZSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgSFRNTCB0YWdzIGluIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGVcbiAqIDxjb2RlPmh0bWxUZXh0PC9jb2RlPiBwcm9wZXJ0eS48L3A+XG4gKiBcbiAqIEBldmVudCBjaGFuZ2UgICAgICAgICAgICAgICAgICAgIERpc3BhdGNoZWQgYWZ0ZXIgYSBjb250cm9sIHZhbHVlIGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZCwgdW5saWtlIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+dGV4dElucHV0PC9jb2RlPiBldmVudCwgd2hpY2ggaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZWQgYmVmb3JlIHRoZSB2YWx1ZSBpcyBtb2RpZmllZC5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVubGlrZSB0aGUgVzNDIERPTSBFdmVudCBNb2RlbCB2ZXJzaW9uIG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgPGNvZGU+Y2hhbmdlPC9jb2RlPiBldmVudCwgd2hpY2hcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BhdGNoZXMgdGhlIGV2ZW50IG9ubHkgYWZ0ZXIgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGxvc2VzIGZvY3VzLCB0aGUgQWN0aW9uU2NyaXB0IDMuMFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgPGNvZGU+Y2hhbmdlPC9jb2RlPiBldmVudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZGlzcGF0Y2hlZCBhbnkgdGltZSB0aGUgY29udHJvbFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy4gRm9yIGV4YW1wbGUsIGlmIGEgdXNlciB0eXBlcyB0ZXh0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIGEgdGV4dCBmaWVsZCwgYSA8Y29kZT5jaGFuZ2U8L2NvZGU+XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCBpcyBkaXNwYXRjaGVkIGFmdGVyIGV2ZXJ5IGtleXN0cm9rZS5cbiAqIEBldmVudCBsaW5rICAgICAgICAgICAgICAgICAgICAgIERpc3BhdGNoZWQgd2hlbiBhIHVzZXIgY2xpY2tzIGEgaHlwZXJsaW5rXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBhbiBIVE1MLWVuYWJsZWQgdGV4dCBmaWVsZCwgd2hlcmUgdGhlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkwgYmVnaW5zIHdpdGggXCJldmVudDpcIi4gVGhlIHJlbWFpbmRlciBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFVSTCBhZnRlciBcImV2ZW50OlwiIGlzIHBsYWNlZCBpbiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgcHJvcGVydHkgb2YgdGhlIExJTksgZXZlbnQuXG4gKlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+PGI+Tm90ZTo8L2I+IFRoZSBkZWZhdWx0IGJlaGF2aW9yLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaW5nIHRoZSB0ZXh0IHRvIHRoZSB0ZXh0IGZpZWxkLCBvY2N1cnNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgd2hlbiBGbGFzaCBQbGF5ZXIgZ2VuZXJhdGVzIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQsIHdoaWNoIGluIHRoaXMgY2FzZSBoYXBwZW5zIHdoZW4gYVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhdHRlbXB0cyB0byBpbnB1dCB0ZXh0LiBZb3UgY2Fubm90XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQgdGV4dCBpbnRvIGEgdGV4dCBmaWVsZCBieSBzZW5kaW5nIGl0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29kZT50ZXh0SW5wdXQ8L2NvZGU+IGV2ZW50cy48L3A+XG4gKiBAZXZlbnQgc2Nyb2xsICAgICAgICAgICAgICAgICAgICBEaXNwYXRjaGVkIGJ5IGEgVGV4dEZpZWxkIG9iamVjdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGk+YWZ0ZXI8L2k+IHRoZSB1c2VyIHNjcm9sbHMuXG4gKiBAZXZlbnQgdGV4dElucHV0ICAgICAgICAgICAgICAgICBGbGFzaCBQbGF5ZXIgZGlzcGF0Y2hlcyB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnRleHRJbnB1dDwvY29kZT4gZXZlbnQgd2hlbiBhIHVzZXJcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVycyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIG9mIHRleHQuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpb3VzIHRleHQgaW5wdXQgbWV0aG9kcyBjYW4gZ2VuZXJhdGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZXZlbnQsIGluY2x1ZGluZyBzdGFuZGFyZCBrZXlib2FyZHMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBtZXRob2QgZWRpdG9ycyhJTUVzKSwgdm9pY2Ugb3JcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWVjaCByZWNvZ25pdGlvbiBzeXN0ZW1zLCBhbmQgZXZlbiB0aGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdCBvZiBwYXN0aW5nIHBsYWluIHRleHQgd2l0aCBub1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGluZyBvciBzdHlsZSBpbmZvcm1hdGlvbi5cbiAqIEBldmVudCB0ZXh0SW50ZXJhY3Rpb25Nb2RlQ2hhbmdlIEZsYXNoIFBsYXllciBkaXNwYXRjaGVzIHRoZVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGU+dGV4dEludGVyYWN0aW9uTW9kZUNoYW5nZTwvY29kZT5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50IHdoZW4gYSB1c2VyIGNoYW5nZXMgdGhlIGludGVyYWN0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9mIGEgdGV4dCBmaWVsZC4gZm9yIGV4YW1wbGUgb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZHJvaWQsIG9uZSBjYW4gdG9nZ2xlIGZyb20gTk9STUFMIG1vZGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIFNFTEVDVElPTiBtb2RlIHVzaW5nIGNvbnRleHQgbWVudVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1xuICovXG5jbGFzcyBUZXh0RmllbGQgZXh0ZW5kcyBEaXNwbGF5T2JqZWN0XG57XG5cdHByaXZhdGUgX2JvdHRvbVNjcm9sbFY6bnVtYmVyO1xuXHRwcml2YXRlIF9jYXJldEluZGV4Om51bWJlcjtcblx0cHJpdmF0ZSBfbGVuZ3RoOm51bWJlcjtcblx0cHJpdmF0ZSBfbWF4U2Nyb2xsSDpudW1iZXI7XG5cdHByaXZhdGUgX21heFNjcm9sbFY6bnVtYmVyO1xuXHRwcml2YXRlIF9udW1MaW5lczpudW1iZXI7XG5cdHByaXZhdGUgX3NlbGVjdGlvbkJlZ2luSW5kZXg6bnVtYmVyO1xuXHRwcml2YXRlIF9zZWxlY3Rpb25FbmRJbmRleDpudW1iZXI7XG5cdHByaXZhdGUgX3RleHQ6c3RyaW5nID0gXCJcIjtcblx0cHJpdmF0ZSBfdGV4dEhlaWdodDpudW1iZXI7XG5cdHByaXZhdGUgX3RleHRJbnRlcmFjdGlvbk1vZGU6VGV4dEludGVyYWN0aW9uTW9kZTtcblx0cHJpdmF0ZSBfdGV4dFdpZHRoOm51bWJlcjtcblxuXHRwcml2YXRlIF9jaGFyQm91bmRhcmllczpSZWN0YW5nbGU7XG5cdHByaXZhdGUgX2NoYXJJbmRleEF0UG9pbnQ6bnVtYmVyO1xuXHRwcml2YXRlIF9maXJzdENoYXJJblBhcmFncmFwaDpudW1iZXI7XG5cdHByaXZhdGUgX2ltYWdlUmVmZXJlbmNlOkRpc3BsYXlPYmplY3Rcblx0cHJpdmF0ZSBfbGluZUluZGV4QXRQb2ludDpudW1iZXI7XG5cdHByaXZhdGUgX2xpbmVJbmRleE9mQ2hhcjpudW1iZXI7XG5cdHByaXZhdGUgX2xpbmVMZW5ndGg6bnVtYmVyO1xuXHRwcml2YXRlIF9saW5lTWV0cmljczpUZXh0TGluZU1ldHJpY3M7XG5cdHByaXZhdGUgX2xpbmVPZmZzZXQ6bnVtYmVyO1xuXHRwcml2YXRlIF9saW5lVGV4dDpzdHJpbmc7XG5cdHByaXZhdGUgX3BhcmFncmFwaExlbmd0aDpudW1iZXI7XG5cdHByaXZhdGUgX3RleHRGb3JtYXQ6VGV4dEZvcm1hdDtcblxuXHQvKipcblx0ICogV2hlbiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4gYW5kIHRoZSB0ZXh0IGZpZWxkIGlzIG5vdCBpbiBmb2N1cywgRmxhc2hcblx0ICogUGxheWVyIGhpZ2hsaWdodHMgdGhlIHNlbGVjdGlvbiBpbiB0aGUgdGV4dCBmaWVsZCBpbiBncmF5LiBXaGVuIHNldCB0b1xuXHQgKiA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZSB0ZXh0IGZpZWxkIGlzIG5vdCBpbiBmb2N1cywgRmxhc2ggUGxheWVyIGRvZXNcblx0ICogbm90IGhpZ2hsaWdodCB0aGUgc2VsZWN0aW9uIGluIHRoZSB0ZXh0IGZpZWxkLlxuXHQgKiBcblx0ICogQGRlZmF1bHQgZmFsc2Vcblx0ICovXG5cdHB1YmxpYyBhbHdheXNTaG93U2VsZWN0aW9uOmJvb2xlYW5cblxuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgYW50aS1hbGlhc2luZyB1c2VkIGZvciB0aGlzIHRleHQgZmllbGQuIFVzZVxuXHQgKiA8Y29kZT5mbGFzaC50ZXh0LkFudGlBbGlhc1R5cGU8L2NvZGU+IGNvbnN0YW50cyBmb3IgdGhpcyBwcm9wZXJ0eS4gWW91IGNhblxuXHQgKiBjb250cm9sIHRoaXMgc2V0dGluZyBvbmx5IGlmIHRoZSBmb250IGlzIGVtYmVkZGVkKHdpdGggdGhlXG5cdCAqIDxjb2RlPmVtYmVkRm9udHM8L2NvZGU+IHByb3BlcnR5IHNldCB0byA8Y29kZT50cnVlPC9jb2RlPikuIFRoZSBkZWZhdWx0XG5cdCAqIHNldHRpbmcgaXMgPGNvZGU+Zmxhc2gudGV4dC5BbnRpQWxpYXNUeXBlLk5PUk1BTDwvY29kZT4uXG5cdCAqXG5cdCAqIDxwPlRvIHNldCB2YWx1ZXMgZm9yIHRoaXMgcHJvcGVydHksIHVzZSB0aGUgZm9sbG93aW5nIHN0cmluZyB2YWx1ZXM6PC9wPlxuXHQgKi9cblx0cHVibGljIGFudGlBbGlhc1R5cGU6QW50aUFsaWFzVHlwZTtcblxuXHQvKipcblx0ICogQ29udHJvbHMgYXV0b21hdGljIHNpemluZyBhbmQgYWxpZ25tZW50IG9mIHRleHQgZmllbGRzLiBBY2NlcHRhYmxlIHZhbHVlc1xuXHQgKiBmb3IgdGhlIDxjb2RlPlRleHRGaWVsZEF1dG9TaXplPC9jb2RlPiBjb25zdGFudHM6XG5cdCAqIDxjb2RlPlRleHRGaWVsZEF1dG9TaXplLk5PTkU8L2NvZGU+KHRoZSBkZWZhdWx0KSxcblx0ICogPGNvZGU+VGV4dEZpZWxkQXV0b1NpemUuTEVGVDwvY29kZT4sIDxjb2RlPlRleHRGaWVsZEF1dG9TaXplLlJJR0hUPC9jb2RlPixcblx0ICogYW5kIDxjb2RlPlRleHRGaWVsZEF1dG9TaXplLkNFTlRFUjwvY29kZT4uXG5cdCAqXG5cdCAqIDxwPklmIDxjb2RlPmF1dG9TaXplPC9jb2RlPiBpcyBzZXQgdG8gPGNvZGU+VGV4dEZpZWxkQXV0b1NpemUuTk9ORTwvY29kZT5cblx0ICogKHRoZSBkZWZhdWx0KSBubyByZXNpemluZyBvY2N1cnMuPC9wPlxuXHQgKlxuXHQgKiA8cD5JZiA8Y29kZT5hdXRvU2l6ZTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPlRleHRGaWVsZEF1dG9TaXplLkxFRlQ8L2NvZGU+LFxuXHQgKiB0aGUgdGV4dCBpcyB0cmVhdGVkIGFzIGxlZnQtanVzdGlmaWVkIHRleHQsIG1lYW5pbmcgdGhhdCB0aGUgbGVmdCBtYXJnaW5cblx0ICogb2YgdGhlIHRleHQgZmllbGQgcmVtYWlucyBmaXhlZCBhbmQgYW55IHJlc2l6aW5nIG9mIGEgc2luZ2xlIGxpbmUgb2YgdGhlXG5cdCAqIHRleHQgZmllbGQgaXMgb24gdGhlIHJpZ2h0IG1hcmdpbi4gSWYgdGhlIHRleHQgaW5jbHVkZXMgYSBsaW5lIGJyZWFrKGZvclxuXHQgKiBleGFtcGxlLCA8Y29kZT5cIlxcblwiPC9jb2RlPiBvciA8Y29kZT5cIlxcclwiPC9jb2RlPiksIHRoZSBib3R0b20gaXMgYWxzb1xuXHQgKiByZXNpemVkIHRvIGZpdCB0aGUgbmV4dCBsaW5lIG9mIHRleHQuIElmIDxjb2RlPndvcmRXcmFwPC9jb2RlPiBpcyBhbHNvIHNldFxuXHQgKiB0byA8Y29kZT50cnVlPC9jb2RlPiwgb25seSB0aGUgYm90dG9tIG9mIHRoZSB0ZXh0IGZpZWxkIGlzIHJlc2l6ZWQgYW5kIHRoZVxuXHQgKiByaWdodCBzaWRlIHJlbWFpbnMgZml4ZWQuPC9wPlxuXHQgKlxuXHQgKiA8cD5JZiA8Y29kZT5hdXRvU2l6ZTwvY29kZT4gaXMgc2V0IHRvXG5cdCAqIDxjb2RlPlRleHRGaWVsZEF1dG9TaXplLlJJR0hUPC9jb2RlPiwgdGhlIHRleHQgaXMgdHJlYXRlZCBhc1xuXHQgKiByaWdodC1qdXN0aWZpZWQgdGV4dCwgbWVhbmluZyB0aGF0IHRoZSByaWdodCBtYXJnaW4gb2YgdGhlIHRleHQgZmllbGRcblx0ICogcmVtYWlucyBmaXhlZCBhbmQgYW55IHJlc2l6aW5nIG9mIGEgc2luZ2xlIGxpbmUgb2YgdGhlIHRleHQgZmllbGQgaXMgb25cblx0ICogdGhlIGxlZnQgbWFyZ2luLiBJZiB0aGUgdGV4dCBpbmNsdWRlcyBhIGxpbmUgYnJlYWsoZm9yIGV4YW1wbGUsXG5cdCAqIDxjb2RlPlwiXFxuXCIgb3IgXCJcXHJcIik8L2NvZGU+LCB0aGUgYm90dG9tIGlzIGFsc28gcmVzaXplZCB0byBmaXQgdGhlIG5leHRcblx0ICogbGluZSBvZiB0ZXh0LiBJZiA8Y29kZT53b3JkV3JhcDwvY29kZT4gaXMgYWxzbyBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sXG5cdCAqIG9ubHkgdGhlIGJvdHRvbSBvZiB0aGUgdGV4dCBmaWVsZCBpcyByZXNpemVkIGFuZCB0aGUgbGVmdCBzaWRlIHJlbWFpbnNcblx0ICogZml4ZWQuPC9wPlxuXHQgKlxuXHQgKiA8cD5JZiA8Y29kZT5hdXRvU2l6ZTwvY29kZT4gaXMgc2V0IHRvXG5cdCAqIDxjb2RlPlRleHRGaWVsZEF1dG9TaXplLkNFTlRFUjwvY29kZT4sIHRoZSB0ZXh0IGlzIHRyZWF0ZWQgYXNcblx0ICogY2VudGVyLWp1c3RpZmllZCB0ZXh0LCBtZWFuaW5nIHRoYXQgYW55IHJlc2l6aW5nIG9mIGEgc2luZ2xlIGxpbmUgb2YgdGhlXG5cdCAqIHRleHQgZmllbGQgaXMgZXF1YWxseSBkaXN0cmlidXRlZCB0byBib3RoIHRoZSByaWdodCBhbmQgbGVmdCBtYXJnaW5zLiBJZlxuXHQgKiB0aGUgdGV4dCBpbmNsdWRlcyBhIGxpbmUgYnJlYWsoZm9yIGV4YW1wbGUsIDxjb2RlPlwiXFxuXCI8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlwiXFxyXCI8L2NvZGU+KSwgdGhlIGJvdHRvbSBpcyBhbHNvIHJlc2l6ZWQgdG8gZml0IHRoZSBuZXh0IGxpbmUgb2Zcblx0ICogdGV4dC4gSWYgPGNvZGU+d29yZFdyYXA8L2NvZGU+IGlzIGFsc28gc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBvbmx5IHRoZVxuXHQgKiBib3R0b20gb2YgdGhlIHRleHQgZmllbGQgaXMgcmVzaXplZCBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0IHNpZGVzIHJlbWFpblxuXHQgKiBmaXhlZC48L3A+XG5cdCAqIFxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgVGhlIDxjb2RlPmF1dG9TaXplPC9jb2RlPiBzcGVjaWZpZWQgaXMgbm90IGEgbWVtYmVyXG5cdCAqICAgICAgICAgICAgICAgICAgICAgICBvZiBmbGFzaC50ZXh0LlRleHRGaWVsZEF1dG9TaXplLlxuXHQgKi9cblx0cHVibGljIGF1dG9TaXplOlRleHRGaWVsZEF1dG9TaXplO1xuXG5cdC8qKlxuXHQgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgdGV4dCBmaWVsZCBoYXMgYSBiYWNrZ3JvdW5kIGZpbGwuIElmXG5cdCAqIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgdGV4dCBmaWVsZCBoYXMgYSBiYWNrZ3JvdW5kIGZpbGwuIElmXG5cdCAqIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIHRleHQgZmllbGQgaGFzIG5vIGJhY2tncm91bmQgZmlsbC4gVXNlIHRoZVxuXHQgKiA8Y29kZT5iYWNrZ3JvdW5kQ29sb3I8L2NvZGU+IHByb3BlcnR5IHRvIHNldCB0aGUgYmFja2dyb3VuZCBjb2xvciBvZiBhXG5cdCAqIHRleHQgZmllbGQuXG5cdCAqIFxuXHQgKiBAZGVmYXVsdCBmYWxzZVxuXHQgKi9cblx0cHVibGljIGJhY2tncm91bmQ6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogVGhlIGNvbG9yIG9mIHRoZSB0ZXh0IGZpZWxkIGJhY2tncm91bmQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzXG5cdCAqIDxjb2RlPjB4RkZGRkZGPC9jb2RlPih3aGl0ZSkuIFRoaXMgcHJvcGVydHkgY2FuIGJlIHJldHJpZXZlZCBvciBzZXQsIGV2ZW5cblx0ICogaWYgdGhlcmUgY3VycmVudGx5IGlzIG5vIGJhY2tncm91bmQsIGJ1dCB0aGUgY29sb3IgaXMgdmlzaWJsZSBvbmx5IGlmIHRoZVxuXHQgKiB0ZXh0IGZpZWxkIGhhcyB0aGUgPGNvZGU+YmFja2dyb3VuZDwvY29kZT4gcHJvcGVydHkgc2V0IHRvXG5cdCAqIDxjb2RlPnRydWU8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGJhY2tncm91bmRDb2xvcjpudW1iZXIgLyppbnQqLztcblxuXHQvKipcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIHRleHQgZmllbGQgaGFzIGEgYm9yZGVyLiBJZiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlXG5cdCAqIHRleHQgZmllbGQgaGFzIGEgYm9yZGVyLiBJZiA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSB0ZXh0IGZpZWxkIGhhcyBub1xuXHQgKiBib3JkZXIuIFVzZSB0aGUgPGNvZGU+Ym9yZGVyQ29sb3I8L2NvZGU+IHByb3BlcnR5IHRvIHNldCB0aGUgYm9yZGVyIGNvbG9yLlxuXHQgKiBcblx0ICogQGRlZmF1bHQgZmFsc2Vcblx0ICovXG5cdHB1YmxpYyBib3JkZXI6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogVGhlIGNvbG9yIG9mIHRoZSB0ZXh0IGZpZWxkIGJvcmRlci4gVGhlIGRlZmF1bHQgdmFsdWUgaXNcblx0ICogPGNvZGU+MHgwMDAwMDA8L2NvZGU+KGJsYWNrKS4gVGhpcyBwcm9wZXJ0eSBjYW4gYmUgcmV0cmlldmVkIG9yIHNldCwgZXZlblxuXHQgKiBpZiB0aGVyZSBjdXJyZW50bHkgaXMgbm8gYm9yZGVyLCBidXQgdGhlIGNvbG9yIGlzIHZpc2libGUgb25seSBpZiB0aGUgdGV4dFxuXHQgKiBmaWVsZCBoYXMgdGhlIDxjb2RlPmJvcmRlcjwvY29kZT4gcHJvcGVydHkgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGJvcmRlckNvbG9yOm51bWJlciAvKmludCovO1xuXG5cdC8qKlxuXHQgKiBBbiBpbnRlZ2VyKDEtYmFzZWQgaW5kZXgpIHRoYXQgaW5kaWNhdGVzIHRoZSBib3R0b21tb3N0IGxpbmUgdGhhdCBpc1xuXHQgKiBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgc3BlY2lmaWVkIHRleHQgZmllbGQuIFRoaW5rIG9mIHRoZSB0ZXh0IGZpZWxkIGFzXG5cdCAqIGEgd2luZG93IG9udG8gYSBibG9jayBvZiB0ZXh0LiBUaGUgPGNvZGU+c2Nyb2xsVjwvY29kZT4gcHJvcGVydHkgaXMgdGhlXG5cdCAqIDEtYmFzZWQgaW5kZXggb2YgdGhlIHRvcG1vc3QgdmlzaWJsZSBsaW5lIGluIHRoZSB3aW5kb3cuXG5cdCAqXG5cdCAqIDxwPkFsbCB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBsaW5lcyBpbmRpY2F0ZWQgYnkgPGNvZGU+c2Nyb2xsVjwvY29kZT4gYW5kXG5cdCAqIDxjb2RlPmJvdHRvbVNjcm9sbFY8L2NvZGU+IGlzIGN1cnJlbnRseSB2aXNpYmxlIGluIHRoZSB0ZXh0IGZpZWxkLjwvcD5cblx0ICovXG5cdHB1YmxpYyBnZXQgYm90dG9tU2Nyb2xsVigpOm51bWJlciAvKmludCovXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYm90dG9tU2Nyb2xsVjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgaW5kZXggb2YgdGhlIGluc2VydGlvbiBwb2ludChjYXJldCkgcG9zaXRpb24uIElmIG5vIGluc2VydGlvbiBwb2ludFxuXHQgKiBpcyBkaXNwbGF5ZWQsIHRoZSB2YWx1ZSBpcyB0aGUgcG9zaXRpb24gdGhlIGluc2VydGlvbiBwb2ludCB3b3VsZCBiZSBpZlxuXHQgKiB5b3UgcmVzdG9yZWQgZm9jdXMgdG8gdGhlIGZpZWxkKHR5cGljYWxseSB3aGVyZSB0aGUgaW5zZXJ0aW9uIHBvaW50IGxhc3Rcblx0ICogd2FzLCBvciAwIGlmIHRoZSBmaWVsZCBoYXMgbm90IGhhZCBmb2N1cykuXG5cdCAqXG5cdCAqIDxwPlNlbGVjdGlvbiBzcGFuIGluZGV4ZXMgYXJlIHplcm8tYmFzZWQoZm9yIGV4YW1wbGUsIHRoZSBmaXJzdCBwb3NpdGlvblxuXHQgKiBpcyAwLCB0aGUgc2Vjb25kIHBvc2l0aW9uIGlzIDEsIGFuZCBzbyBvbikuPC9wPlxuXHQgKi9cblx0cHVibGljIGdldCBjYXJldEluZGV4KCk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9jYXJldEluZGV4O1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgQm9vbGVhbiB2YWx1ZSB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIGV4dHJhIHdoaXRlIHNwYWNlKHNwYWNlcywgbGluZVxuXHQgKiBicmVha3MsIGFuZCBzbyBvbikgaW4gYSB0ZXh0IGZpZWxkIHdpdGggSFRNTCB0ZXh0IGlzIHJlbW92ZWQuIFRoZSBkZWZhdWx0XG5cdCAqIHZhbHVlIGlzIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhlIDxjb2RlPmNvbmRlbnNlV2hpdGU8L2NvZGU+IHByb3BlcnR5IG9ubHlcblx0ICogYWZmZWN0cyB0ZXh0IHNldCB3aXRoIHRoZSA8Y29kZT5odG1sVGV4dDwvY29kZT4gcHJvcGVydHksIG5vdCB0aGVcblx0ICogPGNvZGU+dGV4dDwvY29kZT4gcHJvcGVydHkuIElmIHlvdSBzZXQgdGV4dCB3aXRoIHRoZSA8Y29kZT50ZXh0PC9jb2RlPlxuXHQgKiBwcm9wZXJ0eSwgPGNvZGU+Y29uZGVuc2VXaGl0ZTwvY29kZT4gaXMgaWdub3JlZC5cblx0ICpcblx0ICogPHA+SWYgPGNvZGU+Y29uZGVuc2VXaGl0ZTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB1c2Ugc3RhbmRhcmRcblx0ICogSFRNTCBjb21tYW5kcyBzdWNoIGFzIDxjb2RlPjxCUj48L2NvZGU+IGFuZCA8Y29kZT48UD48L2NvZGU+IHRvIHBsYWNlIGxpbmVcblx0ICogYnJlYWtzIGluIHRoZSB0ZXh0IGZpZWxkLjwvcD5cblx0ICpcblx0ICogPHA+U2V0IHRoZSA8Y29kZT5jb25kZW5zZVdoaXRlPC9jb2RlPiBwcm9wZXJ0eSBiZWZvcmUgc2V0dGluZyB0aGVcblx0ICogPGNvZGU+aHRtbFRleHQ8L2NvZGU+IHByb3BlcnR5LjwvcD5cblx0ICovXG5cdHB1YmxpYyBjb25kZW5zZVdoaXRlOmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB0aGUgZm9ybWF0IGFwcGxpZWQgdG8gbmV3bHkgaW5zZXJ0ZWQgdGV4dCwgc3VjaCBhcyB0ZXh0IGVudGVyZWRcblx0ICogYnkgYSB1c2VyIG9yIHRleHQgaW5zZXJ0ZWQgd2l0aCB0aGUgPGNvZGU+cmVwbGFjZVNlbGVjdGVkVGV4dCgpPC9jb2RlPlxuXHQgKiBtZXRob2QuXG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU6PC9iPiBXaGVuIHNlbGVjdGluZyBjaGFyYWN0ZXJzIHRvIGJlIHJlcGxhY2VkIHdpdGhcblx0ICogPGNvZGU+c2V0U2VsZWN0aW9uKCk8L2NvZGU+IGFuZCA8Y29kZT5yZXBsYWNlU2VsZWN0ZWRUZXh0KCk8L2NvZGU+LCB0aGVcblx0ICogPGNvZGU+ZGVmYXVsdFRleHRGb3JtYXQ8L2NvZGU+IHdpbGwgYmUgYXBwbGllZCBvbmx5IGlmIHRoZSB0ZXh0IGhhcyBiZWVuXG5cdCAqIHNlbGVjdGVkIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGxhc3QgY2hhcmFjdGVyLiBIZXJlIGlzIGFuIGV4YW1wbGU6PC9wPlxuXHQgKiA8cHJlIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+IHB1YmxpYyBteV90eHQ6VGV4dEZpZWxkIG5ldyBUZXh0RmllbGQoKTtcblx0ICogbXlfdHh0LnRleHQgPSBcIkZsYXNoIE1hY2ludG9zaCB2ZXJzaW9uXCI7IHB1YmxpYyBteV9mbXQ6VGV4dEZvcm1hdCA9IG5ld1xuXHQgKiBUZXh0Rm9ybWF0KCk7IG15X2ZtdC5jb2xvciA9IDB4RkYwMDAwOyBteV90eHQuZGVmYXVsdFRleHRGb3JtYXQgPSBteV9mbXQ7XG5cdCAqIG15X3R4dC5zZXRTZWxlY3Rpb24oNiwxNSk7IC8vIHBhcnRpYWwgdGV4dCBzZWxlY3RlZCAtIGRlZmF1bHRUZXh0Rm9ybWF0XG5cdCAqIG5vdCBhcHBsaWVkIG15X3R4dC5zZXRTZWxlY3Rpb24oNiwyMyk7IC8vIHRleHQgc2VsZWN0ZWQgdG8gZW5kIC1cblx0ICogZGVmYXVsdFRleHRGb3JtYXQgYXBwbGllZCBteV90eHQucmVwbGFjZVNlbGVjdGVkVGV4dChcIldpbmRvd3MgdmVyc2lvblwiKTtcblx0ICogPC9wcmU+XG5cdCAqXG5cdCAqIDxwPldoZW4geW91IGFjY2VzcyB0aGUgPGNvZGU+ZGVmYXVsdFRleHRGb3JtYXQ8L2NvZGU+IHByb3BlcnR5LCB0aGVcblx0ICogcmV0dXJuZWQgVGV4dEZvcm1hdCBvYmplY3QgaGFzIGFsbCBvZiBpdHMgcHJvcGVydGllcyBkZWZpbmVkLiBObyBwcm9wZXJ0eVxuXHQgKiBpcyA8Y29kZT5udWxsPC9jb2RlPi48L3A+XG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU6PC9iPiBZb3UgY2FuJ3Qgc2V0IHRoaXMgcHJvcGVydHkgaWYgYSBzdHlsZSBzaGVldCBpcyBhcHBsaWVkIHRvXG5cdCAqIHRoZSB0ZXh0IGZpZWxkLjwvcD5cblx0ICogXG5cdCAqIEB0aHJvd3MgRXJyb3IgVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgb24gYSB0ZXh0IGZpZWxkIHdpdGggYSBzdHlsZVxuXHQgKiAgICAgICAgICAgICAgIHNoZWV0LlxuXHQgKi9cblx0cHVibGljIGRlZmF1bHRUZXh0Rm9ybWF0OlRleHRGb3JtYXQ7XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSB0ZXh0IGZpZWxkIGlzIGEgcGFzc3dvcmQgdGV4dCBmaWVsZC4gSWYgdGhlIHZhbHVlIG9mXG5cdCAqIHRoaXMgcHJvcGVydHkgaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB0ZXh0IGZpZWxkIGlzIHRyZWF0ZWQgYXMgYVxuXHQgKiBwYXNzd29yZCB0ZXh0IGZpZWxkIGFuZCBoaWRlcyB0aGUgaW5wdXQgY2hhcmFjdGVycyB1c2luZyBhc3Rlcmlza3MgaW5zdGVhZFxuXHQgKiBvZiB0aGUgYWN0dWFsIGNoYXJhY3RlcnMuIElmIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIHRleHQgZmllbGQgaXMgbm90XG5cdCAqIHRyZWF0ZWQgYXMgYSBwYXNzd29yZCB0ZXh0IGZpZWxkLiBXaGVuIHBhc3N3b3JkIG1vZGUgaXMgZW5hYmxlZCwgdGhlIEN1dFxuXHQgKiBhbmQgQ29weSBjb21tYW5kcyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBrZXlib2FyZCBzaG9ydGN1dHMgd2lsbCBub3Rcblx0ICogZnVuY3Rpb24uIFRoaXMgc2VjdXJpdHkgbWVjaGFuaXNtIHByZXZlbnRzIGFuIHVuc2NydXB1bG91cyB1c2VyIGZyb20gdXNpbmdcblx0ICogdGhlIHNob3J0Y3V0cyB0byBkaXNjb3ZlciBhIHBhc3N3b3JkIG9uIGFuIHVuYXR0ZW5kZWQgY29tcHV0ZXIuXG5cdCAqIFxuXHQgKiBAZGVmYXVsdCBmYWxzZVxuXHQgKi9cblx0cHVibGljIGRpc3BsYXlBc1Bhc3N3b3JkOmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIHJlbmRlciBieSB1c2luZyBlbWJlZGRlZCBmb250IG91dGxpbmVzLiBJZlxuXHQgKiA8Y29kZT5mYWxzZTwvY29kZT4sIEZsYXNoIFBsYXllciByZW5kZXJzIHRoZSB0ZXh0IGZpZWxkIGJ5IHVzaW5nIGRldmljZVxuXHQgKiBmb250cy5cblx0ICpcblx0ICogPHA+SWYgeW91IHNldCB0aGUgPGNvZGU+ZW1iZWRGb250czwvY29kZT4gcHJvcGVydHkgdG8gPGNvZGU+dHJ1ZTwvY29kZT5cblx0ICogZm9yIGEgdGV4dCBmaWVsZCwgeW91IG11c3Qgc3BlY2lmeSBhIGZvbnQgZm9yIHRoYXQgdGV4dCBieSB1c2luZyB0aGVcblx0ICogPGNvZGU+Zm9udDwvY29kZT4gcHJvcGVydHkgb2YgYSBUZXh0Rm9ybWF0IG9iamVjdCBhcHBsaWVkIHRvIHRoZSB0ZXh0XG5cdCAqIGZpZWxkLiBJZiB0aGUgc3BlY2lmaWVkIGZvbnQgaXMgbm90IGVtYmVkZGVkIGluIHRoZSBTV0YgZmlsZSwgdGhlIHRleHQgaXNcblx0ICogbm90IGRpc3BsYXllZC48L3A+XG5cdCAqIFxuXHQgKiBAZGVmYXVsdCBmYWxzZVxuXHQgKi9cblx0cHVibGljIGVtYmVkRm9udHM6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgZ3JpZCBmaXR0aW5nIHVzZWQgZm9yIHRoaXMgdGV4dCBmaWVsZC4gVGhpcyBwcm9wZXJ0eSBhcHBsaWVzXG5cdCAqIG9ubHkgaWYgdGhlIDxjb2RlPmZsYXNoLnRleHQuQW50aUFsaWFzVHlwZTwvY29kZT4gcHJvcGVydHkgb2YgdGhlIHRleHRcblx0ICogZmllbGQgaXMgc2V0IHRvIDxjb2RlPmZsYXNoLnRleHQuQW50aUFsaWFzVHlwZS5BRFZBTkNFRDwvY29kZT4uXG5cdCAqXG5cdCAqIDxwPlRoZSB0eXBlIG9mIGdyaWQgZml0dGluZyB1c2VkIGRldGVybWluZXMgd2hldGhlciBGbGFzaCBQbGF5ZXIgZm9yY2VzXG5cdCAqIHN0cm9uZyBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBsaW5lcyB0byBmaXQgdG8gYSBwaXhlbCBvciBzdWJwaXhlbCBncmlkLFxuXHQgKiBvciBub3QgYXQgYWxsLjwvcD5cblx0ICpcblx0ICogPHA+Rm9yIHRoZSA8Y29kZT5mbGFzaC50ZXh0LkdyaWRGaXRUeXBlPC9jb2RlPiBwcm9wZXJ0eSwgeW91IGNhbiB1c2UgdGhlXG5cdCAqIGZvbGxvd2luZyBzdHJpbmcgdmFsdWVzOjwvcD5cblx0ICogXG5cdCAqIEBkZWZhdWx0IHBpeGVsXG5cdCAqL1xuXHRwdWJsaWMgZ3JpZEZpdFR5cGU6R3JpZEZpdFR5cGU7XG5cblx0LyoqXG5cdCAqIENvbnRhaW5zIHRoZSBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXh0IGZpZWxkIGNvbnRlbnRzLlxuXHQgKlxuXHQgKiA8cD5GbGFzaCBQbGF5ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBIVE1MIHRhZ3M6PC9wPlxuXHQgKlxuXHQgKiA8cD5GbGFzaCBQbGF5ZXIgYW5kIEFJUiBhbHNvIHN1cHBvcnQgZXhwbGljaXQgY2hhcmFjdGVyIGNvZGVzLCBzdWNoIGFzXG5cdCAqICYjMzg7KEFTQ0lJIGFtcGVyc2FuZCkgYW5kICYjeDIwQUM7KFVuaWNvZGUg4oKsIHN5bWJvbCkuIDwvcD5cblx0ICovXG5cdHB1YmxpYyBodG1sVGV4dDpzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiBhIHRleHQgZmllbGQuIEEgY2hhcmFjdGVyIHN1Y2ggYXMgdGFiXG5cdCAqICg8Y29kZT5cXHQ8L2NvZGU+KSBjb3VudHMgYXMgb25lIGNoYXJhY3Rlci5cblx0ICovXG5cdHB1YmxpYyBnZXQgbGVuZ3RoKCk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9sZW5ndGg7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdGhhdCB0aGUgdGV4dCBmaWVsZCBjYW4gY29udGFpbiwgYXNcblx0ICogZW50ZXJlZCBieSBhIHVzZXIuIEEgc2NyaXB0IGNhbiBpbnNlcnQgbW9yZSB0ZXh0IHRoYW5cblx0ICogPGNvZGU+bWF4Q2hhcnM8L2NvZGU+IGFsbG93czsgdGhlIDxjb2RlPm1heENoYXJzPC9jb2RlPiBwcm9wZXJ0eSBpbmRpY2F0ZXNcblx0ICogb25seSBob3cgbXVjaCB0ZXh0IGEgdXNlciBjYW4gZW50ZXIuIElmIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IGlzXG5cdCAqIDxjb2RlPjA8L2NvZGU+LCBhIHVzZXIgY2FuIGVudGVyIGFuIHVubGltaXRlZCBhbW91bnQgb2YgdGV4dC5cblx0ICogXG5cdCAqIEBkZWZhdWx0IDBcblx0ICovXG5cdHB1YmxpYyBtYXhDaGFyczpudW1iZXIgLyppbnQqLztcblxuXHQvKipcblx0ICogVGhlIG1heGltdW0gdmFsdWUgb2YgPGNvZGU+c2Nyb2xsSDwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgbWF4U2Nyb2xsSCgpOm51bWJlciAvKmludCovXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWF4U2Nyb2xsSDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWF4aW11bSB2YWx1ZSBvZiA8Y29kZT5zY3JvbGxWPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBtYXhTY3JvbGxWKCk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9tYXhTY3JvbGxWO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgQm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIEZsYXNoIFBsYXllciBhdXRvbWF0aWNhbGx5IHNjcm9sbHNcblx0ICogbXVsdGlsaW5lIHRleHQgZmllbGRzIHdoZW4gdGhlIHVzZXIgY2xpY2tzIGEgdGV4dCBmaWVsZCBhbmQgcm9sbHMgdGhlXG5cdCAqIG1vdXNlIHdoZWVsLiBCeSBkZWZhdWx0LCB0aGlzIHZhbHVlIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBUaGlzIHByb3BlcnR5IGlzXG5cdCAqIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IG1vdXNlIHdoZWVsIHNjcm9sbGluZyBvZiB0ZXh0IGZpZWxkcywgb3Jcblx0ICogaW1wbGVtZW50IHlvdXIgb3duIHRleHQgZmllbGQgc2Nyb2xsaW5nLlxuXHQgKi9cblx0cHVibGljIG1vdXNlV2hlZWxFbmFibGVkOmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIGZpZWxkIGlzIGEgbXVsdGlsaW5lIHRleHQgZmllbGQuIElmIHRoZSB2YWx1ZSBpc1xuXHQgKiA8Y29kZT50cnVlPC9jb2RlPiwgdGhlIHRleHQgZmllbGQgaXMgbXVsdGlsaW5lOyBpZiB0aGUgdmFsdWUgaXNcblx0ICogPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgdGV4dCBmaWVsZCBpcyBhIHNpbmdsZS1saW5lIHRleHQgZmllbGQuIEluIGEgZmllbGRcblx0ICogb2YgdHlwZSA8Y29kZT5UZXh0RmllbGRUeXBlLklOUFVUPC9jb2RlPiwgdGhlIDxjb2RlPm11bHRpbGluZTwvY29kZT4gdmFsdWVcblx0ICogZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSA8Y29kZT5FbnRlcjwvY29kZT4ga2V5IGNyZWF0ZXMgYSBuZXcgbGluZShhIHZhbHVlXG5cdCAqIG9mIDxjb2RlPmZhbHNlPC9jb2RlPiwgYW5kIHRoZSA8Y29kZT5FbnRlcjwvY29kZT4ga2V5IGlzIGlnbm9yZWQpLiBJZiB5b3Vcblx0ICogcGFzdGUgdGV4dCBpbnRvIGEgPGNvZGU+VGV4dEZpZWxkPC9jb2RlPiB3aXRoIGEgPGNvZGU+bXVsdGlsaW5lPC9jb2RlPlxuXHQgKiB2YWx1ZSBvZiA8Y29kZT5mYWxzZTwvY29kZT4sIG5ld2xpbmVzIGFyZSBzdHJpcHBlZCBvdXQgb2YgdGhlIHRleHQuXG5cdCAqIFxuXHQgKiBAZGVmYXVsdCBmYWxzZVxuXHQgKi9cblx0cHVibGljIG11bHRpbGluZTpib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgdGV4dCBsaW5lcyBpbiBhIG11bHRpbGluZSB0ZXh0IGZpZWxkLiBJZlxuXHQgKiA8Y29kZT53b3JkV3JhcDwvY29kZT4gcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgbnVtYmVyIG9mXG5cdCAqIGxpbmVzIGluY3JlYXNlcyB3aGVuIHRleHQgd3JhcHMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG51bUxpbmVzKCk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9udW1MaW5lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgdGhlIHNldCBvZiBjaGFyYWN0ZXJzIHRoYXQgYSB1c2VyIGNhbiBlbnRlciBpbnRvIHRoZSB0ZXh0IGZpZWxkLlxuXHQgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnJlc3RyaWN0PC9jb2RlPiBwcm9wZXJ0eSBpcyA8Y29kZT5udWxsPC9jb2RlPixcblx0ICogeW91IGNhbiBlbnRlciBhbnkgY2hhcmFjdGVyLiBJZiB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnJlc3RyaWN0PC9jb2RlPlxuXHQgKiBwcm9wZXJ0eSBpcyBhbiBlbXB0eSBzdHJpbmcsIHlvdSBjYW5ub3QgZW50ZXIgYW55IGNoYXJhY3Rlci4gSWYgdGhlIHZhbHVlXG5cdCAqIG9mIHRoZSA8Y29kZT5yZXN0cmljdDwvY29kZT4gcHJvcGVydHkgaXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycywgeW91IGNhblxuXHQgKiBlbnRlciBvbmx5IGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBpbnRvIHRoZSB0ZXh0IGZpZWxkLiBUaGUgc3RyaW5nIGlzXG5cdCAqIHNjYW5uZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LiBZb3UgY2FuIHNwZWNpZnkgYSByYW5nZSBieSB1c2luZyB0aGUgaHlwaGVuXG5cdCAqICgtKSBjaGFyYWN0ZXIuIE9ubHkgdXNlciBpbnRlcmFjdGlvbiBpcyByZXN0cmljdGVkOyBhIHNjcmlwdCBjYW4gcHV0IGFueVxuXHQgKiB0ZXh0IGludG8gdGhlIHRleHQgZmllbGQuIDxwaCBvdXRwdXRjbGFzcz1cImZsYXNob25seVwiPlRoaXMgcHJvcGVydHkgZG9lc1xuXHQgKiBub3Qgc3luY2hyb25pemUgd2l0aCB0aGUgRW1iZWQgZm9udCBvcHRpb25zIGluIHRoZSBQcm9wZXJ0eSBpbnNwZWN0b3IuXG5cdCAqXG5cdCAqIDxwPklmIHRoZSBzdHJpbmcgYmVnaW5zIHdpdGggYSBjYXJldCheKSBjaGFyYWN0ZXIsIGFsbCBjaGFyYWN0ZXJzIGFyZVxuXHQgKiBpbml0aWFsbHkgYWNjZXB0ZWQgYW5kIHN1Y2NlZWRpbmcgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBleGNsdWRlZFxuXHQgKiBmcm9tIHRoZSBzZXQgb2YgYWNjZXB0ZWQgY2hhcmFjdGVycy4gSWYgdGhlIHN0cmluZyBkb2VzIG5vdCBiZWdpbiB3aXRoIGFcblx0ICogY2FyZXQoXikgY2hhcmFjdGVyLCBubyBjaGFyYWN0ZXJzIGFyZSBpbml0aWFsbHkgYWNjZXB0ZWQgYW5kIHN1Y2NlZWRpbmdcblx0ICogY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBpbmNsdWRlZCBpbiB0aGUgc2V0IG9mIGFjY2VwdGVkXG5cdCAqIGNoYXJhY3RlcnMuPC9wPlxuXHQgKlxuXHQgKiA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgYWxsb3dzIG9ubHkgdXBwZXJjYXNlIGNoYXJhY3RlcnMsIHNwYWNlcywgYW5kXG5cdCAqIG51bWJlcnMgdG8gYmUgZW50ZXJlZCBpbnRvIGEgdGV4dCBmaWVsZDo8L3A+XG5cdCAqIDxwcmUgeG1sOnNwYWNlPVwicHJlc2VydmVcIj4gbXlfdHh0LnJlc3RyaWN0ID0gXCJBLVogMC05XCI7IDwvcHJlPlxuXHQgKlxuXHQgKiA8cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgaW5jbHVkZXMgYWxsIGNoYXJhY3RlcnMsIGJ1dCBleGNsdWRlcyBsb3dlcmNhc2Vcblx0ICogbGV0dGVyczo8L3A+XG5cdCAqIDxwcmUgeG1sOnNwYWNlPVwicHJlc2VydmVcIj4gbXlfdHh0LnJlc3RyaWN0ID0gXCJeYS16XCI7IDwvcHJlPlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIHVzZSBhIGJhY2tzbGFzaCB0byBlbnRlciBhIF4gb3IgLSB2ZXJiYXRpbS4gVGhlIGFjY2VwdGVkXG5cdCAqIGJhY2tzbGFzaCBzZXF1ZW5jZXMgYXJlIFxcLSwgXFxeIG9yIFxcXFwuIFRoZSBiYWNrc2xhc2ggbXVzdCBiZSBhbiBhY3R1YWxcblx0ICogY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcsIHNvIHdoZW4gc3BlY2lmaWVkIGluIEFjdGlvblNjcmlwdCwgYSBkb3VibGVcblx0ICogYmFja3NsYXNoIG11c3QgYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSBpbmNsdWRlcyBvbmx5IHRoZVxuXHQgKiBkYXNoKC0pIGFuZCBjYXJldCheKTo8L3A+XG5cdCAqIDxwcmUgeG1sOnNwYWNlPVwicHJlc2VydmVcIj4gbXlfdHh0LnJlc3RyaWN0ID0gXCJcXFxcLVxcXFxeXCI7IDwvcHJlPlxuXHQgKlxuXHQgKiA8cD5UaGUgXiBjYW4gYmUgdXNlZCBhbnl3aGVyZSBpbiB0aGUgc3RyaW5nIHRvIHRvZ2dsZSBiZXR3ZWVuIGluY2x1ZGluZ1xuXHQgKiBjaGFyYWN0ZXJzIGFuZCBleGNsdWRpbmcgY2hhcmFjdGVycy4gVGhlIGZvbGxvd2luZyBjb2RlIGluY2x1ZGVzIG9ubHlcblx0ICogdXBwZXJjYXNlIGxldHRlcnMsIGJ1dCBleGNsdWRlcyB0aGUgdXBwZXJjYXNlIGxldHRlciBROjwvcD5cblx0ICogPHByZSB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPiBteV90eHQucmVzdHJpY3QgPSBcIkEtWl5RXCI7IDwvcHJlPlxuXHQgKlxuXHQgKiA8cD5Zb3UgY2FuIHVzZSB0aGUgPGNvZGU+XFx1PC9jb2RlPiBlc2NhcGUgc2VxdWVuY2UgdG8gY29uc3RydWN0XG5cdCAqIDxjb2RlPnJlc3RyaWN0PC9jb2RlPiBzdHJpbmdzLiBUaGUgZm9sbG93aW5nIGNvZGUgaW5jbHVkZXMgb25seSB0aGVcblx0ICogY2hhcmFjdGVycyBmcm9tIEFTQ0lJIDMyKHNwYWNlKSB0byBBU0NJSSAxMjYodGlsZGUpLjwvcD5cblx0ICogPHByZSB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiPiBteV90eHQucmVzdHJpY3QgPSBcIlxcdTAwMjAtXFx1MDA3RVwiOyA8L3ByZT5cblx0ICogXG5cdCAqIEBkZWZhdWx0IG51bGxcblx0ICovXG5cdHB1YmxpYyByZXN0cmljdDpzdHJpbmc7XG5cblx0LyoqXG5cdCAqIFRoZSBjdXJyZW50IGhvcml6b250YWwgc2Nyb2xsaW5nIHBvc2l0aW9uLiBJZiB0aGUgPGNvZGU+c2Nyb2xsSDwvY29kZT5cblx0ICogcHJvcGVydHkgaXMgMCwgdGhlIHRleHQgaXMgbm90IGhvcml6b250YWxseSBzY3JvbGxlZC4gVGhpcyBwcm9wZXJ0eSB2YWx1ZVxuXHQgKiBpcyBhbiBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbiBpbiBwaXhlbHMuXG5cdCAqXG5cdCAqIDxwPlRoZSB1bml0cyBvZiBob3Jpem9udGFsIHNjcm9sbGluZyBhcmUgcGl4ZWxzLCB3aGVyZWFzIHRoZSB1bml0cyBvZlxuXHQgKiB2ZXJ0aWNhbCBzY3JvbGxpbmcgYXJlIGxpbmVzLiBIb3Jpem9udGFsIHNjcm9sbGluZyBpcyBtZWFzdXJlZCBpbiBwaXhlbHNcblx0ICogYmVjYXVzZSBtb3N0IGZvbnRzIHlvdSB0eXBpY2FsbHkgdXNlIGFyZSBwcm9wb3J0aW9uYWxseSBzcGFjZWQ7IHRoYXQgaXMsXG5cdCAqIHRoZSBjaGFyYWN0ZXJzIGNhbiBoYXZlIGRpZmZlcmVudCB3aWR0aHMuIEZsYXNoIFBsYXllciBwZXJmb3JtcyB2ZXJ0aWNhbFxuXHQgKiBzY3JvbGxpbmcgYnkgbGluZSBiZWNhdXNlIHVzZXJzIHVzdWFsbHkgd2FudCB0byBzZWUgYSBjb21wbGV0ZSBsaW5lIG9mXG5cdCAqIHRleHQgcmF0aGVyIHRoYW4gYSBwYXJ0aWFsIGxpbmUuIEV2ZW4gaWYgYSBsaW5lIHVzZXMgbXVsdGlwbGUgZm9udHMsIHRoZVxuXHQgKiBoZWlnaHQgb2YgdGhlIGxpbmUgYWRqdXN0cyB0byBmaXQgdGhlIGxhcmdlc3QgZm9udCBpbiB1c2UuPC9wPlxuXHQgKlxuXHQgKiA8cD48Yj5Ob3RlOiA8L2I+VGhlIDxjb2RlPnNjcm9sbEg8L2NvZGU+IHByb3BlcnR5IGlzIHplcm8tYmFzZWQsIG5vdFxuXHQgKiAxLWJhc2VkIGxpa2UgdGhlIDxjb2RlPnNjcm9sbFY8L2NvZGU+IHZlcnRpY2FsIHNjcm9sbGluZyBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgc2Nyb2xsSDpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSB2ZXJ0aWNhbCBwb3NpdGlvbiBvZiB0ZXh0IGluIGEgdGV4dCBmaWVsZC4gVGhlIDxjb2RlPnNjcm9sbFY8L2NvZGU+XG5cdCAqIHByb3BlcnR5IGlzIHVzZWZ1bCBmb3IgZGlyZWN0aW5nIHVzZXJzIHRvIGEgc3BlY2lmaWMgcGFyYWdyYXBoIGluIGEgbG9uZ1xuXHQgKiBwYXNzYWdlLCBvciBjcmVhdGluZyBzY3JvbGxpbmcgdGV4dCBmaWVsZHMuXG5cdCAqXG5cdCAqIDxwPlRoZSB1bml0cyBvZiB2ZXJ0aWNhbCBzY3JvbGxpbmcgYXJlIGxpbmVzLCB3aGVyZWFzIHRoZSB1bml0cyBvZlxuXHQgKiBob3Jpem9udGFsIHNjcm9sbGluZyBhcmUgcGl4ZWxzLiBJZiB0aGUgZmlyc3QgbGluZSBkaXNwbGF5ZWQgaXMgdGhlIGZpcnN0XG5cdCAqIGxpbmUgaW4gdGhlIHRleHQgZmllbGQsIHNjcm9sbFYgaXMgc2V0IHRvIDEobm90IDApLiBIb3Jpem9udGFsIHNjcm9sbGluZ1xuXHQgKiBpcyBtZWFzdXJlZCBpbiBwaXhlbHMgYmVjYXVzZSBtb3N0IGZvbnRzIGFyZSBwcm9wb3J0aW9uYWxseSBzcGFjZWQ7IHRoYXRcblx0ICogaXMsIHRoZSBjaGFyYWN0ZXJzIGNhbiBoYXZlIGRpZmZlcmVudCB3aWR0aHMuIEZsYXNoIHBlcmZvcm1zIHZlcnRpY2FsXG5cdCAqIHNjcm9sbGluZyBieSBsaW5lIGJlY2F1c2UgdXNlcnMgdXN1YWxseSB3YW50IHRvIHNlZSBhIGNvbXBsZXRlIGxpbmUgb2Zcblx0ICogdGV4dCByYXRoZXIgdGhhbiBhIHBhcnRpYWwgbGluZS4gRXZlbiBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZm9udHMgb24gYVxuXHQgKiBsaW5lLCB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIGFkanVzdHMgdG8gZml0IHRoZSBsYXJnZXN0IGZvbnQgaW4gdXNlLjwvcD5cblx0ICovXG5cdHB1YmxpYyBzY3JvbGxWOm51bWJlcjtcblxuXHQvKipcblx0ICogQSBCb29sZWFuIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRleHQgZmllbGQgaXMgc2VsZWN0YWJsZS4gVGhlXG5cdCAqIHZhbHVlIDxjb2RlPnRydWU8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZSB0ZXh0IGlzIHNlbGVjdGFibGUuIFRoZVxuXHQgKiA8Y29kZT5zZWxlY3RhYmxlPC9jb2RlPiBwcm9wZXJ0eSBjb250cm9scyB3aGV0aGVyIGEgdGV4dCBmaWVsZCBpc1xuXHQgKiBzZWxlY3RhYmxlLCBub3Qgd2hldGhlciBhIHRleHQgZmllbGQgaXMgZWRpdGFibGUuIEEgZHluYW1pYyB0ZXh0IGZpZWxkIGNhblxuXHQgKiBiZSBzZWxlY3RhYmxlIGV2ZW4gaWYgaXQgaXMgbm90IGVkaXRhYmxlLiBJZiBhIGR5bmFtaWMgdGV4dCBmaWVsZCBpcyBub3Rcblx0ICogc2VsZWN0YWJsZSwgdGhlIHVzZXIgY2Fubm90IHNlbGVjdCBpdHMgdGV4dC5cblx0ICpcblx0ICogPHA+SWYgPGNvZGU+c2VsZWN0YWJsZTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgdGhlIHRleHQgaW5cblx0ICogdGhlIHRleHQgZmllbGQgZG9lcyBub3QgcmVzcG9uZCB0byBzZWxlY3Rpb24gY29tbWFuZHMgZnJvbSB0aGUgbW91c2Ugb3Jcblx0ICoga2V5Ym9hcmQsIGFuZCB0aGUgdGV4dCBjYW5ub3QgYmUgY29waWVkIHdpdGggdGhlIENvcHkgY29tbWFuZC4gSWZcblx0ICogPGNvZGU+c2VsZWN0YWJsZTwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgdGV4dCBpbiB0aGUgdGV4dFxuXHQgKiBmaWVsZCBjYW4gYmUgc2VsZWN0ZWQgd2l0aCB0aGUgbW91c2Ugb3Iga2V5Ym9hcmQsIGFuZCB0aGUgdGV4dCBjYW4gYmVcblx0ICogY29waWVkIHdpdGggdGhlIENvcHkgY29tbWFuZC4gWW91IGNhbiBzZWxlY3QgdGV4dCB0aGlzIHdheSBldmVuIGlmIHRoZVxuXHQgKiB0ZXh0IGZpZWxkIGlzIGEgZHluYW1pYyB0ZXh0IGZpZWxkIGluc3RlYWQgb2YgYW4gaW5wdXQgdGV4dCBmaWVsZC4gPC9wPlxuXHQgKiBcblx0ICogQGRlZmF1bHQgdHJ1ZVxuXHQgKi9cblx0cHVibGljIHNlbGVjdGFibGU6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogVGhlIHplcm8tYmFzZWQgY2hhcmFjdGVyIGluZGV4IHZhbHVlIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnRcblx0ICogc2VsZWN0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAwLCB0aGUgc2Vjb25kIGNoYXJhY3RlciBpc1xuXHQgKiAxLCBhbmQgc28gb24uIElmIG5vIHRleHQgaXMgc2VsZWN0ZWQsIHRoaXMgcHJvcGVydHkgaXMgdGhlIHZhbHVlIG9mXG5cdCAqIDxjb2RlPmNhcmV0SW5kZXg8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGdldCBzZWxlY3Rpb25CZWdpbkluZGV4KCk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9zZWxlY3Rpb25CZWdpbkluZGV4O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB6ZXJvLWJhc2VkIGNoYXJhY3RlciBpbmRleCB2YWx1ZSBvZiB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGN1cnJlbnRcblx0ICogc2VsZWN0aW9uLiBGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAwLCB0aGUgc2Vjb25kIGNoYXJhY3RlciBpc1xuXHQgKiAxLCBhbmQgc28gb24uIElmIG5vIHRleHQgaXMgc2VsZWN0ZWQsIHRoaXMgcHJvcGVydHkgaXMgdGhlIHZhbHVlIG9mXG5cdCAqIDxjb2RlPmNhcmV0SW5kZXg8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIGdldCBzZWxlY3Rpb25FbmRJbmRleCgpOm51bWJlciAvKmludCovXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0aW9uRW5kSW5kZXg7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHNoYXJwbmVzcyBvZiB0aGUgZ2x5cGggZWRnZXMgaW4gdGhpcyB0ZXh0IGZpZWxkLiBUaGlzIHByb3BlcnR5IGFwcGxpZXNcblx0ICogb25seSBpZiB0aGUgPGNvZGU+Zmxhc2gudGV4dC5BbnRpQWxpYXNUeXBlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgdGV4dFxuXHQgKiBmaWVsZCBpcyBzZXQgdG8gPGNvZGU+Zmxhc2gudGV4dC5BbnRpQWxpYXNUeXBlLkFEVkFOQ0VEPC9jb2RlPi4gVGhlIHJhbmdlXG5cdCAqIGZvciA8Y29kZT5zaGFycG5lc3M8L2NvZGU+IGlzIGEgbnVtYmVyIGZyb20gLTQwMCB0byA0MDAuIElmIHlvdSBhdHRlbXB0IHRvXG5cdCAqIHNldCA8Y29kZT5zaGFycG5lc3M8L2NvZGU+IHRvIGEgdmFsdWUgb3V0c2lkZSB0aGF0IHJhbmdlLCBGbGFzaCBzZXRzIHRoZVxuXHQgKiBwcm9wZXJ0eSB0byB0aGUgbmVhcmVzdCB2YWx1ZSBpbiB0aGUgcmFuZ2UoZWl0aGVyIC00MDAgb3IgNDAwKS5cblx0ICogXG5cdCAqIEBkZWZhdWx0IDBcblx0ICovXG5cdHB1YmxpYyBzaGFycG5lc3M6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBBdHRhY2hlcyBhIHN0eWxlIHNoZWV0IHRvIHRoZSB0ZXh0IGZpZWxkLiBGb3IgaW5mb3JtYXRpb24gb24gY3JlYXRpbmdcblx0ICogc3R5bGUgc2hlZXRzLCBzZWUgdGhlIFN0eWxlU2hlZXQgY2xhc3MgYW5kIHRoZSA8aT5BY3Rpb25TY3JpcHQgMy4wXG5cdCAqIERldmVsb3BlcidzIEd1aWRlPC9pPi5cblx0ICpcblx0ICogPHA+WW91IGNhbiBjaGFuZ2UgdGhlIHN0eWxlIHNoZWV0IGFzc29jaWF0ZWQgd2l0aCBhIHRleHQgZmllbGQgYXQgYW55XG5cdCAqIHRpbWUuIElmIHlvdSBjaGFuZ2UgdGhlIHN0eWxlIHNoZWV0IGluIHVzZSwgdGhlIHRleHQgZmllbGQgaXMgcmVkcmF3biB3aXRoXG5cdCAqIHRoZSBuZXcgc3R5bGUgc2hlZXQuIFlvdSBjYW4gc2V0IHRoZSBzdHlsZSBzaGVldCB0byA8Y29kZT5udWxsPC9jb2RlPiBvclxuXHQgKiA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IHRvIHJlbW92ZSB0aGUgc3R5bGUgc2hlZXQuIElmIHRoZSBzdHlsZSBzaGVldCBpblxuXHQgKiB1c2UgaXMgcmVtb3ZlZCwgdGhlIHRleHQgZmllbGQgaXMgcmVkcmF3biB3aXRob3V0IGEgc3R5bGUgc2hlZXQuIDwvcD5cblx0ICpcblx0ICogPHA+PGI+Tm90ZTo8L2I+IElmIHRoZSBzdHlsZSBzaGVldCBpcyByZW1vdmVkLCB0aGUgY29udGVudHMgb2YgYm90aFxuXHQgKiA8Y29kZT5UZXh0RmllbGQudGV4dDwvY29kZT4gYW5kIDxjb2RlPiBUZXh0RmllbGQuaHRtbFRleHQ8L2NvZGU+IGNoYW5nZSB0b1xuXHQgKiBpbmNvcnBvcmF0ZSB0aGUgZm9ybWF0dGluZyBwcmV2aW91c2x5IGFwcGxpZWQgYnkgdGhlIHN0eWxlIHNoZWV0LiBUb1xuXHQgKiBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgPGNvZGU+VGV4dEZpZWxkLmh0bWxUZXh0PC9jb2RlPiBjb250ZW50cyB3aXRob3V0IHRoZVxuXHQgKiBmb3JtYXR0aW5nLCBzYXZlIHRoZSB2YWx1ZSBpbiBhIHZhcmlhYmxlIGJlZm9yZSByZW1vdmluZyB0aGUgc3R5bGVcblx0ICogc2hlZXQuPC9wPlxuXHQgKi9cblx0cHVibGljIHN0eWxlU2hlZXQ6U3R5bGVTaGVldDtcblxuXHQvKipcblx0ICogQSBzdHJpbmcgdGhhdCBpcyB0aGUgY3VycmVudCB0ZXh0IGluIHRoZSB0ZXh0IGZpZWxkLiBMaW5lcyBhcmUgc2VwYXJhdGVkXG5cdCAqIGJ5IHRoZSBjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVyKDxjb2RlPidcXHInPC9jb2RlPiwgQVNDSUkgMTMpLiBUaGlzXG5cdCAqIHByb3BlcnR5IGNvbnRhaW5zIHVuZm9ybWF0dGVkIHRleHQgaW4gdGhlIHRleHQgZmllbGQsIHdpdGhvdXQgSFRNTCB0YWdzLlxuXHQgKlxuXHQgKiA8cD5UbyBnZXQgdGhlIHRleHQgaW4gSFRNTCBmb3JtLCB1c2UgdGhlIDxjb2RlPmh0bWxUZXh0PC9jb2RlPlxuXHQgKiBwcm9wZXJ0eS48L3A+XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHRleHQoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiB0aGlzLl90ZXh0O1xuXHR9XG5cblx0cHVibGljIHNldCB0ZXh0KHZhbHVlOnN0cmluZylcblx0e1xuXHRcdGlmICh0aGlzLl90ZXh0ID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fdGV4dCA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBjb2xvciBvZiB0aGUgdGV4dCBpbiBhIHRleHQgZmllbGQsIGluIGhleGFkZWNpbWFsIGZvcm1hdC4gVGhlXG5cdCAqIGhleGFkZWNpbWFsIGNvbG9yIHN5c3RlbSB1c2VzIHNpeCBkaWdpdHMgdG8gcmVwcmVzZW50IGNvbG9yIHZhbHVlcy4gRWFjaFxuXHQgKiBkaWdpdCBoYXMgMTYgcG9zc2libGUgdmFsdWVzIG9yIGNoYXJhY3RlcnMuIFRoZSBjaGFyYWN0ZXJzIHJhbmdlIGZyb20gMC05XG5cdCAqIGFuZCB0aGVuIEEtRi4gRm9yIGV4YW1wbGUsIGJsYWNrIGlzIDxjb2RlPjB4MDAwMDAwPC9jb2RlPjsgd2hpdGUgaXNcblx0ICogPGNvZGU+MHhGRkZGRkY8L2NvZGU+LlxuXHQgKiBcblx0ICogQGRlZmF1bHQgMCgweDAwMDAwMClcblx0ICovXG5cdHB1YmxpYyB0ZXh0Q29sb3I6bnVtYmVyIC8qaW50Ki87XG5cblx0LyoqXG5cdCAqIFRoZSBoZWlnaHQgb2YgdGhlIHRleHQgaW4gcGl4ZWxzLlxuXHQgKi9cblx0cHVibGljIGdldCB0ZXh0SGVpZ2h0KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdGV4dEhlaWdodDtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgaW50ZXJhY3Rpb24gbW9kZSBwcm9wZXJ0eSwgRGVmYXVsdCB2YWx1ZSBpc1xuXHQgKiBUZXh0SW50ZXJhY3Rpb25Nb2RlLk5PUk1BTC4gT24gbW9iaWxlIHBsYXRmb3JtcywgdGhlIG5vcm1hbCBtb2RlIGltcGxpZXNcblx0ICogdGhhdCB0aGUgdGV4dCBjYW4gYmUgc2Nyb2xsZWQgYnV0IG5vdCBzZWxlY3RlZC4gT25lIGNhbiBzd2l0Y2ggdG8gdGhlXG5cdCAqIHNlbGVjdGFibGUgbW9kZSB0aHJvdWdoIHRoZSBpbi1idWlsdCBjb250ZXh0IG1lbnUgb24gdGhlIHRleHQgZmllbGQuIE9uXG5cdCAqIERlc2t0b3AsIHRoZSBub3JtYWwgbW9kZSBpbXBsaWVzIHRoYXQgdGhlIHRleHQgaXMgaW4gc2Nyb2xsYWJsZSBhcyB3ZWxsIGFzXG5cdCAqIHNlbGVjdGlvbiBtb2RlLlxuXHQgKi9cblx0cHVibGljIGdldCB0ZXh0SW50ZXJhY3Rpb25Nb2RlKCk6VGV4dEludGVyYWN0aW9uTW9kZVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3RleHRJbnRlcmFjdGlvbk1vZGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGluIHBpeGVscy5cblx0ICovXG5cdHB1YmxpYyBnZXQgdGV4dFdpZHRoKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdGV4dFdpZHRoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0aGlja25lc3Mgb2YgdGhlIGdseXBoIGVkZ2VzIGluIHRoaXMgdGV4dCBmaWVsZC4gVGhpcyBwcm9wZXJ0eSBhcHBsaWVzXG5cdCAqIG9ubHkgd2hlbiA8Y29kZT5BbnRpQWxpYXNUeXBlPC9jb2RlPiBpcyBzZXQgdG9cblx0ICogPGNvZGU+QW50aUFsaWFzVHlwZS5BRFZBTkNFRDwvY29kZT4uXG5cdCAqXG5cdCAqIDxwPlRoZSByYW5nZSBmb3IgPGNvZGU+dGhpY2tuZXNzPC9jb2RlPiBpcyBhIG51bWJlciBmcm9tIC0yMDAgdG8gMjAwLiBJZlxuXHQgKiB5b3UgYXR0ZW1wdCB0byBzZXQgPGNvZGU+dGhpY2tuZXNzPC9jb2RlPiB0byBhIHZhbHVlIG91dHNpZGUgdGhhdCByYW5nZSxcblx0ICogdGhlIHByb3BlcnR5IGlzIHNldCB0byB0aGUgbmVhcmVzdCB2YWx1ZSBpbiB0aGUgcmFuZ2UoZWl0aGVyIC0yMDAgb3Jcblx0ICogMjAwKS48L3A+XG5cdCAqIFxuXHQgKiBAZGVmYXVsdCAwXG5cdCAqL1xuXHRwdWJsaWMgdGhpY2tuZXNzOm51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHR5cGUgb2YgdGhlIHRleHQgZmllbGQuIEVpdGhlciBvbmUgb2YgdGhlIGZvbGxvd2luZyBUZXh0RmllbGRUeXBlXG5cdCAqIGNvbnN0YW50czogPGNvZGU+VGV4dEZpZWxkVHlwZS5EWU5BTUlDPC9jb2RlPiwgd2hpY2ggc3BlY2lmaWVzIGEgZHluYW1pY1xuXHQgKiB0ZXh0IGZpZWxkLCB3aGljaCBhIHVzZXIgY2Fubm90IGVkaXQsIG9yIDxjb2RlPlRleHRGaWVsZFR5cGUuSU5QVVQ8L2NvZGU+LFxuXHQgKiB3aGljaCBzcGVjaWZpZXMgYW4gaW5wdXQgdGV4dCBmaWVsZCwgd2hpY2ggYSB1c2VyIGNhbiBlZGl0LlxuXHQgKiBcblx0ICogQGRlZmF1bHQgZHluYW1pY1xuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgVGhlIDxjb2RlPnR5cGU8L2NvZGU+IHNwZWNpZmllZCBpcyBub3QgYSBtZW1iZXIgb2Zcblx0ICogICAgICAgICAgICAgICAgICAgICAgIGZsYXNoLnRleHQuVGV4dEZpZWxkVHlwZS5cblx0ICovXG5cdHB1YmxpYyB0eXBlOlRleHRGaWVsZFR5cGU7XG5cblx0LyoqXG5cdCAqIFNwZWNpZmllcyB3aGV0aGVyIHRvIGNvcHkgYW5kIHBhc3RlIHRoZSB0ZXh0IGZvcm1hdHRpbmcgYWxvbmcgd2l0aCB0aGVcblx0ICogdGV4dC4gV2hlbiBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIEZsYXNoIFBsYXllciBjb3BpZXMgYW5kIHBhc3Rlc1xuXHQgKiBmb3JtYXR0aW5nKHN1Y2ggYXMgYWxpZ25tZW50LCBib2xkLCBhbmQgaXRhbGljcykgd2hlbiB5b3UgY29weSBhbmQgcGFzdGVcblx0ICogYmV0d2VlbiB0ZXh0IGZpZWxkcy4gQm90aCB0aGUgb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiB0ZXh0IGZpZWxkcyBmb3IgdGhlXG5cdCAqIGNvcHkgYW5kIHBhc3RlIHByb2NlZHVyZSBtdXN0IGhhdmUgPGNvZGU+dXNlUmljaFRleHRDbGlwYm9hcmQ8L2NvZGU+IHNldFxuXHQgKiB0byA8Y29kZT50cnVlPC9jb2RlPi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIHVzZVJpY2hUZXh0Q2xpcGJvYXJkOmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIEEgQm9vbGVhbiB2YWx1ZSB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSB0ZXh0IGZpZWxkIGhhcyB3b3JkIHdyYXAuIElmXG5cdCAqIHRoZSB2YWx1ZSBvZiA8Y29kZT53b3JkV3JhcDwvY29kZT4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4sIHRoZSB0ZXh0IGZpZWxkXG5cdCAqIGhhcyB3b3JkIHdyYXA7IGlmIHRoZSB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSB0ZXh0IGZpZWxkIGRvZXMgbm90XG5cdCAqIGhhdmUgd29yZCB3cmFwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT5mYWxzZTwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgd29yZFdyYXA6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBUZXh0RmllbGQgaW5zdGFuY2UuIEFmdGVyIHlvdSBjcmVhdGUgdGhlIFRleHRGaWVsZCBpbnN0YW5jZSxcblx0ICogY2FsbCB0aGUgPGNvZGU+YWRkQ2hpbGQoKTwvY29kZT4gb3IgPGNvZGU+YWRkQ2hpbGRBdCgpPC9jb2RlPiBtZXRob2Qgb2Zcblx0ICogdGhlIHBhcmVudCBEaXNwbGF5T2JqZWN0Q29udGFpbmVyIG9iamVjdCB0byBhZGQgdGhlIFRleHRGaWVsZCBpbnN0YW5jZSB0b1xuXHQgKiB0aGUgZGlzcGxheSBsaXN0LlxuXHQgKlxuXHQgKiA8cD5UaGUgZGVmYXVsdCBzaXplIGZvciBhIHRleHQgZmllbGQgaXMgMTAwIHggMTAwIHBpeGVscy48L3A+XG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFwcGVuZHMgdGhlIHN0cmluZyBzcGVjaWZpZWQgYnkgdGhlIDxjb2RlPm5ld1RleHQ8L2NvZGU+IHBhcmFtZXRlciB0byB0aGVcblx0ICogZW5kIG9mIHRoZSB0ZXh0IG9mIHRoZSB0ZXh0IGZpZWxkLiBUaGlzIG1ldGhvZCBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGFuXG5cdCAqIGFkZGl0aW9uIGFzc2lnbm1lbnQoPGNvZGU+Kz08L2NvZGU+KSBvbiBhIDxjb2RlPnRleHQ8L2NvZGU+IHByb3BlcnR5XG5cdCAqIChzdWNoIGFzIDxjb2RlPnNvbWVUZXh0RmllbGQudGV4dCArPSBtb3JlVGV4dDwvY29kZT4pLCBwYXJ0aWN1bGFybHkgZm9yIGFcblx0ICogdGV4dCBmaWVsZCB0aGF0IGNvbnRhaW5zIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGNvbnRlbnQuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmV3VGV4dCBUaGUgc3RyaW5nIHRvIGFwcGVuZCB0byB0aGUgZXhpc3RpbmcgdGV4dC5cblx0ICovXG5cdHB1YmxpYyBhcHBlbmRUZXh0KG5ld1RleHQ6c3RyaW5nKVxuXHR7XG5cdFx0Ly9UT0RPXG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIHJlY3RhbmdsZSB0aGF0IGlzIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIGNoYXJhY3Rlci5cblx0ICogXG5cdCAqIEBwYXJhbSBjaGFySW5kZXggVGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgZm9yIHRoZSBjaGFyYWN0ZXIoZm9yXG5cdCAqICAgICAgICAgICAgICAgICAgZXhhbXBsZSwgdGhlIGZpcnN0IHBvc2l0aW9uIGlzIDAsIHRoZSBzZWNvbmQgcG9zaXRpb24gaXNcblx0ICogICAgICAgICAgICAgICAgICAxLCBhbmQgc28gb24pLlxuXHQgKiBAcmV0dXJuIEEgcmVjdGFuZ2xlIHdpdGggPGNvZGU+eDwvY29kZT4gYW5kIDxjb2RlPnk8L2NvZGU+IG1pbmltdW0gYW5kXG5cdCAqICAgICAgICAgbWF4aW11bSB2YWx1ZXMgZGVmaW5pbmcgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgY2hhcmFjdGVyLlxuXHQgKi9cblx0cHVibGljIGdldENoYXJCb3VuZGFyaWVzKGNoYXJJbmRleDpudW1iZXIpOlJlY3RhbmdsZVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NoYXJCb3VuZGFyaWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgb2YgdGhlIGNoYXJhY3RlciBhdCB0aGUgcG9pbnQgc3BlY2lmaWVkXG5cdCAqIGJ5IHRoZSA8Y29kZT54PC9jb2RlPiBhbmQgPGNvZGU+eTwvY29kZT4gcGFyYW1ldGVycy5cblx0ICogXG5cdCAqIEBwYXJhbSB4IFRoZSA8aT54PC9pPiBjb29yZGluYXRlIG9mIHRoZSBjaGFyYWN0ZXIuXG5cdCAqIEBwYXJhbSB5IFRoZSA8aT55PC9pPiBjb29yZGluYXRlIG9mIHRoZSBjaGFyYWN0ZXIuXG5cdCAqIEByZXR1cm4gVGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgb2YgdGhlIGNoYXJhY3Rlcihmb3IgZXhhbXBsZSwgdGhlXG5cdCAqICAgICAgICAgZmlyc3QgcG9zaXRpb24gaXMgMCwgdGhlIHNlY29uZCBwb3NpdGlvbiBpcyAxLCBhbmQgc28gb24pLiBSZXR1cm5zXG5cdCAqICAgICAgICAgLTEgaWYgdGhlIHBvaW50IGlzIG5vdCBvdmVyIGFueSBjaGFyYWN0ZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2hhckluZGV4QXRQb2ludCh4Om51bWJlciwgeTpudW1iZXIpOm51bWJlciAvKmludCovXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2hhckluZGV4QXRQb2ludDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHaXZlbiBhIGNoYXJhY3RlciBpbmRleCwgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGVcblx0ICogc2FtZSBwYXJhZ3JhcGguXG5cdCAqIFxuXHQgKiBAcGFyYW0gY2hhckluZGV4IFRoZSB6ZXJvLWJhc2VkIGluZGV4IHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIoZm9yIGV4YW1wbGUsXG5cdCAqICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAwLCB0aGUgc2Vjb25kIGNoYXJhY3RlciBpcyAxLCBhbmRcblx0ICogICAgICAgICAgICAgICAgICBzbyBvbikuXG5cdCAqIEByZXR1cm4gVGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc2FtZVxuXHQgKiAgICAgICAgIHBhcmFncmFwaC5cblx0ICogQHRocm93cyBSYW5nZUVycm9yIFRoZSBjaGFyYWN0ZXIgaW5kZXggc3BlY2lmaWVkIGlzIG91dCBvZiByYW5nZS5cblx0ICovXG5cdHB1YmxpYyBnZXRGaXJzdENoYXJJblBhcmFncmFwaChjaGFySW5kZXg6bnVtYmVyIC8qaW50Ki8pOm51bWJlciAvKmludCovXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZmlyc3RDaGFySW5QYXJhZ3JhcGg7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhIERpc3BsYXlPYmplY3QgcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gPGNvZGU+aWQ8L2NvZGU+LCBmb3IgYW5cblx0ICogaW1hZ2Ugb3IgU1dGIGZpbGUgdGhhdCBoYXMgYmVlbiBhZGRlZCB0byBhbiBIVE1MLWZvcm1hdHRlZCB0ZXh0IGZpZWxkIGJ5XG5cdCAqIHVzaW5nIGFuIDxjb2RlPjxpbWc+PC9jb2RlPiB0YWcuIFRoZSA8Y29kZT48aW1nPjwvY29kZT4gdGFnIGlzIGluIHRoZVxuXHQgKiBmb2xsb3dpbmcgZm9ybWF0OlxuXHQgKlxuXHQgKiA8cD48cHJlIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+PGNvZGU+IDxpbWcgc3JjID0gJ2ZpbGVuYW1lLmpwZycgaWQgPVxuXHQgKiAnaW5zdGFuY2VOYW1lJyA+PC9jb2RlPjwvcHJlPjwvcD5cblx0ICogXG5cdCAqIEBwYXJhbSBpZCBUaGUgPGNvZGU+aWQ8L2NvZGU+IHRvIG1hdGNoKGluIHRoZSA8Y29kZT5pZDwvY29kZT4gYXR0cmlidXRlXG5cdCAqICAgICAgICAgICBvZiB0aGUgPGNvZGU+PGltZz48L2NvZGU+IHRhZykuXG5cdCAqIEByZXR1cm4gVGhlIGRpc3BsYXkgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGltYWdlIG9yIFNXRiBmaWxlIHdpdGggdGhlXG5cdCAqICAgICAgICAgbWF0Y2hpbmcgPGNvZGU+aWQ8L2NvZGU+IGF0dHJpYnV0ZSBpbiB0aGUgPGNvZGU+PGltZz48L2NvZGU+IHRhZ1xuXHQgKiAgICAgICAgIG9mIHRoZSB0ZXh0IGZpZWxkLiBGb3IgbWVkaWEgbG9hZGVkIGZyb20gYW4gZXh0ZXJuYWwgc291cmNlLCB0aGlzXG5cdCAqICAgICAgICAgb2JqZWN0IGlzIGEgTG9hZGVyIG9iamVjdCwgYW5kLCBvbmNlIGxvYWRlZCwgdGhlIG1lZGlhIG9iamVjdCBpcyBhXG5cdCAqICAgICAgICAgY2hpbGQgb2YgdGhhdCBMb2FkZXIgb2JqZWN0LiBGb3IgbWVkaWEgZW1iZWRkZWQgaW4gdGhlIFNXRiBmaWxlLFxuXHQgKiAgICAgICAgIGl0IGlzIHRoZSBsb2FkZWQgb2JqZWN0LiBJZiBubyA8Y29kZT48aW1nPjwvY29kZT4gdGFnIHdpdGggdGhlXG5cdCAqICAgICAgICAgbWF0Y2hpbmcgPGNvZGU+aWQ8L2NvZGU+IGV4aXN0cywgdGhlIG1ldGhvZCByZXR1cm5zXG5cdCAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW1hZ2VSZWZlcmVuY2UoaWQ6c3RyaW5nKTpEaXNwbGF5T2JqZWN0XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faW1hZ2VSZWZlcmVuY2U7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgemVyby1iYXNlZCBpbmRleCB2YWx1ZSBvZiB0aGUgbGluZSBhdCB0aGUgcG9pbnQgc3BlY2lmaWVkIGJ5XG5cdCAqIHRoZSA8Y29kZT54PC9jb2RlPiBhbmQgPGNvZGU+eTwvY29kZT4gcGFyYW1ldGVycy5cblx0ICogXG5cdCAqIEBwYXJhbSB4IFRoZSA8aT54PC9pPiBjb29yZGluYXRlIG9mIHRoZSBsaW5lLlxuXHQgKiBAcGFyYW0geSBUaGUgPGk+eTwvaT4gY29vcmRpbmF0ZSBvZiB0aGUgbGluZS5cblx0ICogQHJldHVybiBUaGUgemVyby1iYXNlZCBpbmRleCB2YWx1ZSBvZiB0aGUgbGluZShmb3IgZXhhbXBsZSwgdGhlIGZpcnN0XG5cdCAqICAgICAgICAgbGluZSBpcyAwLCB0aGUgc2Vjb25kIGxpbmUgaXMgMSwgYW5kIHNvIG9uKS4gUmV0dXJucyAtMSBpZiB0aGVcblx0ICogICAgICAgICBwb2ludCBpcyBub3Qgb3ZlciBhbnkgbGluZS5cblx0ICovXG5cdHB1YmxpYyBnZXRMaW5lSW5kZXhBdFBvaW50KHg6bnVtYmVyLCB5Om51bWJlcik6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9saW5lSW5kZXhBdFBvaW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgb2YgdGhlIGxpbmUgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyXG5cdCAqIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+Y2hhckluZGV4PC9jb2RlPiBwYXJhbWV0ZXIuXG5cdCAqIFxuXHQgKiBAcGFyYW0gY2hhckluZGV4IFRoZSB6ZXJvLWJhc2VkIGluZGV4IHZhbHVlIG9mIHRoZSBjaGFyYWN0ZXIoZm9yIGV4YW1wbGUsXG5cdCAqICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBpcyAwLCB0aGUgc2Vjb25kIGNoYXJhY3RlciBpcyAxLCBhbmRcblx0ICogICAgICAgICAgICAgICAgICBzbyBvbikuXG5cdCAqIEByZXR1cm4gVGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgb2YgdGhlIGxpbmUuXG5cdCAqIEB0aHJvd3MgUmFuZ2VFcnJvciBUaGUgY2hhcmFjdGVyIGluZGV4IHNwZWNpZmllZCBpcyBvdXQgb2YgcmFuZ2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGluZUluZGV4T2ZDaGFyKGNoYXJJbmRleDpudW1iZXIgLyppbnQqLyk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9saW5lSW5kZXhPZkNoYXI7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gYSBzcGVjaWZpYyB0ZXh0IGxpbmUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbGluZUluZGV4IFRoZSBsaW5lIG51bWJlciBmb3Igd2hpY2ggeW91IHdhbnQgdGhlIGxlbmd0aC5cblx0ICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGxpbmUuXG5cdCAqIEB0aHJvd3MgUmFuZ2VFcnJvciBUaGUgbGluZSBudW1iZXIgc3BlY2lmaWVkIGlzIG91dCBvZiByYW5nZS5cblx0ICovXG5cdHB1YmxpYyBnZXRMaW5lTGVuZ3RoKGxpbmVJbmRleDpudW1iZXIgLyppbnQqLyk6bnVtYmVyIC8qaW50Ki9cblx0e1xuXHRcdHJldHVybiB0aGlzLl9saW5lTGVuZ3RoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgbWV0cmljcyBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIHRleHQgbGluZS5cblx0ICogXG5cdCAqIEBwYXJhbSBsaW5lSW5kZXggVGhlIGxpbmUgbnVtYmVyIGZvciB3aGljaCB5b3Ugd2FudCBtZXRyaWNzIGluZm9ybWF0aW9uLlxuXHQgKiBAcmV0dXJuIEEgVGV4dExpbmVNZXRyaWNzIG9iamVjdC5cblx0ICogQHRocm93cyBSYW5nZUVycm9yIFRoZSBsaW5lIG51bWJlciBzcGVjaWZpZWQgaXMgb3V0IG9mIHJhbmdlLlxuXHQgKi9cblx0cHVibGljIGdldExpbmVNZXRyaWNzKGxpbmVJbmRleDpudW1iZXIgLyppbnQqLyk6VGV4dExpbmVNZXRyaWNzXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbGluZU1ldHJpY3M7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGluZGV4IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGxpbmUgdGhhdCB0aGVcblx0ICogPGNvZGU+bGluZUluZGV4PC9jb2RlPiBwYXJhbWV0ZXIgc3BlY2lmaWVzLlxuXHQgKiBcblx0ICogQHBhcmFtIGxpbmVJbmRleCBUaGUgemVyby1iYXNlZCBpbmRleCB2YWx1ZSBvZiB0aGUgbGluZShmb3IgZXhhbXBsZSwgdGhlXG5cdCAqICAgICAgICAgICAgICAgICAgZmlyc3QgbGluZSBpcyAwLCB0aGUgc2Vjb25kIGxpbmUgaXMgMSwgYW5kIHNvIG9uKS5cblx0ICogQHJldHVybiBUaGUgemVyby1iYXNlZCBpbmRleCB2YWx1ZSBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBsaW5lLlxuXHQgKiBAdGhyb3dzIFJhbmdlRXJyb3IgVGhlIGxpbmUgbnVtYmVyIHNwZWNpZmllZCBpcyBvdXQgb2YgcmFuZ2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGluZU9mZnNldChsaW5lSW5kZXg6bnVtYmVyIC8qaW50Ki8pOm51bWJlciAvKmludCovXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbGluZU9mZnNldDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBsaW5lIHNwZWNpZmllZCBieSB0aGUgPGNvZGU+bGluZUluZGV4PC9jb2RlPlxuXHQgKiBwYXJhbWV0ZXIuXG5cdCAqIFxuXHQgKiBAcGFyYW0gbGluZUluZGV4IFRoZSB6ZXJvLWJhc2VkIGluZGV4IHZhbHVlIG9mIHRoZSBsaW5lKGZvciBleGFtcGxlLCB0aGVcblx0ICogICAgICAgICAgICAgICAgICBmaXJzdCBsaW5lIGlzIDAsIHRoZSBzZWNvbmQgbGluZSBpcyAxLCBhbmQgc28gb24pLlxuXHQgKiBAcmV0dXJuIFRoZSB0ZXh0IHN0cmluZyBjb250YWluZWQgaW4gdGhlIHNwZWNpZmllZCBsaW5lLlxuXHQgKiBAdGhyb3dzIFJhbmdlRXJyb3IgVGhlIGxpbmUgbnVtYmVyIHNwZWNpZmllZCBpcyBvdXQgb2YgcmFuZ2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGluZVRleHQobGluZUluZGV4Om51bWJlciAvKmludCovKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiB0aGlzLl9saW5lVGV4dDtcblx0fVxuXG5cdC8qKlxuXHQgKiBHaXZlbiBhIGNoYXJhY3RlciBpbmRleCwgcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBwYXJhZ3JhcGggY29udGFpbmluZ1xuXHQgKiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLiBUaGUgbGVuZ3RoIGlzIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlXG5cdCAqIHBhcmFncmFwaChhcyByZXR1cm5lZCBieSA8Y29kZT5nZXRGaXJzdENoYXJJblBhcmFncmFwaCgpPC9jb2RlPiksIG5vdCB0b1xuXHQgKiB0aGUgY2hhcmFjdGVyIGluZGV4IHBhc3NlZCBpbi5cblx0ICogXG5cdCAqIEBwYXJhbSBjaGFySW5kZXggVGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgb2YgdGhlIGNoYXJhY3Rlcihmb3IgZXhhbXBsZSxcblx0ICogICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIDAsIHRoZSBzZWNvbmQgY2hhcmFjdGVyIGlzIDEsIGFuZFxuXHQgKiAgICAgICAgICAgICAgICAgIHNvIG9uKS5cblx0ICogQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgcGFyYWdyYXBoLlxuXHQgKiBAdGhyb3dzIFJhbmdlRXJyb3IgVGhlIGNoYXJhY3RlciBpbmRleCBzcGVjaWZpZWQgaXMgb3V0IG9mIHJhbmdlLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmFncmFwaExlbmd0aChjaGFySW5kZXg6bnVtYmVyIC8qaW50Ki8pOm51bWJlciAvKmludCovXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcGFyYWdyYXBoTGVuZ3RoO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBUZXh0Rm9ybWF0IG9iamVjdCB0aGF0IGNvbnRhaW5zIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24gZm9yIHRoZVxuXHQgKiByYW5nZSBvZiB0ZXh0IHRoYXQgdGhlIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGFuZCA8Y29kZT5lbmRJbmRleDwvY29kZT5cblx0ICogcGFyYW1ldGVycyBzcGVjaWZ5LiBPbmx5IHByb3BlcnRpZXMgdGhhdCBhcmUgY29tbW9uIHRvIHRoZSBlbnRpcmUgdGV4dFxuXHQgKiBzcGVjaWZpZWQgYXJlIHNldCBpbiB0aGUgcmVzdWx0aW5nIFRleHRGb3JtYXQgb2JqZWN0LiBBbnkgcHJvcGVydHkgdGhhdCBpc1xuXHQgKiA8aT5taXhlZDwvaT4sIG1lYW5pbmcgdGhhdCBpdCBoYXMgZGlmZmVyZW50IHZhbHVlcyBhdCBkaWZmZXJlbnQgcG9pbnRzIGluXG5cdCAqIHRoZSB0ZXh0LCBoYXMgYSB2YWx1ZSBvZiA8Y29kZT5udWxsPC9jb2RlPi5cblx0ICpcblx0ICogPHA+SWYgeW91IGRvIG5vdCBzcGVjaWZ5IHZhbHVlcyBmb3IgdGhlc2UgcGFyYW1ldGVycywgdGhpcyBtZXRob2QgaXNcblx0ICogYXBwbGllZCB0byBhbGwgdGhlIHRleHQgaW4gdGhlIHRleHQgZmllbGQuIDwvcD5cblx0ICpcblx0ICogPHA+VGhlIGZvbGxvd2luZyB0YWJsZSBkZXNjcmliZXMgdGhyZWUgcG9zc2libGUgdXNhZ2VzOjwvcD5cblx0ICogXG5cdCAqIEByZXR1cm4gVGhlIFRleHRGb3JtYXQgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgZm9ybWF0dGluZyBwcm9wZXJ0aWVzXG5cdCAqICAgICAgICAgZm9yIHRoZSBzcGVjaWZpZWQgdGV4dC5cblx0ICogQHRocm93cyBSYW5nZUVycm9yIFRoZSA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBvciA8Y29kZT5lbmRJbmRleDwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpcyBvdXQgb2YgcmFuZ2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VGV4dEZvcm1hdChiZWdpbkluZGV4Om51bWJlciAvKmludCovID0gLTEsIGVuZEluZGV4Om51bWJlciAvKmludCovID0gLTEpOlRleHRGb3JtYXRcblx0e1xuXHRcdHJldHVybiB0aGlzLl90ZXh0Rm9ybWF0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgPGNvZGU+dmFsdWU8L2NvZGU+XG5cdCAqIHBhcmFtZXRlci4gVGhlIHRleHQgaXMgaW5zZXJ0ZWQgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbixcblx0ICogdXNpbmcgdGhlIGN1cnJlbnQgZGVmYXVsdCBjaGFyYWN0ZXIgZm9ybWF0IGFuZCBkZWZhdWx0IHBhcmFncmFwaCBmb3JtYXQuXG5cdCAqIFRoZSB0ZXh0IGlzIG5vdCB0cmVhdGVkIGFzIEhUTUwuXG5cdCAqXG5cdCAqIDxwPllvdSBjYW4gdXNlIHRoZSA8Y29kZT5yZXBsYWNlU2VsZWN0ZWRUZXh0KCk8L2NvZGU+IG1ldGhvZCB0byBpbnNlcnQgYW5kXG5cdCAqIGRlbGV0ZSB0ZXh0IHdpdGhvdXQgZGlzcnVwdGluZyB0aGUgY2hhcmFjdGVyIGFuZCBwYXJhZ3JhcGggZm9ybWF0dGluZyBvZlxuXHQgKiB0aGUgcmVzdCBvZiB0aGUgdGV4dC48L3A+XG5cdCAqXG5cdCAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIG1ldGhvZCBkb2VzIG5vdCB3b3JrIGlmIGEgc3R5bGUgc2hlZXQgaXMgYXBwbGllZCB0b1xuXHQgKiB0aGUgdGV4dCBmaWVsZC48L3A+XG5cdCAqIFxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHN0cmluZyB0byByZXBsYWNlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGV4dC5cblx0ICogQHRocm93cyBFcnJvciBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCBvbiBhIHRleHQgZmllbGQgd2l0aCBhIHN0eWxlXG5cdCAqICAgICAgICAgICAgICAgc2hlZXQuXG5cdCAqL1xuXHRwdWJsaWMgcmVwbGFjZVNlbGVjdGVkVGV4dCh2YWx1ZTpzdHJpbmcpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIFJlcGxhY2VzIHRoZSByYW5nZSBvZiBjaGFyYWN0ZXJzIHRoYXQgdGhlIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IGFuZFxuXHQgKiA8Y29kZT5lbmRJbmRleDwvY29kZT4gcGFyYW1ldGVycyBzcGVjaWZ5IHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZVxuXHQgKiA8Y29kZT5uZXdUZXh0PC9jb2RlPiBwYXJhbWV0ZXIuIEFzIGRlc2lnbmVkLCB0aGUgdGV4dCBmcm9tXG5cdCAqIDxjb2RlPmJlZ2luSW5kZXg8L2NvZGU+IHRvIDxjb2RlPmVuZEluZGV4LTE8L2NvZGU+IGlzIHJlcGxhY2VkLlxuXHQgKlxuXHQgKiA8cD48Yj5Ob3RlOjwvYj4gVGhpcyBtZXRob2QgZG9lcyBub3Qgd29yayBpZiBhIHN0eWxlIHNoZWV0IGlzIGFwcGxpZWQgdG9cblx0ICogdGhlIHRleHQgZmllbGQuPC9wPlxuXHQgKiBcblx0ICogQHBhcmFtIGJlZ2luSW5kZXggVGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgZm9yIHRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgcmVwbGFjZW1lbnQgcmFuZ2UuXG5cdCAqIEBwYXJhbSBlbmRJbmRleCAgIFRoZSB6ZXJvLWJhc2VkIGluZGV4IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXJcblx0ICogICAgICAgICAgICAgICAgICAgYWZ0ZXIgdGhlIGRlc2lyZWQgdGV4dCBzcGFuLlxuXHQgKiBAcGFyYW0gbmV3VGV4dCAgICBUaGUgdGV4dCB0byB1c2UgdG8gcmVwbGFjZSB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mXG5cdCAqICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMuXG5cdCAqIEB0aHJvd3MgRXJyb3IgVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgb24gYSB0ZXh0IGZpZWxkIHdpdGggYSBzdHlsZVxuXHQgKiAgICAgICAgICAgICAgIHNoZWV0LlxuXHQgKi9cblx0cHVibGljIHJlcGxhY2VUZXh0KGJlZ2luSW5kZXg6bnVtYmVyIC8qaW50Ki8sIGVuZEluZGV4Om51bWJlciAvKmludCovLCBuZXdUZXh0OnN0cmluZylcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBhcyBzZWxlY3RlZCB0aGUgdGV4dCBkZXNpZ25hdGVkIGJ5IHRoZSBpbmRleCB2YWx1ZXMgb2YgdGhlIGZpcnN0IGFuZFxuXHQgKiBsYXN0IGNoYXJhY3RlcnMsIHdoaWNoIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgPGNvZGU+YmVnaW5JbmRleDwvY29kZT4gYW5kXG5cdCAqIDxjb2RlPmVuZEluZGV4PC9jb2RlPiBwYXJhbWV0ZXJzLiBJZiB0aGUgdHdvIHBhcmFtZXRlciB2YWx1ZXMgYXJlIHRoZVxuXHQgKiBzYW1lLCB0aGlzIG1ldGhvZCBzZXRzIHRoZSBpbnNlcnRpb24gcG9pbnQsIGFzIGlmIHlvdSBzZXQgdGhlXG5cdCAqIDxjb2RlPmNhcmV0SW5kZXg8L2NvZGU+IHByb3BlcnR5LlxuXHQgKiBcblx0ICogQHBhcmFtIGJlZ2luSW5kZXggVGhlIHplcm8tYmFzZWQgaW5kZXggdmFsdWUgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uKGZvciBleGFtcGxlLCB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIDAsIHRoZVxuXHQgKiAgICAgICAgICAgICAgICAgICBzZWNvbmQgY2hhcmFjdGVyIGlzIDEsIGFuZCBzbyBvbikuXG5cdCAqIEBwYXJhbSBlbmRJbmRleCAgIFRoZSB6ZXJvLWJhc2VkIGluZGV4IHZhbHVlIG9mIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGVcblx0ICogICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uLlxuXHQgKi9cblx0cHVibGljIHNldFNlbGVjdGlvbihiZWdpbkluZGV4Om51bWJlciAvKmludCovLCBlbmRJbmRleDpudW1iZXIgLyppbnQqLylcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogQXBwbGllcyB0aGUgdGV4dCBmb3JtYXR0aW5nIHRoYXQgdGhlIDxjb2RlPmZvcm1hdDwvY29kZT4gcGFyYW1ldGVyXG5cdCAqIHNwZWNpZmllcyB0byB0aGUgc3BlY2lmaWVkIHRleHQgaW4gYSB0ZXh0IGZpZWxkLiBUaGUgdmFsdWUgb2Zcblx0ICogPGNvZGU+Zm9ybWF0PC9jb2RlPiBtdXN0IGJlIGEgVGV4dEZvcm1hdCBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIGRlc2lyZWRcblx0ICogdGV4dCBmb3JtYXR0aW5nIGNoYW5nZXMuIE9ubHkgdGhlIG5vbi1udWxsIHByb3BlcnRpZXMgb2Zcblx0ICogPGNvZGU+Zm9ybWF0PC9jb2RlPiBhcmUgYXBwbGllZCB0byB0aGUgdGV4dCBmaWVsZC4gQW55IHByb3BlcnR5IG9mXG5cdCAqIDxjb2RlPmZvcm1hdDwvY29kZT4gdGhhdCBpcyBzZXQgdG8gPGNvZGU+bnVsbDwvY29kZT4gaXMgbm90IGFwcGxpZWQuIEJ5XG5cdCAqIGRlZmF1bHQsIGFsbCBvZiB0aGUgcHJvcGVydGllcyBvZiBhIG5ld2x5IGNyZWF0ZWQgVGV4dEZvcm1hdCBvYmplY3QgYXJlXG5cdCAqIHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi5cblx0ICpcblx0ICogPHA+PGI+Tm90ZTo8L2I+IFRoaXMgbWV0aG9kIGRvZXMgbm90IHdvcmsgaWYgYSBzdHlsZSBzaGVldCBpcyBhcHBsaWVkIHRvXG5cdCAqIHRoZSB0ZXh0IGZpZWxkLjwvcD5cblx0ICpcblx0ICogPHA+VGhlIDxjb2RlPnNldFRleHRGb3JtYXQoKTwvY29kZT4gbWV0aG9kIGNoYW5nZXMgdGhlIHRleHQgZm9ybWF0dGluZ1xuXHQgKiBhcHBsaWVkIHRvIGEgcmFuZ2Ugb2YgY2hhcmFjdGVycyBvciB0byB0aGUgZW50aXJlIGJvZHkgb2YgdGV4dCBpbiBhIHRleHRcblx0ICogZmllbGQuIFRvIGFwcGx5IHRoZSBwcm9wZXJ0aWVzIG9mIGZvcm1hdCB0byBhbGwgdGV4dCBpbiB0aGUgdGV4dCBmaWVsZCwgZG9cblx0ICogbm90IHNwZWNpZnkgdmFsdWVzIGZvciA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBhbmQgPGNvZGU+ZW5kSW5kZXg8L2NvZGU+LlxuXHQgKiBUbyBhcHBseSB0aGUgcHJvcGVydGllcyBvZiB0aGUgZm9ybWF0IHRvIGEgcmFuZ2Ugb2YgdGV4dCwgc3BlY2lmeSB2YWx1ZXNcblx0ICogZm9yIHRoZSA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBhbmQgdGhlIDxjb2RlPmVuZEluZGV4PC9jb2RlPiBwYXJhbWV0ZXJzLlxuXHQgKiBZb3UgY2FuIHVzZSB0aGUgPGNvZGU+bGVuZ3RoPC9jb2RlPiBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgdGhlIGluZGV4XG5cdCAqIHZhbHVlcy48L3A+XG5cdCAqXG5cdCAqIDxwPlRoZSB0d28gdHlwZXMgb2YgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBpbiBhIFRleHRGb3JtYXQgb2JqZWN0IGFyZVxuXHQgKiBjaGFyYWN0ZXIgbGV2ZWwgZm9ybWF0dGluZyBhbmQgcGFyYWdyYXBoIGxldmVsIGZvcm1hdHRpbmcuIEVhY2ggY2hhcmFjdGVyXG5cdCAqIGluIGEgdGV4dCBmaWVsZCBjYW4gaGF2ZSBpdHMgb3duIGNoYXJhY3RlciBmb3JtYXR0aW5nIHNldHRpbmdzLCBzdWNoIGFzXG5cdCAqIGZvbnQgbmFtZSwgZm9udCBzaXplLCBib2xkLCBhbmQgaXRhbGljLjwvcD5cblx0ICpcblx0ICogPHA+Rm9yIHBhcmFncmFwaHMsIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHBhcmFncmFwaCBpcyBleGFtaW5lZCBmb3Jcblx0ICogdGhlIHBhcmFncmFwaCBmb3JtYXR0aW5nIHNldHRpbmdzIGZvciB0aGUgZW50aXJlIHBhcmFncmFwaC4gRXhhbXBsZXMgb2Zcblx0ICogcGFyYWdyYXBoIGZvcm1hdHRpbmcgc2V0dGluZ3MgYXJlIGxlZnQgbWFyZ2luLCByaWdodCBtYXJnaW4sIGFuZFxuXHQgKiBpbmRlbnRhdGlvbi48L3A+XG5cdCAqXG5cdCAqIDxwPkFueSB0ZXh0IGluc2VydGVkIG1hbnVhbGx5IGJ5IHRoZSB1c2VyLCBvciByZXBsYWNlZCBieSB0aGVcblx0ICogPGNvZGU+cmVwbGFjZVNlbGVjdGVkVGV4dCgpPC9jb2RlPiBtZXRob2QsIHJlY2VpdmVzIHRoZSBkZWZhdWx0IHRleHQgZmllbGRcblx0ICogZm9ybWF0dGluZyBmb3IgbmV3IHRleHQsIGFuZCBub3QgdGhlIGZvcm1hdHRpbmcgc3BlY2lmaWVkIGZvciB0aGUgdGV4dFxuXHQgKiBpbnNlcnRpb24gcG9pbnQuIFRvIHNldCB0aGUgZGVmYXVsdCBmb3JtYXR0aW5nIGZvciBuZXcgdGV4dCwgdXNlXG5cdCAqIDxjb2RlPmRlZmF1bHRUZXh0Rm9ybWF0PC9jb2RlPi48L3A+XG5cdCAqIFxuXHQgKiBAcGFyYW0gZm9ybWF0IEEgVGV4dEZvcm1hdCBvYmplY3QgdGhhdCBjb250YWlucyBjaGFyYWN0ZXIgYW5kIHBhcmFncmFwaFxuXHQgKiAgICAgICAgICAgICAgIGZvcm1hdHRpbmcgaW5mb3JtYXRpb24uXG5cdCAqIEB0aHJvd3MgRXJyb3IgICAgICBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCBvbiBhIHRleHQgZmllbGQgd2l0aCBhIHN0eWxlXG5cdCAqICAgICAgICAgICAgICAgICAgICBzaGVldC5cblx0ICogQHRocm93cyBSYW5nZUVycm9yIFRoZSA8Y29kZT5iZWdpbkluZGV4PC9jb2RlPiBvciA8Y29kZT5lbmRJbmRleDwvY29kZT5cblx0ICogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpcyBvdXQgb2YgcmFuZ2UuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VGV4dEZvcm1hdChmb3JtYXQ6VGV4dEZvcm1hdCwgYmVnaW5JbmRleDpudW1iZXIgLyppbnQqLyA9IC0xLCBlbmRJbmRleDpudW1iZXIgLyppbnQqLyA9IC0xKVxuXHR7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRydWUgaWYgYW4gZW1iZWRkZWQgZm9udCBpcyBhdmFpbGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkXG5cdCAqIDxjb2RlPmZvbnROYW1lPC9jb2RlPiBhbmQgPGNvZGU+Zm9udFN0eWxlPC9jb2RlPiB3aGVyZVxuXHQgKiA8Y29kZT5Gb250LmZvbnRUeXBlPC9jb2RlPiBpcyA8Y29kZT5mbGFzaC50ZXh0LkZvbnRUeXBlLkVNQkVEREVEPC9jb2RlPi5cblx0ICogU3RhcnRpbmcgd2l0aCBGbGFzaCBQbGF5ZXIgMTAsIHR3byBraW5kcyBvZiBlbWJlZGRlZCBmb250cyBjYW4gYXBwZWFyIGluIGFcblx0ICogU1dGIGZpbGUuIE5vcm1hbCBlbWJlZGRlZCBmb250cyBhcmUgb25seSB1c2VkIHdpdGggVGV4dEZpZWxkIG9iamVjdHMuIENGRlxuXHQgKiBlbWJlZGRlZCBmb250cyBhcmUgb25seSB1c2VkIHdpdGggdGhlIGZsYXNoLnRleHQuZW5naW5lIGNsYXNzZXMuIFRoZSB0d29cblx0ICogdHlwZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlIDxjb2RlPmZvbnRUeXBlPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGVcblx0ICogPGNvZGU+Rm9udDwvY29kZT4gY2xhc3MsIGFzIHJldHVybmVkIGJ5IHRoZSA8Y29kZT5lbnVtZXJhdGVGb250cygpPC9jb2RlPlxuXHQgKiBmdW5jdGlvbi5cblx0ICpcblx0ICogPHA+VGV4dEZpZWxkIGNhbm5vdCB1c2UgYSBmb250IG9mIHR5cGUgPGNvZGU+RU1CRURERURfQ0ZGPC9jb2RlPi4gSWZcblx0ICogPGNvZGU+ZW1iZWRGb250czwvY29kZT4gaXMgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+IGFuZCB0aGUgb25seSBmb250XG5cdCAqIGF2YWlsYWJsZSBhdCBydW4gdGltZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgc3R5bGUgaXMgb2YgdHlwZVxuXHQgKiA8Y29kZT5FTUJFRERFRF9DRkY8L2NvZGU+LCBGbGFzaCBQbGF5ZXIgZmFpbHMgdG8gcmVuZGVyIHRoZSB0ZXh0LCBhcyBpZiBub1xuXHQgKiBlbWJlZGRlZCBmb250IHdlcmUgYXZhaWxhYmxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIGFuZCBzdHlsZS48L3A+XG5cdCAqXG5cdCAqIDxwPklmIGJvdGggPGNvZGU+RU1CRURERUQ8L2NvZGU+IGFuZCA8Y29kZT5FTUJFRERFRF9DRkY8L2NvZGU+IGZvbnRzIGFyZVxuXHQgKiBhdmFpbGFibGUgd2l0aCB0aGUgc2FtZSBuYW1lIGFuZCBzdHlsZSwgdGhlIDxjb2RlPkVNQkVEREVEPC9jb2RlPiBmb250IGlzXG5cdCAqIHNlbGVjdGVkIGFuZCB0ZXh0IHJlbmRlcnMgd2l0aCB0aGUgPGNvZGU+RU1CRURERUQ8L2NvZGU+IGZvbnQuPC9wPlxuXHQgKiBcblx0ICogQHBhcmFtIGZvbnROYW1lICBUaGUgbmFtZSBvZiB0aGUgZW1iZWRkZWQgZm9udCB0byBjaGVjay5cblx0ICogQHBhcmFtIGZvbnRTdHlsZSBTcGVjaWZpZXMgdGhlIGZvbnQgc3R5bGUgdG8gY2hlY2suIFVzZVxuXHQgKiAgICAgICAgICAgICAgICAgIDxjb2RlPmZsYXNoLnRleHQuRm9udFN0eWxlPC9jb2RlPlxuXHQgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgY29tcGF0aWJsZSBlbWJlZGRlZCBmb250IGlzIGF2YWlsYWJsZSxcblx0ICogICAgICAgICBvdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+LlxuXHQgKiBAdGhyb3dzIEFyZ3VtZW50RXJyb3IgVGhlIDxjb2RlPmZvbnRTdHlsZTwvY29kZT4gc3BlY2lmaWVkIGlzIG5vdCBhIG1lbWJlclxuXHQgKiAgICAgICAgICAgICAgICAgICAgICAgb2YgPGNvZGU+Zmxhc2gudGV4dC5Gb250U3R5bGU8L2NvZGU+LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBpc0ZvbnRDb21wYXRpYmxlKGZvbnROYW1lOnN0cmluZywgZm9udFN0eWxlOnN0cmluZyk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmV4cG9ydCA9IFRleHRGaWVsZDsiXX0= \ No newline at end of file diff --git a/lib/entities/TextField.ts b/lib/entities/TextField.ts new file mode 100644 index 00000000..3cc37508 --- /dev/null +++ b/lib/entities/TextField.ts @@ -0,0 +1,1046 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import AntiAliasType = require("awayjs-core/lib/core/text/AntiAliasType"); +import GridFitType = require("awayjs-core/lib/core/text/GridFitType"); +import TextFieldAutoSize = require("awayjs-core/lib/core/text/TextFieldAutoSize"); +import TextFieldType = require("awayjs-core/lib/core/text/TextFieldType"); +import TextFormat = require("awayjs-core/lib/core/text/TextFormat"); +import TextInteractionMode = require("awayjs-core/lib/core/text/TextInteractionMode"); +import TextLineMetrics = require("awayjs-core/lib/core/text/TextLineMetrics"); + +/** + * The TextField class is used to create display objects for text display and + * input. You can use the TextField class to + * perform low-level text rendering. However, in Flex, you typically use the + * Label, Text, TextArea, and TextInput controls to process text. You can give a text field an instance name in the + * Property inspector and use the methods and properties of the TextField + * class to manipulate it with ActionScript. TextField instance names are + * displayed in the Movie Explorer and in the Insert Target Path dialog box in + * the Actions panel. + * + *

To create a text field dynamically, use the TextField() + * constructor.

+ * + *

The methods of the TextField class let you set, select, and manipulate + * text in a dynamic or input text field that you create during authoring or + * at runtime.

+ * + *

ActionScript provides several ways to format your text at runtime. The + * TextFormat class lets you set character and paragraph formatting for + * TextField objects. You can apply Cascading Style Sheets(CSS) styles to + * text fields by using the TextField.styleSheet property and the + * StyleSheet class. You can use CSS to style built-in HTML tags, define new + * formatting tags, or apply styles. You can assign HTML formatted text, which + * optionally uses CSS styles, directly to a text field. HTML text that you + * assign to a text field can contain embedded media(movie clips, SWF files, + * GIF files, PNG files, and JPEG files). The text wraps around the embedded + * media in the same way that a web browser wraps text around media embedded + * in an HTML document.

+ * + *

Flash Player supports a subset of HTML tags that you can use to format + * text. See the list of supported HTML tags in the description of the + * htmlText property.

+ * + * @event change Dispatched after a control value is + * modified, unlike the + * textInput event, which is + * dispatched before the value is modified. + * Unlike the W3C DOM Event Model version of + * the change event, which + * dispatches the event only after the + * control loses focus, the ActionScript 3.0 + * version of the change event + * is dispatched any time the control + * changes. For example, if a user types text + * into a text field, a change + * event is dispatched after every keystroke. + * @event link Dispatched when a user clicks a hyperlink + * in an HTML-enabled text field, where the + * URL begins with "event:". The remainder of + * the URL after "event:" is placed in the + * text property of the LINK event. + * + *

Note: The default behavior, + * adding the text to the text field, occurs + * only when Flash Player generates the + * event, which in this case happens when a + * user attempts to input text. You cannot + * put text into a text field by sending it + * textInput events.

+ * @event scroll Dispatched by a TextField object + * after the user scrolls. + * @event textInput Flash Player dispatches the + * textInput event when a user + * enters one or more characters of text. + * Various text input methods can generate + * this event, including standard keyboards, + * input method editors(IMEs), voice or + * speech recognition systems, and even the + * act of pasting plain text with no + * formatting or style information. + * @event textInteractionModeChange Flash Player dispatches the + * textInteractionModeChange + * event when a user changes the interaction + * mode of a text field. for example on + * Android, one can toggle from NORMAL mode + * to SELECTION mode using context menu + * options + */ +class TextField extends DisplayObject +{ + private _bottomScrollV:number; + private _caretIndex:number; + private _length:number; + private _maxScrollH:number; + private _maxScrollV:number; + private _numLines:number; + private _selectionBeginIndex:number; + private _selectionEndIndex:number; + private _text:string = ""; + private _textHeight:number; + private _textInteractionMode:TextInteractionMode; + private _textWidth:number; + + private _charBoundaries:Rectangle; + private _charIndexAtPoint:number; + private _firstCharInParagraph:number; + private _imageReference:DisplayObject + private _lineIndexAtPoint:number; + private _lineIndexOfChar:number; + private _lineLength:number; + private _lineMetrics:TextLineMetrics; + private _lineOffset:number; + private _lineText:string; + private _paragraphLength:number; + private _textFormat:TextFormat; + + /** + * When set to true and the text field is not in focus, Flash + * Player highlights the selection in the text field in gray. When set to + * false and the text field is not in focus, Flash Player does + * not highlight the selection in the text field. + * + * @default false + */ + public alwaysShowSelection:boolean + + /** + * The type of anti-aliasing used for this text field. Use + * flash.text.AntiAliasType constants for this property. You can + * control this setting only if the font is embedded(with the + * embedFonts property set to true). The default + * setting is flash.text.AntiAliasType.NORMAL. + * + *

To set values for this property, use the following string values:

+ */ + public antiAliasType:AntiAliasType; + + /** + * Controls automatic sizing and alignment of text fields. Acceptable values + * for the TextFieldAutoSize constants: + * TextFieldAutoSize.NONE(the default), + * TextFieldAutoSize.LEFT, TextFieldAutoSize.RIGHT, + * and TextFieldAutoSize.CENTER. + * + *

If autoSize is set to TextFieldAutoSize.NONE + * (the default) no resizing occurs.

+ * + *

If autoSize is set to TextFieldAutoSize.LEFT, + * the text is treated as left-justified text, meaning that the left margin + * of the text field remains fixed and any resizing of a single line of the + * text field is on the right margin. If the text includes a line break(for + * example, "\n" or "\r"), the bottom is also + * resized to fit the next line of text. If wordWrap is also set + * to true, only the bottom of the text field is resized and the + * right side remains fixed.

+ * + *

If autoSize is set to + * TextFieldAutoSize.RIGHT, the text is treated as + * right-justified text, meaning that the right margin of the text field + * remains fixed and any resizing of a single line of the text field is on + * the left margin. If the text includes a line break(for example, + * "\n" or "\r"), the bottom is also resized to fit the next + * line of text. If wordWrap is also set to true, + * only the bottom of the text field is resized and the left side remains + * fixed.

+ * + *

If autoSize is set to + * TextFieldAutoSize.CENTER, the text is treated as + * center-justified text, meaning that any resizing of a single line of the + * text field is equally distributed to both the right and left margins. If + * the text includes a line break(for example, "\n" or + * "\r"), the bottom is also resized to fit the next line of + * text. If wordWrap is also set to true, only the + * bottom of the text field is resized and the left and right sides remain + * fixed.

+ * + * @throws ArgumentError The autoSize specified is not a member + * of flash.text.TextFieldAutoSize. + */ + public autoSize:TextFieldAutoSize; + + /** + * Specifies whether the text field has a background fill. If + * true, the text field has a background fill. If + * false, the text field has no background fill. Use the + * backgroundColor property to set the background color of a + * text field. + * + * @default false + */ + public background:boolean; + + /** + * The color of the text field background. The default value is + * 0xFFFFFF(white). This property can be retrieved or set, even + * if there currently is no background, but the color is visible only if the + * text field has the background property set to + * true. + */ + public backgroundColor:number /*int*/; + + /** + * Specifies whether the text field has a border. If true, the + * text field has a border. If false, the text field has no + * border. Use the borderColor property to set the border color. + * + * @default false + */ + public border:boolean; + + /** + * The color of the text field border. The default value is + * 0x000000(black). This property can be retrieved or set, even + * if there currently is no border, but the color is visible only if the text + * field has the border property set to true. + */ + public borderColor:number /*int*/; + + /** + * An integer(1-based index) that indicates the bottommost line that is + * currently visible in the specified text field. Think of the text field as + * a window onto a block of text. The scrollV property is the + * 1-based index of the topmost visible line in the window. + * + *

All the text between the lines indicated by scrollV and + * bottomScrollV is currently visible in the text field.

+ */ + public get bottomScrollV():number /*int*/ + { + return this._bottomScrollV; + } + + /** + * The index of the insertion point(caret) position. If no insertion point + * is displayed, the value is the position the insertion point would be if + * you restored focus to the field(typically where the insertion point last + * was, or 0 if the field has not had focus). + * + *

Selection span indexes are zero-based(for example, the first position + * is 0, the second position is 1, and so on).

+ */ + public get caretIndex():number /*int*/ + { + return this._caretIndex; + } + + /** + * A Boolean value that specifies whether extra white space(spaces, line + * breaks, and so on) in a text field with HTML text is removed. The default + * value is false. The condenseWhite property only + * affects text set with the htmlText property, not the + * text property. If you set text with the text + * property, condenseWhite is ignored. + * + *

If condenseWhite is set to true, use standard + * HTML commands such as
and

to place line + * breaks in the text field.

+ * + *

Set the condenseWhite property before setting the + * htmlText property.

+ */ + public condenseWhite:boolean; + + /** + * Specifies the format applied to newly inserted text, such as text entered + * by a user or text inserted with the replaceSelectedText() + * method. + * + *

Note: When selecting characters to be replaced with + * setSelection() and replaceSelectedText(), the + * defaultTextFormat will be applied only if the text has been + * selected up to and including the last character. Here is an example:

+ *
 public my_txt:TextField new TextField();
+	 * my_txt.text = "Flash Macintosh version"; public my_fmt:TextFormat = new
+	 * TextFormat(); my_fmt.color = 0xFF0000; my_txt.defaultTextFormat = my_fmt;
+	 * my_txt.setSelection(6,15); // partial text selected - defaultTextFormat
+	 * not applied my_txt.setSelection(6,23); // text selected to end -
+	 * defaultTextFormat applied my_txt.replaceSelectedText("Windows version");
+	 * 
+ * + *

When you access the defaultTextFormat property, the + * returned TextFormat object has all of its properties defined. No property + * is null.

+ * + *

Note: You can't set this property if a style sheet is applied to + * the text field.

+ * + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + public defaultTextFormat:TextFormat; + + /** + * Specifies whether the text field is a password text field. If the value of + * this property is true, the text field is treated as a + * password text field and hides the input characters using asterisks instead + * of the actual characters. If false, the text field is not + * treated as a password text field. When password mode is enabled, the Cut + * and Copy commands and their corresponding keyboard shortcuts will not + * function. This security mechanism prevents an unscrupulous user from using + * the shortcuts to discover a password on an unattended computer. + * + * @default false + */ + public displayAsPassword:boolean; + + /** + * Specifies whether to render by using embedded font outlines. If + * false, Flash Player renders the text field by using device + * fonts. + * + *

If you set the embedFonts property to true + * for a text field, you must specify a font for that text by using the + * font property of a TextFormat object applied to the text + * field. If the specified font is not embedded in the SWF file, the text is + * not displayed.

+ * + * @default false + */ + public embedFonts:boolean; + + /** + * The type of grid fitting used for this text field. This property applies + * only if the flash.text.AntiAliasType property of the text + * field is set to flash.text.AntiAliasType.ADVANCED. + * + *

The type of grid fitting used determines whether Flash Player forces + * strong horizontal and vertical lines to fit to a pixel or subpixel grid, + * or not at all.

+ * + *

For the flash.text.GridFitType property, you can use the + * following string values:

+ * + * @default pixel + */ + public gridFitType:GridFitType; + + /** + * Contains the HTML representation of the text field contents. + * + *

Flash Player supports the following HTML tags:

+ * + *

Flash Player and AIR also support explicit character codes, such as + * &(ASCII ampersand) and €(Unicode € symbol).

+ */ + public htmlText:string; + + /** + * The number of characters in a text field. A character such as tab + * (\t) counts as one character. + */ + public get length():number /*int*/ + { + return this._length; + } + + /** + * The maximum number of characters that the text field can contain, as + * entered by a user. A script can insert more text than + * maxChars allows; the maxChars property indicates + * only how much text a user can enter. If the value of this property is + * 0, a user can enter an unlimited amount of text. + * + * @default 0 + */ + public maxChars:number /*int*/; + + /** + * The maximum value of scrollH. + */ + public maxScrollH():number /*int*/ + { + return this._maxScrollH; + } + + /** + * The maximum value of scrollV. + */ + public maxScrollV():number /*int*/ + { + return this._maxScrollV; + } + + /** + * A Boolean value that indicates whether Flash Player automatically scrolls + * multiline text fields when the user clicks a text field and rolls the + * mouse wheel. By default, this value is true. This property is + * useful if you want to prevent mouse wheel scrolling of text fields, or + * implement your own text field scrolling. + */ + public mouseWheelEnabled:boolean; + + /** + * Indicates whether field is a multiline text field. If the value is + * true, the text field is multiline; if the value is + * false, the text field is a single-line text field. In a field + * of type TextFieldType.INPUT, the multiline value + * determines whether the Enter key creates a new line(a value + * of false, and the Enter key is ignored). If you + * paste text into a TextField with a multiline + * value of false, newlines are stripped out of the text. + * + * @default false + */ + public multiline:boolean; + + /** + * Defines the number of text lines in a multiline text field. If + * wordWrap property is set to true, the number of + * lines increases when text wraps. + */ + public get numLines():number /*int*/ + { + return this._numLines; + } + + /** + * Indicates the set of characters that a user can enter into the text field. + * If the value of the restrict property is null, + * you can enter any character. If the value of the restrict + * property is an empty string, you cannot enter any character. If the value + * of the restrict property is a string of characters, you can + * enter only characters in the string into the text field. The string is + * scanned from left to right. You can specify a range by using the hyphen + * (-) character. Only user interaction is restricted; a script can put any + * text into the text field. This property does + * not synchronize with the Embed font options in the Property inspector. + * + *

If the string begins with a caret(^) character, all characters are + * initially accepted and succeeding characters in the string are excluded + * from the set of accepted characters. If the string does not begin with a + * caret(^) character, no characters are initially accepted and succeeding + * characters in the string are included in the set of accepted + * characters.

+ * + *

The following example allows only uppercase characters, spaces, and + * numbers to be entered into a text field:

+ *
 my_txt.restrict = "A-Z 0-9"; 
+ * + *

The following example includes all characters, but excludes lowercase + * letters:

+ *
 my_txt.restrict = "^a-z"; 
+ * + *

You can use a backslash to enter a ^ or - verbatim. The accepted + * backslash sequences are \-, \^ or \\. The backslash must be an actual + * character in the string, so when specified in ActionScript, a double + * backslash must be used. For example, the following code includes only the + * dash(-) and caret(^):

+ *
 my_txt.restrict = "\\-\\^"; 
+ * + *

The ^ can be used anywhere in the string to toggle between including + * characters and excluding characters. The following code includes only + * uppercase letters, but excludes the uppercase letter Q:

+ *
 my_txt.restrict = "A-Z^Q"; 
+ * + *

You can use the \u escape sequence to construct + * restrict strings. The following code includes only the + * characters from ASCII 32(space) to ASCII 126(tilde).

+ *
 my_txt.restrict = "\u0020-\u007E"; 
+ * + * @default null + */ + public restrict:string; + + /** + * The current horizontal scrolling position. If the scrollH + * property is 0, the text is not horizontally scrolled. This property value + * is an integer that represents the horizontal position in pixels. + * + *

The units of horizontal scrolling are pixels, whereas the units of + * vertical scrolling are lines. Horizontal scrolling is measured in pixels + * because most fonts you typically use are proportionally spaced; that is, + * the characters can have different widths. Flash Player performs vertical + * scrolling by line because users usually want to see a complete line of + * text rather than a partial line. Even if a line uses multiple fonts, the + * height of the line adjusts to fit the largest font in use.

+ * + *

Note: The scrollH property is zero-based, not + * 1-based like the scrollV vertical scrolling property.

+ */ + public scrollH:number; + + /** + * The vertical position of text in a text field. The scrollV + * property is useful for directing users to a specific paragraph in a long + * passage, or creating scrolling text fields. + * + *

The units of vertical scrolling are lines, whereas the units of + * horizontal scrolling are pixels. If the first line displayed is the first + * line in the text field, scrollV is set to 1(not 0). Horizontal scrolling + * is measured in pixels because most fonts are proportionally spaced; that + * is, the characters can have different widths. Flash performs vertical + * scrolling by line because users usually want to see a complete line of + * text rather than a partial line. Even if there are multiple fonts on a + * line, the height of the line adjusts to fit the largest font in use.

+ */ + public scrollV:number; + + /** + * A Boolean value that indicates whether the text field is selectable. The + * value true indicates that the text is selectable. The + * selectable property controls whether a text field is + * selectable, not whether a text field is editable. A dynamic text field can + * be selectable even if it is not editable. If a dynamic text field is not + * selectable, the user cannot select its text. + * + *

If selectable is set to false, the text in + * the text field does not respond to selection commands from the mouse or + * keyboard, and the text cannot be copied with the Copy command. If + * selectable is set to true, the text in the text + * field can be selected with the mouse or keyboard, and the text can be + * copied with the Copy command. You can select text this way even if the + * text field is a dynamic text field instead of an input text field.

+ * + * @default true + */ + public selectable:boolean; + + /** + * The zero-based character index value of the first character in the current + * selection. For example, the first character is 0, the second character is + * 1, and so on. If no text is selected, this property is the value of + * caretIndex. + */ + public get selectionBeginIndex():number /*int*/ + { + return this._selectionBeginIndex; + } + + /** + * The zero-based character index value of the last character in the current + * selection. For example, the first character is 0, the second character is + * 1, and so on. If no text is selected, this property is the value of + * caretIndex. + */ + public get selectionEndIndex():number /*int*/ + { + return this._selectionEndIndex; + } + + /** + * The sharpness of the glyph edges in this text field. This property applies + * only if the flash.text.AntiAliasType property of the text + * field is set to flash.text.AntiAliasType.ADVANCED. The range + * for sharpness is a number from -400 to 400. If you attempt to + * set sharpness to a value outside that range, Flash sets the + * property to the nearest value in the range(either -400 or 400). + * + * @default 0 + */ + public sharpness:number; + + /** + * Attaches a style sheet to the text field. For information on creating + * style sheets, see the StyleSheet class and the ActionScript 3.0 + * Developer's Guide. + * + *

You can change the style sheet associated with a text field at any + * time. If you change the style sheet in use, the text field is redrawn with + * the new style sheet. You can set the style sheet to null or + * undefined to remove the style sheet. If the style sheet in + * use is removed, the text field is redrawn without a style sheet.

+ * + *

Note: If the style sheet is removed, the contents of both + * TextField.text and TextField.htmlText change to + * incorporate the formatting previously applied by the style sheet. To + * preserve the original TextField.htmlText contents without the + * formatting, save the value in a variable before removing the style + * sheet.

+ */ + public styleSheet:StyleSheet; + + /** + * A string that is the current text in the text field. Lines are separated + * by the carriage return character('\r', ASCII 13). This + * property contains unformatted text in the text field, without HTML tags. + * + *

To get the text in HTML form, use the htmlText + * property.

+ */ + public get text():string + { + return this._text; + } + + public set text(value:string) + { + if (this._text == value) + return; + + this._text = value; + } + + /** + * The color of the text in a text field, in hexadecimal format. The + * hexadecimal color system uses six digits to represent color values. Each + * digit has 16 possible values or characters. The characters range from 0-9 + * and then A-F. For example, black is 0x000000; white is + * 0xFFFFFF. + * + * @default 0(0x000000) + */ + public textColor:number /*int*/; + + /** + * The height of the text in pixels. + */ + public get textHeight():number + { + return this._textHeight; + } + + /** + * The interaction mode property, Default value is + * TextInteractionMode.NORMAL. On mobile platforms, the normal mode implies + * that the text can be scrolled but not selected. One can switch to the + * selectable mode through the in-built context menu on the text field. On + * Desktop, the normal mode implies that the text is in scrollable as well as + * selection mode. + */ + public get textInteractionMode():TextInteractionMode + { + return this._textInteractionMode; + } + + /** + * The width of the text in pixels. + */ + public get textWidth():number + { + return this._textWidth; + } + + /** + * The thickness of the glyph edges in this text field. This property applies + * only when AntiAliasType is set to + * AntiAliasType.ADVANCED. + * + *

The range for thickness is a number from -200 to 200. If + * you attempt to set thickness to a value outside that range, + * the property is set to the nearest value in the range(either -200 or + * 200).

+ * + * @default 0 + */ + public thickness:number; + + /** + * The type of the text field. Either one of the following TextFieldType + * constants: TextFieldType.DYNAMIC, which specifies a dynamic + * text field, which a user cannot edit, or TextFieldType.INPUT, + * which specifies an input text field, which a user can edit. + * + * @default dynamic + * @throws ArgumentError The type specified is not a member of + * flash.text.TextFieldType. + */ + public type:TextFieldType; + + /** + * Specifies whether to copy and paste the text formatting along with the + * text. When set to true, Flash Player copies and pastes + * formatting(such as alignment, bold, and italics) when you copy and paste + * between text fields. Both the origin and destination text fields for the + * copy and paste procedure must have useRichTextClipboard set + * to true. The default value is false. + */ + public useRichTextClipboard:boolean; + + /** + * A Boolean value that indicates whether the text field has word wrap. If + * the value of wordWrap is true, the text field + * has word wrap; if the value is false, the text field does not + * have word wrap. The default value is false. + */ + public wordWrap:boolean; + + /** + * Creates a new TextField instance. After you create the TextField instance, + * call the addChild() or addChildAt() method of + * the parent DisplayObjectContainer object to add the TextField instance to + * the display list. + * + *

The default size for a text field is 100 x 100 pixels.

+ */ + constructor() + { + super(); + } + + /** + * Appends the string specified by the newText parameter to the + * end of the text of the text field. This method is more efficient than an + * addition assignment(+=) on a text property + * (such as someTextField.text += moreText), particularly for a + * text field that contains a significant amount of content. + * + * @param newText The string to append to the existing text. + */ + public appendText(newText:string) + { + //TODO + } + + /** + * Returns a rectangle that is the bounding box of the character. + * + * @param charIndex The zero-based index value for the character(for + * example, the first position is 0, the second position is + * 1, and so on). + * @return A rectangle with x and y minimum and + * maximum values defining the bounding box of the character. + */ + public getCharBoundaries(charIndex:number):Rectangle + { + return this._charBoundaries; + } + + /** + * Returns the zero-based index value of the character at the point specified + * by the x and y parameters. + * + * @param x The x coordinate of the character. + * @param y The y coordinate of the character. + * @return The zero-based index value of the character(for example, the + * first position is 0, the second position is 1, and so on). Returns + * -1 if the point is not over any character. + */ + public getCharIndexAtPoint(x:number, y:number):number /*int*/ + { + return this._charIndexAtPoint; + } + + /** + * Given a character index, returns the index of the first character in the + * same paragraph. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return The zero-based index value of the first character in the same + * paragraph. + * @throws RangeError The character index specified is out of range. + */ + public getFirstCharInParagraph(charIndex:number /*int*/):number /*int*/ + { + return this._firstCharInParagraph; + } + + /** + * Returns a DisplayObject reference for the given id, for an + * image or SWF file that has been added to an HTML-formatted text field by + * using an tag. The tag is in the + * following format: + * + *

 

+ * + * @param id The id to match(in the id attribute + * of the tag). + * @return The display object corresponding to the image or SWF file with the + * matching id attribute in the tag + * of the text field. For media loaded from an external source, this + * object is a Loader object, and, once loaded, the media object is a + * child of that Loader object. For media embedded in the SWF file, + * it is the loaded object. If no tag with the + * matching id exists, the method returns + * null. + */ + public getImageReference(id:string):DisplayObject + { + return this._imageReference; + } + + /** + * Returns the zero-based index value of the line at the point specified by + * the x and y parameters. + * + * @param x The x coordinate of the line. + * @param y The y coordinate of the line. + * @return The zero-based index value of the line(for example, the first + * line is 0, the second line is 1, and so on). Returns -1 if the + * point is not over any line. + */ + public getLineIndexAtPoint(x:number, y:number):number /*int*/ + { + return this._lineIndexAtPoint; + } + + /** + * Returns the zero-based index value of the line containing the character + * specified by the charIndex parameter. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return The zero-based index value of the line. + * @throws RangeError The character index specified is out of range. + */ + public getLineIndexOfChar(charIndex:number /*int*/):number /*int*/ + { + return this._lineIndexOfChar; + } + + /** + * Returns the number of characters in a specific text line. + * + * @param lineIndex The line number for which you want the length. + * @return The number of characters in the line. + * @throws RangeError The line number specified is out of range. + */ + public getLineLength(lineIndex:number /*int*/):number /*int*/ + { + return this._lineLength; + } + + /** + * Returns metrics information about a given text line. + * + * @param lineIndex The line number for which you want metrics information. + * @return A TextLineMetrics object. + * @throws RangeError The line number specified is out of range. + */ + public getLineMetrics(lineIndex:number /*int*/):TextLineMetrics + { + return this._lineMetrics; + } + + /** + * Returns the character index of the first character in the line that the + * lineIndex parameter specifies. + * + * @param lineIndex The zero-based index value of the line(for example, the + * first line is 0, the second line is 1, and so on). + * @return The zero-based index value of the first character in the line. + * @throws RangeError The line number specified is out of range. + */ + public getLineOffset(lineIndex:number /*int*/):number /*int*/ + { + return this._lineOffset; + } + + /** + * Returns the text of the line specified by the lineIndex + * parameter. + * + * @param lineIndex The zero-based index value of the line(for example, the + * first line is 0, the second line is 1, and so on). + * @return The text string contained in the specified line. + * @throws RangeError The line number specified is out of range. + */ + public getLineText(lineIndex:number /*int*/):string + { + return this._lineText; + } + + /** + * Given a character index, returns the length of the paragraph containing + * the given character. The length is relative to the first character in the + * paragraph(as returned by getFirstCharInParagraph()), not to + * the character index passed in. + * + * @param charIndex The zero-based index value of the character(for example, + * the first character is 0, the second character is 1, and + * so on). + * @return Returns the number of characters in the paragraph. + * @throws RangeError The character index specified is out of range. + */ + public getParagraphLength(charIndex:number /*int*/):number /*int*/ + { + return this._paragraphLength; + } + + /** + * Returns a TextFormat object that contains formatting information for the + * range of text that the beginIndex and endIndex + * parameters specify. Only properties that are common to the entire text + * specified are set in the resulting TextFormat object. Any property that is + * mixed, meaning that it has different values at different points in + * the text, has a value of null. + * + *

If you do not specify values for these parameters, this method is + * applied to all the text in the text field.

+ * + *

The following table describes three possible usages:

+ * + * @return The TextFormat object that represents the formatting properties + * for the specified text. + * @throws RangeError The beginIndex or endIndex + * specified is out of range. + */ + public getTextFormat(beginIndex:number /*int*/ = -1, endIndex:number /*int*/ = -1):TextFormat + { + return this._textFormat; + } + + /** + * Replaces the current selection with the contents of the value + * parameter. The text is inserted at the position of the current selection, + * using the current default character format and default paragraph format. + * The text is not treated as HTML. + * + *

You can use the replaceSelectedText() method to insert and + * delete text without disrupting the character and paragraph formatting of + * the rest of the text.

+ * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + * @param value The string to replace the currently selected text. + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + public replaceSelectedText(value:string) + { + + } + + /** + * Replaces the range of characters that the beginIndex and + * endIndex parameters specify with the contents of the + * newText parameter. As designed, the text from + * beginIndex to endIndex-1 is replaced. + * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + * @param beginIndex The zero-based index value for the start position of the + * replacement range. + * @param endIndex The zero-based index position of the first character + * after the desired text span. + * @param newText The text to use to replace the specified range of + * characters. + * @throws Error This method cannot be used on a text field with a style + * sheet. + */ + public replaceText(beginIndex:number /*int*/, endIndex:number /*int*/, newText:string) + { + + } + + /** + * Sets as selected the text designated by the index values of the first and + * last characters, which are specified with the beginIndex and + * endIndex parameters. If the two parameter values are the + * same, this method sets the insertion point, as if you set the + * caretIndex property. + * + * @param beginIndex The zero-based index value of the first character in the + * selection(for example, the first character is 0, the + * second character is 1, and so on). + * @param endIndex The zero-based index value of the last character in the + * selection. + */ + public setSelection(beginIndex:number /*int*/, endIndex:number /*int*/) + { + + } + + /** + * Applies the text formatting that the format parameter + * specifies to the specified text in a text field. The value of + * format must be a TextFormat object that specifies the desired + * text formatting changes. Only the non-null properties of + * format are applied to the text field. Any property of + * format that is set to null is not applied. By + * default, all of the properties of a newly created TextFormat object are + * set to null. + * + *

Note: This method does not work if a style sheet is applied to + * the text field.

+ * + *

The setTextFormat() method changes the text formatting + * applied to a range of characters or to the entire body of text in a text + * field. To apply the properties of format to all text in the text field, do + * not specify values for beginIndex and endIndex. + * To apply the properties of the format to a range of text, specify values + * for the beginIndex and the endIndex parameters. + * You can use the length property to determine the index + * values.

+ * + *

The two types of formatting information in a TextFormat object are + * character level formatting and paragraph level formatting. Each character + * in a text field can have its own character formatting settings, such as + * font name, font size, bold, and italic.

+ * + *

For paragraphs, the first character of the paragraph is examined for + * the paragraph formatting settings for the entire paragraph. Examples of + * paragraph formatting settings are left margin, right margin, and + * indentation.

+ * + *

Any text inserted manually by the user, or replaced by the + * replaceSelectedText() method, receives the default text field + * formatting for new text, and not the formatting specified for the text + * insertion point. To set the default formatting for new text, use + * defaultTextFormat.

+ * + * @param format A TextFormat object that contains character and paragraph + * formatting information. + * @throws Error This method cannot be used on a text field with a style + * sheet. + * @throws RangeError The beginIndex or endIndex + * specified is out of range. + */ + public setTextFormat(format:TextFormat, beginIndex:number /*int*/ = -1, endIndex:number /*int*/ = -1) + { + + } + + /** + * Returns true if an embedded font is available with the specified + * fontName and fontStyle where + * Font.fontType is flash.text.FontType.EMBEDDED. + * Starting with Flash Player 10, two kinds of embedded fonts can appear in a + * SWF file. Normal embedded fonts are only used with TextField objects. CFF + * embedded fonts are only used with the flash.text.engine classes. The two + * types are distinguished by the fontType property of the + * Font class, as returned by the enumerateFonts() + * function. + * + *

TextField cannot use a font of type EMBEDDED_CFF. If + * embedFonts is set to true and the only font + * available at run time with the specified name and style is of type + * EMBEDDED_CFF, Flash Player fails to render the text, as if no + * embedded font were available with the specified name and style.

+ * + *

If both EMBEDDED and EMBEDDED_CFF fonts are + * available with the same name and style, the EMBEDDED font is + * selected and text renders with the EMBEDDED font.

+ * + * @param fontName The name of the embedded font to check. + * @param fontStyle Specifies the font style to check. Use + * flash.text.FontStyle + * @return true if a compatible embedded font is available, + * otherwise false. + * @throws ArgumentError The fontStyle specified is not a member + * of flash.text.FontStyle. + */ + public static isFontCompatible(fontName:string, fontStyle:string):boolean + { + return false; + } +} + +export = TextField; \ No newline at end of file diff --git a/lib/errors/AbstractMethodError.js b/lib/errors/AbstractMethodError.js new file mode 100755 index 00000000..e803c4cd --- /dev/null +++ b/lib/errors/AbstractMethodError.js @@ -0,0 +1,30 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +/** +* AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden +* by a concrete subclass. +*/ +var AbstractMethodError = (function (_super) { + __extends(AbstractMethodError, _super); + /** + * Create a new AbstractMethodError. + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + function AbstractMethodError(message, id) { + if (typeof message === "undefined") { message = null; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, message || "An abstract method was called! Either an instance of an abstract class was created, or an abstract method was not overridden by the subclass.", id); + } + return AbstractMethodError; +})(Error); + +module.exports = AbstractMethodError; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy9BYnN0cmFjdE1ldGhvZEVycm9yLnRzIl0sIm5hbWVzIjpbIkFic3RyYWN0TWV0aG9kRXJyb3IiLCJBYnN0cmFjdE1ldGhvZEVycm9yLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEOzs7RUFHRztBQUNIO0lBQWtDQSxzQ0FBS0E7SUFPdENBOzs7O01BREdBO0lBQ0hBLDZCQUFZQSxPQUFxQkEsRUFBRUEsRUFBYUE7UUFBcENDLHNDQUFBQSxPQUFPQSxHQUFVQSxJQUFJQTtBQUFBQSxRQUFFQSxpQ0FBQUEsRUFBRUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFFL0NBLFdBQU1BLE9BQUFBLE9BQU9BLElBQUlBLCtJQUErSUEsRUFBRUEsRUFBRUEsQ0FBQ0E7SUFDdEtBLENBQUNBO0lBQ0ZELDJCQUFDQTtBQUFEQSxDQUFDQSxFQVhpQyxLQUFLLEVBV3RDOztBQUVELG9DQUE2QixDQUFBIiwiZmlsZSI6ImVycm9ycy9BYnN0cmFjdE1ldGhvZEVycm9yLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVycm9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvRXJyb3JcIik7XG5cbi8qKlxuICogQWJzdHJhY3RNZXRob2RFcnJvciBpcyB0aHJvd24gd2hlbiBhbiBhYnN0cmFjdCBtZXRob2QgaXMgY2FsbGVkLiBUaGUgbWV0aG9kIGluIHF1ZXN0aW9uIHNob3VsZCBiZSBvdmVycmlkZGVuXG4gKiBieSBhIGNvbmNyZXRlIHN1YmNsYXNzLlxuICovXG5jbGFzcyBBYnN0cmFjdE1ldGhvZEVycm9yIGV4dGVuZHMgRXJyb3Jcbntcblx0LyoqXG5cdCAqIENyZWF0ZSBhIG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yLlxuXHQgKiBAcGFyYW0gbWVzc2FnZSBBbiBvcHRpb25hbCBtZXNzYWdlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGVycm9yIG1lc3NhZ2UuXG5cdCAqIEBwYXJhbSBpZCBUaGUgaWQgb2YgdGhlIGVycm9yLlxuXHQgKi9cblx0Y29uc3RydWN0b3IobWVzc2FnZTpzdHJpbmcgPSBudWxsLCBpZDpudW1iZXIgPSAwKVxuXHR7XG5cdFx0c3VwZXIobWVzc2FnZSB8fCBcIkFuIGFic3RyYWN0IG1ldGhvZCB3YXMgY2FsbGVkISBFaXRoZXIgYW4gaW5zdGFuY2Ugb2YgYW4gYWJzdHJhY3QgY2xhc3Mgd2FzIGNyZWF0ZWQsIG9yIGFuIGFic3RyYWN0IG1ldGhvZCB3YXMgbm90IG92ZXJyaWRkZW4gYnkgdGhlIHN1YmNsYXNzLlwiLCBpZCk7XG5cdH1cbn1cblxuZXhwb3J0ID0gQWJzdHJhY3RNZXRob2RFcnJvcjsiXX0= \ No newline at end of file diff --git a/lib/errors/AbstractMethodError.ts b/lib/errors/AbstractMethodError.ts new file mode 100644 index 00000000..c4737416 --- /dev/null +++ b/lib/errors/AbstractMethodError.ts @@ -0,0 +1,20 @@ +import Error = require("awayjs-core/lib/errors/Error"); + +/** + * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden + * by a concrete subclass. + */ +class AbstractMethodError extends Error +{ + /** + * Create a new AbstractMethodError. + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + constructor(message:string = null, id:number = 0) + { + super(message || "An abstract method was called! Either an instance of an abstract class was created, or an abstract method was not overridden by the subclass.", id); + } +} + +export = AbstractMethodError; \ No newline at end of file diff --git a/lib/errors/ArgumentError.js b/lib/errors/ArgumentError.js new file mode 100755 index 00000000..a4f17523 --- /dev/null +++ b/lib/errors/ArgumentError.js @@ -0,0 +1,31 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +/** +* AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden +* by a concrete subclass. +*/ +var ArgumentError = (function (_super) { + __extends(ArgumentError, _super); + /** + * Create a new ArgumentError. + * + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + function ArgumentError(message, id) { + if (typeof message === "undefined") { message = null; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, message || "ArgumentError", id); + } + return ArgumentError; +})(Error); + +module.exports = ArgumentError; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy9Bcmd1bWVudEVycm9yLnRzIl0sIm5hbWVzIjpbIkFyZ3VtZW50RXJyb3IiLCJBcmd1bWVudEVycm9yLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEOzs7RUFHRztBQUNIO0lBQTRCQSxnQ0FBS0E7SUFRaENBOzs7OztNQURHQTtJQUNIQSx1QkFBWUEsT0FBcUJBLEVBQUVBLEVBQWFBO1FBQXBDQyxzQ0FBQUEsT0FBT0EsR0FBVUEsSUFBSUE7QUFBQUEsUUFBRUEsaUNBQUFBLEVBQUVBLEdBQVVBLENBQUNBO0FBQUFBLFFBRS9DQSxXQUFNQSxPQUFBQSxPQUFPQSxJQUFJQSxlQUFlQSxFQUFFQSxFQUFFQSxDQUFDQTtJQUN0Q0EsQ0FBQ0E7SUFDRkQscUJBQUNBO0FBQURBLENBQUNBLEVBWjJCLEtBQUssRUFZaEM7O0FBRUQsOEJBQXVCLENBQUEiLCJmaWxlIjoiZXJyb3JzL0FyZ3VtZW50RXJyb3IuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXJyb3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9FcnJvclwiKTtcblxuLyoqXG4gKiBBYnN0cmFjdE1ldGhvZEVycm9yIGlzIHRocm93biB3aGVuIGFuIGFic3RyYWN0IG1ldGhvZCBpcyBjYWxsZWQuIFRoZSBtZXRob2QgaW4gcXVlc3Rpb24gc2hvdWxkIGJlIG92ZXJyaWRkZW5cbiAqIGJ5IGEgY29uY3JldGUgc3ViY2xhc3MuXG4gKi9cbmNsYXNzIEFyZ3VtZW50RXJyb3IgZXh0ZW5kcyBFcnJvclxue1xuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IEFyZ3VtZW50RXJyb3IuXG5cdCAqXG5cdCAqIEBwYXJhbSBtZXNzYWdlIEFuIG9wdGlvbmFsIG1lc3NhZ2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZS5cblx0ICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZXJyb3IuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlOnN0cmluZyA9IG51bGwsIGlkOm51bWJlciA9IDApXG5cdHtcblx0XHRzdXBlcihtZXNzYWdlIHx8IFwiQXJndW1lbnRFcnJvclwiLCBpZCk7XG5cdH1cbn1cblxuZXhwb3J0ID0gQXJndW1lbnRFcnJvcjsiXX0= \ No newline at end of file diff --git a/lib/errors/ArgumentError.ts b/lib/errors/ArgumentError.ts new file mode 100644 index 00000000..125a6f6e --- /dev/null +++ b/lib/errors/ArgumentError.ts @@ -0,0 +1,21 @@ +import Error = require("awayjs-core/lib/errors/Error"); + +/** + * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden + * by a concrete subclass. + */ +class ArgumentError extends Error +{ + /** + * Create a new ArgumentError. + * + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + constructor(message:string = null, id:number = 0) + { + super(message || "ArgumentError", id); + } +} + +export = ArgumentError; \ No newline at end of file diff --git a/lib/errors/CastError.js b/lib/errors/CastError.js new file mode 100755 index 00000000..5a63981a --- /dev/null +++ b/lib/errors/CastError.js @@ -0,0 +1,19 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +var CastError = (function (_super) { + __extends(CastError, _super); + function CastError(message) { + _super.call(this, message); + } + return CastError; +})(Error); + +module.exports = CastError; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy9DYXN0RXJyb3IudHMiXSwibmFtZXMiOlsiQ2FzdEVycm9yIiwiQ2FzdEVycm9yLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQXdCQSw0QkFBS0E7SUFFNUJBLG1CQUFZQSxPQUFjQTtRQUV6QkMsV0FBTUEsT0FBQUEsT0FBT0EsQ0FBQ0E7SUFDZkEsQ0FBQ0E7SUFDRkQsaUJBQUNBO0FBQURBLENBQUNBLEVBTnVCLEtBQUssRUFNNUI7O0FBRUQsMEJBQW1CLENBQUEiLCJmaWxlIjoiZXJyb3JzL0Nhc3RFcnJvci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFcnJvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Vycm9yXCIpO1xuXG5jbGFzcyBDYXN0RXJyb3IgZXh0ZW5kcyBFcnJvclxue1xuXHRjb25zdHJ1Y3RvcihtZXNzYWdlOnN0cmluZylcblx0e1xuXHRcdHN1cGVyKG1lc3NhZ2UpO1xuXHR9XG59XG5cbmV4cG9ydCA9IENhc3RFcnJvcjsiXX0= \ No newline at end of file diff --git a/lib/errors/CastError.ts b/lib/errors/CastError.ts new file mode 100644 index 00000000..61d9e7ab --- /dev/null +++ b/lib/errors/CastError.ts @@ -0,0 +1,11 @@ +import Error = require("awayjs-core/lib/errors/Error"); + +class CastError extends Error +{ + constructor(message:string) + { + super(message); + } +} + +export = CastError; \ No newline at end of file diff --git a/lib/errors/DocumentError.js b/lib/errors/DocumentError.js new file mode 100755 index 00000000..80f853c0 --- /dev/null +++ b/lib/errors/DocumentError.js @@ -0,0 +1,22 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +var DocumentError = (function (_super) { + __extends(DocumentError, _super); + function DocumentError(message, id) { + if (typeof message === "undefined") { message = "DocumentError"; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, message, id); + } + DocumentError.DOCUMENT_DOES_NOT_EXIST = "documentDoesNotExist"; + return DocumentError; +})(Error); + +module.exports = DocumentError; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy9Eb2N1bWVudEVycm9yLnRzIl0sIm5hbWVzIjpbIkRvY3VtZW50RXJyb3IiLCJEb2N1bWVudEVycm9yLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQTRCQSxnQ0FBS0E7SUFJaENBLHVCQUFZQSxPQUFnQ0EsRUFBRUEsRUFBYUE7UUFBL0NDLHNDQUFBQSxPQUFPQSxHQUFVQSxlQUFlQTtBQUFBQSxRQUFFQSxpQ0FBQUEsRUFBRUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFFMURBLFdBQU1BLE9BQUFBLE9BQU9BLEVBQUVBLEVBQUVBLENBQUNBO0lBQ25CQSxDQUFDQTtJQUxERCx3Q0FBK0NBLHNCQUFzQkE7SUFNdEVBLHFCQUFDQTtBQUFEQSxDQUFDQSxFQVIyQixLQUFLLEVBUWhDOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6ImVycm9ycy9Eb2N1bWVudEVycm9yLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVycm9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvRXJyb3JcIik7XG5cbmNsYXNzIERvY3VtZW50RXJyb3IgZXh0ZW5kcyBFcnJvclxue1xuXHRwdWJsaWMgc3RhdGljIERPQ1VNRU5UX0RPRVNfTk9UX0VYSVNUOnN0cmluZyA9IFwiZG9jdW1lbnREb2VzTm90RXhpc3RcIjtcblxuXHRjb25zdHJ1Y3RvcihtZXNzYWdlOnN0cmluZyA9IFwiRG9jdW1lbnRFcnJvclwiLCBpZDpudW1iZXIgPSAwKVxuXHR7XG5cdFx0c3VwZXIobWVzc2FnZSwgaWQpO1xuXHR9XG59XG5cbmV4cG9ydCA9IERvY3VtZW50RXJyb3I7Il19 \ No newline at end of file diff --git a/lib/errors/DocumentError.ts b/lib/errors/DocumentError.ts new file mode 100644 index 00000000..50afe796 --- /dev/null +++ b/lib/errors/DocumentError.ts @@ -0,0 +1,13 @@ +import Error = require("awayjs-core/lib/errors/Error"); + +class DocumentError extends Error +{ + public static DOCUMENT_DOES_NOT_EXIST:string = "documentDoesNotExist"; + + constructor(message:string = "DocumentError", id:number = 0) + { + super(message, id); + } +} + +export = DocumentError; \ No newline at end of file diff --git a/lib/errors/Error.js b/lib/errors/Error.js new file mode 100755 index 00000000..8905d189 --- /dev/null +++ b/lib/errors/Error.js @@ -0,0 +1,69 @@ +var Error = (function () { + function Error(message, id, _name) { + if (typeof message === "undefined") { message = ''; } + if (typeof id === "undefined") { id = 0; } + if (typeof _name === "undefined") { _name = ''; } + this._errorID = 0; + this._messsage = ''; + this._name = ''; + this._messsage = message; + this._name = name; + this._errorID = id; + } + Object.defineProperty(Error.prototype, "message", { + /** + * + * @returns {string} + */ + get: function () { + return this._messsage; + }, + /** + * + * @param value + */ + set: function (value) { + this._messsage = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Error.prototype, "name", { + /** + * + * @returns {string} + */ + get: function () { + return this._name; + }, + /** + * + * @param value + */ + set: function (value) { + this._name = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Error.prototype, "errorID", { + /** + * + * @returns {number} + */ + get: function () { + return this._errorID; + }, + enumerable: true, + configurable: true + }); + return Error; +})(); + +module.exports = Error; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy9FcnJvci50cyJdLCJuYW1lcyI6WyJFcnJvciIsIkVycm9yLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTtJQU9DQSxlQUFZQSxPQUFtQkEsRUFBRUEsRUFBYUEsRUFBRUEsS0FBaUJBO1FBQXJEQyxzQ0FBQUEsT0FBT0EsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEsaUNBQUFBLEVBQUVBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLG9DQUFBQSxLQUFLQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUpqRUEsS0FBUUEsUUFBUUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLEtBQVFBLFNBQVNBLEdBQVVBLEVBQUVBLENBQUNBO1FBQzlCQSxLQUFRQSxLQUFLQSxHQUFVQSxFQUFFQSxDQUFDQTtRQUt6QkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsT0FBT0E7UUFDeEJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBO1FBQ2pCQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxFQUFFQTtJQUVuQkEsQ0FBQ0E7SUFNREQ7UUFBQUE7OztVQURHQTthQUNIQTtZQUdDQSxPQUFPQSxJQUFJQSxDQUFDQSxTQUFTQTtRQUV0QkEsQ0FBQ0E7UUFNREE7OztVQURHQTthQUNIQSxVQUFtQkEsS0FBWUE7WUFHOUJBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLEtBQUtBO1FBRXZCQSxDQUFDQTs7OztBQVhBQTs7SUFpQkRBO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFHQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsS0FBS0E7UUFFbEJBLENBQUNBO1FBTURBOzs7VUFER0E7YUFDSEEsVUFBZ0JBLEtBQVlBO1lBRzNCQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxLQUFLQTtRQUVuQkEsQ0FBQ0E7Ozs7QUFYQUE7O0lBaUJEQTtRQUFBQTs7O1VBREdBO2FBQ0hBO1lBR0NBLE9BQU9BLElBQUlBLENBQUNBLFFBQVFBO1FBRXJCQSxDQUFDQTs7OztBQUFBQSxJQUVGQSxhQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELHNCQUFlLENBQUEiLCJmaWxlIjoiZXJyb3JzL0Vycm9yLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiY2xhc3MgRXJyb3JcbntcblxuXHRwcml2YXRlIF9lcnJvcklEOm51bWJlciA9IDA7ICAgLy9Db250YWlucyB0aGUgcmVmZXJlbmNlIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmljIGVycm9yIG1lc3NhZ2UuXG5cdHByaXZhdGUgX21lc3NzYWdlOnN0cmluZyA9ICcnOyAgLy9Db250YWlucyB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggdGhlIEVycm9yIG9iamVjdC5cblx0cHJpdmF0ZSBfbmFtZTpzdHJpbmcgPSAnJzsgIC8vIENvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBFcnJvciBvYmplY3QuXG5cblx0Y29uc3RydWN0b3IobWVzc2FnZTpzdHJpbmcgPSAnJywgaWQ6bnVtYmVyID0gMCwgX25hbWU6c3RyaW5nID0gJycpXG5cdHtcblxuXHRcdHRoaXMuX21lc3NzYWdlID0gbWVzc2FnZTtcblx0XHR0aGlzLl9uYW1lID0gbmFtZTtcblx0XHR0aGlzLl9lcnJvcklEID0gaWQ7XG5cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfVxuXHQgKi9cblx0cHVibGljIGdldCBtZXNzYWdlKCk6c3RyaW5nXG5cdHtcblxuXHRcdHJldHVybiB0aGlzLl9tZXNzc2FnZTtcblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKi9cblx0cHVibGljIHNldCBtZXNzYWdlKHZhbHVlOnN0cmluZylcblx0e1xuXG5cdFx0dGhpcy5fbWVzc3NhZ2UgPSB2YWx1ZTtcblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG5hbWUoKTpzdHJpbmdcblx0e1xuXG5cdFx0cmV0dXJuIHRoaXMuX25hbWU7XG5cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gdmFsdWVcblx0ICovXG5cdHB1YmxpYyBzZXQgbmFtZSh2YWx1ZTpzdHJpbmcpXG5cdHtcblxuXHRcdHRoaXMuX25hbWUgPSB2YWx1ZTtcblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGVycm9ySUQoKTpudW1iZXJcblx0e1xuXG5cdFx0cmV0dXJuIHRoaXMuX2Vycm9ySUQ7XG5cblx0fVxuXG59XG5cbmV4cG9ydCA9IEVycm9yOyJdfQ== \ No newline at end of file diff --git a/lib/errors/Error.ts b/lib/errors/Error.ts new file mode 100644 index 00000000..8981529d --- /dev/null +++ b/lib/errors/Error.ts @@ -0,0 +1,74 @@ +class Error +{ + + private _errorID:number = 0; //Contains the reference number associated with the specific error message. + private _messsage:string = ''; //Contains the message associated with the Error object. + private _name:string = ''; // Contains the name of the Error object. + + constructor(message:string = '', id:number = 0, _name:string = '') + { + + this._messsage = message; + this._name = name; + this._errorID = id; + + } + + /** + * + * @returns {string} + */ + public get message():string + { + + return this._messsage; + + } + + /** + * + * @param value + */ + public set message(value:string) + { + + this._messsage = value; + + } + + /** + * + * @returns {string} + */ + public get name():string + { + + return this._name; + + } + + /** + * + * @param value + */ + public set name(value:string) + { + + this._name = value; + + } + + /** + * + * @returns {number} + */ + public get errorID():number + { + + return this._errorID; + + } + +} + +export = Error; \ No newline at end of file diff --git a/lib/errors/PartialImplementationError.js b/lib/errors/PartialImplementationError.js new file mode 100755 index 00000000..de6ea26e --- /dev/null +++ b/lib/errors/PartialImplementationError.js @@ -0,0 +1,30 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +/** +* AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden +* by a concrete subclass. +*/ +var PartialImplementationError = (function (_super) { + __extends(PartialImplementationError, _super); + /** + * Create a new AbstractMethodError. + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + function PartialImplementationError(dependency, id) { + if (typeof dependency === "undefined") { dependency = ''; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, "PartialImplementationError - this function is in development. Required Dependency: " + dependency, id); + } + return PartialImplementationError; +})(Error); + +module.exports = PartialImplementationError; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy9QYXJ0aWFsSW1wbGVtZW50YXRpb25FcnJvci50cyJdLCJuYW1lcyI6WyJQYXJ0aWFsSW1wbGVtZW50YXRpb25FcnJvciIsIlBhcnRpYWxJbXBsZW1lbnRhdGlvbkVycm9yLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEOzs7RUFHRztBQUNIO0lBQXlDQSw2Q0FBS0E7SUFPN0NBOzs7O01BREdBO0lBQ0hBLG9DQUFZQSxVQUFzQkEsRUFBRUEsRUFBYUE7UUFBckNDLHlDQUFBQSxVQUFVQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUFFQSxpQ0FBQUEsRUFBRUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFFaERBLFdBQU1BLE9BQUFBLHFGQUFxRkEsR0FBR0EsVUFBVUEsRUFBRUEsRUFBRUEsQ0FBQ0E7SUFDOUdBLENBQUNBO0lBQ0ZELGtDQUFDQTtBQUFEQSxDQUFDQSxFQVh3QyxLQUFLLEVBVzdDOztBQUVELDJDQUFvQyxDQUFBIiwiZmlsZSI6ImVycm9ycy9QYXJ0aWFsSW1wbGVtZW50YXRpb25FcnJvci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFcnJvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Vycm9yXCIpO1xuXG4vKipcbiAqIEFic3RyYWN0TWV0aG9kRXJyb3IgaXMgdGhyb3duIHdoZW4gYW4gYWJzdHJhY3QgbWV0aG9kIGlzIGNhbGxlZC4gVGhlIG1ldGhvZCBpbiBxdWVzdGlvbiBzaG91bGQgYmUgb3ZlcnJpZGRlblxuICogYnkgYSBjb25jcmV0ZSBzdWJjbGFzcy5cbiAqL1xuY2xhc3MgUGFydGlhbEltcGxlbWVudGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvclxue1xuXHQvKipcblx0ICogQ3JlYXRlIGEgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IuXG5cdCAqIEBwYXJhbSBtZXNzYWdlIEFuIG9wdGlvbmFsIG1lc3NhZ2UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgZXJyb3IgbWVzc2FnZS5cblx0ICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgZXJyb3IuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihkZXBlbmRlbmN5OnN0cmluZyA9ICcnLCBpZDpudW1iZXIgPSAwKVxuXHR7XG5cdFx0c3VwZXIoXCJQYXJ0aWFsSW1wbGVtZW50YXRpb25FcnJvciAtIHRoaXMgZnVuY3Rpb24gaXMgaW4gZGV2ZWxvcG1lbnQuIFJlcXVpcmVkIERlcGVuZGVuY3k6IFwiICsgZGVwZW5kZW5jeSwgaWQpO1xuXHR9XG59XG5cbmV4cG9ydCA9IFBhcnRpYWxJbXBsZW1lbnRhdGlvbkVycm9yOyJdfQ== \ No newline at end of file diff --git a/lib/errors/PartialImplementationError.ts b/lib/errors/PartialImplementationError.ts new file mode 100644 index 00000000..456e726c --- /dev/null +++ b/lib/errors/PartialImplementationError.ts @@ -0,0 +1,20 @@ +import Error = require("awayjs-core/lib/errors/Error"); + +/** + * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden + * by a concrete subclass. + */ +class PartialImplementationError extends Error +{ + /** + * Create a new AbstractMethodError. + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + constructor(dependency:string = '', id:number = 0) + { + super("PartialImplementationError - this function is in development. Required Dependency: " + dependency, id); + } +} + +export = PartialImplementationError; \ No newline at end of file diff --git a/lib/errors/RangeError.js b/lib/errors/RangeError.js new file mode 100755 index 00000000..ee90af25 --- /dev/null +++ b/lib/errors/RangeError.js @@ -0,0 +1,31 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); + +/** +* RangeError is thrown when an index is accessed out of range of the number of +* available indices on an Array. +*/ +var RangeError = (function (_super) { + __extends(RangeError, _super); + /** + * Create a new RangeError. + * + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + function RangeError(message, id) { + if (typeof message === "undefined") { message = null; } + if (typeof id === "undefined") { id = 0; } + _super.call(this, message || "RangeError", id); + } + return RangeError; +})(Error); + +module.exports = RangeError; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVycm9ycy9SYW5nZUVycm9yLnRzIl0sIm5hbWVzIjpbIlJhbmdlRXJyb3IiLCJSYW5nZUVycm9yLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEOzs7RUFHRztBQUNIO0lBQXlCQSw2QkFBS0E7SUFRN0JBOzs7OztNQURHQTtJQUNIQSxvQkFBWUEsT0FBcUJBLEVBQUVBLEVBQWFBO1FBQXBDQyxzQ0FBQUEsT0FBT0EsR0FBVUEsSUFBSUE7QUFBQUEsUUFBRUEsaUNBQUFBLEVBQUVBLEdBQVVBLENBQUNBO0FBQUFBLFFBRS9DQSxXQUFNQSxPQUFBQSxPQUFPQSxJQUFJQSxZQUFZQSxFQUFFQSxFQUFFQSxDQUFDQTtJQUNuQ0EsQ0FBQ0E7SUFDRkQsa0JBQUNBO0FBQURBLENBQUNBLEVBWndCLEtBQUssRUFZN0I7O0FBRUQsMkJBQW9CLENBQUEiLCJmaWxlIjoiZXJyb3JzL1JhbmdlRXJyb3IuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXJyb3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9FcnJvclwiKTtcblxuLyoqXG4gKiBSYW5nZUVycm9yIGlzIHRocm93biB3aGVuIGFuIGluZGV4IGlzIGFjY2Vzc2VkIG91dCBvZiByYW5nZSBvZiB0aGUgbnVtYmVyIG9mXG4gKiBhdmFpbGFibGUgaW5kaWNlcyBvbiBhbiBBcnJheS5cbiAqL1xuY2xhc3MgUmFuZ2VFcnJvciBleHRlbmRzIEVycm9yXG57XG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBuZXcgUmFuZ2VFcnJvci5cblx0ICpcblx0ICogQHBhcmFtIG1lc3NhZ2UgQW4gb3B0aW9uYWwgbWVzc2FnZSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlLlxuXHQgKiBAcGFyYW0gaWQgVGhlIGlkIG9mIHRoZSBlcnJvci5cblx0ICovXG5cdGNvbnN0cnVjdG9yKG1lc3NhZ2U6c3RyaW5nID0gbnVsbCwgaWQ6bnVtYmVyID0gMClcblx0e1xuXHRcdHN1cGVyKG1lc3NhZ2UgfHwgXCJSYW5nZUVycm9yXCIsIGlkKTtcblx0fVxufVxuXG5leHBvcnQgPSBSYW5nZUVycm9yOyJdfQ== \ No newline at end of file diff --git a/lib/errors/RangeError.ts b/lib/errors/RangeError.ts new file mode 100644 index 00000000..5ec12559 --- /dev/null +++ b/lib/errors/RangeError.ts @@ -0,0 +1,21 @@ +import Error = require("awayjs-core/lib/errors/Error"); + +/** + * RangeError is thrown when an index is accessed out of range of the number of + * available indices on an Array. + */ +class RangeError extends Error +{ + /** + * Create a new RangeError. + * + * @param message An optional message to override the default error message. + * @param id The id of the error. + */ + constructor(message:string = null, id:number = 0) + { + super(message || "RangeError", id); + } +} + +export = RangeError; \ No newline at end of file diff --git a/lib/events/AssetEvent.js b/lib/events/AssetEvent.js new file mode 100755 index 00000000..26d9ad54 --- /dev/null +++ b/lib/events/AssetEvent.js @@ -0,0 +1,65 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* @class away.events.AssetEvent +*/ +var AssetEvent = (function (_super) { + __extends(AssetEvent, _super); + /** + * + */ + function AssetEvent(type, asset, prevName) { + if (typeof asset === "undefined") { asset = null; } + if (typeof prevName === "undefined") { prevName = null; } + _super.call(this, type); + + this._asset = asset; + this._prevName = prevName || (this._asset ? this._asset.name : null); + } + Object.defineProperty(AssetEvent.prototype, "asset", { + /** + * + */ + get: function () { + return this._asset; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(AssetEvent.prototype, "assetPrevName", { + /** + * + */ + get: function () { + return this._prevName; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + AssetEvent.prototype.clone = function () { + return new AssetEvent(this.type, this.asset, this.assetPrevName); + }; + AssetEvent.ASSET_COMPLETE = "assetComplete"; + + AssetEvent.ASSET_RENAME = 'assetRename'; + + AssetEvent.ASSET_CONFLICT_RESOLVED = 'assetConflictResolved'; + + AssetEvent.TEXTURE_SIZE_ERROR = 'textureSizeError'; + return AssetEvent; +})(Event); + +module.exports = AssetEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9Bc3NldEV2ZW50LnRzIl0sIm5hbWVzIjpbIkFzc2V0RXZlbnQiLCJBc3NldEV2ZW50LmNvbnN0cnVjdG9yIiwiQXNzZXRFdmVudC5jbG9uZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQzJEOztBQUUzRDs7RUFFRztBQUNIO0lBQXlCQSw2QkFBS0E7SUE0QjdCQTs7TUFER0E7SUFDSEEsb0JBQVlBLElBQVdBLEVBQUVBLEtBQW1CQSxFQUFFQSxRQUFzQkE7UUFBM0NDLG9DQUFBQSxLQUFLQSxHQUFVQSxJQUFJQTtBQUFBQSxRQUFFQSx1Q0FBQUEsUUFBUUEsR0FBVUEsSUFBSUE7QUFBQUEsUUFFbkVBLFdBQU1BLE9BQUFBLElBQUlBLENBQUNBOztRQUVYQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxLQUFLQTtRQUNuQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsUUFBUUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBRUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0E7SUFDcEVBLENBQUNBO0lBS0REO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxNQUFNQTtRQUNuQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFNBQVNBO1FBQ3RCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTs7TUFER0E7aUNBQ0hBO1FBRUNFLE9BQWVBLElBQUlBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBO0lBQ3pFQSxDQUFDQTtJQXJEREYsNEJBQXNDQSxlQUFlQTs7SUFLckRBLDBCQUFvQ0EsYUFBYUE7O0lBS2pEQSxxQ0FBK0NBLHVCQUF1QkE7O0lBS3RFQSxnQ0FBMENBLGtCQUFrQkE7SUF1QzdEQSxrQkFBQ0E7QUFBREEsQ0FBQ0EsRUEzRHdCLEtBQUssRUEyRDdCOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImV2ZW50cy9Bc3NldEV2ZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElBc3NldFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0lBc3NldFwiKTtcbmltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuXG4vKipcbiAqIEBjbGFzcyBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50XG4gKi9cbmNsYXNzIEFzc2V0RXZlbnQgZXh0ZW5kcyBFdmVudFxue1xuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQVNTRVRfQ09NUExFVEU6c3RyaW5nID0gXCJhc3NldENvbXBsZXRlXCI7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIEFTU0VUX1JFTkFNRTpzdHJpbmcgPSAnYXNzZXRSZW5hbWUnO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBBU1NFVF9DT05GTElDVF9SRVNPTFZFRDpzdHJpbmcgPSAnYXNzZXRDb25mbGljdFJlc29sdmVkJztcblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgVEVYVFVSRV9TSVpFX0VSUk9SOnN0cmluZyA9ICd0ZXh0dXJlU2l6ZUVycm9yJztcblxuXHRwcml2YXRlIF9hc3NldDpJQXNzZXQ7XG5cdHByaXZhdGUgX3ByZXZOYW1lOnN0cmluZztcblxuXHQvKipcblx0ICpcblx0ICovXG5cdGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nLCBhc3NldDpJQXNzZXQgPSBudWxsLCBwcmV2TmFtZTpzdHJpbmcgPSBudWxsKVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cblx0XHR0aGlzLl9hc3NldCA9IGFzc2V0O1xuXHRcdHRoaXMuX3ByZXZOYW1lID0gcHJldk5hbWUgfHwgKHRoaXMuX2Fzc2V0PyB0aGlzLl9hc3NldC5uYW1lIDogbnVsbCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgYXNzZXQoKTpJQXNzZXRcblx0e1xuXHRcdHJldHVybiB0aGlzLl9hc3NldDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBhc3NldFByZXZOYW1lKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcHJldk5hbWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOkV2ZW50XG5cdHtcblx0XHRyZXR1cm4gPEV2ZW50PiBuZXcgQXNzZXRFdmVudCh0aGlzLnR5cGUsIHRoaXMuYXNzZXQsIHRoaXMuYXNzZXRQcmV2TmFtZSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gQXNzZXRFdmVudDsiXX0= \ No newline at end of file diff --git a/lib/events/AssetEvent.ts b/lib/events/AssetEvent.ts new file mode 100644 index 00000000..ec7428f1 --- /dev/null +++ b/lib/events/AssetEvent.ts @@ -0,0 +1,68 @@ +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import Event = require("awayjs-core/lib/events/Event"); + +/** + * @class away.events.AssetEvent + */ +class AssetEvent extends Event +{ + /** + * + */ + public static ASSET_COMPLETE:string = "assetComplete"; + + /** + * + */ + public static ASSET_RENAME:string = 'assetRename'; + + /** + * + */ + public static ASSET_CONFLICT_RESOLVED:string = 'assetConflictResolved'; + + /** + * + */ + public static TEXTURE_SIZE_ERROR:string = 'textureSizeError'; + + private _asset:IAsset; + private _prevName:string; + + /** + * + */ + constructor(type:string, asset:IAsset = null, prevName:string = null) + { + super(type); + + this._asset = asset; + this._prevName = prevName || (this._asset? this._asset.name : null); + } + + /** + * + */ + public get asset():IAsset + { + return this._asset; + } + + /** + * + */ + public get assetPrevName():string + { + return this._prevName; + } + + /** + * + */ + public clone():Event + { + return new AssetEvent(this.type, this.asset, this.assetPrevName); + } +} + +export = AssetEvent; \ No newline at end of file diff --git a/lib/events/CameraEvent.js b/lib/events/CameraEvent.js new file mode 100755 index 00000000..63491ed4 --- /dev/null +++ b/lib/events/CameraEvent.js @@ -0,0 +1,32 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* @class away.events.CameraEvent +*/ +var CameraEvent = (function (_super) { + __extends(CameraEvent, _super); + function CameraEvent(type, camera) { + _super.call(this, type); + + this._camera = camera; + } + Object.defineProperty(CameraEvent.prototype, "camera", { + get: function () { + return this._camera; + }, + enumerable: true, + configurable: true + }); + CameraEvent.PROJECTION_CHANGED = "projectionChanged"; + return CameraEvent; +})(Event); + +module.exports = CameraEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9DYW1lcmFFdmVudC50cyJdLCJuYW1lcyI6WyJDYW1lcmFFdmVudCIsIkNhbWVyYUV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFDMkQ7O0FBRTNEOztFQUVHO0FBQ0g7SUFBMEJBLDhCQUFLQTtJQU05QkEscUJBQVlBLElBQVdBLEVBQUVBLE1BQWFBO1FBRXJDQyxXQUFNQSxPQUFBQSxJQUFJQSxDQUFDQTs7UUFFWEEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsTUFBTUE7SUFDdEJBLENBQUNBO0lBRUREO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQSxJQWREQSxpQ0FBMENBLG1CQUFtQkE7SUFlOURBLG1CQUFDQTtBQUFEQSxDQUFDQSxFQWpCeUIsS0FBSyxFQWlCOUI7O0FBRUQsNEJBQXFCLENBQUEiLCJmaWxlIjoiZXZlbnRzL0NhbWVyYUV2ZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENhbWVyYVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvQ2FtZXJhXCIpO1xuaW1wb3J0IEV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnRcIik7XG5cbi8qKlxuICogQGNsYXNzIGF3YXkuZXZlbnRzLkNhbWVyYUV2ZW50XG4gKi9cbmNsYXNzIENhbWVyYUV2ZW50IGV4dGVuZHMgRXZlbnRcbntcblx0cHVibGljIHN0YXRpYyBQUk9KRUNUSU9OX0NIQU5HRUQ6c3RyaW5nID0gXCJwcm9qZWN0aW9uQ2hhbmdlZFwiO1xuXG5cdHByaXZhdGUgX2NhbWVyYTpDYW1lcmE7XG5cblx0Y29uc3RydWN0b3IodHlwZTpzdHJpbmcsIGNhbWVyYTpDYW1lcmEpXG5cdHtcblx0XHRzdXBlcih0eXBlKTtcblxuXHRcdHRoaXMuX2NhbWVyYSA9IGNhbWVyYTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgY2FtZXJhKCk6Q2FtZXJhXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2FtZXJhO1xuXHR9XG59XG5cbmV4cG9ydCA9IENhbWVyYUV2ZW50OyJdfQ== \ No newline at end of file diff --git a/lib/events/CameraEvent.ts b/lib/events/CameraEvent.ts new file mode 100644 index 00000000..648bf237 --- /dev/null +++ b/lib/events/CameraEvent.ts @@ -0,0 +1,26 @@ +import Camera = require("awayjs-core/lib/entities/Camera"); +import Event = require("awayjs-core/lib/events/Event"); + +/** + * @class away.events.CameraEvent + */ +class CameraEvent extends Event +{ + public static PROJECTION_CHANGED:string = "projectionChanged"; + + private _camera:Camera; + + constructor(type:string, camera:Camera) + { + super(type); + + this._camera = camera; + } + + public get camera():Camera + { + return this._camera; + } +} + +export = CameraEvent; \ No newline at end of file diff --git a/lib/events/DisplayObjectEvent.js b/lib/events/DisplayObjectEvent.js new file mode 100755 index 00000000..710aa607 --- /dev/null +++ b/lib/events/DisplayObjectEvent.js @@ -0,0 +1,26 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var DisplayObjectEvent = (function (_super) { + __extends(DisplayObjectEvent, _super); + function DisplayObjectEvent(type, object) { + _super.call(this, type); + this.object = object; + } + DisplayObjectEvent.VISIBLITY_UPDATED = "visiblityUpdated"; + DisplayObjectEvent.SCENETRANSFORM_CHANGED = "scenetransformChanged"; + DisplayObjectEvent.SCENE_CHANGED = "sceneChanged"; + DisplayObjectEvent.POSITION_CHANGED = "positionChanged"; + DisplayObjectEvent.ROTATION_CHANGED = "rotationChanged"; + DisplayObjectEvent.SCALE_CHANGED = "scaleChanged"; + return DisplayObjectEvent; +})(Event); + +module.exports = DisplayObjectEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9EaXNwbGF5T2JqZWN0RXZlbnQudHMiXSwibmFtZXMiOlsiRGlzcGxheU9iamVjdEV2ZW50IiwiRGlzcGxheU9iamVjdEV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFDMkQ7O0FBRTNEO0lBQWlDQSxxQ0FBS0E7SUFXckNBLDRCQUFZQSxJQUFXQSxFQUFFQSxNQUFvQkE7UUFFNUNDLFdBQU1BLE9BQUFBLElBQUlBLENBQUNBO1FBQ1hBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLE1BQU1BO0lBQ3JCQSxDQUFDQTtJQWJERCx1Q0FBeUNBLGtCQUFrQkE7SUFDM0RBLDRDQUE4Q0EsdUJBQXVCQTtJQUNyRUEsbUNBQXFDQSxjQUFjQTtJQUNuREEsc0NBQXdDQSxpQkFBaUJBO0lBQ3pEQSxzQ0FBd0NBLGlCQUFpQkE7SUFDekRBLG1DQUFxQ0EsY0FBY0E7SUFTcERBLDBCQUFDQTtBQUFEQSxDQUFDQSxFQWhCZ0MsS0FBSyxFQWdCckM7O0FBRUQsbUNBQTRCLENBQUEiLCJmaWxlIjoiZXZlbnRzL0Rpc3BsYXlPYmplY3RFdmVudC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IEV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnRcIik7XG5cbmNsYXNzIERpc3BsYXlPYmplY3RFdmVudCBleHRlbmRzIEV2ZW50XG57XG5cdHB1YmxpYyBzdGF0aWMgVklTSUJMSVRZX1VQREFURUQ6c3RyaW5nID0gXCJ2aXNpYmxpdHlVcGRhdGVkXCI7XG5cdHB1YmxpYyBzdGF0aWMgU0NFTkVUUkFOU0ZPUk1fQ0hBTkdFRDpzdHJpbmcgPSBcInNjZW5ldHJhbnNmb3JtQ2hhbmdlZFwiO1xuXHRwdWJsaWMgc3RhdGljIFNDRU5FX0NIQU5HRUQ6c3RyaW5nID0gXCJzY2VuZUNoYW5nZWRcIjtcblx0cHVibGljIHN0YXRpYyBQT1NJVElPTl9DSEFOR0VEOnN0cmluZyA9IFwicG9zaXRpb25DaGFuZ2VkXCI7XG5cdHB1YmxpYyBzdGF0aWMgUk9UQVRJT05fQ0hBTkdFRDpzdHJpbmcgPSBcInJvdGF0aW9uQ2hhbmdlZFwiO1xuXHRwdWJsaWMgc3RhdGljIFNDQUxFX0NIQU5HRUQ6c3RyaW5nID0gXCJzY2FsZUNoYW5nZWRcIjtcblxuXHRwdWJsaWMgb2JqZWN0OkRpc3BsYXlPYmplY3Q7XG5cblx0Y29uc3RydWN0b3IodHlwZTpzdHJpbmcsIG9iamVjdDpEaXNwbGF5T2JqZWN0KVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cdFx0dGhpcy5vYmplY3QgPSBvYmplY3Q7XG5cdH1cbn1cblxuZXhwb3J0ID0gRGlzcGxheU9iamVjdEV2ZW50OyJdfQ== \ No newline at end of file diff --git a/lib/events/DisplayObjectEvent.ts b/lib/events/DisplayObjectEvent.ts new file mode 100644 index 00000000..1e545647 --- /dev/null +++ b/lib/events/DisplayObjectEvent.ts @@ -0,0 +1,22 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Event = require("awayjs-core/lib/events/Event"); + +class DisplayObjectEvent extends Event +{ + public static VISIBLITY_UPDATED:string = "visiblityUpdated"; + public static SCENETRANSFORM_CHANGED:string = "scenetransformChanged"; + public static SCENE_CHANGED:string = "sceneChanged"; + public static POSITION_CHANGED:string = "positionChanged"; + public static ROTATION_CHANGED:string = "rotationChanged"; + public static SCALE_CHANGED:string = "scaleChanged"; + + public object:DisplayObject; + + constructor(type:string, object:DisplayObject) + { + super(type); + this.object = object; + } +} + +export = DisplayObjectEvent; \ No newline at end of file diff --git a/lib/events/Event.js b/lib/events/Event.js new file mode 100755 index 00000000..28a24d64 --- /dev/null +++ b/lib/events/Event.js @@ -0,0 +1,38 @@ +var Event = (function () { + function Event(type) { + /** + * Type of event + * @property type + * @type String + */ + this.type = undefined; + /** + * Reference to target object + * @property target + * @type Object + */ + this.target = undefined; + this.type = type; + } + /** + * Clones the current event. + * @return An exact duplicate of the current event. + */ + Event.prototype.clone = function () { + return new Event(this.type); + }; + Event.COMPLETE = 'complete'; + Event.OPEN = 'open'; + + Event.ENTER_FRAME = 'enterFrame'; + Event.EXIT_FRAME = 'exitFrame'; + + Event.RESIZE = "resize"; + Event.ERROR = "error"; + Event.CHANGE = "change"; + return Event; +})(); + +module.exports = Event; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9FdmVudC50cyJdLCJuYW1lcyI6WyJFdmVudCIsIkV2ZW50LmNvbnN0cnVjdG9yIiwiRXZlbnQuY2xvbmUiXSwibWFwcGluZ3MiOiJBQUFBO0lBNEJDQSxlQUFZQSxJQUFXQTtRQWR2QkM7Ozs7VUFJR0E7UUFDSEEsS0FBT0EsSUFBSUEsR0FBVUEsU0FBU0EsQ0FBQ0E7UUFFL0JBOzs7O1VBSUdBO1FBQ0hBLEtBQU9BLE1BQU1BLEdBQU9BLFNBQVNBLENBQUNBO1FBSTdCQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQTtJQUNqQkEsQ0FBQ0E7SUFNREQ7OztNQURHQTs0QkFDSEE7UUFFQ0UsT0FBT0EsSUFBSUEsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFDNUJBLENBQUNBO0lBckNERixpQkFBZ0NBLFVBQVVBO0lBQzFDQSxhQUE0QkEsTUFBTUE7O0lBRWxDQSxvQkFBbUNBLFlBQVlBO0lBQy9DQSxtQkFBa0NBLFdBQVdBOztJQUc3Q0EsZUFBOEJBLFFBQVFBO0lBQ3RDQSxjQUE2QkEsT0FBT0E7SUFDcENBLGVBQThCQSxRQUFRQTtJQTZCdkNBLGFBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsc0JBQWUsQ0FBQSIsImZpbGUiOiJldmVudHMvRXZlbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJjbGFzcyBFdmVudFxue1xuXG5cdHB1YmxpYyBzdGF0aWMgQ09NUExFVEU6c3RyaW5nID0gJ2NvbXBsZXRlJztcblx0cHVibGljIHN0YXRpYyBPUEVOOnN0cmluZyA9ICdvcGVuJztcblxuXHRwdWJsaWMgc3RhdGljIEVOVEVSX0ZSQU1FOnN0cmluZyA9ICdlbnRlckZyYW1lJztcblx0cHVibGljIHN0YXRpYyBFWElUX0ZSQU1FOnN0cmluZyA9ICdleGl0RnJhbWUnO1xuXG5cblx0cHVibGljIHN0YXRpYyBSRVNJWkU6c3RyaW5nID0gXCJyZXNpemVcIjtcblx0cHVibGljIHN0YXRpYyBFUlJPUjpzdHJpbmcgPSBcImVycm9yXCI7XG5cdHB1YmxpYyBzdGF0aWMgQ0hBTkdFOnN0cmluZyA9IFwiY2hhbmdlXCI7XG5cblx0LyoqXG5cdCAqIFR5cGUgb2YgZXZlbnRcblx0ICogQHByb3BlcnR5IHR5cGVcblx0ICogQHR5cGUgU3RyaW5nXG5cdCAqL1xuXHRwdWJsaWMgdHlwZTpzdHJpbmcgPSB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIFJlZmVyZW5jZSB0byB0YXJnZXQgb2JqZWN0XG5cdCAqIEBwcm9wZXJ0eSB0YXJnZXRcblx0ICogQHR5cGUgT2JqZWN0XG5cdCAqL1xuXHRwdWJsaWMgdGFyZ2V0OmFueSA9IHVuZGVmaW5lZDtcblxuXHRjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZylcblx0e1xuXHRcdHRoaXMudHlwZSA9IHR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvbmVzIHRoZSBjdXJyZW50IGV2ZW50LlxuXHQgKiBAcmV0dXJuIEFuIGV4YWN0IGR1cGxpY2F0ZSBvZiB0aGUgY3VycmVudCBldmVudC5cblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOkV2ZW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IEV2ZW50KHRoaXMudHlwZSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gRXZlbnQ7Il19 \ No newline at end of file diff --git a/lib/events/Event.ts b/lib/events/Event.ts new file mode 100644 index 00000000..88d434d1 --- /dev/null +++ b/lib/events/Event.ts @@ -0,0 +1,44 @@ +class Event +{ + + public static COMPLETE:string = 'complete'; + public static OPEN:string = 'open'; + + public static ENTER_FRAME:string = 'enterFrame'; + public static EXIT_FRAME:string = 'exitFrame'; + + + public static RESIZE:string = "resize"; + public static ERROR:string = "error"; + public static CHANGE:string = "change"; + + /** + * Type of event + * @property type + * @type String + */ + public type:string = undefined; + + /** + * Reference to target object + * @property target + * @type Object + */ + public target:any = undefined; + + constructor(type:string) + { + this.type = type; + } + + /** + * Clones the current event. + * @return An exact duplicate of the current event. + */ + public clone():Event + { + return new Event(this.type); + } +} + +export = Event; \ No newline at end of file diff --git a/lib/events/EventDispatcher.js b/lib/events/EventDispatcher.js new file mode 100755 index 00000000..89abde4e --- /dev/null +++ b/lib/events/EventDispatcher.js @@ -0,0 +1,100 @@ +/** +* Base class for dispatching events +* +* @class away.events.EventDispatcher +* +*/ +var EventDispatcher = (function () { + function EventDispatcher(target) { + if (typeof target === "undefined") { target = null; } + this.listeners = new Array(); + this.target = target || this; + } + /** + * Add an event listener + * @method addEventListener + * @param {String} Name of event to add a listener for + * @param {Function} Callback function + */ + EventDispatcher.prototype.addEventListener = function (type, listener) { + if (this.listeners[type] === undefined) + this.listeners[type] = new Array(); + + if (this.getEventListenerIndex(type, listener) === -1) + this.listeners[type].push(listener); + }; + + /** + * Remove an event listener + * @method removeEventListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + EventDispatcher.prototype.removeEventListener = function (type, listener) { + var index = this.getEventListenerIndex(type, listener); + + if (index !== -1) + this.listeners[type].splice(index, 1); + }; + + /** + * Dispatch an event + * @method dispatchEvent + * @param {Event} Event to dispatch + */ + EventDispatcher.prototype.dispatchEvent = function (event) { + var listenerArray = this.listeners[event.type]; + + if (listenerArray !== undefined) { + var l = listenerArray.length; + + event.target = this.target; + + for (var i = 0; i < l; i++) + listenerArray[i](event); + } + }; + + /** + * get Event Listener Index in array. Returns -1 if no listener is added + * @method getEventListenerIndex + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + EventDispatcher.prototype.getEventListenerIndex = function (type, listener) { + if (this.listeners[type] !== undefined) { + var a = this.listeners[type]; + var l = a.length; + + for (var i = 0; i < l; i++) + if (listener == a[i]) + return i; + } + + return -1; + }; + + /** + * check if an object has an event listener assigned to it + * @method hasListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + EventDispatcher.prototype.hasEventListener = function (type, listener) { + if (listener != null) { + return (this.getEventListenerIndex(type, listener) !== -1); + } else { + if (this.listeners[type] !== undefined) + return (this.listeners[type].length > 0); + + return false; + } + + return false; + }; + return EventDispatcher; +})(); + +module.exports = EventDispatcher; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9FdmVudERpc3BhdGNoZXIudHMiXSwibmFtZXMiOlsiRXZlbnREaXNwYXRjaGVyIiwiRXZlbnREaXNwYXRjaGVyLmNvbnN0cnVjdG9yIiwiRXZlbnREaXNwYXRjaGVyLmFkZEV2ZW50TGlzdGVuZXIiLCJFdmVudERpc3BhdGNoZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciIsIkV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50IiwiRXZlbnREaXNwYXRjaGVyLmdldEV2ZW50TGlzdGVuZXJJbmRleCIsIkV2ZW50RGlzcGF0Y2hlci5oYXNFdmVudExpc3RlbmVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7RUFPRTtBQUNGO0lBS0NBLHlCQUFZQSxNQUFpQkE7UUFBakJDLHFDQUFBQSxNQUFNQSxHQUFPQSxJQUFJQTtBQUFBQSxRQUg3QkEsS0FBUUEsU0FBU0EsR0FBMEJBLElBQUlBLEtBQUtBLENBQWtCQSxDQUFDQSxDQUFDQTtRQUt2RUEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsTUFBTUEsSUFBSUEsSUFBSUE7SUFDN0JBLENBQUNBO0lBUUREOzs7OztNQURHQTtpREFDSEEsVUFBd0JBLElBQVdBLEVBQUVBLFFBQWlCQTtRQUVyREUsSUFBSUEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBRUEsSUFBSUEsQ0FBRUEsS0FBS0EsU0FBU0E7WUFDdkNBLElBQUlBLENBQUNBLFNBQVNBLENBQUVBLElBQUlBLENBQUVBLEdBQUdBLElBQUlBLEtBQUtBLENBQVdBLENBQUNBLENBQUNBOztRQUVoREEsSUFBSUEsSUFBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtZQUNwREEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBRUEsSUFBSUEsQ0FBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7SUFDeENBLENBQUNBOztJQVFERjs7Ozs7TUFER0E7b0RBQ0hBLFVBQTJCQSxJQUFXQSxFQUFFQSxRQUFpQkE7UUFFeERHLElBQUlBLEtBQUtBLEdBQVVBLElBQUlBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsSUFBSUEsRUFBRUEsUUFBUUEsQ0FBQ0E7O1FBRTdEQSxJQUFJQSxLQUFLQSxLQUFLQSxDQUFDQSxDQUFDQTtZQUNmQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFFQSxJQUFJQSxDQUFFQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUMxQ0EsQ0FBQ0E7O0lBT0RIOzs7O01BREdBOzhDQUNIQSxVQUFxQkEsS0FBV0E7UUFFL0JJLElBQUlBLGFBQWFBLEdBQW1CQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFFQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFFQTs7UUFFaEVBLElBQUlBLGFBQWFBLEtBQUtBLFNBQVNBLENBQUVBO1lBQ2hDQSxJQUFJQSxDQUFDQSxHQUFVQSxhQUFhQSxDQUFDQSxNQUFNQTs7WUFFbkNBLEtBQUtBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BOztZQUUxQkEsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUE7Z0JBQ2hDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUN6QkE7SUFDRkEsQ0FBQ0E7O0lBUURKOzs7OztNQURHQTtzREFDSEEsVUFBOEJBLElBQVdBLEVBQUVBLFFBQWlCQTtRQUUzREssSUFBSUEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBRUEsSUFBSUEsQ0FBRUEsS0FBS0EsU0FBU0EsQ0FBRUE7WUFDekNBLElBQUlBLENBQUNBLEdBQW1CQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFFQSxJQUFJQSxDQUFFQTtZQUM5Q0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsQ0FBQ0EsTUFBTUE7O1lBRXZCQSxLQUFLQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQTtnQkFDaENBLElBQUlBLFFBQVFBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO29CQUNuQkEsT0FBT0EsQ0FBQ0EsQ0FBQ0E7U0FDWEE7O1FBRURBLE9BQU9BLENBQUNBLENBQUNBO0lBQ1ZBLENBQUNBOztJQVFETDs7Ozs7TUFER0E7aURBQ0hBLFVBQXdCQSxJQUFXQSxFQUFFQSxRQUFrQkE7UUFFdERNLElBQUlBLFFBQVFBLElBQUlBLElBQUlBLENBQUVBO1lBQ3JCQSxPQUFPQSxDQUFFQSxJQUFJQSxDQUFDQSxxQkFBcUJBLENBQUNBLElBQUlBLEVBQUVBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUVBO1NBQzVEQSxLQUFNQTtZQUNOQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFFQSxJQUFJQSxDQUFFQSxLQUFLQSxTQUFTQTtnQkFDdkNBLE9BQU9BLENBQUVBLElBQUlBLENBQUNBLFNBQVNBLENBQUVBLElBQUlBLENBQUVBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLENBQUVBLENBQUNBOztZQUU5Q0EsT0FBT0EsS0FBS0E7U0FDWkE7O1FBRURBLE9BQU9BLEtBQUtBO0lBQ2JBLENBQUNBO0lBQ0ZOLHVCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELGdDQUF5QixDQUFBIiwiZmlsZSI6ImV2ZW50cy9FdmVudERpc3BhdGNoZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGRpc3BhdGNoaW5nIGV2ZW50c1xuKlxuKiBAY2xhc3MgYXdheS5ldmVudHMuRXZlbnREaXNwYXRjaGVyXG4qXG4qL1xuY2xhc3MgRXZlbnREaXNwYXRjaGVyXG57XG5cdHByaXZhdGUgbGlzdGVuZXJzOkFycmF5PEFycmF5PEZ1bmN0aW9uPj4gPSBuZXcgQXJyYXk8QXJyYXk8RnVuY3Rpb24+PigpO1xuXHRwcml2YXRlIHRhcmdldDphbnk7XG5cblx0Y29uc3RydWN0b3IodGFyZ2V0OmFueSA9IG51bGwpXG5cdHtcblx0XHR0aGlzLnRhcmdldCA9IHRhcmdldCB8fCB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZCBhbiBldmVudCBsaXN0ZW5lclxuXHQgKiBAbWV0aG9kIGFkZEV2ZW50TGlzdGVuZXJcblx0ICogQHBhcmFtIHtTdHJpbmd9IE5hbWUgb2YgZXZlbnQgdG8gYWRkIGEgbGlzdGVuZXIgZm9yXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IENhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZywgbGlzdGVuZXI6RnVuY3Rpb24pXG5cdHtcblx0XHRpZiAodGhpcy5saXN0ZW5lcnNbIHR5cGUgXSA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0dGhpcy5saXN0ZW5lcnNbIHR5cGUgXSA9IG5ldyBBcnJheTxGdW5jdGlvbj4oKTtcblxuXHRcdGlmICh0aGlzLmdldEV2ZW50TGlzdGVuZXJJbmRleCh0eXBlLCBsaXN0ZW5lcikgPT09IC0xKVxuXHRcdFx0dGhpcy5saXN0ZW5lcnNbIHR5cGUgXS5wdXNoKGxpc3RlbmVyKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXJcblx0ICogQG1ldGhvZCByZW1vdmVFdmVudExpc3RlbmVyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBOYW1lIG9mIGV2ZW50IHRvIHJlbW92ZSBhIGxpc3RlbmVyIGZvclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZTpzdHJpbmcsIGxpc3RlbmVyOkZ1bmN0aW9uKVxuXHR7XG5cdFx0dmFyIGluZGV4Om51bWJlciA9IHRoaXMuZ2V0RXZlbnRMaXN0ZW5lckluZGV4KHR5cGUsIGxpc3RlbmVyKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpXG5cdFx0XHR0aGlzLmxpc3RlbmVyc1sgdHlwZSBdLnNwbGljZShpbmRleCwgMSk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzcGF0Y2ggYW4gZXZlbnRcblx0ICogQG1ldGhvZCBkaXNwYXRjaEV2ZW50XG5cdCAqIEBwYXJhbSB7RXZlbnR9IEV2ZW50IHRvIGRpc3BhdGNoXG5cdCAqL1xuXHRwdWJsaWMgZGlzcGF0Y2hFdmVudChldmVudDpFdmVudClcblx0e1xuXHRcdHZhciBsaXN0ZW5lckFycmF5OkFycmF5PEZ1bmN0aW9uPiA9IHRoaXMubGlzdGVuZXJzWyBldmVudC50eXBlIF07XG5cblx0XHRpZiAobGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YXIgbDpudW1iZXIgPSBsaXN0ZW5lckFycmF5Lmxlbmd0aDtcblxuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gdGhpcy50YXJnZXQ7XG5cblx0XHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGw7IGkrKylcblx0XHRcdFx0bGlzdGVuZXJBcnJheVtpXShldmVudCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIGdldCBFdmVudCBMaXN0ZW5lciBJbmRleCBpbiBhcnJheS4gUmV0dXJucyAtMSBpZiBubyBsaXN0ZW5lciBpcyBhZGRlZFxuXHQgKiBAbWV0aG9kIGdldEV2ZW50TGlzdGVuZXJJbmRleFxuXHQgKiBAcGFyYW0ge1N0cmluZ30gTmFtZSBvZiBldmVudCB0byByZW1vdmUgYSBsaXN0ZW5lciBmb3Jcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gQ2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHByaXZhdGUgZ2V0RXZlbnRMaXN0ZW5lckluZGV4KHR5cGU6c3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbik6bnVtYmVyXG5cdHtcblx0XHRpZiAodGhpcy5saXN0ZW5lcnNbIHR5cGUgXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR2YXIgYTpBcnJheTxGdW5jdGlvbj4gPSB0aGlzLmxpc3RlbmVyc1sgdHlwZSBdO1xuXHRcdFx0dmFyIGw6bnVtYmVyID0gYS5sZW5ndGg7XG5cblx0XHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGw7IGkrKylcblx0XHRcdFx0aWYgKGxpc3RlbmVyID09IGFbaV0pXG5cdFx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIC0xO1xuXHR9XG5cblx0LyoqXG5cdCAqIGNoZWNrIGlmIGFuIG9iamVjdCBoYXMgYW4gZXZlbnQgbGlzdGVuZXIgYXNzaWduZWQgdG8gaXRcblx0ICogQG1ldGhvZCBoYXNMaXN0ZW5lclxuXHQgKiBAcGFyYW0ge1N0cmluZ30gTmFtZSBvZiBldmVudCB0byByZW1vdmUgYSBsaXN0ZW5lciBmb3Jcblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gQ2FsbGJhY2sgZnVuY3Rpb25cblx0ICovXG5cdHB1YmxpYyBoYXNFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLCBsaXN0ZW5lcj86RnVuY3Rpb24pOmJvb2xlYW5cblx0e1xuXHRcdGlmIChsaXN0ZW5lciAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldEV2ZW50TGlzdGVuZXJJbmRleCh0eXBlLCBsaXN0ZW5lcikgIT09IC0xICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICh0aGlzLmxpc3RlbmVyc1sgdHlwZSBdICE9PSB1bmRlZmluZWQpXG5cdFx0XHRcdHJldHVybiAoIHRoaXMubGlzdGVuZXJzWyB0eXBlIF0ubGVuZ3RoID4gMCApO1xuXG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59XG5cbmV4cG9ydCA9IEV2ZW50RGlzcGF0Y2hlcjsiXX0= \ No newline at end of file diff --git a/lib/events/EventDispatcher.ts b/lib/events/EventDispatcher.ts new file mode 100644 index 00000000..3c3ace76 --- /dev/null +++ b/lib/events/EventDispatcher.ts @@ -0,0 +1,108 @@ +import Event = require("awayjs-core/lib/events/Event"); + +/** + * Base class for dispatching events +* +* @class away.events.EventDispatcher +* +*/ +class EventDispatcher +{ + private listeners:Array> = new Array>(); + private target:any; + + constructor(target:any = null) + { + this.target = target || this; + } + + /** + * Add an event listener + * @method addEventListener + * @param {String} Name of event to add a listener for + * @param {Function} Callback function + */ + public addEventListener(type:string, listener:Function) + { + if (this.listeners[ type ] === undefined) + this.listeners[ type ] = new Array(); + + if (this.getEventListenerIndex(type, listener) === -1) + this.listeners[ type ].push(listener); + } + + /** + * Remove an event listener + * @method removeEventListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + public removeEventListener(type:string, listener:Function) + { + var index:number = this.getEventListenerIndex(type, listener); + + if (index !== -1) + this.listeners[ type ].splice(index, 1); + } + + /** + * Dispatch an event + * @method dispatchEvent + * @param {Event} Event to dispatch + */ + public dispatchEvent(event:Event) + { + var listenerArray:Array = this.listeners[ event.type ]; + + if (listenerArray !== undefined) { + var l:number = listenerArray.length; + + event.target = this.target; + + for (var i:number = 0; i < l; i++) + listenerArray[i](event); + } + } + + /** + * get Event Listener Index in array. Returns -1 if no listener is added + * @method getEventListenerIndex + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + private getEventListenerIndex(type:string, listener:Function):number + { + if (this.listeners[ type ] !== undefined) { + var a:Array = this.listeners[ type ]; + var l:number = a.length; + + for (var i:number = 0; i < l; i++) + if (listener == a[i]) + return i; + } + + return -1; + } + + /** + * check if an object has an event listener assigned to it + * @method hasListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + public hasEventListener(type:string, listener?:Function):boolean + { + if (listener != null) { + return ( this.getEventListenerIndex(type, listener) !== -1 ); + } else { + if (this.listeners[ type ] !== undefined) + return ( this.listeners[ type ].length > 0 ); + + return false; + } + + return false; + } +} + +export = EventDispatcher; \ No newline at end of file diff --git a/lib/events/GeometryEvent.js b/lib/events/GeometryEvent.js new file mode 100755 index 00000000..0ee99460 --- /dev/null +++ b/lib/events/GeometryEvent.js @@ -0,0 +1,56 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* Dispatched to notify changes in a geometry object's state. +* +* @class away.events.GeometryEvent +* @see away3d.core.base.Geometry +*/ +var GeometryEvent = (function (_super) { + __extends(GeometryEvent, _super); + /** + * Create a new GeometryEvent + * @param type The event type. + * @param subGeometry An optional TriangleSubGeometry object that is the subject of this event. + */ + function GeometryEvent(type, subGeometry) { + if (typeof subGeometry === "undefined") { subGeometry = null; } + _super.call(this, type); + + this._subGeometry = subGeometry; + } + Object.defineProperty(GeometryEvent.prototype, "subGeometry", { + /** + * The TriangleSubGeometry object that is the subject of this event, if appropriate. + */ + get: function () { + return this._subGeometry; + }, + enumerable: true, + configurable: true + }); + + /** + * Clones the event. + * @return An exact duplicate of the current object. + */ + GeometryEvent.prototype.clone = function () { + return new GeometryEvent(this.type, this._subGeometry); + }; + GeometryEvent.SUB_GEOMETRY_ADDED = "SubGeometryAdded"; + + GeometryEvent.SUB_GEOMETRY_REMOVED = "SubGeometryRemoved"; + + GeometryEvent.BOUNDS_INVALID = "BoundsInvalid"; + return GeometryEvent; +})(Event); + +module.exports = GeometryEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9HZW9tZXRyeUV2ZW50LnRzIl0sIm5hbWVzIjpbIkdlb21ldHJ5RXZlbnQiLCJHZW9tZXRyeUV2ZW50LmNvbnN0cnVjdG9yIiwiR2VvbWV0cnlFdmVudC5jbG9uZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQzJEOztBQUUzRDs7Ozs7RUFLRTtBQUNGO0lBQTRCQSxnQ0FBS0E7SUFxQmhDQTs7OztNQURHQTtJQUNIQSx1QkFBWUEsSUFBV0EsRUFBRUEsV0FBa0NBO1FBQWxDQywwQ0FBQUEsV0FBV0EsR0FBbUJBLElBQUlBO0FBQUFBLFFBRTFEQSxXQUFNQSxPQUFBQSxJQUFJQSxDQUFDQTs7UUFFWEEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsV0FBV0E7SUFDaENBLENBQUNBO0lBS0REO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFNREE7OztNQURHQTtvQ0FDSEE7UUFFQ0UsT0FBT0EsSUFBSUEsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsRUFBRUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0E7SUFDdkRBLENBQUNBO0lBdENERixtQ0FBMENBLGtCQUFrQkE7O0lBSzVEQSxxQ0FBNENBLG9CQUFvQkE7O0lBRWhFQSwrQkFBc0NBLGVBQWVBO0lBZ0N0REEscUJBQUNBO0FBQURBLENBQUNBLEVBNUMyQixLQUFLLEVBNENoQzs7QUFFRCw4QkFBdUIsQ0FBQSIsImZpbGUiOiJldmVudHMvR2VvbWV0cnlFdmVudC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTdWJHZW9tZXRyeUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1N1Ykdlb21ldHJ5QmFzZVwiKTtcbmltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuXG4vKipcbiogRGlzcGF0Y2hlZCB0byBub3RpZnkgY2hhbmdlcyBpbiBhIGdlb21ldHJ5IG9iamVjdCdzIHN0YXRlLlxuKlxuKiBAY2xhc3MgYXdheS5ldmVudHMuR2VvbWV0cnlFdmVudFxuKiBAc2VlIGF3YXkzZC5jb3JlLmJhc2UuR2VvbWV0cnlcbiovXG5jbGFzcyBHZW9tZXRyeUV2ZW50IGV4dGVuZHMgRXZlbnRcbntcblx0LyoqXG5cdCAqIERpc3BhdGNoZWQgd2hlbiBhIFRyaWFuZ2xlU3ViR2VvbWV0cnkgd2FzIGFkZGVkIHRvIHRoZSBkaXNwYXRjaGluZyBHZW9tZXRyeS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgU1VCX0dFT01FVFJZX0FEREVEOnN0cmluZyA9IFwiU3ViR2VvbWV0cnlBZGRlZFwiO1xuXG5cdC8qKlxuXHQgKiBEaXNwYXRjaGVkIHdoZW4gYSBUcmlhbmdsZVN1Ykdlb21ldHJ5IHdhcyByZW1vdmVkIGZyb20gdGhlIGRpc3BhdGNoaW5nIEdlb21ldHJ5LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBTVUJfR0VPTUVUUllfUkVNT1ZFRDpzdHJpbmcgPSBcIlN1Ykdlb21ldHJ5UmVtb3ZlZFwiO1xuXG5cdHB1YmxpYyBzdGF0aWMgQk9VTkRTX0lOVkFMSUQ6c3RyaW5nID0gXCJCb3VuZHNJbnZhbGlkXCI7XG5cblx0cHJpdmF0ZSBfc3ViR2VvbWV0cnk6U3ViR2VvbWV0cnlCYXNlO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBuZXcgR2VvbWV0cnlFdmVudFxuXHQgKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS5cblx0ICogQHBhcmFtIHN1Ykdlb21ldHJ5IEFuIG9wdGlvbmFsIFRyaWFuZ2xlU3ViR2VvbWV0cnkgb2JqZWN0IHRoYXQgaXMgdGhlIHN1YmplY3Qgb2YgdGhpcyBldmVudC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nLCBzdWJHZW9tZXRyeTpTdWJHZW9tZXRyeUJhc2UgPSBudWxsKVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cblx0XHR0aGlzLl9zdWJHZW9tZXRyeSA9IHN1Ykdlb21ldHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBUcmlhbmdsZVN1Ykdlb21ldHJ5IG9iamVjdCB0aGF0IGlzIHRoZSBzdWJqZWN0IG9mIHRoaXMgZXZlbnQsIGlmIGFwcHJvcHJpYXRlLlxuXHQgKi9cblx0cHVibGljIGdldCBzdWJHZW9tZXRyeSgpOlN1Ykdlb21ldHJ5QmFzZVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3N1Ykdlb21ldHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIENsb25lcyB0aGUgZXZlbnQuXG5cdCAqIEByZXR1cm4gQW4gZXhhY3QgZHVwbGljYXRlIG9mIHRoZSBjdXJyZW50IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBjbG9uZSgpOkV2ZW50XG5cdHtcblx0XHRyZXR1cm4gbmV3IEdlb21ldHJ5RXZlbnQodGhpcy50eXBlLCB0aGlzLl9zdWJHZW9tZXRyeSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gR2VvbWV0cnlFdmVudDsiXX0= \ No newline at end of file diff --git a/lib/events/GeometryEvent.ts b/lib/events/GeometryEvent.ts new file mode 100644 index 00000000..7ca12b24 --- /dev/null +++ b/lib/events/GeometryEvent.ts @@ -0,0 +1,56 @@ +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import Event = require("awayjs-core/lib/events/Event"); + +/** +* Dispatched to notify changes in a geometry object's state. +* +* @class away.events.GeometryEvent +* @see away3d.core.base.Geometry +*/ +class GeometryEvent extends Event +{ + /** + * Dispatched when a TriangleSubGeometry was added to the dispatching Geometry. + */ + public static SUB_GEOMETRY_ADDED:string = "SubGeometryAdded"; + + /** + * Dispatched when a TriangleSubGeometry was removed from the dispatching Geometry. + */ + public static SUB_GEOMETRY_REMOVED:string = "SubGeometryRemoved"; + + public static BOUNDS_INVALID:string = "BoundsInvalid"; + + private _subGeometry:SubGeometryBase; + + /** + * Create a new GeometryEvent + * @param type The event type. + * @param subGeometry An optional TriangleSubGeometry object that is the subject of this event. + */ + constructor(type:string, subGeometry:SubGeometryBase = null) + { + super(type); + + this._subGeometry = subGeometry; + } + + /** + * The TriangleSubGeometry object that is the subject of this event, if appropriate. + */ + public get subGeometry():SubGeometryBase + { + return this._subGeometry; + } + + /** + * Clones the event. + * @return An exact duplicate of the current object. + */ + public clone():Event + { + return new GeometryEvent(this.type, this._subGeometry); + } +} + +export = GeometryEvent; \ No newline at end of file diff --git a/lib/events/HTTPStatusEvent.js b/lib/events/HTTPStatusEvent.js new file mode 100755 index 00000000..4ec792cb --- /dev/null +++ b/lib/events/HTTPStatusEvent.js @@ -0,0 +1,26 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* @class away.events.HTTPStatusEvent +*/ +var HTTPStatusEvent = (function (_super) { + __extends(HTTPStatusEvent, _super); + function HTTPStatusEvent(type, status) { + if (typeof status === "undefined") { status = null; } + _super.call(this, type); + + this.status = status; + } + HTTPStatusEvent.HTTP_STATUS = "httpStatus"; + return HTTPStatusEvent; +})(Event); + +module.exports = HTTPStatusEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9IVFRQU3RhdHVzRXZlbnQudHMiXSwibmFtZXMiOlsiSFRUUFN0YXR1c0V2ZW50IiwiSFRUUFN0YXR1c0V2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEOztFQUVHO0FBQ0g7SUFBOEJBLGtDQUFLQTtJQU9sQ0EseUJBQVlBLElBQVdBLEVBQUVBLE1BQW9CQTtRQUFwQkMscUNBQUFBLE1BQU1BLEdBQVVBLElBQUlBO0FBQUFBLFFBRTVDQSxXQUFNQSxPQUFBQSxJQUFJQSxDQUFDQTs7UUFFWEEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsTUFBTUE7SUFFckJBLENBQUNBO0lBVkRELDhCQUFtQ0EsWUFBWUE7SUFXaERBLHVCQUFDQTtBQUFEQSxDQUFDQSxFQWQ2QixLQUFLLEVBY2xDOztBQUVELGdDQUF5QixDQUFBIiwiZmlsZSI6ImV2ZW50cy9IVFRQU3RhdHVzRXZlbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcblxuLyoqXG4gKiBAY2xhc3MgYXdheS5ldmVudHMuSFRUUFN0YXR1c0V2ZW50XG4gKi9cbmNsYXNzIEhUVFBTdGF0dXNFdmVudCBleHRlbmRzIEV2ZW50XG57XG5cblx0cHVibGljIHN0YXRpYyBIVFRQX1NUQVRVUzpzdHJpbmcgPSBcImh0dHBTdGF0dXNcIjtcblxuXHRwdWJsaWMgc3RhdHVzOm51bWJlcjtcblxuXHRjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZywgc3RhdHVzOm51bWJlciA9IG51bGwpXG5cdHtcblx0XHRzdXBlcih0eXBlKTtcblxuXHRcdHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuXG5cdH1cbn1cblxuZXhwb3J0ID0gSFRUUFN0YXR1c0V2ZW50OyJdfQ== \ No newline at end of file diff --git a/lib/events/HTTPStatusEvent.ts b/lib/events/HTTPStatusEvent.ts new file mode 100644 index 00000000..0b63931d --- /dev/null +++ b/lib/events/HTTPStatusEvent.ts @@ -0,0 +1,22 @@ +import Event = require("awayjs-core/lib/events/Event"); + +/** + * @class away.events.HTTPStatusEvent + */ +class HTTPStatusEvent extends Event +{ + + public static HTTP_STATUS:string = "httpStatus"; + + public status:number; + + constructor(type:string, status:number = null) + { + super(type); + + this.status = status; + + } +} + +export = HTTPStatusEvent; \ No newline at end of file diff --git a/lib/events/IEventDispatcher.js b/lib/events/IEventDispatcher.js new file mode 100755 index 00000000..309404d2 --- /dev/null +++ b/lib/events/IEventDispatcher.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9JRXZlbnREaXNwYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBMkMwQiIsImZpbGUiOiJldmVudHMvSUV2ZW50RGlzcGF0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBkaXNwYXRjaGluZyBldmVudHNcbiAqXG4gKiBAaW50ZXJmYWNlIGF3YXkuZXZlbnRzLklFdmVudERpc3BhdGNoZXJcbiAqXG4gKi9cbmludGVyZmFjZSBJRXZlbnREaXNwYXRjaGVyXG57XG5cdC8qKlxuXHQgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXJcblx0ICogQG1ldGhvZCBhZGRFdmVudExpc3RlbmVyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBOYW1lIG9mIGV2ZW50IHRvIGFkZCBhIGxpc3RlbmVyIGZvclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0YWRkRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZywgbGlzdGVuZXI6RnVuY3Rpb24pO1xuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXJcblx0ICogQG1ldGhvZCByZW1vdmVFdmVudExpc3RlbmVyXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBOYW1lIG9mIGV2ZW50IHRvIHJlbW92ZSBhIGxpc3RlbmVyIGZvclxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDYWxsYmFjayBmdW5jdGlvblxuXHQgKi9cblx0cmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZywgbGlzdGVuZXI6RnVuY3Rpb24pO1xuXG5cdC8qKlxuXHQgKiBEaXNwYXRjaCBhbiBldmVudFxuXHQgKiBAbWV0aG9kIGRpc3BhdGNoRXZlbnRcblx0ICogQHBhcmFtIHtFdmVudH0gRXZlbnQgdG8gZGlzcGF0Y2hcblx0ICovXG5cdGRpc3BhdGNoRXZlbnQoZXZlbnQ6RXZlbnQpO1xuXG5cdC8qKlxuXHQgKiBjaGVjayBpZiBhbiBvYmplY3QgaGFzIGFuIGV2ZW50IGxpc3RlbmVyIGFzc2lnbmVkIHRvIGl0XG5cdCAqIEBtZXRob2QgaGFzTGlzdGVuZXJcblx0ICogQHBhcmFtIHtTdHJpbmd9IE5hbWUgb2YgZXZlbnQgdG8gcmVtb3ZlIGEgbGlzdGVuZXIgZm9yXG5cdCAqIEBwYXJhbSB7RnVuY3Rpb259IENhbGxiYWNrIGZ1bmN0aW9uXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBUYXJnZXQgb2JqZWN0IGxpc3RlbmVyIGlzIGFkZGVkIHRvXG5cdCAqL1xuXHRoYXNFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLCBsaXN0ZW5lcj86RnVuY3Rpb24pIDogYm9vbGVhbjtcbn1cblxuZXhwb3J0ID0gSUV2ZW50RGlzcGF0Y2hlcjsiXX0= \ No newline at end of file diff --git a/lib/events/IEventDispatcher.ts b/lib/events/IEventDispatcher.ts new file mode 100644 index 00000000..66cfc647 --- /dev/null +++ b/lib/events/IEventDispatcher.ts @@ -0,0 +1,44 @@ +import Event = require("awayjs-core/lib/events/Event"); + +/** + * Base interface for dispatching events + * + * @interface away.events.IEventDispatcher + * + */ +interface IEventDispatcher +{ + /** + * Add an event listener + * @method addEventListener + * @param {String} Name of event to add a listener for + * @param {Function} Callback function + */ + addEventListener(type:string, listener:Function); + + /** + * Remove an event listener + * @method removeEventListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + */ + removeEventListener(type:string, listener:Function); + + /** + * Dispatch an event + * @method dispatchEvent + * @param {Event} Event to dispatch + */ + dispatchEvent(event:Event); + + /** + * check if an object has an event listener assigned to it + * @method hasListener + * @param {String} Name of event to remove a listener for + * @param {Function} Callback function + * @param {Object} Target object listener is added to + */ + hasEventListener(type:string, listener?:Function) : boolean; +} + +export = IEventDispatcher; \ No newline at end of file diff --git a/lib/events/IOErrorEvent.js b/lib/events/IOErrorEvent.js new file mode 100755 index 00000000..ed1971a0 --- /dev/null +++ b/lib/events/IOErrorEvent.js @@ -0,0 +1,20 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var IOErrorEvent = (function (_super) { + __extends(IOErrorEvent, _super); + function IOErrorEvent(type) { + _super.call(this, type); + } + IOErrorEvent.IO_ERROR = "ioError"; + return IOErrorEvent; +})(Event); + +module.exports = IOErrorEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9JT0Vycm9yRXZlbnQudHMiXSwibmFtZXMiOlsiSU9FcnJvckV2ZW50IiwiSU9FcnJvckV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQTJCQSwrQkFBS0E7SUFLL0JBLHNCQUFZQSxJQUFXQTtRQUV0QkMsV0FBTUEsT0FBQUEsSUFBSUEsQ0FBQ0E7SUFFWkEsQ0FBQ0E7SUFOREQsd0JBQWdDQSxTQUFTQTtJQU8xQ0Esb0JBQUNBO0FBQURBLENBQUNBLEVBVjBCLEtBQUssRUFVL0I7O0FBRUQsNkJBQXNCLENBQUEiLCJmaWxlIjoiZXZlbnRzL0lPRXJyb3JFdmVudC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuXG5jbGFzcyBJT0Vycm9yRXZlbnQgZXh0ZW5kcyBFdmVudFxue1xuXG5cdHB1YmxpYyBzdGF0aWMgSU9fRVJST1I6c3RyaW5nID0gXCJpb0Vycm9yXCI7XG5cblx0Y29uc3RydWN0b3IodHlwZTpzdHJpbmcpXG5cdHtcblx0XHRzdXBlcih0eXBlKTtcblxuXHR9XG59XG5cbmV4cG9ydCA9IElPRXJyb3JFdmVudDsiXX0= \ No newline at end of file diff --git a/lib/events/IOErrorEvent.ts b/lib/events/IOErrorEvent.ts new file mode 100644 index 00000000..95a2494f --- /dev/null +++ b/lib/events/IOErrorEvent.ts @@ -0,0 +1,15 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class IOErrorEvent extends Event +{ + + public static IO_ERROR:string = "ioError"; + + constructor(type:string) + { + super(type); + + } +} + +export = IOErrorEvent; \ No newline at end of file diff --git a/lib/events/LightEvent.js b/lib/events/LightEvent.js new file mode 100755 index 00000000..e1e87641 --- /dev/null +++ b/lib/events/LightEvent.js @@ -0,0 +1,24 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var LightEvent = (function (_super) { + __extends(LightEvent, _super); + function LightEvent(type) { + _super.call(this, type); + } + //@override + LightEvent.prototype.clone = function () { + return new LightEvent(this.type); + }; + LightEvent.CASTS_SHADOW_CHANGE = "castsShadowChange"; + return LightEvent; +})(Event); + +module.exports = LightEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9MaWdodEV2ZW50LnRzIl0sIm5hbWVzIjpbIkxpZ2h0RXZlbnQiLCJMaWdodEV2ZW50LmNvbnN0cnVjdG9yIiwiTGlnaHRFdmVudC5jbG9uZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQTJEOztBQUUzRDtJQUF5QkEsNkJBQUtBO0lBSzdCQSxvQkFBWUEsSUFBV0E7UUFFdEJDLFdBQU1BLE9BQUFBLElBQUlBLENBQUNBO0lBQ1pBLENBQUNBO0lBR0RELFdBRFdBO2lDQUNYQTtRQUVDRSxPQUFPQSxJQUFJQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtJQUNqQ0EsQ0FBQ0E7SUFYREYsaUNBQTJDQSxtQkFBbUJBO0lBWS9EQSxrQkFBQ0E7QUFBREEsQ0FBQ0EsRUFmd0IsS0FBSyxFQWU3Qjs7QUFFRCwyQkFBb0IsQ0FBQSIsImZpbGUiOiJldmVudHMvTGlnaHRFdmVudC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuXG5jbGFzcyBMaWdodEV2ZW50IGV4dGVuZHMgRXZlbnRcbntcblxuXHRwdWJsaWMgc3RhdGljIENBU1RTX1NIQURPV19DSEFOR0U6c3RyaW5nID0gXCJjYXN0c1NoYWRvd0NoYW5nZVwiO1xuXG5cdGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nKVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgY2xvbmUoKTpFdmVudFxuXHR7XG5cdFx0cmV0dXJuIG5ldyBMaWdodEV2ZW50KHRoaXMudHlwZSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gTGlnaHRFdmVudDsiXX0= \ No newline at end of file diff --git a/lib/events/LightEvent.ts b/lib/events/LightEvent.ts new file mode 100644 index 00000000..c5011dbe --- /dev/null +++ b/lib/events/LightEvent.ts @@ -0,0 +1,20 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class LightEvent extends Event +{ + + public static CASTS_SHADOW_CHANGE:string = "castsShadowChange"; + + constructor(type:string) + { + super(type); + } + + //@override + public clone():Event + { + return new LightEvent(this.type); + } +} + +export = LightEvent; \ No newline at end of file diff --git a/lib/events/LoaderEvent.js b/lib/events/LoaderEvent.js new file mode 100755 index 00000000..4607435d --- /dev/null +++ b/lib/events/LoaderEvent.js @@ -0,0 +1,74 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var LoaderEvent = (function (_super) { + __extends(LoaderEvent, _super); + /** + * Create a new LoaderEvent object. + * + * @param type The event type. + * @param url The url of the loaded resource. + * @param assets The assets of the loaded resource. + */ + function LoaderEvent(type, url, content, assets) { + if (typeof url === "undefined") { url = null; } + if (typeof content === "undefined") { content = null; } + if (typeof assets === "undefined") { assets = null; } + _super.call(this, type); + + this._url = url; + this._content = content; + this._assets = assets; + } + Object.defineProperty(LoaderEvent.prototype, "content", { + /** + * The content returned if the resource has been loaded inside a Loader object. + */ + get: function () { + return this._content; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderEvent.prototype, "url", { + /** + * The url of the loaded resource. + */ + get: function () { + return this._url; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LoaderEvent.prototype, "assets", { + /** + * The error string on loadError. + */ + get: function () { + return this._assets; + }, + enumerable: true, + configurable: true + }); + + /** + * Clones the current event. + * @return An exact duplicate of the current event. + */ + LoaderEvent.prototype.clone = function () { + return new LoaderEvent(this.type, this._url, this._content, this._assets); + }; + LoaderEvent.RESOURCE_COMPLETE = "resourceComplete"; + return LoaderEvent; +})(Event); + +module.exports = LoaderEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9Mb2FkZXJFdmVudC50cyJdLCJuYW1lcyI6WyJMb2FkZXJFdmVudCIsIkxvYWRlckV2ZW50LmNvbnN0cnVjdG9yIiwiTG9hZGVyRXZlbnQuY2xvbmUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUUyRDs7QUFFM0Q7SUFBMEJBLDhCQUFLQTtJQWtCOUJBOzs7Ozs7TUFER0E7SUFDSEEscUJBQVlBLElBQVdBLEVBQUVBLEdBQWlCQSxFQUFFQSxPQUE0QkEsRUFBRUEsTUFBMkJBO1FBQTVFQyxrQ0FBQUEsR0FBR0EsR0FBVUEsSUFBSUE7QUFBQUEsUUFBRUEsc0NBQUFBLE9BQU9BLEdBQWlCQSxJQUFJQTtBQUFBQSxRQUFFQSxxQ0FBQUEsTUFBTUEsR0FBaUJBLElBQUlBO0FBQUFBLFFBRXBHQSxXQUFNQSxPQUFBQSxJQUFJQSxDQUFDQTs7UUFFWEEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0E7UUFDZkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsT0FBT0E7UUFDdkJBLElBQUlBLENBQUNBLE9BQU9BLEdBQUdBLE1BQU1BO0lBQ3RCQSxDQUFDQTtJQUtERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxJQUFJQTtRQUNqQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQU1EQTs7O01BREdBO2tDQUNIQTtRQUVDRSxPQUFlQSxJQUFJQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQTtJQUNsRkEsQ0FBQ0E7SUFyRERGLGdDQUF5Q0Esa0JBQWtCQTtJQXNENURBLG1CQUFDQTtBQUFEQSxDQUFDQSxFQTNEeUIsS0FBSyxFQTJEOUI7O0FBRUQsNEJBQXFCLENBQUEiLCJmaWxlIjoiZXZlbnRzL0xvYWRlckV2ZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IEV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnRcIik7XG5cbmNsYXNzIExvYWRlckV2ZW50IGV4dGVuZHMgRXZlbnRcbntcblx0LyoqXG5cdCAqIERpc3BhdGNoZWQgd2hlbiBhIHJlc291cmNlIGFuZCBhbGwgb2YgaXRzIGRlcGVuZGVuY2llcyBpcyByZXRyaWV2ZWQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFJFU09VUkNFX0NPTVBMRVRFOnN0cmluZyA9IFwicmVzb3VyY2VDb21wbGV0ZVwiO1xuXG5cdHByaXZhdGUgX3VybDpzdHJpbmc7XG5cdHByaXZhdGUgX2NvbnRlbnQ6RGlzcGxheU9iamVjdDtcblx0cHJpdmF0ZSBfYXNzZXRzOklBc3NldFtdO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGUgYSBuZXcgTG9hZGVyRXZlbnQgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gdHlwZSBUaGUgZXZlbnQgdHlwZS5cblx0ICogQHBhcmFtIHVybCBUaGUgdXJsIG9mIHRoZSBsb2FkZWQgcmVzb3VyY2UuXG5cdCAqIEBwYXJhbSBhc3NldHMgVGhlIGFzc2V0cyBvZiB0aGUgbG9hZGVkIHJlc291cmNlLlxuXHQgKi9cblx0Y29uc3RydWN0b3IodHlwZTpzdHJpbmcsIHVybDpzdHJpbmcgPSBudWxsLCBjb250ZW50OkRpc3BsYXlPYmplY3QgPSBudWxsLCBhc3NldHM6QXJyYXk8SUFzc2V0PiA9IG51bGwpXG5cdHtcblx0XHRzdXBlcih0eXBlKTtcblxuXHRcdHRoaXMuX3VybCA9IHVybDtcblx0XHR0aGlzLl9jb250ZW50ID0gY29udGVudDtcblx0XHR0aGlzLl9hc3NldHMgPSBhc3NldHM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGNvbnRlbnQgcmV0dXJuZWQgaWYgdGhlIHJlc291cmNlIGhhcyBiZWVuIGxvYWRlZCBpbnNpZGUgYSA8Y29kZT5Mb2FkZXI8L2NvZGU+IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBnZXQgY29udGVudCgpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHJldHVybiB0aGlzLl9jb250ZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1cmwgb2YgdGhlIGxvYWRlZCByZXNvdXJjZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgdXJsKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdXJsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBlcnJvciBzdHJpbmcgb24gbG9hZEVycm9yLlxuXHQgKi9cblx0cHVibGljIGdldCBhc3NldHMoKTpJQXNzZXRbXVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2Fzc2V0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBDbG9uZXMgdGhlIGN1cnJlbnQgZXZlbnQuXG5cdCAqIEByZXR1cm4gQW4gZXhhY3QgZHVwbGljYXRlIG9mIHRoZSBjdXJyZW50IGV2ZW50LlxuXHQgKi9cblx0cHVibGljIGNsb25lKCk6RXZlbnRcblx0e1xuXHRcdHJldHVybiA8RXZlbnQ+IG5ldyBMb2FkZXJFdmVudCh0aGlzLnR5cGUsIHRoaXMuX3VybCwgdGhpcy5fY29udGVudCwgdGhpcy5fYXNzZXRzKTtcblx0fVxufVxuXG5leHBvcnQgPSBMb2FkZXJFdmVudDsiXX0= \ No newline at end of file diff --git a/lib/events/LoaderEvent.ts b/lib/events/LoaderEvent.ts new file mode 100644 index 00000000..11d4e9ff --- /dev/null +++ b/lib/events/LoaderEvent.ts @@ -0,0 +1,66 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import Event = require("awayjs-core/lib/events/Event"); + +class LoaderEvent extends Event +{ + /** + * Dispatched when a resource and all of its dependencies is retrieved. + */ + public static RESOURCE_COMPLETE:string = "resourceComplete"; + + private _url:string; + private _content:DisplayObject; + private _assets:IAsset[]; + + /** + * Create a new LoaderEvent object. + * + * @param type The event type. + * @param url The url of the loaded resource. + * @param assets The assets of the loaded resource. + */ + constructor(type:string, url:string = null, content:DisplayObject = null, assets:Array = null) + { + super(type); + + this._url = url; + this._content = content; + this._assets = assets; + } + + /** + * The content returned if the resource has been loaded inside a Loader object. + */ + public get content():DisplayObject + { + return this._content; + } + + /** + * The url of the loaded resource. + */ + public get url():string + { + return this._url; + } + + /** + * The error string on loadError. + */ + public get assets():IAsset[] + { + return this._assets; + } + + /** + * Clones the current event. + * @return An exact duplicate of the current event. + */ + public clone():Event + { + return new LoaderEvent(this.type, this._url, this._content, this._assets); + } +} + +export = LoaderEvent; \ No newline at end of file diff --git a/lib/events/MaterialEvent.js b/lib/events/MaterialEvent.js new file mode 100755 index 00000000..7ed2c47e --- /dev/null +++ b/lib/events/MaterialEvent.js @@ -0,0 +1,20 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var MaterialEvent = (function (_super) { + __extends(MaterialEvent, _super); + function MaterialEvent(type) { + _super.call(this, type); + } + MaterialEvent.SIZE_CHANGED = "sizeChanged"; + return MaterialEvent; +})(Event); + +module.exports = MaterialEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9NYXRlcmlhbEV2ZW50LnRzIl0sIm5hbWVzIjpbIk1hdGVyaWFsRXZlbnQiLCJNYXRlcmlhbEV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQTRCQSxnQ0FBS0E7SUFJaENBLHVCQUFZQSxJQUFXQTtRQUV0QkMsV0FBTUEsT0FBQUEsSUFBSUEsQ0FBQ0E7SUFDWkEsQ0FBQ0E7SUFMREQsNkJBQW9DQSxhQUFhQTtJQU1sREEscUJBQUNBO0FBQURBLENBQUNBLEVBUjJCLEtBQUssRUFRaEM7O0FBRUQsOEJBQXVCLENBQUEiLCJmaWxlIjoiZXZlbnRzL01hdGVyaWFsRXZlbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcblxuY2xhc3MgTWF0ZXJpYWxFdmVudCBleHRlbmRzIEV2ZW50XG57XG5cdHB1YmxpYyBzdGF0aWMgU0laRV9DSEFOR0VEOnN0cmluZyA9IFwic2l6ZUNoYW5nZWRcIjtcblxuXHRjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZylcblx0e1xuXHRcdHN1cGVyKHR5cGUpO1xuXHR9XG59XG5cbmV4cG9ydCA9IE1hdGVyaWFsRXZlbnQ7Il19 \ No newline at end of file diff --git a/lib/events/MaterialEvent.ts b/lib/events/MaterialEvent.ts new file mode 100644 index 00000000..57992da3 --- /dev/null +++ b/lib/events/MaterialEvent.ts @@ -0,0 +1,13 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class MaterialEvent extends Event +{ + public static SIZE_CHANGED:string = "sizeChanged"; + + constructor(type:string) + { + super(type); + } +} + +export = MaterialEvent; \ No newline at end of file diff --git a/lib/events/MouseEvent.js b/lib/events/MouseEvent.js new file mode 100755 index 00000000..4c818653 --- /dev/null +++ b/lib/events/MouseEvent.js @@ -0,0 +1,136 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* A MouseEvent is dispatched when a mouse event occurs over a mouseEnabled object in View. +* TODO: we don't have screenZ data, tho this should be easy to implement +*/ +var MouseEvent = (function (_super) { + __extends(MouseEvent, _super); + /** + * Create a new MouseEvent object. + * @param type The type of the MouseEvent. + */ + function MouseEvent(type) { + _super.call(this, type); + // Private. + this._iAllowedToPropagate = true; + } + Object.defineProperty(MouseEvent.prototype, "bubbles", { + /** + * @inheritDoc + */ + get: function () { + var doesBubble = this._iAllowedToPropagate; + this._iAllowedToPropagate = true; + + // Don't bubble if propagation has been stopped. + return doesBubble; + }, + enumerable: true, + configurable: true + }); + + /** + * @inheritDoc + */ + MouseEvent.prototype.stopPropagation = function () { + this._iAllowedToPropagate = false; + + if (this._iParentEvent) + this._iParentEvent.stopPropagation(); + }; + + /** + * @inheritDoc + */ + MouseEvent.prototype.stopImmediatePropagation = function () { + this._iAllowedToPropagate = false; + + if (this._iParentEvent) + this._iParentEvent.stopImmediatePropagation(); + }; + + /** + * Creates a copy of the MouseEvent object and sets the value of each property to match that of the original. + */ + MouseEvent.prototype.clone = function () { + var result = new MouseEvent(this.type); + + /* TODO: Debug / test - look into isDefaultPrevented + if (isDefaultPrevented()) + result.preventDefault(); + */ + result.screenX = this.screenX; + result.screenY = this.screenY; + + result.view = this.view; + result.object = this.object; + result.materialOwner = this.materialOwner; + result.material = this.material; + result.uv = this.uv; + result.localPosition = this.localPosition; + result.localNormal = this.localNormal; + result.index = this.index; + result.subGeometryIndex = this.subGeometryIndex; + result.delta = this.delta; + + result.ctrlKey = this.ctrlKey; + result.shiftKey = this.shiftKey; + + result._iParentEvent = this; + result._iAllowedToPropagate = this._iAllowedToPropagate; + + return result; + }; + + Object.defineProperty(MouseEvent.prototype, "scenePosition", { + /** + * The position in scene space where the event took place + */ + get: function () { + return this.object.sceneTransform.transformVector(this.localPosition); + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MouseEvent.prototype, "sceneNormal", { + /** + * The normal in scene space where the event took place + */ + get: function () { + var sceneNormal = this.object.sceneTransform.deltaTransformVector(this.localNormal); + sceneNormal.normalize(); + + return sceneNormal; + }, + enumerable: true, + configurable: true + }); + MouseEvent.MOUSE_OVER = "mouseOver3d"; + + MouseEvent.MOUSE_OUT = "mouseOut3d"; + + MouseEvent.MOUSE_UP = "mouseUp3d"; + + MouseEvent.MOUSE_DOWN = "mouseDown3d"; + + MouseEvent.MOUSE_MOVE = "mouseMove3d"; + + MouseEvent.CLICK = "click3d"; + + MouseEvent.DOUBLE_CLICK = "doubleClick3d"; + + MouseEvent.MOUSE_WHEEL = "mouseWheel3d"; + return MouseEvent; +})(Event); + +module.exports = MouseEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9Nb3VzZUV2ZW50LnRzIl0sIm5hbWVzIjpbIk1vdXNlRXZlbnQiLCJNb3VzZUV2ZW50LmNvbnN0cnVjdG9yIiwiTW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24iLCJNb3VzZUV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbiIsIk1vdXNlRXZlbnQuY2xvbmUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUsyRDs7QUFHM0Q7OztFQUdHO0FBQ0g7SUFBeUJBLDZCQUFLQTtJQXVJN0JBOzs7TUFER0E7SUFDSEEsb0JBQVlBLElBQVdBO1FBRXRCQyxXQUFNQSxPQUFBQSxJQUFJQSxDQUFDQTtRQXZJWkEsV0FBV0E7UUFDWEEsS0FBT0Esb0JBQW9CQSxHQUFXQSxJQUFJQSxDQUFDQTtJQXVJM0NBLENBQUNBO0lBS0REO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxJQUFJQSxVQUFVQSxHQUFXQSxJQUFJQSxDQUFDQSxvQkFBb0JBO1lBQ2xEQSxJQUFJQSxDQUFDQSxvQkFBb0JBLEdBQUdBLElBQUlBOztZQUVoQ0EsZ0RBQWdEQTtZQUNoREEsT0FBT0EsVUFBVUE7UUFDbEJBLENBQUNBOzs7O0FBQUFBO0lBS0RBOztNQURHQTsyQ0FDSEE7UUFFQ0UsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxHQUFHQSxLQUFLQTs7UUFFakNBLElBQUlBLElBQUlBLENBQUNBLGFBQWFBO1lBQ3JCQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUN2Q0EsQ0FBQ0E7O0lBS0RGOztNQURHQTtvREFDSEE7UUFFQ0csSUFBSUEsQ0FBQ0Esb0JBQW9CQSxHQUFHQSxLQUFLQTs7UUFFakNBLElBQUlBLElBQUlBLENBQUNBLGFBQWFBO1lBQ3JCQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSx3QkFBd0JBLENBQUNBLENBQUNBLENBQUNBO0lBQ2hEQSxDQUFDQTs7SUFLREg7O01BREdBO2lDQUNIQTtRQUVDSSxJQUFJQSxNQUFNQSxHQUFjQSxJQUFJQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTs7UUFFakRBOzs7VUFHR0E7UUFFSEEsTUFBTUEsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0E7UUFDN0JBLE1BQU1BLENBQUNBLE9BQU9BLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BOztRQUU3QkEsTUFBTUEsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUE7UUFDdkJBLE1BQU1BLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BO1FBQzNCQSxNQUFNQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUN6Q0EsTUFBTUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDL0JBLE1BQU1BLENBQUNBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLEVBQUVBO1FBQ25CQSxNQUFNQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUN6Q0EsTUFBTUEsQ0FBQ0EsV0FBV0EsR0FBR0EsSUFBSUEsQ0FBQ0EsV0FBV0E7UUFDckNBLE1BQU1BLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBO1FBQ3pCQSxNQUFNQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkE7UUFDL0NBLE1BQU1BLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBOztRQUV6QkEsTUFBTUEsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0E7UUFDN0JBLE1BQU1BLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBOztRQUUvQkEsTUFBTUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUE7UUFDM0JBLE1BQU1BLENBQUNBLG9CQUFvQkEsR0FBR0EsSUFBSUEsQ0FBQ0Esb0JBQW9CQTs7UUFFdkRBLE9BQU9BLE1BQU1BO0lBQ2RBLENBQUNBOztJQUtESjtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0E7UUFDdEVBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxJQUFJQSxXQUFXQSxHQUFZQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxjQUFjQSxDQUFDQSxvQkFBb0JBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBO1lBQzVGQSxXQUFXQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTs7WUFFdkJBLE9BQU9BLFdBQVdBO1FBQ25CQSxDQUFDQTs7OztBQUFBQSxJQXpOREEsd0JBQWtDQSxhQUFhQTs7SUFLL0NBLHVCQUFpQ0EsWUFBWUE7O0lBSzdDQSxzQkFBZ0NBLFdBQVdBOztJQUszQ0Esd0JBQWtDQSxhQUFhQTs7SUFLL0NBLHdCQUFrQ0EsYUFBYUE7O0lBZS9DQSxtQkFBNkJBLFNBQVNBOztJQUt0Q0EsMEJBQW9DQSxlQUFlQTs7SUFLbkRBLHlCQUFtQ0EsY0FBY0E7SUE2S2xEQSxrQkFBQ0E7QUFBREEsQ0FBQ0EsRUFuT3dCLEtBQUssRUFtTzdCOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImV2ZW50cy9Nb3VzZUV2ZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZpZXdcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udGFpbmVycy9WaWV3XCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgSU1hdGVyaWFsT3duZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0lNYXRlcmlhbE93bmVyXCIpO1xuaW1wb3J0IFBvaW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUG9pbnRcIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuaW1wb3J0IE1hdGVyaWFsQmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9NYXRlcmlhbEJhc2VcIik7XG5cbi8qKlxuICogQSBNb3VzZUV2ZW50IGlzIGRpc3BhdGNoZWQgd2hlbiBhIG1vdXNlIGV2ZW50IG9jY3VycyBvdmVyIGEgbW91c2VFbmFibGVkIG9iamVjdCBpbiBWaWV3LlxuICogVE9ETzogd2UgZG9uJ3QgaGF2ZSBzY3JlZW5aIGRhdGEsIHRobyB0aGlzIHNob3VsZCBiZSBlYXN5IHRvIGltcGxlbWVudFxuICovXG5jbGFzcyBNb3VzZUV2ZW50IGV4dGVuZHMgRXZlbnRcbntcblx0Ly8gUHJpdmF0ZS5cblx0cHVibGljIF9pQWxsb3dlZFRvUHJvcGFnYXRlOmJvb2xlYW4gPSB0cnVlO1xuXHRwdWJsaWMgX2lQYXJlbnRFdmVudDpNb3VzZUV2ZW50O1xuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBwcm9wZXJ0eSBvZiBhIG1vdXNlT3ZlcjNkIGV2ZW50IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTU9VU0VfT1ZFUjpzdHJpbmcgPSBcIm1vdXNlT3ZlcjNkXCI7XG5cblx0LyoqXG5cdCAqIERlZmluZXMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIHByb3BlcnR5IG9mIGEgbW91c2VPdXQzZCBldmVudCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIE1PVVNFX09VVDpzdHJpbmcgPSBcIm1vdXNlT3V0M2RcIjtcblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgcHJvcGVydHkgb2YgYSBtb3VzZVVwM2QgZXZlbnQgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBNT1VTRV9VUDpzdHJpbmcgPSBcIm1vdXNlVXAzZFwiO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBwcm9wZXJ0eSBvZiBhIG1vdXNlRG93bjNkIGV2ZW50IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTU9VU0VfRE9XTjpzdHJpbmcgPSBcIm1vdXNlRG93bjNkXCI7XG5cblx0LyoqXG5cdCAqIERlZmluZXMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIHByb3BlcnR5IG9mIGEgbW91c2VNb3ZlM2QgZXZlbnQgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBNT1VTRV9NT1ZFOnN0cmluZyA9IFwibW91c2VNb3ZlM2RcIjtcblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgcHJvcGVydHkgb2YgYSByb2xsT3ZlcjNkIGV2ZW50IG9iamVjdC5cblx0ICovXG4vL1x0XHRwdWJsaWMgc3RhdGljIFJPTExfT1ZFUiA6IHN0cmluZyA9IFwicm9sbE92ZXIzZFwiO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBwcm9wZXJ0eSBvZiBhIHJvbGxPdXQzZCBldmVudCBvYmplY3QuXG5cdCAqL1xuLy9cdFx0cHVibGljIHN0YXRpYyBST0xMX09VVCA6IHN0cmluZyA9IFwicm9sbE91dDNkXCI7XG5cblx0LyoqXG5cdCAqIERlZmluZXMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIHByb3BlcnR5IG9mIGEgY2xpY2szZCBldmVudCBvYmplY3QuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIENMSUNLOnN0cmluZyA9IFwiY2xpY2szZFwiO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSB2YWx1ZSBvZiB0aGUgdHlwZSBwcm9wZXJ0eSBvZiBhIGRvdWJsZUNsaWNrM2QgZXZlbnQgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBET1VCTEVfQ0xJQ0s6c3RyaW5nID0gXCJkb3VibGVDbGljazNkXCI7XG5cblx0LyoqXG5cdCAqIERlZmluZXMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIHByb3BlcnR5IG9mIGEgbW91c2VXaGVlbDNkIGV2ZW50IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTU9VU0VfV0hFRUw6c3RyaW5nID0gXCJtb3VzZVdoZWVsM2RcIjtcblxuXHQvKipcblx0ICogVGhlIGhvcml6b250YWwgY29vcmRpbmF0ZSBhdCB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQgaW4gdmlldyBjb29yZGluYXRlcy5cblx0ICovXG5cdHB1YmxpYyBzY3JlZW5YOm51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHZlcnRpY2FsIGNvb3JkaW5hdGUgYXQgd2hpY2ggdGhlIGV2ZW50IG9jY3VycmVkIGluIHZpZXcgY29vcmRpbmF0ZXMuXG5cdCAqL1xuXHRwdWJsaWMgc2NyZWVuWTpudW1iZXI7XG5cblx0LyoqXG5cdCAqIFRoZSB2aWV3IG9iamVjdCBpbnNpZGUgd2hpY2ggdGhlIGV2ZW50IHRvb2sgcGxhY2UuXG5cdCAqL1xuXHRwdWJsaWMgdmlldzpWaWV3O1xuXG5cdC8qKlxuXHQgKiBUaGUgM2Qgb2JqZWN0IGluc2lkZSB3aGljaCB0aGUgZXZlbnQgdG9vayBwbGFjZS5cblx0ICovXG5cdHB1YmxpYyBvYmplY3Q6RGlzcGxheU9iamVjdDtcblxuXHQvKipcblx0ICogVGhlIG1hdGVyaWFsIG93bmVyIGluc2lkZSB3aGljaCB0aGUgZXZlbnQgdG9vayBwbGFjZS5cblx0ICovXG5cdHB1YmxpYyBtYXRlcmlhbE93bmVyOklNYXRlcmlhbE93bmVyO1xuXG5cdC8qKlxuXHQgKiBUaGUgbWF0ZXJpYWwgb2YgdGhlIDNkIGVsZW1lbnQgaW5zaWRlIHdoaWNoIHRoZSBldmVudCB0b29rIHBsYWNlLlxuXHQgKi9cblx0cHVibGljIG1hdGVyaWFsOk1hdGVyaWFsQmFzZTtcblxuXHQvKipcblx0ICogVGhlIHV2IGNvb3JkaW5hdGUgaW5zaWRlIHRoZSBkcmF3IHByaW1pdGl2ZSB3aGVyZSB0aGUgZXZlbnQgdG9vayBwbGFjZS5cblx0ICovXG5cdHB1YmxpYyB1djpQb2ludDtcblxuXHQvKipcblx0ICogVGhlIGluZGV4IG9mIHRoZSBmYWNlIHdoZXJlIHRoZSBldmVudCB0b29rIHBsYWNlLlxuXHQgKi9cblx0cHVibGljIGluZGV4Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIGluZGV4IG9mIHRoZSBzdWJHZW9tZXRyeSB3aGVyZSB0aGUgZXZlbnQgdG9vayBwbGFjZS5cblx0ICovXG5cdHB1YmxpYyBzdWJHZW9tZXRyeUluZGV4Om51bWJlcjtcblxuXHQvKipcblx0ICogVGhlIHBvc2l0aW9uIGluIG9iamVjdCBzcGFjZSB3aGVyZSB0aGUgZXZlbnQgdG9vayBwbGFjZVxuXHQgKi9cblx0cHVibGljIGxvY2FsUG9zaXRpb246VmVjdG9yM0Q7XG5cblx0LyoqXG5cdCAqIFRoZSBub3JtYWwgaW4gb2JqZWN0IHNwYWNlIHdoZXJlIHRoZSBldmVudCB0b29rIHBsYWNlXG5cdCAqL1xuXHRwdWJsaWMgbG9jYWxOb3JtYWw6VmVjdG9yM0Q7XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBDb250cm9sIGtleSBpcyBhY3RpdmUgKHRydWUpIG9yIGluYWN0aXZlIChmYWxzZSkuXG5cdCAqL1xuXHRwdWJsaWMgY3RybEtleTpib29sZWFuO1xuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQWx0IGtleSBpcyBhY3RpdmUgKHRydWUpIG9yIGluYWN0aXZlIChmYWxzZSkuXG5cdCAqL1xuXHRwdWJsaWMgYWx0S2V5OmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBTaGlmdCBrZXkgaXMgYWN0aXZlICh0cnVlKSBvciBpbmFjdGl2ZSAoZmFsc2UpLlxuXHQgKi9cblx0cHVibGljIHNoaWZ0S2V5OmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyBob3cgbWFueSBsaW5lcyBzaG91bGQgYmUgc2Nyb2xsZWQgZm9yIGVhY2ggdW5pdCB0aGUgdXNlciByb3RhdGVzIHRoZSBtb3VzZSB3aGVlbC5cblx0ICovXG5cdHB1YmxpYyBkZWx0YTpudW1iZXI7XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIG5ldyBNb3VzZUV2ZW50IG9iamVjdC5cblx0ICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgb2YgdGhlIE1vdXNlRXZlbnQuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZylcblx0e1xuXHRcdHN1cGVyKHR5cGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGJ1YmJsZXMoKTpib29sZWFuXG5cdHtcblx0XHR2YXIgZG9lc0J1YmJsZTpib29sZWFuID0gdGhpcy5faUFsbG93ZWRUb1Byb3BhZ2F0ZTtcblx0XHR0aGlzLl9pQWxsb3dlZFRvUHJvcGFnYXRlID0gdHJ1ZTtcblxuXHRcdC8vIERvbid0IGJ1YmJsZSBpZiBwcm9wYWdhdGlvbiBoYXMgYmVlbiBzdG9wcGVkLlxuXHRcdHJldHVybiBkb2VzQnViYmxlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgc3RvcFByb3BhZ2F0aW9uKClcblx0e1xuXHRcdHRoaXMuX2lBbGxvd2VkVG9Qcm9wYWdhdGUgPSBmYWxzZTtcblxuXHRcdGlmICh0aGlzLl9pUGFyZW50RXZlbnQpXG5cdFx0XHR0aGlzLl9pUGFyZW50RXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKVxuXHR7XG5cdFx0dGhpcy5faUFsbG93ZWRUb1Byb3BhZ2F0ZSA9IGZhbHNlO1xuXG5cdFx0aWYgKHRoaXMuX2lQYXJlbnRFdmVudClcblx0XHRcdHRoaXMuX2lQYXJlbnRFdmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgTW91c2VFdmVudCBvYmplY3QgYW5kIHNldHMgdGhlIHZhbHVlIG9mIGVhY2ggcHJvcGVydHkgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgb3JpZ2luYWwuXG5cdCAqL1xuXHRwdWJsaWMgY2xvbmUoKTpFdmVudFxuXHR7XG5cdFx0dmFyIHJlc3VsdDpNb3VzZUV2ZW50ID0gbmV3IE1vdXNlRXZlbnQodGhpcy50eXBlKTtcblxuXHRcdC8qIFRPRE86IERlYnVnIC8gdGVzdCAtIGxvb2sgaW50byBpc0RlZmF1bHRQcmV2ZW50ZWRcblx0XHQgaWYgKGlzRGVmYXVsdFByZXZlbnRlZCgpKVxuXHRcdCByZXN1bHQucHJldmVudERlZmF1bHQoKTtcblx0XHQgKi9cblxuXHRcdHJlc3VsdC5zY3JlZW5YID0gdGhpcy5zY3JlZW5YO1xuXHRcdHJlc3VsdC5zY3JlZW5ZID0gdGhpcy5zY3JlZW5ZO1xuXG5cdFx0cmVzdWx0LnZpZXcgPSB0aGlzLnZpZXc7XG5cdFx0cmVzdWx0Lm9iamVjdCA9IHRoaXMub2JqZWN0O1xuXHRcdHJlc3VsdC5tYXRlcmlhbE93bmVyID0gdGhpcy5tYXRlcmlhbE93bmVyO1xuXHRcdHJlc3VsdC5tYXRlcmlhbCA9IHRoaXMubWF0ZXJpYWw7XG5cdFx0cmVzdWx0LnV2ID0gdGhpcy51djtcblx0XHRyZXN1bHQubG9jYWxQb3NpdGlvbiA9IHRoaXMubG9jYWxQb3NpdGlvbjtcblx0XHRyZXN1bHQubG9jYWxOb3JtYWwgPSB0aGlzLmxvY2FsTm9ybWFsO1xuXHRcdHJlc3VsdC5pbmRleCA9IHRoaXMuaW5kZXg7XG5cdFx0cmVzdWx0LnN1Ykdlb21ldHJ5SW5kZXggPSB0aGlzLnN1Ykdlb21ldHJ5SW5kZXg7XG5cdFx0cmVzdWx0LmRlbHRhID0gdGhpcy5kZWx0YTtcblxuXHRcdHJlc3VsdC5jdHJsS2V5ID0gdGhpcy5jdHJsS2V5O1xuXHRcdHJlc3VsdC5zaGlmdEtleSA9IHRoaXMuc2hpZnRLZXk7XG5cblx0XHRyZXN1bHQuX2lQYXJlbnRFdmVudCA9IHRoaXM7XG5cdFx0cmVzdWx0Ll9pQWxsb3dlZFRvUHJvcGFnYXRlID0gdGhpcy5faUFsbG93ZWRUb1Byb3BhZ2F0ZTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHBvc2l0aW9uIGluIHNjZW5lIHNwYWNlIHdoZXJlIHRoZSBldmVudCB0b29rIHBsYWNlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNjZW5lUG9zaXRpb24oKTpWZWN0b3IzRFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMub2JqZWN0LnNjZW5lVHJhbnNmb3JtLnRyYW5zZm9ybVZlY3Rvcih0aGlzLmxvY2FsUG9zaXRpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBub3JtYWwgaW4gc2NlbmUgc3BhY2Ugd2hlcmUgdGhlIGV2ZW50IHRvb2sgcGxhY2Vcblx0ICovXG5cdHB1YmxpYyBnZXQgc2NlbmVOb3JtYWwoKTpWZWN0b3IzRFxuXHR7XG5cdFx0dmFyIHNjZW5lTm9ybWFsOlZlY3RvcjNEID0gdGhpcy5vYmplY3Quc2NlbmVUcmFuc2Zvcm0uZGVsdGFUcmFuc2Zvcm1WZWN0b3IodGhpcy5sb2NhbE5vcm1hbCk7XG5cdFx0c2NlbmVOb3JtYWwubm9ybWFsaXplKCk7XG5cblx0XHRyZXR1cm4gc2NlbmVOb3JtYWw7XG5cdH1cbn1cblxuZXhwb3J0ID0gTW91c2VFdmVudDsiXX0= \ No newline at end of file diff --git a/lib/events/MouseEvent.ts b/lib/events/MouseEvent.ts new file mode 100644 index 00000000..a06544d2 --- /dev/null +++ b/lib/events/MouseEvent.ts @@ -0,0 +1,242 @@ +import View = require("awayjs-core/lib/containers/View"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import Point = require("awayjs-core/lib/core/geom/Point"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import Event = require("awayjs-core/lib/events/Event"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); + +/** + * A MouseEvent is dispatched when a mouse event occurs over a mouseEnabled object in View. + * TODO: we don't have screenZ data, tho this should be easy to implement + */ +class MouseEvent extends Event +{ + // Private. + public _iAllowedToPropagate:boolean = true; + public _iParentEvent:MouseEvent; + + /** + * Defines the value of the type property of a mouseOver3d event object. + */ + public static MOUSE_OVER:string = "mouseOver3d"; + + /** + * Defines the value of the type property of a mouseOut3d event object. + */ + public static MOUSE_OUT:string = "mouseOut3d"; + + /** + * Defines the value of the type property of a mouseUp3d event object. + */ + public static MOUSE_UP:string = "mouseUp3d"; + + /** + * Defines the value of the type property of a mouseDown3d event object. + */ + public static MOUSE_DOWN:string = "mouseDown3d"; + + /** + * Defines the value of the type property of a mouseMove3d event object. + */ + public static MOUSE_MOVE:string = "mouseMove3d"; + + /** + * Defines the value of the type property of a rollOver3d event object. + */ +// public static ROLL_OVER : string = "rollOver3d"; + + /** + * Defines the value of the type property of a rollOut3d event object. + */ +// public static ROLL_OUT : string = "rollOut3d"; + + /** + * Defines the value of the type property of a click3d event object. + */ + public static CLICK:string = "click3d"; + + /** + * Defines the value of the type property of a doubleClick3d event object. + */ + public static DOUBLE_CLICK:string = "doubleClick3d"; + + /** + * Defines the value of the type property of a mouseWheel3d event object. + */ + public static MOUSE_WHEEL:string = "mouseWheel3d"; + + /** + * The horizontal coordinate at which the event occurred in view coordinates. + */ + public screenX:number; + + /** + * The vertical coordinate at which the event occurred in view coordinates. + */ + public screenY:number; + + /** + * The view object inside which the event took place. + */ + public view:View; + + /** + * The 3d object inside which the event took place. + */ + public object:DisplayObject; + + /** + * The material owner inside which the event took place. + */ + public materialOwner:IMaterialOwner; + + /** + * The material of the 3d element inside which the event took place. + */ + public material:MaterialBase; + + /** + * The uv coordinate inside the draw primitive where the event took place. + */ + public uv:Point; + + /** + * The index of the face where the event took place. + */ + public index:number; + + /** + * The index of the subGeometry where the event took place. + */ + public subGeometryIndex:number; + + /** + * The position in object space where the event took place + */ + public localPosition:Vector3D; + + /** + * The normal in object space where the event took place + */ + public localNormal:Vector3D; + + /** + * Indicates whether the Control key is active (true) or inactive (false). + */ + public ctrlKey:boolean; + + /** + * Indicates whether the Alt key is active (true) or inactive (false). + */ + public altKey:boolean; + + /** + * Indicates whether the Shift key is active (true) or inactive (false). + */ + public shiftKey:boolean; + + /** + * Indicates how many lines should be scrolled for each unit the user rotates the mouse wheel. + */ + public delta:number; + + /** + * Create a new MouseEvent object. + * @param type The type of the MouseEvent. + */ + constructor(type:string) + { + super(type); + } + + /** + * @inheritDoc + */ + public get bubbles():boolean + { + var doesBubble:boolean = this._iAllowedToPropagate; + this._iAllowedToPropagate = true; + + // Don't bubble if propagation has been stopped. + return doesBubble; + } + + /** + * @inheritDoc + */ + public stopPropagation() + { + this._iAllowedToPropagate = false; + + if (this._iParentEvent) + this._iParentEvent.stopPropagation(); + } + + /** + * @inheritDoc + */ + public stopImmediatePropagation() + { + this._iAllowedToPropagate = false; + + if (this._iParentEvent) + this._iParentEvent.stopImmediatePropagation(); + } + + /** + * Creates a copy of the MouseEvent object and sets the value of each property to match that of the original. + */ + public clone():Event + { + var result:MouseEvent = new MouseEvent(this.type); + + /* TODO: Debug / test - look into isDefaultPrevented + if (isDefaultPrevented()) + result.preventDefault(); + */ + + result.screenX = this.screenX; + result.screenY = this.screenY; + + result.view = this.view; + result.object = this.object; + result.materialOwner = this.materialOwner; + result.material = this.material; + result.uv = this.uv; + result.localPosition = this.localPosition; + result.localNormal = this.localNormal; + result.index = this.index; + result.subGeometryIndex = this.subGeometryIndex; + result.delta = this.delta; + + result.ctrlKey = this.ctrlKey; + result.shiftKey = this.shiftKey; + + result._iParentEvent = this; + result._iAllowedToPropagate = this._iAllowedToPropagate; + + return result; + } + + /** + * The position in scene space where the event took place + */ + public get scenePosition():Vector3D + { + return this.object.sceneTransform.transformVector(this.localPosition); + } + + /** + * The normal in scene space where the event took place + */ + public get sceneNormal():Vector3D + { + var sceneNormal:Vector3D = this.object.sceneTransform.deltaTransformVector(this.localNormal); + sceneNormal.normalize(); + + return sceneNormal; + } +} + +export = MouseEvent; \ No newline at end of file diff --git a/lib/events/ParserEvent.js b/lib/events/ParserEvent.js new file mode 100755 index 00000000..514ee03f --- /dev/null +++ b/lib/events/ParserEvent.js @@ -0,0 +1,41 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var ParserEvent = (function (_super) { + __extends(ParserEvent, _super); + function ParserEvent(type, message) { + if (typeof message === "undefined") { message = ''; } + _super.call(this, type); + + this._message = message; + } + Object.defineProperty(ParserEvent.prototype, "message", { + /** + * Additional human-readable message. Usually supplied for ParserEvent.PARSE_ERROR events. + */ + get: function () { + return this._message; + }, + enumerable: true, + configurable: true + }); + + ParserEvent.prototype.clone = function () { + return new ParserEvent(this.type, this.message); + }; + ParserEvent.PARSE_COMPLETE = 'parseComplete'; + + ParserEvent.PARSE_ERROR = 'parseError'; + + ParserEvent.READY_FOR_DEPENDENCIES = 'readyForDependencies'; + return ParserEvent; +})(Event); + +module.exports = ParserEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9QYXJzZXJFdmVudC50cyJdLCJuYW1lcyI6WyJQYXJzZXJFdmVudCIsIlBhcnNlckV2ZW50LmNvbnN0cnVjdG9yIiwiUGFyc2VyRXZlbnQuY2xvbmUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUEyRDs7QUFFM0Q7SUFBMEJBLDhCQUFLQTtJQXdCOUJBLHFCQUFZQSxJQUFXQSxFQUFFQSxPQUFtQkE7UUFBbkJDLHNDQUFBQSxPQUFPQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUUzQ0EsV0FBTUEsT0FBQUEsSUFBSUEsQ0FBQ0E7O1FBRVhBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLE9BQU9BO0lBQ3hCQSxDQUFDQTtJQU1ERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBOzs7O0FBQUFBO0lBR0RBLDhCQUFBQTtRQUVDRSxPQUFPQSxJQUFJQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQTtJQUNoREEsQ0FBQ0E7SUFyQ0RGLDZCQUFzQ0EsZUFBZUE7O0lBTXJEQSwwQkFBbUNBLFlBQVlBOztJQVEvQ0EscUNBQThDQSxzQkFBc0JBO0lBd0JyRUEsbUJBQUNBO0FBQURBLENBQUNBLEVBN0N5QixLQUFLLEVBNkM5Qjs7QUFFRCw0QkFBcUIsQ0FBQSIsImZpbGUiOiJldmVudHMvUGFyc2VyRXZlbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcblxuY2xhc3MgUGFyc2VyRXZlbnQgZXh0ZW5kcyBFdmVudFxue1xuXHRwcml2YXRlIF9tZXNzYWdlOnN0cmluZztcblxuXHQvKipcblx0ICogRGlzcGF0Y2hlZCB3aGVuIHBhcnNpbmcgb2YgYW4gYXNzZXQgY29tcGxldGVkLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBQQVJTRV9DT01QTEVURTpzdHJpbmcgPSAncGFyc2VDb21wbGV0ZSc7XG5cblx0LyoqXG5cdCAqIERpc3BhdGNoZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgcGFyc2luZyB0aGUgZGF0YSAoZS5nLiBiZWNhdXNlIGl0J3Ncblx0ICogaW5jb3JyZWN0bHkgZm9ybWF0dGVkLilcblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgUEFSU0VfRVJST1I6c3RyaW5nID0gJ3BhcnNlRXJyb3InO1xuXG5cblx0LyoqXG5cdCAqIERpc3BhdGNoZWQgd2hlbiBhIHBhcnNlciBpcyByZWFkeSB0byBoYXZlIGRlcGVuZGVuY2llcyByZXRyaWV2ZWQgYW5kIHJlc29sdmVkLlxuXHQgKiBUaGlzIGlzIGFuIGludGVybmFsIGV2ZW50IHRoYXQgc2hvdWxkIHJhcmVseSAoaWYgZXZlcikgYmUgbGlzdGVuZWQgZm9yIGJ5XG5cdCAqIGV4dGVybmFsIGNsYXNzZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFJFQURZX0ZPUl9ERVBFTkRFTkNJRVM6c3RyaW5nID0gJ3JlYWR5Rm9yRGVwZW5kZW5jaWVzJztcblxuXG5cdGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nLCBtZXNzYWdlOnN0cmluZyA9ICcnKVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cblx0XHR0aGlzLl9tZXNzYWdlID0gbWVzc2FnZTtcblx0fVxuXG5cblx0LyoqXG5cdCAqIEFkZGl0aW9uYWwgaHVtYW4tcmVhZGFibGUgbWVzc2FnZS4gVXN1YWxseSBzdXBwbGllZCBmb3IgUGFyc2VyRXZlbnQuUEFSU0VfRVJST1IgZXZlbnRzLlxuXHQgKi9cblx0cHVibGljIGdldCBtZXNzYWdlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fbWVzc2FnZTtcblx0fVxuXG5cblx0cHVibGljIGNsb25lKCk6RXZlbnRcblx0e1xuXHRcdHJldHVybiBuZXcgUGFyc2VyRXZlbnQodGhpcy50eXBlLCB0aGlzLm1lc3NhZ2UpO1xuXHR9XG59XG5cbmV4cG9ydCA9IFBhcnNlckV2ZW50OyJdfQ== \ No newline at end of file diff --git a/lib/events/ParserEvent.ts b/lib/events/ParserEvent.ts new file mode 100644 index 00000000..bef71166 --- /dev/null +++ b/lib/events/ParserEvent.ts @@ -0,0 +1,50 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class ParserEvent extends Event +{ + private _message:string; + + /** + * Dispatched when parsing of an asset completed. + */ + public static PARSE_COMPLETE:string = 'parseComplete'; + + /** + * Dispatched when an error occurs while parsing the data (e.g. because it's + * incorrectly formatted.) + */ + public static PARSE_ERROR:string = 'parseError'; + + + /** + * Dispatched when a parser is ready to have dependencies retrieved and resolved. + * This is an internal event that should rarely (if ever) be listened for by + * external classes. + */ + public static READY_FOR_DEPENDENCIES:string = 'readyForDependencies'; + + + constructor(type:string, message:string = '') + { + super(type); + + this._message = message; + } + + + /** + * Additional human-readable message. Usually supplied for ParserEvent.PARSE_ERROR events. + */ + public get message():string + { + return this._message; + } + + + public clone():Event + { + return new ParserEvent(this.type, this.message); + } +} + +export = ParserEvent; \ No newline at end of file diff --git a/lib/events/ProgressEvent.js b/lib/events/ProgressEvent.js new file mode 100755 index 00000000..f2d3ac4d --- /dev/null +++ b/lib/events/ProgressEvent.js @@ -0,0 +1,20 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var ProgressEvent = (function (_super) { + __extends(ProgressEvent, _super); + function ProgressEvent(type) { + _super.call(this, type); + } + ProgressEvent.PROGRESS = "progress"; + return ProgressEvent; +})(Event); + +module.exports = ProgressEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9Qcm9ncmVzc0V2ZW50LnRzIl0sIm5hbWVzIjpbIlByb2dyZXNzRXZlbnQiLCJQcm9ncmVzc0V2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQTRCQSxnQ0FBS0E7SUFRaENBLHVCQUFZQSxJQUFXQTtRQUV0QkMsV0FBTUEsT0FBQUEsSUFBSUEsQ0FBQ0E7SUFDWkEsQ0FBQ0E7SUFUREQseUJBQWdDQSxVQUFVQTtJQVUzQ0EscUJBQUNBO0FBQURBLENBQUNBLEVBWjJCLEtBQUssRUFZaEM7O0FBRUQsOEJBQXVCLENBQUEiLCJmaWxlIjoiZXZlbnRzL1Byb2dyZXNzRXZlbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcblxuY2xhc3MgUHJvZ3Jlc3NFdmVudCBleHRlbmRzIEV2ZW50XG57XG5cdHB1YmxpYyBzdGF0aWMgUFJPR1JFU1M6c3RyaW5nID0gXCJwcm9ncmVzc1wiO1xuXG5cdHB1YmxpYyBieXRlc0xvYWRlZDpudW1iZXI7XG5cblx0cHVibGljIGJ5dGVzVG90YWw6bnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nKVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gUHJvZ3Jlc3NFdmVudDsiXX0= \ No newline at end of file diff --git a/lib/events/ProgressEvent.ts b/lib/events/ProgressEvent.ts new file mode 100644 index 00000000..8cf4cc5e --- /dev/null +++ b/lib/events/ProgressEvent.ts @@ -0,0 +1,17 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class ProgressEvent extends Event +{ + public static PROGRESS:string = "progress"; + + public bytesLoaded:number; + + public bytesTotal:number; + + constructor(type:string) + { + super(type); + } +} + +export = ProgressEvent; \ No newline at end of file diff --git a/lib/events/ProjectionEvent.js b/lib/events/ProjectionEvent.js new file mode 100755 index 00000000..cf7f5910 --- /dev/null +++ b/lib/events/ProjectionEvent.js @@ -0,0 +1,28 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var ProjectionEvent = (function (_super) { + __extends(ProjectionEvent, _super); + function ProjectionEvent(type, projection) { + _super.call(this, type); + this._projection = projection; + } + Object.defineProperty(ProjectionEvent.prototype, "projection", { + get: function () { + return this._projection; + }, + enumerable: true, + configurable: true + }); + ProjectionEvent.MATRIX_CHANGED = "matrixChanged"; + return ProjectionEvent; +})(Event); + +module.exports = ProjectionEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9Qcm9qZWN0aW9uRXZlbnQudHMiXSwibmFtZXMiOlsiUHJvamVjdGlvbkV2ZW50IiwiUHJvamVjdGlvbkV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRzNEO0lBQThCQSxrQ0FBS0E7SUFNbENBLHlCQUFZQSxJQUFXQSxFQUFFQSxVQUFzQkE7UUFFOUNDLFdBQU1BLE9BQUFBLElBQUlBLENBQUNBO1FBQ1hBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLFVBQVVBO0lBQzlCQSxDQUFDQTtJQUVERDtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxXQUFXQTtRQUN4QkEsQ0FBQ0E7Ozs7QUFBQUEsSUFiREEsaUNBQXNDQSxlQUFlQTtJQWN0REEsdUJBQUNBO0FBQURBLENBQUNBLEVBaEI2QixLQUFLLEVBZ0JsQzs7QUFFRCxnQ0FBeUIsQ0FBQSIsImZpbGUiOiJldmVudHMvUHJvamVjdGlvbkV2ZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnRcIik7XG5pbXBvcnQgSVByb2plY3Rpb25cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9JUHJvamVjdGlvblwiKTtcblxuY2xhc3MgUHJvamVjdGlvbkV2ZW50IGV4dGVuZHMgRXZlbnRcbntcblx0cHVibGljIHN0YXRpYyBNQVRSSVhfQ0hBTkdFRDpzdHJpbmcgPSBcIm1hdHJpeENoYW5nZWRcIjtcblxuXHRwcml2YXRlIF9wcm9qZWN0aW9uOklQcm9qZWN0aW9uO1xuXG5cdGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nLCBwcm9qZWN0aW9uOklQcm9qZWN0aW9uKVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cdFx0dGhpcy5fcHJvamVjdGlvbiA9IHByb2plY3Rpb247XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHByb2plY3Rpb24oKTpJUHJvamVjdGlvblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3Byb2plY3Rpb247XG5cdH1cbn1cblxuZXhwb3J0ID0gUHJvamVjdGlvbkV2ZW50OyJdfQ== \ No newline at end of file diff --git a/lib/events/ProjectionEvent.ts b/lib/events/ProjectionEvent.ts new file mode 100644 index 00000000..9d345265 --- /dev/null +++ b/lib/events/ProjectionEvent.ts @@ -0,0 +1,22 @@ +import Event = require("awayjs-core/lib/events/Event"); +import IProjection = require("awayjs-core/lib/projections/IProjection"); + +class ProjectionEvent extends Event +{ + public static MATRIX_CHANGED:string = "matrixChanged"; + + private _projection:IProjection; + + constructor(type:string, projection:IProjection) + { + super(type); + this._projection = projection; + } + + public get projection():IProjection + { + return this._projection; + } +} + +export = ProjectionEvent; \ No newline at end of file diff --git a/lib/events/RendererEvent.js b/lib/events/RendererEvent.js new file mode 100755 index 00000000..d3d37cb4 --- /dev/null +++ b/lib/events/RendererEvent.js @@ -0,0 +1,21 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var RendererEvent = (function (_super) { + __extends(RendererEvent, _super); + function RendererEvent(type) { + _super.call(this, type); + } + RendererEvent.VIEWPORT_UPDATED = "viewportUpdated"; + RendererEvent.SCISSOR_UPDATED = "scissorUpdated"; + return RendererEvent; +})(Event); + +module.exports = RendererEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9SZW5kZXJlckV2ZW50LnRzIl0sIm5hbWVzIjpbIlJlbmRlcmVyRXZlbnQiLCJSZW5kZXJlckV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQTRCQSxnQ0FBS0E7SUFLaENBLHVCQUFZQSxJQUFXQTtRQUV0QkMsV0FBTUEsT0FBQUEsSUFBSUEsQ0FBQ0E7SUFDWkEsQ0FBQ0E7SUFOREQsaUNBQXdDQSxpQkFBaUJBO0lBQ3pEQSxnQ0FBdUNBLGdCQUFnQkE7SUFNeERBLHFCQUFDQTtBQUFEQSxDQUFDQSxFQVQyQixLQUFLLEVBU2hDOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6ImV2ZW50cy9SZW5kZXJlckV2ZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnRcIik7XG5cbmNsYXNzIFJlbmRlcmVyRXZlbnQgZXh0ZW5kcyBFdmVudFxue1xuXHRwdWJsaWMgc3RhdGljIFZJRVdQT1JUX1VQREFURUQ6c3RyaW5nID0gXCJ2aWV3cG9ydFVwZGF0ZWRcIjtcblx0cHVibGljIHN0YXRpYyBTQ0lTU09SX1VQREFURUQ6c3RyaW5nID0gXCJzY2lzc29yVXBkYXRlZFwiO1xuXG5cdGNvbnN0cnVjdG9yKHR5cGU6c3RyaW5nKVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gUmVuZGVyZXJFdmVudDsiXX0= \ No newline at end of file diff --git a/lib/events/RendererEvent.ts b/lib/events/RendererEvent.ts new file mode 100644 index 00000000..398e5141 --- /dev/null +++ b/lib/events/RendererEvent.ts @@ -0,0 +1,14 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class RendererEvent extends Event +{ + public static VIEWPORT_UPDATED:string = "viewportUpdated"; + public static SCISSOR_UPDATED:string = "scissorUpdated"; + + constructor(type:string) + { + super(type); + } +} + +export = RendererEvent; \ No newline at end of file diff --git a/lib/events/ResizeEvent.js b/lib/events/ResizeEvent.js new file mode 100755 index 00000000..7c9db386 --- /dev/null +++ b/lib/events/ResizeEvent.js @@ -0,0 +1,40 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var ResizeEvent = (function (_super) { + __extends(ResizeEvent, _super); + function ResizeEvent(type, oldHeight, oldWidth) { + if (typeof oldHeight === "undefined") { oldHeight = NaN; } + if (typeof oldWidth === "undefined") { oldWidth = NaN; } + _super.call(this, type); + + this._oldHeight = oldHeight; + this._oldWidth = oldWidth; + } + Object.defineProperty(ResizeEvent.prototype, "oldHeight", { + get: function () { + return this._oldHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResizeEvent.prototype, "oldWidth", { + get: function () { + return this._oldWidth; + }, + enumerable: true, + configurable: true + }); + ResizeEvent.RESIZE = "resize"; + return ResizeEvent; +})(Event); + +module.exports = ResizeEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9SZXNpemVFdmVudC50cyJdLCJuYW1lcyI6WyJSZXNpemVFdmVudCIsIlJlc2l6ZUV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQTBCQSw4QkFBS0E7SUFPOUJBLHFCQUFZQSxJQUFXQSxFQUFFQSxTQUFzQkEsRUFBRUEsUUFBcUJBO1FBQTdDQyx3Q0FBQUEsU0FBU0EsR0FBVUEsR0FBR0E7QUFBQUEsUUFBRUEsdUNBQUFBLFFBQVFBLEdBQVVBLEdBQUdBO0FBQUFBLFFBRXJFQSxXQUFNQSxPQUFBQSxJQUFJQSxDQUFDQTs7UUFFWEEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsU0FBU0E7UUFDM0JBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLFFBQVFBO0lBQzFCQSxDQUFDQTtJQUVERDtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxVQUFVQTtRQUN2QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFFREE7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsU0FBU0E7UUFDdEJBLENBQUNBOzs7O0FBQUFBLElBckJEQSxxQkFBOEJBLFFBQVFBO0lBc0J2Q0EsbUJBQUNBO0FBQURBLENBQUNBLEVBeEJ5QixLQUFLLEVBd0I5Qjs7QUFFRCw0QkFBcUIsQ0FBQSIsImZpbGUiOiJldmVudHMvUmVzaXplRXZlbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcblxuY2xhc3MgUmVzaXplRXZlbnQgZXh0ZW5kcyBFdmVudFxue1xuXHRwdWJsaWMgc3RhdGljIFJFU0laRTpzdHJpbmcgPSBcInJlc2l6ZVwiO1xuXG5cdHByaXZhdGUgX29sZEhlaWdodDpudW1iZXI7XG5cdHByaXZhdGUgX29sZFdpZHRoOm51bWJlcjtcblxuXHRjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZywgb2xkSGVpZ2h0Om51bWJlciA9IE5hTiwgb2xkV2lkdGg6bnVtYmVyID0gTmFOKVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cblx0XHR0aGlzLl9vbGRIZWlnaHQgPSBvbGRIZWlnaHQ7XG5cdFx0dGhpcy5fb2xkV2lkdGggPSBvbGRXaWR0aDtcblx0fVxuXG5cdHB1YmxpYyBnZXQgb2xkSGVpZ2h0KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fb2xkSGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIGdldCBvbGRXaWR0aCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX29sZFdpZHRoO1xuXHR9XG59XG5cbmV4cG9ydCA9IFJlc2l6ZUV2ZW50OyJdfQ== \ No newline at end of file diff --git a/lib/events/ResizeEvent.ts b/lib/events/ResizeEvent.ts new file mode 100644 index 00000000..b7c84d07 --- /dev/null +++ b/lib/events/ResizeEvent.ts @@ -0,0 +1,29 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class ResizeEvent extends Event +{ + public static RESIZE:string = "resize"; + + private _oldHeight:number; + private _oldWidth:number; + + constructor(type:string, oldHeight:number = NaN, oldWidth:number = NaN) + { + super(type); + + this._oldHeight = oldHeight; + this._oldWidth = oldWidth; + } + + public get oldHeight():number + { + return this._oldHeight; + } + + public get oldWidth():number + { + return this._oldWidth; + } +} + +export = ResizeEvent; \ No newline at end of file diff --git a/lib/events/SceneEvent.js b/lib/events/SceneEvent.js new file mode 100755 index 00000000..335dd085 --- /dev/null +++ b/lib/events/SceneEvent.js @@ -0,0 +1,26 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var SceneEvent = (function (_super) { + __extends(SceneEvent, _super); + function SceneEvent(type, displayObject) { + _super.call(this, type); + + this.displayObject = displayObject; + } + SceneEvent.ADDED_TO_SCENE = "addedToScene"; + + SceneEvent.REMOVED_FROM_SCENE = "removedFromScene"; + + SceneEvent.PARTITION_CHANGED = "partitionChanged"; + return SceneEvent; +})(Event); + +module.exports = SceneEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9TY2VuZUV2ZW50LnRzIl0sIm5hbWVzIjpbIlNjZW5lRXZlbnQiLCJTY2VuZUV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFDMkQ7O0FBRTNEO0lBQXlCQSw2QkFBS0E7SUFzQjdCQSxvQkFBWUEsSUFBV0EsRUFBRUEsYUFBMkJBO1FBRW5EQyxXQUFNQSxPQUFBQSxJQUFJQSxDQUFDQTs7UUFFWEEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsYUFBYUE7SUFDbkNBLENBQUNBO0lBdEJERCw0QkFBc0NBLGNBQWNBOztJQUtwREEsZ0NBQTBDQSxrQkFBa0JBOztJQUs1REEsK0JBQXlDQSxrQkFBa0JBO0lBYTVEQSxrQkFBQ0E7QUFBREEsQ0FBQ0EsRUE1QndCLEtBQUssRUE0QjdCOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6ImV2ZW50cy9TY2VuZUV2ZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcblxuY2xhc3MgU2NlbmVFdmVudCBleHRlbmRzIEV2ZW50XG57XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBBRERFRF9UT19TQ0VORTpzdHJpbmcgPSBcImFkZGVkVG9TY2VuZVwiO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBSRU1PVkVEX0ZST01fU0NFTkU6c3RyaW5nID0gXCJyZW1vdmVkRnJvbVNjZW5lXCI7XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFBBUlRJVElPTl9DSEFOR0VEOnN0cmluZyA9IFwicGFydGl0aW9uQ2hhbmdlZFwiO1xuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGRpc3BsYXlPYmplY3Q6RGlzcGxheU9iamVjdDtcblxuXHRjb25zdHJ1Y3Rvcih0eXBlOnN0cmluZywgZGlzcGxheU9iamVjdDpEaXNwbGF5T2JqZWN0KVxuXHR7XG5cdFx0c3VwZXIodHlwZSk7XG5cblx0XHR0aGlzLmRpc3BsYXlPYmplY3QgPSBkaXNwbGF5T2JqZWN0O1xuXHR9XG59XG5cbmV4cG9ydCA9IFNjZW5lRXZlbnQ7Il19 \ No newline at end of file diff --git a/lib/events/SceneEvent.ts b/lib/events/SceneEvent.ts new file mode 100644 index 00000000..93b70453 --- /dev/null +++ b/lib/events/SceneEvent.ts @@ -0,0 +1,34 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Event = require("awayjs-core/lib/events/Event"); + +class SceneEvent extends Event +{ + /** + * + */ + public static ADDED_TO_SCENE:string = "addedToScene"; + + /** + * + */ + public static REMOVED_FROM_SCENE:string = "removedFromScene"; + + /** + * + */ + public static PARTITION_CHANGED:string = "partitionChanged"; + + /** + * + */ + public displayObject:DisplayObject; + + constructor(type:string, displayObject:DisplayObject) + { + super(type); + + this.displayObject = displayObject; + } +} + +export = SceneEvent; \ No newline at end of file diff --git a/lib/events/StageEvent.js b/lib/events/StageEvent.js new file mode 100755 index 00000000..ebb424c7 --- /dev/null +++ b/lib/events/StageEvent.js @@ -0,0 +1,23 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var StageEvent = (function (_super) { + __extends(StageEvent, _super); + function StageEvent(type) { + _super.call(this, type); + } + StageEvent.CONTEXT_CREATED = "contextCreated"; + StageEvent.CONTEXT_DISPOSED = "contextDisposed"; + StageEvent.CONTEXT_RECREATED = "contextRecreated"; + StageEvent.VIEWPORT_UPDATED = "viewportUpdated"; + return StageEvent; +})(Event); + +module.exports = StageEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9TdGFnZUV2ZW50LnRzIl0sIm5hbWVzIjpbIlN0YWdlRXZlbnQiLCJTdGFnZUV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQXlCQSw2QkFBS0E7SUFPN0JBLG9CQUFZQSxJQUFXQTtRQUV0QkMsV0FBTUEsT0FBQUEsSUFBSUEsQ0FBQ0E7SUFDWkEsQ0FBQ0E7SUFSREQsNkJBQXVDQSxnQkFBZ0JBO0lBQ3ZEQSw4QkFBd0NBLGlCQUFpQkE7SUFDekRBLCtCQUF5Q0Esa0JBQWtCQTtJQUMzREEsOEJBQXdDQSxpQkFBaUJBO0lBTTFEQSxrQkFBQ0E7QUFBREEsQ0FBQ0EsRUFYd0IsS0FBSyxFQVc3Qjs7QUFFRCwyQkFBb0IsQ0FBQSIsImZpbGUiOiJldmVudHMvU3RhZ2VFdmVudC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuXG5jbGFzcyBTdGFnZUV2ZW50IGV4dGVuZHMgRXZlbnRcbntcblx0cHVibGljIHN0YXRpYyBDT05URVhUX0NSRUFURUQ6c3RyaW5nID0gXCJjb250ZXh0Q3JlYXRlZFwiO1xuXHRwdWJsaWMgc3RhdGljIENPTlRFWFRfRElTUE9TRUQ6c3RyaW5nID0gXCJjb250ZXh0RGlzcG9zZWRcIjtcblx0cHVibGljIHN0YXRpYyBDT05URVhUX1JFQ1JFQVRFRDpzdHJpbmcgPSBcImNvbnRleHRSZWNyZWF0ZWRcIjtcblx0cHVibGljIHN0YXRpYyBWSUVXUE9SVF9VUERBVEVEOnN0cmluZyA9IFwidmlld3BvcnRVcGRhdGVkXCI7XG5cblx0Y29uc3RydWN0b3IodHlwZTpzdHJpbmcpXG5cdHtcblx0XHRzdXBlcih0eXBlKTtcblx0fVxufVxuXG5leHBvcnQgPSBTdGFnZUV2ZW50OyJdfQ== \ No newline at end of file diff --git a/lib/events/StageEvent.ts b/lib/events/StageEvent.ts new file mode 100644 index 00000000..97702f37 --- /dev/null +++ b/lib/events/StageEvent.ts @@ -0,0 +1,16 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class StageEvent extends Event +{ + public static CONTEXT_CREATED:string = "contextCreated"; + public static CONTEXT_DISPOSED:string = "contextDisposed"; + public static CONTEXT_RECREATED:string = "contextRecreated"; + public static VIEWPORT_UPDATED:string = "viewportUpdated"; + + constructor(type:string) + { + super(type); + } +} + +export = StageEvent; \ No newline at end of file diff --git a/lib/events/SubGeometryEvent.js b/lib/events/SubGeometryEvent.js new file mode 100755 index 00000000..c17d904a --- /dev/null +++ b/lib/events/SubGeometryEvent.js @@ -0,0 +1,55 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +/** +* Dispatched to notify changes in a sub geometry object's state. +* +* @class away.events.SubGeometryEvent +* @see away.core.base.Geometry +*/ +var SubGeometryEvent = (function (_super) { + __extends(SubGeometryEvent, _super); + /** + * Create a new GeometryEvent + * @param type The event type. + * @param dataType An optional data type of the vertex data being updated. + */ + function SubGeometryEvent(type, dataType) { + if (typeof dataType === "undefined") { dataType = ""; } + _super.call(this, type); + + this._dataType = dataType; + } + Object.defineProperty(SubGeometryEvent.prototype, "dataType", { + /** + * The data type of the vertex data. + */ + get: function () { + return this._dataType; + }, + enumerable: true, + configurable: true + }); + + /** + * Clones the event. + * + * @return An exact duplicate of the current object. + */ + SubGeometryEvent.prototype.clone = function () { + return new SubGeometryEvent(this.type, this._dataType); + }; + SubGeometryEvent.INDICES_UPDATED = "indicesUpdated"; + + SubGeometryEvent.VERTICES_UPDATED = "verticesUpdated"; + return SubGeometryEvent; +})(Event); + +module.exports = SubGeometryEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9TdWJHZW9tZXRyeUV2ZW50LnRzIl0sIm5hbWVzIjpbIlN1Ykdlb21ldHJ5RXZlbnQiLCJTdWJHZW9tZXRyeUV2ZW50LmNvbnN0cnVjdG9yIiwiU3ViR2VvbWV0cnlFdmVudC5jbG9uZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQTJEOztBQUUzRDs7Ozs7RUFLRztBQUNIO0lBQStCQSxtQ0FBS0E7SUFtQm5DQTs7OztNQURHQTtJQUNIQSwwQkFBWUEsSUFBV0EsRUFBRUEsUUFBb0JBO1FBQXBCQyx1Q0FBQUEsUUFBUUEsR0FBVUEsRUFBRUE7QUFBQUEsUUFFNUNBLFdBQU1BLE9BQUFBLElBQUlBLENBQUNBOztRQUVYQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxRQUFRQTtJQUMxQkEsQ0FBQ0E7SUFLREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFNBQVNBO1FBQ3RCQSxDQUFDQTs7OztBQUFBQTtJQU9EQTs7OztNQURHQTt1Q0FDSEE7UUFFQ0UsT0FBT0EsSUFBSUEsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtJQUN2REEsQ0FBQ0E7SUFyQ0RGLG1DQUF1Q0EsZ0JBQWdCQTs7SUFLdkRBLG9DQUF3Q0EsaUJBQWlCQTtJQWlDMURBLHdCQUFDQTtBQUFEQSxDQUFDQSxFQTNDOEIsS0FBSyxFQTJDbkM7O0FBRUQsaUNBQTBCLENBQUEiLCJmaWxlIjoiZXZlbnRzL1N1Ykdlb21ldHJ5RXZlbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcblxuLyoqXG4gKiBEaXNwYXRjaGVkIHRvIG5vdGlmeSBjaGFuZ2VzIGluIGEgc3ViIGdlb21ldHJ5IG9iamVjdCdzIHN0YXRlLlxuICpcbiAqIEBjbGFzcyBhd2F5LmV2ZW50cy5TdWJHZW9tZXRyeUV2ZW50XG4gKiBAc2VlIGF3YXkuY29yZS5iYXNlLkdlb21ldHJ5XG4gKi9cbmNsYXNzIFN1Ykdlb21ldHJ5RXZlbnQgZXh0ZW5kcyBFdmVudFxue1xuXHQvKipcblx0ICogRGlzcGF0Y2hlZCB3aGVuIGEgVHJpYW5nbGVTdWJHZW9tZXRyeSdzIGluZGV4IGRhdGEgaGFzIGJlZW4gdXBkYXRlZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgSU5ESUNFU19VUERBVEVEOnN0cmluZyA9IFwiaW5kaWNlc1VwZGF0ZWRcIjtcblxuXHQvKipcblx0ICogRGlzcGF0Y2hlZCB3aGVuIGEgVHJpYW5nbGVTdWJHZW9tZXRyeSdzIHZlcnRleCBkYXRhIGhhcyBiZWVuIHVwZGF0ZWQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFZFUlRJQ0VTX1VQREFURUQ6c3RyaW5nID0gXCJ2ZXJ0aWNlc1VwZGF0ZWRcIjtcblxuXHRwcml2YXRlIF9kYXRhVHlwZTpzdHJpbmc7XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIG5ldyBHZW9tZXRyeUV2ZW50XG5cdCAqIEBwYXJhbSB0eXBlIFRoZSBldmVudCB0eXBlLlxuXHQgKiBAcGFyYW0gZGF0YVR5cGUgQW4gb3B0aW9uYWwgZGF0YSB0eXBlIG9mIHRoZSB2ZXJ0ZXggZGF0YSBiZWluZyB1cGRhdGVkLlxuXHQgKi9cblx0Y29uc3RydWN0b3IodHlwZTpzdHJpbmcsIGRhdGFUeXBlOnN0cmluZyA9IFwiXCIpXG5cdHtcblx0XHRzdXBlcih0eXBlKTtcblxuXHRcdHRoaXMuX2RhdGFUeXBlID0gZGF0YVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRhdGEgdHlwZSBvZiB0aGUgdmVydGV4IGRhdGEuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGRhdGFUeXBlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YVR5cGU7XG5cdH1cblxuXHQvKipcblx0ICogQ2xvbmVzIHRoZSBldmVudC5cblx0ICpcblx0ICogQHJldHVybiBBbiBleGFjdCBkdXBsaWNhdGUgb2YgdGhlIGN1cnJlbnQgb2JqZWN0LlxuXHQgKi9cblx0cHVibGljIGNsb25lKCk6RXZlbnRcblx0e1xuXHRcdHJldHVybiBuZXcgU3ViR2VvbWV0cnlFdmVudCh0aGlzLnR5cGUsIHRoaXMuX2RhdGFUeXBlKTtcblx0fVxufVxuXG5leHBvcnQgPSBTdWJHZW9tZXRyeUV2ZW50OyJdfQ== \ No newline at end of file diff --git a/lib/events/SubGeometryEvent.ts b/lib/events/SubGeometryEvent.ts new file mode 100644 index 00000000..849537e2 --- /dev/null +++ b/lib/events/SubGeometryEvent.ts @@ -0,0 +1,54 @@ +import Event = require("awayjs-core/lib/events/Event"); + +/** + * Dispatched to notify changes in a sub geometry object's state. + * + * @class away.events.SubGeometryEvent + * @see away.core.base.Geometry + */ +class SubGeometryEvent extends Event +{ + /** + * Dispatched when a TriangleSubGeometry's index data has been updated. + */ + public static INDICES_UPDATED:string = "indicesUpdated"; + + /** + * Dispatched when a TriangleSubGeometry's vertex data has been updated. + */ + public static VERTICES_UPDATED:string = "verticesUpdated"; + + private _dataType:string; + + /** + * Create a new GeometryEvent + * @param type The event type. + * @param dataType An optional data type of the vertex data being updated. + */ + constructor(type:string, dataType:string = "") + { + super(type); + + this._dataType = dataType; + } + + /** + * The data type of the vertex data. + */ + public get dataType():string + { + return this._dataType; + } + + /** + * Clones the event. + * + * @return An exact duplicate of the current object. + */ + public clone():Event + { + return new SubGeometryEvent(this.type, this._dataType); + } +} + +export = SubGeometryEvent; \ No newline at end of file diff --git a/lib/events/TimerEvent.js b/lib/events/TimerEvent.js new file mode 100755 index 00000000..1d6a980b --- /dev/null +++ b/lib/events/TimerEvent.js @@ -0,0 +1,21 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); + +var TimerEvent = (function (_super) { + __extends(TimerEvent, _super); + function TimerEvent(type) { + _super.call(this, type); + } + TimerEvent.TIMER = "timer"; + TimerEvent.TIMER_COMPLETE = "timerComplete"; + return TimerEvent; +})(Event); + +module.exports = TimerEvent; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9UaW1lckV2ZW50LnRzIl0sIm5hbWVzIjpbIlRpbWVyRXZlbnQiLCJUaW1lckV2ZW50LmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxtREFBMkQ7O0FBRTNEO0lBQXlCQSw2QkFBS0E7SUFNN0JBLG9CQUFZQSxJQUFXQTtRQUV0QkMsV0FBTUEsT0FBQUEsSUFBSUEsQ0FBQ0E7SUFFWkEsQ0FBQ0E7SUFQREQsbUJBQTZCQSxPQUFPQTtJQUNwQ0EsNEJBQXNDQSxlQUFlQTtJQU90REEsa0JBQUNBO0FBQURBLENBQUNBLEVBWHdCLEtBQUssRUFXN0I7O0FBRUQsMkJBQW1CLENBQUEiLCJmaWxlIjoiZXZlbnRzL1RpbWVyRXZlbnQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRXZlbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcblxuY2xhc3MgVGltZXJFdmVudCBleHRlbmRzIEV2ZW50XG57XG5cblx0cHVibGljIHN0YXRpYyBUSU1FUjpzdHJpbmcgPSBcInRpbWVyXCI7XG5cdHB1YmxpYyBzdGF0aWMgVElNRVJfQ09NUExFVEU6c3RyaW5nID0gXCJ0aW1lckNvbXBsZXRlXCI7XG5cblx0Y29uc3RydWN0b3IodHlwZTpzdHJpbmcpXG5cdHtcblx0XHRzdXBlcih0eXBlKTtcblxuXHR9XG59XG5cbmV4cG9ydCA9IFRpbWVyRXZlbnQiXX0= \ No newline at end of file diff --git a/lib/events/TimerEvent.ts b/lib/events/TimerEvent.ts new file mode 100644 index 00000000..8fb076cb --- /dev/null +++ b/lib/events/TimerEvent.ts @@ -0,0 +1,16 @@ +import Event = require("awayjs-core/lib/events/Event"); + +class TimerEvent extends Event +{ + + public static TIMER:string = "timer"; + public static TIMER_COMPLETE:string = "timerComplete"; + + constructor(type:string) + { + super(type); + + } +} + +export = TimerEvent \ No newline at end of file diff --git a/lib/managers/MouseManager.js b/lib/managers/MouseManager.js new file mode 100755 index 00000000..1694f3be --- /dev/null +++ b/lib/managers/MouseManager.js @@ -0,0 +1,282 @@ +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var AwayMouseEvent = require("awayjs-core/lib/events/MouseEvent"); + +/** +* MouseManager enforces a singleton pattern and is not intended to be instanced. +* it provides a manager class for detecting mouse hits on scene objects and sending out mouse events. +*/ +var MouseManager = (function () { + /** + * Creates a new MouseManager object. + */ + function MouseManager() { + var _this = this; + this._viewLookup = new Array(); + this._nullVector = new Vector3D(); + this._queuedEvents = new Array(); + this._mouseUp = new AwayMouseEvent(AwayMouseEvent.MOUSE_UP); + this._mouseClick = new AwayMouseEvent(AwayMouseEvent.CLICK); + this._mouseOut = new AwayMouseEvent(AwayMouseEvent.MOUSE_OUT); + this._mouseDown = new AwayMouseEvent(AwayMouseEvent.MOUSE_DOWN); + this._mouseMove = new AwayMouseEvent(AwayMouseEvent.MOUSE_MOVE); + this._mouseOver = new AwayMouseEvent(AwayMouseEvent.MOUSE_OVER); + this._mouseWheel = new AwayMouseEvent(AwayMouseEvent.MOUSE_WHEEL); + this._mouseDoubleClick = new AwayMouseEvent(AwayMouseEvent.DOUBLE_CLICK); + this.onClickDelegate = function (event) { + return _this.onClick(event); + }; + this.onDoubleClickDelegate = function (event) { + return _this.onDoubleClick(event); + }; + this.onMouseDownDelegate = function (event) { + return _this.onMouseDown(event); + }; + this.onMouseMoveDelegate = function (event) { + return _this.onMouseMove(event); + }; + this.onMouseUpDelegate = function (event) { + return _this.onMouseUp(event); + }; + this.onMouseWheelDelegate = function (event) { + return _this.onMouseWheel(event); + }; + this.onMouseOverDelegate = function (event) { + return _this.onMouseOver(event); + }; + this.onMouseOutDelegate = function (event) { + return _this.onMouseOut(event); + }; + } + MouseManager.getInstance = function () { + if (this._instance) + return this._instance; + + return (this._instance = new MouseManager()); + }; + + MouseManager.prototype.fireMouseEvents = function (forceMouseMove) { + // If colliding object has changed, queue over/out events. + if (this._iCollidingObject != this._previousCollidingObject) { + if (this._previousCollidingObject) + this.queueDispatch(this._mouseOut, this._mouseMoveEvent, this._previousCollidingObject); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseOver, this._mouseMoveEvent); + } + + // Fire mouse move events here if forceMouseMove is on. + if (forceMouseMove && this._iCollidingObject) + this.queueDispatch(this._mouseMove, this._mouseMoveEvent); + + var event; + var dispatcher; + + // Dispatch all queued events. + var len = this._queuedEvents.length; + for (var i = 0; i < len; ++i) { + // Only dispatch from first implicitly enabled object ( one that is not a child of a mouseChildren = false hierarchy ). + event = this._queuedEvents[i]; + dispatcher = event.object; + + while (dispatcher && !dispatcher._iIsMouseEnabled()) + dispatcher = dispatcher.parent; + + if (dispatcher) + dispatcher.dispatchEvent(event); + } + + this._queuedEvents.length = 0; + + this._previousCollidingObject = this._iCollidingObject; + + this._iUpdateDirty = false; + }; + + // public addViewLayer(view:View) + // { + // var stg:Stage = view.stage; + // + // // Add instance to mouse3dmanager to fire mouse events for multiple views + // if (!view.stageGL.mouse3DManager) + // view.stageGL.mouse3DManager = this; + // + // if (!hasKey(view)) + // _view3Ds[view] = 0; + // + // _childDepth = 0; + // traverseDisplayObjects(stg); + // _viewCount = _childDepth; + // } + MouseManager.prototype.registerView = function (view) { + view.htmlElement.addEventListener("click", this.onClickDelegate); + view.htmlElement.addEventListener("dblclick", this.onDoubleClickDelegate); + view.htmlElement.addEventListener("mousedown", this.onMouseDownDelegate); + view.htmlElement.addEventListener("mousemove", this.onMouseMoveDelegate); + view.htmlElement.addEventListener("mouseup", this.onMouseUpDelegate); + view.htmlElement.addEventListener("mousewheel", this.onMouseWheelDelegate); + view.htmlElement.addEventListener("mouseover", this.onMouseOverDelegate); + view.htmlElement.addEventListener("mouseout", this.onMouseOutDelegate); + + this._viewLookup.push(view); + }; + + MouseManager.prototype.unregisterView = function (view) { + view.htmlElement.removeEventListener("click", this.onClickDelegate); + view.htmlElement.removeEventListener("dblclick", this.onDoubleClickDelegate); + view.htmlElement.removeEventListener("mousedown", this.onMouseDownDelegate); + view.htmlElement.removeEventListener("mousemove", this.onMouseMoveDelegate); + view.htmlElement.removeEventListener("mouseup", this.onMouseUpDelegate); + view.htmlElement.removeEventListener("mousewheel", this.onMouseWheelDelegate); + view.htmlElement.removeEventListener("mouseover", this.onMouseOverDelegate); + view.htmlElement.removeEventListener("mouseout", this.onMouseOutDelegate); + + this._viewLookup.slice(this._viewLookup.indexOf(view), 1); + }; + + // --------------------------------------------------------------------- + // Private. + // --------------------------------------------------------------------- + MouseManager.prototype.queueDispatch = function (event, sourceEvent, collider) { + if (typeof collider === "undefined") { collider = null; } + // 2D properties. + if (sourceEvent) { + event.ctrlKey = sourceEvent.ctrlKey; + event.altKey = sourceEvent.altKey; + event.shiftKey = sourceEvent.shiftKey; + event.screenX = sourceEvent.clientX; + event.screenY = sourceEvent.clientY; + } + + if (collider == null) + collider = this._iCollidingObject; + + // 3D properties. + if (collider) { + // Object. + event.object = collider.displayObject; + event.materialOwner = collider.materialOwner; + + // UV. + event.uv = collider.uv; + + // Position. + event.localPosition = collider.localPosition ? collider.localPosition.clone() : null; + + // Normal. + event.localNormal = collider.localNormal ? collider.localNormal.clone() : null; + + // Face index. + event.index = collider.index; + } else { + // Set all to null. + event.uv = null; + event.object = null; + event.localPosition = this._nullVector; + event.localNormal = this._nullVector; + event.index = 0; + event.subGeometryIndex = 0; + } + + // Store event to be dispatched later. + this._queuedEvents.push(event); + }; + + // --------------------------------------------------------------------- + // Listeners. + // --------------------------------------------------------------------- + MouseManager.prototype.onMouseMove = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseMove, this._mouseMoveEvent = event); + }; + + MouseManager.prototype.onMouseOut = function (event) { + this._iActiveDiv = null; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseOut, event); + }; + + MouseManager.prototype.onMouseOver = function (event) { + this._iActiveDiv = event.target; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseOver, event); + }; + + MouseManager.prototype.onClick = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseClick, event); + }; + + MouseManager.prototype.onDoubleClick = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseDoubleClick, event); + }; + + MouseManager.prototype.onMouseDown = function (event) { + this._iActiveDiv = event.target; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseDown, event); + }; + + MouseManager.prototype.onMouseUp = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseUp, event); + }; + + MouseManager.prototype.onMouseWheel = function (event) { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseWheel, event); + }; + + MouseManager.prototype.updateColliders = function (event) { + if (this._iUpdateDirty) + return; + + var view; + var bounds; + var mouseX = event.clientX; + var mouseY = event.clientY; + var len = this._viewLookup.length; + for (var i = 0; i < len; i++) { + view = this._viewLookup[i]; + bounds = view.htmlElement.getBoundingClientRect(); + if (mouseX < bounds.left || mouseX > bounds.right || mouseY < bounds.top || mouseY > bounds.bottom) { + view._pMouseX = null; + view._pMouseY = null; + } else { + view._pMouseX = mouseX + bounds.left; + view._pMouseY = mouseY + bounds.top; + view.updateCollider(); + + if (view.layeredView && this._iCollidingObject) + break; + } + } + + this._iUpdateDirty = true; + }; + return MouseManager; +})(); + +module.exports = MouseManager; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hbmFnZXJzL01vdXNlTWFuYWdlci50cyJdLCJuYW1lcyI6WyJNb3VzZU1hbmFnZXIiLCJNb3VzZU1hbmFnZXIuY29uc3RydWN0b3IiLCJNb3VzZU1hbmFnZXIuZ2V0SW5zdGFuY2UiLCJNb3VzZU1hbmFnZXIuZmlyZU1vdXNlRXZlbnRzIiwiTW91c2VNYW5hZ2VyLnJlZ2lzdGVyVmlldyIsIk1vdXNlTWFuYWdlci51bnJlZ2lzdGVyVmlldyIsIk1vdXNlTWFuYWdlci5xdWV1ZURpc3BhdGNoIiwiTW91c2VNYW5hZ2VyLm9uTW91c2VNb3ZlIiwiTW91c2VNYW5hZ2VyLm9uTW91c2VPdXQiLCJNb3VzZU1hbmFnZXIub25Nb3VzZU92ZXIiLCJNb3VzZU1hbmFnZXIub25DbGljayIsIk1vdXNlTWFuYWdlci5vbkRvdWJsZUNsaWNrIiwiTW91c2VNYW5hZ2VyLm9uTW91c2VEb3duIiwiTW91c2VNYW5hZ2VyLm9uTW91c2VVcCIsIk1vdXNlTWFuYWdlci5vbk1vdXNlV2hlZWwiLCJNb3VzZU1hbmFnZXIudXBkYXRlQ29sbGlkZXJzIl0sIm1hcHBpbmdzIjoiQUFBQSw0REFFcUU7O0FBRXJFLGlFQUF3RTs7QUFFeEU7OztFQUdHO0FBQ0g7SUFxQ0NBOztNQURHQTtJQUNIQTtRQUFBQyxpQkFVQ0E7UUEzQ0RBLEtBQVFBLFdBQVdBLEdBQWVBLElBQUlBLEtBQUtBLENBQU9BLENBQUNBLENBQUNBO1FBTXBEQSxLQUFRQSxXQUFXQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUU5Q0EsS0FBUUEsYUFBYUEsR0FBeUJBLElBQUlBLEtBQUtBLENBQWlCQSxDQUFDQSxDQUFDQTtRQUkxRUEsS0FBUUEsUUFBUUEsR0FBa0JBLElBQUlBLGNBQWNBLENBQUNBLGNBQWNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO1FBQzlFQSxLQUFRQSxXQUFXQSxHQUFrQkEsSUFBSUEsY0FBY0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFD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QSxDQUFFQTtnQkFDbkdBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBO2dCQUNwQkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUE7YUFDcEJBLEtBQU1BO2dCQUNOQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxJQUFJQTtnQkFDcENBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLE1BQU1BLEdBQUdBLE1BQU1BLENBQUNBLEdBQUdBO2dCQUNuQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7O2dCQUVyQkEsSUFBSUEsSUFBSUEsQ0FBQ0EsV0FBV0EsSUFBSUEsSUFBSUEsQ0FBQ0EsaUJBQWlCQTtvQkFDN0NBLEtBQU1BLENBQUFBO2FBQ1BBO1NBQ0RBOztRQUVEQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQTtJQUMxQkEsQ0FBQ0E7SUFDRmYsb0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsNkJBQXNCLENBQUEiLCJmaWxlIjoibWFuYWdlcnMvTW91c2VNYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZpZXdcdFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1ZpZXdcIik7XG5pbXBvcnQgRGlzcGxheU9iamVjdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBQaWNraW5nQ29sbGlzaW9uVk9cdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9waWNrL1BpY2tpbmdDb2xsaXNpb25WT1wiKTtcbmltcG9ydCBBd2F5TW91c2VFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9Nb3VzZUV2ZW50XCIpO1xuXG4vKipcbiAqIE1vdXNlTWFuYWdlciBlbmZvcmNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIGFuZCBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFuY2VkLlxuICogaXQgcHJvdmlkZXMgYSBtYW5hZ2VyIGNsYXNzIGZvciBkZXRlY3RpbmcgbW91c2UgaGl0cyBvbiBzY2VuZSBvYmplY3RzIGFuZCBzZW5kaW5nIG91dCBtb3VzZSBldmVudHMuXG4gKi9cbmNsYXNzIE1vdXNlTWFuYWdlclxue1xuXHRwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6TW91c2VNYW5hZ2VyO1xuXG5cdHByaXZhdGUgX3ZpZXdMb29rdXA6QXJyYXk8Vmlldz4gPSBuZXcgQXJyYXk8Vmlldz4oKTtcblxuXHRwdWJsaWMgX2lBY3RpdmVEaXY6SFRNTERpdkVsZW1lbnQ7XG5cdHB1YmxpYyBfaVVwZGF0ZURpcnR5OmJvb2xlYW47XG5cdHB1YmxpYyBfaUNvbGxpZGluZ09iamVjdDpQaWNraW5nQ29sbGlzaW9uVk87XG5cdFxuXHRwcml2YXRlIF9udWxsVmVjdG9yOlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCk7XG5cdHByaXZhdGUgX3ByZXZpb3VzQ29sbGlkaW5nT2JqZWN0OlBpY2tpbmdDb2xsaXNpb25WTztcblx0cHJpdmF0ZSBfcXVldWVkRXZlbnRzOkFycmF5PEF3YXlNb3VzZUV2ZW50PiA9IG5ldyBBcnJheTxBd2F5TW91c2VFdmVudD4oKTtcblxuXHRwcml2YXRlIF9tb3VzZU1vdmVFdmVudDpNb3VzZUV2ZW50O1xuXG5cdHByaXZhdGUgX21vdXNlVXA6QXdheU1vdXNlRXZlbnQgPSBuZXcgQXdheU1vdXNlRXZlbnQoQXdheU1vdXNlRXZlbnQuTU9VU0VfVVApO1xuXHRwcml2YXRlIF9tb3VzZUNsaWNrOkF3YXlNb3VzZUV2ZW50ID0gbmV3IEF3YXlNb3VzZUV2ZW50KEF3YXlNb3VzZUV2ZW50LkNMSUNLKTtcblx0cHJpdmF0ZSBfbW91c2VPdXQ6QXdheU1vdXNlRXZlbnQgPSBuZXcgQXdheU1vdXNlRXZlbnQoQXdheU1vdXNlRXZlbnQuTU9VU0VfT1VUKTtcblx0cHJpdmF0ZSBfbW91c2VEb3duOkF3YXlNb3VzZUV2ZW50ID0gbmV3IEF3YXlNb3VzZUV2ZW50KEF3YXlNb3VzZUV2ZW50Lk1PVVNFX0RPV04pO1xuXHRwcml2YXRlIF9tb3VzZU1vdmU6QXdheU1vdXNlRXZlbnQgPSBuZXcgQXdheU1vdXNlRXZlbnQoQXdheU1vdXNlRXZlbnQuTU9VU0VfTU9WRSk7XG5cdHByaXZhdGUgX21vdXNlT3ZlcjpBd2F5TW91c2VFdmVudCA9IG5ldyBBd2F5TW91c2VFdmVudChBd2F5TW91c2VFdmVudC5NT1VTRV9PVkVSKTtcblx0cHJpdmF0ZSBfbW91c2VXaGVlbDpBd2F5TW91c2VFdmVudCA9IG5ldyBBd2F5TW91c2VFdmVudChBd2F5TW91c2VFdmVudC5NT1VTRV9XSEVFTCk7XG5cdHByaXZhdGUgX21vdXNlRG91YmxlQ2xpY2s6QXdheU1vdXNlRXZlbnQgPSBuZXcgQXdheU1vdXNlRXZlbnQoQXdheU1vdXNlRXZlbnQuRE9VQkxFX0NMSUNLKTtcblxuXHRwcml2YXRlIG9uQ2xpY2tEZWxlZ2F0ZTooZXZlbnQ6TW91c2VFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBvbkRvdWJsZUNsaWNrRGVsZWdhdGU6KGV2ZW50Ok1vdXNlRXZlbnQpID0+IHZvaWQ7XG5cdHByaXZhdGUgb25Nb3VzZURvd25EZWxlZ2F0ZTooZXZlbnQ6TW91c2VFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBvbk1vdXNlTW92ZURlbGVnYXRlOihldmVudDpNb3VzZUV2ZW50KSA9PiB2b2lkO1xuXHRwcml2YXRlIG9uTW91c2VVcERlbGVnYXRlOihldmVudDpNb3VzZUV2ZW50KSA9PiB2b2lkO1xuXHRwcml2YXRlIG9uTW91c2VXaGVlbERlbGVnYXRlOihldmVudDpNb3VzZUV2ZW50KSA9PiB2b2lkO1xuXHRwcml2YXRlIG9uTW91c2VPdmVyRGVsZWdhdGU6KGV2ZW50Ok1vdXNlRXZlbnQpID0+IHZvaWQ7XG5cdHByaXZhdGUgb25Nb3VzZU91dERlbGVnYXRlOihldmVudDpNb3VzZUV2ZW50KSA9PiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IDxjb2RlPk1vdXNlTWFuYWdlcjwvY29kZT4gb2JqZWN0LlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5vbkNsaWNrRGVsZWdhdGUgPSAoZXZlbnQ6TW91c2VFdmVudCkgPT4gdGhpcy5vbkNsaWNrKGV2ZW50KTtcblx0XHR0aGlzLm9uRG91YmxlQ2xpY2tEZWxlZ2F0ZSA9IChldmVudDpNb3VzZUV2ZW50KSA9PiB0aGlzLm9uRG91YmxlQ2xpY2soZXZlbnQpO1xuXHRcdHRoaXMub25Nb3VzZURvd25EZWxlZ2F0ZSA9IChldmVudDpNb3VzZUV2ZW50KSA9PiB0aGlzLm9uTW91c2VEb3duKGV2ZW50KTtcblx0XHR0aGlzLm9uTW91c2VNb3ZlRGVsZWdhdGUgPSAoZXZlbnQ6TW91c2VFdmVudCkgPT4gdGhpcy5vbk1vdXNlTW92ZShldmVudCk7XG5cdFx0dGhpcy5vbk1vdXNlVXBEZWxlZ2F0ZSA9IChldmVudDpNb3VzZUV2ZW50KSA9PiB0aGlzLm9uTW91c2VVcChldmVudCk7XG5cdFx0dGhpcy5vbk1vdXNlV2hlZWxEZWxlZ2F0ZSA9IChldmVudDpNb3VzZUV2ZW50KSA9PiB0aGlzLm9uTW91c2VXaGVlbChldmVudCk7XG5cdFx0dGhpcy5vbk1vdXNlT3ZlckRlbGVnYXRlID0gKGV2ZW50Ok1vdXNlRXZlbnQpID0+IHRoaXMub25Nb3VzZU92ZXIoZXZlbnQpO1xuXHRcdHRoaXMub25Nb3VzZU91dERlbGVnYXRlID0gKGV2ZW50Ok1vdXNlRXZlbnQpID0+IHRoaXMub25Nb3VzZU91dChldmVudCk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCk6TW91c2VNYW5hZ2VyXG5cdHtcblx0XHRpZiAodGhpcy5faW5zdGFuY2UpXG5cdFx0XHRyZXR1cm4gdGhpcy5faW5zdGFuY2U7XG5cblx0XHRyZXR1cm4gKHRoaXMuX2luc3RhbmNlID0gbmV3IE1vdXNlTWFuYWdlcigpKTtcblx0fVxuXG5cdHB1YmxpYyBmaXJlTW91c2VFdmVudHMoZm9yY2VNb3VzZU1vdmU6Ym9vbGVhbilcblx0e1xuXHRcdCAvLyBJZiBjb2xsaWRpbmcgb2JqZWN0IGhhcyBjaGFuZ2VkLCBxdWV1ZSBvdmVyL291dCBldmVudHMuXG5cdFx0aWYgKHRoaXMuX2lDb2xsaWRpbmdPYmplY3QgIT0gdGhpcy5fcHJldmlvdXNDb2xsaWRpbmdPYmplY3QpIHtcblx0XHRcdGlmICh0aGlzLl9wcmV2aW91c0NvbGxpZGluZ09iamVjdClcblx0XHRcdFx0dGhpcy5xdWV1ZURpc3BhdGNoKHRoaXMuX21vdXNlT3V0LCB0aGlzLl9tb3VzZU1vdmVFdmVudCwgdGhpcy5fcHJldmlvdXNDb2xsaWRpbmdPYmplY3QpO1xuXG5cdFx0XHRpZiAodGhpcy5faUNvbGxpZGluZ09iamVjdClcblx0XHRcdFx0dGhpcy5xdWV1ZURpc3BhdGNoKHRoaXMuX21vdXNlT3ZlciwgdGhpcy5fbW91c2VNb3ZlRXZlbnQpO1xuXHRcdH1cblxuXHRcdCAvLyBGaXJlIG1vdXNlIG1vdmUgZXZlbnRzIGhlcmUgaWYgZm9yY2VNb3VzZU1vdmUgaXMgb24uXG5cdFx0aWYgKGZvcmNlTW91c2VNb3ZlICYmIHRoaXMuX2lDb2xsaWRpbmdPYmplY3QpXG5cdFx0XHR0aGlzLnF1ZXVlRGlzcGF0Y2goIHRoaXMuX21vdXNlTW92ZSwgdGhpcy5fbW91c2VNb3ZlRXZlbnQpO1xuXG5cdFx0dmFyIGV2ZW50OkF3YXlNb3VzZUV2ZW50O1xuXHRcdHZhciBkaXNwYXRjaGVyOkRpc3BsYXlPYmplY3Q7XG5cblx0XHQgLy8gRGlzcGF0Y2ggYWxsIHF1ZXVlZCBldmVudHMuXG5cdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9xdWV1ZWRFdmVudHMubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHQvLyBPbmx5IGRpc3BhdGNoIGZyb20gZmlyc3QgaW1wbGljaXRseSBlbmFibGVkIG9iamVjdCAoIG9uZSB0aGF0IGlzIG5vdCBhIGNoaWxkIG9mIGEgbW91c2VDaGlsZHJlbiA9IGZhbHNlIGhpZXJhcmNoeSApLlxuXHRcdFx0ZXZlbnQgPSB0aGlzLl9xdWV1ZWRFdmVudHNbaV07XG5cdFx0XHRkaXNwYXRjaGVyID0gZXZlbnQub2JqZWN0O1xuXG5cdFx0XHR3aGlsZSAoZGlzcGF0Y2hlciAmJiAhZGlzcGF0Y2hlci5faUlzTW91c2VFbmFibGVkKCkpXG5cdFx0XHRcdGRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyLnBhcmVudDtcblxuXHRcdFx0aWYgKGRpc3BhdGNoZXIpXG5cdFx0XHRcdGRpc3BhdGNoZXIuZGlzcGF0Y2hFdmVudChldmVudCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fcXVldWVkRXZlbnRzLmxlbmd0aCA9IDA7XG5cblx0XHR0aGlzLl9wcmV2aW91c0NvbGxpZGluZ09iamVjdCA9IHRoaXMuX2lDb2xsaWRpbmdPYmplY3Q7XG5cblx0XHR0aGlzLl9pVXBkYXRlRGlydHkgPSBmYWxzZTtcblx0fVxuXG4vL1x0XHRwdWJsaWMgYWRkVmlld0xheWVyKHZpZXc6Vmlldylcbi8vXHRcdHtcbi8vXHRcdFx0dmFyIHN0ZzpTdGFnZSA9IHZpZXcuc3RhZ2U7XG4vL1xuLy9cdFx0XHQvLyBBZGQgaW5zdGFuY2UgdG8gbW91c2UzZG1hbmFnZXIgdG8gZmlyZSBtb3VzZSBldmVudHMgZm9yIG11bHRpcGxlIHZpZXdzXG4vL1x0XHRcdGlmICghdmlldy5zdGFnZUdMLm1vdXNlM0RNYW5hZ2VyKVxuLy9cdFx0XHRcdHZpZXcuc3RhZ2VHTC5tb3VzZTNETWFuYWdlciA9IHRoaXM7XG4vL1xuLy9cdFx0XHRpZiAoIWhhc0tleSh2aWV3KSlcbi8vXHRcdFx0XHRfdmlldzNEc1t2aWV3XSA9IDA7XG4vL1xuLy9cdFx0XHRfY2hpbGREZXB0aCA9IDA7XG4vL1x0XHRcdHRyYXZlcnNlRGlzcGxheU9iamVjdHMoc3RnKTtcbi8vXHRcdFx0X3ZpZXdDb3VudCA9IF9jaGlsZERlcHRoO1xuLy9cdFx0fVxuXG5cdHB1YmxpYyByZWdpc3RlclZpZXcodmlldzpWaWV3KVxuXHR7XG5cdFx0dmlldy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgdGhpcy5vbkNsaWNrRGVsZWdhdGUpO1xuXHRcdHZpZXcuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImRibGNsaWNrXCIsIHRoaXMub25Eb3VibGVDbGlja0RlbGVnYXRlKTtcblx0XHR2aWV3Lmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5vbk1vdXNlRG93bkRlbGVnYXRlKTtcblx0XHR2aWV3Lmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5vbk1vdXNlTW92ZURlbGVnYXRlKTtcblx0XHR2aWV3Lmh0bWxFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIHRoaXMub25Nb3VzZVVwRGVsZWdhdGUpO1xuXHRcdHZpZXcuaHRtbEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIiwgdGhpcy5vbk1vdXNlV2hlZWxEZWxlZ2F0ZSk7XG5cdFx0dmlldy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsIHRoaXMub25Nb3VzZU92ZXJEZWxlZ2F0ZSk7XG5cdFx0dmlldy5odG1sRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgdGhpcy5vbk1vdXNlT3V0RGVsZWdhdGUpO1xuXG5cdFx0dGhpcy5fdmlld0xvb2t1cC5wdXNoKHZpZXcpO1xuXHR9XG5cblx0cHVibGljIHVucmVnaXN0ZXJWaWV3KHZpZXc6Vmlldylcblx0e1xuXHRcdHZpZXcuaHRtbEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub25DbGlja0RlbGVnYXRlKTtcblx0XHR2aWV3Lmh0bWxFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJkYmxjbGlja1wiLCB0aGlzLm9uRG91YmxlQ2xpY2tEZWxlZ2F0ZSk7XG5cdFx0dmlldy5odG1sRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMub25Nb3VzZURvd25EZWxlZ2F0ZSk7XG5cdFx0dmlldy5odG1sRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMub25Nb3VzZU1vdmVEZWxlZ2F0ZSk7XG5cdFx0dmlldy5odG1sRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCB0aGlzLm9uTW91c2VVcERlbGVnYXRlKTtcblx0XHR2aWV3Lmh0bWxFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXdoZWVsXCIsIHRoaXMub25Nb3VzZVdoZWVsRGVsZWdhdGUpO1xuXHRcdHZpZXcuaHRtbEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCB0aGlzLm9uTW91c2VPdmVyRGVsZWdhdGUpO1xuXHRcdHZpZXcuaHRtbEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsIHRoaXMub25Nb3VzZU91dERlbGVnYXRlKTtcblxuXHRcdHRoaXMuX3ZpZXdMb29rdXAuc2xpY2UodGhpcy5fdmlld0xvb2t1cC5pbmRleE9mKHZpZXcpLCAxKTtcblx0fVxuXG5cdC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBQcml2YXRlLlxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIHF1ZXVlRGlzcGF0Y2goZXZlbnQ6QXdheU1vdXNlRXZlbnQsIHNvdXJjZUV2ZW50Ok1vdXNlRXZlbnQsIGNvbGxpZGVyOlBpY2tpbmdDb2xsaXNpb25WTyA9IG51bGwpXG5cdHtcblx0XHQvLyAyRCBwcm9wZXJ0aWVzLlxuXHRcdGlmIChzb3VyY2VFdmVudCkge1xuXHRcdFx0ZXZlbnQuY3RybEtleSA9IHNvdXJjZUV2ZW50LmN0cmxLZXk7XG5cdFx0XHRldmVudC5hbHRLZXkgPSBzb3VyY2VFdmVudC5hbHRLZXk7XG5cdFx0XHRldmVudC5zaGlmdEtleSA9IHNvdXJjZUV2ZW50LnNoaWZ0S2V5O1xuXHRcdFx0ZXZlbnQuc2NyZWVuWCA9IHNvdXJjZUV2ZW50LmNsaWVudFg7XG5cdFx0XHRldmVudC5zY3JlZW5ZID0gc291cmNlRXZlbnQuY2xpZW50WTtcblx0XHR9XG5cblx0XHRpZiAoY29sbGlkZXIgPT0gbnVsbClcblx0XHRcdGNvbGxpZGVyID0gdGhpcy5faUNvbGxpZGluZ09iamVjdDtcblxuXHRcdC8vIDNEIHByb3BlcnRpZXMuXG5cdFx0aWYgKGNvbGxpZGVyKSB7XG5cdFx0XHQvLyBPYmplY3QuXG5cdFx0XHRldmVudC5vYmplY3QgPSBjb2xsaWRlci5kaXNwbGF5T2JqZWN0O1xuXHRcdFx0ZXZlbnQubWF0ZXJpYWxPd25lciA9IGNvbGxpZGVyLm1hdGVyaWFsT3duZXI7XG5cdFx0XHQvLyBVVi5cblx0XHRcdGV2ZW50LnV2ID0gY29sbGlkZXIudXY7XG5cdFx0XHQvLyBQb3NpdGlvbi5cblx0XHRcdGV2ZW50LmxvY2FsUG9zaXRpb24gPSBjb2xsaWRlci5sb2NhbFBvc2l0aW9uPyBjb2xsaWRlci5sb2NhbFBvc2l0aW9uLmNsb25lKCkgOiBudWxsO1xuXHRcdFx0Ly8gTm9ybWFsLlxuXHRcdFx0ZXZlbnQubG9jYWxOb3JtYWwgPSBjb2xsaWRlci5sb2NhbE5vcm1hbD8gY29sbGlkZXIubG9jYWxOb3JtYWwuY2xvbmUoKSA6IG51bGw7XG5cdFx0XHQvLyBGYWNlIGluZGV4LlxuXHRcdFx0ZXZlbnQuaW5kZXggPSBjb2xsaWRlci5pbmRleDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU2V0IGFsbCB0byBudWxsLlxuXHRcdFx0ZXZlbnQudXYgPSBudWxsO1xuXHRcdFx0ZXZlbnQub2JqZWN0ID0gbnVsbDtcblx0XHRcdGV2ZW50LmxvY2FsUG9zaXRpb24gPSB0aGlzLl9udWxsVmVjdG9yO1xuXHRcdFx0ZXZlbnQubG9jYWxOb3JtYWwgPSB0aGlzLl9udWxsVmVjdG9yO1xuXHRcdFx0ZXZlbnQuaW5kZXggPSAwO1xuXHRcdFx0ZXZlbnQuc3ViR2VvbWV0cnlJbmRleCA9IDA7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgZXZlbnQgdG8gYmUgZGlzcGF0Y2hlZCBsYXRlci5cblx0XHR0aGlzLl9xdWV1ZWRFdmVudHMucHVzaChldmVudCk7XG5cdH1cblxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0Ly8gTGlzdGVuZXJzLlxuXHQvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50Ok1vdXNlRXZlbnQpXG5cdHtcblx0XHR0aGlzLnVwZGF0ZUNvbGxpZGVycyhldmVudCk7XG5cblx0XHRpZiAodGhpcy5faUNvbGxpZGluZ09iamVjdClcblx0XHRcdHRoaXMucXVldWVEaXNwYXRjaCh0aGlzLl9tb3VzZU1vdmUsIHRoaXMuX21vdXNlTW92ZUV2ZW50ID0gZXZlbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBvbk1vdXNlT3V0KGV2ZW50Ok1vdXNlRXZlbnQpXG5cdHtcblx0XHR0aGlzLl9pQWN0aXZlRGl2ID0gbnVsbDtcblxuXHRcdHRoaXMudXBkYXRlQ29sbGlkZXJzKGV2ZW50KTtcblxuXHRcdGlmICh0aGlzLl9pQ29sbGlkaW5nT2JqZWN0KVxuXHRcdFx0dGhpcy5xdWV1ZURpc3BhdGNoKHRoaXMuX21vdXNlT3V0LCBldmVudCk7XG5cdH1cblxuXHRwcml2YXRlIG9uTW91c2VPdmVyKGV2ZW50Ok1vdXNlRXZlbnQpXG5cdHtcblx0XHR0aGlzLl9pQWN0aXZlRGl2ID0gPEhUTUxEaXZFbGVtZW50PiBldmVudC50YXJnZXQ7XG5cblx0XHR0aGlzLnVwZGF0ZUNvbGxpZGVycyhldmVudCk7XG5cblx0XHRpZiAodGhpcy5faUNvbGxpZGluZ09iamVjdClcblx0XHRcdHRoaXMucXVldWVEaXNwYXRjaCggdGhpcy5fbW91c2VPdmVyLCBldmVudCk7XG5cdH1cblxuXHRwcml2YXRlIG9uQ2xpY2soZXZlbnQ6TW91c2VFdmVudClcblx0e1xuXHRcdHRoaXMudXBkYXRlQ29sbGlkZXJzKGV2ZW50KTtcblxuXHRcdGlmICh0aGlzLl9pQ29sbGlkaW5nT2JqZWN0KVxuXHRcdFx0dGhpcy5xdWV1ZURpc3BhdGNoKHRoaXMuX21vdXNlQ2xpY2ssIGV2ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgb25Eb3VibGVDbGljayhldmVudDpNb3VzZUV2ZW50KVxuXHR7XG5cdFx0dGhpcy51cGRhdGVDb2xsaWRlcnMoZXZlbnQpO1xuXG5cdFx0aWYgKHRoaXMuX2lDb2xsaWRpbmdPYmplY3QpXG5cdFx0XHR0aGlzLnF1ZXVlRGlzcGF0Y2godGhpcy5fbW91c2VEb3VibGVDbGljaywgZXZlbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBvbk1vdXNlRG93bihldmVudDpNb3VzZUV2ZW50KVxuXHR7XG5cdFx0dGhpcy5faUFjdGl2ZURpdiA9IDxIVE1MRGl2RWxlbWVudD4gZXZlbnQudGFyZ2V0O1xuXG5cdFx0dGhpcy51cGRhdGVDb2xsaWRlcnMoZXZlbnQpO1xuXG5cdFx0aWYgKHRoaXMuX2lDb2xsaWRpbmdPYmplY3QpXG5cdFx0XHR0aGlzLnF1ZXVlRGlzcGF0Y2godGhpcy5fbW91c2VEb3duLCBldmVudCk7XG5cdH1cblxuXHRwcml2YXRlIG9uTW91c2VVcChldmVudDpNb3VzZUV2ZW50KVxuXHR7XG5cdFx0dGhpcy51cGRhdGVDb2xsaWRlcnMoZXZlbnQpO1xuXG5cdFx0aWYgKHRoaXMuX2lDb2xsaWRpbmdPYmplY3QpXG5cdFx0XHR0aGlzLnF1ZXVlRGlzcGF0Y2godGhpcy5fbW91c2VVcCAsIGV2ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgb25Nb3VzZVdoZWVsKGV2ZW50Ok1vdXNlRXZlbnQpXG5cdHtcblx0XHR0aGlzLnVwZGF0ZUNvbGxpZGVycyhldmVudCk7XG5cblx0XHRpZiAodGhpcy5faUNvbGxpZGluZ09iamVjdClcblx0XHRcdHRoaXMucXVldWVEaXNwYXRjaCh0aGlzLl9tb3VzZVdoZWVsLCBldmVudCk7XG5cdH1cblxuXG5cdHByaXZhdGUgdXBkYXRlQ29sbGlkZXJzKGV2ZW50Ok1vdXNlRXZlbnQpXG5cdHtcblx0XHRpZiAodGhpcy5faVVwZGF0ZURpcnR5KVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dmFyIHZpZXc6Vmlldztcblx0XHR2YXIgYm91bmRzOkNsaWVudFJlY3Q7XG5cdFx0dmFyIG1vdXNlWDpudW1iZXIgPSBldmVudC5jbGllbnRYO1xuXHRcdHZhciBtb3VzZVk6bnVtYmVyID0gZXZlbnQuY2xpZW50WTtcblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX3ZpZXdMb29rdXAubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHR2aWV3ID0gdGhpcy5fdmlld0xvb2t1cFtpXTtcblx0XHRcdGJvdW5kcyA9IHZpZXcuaHRtbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0XHRpZiAobW91c2VYIDwgYm91bmRzLmxlZnQgfHwgbW91c2VYID4gYm91bmRzLnJpZ2h0IHx8IG1vdXNlWSA8IGJvdW5kcy50b3AgfHwgbW91c2VZID4gYm91bmRzLmJvdHRvbSkge1xuXHRcdFx0XHR2aWV3Ll9wTW91c2VYID0gbnVsbDtcblx0XHRcdFx0dmlldy5fcE1vdXNlWSA9IG51bGw7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2aWV3Ll9wTW91c2VYID0gbW91c2VYICsgYm91bmRzLmxlZnQ7XG5cdFx0XHRcdHZpZXcuX3BNb3VzZVkgPSBtb3VzZVkgKyBib3VuZHMudG9wO1xuXHRcdFx0XHR2aWV3LnVwZGF0ZUNvbGxpZGVyKCk7XG5cblx0XHRcdFx0aWYgKHZpZXcubGF5ZXJlZFZpZXcgJiYgdGhpcy5faUNvbGxpZGluZ09iamVjdClcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9pVXBkYXRlRGlydHkgPSB0cnVlO1xuXHR9XG59XG5cbmV4cG9ydCA9IE1vdXNlTWFuYWdlcjsiXX0= \ No newline at end of file diff --git a/lib/managers/MouseManager.ts b/lib/managers/MouseManager.ts new file mode 100644 index 00000000..1f5f1323 --- /dev/null +++ b/lib/managers/MouseManager.ts @@ -0,0 +1,301 @@ +import View = require("awayjs-core/lib/containers/View"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import PickingCollisionVO = require("awayjs-core/lib/core/pick/PickingCollisionVO"); +import AwayMouseEvent = require("awayjs-core/lib/events/MouseEvent"); + +/** + * MouseManager enforces a singleton pattern and is not intended to be instanced. + * it provides a manager class for detecting mouse hits on scene objects and sending out mouse events. + */ +class MouseManager +{ + private static _instance:MouseManager; + + private _viewLookup:Array = new Array(); + + public _iActiveDiv:HTMLDivElement; + public _iUpdateDirty:boolean; + public _iCollidingObject:PickingCollisionVO; + + private _nullVector:Vector3D = new Vector3D(); + private _previousCollidingObject:PickingCollisionVO; + private _queuedEvents:Array = new Array(); + + private _mouseMoveEvent:MouseEvent; + + private _mouseUp:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_UP); + private _mouseClick:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.CLICK); + private _mouseOut:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_OUT); + private _mouseDown:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_DOWN); + private _mouseMove:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_MOVE); + private _mouseOver:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_OVER); + private _mouseWheel:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.MOUSE_WHEEL); + private _mouseDoubleClick:AwayMouseEvent = new AwayMouseEvent(AwayMouseEvent.DOUBLE_CLICK); + + private onClickDelegate:(event:MouseEvent) => void; + private onDoubleClickDelegate:(event:MouseEvent) => void; + private onMouseDownDelegate:(event:MouseEvent) => void; + private onMouseMoveDelegate:(event:MouseEvent) => void; + private onMouseUpDelegate:(event:MouseEvent) => void; + private onMouseWheelDelegate:(event:MouseEvent) => void; + private onMouseOverDelegate:(event:MouseEvent) => void; + private onMouseOutDelegate:(event:MouseEvent) => void; + + /** + * Creates a new MouseManager object. + */ + constructor() + { + this.onClickDelegate = (event:MouseEvent) => this.onClick(event); + this.onDoubleClickDelegate = (event:MouseEvent) => this.onDoubleClick(event); + this.onMouseDownDelegate = (event:MouseEvent) => this.onMouseDown(event); + this.onMouseMoveDelegate = (event:MouseEvent) => this.onMouseMove(event); + this.onMouseUpDelegate = (event:MouseEvent) => this.onMouseUp(event); + this.onMouseWheelDelegate = (event:MouseEvent) => this.onMouseWheel(event); + this.onMouseOverDelegate = (event:MouseEvent) => this.onMouseOver(event); + this.onMouseOutDelegate = (event:MouseEvent) => this.onMouseOut(event); + } + + public static getInstance():MouseManager + { + if (this._instance) + return this._instance; + + return (this._instance = new MouseManager()); + } + + public fireMouseEvents(forceMouseMove:boolean) + { + // If colliding object has changed, queue over/out events. + if (this._iCollidingObject != this._previousCollidingObject) { + if (this._previousCollidingObject) + this.queueDispatch(this._mouseOut, this._mouseMoveEvent, this._previousCollidingObject); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseOver, this._mouseMoveEvent); + } + + // Fire mouse move events here if forceMouseMove is on. + if (forceMouseMove && this._iCollidingObject) + this.queueDispatch( this._mouseMove, this._mouseMoveEvent); + + var event:AwayMouseEvent; + var dispatcher:DisplayObject; + + // Dispatch all queued events. + var len:number = this._queuedEvents.length; + for (var i:number = 0; i < len; ++i) { + // Only dispatch from first implicitly enabled object ( one that is not a child of a mouseChildren = false hierarchy ). + event = this._queuedEvents[i]; + dispatcher = event.object; + + while (dispatcher && !dispatcher._iIsMouseEnabled()) + dispatcher = dispatcher.parent; + + if (dispatcher) + dispatcher.dispatchEvent(event); + } + + this._queuedEvents.length = 0; + + this._previousCollidingObject = this._iCollidingObject; + + this._iUpdateDirty = false; + } + +// public addViewLayer(view:View) +// { +// var stg:Stage = view.stage; +// +// // Add instance to mouse3dmanager to fire mouse events for multiple views +// if (!view.stageGL.mouse3DManager) +// view.stageGL.mouse3DManager = this; +// +// if (!hasKey(view)) +// _view3Ds[view] = 0; +// +// _childDepth = 0; +// traverseDisplayObjects(stg); +// _viewCount = _childDepth; +// } + + public registerView(view:View) + { + view.htmlElement.addEventListener("click", this.onClickDelegate); + view.htmlElement.addEventListener("dblclick", this.onDoubleClickDelegate); + view.htmlElement.addEventListener("mousedown", this.onMouseDownDelegate); + view.htmlElement.addEventListener("mousemove", this.onMouseMoveDelegate); + view.htmlElement.addEventListener("mouseup", this.onMouseUpDelegate); + view.htmlElement.addEventListener("mousewheel", this.onMouseWheelDelegate); + view.htmlElement.addEventListener("mouseover", this.onMouseOverDelegate); + view.htmlElement.addEventListener("mouseout", this.onMouseOutDelegate); + + this._viewLookup.push(view); + } + + public unregisterView(view:View) + { + view.htmlElement.removeEventListener("click", this.onClickDelegate); + view.htmlElement.removeEventListener("dblclick", this.onDoubleClickDelegate); + view.htmlElement.removeEventListener("mousedown", this.onMouseDownDelegate); + view.htmlElement.removeEventListener("mousemove", this.onMouseMoveDelegate); + view.htmlElement.removeEventListener("mouseup", this.onMouseUpDelegate); + view.htmlElement.removeEventListener("mousewheel", this.onMouseWheelDelegate); + view.htmlElement.removeEventListener("mouseover", this.onMouseOverDelegate); + view.htmlElement.removeEventListener("mouseout", this.onMouseOutDelegate); + + this._viewLookup.slice(this._viewLookup.indexOf(view), 1); + } + + // --------------------------------------------------------------------- + // Private. + // --------------------------------------------------------------------- + + private queueDispatch(event:AwayMouseEvent, sourceEvent:MouseEvent, collider:PickingCollisionVO = null) + { + // 2D properties. + if (sourceEvent) { + event.ctrlKey = sourceEvent.ctrlKey; + event.altKey = sourceEvent.altKey; + event.shiftKey = sourceEvent.shiftKey; + event.screenX = sourceEvent.clientX; + event.screenY = sourceEvent.clientY; + } + + if (collider == null) + collider = this._iCollidingObject; + + // 3D properties. + if (collider) { + // Object. + event.object = collider.displayObject; + event.materialOwner = collider.materialOwner; + // UV. + event.uv = collider.uv; + // Position. + event.localPosition = collider.localPosition? collider.localPosition.clone() : null; + // Normal. + event.localNormal = collider.localNormal? collider.localNormal.clone() : null; + // Face index. + event.index = collider.index; + } else { + // Set all to null. + event.uv = null; + event.object = null; + event.localPosition = this._nullVector; + event.localNormal = this._nullVector; + event.index = 0; + event.subGeometryIndex = 0; + } + + // Store event to be dispatched later. + this._queuedEvents.push(event); + } + + // --------------------------------------------------------------------- + // Listeners. + // --------------------------------------------------------------------- + + private onMouseMove(event:MouseEvent) + { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseMove, this._mouseMoveEvent = event); + } + + private onMouseOut(event:MouseEvent) + { + this._iActiveDiv = null; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseOut, event); + } + + private onMouseOver(event:MouseEvent) + { + this._iActiveDiv = event.target; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch( this._mouseOver, event); + } + + private onClick(event:MouseEvent) + { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseClick, event); + } + + private onDoubleClick(event:MouseEvent) + { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseDoubleClick, event); + } + + private onMouseDown(event:MouseEvent) + { + this._iActiveDiv = event.target; + + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseDown, event); + } + + private onMouseUp(event:MouseEvent) + { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseUp , event); + } + + private onMouseWheel(event:MouseEvent) + { + this.updateColliders(event); + + if (this._iCollidingObject) + this.queueDispatch(this._mouseWheel, event); + } + + + private updateColliders(event:MouseEvent) + { + if (this._iUpdateDirty) + return; + + var view:View; + var bounds:ClientRect; + var mouseX:number = event.clientX; + var mouseY:number = event.clientY; + var len:number = this._viewLookup.length; + for (var i:number = 0; i < len; i++) { + view = this._viewLookup[i]; + bounds = view.htmlElement.getBoundingClientRect(); + if (mouseX < bounds.left || mouseX > bounds.right || mouseY < bounds.top || mouseY > bounds.bottom) { + view._pMouseX = null; + view._pMouseY = null; + } else { + view._pMouseX = mouseX + bounds.left; + view._pMouseY = mouseY + bounds.top; + view.updateCollider(); + + if (view.layeredView && this._iCollidingObject) + break; + } + } + + this._iUpdateDirty = true; + } +} + +export = MouseManager; \ No newline at end of file diff --git a/lib/materials/CSSMaterialBase.js b/lib/materials/CSSMaterialBase.js new file mode 100755 index 00000000..4e534f23 --- /dev/null +++ b/lib/materials/CSSMaterialBase.js @@ -0,0 +1,101 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); +var ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); + +/** +* MaterialBase forms an abstract base class for any material. +* A material consists of several passes, each of which constitutes at least one render call. Several passes could +* be used for special effects (render lighting for many lights in several passes, render an outline in a separate +* pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space +* subsurface scattering, or rendering a depth map for specialized self-shadowing). +* +* Away3D provides default materials trough SinglePassMaterialBase and MultiPassMaterialBase, which use modular +* methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom +* shaders, or entire new material frameworks. +*/ +var CSSMaterialBase = (function (_super) { + __extends(CSSMaterialBase, _super); + /** + * Creates a new MaterialBase object. + */ + function CSSMaterialBase(texture, smooth, repeat) { + if (typeof texture === "undefined") { texture = null; } + if (typeof smooth === "undefined") { smooth = true; } + if (typeof repeat === "undefined") { repeat = false; } + _super.call(this); + + this._iMaterialId = Number(this.id); + + this.texture = texture; + + this.smooth = smooth; + this.repeat = repeat; + } + Object.defineProperty(CSSMaterialBase.prototype, "imageElement", { + get: function () { + return this._imageElement; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CSSMaterialBase.prototype, "imageStyle", { + get: function () { + return this._imageStyle; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(CSSMaterialBase.prototype, "texture", { + /** + * The texture object to use for the albedo colour. + */ + get: function () { + return this._pTexture; + }, + set: function (value) { + if (this._pTexture == value) + return; + + this._pTexture = value; + + if (value instanceof ImageTexture) { + this._imageElement = value.htmlImageElement; + + var node = document.createElement("style"); + node.type = "text/css"; + document.getElementsByTagName("head")[0].appendChild(node); + + var sheet = document.styleSheets[document.styleSheets.length - 1]; + sheet.insertRule(".material" + this.id + "{ }", 0); + var style = sheet.cssRules[0].style; + + style.backgroundImage = "url(" + this._imageElement.src + ")"; + style.backgroundSize = "100% 100%"; + style.position = "absolute"; + style.width = this._imageElement.width + "px"; + style.height = this._imageElement.height + "px"; + style.transformOrigin = style["-webkit-transform-origin"] = style["-moz-transform-origin"] = style["-o-transform-origin"] = style["-ms-transform-origin"] = "0% 0%"; + + this._pHeight = this._imageElement.height; + this._pWidth = this._imageElement.width; + + this._pNotifySizeChanged(); + } + }, + enumerable: true, + configurable: true + }); + + return CSSMaterialBase; +})(MaterialBase); + +module.exports = CSSMaterialBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9DU1NNYXRlcmlhbEJhc2UudHMiXSwibmFtZXMiOlsiQ1NTTWF0ZXJpYWxCYXNlIiwiQ1NTTWF0ZXJpYWxCYXNlLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxvRUFBNEU7QUFDNUUsbUVBQTJFOztBQUczRTs7Ozs7Ozs7OztFQVVHO0FBQ0g7SUFBOEJBLGtDQUFZQTtJQStEekNBOztNQURHQTtJQUNIQSx5QkFBWUEsT0FBNEJBLEVBQUVBLE1BQXFCQSxFQUFFQSxNQUFzQkE7UUFBM0VDLHNDQUFBQSxPQUFPQSxHQUFpQkEsSUFBSUE7QUFBQUEsUUFBRUEscUNBQUFBLE1BQU1BLEdBQVdBLElBQUlBO0FBQUFBLFFBQUVBLHFDQUFBQSxNQUFNQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUV0RkEsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBOztRQUVuQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsT0FBT0E7O1FBRXRCQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxNQUFNQTtRQUNwQkEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsTUFBTUE7SUFDckJBLENBQUNBO0lBbkVERDtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUMxQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFFREE7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsV0FBV0E7UUFDeEJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxTQUFTQTtRQUN0QkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBbUJBLEtBQW1CQTtZQUVyQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsU0FBU0EsSUFBSUEsS0FBS0E7Z0JBQzFCQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsS0FBS0E7O1lBRXRCQSxJQUFJQSxLQUFLQSxZQUFZQSxZQUFZQSxDQUFFQTtnQkFDbENBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLEtBQXFCQSxDQUFFQSxnQkFBZ0JBOztnQkFFNURBLElBQUlBLElBQUlBLEdBQW9CQSxRQUFRQSxDQUFDQSxhQUFhQSxDQUFDQSxPQUFPQSxDQUFDQTtnQkFDM0RBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLFVBQVVBO2dCQUN0QkEsUUFBUUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQTs7Z0JBRTFEQSxJQUFJQSxLQUFLQSxHQUFpQ0EsUUFBUUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7Z0JBQy9GQSxLQUFLQSxDQUFDQSxVQUFVQSxDQUFDQSxXQUFXQSxHQUFHQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxLQUFLQSxFQUFFQSxDQUFDQSxDQUFDQTtnQkFDbERBLElBQUlBLEtBQUtBLEdBQXdCQSxLQUFxQkEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBRUEsS0FBS0E7O2dCQUV6RUEsS0FBS0EsQ0FBQ0EsZUFBZUEsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0E7Z0JBQzdEQSxLQUFLQSxDQUFDQSxjQUFjQSxHQUFHQSxXQUFXQTtnQkFDbENBLEtBQUtBLENBQUNBLFFBQVFBLEdBQUdBLFVBQVVBO2dCQUMzQkEsS0FBS0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUE7Z0JBQzdDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQTtnQkFDL0NBLEtBQUtBLENBQUNBLGVBQWVBLEdBQ2xCQSxLQUFLQSxDQUFDQSwwQkFBMEJBLENBQUNBLEdBQ2pDQSxLQUFLQSxDQUFDQSx1QkFBdUJBLENBQUNBLEdBQzlCQSxLQUFLQSxDQUFDQSxxQkFBcUJBLENBQUNBLEdBQzVCQSxLQUFLQSxDQUFDQSxzQkFBc0JBLENBQUNBLEdBQUdBLE9BQU9BOztnQkFFMUNBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLE1BQU1BO2dCQUN6Q0EsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0E7O2dCQUV2Q0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQTthQUMxQkE7UUFDRkEsQ0FBQ0E7Ozs7QUFwQ0FBO0lBb0RGQSx1QkFBQ0E7QUFBREEsQ0FBQ0EsRUExRTZCLFlBQVksRUEwRXpDOztBQUVELGdDQUF5QixDQUFBIiwiZmlsZSI6Im1hdGVyaWFscy9DU1NNYXRlcmlhbEJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWF0ZXJpYWxCYXNlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvTWF0ZXJpYWxCYXNlXCIpO1xuaW1wb3J0IEltYWdlVGV4dHVyZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvSW1hZ2VUZXh0dXJlXCIpO1xuaW1wb3J0IFRleHR1cmUyREJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9UZXh0dXJlMkRCYXNlXCIpO1xuXG4vKipcbiAqIE1hdGVyaWFsQmFzZSBmb3JtcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbnkgbWF0ZXJpYWwuXG4gKiBBIG1hdGVyaWFsIGNvbnNpc3RzIG9mIHNldmVyYWwgcGFzc2VzLCBlYWNoIG9mIHdoaWNoIGNvbnN0aXR1dGVzIGF0IGxlYXN0IG9uZSByZW5kZXIgY2FsbC4gU2V2ZXJhbCBwYXNzZXMgY291bGRcbiAqIGJlIHVzZWQgZm9yIHNwZWNpYWwgZWZmZWN0cyAocmVuZGVyIGxpZ2h0aW5nIGZvciBtYW55IGxpZ2h0cyBpbiBzZXZlcmFsIHBhc3NlcywgcmVuZGVyIGFuIG91dGxpbmUgaW4gYSBzZXBhcmF0ZVxuICogcGFzcykgb3IgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHJlbmRlci10by10ZXh0dXJlIHBhc3NlcyAocmVuZGVyaW5nIGRpZmZ1c2UgbGlnaHQgdG8gdGV4dHVyZSBmb3IgdGV4dHVyZS1zcGFjZVxuICogc3Vic3VyZmFjZSBzY2F0dGVyaW5nLCBvciByZW5kZXJpbmcgYSBkZXB0aCBtYXAgZm9yIHNwZWNpYWxpemVkIHNlbGYtc2hhZG93aW5nKS5cbiAqXG4gKiBBd2F5M0QgcHJvdmlkZXMgZGVmYXVsdCBtYXRlcmlhbHMgdHJvdWdoIFNpbmdsZVBhc3NNYXRlcmlhbEJhc2UgYW5kIE11bHRpUGFzc01hdGVyaWFsQmFzZSwgd2hpY2ggdXNlIG1vZHVsYXJcbiAqIG1ldGhvZHMgdG8gYnVpbGQgdGhlIHNoYWRlciBjb2RlLiBNYXRlcmlhbEJhc2UgY2FuIGJlIGV4dGVuZGVkIHRvIGJ1aWxkIHNwZWNpZmljIGFuZCBoaWdoLXBlcmZvcm1hbnQgY3VzdG9tXG4gKiBzaGFkZXJzLCBvciBlbnRpcmUgbmV3IG1hdGVyaWFsIGZyYW1ld29ya3MuXG4gKi9cbmNsYXNzIENTU01hdGVyaWFsQmFzZSBleHRlbmRzIE1hdGVyaWFsQmFzZVxue1xuXHRwcml2YXRlIF9pbWFnZUVsZW1lbnQ6SFRNTEltYWdlRWxlbWVudDtcblx0cHJpdmF0ZSBfaW1hZ2VTdHlsZTpNU1N0eWxlQ1NTUHJvcGVydGllcztcblxuXG5cdHB1YmxpYyBnZXQgaW1hZ2VFbGVtZW50KCk6SFRNTEltYWdlRWxlbWVudFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2ltYWdlRWxlbWVudDtcblx0fVxuXG5cdHB1YmxpYyBnZXQgaW1hZ2VTdHlsZSgpOk1TU3R5bGVDU1NQcm9wZXJ0aWVzXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faW1hZ2VTdHlsZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdGV4dHVyZSBvYmplY3QgdG8gdXNlIGZvciB0aGUgYWxiZWRvIGNvbG91ci5cblx0ICovXG5cdHB1YmxpYyBnZXQgdGV4dHVyZSgpOlRleHR1cmUyREJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wVGV4dHVyZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgdGV4dHVyZSh2YWx1ZTpUZXh0dXJlMkRCYXNlKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BUZXh0dXJlID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcFRleHR1cmUgPSB2YWx1ZTtcblxuXHRcdGlmICh2YWx1ZSBpbnN0YW5jZW9mIEltYWdlVGV4dHVyZSkge1xuXHRcdFx0dGhpcy5faW1hZ2VFbGVtZW50ID0gKDxJbWFnZVRleHR1cmU+IHZhbHVlKS5odG1sSW1hZ2VFbGVtZW50O1xuXG5cdFx0XHR2YXIgbm9kZTpIVE1MU3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO1xuXHRcdFx0bm9kZS50eXBlID0gXCJ0ZXh0L2Nzc1wiO1xuXHRcdFx0ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJoZWFkXCIpWzBdLmFwcGVuZENoaWxkKG5vZGUpO1xuXG5cdFx0XHR2YXIgc2hlZXQ6Q1NTU3R5bGVTaGVldCA9IDxDU1NTdHlsZVNoZWV0PiBkb2N1bWVudC5zdHlsZVNoZWV0c1tkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGggLSAxXTtcblx0XHRcdHNoZWV0Lmluc2VydFJ1bGUoXCIubWF0ZXJpYWxcIiArIHRoaXMuaWQgKyBcInsgfVwiLCAwKTtcblx0XHRcdHZhciBzdHlsZTpNU1N0eWxlQ1NTUHJvcGVydGllcyA9ICg8Q1NTU3R5bGVSdWxlPiBzaGVldC5jc3NSdWxlc1swXSkuc3R5bGU7XG5cblx0XHRcdHN0eWxlLmJhY2tncm91bmRJbWFnZSA9IFwidXJsKFwiICsgdGhpcy5faW1hZ2VFbGVtZW50LnNyYyArIFwiKVwiO1xuXHRcdFx0c3R5bGUuYmFja2dyb3VuZFNpemUgPSBcIjEwMCUgMTAwJVwiO1xuXHRcdFx0c3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0XHRzdHlsZS53aWR0aCA9IHRoaXMuX2ltYWdlRWxlbWVudC53aWR0aCArIFwicHhcIjtcblx0XHRcdHN0eWxlLmhlaWdodCA9IHRoaXMuX2ltYWdlRWxlbWVudC5oZWlnaHQgKyBcInB4XCI7XG5cdFx0XHRzdHlsZS50cmFuc2Zvcm1PcmlnaW5cblx0XHRcdFx0PSBzdHlsZVtcIi13ZWJraXQtdHJhbnNmb3JtLW9yaWdpblwiXVxuXHRcdFx0XHQ9IHN0eWxlW1wiLW1vei10cmFuc2Zvcm0tb3JpZ2luXCJdXG5cdFx0XHRcdD0gc3R5bGVbXCItby10cmFuc2Zvcm0tb3JpZ2luXCJdXG5cdFx0XHRcdD0gc3R5bGVbXCItbXMtdHJhbnNmb3JtLW9yaWdpblwiXSA9IFwiMCUgMCVcIjtcblxuXHRcdFx0dGhpcy5fcEhlaWdodCA9IHRoaXMuX2ltYWdlRWxlbWVudC5oZWlnaHQ7XG5cdFx0XHR0aGlzLl9wV2lkdGggPSB0aGlzLl9pbWFnZUVsZW1lbnQud2lkdGg7XG5cblx0XHRcdHRoaXMuX3BOb3RpZnlTaXplQ2hhbmdlZCgpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IE1hdGVyaWFsQmFzZSBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih0ZXh0dXJlOlRleHR1cmUyREJhc2UgPSBudWxsLCBzbW9vdGg6Ym9vbGVhbiA9IHRydWUsIHJlcGVhdDpib29sZWFuID0gZmFsc2UpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5faU1hdGVyaWFsSWQgPSBOdW1iZXIodGhpcy5pZCk7XG5cblx0XHR0aGlzLnRleHR1cmUgPSB0ZXh0dXJlO1xuXG5cdFx0dGhpcy5zbW9vdGggPSBzbW9vdGg7XG5cdFx0dGhpcy5yZXBlYXQgPSByZXBlYXQ7XG5cdH1cbn1cblxuZXhwb3J0ID0gQ1NTTWF0ZXJpYWxCYXNlOyJdfQ== \ No newline at end of file diff --git a/lib/materials/CSSMaterialBase.ts b/lib/materials/CSSMaterialBase.ts new file mode 100644 index 00000000..267b4d16 --- /dev/null +++ b/lib/materials/CSSMaterialBase.ts @@ -0,0 +1,92 @@ +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); +import ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); +import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); + +/** + * MaterialBase forms an abstract base class for any material. + * A material consists of several passes, each of which constitutes at least one render call. Several passes could + * be used for special effects (render lighting for many lights in several passes, render an outline in a separate + * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space + * subsurface scattering, or rendering a depth map for specialized self-shadowing). + * + * Away3D provides default materials trough SinglePassMaterialBase and MultiPassMaterialBase, which use modular + * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom + * shaders, or entire new material frameworks. + */ +class CSSMaterialBase extends MaterialBase +{ + private _imageElement:HTMLImageElement; + private _imageStyle:MSStyleCSSProperties; + + + public get imageElement():HTMLImageElement + { + return this._imageElement; + } + + public get imageStyle():MSStyleCSSProperties + { + return this._imageStyle; + } + + /** + * The texture object to use for the albedo colour. + */ + public get texture():Texture2DBase + { + return this._pTexture; + } + + public set texture(value:Texture2DBase) + { + if (this._pTexture == value) + return; + + this._pTexture = value; + + if (value instanceof ImageTexture) { + this._imageElement = ( value).htmlImageElement; + + var node:HTMLStyleElement = document.createElement("style"); + node.type = "text/css"; + document.getElementsByTagName("head")[0].appendChild(node); + + var sheet:CSSStyleSheet = document.styleSheets[document.styleSheets.length - 1]; + sheet.insertRule(".material" + this.id + "{ }", 0); + var style:MSStyleCSSProperties = ( sheet.cssRules[0]).style; + + style.backgroundImage = "url(" + this._imageElement.src + ")"; + style.backgroundSize = "100% 100%"; + style.position = "absolute"; + style.width = this._imageElement.width + "px"; + style.height = this._imageElement.height + "px"; + style.transformOrigin + = style["-webkit-transform-origin"] + = style["-moz-transform-origin"] + = style["-o-transform-origin"] + = style["-ms-transform-origin"] = "0% 0%"; + + this._pHeight = this._imageElement.height; + this._pWidth = this._imageElement.width; + + this._pNotifySizeChanged(); + } + } + + /** + * Creates a new MaterialBase object. + */ + constructor(texture:Texture2DBase = null, smooth:boolean = true, repeat:boolean = false) + { + super(); + + this._iMaterialId = Number(this.id); + + this.texture = texture; + + this.smooth = smooth; + this.repeat = repeat; + } +} + +export = CSSMaterialBase; \ No newline at end of file diff --git a/lib/materials/LightSources.js b/lib/materials/LightSources.js new file mode 100755 index 00000000..9e643456 --- /dev/null +++ b/lib/materials/LightSources.js @@ -0,0 +1,25 @@ +/** +* Enumeration class for defining which lighting types affect the specific material +* lighting component (diffuse and specular). This can be useful if, for example, you +* want to use light probes for diffuse global lighting, but want specular reflections from +* traditional light sources without those affecting the diffuse light. +* +* @see away.materials.ColorMaterial.diffuseLightSources +* @see away.materials.ColorMaterial.specularLightSources +* @see away.materials.TextureMaterial.diffuseLightSources +* @see away.materials.TextureMaterial.specularLightSources +*/ +var LightSources = (function () { + function LightSources() { + } + LightSources.LIGHTS = 0x01; + + LightSources.PROBES = 0x02; + + LightSources.ALL = 0x03; + return LightSources; +})(); + +module.exports = LightSources; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9MaWdodFNvdXJjZXMudHMiXSwibmFtZXMiOlsiTGlnaHRTb3VyY2VzIiwiTGlnaHRTb3VyY2VzLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7OztFQVVHO0FBQ0g7SUFBQUE7SUFtQkFDLENBQUNBO0FBQUFELElBYkFBLHNCQUE4QkEsSUFBSUE7O0lBTWxDQSxzQkFBOEJBLElBQUlBOztJQU1sQ0EsbUJBQTJCQSxJQUFJQTtJQUNoQ0Esb0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsNkJBQXNCLENBQUEiLCJmaWxlIjoibWF0ZXJpYWxzL0xpZ2h0U291cmNlcy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRW51bWVyYXRpb24gY2xhc3MgZm9yIGRlZmluaW5nIHdoaWNoIGxpZ2h0aW5nIHR5cGVzIGFmZmVjdCB0aGUgc3BlY2lmaWMgbWF0ZXJpYWxcbiAqIGxpZ2h0aW5nIGNvbXBvbmVudCAoZGlmZnVzZSBhbmQgc3BlY3VsYXIpLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYsIGZvciBleGFtcGxlLCB5b3VcbiAqIHdhbnQgdG8gdXNlIGxpZ2h0IHByb2JlcyBmb3IgZGlmZnVzZSBnbG9iYWwgbGlnaHRpbmcsIGJ1dCB3YW50IHNwZWN1bGFyIHJlZmxlY3Rpb25zIGZyb21cbiAqIHRyYWRpdGlvbmFsIGxpZ2h0IHNvdXJjZXMgd2l0aG91dCB0aG9zZSBhZmZlY3RpbmcgdGhlIGRpZmZ1c2UgbGlnaHQuXG4gKlxuICogQHNlZSBhd2F5Lm1hdGVyaWFscy5Db2xvck1hdGVyaWFsLmRpZmZ1c2VMaWdodFNvdXJjZXNcbiAqIEBzZWUgYXdheS5tYXRlcmlhbHMuQ29sb3JNYXRlcmlhbC5zcGVjdWxhckxpZ2h0U291cmNlc1xuICogQHNlZSBhd2F5Lm1hdGVyaWFscy5UZXh0dXJlTWF0ZXJpYWwuZGlmZnVzZUxpZ2h0U291cmNlc1xuICogQHNlZSBhd2F5Lm1hdGVyaWFscy5UZXh0dXJlTWF0ZXJpYWwuc3BlY3VsYXJMaWdodFNvdXJjZXNcbiAqL1xuY2xhc3MgTGlnaHRTb3VyY2VzXG57XG5cdC8qKlxuXHQgKiBEZWZpbmVzIG5vcm1hbCBsaWdodHMgYXJlIHRvIGJlIHVzZWQgYXMgdGhlIHNvdXJjZSBmb3IgdGhlIGxpZ2h0aW5nXG5cdCAqIGNvbXBvbmVudC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTElHSFRTOm51bWJlciA9IDB4MDE7XG5cblx0LyoqXG5cdCAqIERlZmluZXMgdGhhdCBnbG9iYWwgbGlnaHRpbmcgcHJvYmVzIGFyZSB0byBiZSB1c2VkIGFzIHRoZSBzb3VyY2UgZm9yIHRoZVxuXHQgKiBsaWdodGluZyBjb21wb25lbnQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFBST0JFUzpudW1iZXIgPSAweDAyO1xuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoYXQgYm90aCBub3JtYWwgYW5kIGdsb2JhbCBsaWdodGluZyBwcm9iZXMgIGFyZSB0byBiZSB1c2VkIGFzIHRoZVxuXHQgKiBzb3VyY2UgZm9yIHRoZSBsaWdodGluZyBjb21wb25lbnQuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBMaWdodFNvdXJjZXMuTElHSFRTIHwgTGlnaHRTb3VyY2VzLlBST0JFUy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgQUxMOm51bWJlciA9IDB4MDM7XG59XG5cbmV4cG9ydCA9IExpZ2h0U291cmNlczsiXX0= \ No newline at end of file diff --git a/lib/materials/LightSources.ts b/lib/materials/LightSources.ts new file mode 100644 index 00000000..08998315 --- /dev/null +++ b/lib/materials/LightSources.ts @@ -0,0 +1,33 @@ +/** + * Enumeration class for defining which lighting types affect the specific material + * lighting component (diffuse and specular). This can be useful if, for example, you + * want to use light probes for diffuse global lighting, but want specular reflections from + * traditional light sources without those affecting the diffuse light. + * + * @see away.materials.ColorMaterial.diffuseLightSources + * @see away.materials.ColorMaterial.specularLightSources + * @see away.materials.TextureMaterial.diffuseLightSources + * @see away.materials.TextureMaterial.specularLightSources + */ +class LightSources +{ + /** + * Defines normal lights are to be used as the source for the lighting + * component. + */ + public static LIGHTS:number = 0x01; + + /** + * Defines that global lighting probes are to be used as the source for the + * lighting component. + */ + public static PROBES:number = 0x02; + + /** + * Defines that both normal and global lighting probes are to be used as the + * source for the lighting component. This is equivalent to LightSources.LIGHTS | LightSources.PROBES. + */ + public static ALL:number = 0x03; +} + +export = LightSources; \ No newline at end of file diff --git a/lib/materials/MaterialBase.js b/lib/materials/MaterialBase.js new file mode 100755 index 00000000..ba81ac1f --- /dev/null +++ b/lib/materials/MaterialBase.js @@ -0,0 +1,720 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BlendMode = require("awayjs-core/lib/core/base/BlendMode"); + +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +var Event = require("awayjs-core/lib/events/Event"); +var MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); + +/** +* MaterialBase forms an abstract base class for any material. +* A material consists of several passes, each of which constitutes at least one render call. Several passes could +* be used for special effects (render lighting for many lights in several passes, render an outline in a separate +* pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space +* subsurface scattering, or rendering a depth map for specialized self-shadowing). +* +* Away3D provides default materials trough SinglePassMaterialBase and TriangleMaterial, which use modular +* methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom +* shaders, or entire new material frameworks. +*/ +var MaterialBase = (function (_super) { + __extends(MaterialBase, _super); + /** + * Creates a new MaterialBase object. + */ + function MaterialBase() { + var _this = this; + _super.call(this); + this._materialPassData = new Array(); + this._materialData = new Array(); + this._pAlphaThreshold = 0; + this._pAnimateUVs = false; + this._enableLightFallOff = true; + this._specularLightSources = 0x01; + this._diffuseLightSources = 0x03; + /** + * An id for this material used to sort the renderables by shader program, which reduces Program state changes. + * + * @private + */ + this._iMaterialId = 0; + this._iBaseScreenPassIndex = 0; + this._bothSides = false; + this._pScreenPassesInvalid = true; + this._pBlendMode = BlendMode.NORMAL; + this._numPasses = 0; + this._mipmap = false; + this._smooth = true; + this._repeat = false; + this._color = 0xFFFFFF; + this._pHeight = 1; + this._pWidth = 1; + this._pRequiresBlending = false; + + this._iMaterialId = Number(this.id); + + this._owners = new Array(); + this._passes = new Array(); + + this._onPassChangeDelegate = function (event) { + return _this.onPassChange(event); + }; + this._onLightChangeDelegate = function (event) { + return _this.onLightsChange(event); + }; + + this.alphaPremultiplied = false; //TODO: work out why this is different for WebGL + } + Object.defineProperty(MaterialBase.prototype, "assetType", { + /** + * @inheritDoc + */ + get: function () { + return AssetType.MATERIAL; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MaterialBase.prototype, "height", { + /** + * + */ + get: function () { + return this._pHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MaterialBase.prototype, "animationSet", { + /** + * + */ + get: function () { + return this._animationSet; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MaterialBase.prototype, "lightPicker", { + /** + * The light picker used by the material to provide lights to the material if it supports lighting. + * + * @see LightPickerBase + * @see StaticLightPicker + */ + get: function () { + return this._pLightPicker; + }, + set: function (value) { + if (this._pLightPicker == value) + return; + + if (this._pLightPicker) + this._pLightPicker.removeEventListener(Event.CHANGE, this._onLightChangeDelegate); + + this._pLightPicker = value; + + if (this._pLightPicker) + this._pLightPicker.addEventListener(Event.CHANGE, this._onLightChangeDelegate); + + this._pInvalidateScreenPasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "mipmap", { + /** + * Indicates whether or not any used textures should use mipmapping. Defaults to true. + */ + get: function () { + return this._mipmap; + }, + set: function (value) { + if (this._mipmap == value) + return; + + this._mipmap = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "smooth", { + /** + * Indicates whether or not any used textures should use smoothing. + */ + get: function () { + return this._smooth; + }, + set: function (value) { + if (this._smooth == value) + return; + + this._smooth = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "repeat", { + /** + * Indicates whether or not any used textures should be tiled. If set to false, texture samples are clamped to + * the texture's borders when the uv coordinates are outside the [0, 1] interval. + */ + get: function () { + return this._repeat; + }, + set: function (value) { + if (this._repeat == value) + return; + + this._repeat = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "color", { + /** + * The diffuse reflectivity color of the surface. + */ + get: function () { + return this._color; + }, + set: function (value) { + if (this._color == value) + return; + + this._color = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "texture", { + /** + * The texture object to use for the albedo colour. + */ + get: function () { + return this._pTexture; + }, + set: function (value) { + if (this._pTexture == value) + return; + + this._pTexture = value; + + this._pInvalidatePasses(); + + this._pHeight = this._pTexture.height; + this._pWidth = this._pTexture.width; + + this._pNotifySizeChanged(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "animateUVs", { + /** + * Specifies whether or not the UV coordinates should be animated using a transformation matrix. + */ + get: function () { + return this._pAnimateUVs; + }, + set: function (value) { + if (this._pAnimateUVs == value) + return; + + this._pAnimateUVs = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "enableLightFallOff", { + /** + * Whether or not to use fallOff and radius properties for lights. This can be used to improve performance and + * compatibility for constrained mode. + */ + get: function () { + return this._enableLightFallOff; + }, + set: function (value) { + if (this._enableLightFallOff == value) + return; + + this._enableLightFallOff = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "diffuseLightSources", { + /** + * Define which light source types to use for diffuse reflections. This allows choosing between regular lights + * and/or light probes for diffuse reflections. + * + * @see away3d.materials.LightSources + */ + get: function () { + return this._diffuseLightSources; + }, + set: function (value) { + if (this._diffuseLightSources == value) + return; + + this._diffuseLightSources = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "specularLightSources", { + /** + * Define which light source types to use for specular reflections. This allows choosing between regular lights + * and/or light probes for specular reflections. + * + * @see away3d.materials.LightSources + */ + get: function () { + return this._specularLightSources; + }, + set: function (value) { + if (this._specularLightSources == value) + return; + + this._specularLightSources = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + /** + * Cleans up resources owned by the material, including passes. Textures are not owned by the material since they + * could be used by other materials and will not be disposed. + */ + MaterialBase.prototype.dispose = function () { + var i; + var len; + + this._pClearScreenPasses(); + + len = this._materialData.length; + for (i = 0; i < len; i++) + this._materialData[i].dispose(); + + this._materialData = new Array(); + + len = this._materialPassData.length; + for (i = 0; i < len; i++) + this._materialPassData[i].dispose(); + + this._materialPassData = new Array(); + }; + + Object.defineProperty(MaterialBase.prototype, "bothSides", { + /** + * Defines whether or not the material should cull triangles facing away from the camera. + */ + get: function () { + return this._bothSides; + }, + set: function (value) { + if (this._bothSides = value) + return; + + this._bothSides = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "blendMode", { + /** + * The blend mode to use when drawing this renderable. The following blend modes are supported: + *
    + *
  • BlendMode.NORMAL: No blending, unless the material inherently needs it
  • + *
  • BlendMode.LAYER: Force blending. This will draw the object the same as NORMAL, but without writing depth writes.
  • + *
  • BlendMode.MULTIPLY
  • + *
  • BlendMode.ADD
  • + *
  • BlendMode.ALPHA
  • + *
+ */ + get: function () { + return this._pBlendMode; + }, + set: function (value) { + if (this._pBlendMode == value) + return; + + this._pBlendMode = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "alphaPremultiplied", { + /** + * Indicates whether visible textures (or other pixels) used by this material have + * already been premultiplied. Toggle this if you are seeing black halos around your + * blended alpha edges. + */ + get: function () { + return this._alphaPremultiplied; + }, + set: function (value) { + if (this._alphaPremultiplied == value) + return; + + this._alphaPremultiplied = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "alphaThreshold", { + /** + * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either + * invisible or entirely opaque, often used with textures for foliage, etc. + * Recommended values are 0 to disable alpha, or 0.5 to create smooth edges. Default value is 0 (disabled). + */ + get: function () { + return this._pAlphaThreshold; + }, + set: function (value) { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + if (this._pAlphaThreshold == value) + return; + + this._pAlphaThreshold = value; + + this._pInvalidatePasses(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(MaterialBase.prototype, "requiresBlending", { + /** + * Indicates whether or not the material requires alpha blending during rendering. + */ + get: function () { + return this._pRequiresBlending; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(MaterialBase.prototype, "width", { + /** + * + */ + get: function () { + return this._pWidth; + }, + enumerable: true, + configurable: true + }); + + /** + * Sets the render state for a pass that is independent of the rendered object. This needs to be called before + * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. + * @param pass The pass data to activate. + * @param stage The Stage object which is currently used for rendering. + * @param camera The camera from which the scene is viewed. + * @private + */ + MaterialBase.prototype._iActivatePass = function (pass, stage, camera) { + pass.materialPass._iActivate(pass, stage, camera); + }; + + /** + * Clears the render state for a pass. This needs to be called before activating another pass. + * @param pass The pass to deactivate. + * @param stage The Stage used for rendering + * + * @internal + */ + MaterialBase.prototype._iDeactivatePass = function (pass, stage) { + pass.materialPass._iDeactivate(pass, stage); + }; + + /** + * Renders the current pass. Before calling renderPass, activatePass needs to be called with the same index. + * @param pass The pass used to render the renderable. + * @param renderable The IRenderable object to draw. + * @param stage The Stage object used for rendering. + * @param entityCollector The EntityCollector object that contains the visible scene data. + * @param viewProjection The view-projection matrix used to project to the screen. This is not the same as + * camera.viewProjection as it includes the scaling factors when rendering to textures. + * + * @internal + */ + MaterialBase.prototype._iRenderPass = function (pass, renderable, stage, camera, viewProjection) { + if (this._pLightPicker) + this._pLightPicker.collectLights(renderable); + + pass.materialPass._iRender(pass, renderable, stage, camera, viewProjection); + }; + + // + // MATERIAL MANAGEMENT + // + /** + * Mark an IMaterialOwner as owner of this material. + * Assures we're not using the same material across renderables with different animations, since the + * Programs depend on animation. This method needs to be called when a material is assigned. + * + * @param owner The IMaterialOwner that had this material assigned + * + * @internal + */ + MaterialBase.prototype.iAddOwner = function (owner) { + this._owners.push(owner); + + var animationSet; + var animator = owner.animator; + + if (animator) + animationSet = animator.animationSet; + + if (owner.animator) { + if (this._animationSet && animationSet != this._animationSet) { + throw new Error("A Material instance cannot be shared across material owners with different animation sets"); + } else { + if (this._animationSet != animationSet) { + this._animationSet = animationSet; + + this.invalidateAnimation(); + } + } + } + }; + + /** + * Removes an IMaterialOwner as owner. + * @param owner + * + * @internal + */ + MaterialBase.prototype.iRemoveOwner = function (owner) { + this._owners.splice(this._owners.indexOf(owner), 1); + + if (this._owners.length == 0) { + this._animationSet = null; + + this.invalidateAnimation(); + } + }; + + Object.defineProperty(MaterialBase.prototype, "iOwners", { + /** + * A list of the IMaterialOwners that use this material + * + * @private + */ + get: function () { + return this._owners; + }, + enumerable: true, + configurable: true + }); + + /** + * The amount of passes used by the material. + * + * @private + */ + MaterialBase.prototype._iNumScreenPasses = function () { + return this._numPasses; + }; + + Object.defineProperty(MaterialBase.prototype, "_iScreenPasses", { + /** + * A list of the screen passes used in this material + * + * @private + */ + get: function () { + return this._passes; + }, + enumerable: true, + configurable: true + }); + + /** + * Marks the shader programs for all passes as invalid, so they will be recompiled before the next use. + * + * @private + */ + MaterialBase.prototype._pInvalidatePasses = function () { + var len = this._materialPassData.length; + for (var i = 0; i < len; i++) + this._materialPassData[i].invalidate(); + + this.invalidateMaterial(); + }; + + /** + * Flags that the screen passes have become invalid and need possible re-ordering / adding / deleting + */ + MaterialBase.prototype._pInvalidateScreenPasses = function () { + this._pScreenPassesInvalid = true; + }; + + /** + * Removes a pass from the material. + * @param pass The pass to be removed. + */ + MaterialBase.prototype._pRemoveScreenPass = function (pass) { + pass.removeEventListener(Event.CHANGE, this._onPassChangeDelegate); + this._passes.splice(this._passes.indexOf(pass), 1); + + this._numPasses--; + }; + + /** + * Removes all passes from the material + */ + MaterialBase.prototype._pClearScreenPasses = function () { + for (var i = 0; i < this._numPasses; ++i) + this._passes[i].removeEventListener(Event.CHANGE, this._onPassChangeDelegate); + + this._passes.length = this._numPasses = 0; + }; + + /** + * Adds a pass to the material + * @param pass + */ + MaterialBase.prototype._pAddScreenPass = function (pass) { + this._passes[this._numPasses++] = pass; + + pass.lightPicker = this._pLightPicker; + pass.addEventListener(Event.CHANGE, this._onPassChangeDelegate); + + this.invalidateMaterial(); + }; + + MaterialBase.prototype._iAddMaterialData = function (materialData) { + this._materialData.push(materialData); + + return materialData; + }; + + MaterialBase.prototype._iRemoveMaterialData = function (materialData) { + this._materialData.splice(this._materialData.indexOf(materialData), 1); + + return materialData; + }; + + /** + * Performs any processing that needs to occur before any of its passes are used. + * + * @private + */ + MaterialBase.prototype._iUpdateMaterial = function () { + }; + + /** + * Listener for when a pass's shader code changes. It recalculates the render order id. + */ + MaterialBase.prototype.onPassChange = function (event) { + this.invalidateMaterial(); + }; + + MaterialBase.prototype.invalidateAnimation = function () { + var len = this._materialData.length; + for (var i = 0; i < len; i++) + this._materialData[i].invalidateAnimation(); + }; + + MaterialBase.prototype.invalidateMaterial = function () { + var len = this._materialData.length; + for (var i = 0; i < len; i++) + this._materialData[i].invalidateMaterial(); + }; + + /** + * Called when the light picker's configuration changed. + */ + MaterialBase.prototype.onLightsChange = function (event) { + this._pInvalidateScreenPasses(); + }; + + MaterialBase.prototype._pNotifySizeChanged = function () { + if (!this._sizeChanged) + this._sizeChanged = new MaterialEvent(MaterialEvent.SIZE_CHANGED); + + this.dispatchEvent(this._sizeChanged); + }; + + MaterialBase.prototype._iAddMaterialPassData = function (materialPassData) { + this._materialPassData.push(materialPassData); + + return materialPassData; + }; + + MaterialBase.prototype._iRemoveMaterialPassData = function (materialPassData) { + this._materialPassData.splice(this._materialPassData.indexOf(materialPassData), 1); + + return materialPassData; + }; + return MaterialBase; +})(NamedAssetBase); + +module.exports = MaterialBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9NYXRlcmlhbEJhc2UudHMiXSwibmFtZXMiOlsiTWF0ZXJpYWxCYXNlIiwiTWF0ZXJpYWxCYXNlLmNvbnN0cnVjdG9yIiwiTWF0ZXJpYWxCYXNlLmRpc3Bvc2UiLCJNYXRlcmlhbEJhc2UuX2lBY3RpdmF0ZVBhc3MiLCJNYXRlcmlhbEJhc2UuX2lEZWFjdGl2YXRlUGFzcyIsIk1hdGVyaWFsQmFzZS5faVJlbmRlclBhc3MiLCJNYXRlcmlhbEJhc2UuaUFkZE93bmVyIiwiTWF0ZXJpYWxCYXNlLmlSZW1vdmVPd25lciIsIk1hdGVyaWFsQmFzZS5faU51bVNjcmVlblBhc3NlcyIsIk1hdGVyaWFsQmFzZS5fcEludmFsaWRhdGVQYXNzZXMiLCJNYXRlcmlhbEJhc2UuX3BJbnZhbGlkYXRlU2NyZWVuUGFzc2VzIiwiTWF0ZXJpYWxCYXNlLl9wUmVtb3ZlU2NyZWVuUGFzcyIsIk1hdGVyaWFsQmFzZS5fcENsZWFyU2NyZWVuUGFzc2VzIiwiTWF0ZXJpYWxCYXNlLl9wQWRkU2NyZWVuUGFzcyIsIk1hdGVyaWFsQmFzZS5faUFkZE1hdGVyaWFsRGF0YSIsIk1hdGVyaWFsQmFzZS5faVJlbW92ZU1hdGVyaWFsRGF0YSIsIk1hdGVyaWFsQmFzZS5faVVwZGF0ZU1hdGVyaWFsIiwiTWF0ZXJpYWxCYXNlLm9uUGFzc0NoYW5nZSIsIk1hdGVyaWFsQmFzZS5pbnZhbGlkYXRlQW5pbWF0aW9uIiwiTWF0ZXJpYWxCYXNlLmludmFsaWRhdGVNYXRlcmlhbCIsIk1hdGVyaWFsQmFzZS5vbkxpZ2h0c0NoYW5nZSIsIk1hdGVyaWFsQmFzZS5fcE5vdGlmeVNpemVDaGFuZ2VkIiwiTWF0ZXJpYWxCYXNlLl9pQWRkTWF0ZXJpYWxQYXNzRGF0YSIsIk1hdGVyaWFsQmFzZS5faVJlbW92ZU1hdGVyaWFsUGFzc0RhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDhEQUVxRTs7QUFJckUsaUVBQXdFOztBQUV4RSwyRUFBaUY7O0FBS2pGLG1EQUEyRDtBQUMzRCxtRUFB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OztRQUU3Q0EsT0FBT0EsZ0JBQWdCQTtJQUN4QkEsQ0FBQ0E7O0lBRUR0QixrREFBQUEsVUFBZ0NBLGdCQUFrQ0E7UUFFakV1QixJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTs7UUFFbEZBLE9BQU9BLGdCQUFnQkE7SUFDeEJBLENBQUNBO0lBQ0Z2QixvQkFBQ0E7QUFBREEsQ0FBQ0EsRUE1ckIwQixjQUFjLEVBNHJCeEM7O0FBRUQsNkJBQXNCLENBQUEiLCJmaWxlIjoibWF0ZXJpYWxzL01hdGVyaWFsQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJQW5pbWF0aW9uU2V0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2FuaW1hdG9ycy9JQW5pbWF0aW9uU2V0XCIpO1xuaW1wb3J0IElBbmltYXRvclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2FuaW1hdG9ycy9JQW5pbWF0b3JcIik7XG5pbXBvcnQgQmxlbmRNb2RlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0JsZW5kTW9kZVwiKTtcbmltcG9ydCBJTWF0ZXJpYWxPd25lclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvSU1hdGVyaWFsT3duZXJcIik7XG5pbXBvcnQgSVN0YWdlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvSVN0YWdlXCIpO1xuaW1wb3J0IE1hdHJpeDNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RcIik7XG5pbXBvcnQgQXNzZXRUeXBlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0VHlwZVwiKTtcbmltcG9ydCBJQXNzZXRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5pbXBvcnQgTmFtZWRBc3NldEJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L05hbWVkQXNzZXRCYXNlXCIpO1xuaW1wb3J0IElSZW5kZXJhYmxlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0lSZW5kZXJhYmxlXCIpO1xuaW1wb3J0IElNYXRlcmlhbERhdGFcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0lNYXRlcmlhbERhdGFcIik7XG5pbXBvcnQgSU1hdGVyaWFsUGFzc0RhdGFcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcG9vbC9JTWF0ZXJpYWxQYXNzRGF0YVwiKTtcbmltcG9ydCBDYW1lcmFcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuaW1wb3J0IE1hdGVyaWFsRXZlbnRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL01hdGVyaWFsRXZlbnRcIik7XG5pbXBvcnQgTGlnaHRQaWNrZXJCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9saWdodHBpY2tlcnMvTGlnaHRQaWNrZXJCYXNlXCIpO1xuaW1wb3J0IElNYXRlcmlhbFBhc3NcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvbWF0ZXJpYWxzL3Bhc3Nlcy9JTWF0ZXJpYWxQYXNzXCIpO1xuaW1wb3J0IFRleHR1cmUyREJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvVGV4dHVyZTJEQmFzZVwiKTtcblxuXG4vKipcbiAqIE1hdGVyaWFsQmFzZSBmb3JtcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbnkgbWF0ZXJpYWwuXG4gKiBBIG1hdGVyaWFsIGNvbnNpc3RzIG9mIHNldmVyYWwgcGFzc2VzLCBlYWNoIG9mIHdoaWNoIGNvbnN0aXR1dGVzIGF0IGxlYXN0IG9uZSByZW5kZXIgY2FsbC4gU2V2ZXJhbCBwYXNzZXMgY291bGRcbiAqIGJlIHVzZWQgZm9yIHNwZWNpYWwgZWZmZWN0cyAocmVuZGVyIGxpZ2h0aW5nIGZvciBtYW55IGxpZ2h0cyBpbiBzZXZlcmFsIHBhc3NlcywgcmVuZGVyIGFuIG91dGxpbmUgaW4gYSBzZXBhcmF0ZVxuICogcGFzcykgb3IgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIHJlbmRlci10by10ZXh0dXJlIHBhc3NlcyAocmVuZGVyaW5nIGRpZmZ1c2UgbGlnaHQgdG8gdGV4dHVyZSBmb3IgdGV4dHVyZS1zcGFjZVxuICogc3Vic3VyZmFjZSBzY2F0dGVyaW5nLCBvciByZW5kZXJpbmcgYSBkZXB0aCBtYXAgZm9yIHNwZWNpYWxpemVkIHNlbGYtc2hhZG93aW5nKS5cbiAqXG4gKiBBd2F5M0QgcHJvdmlkZXMgZGVmYXVsdCBtYXRlcmlhbHMgdHJvdWdoIFNpbmdsZVBhc3NNYXRlcmlhbEJhc2UgYW5kIFRyaWFuZ2xlTWF0ZXJpYWwsIHdoaWNoIHVzZSBtb2R1bGFyXG4gKiBtZXRob2RzIHRvIGJ1aWxkIHRoZSBzaGFkZXIgY29kZS4gTWF0ZXJpYWxCYXNlIGNhbiBiZSBleHRlbmRlZCB0byBidWlsZCBzcGVjaWZpYyBhbmQgaGlnaC1wZXJmb3JtYW50IGN1c3RvbVxuICogc2hhZGVycywgb3IgZW50aXJlIG5ldyBtYXRlcmlhbCBmcmFtZXdvcmtzLlxuICovXG5jbGFzcyBNYXRlcmlhbEJhc2UgZXh0ZW5kcyBOYW1lZEFzc2V0QmFzZSBpbXBsZW1lbnRzIElBc3NldFxue1xuXHRwcml2YXRlIF9zaXplQ2hhbmdlZDpNYXRlcmlhbEV2ZW50O1xuXHRwcml2YXRlIF9tYXRlcmlhbFBhc3NEYXRhOkFycmF5PElNYXRlcmlhbFBhc3NEYXRhPiA9IG5ldyBBcnJheTxJTWF0ZXJpYWxQYXNzRGF0YT4oKTtcblx0cHJpdmF0ZSBfbWF0ZXJpYWxEYXRhOkFycmF5PElNYXRlcmlhbERhdGE+ID0gbmV3IEFycmF5PElNYXRlcmlhbERhdGE+KCk7XG5cblx0cHVibGljIF9wQWxwaGFUaHJlc2hvbGQ6bnVtYmVyID0gMDtcblx0cHVibGljIF9wQW5pbWF0ZVVWczpib29sZWFuID0gZmFsc2U7XG5cdHByaXZhdGUgX2VuYWJsZUxpZ2h0RmFsbE9mZjpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfc3BlY3VsYXJMaWdodFNvdXJjZXM6bnVtYmVyID0gMHgwMTtcblx0cHJpdmF0ZSBfZGlmZnVzZUxpZ2h0U291cmNlczpudW1iZXIgPSAweDAzO1xuXG5cdC8qKlxuXHQgKiBBbiBvYmplY3QgdG8gY29udGFpbiBhbnkgZXh0cmEgZGF0YS5cblx0ICovXG5cdHB1YmxpYyBleHRyYTpPYmplY3Q7XG5cblx0LyoqXG5cdCAqIEEgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCBieSBtYXRlcmlhbHMgdGhhdCBvbmx5IHdvcmsgd2l0aCBhIGdpdmVuIHR5cGUgb2YgcmVuZGVyZXIuIFRoZSByZW5kZXJlciBjYW4gdGVzdCB0aGVcblx0ICogY2xhc3NpZmljYXRpb24gdG8gY2hvb3NlIHdoaWNoIHJlbmRlciBwYXRoIHRvIHVzZS4gRm9yIGV4YW1wbGUsIGEgZGVmZXJyZWQgbWF0ZXJpYWwgY291bGQgc2V0IHRoaXMgdmFsdWUgc29cblx0ICogdGhhdCB0aGUgZGVmZXJyZWQgcmVuZGVyZXIga25vd3Mgbm90IHRvIHRha2UgdGhlIGZvcndhcmQgcmVuZGVyaW5nIHBhdGguXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwdWJsaWMgX2lDbGFzc2lmaWNhdGlvbjpzdHJpbmc7XG5cblxuXHQvKipcblx0ICogQW4gaWQgZm9yIHRoaXMgbWF0ZXJpYWwgdXNlZCB0byBzb3J0IHRoZSByZW5kZXJhYmxlcyBieSBzaGFkZXIgcHJvZ3JhbSwgd2hpY2ggcmVkdWNlcyBQcm9ncmFtIHN0YXRlIGNoYW5nZXMuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwdWJsaWMgX2lNYXRlcmlhbElkOm51bWJlciA9IDA7XG5cblx0cHVibGljIF9pQmFzZVNjcmVlblBhc3NJbmRleDpudW1iZXIgPSAwO1xuXG5cdHByaXZhdGUgX2JvdGhTaWRlczpib29sZWFuID0gZmFsc2U7IC8vIHVwZGF0ZVxuXHRwcml2YXRlIF9hbmltYXRpb25TZXQ6SUFuaW1hdGlvblNldDtcblx0cHVibGljIF9wU2NyZWVuUGFzc2VzSW52YWxpZDpib29sZWFuID0gdHJ1ZTtcblxuXHQvKipcblx0ICogQSBsaXN0IG9mIG1hdGVyaWFsIG93bmVycywgcmVuZGVyYWJsZXMgb3IgY3VzdG9tIEVudGl0aWVzLlxuXHQgKi9cblx0cHJpdmF0ZSBfb3duZXJzOkFycmF5PElNYXRlcmlhbE93bmVyPjtcblxuXHRwcml2YXRlIF9hbHBoYVByZW11bHRpcGxpZWQ6Ym9vbGVhbjtcblxuXHRwdWJsaWMgX3BCbGVuZE1vZGU6c3RyaW5nID0gQmxlbmRNb2RlLk5PUk1BTDtcblxuXHRwcml2YXRlIF9udW1QYXNzZXM6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfcGFzc2VzOkFycmF5PElNYXRlcmlhbFBhc3M+O1xuXG5cdHByaXZhdGUgX21pcG1hcDpib29sZWFuID0gZmFsc2U7XG5cdHByaXZhdGUgX3Ntb290aDpib29sZWFuID0gdHJ1ZTtcblx0cHJpdmF0ZSBfcmVwZWF0OmJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSBfY29sb3I6bnVtYmVyID0gMHhGRkZGRkY7XG5cdHB1YmxpYyBfcFRleHR1cmU6VGV4dHVyZTJEQmFzZTtcblxuXHRwdWJsaWMgX3BMaWdodFBpY2tlcjpMaWdodFBpY2tlckJhc2U7XG5cblx0cHVibGljIF9wSGVpZ2h0Om51bWJlciA9IDE7XG5cdHB1YmxpYyBfcFdpZHRoOm51bWJlciA9IDE7XG5cdHB1YmxpYyBfcFJlcXVpcmVzQmxlbmRpbmc6Ym9vbGVhbiA9IGZhbHNlO1xuXG5cdHByaXZhdGUgX29uUGFzc0NoYW5nZURlbGVnYXRlOihldmVudDpFdmVudCkgPT4gdm9pZDtcblx0cHJpdmF0ZSBfb25MaWdodENoYW5nZURlbGVnYXRlOihldmVudDpFdmVudCkgPT4gdm9pZDtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBNYXRlcmlhbEJhc2Ugb2JqZWN0LlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX2lNYXRlcmlhbElkID0gTnVtYmVyKHRoaXMuaWQpO1xuXG5cdFx0dGhpcy5fb3duZXJzID0gbmV3IEFycmF5PElNYXRlcmlhbE93bmVyPigpO1xuXHRcdHRoaXMuX3Bhc3NlcyA9IG5ldyBBcnJheTxJTWF0ZXJpYWxQYXNzPigpO1xuXG5cdFx0dGhpcy5fb25QYXNzQ2hhbmdlRGVsZWdhdGUgPSAoZXZlbnQ6RXZlbnQpID0+IHRoaXMub25QYXNzQ2hhbmdlKGV2ZW50KTtcblx0XHR0aGlzLl9vbkxpZ2h0Q2hhbmdlRGVsZWdhdGUgPSAoZXZlbnQ6RXZlbnQpID0+IHRoaXMub25MaWdodHNDaGFuZ2UoZXZlbnQpO1xuXG5cdFx0dGhpcy5hbHBoYVByZW11bHRpcGxpZWQgPSBmYWxzZTsgLy9UT0RPOiB3b3JrIG91dCB3aHkgdGhpcyBpcyBkaWZmZXJlbnQgZm9yIFdlYkdMXG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBnZXQgYXNzZXRUeXBlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRUeXBlLk1BVEVSSUFMO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGhlaWdodCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BIZWlnaHQ7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgYW5pbWF0aW9uU2V0KCk6SUFuaW1hdGlvblNldFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2FuaW1hdGlvblNldDtcblx0fVxuXG5cblx0LyoqXG5cdCAqIFRoZSBsaWdodCBwaWNrZXIgdXNlZCBieSB0aGUgbWF0ZXJpYWwgdG8gcHJvdmlkZSBsaWdodHMgdG8gdGhlIG1hdGVyaWFsIGlmIGl0IHN1cHBvcnRzIGxpZ2h0aW5nLlxuXHQgKlxuXHQgKiBAc2VlIExpZ2h0UGlja2VyQmFzZVxuXHQgKiBAc2VlIFN0YXRpY0xpZ2h0UGlja2VyXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGxpZ2h0UGlja2VyKCk6TGlnaHRQaWNrZXJCYXNlXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcExpZ2h0UGlja2VyO1xuXHR9XG5cblx0cHVibGljIHNldCBsaWdodFBpY2tlcih2YWx1ZTpMaWdodFBpY2tlckJhc2UpXG5cdHtcblx0XHRpZiAodGhpcy5fcExpZ2h0UGlja2VyID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKHRoaXMuX3BMaWdodFBpY2tlcilcblx0XHRcdHRoaXMuX3BMaWdodFBpY2tlci5yZW1vdmVFdmVudExpc3RlbmVyKEV2ZW50LkNIQU5HRSwgdGhpcy5fb25MaWdodENoYW5nZURlbGVnYXRlKTtcblxuXHRcdHRoaXMuX3BMaWdodFBpY2tlciA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuX3BMaWdodFBpY2tlcilcblx0XHRcdHRoaXMuX3BMaWdodFBpY2tlci5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNIQU5HRSwgdGhpcy5fb25MaWdodENoYW5nZURlbGVnYXRlKTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlU2NyZWVuUGFzc2VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGFueSB1c2VkIHRleHR1cmVzIHNob3VsZCB1c2UgbWlwbWFwcGluZy4gRGVmYXVsdHMgdG8gdHJ1ZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgbWlwbWFwKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21pcG1hcDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbWlwbWFwKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHRpZiAodGhpcy5fbWlwbWFwID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fbWlwbWFwID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZVBhc3NlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbnkgdXNlZCB0ZXh0dXJlcyBzaG91bGQgdXNlIHNtb290aGluZy5cblx0ICovXG5cdHB1YmxpYyBnZXQgc21vb3RoKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3Ntb290aDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc21vb3RoKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHRpZiAodGhpcy5fc21vb3RoID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fc21vb3RoID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZVBhc3NlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhbnkgdXNlZCB0ZXh0dXJlcyBzaG91bGQgYmUgdGlsZWQuIElmIHNldCB0byBmYWxzZSwgdGV4dHVyZSBzYW1wbGVzIGFyZSBjbGFtcGVkIHRvXG5cdCAqIHRoZSB0ZXh0dXJlJ3MgYm9yZGVycyB3aGVuIHRoZSB1diBjb29yZGluYXRlcyBhcmUgb3V0c2lkZSB0aGUgWzAsIDFdIGludGVydmFsLlxuXHQgKi9cblx0cHVibGljIGdldCByZXBlYXQoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcmVwZWF0O1xuXHR9XG5cblx0cHVibGljIHNldCByZXBlYXQodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9yZXBlYXQgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9yZXBlYXQgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlUGFzc2VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRpZmZ1c2UgcmVmbGVjdGl2aXR5IGNvbG9yIG9mIHRoZSBzdXJmYWNlLlxuXHQgKi9cblx0cHVibGljIGdldCBjb2xvcigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2NvbG9yO1xuXHR9XG5cblx0cHVibGljIHNldCBjb2xvcih2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5fY29sb3IgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9jb2xvciA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVQYXNzZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdGV4dHVyZSBvYmplY3QgdG8gdXNlIGZvciB0aGUgYWxiZWRvIGNvbG91ci5cblx0ICovXG5cdHB1YmxpYyBnZXQgdGV4dHVyZSgpOlRleHR1cmUyREJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wVGV4dHVyZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgdGV4dHVyZSh2YWx1ZTpUZXh0dXJlMkRCYXNlKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BUZXh0dXJlID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcFRleHR1cmUgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlUGFzc2VzKCk7XG5cblx0XHR0aGlzLl9wSGVpZ2h0ID0gdGhpcy5fcFRleHR1cmUuaGVpZ2h0O1xuXHRcdHRoaXMuX3BXaWR0aCA9IHRoaXMuX3BUZXh0dXJlLndpZHRoO1xuXG5cdFx0dGhpcy5fcE5vdGlmeVNpemVDaGFuZ2VkKCk7XG5cdH1cblxuXHQvKipcblx0ICogU3BlY2lmaWVzIHdoZXRoZXIgb3Igbm90IHRoZSBVViBjb29yZGluYXRlcyBzaG91bGQgYmUgYW5pbWF0ZWQgdXNpbmcgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGFuaW1hdGVVVnMoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcEFuaW1hdGVVVnM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGFuaW1hdGVVVnModmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9wQW5pbWF0ZVVWcyA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3BBbmltYXRlVVZzID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZVBhc3NlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFdoZXRoZXIgb3Igbm90IHRvIHVzZSBmYWxsT2ZmIGFuZCByYWRpdXMgcHJvcGVydGllcyBmb3IgbGlnaHRzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgYW5kXG5cdCAqIGNvbXBhdGliaWxpdHkgZm9yIGNvbnN0cmFpbmVkIG1vZGUuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGVuYWJsZUxpZ2h0RmFsbE9mZigpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9lbmFibGVMaWdodEZhbGxPZmY7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGVuYWJsZUxpZ2h0RmFsbE9mZih2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2VuYWJsZUxpZ2h0RmFsbE9mZiA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2VuYWJsZUxpZ2h0RmFsbE9mZiA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVQYXNzZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmUgd2hpY2ggbGlnaHQgc291cmNlIHR5cGVzIHRvIHVzZSBmb3IgZGlmZnVzZSByZWZsZWN0aW9ucy4gVGhpcyBhbGxvd3MgY2hvb3NpbmcgYmV0d2VlbiByZWd1bGFyIGxpZ2h0c1xuXHQgKiBhbmQvb3IgbGlnaHQgcHJvYmVzIGZvciBkaWZmdXNlIHJlZmxlY3Rpb25zLlxuXHQgKlxuXHQgKiBAc2VlIGF3YXkzZC5tYXRlcmlhbHMuTGlnaHRTb3VyY2VzXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGRpZmZ1c2VMaWdodFNvdXJjZXMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kaWZmdXNlTGlnaHRTb3VyY2VzO1xuXHR9XG5cblx0cHVibGljIHNldCBkaWZmdXNlTGlnaHRTb3VyY2VzKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9kaWZmdXNlTGlnaHRTb3VyY2VzID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fZGlmZnVzZUxpZ2h0U291cmNlcyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVQYXNzZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmUgd2hpY2ggbGlnaHQgc291cmNlIHR5cGVzIHRvIHVzZSBmb3Igc3BlY3VsYXIgcmVmbGVjdGlvbnMuIFRoaXMgYWxsb3dzIGNob29zaW5nIGJldHdlZW4gcmVndWxhciBsaWdodHNcblx0ICogYW5kL29yIGxpZ2h0IHByb2JlcyBmb3Igc3BlY3VsYXIgcmVmbGVjdGlvbnMuXG5cdCAqXG5cdCAqIEBzZWUgYXdheTNkLm1hdGVyaWFscy5MaWdodFNvdXJjZXNcblx0ICovXG5cdHB1YmxpYyBnZXQgc3BlY3VsYXJMaWdodFNvdXJjZXMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zcGVjdWxhckxpZ2h0U291cmNlcztcblx0fVxuXG5cdHB1YmxpYyBzZXQgc3BlY3VsYXJMaWdodFNvdXJjZXModmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3NwZWN1bGFyTGlnaHRTb3VyY2VzID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fc3BlY3VsYXJMaWdodFNvdXJjZXMgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlUGFzc2VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2xlYW5zIHVwIHJlc291cmNlcyBvd25lZCBieSB0aGUgbWF0ZXJpYWwsIGluY2x1ZGluZyBwYXNzZXMuIFRleHR1cmVzIGFyZSBub3Qgb3duZWQgYnkgdGhlIG1hdGVyaWFsIHNpbmNlIHRoZXlcblx0ICogY291bGQgYmUgdXNlZCBieSBvdGhlciBtYXRlcmlhbHMgYW5kIHdpbGwgbm90IGJlIGRpc3Bvc2VkLlxuXHQgKi9cblx0cHVibGljIGRpc3Bvc2UoKVxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyO1xuXHRcdHZhciBsZW46bnVtYmVyO1xuXG5cdFx0dGhpcy5fcENsZWFyU2NyZWVuUGFzc2VzKCk7XG5cblx0XHRsZW4gPSB0aGlzLl9tYXRlcmlhbERhdGEubGVuZ3RoO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcblx0XHRcdHRoaXMuX21hdGVyaWFsRGF0YVtpXS5kaXNwb3NlKCk7XG5cblx0XHR0aGlzLl9tYXRlcmlhbERhdGEgPSBuZXcgQXJyYXk8SU1hdGVyaWFsRGF0YT4oKTtcblxuXHRcdGxlbiA9IHRoaXMuX21hdGVyaWFsUGFzc0RhdGEubGVuZ3RoO1xuXHRcdGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcblx0XHRcdHRoaXMuX21hdGVyaWFsUGFzc0RhdGFbaV0uZGlzcG9zZSgpO1xuXG5cdFx0dGhpcy5fbWF0ZXJpYWxQYXNzRGF0YSA9IG5ldyBBcnJheTxJTWF0ZXJpYWxQYXNzRGF0YT4oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRlcmlhbCBzaG91bGQgY3VsbCB0cmlhbmdsZXMgZmFjaW5nIGF3YXkgZnJvbSB0aGUgY2FtZXJhLlxuXHQgKi9cblx0cHVibGljIGdldCBib3RoU2lkZXMoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYm90aFNpZGVzO1xuXHR9XG5cblx0cHVibGljIHNldCBib3RoU2lkZXModmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9ib3RoU2lkZXMgPSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2JvdGhTaWRlcyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVQYXNzZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgYmxlbmQgbW9kZSB0byB1c2Ugd2hlbiBkcmF3aW5nIHRoaXMgcmVuZGVyYWJsZS4gVGhlIGZvbGxvd2luZyBibGVuZCBtb2RlcyBhcmUgc3VwcG9ydGVkOlxuXHQgKiA8dWw+XG5cdCAqIDxsaT5CbGVuZE1vZGUuTk9STUFMOiBObyBibGVuZGluZywgdW5sZXNzIHRoZSBtYXRlcmlhbCBpbmhlcmVudGx5IG5lZWRzIGl0PC9saT5cblx0ICogPGxpPkJsZW5kTW9kZS5MQVlFUjogRm9yY2UgYmxlbmRpbmcuIFRoaXMgd2lsbCBkcmF3IHRoZSBvYmplY3QgdGhlIHNhbWUgYXMgTk9STUFMLCBidXQgd2l0aG91dCB3cml0aW5nIGRlcHRoIHdyaXRlcy48L2xpPlxuXHQgKiA8bGk+QmxlbmRNb2RlLk1VTFRJUExZPC9saT5cblx0ICogPGxpPkJsZW5kTW9kZS5BREQ8L2xpPlxuXHQgKiA8bGk+QmxlbmRNb2RlLkFMUEhBPC9saT5cblx0ICogPC91bD5cblx0ICovXG5cdHB1YmxpYyBnZXQgYmxlbmRNb2RlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcEJsZW5kTW9kZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgYmxlbmRNb2RlKHZhbHVlOnN0cmluZylcblx0e1xuXHRcdGlmICh0aGlzLl9wQmxlbmRNb2RlID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcEJsZW5kTW9kZSA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVQYXNzZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciB2aXNpYmxlIHRleHR1cmVzIChvciBvdGhlciBwaXhlbHMpIHVzZWQgYnkgdGhpcyBtYXRlcmlhbCBoYXZlXG5cdCAqIGFscmVhZHkgYmVlbiBwcmVtdWx0aXBsaWVkLiBUb2dnbGUgdGhpcyBpZiB5b3UgYXJlIHNlZWluZyBibGFjayBoYWxvcyBhcm91bmQgeW91clxuXHQgKiBibGVuZGVkIGFscGhhIGVkZ2VzLlxuXHQgKi9cblx0cHVibGljIGdldCBhbHBoYVByZW11bHRpcGxpZWQoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYWxwaGFQcmVtdWx0aXBsaWVkO1xuXHR9XG5cblx0cHVibGljIHNldCBhbHBoYVByZW11bHRpcGxpZWQodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9hbHBoYVByZW11bHRpcGxpZWQgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9hbHBoYVByZW11bHRpcGxpZWQgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlUGFzc2VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1pbmltdW0gYWxwaGEgdmFsdWUgZm9yIHdoaWNoIHBpeGVscyBzaG91bGQgYmUgZHJhd24uIFRoaXMgaXMgdXNlZCBmb3IgdHJhbnNwYXJlbmN5IHRoYXQgaXMgZWl0aGVyXG5cdCAqIGludmlzaWJsZSBvciBlbnRpcmVseSBvcGFxdWUsIG9mdGVuIHVzZWQgd2l0aCB0ZXh0dXJlcyBmb3IgZm9saWFnZSwgZXRjLlxuXHQgKiBSZWNvbW1lbmRlZCB2YWx1ZXMgYXJlIDAgdG8gZGlzYWJsZSBhbHBoYSwgb3IgMC41IHRvIGNyZWF0ZSBzbW9vdGggZWRnZXMuIERlZmF1bHQgdmFsdWUgaXMgMCAoZGlzYWJsZWQpLlxuXHQgKi9cblx0cHVibGljIGdldCBhbHBoYVRocmVzaG9sZCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BBbHBoYVRocmVzaG9sZDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgYWxwaGFUaHJlc2hvbGQodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHZhbHVlIDwgMClcblx0XHRcdHZhbHVlID0gMDtcblx0XHRlbHNlIGlmICh2YWx1ZSA+IDEpXG5cdFx0XHR2YWx1ZSA9IDE7XG5cblx0XHRpZiAodGhpcy5fcEFscGhhVGhyZXNob2xkID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcEFscGhhVGhyZXNob2xkID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZVBhc3NlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0ZXJpYWwgcmVxdWlyZXMgYWxwaGEgYmxlbmRpbmcgZHVyaW5nIHJlbmRlcmluZy5cblx0ICovXG5cdHB1YmxpYyBnZXQgcmVxdWlyZXNCbGVuZGluZygpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wUmVxdWlyZXNCbGVuZGluZztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCB3aWR0aCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BXaWR0aDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSByZW5kZXIgc3RhdGUgZm9yIGEgcGFzcyB0aGF0IGlzIGluZGVwZW5kZW50IG9mIHRoZSByZW5kZXJlZCBvYmplY3QuIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZVxuXHQgKiBjYWxsaW5nIHJlbmRlclBhc3MuIEJlZm9yZSBhY3RpdmF0aW5nIGEgcGFzcywgdGhlIHByZXZpb3VzbHkgdXNlZCBwYXNzIG5lZWRzIHRvIGJlIGRlYWN0aXZhdGVkLlxuXHQgKiBAcGFyYW0gcGFzcyBUaGUgcGFzcyBkYXRhIHRvIGFjdGl2YXRlLlxuXHQgKiBAcGFyYW0gc3RhZ2UgVGhlIFN0YWdlIG9iamVjdCB3aGljaCBpcyBjdXJyZW50bHkgdXNlZCBmb3IgcmVuZGVyaW5nLlxuXHQgKiBAcGFyYW0gY2FtZXJhIFRoZSBjYW1lcmEgZnJvbSB3aGljaCB0aGUgc2NlbmUgaXMgdmlld2VkLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHVibGljIF9pQWN0aXZhdGVQYXNzKHBhc3M6SU1hdGVyaWFsUGFzc0RhdGEsIHN0YWdlOklTdGFnZSwgY2FtZXJhOkNhbWVyYSkgLy8gQVJDQU5FXG5cdHtcblx0XHRwYXNzLm1hdGVyaWFsUGFzcy5faUFjdGl2YXRlKHBhc3MsIHN0YWdlLCBjYW1lcmEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENsZWFycyB0aGUgcmVuZGVyIHN0YXRlIGZvciBhIHBhc3MuIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGJlZm9yZSBhY3RpdmF0aW5nIGFub3RoZXIgcGFzcy5cblx0ICogQHBhcmFtIHBhc3MgVGhlIHBhc3MgdG8gZGVhY3RpdmF0ZS5cblx0ICogQHBhcmFtIHN0YWdlIFRoZSBTdGFnZSB1c2VkIGZvciByZW5kZXJpbmdcblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX2lEZWFjdGl2YXRlUGFzcyhwYXNzOklNYXRlcmlhbFBhc3NEYXRhLCBzdGFnZTpJU3RhZ2UpIC8vIEFSQ0FORVxuXHR7XG5cdFx0cGFzcy5tYXRlcmlhbFBhc3MuX2lEZWFjdGl2YXRlKHBhc3MsIHN0YWdlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW5kZXJzIHRoZSBjdXJyZW50IHBhc3MuIEJlZm9yZSBjYWxsaW5nIHJlbmRlclBhc3MsIGFjdGl2YXRlUGFzcyBuZWVkcyB0byBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBpbmRleC5cblx0ICogQHBhcmFtIHBhc3MgVGhlIHBhc3MgdXNlZCB0byByZW5kZXIgdGhlIHJlbmRlcmFibGUuXG5cdCAqIEBwYXJhbSByZW5kZXJhYmxlIFRoZSBJUmVuZGVyYWJsZSBvYmplY3QgdG8gZHJhdy5cblx0ICogQHBhcmFtIHN0YWdlIFRoZSBTdGFnZSBvYmplY3QgdXNlZCBmb3IgcmVuZGVyaW5nLlxuXHQgKiBAcGFyYW0gZW50aXR5Q29sbGVjdG9yIFRoZSBFbnRpdHlDb2xsZWN0b3Igb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHZpc2libGUgc2NlbmUgZGF0YS5cblx0ICogQHBhcmFtIHZpZXdQcm9qZWN0aW9uIFRoZSB2aWV3LXByb2plY3Rpb24gbWF0cml4IHVzZWQgdG8gcHJvamVjdCB0byB0aGUgc2NyZWVuLiBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhc1xuXHQgKiBjYW1lcmEudmlld1Byb2plY3Rpb24gYXMgaXQgaW5jbHVkZXMgdGhlIHNjYWxpbmcgZmFjdG9ycyB3aGVuIHJlbmRlcmluZyB0byB0ZXh0dXJlcy5cblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgX2lSZW5kZXJQYXNzKHBhc3M6SU1hdGVyaWFsUGFzc0RhdGEsIHJlbmRlcmFibGU6SVJlbmRlcmFibGUsIHN0YWdlOklTdGFnZSwgY2FtZXJhOkNhbWVyYSwgdmlld1Byb2plY3Rpb246TWF0cml4M0QpXG5cdHtcblx0XHRpZiAodGhpcy5fcExpZ2h0UGlja2VyKVxuXHRcdFx0dGhpcy5fcExpZ2h0UGlja2VyLmNvbGxlY3RMaWdodHMocmVuZGVyYWJsZSk7XG5cblx0XHRwYXNzLm1hdGVyaWFsUGFzcy5faVJlbmRlcihwYXNzLCByZW5kZXJhYmxlLCBzdGFnZSwgY2FtZXJhLCB2aWV3UHJvamVjdGlvbik7XG5cdH1cblxuXHQvL1xuXHQvLyBNQVRFUklBTCBNQU5BR0VNRU5UXG5cdC8vXG5cdC8qKlxuXHQgKiBNYXJrIGFuIElNYXRlcmlhbE93bmVyIGFzIG93bmVyIG9mIHRoaXMgbWF0ZXJpYWwuXG5cdCAqIEFzc3VyZXMgd2UncmUgbm90IHVzaW5nIHRoZSBzYW1lIG1hdGVyaWFsIGFjcm9zcyByZW5kZXJhYmxlcyB3aXRoIGRpZmZlcmVudCBhbmltYXRpb25zLCBzaW5jZSB0aGVcblx0ICogUHJvZ3JhbXMgZGVwZW5kIG9uIGFuaW1hdGlvbi4gVGhpcyBtZXRob2QgbmVlZHMgdG8gYmUgY2FsbGVkIHdoZW4gYSBtYXRlcmlhbCBpcyBhc3NpZ25lZC5cblx0ICpcblx0ICogQHBhcmFtIG93bmVyIFRoZSBJTWF0ZXJpYWxPd25lciB0aGF0IGhhZCB0aGlzIG1hdGVyaWFsIGFzc2lnbmVkXG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGlBZGRPd25lcihvd25lcjpJTWF0ZXJpYWxPd25lcilcblx0e1xuXHRcdHRoaXMuX293bmVycy5wdXNoKG93bmVyKTtcblxuXHRcdHZhciBhbmltYXRpb25TZXQ6SUFuaW1hdGlvblNldDtcblx0XHR2YXIgYW5pbWF0b3I6SUFuaW1hdG9yID0gPElBbmltYXRvcj4gb3duZXIuYW5pbWF0b3I7XG5cblx0XHRpZiAoYW5pbWF0b3IpXG5cdFx0XHRhbmltYXRpb25TZXQgPSA8SUFuaW1hdGlvblNldD4gYW5pbWF0b3IuYW5pbWF0aW9uU2V0O1xuXG5cdFx0aWYgKG93bmVyLmFuaW1hdG9yKSB7XG5cdFx0XHRpZiAodGhpcy5fYW5pbWF0aW9uU2V0ICYmIGFuaW1hdGlvblNldCAhPSB0aGlzLl9hbmltYXRpb25TZXQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQSBNYXRlcmlhbCBpbnN0YW5jZSBjYW5ub3QgYmUgc2hhcmVkIGFjcm9zcyBtYXRlcmlhbCBvd25lcnMgd2l0aCBkaWZmZXJlbnQgYW5pbWF0aW9uIHNldHNcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpZiAodGhpcy5fYW5pbWF0aW9uU2V0ICE9IGFuaW1hdGlvblNldCkge1xuXG5cdFx0XHRcdFx0dGhpcy5fYW5pbWF0aW9uU2V0ID0gYW5pbWF0aW9uU2V0O1xuXG5cdFx0XHRcdFx0dGhpcy5pbnZhbGlkYXRlQW5pbWF0aW9uKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhbiBJTWF0ZXJpYWxPd25lciBhcyBvd25lci5cblx0ICogQHBhcmFtIG93bmVyXG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGlSZW1vdmVPd25lcihvd25lcjpJTWF0ZXJpYWxPd25lcilcblx0e1xuXHRcdHRoaXMuX293bmVycy5zcGxpY2UodGhpcy5fb3duZXJzLmluZGV4T2Yob3duZXIpLCAxKTtcblxuXHRcdGlmICh0aGlzLl9vd25lcnMubGVuZ3RoID09IDApIHtcblx0XHRcdHRoaXMuX2FuaW1hdGlvblNldCA9IG51bGw7XG5cblx0XHRcdHRoaXMuaW52YWxpZGF0ZUFuaW1hdGlvbigpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBBIGxpc3Qgb2YgdGhlIElNYXRlcmlhbE93bmVycyB0aGF0IHVzZSB0aGlzIG1hdGVyaWFsXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGlPd25lcnMoKTpBcnJheTxJTWF0ZXJpYWxPd25lcj5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9vd25lcnM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGFtb3VudCBvZiBwYXNzZXMgdXNlZCBieSB0aGUgbWF0ZXJpYWwuXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwdWJsaWMgX2lOdW1TY3JlZW5QYXNzZXMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9udW1QYXNzZXM7XG5cdH1cblxuXHQvKipcblx0ICogQSBsaXN0IG9mIHRoZSBzY3JlZW4gcGFzc2VzIHVzZWQgaW4gdGhpcyBtYXRlcmlhbFxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHVibGljIGdldCBfaVNjcmVlblBhc3NlcygpOkFycmF5PElNYXRlcmlhbFBhc3M+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcGFzc2VzO1xuXHR9XG5cblx0LyoqXG5cdCAqIE1hcmtzIHRoZSBzaGFkZXIgcHJvZ3JhbXMgZm9yIGFsbCBwYXNzZXMgYXMgaW52YWxpZCwgc28gdGhleSB3aWxsIGJlIHJlY29tcGlsZWQgYmVmb3JlIHRoZSBuZXh0IHVzZS5cblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHB1YmxpYyBfcEludmFsaWRhdGVQYXNzZXMoKVxuXHR7XG5cdFx0dmFyIGxlbjpudW1iZXIgPSB0aGlzLl9tYXRlcmlhbFBhc3NEYXRhLmxlbmd0aDtcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCBsZW47IGkrKylcblx0XHRcdHRoaXMuX21hdGVyaWFsUGFzc0RhdGFbaV0uaW52YWxpZGF0ZSgpO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlTWF0ZXJpYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGbGFncyB0aGF0IHRoZSBzY3JlZW4gcGFzc2VzIGhhdmUgYmVjb21lIGludmFsaWQgYW5kIG5lZWQgcG9zc2libGUgcmUtb3JkZXJpbmcgLyBhZGRpbmcgLyBkZWxldGluZ1xuXHQgKi9cblx0cHVibGljIF9wSW52YWxpZGF0ZVNjcmVlblBhc3NlcygpXG5cdHtcblx0XHR0aGlzLl9wU2NyZWVuUGFzc2VzSW52YWxpZCA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHBhc3MgZnJvbSB0aGUgbWF0ZXJpYWwuXG5cdCAqIEBwYXJhbSBwYXNzIFRoZSBwYXNzIHRvIGJlIHJlbW92ZWQuXG5cdCAqL1xuXHRwdWJsaWMgX3BSZW1vdmVTY3JlZW5QYXNzKHBhc3M6SU1hdGVyaWFsUGFzcylcblx0e1xuXHRcdHBhc3MucmVtb3ZlRXZlbnRMaXN0ZW5lcihFdmVudC5DSEFOR0UsIHRoaXMuX29uUGFzc0NoYW5nZURlbGVnYXRlKTtcblx0XHR0aGlzLl9wYXNzZXMuc3BsaWNlKHRoaXMuX3Bhc3Nlcy5pbmRleE9mKHBhc3MpLCAxKTtcblxuXHRcdHRoaXMuX251bVBhc3Nlcy0tO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYWxsIHBhc3NlcyBmcm9tIHRoZSBtYXRlcmlhbFxuXHQgKi9cblx0cHVibGljIF9wQ2xlYXJTY3JlZW5QYXNzZXMoKVxuXHR7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgdGhpcy5fbnVtUGFzc2VzOyArK2kpXG5cdFx0XHR0aGlzLl9wYXNzZXNbaV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFdmVudC5DSEFOR0UsIHRoaXMuX29uUGFzc0NoYW5nZURlbGVnYXRlKTtcblxuXHRcdHRoaXMuX3Bhc3Nlcy5sZW5ndGggPSB0aGlzLl9udW1QYXNzZXMgPSAwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBwYXNzIHRvIHRoZSBtYXRlcmlhbFxuXHQgKiBAcGFyYW0gcGFzc1xuXHQgKi9cblx0cHVibGljIF9wQWRkU2NyZWVuUGFzcyhwYXNzOklNYXRlcmlhbFBhc3MpXG5cdHtcblx0XHR0aGlzLl9wYXNzZXNbdGhpcy5fbnVtUGFzc2VzKytdID0gcGFzcztcblxuXHRcdHBhc3MubGlnaHRQaWNrZXIgPSB0aGlzLl9wTGlnaHRQaWNrZXI7XG5cdFx0cGFzcy5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNIQU5HRSwgdGhpcy5fb25QYXNzQ2hhbmdlRGVsZWdhdGUpO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlTWF0ZXJpYWwoKTtcblx0fVxuXG5cdHB1YmxpYyBfaUFkZE1hdGVyaWFsRGF0YShtYXRlcmlhbERhdGE6SU1hdGVyaWFsRGF0YSk6SU1hdGVyaWFsRGF0YVxuXHR7XG5cdFx0dGhpcy5fbWF0ZXJpYWxEYXRhLnB1c2gobWF0ZXJpYWxEYXRhKTtcblxuXHRcdHJldHVybiBtYXRlcmlhbERhdGE7XG5cdH1cblxuXHRwdWJsaWMgX2lSZW1vdmVNYXRlcmlhbERhdGEobWF0ZXJpYWxEYXRhOklNYXRlcmlhbERhdGEpOklNYXRlcmlhbERhdGFcblx0e1xuXHRcdHRoaXMuX21hdGVyaWFsRGF0YS5zcGxpY2UodGhpcy5fbWF0ZXJpYWxEYXRhLmluZGV4T2YobWF0ZXJpYWxEYXRhKSwgMSk7XG5cblx0XHRyZXR1cm4gbWF0ZXJpYWxEYXRhO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBlcmZvcm1zIGFueSBwcm9jZXNzaW5nIHRoYXQgbmVlZHMgdG8gb2NjdXIgYmVmb3JlIGFueSBvZiBpdHMgcGFzc2VzIGFyZSB1c2VkLlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHVibGljIF9pVXBkYXRlTWF0ZXJpYWwoKVxuXHR7XG5cdH1cblx0XG5cdC8qKlxuXHQgKiBMaXN0ZW5lciBmb3Igd2hlbiBhIHBhc3MncyBzaGFkZXIgY29kZSBjaGFuZ2VzLiBJdCByZWNhbGN1bGF0ZXMgdGhlIHJlbmRlciBvcmRlciBpZC5cblx0ICovXG5cdHByaXZhdGUgb25QYXNzQ2hhbmdlKGV2ZW50OkV2ZW50KVxuXHR7XG5cdFx0dGhpcy5pbnZhbGlkYXRlTWF0ZXJpYWwoKTtcblx0fVxuXG5cdHByaXZhdGUgaW52YWxpZGF0ZUFuaW1hdGlvbigpXG5cdHtcblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX21hdGVyaWFsRGF0YS5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspXG5cdFx0XHR0aGlzLl9tYXRlcmlhbERhdGFbaV0uaW52YWxpZGF0ZUFuaW1hdGlvbigpO1xuXHR9XG5cdFxuXHRwcml2YXRlIGludmFsaWRhdGVNYXRlcmlhbCgpXG5cdHtcblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX21hdGVyaWFsRGF0YS5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspXG5cdFx0XHR0aGlzLl9tYXRlcmlhbERhdGFbaV0uaW52YWxpZGF0ZU1hdGVyaWFsKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIGxpZ2h0IHBpY2tlcidzIGNvbmZpZ3VyYXRpb24gY2hhbmdlZC5cblx0ICovXG5cdHByaXZhdGUgb25MaWdodHNDaGFuZ2UoZXZlbnQ6RXZlbnQpXG5cdHtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZVNjcmVlblBhc3NlcygpO1xuXHR9XG5cblx0cHVibGljIF9wTm90aWZ5U2l6ZUNoYW5nZWQoKVxuXHR7XG5cdFx0aWYgKCF0aGlzLl9zaXplQ2hhbmdlZClcblx0XHRcdHRoaXMuX3NpemVDaGFuZ2VkID0gbmV3IE1hdGVyaWFsRXZlbnQoTWF0ZXJpYWxFdmVudC5TSVpFX0NIQU5HRUQpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KHRoaXMuX3NpemVDaGFuZ2VkKTtcblx0fVxuXG5cdHB1YmxpYyBfaUFkZE1hdGVyaWFsUGFzc0RhdGEobWF0ZXJpYWxQYXNzRGF0YTpJTWF0ZXJpYWxQYXNzRGF0YSk6SU1hdGVyaWFsUGFzc0RhdGFcblx0e1xuXHRcdHRoaXMuX21hdGVyaWFsUGFzc0RhdGEucHVzaChtYXRlcmlhbFBhc3NEYXRhKTtcblxuXHRcdHJldHVybiBtYXRlcmlhbFBhc3NEYXRhO1xuXHR9XG5cblx0cHVibGljIF9pUmVtb3ZlTWF0ZXJpYWxQYXNzRGF0YShtYXRlcmlhbFBhc3NEYXRhOklNYXRlcmlhbFBhc3NEYXRhKTpJTWF0ZXJpYWxQYXNzRGF0YVxuXHR7XG5cdFx0dGhpcy5fbWF0ZXJpYWxQYXNzRGF0YS5zcGxpY2UodGhpcy5fbWF0ZXJpYWxQYXNzRGF0YS5pbmRleE9mKG1hdGVyaWFsUGFzc0RhdGEpLCAxKTtcblxuXHRcdHJldHVybiBtYXRlcmlhbFBhc3NEYXRhO1xuXHR9XG59XG5cbmV4cG9ydCA9IE1hdGVyaWFsQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/materials/MaterialBase.ts b/lib/materials/MaterialBase.ts new file mode 100644 index 00000000..15d1f3ff --- /dev/null +++ b/lib/materials/MaterialBase.ts @@ -0,0 +1,734 @@ +import IAnimationSet = require("awayjs-core/lib/animators/IAnimationSet"); +import IAnimator = require("awayjs-core/lib/animators/IAnimator"); +import BlendMode = require("awayjs-core/lib/core/base/BlendMode"); +import IMaterialOwner = require("awayjs-core/lib/core/base/IMaterialOwner"); +import IStage = require("awayjs-core/lib/core/base/IStage"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import IMaterialData = require("awayjs-core/lib/core/pool/IMaterialData"); +import IMaterialPassData = require("awayjs-core/lib/core/pool/IMaterialPassData"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import Event = require("awayjs-core/lib/events/Event"); +import MaterialEvent = require("awayjs-core/lib/events/MaterialEvent"); +import LightPickerBase = require("awayjs-core/lib/materials/lightpickers/LightPickerBase"); +import IMaterialPass = require("awayjs-core/lib/materials/passes/IMaterialPass"); +import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); + + +/** + * MaterialBase forms an abstract base class for any material. + * A material consists of several passes, each of which constitutes at least one render call. Several passes could + * be used for special effects (render lighting for many lights in several passes, render an outline in a separate + * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space + * subsurface scattering, or rendering a depth map for specialized self-shadowing). + * + * Away3D provides default materials trough SinglePassMaterialBase and TriangleMaterial, which use modular + * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom + * shaders, or entire new material frameworks. + */ +class MaterialBase extends NamedAssetBase implements IAsset +{ + private _sizeChanged:MaterialEvent; + private _materialPassData:Array = new Array(); + private _materialData:Array = new Array(); + + public _pAlphaThreshold:number = 0; + public _pAnimateUVs:boolean = false; + private _enableLightFallOff:boolean = true; + private _specularLightSources:number = 0x01; + private _diffuseLightSources:number = 0x03; + + /** + * An object to contain any extra data. + */ + public extra:Object; + + /** + * A value that can be used by materials that only work with a given type of renderer. The renderer can test the + * classification to choose which render path to use. For example, a deferred material could set this value so + * that the deferred renderer knows not to take the forward rendering path. + * + * @private + */ + public _iClassification:string; + + + /** + * An id for this material used to sort the renderables by shader program, which reduces Program state changes. + * + * @private + */ + public _iMaterialId:number = 0; + + public _iBaseScreenPassIndex:number = 0; + + private _bothSides:boolean = false; // update + private _animationSet:IAnimationSet; + public _pScreenPassesInvalid:boolean = true; + + /** + * A list of material owners, renderables or custom Entities. + */ + private _owners:Array; + + private _alphaPremultiplied:boolean; + + public _pBlendMode:string = BlendMode.NORMAL; + + private _numPasses:number = 0; + private _passes:Array; + + private _mipmap:boolean = false; + private _smooth:boolean = true; + private _repeat:boolean = false; + private _color:number = 0xFFFFFF; + public _pTexture:Texture2DBase; + + public _pLightPicker:LightPickerBase; + + public _pHeight:number = 1; + public _pWidth:number = 1; + public _pRequiresBlending:boolean = false; + + private _onPassChangeDelegate:(event:Event) => void; + private _onLightChangeDelegate:(event:Event) => void; + + /** + * Creates a new MaterialBase object. + */ + constructor() + { + super(); + + this._iMaterialId = Number(this.id); + + this._owners = new Array(); + this._passes = new Array(); + + this._onPassChangeDelegate = (event:Event) => this.onPassChange(event); + this._onLightChangeDelegate = (event:Event) => this.onLightsChange(event); + + this.alphaPremultiplied = false; //TODO: work out why this is different for WebGL + } + + /** + * @inheritDoc + */ + public get assetType():string + { + return AssetType.MATERIAL; + } + + /** + * + */ + public get height():number + { + return this._pHeight; + } + + /** + * + */ + public get animationSet():IAnimationSet + { + return this._animationSet; + } + + + /** + * The light picker used by the material to provide lights to the material if it supports lighting. + * + * @see LightPickerBase + * @see StaticLightPicker + */ + public get lightPicker():LightPickerBase + { + return this._pLightPicker; + } + + public set lightPicker(value:LightPickerBase) + { + if (this._pLightPicker == value) + return; + + if (this._pLightPicker) + this._pLightPicker.removeEventListener(Event.CHANGE, this._onLightChangeDelegate); + + this._pLightPicker = value; + + if (this._pLightPicker) + this._pLightPicker.addEventListener(Event.CHANGE, this._onLightChangeDelegate); + + this._pInvalidateScreenPasses(); + } + + /** + * Indicates whether or not any used textures should use mipmapping. Defaults to true. + */ + public get mipmap():boolean + { + return this._mipmap; + } + + public set mipmap(value:boolean) + { + if (this._mipmap == value) + return; + + this._mipmap = value; + + this._pInvalidatePasses(); + } + + /** + * Indicates whether or not any used textures should use smoothing. + */ + public get smooth():boolean + { + return this._smooth; + } + + public set smooth(value:boolean) + { + if (this._smooth == value) + return; + + this._smooth = value; + + this._pInvalidatePasses(); + } + + /** + * Indicates whether or not any used textures should be tiled. If set to false, texture samples are clamped to + * the texture's borders when the uv coordinates are outside the [0, 1] interval. + */ + public get repeat():boolean + { + return this._repeat; + } + + public set repeat(value:boolean) + { + if (this._repeat == value) + return; + + this._repeat = value; + + this._pInvalidatePasses(); + } + + /** + * The diffuse reflectivity color of the surface. + */ + public get color():number + { + return this._color; + } + + public set color(value:number) + { + if (this._color == value) + return; + + this._color = value; + + this._pInvalidatePasses(); + } + + /** + * The texture object to use for the albedo colour. + */ + public get texture():Texture2DBase + { + return this._pTexture; + } + + public set texture(value:Texture2DBase) + { + if (this._pTexture == value) + return; + + this._pTexture = value; + + this._pInvalidatePasses(); + + this._pHeight = this._pTexture.height; + this._pWidth = this._pTexture.width; + + this._pNotifySizeChanged(); + } + + /** + * Specifies whether or not the UV coordinates should be animated using a transformation matrix. + */ + public get animateUVs():boolean + { + return this._pAnimateUVs; + } + + public set animateUVs(value:boolean) + { + if (this._pAnimateUVs == value) + return; + + this._pAnimateUVs = value; + + this._pInvalidatePasses(); + } + + /** + * Whether or not to use fallOff and radius properties for lights. This can be used to improve performance and + * compatibility for constrained mode. + */ + public get enableLightFallOff():boolean + { + return this._enableLightFallOff; + } + + public set enableLightFallOff(value:boolean) + { + if (this._enableLightFallOff == value) + return; + + this._enableLightFallOff = value; + + this._pInvalidatePasses(); + } + + /** + * Define which light source types to use for diffuse reflections. This allows choosing between regular lights + * and/or light probes for diffuse reflections. + * + * @see away3d.materials.LightSources + */ + public get diffuseLightSources():number + { + return this._diffuseLightSources; + } + + public set diffuseLightSources(value:number) + { + if (this._diffuseLightSources == value) + return; + + this._diffuseLightSources = value; + + this._pInvalidatePasses(); + } + + /** + * Define which light source types to use for specular reflections. This allows choosing between regular lights + * and/or light probes for specular reflections. + * + * @see away3d.materials.LightSources + */ + public get specularLightSources():number + { + return this._specularLightSources; + } + + public set specularLightSources(value:number) + { + if (this._specularLightSources == value) + return; + + this._specularLightSources = value; + + this._pInvalidatePasses(); + } + + /** + * Cleans up resources owned by the material, including passes. Textures are not owned by the material since they + * could be used by other materials and will not be disposed. + */ + public dispose() + { + var i:number; + var len:number; + + this._pClearScreenPasses(); + + len = this._materialData.length; + for (i = 0; i < len; i++) + this._materialData[i].dispose(); + + this._materialData = new Array(); + + len = this._materialPassData.length; + for (i = 0; i < len; i++) + this._materialPassData[i].dispose(); + + this._materialPassData = new Array(); + } + + /** + * Defines whether or not the material should cull triangles facing away from the camera. + */ + public get bothSides():boolean + { + return this._bothSides; + } + + public set bothSides(value:boolean) + { + if (this._bothSides = value) + return; + + this._bothSides = value; + + this._pInvalidatePasses(); + } + + /** + * The blend mode to use when drawing this renderable. The following blend modes are supported: + *
    + *
  • BlendMode.NORMAL: No blending, unless the material inherently needs it
  • + *
  • BlendMode.LAYER: Force blending. This will draw the object the same as NORMAL, but without writing depth writes.
  • + *
  • BlendMode.MULTIPLY
  • + *
  • BlendMode.ADD
  • + *
  • BlendMode.ALPHA
  • + *
+ */ + public get blendMode():string + { + return this._pBlendMode; + } + + public set blendMode(value:string) + { + if (this._pBlendMode == value) + return; + + this._pBlendMode = value; + + this._pInvalidatePasses(); + } + + /** + * Indicates whether visible textures (or other pixels) used by this material have + * already been premultiplied. Toggle this if you are seeing black halos around your + * blended alpha edges. + */ + public get alphaPremultiplied():boolean + { + return this._alphaPremultiplied; + } + + public set alphaPremultiplied(value:boolean) + { + if (this._alphaPremultiplied == value) + return; + + this._alphaPremultiplied = value; + + this._pInvalidatePasses(); + } + + /** + * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either + * invisible or entirely opaque, often used with textures for foliage, etc. + * Recommended values are 0 to disable alpha, or 0.5 to create smooth edges. Default value is 0 (disabled). + */ + public get alphaThreshold():number + { + return this._pAlphaThreshold; + } + + public set alphaThreshold(value:number) + { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + if (this._pAlphaThreshold == value) + return; + + this._pAlphaThreshold = value; + + this._pInvalidatePasses(); + } + + /** + * Indicates whether or not the material requires alpha blending during rendering. + */ + public get requiresBlending():boolean + { + return this._pRequiresBlending; + } + + /** + * + */ + public get width():number + { + return this._pWidth; + } + + /** + * Sets the render state for a pass that is independent of the rendered object. This needs to be called before + * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. + * @param pass The pass data to activate. + * @param stage The Stage object which is currently used for rendering. + * @param camera The camera from which the scene is viewed. + * @private + */ + public _iActivatePass(pass:IMaterialPassData, stage:IStage, camera:Camera) // ARCANE + { + pass.materialPass._iActivate(pass, stage, camera); + } + + /** + * Clears the render state for a pass. This needs to be called before activating another pass. + * @param pass The pass to deactivate. + * @param stage The Stage used for rendering + * + * @internal + */ + public _iDeactivatePass(pass:IMaterialPassData, stage:IStage) // ARCANE + { + pass.materialPass._iDeactivate(pass, stage); + } + + /** + * Renders the current pass. Before calling renderPass, activatePass needs to be called with the same index. + * @param pass The pass used to render the renderable. + * @param renderable The IRenderable object to draw. + * @param stage The Stage object used for rendering. + * @param entityCollector The EntityCollector object that contains the visible scene data. + * @param viewProjection The view-projection matrix used to project to the screen. This is not the same as + * camera.viewProjection as it includes the scaling factors when rendering to textures. + * + * @internal + */ + public _iRenderPass(pass:IMaterialPassData, renderable:IRenderable, stage:IStage, camera:Camera, viewProjection:Matrix3D) + { + if (this._pLightPicker) + this._pLightPicker.collectLights(renderable); + + pass.materialPass._iRender(pass, renderable, stage, camera, viewProjection); + } + + // + // MATERIAL MANAGEMENT + // + /** + * Mark an IMaterialOwner as owner of this material. + * Assures we're not using the same material across renderables with different animations, since the + * Programs depend on animation. This method needs to be called when a material is assigned. + * + * @param owner The IMaterialOwner that had this material assigned + * + * @internal + */ + public iAddOwner(owner:IMaterialOwner) + { + this._owners.push(owner); + + var animationSet:IAnimationSet; + var animator:IAnimator = owner.animator; + + if (animator) + animationSet = animator.animationSet; + + if (owner.animator) { + if (this._animationSet && animationSet != this._animationSet) { + throw new Error("A Material instance cannot be shared across material owners with different animation sets"); + } else { + if (this._animationSet != animationSet) { + + this._animationSet = animationSet; + + this.invalidateAnimation(); + } + } + } + } + + /** + * Removes an IMaterialOwner as owner. + * @param owner + * + * @internal + */ + public iRemoveOwner(owner:IMaterialOwner) + { + this._owners.splice(this._owners.indexOf(owner), 1); + + if (this._owners.length == 0) { + this._animationSet = null; + + this.invalidateAnimation(); + } + } + + /** + * A list of the IMaterialOwners that use this material + * + * @private + */ + public get iOwners():Array + { + return this._owners; + } + + /** + * The amount of passes used by the material. + * + * @private + */ + public _iNumScreenPasses():number + { + return this._numPasses; + } + + /** + * A list of the screen passes used in this material + * + * @private + */ + public get _iScreenPasses():Array + { + return this._passes; + } + + /** + * Marks the shader programs for all passes as invalid, so they will be recompiled before the next use. + * + * @private + */ + public _pInvalidatePasses() + { + var len:number = this._materialPassData.length; + for (var i:number = 0; i < len; i++) + this._materialPassData[i].invalidate(); + + this.invalidateMaterial(); + } + + /** + * Flags that the screen passes have become invalid and need possible re-ordering / adding / deleting + */ + public _pInvalidateScreenPasses() + { + this._pScreenPassesInvalid = true; + } + + /** + * Removes a pass from the material. + * @param pass The pass to be removed. + */ + public _pRemoveScreenPass(pass:IMaterialPass) + { + pass.removeEventListener(Event.CHANGE, this._onPassChangeDelegate); + this._passes.splice(this._passes.indexOf(pass), 1); + + this._numPasses--; + } + + /** + * Removes all passes from the material + */ + public _pClearScreenPasses() + { + for (var i:number = 0; i < this._numPasses; ++i) + this._passes[i].removeEventListener(Event.CHANGE, this._onPassChangeDelegate); + + this._passes.length = this._numPasses = 0; + } + + /** + * Adds a pass to the material + * @param pass + */ + public _pAddScreenPass(pass:IMaterialPass) + { + this._passes[this._numPasses++] = pass; + + pass.lightPicker = this._pLightPicker; + pass.addEventListener(Event.CHANGE, this._onPassChangeDelegate); + + this.invalidateMaterial(); + } + + public _iAddMaterialData(materialData:IMaterialData):IMaterialData + { + this._materialData.push(materialData); + + return materialData; + } + + public _iRemoveMaterialData(materialData:IMaterialData):IMaterialData + { + this._materialData.splice(this._materialData.indexOf(materialData), 1); + + return materialData; + } + + /** + * Performs any processing that needs to occur before any of its passes are used. + * + * @private + */ + public _iUpdateMaterial() + { + } + + /** + * Listener for when a pass's shader code changes. It recalculates the render order id. + */ + private onPassChange(event:Event) + { + this.invalidateMaterial(); + } + + private invalidateAnimation() + { + var len:number = this._materialData.length; + for (var i:number = 0; i < len; i++) + this._materialData[i].invalidateAnimation(); + } + + private invalidateMaterial() + { + var len:number = this._materialData.length; + for (var i:number = 0; i < len; i++) + this._materialData[i].invalidateMaterial(); + } + + /** + * Called when the light picker's configuration changed. + */ + private onLightsChange(event:Event) + { + this._pInvalidateScreenPasses(); + } + + public _pNotifySizeChanged() + { + if (!this._sizeChanged) + this._sizeChanged = new MaterialEvent(MaterialEvent.SIZE_CHANGED); + + this.dispatchEvent(this._sizeChanged); + } + + public _iAddMaterialPassData(materialPassData:IMaterialPassData):IMaterialPassData + { + this._materialPassData.push(materialPassData); + + return materialPassData; + } + + public _iRemoveMaterialPassData(materialPassData:IMaterialPassData):IMaterialPassData + { + this._materialPassData.splice(this._materialPassData.indexOf(materialPassData), 1); + + return materialPassData; + } +} + +export = MaterialBase; \ No newline at end of file diff --git a/lib/materials/lightpickers/LightPickerBase.js b/lib/materials/lightpickers/LightPickerBase.js new file mode 100755 index 00000000..d9395578 --- /dev/null +++ b/lib/materials/lightpickers/LightPickerBase.js @@ -0,0 +1,226 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +/** +* LightPickerBase provides an abstract base clase for light picker classes. These classes are responsible for +* feeding materials with relevant lights. Usually, StaticLightPicker can be used, but LightPickerBase can be +* extended to provide more application-specific dynamic selection of lights. +* +* @see StaticLightPicker +*/ +var LightPickerBase = (function (_super) { + __extends(LightPickerBase, _super); + /** + * Creates a new LightPickerBase object. + */ + function LightPickerBase() { + _super.call(this); + this._pNumPointLights = 0; + this._pNumDirectionalLights = 0; + this._pNumCastingPointLights = 0; + this._pNumCastingDirectionalLights = 0; + this._pNumLightProbes = 0; + } + /** + * Disposes resources used by the light picker. + */ + LightPickerBase.prototype.dispose = function () { + }; + + Object.defineProperty(LightPickerBase.prototype, "assetType", { + /** + * @inheritDoc + */ + get: function () { + return AssetType.LIGHT_PICKER; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numDirectionalLights", { + /** + * The maximum amount of directional lights that will be provided. + */ + get: function () { + return this._pNumDirectionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numPointLights", { + /** + * The maximum amount of point lights that will be provided. + */ + get: function () { + return this._pNumPointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numCastingDirectionalLights", { + /** + * The maximum amount of directional lights that cast shadows. + */ + get: function () { + return this._pNumCastingDirectionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numCastingPointLights", { + /** + * The amount of point lights that cast shadows. + */ + get: function () { + return this._pNumCastingPointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "numLightProbes", { + /** + * The maximum amount of light probes that will be provided. + */ + get: function () { + return this._pNumLightProbes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "pointLights", { + /** + * The collected point lights to be used for shading. + */ + get: function () { + return this._pPointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "directionalLights", { + /** + * The collected directional lights to be used for shading. + */ + get: function () { + return this._pDirectionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "castingPointLights", { + /** + * The collected point lights that cast shadows to be used for shading. + */ + get: function () { + return this._pCastingPointLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "castingDirectionalLights", { + /** + * The collected directional lights that cast shadows to be used for shading. + */ + get: function () { + return this._pCastingDirectionalLights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "lightProbes", { + /** + * The collected light probes to be used for shading. + */ + get: function () { + return this._pLightProbes; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "lightProbeWeights", { + /** + * The weights for each light probe, defining their influence on the object. + */ + get: function () { + return this._pLightProbeWeights; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(LightPickerBase.prototype, "allPickedLights", { + /** + * A collection of all the collected lights. + */ + get: function () { + return this._pAllPickedLights; + }, + enumerable: true, + configurable: true + }); + + /** + * Updates set of lights for a given renderable and EntityCollector. Always call super.collectLights() after custom overridden code. + */ + LightPickerBase.prototype.collectLights = function (renderable) { + this.updateProbeWeights(renderable); + }; + + /** + * Updates the weights for the light probes, based on the renderable's position relative to them. + * @param renderable The renderble for which to calculate the light probes' influence. + */ + LightPickerBase.prototype.updateProbeWeights = function (renderable) { + // todo: this will cause the same calculations to occur per TriangleSubMesh. See if this can be improved. + var objectPos = renderable.sourceEntity.scenePosition; + var lightPos; + + var rx = objectPos.x, ry = objectPos.y, rz = objectPos.z; + var dx, dy, dz; + var w, total = 0; + var i; + + for (i = 0; i < this._pNumLightProbes; ++i) { + lightPos = this._pLightProbes[i].scenePosition; + dx = rx - lightPos.x; + dy = ry - lightPos.y; + dz = rz - lightPos.z; + + // weight is inversely proportional to square of distance + w = dx * dx + dy * dy + dz * dz; + + // just... huge if at the same spot + w = w > .00001 ? 1 / w : 50000000; + this._pLightProbeWeights[i] = w; + total += w; + } + + // normalize + total = 1 / total; + + for (i = 0; i < this._pNumLightProbes; ++i) + this._pLightProbeWeights[i] *= total; + }; + return LightPickerBase; +})(NamedAssetBase); + +module.exports = LightPickerBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9saWdodHBpY2tlcnMvTGlnaHRQaWNrZXJCYXNlLnRzIl0sIm5hbWVzIjpbIkxpZ2h0UGlja2VyQmFzZSIsIkxpZ2h0UGlja2VyQmFzZS5jb25zdHJ1Y3RvciIsIkxpZ2h0UGlja2VyQmFzZS5kaXNwb3NlIiwiTGlnaHRQaWNrZXJCYXNlLmNvbGxlY3RMaWdodHMiLCJMaWdodFBpY2tlckJhc2UudXBkYXRlUHJvYmVXZWlnaHRzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpRUFFeUU7QUFDekUsMkVBQWtGOztBQVFsRjs7Ozs7O0VBTUc7QUFDSDtJQUE4QkEsa0NBQWNBO0lBbUIzQ0E7O01BREdBO0lBQ0hBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBO1FBbkJSQSxLQUFPQSxnQkFBZ0JBLEdBQVVBLENBQUNBLENBQUNBO1FBQ25DQSxLQUFPQSxzQkFBc0JBLEdBQVVBLENBQUNBLENBQUNBO1FBQ3pDQSxLQUFPQSx1QkFBdUJBLEdBQVVBLENBQUNBLENBQUNBO1FBQzFDQSxLQUFPQSw2QkFBNkJBLEdBQVVBLENBQUNBLENBQUNBO1FBQ2hEQSxLQUFPQSxnQkFBZ0JBLEdBQVVBLENBQUNBLENBQUNBO0lBZ0JuQ0EsQ0FBQ0E7SUFLREQ7O01BREdBO3dDQUNIQTtJQUVBRSxDQUFDQTs7SUFLREY7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLFNBQVNBLENBQUNBLFlBQVlBO1FBQzlCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0Esc0JBQXNCQTtRQUNuQ0EsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGdCQUFnQkE7UUFDN0JBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSw2QkFBNkJBO1FBQzFDQSxDQUFDQTs7OztBQUFB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QUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEVBQUVBLEVBQUVBLENBQUNBO1lBQ3pDQSxJQUFJQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLENBQUNBO0lBQ3ZDQSxDQUFDQTtJQUNGSix1QkFBQ0E7QUFBREEsQ0FBQ0EsRUFwTDZCLGNBQWMsRUFvTDNDOztBQUVELGdDQUF5QixDQUFBIiwiZmlsZSI6Im1hdGVyaWFscy9saWdodHBpY2tlcnMvTGlnaHRQaWNrZXJCYXNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExpZ2h0QmFzZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0xpZ2h0QmFzZVwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgQXNzZXRUeXBlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRUeXBlXCIpO1xuaW1wb3J0IE5hbWVkQXNzZXRCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L05hbWVkQXNzZXRCYXNlXCIpO1xuaW1wb3J0IElBc3NldFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IElSZW5kZXJhYmxlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvSVJlbmRlcmFibGVcIik7XG5pbXBvcnQgSUNvbGxlY3Rvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9JQ29sbGVjdG9yXCIpO1xuaW1wb3J0IERpcmVjdGlvbmFsTGlnaHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9EaXJlY3Rpb25hbExpZ2h0XCIpO1xuaW1wb3J0IExpZ2h0UHJvYmVcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0xpZ2h0UHJvYmVcIik7XG5pbXBvcnQgUG9pbnRMaWdodFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvUG9pbnRMaWdodFwiKTtcblxuLyoqXG4gKiBMaWdodFBpY2tlckJhc2UgcHJvdmlkZXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzZSBmb3IgbGlnaHQgcGlja2VyIGNsYXNzZXMuIFRoZXNlIGNsYXNzZXMgYXJlIHJlc3BvbnNpYmxlIGZvclxuICogZmVlZGluZyBtYXRlcmlhbHMgd2l0aCByZWxldmFudCBsaWdodHMuIFVzdWFsbHksIFN0YXRpY0xpZ2h0UGlja2VyIGNhbiBiZSB1c2VkLCBidXQgTGlnaHRQaWNrZXJCYXNlIGNhbiBiZVxuICogZXh0ZW5kZWQgdG8gcHJvdmlkZSBtb3JlIGFwcGxpY2F0aW9uLXNwZWNpZmljIGR5bmFtaWMgc2VsZWN0aW9uIG9mIGxpZ2h0cy5cbiAqXG4gKiBAc2VlIFN0YXRpY0xpZ2h0UGlja2VyXG4gKi9cbmNsYXNzIExpZ2h0UGlja2VyQmFzZSBleHRlbmRzIE5hbWVkQXNzZXRCYXNlIGltcGxlbWVudHMgSUFzc2V0XG57XG5cdHB1YmxpYyBfcE51bVBvaW50TGlnaHRzOm51bWJlciA9IDA7XG5cdHB1YmxpYyBfcE51bURpcmVjdGlvbmFsTGlnaHRzOm51bWJlciA9IDA7XG5cdHB1YmxpYyBfcE51bUNhc3RpbmdQb2ludExpZ2h0czpudW1iZXIgPSAwO1xuXHRwdWJsaWMgX3BOdW1DYXN0aW5nRGlyZWN0aW9uYWxMaWdodHM6bnVtYmVyID0gMDtcblx0cHVibGljIF9wTnVtTGlnaHRQcm9iZXM6bnVtYmVyID0gMDtcblxuXHRwdWJsaWMgX3BBbGxQaWNrZWRMaWdodHM6QXJyYXk8TGlnaHRCYXNlPjtcblx0cHVibGljIF9wUG9pbnRMaWdodHM6QXJyYXk8UG9pbnRMaWdodD47XG5cdHB1YmxpYyBfcENhc3RpbmdQb2ludExpZ2h0czpBcnJheTxQb2ludExpZ2h0Pjtcblx0cHVibGljIF9wRGlyZWN0aW9uYWxMaWdodHM6QXJyYXk8RGlyZWN0aW9uYWxMaWdodD47XG5cdHB1YmxpYyBfcENhc3RpbmdEaXJlY3Rpb25hbExpZ2h0czpBcnJheTxEaXJlY3Rpb25hbExpZ2h0Pjtcblx0cHVibGljIF9wTGlnaHRQcm9iZXM6QXJyYXk8TGlnaHRQcm9iZT47XG5cdHB1YmxpYyBfcExpZ2h0UHJvYmVXZWlnaHRzOkFycmF5PG51bWJlcj47XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgTGlnaHRQaWNrZXJCYXNlIG9iamVjdC5cblx0ICovXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGlzcG9zZXMgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGxpZ2h0IHBpY2tlci5cblx0ICovXG5cdHB1YmxpYyBkaXNwb3NlKClcblx0e1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGFzc2V0VHlwZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIEFzc2V0VHlwZS5MSUdIVF9QSUNLRVI7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG1heGltdW0gYW1vdW50IG9mIGRpcmVjdGlvbmFsIGxpZ2h0cyB0aGF0IHdpbGwgYmUgcHJvdmlkZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG51bURpcmVjdGlvbmFsTGlnaHRzKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcE51bURpcmVjdGlvbmFsTGlnaHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBwb2ludCBsaWdodHMgdGhhdCB3aWxsIGJlIHByb3ZpZGVkLlxuXHQgKi9cblx0cHVibGljIGdldCBudW1Qb2ludExpZ2h0cygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BOdW1Qb2ludExpZ2h0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWF4aW11bSBhbW91bnQgb2YgZGlyZWN0aW9uYWwgbGlnaHRzIHRoYXQgY2FzdCBzaGFkb3dzLlxuXHQgKi9cblx0cHVibGljIGdldCBudW1DYXN0aW5nRGlyZWN0aW9uYWxMaWdodHMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wTnVtQ2FzdGluZ0RpcmVjdGlvbmFsTGlnaHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBhbW91bnQgb2YgcG9pbnQgbGlnaHRzIHRoYXQgY2FzdCBzaGFkb3dzLlxuXHQgKi9cblx0cHVibGljIGdldCBudW1DYXN0aW5nUG9pbnRMaWdodHMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wTnVtQ2FzdGluZ1BvaW50TGlnaHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiBsaWdodCBwcm9iZXMgdGhhdCB3aWxsIGJlIHByb3ZpZGVkLlxuXHQgKi9cblx0cHVibGljIGdldCBudW1MaWdodFByb2JlcygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BOdW1MaWdodFByb2Jlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY29sbGVjdGVkIHBvaW50IGxpZ2h0cyB0byBiZSB1c2VkIGZvciBzaGFkaW5nLlxuXHQgKi9cblx0cHVibGljIGdldCBwb2ludExpZ2h0cygpOkFycmF5PFBvaW50TGlnaHQ+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFBvaW50TGlnaHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBjb2xsZWN0ZWQgZGlyZWN0aW9uYWwgbGlnaHRzIHRvIGJlIHVzZWQgZm9yIHNoYWRpbmcuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGRpcmVjdGlvbmFsTGlnaHRzKCk6QXJyYXk8RGlyZWN0aW9uYWxMaWdodD5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wRGlyZWN0aW9uYWxMaWdodHM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGNvbGxlY3RlZCBwb2ludCBsaWdodHMgdGhhdCBjYXN0IHNoYWRvd3MgdG8gYmUgdXNlZCBmb3Igc2hhZGluZy5cblx0ICovXG5cdHB1YmxpYyBnZXQgY2FzdGluZ1BvaW50TGlnaHRzKCk6QXJyYXk8UG9pbnRMaWdodD5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wQ2FzdGluZ1BvaW50TGlnaHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBjb2xsZWN0ZWQgZGlyZWN0aW9uYWwgbGlnaHRzIHRoYXQgY2FzdCBzaGFkb3dzIHRvIGJlIHVzZWQgZm9yIHNoYWRpbmcuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGNhc3RpbmdEaXJlY3Rpb25hbExpZ2h0cygpOkFycmF5PERpcmVjdGlvbmFsTGlnaHQ+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcENhc3RpbmdEaXJlY3Rpb25hbExpZ2h0cztcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY29sbGVjdGVkIGxpZ2h0IHByb2JlcyB0byBiZSB1c2VkIGZvciBzaGFkaW5nLlxuXHQgKi9cblx0cHVibGljIGdldCBsaWdodFByb2JlcygpOkFycmF5PExpZ2h0UHJvYmU+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcExpZ2h0UHJvYmVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB3ZWlnaHRzIGZvciBlYWNoIGxpZ2h0IHByb2JlLCBkZWZpbmluZyB0aGVpciBpbmZsdWVuY2Ugb24gdGhlIG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBnZXQgbGlnaHRQcm9iZVdlaWdodHMoKTpBcnJheTxudW1iZXI+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcExpZ2h0UHJvYmVXZWlnaHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgY29sbGVjdGlvbiBvZiBhbGwgdGhlIGNvbGxlY3RlZCBsaWdodHMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGFsbFBpY2tlZExpZ2h0cygpOkFycmF5PExpZ2h0QmFzZT5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9wQWxsUGlja2VkTGlnaHRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgc2V0IG9mIGxpZ2h0cyBmb3IgYSBnaXZlbiByZW5kZXJhYmxlIGFuZCBFbnRpdHlDb2xsZWN0b3IuIEFsd2F5cyBjYWxsIHN1cGVyLmNvbGxlY3RMaWdodHMoKSBhZnRlciBjdXN0b20gb3ZlcnJpZGRlbiBjb2RlLlxuXHQgKi9cblx0cHVibGljIGNvbGxlY3RMaWdodHMocmVuZGVyYWJsZTpJUmVuZGVyYWJsZSlcblx0e1xuXHRcdHRoaXMudXBkYXRlUHJvYmVXZWlnaHRzKHJlbmRlcmFibGUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIHdlaWdodHMgZm9yIHRoZSBsaWdodCBwcm9iZXMsIGJhc2VkIG9uIHRoZSByZW5kZXJhYmxlJ3MgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlbS5cblx0ICogQHBhcmFtIHJlbmRlcmFibGUgVGhlIHJlbmRlcmJsZSBmb3Igd2hpY2ggdG8gY2FsY3VsYXRlIHRoZSBsaWdodCBwcm9iZXMnIGluZmx1ZW5jZS5cblx0ICovXG5cdHByaXZhdGUgdXBkYXRlUHJvYmVXZWlnaHRzKHJlbmRlcmFibGU6SVJlbmRlcmFibGUpXG5cdHtcblx0XHQvLyB0b2RvOiB0aGlzIHdpbGwgY2F1c2UgdGhlIHNhbWUgY2FsY3VsYXRpb25zIHRvIG9jY3VyIHBlciBUcmlhbmdsZVN1Yk1lc2guIFNlZSBpZiB0aGlzIGNhbiBiZSBpbXByb3ZlZC5cblx0XHR2YXIgb2JqZWN0UG9zOlZlY3RvcjNEID0gcmVuZGVyYWJsZS5zb3VyY2VFbnRpdHkuc2NlbmVQb3NpdGlvbjtcblx0XHR2YXIgbGlnaHRQb3M6VmVjdG9yM0Q7XG5cblx0XHR2YXIgcng6bnVtYmVyID0gb2JqZWN0UG9zLngsIHJ5Om51bWJlciA9IG9iamVjdFBvcy55LCByejpudW1iZXIgPSBvYmplY3RQb3Muejtcblx0XHR2YXIgZHg6bnVtYmVyLCBkeTpudW1iZXIsIGR6Om51bWJlcjtcblx0XHR2YXIgdzpudW1iZXIsIHRvdGFsOm51bWJlciA9IDA7XG5cdFx0dmFyIGk6bnVtYmVyO1xuXG5cdFx0Ly8gY2FsY3VsYXRlcyB3ZWlnaHRzIGZvciBwcm9iZXNcblx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fcE51bUxpZ2h0UHJvYmVzOyArK2kpIHtcblxuXHRcdFx0bGlnaHRQb3MgPSB0aGlzLl9wTGlnaHRQcm9iZXNbaV0uc2NlbmVQb3NpdGlvbjtcblx0XHRcdGR4ID0gcnggLSBsaWdodFBvcy54O1xuXHRcdFx0ZHkgPSByeSAtIGxpZ2h0UG9zLnk7XG5cdFx0XHRkeiA9IHJ6IC0gbGlnaHRQb3Muejtcblx0XHRcdC8vIHdlaWdodCBpcyBpbnZlcnNlbHkgcHJvcG9ydGlvbmFsIHRvIHNxdWFyZSBvZiBkaXN0YW5jZVxuXHRcdFx0dyA9IGR4KmR4ICsgZHkqZHkgKyBkeipkejtcblxuXHRcdFx0Ly8ganVzdC4uLiBodWdlIGlmIGF0IHRoZSBzYW1lIHNwb3Rcblx0XHRcdHcgPSB3ID4gLjAwMDAxPyAxL3cgOiA1MDAwMDAwMDtcblx0XHRcdHRoaXMuX3BMaWdodFByb2JlV2VpZ2h0c1tpXSA9IHc7XG5cdFx0XHR0b3RhbCArPSB3O1xuXHRcdH1cblxuXHRcdC8vIG5vcm1hbGl6ZVxuXHRcdHRvdGFsID0gMS90b3RhbDtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLl9wTnVtTGlnaHRQcm9iZXM7ICsraSlcblx0XHRcdHRoaXMuX3BMaWdodFByb2JlV2VpZ2h0c1tpXSAqPSB0b3RhbDtcblx0fVxufVxuXG5leHBvcnQgPSBMaWdodFBpY2tlckJhc2U7Il19 \ No newline at end of file diff --git a/lib/materials/lightpickers/LightPickerBase.ts b/lib/materials/lightpickers/LightPickerBase.ts new file mode 100644 index 00000000..c4b4f931 --- /dev/null +++ b/lib/materials/lightpickers/LightPickerBase.ts @@ -0,0 +1,201 @@ +import LightBase = require("awayjs-core/lib/core/base/LightBase"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import ICollector = require("awayjs-core/lib/core/traverse/ICollector"); +import DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); +import LightProbe = require("awayjs-core/lib/entities/LightProbe"); +import PointLight = require("awayjs-core/lib/entities/PointLight"); + +/** + * LightPickerBase provides an abstract base clase for light picker classes. These classes are responsible for + * feeding materials with relevant lights. Usually, StaticLightPicker can be used, but LightPickerBase can be + * extended to provide more application-specific dynamic selection of lights. + * + * @see StaticLightPicker + */ +class LightPickerBase extends NamedAssetBase implements IAsset +{ + public _pNumPointLights:number = 0; + public _pNumDirectionalLights:number = 0; + public _pNumCastingPointLights:number = 0; + public _pNumCastingDirectionalLights:number = 0; + public _pNumLightProbes:number = 0; + + public _pAllPickedLights:Array; + public _pPointLights:Array; + public _pCastingPointLights:Array; + public _pDirectionalLights:Array; + public _pCastingDirectionalLights:Array; + public _pLightProbes:Array; + public _pLightProbeWeights:Array; + + /** + * Creates a new LightPickerBase object. + */ + constructor() + { + super(); + } + + /** + * Disposes resources used by the light picker. + */ + public dispose() + { + } + + /** + * @inheritDoc + */ + public get assetType():string + { + return AssetType.LIGHT_PICKER; + } + + /** + * The maximum amount of directional lights that will be provided. + */ + public get numDirectionalLights():number + { + return this._pNumDirectionalLights; + } + + /** + * The maximum amount of point lights that will be provided. + */ + public get numPointLights():number + { + return this._pNumPointLights; + } + + /** + * The maximum amount of directional lights that cast shadows. + */ + public get numCastingDirectionalLights():number + { + return this._pNumCastingDirectionalLights; + } + + /** + * The amount of point lights that cast shadows. + */ + public get numCastingPointLights():number + { + return this._pNumCastingPointLights; + } + + /** + * The maximum amount of light probes that will be provided. + */ + public get numLightProbes():number + { + return this._pNumLightProbes; + } + + /** + * The collected point lights to be used for shading. + */ + public get pointLights():Array + { + return this._pPointLights; + } + + /** + * The collected directional lights to be used for shading. + */ + public get directionalLights():Array + { + return this._pDirectionalLights; + } + + /** + * The collected point lights that cast shadows to be used for shading. + */ + public get castingPointLights():Array + { + return this._pCastingPointLights; + } + + /** + * The collected directional lights that cast shadows to be used for shading. + */ + public get castingDirectionalLights():Array + { + return this._pCastingDirectionalLights; + } + + /** + * The collected light probes to be used for shading. + */ + public get lightProbes():Array + { + return this._pLightProbes; + } + + /** + * The weights for each light probe, defining their influence on the object. + */ + public get lightProbeWeights():Array + { + return this._pLightProbeWeights; + } + + /** + * A collection of all the collected lights. + */ + public get allPickedLights():Array + { + return this._pAllPickedLights; + } + + /** + * Updates set of lights for a given renderable and EntityCollector. Always call super.collectLights() after custom overridden code. + */ + public collectLights(renderable:IRenderable) + { + this.updateProbeWeights(renderable); + } + + /** + * Updates the weights for the light probes, based on the renderable's position relative to them. + * @param renderable The renderble for which to calculate the light probes' influence. + */ + private updateProbeWeights(renderable:IRenderable) + { + // todo: this will cause the same calculations to occur per TriangleSubMesh. See if this can be improved. + var objectPos:Vector3D = renderable.sourceEntity.scenePosition; + var lightPos:Vector3D; + + var rx:number = objectPos.x, ry:number = objectPos.y, rz:number = objectPos.z; + var dx:number, dy:number, dz:number; + var w:number, total:number = 0; + var i:number; + + // calculates weights for probes + for (i = 0; i < this._pNumLightProbes; ++i) { + + lightPos = this._pLightProbes[i].scenePosition; + dx = rx - lightPos.x; + dy = ry - lightPos.y; + dz = rz - lightPos.z; + // weight is inversely proportional to square of distance + w = dx*dx + dy*dy + dz*dz; + + // just... huge if at the same spot + w = w > .00001? 1/w : 50000000; + this._pLightProbeWeights[i] = w; + total += w; + } + + // normalize + total = 1/total; + + for (i = 0; i < this._pNumLightProbes; ++i) + this._pLightProbeWeights[i] *= total; + } +} + +export = LightPickerBase; \ No newline at end of file diff --git a/lib/materials/lightpickers/StaticLightPicker.js b/lib/materials/lightpickers/StaticLightPicker.js new file mode 100755 index 00000000..0b653bd2 --- /dev/null +++ b/lib/materials/lightpickers/StaticLightPicker.js @@ -0,0 +1,172 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); +var LightProbe = require("awayjs-core/lib/entities/LightProbe"); +var PointLight = require("awayjs-core/lib/entities/PointLight"); +var Event = require("awayjs-core/lib/events/Event"); +var LightEvent = require("awayjs-core/lib/events/LightEvent"); +var LightPickerBase = require("awayjs-core/lib/materials/lightpickers/LightPickerBase"); + +/** +* StaticLightPicker is a light picker that provides a static set of lights. The lights can be reassigned, but +* if the configuration changes (number of directional lights, point lights, etc), a material recompilation may +* occur. +*/ +var StaticLightPicker = (function (_super) { + __extends(StaticLightPicker, _super); + /** + * Creates a new StaticLightPicker object. + * @param lights The lights to be used for shading. + */ + function StaticLightPicker(lights) { + var _this = this; + _super.call(this); + + this._onCastShadowChangeDelegate = function (event) { + return _this.onCastShadowChange(event); + }; + + this.lights = lights; + } + Object.defineProperty(StaticLightPicker.prototype, "lights", { + /** + * The lights used for shading. + */ + get: function () { + return this._lights; + }, + set: function (value) { + var numPointLights = 0; + var numDirectionalLights = 0; + var numCastingPointLights = 0; + var numCastingDirectionalLights = 0; + var numLightProbes = 0; + var light; + + if (this._lights) + this.clearListeners(); + + this._lights = value; + this._pAllPickedLights = value; + this._pPointLights = new Array(); + this._pCastingPointLights = new Array(); + this._pDirectionalLights = new Array(); + this._pCastingDirectionalLights = new Array(); + this._pLightProbes = new Array(); + + var len = value.length; + + for (var i = 0; i < len; ++i) { + light = value[i]; + light.addEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); + + if (light instanceof PointLight) { + if (light.castsShadows) + this._pCastingPointLights[numCastingPointLights++] = light; + else + this._pPointLights[numPointLights++] = light; + } else if (light instanceof DirectionalLight) { + if (light.castsShadows) + this._pCastingDirectionalLights[numCastingDirectionalLights++] = light; + else + this._pDirectionalLights[numDirectionalLights++] = light; + } else if (light instanceof LightProbe) { + this._pLightProbes[numLightProbes++] = light; + } + } + + if (this._pNumDirectionalLights == numDirectionalLights && this._pNumPointLights == numPointLights && this._pNumLightProbes == numLightProbes && this._pNumCastingPointLights == numCastingPointLights && this._pNumCastingDirectionalLights == numCastingDirectionalLights) + return; + + this._pNumDirectionalLights = numDirectionalLights; + this._pNumCastingDirectionalLights = numCastingDirectionalLights; + this._pNumPointLights = numPointLights; + this._pNumCastingPointLights = numCastingPointLights; + this._pNumLightProbes = numLightProbes; + + // MUST HAVE MULTIPLE OF 4 ELEMENTS! + this._pLightProbeWeights = new Array(Math.ceil(numLightProbes / 4) * 4); + + // notify material lights have changed + this.dispatchEvent(new Event(Event.CHANGE)); + }, + enumerable: true, + configurable: true + }); + + + /** + * Remove configuration change listeners on the lights. + */ + StaticLightPicker.prototype.clearListeners = function () { + var len = this._lights.length; + for (var i = 0; i < len; ++i) + this._lights[i].removeEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); + }; + + /** + * Notifies the material of a configuration change. + */ + StaticLightPicker.prototype.onCastShadowChange = function (event) { + // TODO: Assign to special caster collections, just append it to the lights in SinglePass + // But keep seperated in multipass + var light = event.target; + + if (light instanceof PointLight) + this.updatePointCasting(light); + else if (light instanceof DirectionalLight) + this.updateDirectionalCasting(light); + + this.dispatchEvent(new Event(Event.CHANGE)); + }; + + /** + * Called when a directional light's shadow casting configuration changes. + */ + StaticLightPicker.prototype.updateDirectionalCasting = function (light) { + var dl = light; + + if (light.castsShadows) { + --this._pNumDirectionalLights; + ++this._pNumCastingDirectionalLights; + + this._pDirectionalLights.splice(this._pDirectionalLights.indexOf(dl), 1); + this._pCastingDirectionalLights.push(light); + } else { + ++this._pNumDirectionalLights; + --this._pNumCastingDirectionalLights; + + this._pCastingDirectionalLights.splice(this._pCastingDirectionalLights.indexOf(dl), 1); + this._pDirectionalLights.push(light); + } + }; + + /** + * Called when a point light's shadow casting configuration changes. + */ + StaticLightPicker.prototype.updatePointCasting = function (light) { + var pl = light; + + if (light.castsShadows) { + --this._pNumPointLights; + ++this._pNumCastingPointLights; + this._pPointLights.splice(this._pPointLights.indexOf(pl), 1); + this._pCastingPointLights.push(light); + } else { + ++this._pNumPointLights; + --this._pNumCastingPointLights; + + this._pCastingPointLights.splice(this._pCastingPointLights.indexOf(pl), 1); + this._pPointLights.push(light); + } + }; + return StaticLightPicker; +})(LightPickerBase); + +module.exports = StaticLightPicker; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9saWdodHBpY2tlcnMvU3RhdGljTGlnaHRQaWNrZXIudHMiXSwibmFtZXMiOlsiU3RhdGljTGlnaHRQaWNrZXIiLCJTdGF0aWNMaWdodFBpY2tlci5jb25zdHJ1Y3RvciIsIlN0YXRpY0xpZ2h0UGlja2VyLmNsZWFyTGlzdGVuZXJzIiwiU3RhdGljTGlnaHRQaWNrZXIub25DYXN0U2hhZG93Q2hhbmdlIiwiU3RhdGljTGlnaHRQaWNrZXIudXBkYXRlRGlyZWN0aW9uYWxDYXN0aW5nIiwiU3RhdGljTGlnaHRQaWNrZXIudXBkYXRlUG9pbnRDYXN0aW5nIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwyRUFDa0Y7QUFDbEYsK0RBQXVFO0FBQ3ZFLCtEQUF1RTtBQUN2RSxtREFBNEQ7QUFDNUQsNkRBQXFFO0FBQ3JFLHVGQUE4Rjs7QUFFOUY7Ozs7RUFJRztBQUNIO0lBQWdDQSxvQ0FBZUE7SUFTOUNBOzs7TUFER0E7SUFDSEEsMkJBQVlBLE1BQU1BO1FBQWxCQyxpQkFPQ0E7UUFMQUEsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLDJCQUEyQkEsR0FBR0EsVUFBQ0EsS0FBZ0JBO21CQUFLQSxLQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLEtBQUtBLENBQUNBO1FBQTlCQSxDQUE4QkE7O1FBRXZGQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxNQUFNQTtJQUNyQkEsQ0FBQ0E7SUFLREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFrQkEsS0FBZ0JBO1lBRWpDQSxJQUFJQSxjQUFjQSxHQUFVQSxDQUFDQTtZQUM3QkEsSUFBSUEsb0JBQW9CQSxHQUFVQSxDQUFDQTtZQUNuQ0EsSUFBSUEscUJBQXFCQSxHQUFVQSxDQUFDQTtZQUNwQ0EsSUFBSUEsMkJBQTJCQSxHQUFVQSxDQUFDQTtZQUMxQ0EsSUFBSUEsY0FBY0EsR0FBVUEsQ0FB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SUEsQ0FBQ0EsdUJBQXVCQTs7WUFFOUJBLElBQUlBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxPQUFPQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtZQUMxRUEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7U0FDOUJBO0lBQ0ZBLENBQUNBO0lBQ0ZMLHlCQUFDQTtBQUFEQSxDQUFDQSxFQTlKK0IsZUFBZSxFQThKOUM7O0FBRUQsa0NBQTJCLENBQUEiLCJmaWxlIjoibWF0ZXJpYWxzL2xpZ2h0cGlja2Vycy9TdGF0aWNMaWdodFBpY2tlci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMaWdodEJhc2VcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaWdodEJhc2VcIik7XG5pbXBvcnQgRGlyZWN0aW9uYWxMaWdodFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0RpcmVjdGlvbmFsTGlnaHRcIik7XG5pbXBvcnQgTGlnaHRQcm9iZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvTGlnaHRQcm9iZVwiKTtcbmltcG9ydCBQb2ludExpZ2h0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9Qb2ludExpZ2h0XCIpO1xuaW1wb3J0IEV2ZW50XHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcbmltcG9ydCBMaWdodEV2ZW50XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvTGlnaHRFdmVudFwiKTtcbmltcG9ydCBMaWdodFBpY2tlckJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvbGlnaHRwaWNrZXJzL0xpZ2h0UGlja2VyQmFzZVwiKTtcblxuLyoqXG4gKiBTdGF0aWNMaWdodFBpY2tlciBpcyBhIGxpZ2h0IHBpY2tlciB0aGF0IHByb3ZpZGVzIGEgc3RhdGljIHNldCBvZiBsaWdodHMuIFRoZSBsaWdodHMgY2FuIGJlIHJlYXNzaWduZWQsIGJ1dFxuICogaWYgdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAobnVtYmVyIG9mIGRpcmVjdGlvbmFsIGxpZ2h0cywgcG9pbnQgbGlnaHRzLCBldGMpLCBhIG1hdGVyaWFsIHJlY29tcGlsYXRpb24gbWF5XG4gKiBvY2N1ci5cbiAqL1xuY2xhc3MgU3RhdGljTGlnaHRQaWNrZXIgZXh0ZW5kcyBMaWdodFBpY2tlckJhc2Vcbntcblx0cHJpdmF0ZSBfbGlnaHRzOkFycmF5PGFueT47XG5cdHByaXZhdGUgX29uQ2FzdFNoYWRvd0NoYW5nZURlbGVnYXRlOkZ1bmN0aW9uO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFN0YXRpY0xpZ2h0UGlja2VyIG9iamVjdC5cblx0ICogQHBhcmFtIGxpZ2h0cyBUaGUgbGlnaHRzIHRvIGJlIHVzZWQgZm9yIHNoYWRpbmcuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihsaWdodHMpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fb25DYXN0U2hhZG93Q2hhbmdlRGVsZWdhdGUgPSAoZXZlbnQ6TGlnaHRFdmVudCkgPT4gdGhpcy5vbkNhc3RTaGFkb3dDaGFuZ2UoZXZlbnQpO1xuXG5cdFx0dGhpcy5saWdodHMgPSBsaWdodHM7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGxpZ2h0cyB1c2VkIGZvciBzaGFkaW5nLlxuXHQgKi9cblx0cHVibGljIGdldCBsaWdodHMoKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2xpZ2h0cztcblx0fVxuXG5cdHB1YmxpYyBzZXQgbGlnaHRzKHZhbHVlOkFycmF5PGFueT4pXG5cdHtcblx0XHR2YXIgbnVtUG9pbnRMaWdodHM6bnVtYmVyID0gMDtcblx0XHR2YXIgbnVtRGlyZWN0aW9uYWxMaWdodHM6bnVtYmVyID0gMDtcblx0XHR2YXIgbnVtQ2FzdGluZ1BvaW50TGlnaHRzOm51bWJlciA9IDA7XG5cdFx0dmFyIG51bUNhc3RpbmdEaXJlY3Rpb25hbExpZ2h0czpudW1iZXIgPSAwO1xuXHRcdHZhciBudW1MaWdodFByb2JlczpudW1iZXIgPSAwO1xuXHRcdHZhciBsaWdodDpMaWdodEJhc2U7XG5cblx0XHRpZiAodGhpcy5fbGlnaHRzKVxuXHRcdFx0dGhpcy5jbGVhckxpc3RlbmVycygpO1xuXG5cdFx0dGhpcy5fbGlnaHRzID0gdmFsdWU7XG5cdFx0dGhpcy5fcEFsbFBpY2tlZExpZ2h0cyA9IHZhbHVlO1xuXHRcdHRoaXMuX3BQb2ludExpZ2h0cyA9IG5ldyBBcnJheTxQb2ludExpZ2h0PigpO1xuXHRcdHRoaXMuX3BDYXN0aW5nUG9pbnRMaWdodHMgPSBuZXcgQXJyYXk8UG9pbnRMaWdodD4oKTtcblx0XHR0aGlzLl9wRGlyZWN0aW9uYWxMaWdodHMgPSBuZXcgQXJyYXk8RGlyZWN0aW9uYWxMaWdodD4oKTtcblx0XHR0aGlzLl9wQ2FzdGluZ0RpcmVjdGlvbmFsTGlnaHRzID0gbmV3IEFycmF5PERpcmVjdGlvbmFsTGlnaHQ+KCk7XG5cdFx0dGhpcy5fcExpZ2h0UHJvYmVzID0gbmV3IEFycmF5PExpZ2h0UHJvYmU+KCk7XG5cblx0XHR2YXIgbGVuOm51bWJlciA9IHZhbHVlLmxlbmd0aDtcblxuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgKytpKSB7XG5cdFx0XHRsaWdodCA9IHZhbHVlW2ldO1xuXHRcdFx0bGlnaHQuYWRkRXZlbnRMaXN0ZW5lcihMaWdodEV2ZW50LkNBU1RTX1NIQURPV19DSEFOR0UsIHRoaXMuX29uQ2FzdFNoYWRvd0NoYW5nZURlbGVnYXRlKTtcblxuXHRcdFx0aWYgKGxpZ2h0IGluc3RhbmNlb2YgUG9pbnRMaWdodCkge1xuXHRcdFx0XHRpZiAobGlnaHQuY2FzdHNTaGFkb3dzKVxuXHRcdFx0XHRcdHRoaXMuX3BDYXN0aW5nUG9pbnRMaWdodHNbbnVtQ2FzdGluZ1BvaW50TGlnaHRzKytdID0gPFBvaW50TGlnaHQ+IGxpZ2h0O1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5fcFBvaW50TGlnaHRzW251bVBvaW50TGlnaHRzKytdID0gPFBvaW50TGlnaHQ+IGxpZ2h0O1xuXG5cdFx0XHR9IGVsc2UgaWYgKGxpZ2h0IGluc3RhbmNlb2YgRGlyZWN0aW9uYWxMaWdodCkge1xuXHRcdFx0XHRpZiAobGlnaHQuY2FzdHNTaGFkb3dzKVxuXHRcdFx0XHRcdHRoaXMuX3BDYXN0aW5nRGlyZWN0aW9uYWxMaWdodHNbbnVtQ2FzdGluZ0RpcmVjdGlvbmFsTGlnaHRzKytdID0gPERpcmVjdGlvbmFsTGlnaHQ+IGxpZ2h0O1xuXHRcdFx0XHRlbHNlXG5cdFx0XHRcdFx0dGhpcy5fcERpcmVjdGlvbmFsTGlnaHRzW251bURpcmVjdGlvbmFsTGlnaHRzKytdID0gPERpcmVjdGlvbmFsTGlnaHQ+IGxpZ2h0O1xuXG5cdFx0XHR9IGVsc2UgaWYgKGxpZ2h0IGluc3RhbmNlb2YgTGlnaHRQcm9iZSkge1xuXHRcdFx0XHR0aGlzLl9wTGlnaHRQcm9iZXNbbnVtTGlnaHRQcm9iZXMrK10gPSA8TGlnaHRQcm9iZT4gbGlnaHQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3BOdW1EaXJlY3Rpb25hbExpZ2h0cyA9PSBudW1EaXJlY3Rpb25hbExpZ2h0cyAmJiB0aGlzLl9wTnVtUG9pbnRMaWdodHMgPT0gbnVtUG9pbnRMaWdodHMgJiYgdGhpcy5fcE51bUxpZ2h0UHJvYmVzID09IG51bUxpZ2h0UHJvYmVzICYmIHRoaXMuX3BOdW1DYXN0aW5nUG9pbnRMaWdodHMgPT0gbnVtQ2FzdGluZ1BvaW50TGlnaHRzICYmIHRoaXMuX3BOdW1DYXN0aW5nRGlyZWN0aW9uYWxMaWdodHMgPT0gbnVtQ2FzdGluZ0RpcmVjdGlvbmFsTGlnaHRzKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcE51bURpcmVjdGlvbmFsTGlnaHRzID0gbnVtRGlyZWN0aW9uYWxMaWdodHM7XG5cdFx0dGhpcy5fcE51bUNhc3RpbmdEaXJlY3Rpb25hbExpZ2h0cyA9IG51bUNhc3RpbmdEaXJlY3Rpb25hbExpZ2h0cztcblx0XHR0aGlzLl9wTnVtUG9pbnRMaWdodHMgPSBudW1Qb2ludExpZ2h0cztcblx0XHR0aGlzLl9wTnVtQ2FzdGluZ1BvaW50TGlnaHRzID0gbnVtQ2FzdGluZ1BvaW50TGlnaHRzO1xuXHRcdHRoaXMuX3BOdW1MaWdodFByb2JlcyA9IG51bUxpZ2h0UHJvYmVzO1xuXG5cdFx0Ly8gTVVTVCBIQVZFIE1VTFRJUExFIE9GIDQgRUxFTUVOVFMhXG5cdFx0dGhpcy5fcExpZ2h0UHJvYmVXZWlnaHRzID0gbmV3IEFycmF5PG51bWJlcj4oTWF0aC5jZWlsKG51bUxpZ2h0UHJvYmVzLzQpKjQpO1xuXG5cdFx0Ly8gbm90aWZ5IG1hdGVyaWFsIGxpZ2h0cyBoYXZlIGNoYW5nZWRcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KEV2ZW50LkNIQU5HRSkpO1xuXG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGNvbmZpZ3VyYXRpb24gY2hhbmdlIGxpc3RlbmVycyBvbiB0aGUgbGlnaHRzLlxuXHQgKi9cblx0cHJpdmF0ZSBjbGVhckxpc3RlbmVycygpXG5cdHtcblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX2xpZ2h0cy5sZW5ndGg7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyArK2kpXG5cdFx0XHR0aGlzLl9saWdodHNbaV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihMaWdodEV2ZW50LkNBU1RTX1NIQURPV19DSEFOR0UsIHRoaXMuX29uQ2FzdFNoYWRvd0NoYW5nZURlbGVnYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBOb3RpZmllcyB0aGUgbWF0ZXJpYWwgb2YgYSBjb25maWd1cmF0aW9uIGNoYW5nZS5cblx0ICovXG5cdHByaXZhdGUgb25DYXN0U2hhZG93Q2hhbmdlKGV2ZW50OkxpZ2h0RXZlbnQpXG5cdHtcblx0XHQvLyBUT0RPOiBBc3NpZ24gdG8gc3BlY2lhbCBjYXN0ZXIgY29sbGVjdGlvbnMsIGp1c3QgYXBwZW5kIGl0IHRvIHRoZSBsaWdodHMgaW4gU2luZ2xlUGFzc1xuXHRcdC8vIEJ1dCBrZWVwIHNlcGVyYXRlZCBpbiBtdWx0aXBhc3NcblxuXHRcdHZhciBsaWdodDpMaWdodEJhc2UgPSA8TGlnaHRCYXNlPiBldmVudC50YXJnZXQ7XG5cblx0XHRpZiAobGlnaHQgaW5zdGFuY2VvZiBQb2ludExpZ2h0KVxuXHRcdFx0dGhpcy51cGRhdGVQb2ludENhc3RpbmcoPFBvaW50TGlnaHQ+IGxpZ2h0KTtcblx0XHRlbHNlIGlmIChsaWdodCBpbnN0YW5jZW9mIERpcmVjdGlvbmFsTGlnaHQpXG5cdFx0XHR0aGlzLnVwZGF0ZURpcmVjdGlvbmFsQ2FzdGluZyg8RGlyZWN0aW9uYWxMaWdodD4gbGlnaHQpO1xuXG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFdmVudC5DSEFOR0UpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgd2hlbiBhIGRpcmVjdGlvbmFsIGxpZ2h0J3Mgc2hhZG93IGNhc3RpbmcgY29uZmlndXJhdGlvbiBjaGFuZ2VzLlxuXHQgKi9cblx0cHJpdmF0ZSB1cGRhdGVEaXJlY3Rpb25hbENhc3RpbmcobGlnaHQ6RGlyZWN0aW9uYWxMaWdodClcblx0e1xuXHRcdHZhciBkbDpEaXJlY3Rpb25hbExpZ2h0ID0gPERpcmVjdGlvbmFsTGlnaHQ+IGxpZ2h0O1xuXG5cdFx0aWYgKGxpZ2h0LmNhc3RzU2hhZG93cykge1xuXHRcdFx0LS10aGlzLl9wTnVtRGlyZWN0aW9uYWxMaWdodHM7XG5cdFx0XHQrK3RoaXMuX3BOdW1DYXN0aW5nRGlyZWN0aW9uYWxMaWdodHM7XG5cblxuXHRcdFx0dGhpcy5fcERpcmVjdGlvbmFsTGlnaHRzLnNwbGljZSh0aGlzLl9wRGlyZWN0aW9uYWxMaWdodHMuaW5kZXhPZihkbCksIDEpO1xuXHRcdFx0dGhpcy5fcENhc3RpbmdEaXJlY3Rpb25hbExpZ2h0cy5wdXNoKGxpZ2h0KTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQrK3RoaXMuX3BOdW1EaXJlY3Rpb25hbExpZ2h0cztcblx0XHRcdC0tdGhpcy5fcE51bUNhc3RpbmdEaXJlY3Rpb25hbExpZ2h0cztcblxuXHRcdFx0dGhpcy5fcENhc3RpbmdEaXJlY3Rpb25hbExpZ2h0cy5zcGxpY2UodGhpcy5fcENhc3RpbmdEaXJlY3Rpb25hbExpZ2h0cy5pbmRleE9mKGRsKSwgMSk7XG5cdFx0XHR0aGlzLl9wRGlyZWN0aW9uYWxMaWdodHMucHVzaChsaWdodCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENhbGxlZCB3aGVuIGEgcG9pbnQgbGlnaHQncyBzaGFkb3cgY2FzdGluZyBjb25maWd1cmF0aW9uIGNoYW5nZXMuXG5cdCAqL1xuXHRwcml2YXRlIHVwZGF0ZVBvaW50Q2FzdGluZyhsaWdodDpQb2ludExpZ2h0KVxuXHR7XG5cdFx0dmFyIHBsOlBvaW50TGlnaHQgPSA8UG9pbnRMaWdodD4gbGlnaHQ7XG5cblx0XHRpZiAobGlnaHQuY2FzdHNTaGFkb3dzKSB7XG5cdFx0XHQtLXRoaXMuX3BOdW1Qb2ludExpZ2h0cztcblx0XHRcdCsrdGhpcy5fcE51bUNhc3RpbmdQb2ludExpZ2h0cztcblx0XHRcdHRoaXMuX3BQb2ludExpZ2h0cy5zcGxpY2UodGhpcy5fcFBvaW50TGlnaHRzLmluZGV4T2YocGwpLCAxKTtcblx0XHRcdHRoaXMuX3BDYXN0aW5nUG9pbnRMaWdodHMucHVzaChsaWdodCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdCsrdGhpcy5fcE51bVBvaW50TGlnaHRzO1xuXHRcdFx0LS10aGlzLl9wTnVtQ2FzdGluZ1BvaW50TGlnaHRzO1xuXG5cdFx0XHR0aGlzLl9wQ2FzdGluZ1BvaW50TGlnaHRzLnNwbGljZSh0aGlzLl9wQ2FzdGluZ1BvaW50TGlnaHRzLmluZGV4T2YocGwpLCAxKTtcblx0XHRcdHRoaXMuX3BQb2ludExpZ2h0cy5wdXNoKGxpZ2h0KTtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0ID0gU3RhdGljTGlnaHRQaWNrZXI7Il19 \ No newline at end of file diff --git a/lib/materials/lightpickers/StaticLightPicker.ts b/lib/materials/lightpickers/StaticLightPicker.ts new file mode 100644 index 00000000..49410573 --- /dev/null +++ b/lib/materials/lightpickers/StaticLightPicker.ts @@ -0,0 +1,174 @@ +import LightBase = require("awayjs-core/lib/core/base/LightBase"); +import DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); +import LightProbe = require("awayjs-core/lib/entities/LightProbe"); +import PointLight = require("awayjs-core/lib/entities/PointLight"); +import Event = require("awayjs-core/lib/events/Event"); +import LightEvent = require("awayjs-core/lib/events/LightEvent"); +import LightPickerBase = require("awayjs-core/lib/materials/lightpickers/LightPickerBase"); + +/** + * StaticLightPicker is a light picker that provides a static set of lights. The lights can be reassigned, but + * if the configuration changes (number of directional lights, point lights, etc), a material recompilation may + * occur. + */ +class StaticLightPicker extends LightPickerBase +{ + private _lights:Array; + private _onCastShadowChangeDelegate:Function; + + /** + * Creates a new StaticLightPicker object. + * @param lights The lights to be used for shading. + */ + constructor(lights) + { + super(); + + this._onCastShadowChangeDelegate = (event:LightEvent) => this.onCastShadowChange(event); + + this.lights = lights; + } + + /** + * The lights used for shading. + */ + public get lights() + { + return this._lights; + } + + public set lights(value:Array) + { + var numPointLights:number = 0; + var numDirectionalLights:number = 0; + var numCastingPointLights:number = 0; + var numCastingDirectionalLights:number = 0; + var numLightProbes:number = 0; + var light:LightBase; + + if (this._lights) + this.clearListeners(); + + this._lights = value; + this._pAllPickedLights = value; + this._pPointLights = new Array(); + this._pCastingPointLights = new Array(); + this._pDirectionalLights = new Array(); + this._pCastingDirectionalLights = new Array(); + this._pLightProbes = new Array(); + + var len:number = value.length; + + for (var i:number = 0; i < len; ++i) { + light = value[i]; + light.addEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); + + if (light instanceof PointLight) { + if (light.castsShadows) + this._pCastingPointLights[numCastingPointLights++] = light; + else + this._pPointLights[numPointLights++] = light; + + } else if (light instanceof DirectionalLight) { + if (light.castsShadows) + this._pCastingDirectionalLights[numCastingDirectionalLights++] = light; + else + this._pDirectionalLights[numDirectionalLights++] = light; + + } else if (light instanceof LightProbe) { + this._pLightProbes[numLightProbes++] = light; + } + } + + if (this._pNumDirectionalLights == numDirectionalLights && this._pNumPointLights == numPointLights && this._pNumLightProbes == numLightProbes && this._pNumCastingPointLights == numCastingPointLights && this._pNumCastingDirectionalLights == numCastingDirectionalLights) + return; + + this._pNumDirectionalLights = numDirectionalLights; + this._pNumCastingDirectionalLights = numCastingDirectionalLights; + this._pNumPointLights = numPointLights; + this._pNumCastingPointLights = numCastingPointLights; + this._pNumLightProbes = numLightProbes; + + // MUST HAVE MULTIPLE OF 4 ELEMENTS! + this._pLightProbeWeights = new Array(Math.ceil(numLightProbes/4)*4); + + // notify material lights have changed + this.dispatchEvent(new Event(Event.CHANGE)); + + } + + /** + * Remove configuration change listeners on the lights. + */ + private clearListeners() + { + var len:number = this._lights.length; + for (var i:number = 0; i < len; ++i) + this._lights[i].removeEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); + } + + /** + * Notifies the material of a configuration change. + */ + private onCastShadowChange(event:LightEvent) + { + // TODO: Assign to special caster collections, just append it to the lights in SinglePass + // But keep seperated in multipass + + var light:LightBase = event.target; + + if (light instanceof PointLight) + this.updatePointCasting( light); + else if (light instanceof DirectionalLight) + this.updateDirectionalCasting( light); + + this.dispatchEvent(new Event(Event.CHANGE)); + } + + /** + * Called when a directional light's shadow casting configuration changes. + */ + private updateDirectionalCasting(light:DirectionalLight) + { + var dl:DirectionalLight = light; + + if (light.castsShadows) { + --this._pNumDirectionalLights; + ++this._pNumCastingDirectionalLights; + + + this._pDirectionalLights.splice(this._pDirectionalLights.indexOf(dl), 1); + this._pCastingDirectionalLights.push(light); + + } else { + ++this._pNumDirectionalLights; + --this._pNumCastingDirectionalLights; + + this._pCastingDirectionalLights.splice(this._pCastingDirectionalLights.indexOf(dl), 1); + this._pDirectionalLights.push(light); + } + } + + /** + * Called when a point light's shadow casting configuration changes. + */ + private updatePointCasting(light:PointLight) + { + var pl:PointLight = light; + + if (light.castsShadows) { + --this._pNumPointLights; + ++this._pNumCastingPointLights; + this._pPointLights.splice(this._pPointLights.indexOf(pl), 1); + this._pCastingPointLights.push(light); + } else { + ++this._pNumPointLights; + --this._pNumCastingPointLights; + + this._pCastingPointLights.splice(this._pCastingPointLights.indexOf(pl), 1); + this._pPointLights.push(light); + } + } +} + +export = StaticLightPicker; \ No newline at end of file diff --git a/lib/materials/passes/IMaterialPass.js b/lib/materials/passes/IMaterialPass.js new file mode 100755 index 00000000..8c4366d3 --- /dev/null +++ b/lib/materials/passes/IMaterialPass.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9wYXNzZXMvSU1hdGVyaWFsUGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQTZEdUIiLCJmaWxlIjoibWF0ZXJpYWxzL3Bhc3Nlcy9JTWF0ZXJpYWxQYXNzLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElBbmltYXRpb25TZXRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9hbmltYXRvcnMvSUFuaW1hdGlvblNldFwiKTtcbmltcG9ydCBJQW5pbWF0b3JcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2FuaW1hdG9ycy9JQW5pbWF0b3JcIik7XG5pbXBvcnQgSVN0YWdlXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9JU3RhZ2VcIik7XG5pbXBvcnQgQmxlbmRNb2RlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvQmxlbmRNb2RlXCIpO1xuaW1wb3J0IFJlY3RhbmdsZVx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1JlY3RhbmdsZVwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RcIik7XG5pbXBvcnQgSU1hdGVyaWFsUGFzc0RhdGFcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9wb29sL0lNYXRlcmlhbFBhc3NEYXRhXCIpO1xuaW1wb3J0IElSZW5kZXJhYmxlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3Bvb2wvSVJlbmRlcmFibGVcIik7XG5pbXBvcnQgQWJzdHJhY3RNZXRob2RFcnJvclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQWJzdHJhY3RNZXRob2RFcnJvclwiKTtcbmltcG9ydCBBcmd1bWVudEVycm9yXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0FyZ3VtZW50RXJyb3JcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBFdmVudFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnRcIik7XG5pbXBvcnQgSUV2ZW50RGlzcGF0Y2hlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9JRXZlbnREaXNwYXRjaGVyXCIpO1xuaW1wb3J0IExpZ2h0UGlja2VyQmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9saWdodHBpY2tlcnMvTGlnaHRQaWNrZXJCYXNlXCIpO1xuaW1wb3J0IFRleHR1cmVQcm94eUJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9UZXh0dXJlUHJveHlCYXNlXCIpO1xuXG4vKipcbiAqIE1hdGVyaWFsUGFzc0Jhc2UgcHJvdmlkZXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgbWF0ZXJpYWwgc2hhZGVyIHBhc3Nlcy4gQSBtYXRlcmlhbCBwYXNzIGNvbnN0aXR1dGVzIGF0IGxlYXN0XG4gKiBhIHJlbmRlciBjYWxsIHBlciByZXF1aXJlZCByZW5kZXJhYmxlLlxuICovXG5pbnRlcmZhY2UgSU1hdGVyaWFsUGFzcyBleHRlbmRzIElFdmVudERpc3BhdGNoZXJcbntcblx0LyoqXG5cdCAqIENsZWFucyB1cCBhbnkgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGN1cnJlbnQgb2JqZWN0LlxuXHQgKiBAcGFyYW0gZGVlcCBJbmRpY2F0ZXMgd2hldGhlciBvdGhlciByZXNvdXJjZXMgc2hvdWxkIGJlIGNsZWFuZWQgdXAsIHRoYXQgY291bGQgcG90ZW50aWFsbHkgYmUgc2hhcmVkIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGFuY2VzLlxuXHQgKi9cblx0ZGlzcG9zZSgpO1xuXG5cdC8qKlxuXHQgKiBSZW5kZXJzIGFuIG9iamVjdCB0byB0aGUgY3VycmVudCByZW5kZXIgdGFyZ2V0LlxuXHQgKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0X2lSZW5kZXIocGFzczpJTWF0ZXJpYWxQYXNzRGF0YSwgcmVuZGVyYWJsZTpJUmVuZGVyYWJsZSwgc3RhZ2U6SVN0YWdlLCBjYW1lcmE6Q2FtZXJhLCB2aWV3UHJvamVjdGlvbjpNYXRyaXgzRCk7XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHJlbmRlciBzdGF0ZSBmb3IgdGhlIHBhc3MgdGhhdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgcmVuZGVyZWQgb2JqZWN0LiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmVcblx0ICogY2FsbGluZyByZW5kZXJQYXNzLiBCZWZvcmUgYWN0aXZhdGluZyBhIHBhc3MsIHRoZSBwcmV2aW91c2x5IHVzZWQgcGFzcyBuZWVkcyB0byBiZSBkZWFjdGl2YXRlZC5cblx0ICogQHBhcmFtIHN0YWdlIFRoZSBTdGFnZSBvYmplY3Qgd2hpY2ggaXMgY3VycmVudGx5IHVzZWQgZm9yIHJlbmRlcmluZy5cblx0ICogQHBhcmFtIGNhbWVyYSBUaGUgY2FtZXJhIGZyb20gd2hpY2ggdGhlIHNjZW5lIGlzIHZpZXdlZC5cblx0ICogQHByaXZhdGVcblx0ICovXG5cdF9pQWN0aXZhdGUocGFzczpJTWF0ZXJpYWxQYXNzRGF0YSwgc3RhZ2U6SVN0YWdlLCBjYW1lcmE6Q2FtZXJhKTtcblxuXHQvKipcblx0ICogQ2xlYXJzIHRoZSByZW5kZXIgc3RhdGUgZm9yIHRoZSBwYXNzLiBUaGlzIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgYWN0aXZhdGluZyBhbm90aGVyIHBhc3MuXG5cdCAqIEBwYXJhbSBzdGFnZSBUaGUgU3RhZ2UgdXNlZCBmb3IgcmVuZGVyaW5nXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRfaURlYWN0aXZhdGUocGFzczpJTWF0ZXJpYWxQYXNzRGF0YSwgc3RhZ2U6SVN0YWdlKTtcblxuXHQvKipcblx0ICogVGhlIGxpZ2h0IHBpY2tlciB1c2VkIGJ5IHRoZSBtYXRlcmlhbCB0byBwcm92aWRlIGxpZ2h0cyB0byB0aGUgbWF0ZXJpYWwgaWYgaXQgc3VwcG9ydHMgbGlnaHRpbmcuXG5cdCAqXG5cdCAqIEBzZWUgYXdheS5tYXRlcmlhbHMuTGlnaHRQaWNrZXJCYXNlXG5cdCAqIEBzZWUgYXdheS5tYXRlcmlhbHMuU3RhdGljTGlnaHRQaWNrZXJcblx0ICovXG5cdGxpZ2h0UGlja2VyOkxpZ2h0UGlja2VyQmFzZTtcbn1cblxuZXhwb3J0ID0gSU1hdGVyaWFsUGFzczsiXX0= \ No newline at end of file diff --git a/lib/materials/passes/IMaterialPass.ts b/lib/materials/passes/IMaterialPass.ts new file mode 100644 index 00000000..bc872eb4 --- /dev/null +++ b/lib/materials/passes/IMaterialPass.ts @@ -0,0 +1,62 @@ +import IAnimationSet = require("awayjs-core/lib/animators/IAnimationSet"); +import IAnimator = require("awayjs-core/lib/animators/IAnimator"); +import IStage = require("awayjs-core/lib/core/base/IStage"); +import BlendMode = require("awayjs-core/lib/core/base/BlendMode"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import IMaterialPassData = require("awayjs-core/lib/core/pool/IMaterialPassData"); +import IRenderable = require("awayjs-core/lib/core/pool/IRenderable"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import ArgumentError = require("awayjs-core/lib/errors/ArgumentError"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import Event = require("awayjs-core/lib/events/Event"); +import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); +import LightPickerBase = require("awayjs-core/lib/materials/lightpickers/LightPickerBase"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +/** + * MaterialPassBase provides an abstract base class for material shader passes. A material pass constitutes at least + * a render call per required renderable. + */ +interface IMaterialPass extends IEventDispatcher +{ + /** + * Cleans up any resources used by the current object. + * @param deep Indicates whether other resources should be cleaned up, that could potentially be shared across different instances. + */ + dispose(); + + /** + * Renders an object to the current render target. + * + * @private + */ + _iRender(pass:IMaterialPassData, renderable:IRenderable, stage:IStage, camera:Camera, viewProjection:Matrix3D); + + /** + * Sets the render state for the pass that is independent of the rendered object. This needs to be called before + * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. + * @param stage The Stage object which is currently used for rendering. + * @param camera The camera from which the scene is viewed. + * @private + */ + _iActivate(pass:IMaterialPassData, stage:IStage, camera:Camera); + + /** + * Clears the render state for the pass. This needs to be called before activating another pass. + * @param stage The Stage used for rendering + * + * @private + */ + _iDeactivate(pass:IMaterialPassData, stage:IStage); + + /** + * The light picker used by the material to provide lights to the material if it supports lighting. + * + * @see away.materials.LightPickerBase + * @see away.materials.StaticLightPicker + */ + lightPicker:LightPickerBase; +} + +export = IMaterialPass; \ No newline at end of file diff --git a/lib/materials/shadowmappers/CascadeShadowMapper.js b/lib/materials/shadowmappers/CascadeShadowMapper.js new file mode 100755 index 00000000..da6a1509 --- /dev/null +++ b/lib/materials/shadowmappers/CascadeShadowMapper.js @@ -0,0 +1,254 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +var Camera = require("awayjs-core/lib/entities/Camera"); +var Event = require("awayjs-core/lib/events/Event"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +var DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); +var FreeMatrixProjection = require("awayjs-core/lib/projections/FreeMatrixProjection"); + +var CascadeShadowMapper = (function (_super) { + __extends(CascadeShadowMapper, _super); + function CascadeShadowMapper(numCascades) { + if (typeof numCascades === "undefined") { numCascades = 3; } + _super.call(this); + this._pScissorRectsInvalid = true; + + if (numCascades < 1 || numCascades > 4) + throw new Error("numCascades must be an integer between 1 and 4"); + + this._numCascades = numCascades; + this._changeDispatcher = new EventDispatcher(this); + this.init(); + } + CascadeShadowMapper.prototype.getSplitRatio = function (index /*uint*/ ) { + return this._splitRatios[index]; + }; + + CascadeShadowMapper.prototype.setSplitRatio = function (index /*uint*/ , value) { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + if (index >= this._numCascades) + throw new Error("index must be smaller than the number of cascades!"); + + this._splitRatios[index] = value; + }; + + CascadeShadowMapper.prototype.getDepthProjections = function (partition /*uint*/ ) { + return this._depthCameras[partition].viewProjection; + }; + + CascadeShadowMapper.prototype.init = function () { + this._splitRatios = new Array(this._numCascades); + this._nearPlaneDistances = new Array(this._numCascades); + + var s = 1; + for (var i = this._numCascades - 1; i >= 0; --i) { + this._splitRatios[i] = s; + s *= .4; + } + + this._texOffsetsX = Array(-1, 1, -1, 1); + this._texOffsetsY = Array(1, 1, -1, -1); + this._pScissorRects = new Array(4); + this._depthLenses = new Array(); + this._depthCameras = new Array(); + + for (i = 0; i < this._numCascades; ++i) { + this._depthLenses[i] = new FreeMatrixProjection(); + this._depthCameras[i] = new Camera(this._depthLenses[i]); + } + }; + + CascadeShadowMapper.prototype._pSetDepthMapSize = function (value /*uint*/ ) { + _super.prototype._pSetDepthMapSize.call(this, value); + + this.invalidateScissorRects(); + }; + + CascadeShadowMapper.prototype.invalidateScissorRects = function () { + this._pScissorRectsInvalid = true; + }; + + Object.defineProperty(CascadeShadowMapper.prototype, "numCascades", { + get: function () { + return this._numCascades; + }, + set: function (value /*int*/ ) { + if (value == this._numCascades) + return; + + if (value < 1 || value > 4) + throw new Error("numCascades must be an integer between 1 and 4"); + + this._numCascades = value; + this.invalidateScissorRects(); + this.init(); + this.dispatchEvent(new Event(Event.CHANGE)); + }, + enumerable: true, + configurable: true + }); + + + CascadeShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { + if (this._pScissorRectsInvalid) + this.updateScissorRects(); + + this._pCasterCollector.cullPlanes = this._pCullPlanes; + this._pCasterCollector.camera = this._pOverallDepthCamera; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + + renderer._iRenderCascades(this._pCasterCollector, target, this._numCascades, this._pScissorRects, this._depthCameras); + }; + + CascadeShadowMapper.prototype.updateScissorRects = function () { + var half = this._pDepthMapSize * .5; + + this._pScissorRects[0] = new Rectangle(0, 0, half, half); + this._pScissorRects[1] = new Rectangle(half, 0, half, half); + this._pScissorRects[2] = new Rectangle(0, half, half, half); + this._pScissorRects[3] = new Rectangle(half, half, half, half); + + this._pScissorRectsInvalid = false; + }; + + CascadeShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { + var matrix; + var projection = viewCamera.projection; + var projectionNear = projection.near; + var projectionRange = projection.far - projectionNear; + + this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); + this._pMatrix.appendScale(.96, .96, 1); + this._pOverallDepthProjection.matrix = this._pMatrix; + this.pUpdateCullPlanes(viewCamera); + + for (var i = 0; i < this._numCascades; ++i) { + matrix = this._depthLenses[i].matrix; + + this._nearPlaneDistances[i] = projectionNear + this._splitRatios[i] * projectionRange; + this._depthCameras[i].transform = this._pOverallDepthCamera.transform; + + this.updateProjectionPartition(matrix, this._splitRatios[i], this._texOffsetsX[i], this._texOffsetsY[i]); + + this._depthLenses[i].matrix = matrix; + } + }; + + CascadeShadowMapper.prototype.updateProjectionPartition = function (matrix, splitRatio, texOffsetX, texOffsetY) { + var raw = Matrix3DUtils.RAW_DATA_CONTAINER; + var xN, yN, zN; + var xF, yF, zF; + var minX = Number.POSITIVE_INFINITY, minY = Number.POSITIVE_INFINITY, minZ; + var maxX = Number.NEGATIVE_INFINITY, maxY = Number.NEGATIVE_INFINITY, maxZ = Number.NEGATIVE_INFINITY; + var i = 0; + + while (i < 12) { + xN = this._pLocalFrustum[i]; + yN = this._pLocalFrustum[i + 1]; + zN = this._pLocalFrustum[i + 2]; + xF = xN + (this._pLocalFrustum[i + 12] - xN) * splitRatio; + yF = yN + (this._pLocalFrustum[i + 13] - yN) * splitRatio; + zF = zN + (this._pLocalFrustum[i + 14] - zN) * splitRatio; + if (xN < minX) + minX = xN; + if (xN > maxX) + maxX = xN; + if (yN < minY) + minY = yN; + if (yN > maxY) + maxY = yN; + if (zN > maxZ) + maxZ = zN; + if (xF < minX) + minX = xF; + if (xF > maxX) + maxX = xF; + if (yF < minY) + minY = yF; + if (yF > maxY) + maxY = yF; + if (zF > maxZ) + maxZ = zF; + i += 3; + } + + minZ = 1; + + var w = (maxX - minX); + var h = (maxY - minY); + var d = 1 / (maxZ - minZ); + + if (minX < 0) + minX -= this._pSnap; // because int() rounds up for < 0 + if (minY < 0) + minY -= this._pSnap; + minX = Math.floor(minX / this._pSnap) * this._pSnap; + minY = Math.floor(minY / this._pSnap) * this._pSnap; + + var snap2 = 2 * this._pSnap; + w = Math.floor(w / snap2 + 1) * snap2; + h = Math.floor(h / snap2 + 1) * snap2; + + maxX = minX + w; + maxY = minY + h; + + w = 1 / w; + h = 1 / h; + + raw[0] = 2 * w; + raw[5] = 2 * h; + raw[10] = d; + raw[12] = -(maxX + minX) * w; + raw[13] = -(maxY + minY) * h; + raw[14] = -minZ * d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + + matrix.copyRawDataFrom(raw); + matrix.appendScale(.96, .96, 1); + matrix.appendTranslation(texOffsetX, texOffsetY, 0); + matrix.appendScale(.5, .5, 1); + }; + + CascadeShadowMapper.prototype.addEventListener = function (type, listener) { + this._changeDispatcher.addEventListener(type, listener); + }; + + CascadeShadowMapper.prototype.removeEventListener = function (type, listener) { + this._changeDispatcher.removeEventListener(type, listener); + }; + + CascadeShadowMapper.prototype.dispatchEvent = function (event) { + return this._changeDispatcher.dispatchEvent(event); + }; + + CascadeShadowMapper.prototype.hasEventListener = function (type) { + return this._changeDispatcher.hasEventListener(type); + }; + + Object.defineProperty(CascadeShadowMapper.prototype, "_iNearPlaneDistances", { + get: function () { + return this._nearPlaneDistances; + }, + enumerable: true, + configurable: true + }); + return CascadeShadowMapper; +})(DirectionalShadowMapper); + +module.exports = CascadeShadowMapper; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9zaGFkb3dtYXBwZXJzL0Nhc2NhZGVTaGFkb3dNYXBwZXIudHMiXSwibmFtZXMiOlsiQ2FzY2FkZVNoYWRvd01hcHBlciIsIkNhc2NhZGVTaGFkb3dNYXBwZXIuY29uc3RydWN0b3IiLCJDYXNjYWRlU2hhZG93TWFwcGVyLmdldFNwbGl0UmF0aW8iLCJDYXNjYWRlU2hhZG93TWFwcGVyLnNldFNwbGl0UmF0aW8iLCJDYXNjYWRlU2hhZG93TWFwcGVyLmdldERlcHRoUHJvamVjdGlvbnMiLCJDYXNjYWRlU2hhZG93TWFwcGVyLmluaXQiLCJDYXNjYWRlU2hhZG93TWFwcGVyLl9wU2V0RGVwdGhNYXBTaXplIiwiQ2FzY2FkZVNoYWRvd01hcHBlci5pbnZhbGlkYXRlU2Npc3NvclJlY3RzIiwiQ2FzY2FkZVNoYWRvd01hcHBlci5wRHJhd0RlcHRoTWFwIiwiQ2FzY2FkZVNoYWRvd01hcHBlci51cGRhdGVTY2lzc29yUmVjdHMiLCJDYXNjYWRlU2hhZG93TWFwcGVyLnBVcGRhdGVEZXB0aFByb2plY3Rpb24iLCJDYXNjYWRlU2hhZG93TWFwcGVyLnVwZGF0ZVByb2plY3Rpb25QYXJ0aXRpb24iLCJDYXNjYWRlU2hhZG93TWFwcGVyLmFkZEV2ZW50TGlzdGVuZXIiLCJDYXNjYWRlU2hhZG93TWFwcGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIiLCJDYXNjYWRlU2hhZG93TWFwcGVyLmRpc3BhdGNoRXZlbnQiLCJDYXNjYWRlU2hhZG93TWFwcGVyLmhhc0V2ZW50TGlzdGVuZXIiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHNFQUU2RTtBQUM3RSw4REFBc0U7O0FBRXRFLHVEQUFnRTtBQUNoRSxtREFBNEQ7QUFDNUQsdUVBQThFOztBQUU5RSx3R0FBNkc7QUFDN0csc0ZBQTRGOztBQUs1RjtJQUFrQ0Esc0NBQXVCQTtJQWdCeERBLDZCQUFZQSxXQUErQkE7UUFBL0JDLDBDQUFBQSxXQUFXQSxHQUFtQkEsQ0FBQ0E7QUFBQUEsUUFFMUNBLFdBQU1BLEtB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QUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUMvQkEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7WUFDL0JBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEdBQUNBLFVBQVVBO1lBQ3ZEQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxHQUFDQSxVQUFVQTtZQUN2REEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsVUFBVUE7WUFDdkRBLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBO2dCQUNaQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtZQUNYQSxJQUFJQSxFQUFFQSxHQUFHQSxJQUFJQTtnQkFDWkEsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0E7WUFDWEEsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUE7Z0JBQ1pBLElBQUlBLEdBQUdBLEVBQUVBLENBQUNBO1lBQ1hBLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBO2dCQUNaQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtZQUNYQSxJQUFJQSxFQUFFQSxHQUFHQSxJQUFJQTtnQkFDWkEsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0E7WUFDWEEsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUE7Z0JBQ1pBLElBQUlBLEdBQUdBLEVBQUVBLENBQUNBO1lBQ1hBLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBO2dCQUNaQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtZQUNYQSxJQUFJQSxFQUFFQSxHQUFHQSxJQUFJQTtnQkFDWkEsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0E7WUFDWEEsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUE7Z0JBQ1pBLElBQUlBLEdBQUdBLEVBQUVBLENBQUNBO1lBQ1hBLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBO2dCQUNaQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtZQUNYQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNOQTs7UUFFREEsSUFBSUEsR0FBR0EsQ0FBQ0E7O1FBRVJBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBO1FBQzVCQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQTtRQUM1QkEsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0E7O1FBRTlCQSxJQUFJQSxJQUFJQSxHQUFHQSxDQUFDQTtZQUNYQSxJQUFJQSxJQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxFQUFFQSxrQ0FBa0NBO0FBQW5DQSxRQUNyQkEsSUFBSUEsSUFBSUEsR0FBR0EsQ0FBQ0E7WUFDWEEsSUFBSUEsSUFBSUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7UUFDckJBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BO1FBQy9DQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQTs7UUFFL0NBLElBQUlBLEtBQUtBLEdBQVVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BO1FBQ2hDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxHQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxLQUFLQTtRQUNqQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsS0FBS0E7O1FBRWpDQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQTtRQUNmQSxJQUFJQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQTs7UUFFZkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7UUFDUEEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7O1FBRVBBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBO1FBQ1pBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBO1FBQ1pBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1hBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLEdBQUNBLENBQUNBO1FBQzFCQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUMxQkEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0E7UUFDakJBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1hBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztRQUVuRkEsTUFBTUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDM0JBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBLENBQUNBO1FBQy9CQSxNQUFNQSxDQUFDQSxpQkFBaUJBLENBQUNBLFVBQVVBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBLENBQUNBO1FBQ25EQSxNQUFNQSxDQUFDQSxXQUFXQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtJQUM5QkEsQ0FBQ0E7O0lBRURYLGlEQUFBQSxVQUF3QkEsSUFBV0EsRUFBRUEsUUFBaUJBO1FBRXJEWSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsSUFBSUEsRUFBRUEsUUFBUUEsQ0FBQ0E7SUFDeERBLENBQUNBOztJQUVEWixvREFBQUEsVUFBMkJBLElBQVdBLEVBQUVBLFFBQWlCQTtRQUV4RGEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxtQkFBbUJBLENBQUNBLElBQUlBLEVBQUVBLFFBQVFBLENBQUNBO0lBQzNEQSxDQUFDQTs7SUFFRGIsOENBQUFBLFVBQXFCQSxLQUFXQTtRQUUvQmMsT0FBT0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQTtJQUNuREEsQ0FBQ0E7O0lBRURkLGlEQUFBQSxVQUF3QkEsSUFBV0E7UUFFbENlLE9BQU9BLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQTtJQUNyREEsQ0FBQ0E7O0lBRURmO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLG1CQUFtQkE7UUFDaENBLENBQUNBOzs7O0FBQUFBLElBQ0ZBLDJCQUFDQTtBQUFEQSxDQUFDQSxFQS9QaUMsdUJBQXVCLEVBK1B4RDs7QUFFRCxvQ0FBNkIsQ0FBQSIsImZpbGUiOiJtYXRlcmlhbHMvc2hhZG93bWFwcGVycy9DYXNjYWRlU2hhZG93TWFwcGVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNjZW5lXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRhaW5lcnMvU2NlbmVcIik7XG5pbXBvcnQgTWF0cml4M0RcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IE1hdHJpeDNEVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RVdGlsc1wiKTtcbmltcG9ydCBSZWN0YW5nbGVcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9SZWN0YW5nbGVcIik7XG5pbXBvcnQgSVJlbmRlcmVyXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9JUmVuZGVyZXJcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBFdmVudFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnRcIik7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiKTtcbmltcG9ydCBJRXZlbnREaXNwYXRjaGVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0lFdmVudERpc3BhdGNoZXJcIik7XG5pbXBvcnQgRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXJcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9zaGFkb3dtYXBwZXJzL0RpcmVjdGlvbmFsU2hhZG93TWFwcGVyXCIpO1xuaW1wb3J0IEZyZWVNYXRyaXhQcm9qZWN0aW9uXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3Byb2plY3Rpb25zL0ZyZWVNYXRyaXhQcm9qZWN0aW9uXCIpO1xuaW1wb3J0IElQcm9qZWN0aW9uXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9JUHJvamVjdGlvblwiKTtcbmltcG9ydCBSZW5kZXJUZXh0dXJlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvUmVuZGVyVGV4dHVyZVwiKTtcbmltcG9ydCBUZXh0dXJlUHJveHlCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvVGV4dHVyZVByb3h5QmFzZVwiKTtcblxuY2xhc3MgQ2FzY2FkZVNoYWRvd01hcHBlciBleHRlbmRzIERpcmVjdGlvbmFsU2hhZG93TWFwcGVyIGltcGxlbWVudHMgSUV2ZW50RGlzcGF0Y2hlclxue1xuXHRwdWJsaWMgX3BTY2lzc29yUmVjdHM6UmVjdGFuZ2xlW107XG5cdHByaXZhdGUgX3BTY2lzc29yUmVjdHNJbnZhbGlkOmJvb2xlYW4gPSB0cnVlO1xuXHRwcml2YXRlIF9zcGxpdFJhdGlvczpudW1iZXJbXTtcblxuXHRwcml2YXRlIF9udW1DYXNjYWRlczpudW1iZXIgLyppbnQqLztcblx0cHJpdmF0ZSBfZGVwdGhDYW1lcmFzOkFycmF5PENhbWVyYT47XG5cdHByaXZhdGUgX2RlcHRoTGVuc2VzOkFycmF5PEZyZWVNYXRyaXhQcm9qZWN0aW9uPjtcblxuXHRwcml2YXRlIF90ZXhPZmZzZXRzWDpBcnJheTxudW1iZXI+O1xuXHRwcml2YXRlIF90ZXhPZmZzZXRzWTpBcnJheTxudW1iZXI+O1xuXG5cdHByaXZhdGUgX2NoYW5nZURpc3BhdGNoZXI6RXZlbnREaXNwYXRjaGVyO1xuXHRwcml2YXRlIF9uZWFyUGxhbmVEaXN0YW5jZXM6bnVtYmVyW107XG5cblx0Y29uc3RydWN0b3IobnVtQ2FzY2FkZXM6bnVtYmVyIC8qdWludCovID0gMylcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHRpZiAobnVtQ2FzY2FkZXMgPCAxIHx8IG51bUNhc2NhZGVzID4gNClcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIm51bUNhc2NhZGVzIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDRcIik7XG5cblx0XHR0aGlzLl9udW1DYXNjYWRlcyA9IG51bUNhc2NhZGVzO1xuXHRcdHRoaXMuX2NoYW5nZURpc3BhdGNoZXIgPSBuZXcgRXZlbnREaXNwYXRjaGVyKHRoaXMpO1xuXHRcdHRoaXMuaW5pdCgpO1xuXHR9XG5cblx0cHVibGljIGdldFNwbGl0UmF0aW8oaW5kZXg6bnVtYmVyIC8qdWludCovKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zcGxpdFJhdGlvc1tpbmRleF07XG5cdH1cblxuXHRwdWJsaWMgc2V0U3BsaXRSYXRpbyhpbmRleDpudW1iZXIgLyp1aW50Ki8sIHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA8IDApXG5cdFx0XHR2YWx1ZSA9IDA7XG5cdFx0ZWxzZSBpZiAodmFsdWUgPiAxKVxuXHRcdFx0dmFsdWUgPSAxO1xuXG5cdFx0aWYgKGluZGV4ID49IHRoaXMuX251bUNhc2NhZGVzKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiaW5kZXggbXVzdCBiZSBzbWFsbGVyIHRoYW4gdGhlIG51bWJlciBvZiBjYXNjYWRlcyFcIik7XG5cblx0XHR0aGlzLl9zcGxpdFJhdGlvc1tpbmRleF0gPSB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXREZXB0aFByb2plY3Rpb25zKHBhcnRpdGlvbjpudW1iZXIgLyp1aW50Ki8pOk1hdHJpeDNEXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGVwdGhDYW1lcmFzW3BhcnRpdGlvbl0udmlld1Byb2plY3Rpb247XG5cdH1cblxuXHRwcml2YXRlIGluaXQoKVxuXHR7XG5cdFx0dGhpcy5fc3BsaXRSYXRpb3MgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLl9udW1DYXNjYWRlcyk7XG5cdFx0dGhpcy5fbmVhclBsYW5lRGlzdGFuY2VzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5fbnVtQ2FzY2FkZXMpO1xuXG5cdFx0dmFyIHM6bnVtYmVyID0gMTtcblx0XHRmb3IgKHZhciBpOm51bWJlciAvKmludCovID0gdGhpcy5fbnVtQ2FzY2FkZXMgLSAxOyBpID49IDA7IC0taSkge1xuXHRcdFx0dGhpcy5fc3BsaXRSYXRpb3NbaV0gPSBzO1xuXHRcdFx0cyAqPSAuNDtcblx0XHR9XG5cblx0XHR0aGlzLl90ZXhPZmZzZXRzWCA9IEFycmF5PG51bWJlcj4oLTEsIDEsIC0xLCAxKTtcblx0XHR0aGlzLl90ZXhPZmZzZXRzWSA9IEFycmF5PG51bWJlcj4oMSwgMSwgLTEsIC0xKTtcblx0XHR0aGlzLl9wU2Npc3NvclJlY3RzID0gbmV3IEFycmF5PFJlY3RhbmdsZT4oNCk7XG5cdFx0dGhpcy5fZGVwdGhMZW5zZXMgPSBuZXcgQXJyYXk8RnJlZU1hdHJpeFByb2plY3Rpb24+KCk7XG5cdFx0dGhpcy5fZGVwdGhDYW1lcmFzID0gbmV3IEFycmF5PENhbWVyYT4oKTtcblxuXHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLl9udW1DYXNjYWRlczsgKytpKSB7XG5cdFx0XHR0aGlzLl9kZXB0aExlbnNlc1tpXSA9IG5ldyBGcmVlTWF0cml4UHJvamVjdGlvbigpO1xuXHRcdFx0dGhpcy5fZGVwdGhDYW1lcmFzW2ldID0gbmV3IENhbWVyYSh0aGlzLl9kZXB0aExlbnNlc1tpXSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIF9wU2V0RGVwdGhNYXBTaXplKHZhbHVlOm51bWJlciAvKnVpbnQqLylcblx0e1xuXHRcdHN1cGVyLl9wU2V0RGVwdGhNYXBTaXplKHZhbHVlKTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZVNjaXNzb3JSZWN0cygpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbnZhbGlkYXRlU2Npc3NvclJlY3RzKClcblx0e1xuXHRcdHRoaXMuX3BTY2lzc29yUmVjdHNJbnZhbGlkID0gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbnVtQ2FzY2FkZXMoKTpudW1iZXIgLyppbnQqL1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX251bUNhc2NhZGVzO1xuXHR9XG5cblx0cHVibGljIHNldCBudW1DYXNjYWRlcyh2YWx1ZTpudW1iZXIgLyppbnQqLylcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9udW1DYXNjYWRlcylcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICh2YWx1ZSA8IDEgfHwgdmFsdWUgPiA0KVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwibnVtQ2FzY2FkZXMgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgNFwiKTtcblxuXHRcdHRoaXMuX251bUNhc2NhZGVzID0gdmFsdWU7XG5cdFx0dGhpcy5pbnZhbGlkYXRlU2Npc3NvclJlY3RzKCk7XG5cdFx0dGhpcy5pbml0KCk7XG5cdFx0dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChFdmVudC5DSEFOR0UpKTtcblx0fVxuXG5cdHB1YmxpYyBwRHJhd0RlcHRoTWFwKHRhcmdldDpSZW5kZXJUZXh0dXJlLCBzY2VuZTpTY2VuZSwgcmVuZGVyZXI6SVJlbmRlcmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BTY2lzc29yUmVjdHNJbnZhbGlkKVxuXHRcdFx0dGhpcy51cGRhdGVTY2lzc29yUmVjdHMoKTtcblxuXHRcdHRoaXMuX3BDYXN0ZXJDb2xsZWN0b3IuY3VsbFBsYW5lcyA9IHRoaXMuX3BDdWxsUGxhbmVzO1xuXHRcdHRoaXMuX3BDYXN0ZXJDb2xsZWN0b3IuY2FtZXJhID0gdGhpcy5fcE92ZXJhbGxEZXB0aENhbWVyYTtcblx0XHR0aGlzLl9wQ2FzdGVyQ29sbGVjdG9yLmNsZWFyKCk7XG5cdFx0c2NlbmUudHJhdmVyc2VQYXJ0aXRpb25zKHRoaXMuX3BDYXN0ZXJDb2xsZWN0b3IpO1xuXG5cdFx0cmVuZGVyZXIuX2lSZW5kZXJDYXNjYWRlcyh0aGlzLl9wQ2FzdGVyQ29sbGVjdG9yLCB0YXJnZXQsIHRoaXMuX251bUNhc2NhZGVzLCB0aGlzLl9wU2Npc3NvclJlY3RzLCB0aGlzLl9kZXB0aENhbWVyYXMpO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVTY2lzc29yUmVjdHMoKVxuXHR7XG5cdFx0dmFyIGhhbGY6bnVtYmVyID0gdGhpcy5fcERlcHRoTWFwU2l6ZSouNTtcblxuXHRcdHRoaXMuX3BTY2lzc29yUmVjdHNbMF0gPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIGhhbGYsIGhhbGYpO1xuXHRcdHRoaXMuX3BTY2lzc29yUmVjdHNbMV0gPSBuZXcgUmVjdGFuZ2xlKGhhbGYsIDAsIGhhbGYsIGhhbGYpO1xuXHRcdHRoaXMuX3BTY2lzc29yUmVjdHNbMl0gPSBuZXcgUmVjdGFuZ2xlKDAsIGhhbGYsIGhhbGYsIGhhbGYpO1xuXHRcdHRoaXMuX3BTY2lzc29yUmVjdHNbM10gPSBuZXcgUmVjdGFuZ2xlKGhhbGYsIGhhbGYsIGhhbGYsIGhhbGYpO1xuXG5cdFx0dGhpcy5fcFNjaXNzb3JSZWN0c0ludmFsaWQgPSBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBwVXBkYXRlRGVwdGhQcm9qZWN0aW9uKHZpZXdDYW1lcmE6Q2FtZXJhKVxuXHR7XG5cdFx0dmFyIG1hdHJpeDpNYXRyaXgzRDtcblx0XHR2YXIgcHJvamVjdGlvbjpJUHJvamVjdGlvbiA9IHZpZXdDYW1lcmEucHJvamVjdGlvbjtcblx0XHR2YXIgcHJvamVjdGlvbk5lYXI6bnVtYmVyID0gcHJvamVjdGlvbi5uZWFyO1xuXHRcdHZhciBwcm9qZWN0aW9uUmFuZ2U6bnVtYmVyID0gcHJvamVjdGlvbi5mYXIgLSBwcm9qZWN0aW9uTmVhcjtcblxuXHRcdHRoaXMucFVwZGF0ZVByb2plY3Rpb25Gcm9tRnJ1c3R1bUNvcm5lcnModmlld0NhbWVyYSwgdmlld0NhbWVyYS5wcm9qZWN0aW9uLmZydXN0dW1Db3JuZXJzLCB0aGlzLl9wTWF0cml4KTtcblx0XHR0aGlzLl9wTWF0cml4LmFwcGVuZFNjYWxlKC45NiwgLjk2LCAxKTtcblx0XHR0aGlzLl9wT3ZlcmFsbERlcHRoUHJvamVjdGlvbi5tYXRyaXggPSB0aGlzLl9wTWF0cml4O1xuXHRcdHRoaXMucFVwZGF0ZUN1bGxQbGFuZXModmlld0NhbWVyYSk7XG5cblx0XHRmb3IgKHZhciBpOm51bWJlciAvKmludCovID0gMDsgaSA8IHRoaXMuX251bUNhc2NhZGVzOyArK2kpIHtcblx0XHRcdG1hdHJpeCA9IHRoaXMuX2RlcHRoTGVuc2VzW2ldLm1hdHJpeDtcblxuXHRcdFx0dGhpcy5fbmVhclBsYW5lRGlzdGFuY2VzW2ldID0gcHJvamVjdGlvbk5lYXIgKyB0aGlzLl9zcGxpdFJhdGlvc1tpXSpwcm9qZWN0aW9uUmFuZ2U7XG5cdFx0XHR0aGlzLl9kZXB0aENhbWVyYXNbaV0udHJhbnNmb3JtID0gdGhpcy5fcE92ZXJhbGxEZXB0aENhbWVyYS50cmFuc2Zvcm07XG5cblx0XHRcdHRoaXMudXBkYXRlUHJvamVjdGlvblBhcnRpdGlvbihtYXRyaXgsIHRoaXMuX3NwbGl0UmF0aW9zW2ldLCB0aGlzLl90ZXhPZmZzZXRzWFtpXSwgdGhpcy5fdGV4T2Zmc2V0c1lbaV0pO1xuXG5cdFx0XHR0aGlzLl9kZXB0aExlbnNlc1tpXS5tYXRyaXggPSBtYXRyaXg7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVQcm9qZWN0aW9uUGFydGl0aW9uKG1hdHJpeDpNYXRyaXgzRCwgc3BsaXRSYXRpbzpudW1iZXIsIHRleE9mZnNldFg6bnVtYmVyLCB0ZXhPZmZzZXRZOm51bWJlcilcblx0e1xuXHRcdHZhciByYXc6QXJyYXk8bnVtYmVyPiA9IE1hdHJpeDNEVXRpbHMuUkFXX0RBVEFfQ09OVEFJTkVSO1xuXHRcdHZhciB4TjpudW1iZXIsIHlOOm51bWJlciwgek46bnVtYmVyO1xuXHRcdHZhciB4RjpudW1iZXIsIHlGOm51bWJlciwgekY6bnVtYmVyO1xuXHRcdHZhciBtaW5YOm51bWJlciA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgbWluWTpudW1iZXIgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIG1pblo6bnVtYmVyO1xuXHRcdHZhciBtYXhYOm51bWJlciA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSwgbWF4WTpudW1iZXIgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksIG1heFo6bnVtYmVyID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXHRcdHZhciBpOm51bWJlciAvKnVpbnQqLyA9IDA7XG5cblx0XHR3aGlsZSAoaSA8IDEyKSB7XG5cdFx0XHR4TiA9IHRoaXMuX3BMb2NhbEZydXN0dW1baV07XG5cdFx0XHR5TiA9IHRoaXMuX3BMb2NhbEZydXN0dW1baSArIDFdO1xuXHRcdFx0ek4gPSB0aGlzLl9wTG9jYWxGcnVzdHVtW2kgKyAyXTtcblx0XHRcdHhGID0geE4gKyAodGhpcy5fcExvY2FsRnJ1c3R1bVtpICsgMTJdIC0geE4pKnNwbGl0UmF0aW87XG5cdFx0XHR5RiA9IHlOICsgKHRoaXMuX3BMb2NhbEZydXN0dW1baSArIDEzXSAtIHlOKSpzcGxpdFJhdGlvO1xuXHRcdFx0ekYgPSB6TiArICh0aGlzLl9wTG9jYWxGcnVzdHVtW2kgKyAxNF0gLSB6Tikqc3BsaXRSYXRpbztcblx0XHRcdGlmICh4TiA8IG1pblgpXG5cdFx0XHRcdG1pblggPSB4Tjtcblx0XHRcdGlmICh4TiA+IG1heFgpXG5cdFx0XHRcdG1heFggPSB4Tjtcblx0XHRcdGlmICh5TiA8IG1pblkpXG5cdFx0XHRcdG1pblkgPSB5Tjtcblx0XHRcdGlmICh5TiA+IG1heFkpXG5cdFx0XHRcdG1heFkgPSB5Tjtcblx0XHRcdGlmICh6TiA+IG1heFopXG5cdFx0XHRcdG1heFogPSB6Tjtcblx0XHRcdGlmICh4RiA8IG1pblgpXG5cdFx0XHRcdG1pblggPSB4Rjtcblx0XHRcdGlmICh4RiA+IG1heFgpXG5cdFx0XHRcdG1heFggPSB4Rjtcblx0XHRcdGlmICh5RiA8IG1pblkpXG5cdFx0XHRcdG1pblkgPSB5Rjtcblx0XHRcdGlmICh5RiA+IG1heFkpXG5cdFx0XHRcdG1heFkgPSB5Rjtcblx0XHRcdGlmICh6RiA+IG1heFopXG5cdFx0XHRcdG1heFogPSB6Rjtcblx0XHRcdGkgKz0gMztcblx0XHR9XG5cblx0XHRtaW5aID0gMTtcblxuXHRcdHZhciB3Om51bWJlciA9IChtYXhYIC0gbWluWCk7XG5cdFx0dmFyIGg6bnVtYmVyID0gKG1heFkgLSBtaW5ZKTtcblx0XHR2YXIgZDpudW1iZXIgPSAxLyhtYXhaIC0gbWluWik7XG5cblx0XHRpZiAobWluWCA8IDApXG5cdFx0XHRtaW5YIC09IHRoaXMuX3BTbmFwOyAvLyBiZWNhdXNlIGludCgpIHJvdW5kcyB1cCBmb3IgPCAwXG5cdFx0aWYgKG1pblkgPCAwKVxuXHRcdFx0bWluWSAtPSB0aGlzLl9wU25hcDtcblx0XHRtaW5YID0gTWF0aC5mbG9vcihtaW5YL3RoaXMuX3BTbmFwKSp0aGlzLl9wU25hcDtcblx0XHRtaW5ZID0gTWF0aC5mbG9vcihtaW5ZL3RoaXMuX3BTbmFwKSp0aGlzLl9wU25hcDtcblxuXHRcdHZhciBzbmFwMjpudW1iZXIgPSAyKnRoaXMuX3BTbmFwO1xuXHRcdHcgPSBNYXRoLmZsb29yKHcvc25hcDIgKyAxKSpzbmFwMjtcblx0XHRoID0gTWF0aC5mbG9vcihoL3NuYXAyICsgMSkqc25hcDI7XG5cblx0XHRtYXhYID0gbWluWCArIHc7XG5cdFx0bWF4WSA9IG1pblkgKyBoO1xuXG5cdFx0dyA9IDEvdztcblx0XHRoID0gMS9oO1xuXG5cdFx0cmF3WzBdID0gMip3O1xuXHRcdHJhd1s1XSA9IDIqaDtcblx0XHRyYXdbMTBdID0gZDtcblx0XHRyYXdbMTJdID0gLShtYXhYICsgbWluWCkqdztcblx0XHRyYXdbMTNdID0gLShtYXhZICsgbWluWSkqaDtcblx0XHRyYXdbMTRdID0gLW1pbloqZDtcblx0XHRyYXdbMTVdID0gMTtcblx0XHRyYXdbMV0gPSByYXdbMl0gPSByYXdbM10gPSByYXdbNF0gPSByYXdbNl0gPSByYXdbN10gPSByYXdbOF0gPSByYXdbOV0gPSByYXdbMTFdID0gMDtcblxuXHRcdG1hdHJpeC5jb3B5UmF3RGF0YUZyb20ocmF3KTtcblx0XHRtYXRyaXguYXBwZW5kU2NhbGUoLjk2LCAuOTYsIDEpO1xuXHRcdG1hdHJpeC5hcHBlbmRUcmFuc2xhdGlvbih0ZXhPZmZzZXRYLCB0ZXhPZmZzZXRZLCAwKTtcblx0XHRtYXRyaXguYXBwZW5kU2NhbGUoLjUsIC41LCAxKTtcblx0fVxuXG5cdHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nLCBsaXN0ZW5lcjpGdW5jdGlvbilcblx0e1xuXHRcdHRoaXMuX2NoYW5nZURpc3BhdGNoZXIuYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcik7XG5cdH1cblxuXHRwdWJsaWMgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOnN0cmluZywgbGlzdGVuZXI6RnVuY3Rpb24pXG5cdHtcblx0XHR0aGlzLl9jaGFuZ2VEaXNwYXRjaGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgbGlzdGVuZXIpO1xuXHR9XG5cblx0cHVibGljIGRpc3BhdGNoRXZlbnQoZXZlbnQ6RXZlbnQpXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2hhbmdlRGlzcGF0Y2hlci5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcblx0fVxuXG5cdHB1YmxpYyBoYXNFdmVudExpc3RlbmVyKHR5cGU6c3RyaW5nKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fY2hhbmdlRGlzcGF0Y2hlci5oYXNFdmVudExpc3RlbmVyKHR5cGUpO1xuXHR9XG5cblx0Z2V0IF9pTmVhclBsYW5lRGlzdGFuY2VzKCk6QXJyYXk8bnVtYmVyPlxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX25lYXJQbGFuZURpc3RhbmNlcztcblx0fVxufVxuXG5leHBvcnQgPSBDYXNjYWRlU2hhZG93TWFwcGVyOyJdfQ== \ No newline at end of file diff --git a/lib/materials/shadowmappers/CascadeShadowMapper.ts b/lib/materials/shadowmappers/CascadeShadowMapper.ts new file mode 100644 index 00000000..58d6a0d3 --- /dev/null +++ b/lib/materials/shadowmappers/CascadeShadowMapper.ts @@ -0,0 +1,273 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Matrix3DUtils = require("awayjs-core/lib/core/geom/Matrix3DUtils"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import Event = require("awayjs-core/lib/events/Event"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); +import DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); +import FreeMatrixProjection = require("awayjs-core/lib/projections/FreeMatrixProjection"); +import IProjection = require("awayjs-core/lib/projections/IProjection"); +import RenderTexture = require("awayjs-core/lib/textures/RenderTexture"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +class CascadeShadowMapper extends DirectionalShadowMapper implements IEventDispatcher +{ + public _pScissorRects:Rectangle[]; + private _pScissorRectsInvalid:boolean = true; + private _splitRatios:number[]; + + private _numCascades:number /*int*/; + private _depthCameras:Array; + private _depthLenses:Array; + + private _texOffsetsX:Array; + private _texOffsetsY:Array; + + private _changeDispatcher:EventDispatcher; + private _nearPlaneDistances:number[]; + + constructor(numCascades:number /*uint*/ = 3) + { + super(); + + if (numCascades < 1 || numCascades > 4) + throw new Error("numCascades must be an integer between 1 and 4"); + + this._numCascades = numCascades; + this._changeDispatcher = new EventDispatcher(this); + this.init(); + } + + public getSplitRatio(index:number /*uint*/):number + { + return this._splitRatios[index]; + } + + public setSplitRatio(index:number /*uint*/, value:number) + { + if (value < 0) + value = 0; + else if (value > 1) + value = 1; + + if (index >= this._numCascades) + throw new Error("index must be smaller than the number of cascades!"); + + this._splitRatios[index] = value; + } + + public getDepthProjections(partition:number /*uint*/):Matrix3D + { + return this._depthCameras[partition].viewProjection; + } + + private init() + { + this._splitRatios = new Array(this._numCascades); + this._nearPlaneDistances = new Array(this._numCascades); + + var s:number = 1; + for (var i:number /*int*/ = this._numCascades - 1; i >= 0; --i) { + this._splitRatios[i] = s; + s *= .4; + } + + this._texOffsetsX = Array(-1, 1, -1, 1); + this._texOffsetsY = Array(1, 1, -1, -1); + this._pScissorRects = new Array(4); + this._depthLenses = new Array(); + this._depthCameras = new Array(); + + for (i = 0; i < this._numCascades; ++i) { + this._depthLenses[i] = new FreeMatrixProjection(); + this._depthCameras[i] = new Camera(this._depthLenses[i]); + } + } + + public _pSetDepthMapSize(value:number /*uint*/) + { + super._pSetDepthMapSize(value); + + this.invalidateScissorRects(); + } + + private invalidateScissorRects() + { + this._pScissorRectsInvalid = true; + } + + public get numCascades():number /*int*/ + { + return this._numCascades; + } + + public set numCascades(value:number /*int*/) + { + if (value == this._numCascades) + return; + + if (value < 1 || value > 4) + throw new Error("numCascades must be an integer between 1 and 4"); + + this._numCascades = value; + this.invalidateScissorRects(); + this.init(); + this.dispatchEvent(new Event(Event.CHANGE)); + } + + public pDrawDepthMap(target:RenderTexture, scene:Scene, renderer:IRenderer) + { + if (this._pScissorRectsInvalid) + this.updateScissorRects(); + + this._pCasterCollector.cullPlanes = this._pCullPlanes; + this._pCasterCollector.camera = this._pOverallDepthCamera; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + + renderer._iRenderCascades(this._pCasterCollector, target, this._numCascades, this._pScissorRects, this._depthCameras); + } + + private updateScissorRects() + { + var half:number = this._pDepthMapSize*.5; + + this._pScissorRects[0] = new Rectangle(0, 0, half, half); + this._pScissorRects[1] = new Rectangle(half, 0, half, half); + this._pScissorRects[2] = new Rectangle(0, half, half, half); + this._pScissorRects[3] = new Rectangle(half, half, half, half); + + this._pScissorRectsInvalid = false; + } + + public pUpdateDepthProjection(viewCamera:Camera) + { + var matrix:Matrix3D; + var projection:IProjection = viewCamera.projection; + var projectionNear:number = projection.near; + var projectionRange:number = projection.far - projectionNear; + + this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); + this._pMatrix.appendScale(.96, .96, 1); + this._pOverallDepthProjection.matrix = this._pMatrix; + this.pUpdateCullPlanes(viewCamera); + + for (var i:number /*int*/ = 0; i < this._numCascades; ++i) { + matrix = this._depthLenses[i].matrix; + + this._nearPlaneDistances[i] = projectionNear + this._splitRatios[i]*projectionRange; + this._depthCameras[i].transform = this._pOverallDepthCamera.transform; + + this.updateProjectionPartition(matrix, this._splitRatios[i], this._texOffsetsX[i], this._texOffsetsY[i]); + + this._depthLenses[i].matrix = matrix; + } + } + + private updateProjectionPartition(matrix:Matrix3D, splitRatio:number, texOffsetX:number, texOffsetY:number) + { + var raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER; + var xN:number, yN:number, zN:number; + var xF:number, yF:number, zF:number; + var minX:number = Number.POSITIVE_INFINITY, minY:number = Number.POSITIVE_INFINITY, minZ:number; + var maxX:number = Number.NEGATIVE_INFINITY, maxY:number = Number.NEGATIVE_INFINITY, maxZ:number = Number.NEGATIVE_INFINITY; + var i:number /*uint*/ = 0; + + while (i < 12) { + xN = this._pLocalFrustum[i]; + yN = this._pLocalFrustum[i + 1]; + zN = this._pLocalFrustum[i + 2]; + xF = xN + (this._pLocalFrustum[i + 12] - xN)*splitRatio; + yF = yN + (this._pLocalFrustum[i + 13] - yN)*splitRatio; + zF = zN + (this._pLocalFrustum[i + 14] - zN)*splitRatio; + if (xN < minX) + minX = xN; + if (xN > maxX) + maxX = xN; + if (yN < minY) + minY = yN; + if (yN > maxY) + maxY = yN; + if (zN > maxZ) + maxZ = zN; + if (xF < minX) + minX = xF; + if (xF > maxX) + maxX = xF; + if (yF < minY) + minY = yF; + if (yF > maxY) + maxY = yF; + if (zF > maxZ) + maxZ = zF; + i += 3; + } + + minZ = 1; + + var w:number = (maxX - minX); + var h:number = (maxY - minY); + var d:number = 1/(maxZ - minZ); + + if (minX < 0) + minX -= this._pSnap; // because int() rounds up for < 0 + if (minY < 0) + minY -= this._pSnap; + minX = Math.floor(minX/this._pSnap)*this._pSnap; + minY = Math.floor(minY/this._pSnap)*this._pSnap; + + var snap2:number = 2*this._pSnap; + w = Math.floor(w/snap2 + 1)*snap2; + h = Math.floor(h/snap2 + 1)*snap2; + + maxX = minX + w; + maxY = minY + h; + + w = 1/w; + h = 1/h; + + raw[0] = 2*w; + raw[5] = 2*h; + raw[10] = d; + raw[12] = -(maxX + minX)*w; + raw[13] = -(maxY + minY)*h; + raw[14] = -minZ*d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + + matrix.copyRawDataFrom(raw); + matrix.appendScale(.96, .96, 1); + matrix.appendTranslation(texOffsetX, texOffsetY, 0); + matrix.appendScale(.5, .5, 1); + } + + public addEventListener(type:string, listener:Function) + { + this._changeDispatcher.addEventListener(type, listener); + } + + public removeEventListener(type:string, listener:Function) + { + this._changeDispatcher.removeEventListener(type, listener); + } + + public dispatchEvent(event:Event) + { + return this._changeDispatcher.dispatchEvent(event); + } + + public hasEventListener(type:string):boolean + { + return this._changeDispatcher.hasEventListener(type); + } + + get _iNearPlaneDistances():Array + { + return this._nearPlaneDistances; + } +} + +export = CascadeShadowMapper; \ No newline at end of file diff --git a/lib/materials/shadowmappers/CubeMapShadowMapper.js b/lib/materials/shadowmappers/CubeMapShadowMapper.js new file mode 100755 index 00000000..642ba3e8 --- /dev/null +++ b/lib/materials/shadowmappers/CubeMapShadowMapper.js @@ -0,0 +1,85 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Camera = require("awayjs-core/lib/entities/Camera"); + +var PartialImplementationError = require("awayjs-core/lib/errors/PartialImplementationError"); +var ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); + +var CubeMapShadowMapper = (function (_super) { + __extends(CubeMapShadowMapper, _super); + function CubeMapShadowMapper() { + _super.call(this); + + this._pDepthMapSize = 512; + this._needsRender = new Array(); + this.initCameras(); + } + CubeMapShadowMapper.prototype.initCameras = function () { + this._depthCameras = new Array(); + this._projections = new Array(); + + // posX, negX, posY, negY, posZ, negZ + this.addCamera(0, 90, 0); + this.addCamera(0, -90, 0); + this.addCamera(-90, 0, 0); + this.addCamera(90, 0, 0); + this.addCamera(0, 0, 0); + this.addCamera(0, 180, 0); + }; + + CubeMapShadowMapper.prototype.addCamera = function (rotationX, rotationY, rotationZ) { + var cam = new Camera(); + cam.rotationX = rotationX; + cam.rotationY = rotationY; + cam.rotationZ = rotationZ; + cam.projection.near = .01; + + var projection = cam.projection; + projection.fieldOfView = 90; + this._projections.push(projection); + cam.projection._iAspectRatio = 1; + this._depthCameras.push(cam); + }; + + //@override + CubeMapShadowMapper.prototype.pCreateDepthTexture = function () { + throw new PartialImplementationError(); + /* + return new RenderCubeTexture( this._depthMapSize ); + */ + }; + + //@override + CubeMapShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { + var light = (this._pLight); + var maxDistance = light._pFallOff; + var pos = this._pLight.scenePosition; + + for (var i = 0; i < 6; ++i) { + this._projections[i].far = maxDistance; + this._depthCameras[i].transform.position = pos; + this._needsRender[i] = true; + } + }; + + //@override + CubeMapShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { + for (var i = 0; i < 6; ++i) { + if (this._needsRender[i]) { + this._pCasterCollector.camera = this._depthCameras[i]; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + renderer._iRender(this._pCasterCollector, target, null, i); + } + } + }; + return CubeMapShadowMapper; +})(ShadowMapperBase); + +module.exports = CubeMapShadowMapper; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9zaGFkb3dtYXBwZXJzL0N1YmVNYXBTaGFkb3dNYXBwZXIudHMiXSwibmFtZXMiOlsiQ3ViZU1hcFNoYWRvd01hcHBlciIsIkN1YmVNYXBTaGFkb3dNYXBwZXIuY29uc3RydWN0b3IiLCJDdWJlTWFwU2hhZG93TWFwcGVyLmluaXRDYW1lcmFzIiwiQ3ViZU1hcFNoYWRvd01hcHBlci5hZGRDYW1lcmEiLCJDdWJlTWFwU2hhZG93TWFwcGVyLnBDcmVhdGVEZXB0aFRleHR1cmUiLCJDdWJlTWFwU2hhZG93TWFwcGVyLnBVcGRhdGVEZXB0aFByb2plY3Rpb24iLCJDdWJlTWFwU2hhZG93TWFwcGVyLnBEcmF3RGVwdGhNYXAiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVEQUdnRTs7QUFFaEUsNkZBQWlHO0FBQ2pHLDBGQUFpRzs7QUFLakc7SUFBa0NBLHNDQUFnQkE7SUFNakRBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBOztRQUVQQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxHQUFHQTtRQUN6QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDL0JBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO0lBQ25CQSxDQUFDQTtJQUVERCw0Q0FBQUE7UUFFQ0UsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDaENBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLElBQUlBLEtBQUtBLENBQUNBLENBQUNBOztRQUUvQkEscUNBQXFDQTtRQUNyQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDeEJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO1FBQ3pCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxFQUFF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QUVBLElBQUlBLEVBQUVBLENBQUNBLENBQUNBO2FBQzFEQTtTQUNEQTtJQUNGQSxDQUFDQTtJQUNGTiwyQkFBQ0E7QUFBREEsQ0FBQ0EsRUFoRmlDLGdCQUFnQixFQWdGakQ7O0FBRUQsb0NBQTZCLENBQUEiLCJmaWxlIjoibWF0ZXJpYWxzL3NoYWRvd21hcHBlcnMvQ3ViZU1hcFNoYWRvd01hcHBlci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTY2VuZVx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1NjZW5lXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBJUmVuZGVyZXJcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcmVuZGVyL0lSZW5kZXJlclwiKTtcbmltcG9ydCBDYW1lcmFcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvQ2FtZXJhXCIpO1xuaW1wb3J0IFBvaW50TGlnaHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL1BvaW50TGlnaHRcIik7XG5pbXBvcnQgUGFydGlhbEltcGxlbWVudGF0aW9uRXJyb3JcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvUGFydGlhbEltcGxlbWVudGF0aW9uRXJyb3JcIik7XG5pbXBvcnQgU2hhZG93TWFwcGVyQmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9zaGFkb3dtYXBwZXJzL1NoYWRvd01hcHBlckJhc2VcIik7XG5pbXBvcnQgUGVyc3BlY3RpdmVQcm9qZWN0aW9uXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9QZXJzcGVjdGl2ZVByb2plY3Rpb25cIik7XG5pbXBvcnQgUmVuZGVyVGV4dHVyZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL1JlbmRlclRleHR1cmVcIik7XG5pbXBvcnQgVGV4dHVyZVByb3h5QmFzZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL1RleHR1cmVQcm94eUJhc2VcIik7XG5cbmNsYXNzIEN1YmVNYXBTaGFkb3dNYXBwZXIgZXh0ZW5kcyBTaGFkb3dNYXBwZXJCYXNlXG57XG5cdHByaXZhdGUgX2RlcHRoQ2FtZXJhczpBcnJheTxDYW1lcmE+O1xuXHRwcml2YXRlIF9wcm9qZWN0aW9uczpBcnJheTxQZXJzcGVjdGl2ZVByb2plY3Rpb24+O1xuXHRwcml2YXRlIF9uZWVkc1JlbmRlcjpBcnJheTxib29sZWFuPjtcblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fcERlcHRoTWFwU2l6ZSA9IDUxMjtcblx0XHR0aGlzLl9uZWVkc1JlbmRlciA9IG5ldyBBcnJheSgpO1xuXHRcdHRoaXMuaW5pdENhbWVyYXMoKTtcblx0fVxuXG5cdHByaXZhdGUgaW5pdENhbWVyYXMoKVxuXHR7XG5cdFx0dGhpcy5fZGVwdGhDYW1lcmFzID0gbmV3IEFycmF5KCk7XG5cdFx0dGhpcy5fcHJvamVjdGlvbnMgPSBuZXcgQXJyYXkoKTtcblxuXHRcdC8vIHBvc1gsIG5lZ1gsIHBvc1ksIG5lZ1ksIHBvc1osIG5lZ1pcblx0XHR0aGlzLmFkZENhbWVyYSgwLCA5MCwgMCk7XG5cdFx0dGhpcy5hZGRDYW1lcmEoMCwgLTkwLCAwKTtcblx0XHR0aGlzLmFkZENhbWVyYSgtOTAsIDAsIDApO1xuXHRcdHRoaXMuYWRkQ2FtZXJhKDkwLCAwLCAwKTtcblx0XHR0aGlzLmFkZENhbWVyYSgwLCAwLCAwKTtcblx0XHR0aGlzLmFkZENhbWVyYSgwLCAxODAsIDApO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRDYW1lcmEocm90YXRpb25YOm51bWJlciwgcm90YXRpb25ZOm51bWJlciwgcm90YXRpb25aOm51bWJlcilcblx0e1xuXHRcdHZhciBjYW06Q2FtZXJhID0gbmV3IENhbWVyYSgpO1xuXHRcdGNhbS5yb3RhdGlvblggPSByb3RhdGlvblg7XG5cdFx0Y2FtLnJvdGF0aW9uWSA9IHJvdGF0aW9uWTtcblx0XHRjYW0ucm90YXRpb25aID0gcm90YXRpb25aO1xuXHRcdGNhbS5wcm9qZWN0aW9uLm5lYXIgPSAuMDE7XG5cblx0XHR2YXIgcHJvamVjdGlvbjpQZXJzcGVjdGl2ZVByb2plY3Rpb24gPSA8UGVyc3BlY3RpdmVQcm9qZWN0aW9uPiBjYW0ucHJvamVjdGlvbjtcblx0XHRwcm9qZWN0aW9uLmZpZWxkT2ZWaWV3ID0gOTA7XG5cdFx0dGhpcy5fcHJvamVjdGlvbnMucHVzaChwcm9qZWN0aW9uKTtcblx0XHRjYW0ucHJvamVjdGlvbi5faUFzcGVjdFJhdGlvID0gMTtcblx0XHR0aGlzLl9kZXB0aENhbWVyYXMucHVzaChjYW0pO1xuXHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIHBDcmVhdGVEZXB0aFRleHR1cmUoKTpUZXh0dXJlUHJveHlCYXNlXG5cdHtcblx0XHR0aHJvdyBuZXcgUGFydGlhbEltcGxlbWVudGF0aW9uRXJyb3IoKTtcblx0XHQvKlxuXHRcdCByZXR1cm4gbmV3IFJlbmRlckN1YmVUZXh0dXJlKCB0aGlzLl9kZXB0aE1hcFNpemUgKTtcblx0XHQgKi9cblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBwVXBkYXRlRGVwdGhQcm9qZWN0aW9uKHZpZXdDYW1lcmE6Q2FtZXJhKVxuXHR7XG5cdFx0dmFyIGxpZ2h0OlBvaW50TGlnaHQgPSA8UG9pbnRMaWdodD4odGhpcy5fcExpZ2h0KTtcblx0XHR2YXIgbWF4RGlzdGFuY2U6bnVtYmVyID0gbGlnaHQuX3BGYWxsT2ZmO1xuXHRcdHZhciBwb3M6VmVjdG9yM0QgPSB0aGlzLl9wTGlnaHQuc2NlbmVQb3NpdGlvbjtcblxuXHRcdC8vIHRvZG86IGZhY2VzIG91dHNpZGUgZnJ1c3R1bSB3aGljaCBhcmUgcG9pbnRpbmcgYXdheSBmcm9tIGNhbWVyYSBuZWVkIG5vdCBiZSByZW5kZXJlZCFcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCA2OyArK2kpIHtcblx0XHRcdHRoaXMuX3Byb2plY3Rpb25zW2ldLmZhciA9IG1heERpc3RhbmNlO1xuXHRcdFx0dGhpcy5fZGVwdGhDYW1lcmFzW2ldLnRyYW5zZm9ybS5wb3NpdGlvbiA9IHBvcztcblx0XHRcdHRoaXMuX25lZWRzUmVuZGVyW2ldID0gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgcERyYXdEZXB0aE1hcCh0YXJnZXQ6UmVuZGVyVGV4dHVyZSwgc2NlbmU6U2NlbmUsIHJlbmRlcmVyOklSZW5kZXJlcilcblx0e1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IDY7ICsraSkge1xuXHRcdFx0aWYgKHRoaXMuX25lZWRzUmVuZGVyW2ldKSB7XG5cdFx0XHRcdHRoaXMuX3BDYXN0ZXJDb2xsZWN0b3IuY2FtZXJhID0gdGhpcy5fZGVwdGhDYW1lcmFzW2ldO1xuXHRcdFx0XHR0aGlzLl9wQ2FzdGVyQ29sbGVjdG9yLmNsZWFyKCk7XG5cdFx0XHRcdHNjZW5lLnRyYXZlcnNlUGFydGl0aW9ucyh0aGlzLl9wQ2FzdGVyQ29sbGVjdG9yKTtcblx0XHRcdFx0cmVuZGVyZXIuX2lSZW5kZXIodGhpcy5fcENhc3RlckNvbGxlY3RvciwgdGFyZ2V0LCBudWxsLCBpKVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgPSBDdWJlTWFwU2hhZG93TWFwcGVyOyJdfQ== \ No newline at end of file diff --git a/lib/materials/shadowmappers/CubeMapShadowMapper.ts b/lib/materials/shadowmappers/CubeMapShadowMapper.ts new file mode 100644 index 00000000..99f6786c --- /dev/null +++ b/lib/materials/shadowmappers/CubeMapShadowMapper.ts @@ -0,0 +1,94 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import PointLight = require("awayjs-core/lib/entities/PointLight"); +import PartialImplementationError = require("awayjs-core/lib/errors/PartialImplementationError"); +import ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); +import PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); +import RenderTexture = require("awayjs-core/lib/textures/RenderTexture"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +class CubeMapShadowMapper extends ShadowMapperBase +{ + private _depthCameras:Array; + private _projections:Array; + private _needsRender:Array; + + constructor() + { + super(); + + this._pDepthMapSize = 512; + this._needsRender = new Array(); + this.initCameras(); + } + + private initCameras() + { + this._depthCameras = new Array(); + this._projections = new Array(); + + // posX, negX, posY, negY, posZ, negZ + this.addCamera(0, 90, 0); + this.addCamera(0, -90, 0); + this.addCamera(-90, 0, 0); + this.addCamera(90, 0, 0); + this.addCamera(0, 0, 0); + this.addCamera(0, 180, 0); + } + + private addCamera(rotationX:number, rotationY:number, rotationZ:number) + { + var cam:Camera = new Camera(); + cam.rotationX = rotationX; + cam.rotationY = rotationY; + cam.rotationZ = rotationZ; + cam.projection.near = .01; + + var projection:PerspectiveProjection = cam.projection; + projection.fieldOfView = 90; + this._projections.push(projection); + cam.projection._iAspectRatio = 1; + this._depthCameras.push(cam); + } + + //@override + public pCreateDepthTexture():TextureProxyBase + { + throw new PartialImplementationError(); + /* + return new RenderCubeTexture( this._depthMapSize ); + */ + } + + //@override + public pUpdateDepthProjection(viewCamera:Camera) + { + var light:PointLight = (this._pLight); + var maxDistance:number = light._pFallOff; + var pos:Vector3D = this._pLight.scenePosition; + + // todo: faces outside frustum which are pointing away from camera need not be rendered! + for (var i:number = 0; i < 6; ++i) { + this._projections[i].far = maxDistance; + this._depthCameras[i].transform.position = pos; + this._needsRender[i] = true; + } + } + + //@override + public pDrawDepthMap(target:RenderTexture, scene:Scene, renderer:IRenderer) + { + for (var i:number = 0; i < 6; ++i) { + if (this._needsRender[i]) { + this._pCasterCollector.camera = this._depthCameras[i]; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + renderer._iRender(this._pCasterCollector, target, null, i) + } + } + } +} + +export = CubeMapShadowMapper; \ No newline at end of file diff --git a/lib/materials/shadowmappers/DirectionalShadowMapper.js b/lib/materials/shadowmappers/DirectionalShadowMapper.js new file mode 100755 index 00000000..97bfa5fe --- /dev/null +++ b/lib/materials/shadowmappers/DirectionalShadowMapper.js @@ -0,0 +1,194 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); + +var Camera = require("awayjs-core/lib/entities/Camera"); + +var ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); +var FreeMatrixProjection = require("awayjs-core/lib/projections/FreeMatrixProjection"); + +var DirectionalShadowMapper = (function (_super) { + __extends(DirectionalShadowMapper, _super); + function DirectionalShadowMapper() { + _super.call(this); + this._pLightOffset = 10000; + this._pSnap = 64; + + this._pCullPlanes = []; + this._pOverallDepthProjection = new FreeMatrixProjection(); + this._pOverallDepthCamera = new Camera(this._pOverallDepthProjection); + this._pLocalFrustum = []; + this._pMatrix = new Matrix3D(); + } + Object.defineProperty(DirectionalShadowMapper.prototype, "snap", { + get: function () { + return this._pSnap; + }, + set: function (value) { + this._pSnap = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DirectionalShadowMapper.prototype, "lightOffset", { + get: function () { + return this._pLightOffset; + }, + set: function (value) { + this._pLightOffset = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(DirectionalShadowMapper.prototype, "iDepthProjection", { + //@arcane + get: function () { + return this._pOverallDepthCamera.viewProjection; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(DirectionalShadowMapper.prototype, "depth", { + //@arcane + get: function () { + return this._pMaxZ - this._pMinZ; + }, + enumerable: true, + configurable: true + }); + + //@override + DirectionalShadowMapper.prototype.pDrawDepthMap = function (target, scene, renderer) { + this._pCasterCollector.camera = this._pOverallDepthCamera; + this._pCasterCollector.cullPlanes = this._pCullPlanes; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + renderer._iRender(this._pCasterCollector, target); + }; + + //@protected + DirectionalShadowMapper.prototype.pUpdateCullPlanes = function (viewCamera) { + var lightFrustumPlanes = this._pOverallDepthCamera.frustumPlanes; + var viewFrustumPlanes = viewCamera.frustumPlanes; + this._pCullPlanes.length = 4; + + this._pCullPlanes[0] = lightFrustumPlanes[0]; + this._pCullPlanes[1] = lightFrustumPlanes[1]; + this._pCullPlanes[2] = lightFrustumPlanes[2]; + this._pCullPlanes[3] = lightFrustumPlanes[3]; + + var light = this._pLight; + var dir = light.sceneDirection; + var dirX = dir.x; + var dirY = dir.y; + var dirZ = dir.z; + var j = 4; + for (var i = 0; i < 6; ++i) { + var plane = viewFrustumPlanes[i]; + if (plane.a * dirX + plane.b * dirY + plane.c * dirZ < 0) + this._pCullPlanes[j++] = plane; + } + }; + + //@override + DirectionalShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { + this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); + this._pOverallDepthProjection.matrix = this._pMatrix; + this.pUpdateCullPlanes(viewCamera); + }; + + DirectionalShadowMapper.prototype.pUpdateProjectionFromFrustumCorners = function (viewCamera, corners, matrix) { + var raw = new Array(); + var dir; + var x, y, z; + var minX, minY; + var maxX, maxY; + var i; + + var light = this._pLight; + dir = light.sceneDirection; + this._pOverallDepthCamera.transform.matrix3D = this._pLight.sceneTransform; + x = Math.floor((viewCamera.x - dir.x * this._pLightOffset) / this._pSnap) * this._pSnap; + y = Math.floor((viewCamera.y - dir.y * this._pLightOffset) / this._pSnap) * this._pSnap; + z = Math.floor((viewCamera.z - dir.z * this._pLightOffset) / this._pSnap) * this._pSnap; + this._pOverallDepthCamera.x = x; + this._pOverallDepthCamera.y = y; + this._pOverallDepthCamera.z = z; + + this._pMatrix.copyFrom(this._pOverallDepthCamera.inverseSceneTransform); + this._pMatrix.prepend(viewCamera.sceneTransform); + this._pMatrix.transformVectors(corners, this._pLocalFrustum); + + minX = maxX = this._pLocalFrustum[0]; + minY = maxY = this._pLocalFrustum[1]; + this._pMaxZ = this._pLocalFrustum[2]; + + i = 3; + while (i < 24) { + x = this._pLocalFrustum[i]; + y = this._pLocalFrustum[i + 1]; + z = this._pLocalFrustum[i + 2]; + if (x < minX) + minX = x; + if (x > maxX) + maxX = x; + if (y < minY) + minY = y; + if (y > maxY) + maxY = y; + if (z > this._pMaxZ) + this._pMaxZ = z; + i += 3; + } + + this._pMinZ = 1; + + var w = maxX - minX; + var h = maxY - minY; + var d = 1 / (this._pMaxZ - this._pMinZ); + + if (minX < 0) + minX -= this._pSnap; // because int() rounds up for < 0 + + if (minY < 0) + minY -= this._pSnap; + + minX = Math.floor(minX / this._pSnap) * this._pSnap; + minY = Math.floor(minY / this._pSnap) * this._pSnap; + + var snap2 = 2 * this._pSnap; + w = Math.floor(w / snap2 + 2) * snap2; + h = Math.floor(h / snap2 + 2) * snap2; + + maxX = minX + w; + maxY = minY + h; + + w = 1 / w; + h = 1 / h; + + raw[0] = 2 * w; + raw[5] = 2 * h; + raw[10] = d; + raw[12] = -(maxX + minX) * w; + raw[13] = -(maxY + minY) * h; + raw[14] = -this._pMinZ * d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + + matrix.copyRawDataFrom(raw); + }; + return DirectionalShadowMapper; +})(ShadowMapperBase); + +module.exports = DirectionalShadowMapper; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9zaGFkb3dtYXBwZXJzL0RpcmVjdGlvbmFsU2hhZG93TWFwcGVyLnRzIl0sIm5hbWVzIjpbIkRpcmVjdGlvbmFsU2hhZG93TWFwcGVyIiwiRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIuY29uc3RydWN0b3IiLCJEaXJlY3Rpb25hbFNoYWRvd01hcHBlci5wRHJhd0RlcHRoTWFwIiwiRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIucFVwZGF0ZUN1bGxQbGFuZXMiLCJEaXJlY3Rpb25hbFNoYWRvd01hcHBlci5wVXBkYXRlRGVwdGhQcm9qZWN0aW9uIiwiRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIucFVwZGF0ZVByb2plY3Rpb25Gcm9tRnJ1c3R1bUNvcm5lcnMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDREQUNxRTs7QUFJckUsdURBQWdFOztBQUVoRSwwRkFBaUc7QUFDakcsc0ZBQTRGOztBQUk1RjtJQUFzQ0EsMENBQWdCQTtJQWNyREE7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFYUkEsS0FBT0EsYUFBYUEsR0FBVUEsS0FBS0EsQ0FBQ0E7UUFHcENBLEtBQU9BLE1BQU1BLEdBQVVBLEVBQUVBLENBQUNBOztRQVV6QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsRUFBRUE7UUFDdEJBLElBQUlBLENBQUNBLHdCQUF3QkEsR0FBR0EsSUFBSUEsb0JBQW9CQSxDQUFDQSxDQUFDQTtRQUMxREEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxHQUFHQSxJQUFJQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSx3QkFBd0JBLENBQUNBO1FBQ3JFQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxFQUFFQTtRQUN4QkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7SUFDL0JBLENBQUNBO0lBRUREO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE1BQU1BO1FBQ25CQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFn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QSxHQUFHQSxDQUFDQTtZQUNYQSxJQUFJQSxJQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxFQUFFQSxrQ0FBa0NBO0FBQW5DQTtRQUVyQkEsSUFBSUEsSUFBSUEsR0FBR0EsQ0FBQ0E7WUFDWEEsSUFBSUEsSUFBSUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7O1FBRXJCQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQTtRQUMvQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUE7O1FBRS9DQSxJQUFJQSxLQUFLQSxHQUFVQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQTtRQUNoQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsS0FBS0E7UUFDakNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLEdBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLEtBQUtBOztRQUVqQ0EsSUFBSUEsR0FBR0EsSUFBSUEsR0FBR0EsQ0FBQ0E7UUFDZkEsSUFBSUEsR0FBR0EsSUFBSUEsR0FBR0EsQ0FBQ0E7O1FBRWZBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBO1FBQ1BBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBOztRQUVQQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUNaQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNYQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUMxQkEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0E7UUFDMUJBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUNBLENBQUNBO1FBQ3hCQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNYQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFbkZBLE1BQU1BLENBQUNBLGVBQWVBLENBQUNBLEdBQUdBLENBQUNBO0lBQzVCQSxDQUFDQTtJQUNGTCwrQkFBQ0E7QUFBREEsQ0FBQ0EsRUFyTHFDLGdCQUFnQixFQXFMckQ7O0FBRUQsd0NBQWlDLENBQUEiLCJmaWxlIjoibWF0ZXJpYWxzL3NoYWRvd21hcHBlcnMvRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU2NlbmVcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udGFpbmVycy9TY2VuZVwiKTtcbmltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4M0RcIik7XG5pbXBvcnQgUGxhbmUzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUGxhbmUzRFwiKTtcbmltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgSVJlbmRlcmVyXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9JUmVuZGVyZXJcIik7XG5pbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBEaXJlY3Rpb25hbExpZ2h0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvRGlyZWN0aW9uYWxMaWdodFwiKTtcbmltcG9ydCBTaGFkb3dNYXBwZXJCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvbWF0ZXJpYWxzL3NoYWRvd21hcHBlcnMvU2hhZG93TWFwcGVyQmFzZVwiKTtcbmltcG9ydCBGcmVlTWF0cml4UHJvamVjdGlvblx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9GcmVlTWF0cml4UHJvamVjdGlvblwiKTtcbmltcG9ydCBSZW5kZXJUZXh0dXJlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvUmVuZGVyVGV4dHVyZVwiKTtcbmltcG9ydCBUZXh0dXJlUHJveHlCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvVGV4dHVyZVByb3h5QmFzZVwiKTtcblxuY2xhc3MgRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIgZXh0ZW5kcyBTaGFkb3dNYXBwZXJCYXNlXG57XG5cdHB1YmxpYyBfcE92ZXJhbGxEZXB0aENhbWVyYTpDYW1lcmE7XG5cdHB1YmxpYyBfcExvY2FsRnJ1c3R1bTpBcnJheTxudW1iZXI+O1xuXG5cdHB1YmxpYyBfcExpZ2h0T2Zmc2V0Om51bWJlciA9IDEwMDAwO1xuXHRwdWJsaWMgX3BNYXRyaXg6TWF0cml4M0Q7XG5cdHB1YmxpYyBfcE92ZXJhbGxEZXB0aFByb2plY3Rpb246RnJlZU1hdHJpeFByb2plY3Rpb247XG5cdHB1YmxpYyBfcFNuYXA6bnVtYmVyID0gNjQ7XG5cblx0cHVibGljIF9wQ3VsbFBsYW5lczpBcnJheTxQbGFuZTNEPjtcblx0cHVibGljIF9wTWluWjpudW1iZXI7XG5cdHB1YmxpYyBfcE1heFo6bnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9wQ3VsbFBsYW5lcyA9IFtdO1xuXHRcdHRoaXMuX3BPdmVyYWxsRGVwdGhQcm9qZWN0aW9uID0gbmV3IEZyZWVNYXRyaXhQcm9qZWN0aW9uKCk7XG5cdFx0dGhpcy5fcE92ZXJhbGxEZXB0aENhbWVyYSA9IG5ldyBDYW1lcmEodGhpcy5fcE92ZXJhbGxEZXB0aFByb2plY3Rpb24pO1xuXHRcdHRoaXMuX3BMb2NhbEZydXN0dW0gPSBbXTtcblx0XHR0aGlzLl9wTWF0cml4ID0gbmV3IE1hdHJpeDNEKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHNuYXAoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wU25hcDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc25hcCh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9wU25hcCA9IHZhbHVlO1xuXHR9XG5cblx0cHVibGljIGdldCBsaWdodE9mZnNldCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BMaWdodE9mZnNldDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbGlnaHRPZmZzZXQodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fcExpZ2h0T2Zmc2V0ID0gdmFsdWU7XG5cdH1cblxuXHQvL0BhcmNhbmVcblx0cHVibGljIGdldCBpRGVwdGhQcm9qZWN0aW9uKCk6TWF0cml4M0Rcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wT3ZlcmFsbERlcHRoQ2FtZXJhLnZpZXdQcm9qZWN0aW9uO1xuXHR9XG5cblx0Ly9AYXJjYW5lXG5cdHB1YmxpYyBnZXQgZGVwdGgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wTWF4WiAtIHRoaXMuX3BNaW5aO1xuXHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIHBEcmF3RGVwdGhNYXAodGFyZ2V0OlRleHR1cmVQcm94eUJhc2UsIHNjZW5lOlNjZW5lLCByZW5kZXJlcjpJUmVuZGVyZXIpXG5cdHtcblx0XHR0aGlzLl9wQ2FzdGVyQ29sbGVjdG9yLmNhbWVyYSA9IHRoaXMuX3BPdmVyYWxsRGVwdGhDYW1lcmE7XG5cdFx0dGhpcy5fcENhc3RlckNvbGxlY3Rvci5jdWxsUGxhbmVzID0gdGhpcy5fcEN1bGxQbGFuZXM7XG5cdFx0dGhpcy5fcENhc3RlckNvbGxlY3Rvci5jbGVhcigpO1xuXHRcdHNjZW5lLnRyYXZlcnNlUGFydGl0aW9ucyh0aGlzLl9wQ2FzdGVyQ29sbGVjdG9yKTtcblx0XHRyZW5kZXJlci5faVJlbmRlcih0aGlzLl9wQ2FzdGVyQ29sbGVjdG9yLCB0YXJnZXQpO1xuXHR9XG5cblx0Ly9AcHJvdGVjdGVkXG5cdHB1YmxpYyBwVXBkYXRlQ3VsbFBsYW5lcyh2aWV3Q2FtZXJhOkNhbWVyYSlcblx0e1xuXHRcdHZhciBsaWdodEZydXN0dW1QbGFuZXM6QXJyYXk8UGxhbmUzRD4gPSB0aGlzLl9wT3ZlcmFsbERlcHRoQ2FtZXJhLmZydXN0dW1QbGFuZXM7XG5cdFx0dmFyIHZpZXdGcnVzdHVtUGxhbmVzOkFycmF5PFBsYW5lM0Q+ID0gdmlld0NhbWVyYS5mcnVzdHVtUGxhbmVzO1xuXHRcdHRoaXMuX3BDdWxsUGxhbmVzLmxlbmd0aCA9IDQ7XG5cblx0XHR0aGlzLl9wQ3VsbFBsYW5lc1swXSA9IGxpZ2h0RnJ1c3R1bVBsYW5lc1swXTtcblx0XHR0aGlzLl9wQ3VsbFBsYW5lc1sxXSA9IGxpZ2h0RnJ1c3R1bVBsYW5lc1sxXTtcblx0XHR0aGlzLl9wQ3VsbFBsYW5lc1syXSA9IGxpZ2h0RnJ1c3R1bVBsYW5lc1syXTtcblx0XHR0aGlzLl9wQ3VsbFBsYW5lc1szXSA9IGxpZ2h0RnJ1c3R1bVBsYW5lc1szXTtcblxuXHRcdHZhciBsaWdodDpEaXJlY3Rpb25hbExpZ2h0ID0gPERpcmVjdGlvbmFsTGlnaHQ+IHRoaXMuX3BMaWdodDtcblx0XHR2YXIgZGlyOlZlY3RvcjNEID0gbGlnaHQuc2NlbmVEaXJlY3Rpb247XG5cdFx0dmFyIGRpclg6bnVtYmVyID0gZGlyLng7XG5cdFx0dmFyIGRpclk6bnVtYmVyID0gZGlyLnk7XG5cdFx0dmFyIGRpclo6bnVtYmVyID0gZGlyLno7XG5cdFx0dmFyIGo6bnVtYmVyID0gNDtcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCA2OyArK2kpIHtcblx0XHRcdHZhciBwbGFuZTpQbGFuZTNEID0gdmlld0ZydXN0dW1QbGFuZXNbaV07XG5cdFx0XHRpZiAocGxhbmUuYSpkaXJYICsgcGxhbmUuYipkaXJZICsgcGxhbmUuYypkaXJaIDwgMClcblx0XHRcdFx0dGhpcy5fcEN1bGxQbGFuZXNbaisrXSA9IHBsYW5lO1xuXHRcdH1cblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBwVXBkYXRlRGVwdGhQcm9qZWN0aW9uKHZpZXdDYW1lcmE6Q2FtZXJhKVxuXHR7XG5cdFx0dGhpcy5wVXBkYXRlUHJvamVjdGlvbkZyb21GcnVzdHVtQ29ybmVycyh2aWV3Q2FtZXJhLCB2aWV3Q2FtZXJhLnByb2plY3Rpb24uZnJ1c3R1bUNvcm5lcnMsIHRoaXMuX3BNYXRyaXgpO1xuXHRcdHRoaXMuX3BPdmVyYWxsRGVwdGhQcm9qZWN0aW9uLm1hdHJpeCA9IHRoaXMuX3BNYXRyaXg7XG5cdFx0dGhpcy5wVXBkYXRlQ3VsbFBsYW5lcyh2aWV3Q2FtZXJhKTtcblx0fVxuXG5cdHB1YmxpYyBwVXBkYXRlUHJvamVjdGlvbkZyb21GcnVzdHVtQ29ybmVycyh2aWV3Q2FtZXJhOkNhbWVyYSwgY29ybmVyczpBcnJheTxudW1iZXI+LCBtYXRyaXg6TWF0cml4M0QpXG5cdHtcblx0XHR2YXIgcmF3OkFycmF5PG51bWJlcj4gPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXHRcdHZhciBkaXI6VmVjdG9yM0Q7XG5cdFx0dmFyIHg6bnVtYmVyLCB5Om51bWJlciwgejpudW1iZXI7XG5cdFx0dmFyIG1pblg6bnVtYmVyLCBtaW5ZOm51bWJlcjtcblx0XHR2YXIgbWF4WDpudW1iZXIsIG1heFk6bnVtYmVyO1xuXHRcdHZhciBpOm51bWJlcjtcblxuXHRcdHZhciBsaWdodDpEaXJlY3Rpb25hbExpZ2h0ID0gPERpcmVjdGlvbmFsTGlnaHQ+IHRoaXMuX3BMaWdodDtcblx0XHRkaXIgPSBsaWdodC5zY2VuZURpcmVjdGlvbjtcblx0XHR0aGlzLl9wT3ZlcmFsbERlcHRoQ2FtZXJhLnRyYW5zZm9ybS5tYXRyaXgzRCA9IHRoaXMuX3BMaWdodC5zY2VuZVRyYW5zZm9ybTtcblx0XHR4ID0gTWF0aC5mbG9vcigodmlld0NhbWVyYS54IC0gZGlyLngqdGhpcy5fcExpZ2h0T2Zmc2V0KS90aGlzLl9wU25hcCkqdGhpcy5fcFNuYXA7XG5cdFx0eSA9IE1hdGguZmxvb3IoKHZpZXdDYW1lcmEueSAtIGRpci55KnRoaXMuX3BMaWdodE9mZnNldCkvdGhpcy5fcFNuYXApKnRoaXMuX3BTbmFwO1xuXHRcdHogPSBNYXRoLmZsb29yKCh2aWV3Q2FtZXJhLnogLSBkaXIueip0aGlzLl9wTGlnaHRPZmZzZXQpL3RoaXMuX3BTbmFwKSp0aGlzLl9wU25hcDtcblx0XHR0aGlzLl9wT3ZlcmFsbERlcHRoQ2FtZXJhLnggPSB4O1xuXHRcdHRoaXMuX3BPdmVyYWxsRGVwdGhDYW1lcmEueSA9IHk7XG5cdFx0dGhpcy5fcE92ZXJhbGxEZXB0aENhbWVyYS56ID0gejtcblxuXHRcdHRoaXMuX3BNYXRyaXguY29weUZyb20odGhpcy5fcE92ZXJhbGxEZXB0aENhbWVyYS5pbnZlcnNlU2NlbmVUcmFuc2Zvcm0pO1xuXHRcdHRoaXMuX3BNYXRyaXgucHJlcGVuZCh2aWV3Q2FtZXJhLnNjZW5lVHJhbnNmb3JtKTtcblx0XHR0aGlzLl9wTWF0cml4LnRyYW5zZm9ybVZlY3RvcnMoY29ybmVycywgdGhpcy5fcExvY2FsRnJ1c3R1bSk7XG5cblx0XHRtaW5YID0gbWF4WCA9IHRoaXMuX3BMb2NhbEZydXN0dW1bMF07XG5cdFx0bWluWSA9IG1heFkgPSB0aGlzLl9wTG9jYWxGcnVzdHVtWzFdO1xuXHRcdHRoaXMuX3BNYXhaID0gdGhpcy5fcExvY2FsRnJ1c3R1bVsyXTtcblxuXHRcdGkgPSAzO1xuXHRcdHdoaWxlIChpIDwgMjQpIHtcblx0XHRcdHggPSB0aGlzLl9wTG9jYWxGcnVzdHVtW2ldO1xuXHRcdFx0eSA9IHRoaXMuX3BMb2NhbEZydXN0dW1baSArIDFdO1xuXHRcdFx0eiA9IHRoaXMuX3BMb2NhbEZydXN0dW1baSArIDJdO1xuXHRcdFx0aWYgKHggPCBtaW5YKVxuXHRcdFx0XHRtaW5YID0geDtcblx0XHRcdGlmICh4ID4gbWF4WClcblx0XHRcdFx0bWF4WCA9IHg7XG5cdFx0XHRpZiAoeSA8IG1pblkpXG5cdFx0XHRcdG1pblkgPSB5O1xuXHRcdFx0aWYgKHkgPiBtYXhZKVxuXHRcdFx0XHRtYXhZID0geTtcblx0XHRcdGlmICh6ID4gdGhpcy5fcE1heFopXG5cdFx0XHRcdHRoaXMuX3BNYXhaID0gejtcblx0XHRcdGkgKz0gMztcblx0XHR9XG5cblx0XHR0aGlzLl9wTWluWiA9IDE7XG5cblx0XHR2YXIgdzpudW1iZXIgPSBtYXhYIC0gbWluWDtcblx0XHR2YXIgaDpudW1iZXIgPSBtYXhZIC0gbWluWTtcblx0XHR2YXIgZDpudW1iZXIgPSAxLyh0aGlzLl9wTWF4WiAtIHRoaXMuX3BNaW5aKTtcblxuXHRcdGlmIChtaW5YIDwgMClcblx0XHRcdG1pblggLT0gdGhpcy5fcFNuYXA7IC8vIGJlY2F1c2UgaW50KCkgcm91bmRzIHVwIGZvciA8IDBcblxuXHRcdGlmIChtaW5ZIDwgMClcblx0XHRcdG1pblkgLT0gdGhpcy5fcFNuYXA7XG5cblx0XHRtaW5YID0gTWF0aC5mbG9vcihtaW5YL3RoaXMuX3BTbmFwKSp0aGlzLl9wU25hcDtcblx0XHRtaW5ZID0gTWF0aC5mbG9vcihtaW5ZL3RoaXMuX3BTbmFwKSp0aGlzLl9wU25hcDtcblxuXHRcdHZhciBzbmFwMjpudW1iZXIgPSAyKnRoaXMuX3BTbmFwO1xuXHRcdHcgPSBNYXRoLmZsb29yKHcvc25hcDIgKyAyKSpzbmFwMjtcblx0XHRoID0gTWF0aC5mbG9vcihoL3NuYXAyICsgMikqc25hcDI7XG5cblx0XHRtYXhYID0gbWluWCArIHc7XG5cdFx0bWF4WSA9IG1pblkgKyBoO1xuXG5cdFx0dyA9IDEvdztcblx0XHRoID0gMS9oO1xuXG5cdFx0cmF3WzBdID0gMip3O1xuXHRcdHJhd1s1XSA9IDIqaDtcblx0XHRyYXdbMTBdID0gZDtcblx0XHRyYXdbMTJdID0gLShtYXhYICsgbWluWCkqdztcblx0XHRyYXdbMTNdID0gLShtYXhZICsgbWluWSkqaDtcblx0XHRyYXdbMTRdID0gLXRoaXMuX3BNaW5aKmQ7XG5cdFx0cmF3WzE1XSA9IDE7XG5cdFx0cmF3WzFdID0gcmF3WzJdID0gcmF3WzNdID0gcmF3WzRdID0gcmF3WzZdID0gcmF3WzddID0gcmF3WzhdID0gcmF3WzldID0gcmF3WzExXSA9IDA7XG5cblx0XHRtYXRyaXguY29weVJhd0RhdGFGcm9tKHJhdyk7XG5cdH1cbn1cblxuZXhwb3J0ID0gRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXI7Il19 \ No newline at end of file diff --git a/lib/materials/shadowmappers/DirectionalShadowMapper.ts b/lib/materials/shadowmappers/DirectionalShadowMapper.ts new file mode 100644 index 00000000..cf733e27 --- /dev/null +++ b/lib/materials/shadowmappers/DirectionalShadowMapper.ts @@ -0,0 +1,196 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import DirectionalLight = require("awayjs-core/lib/entities/DirectionalLight"); +import ShadowMapperBase = require("awayjs-core/lib/materials/shadowmappers/ShadowMapperBase"); +import FreeMatrixProjection = require("awayjs-core/lib/projections/FreeMatrixProjection"); +import RenderTexture = require("awayjs-core/lib/textures/RenderTexture"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +class DirectionalShadowMapper extends ShadowMapperBase +{ + public _pOverallDepthCamera:Camera; + public _pLocalFrustum:Array; + + public _pLightOffset:number = 10000; + public _pMatrix:Matrix3D; + public _pOverallDepthProjection:FreeMatrixProjection; + public _pSnap:number = 64; + + public _pCullPlanes:Array; + public _pMinZ:number; + public _pMaxZ:number; + + constructor() + { + super(); + + this._pCullPlanes = []; + this._pOverallDepthProjection = new FreeMatrixProjection(); + this._pOverallDepthCamera = new Camera(this._pOverallDepthProjection); + this._pLocalFrustum = []; + this._pMatrix = new Matrix3D(); + } + + public get snap():number + { + return this._pSnap; + } + + public set snap(value:number) + { + this._pSnap = value; + } + + public get lightOffset():number + { + return this._pLightOffset; + } + + public set lightOffset(value:number) + { + this._pLightOffset = value; + } + + //@arcane + public get iDepthProjection():Matrix3D + { + return this._pOverallDepthCamera.viewProjection; + } + + //@arcane + public get depth():number + { + return this._pMaxZ - this._pMinZ; + } + + //@override + public pDrawDepthMap(target:TextureProxyBase, scene:Scene, renderer:IRenderer) + { + this._pCasterCollector.camera = this._pOverallDepthCamera; + this._pCasterCollector.cullPlanes = this._pCullPlanes; + this._pCasterCollector.clear(); + scene.traversePartitions(this._pCasterCollector); + renderer._iRender(this._pCasterCollector, target); + } + + //@protected + public pUpdateCullPlanes(viewCamera:Camera) + { + var lightFrustumPlanes:Array = this._pOverallDepthCamera.frustumPlanes; + var viewFrustumPlanes:Array = viewCamera.frustumPlanes; + this._pCullPlanes.length = 4; + + this._pCullPlanes[0] = lightFrustumPlanes[0]; + this._pCullPlanes[1] = lightFrustumPlanes[1]; + this._pCullPlanes[2] = lightFrustumPlanes[2]; + this._pCullPlanes[3] = lightFrustumPlanes[3]; + + var light:DirectionalLight = this._pLight; + var dir:Vector3D = light.sceneDirection; + var dirX:number = dir.x; + var dirY:number = dir.y; + var dirZ:number = dir.z; + var j:number = 4; + for (var i:number = 0; i < 6; ++i) { + var plane:Plane3D = viewFrustumPlanes[i]; + if (plane.a*dirX + plane.b*dirY + plane.c*dirZ < 0) + this._pCullPlanes[j++] = plane; + } + } + + //@override + public pUpdateDepthProjection(viewCamera:Camera) + { + this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); + this._pOverallDepthProjection.matrix = this._pMatrix; + this.pUpdateCullPlanes(viewCamera); + } + + public pUpdateProjectionFromFrustumCorners(viewCamera:Camera, corners:Array, matrix:Matrix3D) + { + var raw:Array = new Array(); + var dir:Vector3D; + var x:number, y:number, z:number; + var minX:number, minY:number; + var maxX:number, maxY:number; + var i:number; + + var light:DirectionalLight = this._pLight; + dir = light.sceneDirection; + this._pOverallDepthCamera.transform.matrix3D = this._pLight.sceneTransform; + x = Math.floor((viewCamera.x - dir.x*this._pLightOffset)/this._pSnap)*this._pSnap; + y = Math.floor((viewCamera.y - dir.y*this._pLightOffset)/this._pSnap)*this._pSnap; + z = Math.floor((viewCamera.z - dir.z*this._pLightOffset)/this._pSnap)*this._pSnap; + this._pOverallDepthCamera.x = x; + this._pOverallDepthCamera.y = y; + this._pOverallDepthCamera.z = z; + + this._pMatrix.copyFrom(this._pOverallDepthCamera.inverseSceneTransform); + this._pMatrix.prepend(viewCamera.sceneTransform); + this._pMatrix.transformVectors(corners, this._pLocalFrustum); + + minX = maxX = this._pLocalFrustum[0]; + minY = maxY = this._pLocalFrustum[1]; + this._pMaxZ = this._pLocalFrustum[2]; + + i = 3; + while (i < 24) { + x = this._pLocalFrustum[i]; + y = this._pLocalFrustum[i + 1]; + z = this._pLocalFrustum[i + 2]; + if (x < minX) + minX = x; + if (x > maxX) + maxX = x; + if (y < minY) + minY = y; + if (y > maxY) + maxY = y; + if (z > this._pMaxZ) + this._pMaxZ = z; + i += 3; + } + + this._pMinZ = 1; + + var w:number = maxX - minX; + var h:number = maxY - minY; + var d:number = 1/(this._pMaxZ - this._pMinZ); + + if (minX < 0) + minX -= this._pSnap; // because int() rounds up for < 0 + + if (minY < 0) + minY -= this._pSnap; + + minX = Math.floor(minX/this._pSnap)*this._pSnap; + minY = Math.floor(minY/this._pSnap)*this._pSnap; + + var snap2:number = 2*this._pSnap; + w = Math.floor(w/snap2 + 2)*snap2; + h = Math.floor(h/snap2 + 2)*snap2; + + maxX = minX + w; + maxY = minY + h; + + w = 1/w; + h = 1/h; + + raw[0] = 2*w; + raw[5] = 2*h; + raw[10] = d; + raw[12] = -(maxX + minX)*w; + raw[13] = -(maxY + minY)*h; + raw[14] = -this._pMinZ*d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + + matrix.copyRawDataFrom(raw); + } +} + +export = DirectionalShadowMapper; \ No newline at end of file diff --git a/lib/materials/shadowmappers/NearDirectionalShadowMapper.js b/lib/materials/shadowmappers/NearDirectionalShadowMapper.js new file mode 100755 index 00000000..f618c42b --- /dev/null +++ b/lib/materials/shadowmappers/NearDirectionalShadowMapper.js @@ -0,0 +1,54 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + +var NearDirectionalShadowMapper = (function (_super) { + __extends(NearDirectionalShadowMapper, _super); + function NearDirectionalShadowMapper(coverageRatio) { + if (typeof coverageRatio === "undefined") { coverageRatio = .5; } + _super.call(this); + + this.coverageRatio = coverageRatio; + } + Object.defineProperty(NearDirectionalShadowMapper.prototype, "coverageRatio", { + /** + * A value between 0 and 1 to indicate the ratio of the view frustum that needs to be covered by the shadow map. + */ + get: function () { + return this._coverageRatio; + }, + set: function (value) { + if (value > 1) + value = 1; + else if (value < 0) + value = 0; + + this._coverageRatio = value; + }, + enumerable: true, + configurable: true + }); + + + NearDirectionalShadowMapper.prototype.pUpdateDepthProjection = function (viewCamera) { + var corners = viewCamera.projection.frustumCorners; + + for (var i = 0; i < 12; ++i) { + var v = corners[i]; + this._pLocalFrustum[i] = v; + this._pLocalFrustum[i + 12] = v + (corners[i + 12] - v) * this._coverageRatio; + } + + this.pUpdateProjectionFromFrustumCorners(viewCamera, this._pLocalFrustum, this._pMatrix); + this._pOverallDepthProjection.matrix = this._pMatrix; + }; + return NearDirectionalShadowMapper; +})(DirectionalShadowMapper); + +module.exports = NearDirectionalShadowMapper; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9zaGFkb3dtYXBwZXJzL05lYXJEaXJlY3Rpb25hbFNoYWRvd01hcHBlci50cyJdLCJuYW1lcyI6WyJOZWFyRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIiLCJOZWFyRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIuY29uc3RydWN0b3IiLCJOZWFyRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIucFVwZGF0ZURlcHRoUHJvamVjdGlvbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0dBQzZHOztBQUU3RztJQUEwQ0EsOENBQXVCQTtJQUloRUEscUNBQVlBLGFBQXlCQTtRQUF6QkMsNENBQUFBLGFBQWFBLEdBQVVBLEVBQUVBO0FBQUFBLFFBRXBDQSxXQUFNQSxLQUFBQSxDQUFDQTs7UUFFUEEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsYUFBYUE7SUFDbkNBLENBQUNBO0lBS0REO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxjQUFjQTtRQUMzQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBeUJBLEtBQVlBO1lBRXBDQSxJQUFJQSxLQUFLQSxHQUFHQSxDQUFDQTtnQkFDWkEsS0FBS0EsR0FBR0EsQ0FBQ0E7aUJBQU9BLElBQUlBLEtBQUtBLEdBQUdBLENBQUNBO2dCQUM3QkEsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1lBRVhBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLEtBQUtBO1FBQzVCQSxDQUFDQTs7OztBQVRBQTs7SUFXREEsK0RBQUFBLFVBQThCQSxVQUFpQkE7UUFFOUNFLElBQUlBLE9BQU9BLEdBQWlCQSxVQUFVQSxDQUFDQSxVQUFVQSxDQUFDQSxjQUFjQTs7UUFFaEVBLEtBQUtBLElBQUlBLENBQUNBLEdBQWtCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtZQUMzQ0EsSUFBSUEsQ0FBQ0EsR0FBVUEsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7WUFDekJBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1lBQzFCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxjQUFjQTtTQUMzRUE7O1FBRURBLElBQUlBLENBQUNBLG1DQUFtQ0EsQ0FBQ0EsVUFBVUEsRUFBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7UUFDeEZBLElBQUlBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUE7SUFDckRBLENBQUNBO0lBQ0ZGLG1DQUFDQTtBQUFEQSxDQUFDQSxFQXpDeUMsdUJBQXVCLEVBeUNoRTs7QUFFRCw0Q0FBcUMsQ0FBQSIsImZpbGUiOiJtYXRlcmlhbHMvc2hhZG93bWFwcGVycy9OZWFyRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ2FtZXJhXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL0NhbWVyYVwiKTtcbmltcG9ydCBEaXJlY3Rpb25hbFNoYWRvd01hcHBlclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvbWF0ZXJpYWxzL3NoYWRvd21hcHBlcnMvRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXJcIik7XG5cbmNsYXNzIE5lYXJEaXJlY3Rpb25hbFNoYWRvd01hcHBlciBleHRlbmRzIERpcmVjdGlvbmFsU2hhZG93TWFwcGVyXG57XG5cdHByaXZhdGUgX2NvdmVyYWdlUmF0aW86bnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yKGNvdmVyYWdlUmF0aW86bnVtYmVyID0gLjUpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5jb3ZlcmFnZVJhdGlvID0gY292ZXJhZ2VSYXRpbztcblx0fVxuXG5cdC8qKlxuXHQgKiBBIHZhbHVlIGJldHdlZW4gMCBhbmQgMSB0byBpbmRpY2F0ZSB0aGUgcmF0aW8gb2YgdGhlIHZpZXcgZnJ1c3R1bSB0aGF0IG5lZWRzIHRvIGJlIGNvdmVyZWQgYnkgdGhlIHNoYWRvdyBtYXAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGNvdmVyYWdlUmF0aW8oKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9jb3ZlcmFnZVJhdGlvO1xuXHR9XG5cblx0cHVibGljIHNldCBjb3ZlcmFnZVJhdGlvKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA+IDEpXG5cdFx0XHR2YWx1ZSA9IDE7IGVsc2UgaWYgKHZhbHVlIDwgMClcblx0XHRcdHZhbHVlID0gMDtcblxuXHRcdHRoaXMuX2NvdmVyYWdlUmF0aW8gPSB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBwVXBkYXRlRGVwdGhQcm9qZWN0aW9uKHZpZXdDYW1lcmE6Q2FtZXJhKVxuXHR7XG5cdFx0dmFyIGNvcm5lcnM6QXJyYXk8bnVtYmVyPiA9IHZpZXdDYW1lcmEucHJvamVjdGlvbi5mcnVzdHVtQ29ybmVycztcblxuXHRcdGZvciAodmFyIGk6bnVtYmVyIC8qaW50Ki8gPSAwOyBpIDwgMTI7ICsraSkge1xuXHRcdFx0dmFyIHY6bnVtYmVyID0gY29ybmVyc1tpXTtcblx0XHRcdHRoaXMuX3BMb2NhbEZydXN0dW1baV0gPSB2O1xuXHRcdFx0dGhpcy5fcExvY2FsRnJ1c3R1bVtpICsgMTJdID0gdiArIChjb3JuZXJzW2kgKyAxMl0gLSB2KSp0aGlzLl9jb3ZlcmFnZVJhdGlvO1xuXHRcdH1cblxuXHRcdHRoaXMucFVwZGF0ZVByb2plY3Rpb25Gcm9tRnJ1c3R1bUNvcm5lcnModmlld0NhbWVyYSwgdGhpcy5fcExvY2FsRnJ1c3R1bSwgdGhpcy5fcE1hdHJpeCk7XG5cdFx0dGhpcy5fcE92ZXJhbGxEZXB0aFByb2plY3Rpb24ubWF0cml4ID0gdGhpcy5fcE1hdHJpeDtcblx0fVxufVxuXG5leHBvcnQgPSBOZWFyRGlyZWN0aW9uYWxTaGFkb3dNYXBwZXI7Il19 \ No newline at end of file diff --git a/lib/materials/shadowmappers/NearDirectionalShadowMapper.ts b/lib/materials/shadowmappers/NearDirectionalShadowMapper.ts new file mode 100644 index 00000000..773d9129 --- /dev/null +++ b/lib/materials/shadowmappers/NearDirectionalShadowMapper.ts @@ -0,0 +1,47 @@ +import Camera = require("awayjs-core/lib/entities/Camera"); +import DirectionalShadowMapper = require("awayjs-core/lib/materials/shadowmappers/DirectionalShadowMapper"); + +class NearDirectionalShadowMapper extends DirectionalShadowMapper +{ + private _coverageRatio:number; + + constructor(coverageRatio:number = .5) + { + super(); + + this.coverageRatio = coverageRatio; + } + + /** + * A value between 0 and 1 to indicate the ratio of the view frustum that needs to be covered by the shadow map. + */ + public get coverageRatio():number + { + return this._coverageRatio; + } + + public set coverageRatio(value:number) + { + if (value > 1) + value = 1; else if (value < 0) + value = 0; + + this._coverageRatio = value; + } + + public pUpdateDepthProjection(viewCamera:Camera) + { + var corners:Array = viewCamera.projection.frustumCorners; + + for (var i:number /*int*/ = 0; i < 12; ++i) { + var v:number = corners[i]; + this._pLocalFrustum[i] = v; + this._pLocalFrustum[i + 12] = v + (corners[i + 12] - v)*this._coverageRatio; + } + + this.pUpdateProjectionFromFrustumCorners(viewCamera, this._pLocalFrustum, this._pMatrix); + this._pOverallDepthProjection.matrix = this._pMatrix; + } +} + +export = NearDirectionalShadowMapper; \ No newline at end of file diff --git a/lib/materials/shadowmappers/ShadowMapperBase.js b/lib/materials/shadowmappers/ShadowMapperBase.js new file mode 100755 index 00000000..a76c1430 --- /dev/null +++ b/lib/materials/shadowmappers/ShadowMapperBase.js @@ -0,0 +1,134 @@ +var ShadowCasterCollector = require("awayjs-core/lib/core/traverse/ShadowCasterCollector"); +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var RenderTexture = require("awayjs-core/lib/textures/RenderTexture"); + +var ShadowMapperBase = (function () { + function ShadowMapperBase() { + this._pDepthMapSize = 2048; + this._autoUpdateShadows = true; + this._pCasterCollector = this.pCreateCasterCollector(); + } + ShadowMapperBase.prototype.pCreateCasterCollector = function () { + return new ShadowCasterCollector(); + }; + + Object.defineProperty(ShadowMapperBase.prototype, "autoUpdateShadows", { + get: function () { + return this._autoUpdateShadows; + }, + set: function (value) { + this._autoUpdateShadows = value; + }, + enumerable: true, + configurable: true + }); + + + ShadowMapperBase.prototype.updateShadows = function () { + this._iShadowsInvalid = true; + }; + + ShadowMapperBase.prototype.iSetDepthMap = function (depthMap) { + if (this._depthMap == depthMap) + return; + + if (this._depthMap && !this._explicitDepthMap) + this._depthMap.dispose(); + + this._depthMap = depthMap; + + if (this._depthMap) { + this._explicitDepthMap = true; + this._pDepthMapSize = this._depthMap.size; + } else { + this._explicitDepthMap = false; + } + }; + + Object.defineProperty(ShadowMapperBase.prototype, "light", { + get: function () { + return this._pLight; + }, + set: function (value) { + this._pLight = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ShadowMapperBase.prototype, "depthMap", { + get: function () { + if (!this._depthMap) + this._depthMap = this.pCreateDepthTexture(); + + return this._depthMap; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ShadowMapperBase.prototype, "depthMapSize", { + get: function () { + return this._pDepthMapSize; + }, + set: function (value) { + if (value == this._pDepthMapSize) + return; + + this._pSetDepthMapSize(value); + }, + enumerable: true, + configurable: true + }); + + + ShadowMapperBase.prototype.dispose = function () { + this._pCasterCollector = null; + + if (this._depthMap && !this._explicitDepthMap) + this._depthMap.dispose(); + + this._depthMap = null; + }; + + ShadowMapperBase.prototype.pCreateDepthTexture = function () { + return new RenderTexture(this._pDepthMapSize, this._pDepthMapSize); + }; + + ShadowMapperBase.prototype.iRenderDepthMap = function (entityCollector, renderer) { + this._iShadowsInvalid = false; + + this.pUpdateDepthProjection(entityCollector.camera); + + if (!this._depthMap) + this._depthMap = this.pCreateDepthTexture(); + + this.pDrawDepthMap(this._depthMap, entityCollector.scene, renderer); + }; + + ShadowMapperBase.prototype.pUpdateDepthProjection = function (viewCamera) { + throw new AbstractMethodError(); + }; + + ShadowMapperBase.prototype.pDrawDepthMap = function (target, scene, renderer) { + throw new AbstractMethodError(); + }; + + ShadowMapperBase.prototype._pSetDepthMapSize = function (value) { + this._pDepthMapSize = value; + + if (this._explicitDepthMap) { + throw Error("Cannot set depth map size for the current renderer."); + } else if (this._depthMap) { + this._depthMap.dispose(); + this._depthMap = null; + } + }; + return ShadowMapperBase; +})(); + +module.exports = ShadowMapperBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm1hdGVyaWFscy9zaGFkb3dtYXBwZXJzL1NoYWRvd01hcHBlckJhc2UudHMiXSwibmFtZXMiOlsiU2hhZG93TWFwcGVyQmFzZSIsIlNoYWRvd01hcHBlckJhc2UuY29uc3RydWN0b3IiLCJTaGFkb3dNYXBwZXJCYXNlLnBDcmVhdGVDYXN0ZXJDb2xsZWN0b3IiLCJTaGFkb3dNYXBwZXJCYXNlLnVwZGF0ZVNoYWRvd3MiLCJTaGFkb3dNYXBwZXJCYXNlLmlTZXREZXB0aE1hcCIsIlNoYWRvd01hcHBlckJhc2UuZGlzcG9zZSIsIlNoYWRvd01hcHBlckJhc2UucENyZWF0ZURlcHRoVGV4dHVyZSIsIlNoYWRvd01hcHBlckJhc2UuaVJlbmRlckRlcHRoTWFwIiwiU2hhZG93TWFwcGVyQmFzZS5wVXBkYXRlRGVwdGhQcm9qZWN0aW9uIiwiU2hhZG93TWFwcGVyQmFzZS5wRHJhd0RlcHRoTWFwIiwiU2hhZG93TWFwcGVyQmFzZS5fcFNldERlcHRoTWFwU2l6ZSJdLCJtYXBwaW5ncyI6IkFBQUEsMEZBSStGO0FBQy9GLCtFQUFxRjs7QUFFckYscUVBQTRFOztBQUc1RTtJQVlDQTtRQU5BQyxLQUFPQSxjQUFjQSxHQUFVQSxJQUFJQSxDQUFDQTtRQUdwQ0EsS0FBUUEsa0JBQWtCQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUt6Q0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLENBQUNBO0lBQ3ZEQSxDQUFDQTtJQUVERCxvREFBQUE7UUFFQ0UsT0FBT0EsSUFBSUEscUJBQXFCQSxDQUFDQSxDQUFDQTtJQUNuQ0EsQ0FBQ0E7O0lBRURGO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGtCQUFrQkE7UUFDL0JBLENBQUNBO1FBRURBLEtBQUFBLFVBQTZCQSxLQUFhQTtZQUV6Q0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxHQUFHQSxLQUFLQTtRQUNoQ0EsQ0FBQ0E7Ozs7QUFMQUE7O0lBT0RBLDJDQUFBQTtRQUVDRyxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLElBQUlBO0lBQzdCQSxDQUFDQTs7SUFFREgsMENBQUFBLFVBQW9CQSxRQUF5QkE7UUFFNUNJLElBQUlBLElBQUlBLENBQUNBLFNBQVNBLElBQUlBLFFBQVFBO1lBQzdCQSxNQUFPQSxDQUFBQTs7UUFFUkEsSUFBSUEsSUFBSUEsQ0FBQ0EsU0FBU0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQTtZQUM1Q0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRTFCQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxRQUFRQTs7UUFFekJBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBLENBQUVBO1lBQ25CQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLElBQUlBO1lBQzdCQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQTtTQUN6Q0EsS0FBTUE7WUFDTkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxLQUFLQTtTQUM5QkE7SUFDRkEsQ0FBQ0E7O0lBRURKO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFpQkEsS0FBZUE7WUFFL0JBLElBQUlBLENBQUNBLE9BQU9BLEdBQUdBLEtBQUtBO1FBQ3JCQSxDQUFDQTs7OztBQUxBQTs7SUFPREE7UUFBQUEsS0FBQUE7WUFFQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0E7Z0JBQ2xCQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxJQUFJQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBOztZQUU3Q0EsT0FBT0EsSUFBSUEsQ0FBQ0EsU0FBU0E7UUFDdEJBLENBQUNBOzs7O0FBQUFBO0lBRURBO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGNBQWNBO1FBQzNCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF3QkEsS0FBWUE7WUFFbkNBLElBQUlBLEtBQUtBLElBQUlBLElBQUlBLENBQUNBLGNBQWNBO2dCQUMvQkEsTUFBT0EsQ0FBQUE7O1lBRVJBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFDOUJBLENBQUNBOzs7O0FBUkFBOztJQVVEQSxxQ0FBQUE7UUFFQ0ssSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxJQUFJQTs7UUFFN0JBLElBQUlBLElBQUlBLENBQUNBLFNBQVNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGlCQUFpQkE7WUFDNUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBOztRQUUxQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsSUFBSUE7SUFDdEJBLENBQUNBOztJQUVETCxpREFBQUE7UUFFQ00sT0FBT0EsSUFBSUEsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0E7SUFDbkVBLENBQUNBOztJQUVETiw2Q0FBQUEsVUFBdUJBLGVBQStCQSxFQUFFQSxRQUFrQkE7UUFFekVPLElBQUlBLENBQUNBLGdCQUFnQkEsR0FBR0EsS0FBS0E7O1FBRTdCQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLGVBQWVBLENBQUNBLE1BQU1BLENBQUNBOztRQUVuREEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0E7WUFDbEJBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRTdDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxFQUFFQSxlQUFlQSxDQUFDQSxLQUFLQSxFQUFFQSxRQUFRQSxDQUFDQTtJQUNwRUEsQ0FBQ0E7O0lBRURQLG9EQUFBQSxVQUE4QkEsVUFBaUJBO1FBRTlDUSxNQUFNQSxJQUFJQSxtQkFBbUJBLENBQUNBLENBQUNBO0lBQ2hDQSxDQUFDQTs7SUFFRFIsMkNBQUFBLFVBQXFCQSxNQUF1QkEsRUFBRUEsS0FBV0EsRUFBRUEsUUFBa0JBO1FBRTVFUyxNQUFNQSxJQUFJQSxtQkFBbUJBLENBQUNBLENBQUNBO0lBQ2hDQSxDQUFDQTs7SUFFRFQsK0NBQUFBLFVBQXlCQSxLQUFLQTtRQUU3QlUsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsS0FBS0E7O1FBRTNCQSxJQUFJQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUVBO1lBQzNCQSxNQUFNQSxLQUFLQSxDQUFDQSxxREFBcURBLENBQUNBO1NBQ2xFQSxNQUFNQSxJQUFJQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFFQTtZQUMxQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7WUFDeEJBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLElBQUlBO1NBQ3JCQTtJQUNGQSxDQUFDQTtJQUNGVix3QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxpQ0FBMEIsQ0FBQSIsImZpbGUiOiJtYXRlcmlhbHMvc2hhZG93bWFwcGVycy9TaGFkb3dNYXBwZXJCYXNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFNjZW5lXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRhaW5lcnMvU2NlbmVcIik7XG5pbXBvcnQgTGlnaHRCYXNlXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvTGlnaHRCYXNlXCIpO1xuaW1wb3J0IElSZW5kZXJlclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9yZW5kZXIvSVJlbmRlcmVyXCIpO1xuaW1wb3J0IEVudGl0eUNvbGxlY3Rvclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvdHJhdmVyc2UvRW50aXR5Q29sbGVjdG9yXCIpO1xuaW1wb3J0IFNoYWRvd0Nhc3RlckNvbGxlY3Rvclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS90cmF2ZXJzZS9TaGFkb3dDYXN0ZXJDb2xsZWN0b3JcIik7XG5pbXBvcnQgQWJzdHJhY3RNZXRob2RFcnJvclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQWJzdHJhY3RNZXRob2RFcnJvclwiKTtcbmltcG9ydCBDYW1lcmFcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvQ2FtZXJhXCIpO1xuaW1wb3J0IFJlbmRlclRleHR1cmVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9SZW5kZXJUZXh0dXJlXCIpO1xuaW1wb3J0IFRleHR1cmVQcm94eUJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9UZXh0dXJlUHJveHlCYXNlXCIpO1xuXG5jbGFzcyBTaGFkb3dNYXBwZXJCYXNlXG57XG5cblx0cHVibGljIF9wQ2FzdGVyQ29sbGVjdG9yOlNoYWRvd0Nhc3RlckNvbGxlY3RvcjtcblxuXHRwcml2YXRlIF9kZXB0aE1hcDpUZXh0dXJlUHJveHlCYXNlO1xuXHRwdWJsaWMgX3BEZXB0aE1hcFNpemU6bnVtYmVyID0gMjA0ODtcblx0cHVibGljIF9wTGlnaHQ6TGlnaHRCYXNlO1xuXHRwcml2YXRlIF9leHBsaWNpdERlcHRoTWFwOmJvb2xlYW47XG5cdHByaXZhdGUgX2F1dG9VcGRhdGVTaGFkb3dzOmJvb2xlYW4gPSB0cnVlO1xuXHRwdWJsaWMgX2lTaGFkb3dzSW52YWxpZDpib29sZWFuO1xuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHRoaXMuX3BDYXN0ZXJDb2xsZWN0b3IgPSB0aGlzLnBDcmVhdGVDYXN0ZXJDb2xsZWN0b3IoKTtcblx0fVxuXG5cdHB1YmxpYyBwQ3JlYXRlQ2FzdGVyQ29sbGVjdG9yKClcblx0e1xuXHRcdHJldHVybiBuZXcgU2hhZG93Q2FzdGVyQ29sbGVjdG9yKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGF1dG9VcGRhdGVTaGFkb3dzKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2F1dG9VcGRhdGVTaGFkb3dzO1xuXHR9XG5cblx0cHVibGljIHNldCBhdXRvVXBkYXRlU2hhZG93cyh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0dGhpcy5fYXV0b1VwZGF0ZVNoYWRvd3MgPSB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyB1cGRhdGVTaGFkb3dzKClcblx0e1xuXHRcdHRoaXMuX2lTaGFkb3dzSW52YWxpZCA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgaVNldERlcHRoTWFwKGRlcHRoTWFwOlRleHR1cmVQcm94eUJhc2UpXG5cdHtcblx0XHRpZiAodGhpcy5fZGVwdGhNYXAgPT0gZGVwdGhNYXApXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAodGhpcy5fZGVwdGhNYXAgJiYgIXRoaXMuX2V4cGxpY2l0RGVwdGhNYXApXG5cdFx0XHR0aGlzLl9kZXB0aE1hcC5kaXNwb3NlKCk7XG5cblx0XHR0aGlzLl9kZXB0aE1hcCA9IGRlcHRoTWFwO1xuXG5cdFx0aWYgKHRoaXMuX2RlcHRoTWFwKSB7XG5cdFx0XHR0aGlzLl9leHBsaWNpdERlcHRoTWFwID0gdHJ1ZTtcblx0XHRcdHRoaXMuX3BEZXB0aE1hcFNpemUgPSB0aGlzLl9kZXB0aE1hcC5zaXplO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLl9leHBsaWNpdERlcHRoTWFwID0gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGdldCBsaWdodCgpOkxpZ2h0QmFzZVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BMaWdodDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbGlnaHQodmFsdWU6TGlnaHRCYXNlKVxuXHR7XG5cdFx0dGhpcy5fcExpZ2h0ID0gdmFsdWU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRlcHRoTWFwKCk6VGV4dHVyZVByb3h5QmFzZVxuXHR7XG5cdFx0aWYgKCF0aGlzLl9kZXB0aE1hcClcblx0XHRcdHRoaXMuX2RlcHRoTWFwID0gdGhpcy5wQ3JlYXRlRGVwdGhUZXh0dXJlKCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZGVwdGhNYXA7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRlcHRoTWFwU2l6ZSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BEZXB0aE1hcFNpemU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGRlcHRoTWFwU2l6ZSh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodmFsdWUgPT0gdGhpcy5fcERlcHRoTWFwU2l6ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3BTZXREZXB0aE1hcFNpemUodmFsdWUpO1xuXHR9XG5cblx0cHVibGljIGRpc3Bvc2UoKVxuXHR7XG5cdFx0dGhpcy5fcENhc3RlckNvbGxlY3RvciA9IG51bGw7XG5cblx0XHRpZiAodGhpcy5fZGVwdGhNYXAgJiYgIXRoaXMuX2V4cGxpY2l0RGVwdGhNYXApXG5cdFx0XHR0aGlzLl9kZXB0aE1hcC5kaXNwb3NlKCk7XG5cblx0XHR0aGlzLl9kZXB0aE1hcCA9IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgcENyZWF0ZURlcHRoVGV4dHVyZSgpOlRleHR1cmVQcm94eUJhc2Vcblx0e1xuXHRcdHJldHVybiBuZXcgUmVuZGVyVGV4dHVyZSh0aGlzLl9wRGVwdGhNYXBTaXplLCB0aGlzLl9wRGVwdGhNYXBTaXplKTtcblx0fVxuXG5cdHB1YmxpYyBpUmVuZGVyRGVwdGhNYXAoZW50aXR5Q29sbGVjdG9yOkVudGl0eUNvbGxlY3RvciwgcmVuZGVyZXI6SVJlbmRlcmVyKVxuXHR7XG5cdFx0dGhpcy5faVNoYWRvd3NJbnZhbGlkID0gZmFsc2U7XG5cblx0XHR0aGlzLnBVcGRhdGVEZXB0aFByb2plY3Rpb24oZW50aXR5Q29sbGVjdG9yLmNhbWVyYSk7XG5cblx0XHRpZiAoIXRoaXMuX2RlcHRoTWFwKVxuXHRcdFx0dGhpcy5fZGVwdGhNYXAgPSB0aGlzLnBDcmVhdGVEZXB0aFRleHR1cmUoKTtcblxuXHRcdHRoaXMucERyYXdEZXB0aE1hcCh0aGlzLl9kZXB0aE1hcCwgZW50aXR5Q29sbGVjdG9yLnNjZW5lLCByZW5kZXJlcik7XG5cdH1cblxuXHRwdWJsaWMgcFVwZGF0ZURlcHRoUHJvamVjdGlvbih2aWV3Q2FtZXJhOkNhbWVyYSlcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHRwdWJsaWMgcERyYXdEZXB0aE1hcCh0YXJnZXQ6VGV4dHVyZVByb3h5QmFzZSwgc2NlbmU6U2NlbmUsIHJlbmRlcmVyOklSZW5kZXJlcilcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHRwdWJsaWMgX3BTZXREZXB0aE1hcFNpemUodmFsdWUpXG5cdHtcblx0XHR0aGlzLl9wRGVwdGhNYXBTaXplID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5fZXhwbGljaXREZXB0aE1hcCkge1xuXHRcdFx0dGhyb3cgRXJyb3IoXCJDYW5ub3Qgc2V0IGRlcHRoIG1hcCBzaXplIGZvciB0aGUgY3VycmVudCByZW5kZXJlci5cIik7XG5cdFx0fSBlbHNlIGlmICh0aGlzLl9kZXB0aE1hcCkge1xuXHRcdFx0dGhpcy5fZGVwdGhNYXAuZGlzcG9zZSgpO1xuXHRcdFx0dGhpcy5fZGVwdGhNYXAgPSBudWxsO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgPSBTaGFkb3dNYXBwZXJCYXNlOyJdfQ== \ No newline at end of file diff --git a/lib/materials/shadowmappers/ShadowMapperBase.ts b/lib/materials/shadowmappers/ShadowMapperBase.ts new file mode 100644 index 00000000..86d11dc4 --- /dev/null +++ b/lib/materials/shadowmappers/ShadowMapperBase.ts @@ -0,0 +1,147 @@ +import Scene = require("awayjs-core/lib/containers/Scene"); +import LightBase = require("awayjs-core/lib/core/base/LightBase"); +import IRenderer = require("awayjs-core/lib/core/render/IRenderer"); +import EntityCollector = require("awayjs-core/lib/core/traverse/EntityCollector"); +import ShadowCasterCollector = require("awayjs-core/lib/core/traverse/ShadowCasterCollector"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import Camera = require("awayjs-core/lib/entities/Camera"); +import RenderTexture = require("awayjs-core/lib/textures/RenderTexture"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +class ShadowMapperBase +{ + + public _pCasterCollector:ShadowCasterCollector; + + private _depthMap:TextureProxyBase; + public _pDepthMapSize:number = 2048; + public _pLight:LightBase; + private _explicitDepthMap:boolean; + private _autoUpdateShadows:boolean = true; + public _iShadowsInvalid:boolean; + + constructor() + { + this._pCasterCollector = this.pCreateCasterCollector(); + } + + public pCreateCasterCollector() + { + return new ShadowCasterCollector(); + } + + public get autoUpdateShadows():boolean + { + return this._autoUpdateShadows; + } + + public set autoUpdateShadows(value:boolean) + { + this._autoUpdateShadows = value; + } + + public updateShadows() + { + this._iShadowsInvalid = true; + } + + public iSetDepthMap(depthMap:TextureProxyBase) + { + if (this._depthMap == depthMap) + return; + + if (this._depthMap && !this._explicitDepthMap) + this._depthMap.dispose(); + + this._depthMap = depthMap; + + if (this._depthMap) { + this._explicitDepthMap = true; + this._pDepthMapSize = this._depthMap.size; + } else { + this._explicitDepthMap = false; + } + } + + public get light():LightBase + { + return this._pLight; + } + + public set light(value:LightBase) + { + this._pLight = value; + } + + public get depthMap():TextureProxyBase + { + if (!this._depthMap) + this._depthMap = this.pCreateDepthTexture(); + + return this._depthMap; + } + + public get depthMapSize():number + { + return this._pDepthMapSize; + } + + public set depthMapSize(value:number) + { + if (value == this._pDepthMapSize) + return; + + this._pSetDepthMapSize(value); + } + + public dispose() + { + this._pCasterCollector = null; + + if (this._depthMap && !this._explicitDepthMap) + this._depthMap.dispose(); + + this._depthMap = null; + } + + public pCreateDepthTexture():TextureProxyBase + { + return new RenderTexture(this._pDepthMapSize, this._pDepthMapSize); + } + + public iRenderDepthMap(entityCollector:EntityCollector, renderer:IRenderer) + { + this._iShadowsInvalid = false; + + this.pUpdateDepthProjection(entityCollector.camera); + + if (!this._depthMap) + this._depthMap = this.pCreateDepthTexture(); + + this.pDrawDepthMap(this._depthMap, entityCollector.scene, renderer); + } + + public pUpdateDepthProjection(viewCamera:Camera) + { + throw new AbstractMethodError(); + } + + public pDrawDepthMap(target:TextureProxyBase, scene:Scene, renderer:IRenderer) + { + throw new AbstractMethodError(); + } + + public _pSetDepthMapSize(value) + { + this._pDepthMapSize = value; + + if (this._explicitDepthMap) { + throw Error("Cannot set depth map size for the current renderer."); + } else if (this._depthMap) { + this._depthMap.dispose(); + this._depthMap = null; + } + } +} + +export = ShadowMapperBase; \ No newline at end of file diff --git a/lib/parsers/CubeTextureParser.js b/lib/parsers/CubeTextureParser.js new file mode 100755 index 00000000..c2de7fcd --- /dev/null +++ b/lib/parsers/CubeTextureParser.js @@ -0,0 +1,144 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + +var ImageCubeTexture = require("awayjs-core/lib/textures/ImageCubeTexture"); + +/** +* CubeTextureParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into +* a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without +* exception cases. +*/ +var CubeTextureParser = (function (_super) { + __extends(CubeTextureParser, _super); + /** + * Creates a new CubeTextureParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + function CubeTextureParser() { + _super.call(this, URLLoaderDataFormat.TEXT); + } + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + CubeTextureParser.supportsType = function (extension) { + extension = extension.toLowerCase(); + return extension == "cube"; + }; + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + CubeTextureParser.supportsData = function (data) { + try { + var obj = JSON.parse(data); + + if (obj) { + return true; + } + return false; + } catch (e) { + return false; + } + + return false; + }; + + /** + * @inheritDoc + */ + CubeTextureParser.prototype._iResolveDependency = function (resourceDependency) { + }; + + /** + * @inheritDoc + */ + CubeTextureParser.prototype._iResolveDependencyFailure = function (resourceDependency) { + }; + + /** + * @inheritDoc + */ + CubeTextureParser.prototype._pProceedParsing = function () { + if (this._imgDependencyDictionary != null) { + var asset = new ImageCubeTexture(this._getHTMLImageElement(CubeTextureParser.posX), this._getHTMLImageElement(CubeTextureParser.negX), this._getHTMLImageElement(CubeTextureParser.posY), this._getHTMLImageElement(CubeTextureParser.negY), this._getHTMLImageElement(CubeTextureParser.posZ), this._getHTMLImageElement(CubeTextureParser.negZ)); + + //clear dictionary + this._imgDependencyDictionary = null; + + asset.name = this._iFileName; + + this._pFinalizeAsset(asset, this._iFileName); + + return ParserBase.PARSING_DONE; + } + + try { + var json = JSON.parse(this.data); + var data = json.data; + var rec; + + if (data.length != 6) + this._pDieWithError('CubeTextureParser: Error - cube texture should have exactly 6 images'); + + if (json) { + this._imgDependencyDictionary = new Object(); + + for (var c = 0; c < data.length; c++) { + rec = data[c]; + this._imgDependencyDictionary[rec.id] = this._pAddDependency(rec.id, new URLRequest(rec.image.toString())); + } + + if (!this._validateCubeData()) { + this._pDieWithError("CubeTextureParser: JSON data error - cubes require id of: \n" + CubeTextureParser.posX + ', ' + CubeTextureParser.negX + ', \n' + CubeTextureParser.posY + ', ' + CubeTextureParser.negY + ', \n' + CubeTextureParser.posZ + ', ' + CubeTextureParser.negZ); + + return ParserBase.PARSING_DONE; + } + + this._pPauseAndRetrieveDependencies(); + + return ParserBase.MORE_TO_PARSE; + } + } catch (e) { + this._pDieWithError('CubeTexturePaser Error parsing JSON'); + } + + return ParserBase.PARSING_DONE; + }; + + CubeTextureParser.prototype._validateCubeData = function () { + return (this._imgDependencyDictionary[CubeTextureParser.posX] != null && this._imgDependencyDictionary[CubeTextureParser.negX] != null && this._imgDependencyDictionary[CubeTextureParser.posY] != null && this._imgDependencyDictionary[CubeTextureParser.negY] != null && this._imgDependencyDictionary[CubeTextureParser.posZ] != null && this._imgDependencyDictionary[CubeTextureParser.negZ] != null); + }; + + CubeTextureParser.prototype._getHTMLImageElement = function (name) { + var dependency = this._imgDependencyDictionary[name]; + + if (dependency) { + return dependency.assets[0].htmlImageElement; + } + + return null; + }; + CubeTextureParser.posX = 'posX'; + CubeTextureParser.negX = 'negX'; + CubeTextureParser.posY = 'posY'; + CubeTextureParser.negY = 'negY'; + CubeTextureParser.posZ = 'posZ'; + CubeTextureParser.negZ = 'negZ'; + return CubeTextureParser; +})(ParserBase); + +module.exports = CubeTextureParser; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlcnMvQ3ViZVRleHR1cmVQYXJzZXIudHMiXSwibmFtZXMiOlsiQ3ViZVRleHR1cmVQYXJzZXIiLCJDdWJlVGV4dHVyZVBhcnNlci5jb25zdHJ1Y3RvciIsIkN1YmVUZXh0dXJlUGFyc2VyLnN1cHBvcnRzVHlwZSIsIkN1YmVUZXh0dXJlUGFyc2VyLnN1cHBvcnRzRGF0YSIsIkN1YmVUZXh0dXJlUGFyc2VyLl9pUmVzb2x2ZURlcGVuZGVuY3kiLCJDdWJlVGV4dHVyZVBhcnNlci5faVJlc29sdmVEZXBlbmRlbmN5RmFpbHVyZSIsIkN1YmVUZXh0dXJlUGFyc2VyLl9wUHJvY2VlZFBhcnNpbmciLCJDdWJlVGV4dHVyZVBhcnNlci5fdmFsaWRhdGVDdWJlRGF0YSIsIkN1YmVUZXh0dXJlUGFyc2VyLl9nZXRIVE1MSW1hZ2VFbGVtZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxpRkFDc0Y7QUFDdEYsK0RBQXNFO0FBQ3RFLDhEQUFxRTs7QUFFckUsMkVBQWlGOztBQUdqRjs7OztFQUlHO0FBQ0g7SUFBZ0NBLG9DQUFVQTtJQWdCekNBOzs7O01BREdBO0lBQ0hBO1FBRUNDLFdBQU1BLE9BQUFBLG1CQUFtQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7SUFDaENBLENBQUNBO0lBUUREOzs7O01BRkdBO3FDQUVIQSxVQUEyQkEsU0FBZ0JBO1FBRTFDRSxTQUFTQSxHQUFHQSxTQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTtRQUNuQ0EsT0FBT0EsU0FBU0EsSUFBSUEsTUFBTUE7SUFDM0JBLENBQUNBOztJQU9ERjs7OztNQURHQTtxQ0FDSEEsVUFBMkJBLElBQVFBO1FBRWxDRyxJQUFJQTtZQUNIQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQTs7WUFFMUJBLElBQUlBLEdBQUdBLENBQUVBO2dCQUNSQSxPQUFPQSxJQUFJQTthQUNYQTtZQUNEQSxPQUFPQSxLQUFLQTtTQUNaQSxDQUFDQSxPQUFPQSxDQUFD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RUEsZ0JBQWdCQTtTQUNoRkE7O1FBRURBLE9BQU9BLElBQUlBO0lBQ1pBLENBQUNBO0lBMUlEUix5QkFBNkJBLE1BQU1BO0lBQ25DQSx5QkFBNkJBLE1BQU1BO0lBQ25DQSx5QkFBNkJBLE1BQU1BO0lBQ25DQSx5QkFBNkJBLE1BQU1BO0lBQ25DQSx5QkFBNkJBLE1BQU1BO0lBQ25DQSx5QkFBNkJBLE1BQU1BO0lBdUlwQ0EseUJBQUNBO0FBQURBLENBQUNBLEVBOUkrQixVQUFVLEVBOEl6Qzs7QUFFRCxrQ0FBMkIsQ0FBQSIsImZpbGUiOiJwYXJzZXJzL0N1YmVUZXh0dXJlUGFyc2VyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IElBc3NldFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0lBc3NldFwiKTtcbmltcG9ydCBVUkxMb2FkZXJEYXRhRm9ybWF0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxMb2FkZXJEYXRhRm9ybWF0XCIpO1xuaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxSZXF1ZXN0XCIpO1xuaW1wb3J0IFBhcnNlckJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlckJhc2VcIik7XG5pbXBvcnQgUmVzb3VyY2VEZXBlbmRlbmN5XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1Jlc291cmNlRGVwZW5kZW5jeVwiKTtcbmltcG9ydCBJbWFnZUN1YmVUZXh0dXJlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL0ltYWdlQ3ViZVRleHR1cmVcIik7XG5pbXBvcnQgSW1hZ2VUZXh0dXJlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvSW1hZ2VUZXh0dXJlXCIpO1xuXG4vKipcbiAqIEN1YmVUZXh0dXJlUGFyc2VyIHByb3ZpZGVzIGEgXCJwYXJzZXJcIiBmb3IgbmF0aXZlbHkgc3VwcG9ydGVkIGltYWdlIHR5cGVzIChqcGcsIHBuZykuIFdoaWxlIGl0IHNpbXBseSBsb2FkcyBieXRlcyBpbnRvXG4gKiBhIGxvYWRlciBvYmplY3QsIGl0IHdyYXBzIGl0IGluIGEgQml0bWFwRGF0YVJlc291cmNlIHNvIHJlc291cmNlIG1hbmFnZW1lbnQgY2FuIGhhcHBlbiBjb25zaXN0ZW50bHkgd2l0aG91dFxuICogZXhjZXB0aW9uIGNhc2VzLlxuICovXG5jbGFzcyBDdWJlVGV4dHVyZVBhcnNlciBleHRlbmRzIFBhcnNlckJhc2Vcbntcblx0cHJpdmF0ZSBzdGF0aWMgcG9zWDpzdHJpbmcgPSAncG9zWCc7XG5cdHByaXZhdGUgc3RhdGljIG5lZ1g6c3RyaW5nID0gJ25lZ1gnO1xuXHRwcml2YXRlIHN0YXRpYyBwb3NZOnN0cmluZyA9ICdwb3NZJztcblx0cHJpdmF0ZSBzdGF0aWMgbmVnWTpzdHJpbmcgPSAnbmVnWSc7XG5cdHByaXZhdGUgc3RhdGljIHBvc1o6c3RyaW5nID0gJ3Bvc1onO1xuXHRwcml2YXRlIHN0YXRpYyBuZWdaOnN0cmluZyA9ICduZWdaJztcblxuXHRwcml2YXRlIF9pbWdEZXBlbmRlbmN5RGljdGlvbmFyeTpPYmplY3Q7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgQ3ViZVRleHR1cmVQYXJzZXIgb2JqZWN0LlxuXHQgKiBAcGFyYW0gdXJpIFRoZSB1cmwgb3IgaWQgb2YgdGhlIGRhdGEgb3IgZmlsZSB0byBiZSBwYXJzZWQuXG5cdCAqIEBwYXJhbSBleHRyYSBUaGUgaG9sZGVyIGZvciBleHRyYSBjb250ZXh0dWFsIGRhdGEgdGhhdCB0aGUgcGFyc2VyIG1pZ2h0IG5lZWQuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcihVUkxMb2FkZXJEYXRhRm9ybWF0LlRFWFQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIGZpbGUgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgcGFyc2VyLlxuXHQgKiBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBmaWxlIGV4dGVuc2lvbiBvZiBhIHBvdGVudGlhbCBmaWxlIHRvIGJlIHBhcnNlZC5cblx0ICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZmlsZSB0eXBlIGlzIHN1cHBvcnRlZC5cblx0ICovXG5cblx0cHVibGljIHN0YXRpYyBzdXBwb3J0c1R5cGUoZXh0ZW5zaW9uOnN0cmluZyk6Ym9vbGVhblxuXHR7XG5cdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIGV4dGVuc2lvbiA9PSBcImN1YmVcIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUZXN0cyB3aGV0aGVyIGEgZGF0YSBibG9jayBjYW4gYmUgcGFyc2VkIGJ5IHRoZSBwYXJzZXIuXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGJsb2NrIHRvIHBvdGVudGlhbGx5IGJlIHBhcnNlZC5cblx0ICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZGF0YSBpcyBzdXBwb3J0ZWQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHN1cHBvcnRzRGF0YShkYXRhOmFueSk6Ym9vbGVhblxuXHR7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciBvYmogPSBKU09OLnBhcnNlKGRhdGEpO1xuXG5cdFx0XHRpZiAob2JqKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfaVJlc29sdmVEZXBlbmRlbmN5KHJlc291cmNlRGVwZW5kZW5jeTpSZXNvdXJjZURlcGVuZGVuY3kpXG5cdHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgX2lSZXNvbHZlRGVwZW5kZW5jeUZhaWx1cmUocmVzb3VyY2VEZXBlbmRlbmN5OlJlc291cmNlRGVwZW5kZW5jeSlcblx0e1xuXG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfcFByb2NlZWRQYXJzaW5nKCk6Ym9vbGVhblxuXHR7XG5cdFx0aWYgKHRoaXMuX2ltZ0RlcGVuZGVuY3lEaWN0aW9uYXJ5ICE9IG51bGwpIHsgLy9hbGwgaW1hZ2VzIGxvYWRlZFxuXHRcdFx0dmFyIGFzc2V0OkltYWdlQ3ViZVRleHR1cmUgPSBuZXcgSW1hZ2VDdWJlVGV4dHVyZShcblxuXHRcdFx0XHR0aGlzLl9nZXRIVE1MSW1hZ2VFbGVtZW50KEN1YmVUZXh0dXJlUGFyc2VyLnBvc1gpLCB0aGlzLl9nZXRIVE1MSW1hZ2VFbGVtZW50KEN1YmVUZXh0dXJlUGFyc2VyLm5lZ1gpLCB0aGlzLl9nZXRIVE1MSW1hZ2VFbGVtZW50KEN1YmVUZXh0dXJlUGFyc2VyLnBvc1kpLCB0aGlzLl9nZXRIVE1MSW1hZ2VFbGVtZW50KEN1YmVUZXh0dXJlUGFyc2VyLm5lZ1kpLCB0aGlzLl9nZXRIVE1MSW1hZ2VFbGVtZW50KEN1YmVUZXh0dXJlUGFyc2VyLnBvc1opLCB0aGlzLl9nZXRIVE1MSW1hZ2VFbGVtZW50KEN1YmVUZXh0dXJlUGFyc2VyLm5lZ1opKTtcblxuXHRcdFx0Ly9jbGVhciBkaWN0aW9uYXJ5XG5cdFx0XHR0aGlzLl9pbWdEZXBlbmRlbmN5RGljdGlvbmFyeSA9IG51bGw7XG5cblx0XHRcdGFzc2V0Lm5hbWUgPSB0aGlzLl9pRmlsZU5hbWU7XG5cblx0XHRcdHRoaXMuX3BGaW5hbGl6ZUFzc2V0KDxJQXNzZXQ+IGFzc2V0LCB0aGlzLl9pRmlsZU5hbWUpO1xuXG5cdFx0XHRyZXR1cm4gUGFyc2VyQmFzZS5QQVJTSU5HX0RPTkU7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHZhciBqc29uOmFueSA9IEpTT04ucGFyc2UodGhpcy5kYXRhKTtcblx0XHRcdHZhciBkYXRhOkFycmF5PE9iamVjdD4gPSA8QXJyYXk8T2JqZWN0Pj4ganNvbi5kYXRhO1xuXHRcdFx0dmFyIHJlYzphbnk7XG5cblx0XHRcdGlmIChkYXRhLmxlbmd0aCAhPSA2KVxuXHRcdFx0XHR0aGlzLl9wRGllV2l0aEVycm9yKCdDdWJlVGV4dHVyZVBhcnNlcjogRXJyb3IgLSBjdWJlIHRleHR1cmUgc2hvdWxkIGhhdmUgZXhhY3RseSA2IGltYWdlcycpO1xuXG5cdFx0XHRpZiAoanNvbikge1xuXHRcdFx0XHR0aGlzLl9pbWdEZXBlbmRlbmN5RGljdGlvbmFyeSA9IG5ldyBPYmplY3QoKTtcblxuXHRcdFx0XHRmb3IgKHZhciBjOm51bWJlciA9IDA7IGMgPCBkYXRhLmxlbmd0aDsgYysrKSB7XG5cdFx0XHRcdFx0cmVjID0gZGF0YVtjXTtcblx0XHRcdFx0XHR0aGlzLl9pbWdEZXBlbmRlbmN5RGljdGlvbmFyeVtyZWMuaWRdID0gdGhpcy5fcEFkZERlcGVuZGVuY3kocmVjLmlkLCBuZXcgVVJMUmVxdWVzdChyZWMuaW1hZ2UudG9TdHJpbmcoKSkpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCF0aGlzLl92YWxpZGF0ZUN1YmVEYXRhKCkpIHtcblxuXHRcdFx0XHRcdHRoaXMuX3BEaWVXaXRoRXJyb3IoXCJDdWJlVGV4dHVyZVBhcnNlcjogSlNPTiBkYXRhIGVycm9yIC0gY3ViZXMgcmVxdWlyZSBpZCBvZjogICBcXG5cIiArIEN1YmVUZXh0dXJlUGFyc2VyLnBvc1ggKyAnLCAnICsgQ3ViZVRleHR1cmVQYXJzZXIubmVnWCArICcsICBcXG4nICsgQ3ViZVRleHR1cmVQYXJzZXIucG9zWSArICcsICcgKyBDdWJlVGV4dHVyZVBhcnNlci5uZWdZICsgJywgIFxcbicgKyBDdWJlVGV4dHVyZVBhcnNlci5wb3NaICsgJywgJyArIEN1YmVUZXh0dXJlUGFyc2VyLm5lZ1opO1xuXG5cdFx0XHRcdFx0cmV0dXJuIFBhcnNlckJhc2UuUEFSU0lOR19ET05FO1xuXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9wUGF1c2VBbmRSZXRyaWV2ZURlcGVuZGVuY2llcygpO1xuXG5cdFx0XHRcdHJldHVybiBQYXJzZXJCYXNlLk1PUkVfVE9fUEFSU0U7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0dGhpcy5fcERpZVdpdGhFcnJvcignQ3ViZVRleHR1cmVQYXNlciBFcnJvciBwYXJzaW5nIEpTT04nKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gUGFyc2VyQmFzZS5QQVJTSU5HX0RPTkU7XG5cblx0fVxuXG5cdHByaXZhdGUgX3ZhbGlkYXRlQ3ViZURhdGEoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gICggdGhpcy5faW1nRGVwZW5kZW5jeURpY3Rpb25hcnlbIEN1YmVUZXh0dXJlUGFyc2VyLnBvc1ggXSAhPSBudWxsICYmIHRoaXMuX2ltZ0RlcGVuZGVuY3lEaWN0aW9uYXJ5WyBDdWJlVGV4dHVyZVBhcnNlci5uZWdYIF0gIT0gbnVsbCAmJiB0aGlzLl9pbWdEZXBlbmRlbmN5RGljdGlvbmFyeVsgQ3ViZVRleHR1cmVQYXJzZXIucG9zWSBdICE9IG51bGwgJiYgdGhpcy5faW1nRGVwZW5kZW5jeURpY3Rpb25hcnlbIEN1YmVUZXh0dXJlUGFyc2VyLm5lZ1kgXSAhPSBudWxsICYmIHRoaXMuX2ltZ0RlcGVuZGVuY3lEaWN0aW9uYXJ5WyBDdWJlVGV4dHVyZVBhcnNlci5wb3NaIF0gIT0gbnVsbCAmJiB0aGlzLl9pbWdEZXBlbmRlbmN5RGljdGlvbmFyeVsgQ3ViZVRleHR1cmVQYXJzZXIubmVnWiBdICE9IG51bGwgKTtcblx0fVxuXG5cdHByaXZhdGUgX2dldEhUTUxJbWFnZUVsZW1lbnQobmFtZTpzdHJpbmcpOkhUTUxJbWFnZUVsZW1lbnRcblx0e1xuXHRcdHZhciBkZXBlbmRlbmN5OlJlc291cmNlRGVwZW5kZW5jeSA9IDxSZXNvdXJjZURlcGVuZGVuY3k+IHRoaXMuX2ltZ0RlcGVuZGVuY3lEaWN0aW9uYXJ5WyBuYW1lIF07XG5cblx0XHRpZiAoZGVwZW5kZW5jeSkge1xuXHRcdFx0cmV0dXJuIDxIVE1MSW1hZ2VFbGVtZW50PiAoPEltYWdlVGV4dHVyZT4gZGVwZW5kZW5jeS5hc3NldHNbMF0pLmh0bWxJbWFnZUVsZW1lbnQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxufVxuXG5leHBvcnQgPSBDdWJlVGV4dHVyZVBhcnNlcjsiXX0= \ No newline at end of file diff --git a/lib/parsers/CubeTextureParser.ts b/lib/parsers/CubeTextureParser.ts new file mode 100644 index 00000000..d54947c5 --- /dev/null +++ b/lib/parsers/CubeTextureParser.ts @@ -0,0 +1,158 @@ +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +import ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); +import ImageCubeTexture = require("awayjs-core/lib/textures/ImageCubeTexture"); +import ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); + +/** + * CubeTextureParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into + * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without + * exception cases. + */ +class CubeTextureParser extends ParserBase +{ + private static posX:string = 'posX'; + private static negX:string = 'negX'; + private static posY:string = 'posY'; + private static negY:string = 'negY'; + private static posZ:string = 'posZ'; + private static negZ:string = 'negZ'; + + private _imgDependencyDictionary:Object; + + /** + * Creates a new CubeTextureParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + constructor() + { + super(URLLoaderDataFormat.TEXT); + } + + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + + public static supportsType(extension:string):boolean + { + extension = extension.toLowerCase(); + return extension == "cube"; + } + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + public static supportsData(data:any):boolean + { + try { + var obj = JSON.parse(data); + + if (obj) { + return true; + } + return false; + } catch (e) { + return false; + } + + return false; + } + + /** + * @inheritDoc + */ + public _iResolveDependency(resourceDependency:ResourceDependency) + { + + } + + /** + * @inheritDoc + */ + public _iResolveDependencyFailure(resourceDependency:ResourceDependency) + { + + } + + /** + * @inheritDoc + */ + public _pProceedParsing():boolean + { + if (this._imgDependencyDictionary != null) { //all images loaded + var asset:ImageCubeTexture = new ImageCubeTexture( + + this._getHTMLImageElement(CubeTextureParser.posX), this._getHTMLImageElement(CubeTextureParser.negX), this._getHTMLImageElement(CubeTextureParser.posY), this._getHTMLImageElement(CubeTextureParser.negY), this._getHTMLImageElement(CubeTextureParser.posZ), this._getHTMLImageElement(CubeTextureParser.negZ)); + + //clear dictionary + this._imgDependencyDictionary = null; + + asset.name = this._iFileName; + + this._pFinalizeAsset( asset, this._iFileName); + + return ParserBase.PARSING_DONE; + } + + try { + var json:any = JSON.parse(this.data); + var data:Array = > json.data; + var rec:any; + + if (data.length != 6) + this._pDieWithError('CubeTextureParser: Error - cube texture should have exactly 6 images'); + + if (json) { + this._imgDependencyDictionary = new Object(); + + for (var c:number = 0; c < data.length; c++) { + rec = data[c]; + this._imgDependencyDictionary[rec.id] = this._pAddDependency(rec.id, new URLRequest(rec.image.toString())); + } + + if (!this._validateCubeData()) { + + this._pDieWithError("CubeTextureParser: JSON data error - cubes require id of: \n" + CubeTextureParser.posX + ', ' + CubeTextureParser.negX + ', \n' + CubeTextureParser.posY + ', ' + CubeTextureParser.negY + ', \n' + CubeTextureParser.posZ + ', ' + CubeTextureParser.negZ); + + return ParserBase.PARSING_DONE; + + } + + this._pPauseAndRetrieveDependencies(); + + return ParserBase.MORE_TO_PARSE; + } + } catch (e) { + this._pDieWithError('CubeTexturePaser Error parsing JSON'); + } + + return ParserBase.PARSING_DONE; + + } + + private _validateCubeData():boolean + { + return ( this._imgDependencyDictionary[ CubeTextureParser.posX ] != null && this._imgDependencyDictionary[ CubeTextureParser.negX ] != null && this._imgDependencyDictionary[ CubeTextureParser.posY ] != null && this._imgDependencyDictionary[ CubeTextureParser.negY ] != null && this._imgDependencyDictionary[ CubeTextureParser.posZ ] != null && this._imgDependencyDictionary[ CubeTextureParser.negZ ] != null ); + } + + private _getHTMLImageElement(name:string):HTMLImageElement + { + var dependency:ResourceDependency = this._imgDependencyDictionary[ name ]; + + if (dependency) { + return ( dependency.assets[0]).htmlImageElement; + } + + return null; + } + +} + +export = CubeTextureParser; \ No newline at end of file diff --git a/lib/parsers/ParserBase.js b/lib/parsers/ParserBase.js new file mode 100755 index 00000000..d09deb75 --- /dev/null +++ b/lib/parsers/ParserBase.js @@ -0,0 +1,337 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +var TimerEvent = require("awayjs-core/lib/events/TimerEvent"); +var ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +var ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); + +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); +var Timer = require("awayjs-core/lib/utils/Timer"); +var getTimer = require("awayjs-core/lib/utils/getTimer"); + +/** +* ParserBase provides an abstract base class for objects that convert blocks of data to data structures +* supported by away. +* +* If used by AssetLoader to automatically determine the parser type, two public static methods should +* be implemented, with the following signatures: +* +* public static supportsType(extension : string) : boolean +* Indicates whether or not a given file extension is supported by the parser. +* +* public static supportsData(data : *) : boolean +* Tests whether a data block can be parsed by the parser. +* +* Furthermore, for any concrete subtype, the method initHandle should be overridden to immediately +* create the object that will contain the parsed data. This allows ResourceManager to return an object +* handle regardless of whether the object was loaded or not. +* +* @see AssetLoader +*/ +var ParserBase = (function (_super) { + __extends(ParserBase, _super); + /** + * Creates a new ParserBase object + * @param format The data format of the file data to be parsed. Can be either ParserDataFormat.BINARY or ParserDataFormat.PLAIN_TEXT, and should be provided by the concrete subtype. + * + * @see away.loading.parsers.ParserDataFormat + */ + function ParserBase(format) { + var _this = this; + _super.call(this); + + this._materialMode = 0; + this._dataFormat = format; + this._dependencies = new Array(); + + this._pOnIntervalDelegate = function (event) { + return _this._pOnInterval(event); + }; + } + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + // TODO: add error checking for the following ( could cause a problem if this function is not implemented ) + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + // Needs to be implemented in all Parsers ( + //public static supportsType(extension : string) : boolean + //* Indicates whether or not a given file extension is supported by the parser. + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + ParserBase.supportsType = function (extension) { + throw new AbstractMethodError(); + }; + + Object.defineProperty(ParserBase.prototype, "content", { + /* Protected */ + get: function () { + return this._pContent; + }, + enumerable: true, + configurable: true + }); + + /** + * Validates a bitmapData loaded before assigning to a default BitmapMaterial + */ + ParserBase.prototype.isBitmapDataValid = function (bitmapData) { + var isValid = TextureUtils.isBitmapDataValid(bitmapData); + + if (!isValid) { + console.log(">> Bitmap loaded is not having power of 2 dimensions or is higher than 2048"); + } + + return isValid; + }; + + + Object.defineProperty(ParserBase.prototype, "parsingFailure", { + get: function () { + return this._parsingFailure; + }, + set: function (b) { + this._parsingFailure = b; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ParserBase.prototype, "parsingPaused", { + get: function () { + return this._parsingPaused; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ParserBase.prototype, "parsingComplete", { + get: function () { + return this._parsingComplete; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ParserBase.prototype, "materialMode", { + get: function () { + return this._materialMode; + }, + set: function (newMaterialMode) { + this._materialMode = newMaterialMode; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ParserBase.prototype, "data", { + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ParserBase.prototype, "dataFormat", { + /** + * The data format of the file data to be parsed. Options are URLLoaderDataFormat.BINARY, URLLoaderDataFormat.ARRAY_BUFFER, URLLoaderDataFormat.BLOB, URLLoaderDataFormat.VARIABLES or URLLoaderDataFormat.TEXT. + */ + get: function () { + return this._dataFormat; + }, + enumerable: true, + configurable: true + }); + + /** + * Parse data (possibly containing bytearry, plain text or BitmapAsset) asynchronously, meaning that + * the parser will periodically stop parsing so that the AVM may proceed to the + * next frame. + * + * @param data The untyped data object in which the loaded data resides. + * @param frameLimit number of milliseconds of parsing allowed per frame. The + * actual time spent on a frame can exceed this number since time-checks can + * only be performed between logical sections of the parsing procedure. + */ + ParserBase.prototype.parseAsync = function (data, frameLimit) { + if (typeof frameLimit === "undefined") { frameLimit = 30; } + this._data = data; + this._pStartParsing(frameLimit); + }; + + Object.defineProperty(ParserBase.prototype, "dependencies", { + /** + * A list of dependencies that need to be loaded and resolved for the object being parsed. + */ + get: function () { + return this._dependencies; + }, + enumerable: true, + configurable: true + }); + + /** + * Resolve a dependency when it's loaded. For example, a dependency containing an ImageResource would be assigned + * to a Mesh instance as a BitmapMaterial, a scene graph object would be added to its intended parent. The + * dependency should be a member of the dependencies property. + * + * @param resourceDependency The dependency to be resolved. + */ + ParserBase.prototype._iResolveDependency = function (resourceDependency) { + throw new AbstractMethodError(); + }; + + /** + * Resolve a dependency loading failure. Used by parser to eventually provide a default map + * + * @param resourceDependency The dependency to be resolved. + */ + ParserBase.prototype._iResolveDependencyFailure = function (resourceDependency) { + throw new AbstractMethodError(); + }; + + /** + * Resolve a dependency name + * + * @param resourceDependency The dependency to be resolved. + */ + ParserBase.prototype._iResolveDependencyName = function (resourceDependency, asset) { + return asset.name; + }; + + ParserBase.prototype._iResumeParsingAfterDependencies = function () { + this._parsingPaused = false; + + if (this._timer) + this._timer.start(); + }; + + ParserBase.prototype._pFinalizeAsset = function (asset, name) { + if (typeof name === "undefined") { name = null; } + var type_event; + var type_name; + + if (name != null) + asset.name = name; + + // If the asset has no name, give it + // a per-type default name. + if (!asset.name) + asset.name = asset.assetType; + + this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_COMPLETE, asset)); + }; + + /** + * Parse the next block of data. + * @return Whether or not more data needs to be parsed. Can be ParserBase.ParserBase.PARSING_DONE or + * ParserBase.ParserBase.MORE_TO_PARSE. + */ + ParserBase.prototype._pProceedParsing = function () { + throw new AbstractMethodError(); + }; + + ParserBase.prototype._pDieWithError = function (message) { + if (typeof message === "undefined") { message = 'Unknown parsing error'; } + if (this._timer) { + this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.stop(); + this._timer = null; + } + + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message)); + }; + + ParserBase.prototype._pAddDependency = function (id, req, retrieveAsRawData, data, suppressErrorEvents) { + if (typeof retrieveAsRawData === "undefined") { retrieveAsRawData = false; } + if (typeof data === "undefined") { data = null; } + if (typeof suppressErrorEvents === "undefined") { suppressErrorEvents = false; } + var dependency = new ResourceDependency(id, req, data, null, this, retrieveAsRawData, suppressErrorEvents); + this._dependencies.push(dependency); + + return dependency; + }; + + ParserBase.prototype._pPauseAndRetrieveDependencies = function () { + if (this._timer) + this._timer.stop(); + + this._parsingPaused = true; + this.dispatchEvent(new ParserEvent(ParserEvent.READY_FOR_DEPENDENCIES)); + }; + + /** + * Tests whether or not there is still time left for parsing within the maximum allowed time frame per session. + * @return True if there is still time left, false if the maximum allotted time was exceeded and parsing should be interrupted. + */ + ParserBase.prototype._pHasTime = function () { + return ((getTimer() - this._lastFrameTime) < this._frameLimit); + }; + + /** + * Called when the parsing pause interval has passed and parsing can proceed. + */ + ParserBase.prototype._pOnInterval = function (event) { + if (typeof event === "undefined") { event = null; } + this._lastFrameTime = getTimer(); + + if (this._pProceedParsing() && !this._parsingFailure) + this._pFinishParsing(); + }; + + /** + * Initializes the parsing of data. + * @param frameLimit The maximum duration of a parsing session. + */ + ParserBase.prototype._pStartParsing = function (frameLimit) { + this._frameLimit = frameLimit; + this._timer = new Timer(this._frameLimit, 0); + this._timer.addEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.start(); + }; + + /** + * Finish parsing the data. + */ + ParserBase.prototype._pFinishParsing = function () { + if (this._timer) { + this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.stop(); + } + + this._timer = null; + this._parsingComplete = true; + + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_COMPLETE)); + }; + + /** + * + * @returns {string} + * @private + */ + ParserBase.prototype._pGetTextData = function () { + return ParserUtils.toString(this._data); + }; + + /** + * + * @returns {string} + * @private + */ + ParserBase.prototype._pGetByteData = function () { + return ParserUtils.toByteArray(this._data); + }; + ParserBase.PARSING_DONE = true; + + ParserBase.MORE_TO_PARSE = false; + return ParserBase; +})(EventDispatcher); + +module.exports = ParserBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlcnMvUGFyc2VyQmFzZS50cyJdLCJuYW1lcyI6WyJQYXJzZXJCYXNlIiwiUGFyc2VyQmFzZS5jb25zdHJ1Y3RvciIsIlBhcnNlckJhc2Uuc3VwcG9ydHNUeXBlIiwiUGFyc2VyQmFzZS5pc0JpdG1hcERhdGFWYWxpZCIsIlBhcnNlckJhc2UucGFyc2VBc3luYyIsIlBhcnNlckJhc2UuX2lSZXNvbHZlRGVwZW5kZW5jeSIsIlBhcnNlckJhc2UuX2lSZXNvbHZlRGVwZW5kZW5jeUZhaWx1cmUiLCJQYXJzZXJCYXNlLl9pUmVzb2x2ZURlcGVuZGVuY3lOYW1lIiwiUGFyc2VyQmFzZS5faVJlc3VtZVBhcnNpbmdBZnRlckRlcGVuZGVuY2llcyIsIlBhcnNlckJhc2UuX3BGaW5hbGl6ZUFzc2V0IiwiUGFyc2VyQmFzZS5fcFByb2NlZWRQYXJzaW5nIiwiUGFyc2VyQmFzZS5fcERpZVdpdGhFcnJvciIsIlBhcnNlckJhc2UuX3BBZGREZXBlbmRlbmN5IiwiUGFyc2VyQmFzZS5fcFBhdXNlQW5kUmV0cmlldmVEZXBlbmRlbmNpZXMiLCJQYXJzZXJCYXNlLl9wSGFzVGltZSIsIlBhcnNlckJhc2UuX3BPbkludGVydmFsIiwiUGFyc2VyQmFzZS5fcFN0YXJ0UGFyc2luZyIsIlBhcnNlckJhc2UuX3BGaW5pc2hQYXJzaW5nIiwiUGFyc2VyQmFzZS5fcEdldFRleHREYXRhIiwiUGFyc2VyQmFzZS5fcEdldEJ5dGVEYXRhIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwrRUFJb0Y7QUFDcEYsNkRBQW9FO0FBQ3BFLHVFQUE2RTtBQUM3RSwrREFBc0U7QUFDdEUsNkRBQW9FO0FBQ3BFLGdFQUF1RTtBQUN2RSw4RUFBbUY7O0FBRW5GLGdFQUF1RTtBQUN2RSxrREFBMEQ7QUFDMUQsd0RBQWdFOztBQUVoRTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBa0JHO0FBQ0g7SUFBeUJBLDZCQUFlQTtJQWlFdkNBOzs7OztNQURHQTtJQUNIQSxvQkFBWUEsTUFBYUE7UUFBekJDLGlCQVND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Q2xCQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLElBQUlBOztRQUU1QkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsV0FBV0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7SUFDaEVBLENBQUNBOztJQU9EakI7Ozs7TUFER0E7eUNBQ0hBO1FBRUNrQixPQUFPQSxXQUFXQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTtJQUN4Q0EsQ0FBQ0E7O0lBT0RsQjs7OztNQURHQTt5Q0FDSEE7UUFFQ21CLE9BQU9BLFdBQVdBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO0lBQzNDQSxDQUFDQTtJQW5SRG5CLDBCQUFxQ0EsSUFBSUE7O0lBTXpDQSwyQkFBc0NBLEtBQUtBO0lBOFE1Q0Esa0JBQUNBO0FBQURBLENBQUNBLEVBaFV3QixlQUFlLEVBZ1V2Qzs7QUFFRCwyQkFBb0IsQ0FBQSIsImZpbGUiOiJwYXJzZXJzL1BhcnNlckJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQml0bWFwRGF0YVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9CaXRtYXBEYXRhXCIpO1xuaW1wb3J0IERpc3BsYXlPYmplY3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0Rpc3BsYXlPYmplY3RcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxSZXF1ZXN0XCIpO1xuaW1wb3J0IEFic3RyYWN0TWV0aG9kRXJyb3JcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2Vycm9ycy9BYnN0cmFjdE1ldGhvZEVycm9yXCIpO1xuaW1wb3J0IEFzc2V0RXZlbnRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvQXNzZXRFdmVudFwiKTtcbmltcG9ydCBFdmVudERpc3BhdGNoZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50RGlzcGF0Y2hlclwiKTtcbmltcG9ydCBQYXJzZXJFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9QYXJzZXJFdmVudFwiKTtcbmltcG9ydCBUaW1lckV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL1RpbWVyRXZlbnRcIik7XG5pbXBvcnQgUGFyc2VyVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlclV0aWxzXCIpO1xuaW1wb3J0IFJlc291cmNlRGVwZW5kZW5jeVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcGFyc2Vycy9SZXNvdXJjZURlcGVuZGVuY3lcIik7XG5pbXBvcnQgQnl0ZUFycmF5XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvQnl0ZUFycmF5XCIpO1xuaW1wb3J0IFRleHR1cmVVdGlsc1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL1RleHR1cmVVdGlsc1wiKTtcbmltcG9ydCBUaW1lclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvVGltZXJcIik7XG5pbXBvcnQgZ2V0VGltZXJcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL2dldFRpbWVyXCIpO1xuXG4vKipcbiAqIDxjb2RlPlBhcnNlckJhc2U8L2NvZGU+IHByb3ZpZGVzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIG9iamVjdHMgdGhhdCBjb252ZXJ0IGJsb2NrcyBvZiBkYXRhIHRvIGRhdGEgc3RydWN0dXJlc1xuICogc3VwcG9ydGVkIGJ5IGF3YXkuXG4gKlxuICogSWYgdXNlZCBieSA8Y29kZT5Bc3NldExvYWRlcjwvY29kZT4gdG8gYXV0b21hdGljYWxseSBkZXRlcm1pbmUgdGhlIHBhcnNlciB0eXBlLCB0d28gcHVibGljIHN0YXRpYyBtZXRob2RzIHNob3VsZFxuICogYmUgaW1wbGVtZW50ZWQsIHdpdGggdGhlIGZvbGxvd2luZyBzaWduYXR1cmVzOlxuICpcbiAqIDxjb2RlPnB1YmxpYyBzdGF0aWMgc3VwcG9ydHNUeXBlKGV4dGVuc2lvbiA6IHN0cmluZykgOiBib29sZWFuPC9jb2RlPlxuICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gZmlsZSBleHRlbnNpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBwYXJzZXIuXG4gKlxuICogPGNvZGU+cHVibGljIHN0YXRpYyBzdXBwb3J0c0RhdGEoZGF0YSA6ICopIDogYm9vbGVhbjwvY29kZT5cbiAqIFRlc3RzIHdoZXRoZXIgYSBkYXRhIGJsb2NrIGNhbiBiZSBwYXJzZWQgYnkgdGhlIHBhcnNlci5cbiAqXG4gKiBGdXJ0aGVybW9yZSwgZm9yIGFueSBjb25jcmV0ZSBzdWJ0eXBlLCB0aGUgbWV0aG9kIDxjb2RlPmluaXRIYW5kbGU8L2NvZGU+IHNob3VsZCBiZSBvdmVycmlkZGVuIHRvIGltbWVkaWF0ZWx5XG4gKiBjcmVhdGUgdGhlIG9iamVjdCB0aGF0IHdpbGwgY29udGFpbiB0aGUgcGFyc2VkIGRhdGEuIFRoaXMgYWxsb3dzIDxjb2RlPlJlc291cmNlTWFuYWdlcjwvY29kZT4gdG8gcmV0dXJuIGFuIG9iamVjdFxuICogaGFuZGxlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgb2JqZWN0IHdhcyBsb2FkZWQgb3Igbm90LlxuICpcbiAqIEBzZWUgQXNzZXRMb2FkZXJcbiAqL1xuY2xhc3MgUGFyc2VyQmFzZSBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlclxue1xuXHRwdWJsaWMgX2lGaWxlTmFtZTpzdHJpbmc7XG5cdHByaXZhdGUgX2RhdGFGb3JtYXQ6c3RyaW5nO1xuXHRwcml2YXRlIF9kYXRhOmFueTtcblx0cHJpdmF0ZSBfZnJhbWVMaW1pdDpudW1iZXI7XG5cdHByaXZhdGUgX2xhc3RGcmFtZVRpbWU6bnVtYmVyO1xuXHRwcml2YXRlIF9wT25JbnRlcnZhbERlbGVnYXRlOihldmVudDpUaW1lckV2ZW50KSA9PiB2b2lkO1xuXHRwdWJsaWMgX3BDb250ZW50OkRpc3BsYXlPYmplY3Q7XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdC8vIFRPRE86IGFkZCBlcnJvciBjaGVja2luZyBmb3IgdGhlIGZvbGxvd2luZyAoIGNvdWxkIGNhdXNlIGEgcHJvYmxlbSBpZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCApXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBOZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBpbiBhbGwgUGFyc2VycyAoXG5cdC8vPGNvZGU+cHVibGljIHN0YXRpYyBzdXBwb3J0c1R5cGUoZXh0ZW5zaW9uIDogc3RyaW5nKSA6IGJvb2xlYW48L2NvZGU+XG5cdC8vKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSBnaXZlbiBmaWxlIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBhcnNlci5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0cHVibGljIHN0YXRpYyBzdXBwb3J0c1R5cGUoZXh0ZW5zaW9uOnN0cmluZyk6Ym9vbGVhblxuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdC8qIFRPRE86IEltcGxlbWVudCBQYXJzZXJVdGlscztcblx0IHB1YmxpYyBfcEdldFRleHREYXRhKCk6c3RyaW5nXG5cdCB7XG5cdCByZXR1cm4gUGFyc2VyVXRpbHMudG9TdHJpbmcoX2RhdGEpO1xuXHQgfVxuXG5cdCBwdWJsaWMgX3BHZXRCeXRlRGF0YSgpOkJ5dGVBcnJheVxuXHQge1xuXHQgcmV0dXJuIFBhcnNlclV0aWxzLnRvQnl0ZUFycmF5KF9kYXRhKTtcblx0IH1cblx0ICovXG5cdHByaXZhdGUgX2RlcGVuZGVuY2llczpBcnJheTxSZXNvdXJjZURlcGVuZGVuY3k+O1xuXHRwcml2YXRlIF9wYXJzaW5nUGF1c2VkOmJvb2xlYW47XG5cdHByaXZhdGUgX3BhcnNpbmdDb21wbGV0ZTpib29sZWFuO1xuXHRwcml2YXRlIF9wYXJzaW5nRmFpbHVyZTpib29sZWFuO1xuXHRwcml2YXRlIF90aW1lcjpUaW1lcjtcblx0cHJpdmF0ZSBfbWF0ZXJpYWxNb2RlOm51bWJlcjtcblxuXHQvKipcblx0ICogUmV0dXJuZWQgYnkgPGNvZGU+cHJvY2VlZFBhcnNpbmc8L2NvZGU+IHRvIGluZGljYXRlIG5vIG1vcmUgcGFyc2luZyBpcyBuZWVkZWQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFBBUlNJTkdfRE9ORTpib29sZWFuID0gdHJ1ZTtcblx0LyogUHJvdGVjdGVkICovXG5cblx0LyoqXG5cdCAqIFJldHVybmVkIGJ5IDxjb2RlPnByb2NlZWRQYXJzaW5nPC9jb2RlPiB0byBpbmRpY2F0ZSBtb3JlIHBhcnNpbmcgaXMgbmVlZGVkLCBhbGxvd2luZyBhc3luY2hyb25vdXMgcGFyc2luZy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTU9SRV9UT19QQVJTRTpib29sZWFuID0gZmFsc2U7XG5cdC8qIFByb3RlY3RlZCAqL1xuXG5cblx0cHVibGljIGdldCBjb250ZW50KCk6RGlzcGxheU9iamVjdFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BDb250ZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgUGFyc2VyQmFzZSBvYmplY3Rcblx0ICogQHBhcmFtIGZvcm1hdCBUaGUgZGF0YSBmb3JtYXQgb2YgdGhlIGZpbGUgZGF0YSB0byBiZSBwYXJzZWQuIENhbiBiZSBlaXRoZXIgPGNvZGU+UGFyc2VyRGF0YUZvcm1hdC5CSU5BUlk8L2NvZGU+IG9yIDxjb2RlPlBhcnNlckRhdGFGb3JtYXQuUExBSU5fVEVYVDwvY29kZT4sIGFuZCBzaG91bGQgYmUgcHJvdmlkZWQgYnkgdGhlIGNvbmNyZXRlIHN1YnR5cGUuXG5cdCAqXG5cdCAqIEBzZWUgYXdheS5sb2FkaW5nLnBhcnNlcnMuUGFyc2VyRGF0YUZvcm1hdFxuXHQgKi9cblx0Y29uc3RydWN0b3IoZm9ybWF0OnN0cmluZylcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9tYXRlcmlhbE1vZGUgPSAwO1xuXHRcdHRoaXMuX2RhdGFGb3JtYXQgPSBmb3JtYXQ7XG5cdFx0dGhpcy5fZGVwZW5kZW5jaWVzID0gbmV3IEFycmF5PFJlc291cmNlRGVwZW5kZW5jeT4oKTtcblxuXHRcdHRoaXMuX3BPbkludGVydmFsRGVsZWdhdGUgPSAoZXZlbnQ6VGltZXJFdmVudCkgPT4gdGhpcy5fcE9uSW50ZXJ2YWwoZXZlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBhIGJpdG1hcERhdGEgbG9hZGVkIGJlZm9yZSBhc3NpZ25pbmcgdG8gYSBkZWZhdWx0IEJpdG1hcE1hdGVyaWFsXG5cdCAqL1xuXG5cdHB1YmxpYyBpc0JpdG1hcERhdGFWYWxpZChiaXRtYXBEYXRhOkJpdG1hcERhdGEpOmJvb2xlYW5cblx0e1xuXHRcdHZhciBpc1ZhbGlkOmJvb2xlYW4gPSBUZXh0dXJlVXRpbHMuaXNCaXRtYXBEYXRhVmFsaWQoYml0bWFwRGF0YSk7XG5cblx0XHRpZiAoIWlzVmFsaWQpIHtcblxuXHRcdFx0Y29uc29sZS5sb2coXCI+PiBCaXRtYXAgbG9hZGVkIGlzIG5vdCBoYXZpbmcgcG93ZXIgb2YgMiBkaW1lbnNpb25zIG9yIGlzIGhpZ2hlciB0aGFuIDIwNDhcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGlzVmFsaWQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHBhcnNpbmdGYWlsdXJlKGI6Ym9vbGVhbilcblx0e1xuXHRcdHRoaXMuX3BhcnNpbmdGYWlsdXJlID0gYjtcblx0fVxuXG5cdHB1YmxpYyBnZXQgcGFyc2luZ0ZhaWx1cmUoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcGFyc2luZ0ZhaWx1cmU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHBhcnNpbmdQYXVzZWQoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcGFyc2luZ1BhdXNlZDtcblx0fVxuXG5cdHB1YmxpYyBnZXQgcGFyc2luZ0NvbXBsZXRlKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BhcnNpbmdDb21wbGV0ZTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbWF0ZXJpYWxNb2RlKG5ld01hdGVyaWFsTW9kZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9tYXRlcmlhbE1vZGUgPSBuZXdNYXRlcmlhbE1vZGU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IG1hdGVyaWFsTW9kZSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21hdGVyaWFsTW9kZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgZGF0YSgpOmFueVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2RhdGE7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBmaWxlIGRhdGEgdG8gYmUgcGFyc2VkLiBPcHRpb25zIGFyZSA8Y29kZT5VUkxMb2FkZXJEYXRhRm9ybWF0LkJJTkFSWTwvY29kZT4sIDxjb2RlPlVSTExvYWRlckRhdGFGb3JtYXQuQVJSQVlfQlVGRkVSPC9jb2RlPiwgPGNvZGU+VVJMTG9hZGVyRGF0YUZvcm1hdC5CTE9CPC9jb2RlPiwgPGNvZGU+VVJMTG9hZGVyRGF0YUZvcm1hdC5WQVJJQUJMRVM8L2NvZGU+IG9yIDxjb2RlPlVSTExvYWRlckRhdGFGb3JtYXQuVEVYVDwvY29kZT4uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGRhdGFGb3JtYXQoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kYXRhRm9ybWF0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIGRhdGEgKHBvc3NpYmx5IGNvbnRhaW5pbmcgYnl0ZWFycnksIHBsYWluIHRleHQgb3IgQml0bWFwQXNzZXQpIGFzeW5jaHJvbm91c2x5LCBtZWFuaW5nIHRoYXRcblx0ICogdGhlIHBhcnNlciB3aWxsIHBlcmlvZGljYWxseSBzdG9wIHBhcnNpbmcgc28gdGhhdCB0aGUgQVZNIG1heSBwcm9jZWVkIHRvIHRoZVxuXHQgKiBuZXh0IGZyYW1lLlxuXHQgKlxuXHQgKiBAcGFyYW0gZGF0YSBUaGUgdW50eXBlZCBkYXRhIG9iamVjdCBpbiB3aGljaCB0aGUgbG9hZGVkIGRhdGEgcmVzaWRlcy5cblx0ICogQHBhcmFtIGZyYW1lTGltaXQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBvZiBwYXJzaW5nIGFsbG93ZWQgcGVyIGZyYW1lLiBUaGVcblx0ICogYWN0dWFsIHRpbWUgc3BlbnQgb24gYSBmcmFtZSBjYW4gZXhjZWVkIHRoaXMgbnVtYmVyIHNpbmNlIHRpbWUtY2hlY2tzIGNhblxuXHQgKiBvbmx5IGJlIHBlcmZvcm1lZCBiZXR3ZWVuIGxvZ2ljYWwgc2VjdGlvbnMgb2YgdGhlIHBhcnNpbmcgcHJvY2VkdXJlLlxuXHQgKi9cblx0cHVibGljIHBhcnNlQXN5bmMoZGF0YTphbnksIGZyYW1lTGltaXQ6bnVtYmVyID0gMzApXG5cdHtcblx0XHR0aGlzLl9kYXRhID0gZGF0YTtcblx0XHR0aGlzLl9wU3RhcnRQYXJzaW5nKGZyYW1lTGltaXQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBhbmQgcmVzb2x2ZWQgZm9yIHRoZSBvYmplY3QgYmVpbmcgcGFyc2VkLlxuXHQgKi9cblx0cHVibGljIGdldCBkZXBlbmRlbmNpZXMoKTpBcnJheTxSZXNvdXJjZURlcGVuZGVuY3k+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGVwZW5kZW5jaWVzO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc29sdmUgYSBkZXBlbmRlbmN5IHdoZW4gaXQncyBsb2FkZWQuIEZvciBleGFtcGxlLCBhIGRlcGVuZGVuY3kgY29udGFpbmluZyBhbiBJbWFnZVJlc291cmNlIHdvdWxkIGJlIGFzc2lnbmVkXG5cdCAqIHRvIGEgTWVzaCBpbnN0YW5jZSBhcyBhIEJpdG1hcE1hdGVyaWFsLCBhIHNjZW5lIGdyYXBoIG9iamVjdCB3b3VsZCBiZSBhZGRlZCB0byBpdHMgaW50ZW5kZWQgcGFyZW50LiBUaGVcblx0ICogZGVwZW5kZW5jeSBzaG91bGQgYmUgYSBtZW1iZXIgb2YgdGhlIGRlcGVuZGVuY2llcyBwcm9wZXJ0eS5cblx0ICpcblx0ICogQHBhcmFtIHJlc291cmNlRGVwZW5kZW5jeSBUaGUgZGVwZW5kZW5jeSB0byBiZSByZXNvbHZlZC5cblx0ICovXG5cdHB1YmxpYyBfaVJlc29sdmVEZXBlbmRlbmN5KHJlc291cmNlRGVwZW5kZW5jeTpSZXNvdXJjZURlcGVuZGVuY3kpXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc29sdmUgYSBkZXBlbmRlbmN5IGxvYWRpbmcgZmFpbHVyZS4gVXNlZCBieSBwYXJzZXIgdG8gZXZlbnR1YWxseSBwcm92aWRlIGEgZGVmYXVsdCBtYXBcblx0ICpcblx0ICogQHBhcmFtIHJlc291cmNlRGVwZW5kZW5jeSBUaGUgZGVwZW5kZW5jeSB0byBiZSByZXNvbHZlZC5cblx0ICovXG5cdHB1YmxpYyBfaVJlc29sdmVEZXBlbmRlbmN5RmFpbHVyZShyZXNvdXJjZURlcGVuZGVuY3k6UmVzb3VyY2VEZXBlbmRlbmN5KVxuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXNvbHZlIGEgZGVwZW5kZW5jeSBuYW1lXG5cdCAqXG5cdCAqIEBwYXJhbSByZXNvdXJjZURlcGVuZGVuY3kgVGhlIGRlcGVuZGVuY3kgdG8gYmUgcmVzb2x2ZWQuXG5cdCAqL1xuXHRwdWJsaWMgX2lSZXNvbHZlRGVwZW5kZW5jeU5hbWUocmVzb3VyY2VEZXBlbmRlbmN5OlJlc291cmNlRGVwZW5kZW5jeSwgYXNzZXQ6SUFzc2V0KTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBhc3NldC5uYW1lO1xuXHR9XG5cblx0cHVibGljIF9pUmVzdW1lUGFyc2luZ0FmdGVyRGVwZW5kZW5jaWVzKClcblx0e1xuXHRcdHRoaXMuX3BhcnNpbmdQYXVzZWQgPSBmYWxzZTtcblxuXHRcdGlmICh0aGlzLl90aW1lcilcblx0XHRcdHRoaXMuX3RpbWVyLnN0YXJ0KCk7XG5cdH1cblxuXHRwdWJsaWMgX3BGaW5hbGl6ZUFzc2V0KGFzc2V0OklBc3NldCwgbmFtZTpzdHJpbmcgPSBudWxsKVxuXHR7XG5cdFx0dmFyIHR5cGVfZXZlbnQ6c3RyaW5nO1xuXHRcdHZhciB0eXBlX25hbWU6c3RyaW5nO1xuXG5cdFx0aWYgKG5hbWUgIT0gbnVsbClcblx0XHRcdGFzc2V0Lm5hbWUgPSBuYW1lO1xuXG5cdFx0Ly8gSWYgdGhlIGFzc2V0IGhhcyBubyBuYW1lLCBnaXZlIGl0XG5cdFx0Ly8gYSBwZXItdHlwZSBkZWZhdWx0IG5hbWUuXG5cdFx0aWYgKCFhc3NldC5uYW1lKVxuXHRcdFx0YXNzZXQubmFtZSA9IGFzc2V0LmFzc2V0VHlwZTtcblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQXNzZXRFdmVudChBc3NldEV2ZW50LkFTU0VUX0NPTVBMRVRFLCBhc3NldCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFBhcnNlIHRoZSBuZXh0IGJsb2NrIG9mIGRhdGEuXG5cdCAqIEByZXR1cm4gV2hldGhlciBvciBub3QgbW9yZSBkYXRhIG5lZWRzIHRvIGJlIHBhcnNlZC4gQ2FuIGJlIDxjb2RlPlBhcnNlckJhc2UuUGFyc2VyQmFzZS5QQVJTSU5HX0RPTkU8L2NvZGU+IG9yXG5cdCAqIDxjb2RlPlBhcnNlckJhc2UuUGFyc2VyQmFzZS5NT1JFX1RPX1BBUlNFPC9jb2RlPi5cblx0ICovXG5cdHB1YmxpYyBfcFByb2NlZWRQYXJzaW5nKCk6Ym9vbGVhblxuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdHB1YmxpYyBfcERpZVdpdGhFcnJvcihtZXNzYWdlOnN0cmluZyA9ICdVbmtub3duIHBhcnNpbmcgZXJyb3InKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3RpbWVyKSB7XG5cdFx0XHR0aGlzLl90aW1lci5yZW1vdmVFdmVudExpc3RlbmVyKFRpbWVyRXZlbnQuVElNRVIsIHRoaXMuX3BPbkludGVydmFsRGVsZWdhdGUpO1xuXHRcdFx0dGhpcy5fdGltZXIuc3RvcCgpO1xuXHRcdFx0dGhpcy5fdGltZXIgPSBudWxsO1xuXHRcdH1cblxuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUGFyc2VyRXZlbnQoUGFyc2VyRXZlbnQuUEFSU0VfRVJST1IsIG1lc3NhZ2UpKTtcblx0fVxuXG5cdHB1YmxpYyBfcEFkZERlcGVuZGVuY3koaWQ6c3RyaW5nLCByZXE6VVJMUmVxdWVzdCwgcmV0cmlldmVBc1Jhd0RhdGE6Ym9vbGVhbiA9IGZhbHNlLCBkYXRhOmFueSA9IG51bGwsIHN1cHByZXNzRXJyb3JFdmVudHM6Ym9vbGVhbiA9IGZhbHNlKTpSZXNvdXJjZURlcGVuZGVuY3lcblx0e1xuXHRcdHZhciBkZXBlbmRlbmN5OlJlc291cmNlRGVwZW5kZW5jeSA9IG5ldyBSZXNvdXJjZURlcGVuZGVuY3koaWQsIHJlcSwgZGF0YSwgbnVsbCwgdGhpcywgcmV0cmlldmVBc1Jhd0RhdGEsIHN1cHByZXNzRXJyb3JFdmVudHMpO1xuXHRcdHRoaXMuX2RlcGVuZGVuY2llcy5wdXNoKGRlcGVuZGVuY3kpO1xuXG5cdFx0cmV0dXJuIGRlcGVuZGVuY3k7XG5cdH1cblxuXHRwdWJsaWMgX3BQYXVzZUFuZFJldHJpZXZlRGVwZW5kZW5jaWVzKClcblx0e1xuXHRcdGlmICh0aGlzLl90aW1lcilcblx0XHRcdHRoaXMuX3RpbWVyLnN0b3AoKTtcblxuXHRcdHRoaXMuX3BhcnNpbmdQYXVzZWQgPSB0cnVlO1xuXHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgUGFyc2VyRXZlbnQoUGFyc2VyRXZlbnQuUkVBRFlfRk9SX0RFUEVOREVOQ0lFUykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIHN0aWxsIHRpbWUgbGVmdCBmb3IgcGFyc2luZyB3aXRoaW4gdGhlIG1heGltdW0gYWxsb3dlZCB0aW1lIGZyYW1lIHBlciBzZXNzaW9uLlxuXHQgKiBAcmV0dXJuIFRydWUgaWYgdGhlcmUgaXMgc3RpbGwgdGltZSBsZWZ0LCBmYWxzZSBpZiB0aGUgbWF4aW11bSBhbGxvdHRlZCB0aW1lIHdhcyBleGNlZWRlZCBhbmQgcGFyc2luZyBzaG91bGQgYmUgaW50ZXJydXB0ZWQuXG5cdCAqL1xuXHRwdWJsaWMgX3BIYXNUaW1lKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuICgoZ2V0VGltZXIoKSAtIHRoaXMuX2xhc3RGcmFtZVRpbWUpIDwgdGhpcy5fZnJhbWVMaW1pdCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gdGhlIHBhcnNpbmcgcGF1c2UgaW50ZXJ2YWwgaGFzIHBhc3NlZCBhbmQgcGFyc2luZyBjYW4gcHJvY2VlZC5cblx0ICovXG5cdHB1YmxpYyBfcE9uSW50ZXJ2YWwoZXZlbnQ6VGltZXJFdmVudCA9IG51bGwpXG5cdHtcblx0XHR0aGlzLl9sYXN0RnJhbWVUaW1lID0gZ2V0VGltZXIoKTtcblxuXHRcdGlmICh0aGlzLl9wUHJvY2VlZFBhcnNpbmcoKSAmJiAhdGhpcy5fcGFyc2luZ0ZhaWx1cmUpXG5cdFx0XHR0aGlzLl9wRmluaXNoUGFyc2luZygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluaXRpYWxpemVzIHRoZSBwYXJzaW5nIG9mIGRhdGEuXG5cdCAqIEBwYXJhbSBmcmFtZUxpbWl0IFRoZSBtYXhpbXVtIGR1cmF0aW9uIG9mIGEgcGFyc2luZyBzZXNzaW9uLlxuXHQgKi9cblx0cHVibGljIF9wU3RhcnRQYXJzaW5nKGZyYW1lTGltaXQ6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fZnJhbWVMaW1pdCA9IGZyYW1lTGltaXQ7XG5cdFx0dGhpcy5fdGltZXIgPSBuZXcgVGltZXIodGhpcy5fZnJhbWVMaW1pdCwgMCk7XG5cdFx0dGhpcy5fdGltZXIuYWRkRXZlbnRMaXN0ZW5lcihUaW1lckV2ZW50LlRJTUVSLCB0aGlzLl9wT25JbnRlcnZhbERlbGVnYXRlKTtcblx0XHR0aGlzLl90aW1lci5zdGFydCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEZpbmlzaCBwYXJzaW5nIHRoZSBkYXRhLlxuXHQgKi9cblx0cHVibGljIF9wRmluaXNoUGFyc2luZygpXG5cdHtcblx0XHRpZiAodGhpcy5fdGltZXIpIHtcblx0XHRcdHRoaXMuX3RpbWVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoVGltZXJFdmVudC5USU1FUiwgdGhpcy5fcE9uSW50ZXJ2YWxEZWxlZ2F0ZSk7XG5cdFx0XHR0aGlzLl90aW1lci5zdG9wKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fdGltZXIgPSBudWxsO1xuXHRcdHRoaXMuX3BhcnNpbmdDb21wbGV0ZSA9IHRydWU7XG5cblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFBhcnNlckV2ZW50KFBhcnNlckV2ZW50LlBBUlNFX0NPTVBMRVRFKSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICogQHByaXZhdGVcblx0ICovXG5cdHB1YmxpYyBfcEdldFRleHREYXRhKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gUGFyc2VyVXRpbHMudG9TdHJpbmcodGhpcy5fZGF0YSk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICogQHByaXZhdGVcblx0ICovXG5cdHB1YmxpYyBfcEdldEJ5dGVEYXRhKCk6Qnl0ZUFycmF5XG5cdHtcblx0XHRyZXR1cm4gUGFyc2VyVXRpbHMudG9CeXRlQXJyYXkodGhpcy5fZGF0YSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gUGFyc2VyQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/parsers/ParserBase.ts b/lib/parsers/ParserBase.ts new file mode 100644 index 00000000..09536542 --- /dev/null +++ b/lib/parsers/ParserBase.ts @@ -0,0 +1,358 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +import TimerEvent = require("awayjs-core/lib/events/TimerEvent"); +import ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +import ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); +import ByteArray = require("awayjs-core/lib/utils/ByteArray"); +import TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); +import Timer = require("awayjs-core/lib/utils/Timer"); +import getTimer = require("awayjs-core/lib/utils/getTimer"); + +/** + * ParserBase provides an abstract base class for objects that convert blocks of data to data structures + * supported by away. + * + * If used by AssetLoader to automatically determine the parser type, two public static methods should + * be implemented, with the following signatures: + * + * public static supportsType(extension : string) : boolean + * Indicates whether or not a given file extension is supported by the parser. + * + * public static supportsData(data : *) : boolean + * Tests whether a data block can be parsed by the parser. + * + * Furthermore, for any concrete subtype, the method initHandle should be overridden to immediately + * create the object that will contain the parsed data. This allows ResourceManager to return an object + * handle regardless of whether the object was loaded or not. + * + * @see AssetLoader + */ +class ParserBase extends EventDispatcher +{ + public _iFileName:string; + private _dataFormat:string; + private _data:any; + private _frameLimit:number; + private _lastFrameTime:number; + private _pOnIntervalDelegate:(event:TimerEvent) => void; + public _pContent:DisplayObject; + + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + // TODO: add error checking for the following ( could cause a problem if this function is not implemented ) + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + // Needs to be implemented in all Parsers ( + //public static supportsType(extension : string) : boolean + //* Indicates whether or not a given file extension is supported by the parser. + //---------------------------------------------------------------------------------------------------------------------------------------------------------------- + + public static supportsType(extension:string):boolean + { + throw new AbstractMethodError(); + } + + /* TODO: Implement ParserUtils; + public _pGetTextData():string + { + return ParserUtils.toString(_data); + } + + public _pGetByteData():ByteArray + { + return ParserUtils.toByteArray(_data); + } + */ + private _dependencies:Array; + private _parsingPaused:boolean; + private _parsingComplete:boolean; + private _parsingFailure:boolean; + private _timer:Timer; + private _materialMode:number; + + /** + * Returned by proceedParsing to indicate no more parsing is needed. + */ + public static PARSING_DONE:boolean = true; + /* Protected */ + + /** + * Returned by proceedParsing to indicate more parsing is needed, allowing asynchronous parsing. + */ + public static MORE_TO_PARSE:boolean = false; + /* Protected */ + + + public get content():DisplayObject + { + return this._pContent; + } + + /** + * Creates a new ParserBase object + * @param format The data format of the file data to be parsed. Can be either ParserDataFormat.BINARY or ParserDataFormat.PLAIN_TEXT, and should be provided by the concrete subtype. + * + * @see away.loading.parsers.ParserDataFormat + */ + constructor(format:string) + { + super(); + + this._materialMode = 0; + this._dataFormat = format; + this._dependencies = new Array(); + + this._pOnIntervalDelegate = (event:TimerEvent) => this._pOnInterval(event); + } + + /** + * Validates a bitmapData loaded before assigning to a default BitmapMaterial + */ + + public isBitmapDataValid(bitmapData:BitmapData):boolean + { + var isValid:boolean = TextureUtils.isBitmapDataValid(bitmapData); + + if (!isValid) { + + console.log(">> Bitmap loaded is not having power of 2 dimensions or is higher than 2048"); + } + + return isValid; + } + + public set parsingFailure(b:boolean) + { + this._parsingFailure = b; + } + + public get parsingFailure():boolean + { + return this._parsingFailure; + } + + public get parsingPaused():boolean + { + return this._parsingPaused; + } + + public get parsingComplete():boolean + { + return this._parsingComplete; + } + + public set materialMode(newMaterialMode:number) + { + this._materialMode = newMaterialMode; + } + + public get materialMode():number + { + return this._materialMode; + } + + public get data():any + { + return this._data; + } + + /** + * The data format of the file data to be parsed. Options are URLLoaderDataFormat.BINARY, URLLoaderDataFormat.ARRAY_BUFFER, URLLoaderDataFormat.BLOB, URLLoaderDataFormat.VARIABLES or URLLoaderDataFormat.TEXT. + */ + public get dataFormat():string + { + return this._dataFormat; + } + + /** + * Parse data (possibly containing bytearry, plain text or BitmapAsset) asynchronously, meaning that + * the parser will periodically stop parsing so that the AVM may proceed to the + * next frame. + * + * @param data The untyped data object in which the loaded data resides. + * @param frameLimit number of milliseconds of parsing allowed per frame. The + * actual time spent on a frame can exceed this number since time-checks can + * only be performed between logical sections of the parsing procedure. + */ + public parseAsync(data:any, frameLimit:number = 30) + { + this._data = data; + this._pStartParsing(frameLimit); + } + + /** + * A list of dependencies that need to be loaded and resolved for the object being parsed. + */ + public get dependencies():Array + { + return this._dependencies; + } + + /** + * Resolve a dependency when it's loaded. For example, a dependency containing an ImageResource would be assigned + * to a Mesh instance as a BitmapMaterial, a scene graph object would be added to its intended parent. The + * dependency should be a member of the dependencies property. + * + * @param resourceDependency The dependency to be resolved. + */ + public _iResolveDependency(resourceDependency:ResourceDependency) + { + throw new AbstractMethodError(); + } + + /** + * Resolve a dependency loading failure. Used by parser to eventually provide a default map + * + * @param resourceDependency The dependency to be resolved. + */ + public _iResolveDependencyFailure(resourceDependency:ResourceDependency) + { + throw new AbstractMethodError(); + } + + /** + * Resolve a dependency name + * + * @param resourceDependency The dependency to be resolved. + */ + public _iResolveDependencyName(resourceDependency:ResourceDependency, asset:IAsset):string + { + return asset.name; + } + + public _iResumeParsingAfterDependencies() + { + this._parsingPaused = false; + + if (this._timer) + this._timer.start(); + } + + public _pFinalizeAsset(asset:IAsset, name:string = null) + { + var type_event:string; + var type_name:string; + + if (name != null) + asset.name = name; + + // If the asset has no name, give it + // a per-type default name. + if (!asset.name) + asset.name = asset.assetType; + + this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_COMPLETE, asset)); + } + + /** + * Parse the next block of data. + * @return Whether or not more data needs to be parsed. Can be ParserBase.ParserBase.PARSING_DONE or + * ParserBase.ParserBase.MORE_TO_PARSE. + */ + public _pProceedParsing():boolean + { + throw new AbstractMethodError(); + } + + public _pDieWithError(message:string = 'Unknown parsing error') + { + if (this._timer) { + this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.stop(); + this._timer = null; + } + + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message)); + } + + public _pAddDependency(id:string, req:URLRequest, retrieveAsRawData:boolean = false, data:any = null, suppressErrorEvents:boolean = false):ResourceDependency + { + var dependency:ResourceDependency = new ResourceDependency(id, req, data, null, this, retrieveAsRawData, suppressErrorEvents); + this._dependencies.push(dependency); + + return dependency; + } + + public _pPauseAndRetrieveDependencies() + { + if (this._timer) + this._timer.stop(); + + this._parsingPaused = true; + this.dispatchEvent(new ParserEvent(ParserEvent.READY_FOR_DEPENDENCIES)); + } + + /** + * Tests whether or not there is still time left for parsing within the maximum allowed time frame per session. + * @return True if there is still time left, false if the maximum allotted time was exceeded and parsing should be interrupted. + */ + public _pHasTime():boolean + { + return ((getTimer() - this._lastFrameTime) < this._frameLimit); + } + + /** + * Called when the parsing pause interval has passed and parsing can proceed. + */ + public _pOnInterval(event:TimerEvent = null) + { + this._lastFrameTime = getTimer(); + + if (this._pProceedParsing() && !this._parsingFailure) + this._pFinishParsing(); + } + + /** + * Initializes the parsing of data. + * @param frameLimit The maximum duration of a parsing session. + */ + public _pStartParsing(frameLimit:number) + { + this._frameLimit = frameLimit; + this._timer = new Timer(this._frameLimit, 0); + this._timer.addEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.start(); + } + + /** + * Finish parsing the data. + */ + public _pFinishParsing() + { + if (this._timer) { + this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); + this._timer.stop(); + } + + this._timer = null; + this._parsingComplete = true; + + this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_COMPLETE)); + } + + /** + * + * @returns {string} + * @private + */ + public _pGetTextData():string + { + return ParserUtils.toString(this._data); + } + + /** + * + * @returns {string} + * @private + */ + public _pGetByteData():ByteArray + { + return ParserUtils.toByteArray(this._data); + } +} + +export = ParserBase; \ No newline at end of file diff --git a/lib/parsers/ParserDataFormat.js b/lib/parsers/ParserDataFormat.js new file mode 100755 index 00000000..80e86fc1 --- /dev/null +++ b/lib/parsers/ParserDataFormat.js @@ -0,0 +1,17 @@ +/** +* An enumeration providing values to describe the data format of parsed data. +*/ +var ParserDataFormat = (function () { + function ParserDataFormat() { + } + ParserDataFormat.BINARY = "binary"; + + ParserDataFormat.PLAIN_TEXT = "plainText"; + + ParserDataFormat.IMAGE = "image"; + return ParserDataFormat; +})(); + +module.exports = ParserDataFormat; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlcnMvUGFyc2VyRGF0YUZvcm1hdC50cyJdLCJuYW1lcyI6WyJQYXJzZXJEYXRhRm9ybWF0IiwiUGFyc2VyRGF0YUZvcm1hdC5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQUE7O0VBRUc7QUFDSDtJQUFBQTtJQWlCQUMsQ0FBQ0E7QUFBQUQsSUFaQUEsMEJBQThCQSxRQUFRQTs7SUFLdENBLDhCQUFrQ0EsV0FBV0E7O0lBSzdDQSx5QkFBNkJBLE9BQU9BO0lBRXJDQSx3QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxpQ0FBMEIsQ0FBQSIsImZpbGUiOiJwYXJzZXJzL1BhcnNlckRhdGFGb3JtYXQuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFuIGVudW1lcmF0aW9uIHByb3ZpZGluZyB2YWx1ZXMgdG8gZGVzY3JpYmUgdGhlIGRhdGEgZm9ybWF0IG9mIHBhcnNlZCBkYXRhLlxuICovXG5jbGFzcyBQYXJzZXJEYXRhRm9ybWF0XG57XG5cdC8qKlxuXHQgKiBEZXNjcmliZXMgdGhlIGZvcm1hdCBvZiBhIGJpbmFyeSBmaWxlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBCSU5BUlk6c3RyaW5nID0gXCJiaW5hcnlcIjtcblxuXHQvKipcblx0ICogRGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgYSBwbGFpbiB0ZXh0IGZpbGUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFBMQUlOX1RFWFQ6c3RyaW5nID0gXCJwbGFpblRleHRcIjtcblxuXHQvKipcblx0ICogRGVzY3JpYmVzIHRoZSBmb3JtYXQgb2YgYW4gaW1hZ2UgZmlsZVxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBJTUFHRTpzdHJpbmcgPSBcImltYWdlXCI7XG5cbn1cblxuZXhwb3J0ID0gUGFyc2VyRGF0YUZvcm1hdDsiXX0= \ No newline at end of file diff --git a/lib/parsers/ParserDataFormat.ts b/lib/parsers/ParserDataFormat.ts new file mode 100644 index 00000000..3da88931 --- /dev/null +++ b/lib/parsers/ParserDataFormat.ts @@ -0,0 +1,23 @@ +/** + * An enumeration providing values to describe the data format of parsed data. + */ +class ParserDataFormat +{ + /** + * Describes the format of a binary file. + */ + public static BINARY:string = "binary"; + + /** + * Describes the format of a plain text file. + */ + public static PLAIN_TEXT:string = "plainText"; + + /** + * Describes the format of an image file + */ + public static IMAGE:string = "image"; + +} + +export = ParserDataFormat; \ No newline at end of file diff --git a/lib/parsers/ParserUtils.js b/lib/parsers/ParserUtils.js new file mode 100755 index 00000000..503308c9 --- /dev/null +++ b/lib/parsers/ParserUtils.js @@ -0,0 +1,133 @@ +var ByteArray = require("awayjs-core/lib/utils/ByteArray"); + +var ParserUtils = (function () { + function ParserUtils() { + } + /** + * Converts an ArrayBuffer to a base64 string + * + * @param image data as a ByteArray + * + * @return HTMLImageElement + * + */ + ParserUtils.arrayBufferToImage = function (data) { + var byteStr = ''; + var bytes = new Uint8Array(data); + var len = bytes.byteLength; + + for (var i = 0; i < len; i++) + byteStr += String.fromCharCode(bytes[i]); + + var base64Image = window.btoa(byteStr); + var str = 'data:image/png;base64,' + base64Image; + var img = new Image(); + img.src = str; + + return img; + }; + + /** + * Converts an ByteArray to an Image - returns an HTMLImageElement + * + * @param image data as a ByteArray + * + * @return HTMLImageElement + * + */ + ParserUtils.byteArrayToImage = function (data) { + var byteStr = ''; + var bytes = new Uint8Array(data.arraybytes); + var len = bytes.byteLength; + + for (var i = 0; i < len; i++) + byteStr += String.fromCharCode(bytes[i]); + + var base64Image = window.btoa(byteStr); + var str = 'data:image/png;base64,' + base64Image; + var img = new Image(); + img.src = str; + + return img; + }; + + /** + * Converts an Blob to an Image - returns an HTMLImageElement + * + * @param image data as a Blob + * + * @return HTMLImageElement + * + */ + ParserUtils.blobToImage = function (data) { + var URLObj = window['URL'] || window['webkitURL']; + var src = URLObj.createObjectURL(data); + var img = new Image(); + img.src = src; + + return img; + }; + + /** + * Returns a object as ByteArray, if possible. + * + * @param data The object to return as ByteArray + * + * @return The ByteArray or null + * + */ + ParserUtils.toByteArray = function (data) { + var b = new ByteArray(); + b.setArrayBuffer(data); + return b; + }; + + /** + * Returns a object as String, if possible. + * + * @param data The object to return as String + * @param length The length of the returned String + * + * @return The String or null + * + */ + ParserUtils.toString = function (data, length) { + if (typeof length === "undefined") { length = 0; } + if (typeof data === 'string') { + var s = data; + + if (s['substr'] != null) + return s.substr(0, s.length); + } + + if (data instanceof ByteArray) { + var ba = data; + ba.position = 0; + return ba.readUTFBytes(Math.min(ba.getBytesAvailable(), length)); + } + + return null; + /* + var ba:ByteArray; + + length ||= uint.MAX_VALUE; + + if (data is String) + return String(data).substr(0, length); + + ba = toByteArray(data); + if (ba) { + ba.position = 0; + return ba.readUTFBytes(Math.min(ba.bytesAvailable, length)); + } + + return null; + + */ + }; + return ParserUtils; +})(); + +module.exports = ParserUtils; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlcnMvUGFyc2VyVXRpbHMudHMiXSwibmFtZXMiOlsiUGFyc2VyVXRpbHMiLCJQYXJzZXJVdGlscy5jb25zdHJ1Y3RvciIsIlBhcnNlclV0aWxzLmFycmF5QnVmZmVyVG9JbWFnZSIsIlBhcnNlclV0aWxzLmJ5dGVBcnJheVRvSW1hZ2UiLCJQYXJzZXJVdGlscy5ibG9iVG9JbWFnZSIsIlBhcnNlclV0aWxzLnRvQnl0ZUFycmF5IiwiUGFyc2VyVXRpbHMudG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBLDBEQUFpRTs7QUFFakU7SUFBQUE7SUFvSUFDLENBQUNBO0FBQUFELElBekhBQTs7Ozs7OztNQURHQTtxQ0FDSEEsVUFBaUNBLElBQWdCQTtRQUVoREUsSUFBSUEsT0FBT0EsR0FBVUEsRUFBRUE7UUFDdkJBLElBQUlBLEtBQUtBLEdBQWNBLElBQUlBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBO1FBQzNDQSxJQUFJQSxHQUFHQSxHQUFVQSxLQUFLQSxDQUFDQSxVQUFVQTs7UUFFakNBLEtBQUtBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBO1lBQzNCQSxPQUFPQSxJQUFJQSxNQUFNQSxDQUFDQSxZQUFZQSxDQUFDQSxLQUFLQSxDQUFFQSxDQUFDQSxDQUFFQSxDQUFDQSxDQUFBQTs7UUFFM0NBLElBQUlBLFdBQVdBLEdBQVVBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBO1FBQzdDQSxJQUFJQSxHQUFHQSxHQUFVQSx3QkFBd0JBLEdBQUdBLFdBQVdBO1FBQ3ZEQSxJQUFJQSxHQUFHQSxHQUF1Q0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDekRBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBOztRQUViQSxPQUFPQSxHQUFHQTtJQUNYQSxDQUFDQTs7SUFVREY7Ozs7Ozs7TUFER0E7bUNBQ0hBLFVBQStCQSxJQUFjQTtRQUU1Q0csSUFBSUEsT0FBT0EsR0FBVUEsRUFBRUE7UUFDdkJBLElBQUlBLEtBQUtBLEdBQWNBLElBQUlBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBO1FBQ3REQSxJQUFJQSxHQUFHQSxHQUFVQSxLQUFLQSxDQUFDQSxVQUFVQTs7UUFFakNBLEtBQUtBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBO1lBQzNCQSxPQUFPQSxJQUFJQSxNQUFNQSxDQUFDQSxZQUFZQSxDQUFDQSxLQUFLQSxDQUFFQSxDQUFDQSxDQUFFQSxDQUFDQSxDQUFBQTs7UUFFM0NBLElBQUlBLFdBQVdBLEdBQVVBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBO1FBQzdDQSxJQUFJQSxHQUFHQSxHQUFVQSx3QkFBd0JBLEdBQUdBLFdBQVdBO1FBQ3ZEQSxJQUFJQSxHQUFHQSxHQUF1Q0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDekRBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBOztRQUViQSxPQUFPQSxHQUFHQTtJQUNYQSxDQUFDQTs7SUFVREg7Ozs7Ozs7TUFER0E7OEJBQ0hBLFVBQTBCQSxJQUFTQTtRQUVsQ0ksSUFBSUEsTUFBTUEsR0FBT0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7UUFDckRBLElBQUlBLEdBQUdBLEdBQUdBLE1BQU1BLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBO1FBQ3RDQSxJQUFJQSxHQUFHQSxHQUF1Q0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDekRBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBOztRQUViQSxPQUFPQSxHQUFHQTtJQUNYQSxDQUFDQTs7SUFVREo7Ozs7Ozs7TUFER0E7OEJBQ0hBLFVBQTBCQSxJQUFRQTtRQUVqQ0ssSUFBSUEsQ0FBQ0EsR0FBYUEsSUFBSUEsU0FBU0EsQ0FBQ0EsQ0FBQ0E7UUFDakNBLENBQUNBLENBQUNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBO1FBQ3RCQSxPQUFPQSxDQUFDQTtJQUNUQSxDQUFDQTs7SUFXREw7Ozs7Ozs7O01BREdBOzJCQUNIQSxVQUF1QkEsSUFBUUEsRUFBRUEsTUFBaUJBO1FBQWpCTSxxQ0FBQUEsTUFBTUEsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFHakRBLElBQUlBLE9BQU9BLElBQUlBLEtBQUtBLFFBQVFBLENBQUVBO1lBQzdCQSxJQUFJQSxDQUFDQSxHQUFtQkEsSUFBSUE7O1lBRTVCQSxJQUFJQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxJQUFJQTtnQkFDdEJBLE9BQU9BLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQzlCQTs7UUFFREEsSUFBSUEsSUFBSUEsWUFBWUEsU0FBU0EsQ0FBRUE7WUFDOUJBLElBQUlBLEVBQUVBLEdBQXlCQSxJQUFJQTtZQUNuQ0EsRUFBRUEsQ0FBQ0EsUUFBUUEsR0FBR0EsQ0FBQ0E7WUFDZkEsT0FBT0EsRUFBRUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQSxFQUFFQSxNQUFNQSxDQUFDQSxDQUFDQTtTQUNoRUE7O1FBRURBLE9BQU9BLElBQUlBO1FBRVhBOzs7Ozs7Ozs7Ozs7Ozs7O1VBZ0JHQTtJQUVKQSxDQUFDQTtJQUNGTixtQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCw0QkFBcUIsQ0FBQSIsImZpbGUiOiJwYXJzZXJzL1BhcnNlclV0aWxzLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ5dGVBcnJheVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL0J5dGVBcnJheVwiKTtcblxuY2xhc3MgUGFyc2VyVXRpbHNcbntcblxuXHQvKipcblx0ICogQ29udmVydHMgYW4gQXJyYXlCdWZmZXIgdG8gYSBiYXNlNjQgc3RyaW5nXG5cdCAqXG5cdCAqIEBwYXJhbSBpbWFnZSBkYXRhIGFzIGEgQnl0ZUFycmF5XG5cdCAqXG5cdCAqIEByZXR1cm4gSFRNTEltYWdlRWxlbWVudFxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBhcnJheUJ1ZmZlclRvSW1hZ2UoZGF0YTpBcnJheUJ1ZmZlcik6SFRNTEltYWdlRWxlbWVudFxuXHR7XG5cdFx0dmFyIGJ5dGVTdHI6c3RyaW5nID0gJyc7XG5cdFx0dmFyIGJ5dGVzOlVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShkYXRhKTtcblx0XHR2YXIgbGVuOm51bWJlciA9IGJ5dGVzLmJ5dGVMZW5ndGg7XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKVxuXHRcdFx0Ynl0ZVN0ciArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzWyBpIF0pXG5cblx0XHR2YXIgYmFzZTY0SW1hZ2U6c3RyaW5nID0gd2luZG93LmJ0b2EoYnl0ZVN0cik7XG5cdFx0dmFyIHN0cjpzdHJpbmcgPSAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcgKyBiYXNlNjRJbWFnZTtcblx0XHR2YXIgaW1nOkhUTUxJbWFnZUVsZW1lbnQgPSA8SFRNTEltYWdlRWxlbWVudD4gbmV3IEltYWdlKCk7XG5cdFx0aW1nLnNyYyA9IHN0cjtcblxuXHRcdHJldHVybiBpbWc7XG5cdH1cblxuXHQvKipcblx0ICogQ29udmVydHMgYW4gQnl0ZUFycmF5IHRvIGFuIEltYWdlIC0gcmV0dXJucyBhbiBIVE1MSW1hZ2VFbGVtZW50XG5cdCAqXG5cdCAqIEBwYXJhbSBpbWFnZSBkYXRhIGFzIGEgQnl0ZUFycmF5XG5cdCAqXG5cdCAqIEByZXR1cm4gSFRNTEltYWdlRWxlbWVudFxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBieXRlQXJyYXlUb0ltYWdlKGRhdGE6Qnl0ZUFycmF5KTpIVE1MSW1hZ2VFbGVtZW50XG5cdHtcblx0XHR2YXIgYnl0ZVN0cjpzdHJpbmcgPSAnJztcblx0XHR2YXIgYnl0ZXM6VWludDhBcnJheSA9IG5ldyBVaW50OEFycmF5KGRhdGEuYXJyYXlieXRlcyk7XG5cdFx0dmFyIGxlbjpudW1iZXIgPSBieXRlcy5ieXRlTGVuZ3RoO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKylcblx0XHRcdGJ5dGVTdHIgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1sgaSBdKVxuXG5cdFx0dmFyIGJhc2U2NEltYWdlOnN0cmluZyA9IHdpbmRvdy5idG9hKGJ5dGVTdHIpO1xuXHRcdHZhciBzdHI6c3RyaW5nID0gJ2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwnICsgYmFzZTY0SW1hZ2U7XG5cdFx0dmFyIGltZzpIVE1MSW1hZ2VFbGVtZW50ID0gPEhUTUxJbWFnZUVsZW1lbnQ+IG5ldyBJbWFnZSgpO1xuXHRcdGltZy5zcmMgPSBzdHI7XG5cblx0XHRyZXR1cm4gaW1nO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnZlcnRzIGFuIEJsb2IgdG8gYW4gSW1hZ2UgLSByZXR1cm5zIGFuIEhUTUxJbWFnZUVsZW1lbnRcblx0ICpcblx0ICogQHBhcmFtIGltYWdlIGRhdGEgYXMgYSBCbG9iXG5cdCAqXG5cdCAqIEByZXR1cm4gSFRNTEltYWdlRWxlbWVudFxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBibG9iVG9JbWFnZShkYXRhOkJsb2IpOkhUTUxJbWFnZUVsZW1lbnRcblx0e1xuXHRcdHZhciBVUkxPYmo6VVJMID0gd2luZG93WydVUkwnXSB8fCB3aW5kb3dbJ3dlYmtpdFVSTCddO1xuXHRcdHZhciBzcmMgPSBVUkxPYmouY3JlYXRlT2JqZWN0VVJMKGRhdGEpO1xuXHRcdHZhciBpbWc6SFRNTEltYWdlRWxlbWVudCA9IDxIVE1MSW1hZ2VFbGVtZW50PiBuZXcgSW1hZ2UoKTtcblx0XHRpbWcuc3JjID0gc3JjO1xuXG5cdFx0cmV0dXJuIGltZztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgb2JqZWN0IGFzIEJ5dGVBcnJheSwgaWYgcG9zc2libGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBvYmplY3QgdG8gcmV0dXJuIGFzIEJ5dGVBcnJheVxuXHQgKlxuXHQgKiBAcmV0dXJuIFRoZSBCeXRlQXJyYXkgb3IgbnVsbFxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyB0b0J5dGVBcnJheShkYXRhOmFueSk6Qnl0ZUFycmF5XG5cdHtcblx0XHR2YXIgYjpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7XG5cdFx0Yi5zZXRBcnJheUJ1ZmZlcihkYXRhKTtcblx0XHRyZXR1cm4gYjtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGEgb2JqZWN0IGFzIFN0cmluZywgaWYgcG9zc2libGUuXG5cdCAqXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBvYmplY3QgdG8gcmV0dXJuIGFzIFN0cmluZ1xuXHQgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIFN0cmluZ1xuXHQgKlxuXHQgKiBAcmV0dXJuIFRoZSBTdHJpbmcgb3IgbnVsbFxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyB0b1N0cmluZyhkYXRhOmFueSwgbGVuZ3RoOm51bWJlciA9IDApOnN0cmluZ1xuXHR7XG5cblx0XHRpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHR2YXIgczpzdHJpbmcgPSA8c3RyaW5nPiBkYXRhO1xuXG5cdFx0XHRpZiAoc1snc3Vic3RyJ10gIT0gbnVsbClcblx0XHRcdFx0cmV0dXJuIHMuc3Vic3RyKDAsIHMubGVuZ3RoKTtcblx0XHR9XG5cblx0XHRpZiAoZGF0YSBpbnN0YW5jZW9mIEJ5dGVBcnJheSkge1xuXHRcdFx0dmFyIGJhOkJ5dGVBcnJheSA9IDxCeXRlQXJyYXk+IGRhdGE7XG5cdFx0XHRiYS5wb3NpdGlvbiA9IDA7XG5cdFx0XHRyZXR1cm4gYmEucmVhZFVURkJ5dGVzKE1hdGgubWluKGJhLmdldEJ5dGVzQXZhaWxhYmxlKCksIGxlbmd0aCkpO1xuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXG5cdFx0Lypcblx0XHQgdmFyIGJhOkJ5dGVBcnJheTtcblxuXHRcdCBsZW5ndGggfHw9IHVpbnQuTUFYX1ZBTFVFO1xuXG5cdFx0IGlmIChkYXRhIGlzIFN0cmluZylcblx0XHQgcmV0dXJuIFN0cmluZyhkYXRhKS5zdWJzdHIoMCwgbGVuZ3RoKTtcblxuXHRcdCBiYSA9IHRvQnl0ZUFycmF5KGRhdGEpO1xuXHRcdCBpZiAoYmEpIHtcblx0XHQgYmEucG9zaXRpb24gPSAwO1xuXHRcdCByZXR1cm4gYmEucmVhZFVURkJ5dGVzKE1hdGgubWluKGJhLmJ5dGVzQXZhaWxhYmxlLCBsZW5ndGgpKTtcblx0XHQgfVxuXG5cdFx0IHJldHVybiBudWxsO1xuXG5cdFx0ICovXG5cblx0fVxufVxuXG5leHBvcnQgPSBQYXJzZXJVdGlsczsiXX0= \ No newline at end of file diff --git a/lib/parsers/ParserUtils.ts b/lib/parsers/ParserUtils.ts new file mode 100755 index 00000000..9fa98bf2 --- /dev/null +++ b/lib/parsers/ParserUtils.ts @@ -0,0 +1,137 @@ +import ByteArray = require("awayjs-core/lib/utils/ByteArray"); + +class ParserUtils +{ + + /** + * Converts an ArrayBuffer to a base64 string + * + * @param image data as a ByteArray + * + * @return HTMLImageElement + * + */ + public static arrayBufferToImage(data:ArrayBuffer):HTMLImageElement + { + var byteStr:string = ''; + var bytes:Uint8Array = new Uint8Array(data); + var len:number = bytes.byteLength; + + for (var i = 0; i < len; i++) + byteStr += String.fromCharCode(bytes[ i ]) + + var base64Image:string = window.btoa(byteStr); + var str:string = 'data:image/png;base64,' + base64Image; + var img:HTMLImageElement = new Image(); + img.src = str; + + return img; + } + + /** + * Converts an ByteArray to an Image - returns an HTMLImageElement + * + * @param image data as a ByteArray + * + * @return HTMLImageElement + * + */ + public static byteArrayToImage(data:ByteArray):HTMLImageElement + { + var byteStr:string = ''; + var bytes:Uint8Array = new Uint8Array(data.arraybytes); + var len:number = bytes.byteLength; + + for (var i = 0; i < len; i++) + byteStr += String.fromCharCode(bytes[ i ]) + + var base64Image:string = window.btoa(byteStr); + var str:string = 'data:image/png;base64,' + base64Image; + var img:HTMLImageElement = new Image(); + img.src = str; + + return img; + } + + /** + * Converts an Blob to an Image - returns an HTMLImageElement + * + * @param image data as a Blob + * + * @return HTMLImageElement + * + */ + public static blobToImage(data:Blob):HTMLImageElement + { + var URLObj:URL = window['URL'] || window['webkitURL']; + var src = URLObj.createObjectURL(data); + var img:HTMLImageElement = new Image(); + img.src = src; + + return img; + } + + /** + * Returns a object as ByteArray, if possible. + * + * @param data The object to return as ByteArray + * + * @return The ByteArray or null + * + */ + public static toByteArray(data:any):ByteArray + { + var b:ByteArray = new ByteArray(); + b.setArrayBuffer(data); + return b; + } + + /** + * Returns a object as String, if possible. + * + * @param data The object to return as String + * @param length The length of the returned String + * + * @return The String or null + * + */ + public static toString(data:any, length:number = 0):string + { + + if (typeof data === 'string') { + var s:string = data; + + if (s['substr'] != null) + return s.substr(0, s.length); + } + + if (data instanceof ByteArray) { + var ba:ByteArray = data; + ba.position = 0; + return ba.readUTFBytes(Math.min(ba.getBytesAvailable(), length)); + } + + return null; + + /* + var ba:ByteArray; + + length ||= uint.MAX_VALUE; + + if (data is String) + return String(data).substr(0, length); + + ba = toByteArray(data); + if (ba) { + ba.position = 0; + return ba.readUTFBytes(Math.min(ba.bytesAvailable, length)); + } + + return null; + + */ + + } +} + +export = ParserUtils; \ No newline at end of file diff --git a/lib/parsers/ResourceDependency.js b/lib/parsers/ResourceDependency.js new file mode 100755 index 00000000..071debd1 --- /dev/null +++ b/lib/parsers/ResourceDependency.js @@ -0,0 +1,168 @@ +/** +* ResourceDependency represents the data required to load, parse and resolve additional files ("dependencies") +* required by a parser, used by ResourceLoadSession. +* +*/ +var ResourceDependency = (function () { + function ResourceDependency(id, request, data, parser, parentParser, retrieveAsRawData, suppressAssetEvents) { + if (typeof retrieveAsRawData === "undefined") { retrieveAsRawData = false; } + if (typeof suppressAssetEvents === "undefined") { suppressAssetEvents = false; } + this._id = id; + this._request = request; + this._data = data; + this._parser = parser; + this._parentParser = parentParser; + this._retrieveAsRawData = retrieveAsRawData; + this._suppressAssetEvents = suppressAssetEvents; + + this._assets = new Array(); + this._dependencies = new Array(); + } + Object.defineProperty(ResourceDependency.prototype, "id", { + /** + * + */ + get: function () { + return this._id; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "request", { + /** + * + */ + get: function () { + return this._request; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "data", { + /** + * The data containing the dependency to be parsed, if the resource was already loaded. + */ + get: function () { + return this._data; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "parser", { + /** + * + */ + get: function () { + return this._parser; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "parentParser", { + /** + * The parser which is dependent on this ResourceDependency object. + */ + get: function () { + return this._parentParser; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "retrieveAsRawData", { + /** + * + */ + get: function () { + return this._retrieveAsRawData; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "suppresAssetEvents", { + /** + * + */ + get: function () { + return this._suppressAssetEvents; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "assets", { + /** + * + */ + get: function () { + return this._assets; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ResourceDependency.prototype, "dependencies", { + /** + * + */ + get: function () { + return this._dependencies; + }, + enumerable: true, + configurable: true + }); + + /** + * @private + * Method to set data after having already created the dependency object, e.g. after load. + */ + ResourceDependency.prototype._iSetData = function (data) { + this._data = data; + }; + + /** + * @private + * + */ + ResourceDependency.prototype._iSetParser = function (parser) { + this._parser = parser; + }; + + /** + * Resolve the dependency when it's loaded with the parent parser. For example, a dependency containing an + * ImageResource would be assigned to a Mesh instance as a BitmapMaterial, a scene graph object would be added + * to its intended parent. The dependency should be a member of the dependencies property. + */ + ResourceDependency.prototype.resolve = function () { + if (this._parentParser) + this._parentParser._iResolveDependency(this); + }; + + /** + * Resolve a dependency failure. For example, map loading failure from a 3d file + */ + ResourceDependency.prototype.resolveFailure = function () { + if (this._parentParser) + this._parentParser._iResolveDependencyFailure(this); + }; + + /** + * Resolve the dependencies name + */ + ResourceDependency.prototype.resolveName = function (asset) { + if (this._parentParser) + return this._parentParser._iResolveDependencyName(this, asset); + + return asset.name; + }; + return ResourceDependency; +})(); + +module.exports = ResourceDependency; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlcnMvUmVzb3VyY2VEZXBlbmRlbmN5LnRzIl0sIm5hbWVzIjpbIlJlc291cmNlRGVwZW5kZW5jeSIsIlJlc291cmNlRGVwZW5kZW5jeS5jb25zdHJ1Y3RvciIsIlJlc291cmNlRGVwZW5kZW5jeS5faVNldERhdGEiLCJSZXNvdXJjZURlcGVuZGVuY3kuX2lTZXRQYXJzZXIiLCJSZXNvdXJjZURlcGVuZGVuY3kucmVzb2x2ZSIsIlJlc291cmNlRGVwZW5kZW5jeS5yZXNvbHZlRmFpbHVyZSIsIlJlc291cmNlRGVwZW5kZW5jeS5yZXNvbHZlTmFtZSJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7RUFTRztBQUNIO0lBZ0JDQSw0QkFBWUEsRUFBU0EsRUFBRUEsT0FBa0JBLEVBQUVBLElBQVFBLEVBQUVBLE1BQWlCQSxFQUFFQSxZQUF1QkEsRUFBRUEsaUJBQWlDQSxFQUFFQSxtQkFBbUNBO1FBQXRFQyxnREFBQUEsaUJBQWlCQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUFFQSxrREFBQUEsbUJBQW1CQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUV0S0EsSUFBSUEsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUE7UUFDYkEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsT0FBT0E7UUFDdkJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBO1FBQ2pCQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxNQUFNQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsWUFBWUE7UUFDakNBLElBQUlBLENBQUNBLGtCQUFrQkEsR0FBR0EsaUJBQWlCQTtRQUMzQ0EsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxHQUFHQSxtQkFBbUJBOztRQUUvQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsQ0FBQ0E7UUFDbENBLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLEtBQUtBLENBQXFCQSxDQUFDQTtJQUNyREEsQ0FBQ0E7SUFLREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLEdBQUdBO1FBQ2hCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxLQUFLQTtRQUNsQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDMUJBLENBQUNBOzs7O0FBQUFBO0lBS0RBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxrQkFBa0JBO1FBQy9CQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0Esb0JBQW9CQTtRQUNqQ0EsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQUtEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDMUJBLENBQUNBOzs7O0FBQUFBO0lBTURBOzs7TUFER0E7NkNBQ0hBLFVBQWlCQSxJQUFRQTtRQUV4QkUsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUE7SUFDbEJBLENBQUNBOztJQU1ERjs7O01BREdBOytDQUNIQSxVQUFtQkEsTUFBaUJBO1FBRW5DRyxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxNQUFNQTtJQUN0QkEsQ0FBQ0E7O0lBT0RIOzs7O01BREdBOzJDQUNIQTtRQUVDSSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQTtZQUNyQkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtJQUMvQ0EsQ0FBQ0E7O0lBS0RKOztNQURHQTtrREFDSEE7UUFFQ0ssSUFBSUEsSUFBSUEsQ0FBQ0EsYUFBYUE7WUFDckJBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLDBCQUEwQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7SUFDdERBLENBQUNBOztJQUtETDs7TUFER0E7K0NBQ0hBLFVBQW1CQSxLQUFZQTtRQUU5Qk0sSUFBSUEsSUFBSUEsQ0FBQ0EsYUFBYUE7WUFDckJBLE9BQU9BLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLHVCQUF1QkEsQ0FBQ0EsSUFBSUEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7O1FBRWhFQSxPQUFPQSxLQUFLQSxDQUFDQSxJQUFJQTtJQUNsQkEsQ0FBQ0E7SUFDRk4sMEJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsbUNBQTRCLENBQUEiLCJmaWxlIjoicGFyc2Vycy9SZXNvdXJjZURlcGVuZGVuY3kuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFVSTExvYWRlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTExvYWRlclwiKTtcbmltcG9ydCBVUkxSZXF1ZXN0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMUmVxdWVzdFwiKTtcbmltcG9ydCBQYXJzZXJCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcGFyc2Vycy9QYXJzZXJCYXNlXCIpO1xuXG4vKipcbiAqIFJlc291cmNlRGVwZW5kZW5jeSByZXByZXNlbnRzIHRoZSBkYXRhIHJlcXVpcmVkIHRvIGxvYWQsIHBhcnNlIGFuZCByZXNvbHZlIGFkZGl0aW9uYWwgZmlsZXMgKFwiZGVwZW5kZW5jaWVzXCIpXG4gKiByZXF1aXJlZCBieSBhIHBhcnNlciwgdXNlZCBieSBSZXNvdXJjZUxvYWRTZXNzaW9uLlxuICpcbiAqL1xuY2xhc3MgUmVzb3VyY2VEZXBlbmRlbmN5XG57XG5cdHByaXZhdGUgX2lkOnN0cmluZztcblx0cHJpdmF0ZSBfcmVxdWVzdDpVUkxSZXF1ZXN0O1xuXHRwcml2YXRlIF9hc3NldHM6QXJyYXk8SUFzc2V0Pjtcblx0cHJpdmF0ZSBfcGFyc2VyOlBhcnNlckJhc2U7XG5cdHByaXZhdGUgX3BhcmVudFBhcnNlcjpQYXJzZXJCYXNlO1xuXHRwcml2YXRlIF9kYXRhOmFueTtcblx0cHJpdmF0ZSBfcmV0cmlldmVBc1Jhd0RhdGE6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfc3VwcHJlc3NBc3NldEV2ZW50czpib29sZWFuO1xuXHRwcml2YXRlIF9kZXBlbmRlbmNpZXM6QXJyYXk8UmVzb3VyY2VEZXBlbmRlbmN5PjtcblxuXHRwdWJsaWMgX2lMb2FkZXI6VVJMTG9hZGVyO1xuXHRwdWJsaWMgX2lTdWNjZXNzOmJvb2xlYW47XG5cblxuXHRjb25zdHJ1Y3RvcihpZDpzdHJpbmcsIHJlcXVlc3Q6VVJMUmVxdWVzdCwgZGF0YTphbnksIHBhcnNlcjpQYXJzZXJCYXNlLCBwYXJlbnRQYXJzZXI6UGFyc2VyQmFzZSwgcmV0cmlldmVBc1Jhd0RhdGE6Ym9vbGVhbiA9IGZhbHNlLCBzdXBwcmVzc0Fzc2V0RXZlbnRzOmJvb2xlYW4gPSBmYWxzZSlcblx0e1xuXHRcdHRoaXMuX2lkID0gaWQ7XG5cdFx0dGhpcy5fcmVxdWVzdCA9IHJlcXVlc3Q7XG5cdFx0dGhpcy5fZGF0YSA9IGRhdGE7XG5cdFx0dGhpcy5fcGFyc2VyID0gcGFyc2VyO1xuXHRcdHRoaXMuX3BhcmVudFBhcnNlciA9IHBhcmVudFBhcnNlcjtcblx0XHR0aGlzLl9yZXRyaWV2ZUFzUmF3RGF0YSA9IHJldHJpZXZlQXNSYXdEYXRhO1xuXHRcdHRoaXMuX3N1cHByZXNzQXNzZXRFdmVudHMgPSBzdXBwcmVzc0Fzc2V0RXZlbnRzO1xuXG5cdFx0dGhpcy5fYXNzZXRzID0gbmV3IEFycmF5PElBc3NldD4oKTtcblx0XHR0aGlzLl9kZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXk8UmVzb3VyY2VEZXBlbmRlbmN5PigpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGlkKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faWQ7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgcmVxdWVzdCgpOlVSTFJlcXVlc3Rcblx0e1xuXHRcdHJldHVybiB0aGlzLl9yZXF1ZXN0O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBkYXRhIGNvbnRhaW5pbmcgdGhlIGRlcGVuZGVuY3kgdG8gYmUgcGFyc2VkLCBpZiB0aGUgcmVzb3VyY2Ugd2FzIGFscmVhZHkgbG9hZGVkLlxuXHQgKi9cblx0cHVibGljIGdldCBkYXRhKCk6YW55XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBwYXJzZXIoKTpQYXJzZXJCYXNlXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcGFyc2VyO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBwYXJzZXIgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoaXMgUmVzb3VyY2VEZXBlbmRlbmN5IG9iamVjdC5cblx0ICovXG5cdHB1YmxpYyBnZXQgcGFyZW50UGFyc2VyKCk6UGFyc2VyQmFzZVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BhcmVudFBhcnNlcjtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCByZXRyaWV2ZUFzUmF3RGF0YSgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9yZXRyaWV2ZUFzUmF3RGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBzdXBwcmVzQXNzZXRFdmVudHMoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc3VwcHJlc3NBc3NldEV2ZW50cztcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBhc3NldHMoKTpBcnJheTxJQXNzZXQ+XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYXNzZXRzO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGRlcGVuZGVuY2llcygpOkFycmF5PFJlc291cmNlRGVwZW5kZW5jeT5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9kZXBlbmRlbmNpZXM7XG5cdH1cblxuXHQvKipcblx0ICogQHByaXZhdGVcblx0ICogTWV0aG9kIHRvIHNldCBkYXRhIGFmdGVyIGhhdmluZyBhbHJlYWR5IGNyZWF0ZWQgdGhlIGRlcGVuZGVuY3kgb2JqZWN0LCBlLmcuIGFmdGVyIGxvYWQuXG5cdCAqL1xuXHRwdWJsaWMgX2lTZXREYXRhKGRhdGE6YW55KTp2b2lkXG5cdHtcblx0XHR0aGlzLl9kYXRhID0gZGF0YTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcHJpdmF0ZVxuXHQgKlxuXHQgKi9cblx0cHVibGljIF9pU2V0UGFyc2VyKHBhcnNlcjpQYXJzZXJCYXNlKTp2b2lkXG5cdHtcblx0XHR0aGlzLl9wYXJzZXIgPSBwYXJzZXI7XG5cdH1cblxuXHQvKipcblx0ICogUmVzb2x2ZSB0aGUgZGVwZW5kZW5jeSB3aGVuIGl0J3MgbG9hZGVkIHdpdGggdGhlIHBhcmVudCBwYXJzZXIuIEZvciBleGFtcGxlLCBhIGRlcGVuZGVuY3kgY29udGFpbmluZyBhblxuXHQgKiBJbWFnZVJlc291cmNlIHdvdWxkIGJlIGFzc2lnbmVkIHRvIGEgTWVzaCBpbnN0YW5jZSBhcyBhIEJpdG1hcE1hdGVyaWFsLCBhIHNjZW5lIGdyYXBoIG9iamVjdCB3b3VsZCBiZSBhZGRlZFxuXHQgKiB0byBpdHMgaW50ZW5kZWQgcGFyZW50LiBUaGUgZGVwZW5kZW5jeSBzaG91bGQgYmUgYSBtZW1iZXIgb2YgdGhlIGRlcGVuZGVuY2llcyBwcm9wZXJ0eS5cblx0ICovXG5cdHB1YmxpYyByZXNvbHZlKCk6dm9pZFxuXHR7XG5cdFx0aWYgKHRoaXMuX3BhcmVudFBhcnNlcilcblx0XHRcdHRoaXMuX3BhcmVudFBhcnNlci5faVJlc29sdmVEZXBlbmRlbmN5KHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc29sdmUgYSBkZXBlbmRlbmN5IGZhaWx1cmUuIEZvciBleGFtcGxlLCBtYXAgbG9hZGluZyBmYWlsdXJlIGZyb20gYSAzZCBmaWxlXG5cdCAqL1xuXHRwdWJsaWMgcmVzb2x2ZUZhaWx1cmUoKTp2b2lkXG5cdHtcblx0XHRpZiAodGhpcy5fcGFyZW50UGFyc2VyKVxuXHRcdFx0dGhpcy5fcGFyZW50UGFyc2VyLl9pUmVzb2x2ZURlcGVuZGVuY3lGYWlsdXJlKHRoaXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlc29sdmUgdGhlIGRlcGVuZGVuY2llcyBuYW1lXG5cdCAqL1xuXHRwdWJsaWMgcmVzb2x2ZU5hbWUoYXNzZXQ6SUFzc2V0KTpzdHJpbmdcblx0e1xuXHRcdGlmICh0aGlzLl9wYXJlbnRQYXJzZXIpXG5cdFx0XHRyZXR1cm4gdGhpcy5fcGFyZW50UGFyc2VyLl9pUmVzb2x2ZURlcGVuZGVuY3lOYW1lKHRoaXMsIGFzc2V0KTtcblxuXHRcdHJldHVybiBhc3NldC5uYW1lO1xuXHR9XG59XG5cbmV4cG9ydCA9IFJlc291cmNlRGVwZW5kZW5jeTsiXX0= \ No newline at end of file diff --git a/lib/parsers/ResourceDependency.ts b/lib/parsers/ResourceDependency.ts new file mode 100644 index 00000000..15d28382 --- /dev/null +++ b/lib/parsers/ResourceDependency.ts @@ -0,0 +1,163 @@ +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); + +/** + * ResourceDependency represents the data required to load, parse and resolve additional files ("dependencies") + * required by a parser, used by ResourceLoadSession. + * + */ +class ResourceDependency +{ + private _id:string; + private _request:URLRequest; + private _assets:Array; + private _parser:ParserBase; + private _parentParser:ParserBase; + private _data:any; + private _retrieveAsRawData:boolean; + private _suppressAssetEvents:boolean; + private _dependencies:Array; + + public _iLoader:URLLoader; + public _iSuccess:boolean; + + + constructor(id:string, request:URLRequest, data:any, parser:ParserBase, parentParser:ParserBase, retrieveAsRawData:boolean = false, suppressAssetEvents:boolean = false) + { + this._id = id; + this._request = request; + this._data = data; + this._parser = parser; + this._parentParser = parentParser; + this._retrieveAsRawData = retrieveAsRawData; + this._suppressAssetEvents = suppressAssetEvents; + + this._assets = new Array(); + this._dependencies = new Array(); + } + + /** + * + */ + public get id():string + { + return this._id; + } + + /** + * + */ + public get request():URLRequest + { + return this._request; + } + + /** + * The data containing the dependency to be parsed, if the resource was already loaded. + */ + public get data():any + { + return this._data; + } + + /** + * + */ + public get parser():ParserBase + { + return this._parser; + } + + /** + * The parser which is dependent on this ResourceDependency object. + */ + public get parentParser():ParserBase + { + return this._parentParser; + } + + /** + * + */ + public get retrieveAsRawData():boolean + { + return this._retrieveAsRawData; + } + + /** + * + */ + public get suppresAssetEvents():boolean + { + return this._suppressAssetEvents; + } + + /** + * + */ + public get assets():Array + { + return this._assets; + } + + /** + * + */ + public get dependencies():Array + { + return this._dependencies; + } + + /** + * @private + * Method to set data after having already created the dependency object, e.g. after load. + */ + public _iSetData(data:any):void + { + this._data = data; + } + + /** + * @private + * + */ + public _iSetParser(parser:ParserBase):void + { + this._parser = parser; + } + + /** + * Resolve the dependency when it's loaded with the parent parser. For example, a dependency containing an + * ImageResource would be assigned to a Mesh instance as a BitmapMaterial, a scene graph object would be added + * to its intended parent. The dependency should be a member of the dependencies property. + */ + public resolve():void + { + if (this._parentParser) + this._parentParser._iResolveDependency(this); + } + + /** + * Resolve a dependency failure. For example, map loading failure from a 3d file + */ + public resolveFailure():void + { + if (this._parentParser) + this._parentParser._iResolveDependencyFailure(this); + } + + /** + * Resolve the dependencies name + */ + public resolveName(asset:IAsset):string + { + if (this._parentParser) + return this._parentParser._iResolveDependencyName(this, asset); + + return asset.name; + } +} + +export = ResourceDependency; \ No newline at end of file diff --git a/lib/parsers/Texture2DParser.js b/lib/parsers/Texture2DParser.js new file mode 100755 index 00000000..ca2bc918 --- /dev/null +++ b/lib/parsers/Texture2DParser.js @@ -0,0 +1,147 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var Billboard = require("awayjs-core/lib/entities/Billboard"); +var CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); +var ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +var ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +var ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); + +var ByteArray = require("awayjs-core/lib/utils/ByteArray"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +/** +* Texture2DParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into +* a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without +* exception cases. +*/ +var Texture2DParser = (function (_super) { + __extends(Texture2DParser, _super); + /** + * Creates a new Texture2DParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + function Texture2DParser() { + _super.call(this, URLLoaderDataFormat.BLOB); + } + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + Texture2DParser.supportsType = function (extension) { + extension = extension.toLowerCase(); + return extension == "jpg" || extension == "jpeg" || extension == "png" || extension == "gif"; + }; + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + Texture2DParser.supportsData = function (data) { + if (data instanceof HTMLImageElement) + return true; + + if (!(data instanceof ByteArray)) + return false; + + var ba = data; + ba.position = 0; + + if (ba.readUnsignedShort() == 0xffd8) + return true; + + ba.position = 0; + if (ba.readShort() == 0x424D) + return true; + + ba.position = 1; + if (ba.readUTFBytes(3) == 'PNG') + return true; + + ba.position = 0; + if (ba.readUTFBytes(3) == 'GIF' && ba.readShort() == 0x3839 && ba.readByte() == 0x61) + return true; + + ba.position = 0; + if (ba.readUTFBytes(3) == 'ATF') + return true; + + return false; + }; + + /** + * @inheritDoc + */ + Texture2DParser.prototype._pProceedParsing = function () { + var _this = this; + var asset; + var sizeError = false; + + if (this._loadingImage) { + return ParserBase.MORE_TO_PARSE; + } else if (this._htmlImageElement) { + if (TextureUtils.isHTMLImageElementValid(this._htmlImageElement)) { + asset = new ImageTexture(this._htmlImageElement); + this._pFinalizeAsset(asset, this._iFileName); + } + } else if (this.data instanceof HTMLImageElement) { + if (TextureUtils.isHTMLImageElementValid(this.data)) { + asset = new ImageTexture(this.data); + this._pFinalizeAsset(asset, this._iFileName); + } else { + sizeError = true; + } + } else if (this.data instanceof ByteArray) { + var ba = this.data; + ba.position = 0; + var htmlImageElement = ParserUtils.byteArrayToImage(this.data); + + if (TextureUtils.isHTMLImageElementValid(htmlImageElement)) { + asset = new ImageTexture(htmlImageElement); + this._pFinalizeAsset(asset, this._iFileName); + } else { + sizeError = true; + } + } else if (this.data instanceof ArrayBuffer) { + this._htmlImageElement = ParserUtils.arrayBufferToImage(this.data); + + asset = new ImageTexture(this._htmlImageElement); + this._pFinalizeAsset(asset, this._iFileName); + } else if (this.data instanceof Blob) { + this._htmlImageElement = ParserUtils.blobToImage(this.data); + + this._htmlImageElement.onload = function (event) { + return _this.onLoadComplete(event); + }; + this._loadingImage = true; + + return ParserBase.MORE_TO_PARSE; + } + + if (sizeError == true) { + // asset = new BitmapTexture(DefaultMaterialManager.createCheckeredBitmapData(), false); + // this._pFinalizeAsset( asset, this._iFileName); + // this.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.TEXTURE_SIZE_ERROR, asset)); + } + + this._pContent = new Billboard(new CSSMaterialBase(asset)); + + return ParserBase.PARSING_DONE; + }; + + Texture2DParser.prototype.onLoadComplete = function (event) { + this._loadingImage = false; + }; + return Texture2DParser; +})(ParserBase); + +module.exports = Texture2DParser; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInBhcnNlcnMvVGV4dHVyZTJEUGFyc2VyLnRzIl0sIm5hbWVzIjpbIlRleHR1cmUyRFBhcnNlciIsIlRleHR1cmUyRFBhcnNlci5jb25zdHJ1Y3RvciIsIlRleHR1cmUyRFBhcnNlci5zdXBwb3J0c1R5cGUiLCJUZXh0dXJlMkRQYXJzZXIuc3VwcG9ydHNEYXRhIiwiVGV4dHVyZTJEUGFyc2VyLl9wUHJvY2VlZFBhcnNpbmciLCJUZXh0dXJlMkRQYXJzZXIub25Mb2FkQ29tcGxldGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGlGQUNzRjtBQUN0Riw2REFBb0U7QUFDcEUsMEVBQWdGO0FBQ2hGLDhEQUFxRTtBQUNyRSxnRUFBdUU7QUFDdkUsbUVBQTBFOztBQUUxRSwwREFBaUU7QUFDakUsZ0VBQXVFOztBQUV2RTs7OztFQUlHO0FBQ0g7SUFBOEJBLGtDQUFVQTtJQVl2Q0E7Ozs7TUFER0E7SUFDSEE7UUFFQ0MsV0FBTUEsT0FBQUEsbUJBQW1CQSxDQUFDQSxJQUFJQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7SUFPREQ7Ozs7TUFER0E7bUNBQ0hBLFVBQTJCQSxTQUFnQkE7UUFHMUNFLFNBQVNBLEdBQUdBLFNBQVNBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO1FBQ25DQSxPQUFPQSxTQUFTQSxJQUFJQSxLQUFLQSxJQUFJQSxTQUFTQSxJQUFJQSxNQUFNQSxJQUFJQSxTQUFTQSxJQUFJQSxLQUFLQSxJQUFJQSxTQUFTQSxJQUFJQSxLQUFLQTtJQUU3RkEsQ0FBQ0E7O0lBT0RGOzs7O01BREdBO21DQUNIQSxVQUEyQkEsSUFBUUE7UUFHbENHLElBQUlBLElBQUlBLFlBQWFBLGdCQUFnQkE7WUFDcENBLE9BQU9BLElBQUlBLENBQUNBOztRQUViQSxJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxZQUFZQSxTQUFTQSxDQUFDQTtZQUMvQkEsT0FBT0EsS0FBS0EsQ0FBQ0E7O1FBRWRBLElBQUlBLEVBQUVBLEdBQXlCQSxJQUFJQTtRQUNuQ0EsRUFBRUEsQ0FBQ0EsUUFB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SUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsS0FBS0E7SUFDM0JBLENBQUNBO0lBQ0ZMLHVCQUFDQTtBQUFEQSxDQUFDQSxFQTlJNkIsVUFBVSxFQThJdkM7O0FBRUQsZ0NBQXlCLENBQUEiLCJmaWxlIjoicGFyc2Vycy9UZXh0dXJlMkRQYXJzZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFVSTExvYWRlckRhdGFGb3JtYXRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTExvYWRlckRhdGFGb3JtYXRcIik7XG5pbXBvcnQgQmlsbGJvYXJkXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvQmlsbGJvYXJkXCIpO1xuaW1wb3J0IENTU01hdGVyaWFsQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvQ1NTTWF0ZXJpYWxCYXNlXCIpO1xuaW1wb3J0IFBhcnNlckJhc2VcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlckJhc2VcIik7XG5pbXBvcnQgUGFyc2VyVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlclV0aWxzXCIpO1xuaW1wb3J0IEltYWdlVGV4dHVyZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL0ltYWdlVGV4dHVyZVwiKTtcbmltcG9ydCBUZXh0dXJlMkRCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL1RleHR1cmUyREJhc2VcIik7XG5pbXBvcnQgQnl0ZUFycmF5XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvQnl0ZUFycmF5XCIpO1xuaW1wb3J0IFRleHR1cmVVdGlsc1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL1RleHR1cmVVdGlsc1wiKTtcblxuLyoqXG4gKiBUZXh0dXJlMkRQYXJzZXIgcHJvdmlkZXMgYSBcInBhcnNlclwiIGZvciBuYXRpdmVseSBzdXBwb3J0ZWQgaW1hZ2UgdHlwZXMgKGpwZywgcG5nKS4gV2hpbGUgaXQgc2ltcGx5IGxvYWRzIGJ5dGVzIGludG9cbiAqIGEgbG9hZGVyIG9iamVjdCwgaXQgd3JhcHMgaXQgaW4gYSBCaXRtYXBEYXRhUmVzb3VyY2Ugc28gcmVzb3VyY2UgbWFuYWdlbWVudCBjYW4gaGFwcGVuIGNvbnNpc3RlbnRseSB3aXRob3V0XG4gKiBleGNlcHRpb24gY2FzZXMuXG4gKi9cbmNsYXNzIFRleHR1cmUyRFBhcnNlciBleHRlbmRzIFBhcnNlckJhc2Vcbntcblx0cHJpdmF0ZSBfc3RhcnRlZFBhcnNpbmc6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfZG9uZVBhcnNpbmc6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfbG9hZGluZ0ltYWdlOmJvb2xlYW47XG5cdHByaXZhdGUgX2h0bWxJbWFnZUVsZW1lbnQ6SFRNTEltYWdlRWxlbWVudDtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBUZXh0dXJlMkRQYXJzZXIgb2JqZWN0LlxuXHQgKiBAcGFyYW0gdXJpIFRoZSB1cmwgb3IgaWQgb2YgdGhlIGRhdGEgb3IgZmlsZSB0byBiZSBwYXJzZWQuXG5cdCAqIEBwYXJhbSBleHRyYSBUaGUgaG9sZGVyIGZvciBleHRyYSBjb250ZXh0dWFsIGRhdGEgdGhhdCB0aGUgcGFyc2VyIG1pZ2h0IG5lZWQuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcihVUkxMb2FkZXJEYXRhRm9ybWF0LkJMT0IpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBhIGdpdmVuIGZpbGUgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZCBieSB0aGUgcGFyc2VyLlxuXHQgKiBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBmaWxlIGV4dGVuc2lvbiBvZiBhIHBvdGVudGlhbCBmaWxlIHRvIGJlIHBhcnNlZC5cblx0ICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZmlsZSB0eXBlIGlzIHN1cHBvcnRlZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgc3VwcG9ydHNUeXBlKGV4dGVuc2lvbjpzdHJpbmcpOmJvb2xlYW5cblx0e1xuXG5cdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIGV4dGVuc2lvbiA9PSBcImpwZ1wiIHx8IGV4dGVuc2lvbiA9PSBcImpwZWdcIiB8fCBleHRlbnNpb24gPT0gXCJwbmdcIiB8fCBleHRlbnNpb24gPT0gXCJnaWZcIjsvL3x8IGV4dGVuc2lvbiA9PSBcImJtcFwiOy8vfHwgZXh0ZW5zaW9uID09IFwiYXRmXCI7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBUZXN0cyB3aGV0aGVyIGEgZGF0YSBibG9jayBjYW4gYmUgcGFyc2VkIGJ5IHRoZSBwYXJzZXIuXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGJsb2NrIHRvIHBvdGVudGlhbGx5IGJlIHBhcnNlZC5cblx0ICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZGF0YSBpcyBzdXBwb3J0ZWQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHN1cHBvcnRzRGF0YShkYXRhOmFueSk6Ym9vbGVhblxuXHR7XG5cblx0XHRpZiAoZGF0YSAgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHRpZiAoIShkYXRhIGluc3RhbmNlb2YgQnl0ZUFycmF5KSlcblx0XHRcdHJldHVybiBmYWxzZTtcblxuXHRcdHZhciBiYTpCeXRlQXJyYXkgPSA8Qnl0ZUFycmF5PiBkYXRhO1xuXHRcdGJhLnBvc2l0aW9uID0gMDtcblxuXHRcdGlmIChiYS5yZWFkVW5zaWduZWRTaG9ydCgpID09IDB4ZmZkOClcblx0XHRcdHJldHVybiB0cnVlOyAvLyBKUEVHLCBtYXliZSBjaGVjayBmb3IgXCJKRklGXCIgYXMgd2VsbD9cblxuXHRcdGJhLnBvc2l0aW9uID0gMDtcblx0XHRpZiAoYmEucmVhZFNob3J0KCkgPT0gMHg0MjREKVxuXHRcdFx0cmV0dXJuIHRydWU7IC8vIEJNUFxuXG5cdFx0YmEucG9zaXRpb24gPSAxO1xuXHRcdGlmIChiYS5yZWFkVVRGQnl0ZXMoMykgPT0gJ1BORycpXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdGJhLnBvc2l0aW9uID0gMDtcblx0XHRpZiAoYmEucmVhZFVURkJ5dGVzKDMpID09ICdHSUYnICYmIGJhLnJlYWRTaG9ydCgpID09IDB4MzgzOSAmJiBiYS5yZWFkQnl0ZSgpID09IDB4NjEpXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdGJhLnBvc2l0aW9uID0gMDtcblx0XHRpZiAoYmEucmVhZFVURkJ5dGVzKDMpID09ICdBVEYnKVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIF9wUHJvY2VlZFBhcnNpbmcoKTpib29sZWFuXG5cdHtcblxuXHRcdHZhciBhc3NldDpUZXh0dXJlMkRCYXNlO1xuXHRcdHZhciBzaXplRXJyb3I6Ym9vbGVhbiA9IGZhbHNlO1xuXG5cdFx0aWYgKHRoaXMuX2xvYWRpbmdJbWFnZSkge1xuXHRcdFx0cmV0dXJuIFBhcnNlckJhc2UuTU9SRV9UT19QQVJTRTtcblx0XHR9IGVsc2UgaWYgKHRoaXMuX2h0bWxJbWFnZUVsZW1lbnQpIHtcblx0XHRcdGlmIChUZXh0dXJlVXRpbHMuaXNIVE1MSW1hZ2VFbGVtZW50VmFsaWQodGhpcy5faHRtbEltYWdlRWxlbWVudCkpIHtcblx0XHRcdFx0YXNzZXQgPSBuZXcgSW1hZ2VUZXh0dXJlKHRoaXMuX2h0bWxJbWFnZUVsZW1lbnQpO1xuXHRcdFx0XHR0aGlzLl9wRmluYWxpemVBc3NldCg8SUFzc2V0PiBhc3NldCwgdGhpcy5faUZpbGVOYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRoaXMuZGF0YSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHsvLyBQYXJzZSBIVE1MSW1hZ2VFbGVtZW50XG5cblx0XHRcdGlmIChUZXh0dXJlVXRpbHMuaXNIVE1MSW1hZ2VFbGVtZW50VmFsaWQoPEhUTUxJbWFnZUVsZW1lbnQ+IHRoaXMuZGF0YSkpIHtcblx0XHRcdFx0YXNzZXQgPSBuZXcgSW1hZ2VUZXh0dXJlKDxIVE1MSW1hZ2VFbGVtZW50PiB0aGlzLmRhdGEpO1xuXHRcdFx0XHR0aGlzLl9wRmluYWxpemVBc3NldCg8SUFzc2V0PiBhc3NldCwgdGhpcy5faUZpbGVOYW1lKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNpemVFcnJvciA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2UgaWYgKHRoaXMuZGF0YSBpbnN0YW5jZW9mIEJ5dGVBcnJheSkgeyAvLyBQYXJzZSBhIEJ5dGVBcnJheVxuXG5cdFx0XHR2YXIgYmE6Qnl0ZUFycmF5ID0gdGhpcy5kYXRhO1xuXHRcdFx0YmEucG9zaXRpb24gPSAwO1xuXHRcdFx0dmFyIGh0bWxJbWFnZUVsZW1lbnQ6SFRNTEltYWdlRWxlbWVudCA9IFBhcnNlclV0aWxzLmJ5dGVBcnJheVRvSW1hZ2UodGhpcy5kYXRhKTtcblxuXHRcdFx0aWYgKFRleHR1cmVVdGlscy5pc0hUTUxJbWFnZUVsZW1lbnRWYWxpZChodG1sSW1hZ2VFbGVtZW50KSkge1xuXHRcdFx0XHRhc3NldCA9IG5ldyBJbWFnZVRleHR1cmUoaHRtbEltYWdlRWxlbWVudCk7XG5cdFx0XHRcdHRoaXMuX3BGaW5hbGl6ZUFzc2V0KDxJQXNzZXQ+IGFzc2V0LCB0aGlzLl9pRmlsZU5hbWUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2l6ZUVycm9yID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSBpZiAodGhpcy5kYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHsvLyBQYXJzZSBhbiBBcnJheUJ1ZmZlclxuXG5cdFx0XHR0aGlzLl9odG1sSW1hZ2VFbGVtZW50ID0gUGFyc2VyVXRpbHMuYXJyYXlCdWZmZXJUb0ltYWdlKHRoaXMuZGF0YSk7XG5cblx0XHRcdGFzc2V0ID0gbmV3IEltYWdlVGV4dHVyZSh0aGlzLl9odG1sSW1hZ2VFbGVtZW50KTtcblx0XHRcdHRoaXMuX3BGaW5hbGl6ZUFzc2V0KDxJQXNzZXQ+IGFzc2V0LCB0aGlzLl9pRmlsZU5hbWUpO1xuXG5cdFx0fSBlbHNlIGlmICh0aGlzLmRhdGEgaW5zdGFuY2VvZiBCbG9iKSB7IC8vIFBhcnNlIGEgQmxvYlxuXG5cdFx0XHR0aGlzLl9odG1sSW1hZ2VFbGVtZW50ID0gUGFyc2VyVXRpbHMuYmxvYlRvSW1hZ2UodGhpcy5kYXRhKTtcblxuXHRcdFx0dGhpcy5faHRtbEltYWdlRWxlbWVudC5vbmxvYWQgPSAoZXZlbnQpID0+IHRoaXMub25Mb2FkQ29tcGxldGUoZXZlbnQpO1xuXHRcdFx0dGhpcy5fbG9hZGluZ0ltYWdlID0gdHJ1ZTtcblxuXHRcdFx0cmV0dXJuIFBhcnNlckJhc2UuTU9SRV9UT19QQVJTRTtcblx0XHR9XG5cblx0XHRpZiAoc2l6ZUVycm9yID09IHRydWUpIC8vIEdlbmVyYXRlIG5ldyBDaGVja2VyYm9hcmQgdGV4dHVyZSBtYXRlcmlhbFxuXHRcdHtcbi8vXHRcdFx0XHRhc3NldCA9IG5ldyBCaXRtYXBUZXh0dXJlKERlZmF1bHRNYXRlcmlhbE1hbmFnZXIuY3JlYXRlQ2hlY2tlcmVkQml0bWFwRGF0YSgpLCBmYWxzZSk7XG4vL1x0XHRcdFx0dGhpcy5fcEZpbmFsaXplQXNzZXQoPElBc3NldD4gYXNzZXQsIHRoaXMuX2lGaWxlTmFtZSk7XG4vL1x0XHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBhd2F5LmV2ZW50cy5Bc3NldEV2ZW50KGF3YXkuZXZlbnRzLkFzc2V0RXZlbnQuVEVYVFVSRV9TSVpFX0VSUk9SLCA8SUFzc2V0PiBhc3NldCkpO1xuXHRcdH1cblxuXHRcdHRoaXMuX3BDb250ZW50ID0gbmV3IEJpbGxib2FyZChuZXcgQ1NTTWF0ZXJpYWxCYXNlKGFzc2V0KSk7XG5cblx0XHRyZXR1cm4gUGFyc2VyQmFzZS5QQVJTSU5HX0RPTkU7XG5cblx0fVxuXG5cdHB1YmxpYyBvbkxvYWRDb21wbGV0ZShldmVudClcblx0e1xuXHRcdHRoaXMuX2xvYWRpbmdJbWFnZSA9IGZhbHNlO1xuXHR9XG59XG5cbmV4cG9ydCA9IFRleHR1cmUyRFBhcnNlcjsiXX0= \ No newline at end of file diff --git a/lib/parsers/Texture2DParser.ts b/lib/parsers/Texture2DParser.ts new file mode 100644 index 00000000..edd1bf91 --- /dev/null +++ b/lib/parsers/Texture2DParser.ts @@ -0,0 +1,161 @@ +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import Billboard = require("awayjs-core/lib/entities/Billboard"); +import CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +import ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +import ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); +import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +import ByteArray = require("awayjs-core/lib/utils/ByteArray"); +import TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +/** + * Texture2DParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into + * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without + * exception cases. + */ +class Texture2DParser extends ParserBase +{ + private _startedParsing:boolean; + private _doneParsing:boolean; + private _loadingImage:boolean; + private _htmlImageElement:HTMLImageElement; + + /** + * Creates a new Texture2DParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + constructor() + { + super(URLLoaderDataFormat.BLOB); + } + + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + public static supportsType(extension:string):boolean + { + + extension = extension.toLowerCase(); + return extension == "jpg" || extension == "jpeg" || extension == "png" || extension == "gif";//|| extension == "bmp";//|| extension == "atf"; + + } + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + public static supportsData(data:any):boolean + { + + if (data instanceof HTMLImageElement) + return true; + + if (!(data instanceof ByteArray)) + return false; + + var ba:ByteArray = data; + ba.position = 0; + + if (ba.readUnsignedShort() == 0xffd8) + return true; // JPEG, maybe check for "JFIF" as well? + + ba.position = 0; + if (ba.readShort() == 0x424D) + return true; // BMP + + ba.position = 1; + if (ba.readUTFBytes(3) == 'PNG') + return true; + + ba.position = 0; + if (ba.readUTFBytes(3) == 'GIF' && ba.readShort() == 0x3839 && ba.readByte() == 0x61) + return true; + + ba.position = 0; + if (ba.readUTFBytes(3) == 'ATF') + return true; + + return false; + + } + + /** + * @inheritDoc + */ + public _pProceedParsing():boolean + { + + var asset:Texture2DBase; + var sizeError:boolean = false; + + if (this._loadingImage) { + return ParserBase.MORE_TO_PARSE; + } else if (this._htmlImageElement) { + if (TextureUtils.isHTMLImageElementValid(this._htmlImageElement)) { + asset = new ImageTexture(this._htmlImageElement); + this._pFinalizeAsset( asset, this._iFileName); + } + } else if (this.data instanceof HTMLImageElement) {// Parse HTMLImageElement + + if (TextureUtils.isHTMLImageElementValid( this.data)) { + asset = new ImageTexture( this.data); + this._pFinalizeAsset( asset, this._iFileName); + } else { + sizeError = true; + } + + } else if (this.data instanceof ByteArray) { // Parse a ByteArray + + var ba:ByteArray = this.data; + ba.position = 0; + var htmlImageElement:HTMLImageElement = ParserUtils.byteArrayToImage(this.data); + + if (TextureUtils.isHTMLImageElementValid(htmlImageElement)) { + asset = new ImageTexture(htmlImageElement); + this._pFinalizeAsset( asset, this._iFileName); + } else { + sizeError = true; + } + + } else if (this.data instanceof ArrayBuffer) {// Parse an ArrayBuffer + + this._htmlImageElement = ParserUtils.arrayBufferToImage(this.data); + + asset = new ImageTexture(this._htmlImageElement); + this._pFinalizeAsset( asset, this._iFileName); + + } else if (this.data instanceof Blob) { // Parse a Blob + + this._htmlImageElement = ParserUtils.blobToImage(this.data); + + this._htmlImageElement.onload = (event) => this.onLoadComplete(event); + this._loadingImage = true; + + return ParserBase.MORE_TO_PARSE; + } + + if (sizeError == true) // Generate new Checkerboard texture material + { +// asset = new BitmapTexture(DefaultMaterialManager.createCheckeredBitmapData(), false); +// this._pFinalizeAsset( asset, this._iFileName); +// this.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.TEXTURE_SIZE_ERROR, asset)); + } + + this._pContent = new Billboard(new CSSMaterialBase(asset)); + + return ParserBase.PARSING_DONE; + + } + + public onLoadComplete(event) + { + this._loadingImage = false; + } +} + +export = Texture2DParser; \ No newline at end of file diff --git a/lib/prefabs/PrefabBase.js b/lib/prefabs/PrefabBase.js new file mode 100755 index 00000000..92021182 --- /dev/null +++ b/lib/prefabs/PrefabBase.js @@ -0,0 +1,54 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +/** +* PrefabBase is an abstract base class for prefabs, which are prebuilt display objects that allow easy cloning and updating +*/ +var PrefabBase = (function (_super) { + __extends(PrefabBase, _super); + // public _pBatchObjects:Array = new Array(); + /** + * Creates a new PrefabBase object. + */ + function PrefabBase() { + _super.call(this); + this._pObjects = new Array(); + } + /** + * Returns a display object generated from this prefab + */ + PrefabBase.prototype.getNewObject = function () { + var object = this._pCreateObject(); + + this._pObjects.push(object); + + return object; + }; + + // public getNewBatchObject():BatchObject + // { + // var object:BatchObject = this._pCreateBatchObject(); + // + // this._pBatchObjects.push(object); + // + // return object; + // } + PrefabBase.prototype._pCreateObject = function () { + throw new AbstractMethodError(); + }; + + PrefabBase.prototype._iValidate = function () { + // To be overridden when necessary + }; + return PrefabBase; +})(NamedAssetBase); + +module.exports = PrefabBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJlZmFiQmFzZS50cyJdLCJuYW1lcyI6WyJQcmVmYWJCYXNlIiwiUHJlZmFiQmFzZS5jb25zdHJ1Y3RvciIsIlByZWZhYkJhc2UuZ2V0TmV3T2JqZWN0IiwiUHJlZmFiQmFzZS5fcENyZWF0ZU9iamVjdCIsIlByZWZhYkJhc2UuX2lWYWxpZGF0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMkVBQ2lGO0FBQ2pGLCtFQUFvRjs7QUFFcEY7O0VBRUc7QUFDSDtJQUF5QkEsNkJBQWNBO0lBU3RDQSx3RUFMdUVBO0lBRXZFQTs7TUFFR0E7SUFDSEE7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFUUkEsS0FBT0EsU0FBU0EsR0FBd0JBLElBQUlBLEtBQUtBLENBQWdCQSxDQUFDQSxDQUFDQTtJQVVuRUEsQ0FBQ0E7SUFLREQ7O01BREdBO3dDQUNIQTtRQUVDRSxJQUFJQSxNQUFNQSxHQUFpQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7O1FBRWhEQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTs7UUFFM0JBLE9BQU9BLE1BQU1BO0lBQ2RBLENBQUNBOztJQVdERiwwQ0FUeUNBO0lBQzFDQSxLQUFLQTtJQUNMQSx5REFBeURBO0lBQ3pEQSxFQUFFQTtJQUNGQSxzQ0FBc0NBO0lBQ3RDQSxFQUFFQTtJQUNGQSxtQkFBbUJBO0lBQ25CQSxLQUFLQTswQ0FFSkE7UUFFQ0csTUFBTUEsSUFBSUEsbUJBQW1CQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7O0lBRURILGtDQUFBQTtRQUVDSSxrQ0FBa0NBO0lBQ25DQSxDQUFDQTtJQUNGSixrQkFBQ0E7QUFBREEsQ0FBQ0EsRUE1Q3dCLGNBQWMsRUE0Q3RDOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6InByZWZhYnMvUHJlZmFiQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IE5hbWVkQXNzZXRCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9OYW1lZEFzc2V0QmFzZVwiKTtcbmltcG9ydCBBYnN0cmFjdE1ldGhvZEVycm9yXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQWJzdHJhY3RNZXRob2RFcnJvclwiKTtcblxuLyoqXG4gKiBQcmVmYWJCYXNlIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByZWZhYnMsIHdoaWNoIGFyZSBwcmVidWlsdCBkaXNwbGF5IG9iamVjdHMgdGhhdCBhbGxvdyBlYXN5IGNsb25pbmcgYW5kIHVwZGF0aW5nXG4gKi9cbmNsYXNzIFByZWZhYkJhc2UgZXh0ZW5kcyBOYW1lZEFzc2V0QmFzZVxue1xuXHRwdWJsaWMgX3BPYmplY3RzOkFycmF5PERpc3BsYXlPYmplY3Q+ID0gbmV3IEFycmF5PERpc3BsYXlPYmplY3Q+KCk7XG5cbi8vXHRcdHB1YmxpYyBfcEJhdGNoT2JqZWN0czpBcnJheTxCYXRjaE9iamVjdD4gPSBuZXcgQXJyYXk8QmF0Y2hPYmplY3Q+KCk7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgUHJlZmFiQmFzZSBvYmplY3QuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcigpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYSBkaXNwbGF5IG9iamVjdCBnZW5lcmF0ZWQgZnJvbSB0aGlzIHByZWZhYlxuXHQgKi9cblx0cHVibGljIGdldE5ld09iamVjdCgpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHZhciBvYmplY3Q6RGlzcGxheU9iamVjdCA9IHRoaXMuX3BDcmVhdGVPYmplY3QoKTtcblxuXHRcdHRoaXMuX3BPYmplY3RzLnB1c2gob2JqZWN0KTtcblxuXHRcdHJldHVybiBvYmplY3Q7XG5cdH1cblxuLy9cdFx0cHVibGljIGdldE5ld0JhdGNoT2JqZWN0KCk6QmF0Y2hPYmplY3Rcbi8vXHRcdHtcbi8vXHRcdFx0dmFyIG9iamVjdDpCYXRjaE9iamVjdCA9IHRoaXMuX3BDcmVhdGVCYXRjaE9iamVjdCgpO1xuLy9cbi8vXHRcdFx0dGhpcy5fcEJhdGNoT2JqZWN0cy5wdXNoKG9iamVjdCk7XG4vL1xuLy9cdFx0XHRyZXR1cm4gb2JqZWN0O1xuLy9cdFx0fVxuXG5cdHB1YmxpYyBfcENyZWF0ZU9iamVjdCgpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHRwdWJsaWMgX2lWYWxpZGF0ZSgpXG5cdHtcblx0XHQvLyBUbyBiZSBvdmVycmlkZGVuIHdoZW4gbmVjZXNzYXJ5XG5cdH1cbn1cblxuZXhwb3J0ID0gUHJlZmFiQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/prefabs/PrefabBase.ts b/lib/prefabs/PrefabBase.ts new file mode 100644 index 00000000..c2d63e0d --- /dev/null +++ b/lib/prefabs/PrefabBase.ts @@ -0,0 +1,54 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +/** + * PrefabBase is an abstract base class for prefabs, which are prebuilt display objects that allow easy cloning and updating + */ +class PrefabBase extends NamedAssetBase +{ + public _pObjects:Array = new Array(); + +// public _pBatchObjects:Array = new Array(); + + /** + * Creates a new PrefabBase object. + */ + constructor() + { + super(); + } + + /** + * Returns a display object generated from this prefab + */ + public getNewObject():DisplayObject + { + var object:DisplayObject = this._pCreateObject(); + + this._pObjects.push(object); + + return object; + } + +// public getNewBatchObject():BatchObject +// { +// var object:BatchObject = this._pCreateBatchObject(); +// +// this._pBatchObjects.push(object); +// +// return object; +// } + + public _pCreateObject():DisplayObject + { + throw new AbstractMethodError(); + } + + public _iValidate() + { + // To be overridden when necessary + } +} + +export = PrefabBase; \ No newline at end of file diff --git a/lib/prefabs/PrimitiveCapsulePrefab.js b/lib/prefabs/PrimitiveCapsulePrefab.js new file mode 100755 index 00000000..14a7e3ad --- /dev/null +++ b/lib/prefabs/PrimitiveCapsulePrefab.js @@ -0,0 +1,298 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A Capsule primitive mesh. +*/ +var PrimitiveCapsulePrefab = (function (_super) { + __extends(PrimitiveCapsulePrefab, _super); + /** + * Creates a new Capsule object. + * @param radius The radius of the capsule. + * @param height The height of the capsule. + * @param segmentsW Defines the number of horizontal segments that make up the capsule. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven value. + * @param yUp Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveCapsulePrefab(radius, height, segmentsW, segmentsH, yUp) { + if (typeof radius === "undefined") { radius = 50; } + if (typeof height === "undefined") { height = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 16; } + if (typeof segmentsH === "undefined") { segmentsH = 15; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this); + this._numVertices = 0; + + this._radius = radius; + this._height = height; + this._segmentsW = segmentsW; + this._segmentsH = (segmentsH % 2 == 0) ? segmentsH + 1 : segmentsH; + this._yUp = yUp; + } + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "radius", { + /** + * The radius of the capsule. + */ + get: function () { + return this._radius; + }, + set: function (value) { + this._radius = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "height", { + /** + * The height of the capsule. + */ + get: function () { + return this._height; + }, + set: function (value) { + this._height = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "segmentsW", { + /** + * Defines the number of horizontal segments that make up the capsule. Defaults to 16. + */ + get: function () { + return this._segmentsW; + }, + set: function (value) { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "segmentsH", { + /** + * Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven. + */ + get: function () { + return this._segmentsH; + }, + set: function (value) { + this._segmentsH = (value % 2 == 0) ? value + 1 : value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCapsulePrefab.prototype, "yUp", { + /** + * Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveCapsulePrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var i; + var j; + var triIndex = 0; + var index = 0; + var startIndex; + var comp1, comp2, t1, t2; + var numIndices = 0; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // evaluate target number of vertices, triangles and indices + this._numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of closure + numIndices = (this._segmentsH - 1) * this._segmentsW * 6; // each level has segmentH quads, each of 2 triangles + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(this._numVertices * 3); + normals = new Array(this._numVertices * 3); + tangents = new Array(this._numVertices * 3); + + this._pInvalidateUVs(); + } + + for (j = 0; j <= this._segmentsH; ++j) { + var horangle = Math.PI * j / this._segmentsH; + var z = -this._radius * Math.cos(horangle); + var ringradius = this._radius * Math.sin(horangle); + + startIndex = index; + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle = 2 * Math.PI * i / this._segmentsW; + var x = ringradius * Math.cos(verangle); + var offset = j > this._segmentsH / 2 ? this._height / 2 : -this._height / 2; + var y = ringradius * Math.sin(verangle); + var normLen = 1 / Math.sqrt(x * x + y * y + z * z); + var tanLen = Math.sqrt(y * y + x * x); + + if (this._yUp) { + t1 = 0; + t2 = tanLen > .007 ? x / tanLen : 0; + comp1 = -z; + comp2 = y; + } else { + t1 = tanLen > .007 ? x / tanLen : 0; + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsW) { + positions[index] = positions[startIndex]; + positions[index + 1] = positions[startIndex + 1]; + positions[index + 2] = positions[startIndex + 2]; + normals[index] = (normals[startIndex] + (x * normLen)) * .5; + normals[index + 1] = (normals[startIndex + 1] + (comp1 * normLen)) * .5; + normals[index + 2] = (normals[startIndex + 2] + (comp2 * normLen)) * .5; + tangents[index] = (tangents[startIndex] + (tanLen > .007 ? -y / tanLen : 1)) * .5; + tangents[index + 1] = (tangents[startIndex + 1] + t1) * .5; + tangents[index + 2] = (tangents[startIndex + 2] + t2) * .5; + } else { + // vertex + positions[index] = x; + positions[index + 1] = (this._yUp) ? comp1 - offset : comp1; + positions[index + 2] = (this._yUp) ? comp2 : comp2 + offset; + + // normal + normals[index] = x * normLen; + normals[index + 1] = comp1 * normLen; + normals[index + 2] = comp2 * normLen; + + // tangent + tangents[index] = tanLen > .007 ? -y / tanLen : 1; + tangents[index + 1] = t1; + tangents[index + 2] = t2; + } + + if (i > 0 && j > 0) { + var a = (this._segmentsW + 1) * j + i; + var b = (this._segmentsW + 1) * j + i - 1; + var c = (this._segmentsW + 1) * (j - 1) + i - 1; + var d = (this._segmentsW + 1) * (j - 1) + i; + + if (j == this._segmentsH) { + positions[index] = positions[startIndex]; + positions[index + 1] = positions[startIndex + 1]; + positions[index + 2] = positions[startIndex + 2]; + + indices[triIndex++] = a; + indices[triIndex++] = c; + indices[triIndex++] = d; + } else if (j == 1) { + indices[triIndex++] = a; + indices[triIndex++] = b; + indices[triIndex++] = c; + } else { + indices[triIndex++] = a; + indices[triIndex++] = b; + indices[triIndex++] = c; + indices[triIndex++] = a; + indices[triIndex++] = c; + indices[triIndex++] = d; + } + } + + index += 3; + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + //TODO + } + }; + + /** + * @inheritDoc + */ + PrimitiveCapsulePrefab.prototype._pBuildUVs = function (target, geometryType) { + var i, j; + var uvs; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices * 2); + } + + // current uv component index + var index = 0; + + for (j = 0; j <= this._segmentsH; ++j) { + for (i = 0; i <= this._segmentsW; ++i) { + // revolution vertex + uvs[index++] = (i / this._segmentsW) * triangleGeometry.scaleU; + uvs[index++] = (j / this._segmentsH) * triangleGeometry.scaleV; + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveCapsulePrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveCapsulePrefab; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlQ2Fwc3VsZVByZWZhYi50cyJdLCJuYW1lcyI6WyJQcmltaXRpdmVDYXBzdWxlUHJlZmFiIiwiUHJpbWl0aXZlQ2Fwc3VsZVByZWZhYi5jb25zdHJ1Y3RvciIsIlByaW1pdGl2ZUNhcHN1bGVQcmVmYWIuX3BCdWlsZEdlb21ldHJ5IiwiUHJpbWl0aXZlQ2Fwc3VsZVByZWZhYi5fcEJ1aWxkVVZzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnRkFJcUY7O0FBRXJGOztFQUVHO0FBQ0g7SUFBcUNBLHlDQUFtQkE7SUE2RnZEQTs7Ozs7OztNQURHQTtJQUNIQSxnQ0FBWUEsTUFBa0JBLEVBQUVBLE1BQW1CQSxFQUFFQSxTQUFxQkEsRUFBRUEsU0FBcUJBLEVBQUVBLEdBQWtCQTtRQUF6R0MscUNBQUFBLE1BQU1BLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLHFDQUFBQSxNQUFNQSxHQUFVQSxHQUFHQTtBQUFBQSxRQUFFQSx3Q0FBQUEsU0FBU0EsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLGtDQUFBQSxHQUFHQSxHQUFXQSxJQUFJQTtBQUFBQSxRQUVwSEEsV0FBTUEsS0FBQUEsQ0FBQ0E7UUF4RlJBLEtBQVFBLFlBQVlBLEdBQVVBLENBQUNBLENBQUNBOztRQTBGL0JBLElBQUlBLENBQUNBLE9BQU9BLEdBQUdBLE1BQU1BO1FBQ3JCQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxNQUFNQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsU0FBU0E7UUFDM0JBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLFNBQVNBLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUVBLFNBQVNBLEdBQUdBLENBQUNBLEdBQUdBLFNBQVNBO1FBQy9EQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxHQUFHQTtJQUNoQkEsQ0FBQ0E7SUExRkREO1FBQUFBOztV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QUNBO3FCQUVUQSxLQUFNQTt3QkFDTkEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsR0FBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0E7d0JBQ2hDQSxFQUFFQSxHQUFHQSxDQUFDQTt3QkFDTkEsS0FBS0EsR0FBR0EsQ0FBQ0E7d0JBQ1RBLEtBQUtBLEdBQUdBLENBQUNBO3FCQUNUQTs7b0JBRURBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLENBQUVBO3dCQUV6QkEsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsVUFBVUEsQ0FBQ0E7d0JBQ3hDQSxTQUFTQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQTt3QkFDaERBLFNBQVNBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO3dCQUNoREEsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7d0JBQ3ZEQSxPQUFPQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxPQUFPQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFFQSxLQUFLQSxHQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFDQSxFQUFFQTt3QkFDcEVBLE9BQU9BLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEdBQUNBLE9BQU9BLENBQUNBLENBQUNBLEdBQUNBLEVBQUVBO3dCQUNuRUEsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsR0FBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7d0JBQzVFQSxRQUFRQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxHQUFDQSxFQUFFQTt3QkFDeERBLFFBQVFBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEdBQUNBLEVBQUVBO3FCQUV4REEsS0FBTUE7d0JBQ05BLFNBQVNBO3dCQUNUQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQTt3QkFDcEJBLFNBQVNBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUVBLEtBQUtBLEdBQUdBLE1BQU1BLEdBQUdBLEtBQUtBO3dCQUMxREEsU0FBU0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBRUEsS0FBS0EsR0FBR0EsS0FBS0EsR0FBR0EsTUFBTUE7O3dCQUMxREEsU0FBU0E7d0JBQ1RBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLE9BQU9BO3dCQUMxQkEsT0FBT0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBQ0EsT0FBT0E7d0JBQ2xDQSxPQUFPQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQSxHQUFDQSxPQUFPQTs7d0JBQ2xDQSxVQUFVQTt3QkFDVkEsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsR0FBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0E7d0JBQzlDQSxRQUFRQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTt3QkFDeEJBLFFBQVFBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBO3FCQUN4QkE7O29CQUVEQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFFQTt3QkFDbkJBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLENBQUNBO3dCQUMxQ0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7d0JBQzlDQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTt3QkFDcERBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBOzt3QkFFaERBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLENBQUVBOzRCQUN6QkEsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsVUFBVUEsQ0FBQ0E7NEJBQ3hDQSxTQUFTQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQTs0QkFDaERBLFNBQVNBLENBQUNBLEtBQUtBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBOzs0QkFFaERBLE9BQU9BLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOzRCQUN2QkEsT0FBT0EsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7NEJBQ3ZCQSxPQUFPQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTt5QkFFdkJBLE1BQU1BLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUVBOzRCQUNsQkEsT0FBT0EsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7NEJBQ3ZCQSxPQUFPQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTs0QkFDdkJBLE9BQU9BLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO3lCQUV2QkEsS0FBTUE7NEJBQ05BLE9BQU9BLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOzRCQUN2QkEsT0FBT0EsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7NEJBQ3ZCQSxPQUFPQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTs0QkFDdkJBLE9BQU9BLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOzRCQUN2QkEsT0FBT0EsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7NEJBQ3ZCQSxPQUFPQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTt5QkFDdkJBO3FCQUNEQTs7b0JBRURBLEtBQUtBLElBQUlBLENBQUNBO2lCQUNWQTthQUNEQTs7WUFFREEsZ0NBQWdDQTtZQUNoQ0EsZ0JBQWdCQSxDQUFDQSxhQUFhQSxDQUFDQSxPQUFPQSxDQUFDQTs7WUFFdkNBLGdCQUFnQkEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7WUFDM0NBLGdCQUFnQkEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxPQUFPQSxDQUFDQTtZQUM3Q0EsZ0JBQWdCQSxDQUFDQSxvQkFBb0JBLENBQUNBLFFBQVFBLENBQUNBO1NBRS9DQSxNQUFNQSxJQUFJQSxZQUFZQSxJQUFJQSxpQkFBaUJBLENBQUVBO1lBQzdDQSxNQUFNQTtTQUNOQTtJQUNGQSxDQUFDQTs7SUFLREY7O01BREdBO2tEQUNIQSxVQUFrQkEsTUFBc0JBLEVBQUVBLFlBQW1CQTtRQUU1REcsSUFBSUEsQ0FBQ0EsRUFBU0EsQ0FBQ0E7UUFDZkEsSUFBSUEsR0FBR0E7O1FBR1BBLElBQUlBLFlBQVlBLElBQUlBLHFCQUFxQkEsQ0FBRUE7WUFFMUNBLElBQUlBLGdCQUFnQkEsR0FBNkNBLE1BQU1BOztZQUV2RUEsaURBQWlEQTtZQUNqREEsSUFBSUEsZ0JBQWdCQSxDQUFDQSxHQUFHQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxJQUFJQSxnQkFBZ0JBLENBQUNBLFdBQVdBLENBQUVBO2dCQUM5RUEsR0FBR0EsR0FBR0EsZ0JBQWdCQSxDQUFDQSxHQUFHQTthQUMxQkEsS0FBTUE7Z0JBQ05BLEdBQUdBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLElBQUlBLENBQUNBLFlBQVlBLEdBQUNBLENBQUNBLENBQUNBO2FBQzVDQTs7WUFFREEsNkJBQTZCQTtZQUM3QkEsSUFBSUEsS0FBS0EsR0FBVUEsQ0FBQ0E7O1lBR3BCQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDdENBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUVBO29CQUN0Q0Esb0JBQW9CQTtvQkFDcEJBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLEdBQUdBLENBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUVBLEdBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUE7b0JBQzVEQSxHQUFHQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFFQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFFQSxHQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BO2lCQUM1REE7YUFDREE7O1lBRURBLGdDQUFnQ0E7WUFDaENBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FFL0JBLE1BQU1BLElBQUlBLFlBQVlBLElBQUlBLGlCQUFpQkEsQ0FBRUE7WUFDN0NBLG9CQUFvQkE7U0FDcEJBO0lBQ0ZBLENBQUNBO0lBQ0ZILDhCQUFDQTtBQUFEQSxDQUFDQSxFQTlSb0MsbUJBQW1CLEVBOFJ2RDs7QUFFRCx1Q0FBZ0MsQ0FBQSIsImZpbGUiOiJwcmVmYWJzL1ByaW1pdGl2ZUNhcHN1bGVQcmVmYWIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTGluZVN1Ykdlb21ldHJ5XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaW5lU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgU3ViR2VvbWV0cnlCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9TdWJHZW9tZXRyeUJhc2VcIik7XG5pbXBvcnQgVHJpYW5nbGVTdWJHZW9tZXRyeVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1RyaWFuZ2xlU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFByaW1pdGl2ZVByZWZhYkJhc2VcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3ByZWZhYnMvUHJpbWl0aXZlUHJlZmFiQmFzZVwiKTtcblxuLyoqXG4gKiBBIENhcHN1bGUgcHJpbWl0aXZlIG1lc2guXG4gKi9cbmNsYXNzIFByaW1pdGl2ZUNhcHN1bGVQcmVmYWIgZXh0ZW5kcyBQcmltaXRpdmVQcmVmYWJCYXNlIGltcGxlbWVudHMgSUFzc2V0XG57XG5cdHByaXZhdGUgX3JhZGl1czpudW1iZXI7XG5cdHByaXZhdGUgX2hlaWdodDpudW1iZXI7XG5cdHByaXZhdGUgX3NlZ21lbnRzVzpudW1iZXI7XG5cdHByaXZhdGUgX3NlZ21lbnRzSDpudW1iZXI7XG5cdHByaXZhdGUgX3lVcDpib29sZWFuO1xuXHRwcml2YXRlIF9udW1WZXJ0aWNlczpudW1iZXIgPSAwO1xuXG5cdC8qKlxuXHQgKiBUaGUgcmFkaXVzIG9mIHRoZSBjYXBzdWxlLlxuXHQgKi9cblx0cHVibGljIGdldCByYWRpdXMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9yYWRpdXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHJhZGl1cyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9yYWRpdXMgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgaGVpZ2h0IG9mIHRoZSBjYXBzdWxlLlxuXHQgKi9cblx0cHVibGljIGdldCBoZWlnaHQoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9oZWlnaHQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGhlaWdodCh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9oZWlnaHQgPSB2YWx1ZTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGhvcml6b250YWwgc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjYXBzdWxlLiBEZWZhdWx0cyB0byAxNi5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2VnbWVudHNXKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VnbWVudHNXO1xuXHR9XG5cblx0cHVibGljIHNldCBzZWdtZW50c1codmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fc2VnbWVudHNXID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdFx0dGhpcy5fcEludmFsaWRhdGVVVnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgdmVydGljYWwgc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjYXBzdWxlLiBEZWZhdWx0cyB0byAxNS4gTXVzdCBiZSB1bmV2ZW4uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNlZ21lbnRzSCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NlZ21lbnRzSDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2VnbWVudHNIKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3NlZ21lbnRzSCA9ICh2YWx1ZSUyID09IDApPyB2YWx1ZSArIDEgOiB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZVVWcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgY2Fwc3VsZSBwb2xlcyBzaG91bGQgbGF5IG9uIHRoZSBZLWF4aXMgKHRydWUpIG9yIG9uIHRoZSBaLWF4aXMgKGZhbHNlKS5cblx0ICovXG5cdHB1YmxpYyBnZXQgeVVwKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3lVcDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgeVVwKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHR0aGlzLl95VXAgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IENhcHN1bGUgb2JqZWN0LlxuXHQgKiBAcGFyYW0gcmFkaXVzIFRoZSByYWRpdXMgb2YgdGhlIGNhcHN1bGUuXG5cdCAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgY2Fwc3VsZS5cblx0ICogQHBhcmFtIHNlZ21lbnRzVyBEZWZpbmVzIHRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGNhcHN1bGUuIERlZmF1bHRzIHRvIDE2LlxuXHQgKiBAcGFyYW0gc2VnbWVudHNIIERlZmluZXMgdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGNhcHN1bGUuIERlZmF1bHRzIHRvIDE1LiBNdXN0IGJlIHVuZXZlbiB2YWx1ZS5cblx0ICogQHBhcmFtIHlVcCBEZWZpbmVzIHdoZXRoZXIgdGhlIGNhcHN1bGUgcG9sZXMgc2hvdWxkIGxheSBvbiB0aGUgWS1heGlzICh0cnVlKSBvciBvbiB0aGUgWi1heGlzIChmYWxzZSkuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihyYWRpdXM6bnVtYmVyID0gNTAsIGhlaWdodDpudW1iZXIgPSAxMDAsIHNlZ21lbnRzVzpudW1iZXIgPSAxNiwgc2VnbWVudHNIOm51bWJlciA9IDE1LCB5VXA6Ym9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fcmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMuX2hlaWdodCA9IGhlaWdodDtcblx0XHR0aGlzLl9zZWdtZW50c1cgPSBzZWdtZW50c1c7XG5cdFx0dGhpcy5fc2VnbWVudHNIID0gKHNlZ21lbnRzSCUyID09IDApPyBzZWdtZW50c0ggKyAxIDogc2VnbWVudHNIO1xuXHRcdHRoaXMuX3lVcCA9IHlVcDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIF9wQnVpbGRHZW9tZXRyeSh0YXJnZXQ6U3ViR2VvbWV0cnlCYXNlLCBnZW9tZXRyeVR5cGU6c3RyaW5nKVxuXHR7XG5cdFx0dmFyIGluZGljZXM6QXJyYXk8bnVtYmVyPiAvKnVpbnQqLztcblx0XHR2YXIgcG9zaXRpb25zOkFycmF5PG51bWJlcj47XG5cdFx0dmFyIG5vcm1hbHM6QXJyYXk8bnVtYmVyPjtcblx0XHR2YXIgdGFuZ2VudHM6QXJyYXk8bnVtYmVyPjtcblxuXHRcdHZhciBpOm51bWJlcjtcblx0XHR2YXIgajpudW1iZXI7XG5cdFx0dmFyIHRyaUluZGV4Om51bWJlciA9IDA7XG5cdFx0dmFyIGluZGV4Om51bWJlciA9IDA7XG5cdFx0dmFyIHN0YXJ0SW5kZXg6bnVtYmVyO1xuXHRcdHZhciBjb21wMTpudW1iZXIsIGNvbXAyOm51bWJlciwgdDE6bnVtYmVyLCB0MjpudW1iZXI7XG5cdFx0dmFyIG51bUluZGljZXM6bnVtYmVyID0gMDtcblxuXHRcdGlmIChnZW9tZXRyeVR5cGUgPT0gXCJ0cmlhbmdsZVN1Ykdlb21ldHJ5XCIpIHtcblxuXHRcdFx0dmFyIHRyaWFuZ2xlR2VvbWV0cnk6VHJpYW5nbGVTdWJHZW9tZXRyeSA9IDxUcmlhbmdsZVN1Ykdlb21ldHJ5PiB0YXJnZXQ7XG5cblx0XHRcdC8vIGV2YWx1YXRlIHRhcmdldCBudW1iZXIgb2YgdmVydGljZXMsIHRyaWFuZ2xlcyBhbmQgaW5kaWNlc1xuXHRcdFx0dGhpcy5fbnVtVmVydGljZXMgPSAodGhpcy5fc2VnbWVudHNIICsgMSkqKHRoaXMuX3NlZ21lbnRzVyArIDEpOyAvLyBzZWdtZW50c0ggKyAxIGJlY2F1c2Ugb2YgY2xvc3VyZSwgc2VnbWVudHNXICsgMSBiZWNhdXNlIG9mIGNsb3N1cmVcblx0XHRcdG51bUluZGljZXMgPSAodGhpcy5fc2VnbWVudHNIIC0gMSkqdGhpcy5fc2VnbWVudHNXKjY7IC8vIGVhY2ggbGV2ZWwgaGFzIHNlZ21lbnRIIHF1YWRzLCBlYWNoIG9mIDIgdHJpYW5nbGVzXG5cblx0XHRcdC8vIG5lZWQgdG8gaW5pdGlhbGl6ZSByYXcgYXJyYXlzIG9yIGNhbiBiZSByZXVzZWQ/XG5cdFx0XHRpZiAodGhpcy5fbnVtVmVydGljZXMgPT0gdHJpYW5nbGVHZW9tZXRyeS5udW1WZXJ0aWNlcykge1xuXHRcdFx0XHRpbmRpY2VzID0gdHJpYW5nbGVHZW9tZXRyeS5pbmRpY2VzO1xuXHRcdFx0XHRwb3NpdGlvbnMgPSB0cmlhbmdsZUdlb21ldHJ5LnBvc2l0aW9ucztcblx0XHRcdFx0bm9ybWFscyA9IHRyaWFuZ2xlR2VvbWV0cnkudmVydGV4Tm9ybWFscztcblx0XHRcdFx0dGFuZ2VudHMgPSB0cmlhbmdsZUdlb21ldHJ5LnZlcnRleFRhbmdlbnRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5kaWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KG51bUluZGljZXMpXG5cdFx0XHRcdHBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KHRoaXMuX251bVZlcnRpY2VzKjMpO1xuXHRcdFx0XHRub3JtYWxzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5fbnVtVmVydGljZXMqMyk7XG5cdFx0XHRcdHRhbmdlbnRzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5fbnVtVmVydGljZXMqMyk7XG5cblx0XHRcdFx0dGhpcy5fcEludmFsaWRhdGVVVnMoKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9zZWdtZW50c0g7ICsraikge1xuXG5cdFx0XHRcdHZhciBob3JhbmdsZTpudW1iZXIgPSBNYXRoLlBJKmovdGhpcy5fc2VnbWVudHNIO1xuXHRcdFx0XHR2YXIgejpudW1iZXIgPSAtdGhpcy5fcmFkaXVzKk1hdGguY29zKGhvcmFuZ2xlKTtcblx0XHRcdFx0dmFyIHJpbmdyYWRpdXM6bnVtYmVyID0gdGhpcy5fcmFkaXVzKk1hdGguc2luKGhvcmFuZ2xlKTtcblxuXHRcdFx0XHRzdGFydEluZGV4ID0gaW5kZXg7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9zZWdtZW50c1c7ICsraSkge1xuXHRcdFx0XHRcdHZhciB2ZXJhbmdsZTpudW1iZXIgPSAyKk1hdGguUEkqaS90aGlzLl9zZWdtZW50c1c7XG5cdFx0XHRcdFx0dmFyIHg6bnVtYmVyID0gcmluZ3JhZGl1cypNYXRoLmNvcyh2ZXJhbmdsZSk7XG5cdFx0XHRcdFx0dmFyIG9mZnNldDpudW1iZXIgPSBqID4gdGhpcy5fc2VnbWVudHNILzI/IHRoaXMuX2hlaWdodC8yIDogLXRoaXMuX2hlaWdodC8yO1xuXHRcdFx0XHRcdHZhciB5Om51bWJlciA9IHJpbmdyYWRpdXMqTWF0aC5zaW4odmVyYW5nbGUpO1xuXHRcdFx0XHRcdHZhciBub3JtTGVuOm51bWJlciA9IDEvTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7XG5cdFx0XHRcdFx0dmFyIHRhbkxlbjpudW1iZXIgPSBNYXRoLnNxcnQoeSp5ICsgeCp4KTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLl95VXApIHtcblx0XHRcdFx0XHRcdHQxID0gMDtcblx0XHRcdFx0XHRcdHQyID0gdGFuTGVuID4gLjAwNz8geC90YW5MZW4gOiAwO1xuXHRcdFx0XHRcdFx0Y29tcDEgPSAtejtcblx0XHRcdFx0XHRcdGNvbXAyID0geTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0MSA9IHRhbkxlbiA+IC4wMDc/IHgvdGFuTGVuIDogMDtcblx0XHRcdFx0XHRcdHQyID0gMDtcblx0XHRcdFx0XHRcdGNvbXAxID0geTtcblx0XHRcdFx0XHRcdGNvbXAyID0gejtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaSA9PSB0aGlzLl9zZWdtZW50c1cpIHtcblxuXHRcdFx0XHRcdFx0cG9zaXRpb25zW2luZGV4XSA9IHBvc2l0aW9uc1tzdGFydEluZGV4XTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1tpbmRleCArIDFdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXggKyAxXTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1tpbmRleCArIDJdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXggKyAyXTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbaW5kZXhdID0gKG5vcm1hbHNbc3RhcnRJbmRleF0gKyAoeCpub3JtTGVuKSkqLjU7XG5cdFx0XHRcdFx0XHRub3JtYWxzW2luZGV4ICsgMV0gPSAobm9ybWFsc1tzdGFydEluZGV4ICsgMV0gKyAoIGNvbXAxKm5vcm1MZW4pKSouNTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbaW5kZXggKyAyXSA9IChub3JtYWxzW3N0YXJ0SW5kZXggKyAyXSArIChjb21wMipub3JtTGVuKSkqLjU7XG5cdFx0XHRcdFx0XHR0YW5nZW50c1tpbmRleF0gPSAodGFuZ2VudHNbc3RhcnRJbmRleF0gKyAodGFuTGVuID4gLjAwNz8gLXkvdGFuTGVuIDogMSkpKi41O1xuXHRcdFx0XHRcdFx0dGFuZ2VudHNbaW5kZXggKyAxXSA9ICh0YW5nZW50c1tzdGFydEluZGV4ICsgMV0gKyB0MSkqLjU7XG5cdFx0XHRcdFx0XHR0YW5nZW50c1tpbmRleCArIDJdID0gKHRhbmdlbnRzW3N0YXJ0SW5kZXggKyAyXSArIHQyKSouNTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHQvLyB2ZXJ0ZXhcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1tpbmRleF0gPSB4O1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW2luZGV4ICsgMV0gPSAodGhpcy5feVVwKT8gY29tcDEgLSBvZmZzZXQgOiBjb21wMTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1tpbmRleCArIDJdID0gKHRoaXMuX3lVcCk/IGNvbXAyIDogY29tcDIgKyBvZmZzZXQ7XG5cdFx0XHRcdFx0XHQvLyBub3JtYWxcblx0XHRcdFx0XHRcdG5vcm1hbHNbaW5kZXhdID0geCpub3JtTGVuO1xuXHRcdFx0XHRcdFx0bm9ybWFsc1tpbmRleCArIDFdID0gY29tcDEqbm9ybUxlbjtcblx0XHRcdFx0XHRcdG5vcm1hbHNbaW5kZXggKyAyXSA9IGNvbXAyKm5vcm1MZW47XG5cdFx0XHRcdFx0XHQvLyB0YW5nZW50XG5cdFx0XHRcdFx0XHR0YW5nZW50c1tpbmRleF0gPSB0YW5MZW4gPiAuMDA3PyAteS90YW5MZW4gOiAxO1xuXHRcdFx0XHRcdFx0dGFuZ2VudHNbaW5kZXggKyAxXSA9IHQxO1xuXHRcdFx0XHRcdFx0dGFuZ2VudHNbaW5kZXggKyAyXSA9IHQyO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChpID4gMCAmJiBqID4gMCkge1xuXHRcdFx0XHRcdFx0dmFyIGE6bnVtYmVyID0gKHRoaXMuX3NlZ21lbnRzVyArIDEpKmogKyBpO1xuXHRcdFx0XHRcdFx0dmFyIGI6bnVtYmVyID0gKHRoaXMuX3NlZ21lbnRzVyArIDEpKmogKyBpIC0gMTtcblx0XHRcdFx0XHRcdHZhciBjOm51bWJlciA9ICh0aGlzLl9zZWdtZW50c1cgKyAxKSooaiAtIDEpICsgaSAtIDE7XG5cdFx0XHRcdFx0XHR2YXIgZDpudW1iZXIgPSAodGhpcy5fc2VnbWVudHNXICsgMSkqKGogLSAxKSArIGk7XG5cblx0XHRcdFx0XHRcdGlmIChqID09IHRoaXMuX3NlZ21lbnRzSCkge1xuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbnNbaW5kZXhdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXhdO1xuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbnNbaW5kZXggKyAxXSA9IHBvc2l0aW9uc1tzdGFydEluZGV4ICsgMV07XG5cdFx0XHRcdFx0XHRcdHBvc2l0aW9uc1tpbmRleCArIDJdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXggKyAyXTtcblxuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW3RyaUluZGV4KytdID0gYTtcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1t0cmlJbmRleCsrXSA9IGM7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbdHJpSW5kZXgrK10gPSBkO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGogPT0gMSkge1xuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW3RyaUluZGV4KytdID0gYTtcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1t0cmlJbmRleCsrXSA9IGI7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbdHJpSW5kZXgrK10gPSBjO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW3RyaUluZGV4KytdID0gYTtcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1t0cmlJbmRleCsrXSA9IGI7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbdHJpSW5kZXgrK10gPSBjO1xuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW3RyaUluZGV4KytdID0gYTtcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1t0cmlJbmRleCsrXSA9IGM7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbdHJpSW5kZXgrK10gPSBkO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGluZGV4ICs9IDM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gYnVpbGQgcmVhbCBkYXRhIGZyb20gcmF3IGRhdGFcblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlSW5kaWNlcyhpbmRpY2VzKTtcblxuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVQb3NpdGlvbnMocG9zaXRpb25zKTtcblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlVmVydGV4Tm9ybWFscyhub3JtYWxzKTtcblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlVmVydGV4VGFuZ2VudHModGFuZ2VudHMpO1xuXG5cdFx0fSBlbHNlIGlmIChnZW9tZXRyeVR5cGUgPT0gXCJsaW5lU3ViR2VvbWV0cnlcIikge1xuXHRcdFx0Ly9UT0RPXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgX3BCdWlsZFVWcyh0YXJnZXQ6U3ViR2VvbWV0cnlCYXNlLCBnZW9tZXRyeVR5cGU6c3RyaW5nKVxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyLCBqOm51bWJlcjtcblx0XHR2YXIgdXZzOkFycmF5PG51bWJlcj47XG5cblxuXHRcdGlmIChnZW9tZXRyeVR5cGUgPT0gXCJ0cmlhbmdsZVN1Ykdlb21ldHJ5XCIpIHtcblxuXHRcdFx0dmFyIHRyaWFuZ2xlR2VvbWV0cnk6VHJpYW5nbGVTdWJHZW9tZXRyeSA9IDxUcmlhbmdsZVN1Ykdlb21ldHJ5PiB0YXJnZXQ7XG5cblx0XHRcdC8vIG5lZWQgdG8gaW5pdGlhbGl6ZSByYXcgYXJyYXkgb3IgY2FuIGJlIHJldXNlZD9cblx0XHRcdGlmICh0cmlhbmdsZUdlb21ldHJ5LnV2cyAmJiB0aGlzLl9udW1WZXJ0aWNlcyA9PSB0cmlhbmdsZUdlb21ldHJ5Lm51bVZlcnRpY2VzKSB7XG5cdFx0XHRcdHV2cyA9IHRyaWFuZ2xlR2VvbWV0cnkudXZzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXZzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5fbnVtVmVydGljZXMqMik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGN1cnJlbnQgdXYgY29tcG9uZW50IGluZGV4XG5cdFx0XHR2YXIgaW5kZXg6bnVtYmVyID0gMDtcblxuXHRcdFx0Ly8gc3VyZmFjZVxuXHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9zZWdtZW50c0g7ICsraikge1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDw9IHRoaXMuX3NlZ21lbnRzVzsgKytpKSB7XG5cdFx0XHRcdFx0Ly8gcmV2b2x1dGlvbiB2ZXJ0ZXhcblx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSAoIGkvdGhpcy5fc2VnbWVudHNXICkqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVU7XG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0gKCBqL3RoaXMuX3NlZ21lbnRzSCApKnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVWO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGJ1aWxkIHJlYWwgZGF0YSBmcm9tIHJhdyBkYXRhXG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZVVWcyh1dnMpO1xuXG5cdFx0fSBlbHNlIGlmIChnZW9tZXRyeVR5cGUgPT0gXCJsaW5lU3ViR2VvbWV0cnlcIikge1xuXHRcdFx0Ly9ub3RoaW5nIHRvIGRvIGhlcmVcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0ID0gUHJpbWl0aXZlQ2Fwc3VsZVByZWZhYjsiXX0= \ No newline at end of file diff --git a/lib/prefabs/PrimitiveCapsulePrefab.ts b/lib/prefabs/PrimitiveCapsulePrefab.ts new file mode 100644 index 00000000..b415c7f1 --- /dev/null +++ b/lib/prefabs/PrimitiveCapsulePrefab.ts @@ -0,0 +1,298 @@ +import LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** + * A Capsule primitive mesh. + */ +class PrimitiveCapsulePrefab extends PrimitivePrefabBase implements IAsset +{ + private _radius:number; + private _height:number; + private _segmentsW:number; + private _segmentsH:number; + private _yUp:boolean; + private _numVertices:number = 0; + + /** + * The radius of the capsule. + */ + public get radius():number + { + return this._radius; + } + + public set radius(value:number) + { + this._radius = value; + + this._pInvalidateGeometry(); + } + + /** + * The height of the capsule. + */ + public get height():number + { + return this._height; + } + + public set height(value:number) + { + this._height = value; + this._pInvalidateGeometry(); + } + + /** + * Defines the number of horizontal segments that make up the capsule. Defaults to 16. + */ + public get segmentsW():number + { + return this._segmentsW; + } + + public set segmentsW(value:number) + { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven. + */ + public get segmentsH():number + { + return this._segmentsH; + } + + public set segmentsH(value:number) + { + this._segmentsH = (value%2 == 0)? value + 1 : value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + public get yUp():boolean + { + return this._yUp; + } + + public set yUp(value:boolean) + { + this._yUp = value; + + this._pInvalidateGeometry(); + } + + /** + * Creates a new Capsule object. + * @param radius The radius of the capsule. + * @param height The height of the capsule. + * @param segmentsW Defines the number of horizontal segments that make up the capsule. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven value. + * @param yUp Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 15, yUp:boolean = true) + { + super(); + + this._radius = radius; + this._height = height; + this._segmentsW = segmentsW; + this._segmentsH = (segmentsH%2 == 0)? segmentsH + 1 : segmentsH; + this._yUp = yUp; + } + + /** + * @inheritDoc + */ + public _pBuildGeometry(target:SubGeometryBase, geometryType:string) + { + var indices:Array /*uint*/; + var positions:Array; + var normals:Array; + var tangents:Array; + + var i:number; + var j:number; + var triIndex:number = 0; + var index:number = 0; + var startIndex:number; + var comp1:number, comp2:number, t1:number, t2:number; + var numIndices:number = 0; + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + // evaluate target number of vertices, triangles and indices + this._numVertices = (this._segmentsH + 1)*(this._segmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of closure + numIndices = (this._segmentsH - 1)*this._segmentsW*6; // each level has segmentH quads, each of 2 triangles + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices) + positions = new Array(this._numVertices*3); + normals = new Array(this._numVertices*3); + tangents = new Array(this._numVertices*3); + + this._pInvalidateUVs(); + } + + for (j = 0; j <= this._segmentsH; ++j) { + + var horangle:number = Math.PI*j/this._segmentsH; + var z:number = -this._radius*Math.cos(horangle); + var ringradius:number = this._radius*Math.sin(horangle); + + startIndex = index; + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle:number = 2*Math.PI*i/this._segmentsW; + var x:number = ringradius*Math.cos(verangle); + var offset:number = j > this._segmentsH/2? this._height/2 : -this._height/2; + var y:number = ringradius*Math.sin(verangle); + var normLen:number = 1/Math.sqrt(x*x + y*y + z*z); + var tanLen:number = Math.sqrt(y*y + x*x); + + if (this._yUp) { + t1 = 0; + t2 = tanLen > .007? x/tanLen : 0; + comp1 = -z; + comp2 = y; + + } else { + t1 = tanLen > .007? x/tanLen : 0; + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsW) { + + positions[index] = positions[startIndex]; + positions[index + 1] = positions[startIndex + 1]; + positions[index + 2] = positions[startIndex + 2]; + normals[index] = (normals[startIndex] + (x*normLen))*.5; + normals[index + 1] = (normals[startIndex + 1] + ( comp1*normLen))*.5; + normals[index + 2] = (normals[startIndex + 2] + (comp2*normLen))*.5; + tangents[index] = (tangents[startIndex] + (tanLen > .007? -y/tanLen : 1))*.5; + tangents[index + 1] = (tangents[startIndex + 1] + t1)*.5; + tangents[index + 2] = (tangents[startIndex + 2] + t2)*.5; + + } else { + // vertex + positions[index] = x; + positions[index + 1] = (this._yUp)? comp1 - offset : comp1; + positions[index + 2] = (this._yUp)? comp2 : comp2 + offset; + // normal + normals[index] = x*normLen; + normals[index + 1] = comp1*normLen; + normals[index + 2] = comp2*normLen; + // tangent + tangents[index] = tanLen > .007? -y/tanLen : 1; + tangents[index + 1] = t1; + tangents[index + 2] = t2; + } + + if (i > 0 && j > 0) { + var a:number = (this._segmentsW + 1)*j + i; + var b:number = (this._segmentsW + 1)*j + i - 1; + var c:number = (this._segmentsW + 1)*(j - 1) + i - 1; + var d:number = (this._segmentsW + 1)*(j - 1) + i; + + if (j == this._segmentsH) { + positions[index] = positions[startIndex]; + positions[index + 1] = positions[startIndex + 1]; + positions[index + 2] = positions[startIndex + 2]; + + indices[triIndex++] = a; + indices[triIndex++] = c; + indices[triIndex++] = d; + + } else if (j == 1) { + indices[triIndex++] = a; + indices[triIndex++] = b; + indices[triIndex++] = c; + + } else { + indices[triIndex++] = a; + indices[triIndex++] = b; + indices[triIndex++] = c; + indices[triIndex++] = a; + indices[triIndex++] = c; + indices[triIndex++] = d; + } + } + + index += 3; + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + + } else if (geometryType == "lineSubGeometry") { + //TODO + } + } + + /** + * @inheritDoc + */ + public _pBuildUVs(target:SubGeometryBase, geometryType:string) + { + var i:number, j:number; + var uvs:Array; + + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices*2); + } + + // current uv component index + var index:number = 0; + + // surface + for (j = 0; j <= this._segmentsH; ++j) { + for (i = 0; i <= this._segmentsW; ++i) { + // revolution vertex + uvs[index++] = ( i/this._segmentsW )*triangleGeometry.scaleU; + uvs[index++] = ( j/this._segmentsH )*triangleGeometry.scaleV; + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + } +} + +export = PrimitiveCapsulePrefab; \ No newline at end of file diff --git a/lib/prefabs/PrimitiveConePrefab.js b/lib/prefabs/PrimitiveConePrefab.js new file mode 100755 index 00000000..fa1fc6fe --- /dev/null +++ b/lib/prefabs/PrimitiveConePrefab.js @@ -0,0 +1,52 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitiveCylinderPrefab = require("awayjs-core/lib/prefabs/PrimitiveCylinderPrefab"); + +/** +* A UV Cone primitive mesh. +*/ +var PrimitiveConePrefab = (function (_super) { + __extends(PrimitiveConePrefab, _super); + /** + * Creates a new Cone object. + * @param radius The radius of the bottom end of the cone + * @param height The height of the cone + * @param segmentsW Defines the number of horizontal segments that make up the cone. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the cone. Defaults to 1. + * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveConePrefab(radius, height, segmentsW, segmentsH, closed, yUp) { + if (typeof radius === "undefined") { radius = 50; } + if (typeof height === "undefined") { height = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 16; } + if (typeof segmentsH === "undefined") { segmentsH = 1; } + if (typeof closed === "undefined") { closed = true; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this, 0, radius, height, segmentsW, segmentsH, false, closed, true, yUp); + } + Object.defineProperty(PrimitiveConePrefab.prototype, "radius", { + /** + * The radius of the bottom end of the cone. + */ + get: function () { + return this._pBottomRadius; + }, + set: function (value) { + this._pBottomRadius = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + return PrimitiveConePrefab; +})(PrimitiveCylinderPrefab); + +module.exports = PrimitiveConePrefab; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlQ29uZVByZWZhYi50cyJdLCJuYW1lcyI6WyJQcmltaXRpdmVDb25lUHJlZmFiIiwiUHJpbWl0aXZlQ29uZVByZWZhYi5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0ZBQzRGOztBQUU1Rjs7RUFFRztBQUNIO0lBQWtDQSxzQ0FBdUJBO0lBMEJ4REE7Ozs7Ozs7TUFER0E7SUFDSEEsNkJBQVlBLE1BQWtCQSxFQUFFQSxNQUFtQkEsRUFBRUEsU0FBcUJBLEVBQUVBLFNBQW9CQSxFQUFFQSxNQUFxQkEsRUFBRUEsR0FBa0JBO1FBQS9IQyxxQ0FBQUEsTUFBTUEsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEscUNBQUFBLE1BQU1BLEdBQVVBLEdBQUdBO0FBQUFBLFFBQUVBLHdDQUFBQSxTQUFTQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUFFQSx3Q0FBQUEsU0FBU0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEscUNBQUFBLE1BQU1BLEdBQVdBLElBQUlBO0FBQUFBLFFBQUVBLGtDQUFBQSxHQUFHQSxHQUFXQSxJQUFJQTtBQUFBQSxRQUUxSUEsV0FBTUEsT0FBQUEsQ0FBQ0EsRUFBRUEsTUFBTUEsRUFBRUEsTUFBTUEsRUFBRUEsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsS0FBS0EsRUFBRUEsTUFBTUEsRUFBRUEsSUFBSUEsRUFBRUEsR0FBR0EsQ0FBQ0E7SUFDekVBLENBQUNBO0lBdkJERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsY0FBY0E7UUFDM0JBLENBQUNBO1FBRURBLEtBQUFBLFVBQWtCQSxLQUFZQTtZQUU3QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsS0FBS0E7O1lBRTNCQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBO1FBQzVCQSxDQUFDQTs7OztBQVBBQTtJQXFCRkEsMkJBQUNBO0FBQURBLENBQUNBLEVBOUJpQyx1QkFBdUIsRUE4QnhEOztBQUVELG9DQUE2QixDQUFBIiwiZmlsZSI6InByZWZhYnMvUHJpbWl0aXZlQ29uZVByZWZhYi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJQXNzZXRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5pbXBvcnQgUHJpbWl0aXZlQ3lsaW5kZXJQcmVmYWJcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcmVmYWJzL1ByaW1pdGl2ZUN5bGluZGVyUHJlZmFiXCIpO1xuXG4vKipcbiAqIEEgVVYgQ29uZSBwcmltaXRpdmUgbWVzaC5cbiAqL1xuY2xhc3MgUHJpbWl0aXZlQ29uZVByZWZhYiBleHRlbmRzIFByaW1pdGl2ZUN5bGluZGVyUHJlZmFiIGltcGxlbWVudHMgSUFzc2V0XG57XG5cblx0LyoqXG5cdCAqIFRoZSByYWRpdXMgb2YgdGhlIGJvdHRvbSBlbmQgb2YgdGhlIGNvbmUuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHJhZGl1cygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BCb3R0b21SYWRpdXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHJhZGl1cyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9wQm90dG9tUmFkaXVzID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBDb25lIG9iamVjdC5cblx0ICogQHBhcmFtIHJhZGl1cyBUaGUgcmFkaXVzIG9mIHRoZSBib3R0b20gZW5kIG9mIHRoZSBjb25lXG5cdCAqIEBwYXJhbSBoZWlnaHQgVGhlIGhlaWdodCBvZiB0aGUgY29uZVxuXHQgKiBAcGFyYW0gc2VnbWVudHNXIERlZmluZXMgdGhlIG51bWJlciBvZiBob3Jpem9udGFsIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgY29uZS4gRGVmYXVsdHMgdG8gMTYuXG5cdCAqIEBwYXJhbSBzZWdtZW50c0ggRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHZlcnRpY2FsIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgY29uZS4gRGVmYXVsdHMgdG8gMS5cblx0ICogQHBhcmFtIHlVcCBEZWZpbmVzIHdoZXRoZXIgdGhlIGNvbmUgcG9sZXMgc2hvdWxkIGxheSBvbiB0aGUgWS1heGlzICh0cnVlKSBvciBvbiB0aGUgWi1heGlzIChmYWxzZSkuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihyYWRpdXM6bnVtYmVyID0gNTAsIGhlaWdodDpudW1iZXIgPSAxMDAsIHNlZ21lbnRzVzpudW1iZXIgPSAxNiwgc2VnbWVudHNIOm51bWJlciA9IDEsIGNsb3NlZDpib29sZWFuID0gdHJ1ZSwgeVVwOmJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0c3VwZXIoMCwgcmFkaXVzLCBoZWlnaHQsIHNlZ21lbnRzVywgc2VnbWVudHNILCBmYWxzZSwgY2xvc2VkLCB0cnVlLCB5VXApO1xuXHR9XG59XG5cbmV4cG9ydCA9IFByaW1pdGl2ZUNvbmVQcmVmYWI7Il19 \ No newline at end of file diff --git a/lib/prefabs/PrimitiveConePrefab.ts b/lib/prefabs/PrimitiveConePrefab.ts new file mode 100644 index 00000000..48a99c90 --- /dev/null +++ b/lib/prefabs/PrimitiveConePrefab.ts @@ -0,0 +1,39 @@ +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import PrimitiveCylinderPrefab = require("awayjs-core/lib/prefabs/PrimitiveCylinderPrefab"); + +/** + * A UV Cone primitive mesh. + */ +class PrimitiveConePrefab extends PrimitiveCylinderPrefab implements IAsset +{ + + /** + * The radius of the bottom end of the cone. + */ + public get radius():number + { + return this._pBottomRadius; + } + + public set radius(value:number) + { + this._pBottomRadius = value; + + this._pInvalidateGeometry(); + } + + /** + * Creates a new Cone object. + * @param radius The radius of the bottom end of the cone + * @param height The height of the cone + * @param segmentsW Defines the number of horizontal segments that make up the cone. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the cone. Defaults to 1. + * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 1, closed:boolean = true, yUp:boolean = true) + { + super(0, radius, height, segmentsW, segmentsH, false, closed, true, yUp); + } +} + +export = PrimitiveConePrefab; \ No newline at end of file diff --git a/lib/prefabs/PrimitiveCubePrefab.js b/lib/prefabs/PrimitiveCubePrefab.js new file mode 100755 index 00000000..160772ad --- /dev/null +++ b/lib/prefabs/PrimitiveCubePrefab.js @@ -0,0 +1,672 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A Cube primitive prefab. +*/ +var PrimitiveCubePrefab = (function (_super) { + __extends(PrimitiveCubePrefab, _super); + /** + * Creates a new Cube object. + * @param width The size of the cube along its X-axis. + * @param height The size of the cube along its Y-axis. + * @param depth The size of the cube along its Z-axis. + * @param segmentsW The number of segments that make up the cube along the X-axis. + * @param segmentsH The number of segments that make up the cube along the Y-axis. + * @param segmentsD The number of segments that make up the cube along the Z-axis. + * @param tile6 The type of uv mapping to use. When true, a texture will be subdivided in a 2x3 grid, each used for a single face. When false, the entire image is mapped on each face. + */ + function PrimitiveCubePrefab(width, height, depth, segmentsW, segmentsH, segmentsD, tile6) { + if (typeof width === "undefined") { width = 100; } + if (typeof height === "undefined") { height = 100; } + if (typeof depth === "undefined") { depth = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 1; } + if (typeof segmentsH === "undefined") { segmentsH = 1; } + if (typeof segmentsD === "undefined") { segmentsD = 1; } + if (typeof tile6 === "undefined") { tile6 = true; } + _super.call(this); + + this._width = width; + this._height = height; + this._depth = depth; + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._segmentsD = segmentsD; + this._tile6 = tile6; + } + Object.defineProperty(PrimitiveCubePrefab.prototype, "width", { + /** + * The size of the cube along its X-axis. + */ + get: function () { + return this._width; + }, + set: function (value) { + this._width = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "height", { + /** + * The size of the cube along its Y-axis. + */ + get: function () { + return this._height; + }, + set: function (value) { + this._height = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "depth", { + /** + * The size of the cube along its Z-axis. + */ + get: function () { + return this._depth; + }, + set: function (value) { + this._depth = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "tile6", { + /** + * The type of uv mapping to use. When false, the entire image is mapped on each face. + * When true, a texture will be subdivided in a 3x2 grid, each used for a single face. + * Reading the tiles from left to right, top to bottom they represent the faces of the + * cube in the following order: bottom, top, back, left, front, right. This creates + * several shared edges (between the top, front, left and right faces) which simplifies + * texture painting. + */ + get: function () { + return this._tile6; + }, + set: function (value) { + this._tile6 = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsW", { + /** + * The number of segments that make up the cube along the X-axis. Defaults to 1. + */ + get: function () { + return this._segmentsW; + }, + set: function (value) { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsH", { + /** + * The number of segments that make up the cube along the Y-axis. Defaults to 1. + */ + get: function () { + return this._segmentsH; + }, + set: function (value) { + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCubePrefab.prototype, "segmentsD", { + /** + * The number of segments that make up the cube along the Z-axis. Defaults to 1. + */ + get: function () { + return this._segmentsD; + }, + set: function (value) { + this._segmentsD = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveCubePrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var tl, tr, bl, br; + var i, j, inc = 0; + + var vidx, fidx; + var hw, hh, hd; + var dw, dh, dd; + + var outer_pos; + var numIndices; + var numVertices; + + // half cube dimensions + hw = this._width / 2; + hh = this._height / 2; + hd = this._depth / 2; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + numVertices = ((this._segmentsW + 1) * (this._segmentsH + 1) + (this._segmentsW + 1) * (this._segmentsD + 1) + (this._segmentsH + 1) * (this._segmentsD + 1)) * 2; + + numIndices = ((this._segmentsW * this._segmentsH + this._segmentsW * this._segmentsD + this._segmentsH * this._segmentsD) * 12); + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(numVertices * 3); + normals = new Array(numVertices * 3); + tangents = new Array(numVertices * 3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + // Segment dimensions + dw = this._width / this._segmentsW; + dh = this._height / this._segmentsH; + dd = this._depth / this._segmentsD; + + for (i = 0; i <= this._segmentsW; i++) { + outer_pos = -hw + i * dw; + + for (j = 0; j <= this._segmentsH; j++) { + // front + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh + j * dh; + positions[vidx + 2] = -hd; + normals[vidx] = 0; + normals[vidx + 1] = 0; + normals[vidx + 2] = -1; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // back + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh + j * dh; + positions[vidx + 2] = hd; + normals[vidx] = 0; + normals[vidx + 1] = 0; + normals[vidx + 2] = 1; + tangents[vidx] = -1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i && j) { + tl = 2 * ((i - 1) * (this._segmentsH + 1) + (j - 1)); + tr = 2 * (i * (this._segmentsH + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + inc += 2 * (this._segmentsW + 1) * (this._segmentsH + 1); + + for (i = 0; i <= this._segmentsW; i++) { + outer_pos = -hw + i * dw; + + for (j = 0; j <= this._segmentsD; j++) { + // top + positions[vidx] = outer_pos; + positions[vidx + 1] = hh; + positions[vidx + 2] = -hd + j * dd; + normals[vidx] = 0; + normals[vidx + 1] = 1; + normals[vidx + 2] = 0; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // bottom + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh; + positions[vidx + 2] = -hd + j * dd; + normals[vidx] = 0; + normals[vidx + 1] = -1; + normals[vidx + 2] = 0; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i && j) { + tl = inc + 2 * ((i - 1) * (this._segmentsD + 1) + (j - 1)); + tr = inc + 2 * (i * (this._segmentsD + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + inc += 2 * (this._segmentsW + 1) * (this._segmentsD + 1); + + for (i = 0; i <= this._segmentsD; i++) { + outer_pos = hd - i * dd; + + for (j = 0; j <= this._segmentsH; j++) { + // left + positions[vidx] = -hw; + positions[vidx + 1] = -hh + j * dh; + positions[vidx + 2] = outer_pos; + normals[vidx] = -1; + normals[vidx + 1] = 0; + normals[vidx + 2] = 0; + tangents[vidx] = 0; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = -1; + vidx += 3; + + // right + positions[vidx] = hw; + positions[vidx + 1] = -hh + j * dh; + positions[vidx + 2] = outer_pos; + normals[vidx] = 1; + normals[vidx + 1] = 0; + normals[vidx + 2] = 0; + tangents[vidx] = 0; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 1; + vidx += 3; + + if (i && j) { + tl = inc + 2 * ((i - 1) * (this._segmentsH + 1) + (j - 1)); + tr = inc + 2 * (i * (this._segmentsH + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + var lineGeometry = target; + + var numSegments = this._segmentsH * 4 + this._segmentsW * 4 + this._segmentsD * 4; + var startPositions; + var endPositions; + var thickness; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments * 3); + endPositions = new Array(numSegments * 3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + for (i = 0; i < this._segmentsH; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = i * this._height / this._segmentsH - hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = i * this._height / this._segmentsH - hh; + endPositions[vidx + 2] = -hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = hh - i * this._height / this._segmentsH; + startPositions[vidx + 2] = hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh - i * this._height / this._segmentsH; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsW; ++i) { + startPositions[vidx] = i * this._width / this._segmentsW - hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = i * this._width / this._segmentsW - hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = -hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = hw - i * this._width / this._segmentsW; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd; + + endPositions[vidx] = hw - i * this._width / this._segmentsW; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsH; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = i * this._height / this._segmentsH - hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = -hw; + endPositions[vidx + 1] = i * this._height / this._segmentsH - hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = hw; + startPositions[vidx + 1] = hh - i * this._height / this._segmentsH; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh - i * this._height / this._segmentsH; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsD; ++i) { + startPositions[vidx] = hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; + + endPositions[vidx] = -hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsD; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = -hh; + endPositions[vidx + 2] = hd - i * this._depth / this._segmentsD; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = hh; + startPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = i * this._depth / this._segmentsD - hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsW; ++i) { + startPositions[vidx] = hw - i * this._width / this._segmentsW; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw - i * this._width / this._segmentsW; + endPositions[vidx + 1] = -hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = i * this._width / this._segmentsW - hw; + startPositions[vidx + 1] = hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = i * this._width / this._segmentsW - hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + }; + + /** + * @inheritDoc + */ + PrimitiveCubePrefab.prototype._pBuildUVs = function (target, geometryType) { + var i, j, index; + var uvs; + + var u_tile_dim, v_tile_dim; + var u_tile_step, v_tile_step; + var tl0u, tl0v; + var tl1u, tl1v; + var du, dv; + var numVertices; + + if (geometryType == "triangleSubGeometry") { + numVertices = ((this._segmentsW + 1) * (this._segmentsH + 1) + (this._segmentsW + 1) * (this._segmentsD + 1) + (this._segmentsH + 1) * (this._segmentsD + 1)) * 2; + + var triangleGeometry = target; + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices * 2); + } + + if (this._tile6) { + u_tile_dim = u_tile_step = 1 / 3; + v_tile_dim = v_tile_step = 1 / 2; + } else { + u_tile_dim = v_tile_dim = 1; + u_tile_step = v_tile_step = 0; + } + + // Create planes two and two, the same way that they were + // constructed in the buildGeometry() function. First calculate + // the top-left UV coordinate for both planes, and then loop + // over the points, calculating the UVs from these numbers. + // When tile6 is true, the layout is as follows: + // .-----.-----.-----. (1,1) + // | Bot | T | Bak | + // |-----+-----+-----| + // | L | F | R | + // (0,0)'-----'-----'-----' + index = 0; + + // FRONT / BACK + tl0u = 1 * u_tile_step; + tl0v = 1 * v_tile_step; + tl1u = 2 * u_tile_step; + tl1v = 0 * v_tile_step; + du = u_tile_dim / this._segmentsW; + dv = v_tile_dim / this._segmentsH; + for (i = 0; i <= this._segmentsW; i++) { + for (j = 0; j <= this._segmentsH; j++) { + uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; + uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + + uvs[index++] = (tl1u + (u_tile_dim - i * du)) * triangleGeometry.scaleU; + uvs[index++] = (tl1v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + } + } + + // TOP / BOTTOM + tl0u = 1 * u_tile_step; + tl0v = 0 * v_tile_step; + tl1u = 0 * u_tile_step; + tl1v = 0 * v_tile_step; + du = u_tile_dim / this._segmentsW; + dv = v_tile_dim / this._segmentsD; + for (i = 0; i <= this._segmentsW; i++) { + for (j = 0; j <= this._segmentsD; j++) { + uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; + uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + + uvs[index++] = (tl1u + i * du) * triangleGeometry.scaleU; + uvs[index++] = (tl1v + j * dv) * triangleGeometry.scaleV; + } + } + + // LEFT / RIGHT + tl0u = 0 * u_tile_step; + tl0v = 1 * v_tile_step; + tl1u = 2 * u_tile_step; + tl1v = 1 * v_tile_step; + du = u_tile_dim / this._segmentsD; + dv = v_tile_dim / this._segmentsH; + for (i = 0; i <= this._segmentsD; i++) { + for (j = 0; j <= this._segmentsH; j++) { + uvs[index++] = (tl0u + i * du) * triangleGeometry.scaleU; + uvs[index++] = (tl0v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + + uvs[index++] = (tl1u + (u_tile_dim - i * du)) * triangleGeometry.scaleU; + uvs[index++] = (tl1v + (v_tile_dim - j * dv)) * triangleGeometry.scaleV; + } + } + + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveCubePrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveCubePrefab; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlQ3ViZVByZWZhYi50cyJdLCJuYW1lcyI6WyJQcmltaXRpdmVDdWJlUHJlZmFiIiwiUHJpbWl0aXZlQ3ViZVByZWZhYi5jb25zdHJ1Y3RvciIsIlByaW1pdGl2ZUN1YmVQcmVmYWIuX3BCdWlsZEdlb21ldHJ5IiwiUHJpbWl0aXZlQ3ViZVByZWZhYi5fcEJ1aWxkVVZzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxnRkFJcUY7O0FBRXJGOztFQUVHO0FBQ0g7SUFBa0NBLHNDQUFtQkE7SUFxQnBEQTs7Ozs7Ozs7O01BREdBO0lBQ0hBLDZCQUFZQSxLQUFrQkEsRUFBRUEsTUFBbUJBLEVBQUVBLEtBQWtCQSxFQUFFQSxTQUFvQkEsRUFBRUEsU0FBb0JBLEVBQUVBLFNBQW9CQSxFQUFFQSxLQUFvQkE7UUFBbkpDLG9DQUFBQSxLQUFLQSxHQUFVQSxHQUFHQTtBQUFBQSxRQUFFQSxxQ0FBQUEsTUFBTUEsR0FBVUEsR0FBR0E7QUFBQUEsUUFBRUEsb0NBQUFBLEtBQUtBLEdBQVVBLEdBQUdBO0FBQUFBLFFBQUVBLHdDQUFBQSxTQUFTQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSx3Q0FBQUEsU0FBU0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLG9DQUFBQSxLQUFLQSxHQUFXQSxJQUFJQTtBQUFBQSxRQUU5SkEsV0FBTUEsS0FBQUEsQ0FBQ0E7O1FBRVBBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBO1FBQ25CQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxNQUFNQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0E7UUFDbkJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLFNBQVNBO1FBQzNCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxTQUFTQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsU0FBU0E7UUFDM0JBLElBQUlBLENB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QTs7Z0JBRXRCQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFFQTtvQkFDdENBLFFBQVFBO29CQUNSQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxTQUFTQTtvQkFDM0JBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBO29CQUNoQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7b0JBQ3pCQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDakJBLE9BQU9BLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUNyQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7b0JBQ3RCQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDbEJBLFFBQVFBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUN0QkEsUUFBUUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ3RCQSxJQUFJQSxJQUFJQSxDQUFDQTs7b0JBRVRBLE9BQU9BO29CQUNQQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxTQUFTQTtvQkFDM0JBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBO29CQUNoQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7b0JBQ3hCQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDakJBLE9BQU9BLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUNyQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ3JCQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtvQkFDbkJBLFFBQVFBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUN0QkEsUUFBUUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ3RCQSxJQUFJQSxJQUFJQSxDQUFDQTs7b0JBRVRBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUVBO3dCQUNYQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTt3QkFDaERBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO3dCQUMxQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7d0JBQ1hBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBOzt3QkFFWEEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUE7d0JBQ3BCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTt3QkFDcEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO3dCQUNwQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUE7d0JBQ3BCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTt3QkFDcEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO3dCQUNwQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7d0JBQ3hCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTt3QkFDeEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO3dCQUN4QkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7d0JBQ3hCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTt3QkFDeEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO3FCQUN4QkE7aUJBQ0RBO2FBQ0RBOztZQUVEQSxHQUFHQSxJQUFJQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQTs7WUFFcERBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUVBO2dCQUN0Q0EsU0FBU0EsR0FBR0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7O2dCQUV0QkEsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBRUE7b0JBQ3RDQSxNQUFNQTtvQkFDTkEsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsU0FBU0E7b0JBQzNCQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTtvQkFDeEJBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBO29CQUNoQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ2pCQSxPQUFPQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDckJBLE9BQU9BLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUNyQkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ2xCQSxRQUFRQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDdEJBLFFBQVFBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUN0QkEsSUFBSUEsSUFBSUEsQ0FBQ0E7O29CQUVUQSxTQUFTQTtvQkFDVEEsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsU0FBU0E7b0JBQzNCQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTtvQkFDekJBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBO29CQUNoQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ2pCQSxPQUFPQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtvQkFDdEJBLE9BQU9BLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUNyQkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ2xCQSxRQUFRQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDdEJBLFFBQVFBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUN0QkEsSUFBSUEsSUFBSUEsQ0FBQ0E7O29CQUVUQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQTt3QkFDWEEsRUFBRUEsR0FBR0EsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7d0JBQ3REQSxFQUFFQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTt3QkFDaERBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO3dCQUNYQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTs7d0JBRVhBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO3dCQUNwQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUE7d0JBQ3BCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTt3QkFDcEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO3dCQUNwQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUE7d0JBQ3BCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTt3QkFDcEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO3dCQUN4QkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7d0JBQ3hCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTt3QkFDeEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO3dCQUN4QkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7d0JBQ3hCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtxQkFDeEJBO2lCQUNEQTthQUNEQTs7WUFFREEsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1lBRXBEQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFFQTtnQkFDdENBLFNBQVNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBOztnQkFFckJBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUVBO29CQUN0Q0EsT0FBT0E7b0JBQ1BBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBO29CQUNyQkEsU0FBU0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7b0JBQzlCQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxTQUFTQTtvQkFDN0JBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO29CQUNsQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ25CQSxPQUFPQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDbkJBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBO29CQUNsQkEsUUFBUUEsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ3BCQSxRQUFRQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtvQkFDckJBLElBQUlBLElBQUlBLENBQUNBOztvQkFFVEEsUUFBUUE7b0JBQ1JBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEVBQUVBO29CQUNwQkEsU0FBU0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7b0JBQzlCQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxTQUFTQTtvQkFDN0JBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBO29CQUNqQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ25CQSxPQUFPQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDbkJBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBO29CQUNsQkEsUUFBUUEsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ3BCQSxRQUFRQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDcEJBLElBQUlBLElBQUlBLENBQUNBOztvQkFFVEEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBRUE7d0JBQ1hBLEVBQUVBLEdBQUdBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO3dCQUN0REEsRUFBRUEsR0FBR0EsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7d0JBQ2hEQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTt3QkFDWEEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7O3dCQUVYQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTt3QkFDcEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO3dCQUNwQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUE7d0JBQ3BCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTt3QkFDcEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO3dCQUNwQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUE7d0JBQ3BCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTt3QkFDeEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO3dCQUN4QkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7d0JBQ3hCQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTt3QkFDeEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO3dCQUN4QkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7cUJBQ3hCQTtpQkFDREE7YUFDREE7O1lBRURBLGdCQUFnQkEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7O1lBRXZDQSxnQkFBZ0JBLENBQUNBLGVBQWVBLENBQUNBLFNBQVNBLENBQUNBO1lBQzNDQSxnQkFBZ0JBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7WUFDN0NBLGdCQUFnQkEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUUvQ0EsTUFBTUEsSUFBSUEsWUFBWUEsSUFBSUEsaUJBQWlCQSxDQUFFQTtZQUM3Q0EsSUFBSUEsWUFBWUEsR0FBcUNBLE1BQU1BOztZQUUzREEsSUFBSUEsV0FBV0EsR0FBVUEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBQ0EsQ0FBQ0EsR0FBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBQ0EsQ0FBQ0E7WUFDbkZBLElBQUlBLGNBQWNBO1lBQ2xCQSxJQUFJQSxZQUFZQTtZQUNoQkEsSUFBSUEsU0FBU0E7O1lBRWJBLElBQUlBLFlBQVlBLENBQUNBLE9BQU9BLElBQUlBLElBQUlBLElBQUlBLFdBQVdBLElBQUlBLFlBQVlBLENBQUNBLFdBQVdBLENBQUVBO2dCQUM1RUEsY0FBY0EsR0FBR0EsWUFBWUEsQ0FBQ0EsY0FBY0E7Z0JBQzVDQSxZQUFZQSxHQUFHQSxZQUFZQSxDQUFDQSxZQUFZQTtnQkFDeENBLFNBQVNBLEdBQUdBLFlBQVlBLENBQUNBLFNBQVNBO2FBQ2xDQSxLQUFNQTtnQkFDTkEsY0FBY0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsV0FBV0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0E7Z0JBQ2pEQSxZQUFZQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxXQUFXQSxHQUFDQSxDQUFDQSxDQUFDQTtnQkFDL0NBLFNBQVNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFdBQVdBLENBQUNBO2FBQzFDQTs7WUFFREEsSUFBSUEsR0FBR0EsQ0FBQ0E7O1lBRVJBLElBQUlBLEdBQUdBLENBQUNBOztZQUdSQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDckNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBO2dCQUMxQkEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsRUFBRUE7Z0JBQzlEQSxjQUFjQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTs7Z0JBRTlCQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxFQUFFQTtnQkFDdkJBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLEVBQUVBO2dCQUM1REEsWUFBWUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7O2dCQUU1QkEsU0FBU0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O2dCQUVyQkEsSUFBSUEsSUFBSUEsQ0FBQ0E7O2dCQUVUQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTtnQkFDMUJBLGNBQWNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBO2dCQUM5REEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7O2dCQUU3QkEsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUE7Z0JBQ3ZCQSxZQUFZQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQTtnQkFDNURBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBOztnQkFFM0JBLFNBQVNBLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztnQkFFckJBLElBQUlBLElBQUlBLENBQUNBO2FBQ1RBOztZQUVEQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDckNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLEVBQUVBO2dCQUN6REEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7Z0JBQzlCQSxjQUFjQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTs7Z0JBRTlCQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxFQUFFQTtnQkFDdkRBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBO2dCQUMzQkEsWUFBWUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7O2dCQUU1QkEsU0FBU0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O2dCQUVyQkEsSUFBSUEsSUFBSUEsQ0FBQ0E7O2dCQUVUQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQTtnQkFDekRBLGNBQWNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBO2dCQUM5QkEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7O2dCQUU3QkEsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUE7Z0JBQ3ZEQSxZQUFZQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTtnQkFDM0JBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBOztnQkFFM0JBLFNBQVNBLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztnQkFFckJBLElBQUlBLElBQUlBLENBQUNBO2FBQ1RBOztZQUdEQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDckNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBO2dCQUMxQkEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsRUFBRUE7Z0JBQzlEQSxjQUFjQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTs7Z0JBRTlCQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTtnQkFDeEJBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLEVBQUVBO2dCQUM1REEsWUFBWUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7O2dCQUUzQkEsU0FBU0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O2dCQUVyQkEsSUFBSUEsSUFBSUEsQ0FBQ0E7O2dCQUVUQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxFQUFFQTtnQkFDekJBLGNBQWNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE9BQU9BLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBO2dCQUM5REEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7O2dCQUU5QkEsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUE7Z0JBQ3ZCQSxZQUFZQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQTtnQkFDNURBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBOztnQkFFM0JBLFNBQVNBLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztnQkFFckJBLElBQUlBLElBQUlBLENBQUNBO2FBQ1RBOztZQUVEQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDckNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEVBQUVBO2dCQUN6QkEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7Z0JBQzlCQSxjQUFjQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxFQUFFQTs7Z0JBRTdEQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxFQUFFQTtnQkFDdkJBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBO2dCQUMzQkEsWUFBWUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsRUFBRUE7O2dCQUUzREEsU0FBU0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O2dCQUVyQkEsSUFBSUEsSUFBSUEsQ0FBQ0E7O2dCQUVUQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTtnQkFDMUJBLGNBQWNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBO2dCQUM5QkEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUE7O2dCQUU3REEsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7Z0JBQ3hCQSxZQUFZQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTtnQkFDM0JBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBOztnQkFFM0RBLFNBQVNBLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztnQkFFckJBLElBQUlBLElBQUlBLENBQUNBO2FBQ1RBOztZQUlEQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDckNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBO2dCQUMxQkEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7Z0JBQzlCQSxjQUFjQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQTs7Z0JBRTdEQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxFQUFFQTtnQkFDdkJBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBO2dCQUM1QkEsWUFBWUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUE7O2dCQUUzREEsU0FBU0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O2dCQUVyQkEsSUFBSUEsSUFBSUEsQ0FBQ0E7O2dCQUVUQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTtnQkFDMUJBLGNBQWNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBO2dCQUM3QkEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsRUFBRUE7O2dCQUU3REEsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUE7Z0JBQ3ZCQSxZQUFZQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTtnQkFDM0JBLFlBQVlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLEVBQUVBOztnQkFFM0RBLFNBQVNBLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOztnQkFFckJBLElBQUlBLElBQUlBLENBQUNBO2FBQ1RBOztZQUVEQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDckNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBO2dCQUN6REEsY0FBY0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUE7Z0JBQzlCQSxjQUFjQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQTs7Z0JBRTlCQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFD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QUFHQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFFQSxHQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BO29CQUN0REEsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBRUEsSUFBSUEsR0FBR0EsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsZ0JBQWdCQSxDQUFDQSxNQUFNQTs7b0JBRXBFQSxHQUFHQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFFQSxJQUFJQSxHQUFHQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BO29CQUNwRUEsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBRUEsSUFBSUEsR0FBR0EsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsZ0JBQWdCQSxDQUFDQSxNQUFNQTtpQkFDcEVBO2FBQ0RBOztZQUVEQSxlQUFlQTtZQUNmQSxJQUFJQSxHQUFHQSxDQUFDQSxHQUFDQSxXQUFXQTtZQUNwQkEsSUFBSUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsV0FBV0E7WUFDcEJBLElBQUlBLEdBQUdBLENBQUNBLEdBQUNBLFdBQVdBO1lBQ3BCQSxJQUFJQSxHQUFHQSxDQUFDQSxHQUFDQSxXQUFXQTtZQUNwQkEsRUFBRUEsR0FBR0EsVUFBVUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUE7WUFDL0JBLEVBQUVBLEdBQUdBLFVBQVVBLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBO1lBQy9CQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFFQTtnQkFDdENBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUVBO29CQUN0Q0EsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBRUEsSUFBSUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsZ0JBQWdCQSxDQUFDQSxNQUFNQTtvQkFDckRBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLEdBQUdBLENBQUVBLElBQUlBLEdBQUdBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBLENBQUNBLENBQUNBLEdBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUE7O29CQUVwRUEsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBRUEsSUFBSUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsZ0JBQWdCQSxDQUFDQSxNQUFNQTtvQkFDckRBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLEdBQUdBLENBQUVBLElBQUlBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBLENBQUNBLEdBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUE7aUJBQ3JEQTthQUNEQTs7WUFFREEsZUFBZUE7WUFDZkEsSUFBSUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsV0FBV0E7WUFDcEJBLElBQUlBLEdBQUdBLENBQUNBLEdBQUNBLFdBQVdBO1lBQ3BCQSxJQUFJQSxHQUFHQSxDQUFDQSxHQUFDQSxXQUFXQTtZQUNwQkEsSUFBSUEsR0FBR0EsQ0FBQ0EsR0FBQ0EsV0FBV0E7WUFDcEJBLEVBQUVBLEdBQUdBLFVBQVVBLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBO1lBQy9CQSxFQUFFQSxHQUFHQSxVQUFVQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQTtZQUMvQkEsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBRUE7Z0JBQ3RDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFFQTtvQkFDdENBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLEdBQUdBLENBQUVBLElBQUlBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBLENBQUNBLEdBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUE7b0JBQ3JEQSxHQUFHQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFFQSxJQUFJQSxHQUFHQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BOztvQkFFcEVBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLEdBQUdBLENBQUVBLElBQUlBLEdBQUdBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLEdBQUNBLEVBQUVBLENBQUNBLENBQUNBLEdBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUE7b0JBQ3BFQSxHQUFHQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFFQSxJQUFJQSxHQUFHQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxHQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BO2lCQUNwRUE7YUFDREE7O1lBRURBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FFL0JBLE1BQU1BLElBQUlBLFlBQVlBLElBQUlBLGlCQUFpQkEsQ0FBRUE7WUFDN0NBLG9CQUFvQkE7U0FDcEJBO0lBQ0ZBLENBQUNBO0lBQ0ZILDJCQUFDQTtBQUFEQSxDQUFDQSxFQWpwQmlDLG1CQUFtQixFQWlwQnBEOztBQUVELG9DQUE2QixDQUFBIiwiZmlsZSI6InByZWZhYnMvUHJpbWl0aXZlQ3ViZVByZWZhYi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBMaW5lU3ViR2VvbWV0cnlcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0xpbmVTdWJHZW9tZXRyeVwiKTtcbmltcG9ydCBTdWJHZW9tZXRyeUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1N1Ykdlb21ldHJ5QmFzZVwiKTtcbmltcG9ydCBUcmlhbmdsZVN1Ykdlb21ldHJ5XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvVHJpYW5nbGVTdWJHZW9tZXRyeVwiKTtcbmltcG9ydCBJQXNzZXRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5pbXBvcnQgUHJpbWl0aXZlUHJlZmFiQmFzZVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcHJlZmFicy9QcmltaXRpdmVQcmVmYWJCYXNlXCIpO1xuXG4vKipcbiAqIEEgQ3ViZSBwcmltaXRpdmUgcHJlZmFiLlxuICovXG5jbGFzcyBQcmltaXRpdmVDdWJlUHJlZmFiIGV4dGVuZHMgUHJpbWl0aXZlUHJlZmFiQmFzZSBpbXBsZW1lbnRzIElBc3NldFxue1xuXHRwcml2YXRlIF93aWR0aDpudW1iZXI7XG5cdHByaXZhdGUgX2hlaWdodDpudW1iZXI7XG5cdHByaXZhdGUgX2RlcHRoOm51bWJlcjtcblx0cHJpdmF0ZSBfdGlsZTY6Ym9vbGVhbjtcblxuXHRwcml2YXRlIF9zZWdtZW50c1c6bnVtYmVyO1xuXHRwcml2YXRlIF9zZWdtZW50c0g6bnVtYmVyO1xuXHRwcml2YXRlIF9zZWdtZW50c0Q6bnVtYmVyO1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IEN1YmUgb2JqZWN0LlxuXHQgKiBAcGFyYW0gd2lkdGggVGhlIHNpemUgb2YgdGhlIGN1YmUgYWxvbmcgaXRzIFgtYXhpcy5cblx0ICogQHBhcmFtIGhlaWdodCBUaGUgc2l6ZSBvZiB0aGUgY3ViZSBhbG9uZyBpdHMgWS1heGlzLlxuXHQgKiBAcGFyYW0gZGVwdGggVGhlIHNpemUgb2YgdGhlIGN1YmUgYWxvbmcgaXRzIFotYXhpcy5cblx0ICogQHBhcmFtIHNlZ21lbnRzVyBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgY3ViZSBhbG9uZyB0aGUgWC1heGlzLlxuXHQgKiBAcGFyYW0gc2VnbWVudHNIIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjdWJlIGFsb25nIHRoZSBZLWF4aXMuXG5cdCAqIEBwYXJhbSBzZWdtZW50c0QgVGhlIG51bWJlciBvZiBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGN1YmUgYWxvbmcgdGhlIFotYXhpcy5cblx0ICogQHBhcmFtIHRpbGU2IFRoZSB0eXBlIG9mIHV2IG1hcHBpbmcgdG8gdXNlLiBXaGVuIHRydWUsIGEgdGV4dHVyZSB3aWxsIGJlIHN1YmRpdmlkZWQgaW4gYSAyeDMgZ3JpZCwgZWFjaCB1c2VkIGZvciBhIHNpbmdsZSBmYWNlLiBXaGVuIGZhbHNlLCB0aGUgZW50aXJlIGltYWdlIGlzIG1hcHBlZCBvbiBlYWNoIGZhY2UuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih3aWR0aDpudW1iZXIgPSAxMDAsIGhlaWdodDpudW1iZXIgPSAxMDAsIGRlcHRoOm51bWJlciA9IDEwMCwgc2VnbWVudHNXOm51bWJlciA9IDEsIHNlZ21lbnRzSDpudW1iZXIgPSAxLCBzZWdtZW50c0Q6bnVtYmVyID0gMSwgdGlsZTY6Ym9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fd2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0dGhpcy5fZGVwdGggPSBkZXB0aDtcblx0XHR0aGlzLl9zZWdtZW50c1cgPSBzZWdtZW50c1c7XG5cdFx0dGhpcy5fc2VnbWVudHNIID0gc2VnbWVudHNIO1xuXHRcdHRoaXMuX3NlZ21lbnRzRCA9IHNlZ21lbnRzRDtcblx0XHR0aGlzLl90aWxlNiA9IHRpbGU2O1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBzaXplIG9mIHRoZSBjdWJlIGFsb25nIGl0cyBYLWF4aXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHdpZHRoKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fd2lkdGg7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHdpZHRoKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3dpZHRoID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHNpemUgb2YgdGhlIGN1YmUgYWxvbmcgaXRzIFktYXhpcy5cblx0ICovXG5cdHB1YmxpYyBnZXQgaGVpZ2h0KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIHNldCBoZWlnaHQodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5faGVpZ2h0ID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHNpemUgb2YgdGhlIGN1YmUgYWxvbmcgaXRzIFotYXhpcy5cblx0ICovXG5cdHB1YmxpYyBnZXQgZGVwdGgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9kZXB0aDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgZGVwdGgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fZGVwdGggPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdHlwZSBvZiB1diBtYXBwaW5nIHRvIHVzZS4gV2hlbiBmYWxzZSwgdGhlIGVudGlyZSBpbWFnZSBpcyBtYXBwZWQgb24gZWFjaCBmYWNlLlxuXHQgKiBXaGVuIHRydWUsIGEgdGV4dHVyZSB3aWxsIGJlIHN1YmRpdmlkZWQgaW4gYSAzeDIgZ3JpZCwgZWFjaCB1c2VkIGZvciBhIHNpbmdsZSBmYWNlLlxuXHQgKiBSZWFkaW5nIHRoZSB0aWxlcyBmcm9tIGxlZnQgdG8gcmlnaHQsIHRvcCB0byBib3R0b20gdGhleSByZXByZXNlbnQgdGhlIGZhY2VzIG9mIHRoZVxuXHQgKiBjdWJlIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6IGJvdHRvbSwgdG9wLCBiYWNrLCBsZWZ0LCBmcm9udCwgcmlnaHQuIFRoaXMgY3JlYXRlc1xuXHQgKiBzZXZlcmFsIHNoYXJlZCBlZGdlcyAoYmV0d2VlbiB0aGUgdG9wLCBmcm9udCwgbGVmdCBhbmQgcmlnaHQgZmFjZXMpIHdoaWNoIHNpbXBsaWZpZXNcblx0ICogdGV4dHVyZSBwYWludGluZy5cblx0ICovXG5cdHB1YmxpYyBnZXQgdGlsZTYoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fdGlsZTY7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHRpbGU2KHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHR0aGlzLl90aWxlNiA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjdWJlIGFsb25nIHRoZSBYLWF4aXMuIERlZmF1bHRzIHRvIDEuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNlZ21lbnRzVygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NlZ21lbnRzVztcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2VnbWVudHNXKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3NlZ21lbnRzVyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlVVZzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGN1YmUgYWxvbmcgdGhlIFktYXhpcy4gRGVmYXVsdHMgdG8gMS5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2VnbWVudHNIKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VnbWVudHNIO1xuXHR9XG5cblx0cHVibGljIHNldCBzZWdtZW50c0godmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fc2VnbWVudHNIID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdFx0dGhpcy5fcEludmFsaWRhdGVVVnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgY3ViZSBhbG9uZyB0aGUgWi1heGlzLiBEZWZhdWx0cyB0byAxLlxuXHQgKi9cblx0cHVibGljIGdldCBzZWdtZW50c0QoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zZWdtZW50c0Q7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHNlZ21lbnRzRCh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9zZWdtZW50c0QgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZVVWcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgX3BCdWlsZEdlb21ldHJ5KHRhcmdldDpTdWJHZW9tZXRyeUJhc2UsIGdlb21ldHJ5VHlwZTpzdHJpbmcpXG5cdHtcblx0XHR2YXIgaW5kaWNlczpBcnJheTxudW1iZXI+IC8qdWludCovO1xuXHRcdHZhciBwb3NpdGlvbnM6QXJyYXk8bnVtYmVyPjtcblx0XHR2YXIgbm9ybWFsczpBcnJheTxudW1iZXI+O1xuXHRcdHZhciB0YW5nZW50czpBcnJheTxudW1iZXI+O1xuXG5cdFx0dmFyIHRsOm51bWJlciwgdHI6bnVtYmVyLCBibDpudW1iZXIsIGJyOm51bWJlcjtcblx0XHR2YXIgaTpudW1iZXIsIGo6bnVtYmVyLCBpbmM6bnVtYmVyID0gMDtcblxuXHRcdHZhciB2aWR4Om51bWJlciwgZmlkeDpudW1iZXI7IC8vIGluZGljZXNcblx0XHR2YXIgaHc6bnVtYmVyLCBoaDpudW1iZXIsIGhkOm51bWJlcjsgLy8gaGFsdmVzXG5cdFx0dmFyIGR3Om51bWJlciwgZGg6bnVtYmVyLCBkZDpudW1iZXI7IC8vIGRlbHRhc1xuXG5cdFx0dmFyIG91dGVyX3BvczpudW1iZXI7XG5cdFx0dmFyIG51bUluZGljZXM6bnVtYmVyO1xuXHRcdHZhciBudW1WZXJ0aWNlczpudW1iZXI7XG5cblx0XHQvLyBoYWxmIGN1YmUgZGltZW5zaW9uc1xuXHRcdGh3ID0gdGhpcy5fd2lkdGgvMjtcblx0XHRoaCA9IHRoaXMuX2hlaWdodC8yO1xuXHRcdGhkID0gdGhpcy5fZGVwdGgvMjtcblxuXHRcdGlmIChnZW9tZXRyeVR5cGUgPT0gXCJ0cmlhbmdsZVN1Ykdlb21ldHJ5XCIpIHtcblxuXHRcdFx0dmFyIHRyaWFuZ2xlR2VvbWV0cnk6VHJpYW5nbGVTdWJHZW9tZXRyeSA9IDxUcmlhbmdsZVN1Ykdlb21ldHJ5PiB0YXJnZXQ7XG5cblx0XHRcdG51bVZlcnRpY2VzID0gKCh0aGlzLl9zZWdtZW50c1cgKyAxKSoodGhpcy5fc2VnbWVudHNIICsgMSkgKyAodGhpcy5fc2VnbWVudHNXICsgMSkqKHRoaXMuX3NlZ21lbnRzRCArIDEpICsgKHRoaXMuX3NlZ21lbnRzSCArIDEpKih0aGlzLl9zZWdtZW50c0QgKyAxKSkqMjtcblxuXHRcdFx0bnVtSW5kaWNlcyA9ICgodGhpcy5fc2VnbWVudHNXKnRoaXMuX3NlZ21lbnRzSCArIHRoaXMuX3NlZ21lbnRzVyp0aGlzLl9zZWdtZW50c0QgKyB0aGlzLl9zZWdtZW50c0gqdGhpcy5fc2VnbWVudHNEKSoxMik7XG5cblx0XHRcdGlmIChudW1WZXJ0aWNlcyA9PSB0cmlhbmdsZUdlb21ldHJ5Lm51bVZlcnRpY2VzICYmIHRyaWFuZ2xlR2VvbWV0cnkuaW5kaWNlcyAhPSBudWxsKSB7XG5cdFx0XHRcdGluZGljZXMgPSB0cmlhbmdsZUdlb21ldHJ5LmluZGljZXM7XG5cdFx0XHRcdHBvc2l0aW9ucyA9IHRyaWFuZ2xlR2VvbWV0cnkucG9zaXRpb25zO1xuXHRcdFx0XHRub3JtYWxzID0gdHJpYW5nbGVHZW9tZXRyeS52ZXJ0ZXhOb3JtYWxzO1xuXHRcdFx0XHR0YW5nZW50cyA9IHRyaWFuZ2xlR2VvbWV0cnkudmVydGV4VGFuZ2VudHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbmRpY2VzID0gbmV3IEFycmF5PG51bWJlcj4obnVtSW5kaWNlcyk7XG5cdFx0XHRcdHBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVZlcnRpY2VzKjMpO1xuXHRcdFx0XHRub3JtYWxzID0gbmV3IEFycmF5PG51bWJlcj4obnVtVmVydGljZXMqMyk7XG5cdFx0XHRcdHRhbmdlbnRzID0gbmV3IEFycmF5PG51bWJlcj4obnVtVmVydGljZXMqMyk7XG5cblx0XHRcdFx0dGhpcy5fcEludmFsaWRhdGVVVnMoKTtcblx0XHRcdH1cblxuXHRcdFx0dmlkeCA9IDA7XG5cdFx0XHRmaWR4ID0gMDtcblxuXHRcdFx0Ly8gU2VnbWVudCBkaW1lbnNpb25zXG5cdFx0XHRkdyA9IHRoaXMuX3dpZHRoL3RoaXMuX3NlZ21lbnRzVztcblx0XHRcdGRoID0gdGhpcy5faGVpZ2h0L3RoaXMuX3NlZ21lbnRzSDtcblx0XHRcdGRkID0gdGhpcy5fZGVwdGgvdGhpcy5fc2VnbWVudHNEO1xuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDw9IHRoaXMuX3NlZ21lbnRzVzsgaSsrKSB7XG5cdFx0XHRcdG91dGVyX3BvcyA9IC1odyArIGkqZHc7XG5cblx0XHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9zZWdtZW50c0g7IGorKykge1xuXHRcdFx0XHRcdC8vIGZyb250XG5cdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHhdID0gb3V0ZXJfcG9zO1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMV0gPSAtaGggKyBqKmRoO1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMl0gPSAtaGQ7XG5cdFx0XHRcdFx0bm9ybWFsc1t2aWR4XSA9IDA7XG5cdFx0XHRcdFx0bm9ybWFsc1t2aWR4ICsgMV0gPSAwO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDJdID0gLTE7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeF0gPSAxO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAxXSA9IDA7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDJdID0gMDtcblx0XHRcdFx0XHR2aWR4ICs9IDM7XG5cblx0XHRcdFx0XHQvLyBiYWNrXG5cdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHhdID0gb3V0ZXJfcG9zO1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMV0gPSAtaGggKyBqKmRoO1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMl0gPSBoZDtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHhdID0gMDtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHggKyAxXSA9IDA7XG5cdFx0XHRcdFx0bm9ybWFsc1t2aWR4ICsgMl0gPSAxO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHhdID0gLTE7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDFdID0gMDtcblx0XHRcdFx0XHR0YW5nZW50c1t2aWR4ICsgMl0gPSAwO1xuXHRcdFx0XHRcdHZpZHggKz0gMztcblxuXHRcdFx0XHRcdGlmIChpICYmIGopIHtcblx0XHRcdFx0XHRcdHRsID0gMiooKGkgLSAxKSoodGhpcy5fc2VnbWVudHNIICsgMSkgKyAoaiAtIDEpKTtcblx0XHRcdFx0XHRcdHRyID0gMiooaSoodGhpcy5fc2VnbWVudHNIICsgMSkgKyAoaiAtIDEpKTtcblx0XHRcdFx0XHRcdGJsID0gdGwgKyAyO1xuXHRcdFx0XHRcdFx0YnIgPSB0ciArIDI7XG5cblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYmw7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBicjtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYnI7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSB0cjtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJsICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJsICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsICsgMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aW5jICs9IDIqKHRoaXMuX3NlZ21lbnRzVyArIDEpKih0aGlzLl9zZWdtZW50c0ggKyAxKTtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9zZWdtZW50c1c7IGkrKykge1xuXHRcdFx0XHRvdXRlcl9wb3MgPSAtaHcgKyBpKmR3O1xuXG5cdFx0XHRcdGZvciAoaiA9IDA7IGogPD0gdGhpcy5fc2VnbWVudHNEOyBqKyspIHtcblx0XHRcdFx0XHQvLyB0b3Bcblx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSBvdXRlcl9wb3M7XG5cdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAxXSA9IGhoO1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMl0gPSAtaGQgKyBqKmRkO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeF0gPSAwO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDFdID0gMTtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHggKyAyXSA9IDA7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeF0gPSAxO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAxXSA9IDA7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDJdID0gMDtcblx0XHRcdFx0XHR2aWR4ICs9IDM7XG5cblx0XHRcdFx0XHQvLyBib3R0b21cblx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSBvdXRlcl9wb3M7XG5cdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAxXSA9IC1oaDtcblx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDJdID0gLWhkICsgaipkZDtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHhdID0gMDtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHggKyAxXSA9IC0xO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDJdID0gMDtcblx0XHRcdFx0XHR0YW5nZW50c1t2aWR4XSA9IDE7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDFdID0gMDtcblx0XHRcdFx0XHR0YW5nZW50c1t2aWR4ICsgMl0gPSAwO1xuXHRcdFx0XHRcdHZpZHggKz0gMztcblxuXHRcdFx0XHRcdGlmIChpICYmIGopIHtcblx0XHRcdFx0XHRcdHRsID0gaW5jICsgMiooKGkgLSAxKSoodGhpcy5fc2VnbWVudHNEICsgMSkgKyAoaiAtIDEpKTtcblx0XHRcdFx0XHRcdHRyID0gaW5jICsgMiooaSoodGhpcy5fc2VnbWVudHNEICsgMSkgKyAoaiAtIDEpKTtcblx0XHRcdFx0XHRcdGJsID0gdGwgKyAyO1xuXHRcdFx0XHRcdFx0YnIgPSB0ciArIDI7XG5cblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYmw7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBicjtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYnI7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSB0cjtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJsICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJsICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsICsgMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aW5jICs9IDIqKHRoaXMuX3NlZ21lbnRzVyArIDEpKih0aGlzLl9zZWdtZW50c0QgKyAxKTtcblxuXHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9zZWdtZW50c0Q7IGkrKykge1xuXHRcdFx0XHRvdXRlcl9wb3MgPSBoZCAtIGkqZGQ7XG5cblx0XHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9zZWdtZW50c0g7IGorKykge1xuXHRcdFx0XHRcdC8vIGxlZnRcblx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSAtaHc7XG5cdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHgrMV0gPSAtaGggKyBqKmRoO1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4KzJdID0gb3V0ZXJfcG9zO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeF0gPSAtMTtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHgrMV0gPSAwO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCsyXSA9IDA7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeF0gPSAwO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHgrMV0gPSAwO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHgrMl0gPSAtMTtcblx0XHRcdFx0XHR2aWR4ICs9IDM7XG5cblx0XHRcdFx0XHQvLyByaWdodFxuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4XSA9IGh3O1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4KzFdID0gLWhoICsgaipkaDtcblx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCsyXSA9IG91dGVyX3Bvcztcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHhdID0gMTtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHgrMV0gPSAwO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCsyXSA9IDA7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeF0gPSAwO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHgrMV0gPSAwO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHgrMl0gPSAxO1xuXHRcdFx0XHRcdHZpZHggKz0gMztcblxuXHRcdFx0XHRcdGlmIChpICYmIGopIHtcblx0XHRcdFx0XHRcdHRsID0gaW5jICsgMiooKGkgLSAxKSoodGhpcy5fc2VnbWVudHNIICsgMSkgKyAoaiAtIDEpKTtcblx0XHRcdFx0XHRcdHRyID0gaW5jICsgMiooaSoodGhpcy5fc2VnbWVudHNIICsgMSkgKyAoaiAtIDEpKTtcblx0XHRcdFx0XHRcdGJsID0gdGwgKyAyO1xuXHRcdFx0XHRcdFx0YnIgPSB0ciArIDI7XG5cblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYmw7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBicjtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYnI7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSB0cjtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJsICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRyICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGJsICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IHRsICsgMTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVJbmRpY2VzKGluZGljZXMpO1xuXG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZVBvc2l0aW9ucyhwb3NpdGlvbnMpO1xuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVWZXJ0ZXhOb3JtYWxzKG5vcm1hbHMpO1xuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVWZXJ0ZXhUYW5nZW50cyh0YW5nZW50cyk7XG5cblx0XHR9IGVsc2UgaWYgKGdlb21ldHJ5VHlwZSA9PSBcImxpbmVTdWJHZW9tZXRyeVwiKSB7XG5cdFx0XHR2YXIgbGluZUdlb21ldHJ5OkxpbmVTdWJHZW9tZXRyeSA9IDxMaW5lU3ViR2VvbWV0cnk+IHRhcmdldDtcblxuXHRcdFx0dmFyIG51bVNlZ21lbnRzOm51bWJlciA9IHRoaXMuX3NlZ21lbnRzSCo0ICsgIHRoaXMuX3NlZ21lbnRzVyo0ICsgdGhpcy5fc2VnbWVudHNEKjQ7XG5cdFx0XHR2YXIgc3RhcnRQb3NpdGlvbnM6QXJyYXk8bnVtYmVyPjtcblx0XHRcdHZhciBlbmRQb3NpdGlvbnM6QXJyYXk8bnVtYmVyPjtcblx0XHRcdHZhciB0aGlja25lc3M6QXJyYXk8bnVtYmVyPjtcblxuXHRcdFx0aWYgKGxpbmVHZW9tZXRyeS5pbmRpY2VzICE9IG51bGwgJiYgbnVtU2VnbWVudHMgPT0gbGluZUdlb21ldHJ5Lm51bVNlZ21lbnRzKSB7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zID0gbGluZUdlb21ldHJ5LnN0YXJ0UG9zaXRpb25zO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnMgPSBsaW5lR2VvbWV0cnkuZW5kUG9zaXRpb25zO1xuXHRcdFx0XHR0aGlja25lc3MgPSBsaW5lR2VvbWV0cnkudGhpY2tuZXNzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnMgPSBuZXcgQXJyYXk8bnVtYmVyPihudW1TZWdtZW50cyozKTtcblx0XHRcdFx0ZW5kUG9zaXRpb25zID0gbmV3IEFycmF5PG51bWJlcj4obnVtU2VnbWVudHMqMyk7XG5cdFx0XHRcdHRoaWNrbmVzcyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVNlZ21lbnRzKTtcblx0XHRcdH1cblxuXHRcdFx0dmlkeCA9IDA7XG5cblx0XHRcdGZpZHggPSAwO1xuXG5cdFx0XHQvL2Zyb250L2JhY2sgZmFjZVxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX3NlZ21lbnRzSDsgKytpKSB7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHhdID0gLWh3O1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMV0gPSBpKnRoaXMuX2hlaWdodC90aGlzLl9zZWdtZW50c0ggLSBoaDtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDJdID0gLWhkO1xuXG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4XSA9IGh3O1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gaSp0aGlzLl9oZWlnaHQvdGhpcy5fc2VnbWVudHNIIC0gaGhcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAyXSA9IC1oZDtcblxuXHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHhdID0gLWh3O1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMV0gPSBoaCAtIGkqdGhpcy5faGVpZ2h0L3RoaXMuX3NlZ21lbnRzSDtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDJdID0gaGQ7XG5cblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHhdID0gaHc7XG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4ICsgMV0gPSBoaCAtIGkqdGhpcy5faGVpZ2h0L3RoaXMuX3NlZ21lbnRzSDtcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAyXSA9IGhkO1xuXG5cdFx0XHRcdHRoaWNrbmVzc1tmaWR4KytdID0gMTtcblxuXHRcdFx0XHR2aWR4ICs9IDM7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLl9zZWdtZW50c1c7ICsraSkge1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4XSA9IGkqdGhpcy5fd2lkdGgvdGhpcy5fc2VnbWVudHNXIC0gaHc7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAxXSA9IC1oaDtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDJdID0gLWhkO1xuXG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4XSA9IGkqdGhpcy5fd2lkdGgvdGhpcy5fc2VnbWVudHNXIC0gaHc7XG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4ICsgMV0gPSBoaDtcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAyXSA9IC1oZDtcblxuXHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHhdID0gaHcgLSBpKnRoaXMuX3dpZHRoL3RoaXMuX3NlZ21lbnRzVztcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDFdID0gLWhoO1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMl0gPSBoZDtcblxuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeF0gPSBodyAtIGkqdGhpcy5fd2lkdGgvdGhpcy5fc2VnbWVudHNXO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gaGg7XG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4ICsgMl0gPSBoZDtcblxuXHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0dmlkeCArPSAzO1xuXHRcdFx0fVxuXG5cdFx0XHQvL2xlZnQvcmlnaHQgZmFjZVxuXHRcdFx0Zm9yIChpID0gMDsgaSA8IHRoaXMuX3NlZ21lbnRzSDsgKytpKSB7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHhdID0gLWh3O1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMV0gPSBpKnRoaXMuX2hlaWdodC90aGlzLl9zZWdtZW50c0ggLSBoaDtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDJdID0gLWhkO1xuXG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4XSA9IC1odztcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAxXSA9IGkqdGhpcy5faGVpZ2h0L3RoaXMuX3NlZ21lbnRzSCAtIGhoXG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4ICsgMl0gPSBoZDtcblxuXHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHhdID0gaHc7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAxXSA9IGhoIC0gaSp0aGlzLl9oZWlnaHQvdGhpcy5fc2VnbWVudHNIO1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMl0gPSAtaGQ7XG5cblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHhdID0gaHc7XG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4ICsgMV0gPSBoaCAtIGkqdGhpcy5faGVpZ2h0L3RoaXMuX3NlZ21lbnRzSDtcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAyXSA9IGhkO1xuXG5cdFx0XHRcdHRoaWNrbmVzc1tmaWR4KytdID0gMTtcblxuXHRcdFx0XHR2aWR4ICs9IDM7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLl9zZWdtZW50c0Q7ICsraSkge1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4XSA9IGh3XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAxXSA9IC1oaDtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDJdID0gaSp0aGlzLl9kZXB0aC90aGlzLl9zZWdtZW50c0QgLSBoZDtcblxuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeF0gPSBodztcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAxXSA9IGhoO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDJdID0gaSp0aGlzLl9kZXB0aC90aGlzLl9zZWdtZW50c0QgLSBoZDtcblxuXHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHhdID0gLWh3O1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMV0gPSAtaGg7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAyXSA9IGhkIC0gaSp0aGlzLl9kZXB0aC90aGlzLl9zZWdtZW50c0Q7XG5cblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHhdID0gLWh3O1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gaGg7XG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4ICsgMl0gPSBoZCAtIGkqdGhpcy5fZGVwdGgvdGhpcy5fc2VnbWVudHNEO1xuXG5cdFx0XHRcdHRoaWNrbmVzc1tmaWR4KytdID0gMTtcblxuXHRcdFx0XHR2aWR4ICs9IDM7XG5cdFx0XHR9XG5cblxuXHRcdFx0Ly90b3AvYm90dG9tIGZhY2Vcblx0XHRcdGZvciAoaSA9IDA7IGkgPCB0aGlzLl9zZWdtZW50c0Q7ICsraSkge1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4XSA9IC1odztcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDFdID0gLWhoO1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMl0gPSBoZCAtIGkqdGhpcy5fZGVwdGgvdGhpcy5fc2VnbWVudHNEO1xuXG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4XSA9IGh3O1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gLWhoO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDJdID0gaGQgLSBpKnRoaXMuX2RlcHRoL3RoaXMuX3NlZ21lbnRzRDtcblxuXHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHhdID0gLWh3O1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMV0gPSBoaDtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDJdID0gaSp0aGlzLl9kZXB0aC90aGlzLl9zZWdtZW50c0QgLSBoZDtcblxuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeF0gPSBodztcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAxXSA9IGhoO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDJdID0gaSp0aGlzLl9kZXB0aC90aGlzLl9zZWdtZW50c0QgLSBoZDtcblxuXHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0dmlkeCArPSAzO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGkgPSAwOyBpIDwgdGhpcy5fc2VnbWVudHNXOyArK2kpIHtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeF0gPSBodyAtIGkqdGhpcy5fd2lkdGgvdGhpcy5fc2VnbWVudHNXO1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMV0gPSAtaGg7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAyXSA9IC1oZDtcblxuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeF0gPSBodyAtIGkqdGhpcy5fd2lkdGgvdGhpcy5fc2VnbWVudHNXO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gLWhoO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDJdID0gaGQ7XG5cblx0XHRcdFx0dGhpY2tuZXNzW2ZpZHgrK10gPSAxO1xuXG5cdFx0XHRcdHZpZHggKz0gMztcblxuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4XSA9IGkqdGhpcy5fd2lkdGgvdGhpcy5fc2VnbWVudHNXIC0gaHc7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAxXSA9IGhoO1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMl0gPSAtaGQ7XG5cblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHhdID0gaSp0aGlzLl93aWR0aC90aGlzLl9zZWdtZW50c1cgLSBodztcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAxXSA9IGhoO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDJdID0gaGQ7XG5cblx0XHRcdFx0dGhpY2tuZXNzW2ZpZHgrK10gPSAxO1xuXG5cdFx0XHRcdHZpZHggKz0gMztcblx0XHRcdH1cblxuXHRcdFx0Ly8gYnVpbGQgcmVhbCBkYXRhIGZyb20gcmF3IGRhdGFcblx0XHRcdGxpbmVHZW9tZXRyeS51cGRhdGVQb3NpdGlvbnMoc3RhcnRQb3NpdGlvbnMsIGVuZFBvc2l0aW9ucyk7XG5cdFx0XHRsaW5lR2VvbWV0cnkudXBkYXRlVGhpY2tuZXNzKHRoaWNrbmVzcyk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgX3BCdWlsZFVWcyh0YXJnZXQ6U3ViR2VvbWV0cnlCYXNlLCBnZW9tZXRyeVR5cGU6c3RyaW5nKVxuXHR7XG5cdFx0dmFyIGk6bnVtYmVyLCBqOm51bWJlciwgaW5kZXg6bnVtYmVyO1xuXHRcdHZhciB1dnM6QXJyYXk8bnVtYmVyPjtcblxuXHRcdHZhciB1X3RpbGVfZGltOm51bWJlciwgdl90aWxlX2RpbTpudW1iZXI7XG5cdFx0dmFyIHVfdGlsZV9zdGVwOm51bWJlciwgdl90aWxlX3N0ZXA6bnVtYmVyO1xuXHRcdHZhciB0bDB1Om51bWJlciwgdGwwdjpudW1iZXI7XG5cdFx0dmFyIHRsMXU6bnVtYmVyLCB0bDF2Om51bWJlcjtcblx0XHR2YXIgZHU6bnVtYmVyLCBkdjpudW1iZXI7XG5cdFx0dmFyIG51bVZlcnRpY2VzOm51bWJlcjtcblxuXHRcdGlmIChnZW9tZXRyeVR5cGUgPT0gXCJ0cmlhbmdsZVN1Ykdlb21ldHJ5XCIpIHtcblxuXHRcdFx0bnVtVmVydGljZXMgPSAoKHRoaXMuX3NlZ21lbnRzVyArIDEpKih0aGlzLl9zZWdtZW50c0ggKyAxKSArICh0aGlzLl9zZWdtZW50c1cgKyAxKSoodGhpcy5fc2VnbWVudHNEICsgMSkgKyAodGhpcy5fc2VnbWVudHNIICsgMSkqKHRoaXMuX3NlZ21lbnRzRCArIDEpKSoyO1xuXG5cdFx0XHR2YXIgdHJpYW5nbGVHZW9tZXRyeTpUcmlhbmdsZVN1Ykdlb21ldHJ5ID0gPFRyaWFuZ2xlU3ViR2VvbWV0cnk+IHRhcmdldDtcblxuXHRcdFx0aWYgKG51bVZlcnRpY2VzID09IHRyaWFuZ2xlR2VvbWV0cnkubnVtVmVydGljZXMgJiYgdHJpYW5nbGVHZW9tZXRyeS51dnMgIT0gbnVsbCkge1xuXHRcdFx0XHR1dnMgPSB0cmlhbmdsZUdlb21ldHJ5LnV2cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHV2cyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVZlcnRpY2VzKjIpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5fdGlsZTYpIHtcblx0XHRcdFx0dV90aWxlX2RpbSA9IHVfdGlsZV9zdGVwID0gMS8zO1xuXHRcdFx0XHR2X3RpbGVfZGltID0gdl90aWxlX3N0ZXAgPSAxLzI7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR1X3RpbGVfZGltID0gdl90aWxlX2RpbSA9IDE7XG5cdFx0XHRcdHVfdGlsZV9zdGVwID0gdl90aWxlX3N0ZXAgPSAwO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDcmVhdGUgcGxhbmVzIHR3byBhbmQgdHdvLCB0aGUgc2FtZSB3YXkgdGhhdCB0aGV5IHdlcmVcblx0XHRcdC8vIGNvbnN0cnVjdGVkIGluIHRoZSBidWlsZEdlb21ldHJ5KCkgZnVuY3Rpb24uIEZpcnN0IGNhbGN1bGF0ZVxuXHRcdFx0Ly8gdGhlIHRvcC1sZWZ0IFVWIGNvb3JkaW5hdGUgZm9yIGJvdGggcGxhbmVzLCBhbmQgdGhlbiBsb29wXG5cdFx0XHQvLyBvdmVyIHRoZSBwb2ludHMsIGNhbGN1bGF0aW5nIHRoZSBVVnMgZnJvbSB0aGVzZSBudW1iZXJzLlxuXG5cdFx0XHQvLyBXaGVuIHRpbGU2IGlzIHRydWUsIHRoZSBsYXlvdXQgaXMgYXMgZm9sbG93czpcblx0XHRcdC8vICAgICAgIC4tLS0tLS4tLS0tLS4tLS0tLS4gKDEsMSlcblx0XHRcdC8vICAgICAgIHwgQm90IHwgIFQgIHwgQmFrIHxcblx0XHRcdC8vICAgICAgIHwtLS0tLSstLS0tLSstLS0tLXxcblx0XHRcdC8vICAgICAgIHwgIEwgIHwgIEYgIHwgIFIgIHxcblx0XHRcdC8vICgwLDApJy0tLS0tJy0tLS0tJy0tLS0tJ1xuXG5cdFx0XHRpbmRleCA9IDA7XG5cblx0XHRcdC8vIEZST05UIC8gQkFDS1xuXHRcdFx0dGwwdSA9IDEqdV90aWxlX3N0ZXA7XG5cdFx0XHR0bDB2ID0gMSp2X3RpbGVfc3RlcDtcblx0XHRcdHRsMXUgPSAyKnVfdGlsZV9zdGVwO1xuXHRcdFx0dGwxdiA9IDAqdl90aWxlX3N0ZXA7XG5cdFx0XHRkdSA9IHVfdGlsZV9kaW0vdGhpcy5fc2VnbWVudHNXO1xuXHRcdFx0ZHYgPSB2X3RpbGVfZGltL3RoaXMuX3NlZ21lbnRzSDtcblx0XHRcdGZvciAoaSA9IDA7IGkgPD0gdGhpcy5fc2VnbWVudHNXOyBpKyspIHtcblx0XHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9zZWdtZW50c0g7IGorKykge1xuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9ICggdGwwdSArIGkqZHUgKSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVTtcblx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSAoIHRsMHYgKyAodl90aWxlX2RpbSAtIGoqZHYpKSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVjtcblxuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9ICggdGwxdSArICh1X3RpbGVfZGltIC0gaSpkdSkpKnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVVO1xuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9ICggdGwxdiArICh2X3RpbGVfZGltIC0gaipkdikpKnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVWO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRPUCAvIEJPVFRPTVxuXHRcdFx0dGwwdSA9IDEqdV90aWxlX3N0ZXA7XG5cdFx0XHR0bDB2ID0gMCp2X3RpbGVfc3RlcDtcblx0XHRcdHRsMXUgPSAwKnVfdGlsZV9zdGVwO1xuXHRcdFx0dGwxdiA9IDAqdl90aWxlX3N0ZXA7XG5cdFx0XHRkdSA9IHVfdGlsZV9kaW0vdGhpcy5fc2VnbWVudHNXO1xuXHRcdFx0ZHYgPSB2X3RpbGVfZGltL3RoaXMuX3NlZ21lbnRzRDtcblx0XHRcdGZvciAoaSA9IDA7IGkgPD0gdGhpcy5fc2VnbWVudHNXOyBpKyspIHtcblx0XHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9zZWdtZW50c0Q7IGorKykge1xuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9ICggdGwwdSArIGkqZHUpKnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVVO1xuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9ICggdGwwdiArICh2X3RpbGVfZGltIC0gaipkdikpKnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVWO1xuXG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0gKCB0bDF1ICsgaSpkdSkqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVU7XG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0gKCB0bDF2ICsgaipkdikqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVY7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTEVGVCAvIFJJR0hUXG5cdFx0XHR0bDB1ID0gMCp1X3RpbGVfc3RlcDtcblx0XHRcdHRsMHYgPSAxKnZfdGlsZV9zdGVwO1xuXHRcdFx0dGwxdSA9IDIqdV90aWxlX3N0ZXA7XG5cdFx0XHR0bDF2ID0gMSp2X3RpbGVfc3RlcDtcblx0XHRcdGR1ID0gdV90aWxlX2RpbS90aGlzLl9zZWdtZW50c0Q7XG5cdFx0XHRkdiA9IHZfdGlsZV9kaW0vdGhpcy5fc2VnbWVudHNIO1xuXHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9zZWdtZW50c0Q7IGkrKykge1xuXHRcdFx0XHRmb3IgKGogPSAwOyBqIDw9IHRoaXMuX3NlZ21lbnRzSDsgaisrKSB7XG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0gKCB0bDB1ICsgaSpkdSkqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVU7XG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0gKCB0bDB2ICsgKHZfdGlsZV9kaW0gLSBqKmR2KSkqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVY7XG5cblx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSAoIHRsMXUgKyAodV90aWxlX2RpbSAtIGkqZHUpKSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVTtcblx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSAoIHRsMXYgKyAodl90aWxlX2RpbSAtIGoqZHYpKSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZVVWcyh1dnMpO1xuXG5cdFx0fSBlbHNlIGlmIChnZW9tZXRyeVR5cGUgPT0gXCJsaW5lU3ViR2VvbWV0cnlcIikge1xuXHRcdFx0Ly9ub3RoaW5nIHRvIGRvIGhlcmVcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0ID0gUHJpbWl0aXZlQ3ViZVByZWZhYjsiXX0= \ No newline at end of file diff --git a/lib/prefabs/PrimitiveCubePrefab.ts b/lib/prefabs/PrimitiveCubePrefab.ts new file mode 100644 index 00000000..7ff427f2 --- /dev/null +++ b/lib/prefabs/PrimitiveCubePrefab.ts @@ -0,0 +1,669 @@ +import LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** + * A Cube primitive prefab. + */ +class PrimitiveCubePrefab extends PrimitivePrefabBase implements IAsset +{ + private _width:number; + private _height:number; + private _depth:number; + private _tile6:boolean; + + private _segmentsW:number; + private _segmentsH:number; + private _segmentsD:number; + + /** + * Creates a new Cube object. + * @param width The size of the cube along its X-axis. + * @param height The size of the cube along its Y-axis. + * @param depth The size of the cube along its Z-axis. + * @param segmentsW The number of segments that make up the cube along the X-axis. + * @param segmentsH The number of segments that make up the cube along the Y-axis. + * @param segmentsD The number of segments that make up the cube along the Z-axis. + * @param tile6 The type of uv mapping to use. When true, a texture will be subdivided in a 2x3 grid, each used for a single face. When false, the entire image is mapped on each face. + */ + constructor(width:number = 100, height:number = 100, depth:number = 100, segmentsW:number = 1, segmentsH:number = 1, segmentsD:number = 1, tile6:boolean = true) + { + super(); + + this._width = width; + this._height = height; + this._depth = depth; + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._segmentsD = segmentsD; + this._tile6 = tile6; + } + + /** + * The size of the cube along its X-axis. + */ + public get width():number + { + return this._width; + } + + public set width(value:number) + { + this._width = value; + + this._pInvalidateGeometry(); + } + + /** + * The size of the cube along its Y-axis. + */ + public get height():number + { + return this._height; + } + + public set height(value:number) + { + this._height = value; + + this._pInvalidateGeometry(); + } + + /** + * The size of the cube along its Z-axis. + */ + public get depth():number + { + return this._depth; + } + + public set depth(value:number) + { + this._depth = value; + + this._pInvalidateGeometry(); + } + + /** + * The type of uv mapping to use. When false, the entire image is mapped on each face. + * When true, a texture will be subdivided in a 3x2 grid, each used for a single face. + * Reading the tiles from left to right, top to bottom they represent the faces of the + * cube in the following order: bottom, top, back, left, front, right. This creates + * several shared edges (between the top, front, left and right faces) which simplifies + * texture painting. + */ + public get tile6():boolean + { + return this._tile6; + } + + public set tile6(value:boolean) + { + this._tile6 = value; + + this._pInvalidateGeometry(); + } + + /** + * The number of segments that make up the cube along the X-axis. Defaults to 1. + */ + public get segmentsW():number + { + return this._segmentsW; + } + + public set segmentsW(value:number) + { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * The number of segments that make up the cube along the Y-axis. Defaults to 1. + */ + public get segmentsH():number + { + return this._segmentsH; + } + + public set segmentsH(value:number) + { + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * The number of segments that make up the cube along the Z-axis. Defaults to 1. + */ + public get segmentsD():number + { + return this._segmentsD; + } + + public set segmentsD(value:number) + { + this._segmentsD = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * @inheritDoc + */ + public _pBuildGeometry(target:SubGeometryBase, geometryType:string) + { + var indices:Array /*uint*/; + var positions:Array; + var normals:Array; + var tangents:Array; + + var tl:number, tr:number, bl:number, br:number; + var i:number, j:number, inc:number = 0; + + var vidx:number, fidx:number; // indices + var hw:number, hh:number, hd:number; // halves + var dw:number, dh:number, dd:number; // deltas + + var outer_pos:number; + var numIndices:number; + var numVertices:number; + + // half cube dimensions + hw = this._width/2; + hh = this._height/2; + hd = this._depth/2; + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + numVertices = ((this._segmentsW + 1)*(this._segmentsH + 1) + (this._segmentsW + 1)*(this._segmentsD + 1) + (this._segmentsH + 1)*(this._segmentsD + 1))*2; + + numIndices = ((this._segmentsW*this._segmentsH + this._segmentsW*this._segmentsD + this._segmentsH*this._segmentsD)*12); + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(numVertices*3); + normals = new Array(numVertices*3); + tangents = new Array(numVertices*3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + // Segment dimensions + dw = this._width/this._segmentsW; + dh = this._height/this._segmentsH; + dd = this._depth/this._segmentsD; + + for (i = 0; i <= this._segmentsW; i++) { + outer_pos = -hw + i*dw; + + for (j = 0; j <= this._segmentsH; j++) { + // front + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh + j*dh; + positions[vidx + 2] = -hd; + normals[vidx] = 0; + normals[vidx + 1] = 0; + normals[vidx + 2] = -1; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // back + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh + j*dh; + positions[vidx + 2] = hd; + normals[vidx] = 0; + normals[vidx + 1] = 0; + normals[vidx + 2] = 1; + tangents[vidx] = -1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i && j) { + tl = 2*((i - 1)*(this._segmentsH + 1) + (j - 1)); + tr = 2*(i*(this._segmentsH + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + inc += 2*(this._segmentsW + 1)*(this._segmentsH + 1); + + for (i = 0; i <= this._segmentsW; i++) { + outer_pos = -hw + i*dw; + + for (j = 0; j <= this._segmentsD; j++) { + // top + positions[vidx] = outer_pos; + positions[vidx + 1] = hh; + positions[vidx + 2] = -hd + j*dd; + normals[vidx] = 0; + normals[vidx + 1] = 1; + normals[vidx + 2] = 0; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // bottom + positions[vidx] = outer_pos; + positions[vidx + 1] = -hh; + positions[vidx + 2] = -hd + j*dd; + normals[vidx] = 0; + normals[vidx + 1] = -1; + normals[vidx + 2] = 0; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i && j) { + tl = inc + 2*((i - 1)*(this._segmentsD + 1) + (j - 1)); + tr = inc + 2*(i*(this._segmentsD + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + inc += 2*(this._segmentsW + 1)*(this._segmentsD + 1); + + for (i = 0; i <= this._segmentsD; i++) { + outer_pos = hd - i*dd; + + for (j = 0; j <= this._segmentsH; j++) { + // left + positions[vidx] = -hw; + positions[vidx+1] = -hh + j*dh; + positions[vidx+2] = outer_pos; + normals[vidx] = -1; + normals[vidx+1] = 0; + normals[vidx+2] = 0; + tangents[vidx] = 0; + tangents[vidx+1] = 0; + tangents[vidx+2] = -1; + vidx += 3; + + // right + positions[vidx] = hw; + positions[vidx+1] = -hh + j*dh; + positions[vidx+2] = outer_pos; + normals[vidx] = 1; + normals[vidx+1] = 0; + normals[vidx+2] = 0; + tangents[vidx] = 0; + tangents[vidx+1] = 0; + tangents[vidx+2] = 1; + vidx += 3; + + if (i && j) { + tl = inc + 2*((i - 1)*(this._segmentsH + 1) + (j - 1)); + tr = inc + 2*(i*(this._segmentsH + 1) + (j - 1)); + bl = tl + 2; + br = tr + 2; + + indices[fidx++] = tl; + indices[fidx++] = bl; + indices[fidx++] = br; + indices[fidx++] = tl; + indices[fidx++] = br; + indices[fidx++] = tr; + indices[fidx++] = tr + 1; + indices[fidx++] = br + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tr + 1; + indices[fidx++] = bl + 1; + indices[fidx++] = tl + 1; + } + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + + } else if (geometryType == "lineSubGeometry") { + var lineGeometry:LineSubGeometry = target; + + var numSegments:number = this._segmentsH*4 + this._segmentsW*4 + this._segmentsD*4; + var startPositions:Array; + var endPositions:Array; + var thickness:Array; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments*3); + endPositions = new Array(numSegments*3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + //front/back face + for (i = 0; i < this._segmentsH; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = i*this._height/this._segmentsH - hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = i*this._height/this._segmentsH - hh + endPositions[vidx + 2] = -hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = hh - i*this._height/this._segmentsH; + startPositions[vidx + 2] = hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh - i*this._height/this._segmentsH; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsW; ++i) { + startPositions[vidx] = i*this._width/this._segmentsW - hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = i*this._width/this._segmentsW - hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = -hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = hw - i*this._width/this._segmentsW; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd; + + endPositions[vidx] = hw - i*this._width/this._segmentsW; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + //left/right face + for (i = 0; i < this._segmentsH; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = i*this._height/this._segmentsH - hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = -hw; + endPositions[vidx + 1] = i*this._height/this._segmentsH - hh + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = hw; + startPositions[vidx + 1] = hh - i*this._height/this._segmentsH; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh - i*this._height/this._segmentsH; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsD; ++i) { + startPositions[vidx] = hw + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = i*this._depth/this._segmentsD - hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = i*this._depth/this._segmentsD - hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd - i*this._depth/this._segmentsD; + + endPositions[vidx] = -hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd - i*this._depth/this._segmentsD; + + thickness[fidx++] = 1; + + vidx += 3; + } + + + //top/bottom face + for (i = 0; i < this._segmentsD; ++i) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = hd - i*this._depth/this._segmentsD; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = -hh; + endPositions[vidx + 2] = hd - i*this._depth/this._segmentsD; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = -hw; + startPositions[vidx + 1] = hh; + startPositions[vidx + 2] = i*this._depth/this._segmentsD - hd; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = i*this._depth/this._segmentsD - hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (i = 0; i < this._segmentsW; ++i) { + startPositions[vidx] = hw - i*this._width/this._segmentsW; + startPositions[vidx + 1] = -hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = hw - i*this._width/this._segmentsW; + endPositions[vidx + 1] = -hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + + startPositions[vidx] = i*this._width/this._segmentsW - hw; + startPositions[vidx + 1] = hh; + startPositions[vidx + 2] = -hd; + + endPositions[vidx] = i*this._width/this._segmentsW - hw; + endPositions[vidx + 1] = hh; + endPositions[vidx + 2] = hd; + + thickness[fidx++] = 1; + + vidx += 3; + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + } + + /** + * @inheritDoc + */ + public _pBuildUVs(target:SubGeometryBase, geometryType:string) + { + var i:number, j:number, index:number; + var uvs:Array; + + var u_tile_dim:number, v_tile_dim:number; + var u_tile_step:number, v_tile_step:number; + var tl0u:number, tl0v:number; + var tl1u:number, tl1v:number; + var du:number, dv:number; + var numVertices:number; + + if (geometryType == "triangleSubGeometry") { + + numVertices = ((this._segmentsW + 1)*(this._segmentsH + 1) + (this._segmentsW + 1)*(this._segmentsD + 1) + (this._segmentsH + 1)*(this._segmentsD + 1))*2; + + var triangleGeometry:TriangleSubGeometry = target; + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices*2); + } + + if (this._tile6) { + u_tile_dim = u_tile_step = 1/3; + v_tile_dim = v_tile_step = 1/2; + } else { + u_tile_dim = v_tile_dim = 1; + u_tile_step = v_tile_step = 0; + } + + // Create planes two and two, the same way that they were + // constructed in the buildGeometry() function. First calculate + // the top-left UV coordinate for both planes, and then loop + // over the points, calculating the UVs from these numbers. + + // When tile6 is true, the layout is as follows: + // .-----.-----.-----. (1,1) + // | Bot | T | Bak | + // |-----+-----+-----| + // | L | F | R | + // (0,0)'-----'-----'-----' + + index = 0; + + // FRONT / BACK + tl0u = 1*u_tile_step; + tl0v = 1*v_tile_step; + tl1u = 2*u_tile_step; + tl1v = 0*v_tile_step; + du = u_tile_dim/this._segmentsW; + dv = v_tile_dim/this._segmentsH; + for (i = 0; i <= this._segmentsW; i++) { + for (j = 0; j <= this._segmentsH; j++) { + uvs[index++] = ( tl0u + i*du )*triangleGeometry.scaleU; + uvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; + + uvs[index++] = ( tl1u + (u_tile_dim - i*du))*triangleGeometry.scaleU; + uvs[index++] = ( tl1v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; + } + } + + // TOP / BOTTOM + tl0u = 1*u_tile_step; + tl0v = 0*v_tile_step; + tl1u = 0*u_tile_step; + tl1v = 0*v_tile_step; + du = u_tile_dim/this._segmentsW; + dv = v_tile_dim/this._segmentsD; + for (i = 0; i <= this._segmentsW; i++) { + for (j = 0; j <= this._segmentsD; j++) { + uvs[index++] = ( tl0u + i*du)*triangleGeometry.scaleU; + uvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; + + uvs[index++] = ( tl1u + i*du)*triangleGeometry.scaleU; + uvs[index++] = ( tl1v + j*dv)*triangleGeometry.scaleV; + } + } + + // LEFT / RIGHT + tl0u = 0*u_tile_step; + tl0v = 1*v_tile_step; + tl1u = 2*u_tile_step; + tl1v = 1*v_tile_step; + du = u_tile_dim/this._segmentsD; + dv = v_tile_dim/this._segmentsH; + for (i = 0; i <= this._segmentsD; i++) { + for (j = 0; j <= this._segmentsH; j++) { + uvs[index++] = ( tl0u + i*du)*triangleGeometry.scaleU; + uvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; + + uvs[index++] = ( tl1u + (u_tile_dim - i*du))*triangleGeometry.scaleU; + uvs[index++] = ( tl1v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; + } + } + + triangleGeometry.updateUVs(uvs); + + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + } +} + +export = PrimitiveCubePrefab; \ No newline at end of file diff --git a/lib/prefabs/PrimitiveCylinderPrefab.js b/lib/prefabs/PrimitiveCylinderPrefab.js new file mode 100755 index 00000000..ce0c5dcb --- /dev/null +++ b/lib/prefabs/PrimitiveCylinderPrefab.js @@ -0,0 +1,659 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A Cylinder primitive mesh. +*/ +var PrimitiveCylinderPrefab = (function (_super) { + __extends(PrimitiveCylinderPrefab, _super); + /** + * Creates a new Cylinder object. + * @param topRadius The radius of the top end of the cylinder. + * @param bottomRadius The radius of the bottom end of the cylinder + * @param height The radius of the bottom end of the cylinder + * @param segmentsW Defines the number of horizontal segments that make up the cylinder. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the cylinder. Defaults to 1. + * @param topClosed Defines whether the top end of the cylinder is closed (true) or open. + * @param bottomClosed Defines whether the bottom end of the cylinder is closed (true) or open. + * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveCylinderPrefab(topRadius, bottomRadius, height, segmentsW, segmentsH, topClosed, bottomClosed, surfaceClosed, yUp) { + if (typeof topRadius === "undefined") { topRadius = 50; } + if (typeof bottomRadius === "undefined") { bottomRadius = 50; } + if (typeof height === "undefined") { height = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 16; } + if (typeof segmentsH === "undefined") { segmentsH = 1; } + if (typeof topClosed === "undefined") { topClosed = true; } + if (typeof bottomClosed === "undefined") { bottomClosed = true; } + if (typeof surfaceClosed === "undefined") { surfaceClosed = true; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this); + this._numVertices = 0; + + this._topRadius = topRadius; + this._pBottomRadius = bottomRadius; + this._height = height; + this._pSegmentsW = segmentsW; + this._pSegmentsH = segmentsH; + this._topClosed = topClosed; + this._bottomClosed = bottomClosed; + this._surfaceClosed = surfaceClosed; + this._yUp = yUp; + } + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "topRadius", { + /** + * The radius of the top end of the cylinder. + */ + get: function () { + return this._topRadius; + }, + set: function (value) { + this._topRadius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "bottomRadius", { + /** + * The radius of the bottom end of the cylinder. + */ + get: function () { + return this._pBottomRadius; + }, + set: function (value) { + this._pBottomRadius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "height", { + /** + * The radius of the top end of the cylinder. + */ + get: function () { + return this._height; + }, + set: function (value) { + this._height = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "segmentsW", { + /** + * Defines the number of horizontal segments that make up the cylinder. Defaults to 16. + */ + get: function () { + return this._pSegmentsW; + }, + set: function (value) { + this.setSegmentsW(value); + }, + enumerable: true, + configurable: true + }); + + + PrimitiveCylinderPrefab.prototype.setSegmentsW = function (value) { + this._pSegmentsW = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }; + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "segmentsH", { + /** + * Defines the number of vertical segments that make up the cylinder. Defaults to 1. + */ + get: function () { + return this._pSegmentsH; + }, + set: function (value) { + this.setSegmentsH(value); + }, + enumerable: true, + configurable: true + }); + + + PrimitiveCylinderPrefab.prototype.setSegmentsH = function (value) { + this._pSegmentsH = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }; + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "topClosed", { + /** + * Defines whether the top end of the cylinder is closed (true) or open. + */ + get: function () { + return this._topClosed; + }, + set: function (value) { + this._topClosed = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "bottomClosed", { + /** + * Defines whether the bottom end of the cylinder is closed (true) or open. + */ + get: function () { + return this._bottomClosed; + }, + set: function (value) { + this._bottomClosed = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveCylinderPrefab.prototype, "yUp", { + /** + * Defines whether the cylinder poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveCylinderPrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var i; + var j; + var x; + var y; + var z; + var vidx; + var fidx; + + var radius; + var revolutionAngle; + + var dr; + var latNormElev; + var latNormBase; + var numIndices = 0; + + var comp1; + var comp2; + var startIndex = 0; + var nextVertexIndex = 0; + + var t1; + var t2; + + // reset utility variables + this._numVertices = 0; + + // evaluate revolution steps + var revolutionAngleDelta = 2 * Math.PI / this._pSegmentsW; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // evaluate target number of vertices, triangles and indices + if (this._surfaceClosed) { + this._numVertices += (this._pSegmentsH + 1) * (this._pSegmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of UV unwrapping + numIndices += this._pSegmentsH * this._pSegmentsW * 6; // each level has segmentW quads, each of 2 triangles + } + if (this._topClosed) { + this._numVertices += 2 * (this._pSegmentsW + 1); // segmentsW + 1 because of unwrapping + numIndices += this._pSegmentsW * 3; // one triangle for each segment + } + if (this._bottomClosed) { + this._numVertices += 2 * (this._pSegmentsW + 1); + numIndices += this._pSegmentsW * 3; + } + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(this._numVertices * 3); + normals = new Array(this._numVertices * 3); + tangents = new Array(this._numVertices * 3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + // top + if (this._topClosed && this._topRadius > 0) { + z = -0.5 * this._height; + + for (i = 0; i <= this._pSegmentsW; ++i) { + // central vertex + if (this._yUp) { + t1 = 1; + t2 = 0; + comp1 = -z; + comp2 = 0; + } else { + t1 = 0; + t2 = -1; + comp1 = 0; + comp2 = z; + } + + positions[vidx] = 0; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // revolution vertex + revolutionAngle = i * revolutionAngleDelta; + x = this._topRadius * Math.cos(revolutionAngle); + y = this._topRadius * Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex + 3]; + positions[vidx + 1] = positions[startIndex + 4]; + positions[vidx + 2] = positions[startIndex + 5]; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i > 0) { + // add triangle + indices[fidx++] = nextVertexIndex; + indices[fidx++] = nextVertexIndex + 1; + indices[fidx++] = nextVertexIndex + 2; + + nextVertexIndex += 2; + } + } + + nextVertexIndex += 2; + } + + // bottom + if (this._bottomClosed && this._pBottomRadius > 0) { + z = 0.5 * this._height; + + startIndex = nextVertexIndex * 3; + + for (i = 0; i <= this._pSegmentsW; ++i) { + if (this._yUp) { + t1 = -1; + t2 = 0; + comp1 = -z; + comp2 = 0; + } else { + t1 = 0; + t2 = 1; + comp1 = 0; + comp2 = z; + } + + positions[vidx] = 0; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // revolution vertex + revolutionAngle = i * revolutionAngleDelta; + x = this._pBottomRadius * Math.cos(revolutionAngle); + y = this._pBottomRadius * Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex + 3]; + positions[vidx + 1] = positions[startIndex + 4]; + positions[vidx + 2] = positions[startIndex + 5]; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i > 0) { + // add triangle + indices[fidx++] = nextVertexIndex; + indices[fidx++] = nextVertexIndex + 2; + indices[fidx++] = nextVertexIndex + 1; + + nextVertexIndex += 2; + } + } + + nextVertexIndex += 2; + } + + // The normals on the lateral surface all have the same incline, i.e. + // the "elevation" component (Y or Z depending on yUp) is constant. + // Same principle goes for the "base" of these vectors, which will be + // calculated such that a vector [base,elev] will be a unit vector. + dr = (this._pBottomRadius - this._topRadius); + latNormElev = dr / this._height; + latNormBase = (latNormElev == 0) ? 1 : this._height / dr; + + // lateral surface + if (this._surfaceClosed) { + var a; + var b; + var c; + var d; + var na0, na1, naComp1, naComp2; + + for (j = 0; j <= this._pSegmentsH; ++j) { + radius = this._topRadius - ((j / this._pSegmentsH) * (this._topRadius - this._pBottomRadius)); + z = -(this._height / 2) + (j / this._pSegmentsH * this._height); + + startIndex = nextVertexIndex * 3; + + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + revolutionAngle = i * revolutionAngleDelta; + x = radius * Math.cos(revolutionAngle); + y = radius * Math.sin(revolutionAngle); + na0 = latNormBase * Math.cos(revolutionAngle); + na1 = latNormBase * Math.sin(revolutionAngle); + + if (this._yUp) { + t1 = 0; + t2 = -na0; + comp1 = -z; + comp2 = y; + naComp1 = latNormElev; + naComp2 = na1; + } else { + t1 = -na0; + t2 = 0; + comp1 = y; + comp2 = z; + naComp1 = na1; + naComp2 = latNormElev; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex]; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + normals[vidx] = na0; + normals[vidx + 1] = latNormElev; + normals[vidx + 2] = na1; + tangents[vidx] = na1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = na0; + normals[vidx + 1] = naComp1; + normals[vidx + 2] = naComp2; + tangents[vidx] = -na1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } + vidx += 3; + + // close triangle + if (i > 0 && j > 0) { + a = nextVertexIndex; // current + b = nextVertexIndex - 1; // previous + c = b - this._pSegmentsW - 1; // previous of last level + d = a - this._pSegmentsW - 1; // current of last level + + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + + nextVertexIndex++; + } + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + var lineGeometry = target; + + var numSegments = (this._pSegmentsH + 1) * (this._pSegmentsW) + this._pSegmentsW; + var startPositions; + var endPositions; + var thickness; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments * 3); + endPositions = new Array(numSegments * 3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + for (j = 0; j <= this._pSegmentsH; ++j) { + radius = this._topRadius - ((j / this._pSegmentsH) * (this._topRadius - this._pBottomRadius)); + z = this._height * (j / this._pSegmentsH - 0.5); + + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + revolutionAngle = i * revolutionAngleDelta; + x = radius * Math.cos(revolutionAngle); + y = radius * Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i > 0) { + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + + //vertical lines + startPositions[vidx] = endPositions[vidx - this._pSegmentsW * 6]; + startPositions[vidx + 1] = endPositions[vidx + 1 - this._pSegmentsW * 6]; + startPositions[vidx + 2] = endPositions[vidx + 2 - this._pSegmentsW * 6]; + + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + if (i < this._pSegmentsW) { + startPositions[vidx] = x; + startPositions[vidx + 1] = comp1; + startPositions[vidx + 2] = comp2; + } + } + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + }; + + /** + * @inheritDoc + */ + PrimitiveCylinderPrefab.prototype._pBuildUVs = function (target, geometryType) { + var i; + var j; + var x; + var y; + var revolutionAngle; + var uvs; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices * 2); + } + + // evaluate revolution steps + var revolutionAngleDelta = 2 * Math.PI / this._pSegmentsW; + + // current uv component index + var index = 0; + + // top + if (this._topClosed) { + for (i = 0; i <= this._pSegmentsW; ++i) { + revolutionAngle = i * revolutionAngleDelta; + x = 0.5 + 0.5 * -Math.cos(revolutionAngle); + y = 0.5 + 0.5 * Math.sin(revolutionAngle); + + uvs[index++] = 0.5 * triangleGeometry.scaleU; // central vertex + uvs[index++] = 0.5 * triangleGeometry.scaleV; + + uvs[index++] = x * triangleGeometry.scaleU; // revolution vertex + uvs[index++] = y * triangleGeometry.scaleV; + } + } + + // bottom + if (this._bottomClosed) { + for (i = 0; i <= this._pSegmentsW; ++i) { + revolutionAngle = i * revolutionAngleDelta; + x = 0.5 + 0.5 * Math.cos(revolutionAngle); + y = 0.5 + 0.5 * Math.sin(revolutionAngle); + + uvs[index++] = 0.5 * triangleGeometry.scaleU; // central vertex + uvs[index++] = 0.5 * triangleGeometry.scaleV; + + uvs[index++] = x * triangleGeometry.scaleU; // revolution vertex + uvs[index++] = y * triangleGeometry.scaleV; + } + } + + // lateral surface + if (this._surfaceClosed) { + for (j = 0; j <= this._pSegmentsH; ++j) { + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + uvs[index++] = (i / this._pSegmentsW) * triangleGeometry.scaleU; + uvs[index++] = (j / this._pSegmentsH) * triangleGeometry.scaleV; + } + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveCylinderPrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveCylinderPrefab; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlQ3lsaW5kZXJQcmVmYWIudHMiXSwibmFtZXMiOlsiUHJpbWl0aXZlQ3lsaW5kZXJQcmVmYWIiLCJQcmltaXRpdmVDeWxpbmRlclByZWZhYi5jb25zdHJ1Y3RvciIsIlByaW1pdGl2ZUN5bGluZGVyUHJlZmFiLnNldFNlZ21lbnRzVyIsIlByaW1pdGl2ZUN5bGluZGVyUHJlZmFiLnNldFNlZ21lbnRzSCIsIlByaW1pdGl2ZUN5bGluZGVyUHJlZmFiLl9wQnVpbGRHZW9tZXRyeSIsIlByaW1pdGl2ZUN5bGluZGVyUHJlZmFiLl9wQnVpbGRVVnMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdGQUlxRjs7QUFFckY7O0VBRUc7QUFDSDtJQUFzQ0EsMENBQW1CQTtJQXlKeERBOzs7Ozs7Ozs7O01BREdBO0lBQ0hBLGlDQUFZQSxTQUFxQkEsRUFBRUEsWUFBd0JBLEVBQUVBLE1BQW1CQSxFQUFFQSxTQUFxQkEsRUFBRUEsU0FBb0JBLEVBQUVBLFNBQXdCQSxFQUFFQSxZQUEyQkEsRUFBRUEsYUFBNEJBLEVBQUVBLEdBQWtCQTtRQUExTkMsd0NBQUFBLFNBQVNBLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLDJDQUFBQSxZQUFZQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUFFQSxxQ0FBQUEsTUFBTUEsR0FBVUEsR0FBR0E7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLHdDQUFBQSxTQUFTQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSx3Q0FBQUEsU0FBU0EsR0FBV0EsSUFBSUE7QUFBQUEsUUFBRUEsMkNBQUFBLFlBQVlBLEdBQVdBLElBQUlBO0FBQUFBLFFBQUVBLDRDQUFBQSxhQUFhQSxHQUFXQSxJQUFJQTtBQUFBQSxRQUFFQSxrQ0FBQUEsR0FBR0EsR0FBV0EsSUFBSUE7QUFBQUEsUUFFck9BLFdBQU1BLEtBQUFBLENBQUNBO1FBOUlSQSxLQUFRQSxZQUFZQSxHQUFVQSxDQUFDQSxDQUFDQTs7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QUlBLENBQUVBO3dCQUNkQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQTt3QkFDVkEsS0FBS0EsR0FBR0EsQ0FBQ0E7cUJBQ1RBLEtBQU1BO3dCQUNOQSxLQUFLQSxHQUFHQSxDQUFDQTt3QkFDVEEsS0FBS0EsR0FBR0EsQ0FBQ0E7cUJBQ1RBOztvQkFFREEsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBRUE7d0JBQzFCQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQTt3QkFDM0NBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO3dCQUMvQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBRS9DQSxLQUFNQTt3QkFDTkEsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7d0JBQ25CQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQTt3QkFDM0JBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBO3FCQUMzQkE7O29CQUVEQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDakJBLE9BQU9BLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBO29CQUN0QkEsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7b0JBQ3RCQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDbEJBLFFBQVFBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUN0QkEsUUFBUUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FB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QUNBOzRCQUNUQSxPQUFPQSxHQUFHQSxHQUFHQTs0QkFDYkEsT0FBT0EsR0FBR0EsV0FBV0E7eUJBQ3JCQTs7d0JBRURBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFdBQVdBLENBQUVBOzRCQUMxQkEsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsVUFBVUEsQ0FBQ0E7NEJBQ3ZDQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQTs0QkFDL0NBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBOzRCQUMvQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsR0FBR0E7NEJBQ25CQSxPQUFPQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxXQUFXQTs0QkFDL0JBLE9BQU9BLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBOzRCQUN2QkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsR0FBR0E7NEJBQ3BCQSxRQUFRQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTs0QkFDdkJBLFFBQVFBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBO3lCQUN2QkEsS0FBTUE7NEJBQ05BLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBOzRCQUNuQkEsU0FBU0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7NEJBQzNCQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQTs0QkFDM0JBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBOzRCQUNuQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FB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OztZQUVEQSxJQUFJQSxHQUFHQSxDQUFDQTs7WUFFUkEsSUFBSUEsR0FBR0EsQ0FBQ0E7O1lBSVJBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLEVBQUVBLENBQUNBLENBQUVBO2dCQUN2Q0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7Z0JBQ3pGQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQTs7Z0JBRTNDQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtvQkFDdkNBLG9CQUFvQkE7b0JBQ3BCQSxlQUFlQSxHQUFHQSxDQUFDQSxHQUFDQSxvQkFBb0JBO29CQUN4Q0EsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsZUFBZUEsQ0FBQ0E7b0JBQ3BDQSxDQUFDQSxHQUFHQSxNQUFNQSxHQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxlQUFlQSxDQUFDQTs7b0JBRXBDQSxJQUFJQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFFQTt3QkFDZEEsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7d0JBQ1ZBLEtBQUtBLEdBQUdBLENBQUNBO3FCQUNUQSxLQUFNQTt3QkFDTkEsS0FBS0EsR0FBR0EsQ0FBQ0E7d0JBQ1RBLEtBQUtBLEdBQUdBLENBQUNBO3FCQUNUQTs7b0JBRURBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUVBO3dCQUNWQSxZQUFZQSxD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LElBQUlBLENBQUNBLFdBQVdBLENBQUVBLEdBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUE7cUJBQzdEQTtpQkFDREE7YUFDREE7O1lBRURBLGdDQUFnQ0E7WUFDaENBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FFL0JBLE1BQU1BLElBQUlBLFlBQVlBLElBQUlBLGlCQUFpQkEsQ0FBRUE7WUFDN0NBLG9CQUFvQkE7U0FDcEJBO0lBQ0ZBLENBQUNBO0lBQ0ZMLCtCQUFDQTtBQUFEQSxDQUFDQSxFQTVvQnFDLG1CQUFtQixFQTRvQnhEOztBQUVELHdDQUFpQyxDQUFBIiwiZmlsZSI6InByZWZhYnMvUHJpbWl0aXZlQ3lsaW5kZXJQcmVmYWIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTGluZVN1Ykdlb21ldHJ5XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaW5lU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgU3ViR2VvbWV0cnlCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9TdWJHZW9tZXRyeUJhc2VcIik7XG5pbXBvcnQgVHJpYW5nbGVTdWJHZW9tZXRyeVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1RyaWFuZ2xlU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFByaW1pdGl2ZVByZWZhYkJhc2VcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3ByZWZhYnMvUHJpbWl0aXZlUHJlZmFiQmFzZVwiKTtcblxuLyoqXG4gKiBBIEN5bGluZGVyIHByaW1pdGl2ZSBtZXNoLlxuICovXG5jbGFzcyBQcmltaXRpdmVDeWxpbmRlclByZWZhYiBleHRlbmRzIFByaW1pdGl2ZVByZWZhYkJhc2UgaW1wbGVtZW50cyBJQXNzZXRcbntcblx0cHVibGljIF9wQm90dG9tUmFkaXVzOm51bWJlcjtcblx0cHVibGljIF9wU2VnbWVudHNXOm51bWJlcjtcblx0cHVibGljIF9wU2VnbWVudHNIOm51bWJlcjtcblxuXHRwcml2YXRlIF90b3BSYWRpdXM6bnVtYmVyO1xuXHRwcml2YXRlIF9oZWlnaHQ6bnVtYmVyO1xuXG5cdHByaXZhdGUgX3RvcENsb3NlZDpib29sZWFuO1xuXHRwcml2YXRlIF9ib3R0b21DbG9zZWQ6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfc3VyZmFjZUNsb3NlZDpib29sZWFuO1xuXHRwcml2YXRlIF95VXA6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfbnVtVmVydGljZXM6bnVtYmVyID0gMDtcblxuXHQvKipcblx0ICogVGhlIHJhZGl1cyBvZiB0aGUgdG9wIGVuZCBvZiB0aGUgY3lsaW5kZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHRvcFJhZGl1cygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3RvcFJhZGl1cztcblx0fVxuXG5cdHB1YmxpYyBzZXQgdG9wUmFkaXVzKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3RvcFJhZGl1cyA9IHZhbHVlO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgcmFkaXVzIG9mIHRoZSBib3R0b20gZW5kIG9mIHRoZSBjeWxpbmRlci5cblx0ICovXG5cdHB1YmxpYyBnZXQgYm90dG9tUmFkaXVzKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcEJvdHRvbVJhZGl1cztcblx0fVxuXG5cdHB1YmxpYyBzZXQgYm90dG9tUmFkaXVzKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3BCb3R0b21SYWRpdXMgPSB2YWx1ZTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHJhZGl1cyBvZiB0aGUgdG9wIGVuZCBvZiB0aGUgY3lsaW5kZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGhlaWdodCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2hlaWdodDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgaGVpZ2h0KHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX2hlaWdodCA9IHZhbHVlO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGN5bGluZGVyLiBEZWZhdWx0cyB0byAxNi5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2VnbWVudHNXKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFNlZ21lbnRzVztcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2VnbWVudHNXKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuc2V0U2VnbWVudHNXKHZhbHVlKTtcblx0fVxuXG5cdHB1YmxpYyBzZXRTZWdtZW50c1codmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fcFNlZ21lbnRzVyA9IHZhbHVlO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZVVWcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGN5bGluZGVyLiBEZWZhdWx0cyB0byAxLlxuXHQgKi9cblx0cHVibGljIGdldCBzZWdtZW50c0goKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wU2VnbWVudHNIO1xuXHR9XG5cblx0cHVibGljIHNldCBzZWdtZW50c0godmFsdWU6bnVtYmVyKVxuXHR7XG5cblx0XHR0aGlzLnNldFNlZ21lbnRzSCh2YWx1ZSlcblxuXHR9XG5cblx0cHVibGljIHNldFNlZ21lbnRzSCh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9wU2VnbWVudHNIID0gdmFsdWU7XG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlVVZzKCk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHdoZXRoZXIgdGhlIHRvcCBlbmQgb2YgdGhlIGN5bGluZGVyIGlzIGNsb3NlZCAodHJ1ZSkgb3Igb3Blbi5cblx0ICovXG5cdHB1YmxpYyBnZXQgdG9wQ2xvc2VkKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3RvcENsb3NlZDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgdG9wQ2xvc2VkKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHR0aGlzLl90b3BDbG9zZWQgPSB2YWx1ZTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSBib3R0b20gZW5kIG9mIHRoZSBjeWxpbmRlciBpcyBjbG9zZWQgKHRydWUpIG9yIG9wZW4uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGJvdHRvbUNsb3NlZCgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9ib3R0b21DbG9zZWQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGJvdHRvbUNsb3NlZCh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0dGhpcy5fYm90dG9tQ2xvc2VkID0gdmFsdWU7XG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgY3lsaW5kZXIgcG9sZXMgc2hvdWxkIGxheSBvbiB0aGUgWS1heGlzICh0cnVlKSBvciBvbiB0aGUgWi1heGlzIChmYWxzZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHlVcCgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl95VXA7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHlVcCh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0dGhpcy5feVVwID0gdmFsdWU7XG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgQ3lsaW5kZXIgb2JqZWN0LlxuXHQgKiBAcGFyYW0gdG9wUmFkaXVzIFRoZSByYWRpdXMgb2YgdGhlIHRvcCBlbmQgb2YgdGhlIGN5bGluZGVyLlxuXHQgKiBAcGFyYW0gYm90dG9tUmFkaXVzIFRoZSByYWRpdXMgb2YgdGhlIGJvdHRvbSBlbmQgb2YgdGhlIGN5bGluZGVyXG5cdCAqIEBwYXJhbSBoZWlnaHQgVGhlIHJhZGl1cyBvZiB0aGUgYm90dG9tIGVuZCBvZiB0aGUgY3lsaW5kZXJcblx0ICogQHBhcmFtIHNlZ21lbnRzVyBEZWZpbmVzIHRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIGN5bGluZGVyLiBEZWZhdWx0cyB0byAxNi5cblx0ICogQHBhcmFtIHNlZ21lbnRzSCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgdmVydGljYWwgc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBjeWxpbmRlci4gRGVmYXVsdHMgdG8gMS5cblx0ICogQHBhcmFtIHRvcENsb3NlZCBEZWZpbmVzIHdoZXRoZXIgdGhlIHRvcCBlbmQgb2YgdGhlIGN5bGluZGVyIGlzIGNsb3NlZCAodHJ1ZSkgb3Igb3Blbi5cblx0ICogQHBhcmFtIGJvdHRvbUNsb3NlZCBEZWZpbmVzIHdoZXRoZXIgdGhlIGJvdHRvbSBlbmQgb2YgdGhlIGN5bGluZGVyIGlzIGNsb3NlZCAodHJ1ZSkgb3Igb3Blbi5cblx0ICogQHBhcmFtIHlVcCBEZWZpbmVzIHdoZXRoZXIgdGhlIGNvbmUgcG9sZXMgc2hvdWxkIGxheSBvbiB0aGUgWS1heGlzICh0cnVlKSBvciBvbiB0aGUgWi1heGlzIChmYWxzZSkuXG5cdCAqL1xuXHRjb25zdHJ1Y3Rvcih0b3BSYWRpdXM6bnVtYmVyID0gNTAsIGJvdHRvbVJhZGl1czpudW1iZXIgPSA1MCwgaGVpZ2h0Om51bWJlciA9IDEwMCwgc2VnbWVudHNXOm51bWJlciA9IDE2LCBzZWdtZW50c0g6bnVtYmVyID0gMSwgdG9wQ2xvc2VkOmJvb2xlYW4gPSB0cnVlLCBib3R0b21DbG9zZWQ6Ym9vbGVhbiA9IHRydWUsIHN1cmZhY2VDbG9zZWQ6Ym9vbGVhbiA9IHRydWUsIHlVcDpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl90b3BSYWRpdXMgPSB0b3BSYWRpdXM7XG5cdFx0dGhpcy5fcEJvdHRvbVJhZGl1cyA9IGJvdHRvbVJhZGl1cztcblx0XHR0aGlzLl9oZWlnaHQgPSBoZWlnaHQ7XG5cdFx0dGhpcy5fcFNlZ21lbnRzVyA9IHNlZ21lbnRzVztcblx0XHR0aGlzLl9wU2VnbWVudHNIID0gc2VnbWVudHNIO1xuXHRcdHRoaXMuX3RvcENsb3NlZCA9IHRvcENsb3NlZDtcblx0XHR0aGlzLl9ib3R0b21DbG9zZWQgPSBib3R0b21DbG9zZWQ7XG5cdFx0dGhpcy5fc3VyZmFjZUNsb3NlZCA9IHN1cmZhY2VDbG9zZWQ7XG5cdFx0dGhpcy5feVVwID0geVVwO1xuXHR9XG5cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfcEJ1aWxkR2VvbWV0cnkodGFyZ2V0OlN1Ykdlb21ldHJ5QmFzZSwgZ2VvbWV0cnlUeXBlOnN0cmluZylcblx0e1xuXHRcdHZhciBpbmRpY2VzOkFycmF5PG51bWJlcj4gLyp1aW50Ki87XG5cdFx0dmFyIHBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdHZhciBub3JtYWxzOkFycmF5PG51bWJlcj47XG5cdFx0dmFyIHRhbmdlbnRzOkFycmF5PG51bWJlcj47XG5cblx0XHR2YXIgaTpudW1iZXI7XG5cdFx0dmFyIGo6bnVtYmVyO1xuXHRcdHZhciB4Om51bWJlcjtcblx0XHR2YXIgeTpudW1iZXI7XG5cdFx0dmFyIHo6bnVtYmVyO1xuXHRcdHZhciB2aWR4Om51bWJlcjtcblx0XHR2YXIgZmlkeDpudW1iZXI7XG5cblx0XHR2YXIgcmFkaXVzOm51bWJlcjtcblx0XHR2YXIgcmV2b2x1dGlvbkFuZ2xlOm51bWJlcjtcblxuXHRcdHZhciBkcjpudW1iZXI7XG5cdFx0dmFyIGxhdE5vcm1FbGV2Om51bWJlcjtcblx0XHR2YXIgbGF0Tm9ybUJhc2U6bnVtYmVyO1xuXHRcdHZhciBudW1JbmRpY2VzOm51bWJlciA9IDA7XG5cblx0XHR2YXIgY29tcDE6bnVtYmVyO1xuXHRcdHZhciBjb21wMjpudW1iZXI7XG5cdFx0dmFyIHN0YXJ0SW5kZXg6bnVtYmVyID0gMDtcblx0XHR2YXIgbmV4dFZlcnRleEluZGV4Om51bWJlciA9IDA7XG5cblx0XHR2YXIgdDE6bnVtYmVyO1xuXHRcdHZhciB0MjpudW1iZXI7XG5cblx0XHQvLyByZXNldCB1dGlsaXR5IHZhcmlhYmxlc1xuXHRcdHRoaXMuX251bVZlcnRpY2VzID0gMDtcblxuXHRcdC8vIGV2YWx1YXRlIHJldm9sdXRpb24gc3RlcHNcblx0XHR2YXIgcmV2b2x1dGlvbkFuZ2xlRGVsdGE6bnVtYmVyID0gMipNYXRoLlBJL3RoaXMuX3BTZWdtZW50c1c7XG5cblx0XHRpZiAoZ2VvbWV0cnlUeXBlID09IFwidHJpYW5nbGVTdWJHZW9tZXRyeVwiKSB7XG5cblx0XHRcdHZhciB0cmlhbmdsZUdlb21ldHJ5OlRyaWFuZ2xlU3ViR2VvbWV0cnkgPSA8VHJpYW5nbGVTdWJHZW9tZXRyeT4gdGFyZ2V0O1xuXG5cdFx0XHQvLyBldmFsdWF0ZSB0YXJnZXQgbnVtYmVyIG9mIHZlcnRpY2VzLCB0cmlhbmdsZXMgYW5kIGluZGljZXNcblx0XHRcdGlmICh0aGlzLl9zdXJmYWNlQ2xvc2VkKSB7XG5cdFx0XHRcdHRoaXMuX251bVZlcnRpY2VzICs9ICh0aGlzLl9wU2VnbWVudHNIICsgMSkqKHRoaXMuX3BTZWdtZW50c1cgKyAxKTsgLy8gc2VnbWVudHNIICsgMSBiZWNhdXNlIG9mIGNsb3N1cmUsIHNlZ21lbnRzVyArIDEgYmVjYXVzZSBvZiBVViB1bndyYXBwaW5nXG5cdFx0XHRcdG51bUluZGljZXMgKz0gdGhpcy5fcFNlZ21lbnRzSCp0aGlzLl9wU2VnbWVudHNXKjY7IC8vIGVhY2ggbGV2ZWwgaGFzIHNlZ21lbnRXIHF1YWRzLCBlYWNoIG9mIDIgdHJpYW5nbGVzXG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fdG9wQ2xvc2VkKSB7XG5cdFx0XHRcdHRoaXMuX251bVZlcnRpY2VzICs9IDIqKHRoaXMuX3BTZWdtZW50c1cgKyAxKTsgLy8gc2VnbWVudHNXICsgMSBiZWNhdXNlIG9mIHVud3JhcHBpbmdcblx0XHRcdFx0bnVtSW5kaWNlcyArPSB0aGlzLl9wU2VnbWVudHNXKjM7IC8vIG9uZSB0cmlhbmdsZSBmb3IgZWFjaCBzZWdtZW50XG5cdFx0XHR9XG5cdFx0XHRpZiAodGhpcy5fYm90dG9tQ2xvc2VkKSB7XG5cdFx0XHRcdHRoaXMuX251bVZlcnRpY2VzICs9IDIqKHRoaXMuX3BTZWdtZW50c1cgKyAxKTtcblx0XHRcdFx0bnVtSW5kaWNlcyArPSB0aGlzLl9wU2VnbWVudHNXKjM7XG5cdFx0XHR9XG5cblx0XHRcdC8vIG5lZWQgdG8gaW5pdGlhbGl6ZSByYXcgYXJyYXlzIG9yIGNhbiBiZSByZXVzZWQ/XG5cdFx0XHRpZiAodGhpcy5fbnVtVmVydGljZXMgPT0gdHJpYW5nbGVHZW9tZXRyeS5udW1WZXJ0aWNlcykge1xuXHRcdFx0XHRpbmRpY2VzID0gdHJpYW5nbGVHZW9tZXRyeS5pbmRpY2VzO1xuXHRcdFx0XHRwb3NpdGlvbnMgPSB0cmlhbmdsZUdlb21ldHJ5LnBvc2l0aW9ucztcblx0XHRcdFx0bm9ybWFscyA9IHRyaWFuZ2xlR2VvbWV0cnkudmVydGV4Tm9ybWFscztcblx0XHRcdFx0dGFuZ2VudHMgPSB0cmlhbmdsZUdlb21ldHJ5LnZlcnRleFRhbmdlbnRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5kaWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KG51bUluZGljZXMpXG5cdFx0XHRcdHBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KHRoaXMuX251bVZlcnRpY2VzKjMpO1xuXHRcdFx0XHRub3JtYWxzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5fbnVtVmVydGljZXMqMyk7XG5cdFx0XHRcdHRhbmdlbnRzID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5fbnVtVmVydGljZXMqMyk7XG5cblx0XHRcdFx0dGhpcy5fcEludmFsaWRhdGVVVnMoKTtcblx0XHRcdH1cblxuXHRcdFx0dmlkeCA9IDA7XG5cdFx0XHRmaWR4ID0gMDtcblxuXHRcdFx0Ly8gdG9wXG5cdFx0XHRpZiAodGhpcy5fdG9wQ2xvc2VkICYmIHRoaXMuX3RvcFJhZGl1cyA+IDApIHtcblxuXHRcdFx0XHR6ID0gLTAuNSp0aGlzLl9oZWlnaHQ7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9wU2VnbWVudHNXOyArK2kpIHtcblx0XHRcdFx0XHQvLyBjZW50cmFsIHZlcnRleFxuXHRcdFx0XHRcdGlmICh0aGlzLl95VXApIHtcblx0XHRcdFx0XHRcdHQxID0gMTtcblx0XHRcdFx0XHRcdHQyID0gMDtcblx0XHRcdFx0XHRcdGNvbXAxID0gLXo7XG5cdFx0XHRcdFx0XHRjb21wMiA9IDA7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dDEgPSAwO1xuXHRcdFx0XHRcdFx0dDIgPSAtMTtcblx0XHRcdFx0XHRcdGNvbXAxID0gMDtcblx0XHRcdFx0XHRcdGNvbXAyID0gejtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSAwO1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMV0gPSBjb21wMTtcblx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDJdID0gY29tcDI7XG5cdFx0XHRcdFx0bm9ybWFsc1t2aWR4XSA9IDA7XG5cdFx0XHRcdFx0bm9ybWFsc1t2aWR4ICsgMV0gPSB0MTtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHggKyAyXSA9IHQyO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHhdID0gMTtcblx0XHRcdFx0XHR0YW5nZW50c1t2aWR4ICsgMV0gPSAwO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAyXSA9IDA7XG5cdFx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdFx0Ly8gcmV2b2x1dGlvbiB2ZXJ0ZXhcblx0XHRcdFx0XHRyZXZvbHV0aW9uQW5nbGUgPSBpKnJldm9sdXRpb25BbmdsZURlbHRhO1xuXHRcdFx0XHRcdHggPSB0aGlzLl90b3BSYWRpdXMqTWF0aC5jb3MocmV2b2x1dGlvbkFuZ2xlKTtcblx0XHRcdFx0XHR5ID0gdGhpcy5fdG9wUmFkaXVzKk1hdGguc2luKHJldm9sdXRpb25BbmdsZSk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5feVVwKSB7XG5cdFx0XHRcdFx0XHRjb21wMSA9IC16O1xuXHRcdFx0XHRcdFx0Y29tcDIgPSB5O1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb21wMSA9IHk7XG5cdFx0XHRcdFx0XHRjb21wMiA9IHo7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGkgPT0gdGhpcy5fcFNlZ21lbnRzVykge1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHhdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXggKyAzXTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMV0gPSBwb3NpdGlvbnNbc3RhcnRJbmRleCArIDRdO1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAyXSA9IHBvc2l0aW9uc1tzdGFydEluZGV4ICsgNV07XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHhdID0geDtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMV0gPSBjb21wMTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMl0gPSBjb21wMjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRub3JtYWxzW3ZpZHhdID0gMDtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHggKyAxXSA9IHQxO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDJdID0gdDI7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeF0gPSAxO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAxXSA9IDA7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDJdID0gMDtcblx0XHRcdFx0XHR2aWR4ICs9IDM7XG5cblx0XHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRcdC8vIGFkZCB0cmlhbmdsZVxuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gbmV4dFZlcnRleEluZGV4O1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gbmV4dFZlcnRleEluZGV4ICsgMTtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IG5leHRWZXJ0ZXhJbmRleCArIDI7XG5cblx0XHRcdFx0XHRcdG5leHRWZXJ0ZXhJbmRleCArPSAyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdG5leHRWZXJ0ZXhJbmRleCArPSAyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBib3R0b21cblx0XHRcdGlmICh0aGlzLl9ib3R0b21DbG9zZWQgJiYgdGhpcy5fcEJvdHRvbVJhZGl1cyA+IDApIHtcblxuXHRcdFx0XHR6ID0gMC41KnRoaXMuX2hlaWdodDtcblxuXHRcdFx0XHRzdGFydEluZGV4ID0gbmV4dFZlcnRleEluZGV4KjM7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9wU2VnbWVudHNXOyArK2kpIHtcblx0XHRcdFx0XHRpZiAodGhpcy5feVVwKSB7XG5cdFx0XHRcdFx0XHR0MSA9IC0xO1xuXHRcdFx0XHRcdFx0dDIgPSAwO1xuXHRcdFx0XHRcdFx0Y29tcDEgPSAtejtcblx0XHRcdFx0XHRcdGNvbXAyID0gMDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dDEgPSAwO1xuXHRcdFx0XHRcdFx0dDIgPSAxO1xuXHRcdFx0XHRcdFx0Y29tcDEgPSAwO1xuXHRcdFx0XHRcdFx0Y29tcDIgPSB6O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4XSA9IDA7XG5cdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAxXSA9IGNvbXAxO1xuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMl0gPSBjb21wMjtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHhdID0gMDtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHggKyAxXSA9IHQxO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDJdID0gdDI7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeF0gPSAxO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAxXSA9IDA7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDJdID0gMDtcblx0XHRcdFx0XHR2aWR4ICs9IDM7XG5cblx0XHRcdFx0XHQvLyByZXZvbHV0aW9uIHZlcnRleFxuXHRcdFx0XHRcdHJldm9sdXRpb25BbmdsZSA9IGkqcmV2b2x1dGlvbkFuZ2xlRGVsdGE7XG5cdFx0XHRcdFx0eCA9IHRoaXMuX3BCb3R0b21SYWRpdXMqTWF0aC5jb3MocmV2b2x1dGlvbkFuZ2xlKTtcblx0XHRcdFx0XHR5ID0gdGhpcy5fcEJvdHRvbVJhZGl1cypNYXRoLnNpbihyZXZvbHV0aW9uQW5nbGUpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuX3lVcCkge1xuXHRcdFx0XHRcdFx0Y29tcDEgPSAtejtcblx0XHRcdFx0XHRcdGNvbXAyID0geTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29tcDEgPSB5O1xuXHRcdFx0XHRcdFx0Y29tcDIgPSB6O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChpID09IHRoaXMuX3BTZWdtZW50c1cpIHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4XSA9IHBvc2l0aW9uc1tzdGFydEluZGV4ICsgM107XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDFdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXggKyA0XTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMl0gPSBwb3NpdGlvbnNbc3RhcnRJbmRleCArIDVdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSB4O1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAxXSA9IGNvbXAxO1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAyXSA9IGNvbXAyO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeF0gPSAwO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDFdID0gdDE7XG5cdFx0XHRcdFx0bm9ybWFsc1t2aWR4ICsgMl0gPSB0Mjtcblx0XHRcdFx0XHR0YW5nZW50c1t2aWR4XSA9IDE7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDFdID0gMDtcblx0XHRcdFx0XHR0YW5nZW50c1t2aWR4ICsgMl0gPSAwO1xuXHRcdFx0XHRcdHZpZHggKz0gMztcblxuXHRcdFx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHRcdFx0Ly8gYWRkIHRyaWFuZ2xlXG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBuZXh0VmVydGV4SW5kZXg7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBuZXh0VmVydGV4SW5kZXggKyAyO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gbmV4dFZlcnRleEluZGV4ICsgMTtcblxuXHRcdFx0XHRcdFx0bmV4dFZlcnRleEluZGV4ICs9IDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0bmV4dFZlcnRleEluZGV4ICs9IDI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBub3JtYWxzIG9uIHRoZSBsYXRlcmFsIHN1cmZhY2UgYWxsIGhhdmUgdGhlIHNhbWUgaW5jbGluZSwgaS5lLlxuXHRcdFx0Ly8gdGhlIFwiZWxldmF0aW9uXCIgY29tcG9uZW50IChZIG9yIFogZGVwZW5kaW5nIG9uIHlVcCkgaXMgY29uc3RhbnQuXG5cdFx0XHQvLyBTYW1lIHByaW5jaXBsZSBnb2VzIGZvciB0aGUgXCJiYXNlXCIgb2YgdGhlc2UgdmVjdG9ycywgd2hpY2ggd2lsbCBiZVxuXHRcdFx0Ly8gY2FsY3VsYXRlZCBzdWNoIHRoYXQgYSB2ZWN0b3IgW2Jhc2UsZWxldl0gd2lsbCBiZSBhIHVuaXQgdmVjdG9yLlxuXHRcdFx0ZHIgPSAodGhpcy5fcEJvdHRvbVJhZGl1cyAtIHRoaXMuX3RvcFJhZGl1cyk7XG5cdFx0XHRsYXROb3JtRWxldiA9IGRyL3RoaXMuX2hlaWdodDtcblx0XHRcdGxhdE5vcm1CYXNlID0gKGxhdE5vcm1FbGV2ID09IDApPyAxIDogdGhpcy5faGVpZ2h0L2RyO1xuXG5cdFx0XHQvLyBsYXRlcmFsIHN1cmZhY2Vcblx0XHRcdGlmICh0aGlzLl9zdXJmYWNlQ2xvc2VkKSB7XG5cdFx0XHRcdHZhciBhOm51bWJlcjtcblx0XHRcdFx0dmFyIGI6bnVtYmVyO1xuXHRcdFx0XHR2YXIgYzpudW1iZXI7XG5cdFx0XHRcdHZhciBkOm51bWJlcjtcblx0XHRcdFx0dmFyIG5hMDpudW1iZXIsIG5hMTpudW1iZXIsIG5hQ29tcDE6bnVtYmVyLCBuYUNvbXAyOm51bWJlcjtcblxuXHRcdFx0XHRmb3IgKGogPSAwOyBqIDw9IHRoaXMuX3BTZWdtZW50c0g7ICsraikge1xuXHRcdFx0XHRcdHJhZGl1cyA9IHRoaXMuX3RvcFJhZGl1cyAtICgoai90aGlzLl9wU2VnbWVudHNIKSoodGhpcy5fdG9wUmFkaXVzIC0gdGhpcy5fcEJvdHRvbVJhZGl1cykpO1xuXHRcdFx0XHRcdHogPSAtKHRoaXMuX2hlaWdodC8yKSArIChqL3RoaXMuX3BTZWdtZW50c0gqdGhpcy5faGVpZ2h0KTtcblxuXHRcdFx0XHRcdHN0YXJ0SW5kZXggPSBuZXh0VmVydGV4SW5kZXgqMztcblxuXHRcdFx0XHRcdGZvciAoaSA9IDA7IGkgPD0gdGhpcy5fcFNlZ21lbnRzVzsgKytpKSB7XG5cdFx0XHRcdFx0XHQvLyByZXZvbHV0aW9uIHZlcnRleFxuXHRcdFx0XHRcdFx0cmV2b2x1dGlvbkFuZ2xlID0gaSpyZXZvbHV0aW9uQW5nbGVEZWx0YTtcblx0XHRcdFx0XHRcdHggPSByYWRpdXMqTWF0aC5jb3MocmV2b2x1dGlvbkFuZ2xlKTtcblx0XHRcdFx0XHRcdHkgPSByYWRpdXMqTWF0aC5zaW4ocmV2b2x1dGlvbkFuZ2xlKTtcblx0XHRcdFx0XHRcdG5hMCA9IGxhdE5vcm1CYXNlKk1hdGguY29zKHJldm9sdXRpb25BbmdsZSk7XG5cdFx0XHRcdFx0XHRuYTEgPSBsYXROb3JtQmFzZSpNYXRoLnNpbihyZXZvbHV0aW9uQW5nbGUpO1xuXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5feVVwKSB7XG5cdFx0XHRcdFx0XHRcdHQxID0gMDtcblx0XHRcdFx0XHRcdFx0dDIgPSAtbmEwO1xuXHRcdFx0XHRcdFx0XHRjb21wMSA9IC16O1xuXHRcdFx0XHRcdFx0XHRjb21wMiA9IHk7XG5cdFx0XHRcdFx0XHRcdG5hQ29tcDEgPSBsYXROb3JtRWxldjtcblx0XHRcdFx0XHRcdFx0bmFDb21wMiA9IG5hMTtcblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0dDEgPSAtbmEwO1xuXHRcdFx0XHRcdFx0XHR0MiA9IDA7XG5cdFx0XHRcdFx0XHRcdGNvbXAxID0geTtcblx0XHRcdFx0XHRcdFx0Y29tcDIgPSB6O1xuXHRcdFx0XHRcdFx0XHRuYUNvbXAxID0gbmExO1xuXHRcdFx0XHRcdFx0XHRuYUNvbXAyID0gbGF0Tm9ybUVsZXY7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChpID09IHRoaXMuX3BTZWdtZW50c1cpIHtcblx0XHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHhdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXhdO1xuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDFdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXggKyAxXTtcblx0XHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAyXSA9IHBvc2l0aW9uc1tzdGFydEluZGV4ICsgMl07XG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbdmlkeF0gPSBuYTA7XG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDFdID0gbGF0Tm9ybUVsZXY7XG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDJdID0gbmExO1xuXHRcdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4XSA9IG5hMTtcblx0XHRcdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDFdID0gdDE7XG5cdFx0XHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAyXSA9IHQyO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHhdID0geDtcblx0XHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAxXSA9IGNvbXAxO1xuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDJdID0gY29tcDI7XG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbdmlkeF0gPSBuYTA7XG5cdFx0XHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDFdID0gbmFDb21wMTtcblx0XHRcdFx0XHRcdFx0bm9ybWFsc1t2aWR4ICsgMl0gPSBuYUNvbXAyO1xuXHRcdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4XSA9IC1uYTE7XG5cdFx0XHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAxXSA9IHQxO1xuXHRcdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4ICsgMl0gPSB0Mjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdHZpZHggKz0gMztcblxuXHRcdFx0XHRcdFx0Ly8gY2xvc2UgdHJpYW5nbGVcblx0XHRcdFx0XHRcdGlmIChpID4gMCAmJiBqID4gMCkge1xuXHRcdFx0XHRcdFx0XHRhID0gbmV4dFZlcnRleEluZGV4OyAvLyBjdXJyZW50XG5cdFx0XHRcdFx0XHRcdGIgPSBuZXh0VmVydGV4SW5kZXggLSAxOyAvLyBwcmV2aW91c1xuXHRcdFx0XHRcdFx0XHRjID0gYiAtIHRoaXMuX3BTZWdtZW50c1cgLSAxOyAvLyBwcmV2aW91cyBvZiBsYXN0IGxldmVsXG5cdFx0XHRcdFx0XHRcdGQgPSBhIC0gdGhpcy5fcFNlZ21lbnRzVyAtIDE7IC8vIGN1cnJlbnQgb2YgbGFzdCBsZXZlbFxuXG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGE7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGI7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGM7XG5cblx0XHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYTtcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYztcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gZDtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bmV4dFZlcnRleEluZGV4Kys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGJ1aWxkIHJlYWwgZGF0YSBmcm9tIHJhdyBkYXRhXG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZUluZGljZXMoaW5kaWNlcyk7XG5cblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlUG9zaXRpb25zKHBvc2l0aW9ucyk7XG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZVZlcnRleE5vcm1hbHMobm9ybWFscyk7XG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZVZlcnRleFRhbmdlbnRzKHRhbmdlbnRzKTtcblxuXHRcdH0gZWxzZSBpZiAoZ2VvbWV0cnlUeXBlID09IFwibGluZVN1Ykdlb21ldHJ5XCIpIHtcblx0XHRcdHZhciBsaW5lR2VvbWV0cnk6TGluZVN1Ykdlb21ldHJ5ID0gPExpbmVTdWJHZW9tZXRyeT4gdGFyZ2V0O1xuXG5cdFx0XHR2YXIgbnVtU2VnbWVudHM6bnVtYmVyID0gKHRoaXMuX3BTZWdtZW50c0ggKyAxKSoodGhpcy5fcFNlZ21lbnRzVykgKyB0aGlzLl9wU2VnbWVudHNXO1xuXHRcdFx0dmFyIHN0YXJ0UG9zaXRpb25zOkFycmF5PG51bWJlcj47XG5cdFx0XHR2YXIgZW5kUG9zaXRpb25zOkFycmF5PG51bWJlcj47XG5cdFx0XHR2YXIgdGhpY2tuZXNzOkFycmF5PG51bWJlcj47XG5cblx0XHRcdGlmIChsaW5lR2VvbWV0cnkuaW5kaWNlcyAhPSBudWxsICYmIG51bVNlZ21lbnRzID09IGxpbmVHZW9tZXRyeS5udW1TZWdtZW50cykge1xuXHRcdFx0XHRzdGFydFBvc2l0aW9ucyA9IGxpbmVHZW9tZXRyeS5zdGFydFBvc2l0aW9ucztcblx0XHRcdFx0ZW5kUG9zaXRpb25zID0gbGluZUdlb21ldHJ5LmVuZFBvc2l0aW9ucztcblx0XHRcdFx0dGhpY2tuZXNzID0gbGluZUdlb21ldHJ5LnRoaWNrbmVzcztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zID0gbmV3IEFycmF5PG51bWJlcj4obnVtU2VnbWVudHMqMyk7XG5cdFx0XHRcdGVuZFBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVNlZ21lbnRzKjMpO1xuXHRcdFx0XHR0aGlja25lc3MgPSBuZXcgQXJyYXk8bnVtYmVyPihudW1TZWdtZW50cyk7XG5cdFx0XHR9XG5cblx0XHRcdHZpZHggPSAwO1xuXG5cdFx0XHRmaWR4ID0gMDtcblxuXHRcdFx0Ly9ob3Jpem9uYWwgbGluZXNcblxuXHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9wU2VnbWVudHNIOyArK2opIHtcblx0XHRcdFx0cmFkaXVzID0gdGhpcy5fdG9wUmFkaXVzIC0gKChqL3RoaXMuX3BTZWdtZW50c0gpKih0aGlzLl90b3BSYWRpdXMgLSB0aGlzLl9wQm90dG9tUmFkaXVzKSk7XG5cdFx0XHRcdHogPSB0aGlzLl9oZWlnaHQqKGovdGhpcy5fcFNlZ21lbnRzSCAtIDAuNSk7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9wU2VnbWVudHNXOyArK2kpIHtcblx0XHRcdFx0XHQvLyByZXZvbHV0aW9uIHZlcnRleFxuXHRcdFx0XHRcdHJldm9sdXRpb25BbmdsZSA9IGkqcmV2b2x1dGlvbkFuZ2xlRGVsdGE7XG5cdFx0XHRcdFx0eCA9IHJhZGl1cypNYXRoLmNvcyhyZXZvbHV0aW9uQW5nbGUpO1xuXHRcdFx0XHRcdHkgPSByYWRpdXMqTWF0aC5zaW4ocmV2b2x1dGlvbkFuZ2xlKTtcblxuXHRcdFx0XHRcdGlmICh0aGlzLl95VXApIHtcblx0XHRcdFx0XHRcdGNvbXAxID0gLXo7XG5cdFx0XHRcdFx0XHRjb21wMiA9IHk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbXAxID0geTtcblx0XHRcdFx0XHRcdGNvbXAyID0gejtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4XSA9IHg7XG5cdFx0XHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gY29tcDE7XG5cdFx0XHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDJdID0gY29tcDI7XG5cblx0XHRcdFx0XHRcdHRoaWNrbmVzc1tmaWR4KytdID0gMTtcblxuXHRcdFx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdFx0XHQvL3ZlcnRpY2FsIGxpbmVzXG5cdFx0XHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4XSA9IGVuZFBvc2l0aW9uc1t2aWR4IC0gdGhpcy5fcFNlZ21lbnRzVyo2XTtcblx0XHRcdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAxXSA9IGVuZFBvc2l0aW9uc1t2aWR4ICsgMSAtIHRoaXMuX3BTZWdtZW50c1cqNl07XG5cdFx0XHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMl0gPSBlbmRQb3NpdGlvbnNbdmlkeCArIDIgLSB0aGlzLl9wU2VnbWVudHNXKjZdO1xuXG5cdFx0XHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeF0gPSB4O1xuXHRcdFx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAxXSA9IGNvbXAxO1xuXHRcdFx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAyXSA9IGNvbXAyO1xuXG5cdFx0XHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0XHRcdHZpZHggKz0gMztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaSA8IHRoaXMuX3BTZWdtZW50c1cpIHtcblx0XHRcdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHhdID0geDtcblx0XHRcdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAxXSA9IGNvbXAxO1xuXHRcdFx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDJdID0gY29tcDI7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGJ1aWxkIHJlYWwgZGF0YSBmcm9tIHJhdyBkYXRhXG5cdFx0XHRsaW5lR2VvbWV0cnkudXBkYXRlUG9zaXRpb25zKHN0YXJ0UG9zaXRpb25zLCBlbmRQb3NpdGlvbnMpO1xuXHRcdFx0bGluZUdlb21ldHJ5LnVwZGF0ZVRoaWNrbmVzcyh0aGlja25lc3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIF9wQnVpbGRVVnModGFyZ2V0OlN1Ykdlb21ldHJ5QmFzZSwgZ2VvbWV0cnlUeXBlOnN0cmluZylcblx0e1xuXHRcdHZhciBpOm51bWJlcjtcblx0XHR2YXIgajpudW1iZXI7XG5cdFx0dmFyIHg6bnVtYmVyO1xuXHRcdHZhciB5Om51bWJlcjtcblx0XHR2YXIgcmV2b2x1dGlvbkFuZ2xlOm51bWJlcjtcblx0XHR2YXIgdXZzOkFycmF5PG51bWJlcj47XG5cblx0XHRpZiAoZ2VvbWV0cnlUeXBlID09IFwidHJpYW5nbGVTdWJHZW9tZXRyeVwiKSB7XG5cblx0XHRcdHZhciB0cmlhbmdsZUdlb21ldHJ5OlRyaWFuZ2xlU3ViR2VvbWV0cnkgPSA8VHJpYW5nbGVTdWJHZW9tZXRyeT4gdGFyZ2V0O1xuXG5cdFx0XHQvLyBuZWVkIHRvIGluaXRpYWxpemUgcmF3IGFycmF5IG9yIGNhbiBiZSByZXVzZWQ/XG5cdFx0XHRpZiAodHJpYW5nbGVHZW9tZXRyeS51dnMgJiYgdGhpcy5fbnVtVmVydGljZXMgPT0gdHJpYW5nbGVHZW9tZXRyeS5udW1WZXJ0aWNlcykge1xuXHRcdFx0XHR1dnMgPSB0cmlhbmdsZUdlb21ldHJ5LnV2cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHV2cyA9IG5ldyBBcnJheTxudW1iZXI+KHRoaXMuX251bVZlcnRpY2VzKjIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBldmFsdWF0ZSByZXZvbHV0aW9uIHN0ZXBzXG5cdFx0XHR2YXIgcmV2b2x1dGlvbkFuZ2xlRGVsdGE6bnVtYmVyID0gMipNYXRoLlBJL3RoaXMuX3BTZWdtZW50c1c7XG5cblx0XHRcdC8vIGN1cnJlbnQgdXYgY29tcG9uZW50IGluZGV4XG5cdFx0XHR2YXIgaW5kZXg6bnVtYmVyID0gMDtcblxuXHRcdFx0Ly8gdG9wXG5cdFx0XHRpZiAodGhpcy5fdG9wQ2xvc2VkKSB7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPD0gdGhpcy5fcFNlZ21lbnRzVzsgKytpKSB7XG5cblx0XHRcdFx0XHRyZXZvbHV0aW9uQW5nbGUgPSBpKnJldm9sdXRpb25BbmdsZURlbHRhO1xuXHRcdFx0XHRcdHggPSAwLjUgKyAwLjUqIC1NYXRoLmNvcyhyZXZvbHV0aW9uQW5nbGUpO1xuXHRcdFx0XHRcdHkgPSAwLjUgKyAwLjUqTWF0aC5zaW4ocmV2b2x1dGlvbkFuZ2xlKTtcblxuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9IDAuNSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVTsgLy8gY2VudHJhbCB2ZXJ0ZXhcblx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSAwLjUqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVY7XG5cblx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSB4KnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVVOyAvLyByZXZvbHV0aW9uIHZlcnRleFxuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9IHkqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVY7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gYm90dG9tXG5cdFx0XHRpZiAodGhpcy5fYm90dG9tQ2xvc2VkKSB7XG5cdFx0XHRcdGZvciAoaSA9IDA7IGkgPD0gdGhpcy5fcFNlZ21lbnRzVzsgKytpKSB7XG5cblx0XHRcdFx0XHRyZXZvbHV0aW9uQW5nbGUgPSBpKnJldm9sdXRpb25BbmdsZURlbHRhO1xuXHRcdFx0XHRcdHggPSAwLjUgKyAwLjUqTWF0aC5jb3MocmV2b2x1dGlvbkFuZ2xlKTtcblx0XHRcdFx0XHR5ID0gMC41ICsgMC41Kk1hdGguc2luKHJldm9sdXRpb25BbmdsZSk7XG5cblx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSAwLjUqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVU7IC8vIGNlbnRyYWwgdmVydGV4XG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0gMC41KnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVWO1xuXG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0geCp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVTsgLy8gcmV2b2x1dGlvbiB2ZXJ0ZXhcblx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSB5KnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVWO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGxhdGVyYWwgc3VyZmFjZVxuXHRcdFx0aWYgKHRoaXMuX3N1cmZhY2VDbG9zZWQpIHtcblx0XHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9wU2VnbWVudHNIOyArK2opIHtcblx0XHRcdFx0XHRmb3IgKGkgPSAwOyBpIDw9IHRoaXMuX3BTZWdtZW50c1c7ICsraSkge1xuXHRcdFx0XHRcdFx0Ly8gcmV2b2x1dGlvbiB2ZXJ0ZXhcblx0XHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9ICggaS90aGlzLl9wU2VnbWVudHNXICkqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVU7XG5cdFx0XHRcdFx0XHR1dnNbaW5kZXgrK10gPSAoIGovdGhpcy5fcFNlZ21lbnRzSCApKnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVWO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBidWlsZCByZWFsIGRhdGEgZnJvbSByYXcgZGF0YVxuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVVVnModXZzKTtcblxuXHRcdH0gZWxzZSBpZiAoZ2VvbWV0cnlUeXBlID09IFwibGluZVN1Ykdlb21ldHJ5XCIpIHtcblx0XHRcdC8vbm90aGluZyB0byBkbyBoZXJlXG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCA9IFByaW1pdGl2ZUN5bGluZGVyUHJlZmFiOyJdfQ== \ No newline at end of file diff --git a/lib/prefabs/PrimitiveCylinderPrefab.ts b/lib/prefabs/PrimitiveCylinderPrefab.ts new file mode 100644 index 00000000..b123536a --- /dev/null +++ b/lib/prefabs/PrimitiveCylinderPrefab.ts @@ -0,0 +1,664 @@ +import LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** + * A Cylinder primitive mesh. + */ +class PrimitiveCylinderPrefab extends PrimitivePrefabBase implements IAsset +{ + public _pBottomRadius:number; + public _pSegmentsW:number; + public _pSegmentsH:number; + + private _topRadius:number; + private _height:number; + + private _topClosed:boolean; + private _bottomClosed:boolean; + private _surfaceClosed:boolean; + private _yUp:boolean; + private _numVertices:number = 0; + + /** + * The radius of the top end of the cylinder. + */ + public get topRadius():number + { + return this._topRadius; + } + + public set topRadius(value:number) + { + this._topRadius = value; + this._pInvalidateGeometry(); + } + + /** + * The radius of the bottom end of the cylinder. + */ + public get bottomRadius():number + { + return this._pBottomRadius; + } + + public set bottomRadius(value:number) + { + this._pBottomRadius = value; + this._pInvalidateGeometry(); + } + + /** + * The radius of the top end of the cylinder. + */ + public get height():number + { + return this._height; + } + + public set height(value:number) + { + this._height = value; + this._pInvalidateGeometry(); + } + + /** + * Defines the number of horizontal segments that make up the cylinder. Defaults to 16. + */ + public get segmentsW():number + { + return this._pSegmentsW; + } + + public set segmentsW(value:number) + { + this.setSegmentsW(value); + } + + public setSegmentsW(value:number) + { + this._pSegmentsW = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * Defines the number of vertical segments that make up the cylinder. Defaults to 1. + */ + public get segmentsH():number + { + return this._pSegmentsH; + } + + public set segmentsH(value:number) + { + + this.setSegmentsH(value) + + } + + public setSegmentsH(value:number) + { + this._pSegmentsH = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + + } + + /** + * Defines whether the top end of the cylinder is closed (true) or open. + */ + public get topClosed():boolean + { + return this._topClosed; + } + + public set topClosed(value:boolean) + { + this._topClosed = value; + this._pInvalidateGeometry(); + } + + /** + * Defines whether the bottom end of the cylinder is closed (true) or open. + */ + public get bottomClosed():boolean + { + return this._bottomClosed; + } + + public set bottomClosed(value:boolean) + { + this._bottomClosed = value; + this._pInvalidateGeometry(); + } + + /** + * Defines whether the cylinder poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + public get yUp():boolean + { + return this._yUp; + } + + public set yUp(value:boolean) + { + this._yUp = value; + this._pInvalidateGeometry(); + } + + /** + * Creates a new Cylinder object. + * @param topRadius The radius of the top end of the cylinder. + * @param bottomRadius The radius of the bottom end of the cylinder + * @param height The radius of the bottom end of the cylinder + * @param segmentsW Defines the number of horizontal segments that make up the cylinder. Defaults to 16. + * @param segmentsH Defines the number of vertical segments that make up the cylinder. Defaults to 1. + * @param topClosed Defines whether the top end of the cylinder is closed (true) or open. + * @param bottomClosed Defines whether the bottom end of the cylinder is closed (true) or open. + * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(topRadius:number = 50, bottomRadius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 1, topClosed:boolean = true, bottomClosed:boolean = true, surfaceClosed:boolean = true, yUp:boolean = true) + { + super(); + + this._topRadius = topRadius; + this._pBottomRadius = bottomRadius; + this._height = height; + this._pSegmentsW = segmentsW; + this._pSegmentsH = segmentsH; + this._topClosed = topClosed; + this._bottomClosed = bottomClosed; + this._surfaceClosed = surfaceClosed; + this._yUp = yUp; + } + + + /** + * @inheritDoc + */ + public _pBuildGeometry(target:SubGeometryBase, geometryType:string) + { + var indices:Array /*uint*/; + var positions:Array; + var normals:Array; + var tangents:Array; + + var i:number; + var j:number; + var x:number; + var y:number; + var z:number; + var vidx:number; + var fidx:number; + + var radius:number; + var revolutionAngle:number; + + var dr:number; + var latNormElev:number; + var latNormBase:number; + var numIndices:number = 0; + + var comp1:number; + var comp2:number; + var startIndex:number = 0; + var nextVertexIndex:number = 0; + + var t1:number; + var t2:number; + + // reset utility variables + this._numVertices = 0; + + // evaluate revolution steps + var revolutionAngleDelta:number = 2*Math.PI/this._pSegmentsW; + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + // evaluate target number of vertices, triangles and indices + if (this._surfaceClosed) { + this._numVertices += (this._pSegmentsH + 1)*(this._pSegmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of UV unwrapping + numIndices += this._pSegmentsH*this._pSegmentsW*6; // each level has segmentW quads, each of 2 triangles + } + if (this._topClosed) { + this._numVertices += 2*(this._pSegmentsW + 1); // segmentsW + 1 because of unwrapping + numIndices += this._pSegmentsW*3; // one triangle for each segment + } + if (this._bottomClosed) { + this._numVertices += 2*(this._pSegmentsW + 1); + numIndices += this._pSegmentsW*3; + } + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices) + positions = new Array(this._numVertices*3); + normals = new Array(this._numVertices*3); + tangents = new Array(this._numVertices*3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + // top + if (this._topClosed && this._topRadius > 0) { + + z = -0.5*this._height; + + for (i = 0; i <= this._pSegmentsW; ++i) { + // central vertex + if (this._yUp) { + t1 = 1; + t2 = 0; + comp1 = -z; + comp2 = 0; + + } else { + t1 = 0; + t2 = -1; + comp1 = 0; + comp2 = z; + } + + positions[vidx] = 0; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // revolution vertex + revolutionAngle = i*revolutionAngleDelta; + x = this._topRadius*Math.cos(revolutionAngle); + y = this._topRadius*Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex + 3]; + positions[vidx + 1] = positions[startIndex + 4]; + positions[vidx + 2] = positions[startIndex + 5]; + + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i > 0) { + // add triangle + indices[fidx++] = nextVertexIndex; + indices[fidx++] = nextVertexIndex + 1; + indices[fidx++] = nextVertexIndex + 2; + + nextVertexIndex += 2; + } + } + + nextVertexIndex += 2; + } + + // bottom + if (this._bottomClosed && this._pBottomRadius > 0) { + + z = 0.5*this._height; + + startIndex = nextVertexIndex*3; + + for (i = 0; i <= this._pSegmentsW; ++i) { + if (this._yUp) { + t1 = -1; + t2 = 0; + comp1 = -z; + comp2 = 0; + } else { + t1 = 0; + t2 = 1; + comp1 = 0; + comp2 = z; + } + + positions[vidx] = 0; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + // revolution vertex + revolutionAngle = i*revolutionAngleDelta; + x = this._pBottomRadius*Math.cos(revolutionAngle); + y = this._pBottomRadius*Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex + 3]; + positions[vidx + 1] = positions[startIndex + 4]; + positions[vidx + 2] = positions[startIndex + 5]; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = 0; + normals[vidx + 1] = t1; + normals[vidx + 2] = t2; + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + vidx += 3; + + if (i > 0) { + // add triangle + indices[fidx++] = nextVertexIndex; + indices[fidx++] = nextVertexIndex + 2; + indices[fidx++] = nextVertexIndex + 1; + + nextVertexIndex += 2; + } + } + + nextVertexIndex += 2; + } + + // The normals on the lateral surface all have the same incline, i.e. + // the "elevation" component (Y or Z depending on yUp) is constant. + // Same principle goes for the "base" of these vectors, which will be + // calculated such that a vector [base,elev] will be a unit vector. + dr = (this._pBottomRadius - this._topRadius); + latNormElev = dr/this._height; + latNormBase = (latNormElev == 0)? 1 : this._height/dr; + + // lateral surface + if (this._surfaceClosed) { + var a:number; + var b:number; + var c:number; + var d:number; + var na0:number, na1:number, naComp1:number, naComp2:number; + + for (j = 0; j <= this._pSegmentsH; ++j) { + radius = this._topRadius - ((j/this._pSegmentsH)*(this._topRadius - this._pBottomRadius)); + z = -(this._height/2) + (j/this._pSegmentsH*this._height); + + startIndex = nextVertexIndex*3; + + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + revolutionAngle = i*revolutionAngleDelta; + x = radius*Math.cos(revolutionAngle); + y = radius*Math.sin(revolutionAngle); + na0 = latNormBase*Math.cos(revolutionAngle); + na1 = latNormBase*Math.sin(revolutionAngle); + + if (this._yUp) { + t1 = 0; + t2 = -na0; + comp1 = -z; + comp2 = y; + naComp1 = latNormElev; + naComp2 = na1; + + } else { + t1 = -na0; + t2 = 0; + comp1 = y; + comp2 = z; + naComp1 = na1; + naComp2 = latNormElev; + } + + if (i == this._pSegmentsW) { + positions[vidx] = positions[startIndex]; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + normals[vidx] = na0; + normals[vidx + 1] = latNormElev; + normals[vidx + 2] = na1; + tangents[vidx] = na1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = na0; + normals[vidx + 1] = naComp1; + normals[vidx + 2] = naComp2; + tangents[vidx] = -na1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } + vidx += 3; + + // close triangle + if (i > 0 && j > 0) { + a = nextVertexIndex; // current + b = nextVertexIndex - 1; // previous + c = b - this._pSegmentsW - 1; // previous of last level + d = a - this._pSegmentsW - 1; // current of last level + + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + + nextVertexIndex++; + } + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + + } else if (geometryType == "lineSubGeometry") { + var lineGeometry:LineSubGeometry = target; + + var numSegments:number = (this._pSegmentsH + 1)*(this._pSegmentsW) + this._pSegmentsW; + var startPositions:Array; + var endPositions:Array; + var thickness:Array; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments*3); + endPositions = new Array(numSegments*3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + //horizonal lines + + for (j = 0; j <= this._pSegmentsH; ++j) { + radius = this._topRadius - ((j/this._pSegmentsH)*(this._topRadius - this._pBottomRadius)); + z = this._height*(j/this._pSegmentsH - 0.5); + + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + revolutionAngle = i*revolutionAngleDelta; + x = radius*Math.cos(revolutionAngle); + y = radius*Math.sin(revolutionAngle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i > 0) { + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + + //vertical lines + startPositions[vidx] = endPositions[vidx - this._pSegmentsW*6]; + startPositions[vidx + 1] = endPositions[vidx + 1 - this._pSegmentsW*6]; + startPositions[vidx + 2] = endPositions[vidx + 2 - this._pSegmentsW*6]; + + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + if (i < this._pSegmentsW) { + startPositions[vidx] = x; + startPositions[vidx + 1] = comp1; + startPositions[vidx + 2] = comp2; + } + } + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + } + + /** + * @inheritDoc + */ + public _pBuildUVs(target:SubGeometryBase, geometryType:string) + { + var i:number; + var j:number; + var x:number; + var y:number; + var revolutionAngle:number; + var uvs:Array; + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices*2); + } + + // evaluate revolution steps + var revolutionAngleDelta:number = 2*Math.PI/this._pSegmentsW; + + // current uv component index + var index:number = 0; + + // top + if (this._topClosed) { + for (i = 0; i <= this._pSegmentsW; ++i) { + + revolutionAngle = i*revolutionAngleDelta; + x = 0.5 + 0.5* -Math.cos(revolutionAngle); + y = 0.5 + 0.5*Math.sin(revolutionAngle); + + uvs[index++] = 0.5*triangleGeometry.scaleU; // central vertex + uvs[index++] = 0.5*triangleGeometry.scaleV; + + uvs[index++] = x*triangleGeometry.scaleU; // revolution vertex + uvs[index++] = y*triangleGeometry.scaleV; + } + } + + // bottom + if (this._bottomClosed) { + for (i = 0; i <= this._pSegmentsW; ++i) { + + revolutionAngle = i*revolutionAngleDelta; + x = 0.5 + 0.5*Math.cos(revolutionAngle); + y = 0.5 + 0.5*Math.sin(revolutionAngle); + + uvs[index++] = 0.5*triangleGeometry.scaleU; // central vertex + uvs[index++] = 0.5*triangleGeometry.scaleV; + + uvs[index++] = x*triangleGeometry.scaleU; // revolution vertex + uvs[index++] = y*triangleGeometry.scaleV; + } + } + + // lateral surface + if (this._surfaceClosed) { + for (j = 0; j <= this._pSegmentsH; ++j) { + for (i = 0; i <= this._pSegmentsW; ++i) { + // revolution vertex + uvs[index++] = ( i/this._pSegmentsW )*triangleGeometry.scaleU; + uvs[index++] = ( j/this._pSegmentsH )*triangleGeometry.scaleV; + } + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + } +} + +export = PrimitiveCylinderPrefab; \ No newline at end of file diff --git a/lib/prefabs/PrimitivePlanePrefab.js b/lib/prefabs/PrimitivePlanePrefab.js new file mode 100755 index 00000000..23ec8865 --- /dev/null +++ b/lib/prefabs/PrimitivePlanePrefab.js @@ -0,0 +1,376 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A Plane primitive mesh. +*/ +var PrimitivePlanePrefab = (function (_super) { + __extends(PrimitivePlanePrefab, _super); + /** + * Creates a new Plane object. + * @param width The width of the plane. + * @param height The height of the plane. + * @param segmentsW The number of segments that make up the plane along the X-axis. + * @param segmentsH The number of segments that make up the plane along the Y or Z-axis. + * @param yUp Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). + * @param doubleSided Defines whether the plane will be visible from both sides, with correct vertex normals. + */ + function PrimitivePlanePrefab(width, height, segmentsW, segmentsH, yUp, doubleSided) { + if (typeof width === "undefined") { width = 100; } + if (typeof height === "undefined") { height = 100; } + if (typeof segmentsW === "undefined") { segmentsW = 1; } + if (typeof segmentsH === "undefined") { segmentsH = 1; } + if (typeof yUp === "undefined") { yUp = true; } + if (typeof doubleSided === "undefined") { doubleSided = false; } + _super.call(this); + + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._yUp = yUp; + this._width = width; + this._height = height; + this._doubleSided = doubleSided; + } + Object.defineProperty(PrimitivePlanePrefab.prototype, "segmentsW", { + /** + * The number of segments that make up the plane along the X-axis. Defaults to 1. + */ + get: function () { + return this._segmentsW; + }, + set: function (value) { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "segmentsH", { + /** + * The number of segments that make up the plane along the Y or Z-axis, depending on whether yUp is true or + * false, respectively. Defaults to 1. + */ + get: function () { + return this._segmentsH; + }, + set: function (value) { + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "yUp", { + /** + * Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). Defaults to true. + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "doubleSided", { + /** + * Defines whether the plane will be visible from both sides, with correct vertex normals (as opposed to bothSides on Material). Defaults to false. + */ + get: function () { + return this._doubleSided; + }, + set: function (value) { + this._doubleSided = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "width", { + /** + * The width of the plane. + */ + get: function () { + return this._width; + }, + set: function (value) { + this._width = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePlanePrefab.prototype, "height", { + /** + * The height of the plane. + */ + get: function () { + return this._height; + }, + set: function (value) { + this._height = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitivePlanePrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var x, y; + var numIndices; + var base; + var tw = this._segmentsW + 1; + var numVertices; + + var vidx, fidx; + + var xi; + var yi; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + var numVertices = (this._segmentsH + 1) * tw; + var positions; + var normals; + var tangents; + + if (this._doubleSided) + numVertices *= 2; + + numIndices = this._segmentsH * this._segmentsW * 6; + + if (this._doubleSided) + numIndices *= 2; + + if (triangleGeometry.indices != null && numIndices == triangleGeometry.indices.length) { + indices = triangleGeometry.indices; + } else { + indices = new Array(numIndices); + + this._pInvalidateUVs(); + } + + if (numVertices == triangleGeometry.numVertices) { + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + positions = new Array(numVertices * 3); + normals = new Array(numVertices * 3); + tangents = new Array(numVertices * 3); + + this._pInvalidateUVs(); + } + + fidx = 0; + + vidx = 0; + + for (yi = 0; yi <= this._segmentsH; ++yi) { + for (xi = 0; xi <= this._segmentsW; ++xi) { + x = (xi / this._segmentsW - .5) * this._width; + y = (yi / this._segmentsH - .5) * this._height; + + positions[vidx] = x; + if (this._yUp) { + positions[vidx + 1] = 0; + positions[vidx + 2] = y; + } else { + positions[vidx + 1] = y; + positions[vidx + 2] = 0; + } + + normals[vidx] = 0; + + if (this._yUp) { + normals[vidx + 1] = 1; + normals[vidx + 2] = 0; + } else { + normals[vidx + 1] = 0; + normals[vidx + 2] = -1; + } + + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + + vidx += 3; + + // add vertex with same position, but with inverted normal & tangent + if (this._doubleSided) { + for (var i = vidx; i < vidx + 3; ++i) { + positions[i] = positions[i - 3]; + normals[i] = -normals[i - 3]; + tangents[i] = -tangents[i - 3]; + } + + vidx += 3; + } + + if (xi != this._segmentsW && yi != this._segmentsH) { + base = xi + yi * tw; + var mult = this._doubleSided ? 2 : 1; + + indices[fidx++] = base * mult; + indices[fidx++] = (base + tw) * mult; + indices[fidx++] = (base + tw + 1) * mult; + indices[fidx++] = base * mult; + indices[fidx++] = (base + tw + 1) * mult; + indices[fidx++] = (base + 1) * mult; + + if (this._doubleSided) { + indices[fidx++] = (base + tw + 1) * mult + 1; + indices[fidx++] = (base + tw) * mult + 1; + indices[fidx++] = base * mult + 1; + indices[fidx++] = (base + 1) * mult + 1; + indices[fidx++] = (base + tw + 1) * mult + 1; + indices[fidx++] = base * mult + 1; + } + } + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + var lineGeometry = target; + + var numSegments = (this._segmentsH + 1) + tw; + var startPositions; + var endPositions; + var thickness; + + var hw = this._width / 2; + var hh = this._height / 2; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments * 3); + endPositions = new Array(numSegments * 3); + thickness = new Array(numSegments); + } + + fidx = 0; + + vidx = 0; + + for (yi = 0; yi <= this._segmentsH; ++yi) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = 0; + startPositions[vidx + 2] = yi * this._height - hh; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = 0; + endPositions[vidx + 2] = yi * this._height - hh; + + thickness[fidx++] = 1; + + vidx += 3; + } + + for (xi = 0; xi <= this._segmentsW; ++xi) { + startPositions[vidx] = xi * this._width - hw; + startPositions[vidx + 1] = 0; + startPositions[vidx + 2] = -hh; + + endPositions[vidx] = xi * this._width - hw; + endPositions[vidx + 1] = 0; + endPositions[vidx + 2] = hh; + + thickness[fidx++] = 1; + + vidx += 3; + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + }; + + /** + * @inheritDoc + */ + PrimitivePlanePrefab.prototype._pBuildUVs = function (target, geometryType) { + var uvs; + var numVertices; + + if (geometryType == "triangleSubGeometry") { + numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); + + if (this._doubleSided) + numVertices *= 2; + + var triangleGeometry = target; + + if (triangleGeometry.uvs && numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices * 2); + this._pInvalidateGeometry(); + } + + var index = 0; + + for (var yi = 0; yi <= this._segmentsH; ++yi) { + for (var xi = 0; xi <= this._segmentsW; ++xi) { + uvs[index] = (xi / this._segmentsW) * triangleGeometry.scaleU; + uvs[index + 1] = (1 - yi / this._segmentsH) * triangleGeometry.scaleV; + index += 2; + + if (this._doubleSided) { + uvs[index] = (xi / this._segmentsW) * triangleGeometry.scaleU; + uvs[index + 1] = (1 - yi / this._segmentsH) * triangleGeometry.scaleV; + index += 2; + } + } + } + + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitivePlanePrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitivePlanePrefab; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlUGxhbmVQcmVmYWIudHMiXSwibmFtZXMiOlsiUHJpbWl0aXZlUGxhbmVQcmVmYWIiLCJQcmltaXRpdmVQbGFuZVByZWZhYi5jb25zdHJ1Y3RvciIsIlByaW1pdGl2ZVBsYW5lUHJlZmFiLl9wQnVpbGRHZW9tZXRyeSIsIlByaW1pdGl2ZVBsYW5lUHJlZmFiLl9wQnVpbGRVVnMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdGQUlxRjs7QUFFckY7O0VBRUc7QUFDSDtJQUFtQ0EsdUNBQW1CQTtJQWtCckRBOzs7Ozs7OztNQURHQTtJQUNIQSw4QkFBWUEsS0FBa0JBLEVBQUVBLE1BQW1CQSxFQUFFQSxTQUFvQkEsRUFBRUEsU0FBb0JBLEVBQUVBLEdBQWtCQSxFQUFFQSxXQUEyQkE7UUFBcElDLG9DQUFBQSxLQUFLQSxHQUFVQSxHQUFHQTtBQUFBQSxRQUFFQSxxQ0FBQUEsTUFBTUEsR0FBVUEsR0FBR0E7QUFBQUEsUUFBRUEsd0NBQUFBLFNBQVNBLEdBQVVBLENBQUNBO0FBQUFBLFFBQUVBLHdDQUFBQSxTQUFTQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUFFQSxrQ0FBQUEsR0FBR0EsR0FBV0EsSUFBSUE7QUFBQUEsUUFBRUEsMENBQUFBLFdBQVdBLEdBQVdBLEtBQUtBO0FBQUFBLFFBRy9JQSxXQUFNQSxLQUFBQSxDQUFDQTs7UUFFUEEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsU0FBU0E7UUFDM0JBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLFNBQVNBO1FBQzNCQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxHQUFHQTtRQUNmQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxLQUFLQTtRQUNuQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsTUFBTUE7UUFDckJBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLFdBQVdBO0lBRWhDQSxDQUFDQTtJQUtERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0Es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QUFDQSxFQUFFQSxFQUFFQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFFQTtvQkFDekNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLEVBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BO29CQUN6Q0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0E7O29CQUUxQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7b0JBQ25CQSxJQUFJQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFFQTt3QkFDZEEsU0FBU0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7d0JBQ3ZCQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtxQkFDdkJBLEtBQU1BO3dCQUNOQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTt3QkFDdkJBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO3FCQUN2QkE7O29CQUVEQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTs7b0JBRWpCQSxJQUFJQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFFQTt3QkFDZEEsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7d0JBQ3JCQSxPQUFPQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtxQkFDckJBLEtBQU1BO3dCQUNOQSxPQUFPQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTt3QkFDckJBLE9BQU9BLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO3FCQUN0QkE7O29CQUVEQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtvQkFDbEJBLFFBQVFBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO29CQUN0QkEsUUFBUUEsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O29CQUV0QkEsSUFBSUEsSUFBSUEsQ0FBQ0E7O29CQUVUQSxvRUFBb0VBO29CQUNwRUEsSUFBSUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBRUE7d0JBRXRCQSxLQUFLQSxJQUFJQSxDQUFDQSxHQUFVQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTs0QkFDNUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBOzRCQUMvQkEsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7NEJBQzVCQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTt5QkFDOUJBOzt3QkFFREEsSUFBSUEsSUFBSUEsQ0FBQ0E7cUJBRVRBOztvQkFFREEsSUFBSUEsRUFBRUEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsSUFBSUEsRUFBRUEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBRUE7d0JBRW5EQSxJQUFJQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFDQSxFQUFFQTt3QkFDakJBLElBQUlBLElBQUlBLEdBQVVBLElBQUlBLENBQUNBLFlBQVlBLEdBQUVBLENBQUNBLEdBQUdBLENBQUNBOzt3QkFFMUNBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO3dCQUMzQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUE7d0JBQ2xDQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQTt3QkFDdENBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLEdBQUNBLElBQUlBO3dCQUMzQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUE7d0JBQ3RDQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQTs7d0JBRWpDQSxJQUFJQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFFQTs0QkFFdEJBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLENBQUNBOzRCQUMxQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0E7NEJBQ3RDQSxPQUFPQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFDQSxJQUFJQSxHQUFHQSxDQUFDQTs0QkFDL0JBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLEdBQUdBLENBQUNBOzRCQUNyQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFB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QUFLQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxHQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BO3dCQUMvREEsS0FBS0EsSUFBSUEsQ0FBQ0E7cUJBQ1ZBO2lCQUNEQTthQUNEQTs7WUFFREEsZ0JBQWdCQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQTtTQUcvQkEsTUFBTUEsSUFBSUEsWUFBWUEsSUFBSUEsaUJBQWlCQSxDQUFFQTtZQUM3Q0Esb0JBQW9CQTtTQUNwQkE7SUFDRkEsQ0FBQ0E7SUFDRkgsNEJBQUNBO0FBQURBLENBQUNBLEVBcFhrQyxtQkFBbUIsRUFvWHJEOztBQUVELHFDQUE4QixDQUFBIiwiZmlsZSI6InByZWZhYnMvUHJpbWl0aXZlUGxhbmVQcmVmYWIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTGluZVN1Ykdlb21ldHJ5XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaW5lU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgU3ViR2VvbWV0cnlCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9TdWJHZW9tZXRyeUJhc2VcIik7XG5pbXBvcnQgVHJpYW5nbGVTdWJHZW9tZXRyeVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1RyaWFuZ2xlU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgSUFzc2V0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFByaW1pdGl2ZVByZWZhYkJhc2VcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3ByZWZhYnMvUHJpbWl0aXZlUHJlZmFiQmFzZVwiKTtcblxuLyoqXG4gKiBBIFBsYW5lIHByaW1pdGl2ZSBtZXNoLlxuICovXG5jbGFzcyBQcmltaXRpdmVQbGFuZVByZWZhYiBleHRlbmRzIFByaW1pdGl2ZVByZWZhYkJhc2UgaW1wbGVtZW50cyBJQXNzZXRcbntcblx0cHJpdmF0ZSBfc2VnbWVudHNXOm51bWJlcjtcblx0cHJpdmF0ZSBfc2VnbWVudHNIOm51bWJlcjtcblx0cHJpdmF0ZSBfeVVwOmJvb2xlYW47XG5cdHByaXZhdGUgX3dpZHRoOm51bWJlcjtcblx0cHJpdmF0ZSBfaGVpZ2h0Om51bWJlcjtcblx0cHJpdmF0ZSBfZG91YmxlU2lkZWQ6Ym9vbGVhbjtcblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBQbGFuZSBvYmplY3QuXG5cdCAqIEBwYXJhbSB3aWR0aCBUaGUgd2lkdGggb2YgdGhlIHBsYW5lLlxuXHQgKiBAcGFyYW0gaGVpZ2h0IFRoZSBoZWlnaHQgb2YgdGhlIHBsYW5lLlxuXHQgKiBAcGFyYW0gc2VnbWVudHNXIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBwbGFuZSBhbG9uZyB0aGUgWC1heGlzLlxuXHQgKiBAcGFyYW0gc2VnbWVudHNIIFRoZSBudW1iZXIgb2Ygc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBwbGFuZSBhbG9uZyB0aGUgWSBvciBaLWF4aXMuXG5cdCAqIEBwYXJhbSB5VXAgRGVmaW5lcyB3aGV0aGVyIHRoZSBub3JtYWwgdmVjdG9yIG9mIHRoZSBwbGFuZSBzaG91bGQgcG9pbnQgYWxvbmcgdGhlIFktYXhpcyAodHJ1ZSkgb3IgWi1heGlzIChmYWxzZSkuXG5cdCAqIEBwYXJhbSBkb3VibGVTaWRlZCBEZWZpbmVzIHdoZXRoZXIgdGhlIHBsYW5lIHdpbGwgYmUgdmlzaWJsZSBmcm9tIGJvdGggc2lkZXMsIHdpdGggY29ycmVjdCB2ZXJ0ZXggbm9ybWFscy5cblx0ICovXG5cdGNvbnN0cnVjdG9yKHdpZHRoOm51bWJlciA9IDEwMCwgaGVpZ2h0Om51bWJlciA9IDEwMCwgc2VnbWVudHNXOm51bWJlciA9IDEsIHNlZ21lbnRzSDpudW1iZXIgPSAxLCB5VXA6Ym9vbGVhbiA9IHRydWUsIGRvdWJsZVNpZGVkOmJvb2xlYW4gPSBmYWxzZSlcblx0e1xuXG5cdFx0c3VwZXIoKTtcblxuXHRcdHRoaXMuX3NlZ21lbnRzVyA9IHNlZ21lbnRzVztcblx0XHR0aGlzLl9zZWdtZW50c0ggPSBzZWdtZW50c0g7XG5cdFx0dGhpcy5feVVwID0geVVwO1xuXHRcdHRoaXMuX3dpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy5faGVpZ2h0ID0gaGVpZ2h0O1xuXHRcdHRoaXMuX2RvdWJsZVNpZGVkID0gZG91YmxlU2lkZWQ7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbnVtYmVyIG9mIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgcGxhbmUgYWxvbmcgdGhlIFgtYXhpcy4gRGVmYXVsdHMgdG8gMS5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2VnbWVudHNXKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VnbWVudHNXO1xuXHR9XG5cblx0cHVibGljIHNldCBzZWdtZW50c1codmFsdWU6bnVtYmVyKVxuXHR7XG5cblx0XHR0aGlzLl9zZWdtZW50c1cgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZVVWcygpO1xuXG5cdH1cblxuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIHBsYW5lIGFsb25nIHRoZSBZIG9yIFotYXhpcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeVVwIGlzIHRydWUgb3Jcblx0ICogZmFsc2UsIHJlc3BlY3RpdmVseS4gRGVmYXVsdHMgdG8gMS5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2VnbWVudHNIKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VnbWVudHNIO1xuXHR9XG5cblx0cHVibGljIHNldCBzZWdtZW50c0godmFsdWU6bnVtYmVyKVxuXHR7XG5cblx0XHR0aGlzLl9zZWdtZW50c0ggPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZVVWcygpO1xuXG5cdH1cblxuXHQvKipcblx0ICogIERlZmluZXMgd2hldGhlciB0aGUgbm9ybWFsIHZlY3RvciBvZiB0aGUgcGxhbmUgc2hvdWxkIHBvaW50IGFsb25nIHRoZSBZLWF4aXMgKHRydWUpIG9yIFotYXhpcyAoZmFsc2UpLiBEZWZhdWx0cyB0byB0cnVlLlxuXHQgKi9cblx0cHVibGljIGdldCB5VXAoKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5feVVwO1xuXHR9XG5cblx0cHVibGljIHNldCB5VXAodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdHRoaXMuX3lVcCA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgcGxhbmUgd2lsbCBiZSB2aXNpYmxlIGZyb20gYm90aCBzaWRlcywgd2l0aCBjb3JyZWN0IHZlcnRleCBub3JtYWxzIChhcyBvcHBvc2VkIHRvIGJvdGhTaWRlcyBvbiBNYXRlcmlhbCkuIERlZmF1bHRzIHRvIGZhbHNlLlxuXHQgKi9cblx0cHVibGljIGdldCBkb3VibGVTaWRlZCgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl9kb3VibGVTaWRlZDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgZG91YmxlU2lkZWQodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdHRoaXMuX2RvdWJsZVNpZGVkID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHdpZHRoIG9mIHRoZSBwbGFuZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgd2lkdGgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl93aWR0aDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgd2lkdGgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fd2lkdGggPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgaGVpZ2h0IG9mIHRoZSBwbGFuZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgaGVpZ2h0KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIHNldCBoZWlnaHQodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5faGVpZ2h0ID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfcEJ1aWxkR2VvbWV0cnkodGFyZ2V0OlN1Ykdlb21ldHJ5QmFzZSwgZ2VvbWV0cnlUeXBlOnN0cmluZylcblx0e1xuXHRcdHZhciBpbmRpY2VzOkFycmF5PG51bWJlcj4gLyp1aW50Ki87XG5cdFx0dmFyIHg6bnVtYmVyLCB5Om51bWJlcjtcblx0XHR2YXIgbnVtSW5kaWNlczpudW1iZXI7XG5cdFx0dmFyIGJhc2U6bnVtYmVyO1xuXHRcdHZhciB0dzpudW1iZXIgPSB0aGlzLl9zZWdtZW50c1cgKyAxO1xuXHRcdHZhciBudW1WZXJ0aWNlczpudW1iZXI7XG5cblx0XHR2YXIgdmlkeDpudW1iZXIsIGZpZHg6bnVtYmVyOyAvLyBpbmRpY2VzXG5cblx0XHR2YXIgeGk6bnVtYmVyO1xuXHRcdHZhciB5aTpudW1iZXI7XG5cblx0XHRpZiAoZ2VvbWV0cnlUeXBlID09IFwidHJpYW5nbGVTdWJHZW9tZXRyeVwiKSB7XG5cblx0XHRcdHZhciB0cmlhbmdsZUdlb21ldHJ5OlRyaWFuZ2xlU3ViR2VvbWV0cnkgPSA8VHJpYW5nbGVTdWJHZW9tZXRyeT4gdGFyZ2V0O1xuXG5cdFx0XHR2YXIgbnVtVmVydGljZXM6bnVtYmVyID0gKHRoaXMuX3NlZ21lbnRzSCArIDEpKnR3O1xuXHRcdFx0dmFyIHBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdFx0dmFyIG5vcm1hbHM6QXJyYXk8bnVtYmVyPjtcblx0XHRcdHZhciB0YW5nZW50czpBcnJheTxudW1iZXI+O1xuXG5cdFx0XHRpZiAodGhpcy5fZG91YmxlU2lkZWQpXG5cdFx0XHRcdG51bVZlcnRpY2VzICo9IDI7XG5cblx0XHRcdG51bUluZGljZXMgPSB0aGlzLl9zZWdtZW50c0gqdGhpcy5fc2VnbWVudHNXKjY7XG5cblx0XHRcdGlmICh0aGlzLl9kb3VibGVTaWRlZClcblx0XHRcdFx0bnVtSW5kaWNlcyAqPSAyO1xuXG5cdFx0XHRpZiAodHJpYW5nbGVHZW9tZXRyeS5pbmRpY2VzICE9IG51bGwgJiYgbnVtSW5kaWNlcyA9PSB0cmlhbmdsZUdlb21ldHJ5LmluZGljZXMubGVuZ3RoKSB7XG5cdFx0XHRcdGluZGljZXMgPSB0cmlhbmdsZUdlb21ldHJ5LmluZGljZXM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbmRpY2VzID0gbmV3IEFycmF5PG51bWJlcj4obnVtSW5kaWNlcyk7XG5cblx0XHRcdFx0dGhpcy5fcEludmFsaWRhdGVVVnMoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG51bVZlcnRpY2VzID09IHRyaWFuZ2xlR2VvbWV0cnkubnVtVmVydGljZXMpIHtcblx0XHRcdFx0cG9zaXRpb25zID0gdHJpYW5nbGVHZW9tZXRyeS5wb3NpdGlvbnM7XG5cdFx0XHRcdG5vcm1hbHMgPSB0cmlhbmdsZUdlb21ldHJ5LnZlcnRleE5vcm1hbHM7XG5cdFx0XHRcdHRhbmdlbnRzID0gdHJpYW5nbGVHZW9tZXRyeS52ZXJ0ZXhUYW5nZW50cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVZlcnRpY2VzKjMpO1xuXHRcdFx0XHRub3JtYWxzID0gbmV3IEFycmF5PG51bWJlcj4obnVtVmVydGljZXMqMyk7XG5cdFx0XHRcdHRhbmdlbnRzID0gbmV3IEFycmF5PG51bWJlcj4obnVtVmVydGljZXMqMyk7XG5cblx0XHRcdFx0dGhpcy5fcEludmFsaWRhdGVVVnMoKTtcblx0XHRcdH1cblxuXHRcdFx0ZmlkeCA9IDA7XG5cblx0XHRcdHZpZHggPSAwO1xuXG5cdFx0XHRmb3IgKHlpID0gMDsgeWkgPD0gdGhpcy5fc2VnbWVudHNIOyArK3lpKSB7XG5cblx0XHRcdFx0Zm9yICh4aSA9IDA7IHhpIDw9IHRoaXMuX3NlZ21lbnRzVzsgKyt4aSkge1xuXHRcdFx0XHRcdHggPSAoeGkvdGhpcy5fc2VnbWVudHNXIC0gLjUpKnRoaXMuX3dpZHRoO1xuXHRcdFx0XHRcdHkgPSAoeWkvdGhpcy5fc2VnbWVudHNIIC0gLjUpKnRoaXMuX2hlaWdodDtcblxuXHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4XSA9IHg7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX3lVcCkge1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAxXSA9IDA7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDJdID0geTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAxXSA9IHk7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDJdID0gMDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRub3JtYWxzW3ZpZHhdID0gMDtcblxuXHRcdFx0XHRcdGlmICh0aGlzLl95VXApIHtcblx0XHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDFdID0gMTtcblx0XHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDJdID0gMDtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bm9ybWFsc1t2aWR4ICsgMV0gPSAwO1xuXHRcdFx0XHRcdFx0bm9ybWFsc1t2aWR4ICsgMl0gPSAtMTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0YW5nZW50c1t2aWR4XSA9IDE7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeCArIDFdID0gMDtcblx0XHRcdFx0XHR0YW5nZW50c1t2aWR4ICsgMl0gPSAwO1xuXG5cdFx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdFx0Ly8gYWRkIHZlcnRleCB3aXRoIHNhbWUgcG9zaXRpb24sIGJ1dCB3aXRoIGludmVydGVkIG5vcm1hbCAmIHRhbmdlbnRcblx0XHRcdFx0XHRpZiAodGhpcy5fZG91YmxlU2lkZWQpIHtcblxuXHRcdFx0XHRcdFx0Zm9yICh2YXIgaTpudW1iZXIgPSB2aWR4OyBpIDwgdmlkeCArIDM7ICsraSkge1xuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbnNbaV0gPSBwb3NpdGlvbnNbaSAtIDNdO1xuXHRcdFx0XHRcdFx0XHRub3JtYWxzW2ldID0gLW5vcm1hbHNbaSAtIDNdO1xuXHRcdFx0XHRcdFx0XHR0YW5nZW50c1tpXSA9IC10YW5nZW50c1tpIC0gM107XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHZpZHggKz0gMztcblxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmICh4aSAhPSB0aGlzLl9zZWdtZW50c1cgJiYgeWkgIT0gdGhpcy5fc2VnbWVudHNIKSB7XG5cblx0XHRcdFx0XHRcdGJhc2UgPSB4aSArIHlpKnR3O1xuXHRcdFx0XHRcdFx0dmFyIG11bHQ6bnVtYmVyID0gdGhpcy5fZG91YmxlU2lkZWQ/IDIgOiAxO1xuXG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBiYXNlKm11bHQ7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSAoYmFzZSArIHR3KSptdWx0O1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gKGJhc2UgKyB0dyArIDEpKm11bHQ7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBiYXNlKm11bHQ7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSAoYmFzZSArIHR3ICsgMSkqbXVsdDtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IChiYXNlICsgMSkqbXVsdDtcblxuXHRcdFx0XHRcdFx0aWYgKHRoaXMuX2RvdWJsZVNpZGVkKSB7XG5cblx0XHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gKGJhc2UgKyB0dyArIDEpKm11bHQgKyAxO1xuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSAoYmFzZSArIHR3KSptdWx0ICsgMTtcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYmFzZSptdWx0ICsgMTtcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gKGJhc2UgKyAxKSptdWx0ICsgMTtcblx0XHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gKGJhc2UgKyB0dyArIDEpKm11bHQgKyAxO1xuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBiYXNlKm11bHQgKyAxO1xuXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlSW5kaWNlcyhpbmRpY2VzKTtcblxuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVQb3NpdGlvbnMocG9zaXRpb25zKTtcblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlVmVydGV4Tm9ybWFscyhub3JtYWxzKTtcblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlVmVydGV4VGFuZ2VudHModGFuZ2VudHMpO1xuXG5cdFx0fSBlbHNlIGlmIChnZW9tZXRyeVR5cGUgPT0gXCJsaW5lU3ViR2VvbWV0cnlcIikge1xuXHRcdFx0dmFyIGxpbmVHZW9tZXRyeTpMaW5lU3ViR2VvbWV0cnkgPSA8TGluZVN1Ykdlb21ldHJ5PiB0YXJnZXQ7XG5cblx0XHRcdHZhciBudW1TZWdtZW50czpudW1iZXIgPSAodGhpcy5fc2VnbWVudHNIICsgMSkgKyB0dztcblx0XHRcdHZhciBzdGFydFBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdFx0dmFyIGVuZFBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdFx0dmFyIHRoaWNrbmVzczpBcnJheTxudW1iZXI+O1xuXG5cdFx0XHR2YXIgaHc6bnVtYmVyID0gdGhpcy5fd2lkdGgvMjtcblx0XHRcdHZhciBoaDpudW1iZXIgPSB0aGlzLl9oZWlnaHQvMjtcblxuXG5cdFx0XHRpZiAobGluZUdlb21ldHJ5LmluZGljZXMgIT0gbnVsbCAmJiBudW1TZWdtZW50cyA9PSBsaW5lR2VvbWV0cnkubnVtU2VnbWVudHMpIHtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnMgPSBsaW5lR2VvbWV0cnkuc3RhcnRQb3NpdGlvbnM7XG5cdFx0XHRcdGVuZFBvc2l0aW9ucyA9IGxpbmVHZW9tZXRyeS5lbmRQb3NpdGlvbnM7XG5cdFx0XHRcdHRoaWNrbmVzcyA9IGxpbmVHZW9tZXRyeS50aGlja25lc3M7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGFydFBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVNlZ21lbnRzKjMpO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnMgPSBuZXcgQXJyYXk8bnVtYmVyPihudW1TZWdtZW50cyozKTtcblx0XHRcdFx0dGhpY2tuZXNzID0gbmV3IEFycmF5PG51bWJlcj4obnVtU2VnbWVudHMpO1xuXHRcdFx0fVxuXG5cdFx0XHRmaWR4ID0gMDtcblxuXHRcdFx0dmlkeCA9IDA7XG5cblx0XHRcdGZvciAoeWkgPSAwOyB5aSA8PSB0aGlzLl9zZWdtZW50c0g7ICsreWkpIHtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeF0gPSAtaHc7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAxXSA9IDA7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAyXSA9IHlpKnRoaXMuX2hlaWdodCAtIGhoO1xuXG5cdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4XSA9IGh3O1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gMDtcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAyXSA9IHlpKnRoaXMuX2hlaWdodCAtIGhoO1xuXG5cdFx0XHRcdHRoaWNrbmVzc1tmaWR4KytdID0gMTtcblxuXHRcdFx0XHR2aWR4ICs9IDM7XG5cdFx0XHR9XG5cblxuXHRcdFx0Zm9yICh4aSA9IDA7IHhpIDw9IHRoaXMuX3NlZ21lbnRzVzsgKyt4aSkge1xuXHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4XSA9IHhpKnRoaXMuX3dpZHRoIC0gaHc7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAxXSA9IDA7XG5cdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAyXSA9IC1oaDtcblxuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeF0gPSB4aSp0aGlzLl93aWR0aCAtIGh3O1xuXHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gMDtcblx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAyXSA9IGhoO1xuXG5cdFx0XHRcdHRoaWNrbmVzc1tmaWR4KytdID0gMTtcblxuXHRcdFx0XHR2aWR4ICs9IDM7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGJ1aWxkIHJlYWwgZGF0YSBmcm9tIHJhdyBkYXRhXG5cdFx0XHRsaW5lR2VvbWV0cnkudXBkYXRlUG9zaXRpb25zKHN0YXJ0UG9zaXRpb25zLCBlbmRQb3NpdGlvbnMpO1xuXHRcdFx0bGluZUdlb21ldHJ5LnVwZGF0ZVRoaWNrbmVzcyh0aGlja25lc3MpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIF9wQnVpbGRVVnModGFyZ2V0OlN1Ykdlb21ldHJ5QmFzZSwgZ2VvbWV0cnlUeXBlOnN0cmluZylcblx0e1xuXHRcdHZhciB1dnM6QXJyYXk8bnVtYmVyPjtcblx0XHR2YXIgbnVtVmVydGljZXM6bnVtYmVyO1xuXG5cdFx0aWYgKGdlb21ldHJ5VHlwZSA9PSBcInRyaWFuZ2xlU3ViR2VvbWV0cnlcIikge1xuXG5cdFx0XHRudW1WZXJ0aWNlcyA9ICggdGhpcy5fc2VnbWVudHNIICsgMSApKiggdGhpcy5fc2VnbWVudHNXICsgMSApO1xuXG5cdFx0XHRpZiAodGhpcy5fZG91YmxlU2lkZWQpXG5cdFx0XHRcdG51bVZlcnRpY2VzICo9IDI7XG5cblx0XHRcdHZhciB0cmlhbmdsZUdlb21ldHJ5OlRyaWFuZ2xlU3ViR2VvbWV0cnkgPSA8VHJpYW5nbGVTdWJHZW9tZXRyeT4gdGFyZ2V0O1xuXG5cdFx0XHRpZiAodHJpYW5nbGVHZW9tZXRyeS51dnMgJiYgbnVtVmVydGljZXMgPT0gdHJpYW5nbGVHZW9tZXRyeS5udW1WZXJ0aWNlcykge1xuXHRcdFx0XHR1dnMgPSB0cmlhbmdsZUdlb21ldHJ5LnV2cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHV2cyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVZlcnRpY2VzKjIpO1xuXHRcdFx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KClcblx0XHRcdH1cblxuXHRcdFx0dmFyIGluZGV4Om51bWJlciA9IDA7XG5cblx0XHRcdGZvciAodmFyIHlpOm51bWJlciA9IDA7IHlpIDw9IHRoaXMuX3NlZ21lbnRzSDsgKyt5aSkge1xuXG5cdFx0XHRcdGZvciAodmFyIHhpOm51bWJlciA9IDA7IHhpIDw9IHRoaXMuX3NlZ21lbnRzVzsgKyt4aSkge1xuXHRcdFx0XHRcdHV2c1tpbmRleF0gPSAoeGkvdGhpcy5fc2VnbWVudHNXKSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVTtcblx0XHRcdFx0XHR1dnNbaW5kZXggKyAxXSA9ICgxIC0geWkvdGhpcy5fc2VnbWVudHNIKSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVjtcblx0XHRcdFx0XHRpbmRleCArPSAyO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuX2RvdWJsZVNpZGVkKSB7XG5cdFx0XHRcdFx0XHR1dnNbaW5kZXhdID0gKHhpL3RoaXMuX3NlZ21lbnRzVykqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVU7XG5cdFx0XHRcdFx0XHR1dnNbaW5kZXgrMV0gPSAoMSAtIHlpL3RoaXMuX3NlZ21lbnRzSCkqdHJpYW5nbGVHZW9tZXRyeS5zY2FsZVY7XG5cdFx0XHRcdFx0XHRpbmRleCArPSAyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZVVWcyh1dnMpO1xuXG5cblx0XHR9IGVsc2UgaWYgKGdlb21ldHJ5VHlwZSA9PSBcImxpbmVTdWJHZW9tZXRyeVwiKSB7XG5cdFx0XHQvL25vdGhpbmcgdG8gZG8gaGVyZVxuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgPSBQcmltaXRpdmVQbGFuZVByZWZhYjsiXX0= \ No newline at end of file diff --git a/lib/prefabs/PrimitivePlanePrefab.ts b/lib/prefabs/PrimitivePlanePrefab.ts new file mode 100644 index 00000000..be3eff86 --- /dev/null +++ b/lib/prefabs/PrimitivePlanePrefab.ts @@ -0,0 +1,384 @@ +import LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** + * A Plane primitive mesh. + */ +class PrimitivePlanePrefab extends PrimitivePrefabBase implements IAsset +{ + private _segmentsW:number; + private _segmentsH:number; + private _yUp:boolean; + private _width:number; + private _height:number; + private _doubleSided:boolean; + + /** + * Creates a new Plane object. + * @param width The width of the plane. + * @param height The height of the plane. + * @param segmentsW The number of segments that make up the plane along the X-axis. + * @param segmentsH The number of segments that make up the plane along the Y or Z-axis. + * @param yUp Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). + * @param doubleSided Defines whether the plane will be visible from both sides, with correct vertex normals. + */ + constructor(width:number = 100, height:number = 100, segmentsW:number = 1, segmentsH:number = 1, yUp:boolean = true, doubleSided:boolean = false) + { + + super(); + + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._yUp = yUp; + this._width = width; + this._height = height; + this._doubleSided = doubleSided; + + } + + /** + * The number of segments that make up the plane along the X-axis. Defaults to 1. + */ + public get segmentsW():number + { + return this._segmentsW; + } + + public set segmentsW(value:number) + { + + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + + } + + /** + * The number of segments that make up the plane along the Y or Z-axis, depending on whether yUp is true or + * false, respectively. Defaults to 1. + */ + public get segmentsH():number + { + return this._segmentsH; + } + + public set segmentsH(value:number) + { + + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + + } + + /** + * Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). Defaults to true. + */ + public get yUp():boolean + { + return this._yUp; + } + + public set yUp(value:boolean) + { + this._yUp = value; + + this._pInvalidateGeometry(); + } + + /** + * Defines whether the plane will be visible from both sides, with correct vertex normals (as opposed to bothSides on Material). Defaults to false. + */ + public get doubleSided():boolean + { + return this._doubleSided; + } + + public set doubleSided(value:boolean) + { + this._doubleSided = value; + + this._pInvalidateGeometry(); + } + + /** + * The width of the plane. + */ + public get width():number + { + return this._width; + } + + public set width(value:number) + { + this._width = value; + + this._pInvalidateGeometry(); + } + + /** + * The height of the plane. + */ + public get height():number + { + return this._height; + } + + public set height(value:number) + { + this._height = value; + + this._pInvalidateGeometry(); + } + + /** + * @inheritDoc + */ + public _pBuildGeometry(target:SubGeometryBase, geometryType:string) + { + var indices:Array /*uint*/; + var x:number, y:number; + var numIndices:number; + var base:number; + var tw:number = this._segmentsW + 1; + var numVertices:number; + + var vidx:number, fidx:number; // indices + + var xi:number; + var yi:number; + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + var numVertices:number = (this._segmentsH + 1)*tw; + var positions:Array; + var normals:Array; + var tangents:Array; + + if (this._doubleSided) + numVertices *= 2; + + numIndices = this._segmentsH*this._segmentsW*6; + + if (this._doubleSided) + numIndices *= 2; + + if (triangleGeometry.indices != null && numIndices == triangleGeometry.indices.length) { + indices = triangleGeometry.indices; + } else { + indices = new Array(numIndices); + + this._pInvalidateUVs(); + } + + if (numVertices == triangleGeometry.numVertices) { + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + positions = new Array(numVertices*3); + normals = new Array(numVertices*3); + tangents = new Array(numVertices*3); + + this._pInvalidateUVs(); + } + + fidx = 0; + + vidx = 0; + + for (yi = 0; yi <= this._segmentsH; ++yi) { + + for (xi = 0; xi <= this._segmentsW; ++xi) { + x = (xi/this._segmentsW - .5)*this._width; + y = (yi/this._segmentsH - .5)*this._height; + + positions[vidx] = x; + if (this._yUp) { + positions[vidx + 1] = 0; + positions[vidx + 2] = y; + } else { + positions[vidx + 1] = y; + positions[vidx + 2] = 0; + } + + normals[vidx] = 0; + + if (this._yUp) { + normals[vidx + 1] = 1; + normals[vidx + 2] = 0; + } else { + normals[vidx + 1] = 0; + normals[vidx + 2] = -1; + } + + tangents[vidx] = 1; + tangents[vidx + 1] = 0; + tangents[vidx + 2] = 0; + + vidx += 3; + + // add vertex with same position, but with inverted normal & tangent + if (this._doubleSided) { + + for (var i:number = vidx; i < vidx + 3; ++i) { + positions[i] = positions[i - 3]; + normals[i] = -normals[i - 3]; + tangents[i] = -tangents[i - 3]; + } + + vidx += 3; + + } + + if (xi != this._segmentsW && yi != this._segmentsH) { + + base = xi + yi*tw; + var mult:number = this._doubleSided? 2 : 1; + + indices[fidx++] = base*mult; + indices[fidx++] = (base + tw)*mult; + indices[fidx++] = (base + tw + 1)*mult; + indices[fidx++] = base*mult; + indices[fidx++] = (base + tw + 1)*mult; + indices[fidx++] = (base + 1)*mult; + + if (this._doubleSided) { + + indices[fidx++] = (base + tw + 1)*mult + 1; + indices[fidx++] = (base + tw)*mult + 1; + indices[fidx++] = base*mult + 1; + indices[fidx++] = (base + 1)*mult + 1; + indices[fidx++] = (base + tw + 1)*mult + 1; + indices[fidx++] = base*mult + 1; + + } + } + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + + } else if (geometryType == "lineSubGeometry") { + var lineGeometry:LineSubGeometry = target; + + var numSegments:number = (this._segmentsH + 1) + tw; + var startPositions:Array; + var endPositions:Array; + var thickness:Array; + + var hw:number = this._width/2; + var hh:number = this._height/2; + + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments*3); + endPositions = new Array(numSegments*3); + thickness = new Array(numSegments); + } + + fidx = 0; + + vidx = 0; + + for (yi = 0; yi <= this._segmentsH; ++yi) { + startPositions[vidx] = -hw; + startPositions[vidx + 1] = 0; + startPositions[vidx + 2] = yi*this._height - hh; + + endPositions[vidx] = hw; + endPositions[vidx + 1] = 0; + endPositions[vidx + 2] = yi*this._height - hh; + + thickness[fidx++] = 1; + + vidx += 3; + } + + + for (xi = 0; xi <= this._segmentsW; ++xi) { + startPositions[vidx] = xi*this._width - hw; + startPositions[vidx + 1] = 0; + startPositions[vidx + 2] = -hh; + + endPositions[vidx] = xi*this._width - hw; + endPositions[vidx + 1] = 0; + endPositions[vidx + 2] = hh; + + thickness[fidx++] = 1; + + vidx += 3; + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + } + + /** + * @inheritDoc + */ + public _pBuildUVs(target:SubGeometryBase, geometryType:string) + { + var uvs:Array; + var numVertices:number; + + if (geometryType == "triangleSubGeometry") { + + numVertices = ( this._segmentsH + 1 )*( this._segmentsW + 1 ); + + if (this._doubleSided) + numVertices *= 2; + + var triangleGeometry:TriangleSubGeometry = target; + + if (triangleGeometry.uvs && numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices*2); + this._pInvalidateGeometry() + } + + var index:number = 0; + + for (var yi:number = 0; yi <= this._segmentsH; ++yi) { + + for (var xi:number = 0; xi <= this._segmentsW; ++xi) { + uvs[index] = (xi/this._segmentsW)*triangleGeometry.scaleU; + uvs[index + 1] = (1 - yi/this._segmentsH)*triangleGeometry.scaleV; + index += 2; + + if (this._doubleSided) { + uvs[index] = (xi/this._segmentsW)*triangleGeometry.scaleU; + uvs[index+1] = (1 - yi/this._segmentsH)*triangleGeometry.scaleV; + index += 2; + } + } + } + + triangleGeometry.updateUVs(uvs); + + + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + } +} + +export = PrimitivePlanePrefab; \ No newline at end of file diff --git a/lib/prefabs/PrimitivePolygonPrefab.js b/lib/prefabs/PrimitivePolygonPrefab.js new file mode 100755 index 00000000..8468bae2 --- /dev/null +++ b/lib/prefabs/PrimitivePolygonPrefab.js @@ -0,0 +1,76 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitiveCylinderPrefab = require("awayjs-core/lib/prefabs/PrimitiveCylinderPrefab"); + +/** +* A UV RegularPolygon primitive mesh. +*/ +var PrimitivePolygonPrefab = (function (_super) { + __extends(PrimitivePolygonPrefab, _super); + /** + * Creates a new RegularPolygon disc object. + * @param radius The radius of the regular polygon + * @param sides Defines the number of sides of the regular polygon. + * @param yUp Defines whether the regular polygon should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitivePolygonPrefab(radius, sides, yUp) { + if (typeof radius === "undefined") { radius = 100; } + if (typeof sides === "undefined") { sides = 16; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this, radius, 0, 0, sides, 1, true, false, false, yUp); + } + Object.defineProperty(PrimitivePolygonPrefab.prototype, "radius", { + /** + * The radius of the regular polygon. + */ + get: function () { + return this._pBottomRadius; + }, + set: function (value) { + this._pBottomRadius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePolygonPrefab.prototype, "sides", { + /** + * The number of sides of the regular polygon. + */ + get: function () { + return this._pSegmentsW; + }, + set: function (value) { + this.setSegmentsW(value); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePolygonPrefab.prototype, "subdivisions", { + /** + * The number of subdivisions from the edge to the center of the regular polygon. + */ + get: function () { + return this._pSegmentsH; + }, + set: function (value) { + this.setSegmentsH(value); + }, + enumerable: true, + configurable: true + }); + + return PrimitivePolygonPrefab; +})(PrimitiveCylinderPrefab); + +module.exports = PrimitivePolygonPrefab; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlUG9seWdvblByZWZhYi50cyJdLCJuYW1lcyI6WyJQcmltaXRpdmVQb2x5Z29uUHJlZmFiIiwiUHJpbWl0aXZlUG9seWdvblByZWZhYi5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsd0ZBQzRGOztBQUU1Rjs7RUFFRztBQUNIO0lBQXFDQSx5Q0FBdUJBO0lBaUQzREE7Ozs7O01BREdBO0lBQ0hBLGdDQUFZQSxNQUFtQkEsRUFBRUEsS0FBaUJBLEVBQUVBLEdBQWtCQTtRQUExREMscUNBQUFBLE1BQU1BLEdBQVVBLEdBQUdBO0FBQUFBLFFBQUVBLG9DQUFBQSxLQUFLQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUFFQSxrQ0FBQUEsR0FBR0EsR0FBV0EsSUFBSUE7QUFBQUEsUUFFckVBLFdBQU1BLE9BQUFBLE1BQU1BLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLEtBQUtBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLEVBQUVBLEtBQUtBLEVBQUVBLEtBQUtBLEVBQUVBLEdBQUdBLENBQUNBO0lBQ3ZEQSxDQUFDQTtJQTlDREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGNBQWNBO1FBQzNCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFrQkEsS0FBWUE7WUFFN0JBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLEtBQUtBO1lBQzNCQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBO1FBQzVCQSxDQUFDQTs7OztBQU5BQTs7SUFXREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFdBQVdBO1FBQ3hCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFpQkEsS0FBWUE7WUFFNUJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEtBQUtBLENBQUNBO1FBQ3pCQSxDQUFDQTs7OztBQUxBQTs7SUFVREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFdBQVdBO1FBQ3hCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUF3QkEsS0FBWUE7WUFFbkNBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEtBQUtBLENBQUNBO1FBQ3pCQSxDQUFDQTs7OztBQUxBQTtJQWlCRkEsOEJBQUNBO0FBQURBLENBQUNBLEVBckRvQyx1QkFBdUIsRUFxRDNEOztBQUVELHVDQUFnQyxDQUFBIiwiZmlsZSI6InByZWZhYnMvUHJpbWl0aXZlUG9seWdvblByZWZhYi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJQXNzZXRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5pbXBvcnQgUHJpbWl0aXZlQ3lsaW5kZXJQcmVmYWJcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcmVmYWJzL1ByaW1pdGl2ZUN5bGluZGVyUHJlZmFiXCIpO1xuXG4vKipcbiAqIEEgVVYgUmVndWxhclBvbHlnb24gcHJpbWl0aXZlIG1lc2guXG4gKi9cbmNsYXNzIFByaW1pdGl2ZVBvbHlnb25QcmVmYWIgZXh0ZW5kcyBQcmltaXRpdmVDeWxpbmRlclByZWZhYiBpbXBsZW1lbnRzIElBc3NldFxue1xuXG5cdC8qKlxuXHQgKiBUaGUgcmFkaXVzIG9mIHRoZSByZWd1bGFyIHBvbHlnb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHJhZGl1cygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BCb3R0b21SYWRpdXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHJhZGl1cyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9wQm90dG9tUmFkaXVzID0gdmFsdWU7XG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBudW1iZXIgb2Ygc2lkZXMgb2YgdGhlIHJlZ3VsYXIgcG9seWdvbi5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2lkZXMoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wU2VnbWVudHNXO1xuXHR9XG5cblx0cHVibGljIHNldCBzaWRlcyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLnNldFNlZ21lbnRzVyh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIG51bWJlciBvZiBzdWJkaXZpc2lvbnMgZnJvbSB0aGUgZWRnZSB0byB0aGUgY2VudGVyIG9mIHRoZSByZWd1bGFyIHBvbHlnb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHN1YmRpdmlzaW9ucygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BTZWdtZW50c0g7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHN1YmRpdmlzaW9ucyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLnNldFNlZ21lbnRzSCh2YWx1ZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBSZWd1bGFyUG9seWdvbiBkaXNjIG9iamVjdC5cblx0ICogQHBhcmFtIHJhZGl1cyBUaGUgcmFkaXVzIG9mIHRoZSByZWd1bGFyIHBvbHlnb25cblx0ICogQHBhcmFtIHNpZGVzIERlZmluZXMgdGhlIG51bWJlciBvZiBzaWRlcyBvZiB0aGUgcmVndWxhciBwb2x5Z29uLlxuXHQgKiBAcGFyYW0geVVwIERlZmluZXMgd2hldGhlciB0aGUgcmVndWxhciBwb2x5Z29uIHNob3VsZCBsYXkgb24gdGhlIFktYXhpcyAodHJ1ZSkgb3Igb24gdGhlIFotYXhpcyAoZmFsc2UpLlxuXHQgKi9cblx0Y29uc3RydWN0b3IocmFkaXVzOm51bWJlciA9IDEwMCwgc2lkZXM6bnVtYmVyID0gMTYsIHlVcDpib29sZWFuID0gdHJ1ZSlcblx0e1xuXHRcdHN1cGVyKHJhZGl1cywgMCwgMCwgc2lkZXMsIDEsIHRydWUsIGZhbHNlLCBmYWxzZSwgeVVwKTtcblx0fVxufVxuXG5leHBvcnQgPSBQcmltaXRpdmVQb2x5Z29uUHJlZmFiOyJdfQ== \ No newline at end of file diff --git a/lib/prefabs/PrimitivePolygonPrefab.ts b/lib/prefabs/PrimitivePolygonPrefab.ts new file mode 100644 index 00000000..f5c2207d --- /dev/null +++ b/lib/prefabs/PrimitivePolygonPrefab.ts @@ -0,0 +1,62 @@ +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import PrimitiveCylinderPrefab = require("awayjs-core/lib/prefabs/PrimitiveCylinderPrefab"); + +/** + * A UV RegularPolygon primitive mesh. + */ +class PrimitivePolygonPrefab extends PrimitiveCylinderPrefab implements IAsset +{ + + /** + * The radius of the regular polygon. + */ + public get radius():number + { + return this._pBottomRadius; + } + + public set radius(value:number) + { + this._pBottomRadius = value; + this._pInvalidateGeometry(); + } + + /** + * The number of sides of the regular polygon. + */ + public get sides():number + { + return this._pSegmentsW; + } + + public set sides(value:number) + { + this.setSegmentsW(value); + } + + /** + * The number of subdivisions from the edge to the center of the regular polygon. + */ + public get subdivisions():number + { + return this._pSegmentsH; + } + + public set subdivisions(value:number) + { + this.setSegmentsH(value); + } + + /** + * Creates a new RegularPolygon disc object. + * @param radius The radius of the regular polygon + * @param sides Defines the number of sides of the regular polygon. + * @param yUp Defines whether the regular polygon should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius:number = 100, sides:number = 16, yUp:boolean = true) + { + super(radius, 0, 0, sides, 1, true, false, false, yUp); + } +} + +export = PrimitivePolygonPrefab; \ No newline at end of file diff --git a/lib/prefabs/PrimitivePrefabBase.js b/lib/prefabs/PrimitivePrefabBase.js new file mode 100755 index 00000000..85c6c7af --- /dev/null +++ b/lib/prefabs/PrimitivePrefabBase.js @@ -0,0 +1,203 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Geometry = require("awayjs-core/lib/core/base/Geometry"); + +var TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +var LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +var AssetType = require("awayjs-core/lib/core/library/AssetType"); +var Mesh = require("awayjs-core/lib/entities/Mesh"); +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var PrefabBase = require("awayjs-core/lib/prefabs/PrefabBase"); + +/** +* PrimitivePrefabBase is an abstract base class for polytope prefabs, which are simple pre-built geometric shapes +*/ +var PrimitivePrefabBase = (function (_super) { + __extends(PrimitivePrefabBase, _super); + /** + * Creates a new PrimitivePrefabBase object. + * + * @param material The material with which to render the object + */ + function PrimitivePrefabBase(material, geometryType) { + if (typeof material === "undefined") { material = null; } + if (typeof geometryType === "undefined") { geometryType = "triangleSubGeometry"; } + _super.call(this); + this._geomDirty = true; + this._uvDirty = true; + this._geometryTypeDirty = true; + + this._geometry = new Geometry(); + this._material = material; + this._geometryType = geometryType; + } + Object.defineProperty(PrimitivePrefabBase.prototype, "assetType", { + /** + * + */ + get: function () { + return AssetType.PRIMITIVE_PREFAB; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(PrimitivePrefabBase.prototype, "geometryType", { + /** + * + */ + get: function () { + return this._geometryType; + }, + set: function (value) { + if (this._geometryType == value) + return; + + this._geometryType = value; + + this.invalidateGeometryType(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitivePrefabBase.prototype, "geometry", { + get: function () { + this._iValidate(); + + return this._geometry; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(PrimitivePrefabBase.prototype, "material", { + /** + * The material with which to render the primitive. + */ + get: function () { + return this._material; + }, + set: function (value) { + if (value == this._material) + return; + + this._material = value; + + var len = this._pObjects.length; + for (var i = 0; i < len; i++) + this._pObjects[i].material = this._material; + }, + enumerable: true, + configurable: true + }); + + + /** + * Builds the primitive's geometry when invalid. This method should not be called directly. The calling should + * be triggered by the invalidateGeometry method (and in turn by updateGeometry). + */ + PrimitivePrefabBase.prototype._pBuildGeometry = function (target, geometryType) { + throw new AbstractMethodError(); + }; + + /** + * Builds the primitive's uv coordinates when invalid. This method should not be called directly. The calling + * should be triggered by the invalidateUVs method (and in turn by updateUVs). + */ + PrimitivePrefabBase.prototype._pBuildUVs = function (target, geometryType) { + throw new AbstractMethodError(); + }; + + /** + * Invalidates the primitive's geometry type, causing it to be updated when requested. + */ + PrimitivePrefabBase.prototype.invalidateGeometryType = function () { + this._geometryTypeDirty = true; + this._geomDirty = true; + this._uvDirty = true; + }; + + /** + * Invalidates the primitive's geometry, causing it to be updated when requested. + */ + PrimitivePrefabBase.prototype._pInvalidateGeometry = function () { + this._geomDirty = true; + }; + + /** + * Invalidates the primitive's uv coordinates, causing them to be updated when requested. + */ + PrimitivePrefabBase.prototype._pInvalidateUVs = function () { + this._uvDirty = true; + }; + + /** + * Updates the subgeometry when invalid. + */ + PrimitivePrefabBase.prototype.updateGeometryType = function () { + //remove any existing sub geometry + if (this._subGeometry) + this._geometry.removeSubGeometry(this._subGeometry); + + if (this._geometryType == "triangleSubGeometry") { + var triangleGeometry = new TriangleSubGeometry(true); + triangleGeometry.autoDeriveNormals = false; + triangleGeometry.autoDeriveTangents = false; + triangleGeometry.autoDeriveUVs = false; + this._geometry.addSubGeometry(triangleGeometry); + this._subGeometry = triangleGeometry; + } else if (this._geometryType == "lineSubGeometry") { + this._geometry.addSubGeometry(this._subGeometry = new LineSubGeometry()); + } + + this._geometryTypeDirty = false; + }; + + /** + * Updates the geometry when invalid. + */ + PrimitivePrefabBase.prototype.updateGeometry = function () { + this._pBuildGeometry(this._subGeometry, this._geometryType); + + this._geomDirty = false; + }; + + /** + * Updates the uv coordinates when invalid. + */ + PrimitivePrefabBase.prototype.updateUVs = function () { + this._pBuildUVs(this._subGeometry, this._geometryType); + + this._uvDirty = false; + }; + + PrimitivePrefabBase.prototype._iValidate = function () { + if (this._geometryTypeDirty) + this.updateGeometryType(); + + if (this._geomDirty) + this.updateGeometry(); + + if (this._uvDirty) + this.updateUVs(); + }; + + PrimitivePrefabBase.prototype._pCreateObject = function () { + var mesh = new Mesh(this._geometry, this._material); + mesh._iSourcePrefab = this; + + return mesh; + }; + return PrimitivePrefabBase; +})(PrefabBase); + +module.exports = PrimitivePrefabBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlUHJlZmFiQmFzZS50cyJdLCJuYW1lcyI6WyJQcmltaXRpdmVQcmVmYWJCYXNlIiwiUHJpbWl0aXZlUHJlZmFiQmFzZS5jb25zdHJ1Y3RvciIsIlByaW1pdGl2ZVByZWZhYkJhc2UuX3BCdWlsZEdlb21ldHJ5IiwiUHJpbWl0aXZlUHJlZmFiQmFzZS5fcEJ1aWxkVVZzIiwiUHJpbWl0aXZlUHJlZmFiQmFzZS5pbnZhbGlkYXRlR2VvbWV0cnlUeXBlIiwiUHJpbWl0aXZlUHJlZmFiQmFzZS5fcEludmFsaWRhdGVHZW9tZXRyeSIsIlByaW1pdGl2ZVByZWZhYkJhc2UuX3BJbnZhbGlkYXRlVVZzIiwiUHJpbWl0aXZlUHJlZmFiQmFzZS51cGRhdGVHZW9tZXRyeVR5cGUiLCJQcmltaXRpdmVQcmVmYWJCYXNlLnVwZGF0ZUdlb21ldHJ5IiwiUHJpbWl0aXZlUHJlZmFiQmFzZS51cGRhdGVVVnMiLCJQcmltaXRpdmVQcmVmYWJCYXNlLl9pVmFsaWRhdGUiLCJQcmltaXRpdmVQcmVmYWJCYXNlLl9wQ3JlYXRlT2JqZWN0Il0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSw0REFDb0U7O0FBRXBFLGtGQUF1RjtBQUN2RiwwRUFBZ0Y7QUFDaEYsaUVBQXdFO0FBQ3hFLG1EQUE0RDtBQUM1RCwrRUFBb0Y7O0FBRXBGLDhEQUFxRTs7QUFFckU7O0VBRUc7QUFDSDtJQUFrQ0Esc0NBQVVBO0lBc0UzQ0E7Ozs7TUFER0E7SUFDSEEsNkJBQVlBLFFBQTRCQSxFQUFFQSxZQUEyQ0E7UUFBekVDLHVDQUFBQSxRQUFRQSxHQUFnQkEsSUFBSUE7QUFBQUEsUUFBRUEsMkNBQUFBLFlBQVlBLEdBQVVBLHFCQUFxQkE7QUFBQUEsUUFFcEZBLFdBQU1BLEtBQUFBLENBQUNBO1FBdEVSQSxLQUFPQSxVQUFVQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUNqQ0EsS0FBT0EsUUFBUUEsR0FBV0EsSUFBSUEsQ0FBQ0E7UUFNL0JBLEtBQVFBLGtCQUFrQkEsR0FBV0EsSUFB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QVFBO1lBQ2hCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUNuQkEsQ0FBQ0E7O0lBR0RWLCtDQUFBQTtRQUVDVyxJQUFJQSxJQUFJQSxHQUFRQSxJQUFJQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxFQUFFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUN4REEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsSUFBSUE7O1FBRTFCQSxPQUFPQSxJQUFJQTtJQUNaQSxDQUFDQTtJQVVGWCwyQkFBQ0E7QUFBREEsQ0FBQ0EsRUFwTWlDLFVBQVUsRUFvTTNDOztBQUVELG9DQUE2QixDQUFBIiwiZmlsZSI6InByZWZhYnMvUHJpbWl0aXZlUHJlZmFiQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBEaXNwbGF5T2JqZWN0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9EaXNwbGF5T2JqZWN0XCIpO1xuaW1wb3J0IEdlb21ldHJ5XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvR2VvbWV0cnlcIik7XG5pbXBvcnQgU3ViR2VvbWV0cnlCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9TdWJHZW9tZXRyeUJhc2VcIik7XG5pbXBvcnQgVHJpYW5nbGVTdWJHZW9tZXRyeVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL1RyaWFuZ2xlU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgTGluZVN1Ykdlb21ldHJ5XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9MaW5lU3ViR2VvbWV0cnlcIik7XG5pbXBvcnQgQXNzZXRUeXBlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0VHlwZVwiKTtcbmltcG9ydCBNZXNoXHRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2VudGl0aWVzL01lc2hcIik7XG5pbXBvcnQgQWJzdHJhY3RNZXRob2RFcnJvclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Fic3RyYWN0TWV0aG9kRXJyb3JcIik7XG5pbXBvcnQgTWF0ZXJpYWxCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvbWF0ZXJpYWxzL01hdGVyaWFsQmFzZVwiKTtcbmltcG9ydCBQcmVmYWJCYXNlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcHJlZmFicy9QcmVmYWJCYXNlXCIpO1xuXG4vKipcbiAqIFByaW1pdGl2ZVByZWZhYkJhc2UgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcG9seXRvcGUgcHJlZmFicywgd2hpY2ggYXJlIHNpbXBsZSBwcmUtYnVpbHQgZ2VvbWV0cmljIHNoYXBlc1xuICovXG5jbGFzcyBQcmltaXRpdmVQcmVmYWJCYXNlIGV4dGVuZHMgUHJlZmFiQmFzZVxue1xuXHRwdWJsaWMgX2dlb21EaXJ0eTpib29sZWFuID0gdHJ1ZTtcblx0cHVibGljIF91dkRpcnR5OmJvb2xlYW4gPSB0cnVlO1xuXG5cdHByaXZhdGUgX21hdGVyaWFsOk1hdGVyaWFsQmFzZTtcblx0cHJpdmF0ZSBfZ2VvbWV0cnk6R2VvbWV0cnk7XG5cdHByaXZhdGUgX3N1Ykdlb21ldHJ5OlN1Ykdlb21ldHJ5QmFzZTtcblx0cHJpdmF0ZSBfZ2VvbWV0cnlUeXBlOnN0cmluZztcblx0cHJpdmF0ZSBfZ2VvbWV0cnlUeXBlRGlydHk6Ym9vbGVhbiA9IHRydWU7XG5cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgYXNzZXRUeXBlKCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gQXNzZXRUeXBlLlBSSU1JVElWRV9QUkVGQUI7XG5cdH1cblxuXHQvKipcblx0ICogXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGdlb21ldHJ5VHlwZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2dlb21ldHJ5VHlwZTtcblx0fVxuXHRcblx0cHVibGljIHNldCBnZW9tZXRyeVR5cGUodmFsdWU6c3RyaW5nKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2dlb21ldHJ5VHlwZSA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2dlb21ldHJ5VHlwZSA9IHZhbHVlO1xuXHRcdFxuXHRcdHRoaXMuaW52YWxpZGF0ZUdlb21ldHJ5VHlwZSgpO1xuXHR9XG5cblx0cHVibGljIGdldCBnZW9tZXRyeSgpOkdlb21ldHJ5XG5cdHtcblx0XHR0aGlzLl9pVmFsaWRhdGUoKTtcblxuXHRcdHJldHVybiB0aGlzLl9nZW9tZXRyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgbWF0ZXJpYWwgd2l0aCB3aGljaCB0byByZW5kZXIgdGhlIHByaW1pdGl2ZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgbWF0ZXJpYWwoKTpNYXRlcmlhbEJhc2Vcblx0e1xuXHRcdHJldHVybiB0aGlzLl9tYXRlcmlhbDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbWF0ZXJpYWwodmFsdWU6TWF0ZXJpYWxCYXNlKVxuXHR7XG5cdFx0aWYgKHZhbHVlID09IHRoaXMuX21hdGVyaWFsKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fbWF0ZXJpYWwgPSB2YWx1ZTtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fcE9iamVjdHMubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKVxuXHRcdFx0KDxNZXNoPiB0aGlzLl9wT2JqZWN0c1tpXSkubWF0ZXJpYWwgPSB0aGlzLl9tYXRlcmlhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IFByaW1pdGl2ZVByZWZhYkJhc2Ugb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gbWF0ZXJpYWwgVGhlIG1hdGVyaWFsIHdpdGggd2hpY2ggdG8gcmVuZGVyIHRoZSBvYmplY3Rcblx0ICovXG5cdGNvbnN0cnVjdG9yKG1hdGVyaWFsOk1hdGVyaWFsQmFzZSA9IG51bGwsIGdlb21ldHJ5VHlwZTpzdHJpbmcgPSBcInRyaWFuZ2xlU3ViR2VvbWV0cnlcIilcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9nZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpO1xuXHRcdHRoaXMuX21hdGVyaWFsID0gbWF0ZXJpYWw7XG5cdFx0dGhpcy5fZ2VvbWV0cnlUeXBlID0gZ2VvbWV0cnlUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEJ1aWxkcyB0aGUgcHJpbWl0aXZlJ3MgZ2VvbWV0cnkgd2hlbiBpbnZhbGlkLiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGNhbGxlZCBkaXJlY3RseS4gVGhlIGNhbGxpbmcgc2hvdWxkXG5cdCAqIGJlIHRyaWdnZXJlZCBieSB0aGUgaW52YWxpZGF0ZUdlb21ldHJ5IG1ldGhvZCAoYW5kIGluIHR1cm4gYnkgdXBkYXRlR2VvbWV0cnkpLlxuXHQgKi9cblx0cHVibGljIF9wQnVpbGRHZW9tZXRyeSh0YXJnZXQ6U3ViR2VvbWV0cnlCYXNlLCBnZW9tZXRyeVR5cGU6c3RyaW5nKVxuXHR7XG5cdFx0dGhyb3cgbmV3IEFic3RyYWN0TWV0aG9kRXJyb3IoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBCdWlsZHMgdGhlIHByaW1pdGl2ZSdzIHV2IGNvb3JkaW5hdGVzIHdoZW4gaW52YWxpZC4gVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkuIFRoZSBjYWxsaW5nXG5cdCAqIHNob3VsZCBiZSB0cmlnZ2VyZWQgYnkgdGhlIGludmFsaWRhdGVVVnMgbWV0aG9kIChhbmQgaW4gdHVybiBieSB1cGRhdGVVVnMpLlxuXHQgKi9cblx0cHVibGljIF9wQnVpbGRVVnModGFyZ2V0OlN1Ykdlb21ldHJ5QmFzZSwgZ2VvbWV0cnlUeXBlOnN0cmluZylcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHQvKipcblx0ICogSW52YWxpZGF0ZXMgdGhlIHByaW1pdGl2ZSdzIGdlb21ldHJ5IHR5cGUsIGNhdXNpbmcgaXQgdG8gYmUgdXBkYXRlZCB3aGVuIHJlcXVlc3RlZC5cblx0ICovXG5cdHB1YmxpYyBpbnZhbGlkYXRlR2VvbWV0cnlUeXBlKClcblx0e1xuXHRcdHRoaXMuX2dlb21ldHJ5VHlwZURpcnR5ID0gdHJ1ZTtcblx0XHR0aGlzLl9nZW9tRGlydHkgPSB0cnVlO1xuXHRcdHRoaXMuX3V2RGlydHkgPSB0cnVlO1xuXHR9XG5cdFxuXHQvKipcblx0ICogSW52YWxpZGF0ZXMgdGhlIHByaW1pdGl2ZSdzIGdlb21ldHJ5LCBjYXVzaW5nIGl0IHRvIGJlIHVwZGF0ZWQgd2hlbiByZXF1ZXN0ZWQuXG5cdCAqL1xuXHRwdWJsaWMgX3BJbnZhbGlkYXRlR2VvbWV0cnkoKVxuXHR7XG5cdFx0dGhpcy5fZ2VvbURpcnR5ID0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbnZhbGlkYXRlcyB0aGUgcHJpbWl0aXZlJ3MgdXYgY29vcmRpbmF0ZXMsIGNhdXNpbmcgdGhlbSB0byBiZSB1cGRhdGVkIHdoZW4gcmVxdWVzdGVkLlxuXHQgKi9cblx0cHVibGljIF9wSW52YWxpZGF0ZVVWcygpXG5cdHtcblx0XHR0aGlzLl91dkRpcnR5ID0gdHJ1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBzdWJnZW9tZXRyeSB3aGVuIGludmFsaWQuXG5cdCAqL1xuXHRwcml2YXRlIHVwZGF0ZUdlb21ldHJ5VHlwZSgpXG5cdHtcblx0XHQvL3JlbW92ZSBhbnkgZXhpc3Rpbmcgc3ViIGdlb21ldHJ5XG5cdFx0aWYgKHRoaXMuX3N1Ykdlb21ldHJ5KVxuXHRcdFx0dGhpcy5fZ2VvbWV0cnkucmVtb3ZlU3ViR2VvbWV0cnkodGhpcy5fc3ViR2VvbWV0cnkpO1xuXG5cdFx0aWYgKHRoaXMuX2dlb21ldHJ5VHlwZSA9PSBcInRyaWFuZ2xlU3ViR2VvbWV0cnlcIikge1xuXHRcdFx0dmFyIHRyaWFuZ2xlR2VvbWV0cnk6VHJpYW5nbGVTdWJHZW9tZXRyeSA9IG5ldyBUcmlhbmdsZVN1Ykdlb21ldHJ5KHRydWUpO1xuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS5hdXRvRGVyaXZlTm9ybWFscyA9IGZhbHNlO1xuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS5hdXRvRGVyaXZlVGFuZ2VudHMgPSBmYWxzZTtcblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkuYXV0b0Rlcml2ZVVWcyA9IGZhbHNlO1xuXHRcdFx0dGhpcy5fZ2VvbWV0cnkuYWRkU3ViR2VvbWV0cnkodHJpYW5nbGVHZW9tZXRyeSk7XG5cdFx0XHR0aGlzLl9zdWJHZW9tZXRyeSA9IHRyaWFuZ2xlR2VvbWV0cnk7XG5cdFx0fSBlbHNlIGlmICh0aGlzLl9nZW9tZXRyeVR5cGUgPT0gXCJsaW5lU3ViR2VvbWV0cnlcIikge1xuXHRcdFx0dGhpcy5fZ2VvbWV0cnkuYWRkU3ViR2VvbWV0cnkodGhpcy5fc3ViR2VvbWV0cnkgPSBuZXcgTGluZVN1Ykdlb21ldHJ5KCkpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2dlb21ldHJ5VHlwZURpcnR5ID0gZmFsc2U7XG5cdH1cblxuXHRcblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGdlb21ldHJ5IHdoZW4gaW52YWxpZC5cblx0ICovXG5cdHByaXZhdGUgdXBkYXRlR2VvbWV0cnkoKVxuXHR7XG5cdFx0dGhpcy5fcEJ1aWxkR2VvbWV0cnkodGhpcy5fc3ViR2VvbWV0cnksIHRoaXMuX2dlb21ldHJ5VHlwZSk7XG5cblx0XHR0aGlzLl9nZW9tRGlydHkgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSB1diBjb29yZGluYXRlcyB3aGVuIGludmFsaWQuXG5cdCAqL1xuXHRwcml2YXRlIHVwZGF0ZVVWcygpXG5cdHtcblx0XHR0aGlzLl9wQnVpbGRVVnModGhpcy5fc3ViR2VvbWV0cnksIHRoaXMuX2dlb21ldHJ5VHlwZSk7XG5cblx0XHR0aGlzLl91dkRpcnR5ID0gZmFsc2U7XG5cdH1cblxuXHRwdWJsaWMgX2lWYWxpZGF0ZSgpXG5cdHtcblx0XHRpZiAodGhpcy5fZ2VvbWV0cnlUeXBlRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZUdlb21ldHJ5VHlwZSgpO1xuXHRcdFxuXHRcdGlmICh0aGlzLl9nZW9tRGlydHkpXG5cdFx0XHR0aGlzLnVwZGF0ZUdlb21ldHJ5KCk7XG5cblx0XHRpZiAodGhpcy5fdXZEaXJ0eSlcblx0XHRcdHRoaXMudXBkYXRlVVZzKCk7XG5cdH1cblxuXG5cdHB1YmxpYyBfcENyZWF0ZU9iamVjdCgpOkRpc3BsYXlPYmplY3Rcblx0e1xuXHRcdHZhciBtZXNoOk1lc2ggPSBuZXcgTWVzaCh0aGlzLl9nZW9tZXRyeSwgdGhpcy5fbWF0ZXJpYWwpO1xuXHRcdG1lc2guX2lTb3VyY2VQcmVmYWIgPSB0aGlzO1xuXG5cdFx0cmV0dXJuIG1lc2g7XG5cdH1cblxuXG4vL1x0XHRwdWJsaWMgX3BDcmVhdGVCYXRjaE9iamVjdCgpOkJhdGNoT2JqZWN0XG4vL1x0XHR7XG4vL1x0XHRcdHZhciBiYXRjaDpCYXRjaE9iamVjdCA9IG5ldyBCYXRjaE9iamVjdCh0aGlzLl9nZW9tZXRyeSwgdGhpcy5fbWF0ZXJpYWwpO1xuLy9cdFx0XHRiYXRjaC5faVNvdXJjZVByZWZhYiA9IHRoaXM7XG4vL1xuLy9cdFx0XHRyZXR1cm4gYmF0Y2g7XG4vL1x0XHR9XG59XG5cbmV4cG9ydCA9IFByaW1pdGl2ZVByZWZhYkJhc2U7Il19 \ No newline at end of file diff --git a/lib/prefabs/PrimitivePrefabBase.ts b/lib/prefabs/PrimitivePrefabBase.ts new file mode 100644 index 00000000..92ae98ca --- /dev/null +++ b/lib/prefabs/PrimitivePrefabBase.ts @@ -0,0 +1,213 @@ +import DisplayObject = require("awayjs-core/lib/core/base/DisplayObject"); +import Geometry = require("awayjs-core/lib/core/base/Geometry"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import Mesh = require("awayjs-core/lib/entities/Mesh"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import MaterialBase = require("awayjs-core/lib/materials/MaterialBase"); +import PrefabBase = require("awayjs-core/lib/prefabs/PrefabBase"); + +/** + * PrimitivePrefabBase is an abstract base class for polytope prefabs, which are simple pre-built geometric shapes + */ +class PrimitivePrefabBase extends PrefabBase +{ + public _geomDirty:boolean = true; + public _uvDirty:boolean = true; + + private _material:MaterialBase; + private _geometry:Geometry; + private _subGeometry:SubGeometryBase; + private _geometryType:string; + private _geometryTypeDirty:boolean = true; + + + /** + * + */ + public get assetType():string + { + return AssetType.PRIMITIVE_PREFAB; + } + + /** + * + */ + public get geometryType():string + { + return this._geometryType; + } + + public set geometryType(value:string) + { + if (this._geometryType == value) + return; + + this._geometryType = value; + + this.invalidateGeometryType(); + } + + public get geometry():Geometry + { + this._iValidate(); + + return this._geometry; + } + + /** + * The material with which to render the primitive. + */ + public get material():MaterialBase + { + return this._material; + } + + public set material(value:MaterialBase) + { + if (value == this._material) + return; + + this._material = value; + + var len:number = this._pObjects.length; + for (var i:number = 0; i < len; i++) + ( this._pObjects[i]).material = this._material; + } + + /** + * Creates a new PrimitivePrefabBase object. + * + * @param material The material with which to render the object + */ + constructor(material:MaterialBase = null, geometryType:string = "triangleSubGeometry") + { + super(); + + this._geometry = new Geometry(); + this._material = material; + this._geometryType = geometryType; + } + + /** + * Builds the primitive's geometry when invalid. This method should not be called directly. The calling should + * be triggered by the invalidateGeometry method (and in turn by updateGeometry). + */ + public _pBuildGeometry(target:SubGeometryBase, geometryType:string) + { + throw new AbstractMethodError(); + } + + /** + * Builds the primitive's uv coordinates when invalid. This method should not be called directly. The calling + * should be triggered by the invalidateUVs method (and in turn by updateUVs). + */ + public _pBuildUVs(target:SubGeometryBase, geometryType:string) + { + throw new AbstractMethodError(); + } + + /** + * Invalidates the primitive's geometry type, causing it to be updated when requested. + */ + public invalidateGeometryType() + { + this._geometryTypeDirty = true; + this._geomDirty = true; + this._uvDirty = true; + } + + /** + * Invalidates the primitive's geometry, causing it to be updated when requested. + */ + public _pInvalidateGeometry() + { + this._geomDirty = true; + } + + /** + * Invalidates the primitive's uv coordinates, causing them to be updated when requested. + */ + public _pInvalidateUVs() + { + this._uvDirty = true; + } + + /** + * Updates the subgeometry when invalid. + */ + private updateGeometryType() + { + //remove any existing sub geometry + if (this._subGeometry) + this._geometry.removeSubGeometry(this._subGeometry); + + if (this._geometryType == "triangleSubGeometry") { + var triangleGeometry:TriangleSubGeometry = new TriangleSubGeometry(true); + triangleGeometry.autoDeriveNormals = false; + triangleGeometry.autoDeriveTangents = false; + triangleGeometry.autoDeriveUVs = false; + this._geometry.addSubGeometry(triangleGeometry); + this._subGeometry = triangleGeometry; + } else if (this._geometryType == "lineSubGeometry") { + this._geometry.addSubGeometry(this._subGeometry = new LineSubGeometry()); + } + + this._geometryTypeDirty = false; + } + + + /** + * Updates the geometry when invalid. + */ + private updateGeometry() + { + this._pBuildGeometry(this._subGeometry, this._geometryType); + + this._geomDirty = false; + } + + /** + * Updates the uv coordinates when invalid. + */ + private updateUVs() + { + this._pBuildUVs(this._subGeometry, this._geometryType); + + this._uvDirty = false; + } + + public _iValidate() + { + if (this._geometryTypeDirty) + this.updateGeometryType(); + + if (this._geomDirty) + this.updateGeometry(); + + if (this._uvDirty) + this.updateUVs(); + } + + + public _pCreateObject():DisplayObject + { + var mesh:Mesh = new Mesh(this._geometry, this._material); + mesh._iSourcePrefab = this; + + return mesh; + } + + +// public _pCreateBatchObject():BatchObject +// { +// var batch:BatchObject = new BatchObject(this._geometry, this._material); +// batch._iSourcePrefab = this; +// +// return batch; +// } +} + +export = PrimitivePrefabBase; \ No newline at end of file diff --git a/lib/prefabs/PrimitiveSpherePrefab.js b/lib/prefabs/PrimitiveSpherePrefab.js new file mode 100755 index 00000000..94b897a2 --- /dev/null +++ b/lib/prefabs/PrimitiveSpherePrefab.js @@ -0,0 +1,349 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A UV Sphere primitive mesh. +*/ +var PrimitiveSpherePrefab = (function (_super) { + __extends(PrimitiveSpherePrefab, _super); + /** + * Creates a new Sphere object. + * + * @param radius The radius of the sphere. + * @param segmentsW Defines the number of horizontal segments that make up the sphere. + * @param segmentsH Defines the number of vertical segments that make up the sphere. + * @param yUp Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveSpherePrefab(radius, segmentsW, segmentsH, yUp) { + if (typeof radius === "undefined") { radius = 50; } + if (typeof segmentsW === "undefined") { segmentsW = 16; } + if (typeof segmentsH === "undefined") { segmentsH = 12; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this); + + this._radius = radius; + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._yUp = yUp; + } + Object.defineProperty(PrimitiveSpherePrefab.prototype, "radius", { + /** + * The radius of the sphere. + */ + get: function () { + return this._radius; + }, + set: function (value) { + this._radius = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveSpherePrefab.prototype, "segmentsW", { + /** + * Defines the number of horizontal segments that make up the sphere. Defaults to 16. + */ + get: function () { + return this._segmentsW; + }, + set: function (value) { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveSpherePrefab.prototype, "segmentsH", { + /** + * Defines the number of vertical segments that make up the sphere. Defaults to 12. + */ + get: function () { + return this._segmentsH; + }, + set: function (value) { + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveSpherePrefab.prototype, "yUp", { + /** + * Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveSpherePrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var i; + var j; + var vidx, fidx; + + var comp1; + var comp2; + var numVertices; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array((this._segmentsH - 1) * this._segmentsW * 6); + positions = new Array(numVertices * 3); + normals = new Array(numVertices * 3); + tangents = new Array(numVertices * 3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + var startIndex; + var t1; + var t2; + + for (j = 0; j <= this._segmentsH; ++j) { + startIndex = vidx; + + var horangle = Math.PI * j / this._segmentsH; + var z = -this._radius * Math.cos(horangle); + var ringradius = this._radius * Math.sin(horangle); + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle = 2 * Math.PI * i / this._segmentsW; + var x = ringradius * Math.cos(verangle); + var y = ringradius * Math.sin(verangle); + var normLen = 1 / Math.sqrt(x * x + y * y + z * z); + var tanLen = Math.sqrt(y * y + x * x); + + if (this._yUp) { + t1 = 0; + t2 = tanLen > .007 ? x / tanLen : 0; + comp1 = -z; + comp2 = y; + } else { + t1 = tanLen > .007 ? x / tanLen : 0; + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsW) { + positions[vidx] = positions[startIndex]; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + normals[vidx] = normals[startIndex] + (x * normLen) * .5; + normals[vidx + 1] = normals[startIndex + 1] + (comp1 * normLen) * .5; + normals[vidx + 2] = normals[startIndex + 2] + (comp2 * normLen) * .5; + tangents[vidx] = tanLen > .007 ? -y / tanLen : 1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + normals[vidx] = x * normLen; + normals[vidx + 1] = comp1 * normLen; + normals[vidx + 2] = comp2 * normLen; + tangents[vidx] = tanLen > .007 ? -y / tanLen : 1; + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + } + + if (i > 0 && j > 0) { + var a = (this._segmentsW + 1) * j + i; + var b = (this._segmentsW + 1) * j + i - 1; + var c = (this._segmentsW + 1) * (j - 1) + i - 1; + var d = (this._segmentsW + 1) * (j - 1) + i; + + if (j == this._segmentsH) { + positions[vidx] = positions[startIndex]; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } else if (j == 1) { + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + } else { + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + } + + vidx += 3; + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + var lineGeometry = target; + + var numSegments = (this._segmentsH - 1) * this._segmentsW * 2; + var startPositions; + var endPositions; + var thickness; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments * 3); + endPositions = new Array(numSegments * 3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + for (j = 0; j <= this._segmentsH; ++j) { + var horangle = Math.PI * j / this._segmentsH; + var z = -this._radius * Math.cos(horangle); + var ringradius = this._radius * Math.sin(horangle); + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle = 2 * Math.PI * i / this._segmentsW; + var x = ringradius * Math.cos(verangle); + var y = ringradius * Math.sin(verangle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + } else { + comp1 = y; + comp2 = z; + } + + if (i > 0 && j > 0) { + //horizonal lines + if (j < this._segmentsH) { + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + //vertical lines + startPositions[vidx] = endPositions[vidx - this._segmentsW * 6]; + startPositions[vidx + 1] = endPositions[vidx + 1 - this._segmentsW * 6]; + startPositions[vidx + 2] = endPositions[vidx + 2 - this._segmentsW * 6]; + + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + if (i < this._segmentsW && j > 0 && j < this._segmentsH) { + startPositions[vidx] = x; + startPositions[vidx + 1] = comp1; + startPositions[vidx + 2] = comp2; + } + } + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + }; + + /** + * @inheritDoc + */ + PrimitiveSpherePrefab.prototype._pBuildUVs = function (target, geometryType) { + var i, j; + var numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); + var uvs; + + if (geometryType == "triangleSubGeometry") { + numVertices = (this._segmentsH + 1) * (this._segmentsW + 1); + + var triangleGeometry = target; + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices * 2); + } + + var index = 0; + for (j = 0; j <= this._segmentsH; ++j) { + for (i = 0; i <= this._segmentsW; ++i) { + uvs[index++] = (i / this._segmentsW) * triangleGeometry.scaleU; + uvs[index++] = (j / this._segmentsH) * triangleGeometry.scaleV; + } + } + + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveSpherePrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveSpherePrefab; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlU3BoZXJlUHJlZmFiLnRzIl0sIm5hbWVzIjpbIlByaW1pdGl2ZVNwaGVyZVByZWZhYiIsIlByaW1pdGl2ZVNwaGVyZVByZWZhYi5jb25zdHJ1Y3RvciIsIlByaW1pdGl2ZVNwaGVyZVByZWZhYi5fcEJ1aWxkR2VvbWV0cnkiLCJQcmltaXRpdmVTcGhlcmVQcmVmYWIuX3BCdWlsZFVWcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsZ0ZBSXFGOztBQUVyRjs7RUFFRztBQUNIO0lBQW9DQSx3Q0FBbUJBO0lBNkV0REE7Ozs7Ozs7TUFER0E7SUFDSEEsK0JBQVlBLE1BQWtCQSxFQUFFQSxTQUFxQkEsRUFBRUEsU0FBcUJBLEVBQUVBLEdBQWtCQTtRQUFwRkMscUNBQUFBLE1BQU1BLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLHdDQUFBQSxTQUFTQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUFFQSx3Q0FBQUEsU0FBU0EsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEsa0NBQUFBLEdBQUdBLEdBQVdBLElBQUlBO0FBQUFBLFFBRS9GQSxXQUFNQSxLQUFBQSxDQUFDQTs7UUFFUEEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsTUFBTUE7UUFDckJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLFNBQVNBO1FBQzNCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxTQUFTQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0E7SUFDaEJBLENBQUNBO0lBM0VERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsT0FBT0E7UUFDcEJBLENBQUNBO1FBRURBLEtBQUFBLFVBQWtCQSxLQUFZQTtZQUU3QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsS0FBS0E7O1lBRXBCQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBO1FBQzVCQSxDQUFDQTs7OztBQVBBQTs7SUFZREE7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLFVBQVVBO1FBQ3ZCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFxQkEsS0FBWUE7WUFFaENBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLEtBQUtBOztZQUV2QkEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0E7UUFDdkJBLENBQUNBOzs7O0FBUkFBOztJQWFEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsVUFBVUE7UUFDdkJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXFCQSxLQUFZQTtZQUVoQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsS0FBS0E7O1lBRXZCQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBO1lBQzNCQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQTtRQUN2QkEsQ0FBQ0E7Ozs7QUFSQUE7O0lBYURBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxJQUFJQTtRQUNqQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBZUEsS0FBYUE7WUFFM0JBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLEtBQUtBOztZQUVqQkEsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxDQUFDQTtRQUM1QkEsQ0FBQ0E7Ozs7QUFQQUE7O0lBOEJEQTs7TUFER0E7c0RBQ0hBLFVBQXVCQSxNQUFzQkEsRUFBRUEsWUFBbUJBO1FBRWpFRSxJQUFJQSxPQUFPQTtRQUNYQSxJQUFJQSxTQUFTQTtRQUNiQSxJQUFJQSxPQUFPQTtRQUNYQSxJQUFJQSxRQUFRQTs7UUFFWkEsSUFBSUEsQ0FBQ0E7UUFDTEEsSUFBSUEsQ0FBQ0E7UUFDTEEsSUFBSUEsSUFBSUEsRUFBU0EsSUFBSUE7O1FBRXJCQSxJQUFJQSxLQUFLQTtRQUNUQSxJQUFJQSxLQUFLQTtRQUNUQSxJQUFJQSxXQUFXQTs7UUFHZkEsSUFBSUEsWUFBWUEsSUFBSUEscUJBQXFCQSxDQUFFQTtZQUUxQ0EsSUFBSUEsZ0JBQWdCQSxHQUE2Q0EsTUFBTUE7O1lBRXZFQSxXQUFXQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQTs7WUFFekRBLElBQUlBLFdBQVdBLElBQUlBLGdCQUFnQkEsQ0FBQ0EsV0FBV0EsSUFBSUEsZ0JBQWdCQSxDQUFDQSxPQUFPQSxJQUFJQSxJQUFJQSxDQUFFQTtnQkFDcEZBLE9BQU9BLEdBQUdBLGdCQUFnQkEsQ0FBQ0EsT0FBT0E7Z0JBQ2xDQSxTQUFTQSxHQUFHQSxnQkFBZ0JBLENBQUNBLFNBQVNBO2dCQUN0Q0EsT0FBT0EsR0FBR0EsZ0JBQWdCQSxDQUFDQSxhQUFhQTtnQkFDeENBLFFBQVFBLEdBQUdBLGdCQUFnQkEsQ0FBQ0EsY0FBY0E7YUFDMUNBLEtBQU1BO2dCQUNOQSxPQUFPQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFDQSxDQUFDQSxDQUFDQTtnQkFDcEVBLFNBQVNBLEdBQUdBLElBQUlBLEtBQUtBLENBQVNBLFdBQVdBLEdBQUNBLENBQUNBLENBQUNBO2dCQUM1Q0EsT0FBT0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBU0EsV0FBV0EsR0FBQ0EsQ0FBQ0EsQ0FBQ0E7Z0JBQzFDQSxRQUFRQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxXQUFXQSxHQUFDQSxDQUFDQSxDQUFDQTs7Z0JBRTNDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQTthQUN0QkE7O1lBRURBLElBQUlBLEdBQUdBLENBQUNBO1lBQ1JBLElBQUlBLEdBQUdBLENBQUNBOztZQUVSQSxJQUFJQSxVQUFVQTtZQUNkQSxJQUFJQSxFQUFFQTtZQUNOQSxJQUFJQSxFQUFFQTs7WUFFTkEsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBRUE7Z0JBRXRDQSxVQUFVQSxHQUFHQSxJQUFJQTs7Z0JBRWpCQSxJQUFJQSxRQUFRQSxHQUFVQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQTtnQkFDL0NBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLEdBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBO2dCQUMvQ0EsSUFBSUEsVUFBVUEsR0FBVUEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7O2dCQUV2REEsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBRUE7b0JBQ3RDQSxJQUFJQSxRQUFRQSxHQUFVQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQTtvQkFDakRBLElBQUlBLENBQUNBLEdBQVVBLFVBQVVBLEdBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBO29CQUM1Q0EsSUFBSUEsQ0FBQ0EsR0FBVUEsVUFBVUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7b0JBQzVDQSxJQUFJQSxPQUFPQSxHQUFVQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQTtvQkFDakRBLElBQUlBLE1BQU1BLEdBQVVBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBOztvQkFFeENBLElBQUlBLElBQUlBLENBQUNBLElBQUlBLENBQUVBO3dCQUVkQSxFQUFFQSxHQUFHQSxDQUFDQTt3QkFDTkEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsR0FBRUEsQ0FBQ0EsR0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0E7d0JBQ2hDQSxLQUFLQSxHQUFHQSxDQUFDQSxDQUFDQTt3QkFDVkEsS0FBS0EsR0FBR0EsQ0FBQ0E7cUJBRVRBLEtBQU1BO3dCQUNOQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxJQUFJQSxHQUFFQSxDQUFDQSxHQUFDQSxNQUFNQSxHQUFHQSxDQUFDQTt3QkFDaENBLEVBQUVBLEdBQUdBLENBQUNBO3dCQUNOQSxLQUFLQSxHQUFHQSxDQUFDQTt3QkFDVEEsS0FBS0EsR0FBR0EsQ0FBQ0E7cUJBQ1RBOztvQkFFREEsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBRUE7d0JBQ3pCQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxVQUFVQSxDQUFDQTt3QkFDdkNBLFNBQVNBLENBQUNBLElBQUlBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO3dCQUM3Q0EsU0FBU0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7d0JBQzdDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxVQUFVQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxPQUFPQSxDQUFDQSxHQUFDQSxFQUFFQTt3QkFDcERBLE9BQU9BLENBQUNBLElBQUlBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUVBLEtBQUtBLEdBQUNBLE9BQU9BLENBQUNBLEdBQUNBLEVBQUVBO3dCQUMvREEsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsR0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBQ0EsRUFBRUE7d0JBQzlEQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxNQUFNQSxHQUFHQSxJQUFJQSxHQUFFQSxDQUFDQSxDQUFDQSxHQUFDQSxNQUFNQSxHQUFHQSxDQUFDQTt3QkFDN0NBLFFBQVFBLENBQUNBLElBQUlBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBO3dCQUNyQkEsUUFBUUEsQ0FBQ0EsSUFBSUEsR0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUE7cUJBRXJCQSxLQUFNQTt3QkFFTkEsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7d0JBQ25CQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQTt3QkFDekJBLFNBQVNBLENBQUNBLElBQUlBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBO3dCQUN6QkEsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsT0FBT0E7d0JBQ3pCQSxPQUFPQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQSxHQUFDQSxPQUFPQTt3QkFDL0JBLE9BQU9BLENBQUNBLElBQUlBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLEdBQUNBLE9BQU9BO3dCQUMvQkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUEsR0FBRUEsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0E7d0JBQzdDQSxRQUFRQSxDQUFDQSxJQUFJQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTt3QkFDckJBLFFBQVFBLENBQUNBLElBQUlBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBO3FCQUNyQkE7O29CQUVEQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFFQTt3QkFFbkJBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLENBQUNBO3dCQUMxQ0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7d0JBQzlDQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTt3QkFDcERBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBOzt3QkFFaERBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLENBQUVBOzRCQUV6QkEsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsVUFBVUEsQ0FBQ0E7NEJBQ3ZDQSxTQUFTQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQTs0QkFDL0NBLFNBQVNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBOzs0QkFFL0NBLE9BQU9BLENBQUNBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBOzRCQUNuQkEsT0FBT0EsQ0FBQ0EsSUFBSUEsRUFBRUEs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RURBLGdDQUFnQ0E7WUFDaENBLFlBQVlBLENBQUNBLGVBQWVBLENBQUNBLGNBQWNBLEVBQUVBLFlBQVlBLENBQUNBO1lBQzFEQSxZQUFZQSxDQUFDQSxlQUFlQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN2Q0E7SUFDRkEsQ0FBQ0E7O0lBS0RGOztNQURHQTtpREFDSEEsVUFBa0JBLE1BQXNCQSxFQUFFQSxZQUFtQkE7UUFFNURHLElBQUlBLENBQUNBLEVBQVNBLENBQUNBO1FBQ2ZBLElBQUlBLFdBQVdBLEdBQVVBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO1FBQ3BFQSxJQUFJQSxHQUFHQTs7UUFHUEEsSUFBSUEsWUFBWUEsSUFBSUEscUJBQXFCQSxDQUFFQTtZQUUxQ0EsV0FBV0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1lBRXpEQSxJQUFJQSxnQkFBZ0JBLEdBQTZDQSxNQUFNQTs7WUFFdkVBLElBQUlBLFdBQVdBLElBQUlBLGdCQUFnQkEsQ0FBQ0EsV0FBV0EsSUFBSUEsZ0JBQWdCQSxDQUFDQSxHQUFHQSxJQUFJQSxJQUFJQSxDQUFFQTtnQkFDaEZBLEdBQUdBLEdBQUdBLGdCQUFnQkEsQ0FBQ0EsR0FBR0E7YUFDMUJBLEtBQU1BO2dCQUNOQSxHQUFHQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFTQSxXQUFXQSxHQUFDQSxDQUFDQSxDQUFDQTthQUN0Q0E7O1lBRURBLElBQUlBLEtBQUtBLEdBQVVBLENBQUNBO1lBQ3BCQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDdENBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUVBO29CQUN0Q0EsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBRUEsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBRUEsR0FBQ0EsZ0JBQWdCQSxDQUFDQSxNQUFNQTtvQkFDNURBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLEdBQUdBLENBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUVBLEdBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUE7aUJBQzVEQTthQUNEQTs7WUFFREEsZ0JBQWdCQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQTtTQUUvQkEsTUFBTUEsSUFBSUEsWUFBWUEsSUFBSUEsaUJBQWlCQSxDQUFFQTtZQUM3Q0Esb0JBQW9CQTtTQUNwQkE7SUFDRkEsQ0FBQ0E7SUFDRkgsNkJBQUNBO0FBQURBLENBQUNBLEVBNVZtQyxtQkFBbUIsRUE0VnREOztBQUVELHNDQUErQixDQUFBIiwiZmlsZSI6InByZWZhYnMvUHJpbWl0aXZlU3BoZXJlUHJlZmFiLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IExpbmVTdWJHZW9tZXRyeVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvTGluZVN1Ykdlb21ldHJ5XCIpO1xuaW1wb3J0IFN1Ykdlb21ldHJ5QmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvU3ViR2VvbWV0cnlCYXNlXCIpO1xuaW1wb3J0IFRyaWFuZ2xlU3ViR2VvbWV0cnlcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9UcmlhbmdsZVN1Ykdlb21ldHJ5XCIpO1xuaW1wb3J0IElBc3NldFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0lBc3NldFwiKTtcbmltcG9ydCBQcmltaXRpdmVQcmVmYWJCYXNlXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcmVmYWJzL1ByaW1pdGl2ZVByZWZhYkJhc2VcIik7XG5cbi8qKlxuICogQSBVViBTcGhlcmUgcHJpbWl0aXZlIG1lc2guXG4gKi9cbmNsYXNzIFByaW1pdGl2ZVNwaGVyZVByZWZhYiBleHRlbmRzIFByaW1pdGl2ZVByZWZhYkJhc2UgaW1wbGVtZW50cyBJQXNzZXRcbntcblx0cHJpdmF0ZSBfcmFkaXVzOm51bWJlcjtcblx0cHJpdmF0ZSBfc2VnbWVudHNXOm51bWJlcjtcblx0cHJpdmF0ZSBfc2VnbWVudHNIOm51bWJlcjtcblx0cHJpdmF0ZSBfeVVwOmJvb2xlYW47XG5cblx0LyoqXG5cdCAqIFRoZSByYWRpdXMgb2YgdGhlIHNwaGVyZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgcmFkaXVzKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcmFkaXVzO1xuXHR9XG5cblx0cHVibGljIHNldCByYWRpdXModmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fcmFkaXVzID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGhvcml6b250YWwgc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBzcGhlcmUuIERlZmF1bHRzIHRvIDE2LlxuXHQgKi9cblx0cHVibGljIGdldCBzZWdtZW50c1coKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zZWdtZW50c1c7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHNlZ21lbnRzVyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9zZWdtZW50c1cgPSB2YWx1ZTtcblxuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZVVWcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgdGhlIG51bWJlciBvZiB2ZXJ0aWNhbCBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIHNwaGVyZS4gRGVmYXVsdHMgdG8gMTIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNlZ21lbnRzSCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NlZ21lbnRzSDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2VnbWVudHNIKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3NlZ21lbnRzSCA9IHZhbHVlO1xuXG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlVVZzKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB3aGV0aGVyIHRoZSBzcGhlcmUgcG9sZXMgc2hvdWxkIGxheSBvbiB0aGUgWS1heGlzICh0cnVlKSBvciBvbiB0aGUgWi1heGlzIChmYWxzZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHlVcCgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl95VXA7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHlVcCh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0dGhpcy5feVVwID0gdmFsdWU7XG5cblx0XHR0aGlzLl9wSW52YWxpZGF0ZUdlb21ldHJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ3JlYXRlcyBhIG5ldyBTcGhlcmUgb2JqZWN0LlxuXHQgKlxuXHQgKiBAcGFyYW0gcmFkaXVzIFRoZSByYWRpdXMgb2YgdGhlIHNwaGVyZS5cblx0ICogQHBhcmFtIHNlZ21lbnRzVyBEZWZpbmVzIHRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIHNwaGVyZS5cblx0ICogQHBhcmFtIHNlZ21lbnRzSCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgdmVydGljYWwgc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSBzcGhlcmUuXG5cdCAqIEBwYXJhbSB5VXAgRGVmaW5lcyB3aGV0aGVyIHRoZSBzcGhlcmUgcG9sZXMgc2hvdWxkIGxheSBvbiB0aGUgWS1heGlzICh0cnVlKSBvciBvbiB0aGUgWi1heGlzIChmYWxzZSkuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcihyYWRpdXM6bnVtYmVyID0gNTAsIHNlZ21lbnRzVzpudW1iZXIgPSAxNiwgc2VnbWVudHNIOm51bWJlciA9IDEyLCB5VXA6Ym9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fcmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMuX3NlZ21lbnRzVyA9IHNlZ21lbnRzVztcblx0XHR0aGlzLl9zZWdtZW50c0ggPSBzZWdtZW50c0g7XG5cdFx0dGhpcy5feVVwID0geVVwO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgX3BCdWlsZEdlb21ldHJ5KHRhcmdldDpTdWJHZW9tZXRyeUJhc2UsIGdlb21ldHJ5VHlwZTpzdHJpbmcpXG5cdHtcblx0XHR2YXIgaW5kaWNlczpBcnJheTxudW1iZXI+IC8qdWludCovO1xuXHRcdHZhciBwb3NpdGlvbnM6QXJyYXk8bnVtYmVyPjtcblx0XHR2YXIgbm9ybWFsczpBcnJheTxudW1iZXI+O1xuXHRcdHZhciB0YW5nZW50czpBcnJheTxudW1iZXI+O1xuXG5cdFx0dmFyIGk6bnVtYmVyO1xuXHRcdHZhciBqOm51bWJlcjtcblx0XHR2YXIgdmlkeDpudW1iZXIsIGZpZHg6bnVtYmVyOyAvLyBpbmRpY2VzXG5cblx0XHR2YXIgY29tcDE6bnVtYmVyO1xuXHRcdHZhciBjb21wMjpudW1iZXI7XG5cdFx0dmFyIG51bVZlcnRpY2VzOm51bWJlcjtcblxuXG5cdFx0aWYgKGdlb21ldHJ5VHlwZSA9PSBcInRyaWFuZ2xlU3ViR2VvbWV0cnlcIikge1xuXG5cdFx0XHR2YXIgdHJpYW5nbGVHZW9tZXRyeTpUcmlhbmdsZVN1Ykdlb21ldHJ5ID0gPFRyaWFuZ2xlU3ViR2VvbWV0cnk+IHRhcmdldDtcblxuXHRcdFx0bnVtVmVydGljZXMgPSAodGhpcy5fc2VnbWVudHNIICsgMSkqKHRoaXMuX3NlZ21lbnRzVyArIDEpO1xuXG5cdFx0XHRpZiAobnVtVmVydGljZXMgPT0gdHJpYW5nbGVHZW9tZXRyeS5udW1WZXJ0aWNlcyAmJiB0cmlhbmdsZUdlb21ldHJ5LmluZGljZXMgIT0gbnVsbCkge1xuXHRcdFx0XHRpbmRpY2VzID0gdHJpYW5nbGVHZW9tZXRyeS5pbmRpY2VzO1xuXHRcdFx0XHRwb3NpdGlvbnMgPSB0cmlhbmdsZUdlb21ldHJ5LnBvc2l0aW9ucztcblx0XHRcdFx0bm9ybWFscyA9IHRyaWFuZ2xlR2VvbWV0cnkudmVydGV4Tm9ybWFscztcblx0XHRcdFx0dGFuZ2VudHMgPSB0cmlhbmdsZUdlb21ldHJ5LnZlcnRleFRhbmdlbnRzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aW5kaWNlcyA9IG5ldyBBcnJheTxudW1iZXI+KCh0aGlzLl9zZWdtZW50c0ggLSAxKSp0aGlzLl9zZWdtZW50c1cqNik7XG5cdFx0XHRcdHBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVZlcnRpY2VzKjMpO1xuXHRcdFx0XHRub3JtYWxzID0gbmV3IEFycmF5PG51bWJlcj4obnVtVmVydGljZXMqMyk7XG5cdFx0XHRcdHRhbmdlbnRzID0gbmV3IEFycmF5PG51bWJlcj4obnVtVmVydGljZXMqMyk7XG5cblx0XHRcdFx0dGhpcy5fcEludmFsaWRhdGVVVnMoKTtcblx0XHRcdH1cblxuXHRcdFx0dmlkeCA9IDA7XG5cdFx0XHRmaWR4ID0gMDtcblxuXHRcdFx0dmFyIHN0YXJ0SW5kZXg6bnVtYmVyO1xuXHRcdFx0dmFyIHQxOm51bWJlcjtcblx0XHRcdHZhciB0MjpudW1iZXI7XG5cblx0XHRcdGZvciAoaiA9IDA7IGogPD0gdGhpcy5fc2VnbWVudHNIOyArK2opIHtcblxuXHRcdFx0XHRzdGFydEluZGV4ID0gdmlkeDtcblxuXHRcdFx0XHR2YXIgaG9yYW5nbGU6bnVtYmVyID0gTWF0aC5QSSpqL3RoaXMuX3NlZ21lbnRzSDtcblx0XHRcdFx0dmFyIHo6bnVtYmVyID0gLXRoaXMuX3JhZGl1cypNYXRoLmNvcyhob3JhbmdsZSk7XG5cdFx0XHRcdHZhciByaW5ncmFkaXVzOm51bWJlciA9IHRoaXMuX3JhZGl1cypNYXRoLnNpbihob3JhbmdsZSk7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9zZWdtZW50c1c7ICsraSkge1xuXHRcdFx0XHRcdHZhciB2ZXJhbmdsZTpudW1iZXIgPSAyKk1hdGguUEkqaS90aGlzLl9zZWdtZW50c1c7XG5cdFx0XHRcdFx0dmFyIHg6bnVtYmVyID0gcmluZ3JhZGl1cypNYXRoLmNvcyh2ZXJhbmdsZSk7XG5cdFx0XHRcdFx0dmFyIHk6bnVtYmVyID0gcmluZ3JhZGl1cypNYXRoLnNpbih2ZXJhbmdsZSk7XG5cdFx0XHRcdFx0dmFyIG5vcm1MZW46bnVtYmVyID0gMS9NYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcblx0XHRcdFx0XHR2YXIgdGFuTGVuOm51bWJlciA9IE1hdGguc3FydCh5KnkgKyB4KngpO1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuX3lVcCkge1xuXG5cdFx0XHRcdFx0XHR0MSA9IDA7XG5cdFx0XHRcdFx0XHR0MiA9IHRhbkxlbiA+IC4wMDc/IHgvdGFuTGVuIDogMDtcblx0XHRcdFx0XHRcdGNvbXAxID0gLXo7XG5cdFx0XHRcdFx0XHRjb21wMiA9IHk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dDEgPSB0YW5MZW4gPiAuMDA3PyB4L3RhbkxlbiA6IDA7XG5cdFx0XHRcdFx0XHR0MiA9IDA7XG5cdFx0XHRcdFx0XHRjb21wMSA9IHk7XG5cdFx0XHRcdFx0XHRjb21wMiA9IHo7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGkgPT0gdGhpcy5fc2VnbWVudHNXKSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSBwb3NpdGlvbnNbc3RhcnRJbmRleF07XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCsxXSA9IHBvc2l0aW9uc1tzdGFydEluZGV4ICsgMV07XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCsyXSA9IHBvc2l0aW9uc1tzdGFydEluZGV4ICsgMl07XG5cdFx0XHRcdFx0XHRub3JtYWxzW3ZpZHhdID0gbm9ybWFsc1tzdGFydEluZGV4XSArICh4Km5vcm1MZW4pKi41O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1t2aWR4KzFdID0gbm9ybWFsc1tzdGFydEluZGV4ICsgMV0gKyAoIGNvbXAxKm5vcm1MZW4pKi41O1xuXHRcdFx0XHRcdFx0bm9ybWFsc1t2aWR4KzJdID0gbm9ybWFsc1tzdGFydEluZGV4ICsgMl0gKyAoY29tcDIqbm9ybUxlbikqLjU7XG5cdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4XSA9IHRhbkxlbiA+IC4wMDc/IC15L3RhbkxlbiA6IDE7XG5cdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4KzFdID0gdDE7XG5cdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4KzJdID0gdDI7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSB4O1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHgrMV0gPSBjb21wMTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4KzJdID0gY29tcDI7XG5cdFx0XHRcdFx0XHRub3JtYWxzW3ZpZHhdID0geCpub3JtTGVuO1xuXHRcdFx0XHRcdFx0bm9ybWFsc1t2aWR4KzFdID0gY29tcDEqbm9ybUxlbjtcblx0XHRcdFx0XHRcdG5vcm1hbHNbdmlkeCsyXSA9IGNvbXAyKm5vcm1MZW47XG5cdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4XSA9IHRhbkxlbiA+IC4wMDc/IC15L3RhbkxlbiA6IDE7XG5cdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4KzFdID0gdDE7XG5cdFx0XHRcdFx0XHR0YW5nZW50c1t2aWR4KzJdID0gdDI7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGkgPiAwICYmIGogPiAwKSB7XG5cblx0XHRcdFx0XHRcdHZhciBhOm51bWJlciA9ICh0aGlzLl9zZWdtZW50c1cgKyAxKSpqICsgaTtcblx0XHRcdFx0XHRcdHZhciBiOm51bWJlciA9ICh0aGlzLl9zZWdtZW50c1cgKyAxKSpqICsgaSAtIDE7XG5cdFx0XHRcdFx0XHR2YXIgYzpudW1iZXIgPSAodGhpcy5fc2VnbWVudHNXICsgMSkqKGogLSAxKSArIGkgLSAxO1xuXHRcdFx0XHRcdFx0dmFyIGQ6bnVtYmVyID0gKHRoaXMuX3NlZ21lbnRzVyArIDEpKihqIC0gMSkgKyBpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaiA9PSB0aGlzLl9zZWdtZW50c0gpIHtcblxuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSBwb3NpdGlvbnNbc3RhcnRJbmRleF07XG5cdFx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMV0gPSBwb3NpdGlvbnNbc3RhcnRJbmRleCArIDFdO1xuXHRcdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDJdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXggKyAyXTtcblxuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBhO1xuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBjO1xuXHRcdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBkO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2UgaWYgKGogPT0gMSkge1xuXG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGE7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGI7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGM7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGE7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGI7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGM7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGE7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGM7XG5cdFx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dmlkeCArPSAzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlSW5kaWNlcyhpbmRpY2VzKTtcblxuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVQb3NpdGlvbnMocG9zaXRpb25zKTtcblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlVmVydGV4Tm9ybWFscyhub3JtYWxzKTtcblx0XHRcdHRyaWFuZ2xlR2VvbWV0cnkudXBkYXRlVmVydGV4VGFuZ2VudHModGFuZ2VudHMpO1xuXG5cdFx0fSBlbHNlIGlmIChnZW9tZXRyeVR5cGUgPT0gXCJsaW5lU3ViR2VvbWV0cnlcIikge1xuXG5cdFx0XHR2YXIgbGluZUdlb21ldHJ5OkxpbmVTdWJHZW9tZXRyeSA9IDxMaW5lU3ViR2VvbWV0cnk+IHRhcmdldDtcblxuXHRcdFx0dmFyIG51bVNlZ21lbnRzOm51bWJlciA9ICh0aGlzLl9zZWdtZW50c0ggLSAxKSp0aGlzLl9zZWdtZW50c1cqMjtcblx0XHRcdHZhciBzdGFydFBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdFx0dmFyIGVuZFBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdFx0dmFyIHRoaWNrbmVzczpBcnJheTxudW1iZXI+O1xuXG5cdFx0XHRpZiAobGluZUdlb21ldHJ5LmluZGljZXMgIT0gbnVsbCAmJiBudW1TZWdtZW50cyA9PSBsaW5lR2VvbWV0cnkubnVtU2VnbWVudHMpIHtcblx0XHRcdFx0c3RhcnRQb3NpdGlvbnMgPSBsaW5lR2VvbWV0cnkuc3RhcnRQb3NpdGlvbnM7XG5cdFx0XHRcdGVuZFBvc2l0aW9ucyA9IGxpbmVHZW9tZXRyeS5lbmRQb3NpdGlvbnM7XG5cdFx0XHRcdHRoaWNrbmVzcyA9IGxpbmVHZW9tZXRyeS50aGlja25lc3M7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzdGFydFBvc2l0aW9ucyA9IG5ldyBBcnJheTxudW1iZXI+KG51bVNlZ21lbnRzKjMpO1xuXHRcdFx0XHRlbmRQb3NpdGlvbnMgPSBuZXcgQXJyYXk8bnVtYmVyPihudW1TZWdtZW50cyozKTtcblx0XHRcdFx0dGhpY2tuZXNzID0gbmV3IEFycmF5PG51bWJlcj4obnVtU2VnbWVudHMpO1xuXHRcdFx0fVxuXG5cdFx0XHR2aWR4ID0gMDtcblxuXHRcdFx0ZmlkeCA9IDA7XG5cblx0XHRcdGZvciAoaiA9IDA7IGogPD0gdGhpcy5fc2VnbWVudHNIOyArK2opIHtcblxuXHRcdFx0XHR2YXIgaG9yYW5nbGU6bnVtYmVyID0gTWF0aC5QSSpqL3RoaXMuX3NlZ21lbnRzSDtcblx0XHRcdFx0dmFyIHo6bnVtYmVyID0gLXRoaXMuX3JhZGl1cypNYXRoLmNvcyhob3JhbmdsZSk7XG5cdFx0XHRcdHZhciByaW5ncmFkaXVzOm51bWJlciA9IHRoaXMuX3JhZGl1cypNYXRoLnNpbihob3JhbmdsZSk7XG5cblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9zZWdtZW50c1c7ICsraSkge1xuXHRcdFx0XHRcdHZhciB2ZXJhbmdsZTpudW1iZXIgPSAyKk1hdGguUEkqaS90aGlzLl9zZWdtZW50c1c7XG5cdFx0XHRcdFx0dmFyIHg6bnVtYmVyID0gcmluZ3JhZGl1cypNYXRoLmNvcyh2ZXJhbmdsZSk7XG5cdFx0XHRcdFx0dmFyIHk6bnVtYmVyID0gcmluZ3JhZGl1cypNYXRoLnNpbih2ZXJhbmdsZSk7XG5cblx0XHRcdFx0XHRpZiAodGhpcy5feVVwKSB7XG5cdFx0XHRcdFx0XHRjb21wMSA9IC16O1xuXHRcdFx0XHRcdFx0Y29tcDIgPSB5O1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbXAxID0geTtcblx0XHRcdFx0XHRcdGNvbXAyID0gejtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaSA+IDAgJiYgaiA+IDApIHtcblx0XHRcdFx0XHRcdC8vaG9yaXpvbmFsIGxpbmVzXG5cdFx0XHRcdFx0XHRpZiAoaiA8IHRoaXMuX3NlZ21lbnRzSCkge1xuXHRcdFx0XHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeF0gPSB4O1xuXHRcdFx0XHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeCArIDFdID0gY29tcDE7XG5cdFx0XHRcdFx0XHRcdGVuZFBvc2l0aW9uc1t2aWR4ICsgMl0gPSBjb21wMjtcblxuXHRcdFx0XHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0XHRcdFx0dmlkeCArPSAzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvL3ZlcnRpY2FsIGxpbmVzXG5cdFx0XHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4XSA9IGVuZFBvc2l0aW9uc1t2aWR4IC0gdGhpcy5fc2VnbWVudHNXKjZdO1xuXHRcdFx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDFdID0gZW5kUG9zaXRpb25zW3ZpZHggKyAxIC0gdGhpcy5fc2VnbWVudHNXKjZdO1xuXHRcdFx0XHRcdFx0c3RhcnRQb3NpdGlvbnNbdmlkeCArIDJdID0gZW5kUG9zaXRpb25zW3ZpZHggKyAyIC0gdGhpcy5fc2VnbWVudHNXKjZdO1xuXG5cdFx0XHRcdFx0XHRlbmRQb3NpdGlvbnNbdmlkeF0gPSB4O1xuXHRcdFx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAxXSA9IGNvbXAxO1xuXHRcdFx0XHRcdFx0ZW5kUG9zaXRpb25zW3ZpZHggKyAyXSA9IGNvbXAyO1xuXG5cdFx0XHRcdFx0XHR0aGlja25lc3NbZmlkeCsrXSA9IDE7XG5cblx0XHRcdFx0XHRcdHZpZHggKz0gMztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaSA8IHRoaXMuX3NlZ21lbnRzVyAmJiBqID4gMCAmJiBqIDwgdGhpcy5fc2VnbWVudHNIKSB7XG5cdFx0XHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4XSA9IHg7XG5cdFx0XHRcdFx0XHRzdGFydFBvc2l0aW9uc1t2aWR4ICsgMV0gPSBjb21wMTtcblx0XHRcdFx0XHRcdHN0YXJ0UG9zaXRpb25zW3ZpZHggKyAyXSA9IGNvbXAyO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBidWlsZCByZWFsIGRhdGEgZnJvbSByYXcgZGF0YVxuXHRcdFx0bGluZUdlb21ldHJ5LnVwZGF0ZVBvc2l0aW9ucyhzdGFydFBvc2l0aW9ucywgZW5kUG9zaXRpb25zKTtcblx0XHRcdGxpbmVHZW9tZXRyeS51cGRhdGVUaGlja25lc3ModGhpY2tuZXNzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfcEJ1aWxkVVZzKHRhcmdldDpTdWJHZW9tZXRyeUJhc2UsIGdlb21ldHJ5VHlwZTpzdHJpbmcpXG5cdHtcblx0XHR2YXIgaTpudW1iZXIsIGo6bnVtYmVyO1xuXHRcdHZhciBudW1WZXJ0aWNlczpudW1iZXIgPSAodGhpcy5fc2VnbWVudHNIICsgMSkqKHRoaXMuX3NlZ21lbnRzVyArIDEpO1xuXHRcdHZhciB1dnM6QXJyYXk8bnVtYmVyPjtcblxuXG5cdFx0aWYgKGdlb21ldHJ5VHlwZSA9PSBcInRyaWFuZ2xlU3ViR2VvbWV0cnlcIikge1xuXG5cdFx0XHRudW1WZXJ0aWNlcyA9ICh0aGlzLl9zZWdtZW50c0ggKyAxKSoodGhpcy5fc2VnbWVudHNXICsgMSk7XG5cblx0XHRcdHZhciB0cmlhbmdsZUdlb21ldHJ5OlRyaWFuZ2xlU3ViR2VvbWV0cnkgPSA8VHJpYW5nbGVTdWJHZW9tZXRyeT4gdGFyZ2V0O1xuXG5cdFx0XHRpZiAobnVtVmVydGljZXMgPT0gdHJpYW5nbGVHZW9tZXRyeS5udW1WZXJ0aWNlcyAmJiB0cmlhbmdsZUdlb21ldHJ5LnV2cyAhPSBudWxsKSB7XG5cdFx0XHRcdHV2cyA9IHRyaWFuZ2xlR2VvbWV0cnkudXZzO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dXZzID0gbmV3IEFycmF5PG51bWJlcj4obnVtVmVydGljZXMqMik7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpbmRleDpudW1iZXIgPSAwO1xuXHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9zZWdtZW50c0g7ICsraikge1xuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDw9IHRoaXMuX3NlZ21lbnRzVzsgKytpKSB7XG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0gKCBpL3RoaXMuX3NlZ21lbnRzVyApKnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVVO1xuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9ICggai90aGlzLl9zZWdtZW50c0ggKSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZVVWcyh1dnMpO1xuXG5cdFx0fSBlbHNlIGlmIChnZW9tZXRyeVR5cGUgPT0gXCJsaW5lU3ViR2VvbWV0cnlcIikge1xuXHRcdFx0Ly9ub3RoaW5nIHRvIGRvIGhlcmVcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0ID0gUHJpbWl0aXZlU3BoZXJlUHJlZmFiOyJdfQ== \ No newline at end of file diff --git a/lib/prefabs/PrimitiveSpherePrefab.ts b/lib/prefabs/PrimitiveSpherePrefab.ts new file mode 100644 index 00000000..b261211a --- /dev/null +++ b/lib/prefabs/PrimitiveSpherePrefab.ts @@ -0,0 +1,360 @@ +import LineSubGeometry = require("awayjs-core/lib/core/base/LineSubGeometry"); +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** + * A UV Sphere primitive mesh. + */ +class PrimitiveSpherePrefab extends PrimitivePrefabBase implements IAsset +{ + private _radius:number; + private _segmentsW:number; + private _segmentsH:number; + private _yUp:boolean; + + /** + * The radius of the sphere. + */ + public get radius():number + { + return this._radius; + } + + public set radius(value:number) + { + this._radius = value; + + this._pInvalidateGeometry(); + } + + /** + * Defines the number of horizontal segments that make up the sphere. Defaults to 16. + */ + public get segmentsW():number + { + return this._segmentsW; + } + + public set segmentsW(value:number) + { + this._segmentsW = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * Defines the number of vertical segments that make up the sphere. Defaults to 12. + */ + public get segmentsH():number + { + return this._segmentsH; + } + + public set segmentsH(value:number) + { + this._segmentsH = value; + + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + public get yUp():boolean + { + return this._yUp; + } + + public set yUp(value:boolean) + { + this._yUp = value; + + this._pInvalidateGeometry(); + } + + /** + * Creates a new Sphere object. + * + * @param radius The radius of the sphere. + * @param segmentsW Defines the number of horizontal segments that make up the sphere. + * @param segmentsH Defines the number of vertical segments that make up the sphere. + * @param yUp Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius:number = 50, segmentsW:number = 16, segmentsH:number = 12, yUp:boolean = true) + { + super(); + + this._radius = radius; + this._segmentsW = segmentsW; + this._segmentsH = segmentsH; + this._yUp = yUp; + } + + /** + * @inheritDoc + */ + public _pBuildGeometry(target:SubGeometryBase, geometryType:string) + { + var indices:Array /*uint*/; + var positions:Array; + var normals:Array; + var tangents:Array; + + var i:number; + var j:number; + var vidx:number, fidx:number; // indices + + var comp1:number; + var comp2:number; + var numVertices:number; + + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + numVertices = (this._segmentsH + 1)*(this._segmentsW + 1); + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array((this._segmentsH - 1)*this._segmentsW*6); + positions = new Array(numVertices*3); + normals = new Array(numVertices*3); + tangents = new Array(numVertices*3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + var startIndex:number; + var t1:number; + var t2:number; + + for (j = 0; j <= this._segmentsH; ++j) { + + startIndex = vidx; + + var horangle:number = Math.PI*j/this._segmentsH; + var z:number = -this._radius*Math.cos(horangle); + var ringradius:number = this._radius*Math.sin(horangle); + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle:number = 2*Math.PI*i/this._segmentsW; + var x:number = ringradius*Math.cos(verangle); + var y:number = ringradius*Math.sin(verangle); + var normLen:number = 1/Math.sqrt(x*x + y*y + z*z); + var tanLen:number = Math.sqrt(y*y + x*x); + + if (this._yUp) { + + t1 = 0; + t2 = tanLen > .007? x/tanLen : 0; + comp1 = -z; + comp2 = y; + + } else { + t1 = tanLen > .007? x/tanLen : 0; + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsW) { + positions[vidx] = positions[startIndex]; + positions[vidx+1] = positions[startIndex + 1]; + positions[vidx+2] = positions[startIndex + 2]; + normals[vidx] = normals[startIndex] + (x*normLen)*.5; + normals[vidx+1] = normals[startIndex + 1] + ( comp1*normLen)*.5; + normals[vidx+2] = normals[startIndex + 2] + (comp2*normLen)*.5; + tangents[vidx] = tanLen > .007? -y/tanLen : 1; + tangents[vidx+1] = t1; + tangents[vidx+2] = t2; + + } else { + + positions[vidx] = x; + positions[vidx+1] = comp1; + positions[vidx+2] = comp2; + normals[vidx] = x*normLen; + normals[vidx+1] = comp1*normLen; + normals[vidx+2] = comp2*normLen; + tangents[vidx] = tanLen > .007? -y/tanLen : 1; + tangents[vidx+1] = t1; + tangents[vidx+2] = t2; + } + + if (i > 0 && j > 0) { + + var a:number = (this._segmentsW + 1)*j + i; + var b:number = (this._segmentsW + 1)*j + i - 1; + var c:number = (this._segmentsW + 1)*(j - 1) + i - 1; + var d:number = (this._segmentsW + 1)*(j - 1) + i; + + if (j == this._segmentsH) { + + positions[vidx] = positions[startIndex]; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + + } else if (j == 1) { + + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + + } else { + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + } + + vidx += 3; + } + } + + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + + } else if (geometryType == "lineSubGeometry") { + + var lineGeometry:LineSubGeometry = target; + + var numSegments:number = (this._segmentsH - 1)*this._segmentsW*2; + var startPositions:Array; + var endPositions:Array; + var thickness:Array; + + if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { + startPositions = lineGeometry.startPositions; + endPositions = lineGeometry.endPositions; + thickness = lineGeometry.thickness; + } else { + startPositions = new Array(numSegments*3); + endPositions = new Array(numSegments*3); + thickness = new Array(numSegments); + } + + vidx = 0; + + fidx = 0; + + for (j = 0; j <= this._segmentsH; ++j) { + + var horangle:number = Math.PI*j/this._segmentsH; + var z:number = -this._radius*Math.cos(horangle); + var ringradius:number = this._radius*Math.sin(horangle); + + for (i = 0; i <= this._segmentsW; ++i) { + var verangle:number = 2*Math.PI*i/this._segmentsW; + var x:number = ringradius*Math.cos(verangle); + var y:number = ringradius*Math.sin(verangle); + + if (this._yUp) { + comp1 = -z; + comp2 = y; + + } else { + comp1 = y; + comp2 = z; + } + + if (i > 0 && j > 0) { + //horizonal lines + if (j < this._segmentsH) { + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + //vertical lines + startPositions[vidx] = endPositions[vidx - this._segmentsW*6]; + startPositions[vidx + 1] = endPositions[vidx + 1 - this._segmentsW*6]; + startPositions[vidx + 2] = endPositions[vidx + 2 - this._segmentsW*6]; + + endPositions[vidx] = x; + endPositions[vidx + 1] = comp1; + endPositions[vidx + 2] = comp2; + + thickness[fidx++] = 1; + + vidx += 3; + } + + if (i < this._segmentsW && j > 0 && j < this._segmentsH) { + startPositions[vidx] = x; + startPositions[vidx + 1] = comp1; + startPositions[vidx + 2] = comp2; + } + } + } + + // build real data from raw data + lineGeometry.updatePositions(startPositions, endPositions); + lineGeometry.updateThickness(thickness); + } + } + + /** + * @inheritDoc + */ + public _pBuildUVs(target:SubGeometryBase, geometryType:string) + { + var i:number, j:number; + var numVertices:number = (this._segmentsH + 1)*(this._segmentsW + 1); + var uvs:Array; + + + if (geometryType == "triangleSubGeometry") { + + numVertices = (this._segmentsH + 1)*(this._segmentsW + 1); + + var triangleGeometry:TriangleSubGeometry = target; + + if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(numVertices*2); + } + + var index:number = 0; + for (j = 0; j <= this._segmentsH; ++j) { + for (i = 0; i <= this._segmentsW; ++i) { + uvs[index++] = ( i/this._segmentsW )*triangleGeometry.scaleU; + uvs[index++] = ( j/this._segmentsH )*triangleGeometry.scaleV; + } + } + + triangleGeometry.updateUVs(uvs); + + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + } +} + +export = PrimitiveSpherePrefab; \ No newline at end of file diff --git a/lib/prefabs/PrimitiveTorusPrefab.js b/lib/prefabs/PrimitiveTorusPrefab.js new file mode 100755 index 00000000..f05a81bb --- /dev/null +++ b/lib/prefabs/PrimitiveTorusPrefab.js @@ -0,0 +1,293 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** +* A UV Cylinder primitive mesh. +*/ +var PrimitiveTorusPrefab = (function (_super) { + __extends(PrimitiveTorusPrefab, _super); + /** + * Creates a new Torus object. + * @param radius The radius of the torus. + * @param tuebRadius The radius of the inner tube of the torus. + * @param segmentsR Defines the number of horizontal segments that make up the torus. + * @param segmentsT Defines the number of vertical segments that make up the torus. + * @param yUp Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + function PrimitiveTorusPrefab(radius, tubeRadius, segmentsR, segmentsT, yUp) { + if (typeof radius === "undefined") { radius = 50; } + if (typeof tubeRadius === "undefined") { tubeRadius = 50; } + if (typeof segmentsR === "undefined") { segmentsR = 16; } + if (typeof segmentsT === "undefined") { segmentsT = 8; } + if (typeof yUp === "undefined") { yUp = true; } + _super.call(this); + this._numVertices = 0; + + this._radius = radius; + this._tubeRadius = tubeRadius; + this._segmentsR = segmentsR; + this._segmentsT = segmentsT; + this._yUp = yUp; + } + Object.defineProperty(PrimitiveTorusPrefab.prototype, "radius", { + /** + * The radius of the torus. + */ + get: function () { + return this._radius; + }, + set: function (value) { + this._radius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveTorusPrefab.prototype, "tubeRadius", { + /** + * The radius of the inner tube of the torus. + */ + get: function () { + return this._tubeRadius; + }, + set: function (value) { + this._tubeRadius = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveTorusPrefab.prototype, "segmentsR", { + /** + * Defines the number of horizontal segments that make up the torus. Defaults to 16. + */ + get: function () { + return this._segmentsR; + }, + set: function (value) { + this._segmentsR = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveTorusPrefab.prototype, "segmentsT", { + /** + * Defines the number of vertical segments that make up the torus. Defaults to 8. + */ + get: function () { + return this._segmentsT; + }, + set: function (value) { + this._segmentsT = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PrimitiveTorusPrefab.prototype, "yUp", { + /** + * Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + get: function () { + return this._yUp; + }, + set: function (value) { + this._yUp = value; + this._pInvalidateGeometry(); + }, + enumerable: true, + configurable: true + }); + + + /** + * @inheritDoc + */ + PrimitiveTorusPrefab.prototype._pBuildGeometry = function (target, geometryType) { + var indices; + var positions; + var normals; + var tangents; + + var i, j; + var x, y, z, nx, ny, nz, revolutionAngleR, revolutionAngleT; + var vidx; + var fidx; + var numIndices = 0; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // evaluate target number of vertices, triangles and indices + this._numVertices = (this._segmentsT + 1) * (this._segmentsR + 1); // segmentsT + 1 because of closure, segmentsR + 1 because of closure + numIndices = this._segmentsT * this._segmentsR * 6; // each level has segmentR quads, each of 2 triangles + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices); + positions = new Array(this._numVertices * 3); + normals = new Array(this._numVertices * 3); + tangents = new Array(this._numVertices * 3); + + this._pInvalidateUVs(); + } + + vidx = 0; + fidx = 0; + + // evaluate revolution steps + var revolutionAngleDeltaR = 2 * Math.PI / this._segmentsR; + var revolutionAngleDeltaT = 2 * Math.PI / this._segmentsT; + + var comp1, comp2; + var t1, t2, n1, n2; + var startIndex = 0; + var nextVertexIndex = 0; + + // surface + var a, b, c, d, length; + + for (j = 0; j <= this._segmentsT; ++j) { + startIndex = nextVertexIndex * 3; + + for (i = 0; i <= this._segmentsR; ++i) { + // revolution vertex + revolutionAngleR = i * revolutionAngleDeltaR; + revolutionAngleT = j * revolutionAngleDeltaT; + + length = Math.cos(revolutionAngleT); + nx = length * Math.cos(revolutionAngleR); + ny = length * Math.sin(revolutionAngleR); + nz = Math.sin(revolutionAngleT); + + x = this._radius * Math.cos(revolutionAngleR) + this._tubeRadius * nx; + y = this._radius * Math.sin(revolutionAngleR) + this._tubeRadius * ny; + z = (j == this._segmentsT) ? 0 : this._tubeRadius * nz; + + if (this._yUp) { + n1 = -nz; + n2 = ny; + t1 = 0; + t2 = (length ? nx / length : x / this._radius); + comp1 = -z; + comp2 = y; + } else { + n1 = ny; + n2 = nz; + t1 = (length ? nx / length : x / this._radius); + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsR) { + positions[vidx] = x; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = nx; + normals[vidx + 1] = n1; + normals[vidx + 2] = n2; + tangents[vidx] = -(length ? ny / length : y / this._radius); + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + + vidx += 3; + + // close triangle + if (i > 0 && j > 0) { + a = nextVertexIndex; // current + b = nextVertexIndex - 1; // previous + c = b - this._segmentsR - 1; // previous of last level + d = a - this._segmentsR - 1; // current of last level + + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + + nextVertexIndex++; + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + } else if (geometryType == "lineSubGeometry") { + //TODO + } + }; + + /** + * @inheritDoc + */ + PrimitiveTorusPrefab.prototype._pBuildUVs = function (target, geometryType) { + var i, j; + var uvs; + + if (geometryType == "triangleSubGeometry") { + var triangleGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices * 2); + } + + // current uv component index + var index = 0; + + for (j = 0; j <= this._segmentsT; ++j) { + for (i = 0; i <= this._segmentsR; ++i) { + // revolution vertex + uvs[index++] = (i / this._segmentsR) * triangleGeometry.scaleU; + uvs[index++] = (j / this._segmentsT) * triangleGeometry.scaleV; + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + }; + return PrimitiveTorusPrefab; +})(PrimitivePrefabBase); + +module.exports = PrimitiveTorusPrefab; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByZWZhYnMvUHJpbWl0aXZlVG9ydXNQcmVmYWIudHMiXSwibmFtZXMiOlsiUHJpbWl0aXZlVG9ydXNQcmVmYWIiLCJQcmltaXRpdmVUb3J1c1ByZWZhYi5jb25zdHJ1Y3RvciIsIlByaW1pdGl2ZVRvcnVzUHJlZmFiLl9wQnVpbGRHZW9tZXRyeSIsIlByaW1pdGl2ZVRvcnVzUHJlZmFiLl9wQnVpbGRVVnMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdGQUdxRjs7QUFFckY7O0VBRUc7QUFDSDtJQUFtQ0EsdUNBQW1CQTtJQXlGckRBOzs7Ozs7O01BREdBO0lBQ0hBLDhCQUFZQSxNQUFrQkEsRUFBRUEsVUFBc0JBLEVBQUVBLFNBQXFCQSxFQUFFQSxTQUFvQkEsRUFBRUEsR0FBa0JBO1FBQTNHQyxxQ0FBQUEsTUFBTUEsR0FBVUEsRUFBRUE7QUFBQUEsUUFBRUEseUNBQUFBLFVBQVVBLEdBQVVBLEVBQUVBO0FBQUFBLFFBQUVBLHdDQUFBQSxTQUFTQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUFFQSx3Q0FBQUEsU0FBU0EsR0FBVUEsQ0FBQ0E7QUFBQUEsUUFBRUEsa0NBQUFBLEdBQUdBLEdBQVdBLElBQUlBO0FBQUFBLFFBRXRIQSxXQUFNQSxLQUFBQSxDQUFDQTtRQXBGUkEsS0FBUUEsWUFBWUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7O1FBc0YvQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsTUFBTUE7UUFDckJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLFVBQVVBO1FBQzdCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxTQUFTQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsU0FBU0E7UUFDM0JBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLEdBQUdBO0lBQ2hCQSxDQUFDQTtJQXRGREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFrQkEsS0FBWUE7WUFF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QSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQTtnQkFDdENBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUVBO29CQUN0Q0Esb0JBQW9CQTtvQkFDcEJBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLEdBQUdBLENBQUVBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUVBLEdBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUE7b0JBQzVEQSxHQUFHQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFFQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFFQSxHQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BO2lCQUM1REE7YUFDREE7O1lBRURBLGdDQUFnQ0E7WUFDaENBLGdCQUFnQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FFL0JBLE1BQU1BLElBQUlBLFlBQVlBLElBQUlBLGlCQUFpQkEsQ0FBRUE7WUFDN0NBLG9CQUFvQkE7U0FDcEJBO0lBQ0ZBLENBQUNBO0lBQ0ZILDRCQUFDQTtBQUFEQSxDQUFDQSxFQTVSa0MsbUJBQW1CLEVBNFJyRDs7QUFFRCxxQ0FBOEIsQ0FBQSIsImZpbGUiOiJwcmVmYWJzL1ByaW1pdGl2ZVRvcnVzUHJlZmFiLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFN1Ykdlb21ldHJ5QmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvU3ViR2VvbWV0cnlCYXNlXCIpO1xuaW1wb3J0IFRyaWFuZ2xlU3ViR2VvbWV0cnlcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9UcmlhbmdsZVN1Ykdlb21ldHJ5XCIpO1xuaW1wb3J0IElBc3NldFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0lBc3NldFwiKTtcbmltcG9ydCBQcmltaXRpdmVQcmVmYWJCYXNlXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcmVmYWJzL1ByaW1pdGl2ZVByZWZhYkJhc2VcIik7XG5cbi8qKlxuICogQSBVViBDeWxpbmRlciBwcmltaXRpdmUgbWVzaC5cbiAqL1xuY2xhc3MgUHJpbWl0aXZlVG9ydXNQcmVmYWIgZXh0ZW5kcyBQcmltaXRpdmVQcmVmYWJCYXNlIGltcGxlbWVudHMgSUFzc2V0XG57XG5cdHByaXZhdGUgX3JhZGl1czpudW1iZXI7XG5cdHByaXZhdGUgX3R1YmVSYWRpdXM6bnVtYmVyO1xuXHRwcml2YXRlIF9zZWdtZW50c1I6bnVtYmVyO1xuXHRwcml2YXRlIF9zZWdtZW50c1Q6bnVtYmVyO1xuXHRwcml2YXRlIF95VXA6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfbnVtVmVydGljZXM6bnVtYmVyID0gMDtcblxuXHQvKipcblx0ICogVGhlIHJhZGl1cyBvZiB0aGUgdG9ydXMuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHJhZGl1cygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3JhZGl1cztcblx0fVxuXG5cdHB1YmxpYyBzZXQgcmFkaXVzKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3JhZGl1cyA9IHZhbHVlO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgcmFkaXVzIG9mIHRoZSBpbm5lciB0dWJlIG9mIHRoZSB0b3J1cy5cblx0ICovXG5cdHB1YmxpYyBnZXQgdHViZVJhZGl1cygpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3R1YmVSYWRpdXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHR1YmVSYWRpdXModmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fdHViZVJhZGl1cyA9IHZhbHVlO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBEZWZpbmVzIHRoZSBudW1iZXIgb2YgaG9yaXpvbnRhbCBzZWdtZW50cyB0aGF0IG1ha2UgdXAgdGhlIHRvcnVzLiBEZWZhdWx0cyB0byAxNi5cblx0ICovXG5cdHB1YmxpYyBnZXQgc2VnbWVudHNSKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fc2VnbWVudHNSO1xuXHR9XG5cblx0cHVibGljIHNldCBzZWdtZW50c1IodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fc2VnbWVudHNSID0gdmFsdWU7XG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlVVZzKCk7XG5cdH1cblxuXHQvKipcblx0ICogRGVmaW5lcyB0aGUgbnVtYmVyIG9mIHZlcnRpY2FsIHNlZ21lbnRzIHRoYXQgbWFrZSB1cCB0aGUgdG9ydXMuIERlZmF1bHRzIHRvIDguXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHNlZ21lbnRzVCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3NlZ21lbnRzVDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgc2VnbWVudHNUKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3NlZ21lbnRzVCA9IHZhbHVlO1xuXHRcdHRoaXMuX3BJbnZhbGlkYXRlR2VvbWV0cnkoKTtcblx0XHR0aGlzLl9wSW52YWxpZGF0ZVVWcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmluZXMgd2hldGhlciB0aGUgdG9ydXMgcG9sZXMgc2hvdWxkIGxheSBvbiB0aGUgWS1heGlzICh0cnVlKSBvciBvbiB0aGUgWi1heGlzIChmYWxzZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHlVcCgpOmJvb2xlYW5cblx0e1xuXHRcdHJldHVybiB0aGlzLl95VXA7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHlVcCh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0dGhpcy5feVVwID0gdmFsdWU7XG5cdFx0dGhpcy5fcEludmFsaWRhdGVHZW9tZXRyeSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgPGNvZGU+VG9ydXM8L2NvZGU+IG9iamVjdC5cblx0ICogQHBhcmFtIHJhZGl1cyBUaGUgcmFkaXVzIG9mIHRoZSB0b3J1cy5cblx0ICogQHBhcmFtIHR1ZWJSYWRpdXMgVGhlIHJhZGl1cyBvZiB0aGUgaW5uZXIgdHViZSBvZiB0aGUgdG9ydXMuXG5cdCAqIEBwYXJhbSBzZWdtZW50c1IgRGVmaW5lcyB0aGUgbnVtYmVyIG9mIGhvcml6b250YWwgc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSB0b3J1cy5cblx0ICogQHBhcmFtIHNlZ21lbnRzVCBEZWZpbmVzIHRoZSBudW1iZXIgb2YgdmVydGljYWwgc2VnbWVudHMgdGhhdCBtYWtlIHVwIHRoZSB0b3J1cy5cblx0ICogQHBhcmFtIHlVcCBEZWZpbmVzIHdoZXRoZXIgdGhlIHRvcnVzIHBvbGVzIHNob3VsZCBsYXkgb24gdGhlIFktYXhpcyAodHJ1ZSkgb3Igb24gdGhlIFotYXhpcyAoZmFsc2UpLlxuXHQgKi9cblx0Y29uc3RydWN0b3IocmFkaXVzOm51bWJlciA9IDUwLCB0dWJlUmFkaXVzOm51bWJlciA9IDUwLCBzZWdtZW50c1I6bnVtYmVyID0gMTYsIHNlZ21lbnRzVDpudW1iZXIgPSA4LCB5VXA6Ym9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fcmFkaXVzID0gcmFkaXVzO1xuXHRcdHRoaXMuX3R1YmVSYWRpdXMgPSB0dWJlUmFkaXVzO1xuXHRcdHRoaXMuX3NlZ21lbnRzUiA9IHNlZ21lbnRzUjtcblx0XHR0aGlzLl9zZWdtZW50c1QgPSBzZWdtZW50c1Q7XG5cdFx0dGhpcy5feVVwID0geVVwO1xuXHR9XG5cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfcEJ1aWxkR2VvbWV0cnkodGFyZ2V0OlN1Ykdlb21ldHJ5QmFzZSwgZ2VvbWV0cnlUeXBlOnN0cmluZylcblx0e1xuXHRcdHZhciBpbmRpY2VzOkFycmF5PG51bWJlcj4gLyp1aW50Ki87XG5cdFx0dmFyIHBvc2l0aW9uczpBcnJheTxudW1iZXI+O1xuXHRcdHZhciBub3JtYWxzOkFycmF5PG51bWJlcj47XG5cdFx0dmFyIHRhbmdlbnRzOkFycmF5PG51bWJlcj47XG5cblx0XHR2YXIgaTpudW1iZXIsIGo6bnVtYmVyO1xuXHRcdHZhciB4Om51bWJlciwgeTpudW1iZXIsIHo6bnVtYmVyLCBueDpudW1iZXIsIG55Om51bWJlciwgbno6bnVtYmVyLCByZXZvbHV0aW9uQW5nbGVSOm51bWJlciwgcmV2b2x1dGlvbkFuZ2xlVDpudW1iZXI7XG5cdFx0dmFyIHZpZHg6bnVtYmVyO1xuXHRcdHZhciBmaWR4Om51bWJlcjtcblx0XHR2YXIgbnVtSW5kaWNlczpudW1iZXIgPSAwO1xuXG5cdFx0aWYgKGdlb21ldHJ5VHlwZSA9PSBcInRyaWFuZ2xlU3ViR2VvbWV0cnlcIikge1xuXG5cdFx0XHR2YXIgdHJpYW5nbGVHZW9tZXRyeTpUcmlhbmdsZVN1Ykdlb21ldHJ5ID0gPFRyaWFuZ2xlU3ViR2VvbWV0cnk+IHRhcmdldDtcblxuXHRcdFx0Ly8gZXZhbHVhdGUgdGFyZ2V0IG51bWJlciBvZiB2ZXJ0aWNlcywgdHJpYW5nbGVzIGFuZCBpbmRpY2VzXG5cdFx0XHR0aGlzLl9udW1WZXJ0aWNlcyA9ICh0aGlzLl9zZWdtZW50c1QgKyAxKSoodGhpcy5fc2VnbWVudHNSICsgMSk7IC8vIHNlZ21lbnRzVCArIDEgYmVjYXVzZSBvZiBjbG9zdXJlLCBzZWdtZW50c1IgKyAxIGJlY2F1c2Ugb2YgY2xvc3VyZVxuXHRcdFx0bnVtSW5kaWNlcyA9IHRoaXMuX3NlZ21lbnRzVCp0aGlzLl9zZWdtZW50c1IqNjsgLy8gZWFjaCBsZXZlbCBoYXMgc2VnbWVudFIgcXVhZHMsIGVhY2ggb2YgMiB0cmlhbmdsZXNcblxuXHRcdFx0Ly8gbmVlZCB0byBpbml0aWFsaXplIHJhdyBhcnJheXMgb3IgY2FuIGJlIHJldXNlZD9cblx0XHRcdGlmICh0aGlzLl9udW1WZXJ0aWNlcyA9PSB0cmlhbmdsZUdlb21ldHJ5Lm51bVZlcnRpY2VzKSB7XG5cdFx0XHRcdGluZGljZXMgPSB0cmlhbmdsZUdlb21ldHJ5LmluZGljZXM7XG5cdFx0XHRcdHBvc2l0aW9ucyA9IHRyaWFuZ2xlR2VvbWV0cnkucG9zaXRpb25zO1xuXHRcdFx0XHRub3JtYWxzID0gdHJpYW5nbGVHZW9tZXRyeS52ZXJ0ZXhOb3JtYWxzO1xuXHRcdFx0XHR0YW5nZW50cyA9IHRyaWFuZ2xlR2VvbWV0cnkudmVydGV4VGFuZ2VudHM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbmRpY2VzID0gbmV3IEFycmF5PG51bWJlcj4obnVtSW5kaWNlcylcblx0XHRcdFx0cG9zaXRpb25zID0gbmV3IEFycmF5PG51bWJlcj4odGhpcy5fbnVtVmVydGljZXMqMyk7XG5cdFx0XHRcdG5vcm1hbHMgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLl9udW1WZXJ0aWNlcyozKTtcblx0XHRcdFx0dGFuZ2VudHMgPSBuZXcgQXJyYXk8bnVtYmVyPih0aGlzLl9udW1WZXJ0aWNlcyozKTtcblxuXHRcdFx0XHR0aGlzLl9wSW52YWxpZGF0ZVVWcygpO1xuXHRcdFx0fVxuXG5cblx0XHRcdHZpZHggPSAwO1xuXHRcdFx0ZmlkeCA9IDA7XG5cblx0XHRcdC8vIGV2YWx1YXRlIHJldm9sdXRpb24gc3RlcHNcblx0XHRcdHZhciByZXZvbHV0aW9uQW5nbGVEZWx0YVI6bnVtYmVyID0gMipNYXRoLlBJL3RoaXMuX3NlZ21lbnRzUjtcblx0XHRcdHZhciByZXZvbHV0aW9uQW5nbGVEZWx0YVQ6bnVtYmVyID0gMipNYXRoLlBJL3RoaXMuX3NlZ21lbnRzVDtcblxuXHRcdFx0dmFyIGNvbXAxOm51bWJlciwgY29tcDI6bnVtYmVyO1xuXHRcdFx0dmFyIHQxOm51bWJlciwgdDI6bnVtYmVyLCBuMTpudW1iZXIsIG4yOm51bWJlcjtcblx0XHRcdHZhciBzdGFydEluZGV4Om51bWJlciA9IDA7XG5cdFx0XHR2YXIgbmV4dFZlcnRleEluZGV4Om51bWJlciA9IDA7XG5cblx0XHRcdC8vIHN1cmZhY2Vcblx0XHRcdHZhciBhOm51bWJlciwgYjpudW1iZXIsIGM6bnVtYmVyLCBkOm51bWJlciwgbGVuZ3RoOm51bWJlcjtcblxuXHRcdFx0Zm9yIChqID0gMDsgaiA8PSB0aGlzLl9zZWdtZW50c1Q7ICsraikge1xuXG5cdFx0XHRcdHN0YXJ0SW5kZXggPSBuZXh0VmVydGV4SW5kZXgqMztcblxuXHRcdFx0XHRmb3IgKGkgPSAwOyBpIDw9IHRoaXMuX3NlZ21lbnRzUjsgKytpKSB7XG5cblx0XHRcdFx0XHQvLyByZXZvbHV0aW9uIHZlcnRleFxuXHRcdFx0XHRcdHJldm9sdXRpb25BbmdsZVIgPSBpKnJldm9sdXRpb25BbmdsZURlbHRhUjtcblx0XHRcdFx0XHRyZXZvbHV0aW9uQW5nbGVUID0gaipyZXZvbHV0aW9uQW5nbGVEZWx0YVQ7XG5cblx0XHRcdFx0XHRsZW5ndGggPSBNYXRoLmNvcyhyZXZvbHV0aW9uQW5nbGVUKTtcblx0XHRcdFx0XHRueCA9IGxlbmd0aCpNYXRoLmNvcyhyZXZvbHV0aW9uQW5nbGVSKTtcblx0XHRcdFx0XHRueSA9IGxlbmd0aCpNYXRoLnNpbihyZXZvbHV0aW9uQW5nbGVSKTtcblx0XHRcdFx0XHRueiA9IE1hdGguc2luKHJldm9sdXRpb25BbmdsZVQpO1xuXG5cdFx0XHRcdFx0eCA9IHRoaXMuX3JhZGl1cypNYXRoLmNvcyhyZXZvbHV0aW9uQW5nbGVSKSArIHRoaXMuX3R1YmVSYWRpdXMqbng7XG5cdFx0XHRcdFx0eSA9IHRoaXMuX3JhZGl1cypNYXRoLnNpbihyZXZvbHV0aW9uQW5nbGVSKSArIHRoaXMuX3R1YmVSYWRpdXMqbnk7XG5cdFx0XHRcdFx0eiA9IChqID09IHRoaXMuX3NlZ21lbnRzVCk/IDAgOiB0aGlzLl90dWJlUmFkaXVzKm56O1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuX3lVcCkge1xuXG5cdFx0XHRcdFx0XHRuMSA9IC1uejtcblx0XHRcdFx0XHRcdG4yID0gbnk7XG5cdFx0XHRcdFx0XHR0MSA9IDA7XG5cdFx0XHRcdFx0XHR0MiA9IChsZW5ndGg/IG54L2xlbmd0aCA6IHgvdGhpcy5fcmFkaXVzKTtcblx0XHRcdFx0XHRcdGNvbXAxID0gLXo7XG5cdFx0XHRcdFx0XHRjb21wMiA9IHk7XG5cblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0bjEgPSBueTtcblx0XHRcdFx0XHRcdG4yID0gbno7XG5cdFx0XHRcdFx0XHR0MSA9IChsZW5ndGg/IG54L2xlbmd0aCA6IHgvdGhpcy5fcmFkaXVzKTtcblx0XHRcdFx0XHRcdHQyID0gMDtcblx0XHRcdFx0XHRcdGNvbXAxID0geTtcblx0XHRcdFx0XHRcdGNvbXAyID0gejtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaSA9PSB0aGlzLl9zZWdtZW50c1IpIHtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4XSA9IHg7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeCArIDFdID0gcG9zaXRpb25zW3N0YXJ0SW5kZXggKyAxXTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uc1t2aWR4ICsgMl0gPSBwb3NpdGlvbnNbc3RhcnRJbmRleCArIDJdO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRwb3NpdGlvbnNbdmlkeF0gPSB4O1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAxXSA9IGNvbXAxO1xuXHRcdFx0XHRcdFx0cG9zaXRpb25zW3ZpZHggKyAyXSA9IGNvbXAyO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeF0gPSBueDtcblx0XHRcdFx0XHRub3JtYWxzW3ZpZHggKyAxXSA9IG4xO1xuXHRcdFx0XHRcdG5vcm1hbHNbdmlkeCArIDJdID0gbjI7XG5cdFx0XHRcdFx0dGFuZ2VudHNbdmlkeF0gPSAtKGxlbmd0aD8gbnkvbGVuZ3RoIDogeS90aGlzLl9yYWRpdXMpO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAxXSA9IHQxO1xuXHRcdFx0XHRcdHRhbmdlbnRzW3ZpZHggKyAyXSA9IHQyO1xuXG5cdFx0XHRcdFx0dmlkeCArPSAzO1xuXG5cdFx0XHRcdFx0Ly8gY2xvc2UgdHJpYW5nbGVcblx0XHRcdFx0XHRpZiAoaSA+IDAgJiYgaiA+IDApIHtcblx0XHRcdFx0XHRcdGEgPSBuZXh0VmVydGV4SW5kZXg7IC8vIGN1cnJlbnRcblx0XHRcdFx0XHRcdGIgPSBuZXh0VmVydGV4SW5kZXggLSAxOyAvLyBwcmV2aW91c1xuXHRcdFx0XHRcdFx0YyA9IGIgLSB0aGlzLl9zZWdtZW50c1IgLSAxOyAvLyBwcmV2aW91cyBvZiBsYXN0IGxldmVsXG5cdFx0XHRcdFx0XHRkID0gYSAtIHRoaXMuX3NlZ21lbnRzUiAtIDE7IC8vIGN1cnJlbnQgb2YgbGFzdCBsZXZlbFxuXG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBhO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gYjtcblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGM7XG5cblx0XHRcdFx0XHRcdGluZGljZXNbZmlkeCsrXSA9IGE7XG5cdFx0XHRcdFx0XHRpbmRpY2VzW2ZpZHgrK10gPSBjO1xuXHRcdFx0XHRcdFx0aW5kaWNlc1tmaWR4KytdID0gZDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRuZXh0VmVydGV4SW5kZXgrKztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBidWlsZCByZWFsIGRhdGEgZnJvbSByYXcgZGF0YVxuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVJbmRpY2VzKGluZGljZXMpO1xuXG5cdFx0XHR0cmlhbmdsZUdlb21ldHJ5LnVwZGF0ZVBvc2l0aW9ucyhwb3NpdGlvbnMpO1xuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVWZXJ0ZXhOb3JtYWxzKG5vcm1hbHMpO1xuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVWZXJ0ZXhUYW5nZW50cyh0YW5nZW50cyk7XG5cblx0XHR9IGVsc2UgaWYgKGdlb21ldHJ5VHlwZSA9PSBcImxpbmVTdWJHZW9tZXRyeVwiKSB7XG5cdFx0XHQvL1RPRE9cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfcEJ1aWxkVVZzKHRhcmdldDpTdWJHZW9tZXRyeUJhc2UsIGdlb21ldHJ5VHlwZTpzdHJpbmcpXG5cdHtcblxuXHRcdHZhciBpOm51bWJlciwgajpudW1iZXI7XG5cdFx0dmFyIHV2czpBcnJheTxudW1iZXI+O1xuXG5cblx0XHRpZiAoZ2VvbWV0cnlUeXBlID09IFwidHJpYW5nbGVTdWJHZW9tZXRyeVwiKSB7XG5cblx0XHRcdHZhciB0cmlhbmdsZUdlb21ldHJ5OlRyaWFuZ2xlU3ViR2VvbWV0cnkgPSA8VHJpYW5nbGVTdWJHZW9tZXRyeT4gdGFyZ2V0O1xuXG5cdFx0XHQvLyBuZWVkIHRvIGluaXRpYWxpemUgcmF3IGFycmF5IG9yIGNhbiBiZSByZXVzZWQ/XG5cdFx0XHRpZiAodHJpYW5nbGVHZW9tZXRyeS51dnMgJiYgdGhpcy5fbnVtVmVydGljZXMgPT0gdHJpYW5nbGVHZW9tZXRyeS5udW1WZXJ0aWNlcykge1xuXHRcdFx0XHR1dnMgPSB0cmlhbmdsZUdlb21ldHJ5LnV2cztcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHV2cyA9IG5ldyBBcnJheTxudW1iZXI+KHRoaXMuX251bVZlcnRpY2VzKjIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBjdXJyZW50IHV2IGNvbXBvbmVudCBpbmRleFxuXHRcdFx0dmFyIGluZGV4Om51bWJlciA9IDA7XG5cblx0XHRcdC8vIHN1cmZhY2Vcblx0XHRcdGZvciAoaiA9IDA7IGogPD0gdGhpcy5fc2VnbWVudHNUOyArK2opIHtcblx0XHRcdFx0Zm9yIChpID0gMDsgaSA8PSB0aGlzLl9zZWdtZW50c1I7ICsraSkge1xuXHRcdFx0XHRcdC8vIHJldm9sdXRpb24gdmVydGV4XG5cdFx0XHRcdFx0dXZzW2luZGV4KytdID0gKCBpL3RoaXMuX3NlZ21lbnRzUiApKnRyaWFuZ2xlR2VvbWV0cnkuc2NhbGVVO1xuXHRcdFx0XHRcdHV2c1tpbmRleCsrXSA9ICggai90aGlzLl9zZWdtZW50c1QgKSp0cmlhbmdsZUdlb21ldHJ5LnNjYWxlVjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBidWlsZCByZWFsIGRhdGEgZnJvbSByYXcgZGF0YVxuXHRcdFx0dHJpYW5nbGVHZW9tZXRyeS51cGRhdGVVVnModXZzKTtcblxuXHRcdH0gZWxzZSBpZiAoZ2VvbWV0cnlUeXBlID09IFwibGluZVN1Ykdlb21ldHJ5XCIpIHtcblx0XHRcdC8vbm90aGluZyB0byBkbyBoZXJlXG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCA9IFByaW1pdGl2ZVRvcnVzUHJlZmFiOyJdfQ== \ No newline at end of file diff --git a/lib/prefabs/PrimitiveTorusPrefab.ts b/lib/prefabs/PrimitiveTorusPrefab.ts new file mode 100644 index 00000000..0a7d094d --- /dev/null +++ b/lib/prefabs/PrimitiveTorusPrefab.ts @@ -0,0 +1,295 @@ +import SubGeometryBase = require("awayjs-core/lib/core/base/SubGeometryBase"); +import TriangleSubGeometry = require("awayjs-core/lib/core/base/TriangleSubGeometry"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import PrimitivePrefabBase = require("awayjs-core/lib/prefabs/PrimitivePrefabBase"); + +/** + * A UV Cylinder primitive mesh. + */ +class PrimitiveTorusPrefab extends PrimitivePrefabBase implements IAsset +{ + private _radius:number; + private _tubeRadius:number; + private _segmentsR:number; + private _segmentsT:number; + private _yUp:boolean; + private _numVertices:number = 0; + + /** + * The radius of the torus. + */ + public get radius():number + { + return this._radius; + } + + public set radius(value:number) + { + this._radius = value; + this._pInvalidateGeometry(); + } + + /** + * The radius of the inner tube of the torus. + */ + public get tubeRadius():number + { + return this._tubeRadius; + } + + public set tubeRadius(value:number) + { + this._tubeRadius = value; + this._pInvalidateGeometry(); + } + + /** + * Defines the number of horizontal segments that make up the torus. Defaults to 16. + */ + public get segmentsR():number + { + return this._segmentsR; + } + + public set segmentsR(value:number) + { + this._segmentsR = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * Defines the number of vertical segments that make up the torus. Defaults to 8. + */ + public get segmentsT():number + { + return this._segmentsT; + } + + public set segmentsT(value:number) + { + this._segmentsT = value; + this._pInvalidateGeometry(); + this._pInvalidateUVs(); + } + + /** + * Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + public get yUp():boolean + { + return this._yUp; + } + + public set yUp(value:boolean) + { + this._yUp = value; + this._pInvalidateGeometry(); + } + + /** + * Creates a new Torus object. + * @param radius The radius of the torus. + * @param tuebRadius The radius of the inner tube of the torus. + * @param segmentsR Defines the number of horizontal segments that make up the torus. + * @param segmentsT Defines the number of vertical segments that make up the torus. + * @param yUp Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). + */ + constructor(radius:number = 50, tubeRadius:number = 50, segmentsR:number = 16, segmentsT:number = 8, yUp:boolean = true) + { + super(); + + this._radius = radius; + this._tubeRadius = tubeRadius; + this._segmentsR = segmentsR; + this._segmentsT = segmentsT; + this._yUp = yUp; + } + + + /** + * @inheritDoc + */ + public _pBuildGeometry(target:SubGeometryBase, geometryType:string) + { + var indices:Array /*uint*/; + var positions:Array; + var normals:Array; + var tangents:Array; + + var i:number, j:number; + var x:number, y:number, z:number, nx:number, ny:number, nz:number, revolutionAngleR:number, revolutionAngleT:number; + var vidx:number; + var fidx:number; + var numIndices:number = 0; + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + // evaluate target number of vertices, triangles and indices + this._numVertices = (this._segmentsT + 1)*(this._segmentsR + 1); // segmentsT + 1 because of closure, segmentsR + 1 because of closure + numIndices = this._segmentsT*this._segmentsR*6; // each level has segmentR quads, each of 2 triangles + + // need to initialize raw arrays or can be reused? + if (this._numVertices == triangleGeometry.numVertices) { + indices = triangleGeometry.indices; + positions = triangleGeometry.positions; + normals = triangleGeometry.vertexNormals; + tangents = triangleGeometry.vertexTangents; + } else { + indices = new Array(numIndices) + positions = new Array(this._numVertices*3); + normals = new Array(this._numVertices*3); + tangents = new Array(this._numVertices*3); + + this._pInvalidateUVs(); + } + + + vidx = 0; + fidx = 0; + + // evaluate revolution steps + var revolutionAngleDeltaR:number = 2*Math.PI/this._segmentsR; + var revolutionAngleDeltaT:number = 2*Math.PI/this._segmentsT; + + var comp1:number, comp2:number; + var t1:number, t2:number, n1:number, n2:number; + var startIndex:number = 0; + var nextVertexIndex:number = 0; + + // surface + var a:number, b:number, c:number, d:number, length:number; + + for (j = 0; j <= this._segmentsT; ++j) { + + startIndex = nextVertexIndex*3; + + for (i = 0; i <= this._segmentsR; ++i) { + + // revolution vertex + revolutionAngleR = i*revolutionAngleDeltaR; + revolutionAngleT = j*revolutionAngleDeltaT; + + length = Math.cos(revolutionAngleT); + nx = length*Math.cos(revolutionAngleR); + ny = length*Math.sin(revolutionAngleR); + nz = Math.sin(revolutionAngleT); + + x = this._radius*Math.cos(revolutionAngleR) + this._tubeRadius*nx; + y = this._radius*Math.sin(revolutionAngleR) + this._tubeRadius*ny; + z = (j == this._segmentsT)? 0 : this._tubeRadius*nz; + + if (this._yUp) { + + n1 = -nz; + n2 = ny; + t1 = 0; + t2 = (length? nx/length : x/this._radius); + comp1 = -z; + comp2 = y; + + } else { + n1 = ny; + n2 = nz; + t1 = (length? nx/length : x/this._radius); + t2 = 0; + comp1 = y; + comp2 = z; + } + + if (i == this._segmentsR) { + positions[vidx] = x; + positions[vidx + 1] = positions[startIndex + 1]; + positions[vidx + 2] = positions[startIndex + 2]; + } else { + positions[vidx] = x; + positions[vidx + 1] = comp1; + positions[vidx + 2] = comp2; + } + + normals[vidx] = nx; + normals[vidx + 1] = n1; + normals[vidx + 2] = n2; + tangents[vidx] = -(length? ny/length : y/this._radius); + tangents[vidx + 1] = t1; + tangents[vidx + 2] = t2; + + vidx += 3; + + // close triangle + if (i > 0 && j > 0) { + a = nextVertexIndex; // current + b = nextVertexIndex - 1; // previous + c = b - this._segmentsR - 1; // previous of last level + d = a - this._segmentsR - 1; // current of last level + + indices[fidx++] = a; + indices[fidx++] = b; + indices[fidx++] = c; + + indices[fidx++] = a; + indices[fidx++] = c; + indices[fidx++] = d; + } + + nextVertexIndex++; + } + } + + // build real data from raw data + triangleGeometry.updateIndices(indices); + + triangleGeometry.updatePositions(positions); + triangleGeometry.updateVertexNormals(normals); + triangleGeometry.updateVertexTangents(tangents); + + } else if (geometryType == "lineSubGeometry") { + //TODO + } + } + + /** + * @inheritDoc + */ + public _pBuildUVs(target:SubGeometryBase, geometryType:string) + { + + var i:number, j:number; + var uvs:Array; + + + if (geometryType == "triangleSubGeometry") { + + var triangleGeometry:TriangleSubGeometry = target; + + // need to initialize raw array or can be reused? + if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { + uvs = triangleGeometry.uvs; + } else { + uvs = new Array(this._numVertices*2); + } + + // current uv component index + var index:number = 0; + + // surface + for (j = 0; j <= this._segmentsT; ++j) { + for (i = 0; i <= this._segmentsR; ++i) { + // revolution vertex + uvs[index++] = ( i/this._segmentsR )*triangleGeometry.scaleU; + uvs[index++] = ( j/this._segmentsT )*triangleGeometry.scaleV; + } + } + + // build real data from raw data + triangleGeometry.updateUVs(uvs); + + } else if (geometryType == "lineSubGeometry") { + //nothing to do here + } + } +} + +export = PrimitiveTorusPrefab; \ No newline at end of file diff --git a/lib/projections/CoordinateSystem.js b/lib/projections/CoordinateSystem.js new file mode 100755 index 00000000..71c359db --- /dev/null +++ b/lib/projections/CoordinateSystem.js @@ -0,0 +1,17 @@ +/** +* Provides constant values for camera lens projection options use the the coordinateSystem property +* +* @see away.projections.PerspectiveLens#coordinateSystem +*/ +var CoordinateSystem = (function () { + function CoordinateSystem() { + } + CoordinateSystem.LEFT_HANDED = "leftHanded"; + + CoordinateSystem.RIGHT_HANDED = "rightHanded"; + return CoordinateSystem; +})(); + +module.exports = CoordinateSystem; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2plY3Rpb25zL0Nvb3JkaW5hdGVTeXN0ZW0udHMiXSwibmFtZXMiOlsiQ29vcmRpbmF0ZVN5c3RlbSIsIkNvb3JkaW5hdGVTeXN0ZW0uY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBOzs7O0VBSUc7QUFDSDtJQUFBQTtJQVdBQyxDQUFDQTtBQUFBRCxJQU5BQSwrQkFBbUNBLFlBQVlBOztJQUsvQ0EsZ0NBQW9DQSxhQUFhQTtJQUNsREEsd0JBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsaUNBQTBCLENBQUEiLCJmaWxlIjoicHJvamVjdGlvbnMvQ29vcmRpbmF0ZVN5c3RlbS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHJvdmlkZXMgY29uc3RhbnQgdmFsdWVzIGZvciBjYW1lcmEgbGVucyBwcm9qZWN0aW9uIG9wdGlvbnMgdXNlIHRoZSB0aGUgPGNvZGU+Y29vcmRpbmF0ZVN5c3RlbTwvY29kZT4gcHJvcGVydHlcbiAqXG4gKiBAc2VlIGF3YXkucHJvamVjdGlvbnMuUGVyc3BlY3RpdmVMZW5zI2Nvb3JkaW5hdGVTeXN0ZW1cbiAqL1xuY2xhc3MgQ29vcmRpbmF0ZVN5c3RlbVxue1xuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb24sIHByb2plY3RzIHRvIGEgbGVmdC1oYW5kZWQgY29vcmRpbmF0ZSBzeXN0ZW1cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgTEVGVF9IQU5ERUQ6c3RyaW5nID0gXCJsZWZ0SGFuZGVkXCI7XG5cblx0LyoqXG5cdCAqIFByb2plY3RzIHRvIGEgcmlnaHQtaGFuZGVkIGNvb3JkaW5hdGUgc3lzdGVtXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIFJJR0hUX0hBTkRFRDpzdHJpbmcgPSBcInJpZ2h0SGFuZGVkXCI7XG59XG5cbmV4cG9ydCA9IENvb3JkaW5hdGVTeXN0ZW07Il19 \ No newline at end of file diff --git a/lib/projections/CoordinateSystem.ts b/lib/projections/CoordinateSystem.ts new file mode 100644 index 00000000..d77270ce --- /dev/null +++ b/lib/projections/CoordinateSystem.ts @@ -0,0 +1,19 @@ +/** + * Provides constant values for camera lens projection options use the the coordinateSystem property + * + * @see away.projections.PerspectiveLens#coordinateSystem + */ +class CoordinateSystem +{ + /** + * Default option, projects to a left-handed coordinate system + */ + public static LEFT_HANDED:string = "leftHanded"; + + /** + * Projects to a right-handed coordinate system + */ + public static RIGHT_HANDED:string = "rightHanded"; +} + +export = CoordinateSystem; \ No newline at end of file diff --git a/lib/projections/FreeMatrixProjection.js b/lib/projections/FreeMatrixProjection.js new file mode 100755 index 00000000..ab8e4147 --- /dev/null +++ b/lib/projections/FreeMatrixProjection.js @@ -0,0 +1,64 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var FreeMatrixProjection = (function (_super) { + __extends(FreeMatrixProjection, _super); + function FreeMatrixProjection() { + _super.call(this); + + this._pMatrix.copyFrom(new PerspectiveProjection().matrix); + } + Object.defineProperty(FreeMatrixProjection.prototype, "near", { + //@override + set: function (value) { + this._pNear = value; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(FreeMatrixProjection.prototype, "far", { + //@override + set: function (value) { + this._pFar = value; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(FreeMatrixProjection.prototype, "iAspectRatio", { + //@override + set: function (value) { + this._pAspectRatio = value; + }, + enumerable: true, + configurable: true + }); + + //@override + FreeMatrixProjection.prototype.clone = function () { + var clone = new FreeMatrixProjection(); + clone._pMatrix.copyFrom(this._pMatrix); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone.pInvalidateMatrix(); + return clone; + }; + + //@override + FreeMatrixProjection.prototype.pUpdateMatrix = function () { + this._pMatrixInvalid = false; + }; + return FreeMatrixProjection; +})(ProjectionBase); + +module.exports = FreeMatrixProjection; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2plY3Rpb25zL0ZyZWVNYXRyaXhQcm9qZWN0aW9uLnRzIl0sIm5hbWVzIjpbIkZyZWVNYXRyaXhQcm9qZWN0aW9uIiwiRnJlZU1hdHJpeFByb2plY3Rpb24uY29uc3RydWN0b3IiLCJGcmVlTWF0cml4UHJvamVjdGlvbi5jbG9uZSIsIkZyZWVNYXRyaXhQcm9qZWN0aW9uLnBVcGRhdGVNYXRyaXgiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHdGQUE0RjtBQUM1RiwwRUFBZ0Y7O0FBRWhGO0lBQW1DQSx1Q0FBY0E7SUFFaERBO1FBRUNDLFdBQU1BLEtBQUFBLENBQUNBOztRQUVQQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxxQkFBcUJBLENBQUNBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBO0lBQzNEQSxDQUFDQTtJQUdERDtRQUFBQSxXQURXQTthQUNYQSxVQUFnQkEsS0FBWUE7WUFFM0JBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQUdEQTtRQUFBQSxXQURXQTthQUNYQSxVQUFlQSxLQUFZQTtZQUUxQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsS0FBS0E7UUFDbkJBLENBQUNBOzs7O0FBQUFBO0lBR0RBO1FBQUFBLFdBRFdBO2FBQ1hBLFVBQXdCQSxLQUFZQTtZQUVuQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsS0FBS0E7UUFDM0JBLENBQUNBOzs7O0FBQUFBO0lBR0RBLFdBRFdBOzJDQUNYQTtRQUVDRSxJQUFJQSxLQUFLQSxHQUF3QkEsSUFBSUEsb0JBQW9CQSxDQUFDQSxDQUFDQTtRQUMzREEsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7UUFDdENBLEtBQUtBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BO1FBQzFCQSxLQUFLQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQTtRQUN4QkEsS0FBS0EsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUE7UUFDeENBLEtBQUtBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7UUFDekJBLE9BQU9BLEtBQUtBO0lBQ2JBLENBQUNBOztJQUdERixXQURXQTttREFDWEE7UUFFQ0csSUFBSUEsQ0FBQ0EsZUFBZUEsR0FBR0EsS0FBS0E7SUFDN0JBLENBQUNBO0lBQ0ZILDRCQUFDQTtBQUFEQSxDQUFDQSxFQTVDa0MsY0FBYyxFQTRDaEQ7O0FBRUQscUNBQThCLENBQUEiLCJmaWxlIjoicHJvamVjdGlvbnMvRnJlZU1hdHJpeFByb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGVyc3BlY3RpdmVQcm9qZWN0aW9uXHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcHJvamVjdGlvbnMvUGVyc3BlY3RpdmVQcm9qZWN0aW9uXCIpO1xuaW1wb3J0IFByb2plY3Rpb25CYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3Byb2plY3Rpb25zL1Byb2plY3Rpb25CYXNlXCIpO1xuXG5jbGFzcyBGcmVlTWF0cml4UHJvamVjdGlvbiBleHRlbmRzIFByb2plY3Rpb25CYXNlXG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cblx0XHR0aGlzLl9wTWF0cml4LmNvcHlGcm9tKG5ldyBQZXJzcGVjdGl2ZVByb2plY3Rpb24oKS5tYXRyaXgpO1xuXHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIHNldCBuZWFyKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX3BOZWFyID0gdmFsdWU7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgc2V0IGZhcih2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9wRmFyID0gdmFsdWU7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgc2V0IGlBc3BlY3RSYXRpbyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9wQXNwZWN0UmF0aW8gPSB2YWx1ZTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBjbG9uZSgpOlByb2plY3Rpb25CYXNlXG5cdHtcblx0XHR2YXIgY2xvbmU6RnJlZU1hdHJpeFByb2plY3Rpb24gPSBuZXcgRnJlZU1hdHJpeFByb2plY3Rpb24oKTtcblx0XHRjbG9uZS5fcE1hdHJpeC5jb3B5RnJvbSh0aGlzLl9wTWF0cml4KTtcblx0XHRjbG9uZS5fcE5lYXIgPSB0aGlzLl9wTmVhcjtcblx0XHRjbG9uZS5fcEZhciA9IHRoaXMuX3BGYXI7XG5cdFx0Y2xvbmUuX3BBc3BlY3RSYXRpbyA9IHRoaXMuX3BBc3BlY3RSYXRpbztcblx0XHRjbG9uZS5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBwVXBkYXRlTWF0cml4KClcblx0e1xuXHRcdHRoaXMuX3BNYXRyaXhJbnZhbGlkID0gZmFsc2U7XG5cdH1cbn1cblxuZXhwb3J0ID0gRnJlZU1hdHJpeFByb2plY3Rpb247Il19 \ No newline at end of file diff --git a/lib/projections/FreeMatrixProjection.ts b/lib/projections/FreeMatrixProjection.ts new file mode 100644 index 00000000..a78bea01 --- /dev/null +++ b/lib/projections/FreeMatrixProjection.ts @@ -0,0 +1,50 @@ +import PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); +import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +class FreeMatrixProjection extends ProjectionBase +{ + constructor() + { + super(); + + this._pMatrix.copyFrom(new PerspectiveProjection().matrix); + } + + //@override + public set near(value:number) + { + this._pNear = value; + } + + //@override + public set far(value:number) + { + this._pFar = value; + } + + //@override + public set iAspectRatio(value:number) + { + this._pAspectRatio = value; + } + + //@override + public clone():ProjectionBase + { + var clone:FreeMatrixProjection = new FreeMatrixProjection(); + clone._pMatrix.copyFrom(this._pMatrix); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone.pInvalidateMatrix(); + return clone; + } + + //@override + public pUpdateMatrix() + { + this._pMatrixInvalid = false; + } +} + +export = FreeMatrixProjection; \ No newline at end of file diff --git a/lib/projections/IProjection.js b/lib/projections/IProjection.js new file mode 100755 index 00000000..7c461201 --- /dev/null +++ b/lib/projections/IProjection.js @@ -0,0 +1,3 @@ + + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2plY3Rpb25zL0lQcm9qZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBb0NxQiIsImZpbGUiOiJwcm9qZWN0aW9ucy9JUHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgSUV2ZW50RGlzcGF0Y2hlclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvSUV2ZW50RGlzcGF0Y2hlclwiKTtcblxuLyoqXG4gKiBJTWF0ZXJpYWxPd25lciBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBjYW4gdXNlIG1hdGVyaWFscy5cbiAqXG4gKiBAaW50ZXJmYWNlIGF3YXkuYmFzZS5JTWF0ZXJpYWxPd25lclxuICovXG5pbnRlcmZhY2UgSVByb2plY3Rpb24gZXh0ZW5kcyBJRXZlbnREaXNwYXRjaGVyXG57XG5cdGNvb3JkaW5hdGVTeXN0ZW06c3RyaW5nO1xuXG5cdGZydXN0dW1Db3JuZXJzOkFycmF5PG51bWJlcj5cblxuXHRtYXRyaXg6TWF0cml4M0Q7XG5cblx0bmVhcjpudW1iZXI7XG5cblx0b3JpZ2luWDpudW1iZXI7XG5cblx0b3JpZ2luWTpudW1iZXI7XG5cblx0ZmFyOm51bWJlcjtcblxuXHRfaUFzcGVjdFJhdGlvOm51bWJlcjtcblxuXHRwcm9qZWN0KHBvaW50M2Q6VmVjdG9yM0QpOlZlY3RvcjNEO1xuXG5cdHVucHJvamVjdChuWDpudW1iZXIsIG5ZOm51bWJlciwgc1o6bnVtYmVyKTpWZWN0b3IzRDtcblxuXHRfaVVwZGF0ZVNjaXNzb3JSZWN0KHg6bnVtYmVyLCB5Om51bWJlciwgd2lkdGg6bnVtYmVyLCBoZWlnaHQ6bnVtYmVyKTtcblxuXHRfaVVwZGF0ZVZpZXdwb3J0KHg6bnVtYmVyLCB5Om51bWJlciwgd2lkdGg6bnVtYmVyLCBoZWlnaHQ6bnVtYmVyKTtcbn1cblxuZXhwb3J0ID0gSVByb2plY3Rpb247Il19 \ No newline at end of file diff --git a/lib/projections/IProjection.ts b/lib/projections/IProjection.ts new file mode 100644 index 00000000..71960aee --- /dev/null +++ b/lib/projections/IProjection.ts @@ -0,0 +1,37 @@ +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import IEventDispatcher = require("awayjs-core/lib/events/IEventDispatcher"); + +/** + * IMaterialOwner provides an interface for objects that can use materials. + * + * @interface away.base.IMaterialOwner + */ +interface IProjection extends IEventDispatcher +{ + coordinateSystem:string; + + frustumCorners:Array + + matrix:Matrix3D; + + near:number; + + originX:number; + + originY:number; + + far:number; + + _iAspectRatio:number; + + project(point3d:Vector3D):Vector3D; + + unproject(nX:number, nY:number, sZ:number):Vector3D; + + _iUpdateScissorRect(x:number, y:number, width:number, height:number); + + _iUpdateViewport(x:number, y:number, width:number, height:number); +} + +export = IProjection; \ No newline at end of file diff --git a/lib/projections/ObliqueNearPlaneProjection.js b/lib/projections/ObliqueNearPlaneProjection.js new file mode 100755 index 00000000..49517779 --- /dev/null +++ b/lib/projections/ObliqueNearPlaneProjection.js @@ -0,0 +1,131 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); + +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var ObliqueNearPlaneProjection = (function (_super) { + __extends(ObliqueNearPlaneProjection, _super); + function ObliqueNearPlaneProjection(baseProjection, plane) { + var _this = this; + _super.call(this); + this.baseProjection = baseProjection; + this.plane = plane; + + this._onProjectionMatrixChangedDelegate = function (event) { + return _this.onProjectionMatrixChanged(event); + }; + } + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "frustumCorners", { + //@override + get: function () { + return this._baseProjection.frustumCorners; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "near", { + //@override + get: function () { + return this._baseProjection.near; + }, + //@override + set: function (value) { + this._baseProjection.near = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "far", { + //@override + get: function () { + return this._baseProjection.far; + }, + //@override + set: function (value) { + this._baseProjection.far = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "iAspectRatio", { + //@override + get: function () { + return this._baseProjection._iAspectRatio; + }, + //@override + set: function (value) { + this._baseProjection._iAspectRatio = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "plane", { + get: function () { + return this._plane; + }, + set: function (value) { + this._plane = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ObliqueNearPlaneProjection.prototype, "baseProjection", { + set: function (value) { + if (this._baseProjection) { + this._baseProjection.removeEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + } + this._baseProjection = value; + + if (this._baseProjection) { + this._baseProjection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + } + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + ObliqueNearPlaneProjection.prototype.onProjectionMatrixChanged = function (event) { + this.pInvalidateMatrix(); + }; + + //@override + ObliqueNearPlaneProjection.prototype.pUpdateMatrix = function () { + this._pMatrix.copyFrom(this._baseProjection.matrix); + + var cx = this._plane.a; + var cy = this._plane.b; + var cz = this._plane.c; + var cw = -this._plane.d + .05; + var signX = cx >= 0 ? 1 : -1; + var signY = cy >= 0 ? 1 : -1; + var p = new Vector3D(signX, signY, 1, 1); + var inverse = this._pMatrix.clone(); + inverse.invert(); + var q = inverse.transformVector(p); + this._pMatrix.copyRowTo(3, p); + var a = (q.x * p.x + q.y * p.y + q.z * p.z + q.w * p.w) / (cx * q.x + cy * q.y + cz * q.z + cw * q.w); + this._pMatrix.copyRowFrom(2, new Vector3D(cx * a, cy * a, cz * a, cw * a)); + }; + return ObliqueNearPlaneProjection; +})(ProjectionBase); + +module.exports = ObliqueNearPlaneProjection; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2plY3Rpb25zL09ibGlxdWVOZWFyUGxhbmVQcm9qZWN0aW9uLnRzIl0sIm5hbWVzIjpbIk9ibGlxdWVOZWFyUGxhbmVQcm9qZWN0aW9uIiwiT2JsaXF1ZU5lYXJQbGFuZVByb2plY3Rpb24uY29uc3RydWN0b3IiLCJPYmxpcXVlTmVhclBsYW5lUHJvamVjdGlvbi5vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkIiwiT2JsaXF1ZU5lYXJQbGFuZVByb2plY3Rpb24ucFVwZGF0ZU1hdHJpeCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNERBRW9FO0FBQ3BFLHVFQUE2RTs7QUFFN0UsMEVBQWdGOztBQUVoRjtJQUF5Q0EsNkNBQWNBO0lBT3REQSxvQ0FBWUEsY0FBMEJBLEVBQUVBLEtBQWFBO1FBQXJEQyxpQkFPQ0E7UUFMQUEsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFDUEEsSUFBSUEsQ0FBQ0EsY0FBY0EsR0FBR0EsY0FBY0E7UUFDcENBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLEtBQUtBOztRQUVsQkEsSUFBSUEsQ0FBQ0Esa0NBQWtDQSxHQUFHQSxVQUFDQSxLQUFxQkE7bUJBQUtBLEtBQUlBLENBQUNBLHlCQUF5QkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBckNBLENBQXFDQTtJQUMzR0EsQ0FBQ0E7SUFHREQ7UUFBQUEsV0FEV0E7YUFDWEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsY0FBY0E7UUFDM0NBLENBQUNBOzs7O0FBQUFBO0lBR0RBO1FBQUFBLFdBRFdBO2FBQ1hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBO1FBQ2pDQSxDQUFDQTtRQUdEQSxXQURXQTthQUNYQSxVQUFnQkEsS0FBWUE7WUFFM0JBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLEdBQUdBLEtBQUtBO1FBQ2xDQSxDQUFDQTs7OztBQU5BQTs7SUFTREE7UUFBQUEsV0FEV0E7YUFDWEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsR0FBR0E7UUFDaENBLENBQUNBO1FBR0RBLFdBRFdBO2FBQ1hBLFVBQWVBLEtBQVlBO1lBRTFCQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxHQUFHQSxHQUFHQSxLQUFLQTtRQUNqQ0EsQ0FBQ0E7Ozs7QUFOQUE7O0lBU0RBO1FBQUFBLFdBRFdBO2FBQ1hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGFBQWFBO1FBQzFDQSxDQUFDQTtRQUdEQSxXQURXQTthQUNYQSxVQUF3QkEsS0FBWUE7WUFFbkNBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGFBQWFBLEdBQUdBLEtBQUtBO1FBQzNDQSxDQUFDQTs7OztBQU5BQTs7SUFRREE7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsTUFBTUE7UUFDbkJBLENBQUNBO1FBRURBLEtBQUFBLFVBQWlCQSxLQUFhQTtZQUU3QkEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0E7WUFDbkJBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7UUFDekJBLENBQUNBOzs7O0FBTkFBOztJQVFEQTtRQUFBQSxLQUFBQSxVQUEwQkEsS0FBaUJBO1lBRTFDQSxJQUFJQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFFQTtnQkFDekJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsY0FBY0EsRUFBRUEsSUFBSUEsQ0FBQ0Esa0NBQWtDQSxDQUFDQTthQUNqSEE7WUFDREEsSUFBSUEsQ0FBQ0EsZUFBZUEsR0FBR0EsS0FBS0E7O1lBRTVCQSxJQUFJQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFFQTtnQkFDekJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsY0FBY0EsRUFBRUEsSUFBSUEsQ0FBQ0Esa0NBQWtDQSxDQUFDQTthQUM5R0E7WUFDREEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFFREEsaUVBQUFBLFVBQWtDQSxLQUFxQkE7UUFFdERFLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7SUFDekJBLENBQUNBOztJQUdERixXQURXQTt5REFDWEE7UUFFQ0csSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7O1FBRW5EQSxJQUFJQSxFQUFFQSxHQUFVQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtRQUM3QkEsSUFBSUEsRUFBRUEsR0FBVUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLElBQUlBLEVBQUVBLEdBQVVBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQzdCQSxJQUFJQSxFQUFFQSxHQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQTtRQUNwQ0EsSUFBSUEsS0FBS0EsR0FBVUEsRUFBRUEsSUFBSUEsQ0FBQ0EsR0FBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7UUFDbENBLElBQUlBLEtBQUtBLEdBQVVBLEVBQUVBLElBQUlBLENBQUNBLEdBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1FBQ2xDQSxJQUFJQSxDQUFDQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUNqREEsSUFBSUEsT0FBT0EsR0FBWUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7UUFDNUNBLE9BQU9BLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQ2hCQSxJQUFJQSxDQUFDQSxHQUFZQSxPQUFPQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUMzQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFDN0JBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEVBQUVBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1FBQzFGQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxRQUFRQSxDQUFDQSxFQUFFQSxHQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUNuRUEsQ0FBQ0E7SUFDRkgsa0NBQUNBO0FBQURBLENBQUNBLEVBMUd3QyxjQUFjLEVBMEd0RDs7QUFFRCwyQ0FBb0MsQ0FBQSIsImZpbGUiOiJwcm9qZWN0aW9ucy9PYmxpcXVlTmVhclBsYW5lUHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFBsYW5lM0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9QbGFuZTNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgUHJvamVjdGlvbkV2ZW50XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9Qcm9qZWN0aW9uRXZlbnRcIik7XG5pbXBvcnQgSVByb2plY3Rpb25cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9JUHJvamVjdGlvblwiKTtcbmltcG9ydCBQcm9qZWN0aW9uQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9Qcm9qZWN0aW9uQmFzZVwiKTtcblxuY2xhc3MgT2JsaXF1ZU5lYXJQbGFuZVByb2plY3Rpb24gZXh0ZW5kcyBQcm9qZWN0aW9uQmFzZVxue1xuXG5cdHByaXZhdGUgX2Jhc2VQcm9qZWN0aW9uOklQcm9qZWN0aW9uO1xuXHRwcml2YXRlIF9wbGFuZTpQbGFuZTNEO1xuXHRwcml2YXRlIF9vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkRGVsZWdhdGU6KGV2ZW50OlByb2plY3Rpb25FdmVudCkgPT4gdm9pZDtcblxuXHRjb25zdHJ1Y3RvcihiYXNlUHJvamVjdGlvbjpJUHJvamVjdGlvbiwgcGxhbmU6UGxhbmUzRClcblx0e1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5iYXNlUHJvamVjdGlvbiA9IGJhc2VQcm9qZWN0aW9uO1xuXHRcdHRoaXMucGxhbmUgPSBwbGFuZTtcblxuXHRcdHRoaXMuX29uUHJvamVjdGlvbk1hdHJpeENoYW5nZWREZWxlZ2F0ZSA9IChldmVudDpQcm9qZWN0aW9uRXZlbnQpID0+IHRoaXMub25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZChldmVudCk7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgZ2V0IGZydXN0dW1Db3JuZXJzKCk6bnVtYmVyW11cblx0e1xuXHRcdHJldHVybiB0aGlzLl9iYXNlUHJvamVjdGlvbi5mcnVzdHVtQ29ybmVycztcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBnZXQgbmVhcigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2Jhc2VQcm9qZWN0aW9uLm5lYXI7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgc2V0IG5lYXIodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fYmFzZVByb2plY3Rpb24ubmVhciA9IHZhbHVlO1xuXHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIGdldCBmYXIoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9iYXNlUHJvamVjdGlvbi5mYXI7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgc2V0IGZhcih2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl9iYXNlUHJvamVjdGlvbi5mYXIgPSB2YWx1ZTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBnZXQgaUFzcGVjdFJhdGlvKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYmFzZVByb2plY3Rpb24uX2lBc3BlY3RSYXRpbztcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBzZXQgaUFzcGVjdFJhdGlvKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdHRoaXMuX2Jhc2VQcm9qZWN0aW9uLl9pQXNwZWN0UmF0aW8gPSB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgcGxhbmUoKTpQbGFuZTNEXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcGxhbmU7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHBsYW5lKHZhbHVlOlBsYW5lM0QpXG5cdHtcblx0XHR0aGlzLl9wbGFuZSA9IHZhbHVlO1xuXHRcdHRoaXMucEludmFsaWRhdGVNYXRyaXgoKTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgYmFzZVByb2plY3Rpb24odmFsdWU6SVByb2plY3Rpb24pXG5cdHtcblx0XHRpZiAodGhpcy5fYmFzZVByb2plY3Rpb24pIHtcblx0XHRcdHRoaXMuX2Jhc2VQcm9qZWN0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoUHJvamVjdGlvbkV2ZW50Lk1BVFJJWF9DSEFOR0VELCB0aGlzLl9vblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkRGVsZWdhdGUpO1xuXHRcdH1cblx0XHR0aGlzLl9iYXNlUHJvamVjdGlvbiA9IHZhbHVlO1xuXG5cdFx0aWYgKHRoaXMuX2Jhc2VQcm9qZWN0aW9uKSB7XG5cdFx0XHR0aGlzLl9iYXNlUHJvamVjdGlvbi5hZGRFdmVudExpc3RlbmVyKFByb2plY3Rpb25FdmVudC5NQVRSSVhfQ0hBTkdFRCwgdGhpcy5fb25Qcm9qZWN0aW9uTWF0cml4Q2hhbmdlZERlbGVnYXRlKTtcblx0XHR9XG5cdFx0dGhpcy5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHR9XG5cblx0cHJpdmF0ZSBvblByb2plY3Rpb25NYXRyaXhDaGFuZ2VkKGV2ZW50OlByb2plY3Rpb25FdmVudClcblx0e1xuXHRcdHRoaXMucEludmFsaWRhdGVNYXRyaXgoKTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBwVXBkYXRlTWF0cml4KClcblx0e1xuXHRcdHRoaXMuX3BNYXRyaXguY29weUZyb20odGhpcy5fYmFzZVByb2plY3Rpb24ubWF0cml4KTtcblxuXHRcdHZhciBjeDpudW1iZXIgPSB0aGlzLl9wbGFuZS5hO1xuXHRcdHZhciBjeTpudW1iZXIgPSB0aGlzLl9wbGFuZS5iO1xuXHRcdHZhciBjejpudW1iZXIgPSB0aGlzLl9wbGFuZS5jO1xuXHRcdHZhciBjdzpudW1iZXIgPSAtdGhpcy5fcGxhbmUuZCArIC4wNTtcblx0XHR2YXIgc2lnblg6bnVtYmVyID0gY3ggPj0gMD8gMSA6IC0xO1xuXHRcdHZhciBzaWduWTpudW1iZXIgPSBjeSA+PSAwPyAxIDogLTE7XG5cdFx0dmFyIHA6VmVjdG9yM0QgPSBuZXcgVmVjdG9yM0Qoc2lnblgsIHNpZ25ZLCAxLCAxKTtcblx0XHR2YXIgaW52ZXJzZTpNYXRyaXgzRCA9IHRoaXMuX3BNYXRyaXguY2xvbmUoKTtcblx0XHRpbnZlcnNlLmludmVydCgpO1xuXHRcdHZhciBxOlZlY3RvcjNEID0gaW52ZXJzZS50cmFuc2Zvcm1WZWN0b3IocCk7XG5cdFx0dGhpcy5fcE1hdHJpeC5jb3B5Um93VG8oMywgcCk7XG5cdFx0dmFyIGE6bnVtYmVyID0gKHEueCpwLnggKyBxLnkqcC55ICsgcS56KnAueiArIHEudypwLncpLyhjeCpxLnggKyBjeSpxLnkgKyBjeipxLnogKyBjdypxLncpO1xuXHRcdHRoaXMuX3BNYXRyaXguY29weVJvd0Zyb20oMiwgbmV3IFZlY3RvcjNEKGN4KmEsIGN5KmEsIGN6KmEsIGN3KmEpKTtcblx0fVxufVxuXG5leHBvcnQgPSBPYmxpcXVlTmVhclBsYW5lUHJvamVjdGlvbjsiXX0= \ No newline at end of file diff --git a/lib/projections/ObliqueNearPlaneProjection.ts b/lib/projections/ObliqueNearPlaneProjection.ts new file mode 100644 index 00000000..824bb64d --- /dev/null +++ b/lib/projections/ObliqueNearPlaneProjection.ts @@ -0,0 +1,116 @@ +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Plane3D = require("awayjs-core/lib/core/geom/Plane3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); +import IProjection = require("awayjs-core/lib/projections/IProjection"); +import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +class ObliqueNearPlaneProjection extends ProjectionBase +{ + + private _baseProjection:IProjection; + private _plane:Plane3D; + private _onProjectionMatrixChangedDelegate:(event:ProjectionEvent) => void; + + constructor(baseProjection:IProjection, plane:Plane3D) + { + super(); + this.baseProjection = baseProjection; + this.plane = plane; + + this._onProjectionMatrixChangedDelegate = (event:ProjectionEvent) => this.onProjectionMatrixChanged(event); + } + + //@override + public get frustumCorners():number[] + { + return this._baseProjection.frustumCorners; + } + + //@override + public get near():number + { + return this._baseProjection.near; + } + + //@override + public set near(value:number) + { + this._baseProjection.near = value; + } + + //@override + public get far():number + { + return this._baseProjection.far; + } + + //@override + public set far(value:number) + { + this._baseProjection.far = value; + } + + //@override + public get iAspectRatio():number + { + return this._baseProjection._iAspectRatio; + } + + //@override + public set iAspectRatio(value:number) + { + this._baseProjection._iAspectRatio = value; + } + + public get plane():Plane3D + { + return this._plane; + } + + public set plane(value:Plane3D) + { + this._plane = value; + this.pInvalidateMatrix(); + } + + public set baseProjection(value:IProjection) + { + if (this._baseProjection) { + this._baseProjection.removeEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + } + this._baseProjection = value; + + if (this._baseProjection) { + this._baseProjection.addEventListener(ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); + } + this.pInvalidateMatrix(); + } + + private onProjectionMatrixChanged(event:ProjectionEvent) + { + this.pInvalidateMatrix(); + } + + //@override + public pUpdateMatrix() + { + this._pMatrix.copyFrom(this._baseProjection.matrix); + + var cx:number = this._plane.a; + var cy:number = this._plane.b; + var cz:number = this._plane.c; + var cw:number = -this._plane.d + .05; + var signX:number = cx >= 0? 1 : -1; + var signY:number = cy >= 0? 1 : -1; + var p:Vector3D = new Vector3D(signX, signY, 1, 1); + var inverse:Matrix3D = this._pMatrix.clone(); + inverse.invert(); + var q:Vector3D = inverse.transformVector(p); + this._pMatrix.copyRowTo(3, p); + var a:number = (q.x*p.x + q.y*p.y + q.z*p.z + q.w*p.w)/(cx*q.x + cy*q.y + cz*q.z + cw*q.w); + this._pMatrix.copyRowFrom(2, new Vector3D(cx*a, cy*a, cz*a, cw*a)); + } +} + +export = ObliqueNearPlaneProjection; \ No newline at end of file diff --git a/lib/projections/OrthographicOffCenterProjection.js b/lib/projections/OrthographicOffCenterProjection.js new file mode 100755 index 00000000..733f6128 --- /dev/null +++ b/lib/projections/OrthographicOffCenterProjection.js @@ -0,0 +1,122 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var OrthographicOffCenterProjection = (function (_super) { + __extends(OrthographicOffCenterProjection, _super); + function OrthographicOffCenterProjection(minX, maxX, minY, maxY) { + _super.call(this); + this._minX = minX; + this._maxX = maxX; + this._minY = minY; + this._maxY = maxY; + } + Object.defineProperty(OrthographicOffCenterProjection.prototype, "minX", { + get: function () { + return this._minX; + }, + set: function (value) { + this._minX = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(OrthographicOffCenterProjection.prototype, "maxX", { + get: function () { + return this._maxX; + }, + set: function (value) { + this._maxX = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(OrthographicOffCenterProjection.prototype, "minY", { + get: function () { + return this._minY; + }, + set: function (value) { + this._minY = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(OrthographicOffCenterProjection.prototype, "maxY", { + get: function () { + return this._maxY; + }, + set: function (value) { + this._maxY = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + //@override + OrthographicOffCenterProjection.prototype.unproject = function (nX, nY, sZ) { + var v = new Vector3D(nX, -nY, sZ, 1.0); + v = this.unprojectionMatrix.transformVector(v); + + //z is unaffected by transform + v.z = sZ; + + return v; + }; + + //@override + OrthographicOffCenterProjection.prototype.clone = function () { + var clone = new OrthographicOffCenterProjection(this._minX, this._maxX, this._minY, this._maxY); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + return clone; + }; + + //@override + OrthographicOffCenterProjection.prototype.pUpdateMatrix = function () { + var raw = []; + var w = 1 / (this._maxX - this._minX); + var h = 1 / (this._maxY - this._minY); + var d = 1 / (this._pFar - this._pNear); + + raw[0] = 2 * w; + raw[5] = 2 * h; + raw[10] = d; + raw[12] = -(this._maxX + this._minX) * w; + raw[13] = -(this._maxY + this._minY) * h; + raw[14] = -this._pNear * d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + this._pMatrix.copyRawDataFrom(raw); + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._minX; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._maxX; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._minY; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._maxY; + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrixInvalid = false; + }; + return OrthographicOffCenterProjection; +})(ProjectionBase); + +module.exports = OrthographicOffCenterProjection; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2plY3Rpb25zL09ydGhvZ3JhcGhpY09mZkNlbnRlclByb2plY3Rpb24udHMiXSwibmFtZXMiOlsiT3J0aG9ncmFwaGljT2ZmQ2VudGVyUHJvamVjdGlvbiIsIk9ydGhvZ3JhcGhpY09mZkNlbnRlclByb2plY3Rpb24uY29uc3RydWN0b3IiLCJPcnRob2dyYXBoaWNPZmZDZW50ZXJQcm9qZWN0aW9uLnVucHJvamVjdCIsIk9ydGhvZ3JhcGhpY09mZkNlbnRlclByb2plY3Rpb24uY2xvbmUiLCJPcnRob2dyYXBoaWNPZmZDZW50ZXJQcm9qZWN0aW9uLnBVcGRhdGVNYXRyaXgiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDREQUFvRTtBQUNwRSwwRUFBZ0Y7O0FBRWhGO0lBQThDQSxrREFBY0E7SUFRM0RBLHlDQUFZQSxJQUFXQSxFQUFFQSxJQUFXQSxFQUFFQSxJQUFXQSxFQUFFQSxJQUFXQTtRQUU3REMsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFDUEEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUE7UUFDakJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBO1FBQ2pCQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQTtRQUNqQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUE7SUFDbEJBLENBQUNBO0lBRUREO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLEtBQUtBO1FBQ2xCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFnQkEsS0FBWUE7WUFFM0JBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLEtBQUtBO1lBQ2xCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1FBQ3pCQSxDQUFDQTs7OztBQU5BQTs7SUFRREE7UUFBQUEsS0FBQUE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsS0FBS0E7UUFDbEJBLENBQUNBO1FBRURBLEtBQUFBLFVBQWdCQSxLQUFZQTtZQUUzQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsS0FBS0E7WUFDbEJBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7UUFDekJBLENBQUNBOzs7O0FBTkFBOztJQVFEQTtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxLQUFLQTtRQUNsQkEsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBZ0JBLEtBQVlBO1lBRTNCQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxLQUFLQTtZQUNsQkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFOQUE7O0lBUURBO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLEtBQUtBO1FBQ2xCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFnQkEsS0FBWUE7WUFFM0JBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLEtBQUtBO1lBQ2xCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1FBQ3pCQSxDQUFDQTs7OztBQU5BQTs7SUFTREEsV0FEV0E7MERBQ1hBLFVBQWlCQSxFQUFTQSxFQUFFQSxFQUFTQSxFQUFFQSxFQUFTQTtRQUUvQ0UsSUFBSUEsQ0FBQ0EsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsQ0FBQ0E7UUFDL0NBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBQzlDQSw4QkFBOEJBO1FBQzlCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTs7UUFFUkEsT0FBT0EsQ0FBQ0E7SUFDVEEsQ0FBQ0E7O0lBR0RGLFdBRFdBO3NEQUNYQTtRQUVDRyxJQUFJQSxLQUFLQSxHQUFtQ0EsSUFBSUEsK0JBQStCQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUMvSEEsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7UUFDMUJBLEtBQUtBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBO1FBQ3hCQSxLQUFLQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUN4Q0EsT0FBT0EsS0FBS0E7SUFDYkEsQ0FBQ0E7O0lBR0RILFdBRFdBOzhEQUNYQTtRQUVDSSxJQUFJQSxHQUFHQSxHQUFZQSxFQUFFQTtRQUNyQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFDMUNBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO1FBQzFDQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTs7UUFFM0NBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBO1FBQ1pBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBO1FBQ1pBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1hBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLEdBQUNBLENBQUNBO1FBQ3RDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFDQSxDQUFDQTtRQUN0Q0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsQ0FBQ0E7UUFDeEJBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ1hBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1FBQ25GQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxlQUFlQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFbENBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7UUFDeEhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7UUFDeEhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7UUFDeEhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7UUFDekhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7UUFDeEhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7O1FBRTFIQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxLQUFLQTtJQUM3QkEsQ0FBQ0E7SUFDRkosdUNBQUNBO0FBQURBLENBQUNBLEVBN0c2QyxjQUFjLEVBNkczRDs7QUFFRCxnREFBeUMsQ0FBQSIsImZpbGUiOiJwcm9qZWN0aW9ucy9PcnRob2dyYXBoaWNPZmZDZW50ZXJQcm9qZWN0aW9uLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgUHJvamVjdGlvbkJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcHJvamVjdGlvbnMvUHJvamVjdGlvbkJhc2VcIik7XG5cbmNsYXNzIE9ydGhvZ3JhcGhpY09mZkNlbnRlclByb2plY3Rpb24gZXh0ZW5kcyBQcm9qZWN0aW9uQmFzZVxue1xuXG5cdHByaXZhdGUgX21pblg6bnVtYmVyO1xuXHRwcml2YXRlIF9tYXhYOm51bWJlcjtcblx0cHJpdmF0ZSBfbWluWTpudW1iZXI7XG5cdHByaXZhdGUgX21heFk6bnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yKG1pblg6bnVtYmVyLCBtYXhYOm51bWJlciwgbWluWTpudW1iZXIsIG1heFk6bnVtYmVyKVxuXHR7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLl9taW5YID0gbWluWDtcblx0XHR0aGlzLl9tYXhYID0gbWF4WDtcblx0XHR0aGlzLl9taW5ZID0gbWluWTtcblx0XHR0aGlzLl9tYXhZID0gbWF4WTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbWluWCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21pblg7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1pblgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fbWluWCA9IHZhbHVlO1xuXHRcdHRoaXMucEludmFsaWRhdGVNYXRyaXgoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbWF4WCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21heFg7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1heFgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fbWF4WCA9IHZhbHVlO1xuXHRcdHRoaXMucEludmFsaWRhdGVNYXRyaXgoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbWluWSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21pblk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1pblkodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fbWluWSA9IHZhbHVlO1xuXHRcdHRoaXMucEludmFsaWRhdGVNYXRyaXgoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbWF4WSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX21heFk7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG1heFkodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0dGhpcy5fbWF4WSA9IHZhbHVlO1xuXHRcdHRoaXMucEludmFsaWRhdGVNYXRyaXgoKTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyB1bnByb2plY3Qoblg6bnVtYmVyLCBuWTpudW1iZXIsIHNaOm51bWJlcik6VmVjdG9yM0Rcblx0e1xuXHRcdHZhciB2OlZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKG5YLCAtblksIHNaLCAxLjApO1xuXHRcdHYgPSB0aGlzLnVucHJvamVjdGlvbk1hdHJpeC50cmFuc2Zvcm1WZWN0b3Iodik7XG5cdFx0Ly96IGlzIHVuYWZmZWN0ZWQgYnkgdHJhbnNmb3JtXG5cdFx0di56ID0gc1o7XG5cblx0XHRyZXR1cm4gdjtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBjbG9uZSgpOlByb2plY3Rpb25CYXNlXG5cdHtcblx0XHR2YXIgY2xvbmU6T3J0aG9ncmFwaGljT2ZmQ2VudGVyUHJvamVjdGlvbiA9IG5ldyBPcnRob2dyYXBoaWNPZmZDZW50ZXJQcm9qZWN0aW9uKHRoaXMuX21pblgsIHRoaXMuX21heFgsIHRoaXMuX21pblksIHRoaXMuX21heFkpO1xuXHRcdGNsb25lLl9wTmVhciA9IHRoaXMuX3BOZWFyO1xuXHRcdGNsb25lLl9wRmFyID0gdGhpcy5fcEZhcjtcblx0XHRjbG9uZS5fcEFzcGVjdFJhdGlvID0gdGhpcy5fcEFzcGVjdFJhdGlvO1xuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBwVXBkYXRlTWF0cml4KClcblx0e1xuXHRcdHZhciByYXc6bnVtYmVyW10gPSBbXTtcblx0XHR2YXIgdzpudW1iZXIgPSAxLyh0aGlzLl9tYXhYIC0gdGhpcy5fbWluWCk7XG5cdFx0dmFyIGg6bnVtYmVyID0gMS8odGhpcy5fbWF4WSAtIHRoaXMuX21pblkpO1xuXHRcdHZhciBkOm51bWJlciA9IDEvKHRoaXMuX3BGYXIgLSB0aGlzLl9wTmVhcik7XG5cblx0XHRyYXdbMF0gPSAyKnc7XG5cdFx0cmF3WzVdID0gMipoO1xuXHRcdHJhd1sxMF0gPSBkO1xuXHRcdHJhd1sxMl0gPSAtKHRoaXMuX21heFggKyB0aGlzLl9taW5YKSp3O1xuXHRcdHJhd1sxM10gPSAtKHRoaXMuX21heFkgKyB0aGlzLl9taW5ZKSpoO1xuXHRcdHJhd1sxNF0gPSAtdGhpcy5fcE5lYXIqZDtcblx0XHRyYXdbMTVdID0gMTtcblx0XHRyYXdbMV0gPSByYXdbMl0gPSByYXdbM10gPSByYXdbNF0gPSByYXdbNl0gPSByYXdbN10gPSByYXdbOF0gPSByYXdbOV0gPSByYXdbMTFdID0gMDtcblx0XHR0aGlzLl9wTWF0cml4LmNvcHlSYXdEYXRhRnJvbShyYXcpO1xuXG5cdFx0dGhpcy5fcEZydXN0dW1Db3JuZXJzWzBdID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzldID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzEyXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1syMV0gPSB0aGlzLl9taW5YO1xuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVyc1szXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1s2XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxNV0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMThdID0gdGhpcy5fbWF4WDtcblx0XHR0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMV0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbNF0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTNdID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzE2XSA9IHRoaXMuX21pblk7XG5cdFx0dGhpcy5fcEZydXN0dW1Db3JuZXJzWzddID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzEwXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxOV0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMjJdID0gdGhpcy5fbWF4WTtcblx0XHR0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMl0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbNV0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbOF0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTFdID0gdGhpcy5fcE5lYXI7XG5cdFx0dGhpcy5fcEZydXN0dW1Db3JuZXJzWzE0XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxN10gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMjBdID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzIzXSA9IHRoaXMuX3BGYXI7XG5cblx0XHR0aGlzLl9wTWF0cml4SW52YWxpZCA9IGZhbHNlO1xuXHR9XG59XG5cbmV4cG9ydCA9IE9ydGhvZ3JhcGhpY09mZkNlbnRlclByb2plY3Rpb247Il19 \ No newline at end of file diff --git a/lib/projections/OrthographicOffCenterProjection.ts b/lib/projections/OrthographicOffCenterProjection.ts new file mode 100644 index 00000000..aaf91ba2 --- /dev/null +++ b/lib/projections/OrthographicOffCenterProjection.ts @@ -0,0 +1,115 @@ +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +class OrthographicOffCenterProjection extends ProjectionBase +{ + + private _minX:number; + private _maxX:number; + private _minY:number; + private _maxY:number; + + constructor(minX:number, maxX:number, minY:number, maxY:number) + { + super(); + this._minX = minX; + this._maxX = maxX; + this._minY = minY; + this._maxY = maxY; + } + + public get minX():number + { + return this._minX; + } + + public set minX(value:number) + { + this._minX = value; + this.pInvalidateMatrix(); + } + + public get maxX():number + { + return this._maxX; + } + + public set maxX(value:number) + { + this._maxX = value; + this.pInvalidateMatrix(); + } + + public get minY():number + { + return this._minY; + } + + public set minY(value:number) + { + this._minY = value; + this.pInvalidateMatrix(); + } + + public get maxY():number + { + return this._maxY; + } + + public set maxY(value:number) + { + this._maxY = value; + this.pInvalidateMatrix(); + } + + //@override + public unproject(nX:number, nY:number, sZ:number):Vector3D + { + var v:Vector3D = new Vector3D(nX, -nY, sZ, 1.0); + v = this.unprojectionMatrix.transformVector(v); + //z is unaffected by transform + v.z = sZ; + + return v; + } + + //@override + public clone():ProjectionBase + { + var clone:OrthographicOffCenterProjection = new OrthographicOffCenterProjection(this._minX, this._maxX, this._minY, this._maxY); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + return clone; + } + + //@override + public pUpdateMatrix() + { + var raw:number[] = []; + var w:number = 1/(this._maxX - this._minX); + var h:number = 1/(this._maxY - this._minY); + var d:number = 1/(this._pFar - this._pNear); + + raw[0] = 2*w; + raw[5] = 2*h; + raw[10] = d; + raw[12] = -(this._maxX + this._minX)*w; + raw[13] = -(this._maxY + this._minY)*h; + raw[14] = -this._pNear*d; + raw[15] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + this._pMatrix.copyRawDataFrom(raw); + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._minX; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._maxX; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._minY; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._maxY; + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrixInvalid = false; + } +} + +export = OrthographicOffCenterProjection; \ No newline at end of file diff --git a/lib/projections/OrthographicProjection.js b/lib/projections/OrthographicProjection.js new file mode 100755 index 00000000..9545de46 --- /dev/null +++ b/lib/projections/OrthographicProjection.js @@ -0,0 +1,117 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var OrthographicProjection = (function (_super) { + __extends(OrthographicProjection, _super); + function OrthographicProjection(projectionHeight) { + if (typeof projectionHeight === "undefined") { projectionHeight = 500; } + _super.call(this); + this._projectionHeight = projectionHeight; + } + Object.defineProperty(OrthographicProjection.prototype, "projectionHeight", { + get: function () { + return this._projectionHeight; + }, + set: function (value) { + if (value == this._projectionHeight) { + return; + } + this._projectionHeight = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + //@override + OrthographicProjection.prototype.unproject = function (nX, nY, sZ) { + var v = new Vector3D(nX + this.matrix.rawData[12], -nY + this.matrix.rawData[13], sZ, 1.0); + v = this.unprojectionMatrix.transformVector(v); + + //z is unaffected by transform + v.z = sZ; + + return v; + }; + + //@override + OrthographicProjection.prototype.clone = function () { + var clone = new OrthographicProjection(); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone.projectionHeight = this._projectionHeight; + return clone; + }; + + //@override + OrthographicProjection.prototype.pUpdateMatrix = function () { + var raw = []; + this._yMax = this._projectionHeight * .5; + this._xMax = this._yMax * this._pAspectRatio; + + var left; + var right; + var top; + var bottom; + + if (this._pScissorRect.x == 0 && this._pScissorRect.y == 0 && this._pScissorRect.width == this._pViewPort.width && this._pScissorRect.height == this._pViewPort.height) { + // assume symmetric frustum + left = -this._xMax; + right = this._xMax; + top = -this._yMax; + bottom = this._yMax; + + raw[0] = 2 / (this._projectionHeight * this._pAspectRatio); + raw[5] = 2 / this._projectionHeight; + raw[10] = 1 / (this._pFar - this._pNear); + raw[14] = this._pNear / (this._pNear - this._pFar); + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = raw[12] = raw[13] = 0; + raw[15] = 1; + } else { + var xWidth = this._xMax * (this._pViewPort.width / this._pScissorRect.width); + var yHgt = this._yMax * (this._pViewPort.height / this._pScissorRect.height); + var center = this._xMax * (this._pScissorRect.x * 2 - this._pViewPort.width) / this._pScissorRect.width + this._xMax; + var middle = -this._yMax * (this._pScissorRect.y * 2 - this._pViewPort.height) / this._pScissorRect.height - this._yMax; + + left = center - xWidth; + right = center + xWidth; + top = middle - yHgt; + bottom = middle + yHgt; + + raw[0] = 2 * 1 / (right - left); + raw[5] = -2 * 1 / (top - bottom); + raw[10] = 1 / (this._pFar - this._pNear); + + raw[12] = (right + left) / (right - left); + raw[13] = (bottom + top) / (bottom - top); + raw[14] = this._pNear / (this.near - this.far); + + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + raw[15] = 1; + } + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = left; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = right; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = top; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = bottom; + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrix.copyRawDataFrom(raw); + + this._pMatrixInvalid = false; + }; + return OrthographicProjection; +})(ProjectionBase); + +module.exports = OrthographicProjection; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2plY3Rpb25zL09ydGhvZ3JhcGhpY1Byb2plY3Rpb24udHMiXSwibmFtZXMiOlsiT3J0aG9ncmFwaGljUHJvamVjdGlvbiIsIk9ydGhvZ3JhcGhpY1Byb2plY3Rpb24uY29uc3RydWN0b3IiLCJPcnRob2dyYXBoaWNQcm9qZWN0aW9uLnVucHJvamVjdCIsIk9ydGhvZ3JhcGhpY1Byb2plY3Rpb24uY2xvbmUiLCJPcnRob2dyYXBoaWNQcm9qZWN0aW9uLnBVcGRhdGVNYXRyaXgiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDREQUFvRTtBQUNwRSwwRUFBZ0Y7O0FBRWhGO0lBQXFDQSx5Q0FBY0E7SUFPbERBLGdDQUFZQSxnQkFBNkJBO1FBQTdCQywrQ0FBQUEsZ0JBQWdCQSxHQUFVQSxHQUFHQTtBQUFBQSxRQUV4Q0EsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFDUEEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxnQkFBZ0JBO0lBQzFDQSxDQUFDQTtJQUVERDtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxpQkFBaUJBO1FBQzlCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUE0QkEsS0FBWUE7WUFFdkNBLElBQUlBLEtBQUtBLElBQUlBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBRUE7Z0JBQ3BDQSxNQUFPQTthQUNQQTtZQUNEQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLEtBQUtBO1lBQzlCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1FBQ3pCQSxDQUFDQTs7OztBQVRBQTs7SUFZREEsV0FEV0E7aURBQ1hBLFVBQWlCQSxFQUFTQSxFQUFFQSxFQUFTQSxFQUFFQSxFQUFTQTtRQUUvQ0UsSUFBSUEsQ0FBQ0EsR0FBWUEsSUFBSUEsUUFBUUEsQ0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsQ0FBQ0E7UUFDbkdBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRTlDQSw4QkFBOEJBO1FBQzlCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxFQUFFQTs7UUFFUkEsT0FBT0EsQ0FBQ0E7SUFDVEEsQ0FBQ0E7O0lBR0RGLFdBRFdBOzZDQUNYQTtRQUVDRyxJQUFJQSxLQUFLQSxHQUEwQkEsSUFBSUEsc0JBQXNCQSxDQUFDQSxDQUFDQTtRQUMvREEsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7UUFDMUJBLEtBQUtBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBO1FBQ3hCQSxLQUFLQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUN4Q0EsS0FBS0EsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBO1FBQy9DQSxPQUFPQSxLQUFLQTtJQUNiQSxDQUFDQTs7SUFHREgsV0FEV0E7cURBQ1hBO1FBRUNJLElBQUlBLEdBQUdBLEdBQVlBLEVBQUVBO1FBQ3JCQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUNBLEVBQUVBO1FBQ3RDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFDQSxJQUFJQSxDQUFDQSxhQUFhQTs7UUFFMUNBLElBQUlBLElBQUlBO1FBQ1JBLElBQUlBLEtBQUtBO1FBQ1RBLElBQUlBLEdBQUdBO1FBQ1BBLElBQUlBLE1BQU1BOztRQUVWQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxJQUFJQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxNQUFNQSxJQUFJQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxDQUFFQTtZQUN2S0EsMkJBQTJCQTtZQUUzQkEsSUFBSUEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0E7WUFDbEJBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBO1lBQ2xCQSxHQUFHQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQTtZQUNqQkEsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7O1lBRW5CQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBO1lBQ3REQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBO1lBQ2pDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtZQUN0Q0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7WUFDaERBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBO1lBQ3ZHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTtTQUVYQSxLQUFNQTtZQUVOQSxJQUFJQSxNQUFNQSxHQUFVQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxHQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUMvRUEsSUFBSUEsSUFBSUEsR0FBVUEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7WUFDL0VBLElBQUlBLE1BQU1BLEdBQVVBLElBQUlBLENBQUNBLEtBQUtBLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBO1lBQ3JIQSxJQUFJQSxNQUFNQSxHQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxHQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQTs7WUFFeEhBLElBQUlBLEdBQUdBLE1BQU1BLEdBQUdBLE1BQU1BO1lBQ3RCQSxLQUFLQSxHQUFHQSxNQUFNQSxHQUFHQSxNQUFNQTtZQUN2QkEsR0FBR0EsR0FBR0EsTUFBTUEsR0FBR0EsSUFBSUE7WUFDbkJBLE1BQU1BLEdBQUdBLE1BQU1BLEdBQUdBLElBQUlBOztZQUV0QkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7WUFDM0JBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUNBLENBQUNBLEdBQUdBLEdBQUdBLE1BQU1BLENBQUNBO1lBQzVCQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTs7WUFFdENBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEdBQUNBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1lBQ3ZDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxHQUFHQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxHQUFHQSxDQUFDQTtZQUN2Q0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1lBRTVDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUNuRkEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FDWEE7O1FBRURBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDbEhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsS0FBS0E7UUFDbkhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0E7UUFDakhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsTUFBTUE7UUFDckhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7UUFDeEhBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0E7O1FBRTFIQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxlQUFlQSxDQUFDQSxHQUFHQSxDQUFDQTs7UUFFbENBLElBQUlBLENBQUNBLGVBQWVBLEdBQUdBLEtBQUtBO0lBQzdCQSxDQUFDQTtJQUNGSiw4QkFBQ0E7QUFBREEsQ0FBQ0EsRUFoSG9DLGNBQWMsRUFnSGxEOztBQUVELHVDQUErQixDQUFBIiwiZmlsZSI6InByb2plY3Rpb25zL09ydGhvZ3JhcGhpY1Byb2plY3Rpb24uanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBQcm9qZWN0aW9uQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9Qcm9qZWN0aW9uQmFzZVwiKTtcblxuY2xhc3MgT3J0aG9ncmFwaGljUHJvamVjdGlvbiBleHRlbmRzIFByb2plY3Rpb25CYXNlXG57XG5cblx0cHJpdmF0ZSBfcHJvamVjdGlvbkhlaWdodDpudW1iZXI7XG5cdHByaXZhdGUgX3hNYXg6bnVtYmVyO1xuXHRwcml2YXRlIF95TWF4Om51bWJlcjtcblxuXHRjb25zdHJ1Y3Rvcihwcm9qZWN0aW9uSGVpZ2h0Om51bWJlciA9IDUwMClcblx0e1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5fcHJvamVjdGlvbkhlaWdodCA9IHByb2plY3Rpb25IZWlnaHQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHByb2plY3Rpb25IZWlnaHQoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wcm9qZWN0aW9uSGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIHNldCBwcm9qZWN0aW9uSGVpZ2h0KHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh2YWx1ZSA9PSB0aGlzLl9wcm9qZWN0aW9uSGVpZ2h0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuX3Byb2plY3Rpb25IZWlnaHQgPSB2YWx1ZTtcblx0XHR0aGlzLnBJbnZhbGlkYXRlTWF0cml4KCk7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgdW5wcm9qZWN0KG5YOm51bWJlciwgblk6bnVtYmVyLCBzWjpudW1iZXIpOlZlY3RvcjNEXG5cdHtcblx0XHR2YXIgdjpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRChuWCArIHRoaXMubWF0cml4LnJhd0RhdGFbMTJdLCAtblkgKyB0aGlzLm1hdHJpeC5yYXdEYXRhWzEzXSwgc1osIDEuMCk7XG5cdFx0diA9IHRoaXMudW5wcm9qZWN0aW9uTWF0cml4LnRyYW5zZm9ybVZlY3Rvcih2KTtcblxuXHRcdC8veiBpcyB1bmFmZmVjdGVkIGJ5IHRyYW5zZm9ybVxuXHRcdHYueiA9IHNaO1xuXG5cdFx0cmV0dXJuIHY7XG5cdH1cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgY2xvbmUoKTpQcm9qZWN0aW9uQmFzZVxuXHR7XG5cdFx0dmFyIGNsb25lOk9ydGhvZ3JhcGhpY1Byb2plY3Rpb24gPSBuZXcgT3J0aG9ncmFwaGljUHJvamVjdGlvbigpO1xuXHRcdGNsb25lLl9wTmVhciA9IHRoaXMuX3BOZWFyO1xuXHRcdGNsb25lLl9wRmFyID0gdGhpcy5fcEZhcjtcblx0XHRjbG9uZS5fcEFzcGVjdFJhdGlvID0gdGhpcy5fcEFzcGVjdFJhdGlvO1xuXHRcdGNsb25lLnByb2plY3Rpb25IZWlnaHQgPSB0aGlzLl9wcm9qZWN0aW9uSGVpZ2h0O1xuXHRcdHJldHVybiBjbG9uZTtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBwVXBkYXRlTWF0cml4KClcblx0e1xuXHRcdHZhciByYXc6bnVtYmVyW10gPSBbXTtcblx0XHR0aGlzLl95TWF4ID0gdGhpcy5fcHJvamVjdGlvbkhlaWdodCouNTtcblx0XHR0aGlzLl94TWF4ID0gdGhpcy5feU1heCp0aGlzLl9wQXNwZWN0UmF0aW87XG5cblx0XHR2YXIgbGVmdDpudW1iZXI7XG5cdFx0dmFyIHJpZ2h0Om51bWJlcjtcblx0XHR2YXIgdG9wOm51bWJlcjtcblx0XHR2YXIgYm90dG9tOm51bWJlcjtcblxuXHRcdGlmICh0aGlzLl9wU2Npc3NvclJlY3QueCA9PSAwICYmIHRoaXMuX3BTY2lzc29yUmVjdC55ID09IDAgJiYgdGhpcy5fcFNjaXNzb3JSZWN0LndpZHRoID09IHRoaXMuX3BWaWV3UG9ydC53aWR0aCAmJiB0aGlzLl9wU2Npc3NvclJlY3QuaGVpZ2h0ID09IHRoaXMuX3BWaWV3UG9ydC5oZWlnaHQpIHtcblx0XHRcdC8vIGFzc3VtZSBzeW1tZXRyaWMgZnJ1c3R1bVxuXG5cdFx0XHRsZWZ0ID0gLXRoaXMuX3hNYXg7XG5cdFx0XHRyaWdodCA9IHRoaXMuX3hNYXg7XG5cdFx0XHR0b3AgPSAtdGhpcy5feU1heDtcblx0XHRcdGJvdHRvbSA9IHRoaXMuX3lNYXg7XG5cblx0XHRcdHJhd1swXSA9IDIvKHRoaXMuX3Byb2plY3Rpb25IZWlnaHQqdGhpcy5fcEFzcGVjdFJhdGlvKTtcblx0XHRcdHJhd1s1XSA9IDIvdGhpcy5fcHJvamVjdGlvbkhlaWdodDtcblx0XHRcdHJhd1sxMF0gPSAxLyh0aGlzLl9wRmFyIC0gdGhpcy5fcE5lYXIpO1xuXHRcdFx0cmF3WzE0XSA9IHRoaXMuX3BOZWFyLyh0aGlzLl9wTmVhciAtIHRoaXMuX3BGYXIpO1xuXHRcdFx0cmF3WzFdID0gcmF3WzJdID0gcmF3WzNdID0gcmF3WzRdID0gcmF3WzZdID0gcmF3WzddID0gcmF3WzhdID0gcmF3WzldID0gcmF3WzExXSA9IHJhd1sxMl0gPSByYXdbMTNdID0gMDtcblx0XHRcdHJhd1sxNV0gPSAxO1xuXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0dmFyIHhXaWR0aDpudW1iZXIgPSB0aGlzLl94TWF4Kih0aGlzLl9wVmlld1BvcnQud2lkdGgvdGhpcy5fcFNjaXNzb3JSZWN0LndpZHRoKTtcblx0XHRcdHZhciB5SGd0Om51bWJlciA9IHRoaXMuX3lNYXgqKHRoaXMuX3BWaWV3UG9ydC5oZWlnaHQvdGhpcy5fcFNjaXNzb3JSZWN0LmhlaWdodCk7XG5cdFx0XHR2YXIgY2VudGVyOm51bWJlciA9IHRoaXMuX3hNYXgqKHRoaXMuX3BTY2lzc29yUmVjdC54KjIgLSB0aGlzLl9wVmlld1BvcnQud2lkdGgpL3RoaXMuX3BTY2lzc29yUmVjdC53aWR0aCArIHRoaXMuX3hNYXg7XG5cdFx0XHR2YXIgbWlkZGxlOm51bWJlciA9IC10aGlzLl95TWF4Kih0aGlzLl9wU2Npc3NvclJlY3QueSoyIC0gdGhpcy5fcFZpZXdQb3J0LmhlaWdodCkvdGhpcy5fcFNjaXNzb3JSZWN0LmhlaWdodCAtIHRoaXMuX3lNYXg7XG5cblx0XHRcdGxlZnQgPSBjZW50ZXIgLSB4V2lkdGg7XG5cdFx0XHRyaWdodCA9IGNlbnRlciArIHhXaWR0aDtcblx0XHRcdHRvcCA9IG1pZGRsZSAtIHlIZ3Q7XG5cdFx0XHRib3R0b20gPSBtaWRkbGUgKyB5SGd0O1xuXG5cdFx0XHRyYXdbMF0gPSAyKjEvKHJpZ2h0IC0gbGVmdCk7XG5cdFx0XHRyYXdbNV0gPSAtMioxLyh0b3AgLSBib3R0b20pO1xuXHRcdFx0cmF3WzEwXSA9IDEvKHRoaXMuX3BGYXIgLSB0aGlzLl9wTmVhcik7XG5cblx0XHRcdHJhd1sxMl0gPSAocmlnaHQgKyBsZWZ0KS8ocmlnaHQgLSBsZWZ0KTtcblx0XHRcdHJhd1sxM10gPSAoYm90dG9tICsgdG9wKS8oYm90dG9tIC0gdG9wKTtcblx0XHRcdHJhd1sxNF0gPSB0aGlzLl9wTmVhci8odGhpcy5uZWFyIC0gdGhpcy5mYXIpO1xuXG5cdFx0XHRyYXdbMV0gPSByYXdbMl0gPSByYXdbM10gPSByYXdbNF0gPSByYXdbNl0gPSByYXdbN10gPSByYXdbOF0gPSByYXdbOV0gPSByYXdbMTFdID0gMDtcblx0XHRcdHJhd1sxNV0gPSAxO1xuXHRcdH1cblxuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVyc1swXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1s5XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxMl0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMjFdID0gbGVmdDtcblx0XHR0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbM10gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbNl0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTVdID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzE4XSA9IHJpZ2h0O1xuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1s0XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxM10gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTZdID0gdG9wO1xuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVyc1s3XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxMF0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTldID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzIyXSA9IGJvdHRvbTtcblx0XHR0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMl0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbNV0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbOF0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTFdID0gdGhpcy5fcE5lYXI7XG5cdFx0dGhpcy5fcEZydXN0dW1Db3JuZXJzWzE0XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxN10gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMjBdID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzIzXSA9IHRoaXMuX3BGYXI7XG5cblx0XHR0aGlzLl9wTWF0cml4LmNvcHlSYXdEYXRhRnJvbShyYXcpO1xuXG5cdFx0dGhpcy5fcE1hdHJpeEludmFsaWQgPSBmYWxzZTtcblx0fVxufVxuXG5leHBvcnQ9IE9ydGhvZ3JhcGhpY1Byb2plY3Rpb247Il19 \ No newline at end of file diff --git a/lib/projections/OrthographicProjection.ts b/lib/projections/OrthographicProjection.ts new file mode 100644 index 00000000..3de3bc05 --- /dev/null +++ b/lib/projections/OrthographicProjection.ts @@ -0,0 +1,118 @@ +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +class OrthographicProjection extends ProjectionBase +{ + + private _projectionHeight:number; + private _xMax:number; + private _yMax:number; + + constructor(projectionHeight:number = 500) + { + super(); + this._projectionHeight = projectionHeight; + } + + public get projectionHeight():number + { + return this._projectionHeight; + } + + public set projectionHeight(value:number) + { + if (value == this._projectionHeight) { + return; + } + this._projectionHeight = value; + this.pInvalidateMatrix(); + } + + //@override + public unproject(nX:number, nY:number, sZ:number):Vector3D + { + var v:Vector3D = new Vector3D(nX + this.matrix.rawData[12], -nY + this.matrix.rawData[13], sZ, 1.0); + v = this.unprojectionMatrix.transformVector(v); + + //z is unaffected by transform + v.z = sZ; + + return v; + } + + //@override + public clone():ProjectionBase + { + var clone:OrthographicProjection = new OrthographicProjection(); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone.projectionHeight = this._projectionHeight; + return clone; + } + + //@override + public pUpdateMatrix() + { + var raw:number[] = []; + this._yMax = this._projectionHeight*.5; + this._xMax = this._yMax*this._pAspectRatio; + + var left:number; + var right:number; + var top:number; + var bottom:number; + + if (this._pScissorRect.x == 0 && this._pScissorRect.y == 0 && this._pScissorRect.width == this._pViewPort.width && this._pScissorRect.height == this._pViewPort.height) { + // assume symmetric frustum + + left = -this._xMax; + right = this._xMax; + top = -this._yMax; + bottom = this._yMax; + + raw[0] = 2/(this._projectionHeight*this._pAspectRatio); + raw[5] = 2/this._projectionHeight; + raw[10] = 1/(this._pFar - this._pNear); + raw[14] = this._pNear/(this._pNear - this._pFar); + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = raw[12] = raw[13] = 0; + raw[15] = 1; + + } else { + + var xWidth:number = this._xMax*(this._pViewPort.width/this._pScissorRect.width); + var yHgt:number = this._yMax*(this._pViewPort.height/this._pScissorRect.height); + var center:number = this._xMax*(this._pScissorRect.x*2 - this._pViewPort.width)/this._pScissorRect.width + this._xMax; + var middle:number = -this._yMax*(this._pScissorRect.y*2 - this._pViewPort.height)/this._pScissorRect.height - this._yMax; + + left = center - xWidth; + right = center + xWidth; + top = middle - yHgt; + bottom = middle + yHgt; + + raw[0] = 2*1/(right - left); + raw[5] = -2*1/(top - bottom); + raw[10] = 1/(this._pFar - this._pNear); + + raw[12] = (right + left)/(right - left); + raw[13] = (bottom + top)/(bottom - top); + raw[14] = this._pNear/(this.near - this.far); + + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; + raw[15] = 1; + } + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = left; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = right; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = top; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = bottom; + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrix.copyRawDataFrom(raw); + + this._pMatrixInvalid = false; + } +} + +export= OrthographicProjection; \ No newline at end of file diff --git a/lib/projections/PerspectiveProjection.js b/lib/projections/PerspectiveProjection.js new file mode 100755 index 00000000..26d1d8f3 --- /dev/null +++ b/lib/projections/PerspectiveProjection.js @@ -0,0 +1,245 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var CoordinateSystem = require("awayjs-core/lib/projections/CoordinateSystem"); +var ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +var PerspectiveProjection = (function (_super) { + __extends(PerspectiveProjection, _super); + function PerspectiveProjection(fieldOfView, coordinateSystem) { + if (typeof fieldOfView === "undefined") { fieldOfView = 60; } + if (typeof coordinateSystem === "undefined") { coordinateSystem = "leftHanded"; } + _super.call(this, coordinateSystem); + this._fieldOfView = 60; + this._focalLength = 1000; + this._hFieldOfView = 60; + this._hFocalLength = 1000; + this._preserveAspectRatio = true; + this._preserveFocalLength = false; + this.fieldOfView = fieldOfView; + } + Object.defineProperty(PerspectiveProjection.prototype, "preserveAspectRatio", { + /** + * + */ + get: function () { + return this._preserveAspectRatio; + }, + set: function (value) { + if (this._preserveAspectRatio == value) + return; + + this._preserveAspectRatio = value; + + if (this._preserveAspectRatio) + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "preserveFocalLength", { + /** + * + */ + get: function () { + return this._preserveFocalLength; + }, + set: function (value) { + if (this._preserveFocalLength == value) + return; + + this._preserveFocalLength = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "fieldOfView", { + /** + * + */ + get: function () { + return this._fieldOfView; + }, + set: function (value) { + if (this._fieldOfView == value) + return; + + this._fieldOfView = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "focalLength", { + /** + * + */ + get: function () { + return this._focalLength; + }, + set: function (value) { + if (this._focalLength == value) + return; + + this._focalLength = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "hFieldOfView", { + /** + * + */ + get: function () { + return this._hFieldOfView; + }, + set: function (value) { + if (this._hFieldOfView == value) + return; + + this._hFieldOfView = value; + + this._hFocalLength = 1 / Math.tan(this._hFieldOfView * Math.PI / 360); + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(PerspectiveProjection.prototype, "hFocalLength", { + /** + * + */ + get: function () { + return this._hFocalLength; + }, + set: function (value) { + if (this._hFocalLength == value) + return; + + this._hFocalLength = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + //@override + PerspectiveProjection.prototype.unproject = function (nX, nY, sZ) { + var v = new Vector3D(nX, -nY, sZ, 1.0); + + v.x *= sZ; + v.y *= sZ; + + v = this.unprojectionMatrix.transformVector(v); + + //z is unaffected by transform + v.z = sZ; + + return v; + }; + + //@override + PerspectiveProjection.prototype.clone = function () { + var clone = new PerspectiveProjection(this._fieldOfView); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone._pCoordinateSystem = this._pCoordinateSystem; + return clone; + }; + + //@override + PerspectiveProjection.prototype.pUpdateMatrix = function () { + var raw = []; + + if (this._preserveFocalLength) { + if (this._preserveAspectRatio) + this._hFocalLength = this._focalLength; + + this._fieldOfView = Math.atan(0.5 * this._pScissorRect.height / this._focalLength) * 360 / Math.PI; + this._hFieldOfView = Math.atan(0.5 * this._pScissorRect.width / this._hFocalLength) * 360 / Math.PI; + } else { + this._focalLength = 0.5 * this._pScissorRect.height / Math.tan(this._fieldOfView * Math.PI / 360); + + if (this._preserveAspectRatio) + this._hFocalLength = this._focalLength; + else + this._hFocalLength = 0.5 * this._pScissorRect.width / Math.tan(this._hFieldOfView * Math.PI / 360); + } + + var tanMinX = -this._pOriginX / this._hFocalLength; + var tanMaxX = (1 - this._pOriginX) / this._hFocalLength; + var tanMinY = -this._pOriginY / this._focalLength; + var tanMaxY = (1 - this._pOriginY) / this._focalLength; + + var left; + var right; + var top; + var bottom; + + // assume scissored frustum + var center = -((tanMinX - tanMaxX) * this._pScissorRect.x + tanMinX * this._pScissorRect.width); + var middle = ((tanMinY - tanMaxY) * this._pScissorRect.y + tanMinY * this._pScissorRect.height); + + left = center - (tanMaxX - tanMinX) * this._pViewPort.width; + right = center; + top = middle; + bottom = middle + (tanMaxY - tanMinY) * this._pViewPort.height; + + raw[0] = 2 / (right - left); + raw[5] = 2 / (bottom - top); + raw[8] = (right + left) / (right - left); + raw[9] = (bottom + top) / (bottom - top); + raw[10] = (this._pFar + this._pNear) / (this._pFar - this._pNear); + raw[11] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[12] = raw[13] = raw[15] = 0; + raw[14] = -2 * this._pFar * this._pNear / (this._pFar - this._pNear); + + if (this._pCoordinateSystem == CoordinateSystem.RIGHT_HANDED) + raw[5] = -raw[5]; + + this._pMatrix.copyRawDataFrom(raw); + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pNear * left; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pNear * right; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pNear * top; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pNear * bottom; + + this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._pFar * left; + this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._pFar * right; + this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._pFar * top; + this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._pFar * bottom; + + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrixInvalid = false; + }; + return PerspectiveProjection; +})(ProjectionBase); + +module.exports = PerspectiveProjection; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2plY3Rpb25zL1BlcnNwZWN0aXZlUHJvamVjdGlvbi50cyJdLCJuYW1lcyI6WyJQZXJzcGVjdGl2ZVByb2plY3Rpb24iLCJQZXJzcGVjdGl2ZVByb2plY3Rpb24uY29uc3RydWN0b3IiLCJQZXJzcGVjdGl2ZVByb2plY3Rpb24udW5wcm9qZWN0IiwiUGVyc3BlY3RpdmVQcm9qZWN0aW9uLmNsb25lIiwiUGVyc3BlY3RpdmVQcm9qZWN0aW9uLnBVcGRhdGVNYXRyaXgiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDREQUFvRTtBQUNwRSw4RUFBb0Y7QUFDcEYsMEVBQWdGOztBQUVoRjtJQUFvQ0Esd0NBQWNBO0lBU2pEQSwrQkFBWUEsV0FBdUJBLEVBQUVBLGdCQUFzQ0E7UUFBL0RDLDBDQUFBQSxXQUFXQSxHQUFVQSxFQUFFQTtBQUFBQSxRQUFFQSwrQ0FBQUEsZ0JBQWdCQSxHQUFVQSxZQUFZQTtBQUFBQSxRQUUxRUEsV0FBTUEsT0FBQUEsZ0JBQWdCQSxDQUFDQTtRQVR4QkEsS0FBUUEsWUFBWUEsR0FBVUEsRUFBRUEsQ0FBQ0E7UUFDakNBLEtBQVFBLFlBQVlBLEdBQVVBLElBQUlBLENBQUNBO1FBQ25DQSxLQUFRQSxhQUFhQSxHQUFVQSxFQUFFQSxDQUFDQTtRQUNsQ0EsS0FBUUEsYUFBYUEsR0FBVUEsSUFBSUEsQ0FBQ0E7UUFDcENBLEtBQVFBLG9CQUFvQkEsR0FBV0EsSUFBSUEsQ0FBQ0E7UUFDNUNBLEtBQVFBLG9CQUFvQkEsR0FBV0EsS0FBS0EsQ0FBQ0E7UUFLNUNBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLFdBQVdBO0lBQy9CQSxDQUFDQTtJQUtERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0Esb0JBQW9CQTtRQUNqQ0EsQ0FBQ0E7UUFFREEsS0FBQUEsVUFBK0JBLEtBQWFBO1lBRTNDQSxJQUFJQSxJQUFJQSxDQUFDQSxvQkFBb0JBLElBQUlBLEtBQUtBO2dCQUNyQ0EsTUFBT0EsQ0FBQUE7O1lBRVJB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QUlBLENBQUNBLGFBQWFBLENBQUNBLEdBQUNBLEdBQUdBLEdBQUNBLElBQUlBLENBQUNBLEVBQUVBO1NBQzNGQSxLQUFNQTtZQUNOQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxNQUFNQSxHQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxHQUFHQSxDQUFDQTs7WUFFekZBLElBQUlBLElBQUlBLENBQUNBLG9CQUFvQkE7Z0JBQzVCQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxZQUFZQTs7Z0JBRXRDQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxHQUFHQSxHQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxHQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUM1RkE7O1FBRURBLElBQUlBLE9BQU9BLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEdBQUNBLElBQUlBLENBQUNBLGFBQWFBO1FBQ2hEQSxJQUFJQSxPQUFPQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUNyREEsSUFBSUEsT0FBT0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUE7UUFDL0NBLElBQUlBLE9BQU9BLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFlBQVlBOztRQUVwREEsSUFBSUEsSUFBSUE7UUFDUkEsSUFBSUEsS0FBS0E7UUFDVEEsSUFBSUEsR0FBR0E7UUFDUEEsSUFBSUEsTUFBTUE7O1FBRVZBLDJCQUEyQkE7UUFDM0JBLElBQUlBLE1BQU1BLEdBQVVBLENBQUNBLENBQUNBLENBQUNBLE9BQU9BLEdBQUdBLE9BQU9BLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLEdBQUdBLE9BQU9BLEdBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBO1FBQ2xHQSxJQUFJQSxNQUFNQSxHQUFVQSxDQUFDQSxDQUFDQSxPQUFPQSxHQUFHQSxPQUFPQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxHQUFHQSxPQUFPQSxHQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxNQUFNQSxDQUFDQTs7UUFFbEdBLElBQUlBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLE9BQU9BLEdBQUdBLE9BQU9BLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBO1FBQ3pEQSxLQUFLQSxHQUFHQSxNQUFNQTtRQUNkQSxHQUFHQSxHQUFHQSxNQUFNQTtRQUNaQSxNQUFNQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxPQUFPQSxHQUFHQSxPQUFPQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQTs7UUFFNURBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1FBQ3pCQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxHQUFHQSxDQUFDQTtRQUN6QkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDdENBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLEdBQUNBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBO1FBQ3RDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtRQUMvREEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDWEEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDckZBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUNBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBOztRQUU5REEsSUFBSUEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxJQUFJQSxnQkFBZ0JBLENBQUNBLFlBQVlBO1lBQzNEQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFbEJBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLGVBQWVBLENBQUNBLEdBQUdBLENBQUNBOztRQUVsQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLEdBQUNBLElBQUlBO1FBQ3RFQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBQ0EsS0FBS0E7UUFDdkVBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFDQSxHQUFHQTtRQUNyRUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLEdBQUNBLE1BQU1BOztRQUV6RUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLEdBQUNBLElBQUlBO1FBQ3ZFQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBQ0EsS0FBS0E7UUFDeEVBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFDQSxHQUFHQTtRQUN0RUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLEdBQUNBLE1BQU1BOztRQUV6RUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQTtRQUN4SEEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQTs7UUFFMUhBLElBQUlBLENBQUNBLGVBQWVBLEdBQUdBLEtBQUtBO0lBRzdCQSxDQUFDQTtJQUNGSiw2QkFBQ0E7QUFBREEsQ0FBQ0EsRUFoT21DLGNBQWMsRUFnT2pEOztBQUVELHNDQUErQixDQUFBIiwiZmlsZSI6InByb2plY3Rpb25zL1BlcnNwZWN0aXZlUHJvamVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBWZWN0b3IzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1ZlY3RvcjNEXCIpO1xuaW1wb3J0IENvb3JkaW5hdGVTeXN0ZW1cdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcHJvamVjdGlvbnMvQ29vcmRpbmF0ZVN5c3RlbVwiKTtcbmltcG9ydCBQcm9qZWN0aW9uQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9Qcm9qZWN0aW9uQmFzZVwiKTtcblxuY2xhc3MgUGVyc3BlY3RpdmVQcm9qZWN0aW9uIGV4dGVuZHMgUHJvamVjdGlvbkJhc2Vcbntcblx0cHJpdmF0ZSBfZmllbGRPZlZpZXc6bnVtYmVyID0gNjA7XG5cdHByaXZhdGUgX2ZvY2FsTGVuZ3RoOm51bWJlciA9IDEwMDA7XG5cdHByaXZhdGUgX2hGaWVsZE9mVmlldzpudW1iZXIgPSA2MDtcblx0cHJpdmF0ZSBfaEZvY2FsTGVuZ3RoOm51bWJlciA9IDEwMDA7XG5cdHByaXZhdGUgX3ByZXNlcnZlQXNwZWN0UmF0aW86Ym9vbGVhbiA9IHRydWU7XG5cdHByaXZhdGUgX3ByZXNlcnZlRm9jYWxMZW5ndGg6Ym9vbGVhbiA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKGZpZWxkT2ZWaWV3Om51bWJlciA9IDYwLCBjb29yZGluYXRlU3lzdGVtOnN0cmluZyA9IFwibGVmdEhhbmRlZFwiKVxuXHR7XG5cdFx0c3VwZXIoY29vcmRpbmF0ZVN5c3RlbSk7XG5cdFx0dGhpcy5maWVsZE9mVmlldyA9IGZpZWxkT2ZWaWV3O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHByZXNlcnZlQXNwZWN0UmF0aW8oKTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcHJlc2VydmVBc3BlY3RSYXRpbztcblx0fVxuXG5cdHB1YmxpYyBzZXQgcHJlc2VydmVBc3BlY3RSYXRpbyh2YWx1ZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3ByZXNlcnZlQXNwZWN0UmF0aW8gPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9wcmVzZXJ2ZUFzcGVjdFJhdGlvID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5fcHJlc2VydmVBc3BlY3RSYXRpbylcblx0XHRcdHRoaXMucEludmFsaWRhdGVNYXRyaXgoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBwcmVzZXJ2ZUZvY2FsTGVuZ3RoKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3ByZXNlcnZlRm9jYWxMZW5ndGg7XG5cdH1cblxuXHRwdWJsaWMgc2V0IHByZXNlcnZlRm9jYWxMZW5ndGgodmFsdWU6Ym9vbGVhbilcblx0e1xuXHRcdGlmICh0aGlzLl9wcmVzZXJ2ZUZvY2FsTGVuZ3RoID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcHJlc2VydmVGb2NhbExlbmd0aCA9IHZhbHVlO1xuXG5cdFx0dGhpcy5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGZpZWxkT2ZWaWV3KCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fZmllbGRPZlZpZXc7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGZpZWxkT2ZWaWV3KHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9maWVsZE9mVmlldyA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2ZpZWxkT2ZWaWV3ID0gdmFsdWU7XG5cblx0XHR0aGlzLnBJbnZhbGlkYXRlTWF0cml4KCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgZm9jYWxMZW5ndGgoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9mb2NhbExlbmd0aDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgZm9jYWxMZW5ndGgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2ZvY2FsTGVuZ3RoID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fZm9jYWxMZW5ndGggPSB2YWx1ZTtcblxuXHRcdHRoaXMucEludmFsaWRhdGVNYXRyaXgoKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGdldCBoRmllbGRPZlZpZXcoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9oRmllbGRPZlZpZXc7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGhGaWVsZE9mVmlldyh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodGhpcy5faEZpZWxkT2ZWaWV3ID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5faEZpZWxkT2ZWaWV3ID0gdmFsdWU7XG5cblx0XHR0aGlzLl9oRm9jYWxMZW5ndGggPSAxL01hdGgudGFuKHRoaXMuX2hGaWVsZE9mVmlldypNYXRoLlBJLzM2MCk7XG5cblx0XHR0aGlzLnBJbnZhbGlkYXRlTWF0cml4KCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBnZXQgaEZvY2FsTGVuZ3RoKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faEZvY2FsTGVuZ3RoO1xuXHR9XG5cblx0cHVibGljIHNldCBoRm9jYWxMZW5ndGgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX2hGb2NhbExlbmd0aCA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX2hGb2NhbExlbmd0aCA9IHZhbHVlO1xuXG5cdFx0dGhpcy5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHR9XG5cblxuXHQvL0BvdmVycmlkZVxuXHRwdWJsaWMgdW5wcm9qZWN0KG5YOm51bWJlciwgblk6bnVtYmVyLCBzWjpudW1iZXIpOlZlY3RvcjNEXG5cdHtcblx0XHR2YXIgdjpWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRChuWCwgLW5ZLCBzWiwgMS4wKTtcblxuXHRcdHYueCAqPSBzWjtcblx0XHR2LnkgKj0gc1o7XG5cblx0XHR2ID0gdGhpcy51bnByb2plY3Rpb25NYXRyaXgudHJhbnNmb3JtVmVjdG9yKHYpO1xuXG5cdFx0Ly96IGlzIHVuYWZmZWN0ZWQgYnkgdHJhbnNmb3JtXG5cdFx0di56ID0gc1o7XG5cblx0XHRyZXR1cm4gdjtcblx0fVxuXG5cdC8vQG92ZXJyaWRlXG5cdHB1YmxpYyBjbG9uZSgpOlByb2plY3Rpb25CYXNlXG5cdHtcblx0XHR2YXIgY2xvbmU6UGVyc3BlY3RpdmVQcm9qZWN0aW9uID0gbmV3IFBlcnNwZWN0aXZlUHJvamVjdGlvbih0aGlzLl9maWVsZE9mVmlldyk7XG5cdFx0Y2xvbmUuX3BOZWFyID0gdGhpcy5fcE5lYXI7XG5cdFx0Y2xvbmUuX3BGYXIgPSB0aGlzLl9wRmFyO1xuXHRcdGNsb25lLl9wQXNwZWN0UmF0aW8gPSB0aGlzLl9wQXNwZWN0UmF0aW87XG5cdFx0Y2xvbmUuX3BDb29yZGluYXRlU3lzdGVtID0gdGhpcy5fcENvb3JkaW5hdGVTeXN0ZW07XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9XG5cblx0Ly9Ab3ZlcnJpZGVcblx0cHVibGljIHBVcGRhdGVNYXRyaXgoKVxuXHR7XG5cdFx0dmFyIHJhdzpudW1iZXJbXSA9IFtdO1xuXG5cdFx0aWYgKHRoaXMuX3ByZXNlcnZlRm9jYWxMZW5ndGgpIHtcblx0XHRcdGlmICh0aGlzLl9wcmVzZXJ2ZUFzcGVjdFJhdGlvKVxuXHRcdFx0XHR0aGlzLl9oRm9jYWxMZW5ndGggPSB0aGlzLl9mb2NhbExlbmd0aDtcblxuXHRcdFx0dGhpcy5fZmllbGRPZlZpZXcgPSBNYXRoLmF0YW4oMC41KnRoaXMuX3BTY2lzc29yUmVjdC5oZWlnaHQvdGhpcy5fZm9jYWxMZW5ndGgpKjM2MC9NYXRoLlBJO1xuXHRcdFx0dGhpcy5faEZpZWxkT2ZWaWV3ID0gTWF0aC5hdGFuKDAuNSp0aGlzLl9wU2Npc3NvclJlY3Qud2lkdGgvdGhpcy5faEZvY2FsTGVuZ3RoKSozNjAvTWF0aC5QSTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5fZm9jYWxMZW5ndGggPSAwLjUqdGhpcy5fcFNjaXNzb3JSZWN0LmhlaWdodC9NYXRoLnRhbih0aGlzLl9maWVsZE9mVmlldypNYXRoLlBJLzM2MCk7XG5cblx0XHRcdGlmICh0aGlzLl9wcmVzZXJ2ZUFzcGVjdFJhdGlvKVxuXHRcdFx0XHR0aGlzLl9oRm9jYWxMZW5ndGggPSB0aGlzLl9mb2NhbExlbmd0aDtcblx0XHRcdGVsc2Vcblx0XHRcdFx0dGhpcy5faEZvY2FsTGVuZ3RoID0gMC41KnRoaXMuX3BTY2lzc29yUmVjdC53aWR0aC9NYXRoLnRhbih0aGlzLl9oRmllbGRPZlZpZXcqTWF0aC5QSS8zNjApO1xuXHRcdH1cblxuXHRcdHZhciB0YW5NaW5YID0gLXRoaXMuX3BPcmlnaW5YL3RoaXMuX2hGb2NhbExlbmd0aDtcblx0XHR2YXIgdGFuTWF4WCA9ICgxIC0gdGhpcy5fcE9yaWdpblgpL3RoaXMuX2hGb2NhbExlbmd0aDtcblx0XHR2YXIgdGFuTWluWSA9IC10aGlzLl9wT3JpZ2luWS90aGlzLl9mb2NhbExlbmd0aDtcblx0XHR2YXIgdGFuTWF4WSA9ICgxIC0gdGhpcy5fcE9yaWdpblkpL3RoaXMuX2ZvY2FsTGVuZ3RoO1xuXG5cdFx0dmFyIGxlZnQ6bnVtYmVyO1xuXHRcdHZhciByaWdodDpudW1iZXI7XG5cdFx0dmFyIHRvcDpudW1iZXI7XG5cdFx0dmFyIGJvdHRvbTpudW1iZXI7XG5cblx0XHQvLyBhc3N1bWUgc2Npc3NvcmVkIGZydXN0dW1cblx0XHR2YXIgY2VudGVyOm51bWJlciA9IC0oKHRhbk1pblggLSB0YW5NYXhYKSp0aGlzLl9wU2Npc3NvclJlY3QueCArIHRhbk1pblgqdGhpcy5fcFNjaXNzb3JSZWN0LndpZHRoKTtcblx0XHR2YXIgbWlkZGxlOm51bWJlciA9ICgodGFuTWluWSAtIHRhbk1heFkpKnRoaXMuX3BTY2lzc29yUmVjdC55ICsgdGFuTWluWSp0aGlzLl9wU2Npc3NvclJlY3QuaGVpZ2h0KTtcblxuXHRcdGxlZnQgPSBjZW50ZXIgLSAodGFuTWF4WCAtIHRhbk1pblgpKnRoaXMuX3BWaWV3UG9ydC53aWR0aDtcblx0XHRyaWdodCA9IGNlbnRlcjtcblx0XHR0b3AgPSBtaWRkbGU7XG5cdFx0Ym90dG9tID0gbWlkZGxlICsgKHRhbk1heFkgLSB0YW5NaW5ZKSp0aGlzLl9wVmlld1BvcnQuaGVpZ2h0O1xuXG5cdFx0cmF3WzBdID0gMi8ocmlnaHQgLSBsZWZ0KTtcblx0XHRyYXdbNV0gPSAyLyhib3R0b20gLSB0b3ApO1xuXHRcdHJhd1s4XSA9IChyaWdodCArIGxlZnQpLyhyaWdodCAtIGxlZnQpO1xuXHRcdHJhd1s5XSA9IChib3R0b20gKyB0b3ApLyhib3R0b20gLSB0b3ApO1xuXHRcdHJhd1sxMF0gPSAodGhpcy5fcEZhciArIHRoaXMuX3BOZWFyKS8odGhpcy5fcEZhciAtIHRoaXMuX3BOZWFyKTtcblx0XHRyYXdbMTFdID0gMTtcblx0XHRyYXdbMV0gPSByYXdbMl0gPSByYXdbM10gPSByYXdbNF0gPSByYXdbNl0gPSByYXdbN10gPSByYXdbMTJdID0gcmF3WzEzXSA9IHJhd1sxNV0gPSAwO1xuXHRcdHJhd1sxNF0gPSAtMip0aGlzLl9wRmFyKnRoaXMuX3BOZWFyLyh0aGlzLl9wRmFyIC0gdGhpcy5fcE5lYXIpO1xuXG5cdFx0aWYgKHRoaXMuX3BDb29yZGluYXRlU3lzdGVtID09IENvb3JkaW5hdGVTeXN0ZW0uUklHSFRfSEFOREVEKVxuXHRcdFx0cmF3WzVdID0gLXJhd1s1XTtcblxuXHRcdHRoaXMuX3BNYXRyaXguY29weVJhd0RhdGFGcm9tKHJhdyk7XG5cblx0XHR0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMF0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbOV0gPSB0aGlzLl9wTmVhcipsZWZ0O1xuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVyc1szXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1s2XSA9IHRoaXMuX3BOZWFyKnJpZ2h0O1xuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1s0XSA9IHRoaXMuX3BOZWFyKnRvcDtcblx0XHR0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbN10gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTBdID0gdGhpcy5fcE5lYXIqYm90dG9tO1xuXG5cdFx0dGhpcy5fcEZydXN0dW1Db3JuZXJzWzEyXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1syMV0gPSB0aGlzLl9wRmFyKmxlZnQ7XG5cdFx0dGhpcy5fcEZydXN0dW1Db3JuZXJzWzE1XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxOF0gPSB0aGlzLl9wRmFyKnJpZ2h0O1xuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxM10gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTZdID0gdGhpcy5fcEZhcip0b3A7XG5cdFx0dGhpcy5fcEZydXN0dW1Db3JuZXJzWzE5XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1syMl0gPSB0aGlzLl9wRmFyKmJvdHRvbTtcblxuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVyc1syXSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1s1XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1s4XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1sxMV0gPSB0aGlzLl9wTmVhcjtcblx0XHR0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMTRdID0gdGhpcy5fcEZydXN0dW1Db3JuZXJzWzE3XSA9IHRoaXMuX3BGcnVzdHVtQ29ybmVyc1syMF0gPSB0aGlzLl9wRnJ1c3R1bUNvcm5lcnNbMjNdID0gdGhpcy5fcEZhcjtcblxuXHRcdHRoaXMuX3BNYXRyaXhJbnZhbGlkID0gZmFsc2U7XG5cblxuXHR9XG59XG5cbmV4cG9ydCA9IFBlcnNwZWN0aXZlUHJvamVjdGlvbjsiXX0= \ No newline at end of file diff --git a/lib/projections/PerspectiveProjection.ts b/lib/projections/PerspectiveProjection.ts new file mode 100644 index 00000000..a513341a --- /dev/null +++ b/lib/projections/PerspectiveProjection.ts @@ -0,0 +1,231 @@ +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import CoordinateSystem = require("awayjs-core/lib/projections/CoordinateSystem"); +import ProjectionBase = require("awayjs-core/lib/projections/ProjectionBase"); + +class PerspectiveProjection extends ProjectionBase +{ + private _fieldOfView:number = 60; + private _focalLength:number = 1000; + private _hFieldOfView:number = 60; + private _hFocalLength:number = 1000; + private _preserveAspectRatio:boolean = true; + private _preserveFocalLength:boolean = false; + + constructor(fieldOfView:number = 60, coordinateSystem:string = "leftHanded") + { + super(coordinateSystem); + this.fieldOfView = fieldOfView; + } + + /** + * + */ + public get preserveAspectRatio():boolean + { + return this._preserveAspectRatio; + } + + public set preserveAspectRatio(value:boolean) + { + if (this._preserveAspectRatio == value) + return; + + this._preserveAspectRatio = value; + + if (this._preserveAspectRatio) + this.pInvalidateMatrix(); + } + + /** + * + */ + public get preserveFocalLength():boolean + { + return this._preserveFocalLength; + } + + public set preserveFocalLength(value:boolean) + { + if (this._preserveFocalLength == value) + return; + + this._preserveFocalLength = value; + + this.pInvalidateMatrix(); + } + + /** + * + */ + public get fieldOfView():number + { + return this._fieldOfView; + } + + public set fieldOfView(value:number) + { + if (this._fieldOfView == value) + return; + + this._fieldOfView = value; + + this.pInvalidateMatrix(); + } + + /** + * + */ + public get focalLength():number + { + return this._focalLength; + } + + public set focalLength(value:number) + { + if (this._focalLength == value) + return; + + this._focalLength = value; + + this.pInvalidateMatrix(); + } + + /** + * + */ + public get hFieldOfView():number + { + return this._hFieldOfView; + } + + public set hFieldOfView(value:number) + { + if (this._hFieldOfView == value) + return; + + this._hFieldOfView = value; + + this._hFocalLength = 1/Math.tan(this._hFieldOfView*Math.PI/360); + + this.pInvalidateMatrix(); + } + + /** + * + */ + public get hFocalLength():number + { + return this._hFocalLength; + } + + public set hFocalLength(value:number) + { + if (this._hFocalLength == value) + return; + + this._hFocalLength = value; + + this.pInvalidateMatrix(); + } + + + //@override + public unproject(nX:number, nY:number, sZ:number):Vector3D + { + var v:Vector3D = new Vector3D(nX, -nY, sZ, 1.0); + + v.x *= sZ; + v.y *= sZ; + + v = this.unprojectionMatrix.transformVector(v); + + //z is unaffected by transform + v.z = sZ; + + return v; + } + + //@override + public clone():ProjectionBase + { + var clone:PerspectiveProjection = new PerspectiveProjection(this._fieldOfView); + clone._pNear = this._pNear; + clone._pFar = this._pFar; + clone._pAspectRatio = this._pAspectRatio; + clone._pCoordinateSystem = this._pCoordinateSystem; + return clone; + } + + //@override + public pUpdateMatrix() + { + var raw:number[] = []; + + if (this._preserveFocalLength) { + if (this._preserveAspectRatio) + this._hFocalLength = this._focalLength; + + this._fieldOfView = Math.atan(0.5*this._pScissorRect.height/this._focalLength)*360/Math.PI; + this._hFieldOfView = Math.atan(0.5*this._pScissorRect.width/this._hFocalLength)*360/Math.PI; + } else { + this._focalLength = 0.5*this._pScissorRect.height/Math.tan(this._fieldOfView*Math.PI/360); + + if (this._preserveAspectRatio) + this._hFocalLength = this._focalLength; + else + this._hFocalLength = 0.5*this._pScissorRect.width/Math.tan(this._hFieldOfView*Math.PI/360); + } + + var tanMinX = -this._pOriginX/this._hFocalLength; + var tanMaxX = (1 - this._pOriginX)/this._hFocalLength; + var tanMinY = -this._pOriginY/this._focalLength; + var tanMaxY = (1 - this._pOriginY)/this._focalLength; + + var left:number; + var right:number; + var top:number; + var bottom:number; + + // assume scissored frustum + var center:number = -((tanMinX - tanMaxX)*this._pScissorRect.x + tanMinX*this._pScissorRect.width); + var middle:number = ((tanMinY - tanMaxY)*this._pScissorRect.y + tanMinY*this._pScissorRect.height); + + left = center - (tanMaxX - tanMinX)*this._pViewPort.width; + right = center; + top = middle; + bottom = middle + (tanMaxY - tanMinY)*this._pViewPort.height; + + raw[0] = 2/(right - left); + raw[5] = 2/(bottom - top); + raw[8] = (right + left)/(right - left); + raw[9] = (bottom + top)/(bottom - top); + raw[10] = (this._pFar + this._pNear)/(this._pFar - this._pNear); + raw[11] = 1; + raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[12] = raw[13] = raw[15] = 0; + raw[14] = -2*this._pFar*this._pNear/(this._pFar - this._pNear); + + if (this._pCoordinateSystem == CoordinateSystem.RIGHT_HANDED) + raw[5] = -raw[5]; + + this._pMatrix.copyRawDataFrom(raw); + + this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pNear*left; + this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pNear*right; + this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pNear*top; + this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pNear*bottom; + + this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._pFar*left; + this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._pFar*right; + this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._pFar*top; + this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._pFar*bottom; + + this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; + this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; + + this._pMatrixInvalid = false; + + + } +} + +export = PerspectiveProjection; \ No newline at end of file diff --git a/lib/projections/ProjectionBase.js b/lib/projections/ProjectionBase.js new file mode 100755 index 00000000..95909600 --- /dev/null +++ b/lib/projections/ProjectionBase.js @@ -0,0 +1,226 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var ProjectionBase = (function (_super) { + __extends(ProjectionBase, _super); + function ProjectionBase(coordinateSystem) { + if (typeof coordinateSystem === "undefined") { coordinateSystem = "leftHanded"; } + _super.call(this); + this._pMatrix = new Matrix3D(); + this._pScissorRect = new Rectangle(); + this._pViewPort = new Rectangle(); + this._pNear = 20; + this._pFar = 3000; + this._pAspectRatio = 1; + this._pMatrixInvalid = true; + this._pFrustumCorners = []; + this._pOriginX = 0.5; + this._pOriginY = 0.5; + this._unprojectionInvalid = true; + + this.coordinateSystem = coordinateSystem; + } + Object.defineProperty(ProjectionBase.prototype, "coordinateSystem", { + /** + * The handedness of the coordinate system projection. The default is LEFT_HANDED. + */ + get: function () { + return this._pCoordinateSystem; + }, + set: function (value) { + if (this._pCoordinateSystem == value) + return; + + this._pCoordinateSystem = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "frustumCorners", { + get: function () { + return this._pFrustumCorners; + }, + set: function (frustumCorners) { + this._pFrustumCorners = frustumCorners; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "matrix", { + get: function () { + if (this._pMatrixInvalid) { + this.pUpdateMatrix(); + this._pMatrixInvalid = false; + } + return this._pMatrix; + }, + set: function (value) { + this._pMatrix = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "near", { + get: function () { + return this._pNear; + }, + set: function (value) { + if (value == this._pNear) { + return; + } + this._pNear = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "originX", { + get: function () { + return this._pOriginX; + }, + set: function (value) { + if (this._pOriginX == value) + return; + + this._pOriginX = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "originY", { + get: function () { + return this._pOriginY; + }, + set: function (value) { + if (this._pOriginY == value) + return; + + this._pOriginY = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ProjectionBase.prototype, "far", { + get: function () { + return this._pFar; + }, + set: function (value) { + if (value == this._pFar) { + return; + } + this._pFar = value; + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + ProjectionBase.prototype.project = function (point3d) { + var v = this.matrix.transformVector(point3d); + v.x = v.x / v.w; + v.y = -v.y / v.w; + + //z is unaffected by transform + v.z = point3d.z; + + return v; + }; + + Object.defineProperty(ProjectionBase.prototype, "unprojectionMatrix", { + get: function () { + if (this._unprojectionInvalid) { + if (!this._unprojection) + this._unprojection = new Matrix3D(); + + this._unprojection.copyFrom(this.matrix); + this._unprojection.invert(); + this._unprojectionInvalid = false; + } + return this._unprojection; + }, + enumerable: true, + configurable: true + }); + + ProjectionBase.prototype.unproject = function (nX, nY, sZ) { + throw new AbstractMethodError(); + }; + + ProjectionBase.prototype.clone = function () { + throw new AbstractMethodError(); + }; + + Object.defineProperty(ProjectionBase.prototype, "_iAspectRatio", { + get: function () { + return this._pAspectRatio; + }, + set: function (value) { + if (this._pAspectRatio == value) + return; + + this._pAspectRatio = value; + + this.pInvalidateMatrix(); + }, + enumerable: true, + configurable: true + }); + + + ProjectionBase.prototype.pInvalidateMatrix = function () { + this._pMatrixInvalid = true; + this._unprojectionInvalid = true; + this.dispatchEvent(new ProjectionEvent(ProjectionEvent.MATRIX_CHANGED, this)); + }; + + ProjectionBase.prototype.pUpdateMatrix = function () { + throw new AbstractMethodError(); + }; + + ProjectionBase.prototype._iUpdateScissorRect = function (x, y, width, height) { + this._pScissorRect.x = x; + this._pScissorRect.y = y; + this._pScissorRect.width = width; + this._pScissorRect.height = height; + this.pInvalidateMatrix(); + }; + + ProjectionBase.prototype._iUpdateViewport = function (x, y, width, height) { + this._pViewPort.x = x; + this._pViewPort.y = y; + this._pViewPort.width = width; + this._pViewPort.height = height; + this.pInvalidateMatrix(); + }; + return ProjectionBase; +})(EventDispatcher); + +module.exports = ProjectionBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInByb2plY3Rpb25zL1Byb2plY3Rpb25CYXNlLnRzIl0sIm5hbWVzIjpbIlByb2plY3Rpb25CYXNlIiwiUHJvamVjdGlvbkJhc2UuY29uc3RydWN0b3IiLCJQcm9qZWN0aW9uQmFzZS5wcm9qZWN0IiwiUHJvamVjdGlvbkJhc2UudW5wcm9qZWN0IiwiUHJvamVjdGlvbkJhc2UuY2xvbmUiLCJQcm9qZWN0aW9uQmFzZS5wSW52YWxpZGF0ZU1hdHJpeCIsIlByb2plY3Rpb25CYXNlLnBVcGRhdGVNYXRyaXgiLCJQcm9qZWN0aW9uQmFzZS5faVVwZGF0ZVNjaXNzb3JSZWN0IiwiUHJvamVjdGlvbkJhc2UuX2lVcGRhdGVWaWV3cG9ydCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNERBQW9FO0FBQ3BFLDhEQUFxRTs7QUFFckUsdUVBQTZFO0FBQzdFLHVFQUE2RTtBQUM3RSwrRUFBb0Y7O0FBR3BGO0lBQTZCQSxpQ0FBZUE7SUFrQjNDQSx3QkFBWUEsZ0JBQXNDQTtRQUF0Q0MsK0NBQUFBLGdCQUFnQkEsR0FBVUEsWUFBWUE7QUFBQUEsUUFFakRBLFdBQU1BLEtBQUFBLENBQUNBO1FBbEJSQSxLQUFPQSxRQUFRQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUMxQ0EsS0FBT0EsYUFBYUEsR0FBYUEsSUFBSUEsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDakRBLEtBQU9BLFVBQVVBLEdBQWFBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBO1FBQzlDQSxLQUFPQSxNQUFNQSxHQUFVQSxFQUFFQSxDQUFDQTtRQUMxQkEsS0FBT0EsS0FBS0EsR0FBVUEsSUFBSUEsQ0FBQ0E7UUFDM0JBLEtBQU9BLGFBQWFBLEdBQVVBLENBQUNBLENBQUNBO1FBRWhDQSxLQUFPQSxlQUFlQSxHQUFXQSxJQUFJQSxDQUFDQTtRQUN0Q0EsS0FBT0EsZ0JBQWdCQSxHQUFZQSxFQUFFQSxDQUFDQTtRQUV0Q0EsS0FBT0EsU0FBU0EsR0FBVUEsR0FBR0Es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LElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxHQUFHQSxLQUFLQTtRQUM3QkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsR0FBR0EsTUFBTUE7UUFDL0JBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7SUFDekJBLENBQUNBO0lBQ0ZSLHNCQUFDQTtBQUFEQSxDQUFDQSxFQXpNNEIsZUFBZSxFQXlNM0M7O0FBRUQsK0JBQXdCLENBQUEiLCJmaWxlIjoicHJvamVjdGlvbnMvUHJvamVjdGlvbkJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWF0cml4M0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXgzRFwiKTtcbmltcG9ydCBSZWN0YW5nbGVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUmVjdGFuZ2xlXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgRXZlbnREaXNwYXRjaGVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudERpc3BhdGNoZXJcIik7XG5pbXBvcnQgUHJvamVjdGlvbkV2ZW50XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9Qcm9qZWN0aW9uRXZlbnRcIik7XG5pbXBvcnQgQWJzdHJhY3RNZXRob2RFcnJvclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Fic3RyYWN0TWV0aG9kRXJyb3JcIik7XG5pbXBvcnQgSVByb2plY3Rpb25cdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9JUHJvamVjdGlvblwiKTtcblxuY2xhc3MgUHJvamVjdGlvbkJhc2UgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXIgaW1wbGVtZW50cyBJUHJvamVjdGlvblxue1xuXHRwdWJsaWMgX3BNYXRyaXg6TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoKTtcblx0cHVibGljIF9wU2Npc3NvclJlY3Q6UmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgpO1xuXHRwdWJsaWMgX3BWaWV3UG9ydDpSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKCk7XG5cdHB1YmxpYyBfcE5lYXI6bnVtYmVyID0gMjA7XG5cdHB1YmxpYyBfcEZhcjpudW1iZXIgPSAzMDAwO1xuXHRwdWJsaWMgX3BBc3BlY3RSYXRpbzpudW1iZXIgPSAxO1xuXG5cdHB1YmxpYyBfcE1hdHJpeEludmFsaWQ6Ym9vbGVhbiA9IHRydWU7XG5cdHB1YmxpYyBfcEZydXN0dW1Db3JuZXJzOm51bWJlcltdID0gW107XG5cdHB1YmxpYyBfcENvb3JkaW5hdGVTeXN0ZW06c3RyaW5nO1xuXHRwdWJsaWMgX3BPcmlnaW5YOm51bWJlciA9IDAuNTtcblx0cHVibGljIF9wT3JpZ2luWTpudW1iZXIgPSAwLjU7XG5cblx0cHJpdmF0ZSBfdW5wcm9qZWN0aW9uOk1hdHJpeDNEO1xuXHRwcml2YXRlIF91bnByb2plY3Rpb25JbnZhbGlkOmJvb2xlYW4gPSB0cnVlO1xuXG5cdGNvbnN0cnVjdG9yKGNvb3JkaW5hdGVTeXN0ZW06c3RyaW5nID0gXCJsZWZ0SGFuZGVkXCIpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5jb29yZGluYXRlU3lzdGVtID0gY29vcmRpbmF0ZVN5c3RlbTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgaGFuZGVkbmVzcyBvZiB0aGUgY29vcmRpbmF0ZSBzeXN0ZW0gcHJvamVjdGlvbi4gVGhlIGRlZmF1bHQgaXMgTEVGVF9IQU5ERUQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGNvb3JkaW5hdGVTeXN0ZW0oKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wQ29vcmRpbmF0ZVN5c3RlbTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgY29vcmRpbmF0ZVN5c3RlbSh2YWx1ZTpzdHJpbmcpXG5cdHtcblx0XHRpZiAodGhpcy5fcENvb3JkaW5hdGVTeXN0ZW0gPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHR0aGlzLl9wQ29vcmRpbmF0ZVN5c3RlbSA9IHZhbHVlO1xuXG5cdFx0dGhpcy5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHR9XG5cblx0cHVibGljIGdldCBmcnVzdHVtQ29ybmVycygpOm51bWJlcltdXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcEZydXN0dW1Db3JuZXJzO1xuXHR9XG5cblx0cHVibGljIHNldCBmcnVzdHVtQ29ybmVycyhmcnVzdHVtQ29ybmVyczpudW1iZXJbXSlcblx0e1xuXHRcdHRoaXMuX3BGcnVzdHVtQ29ybmVycyA9IGZydXN0dW1Db3JuZXJzO1xuXHR9XG5cblx0cHVibGljIGdldCBtYXRyaXgoKTpNYXRyaXgzRFxuXHR7XG5cdFx0aWYgKHRoaXMuX3BNYXRyaXhJbnZhbGlkKSB7XG5cdFx0XHR0aGlzLnBVcGRhdGVNYXRyaXgoKTtcblx0XHRcdHRoaXMuX3BNYXRyaXhJbnZhbGlkID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9wTWF0cml4O1xuXHR9XG5cblx0cHVibGljIHNldCBtYXRyaXgodmFsdWU6TWF0cml4M0QpXG5cdHtcblx0XHR0aGlzLl9wTWF0cml4ID0gdmFsdWU7XG5cdFx0dGhpcy5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHR9XG5cblx0cHVibGljIGdldCBuZWFyKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcE5lYXI7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG5lYXIodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHZhbHVlID09IHRoaXMuX3BOZWFyKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuX3BOZWFyID0gdmFsdWU7XG5cdFx0dGhpcy5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHR9XG5cblx0cHVibGljIGdldCBvcmlnaW5YKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcE9yaWdpblg7XG5cdH1cblxuXHRwdWJsaWMgc2V0IG9yaWdpblgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BPcmlnaW5YID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fcE9yaWdpblggPSB2YWx1ZTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgb3JpZ2luWSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BPcmlnaW5ZO1xuXHR9XG5cblx0cHVibGljIHNldCBvcmlnaW5ZKHZhbHVlOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9wT3JpZ2luWSA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3BPcmlnaW5ZID0gdmFsdWU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IGZhcigpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BGYXI7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGZhcih2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodmFsdWUgPT0gdGhpcy5fcEZhcikge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLl9wRmFyID0gdmFsdWU7XG5cdFx0dGhpcy5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHR9XG5cblx0cHVibGljIHByb2plY3QocG9pbnQzZDpWZWN0b3IzRCk6VmVjdG9yM0Rcblx0e1xuXHRcdHZhciB2OlZlY3RvcjNEID0gdGhpcy5tYXRyaXgudHJhbnNmb3JtVmVjdG9yKHBvaW50M2QpO1xuXHRcdHYueCA9IHYueC92Lnc7XG5cdFx0di55ID0gLXYueS92Lnc7XG5cblx0XHQvL3ogaXMgdW5hZmZlY3RlZCBieSB0cmFuc2Zvcm1cblx0XHR2LnogPSBwb2ludDNkLno7XG5cblx0XHRyZXR1cm4gdjtcblx0fVxuXG5cdHB1YmxpYyBnZXQgdW5wcm9qZWN0aW9uTWF0cml4KCk6TWF0cml4M0Rcblx0e1xuXHRcdGlmICh0aGlzLl91bnByb2plY3Rpb25JbnZhbGlkKSB7XG5cdFx0XHRpZiAoIXRoaXMuX3VucHJvamVjdGlvbilcblx0XHRcdFx0dGhpcy5fdW5wcm9qZWN0aW9uID0gbmV3IE1hdHJpeDNEKCk7XG5cblx0XHRcdHRoaXMuX3VucHJvamVjdGlvbi5jb3B5RnJvbSh0aGlzLm1hdHJpeCk7XG5cdFx0XHR0aGlzLl91bnByb2plY3Rpb24uaW52ZXJ0KCk7XG5cdFx0XHR0aGlzLl91bnByb2plY3Rpb25JbnZhbGlkID0gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl91bnByb2plY3Rpb247XG5cdH1cblxuXHRwdWJsaWMgdW5wcm9qZWN0KG5YOm51bWJlciwgblk6bnVtYmVyLCBzWjpudW1iZXIpOlZlY3RvcjNEXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG5cblx0cHVibGljIGNsb25lKCk6UHJvamVjdGlvbkJhc2Vcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0IF9pQXNwZWN0UmF0aW8oKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wQXNwZWN0UmF0aW87XG5cdH1cblxuXHRwdWJsaWMgc2V0IF9pQXNwZWN0UmF0aW8odmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BBc3BlY3RSYXRpbyA9PSB2YWx1ZSlcblx0XHRcdHJldHVybjtcblxuXHRcdHRoaXMuX3BBc3BlY3RSYXRpbyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5wSW52YWxpZGF0ZU1hdHJpeCgpO1xuXHR9XG5cblx0cHVibGljIHBJbnZhbGlkYXRlTWF0cml4KClcblx0e1xuXHRcdHRoaXMuX3BNYXRyaXhJbnZhbGlkID0gdHJ1ZTtcblx0XHR0aGlzLl91bnByb2plY3Rpb25JbnZhbGlkID0gdHJ1ZTtcblx0XHR0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFByb2plY3Rpb25FdmVudChQcm9qZWN0aW9uRXZlbnQuTUFUUklYX0NIQU5HRUQsIHRoaXMpKTtcblx0fVxuXG5cdHB1YmxpYyBwVXBkYXRlTWF0cml4KClcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cblxuXHRwdWJsaWMgX2lVcGRhdGVTY2lzc29yUmVjdCh4Om51bWJlciwgeTpudW1iZXIsIHdpZHRoOm51bWJlciwgaGVpZ2h0Om51bWJlcilcblx0e1xuXHRcdHRoaXMuX3BTY2lzc29yUmVjdC54ID0geDtcblx0XHR0aGlzLl9wU2Npc3NvclJlY3QueSA9IHk7XG5cdFx0dGhpcy5fcFNjaXNzb3JSZWN0LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy5fcFNjaXNzb3JSZWN0LmhlaWdodCA9IGhlaWdodDtcblx0XHR0aGlzLnBJbnZhbGlkYXRlTWF0cml4KCk7XG5cdH1cblxuXHRwdWJsaWMgX2lVcGRhdGVWaWV3cG9ydCh4Om51bWJlciwgeTpudW1iZXIsIHdpZHRoOm51bWJlciwgaGVpZ2h0Om51bWJlcilcblx0e1xuXHRcdHRoaXMuX3BWaWV3UG9ydC54ID0geDtcblx0XHR0aGlzLl9wVmlld1BvcnQueSA9IHk7XG5cdFx0dGhpcy5fcFZpZXdQb3J0LndpZHRoID0gd2lkdGg7XG5cdFx0dGhpcy5fcFZpZXdQb3J0LmhlaWdodCA9IGhlaWdodDtcblx0XHR0aGlzLnBJbnZhbGlkYXRlTWF0cml4KCk7XG5cdH1cbn1cblxuZXhwb3J0ID0gUHJvamVjdGlvbkJhc2U7Il19 \ No newline at end of file diff --git a/lib/projections/ProjectionBase.ts b/lib/projections/ProjectionBase.ts new file mode 100644 index 00000000..8ec1b4bd --- /dev/null +++ b/lib/projections/ProjectionBase.ts @@ -0,0 +1,212 @@ +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import ProjectionEvent = require("awayjs-core/lib/events/ProjectionEvent"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import IProjection = require("awayjs-core/lib/projections/IProjection"); + +class ProjectionBase extends EventDispatcher implements IProjection +{ + public _pMatrix:Matrix3D = new Matrix3D(); + public _pScissorRect:Rectangle = new Rectangle(); + public _pViewPort:Rectangle = new Rectangle(); + public _pNear:number = 20; + public _pFar:number = 3000; + public _pAspectRatio:number = 1; + + public _pMatrixInvalid:boolean = true; + public _pFrustumCorners:number[] = []; + public _pCoordinateSystem:string; + public _pOriginX:number = 0.5; + public _pOriginY:number = 0.5; + + private _unprojection:Matrix3D; + private _unprojectionInvalid:boolean = true; + + constructor(coordinateSystem:string = "leftHanded") + { + super(); + + this.coordinateSystem = coordinateSystem; + } + + /** + * The handedness of the coordinate system projection. The default is LEFT_HANDED. + */ + public get coordinateSystem():string + { + return this._pCoordinateSystem; + } + + public set coordinateSystem(value:string) + { + if (this._pCoordinateSystem == value) + return; + + this._pCoordinateSystem = value; + + this.pInvalidateMatrix(); + } + + public get frustumCorners():number[] + { + return this._pFrustumCorners; + } + + public set frustumCorners(frustumCorners:number[]) + { + this._pFrustumCorners = frustumCorners; + } + + public get matrix():Matrix3D + { + if (this._pMatrixInvalid) { + this.pUpdateMatrix(); + this._pMatrixInvalid = false; + } + return this._pMatrix; + } + + public set matrix(value:Matrix3D) + { + this._pMatrix = value; + this.pInvalidateMatrix(); + } + + public get near():number + { + return this._pNear; + } + + public set near(value:number) + { + if (value == this._pNear) { + return; + } + this._pNear = value; + this.pInvalidateMatrix(); + } + + public get originX():number + { + return this._pOriginX; + } + + public set originX(value:number) + { + if (this._pOriginX == value) + return; + + this._pOriginX = value; + } + + public get originY():number + { + return this._pOriginY; + } + + public set originY(value:number) + { + if (this._pOriginY == value) + return; + + this._pOriginY = value; + } + + public get far():number + { + return this._pFar; + } + + public set far(value:number) + { + if (value == this._pFar) { + return; + } + this._pFar = value; + this.pInvalidateMatrix(); + } + + public project(point3d:Vector3D):Vector3D + { + var v:Vector3D = this.matrix.transformVector(point3d); + v.x = v.x/v.w; + v.y = -v.y/v.w; + + //z is unaffected by transform + v.z = point3d.z; + + return v; + } + + public get unprojectionMatrix():Matrix3D + { + if (this._unprojectionInvalid) { + if (!this._unprojection) + this._unprojection = new Matrix3D(); + + this._unprojection.copyFrom(this.matrix); + this._unprojection.invert(); + this._unprojectionInvalid = false; + } + return this._unprojection; + } + + public unproject(nX:number, nY:number, sZ:number):Vector3D + { + throw new AbstractMethodError(); + } + + public clone():ProjectionBase + { + throw new AbstractMethodError(); + } + + public get _iAspectRatio():number + { + return this._pAspectRatio; + } + + public set _iAspectRatio(value:number) + { + if (this._pAspectRatio == value) + return; + + this._pAspectRatio = value; + + this.pInvalidateMatrix(); + } + + public pInvalidateMatrix() + { + this._pMatrixInvalid = true; + this._unprojectionInvalid = true; + this.dispatchEvent(new ProjectionEvent(ProjectionEvent.MATRIX_CHANGED, this)); + } + + public pUpdateMatrix() + { + throw new AbstractMethodError(); + } + + public _iUpdateScissorRect(x:number, y:number, width:number, height:number) + { + this._pScissorRect.x = x; + this._pScissorRect.y = y; + this._pScissorRect.width = width; + this._pScissorRect.height = height; + this.pInvalidateMatrix(); + } + + public _iUpdateViewport(x:number, y:number, width:number, height:number) + { + this._pViewPort.x = x; + this._pViewPort.y = y; + this._pViewPort.width = width; + this._pViewPort.height = height; + this.pInvalidateMatrix(); + } +} + +export = ProjectionBase; \ No newline at end of file diff --git a/lib/textures/BitmapCubeTexture.js b/lib/textures/BitmapCubeTexture.js new file mode 100755 index 00000000..690132de --- /dev/null +++ b/lib/textures/BitmapCubeTexture.js @@ -0,0 +1,169 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var BitmapCubeTexture = (function (_super) { + __extends(BitmapCubeTexture, _super); + function BitmapCubeTexture(posX, negX, posY, negY, posZ, negZ, generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + this._bitmapDatas = new Array(6); + + this._testSize(this._bitmapDatas[0] = posX); + this._testSize(this._bitmapDatas[1] = negX); + this._testSize(this._bitmapDatas[2] = posY); + this._testSize(this._bitmapDatas[3] = negY); + this._testSize(this._bitmapDatas[4] = posZ); + this._testSize(this._bitmapDatas[5] = negZ); + + this.invalidateContent(); + + this._pSetSize(posX.width); + } + Object.defineProperty(BitmapCubeTexture.prototype, "positiveX", { + /** + * The texture on the cube's right face. + */ + get: function () { + return this._bitmapDatas[0]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[0] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "negativeX", { + /** + * The texture on the cube's left face. + */ + get: function () { + return this._bitmapDatas[1]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[1] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "positiveY", { + /** + * The texture on the cube's top face. + */ + get: function () { + return this._bitmapDatas[2]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[2] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "negativeY", { + /** + * The texture on the cube's bottom face. + */ + get: function () { + return this._bitmapDatas[3]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[3] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "positiveZ", { + /** + * The texture on the cube's far face. + */ + get: function () { + return this._bitmapDatas[4]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[4] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(BitmapCubeTexture.prototype, "negativeZ", { + /** + * The texture on the cube's near face. + */ + get: function () { + return this._bitmapDatas[5]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[5] = value; + }, + enumerable: true, + configurable: true + }); + + + /** + * + * @param value + * @private + */ + BitmapCubeTexture.prototype._testSize = function (value) { + if (value.width != value.height) + throw new Error("BitmapData should have equal width and height!"); + if (!TextureUtils.isBitmapDataValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + }; + + BitmapCubeTexture.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + var len = this._bitmapDatas.length; + for (var i = 0; i < len; i++) { + this._bitmapDatas[i].dispose(); + this._bitmapDatas[i] = null; + } + + this._bitmapDatas = null; + }; + + BitmapCubeTexture.prototype._iGetTextureData = function (side) { + return this._bitmapDatas[side]; + }; + return BitmapCubeTexture; +})(CubeTextureBase); + +module.exports = BitmapCubeTexture; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL0JpdG1hcEN1YmVUZXh0dXJlLnRzIl0sIm5hbWVzIjpbIkJpdG1hcEN1YmVUZXh0dXJlIiwiQml0bWFwQ3ViZVRleHR1cmUuY29uc3RydWN0b3IiLCJCaXRtYXBDdWJlVGV4dHVyZS5fdGVzdFNpemUiLCJCaXRtYXBDdWJlVGV4dHVyZS5kaXNwb3NlIiwiQml0bWFwQ3ViZVRleHR1cmUuX2lHZXRUZXh0dXJlRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQzJEO0FBQzNELHlFQUErRTtBQUMvRSxnRUFBdUU7O0FBRXZFO0lBQWdDQSxvQ0FBZUE7SUFvRzlDQSwyQkFBWUEsSUFBZUEsRUFBRUEsSUFBZUEsRUFBRUEsSUFBZUEsRUFBRUEsSUFBZUEsRUFBRUEsSUFBZUEsRUFBRUEsSUFBZUEsRUFBRUEsZUFBK0JBO1FBQS9CQyw4Q0FBQUEsZUFBZUEsR0FBV0EsS0FBS0E7QUFBQUEsUUFFaEpBLFdBQU1BLE9BQUFBLGVBQWVBLENBQUNBO1FBcEd2QkEsS0FBUUEsWUFBWUEsR0FBcUJBLElBQUlBLEtBQUtBLENBQWFBLENBQUNBLENBQUNBLENBQUNBOztRQXNHakVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO1FBQzNDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtRQUMzQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDM0NBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO1FBQzNDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtRQUMzQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7O1FBRTNDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBOztRQUV4QkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7SUFDM0JBLENBQUNBO0lBM0dERDtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXFCQSxLQUFnQkE7WUFFcENBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3JCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1lBQ3hCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7UUFDN0JBLENBQUNBOzs7O0FBUkFBOztJQWFEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXFCQSxLQUFnQkE7WUFFcENBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3JCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1lBQ3hCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7UUFDN0JBLENBQUNBOzs7O0FBUkFBOztJQWFEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXFCQSxLQUFnQkE7WUFFcENBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3JCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1lBQ3hCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7UUFDN0JBLENBQUNBOzs7O0FBUkFBOztJQWFEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXFCQSxLQUFnQkE7WUFFcENBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3JCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1lBQ3hCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7UUFDN0JBLENBQUNBOzs7O0FBUkFBOztJQWFEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXFCQSxLQUFnQkE7WUFFcENBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3JCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1lBQ3hCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7UUFDN0JBLENBQUNBOzs7O0FBUkFBOztJQWFEQTtRQUFBQTs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDNUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXFCQSxLQUFnQkE7WUFFcENBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3JCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1lBQ3hCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUMzQkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7UUFDN0JBLENBQUNBOzs7O0FBUkFBOztJQStCREE7Ozs7TUFER0E7NENBQ0hBLFVBQWtCQSxLQUFnQkE7UUFFakNFLElBQUlBLEtBQUtBLENBQUNBLEtBQUtBLElBQUlBLEtBQUtBLENBQUNBLE1BQU1BO1lBQzlCQSxNQUFNQSxJQUFJQSxLQUFLQSxDQUFDQSxnREFBZ0RBLENBQUNBLENBQUNBO1FBQ25FQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxpQkFBaUJBLENBQUNBLEtBQUtBLENBQUNBO1lBQ3pDQSxNQUFNQSxJQUFJQSxLQUFLQSxDQUFDQSxnRkFBZ0ZBLENBQUNBLENBQUNBO0lBQ3BHQSxDQUFDQTs7SUFFREYsc0NBQUFBO1FBRUNHLGdCQUFLQSxDQUFDQSxPQUFPQSxLQUFDQSxLQUFBQSxDQUFDQTs7UUFFZkEsSUFBSUEsR0FBR0EsR0FBVUEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsTUFBTUE7UUFDekNBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBLENBQUVBO1lBQ3BDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQTtZQUM5QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUE7U0FDM0JBOztRQUVEQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQTtJQUN6QkEsQ0FBQ0E7O0lBRURILCtDQUFBQSxVQUF3QkEsSUFBV0E7UUFFbENJLE9BQU9BLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLElBQUlBLENBQUNBO0lBQy9CQSxDQUFDQTtJQUNGSix5QkFBQ0E7QUFBREEsQ0FBQ0EsRUFsSitCLGVBQWUsRUFrSjlDOztBQUVELGtDQUEyQixDQUFBIiwiZmlsZSI6InRleHR1cmVzL0JpdG1hcEN1YmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpdG1hcERhdGFcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvQml0bWFwRGF0YVwiKTtcbmltcG9ydCBFcnJvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Vycm9yXCIpO1xuaW1wb3J0IEN1YmVUZXh0dXJlQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9DdWJlVGV4dHVyZUJhc2VcIik7XG5pbXBvcnQgVGV4dHVyZVV0aWxzXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvVGV4dHVyZVV0aWxzXCIpO1xuXG5jbGFzcyBCaXRtYXBDdWJlVGV4dHVyZSBleHRlbmRzIEN1YmVUZXh0dXJlQmFzZVxue1xuXHRwcml2YXRlIF9iaXRtYXBEYXRhczpBcnJheTxCaXRtYXBEYXRhPiA9IG5ldyBBcnJheTxCaXRtYXBEYXRhPig2KTtcblxuXHQvKipcblx0ICogVGhlIHRleHR1cmUgb24gdGhlIGN1YmUncyByaWdodCBmYWNlLlxuXHQgKi9cblx0cHVibGljIGdldCBwb3NpdGl2ZVgoKTpCaXRtYXBEYXRhXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYml0bWFwRGF0YXNbMF07XG5cdH1cblxuXHRwdWJsaWMgc2V0IHBvc2l0aXZlWCh2YWx1ZTpCaXRtYXBEYXRhKVxuXHR7XG5cdFx0dGhpcy5fdGVzdFNpemUodmFsdWUpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUNvbnRlbnQoKTtcblx0XHR0aGlzLl9wU2V0U2l6ZSh2YWx1ZS53aWR0aCk7XG5cdFx0dGhpcy5fYml0bWFwRGF0YXNbMF0gPSB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdGV4dHVyZSBvbiB0aGUgY3ViZSdzIGxlZnQgZmFjZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgbmVnYXRpdmVYKCk6Qml0bWFwRGF0YVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JpdG1hcERhdGFzWzFdO1xuXHR9XG5cblx0cHVibGljIHNldCBuZWdhdGl2ZVgodmFsdWU6Qml0bWFwRGF0YSlcblx0e1xuXHRcdHRoaXMuX3Rlc3RTaXplKHZhbHVlKTtcblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0dGhpcy5fcFNldFNpemUodmFsdWUud2lkdGgpO1xuXHRcdHRoaXMuX2JpdG1hcERhdGFzWzFdID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRleHR1cmUgb24gdGhlIGN1YmUncyB0b3AgZmFjZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgcG9zaXRpdmVZKCk6Qml0bWFwRGF0YVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JpdG1hcERhdGFzWzJdO1xuXHR9XG5cblx0cHVibGljIHNldCBwb3NpdGl2ZVkodmFsdWU6Qml0bWFwRGF0YSlcblx0e1xuXHRcdHRoaXMuX3Rlc3RTaXplKHZhbHVlKTtcblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0dGhpcy5fcFNldFNpemUodmFsdWUud2lkdGgpO1xuXHRcdHRoaXMuX2JpdG1hcERhdGFzWzJdID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRleHR1cmUgb24gdGhlIGN1YmUncyBib3R0b20gZmFjZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgbmVnYXRpdmVZKCk6Qml0bWFwRGF0YVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JpdG1hcERhdGFzWzNdO1xuXHR9XG5cblx0cHVibGljIHNldCBuZWdhdGl2ZVkodmFsdWU6Qml0bWFwRGF0YSlcblx0e1xuXHRcdHRoaXMuX3Rlc3RTaXplKHZhbHVlKTtcblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0dGhpcy5fcFNldFNpemUodmFsdWUud2lkdGgpO1xuXHRcdHRoaXMuX2JpdG1hcERhdGFzWzNdID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRleHR1cmUgb24gdGhlIGN1YmUncyBmYXIgZmFjZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgcG9zaXRpdmVaKCk6Qml0bWFwRGF0YVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JpdG1hcERhdGFzWzRdO1xuXHR9XG5cblx0cHVibGljIHNldCBwb3NpdGl2ZVoodmFsdWU6Qml0bWFwRGF0YSlcblx0e1xuXHRcdHRoaXMuX3Rlc3RTaXplKHZhbHVlKTtcblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0dGhpcy5fcFNldFNpemUodmFsdWUud2lkdGgpO1xuXHRcdHRoaXMuX2JpdG1hcERhdGFzWzRdID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRleHR1cmUgb24gdGhlIGN1YmUncyBuZWFyIGZhY2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG5lZ2F0aXZlWigpOkJpdG1hcERhdGFcblx0e1xuXHRcdHJldHVybiB0aGlzLl9iaXRtYXBEYXRhc1s1XTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbmVnYXRpdmVaKHZhbHVlOkJpdG1hcERhdGEpXG5cdHtcblx0XHR0aGlzLl90ZXN0U2l6ZSh2YWx1ZSk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdHRoaXMuX3BTZXRTaXplKHZhbHVlLndpZHRoKTtcblx0XHR0aGlzLl9iaXRtYXBEYXRhc1s1XSA9IHZhbHVlO1xuXHR9XG5cblx0Y29uc3RydWN0b3IocG9zWDpCaXRtYXBEYXRhLCBuZWdYOkJpdG1hcERhdGEsIHBvc1k6Qml0bWFwRGF0YSwgbmVnWTpCaXRtYXBEYXRhLCBwb3NaOkJpdG1hcERhdGEsIG5lZ1o6Qml0bWFwRGF0YSwgZ2VuZXJhdGVNaXBtYXBzOmJvb2xlYW4gPSBmYWxzZSlcblx0e1xuXHRcdHN1cGVyKGdlbmVyYXRlTWlwbWFwcyk7XG5cblx0XHR0aGlzLl90ZXN0U2l6ZSh0aGlzLl9iaXRtYXBEYXRhc1swXSA9IHBvc1gpO1xuXHRcdHRoaXMuX3Rlc3RTaXplKHRoaXMuX2JpdG1hcERhdGFzWzFdID0gbmVnWCk7XG5cdFx0dGhpcy5fdGVzdFNpemUodGhpcy5fYml0bWFwRGF0YXNbMl0gPSBwb3NZKTtcblx0XHR0aGlzLl90ZXN0U2l6ZSh0aGlzLl9iaXRtYXBEYXRhc1szXSA9IG5lZ1kpO1xuXHRcdHRoaXMuX3Rlc3RTaXplKHRoaXMuX2JpdG1hcERhdGFzWzRdID0gcG9zWik7XG5cdFx0dGhpcy5fdGVzdFNpemUodGhpcy5fYml0bWFwRGF0YXNbNV0gPSBuZWdaKTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZUNvbnRlbnQoKTtcblxuXHRcdHRoaXMuX3BTZXRTaXplKHBvc1gud2lkdGgpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSB2YWx1ZVxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHJpdmF0ZSBfdGVzdFNpemUodmFsdWU6Qml0bWFwRGF0YSlcblx0e1xuXHRcdGlmICh2YWx1ZS53aWR0aCAhPSB2YWx1ZS5oZWlnaHQpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJCaXRtYXBEYXRhIHNob3VsZCBoYXZlIGVxdWFsIHdpZHRoIGFuZCBoZWlnaHQhXCIpO1xuXHRcdGlmICghVGV4dHVyZVV0aWxzLmlzQml0bWFwRGF0YVZhbGlkKHZhbHVlKSlcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYml0bWFwRGF0YTogV2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIHBvd2VyIG9mIDIgYW5kIGNhbm5vdCBleGNlZWQgMjA0OFwiKTtcblx0fVxuXG5cdHB1YmxpYyBkaXNwb3NlKClcblx0e1xuXHRcdHN1cGVyLmRpc3Bvc2UoKTtcblxuXHRcdHZhciBsZW46bnVtYmVyID0gdGhpcy5fYml0bWFwRGF0YXMubGVuZ3RoXG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdHRoaXMuX2JpdG1hcERhdGFzW2ldLmRpc3Bvc2UoKTtcblx0XHRcdHRoaXMuX2JpdG1hcERhdGFzW2ldID0gbnVsbDtcblx0XHR9XG5cblx0XHR0aGlzLl9iaXRtYXBEYXRhcyA9IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgX2lHZXRUZXh0dXJlRGF0YShzaWRlOm51bWJlcik6Qml0bWFwRGF0YVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JpdG1hcERhdGFzW3NpZGVdO1xuXHR9XG59XG5cbmV4cG9ydCA9IEJpdG1hcEN1YmVUZXh0dXJlOyJdfQ== \ No newline at end of file diff --git a/lib/textures/BitmapCubeTexture.ts b/lib/textures/BitmapCubeTexture.ts new file mode 100755 index 00000000..18504753 --- /dev/null +++ b/lib/textures/BitmapCubeTexture.ts @@ -0,0 +1,154 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import Error = require("awayjs-core/lib/errors/Error"); +import CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); +import TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +class BitmapCubeTexture extends CubeTextureBase +{ + private _bitmapDatas:Array = new Array(6); + + /** + * The texture on the cube's right face. + */ + public get positiveX():BitmapData + { + return this._bitmapDatas[0]; + } + + public set positiveX(value:BitmapData) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[0] = value; + } + + /** + * The texture on the cube's left face. + */ + public get negativeX():BitmapData + { + return this._bitmapDatas[1]; + } + + public set negativeX(value:BitmapData) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[1] = value; + } + + /** + * The texture on the cube's top face. + */ + public get positiveY():BitmapData + { + return this._bitmapDatas[2]; + } + + public set positiveY(value:BitmapData) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[2] = value; + } + + /** + * The texture on the cube's bottom face. + */ + public get negativeY():BitmapData + { + return this._bitmapDatas[3]; + } + + public set negativeY(value:BitmapData) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[3] = value; + } + + /** + * The texture on the cube's far face. + */ + public get positiveZ():BitmapData + { + return this._bitmapDatas[4]; + } + + public set positiveZ(value:BitmapData) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[4] = value; + } + + /** + * The texture on the cube's near face. + */ + public get negativeZ():BitmapData + { + return this._bitmapDatas[5]; + } + + public set negativeZ(value:BitmapData) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._bitmapDatas[5] = value; + } + + constructor(posX:BitmapData, negX:BitmapData, posY:BitmapData, negY:BitmapData, posZ:BitmapData, negZ:BitmapData, generateMipmaps:boolean = false) + { + super(generateMipmaps); + + this._testSize(this._bitmapDatas[0] = posX); + this._testSize(this._bitmapDatas[1] = negX); + this._testSize(this._bitmapDatas[2] = posY); + this._testSize(this._bitmapDatas[3] = negY); + this._testSize(this._bitmapDatas[4] = posZ); + this._testSize(this._bitmapDatas[5] = negZ); + + this.invalidateContent(); + + this._pSetSize(posX.width); + } + + /** + * + * @param value + * @private + */ + private _testSize(value:BitmapData) + { + if (value.width != value.height) + throw new Error("BitmapData should have equal width and height!"); + if (!TextureUtils.isBitmapDataValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + } + + public dispose() + { + super.dispose(); + + var len:number = this._bitmapDatas.length + for (var i:number = 0; i < len; i++) { + this._bitmapDatas[i].dispose(); + this._bitmapDatas[i] = null; + } + + this._bitmapDatas = null; + } + + public _iGetTextureData(side:number):BitmapData + { + return this._bitmapDatas[side]; + } +} + +export = BitmapCubeTexture; \ No newline at end of file diff --git a/lib/textures/BitmapTexture.js b/lib/textures/BitmapTexture.js new file mode 100755 index 00000000..b20f289b --- /dev/null +++ b/lib/textures/BitmapTexture.js @@ -0,0 +1,60 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var BitmapTexture = (function (_super) { + __extends(BitmapTexture, _super); + function BitmapTexture(bitmapData, generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + + this.bitmapData = bitmapData; + } + Object.defineProperty(BitmapTexture.prototype, "bitmapData", { + /** + * + * @returns {BitmapData} + */ + get: function () { + return this._bitmapData; + }, + set: function (value) { + if (this._bitmapData == value) + return; + + if (!TextureUtils.isBitmapDataValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + + this._bitmapData = value; + + this.invalidateContent(); + + this._pSetSize(value.width, value.height); + }, + enumerable: true, + configurable: true + }); + + + BitmapTexture.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + this._bitmapData.dispose(); + this._bitmapData = null; + }; + + BitmapTexture.prototype._iGetTextureData = function () { + return this._bitmapData; + }; + return BitmapTexture; +})(Texture2DBase); + +module.exports = BitmapTexture; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL0JpdG1hcFRleHR1cmUudHMiXSwibmFtZXMiOlsiQml0bWFwVGV4dHVyZSIsIkJpdG1hcFRleHR1cmUuY29uc3RydWN0b3IiLCJCaXRtYXBUZXh0dXJlLmRpc3Bvc2UiLCJCaXRtYXBUZXh0dXJlLl9pR2V0VGV4dHVyZURhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUMyRDtBQUMzRCxxRUFBMkU7QUFDM0UsZ0VBQXVFOztBQUV2RTtJQUE0QkEsZ0NBQWFBO0lBNEJ4Q0EsdUJBQVlBLFVBQXFCQSxFQUFFQSxlQUErQkE7UUFBL0JDLDhDQUFBQSxlQUFlQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUVqRUEsV0FBTUEsT0FBQUEsZUFBZUEsQ0FBQ0E7O1FBRXRCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxVQUFVQTtJQUM3QkEsQ0FBQ0E7SUF6QkREO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsV0FBV0E7UUFDeEJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXNCQSxLQUFnQkE7WUFFckNBLElBQUlBLElBQUlBLENBQUNBLFdBQVdBLElBQUlBLEtBQUtBO2dCQUM1QkEsTUFBT0EsQ0FBQUE7O1lBRVJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7Z0JBQ3pDQSxNQUFNQSxJQUFJQSxLQUFLQSxDQUFDQSxnRkFBZ0ZBLENBQUNBLENBQUNBOztZQUVuR0EsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsS0FBS0E7O1lBRXhCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBOztZQUV4QkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsRUFBRUEsS0FBS0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7UUFDMUNBLENBQUNBOzs7O0FBZkFBOztJQXdCREEsa0NBQUFBO1FBRUNFLGdCQUFLQSxDQUFDQSxPQUFPQSxLQUFDQSxLQUFBQSxDQUFDQTs7UUFFZkEsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7UUFDMUJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLElBQUlBO0lBQ3hCQSxDQUFDQTs7SUFFREYsMkNBQUFBO1FBRUNHLE9BQU9BLElBQUlBLENBQUNBLFdBQVdBO0lBQ3hCQSxDQUFDQTtJQUNGSCxxQkFBQ0E7QUFBREEsQ0FBQ0EsRUEvQzJCLGFBQWEsRUErQ3hDOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6InRleHR1cmVzL0JpdG1hcFRleHR1cmUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQml0bWFwRGF0YVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9CaXRtYXBEYXRhXCIpO1xuaW1wb3J0IEVycm9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvRXJyb3JcIik7XG5pbXBvcnQgVGV4dHVyZTJEQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9UZXh0dXJlMkRCYXNlXCIpO1xuaW1wb3J0IFRleHR1cmVVdGlsc1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL1RleHR1cmVVdGlsc1wiKTtcblxuY2xhc3MgQml0bWFwVGV4dHVyZSBleHRlbmRzIFRleHR1cmUyREJhc2Vcbntcblx0cHVibGljIF9iaXRtYXBEYXRhOkJpdG1hcERhdGE7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtCaXRtYXBEYXRhfVxuXHQgKi9cblx0cHVibGljIGdldCBiaXRtYXBEYXRhKCk6Qml0bWFwRGF0YVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2JpdG1hcERhdGE7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGJpdG1hcERhdGEodmFsdWU6Qml0bWFwRGF0YSlcblx0e1xuXHRcdGlmICh0aGlzLl9iaXRtYXBEYXRhID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0aWYgKCFUZXh0dXJlVXRpbHMuaXNCaXRtYXBEYXRhVmFsaWQodmFsdWUpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBiaXRtYXBEYXRhOiBXaWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgY2Fubm90IGV4Y2VlZCAyMDQ4XCIpO1xuXG5cdFx0dGhpcy5fYml0bWFwRGF0YSA9IHZhbHVlO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXG5cdFx0dGhpcy5fcFNldFNpemUodmFsdWUud2lkdGgsIHZhbHVlLmhlaWdodCk7XG5cdH1cblxuXHRjb25zdHJ1Y3RvcihiaXRtYXBEYXRhOkJpdG1hcERhdGEsIGdlbmVyYXRlTWlwbWFwczpib29sZWFuID0gZmFsc2UpXG5cdHtcblx0XHRzdXBlcihnZW5lcmF0ZU1pcG1hcHMpO1xuXG5cdFx0dGhpcy5iaXRtYXBEYXRhID0gYml0bWFwRGF0YTtcblx0fVxuXG5cdHB1YmxpYyBkaXNwb3NlKClcblx0e1xuXHRcdHN1cGVyLmRpc3Bvc2UoKTtcblxuXHRcdHRoaXMuX2JpdG1hcERhdGEuZGlzcG9zZSgpO1xuXHRcdHRoaXMuX2JpdG1hcERhdGEgPSBudWxsO1xuXHR9XG5cblx0cHVibGljIF9pR2V0VGV4dHVyZURhdGEoKTpCaXRtYXBEYXRhXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fYml0bWFwRGF0YTtcblx0fVxufVxuXG5leHBvcnQgPSBCaXRtYXBUZXh0dXJlOyJdfQ== \ No newline at end of file diff --git a/lib/textures/BitmapTexture.ts b/lib/textures/BitmapTexture.ts new file mode 100644 index 00000000..c2604f72 --- /dev/null +++ b/lib/textures/BitmapTexture.ts @@ -0,0 +1,55 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import Error = require("awayjs-core/lib/errors/Error"); +import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +import TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +class BitmapTexture extends Texture2DBase +{ + public _bitmapData:BitmapData; + + /** + * + * @returns {BitmapData} + */ + public get bitmapData():BitmapData + { + return this._bitmapData; + } + + public set bitmapData(value:BitmapData) + { + if (this._bitmapData == value) + return; + + if (!TextureUtils.isBitmapDataValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + + this._bitmapData = value; + + this.invalidateContent(); + + this._pSetSize(value.width, value.height); + } + + constructor(bitmapData:BitmapData, generateMipmaps:boolean = false) + { + super(generateMipmaps); + + this.bitmapData = bitmapData; + } + + public dispose() + { + super.dispose(); + + this._bitmapData.dispose(); + this._bitmapData = null; + } + + public _iGetTextureData():BitmapData + { + return this._bitmapData; + } +} + +export = BitmapTexture; \ No newline at end of file diff --git a/lib/textures/CubeTextureBase.js b/lib/textures/CubeTextureBase.js new file mode 100755 index 00000000..0e66d946 --- /dev/null +++ b/lib/textures/CubeTextureBase.js @@ -0,0 +1,78 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var MipmapGenerator = require("awayjs-core/lib/textures/MipmapGenerator"); +var TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +var CubeTextureBase = (function (_super) { + __extends(CubeTextureBase, _super); + function CubeTextureBase(generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + this._mipmapDataArray = new Array(6); + this._mipmapDataDirtyArray = new Array(6); + } + /** + * + * @param width + * @param height + * @private + */ + CubeTextureBase.prototype._pSetSize = function (size) { + if (this._pSize != size) + this.invalidateSize(); + + for (var i = 0; i < 6; i++) + this._mipmapDataDirtyArray[i] = true; + + this._pSize = size; + }; + + /** + * @inheritDoc + */ + CubeTextureBase.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + for (var i = 0; i < 6; i++) { + var mipmapData = this._mipmapDataArray[i]; + var len = mipmapData.length; + for (var j = 0; j < len; j++) + MipmapGenerator.freeMipMapHolder(mipmapData[j]); + } + }; + + /** + * + */ + CubeTextureBase.prototype.invalidateContent = function () { + _super.prototype.invalidateContent.call(this); + + for (var i = 0; i < 6; i++) + this._mipmapDataDirtyArray[i] = true; + }; + + CubeTextureBase.prototype._iGetMipmapData = function (side) { + if (this._mipmapDataDirtyArray[side]) { + this._mipmapDataDirtyArray[side] = false; + + var mipmapData = this._mipmapDataArray[side] || (this._mipmapDataArray[side] = new Array()); + MipmapGenerator.generateMipMaps(this._iGetTextureData(side), mipmapData, true); + } + + return this._mipmapDataArray[side]; + }; + + CubeTextureBase.prototype._iGetTextureData = function (side) { + throw new AbstractMethodError(); + }; + return CubeTextureBase; +})(TextureProxyBase); + +module.exports = CubeTextureBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL0N1YmVUZXh0dXJlQmFzZS50cyJdLCJuYW1lcyI6WyJDdWJlVGV4dHVyZUJhc2UiLCJDdWJlVGV4dHVyZUJhc2UuY29uc3RydWN0b3IiLCJDdWJlVGV4dHVyZUJhc2UuX3BTZXRTaXplIiwiQ3ViZVRleHR1cmVCYXNlLmRpc3Bvc2UiLCJDdWJlVGV4dHVyZUJhc2UuaW52YWxpZGF0ZUNvbnRlbnQiLCJDdWJlVGV4dHVyZUJhc2UuX2lHZXRNaXBtYXBEYXRhIiwiQ3ViZVRleHR1cmVCYXNlLl9pR2V0VGV4dHVyZURhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLCtFQUNvRjtBQUNwRix5RUFBK0U7QUFDL0UsMkVBQWlGOztBQUVqRjtJQUE4QkEsa0NBQWdCQTtJQUs3Q0EseUJBQVlBLGVBQStCQTtRQUEvQkMsOENBQUFBLGVBQWVBLEdBQVdBLEtBQUtBO0FBQUFBLFFBRTFDQSxXQUFNQSxPQUFBQSxlQUFlQSxDQUFDQTtRQUx2QkEsS0FBT0EsZ0JBQWdCQSxHQUE0QkEsSUFBSUEsS0FBS0EsQ0FBb0JBLENBQUNBLENBQUNBLENBQUNBO1FBQ25GQSxLQUFPQSxxQkFBcUJBLEdBQWtCQSxJQUFJQSxLQUFLQSxDQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUtwRUEsQ0FBQ0E7SUFRREQ7Ozs7O01BREdBOzBDQUNIQSxVQUFpQkEsSUFBV0E7UUFFM0JFLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLElBQUlBLElBQUlBO1lBQ3RCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFdkJBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBO1lBQ2hDQSxJQUFJQSxDQUFDQSxxQkFBcUJBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBOztRQUV0Q0EsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUE7SUFDbkJBLENBQUNBOztJQUtERjs7TUFER0E7d0NBQ0hBO1FBRUNHLGdCQUFLQSxDQUFDQSxPQUFPQSxLQUFDQSxLQUFBQSxDQUFDQTs7UUFFZkEsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBRUE7WUFDbENBLElBQUlBLFVBQVVBLEdBQXFCQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLENBQUNBLENBQUNBO1lBQzNEQSxJQUFJQSxHQUFHQSxHQUFVQSxVQUFVQSxDQUFDQSxNQUFNQTtZQUNsQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsQ0FBQ0EsRUFBRUE7Z0JBQ2xDQSxlQUFlQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQ2pEQTtJQUNGQSxDQUFDQTs7SUFLREg7O01BREdBO2tEQUNIQTtRQUVDSSxnQkFBS0EsQ0FBQ0EsaUJBQWlCQSxLQUFDQSxLQUFBQSxDQUFDQTs7UUFFekJBLEtBQUtBLElBQUlBLENBQUNBLEdBQVVBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBO1lBQ2hDQSxJQUFJQSxDQUFDQSxxQkFBcUJBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0lBQ3ZDQSxDQUFDQTs7SUFFREosNENBQUFBLFVBQXVCQSxJQUFXQTtRQUVqQ0ssSUFBSUEsSUFBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUNyQ0EsSUFBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxLQUFLQTs7WUFFeENBLElBQUlBLFVBQVVBLEdBQXFCQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsS0FBS0EsQ0FBYUEsQ0FBQ0EsQ0FBQ0E7WUFDekhBLGVBQWVBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsVUFBVUEsRUFBRUEsSUFBSUEsQ0FBQ0E7U0FDOUVBOztRQUVEQSxPQUFPQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBO0lBQ25DQSxDQUFDQTs7SUFFREwsNkNBQUFBLFVBQXdCQSxJQUFXQTtRQUVsQ00sTUFBTUEsSUFBSUEsbUJBQW1CQSxDQUFDQSxDQUFDQTtJQUNoQ0EsQ0FBQ0E7SUFDRk4sdUJBQUNBO0FBQURBLENBQUNBLEVBckU2QixnQkFBZ0IsRUFxRTdDOztBQUVELGdDQUF5QixDQUFBIiwiZmlsZSI6InRleHR1cmVzL0N1YmVUZXh0dXJlQmFzZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRtYXBEYXRhXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0JpdG1hcERhdGFcIik7XG5pbXBvcnQgQWJzdHJhY3RNZXRob2RFcnJvclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Fic3RyYWN0TWV0aG9kRXJyb3JcIik7XG5pbXBvcnQgTWlwbWFwR2VuZXJhdG9yXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL01pcG1hcEdlbmVyYXRvclwiKTtcbmltcG9ydCBUZXh0dXJlUHJveHlCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL1RleHR1cmVQcm94eUJhc2VcIik7XG5cbmNsYXNzIEN1YmVUZXh0dXJlQmFzZSBleHRlbmRzIFRleHR1cmVQcm94eUJhc2Vcbntcblx0cHVibGljIF9taXBtYXBEYXRhQXJyYXk6QXJyYXk8QXJyYXk8Qml0bWFwRGF0YT4+ID0gbmV3IEFycmF5PEFycmF5PEJpdG1hcERhdGE+Pig2KTtcblx0cHVibGljIF9taXBtYXBEYXRhRGlydHlBcnJheTpBcnJheTxib29sZWFuPiA9IG5ldyBBcnJheTxib29sZWFuPig2KTtcblxuXHRjb25zdHJ1Y3RvcihnZW5lcmF0ZU1pcG1hcHM6Ym9vbGVhbiA9IGZhbHNlKVxuXHR7XG5cdFx0c3VwZXIoZ2VuZXJhdGVNaXBtYXBzKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gd2lkdGhcblx0ICogQHBhcmFtIGhlaWdodFxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0cHVibGljIF9wU2V0U2l6ZShzaXplOm51bWJlcilcblx0e1xuXHRcdGlmICh0aGlzLl9wU2l6ZSAhPSBzaXplKVxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlU2l6ZSgpO1xuXG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgNjsgaSsrKVxuXHRcdFx0dGhpcy5fbWlwbWFwRGF0YURpcnR5QXJyYXlbaV0gPSB0cnVlO1xuXG5cdFx0dGhpcy5fcFNpemUgPSBzaXplO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHRzdXBlci5kaXNwb3NlKCk7XG5cblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCA2OyBpKyspIHtcblx0XHRcdHZhciBtaXBtYXBEYXRhOkFycmF5PEJpdG1hcERhdGE+ID0gdGhpcy5fbWlwbWFwRGF0YUFycmF5W2ldO1xuXHRcdFx0dmFyIGxlbjpudW1iZXIgPSBtaXBtYXBEYXRhLmxlbmd0aDtcblx0XHRcdGZvciAodmFyIGo6bnVtYmVyID0gMDsgaiA8IGxlbjsgaisrKVxuXHRcdFx0XHRNaXBtYXBHZW5lcmF0b3IuZnJlZU1pcE1hcEhvbGRlcihtaXBtYXBEYXRhW2pdKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICovXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ29udGVudCgpOnZvaWRcblx0e1xuXHRcdHN1cGVyLmludmFsaWRhdGVDb250ZW50KCk7XG5cblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCA2OyBpKyspXG5cdFx0XHR0aGlzLl9taXBtYXBEYXRhRGlydHlBcnJheVtpXSA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgX2lHZXRNaXBtYXBEYXRhKHNpZGU6bnVtYmVyKTpBcnJheTxCaXRtYXBEYXRhPlxuXHR7XG5cdFx0aWYgKHRoaXMuX21pcG1hcERhdGFEaXJ0eUFycmF5W3NpZGVdKSB7XG5cdFx0XHR0aGlzLl9taXBtYXBEYXRhRGlydHlBcnJheVtzaWRlXSA9IGZhbHNlO1xuXG5cdFx0XHR2YXIgbWlwbWFwRGF0YTpBcnJheTxCaXRtYXBEYXRhPiA9IHRoaXMuX21pcG1hcERhdGFBcnJheVtzaWRlXSB8fCAodGhpcy5fbWlwbWFwRGF0YUFycmF5W3NpZGVdID0gbmV3IEFycmF5PEJpdG1hcERhdGE+KCkpO1xuXHRcdFx0TWlwbWFwR2VuZXJhdG9yLmdlbmVyYXRlTWlwTWFwcyh0aGlzLl9pR2V0VGV4dHVyZURhdGEoc2lkZSksIG1pcG1hcERhdGEsIHRydWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9taXBtYXBEYXRhQXJyYXlbc2lkZV07XG5cdH1cblxuXHRwdWJsaWMgX2lHZXRUZXh0dXJlRGF0YShzaWRlOm51bWJlcik6YW55XG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcigpO1xuXHR9XG59XG5cbmV4cG9ydCA9IEN1YmVUZXh0dXJlQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/textures/CubeTextureBase.ts b/lib/textures/CubeTextureBase.ts new file mode 100644 index 00000000..745fff12 --- /dev/null +++ b/lib/textures/CubeTextureBase.ts @@ -0,0 +1,77 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import MipmapGenerator = require("awayjs-core/lib/textures/MipmapGenerator"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +class CubeTextureBase extends TextureProxyBase +{ + public _mipmapDataArray:Array> = new Array>(6); + public _mipmapDataDirtyArray:Array = new Array(6); + + constructor(generateMipmaps:boolean = false) + { + super(generateMipmaps); + } + + /** + * + * @param width + * @param height + * @private + */ + public _pSetSize(size:number) + { + if (this._pSize != size) + this.invalidateSize(); + + for (var i:number = 0; i < 6; i++) + this._mipmapDataDirtyArray[i] = true; + + this._pSize = size; + } + + /** + * @inheritDoc + */ + public dispose() + { + super.dispose(); + + for (var i:number = 0; i < 6; i++) { + var mipmapData:Array = this._mipmapDataArray[i]; + var len:number = mipmapData.length; + for (var j:number = 0; j < len; j++) + MipmapGenerator.freeMipMapHolder(mipmapData[j]); + } + } + + /** + * + */ + public invalidateContent():void + { + super.invalidateContent(); + + for (var i:number = 0; i < 6; i++) + this._mipmapDataDirtyArray[i] = true; + } + + public _iGetMipmapData(side:number):Array + { + if (this._mipmapDataDirtyArray[side]) { + this._mipmapDataDirtyArray[side] = false; + + var mipmapData:Array = this._mipmapDataArray[side] || (this._mipmapDataArray[side] = new Array()); + MipmapGenerator.generateMipMaps(this._iGetTextureData(side), mipmapData, true); + } + + return this._mipmapDataArray[side]; + } + + public _iGetTextureData(side:number):any + { + throw new AbstractMethodError(); + } +} + +export = CubeTextureBase; \ No newline at end of file diff --git a/lib/textures/ImageCubeTexture.js b/lib/textures/ImageCubeTexture.js new file mode 100755 index 00000000..2c7e9c54 --- /dev/null +++ b/lib/textures/ImageCubeTexture.js @@ -0,0 +1,152 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var ImageCubeTexture = (function (_super) { + __extends(ImageCubeTexture, _super); + function ImageCubeTexture(posX, negX, posY, negY, posZ, negZ, generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + this._htmlImageElements = new Array(6); + + this._testSize(this._htmlImageElements[0] = posX); + this._testSize(this._htmlImageElements[1] = negX); + this._testSize(this._htmlImageElements[2] = posY); + this._testSize(this._htmlImageElements[3] = negY); + this._testSize(this._htmlImageElements[4] = posZ); + this._testSize(this._htmlImageElements[5] = negZ); + + this.invalidateContent(); + + this._pSetSize(posX.width); + } + Object.defineProperty(ImageCubeTexture.prototype, "positiveX", { + /** + * The texture on the cube's right face. + */ + get: function () { + return this._htmlImageElements[0]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[0] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "negativeX", { + /** + * The texture on the cube's left face. + */ + get: function () { + return this._htmlImageElements[1]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[1] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "positiveY", { + /** + * The texture on the cube's top face. + */ + get: function () { + return this._htmlImageElements[2]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[2] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "negativeY", { + /** + * The texture on the cube's bottom face. + */ + get: function () { + return this._htmlImageElements[3]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[3] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "positiveZ", { + /** + * The texture on the cube's far face. + */ + get: function () { + return this._htmlImageElements[4]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[4] = value; + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(ImageCubeTexture.prototype, "negativeZ", { + /** + * The texture on the cube's near face. + */ + get: function () { + return this._htmlImageElements[5]; + }, + set: function (value) { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[5] = value; + }, + enumerable: true, + configurable: true + }); + + + ImageCubeTexture.prototype._testSize = function (value) { + if (value.width != value.height) + throw new Error("BitmapData should have equal width and height!"); + if (!TextureUtils.isHTMLImageElementValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + }; + + ImageCubeTexture.prototype._iGetTextureData = function (side) { + return this._htmlImageElements[side]; + }; + return ImageCubeTexture; +})(CubeTextureBase); + +module.exports = ImageCubeTexture; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL0ltYWdlQ3ViZVRleHR1cmUudHMiXSwibmFtZXMiOlsiSW1hZ2VDdWJlVGV4dHVyZSIsIkltYWdlQ3ViZVRleHR1cmUuY29uc3RydWN0b3IiLCJJbWFnZUN1YmVUZXh0dXJlLl90ZXN0U2l6ZSIsIkltYWdlQ3ViZVRleHR1cmUuX2lHZXRUZXh0dXJlRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQTJEO0FBQzNELHlFQUErRTtBQUMvRSxnRUFBdUU7O0FBRXZFO0lBQStCQSxtQ0FBZUE7SUFvRzdDQSwwQkFBWUEsSUFBcUJBLEVBQUVBLElBQXFCQSxFQUFFQSxJQUFxQkEsRUFBRUEsSUFBcUJBLEVBQUVBLElBQXFCQSxFQUFFQSxJQUFxQkEsRUFBRUEsZUFBK0JBO1FBQS9CQyw4Q0FBQUEsZUFBZUEsR0FBV0EsS0FBS0E7QUFBQUEsUUFFcExBLFdBQU1BLE9BQUFBLGVBQWVBLENBQUNBO1FBcEd2QkEsS0FBUUEsa0JBQWtCQSxHQUEyQkEsSUFBSUEsS0FBS0EsQ0FBbUJBLENBQUNBLENBQUNBLENBQUNBOztRQXNHbkZBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDakRBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDakRBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDakRBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7UUFDakRBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0Es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QTtZQUMzQkEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxLQUFLQTtRQUNuQ0EsQ0FBQ0E7Ozs7QUFSQUE7O0lBYURBO1FBQUFBOztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLENBQUNBLENBQUNBO1FBQ2xDQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFxQkEsS0FBc0JBO1lBRTFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUNyQkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtZQUN4QkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7WUFDM0JBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0E7UUFDbkNBLENBQUNBOzs7O0FBUkFBOztJQTBCREEsdUNBQUFBLFVBQWtCQSxLQUFzQkE7UUFFdkNFLElBQUlBLEtBQUtBLENBQUNBLEtBQUtBLElBQUlBLEtBQUtBLENBQUNBLE1BQU1BO1lBQzlCQSxNQUFNQSxJQUFJQSxLQUFLQSxDQUFDQSxnREFBZ0RBLENBQUNBLENBQUNBO1FBQ25FQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSx1QkFBdUJBLENBQUNBLEtBQUtBLENBQUNBO1lBQy9DQSxNQUFNQSxJQUFJQSxLQUFLQSxDQUFDQSxnRkFBZ0ZBLENBQUNBLENBQUNBO0lBQ3BHQSxDQUFDQTs7SUFFREYsOENBQUFBLFVBQXdCQSxJQUFXQTtRQUVsQ0csT0FBT0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQTtJQUNyQ0EsQ0FBQ0E7SUFDRkgsd0JBQUNBO0FBQURBLENBQUNBLEVBaEk4QixlQUFlLEVBZ0k3Qzs7QUFFRCxpQ0FBMEIsQ0FBQSIsImZpbGUiOiJ0ZXh0dXJlcy9JbWFnZUN1YmVUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVycm9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvRXJyb3JcIik7XG5pbXBvcnQgQ3ViZVRleHR1cmVCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL0N1YmVUZXh0dXJlQmFzZVwiKTtcbmltcG9ydCBUZXh0dXJlVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi91dGlscy9UZXh0dXJlVXRpbHNcIik7XG5cbmNsYXNzIEltYWdlQ3ViZVRleHR1cmUgZXh0ZW5kcyBDdWJlVGV4dHVyZUJhc2Vcbntcblx0cHJpdmF0ZSBfaHRtbEltYWdlRWxlbWVudHM6QXJyYXk8SFRNTEltYWdlRWxlbWVudD4gPSBuZXcgQXJyYXk8SFRNTEltYWdlRWxlbWVudD4oNik7XG5cblx0LyoqXG5cdCAqIFRoZSB0ZXh0dXJlIG9uIHRoZSBjdWJlJ3MgcmlnaHQgZmFjZS5cblx0ICovXG5cdHB1YmxpYyBnZXQgcG9zaXRpdmVYKCk6SFRNTEltYWdlRWxlbWVudFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2h0bWxJbWFnZUVsZW1lbnRzWzBdO1xuXHR9XG5cblx0cHVibGljIHNldCBwb3NpdGl2ZVgodmFsdWU6SFRNTEltYWdlRWxlbWVudClcblx0e1xuXHRcdHRoaXMuX3Rlc3RTaXplKHZhbHVlKTtcblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0dGhpcy5fcFNldFNpemUodmFsdWUud2lkdGgpO1xuXHRcdHRoaXMuX2h0bWxJbWFnZUVsZW1lbnRzWzBdID0gdmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHRleHR1cmUgb24gdGhlIGN1YmUncyBsZWZ0IGZhY2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG5lZ2F0aXZlWCgpOkhUTUxJbWFnZUVsZW1lbnRcblx0e1xuXHRcdHJldHVybiB0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1sxXTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbmVnYXRpdmVYKHZhbHVlOkhUTUxJbWFnZUVsZW1lbnQpXG5cdHtcblx0XHR0aGlzLl90ZXN0U2l6ZSh2YWx1ZSk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdHRoaXMuX3BTZXRTaXplKHZhbHVlLndpZHRoKTtcblx0XHR0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1sxXSA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZXh0dXJlIG9uIHRoZSBjdWJlJ3MgdG9wIGZhY2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHBvc2l0aXZlWSgpOkhUTUxJbWFnZUVsZW1lbnRcblx0e1xuXHRcdHJldHVybiB0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1syXTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcG9zaXRpdmVZKHZhbHVlOkhUTUxJbWFnZUVsZW1lbnQpXG5cdHtcblx0XHR0aGlzLl90ZXN0U2l6ZSh2YWx1ZSk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdHRoaXMuX3BTZXRTaXplKHZhbHVlLndpZHRoKTtcblx0XHR0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1syXSA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZXh0dXJlIG9uIHRoZSBjdWJlJ3MgYm90dG9tIGZhY2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IG5lZ2F0aXZlWSgpOkhUTUxJbWFnZUVsZW1lbnRcblx0e1xuXHRcdHJldHVybiB0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1szXTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgbmVnYXRpdmVZKHZhbHVlOkhUTUxJbWFnZUVsZW1lbnQpXG5cdHtcblx0XHR0aGlzLl90ZXN0U2l6ZSh2YWx1ZSk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdHRoaXMuX3BTZXRTaXplKHZhbHVlLndpZHRoKTtcblx0XHR0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1szXSA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZXh0dXJlIG9uIHRoZSBjdWJlJ3MgZmFyIGZhY2UuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IHBvc2l0aXZlWigpOkhUTUxJbWFnZUVsZW1lbnRcblx0e1xuXHRcdHJldHVybiB0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1s0XTtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcG9zaXRpdmVaKHZhbHVlOkhUTUxJbWFnZUVsZW1lbnQpXG5cdHtcblx0XHR0aGlzLl90ZXN0U2l6ZSh2YWx1ZSk7XG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdHRoaXMuX3BTZXRTaXplKHZhbHVlLndpZHRoKTtcblx0XHR0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1s0XSA9IHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZXh0dXJlIG9uIHRoZSBjdWJlJ3MgbmVhciBmYWNlLlxuXHQgKi9cblx0cHVibGljIGdldCBuZWdhdGl2ZVooKTpIVE1MSW1hZ2VFbGVtZW50XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faHRtbEltYWdlRWxlbWVudHNbNV07XG5cdH1cblxuXHRwdWJsaWMgc2V0IG5lZ2F0aXZlWih2YWx1ZTpIVE1MSW1hZ2VFbGVtZW50KVxuXHR7XG5cdFx0dGhpcy5fdGVzdFNpemUodmFsdWUpO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUNvbnRlbnQoKTtcblx0XHR0aGlzLl9wU2V0U2l6ZSh2YWx1ZS53aWR0aCk7XG5cdFx0dGhpcy5faHRtbEltYWdlRWxlbWVudHNbNV0gPSB2YWx1ZTtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKHBvc1g6SFRNTEltYWdlRWxlbWVudCwgbmVnWDpIVE1MSW1hZ2VFbGVtZW50LCBwb3NZOkhUTUxJbWFnZUVsZW1lbnQsIG5lZ1k6SFRNTEltYWdlRWxlbWVudCwgcG9zWjpIVE1MSW1hZ2VFbGVtZW50LCBuZWdaOkhUTUxJbWFnZUVsZW1lbnQsIGdlbmVyYXRlTWlwbWFwczpib29sZWFuID0gZmFsc2UpXG5cdHtcblx0XHRzdXBlcihnZW5lcmF0ZU1pcG1hcHMpO1xuXG5cdFx0dGhpcy5fdGVzdFNpemUodGhpcy5faHRtbEltYWdlRWxlbWVudHNbMF0gPSBwb3NYKTtcblx0XHR0aGlzLl90ZXN0U2l6ZSh0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1sxXSA9IG5lZ1gpO1xuXHRcdHRoaXMuX3Rlc3RTaXplKHRoaXMuX2h0bWxJbWFnZUVsZW1lbnRzWzJdID0gcG9zWSk7XG5cdFx0dGhpcy5fdGVzdFNpemUodGhpcy5faHRtbEltYWdlRWxlbWVudHNbM10gPSBuZWdZKTtcblx0XHR0aGlzLl90ZXN0U2l6ZSh0aGlzLl9odG1sSW1hZ2VFbGVtZW50c1s0XSA9IHBvc1opO1xuXHRcdHRoaXMuX3Rlc3RTaXplKHRoaXMuX2h0bWxJbWFnZUVsZW1lbnRzWzVdID0gbmVnWik7XG5cblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50KCk7XG5cblx0XHR0aGlzLl9wU2V0U2l6ZShwb3NYLndpZHRoKTtcblx0fVxuXG5cdHByaXZhdGUgX3Rlc3RTaXplKHZhbHVlOkhUTUxJbWFnZUVsZW1lbnQpXG5cdHtcblx0XHRpZiAodmFsdWUud2lkdGggIT0gdmFsdWUuaGVpZ2h0KVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiQml0bWFwRGF0YSBzaG91bGQgaGF2ZSBlcXVhbCB3aWR0aCBhbmQgaGVpZ2h0IVwiKTtcblx0XHRpZiAoIVRleHR1cmVVdGlscy5pc0hUTUxJbWFnZUVsZW1lbnRWYWxpZCh2YWx1ZSkpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJpdG1hcERhdGE6IFdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBwb3dlciBvZiAyIGFuZCBjYW5ub3QgZXhjZWVkIDIwNDhcIik7XG5cdH1cblxuXHRwdWJsaWMgX2lHZXRUZXh0dXJlRGF0YShzaWRlOm51bWJlcik6SFRNTEltYWdlRWxlbWVudFxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2h0bWxJbWFnZUVsZW1lbnRzW3NpZGVdO1xuXHR9XG59XG5cbmV4cG9ydCA9IEltYWdlQ3ViZVRleHR1cmU7Il19 \ No newline at end of file diff --git a/lib/textures/ImageCubeTexture.ts b/lib/textures/ImageCubeTexture.ts new file mode 100755 index 00000000..c69baa71 --- /dev/null +++ b/lib/textures/ImageCubeTexture.ts @@ -0,0 +1,135 @@ +import Error = require("awayjs-core/lib/errors/Error"); +import CubeTextureBase = require("awayjs-core/lib/textures/CubeTextureBase"); +import TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +class ImageCubeTexture extends CubeTextureBase +{ + private _htmlImageElements:Array = new Array(6); + + /** + * The texture on the cube's right face. + */ + public get positiveX():HTMLImageElement + { + return this._htmlImageElements[0]; + } + + public set positiveX(value:HTMLImageElement) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[0] = value; + } + + /** + * The texture on the cube's left face. + */ + public get negativeX():HTMLImageElement + { + return this._htmlImageElements[1]; + } + + public set negativeX(value:HTMLImageElement) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[1] = value; + } + + /** + * The texture on the cube's top face. + */ + public get positiveY():HTMLImageElement + { + return this._htmlImageElements[2]; + } + + public set positiveY(value:HTMLImageElement) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[2] = value; + } + + /** + * The texture on the cube's bottom face. + */ + public get negativeY():HTMLImageElement + { + return this._htmlImageElements[3]; + } + + public set negativeY(value:HTMLImageElement) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[3] = value; + } + + /** + * The texture on the cube's far face. + */ + public get positiveZ():HTMLImageElement + { + return this._htmlImageElements[4]; + } + + public set positiveZ(value:HTMLImageElement) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[4] = value; + } + + /** + * The texture on the cube's near face. + */ + public get negativeZ():HTMLImageElement + { + return this._htmlImageElements[5]; + } + + public set negativeZ(value:HTMLImageElement) + { + this._testSize(value); + this.invalidateContent(); + this._pSetSize(value.width); + this._htmlImageElements[5] = value; + } + + constructor(posX:HTMLImageElement, negX:HTMLImageElement, posY:HTMLImageElement, negY:HTMLImageElement, posZ:HTMLImageElement, negZ:HTMLImageElement, generateMipmaps:boolean = false) + { + super(generateMipmaps); + + this._testSize(this._htmlImageElements[0] = posX); + this._testSize(this._htmlImageElements[1] = negX); + this._testSize(this._htmlImageElements[2] = posY); + this._testSize(this._htmlImageElements[3] = negY); + this._testSize(this._htmlImageElements[4] = posZ); + this._testSize(this._htmlImageElements[5] = negZ); + + this.invalidateContent(); + + this._pSetSize(posX.width); + } + + private _testSize(value:HTMLImageElement) + { + if (value.width != value.height) + throw new Error("BitmapData should have equal width and height!"); + if (!TextureUtils.isHTMLImageElementValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + } + + public _iGetTextureData(side:number):HTMLImageElement + { + return this._htmlImageElements[side]; + } +} + +export = ImageCubeTexture; \ No newline at end of file diff --git a/lib/textures/ImageTexture.js b/lib/textures/ImageTexture.js new file mode 100755 index 00000000..63e8f1ec --- /dev/null +++ b/lib/textures/ImageTexture.js @@ -0,0 +1,56 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var ImageTexture = (function (_super) { + __extends(ImageTexture, _super); + /** + * + * @param htmlImageElement + * @param generateMipmaps + */ + function ImageTexture(htmlImageElement, generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + + this.htmlImageElement = htmlImageElement; + } + Object.defineProperty(ImageTexture.prototype, "htmlImageElement", { + /** + * + */ + get: function () { + return this._htmlImageElement; + }, + set: function (value) { + if (this._htmlImageElement == value) + return; + + if (!TextureUtils.isHTMLImageElementValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + + this._htmlImageElement = value; + + this.invalidateContent(); + this._pSetSize(value.width, value.height); + }, + enumerable: true, + configurable: true + }); + + + ImageTexture.prototype._iGetTextureData = function () { + return this._htmlImageElement; + }; + return ImageTexture; +})(Texture2DBase); + +module.exports = ImageTexture; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL0ltYWdlVGV4dHVyZS50cyJdLCJuYW1lcyI6WyJJbWFnZVRleHR1cmUiLCJJbWFnZVRleHR1cmUuY29uc3RydWN0b3IiLCJJbWFnZVRleHR1cmUuX2lHZXRUZXh0dXJlRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsbURBQTJEO0FBQzNELHFFQUEyRTtBQUMzRSxnRUFBdUU7O0FBRXZFO0lBQTJCQSwrQkFBYUE7SUFTdkNBOzs7O01BREdBO0lBQ0hBLHNCQUFZQSxnQkFBaUNBLEVBQUVBLGVBQStCQTtRQUEvQkMsOENBQUFBLGVBQWVBLEdBQVdBLEtBQUtBO0FBQUFBLFFBRTdFQSxXQUFNQSxPQUFBQSxlQUFlQSxDQUFDQTs7UUFFdEJBLElBQUlBLENBQUNBLGdCQUFnQkEsR0FBR0EsZ0JBQWdCQTtJQUN6Q0EsQ0FBQ0E7SUFLREQ7UUFBQUE7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLGlCQUFpQkE7UUFDOUJBLENBQUNBO1FBRURBLEtBQUFBLFVBQTRCQSxLQUFzQkE7WUFFakRBLElBQUlBLElBQUlBLENBQUNBLGlCQUFpQkEsSUFBSUEsS0FBS0E7Z0JBQ2xDQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsdUJBQXVCQSxDQUFDQSxLQUFLQSxDQUFDQTtnQkFDL0NBLE1BQU1BLElBQUlBLEtBQUtBLENBQUNBLGdGQUFnRkEsQ0FBQ0EsQ0FBQ0E7O1lBRW5HQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLEtBQUtBOztZQUU5QkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtZQUN4QkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsRUFBRUEsS0FBS0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7UUFDMUNBLENBQUNBOzs7O0FBZEFBOztJQWdCREEsMENBQUFBO1FBRUNFLE9BQU9BLElBQUlBLENBQUNBLGlCQUFpQkE7SUFDOUJBLENBQUNBO0lBQ0ZGLG9CQUFDQTtBQUFEQSxDQUFDQSxFQTFDMEIsYUFBYSxFQTBDdkM7O0FBRUQsNkJBQXNCLENBQUEiLCJmaWxlIjoidGV4dHVyZXMvSW1hZ2VUZXh0dXJlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEVycm9yXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvRXJyb3JcIik7XG5pbXBvcnQgVGV4dHVyZTJEQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9UZXh0dXJlMkRCYXNlXCIpO1xuaW1wb3J0IFRleHR1cmVVdGlsc1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL1RleHR1cmVVdGlsc1wiKTtcblxuY2xhc3MgSW1hZ2VUZXh0dXJlIGV4dGVuZHMgVGV4dHVyZTJEQmFzZVxue1xuXHRwcml2YXRlIF9odG1sSW1hZ2VFbGVtZW50OkhUTUxJbWFnZUVsZW1lbnQ7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBodG1sSW1hZ2VFbGVtZW50XG5cdCAqIEBwYXJhbSBnZW5lcmF0ZU1pcG1hcHNcblx0ICovXG5cdGNvbnN0cnVjdG9yKGh0bWxJbWFnZUVsZW1lbnQ6SFRNTEltYWdlRWxlbWVudCwgZ2VuZXJhdGVNaXBtYXBzOmJvb2xlYW4gPSBmYWxzZSlcblx0e1xuXHRcdHN1cGVyKGdlbmVyYXRlTWlwbWFwcyk7XG5cblx0XHR0aGlzLmh0bWxJbWFnZUVsZW1lbnQgPSBodG1sSW1hZ2VFbGVtZW50O1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGh0bWxJbWFnZUVsZW1lbnQoKTpIVE1MSW1hZ2VFbGVtZW50XG5cdHtcblx0XHRyZXR1cm4gdGhpcy5faHRtbEltYWdlRWxlbWVudDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgaHRtbEltYWdlRWxlbWVudCh2YWx1ZTpIVE1MSW1hZ2VFbGVtZW50KVxuXHR7XG5cdFx0aWYgKHRoaXMuX2h0bWxJbWFnZUVsZW1lbnQgPT0gdmFsdWUpXG5cdFx0XHRyZXR1cm47XG5cblx0XHRpZiAoIVRleHR1cmVVdGlscy5pc0hUTUxJbWFnZUVsZW1lbnRWYWxpZCh2YWx1ZSkpXG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGJpdG1hcERhdGE6IFdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBwb3dlciBvZiAyIGFuZCBjYW5ub3QgZXhjZWVkIDIwNDhcIik7XG5cblx0XHR0aGlzLl9odG1sSW1hZ2VFbGVtZW50ID0gdmFsdWU7XG5cblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50KCk7XG5cdFx0dGhpcy5fcFNldFNpemUodmFsdWUud2lkdGgsIHZhbHVlLmhlaWdodCk7XG5cdH1cblxuXHRwdWJsaWMgX2lHZXRUZXh0dXJlRGF0YSgpOkhUTUxJbWFnZUVsZW1lbnRcblx0e1xuXHRcdHJldHVybiB0aGlzLl9odG1sSW1hZ2VFbGVtZW50O1xuXHR9XG59XG5cbmV4cG9ydCA9IEltYWdlVGV4dHVyZTsiXX0= \ No newline at end of file diff --git a/lib/textures/ImageTexture.ts b/lib/textures/ImageTexture.ts new file mode 100644 index 00000000..f3c48438 --- /dev/null +++ b/lib/textures/ImageTexture.ts @@ -0,0 +1,49 @@ +import Error = require("awayjs-core/lib/errors/Error"); +import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +import TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +class ImageTexture extends Texture2DBase +{ + private _htmlImageElement:HTMLImageElement; + + /** + * + * @param htmlImageElement + * @param generateMipmaps + */ + constructor(htmlImageElement:HTMLImageElement, generateMipmaps:boolean = false) + { + super(generateMipmaps); + + this.htmlImageElement = htmlImageElement; + } + + /** + * + */ + public get htmlImageElement():HTMLImageElement + { + return this._htmlImageElement; + } + + public set htmlImageElement(value:HTMLImageElement) + { + if (this._htmlImageElement == value) + return; + + if (!TextureUtils.isHTMLImageElementValid(value)) + throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); + + this._htmlImageElement = value; + + this.invalidateContent(); + this._pSetSize(value.width, value.height); + } + + public _iGetTextureData():HTMLImageElement + { + return this._htmlImageElement; + } +} + +export = ImageTexture; \ No newline at end of file diff --git a/lib/textures/MipmapGenerator.js b/lib/textures/MipmapGenerator.js new file mode 100755 index 00000000..53ced37e --- /dev/null +++ b/lib/textures/MipmapGenerator.js @@ -0,0 +1,86 @@ +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var Matrix = require("awayjs-core/lib/core/geom/Matrix"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +/** +* MipmapGenerator is a helper class that uploads BitmapData to a Texture including mipmap levels. +*/ +var MipmapGenerator = (function () { + function MipmapGenerator() { + } + MipmapGenerator.generateMipMaps = function (source, output, alpha) { + if (typeof alpha === "undefined") { alpha = false; } + var w = source.width; + var h = source.height; + var i = 0; + + var mipmap; + + MipmapGenerator._rect.width = w; + MipmapGenerator._rect.height = h; + + while (w >= 1 && h >= 1) { + mipmap = output[i] = MipmapGenerator._getMipmapHolder(output[i], w, h); + + if (alpha) + mipmap.fillRect(MipmapGenerator._rect, 0); + + MipmapGenerator._matrix.a = MipmapGenerator._rect.width / source.width; + MipmapGenerator._matrix.d = MipmapGenerator._rect.height / source.height; + + mipmap.draw(source, MipmapGenerator._matrix); //TODO: smoothing? + + w >>= 1; + h >>= 1; + + MipmapGenerator._rect.width = w > 1 ? w : 1; + MipmapGenerator._rect.height = h > 1 ? h : 1; + + i++; + } + }; + + MipmapGenerator._getMipmapHolder = function (mipMapHolder, newW, newH) { + if (mipMapHolder) { + if (mipMapHolder.width == newW && mipMapHolder.height == newH) + return mipMapHolder; + + MipmapGenerator.freeMipMapHolder(mipMapHolder); + } + + if (!MipmapGenerator._mipMaps[newW]) { + MipmapGenerator._mipMaps[newW] = []; + MipmapGenerator._mipMapUses[newW] = []; + } + + if (!MipmapGenerator._mipMaps[newW][newH]) { + mipMapHolder = MipmapGenerator._mipMaps[newW][newH] = new BitmapData(newW, newH, true); + MipmapGenerator._mipMapUses[newW][newH] = 1; + } else { + MipmapGenerator._mipMapUses[newW][newH] = MipmapGenerator._mipMapUses[newW][newH] + 1; + mipMapHolder = MipmapGenerator._mipMaps[newW][newH]; + } + + return mipMapHolder; + }; + + MipmapGenerator.freeMipMapHolder = function (mipMapHolder) { + var holderWidth = mipMapHolder.width; + var holderHeight = mipMapHolder.height; + + if (--MipmapGenerator._mipMapUses[holderWidth][holderHeight] == 0) { + MipmapGenerator._mipMaps[holderWidth][holderHeight].dispose(); + MipmapGenerator._mipMaps[holderWidth][holderHeight] = null; + } + }; + MipmapGenerator._mipMaps = []; + MipmapGenerator._mipMapUses = []; + + MipmapGenerator._matrix = new Matrix(); + MipmapGenerator._rect = new Rectangle(); + return MipmapGenerator; +})(); + +module.exports = MipmapGenerator; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL01pcG1hcEdlbmVyYXRvci50cyJdLCJuYW1lcyI6WyJNaXBtYXBHZW5lcmF0b3IiLCJNaXBtYXBHZW5lcmF0b3IuY29uc3RydWN0b3IiLCJNaXBtYXBHZW5lcmF0b3IuZ2VuZXJhdGVNaXBNYXBzIiwiTWlwbWFwR2VuZXJhdG9yLl9nZXRNaXBtYXBIb2xkZXIiLCJNaXBtYXBHZW5lcmF0b3IuZnJlZU1pcE1hcEhvbGRlciJdLCJtYXBwaW5ncyI6IkFBQUEsZ0VBQXVFO0FBQ3ZFLHdEQUFnRTtBQUNoRSw4REFBcUU7O0FBRXJFOztFQUVHO0FBQ0g7SUFBQUE7SUFzRkFDLENBQUNBO0FBQUFELElBcEVBQSxrQ0FBQUEsVUFBOEJBLE1BQVVBLEVBQUVBLE1BQXlCQSxFQUFFQSxLQUFxQkE7UUFBckJFLG9DQUFBQSxLQUFLQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUV6RkEsSUFBSUEsQ0FBQ0EsR0FBVUEsTUFBTUEsQ0FBQ0EsS0FBS0E7UUFDM0JBLElBQUlBLENBQUNBLEdBQVVBLE1BQU1BLENBQUNBLE1BQU1BO1FBQzVCQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQTs7UUFFaEJBLElBQUlBLE1BQU1BOztRQUVWQSxlQUFlQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxHQUFHQSxDQUFDQTtRQUMvQkEsZUFBZUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0E7O1FBRWhDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUV4QkEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsZUFBZUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTs7WUFFdEVBLElBQUlBLEtBQUtBO2dCQUNSQSxNQUFNQSxDQUFDQSxRQUFRQSxDQUFDQSxlQUFlQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTs7WUFFM0NBLGVBQWVBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBLGVBQWVBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLEdBQUNBLE1BQU1BLENBQUNBLEtBQUtBO1lBQ3BFQSxlQUFlQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxHQUFHQSxlQUFlQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFDQSxNQUFNQSxDQUFDQSxNQUFNQTs7WUFFdEVBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLEVBQUVBLGVBQWVBLENBQUNBLE9BQU9BLENBQUNBLEVBQUVBLGtCQUFrQkE7O1lBRWhFQSxDQUFDQSxLQUFLQSxDQUFDQTtZQUNQQSxDQUFDQSxLQUFLQSxDQUFDQTs7WUFFUEEsZUFBZUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDMUNBLGVBQWVBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUVBLENBQUNBLEdBQUdBLENBQUNBOztZQUUzQ0EsQ0FBQ0EsRUFBRUE7U0FDSEE7SUFDRkEsQ0FBQ0E7O0lBRURGLG1DQUFBQSxVQUFnQ0EsWUFBdUJBLEVBQUVBLElBQVdBLEVBQUVBLElBQVdBO1FBRWhGRyxJQUFJQSxZQUFZQSxDQUFFQTtZQUNqQkEsSUFBSUEsWUFBWUEsQ0FBQ0EsS0FBS0EsSUFBSUEsSUFBSUEsSUFBSUEsWUFBWUEsQ0FBQ0EsTUFBTUEsSUFBSUEsSUFBSUE7Z0JBQzVEQSxPQUFPQSxZQUFZQSxDQUFDQTs7WUFFckJBLGVBQWVBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsWUFBWUEsQ0FBQ0E7U0FDOUNBOztRQUVEQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUNwQ0EsZUFBZUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsRUFBRUE7WUFDbkNBLGVBQWVBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEVBQUVBO1NBQ3RDQTs7UUFFREEsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBRUE7WUFDMUNBLFlBQVlBLEdBQUdBLGVBQWVBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLFVBQVVBLENBQUNBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLENBQUNBO1lBQ3RGQSxlQUFlQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQTtTQUMzQ0EsS0FBTUE7WUFDTkEsZUFBZUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsZUFBZUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7WUFDckZBLFlBQVlBLEdBQUdBLGVBQWVBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLElBQUlBLENBQUNBO1NBQ25EQTs7UUFFREEsT0FBT0EsWUFBWUE7SUFDcEJBLENBQUNBOztJQUVESCxtQ0FBQUEsVUFBK0JBLFlBQXVCQTtRQUVyREksSUFBSUEsV0FBV0EsR0FBVUEsWUFBWUEsQ0FBQ0EsS0FBS0E7UUFDM0NBLElBQUlBLFlBQVlBLEdBQVVBLFlBQVlBLENBQUNBLE1BQU1BOztRQUU3Q0EsSUFBSUEsRUFBRUEsZUFBZUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBRUE7WUFDbEVBLGVBQWVBLENBQUNBLFFBQVFBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO1lBQzdEQSxlQUFlQSxDQUFDQSxRQUFRQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxZQUFZQSxDQUFDQSxHQUFHQSxJQUFJQTtTQUMxREE7SUFDRkEsQ0FBQ0E7SUFuRkRKLDJCQUEwQkEsRUFBRUE7SUFDNUJBLDhCQUE2QkEsRUFBRUE7O0lBRS9CQSwwQkFBZ0NBLElBQUlBLE1BQU1BLENBQUNBLENBQUNBO0lBQzVDQSx3QkFBaUNBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBO0lBZ0ZqREEsdUJBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQsZ0NBQXlCLENBQUEiLCJmaWxlIjoidGV4dHVyZXMvTWlwbWFwR2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpdG1hcERhdGFcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvQml0bWFwRGF0YVwiKTtcbmltcG9ydCBNYXRyaXhcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9NYXRyaXhcIik7XG5pbXBvcnQgUmVjdGFuZ2xlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1JlY3RhbmdsZVwiKTtcblxuLyoqXG4gKiBNaXBtYXBHZW5lcmF0b3IgaXMgYSBoZWxwZXIgY2xhc3MgdGhhdCB1cGxvYWRzIEJpdG1hcERhdGEgdG8gYSBUZXh0dXJlIGluY2x1ZGluZyBtaXBtYXAgbGV2ZWxzLlxuICovXG5jbGFzcyBNaXBtYXBHZW5lcmF0b3Jcbntcblx0cHJpdmF0ZSBzdGF0aWMgX21pcE1hcHMgPSBbXTtcblx0cHJpdmF0ZSBzdGF0aWMgX21pcE1hcFVzZXMgPSBbXTtcblxuXHRwcml2YXRlIHN0YXRpYyBfbWF0cml4Ok1hdHJpeCA9IG5ldyBNYXRyaXgoKTtcblx0cHJpdmF0ZSBzdGF0aWMgX3JlY3Q6UmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgpO1xuXHRwcml2YXRlIHN0YXRpYyBfc291cmNlOkJpdG1hcERhdGE7XG5cblx0LyoqXG5cdCAqIFVwbG9hZHMgYSBCaXRtYXBEYXRhIHdpdGggbWlwIG1hcHMgdG8gYSB0YXJnZXQgVGV4dHVyZSBvYmplY3QuXG5cdCAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSB0byB1cGxvYWQuXG5cdCAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCBUZXh0dXJlIHRvIHVwbG9hZCB0by5cblx0ICogQHBhcmFtIG1pcG1hcCBBbiBvcHRpb25hbCBtaXAgbWFwIGhvbGRlciB0byBhdm9pZHMgY3JlYXRpbmcgbmV3IGluc3RhbmNlcyBmb3IgZmUgYW5pbWF0ZWQgbWF0ZXJpYWxzLlxuXHQgKiBAcGFyYW0gYWxwaGEgSW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIHVwbG9hZGVkIGJpdG1hcERhdGEgaXMgdHJhbnNwYXJlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdlbmVyYXRlTWlwTWFwcyhzb3VyY2U6SFRNTEltYWdlRWxlbWVudCwgb3V0cHV0PzpBcnJheTxCaXRtYXBEYXRhPiwgYWxwaGE/OmJvb2xlYW4pO1xuXHRwdWJsaWMgc3RhdGljIGdlbmVyYXRlTWlwTWFwcyhzb3VyY2U6Qml0bWFwRGF0YSwgb3V0cHV0PzpBcnJheTxCaXRtYXBEYXRhPiwgYWxwaGE/OmJvb2xlYW4pO1xuXHRwdWJsaWMgc3RhdGljIGdlbmVyYXRlTWlwTWFwcyhzb3VyY2U6YW55LCBvdXRwdXQ/OkFycmF5PEJpdG1hcERhdGE+LCBhbHBoYTpib29sZWFuID0gZmFsc2UpXG5cdHtcblx0XHR2YXIgdzpudW1iZXIgPSBzb3VyY2Uud2lkdGg7XG5cdFx0dmFyIGg6bnVtYmVyID0gc291cmNlLmhlaWdodDtcblx0XHR2YXIgaTpudW1iZXIgPSAwO1xuXG5cdFx0dmFyIG1pcG1hcDpCaXRtYXBEYXRhO1xuXG5cdFx0TWlwbWFwR2VuZXJhdG9yLl9yZWN0LndpZHRoID0gdztcblx0XHRNaXBtYXBHZW5lcmF0b3IuX3JlY3QuaGVpZ2h0ID0gaDtcblxuXHRcdHdoaWxlICh3ID49IDEgJiYgaCA+PSAxKSB7XG5cblx0XHRcdG1pcG1hcCA9IG91dHB1dFtpXSA9IE1pcG1hcEdlbmVyYXRvci5fZ2V0TWlwbWFwSG9sZGVyKG91dHB1dFtpXSwgdywgaCk7XG5cblx0XHRcdGlmIChhbHBoYSlcblx0XHRcdFx0bWlwbWFwLmZpbGxSZWN0KE1pcG1hcEdlbmVyYXRvci5fcmVjdCwgMCk7XG5cblx0XHRcdE1pcG1hcEdlbmVyYXRvci5fbWF0cml4LmEgPSBNaXBtYXBHZW5lcmF0b3IuX3JlY3Qud2lkdGgvc291cmNlLndpZHRoO1xuXHRcdFx0TWlwbWFwR2VuZXJhdG9yLl9tYXRyaXguZCA9IE1pcG1hcEdlbmVyYXRvci5fcmVjdC5oZWlnaHQvc291cmNlLmhlaWdodDtcblxuXHRcdFx0bWlwbWFwLmRyYXcoc291cmNlLCBNaXBtYXBHZW5lcmF0b3IuX21hdHJpeCk7IC8vVE9ETzogc21vb3RoaW5nP1xuXG5cdFx0XHR3ID4+PSAxO1xuXHRcdFx0aCA+Pj0gMTtcblxuXHRcdFx0TWlwbWFwR2VuZXJhdG9yLl9yZWN0LndpZHRoID0gdyA+IDE/IHcgOiAxO1xuXHRcdFx0TWlwbWFwR2VuZXJhdG9yLl9yZWN0LmhlaWdodCA9IGggPiAxPyBoIDogMTtcblxuXHRcdFx0aSsrO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIF9nZXRNaXBtYXBIb2xkZXIobWlwTWFwSG9sZGVyOkJpdG1hcERhdGEsIG5ld1c6bnVtYmVyLCBuZXdIOm51bWJlcik6Qml0bWFwRGF0YVxuXHR7XG5cdFx0aWYgKG1pcE1hcEhvbGRlcikge1xuXHRcdFx0aWYgKG1pcE1hcEhvbGRlci53aWR0aCA9PSBuZXdXICYmIG1pcE1hcEhvbGRlci5oZWlnaHQgPT0gbmV3SClcblx0XHRcdFx0cmV0dXJuIG1pcE1hcEhvbGRlcjtcblxuXHRcdFx0TWlwbWFwR2VuZXJhdG9yLmZyZWVNaXBNYXBIb2xkZXIobWlwTWFwSG9sZGVyKTtcblx0XHR9XG5cblx0XHRpZiAoIU1pcG1hcEdlbmVyYXRvci5fbWlwTWFwc1tuZXdXXSkge1xuXHRcdFx0TWlwbWFwR2VuZXJhdG9yLl9taXBNYXBzW25ld1ddID0gW107XG5cdFx0XHRNaXBtYXBHZW5lcmF0b3IuX21pcE1hcFVzZXNbbmV3V10gPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoIU1pcG1hcEdlbmVyYXRvci5fbWlwTWFwc1tuZXdXXVtuZXdIXSkge1xuXHRcdFx0bWlwTWFwSG9sZGVyID0gTWlwbWFwR2VuZXJhdG9yLl9taXBNYXBzW25ld1ddW25ld0hdID0gbmV3IEJpdG1hcERhdGEobmV3VywgbmV3SCwgdHJ1ZSk7XG5cdFx0XHRNaXBtYXBHZW5lcmF0b3IuX21pcE1hcFVzZXNbbmV3V11bbmV3SF0gPSAxO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRNaXBtYXBHZW5lcmF0b3IuX21pcE1hcFVzZXNbbmV3V11bbmV3SF0gPSBNaXBtYXBHZW5lcmF0b3IuX21pcE1hcFVzZXNbbmV3V11bbmV3SF0gKyAxO1xuXHRcdFx0bWlwTWFwSG9sZGVyID0gTWlwbWFwR2VuZXJhdG9yLl9taXBNYXBzW25ld1ddW25ld0hdO1xuXHRcdH1cblxuXHRcdHJldHVybiBtaXBNYXBIb2xkZXI7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGZyZWVNaXBNYXBIb2xkZXIobWlwTWFwSG9sZGVyOkJpdG1hcERhdGEpXG5cdHtcblx0XHR2YXIgaG9sZGVyV2lkdGg6bnVtYmVyID0gbWlwTWFwSG9sZGVyLndpZHRoO1xuXHRcdHZhciBob2xkZXJIZWlnaHQ6bnVtYmVyID0gbWlwTWFwSG9sZGVyLmhlaWdodDtcblxuXHRcdGlmICgtLU1pcG1hcEdlbmVyYXRvci5fbWlwTWFwVXNlc1tob2xkZXJXaWR0aF1baG9sZGVySGVpZ2h0XSA9PSAwKSB7XG5cdFx0XHRNaXBtYXBHZW5lcmF0b3IuX21pcE1hcHNbaG9sZGVyV2lkdGhdW2hvbGRlckhlaWdodF0uZGlzcG9zZSgpO1xuXHRcdFx0TWlwbWFwR2VuZXJhdG9yLl9taXBNYXBzW2hvbGRlcldpZHRoXVtob2xkZXJIZWlnaHRdID0gbnVsbDtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0ID0gTWlwbWFwR2VuZXJhdG9yOyJdfQ== \ No newline at end of file diff --git a/lib/textures/MipmapGenerator.ts b/lib/textures/MipmapGenerator.ts new file mode 100644 index 00000000..d16106ae --- /dev/null +++ b/lib/textures/MipmapGenerator.ts @@ -0,0 +1,96 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import Matrix = require("awayjs-core/lib/core/geom/Matrix"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); + +/** + * MipmapGenerator is a helper class that uploads BitmapData to a Texture including mipmap levels. + */ +class MipmapGenerator +{ + private static _mipMaps = []; + private static _mipMapUses = []; + + private static _matrix:Matrix = new Matrix(); + private static _rect:Rectangle = new Rectangle(); + private static _source:BitmapData; + + /** + * Uploads a BitmapData with mip maps to a target Texture object. + * @param source The source to upload. + * @param target The target Texture to upload to. + * @param mipmap An optional mip map holder to avoids creating new instances for fe animated materials. + * @param alpha Indicate whether or not the uploaded bitmapData is transparent. + */ + public static generateMipMaps(source:HTMLImageElement, output?:Array, alpha?:boolean); + public static generateMipMaps(source:BitmapData, output?:Array, alpha?:boolean); + public static generateMipMaps(source:any, output?:Array, alpha:boolean = false) + { + var w:number = source.width; + var h:number = source.height; + var i:number = 0; + + var mipmap:BitmapData; + + MipmapGenerator._rect.width = w; + MipmapGenerator._rect.height = h; + + while (w >= 1 && h >= 1) { + + mipmap = output[i] = MipmapGenerator._getMipmapHolder(output[i], w, h); + + if (alpha) + mipmap.fillRect(MipmapGenerator._rect, 0); + + MipmapGenerator._matrix.a = MipmapGenerator._rect.width/source.width; + MipmapGenerator._matrix.d = MipmapGenerator._rect.height/source.height; + + mipmap.draw(source, MipmapGenerator._matrix); //TODO: smoothing? + + w >>= 1; + h >>= 1; + + MipmapGenerator._rect.width = w > 1? w : 1; + MipmapGenerator._rect.height = h > 1? h : 1; + + i++; + } + } + + private static _getMipmapHolder(mipMapHolder:BitmapData, newW:number, newH:number):BitmapData + { + if (mipMapHolder) { + if (mipMapHolder.width == newW && mipMapHolder.height == newH) + return mipMapHolder; + + MipmapGenerator.freeMipMapHolder(mipMapHolder); + } + + if (!MipmapGenerator._mipMaps[newW]) { + MipmapGenerator._mipMaps[newW] = []; + MipmapGenerator._mipMapUses[newW] = []; + } + + if (!MipmapGenerator._mipMaps[newW][newH]) { + mipMapHolder = MipmapGenerator._mipMaps[newW][newH] = new BitmapData(newW, newH, true); + MipmapGenerator._mipMapUses[newW][newH] = 1; + } else { + MipmapGenerator._mipMapUses[newW][newH] = MipmapGenerator._mipMapUses[newW][newH] + 1; + mipMapHolder = MipmapGenerator._mipMaps[newW][newH]; + } + + return mipMapHolder; + } + + public static freeMipMapHolder(mipMapHolder:BitmapData) + { + var holderWidth:number = mipMapHolder.width; + var holderHeight:number = mipMapHolder.height; + + if (--MipmapGenerator._mipMapUses[holderWidth][holderHeight] == 0) { + MipmapGenerator._mipMaps[holderWidth][holderHeight].dispose(); + MipmapGenerator._mipMaps[holderWidth][holderHeight] = null; + } + } +} + +export = MipmapGenerator; \ No newline at end of file diff --git a/lib/textures/RenderTexture.js b/lib/textures/RenderTexture.js new file mode 100755 index 00000000..59251b24 --- /dev/null +++ b/lib/textures/RenderTexture.js @@ -0,0 +1,69 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var RenderTexture = (function (_super) { + __extends(RenderTexture, _super); + function RenderTexture(width, height) { + _super.call(this, false); + + this._pSetSize(width, height); + } + Object.defineProperty(RenderTexture.prototype, "width", { + /** + * + * @returns {number} + */ + get: function () { + return this._pWidth; + }, + set: function (value) { + if (value == this._pWidth) + return; + + if (!TextureUtils.isDimensionValid(value)) + throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); + + this.invalidateContent(); + + this._pSetSize(value, this._pHeight); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(RenderTexture.prototype, "height", { + /** + * + * @returns {number} + */ + get: function () { + return this._pHeight; + }, + set: function (value) { + if (value == this._pHeight) + return; + + if (!TextureUtils.isDimensionValid(value)) + throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); + + this.invalidateContent(); + this._pSetSize(this._pWidth, value); + }, + enumerable: true, + configurable: true + }); + + return RenderTexture; +})(Texture2DBase); + +module.exports = RenderTexture; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL1JlbmRlclRleHR1cmUudHMiXSwibmFtZXMiOlsiUmVuZGVyVGV4dHVyZSIsIlJlbmRlclRleHR1cmUuY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUEyRDtBQUMzRCxxRUFBMkU7QUFDM0UsZ0VBQXVFOztBQUV2RTtJQUE0QkEsZ0NBQWFBO0lBNkN4Q0EsdUJBQVlBLEtBQVlBLEVBQUVBLE1BQWFBO1FBRXRDQyxXQUFNQSxPQUFBQSxLQUFLQSxDQUFDQTs7UUFFWkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsRUFBRUEsTUFBTUEsQ0FBQ0E7SUFDOUJBLENBQUNBO0lBNUNERDtRQUFBQTs7O1VBREdBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUFpQkEsS0FBWUE7WUFFNUJBLElBQUlBLEtBQUtBLElBQUlBLElBQUlBLENBQUNBLE9BQU9BO2dCQUN4QkEsTUFBT0EsQ0FBQUE7O1lBRVJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7Z0JBQ3hDQSxNQUFNQSxJQUFJQSxLQUFLQSxDQUFDQSwwRUFBMEVBLENBQUNBLENBQUNBOztZQUU3RkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTs7WUFFeEJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBO1FBQ3JDQSxDQUFDQTs7OztBQWJBQTs7SUFtQkRBO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBO1FBRURBLEtBQUFBLFVBQWtCQSxLQUFZQTtZQUU3QkEsSUFBSUEsS0FBS0EsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUE7Z0JBQ3pCQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxDQUFDQTtnQkFDeENBLE1BQU1BLElBQUlBLEtBQUtBLENBQUNBLDBFQUEwRUEsQ0FBQ0EsQ0FBQ0E7O1lBRTdGQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1lBQ3hCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxLQUFLQSxDQUFDQTtRQUNwQ0EsQ0FBQ0E7Ozs7QUFaQUE7SUFvQkZBLHFCQUFDQTtBQUFEQSxDQUFDQSxFQW5EMkIsYUFBYSxFQW1EeEM7O0FBRUQsOEJBQXVCLENBQUEiLCJmaWxlIjoidGV4dHVyZXMvUmVuZGVyVGV4dHVyZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFcnJvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Vycm9yXCIpO1xuaW1wb3J0IFRleHR1cmUyREJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvVGV4dHVyZTJEQmFzZVwiKTtcbmltcG9ydCBUZXh0dXJlVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi91dGlscy9UZXh0dXJlVXRpbHNcIik7XG5cbmNsYXNzIFJlbmRlclRleHR1cmUgZXh0ZW5kcyBUZXh0dXJlMkRCYXNlXG57XG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfVxuXHQgKi9cblx0cHVibGljIGdldCB3aWR0aCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BXaWR0aDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgd2lkdGgodmFsdWU6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHZhbHVlID09IHRoaXMuX3BXaWR0aClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICghVGV4dHVyZVV0aWxzLmlzRGltZW5zaW9uVmFsaWQodmFsdWUpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzaXplOiBXaWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgY2Fubm90IGV4Y2VlZCAyMDQ4XCIpO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXG5cdFx0dGhpcy5fcFNldFNpemUodmFsdWUsIHRoaXMuX3BIZWlnaHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtudW1iZXJ9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGhlaWdodCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BIZWlnaHQ7XG5cdH1cblxuXHRwdWJsaWMgc2V0IGhlaWdodCh2YWx1ZTpudW1iZXIpXG5cdHtcblx0XHRpZiAodmFsdWUgPT0gdGhpcy5fcEhlaWdodClcblx0XHRcdHJldHVybjtcblxuXHRcdGlmICghVGV4dHVyZVV0aWxzLmlzRGltZW5zaW9uVmFsaWQodmFsdWUpKVxuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBzaXplOiBXaWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgY2Fubm90IGV4Y2VlZCAyMDQ4XCIpO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHRcdHRoaXMuX3BTZXRTaXplKHRoaXMuX3BXaWR0aCwgdmFsdWUpO1xuXHR9XG5cblx0Y29uc3RydWN0b3Iod2lkdGg6bnVtYmVyLCBoZWlnaHQ6bnVtYmVyKVxuXHR7XG5cdFx0c3VwZXIoZmFsc2UpO1xuXG5cdFx0dGhpcy5fcFNldFNpemUod2lkdGgsIGhlaWdodCk7XG5cdH1cbn1cblxuZXhwb3J0ID0gUmVuZGVyVGV4dHVyZTsiXX0= \ No newline at end of file diff --git a/lib/textures/RenderTexture.ts b/lib/textures/RenderTexture.ts new file mode 100644 index 00000000..bc8eb447 --- /dev/null +++ b/lib/textures/RenderTexture.ts @@ -0,0 +1,58 @@ +import Error = require("awayjs-core/lib/errors/Error"); +import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +import TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +class RenderTexture extends Texture2DBase +{ + /** + * + * @returns {number} + */ + public get width():number + { + return this._pWidth; + } + + public set width(value:number) + { + if (value == this._pWidth) + return; + + if (!TextureUtils.isDimensionValid(value)) + throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); + + this.invalidateContent(); + + this._pSetSize(value, this._pHeight); + } + + /** + * + * @returns {number} + */ + public get height():number + { + return this._pHeight; + } + + public set height(value:number) + { + if (value == this._pHeight) + return; + + if (!TextureUtils.isDimensionValid(value)) + throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); + + this.invalidateContent(); + this._pSetSize(this._pWidth, value); + } + + constructor(width:number, height:number) + { + super(false); + + this._pSetSize(width, height); + } +} + +export = RenderTexture; \ No newline at end of file diff --git a/lib/textures/SpecularBitmapTexture.js b/lib/textures/SpecularBitmapTexture.js new file mode 100755 index 00000000..f762e741 --- /dev/null +++ b/lib/textures/SpecularBitmapTexture.js @@ -0,0 +1,102 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var BitmapDataChannel = require("awayjs-core/lib/core/base/BitmapDataChannel"); +var Point = require("awayjs-core/lib/core/geom/Point"); + +var BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); + +/** +* A convenience texture that encodes a specular map in the red channel, and the gloss map in the green channel, as expected by BasicSpecularMapMethod +*/ +var SpecularBitmapTexture = (function (_super) { + __extends(SpecularBitmapTexture, _super); + function SpecularBitmapTexture(specularMap, glossMap, generateMipmaps) { + if (typeof specularMap === "undefined") { specularMap = null; } + if (typeof glossMap === "undefined") { glossMap = null; } + if (typeof generateMipmaps === "undefined") { generateMipmaps = true; } + var bmd = specularMap ? specularMap : glossMap; + + bmd = bmd ? new BitmapData(bmd.width, bmd.height, false, 0xffffff) : new BitmapData(1, 1, false, 0xffffff); + + _super.call(this, bmd, generateMipmaps); + + this.specularMap = specularMap; + this.glossMap = glossMap; + } + Object.defineProperty(SpecularBitmapTexture.prototype, "specularMap", { + get: function () { + return this._specularMap; + }, + set: function (value) { + this._specularMap = value; + + this.invalidateContent(); + + this._testSize(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(SpecularBitmapTexture.prototype, "glossMap", { + get: function () { + return this._glossMap; + }, + set: function (value) { + this._glossMap = value; + this.invalidateContent(); + + this._testSize(); + }, + enumerable: true, + configurable: true + }); + + + SpecularBitmapTexture.prototype._testSize = function () { + var w, h; + + if (this._specularMap) { + w = this._specularMap.width; + h = this._specularMap.height; + } else if (this._glossMap) { + w = this._glossMap.width; + h = this._glossMap.height; + } else { + w = 1; + h = 1; + } + + if (w != this._bitmapData.width && h != this._bitmapData.height) { + var oldBitmap = this._bitmapData; + this.bitmapData = new BitmapData(this._specularMap.width, this._specularMap.height, false, 0xffffff); + oldBitmap.dispose(); + } + }; + + SpecularBitmapTexture.prototype._iGetTextureData = function () { + var rect = this._specularMap.rect; + var origin = new Point(); + + this._bitmapData.fillRect(rect, 0xffffff); + + if (this._glossMap) + this._bitmapData.copyChannel(this._glossMap, rect, origin, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); + + if (this._specularMap) + this._bitmapData.copyChannel(this._specularMap, rect, origin, BitmapDataChannel.RED, BitmapDataChannel.RED); + + return this._bitmapData; + }; + return SpecularBitmapTexture; +})(BitmapTexture); + +module.exports = SpecularBitmapTexture; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL1NwZWN1bGFyQml0bWFwVGV4dHVyZS50cyJdLCJuYW1lcyI6WyJTcGVjdWxhckJpdG1hcFRleHR1cmUiLCJTcGVjdWxhckJpdG1hcFRleHR1cmUuY29uc3RydWN0b3IiLCJTcGVjdWxhckJpdG1hcFRleHR1cmUuX3Rlc3RTaXplIiwiU3BlY3VsYXJCaXRtYXBUZXh0dXJlLl9pR2V0VGV4dHVyZURhdGEiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUF1RTtBQUN2RSw4RUFBbUY7QUFDbkYsc0RBQThEOztBQUU5RCxxRUFBMkU7O0FBRTNFOztFQUVHO0FBQ0g7SUFBb0NBLHdDQUFhQTtJQUtoREEsK0JBQVlBLFdBQTZCQSxFQUFFQSxRQUEwQkEsRUFBRUEsZUFBOEJBO1FBQXpGQywwQ0FBQUEsV0FBV0EsR0FBY0EsSUFBSUE7QUFBQUEsUUFBRUEsdUNBQUFBLFFBQVFBLEdBQWNBLElBQUlBO0FBQUFBLFFBQUVBLDhDQUFBQSxlQUFlQSxHQUFXQSxJQUFJQTtBQUFBQSxRQUVwR0EsSUFBSUEsR0FBR0EsR0FBY0EsV0FBV0EsR0FBRUEsV0FBV0EsR0FBR0EsUUFBUUE7O1FBRXhEQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFFQSxJQUFJQSxVQUFVQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxNQUFNQSxFQUFFQSxLQUFLQSxFQUFFQSxRQUFRQSxDQUFDQSxHQUFHQSxJQUFJQSxVQUFVQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxLQUFLQSxFQUFFQSxRQUFRQSxDQUFDQTs7UUFFekdBLFdBQU1BLE9BQUFBLEdBQUdBLEVBQUVBLGVBQWVBLENBQUNBOztRQUUzQkEsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsV0FBV0E7UUFDOUJBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLFFBQVFBO0lBQ3pCQSxDQUFDQTtJQUVERDtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQTtRQUN6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ZXh0dXJlcy9TcGVjdWxhckJpdG1hcFRleHR1cmUuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQml0bWFwRGF0YVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9CaXRtYXBEYXRhXCIpO1xuaW1wb3J0IEJpdG1hcERhdGFDaGFubmVsXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvQml0bWFwRGF0YUNoYW5uZWxcIik7XG5pbXBvcnQgUG9pbnRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9Qb2ludFwiKTtcbmltcG9ydCBSZWN0YW5nbGVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUmVjdGFuZ2xlXCIpO1xuaW1wb3J0IEJpdG1hcFRleHR1cmVcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvQml0bWFwVGV4dHVyZVwiKTtcblxuLyoqXG4gKiBBIGNvbnZlbmllbmNlIHRleHR1cmUgdGhhdCBlbmNvZGVzIGEgc3BlY3VsYXIgbWFwIGluIHRoZSByZWQgY2hhbm5lbCwgYW5kIHRoZSBnbG9zcyBtYXAgaW4gdGhlIGdyZWVuIGNoYW5uZWwsIGFzIGV4cGVjdGVkIGJ5IEJhc2ljU3BlY3VsYXJNYXBNZXRob2RcbiAqL1xuY2xhc3MgU3BlY3VsYXJCaXRtYXBUZXh0dXJlIGV4dGVuZHMgQml0bWFwVGV4dHVyZVxue1xuXHRwcml2YXRlIF9zcGVjdWxhck1hcDpCaXRtYXBEYXRhO1xuXHRwcml2YXRlIF9nbG9zc01hcDpCaXRtYXBEYXRhO1xuXHRcblx0Y29uc3RydWN0b3Ioc3BlY3VsYXJNYXA6Qml0bWFwRGF0YSA9IG51bGwsIGdsb3NzTWFwOkJpdG1hcERhdGEgPSBudWxsLCBnZW5lcmF0ZU1pcG1hcHM6Ym9vbGVhbiA9IHRydWUpXG5cdHtcblx0XHR2YXIgYm1kOkJpdG1hcERhdGEgPSBzcGVjdWxhck1hcD8gc3BlY3VsYXJNYXAgOiBnbG9zc01hcDtcblxuXHRcdGJtZCA9IGJtZD8gbmV3IEJpdG1hcERhdGEoYm1kLndpZHRoLCBibWQuaGVpZ2h0LCBmYWxzZSwgMHhmZmZmZmYpIDogbmV3IEJpdG1hcERhdGEoMSwgMSwgZmFsc2UsIDB4ZmZmZmZmKTtcblx0XHRcblx0XHRzdXBlcihibWQsIGdlbmVyYXRlTWlwbWFwcyk7XG5cdFx0XG5cdFx0dGhpcy5zcGVjdWxhck1hcCA9IHNwZWN1bGFyTWFwO1xuXHRcdHRoaXMuZ2xvc3NNYXAgPSBnbG9zc01hcDtcblx0fVxuXHRcblx0cHVibGljIGdldCBzcGVjdWxhck1hcCgpOkJpdG1hcERhdGFcblx0e1xuXHRcdHJldHVybiB0aGlzLl9zcGVjdWxhck1hcDtcblx0fVxuXHRcblx0cHVibGljIHNldCBzcGVjdWxhck1hcCh2YWx1ZTpCaXRtYXBEYXRhKVxuXHR7XG5cdFx0dGhpcy5fc3BlY3VsYXJNYXAgPSB2YWx1ZTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZUNvbnRlbnQoKTtcblx0XHRcblx0XHR0aGlzLl90ZXN0U2l6ZSgpO1xuXHR9XG5cdFxuXHRwdWJsaWMgZ2V0IGdsb3NzTWFwKCk6Qml0bWFwRGF0YVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2dsb3NzTWFwO1xuXHR9XG5cdFxuXHRwdWJsaWMgc2V0IGdsb3NzTWFwKHZhbHVlOkJpdG1hcERhdGEpXG5cdHtcblx0XHR0aGlzLl9nbG9zc01hcCA9IHZhbHVlO1xuXHRcdHRoaXMuaW52YWxpZGF0ZUNvbnRlbnQoKTtcblx0XHRcblx0XHR0aGlzLl90ZXN0U2l6ZSgpO1xuXHR9XG5cdFxuXHRwcml2YXRlIF90ZXN0U2l6ZSgpXG5cdHtcblx0XHR2YXIgdzpOdW1iZXIsIGg6TnVtYmVyO1xuXHRcdFxuXHRcdGlmICh0aGlzLl9zcGVjdWxhck1hcCkge1xuXHRcdFx0dyA9IHRoaXMuX3NwZWN1bGFyTWFwLndpZHRoO1xuXHRcdFx0aCA9IHRoaXMuX3NwZWN1bGFyTWFwLmhlaWdodDtcblx0XHR9IGVsc2UgaWYgKHRoaXMuX2dsb3NzTWFwKSB7XG5cdFx0XHR3ID0gdGhpcy5fZ2xvc3NNYXAud2lkdGg7XG5cdFx0XHRoID0gdGhpcy5fZ2xvc3NNYXAuaGVpZ2h0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3ID0gMTtcblx0XHRcdGggPSAxO1xuXHRcdH1cblx0XHRcblx0XHRpZiAodyAhPSB0aGlzLl9iaXRtYXBEYXRhLndpZHRoICYmIGggIT0gdGhpcy5fYml0bWFwRGF0YS5oZWlnaHQpIHtcblx0XHRcdHZhciBvbGRCaXRtYXA6Qml0bWFwRGF0YSA9IHRoaXMuX2JpdG1hcERhdGE7XG5cdFx0XHR0aGlzLmJpdG1hcERhdGEgPSBuZXcgQml0bWFwRGF0YSh0aGlzLl9zcGVjdWxhck1hcC53aWR0aCwgdGhpcy5fc3BlY3VsYXJNYXAuaGVpZ2h0LCBmYWxzZSwgMHhmZmZmZmYpO1xuXHRcdFx0b2xkQml0bWFwLmRpc3Bvc2UoKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgX2lHZXRUZXh0dXJlRGF0YSgpOkJpdG1hcERhdGFcblx0e1xuXHRcdHZhciByZWN0OlJlY3RhbmdsZSA9IHRoaXMuX3NwZWN1bGFyTWFwLnJlY3Q7XG5cdFx0dmFyIG9yaWdpbjpQb2ludCA9IG5ldyBQb2ludCgpO1xuXG5cdFx0dGhpcy5fYml0bWFwRGF0YS5maWxsUmVjdChyZWN0LCAweGZmZmZmZik7XG5cblx0XHRpZiAodGhpcy5fZ2xvc3NNYXApXG5cdFx0XHR0aGlzLl9iaXRtYXBEYXRhLmNvcHlDaGFubmVsKHRoaXMuX2dsb3NzTWFwLCByZWN0LCBvcmlnaW4sIEJpdG1hcERhdGFDaGFubmVsLkdSRUVOLCBCaXRtYXBEYXRhQ2hhbm5lbC5HUkVFTik7XG5cblx0XHRpZiAodGhpcy5fc3BlY3VsYXJNYXApXG5cdFx0XHR0aGlzLl9iaXRtYXBEYXRhLmNvcHlDaGFubmVsKHRoaXMuX3NwZWN1bGFyTWFwLCByZWN0LCBvcmlnaW4sIEJpdG1hcERhdGFDaGFubmVsLlJFRCwgQml0bWFwRGF0YUNoYW5uZWwuUkVEKTtcblxuXHRcdHJldHVybiB0aGlzLl9iaXRtYXBEYXRhO1xuXHR9XG59XG5cbmV4cG9ydCA9IFNwZWN1bGFyQml0bWFwVGV4dHVyZTsiXX0= \ No newline at end of file diff --git a/lib/textures/SpecularBitmapTexture.ts b/lib/textures/SpecularBitmapTexture.ts new file mode 100644 index 00000000..0c602235 --- /dev/null +++ b/lib/textures/SpecularBitmapTexture.ts @@ -0,0 +1,93 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import BitmapDataChannel = require("awayjs-core/lib/core/base/BitmapDataChannel"); +import Point = require("awayjs-core/lib/core/geom/Point"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); + +/** + * A convenience texture that encodes a specular map in the red channel, and the gloss map in the green channel, as expected by BasicSpecularMapMethod + */ +class SpecularBitmapTexture extends BitmapTexture +{ + private _specularMap:BitmapData; + private _glossMap:BitmapData; + + constructor(specularMap:BitmapData = null, glossMap:BitmapData = null, generateMipmaps:boolean = true) + { + var bmd:BitmapData = specularMap? specularMap : glossMap; + + bmd = bmd? new BitmapData(bmd.width, bmd.height, false, 0xffffff) : new BitmapData(1, 1, false, 0xffffff); + + super(bmd, generateMipmaps); + + this.specularMap = specularMap; + this.glossMap = glossMap; + } + + public get specularMap():BitmapData + { + return this._specularMap; + } + + public set specularMap(value:BitmapData) + { + this._specularMap = value; + + this.invalidateContent(); + + this._testSize(); + } + + public get glossMap():BitmapData + { + return this._glossMap; + } + + public set glossMap(value:BitmapData) + { + this._glossMap = value; + this.invalidateContent(); + + this._testSize(); + } + + private _testSize() + { + var w:Number, h:Number; + + if (this._specularMap) { + w = this._specularMap.width; + h = this._specularMap.height; + } else if (this._glossMap) { + w = this._glossMap.width; + h = this._glossMap.height; + } else { + w = 1; + h = 1; + } + + if (w != this._bitmapData.width && h != this._bitmapData.height) { + var oldBitmap:BitmapData = this._bitmapData; + this.bitmapData = new BitmapData(this._specularMap.width, this._specularMap.height, false, 0xffffff); + oldBitmap.dispose(); + } + } + + public _iGetTextureData():BitmapData + { + var rect:Rectangle = this._specularMap.rect; + var origin:Point = new Point(); + + this._bitmapData.fillRect(rect, 0xffffff); + + if (this._glossMap) + this._bitmapData.copyChannel(this._glossMap, rect, origin, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); + + if (this._specularMap) + this._bitmapData.copyChannel(this._specularMap, rect, origin, BitmapDataChannel.RED, BitmapDataChannel.RED); + + return this._bitmapData; + } +} + +export = SpecularBitmapTexture; \ No newline at end of file diff --git a/lib/textures/Texture2DBase.js b/lib/textures/Texture2DBase.js new file mode 100755 index 00000000..3ac248b7 --- /dev/null +++ b/lib/textures/Texture2DBase.js @@ -0,0 +1,108 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +var MipmapGenerator = require("awayjs-core/lib/textures/MipmapGenerator"); +var TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +var Texture2DBase = (function (_super) { + __extends(Texture2DBase, _super); + function Texture2DBase(generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this, generateMipmaps); + } + Object.defineProperty(Texture2DBase.prototype, "width", { + /** + * + * @returns {number} + */ + get: function () { + return this._pWidth; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Texture2DBase.prototype, "height", { + /** + * + * @returns {number} + */ + get: function () { + return this._pHeight; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Texture2DBase.prototype, "size", { + get: function () { + return this._pWidth; + }, + enumerable: true, + configurable: true + }); + + /** + * @inheritDoc + */ + Texture2DBase.prototype.dispose = function () { + _super.prototype.dispose.call(this); + + if (this._mipmapData) { + var len = this._mipmapData.length; + for (var i = 0; i < len; i++) + MipmapGenerator.freeMipMapHolder(this._mipmapData[i]); + } + }; + + /** + * + */ + Texture2DBase.prototype.invalidateContent = function () { + _super.prototype.invalidateContent.call(this); + + this._mipmapDataDirty = true; + }; + + /** + * + * @param width + * @param height + * @private + */ + Texture2DBase.prototype._pSetSize = function (width, height) { + if (this._pWidth != width || this._pHeight != height) + this.invalidateSize(); + + this._mipmapDataDirty = true; + + this._pWidth = width; + this._pHeight = height; + }; + + Texture2DBase.prototype._iGetMipmapData = function () { + if (this._mipmapDataDirty) { + this._mipmapDataDirty = false; + + if (!this._mipmapData) + this._mipmapData = new Array(); + + MipmapGenerator.generateMipMaps(this._iGetTextureData(), this._mipmapData, true); + } + + return this._mipmapData; + }; + + Texture2DBase.prototype._iGetTextureData = function () { + throw new AbstractMethodError(); + }; + return Texture2DBase; +})(TextureProxyBase); + +module.exports = Texture2DBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL1RleHR1cmUyREJhc2UudHMiXSwibmFtZXMiOlsiVGV4dHVyZTJEQmFzZSIsIlRleHR1cmUyREJhc2UuY29uc3RydWN0b3IiLCJUZXh0dXJlMkRCYXNlLmRpc3Bvc2UiLCJUZXh0dXJlMkRCYXNlLmludmFsaWRhdGVDb250ZW50IiwiVGV4dHVyZTJEQmFzZS5fcFNldFNpemUiLCJUZXh0dXJlMkRCYXNlLl9pR2V0TWlwbWFwRGF0YSIsIlRleHR1cmUyREJhc2UuX2lHZXRUZXh0dXJlRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0VBQ29GO0FBQ3BGLHlFQUErRTtBQUMvRSwyRUFBaUY7O0FBRWpGO0lBQTRCQSxnQ0FBZ0JBO0lBOEIzQ0EsdUJBQVlBLGVBQStCQTtRQUEvQkMsOENBQUFBLGVBQWVBLEdBQVdBLEtBQUtBO0FBQUFBLFFBRTFDQSxXQUFNQSxPQUFBQSxlQUFlQSxDQUFDQTtJQUN2QkEsQ0FBQ0E7SUF0QkREO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsT0FBT0E7UUFDcEJBLENBQUNBOzs7O0FBQUFBO0lBTURBO1FBQUFBOzs7VUFER0E7YUFDSEE7WUFFQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsUUFBUUE7UUFDckJBLENBQUNBOzs7O0FBQUFBO0lBRURBO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQVVEQTs7TUFER0E7c0NBQ0hBO1FBRUNFLGdCQUFLQSxDQUFDQSxPQUFPQSxLQUFDQSxLQUFBQSxDQUFDQTs7UUFFZkEsSUFBSUEsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBRUE7WUFDckJBLElBQUlBLEdBQUdBLEdBQVVBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLE1BQU1BO1lBQ3hDQSxLQUFLQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxHQUFHQSxFQUFFQSxDQUFDQSxFQUFFQTtnQkFDbENBLGVBQWVBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDdkRBO0lBQ0ZBLENBQUNBOztJQUtERjs7TUFER0E7Z0RBQ0hBO1FBRUNHLGdCQUFLQSxDQUFDQSxpQkFBaUJBLEtBQUNBLEtBQUFBLENBQUNBOztRQUV6QkEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxJQUFJQTtJQUM3QkEsQ0FBQ0E7O0lBUURIOzs7OztNQURHQTt3Q0FDSEEsVUFBaUJBLEtBQVlBLEVBQUVBLE1BQWFBO1FBRTNDSSxJQUFJQSxJQUFJQSxDQUFDQSxPQUFPQSxJQUFJQSxLQUFLQSxJQUFJQSxJQUFJQSxDQUFDQSxRQUFRQSxJQUFJQSxNQUFNQTtZQUNuREEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRXZCQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLElBQUlBOztRQUU1QkEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsS0FBS0E7UUFDcEJBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLE1BQU1BO0lBQ3ZCQSxDQUFDQTs7SUFFREosMENBQUFBO1FBRUNLLElBQUlBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBRUE7WUFDMUJBLElBQUlBLENBQUNBLGdCQUFnQkEsR0FBR0EsS0FBS0E7O1lBRTdCQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQTtnQkFDcEJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLElBQUlBLEtBQUtBLENBQWFBLENBQUNBLENBQUNBOztZQUU1Q0EsZUFBZUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxJQUFJQSxDQUFDQTtTQUNoRkE7O1FBRURBLE9BQU9BLElBQUlBLENBQUNBLFdBQVdBO0lBQ3hCQSxDQUFDQTs7SUFFREwsMkNBQUFBO1FBRUNNLE1BQU1BLElBQUlBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7SUFDaENBLENBQUNBO0lBQ0ZOLHFCQUFDQTtBQUFEQSxDQUFDQSxFQTlGMkIsZ0JBQWdCLEVBOEYzQzs7QUFFRCw4QkFBdUIsQ0FBQSIsImZpbGUiOiJ0ZXh0dXJlcy9UZXh0dXJlMkRCYXNlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpdG1hcERhdGFcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvQml0bWFwRGF0YVwiKTtcbmltcG9ydCBBYnN0cmFjdE1ldGhvZEVycm9yXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQWJzdHJhY3RNZXRob2RFcnJvclwiKTtcbmltcG9ydCBNaXBtYXBHZW5lcmF0b3JcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvTWlwbWFwR2VuZXJhdG9yXCIpO1xuaW1wb3J0IFRleHR1cmVQcm94eUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvVGV4dHVyZVByb3h5QmFzZVwiKTtcblxuY2xhc3MgVGV4dHVyZTJEQmFzZSBleHRlbmRzIFRleHR1cmVQcm94eUJhc2Vcbntcblx0cHJpdmF0ZSBfbWlwbWFwRGF0YTpBcnJheTxCaXRtYXBEYXRhPjtcblx0cHJpdmF0ZSBfbWlwbWFwRGF0YURpcnR5OmJvb2xlYW47XG5cdHB1YmxpYyBfcFdpZHRoOm51bWJlcjtcblx0cHVibGljIF9wSGVpZ2h0Om51bWJlcjtcblx0XG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfVxuXHQgKi9cblx0cHVibGljIGdldCB3aWR0aCgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BXaWR0aDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7bnVtYmVyfVxuXHQgKi9cblx0cHVibGljIGdldCBoZWlnaHQoKTpudW1iZXJcblx0e1xuXHRcdHJldHVybiB0aGlzLl9wSGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIGdldCBzaXplKCk6bnVtYmVyXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcFdpZHRoO1xuXHR9XG5cblx0Y29uc3RydWN0b3IoZ2VuZXJhdGVNaXBtYXBzOmJvb2xlYW4gPSBmYWxzZSlcblx0e1xuXHRcdHN1cGVyKGdlbmVyYXRlTWlwbWFwcyk7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBkaXNwb3NlKClcblx0e1xuXHRcdHN1cGVyLmRpc3Bvc2UoKTtcblxuXHRcdGlmICh0aGlzLl9taXBtYXBEYXRhKSB7XG5cdFx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX21pcG1hcERhdGEubGVuZ3RoO1xuXHRcdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgbGVuOyBpKyspXG5cdFx0XHRcdE1pcG1hcEdlbmVyYXRvci5mcmVlTWlwTWFwSG9sZGVyKHRoaXMuX21pcG1hcERhdGFbaV0pO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIGludmFsaWRhdGVDb250ZW50KCk6dm9pZFxuXHR7XG5cdFx0c3VwZXIuaW52YWxpZGF0ZUNvbnRlbnQoKTtcblxuXHRcdHRoaXMuX21pcG1hcERhdGFEaXJ0eSA9IHRydWU7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHBhcmFtIHdpZHRoXG5cdCAqIEBwYXJhbSBoZWlnaHRcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHB1YmxpYyBfcFNldFNpemUod2lkdGg6bnVtYmVyLCBoZWlnaHQ6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHRoaXMuX3BXaWR0aCAhPSB3aWR0aCB8fCB0aGlzLl9wSGVpZ2h0ICE9IGhlaWdodClcblx0XHRcdHRoaXMuaW52YWxpZGF0ZVNpemUoKTtcblxuXHRcdHRoaXMuX21pcG1hcERhdGFEaXJ0eSA9IHRydWU7XG5cblx0XHR0aGlzLl9wV2lkdGggPSB3aWR0aDtcblx0XHR0aGlzLl9wSGVpZ2h0ID0gaGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIF9pR2V0TWlwbWFwRGF0YSgpOkFycmF5PEJpdG1hcERhdGE+XG5cdHtcblx0XHRpZiAodGhpcy5fbWlwbWFwRGF0YURpcnR5KSB7XG5cdFx0XHR0aGlzLl9taXBtYXBEYXRhRGlydHkgPSBmYWxzZTtcblxuXHRcdFx0aWYgKCF0aGlzLl9taXBtYXBEYXRhKVxuXHRcdFx0XHR0aGlzLl9taXBtYXBEYXRhID0gbmV3IEFycmF5PEJpdG1hcERhdGE+KCk7XG5cblx0XHRcdE1pcG1hcEdlbmVyYXRvci5nZW5lcmF0ZU1pcE1hcHModGhpcy5faUdldFRleHR1cmVEYXRhKCksIHRoaXMuX21pcG1hcERhdGEsIHRydWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLl9taXBtYXBEYXRhO1xuXHR9XG5cblx0cHVibGljIF9pR2V0VGV4dHVyZURhdGEoKTphbnlcblx0e1xuXHRcdHRocm93IG5ldyBBYnN0cmFjdE1ldGhvZEVycm9yKCk7XG5cdH1cbn1cblxuZXhwb3J0ID0gVGV4dHVyZTJEQmFzZTsiXX0= \ No newline at end of file diff --git a/lib/textures/Texture2DBase.ts b/lib/textures/Texture2DBase.ts new file mode 100644 index 00000000..ca0705c2 --- /dev/null +++ b/lib/textures/Texture2DBase.ts @@ -0,0 +1,102 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); +import MipmapGenerator = require("awayjs-core/lib/textures/MipmapGenerator"); +import TextureProxyBase = require("awayjs-core/lib/textures/TextureProxyBase"); + +class Texture2DBase extends TextureProxyBase +{ + private _mipmapData:Array; + private _mipmapDataDirty:boolean; + public _pWidth:number; + public _pHeight:number; + + /** + * + * @returns {number} + */ + public get width():number + { + return this._pWidth; + } + + /** + * + * @returns {number} + */ + public get height():number + { + return this._pHeight; + } + + public get size():number + { + return this._pWidth; + } + + constructor(generateMipmaps:boolean = false) + { + super(generateMipmaps); + } + + /** + * @inheritDoc + */ + public dispose() + { + super.dispose(); + + if (this._mipmapData) { + var len:number = this._mipmapData.length; + for (var i:number = 0; i < len; i++) + MipmapGenerator.freeMipMapHolder(this._mipmapData[i]); + } + } + + /** + * + */ + public invalidateContent():void + { + super.invalidateContent(); + + this._mipmapDataDirty = true; + } + + /** + * + * @param width + * @param height + * @private + */ + public _pSetSize(width:number, height:number) + { + if (this._pWidth != width || this._pHeight != height) + this.invalidateSize(); + + this._mipmapDataDirty = true; + + this._pWidth = width; + this._pHeight = height; + } + + public _iGetMipmapData():Array + { + if (this._mipmapDataDirty) { + this._mipmapDataDirty = false; + + if (!this._mipmapData) + this._mipmapData = new Array(); + + MipmapGenerator.generateMipMaps(this._iGetTextureData(), this._mipmapData, true); + } + + return this._mipmapData; + } + + public _iGetTextureData():any + { + throw new AbstractMethodError(); + } +} + +export = Texture2DBase; \ No newline at end of file diff --git a/lib/textures/TextureProxyBase.js b/lib/textures/TextureProxyBase.js new file mode 100755 index 00000000..914b85aa --- /dev/null +++ b/lib/textures/TextureProxyBase.js @@ -0,0 +1,130 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetType = require("awayjs-core/lib/core/library/AssetType"); + +var NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); + +/** +* +*/ +var TextureProxyBase = (function (_super) { + __extends(TextureProxyBase, _super); + /** + * + */ + function TextureProxyBase(generateMipmaps) { + if (typeof generateMipmaps === "undefined") { generateMipmaps = false; } + _super.call(this); + this._pFormat = "bgra"; + this._textureData = new Array(); + + this._generateMipmaps = this._hasMipmaps = generateMipmaps; + } + Object.defineProperty(TextureProxyBase.prototype, "size", { + get: function () { + return this._pSize; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextureProxyBase.prototype, "hasMipmaps", { + get: function () { + return this._hasMipmaps; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextureProxyBase.prototype, "format", { + /** + * + * @returns {string} + */ + get: function () { + return this._pFormat; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(TextureProxyBase.prototype, "generateMipmaps", { + /** + * + * @returns {boolean} + */ + get: function () { + return this._generateMipmaps; + }, + set: function (value) { + if (this._generateMipmaps == value) + return; + + this._generateMipmaps = this._hasMipmaps = value; + + this.invalidateContent(); + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(TextureProxyBase.prototype, "assetType", { + /** + * + * @returns {string} + */ + get: function () { + return AssetType.TEXTURE; + }, + enumerable: true, + configurable: true + }); + + /** + * + */ + TextureProxyBase.prototype.invalidateContent = function () { + var len = this._textureData.length; + for (var i = 0; i < len; i++) + this._textureData[i].invalidate(); + }; + + /** + * + * @private + */ + TextureProxyBase.prototype.invalidateSize = function () { + while (this._textureData.length) + this._textureData[0].dispose(); + }; + + /** + * @inheritDoc + */ + TextureProxyBase.prototype.dispose = function () { + while (this._textureData.length) + this._textureData[0].dispose(); + }; + + TextureProxyBase.prototype._iAddTextureData = function (textureData) { + this._textureData.push(textureData); + + return textureData; + }; + + TextureProxyBase.prototype._iRemoveTextureData = function (textureData) { + this._textureData.splice(this._textureData.indexOf(textureData), 1); + + return textureData; + }; + return TextureProxyBase; +})(NamedAssetBase); + +module.exports = TextureProxyBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL1RleHR1cmVQcm94eUJhc2UudHMiXSwibmFtZXMiOlsiVGV4dHVyZVByb3h5QmFzZSIsIlRleHR1cmVQcm94eUJhc2UuY29uc3RydWN0b3IiLCJUZXh0dXJlUHJveHlCYXNlLmludmFsaWRhdGVDb250ZW50IiwiVGV4dHVyZVByb3h5QmFzZS5pbnZhbGlkYXRlU2l6ZSIsIlRleHR1cmVQcm94eUJhc2UuZGlzcG9zZSIsIlRleHR1cmVQcm94eUJhc2UuX2lBZGRUZXh0dXJlRGF0YSIsIlRleHR1cmVQcm94eUJhc2UuX2lSZW1vdmVUZXh0dXJlRGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsaUVBQXdFOztBQUV4RSwyRUFBaUY7O0FBR2pGOztFQUVHO0FBQ0g7SUFBK0JBLG1DQUFjQTtJQVc1Q0E7O01BREdBO0lBQ0hBLDBCQUFZQSxlQUErQkE7UUFBL0JDLDhDQUFBQSxlQUFlQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUUxQ0EsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFWUkEsS0FBT0EsUUFBUUEsR0FBVUEsTUFBTUEsQ0FBQUE7UUFHL0JBLEtBQVFBLFlBQVlBLEdBQXVCQSxJQUFJQSxLQUFLQSxDQUFlQSxDQUFDQSxDQUFDQTs7UUFTcEVBLElBQUlBLENBQUNBLGdCQUFnQkEsR0FBR0EsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsZUFBZUE7SUFDM0RBLENBQUNBO0lBRUREO1FBQUFBLEtBQUFBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE1BQU1BO1FBQ25CQSxDQUFDQTs7OztBQUFBQTtJQUVEQTtRQUFBQSxLQUFBQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxXQUFXQTtRQUN4QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFNREE7UUFBQUE7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxRQUFRQTtRQUNyQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFNREE7UUFBQUE7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxJQUFJQSxDQUFDQSxnQkFBZ0JBO1FBQzdCQSxDQUFDQTtRQUVEQSxLQUFBQSxVQUEyQkEsS0FBYUE7WUFFdkNBLElBQUlBLElBQUlBLENBQUNBLGdCQUFnQkEsSUFBSUEsS0FBS0E7Z0JBQ2pDQSxNQUFPQSxDQUFBQTs7WUFFUkEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxLQUFLQTs7WUFFaERBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7UUFDekJBLENBQUNBOzs7O0FBVkFBOztJQWdCREE7UUFBQUE7OztVQURHQTthQUNIQTtZQUVDQSxPQUFPQSxTQUFTQSxDQUFDQSxPQUFPQTtRQUN6QkEsQ0FBQ0E7Ozs7QUFBQUE7SUFLREE7O01BREdBO21EQUNIQTtRQUVDRSxJQUFJQSxHQUFHQSxHQUFVQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxNQUFNQTtRQUN6Q0EsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsR0FBR0EsRUFBRUEsQ0FBQ0EsRUFBRUE7WUFDbENBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBO0lBQ3BDQSxDQUFDQTs7SUFNREY7OztNQURHQTtnREFDSEE7UUFFQ0csT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsTUFBTUE7WUFDOUJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO0lBQ2pDQSxDQUFDQTs7SUFLREg7O01BREdBO3lDQUNIQTtRQUVDSSxPQUFPQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxNQUFNQTtZQUM5QkEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDakNBLENBQUNBOztJQUdESiw4Q0FBQUEsVUFBd0JBLFdBQXdCQTtRQUUvQ0ssSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7O1FBRW5DQSxPQUFPQSxXQUFXQTtJQUNuQkEsQ0FBQ0E7O0lBRURMLGlEQUFBQSxVQUEyQkEsV0FBd0JBO1FBRWxETSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxPQUFPQSxDQUFDQSxXQUFXQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTs7UUFFbkVBLE9BQU9BLFdBQVdBO0lBQ25CQSxDQUFDQTtJQUNGTix3QkFBQ0E7QUFBREEsQ0FBQ0EsRUE1RzhCLGNBQWMsRUE0RzVDOztBQUVELGlDQUEwQixDQUFBIiwiZmlsZSI6InRleHR1cmVzL1RleHR1cmVQcm94eUJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXNzZXRUeXBlXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0VHlwZVwiKTtcbmltcG9ydCBJQXNzZXRcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9JQXNzZXRcIik7XG5pbXBvcnQgTmFtZWRBc3NldEJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L05hbWVkQXNzZXRCYXNlXCIpO1xuaW1wb3J0IElUZXh0dXJlRGF0YVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcG9vbC9JVGV4dHVyZURhdGFcIik7XG5cbi8qKlxuICpcbiAqL1xuY2xhc3MgVGV4dHVyZVByb3h5QmFzZSBleHRlbmRzIE5hbWVkQXNzZXRCYXNlIGltcGxlbWVudHMgSUFzc2V0XG57XG5cdHB1YmxpYyBfcFNpemU6bnVtYmVyO1xuXHRwdWJsaWMgX3BGb3JtYXQ6c3RyaW5nID0gXCJiZ3JhXCJcblx0cHJpdmF0ZSBfaGFzTWlwbWFwczpib29sZWFuO1xuXHRwcml2YXRlIF9nZW5lcmF0ZU1pcG1hcHM6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfdGV4dHVyZURhdGE6QXJyYXk8SVRleHR1cmVEYXRhPiA9IG5ldyBBcnJheTxJVGV4dHVyZURhdGE+KCk7XG5cdFxuXHQvKipcblx0ICpcblx0ICovXG5cdGNvbnN0cnVjdG9yKGdlbmVyYXRlTWlwbWFwczpib29sZWFuID0gZmFsc2UpXG5cdHtcblx0XHRzdXBlcigpO1xuXG5cdFx0dGhpcy5fZ2VuZXJhdGVNaXBtYXBzID0gdGhpcy5faGFzTWlwbWFwcyA9IGdlbmVyYXRlTWlwbWFwcztcblx0fVxuXG5cdHB1YmxpYyBnZXQgc2l6ZSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX3BTaXplO1xuXHR9XG5cblx0cHVibGljIGdldCBoYXNNaXBtYXBzKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2hhc01pcG1hcHM7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogQHJldHVybnMge3N0cmluZ31cblx0ICovXG5cdHB1YmxpYyBnZXQgZm9ybWF0KCk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gdGhpcy5fcEZvcm1hdDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdHB1YmxpYyBnZXQgZ2VuZXJhdGVNaXBtYXBzKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2dlbmVyYXRlTWlwbWFwcztcblx0fVxuXG5cdHB1YmxpYyBzZXQgZ2VuZXJhdGVNaXBtYXBzKHZhbHVlOmJvb2xlYW4pXG5cdHtcblx0XHRpZiAodGhpcy5fZ2VuZXJhdGVNaXBtYXBzID09IHZhbHVlKVxuXHRcdFx0cmV0dXJuO1xuXG5cdFx0dGhpcy5fZ2VuZXJhdGVNaXBtYXBzID0gdGhpcy5faGFzTWlwbWFwcyA9IHZhbHVlO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlQ29udGVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtzdHJpbmd9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0IGFzc2V0VHlwZSgpOnN0cmluZ1xuXHR7XG5cdFx0cmV0dXJuIEFzc2V0VHlwZS5URVhUVVJFO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgaW52YWxpZGF0ZUNvbnRlbnQoKTp2b2lkXG5cdHtcblx0XHR2YXIgbGVuOm51bWJlciA9IHRoaXMuX3RleHR1cmVEYXRhLmxlbmd0aFxuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKVxuXHRcdFx0dGhpcy5fdGV4dHVyZURhdGFbaV0uaW52YWxpZGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwdWJsaWMgaW52YWxpZGF0ZVNpemUoKTp2b2lkXG5cdHtcblx0XHR3aGlsZSAodGhpcy5fdGV4dHVyZURhdGEubGVuZ3RoKVxuXHRcdFx0dGhpcy5fdGV4dHVyZURhdGFbMF0uZGlzcG9zZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgZGlzcG9zZSgpXG5cdHtcblx0XHR3aGlsZSAodGhpcy5fdGV4dHVyZURhdGEubGVuZ3RoKVxuXHRcdFx0dGhpcy5fdGV4dHVyZURhdGFbMF0uZGlzcG9zZSgpO1xuXHR9XG5cblxuXHRwdWJsaWMgX2lBZGRUZXh0dXJlRGF0YSh0ZXh0dXJlRGF0YTpJVGV4dHVyZURhdGEpOklUZXh0dXJlRGF0YVxuXHR7XG5cdFx0dGhpcy5fdGV4dHVyZURhdGEucHVzaCh0ZXh0dXJlRGF0YSk7XG5cblx0XHRyZXR1cm4gdGV4dHVyZURhdGE7XG5cdH1cblxuXHRwdWJsaWMgX2lSZW1vdmVUZXh0dXJlRGF0YSh0ZXh0dXJlRGF0YTpJVGV4dHVyZURhdGEpOklUZXh0dXJlRGF0YVxuXHR7XG5cdFx0dGhpcy5fdGV4dHVyZURhdGEuc3BsaWNlKHRoaXMuX3RleHR1cmVEYXRhLmluZGV4T2YodGV4dHVyZURhdGEpLCAxKTtcblxuXHRcdHJldHVybiB0ZXh0dXJlRGF0YTtcblx0fVxufVxuXG5leHBvcnQgPSBUZXh0dXJlUHJveHlCYXNlOyJdfQ== \ No newline at end of file diff --git a/lib/textures/TextureProxyBase.ts b/lib/textures/TextureProxyBase.ts new file mode 100644 index 00000000..a79a31a5 --- /dev/null +++ b/lib/textures/TextureProxyBase.ts @@ -0,0 +1,119 @@ +import AssetType = require("awayjs-core/lib/core/library/AssetType"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import NamedAssetBase = require("awayjs-core/lib/core/library/NamedAssetBase"); +import ITextureData = require("awayjs-core/lib/core/pool/ITextureData"); + +/** + * + */ +class TextureProxyBase extends NamedAssetBase implements IAsset +{ + public _pSize:number; + public _pFormat:string = "bgra" + private _hasMipmaps:boolean; + private _generateMipmaps:boolean; + private _textureData:Array = new Array(); + + /** + * + */ + constructor(generateMipmaps:boolean = false) + { + super(); + + this._generateMipmaps = this._hasMipmaps = generateMipmaps; + } + + public get size():number + { + return this._pSize; + } + + public get hasMipmaps():boolean + { + return this._hasMipmaps; + } + + /** + * + * @returns {string} + */ + public get format():string + { + return this._pFormat; + } + + /** + * + * @returns {boolean} + */ + public get generateMipmaps():boolean + { + return this._generateMipmaps; + } + + public set generateMipmaps(value:boolean) + { + if (this._generateMipmaps == value) + return; + + this._generateMipmaps = this._hasMipmaps = value; + + this.invalidateContent(); + } + + /** + * + * @returns {string} + */ + public get assetType():string + { + return AssetType.TEXTURE; + } + + /** + * + */ + public invalidateContent():void + { + var len:number = this._textureData.length + for (var i:number = 0; i < len; i++) + this._textureData[i].invalidate(); + } + + /** + * + * @private + */ + public invalidateSize():void + { + while (this._textureData.length) + this._textureData[0].dispose(); + } + + /** + * @inheritDoc + */ + public dispose() + { + while (this._textureData.length) + this._textureData[0].dispose(); + } + + + public _iAddTextureData(textureData:ITextureData):ITextureData + { + this._textureData.push(textureData); + + return textureData; + } + + public _iRemoveTextureData(textureData:ITextureData):ITextureData + { + this._textureData.splice(this._textureData.indexOf(textureData), 1); + + return textureData; + } +} + +export = TextureProxyBase; \ No newline at end of file diff --git a/lib/utils/ByteArray.js b/lib/utils/ByteArray.js new file mode 100755 index 00000000..fccbb31a --- /dev/null +++ b/lib/utils/ByteArray.js @@ -0,0 +1,276 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ByteArrayBase = require("awayjs-core/lib/utils/ByteArrayBase"); + +var ByteArray = (function (_super) { + __extends(ByteArray, _super); + function ByteArray() { + _super.call(this); + this.maxlength = 0; + this._mode = "Typed array"; + this.maxlength = 4; + this.arraybytes = new ArrayBuffer(this.maxlength); + this.unalignedarraybytestemp = new ArrayBuffer(16); + } + ByteArray.prototype.ensureWriteableSpace = function (n) { + this.ensureSpace(n + this.position); + }; + + ByteArray.prototype.setArrayBuffer = function (aBuffer) { + this.ensureSpace(aBuffer.byteLength); + + this.length = aBuffer.byteLength; + + var inInt8AView = new Int8Array(aBuffer); + var localInt8View = new Int8Array(this.arraybytes, 0, this.length); + + localInt8View.set(inInt8AView); + + this.position = 0; + }; + + ByteArray.prototype.getBytesAvailable = function () { + return (this.length) - (this.position); + }; + + ByteArray.prototype.ensureSpace = function (n) { + if (n > this.maxlength) { + var newmaxlength = (n + 255) & (~255); + var newarraybuffer = new ArrayBuffer(newmaxlength); + var view = new Uint8Array(this.arraybytes, 0, this.length); + var newview = new Uint8Array(newarraybuffer, 0, this.length); + newview.set(view); // memcpy + this.arraybytes = newarraybuffer; + this.maxlength = newmaxlength; + } + }; + + ByteArray.prototype.writeByte = function (b) { + this.ensureWriteableSpace(1); + var view = new Int8Array(this.arraybytes); + view[this.position++] = (~~b); // ~~ is cast to int in js... + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readByte = function () { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + var view = new Int8Array(this.arraybytes); + + return view[this.position++]; + }; + + ByteArray.prototype.readBytes = function (bytes, offset, length) { + if (typeof offset === "undefined") { offset = 0; } + if (typeof length === "undefined") { length = 0; } + if (length == null) { + length = bytes.length; + } + + bytes.ensureWriteableSpace(offset + length); + + var byteView = new Int8Array(bytes.arraybytes); + var localByteView = new Int8Array(this.arraybytes); + + byteView.set(localByteView.subarray(this.position, this.position + length), offset); + + this.position += length; + + if (length + offset > bytes.length) { + bytes.length += (length + offset) - bytes.length; + } + }; + + ByteArray.prototype.writeUnsignedByte = function (b) { + this.ensureWriteableSpace(1); + var view = new Uint8Array(this.arraybytes); + view[this.position++] = (~~b) & 0xff; // ~~ is cast to int in js... + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readUnsignedByte = function () { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + var view = new Uint8Array(this.arraybytes); + return view[this.position++]; + }; + + ByteArray.prototype.writeUnsignedShort = function (b) { + this.ensureWriteableSpace(2); + if ((this.position & 1) == 0) { + var view = new Uint16Array(this.arraybytes); + view[this.position >> 1] = (~~b) & 0xffff; // ~~ is cast to int in js... + } else { + var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); + view[0] = (~~b) & 0xffff; + var view2 = new Uint8Array(this.arraybytes, this.position, 2); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); + view2.set(view3); + } + this.position += 2; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readUTFBytes = function (len) { + var value = ""; + var max = this.position + len; + var data = new DataView(this.arraybytes); + + while (this.position < max) { + var c = data.getUint8(this.position++); + + if (c < 0x80) { + if (c == 0) + break; + value += String.fromCharCode(c); + } else if (c < 0xE0) { + value += String.fromCharCode(((c & 0x3F) << 6) | (data.getUint8(this.position++) & 0x7F)); + } else if (c < 0xF0) { + var c2 = data.getUint8(this.position++); + value += String.fromCharCode(((c & 0x1F) << 12) | ((c2 & 0x7F) << 6) | (data.getUint8(this.position++) & 0x7F)); + } else { + var c2 = data.getUint8(this.position++); + var c3 = data.getUint8(this.position++); + + value += String.fromCharCode(((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 << 6) & 0x7F) | (data.getUint8(this.position++) & 0x7F)); + } + } + + return value; + }; + + ByteArray.prototype.readInt = function () { + var data = new DataView(this.arraybytes); + var int = data.getInt32(this.position, true); + + this.position += 4; + + return int; + }; + + ByteArray.prototype.readShort = function () { + var data = new DataView(this.arraybytes); + var short = data.getInt16(this.position, true); + + this.position += 2; + return short; + }; + + ByteArray.prototype.readDouble = function () { + var data = new DataView(this.arraybytes); + var double = data.getFloat64(this.position, true); + + this.position += 8; + return double; + }; + + ByteArray.prototype.readUnsignedShort = function () { + if (this.position > this.length + 2) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + if ((this.position & 1) == 0) { + var view = new Uint16Array(this.arraybytes); + var pa = this.position >> 1; + this.position += 2; + return view[pa]; + } else { + var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 2); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); + view3.set(view2); + this.position += 2; + return view[0]; + } + }; + + ByteArray.prototype.writeUnsignedInt = function (b) { + this.ensureWriteableSpace(4); + if ((this.position & 3) == 0) { + var view = new Uint32Array(this.arraybytes); + view[this.position >> 2] = (~~b) & 0xffffffff; // ~~ is cast to int in js... + } else { + var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); + view[0] = (~~b) & 0xffffffff; + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view2.set(view3); + } + this.position += 4; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readUnsignedInt = function () { + if (this.position > this.length + 4) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + if ((this.position & 3) == 0) { + var view = new Uint32Array(this.arraybytes); + var pa = this.position >> 2; + this.position += 4; + return view[pa]; + } else { + var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view3.set(view2); + this.position += 4; + return view[0]; + } + }; + + ByteArray.prototype.writeFloat = function (b) { + this.ensureWriteableSpace(4); + if ((this.position & 3) == 0) { + var view = new Float32Array(this.arraybytes); + view[this.position >> 2] = b; + } else { + var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); + view[0] = b; + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view2.set(view3); + } + this.position += 4; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArray.prototype.readFloat = function () { + if (this.position > this.length + 4) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + if ((this.position & 3) == 0) { + var view = new Float32Array(this.arraybytes); + var pa = this.position >> 2; + this.position += 4; + return view[pa]; + } else { + var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view3.set(view2); + this.position += 4; + return view[0]; + } + }; + return ByteArray; +})(ByteArrayBase); + +module.exports = ByteArray; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0J5dGVBcnJheS50cyJdLCJuYW1lcyI6WyJCeXRlQXJyYXkiLCJCeXRlQXJyYXkuY29uc3RydWN0b3IiLCJCeXRlQXJyYXkuZW5zdXJlV3JpdGVhYmxlU3BhY2UiLCJCeXRlQXJyYXkuc2V0QXJyYXlCdWZmZXIiLCJCeXRlQXJyYXkuZ2V0Qnl0ZXNBdmFpbGFibGUiLCJCeXRlQXJyYXkuZW5zdXJlU3BhY2UiLCJCeXRlQXJyYXkud3JpdGVCeXRlIiwiQnl0ZUFycmF5LnJlYWRCeXRlIiwiQnl0ZUFycmF5LnJlYWRCeXRlcyIsIkJ5dGVBcnJheS53cml0ZVVuc2lnbmVkQnl0ZSIsIkJ5dGVBcnJheS5yZWFkVW5zaWduZWRCeXRlIiwiQnl0ZUFycmF5LndyaXRlVW5zaWduZWRTaG9ydCIsIkJ5dGVBcnJheS5yZWFkVVRGQnl0ZXMiLCJCeXRlQXJyYXkucmVhZEludCIsIkJ5dGVBcnJheS5yZWFkU2hvcnQiLCJCeXRlQXJyYXkucmVhZERvdWJsZSIsIkJ5dGVBcnJheS5yZWFkVW5zaWduZWRTaG9ydCIsIkJ5dGVBcnJheS53cml0ZVVuc2lnbmVkSW50IiwiQnl0ZUFycmF5LnJlYWRVbnNpZ25lZEludCIsIkJ5dGVBcnJheS53cml0ZUZsb2F0IiwiQnl0ZUFycmF5LnJlYWRGbG9hdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsa0VBQXdFOztBQUV4RTtJQUF3QkEsNEJBQWFBO0lBTXBDQTtRQUVDQyxXQUFNQSxLQUFBQSxDQUFDQTtRQU5SQSxLQUFPQSxTQUFTQSxHQUFVQSxDQUFDQSxDQUFDQTtRQU8zQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsYUFBYUE7UUFDMUJBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBO1FBQ2xCQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtRQUNqREEsSUFBSUEsQ0FBQ0EsdUJBQXVCQSxHQUFHQSxJQUFJQSxXQUFXQSxDQUFDQSxF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QUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFFQTtnQkFFYkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7b0JBQUVBLEtBQU1BLENBQUFBO2dCQUNsQkEsS0FBS0EsSUFBSUEsTUFBTUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFFL0JBLE1BQU1BLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUVBO2dCQUVwQkEsS0FBS0EsSUFBSUEsTUFBTUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFFekZBLE1BQU1BLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUVBO2dCQUVwQkEsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0E7Z0JBQ3ZDQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQTthQUUvR0EsS0FBTUE7Z0JBRU5BLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2dCQUN2Q0EsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFB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Q0EsQ0FBQ0E7WUFDOURBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBO1lBQ2hCQSxJQUFJQSxDQUFDQSxRQUFRQSxJQUFJQSxDQUFDQTtZQUNsQkEsT0FBT0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDZEE7SUFDRkEsQ0FBQ0E7O0lBRURoQix1Q0FBQUEsVUFBd0JBLENBQVFBO1FBRS9CaUIsSUFBSUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUM1QkEsSUFBSUEsQ0FBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsQ0FBQ0EsQ0FBRUEsSUFBSUEsQ0FBQ0EsQ0FBRUE7WUFDL0JBLElBQUlBLElBQUlBLEdBQUdBLElBQUlBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBO1lBQzNDQSxJQUFJQSxDQUFFQSxJQUFJQSxDQUFDQSxRQUFRQSxJQUFJQSxDQUFDQSxDQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxVQUFVQSxFQUFFQSw2QkFBNkJBO1NBQzlFQSxLQUFNQTtZQUNOQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSx1QkFBdUJBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1lBQzlEQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxVQUFVQTtZQUM1QkEsSUFBSUEsS0FBS0EsR0FBR0EsSUFBSUEsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7WUFDN0RBLElBQUlBLEtBQUtBLEdBQUdBLElBQUlBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLHVCQUF1QkEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7WUFDOURBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBO1NB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LElBQUlBLENBQUNBO1lBQ2xCQSxPQUFPQSxJQUFJQSxDQUFFQSxDQUFDQSxDQUFFQTtTQUNoQkE7SUFDRkEsQ0FBQ0E7SUFDRnBCLGlCQUFDQTtBQUFEQSxDQUFDQSxFQWxUdUIsYUFBYSxFQWtUcEM7O0FBRUQsMEJBQW1CLENBQUEiLCJmaWxlIjoidXRpbHMvQnl0ZUFycmF5LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ5dGVBcnJheUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvQnl0ZUFycmF5QmFzZVwiKTtcblxuY2xhc3MgQnl0ZUFycmF5IGV4dGVuZHMgQnl0ZUFycmF5QmFzZVxue1xuXHRwdWJsaWMgbWF4bGVuZ3RoOm51bWJlciA9IDA7XG5cdHB1YmxpYyBhcnJheWJ5dGVzOyAvL0FycmF5QnVmZmVyXG5cdHB1YmxpYyB1bmFsaWduZWRhcnJheWJ5dGVzdGVtcDsgLy9BcnJheUJ1ZmZlclxuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHN1cGVyKCk7XG5cdFx0dGhpcy5fbW9kZSA9IFwiVHlwZWQgYXJyYXlcIjtcblx0XHR0aGlzLm1heGxlbmd0aCA9IDQ7XG5cdFx0dGhpcy5hcnJheWJ5dGVzID0gbmV3IEFycmF5QnVmZmVyKHRoaXMubWF4bGVuZ3RoKTtcblx0XHR0aGlzLnVuYWxpZ25lZGFycmF5Ynl0ZXN0ZW1wID0gbmV3IEFycmF5QnVmZmVyKDE2KTtcblx0fVxuXG5cdHB1YmxpYyBlbnN1cmVXcml0ZWFibGVTcGFjZShuOm51bWJlcilcblx0e1xuXHRcdHRoaXMuZW5zdXJlU3BhY2UobiArIHRoaXMucG9zaXRpb24pO1xuXHR9XG5cblx0cHVibGljIHNldEFycmF5QnVmZmVyKGFCdWZmZXI6QXJyYXlCdWZmZXIpOnZvaWRcblx0e1xuXG5cdFx0dGhpcy5lbnN1cmVTcGFjZShhQnVmZmVyLmJ5dGVMZW5ndGgpO1xuXG5cdFx0dGhpcy5sZW5ndGggPSBhQnVmZmVyLmJ5dGVMZW5ndGg7XG5cblx0XHR2YXIgaW5JbnQ4QVZpZXc6SW50OEFycmF5ID0gbmV3IEludDhBcnJheShhQnVmZmVyKTtcblx0XHR2YXIgbG9jYWxJbnQ4VmlldzpJbnQ4QXJyYXkgPSBuZXcgSW50OEFycmF5KHRoaXMuYXJyYXlieXRlcywgMCwgdGhpcy5sZW5ndGgpO1xuXG5cdFx0bG9jYWxJbnQ4Vmlldy5zZXQoaW5JbnQ4QVZpZXcpO1xuXG5cdFx0dGhpcy5wb3NpdGlvbiA9IDA7XG5cblx0fVxuXG5cdHB1YmxpYyBnZXRCeXRlc0F2YWlsYWJsZSgpOm51bWJlclxuXHR7XG5cdFx0cmV0dXJuICggdGhpcy5sZW5ndGggKSAtICggdGhpcy5wb3NpdGlvbiApO1xuXHR9XG5cblx0cHVibGljIGVuc3VyZVNwYWNlKG46bnVtYmVyKVxuXHR7XG5cdFx0aWYgKG4gPiB0aGlzLm1heGxlbmd0aCkge1xuXHRcdFx0dmFyIG5ld21heGxlbmd0aDpudW1iZXIgPSAobiArIDI1NSkgJiAofjI1NSk7XG5cdFx0XHR2YXIgbmV3YXJyYXlidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobmV3bWF4bGVuZ3RoKTtcblx0XHRcdHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheWJ5dGVzLCAwLCB0aGlzLmxlbmd0aCk7XG5cdFx0XHR2YXIgbmV3dmlldyA9IG5ldyBVaW50OEFycmF5KG5ld2FycmF5YnVmZmVyLCAwLCB0aGlzLmxlbmd0aCk7XG5cdFx0XHRuZXd2aWV3LnNldCh2aWV3KTsgICAgICAvLyBtZW1jcHlcblx0XHRcdHRoaXMuYXJyYXlieXRlcyA9IG5ld2FycmF5YnVmZmVyO1xuXHRcdFx0dGhpcy5tYXhsZW5ndGggPSBuZXdtYXhsZW5ndGg7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHdyaXRlQnl0ZShiOm51bWJlcilcblx0e1xuXHRcdHRoaXMuZW5zdXJlV3JpdGVhYmxlU3BhY2UoMSk7XG5cdFx0dmFyIHZpZXcgPSBuZXcgSW50OEFycmF5KHRoaXMuYXJyYXlieXRlcyk7XG5cdFx0dmlld1sgdGhpcy5wb3NpdGlvbisrIF0gPSAofn5iKTsgLy8gfn4gaXMgY2FzdCB0byBpbnQgaW4ganMuLi5cblx0XHRpZiAodGhpcy5wb3NpdGlvbiA+IHRoaXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IHRoaXMucG9zaXRpb247XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHJlYWRCeXRlKClcblx0e1xuXHRcdGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMubGVuZ3RoKSB7XG5cdFx0XHR0aHJvdyBcIkJ5dGVBcnJheSBvdXQgb2YgYm91bmRzIHJlYWQuIFBvc2l0b249XCIgKyB0aGlzLnBvc2l0aW9uICsgXCIsIExlbmd0aD1cIiArIHRoaXMubGVuZ3RoO1xuXHRcdH1cblx0XHR2YXIgdmlldyA9IG5ldyBJbnQ4QXJyYXkodGhpcy5hcnJheWJ5dGVzKTtcblxuXHRcdHJldHVybiB2aWV3WyB0aGlzLnBvc2l0aW9uKysgXTtcblx0fVxuXG5cdHB1YmxpYyByZWFkQnl0ZXMoYnl0ZXM6Qnl0ZUFycmF5LCBvZmZzZXQ6bnVtYmVyID0gMCwgbGVuZ3RoOm51bWJlciA9IDApXG5cdHtcblxuXHRcdGlmIChsZW5ndGggPT0gbnVsbCkge1xuXHRcdFx0bGVuZ3RoID0gYnl0ZXMubGVuZ3RoO1xuXHRcdH1cblxuXHRcdGJ5dGVzLmVuc3VyZVdyaXRlYWJsZVNwYWNlKG9mZnNldCArIGxlbmd0aCk7XG5cblx0XHR2YXIgYnl0ZVZpZXc6SW50OEFycmF5ID0gbmV3IEludDhBcnJheShieXRlcy5hcnJheWJ5dGVzKTtcblx0XHR2YXIgbG9jYWxCeXRlVmlldzpJbnQ4QXJyYXkgPSBuZXcgSW50OEFycmF5KHRoaXMuYXJyYXlieXRlcyk7XG5cblx0XHRieXRlVmlldy5zZXQobG9jYWxCeXRlVmlldy5zdWJhcnJheSh0aGlzLnBvc2l0aW9uLCB0aGlzLnBvc2l0aW9uICsgbGVuZ3RoKSwgb2Zmc2V0KTtcblxuXHRcdHRoaXMucG9zaXRpb24gKz0gbGVuZ3RoO1xuXG5cdFx0aWYgKGxlbmd0aCArIG9mZnNldCA+IGJ5dGVzLmxlbmd0aCkge1xuXHRcdFx0Ynl0ZXMubGVuZ3RoICs9ICggbGVuZ3RoICsgb2Zmc2V0ICkgLSBieXRlcy5sZW5ndGg7XG5cdFx0fVxuXG5cdH1cblxuXHRwdWJsaWMgd3JpdGVVbnNpZ25lZEJ5dGUoYjpudW1iZXIpXG5cdHtcblx0XHR0aGlzLmVuc3VyZVdyaXRlYWJsZVNwYWNlKDEpO1xuXHRcdHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheWJ5dGVzKTtcblx0XHR2aWV3W3RoaXMucG9zaXRpb24rK10gPSAofn5iKSAmIDB4ZmY7IC8vIH5+IGlzIGNhc3QgdG8gaW50IGluIGpzLi4uXG5cdFx0aWYgKHRoaXMucG9zaXRpb24gPiB0aGlzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5sZW5ndGggPSB0aGlzLnBvc2l0aW9uO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyByZWFkVW5zaWduZWRCeXRlKClcblx0e1xuXHRcdGlmICh0aGlzLnBvc2l0aW9uID49IHRoaXMubGVuZ3RoKSB7XG5cdFx0XHR0aHJvdyBcIkJ5dGVBcnJheSBvdXQgb2YgYm91bmRzIHJlYWQuIFBvc2l0b249XCIgKyB0aGlzLnBvc2l0aW9uICsgXCIsIExlbmd0aD1cIiArIHRoaXMubGVuZ3RoO1xuXHRcdH1cblx0XHR2YXIgdmlldyA9IG5ldyBVaW50OEFycmF5KHRoaXMuYXJyYXlieXRlcyk7XG5cdFx0cmV0dXJuIHZpZXdbdGhpcy5wb3NpdGlvbisrXTtcblx0fVxuXG5cdHB1YmxpYyB3cml0ZVVuc2lnbmVkU2hvcnQoYjpudW1iZXIpXG5cdHtcblx0XHR0aGlzLmVuc3VyZVdyaXRlYWJsZVNwYWNlKDIpO1xuXHRcdGlmICgoIHRoaXMucG9zaXRpb24gJiAxICkgPT0gMCkge1xuXHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheWJ5dGVzKTtcblx0XHRcdHZpZXdbIHRoaXMucG9zaXRpb24gPj4gMSBdID0gKH5+YikgJiAweGZmZmY7IC8vIH5+IGlzIGNhc3QgdG8gaW50IGluIGpzLi4uXG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciB2aWV3ID0gbmV3IFVpbnQxNkFycmF5KHRoaXMudW5hbGlnbmVkYXJyYXlieXRlc3RlbXAsIDAsIDEpO1xuXHRcdFx0dmlld1swXSA9ICh+fmIpICYgMHhmZmZmO1xuXHRcdFx0dmFyIHZpZXcyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheWJ5dGVzLCB0aGlzLnBvc2l0aW9uLCAyKTtcblx0XHRcdHZhciB2aWV3MyA9IG5ldyBVaW50OEFycmF5KHRoaXMudW5hbGlnbmVkYXJyYXlieXRlc3RlbXAsIDAsIDIpO1xuXHRcdFx0dmlldzIuc2V0KHZpZXczKTtcblx0XHR9XG5cdFx0dGhpcy5wb3NpdGlvbiArPSAyO1xuXHRcdGlmICh0aGlzLnBvc2l0aW9uID4gdGhpcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMubGVuZ3RoID0gdGhpcy5wb3NpdGlvbjtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgcmVhZFVURkJ5dGVzKGxlbjpudW1iZXIpOnN0cmluZ1xuXHR7XG5cblx0XHR2YXIgdmFsdWU6c3RyaW5nID0gXCJcIjtcblx0XHR2YXIgbWF4Om51bWJlciA9IHRoaXMucG9zaXRpb24gKyBsZW47XG5cdFx0dmFyIGRhdGE6RGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5hcnJheWJ5dGVzKTtcblxuXHRcdC8vIHV0ZjgtZW5jb2RlXG5cdFx0d2hpbGUgKHRoaXMucG9zaXRpb24gPCBtYXgpIHtcblxuXHRcdFx0dmFyIGM6bnVtYmVyID0gZGF0YS5nZXRVaW50OCh0aGlzLnBvc2l0aW9uKyspO1xuXG5cdFx0XHRpZiAoYyA8IDB4ODApIHtcblxuXHRcdFx0XHRpZiAoYyA9PSAwKSBicmVhaztcblx0XHRcdFx0dmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjKTtcblxuXHRcdFx0fSBlbHNlIGlmIChjIDwgMHhFMCkge1xuXG5cdFx0XHRcdHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoKChjICYgMHgzRikgPDwgNikgfCAoZGF0YS5nZXRVaW50OCh0aGlzLnBvc2l0aW9uKyspICYgMHg3RikpO1xuXG5cdFx0XHR9IGVsc2UgaWYgKGMgPCAweEYwKSB7XG5cblx0XHRcdFx0dmFyIGMyID0gZGF0YS5nZXRVaW50OCh0aGlzLnBvc2l0aW9uKyspO1xuXHRcdFx0XHR2YWx1ZSArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKCgoYyAmIDB4MUYpIDw8IDEyKSB8ICgoYzIgJiAweDdGKSA8PCA2KSB8IChkYXRhLmdldFVpbnQ4KHRoaXMucG9zaXRpb24rKykgJiAweDdGKSk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0dmFyIGMyID0gZGF0YS5nZXRVaW50OCh0aGlzLnBvc2l0aW9uKyspO1xuXHRcdFx0XHR2YXIgYzMgPSBkYXRhLmdldFVpbnQ4KHRoaXMucG9zaXRpb24rKyk7XG5cblx0XHRcdFx0dmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgJiAweDBGKSA8PCAxOCkgfCAoKGMyICYgMHg3RikgPDwgMTIpIHwgKChjMyA8PCA2KSAmIDB4N0YpIHwgKGRhdGEuZ2V0VWludDgodGhpcy5wb3NpdGlvbisrKSAmIDB4N0YpKTtcblxuXHRcdFx0fVxuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXG5cdH1cblxuXHRwdWJsaWMgcmVhZEludCgpOm51bWJlclxuXHR7XG5cblx0XHR2YXIgZGF0YTpEYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmFycmF5Ynl0ZXMpO1xuXHRcdHZhciBpbnQ6bnVtYmVyID0gZGF0YS5nZXRJbnQzMih0aGlzLnBvc2l0aW9uLCB0cnVlKTtcblxuXHRcdHRoaXMucG9zaXRpb24gKz0gNDtcblxuXHRcdHJldHVybiBpbnQ7XG5cblx0fVxuXG5cdHB1YmxpYyByZWFkU2hvcnQoKTpudW1iZXJcblx0e1xuXG5cdFx0dmFyIGRhdGE6RGF0YVZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5hcnJheWJ5dGVzKTtcblx0XHR2YXIgc2hvcnQ6bnVtYmVyID0gZGF0YS5nZXRJbnQxNih0aGlzLnBvc2l0aW9uLCB0cnVlKTtcblxuXHRcdHRoaXMucG9zaXRpb24gKz0gMjtcblx0XHRyZXR1cm4gc2hvcnQ7XG5cblx0fVxuXG5cdHB1YmxpYyByZWFkRG91YmxlKCk6bnVtYmVyXG5cdHtcblx0XHR2YXIgZGF0YTpEYXRhVmlldyA9IG5ldyBEYXRhVmlldyh0aGlzLmFycmF5Ynl0ZXMpO1xuXHRcdHZhciBkb3VibGU6bnVtYmVyID0gZGF0YS5nZXRGbG9hdDY0KHRoaXMucG9zaXRpb24sIHRydWUpO1xuXG5cdFx0dGhpcy5wb3NpdGlvbiArPSA4O1xuXHRcdHJldHVybiBkb3VibGU7XG5cblx0fVxuXG5cdHB1YmxpYyByZWFkVW5zaWduZWRTaG9ydCgpXG5cdHtcblx0XHRpZiAodGhpcy5wb3NpdGlvbiA+IHRoaXMubGVuZ3RoICsgMikge1xuXHRcdFx0dGhyb3cgXCJCeXRlQXJyYXkgb3V0IG9mIGJvdW5kcyByZWFkLiBQb3NpdGlvbj1cIiArIHRoaXMucG9zaXRpb24gKyBcIiwgTGVuZ3RoPVwiICsgdGhpcy5sZW5ndGg7XG5cdFx0fVxuXHRcdGlmICgoIHRoaXMucG9zaXRpb24gJiAxICkgPT0gMCkge1xuXHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDE2QXJyYXkodGhpcy5hcnJheWJ5dGVzKTtcblx0XHRcdHZhciBwYTpudW1iZXIgPSB0aGlzLnBvc2l0aW9uID4+IDE7XG5cdFx0XHR0aGlzLnBvc2l0aW9uICs9IDI7XG5cdFx0XHRyZXR1cm4gdmlld1sgcGEgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDE2QXJyYXkodGhpcy51bmFsaWduZWRhcnJheWJ5dGVzdGVtcCwgMCwgMSk7XG5cdFx0XHR2YXIgdmlldzIgPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5Ynl0ZXMsIHRoaXMucG9zaXRpb24sIDIpO1xuXHRcdFx0dmFyIHZpZXczID0gbmV3IFVpbnQ4QXJyYXkodGhpcy51bmFsaWduZWRhcnJheWJ5dGVzdGVtcCwgMCwgMik7XG5cdFx0XHR2aWV3My5zZXQodmlldzIpO1xuXHRcdFx0dGhpcy5wb3NpdGlvbiArPSAyO1xuXHRcdFx0cmV0dXJuIHZpZXdbMF07XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHdyaXRlVW5zaWduZWRJbnQoYjpudW1iZXIpXG5cdHtcblx0XHR0aGlzLmVuc3VyZVdyaXRlYWJsZVNwYWNlKDQpO1xuXHRcdGlmICgoIHRoaXMucG9zaXRpb24gJiAzICkgPT0gMCkge1xuXHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheWJ5dGVzKTtcblx0XHRcdHZpZXdbIHRoaXMucG9zaXRpb24gPj4gMiBdID0gKH5+YikgJiAweGZmZmZmZmZmOyAvLyB+fiBpcyBjYXN0IHRvIGludCBpbiBqcy4uLlxuXHRcdH0gZWxzZSB7XG5cdFx0XHR2YXIgdmlldyA9IG5ldyBVaW50MzJBcnJheSh0aGlzLnVuYWxpZ25lZGFycmF5Ynl0ZXN0ZW1wLCAwLCAxKTtcblx0XHRcdHZpZXdbMF0gPSAofn5iKSAmIDB4ZmZmZmZmZmY7XG5cdFx0XHR2YXIgdmlldzIgPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5Ynl0ZXMsIHRoaXMucG9zaXRpb24sIDQpO1xuXHRcdFx0dmFyIHZpZXczID0gbmV3IFVpbnQ4QXJyYXkodGhpcy51bmFsaWduZWRhcnJheWJ5dGVzdGVtcCwgMCwgNCk7XG5cdFx0XHR2aWV3Mi5zZXQodmlldzMpO1xuXHRcdH1cblx0XHR0aGlzLnBvc2l0aW9uICs9IDQ7XG5cdFx0aWYgKHRoaXMucG9zaXRpb24gPiB0aGlzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5sZW5ndGggPSB0aGlzLnBvc2l0aW9uO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyByZWFkVW5zaWduZWRJbnQoKVxuXHR7XG5cblx0XHRpZiAodGhpcy5wb3NpdGlvbiA+IHRoaXMubGVuZ3RoICsgNCkge1xuXHRcdFx0dGhyb3cgXCJCeXRlQXJyYXkgb3V0IG9mIGJvdW5kcyByZWFkLiBQb3NpdGlvbj1cIiArIHRoaXMucG9zaXRpb24gKyBcIiwgTGVuZ3RoPVwiICsgdGhpcy5sZW5ndGg7XG5cdFx0fVxuXHRcdGlmICgoIHRoaXMucG9zaXRpb24gJiAzICkgPT0gMCkge1xuXHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDMyQXJyYXkodGhpcy5hcnJheWJ5dGVzKTtcblx0XHRcdHZhciBwYTpudW1iZXIgPSB0aGlzLnBvc2l0aW9uID4+IDI7XG5cdFx0XHR0aGlzLnBvc2l0aW9uICs9IDQ7XG5cdFx0XHRyZXR1cm4gdmlld1sgcGEgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHZpZXcgPSBuZXcgVWludDMyQXJyYXkodGhpcy51bmFsaWduZWRhcnJheWJ5dGVzdGVtcCwgMCwgMSk7XG5cdFx0XHR2YXIgdmlldzIgPSBuZXcgVWludDhBcnJheSh0aGlzLmFycmF5Ynl0ZXMsIHRoaXMucG9zaXRpb24sIDQpO1xuXHRcdFx0dmFyIHZpZXczID0gbmV3IFVpbnQ4QXJyYXkodGhpcy51bmFsaWduZWRhcnJheWJ5dGVzdGVtcCwgMCwgNCk7XG5cdFx0XHR2aWV3My5zZXQodmlldzIpO1xuXHRcdFx0dGhpcy5wb3NpdGlvbiArPSA0O1xuXHRcdFx0cmV0dXJuIHZpZXdbMF07XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHdyaXRlRmxvYXQoYjpudW1iZXIpXG5cdHtcblx0XHR0aGlzLmVuc3VyZVdyaXRlYWJsZVNwYWNlKDQpO1xuXHRcdGlmICgoIHRoaXMucG9zaXRpb24gJiAzICkgPT0gMCkge1xuXHRcdFx0dmFyIHZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuYXJyYXlieXRlcyk7XG5cdFx0XHR2aWV3WyB0aGlzLnBvc2l0aW9uID4+IDIgXSA9IGI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciB2aWV3ID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLnVuYWxpZ25lZGFycmF5Ynl0ZXN0ZW1wLCAwLCAxKTtcblx0XHRcdHZpZXdbMF0gPSBiO1xuXHRcdFx0dmFyIHZpZXcyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheWJ5dGVzLCB0aGlzLnBvc2l0aW9uLCA0KTtcblx0XHRcdHZhciB2aWV3MyA9IG5ldyBVaW50OEFycmF5KHRoaXMudW5hbGlnbmVkYXJyYXlieXRlc3RlbXAsIDAsIDQpO1xuXHRcdFx0dmlldzIuc2V0KHZpZXczKTtcblx0XHR9XG5cdFx0dGhpcy5wb3NpdGlvbiArPSA0O1xuXHRcdGlmICh0aGlzLnBvc2l0aW9uID4gdGhpcy5sZW5ndGgpIHtcblx0XHRcdHRoaXMubGVuZ3RoID0gdGhpcy5wb3NpdGlvbjtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgcmVhZEZsb2F0KClcblx0e1xuXHRcdGlmICh0aGlzLnBvc2l0aW9uID4gdGhpcy5sZW5ndGggKyA0KSB7XG5cdFx0XHR0aHJvdyBcIkJ5dGVBcnJheSBvdXQgb2YgYm91bmRzIHJlYWQuIFBvc2l0b249XCIgKyB0aGlzLnBvc2l0aW9uICsgXCIsIExlbmd0aD1cIiArIHRoaXMubGVuZ3RoO1xuXHRcdH1cblx0XHRpZiAoKHRoaXMucG9zaXRpb24gJiAzKSA9PSAwKSB7XG5cdFx0XHR2YXIgdmlldyA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5hcnJheWJ5dGVzKTtcblx0XHRcdHZhciBwYSA9IHRoaXMucG9zaXRpb24gPj4gMjtcblx0XHRcdHRoaXMucG9zaXRpb24gKz0gNDtcblx0XHRcdHJldHVybiB2aWV3W3BhXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dmFyIHZpZXcgPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMudW5hbGlnbmVkYXJyYXlieXRlc3RlbXAsIDAsIDEpO1xuXHRcdFx0dmFyIHZpZXcyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheWJ5dGVzLCB0aGlzLnBvc2l0aW9uLCA0KTtcblx0XHRcdHZhciB2aWV3MyA9IG5ldyBVaW50OEFycmF5KHRoaXMudW5hbGlnbmVkYXJyYXlieXRlc3RlbXAsIDAsIDQpO1xuXHRcdFx0dmlldzMuc2V0KHZpZXcyKTtcblx0XHRcdHRoaXMucG9zaXRpb24gKz0gNDtcblx0XHRcdHJldHVybiB2aWV3WyAwIF07XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCA9IEJ5dGVBcnJheTsiXX0= \ No newline at end of file diff --git a/lib/utils/ByteArray.ts b/lib/utils/ByteArray.ts new file mode 100644 index 00000000..6e23bd4c --- /dev/null +++ b/lib/utils/ByteArray.ts @@ -0,0 +1,311 @@ +import ByteArrayBase = require("awayjs-core/lib/utils/ByteArrayBase"); + +class ByteArray extends ByteArrayBase +{ + public maxlength:number = 0; + public arraybytes; //ArrayBuffer + public unalignedarraybytestemp; //ArrayBuffer + + constructor() + { + super(); + this._mode = "Typed array"; + this.maxlength = 4; + this.arraybytes = new ArrayBuffer(this.maxlength); + this.unalignedarraybytestemp = new ArrayBuffer(16); + } + + public ensureWriteableSpace(n:number) + { + this.ensureSpace(n + this.position); + } + + public setArrayBuffer(aBuffer:ArrayBuffer):void + { + + this.ensureSpace(aBuffer.byteLength); + + this.length = aBuffer.byteLength; + + var inInt8AView:Int8Array = new Int8Array(aBuffer); + var localInt8View:Int8Array = new Int8Array(this.arraybytes, 0, this.length); + + localInt8View.set(inInt8AView); + + this.position = 0; + + } + + public getBytesAvailable():number + { + return ( this.length ) - ( this.position ); + } + + public ensureSpace(n:number) + { + if (n > this.maxlength) { + var newmaxlength:number = (n + 255) & (~255); + var newarraybuffer = new ArrayBuffer(newmaxlength); + var view = new Uint8Array(this.arraybytes, 0, this.length); + var newview = new Uint8Array(newarraybuffer, 0, this.length); + newview.set(view); // memcpy + this.arraybytes = newarraybuffer; + this.maxlength = newmaxlength; + } + } + + public writeByte(b:number) + { + this.ensureWriteableSpace(1); + var view = new Int8Array(this.arraybytes); + view[ this.position++ ] = (~~b); // ~~ is cast to int in js... + if (this.position > this.length) { + this.length = this.position; + } + } + + public readByte() + { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + var view = new Int8Array(this.arraybytes); + + return view[ this.position++ ]; + } + + public readBytes(bytes:ByteArray, offset:number = 0, length:number = 0) + { + + if (length == null) { + length = bytes.length; + } + + bytes.ensureWriteableSpace(offset + length); + + var byteView:Int8Array = new Int8Array(bytes.arraybytes); + var localByteView:Int8Array = new Int8Array(this.arraybytes); + + byteView.set(localByteView.subarray(this.position, this.position + length), offset); + + this.position += length; + + if (length + offset > bytes.length) { + bytes.length += ( length + offset ) - bytes.length; + } + + } + + public writeUnsignedByte(b:number) + { + this.ensureWriteableSpace(1); + var view = new Uint8Array(this.arraybytes); + view[this.position++] = (~~b) & 0xff; // ~~ is cast to int in js... + if (this.position > this.length) { + this.length = this.position; + } + } + + public readUnsignedByte() + { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + var view = new Uint8Array(this.arraybytes); + return view[this.position++]; + } + + public writeUnsignedShort(b:number) + { + this.ensureWriteableSpace(2); + if (( this.position & 1 ) == 0) { + var view = new Uint16Array(this.arraybytes); + view[ this.position >> 1 ] = (~~b) & 0xffff; // ~~ is cast to int in js... + } else { + var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); + view[0] = (~~b) & 0xffff; + var view2 = new Uint8Array(this.arraybytes, this.position, 2); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); + view2.set(view3); + } + this.position += 2; + if (this.position > this.length) { + this.length = this.position; + } + } + + public readUTFBytes(len:number):string + { + + var value:string = ""; + var max:number = this.position + len; + var data:DataView = new DataView(this.arraybytes); + + // utf8-encode + while (this.position < max) { + + var c:number = data.getUint8(this.position++); + + if (c < 0x80) { + + if (c == 0) break; + value += String.fromCharCode(c); + + } else if (c < 0xE0) { + + value += String.fromCharCode(((c & 0x3F) << 6) | (data.getUint8(this.position++) & 0x7F)); + + } else if (c < 0xF0) { + + var c2 = data.getUint8(this.position++); + value += String.fromCharCode(((c & 0x1F) << 12) | ((c2 & 0x7F) << 6) | (data.getUint8(this.position++) & 0x7F)); + + } else { + + var c2 = data.getUint8(this.position++); + var c3 = data.getUint8(this.position++); + + value += String.fromCharCode(((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 << 6) & 0x7F) | (data.getUint8(this.position++) & 0x7F)); + + } + + } + + return value; + + } + + public readInt():number + { + + var data:DataView = new DataView(this.arraybytes); + var int:number = data.getInt32(this.position, true); + + this.position += 4; + + return int; + + } + + public readShort():number + { + + var data:DataView = new DataView(this.arraybytes); + var short:number = data.getInt16(this.position, true); + + this.position += 2; + return short; + + } + + public readDouble():number + { + var data:DataView = new DataView(this.arraybytes); + var double:number = data.getFloat64(this.position, true); + + this.position += 8; + return double; + + } + + public readUnsignedShort() + { + if (this.position > this.length + 2) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + if (( this.position & 1 ) == 0) { + var view = new Uint16Array(this.arraybytes); + var pa:number = this.position >> 1; + this.position += 2; + return view[ pa ]; + } else { + var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 2); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); + view3.set(view2); + this.position += 2; + return view[0]; + } + } + + public writeUnsignedInt(b:number) + { + this.ensureWriteableSpace(4); + if (( this.position & 3 ) == 0) { + var view = new Uint32Array(this.arraybytes); + view[ this.position >> 2 ] = (~~b) & 0xffffffff; // ~~ is cast to int in js... + } else { + var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); + view[0] = (~~b) & 0xffffffff; + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view2.set(view3); + } + this.position += 4; + if (this.position > this.length) { + this.length = this.position; + } + } + + public readUnsignedInt() + { + + if (this.position > this.length + 4) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + if (( this.position & 3 ) == 0) { + var view = new Uint32Array(this.arraybytes); + var pa:number = this.position >> 2; + this.position += 4; + return view[ pa ]; + } else { + var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view3.set(view2); + this.position += 4; + return view[0]; + } + } + + public writeFloat(b:number) + { + this.ensureWriteableSpace(4); + if (( this.position & 3 ) == 0) { + var view = new Float32Array(this.arraybytes); + view[ this.position >> 2 ] = b; + } else { + var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); + view[0] = b; + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view2.set(view3); + } + this.position += 4; + if (this.position > this.length) { + this.length = this.position; + } + } + + public readFloat() + { + if (this.position > this.length + 4) { + throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; + } + if ((this.position & 3) == 0) { + var view = new Float32Array(this.arraybytes); + var pa = this.position >> 2; + this.position += 4; + return view[pa]; + } else { + var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); + var view2 = new Uint8Array(this.arraybytes, this.position, 4); + var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); + view3.set(view2); + this.position += 4; + return view[ 0 ]; + } + } +} + +export = ByteArray; \ No newline at end of file diff --git a/lib/utils/ByteArrayBase.js b/lib/utils/ByteArrayBase.js new file mode 100755 index 00000000..1ff3a961 --- /dev/null +++ b/lib/utils/ByteArrayBase.js @@ -0,0 +1,165 @@ +var AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +var ByteArrayBase = (function () { + function ByteArrayBase() { + this.position = 0; + this.length = 0; + this._mode = ""; + } + ByteArrayBase.prototype.writeByte = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readByte = function () { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.writeUnsignedByte = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readUnsignedByte = function () { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.writeUnsignedShort = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readUnsignedShort = function () { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.writeUnsignedInt = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readUnsignedInt = function () { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.writeFloat = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.toFloatBits = function (x) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.readFloat = function (b) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.fromFloatBits = function (x) { + throw "Virtual method"; + }; + + ByteArrayBase.prototype.getBytesAvailable = function () { + throw new AbstractMethodError('ByteArrayBase, getBytesAvailable() not implemented '); + }; + + ByteArrayBase.prototype.toString = function () { + return "[ByteArray] ( " + this._mode + " ) position=" + this.position + " length=" + this.length; + }; + + ByteArrayBase.prototype.compareEqual = function (other, count) { + if (count == undefined || count > this.length - this.position) + count = this.length - this.position; + if (count > other.length - other.position) + count = other.length - other.position; + var co0 = count; + var r = true; + while (r && count >= 4) { + count -= 4; + if (this.readUnsignedInt() != other.readUnsignedInt()) + r = false; + } + while (r && count >= 1) { + count--; + if (this.readUnsignedByte() != other.readUnsignedByte()) + r = false; + } + var c0; + this.position -= (c0 - count); + other.position -= (c0 - count); + return r; + }; + + ByteArrayBase.prototype.writeBase64String = function (s) { + for (var i = 0; i < s.length; i++) { + var v = s.charAt(i); + } + }; + + ByteArrayBase.prototype.dumpToConsole = function () { + var oldpos = this.position; + this.position = 0; + var nstep = 8; + + function asHexString(x, digits) { + var lut = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]; + var sh = ""; + for (var d = 0; d < digits; d++) { + sh = lut[(x >> (d << 2)) & 0xf] + sh; + } + return sh; + } + + for (var i = 0; i < this.length; i += nstep) { + var s = asHexString(i, 4) + ":"; + for (var j = 0; j < nstep && i + j < this.length; j++) { + s += " " + asHexString(this.readUnsignedByte(), 2); + } + console.log(s); + } + this.position = oldpos; + }; + + ByteArrayBase.prototype.readBase64String = function (count) { + if (count == undefined || count > this.length - this.position) + count = this.length - this.position; + if (!(count > 0)) + return ""; + + return ByteArrayBase.internalGetBase64String(count, this.readUnsignedByte, this); + }; + + ByteArrayBase.internalGetBase64String = function (count, getUnsignedByteFunc, self) { + var r = ""; + var b0, b1, b2, enc1, enc2, enc3, enc4; + var base64Key = ByteArrayBase.Base64Key; + while (count >= 3) { + b0 = getUnsignedByteFunc.apply(self); + b1 = getUnsignedByteFunc.apply(self); + b2 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4) | (b1 >> 4); + enc3 = ((b1 & 15) << 2) | (b2 >> 6); + enc4 = b2 & 63; + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + base64Key.charAt(enc4); + count -= 3; + } + + // pad + if (count == 2) { + b0 = getUnsignedByteFunc.apply(self); + b1 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4) | (b1 >> 4); + enc3 = ((b1 & 15) << 2); + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + "="; + } else if (count == 1) { + b0 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4); + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + "=="; + } + return r; + }; + ByteArrayBase.Base64Key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + return ByteArrayBase; +})(); + +module.exports = ByteArrayBase; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0J5dGVBcnJheUJhc2UudHMiXSwibmFtZXMiOlsiQnl0ZUFycmF5QmFzZSIsIkJ5dGVBcnJheUJhc2UuY29uc3RydWN0b3IiLCJCeXRlQXJyYXlCYXNlLndyaXRlQnl0ZSIsIkJ5dGVBcnJheUJhc2UucmVhZEJ5dGUiLCJCeXRlQXJyYXlCYXNlLndyaXRlVW5zaWduZWRCeXRlIiwiQnl0ZUFycmF5QmFzZS5yZWFkVW5zaWduZWRCeXRlIiwiQnl0ZUFycmF5QmFzZS53cml0ZVVuc2lnbmVkU2hvcnQiLCJCeXRlQXJyYXlCYXNlLnJlYWRVbnNpZ25lZFNob3J0IiwiQnl0ZUFycmF5QmFzZS53cml0ZVVuc2lnbmVkSW50IiwiQnl0ZUFycmF5QmFzZS5yZWFkVW5zaWduZWRJbnQiLCJCeXRlQXJyYXlCYXNlLndyaXRlRmxvYXQiLCJCeXRlQXJyYXlCYXNlLnRvRmxvYXRCaXRzIiwiQnl0ZUFycmF5QmFzZS5yZWFkRmxvYXQiLCJCeXRlQXJyYXlCYXNlLmZyb21GbG9hdEJpdHMiLCJCeXRlQXJyYXlCYXNlLmdldEJ5dGVzQXZhaWxhYmxlIiwiQnl0ZUFycmF5QmFzZS50b1N0cmluZyIsIkJ5dGVBcnJheUJhc2UuY29tcGFyZUVxdWFsIiwiQnl0ZUFycmF5QmFzZS53cml0ZUJhc2U2NFN0cmluZyIsIkJ5dGVBcnJheUJhc2UuZHVtcFRvQ29uc29sZSIsIkJ5dGVBcnJheUJhc2UuZHVtcFRvQ29uc29sZS5hc0hleFN0cmluZyIsIkJ5dGVBcnJheUJhc2UucmVhZEJhc2U2NFN0cmluZyIsIkJ5dGVBcnJheUJhc2UuaW50ZXJuYWxHZXRCYXNlNjRTdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBLCtFQUFvRjs7QUFFcEY7SUFRQ0E7UUFOQUMsS0FBT0EsUUFBUUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDM0JBLEtBQU9BLE1BQU1BLEdBQVVBLENBQUNBLENBQUNBO1FBQ3pCQSxLQUFPQSxLQUFLQSxHQUFVQSxFQUFFQSxDQUFDQTtJQU16QkEsQ0FBQ0E7SUFFREQs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QW1CQSxFQUFFQSxJQUFJQTtRQUVyRXFCLElBQUlBLENBQUNBLEdBQUdBLEVBQUVBO1FBQ1ZBLElBQUlBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBO1FBQ3RDQSxJQUFJQSxTQUFTQSxHQUFHQSxhQUFhQSxDQUFDQSxTQUFTQTtRQUN2Q0EsT0FBT0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBRUE7WUFDbEJBLEVBQUVBLEdBQUdBLG1CQUFtQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0E7WUFDcENBLEVBQUVBLEdBQUdBLG1CQUFtQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0E7WUFDcENBLEVBQUVBLEdBQUdBLG1CQUFtQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0E7WUFDcENBLElBQUlBLEdBQUdBLEVBQUVBLElBQUlBLENBQUNBO1lBQ2RBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1lBQ2xDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNuQ0EsSUFBSUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUE7WUFDZEEsQ0FBQ0EsSUFBSUEsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7WUFDdEdBLEtBQUtBLElBQUlBLENBQUNBO1NBQ1ZBOztRQUNEQSxNQUFNQTtRQUNOQSxJQUFJQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUNmQSxFQUFFQSxHQUFHQSxtQkFBbUJBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBO1lBQ3BDQSxFQUFFQSxHQUFHQSxtQkFBbUJBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBO1lBQ3BDQSxJQUFJQSxHQUFHQSxFQUFFQSxJQUFJQSxDQUFDQTtZQUNkQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNsQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDdkJBLENBQUNBLElBQUlBLFNBQVNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBO1NBQ25GQSxNQUFNQSxJQUFJQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUN0QkEsRUFBRUEsR0FBR0EsbUJBQW1CQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQTtZQUNwQ0EsSUFBSUEsR0FBR0EsRUFBRUEsSUFBSUEsQ0FBQ0E7WUFDZEEsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDdEJBLENBQUNBLElBQUlBLFNBQVNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLFNBQVNBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBO1NBQzNEQTtRQUNEQSxPQUFPQSxDQUFDQTtJQUNUQSxDQUFDQTtJQTNLRHJCLDBCQUEwQkEsa0VBQWtFQTtJQTRLN0ZBLHFCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDhCQUF1QixDQUFBIiwiZmlsZSI6InV0aWxzL0J5dGVBcnJheUJhc2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQWJzdHJhY3RNZXRob2RFcnJvclx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Fic3RyYWN0TWV0aG9kRXJyb3JcIik7XG5cbmNsYXNzIEJ5dGVBcnJheUJhc2Vcbntcblx0cHVibGljIHBvc2l0aW9uOm51bWJlciA9IDA7XG5cdHB1YmxpYyBsZW5ndGg6bnVtYmVyID0gMDtcblx0cHVibGljIF9tb2RlOnN0cmluZyA9IFwiXCI7XG5cblx0cHVibGljIHN0YXRpYyBCYXNlNjRLZXkgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky9cIjtcblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0fVxuXG5cdHB1YmxpYyB3cml0ZUJ5dGUoYjpudW1iZXIpXG5cdHtcblx0XHR0aHJvdyBcIlZpcnR1YWwgbWV0aG9kXCI7XG5cdH1cblxuXHRwdWJsaWMgcmVhZEJ5dGUoKTpudW1iZXJcblx0e1xuXHRcdHRocm93IFwiVmlydHVhbCBtZXRob2RcIjtcblx0fVxuXG5cdHB1YmxpYyB3cml0ZVVuc2lnbmVkQnl0ZShiOm51bWJlcilcblx0e1xuXHRcdHRocm93IFwiVmlydHVhbCBtZXRob2RcIjtcblx0fVxuXG5cdHB1YmxpYyByZWFkVW5zaWduZWRCeXRlKCk6bnVtYmVyXG5cdHtcblx0XHR0aHJvdyBcIlZpcnR1YWwgbWV0aG9kXCI7XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVVbnNpZ25lZFNob3J0KGI6bnVtYmVyKVxuXHR7XG5cdFx0dGhyb3cgXCJWaXJ0dWFsIG1ldGhvZFwiO1xuXHR9XG5cblx0cHVibGljIHJlYWRVbnNpZ25lZFNob3J0KCk6bnVtYmVyXG5cdHtcblx0XHR0aHJvdyBcIlZpcnR1YWwgbWV0aG9kXCI7XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVVbnNpZ25lZEludChiOm51bWJlcilcblx0e1xuXHRcdHRocm93IFwiVmlydHVhbCBtZXRob2RcIjtcblx0fVxuXG5cdHB1YmxpYyByZWFkVW5zaWduZWRJbnQoKTpudW1iZXJcblx0e1xuXHRcdHRocm93IFwiVmlydHVhbCBtZXRob2RcIjtcblx0fVxuXG5cdHB1YmxpYyB3cml0ZUZsb2F0KGI6bnVtYmVyKVxuXHR7XG5cdFx0dGhyb3cgXCJWaXJ0dWFsIG1ldGhvZFwiO1xuXHR9XG5cblx0cHVibGljIHRvRmxvYXRCaXRzKHg6bnVtYmVyKVxuXHR7XG5cdFx0dGhyb3cgXCJWaXJ0dWFsIG1ldGhvZFwiO1xuXHR9XG5cblx0cHVibGljIHJlYWRGbG9hdChiOm51bWJlcilcblx0e1xuXHRcdHRocm93IFwiVmlydHVhbCBtZXRob2RcIjtcblx0fVxuXG5cdHB1YmxpYyBmcm9tRmxvYXRCaXRzKHg6bnVtYmVyKVxuXHR7XG5cdFx0dGhyb3cgXCJWaXJ0dWFsIG1ldGhvZFwiO1xuXHR9XG5cblx0cHVibGljIGdldEJ5dGVzQXZhaWxhYmxlKCk6bnVtYmVyXG5cdHtcblx0XHR0aHJvdyBuZXcgQWJzdHJhY3RNZXRob2RFcnJvcignQnl0ZUFycmF5QmFzZSwgZ2V0Qnl0ZXNBdmFpbGFibGUoKSBub3QgaW1wbGVtZW50ZWQgJyk7XG5cdH1cblxuXHRwdWJsaWMgdG9TdHJpbmcoKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBcIltCeXRlQXJyYXldICggXCIgKyB0aGlzLl9tb2RlICsgXCIgKSBwb3NpdGlvbj1cIiArIHRoaXMucG9zaXRpb24gKyBcIiBsZW5ndGg9XCIgKyB0aGlzLmxlbmd0aDtcblx0fVxuXG5cdHB1YmxpYyBjb21wYXJlRXF1YWwob3RoZXIsIGNvdW50KVxuXHR7XG5cdFx0aWYgKGNvdW50ID09IHVuZGVmaW5lZCB8fCBjb3VudCA+IHRoaXMubGVuZ3RoIC0gdGhpcy5wb3NpdGlvbilcblx0XHRcdGNvdW50ID0gdGhpcy5sZW5ndGggLSB0aGlzLnBvc2l0aW9uO1xuXHRcdGlmIChjb3VudCA+IG90aGVyLmxlbmd0aCAtIG90aGVyLnBvc2l0aW9uKVxuXHRcdFx0Y291bnQgPSBvdGhlci5sZW5ndGggLSBvdGhlci5wb3NpdGlvbjtcblx0XHR2YXIgY28wID0gY291bnQ7XG5cdFx0dmFyIHIgPSB0cnVlO1xuXHRcdHdoaWxlIChyICYmIGNvdW50ID49IDQpIHtcblx0XHRcdGNvdW50IC09IDQ7XG5cdFx0XHRpZiAodGhpcy5yZWFkVW5zaWduZWRJbnQoKSAhPSBvdGhlci5yZWFkVW5zaWduZWRJbnQoKSkgciA9IGZhbHNlO1xuXHRcdH1cblx0XHR3aGlsZSAociAmJiBjb3VudCA+PSAxKSB7XG5cdFx0XHRjb3VudC0tO1xuXHRcdFx0aWYgKHRoaXMucmVhZFVuc2lnbmVkQnl0ZSgpICE9IG90aGVyLnJlYWRVbnNpZ25lZEJ5dGUoKSkgciA9IGZhbHNlO1xuXHRcdH1cblx0XHR2YXIgYzA7XG5cdFx0dGhpcy5wb3NpdGlvbiAtPSAoYzAgLSBjb3VudCk7XG5cdFx0b3RoZXIucG9zaXRpb24gLT0gKGMwIC0gY291bnQpO1xuXHRcdHJldHVybiByO1xuXHR9XG5cblx0cHVibGljIHdyaXRlQmFzZTY0U3RyaW5nKHM6c3RyaW5nKVxuXHR7XG5cdFx0Zm9yICh2YXIgaTpudW1iZXIgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dmFyIHYgPSBzLmNoYXJBdChpKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZHVtcFRvQ29uc29sZSgpXG5cdHtcblx0XHR2YXIgb2xkcG9zID0gdGhpcy5wb3NpdGlvbjtcblx0XHR0aGlzLnBvc2l0aW9uID0gMDtcblx0XHR2YXIgbnN0ZXA6bnVtYmVyID0gODtcblxuXHRcdGZ1bmN0aW9uIGFzSGV4U3RyaW5nKHgsIGRpZ2l0cylcblx0XHR7XG5cdFx0XHR2YXIgbHV0OkFycmF5PHN0cmluZz4gPSBbIFwiMFwiLCBcIjFcIiwgXCIyXCIsIFwiM1wiLCBcIjRcIiwgXCI1XCIsIFwiNlwiLCBcIjdcIiwgXCI4XCIsIFwiOVwiLCBcImFcIiwgXCJiXCIsIFwiY1wiLCBcImRcIiwgXCJlXCIsIFwiZlwiIF07XG5cdFx0XHR2YXIgc2g6c3RyaW5nID0gXCJcIjtcblx0XHRcdGZvciAodmFyIGQ6bnVtYmVyID0gMDsgZCA8IGRpZ2l0czsgZCsrKSB7XG5cdFx0XHRcdHNoID0gbHV0Wyh4ID4+IChkIDw8IDIpKSAmIDB4Zl0gKyBzaDtcblx0XHRcdH1cblx0XHRcdHJldHVybiBzaDtcblx0XHR9XG5cblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGVuZ3RoOyBpICs9IG5zdGVwKSB7XG5cdFx0XHR2YXIgczpzdHJpbmcgPSBhc0hleFN0cmluZyhpLCA0KSArIFwiOlwiO1xuXHRcdFx0Zm9yICh2YXIgajpudW1iZXIgPSAwOyBqIDwgbnN0ZXAgJiYgaSArIGogPCB0aGlzLmxlbmd0aDsgaisrKSB7XG5cdFx0XHRcdHMgKz0gXCIgXCIgKyBhc0hleFN0cmluZyh0aGlzLnJlYWRVbnNpZ25lZEJ5dGUoKSwgMik7XG5cdFx0XHR9XG5cdFx0XHRjb25zb2xlLmxvZyhzKTtcblx0XHR9XG5cdFx0dGhpcy5wb3NpdGlvbiA9IG9sZHBvcztcblx0fVxuXG5cdHB1YmxpYyByZWFkQmFzZTY0U3RyaW5nKGNvdW50Om51bWJlcilcblx0e1xuXHRcdGlmIChjb3VudCA9PSB1bmRlZmluZWQgfHwgY291bnQgPiB0aGlzLmxlbmd0aCAtIHRoaXMucG9zaXRpb24pXG5cdFx0XHRjb3VudCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5wb3NpdGlvbjtcblx0XHRpZiAoIShjb3VudCA+IDApKSByZXR1cm4gXCJcIjtcblxuXHRcdHJldHVybiBCeXRlQXJyYXlCYXNlLmludGVybmFsR2V0QmFzZTY0U3RyaW5nKGNvdW50LCB0aGlzLnJlYWRVbnNpZ25lZEJ5dGUsIHRoaXMpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBpbnRlcm5hbEdldEJhc2U2NFN0cmluZyhjb3VudCwgZ2V0VW5zaWduZWRCeXRlRnVuYywgc2VsZilcblx0eyAvLyByZXR1cm4gYmFzZTY0IHN0cmluZyBvZiB0aGUgbmV4dCBjb3VudCBieXRlc1xuXHRcdHZhciByID0gXCJcIjtcblx0XHR2YXIgYjAsIGIxLCBiMiwgZW5jMSwgZW5jMiwgZW5jMywgZW5jNDtcblx0XHR2YXIgYmFzZTY0S2V5ID0gQnl0ZUFycmF5QmFzZS5CYXNlNjRLZXk7XG5cdFx0d2hpbGUgKGNvdW50ID49IDMpIHtcblx0XHRcdGIwID0gZ2V0VW5zaWduZWRCeXRlRnVuYy5hcHBseShzZWxmKTtcblx0XHRcdGIxID0gZ2V0VW5zaWduZWRCeXRlRnVuYy5hcHBseShzZWxmKTtcblx0XHRcdGIyID0gZ2V0VW5zaWduZWRCeXRlRnVuYy5hcHBseShzZWxmKTtcblx0XHRcdGVuYzEgPSBiMCA+PiAyO1xuXHRcdFx0ZW5jMiA9ICgoYjAgJiAzKSA8PCA0KSB8IChiMSA+PiA0KTtcblx0XHRcdGVuYzMgPSAoKGIxICYgMTUpIDw8IDIpIHwgKGIyID4+IDYpO1xuXHRcdFx0ZW5jNCA9IGIyICYgNjM7XG5cdFx0XHRyICs9IGJhc2U2NEtleS5jaGFyQXQoZW5jMSkgKyBiYXNlNjRLZXkuY2hhckF0KGVuYzIpICsgYmFzZTY0S2V5LmNoYXJBdChlbmMzKSArIGJhc2U2NEtleS5jaGFyQXQoZW5jNCk7XG5cdFx0XHRjb3VudCAtPSAzO1xuXHRcdH1cblx0XHQvLyBwYWRcblx0XHRpZiAoY291bnQgPT0gMikge1xuXHRcdFx0YjAgPSBnZXRVbnNpZ25lZEJ5dGVGdW5jLmFwcGx5KHNlbGYpO1xuXHRcdFx0YjEgPSBnZXRVbnNpZ25lZEJ5dGVGdW5jLmFwcGx5KHNlbGYpO1xuXHRcdFx0ZW5jMSA9IGIwID4+IDI7XG5cdFx0XHRlbmMyID0gKChiMCAmIDMpIDw8IDQpIHwgKGIxID4+IDQpO1xuXHRcdFx0ZW5jMyA9ICgoYjEgJiAxNSkgPDwgMik7XG5cdFx0XHRyICs9IGJhc2U2NEtleS5jaGFyQXQoZW5jMSkgKyBiYXNlNjRLZXkuY2hhckF0KGVuYzIpICsgYmFzZTY0S2V5LmNoYXJBdChlbmMzKSArIFwiPVwiO1xuXHRcdH0gZWxzZSBpZiAoY291bnQgPT0gMSkge1xuXHRcdFx0YjAgPSBnZXRVbnNpZ25lZEJ5dGVGdW5jLmFwcGx5KHNlbGYpO1xuXHRcdFx0ZW5jMSA9IGIwID4+IDI7XG5cdFx0XHRlbmMyID0gKChiMCAmIDMpIDw8IDQpO1xuXHRcdFx0ciArPSBiYXNlNjRLZXkuY2hhckF0KGVuYzEpICsgYmFzZTY0S2V5LmNoYXJBdChlbmMyKSArIFwiPT1cIjtcblx0XHR9XG5cdFx0cmV0dXJuIHI7XG5cdH1cbn1cblxuZXhwb3J0ID0gQnl0ZUFycmF5QmFzZTsiXX0= \ No newline at end of file diff --git a/lib/utils/ByteArrayBase.ts b/lib/utils/ByteArrayBase.ts new file mode 100644 index 00000000..e47f53f2 --- /dev/null +++ b/lib/utils/ByteArrayBase.ts @@ -0,0 +1,183 @@ +import AbstractMethodError = require("awayjs-core/lib/errors/AbstractMethodError"); + +class ByteArrayBase +{ + public position:number = 0; + public length:number = 0; + public _mode:string = ""; + + public static Base64Key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + constructor() + { + } + + public writeByte(b:number) + { + throw "Virtual method"; + } + + public readByte():number + { + throw "Virtual method"; + } + + public writeUnsignedByte(b:number) + { + throw "Virtual method"; + } + + public readUnsignedByte():number + { + throw "Virtual method"; + } + + public writeUnsignedShort(b:number) + { + throw "Virtual method"; + } + + public readUnsignedShort():number + { + throw "Virtual method"; + } + + public writeUnsignedInt(b:number) + { + throw "Virtual method"; + } + + public readUnsignedInt():number + { + throw "Virtual method"; + } + + public writeFloat(b:number) + { + throw "Virtual method"; + } + + public toFloatBits(x:number) + { + throw "Virtual method"; + } + + public readFloat(b:number) + { + throw "Virtual method"; + } + + public fromFloatBits(x:number) + { + throw "Virtual method"; + } + + public getBytesAvailable():number + { + throw new AbstractMethodError('ByteArrayBase, getBytesAvailable() not implemented '); + } + + public toString():string + { + return "[ByteArray] ( " + this._mode + " ) position=" + this.position + " length=" + this.length; + } + + public compareEqual(other, count) + { + if (count == undefined || count > this.length - this.position) + count = this.length - this.position; + if (count > other.length - other.position) + count = other.length - other.position; + var co0 = count; + var r = true; + while (r && count >= 4) { + count -= 4; + if (this.readUnsignedInt() != other.readUnsignedInt()) r = false; + } + while (r && count >= 1) { + count--; + if (this.readUnsignedByte() != other.readUnsignedByte()) r = false; + } + var c0; + this.position -= (c0 - count); + other.position -= (c0 - count); + return r; + } + + public writeBase64String(s:string) + { + for (var i:number = 0; i < s.length; i++) { + var v = s.charAt(i); + } + } + + public dumpToConsole() + { + var oldpos = this.position; + this.position = 0; + var nstep:number = 8; + + function asHexString(x, digits) + { + var lut:Array = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" ]; + var sh:string = ""; + for (var d:number = 0; d < digits; d++) { + sh = lut[(x >> (d << 2)) & 0xf] + sh; + } + return sh; + } + + for (var i = 0; i < this.length; i += nstep) { + var s:string = asHexString(i, 4) + ":"; + for (var j:number = 0; j < nstep && i + j < this.length; j++) { + s += " " + asHexString(this.readUnsignedByte(), 2); + } + console.log(s); + } + this.position = oldpos; + } + + public readBase64String(count:number) + { + if (count == undefined || count > this.length - this.position) + count = this.length - this.position; + if (!(count > 0)) return ""; + + return ByteArrayBase.internalGetBase64String(count, this.readUnsignedByte, this); + } + + public static internalGetBase64String(count, getUnsignedByteFunc, self) + { // return base64 string of the next count bytes + var r = ""; + var b0, b1, b2, enc1, enc2, enc3, enc4; + var base64Key = ByteArrayBase.Base64Key; + while (count >= 3) { + b0 = getUnsignedByteFunc.apply(self); + b1 = getUnsignedByteFunc.apply(self); + b2 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4) | (b1 >> 4); + enc3 = ((b1 & 15) << 2) | (b2 >> 6); + enc4 = b2 & 63; + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + base64Key.charAt(enc4); + count -= 3; + } + // pad + if (count == 2) { + b0 = getUnsignedByteFunc.apply(self); + b1 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4) | (b1 >> 4); + enc3 = ((b1 & 15) << 2); + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + "="; + } else if (count == 1) { + b0 = getUnsignedByteFunc.apply(self); + enc1 = b0 >> 2; + enc2 = ((b0 & 3) << 4); + r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + "=="; + } + return r; + } +} + +export = ByteArrayBase; \ No newline at end of file diff --git a/lib/utils/ByteArrayBuffer.js b/lib/utils/ByteArrayBuffer.js new file mode 100755 index 00000000..76e5a1b1 --- /dev/null +++ b/lib/utils/ByteArrayBuffer.js @@ -0,0 +1,135 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var ByteArrayBase = require("awayjs-core/lib/utils/ByteArrayBase"); + +var ByteArrayBuffer = (function (_super) { + __extends(ByteArrayBuffer, _super); + function ByteArrayBuffer() { + _super.call(this); + this._bytes = []; + this._mode = "Array"; + } + ByteArrayBuffer.prototype.writeByte = function (b) { + var bi = ~~b; + this._bytes[this.position++] = bi; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArrayBuffer.prototype.readByte = function () { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + return this._bytes[this.position++]; + }; + + ByteArrayBuffer.prototype.writeUnsignedByte = function (b) { + var bi = ~~b; + this._bytes[this.position++] = bi & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArrayBuffer.prototype.readUnsignedByte = function () { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + return this._bytes[this.position++]; + }; + + ByteArrayBuffer.prototype.writeUnsignedShort = function (b) { + var bi = ~~b; + this._bytes[this.position++] = bi & 0xff; + this._bytes[this.position++] = (bi >> 8) & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArrayBuffer.prototype.readUnsignedShort = function () { + if (this.position + 2 > this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + var r = this._bytes[this.position] | (this._bytes[this.position + 1] << 8); + this.position += 2; + return r; + }; + + ByteArrayBuffer.prototype.writeUnsignedInt = function (b) { + var bi = ~~b; + this._bytes[this.position++] = bi & 0xff; + this._bytes[this.position++] = (bi >>> 8) & 0xff; + this._bytes[this.position++] = (bi >>> 16) & 0xff; + this._bytes[this.position++] = (bi >>> 24) & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + }; + + ByteArrayBuffer.prototype.readUnsignedInt = function () { + if (this.position + 4 > this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + var r = this._bytes[this.position] | (this._bytes[this.position + 1] << 8) | (this._bytes[this.position + 2] << 16) | (this._bytes[this.position + 3] << 24); + this.position += 4; + return r >>> 0; + }; + + ByteArrayBuffer.prototype.writeFloat = function (b) { + // this is crazy slow and silly, but as a fallback... + this.writeUnsignedInt(this.toFloatBits(Number(b))); + }; + + ByteArrayBuffer.prototype.toFloatBits = function (x) { + // don't handle inf/nan yet + // special case zero + if (x == 0) { + return 0; + } + + // remove the sign, after this we only deal with positive numbers + var sign = 0; + if (x < 0) { + x = -x; + sign = 1; + } else { + sign = 0; + } + + // a float value is now defined as: x = (1+(mantissa*2^-23))*(2^(exponent-127)) + var exponent = Math.log(x) / Math.log(2); + exponent = Math.floor(exponent); + x = x * Math.pow(2, 23 - exponent); // normalize to 24 bits + var mantissa = Math.floor(x) - 0x800000; + exponent = exponent + 127; + return ((sign << 31) >>> 0) | (exponent << 23) | mantissa; + }; + + ByteArrayBuffer.prototype.readFloat = function (b) { + return this.fromFloatBits(this.readUnsignedInt()); + }; + + ByteArrayBuffer.prototype.fromFloatBits = function (x) { + if (x == 0) { + return 0; + } + var exponent = (x >>> 23) & 0xff; + var mantissa = (x & 0x7fffff) | 0x800000; + var y = Math.pow(2, (exponent - 127) - 23) * mantissa; + if (x >>> 31 != 0) { + y = -y; + } + return y; + }; + return ByteArrayBuffer; +})(ByteArrayBase); + +module.exports = ByteArrayBuffer; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0J5dGVBcnJheUJ1ZmZlci50cyJdLCJuYW1lcyI6WyJCeXRlQXJyYXlCdWZmZXIiLCJCeXRlQXJyYXlCdWZmZXIuY29uc3RydWN0b3IiLCJCeXRlQXJyYXlCdWZmZXIud3JpdGVCeXRlIiwiQnl0ZUFycmF5QnVmZmVyLnJlYWRCeXRlIiwiQnl0ZUFycmF5QnVmZmVyLndyaXRlVW5zaWduZWRCeXRlIiwiQnl0ZUFycmF5QnVmZmVyLnJlYWRVbnNpZ25lZEJ5dGUiLCJCeXRlQXJyYXlCdWZmZXIud3JpdGVVbnNpZ25lZFNob3J0IiwiQnl0ZUFycmF5QnVmZmVyLnJlYWRVbnNpZ25lZFNob3J0IiwiQnl0ZUFycmF5QnVmZmVyLndyaXRlVW5zaWduZWRJbnQiLCJCeXRlQXJyYXlCdWZmZXIucmVhZFVuc2lnbmVkSW50IiwiQnl0ZUFycmF5QnVmZmVyLndyaXRlRmxvYXQiLCJCeXRlQXJyYXlCdWZmZXIudG9GbG9hdEJpdHMiLCJCeXRlQXJyYXlCdWZmZXIucmVhZEZsb2F0IiwiQnl0ZUFycmF5QnVmZmVyLmZyb21GbG9hdEJpdHMiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGtFQUF3RTs7QUFFeEU7SUFBOEJBLGtDQUFhQTtJQVcxQ0E7UUFFQ0MsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFDUEEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsRUFBRUE7UUFDaEJBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLE9BQU9BO0lBQ3JCQSxDQUFDQTtJQUVERCxzQ0FBQUEsVUFBaUJBLENBQVFBO1FBRXhCRSxJQUFJQSxFQUFFQSxHQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTtRQUNuQkEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBRUEsR0FBR0EsRUFBRUE7UUFDbkNBLElBQUlBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUVBO1lBQ2hDQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxJ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UUEsRUFBRUEsQ0FBRUEsR0FBR0EsQ0FBQ0EsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDbERBLElBQUlBLENBQUNBLE1BQU1BLENBQUVBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLENBQUVBLEdBQUdBLENBQUNBLEVBQUVBLEtBQUtBLEVBQUVBLENBQUNBLEdBQUdBLElBQUlBO1FBQ25EQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFFQSxHQUFHQSxDQUFDQSxFQUFFQSxLQUFLQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQTtRQUNuREEsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBRUE7WUFDaENBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBO1NBQzNCQTtJQUNGQSxDQUFDQTs7SUFFRFIsNENBQUFBO1FBRUNTLElBQUlBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUVBO1lBQ3BDQSxNQUFNQSx5Q0FBeUNBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BO1NBQzNGQTtRQUNEQSxJQUFJQSxDQUFDQSxHQUFVQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFFQSxHQUFHQSxDQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQSxHQUFHQSxDQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFFQSxHQUFHQSxDQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxFQUFFQSxDQUFFQTtRQUMzS0EsSUFBSUEsQ0FBQ0EsUUFBUUEsSUFBSUEsQ0FBQ0E7UUFDbEJBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBO0lBQ2ZBLENBQUNBOztJQUVEVCx1Q0FBQUEsVUFBa0JBLENBQVFBO1FBRXpCVSxxREFBcURBO1FBRXJEQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0lBQ25EQSxDQUFDQTs7SUFFRFYsd0NBQUFBLFVBQW1CQSxDQUFRQTtRQUUxQlcsMkJBQTJCQTtRQUMzQkEsb0JBQW9CQTtRQUNwQkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBRUE7WUFDWEEsT0FBT0EsQ0FBQ0E7U0FDUkE7O1FBQ0RBLGlFQUFpRUE7UUFDakVBLElBQUlBLElBQUlBLEdBQVVBLENBQUNBO1FBQ25CQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFFQTtZQUNWQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtZQUNOQSxJQUFJQSxHQUFHQSxDQUFDQTtTQUNSQSxLQUFNQTtZQUNOQSxJQUFJQSxHQUFHQSxDQUFDQTtTQUNSQTs7UUFDREEsK0VBQStFQTtRQUMvRUEsSUFBSUEsUUFBUUEsR0FBVUEsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDN0NBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBO1FBQy9CQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxHQUFHQSxRQUFRQSxDQUFDQSxFQUFjQSx1QkFBdUJBO1FBQ3JFQSxJQUFJQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxRQUFRQTtRQUN2Q0EsUUFBUUEsR0FBR0EsUUFBUUEsR0FBR0EsR0FBR0E7UUFDekJBLE9BQU1BLENBQUVBLENBQUVBLElBQUlBLElBQUlBLEVBQUVBLENBQUVBLEtBQUtBLENBQUNBLENBQUNBLEdBQUdBLENBQUVBLFFBQVFBLElBQUlBLEVBQUVBLENBQUVBLEdBQUdBLFFBQVFBO0lBQzlEQSxDQUFDQTs7SUFFRFgsc0NBQUFBLFVBQWlCQSxDQUFRQTtRQUV4QlksT0FBT0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDbERBLENBQUNBOztJQUVEWiwwQ0FBQUEsVUFBcUJBLENBQVFBO1FBRTVCYSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUNYQSxPQUFPQSxDQUFDQTtTQUNSQTtRQUNEQSxJQUFJQSxRQUFRQSxHQUFVQSxDQUFFQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFFQSxHQUFHQSxJQUFJQTtRQUN6Q0EsSUFBSUEsUUFBUUEsR0FBVUEsQ0FBRUEsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBRUEsR0FBR0EsUUFBUUE7UUFDakRBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUVBLFFBQVFBLEdBQUdBLEdBQUdBLENBQUVBLEdBQUdBLEVBQUVBLENBQUNBLEdBQUNBLFFBQVFBO1FBQ3JEQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFFQTtZQUNsQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDTkE7UUFDREEsT0FBT0EsQ0FBQ0E7SUFDVEEsQ0FBQ0E7SUFxQkZiLHVCQUFDQTtBQUFEQSxDQUFDQSxFQW5LNkIsYUFBYSxFQW1LMUM7O0FBRUQsZ0NBQXlCLENBQUEiLCJmaWxlIjoidXRpbHMvQnl0ZUFycmF5QnVmZmVyLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJ5dGVBcnJheUJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvQnl0ZUFycmF5QmFzZVwiKTtcblxuY2xhc3MgQnl0ZUFycmF5QnVmZmVyIGV4dGVuZHMgQnl0ZUFycmF5QmFzZVxue1xuXG5cdC8qXG5cdCBwdWJsaWMgbWF4bGVuZ3RoOm51bWJlciA9IDA7XG5cdCBwdWJsaWMgYXJyYXlieXRlczsgLy9BcnJheUJ1ZmZlclxuXHQgcHVibGljIHVuYWxpZ25lZGFycmF5Ynl0ZXN0ZW1wOyAvL0FycmF5QnVmZmVyXG5cdCAqL1xuXG5cdHB1YmxpYyBfYnl0ZXM6bnVtYmVyW107XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0c3VwZXIoKTtcblx0XHR0aGlzLl9ieXRlcyA9IFtdO1xuXHRcdHRoaXMuX21vZGUgPSBcIkFycmF5XCI7XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVCeXRlKGI6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIGJpOm51bWJlciA9IH5+Yjtcblx0XHR0aGlzLl9ieXRlc1sgdGhpcy5wb3NpdGlvbisrIF0gPSBiaTtcblx0XHRpZiAodGhpcy5wb3NpdGlvbiA+IHRoaXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IHRoaXMucG9zaXRpb247XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHJlYWRCeXRlKCk6bnVtYmVyXG5cdHtcblx0XHRpZiAodGhpcy5wb3NpdGlvbiA+PSB0aGlzLmxlbmd0aCkge1xuXHRcdFx0dGhyb3cgXCJCeXRlQXJyYXkgb3V0IG9mIGJvdW5kcyByZWFkLiBQb3NpdGlvbj1cIiArIHRoaXMucG9zaXRpb24gKyBcIiwgTGVuZ3RoPVwiICsgdGhpcy5sZW5ndGg7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9ieXRlc1sgdGhpcy5wb3NpdGlvbisrIF07XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVVbnNpZ25lZEJ5dGUoYjpudW1iZXIpXG5cdHtcblx0XHR2YXIgYmk6bnVtYmVyID0gfn5iO1xuXHRcdHRoaXMuX2J5dGVzW3RoaXMucG9zaXRpb24rK10gPSBiaSAmIDB4ZmY7XG5cdFx0aWYgKHRoaXMucG9zaXRpb24gPiB0aGlzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5sZW5ndGggPSB0aGlzLnBvc2l0aW9uO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyByZWFkVW5zaWduZWRCeXRlKCk6bnVtYmVyXG5cdHtcblx0XHRpZiAodGhpcy5wb3NpdGlvbiA+PSB0aGlzLmxlbmd0aCkge1xuXHRcdFx0dGhyb3cgXCJCeXRlQXJyYXkgb3V0IG9mIGJvdW5kcyByZWFkLiBQb3NpdGlvbj1cIiArIHRoaXMucG9zaXRpb24gKyBcIiwgTGVuZ3RoPVwiICsgdGhpcy5sZW5ndGg7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9ieXRlc1sgdGhpcy5wb3NpdGlvbisrIF07XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVVbnNpZ25lZFNob3J0KGI6bnVtYmVyKVxuXHR7XG5cdFx0dmFyIGJpOm51bWJlciA9IH5+Yjtcblx0XHR0aGlzLl9ieXRlc1sgdGhpcy5wb3NpdGlvbisrIF0gPSBiaSAmIDB4ZmY7XG5cdFx0dGhpcy5fYnl0ZXNbIHRoaXMucG9zaXRpb24rKyBdID0gKGJpID4+IDgpICYgMHhmZjtcblx0XHRpZiAodGhpcy5wb3NpdGlvbiA+IHRoaXMubGVuZ3RoKSB7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IHRoaXMucG9zaXRpb247XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHJlYWRVbnNpZ25lZFNob3J0KCk6bnVtYmVyXG5cdHtcblx0XHRpZiAodGhpcy5wb3NpdGlvbiArIDIgPiB0aGlzLmxlbmd0aCkge1xuXHRcdFx0dGhyb3cgXCJCeXRlQXJyYXkgb3V0IG9mIGJvdW5kcyByZWFkLiBQb3NpdGlvbj1cIiArIHRoaXMucG9zaXRpb24gKyBcIiwgTGVuZ3RoPVwiICsgdGhpcy5sZW5ndGg7XG5cdFx0fVxuXHRcdHZhciByOm51bWJlciA9IHRoaXMuX2J5dGVzWyB0aGlzLnBvc2l0aW9uIF0gfCAoIHRoaXMuX2J5dGVzWyB0aGlzLnBvc2l0aW9uICsgMSBdIDw8IDggKTtcblx0XHR0aGlzLnBvc2l0aW9uICs9IDI7XG5cdFx0cmV0dXJuIHI7XG5cdH1cblxuXHRwdWJsaWMgd3JpdGVVbnNpZ25lZEludChiOm51bWJlcilcblx0e1xuXHRcdHZhciBiaTpudW1iZXIgPSB+fmI7XG5cdFx0dGhpcy5fYnl0ZXNbIHRoaXMucG9zaXRpb24rKyBdID0gYmkgJiAweGZmO1xuXHRcdHRoaXMuX2J5dGVzWyB0aGlzLnBvc2l0aW9uKysgXSA9IChiaSA+Pj4gOCkgJiAweGZmO1xuXHRcdHRoaXMuX2J5dGVzWyB0aGlzLnBvc2l0aW9uKysgXSA9IChiaSA+Pj4gMTYpICYgMHhmZjtcblx0XHR0aGlzLl9ieXRlc1sgdGhpcy5wb3NpdGlvbisrIF0gPSAoYmkgPj4+IDI0KSAmIDB4ZmY7XG5cdFx0aWYgKHRoaXMucG9zaXRpb24gPiB0aGlzLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5sZW5ndGggPSB0aGlzLnBvc2l0aW9uO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyByZWFkVW5zaWduZWRJbnQoKTpudW1iZXJcblx0e1xuXHRcdGlmICh0aGlzLnBvc2l0aW9uICsgNCA+IHRoaXMubGVuZ3RoKSB7XG5cdFx0XHR0aHJvdyBcIkJ5dGVBcnJheSBvdXQgb2YgYm91bmRzIHJlYWQuIFBvc2l0aW9uPVwiICsgdGhpcy5wb3NpdGlvbiArIFwiLCBMZW5ndGg9XCIgKyB0aGlzLmxlbmd0aDtcblx0XHR9XG5cdFx0dmFyIHI6bnVtYmVyID0gdGhpcy5fYnl0ZXNbIHRoaXMucG9zaXRpb24gXSB8ICggdGhpcy5fYnl0ZXNbdGhpcy5wb3NpdGlvbiArIDFdIDw8IDggKSB8ICggdGhpcy5fYnl0ZXNbdGhpcy5wb3NpdGlvbiArIDJdIDw8IDE2ICkgfCAoIHRoaXMuX2J5dGVzW3RoaXMucG9zaXRpb24gKyAzXSA8PCAyNCApO1xuXHRcdHRoaXMucG9zaXRpb24gKz0gNDtcblx0XHRyZXR1cm4gciA+Pj4gMDtcblx0fVxuXG5cdHB1YmxpYyB3cml0ZUZsb2F0KGI6bnVtYmVyKVxuXHR7XG5cdFx0Ly8gdGhpcyBpcyBjcmF6eSBzbG93IGFuZCBzaWxseSwgYnV0IGFzIGEgZmFsbGJhY2suLi5cblxuXHRcdHRoaXMud3JpdGVVbnNpZ25lZEludCh0aGlzLnRvRmxvYXRCaXRzKE51bWJlcihiKSkpO1xuXHR9XG5cblx0cHVibGljIHRvRmxvYXRCaXRzKHg6bnVtYmVyKVxuXHR7XG5cdFx0Ly8gZG9uJ3QgaGFuZGxlIGluZi9uYW4geWV0XG5cdFx0Ly8gc3BlY2lhbCBjYXNlIHplcm9cblx0XHRpZiAoeCA9PSAwKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cdFx0Ly8gcmVtb3ZlIHRoZSBzaWduLCBhZnRlciB0aGlzIHdlIG9ubHkgZGVhbCB3aXRoIHBvc2l0aXZlIG51bWJlcnNcblx0XHR2YXIgc2lnbjpudW1iZXIgPSAwO1xuXHRcdGlmICh4IDwgMCkge1xuXHRcdFx0eCA9IC14O1xuXHRcdFx0c2lnbiA9IDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHNpZ24gPSAwO1xuXHRcdH1cblx0XHQvLyBhIGZsb2F0IHZhbHVlIGlzIG5vdyBkZWZpbmVkIGFzOiB4ID0gKDErKG1hbnRpc3NhKjJeLTIzKSkqKDJeKGV4cG9uZW50LTEyNykpXG5cdFx0dmFyIGV4cG9uZW50Om51bWJlciA9IE1hdGgubG9nKHgpL01hdGgubG9nKDIpOyAgLy8gcm91Z2ggZXhwb25lbnRcblx0XHRleHBvbmVudCA9IE1hdGguZmxvb3IoZXhwb25lbnQpO1xuXHRcdHggPSB4Kk1hdGgucG93KDIsIDIzIC0gZXhwb25lbnQpOyAgICAgICAgICAgICAvLyBub3JtYWxpemUgdG8gMjQgYml0c1xuXHRcdHZhciBtYW50aXNzYSA9IE1hdGguZmxvb3IoeCkgLSAweDgwMDAwMDtcblx0XHRleHBvbmVudCA9IGV4cG9uZW50ICsgMTI3O1xuXHRcdHJldHVybiggKCBzaWduIDw8IDMxICkgPj4+IDApIHwgKCBleHBvbmVudCA8PCAyMyApIHwgbWFudGlzc2E7XG5cdH1cblxuXHRwdWJsaWMgcmVhZEZsb2F0KGI6bnVtYmVyKVxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuZnJvbUZsb2F0Qml0cyh0aGlzLnJlYWRVbnNpZ25lZEludCgpKTtcblx0fVxuXG5cdHB1YmxpYyBmcm9tRmxvYXRCaXRzKHg6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKHggPT0gMCkge1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXHRcdHZhciBleHBvbmVudDpudW1iZXIgPSAoIHggPj4+IDIzICkgJiAweGZmO1xuXHRcdHZhciBtYW50aXNzYTpudW1iZXIgPSAoIHggJiAweDdmZmZmZiApIHwgMHg4MDAwMDA7XG5cdFx0dmFyIHkgPSBNYXRoLnBvdygyLCAoIGV4cG9uZW50IC0gMTI3ICkgLSAyMykqbWFudGlzc2E7XG5cdFx0aWYgKHggPj4+IDMxICE9IDApIHtcblx0XHRcdHkgPSAteTtcblx0XHR9XG5cdFx0cmV0dXJuIHk7XG5cdH1cblxuXHQvKlxuXHQgcHVibGljIGVuc3VyZVdyaXRlYWJsZVNwYWNlKCBuOm51bWJlciApXG5cdCB7XG5cdCB0aGlzLmVuc3VyZVNwYWNlKCBuICsgdGhpcy5wb3NpdGlvbiApO1xuXHQgfVxuXG5cdCBwcml2YXRlIGVuc3VyZVNwYWNlKCBuOm51bWJlciApXG5cdCB7XG5cdCBpZiAoIG4gPiB0aGlzLm1heGxlbmd0aCApIHtcblx0IHZhciBuZXdtYXhsZW5ndGg6bnVtYmVyID0gKG4rMjU1KSYofjI1NSk7XG5cdCB2YXIgbmV3YXJyYXlidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIobmV3bWF4bGVuZ3RoKTtcblx0IHZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5hcnJheWJ5dGVzLCAwLCB0aGlzLmxlbmd0aCk7XG5cdCB2YXIgbmV3dmlldyA9IG5ldyBVaW50OEFycmF5KG5ld2FycmF5YnVmZmVyLCAwLCB0aGlzLmxlbmd0aCk7XG5cdCBuZXd2aWV3LnNldCh2aWV3KTsgICAgICAvLyBtZW1jcHlcblx0IHRoaXMuYXJyYXlieXRlcyA9IG5ld2FycmF5YnVmZmVyO1xuXHQgdGhpcy5tYXhsZW5ndGggPSBuZXdtYXhsZW5ndGg7XG5cdCB9XG5cdCB9XG5cdCAqL1xufVxuXG5leHBvcnQgPSBCeXRlQXJyYXlCdWZmZXI7Il19 \ No newline at end of file diff --git a/lib/utils/ByteArrayBuffer.ts b/lib/utils/ByteArrayBuffer.ts new file mode 100644 index 00000000..3ea305f4 --- /dev/null +++ b/lib/utils/ByteArrayBuffer.ts @@ -0,0 +1,168 @@ +import ByteArrayBase = require("awayjs-core/lib/utils/ByteArrayBase"); + +class ByteArrayBuffer extends ByteArrayBase +{ + + /* + public maxlength:number = 0; + public arraybytes; //ArrayBuffer + public unalignedarraybytestemp; //ArrayBuffer + */ + + public _bytes:number[]; + + constructor() + { + super(); + this._bytes = []; + this._mode = "Array"; + } + + public writeByte(b:number) + { + var bi:number = ~~b; + this._bytes[ this.position++ ] = bi; + if (this.position > this.length) { + this.length = this.position; + } + } + + public readByte():number + { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + return this._bytes[ this.position++ ]; + } + + public writeUnsignedByte(b:number) + { + var bi:number = ~~b; + this._bytes[this.position++] = bi & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + } + + public readUnsignedByte():number + { + if (this.position >= this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + return this._bytes[ this.position++ ]; + } + + public writeUnsignedShort(b:number) + { + var bi:number = ~~b; + this._bytes[ this.position++ ] = bi & 0xff; + this._bytes[ this.position++ ] = (bi >> 8) & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + } + + public readUnsignedShort():number + { + if (this.position + 2 > this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + var r:number = this._bytes[ this.position ] | ( this._bytes[ this.position + 1 ] << 8 ); + this.position += 2; + return r; + } + + public writeUnsignedInt(b:number) + { + var bi:number = ~~b; + this._bytes[ this.position++ ] = bi & 0xff; + this._bytes[ this.position++ ] = (bi >>> 8) & 0xff; + this._bytes[ this.position++ ] = (bi >>> 16) & 0xff; + this._bytes[ this.position++ ] = (bi >>> 24) & 0xff; + if (this.position > this.length) { + this.length = this.position; + } + } + + public readUnsignedInt():number + { + if (this.position + 4 > this.length) { + throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; + } + var r:number = this._bytes[ this.position ] | ( this._bytes[this.position + 1] << 8 ) | ( this._bytes[this.position + 2] << 16 ) | ( this._bytes[this.position + 3] << 24 ); + this.position += 4; + return r >>> 0; + } + + public writeFloat(b:number) + { + // this is crazy slow and silly, but as a fallback... + + this.writeUnsignedInt(this.toFloatBits(Number(b))); + } + + public toFloatBits(x:number) + { + // don't handle inf/nan yet + // special case zero + if (x == 0) { + return 0; + } + // remove the sign, after this we only deal with positive numbers + var sign:number = 0; + if (x < 0) { + x = -x; + sign = 1; + } else { + sign = 0; + } + // a float value is now defined as: x = (1+(mantissa*2^-23))*(2^(exponent-127)) + var exponent:number = Math.log(x)/Math.log(2); // rough exponent + exponent = Math.floor(exponent); + x = x*Math.pow(2, 23 - exponent); // normalize to 24 bits + var mantissa = Math.floor(x) - 0x800000; + exponent = exponent + 127; + return( ( sign << 31 ) >>> 0) | ( exponent << 23 ) | mantissa; + } + + public readFloat(b:number) + { + return this.fromFloatBits(this.readUnsignedInt()); + } + + public fromFloatBits(x:number) + { + if (x == 0) { + return 0; + } + var exponent:number = ( x >>> 23 ) & 0xff; + var mantissa:number = ( x & 0x7fffff ) | 0x800000; + var y = Math.pow(2, ( exponent - 127 ) - 23)*mantissa; + if (x >>> 31 != 0) { + y = -y; + } + return y; + } + + /* + public ensureWriteableSpace( n:number ) + { + this.ensureSpace( n + this.position ); + } + + private ensureSpace( n:number ) + { + if ( n > this.maxlength ) { + var newmaxlength:number = (n+255)&(~255); + var newarraybuffer = new ArrayBuffer(newmaxlength); + var view = new Uint8Array(this.arraybytes, 0, this.length); + var newview = new Uint8Array(newarraybuffer, 0, this.length); + newview.set(view); // memcpy + this.arraybytes = newarraybuffer; + this.maxlength = newmaxlength; + } + } + */ +} + +export = ByteArrayBuffer; \ No newline at end of file diff --git a/lib/utils/CSS.js b/lib/utils/CSS.js new file mode 100755 index 00000000..c0136941 --- /dev/null +++ b/lib/utils/CSS.js @@ -0,0 +1,66 @@ +var CSS = (function () { + function CSS() { + } + CSS.setElementSize = function (element, width, height) { + element.style.width = width + "px"; + element.style.height = height + "px"; + element["width"] = width; + element["height"] = height; + }; + + CSS.setElementWidth = function (element, width) { + element.style.width = width + "px"; + element["width"] = width; + }; + + CSS.setElementHeight = function (element, height) { + element.style.height = height + "px"; + element["height"] = height; + }; + + CSS.setElementX = function (element, x) { + element.style.position = 'absolute'; + element.style.left = x + "px"; + }; + + CSS.setElementY = function (element, y) { + element.style.position = 'absolute'; + element.style.top = y + "px"; + }; + + CSS.getElementVisibility = function (element) { + return element.style.visibility == 'visible'; + }; + + CSS.setElementVisibility = function (element, visible) { + if (visible) { + element.style.visibility = 'visible'; + } else { + element.style.visibility = 'hidden'; + } + }; + + CSS.setElementAlpha = function (element, alpha) { + if (element instanceof HTMLCanvasElement) { + var context = element.getContext("2d"); + context.globalAlpha = alpha; + } + }; + + CSS.setElementPosition = function (element, x, y, absolute) { + if (typeof absolute === "undefined") { absolute = false; } + if (absolute) { + element.style.position = "absolute"; + } else { + element.style.position = "relative"; + } + + element.style.left = x + "px"; + element.style.top = y + "px"; + }; + return CSS; +})(); + +module.exports = CSS; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0NTUy50cyJdLCJuYW1lcyI6WyJDU1MiLCJDU1MuY29uc3RydWN0b3IiLCJDU1Muc2V0RWxlbWVudFNpemUiLCJDU1Muc2V0RWxlbWVudFdpZHRoIiwiQ1NTLnNldEVsZW1lbnRIZWlnaHQiLCJDU1Muc2V0RWxlbWVudFgiLCJDU1Muc2V0RWxlbWVudFkiLCJDU1MuZ2V0RWxlbWVudFZpc2liaWxpdHkiLCJDU1Muc2V0RWxlbWVudFZpc2liaWxpdHkiLCJDU1Muc2V0RWxlbWVudEFscGhhIiwiQ1NTLnNldEVsZW1lbnRQb3NpdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUE7SUFBQUE7SUFtRUFDLENBQUNBO0FBQUFELElBakVBQSxxQkFBQUEsVUFBNkJBLE9BQW1CQSxFQUFFQSxLQUFZQSxFQUFFQSxNQUFhQTtRQUU1RUUsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsR0FBR0EsS0FBS0EsR0FBR0EsSUFBSUE7UUFDbENBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLEdBQUdBLE1BQU1BLEdBQUdBLElBQUlBO1FBQ3BDQSxPQUFPQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxLQUFLQTtRQUN4QkEsT0FBT0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsTUFBTUE7SUFDM0JBLENBQUNBOztJQUVERixzQkFBQUEsVUFBOEJBLE9BQW1CQSxFQUFFQSxLQUFZQTtRQUU5REcsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsR0FBR0EsS0FBS0EsR0FBR0EsSUFBSUE7UUFDbENBLE9BQU9BLENBQUNBLE9BQU9BLENBQUNBLEdBQUdBLEtBQUtBO0lBQ3pCQSxDQUFDQTs7SUFFREgsdUJBQUFBLFVBQStCQSxPQUFtQkEsRUFBRUEsTUFBYUE7UUFFaEVJLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLEdBQUdBLE1BQU1BLEdBQUdBLElBQUlBO1FBQ3BDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxNQUFNQTtJQUMzQkEsQ0FBQ0E7O0lBRURKLGtCQUFBQSxVQUEwQkEsT0FBbUJBLEVBQUVBLENBQVFBO1FBRXRESyxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxHQUFHQSxVQUFVQTtRQUNuQ0EsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsR0FBR0EsSUFBSUE7SUFDOUJBLENBQUNBOztJQUVETCxrQkFBQUEsVUFBMEJBLE9BQW1CQSxFQUFFQSxDQUFRQTtRQUV0RE0sT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsUUFBUUEsR0FBR0EsVUFBVUE7UUFDbkNBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLElBQUlBO0lBQzdCQSxDQUFDQTs7SUFFRE4sMkJBQUFBLFVBQW1DQSxPQUFtQkE7UUFFckRPLE9BQU9BLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLFVBQVVBLElBQUlBLFNBQVNBO0lBQzdDQSxDQUFDQTs7SUFFRFAsMkJBQUFBLFVBQW1DQSxPQUFtQkEsRUFBRUEsT0FBZUE7UUFFdEVRLElBQUlBLE9BQU9BLENBQUVBO1lBQ1pBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLFVBQVVBLEdBQUdBLFNBQVNBO1NBQ3BDQSxLQUFNQTtZQUNOQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQSxVQUFVQSxHQUFHQSxRQUFRQTtTQUNuQ0E7SUFDRkEsQ0FBQ0E7O0lBRURSLHNCQUFBQSxVQUE4QkEsT0FBbUJBLEVBQUVBLEtBQVlBO1FBRTlEUyxJQUFJQSxPQUFPQSxZQUFZQSxpQkFBaUJBLENBQUVBO1lBQ3pDQSxJQUFJQSxPQUFPQSxHQUFHQSxPQUE0QkEsQ0FBRUEsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7WUFDNURBLE9BQU9BLENBQUNBLFdBQVdBLEdBQUdBLEtBQUtBO1NBQzNCQTtJQUNGQSxDQUFDQTs7SUFFRFQseUJBQUFBLFVBQWlDQSxPQUFtQkEsRUFBRUEsQ0FBUUEsRUFBRUEsQ0FBUUEsRUFBRUEsUUFBd0JBO1FBQXhCVSx1Q0FBQUEsUUFBUUEsR0FBV0EsS0FBS0E7QUFBQUEsUUFFakdBLElBQUlBLFFBQVFBLENBQUVBO1lBQ2JBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLFFBQVFBLEdBQUdBLFVBQVVBO1NBQ25DQSxLQUFNQTtZQUNOQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxHQUFHQSxVQUFVQTtTQUNuQ0E7O1FBRURBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLEdBQUdBLElBQUlBO1FBQzdCQSxPQUFPQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQTtJQUM3QkEsQ0FBQ0E7SUFDRlYsV0FBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxvQkFBYSxDQUFBIiwiZmlsZSI6InV0aWxzL0NTUy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImNsYXNzIENTU1xue1xuXHRwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRTaXplKGVsZW1lbnQ6SFRNTEVsZW1lbnQsIHdpZHRoOm51bWJlciwgaGVpZ2h0Om51bWJlcilcblx0e1xuXHRcdGVsZW1lbnQuc3R5bGUud2lkdGggPSB3aWR0aCArIFwicHhcIjtcblx0XHRlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcblx0XHRlbGVtZW50W1wid2lkdGhcIl0gPSB3aWR0aDtcblx0XHRlbGVtZW50W1wiaGVpZ2h0XCJdID0gaGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBzZXRFbGVtZW50V2lkdGgoZWxlbWVudDpIVE1MRWxlbWVudCwgd2lkdGg6bnVtYmVyKVxuXHR7XG5cdFx0ZWxlbWVudC5zdHlsZS53aWR0aCA9IHdpZHRoICsgXCJweFwiO1xuXHRcdGVsZW1lbnRbXCJ3aWR0aFwiXSA9IHdpZHRoO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBzZXRFbGVtZW50SGVpZ2h0KGVsZW1lbnQ6SFRNTEVsZW1lbnQsIGhlaWdodDpudW1iZXIpXG5cdHtcblx0XHRlbGVtZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArIFwicHhcIjtcblx0XHRlbGVtZW50W1wiaGVpZ2h0XCJdID0gaGVpZ2h0O1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBzZXRFbGVtZW50WChlbGVtZW50OkhUTUxFbGVtZW50LCB4Om51bWJlcilcblx0e1xuXHRcdGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuXHRcdGVsZW1lbnQuc3R5bGUubGVmdCA9IHggKyBcInB4XCI7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHNldEVsZW1lbnRZKGVsZW1lbnQ6SFRNTEVsZW1lbnQsIHk6bnVtYmVyKVxuXHR7XG5cdFx0ZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0ZWxlbWVudC5zdHlsZS50b3AgPSB5ICsgXCJweFwiO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBnZXRFbGVtZW50VmlzaWJpbGl0eShlbGVtZW50OkhUTUxFbGVtZW50KTpib29sZWFuXG5cdHtcblx0XHRyZXR1cm4gZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID09ICd2aXNpYmxlJztcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgc2V0RWxlbWVudFZpc2liaWxpdHkoZWxlbWVudDpIVE1MRWxlbWVudCwgdmlzaWJsZTpib29sZWFuKVxuXHR7XG5cdFx0aWYgKHZpc2libGUpIHtcblx0XHRcdGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHN0YXRpYyBzZXRFbGVtZW50QWxwaGEoZWxlbWVudDpIVE1MRWxlbWVudCwgYWxwaGE6bnVtYmVyKVxuXHR7XG5cdFx0aWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkge1xuXHRcdFx0dmFyIGNvbnRleHQgPSAoPEhUTUxDYW52YXNFbGVtZW50PiBlbGVtZW50KS5nZXRDb250ZXh0KFwiMmRcIik7XG5cdFx0XHRjb250ZXh0Lmdsb2JhbEFscGhhID0gYWxwaGE7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHN0YXRpYyBzZXRFbGVtZW50UG9zaXRpb24oZWxlbWVudDpIVE1MRWxlbWVudCwgeDpudW1iZXIsIHk6bnVtYmVyLCBhYnNvbHV0ZTpib29sZWFuID0gZmFsc2UpXG5cdHtcblx0XHRpZiAoYWJzb2x1dGUpIHtcblx0XHRcdGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0ZWxlbWVudC5zdHlsZS5sZWZ0ID0geCArIFwicHhcIjtcblx0XHRlbGVtZW50LnN0eWxlLnRvcCA9IHkgKyBcInB4XCI7XG5cdH1cbn1cblxuZXhwb3J0ID0gQ1NTOyJdfQ== \ No newline at end of file diff --git a/lib/utils/CSS.ts b/lib/utils/CSS.ts new file mode 100644 index 00000000..b8d2ba41 --- /dev/null +++ b/lib/utils/CSS.ts @@ -0,0 +1,70 @@ +class CSS +{ + public static setElementSize(element:HTMLElement, width:number, height:number) + { + element.style.width = width + "px"; + element.style.height = height + "px"; + element["width"] = width; + element["height"] = height; + } + + public static setElementWidth(element:HTMLElement, width:number) + { + element.style.width = width + "px"; + element["width"] = width; + } + + public static setElementHeight(element:HTMLElement, height:number) + { + element.style.height = height + "px"; + element["height"] = height; + } + + public static setElementX(element:HTMLElement, x:number) + { + element.style.position = 'absolute'; + element.style.left = x + "px"; + } + + public static setElementY(element:HTMLElement, y:number) + { + element.style.position = 'absolute'; + element.style.top = y + "px"; + } + + public static getElementVisibility(element:HTMLElement):boolean + { + return element.style.visibility == 'visible'; + } + + public static setElementVisibility(element:HTMLElement, visible:boolean) + { + if (visible) { + element.style.visibility = 'visible'; + } else { + element.style.visibility = 'hidden'; + } + } + + public static setElementAlpha(element:HTMLElement, alpha:number) + { + if (element instanceof HTMLCanvasElement) { + var context = ( element).getContext("2d"); + context.globalAlpha = alpha; + } + } + + public static setElementPosition(element:HTMLElement, x:number, y:number, absolute:boolean = false) + { + if (absolute) { + element.style.position = "absolute"; + } else { + element.style.position = "relative"; + } + + element.style.left = x + "px"; + element.style.top = y + "px"; + } +} + +export = CSS; \ No newline at end of file diff --git a/lib/utils/Cast.js b/lib/utils/Cast.js new file mode 100755 index 00000000..ced601aa --- /dev/null +++ b/lib/utils/Cast.js @@ -0,0 +1,312 @@ +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var CastError = require("awayjs-core/lib/errors/CastError"); +var BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); +var ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); +var ByteArray = require("awayjs-core/lib/utils/ByteArray"); + +/** +* Helper class for casting assets to usable objects +*/ +var Cast = (function () { + function Cast() { + } + Cast.string = function (data) { + if (typeof (data) == 'function') + data = new data; + + if (typeof (data) == 'string') + return data; + + return data; + }; + + Cast.byteArray = function (data) { + if (typeof (data) == 'function') + data = new data; + + if (data instanceof ByteArray) + return data; + + return data; + }; + + // public static xml(data:any):XML + // { + // if (typeof(data) == 'function') + // data = new data; + // + // if (data is XML) + // return data; + // + // return XML(data); + // } + Cast.isHex = function (str) { + var length = str.length; + for (var i = 0; i < length; ++i) { + if (this._hexChars.indexOf(str.charAt(i)) == -1) + return false; + } + + return true; + }; + + Cast.tryColor = function (data) { + if (typeof (data) == 'number') + return Math.floor(data); + + if (typeof (data) == 'string') { + if (data == "random") + return Math.floor(Math.random() * 0x1000000); + + if (this._colorNames == null) { + this._colorNames = new Object(); + this._colorNames["steelblue"] = 0x4682B4; + this._colorNames["royalblue"] = 0x041690; + this._colorNames["cornflowerblue"] = 0x6495ED; + this._colorNames["lightsteelblue"] = 0xB0C4DE; + this._colorNames["mediumslateblue"] = 0x7B68EE; + this._colorNames["slateblue"] = 0x6A5ACD; + this._colorNames["darkslateblue"] = 0x483D8B; + this._colorNames["midnightblue"] = 0x191970; + this._colorNames["navy"] = 0x000080; + this._colorNames["darkblue"] = 0x00008B; + this._colorNames["mediumblue"] = 0x0000CD; + this._colorNames["blue"] = 0x0000FF; + this._colorNames["dodgerblue"] = 0x1E90FF; + this._colorNames["deepskyblue"] = 0x00BFFF; + this._colorNames["lightskyblue"] = 0x87CEFA; + this._colorNames["skyblue"] = 0x87CEEB; + this._colorNames["lightblue"] = 0xADD8E6; + this._colorNames["powderblue"] = 0xB0E0E6; + this._colorNames["azure"] = 0xF0FFFF; + this._colorNames["lightcyan"] = 0xE0FFFF; + this._colorNames["paleturquoise"] = 0xAFEEEE; + this._colorNames["mediumturquoise"] = 0x48D1CC; + this._colorNames["lightseagreen"] = 0x20B2AA; + this._colorNames["darkcyan"] = 0x008B8B; + this._colorNames["teal"] = 0x008080; + this._colorNames["cadetblue"] = 0x5F9EA0; + this._colorNames["darkturquoise"] = 0x00CED1; + this._colorNames["aqua"] = 0x00FFFF; + this._colorNames["cyan"] = 0x00FFFF; + this._colorNames["turquoise"] = 0x40E0D0; + this._colorNames["aquamarine"] = 0x7FFFD4; + this._colorNames["mediumaquamarine"] = 0x66CDAA; + this._colorNames["darkseagreen"] = 0x8FBC8F; + this._colorNames["mediumseagreen"] = 0x3CB371; + this._colorNames["seagreen"] = 0x2E8B57; + this._colorNames["darkgreen"] = 0x006400; + this._colorNames["green"] = 0x008000; + this._colorNames["forestgreen"] = 0x228B22; + this._colorNames["limegreen"] = 0x32CD32; + this._colorNames["lime"] = 0x00FF00; + this._colorNames["chartreuse"] = 0x7FFF00; + this._colorNames["lawngreen"] = 0x7CFC00; + this._colorNames["greenyellow"] = 0xADFF2F; + this._colorNames["yellowgreen"] = 0x9ACD32; + this._colorNames["palegreen"] = 0x98FB98; + this._colorNames["lightgreen"] = 0x90EE90; + this._colorNames["springgreen"] = 0x00FF7F; + this._colorNames["mediumspringgreen"] = 0x00FA9A; + this._colorNames["darkolivegreen"] = 0x556B2F; + this._colorNames["olivedrab"] = 0x6B8E23; + this._colorNames["olive"] = 0x808000; + this._colorNames["darkkhaki"] = 0xBDB76B; + this._colorNames["darkgoldenrod"] = 0xB8860B; + this._colorNames["goldenrod"] = 0xDAA520; + this._colorNames["gold"] = 0xFFD700; + this._colorNames["yellow"] = 0xFFFF00; + this._colorNames["khaki"] = 0xF0E68C; + this._colorNames["palegoldenrod"] = 0xEEE8AA; + this._colorNames["blanchedalmond"] = 0xFFEBCD; + this._colorNames["moccasin"] = 0xFFE4B5; + this._colorNames["wheat"] = 0xF5DEB3; + this._colorNames["navajowhite"] = 0xFFDEAD; + this._colorNames["burlywood"] = 0xDEB887; + this._colorNames["tan"] = 0xD2B48C; + this._colorNames["rosybrown"] = 0xBC8F8F; + this._colorNames["sienna"] = 0xA0522D; + this._colorNames["saddlebrown"] = 0x8B4513; + this._colorNames["chocolate"] = 0xD2691E; + this._colorNames["peru"] = 0xCD853F; + this._colorNames["sandybrown"] = 0xF4A460; + this._colorNames["darkred"] = 0x8B0000; + this._colorNames["maroon"] = 0x800000; + this._colorNames["brown"] = 0xA52A2A; + this._colorNames["firebrick"] = 0xB22222; + this._colorNames["indianred"] = 0xCD5C5C; + this._colorNames["lightcoral"] = 0xF08080; + this._colorNames["salmon"] = 0xFA8072; + this._colorNames["darksalmon"] = 0xE9967A; + this._colorNames["lightsalmon"] = 0xFFA07A; + this._colorNames["coral"] = 0xFF7F50; + this._colorNames["tomato"] = 0xFF6347; + this._colorNames["darkorange"] = 0xFF8C00; + this._colorNames["orange"] = 0xFFA500; + this._colorNames["orangered"] = 0xFF4500; + this._colorNames["crimson"] = 0xDC143C; + this._colorNames["red"] = 0xFF0000; + this._colorNames["deeppink"] = 0xFF1493; + this._colorNames["fuchsia"] = 0xFF00FF; + this._colorNames["magenta"] = 0xFF00FF; + this._colorNames["hotpink"] = 0xFF69B4; + this._colorNames["lightpink"] = 0xFFB6C1; + this._colorNames["pink"] = 0xFFC0CB; + this._colorNames["palevioletred"] = 0xDB7093; + this._colorNames["mediumvioletred"] = 0xC71585; + this._colorNames["purple"] = 0x800080; + this._colorNames["darkmagenta"] = 0x8B008B; + this._colorNames["mediumpurple"] = 0x9370DB; + this._colorNames["blueviolet"] = 0x8A2BE2; + this._colorNames["indigo"] = 0x4B0082; + this._colorNames["darkviolet"] = 0x9400D3; + this._colorNames["darkorchid"] = 0x9932CC; + this._colorNames["mediumorchid"] = 0xBA55D3; + this._colorNames["orchid"] = 0xDA70D6; + this._colorNames["violet"] = 0xEE82EE; + this._colorNames["plum"] = 0xDDA0DD; + this._colorNames["thistle"] = 0xD8BFD8; + this._colorNames["lavender"] = 0xE6E6FA; + this._colorNames["ghostwhite"] = 0xF8F8FF; + this._colorNames["aliceblue"] = 0xF0F8FF; + this._colorNames["mintcream"] = 0xF5FFFA; + this._colorNames["honeydew"] = 0xF0FFF0; + this._colorNames["lightgoldenrodyellow"] = 0xFAFAD2; + this._colorNames["lemonchiffon"] = 0xFFFACD; + this._colorNames["cornsilk"] = 0xFFF8DC; + this._colorNames["lightyellow"] = 0xFFFFE0; + this._colorNames["ivory"] = 0xFFFFF0; + this._colorNames["floralwhite"] = 0xFFFAF0; + this._colorNames["linen"] = 0xFAF0E6; + this._colorNames["oldlace"] = 0xFDF5E6; + this._colorNames["antiquewhite"] = 0xFAEBD7; + this._colorNames["bisque"] = 0xFFE4C4; + this._colorNames["peachpuff"] = 0xFFDAB9; + this._colorNames["papayawhip"] = 0xFFEFD5; + this._colorNames["beige"] = 0xF5F5DC; + this._colorNames["seashell"] = 0xFFF5EE; + this._colorNames["lavenderblush"] = 0xFFF0F5; + this._colorNames["mistyrose"] = 0xFFE4E1; + this._colorNames["snow"] = 0xFFFAFA; + this._colorNames["white"] = 0xFFFFFF; + this._colorNames["whitesmoke"] = 0xF5F5F5; + this._colorNames["gainsboro"] = 0xDCDCDC; + this._colorNames["lightgrey"] = 0xD3D3D3; + this._colorNames["silver"] = 0xC0C0C0; + this._colorNames["darkgrey"] = 0xA9A9A9; + this._colorNames["grey"] = 0x808080; + this._colorNames["lightslategrey"] = 0x778899; + this._colorNames["slategrey"] = 0x708090; + this._colorNames["dimgrey"] = 0x696969; + this._colorNames["darkslategrey"] = 0x2F4F4F; + this._colorNames["black"] = 0x000000; + this._colorNames["transparent"] = 0xFF000000; + } + + if (this._colorNames[data] != null) + return this._colorNames[data]; + + if ((data.length == 6) && this.isHex(data)) + return parseInt("0x" + data); + } + + return null; + }; + + Cast.color = function (data) { + var result = this.tryColor(data); + + if (result == null) + throw new CastError("Can't cast to color: " + data); + + return result; + }; + + Cast.tryClass = function (name) { + if (this._notClasses[name]) + return name; + + var result = this._classes[name]; + + if (result != null) + return result; + + try { + result = window[name]; + this._classes[name] = result; + return result; + } catch (e) { + } + + this._notClasses[name] = true; + + return name; + }; + + Cast.bitmapData = function (data) { + if (data == null) + return null; + + if (typeof (data) == 'string') + data = this.tryClass(data); + + if (typeof (data) == 'function') { + try { + data = new data(); + } catch (e) { + data = new data(0, 0); + } + } + + if (data instanceof BitmapData) + return data; + + if (data instanceof ImageTexture) + data = data.htmlImageElement; + + if (data instanceof HTMLImageElement) { + var imageElement = data; + var bitmapData = new BitmapData(imageElement.width, imageElement.height, true, 0x0); + bitmapData.draw(imageElement); + return bitmapData; + } + + throw new CastError("Can't cast to BitmapData: " + data); + }; + + Cast.bitmapTexture = function (data) { + if (data == null) + return null; + + if (typeof (data) == 'string') + data = this.tryClass(data); + + if (typeof (data) == 'function') { + try { + data = new data(); + } catch (e) { + data = new data(0, 0); + } + } + + if (data instanceof BitmapTexture) + return data; + + try { + var bmd = Cast.bitmapData(data); + return new BitmapTexture(bmd); + } catch (e) { + } + + throw new CastError("Can't cast to BitmapTexture: " + data); + }; + Cast._hexChars = "0123456789abcdefABCDEF"; + + Cast._notClasses = new Object(); + Cast._classes = new Object(); + return Cast; +})(); + +module.exports = Cast; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0Nhc3QudHMiXSwibmFtZXMiOlsiQ2FzdCIsIkNhc3QuY29uc3RydWN0b3IiLCJDYXN0LnN0cmluZyIsIkNhc3QuYnl0ZUFycmF5IiwiQ2FzdC5pc0hleCIsIkNhc3QudHJ5Q29sb3IiLCJDYXN0LmNvbG9yIiwiQ2FzdC50cnlDbGFzcyIsIkNhc3QuYml0bWFwRGF0YSIsIkNhc3QuYml0bWFwVGV4dHVyZSJdLCJtYXBwaW5ncyI6IkFBQUEsZ0VBQXVFO0FBQ3ZFLDJEQUFrRTtBQUNsRSxxRUFBMkU7QUFDM0UsbUVBQTBFO0FBQzFFLDBEQUFpRTs7QUFFakU7O0VBRUc7QUFDSDtJQUFBQTtJQTZUQUMsQ0FBQ0E7QUFBQUQsSUFyVEFBLGNBQUFBLFVBQXFCQSxJQUFRQTtRQUU1QkUsSUFBSUEsT0FBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsVUFBVUE7WUFDN0JBLElBQUlBLEdBQUdBLElBQUlBLElBQUlBLENBQUNBOztRQUVqQkEsSUFBSUEsT0FBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsUUFBUUE7WUFDM0JBLE9BQU9BLElBQUlBLENBQUNBOztRQUViQSxPQUFnQkEsSUFBSUE7SUFDckJBLENBQUNBOztJQUVERixpQkFBQUEsVUFBd0JBLElBQVFBO1FBRS9CRyxJQUFJQSxPQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxVQUFVQTtZQUM3QkEsSUFBSUEsR0FBR0EsSUFBSUEsSUFBSUEsQ0FBQ0E7O1FBRWpCQSxJQUFJQSxJQUFJQSxZQUFZQSxTQUFTQTtZQUM1QkEsT0FBT0EsSUFBSUEsQ0FBQ0E7O1FBRWJBLE9BQW1CQSxJQUFJQTtJQUN4QkEsQ0FBQ0E7O0lBYURILHlDQVh5Q0E7SUFDekNBLFdBQVdBO0lBQ1hBLDZDQUE2Q0E7SUFDN0NBLGtDQUFrQ0E7SUFDbENBLEVBQUVBO0lBQ0ZBLDhCQUE4QkE7SUFDOUJBLDhCQUE4QkE7SUFDOUJBLEVBQUVBO0lBQ0ZBLCtCQUErQkE7SUFDL0JBLFdBQVdBO2lCQUVYQSxVQUFxQkEs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QUlBLElBQUlBLENBQUNBLENBQUNBO2FBQ2pCQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFvQkE7Z0JBQzdCQSxJQUFJQSxHQUFHQSxJQUFJQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTthQUNyQkE7U0FDREE7O1FBRURBLElBQUlBLElBQUlBLFlBQVlBLGFBQWFBO1lBQ2hDQSxPQUFPQSxJQUFJQSxDQUFDQTs7UUFFYkEsSUFBSUE7WUFDSEEsSUFBSUEsR0FBR0EsR0FBY0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7WUFDMUNBLE9BQU9BLElBQUlBLGFBQWFBLENBQUNBLEdBQUdBLENBQUNBO1NBQzdCQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFnQkE7U0FDekJBOztRQUVEQSxNQUFNQSxJQUFJQSxTQUFTQSxDQUFDQSwrQkFBK0JBLEdBQUdBLElBQUlBLENBQUNBO0lBQzVEQSxDQUFDQTtJQXpURFQsaUJBQWtDQSx3QkFBd0JBOztJQUUxREEsbUJBQW9DQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQTtJQUNoREEsZ0JBQWlDQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQTtJQXVUOUNBLFlBQUNBO0FBQURBLENBQUNBLElBQUE7O0FBRUQscUJBQWMsQ0FBQSIsImZpbGUiOiJ1dGlscy9DYXN0LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpdG1hcERhdGFcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2Jhc2UvQml0bWFwRGF0YVwiKTtcbmltcG9ydCBDYXN0RXJyb3JcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvQ2FzdEVycm9yXCIpO1xuaW1wb3J0IEJpdG1hcFRleHR1cmVcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvQml0bWFwVGV4dHVyZVwiKTtcbmltcG9ydCBJbWFnZVRleHR1cmVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9JbWFnZVRleHR1cmVcIik7XG5pbXBvcnQgQnl0ZUFycmF5XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvQnl0ZUFycmF5XCIpO1xuXG4vKipcbiAqIEhlbHBlciBjbGFzcyBmb3IgY2FzdGluZyBhc3NldHMgdG8gdXNhYmxlIG9iamVjdHNcbiAqL1xuY2xhc3MgQ2FzdFxue1xuXHRwcml2YXRlIHN0YXRpYyBfY29sb3JOYW1lczpPYmplY3Q7XG5cdHByaXZhdGUgc3RhdGljIF9oZXhDaGFyczpzdHJpbmcgPSBcIjAxMjM0NTY3ODlhYmNkZWZBQkNERUZcIjtcblxuXHRwcml2YXRlIHN0YXRpYyBfbm90Q2xhc3NlczpPYmplY3QgPSBuZXcgT2JqZWN0KCk7XG5cdHByaXZhdGUgc3RhdGljIF9jbGFzc2VzOk9iamVjdCA9IG5ldyBPYmplY3QoKTtcblxuXHRwdWJsaWMgc3RhdGljIHN0cmluZyhkYXRhOmFueSk6c3RyaW5nXG5cdHtcblx0XHRpZiAodHlwZW9mKGRhdGEpID09ICdmdW5jdGlvbicpXG5cdFx0XHRkYXRhID0gbmV3IGRhdGE7XG5cblx0XHRpZiAodHlwZW9mKGRhdGEpID09ICdzdHJpbmcnKVxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHRyZXR1cm4gPHN0cmluZz4gZGF0YTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgYnl0ZUFycmF5KGRhdGE6YW55KTpCeXRlQXJyYXlcblx0e1xuXHRcdGlmICh0eXBlb2YoZGF0YSkgPT0gJ2Z1bmN0aW9uJylcblx0XHRcdGRhdGEgPSBuZXcgZGF0YTtcblxuXHRcdGlmIChkYXRhIGluc3RhbmNlb2YgQnl0ZUFycmF5KVxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHRyZXR1cm4gPEJ5dGVBcnJheT4gZGF0YTtcblx0fVxuXG5cdC8vICAgICAgICBwdWJsaWMgc3RhdGljIHhtbChkYXRhOmFueSk6WE1MXG5cdC8vICAgICAgICB7XG5cdC8vICAgICAgICAgICAgaWYgKHR5cGVvZihkYXRhKSA9PSAnZnVuY3Rpb24nKVxuXHQvLyAgICAgICAgICAgICAgICBkYXRhID0gbmV3IGRhdGE7XG5cdC8vXG5cdC8vICAgICAgICAgICAgaWYgKGRhdGEgaXMgWE1MKVxuXHQvLyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcblx0Ly9cblx0Ly8gICAgICAgICAgICByZXR1cm4gWE1MKGRhdGEpO1xuXHQvLyAgICAgICAgfVxuXG5cdHByaXZhdGUgc3RhdGljIGlzSGV4KHN0cjpzdHJpbmcpOmJvb2xlYW5cblx0e1xuXHRcdHZhciBsZW5ndGg6bnVtYmVyIC8qaW50Ki8gPSBzdHIubGVuZ3RoO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyIC8qaW50Ki8gPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcblx0XHRcdGlmICh0aGlzLl9oZXhDaGFycy5pbmRleE9mKHN0ci5jaGFyQXQoaSkpID09IC0xKVxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIHRyeUNvbG9yKGRhdGE6YW55KTpudW1iZXIgLyp1aW50Ki9cblx0e1xuXHRcdGlmICh0eXBlb2YoZGF0YSkgPT0gJ251bWJlcicgLyp1aW50Ki8pXG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vcig8bnVtYmVyPiBkYXRhKTtcblxuXHRcdGlmICh0eXBlb2YoZGF0YSkgPT0gJ3N0cmluZycpIHtcblx0XHRcdGlmIChkYXRhID09IFwicmFuZG9tXCIpXG5cdFx0XHRcdHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMHgxMDAwMDAwKTtcblxuXHRcdFx0aWYgKHRoaXMuX2NvbG9yTmFtZXMgPT0gbnVsbCkge1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzID0gbmV3IE9iamVjdCgpO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wic3RlZWxibHVlXCJdID0gMHg0NjgyQjQ7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJyb3lhbGJsdWVcIl0gPSAweDA0MTY5MDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImNvcm5mbG93ZXJibHVlXCJdID0gMHg2NDk1RUQ7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsaWdodHN0ZWVsYmx1ZVwiXSA9IDB4QjBDNERFO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibWVkaXVtc2xhdGVibHVlXCJdID0gMHg3QjY4RUU7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJzbGF0ZWJsdWVcIl0gPSAweDZBNUFDRDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRhcmtzbGF0ZWJsdWVcIl0gPSAweDQ4M0Q4Qjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm1pZG5pZ2h0Ymx1ZVwiXSA9IDB4MTkxOTcwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibmF2eVwiXSA9IDB4MDAwMDgwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiZGFya2JsdWVcIl0gPSAweDAwMDA4Qjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm1lZGl1bWJsdWVcIl0gPSAweDAwMDBDRDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImJsdWVcIl0gPSAweDAwMDBGRjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRvZGdlcmJsdWVcIl0gPSAweDFFOTBGRjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRlZXBza3libHVlXCJdID0gMHgwMEJGRkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsaWdodHNreWJsdWVcIl0gPSAweDg3Q0VGQTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInNreWJsdWVcIl0gPSAweDg3Q0VFQjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImxpZ2h0Ymx1ZVwiXSA9IDB4QUREOEU2O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wicG93ZGVyYmx1ZVwiXSA9IDB4QjBFMEU2O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiYXp1cmVcIl0gPSAweEYwRkZGRjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImxpZ2h0Y3lhblwiXSA9IDB4RTBGRkZGO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wicGFsZXR1cnF1b2lzZVwiXSA9IDB4QUZFRUVFO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibWVkaXVtdHVycXVvaXNlXCJdID0gMHg0OEQxQ0M7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsaWdodHNlYWdyZWVuXCJdID0gMHgyMEIyQUE7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJkYXJrY3lhblwiXSA9IDB4MDA4QjhCO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1widGVhbFwiXSA9IDB4MDA4MDgwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiY2FkZXRibHVlXCJdID0gMHg1RjlFQTA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJkYXJrdHVycXVvaXNlXCJdID0gMHgwMENFRDE7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJhcXVhXCJdID0gMHgwMEZGRkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJjeWFuXCJdID0gMHgwMEZGRkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJ0dXJxdW9pc2VcIl0gPSAweDQwRTBEMDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImFxdWFtYXJpbmVcIl0gPSAweDdGRkZENDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm1lZGl1bWFxdWFtYXJpbmVcIl0gPSAweDY2Q0RBQTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRhcmtzZWFncmVlblwiXSA9IDB4OEZCQzhGO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibWVkaXVtc2VhZ3JlZW5cIl0gPSAweDNDQjM3MTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInNlYWdyZWVuXCJdID0gMHgyRThCNTc7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJkYXJrZ3JlZW5cIl0gPSAweDAwNjQwMDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImdyZWVuXCJdID0gMHgwMDgwMDA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJmb3Jlc3RncmVlblwiXSA9IDB4MjI4QjIyO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibGltZWdyZWVuXCJdID0gMHgzMkNEMzI7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsaW1lXCJdID0gMHgwMEZGMDA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJjaGFydHJldXNlXCJdID0gMHg3RkZGMDA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsYXduZ3JlZW5cIl0gPSAweDdDRkMwMDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImdyZWVueWVsbG93XCJdID0gMHhBREZGMkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJ5ZWxsb3dncmVlblwiXSA9IDB4OUFDRDMyO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wicGFsZWdyZWVuXCJdID0gMHg5OEZCOTg7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsaWdodGdyZWVuXCJdID0gMHg5MEVFOTA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJzcHJpbmdncmVlblwiXSA9IDB4MDBGRjdGO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibWVkaXVtc3ByaW5nZ3JlZW5cIl0gPSAweDAwRkE5QTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRhcmtvbGl2ZWdyZWVuXCJdID0gMHg1NTZCMkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJvbGl2ZWRyYWJcIl0gPSAweDZCOEUyMztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm9saXZlXCJdID0gMHg4MDgwMDA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJkYXJra2hha2lcIl0gPSAweEJEQjc2Qjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRhcmtnb2xkZW5yb2RcIl0gPSAweEI4ODYwQjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImdvbGRlbnJvZFwiXSA9IDB4REFBNTIwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiZ29sZFwiXSA9IDB4RkZENzAwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wieWVsbG93XCJdID0gMHhGRkZGMDA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJraGFraVwiXSA9IDB4RjBFNjhDO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wicGFsZWdvbGRlbnJvZFwiXSA9IDB4RUVFOEFBO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiYmxhbmNoZWRhbG1vbmRcIl0gPSAweEZGRUJDRDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm1vY2Nhc2luXCJdID0gMHhGRkU0QjU7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJ3aGVhdFwiXSA9IDB4RjVERUIzO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibmF2YWpvd2hpdGVcIl0gPSAweEZGREVBRDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImJ1cmx5d29vZFwiXSA9IDB4REVCODg3O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1widGFuXCJdID0gMHhEMkI0OEM7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJyb3N5YnJvd25cIl0gPSAweEJDOEY4Rjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInNpZW5uYVwiXSA9IDB4QTA1MjJEO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wic2FkZGxlYnJvd25cIl0gPSAweDhCNDUxMztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImNob2NvbGF0ZVwiXSA9IDB4RDI2OTFFO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wicGVydVwiXSA9IDB4Q0Q4NTNGO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wic2FuZHlicm93blwiXSA9IDB4RjRBNDYwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiZGFya3JlZFwiXSA9IDB4OEIwMDAwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibWFyb29uXCJdID0gMHg4MDAwMDA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJicm93blwiXSA9IDB4QTUyQTJBO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiZmlyZWJyaWNrXCJdID0gMHhCMjIyMjI7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJpbmRpYW5yZWRcIl0gPSAweENENUM1Qztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImxpZ2h0Y29yYWxcIl0gPSAweEYwODA4MDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInNhbG1vblwiXSA9IDB4RkE4MDcyO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiZGFya3NhbG1vblwiXSA9IDB4RTk5NjdBO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibGlnaHRzYWxtb25cIl0gPSAweEZGQTA3QTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImNvcmFsXCJdID0gMHhGRjdGNTA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJ0b21hdG9cIl0gPSAweEZGNjM0Nztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRhcmtvcmFuZ2VcIl0gPSAweEZGOEMwMDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm9yYW5nZVwiXSA9IDB4RkZBNTAwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wib3JhbmdlcmVkXCJdID0gMHhGRjQ1MDA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJjcmltc29uXCJdID0gMHhEQzE0M0M7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJyZWRcIl0gPSAweEZGMDAwMDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRlZXBwaW5rXCJdID0gMHhGRjE0OTM7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJmdWNoc2lhXCJdID0gMHhGRjAwRkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJtYWdlbnRhXCJdID0gMHhGRjAwRkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJob3RwaW5rXCJdID0gMHhGRjY5QjQ7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsaWdodHBpbmtcIl0gPSAweEZGQjZDMTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInBpbmtcIl0gPSAweEZGQzBDQjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInBhbGV2aW9sZXRyZWRcIl0gPSAweERCNzA5Mztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm1lZGl1bXZpb2xldHJlZFwiXSA9IDB4QzcxNTg1O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wicHVycGxlXCJdID0gMHg4MDAwODA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJkYXJrbWFnZW50YVwiXSA9IDB4OEIwMDhCO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibWVkaXVtcHVycGxlXCJdID0gMHg5MzcwREI7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJibHVldmlvbGV0XCJdID0gMHg4QTJCRTI7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJpbmRpZ29cIl0gPSAweDRCMDA4Mjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRhcmt2aW9sZXRcIl0gPSAweDk0MDBEMztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImRhcmtvcmNoaWRcIl0gPSAweDk5MzJDQztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm1lZGl1bW9yY2hpZFwiXSA9IDB4QkE1NUQzO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wib3JjaGlkXCJdID0gMHhEQTcwRDY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJ2aW9sZXRcIl0gPSAweEVFODJFRTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInBsdW1cIl0gPSAweEREQTBERDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInRoaXN0bGVcIl0gPSAweEQ4QkZEODtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImxhdmVuZGVyXCJdID0gMHhFNkU2RkE7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJnaG9zdHdoaXRlXCJdID0gMHhGOEY4RkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJhbGljZWJsdWVcIl0gPSAweEYwRjhGRjtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIm1pbnRjcmVhbVwiXSA9IDB4RjVGRkZBO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiaG9uZXlkZXdcIl0gPSAweEYwRkZGMDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImxpZ2h0Z29sZGVucm9keWVsbG93XCJdID0gMHhGQUZBRDI7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsZW1vbmNoaWZmb25cIl0gPSAweEZGRkFDRDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImNvcm5zaWxrXCJdID0gMHhGRkY4REM7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsaWdodHllbGxvd1wiXSA9IDB4RkZGRkUwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiaXZvcnlcIl0gPSAweEZGRkZGMDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImZsb3JhbHdoaXRlXCJdID0gMHhGRkZBRjA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsaW5lblwiXSA9IDB4RkFGMEU2O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wib2xkbGFjZVwiXSA9IDB4RkRGNUU2O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiYW50aXF1ZXdoaXRlXCJdID0gMHhGQUVCRDc7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJiaXNxdWVcIl0gPSAweEZGRTRDNDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInBlYWNocHVmZlwiXSA9IDB4RkZEQUI5O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wicGFwYXlhd2hpcFwiXSA9IDB4RkZFRkQ1O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiYmVpZ2VcIl0gPSAweEY1RjVEQztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInNlYXNoZWxsXCJdID0gMHhGRkY1RUU7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJsYXZlbmRlcmJsdXNoXCJdID0gMHhGRkYwRjU7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJtaXN0eXJvc2VcIl0gPSAweEZGRTRFMTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInNub3dcIl0gPSAweEZGRkFGQTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcIndoaXRlXCJdID0gMHhGRkZGRkY7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJ3aGl0ZXNtb2tlXCJdID0gMHhGNUY1RjU7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJnYWluc2Jvcm9cIl0gPSAweERDRENEQztcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcImxpZ2h0Z3JleVwiXSA9IDB4RDNEM0QzO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wic2lsdmVyXCJdID0gMHhDMEMwQzA7XG5cdFx0XHRcdHRoaXMuX2NvbG9yTmFtZXNbXCJkYXJrZ3JleVwiXSA9IDB4QTlBOUE5O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiZ3JleVwiXSA9IDB4ODA4MDgwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wibGlnaHRzbGF0ZWdyZXlcIl0gPSAweDc3ODg5OTtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInNsYXRlZ3JleVwiXSA9IDB4NzA4MDkwO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiZGltZ3JleVwiXSA9IDB4Njk2OTY5O1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiZGFya3NsYXRlZ3JleVwiXSA9IDB4MkY0RjRGO1xuXHRcdFx0XHR0aGlzLl9jb2xvck5hbWVzW1wiYmxhY2tcIl0gPSAweDAwMDAwMDtcblx0XHRcdFx0dGhpcy5fY29sb3JOYW1lc1tcInRyYW5zcGFyZW50XCJdID0gMHhGRjAwMDAwMDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMuX2NvbG9yTmFtZXNbZGF0YV0gIT0gbnVsbClcblx0XHRcdFx0cmV0dXJuIHRoaXMuX2NvbG9yTmFtZXNbZGF0YV07XG5cblx0XHRcdGlmICgoKDxzdHJpbmc+IGRhdGEpLmxlbmd0aCA9PSA2KSAmJiB0aGlzLmlzSGV4KGRhdGEpKVxuXHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoXCIweFwiICsgZGF0YSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGNvbG9yKGRhdGE6YW55KTpudW1iZXIgLyp1aW50Ki9cblx0e1xuXHRcdHZhciByZXN1bHQ6bnVtYmVyIC8qdWludCovID0gdGhpcy50cnlDb2xvcihkYXRhKTtcblxuXHRcdGlmIChyZXN1bHQgPT0gbnVsbClcblx0XHRcdHRocm93IG5ldyBDYXN0RXJyb3IoXCJDYW4ndCBjYXN0IHRvIGNvbG9yOiBcIiArIGRhdGEpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgdHJ5Q2xhc3MobmFtZTpzdHJpbmcpOmFueVxuXHR7XG5cdFx0aWYgKHRoaXMuX25vdENsYXNzZXNbbmFtZV0pXG5cdFx0XHRyZXR1cm4gbmFtZTtcblxuXHRcdHZhciByZXN1bHQ6YW55ID0gdGhpcy5fY2xhc3Nlc1tuYW1lXTtcblxuXHRcdGlmIChyZXN1bHQgIT0gbnVsbClcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cblx0XHR0cnkge1xuXHRcdFx0cmVzdWx0ID0gd2luZG93W25hbWVdO1xuXHRcdFx0dGhpcy5fY2xhc3Nlc1tuYW1lXSA9IHJlc3VsdDtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fSBjYXRjaCAoZSAvKlJlZmVyZW5jZUVycm9yKi8pIHtcblx0XHR9XG5cblx0XHR0aGlzLl9ub3RDbGFzc2VzW25hbWVdID0gdHJ1ZTtcblxuXHRcdHJldHVybiBuYW1lO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBiaXRtYXBEYXRhKGRhdGE6YW55KTpCaXRtYXBEYXRhXG5cdHtcblx0XHRpZiAoZGF0YSA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRpZiAodHlwZW9mKGRhdGEpID09ICdzdHJpbmcnKVxuXHRcdFx0ZGF0YSA9IHRoaXMudHJ5Q2xhc3MoZGF0YSk7XG5cblx0XHRpZiAodHlwZW9mKGRhdGEpID09ICdmdW5jdGlvbicpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBuZXcgZGF0YSgpO1xuXHRcdFx0fSBjYXRjaCAoZSAvKkFyZ3VtZW50RXJyb3IqLykge1xuXHRcdFx0XHRkYXRhID0gbmV3IGRhdGEoMCwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGRhdGEgaW5zdGFuY2VvZiBCaXRtYXBEYXRhKVxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHRpZiAoZGF0YSBpbnN0YW5jZW9mIEltYWdlVGV4dHVyZSlcblx0XHRcdGRhdGEgPSAoPEltYWdlVGV4dHVyZT4gZGF0YSkuaHRtbEltYWdlRWxlbWVudDtcblxuXHRcdGlmIChkYXRhIGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudCkge1xuXHRcdFx0dmFyIGltYWdlRWxlbWVudDpIVE1MSW1hZ2VFbGVtZW50ID0gPEhUTUxJbWFnZUVsZW1lbnQ+IGRhdGE7XG5cdFx0XHR2YXIgYml0bWFwRGF0YTpCaXRtYXBEYXRhID0gbmV3IEJpdG1hcERhdGEoaW1hZ2VFbGVtZW50LndpZHRoLCBpbWFnZUVsZW1lbnQuaGVpZ2h0LCB0cnVlLCAweDApO1xuXHRcdFx0Yml0bWFwRGF0YS5kcmF3KGltYWdlRWxlbWVudClcblx0XHRcdHJldHVybiBiaXRtYXBEYXRhO1xuXHRcdH1cblxuXHRcdC8vICAgICAgICAgICAgaWYgKGRhdGEgaXMgRGlzcGxheU9iamVjdCkge1xuXHRcdC8vICAgICAgICAgICAgICAgIHZhciBkczpEaXNwbGF5T2JqZWN0ID0gZGF0YSBhcyBEaXNwbGF5T2JqZWN0O1xuXHRcdC8vICAgICAgICAgICAgICAgIHZhciBibWQ6Qml0bWFwRGF0YSA9IG5ldyBCaXRtYXBEYXRhKGRzLndpZHRoLCBkcy5oZWlnaHQsIHRydWUsIDB4MDBGRkZGRkYpO1xuXHRcdC8vICAgICAgICAgICAgICAgIHZhciBtYXQ6TWF0cml4ID0gZHMudHJhbnNmb3JtLm1hdHJpeC5jbG9uZSgpO1xuXHRcdC8vICAgICAgICAgICAgICAgIG1hdC50eCA9IDA7XG5cdFx0Ly8gICAgICAgICAgICAgICAgbWF0LnR5ID0gMDtcblx0XHQvLyAgICAgICAgICAgICAgICBibWQuZHJhdyhkcywgbWF0LCBkcy50cmFuc2Zvcm0uY29sb3JUcmFuc2Zvcm0sIGRzLmJsZW5kTW9kZSwgYm1kLnJlY3QsIHRydWUpO1xuXHRcdC8vICAgICAgICAgICAgICAgIHJldHVybiBibWQ7XG5cdFx0Ly8gICAgICAgICAgICB9XG5cblx0XHR0aHJvdyBuZXcgQ2FzdEVycm9yKFwiQ2FuJ3QgY2FzdCB0byBCaXRtYXBEYXRhOiBcIiArIGRhdGEpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyBiaXRtYXBUZXh0dXJlKGRhdGE6YW55KTpCaXRtYXBUZXh0dXJlXG5cdHtcblx0XHRpZiAoZGF0YSA9PSBudWxsKVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cblx0XHRpZiAodHlwZW9mKGRhdGEpID09ICdzdHJpbmcnKVxuXHRcdFx0ZGF0YSA9IHRoaXMudHJ5Q2xhc3MoZGF0YSk7XG5cblx0XHRpZiAodHlwZW9mKGRhdGEpID09ICdmdW5jdGlvbicpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBuZXcgZGF0YSgpO1xuXHRcdFx0fSBjYXRjaCAoZSAvKkFyZ3VtZW50RXJyb3IqLykge1xuXHRcdFx0XHRkYXRhID0gbmV3IGRhdGEoMCwgMCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGRhdGEgaW5zdGFuY2VvZiBCaXRtYXBUZXh0dXJlKVxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIGJtZDpCaXRtYXBEYXRhID0gQ2FzdC5iaXRtYXBEYXRhKGRhdGEpO1xuXHRcdFx0cmV0dXJuIG5ldyBCaXRtYXBUZXh0dXJlKGJtZCk7XG5cdFx0fSBjYXRjaCAoZSAvKkNhc3RFcnJvciovKSB7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IENhc3RFcnJvcihcIkNhbid0IGNhc3QgdG8gQml0bWFwVGV4dHVyZTogXCIgKyBkYXRhKTtcblx0fVxufVxuXG5leHBvcnQgPSBDYXN0OyJdfQ== \ No newline at end of file diff --git a/lib/utils/Cast.ts b/lib/utils/Cast.ts new file mode 100644 index 00000000..ac7dea4f --- /dev/null +++ b/lib/utils/Cast.ts @@ -0,0 +1,329 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import CastError = require("awayjs-core/lib/errors/CastError"); +import BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); +import ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); +import ByteArray = require("awayjs-core/lib/utils/ByteArray"); + +/** + * Helper class for casting assets to usable objects + */ +class Cast +{ + private static _colorNames:Object; + private static _hexChars:string = "0123456789abcdefABCDEF"; + + private static _notClasses:Object = new Object(); + private static _classes:Object = new Object(); + + public static string(data:any):string + { + if (typeof(data) == 'function') + data = new data; + + if (typeof(data) == 'string') + return data; + + return data; + } + + public static byteArray(data:any):ByteArray + { + if (typeof(data) == 'function') + data = new data; + + if (data instanceof ByteArray) + return data; + + return data; + } + + // public static xml(data:any):XML + // { + // if (typeof(data) == 'function') + // data = new data; + // + // if (data is XML) + // return data; + // + // return XML(data); + // } + + private static isHex(str:string):boolean + { + var length:number /*int*/ = str.length; + for (var i:number /*int*/ = 0; i < length; ++i) { + if (this._hexChars.indexOf(str.charAt(i)) == -1) + return false; + } + + return true; + } + + public static tryColor(data:any):number /*uint*/ + { + if (typeof(data) == 'number' /*uint*/) + return Math.floor( data); + + if (typeof(data) == 'string') { + if (data == "random") + return Math.floor(Math.random()*0x1000000); + + if (this._colorNames == null) { + this._colorNames = new Object(); + this._colorNames["steelblue"] = 0x4682B4; + this._colorNames["royalblue"] = 0x041690; + this._colorNames["cornflowerblue"] = 0x6495ED; + this._colorNames["lightsteelblue"] = 0xB0C4DE; + this._colorNames["mediumslateblue"] = 0x7B68EE; + this._colorNames["slateblue"] = 0x6A5ACD; + this._colorNames["darkslateblue"] = 0x483D8B; + this._colorNames["midnightblue"] = 0x191970; + this._colorNames["navy"] = 0x000080; + this._colorNames["darkblue"] = 0x00008B; + this._colorNames["mediumblue"] = 0x0000CD; + this._colorNames["blue"] = 0x0000FF; + this._colorNames["dodgerblue"] = 0x1E90FF; + this._colorNames["deepskyblue"] = 0x00BFFF; + this._colorNames["lightskyblue"] = 0x87CEFA; + this._colorNames["skyblue"] = 0x87CEEB; + this._colorNames["lightblue"] = 0xADD8E6; + this._colorNames["powderblue"] = 0xB0E0E6; + this._colorNames["azure"] = 0xF0FFFF; + this._colorNames["lightcyan"] = 0xE0FFFF; + this._colorNames["paleturquoise"] = 0xAFEEEE; + this._colorNames["mediumturquoise"] = 0x48D1CC; + this._colorNames["lightseagreen"] = 0x20B2AA; + this._colorNames["darkcyan"] = 0x008B8B; + this._colorNames["teal"] = 0x008080; + this._colorNames["cadetblue"] = 0x5F9EA0; + this._colorNames["darkturquoise"] = 0x00CED1; + this._colorNames["aqua"] = 0x00FFFF; + this._colorNames["cyan"] = 0x00FFFF; + this._colorNames["turquoise"] = 0x40E0D0; + this._colorNames["aquamarine"] = 0x7FFFD4; + this._colorNames["mediumaquamarine"] = 0x66CDAA; + this._colorNames["darkseagreen"] = 0x8FBC8F; + this._colorNames["mediumseagreen"] = 0x3CB371; + this._colorNames["seagreen"] = 0x2E8B57; + this._colorNames["darkgreen"] = 0x006400; + this._colorNames["green"] = 0x008000; + this._colorNames["forestgreen"] = 0x228B22; + this._colorNames["limegreen"] = 0x32CD32; + this._colorNames["lime"] = 0x00FF00; + this._colorNames["chartreuse"] = 0x7FFF00; + this._colorNames["lawngreen"] = 0x7CFC00; + this._colorNames["greenyellow"] = 0xADFF2F; + this._colorNames["yellowgreen"] = 0x9ACD32; + this._colorNames["palegreen"] = 0x98FB98; + this._colorNames["lightgreen"] = 0x90EE90; + this._colorNames["springgreen"] = 0x00FF7F; + this._colorNames["mediumspringgreen"] = 0x00FA9A; + this._colorNames["darkolivegreen"] = 0x556B2F; + this._colorNames["olivedrab"] = 0x6B8E23; + this._colorNames["olive"] = 0x808000; + this._colorNames["darkkhaki"] = 0xBDB76B; + this._colorNames["darkgoldenrod"] = 0xB8860B; + this._colorNames["goldenrod"] = 0xDAA520; + this._colorNames["gold"] = 0xFFD700; + this._colorNames["yellow"] = 0xFFFF00; + this._colorNames["khaki"] = 0xF0E68C; + this._colorNames["palegoldenrod"] = 0xEEE8AA; + this._colorNames["blanchedalmond"] = 0xFFEBCD; + this._colorNames["moccasin"] = 0xFFE4B5; + this._colorNames["wheat"] = 0xF5DEB3; + this._colorNames["navajowhite"] = 0xFFDEAD; + this._colorNames["burlywood"] = 0xDEB887; + this._colorNames["tan"] = 0xD2B48C; + this._colorNames["rosybrown"] = 0xBC8F8F; + this._colorNames["sienna"] = 0xA0522D; + this._colorNames["saddlebrown"] = 0x8B4513; + this._colorNames["chocolate"] = 0xD2691E; + this._colorNames["peru"] = 0xCD853F; + this._colorNames["sandybrown"] = 0xF4A460; + this._colorNames["darkred"] = 0x8B0000; + this._colorNames["maroon"] = 0x800000; + this._colorNames["brown"] = 0xA52A2A; + this._colorNames["firebrick"] = 0xB22222; + this._colorNames["indianred"] = 0xCD5C5C; + this._colorNames["lightcoral"] = 0xF08080; + this._colorNames["salmon"] = 0xFA8072; + this._colorNames["darksalmon"] = 0xE9967A; + this._colorNames["lightsalmon"] = 0xFFA07A; + this._colorNames["coral"] = 0xFF7F50; + this._colorNames["tomato"] = 0xFF6347; + this._colorNames["darkorange"] = 0xFF8C00; + this._colorNames["orange"] = 0xFFA500; + this._colorNames["orangered"] = 0xFF4500; + this._colorNames["crimson"] = 0xDC143C; + this._colorNames["red"] = 0xFF0000; + this._colorNames["deeppink"] = 0xFF1493; + this._colorNames["fuchsia"] = 0xFF00FF; + this._colorNames["magenta"] = 0xFF00FF; + this._colorNames["hotpink"] = 0xFF69B4; + this._colorNames["lightpink"] = 0xFFB6C1; + this._colorNames["pink"] = 0xFFC0CB; + this._colorNames["palevioletred"] = 0xDB7093; + this._colorNames["mediumvioletred"] = 0xC71585; + this._colorNames["purple"] = 0x800080; + this._colorNames["darkmagenta"] = 0x8B008B; + this._colorNames["mediumpurple"] = 0x9370DB; + this._colorNames["blueviolet"] = 0x8A2BE2; + this._colorNames["indigo"] = 0x4B0082; + this._colorNames["darkviolet"] = 0x9400D3; + this._colorNames["darkorchid"] = 0x9932CC; + this._colorNames["mediumorchid"] = 0xBA55D3; + this._colorNames["orchid"] = 0xDA70D6; + this._colorNames["violet"] = 0xEE82EE; + this._colorNames["plum"] = 0xDDA0DD; + this._colorNames["thistle"] = 0xD8BFD8; + this._colorNames["lavender"] = 0xE6E6FA; + this._colorNames["ghostwhite"] = 0xF8F8FF; + this._colorNames["aliceblue"] = 0xF0F8FF; + this._colorNames["mintcream"] = 0xF5FFFA; + this._colorNames["honeydew"] = 0xF0FFF0; + this._colorNames["lightgoldenrodyellow"] = 0xFAFAD2; + this._colorNames["lemonchiffon"] = 0xFFFACD; + this._colorNames["cornsilk"] = 0xFFF8DC; + this._colorNames["lightyellow"] = 0xFFFFE0; + this._colorNames["ivory"] = 0xFFFFF0; + this._colorNames["floralwhite"] = 0xFFFAF0; + this._colorNames["linen"] = 0xFAF0E6; + this._colorNames["oldlace"] = 0xFDF5E6; + this._colorNames["antiquewhite"] = 0xFAEBD7; + this._colorNames["bisque"] = 0xFFE4C4; + this._colorNames["peachpuff"] = 0xFFDAB9; + this._colorNames["papayawhip"] = 0xFFEFD5; + this._colorNames["beige"] = 0xF5F5DC; + this._colorNames["seashell"] = 0xFFF5EE; + this._colorNames["lavenderblush"] = 0xFFF0F5; + this._colorNames["mistyrose"] = 0xFFE4E1; + this._colorNames["snow"] = 0xFFFAFA; + this._colorNames["white"] = 0xFFFFFF; + this._colorNames["whitesmoke"] = 0xF5F5F5; + this._colorNames["gainsboro"] = 0xDCDCDC; + this._colorNames["lightgrey"] = 0xD3D3D3; + this._colorNames["silver"] = 0xC0C0C0; + this._colorNames["darkgrey"] = 0xA9A9A9; + this._colorNames["grey"] = 0x808080; + this._colorNames["lightslategrey"] = 0x778899; + this._colorNames["slategrey"] = 0x708090; + this._colorNames["dimgrey"] = 0x696969; + this._colorNames["darkslategrey"] = 0x2F4F4F; + this._colorNames["black"] = 0x000000; + this._colorNames["transparent"] = 0xFF000000; + } + + if (this._colorNames[data] != null) + return this._colorNames[data]; + + if ((( data).length == 6) && this.isHex(data)) + return parseInt("0x" + data); + } + + return null; + } + + public static color(data:any):number /*uint*/ + { + var result:number /*uint*/ = this.tryColor(data); + + if (result == null) + throw new CastError("Can't cast to color: " + data); + + return result; + } + + public static tryClass(name:string):any + { + if (this._notClasses[name]) + return name; + + var result:any = this._classes[name]; + + if (result != null) + return result; + + try { + result = window[name]; + this._classes[name] = result; + return result; + } catch (e /*ReferenceError*/) { + } + + this._notClasses[name] = true; + + return name; + } + + public static bitmapData(data:any):BitmapData + { + if (data == null) + return null; + + if (typeof(data) == 'string') + data = this.tryClass(data); + + if (typeof(data) == 'function') { + try { + data = new data(); + } catch (e /*ArgumentError*/) { + data = new data(0, 0); + } + } + + if (data instanceof BitmapData) + return data; + + if (data instanceof ImageTexture) + data = ( data).htmlImageElement; + + if (data instanceof HTMLImageElement) { + var imageElement:HTMLImageElement = data; + var bitmapData:BitmapData = new BitmapData(imageElement.width, imageElement.height, true, 0x0); + bitmapData.draw(imageElement) + return bitmapData; + } + + // if (data is DisplayObject) { + // var ds:DisplayObject = data as DisplayObject; + // var bmd:BitmapData = new BitmapData(ds.width, ds.height, true, 0x00FFFFFF); + // var mat:Matrix = ds.transform.matrix.clone(); + // mat.tx = 0; + // mat.ty = 0; + // bmd.draw(ds, mat, ds.transform.colorTransform, ds.blendMode, bmd.rect, true); + // return bmd; + // } + + throw new CastError("Can't cast to BitmapData: " + data); + } + + public static bitmapTexture(data:any):BitmapTexture + { + if (data == null) + return null; + + if (typeof(data) == 'string') + data = this.tryClass(data); + + if (typeof(data) == 'function') { + try { + data = new data(); + } catch (e /*ArgumentError*/) { + data = new data(0, 0); + } + } + + if (data instanceof BitmapTexture) + return data; + + try { + var bmd:BitmapData = Cast.bitmapData(data); + return new BitmapTexture(bmd); + } catch (e /*CastError*/) { + } + + throw new CastError("Can't cast to BitmapTexture: " + data); + } +} + +export = Cast; \ No newline at end of file diff --git a/lib/utils/ColorUtils.js b/lib/utils/ColorUtils.js new file mode 100755 index 00000000..1e83911e --- /dev/null +++ b/lib/utils/ColorUtils.js @@ -0,0 +1,34 @@ +/** +* +*/ +var ColorUtils = (function () { + function ColorUtils() { + } + ColorUtils.float32ColorToARGB = function (float32Color) { + var a = (float32Color & 0xff000000) >>> 24; + var r = (float32Color & 0xff0000) >>> 16; + var g = (float32Color & 0xff00) >>> 8; + var b = float32Color & 0xff; + var result = [a, r, g, b]; + + return result; + }; + + ColorUtils.componentToHex = function (c) { + var hex = c.toString(16); + return hex.length == 1 ? "0" + hex : hex; + }; + + ColorUtils.RGBToHexString = function (argb) { + return "#" + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); + }; + + ColorUtils.ARGBToHexString = function (argb) { + return "#" + ColorUtils.componentToHex(argb[0]) + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); + }; + return ColorUtils; +})(); + +module.exports = ColorUtils; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0NvbG9yVXRpbHMudHMiXSwibmFtZXMiOlsiQ29sb3JVdGlscyIsIkNvbG9yVXRpbHMuY29uc3RydWN0b3IiLCJDb2xvclV0aWxzLmZsb2F0MzJDb2xvclRvQVJHQiIsIkNvbG9yVXRpbHMuY29tcG9uZW50VG9IZXgiLCJDb2xvclV0aWxzLlJHQlRvSGV4U3RyaW5nIiwiQ29sb3JVdGlscy5BUkdCVG9IZXhTdHJpbmciXSwibWFwcGluZ3MiOiJBQUFBOztFQUVHO0FBQ0g7SUFBQUE7SUE0QkFDLENBQUNBO0FBQUFELElBMUJBQSxnQ0FBQUEsVUFBaUNBLFlBQW1CQTtRQUVuREUsSUFBSUEsQ0FBQ0EsR0FBVUEsQ0FBRUEsWUFBWUEsR0FBR0EsVUFBVUEsQ0FBRUEsS0FBS0EsRUFBRUE7UUFDbkRBLElBQUlBLENBQUNBLEdBQVVBLENBQUVBLFlBQVlBLEdBQUdBLFFBQVFBLENBQUVBLEtBQUtBLEVBQUVBO1FBQ2pEQSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFFQSxZQUFZQSxHQUFHQSxNQUFNQSxDQUFFQSxLQUFLQSxDQUFDQTtRQUM5Q0EsSUFBSUEsQ0FBQ0EsR0FBVUEsWUFBWUEsR0FBR0EsSUFBSUE7UUFDbENBLElBQUlBLE1BQU1BLEdBQVlBLENBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBOztRQUV0Q0EsT0FBT0EsTUFBTUE7SUFDZEEsQ0FBQ0E7O0lBRURGLDRCQUFBQSxVQUE4QkEsQ0FBUUE7UUFFckNHLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLFFBQVFBLENBQUNBLEVBQUVBLENBQUNBO1FBQ3hCQSxPQUFPQSxHQUFHQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxHQUFFQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQTtJQUN4Q0EsQ0FBQ0E7O0lBRURILDRCQUFBQSxVQUE2QkEsSUFBYUE7UUFFekNJLE9BQU9BLEdBQUdBLEdBQUdBLFVBQVVBLENBQUNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFVBQVVBLENBQUNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFVBQVVBLENBQUNBLGNBQWNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0lBQzFIQSxDQUFDQTs7SUFFREosNkJBQUFBLFVBQThCQSxJQUFhQTtRQUUxQ0ssT0FBT0EsR0FBR0EsR0FBR0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDL0pBLENBQUNBO0lBQ0ZMLGtCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDJCQUFvQixDQUFBIiwiZmlsZSI6InV0aWxzL0NvbG9yVXRpbHMuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKi9cbmNsYXNzIENvbG9yVXRpbHNcbntcblx0cHVibGljIHN0YXRpYyBmbG9hdDMyQ29sb3JUb0FSR0IoZmxvYXQzMkNvbG9yOm51bWJlcik6bnVtYmVyW11cblx0e1xuXHRcdHZhciBhOm51bWJlciA9ICggZmxvYXQzMkNvbG9yICYgMHhmZjAwMDAwMCApID4+PiAyNFxuXHRcdHZhciByOm51bWJlciA9ICggZmxvYXQzMkNvbG9yICYgMHhmZjAwMDAgKSA+Pj4gMTY7XG5cdFx0dmFyIGc6bnVtYmVyID0gKCBmbG9hdDMyQ29sb3IgJiAweGZmMDAgKSA+Pj4gODtcblx0XHR2YXIgYjpudW1iZXIgPSBmbG9hdDMyQ29sb3IgJiAweGZmO1xuXHRcdHZhciByZXN1bHQ6bnVtYmVyW10gPSBbIGEsIHIgLCBnICwgYiBdO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgc3RhdGljIGNvbXBvbmVudFRvSGV4KGM6bnVtYmVyKTpzdHJpbmdcblx0e1xuXHRcdHZhciBoZXggPSBjLnRvU3RyaW5nKDE2KTtcblx0XHRyZXR1cm4gaGV4Lmxlbmd0aCA9PSAxPyBcIjBcIiArIGhleCA6IGhleDtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgUkdCVG9IZXhTdHJpbmcoYXJnYjpudW1iZXJbXSk6c3RyaW5nXG5cdHtcblx0XHRyZXR1cm4gXCIjXCIgKyBDb2xvclV0aWxzLmNvbXBvbmVudFRvSGV4KGFyZ2JbMV0pICsgQ29sb3JVdGlscy5jb21wb25lbnRUb0hleChhcmdiWzJdKSArIENvbG9yVXRpbHMuY29tcG9uZW50VG9IZXgoYXJnYlszXSk7XG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIEFSR0JUb0hleFN0cmluZyhhcmdiOm51bWJlcltdKTpzdHJpbmdcblx0e1xuXHRcdHJldHVybiBcIiNcIiArIENvbG9yVXRpbHMuY29tcG9uZW50VG9IZXgoYXJnYlswXSkgKyBDb2xvclV0aWxzLmNvbXBvbmVudFRvSGV4KGFyZ2JbMV0pICsgQ29sb3JVdGlscy5jb21wb25lbnRUb0hleChhcmdiWzJdKSArIENvbG9yVXRpbHMuY29tcG9uZW50VG9IZXgoYXJnYlszXSk7XG5cdH1cbn1cblxuZXhwb3J0ID0gQ29sb3JVdGlsczsiXX0= \ No newline at end of file diff --git a/lib/utils/ColorUtils.ts b/lib/utils/ColorUtils.ts new file mode 100644 index 00000000..a4e51618 --- /dev/null +++ b/lib/utils/ColorUtils.ts @@ -0,0 +1,34 @@ +/** + * + */ +class ColorUtils +{ + public static float32ColorToARGB(float32Color:number):number[] + { + var a:number = ( float32Color & 0xff000000 ) >>> 24 + var r:number = ( float32Color & 0xff0000 ) >>> 16; + var g:number = ( float32Color & 0xff00 ) >>> 8; + var b:number = float32Color & 0xff; + var result:number[] = [ a, r , g , b ]; + + return result; + } + + private static componentToHex(c:number):string + { + var hex = c.toString(16); + return hex.length == 1? "0" + hex : hex; + } + + public static RGBToHexString(argb:number[]):string + { + return "#" + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); + } + + public static ARGBToHexString(argb:number[]):string + { + return "#" + ColorUtils.componentToHex(argb[0]) + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); + } +} + +export = ColorUtils; \ No newline at end of file diff --git a/lib/utils/Debug.js b/lib/utils/Debug.js new file mode 100755 index 00000000..0be7ccfc --- /dev/null +++ b/lib/utils/Debug.js @@ -0,0 +1,60 @@ +var PartialImplementationError = require("awayjs-core/lib/errors/PartialImplementationError"); + +/** +* +*/ +var Debug = (function () { + function Debug() { + } + Debug.breakpoint = function () { + Debug['break'](); + }; + + Debug.throwPIROnKeyWordOnly = function (str, enable) { + if (typeof enable === "undefined") { enable = true; } + if (!enable) + Debug.keyword = null; + else + Debug.keyword = str; + }; + + Debug.throwPIR = function (clss, fnc, msg) { + Debug.logPIR('PartialImplementationError ' + clss, fnc, msg); + + if (Debug.THROW_ERRORS) { + if (Debug.keyword) { + var e = clss + fnc + msg; + + if (e.indexOf(Debug.keyword) == -1) + return; + } + + throw new PartialImplementationError(clss + '.' + fnc + ': ' + msg); + } + }; + + Debug.logPIR = function (clss, fnc, msg) { + if (typeof msg === "undefined") { msg = ''; } + if (Debug.LOG_PI_ERRORS) + console.log(clss + '.' + fnc + ': ' + msg); + }; + + Debug.log = function () { + var args = []; + for (var _i = 0; _i < (arguments.length - 0); _i++) { + args[_i] = arguments[_i + 0]; + } + if (Debug.ENABLE_LOG) + console.log(args); + }; + Debug.THROW_ERRORS = true; + Debug.ENABLE_LOG = true; + Debug.LOG_PI_ERRORS = true; + + Debug.keyword = null; + return Debug; +})(); + +module.exports = Debug; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0RlYnVnLnRzIl0sIm5hbWVzIjpbIkRlYnVnIiwiRGVidWcuY29uc3RydWN0b3IiLCJEZWJ1Zy5icmVha3BvaW50IiwiRGVidWcudGhyb3dQSVJPbktleVdvcmRPbmx5IiwiRGVidWcudGhyb3dQSVIiLCJEZWJ1Zy5sb2dQSVIiLCJEZWJ1Zy5sb2ciXSwibWFwcGluZ3MiOiJBQUFBLDZGQUFpRzs7QUFFakc7O0VBRUc7QUFDSDtJQUFBQTtJQWdEQUMsQ0FBQ0E7QUFBQUQsSUF4Q0FBLG1CQUFBQTtRQUVDRSxLQUFLQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUNqQkEsQ0FBQ0E7O0lBRURGLDhCQUFBQSxVQUFvQ0EsR0FBVUEsRUFBRUEsTUFBcUJBO1FBQXJCRyxxQ0FBQUEsTUFBTUEsR0FBV0EsSUFBSUE7QUFBQUEsUUFFcEVBLElBQUlBLENBQUNBLE1BQU1BO1lBQ1ZBLEtBQUtBLENBQUNBLE9BQU9BLEdBQUdBLElBQUlBOztZQUVwQkEsS0FBS0EsQ0FBQ0EsT0FBT0EsR0FBR0EsR0FBR0EsQ0FBQ0E7SUFDdEJBLENBQUNBOztJQUVESCxpQkFBQUEsVUFBdUJBLElBQVdBLEVBQUVBLEdBQVVBLEVBQUVBLEdBQVVBO1FBRXpESSxLQUFLQSxDQUFDQSxNQUFNQSxDQUFDQSw2QkFBNkJBLEdBQUdBLElBQUlBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBOztRQUU1REEsSUFBSUEsS0FBS0EsQ0FBQ0EsWUFBWUEsQ0FBRUE7WUFDdkJBLElBQUlBLEtBQUtBLENBQUNBLE9BQU9BLENBQUVBO2dCQUNsQkEsSUFBSUEsQ0FBQ0EsR0FBVUEsSUFBSUEsR0FBR0EsR0FBR0EsR0FBR0EsR0FBR0E7O2dCQUUvQkEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7b0JBQ2pDQSxNQUFPQSxDQUFBQTthQUNSQTs7WUFFREEsTUFBTUEsSUFBSUEsMEJBQTBCQSxDQUFDQSxJQUFJQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQSxJQUFJQSxHQUFHQSxHQUFHQSxDQUFDQTtTQUNuRUE7SUFDRkEsQ0FBQ0E7O0lBRURKLGVBQUFBLFVBQXNCQSxJQUFXQSxFQUFFQSxHQUFVQSxFQUFFQSxHQUFlQTtRQUFmSyxrQ0FBQUEsR0FBR0EsR0FBVUEsRUFBRUE7QUFBQUEsUUFFN0RBLElBQUlBLEtBQUtBLENBQUNBLGFBQWFBO1lBQ3RCQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQSxJQUFJQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQTtJQUM3Q0EsQ0FBQ0E7O0lBRURMLFlBQUFBO1FBQWtCTSxJQUFHQSxJQUFJQTtBQUFNQSxhQUFiQSxXQUFhQSxDQUFiQSwyQkFBYUEsRUFBYkEsSUFBYUE7WUFBYkEsNkJBQWFBOztRQUU5QkEsSUFBSUEsS0FBS0EsQ0FBQ0EsVUFBVUE7WUFDbkJBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO0lBQ3BCQSxDQUFDQTtJQTdDRE4scUJBQXFDQSxJQUFJQTtJQUN6Q0EsbUJBQW1DQSxJQUFJQTtJQUN2Q0Esc0JBQXNDQSxJQUFJQTs7SUFFMUNBLGdCQUFnQ0EsSUFBSUE7SUEwQ3JDQSxhQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELHNCQUFlLENBQUEiLCJmaWxlIjoidXRpbHMvRGVidWcuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUGFydGlhbEltcGxlbWVudGF0aW9uRXJyb3JcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lcnJvcnMvUGFydGlhbEltcGxlbWVudGF0aW9uRXJyb3JcIik7XG5cbi8qKlxuICpcbiAqL1xuY2xhc3MgRGVidWdcbntcblx0cHVibGljIHN0YXRpYyBUSFJPV19FUlJPUlM6Ym9vbGVhbiA9IHRydWU7XG5cdHB1YmxpYyBzdGF0aWMgRU5BQkxFX0xPRzpib29sZWFuID0gdHJ1ZTtcblx0cHVibGljIHN0YXRpYyBMT0dfUElfRVJST1JTOmJvb2xlYW4gPSB0cnVlO1xuXG5cdHByaXZhdGUgc3RhdGljIGtleXdvcmQ6c3RyaW5nID0gbnVsbDtcblxuXHRwdWJsaWMgc3RhdGljIGJyZWFrcG9pbnQoKTp2b2lkXG5cdHtcblx0XHREZWJ1Z1snYnJlYWsnXSgpO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyB0aHJvd1BJUk9uS2V5V29yZE9ubHkoc3RyOnN0cmluZywgZW5hYmxlOmJvb2xlYW4gPSB0cnVlKVxuXHR7XG5cdFx0aWYgKCFlbmFibGUpXG5cdFx0XHREZWJ1Zy5rZXl3b3JkID0gbnVsbDtcblx0XHRlbHNlXG5cdFx0XHREZWJ1Zy5rZXl3b3JkID0gc3RyO1xuXHR9XG5cblx0cHVibGljIHN0YXRpYyB0aHJvd1BJUihjbHNzOnN0cmluZywgZm5jOnN0cmluZywgbXNnOnN0cmluZylcblx0e1xuXHRcdERlYnVnLmxvZ1BJUignUGFydGlhbEltcGxlbWVudGF0aW9uRXJyb3IgJyArIGNsc3MsIGZuYywgbXNnKTtcblxuXHRcdGlmIChEZWJ1Zy5USFJPV19FUlJPUlMpIHtcblx0XHRcdGlmIChEZWJ1Zy5rZXl3b3JkKSB7XG5cdFx0XHRcdHZhciBlOnN0cmluZyA9IGNsc3MgKyBmbmMgKyBtc2c7XG5cblx0XHRcdFx0aWYgKGUuaW5kZXhPZihEZWJ1Zy5rZXl3b3JkKSA9PSAtMSlcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRocm93IG5ldyBQYXJ0aWFsSW1wbGVtZW50YXRpb25FcnJvcihjbHNzICsgJy4nICsgZm5jICsgJzogJyArIG1zZyk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzdGF0aWMgbG9nUElSKGNsc3M6c3RyaW5nLCBmbmM6c3RyaW5nLCBtc2c6c3RyaW5nID0gJycpXG5cdHtcblx0XHRpZiAoRGVidWcuTE9HX1BJX0VSUk9SUylcblx0XHRcdGNvbnNvbGUubG9nKGNsc3MgKyAnLicgKyBmbmMgKyAnOiAnICsgbXNnKTtcblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgbG9nKC4uLmFyZ3M6YW55W10pXG5cdHtcblx0XHRpZiAoRGVidWcuRU5BQkxFX0xPRylcblx0XHRcdGNvbnNvbGUubG9nKGFyZ3MpO1xuXHR9XG59XG5cbmV4cG9ydCA9IERlYnVnOyJdfQ== \ No newline at end of file diff --git a/lib/utils/Debug.ts b/lib/utils/Debug.ts new file mode 100644 index 00000000..ccfdc552 --- /dev/null +++ b/lib/utils/Debug.ts @@ -0,0 +1,56 @@ +import PartialImplementationError = require("awayjs-core/lib/errors/PartialImplementationError"); + +/** + * + */ +class Debug +{ + public static THROW_ERRORS:boolean = true; + public static ENABLE_LOG:boolean = true; + public static LOG_PI_ERRORS:boolean = true; + + private static keyword:string = null; + + public static breakpoint():void + { + Debug['break'](); + } + + public static throwPIROnKeyWordOnly(str:string, enable:boolean = true) + { + if (!enable) + Debug.keyword = null; + else + Debug.keyword = str; + } + + public static throwPIR(clss:string, fnc:string, msg:string) + { + Debug.logPIR('PartialImplementationError ' + clss, fnc, msg); + + if (Debug.THROW_ERRORS) { + if (Debug.keyword) { + var e:string = clss + fnc + msg; + + if (e.indexOf(Debug.keyword) == -1) + return; + } + + throw new PartialImplementationError(clss + '.' + fnc + ': ' + msg); + } + } + + private static logPIR(clss:string, fnc:string, msg:string = '') + { + if (Debug.LOG_PI_ERRORS) + console.log(clss + '.' + fnc + ': ' + msg); + } + + public static log(...args:any[]) + { + if (Debug.ENABLE_LOG) + console.log(args); + } +} + +export = Debug; \ No newline at end of file diff --git a/lib/utils/RequestAnimationFrame.js b/lib/utils/RequestAnimationFrame.js new file mode 100755 index 00000000..13e7ea3d --- /dev/null +++ b/lib/utils/RequestAnimationFrame.js @@ -0,0 +1,89 @@ +var getTimer = require("awayjs-core/lib/utils/getTimer"); + +var RequestAnimationFrame = (function () { + function RequestAnimationFrame(callback, callbackContext) { + var _this = this; + this._active = false; + this._argsArray = new Array(); + this._getTimer = getTimer; + + this.setCallback(callback, callbackContext); + + this._rafUpdateFunction = function () { + if (_this._active) + _this._tick(); + }; + + this._argsArray.push(this._dt); + } + // Public + /** + * + * @param callback + * @param callbackContext + */ + RequestAnimationFrame.prototype.setCallback = function (callback, callbackContext) { + this._callback = callback; + this._callbackContext = callbackContext; + }; + + /** + * + */ + RequestAnimationFrame.prototype.start = function () { + this._prevTime = this._getTimer(); + this._active = true; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(this._rafUpdateFunction); + } else { + if (window['mozRequestAnimationFrame']) + window.requestAnimationFrame = window['mozRequestAnimationFrame']; + else if (window['webkitRequestAnimationFrame']) + window.requestAnimationFrame = window['webkitRequestAnimationFrame']; + else if (window['oRequestAnimationFrame']) + window.requestAnimationFrame = window['oRequestAnimationFrame']; + } + }; + + /** + * + */ + RequestAnimationFrame.prototype.stop = function () { + this._active = false; + }; + + Object.defineProperty(RequestAnimationFrame.prototype, "active", { + // Get / Set + /** + * + * @returns {boolean} + */ + get: function () { + return this._active; + }, + enumerable: true, + configurable: true + }); + + // Private + /** + * + * @private + */ + RequestAnimationFrame.prototype._tick = function () { + this._currentTime = this._getTimer(); + this._dt = this._currentTime - this._prevTime; + this._argsArray[0] = this._dt; + this._callback.apply(this._callbackContext, this._argsArray); + + window.requestAnimationFrame(this._rafUpdateFunction); + + this._prevTime = this._currentTime; + }; + return RequestAnimationFrame; +})(); + +module.exports = RequestAnimationFrame; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL1JlcXVlc3RBbmltYXRpb25GcmFtZS50cyJdLCJuYW1lcyI6WyJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUiLCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUuY29uc3RydWN0b3IiLCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUuc2V0Q2FsbGJhY2siLCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUuc3RhcnQiLCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWUuc3RvcCIsIlJlcXVlc3RBbmltYXRpb25GcmFtZS5fdGljayJdLCJtYXBwaW5ncyI6IkFBQUEsd0RBQWdFOztBQUVoRTtJQVlDQSwrQkFBWUEsUUFBaUJBLEVBQUVBLGVBQXNCQTtRQUFyREMsaUJBWUNBO1FBcEJEQSxLQUFRQSxPQUFPQSxHQUFXQSxLQUFLQSxDQUFDQTtRQUtoQ0EsS0FBUUEsVUFBVUEsR0FBY0EsSUFBSUEsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFLM0NBLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLFFBQVFBOztRQUV6QkEsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsUUFBUUEsRUFBRUEsZUFBZUEsQ0FBQ0E7O1FBRTNDQSxJQUFJQSxDQUFDQSxrQkFBa0JBLEdBQUdBO1lBQ3pCQSxJQUFJQSxLQUFJQSxDQUFDQSxPQUFPQTtnQkFDZkEsS0FBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDZkEsQ0FBQ0E7O1FBRURBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBO0lBQy9CQSxDQUFDQTtJQVNERCxTQVBTQTtJQUVUQTs7OztNQUlHQTtrREFDSEEsVUFBbUJBLFFBQWlCQSxFQUFFQSxlQUFzQkE7UUFFM0RFLElBQUlBLENBQUNBLFNBQVNBLEdBQUdBLFFBQVFBO1FBQ3pCQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEdBQUdBLGVBQWVBO0lBQ3hDQSxDQUFDQTs7SUFLREY7O01BREdBOzRDQUNIQTtRQUVDRyxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtRQUNqQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUE7O1FBRW5CQSxJQUFJQSxNQUFNQSxDQUFDQSxxQkFBcUJBLENBQUVBO1lBQ2pDQSxNQUFNQSxDQUFDQSxxQkFBcUJBLENBQUNBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0E7U0FDckRBLEtBQU1BO1lBQ05BLElBQUlBLE1BQU1BLENBQUNBLDBCQUEwQkEsQ0FBQ0E7Z0JBQ3JDQSxNQUFNQSxDQUFDQSxxQkFBcUJBLEdBQUdBLE1BQU1BLENBQUNBLDBCQUEwQkEsQ0FBQ0E7aUJBQzdEQSxJQUFJQSxNQUFNQSxDQUFDQSw2QkFBNkJBLENBQUNBO2dCQUM3Q0EsTUFBTUEsQ0FBQ0EscUJBQXFCQSxHQUFHQSxNQUFNQSxDQUFDQSw2QkFBNkJBLENBQUNBO2lCQUNoRUEsSUFBSUEsTUFBTUEsQ0FBQ0Esd0JBQXdCQSxDQUFDQTtnQkFDeENBLE1BQU1BLENBQUNBLHFCQUFxQkEsR0FBR0EsTUFBTUEsQ0FBQ0Esd0JBQXdCQSxDQUFDQSxDQUFDQTtTQUNqRUE7SUFDRkEsQ0FBQ0E7O0lBS0RIOztNQURHQTsyQ0FDSEE7UUFFQ0ksSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsS0FBS0E7SUFDckJBLENBQUNBOztJQVFESjtRQUFBQSxZQU5ZQTtRQUVaQTs7O1VBR0dBO2FBQ0hBO1lBRUNBLE9BQU9BLElBQUlBLENBQUNBLE9BQU9BO1FBQ3BCQSxDQUFDQTs7OztBQUFBQTtJQVFEQSxVQU5VQTtJQUVWQTs7O01BR0dBOzRDQUNIQTtRQUVDSyxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtRQUNwQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0E7UUFDN0NBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBO1FBQzdCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLEVBQUVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBOztRQUU1REEsTUFBTUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBOztRQUVyREEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUE7SUFDbkNBLENBQUNBO0lBR0ZMLDZCQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELHNDQUErQixDQUFBIiwiZmlsZSI6InV0aWxzL1JlcXVlc3RBbmltYXRpb25GcmFtZS5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBnZXRUaW1lclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvZ2V0VGltZXJcIik7XG5cbmNsYXNzIFJlcXVlc3RBbmltYXRpb25GcmFtZVxue1xuXHRwcml2YXRlIF9jYWxsYmFjazpGdW5jdGlvbjtcblx0cHJpdmF0ZSBfY2FsbGJhY2tDb250ZXh0Ok9iamVjdDtcblx0cHJpdmF0ZSBfYWN0aXZlOmJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSBfcmFmVXBkYXRlRnVuY3Rpb246YW55O1xuXHRwcml2YXRlIF9wcmV2VGltZTpudW1iZXI7XG5cdHByaXZhdGUgX2R0Om51bWJlcjtcblx0cHJpdmF0ZSBfY3VycmVudFRpbWU6bnVtYmVyO1xuXHRwcml2YXRlIF9hcmdzQXJyYXk6QXJyYXk8YW55PiA9IG5ldyBBcnJheSgpO1xuXHRwcml2YXRlIF9nZXRUaW1lcjpGdW5jdGlvbjtcblxuXHRjb25zdHJ1Y3RvcihjYWxsYmFjazpGdW5jdGlvbiwgY2FsbGJhY2tDb250ZXh0Ok9iamVjdClcblx0e1xuXHRcdHRoaXMuX2dldFRpbWVyID0gZ2V0VGltZXI7XG5cblx0XHR0aGlzLnNldENhbGxiYWNrKGNhbGxiYWNrLCBjYWxsYmFja0NvbnRleHQpO1xuXG5cdFx0dGhpcy5fcmFmVXBkYXRlRnVuY3Rpb24gPSAoKSA9PiB7XG5cdFx0XHRpZiAodGhpcy5fYWN0aXZlKVxuXHRcdFx0XHR0aGlzLl90aWNrKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fYXJnc0FycmF5LnB1c2godGhpcy5fZHQpO1xuXHR9XG5cblx0Ly8gUHVibGljXG5cblx0LyoqXG5cdCAqXG5cdCAqIEBwYXJhbSBjYWxsYmFja1xuXHQgKiBAcGFyYW0gY2FsbGJhY2tDb250ZXh0XG5cdCAqL1xuXHRwdWJsaWMgc2V0Q2FsbGJhY2soY2FsbGJhY2s6RnVuY3Rpb24sIGNhbGxiYWNrQ29udGV4dDpPYmplY3QpXG5cdHtcblx0XHR0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuXHRcdHRoaXMuX2NhbGxiYWNrQ29udGV4dCA9IGNhbGxiYWNrQ29udGV4dDtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXJ0KClcblx0e1xuXHRcdHRoaXMuX3ByZXZUaW1lID0gdGhpcy5fZ2V0VGltZXIoKTtcblx0XHR0aGlzLl9hY3RpdmUgPSB0cnVlO1xuXG5cdFx0aWYgKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUpIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmVXBkYXRlRnVuY3Rpb24pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAod2luZG93Wydtb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXSlcblx0XHRcdFx0d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvd1snbW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG5cdFx0XHRlbHNlIGlmICh3aW5kb3dbJ3dlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSddKVxuXHRcdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93Wyd3ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcblx0XHRcdGVsc2UgaWYgKHdpbmRvd1snb1JlcXVlc3RBbmltYXRpb25GcmFtZSddKVxuXHRcdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93WydvUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ107XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqL1xuXHRwdWJsaWMgc3RvcCgpXG5cdHtcblx0XHR0aGlzLl9hY3RpdmUgPSBmYWxzZTtcblx0fVxuXG5cdC8vIEdldCAvIFNldFxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcmV0dXJucyB7Ym9vbGVhbn1cblx0ICovXG5cdHB1YmxpYyBnZXQgYWN0aXZlKCk6Ym9vbGVhblxuXHR7XG5cdFx0cmV0dXJuIHRoaXMuX2FjdGl2ZTtcblx0fVxuXG5cdC8vIFByaXZhdGVcblxuXHQvKipcblx0ICpcblx0ICogQHByaXZhdGVcblx0ICovXG5cdHByaXZhdGUgX3RpY2soKTp2b2lkXG5cdHtcblx0XHR0aGlzLl9jdXJyZW50VGltZSA9IHRoaXMuX2dldFRpbWVyKCk7XG5cdFx0dGhpcy5fZHQgPSB0aGlzLl9jdXJyZW50VGltZSAtIHRoaXMuX3ByZXZUaW1lO1xuXHRcdHRoaXMuX2FyZ3NBcnJheVswXSA9IHRoaXMuX2R0O1xuXHRcdHRoaXMuX2NhbGxiYWNrLmFwcGx5KHRoaXMuX2NhbGxiYWNrQ29udGV4dCwgdGhpcy5fYXJnc0FycmF5KTtcblxuXHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmVXBkYXRlRnVuY3Rpb24pO1xuXG5cdFx0dGhpcy5fcHJldlRpbWUgPSB0aGlzLl9jdXJyZW50VGltZTtcblx0fVxuXG5cbn1cblxuZXhwb3J0ID0gUmVxdWVzdEFuaW1hdGlvbkZyYW1lOyJdfQ== \ No newline at end of file diff --git a/lib/utils/RequestAnimationFrame.ts b/lib/utils/RequestAnimationFrame.ts new file mode 100644 index 00000000..9aff223f --- /dev/null +++ b/lib/utils/RequestAnimationFrame.ts @@ -0,0 +1,102 @@ +import getTimer = require("awayjs-core/lib/utils/getTimer"); + +class RequestAnimationFrame +{ + private _callback:Function; + private _callbackContext:Object; + private _active:boolean = false; + private _rafUpdateFunction:any; + private _prevTime:number; + private _dt:number; + private _currentTime:number; + private _argsArray:Array = new Array(); + private _getTimer:Function; + + constructor(callback:Function, callbackContext:Object) + { + this._getTimer = getTimer; + + this.setCallback(callback, callbackContext); + + this._rafUpdateFunction = () => { + if (this._active) + this._tick(); + } + + this._argsArray.push(this._dt); + } + + // Public + + /** + * + * @param callback + * @param callbackContext + */ + public setCallback(callback:Function, callbackContext:Object) + { + this._callback = callback; + this._callbackContext = callbackContext; + } + + /** + * + */ + public start() + { + this._prevTime = this._getTimer(); + this._active = true; + + if (window.requestAnimationFrame) { + window.requestAnimationFrame(this._rafUpdateFunction); + } else { + if (window['mozRequestAnimationFrame']) + window.requestAnimationFrame = window['mozRequestAnimationFrame']; + else if (window['webkitRequestAnimationFrame']) + window.requestAnimationFrame = window['webkitRequestAnimationFrame']; + else if (window['oRequestAnimationFrame']) + window.requestAnimationFrame = window['oRequestAnimationFrame']; + } + } + + /** + * + */ + public stop() + { + this._active = false; + } + + // Get / Set + + /** + * + * @returns {boolean} + */ + public get active():boolean + { + return this._active; + } + + // Private + + /** + * + * @private + */ + private _tick():void + { + this._currentTime = this._getTimer(); + this._dt = this._currentTime - this._prevTime; + this._argsArray[0] = this._dt; + this._callback.apply(this._callbackContext, this._argsArray); + + window.requestAnimationFrame(this._rafUpdateFunction); + + this._prevTime = this._currentTime; + } + + +} + +export = RequestAnimationFrame; \ No newline at end of file diff --git a/lib/utils/TextureUtils.js b/lib/utils/TextureUtils.js new file mode 100755 index 00000000..81b6ad76 --- /dev/null +++ b/lib/utils/TextureUtils.js @@ -0,0 +1,44 @@ +var TextureUtils = (function () { + function TextureUtils() { + } + TextureUtils.isBitmapDataValid = function (bitmapData) { + if (bitmapData == null) { + return true; + } + + return TextureUtils.isDimensionValid(bitmapData.width) && TextureUtils.isDimensionValid(bitmapData.height); + }; + + TextureUtils.isHTMLImageElementValid = function (image) { + if (image == null) + return true; + + return TextureUtils.isDimensionValid(image.width) && TextureUtils.isDimensionValid(image.height); + }; + + TextureUtils.isDimensionValid = function (d) { + return d >= 1 && d <= TextureUtils.MAX_SIZE && TextureUtils.isPowerOfTwo(d); + }; + + TextureUtils.isPowerOfTwo = function (value) { + return value ? ((value & -value) == value) : false; + }; + + TextureUtils.getBestPowerOf2 = function (value) { + var p = 1; + + while (p < value) + p <<= 1; + + if (p > TextureUtils.MAX_SIZE) + p = TextureUtils.MAX_SIZE; + + return p; + }; + TextureUtils.MAX_SIZE = 2048; + return TextureUtils; +})(); + +module.exports = TextureUtils; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL1RleHR1cmVVdGlscy50cyJdLCJuYW1lcyI6WyJUZXh0dXJlVXRpbHMiLCJUZXh0dXJlVXRpbHMuY29uc3RydWN0b3IiLCJUZXh0dXJlVXRpbHMuaXNCaXRtYXBEYXRhVmFsaWQiLCJUZXh0dXJlVXRpbHMuaXNIVE1MSW1hZ2VFbGVtZW50VmFsaWQiLCJUZXh0dXJlVXRpbHMuaXNEaW1lbnNpb25WYWxpZCIsIlRleHR1cmVVdGlscy5pc1Bvd2VyT2ZUd28iLCJUZXh0dXJlVXRpbHMuZ2V0QmVzdFBvd2VyT2YyIl0sIm1hcHBpbmdzIjoiQUFBQTtJQUVBQTtJQW1EQUMsQ0FBQ0E7QUFBQUQsSUEvQ0FBLGlDQUFBQSxVQUFnQ0EsVUFBcUJBO1FBRXBERSxJQUFJQSxVQUFVQSxJQUFJQSxJQUFJQSxDQUFFQTtZQUV2QkEsT0FBT0EsSUFBSUE7U0FFWEE7O1FBRURBLE9BQU9BLFlBQVlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsWUFBWUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxDQUFDQTtJQUUzR0EsQ0FBQ0E7O0lBRURGLHVDQUFBQSxVQUFzQ0EsS0FBc0JBO1FBRTNERyxJQUFJQSxLQUFLQSxJQUFJQSxJQUFJQTtZQUNoQkEsT0FBT0EsSUFBSUEsQ0FBQ0E7O1FBRWJBLE9BQU9BLFlBQVlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsWUFBWUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxDQUFDQTtJQUVqR0EsQ0FBQ0E7O0lBRURILGdDQUFBQSxVQUErQkEsQ0FBUUE7UUFHdENJLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLFlBQVlBLENBQUNBLFFBQVFBLElBQUlBLFlBQVlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBO0lBRTVFQSxDQUFDQTs7SUFFREosNEJBQUFBLFVBQTJCQSxLQUFZQTtRQUd0Q0ssT0FBT0EsS0FBS0EsR0FBRUEsQ0FBRUEsQ0FBRUEsS0FBS0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBRUEsSUFBSUEsS0FBS0EsQ0FBRUEsR0FBR0EsS0FBS0E7SUFFdERBLENBQUNBOztJQUVETCwrQkFBQUEsVUFBOEJBLEtBQVlBO1FBRXpDTSxJQUFJQSxDQUFDQSxHQUFVQSxDQUFDQTs7UUFFaEJBLE9BQU9BLENBQUNBLEdBQUdBLEtBQUtBO1lBQ2ZBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBOztRQUVUQSxJQUFJQSxDQUFDQSxHQUFHQSxZQUFZQSxDQUFDQSxRQUFRQTtZQUM1QkEsQ0FBQ0EsR0FBR0EsWUFBWUEsQ0FBQ0EsUUFBUUEsQ0FBQ0E7O1FBRTNCQSxPQUFPQSxDQUFDQTtJQUNUQSxDQUFDQTtJQWhERE4sd0JBQWlDQSxJQUFJQTtJQWlEdENBLG9CQUFDQTtBQUFEQSxDQUFDQSxJQUFBOztBQUVELDZCQUFxQixDQUFBIiwiZmlsZSI6InV0aWxzL1RleHR1cmVVdGlscy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRtYXBEYXRhXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0JpdG1hcERhdGFcIik7XG5cbmNsYXNzIFRleHR1cmVVdGlsc1xue1xuXHRwcml2YXRlIHN0YXRpYyBNQVhfU0laRTpudW1iZXIgPSAyMDQ4O1xuXG5cdHB1YmxpYyBzdGF0aWMgaXNCaXRtYXBEYXRhVmFsaWQoYml0bWFwRGF0YTpCaXRtYXBEYXRhKTpib29sZWFuXG5cdHtcblx0XHRpZiAoYml0bWFwRGF0YSA9PSBudWxsKSB7XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0fVxuXG5cdFx0cmV0dXJuIFRleHR1cmVVdGlscy5pc0RpbWVuc2lvblZhbGlkKGJpdG1hcERhdGEud2lkdGgpICYmIFRleHR1cmVVdGlscy5pc0RpbWVuc2lvblZhbGlkKGJpdG1hcERhdGEuaGVpZ2h0KTtcblxuXHR9XG5cblx0cHVibGljIHN0YXRpYyBpc0hUTUxJbWFnZUVsZW1lbnRWYWxpZChpbWFnZTpIVE1MSW1hZ2VFbGVtZW50KTpib29sZWFuXG5cdHtcblx0XHRpZiAoaW1hZ2UgPT0gbnVsbClcblx0XHRcdHJldHVybiB0cnVlO1xuXG5cdFx0cmV0dXJuIFRleHR1cmVVdGlscy5pc0RpbWVuc2lvblZhbGlkKGltYWdlLndpZHRoKSAmJiBUZXh0dXJlVXRpbHMuaXNEaW1lbnNpb25WYWxpZChpbWFnZS5oZWlnaHQpO1xuXG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGlzRGltZW5zaW9uVmFsaWQoZDpudW1iZXIpOmJvb2xlYW5cblx0e1xuXG5cdFx0cmV0dXJuIGQgPj0gMSAmJiBkIDw9IFRleHR1cmVVdGlscy5NQVhfU0laRSAmJiBUZXh0dXJlVXRpbHMuaXNQb3dlck9mVHdvKGQpO1xuXG5cdH1cblxuXHRwdWJsaWMgc3RhdGljIGlzUG93ZXJPZlR3byh2YWx1ZTpudW1iZXIpOmJvb2xlYW5cblx0e1xuXG5cdFx0cmV0dXJuIHZhbHVlPyAoICggdmFsdWUgJiAtdmFsdWUgKSA9PSB2YWx1ZSApIDogZmFsc2U7XG5cblx0fVxuXG5cdHB1YmxpYyBzdGF0aWMgZ2V0QmVzdFBvd2VyT2YyKHZhbHVlOm51bWJlcik6bnVtYmVyXG5cdHtcblx0XHR2YXIgcDpudW1iZXIgPSAxO1xuXG5cdFx0d2hpbGUgKHAgPCB2YWx1ZSlcblx0XHRcdHAgPDw9IDE7XG5cblx0XHRpZiAocCA+IFRleHR1cmVVdGlscy5NQVhfU0laRSlcblx0XHRcdHAgPSBUZXh0dXJlVXRpbHMuTUFYX1NJWkU7XG5cblx0XHRyZXR1cm4gcDtcblx0fVxufVxuXG5leHBvcnQgPSBUZXh0dXJlVXRpbHMiXX0= \ No newline at end of file diff --git a/lib/utils/TextureUtils.ts b/lib/utils/TextureUtils.ts new file mode 100644 index 00000000..72e34333 --- /dev/null +++ b/lib/utils/TextureUtils.ts @@ -0,0 +1,56 @@ +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); + +class TextureUtils +{ + private static MAX_SIZE:number = 2048; + + public static isBitmapDataValid(bitmapData:BitmapData):boolean + { + if (bitmapData == null) { + + return true; + + } + + return TextureUtils.isDimensionValid(bitmapData.width) && TextureUtils.isDimensionValid(bitmapData.height); + + } + + public static isHTMLImageElementValid(image:HTMLImageElement):boolean + { + if (image == null) + return true; + + return TextureUtils.isDimensionValid(image.width) && TextureUtils.isDimensionValid(image.height); + + } + + public static isDimensionValid(d:number):boolean + { + + return d >= 1 && d <= TextureUtils.MAX_SIZE && TextureUtils.isPowerOfTwo(d); + + } + + public static isPowerOfTwo(value:number):boolean + { + + return value? ( ( value & -value ) == value ) : false; + + } + + public static getBestPowerOf2(value:number):number + { + var p:number = 1; + + while (p < value) + p <<= 1; + + if (p > TextureUtils.MAX_SIZE) + p = TextureUtils.MAX_SIZE; + + return p; + } +} + +export = TextureUtils \ No newline at end of file diff --git a/lib/utils/Timer.js b/lib/utils/Timer.js new file mode 100755 index 00000000..6ad798fd --- /dev/null +++ b/lib/utils/Timer.js @@ -0,0 +1,110 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Error = require("awayjs-core/lib/errors/Error"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +var TimerEvent = require("awayjs-core/lib/events/TimerEvent"); + +var Timer = (function (_super) { + __extends(Timer, _super); + function Timer(delay, repeatCount) { + if (typeof repeatCount === "undefined") { repeatCount = 0; } + _super.call(this); + this._repeatCount = 0; + this._currentCount = 0; + this._running = false; + + this._delay = delay; + this._repeatCount = repeatCount; + + if (isNaN(delay) || delay < 0) { + throw new Error("Delay is negative or not a number"); + } + } + Object.defineProperty(Timer.prototype, "currentCount", { + get: function () { + return this._currentCount; + }, + enumerable: true, + configurable: true + }); + + Object.defineProperty(Timer.prototype, "delay", { + get: function () { + return this._delay; + }, + set: function (value) { + this._delay = value; + + if (this._running) { + this.stop(); + this.start(); + } + }, + enumerable: true, + configurable: true + }); + + + Object.defineProperty(Timer.prototype, "repeatCount", { + get: function () { + return this._repeatCount; + }, + set: function (value) { + this._repeatCount = value; + }, + enumerable: true, + configurable: true + }); + + + Timer.prototype.reset = function () { + if (this._running) { + this.stop(); + } + + this._currentCount = 0; + }; + + Object.defineProperty(Timer.prototype, "running", { + get: function () { + return this._running; + }, + enumerable: true, + configurable: true + }); + + Timer.prototype.start = function () { + var _this = this; + this._running = true; + clearInterval(this._iid); + this._iid = setInterval(function () { + return _this.tick(); + }, this._delay); + }; + + Timer.prototype.stop = function () { + this._running = false; + clearInterval(this._iid); + }; + + Timer.prototype.tick = function () { + this._currentCount++; + + if ((this._repeatCount > 0) && this._currentCount >= this._repeatCount) { + this.stop(); + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER)); + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE)); + } else { + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER)); + } + }; + return Timer; +})(EventDispatcher); + +module.exports = Timer; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL1RpbWVyLnRzIl0sIm5hbWVzIjpbIlRpbWVyIiwiVGltZXIuY29uc3RydWN0b3IiLCJUaW1lci5yZXNldCIsIlRpbWVyLnN0YXJ0IiwiVGltZXIuc3RvcCIsIlRpbWVyLnRpY2siXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUEyRDtBQUMzRCx1RUFBNkU7QUFDN0UsNkRBQW9FOztBQUVwRTtJQUFvQkEsd0JBQWVBO0lBU2xDQSxlQUFZQSxLQUFZQSxFQUFFQSxXQUFzQkE7UUFBdEJDLDBDQUFBQSxXQUFXQSxHQUFVQSxDQUFDQTtBQUFBQSxRQUcvQ0EsV0FBTUEsS0FBQUEsQ0FBQ0E7UUFSUkEsS0FBUUEsWUFBWUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7UUFDaENBLEtBQVFBLGFBQWFBLEdBQVVBLENBQUNBLENBQUNBO1FBRWpDQSxLQUFRQSxRQUFRQSxHQUFXQSxLQUFLQSxDQUFDQTs7UUFRaENBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEtBQUtBO1FBQ25CQSxJQUFJQSxDQUFDQSxZQUFZQSxHQUFHQSxXQUFXQTs7UUFFL0JBLElBQUlBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEtBQUtBLEdBQUdBLENBQUNBLENBQUVBO1lBQzlCQSxNQUFNQSxJQUFJQSxLQUFLQSxDQUFDQSxtQ0FBbUNBLENBQUNBO1NBQ3BEQTtJQUVGQSxDQUFDQTtJQUVERDtRQUFBQSxLQUFBQTtZQUdDQSxPQUFPQSxJQUFJQSxDQUFDQSxhQUFhQTtRQUUxQkEsQ0FBQ0E7Ozs7QUFBQUE7SUFFREE7UUFBQUEsS0FBQUE7WUFHQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsTUFBTUE7UUFFbkJBLENBQUNBO1FBRURBLEtBQUFBLFVBQWlCQSxLQUFZQTtZQUc1QkEsSUFBSUEsQ0FBQ0EsTUFBTUEsR0FBR0EsS0FBS0E7O1lBRW5CQSxJQUFJQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFFQTtnQkFDbEJBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2dCQUNYQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTthQUNaQTtRQUVGQSxDQUFDQTs7OztBQVpBQTs7SUFjREE7UUFBQUEsS0FBQUE7WUFHQ0EsT0FBT0EsSUFBSUEsQ0FBQ0EsWUFBWUE7UUFDekJBLENBQUNBO1FBRURBLEtBQUFBLFVBQXVCQSxLQUFZQTtZQUdsQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsS0FBS0E7UUFDMUJBLENBQUNBOzs7O0FBTkFBOztJQVFEQSx3QkFBQUE7UUFHQ0UsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBRUE7WUFDbEJBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ1hBOztRQUVEQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxDQUFDQTtJQUV2QkEsQ0FBQ0E7O0lBRURGO1FBQUFBLEtBQUFBO1lBR0NBLE9BQU9BLElBQUlBLENBQUNBLFFBQVFBO1FBRXJCQSxDQUFDQTs7OztBQUFBQTtJQUVEQSx3QkFBQUE7UUFBQUcsaUJBT0NBO1FBSkFBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLElBQUlBO1FBQ3BCQSxhQUFhQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtRQUN4QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsV0FBV0EsQ0FBQ0E7bUJBQU1BLEtBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1FBQVhBLENBQVdBLEVBQUVBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBO0lBRXhEQSxDQUFDQTs7SUFFREgsdUJBQUFBO1FBR0NJLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLEtBQUtBO1FBQ3JCQSxhQUFhQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtJQUV6QkEsQ0FBQ0E7O0lBRURKLHVCQUFBQTtRQUdDSyxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQTs7UUFFcEJBLElBQUlBLENBQUVBLElBQUlBLENBQUNBLFlBQVlBLEdBQUdBLENBQUNBLENBQUVBLElBQUlBLElBQUlBLENBQUNBLGFBQWFBLElBQUlBLElBQUlBLENBQUNBLFlBQVlBLENBQUVBO1lBRXpFQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtZQUNYQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxJQUFJQSxVQUFVQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtZQUNwREEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsVUFBVUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FFN0RBLEtBQU1BO1lBRU5BLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLElBQUlBLFVBQVVBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBRXBEQTtJQUVGQSxDQUFDQTtJQUNGTCxhQUFDQTtBQUFEQSxDQUFDQSxFQW5IbUIsZUFBZSxFQW1IbEM7O0FBRUQsc0JBQWUsQ0FBQSIsImZpbGUiOiJ1dGlscy9UaW1lci5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFcnJvclx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXJyb3JzL0Vycm9yXCIpO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnREaXNwYXRjaGVyXCIpO1xuaW1wb3J0IFRpbWVyRXZlbnRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvVGltZXJFdmVudFwiKTtcblxuY2xhc3MgVGltZXIgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXJcbntcblxuXHRwcml2YXRlIF9kZWxheTpudW1iZXI7XG5cdHByaXZhdGUgX3JlcGVhdENvdW50Om51bWJlciA9IDA7XG5cdHByaXZhdGUgX2N1cnJlbnRDb3VudDpudW1iZXIgPSAwO1xuXHRwcml2YXRlIF9paWQ6bnVtYmVyO1xuXHRwcml2YXRlIF9ydW5uaW5nOmJvb2xlYW4gPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvcihkZWxheTpudW1iZXIsIHJlcGVhdENvdW50Om51bWJlciA9IDApXG5cdHtcblxuXHRcdHN1cGVyKCk7XG5cblxuXHRcdHRoaXMuX2RlbGF5ID0gZGVsYXk7XG5cdFx0dGhpcy5fcmVwZWF0Q291bnQgPSByZXBlYXRDb3VudDtcblxuXHRcdGlmIChpc05hTihkZWxheSkgfHwgZGVsYXkgPCAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJEZWxheSBpcyBuZWdhdGl2ZSBvciBub3QgYSBudW1iZXJcIik7XG5cdFx0fVxuXG5cdH1cblxuXHRwdWJsaWMgZ2V0IGN1cnJlbnRDb3VudCgpOm51bWJlclxuXHR7XG5cblx0XHRyZXR1cm4gdGhpcy5fY3VycmVudENvdW50O1xuXG5cdH1cblxuXHRwdWJsaWMgZ2V0IGRlbGF5KCk6bnVtYmVyXG5cdHtcblxuXHRcdHJldHVybiB0aGlzLl9kZWxheTtcblxuXHR9XG5cblx0cHVibGljIHNldCBkZWxheSh2YWx1ZTpudW1iZXIpXG5cdHtcblxuXHRcdHRoaXMuX2RlbGF5ID0gdmFsdWU7XG5cblx0XHRpZiAodGhpcy5fcnVubmluZykge1xuXHRcdFx0dGhpcy5zdG9wKCk7XG5cdFx0XHR0aGlzLnN0YXJ0KCk7XG5cdFx0fVxuXG5cdH1cblxuXHRwdWJsaWMgZ2V0IHJlcGVhdENvdW50KCk6bnVtYmVyXG5cdHtcblxuXHRcdHJldHVybiB0aGlzLl9yZXBlYXRDb3VudDtcblx0fVxuXG5cdHB1YmxpYyBzZXQgcmVwZWF0Q291bnQodmFsdWU6bnVtYmVyKVxuXHR7XG5cblx0XHR0aGlzLl9yZXBlYXRDb3VudCA9IHZhbHVlO1xuXHR9XG5cblx0cHVibGljIHJlc2V0KCk6dm9pZFxuXHR7XG5cblx0XHRpZiAodGhpcy5fcnVubmluZykge1xuXHRcdFx0dGhpcy5zdG9wKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fY3VycmVudENvdW50ID0gMDtcblxuXHR9XG5cblx0cHVibGljIGdldCBydW5uaW5nKCk6Ym9vbGVhblxuXHR7XG5cblx0XHRyZXR1cm4gdGhpcy5fcnVubmluZztcblxuXHR9XG5cblx0cHVibGljIHN0YXJ0KCk6dm9pZFxuXHR7XG5cblx0XHR0aGlzLl9ydW5uaW5nID0gdHJ1ZTtcblx0XHRjbGVhckludGVydmFsKHRoaXMuX2lpZCk7XG5cdFx0dGhpcy5faWlkID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy50aWNrKCksIHRoaXMuX2RlbGF5KTtcblxuXHR9XG5cblx0cHVibGljIHN0b3AoKTp2b2lkXG5cdHtcblxuXHRcdHRoaXMuX3J1bm5pbmcgPSBmYWxzZTtcblx0XHRjbGVhckludGVydmFsKHRoaXMuX2lpZCk7XG5cblx0fVxuXG5cdHByaXZhdGUgdGljaygpOnZvaWRcblx0e1xuXG5cdFx0dGhpcy5fY3VycmVudENvdW50Kys7XG5cblx0XHRpZiAoKCB0aGlzLl9yZXBlYXRDb3VudCA+IDAgKSAmJiB0aGlzLl9jdXJyZW50Q291bnQgPj0gdGhpcy5fcmVwZWF0Q291bnQpIHtcblxuXHRcdFx0dGhpcy5zdG9wKCk7XG5cdFx0XHR0aGlzLmRpc3BhdGNoRXZlbnQobmV3IFRpbWVyRXZlbnQoVGltZXJFdmVudC5USU1FUikpO1xuXHRcdFx0dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBUaW1lckV2ZW50KFRpbWVyRXZlbnQuVElNRVJfQ09NUExFVEUpKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgVGltZXJFdmVudChUaW1lckV2ZW50LlRJTUVSKSk7XG5cblx0XHR9XG5cblx0fVxufVxuXG5leHBvcnQgPSBUaW1lcjsiXX0= \ No newline at end of file diff --git a/lib/utils/Timer.ts b/lib/utils/Timer.ts new file mode 100644 index 00000000..5472cb0e --- /dev/null +++ b/lib/utils/Timer.ts @@ -0,0 +1,122 @@ +import Error = require("awayjs-core/lib/errors/Error"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); +import TimerEvent = require("awayjs-core/lib/events/TimerEvent"); + +class Timer extends EventDispatcher +{ + + private _delay:number; + private _repeatCount:number = 0; + private _currentCount:number = 0; + private _iid:number; + private _running:boolean = false; + + constructor(delay:number, repeatCount:number = 0) + { + + super(); + + + this._delay = delay; + this._repeatCount = repeatCount; + + if (isNaN(delay) || delay < 0) { + throw new Error("Delay is negative or not a number"); + } + + } + + public get currentCount():number + { + + return this._currentCount; + + } + + public get delay():number + { + + return this._delay; + + } + + public set delay(value:number) + { + + this._delay = value; + + if (this._running) { + this.stop(); + this.start(); + } + + } + + public get repeatCount():number + { + + return this._repeatCount; + } + + public set repeatCount(value:number) + { + + this._repeatCount = value; + } + + public reset():void + { + + if (this._running) { + this.stop(); + } + + this._currentCount = 0; + + } + + public get running():boolean + { + + return this._running; + + } + + public start():void + { + + this._running = true; + clearInterval(this._iid); + this._iid = setInterval(() => this.tick(), this._delay); + + } + + public stop():void + { + + this._running = false; + clearInterval(this._iid); + + } + + private tick():void + { + + this._currentCount++; + + if (( this._repeatCount > 0 ) && this._currentCount >= this._repeatCount) { + + this.stop(); + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER)); + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER_COMPLETE)); + + } else { + + this.dispatchEvent(new TimerEvent(TimerEvent.TIMER)); + + } + + } +} + +export = Timer; \ No newline at end of file diff --git a/lib/utils/getTimer.js b/lib/utils/getTimer.js new file mode 100755 index 00000000..1106f8cf --- /dev/null +++ b/lib/utils/getTimer.js @@ -0,0 +1,15 @@ +/** +* +* +* @returns {number} +*/ +function getTimer() { + // number milliseconds of 1970/01/01 + // this different to AS3 implementation which gets the number of milliseconds + // since instance of Flash player was initialised + return Date.now(); +} + +module.exports = getTimer; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL2dldFRpbWVyLnRzIl0sIm5hbWVzIjpbImdldFRpbWVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7OztFQUlHO0FBQ0gsU0FBUyxRQUFRO0lBRWhCQSxvQ0FBb0NBO0lBQ3BDQSw2RUFBNkVBO0lBQzdFQSxpREFBaURBO0lBQ2pEQSxPQUFPQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtBQUNsQkEsQ0FBQ0E7O0FBRUQseUJBQWtCLENBQUEiLCJmaWxlIjoidXRpbHMvZ2V0VGltZXIuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqXG4gKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZ2V0VGltZXIoKTpudW1iZXJcbntcblx0Ly8gbnVtYmVyIG1pbGxpc2Vjb25kcyBvZiAxOTcwLzAxLzAxXG5cdC8vIHRoaXMgZGlmZmVyZW50IHRvIEFTMyBpbXBsZW1lbnRhdGlvbiB3aGljaCBnZXRzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzXG5cdC8vIHNpbmNlIGluc3RhbmNlIG9mIEZsYXNoIHBsYXllciB3YXMgaW5pdGlhbGlzZWRcblx0cmV0dXJuIERhdGUubm93KCk7XG59XG5cbmV4cG9ydCA9IGdldFRpbWVyOyJdfQ== \ No newline at end of file diff --git a/lib/utils/getTimer.ts b/lib/utils/getTimer.ts new file mode 100644 index 00000000..0d04c29f --- /dev/null +++ b/lib/utils/getTimer.ts @@ -0,0 +1,14 @@ +/** + * + * + * @returns {number} + */ +function getTimer():number +{ + // number milliseconds of 1970/01/01 + // this different to AS3 implementation which gets the number of milliseconds + // since instance of Flash player was initialised + return Date.now(); +} + +export = getTimer; \ No newline at end of file diff --git a/package.json b/package.json index b1f22c3d..ac5675d9 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,22 @@ { - "name": "", - "version": "0.1.0", - "description": "Away3D.ts build scripts", - "url": "http://www.away3d.com", - "devDependencies": { - "grunt" : "0.4.1", - "grunt-contrib-yuidoc": "*", - "uglify-js": "~2.3.5", - "grunt-lib-contrib": "~0.6.0", - "grunt-contrib-uglify":"*", - "grunt-contrib-concat":"*", - "grunt-shell":"*", - "grunt-ts" : "latest" - } -} \ No newline at end of file + "name": "awayjs-core", + "version": "0.1.0", + "description": "AwayJS core classes", + "url": "http://www.away3d.com", + "devDependencies": { + "browserify": "^5.12.0", + "exorcist": "^0.1.6", + "glob": "^4.0.6", + "gulp": "^3.8.8", + "gulp-changed": "^1.0.0", + "gulp-concat": "^2.4.1", + "gulp-sourcemaps": "^1.2.2", + "gulp-typescript": "^2.0.0", + "path": "^0.4.9", + "uglify-js": "~2.3.5", + "vinyl-map": "^1.0.1", + "vinyl-source-stream": "^1.0.0", + "vinyl-transform": "0.0.1", + "watchify": "^1.0.6" + } +} diff --git a/src/AwayJSCore.ts b/src/AwayJSCore.ts index 7faba699..87c10b86 100644 --- a/src/AwayJSCore.ts +++ b/src/AwayJSCore.ts @@ -1,15 +1,15 @@ -/// +import EventDispatcher = require("away/events/EventDispatcher"); +import Debug = require("away/utils/Debug"); -away.Debug.THROW_ERRORS = false; -away.Debug.LOG_PI_ERRORS = false; +Debug.THROW_ERRORS = false; +Debug.LOG_PI_ERRORS = false; -module away +class AwayJSCore extends EventDispatcher { - export class AwayJSCore extends away.events.EventDispatcher + constructor() { - constructor() - { - super(); - } + super(); } -} \ No newline at end of file +} + +export = AwayJSCore; \ No newline at end of file diff --git a/src/away/_definitions.ts b/src/away/_definitions.ts deleted file mode 100644 index 487f1aae..00000000 --- a/src/away/_definitions.ts +++ /dev/null @@ -1,281 +0,0 @@ -/********************************************************************************************************************************************************************************************************** - * This file contains a reference to all the classes used in the project. - ******************************************************************************************************************************************************************************************************** - * - * The TypeScript compiler exports classes in a non deterministic manner, as the extend functionality copies the prototype chain - * of one object onto another during initialisation and load (to create extensible functionality), the non deterministic nature of the - * compiler can result in an extend operation referencing a class that is undefined and not yet loaded - which throw an JavaScript error. - * - * This file provides the compiler with a strict order in which to export the TypeScript classes to mitigate undefined extend errors - * - * @see https://typescript.codeplex.com/workitem/1356 @see https://typescript.codeplex.com/workitem/913 - * - *********************************************************************************************************************************************************************************************************/ - -/// - -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// - -/// -/// -/// -/// -/// - -/// -/// -/// - -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// -/// - -/// -/// -/// - -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// - -/// - -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// - -/// - -/// -/// -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// - -/// -/// -/// - -/// -/// -/// -/// -/// -/// - -/// -/// - -/// - -/// -/// -/// - -/// -/// -/// -/// -/// -/// -/// -/// -/// -/// - -/// -/// -/// - diff --git a/src/away/animators/IAnimationSet.ts b/src/away/animators/IAnimationSet.ts deleted file mode 100644 index 68dad4d0..00000000 --- a/src/away/animators/IAnimationSet.ts +++ /dev/null @@ -1,49 +0,0 @@ -/// - -module away.animators -{ - /** - * Provides an interface for data set classes that hold animation data for use in animator classes. - * - * @see away3d.animators.AnimatorBase - */ - export interface IAnimationSet extends away.library.IAsset - { - /** - * Check to determine whether a state is registered in the animation set under the given name. - * - * @param stateName The name of the animation state object to be checked. - */ - hasAnimation(name:string):boolean; - - /** - * Retrieves the animation state object registered in the animation data set under the given name. - * - * @param stateName The name of the animation state object to be retrieved. - */ - getAnimation(name:string):AnimationNodeBase; - - /** - * Indicates whether the properties of the animation data contained within the set combined with - * the vertex registers aslready in use on shading materials allows the animation data to utilise - * GPU calls. - */ - usesCPU:boolean; // GET - - /** - * Called by the material to reset the GPU indicator before testing whether register space in the shader - * is available for running GPU-based animation code. - * - * @private - */ - resetGPUCompatibility(); - - /** - * Called by the animator to void the GPU indicator when register space in the shader - * is no longer available for running GPU-based animation code. - * - * @private - */ - cancelGPUCompatibility(); - } -} diff --git a/src/away/animators/IAnimator.ts b/src/away/animators/IAnimator.ts deleted file mode 100644 index 1805e707..00000000 --- a/src/away/animators/IAnimator.ts +++ /dev/null @@ -1,53 +0,0 @@ -/// - -module away.animators -{ - import SubGeometryBase = away.base.SubGeometryBase; - import IEntity = away.entities.IEntity; - import IMaterialPass = away.materials.IMaterialPass; - import IRenderable = away.pool.IRenderable; - - /** - * Provides an interface for animator classes that control animation output from a data set subtype of AnimationSetBase. - * - * @see away.animators.IAnimationSet - */ - export interface IAnimator extends away.library.IAsset - { - /** - * - */ - animationSet:IAnimationSet; - - /** - * - */ - clone():IAnimator; - - /** - * - */ - dispose(); - - /** - * Used by the entity object to which the animator is applied, registers the owner for internal use. - * - * @private - */ - addOwner(mesh:IEntity); - - /** - * Used by the mesh object from which the animator is removed, unregisters the owner for internal use. - * - * @private - */ - removeOwner(mesh:IEntity); - - /** - * //TODO - * - * @param sourceSubGeometry - */ - getRenderableSubGeometry(renderable:IRenderable, sourceSubGeometry:SubGeometryBase):SubGeometryBase; - } -} diff --git a/src/away/animators/nodes/AnimationNodeBase.ts b/src/away/animators/nodes/AnimationNodeBase.ts deleted file mode 100644 index 31df7948..00000000 --- a/src/away/animators/nodes/AnimationNodeBase.ts +++ /dev/null @@ -1,44 +0,0 @@ -/// - -module away.animators -{ - import AssetType = away.library.AssetType; - import IAsset = away.library.IAsset; - import NamedAssetBase = away.library.NamedAssetBase; - - /** - * Provides an abstract base class for nodes in an animation blend tree. - */ - export class AnimationNodeBase extends NamedAssetBase implements IAsset - { - public _pStateClass:any; - - public get stateClass():any - { - return this._pStateClass; - } - - /** - * Creates a new AnimationNodeBase object. - */ - constructor() - { - super(); - } - - /** - * @inheritDoc - */ - public dispose() - { - } - - /** - * @inheritDoc - */ - public get assetType():string - { - return AssetType.ANIMATION_NODE; - } - } -} diff --git a/src/away/bounds/AxisAlignedBoundingBox.ts b/src/away/bounds/AxisAlignedBoundingBox.ts deleted file mode 100644 index 973795fa..00000000 --- a/src/away/bounds/AxisAlignedBoundingBox.ts +++ /dev/null @@ -1,344 +0,0 @@ -/// - -module away.bounds -{ - import IEntity = away.entities.IEntity; - import Matrix3D = away.geom.Matrix3D; - import Matrix3DUtils = away.geom.Matrix3DUtils; - import PlaneClassification = away.geom.PlaneClassification; - import Plane3D = away.geom.Plane3D; - import Vector3D = away.geom.Vector3D; - - /** - * AxisAlignedBoundingBox represents a bounding box volume that has its planes aligned to the local coordinate axes of the bounded object. - * This is useful for most meshes. - */ - export class AxisAlignedBoundingBox extends BoundingVolumeBase - { - private _centerX:number = 0; - private _centerY:number = 0; - private _centerZ:number = 0; - private _halfExtentsX:number = 0; - private _halfExtentsY:number = 0; - private _halfExtentsZ:number = 0; - - /** - * Creates a new AxisAlignedBoundingBox object. - */ - constructor() - { - super(); - } - - /** - * @inheritDoc - */ - public nullify() - { - super.nullify(); - - this._centerX = this._centerY = this._centerZ = 0; - this._halfExtentsX = this._halfExtentsY = this._halfExtentsZ = 0; - } - - /** - * @inheritDoc - */ - public isInFrustum(planes:Array, numPlanes:number):boolean - { - for (var i:number = 0; i < numPlanes; ++i) { - - var plane:away.geom.Plane3D = planes[i]; - var a:number = plane.a; - var b:number = plane.b; - var c:number = plane.c; - var flippedExtentX:number = a < 0? -this._halfExtentsX : this._halfExtentsX; - var flippedExtentY:number = b < 0? -this._halfExtentsY : this._halfExtentsY; - var flippedExtentZ:number = c < 0? -this._halfExtentsZ : this._halfExtentsZ; - var projDist:number = a*(this._centerX + flippedExtentX) + b*(this._centerY + flippedExtentY) + c*(this._centerZ + flippedExtentZ) - plane.d; - - if (projDist < 0) - return false; - } - - return true; - } - - public rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number - { - - if (this.containsPoint(position)) - return 0; - - var px:number = position.x - this._centerX - var py:number = position.y - this._centerY - var pz:number = position.z - this._centerZ; - - var vx:number = direction.x - var vy:number = direction.y - var vz:number = direction.z; - - var ix:number; - var iy:number; - var iz:number; - var rayEntryDistance:number; - - // ray-plane tests - var intersects:boolean; - if (vx < 0) { - rayEntryDistance = ( this._halfExtentsX - px )/vx; - if (rayEntryDistance > 0) { - iy = py + rayEntryDistance*vy; - iz = pz + rayEntryDistance*vz; - if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { - targetNormal.x = 1; - targetNormal.y = 0; - targetNormal.z = 0; - - intersects = true; - } - } - } - if (!intersects && vx > 0) { - rayEntryDistance = ( -this._halfExtentsX - px )/vx; - if (rayEntryDistance > 0) { - iy = py + rayEntryDistance*vy; - iz = pz + rayEntryDistance*vz; - if (iy > -this._halfExtentsY && iy < this._halfExtentsY && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { - targetNormal.x = -1; - targetNormal.y = 0; - targetNormal.z = 0; - intersects = true; - } - } - } - if (!intersects && vy < 0) { - rayEntryDistance = ( this._halfExtentsY - py )/vy; - if (rayEntryDistance > 0) { - ix = px + rayEntryDistance*vx; - iz = pz + rayEntryDistance*vz; - if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { - targetNormal.x = 0; - targetNormal.y = 1; - targetNormal.z = 0; - intersects = true; - } - } - } - if (!intersects && vy > 0) { - rayEntryDistance = ( -this._halfExtentsY - py )/vy; - if (rayEntryDistance > 0) { - ix = px + rayEntryDistance*vx; - iz = pz + rayEntryDistance*vz; - if (ix > -this._halfExtentsX && ix < this._halfExtentsX && iz > -this._halfExtentsZ && iz < this._halfExtentsZ) { - targetNormal.x = 0; - targetNormal.y = -1; - targetNormal.z = 0; - intersects = true; - } - } - } - if (!intersects && vz < 0) { - rayEntryDistance = ( this._halfExtentsZ - pz )/vz; - if (rayEntryDistance > 0) { - ix = px + rayEntryDistance*vx; - iy = py + rayEntryDistance*vy; - if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { - targetNormal.x = 0; - targetNormal.y = 0; - targetNormal.z = 1; - intersects = true; - } - } - } - if (!intersects && vz > 0) { - rayEntryDistance = ( -this._halfExtentsZ - pz )/vz; - if (rayEntryDistance > 0) { - ix = px + rayEntryDistance*vx; - iy = py + rayEntryDistance*vy; - if (iy > -this._halfExtentsY && iy < this._halfExtentsY && ix > -this._halfExtentsX && ix < this._halfExtentsX) { - targetNormal.x = 0; - targetNormal.y = 0; - targetNormal.z = -1; - intersects = true; - } - } - } - - return intersects? rayEntryDistance : -1; - } - - /** - * @inheritDoc - */ - public containsPoint(position:Vector3D):boolean - { - var px:number = position.x - this._centerX, py:number = position.y - this._centerY, pz:number = position.z - this._centerZ; - return px <= this._halfExtentsX && px >= -this._halfExtentsX && py <= this._halfExtentsY && py >= -this._halfExtentsY && pz <= this._halfExtentsZ && pz >= -this._halfExtentsZ; - } - - /** - * @inheritDoc - */ - public fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number) - { - - this._centerX = (maxX + minX)*.5; - this._centerY = (maxY + minY)*.5; - this._centerZ = (maxZ + minZ)*.5; - this._halfExtentsX = (maxX - minX)*.5; - this._halfExtentsY = (maxY - minY)*.5; - this._halfExtentsZ = (maxZ - minZ)*.5; - - super.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); - - } - - /** - * @inheritDoc - */ - public clone():BoundingVolumeBase - { - var clone:AxisAlignedBoundingBox = new AxisAlignedBoundingBox(); - clone.fromExtremes(this._aabb.x, this._aabb.y + this._aabb.height, this._aabb.z, this._aabb.x + this._aabb.width, this._aabb.y, this._aabb.z + this._aabb.depth); - return clone; - } - - public get halfExtentsX():number - { - return this._halfExtentsX; - } - - public get halfExtentsY():number - { - return this._halfExtentsY; - } - - public get halfExtentsZ():number - { - return this._halfExtentsZ; - } - - /** - * Finds the closest point on the bounding volume to another given point. This can be used for maximum error calculations for content within a given bound. - * @param point The point for which to find the closest point on the bounding volume - * @param target An optional Vector3D to store the result to prevent creating a new object. - * @return - */ - public closestPointToPoint(point:Vector3D, target:Vector3D = null):Vector3D - { - var p:number; - - if (target == null) - target = new Vector3D(); - - p = point.x; - if (p < this._aabb.x) - p = this._aabb.x; - if (p > this._aabb.x + this._aabb.width) - p = this._aabb.x + this._aabb.width; - target.x = p; - - p = point.y; - if (p < this._aabb.y + this._aabb.height) - p = this._aabb.y + this._aabb.height; - if (p > this._aabb.y) - p = this._aabb.y; - target.y = p; - - p = point.z; - if (p < this._aabb.z) - p = this._aabb.z; - if (p > this._aabb.z + this._aabb.depth) - p = this._aabb.z + this._aabb.depth; - target.z = p; - - return target; - } - - public pUpdateBoundingRenderable() - { - this._pBoundingEntity.transform.scale.x = Math.max(this._halfExtentsX*2, 0.001); - this._pBoundingEntity.transform.scale.y = Math.max(this._halfExtentsY*2, 0.001); - this._pBoundingEntity.transform.scale.z = Math.max(this._halfExtentsZ*2, 0.001); - this._pBoundingEntity.transform.position.x = this._centerX; - this._pBoundingEntity.transform.position.y = this._centerY; - this._pBoundingEntity.transform.position.z = this._centerZ; - } - - public pCreateBoundingEntity():IEntity - { - return null;// new away.primitives.WireframeCube(1, 1, 1, 0xffffff, 0.5); - } - - public classifyToPlane(plane:Plane3D):number - { - var a:number = plane.a; - var b:number = plane.b; - var c:number = plane.c; - var centerDistance:number = a*this._centerX + b*this._centerY + c*this._centerZ - plane.d; - - if (a < 0) - a = -a; - - if (b < 0) - b = -b; - - if (c < 0) - c = -c; - - var boundOffset:number = a*this._halfExtentsX + b*this._halfExtentsY + c*this._halfExtentsZ; - - return centerDistance > boundOffset? PlaneClassification.FRONT : centerDistance < -boundOffset? PlaneClassification.BACK : PlaneClassification.INTERSECT; - } - - public transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D) - { - var aabb:AxisAlignedBoundingBox = bounds; - var cx:number = aabb._centerX; - var cy:number = aabb._centerY; - var cz:number = aabb._centerZ; - var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; - - matrix.copyRawDataTo(raw); - - var m11:number = raw[0], m12:number = raw[4], m13:number = raw[8], m14:number = raw[12]; - var m21:number = raw[1], m22:number = raw[5], m23:number = raw[9], m24:number = raw[13]; - var m31:number = raw[2], m32:number = raw[6], m33:number = raw[10], m34:number = raw[14]; - - this._centerX = cx*m11 + cy*m12 + cz*m13 + m14; - this._centerY = cx*m21 + cy*m22 + cz*m23 + m24; - this._centerZ = cx*m31 + cy*m32 + cz*m33 + m34; - - if (m11 < 0) - m11 = -m11; - if (m12 < 0) - m12 = -m12; - if (m13 < 0) - m13 = -m13; - if (m21 < 0) - m21 = -m21; - if (m22 < 0) - m22 = -m22; - if (m23 < 0) - m23 = -m23; - if (m31 < 0) - m31 = -m31; - if (m32 < 0) - m32 = -m32; - if (m33 < 0) - m33 = -m33; - var hx:number = aabb._halfExtentsX; - var hy:number = aabb._halfExtentsY; - var hz:number = aabb._halfExtentsZ; - this._halfExtentsX = hx*m11 + hy*m12 + hz*m13; - this._halfExtentsY = hx*m21 + hy*m22 + hz*m23; - this._halfExtentsZ = hx*m31 + hy*m32 + hz*m33; - - this._aabb.width = this._aabb.height = this._aabb.depth = this._halfExtentsX*2; - this._aabb.x = this._centerX - this._halfExtentsX; - this._aabb.y = this._centerY + this._halfExtentsY; - this._aabb.z = this._centerZ - this._halfExtentsZ; - } - } -} diff --git a/src/away/bounds/BoundingSphere.ts b/src/away/bounds/BoundingSphere.ts deleted file mode 100644 index 90a1c5ce..00000000 --- a/src/away/bounds/BoundingSphere.ts +++ /dev/null @@ -1,226 +0,0 @@ -/// - -module away.bounds -{ - import IEntity = away.entities.IEntity; - import Matrix3D = away.geom.Matrix3D; - import PlaneClassification = away.geom.PlaneClassification; - import Plane3D = away.geom.Plane3D; - import Transform = away.geom.Transform; - import Vector3D = away.geom.Vector3D; - - export class BoundingSphere extends BoundingVolumeBase - { - - private _radius:number = 0; - private _centerX:number = 0; - private _centerY:number = 0; - private _centerZ:number = 0; - - constructor() - { - super(); - } - - public get radius():number - { - return this._radius; - } - - public nullify() - { - super.nullify(); - this._centerX = this._centerY = this._centerZ = 0; - this._radius = 0; - } - - public isInFrustum(planes:Array, numPlanes:number):boolean - { - for (var i:number = 0; i < numPlanes; ++i) { - var plane:Plane3D = planes[i]; - var flippedExtentX:number = plane.a < 0? -this._radius : this._radius; - var flippedExtentY:number = plane.b < 0? -this._radius : this._radius; - var flippedExtentZ:number = plane.c < 0? -this._radius : this._radius; - var projDist:number = plane.a*( this._centerX + flippedExtentX ) + plane.b*( this._centerY + flippedExtentY) + plane.c*( this._centerZ + flippedExtentZ ) - plane.d; - if (projDist < 0) { - return false; - } - } - return true; - } - - public fromSphere(center:Vector3D, radius:number) - { - this._centerX = center.x; - this._centerY = center.y; - this._centerZ = center.z; - this._radius = radius; - this._aabb.width = this._aabb.height = this._aabb.depth = radius*2; - this._aabb.x = this._centerX - radius; - this._aabb.y = this._centerY + radius; - this._aabb.z = this._centerZ - radius; - this._pAabbPointsDirty = true; - - if (this._pBoundingEntity) - this.pUpdateBoundingEntity(); - } - - public fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number) - { - this._centerX = (maxX + minX)*.5; - this._centerY = (maxY + minY)*.5; - this._centerZ = (maxZ + minZ)*.5; - - var d:number = maxX - minX; - var y:number = maxY - minY; - var z:number = maxZ - minZ; - - if (y > d) - d = y; - - if (z > d) - d = z; - - this._radius = d*Math.sqrt(.5); - super.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); - } - - public clone():BoundingVolumeBase - { - var clone:BoundingSphere = new BoundingSphere(); - clone.fromSphere(new Vector3D(this._centerX, this._centerY, this._centerZ), this._radius); - return clone; - } - - public rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number - { - if (this.containsPoint(position)) { - return 0; - } - - var px:number = position.x - this._centerX, py:number = position.y - this._centerY, pz:number = position.z - this._centerZ; - var vx:number = direction.x, vy:number = direction.y, vz:number = direction.z; - var rayEntryDistance:number; - - var a:number = vx*vx + vy*vy + vz*vz; - var b:number = 2*( px*vx + py*vy + pz*vz ); - var c:number = px*px + py*py + pz*pz - this._radius*this._radius; - var det:number = b*b - 4*a*c; - - if (det >= 0) { // ray goes through sphere - var sqrtDet:number = Math.sqrt(det); - rayEntryDistance = ( -b - sqrtDet )/( 2*a ); - if (rayEntryDistance >= 0) { - targetNormal.x = px + rayEntryDistance*vx; - targetNormal.y = py + rayEntryDistance*vy; - targetNormal.z = pz + rayEntryDistance*vz; - targetNormal.normalize(); - - return rayEntryDistance; - } - } - - // ray misses sphere - return -1; - } - - public containsPoint(position:Vector3D):boolean - { - var px:number = position.x - this._centerX; - var py:number = position.y - this._centerY; - var pz:number = position.z - this._centerZ; - var distance:number = Math.sqrt(px*px + py*py + pz*pz); - return distance <= this._radius; - } - - public pUpdateBoundingEntity() - { - var sc:number = this._radius; - if (sc == 0) - sc = 0.001; - - var transform:Transform = this._pBoundingEntity.transform; - transform.scale = new Vector3D(sc, sc, sc); - transform.position = new Vector3D(this._centerX, this._centerY, this._centerZ); - } - - // TODO pCreateBoundingRenderable():WireframePrimitiveBase - - public pCreateBoundingEntity():away.entities.IEntity - { - return null;//new away.primitives.WireframeSphere(1, 16, 12, 0xffffff, 0.5); - } - - - //@override - public classifyToPlane(plane:Plane3D):number - { - var a:number = plane.a; - var b:number = plane.b; - var c:number = plane.c; - var dd:number = a*this._centerX + b*this._centerY + c*this._centerZ - plane.d; - - if (a < 0) - a = -a; - - if (b < 0) - b = -b; - - if (c < 0) - c = -c; - - var rr:Number = (a + b + c)*this._radius; - - return dd > rr? PlaneClassification.FRONT : dd < -rr? PlaneClassification.BACK : PlaneClassification.INTERSECT; - } - - public transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D) - { - var sphere:BoundingSphere = bounds; - var cx:number = sphere._centerX; - var cy:number = sphere._centerY; - var cz:number = sphere._centerZ; - var raw:Array = new Array(16); - - matrix.copyRawDataTo(raw); - - var m11:number = raw[0], m12:number = raw[4], m13:number = raw[8], m14:number = raw[12]; - var m21:number = raw[1], m22:number = raw[5], m23:number = raw[9], m24:number = raw[13]; - var m31:number = raw[2], m32:number = raw[6], m33:number = raw[10], m34:number = raw[14]; - - this._centerX = cx*m11 + cy*m12 + cz*m13 + m14; - this._centerY = cx*m21 + cy*m22 + cz*m23 + m24; - this._centerZ = cx*m31 + cy*m32 + cz*m33 + m34; - - if (m11 < 0) - m11 = -m11; - if (m12 < 0) - m12 = -m12; - if (m13 < 0) - m13 = -m13; - if (m21 < 0) - m21 = -m21; - if (m22 < 0) - m22 = -m22; - if (m23 < 0) - m23 = -m23; - if (m31 < 0) - m31 = -m31; - if (m32 < 0) - m32 = -m32; - if (m33 < 0) - m33 = -m33; - - var r:number = sphere._radius; - var rx:number = m11 + m12 + m13; - var ry:number = m21 + m22 + m23; - var rz:number = m31 + m32 + m33; - this._radius = r*Math.sqrt(rx*rx + ry*ry + rz*rz); - - this._aabb.width = this._aabb.height = this._aabb.depth = this._radius*2; - this._aabb.x = this._centerX - this._radius; - this._aabb.y = this._centerY + this._radius; - this._aabb.z = this._centerZ - this._radius; - } - } -} \ No newline at end of file diff --git a/src/away/bounds/BoundingVolumeBase.ts b/src/away/bounds/BoundingVolumeBase.ts deleted file mode 100644 index cc0d8d0f..00000000 --- a/src/away/bounds/BoundingVolumeBase.ts +++ /dev/null @@ -1,259 +0,0 @@ -/// - -module away.bounds -{ - import Geometry = away.base.Geometry; - import SubGeometryBase = away.base.SubGeometryBase; - import IEntity = away.entities.IEntity; - import Box = away.geom.Box; - import Matrix3D = away.geom.Matrix3D; - import Plane3D = away.geom.Plane3D; - import Vector3D = away.geom.Vector3D; - - export class BoundingVolumeBase - { - public _aabb:Box; - public _pAabbPoints:Array = new Array(); - public _pAabbPointsDirty:boolean = true; - public _pBoundingEntity:IEntity; - - constructor() - { - this._aabb = new Box(); - } - - public get aabb():Box - { - return this._aabb; - } - - public get aabbPoints():Array - { - if (this._pAabbPointsDirty) - this.pUpdateAABBPoints(); - - return this._pAabbPoints; - } - - public get boundingEntity():IEntity - { - if (!this._pBoundingEntity) { - this._pBoundingEntity = this.pCreateBoundingEntity(); - this.pUpdateBoundingEntity(); - } - - return this._pBoundingEntity; - } - - public nullify() - { - this._aabb.x = this._aabb.y = this._aabb.z = 0; - this._aabb.width = this._aabb.height = this._aabb.depth = 0; - this._pAabbPointsDirty = true; - - if (this._pBoundingEntity) - this.pUpdateBoundingEntity(); - } - - public disposeRenderable() - { - if (this._pBoundingEntity) - this._pBoundingEntity.dispose(); - - this._pBoundingEntity = null; - } - - public fromVertices(vertices:Array) - { - var i:number; - var len:number = vertices.length; - var minX:number, minY:number, minZ:number; - var maxX:number, maxY:number, maxZ:number; - - if (len == 0) { - this.nullify(); - return; - } - - var v:number; - - minX = maxX = vertices[i++]; - minY = maxY = vertices[i++]; - minZ = maxZ = vertices[i++]; - - while (i < len) { - v = vertices[i++]; - if (v < minX) - minX = v; else if (v > maxX) - maxX = v; - v = vertices[i++]; - if (v < minY) - minY = v; else if (v > maxY) - maxY = v; - v = vertices[i++]; - if (v < minZ) - minZ = v; else if (v > maxZ) - maxZ = v; - } - - this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); - } - - /** - * Updates the bounds to fit a Geometry object. - * - * @param geometry The Geometry object to be bounded. - */ - public fromGeometry(geometry:Geometry):void - { - var i:number, j:number, p:number; - var subGeoms:Array = geometry.subGeometries; - var subGeom:SubGeometryBase; - var boundingPositions:Array; - var numSubGeoms:number = subGeoms.length; - var minX:number, minY:number, minZ:number; - var maxX:number, maxY:number, maxZ:number; - - if (numSubGeoms > 0) { - i = 0; - subGeom = subGeoms[0]; - boundingPositions = subGeom.getBoundingPositions(); - minX = maxX = boundingPositions[i]; - minY = maxY = boundingPositions[i + 1]; - minZ = maxZ = boundingPositions[i + 2]; - - j = numSubGeoms; - while (j--) { - subGeom = subGeoms[j]; - boundingPositions = subGeom.getBoundingPositions(); - i = boundingPositions.length; - while (i--) { - p = boundingPositions[i]; - if (p < minX) - minX = p; - else if (p > maxX) - maxX = p; - - p = boundingPositions[i + 1]; - - if (p < minY) - minY = p; - else if (p > maxY) - maxY = p; - - p = boundingPositions[i + 2]; - - if (p < minZ) - minZ = p; - else if (p > maxZ) - maxZ = p; - } - } - - this.fromExtremes(minX, minY, minZ, maxX, maxY, maxZ); - } else { - this.fromExtremes(0, 0, 0, 0, 0, 0); - } - } - - public fromSphere(center:Vector3D, radius:number) - { - this.fromExtremes(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius); - } - - public fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number) - { - this._aabb.x = minX; - this._aabb.y = maxY; - this._aabb.z = minZ; - this._aabb.width = maxX - minX; - this._aabb.height = maxY - minY; - this._aabb.depth = maxZ - minZ; - this._pAabbPointsDirty = true; - - if (this._pBoundingEntity) - this.pUpdateBoundingEntity(); - } - - public isInFrustum(planes:Array, numPlanes:number):boolean - { - throw new away.errors.AbstractMethodError(); - } - - public overlaps(bounds:BoundingVolumeBase):boolean - { - return this._aabb.intersects(bounds.aabb); - } - - public clone():BoundingVolumeBase - { - throw new away.errors.AbstractMethodError(); - } - - public rayIntersection(position:Vector3D, direction:Vector3D, targetNormal:Vector3D):number - { - return -1; - } - - public containsPoint(position:Vector3D):boolean - { - return false; - } - - public pUpdateAABBPoints() - { - var minX:number = this._aabb.x; - var minY:number = this._aabb.y - this._aabb.height; - var minZ:number = this._aabb.z; - var maxX:number = this._aabb.x + this._aabb.width; - var maxY:number = this._aabb.y; - var maxZ:number = this._aabb.z + this._aabb.depth; - - this._pAabbPoints[0] = minX; - this._pAabbPoints[1] = minY; - this._pAabbPoints[2] = minZ; - this._pAabbPoints[3] = maxX; - this._pAabbPoints[4] = minY; - this._pAabbPoints[5] = minZ; - this._pAabbPoints[6] = minX; - this._pAabbPoints[7] = maxY; - this._pAabbPoints[8] = minZ; - this._pAabbPoints[9] = maxX; - this._pAabbPoints[10] = maxY; - this._pAabbPoints[11] = minZ; - this._pAabbPoints[12] = minX; - this._pAabbPoints[13] = minY; - this._pAabbPoints[14] = maxZ; - this._pAabbPoints[15] = maxX; - this._pAabbPoints[16] = minY; - this._pAabbPoints[17] = maxZ; - this._pAabbPoints[18] = minX; - this._pAabbPoints[19] = maxY; - this._pAabbPoints[20] = maxZ; - this._pAabbPoints[21] = maxX; - this._pAabbPoints[22] = maxY; - this._pAabbPoints[23] = maxZ; - this._pAabbPointsDirty = false; - } - - public pUpdateBoundingEntity() - { - throw new away.errors.AbstractMethodError(); - } - - public pCreateBoundingEntity():IEntity - { - throw new away.errors.AbstractMethodError(); - } - - public classifyToPlane(plane:Plane3D):number - { - throw new away.errors.AbstractMethodError(); - } - - public transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D) - { - throw new away.errors.AbstractMethodError(); - } - } -} \ No newline at end of file diff --git a/src/away/bounds/NullBounds.ts b/src/away/bounds/NullBounds.ts deleted file mode 100644 index ac87f8b7..00000000 --- a/src/away/bounds/NullBounds.ts +++ /dev/null @@ -1,70 +0,0 @@ -/// - -module away.bounds -{ - import IEntity = away.entities.IEntity; - import Matrix3D = away.geom.Matrix3D; - import PlaneClassification = away.geom.PlaneClassification; - import Plane3D = away.geom.Plane3D; - import Vector3D = away.geom.Vector3D; - - export class NullBounds extends BoundingVolumeBase - { - private _alwaysIn:boolean; - - constructor(alwaysIn:boolean = true) - { - super(); - - this._alwaysIn = alwaysIn; - - this._aabb.width = this._aabb.height = this._aabb.depth = Number.POSITIVE_INFINITY; - this._aabb.x = this._aabb.y = this._aabb.z = this._alwaysIn? Number.NEGATIVE_INFINITY/2 : Number.POSITIVE_INFINITY; - } - - //@override - public clone():BoundingVolumeBase - { - return new NullBounds(this._alwaysIn); - } - - //@override - public pCreateBoundingEntity():IEntity - { - //return this._renderable || new away.primitives.WireframeSphere( 100, 16, 12, 0xffffff, 0.5 ); - return null; - } - - //@override - public isInFrustum(planes:Array, numPlanes:number):boolean - { - return this._alwaysIn; - } - -// //@override -// public fromGeometry(geometry:away.base.Geometry) -// { -// } - - //@override - public fromSphere(center:Vector3D, radius:number) - { - } - - //@override - public fromExtremes(minX:number, minY:number, minZ:number, maxX:number, maxY:number, maxZ:number) - { - } - - public classifyToPlane(plane:Plane3D):number - { - return PlaneClassification.INTERSECT; - } - - //@override - public transformFrom(bounds:BoundingVolumeBase, matrix:Matrix3D) - { - this._alwaysIn = ( bounds)._alwaysIn; - } - } -} \ No newline at end of file diff --git a/src/away/containers/DisplayObjectContainer.ts b/src/away/containers/DisplayObjectContainer.ts deleted file mode 100644 index 688fc3eb..00000000 --- a/src/away/containers/DisplayObjectContainer.ts +++ /dev/null @@ -1,562 +0,0 @@ -/// - -/** - * The DisplayObjectContainer class is the base class for all objects that can - * serve as display object containers on the display list. The display list - * manages all objects displayed in the Flash runtimes. Use the - * DisplayObjectContainer class to arrange the display objects in the display - * list. Each DisplayObjectContainer object has its own child list for - * organizing the z-order of the objects. The z-order is the front-to-back - * order that determines which object is drawn in front, which is behind, and - * so on. - * - *

DisplayObject is an abstract base class; therefore, you cannot call - * DisplayObject directly. Invoking new DisplayObject() throws an - * ArgumentError exception.

- * The DisplayObjectContainer class is an abstract base class for all objects - * that can contain child objects. It cannot be instantiated directly; calling - * the new DisplayObjectContainer() constructor throws an - * ArgumentError exception. - * - *

For more information, see the "Display Programming" chapter of the - * ActionScript 3.0 Developer's Guide.

- */ -module away.containers -{ - import DisplayObject = away.base.DisplayObject; - import ArgumentError = away.errors.ArgumentError; - import Error = away.errors.Error; - import RangeError = away.errors.RangeError; - import Point = away.geom.Point; - import AssetType = away.library.AssetType; - - - export class DisplayObjectContainer extends away.base.DisplayObject implements away.library.IAsset - { - private _mouseChildren:boolean = true; - private _children:Array = new Array(); - public _iIsRoot:boolean; - - /** - * - */ - public get assetType():string - { - return AssetType.CONTAINER; - } - - /** - * Determines whether or not the children of the object are mouse, or user - * input device, enabled. If an object is enabled, a user can interact with - * it by using a mouse or user input device. The default is - * true. - * - *

This property is useful when you create a button with an instance of - * the Sprite class(instead of using the SimpleButton class). When you use a - * Sprite instance to create a button, you can choose to decorate the button - * by using the addChild() method to add additional Sprite - * instances. This process can cause unexpected behavior with mouse events - * because the Sprite instances you add as children can become the target - * object of a mouse event when you expect the parent instance to be the - * target object. To ensure that the parent instance serves as the target - * objects for mouse events, you can set the mouseChildren - * property of the parent instance to false.

- * - *

No event is dispatched by setting this property. You must use the - * addEventListener() method to create interactive - * functionality.

- */ - public get mouseChildren():boolean - { - return this._mouseChildren; - } - - public set mouseChildren(value:boolean) - { - if (this._mouseChildren == value) - return; - - this._mouseChildren = value; - - this._pUpdateImplicitMouseEnabled(this._pParent? this._pParent.mouseChildren : true); - } - - /** - * Returns the number of children of this object. - */ - public get numChildren():number /*int*/ - { - return this._children.length; - } - - /** - * Determines whether the children of the object are tab enabled. Enables or - * disables tabbing for the children of the object. The default is - * true. - * - *

Note: Do not use the tabChildren property with - * Flex. Instead, use the - * mx.core.UIComponent.hasFocusableChildren property.

- * - * @throws IllegalOperationError Calling this property of the Stage object - * throws an exception. The Stage object does - * not implement this property. - */ - public tabChildren:boolean; - - /** - * Calling the new DisplayObjectContainer() constructor throws - * an ArgumentError exception. You can, however, call - * constructors for the following subclasses of DisplayObjectContainer: - *
    - *
  • new Loader()
  • - *
  • new Sprite()
  • - *
  • new MovieClip()
  • - *
- */ - constructor() - { - super(); - } - - /** - * Adds a child DisplayObject instance to this DisplayObjectContainer - * instance. The child is added to the front(top) of all other children in - * this DisplayObjectContainer instance.(To add a child to a specific index - * position, use the addChildAt() method.) - * - *

If you add a child object that already has a different display object - * container as a parent, the object is removed from the child list of the - * other display object container.

- * - *

Note: The command stage.addChild() can cause - * problems with a published SWF file, including security problems and - * conflicts with other loaded SWF files. There is only one Stage within a - * Flash runtime instance, no matter how many SWF files you load into the - * runtime. So, generally, objects should not be added to the Stage, - * directly, at all. The only object the Stage should contain is the root - * object. Create a DisplayObjectContainer to contain all of the items on the - * display list. Then, if necessary, add that DisplayObjectContainer instance - * to the Stage.

- * - * @param child The DisplayObject instance to add as a child of this - * DisplayObjectContainer instance. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child is the same as the parent. Also - * throws if the caller is a child(or grandchild etc.) - * of the child being added. - * @event added Dispatched when a display object is added to the display - * list. - */ - public addChild(child:DisplayObject):DisplayObject - { - if (child == null) - throw new Error("Parameter child cannot be null."); - - //if child already has a parent, remove it. - if (child._pParent) - child._pParent.removeChildInternal(child); - - child.iSetParent(this); - - this._children.push(child); - - return child; - } - - - /** - * Adds a child DisplayObject instance to this DisplayObjectContainer - * instance. The child is added at the index position specified. An index of - * 0 represents the back(bottom) of the display list for this - * DisplayObjectContainer object. - * - *

For example, the following example shows three display objects, labeled - * a, b, and c, at index positions 0, 2, and 1, respectively:

- * - *

If you add a child object that already has a different display object - * container as a parent, the object is removed from the child list of the - * other display object container.

- * - * @param child The DisplayObject instance to add as a child of this - * DisplayObjectContainer instance. - * @param index The index position to which the child is added. If you - * specify a currently occupied index position, the child object - * that exists at that position and all higher positions are - * moved up one position in the child list. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child is the same as the parent. Also - * throws if the caller is a child(or grandchild etc.) - * of the child being added. - * @throws RangeError Throws if the index position does not exist in the - * child list. - * @event added Dispatched when a display object is added to the display - * list. - */ - public addChildAt(child:DisplayObject, index:number /*int*/):DisplayObject - { - return child; - } - - public addChildren(...childarray:Array) - { - var len:number = childarray.length; - for (var i:number = 0; i < len; i++) - this.addChild(childarray[i]); - } - - /** - * - */ - public clone():DisplayObject - { - var clone:DisplayObjectContainer = new DisplayObjectContainer(); - clone.pivot = this.pivot; - clone._iMatrix3D = this._iMatrix3D; - clone.partition = this.partition; - clone.name = name; - - var len:number = this._children.length; - for (var i:number = 0; i < len; ++i) - clone.addChild(this._children[i].clone()); - - // todo: implement for all subtypes - return clone; - } - - /** - * Determines whether the specified display object is a child of the - * DisplayObjectContainer instance or the instance itself. The search - * includes the entire display list including this DisplayObjectContainer - * instance. Grandchildren, great-grandchildren, and so on each return - * true. - * - * @param child The child object to test. - * @return true if the child object is a child of - * the DisplayObjectContainer or the container itself; otherwise - * false. - */ - public contains(child:DisplayObject):boolean - { - return this._children.indexOf(child) >= 0; - } - - /** - * - */ - public disposeWithChildren() - { - this.dispose(); - - while (this.numChildren > 0) - this.getChildAt(0).dispose(); - } - - /** - * Returns the child display object instance that exists at the specified - * index. - * - * @param index The index position of the child object. - * @return The child display object at the specified index position. - * @throws RangeError Throws if the index does not exist in the child - * list. - */ - public getChildAt(index:number /*int*/):DisplayObject - { - var child:DisplayObject = this._children[index]; - - if (child == null) - throw new RangeError("Index does not exist in the child list of the caller"); - - return child; - } - - /** - * Returns the child display object that exists with the specified name. If - * more that one child display object has the specified name, the method - * returns the first object in the child list. - * - *

The getChildAt() method is faster than the - * getChildByName() method. The getChildAt() method - * accesses a child from a cached array, whereas the - * getChildByName() method has to traverse a linked list to - * access a child.

- * - * @param name The name of the child to return. - * @return The child display object with the specified name. - */ - public getChildByName(name:string):DisplayObject - { - var len:number = this._children.length; - for (var i:number = 0; i < len; ++i) - if (this._children[i].name == name) - return this._children[i]; - - return null; - } - - /** - * Returns the index position of a child DisplayObject instance. - * - * @param child The DisplayObject instance to identify. - * @return The index position of the child display object to identify. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - */ - public getChildIndex(child:DisplayObject):number /*int*/ - { - var childIndex:number = this._children.indexOf(child); - - if (childIndex == -1) - throw new ArgumentError("Child parameter is not a child of the caller"); - - return childIndex; - } - - /** - * Returns an array of objects that lie under the specified point and are - * children(or grandchildren, and so on) of this DisplayObjectContainer - * instance. Any child objects that are inaccessible for security reasons are - * omitted from the returned array. To determine whether this security - * restriction affects the returned array, call the - * areInaccessibleObjectsUnderPoint() method. - * - *

The point parameter is in the coordinate space of the - * Stage, which may differ from the coordinate space of the display object - * container(unless the display object container is the Stage). You can use - * the globalToLocal() and the localToGlobal() - * methods to convert points between these coordinate spaces.

- * - * @param point The point under which to look. - * @return An array of objects that lie under the specified point and are - * children(or grandchildren, and so on) of this - * DisplayObjectContainer instance. - */ - public getObjectsUnderPoint(point:away.geom.Point):Array - { - return new Array(); - } - - /** - * Removes the specified child DisplayObject instance from the - * child list of the DisplayObjectContainer instance. The parent - * property of the removed child is set to null , and the object - * is garbage collected if no other references to the child exist. The index - * positions of any display objects above the child in the - * DisplayObjectContainer are decreased by 1. - * - *

The garbage collector reallocates unused memory space. When a variable - * or object is no longer actively referenced or stored somewhere, the - * garbage collector sweeps through and wipes out the memory space it used to - * occupy if no other references to it exist.

- * - * @param child The DisplayObject instance to remove. - * @return The DisplayObject instance that you pass in the child - * parameter. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - */ - public removeChild(child:DisplayObject):DisplayObject - { - if (child == null) - throw new Error("Parameter child cannot be null"); - - this.removeChildInternal(child); - - child.iSetParent(null); - - return child; - } - - /** - * Removes a child DisplayObject from the specified index - * position in the child list of the DisplayObjectContainer. The - * parent property of the removed child is set to - * null, and the object is garbage collected if no other - * references to the child exist. The index positions of any display objects - * above the child in the DisplayObjectContainer are decreased by 1. - * - *

The garbage collector reallocates unused memory space. When a variable - * or object is no longer actively referenced or stored somewhere, the - * garbage collector sweeps through and wipes out the memory space it used to - * occupy if no other references to it exist.

- * - * @param index The child index of the DisplayObject to remove. - * @return The DisplayObject instance that was removed. - * @throws RangeError Throws if the index does not exist in the child - * list. - * @throws SecurityError This child display object belongs to a sandbox to - * which the calling object does not have access. You - * can avoid this situation by having the child movie - * call the Security.allowDomain() method. - */ - public removeChildAt(index:number /*int*/):DisplayObject - { - return this.removeChild(this._children[index]); - } - - /** - * Removes all child DisplayObject instances from the child list - * of the DisplayObjectContainer instance. The parent property - * of the removed children is set to null, and the objects are - * garbage collected if no other references to the children exist. - * - * The garbage collector reallocates unused memory space. When a variable or - * object is no longer actively referenced or stored somewhere, the garbage - * collector sweeps through and wipes out the memory space it used to occupy - * if no other references to it exist. - * - * @param beginIndex The beginning position. A value smaller than 0 throws a RangeError. - * @param endIndex The ending position. A value smaller than 0 throws a RangeError. - * @throws RangeError Throws if the beginIndex or endIndex positions do - * not exist in the child list. - */ - public removeChildren(beginIndex:number /*int*/ = 0, endIndex:number /*int*/ = 2147483647) - { - if (beginIndex < 0) - throw new RangeError("beginIndex is out of range of the child list"); - - if (endIndex > this._children.length) - throw new RangeError("endIndex is out of range of the child list"); - - for(var i:number /*uint*/ = beginIndex; i < endIndex; i++) - this.removeChild(this._children[i]); - } - - /** - * Changes the position of an existing child in the display object container. - * This affects the layering of child objects. For example, the following - * example shows three display objects, labeled a, b, and c, at index - * positions 0, 1, and 2, respectively: - * - *

When you use the setChildIndex() method and specify an - * index position that is already occupied, the only positions that change - * are those in between the display object's former and new position. All - * others will stay the same. If a child is moved to an index LOWER than its - * current index, all children in between will INCREASE by 1 for their index - * reference. If a child is moved to an index HIGHER than its current index, - * all children in between will DECREASE by 1 for their index reference. For - * example, if the display object container in the previous example is named - * container, you can swap the position of the display objects - * labeled a and b by calling the following code:

- * - *

This code results in the following arrangement of objects:

- * - * @param child The child DisplayObject instance for which you want to change - * the index number. - * @param index The resulting index number for the child display - * object. - * @throws ArgumentError Throws if the child parameter is not a child of this - * object. - * @throws RangeError Throws if the index does not exist in the child - * list. - */ - public setChildIndex(child:DisplayObject, index:number /*int*/) - { - //TODO - } - - /** - * Swaps the z-order (front-to-back order) of the two specified child - * objects. All other child objects in the display object container remain in - * the same index positions. - * - * @param child1 The first child object. - * @param child2 The second child object. - * @throws ArgumentError Throws if either child parameter is not a child of - * this object. - */ - public swapChildren(child1:DisplayObject, child2:DisplayObject) - { - //TODO - } - - /** - * Swaps the z-order(front-to-back order) of the child objects at the two - * specified index positions in the child list. All other child objects in - * the display object container remain in the same index positions. - * - * @param index1 The index position of the first child object. - * @param index2 The index position of the second child object. - * @throws RangeError If either index does not exist in the child list. - */ - public swapChildrenAt(index1:number /*int*/, index2:number /*int*/) - { - //TODO - } - - /** - * @protected - */ - public pInvalidateSceneTransform() - { - super.pInvalidateSceneTransform(); - - var len:number = this._children.length; - for (var i:number = 0; i < len; ++i) - this._children[i].pInvalidateSceneTransform(); - } - - /** - * @protected - */ - public _pUpdateScene(value:Scene) - { - super._pUpdateScene(value); - - var len:number = this._children.length; - for (var i:number = 0; i < len; ++i) - this._children[i]._pUpdateScene(value); - } - - /** - * @protected - */ - public _pUpdateImplicitMouseEnabled(value:boolean) - { - super._pUpdateImplicitMouseEnabled(value); - - var len:number = this._children.length; - for (var i:number = 0; i < len; ++i) - this._children[i]._pUpdateImplicitMouseEnabled(this._mouseChildren); - } - - /** - * @protected - */ - public _pUpdateImplicitVisibility(value:boolean) - { - super._pUpdateImplicitVisibility(value); - - var len:number = this._children.length; - for (var i:number = 0; i < len; ++i) - this._children[i]._pUpdateImplicitVisibility(this._pImplicitVisibility); - } - - /** - * @protected - */ - public _pUpdateImplicitPartition(value:away.partition.Partition) - { - super._pUpdateImplicitPartition(value); - - var len:number = this._children.length; - for (var i:number = 0; i < len; ++i) - this._children[i]._pUpdateImplicitPartition(this._pImplicitPartition); - } - - /** - * @private - * - * @param child - */ - private removeChildInternal(child:DisplayObject):DisplayObject - { - this._children.splice(this.getChildIndex(child), 1); - - return child; - } - } -} diff --git a/src/away/containers/Loader.ts b/src/away/containers/Loader.ts deleted file mode 100644 index 87b6238b..00000000 --- a/src/away/containers/Loader.ts +++ /dev/null @@ -1,644 +0,0 @@ -/// - -/** - * The Loader class is used to load SWF files or image(JPG, PNG, or GIF) - * files. Use the load() method to initiate loading. The loaded - * display object is added as a child of the Loader object. - * - *

Use the URLLoader class to load text or binary data.

- * - *

The Loader class overrides the following methods that it inherits, - * because a Loader object can only have one child display object - the - * display object that it loads. Calling the following methods throws an - * exception: addChild(), addChildAt(), - * removeChild(), removeChildAt(), and - * setChildIndex(). To remove a loaded display object, you must - * remove the Loader object from its parent DisplayObjectContainer - * child array.

- * - *

Note: The ActionScript 2.0 MovieClipLoader and LoadVars classes - * are not used in ActionScript 3.0. The Loader and URLLoader classes replace - * them.

- * - *

When you use the Loader class, consider the Flash Player and Adobe AIR - * security model:

- * - *
    - *
  • You can load content from any accessible source.
  • - *
  • Loading is not allowed if the calling SWF file is in a network - * sandbox and the file to be loaded is local.
  • - *
  • If the loaded content is a SWF file written with ActionScript 3.0, it - * cannot be cross-scripted by a SWF file in another security sandbox unless - * that cross-scripting arrangement was approved through a call to the - * System.allowDomain() or the - * System.allowInsecureDomain() method in the loaded content - * file.
  • - *
  • If the loaded content is an AVM1 SWF file(written using ActionScript - * 1.0 or 2.0), it cannot be cross-scripted by an AVM2 SWF file(written using - * ActionScript 3.0). However, you can communicate between the two SWF files - * by using the LocalConnection class.
  • - *
  • If the loaded content is an image, its data cannot be accessed by a - * SWF file outside of the security sandbox, unless the domain of that SWF - * file was included in a URL policy file at the origin domain of the - * image.
  • - *
  • Movie clips in the local-with-file-system sandbox cannot script movie - * clips in the local-with-networking sandbox, and the reverse is also - * prevented.
  • - *
  • You cannot connect to commonly reserved ports. For a complete list of - * blocked ports, see "Restricting Networking APIs" in the ActionScript 3.0 - * Developer's Guide.
  • - *
- * - *

However, in AIR, content in the application security - * sandbox(content installed with the AIR application) are not restricted by - * these security limitations.

- * - *

For more information related to security, see the Flash Player Developer - * Center Topic: Security.

- * - *

When loading a SWF file from an untrusted source(such as a domain other - * than that of the Loader object's root SWF file), you may want to define a - * mask for the Loader object, to prevent the loaded content(which is a child - * of the Loader object) from drawing to portions of the Stage outside of that - * mask, as shown in the following code:

- */ -module away.containers -{ - import DisplayObject = away.base.DisplayObject; - import LoaderInfo = away.base.LoaderInfo; - import AssetEvent = away.events.AssetEvent; - import EventDispatcher = away.events.EventDispatcher; - import IOErrorEvent = away.events.IOErrorEvent; - import LoaderEvent = away.events.LoaderEvent; - import ParserEvent = away.events.ParserEvent; - import AssetLoader = away.library.AssetLoader; - import AssetLoaderContext = away.library.AssetLoaderContext; - import AssetLoaderToken = away.library.AssetLoaderToken; - import ParserBase = away.parsers.ParserBase; - import URLRequest = away.net.URLRequest; - /** - * Dispatched when any asset finishes parsing. Also see specific events for each - * individual asset type (meshes, materials et c.) - * - * @eventType away3d.events.AssetEvent - */ - //[Event(name="assetComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when a full resource (including dependencies) finishes loading. - * - * @eventType away3d.events.LoaderEvent - */ - //[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] - - export class Loader extends DisplayObjectContainer - { - private _loadingSessions:Array; - private _useAssetLib:boolean; - private _assetLibId:string; - private _onResourceCompleteDelegate:Function; - private _onAssetCompleteDelegate:Function; - - private _content:DisplayObject; - private _contentLoaderInfo:LoaderInfo; - - /** - * Contains the root display object of the SWF file or image(JPG, PNG, or - * GIF) file that was loaded by using the load() or - * loadBytes() methods. - * - * @throws SecurityError The loaded SWF file or image file belongs to a - * security sandbox to which you do not have access. - * For a loaded SWF file, you can avoid this situation - * by having the file call the - * Security.allowDomain() method or by - * having the loading file specify a - * loaderContext parameter with its - * securityDomain property set to - * SecurityDomain.currentDomain when you - * call the load() or - * loadBytes() method. - */ - public get content():DisplayObject - { - return this._content; - } - - /** - * Returns a LoaderInfo object corresponding to the object being loaded. - * LoaderInfo objects are shared between the Loader object and the loaded - * content object. The LoaderInfo object supplies loading progress - * information and statistics about the loaded file. - * - *

Events related to the load are dispatched by the LoaderInfo object - * referenced by the contentLoaderInfo property of the Loader - * object. The contentLoaderInfo property is set to a valid - * LoaderInfo object, even before the content is loaded, so that you can add - * event listeners to the object prior to the load.

- * - *

To detect uncaught errors that happen in a loaded SWF, use the - * Loader.uncaughtErrorEvents property, not the - * Loader.contentLoaderInfo.uncaughtErrorEvents property.

- */ - public get contentLoaderInfo():LoaderInfo - { - return this._contentLoaderInfo; - } - - /** - * Creates a Loader object that you can use to load files, such as SWF, JPEG, - * GIF, or PNG files. Call the load() method to load the asset - * as a child of the Loader instance. You can then add the Loader object to - * the display list(for instance, by using the addChild() - * method of a DisplayObjectContainer instance). The asset appears on the - * Stage as it loads. - * - *

You can also use a Loader instance "offlist," that is without adding it - * to a display object container on the display list. In this mode, the - * Loader instance might be used to load a SWF file that contains additional - * modules of an application.

- * - *

To detect when the SWF file is finished loading, you can use the events - * of the LoaderInfo object associated with the - * contentLoaderInfo property of the Loader object. At that - * point, the code in the module SWF file can be executed to initialize and - * start the module. In the offlist mode, a Loader instance might also be - * used to load a SWF file that contains components or media assets. Again, - * you can use the LoaderInfo object event notifications to detect when the - * components are finished loading. At that point, the application can start - * using the components and media assets in the library of the SWF file by - * instantiating the ActionScript 3.0 classes that represent those components - * and assets.

- * - *

To determine the status of a Loader object, monitor the following - * events that the LoaderInfo object associated with the - * contentLoaderInfo property of the Loader object:

- * - *
    - *
  • The open event is dispatched when loading begins.
  • - *
  • The ioError or securityError event is - * dispatched if the file cannot be loaded or if an error occured during the - * load process.
  • - *
  • The progress event fires continuously while the file is - * being loaded.
  • - *
  • The complete event is dispatched when a file completes - * downloading, but before the loaded movie clip's methods and properties are - * available.
  • - *
  • The init event is dispatched after the properties and - * methods of the loaded SWF file are accessible, so you can begin - * manipulating the loaded SWF file. This event is dispatched before the - * complete handler. In streaming SWF files, the - * init event can occur significantly earlier than the - * complete event. For most purposes, use the init - * handler.
  • - *
- */ - constructor(useAssetLibrary:boolean = true, assetLibraryId:string = null) - { - super(); - - this._loadingSessions = new Array(); - this._useAssetLib = useAssetLibrary; - this._assetLibId = assetLibraryId; - - this._onResourceCompleteDelegate = away.utils.Delegate.create(this, this.onResourceComplete); - this._onAssetCompleteDelegate = away.utils.Delegate.create(this, this.onAssetComplete); - } - - /** - * Cancels a load() method operation that is currently in - * progress for the Loader instance. - * - */ - public close() - { - if (this._useAssetLib) { - var lib:away.library.AssetLibraryBundle; - lib = away.library.AssetLibraryBundle.getInstance(this._assetLibId); - lib.stopAllLoadingSessions(); - this._loadingSessions = null; - return - } - var i:number /*int*/; - var length:number /*int*/ = this._loadingSessions.length; - for (i = 0; i < length; i++) { - this.removeListeners(this._loadingSessions[i]); - this._loadingSessions[i].stop(); - this._loadingSessions[i] = null; - } - this._loadingSessions = null; - } - - /** - * Loads a SWF, JPEG, progressive JPEG, unanimated GIF, or PNG file into an - * object that is a child of this Loader object. If you load an animated GIF - * file, only the first frame is displayed. As the Loader object can contain - * only a single child, issuing a subsequent load() request - * terminates the previous request, if still pending, and commences a new - * load. - * - *

Note: In AIR 1.5 and Flash Player 10, the maximum size for a - * loaded image is 8,191 pixels in width or height, and the total number of - * pixels cannot exceed 16,777,215 pixels.(So, if an loaded image is 8,191 - * pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 and - * earlier and AIR 1.1 and earlier, the limitation is 2,880 pixels in height - * and 2,880 pixels in width.

- * - *

A SWF file or image loaded into a Loader object inherits the position, - * rotation, and scale properties of the parent display objects of the Loader - * object.

- * - *

Use the unload() method to remove movies or images loaded - * with this method, or to cancel a load operation that is in progress.

- * - *

You can prevent a SWF file from using this method by setting the - * allowNetworking parameter of the the object and - * embed tags in the HTML page that contains the SWF - * content.

- * - *

When you use this method, consider the Flash Player security model, - * which is described in the Loader class description.

- * - *

In Flash Player 10 and later, if you use a multipart Content-Type(for - * example "multipart/form-data") that contains an upload(indicated by a - * "filename" parameter in a "content-disposition" header within the POST - * body), the POST operation is subject to the security rules applied to - * uploads:

- * - *
    - *
  • The POST operation must be performed in response to a user-initiated - * action, such as a mouse click or key press.
  • - *
  • If the POST operation is cross-domain(the POST target is not on the - * same server as the SWF file that is sending the POST request), the target - * server must provide a URL policy file that permits cross-domain - * access.
  • - *
- * - *

Also, for any multipart Content-Type, the syntax must be valid - * (according to the RFC2046 standard). If the syntax appears to be invalid, - * the POST operation is subject to the security rules applied to - * uploads.

- * - *

For more information related to security, see the Flash Player - * Developer Center Topic: Security.

- * - * @param request The absolute or relative URL of the SWF, JPEG, GIF, or PNG - * file to be loaded. A relative path must be relative to the - * main SWF file. Absolute URLs must include the protocol - * reference, such as http:// or file:///. Filenames cannot - * include disk drive specifications. - * @param context A LoaderContext object, which has properties that define - * the following: - *
    - *
  • Whether or not to check for the existence of a policy - * file upon loading the object
  • - *
  • The ApplicationDomain for the loaded object
  • - *
  • The SecurityDomain for the loaded object
  • - *
  • The ImageDecodingPolicy for the loaded image - * object
  • - *
- * - *

If the context parameter is not specified - * or refers to a null object, the loaded content remains in - * its own security domain.

- * - *

For complete details, see the description of the - * properties in the LoaderContext - * class.

- * @param ns An optional namespace string under which the file is to be - * loaded, allowing the differentiation of two resources with - * identical assets. - * @param parser An optional parser object for translating the loaded data - * into a usable resource. If not provided, AssetLoader will - * attempt to auto-detect the file type. - * @throws IOError The digest property of the - * request object is not - * null. You should only set the - * digest property of a URLRequest - * object when calling the - * URLLoader.load() method when - * loading a SWZ file(an Adobe platform - * component). - * @throws IllegalOperationError If the requestedContentParent - * property of the context - * parameter is a Loader. - * @throws IllegalOperationError If the LoaderContext.parameters - * parameter is set to non-null and has some - * values which are not Strings. - * @throws SecurityError The value of - * LoaderContext.securityDomain - * must be either null or - * SecurityDomain.currentDomain. - * This reflects the fact that you can only - * place the loaded media in its natural - * security sandbox or your own(the latter - * requires a policy file). - * @throws SecurityError Local SWF files may not set - * LoaderContext.securityDomain to anything - * other than null. It is not - * permitted to import non-local media into a - * local sandbox, or to place other local media - * in anything other than its natural sandbox. - * @throws SecurityError You cannot connect to commonly reserved - * ports. For a complete list of blocked ports, - * see "Restricting Networking APIs" in the - * ActionScript 3.0 Developer's Guide. - * @throws SecurityError If the applicationDomain or - * securityDomain properties of - * the context parameter are from - * a disallowed domain. - * @throws SecurityError If a local SWF file is attempting to use the - * securityDomain property of the - * context parameter. - * @event asyncError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and it is not possible to - * add the loaded content as a child to the specified - * DisplayObjectContainer. This could happen if the - * loaded content is a - * flash.display.AVM1Movie or if the - * addChild() call to the - * requestedContentParent throws an error. - * @event complete Dispatched by the contentLoaderInfo - * object when the file has completed loading. The - * complete event is always dispatched - * after the init event. - * @event httpStatus Dispatched by the contentLoaderInfo - * object when a network request is made over HTTP and - * Flash Player can detect the HTTP status code. - * @event init Dispatched by the contentLoaderInfo - * object when the properties and methods of the loaded - * SWF file are accessible. The init event - * always precedes the complete event. - * @event ioError Dispatched by the contentLoaderInfo - * object when an input or output error occurs that - * causes a load operation to fail. - * @event open Dispatched by the contentLoaderInfo - * object when the loading operation starts. - * @event progress Dispatched by the contentLoaderInfo - * object as data is received while load operation - * progresses. - * @event securityError Dispatched by the contentLoaderInfo - * object if a SWF file in the local-with-filesystem - * sandbox attempts to load content in the - * local-with-networking sandbox, or vice versa. - * @event securityError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and the security sandbox - * of the - * LoaderContext.requestedContentParent - * does not have access to the loaded SWF. - * @event unload Dispatched by the contentLoaderInfo - * object when a loaded object is removed. - */ - public load(request:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken - { - var token:AssetLoaderToken; - - if (this._useAssetLib) { - var lib:away.library.AssetLibraryBundle; - lib = away.library.AssetLibraryBundle.getInstance(this._assetLibId); - token = lib.load(request, context, ns, parser); - } else { - var loader:AssetLoader = new AssetLoader(); - this._loadingSessions.push(loader); - token = loader.load(request, context, ns, parser); - } - - token.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - // Error are handled separately (see documentation for addErrorHandler) - token._iLoader._iAddErrorHandler(this.onLoadError); - token._iLoader._iAddParseErrorHandler(this.onParseError); - - return token; - } - - /** - * Loads from binary data stored in a ByteArray object. - * - *

The loadBytes() method is asynchronous. You must wait for - * the "init" event before accessing the properties of a loaded object.

- * - *

When you use this method, consider the Flash Player security model, - * which is described in the Loader class description.

- * - * @param bytes A ByteArray object. The contents of the ByteArray can be - * any of the file formats supported by the Loader class: SWF, - * GIF, JPEG, or PNG. - * @param context A LoaderContext object. Only the - * applicationDomain property of the - * LoaderContext object applies; the - * checkPolicyFile and - * securityDomain properties of the LoaderContext - * object do not apply. - * - *

If the context parameter is not specified - * or refers to a null object, the content is loaded into the - * current security domain - a process referred to as "import - * loading" in Flash Player security documentation. - * Specifically, if the loading SWF file trusts the remote SWF - * by incorporating the remote SWF into its code, then the - * loading SWF can import it directly into its own security - * domain.

- * - *

For more information related to security, see the Flash - * Player Developer Center Topic: Security.

- * @throws ArgumentError If the length property of the - * ByteArray object is not greater than 0. - * @throws IllegalOperationError If the checkPolicyFile or - * securityDomain property of the - * context parameter are non-null. - * @throws IllegalOperationError If the requestedContentParent - * property of the context - * parameter is a Loader. - * @throws IllegalOperationError If the LoaderContext.parameters - * parameter is set to non-null and has some - * values which are not Strings. - * @throws SecurityError If the provided - * applicationDomain property of - * the context property is from a - * disallowed domain. - * @throws SecurityError You cannot connect to commonly reserved - * ports. For a complete list of blocked ports, - * see "Restricting Networking APIs" in the - * ActionScript 3.0 Developer's Guide. - * @event asyncError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and it is not possible to - * add the loaded content as a child to the specified - * DisplayObjectContainer. This could happen if the - * loaded content is a - * flash.display.AVM1Movie or if the - * addChild() call to the - * requestedContentParent throws an error. - * @event complete Dispatched by the contentLoaderInfo - * object when the operation is complete. The - * complete event is always dispatched - * after the init event. - * @event init Dispatched by the contentLoaderInfo - * object when the properties and methods of the loaded - * data are accessible. The init event - * always precedes the complete event. - * @event ioError Dispatched by the contentLoaderInfo - * object when the runtime cannot parse the data in the - * byte array. - * @event open Dispatched by the contentLoaderInfo - * object when the operation starts. - * @event progress Dispatched by the contentLoaderInfo - * object as data is transfered in memory. - * @event securityError Dispatched by the contentLoaderInfo - * object if the - * LoaderContext.requestedContentParent - * property has been specified and the security sandbox - * of the - * LoaderContext.requestedContentParent - * does not have access to the loaded SWF. - * @event unload Dispatched by the contentLoaderInfo - * object when a loaded object is removed. - */ - public loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken - { - var token:AssetLoaderToken; - - if (this._useAssetLib) { - var lib:away.library.AssetLibraryBundle; - lib = away.library.AssetLibraryBundle.getInstance(this._assetLibId); - token = lib.loadData(data, context, ns, parser); - } else { - var loader:AssetLoader = new AssetLoader(); - this._loadingSessions.push(loader); - token = loader.loadData(data, '', context, ns, parser); - } - - token.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - // Error are handled separately (see documentation for addErrorHandler) - token._iLoader._iAddErrorHandler(this.onLoadError); - token._iLoader._iAddParseErrorHandler(this.onParseError); - - return token; - } - - /** - * Removes a child of this Loader object that was loaded by using the - * load() method. The property of the associated - * LoaderInfo object is reset to null. The child is not - * necessarily destroyed because other objects might have references to it; - * however, it is no longer a child of the Loader object. - * - *

As a best practice, before you unload a child SWF file, you should - * explicitly close any streams in the child SWF file's objects, such as - * LocalConnection, NetConnection, NetStream, and Sound objects. Otherwise, - * audio in the child SWF file might continue to play, even though the child - * SWF file was unloaded. To close streams in the child SWF file, add an - * event listener to the child that listens for the unload - * event. When the parent calls Loader.unload(), the - * unload event is dispatched to the child. The following code - * shows how you might do this:

- *
 public closeAllStreams(evt:Event) {
-		 * myNetStream.close(); mySound.close(); myNetConnection.close();
-		 * myLocalConnection.close(); }
-		 * myMovieClip.loaderInfo.addEventListener(Event.UNLOAD,
-		 * closeAllStreams);
- * - */ - public unload() - { - //TODO - } - - /** - * Enables a specific parser. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parserClass The parser class to enable. - * @see away.parsers.Parsers - */ - public static enableParser(parserClass:Object):void - { - AssetLoader.enableParser(parserClass); - } - - /** - * Enables a list of parsers. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parserClasses A Vector of parser classes to enable. - * @see away.parsers.Parsers - */ - public static enableParsers(parserClasses:Array):void - { - AssetLoader.enableParsers(parserClasses); - } - - - private removeListeners(dispatcher:EventDispatcher):void - { - dispatcher.removeEventListener(LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - dispatcher.removeEventListener(AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - } - - private onAssetComplete(event:AssetEvent):void - { - this.dispatchEvent(event); - } - - /** - * Called when an error occurs during loading - */ - private onLoadError(event:LoaderEvent):boolean - { - if (this.hasEventListener(IOErrorEvent.IO_ERROR)) { - this.dispatchEvent(event); - return true; - } else { - return false; - } - } - - /** - * Called when a an error occurs during parsing - */ - private onParseError(event:ParserEvent):boolean - { - if (this.hasEventListener(ParserEvent.PARSE_ERROR)) { - this.dispatchEvent(event); - return true; - } else { - return false; - } - } - - /** - * Called when the resource and all of its dependencies was retrieved. - */ - private onResourceComplete(event:LoaderEvent) - { - var content:DisplayObject = event.content; - - this._content = content; - - if (content) - this.addChild(content); - - this.dispatchEvent(event); - } - } -} diff --git a/src/away/containers/Scene.ts b/src/away/containers/Scene.ts deleted file mode 100644 index 025ec378..00000000 --- a/src/away/containers/Scene.ts +++ /dev/null @@ -1,135 +0,0 @@ -/// - -module away.containers -{ - import DisplayObject = away.base.DisplayObject; - import DisplayObjectContainer = away.containers.DisplayObjectContainer; - import SceneEvent = away.events.SceneEvent; - import NodeBase = away.partition.NodeBase; - import Partition = away.partition.Partition; - import ICollector = away.traverse.ICollector; - - export class Scene extends away.events.EventDispatcher - { - private _expandedPartitions:Array = new Array(); - private _partitions:Array = new Array(); - - public _iSceneGraphRoot:DisplayObjectContainer; - public _iCollectionMark = 0; - - constructor() - { - super(); - - this._iSceneGraphRoot = new DisplayObjectContainer(); - - this._iSceneGraphRoot._iSetScene(this); - this._iSceneGraphRoot._iIsRoot = true; - this._iSceneGraphRoot.partition = new Partition(new NodeBase()); - } - - public traversePartitions(traverser:ICollector) - { - var i:number = 0; - var len:number = this._partitions.length; - - traverser.scene = this; - - while (i < len) { - this._iCollectionMark++; - this._partitions[i++].traverse(traverser); - } - } - - public get partition():Partition - { - return this._iSceneGraphRoot.partition; - } - - public set partition(value:Partition) - { - this._iSceneGraphRoot.partition = value; - - this.dispatchEvent(new SceneEvent(SceneEvent.PARTITION_CHANGED, this._iSceneGraphRoot)); - } - - public contains(child:DisplayObject):boolean - { - return this._iSceneGraphRoot.contains(child); - } - - public addChild(child:DisplayObject):DisplayObject - { - return this._iSceneGraphRoot.addChild(child); - } - - public removeChild(child:DisplayObject) - { - this._iSceneGraphRoot.removeChild(child); - } - - public removeChildAt(index:number) - { - this._iSceneGraphRoot.removeChildAt(index); - } - - - public getChildAt(index:number):DisplayObject - { - return this._iSceneGraphRoot.getChildAt(index); - } - - public get numChildren():number - { - return this._iSceneGraphRoot.numChildren; - } - - /** - * @internal - */ - public iRegisterEntity(displayObject:DisplayObject) - { - if (displayObject.partition) - this.iRegisterPartition(displayObject.partition); - - if (displayObject.isEntity) - displayObject._iAssignedPartition.iMarkForUpdate(displayObject); - } - - /** - * @internal - */ - public iRegisterPartition(partition:Partition) - { - this._expandedPartitions.push(partition); - - //ensure duplicates are not found in partitions array - if (this._partitions.indexOf(partition) == -1) - this._partitions.push(partition); - } - - /** - * @internal - */ - public iUnregisterEntity(displayObject:DisplayObject) - { - if (displayObject.partition) - this.iUnregisterPartition(displayObject.partition); - - if (displayObject.isEntity) - displayObject._iAssignedPartition.iRemoveEntity(displayObject); - } - - /** - * @internal - */ - public iUnregisterPartition(partition:Partition) - { - this._expandedPartitions.splice(this._expandedPartitions.indexOf(partition), 1); - - //if no more partition references found, remove from partitions array - if (this._expandedPartitions.indexOf(partition) == -1) - this._partitions.splice(this._partitions.indexOf(partition), 1); - } - } -} \ No newline at end of file diff --git a/src/away/containers/View.ts b/src/away/containers/View.ts deleted file mode 100644 index 27f5c706..00000000 --- a/src/away/containers/View.ts +++ /dev/null @@ -1,599 +0,0 @@ -/// - -module away.containers -{ - import Scene = away.containers.Scene; - import Camera = away.entities.Camera; - import CameraEvent = away.events.CameraEvent; - import SceneEvent = away.events.SceneEvent; - import RendererEvent = away.events.RendererEvent; - import Matrix3D = away.geom.Matrix3D; - import Point = away.geom.Point; - import Rectangle = away.geom.Rectangle; - import Vector3D = away.geom.Vector3D; - import MouseManager = away.managers.MouseManager; - import IPicker = away.pick.IPicker; - import PickingCollisionVO = away.pick.PickingCollisionVO; - import RaycastPicker = away.pick.RaycastPicker; - import IRenderer = away.render.IRenderer; - import CSSRendererBase = away.render.CSSRendererBase; - import ICollector = away.traverse.ICollector; - import Delegate = away.utils.Delegate; - - - export class View - { - - /* - ************************************************************************************************************************* - * Development Notes - ************************************************************************************************************************* - * - * ShareContext - this is not being used at the moment integration with other frameworks is not yet implemented or tested - * and ( _localPos / _globalPos ) position of viewport are the same for the moment - * - * Background - * - this is currently not being included in our tests and is currently disabled - * - ************************************************************************************************************************** - */ - - // Protected - public _pScene:Scene; - public _pCamera:Camera; - public _pEntityCollector:ICollector; - public _pRenderer:IRenderer; - - // Private - private _aspectRatio:number; - private _width:number = 0; - private _height:number = 0; - - private _time:number = 0; - private _deltaTime:number = 0; - private _backgroundColor:number = 0x000000; - private _backgroundAlpha:number = 1; - - private _viewportDirty:boolean = true; - private _scissorDirty:boolean = true; - - private _onScenePartitionChangedDelegate; - private _onProjectionChangedDelegate; - private _onViewportUpdatedDelegate; - private _onScissorUpdatedDelegate; - private _mouseManager:MouseManager; - private _mousePicker:IPicker = new RaycastPicker(); - - private _htmlElement:HTMLDivElement; - private _shareContext:boolean; - public _pMouseX:number; - public _pMouseY:number; - - /* - *********************************************************************** - * Disabled / Not yet implemented - *********************************************************************** - * - * private _background:away.textures.Texture2DBase; - * - * public _pTouch3DManager:away.managers.Touch3DManager; - * - */ - constructor(renderer:IRenderer, scene:Scene = null, camera:Camera = null) - { - this._onScenePartitionChangedDelegate = Delegate.create(this, this.onScenePartitionChanged); - this._onProjectionChangedDelegate = Delegate.create(this, this.onProjectionChanged); - this._onViewportUpdatedDelegate = Delegate.create(this, this.onViewportUpdated); - this._onScissorUpdatedDelegate = Delegate.create(this, this.onScissorUpdated); - - this.scene = scene || new Scene(); - this.camera = camera || new Camera(); - this.renderer = renderer; - - //make sure document border is zero - document.body.style.margin = "0px"; - - this._htmlElement = document.createElement("div"); - this._htmlElement.style.position = "absolute"; - - document.body.appendChild(this._htmlElement); - - this._mouseManager = MouseManager.getInstance(); - this._mouseManager.registerView(this); - -// if (this._shareContext) -// this._mouse3DManager.addViewLayer(this); - } - - /** - * - * @param e - */ - private onScenePartitionChanged(e:SceneEvent) - { - if (this._pCamera) - this._pCamera.partition = this.scene.partition; - } - - public layeredView:boolean; //TODO: something to enable this correctly - - public get mouseX():number - { - return this._pMouseX; - } - - public get mouseY():number - { - return this._pMouseY; - } - - /** - * - */ - public get htmlElement():HTMLDivElement - { - return this._htmlElement; - } - /** - * - */ - public get renderer():IRenderer - { - return this._pRenderer; - } - - public set renderer(value:IRenderer) - { - if (this._pRenderer == value) - return; - - if (this._pRenderer) { - this._pRenderer.dispose(); - this._pRenderer.removeEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); - this._pRenderer.removeEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); - } - - this._pRenderer = value; - - this._pRenderer.addEventListener(RendererEvent.VIEWPORT_UPDATED, this._onViewportUpdatedDelegate); - this._pRenderer.addEventListener(RendererEvent.SCISSOR_UPDATED, this._onScissorUpdatedDelegate); - - //reset entity collector - this._pEntityCollector = this._pRenderer._iCreateEntityCollector(); - - if (this._pCamera) - this._pEntityCollector.camera = this._pCamera; - - //reset back buffer - this._pRenderer._iBackgroundR = ((this._backgroundColor >> 16) & 0xff)/0xff; - this._pRenderer._iBackgroundG = ((this._backgroundColor >> 8) & 0xff)/0xff; - this._pRenderer._iBackgroundB = (this._backgroundColor & 0xff)/0xff; - this._pRenderer._iBackgroundAlpha = this._backgroundAlpha; - this._pRenderer.width = this._width; - this._pRenderer.height = this._height; - this._pRenderer.shareContext = this._shareContext; - } - - /** - * - */ - public get shareContext():boolean - { - return this._shareContext; - } - - public set shareContext(value:boolean) - { - if (this._shareContext == value) - return; - - this._shareContext = value; - - if (this._pRenderer) - this._pRenderer.shareContext = this._shareContext; - } - - /** - * - */ - public get backgroundColor():number - { - return this._backgroundColor; - } - - public set backgroundColor(value:number) - { - if (this._backgroundColor == value) - return; - - this._backgroundColor = value; - - this._pRenderer._iBackgroundR = ((value >> 16) & 0xff)/0xff; - this._pRenderer._iBackgroundG = ((value >> 8) & 0xff)/0xff; - this._pRenderer._iBackgroundB = (value & 0xff)/0xff; - } - - /** - * - * @returns {number} - */ - public get backgroundAlpha():number - { - return this._backgroundAlpha; - } - - /** - * - * @param value - */ - public set backgroundAlpha(value:number) - { - if (value > 1) - value = 1; - else if (value < 0) - value = 0; - - if (this._backgroundAlpha == value) - return; - - this._pRenderer._iBackgroundAlpha = this._backgroundAlpha = value; - } - - /** - * - * @returns {Camera3D} - */ - public get camera():Camera - { - return this._pCamera; - } - - /** - * Set camera that's used to render the scene for this viewport - */ - public set camera(value:Camera) - { - if (this._pCamera == value) - return; - - if (this._pCamera) - this._pCamera.removeEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); - - this._pCamera = value; - - if (this._pEntityCollector) - this._pEntityCollector.camera = this._pCamera; - - if (this._pScene) - this._pCamera.partition = this._pScene.partition; - - this._pCamera.addEventListener(CameraEvent.PROJECTION_CHANGED, this._onProjectionChangedDelegate); - this._scissorDirty = true; - this._viewportDirty = true; - } - - /** - * - * @returns {away.containers.Scene3D} - */ - public get scene():Scene - { - return this._pScene; - } - - /** - * Set the scene that's used to render for this viewport - */ - public set scene(value:Scene) - { - if (this._pScene == value) - return; - - if (this._pScene) - this._pScene.removeEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); - - this._pScene = value; - - this._pScene.addEventListener(SceneEvent.PARTITION_CHANGED, this._onScenePartitionChangedDelegate); - - if (this._pCamera) - this._pCamera.partition = this._pScene.partition; - } - - /** - * - * @returns {number} - */ - public get deltaTime():number - { - return this._deltaTime; - } - - /** - * - */ - public get width():number - { - return this._width; - } - - public set width(value:number) - { - if (this._width == value) - return; - - this._width = value; - this._aspectRatio = this._width/this._height; - this._pCamera.projection._iAspectRatio = this._aspectRatio; - this._pRenderer.width = value; - this._htmlElement.style.width = value + "px"; - } - - /** - * - */ - public get height():number - { - return this._height; - } - - public set height(value:number) - { - if (this._height == value) - return; - - this._height = value; - this._aspectRatio = this._width/this._height; - this._pCamera.projection._iAspectRatio = this._aspectRatio; - this._pRenderer.height = value; - this._htmlElement.style.height = value + "px"; - } - - /** - * - */ - public get mousePicker():IPicker - { - return this._mousePicker; - } - - public set mousePicker(value:IPicker) - { - if (this._mousePicker == value) - return; - - if (value == null) - this._mousePicker = new RaycastPicker(); - else - this._mousePicker = value; - } - - /** - * - */ - public get x():number - { - return this._pRenderer.x; - } - - public set x(value:number) - { - if (this._pRenderer.x == value) - return; - - this._pRenderer.x == value; - this._htmlElement.style.left = value + "px"; - } - - /** - * - */ - public get y():number - { - return this._pRenderer.y; - } - - public set y(value:number) - { - if (this._pRenderer.y == value) - return; - - this._pRenderer.y == value; - this._htmlElement.style.top = value + "px"; - } - - /** - * - */ - public get visible():boolean - { - return (this._htmlElement.style.visibility == "visible"); - } - - public set visible(value:boolean) - { - this._htmlElement.style.visibility = value? "visible" : "hidden"; - //TODO transfer visible property to associated context (if one exists) - } - - /** - * - * @returns {number} - */ - public get renderedFacesCount():number - { - return 0; //TODO - //return this._pEntityCollector._pNumTriangles;//numTriangles; - } - - /** - * Renders the view. - */ - public render() - { - this.pUpdateTime(); - - //update view and size data - this._pCamera.projection._iAspectRatio = this._aspectRatio; - - if (this._scissorDirty) { - this._scissorDirty = false; - this._pCamera.projection._iUpdateScissorRect(this._pRenderer.scissorRect.x, this._pRenderer.scissorRect.y, this._pRenderer.scissorRect.width, this._pRenderer.scissorRect.height); - } - - if (this._viewportDirty) { - this._viewportDirty = false; - this._pCamera.projection._iUpdateViewport(this._pRenderer.viewPort.x, this._pRenderer.viewPort.y, this._pRenderer.viewPort.width, this._pRenderer.viewPort.height); - } - - // update picking - if (!this._shareContext) { - if (this.forceMouseMove && this._htmlElement == this._mouseManager._iActiveDiv && !this._mouseManager._iUpdateDirty) - this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); - - this._mouseManager.fireMouseEvents(this.forceMouseMove); - //_touch3DManager.fireTouchEvents(); - } - //_touch3DManager.updateCollider(); - - //clear entity collector ready for collection - this._pEntityCollector.clear(); - - // collect stuff to render - this._pScene.traversePartitions(this._pEntityCollector); - - //render the contents of the entity collector - this._pRenderer.render(this._pEntityCollector); - } - - /** - * - */ - public pUpdateTime():void - { - var time:number = away.utils.getTimer(); - - if (this._time == 0) - this._time = time; - - this._deltaTime = time - this._time; - this._time = time; - } - - /** - * - */ - public dispose() - { - this._pRenderer.dispose(); - - // TODO: imeplement mouseManager / touch3DManager - this._mouseManager.unregisterView(this); - - //this._touch3DManager.disableTouchListeners(this); - //this._touch3DManager.dispose(); - - this._mouseManager = null; - //this._touch3DManager = null; - - this._pRenderer = null; - this._pEntityCollector = null; - } - - /** - * - */ - public get iEntityCollector():ICollector - { - return this._pEntityCollector; - } - - /** - * - */ - private onProjectionChanged(event:CameraEvent) - { - this._scissorDirty = true; - this._viewportDirty = true; - } - - /** - * - */ - private onViewportUpdated(event:RendererEvent) - { - this._viewportDirty = true; - } - - /** - * - */ - private onScissorUpdated(event:RendererEvent) - { - this._scissorDirty = true; - } - - public project(point3d:Vector3D):Vector3D - { - var v:away.geom.Vector3D = this._pCamera.project(point3d); - v.x = v.x*this._pRenderer.viewPort.width/2 + this._width*this._pCamera.projection.originX; - v.y = v.y*this._pRenderer.viewPort.height/2 + this._height*this._pCamera.projection.originY; - - return v; - } - - public unproject(sX:number, sY:number, sZ:number):Vector3D - { - return this._pCamera.unproject(2*(sX - this._width*this._pCamera.projection.originX)/this._pRenderer.viewPort.width, 2*(sY - this._height*this._pCamera.projection.originY)/this._pRenderer.viewPort.height, sZ); - - } - - public getRay(sX:number, sY:number, sZ:number):Vector3D - { - return this._pCamera.getRay((sX*2 - this._width)/this._width, (sY*2 - this._height)/this._height, sZ); - } - - /* TODO: implement Touch3DManager - public get touchPicker():IPicker - { - return this._touch3DManager.touchPicker; - } - */ - /* TODO: implement Touch3DManager - public set touchPicker( value:IPicker) - { - this._touch3DManager.touchPicker = value; - } - */ - - public forceMouseMove:boolean; - - /*TODO: implement Background - public get background():away.textures.Texture2DBase - { - return this._background; - } - */ - /*TODO: implement Background - public set background( value:away.textures.Texture2DBase ) - { - this._background = value; - this._renderer.background = _background; - } - */ - - // TODO: required dependency stageGL - public updateCollider() - { - if (!this._shareContext) { - if (this._htmlElement == this._mouseManager._iActiveDiv) - this._mouseManager._iCollidingObject = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); - } else { - var collidingObject:PickingCollisionVO = this.mousePicker.getViewCollision(this._pMouseX, this._pMouseY, this); - - if (this.layeredView || this._mouseManager._iCollidingObject == null || collidingObject.rayEntryDistance < this._mouseManager._iCollidingObject.rayEntryDistance) - this._mouseManager._iCollidingObject = collidingObject; - } - } - } -} \ No newline at end of file diff --git a/src/away/controllers/ControllerBase.ts b/src/away/controllers/ControllerBase.ts deleted file mode 100644 index 2dc2156f..00000000 --- a/src/away/controllers/ControllerBase.ts +++ /dev/null @@ -1,74 +0,0 @@ -/// - -module away.controllers -{ - import DisplayObject = away.base.DisplayObject; - import AbstractMethodError = away.errors.AbstractMethodError; - - export class ControllerBase - { - - public _pAutoUpdate:boolean = true; - public _pTargetObject:DisplayObject; - - constructor(targetObject:DisplayObject = null) - { - this.targetObject = targetObject; - } - - public pNotifyUpdate() - { - if (this._pTargetObject && this._pTargetObject._iAssignedPartition && this._pAutoUpdate) { - this._pTargetObject._iAssignedPartition.iMarkForUpdate(this._pTargetObject); - } - } - - public get targetObject():DisplayObject - { - return this._pTargetObject; - } - - public set targetObject(val:DisplayObject) - { - if (this._pTargetObject == val) { - return; - } - - if (this._pTargetObject && this._pAutoUpdate) { - this._pTargetObject._iController = null; - } - this._pTargetObject = val; - - if (this._pTargetObject && this._pAutoUpdate) { - this._pTargetObject._iController = this; - } - this.pNotifyUpdate(); - } - - public get autoUpdate():boolean - { - return this._pAutoUpdate; - } - - public set autoUpdate(val:boolean) - { - if (this._pAutoUpdate == val) { - return; - } - this._pAutoUpdate = val; - - if (this._pTargetObject) { - if (this._pTargetObject) { - this._pTargetObject._iController = this; - } else { - this._pTargetObject._iController = null; - } - } - } - - public update(interpolate:boolean = true) - { - throw new AbstractMethodError(); - } - } -} \ No newline at end of file diff --git a/src/away/controllers/FirstPersonController.ts b/src/away/controllers/FirstPersonController.ts deleted file mode 100644 index f63c6b3e..00000000 --- a/src/away/controllers/FirstPersonController.ts +++ /dev/null @@ -1,258 +0,0 @@ -/// - -module away.controllers -{ - import DisplayObject = away.base.DisplayObject; - - /** - * Extended camera used to hover round a specified target object. - * - * @see away3d.containers.View3D - */ - export class FirstPersonController extends ControllerBase - { - public _iCurrentPanAngle:number = 0; - public _iCurrentTiltAngle:number = 90; - - private _panAngle:number = 0; - private _tiltAngle:number = 90; - private _minTiltAngle:number = -90; - private _maxTiltAngle:number = 90; - private _steps:number = 8; - private _walkIncrement:number = 0; - private _strafeIncrement:number = 0; - private _wrapPanAngle:boolean = false; - - public fly:boolean = false; - - /** - * Fractional step taken each time the hover() method is called. Defaults to 8. - * - * Affects the speed at which the tiltAngle and panAngle resolve to their targets. - * - * @see #tiltAngle - * @see #panAngle - */ - public get steps():number - { - return this._steps; - } - - public set steps(val:number) - { - val = (val < 1)? 1 : val; - - if (this._steps == val) - return; - - this._steps = val; - - this.pNotifyUpdate(); - } - - /** - * Rotation of the camera in degrees around the y axis. Defaults to 0. - */ - public get panAngle():number - { - return this._panAngle; - } - - public set panAngle(val:number) - { - if (this._panAngle == val) - return; - - this._panAngle = val; - - this.pNotifyUpdate(); - } - - /** - * Elevation angle of the camera in degrees. Defaults to 90. - */ - public get tiltAngle():number - { - return this._tiltAngle; - } - - public set tiltAngle(val:number) - { - val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); - - if (this._tiltAngle == val) - return; - - this._tiltAngle = val; - - this.pNotifyUpdate(); - } - - /** - * Minimum bounds for the tiltAngle. Defaults to -90. - * - * @see #tiltAngle - */ - public get minTiltAngle():number - { - return this._minTiltAngle; - } - - public set minTiltAngle(val:number) - { - if (this._minTiltAngle == val) - return; - - this._minTiltAngle = val; - - this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); - } - - /** - * Maximum bounds for the tiltAngle. Defaults to 90. - * - * @see #tiltAngle - */ - public get maxTiltAngle():number - { - return this._maxTiltAngle; - } - - public set maxTiltAngle(val:number) - { - if (this._maxTiltAngle == val) - return; - - this._maxTiltAngle = val; - - this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); - } - - - /** - * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. - */ - public get wrapPanAngle():boolean - { - return this._wrapPanAngle; - } - - public set wrapPanAngle(val:boolean) - { - if (this._wrapPanAngle == val) - return; - - this._wrapPanAngle = val; - - this.pNotifyUpdate(); - } - - /** - * Creates a new HoverController object. - */ - constructor(targetObject:DisplayObject = null, panAngle:number = 0, tiltAngle:number = 90, minTiltAngle:number = -90, maxTiltAngle:number = 90, steps:number = 8, wrapPanAngle:boolean = false) - { - super(targetObject); - - this.panAngle = panAngle; - this.tiltAngle = tiltAngle; - this.minTiltAngle = minTiltAngle; - this.maxTiltAngle = maxTiltAngle; - this.steps = steps; - this.wrapPanAngle = wrapPanAngle; - - //values passed in contrustor are applied immediately - this._iCurrentPanAngle = this._panAngle; - this._iCurrentTiltAngle = this._tiltAngle; - } - - /** - * Updates the current tilt angle and pan angle values. - * - * Values are calculated using the defined tiltAngle, panAngle and steps variables. - * - * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. - * - * @see #tiltAngle - * @see #panAngle - * @see #steps - */ - public update(interpolate:boolean = true) - { - if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { - - this.pNotifyUpdate(); - - if (this._wrapPanAngle) { - if (this._panAngle < 0) { - this._iCurrentPanAngle += this._panAngle%360 + 360 - this._panAngle; - this._panAngle = this._panAngle%360 + 360; - } else { - this._iCurrentPanAngle += this._panAngle%360 - this._panAngle; - this._panAngle = this._panAngle%360; - } - - while (this._panAngle - this._iCurrentPanAngle < -180) - this._iCurrentPanAngle -= 360; - - while (this._panAngle - this._iCurrentPanAngle > 180) - this._iCurrentPanAngle += 360; - } - - if (interpolate) { - this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle)/(this.steps + 1); - this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle)/(this.steps + 1); - } else { - this._iCurrentTiltAngle = this._tiltAngle; - this._iCurrentPanAngle = this._panAngle; - } - - //snap coords if angle differences are close - if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { - this._iCurrentTiltAngle = this._tiltAngle; - this._iCurrentPanAngle = this._panAngle; - } - } - - this.targetObject.rotationX = this._iCurrentTiltAngle; - this.targetObject.rotationY = this._iCurrentPanAngle; - - if (this._walkIncrement) { - if (this.fly) { - this.targetObject.transform.moveForward(this._walkIncrement); - } else { - this.targetObject.x += this._walkIncrement*Math.sin(this._panAngle*away.geom.MathConsts.DEGREES_TO_RADIANS); - this.targetObject.z += this._walkIncrement*Math.cos(this._panAngle*away.geom.MathConsts.DEGREES_TO_RADIANS); - } - this._walkIncrement = 0; - } - - if (this._strafeIncrement) { - this.targetObject.transform.moveRight(this._strafeIncrement); - this._strafeIncrement = 0; - } - - } - - public incrementWalk(val:number) - { - if (val == 0) - return; - - this._walkIncrement += val; - - this.pNotifyUpdate(); - } - - public incrementStrafe(val:number) - { - if (val == 0) - return; - - this._strafeIncrement += val; - - this.pNotifyUpdate(); - } - - } -} diff --git a/src/away/controllers/FollowController.ts b/src/away/controllers/FollowController.ts deleted file mode 100644 index a8deb661..00000000 --- a/src/away/controllers/FollowController.ts +++ /dev/null @@ -1,31 +0,0 @@ -/// - -module away.controllers -{ - import DisplayObject = away.base.DisplayObject; - - /** - * Controller used to follow behind an object on the XZ plane, with an optional - * elevation (tiltAngle). - * - * @see away3d.containers.View3D - */ - export class FollowController extends HoverController - { - constructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, tiltAngle:number = 45, distance:number = 700) - { - super(targetObject, lookAtObject, 0, tiltAngle, distance); - } - - public update(interpolate:boolean = true) - { - interpolate = interpolate; // unused: prevents warning - - if (!this.lookAtObject) - return; - - this.panAngle = this._pLookAtObject.rotationY - 180; - super.update(); - } - } -} diff --git a/src/away/controllers/HoverController.ts b/src/away/controllers/HoverController.ts deleted file mode 100644 index e31e496a..00000000 --- a/src/away/controllers/HoverController.ts +++ /dev/null @@ -1,320 +0,0 @@ -/// - -module away.controllers -{ - import DisplayObject = away.base.DisplayObject; - import MathConsts = away.geom.MathConsts; - import Vector3D = away.geom.Vector3D; - - /** - * Extended camera used to hover round a specified target object. - * - * @see away.containers.View - */ - export class HoverController extends LookAtController - { - public _iCurrentPanAngle:number = 0; - public _iCurrentTiltAngle:number = 90; - - private _panAngle:number = 0; - private _tiltAngle:number = 90; - private _distance:number = 1000; - private _minPanAngle:number = -Infinity; - private _maxPanAngle:number = Infinity; - private _minTiltAngle:number = -90; - private _maxTiltAngle:number = 90; - private _steps:number = 8; - private _yFactor:number = 2; - private _wrapPanAngle:boolean = false; - private _upAxis:Vector3D = new Vector3D(); - - /** - * Fractional step taken each time the hover() method is called. Defaults to 8. - * - * Affects the speed at which the tiltAngle and panAngle resolve to their targets. - * - * @see #tiltAngle - * @see #panAngle - */ - public get steps():number - { - return this._steps; - } - - public set steps(val:number) - { - val = (val < 1)? 1 : val; - - if (this._steps == val) - return; - - this._steps = val; - - this.pNotifyUpdate(); - } - - /** - * Rotation of the camera in degrees around the y axis. Defaults to 0. - */ - public get panAngle():number - { - return this._panAngle; - } - - public set panAngle(val:number) - { - val = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, val)); - - if (this._panAngle == val) - return; - - this._panAngle = val; - - this.pNotifyUpdate(); - } - - /** - * Elevation angle of the camera in degrees. Defaults to 90. - */ - public get tiltAngle():number - { - return this._tiltAngle; - } - - public set tiltAngle(val:number) - { - val = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, val)); - - if (this._tiltAngle == val) - return; - - this._tiltAngle = val; - - this.pNotifyUpdate(); - } - - /** - * Distance between the camera and the specified target. Defaults to 1000. - */ - public get distance():number - { - return this._distance; - } - - public set distance(val:number) - { - if (this._distance == val) - return; - - this._distance = val; - - this.pNotifyUpdate(); - } - - /** - * Minimum bounds for the panAngle. Defaults to -Infinity. - * - * @see #panAngle - */ - public get minPanAngle():number - { - return this._minPanAngle; - } - - public set minPanAngle(val:number) - { - if (this._minPanAngle == val) - return; - - this._minPanAngle = val; - - this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); - } - - /** - * Maximum bounds for the panAngle. Defaults to Infinity. - * - * @see #panAngle - */ - public get maxPanAngle():number - { - return this._maxPanAngle; - } - - public set maxPanAngle(val:number) - { - if (this._maxPanAngle == val) - return; - - this._maxPanAngle = val; - - this.panAngle = Math.max(this._minPanAngle, Math.min(this._maxPanAngle, this._panAngle)); - } - - /** - * Minimum bounds for the tiltAngle. Defaults to -90. - * - * @see #tiltAngle - */ - public get minTiltAngle():number - { - return this._minTiltAngle; - } - - public set minTiltAngle(val:number) - { - if (this._minTiltAngle == val) - return; - - this._minTiltAngle = val; - - this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); - } - - /** - * Maximum bounds for the tiltAngle. Defaults to 90. - * - * @see #tiltAngle - */ - public get maxTiltAngle():number - { - return this._maxTiltAngle; - } - - public set maxTiltAngle(val:number) - { - if (this._maxTiltAngle == val) - return; - - this._maxTiltAngle = val; - - this.tiltAngle = Math.max(this._minTiltAngle, Math.min(this._maxTiltAngle, this._tiltAngle)); - } - - /** - * Fractional difference in distance between the horizontal camera orientation and vertical camera orientation. Defaults to 2. - * - * @see #distance - */ - public get yFactor():number - { - return this._yFactor; - } - - public set yFactor(val:number) - { - if (this._yFactor == val) - return; - - this._yFactor = val; - - this.pNotifyUpdate(); - } - - /** - * Defines whether the value of the pan angle wraps when over 360 degrees or under 0 degrees. Defaults to false. - */ - public get wrapPanAngle():boolean - { - return this._wrapPanAngle; - } - - public set wrapPanAngle(val:boolean) - { - if (this._wrapPanAngle == val) - return; - - this._wrapPanAngle = val; - - this.pNotifyUpdate(); - } - - /** - * Creates a new HoverController object. - */ - constructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, panAngle:number = 0, tiltAngle:number = 90, distance:number = 1000, minTiltAngle:number = -90, maxTiltAngle:number = 90, minPanAngle:number = null, maxPanAngle:number = null, steps:number = 8, yFactor:number = 2, wrapPanAngle:boolean = false) - { - super(targetObject, lookAtObject); - - this.distance = distance; - this.panAngle = panAngle; - this.tiltAngle = tiltAngle; - this.minPanAngle = ( minPanAngle != null )? minPanAngle : -Infinity; - this.maxPanAngle = ( maxPanAngle != null )? maxPanAngle : Infinity; - this.minTiltAngle = minTiltAngle; - this.maxTiltAngle = maxTiltAngle; - this.steps = steps; - this.yFactor = yFactor; - this.wrapPanAngle = wrapPanAngle; - - //values passed in contrustor are applied immediately - this._iCurrentPanAngle = this._panAngle; - this._iCurrentTiltAngle = this._tiltAngle; - } - - /** - * Updates the current tilt angle and pan angle values. - * - * Values are calculated using the defined tiltAngle, panAngle and steps variables. - * - * @param interpolate If the update to a target pan- or tiltAngle is interpolated. Default is true. - * - * @see #tiltAngle - * @see #panAngle - * @see #steps - */ - public update(interpolate:boolean = true) - { - if (this._tiltAngle != this._iCurrentTiltAngle || this._panAngle != this._iCurrentPanAngle) { - - this.pNotifyUpdate(); - - if (this._wrapPanAngle) { - if (this._panAngle < 0) { - this._iCurrentPanAngle += this._panAngle%360 + 360 - this._panAngle; - this._panAngle = this._panAngle%360 + 360; - } else { - this._iCurrentPanAngle += this._panAngle%360 - this._panAngle; - this._panAngle = this._panAngle%360; - } - - while (this._panAngle - this._iCurrentPanAngle < -180) - this._iCurrentPanAngle -= 360; - - while (this._panAngle - this._iCurrentPanAngle > 180) - this._iCurrentPanAngle += 360; - } - - if (interpolate) { - this._iCurrentTiltAngle += (this._tiltAngle - this._iCurrentTiltAngle)/(this.steps + 1); - this._iCurrentPanAngle += (this._panAngle - this._iCurrentPanAngle)/(this.steps + 1); - } else { - this._iCurrentPanAngle = this._panAngle; - this._iCurrentTiltAngle = this._tiltAngle; - } - - //snap coords if angle differences are close - if ((Math.abs(this.tiltAngle - this._iCurrentTiltAngle) < 0.01) && (Math.abs(this._panAngle - this._iCurrentPanAngle) < 0.01)) { - this._iCurrentTiltAngle = this._tiltAngle; - this._iCurrentPanAngle = this._panAngle; - } - } - - var pos:Vector3D = (this.lookAtObject)? this.lookAtObject.transform.position : (this.lookAtPosition)? this.lookAtPosition : this._pOrigin; - this.targetObject.x = pos.x + this.distance*Math.sin(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); - this.targetObject.y = pos.y + this.distance*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS)*this.yFactor; - this.targetObject.z = pos.z + this.distance*Math.cos(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); - - this._upAxis.x = -Math.sin(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); - this._upAxis.y = Math.cos(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); - this._upAxis.z = -Math.cos(this._iCurrentPanAngle*MathConsts.DEGREES_TO_RADIANS)*Math.sin(this._iCurrentTiltAngle*MathConsts.DEGREES_TO_RADIANS); - - if (this._pTargetObject) { - if (this._pLookAtPosition) - this._pTargetObject.lookAt(this._pLookAtPosition, this._upAxis); - else if (this._pLookAtObject) - this._pTargetObject.lookAt(this._pLookAtObject.scene? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position, this._upAxis); - } - } - } -} diff --git a/src/away/controllers/LookAtController.ts b/src/away/controllers/LookAtController.ts deleted file mode 100644 index ef1c92bc..00000000 --- a/src/away/controllers/LookAtController.ts +++ /dev/null @@ -1,86 +0,0 @@ -/// - -module away.controllers -{ - import DisplayObject = away.base.DisplayObject; - import DisplayObjectEvent = away.events.DisplayObjectEvent; - import Vector3D = away.geom.Vector3D; - - export class LookAtController extends ControllerBase - { - public _pLookAtPosition:Vector3D; - public _pLookAtObject:DisplayObject; - public _pOrigin:Vector3D = new Vector3D(0.0, 0.0, 0.0); - - private _onLookAtObjectChangedDelegate:Function; - - constructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null) - { - super(targetObject); - - this._onLookAtObjectChangedDelegate = away.utils.Delegate.create(this, this.onLookAtObjectChanged); - - if (lookAtObject) { - this.lookAtObject = lookAtObject; - } else { - this.lookAtPosition = new Vector3D(); - } - } - - public get lookAtPosition():Vector3D - { - return this._pLookAtPosition; - } - - public set lookAtPosition(val:Vector3D) - { - if (this._pLookAtObject) { - this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); - this._pLookAtObject = null; - } - - this._pLookAtPosition = val; - this.pNotifyUpdate(); - } - - public get lookAtObject():DisplayObject - { - return this._pLookAtObject; - } - - public set lookAtObject(val:DisplayObject) - { - if (this._pLookAtPosition) - this._pLookAtPosition = null; - - if (this._pLookAtObject == val) - return; - - if (this._pLookAtObject) - this._pLookAtObject.removeEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); - - this._pLookAtObject = val; - - if (this._pLookAtObject) - this._pLookAtObject.addEventListener(DisplayObjectEvent.SCENETRANSFORM_CHANGED, this._onLookAtObjectChangedDelegate); - - this.pNotifyUpdate(); - } - - //@override - public update(interpolate:boolean = true) - { - if (this._pTargetObject) { - if (this._pLookAtPosition) - this._pTargetObject.lookAt(this._pLookAtPosition); - else if (this._pLookAtObject) - this._pTargetObject.lookAt(this._pLookAtObject.scene? this._pLookAtObject.scenePosition : this._pLookAtObject.transform.position); - } - } - - private onLookAtObjectChanged(event:DisplayObjectEvent) - { - this.pNotifyUpdate(); - } - } -} \ No newline at end of file diff --git a/src/away/controllers/SpringController.ts b/src/away/controllers/SpringController.ts deleted file mode 100644 index 43fdf4a0..00000000 --- a/src/away/controllers/SpringController.ts +++ /dev/null @@ -1,93 +0,0 @@ -/// - -module away.controllers -{ - import DisplayObject = away.base.DisplayObject; - import Vector3D = away.geom.Vector3D; - - /** - * Uses spring physics to animate the target object towards a position that is - * defined as the lookAtTarget object's position plus the vector defined by the - * positionOffset property. - */ - export class SpringController extends LookAtController - { - private _velocity:Vector3D; - private _dv:Vector3D; - private _stretch:Vector3D; - private _force:Vector3D; - private _acceleration:Vector3D; - private _desiredPosition:Vector3D; - - /** - * Stiffness of the spring, how hard is it to extend. The higher it is, the more "fixed" the cam will be. - * A number between 1 and 20 is recommended. - */ - public stiffness:number; - - /** - * Damping is the spring internal friction, or how much it resists the "boinggggg" effect. Too high and you'll lose it! - * A number between 1 and 20 is recommended. - */ - public damping:number; - - /** - * Mass of the camera, if over 120 and it'll be very heavy to move. - */ - public mass:number; - - /** - * Offset of spring center from target in target object space, ie: Where the camera should ideally be in the target object space. - */ - public positionOffset:Vector3D = new Vector3D(0, 500, -1000); - - constructor(targetObject:DisplayObject = null, lookAtObject:DisplayObject = null, stiffness:number = 1, mass:number = 40, damping:number = 4) - { - super(targetObject, lookAtObject); - - this.stiffness = stiffness; - this.damping = damping; - this.mass = mass; - - this._velocity = new Vector3D(); - this._dv = new Vector3D(); - this._stretch = new Vector3D(); - this._force = new Vector3D(); - this._acceleration = new Vector3D(); - this._desiredPosition = new Vector3D(); - - } - - public update(interpolate:boolean = true) - { - var offs:Vector3D; - - if (!this._pLookAtObject || !this._pTargetObject) - return; - - offs = this._pLookAtObject.transform.matrix3D.deltaTransformVector(this.positionOffset); - this._desiredPosition.x = this._pLookAtObject.x + offs.x; - this._desiredPosition.y = this._pLookAtObject.y + offs.y; - this._desiredPosition.z = this._pLookAtObject.z + offs.z; - - this._stretch = this._pTargetObject.transform.position.add(this._desiredPosition); - this._stretch.scaleBy(-this.stiffness); - - this._dv.copyFrom(this._velocity); - this._dv.scaleBy(this.damping); - - this._force.x = this._stretch.x - this._dv.x; - this._force.y = this._stretch.y - this._dv.y; - this._force.z = this._stretch.z - this._dv.z; - - this._acceleration.copyFrom(this._force); - this._acceleration.scaleBy(1/this.mass); - - this._velocity.incrementBy(this._acceleration); - - this._pTargetObject.transform.position = this._pTargetObject.transform.position.add(this._velocity); - - super.update(); - } - } -} diff --git a/src/away/core/base/AlignmentMode.ts b/src/away/core/base/AlignmentMode.ts deleted file mode 100644 index 8d16470b..00000000 --- a/src/away/core/base/AlignmentMode.ts +++ /dev/null @@ -1,20 +0,0 @@ -/// - -/** - */ -module away.base -{ - - export class AlignmentMode - { - /** - * - */ - public static REGISTRATION_POINT:string = "registrationPoint"; - - /** - * - */ - public static PIVOT_POINT:string = "pivot"; - } -} \ No newline at end of file diff --git a/src/away/core/base/BitmapData.ts b/src/away/core/base/BitmapData.ts deleted file mode 100644 index 6023b8b5..00000000 --- a/src/away/core/base/BitmapData.ts +++ /dev/null @@ -1,624 +0,0 @@ -/// - -module away.base -{ - import ColorTransform = away.geom.ColorTransform; - import Matrix = away.geom.Matrix; - import Rectangle = away.geom.Rectangle; - import Point = away.geom.Point; - import ColorUtils = away.utils.ColorUtils; - - /** - * - */ - export class BitmapData - { - - private _imageCanvas:HTMLCanvasElement; - private _context:CanvasRenderingContext2D; - private _imageData:ImageData; - private _rect:Rectangle; - private _transparent:boolean; - private _alpha:number = 1; - private _locked:boolean = false; - - - /** - * - * @param width - * @param height - * @param transparent - * @param fillColor - */ - constructor(width:number, height:number, transparent:boolean = true, fillColor:number = null) - { - - this._transparent = transparent; - this._imageCanvas = document.createElement("canvas"); - this._imageCanvas.width = width; - this._imageCanvas.height = height; - this._context = this._imageCanvas.getContext("2d"); - this._rect = new Rectangle(0, 0, width, height); - - if (fillColor != null) { - - if (this._transparent) { - this._alpha = away.utils.ColorUtils.float32ColorToARGB(fillColor)[0]/255; - } else { - this._alpha = 1; - } - - this.fillRect(this._rect, fillColor); - - } - - } - - /** - * - */ - public dispose():void - { - this._context = null; - this._imageCanvas = null - this._imageData = null; - this._rect = null; - this._transparent = null; - this._locked = null; - } - - /** - * - */ - public lock():void - { - this._locked = true; - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - /** - * - */ - public unlock():void - { - this._locked = false; - - if (this._imageData) { - - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - this._imageData = null; - - } - } - - /** - * - * @param x - * @param y - * @param color - */ - public getPixel(x, y):number - { - - var r:number; - var g:number; - var b:number; - var a:number; - - if (!this._locked) { - var pixelData:ImageData = this._context.getImageData(x, y, 1, 1); - - r = pixelData.data[0]; - g = pixelData.data[1]; - b = pixelData.data[2]; - a = pixelData.data[3]; - - } else { - var index:number = (x + y*this._imageCanvas.width)*4; - - if (!this._imageData) - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - - r = this._imageData.data[index + 0]; - g = this._imageData.data[index + 1]; - b = this._imageData.data[index + 2]; - a = this._imageData.data[index + 3]; - - } - - if (!this._locked) { - this._imageData = null; - } - - return (a << 24) | (r << 16) | (g << 8) | b; - - } - - /** - * - * @param x - * @param y - * @param color - */ - public setPixel(x, y, color:number):void - { - - var argb:number[] = away.utils.ColorUtils.float32ColorToARGB(color); - - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var index:number = (x + y*this._imageCanvas.width)*4; - - this._imageData.data[index + 0] = argb[1]; - this._imageData.data[index + 1] = argb[2]; - this._imageData.data[index + 2] = argb[3]; - this._imageData.data[index + 3] = 255; - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - - } - - /** - * - * @param rect - * @param inputByteArray - */ - public setPixels(rect:Rectangle, inputByteArray:away.utils.ByteArray) - { - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - inputByteArray.position = 0; - var i:number /*uint*/, j:number /*uint*/, index:number /*uint*/; - for (i = 0; i < rect.width; ++i) { - for (j = 0; j < rect.height; ++j) { - index = (i + rect.x + (j + rect.y)*this._imageCanvas.width)*4; - - this._imageData.data[index + 0] = inputByteArray.readUnsignedInt(); - this._imageData.data[index + 1] = inputByteArray.readUnsignedInt(); - this._imageData.data[index + 2] = inputByteArray.readUnsignedInt(); - this._imageData.data[index + 3] = inputByteArray.readUnsignedInt(); - } - } - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - } - - /** - * - * @param x - * @param y - * @param color - */ - public setPixel32(x, y, color:number):void - { - - var argb:number[] = away.utils.ColorUtils.float32ColorToARGB(color); - - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var index:number = (x + y*this._imageCanvas.width)*4; - - this._imageData.data[index + 0] = argb[1]; - this._imageData.data[index + 1] = argb[2]; - this._imageData.data[index + 2] = argb[3]; - this._imageData.data[index + 3] = argb[0]; - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - - } - - public setVector(rect:Rectangle, inputVector:Array):void - { - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var i:number /*uint*/, j:number /*uint*/, index:number /*uint*/, argb:number[] /*uint*/; - for (i = 0; i < rect.width; ++i) { - for (j = 0; j < rect.height; ++j) { - argb = away.utils.ColorUtils.float32ColorToARGB(inputVector[i + j*rect.width]); - index = (i + rect.x + (j + rect.y)*this._imageCanvas.width)*4; - - this._imageData.data[index + 0] = argb[1]; - this._imageData.data[index + 1] = argb[2]; - this._imageData.data[index + 2] = argb[3]; - this._imageData.data[index + 3] = argb[0]; - } - } - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - } - - /** - * Copy an HTMLImageElement or BitmapData object - * - * @param img {BitmapData} / {HTMLImageElement} - * @param sourceRect - source rectange to copy from - * @param destRect - destinatoin rectange to copy to - */ - public drawImage(img:BitmapData, sourceRect:Rectangle, destRect:Rectangle); - - public drawImage(img:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle); - - public drawImage(img:any, sourceRect:Rectangle, destRect:Rectangle):void - { - - if (this._locked) { - // If canvas is locked: - // - // 1) copy image data back to canvas - // 2) draw object - // 3) read _imageData back out - - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - } - - this._drawImage(img, sourceRect, destRect); - - if (this._imageData) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - } else { - this._drawImage(img, sourceRect, destRect) - } - - } - - private _drawImage(img:BitmapData, sourceRect:Rectangle, destRect:Rectangle); - - private _drawImage(img:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle); - - private _drawImage(img:any, sourceRect:Rectangle, destRect:Rectangle):void - { - if (img instanceof away.base.BitmapData) { - this._context.drawImage(img.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); - } else if (img instanceof HTMLImageElement) { - this._context.drawImage(img, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); - } - } - - /** - * - * @param bmpd - * @param sourceRect - * @param destRect - */ - public copyPixels(bmpd:BitmapData, sourceRect:Rectangle, destRect:Rectangle) - - public copyPixels(bmpd:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle); - - public copyPixels(bmpd:any, sourceRect:Rectangle, destRect:Rectangle):void - { - - if (this._locked) { - - // If canvas is locked: - // - // 1) copy image data back to canvas - // 2) draw object - // 3) read _imageData back out - - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - } - - this._copyPixels(bmpd, sourceRect, destRect); - - if (this._imageData) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - } else { - this._copyPixels(bmpd, sourceRect, destRect); - } - - } - - private _copyPixels(bmpd:BitmapData, sourceRect:Rectangle, destRect:Rectangle) - - private _copyPixels(bmpd:HTMLImageElement, sourceRect:Rectangle, destRect:Rectangle); - - private _copyPixels(bmpd:any, sourceRect:Rectangle, destRect:Rectangle):void - { - - if (bmpd instanceof away.base.BitmapData) { - this._context.drawImage(bmpd.canvas, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); - } else if (bmpd instanceof HTMLImageElement) { - this._context.drawImage(bmpd, sourceRect.x, sourceRect.y, sourceRect.width, sourceRect.height, destRect.x, destRect.y, destRect.width, destRect.height); - } - - } - - /** - * - * @param rect - * @param color - */ - public fillRect(rect:Rectangle, color:number):void - { - - if (this._locked) { - - // If canvas is locked: - // - // 1) copy image data back to canvas - // 2) apply fill - // 3) read _imageData back out - - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - } - - this._context.fillStyle = this.hexToRGBACSS(color); - this._context.fillRect(rect.x, rect.y, rect.width, rect.height); - - if (this._imageData) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - } else { - this._context.fillStyle = this.hexToRGBACSS(color); - this._context.fillRect(rect.x, rect.y, rect.width, rect.height); - } - - - } - - /** - * - * @param source - * @param matrix - */ - public draw(source:BitmapData, matrix?:Matrix) - - public draw(source:HTMLImageElement, matrix?:Matrix) - - public draw(source:any, matrix?:Matrix):void - { - - if (this._locked) { - - // If canvas is locked: - // - // 1) copy image data back to canvas - // 2) draw object - // 3) read _imageData back out - - if (this._imageData) { - this._context.putImageData(this._imageData, 0, 0); // at coords 0,0 - } - - this._draw(source, matrix); - - if (this._imageData) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - } else { - this._draw(source, matrix); - } - - } - - private _draw(source:BitmapData, matrix:Matrix) - - private _draw(source:HTMLImageElement, matrix:Matrix) - - private _draw(source:any, matrix:Matrix):void - { - - if (source instanceof away.base.BitmapData) { - this._context.save(); - - if (matrix != null) - this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); - - this._context.drawImage(source.canvas, 0, 0) - this._context.restore(); - - } else if (source instanceof HTMLImageElement) { - this._context.save(); - - if (matrix != null) - this._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty); - - this._context.drawImage(source, 0, 0) - this._context.restore(); - } - - } - - public copyChannel(sourceBitmap:BitmapData, sourceRect:Rectangle, destPoint:Point, sourceChannel:number, destChannel:number):void - { - var imageData:ImageData = sourceBitmap.imageData; - - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var sourceData:Uint8Array = sourceBitmap.imageData.data; - var destData:Uint8Array = this._imageData.data; - - var sourceOffset:number = Math.round(Math.log(sourceChannel)/Math.log(2)); - var destOffset:number = Math.round(Math.log(destChannel)/Math.log(2)); - - var i:number /*uint*/, j:number /*uint*/, sourceIndex:number /*uint*/, destIndex:number /*uint*/; - for (i = 0; i < sourceRect.width; ++i) { - for (j = 0; j < sourceRect.height; ++j) { - sourceIndex = (i + sourceRect.x + (j + sourceRect.y)*sourceBitmap.width)*4; - destIndex = (i + destPoint.x + (j + destPoint.y)*this.width)*4; - - destData[destIndex + destOffset] = sourceData[sourceIndex + sourceOffset]; - } - } - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - } - - public colorTransform(rect:Rectangle, colorTransform:ColorTransform):void - { - if (!this._locked) { - this._imageData = this._context.getImageData(0, 0, this._rect.width, this._rect.height); - } - - if (this._imageData) { - var data:Uint8Array = this._imageData.data; - - var i:number /*uint*/, j:number /*uint*/, index:number /*uint*/; - for (i = 0; i < rect.width; ++i) { - for (j = 0; j < rect.height; ++j) { - index = (i + rect.x + (j + rect.y)*this.width)*4; - - data[index] = data[index]*colorTransform.redMultiplier + colorTransform.redOffset; - data[index + 1] = data[index + 1]*colorTransform.greenMultiplier + colorTransform.greenOffset; - data[index + 2] = data[index + 2]*colorTransform.blueMultiplier + colorTransform.blueOffset; - data[index + 3] = data[index + 3]*colorTransform.alphaMultiplier + colorTransform.alphaOffset; - } - } - } - - if (!this._locked) { - this._context.putImageData(this._imageData, 0, 0); - this._imageData = null; - } - } - - /** - * - * @param {ImageData} - */ - public set imageData(value:ImageData) - { - this._context.putImageData(value, 0, 0); - } - - /** - * - * @returns {ImageData} - */ - public get imageData():ImageData - { - return this._context.getImageData(0, 0, this._rect.width, this._rect.height) - } - - /** - * - * @returns {number} - */ - public get width():number - { - return this._imageCanvas.width; - } - - /** - * - * @param {number} - */ - public set width(value:number) - { - this._rect.width = value; - this._imageCanvas.width = value; - } - - /** - * - * @returns {number} - */ - public get height():number - { - return this._imageCanvas.height; - } - - /** - * - * @param {number} - */ - public set height(value:number) - { - this._rect.height = value; - this._imageCanvas.height = value; - } - - /** - * - * @param {Rectangle} - */ - public get rect():Rectangle - { - return this._rect; - } - - /** - * - * @returns {HTMLCanvasElement} - */ - public get canvas() - { - return this._imageCanvas; - } - - /** - * - * @returns {HTMLCanvasElement} - */ - public get context():CanvasRenderingContext2D - { - return this._context; - } - - // Private - - /** - * convert decimal value to Hex - */ - private hexToRGBACSS(d:number):string - { - - var argb:number[] = ColorUtils.float32ColorToARGB(d); - - if (this._transparent == false) { - - argb[0] = 1; - - return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0] + ')'; - - } - - return 'rgba(' + argb[1] + ',' + argb[2] + ',' + argb[3] + ',' + argb[0]/255 + ')'; - - } - } - - -} \ No newline at end of file diff --git a/src/away/core/base/BitmapDataChannel.ts b/src/away/core/base/BitmapDataChannel.ts deleted file mode 100644 index f339bf70..00000000 --- a/src/away/core/base/BitmapDataChannel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/// - -module away.base -{ - export class BitmapDataChannel - { - public static ALPHA:number /*uint*/ = 8; - public static BLUE:number /*uint*/ = 4; - public static GREEN:number /*uint*/ = 2; - public static RED:number /*uint*/ = 1; - } -} \ No newline at end of file diff --git a/src/away/core/base/BlendMode.ts b/src/away/core/base/BlendMode.ts deleted file mode 100644 index b62af96d..00000000 --- a/src/away/core/base/BlendMode.ts +++ /dev/null @@ -1,194 +0,0 @@ -/// - -/** - * A class that provides constant values for visual blend mode effects. These - * constants are used in the following: - *
    - *
  • The blendMode property of the - * flash.display.DisplayObject class.
  • - *
  • The blendMode parameter of the draw() - * method of the flash.display.BitmapData class
  • - *
- */ -module away.base -{ - - export class BlendMode - { - /** - * Adds the values of the constituent colors of the display object to the - * colors of its background, applying a ceiling of 0xFF. This setting is - * commonly used for animating a lightening dissolve between two objects. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xAAA633, and the background pixel has an RGB value of 0xDD2200, the - * resulting RGB value for the displayed pixel is 0xFFC833(because 0xAA + - * 0xDD > 0xFF, 0xA6 + 0x22 = 0xC8, and 0x33 + 0x00 = 0x33).

- */ - public static ADD:string = "add"; - - /** - * Applies the alpha value of each pixel of the display object to the - * background. This requires the blendMode property of the - * parent display object be set to - * away.base.BlendMode.LAYER. - * - *

Not supported under GPU rendering.

- */ - public static ALPHA:string = "alpha"; - - /** - * Selects the darker of the constituent colors of the display object and the - * colors of the background(the colors with the smaller values). This - * setting is commonly used for superimposing type. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the - * resulting RGB value for the displayed pixel is 0xDDCC00(because 0xFF > - * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

- * - *

Not supported under GPU rendering.

- */ - public static DARKEN:string = "darken"; - - /** - * Compares the constituent colors of the display object with the colors of - * its background, and subtracts the darker of the values of the two - * constituent colors from the lighter value. This setting is commonly used - * for more vibrant colors. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the - * resulting RGB value for the displayed pixel is 0x222C33(because 0xFF - - * 0xDD = 0x22, 0xF8 - 0xCC = 0x2C, and 0x33 - 0x00 = 0x33).

- */ - public static DIFFERENCE:string = "difference"; - - /** - * Erases the background based on the alpha value of the display object. This - * process requires that the blendMode property of the parent - * display object be set to flash.display.BlendMode.LAYER. - * - *

Not supported under GPU rendering.

- */ - public static ERASE:string = "erase"; - - /** - * Adjusts the color of each pixel based on the darkness of the display - * object. If the display object is lighter than 50% gray, the display object - * and background colors are screened, which results in a lighter color. If - * the display object is darker than 50% gray, the colors are multiplied, - * which results in a darker color. This setting is commonly used for shading - * effects. - * - *

Not supported under GPU rendering.

- */ - public static HARDLIGHT:string = "hardlight"; - - /** - * Inverts the background. - */ - public static INVERT:string = "invert"; - - /** - * Forces the creation of a transparency group for the display object. This - * means that the display object is precomposed in a temporary buffer before - * it is processed further. The precomposition is done automatically if the - * display object is precached by means of bitmap caching or if the display - * object is a display object container that has at least one child object - * with a blendMode setting other than "normal". - * - *

Not supported under GPU rendering.

- */ - public static LAYER:string = "layer"; - - /** - * Selects the lighter of the constituent colors of the display object and - * the colors of the background(the colors with the larger values). This - * setting is commonly used for superimposing type. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xFFCC33, and the background pixel has an RGB value of 0xDDF800, the - * resulting RGB value for the displayed pixel is 0xFFF833(because 0xFF > - * 0xDD, 0xCC < 0xF8, and 0x33 > 0x00 = 33).

- * - *

Not supported under GPU rendering.

- */ - public static LIGHTEN:string = "lighten"; - - /** - * Multiplies the values of the display object constituent colors by the - * constituent colors of the background color, and normalizes by dividing by - * 0xFF, resulting in darker colors. This setting is commonly used for - * shadows and depth effects. - * - *

For example, if a constituent color(such as red) of one pixel in the - * display object and the corresponding color of the pixel in the background - * both have the value 0x88, the multiplied result is 0x4840. Dividing by - * 0xFF yields a value of 0x48 for that constituent color, which is a darker - * shade than the color of the display object or the color of the - * background.

- */ - public static MULTIPLY:string = "multiply"; - - /** - * The display object appears in front of the background. Pixel values of the - * display object override the pixel values of the background. Where the - * display object is transparent, the background is visible. - */ - public static NORMAL:string = "normal"; - - /** - * Adjusts the color of each pixel based on the darkness of the background. - * If the background is lighter than 50% gray, the display object and - * background colors are screened, which results in a lighter color. If the - * background is darker than 50% gray, the colors are multiplied, which - * results in a darker color. This setting is commonly used for shading - * effects. - * - *

Not supported under GPU rendering.

- */ - public static OVERLAY:string = "overlay"; - - /** - * Multiplies the complement(inverse) of the display object color by the - * complement of the background color, resulting in a bleaching effect. This - * setting is commonly used for highlights or to remove black areas of the - * display object. - */ - public static SCREEN:string = "screen"; - - /** - * Uses a shader to define the blend between objects. - * - *

Setting the blendShader property to a Shader instance - * automatically sets the display object's blendMode property to - * BlendMode.SHADER. If the blendMode property is - * set to BlendMode.SHADER without first setting the - * blendShader property, the blendMode property is - * set to BlendMode.NORMAL instead. If the - * blendShader property is set(which sets the - * blendMode property to BlendMode.SHADER), then - * later the value of the blendMode property is changed, the - * blend mode can be reset to use the blend shader simply by setting the - * blendMode property to BlendMode.SHADER. The - * blendShader property does not need to be set again except to - * change the shader that's used to define the blend mode.

- * - *

Not supported under GPU rendering.

- */ - public static SHADER:string = "shader"; - - /** - * Subtracts the values of the constituent colors in the display object from - * the values of the background color, applying a floor of 0. This setting is - * commonly used for animating a darkening dissolve between two objects. - * - *

For example, if the display object has a pixel with an RGB value of - * 0xAA2233, and the background pixel has an RGB value of 0xDDA600, the - * resulting RGB value for the displayed pixel is 0x338400(because 0xDD - - * 0xAA = 0x33, 0xA6 - 0x22 = 0x84, and 0x00 - 0x33 < 0x00).

- */ - public static SUBTRACT:string = "subtract"; - } -} \ No newline at end of file diff --git a/src/away/core/base/CapsStyle.ts b/src/away/core/base/CapsStyle.ts deleted file mode 100644 index 6c84a6da..00000000 --- a/src/away/core/base/CapsStyle.ts +++ /dev/null @@ -1,32 +0,0 @@ -/// - -/** - * The CapsStyle class is an enumeration of constant values that specify the - * caps style to use in drawing lines. The constants are provided for use as - * values in the caps parameter of the - * flash.display.Graphics.lineStyle() method. You can specify the - * following three types of caps: - */ -module away.base -{ - export class CapsStyle - { - /** - * Used to specify round caps in the caps parameter of the - * flash.display.Graphics.lineStyle() method. - */ - public static ROUND:string = "round"; - - /** - * Used to specify no caps in the caps parameter of the - * flash.display.Graphics.lineStyle() method. - */ - public static NONE:string = "none"; - - /** - * Used to specify square caps in the caps parameter of the - * flash.display.Graphics.lineStyle() method. - */ - public static SQUARE:string = "square"; - } -} \ No newline at end of file diff --git a/src/away/core/base/DisplayObject.ts b/src/away/core/base/DisplayObject.ts deleted file mode 100644 index a7ba4868..00000000 --- a/src/away/core/base/DisplayObject.ts +++ /dev/null @@ -1,2358 +0,0 @@ -/// - -/** - * The DisplayObject class is the base class for all objects that can be - * placed on the display list. The display list manages all objects displayed - * in flash. Use the DisplayObjectContainer class to arrange the - * display objects in the display list. DisplayObjectContainer objects can - * have child display objects, while other display objects, such as Shape and - * TextField objects, are "leaf" nodes that have only parents and siblings, no - * children. - * - *

The DisplayObject class supports basic functionality like the x - * and y position of an object, as well as more advanced properties of - * the object such as its transformation matrix.

- * - *

DisplayObject is an abstract base class; therefore, you cannot call - * DisplayObject directly. Invoking new DisplayObject() throws an - * ArgumentError exception.

- * - *

All display objects inherit from the DisplayObject class.

- * - *

The DisplayObject class itself does not include any APIs for rendering - * content onscreen. For that reason, if you want create a custom subclass of - * the DisplayObject class, you will want to extend one of its subclasses that - * do have APIs for rendering content onscreen, such as the Shape, Sprite, - * Bitmap, SimpleButton, TextField, or MovieClip class.

- * - *

The DisplayObject class contains several broadcast events. Normally, the - * target of any particular event is a specific DisplayObject instance. For - * example, the target of an added event is the specific - * DisplayObject instance that was added to the display list. Having a single - * target restricts the placement of event listeners to that target and in - * some cases the target's ancestors on the display list. With broadcast - * events, however, the target is not a specific DisplayObject instance, but - * rather all DisplayObject instances, including those that are not on the - * display list. This means that you can add a listener to any DisplayObject - * instance to listen for broadcast events. In addition to the broadcast - * events listed in the DisplayObject class's Events table, the DisplayObject - * class also inherits two broadcast events from the EventDispatcher class: - * activate and deactivate.

- * - *

Some properties previously used in the ActionScript 1.0 and 2.0 - * MovieClip, TextField, and Button classes(such as _alpha, - * _height, _name, _width, - * _x, _y, and others) have equivalents in the - * ActionScript 3.0 DisplayObject class that are renamed so that they no - * longer begin with the underscore(_) character.

- * - *

For more information, see the "Display Programming" chapter of the - * ActionScript 3.0 Developer's Guide.

- * - * @event added Dispatched when a display object is added to the - * display list. The following methods trigger this - * event: - * DisplayObjectContainer.addChild(), - * DisplayObjectContainer.addChildAt(). - * @event addedToStage Dispatched when a display object is added to the on - * stage display list, either directly or through the - * addition of a sub tree in which the display object - * is contained. The following methods trigger this - * event: - * DisplayObjectContainer.addChild(), - * DisplayObjectContainer.addChildAt(). - * @event enterFrame [broadcast event] Dispatched when the playhead is - * entering a new frame. If the playhead is not - * moving, or if there is only one frame, this event - * is dispatched continuously in conjunction with the - * frame rate. This event is a broadcast event, which - * means that it is dispatched by all display objects - * with a listener registered for this event. - * @event exitFrame [broadcast event] Dispatched when the playhead is - * exiting the current frame. All frame scripts have - * been run. If the playhead is not moving, or if - * there is only one frame, this event is dispatched - * continuously in conjunction with the frame rate. - * This event is a broadcast event, which means that - * it is dispatched by all display objects with a - * listener registered for this event. - * @event frameConstructed [broadcast event] Dispatched after the constructors - * of frame display objects have run but before frame - * scripts have run. If the playhead is not moving, or - * if there is only one frame, this event is - * dispatched continuously in conjunction with the - * frame rate. This event is a broadcast event, which - * means that it is dispatched by all display objects - * with a listener registered for this event. - * @event removed Dispatched when a display object is about to be - * removed from the display list. Two methods of the - * DisplayObjectContainer class generate this event: - * removeChild() and - * removeChildAt(). - * - *

The following methods of a - * DisplayObjectContainer object also generate this - * event if an object must be removed to make room for - * the new object: addChild(), - * addChildAt(), and - * setChildIndex().

- * @event removedFromStage Dispatched when a display object is about to be - * removed from the display list, either directly or - * through the removal of a sub tree in which the - * display object is contained. Two methods of the - * DisplayObjectContainer class generate this event: - * removeChild() and - * removeChildAt(). - * - *

The following methods of a - * DisplayObjectContainer object also generate this - * event if an object must be removed to make room for - * the new object: addChild(), - * addChildAt(), and - * setChildIndex().

- * @event render [broadcast event] Dispatched when the display list - * is about to be updated and rendered. This event - * provides the last opportunity for objects listening - * for this event to make changes before the display - * list is rendered. You must call the - * invalidate() method of the Stage - * object each time you want a render - * event to be dispatched. Render events - * are dispatched to an object only if there is mutual - * trust between it and the object that called - * Stage.invalidate(). This event is a - * broadcast event, which means that it is dispatched - * by all display objects with a listener registered - * for this event. - * - *

Note: This event is not dispatched if the - * display is not rendering. This is the case when the - * content is either minimized or obscured.

- */ -module away.base -{ - export class DisplayObject extends away.library.NamedAssetBase implements IBitmapDrawable - { - private _loaderInfo:LoaderInfo; - private _mouseX:number; - private _mouseY:number; - private _root:away.containers.DisplayObjectContainer; - private _bounds:away.geom.Rectangle; - private _boundsVisible:boolean; - private _depth:number; - private _height:number; - private _width:number; - - public _pScene:away.containers.Scene; - public _pParent:away.containers.DisplayObjectContainer; - public _pSceneTransform:away.geom.Matrix3D = new away.geom.Matrix3D(); - public _pSceneTransformDirty:boolean = true; - public _pIsEntity:boolean; - - private _explicitPartition:away.partition.Partition; - public _pImplicitPartition:away.partition.Partition; - private _partitionNode:away.partition.EntityNode; - - private _sceneTransformChanged:away.events.DisplayObjectEvent; - private _scenechanged:away.events.DisplayObjectEvent; - private _transform:away.geom.Transform; - private _matrix3D:away.geom.Matrix3D = new away.geom.Matrix3D(); - private _matrix3DDirty:boolean = true; - - private _inverseSceneTransform:away.geom.Matrix3D = new away.geom.Matrix3D(); - private _inverseSceneTransformDirty:boolean = true; - private _scenePosition:away.geom.Vector3D = new away.geom.Vector3D(); - private _scenePositionDirty:boolean = true; - private _explicitVisibility:boolean = true; - public _pImplicitVisibility:boolean = true; - private _explicitMouseEnabled:boolean = true; - public _pImplicitMouseEnabled:boolean = true; - private _listenToSceneTransformChanged:boolean; - private _listenToSceneChanged:boolean; - - private _positionDirty:boolean = true; - private _rotationDirty:boolean = true; - private _scaleDirty:boolean = true; - - private _positionChanged:away.events.DisplayObjectEvent; - private _rotationChanged:away.events.DisplayObjectEvent; - private _scaleChanged:away.events.DisplayObjectEvent; - - private _rotationX:number = 0; - private _rotationY:number = 0; - private _rotationZ:number = 0; - private _eulers:away.geom.Vector3D = new away.geom.Vector3D(); - private _flipY:away.geom.Matrix3D = new away.geom.Matrix3D(); - - private _listenToPositionChanged:boolean; - private _listenToRotationChanged:boolean; - private _listenToScaleChanged:boolean; - private _zOffset:number = 0; - - public _pScaleX:number = 1; - public _pScaleY:number = 1; - public _pScaleZ:number = 1; - private _x:number = 0; - private _y:number = 0; - private _z:number = 0; - private _pivot:away.geom.Vector3D = new away.geom.Vector3D(); - private _orientationMatrix:away.geom.Matrix3D = new away.geom.Matrix3D(); - private _pivotZero:boolean = true; - private _pivotDirty:boolean = true; - private _pos:away.geom.Vector3D = new away.geom.Vector3D(); - private _rot:away.geom.Vector3D = new away.geom.Vector3D(); - private _sca:away.geom.Vector3D = new away.geom.Vector3D(); - private _transformComponents:away.geom.Vector3D[]; - - public _pIgnoreTransform:boolean = false; - - private _shaderPickingDetails:boolean; - - public _pPickingCollisionVO:away.pick.PickingCollisionVO; - - public _pBounds:away.bounds.BoundingVolumeBase; - public _pBoundsInvalid:boolean = true; - private _worldBounds:away.bounds.BoundingVolumeBase; - private _worldBoundsInvalid:boolean = true; - - public _pPickingCollider:away.pick.IPickingCollider; - - public _pRenderables:Array = new Array(); - - public _iSourcePrefab:away.prefabs.PrefabBase; - - /** - * - */ - public alignmentMode:string = AlignmentMode.REGISTRATION_POINT; - - /** - * Indicates the alpha transparency value of the object specified. Valid - * values are 0(fully transparent) to 1(fully opaque). The default value is - * 1. Display objects with alpha set to 0 are active, - * even though they are invisible. - */ - public alpha:number; - - /** - * A value from the BlendMode class that specifies which blend mode to use. A - * bitmap can be drawn internally in two ways. If you have a blend mode - * enabled or an external clipping mask, the bitmap is drawn by adding a - * bitmap-filled square shape to the vector render. If you attempt to set - * this property to an invalid value, Flash runtimes set the value to - * BlendMode.NORMAL. - * - *

The blendMode property affects each pixel of the display - * object. Each pixel is composed of three constituent colors(red, green, - * and blue), and each constituent color has a value between 0x00 and 0xFF. - * Flash Player or Adobe AIR compares each constituent color of one pixel in - * the movie clip with the corresponding color of the pixel in the - * background. For example, if blendMode is set to - * BlendMode.LIGHTEN, Flash Player or Adobe AIR compares the red - * value of the display object with the red value of the background, and uses - * the lighter of the two as the value for the red component of the displayed - * color.

- * - *

The following table describes the blendMode settings. The - * BlendMode class defines string values you can use. The illustrations in - * the table show blendMode values applied to a circular display - * object(2) superimposed on another display object(1).

- */ - public blendMode:BlendMode; - - /** - * - */ - public get bounds():away.bounds.BoundingVolumeBase - { - if (this._pBoundsInvalid) - this.pUpdateBounds(); - - return this._pBounds; - } - - public set bounds(value:away.bounds.BoundingVolumeBase) - { - if (this._pBounds == value) - return; - - this._pBounds = value; - - this._worldBounds = value.clone(); - - this.pInvalidateBounds(); - - if (this._boundsVisible) - this._partitionNode._iUpdateEntityBounds(); - } - - /** - * If set to true, NME will use the software renderer to cache - * an internal bitmap representation of the display object. For native targets, - * this is often much slower than the default hardware renderer. When you - * are using the Flash target, this caching may increase performance for display - * objects that contain complex vector content. - * - *

All vector data for a display object that has a cached bitmap is drawn - * to the bitmap instead of the main display. If - * cacheAsBitmapMatrix is null or unsupported, the bitmap is - * then copied to the main display as unstretched, unrotated pixels snapped - * to the nearest pixel boundaries. Pixels are mapped 1 to 1 with the parent - * object. If the bounds of the bitmap change, the bitmap is recreated - * instead of being stretched.

- * - *

If cacheAsBitmapMatrix is non-null and supported, the - * object is drawn to the off-screen bitmap using that matrix and the - * stretched and/or rotated results of that rendering are used to draw the - * object to the main display.

- * - *

No internal bitmap is created unless the cacheAsBitmap - * property is set to true.

- * - *

After you set the cacheAsBitmap property to - * true, the rendering does not change, however the display - * object performs pixel snapping automatically. The animation speed can be - * significantly faster depending on the complexity of the vector content. - *

- * - *

The cacheAsBitmap property is automatically set to - * true whenever you apply a filter to a display object(when - * its filter array is not empty), and if a display object has a - * filter applied to it, cacheAsBitmap is reported as - * true for that display object, even if you set the property to - * false. If you clear all filters for a display object, the - * cacheAsBitmap setting changes to what it was last set to.

- * - *

A display object does not use a bitmap even if the - * cacheAsBitmap property is set to true and - * instead renders from vector data in the following cases:

- * - *
    - *
  • The bitmap is too large. In AIR 1.5 and Flash Player 10, the maximum - * size for a bitmap image is 8,191 pixels in width or height, and the total - * number of pixels cannot exceed 16,777,215 pixels.(So, if a bitmap image - * is 8,191 pixels wide, it can only be 2,048 pixels high.) In Flash Player 9 - * and earlier, the limitation is is 2880 pixels in height and 2,880 pixels - * in width.
  • - *
  • The bitmap fails to allocate(out of memory error).
  • - *
- * - *

The cacheAsBitmap property is best used with movie clips - * that have mostly static content and that do not scale and rotate - * frequently. With such movie clips, cacheAsBitmap can lead to - * performance increases when the movie clip is translated(when its x - * and y position is changed).

- */ - public cacheAsBitmap:boolean; - - /** - * - */ - public castsShadows:boolean = true; - - /** - * Indicates the depth of the display object, in pixels. The depth is - * calculated based on the bounds of the content of the display object. When - * you set the depth property, the scaleZ property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content (such as an empty sprite) has a depth of 0, even if you try to - * set depth to a different value.

- */ - public get depth():number - { - if (this._pBoundsInvalid) - this.pUpdateBounds(); - - return this._depth; - } - - public set depth(val:number) - { - if (this._depth == val) - return; - - this._depth == val; - - this._pScaleZ = val/this.bounds.aabb.depth; - - this.invalidateScale(); - } - - /** - * Defines the rotation of the 3d object as a Vector3D object containing euler angles for rotation around x, y and z axis. - */ - public get eulers():away.geom.Vector3D - { - this._eulers.x = this._rotationX*away.geom.MathConsts.RADIANS_TO_DEGREES; - this._eulers.y = this._rotationY*away.geom.MathConsts.RADIANS_TO_DEGREES; - this._eulers.z = this._rotationZ*away.geom.MathConsts.RADIANS_TO_DEGREES; - - return this._eulers; - } - - public set eulers(value:away.geom.Vector3D) - { - this._rotationX = value.x*away.geom.MathConsts.DEGREES_TO_RADIANS; - this._rotationY = value.y*away.geom.MathConsts.DEGREES_TO_RADIANS; - this._rotationZ = value.z*away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - } - - /** - * An object that can contain any extra data. - */ - public extra:Object; - - /** - * An indexed array that contains each filter object currently associated - * with the display object. The flash.filters package contains several - * classes that define specific filters you can use. - * - *

Filters can be applied in Flash Professional at design time, or at run - * time by using ActionScript code. To apply a filter by using ActionScript, - * you must make a temporary copy of the entire filters array, - * modify the temporary array, then assign the value of the temporary array - * back to the filters array. You cannot directly add a new - * filter object to the filters array.

- * - *

To add a filter by using ActionScript, perform the following steps - * (assume that the target display object is named - * myDisplayObject):

- * - *
    - *
  1. Create a new filter object by using the constructor method of your - * chosen filter class.
  2. - *
  3. Assign the value of the myDisplayObject.filters array - * to a temporary array, such as one named myFilters.
  4. - *
  5. Add the new filter object to the myFilters temporary - * array.
  6. - *
  7. Assign the value of the temporary array to the - * myDisplayObject.filters array.
  8. - *
- * - *

If the filters array is undefined, you do not need to use - * a temporary array. Instead, you can directly assign an array literal that - * contains one or more filter objects that you create. The first example in - * the Examples section adds a drop shadow filter by using code that handles - * both defined and undefined filters arrays.

- * - *

To modify an existing filter object, you must use the technique of - * modifying a copy of the filters array:

- * - *
    - *
  1. Assign the value of the filters array to a temporary - * array, such as one named myFilters.
  2. - *
  3. Modify the property by using the temporary array, - * myFilters. For example, to set the quality property of the - * first filter in the array, you could use the following code: - * myFilters[0].quality = 1;
  4. - *
  5. Assign the value of the temporary array to the filters - * array.
  6. - *
- * - *

At load time, if a display object has an associated filter, it is - * marked to cache itself as a transparent bitmap. From this point forward, - * as long as the display object has a valid filter list, the player caches - * the display object as a bitmap. This source bitmap is used as a source - * image for the filter effects. Each display object usually has two bitmaps: - * one with the original unfiltered source display object and another for the - * final image after filtering. The final image is used when rendering. As - * long as the display object does not change, the final image does not need - * updating.

- * - *

The flash.filters package includes classes for filters. For example, to - * create a DropShadow filter, you would write:

- * - * @throws ArgumentError When filters includes a ShaderFilter - * and the shader output type is not compatible with - * this operation(the shader must specify a - * pixel4 output). - * @throws ArgumentError When filters includes a ShaderFilter - * and the shader doesn't specify any image input or - * the first input is not an image4 input. - * @throws ArgumentError When filters includes a ShaderFilter - * and the shader specifies an image input that isn't - * provided. - * @throws ArgumentError When filters includes a ShaderFilter, a - * ByteArray or Vector. instance as a shader - * input, and the width and - * height properties aren't specified for - * the ShaderInput object, or the specified values - * don't match the amount of data in the input data. - * See the ShaderInput.input property for - * more information. - */ -// public filters:Array; - - /** - * Indicates the height of the display object, in pixels. The height is - * calculated based on the bounds of the content of the display object. When - * you set the height property, the scaleY property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content (such as an empty sprite) has a height of 0, even if you try to - * set height to a different value.

- */ - public get height():number - { - if (this._pBoundsInvalid) - this.pUpdateBounds(); - - return this._height; - } - - public set height(val:number) - { - if (this._height == val) - return; - - this._height == val; - - this._pScaleY = val/this.bounds.aabb.height; - - this.invalidateScale(); - } - - /** - * Indicates the instance container index of the DisplayObject. The object can be - * identified in the child list of its parent display object container by - * calling the getChildByIndex() method of the display object - * container. - * - *

If the DisplayObject has no parent container, index defaults to 0.

- */ - public get index():number - { - if (this._pParent) - return this._pParent.getChildIndex(this); - - return 0; - } - - /** - * - */ - public get inverseSceneTransform():away.geom.Matrix3D - { - if (this._inverseSceneTransformDirty) { - this._inverseSceneTransform.copyFrom(this.sceneTransform); - this._inverseSceneTransform.invert(); - this._inverseSceneTransformDirty = false; - } - return this._inverseSceneTransform; - } - - /** - * - */ - public get ignoreTransform():boolean - { - return this._pIgnoreTransform; - } - - public set ignoreTransform(value:boolean) - { - if (this._pIgnoreTransform == value) - return; - - this._pIgnoreTransform = value; - - if (value) { - this._pSceneTransform.identity(); - this._scenePosition.setTo(0, 0, 0); - } - - this.pInvalidateSceneTransform(); - } - - /** - * - */ - public get isEntity() - { - return this._pIsEntity; - } - /** - * Returns a LoaderInfo object containing information about loading the file - * to which this display object belongs. The loaderInfo property - * is defined only for the root display object of a SWF file or for a loaded - * Bitmap(not for a Bitmap that is drawn with ActionScript). To find the - * loaderInfo object associated with the SWF file that contains - * a display object named myDisplayObject, use - * myDisplayObject.root.loaderInfo. - * - *

A large SWF file can monitor its download by calling - * this.root.loaderInfo.addEventListener(Event.COMPLETE, - * func).

- */ - public get loaderInfo():LoaderInfo - { - return this._loaderInfo; - } - - /** - * The calling display object is masked by the specified mask - * object. To ensure that masking works when the Stage is scaled, the - * mask display object must be in an active part of the display - * list. The mask object itself is not drawn. Set - * mask to null to remove the mask. - * - *

To be able to scale a mask object, it must be on the display list. To - * be able to drag a mask Sprite object(by calling its - * startDrag() method), it must be on the display list. To call - * the startDrag() method for a mask sprite based on a - * mouseDown event being dispatched by the sprite, set the - * sprite's buttonMode property to true.

- * - *

When display objects are cached by setting the - * cacheAsBitmap property to true an the - * cacheAsBitmapMatrix property to a Matrix object, both the - * mask and the display object being masked must be part of the same cached - * bitmap. Thus, if the display object is cached, then the mask must be a - * child of the display object. If an ancestor of the display object on the - * display list is cached, then the mask must be a child of that ancestor or - * one of its descendents. If more than one ancestor of the masked object is - * cached, then the mask must be a descendent of the cached container closest - * to the masked object in the display list.

- * - *

Note: A single mask object cannot be used to mask - * more than one calling display object. When the mask is - * assigned to a second display object, it is removed as the mask of the - * first object, and that object's mask property becomes - * null.

- */ - public mask:DisplayObject; - - /** - * Specifies whether this object receives mouse, or other user input, - * messages. The default value is true, which means that by - * default any InteractiveObject instance that is on the display list - * receives mouse events or other user input events. If - * mouseEnabled is set to false, the instance does - * not receive any mouse events(or other user input events like keyboard - * events). Any children of this instance on the display list are not - * affected. To change the mouseEnabled behavior for all - * children of an object on the display list, use - * flash.display.DisplayObjectContainer.mouseChildren. - * - *

No event is dispatched by setting this property. You must use the - * addEventListener() method to create interactive - * functionality.

- */ - public get mouseEnabled():boolean - { - return this._explicitMouseEnabled; - } - - public set mouseEnabled(value:boolean) - { - if (this._explicitMouseEnabled == value) - return; - - this._explicitMouseEnabled = value; - - this._pUpdateImplicitMouseEnabled(this._pParent? this._pParent.mouseChildren : true); - } - - - /** - * Indicates the x coordinate of the mouse or user input device position, in - * pixels. - * - *

Note: For a DisplayObject that has been rotated, the returned x - * coordinate will reflect the non-rotated object.

- */ - public get mouseX():number - { - return this._mouseX; - } - - /** - * Indicates the y coordinate of the mouse or user input device position, in - * pixels. - * - *

Note: For a DisplayObject that has been rotated, the returned y - * coordinate will reflect the non-rotated object.

- */ - public get mouseY():number - { - return this._mouseY; - } - - /** - * Indicates the instance name of the DisplayObject. The object can be - * identified in the child list of its parent display object container by - * calling the getChildByName() method of the display object - * container. - * - * @throws IllegalOperationError If you are attempting to set this property - * on an object that was placed on the timeline - * in the Flash authoring tool. - */ - public name:string; - - /** - * - */ - public orientationMode:string = OrientationMode.DEFAULT; - - /** - * Indicates the DisplayObjectContainer object that contains this display - * object. Use the parent property to specify a relative path to - * display objects that are above the current display object in the display - * list hierarchy. - * - *

You can use parent to move up multiple levels in the - * display list as in the following:

- * - * @throws SecurityError The parent display object belongs to a security - * sandbox to which you do not have access. You can - * avoid this situation by having the parent movie call - * the Security.allowDomain() method. - */ - public get parent():away.containers.DisplayObjectContainer - { - return this._pParent; - } - - /** - * - */ - public get partition():away.partition.Partition - { - return this._explicitPartition; - } - - public set partition(value:away.partition.Partition) - { - if (this._explicitPartition == value) - return; - - if (this._pScene && this._explicitPartition) - this._pScene.iUnregisterPartition(this._explicitPartition); - - this._explicitPartition = value; - - if (this._pScene && value) - this._pScene.iRegisterPartition(value); - - this._pUpdateImplicitPartition(this._pParent? this._pParent._iAssignedPartition : null); - } - - /** - * - */ - public get partitionNode():away.partition.EntityNode - { - if (!this._partitionNode) - this._partitionNode = this.pCreateEntityPartitionNode(); - - return this._partitionNode; - } - - /** - * - */ - public get pickingCollider():away.pick.IPickingCollider - { - return this._pPickingCollider; - } - - public set pickingCollider(value:away.pick.IPickingCollider) - { - this._pPickingCollider = value; - } - - /** - * Defines the local point around which the object rotates. - */ - public get pivot():away.geom.Vector3D - { - return this._pivot; - } - - - public set pivot(pivot:away.geom.Vector3D) - { - this._pivot = pivot.clone(); - - this.invalidatePivot(); - } - - /** - * For a display object in a loaded SWF file, the root property - * is the top-most display object in the portion of the display list's tree - * structure represented by that SWF file. For a Bitmap object representing a - * loaded image file, the root property is the Bitmap object - * itself. For the instance of the main class of the first SWF file loaded, - * the root property is the display object itself. The - * root property of the Stage object is the Stage object itself. - * The root property is set to null for any display - * object that has not been added to the display list, unless it has been - * added to a display object container that is off the display list but that - * is a child of the top-most display object in a loaded SWF file. - * - *

For example, if you create a new Sprite object by calling the - * Sprite() constructor method, its root property - * is null until you add it to the display list(or to a display - * object container that is off the display list but that is a child of the - * top-most display object in a SWF file).

- * - *

For a loaded SWF file, even though the Loader object used to load the - * file may not be on the display list, the top-most display object in the - * SWF file has its root property set to itself. The Loader - * object does not have its root property set until it is added - * as a child of a display object for which the root property is - * set.

- */ - public get root():away.containers.DisplayObjectContainer - { - return this._root; - } - - /** - * Indicates the rotation of the DisplayObject instance, in degrees, from its - * original orientation. Values from 0 to 180 represent clockwise rotation; - * values from 0 to -180 represent counterclockwise rotation. Values outside - * this range are added to or subtracted from 360 to obtain a value within - * the range. For example, the statement my_video.rotation = 450 - * is the same as my_video.rotation = 90. - */ - public rotation:number; //TODO - - /** - * Indicates the x-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - public get rotationX():number - { - return this._rotationX*away.geom.MathConsts.RADIANS_TO_DEGREES; - } - - public set rotationX(val:number) - { - if (this.rotationX == val) - return; - - this._rotationX = val*away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - } - - /** - * Indicates the y-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - public get rotationY():number - { - return this._rotationY*away.geom.MathConsts.RADIANS_TO_DEGREES; - } - - public set rotationY(val:number) - { - if (this.rotationY == val) - return; - - this._rotationY = val*away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - } - - /** - * Indicates the z-axis rotation of the DisplayObject instance, in degrees, - * from its original orientation relative to the 3D parent container. Values - * from 0 to 180 represent clockwise rotation; values from 0 to -180 - * represent counterclockwise rotation. Values outside this range are added - * to or subtracted from 360 to obtain a value within the range. - */ - public get rotationZ():number - { - return this._rotationZ*away.geom.MathConsts.RADIANS_TO_DEGREES; - } - - public set rotationZ(val:number) - { - if (this.rotationZ == val) - return; - - this._rotationZ = val*away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - } - - /** - * The current scaling grid that is in effect. If set to null, - * the entire display object is scaled normally when any scale transformation - * is applied. - * - *

When you define the scale9Grid property, the display - * object is divided into a grid with nine regions based on the - * scale9Grid rectangle, which defines the center region of the - * grid. The eight other regions of the grid are the following areas:

- * - *
    - *
  • The upper-left corner outside of the rectangle
  • - *
  • The area above the rectangle
  • - *
  • The upper-right corner outside of the rectangle
  • - *
  • The area to the left of the rectangle
  • - *
  • The area to the right of the rectangle
  • - *
  • The lower-left corner outside of the rectangle
  • - *
  • The area below the rectangle
  • - *
  • The lower-right corner outside of the rectangle
  • - *
- * - *

You can think of the eight regions outside of the center(defined by - * the rectangle) as being like a picture frame that has special rules - * applied to it when scaled.

- * - *

When the scale9Grid property is set and a display object - * is scaled, all text and gradients are scaled normally; however, for other - * types of objects the following rules apply:

- * - *
    - *
  • Content in the center region is scaled normally.
  • - *
  • Content in the corners is not scaled.
  • - *
  • Content in the top and bottom regions is scaled horizontally only. - * Content in the left and right regions is scaled vertically only.
  • - *
  • All fills(including bitmaps, video, and gradients) are stretched to - * fit their shapes.
  • - *
- * - *

If a display object is rotated, all subsequent scaling is normal(and - * the scale9Grid property is ignored).

- * - *

For example, consider the following display object and a rectangle that - * is applied as the display object's scale9Grid:

- * - *

A common use for setting scale9Grid is to set up a display - * object to be used as a component, in which edge regions retain the same - * width when the component is scaled.

- * - * @throws ArgumentError If you pass an invalid argument to the method. - */ - public scale9Grid:away.geom.Rectangle; - - /** - * Indicates the horizontal scale(percentage) of the object as applied from - * the registration point. The default registration point is(0,0). 1.0 - * equals 100% scale. - * - *

Scaling the local coordinate system changes the x and - * y property values, which are defined in whole pixels.

- */ - public get scaleX():number - { - return this._pScaleX; - } - - public set scaleX(val:number) - { - if (this._pScaleX == val) - return; - - this._pScaleX = val; - - this.invalidateScale(); - } - - /** - * Indicates the vertical scale(percentage) of an object as applied from the - * registration point of the object. The default registration point is(0,0). - * 1.0 is 100% scale. - * - *

Scaling the local coordinate system changes the x and - * y property values, which are defined in whole pixels.

- */ - public get scaleY():number - { - return this._pScaleY; - } - - public set scaleY(val:number) - { - if (this._pScaleY == val) - return; - - this._pScaleY = val; - - this.invalidateScale(); - } - - /** - * Indicates the depth scale(percentage) of an object as applied from the - * registration point of the object. The default registration point is(0,0). - * 1.0 is 100% scale. - * - *

Scaling the local coordinate system changes the x, - * y and z property values, which are defined in - * whole pixels.

- */ - public get scaleZ():number - { - return this._pScaleZ; - } - - public set scaleZ(val:number) - { - if (this._pScaleZ == val) - return; - - this._pScaleZ = val; - - this.invalidateScale(); - } - - /** - * - */ - public get scene():away.containers.Scene - { - return this._pScene; - } - - /** - * - */ - public get scenePosition():away.geom.Vector3D - { - if (this._scenePositionDirty) { - if (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) { - var pivotScale:away.geom.Vector3D = new away.geom.Vector3D(this._pivot.x/this._pScaleX, this._pivot.y/this._pScaleY, this._pivot.z/this._pScaleZ) - this._scenePosition = this.sceneTransform.transformVector(pivotScale); - //this._scenePosition.decrementBy(new away.geom.Vector3D(this._pivot.x*this._pScaleX, this._pivot.y*this._pScaleY, this._pivot.z*this._pScaleZ)); - } else { - this.sceneTransform.copyColumnTo(3, this._scenePosition); - } - - this._scenePositionDirty = false; - } - return this._scenePosition; - } - - public get sceneTransform():away.geom.Matrix3D - { - if (this._pSceneTransformDirty) - this.pUpdateSceneTransform(); - - return this._pSceneTransform; - } - - /** - * The scroll rectangle bounds of the display object. The display object is - * cropped to the size defined by the rectangle, and it scrolls within the - * rectangle when you change the x and y properties - * of the scrollRect object. - * - *

The properties of the scrollRect Rectangle object use the - * display object's coordinate space and are scaled just like the overall - * display object. The corner bounds of the cropped window on the scrolling - * display object are the origin of the display object(0,0) and the point - * defined by the width and height of the rectangle. They are not centered - * around the origin, but use the origin to define the upper-left corner of - * the area. A scrolled display object always scrolls in whole pixel - * increments.

- * - *

You can scroll an object left and right by setting the x - * property of the scrollRect Rectangle object. You can scroll - * an object up and down by setting the y property of the - * scrollRect Rectangle object. If the display object is rotated - * 90° and you scroll it left and right, the display object actually scrolls - * up and down.

- */ - public scrollRect:away.geom.Rectangle; - - /** - * - */ - public get shaderPickingDetails():boolean - { - return this._shaderPickingDetails; - } - - /** - * - */ - public get boundsVisible():boolean - { - return this._boundsVisible; - } - - public set boundsVisible(value:boolean) - { - if (value == this._boundsVisible) - return; - - this._boundsVisible = value; - - this._partitionNode.boundsVisible = value; - } - - /** - * An object with properties pertaining to a display object's matrix, color - * transform, and pixel bounds. The specific properties - matrix, - * colorTransform, and three read-only properties - * (concatenatedMatrix, concatenatedColorTransform, - * and pixelBounds) - are described in the entry for the - * Transform class. - * - *

Each of the transform object's properties is itself an object. This - * concept is important because the only way to set new values for the matrix - * or colorTransform objects is to create a new object and copy that object - * into the transform.matrix or transform.colorTransform property.

- * - *

For example, to increase the tx value of a display - * object's matrix, you must make a copy of the entire matrix object, then - * copy the new object into the matrix property of the transform object:

- *
 public myMatrix:Matrix =
-		 * myDisplayObject.transform.matrix; myMatrix.tx += 10;
-		 * myDisplayObject.transform.matrix = myMatrix; 
- * - *

You cannot directly set the tx property. The following - * code has no effect on myDisplayObject:

- *
 myDisplayObject.transform.matrix.tx +=
-		 * 10; 
- * - *

You can also copy an entire transform object and assign it to another - * display object's transform property. For example, the following code - * copies the entire transform object from myOldDisplayObj to - * myNewDisplayObj:

- * myNewDisplayObj.transform = myOldDisplayObj.transform; - * - *

The resulting display object, myNewDisplayObj, now has the - * same values for its matrix, color transform, and pixel bounds as the old - * display object, myOldDisplayObj.

- * - *

Note that AIR for TV devices use hardware acceleration, if it is - * available, for color transforms.

- */ - public get transform():away.geom.Transform - { - return this._transform; - } - - /** - * Whether or not the display object is visible. Display objects that are not - * visible are disabled. For example, if visible=false for an - * InteractiveObject instance, it cannot be clicked. - */ - public get visible():boolean - { - return this._explicitVisibility; - } - - public set visible(value:boolean) - { - if (this._explicitVisibility == value) - return; - - this._explicitVisibility = value; - - this._pUpdateImplicitVisibility(this._pParent? this._pParent._iIsVisible() : true); - } - - /** - * Indicates the width of the display object, in pixels. The width is - * calculated based on the bounds of the content of the display object. When - * you set the width property, the scaleX property - * is adjusted accordingly, as shown in the following code: - * - *

Except for TextField and Video objects, a display object with no - * content(such as an empty sprite) has a width of 0, even if you try to set - * width to a different value.

- */ - public get width():number - { - if (this._pBoundsInvalid) - this.pUpdateBounds(); - - return this._width; - } - - public set width(val:number) - { - if (this._width == val) - return; - - this._width == val; - - this._pScaleX = val/this.bounds.aabb.width; - - this.invalidateScale(); - } - - /** - * - */ - public get worldBounds():away.bounds.BoundingVolumeBase - { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the bounds of the entity, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - if (this._worldBoundsInvalid) { - this._worldBoundsInvalid = false; - this._worldBounds.transformFrom(this.bounds, this.sceneTransform); - } - - return this._worldBounds; - } - - /** - * Indicates the x coordinate of the DisplayObject instance relative - * to the local coordinates of the parent DisplayObjectContainer. If the - * object is inside a DisplayObjectContainer that has transformations, it is - * in the local coordinate system of the enclosing DisplayObjectContainer. - * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the - * DisplayObjectContainer's children inherit a coordinate system that is - * rotated 90° counterclockwise. The object's coordinates refer to the - * registration point position. - */ - public get x():number - { - return this._x; - } - - public set x(val:number) - { - if (this._x == val) - return; - - this._x = val; - - this.invalidatePosition(); - } - - /** - * Indicates the y coordinate of the DisplayObject instance relative - * to the local coordinates of the parent DisplayObjectContainer. If the - * object is inside a DisplayObjectContainer that has transformations, it is - * in the local coordinate system of the enclosing DisplayObjectContainer. - * Thus, for a DisplayObjectContainer rotated 90° counterclockwise, the - * DisplayObjectContainer's children inherit a coordinate system that is - * rotated 90° counterclockwise. The object's coordinates refer to the - * registration point position. - */ - public get y():number - { - return this._y; - } - - public set y(val:number) - { - if (this._y == val) - return; - - this._y = val; - - this.invalidatePosition(); - } - - /** - * Indicates the z coordinate position along the z-axis of the DisplayObject - * instance relative to the 3D parent container. The z property is used for - * 3D coordinates, not screen or pixel coordinates. - * - *

When you set a z property for a display object to - * something other than the default value of 0, a corresponding - * Matrix3D object is automatically created. for adjusting a display object's - * position and orientation in three dimensions. When working with the - * z-axis, the existing behavior of x and y properties changes from screen or - * pixel coordinates to positions relative to the 3D parent container.

- * - *

For example, a child of the _root at position x = 100, y = - * 100, z = 200 is not drawn at pixel location(100,100). The child is drawn - * wherever the 3D projection calculation puts it. The calculation is:

- * - *

(x~~cameraFocalLength/cameraRelativeZPosition, - * y~~cameraFocalLength/cameraRelativeZPosition)

- */ - public get z():number - { - return this._z; - } - - public set z(val:number) - { - if (this._z == val) - return; - - this._z = val; - - this.invalidatePosition(); - } - - /** - * - */ - public get zOffset():number - { - return this._zOffset; - } - - public set zOffset(value:number) - { - this._zOffset = value; - } - - /** - * Creates a new DisplayObject instance. - */ - constructor() - { - super(); - - // Cached vector of transformation components used when - // recomposing the transform matrix in updateTransform() - - this._transformComponents = new Array(3);//_transformComponents = new Vector.(3, true); - - this._transformComponents[0] = this._pos; - this._transformComponents[1] = this._rot; - this._transformComponents[2] = this._sca; - - //creation of associated transform object - this._transform = new away.geom.Transform(this); - - this._matrix3D.identity(); - - this._flipY.appendScale(1, -1, 1); - - this._pBounds = this.pCreateDefaultBoundingVolume(); - - this._worldBounds = this.pCreateDefaultBoundingVolume(); - } - - /** - * - */ - public addEventListener(type:string, listener:Function) - { - super.addEventListener(type, listener);//, priority, useWeakReference); - - switch (type) { - case away.events.DisplayObjectEvent.POSITION_CHANGED: - this._listenToPositionChanged = true; - break; - case away.events.DisplayObjectEvent.ROTATION_CHANGED: - this._listenToRotationChanged = true; - break; - case away.events.DisplayObjectEvent.SCALE_CHANGED: - this._listenToScaleChanged = true; - break; - } - } - - /** - * - */ - public clone():DisplayObject - { - var clone:DisplayObject = new DisplayObject(); - clone.pivot = this.pivot; - clone._iMatrix3D = this._iMatrix3D; - clone.name = name; - - // todo: implement for all subtypes - return clone; - } - - /** - * - */ - public dispose() - { - if (this.parent) - this.parent.removeChild(this); - - while (this._pRenderables.length) - this._pRenderables[0].dispose(); - } - - /** - * @inheritDoc - */ - public disposeAsset() - { - this.dispose(); - } - - /** - * Returns a rectangle that defines the area of the display object relative - * to the coordinate system of the targetCoordinateSpace object. - * Consider the following code, which shows how the rectangle returned can - * vary depending on the targetCoordinateSpace parameter that - * you pass to the method: - * - *

Note: Use the localToGlobal() and - * globalToLocal() methods to convert the display object's local - * coordinates to display coordinates, or display coordinates to local - * coordinates, respectively.

- * - *

The getBounds() method is similar to the - * getRect() method; however, the Rectangle returned by the - * getBounds() method includes any strokes on shapes, whereas - * the Rectangle returned by the getRect() method does not. For - * an example, see the description of the getRect() method.

- * - * @param targetCoordinateSpace The display object that defines the - * coordinate system to use. - * @return The rectangle that defines the area of the display object relative - * to the targetCoordinateSpace object's coordinate - * system. - */ - public getBounds(targetCoordinateSpace:DisplayObject):away.geom.Rectangle - { - return this._bounds; //TODO - } - - /** - * Returns a rectangle that defines the boundary of the display object, based - * on the coordinate system defined by the targetCoordinateSpace - * parameter, excluding any strokes on shapes. The values that the - * getRect() method returns are the same or smaller than those - * returned by the getBounds() method. - * - *

Note: Use localToGlobal() and - * globalToLocal() methods to convert the display object's local - * coordinates to Stage coordinates, or Stage coordinates to local - * coordinates, respectively.

- * - * @param targetCoordinateSpace The display object that defines the - * coordinate system to use. - * @return The rectangle that defines the area of the display object relative - * to the targetCoordinateSpace object's coordinate - * system. - */ - public getRect(targetCoordinateSpace:DisplayObject):away.geom.Rectangle - { - return this._bounds; //TODO - } - - /** - * Converts the point object from the Stage(global) coordinates - * to the display object's(local) coordinates. - * - *

To use this method, first create an instance of the Point class. The - * x and y values that you assign represent global coordinates - * because they relate to the origin(0,0) of the main display area. Then - * pass the Point instance as the parameter to the - * globalToLocal() method. The method returns a new Point object - * with x and y values that relate to the origin of the display - * object instead of the origin of the Stage.

- * - * @param point An object created with the Point class. The Point object - * specifies the x and y coordinates as - * properties. - * @return A Point object with coordinates relative to the display object. - */ - public globalToLocal(point:away.geom.Point):away.geom.Point - { - return point; //TODO - } - - /** - * Converts a two-dimensional point from the Stage(global) coordinates to a - * three-dimensional display object's(local) coordinates. - * - *

To use this method, first create an instance of the Point class. The x - * and y values that you assign to the Point object represent global - * coordinates because they are relative to the origin(0,0) of the main - * display area. Then pass the Point object to the - * globalToLocal3D() method as the point parameter. - * The method returns three-dimensional coordinates as a Vector3D object - * containing x, y, and z values that - * are relative to the origin of the three-dimensional display object.

- * - * @param point A two dimensional Point object representing global x and y - * coordinates. - * @return A Vector3D object with coordinates relative to the - * three-dimensional display object. - */ - public globalToLocal3D(point:away.geom.Point):away.geom.Vector3D - { - return new away.geom.Vector3D(); //TODO - } - - /** - * Evaluates the bounding box of the display object to see if it overlaps or - * intersects with the bounding box of the obj display object. - * - * @param obj The display object to test against. - * @return true if the bounding boxes of the display objects - * intersect; false if not. - */ - public hitTestObject(obj:DisplayObject):boolean - { - return false; //TODO - } - - /** - * Evaluates the display object to see if it overlaps or intersects with the - * point specified by the x and y parameters. The - * x and y parameters specify a point in the - * coordinate space of the Stage, not the display object container that - * contains the display object(unless that display object container is the - * Stage). - * - * @param x The x coordinate to test against this object. - * @param y The y coordinate to test against this object. - * @param shapeFlag Whether to check against the actual pixels of the object - * (true) or the bounding box - * (false). - * @return true if the display object overlaps or intersects - * with the specified point; false otherwise. - */ - public hitTestPoint(x:number, y:number, shapeFlag:boolean = false):boolean - { - return false; //TODO - } - - /** - * @inheritDoc - */ - public isIntersectingRay(rayPosition:away.geom.Vector3D, rayDirection:away.geom.Vector3D):boolean - { - var localRayPosition:away.geom.Vector3D = this.inverseSceneTransform.transformVector(rayPosition); - var localRayDirection:away.geom.Vector3D = this.inverseSceneTransform.deltaTransformVector(rayDirection); - var pickingCollisionVO:away.pick.PickingCollisionVO = this._iPickingCollisionVO; - - if (!pickingCollisionVO.localNormal) - pickingCollisionVO.localNormal = new away.geom.Vector3D(); - - var rayEntryDistance:number = this.bounds.rayIntersection(localRayPosition, localRayDirection, pickingCollisionVO.localNormal); - - if (rayEntryDistance < 0) - return false; - - pickingCollisionVO.rayEntryDistance = rayEntryDistance; - pickingCollisionVO.localRayPosition = localRayPosition; - pickingCollisionVO.localRayDirection = localRayDirection; - pickingCollisionVO.rayPosition = rayPosition; - pickingCollisionVO.rayDirection = rayDirection; - pickingCollisionVO.rayOriginIsInsideBounds = rayEntryDistance == 0; - - return true; - } - - /** - * Converts a three-dimensional point of the three-dimensional display - * object's(local) coordinates to a two-dimensional point in the Stage - * (global) coordinates. - * - *

For example, you can only use two-dimensional coordinates(x,y) to draw - * with the display.Graphics methods. To draw a - * three-dimensional object, you need to map the three-dimensional - * coordinates of a display object to two-dimensional coordinates. First, - * create an instance of the Vector3D class that holds the x-, y-, and z- - * coordinates of the three-dimensional display object. Then pass the - * Vector3D object to the local3DToGlobal() method as the - * point3d parameter. The method returns a two-dimensional Point - * object that can be used with the Graphics API to draw the - * three-dimensional object.

- * - * @param point3d A Vector3D object containing either a three-dimensional - * point or the coordinates of the three-dimensional display - * object. - * @return A two-dimensional point representing a three-dimensional point in - * two-dimensional space. - */ - public local3DToGlobal(point3d:away.geom.Vector3D):away.geom.Point - { - return new away.geom.Point(); //TODO - } - - /** - * Rotates the 3d object around to face a point defined relative to the local coordinates of the parent ObjectContainer3D. - * - * @param target The vector defining the point to be looked at - * @param upAxis An optional vector used to define the desired up orientation of the 3d object after rotation has occurred - */ - public lookAt(target:away.geom.Vector3D, upAxis:away.geom.Vector3D = null) - { - - var yAxis:away.geom.Vector3D; - var zAxis:away.geom.Vector3D; - var xAxis:away.geom.Vector3D; - var raw:Array; - - if (upAxis == null) - upAxis = away.geom.Vector3D.Y_AXIS; - else - upAxis.normalize(); - - zAxis = target.subtract(this._iMatrix3D.position); - zAxis.normalize(); - - xAxis = upAxis.crossProduct(zAxis); - xAxis.normalize(); - - if (xAxis.length < 0.05) { - xAxis.x = upAxis.y; - xAxis.y = upAxis.x; - xAxis.z = 0; - xAxis.normalize(); - } - - yAxis = zAxis.crossProduct(xAxis); - - raw = away.geom.Matrix3DUtils.RAW_DATA_CONTAINER; - - raw[0] = xAxis.x; - raw[1] = xAxis.y; - raw[2] = xAxis.z; - raw[3] = 0; - - raw[4] = yAxis.x; - raw[5] = yAxis.y; - raw[6] = yAxis.z; - raw[7] = 0; - - raw[8] = zAxis.x; - raw[9] = zAxis.y; - raw[10] = zAxis.z; - raw[11] = 0; - - var m:away.geom.Matrix3D = new away.geom.Matrix3D(); - m.copyRawDataFrom(raw); - - var vec:away.geom.Vector3D = m.decompose()[1]; - - this._rotationX = vec.x; - this._rotationY = vec.y; - this._rotationZ = vec.z; - - this.invalidateRotation(); - } - - /** - * Converts the point object from the display object's(local) - * coordinates to the Stage(global) coordinates. - * - *

This method allows you to convert any given x and y - * coordinates from values that are relative to the origin(0,0) of a - * specific display object(local coordinates) to values that are relative to - * the origin of the Stage(global coordinates).

- * - *

To use this method, first create an instance of the Point class. The - * x and y values that you assign represent local coordinates - * because they relate to the origin of the display object.

- * - *

You then pass the Point instance that you created as the parameter to - * the localToGlobal() method. The method returns a new Point - * object with x and y values that relate to the origin of the - * Stage instead of the origin of the display object.

- * - * @param point The name or identifier of a point created with the Point - * class, specifying the x and y coordinates as - * properties. - * @return A Point object with coordinates relative to the Stage. - */ - public localToGlobal(point:away.geom.Point):away.geom.Point - { - return new away.geom.Point(); //TODO - } - - /** - * Moves the 3d object directly to a point in space - * - * @param dx The amount of movement along the local x axis. - * @param dy The amount of movement along the local y axis. - * @param dz The amount of movement along the local z axis. - */ - - public moveTo(dx:number, dy:number, dz:number) - { - if (this._x == dx && this._y == dy && this._z == dz) - return; - - this._x = dx; - this._y = dy; - this._z = dz; - - this.invalidatePosition(); - } - - /** - * Moves the local point around which the object rotates. - * - * @param dx The amount of movement along the local x axis. - * @param dy The amount of movement along the local y axis. - * @param dz The amount of movement along the local z axis. - */ - public movePivot(dx:number, dy:number, dz:number) - { - if (this._pivot == null) - this._pivot = new away.geom.Vector3D(); - - this._pivot.x += dx; - this._pivot.y += dy; - this._pivot.z += dz; - - this.invalidatePivot(); - } - - /** - * Rotates the 3d object around it's local x-axis - * - * @param angle The amount of rotation in degrees - */ - public pitch(angle:number) - { - this.rotate(away.geom.Vector3D.X_AXIS, angle); - } - - /** - * - */ - public getRenderSceneTransform(camera:away.entities.Camera):away.geom.Matrix3D - { - if (this.orientationMode == OrientationMode.CAMERA_PLANE) { - var comps:away.geom.Vector3D[] = camera.sceneTransform.decompose(); - var scale:away.geom.Vector3D = comps[2]; - comps[0] = this.scenePosition; - scale.x = this._pScaleX; - scale.y = this._pScaleY; - scale.z = this._pScaleZ; - this._orientationMatrix.recompose(comps); - - //add in case of pivot - if (!this._pivotZero && this.alignmentMode == AlignmentMode.PIVOT_POINT) - this._orientationMatrix.prependTranslation(-this._pivot.x/this._pScaleX, -this._pivot.y/this._pScaleY, -this._pivot.z/this._pScaleZ); - - return this._orientationMatrix; - } - - return this.sceneTransform; - } - - /** - * Rotates the 3d object around it's local z-axis - * - * @param angle The amount of rotation in degrees - */ - public roll(angle:number) - { - this.rotate(away.geom.Vector3D.Z_AXIS, angle); - } - - /** - * Rotates the 3d object around an axis by a defined angle - * - * @param axis The vector defining the axis of rotation - * @param angle The amount of rotation in degrees - */ - public rotate(axis:away.geom.Vector3D, angle:number) - { - var m:away.geom.Matrix3D = new away.geom.Matrix3D(); - m.prependRotation(angle, axis); - - var vec:away.geom.Vector3D = m.decompose()[1]; - - this._rotationX += vec.x; - this._rotationY += vec.y; - this._rotationZ += vec.z; - - this.invalidateRotation(); - } - - /** - * Rotates the 3d object directly to a euler angle - * - * @param ax The angle in degrees of the rotation around the x axis. - * @param ay The angle in degrees of the rotation around the y axis. - * @param az The angle in degrees of the rotation around the z axis. - */ - public rotateTo(ax:number, ay:number, az:number) - { - this._rotationX = ax*away.geom.MathConsts.DEGREES_TO_RADIANS; - this._rotationY = ay*away.geom.MathConsts.DEGREES_TO_RADIANS; - this._rotationZ = az*away.geom.MathConsts.DEGREES_TO_RADIANS; - - this.invalidateRotation(); - } - - /** - * - */ - public removeEventListener(type:string, listener:Function) - { - super.removeEventListener(type, listener); - - if (this.hasEventListener(type, listener)) - return; - - switch (type) { - case away.events.DisplayObjectEvent.POSITION_CHANGED: - this._listenToPositionChanged = false; - break; - - case away.events.DisplayObjectEvent.ROTATION_CHANGED: - this._listenToRotationChanged = false; - break; - - case away.events.DisplayObjectEvent.SCALE_CHANGED: - this._listenToScaleChanged = false; - break; - } - } - - /** - * Moves the 3d object along a vector by a defined length - * - * @param axis The vector defining the axis of movement - * @param distance The length of the movement - */ - public translate(axis:away.geom.Vector3D, distance:number) - { - var x:number = axis.x, y:number = axis.y, z:number = axis.z; - var len:number = distance/Math.sqrt(x*x + y*y + z*z); - - this._x += x*len; - this._y += y*len; - this._z += z*len; - - this.invalidatePosition(); - } - - /** - * Moves the 3d object along a vector by a defined length - * - * @param axis The vector defining the axis of movement - * @param distance The length of the movement - */ - public translateLocal(axis:away.geom.Vector3D, distance:number) - { - var x:number = axis.x, y:number = axis.y, z:number = axis.z; - var len:number = distance/Math.sqrt(x*x + y*y + z*z); - - this._iMatrix3D.prependTranslation(x*len, y*len, z*len); - - this._matrix3D.copyColumnTo(3, this._pos); - - this._x = this._pos.x; - this._y = this._pos.y; - this._z = this._pos.z; - - this.invalidatePosition(); - } - - /** - * Rotates the 3d object around it's local y-axis - * - * @param angle The amount of rotation in degrees - */ - public yaw(angle:number) - { - this.rotate(away.geom.Vector3D.Y_AXIS, angle); - } - - /** - * @internal - */ - public _iController:away.controllers.ControllerBase; - - /** - * @internal - */ - public get _iAssignedPartition():away.partition.Partition - { - return this._pImplicitPartition; - } - - /** - * The transformation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - * - * @internal - */ - public get _iMatrix3D():away.geom.Matrix3D - { - if (this._matrix3DDirty) - this._pUpdateMatrix3D(); - - return this._matrix3D; - } - - public set _iMatrix3D(val:away.geom.Matrix3D) - { - - // TODO: From AS3 - Do we still need this in JS ? - //ridiculous matrix error - /* - if (!val.rawData[0]) { - - var raw:number[] = away.geom.Matrix3DUtils.RAW_DATA_CONTAINER; - val.copyRawDataTo(raw); - raw[0] = this._smallestNumber; - val.copyRawDataFrom(raw); - } - //*/ - var elements:away.geom.Vector3D[] = val.decompose(); - var vec:away.geom.Vector3D; - - vec = elements[0]; - - if (this._x != vec.x || this._y != vec.y || this._z != vec.z) { - this._x = vec.x; - this._y = vec.y; - this._z = vec.z; - - this.invalidatePosition(); - } - - vec = elements[1]; - - if (this._rotationX != vec.x || this._rotationY != vec.y || this._rotationZ != vec.z) { - this._rotationX = vec.x; - this._rotationY = vec.y; - this._rotationZ = vec.z; - - this.invalidateRotation(); - } - - vec = elements[2]; - - if (this._pScaleX != vec.x || this._pScaleY != vec.y || this._pScaleZ != vec.z) { - this._pScaleX = vec.x; - this._pScaleY = vec.y; - this._pScaleZ = vec.z; - - this.invalidateScale(); - } - } - - /** - * @internal - */ - public get _iPickingCollisionVO():away.pick.PickingCollisionVO - { - if (!this._pPickingCollisionVO) - this._pPickingCollisionVO = new away.pick.PickingCollisionVO(this); - - return this._pPickingCollisionVO; - } - - /** - * @internal - */ - public iSetParent(value:away.containers.DisplayObjectContainer) - { - this._pParent = value; - - if (value) { - this._pUpdateImplicitMouseEnabled(value.mouseChildren); - this._pUpdateImplicitVisibility(value._iIsVisible()); - this._pUpdateImplicitPartition(value._iAssignedPartition); - this._iSetScene(value._pScene); - } else { - this._pUpdateImplicitMouseEnabled(true); - this._pUpdateImplicitVisibility(true); - this._pUpdateImplicitPartition(null); - - this._iSetScene(null); - } - } - - /** - * @protected - */ - public pCreateDefaultBoundingVolume():away.bounds.BoundingVolumeBase - { - // point lights should be using sphere bounds - // directional lights should be using null bounds - return new away.bounds.AxisAlignedBoundingBox(); - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():away.partition.EntityNode - { - throw new away.errors.AbstractMethodError(); - } - - /** - * @protected - */ - public pInvalidateBounds() - { - this._pBoundsInvalid = true; - this._worldBoundsInvalid = true; - - - if (this.isEntity) - this.invalidatePartition(); - } - - /** - * @protected - */ - public pInvalidateSceneTransform() - { - this._pSceneTransformDirty = !this._pIgnoreTransform; - this._inverseSceneTransformDirty = !this._pIgnoreTransform; - this._scenePositionDirty = !this._pIgnoreTransform; - - this._worldBoundsInvalid = !this._pIgnoreTransform; - - if (this.isEntity) - this.invalidatePartition(); - - if (this._listenToSceneTransformChanged) - this.notifySceneTransformChange(); - } - - /** - * @protected - */ - public pUpdateBounds() - { - this._width = this._pBounds.aabb.width*this._pScaleX; - this._height = this._pBounds.aabb.height*this._pScaleY; - this._depth = this._pBounds.aabb.depth*this._pScaleZ; - - this._pBoundsInvalid = false; - } - - /** - * @protected - */ - public _pUpdateImplicitMouseEnabled(value:boolean) - { - this._pImplicitMouseEnabled = this._explicitMouseEnabled && value; - - // If there is a parent and this child does not have a picking collider, use its parent's picking collider. - if (this._pImplicitMouseEnabled && this._pParent && !this._pPickingCollider) - this._pPickingCollider = this._pParent._pPickingCollider; - } - - /** - * @protected - */ - public _pUpdateImplicitPartition(value:away.partition.Partition) - { - // assign parent implicit partition if no explicit one is given - this._pImplicitPartition = this._explicitPartition || value; - } - - /** - * @protected - */ - public _pUpdateImplicitVisibility(value:boolean) - { - this._pImplicitVisibility = this._explicitVisibility && value; - } - - /** - * @protected - */ - public _pUpdateMatrix3D() - { - - this._pos.x = this._x; - this._pos.y = this._y; - this._pos.z = this._z; - - this._rot.x = this._rotationX; - this._rot.y = this._rotationY; - this._rot.z = this._rotationZ; - - this._sca.x = this._pScaleX; - this._sca.y = this._pScaleY; - this._sca.z = this._pScaleZ; - - this._matrix3D.recompose(this._transformComponents); - - if (!this._pivotZero) { - this._matrix3D.prependTranslation(-this._pivot.x/this._pScaleX, -this._pivot.y/this._pScaleY, -this._pivot.z/this._pScaleZ); - if (this.alignmentMode != AlignmentMode.PIVOT_POINT) - this._matrix3D.appendTranslation(this._pivot.x, this._pivot.y, this._pivot.z); - } - - this._matrix3DDirty = false; - this._positionDirty = false; - this._rotationDirty = false; - this._scaleDirty = false; - this._pivotDirty = false; - } - - /** - * @protected - */ - public pUpdateSceneTransform() - { - if (this._pParent && !this._pParent._iIsRoot) { - this._pSceneTransform.copyFrom(this._pParent.sceneTransform); - this._pSceneTransform.prepend(this._iMatrix3D); - } else { - this._pSceneTransform.copyFrom(this._iMatrix3D); - } - - this._pSceneTransformDirty = false; - } - - public _iAddRenderable(renderable:away.pool.IRenderable):away.pool.IRenderable - { - this._pRenderables.push(renderable); - - return renderable; - } - - - public _iRemoveRenderable(renderable:away.pool.IRenderable):away.pool.IRenderable - { - var index:number = this._pRenderables.indexOf(renderable); - - this._pRenderables.splice(index, 1); - - return renderable; - } - - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - public _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean - { - return false; - } - - /** - * - */ - public _iInternalUpdate() - { - if (this._iController) - this._iController.update(); - } - - /** - * @internal - */ - public _iIsVisible():boolean - { - return this._pImplicitVisibility; - } - - /** - * @internal - */ - public _iIsMouseEnabled():boolean - { - return this._pImplicitMouseEnabled; - } - - /** - * @internal - */ - public _iSetScene(value:away.containers.Scene) - { - // test to see if we're switching roots while we're already using a scene partition - /* - if (value == null) - this._oldScene = this._pScene; - - if (this._explicitPartition && this._oldScene && this._oldScene != this._pScene) - this.partition = null; - - if (value) - this._oldScene = null; - - // end of stupid partition test code - //*/ - - if (this._pScene == value) - return; - - this._pUpdateScene(value); - - if (!this._pSceneTransformDirty && !this._pIgnoreTransform) - this.pInvalidateSceneTransform(); - } - - /** - * @protected - */ - public _pUpdateScene(value:away.containers.Scene) - { - if (this._pScene) { - this._pScene.dispatchEvent(new away.events.SceneEvent(away.events.SceneEvent.REMOVED_FROM_SCENE, this)); - - //unregister entity from current scene - this._pScene.iUnregisterEntity(this); - } - - this._pScene = value; - - if (value) { - value.dispatchEvent(new away.events.SceneEvent(away.events.SceneEvent.ADDED_TO_SCENE, this)); - - //register entity with new scene - value.iRegisterEntity(this); - } - - this.notifySceneChange(); - } - - /** - * @private - */ - private notifyPositionChanged() - { - if (!this._positionChanged) - this._positionChanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.POSITION_CHANGED, this); - - this.dispatchEvent(this._positionChanged); - } - - /** - * @private - */ - private notifyRotationChanged() - { - if (!this._rotationChanged) - this._rotationChanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.ROTATION_CHANGED, this); - - this.dispatchEvent(this._rotationChanged); - } - - /** - * @private - */ - private notifyScaleChanged() - { - if (!this._scaleChanged) - this._scaleChanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCALE_CHANGED, this); - - this.dispatchEvent(this._scaleChanged); - } - - /** - * @private - */ - private notifySceneChange() - { - if (this._listenToSceneChanged) { - if (!this._scenechanged) - this._scenechanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCENE_CHANGED, this); - - this.dispatchEvent(this._scenechanged); - } - } - - /** - * @private - */ - private notifySceneTransformChange() - { - if (!this._sceneTransformChanged) - this._sceneTransformChanged = new away.events.DisplayObjectEvent(away.events.DisplayObjectEvent.SCENETRANSFORM_CHANGED, this); - - this.dispatchEvent(this._sceneTransformChanged); - } - - /** - * Invalidates the 3D transformation matrix, causing it to be updated upon the next request - * - * @private - */ - private invalidateMatrix3D():void - { - if (this._matrix3DDirty) - return; - - this._matrix3DDirty = true; - - if (!this._pSceneTransformDirty && !this._pIgnoreTransform) - this.pInvalidateSceneTransform(); - } - - /** - * @private - */ - private invalidatePartition() - { - if (this._iAssignedPartition) - this._iAssignedPartition.iMarkForUpdate(this); - } - - /** - * @private - */ - private invalidatePivot() - { - this._pivotZero = (this._pivot.x == 0) && (this._pivot.y == 0) && (this._pivot.z == 0); - - if (this._pivotDirty) - return; - - this._pivotDirty = true; - - this.invalidateMatrix3D(); - } - - /** - * @private - */ - private invalidatePosition() - { - if (this._positionDirty) - return; - - this._positionDirty = true; - - this.invalidateMatrix3D(); - - if (this._listenToPositionChanged) - this.notifyPositionChanged(); - } - - /** - * @private - */ - private invalidateRotation() - { - if (this._rotationDirty) - return; - - this._rotationDirty = true; - - this.invalidateMatrix3D(); - - if (this._listenToRotationChanged) - this.notifyRotationChanged(); - } - - /** - * @private - */ - private invalidateScale() - { - if (this._scaleDirty) - return; - - this._scaleDirty = true; - - this.invalidateMatrix3D(); - - if (this._listenToScaleChanged) - this.notifyScaleChanged(); - } - } -} diff --git a/src/away/core/base/Geometry.ts b/src/away/core/base/Geometry.ts deleted file mode 100644 index 06ce0578..00000000 --- a/src/away/core/base/Geometry.ts +++ /dev/null @@ -1,152 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - /** - * - * Geometry is a collection of SubGeometries, each of which contain the actual geometrical data such as vertices, - * normals, uvs, etc. It also contains a reference to an animation class, which defines how the geometry moves. - * A Geometry object is assigned to a Mesh, a scene graph occurence of the geometry, which in turn assigns - * the SubGeometries to its respective TriangleSubMesh objects. - * - * - * - * @see away.core.base.SubGeometry - * @see away.entities.Mesh - * - * @class away.base.Geometry - */ - export class Geometry extends away.library.NamedAssetBase implements away.library.IAsset - { - private _subGeometries:away.base.SubGeometryBase[];//Vector.;//private var _subGeometries:Vector.; - - public get assetType():string - { - return away.library.AssetType.GEOMETRY; - } - - /** - * A collection of TriangleSubGeometry objects, each of which contain geometrical data such as vertices, normals, etc. - */ - public get subGeometries():away.base.SubGeometryBase[]//Vector. - { - return this._subGeometries; - } - - public getSubGeometries():away.base.SubGeometryBase[]//Vector. - { - return this._subGeometries; - } - - /** - * Creates a new Geometry object. - */ - constructor() - { - super(); - - this._subGeometries = new Array(); - } - - public applyTransformation(transform:away.geom.Matrix3D) - { - var len:number = this._subGeometries.length; - for (var i:number = 0; i < len; ++i) - this._subGeometries[i].applyTransformation(transform); - } - - /** - * Adds a new TriangleSubGeometry object to the list. - * @param subGeometry The TriangleSubGeometry object to be added. - */ - public addSubGeometry(subGeometry:away.base.SubGeometryBase) - { - this._subGeometries.push(subGeometry); - - subGeometry.parentGeometry = this; - - if (this.hasEventListener(away.events.GeometryEvent.SUB_GEOMETRY_ADDED)) - this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.SUB_GEOMETRY_ADDED, subGeometry)); - - this.iInvalidateBounds(subGeometry); - } - - /** - * Removes a new TriangleSubGeometry object from the list. - * @param subGeometry The TriangleSubGeometry object to be removed. - */ - public removeSubGeometry(subGeometry:SubGeometryBase) - { - this._subGeometries.splice(this._subGeometries.indexOf(subGeometry), 1); - - subGeometry.parentGeometry = null; - - if (this.hasEventListener(away.events.GeometryEvent.SUB_GEOMETRY_REMOVED)) - this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.SUB_GEOMETRY_REMOVED, subGeometry)); - - this.iInvalidateBounds(subGeometry); - } - - /** - * Clones the geometry. - * @return An exact duplicate of the current Geometry object. - */ - public clone():Geometry - { - var clone:Geometry = new Geometry(); - var len:number = this._subGeometries.length; - - for (var i:number = 0; i < len; ++i) - clone.addSubGeometry(this._subGeometries[i].clone()); - - return clone; - } - - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - public scale(scale:number) - { - var numSubGeoms:number = this._subGeometries.length; - for (var i:number = 0; i < numSubGeoms; ++i) - this._subGeometries[i].scale(scale); - } - - /** - * Clears all resources used by the Geometry object, including SubGeometries. - */ - public dispose() - { - var numSubGeoms:number = this._subGeometries.length; - - for (var i:number = 0; i < numSubGeoms; ++i) { - var subGeom:SubGeometryBase = this._subGeometries[0]; - this.removeSubGeometry(subGeom); - subGeom.dispose(); - } - } - - /** - * Scales the uv coordinates (tiling) - * @param scaleU The amount by which to scale on the u axis. Default is 1; - * @param scaleV The amount by which to scale on the v axis. Default is 1; - */ - public scaleUV(scaleU:number = 1, scaleV:number = 1) - { - var numSubGeoms:number = this._subGeometries.length; - - for (var i:number = 0; i < numSubGeoms; ++i) - this._subGeometries[i].scaleUV(scaleU, scaleV); - } - - public iInvalidateBounds(subGeom:SubGeometryBase) - { - if (this.hasEventListener(away.events.GeometryEvent.BOUNDS_INVALID)) - this.dispatchEvent(new away.events.GeometryEvent(away.events.GeometryEvent.BOUNDS_INVALID, subGeom)); - } - } -} diff --git a/src/away/core/base/GradientType.ts b/src/away/core/base/GradientType.ts deleted file mode 100644 index b5531aad..00000000 --- a/src/away/core/base/GradientType.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// - -/** - * The GradientType class provides values for the type parameter - * in the beginGradientFill() and - * lineGradientStyle() methods of the flash.display.Graphics - * class. - */ -module away.base -{ - export class GradientType - { - /** - * Value used to specify a linear gradient fill. - */ - public static LINEAR:string = "linear"; - - /** - * Value used to specify a radial gradient fill. - */ - public static RADIAL:string = "radial"; - } -} diff --git a/src/away/core/base/Graphics.ts b/src/away/core/base/Graphics.ts deleted file mode 100644 index 67836da8..00000000 --- a/src/away/core/base/Graphics.ts +++ /dev/null @@ -1,860 +0,0 @@ -/// - -/** - * The Graphics class contains a set of methods that you can use to create a - * vector shape. Display objects that support drawing include Sprite and Shape - * objects. Each of these classes includes a graphics property - * that is a Graphics object. The following are among those helper functions - * provided for ease of use: drawRect(), - * drawRoundRect(), drawCircle(), and - * drawEllipse(). - * - *

You cannot create a Graphics object directly from ActionScript code. If - * you call new Graphics(), an exception is thrown.

- * - *

The Graphics class is final; it cannot be subclassed.

- */ -module away.base -{ - export class Graphics - { - /** - * Fills a drawing area with a bitmap image. The bitmap can be repeated or - * tiled to fill the area. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param bitmap A transparent or opaque bitmap image that contains the bits - * to be displayed. - * @param matrix A matrix object(of the flash.geom.Matrix class), which you - * can use to define transformations on the bitmap. For - * example, you can use the following matrix to rotate a bitmap - * by 45 degrees(pi/4 radians): - * @param repeat If true, the bitmap image repeats in a tiled - * pattern. If false, the bitmap image does not - * repeat, and the edges of the bitmap are used for any fill - * area that extends beyond the bitmap. - * - *

For example, consider the following bitmap(a 20 x - * 20-pixel checkerboard pattern):

- * - *

When repeat is set to true(as - * in the following example), the bitmap fill repeats the - * bitmap:

- * - *

When repeat is set to false, - * the bitmap fill uses the edge pixels for the fill area - * outside the bitmap:

- * @param smooth If false, upscaled bitmap images are rendered - * by using a nearest-neighbor algorithm and look pixelated. If - * true, upscaled bitmap images are rendered by - * using a bilinear algorithm. Rendering by using the nearest - * neighbor algorithm is faster. - */ - public beginBitmapFill(bitmap:BitmapData, matrix:away.geom.Matrix = null, repeat:boolean = true, smooth:boolean = false) - { - - } - - /** - * Specifies a simple one-color fill that subsequent calls to other Graphics - * methods(such as lineTo() or drawCircle()) use - * when drawing. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param color The color of the fill(0xRRGGBB). - * @param alpha The alpha value of the fill(0.0 to 1.0). - */ - public beginFill(color:number /*int*/, alpha:number = 1) - { - - } - - /** - * Specifies a gradient fill used by subsequent calls to other Graphics - * methods(such as lineTo() or drawCircle()) for - * the object. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - * @param type A value from the GradientType class that - * specifies which gradient type to use: - * GradientType.LINEAR or - * GradientType.RADIAL. - * @param colors An array of RGB hexadecimal color values used - * in the gradient; for example, red is 0xFF0000, - * blue is 0x0000FF, and so on. You can specify - * up to 15 colors. For each color, specify a - * corresponding value in the alphas and ratios - * parameters. - * @param alphas An array of alpha values for the corresponding - * colors in the colors array; valid values are 0 - * to 1. If the value is less than 0, the default - * is 0. If the value is greater than 1, the - * default is 1. - * @param ratios An array of color distribution ratios; valid - * values are 0-255. This value defines the - * percentage of the width where the color is - * sampled at 100%. The value 0 represents the - * left position in the gradient box, and 255 - * represents the right position in the gradient - * box. - * @param matrix A transformation matrix as defined by the - * flash.geom.Matrix class. The flash.geom.Matrix - * class includes a - * createGradientBox() method, which - * lets you conveniently set up the matrix for use - * with the beginGradientFill() - * method. - * @param spreadMethod A value from the SpreadMethod class that - * specifies which spread method to use, either: - * SpreadMethod.PAD, - * SpreadMethod.REFLECT, or - * SpreadMethod.REPEAT. - * - *

For example, consider a simple linear - * gradient between two colors:

- * - *

This example uses - * SpreadMethod.PAD for the spread - * method, and the gradient fill looks like the - * following:

- * - *

If you use SpreadMethod.REFLECT - * for the spread method, the gradient fill looks - * like the following:

- * - *

If you use SpreadMethod.REPEAT - * for the spread method, the gradient fill looks - * like the following:

- * @param interpolationMethod A value from the InterpolationMethod class that - * specifies which value to use: - * InterpolationMethod.LINEAR_RGB or - * InterpolationMethod.RGB - * - *

For example, consider a simple linear - * gradient between two colors(with the - * spreadMethod parameter set to - * SpreadMethod.REFLECT). The - * different interpolation methods affect the - * appearance as follows:

- * @param focalPointRatio A number that controls the location of the - * focal point of the gradient. 0 means that the - * focal point is in the center. 1 means that the - * focal point is at one border of the gradient - * circle. -1 means that the focal point is at the - * other border of the gradient circle. A value - * less than -1 or greater than 1 is rounded to -1 - * or 1. For example, the following example shows - * a focalPointRatio set to 0.75: - * @throws ArgumentError If the type parameter is not valid. - */ - public beginGradientFill(type:GradientType, colors:Array, alphas:Array, ratios:Array, matrix:away.geom.Matrix = null, spreadMethod:string = "pad", interpolationMethod:string = "rgb", focalPointRatio:number = 0) - { - - } - - /** - * Specifies a shader fill used by subsequent calls to other Graphics methods - * (such as lineTo() or drawCircle()) for the - * object. The fill remains in effect until you call the - * beginFill(), beginBitmapFill(), - * beginGradientFill(), or beginShaderFill() - * method. Calling the clear() method clears the fill. - * - *

The application renders the fill whenever three or more points are - * drawn, or when the endFill() method is called.

- * - *

Shader fills are not supported under GPU rendering; filled areas will - * be colored cyan.

- * - * @param shader The shader to use for the fill. This Shader instance is not - * required to specify an image input. However, if an image - * input is specified in the shader, the input must be provided - * manually. To specify the input, set the input - * property of the corresponding ShaderInput property of the - * Shader.data property. - * - *

When you pass a Shader instance as an argument the shader - * is copied internally. The drawing fill operation uses that - * internal copy, not a reference to the original shader. Any - * changes made to the shader, such as changing a parameter - * value, input, or bytecode, are not applied to the copied - * shader that's used for the fill.

- * @param matrix A matrix object(of the flash.geom.Matrix class), which you - * can use to define transformations on the shader. For - * example, you can use the following matrix to rotate a shader - * by 45 degrees(pi/4 radians): - * - *

The coordinates received in the shader are based on the - * matrix that is specified for the matrix - * parameter. For a default(null) matrix, the - * coordinates in the shader are local pixel coordinates which - * can be used to sample an input.

- * @throws ArgumentError When the shader output type is not compatible with - * this operation(the shader must specify a - * pixel3 or pixel4 output). - * @throws ArgumentError When the shader specifies an image input that isn't - * provided. - * @throws ArgumentError When a ByteArray or Vector. instance is used - * as an input and the width and - * height properties aren't specified for - * the ShaderInput, or the specified values don't match - * the amount of data in the input object. See the - * ShaderInput.input property for more - * information. - */ -// public beginShaderFill(shader:Shader, matrix:away.geom.Matrix = null) -// { -// -// } - - /** - * Clears the graphics that were drawn to this Graphics object, and resets - * fill and line style settings. - * - */ - public clear() - { - - } - - /** - * Copies all of drawing commands from the source Graphics object into the - * calling Graphics object. - * - * @param sourceGraphics The Graphics object from which to copy the drawing - * commands. - */ - public copyFrom(sourceGraphics:Graphics) - { - - } - - /** - * Draws a cubic Bezier curve from the current drawing position to the - * specified anchor point. Cubic Bezier curves consist of two anchor points - * and two control points. The curve interpolates the two anchor points and - * curves toward the two control points. - * - * The four points you use to draw a cubic Bezier curve with the - * cubicCurveTo() method are as follows: - * - *
    - *
  • The current drawing position is the first anchor point.
  • - *
  • The anchorX and anchorY parameters specify the second anchor point. - *
  • - *
  • The controlX1 and controlY1 parameters - * specify the first control point.
  • - *
  • The controlX2 and controlY2 parameters - * specify the second control point.
  • - *
- * - * If you call the cubicCurveTo() method before calling the - * moveTo() method, your curve starts at position (0, 0). - * - * If the cubicCurveTo() method succeeds, the Flash runtime sets - * the current drawing position to (anchorX, - * anchorY). If the cubicCurveTo() method fails, - * the current drawing position remains unchanged. - * - * If your movie clip contains content created with the Flash drawing tools, - * the results of calls to the cubicCurveTo() method are drawn - * underneath that content. - * - * @param controlX1 Specifies the horizontal position of the first control - * point relative to the registration point of the parent - * display object. - * @param controlY1 Specifies the vertical position of the first control - * point relative to the registration point of the parent - * display object. - * @param controlX2 Specifies the horizontal position of the second control - * point relative to the registration point of the parent - * display object. - * @param controlY2 Specifies the vertical position of the second control - * point relative to the registration point of the parent - * display object. - * @param anchorX Specifies the horizontal position of the anchor point - * relative to the registration point of the parent display - * object. - * @param anchorY Specifies the vertical position of the anchor point - * relative to the registration point of the parent display - * object. - */ - public cubicCurveTo(controlX1:number, controlY1:number, controlX2:number, controlY2:number, anchorX:number, anchorY:number) - { - - } - - /** - * Draws a curve using the current line style from the current drawing - * position to(anchorX, anchorY) and using the control point that - * (controlX, controlY) specifies. The current - * drawing position is then set to(anchorX, - * anchorY). If the movie clip in which you are drawing contains - * content created with the Flash drawing tools, calls to the - * curveTo() method are drawn underneath this content. If you - * call the curveTo() method before any calls to the - * moveTo() method, the default of the current drawing position - * is(0, 0). If any of the parameters are missing, this method fails and the - * current drawing position is not changed. - * - *

The curve drawn is a quadratic Bezier curve. Quadratic Bezier curves - * consist of two anchor points and one control point. The curve interpolates - * the two anchor points and curves toward the control point.

- * - * @param controlX A number that specifies the horizontal position of the - * control point relative to the registration point of the - * parent display object. - * @param controlY A number that specifies the vertical position of the - * control point relative to the registration point of the - * parent display object. - * @param anchorX A number that specifies the horizontal position of the - * next anchor point relative to the registration point of - * the parent display object. - * @param anchorY A number that specifies the vertical position of the next - * anchor point relative to the registration point of the - * parent display object. - */ - public curveTo(controlX:number, controlY:number, anchorX:number, anchorY:number) - { - - } - - /** - * Draws a circle. Set the line style, fill, or both before you call the - * drawCircle() method, by calling the linestyle(), - * lineGradientStyle(), beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. - * - * @param x The x location of the center of the circle relative - * to the registration point of the parent display object(in - * pixels). - * @param y The y location of the center of the circle relative - * to the registration point of the parent display object(in - * pixels). - * @param radius The radius of the circle(in pixels). - */ - public drawCircle(x:number, y:number, radius:number) - { - - } - - /** - * Draws an ellipse. Set the line style, fill, or both before you call the - * drawEllipse() method, by calling the - * linestyle(), lineGradientStyle(), - * beginFill(), beginGradientFill(), or - * beginBitmapFill() method. - * - * @param x The x location of the top-left of the bounding-box of - * the ellipse relative to the registration point of the parent - * display object(in pixels). - * @param y The y location of the top left of the bounding-box of - * the ellipse relative to the registration point of the parent - * display object(in pixels). - * @param width The width of the ellipse(in pixels). - * @param height The height of the ellipse(in pixels). - */ - public drawEllipse(x:number, y:number, width:number, height:number) - { - - } - - /** - * Submits a series of IGraphicsData instances for drawing. This method - * accepts a Vector containing objects including paths, fills, and strokes - * that implement the IGraphicsData interface. A Vector of IGraphicsData - * instances can refer to a part of a shape, or a complex fully defined set - * of data for rendering a complete shape. - * - *

Graphics paths can contain other graphics paths. If the - * graphicsData Vector includes a path, that path and all its - * sub-paths are rendered during this operation.

- * - */ - public drawGraphicsData(graphicsData:Array) - { - - } - - /** - * Submits a series of commands for drawing. The drawPath() - * method uses vector arrays to consolidate individual moveTo(), - * lineTo(), and curveTo() drawing commands into a - * single call. The drawPath() method parameters combine drawing - * commands with x- and y-coordinate value pairs and a drawing direction. The - * drawing commands are values from the GraphicsPathCommand class. The x- and - * y-coordinate value pairs are Numbers in an array where each pair defines a - * coordinate location. The drawing direction is a value from the - * GraphicsPathWinding class. - * - *

Generally, drawings render faster with drawPath() than - * with a series of individual lineTo() and - * curveTo() methods.

- * - *

The drawPath() method uses a uses a floating computation - * so rotation and scaling of shapes is more accurate and gives better - * results. However, curves submitted using the drawPath() - * method can have small sub-pixel alignment errors when used in conjunction - * with the lineTo() and curveTo() methods.

- * - *

The drawPath() method also uses slightly different rules - * for filling and drawing lines. They are:

- * - *
    - *
  • When a fill is applied to rendering a path: - *
      - *
    • A sub-path of less than 3 points is not rendered.(But note that the - * stroke rendering will still occur, consistent with the rules for strokes - * below.)
    • - *
    • A sub-path that isn't closed(the end point is not equal to the - * begin point) is implicitly closed.
    • - *
    - *
  • - *
  • When a stroke is applied to rendering a path: - *
      - *
    • The sub-paths can be composed of any number of points.
    • - *
    • The sub-path is never implicitly closed.
    • - *
    - *
  • - *
- * - * @param winding Specifies the winding rule using a value defined in the - * GraphicsPathWinding class. - */ - public drawPath(commands:Array, data:Array, winding:GraphicsPathWinding) - { - - } - - /** - * Draws a rectangle. Set the line style, fill, or both before you call the - * drawRect() method, by calling the linestyle(), - * lineGradientStyle(), beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. - * - * @param x A number indicating the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number indicating the vertical position relative to the - * registration point of the parent display object(in pixels). - * @param width The width of the rectangle(in pixels). - * @param height The height of the rectangle(in pixels). - * @throws ArgumentError If the width or height - * parameters are not a number - * (Number.NaN). - */ - public drawRect(x:number, y:number, width:number, height:number) - { - - } - - /** - * Draws a rounded rectangle. Set the line style, fill, or both before you - * call the drawRoundRect() method, by calling the - * linestyle(), lineGradientStyle(), - * beginFill(), beginGradientFill(), or - * beginBitmapFill() method. - * - * @param x A number indicating the horizontal position relative - * to the registration point of the parent display - * object(in pixels). - * @param y A number indicating the vertical position relative to - * the registration point of the parent display object - * (in pixels). - * @param width The width of the round rectangle(in pixels). - * @param height The height of the round rectangle(in pixels). - * @param ellipseWidth The width of the ellipse used to draw the rounded - * corners(in pixels). - * @param ellipseHeight The height of the ellipse used to draw the rounded - * corners(in pixels). Optional; if no value is - * specified, the default value matches that provided - * for the ellipseWidth parameter. - * @throws ArgumentError If the width, height, - * ellipseWidth or - * ellipseHeight parameters are not a - * number(Number.NaN). - */ - public drawRoundRect(x:number, y:number, width:number, height:number, ellipseWidth:number, ellipseHeight:number = NaN) - { - - } - - //public drawRoundRectComplex(x:Float, y:Float, width:Float, height:Float, topLeftRadius:Float, topRightRadius:Float, bottomLeftRadius:Float, bottomRightRadius:Float):Void; - - /** - * Renders a set of triangles, typically to distort bitmaps and give them a - * three-dimensional appearance. The drawTriangles() method maps - * either the current fill, or a bitmap fill, to the triangle faces using a - * set of(u,v) coordinates. - * - *

Any type of fill can be used, but if the fill has a transform matrix - * that transform matrix is ignored.

- * - *

A uvtData parameter improves texture mapping when a - * bitmap fill is used.

- * - * @param culling Specifies whether to render triangles that face in a - * specified direction. This parameter prevents the rendering - * of triangles that cannot be seen in the current view. This - * parameter can be set to any value defined by the - * TriangleCulling class. - */ - public drawTriangles(vertices:Array, indices:Array = null, uvtData:Array = null, culling:TriangleCulling = null) - { - - } - - /** - * Applies a fill to the lines and curves that were added since the last call - * to the beginFill(), beginGradientFill(), or - * beginBitmapFill() method. Flash uses the fill that was - * specified in the previous call to the beginFill(), - * beginGradientFill(), or beginBitmapFill() - * method. If the current drawing position does not equal the previous - * position specified in a moveTo() method and a fill is - * defined, the path is closed with a line and then filled. - * - */ - public endFill() - { - - } - - /** - * Specifies a bitmap to use for the line stroke when drawing lines. - * - *

The bitmap line style is used for subsequent calls to Graphics methods - * such as the lineTo() method or the drawCircle() - * method. The line style remains in effect until you call the - * lineStyle() or lineGradientStyle() methods, or - * the lineBitmapStyle() method again with different parameters. - *

- * - *

You can call the lineBitmapStyle() method in the middle of - * drawing a path to specify different styles for different line segments - * within a path.

- * - *

Call the lineStyle() method before you call the - * lineBitmapStyle() method to enable a stroke, or else the - * value of the line style is undefined.

- * - *

Calls to the clear() method set the line style back to - * undefined.

- * - * @param bitmap The bitmap to use for the line stroke. - * @param matrix An optional transformation matrix as defined by the - * flash.geom.Matrix class. The matrix can be used to scale or - * otherwise manipulate the bitmap before applying it to the - * line style. - * @param repeat Whether to repeat the bitmap in a tiled fashion. - * @param smooth Whether smoothing should be applied to the bitmap. - */ - public lineBitmapStyle(bitmap:BitmapData, matrix:away.geom.Matrix = null, repeat:boolean = true, smooth:boolean = false) - { - - } - - /** - * Specifies a gradient to use for the stroke when drawing lines. - * - *

The gradient line style is used for subsequent calls to Graphics - * methods such as the lineTo() methods or the - * drawCircle() method. The line style remains in effect until - * you call the lineStyle() or lineBitmapStyle() - * methods, or the lineGradientStyle() method again with - * different parameters.

- * - *

You can call the lineGradientStyle() method in the middle - * of drawing a path to specify different styles for different line segments - * within a path.

- * - *

Call the lineStyle() method before you call the - * lineGradientStyle() method to enable a stroke, or else the - * value of the line style is undefined.

- * - *

Calls to the clear() method set the line style back to - * undefined.

- * - * @param type A value from the GradientType class that - * specifies which gradient type to use, either - * GradientType.LINEAR or GradientType.RADIAL. - * @param colors An array of RGB hexadecimal color values used - * in the gradient; for example, red is 0xFF0000, - * blue is 0x0000FF, and so on. You can specify - * up to 15 colors. For each color, specify a - * corresponding value in the alphas and ratios - * parameters. - * @param alphas An array of alpha values for the corresponding - * colors in the colors array; valid values are 0 - * to 1. If the value is less than 0, the default - * is 0. If the value is greater than 1, the - * default is 1. - * @param ratios An array of color distribution ratios; valid - * values are 0-255. This value defines the - * percentage of the width where the color is - * sampled at 100%. The value 0 represents the - * left position in the gradient box, and 255 - * represents the right position in the gradient - * box. - * @param matrix A transformation matrix as defined by the - * flash.geom.Matrix class. The flash.geom.Matrix - * class includes a - * createGradientBox() method, which - * lets you conveniently set up the matrix for use - * with the lineGradientStyle() - * method. - * @param spreadMethod A value from the SpreadMethod class that - * specifies which spread method to use: - * @param interpolationMethod A value from the InterpolationMethod class that - * specifies which value to use. For example, - * consider a simple linear gradient between two - * colors(with the spreadMethod - * parameter set to - * SpreadMethod.REFLECT). The - * different interpolation methods affect the - * appearance as follows: - * @param focalPointRatio A number that controls the location of the - * focal point of the gradient. The value 0 means - * the focal point is in the center. The value 1 - * means the focal point is at one border of the - * gradient circle. The value -1 means that the - * focal point is at the other border of the - * gradient circle. Values less than -1 or greater - * than 1 are rounded to -1 or 1. The following - * image shows a gradient with a - * focalPointRatio of -0.75: - */ - public lineGradientStyle(type:GradientType, colors:Array, alphas:Array, ratios:Array, matrix:away.geom.Matrix = null, spreadMethod:SpreadMethod = null, interpolationMethod:InterpolationMethod = null, focalPointRatio:number = 0) - { - - } - - /** - * Specifies a shader to use for the line stroke when drawing lines. - * - *

The shader line style is used for subsequent calls to Graphics methods - * such as the lineTo() method or the drawCircle() - * method. The line style remains in effect until you call the - * lineStyle() or lineGradientStyle() methods, or - * the lineBitmapStyle() method again with different parameters. - *

- * - *

You can call the lineShaderStyle() method in the middle of - * drawing a path to specify different styles for different line segments - * within a path.

- * - *

Call the lineStyle() method before you call the - * lineShaderStyle() method to enable a stroke, or else the - * value of the line style is undefined.

- * - *

Calls to the clear() method set the line style back to - * undefined.

- * - * @param shader The shader to use for the line stroke. - * @param matrix An optional transformation matrix as defined by the - * flash.geom.Matrix class. The matrix can be used to scale or - * otherwise manipulate the bitmap before applying it to the - * line style. - */ -// public lineShaderStyle(shader:Shader, matrix:away.geom.Matrix = null) -// { -// -// } - - /** - * Specifies a line style used for subsequent calls to Graphics methods such - * as the lineTo() method or the drawCircle() - * method. The line style remains in effect until you call the - * lineGradientStyle() method, the - * lineBitmapStyle() method, or the lineStyle() - * method with different parameters. - * - *

You can call the lineStyle() method in the middle of - * drawing a path to specify different styles for different line segments - * within the path.

- * - *

Note: Calls to the clear() method set the line - * style back to undefined.

- * - *

Note: Flash Lite 4 supports only the first three parameters - * (thickness, color, and alpha).

- * - * @param thickness An integer that indicates the thickness of the line in - * points; valid values are 0-255. If a number is not - * specified, or if the parameter is undefined, a line is - * not drawn. If a value of less than 0 is passed, the - * default is 0. The value 0 indicates hairline - * thickness; the maximum thickness is 255. If a value - * greater than 255 is passed, the default is 255. - * @param color A hexadecimal color value of the line; for example, - * red is 0xFF0000, blue is 0x0000FF, and so on. If a - * value is not indicated, the default is 0x000000 - * (black). Optional. - * @param alpha A number that indicates the alpha value of the color - * of the line; valid values are 0 to 1. If a value is - * not indicated, the default is 1(solid). If the value - * is less than 0, the default is 0. If the value is - * greater than 1, the default is 1. - * @param pixelHinting(Not supported in Flash Lite 4) A Boolean value that - * specifies whether to hint strokes to full pixels. This - * affects both the position of anchors of a curve and - * the line stroke size itself. With - * pixelHinting set to true, - * line widths are adjusted to full pixel widths. With - * pixelHinting set to false, - * disjoints can appear for curves and straight lines. - * For example, the following illustrations show how - * Flash Player or Adobe AIR renders two rounded - * rectangles that are identical, except that the - * pixelHinting parameter used in the - * lineStyle() method is set differently - * (the images are scaled by 200%, to emphasize the - * difference): - * - *

If a value is not supplied, the line does not use - * pixel hinting.

- * @param scaleMode (Not supported in Flash Lite 4) A value from the - * LineScaleMode class that specifies which scale mode to - * use: - *
    - *
  • LineScaleMode.NORMAL - Always - * scale the line thickness when the object is scaled - * (the default).
  • - *
  • LineScaleMode.NONE - Never scale - * the line thickness.
  • - *
  • LineScaleMode.VERTICAL - Do not - * scale the line thickness if the object is scaled - * vertically only. For example, consider the - * following circles, drawn with a one-pixel line, and - * each with the scaleMode parameter set to - * LineScaleMode.VERTICAL. The circle on the - * left is scaled vertically only, and the circle on the - * right is scaled both vertically and horizontally: - *
  • - *
  • LineScaleMode.HORIZONTAL - Do not - * scale the line thickness if the object is scaled - * horizontally only. For example, consider the - * following circles, drawn with a one-pixel line, and - * each with the scaleMode parameter set to - * LineScaleMode.HORIZONTAL. The circle on - * the left is scaled horizontally only, and the circle - * on the right is scaled both vertically and - * horizontally:
  • - *
- * @param caps (Not supported in Flash Lite 4) A value from the - * CapsStyle class that specifies the type of caps at the - * end of lines. Valid values are: - * CapsStyle.NONE, - * CapsStyle.ROUND, and - * CapsStyle.SQUARE. If a value is not - * indicated, Flash uses round caps. - * - *

For example, the following illustrations show the - * different capsStyle settings. For each - * setting, the illustration shows a blue line with a - * thickness of 30(for which the capsStyle - * applies), and a superimposed black line with a - * thickness of 1(for which no capsStyle - * applies):

- * @param joints (Not supported in Flash Lite 4) A value from the - * JointStyle class that specifies the type of joint - * appearance used at angles. Valid values are: - * JointStyle.BEVEL, - * JointStyle.MITER, and - * JointStyle.ROUND. If a value is not - * indicated, Flash uses round joints. - * - *

For example, the following illustrations show the - * different joints settings. For each - * setting, the illustration shows an angled blue line - * with a thickness of 30(for which the - * jointStyle applies), and a superimposed - * angled black line with a thickness of 1(for which no - * jointStyle applies):

- * - *

Note: For joints set to - * JointStyle.MITER, you can use the - * miterLimit parameter to limit the length - * of the miter.

- * @param miterLimit (Not supported in Flash Lite 4) A number that - * indicates the limit at which a miter is cut off. Valid - * values range from 1 to 255(and values outside that - * range are rounded to 1 or 255). This value is only - * used if the jointStyle is set to - * "miter". The miterLimit - * value represents the length that a miter can extend - * beyond the point at which the lines meet to form a - * joint. The value expresses a factor of the line - * thickness. For example, with a - * miterLimit factor of 2.5 and a - * thickness of 10 pixels, the miter is cut - * off at 25 pixels. - * - *

For example, consider the following angled lines, - * each drawn with a thickness of 20, but - * with miterLimit set to 1, 2, and 4. - * Superimposed are black reference lines showing the - * meeting points of the joints:

- * - *

Notice that a given miterLimit value - * has a specific maximum angle for which the miter is - * cut off. The following table lists some examples:

- */ - public lineStyle(thickness:number = 0, color:number /*int*/ = 0, alpha:number = 1, pixelHinting:boolean = false, scaleMode:LineScaleMode = null, caps:CapsStyle = null, joints:JointStyle = null, miterLimit:number = 3) - { - - } - - /** - * Draws a line using the current line style from the current drawing - * position to(x, y); the current drawing position - * is then set to(x, y). If the display object in - * which you are drawing contains content that was created with the Flash - * drawing tools, calls to the lineTo() method are drawn - * underneath the content. If you call lineTo() before any calls - * to the moveTo() method, the default position for the current - * drawing is(0, 0). If any of the parameters are missing, this - * method fails and the current drawing position is not changed. - * - * @param x A number that indicates the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number that indicates the vertical position relative to the - * registration point of the parent display object(in pixels). - */ - public lineTo(x:number, y:number) - { - - } - - /** - * Moves the current drawing position to(x, y). If - * any of the parameters are missing, this method fails and the current - * drawing position is not changed. - * - * @param x A number that indicates the horizontal position relative to the - * registration point of the parent display object(in pixels). - * @param y A number that indicates the vertical position relative to the - * registration point of the parent display object(in pixels). - */ - public moveTo(x:number, y:number) - { - - } - } -} diff --git a/src/away/core/base/IMaterialOwner.ts b/src/away/core/base/IMaterialOwner.ts deleted file mode 100644 index fed13fd1..00000000 --- a/src/away/core/base/IMaterialOwner.ts +++ /dev/null @@ -1,58 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - import IAnimator = away.animators.IAnimator; - import UVTransform = away.geom.UVTransform; - import MaterialBase = away.materials.MaterialBase; - import IRenderable = away.pool.IRenderable; - import IRenderer = away.render.IRenderer; - - /** - * IMaterialOwner provides an interface for objects that can use materials. - * - * @interface away.base.IMaterialOwner - */ - export interface IMaterialOwner extends away.library.IAsset - { - /** - * The animation used by the material owner to assemble the vertex code. - */ - animator:IAnimator; - - /** - * The material with which to render the object. - */ - material:MaterialBase; - - /** - * - */ - uvTransform:UVTransform; - - /** - * - * @param renderable - * @private - */ - _iAddRenderable(renderable:IRenderable):IRenderable; - - - /** - * - * @param renderable - * @private - */ - _iRemoveRenderable(renderable:IRenderable):IRenderable; - - /** - * - * @param renderer - * @private - */ - _iCollectRenderable(renderer:IRenderer) - } -} diff --git a/src/away/core/base/ISubMesh.ts b/src/away/core/base/ISubMesh.ts deleted file mode 100644 index 29ac6ee8..00000000 --- a/src/away/core/base/ISubMesh.ts +++ /dev/null @@ -1,29 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - import Mesh = away.entities.Mesh; - import MaterialBase = away.materials.MaterialBase; - - /** - * ISubMesh is an interface for object SubMesh that is used to - * apply a material to a SubGeometry class - * - * @class away.base.ISubMesh - */ - export interface ISubMesh extends IMaterialOwner - { - subGeometry:SubGeometryBase; - - parentMesh:Mesh; - - _iIndex:number; - - _iInvalidateRenderableGeometry(); - - _iGetExplicitMaterial():MaterialBase; - } -} \ No newline at end of file diff --git a/src/away/core/base/ISubMeshClass.ts b/src/away/core/base/ISubMeshClass.ts deleted file mode 100644 index 29f14795..00000000 --- a/src/away/core/base/ISubMeshClass.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - import Mesh = away.entities.Mesh; - import MaterialBase = away.materials.MaterialBase; - - /** - * ISubMeshClass is an interface for the constructable class definition ISubMesh that is used to - * apply a material to a SubGeometry class - * - * @class away.base.ISubMeshClass - */ - export interface ISubMeshClass - { - /** - * - */ - new(subGeometry:SubGeometryBase, parentMesh:Mesh, material?:MaterialBase):ISubMesh; - } -} diff --git a/src/away/core/base/InterpolationMethod.ts b/src/away/core/base/InterpolationMethod.ts deleted file mode 100644 index 97f7dbe8..00000000 --- a/src/away/core/base/InterpolationMethod.ts +++ /dev/null @@ -1,43 +0,0 @@ -/// - -/** - * The InterpolationMethod class provides values for the - * interpolationMethod parameter in the - * Graphics.beginGradientFill() and - * Graphics.lineGradientStyle() methods. This parameter - * determines the RGB space to use when rendering the gradient. - */ -module away.base -{ - export class InterpolationMethod - { - - /** - * Specifies that the RGB interpolation method should be used. This means - * that the gradient is rendered with exponential sRGB(standard RGB) space. - * The sRGB space is a W3C-endorsed standard that defines a non-linear - * conversion between red, green, and blue component values and the actual - * intensity of the visible component color. - * - *

For example, consider a simple linear gradient between two colors(with - * the spreadMethod parameter set to - * SpreadMethod.REFLECT). The different interpolation methods - * affect the appearance as follows:

- */ - public static LINEAR_RGB:string = "linearRGB"; - - /** - * Specifies that the RGB interpolation method should be used. This means - * that the gradient is rendered with exponential sRGB(standard RGB) space. - * The sRGB space is a W3C-endorsed standard that defines a non-linear - * conversion between red, green, and blue component values and the actual - * intensity of the visible component color. - * - *

For example, consider a simple linear gradient between two colors(with - * the spreadMethod parameter set to - * SpreadMethod.REFLECT). The different interpolation methods - * affect the appearance as follows:

- */ - public static RGB:string = "rgb"; - } -} diff --git a/src/away/core/base/JointStyle.ts b/src/away/core/base/JointStyle.ts deleted file mode 100644 index 84ef9d2b..00000000 --- a/src/away/core/base/JointStyle.ts +++ /dev/null @@ -1,33 +0,0 @@ -/// - -/** - * The JointStyle class is an enumeration of constant values that specify the - * joint style to use in drawing lines. These constants are provided for use - * as values in the joints parameter of the - * flash.display.Graphics.lineStyle() method. The method supports - * three types of joints: miter, round, and bevel, as the following example - * shows: - */ -module away.base -{ - export class JointStyle - { - /** - * Specifies beveled joints in the joints parameter of the - * flash.display.Graphics.lineStyle() method. - */ - public static BEVEL:string = "bevel"; - - /** - * Specifies mitered joints in the joints parameter of the - * flash.display.Graphics.lineStyle() method. - */ - public static MITER:string = "miter"; - - /** - * Specifies round joints in the joints parameter of the - * flash.display.Graphics.lineStyle() method. - */ - public static ROUND:string = "round"; - } -} diff --git a/src/away/core/base/LightBase.ts b/src/away/core/base/LightBase.ts deleted file mode 100644 index 498c9000..00000000 --- a/src/away/core/base/LightBase.ts +++ /dev/null @@ -1,189 +0,0 @@ -/// - -module away.base -{ - import Camera = away.entities.Camera; - import IEntity = away.entities.IEntity; - import AbstractMethodError = away.errors.AbstractMethodError; - import LightEvent = away.events.LightEvent; - import Matrix3D = away.geom.Matrix3D; - import AssetType = away.library.AssetType; - import ShadowMapperBase = away.materials.ShadowMapperBase; - - export class LightBase extends away.containers.DisplayObjectContainer - { - private _color:number = 0xffffff; - private _colorR:number = 1; - private _colorG:number = 1; - private _colorB:number = 1; - - private _ambientColor:number = 0xffffff; - private _ambient:number = 0; - public _iAmbientR:number = 0; - public _iAmbientG:number = 0; - public _iAmbientB:number = 0; - - private _specular:number = 1; - public _iSpecularR:number = 1; - public _iSpecularG:number = 1; - public _iSpecularB:number = 1; - - private _diffuse:number = 1; - public _iDiffuseR:number = 1; - public _iDiffuseG:number = 1; - public _iDiffuseB:number = 1; - - private _castsShadows:boolean = false; - - private _shadowMapper:ShadowMapperBase; - - constructor() - { - super(); - } - - public get castsShadows():boolean - { - return this._castsShadows; - } - - public set castsShadows(value:boolean) - { - if (this._castsShadows == value) - return; - - this._castsShadows = value; - - if (value) { - if (this._shadowMapper == null) - this._shadowMapper = this.pCreateShadowMapper(); - - this._shadowMapper.light = this; - } else { - this._shadowMapper.dispose(); - this._shadowMapper = null; - } - //*/ - this.dispatchEvent(new LightEvent(LightEvent.CASTS_SHADOW_CHANGE)); - } - - public pCreateShadowMapper():ShadowMapperBase - { - throw new AbstractMethodError(); - } - - public get specular():number - { - return this._specular; - } - - public set specular(value:number) - { - if (value < 0) - value = 0; - - this._specular = value; - this.updateSpecular(); - } - - public get diffuse():number - { - return this._diffuse; - } - - public set diffuse(value:number) - { - if (value < 0) - value = 0; - - this._diffuse = value; - this.updateDiffuse(); - } - - public get color():number - { - return this._color; - } - - public set color(value:number) - { - this._color = value; - this._colorR = ((this._color >> 16) & 0xff)/0xff; - this._colorG = ((this._color >> 8) & 0xff)/0xff; - this._colorB = (this._color & 0xff)/0xff; - - this.updateDiffuse(); - this.updateSpecular(); - } - - public get ambient():number - { - return this._ambient; - } - - public set ambient(value:number) - { - if (value < 0) - value = 0; - else if (value > 1) - value = 1; - - this._ambient = value; - this.updateAmbient(); - } - - public get ambientColor():number - { - return this._ambientColor; - } - - public set ambientColor(value:number) - { - this._ambientColor = value; - this.updateAmbient(); - } - - private updateAmbient() - { - this._iAmbientR = ((this._ambientColor >> 16) & 0xff)/0xff*this._ambient; - this._iAmbientG = ((this._ambientColor >> 8) & 0xff)/0xff*this._ambient; - this._iAmbientB = (this._ambientColor & 0xff)/0xff*this._ambient; - } - - public iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D - { - throw new AbstractMethodError(); - } - - //@override - public get assetType():string - { - return AssetType.LIGHT; - } - - private updateSpecular() - { - this._iSpecularR = this._colorR*this._specular; - this._iSpecularG = this._colorG*this._specular; - this._iSpecularB = this._colorB*this._specular; - } - - private updateDiffuse() - { - this._iDiffuseR = this._colorR*this._diffuse; - this._iDiffuseG = this._colorG*this._diffuse; - this._iDiffuseB = this._colorB*this._diffuse; - } - - public get shadowMapper():ShadowMapperBase - { - return this._shadowMapper; - } - - public set shadowMapper(value:ShadowMapperBase) - { - this._shadowMapper = value; - this._shadowMapper.light = this; - } - } -} \ No newline at end of file diff --git a/src/away/core/base/LineScaleMode.ts b/src/away/core/base/LineScaleMode.ts deleted file mode 100644 index 6507c366..00000000 --- a/src/away/core/base/LineScaleMode.ts +++ /dev/null @@ -1,46 +0,0 @@ -/// - -/** - * The LineScaleMode class provides values for the scaleMode - * parameter in the Graphics.lineStyle() method. - */ -module away.base -{ - export class LineScaleMode - { - /** - * With this setting used as the scaleMode parameter of the - * lineStyle() method, the thickness of the line scales - * only vertically. For example, consider the following circles, drawn - * with a one-pixel line, and each with the scaleMode parameter - * set to LineScaleMode.VERTICAL. The circle on the left is - * scaled only vertically, and the circle on the right is scaled both - * vertically and horizontally. - */ - public static HORIZONTAL:string = "horizontal"; - - /** - * With this setting used as the scaleMode parameter of the - * lineStyle() method, the thickness of the line never scales. - */ - public static NONE:string = "none"; - - /** - * With this setting used as the scaleMode parameter of the - * lineStyle() method, the thickness of the line always scales - * when the object is scaled(the default). - */ - public static NORMAL:string = "normal"; - - /** - * With this setting used as the scaleMode parameter of the - * lineStyle() method, the thickness of the line scales - * only horizontally. For example, consider the following circles, - * drawn with a one-pixel line, and each with the scaleMode - * parameter set to LineScaleMode.HORIZONTAL. The circle on the - * left is scaled only horizontally, and the circle on the right is scaled - * both vertically and horizontally. - */ - public static VERTICAL:string = "vertical"; - } -} \ No newline at end of file diff --git a/src/away/core/base/LineSubGeometry.ts b/src/away/core/base/LineSubGeometry.ts deleted file mode 100644 index 5eae9ea0..00000000 --- a/src/away/core/base/LineSubGeometry.ts +++ /dev/null @@ -1,439 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - /** - * @class away.base.TriangleSubGeometry - */ - export class LineSubGeometry extends SubGeometryBase - { - public static VERTEX_DATA:string = "vertices"; - public static START_POSITION_DATA:string = "startPositions"; - public static END_POSITION_DATA:string = "endPositions"; - public static THICKNESS_DATA:string = "thickness"; - public static COLOR_DATA:string = "colors"; - - //TODO - move these to StageGL - public static POSITION_FORMAT:string = "float3"; - public static COLOR_FORMAT:string = "float4"; - public static THICKNESS_FORMAT:string = "float1"; - - private _positionsDirty:boolean = true; - private _boundingPositionDirty = true; - private _thicknessDirty:boolean = true; - private _colorsDirty:boolean = true; - - private _startPositions:Array; - private _endPositions:Array; - private _boundingPositions:Array - private _thickness:Array; - private _startColors:Array; - private _endColors:Array; - - private _numSegments:number; - - private _positionsUpdated:away.events.SubGeometryEvent; - private _thicknessUpdated:away.events.SubGeometryEvent; - private _colorUpdated:away.events.SubGeometryEvent; - - public _pUpdateStrideOffset() - { - this._pOffset[LineSubGeometry.VERTEX_DATA] = 0; - - var stride:number = 0; - this._pOffset[LineSubGeometry.START_POSITION_DATA] = stride; - stride += 3; - - this._pOffset[LineSubGeometry.END_POSITION_DATA] = stride; - stride += 3; - - this._pOffset[LineSubGeometry.THICKNESS_DATA] = stride; - stride += 1; - - this._pOffset[LineSubGeometry.COLOR_DATA] = stride; - stride += 4; - - this._pStride[LineSubGeometry.VERTEX_DATA] = stride; - this._pStride[LineSubGeometry.START_POSITION_DATA] = stride; - this._pStride[LineSubGeometry.END_POSITION_DATA] = stride; - this._pStride[LineSubGeometry.THICKNESS_DATA] = stride; - this._pStride[LineSubGeometry.COLOR_DATA] = stride; - - var len:number = this._pNumVertices*stride; - - if (this._pVertices == null) - this._pVertices = new Array(len); - else if (this._pVertices.length != len) - this._pVertices.length = len; - - this._pStrideOffsetDirty = false; - } - - /** - * - */ - public get vertices():Array - { - if (this._positionsDirty) - this.updatePositions(this._startPositions, this._endPositions); - - if (this._thicknessDirty) - this.updateThickness(this._thickness); - - if (this._colorsDirty) - this.updateColors(this._startColors, this._endColors); - - return this._pVertices; - } - - /** - * - */ - public get startPositions():Array - { - if (this._positionsDirty) - this.updatePositions(this._startPositions, this._endPositions); - - return this._startPositions; - } - - /** - * - */ - public get endPositions():Array - { - if (this._positionsDirty) - this.updatePositions(this._startPositions, this._endPositions); - - return this._endPositions; - } - - /** - * - */ - public get thickness():Array - { - if (this._thicknessDirty) - this.updateThickness(this._thickness); - - return this._thickness; - } - - /** - * - */ - public get startColors():Array - { - if (this._colorsDirty) - this.updateColors(this._startColors, this._endColors); - - return this._startColors; - } - - /** - * - */ - public get endColors():Array - { - if (this._colorsDirty) - this.updateColors(this._startColors, this._endColors); - - return this._endColors; - } - - /** - * The total amount of segments in the TriangleSubGeometry. - */ - public get numSegments():number - { - return this._numSegments; - } - - /** - * - */ - constructor() - { - super(true); - - this._pSubMeshClass = LineSubMesh; - } - - public getBoundingPositions():Array - { - if (this._boundingPositionDirty) - this._boundingPositions = this.startPositions.concat(this.endPositions); - - return this._boundingPositions; - } - - /** - * - */ - public updatePositions(startValues:Array, endValues:Array) - { - var i:number; - var j:number; - var values:Array - var index:number; - var stride:number; - var positions:Array; - var indices:Array; - - this._startPositions = startValues; - - if (this._startPositions == null) - this._startPositions = new Array(); - - this._endPositions = endValues; - - if (this._endPositions == null) - this._endPositions = new Array(); - - this._boundingPositionDirty = true; - - this._numSegments = this._startPositions.length/3; - - this._pNumVertices = this._numSegments*4; - - var lenV:number = this._pNumVertices*this.getStride(LineSubGeometry.VERTEX_DATA); - - if (this._pVertices == null) - this._pVertices = new Array(lenV); - else if (this._pVertices.length != lenV) - this._pVertices.length = lenV; - - i = 0; - j = 0; - index = this.getOffset(LineSubGeometry.START_POSITION_DATA); - stride = this.getStride(LineSubGeometry.START_POSITION_DATA); - positions = this._pVertices; - indices = new Array(); - - while (i < startValues.length) { - values = (index/stride & 1)? endValues : startValues; - positions[index] = values[i]; - positions[index + 1] = values[i + 1]; - positions[index + 2] = values[i + 2]; - - values = (index/stride & 1)? startValues : endValues; - positions[index + 3] = values[i]; - positions[index + 4] = values[i + 1]; - positions[index + 5] = values[i + 2]; - - if (++j == 4) { - var o:number = index/stride - 3; - indices.push(o, o + 1, o + 2, o + 3, o + 2, o + 1); - j = 0; - i += 3; - } - - index += stride; - } - - this.updateIndices(indices); - - this.pInvalidateBounds(); - - this.notifyPositionsUpdate(); - - this._positionsDirty = false; - } - - /** - * Updates the thickness. - */ - public updateThickness(values:Array) - { - var i:number; - var j:number; - var index:number; - var offset:number; - var stride:number; - var thickness:Array; - - this._thickness = values; - - if (values != null) { - i = 0; - j = 0; - offset = this.getOffset(LineSubGeometry.THICKNESS_DATA); - stride = this.getStride(LineSubGeometry.THICKNESS_DATA); - thickness = this._pVertices; - - index = offset - while (i < values.length) { - thickness[index] = (Math.floor(0.5*(index - offset)/stride + 0.5) & 1)? -values[i] : values[i]; - - if (++j == 4) { - j = 0; - i++; - } - index += stride; - } - } - - this.notifyThicknessUpdate(); - - this._thicknessDirty = false; - } - - /** - * - */ - public updateColors(startValues:Array, endValues:Array) - { - var i:number; - var j:number; - var values:Array - var index:number; - var offset:number; - var stride:number; - var colors:Array; - - this._startColors = startValues; - - this._endColors = endValues; - - //default to white - if (this._startColors == null) { - this._startColors = new Array(this._numSegments*4); - - i = 0; - while (i < this._startColors.length) - this._startColors[i++] = 1; - } - - if (this._endColors == null) { - this._endColors = new Array(this._numSegments*4); - - i = 0; - while (i < this._endColors.length) - this._endColors[i++] = 1; - } - - i = 0; - j = 0; - offset = this.getOffset(LineSubGeometry.COLOR_DATA); - stride = this.getStride(LineSubGeometry.COLOR_DATA); - colors = this._pVertices; - - index = offset; - - while (i < this._startColors.length) { - values = ((index - offset)/stride & 1)? this._endColors : this._startColors; - colors[index] = values[i]; - colors[index + 1] = values[i + 1]; - colors[index + 2] = values[i + 2]; - colors[index + 3] = values[i + 3]; - - if (++j == 4) { - j = 0; - i += 4; - } - - index += stride; - } - - this.notifyColorsUpdate(); - - this._colorsDirty = false; - } - - /** - * - */ - public dispose() - { - super.dispose(); - - this._startPositions = null; - this._endPositions = null; - this._thickness = null; - this._startColors = null; - this._endColors = null; - } - - /** - * @protected - */ - public pInvalidateBounds() - { - if (this.parentGeometry) - this.parentGeometry.iInvalidateBounds(this); - } - - /** - * The Geometry object that 'owns' this TriangleSubGeometry object. - * - * @private - */ - public parentGeometry:away.base.Geometry; - - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - public clone():LineSubGeometry - { - var clone:LineSubGeometry = new LineSubGeometry(); - clone.updateIndices(this._pIndices.concat()); - clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); - clone.updateThickness(this._thickness.concat()); - clone.updatePositions(this._startPositions.concat(), this._endPositions.concat()); - - return clone; - } - - public _pNotifyVerticesUpdate() - { - this._pStrideOffsetDirty = true; - - this.notifyPositionsUpdate(); - this.notifyThicknessUpdate(); - this.notifyColorsUpdate(); - } - - private notifyPositionsUpdate() - { - if (this._positionsDirty) - return; - - this._positionsDirty = true; - - if (!this._positionsUpdated) - this._positionsUpdated = new away.events.SubGeometryEvent(away.events.SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); - - this.dispatchEvent(this._positionsUpdated); - } - - private notifyThicknessUpdate() - { - if (this._thicknessDirty) - return; - - this._thicknessDirty = true; - - if (!this._thicknessUpdated) - this._thicknessUpdated = new away.events.SubGeometryEvent(away.events.SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.THICKNESS_DATA); - - this.dispatchEvent(this._thicknessUpdated); - } - - private notifyColorsUpdate() - { - if (this._colorsDirty) - return; - - this._colorsDirty = true; - - if (!this._colorUpdated) - this._colorUpdated = new away.events.SubGeometryEvent(away.events.SubGeometryEvent.VERTICES_UPDATED, LineSubGeometry.COLOR_DATA); - - this.dispatchEvent(this._colorUpdated); - } - } -} diff --git a/src/away/core/base/LineSubMesh.ts b/src/away/core/base/LineSubMesh.ts deleted file mode 100644 index c240ca03..00000000 --- a/src/away/core/base/LineSubMesh.ts +++ /dev/null @@ -1,72 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - import Mesh = away.entities.Mesh; - import AssetType = away.library.AssetType; - import MaterialBase = away.materials.MaterialBase; - import IRenderer = away.render.IRenderer; - - /** - * LineSubMesh wraps a LineSubGeometry as a scene graph instantiation. A LineSubMesh is owned by a Mesh object. - * - * - * @see away.base.LineSubGeometry - * @see away.entities.Mesh - * - * @class away.base.LineSubMesh - */ - export class LineSubMesh extends SubMeshBase implements ISubMesh - { - private _subGeometry:LineSubGeometry; - - /** - * - */ - public get assetType():string - { - return AssetType.LINE_SUB_MESH; - } - - /** - * The LineSubGeometry object which provides the geometry data for this LineSubMesh. - */ - public get subGeometry():LineSubGeometry - { - return this._subGeometry; - } - - /** - * Creates a new LineSubMesh object - * @param subGeometry The LineSubGeometry object which provides the geometry data for this LineSubMesh. - * @param parentMesh The Mesh object to which this LineSubMesh belongs. - * @param material An optional material used to render this LineSubMesh. - */ - constructor(subGeometry:LineSubGeometry, parentMesh:Mesh, material:MaterialBase = null) - { - super(); - - this._pParentMesh = parentMesh; - this._subGeometry = subGeometry; - this.material = material; - } - - /** - * - */ - public dispose() - { - this.material = null; - - super.dispose(); - } - - public _iCollectRenderable(renderer:IRenderer) - { - renderer.applyLineSubMesh(this); - } - } -} diff --git a/src/away/core/base/OrientationMode.ts b/src/away/core/base/OrientationMode.ts deleted file mode 100644 index c1690368..00000000 --- a/src/away/core/base/OrientationMode.ts +++ /dev/null @@ -1,25 +0,0 @@ -/// - -/** - */ -module away.base -{ - - export class OrientationMode - { - /** - * - */ - public static DEFAULT:string = "default"; - - /** - * - */ - public static CAMERA_PLANE:string = "cameraPlane"; - - /** - * - */ - public static CAMERA_POSITION:string = "cameraPosition"; - } -} \ No newline at end of file diff --git a/src/away/core/base/PixelSnapping.ts b/src/away/core/base/PixelSnapping.ts deleted file mode 100644 index 1753a770..00000000 --- a/src/away/core/base/PixelSnapping.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// - -/** - * The PixelSnapping class is an enumeration of constant values for setting - * the pixel snapping options by using the pixelSnapping property - * of a Bitmap object. - */ -module away.base -{ - export class PixelSnapping - { - /** - * A constant value used in the pixelSnapping property of a - * Bitmap object to specify that the bitmap image is always snapped to the - * nearest pixel, independent of any transformation. - */ - public static ALWAYS:string = "always"; - - /** - * A constant value used in the pixelSnapping property of a - * Bitmap object to specify that the bitmap image is snapped to the nearest - * pixel if it is drawn with no rotation or skew and it is drawn at a scale - * factor of 99.9% to 100.1%. If these conditions are satisfied, the image is - * drawn at 100% scale, snapped to the nearest pixel. Internally, this - * setting allows the image to be drawn as fast as possible by using the - * vector renderer. - */ - public static AUTO:string = "auto"; - - /** - * A constant value used in the pixelSnapping property of a - * Bitmap object to specify that no pixel snapping occurs. - */ - public static NEVER:string = "never"; - } -} diff --git a/src/away/core/base/SpreadMethod.ts b/src/away/core/base/SpreadMethod.ts deleted file mode 100644 index e19267d4..00000000 --- a/src/away/core/base/SpreadMethod.ts +++ /dev/null @@ -1,30 +0,0 @@ -/// - -/** - * The SpreadMethod class provides values for the spreadMethod - * parameter in the beginGradientFill() and - * lineGradientStyle() methods of the Graphics class. - * - *

The following example shows the same gradient fill using various spread - * methods:

- */ -module away.base -{ - export class SpreadMethod - { - /** - * Specifies that the gradient use the pad spread method. - */ - public static PAD:string = "pad"; - - /** - * Specifies that the gradient use the reflect spread method. - */ - public static REFLECT:string = "reflect"; - - /** - * Specifies that the gradient use the repeat spread method. - */ - public static REPEAT:string = "repeat"; - } -} \ No newline at end of file diff --git a/src/away/core/base/Stage.ts b/src/away/core/base/Stage.ts deleted file mode 100644 index 647421cb..00000000 --- a/src/away/core/base/Stage.ts +++ /dev/null @@ -1,585 +0,0 @@ -/// - -module away.base -{ - import ContextMode = away.display.ContextMode; - import IContext = away.display.IContext; - import Event = away.events.Event; - import StageEvent = away.events.StageEvent; - import Rectangle = away.geom.Rectangle; - import StageManager = away.managers.StageManager; - import CubeTextureBase = away.textures.CubeTextureBase; - import RenderTexture = away.textures.RenderTexture; - import TextureProxyBase = away.textures.TextureProxyBase; - import CSS = away.utils.CSS; - - /** - * Stage provides a proxy class to handle the creation and attachment of the Context - * (and in turn the back buffer) it uses. Stage should never be created directly, - * but requested through StageManager. - * - * @see away.managers.StageManager - * - */ - export class Stage extends away.events.EventDispatcher - { - private _context:IContext; - private _container:HTMLElement; - private _width:number; - private _height:number; - private _x:number = 0; - private _y:number = 0; - - //private static _frameEventDriver:Shape = new Shape(); // TODO: add frame driver / request animation frame - - private _stageIndex:number = -1; - - private _usesSoftwareRendering:boolean; - private _profile:string; - private _stageManager:StageManager; - private _antiAlias:number = 0; - private _enableDepthAndStencil:boolean; - private _contextRequested:boolean; - - //private var _activeVertexBuffers : Vector. = new Vector.(8, true); - //private var _activeTextures : Vector. = new Vector.(8, true); - private _renderTarget:TextureProxyBase = null; - private _renderSurfaceSelector:number = 0; - private _scissorRect:Rectangle; - private _color:number; - private _backBufferDirty:boolean; - private _viewPort:Rectangle; - private _enterFrame:Event; - private _exitFrame:Event; - private _viewportUpdated:StageEvent; - private _viewportDirty:boolean; - private _bufferClear:boolean; - - //private _mouse3DManager:away.managers.Mouse3DManager; - //private _touch3DManager:Touch3DManager; //TODO: imeplement dependency Touch3DManager - - private _initialised:boolean = false; - - constructor(container:HTMLCanvasElement, stageIndex:number, stageManager:StageManager, forceSoftware:boolean = false, profile:string = "baseline") - { - super(); - - this._container = container; - - this._stageIndex = stageIndex; - - this._stageManager = stageManager; - - this._viewPort = new Rectangle(); - - this._enableDepthAndStencil = true; - - CSS.setElementX(this._container, 0); - CSS.setElementY(this._container, 0); - - this.visible = true; - } - - /** - * Requests a Context object to attach to the managed gl canvas. - */ - public requestContext(forceSoftware:boolean = false, profile:string = "baseline", mode:string = "auto") - { - // If forcing software, we can be certain that the - // returned Context will be running software mode. - // If not, we can't be sure and should stick to the - // old value (will likely be same if re-requesting.) - - if (this._usesSoftwareRendering != null) - this._usesSoftwareRendering = forceSoftware; - - this._profile = profile; - - try { - if (mode == ContextMode.FLASH) - new away["stagegl"]["ContextStage3D"]( this._container, this._stageIndex, (context:IContext) => this._callback(context)); - else - this._context = new away["stagegl"]["ContextWebGL"]( this._container, this._stageIndex); - - } catch (e) { - try { - if (mode == ContextMode.AUTO) - new away["stagegl"]["ContextStage3D"]( this._container, this._stageIndex, (context:IContext) => this._callback(context)); - else - this.dispatchEvent(new Event(Event.ERROR)); - } catch (e) { - this.dispatchEvent(new Event(Event.ERROR)); - } - - } - - if (this._context) - this._callback(this._context); - } - - /** - * The width of the gl canvas - */ - public get width() - { - return this._width; - } - - public set width(val:number) - { - if (this._width == val) - return; - - CSS.setElementWidth(this._container, val); - - this._width = this._viewPort.width = val; - - this._backBufferDirty = true; - - this.notifyViewportUpdated(); - } - - /** - * The height of the gl canvas - */ - public get height() - { - return this._height; - } - - public set height(val:number) - { - if (this._height == val) - return; - - CSS.setElementHeight(this._container, val); - - this._height = this._viewPort.height = val; - - this._backBufferDirty = true; - - this.notifyViewportUpdated(); - } - - /** - * The x position of the gl canvas - */ - public get x() - { - return this._x; - } - - public set x(val:number) - { - if (this._x == val) - return; - - CSS.setElementX(this._container, val); - - this._x = this._viewPort.x = val; - - this.notifyViewportUpdated(); - } - - /** - * The y position of the gl canvas - */ - public get y() - { - return this._y; - } - - public set y(val:number) - { - if (this._y == val) - return; - - CSS.setElementY(this._container, val); - - this._y = this._viewPort.y = val; - - this.notifyViewportUpdated(); - } - - public set visible(val:boolean) - { - CSS.setElementVisibility(this._container, val); - } - - public get visible() - { - return CSS.getElementVisibility(this._container); - } - - public get container():HTMLElement - { - return this._container; - } - - /** - * The Context object associated with the given stage object. - */ - public get context():IContext - { - return this._context; - } - - private notifyViewportUpdated() - { - if (this._viewportDirty) - return; - - this._viewportDirty = true; - - //if (!this.hasEventListener(StageEvent.VIEWPORT_UPDATED)) - //return; - - //if (!_viewportUpdated) - this._viewportUpdated = new StageEvent(StageEvent.VIEWPORT_UPDATED); - - this.dispatchEvent(this._viewportUpdated); - } - - private notifyEnterFrame() - { - //if (!hasEventListener(Event.ENTER_FRAME)) - //return; - - if (!this._enterFrame) - this._enterFrame = new Event(Event.ENTER_FRAME); - - this.dispatchEvent(this._enterFrame); - - } - - private notifyExitFrame() - { - //if (!hasEventListener(Event.EXIT_FRAME)) - //return; - - if (!this._exitFrame) - this._exitFrame = new Event(Event.EXIT_FRAME); - - this.dispatchEvent(this._exitFrame); - } - - public get profile():string - { - return this._profile; - } - - /** - * Disposes the Stage object, freeing the Context attached to the Stage. - */ - public dispose() - { - this._stageManager.iRemoveStage(this); - this.freeContext(); - this._stageManager = null; - this._stageIndex = -1; - } - - /** - * Configures the back buffer associated with the Stage object. - * @param backBufferWidth The width of the backbuffer. - * @param backBufferHeight The height of the backbuffer. - * @param antiAlias The amount of anti-aliasing to use. - * @param enableDepthAndStencil Indicates whether the back buffer contains a depth and stencil buffer. - */ - public configureBackBuffer(backBufferWidth:number, backBufferHeight:number, antiAlias:number, enableDepthAndStencil:boolean) - { - this.width = backBufferWidth; - this.height = backBufferHeight; - - this._antiAlias = antiAlias; - this._enableDepthAndStencil = enableDepthAndStencil; - - if (this._context) - this._context.configureBackBuffer(backBufferWidth, backBufferHeight, antiAlias, enableDepthAndStencil); - } - - /* - * Indicates whether the depth and stencil buffer is used - */ - public get enableDepthAndStencil():boolean - { - return this._enableDepthAndStencil; - } - - public set enableDepthAndStencil(enableDepthAndStencil:boolean) - { - this._enableDepthAndStencil = enableDepthAndStencil; - this._backBufferDirty = true; - } - - public get renderTarget():TextureProxyBase - { - return this._renderTarget; - } - - public get renderSurfaceSelector():number - { - return this._renderSurfaceSelector; - } - - /* - * Clear and reset the back buffer when using a shared context - */ - public clear() - { - if (!this._context) - return; - - if (this._backBufferDirty) { - this.configureBackBuffer(this._width, this._height, this._antiAlias, this._enableDepthAndStencil); - this._backBufferDirty = false; - } - - this._context.clear(( this._color & 0xff000000 ) >>> 24, // <--------- Zero-fill right shift - ( this._color & 0xff0000 ) >>> 16, // <-------------| - ( this._color & 0xff00 ) >>> 8, // <----------------| - this._color & 0xff); - - this._bufferClear = true; - } - - /** - * Registers an event listener object with an EventDispatcher object so that the listener receives notification of an event. Special case for enterframe and exitframe events - will switch StageProxy into automatic render mode. - * You can register event listeners on all nodes in the display list for a specific type of event, phase, and priority. - * - * @param type The type of event. - * @param listener The listener function that processes the event. - * @param useCapture Determines whether the listener works in the capture phase or the target and bubbling phases. If useCapture is set to true, the listener processes the event only during the capture phase and not in the target or bubbling phase. If useCapture is false, the listener processes the event only during the target or bubbling phase. To listen for the event in all three phases, call addEventListener twice, once with useCapture set to true, then again with useCapture set to false. - * @param priority The priority level of the event listener. The priority is designated by a signed 32-bit integer. The higher the number, the higher the priority. All listeners with priority n are processed before listeners of priority n-1. If two or more listeners share the same priority, they are processed in the order in which they were added. The default priority is 0. - * @param useWeakReference Determines whether the reference to the listener is strong or weak. A strong reference (the default) prevents your listener from being garbage-collected. A weak reference does not. - */ - //public override function addEventListener(type:string, listener, useCapture:boolean = false, priority:number = 0, useWeakReference:boolean = false) - public addEventListener(type:string, listener:Function) - { - super.addEventListener(type, listener);//useCapture, priority, useWeakReference); - - //away.Debug.throwPIR( 'StageProxy' , 'addEventListener' , 'EnterFrame, ExitFrame'); - - //if ((type == Event.ENTER_FRAME || type == Event.EXIT_FRAME) ){//&& ! this._frameEventDriver.hasEventListener(Event.ENTER_FRAME)){ - - //_frameEventDriver.addEventListener(Event.ENTER_FRAME, onEnterFrame, useCapture, priority, useWeakReference); - - //} - - /* Original code - if ((type == Event.ENTER_FRAME || type == Event.EXIT_FRAME) && ! _frameEventDriver.hasEventListener(Event.ENTER_FRAME)){ - - _frameEventDriver.addEventListener(Event.ENTER_FRAME, onEnterFrame, useCapture, priority, useWeakReference); - - - } - */ - } - - /** - * Removes a listener from the EventDispatcher object. Special case for enterframe and exitframe events - will switch StageProxy out of automatic render mode. - * If there is no matching listener registered with the EventDispatcher object, a call to this method has no effect. - * - * @param type The type of event. - * @param listener The listener object to remove. - * @param useCapture Specifies whether the listener was registered for the capture phase or the target and bubbling phases. If the listener was registered for both the capture phase and the target and bubbling phases, two calls to removeEventListener() are required to remove both, one call with useCapture() set to true, and another call with useCapture() set to false. - */ - public removeEventListener(type:string, listener:Function) - { - super.removeEventListener(type, listener); - - //away.Debug.throwPIR( 'StageProxy' , 'removeEventListener' , 'EnterFrame, ExitFrame'); - - /* - // Remove the main rendering listener if no EnterFrame listeners remain - if ( ! this.hasEventListener(Event.ENTER_FRAME , this.onEnterFrame , this ) - && ! this.hasEventListener(Event.EXIT_FRAME , this.onEnterFrame , this) ) //&& _frameEventDriver.hasEventListener(Event.ENTER_FRAME)) - { - - //_frameEventDriver.removeEventListener(Event.ENTER_FRAME, this.onEnterFrame, this ); - - } - */ - } - - public get scissorRect():Rectangle - { - return this._scissorRect; - } - - public set scissorRect(value:Rectangle) - { - this._scissorRect = value; - - this._context.setScissorRectangle(this._scissorRect); - } - - /** - * The index of the Stage which is managed by this instance of StageProxy. - */ - public get stageIndex():number - { - return this._stageIndex; - } - - /** - * Indicates whether the Stage managed by this proxy is running in software mode. - * Remember to wait for the CONTEXT_CREATED event before checking this property, - * as only then will it be guaranteed to be accurate. - */ - public get usesSoftwareRendering():boolean - { - return this._usesSoftwareRendering; - } - - /** - * The antiAliasing of the Stage. - */ - public get antiAlias():number - { - return this._antiAlias; - } - - public set antiAlias(antiAlias:number) - { - this._antiAlias = antiAlias; - this._backBufferDirty = true; - } - - /** - * A viewPort rectangle equivalent of the Stage size and position. - */ - public get viewPort():Rectangle - { - this._viewportDirty = false; - - return this._viewPort; - } - - /** - * The background color of the Stage. - */ - public get color():number - { - return this._color; - } - - public set color(color:number) - { - this._color = color; - } - - /** - * The freshly cleared state of the backbuffer before any rendering - */ - public get bufferClear():boolean - { - return this._bufferClear; - } - - public set bufferClear(newBufferClear:boolean) - { - this._bufferClear = newBufferClear; - } - - /* - * Access to fire mouseevents across multiple layered view3D instances - */ - // public get mouse3DManager():Mouse3DManager - // { - // return this._mouse3DManager; - // } - // - // public set mouse3DManager(value:Mouse3DManager) - // { - // this._mouse3DManager = value; - // } - - /* TODO: implement dependency Touch3DManager - public get touch3DManager():Touch3DManager - { - return _touch3DManager; - } - - public set touch3DManager(value:Touch3DManager) - { - _touch3DManager = value; - } - */ - - /** - * Frees the Context associated with this StageProxy. - */ - private freeContext() - { - if (this._context) { - this._context.dispose(); - - this.dispatchEvent(new StageEvent(StageEvent.CONTEXT_DISPOSED)); - } - - this._context = null; - - this._initialised = false; - } - - /** - * The Enter_Frame handler for processing the proxy.ENTER_FRAME and proxy.EXIT_FRAME event handlers. - * Typically the proxy.ENTER_FRAME listener would render the layers for this Stage instance. - */ - private onEnterFrame(event:Event) - { - if (!this._context) - return; - - // Clear the stage instance - this.clear(); - //notify the enterframe listeners - this.notifyEnterFrame(); - // Call the present() to render the frame - if (!this._context) - this._context.present(); - //notify the exitframe listeners - this.notifyExitFrame(); - } - - public recoverFromDisposal():boolean - { - if (!this._context) - return false; - - //away.Debug.throwPIR( 'StageProxy' , 'recoverFromDisposal' , '' ); - - /* - if (this._iContext.driverInfo == "Disposed") - { - this._iContext = null; - this.dispatchEvent(new StageEvent(StageEvent.CONTEXT_DISPOSED)); - return false; - - } - */ - return true; - - } - - private _callback(context:IContext) - { - this._context = context; - - this._container = this._context.container; - - // Only configure back buffer if width and height have been set, - // which they may not have been if View.render() has yet to be - // invoked for the first time. - if (this._width && this._height) - this._context.configureBackBuffer(this._width, this._height, this._antiAlias, this._enableDepthAndStencil); - - // Dispatch the appropriate event depending on whether context was - // created for the first time or recreated after a device loss. - this.dispatchEvent(new StageEvent(this._initialised? StageEvent.CONTEXT_RECREATED : StageEvent.CONTEXT_CREATED)); - - this._initialised = true; - } - } -} \ No newline at end of file diff --git a/src/away/core/base/SubGeometryBase.ts b/src/away/core/base/SubGeometryBase.ts deleted file mode 100644 index 119b5de1..00000000 --- a/src/away/core/base/SubGeometryBase.ts +++ /dev/null @@ -1,218 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - /** - * @class away.base.TriangleSubGeometry - */ - export class SubGeometryBase extends away.library.NamedAssetBase - { - public static VERTEX_DATA:string = "vertices"; - - public _pStrideOffsetDirty:boolean = true; - - public _pIndices:Array /*uint*/; - public _pVertices:Array; - - private _numIndices:number; - private _numTriangles:number; - public _pNumVertices:number; - - public _pConcatenateArrays:boolean = true; - - private _indicesUpdated:away.events.SubGeometryEvent; - - public _pStride:Object = new Object(); - public _pOffset:Object = new Object(); - - public _pUpdateStrideOffset() - { - throw new away.errors.AbstractMethodError(); - } - - public _pSubMeshClass:ISubMeshClass; - - public get subMeshClass():ISubMeshClass - { - return this._pSubMeshClass; - } - - /** - * - */ - public get concatenateArrays():boolean - { - return this._pConcatenateArrays; - } - - public set concatenateArrays(value:boolean) - { - if (this._pConcatenateArrays == value) - return; - - this._pConcatenateArrays = value; - - this._pStrideOffsetDirty = true; - - if (value) - this._pNotifyVerticesUpdate(); - } - - /** - * The raw index data that define the faces. - */ - public get indices():Array - { - return this._pIndices; - } - - /** - * - */ - public get vertices():Array - { - this.updateVertices(); - - return this._pVertices; - } - - /** - * The total amount of triangles in the TriangleSubGeometry. - */ - public get numTriangles():number - { - return this._numTriangles; - } - - public get numVertices():number - { - return this._pNumVertices; - } - - /** - * - */ - constructor(concatenatedArrays:boolean) - { - super(); - - this._pConcatenateArrays = concatenatedArrays; - } - - /** - * - */ - public getStride(dataType:string) - { - if (this._pStrideOffsetDirty) - this._pUpdateStrideOffset(); - - return this._pStride[dataType]; - } - - /** - * - */ - public getOffset(dataType:string) - { - if (this._pStrideOffsetDirty) - this._pUpdateStrideOffset(); - - return this._pOffset[dataType]; - } - - public updateVertices() - { - throw new away.errors.AbstractMethodError(); - } - - /** - * - */ - public dispose() - { - this._pIndices = null; - this._pVertices = null; - } - - /** - * Updates the face indices of the TriangleSubGeometry. - * - * @param indices The face indices to upload. - */ - public updateIndices(indices:Array) - { - this._pIndices = indices; - this._numIndices = indices.length; - - this._numTriangles = this._numIndices/3; - - this.notifyIndicesUpdate(); - } - - /** - * @protected - */ - public pInvalidateBounds() - { - if (this.parentGeometry) - this.parentGeometry.iInvalidateBounds(this); - } - - /** - * The Geometry object that 'owns' this TriangleSubGeometry object. - * - * @private - */ - public parentGeometry:away.base.Geometry; - - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - public clone():SubGeometryBase - { - throw new away.errors.AbstractMethodError(); - } - - public applyTransformation(transform:away.geom.Matrix3D) - { - - } - - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - public scale(scale:number) - { - - } - - public scaleUV(scaleU:number = 1, scaleV:number = 1) - { - - } - - public getBoundingPositions():Array - { - throw new away.errors.AbstractMethodError(); - } - - private notifyIndicesUpdate() - { - if (!this._indicesUpdated) - this._indicesUpdated = new away.events.SubGeometryEvent(away.events.SubGeometryEvent.INDICES_UPDATED); - - this.dispatchEvent(this._indicesUpdated); - } - - public _pNotifyVerticesUpdate() - { - throw new away.errors.AbstractMethodError(); - } - } -} diff --git a/src/away/core/base/SubMeshBase.ts b/src/away/core/base/SubMeshBase.ts deleted file mode 100644 index 1c9cf5ca..00000000 --- a/src/away/core/base/SubMeshBase.ts +++ /dev/null @@ -1,162 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - import IAnimator = away.animators.IAnimator; - import Camera = away.entities.Camera; - import Mesh = away.entities.Mesh; - import Matrix3D = away.geom.Matrix3D; - import UVTransform = away.geom.UVTransform; - import MaterialBase = away.materials.MaterialBase; - import IRenderable = away.pool.IRenderable; - - /** - * SubMeshBase wraps a TriangleSubGeometry as a scene graph instantiation. A SubMeshBase is owned by a Mesh object. - * - * - * @see away.base.TriangleSubGeometry - * @see away.entities.Mesh - * - * @class away.base.SubMeshBase - */ - export class SubMeshBase extends away.library.NamedAssetBase - { - public _pParentMesh:Mesh; - public _uvTransform:UVTransform; - - public _iIndex:number = 0; - - public _material:MaterialBase; - private _renderables:Array = new Array(); - - //TODO test shader picking -// public get shaderPickingDetails():boolean -// { -// -// return this.sourceEntity.shaderPickingDetails; -// } - - /** - * The animator object that provides the state for the TriangleSubMesh's animation. - */ - public get animator():IAnimator - { - return this._pParentMesh.animator; - } - - /** - * The material used to render the current TriangleSubMesh. If set to null, its parent Mesh's material will be used instead. - */ - public get material():MaterialBase - { - return this._material || this._pParentMesh.material; - } - - public set material(value:MaterialBase) - { - if (this.material) - this.material.iRemoveOwner(this); - - this._material = value; - - if (this.material) - this.material.iAddOwner(this); - } - - /** - * The scene transform object that transforms from model to world space. - */ - public get sceneTransform():Matrix3D - { - return this._pParentMesh.sceneTransform; - } - - /** - * The entity that that initially provided the IRenderable to the render pipeline (ie: the owning Mesh object). - */ - public get parentMesh():Mesh - { - return this._pParentMesh; - } - - /** - * - */ - public get uvTransform():UVTransform - { - return this._uvTransform || this._pParentMesh.uvTransform; - } - - public set uvTransform(value:UVTransform) - { - this._uvTransform = value; - } - - /** - * Creates a new SubMeshBase object - */ - constructor() - { - super(); - } - - /** - * - */ - public dispose() - { - this.material = null; - - var len:number = this._renderables.length; - for (var i:number = 0; i < len; i++) - this._renderables[i].dispose(); - } - - /** - * - * @param camera - * @returns {away.geom.Matrix3D} - */ - public getRenderSceneTransform(camera:Camera):Matrix3D - { - return this._pParentMesh.getRenderSceneTransform(camera); - } - - public _iAddRenderable(renderable:IRenderable):IRenderable - { - this._renderables.push(renderable); - - return renderable; - } - - - public _iRemoveRenderable(renderable:IRenderable):IRenderable - { - var index:number = this._renderables.indexOf(renderable); - - this._renderables.splice(index, 1); - - return renderable; - } - - public _iInvalidateRenderableGeometry() - { - var len:number = this._renderables.length; - for (var i:number = 0; i < len; i++) - this._renderables[i].invalidateGeometry(); - } - - public _iCollectRenderable(renderer:away.render.IRenderer) - { - throw new away.errors.AbstractMethodError(); - } - - public _iGetExplicitMaterial():MaterialBase - { - return this._material; - } - } -} diff --git a/src/away/core/base/TriangleSubGeometry.ts b/src/away/core/base/TriangleSubGeometry.ts deleted file mode 100644 index 24fefc59..00000000 --- a/src/away/core/base/TriangleSubGeometry.ts +++ /dev/null @@ -1,1456 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - import SubGeometryEvent = away.events.SubGeometryEvent; - - /** - * @class away.base.TriangleSubGeometry - */ - export class TriangleSubGeometry extends SubGeometryBase - { - public static POSITION_DATA:string = "positions"; - public static NORMAL_DATA:string = "vertexNormals"; - public static TANGENT_DATA:string = "vertexTangents"; - public static UV_DATA:string = "uvs"; - public static SECONDARY_UV_DATA:string = "secondaryUVs"; - public static JOINT_INDEX_DATA:string = "jointIndices"; - public static JOINT_WEIGHT_DATA:string = "jointWeights"; - - //TODO - move these to StageGL - public static POSITION_FORMAT:string = "float3"; - public static NORMAL_FORMAT:string = "float3"; - public static TANGENT_FORMAT:string = "float3"; - public static UV_FORMAT:string = "float2"; - public static SECONDARY_UV_FORMAT:string = "float2"; - - private _positionsDirty:boolean = true; - private _faceNormalsDirty:boolean = true; - private _faceTangentsDirty:boolean = true; - private _vertexNormalsDirty:boolean = true; - private _vertexTangentsDirty:boolean = true; - private _uvsDirty:boolean = true; - private _secondaryUVsDirty:boolean = true; - private _jointIndicesDirty:boolean = true; - private _jointWeightsDirty:boolean = true; - - private _positions:Array; - private _vertexNormals:Array; - private _vertexTangents:Array; - private _uvs:Array; - private _secondaryUVs:Array; - private _jointIndices:Array; - private _jointWeights:Array; - - private _useCondensedIndices:boolean; - private _condensedJointIndices:Array; - private _condensedIndexLookUp:Array; - private _numCondensedJoints:number; - - private _jointsPerVertex:number; - - private _concatenateArrays:boolean = true; - private _autoDeriveNormals:boolean = true; - private _autoDeriveTangents:boolean = true; - private _autoDeriveUVs:boolean = false; - private _useFaceWeights:boolean = false; - - private _faceNormals:Array; - private _faceTangents:Array; - private _faceWeights:Array; - - private _scaleU:number = 1; - private _scaleV:number = 1; - - private _positionsUpdated:SubGeometryEvent; - private _normalsUpdated:SubGeometryEvent; - private _tangentsUpdated:SubGeometryEvent; - private _uvsUpdated:SubGeometryEvent; - private _secondaryUVsUpdated:SubGeometryEvent; - private _jointIndicesUpdated:SubGeometryEvent; - private _jointWeightsUpdated:SubGeometryEvent; - - /** - * - */ - public get scaleU():number - { - return this._scaleU; - } - - /** - * - */ - public get scaleV():number - { - return this._scaleV; - } - - /** - * Offers the option of enabling GPU accelerated animation on skeletons larger than 32 joints - * by condensing the number of joint index values required per mesh. Only applicable to - * skeleton animations that utilise more than one mesh object. Defaults to false. - */ - public get useCondensedIndices():boolean - { - return this._useCondensedIndices; - } - - public set useCondensedIndices(value:boolean) - { - if (this._useCondensedIndices == value) - return; - - this._useCondensedIndices = value; - - this.notifyJointIndicesUpdate(); - } - - public _pUpdateStrideOffset() - { - if (this._concatenateArrays) { - this._pOffset[TriangleSubGeometry.VERTEX_DATA] = 0; - - //always have positions - this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; - var stride:number = 3; - - if (this._vertexNormals != null) { - this._pOffset[TriangleSubGeometry.NORMAL_DATA] = stride; - stride += 3; - } - - if (this._vertexTangents != null) { - this._pOffset[TriangleSubGeometry.TANGENT_DATA] = stride; - stride += 3; - } - - if (this._uvs != null) { - this._pOffset[TriangleSubGeometry.UV_DATA] = stride; - stride += 2; - } - - if (this._secondaryUVs != null) { - this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; - stride += 2; - } - - if (this._jointIndices != null) { - this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; - stride += this._jointsPerVertex; - } - - if (this._jointWeights != null) { - this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; - stride += this._jointsPerVertex; - } - - this._pStride[TriangleSubGeometry.VERTEX_DATA] = stride; - this._pStride[TriangleSubGeometry.POSITION_DATA] = stride; - this._pStride[TriangleSubGeometry.NORMAL_DATA] = stride; - this._pStride[TriangleSubGeometry.TANGENT_DATA] = stride; - this._pStride[TriangleSubGeometry.UV_DATA] = stride; - this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = stride; - this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = stride; - this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = stride; - - var len:number = this._pNumVertices*stride; - - if (this._pVertices == null) - this._pVertices = new Array(len); - else if (this._pVertices.length != len) - this._pVertices.length = len; - - } else { - this._pOffset[TriangleSubGeometry.POSITION_DATA] = 0; - this._pOffset[TriangleSubGeometry.NORMAL_DATA] = 0; - this._pOffset[TriangleSubGeometry.TANGENT_DATA] = 0; - this._pOffset[TriangleSubGeometry.UV_DATA] = 0; - this._pOffset[TriangleSubGeometry.SECONDARY_UV_DATA] = 0; - this._pOffset[TriangleSubGeometry.JOINT_INDEX_DATA] = 0; - this._pOffset[TriangleSubGeometry.JOINT_WEIGHT_DATA] = 0; - - this._pStride[TriangleSubGeometry.POSITION_DATA] = 3; - this._pStride[TriangleSubGeometry.NORMAL_DATA] = 3; - this._pStride[TriangleSubGeometry.TANGENT_DATA] = 3; - this._pStride[TriangleSubGeometry.UV_DATA] = 2; - this._pStride[TriangleSubGeometry.SECONDARY_UV_DATA] = 2; - this._pStride[TriangleSubGeometry.JOINT_INDEX_DATA] = this._jointsPerVertex; - this._pStride[TriangleSubGeometry.JOINT_WEIGHT_DATA] = this._jointsPerVertex; - } - - this._pStrideOffsetDirty = false; - } - - /** - * - */ - public get jointsPerVertex():number - { - return this._jointsPerVertex; - } - - public set jointsPerVertex(value:number) - { - if (this._jointsPerVertex == value) - return; - - this._jointsPerVertex = value; - - this._pStrideOffsetDirty = true; - - if (this._pConcatenateArrays) - this._pNotifyVerticesUpdate(); - } - - /** - * Defines whether a UV buffer should be automatically generated to contain dummy UV coordinates. - * Set to true if a geometry lacks UV data but uses a material that requires it, or leave as false - * in cases where UV data is explicitly defined or the material does not require UV data. - */ - public get autoDeriveUVs():boolean - { - return this._autoDeriveUVs; - } - - public set autoDeriveUVs(value:boolean) - { - if (this._autoDeriveUVs == value) - return; - - this._autoDeriveUVs = value; - - if (value) - this.notifyUVsUpdate(); - } - - /** - * True if the vertex normals should be derived from the geometry, false if the vertex normals are set - * explicitly. - */ - public get autoDeriveNormals():boolean - { - return this._autoDeriveNormals; - } - - public set autoDeriveNormals(value:boolean) - { - if (this._autoDeriveNormals == value) - return; - - this._autoDeriveNormals = value; - - if (value) - this.notifyNormalsUpdate(); - } - - /** - * True if the vertex tangents should be derived from the geometry, false if the vertex normals are set - * explicitly. - */ - public get autoDeriveTangents():boolean - { - return this._autoDeriveTangents; - } - - public set autoDeriveTangents(value:boolean) - { - if (this._autoDeriveTangents == value) - return; - - this._autoDeriveTangents = value; - - if (value) - this.notifyTangentsUpdate(); - } - - /** - * - */ - public get vertices():Array - { - if (this._positionsDirty) - this.updatePositions(this._positions); - - if (this._vertexNormalsDirty) - this.updateVertexNormals(this._vertexNormals); - - if (this._vertexTangentsDirty) - this.updateVertexTangents(this._vertexTangents); - - if (this._uvsDirty) - this.updateUVs(this._uvs); - - if (this._secondaryUVsDirty) - this.updateSecondaryUVs(this._secondaryUVs); - - if (this._jointIndicesDirty) - this.updateJointIndices(this._jointIndices); - - if (this._jointWeightsDirty) - this.updateJointWeights(this._jointWeights); - - return this._pVertices; - } - - /** - * - */ - public get positions():Array - { - if (this._positionsDirty) - this.updatePositions(this._positions); - - return this._positions; - } - - /** - * - */ - public get vertexNormals():Array - { - if (this._vertexNormalsDirty) - this.updateVertexNormals(this._vertexNormals); - - return this._vertexNormals; - } - - /** - * - */ - public get vertexTangents():Array - { - if (this._vertexTangentsDirty) - this.updateVertexTangents(this._vertexTangents); - - return this._vertexTangents; - } - - /** - * The raw data of the face normals, in the same order as the faces are listed in the index list. - */ - public get faceNormals():Array - { - if (this._faceNormalsDirty) - this.updateFaceNormals(); - - return this._faceNormals; - } - - /** - * The raw data of the face tangets, in the same order as the faces are listed in the index list. - */ - public get faceTangents():Array - { - if (this._faceTangentsDirty) - this.updateFaceTangents(); - - return this._faceTangents; - } - - /** - * - */ - public get uvs():Array - { - if (this._uvsDirty) - this.updateUVs(this._uvs); - - return this._uvs; - } - - /** - * - */ - public get secondaryUVs():Array - { - if (this._secondaryUVsDirty) - this.updateSecondaryUVs(this._secondaryUVs); - - return this._secondaryUVs; - } - - /** - * - */ - public get jointIndices():Array - { - if (this._jointIndicesDirty) - this.updateJointIndices(this._jointIndices); - - if (this._useCondensedIndices) - return this._condensedJointIndices; - - return this._jointIndices; - } - - /** - * - */ - public get jointWeights():Array - { - if (this._jointWeightsDirty) - this.updateJointWeights(this._jointWeights); - - return this._jointWeights; - } - - /** - * Indicates whether or not to take the size of faces into account when auto-deriving vertex normals and tangents. - */ - public get useFaceWeights():boolean - { - return this._useFaceWeights; - } - - public set useFaceWeights(value:boolean) - { - if (this._useFaceWeights == value) - return; - - this._useFaceWeights = value; - - if (this._autoDeriveNormals) - this.notifyNormalsUpdate(); - - if (this._autoDeriveTangents) - this.notifyTangentsUpdate(); - - this._faceNormalsDirty = true; - } - - public get numCondensedJoints():number - { - if (this._jointIndicesDirty) - this.updateJointIndices(this._jointIndices); - - return this._numCondensedJoints; - } - - public get condensedIndexLookUp():Array - { - if (this._jointIndicesDirty) - this.updateJointIndices(this._jointIndices); - - return this._condensedIndexLookUp; - } - - /** - * - */ - constructor(concatenatedArrays:boolean) - { - super(concatenatedArrays); - - this._pSubMeshClass = TriangleSubMesh; - } - - public getBoundingPositions():Array - { - if (this._positionsDirty) - this.updatePositions(this._positions); - - return this._positions; - } - - /** - * - */ - public updatePositions(values:Array) - { - var i:number; - var index:number; - var stride:number; - var positions:Array; - - this._positions = values; - - if (this._positions == null) - this._positions = new Array(); - - this._pNumVertices = this._positions.length/3; - - if (this._concatenateArrays) { - var len:number = this._pNumVertices*this.getStride(TriangleSubGeometry.VERTEX_DATA); - - if (this._pVertices == null) - this._pVertices = new Array(len); - else if (this._pVertices.length != len) - this._pVertices.length = len; - - i = 0; - index = this.getOffset(TriangleSubGeometry.POSITION_DATA); - stride = this.getStride(TriangleSubGeometry.POSITION_DATA); - positions = this._pVertices; - - while (i < values.length) { - positions[index] = values[i++]; - positions[index + 1] = values[i++]; - positions[index + 2] = values[i++]; - index += stride; - } - } - - if (this._autoDeriveNormals) - this.notifyNormalsUpdate(); - - if (this._autoDeriveTangents) - this.notifyTangentsUpdate(); - - if (this._autoDeriveUVs) - this.notifyUVsUpdate() - - this.pInvalidateBounds(); - - this.notifyPositionsUpdate(); - - this._positionsDirty = false; - } - - /** - * Updates the vertex normals based on the geometry. - */ - public updateVertexNormals(values:Array) - { - var i:number; - var index:number; - var offset:number; - var stride:number; - var normals:Array; - - if (!this._autoDeriveNormals) { - if ((this._vertexNormals == null || values == null) && (this._vertexNormals != null || values != null)) { - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - this._vertexNormals = values; - - if (values != null && this._concatenateArrays) { - i = 0; - index = this.getOffset(TriangleSubGeometry.NORMAL_DATA); - stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); - normals = this._pVertices; - - while (i < values.length) { - normals[index] = values[i++]; - normals[index + 1] = values[i++]; - normals[index + 2] = values[i++]; - index += stride; - } - } - } else { - if (this._vertexNormals == null) { - this._vertexNormals = new Array(this._positions.length); - - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - if (this._faceNormalsDirty) - this.updateFaceNormals(); - - offset = this.getOffset(TriangleSubGeometry.NORMAL_DATA); - stride = this.getStride(TriangleSubGeometry.NORMAL_DATA); - - //autoderived normals - normals = this._concatenateArrays? this._pVertices : this._vertexNormals; - - var f1:number = 0; - var f2:number = 1; - var f3:number = 2; - - index = offset; - - //clear normal values - var lenV:number = normals.length; - while (index < lenV) { - normals[index] = 0; - normals[index + 1] = 0; - normals[index + 2] = 0; - index += stride; - } - - var k:number = 0; - var lenI:number = this._pIndices.length; - var weight:number; - - i = 0; - - //collect face normals - while (i < lenI) { - weight = this._useFaceWeights? this._faceWeights[k++] : 1; - index = offset + this._pIndices[i++]*stride; - normals[index] += this._faceNormals[f1]*weight; - normals[index + 1] += this._faceNormals[f2]*weight; - normals[index + 2] += this._faceNormals[f3]*weight; - index = offset + this._pIndices[i++]*stride; - normals[index] += this._faceNormals[f1]*weight; - normals[index + 1] += this._faceNormals[f2]*weight; - normals[index + 2] += this._faceNormals[f3]*weight; - index = offset + this._pIndices[i++]*stride; - normals[index] += this._faceNormals[f1]*weight; - normals[index + 1] += this._faceNormals[f2]*weight; - normals[index + 2] += this._faceNormals[f3]*weight; - f1 += 3; - f2 += 3; - f3 += 3; - } - - i = 0; - index = offset; - - //average normals collections - while (index < lenV) { - var vx:number = normals[index]; - var vy:number = normals[index + 1]; - var vz:number = normals[index + 2]; - var d:number = 1.0/Math.sqrt(vx*vx + vy*vy + vz*vz); - - if (this._concatenateArrays) { - this._vertexNormals[i++] = normals[index] = vx*d; - this._vertexNormals[i++] = normals[index + 1] = vy*d; - this._vertexNormals[i++] = normals[index + 2] = vz*d; - } else { - normals[index] = vx*d; - normals[index + 1] = vy*d; - normals[index + 2] = vz*d; - } - - index += stride; - } - } - - this.notifyNormalsUpdate(); - - this._vertexNormalsDirty = false; - } - - /** - * Updates the vertex tangents based on the geometry. - */ - public updateVertexTangents(values:Array) - { - var i:number; - var index:number; - var offset:number; - var stride:number; - var tangents:Array; - - if (!this._autoDeriveTangents) { - if ((this._vertexTangents == null || values == null) && (this._vertexTangents != null || values != null)) { - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - - this._vertexTangents = values; - - if (values != null && this._concatenateArrays) { - i = 0; - index = this.getOffset(TriangleSubGeometry.TANGENT_DATA); - stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); - tangents = this._pVertices; - - while (i < values.length) { - tangents[index] = values[i++]; - tangents[index + 1] = values[i++]; - tangents[index + 2] = values[i++]; - index += stride; - } - } - } else { - if (this._vertexTangents == null) { - this._vertexTangents = new Array(this._positions.length); - - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - if (this._faceTangentsDirty) - this.updateFaceTangents(); - - offset = this.getOffset(TriangleSubGeometry.TANGENT_DATA); - stride = this.getStride(TriangleSubGeometry.TANGENT_DATA); - - //autoderived tangents - tangents = this._concatenateArrays? this._pVertices : this._vertexTangents; - - index = offset; - - //clear tangent values - var lenV:number = tangents.length; - while (index < lenV) { - tangents[index] = 0; - tangents[index + 1] = 0; - tangents[index + 2] = 0; - - index += stride; - } - - var k:number = 0; - var weight:number; - var f1:number = 0; - var f2:number = 1; - var f3:number = 2; - - i = 0; - - //collect face tangents - var lenI:number = this._pIndices.length; - while (i < lenI) { - weight = this._useFaceWeights? this._faceWeights[k++] : 1; - index = offset + this._pIndices[i++]*stride; - tangents[index++] += this._faceTangents[f1]*weight; - tangents[index++] += this._faceTangents[f2]*weight; - tangents[index] += this._faceTangents[f3]*weight; - index = offset + this._pIndices[i++]*stride; - tangents[index++] += this._faceTangents[f1]*weight; - tangents[index++] += this._faceTangents[f2]*weight; - tangents[index] += this._faceTangents[f3]*weight; - index = offset + this._pIndices[i++]*stride; - tangents[index++] += this._faceTangents[f1]*weight; - tangents[index++] += this._faceTangents[f2]*weight; - tangents[index] += this._faceTangents[f3]*weight; - f1 += 3; - f2 += 3; - f3 += 3; - } - - i = 0; - index = offset; - - //average tangents collections - while (index < lenV) { - var vx:number = tangents[index]; - var vy:number = tangents[index + 1]; - var vz:number = tangents[index + 2]; - var d:number = 1.0/Math.sqrt(vx*vx + vy*vy + vz*vz); - - if (this._concatenateArrays) { - this._vertexTangents[i++] = tangents[index] = vx*d; - this._vertexTangents[i++] = tangents[index + 1] = vy*d; - this._vertexTangents[i++] = tangents[index + 2] = vz*d; - } else { - tangents[index] = vx*d; - tangents[index + 1] = vy*d; - tangents[index + 2] = vz*d; - } - - index += stride; - } - } - - this.notifyTangentsUpdate(); - - this._vertexTangentsDirty = false; - } - - /** - * Updates the uvs based on the geometry. - */ - public updateUVs(values:Array) - { - var i:number; - var index:number; - var offset:number; - var stride:number; - var uvs:Array; - - if (!this._autoDeriveUVs) { - if ((this._uvs == null || values == null) && (this._uvs != null || values != null)) { - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - this._uvs = values; - - if (values != null && this._concatenateArrays) { - i = 0; - index = this.getOffset(TriangleSubGeometry.UV_DATA); - stride = this.getStride(TriangleSubGeometry.UV_DATA); - uvs = this._pVertices; - - while (i < values.length) { - uvs[index] = values[i++]; - uvs[index + 1] = values[i++]; - index += stride; - } - } - - } else { - if (this._uvs == null) { - this._uvs = new Array(this._positions.length*2/3); - - if (this._concatenateArrays) - this._pNotifyVerticesUpdate(); - else - this._pStrideOffsetDirty = true; - } - - offset = this.getOffset(TriangleSubGeometry.UV_DATA); - stride = this.getStride(TriangleSubGeometry.UV_DATA); - - //autoderived uvs - uvs = this._concatenateArrays? this._pVertices : this._uvs; - - i = 0; - index = offset; - var uvIdx:number = 0; - - //clear uv values - var lenV:number = uvs.length; - while (index < lenV) { - if (this._concatenateArrays) { - this._uvs[i++] = uvs[index] = uvIdx*.5; - this._uvs[i++] = uvs[index + 1] = 1.0 - (uvIdx & 1); - } else { - uvs[index] = uvIdx*.5; - uvs[index + 1] = 1.0 - (uvIdx & 1); - } - - if (++uvIdx == 3) - uvIdx = 0; - - index += stride; - } - } - - if (this._autoDeriveTangents) - this.notifyTangentsUpdate(); - - this.notifyUVsUpdate(); - - this._uvsDirty = false; - } - - /** - * Updates the secondary uvs based on the geometry. - */ - public updateSecondaryUVs(values:Array) - { - var i:number; - var index:number; - var offset:number; - var stride:number; - var uvs:Array; - - if (this._concatenateArrays && (this._secondaryUVs == null || values == null) && (this._secondaryUVs != null || values != null)) - this._pNotifyVerticesUpdate(); - - this._secondaryUVs = values; - - if (values != null && this._concatenateArrays) { - offset = this.getOffset(TriangleSubGeometry.SECONDARY_UV_DATA); - stride = this.getStride(TriangleSubGeometry.SECONDARY_UV_DATA); - - i = 0; - index = offset; - uvs = this._pVertices; - - while (i < values.length) { - uvs[index] = values[i++]; - uvs[index + 1] = values[i++]; - index += stride; - } - } - - this.notifySecondaryUVsUpdate(); - - this._secondaryUVsDirty = false; - } - - /** - * Updates the joint indices - */ - public updateJointIndices(values:Array) - { - var i:number; - var j:number; - var index:number; - var offset:number; - var stride:number; - var jointIndices:Array; - - if (this._concatenateArrays && (this._jointIndices == null || values == null) && (this._jointIndices != null || values != null)) - this._pNotifyVerticesUpdate(); - - this._jointIndices = values; - - if (values != null) { - offset = this.getOffset(TriangleSubGeometry.JOINT_INDEX_DATA); - stride = this.getStride(TriangleSubGeometry.JOINT_INDEX_DATA); - if (this._useCondensedIndices) { - i = 0; - j = 0; - index = offset; - jointIndices = this._concatenateArrays? this._pVertices : this._condensedJointIndices; - var oldIndex:number; - var newIndex:number = 0; - var dic:Object = new Object(); - - if (!this._concatenateArrays) - this._condensedJointIndices = new Array(values.length); - - this._condensedIndexLookUp = new Array(); - - while (i < values.length) { - for (j = 0; j < this._jointsPerVertex; j++) { - oldIndex = values[i++]; - - // if we encounter a new index, assign it a new condensed index - if (dic[oldIndex] == undefined) { - dic[oldIndex] = newIndex*3; //3 required for the three vectors that store the matrix - this._condensedIndexLookUp[newIndex++] = oldIndex; - } - jointIndices[index + j] = dic[oldIndex]; - } - index += stride; - } - this._numCondensedJoints = newIndex; - } else if (this._concatenateArrays) { - - i = 0; - index = offset; - jointIndices = this._pVertices; - - while (i < values.length) { - j = 0; - while (j < this._jointsPerVertex) - jointIndices[index + j++] = values[i++]; - index += stride; - } - } - } - - this.notifyJointIndicesUpdate(); - - this._jointIndicesDirty = false; - } - - /** - * Updates the joint weights. - */ - public updateJointWeights(values:Array) - { - var i:number; - var j:number; - var index:number; - var offset:number; - var stride:number; - var jointWeights:Array; - - if (this._concatenateArrays && (this._jointWeights == null || values == null) && (this._jointWeights != null || values != null)) - this._pNotifyVerticesUpdate(); - - this._jointWeights = values; - - if (values != null && this._concatenateArrays) { - offset = this.getOffset(TriangleSubGeometry.JOINT_WEIGHT_DATA); - stride = this.getStride(TriangleSubGeometry.JOINT_WEIGHT_DATA); - - i = 0; - index = offset; - jointWeights = this._pVertices; - - while (i < values.length) { - j = 0; - while (j < this._jointsPerVertex) - jointWeights[index + j++] = values[i++]; - index += stride; - } - } - - this.notifyJointWeightsUpdate(); - - this._jointWeightsDirty = false; - } - - /** - * - */ - public dispose() - { - super.dispose(); - - this._positions = null; - this._vertexNormals = null; - this._vertexTangents = null; - this._uvs = null; - this._secondaryUVs = null; - this._jointIndices = null; - this._jointWeights = null; - - this._faceNormals = null; - this._faceWeights = null; - this._faceTangents = null; - } - - /** - * Updates the face indices of the TriangleSubGeometry. - * - * @param indices The face indices to upload. - */ - public updateIndices(indices:Array) - { - super.updateIndices(indices); - - this._faceNormalsDirty = true; - - if (this._autoDeriveNormals) - this._vertexNormalsDirty = true; - - if (this._autoDeriveTangents) - this._vertexTangentsDirty = true; - - if (this._autoDeriveUVs) - this._uvsDirty = true; - } - - /** - * Clones the current object - * @return An exact duplicate of the current object. - */ - public clone():TriangleSubGeometry - { - var clone:TriangleSubGeometry = new TriangleSubGeometry(this._concatenateArrays); - clone.updateIndices(this._pIndices.concat()); - clone.updatePositions(this._positions.concat()); - - if (this._vertexNormals && !this._autoDeriveNormals) - clone.updateVertexNormals(this._vertexNormals.concat()); - else - clone.updateVertexNormals(null); - - if (this._uvs && !this._autoDeriveUVs) - clone.updateUVs(this._uvs.concat()); - else - clone.updateUVs(null); - - if (this._vertexTangents && !this._autoDeriveTangents) - clone.updateVertexTangents(this._vertexTangents.concat()); - else - clone.updateVertexTangents(null); - - if (this._secondaryUVs) - clone.updateSecondaryUVs(this._secondaryUVs.concat()); - - if (this._jointIndices) { - clone.jointsPerVertex = this._jointsPerVertex; - clone.updateJointIndices(this._jointIndices.concat()); - } - - if (this._jointWeights) - clone.updateJointWeights(this._jointWeights.concat()); - - return clone; - } - - public scaleUV(scaleU:number = 1, scaleV:number = 1) - { - var index:number; - var offset:number; - var stride:number; - var uvs:Array; - - uvs = this._uvs; - - var ratioU:number = scaleU/this._scaleU; - var ratioV:number = scaleV/this._scaleV; - - this._scaleU = scaleU; - this._scaleV = scaleV; - - var len:number = uvs.length; - - offset = 0; - stride = 2; - - index = offset; - - while (index < len) { - uvs[index] *= ratioU; - uvs[index + 1] *= ratioV; - index += stride; - } - - this.notifyUVsUpdate(); - } - - /** - * Scales the geometry. - * @param scale The amount by which to scale. - */ - public scale(scale:number) - { - var i:number; - var index:number; - var offset:number; - var stride:number; - var positions:Array; - - positions = this._positions; - - var len:number = positions.length; - - offset = 0; - stride = 3; - - i = 0; - index = offset; - while (i < len) { - positions[index] *= scale; - positions[index + 1] *= scale; - positions[index + 2] *= scale; - - i += 3; - index += stride; - } - - this.notifyPositionsUpdate(); - } - - public applyTransformation(transform:away.geom.Matrix3D) - { - var positions:Array; - var normals:Array; - var tangents:Array; - - if (this._concatenateArrays) { - positions = this._pVertices; - normals = this._pVertices; - tangents = this._pVertices; - } else { - positions = this._positions; - normals = this._vertexNormals; - tangents = this._vertexTangents; - } - - var len:number = this._positions.length/3; - var i:number; - var i1:number; - var i2:number; - var vector:away.geom.Vector3D = new away.geom.Vector3D(); - - var bakeNormals:boolean = this._vertexNormals != null; - var bakeTangents:boolean = this._vertexTangents != null; - var invTranspose:away.geom.Matrix3D; - - if (bakeNormals || bakeTangents) { - invTranspose = transform.clone(); - invTranspose.invert(); - invTranspose.transpose(); - } - - var vi0:number = this.getOffset(TriangleSubGeometry.POSITION_DATA); - var ni0:number = this.getOffset(TriangleSubGeometry.NORMAL_DATA); - var ti0:number = this.getOffset(TriangleSubGeometry.TANGENT_DATA); - - var vStride:number = this.getStride(TriangleSubGeometry.POSITION_DATA); - var nStride:number = this.getStride(TriangleSubGeometry.NORMAL_DATA); - var tStride:number = this.getStride(TriangleSubGeometry.TANGENT_DATA); - - for (i = 0; i < len; ++i) { - i1 = vi0 + 1; - i2 = vi0 + 2; - - // bake position - vector.x = positions[vi0]; - vector.y = positions[i1]; - vector.z = positions[i2]; - vector = transform.transformVector(vector); - positions[vi0] = vector.x; - positions[i1] = vector.y; - positions[i2] = vector.z; - vi0 += vStride; - - // bake normal - if (bakeNormals) { - i1 = ni0 + 1; - i2 = ni0 + 2; - vector.x = normals[ni0]; - vector.y = normals[i1]; - vector.z = normals[i2]; - vector = invTranspose.deltaTransformVector(vector); - vector.normalize(); - normals[ni0] = vector.x; - normals[i1] = vector.y; - normals[i2] = vector.z; - ni0 += nStride; - } - - // bake tangent - if (bakeTangents) { - i1 = ti0 + 1; - i2 = ti0 + 2; - vector.x = tangents[ti0]; - vector.y = tangents[i1]; - vector.z = tangents[i2]; - vector = invTranspose.deltaTransformVector(vector); - vector.normalize(); - tangents[ti0] = vector.x; - tangents[i1] = vector.y; - tangents[i2] = vector.z; - ti0 += tStride; - } - } - - this.notifyPositionsUpdate(); - this.notifyNormalsUpdate(); - this.notifyTangentsUpdate(); - } - - /** - * Updates the tangents for each face. - */ - private updateFaceTangents() - { - var i:number = 0; - var index1:number; - var index2:number; - var index3:number; - var vi:number; - var v0:number; - var dv1:number; - var dv2:number; - var denom:number; - var x0:number, y0:number, z0:number; - var dx1:number, dy1:number, dz1:number; - var dx2:number, dy2:number, dz2:number; - var cx:number, cy:number, cz:number; - - var positions:Array = this._positions - var uvs:Array = this._uvs; - - var len:number = this._pIndices.length; - - if (this._faceTangents == null) - this._faceTangents = new Array(len); - - while (i < len) { - index1 = this._pIndices[i]; - index2 = this._pIndices[i + 1]; - index3 = this._pIndices[i + 2]; - - v0 = uvs[index1*2 + 1]; - dv1 = uvs[index2*2 + 1] - v0; - dv2 = uvs[index3*2 + 1] - v0; - - vi = index1*3; - x0 = positions[vi]; - y0 = positions[vi + 1]; - z0 = positions[vi + 2]; - vi = index2*3; - dx1 = positions[vi] - x0; - dy1 = positions[vi + 1] - y0; - dz1 = positions[vi + 2] - z0; - vi = index3*3; - dx2 = positions[vi] - x0; - dy2 = positions[vi + 1] - y0; - dz2 = positions[vi + 2] - z0; - - cx = dv2*dx1 - dv1*dx2; - cy = dv2*dy1 - dv1*dy2; - cz = dv2*dz1 - dv1*dz2; - denom = 1/Math.sqrt(cx*cx + cy*cy + cz*cz); - - this._faceTangents[i++] = denom*cx; - this._faceTangents[i++] = denom*cy; - this._faceTangents[i++] = denom*cz; - } - - this._faceTangentsDirty = false; - } - - /** - * Updates the normals for each face. - */ - private updateFaceNormals() - { - var i:number = 0; - var j:number = 0; - var k:number = 0; - var index:number; - var offset:number; - var stride:number; - - var x1:number, x2:number, x3:number; - var y1:number, y2:number, y3:number; - var z1:number, z2:number, z3:number; - var dx1:number, dy1:number, dz1:number; - var dx2:number, dy2:number, dz2:number; - var cx:number, cy:number, cz:number; - var d:number; - - var positions:Array = this._positions; - - var len:number = this._pIndices.length; - - if (this._faceNormals == null) - this._faceNormals = new Array(len); - - if (this._useFaceWeights && this._faceWeights == null) - this._faceWeights = new Array(len/3); - - while (i < len) { - index = this._pIndices[i++]*3; - x1 = positions[index]; - y1 = positions[index + 1]; - z1 = positions[index + 2]; - index = this._pIndices[i++]*3; - x2 = positions[index]; - y2 = positions[index + 1]; - z2 = positions[index + 2]; - index = this._pIndices[i++]*3; - x3 = positions[index]; - y3 = positions[index + 1]; - z3 = positions[index + 2]; - dx1 = x3 - x1; - dy1 = y3 - y1; - dz1 = z3 - z1; - dx2 = x2 - x1; - dy2 = y2 - y1; - dz2 = z2 - z1; - cx = dz1*dy2 - dy1*dz2; - cy = dx1*dz2 - dz1*dx2; - cz = dy1*dx2 - dx1*dy2; - d = Math.sqrt(cx*cx + cy*cy + cz*cz); - // length of cross product = 2*triangle area - - if (this._useFaceWeights) { - var w:number = d*10000; - - if (w < 1) - w = 1; - - this._faceWeights[k++] = w; - } - - d = 1/d; - - this._faceNormals[j++] = cx*d; - this._faceNormals[j++] = cy*d; - this._faceNormals[j++] = cz*d; - } - - this._faceNormalsDirty = false; - } - - public _pNotifyVerticesUpdate() - { - this._pStrideOffsetDirty = true; - - this.notifyPositionsUpdate(); - this.notifyNormalsUpdate(); - this.notifyTangentsUpdate(); - this.notifyUVsUpdate(); - this.notifySecondaryUVsUpdate(); - this.notifyJointIndicesUpdate(); - this.notifyJointWeightsUpdate(); - } - - private notifyPositionsUpdate() - { - if (this._positionsDirty) - return; - - this._positionsDirty = true; - - if (!this._positionsUpdated) - this._positionsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.POSITION_DATA); - - this.dispatchEvent(this._positionsUpdated); - } - - private notifyNormalsUpdate() - { - if (this._vertexNormalsDirty) - return; - - this._vertexNormalsDirty = true; - - if (!this._normalsUpdated) - this._normalsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.NORMAL_DATA); - - this.dispatchEvent(this._normalsUpdated); - } - - private notifyTangentsUpdate() - { - if (this._vertexTangentsDirty) - return; - - this._vertexTangentsDirty = true; - - if (!this._tangentsUpdated) - this._tangentsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.TANGENT_DATA); - - this.dispatchEvent(this._tangentsUpdated); - } - - private notifyUVsUpdate() - { - if (this._uvsDirty) - return; - - this._uvsDirty = true; - - if (!this._uvsUpdated) - this._uvsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.UV_DATA); - - this.dispatchEvent(this._uvsUpdated); - } - - private notifySecondaryUVsUpdate() - { - if (this._secondaryUVsDirty) - return; - - this._secondaryUVsDirty = true; - - if (!this._secondaryUVsUpdated) - this._secondaryUVsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.SECONDARY_UV_DATA); - - this.dispatchEvent(this._secondaryUVsUpdated); - } - - private notifyJointIndicesUpdate() - { - if (this._jointIndicesDirty) - return; - - this._jointIndicesDirty = true; - - if (!this._jointIndicesUpdated) - this._jointIndicesUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_INDEX_DATA); - - this.dispatchEvent(this._jointIndicesUpdated); - } - - private notifyJointWeightsUpdate() - { - if (this._jointWeightsDirty) - return; - - this._jointWeightsDirty = true; - - if (!this._jointWeightsUpdated) - this._jointWeightsUpdated = new SubGeometryEvent(SubGeometryEvent.VERTICES_UPDATED, TriangleSubGeometry.JOINT_WEIGHT_DATA); - - this.dispatchEvent(this._jointWeightsUpdated); - } - } -} diff --git a/src/away/core/base/TriangleSubMesh.ts b/src/away/core/base/TriangleSubMesh.ts deleted file mode 100644 index fe3d938a..00000000 --- a/src/away/core/base/TriangleSubMesh.ts +++ /dev/null @@ -1,70 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.base -{ - import Mesh = away.entities.Mesh; - import AssetType = away.library.AssetType; - import MaterialBase = away.materials.MaterialBase; - import IRenderer = away.render.IRenderer; - - /** - * TriangleSubMesh wraps a TriangleSubGeometry as a scene graph instantiation. A TriangleSubMesh is owned by a Mesh object. - * - * - * @see away.base.TriangleSubGeometry - * @see away.entities.Mesh - * - * @class away.base.TriangleSubMesh - */ - export class TriangleSubMesh extends SubMeshBase implements ISubMesh - { - private _subGeometry:TriangleSubGeometry; - - /** - * - */ - public get assetType():string - { - return AssetType.TRIANGLE_SUB_MESH; - } - - /** - * The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. - */ - public get subGeometry():TriangleSubGeometry - { - return this._subGeometry; - } - - /** - * Creates a new TriangleSubMesh object - * @param subGeometry The TriangleSubGeometry object which provides the geometry data for this TriangleSubMesh. - * @param parentMesh The Mesh object to which this TriangleSubMesh belongs. - * @param material An optional material used to render this TriangleSubMesh. - */ - constructor(subGeometry:TriangleSubGeometry, parentMesh:Mesh, material:MaterialBase = null) - { - super(); - - this._pParentMesh = parentMesh; - this._subGeometry = subGeometry; - this.material = material; - } - - /** - * - */ - public dispose() - { - super.dispose(); - } - - public _iCollectRenderable(renderer:IRenderer) - { - renderer.applyTriangleSubMesh(this); - } - } -} diff --git a/src/away/core/display/ContextMode.ts b/src/away/core/display/ContextMode.ts deleted file mode 100644 index b72ffd59..00000000 --- a/src/away/core/display/ContextMode.ts +++ /dev/null @@ -1,12 +0,0 @@ -/// - -module away.display -{ - export class ContextMode - { - static AUTO:string = "auto"; - static WEBGL:string = "webgl"; - static FLASH:string = "flash"; - static NATIVE:string = "native"; - } -} \ No newline at end of file diff --git a/src/away/core/display/IContext.ts b/src/away/core/display/IContext.ts deleted file mode 100644 index 3d678791..00000000 --- a/src/away/core/display/IContext.ts +++ /dev/null @@ -1,28 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.display -{ - import Rectangle = away.geom.Rectangle; - - /** - * - * @class away.base.IContext - */ - export interface IContext - { - container:HTMLElement; - - clear(red?: number, green?: number, blue?: number, alpha?: number, depth?: number, stencil?: number, mask?: number); - - configureBackBuffer(width:number, height:number, antiAlias:number, enableDepthAndStencil?:boolean); - - dispose(); - - present(); - - setScissorRectangle(rect:Rectangle); - } -} \ No newline at end of file diff --git a/src/away/core/geom/Box.ts b/src/away/core/geom/Box.ts deleted file mode 100644 index 6b23b780..00000000 --- a/src/away/core/geom/Box.ts +++ /dev/null @@ -1,656 +0,0 @@ -/// - -/** - * A Box object is an area defined by its position, as indicated by its - * top-left-front corner point(x, y, z) and by its width, - * height and depth. - * - * - *

The x, y, z, width, - * height depth properties of the Box class are - * independent of each other; changing the value of one property has no effect - * on the others. However, the right, bottom and - * back properties are integrally related to those six - * properties. For example, if you change the value of the right - * property, the value of the width property changes; if you - * change the bottom property, the value of the - * height property changes.

- * - *

The following methods and properties use Box objects:

- * - *
    - *
  • The bounds property of the DisplayObject class
  • - *
- * - *

You can use the new Box() constructor to create a - * Box object.

- * - *

Note: The Box class does not define a cubic Shape - * display object. - */ -module away.geom -{ - export class Box - { - private _depth:number; - private _height:number; - private _size:Vector3D; - private _bottomRightBack:Vector3D; - private _topLeftFront:Vector3D; - private _width:number; - - /** - * The height of the box, in pixels. Changing the height value - * of a Box object has no effect on the x, y, - * z, depth and width properties. - */ - public height:number; - - /** - * The width of the box, in pixels. Changing the width value - * of a Box object has no effect on the x, y, - * z, depth and height properties. - */ - public width:number; - - /** - * The deoth of the box, in pixels. Changing the depth value - * of a Box object has no effect on the x, y, - * z, width and height properties. - */ - public depth:number; - - /** - * The x coordinate of the top-left-front corner of the box. - * Changing the value of the x property of a Box object has no - * effect on the y, z, width, - * height and depth properties. - * - *

The value of the x property is equal to the value of the - * left property.

- */ - public x:number; - - /** - * The y coordinate of the top-left-front corner of the box. - * Changing the value of the y property of a Box object has no - * effect on the x, z, width, - * height and depth properties. - * - *

The value of the y property is equal to the value of the - * top property.

- */ - public y:number; - - /** - * The y coordinate of the top-left-front corner of the box. - * Changing the value of the z property of a Box object has no - * effect on the x, y, width, - * height and depth properties. - * - *

The value of the z property is equal to the value of the - * front property.

- */ - public z:number - - /** - * The sum of the z and height properties. - */ - public get back():number - { - return this.z + this.depth; - } - - public set back(val:number) - { - this.depth = val - this.z; - } - - /** - * The sum of the y and height properties. - */ - public get bottom():number - { - return this.y + this.height; - } - - public set bottom(val:number) - { - this.height = val - this.y; - } - - /** - * The location of the Box object's bottom-right corner, determined by the - * values of the right and bottom properties. - */ - public get bottomRightBack():away.geom.Vector3D - { - if (this._bottomRightBack == null) - this._bottomRightBack = new Vector3D(); - - this._bottomRightBack.x = this.x + this.width; - this._bottomRightBack.y = this.y + this.height; - this._bottomRightBack.z = this.z + this.depth; - - return this._bottomRightBack; - } - - /** - * The z coordinate of the top-left-front corner of the box. Changing - * the front property of a Box object has no effect on the - * x, y, width and height - * properties. However it does affect the depth property, - * whereas changing the z value does not affect the - * depth property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - public get front():number - { - return this.z; - } - - public set front(val:number) - { - this.depth += this.z - val; - this.z = val; - } - - /** - * The x coordinate of the top-left corner of the box. Changing the - * left property of a Box object has no effect on the - * y and height properties. However it does affect - * the width property, whereas changing the x value - * does not affect the width property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - public get left():number - { - return this.x; - } - - public set left(val:number) - { - this.width += this.x - val; - this.x = val; - } - - /** - * The sum of the x and width properties. - */ - public get right():number - { - return this.x + this.width; - } - - public set right(val:number) - { - this.width = val - this.x; - } - - /** - * The size of the Box object, expressed as a Vector3D object with the - * values of the width, height and - * depth properties. - */ - public get size():Vector3D - { - if (this._size == null) - this._size = new Vector3D(); - - this._size.x = this.width; - this._size.y = this.height; - this._size.z = this.depth; - - return this._size; - } - - /** - * The y coordinate of the top-left-front corner of the box. Changing - * the top property of a Box object has no effect on the - * x and width properties. However it does affect - * the height property, whereas changing the y - * value does not affect the height property. - * - *

The value of the top property is equal to the value of the - * y property.

- */ - public get top():number - { - return this.y; - } - - public set top(val:number) - { - this.height += (this.y - val); - this.y = val; - } - - /** - * The location of the Box object's top-left-front corner, determined by the - * x, y and z coordinates of the point. - */ - public get topLeftFront():away.geom.Vector3D - { - if (this._topLeftFront == null) - this._topLeftFront = new away.geom.Vector3D(); - - this._topLeftFront.x = this.x; - this._topLeftFront.y = this.y; - this._topLeftFront.z = this.z; - - return this._topLeftFront; - } - - /** - * Creates a new Box object with the top-left-front corner specified by the - * x, y and z parameters and with the - * specified width, height and depth - * parameters. If you call this public without parameters, a box with - * x, y, z, width, - * height and depth properties set to 0 is created. - * - * @param x The x coordinate of the top-left-front corner of the - * box. - * @param y The y coordinate of the top-left-front corner of the - * box. - * @param z The z coordinate of the top-left-front corner of the - * box. - * @param width The width of the box, in pixels. - * @param height The height of the box, in pixels. - * @param depth The depth of the box, in pixels. - */ - constructor(x:number = 0, y:number = 0, z:number = 0, width:number = 0, height:number = 0, depth:number = 0) - { - this.x = x; - this.y = y; - this.z = z; - this.width = width; - this.height = height; - this.depth = depth; - } - - /** - * Returns a new Box object with the same values for the x, - * y, z, width, height - * and depth properties as the original Box object. - * - * @return A new Box object with the same values for the x, - * y, z, width, - * height and depth properties as the - * original Box object. - */ - public clone():Box - { - return new Box(this.x, this.y, this.z, this.width, this.height, this.depth); - } - - /** - * Determines whether the specified position is contained within the cubic - * region defined by this Box object. - * - * @param x The x coordinate(horizontal component) of the position. - * @param y The y coordinate(vertical component) of the position. - * @param z The z coordinate(longitudinal component) of the position. - * @return A value of true if the Box object contains the - * specified position; otherwise false. - */ - public contains(x:number, y:number, z:number):boolean - { - return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y && this.z <= z && this.z + this.depth >= z); - } - - /** - * Determines whether the specified position is contained within the cubic - * region defined by this Box object. This method is similar to the - * Box.contains() method, except that it takes a Vector3D - * object as a parameter. - * - * @param position The position, as represented by its x, y and - * z coordinates. - * @return A value of true if the Box object contains the - * specified position; otherwise false. - */ - public containsPoint(position:Vector3D):boolean - { - return (this.x <= position.x && this.x + this.width >= position.x && this.y <= position.y && this.y + this.height >= position.y && this.z <= position.z && this.z + this.depth >= position.z); - } - - /** - * Determines whether the Box object specified by the box - * parameter is contained within this Box object. A Box object is said to - * contain another if the second Box object falls entirely within the - * boundaries of the first. - * - * @param box The Box object being checked. - * @return A value of true if the Box object that you specify - * is contained by this Box object; otherwise false. - */ - public containsRect(box:Box):boolean - { - return (this.x <= box.x && this.x + this.width >= box.x + box.width && this.y <= box.y && this.y + this.height >= box.y + box.height && this.z <= box.z && this.z + this.depth >= box.z + box.depth) - } - - /** - * Copies all of box data from the source Box object into the calling - * Box object. - * - * @param sourceBox The Box object from which to copy the data. - */ - public copyFrom(sourceBox:Box) - { - //TODO - } - - /** - * Determines whether the object specified in the toCompare - * parameter is equal to this Box object. This method compares the - * x, y, z, width, - * height and depth properties of an object against - * the same properties of this Box object. - * - * @param toCompare The box to compare to this Box object. - * @return A value of true if the object has exactly the same - * values for the x, y, z, - * width, height and depth - * properties as this Box object; otherwise false. - */ - public equals(toCompare:Box):boolean - { - return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && this.width == toCompare.width && this.height == toCompare.height && this.depth == toCompare.depth) - } - - /** - * Increases the size of the Box object by the specified amounts, in - * pixels. The center point of the Box object stays the same, and its - * size increases to the left and right by the dx value, to - * the top and the bottom by the dy value, and to - * the front and the back by the dz value. - * - * @param dx The value to be added to the left and the right of the Box - * object. The following equation is used to calculate the new - * width and position of the box: - * @param dy The value to be added to the top and the bottom of the Box - * object. The following equation is used to calculate the new - * height and position of the box: - * @param dz The value to be added to the front and the back of the Box - * object. The following equation is used to calculate the new - * depth and position of the box: - */ - public inflate(dx:number, dy:number, dz:number) - { - this.x -= dx/2; - this.y -= dy/2; - this.z -= dz/2; - this.width += dx/2; - this.height += dy/2; - this.depth += dz/2; - } - - /** - * Increases the size of the Box object. This method is similar to the - * Box.inflate() method except it takes a Vector3D object as - * a parameter. - * - *

The following two code examples give the same result:

- * - * @param delta The x property of this Vector3D object is used to - * increase the horizontal dimension of the Box object. - * The y property is used to increase the vertical - * dimension of the Box object. - * The z property is used to increase the - * longitudinal dimension of the Box object. - */ - public inflatePoint(delta:Vector3D) - { - this.x -= delta.x/2; - this.y -= delta.y/2; - this.z -= delta.z/2; - this.width += delta.x/2; - this.height += delta.y/2; - this.depth += delta.z/2; - } - - /** - * If the Box object specified in the toIntersect parameter - * intersects with this Box object, returns the area of intersection - * as a Box object. If the boxes do not intersect, this method returns an - * empty Box object with its properties set to 0. - * - * @param toIntersect The Box object to compare against to see if it - * intersects with this Box object. - * @return A Box object that equals the area of intersection. If the - * boxes do not intersect, this method returns an empty Box - * object; that is, a box with its x, y, - * z, width, height, and - * depth properties set to 0. - */ - public intersection(toIntersect:Box):Box - { - if (this.intersects(toIntersect)) { - var i:Box = new Box(); - - if (this.x > toIntersect.x) { - i.x = this.x; - i.width = toIntersect.x - this.x + toIntersect.width; - - if (i.width > this.width) - i.width = this.width; - } else { - i.x = toIntersect.x; - i.width = this.x - toIntersect.x + this.width; - - if (i.width > toIntersect.width) - i.width = toIntersect.width; - } - - if (this.y > toIntersect.y) { - i.y = this.y; - i.height = toIntersect.y - this.y + toIntersect.height; - - if (i.height > this.height) - i.height = this.height; - } else { - i.y = toIntersect.y; - i.height = this.y - toIntersect.y + this.height; - - if (i.height > toIntersect.height) - i.height = toIntersect.height; - } - - - if (this.z > toIntersect.z) { - i.z = this.z; - i.depth = toIntersect.z - this.z + toIntersect.depth; - - if (i.depth > this.depth) - i.depth = this.depth; - } else { - i.z = toIntersect.z; - i.depth = this.z - toIntersect.z + this.depth; - - if (i.depth > toIntersect.depth) - i.depth = toIntersect.depth; - } - - return i; - } - - return new Box(); - } - - /** - * Determines whether the object specified in the toIntersect - * parameter intersects with this Box object. This method checks the - * x, y, z, width, - * height, and depth properties of the specified - * Box object to see if it intersects with this Box object. - * - * @param toIntersect The Box object to compare against this Box object. - * @return A value of true if the specified object intersects - * with this Box object; otherwise false. - */ - public intersects(toIntersect:Box):boolean - { - return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height && this.z + this.depth > toIntersect.z && this.z < toIntersect.z + toIntersect.depth); - } - - /** - * Determines whether or not this Box object is empty. - * - * @return A value of true if the Box object's width, height or - * depth is less than or equal to 0; otherwise false. - */ - public isEmpty():boolean - { - return (this.x == 0 && this.y == 0 && this.z == 0 && this.width == 0 && this.height == 0 && this.depth == 0); - } - - /** - * Adjusts the location of the Box object, as determined by its - * top-left-front corner, by the specified amounts. - * - * @param dx Moves the x value of the Box object by this amount. - * @param dy Moves the y value of the Box object by this amount. - * @param dz Moves the z value of the Box object by this amount. - */ - public offset(dx:number, dy:number, dz:number) - { - this.x += dx; - this.y += dy; - this.z += dz; - } - - /** - * Adjusts the location of the Box object using a Vector3D object as a - * parameter. This method is similar to the Box.offset() - * method, except that it takes a Vector3D object as a parameter. - * - * @param position A Vector3D object to use to offset this Box object. - */ - public offsetPosition(position:Vector3D) - { - this.x += position.x; - this.y += position.y; - this.z += position.z; - } - - /** - * Sets all of the Box object's properties to 0. A Box object is empty if its - * width, height or depth is less than or equal to 0. - * - *

This method sets the values of the x, y, - * z, width, height, and - * depth properties to 0.

- * - */ - public setEmpty() - { - this.x = 0; - this.y = 0; - this.z = 0; - this.width = 0; - this.height = 0; - this.depth = 0; - } - - /** - * Sets the members of Box to the specified values - * - * @param xa The x coordinate of the top-left-front corner of the - * box. - * @param ya The y coordinate of the top-left-front corner of the - * box. - * @param yz The z coordinate of the top-left-front corner of the - * box. - * @param widtha The width of the box, in pixels. - * @param heighta The height of the box, in pixels. - * @param deptha The depth of the box, in pixels. - */ - public setTo(xa:number, ya:number, za:number, widtha:number, heighta:number, deptha:number) - { - this.x = xa; - this.y = ya; - this.z = za; - this.width = widtha; - this.height = heighta; - this.depth = deptha; - } - - /** - * Builds and returns a string that lists the horizontal, vertical and - * longitudinal positions and the width, height and depth of the Box object. - * - * @return A string listing the value of each of the following properties of - * the Box object: x, y, z, - * width, height, and depth. - */ - public toString():string - { - return "[Box] (x=" + this.x + ", y=" + this.y + ", z=" + this.z + ", width=" + this.width + ", height=" + this.height + ", depth=" + this.depth + ")"; - } - - /** - * Adds two boxes together to create a new Box object, by filling - * in the horizontal, vertical and longitudinal space between the two boxes. - * - *

Note: The union() method ignores boxes with - * 0 as the height, width or depth value, such as: var - * box2:Box = new Box(300,300,300,50,50,0);

- * - * @param toUnion A Box object to add to this Box object. - * @return A new Box object that is the union of the two boxes. - */ - public union(toUnion:Box):Box - { - var u:Box = new Box(); - - if (this.x < toUnion.x) { - u.x = this.x; - u.width = toUnion.x - this.x + toUnion.width; - - if (u.width < this.width) - u.width = this.width; - } else { - u.x = toUnion.x; - u.width = this.x - toUnion.x + this.width; - - if (u.width < toUnion.width) - u.width = toUnion.width; - } - - if (this.y < toUnion.y) { - u.y = this.y; - u.height = toUnion.y - this.y + toUnion.height; - - if (u.height < this.height) - u.height = this.height; - } else { - u.y = toUnion.y; - u.height = this.y - toUnion.y + this.height; - - if (u.height < toUnion.height) - u.height = toUnion.height; - } - - if (this.z < toUnion.z) { - u.z = this.z; - u.depth = toUnion.z - this.z + toUnion.depth; - - if (u.depth < this.depth) - u.depth = this.depth; - } else { - u.z = toUnion.z; - u.depth = this.z - toUnion.z + this.depth; - - if (u.depth < toUnion.depth) - u.depth = toUnion.depth; - } - - return u; - } - } -} \ No newline at end of file diff --git a/src/away/core/geom/ColorTransform.ts b/src/away/core/geom/ColorTransform.ts deleted file mode 100644 index edbc0324..00000000 --- a/src/away/core/geom/ColorTransform.ts +++ /dev/null @@ -1,186 +0,0 @@ -/// - -/** - * The ColorTransform class lets you adjust the color values in a display - * object. The color adjustment or color transformation can be applied - * to all four channels: red, green, blue, and alpha transparency. - * - *

When a ColorTransform object is applied to a display object, a new value - * for each color channel is calculated like this:

- * - *
    - *
  • New red value = (old red value * redMultiplier) + - * redOffset
  • - *
  • New green value = (old green value * greenMultiplier) + - * greenOffset
  • - *
  • New blue value = (old blue value * blueMultiplier) + - * blueOffset
  • - *
  • New alpha value = (old alpha value * alphaMultiplier) + - * alphaOffset
  • - *
- * - *

If any of the color channel values is greater than 255 after the - * calculation, it is set to 255. If it is less than 0, it is set to 0.

- * - *

You can use ColorTransform objects in the following ways:

- * - *
    - *
  • In the colorTransform parameter of the - * colorTransform() method of the BitmapData class
  • - *
  • As the colorTransform property of a Transform object - * (which can be used as the transform property of a display - * object)
  • - *
- * - *

You must use the new ColorTransform() constructor to create - * a ColorTransform object before you can call the methods of the - * ColorTransform object.

- * - *

Color transformations do not apply to the background color of a movie - * clip(such as a loaded SWF object). They apply only to graphics and symbols - * that are attached to the movie clip.

- */ -module away.geom -{ - - - export class ColorTransform - { - /** - * A decimal value that is multiplied with the alpha transparency channel - * value. - * - *

If you set the alpha transparency value of a display object directly by - * using the alpha property of the DisplayObject instance, it - * affects the value of the alphaMultiplier property of that - * display object's transform.colorTransform property.

- */ - public alphaMultiplier:number; - - /** - * A number from -255 to 255 that is added to the alpha transparency channel - * value after it has been multiplied by the alphaMultiplier - * value. - */ - public alphaOffset:number; - - /** - * A decimal value that is multiplied with the blue channel value. - */ - public blueMultiplier:number; - - /** - * A number from -255 to 255 that is added to the blue channel value after it - * has been multiplied by the blueMultiplier value. - */ - public blueOffset:number; - - /** - * A decimal value that is multiplied with the green channel value. - */ - public greenMultiplier:number; - - /** - * A number from -255 to 255 that is added to the green channel value after - * it has been multiplied by the greenMultiplier value. - */ - public greenOffset:number; - - /** - * A decimal value that is multiplied with the red channel value. - */ - public redMultiplier:number; - - /** - * A number from -255 to 255 that is added to the red channel value after it - * has been multiplied by the redMultiplier value. - */ - public redOffset:number; - - /** - * The RGB color value for a ColorTransform object. - * - *

When you set this property, it changes the three color offset values - * (redOffset, greenOffset, and - * blueOffset) accordingly, and it sets the three color - * multiplier values(redMultiplier, - * greenMultiplier, and blueMultiplier) to 0. The - * alpha transparency multiplier and offset values do not change.

- * - *

When you pass a value for this property, use the format - * 0xRRGGBB. RR, GG, and BB each consist of two - * hexadecimal digits that specify the offset of each color component. The 0x - * tells the ActionScript compiler that the number is a hexadecimal - * value.

- */ - public get color():number - { - return((this.redOffset << 16) | ( this.greenOffset << 8) | this.blueOffset); - } - - public set color(value:number) - { - var argb:number[] = away.utils.ColorUtils.float32ColorToARGB(value); - - this.redOffset = argb[1]; //(value >> 16) & 0xFF; - this.greenOffset = argb[2]; //(value >> 8) & 0xFF; - this.blueOffset = argb[3]; //value & 0xFF; - - this.redMultiplier = 0; - this.greenMultiplier = 0; - this.blueMultiplier = 0; - } - - /** - * Creates a ColorTransform object for a display object with the specified - * color channel values and alpha values. - * - * @param redMultiplier The value for the red multiplier, in the range from - * 0 to 1. - * @param greenMultiplier The value for the green multiplier, in the range - * from 0 to 1. - * @param blueMultiplier The value for the blue multiplier, in the range - * from 0 to 1. - * @param alphaMultiplier The value for the alpha transparency multiplier, in - * the range from 0 to 1. - * @param redOffset The offset value for the red color channel, in the - * range from -255 to 255. - * @param greenOffset The offset value for the green color channel, in - * the range from -255 to 255. - * @param blueOffset The offset for the blue color channel value, in the - * range from -255 to 255. - * @param alphaOffset The offset for alpha transparency channel value, in - * the range from -255 to 255. - */ - constructor(redMultiplier:number = 1, greenMultiplier:number = 1, blueMultiplier:number = 1, alphaMultiplier:number = 1, redOffset:number = 0, greenOffset:number = 0, blueOffset:number = 0, alphaOffset:number = 0) - { - this.redMultiplier = redMultiplier; - this.greenMultiplier = greenMultiplier; - this.blueMultiplier = blueMultiplier; - this.alphaMultiplier = alphaMultiplier; - this.redOffset = redOffset; - this.greenOffset = greenOffset; - this.blueOffset = blueOffset; - this.alphaOffset = alphaOffset; - } - - /** - * Concatenates the ColorTranform object specified by the second - * parameter with the current ColorTransform object and sets the current - * object as the result, which is an additive combination of the two color - * transformations. When you apply the concatenated ColorTransform object, - * the effect is the same as applying the second color - * transformation after the original color transformation. - * - * @param second The ColorTransform object to be combined with the current - * ColorTransform object. - */ - public concat(second:ColorTransform):void - { - this.redMultiplier += second.redMultiplier; - this.greenMultiplier += second.greenMultiplier; - this.blueMultiplier += second.blueMultiplier; - this.alphaMultiplier += second.alphaMultiplier; - } - } -} \ No newline at end of file diff --git a/src/away/core/geom/MathConsts.ts b/src/away/core/geom/MathConsts.ts deleted file mode 100644 index 37b4c507..00000000 --- a/src/away/core/geom/MathConsts.ts +++ /dev/null @@ -1,20 +0,0 @@ -/// -module away.geom -{ - - /** - * MathConsts provides some commonly used mathematical constants - */ - export class MathConsts - { - /** - * The amount to multiply with when converting radians to degrees. - */ - public static RADIANS_TO_DEGREES:number = 180/Math.PI; - - /** - * The amount to multiply with when converting degrees to radians. - */ - public static DEGREES_TO_RADIANS:number = Math.PI/180; - } -} diff --git a/src/away/core/geom/Matrix.ts b/src/away/core/geom/Matrix.ts deleted file mode 100644 index 776963d4..00000000 --- a/src/away/core/geom/Matrix.ts +++ /dev/null @@ -1,575 +0,0 @@ -/// - -/** - * The Matrix class represents a transformation matrix that determines how to - * map points from one coordinate space to another. You can perform various - * graphical transformations on a display object by setting the properties of - * a Matrix object, applying that Matrix object to the matrix - * property of a Transform object, and then applying that Transform object as - * the transform property of the display object. These - * transformation functions include translation(x and y - * repositioning), rotation, scaling, and skewing. - * - *

Together these types of transformations are known as affine - * transformations. Affine transformations preserve the straightness of - * lines while transforming, so that parallel lines stay parallel.

- * - *

To apply a transformation matrix to a display object, you create a - * Transform object, set its matrix property to the - * transformation matrix, and then set the transform property of - * the display object to the Transform object. Matrix objects are also used as - * parameters of some methods, such as the following:

- * - *
    - *
  • The draw() method of a BitmapData object
  • - *
  • The beginBitmapFill() method, - * beginGradientFill() method, or - * lineGradientStyle() method of a Graphics object
  • - *
- * - *

A transformation matrix object is a 3 x 3 matrix with the following - * contents:

- * - *

In traditional transformation matrixes, the u, - * v, and w properties provide extra capabilities. - * The Matrix class can only operate in two-dimensional space, so it always - * assumes that the property values u and v are 0.0, - * and that the property value w is 1.0. The effective values of - * the matrix are as follows:

- * - *

You can get and set the values of all six of the other properties in a - * Matrix object: a, b, c, - * d, tx, and ty.

- * - *

The Matrix class supports the four major types of transformations: - * translation, scaling, rotation, and skewing. You can set three of these - * transformations by using specialized methods, as described in the following - * table:

- * - *

Each transformation function alters the current matrix properties so - * that you can effectively combine multiple transformations. To do this, you - * call more than one transformation function before applying the matrix to - * its display object target(by using the transform property of - * that display object).

- * - *

Use the new Matrix() constructor to create a Matrix object - * before you can call the methods of the Matrix object.

- */ -module away.geom -{ - export class Matrix - { - /** - * The value that affects the positioning of pixels along the x axis - * when scaling or rotating an image. - */ - public a:number; - - /** - * The value that affects the positioning of pixels along the y axis - * when rotating or skewing an image. - */ - public b:number; - - /** - * The value that affects the positioning of pixels along the x axis - * when rotating or skewing an image. - */ - public c:number; - - /** - * The value that affects the positioning of pixels along the y axis - * when scaling or rotating an image. - */ - public d:number; - - /** - * The distance by which to translate each point along the x axis. - */ - public tx:number; - - /** - * The distance by which to translate each point along the y axis. - */ - public ty:number; - - /** - * Creates a new Matrix object with the specified parameters. In matrix - * notation, the properties are organized like this: - * - *

If you do not provide any parameters to the new Matrix() - * constructor, it creates an identity matrix with the following - * values:

- * - *

In matrix notation, the identity matrix looks like this:

- * - * @param a The value that affects the positioning of pixels along the - * x axis when scaling or rotating an image. - * @param b The value that affects the positioning of pixels along the - * y axis when rotating or skewing an image. - * @param c The value that affects the positioning of pixels along the - * x axis when rotating or skewing an image. - * @param d The value that affects the positioning of pixels along the - * y axis when scaling or rotating an image.. - * @param tx The distance by which to translate each point along the x - * axis. - * @param ty The distance by which to translate each point along the y - * axis. - */ - constructor(a:number = 1, b:number = 0, c:number = 0, d:number = 1, tx:number = 0, ty:number = 0) - { - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.tx = tx; - this.ty = ty; - } - - /** - * Returns a new Matrix object that is a clone of this matrix, with an exact - * copy of the contained object. - * - * @return A Matrix object. - */ - public clone():Matrix - { - return new Matrix(this.a, this.b, this.c, this.d, this.tx, this.ty); - } - - /** - * Concatenates a matrix with the current matrix, effectively combining the - * geometric effects of the two. In mathematical terms, concatenating two - * matrixes is the same as combining them using matrix multiplication. - * - *

For example, if matrix m1 scales an object by a factor of - * four, and matrix m2 rotates an object by 1.5707963267949 - * radians(Math.PI/2), then m1.concat(m2) - * transforms m1 into a matrix that scales an object by a factor - * of four and rotates the object by Math.PI/2 radians.

- * - *

This method replaces the source matrix with the concatenated matrix. If - * you want to concatenate two matrixes without altering either of the two - * source matrixes, first copy the source matrix by using the - * clone() method, as shown in the Class Examples section.

- * - * @param matrix The matrix to be concatenated to the source matrix. - */ - public concat(matrix:Matrix):void - { - var a1 = this.a*matrix.a + this.b*matrix.c; - this.b = this.a*matrix.b + this.b*matrix.d; - this.a = a1; - - var c1 = this.c*matrix.a + this.d*matrix.c; - this.d = this.c*matrix.b + this.d*matrix.d; - - this.c = c1; - - var tx1 = this.tx*matrix.a + this.ty*matrix.c + matrix.tx; - this.ty = this.tx*matrix.b + this.ty*matrix.d + matrix.ty; - this.tx = tx1; - } - - /** - * Copies a Vector3D object into specific column of the calling Matrix3D - * object. - * - * @param column The column from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - public copyColumnFrom(column:number, vector3D:Vector3D):void - { - if (column > 2) { - throw "Column " + column + " out of bounds (2)"; - } else if (column == 0) { - this.a = vector3D.x; - this.c = vector3D.y; - } else if (column == 1) { - this.b = vector3D.x; - this.d = vector3D.y; - } else { - this.tx = vector3D.x; - this.ty = vector3D.y; - } - } - - /** - * Copies specific column of the calling Matrix object into the Vector3D - * object. The w element of the Vector3D object will not be changed. - * - * @param column The column from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - public copyColumnTo(column:number, vector3D:away.geom.Vector3D):void - { - if (column > 2) { - throw new away.errors.ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 2]"); - } else if (column == 0) { - vector3D.x = this.a; - vector3D.y = this.c; - vector3D.z = 0; - } else if (column == 1) { - vector3D.x = this.b; - vector3D.y = this.d; - vector3D.z = 0; - } else { - vector3D.x = this.tx; - vector3D.y = this.ty; - vector3D.z = 1; - } - } - - /** - * Copies all of the matrix data from the source Point object into the - * calling Matrix object. - * - * @param sourceMatrix The Matrix object from which to copy the data. - */ - public copyFrom(sourceMatrix:away.geom.Matrix):void - { - this.a = sourceMatrix.a; - this.b = sourceMatrix.b; - this.c = sourceMatrix.c; - this.d = sourceMatrix.d; - this.tx = sourceMatrix.tx; - this.ty = sourceMatrix.ty; - } - - /** - * Copies a Vector3D object into specific row of the calling Matrix object. - * - * @param row The row from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - public copyRowFrom(row:number, vector3D:away.geom.Vector3D):void - { - if (row > 2) { - throw new away.errors.ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); - } else if (row == 0) { - this.a = vector3D.x; - this.c = vector3D.y; - } else if (row == 1) { - this.b = vector3D.x; - this.d = vector3D.y; - } else { - this.tx = vector3D.x; - this.ty = vector3D.y; - } - } - - /** - * Copies specific row of the calling Matrix object into the Vector3D object. - * The w element of the Vector3D object will not be changed. - * - * @param row The row from which to copy the data from. - * @param vector3D The Vector3D object from which to copy the data. - */ - public copyRowTo(row:number, vector3D:away.geom.Vector3D):void - { - if (row > 2) { - throw new away.errors.ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 2]"); - } else if (row == 0) { - vector3D.x = this.a; - vector3D.y = this.b; - vector3D.z = this.tx; - } else if (row == 1) { - vector3D.x = this.c; - vector3D.y = this.d; - vector3D.z = this.ty; - } else { - vector3D.setTo(0, 0, 1); - } - } - - /** - * Includes parameters for scaling, rotation, and translation. When applied - * to a matrix it sets the matrix's values based on those parameters. - * - *

Using the createBox() method lets you obtain the same - * matrix as you would if you applied the identity(), - * rotate(), scale(), and translate() - * methods in succession. For example, mat1.createBox(2,2,Math.PI/4, - * 100, 100) has the same effect as the following:

- * - * @param scaleX The factor by which to scale horizontally. - * @param scaleY The factor by which scale vertically. - * @param rotation The amount to rotate, in radians. - * @param tx The number of pixels to translate(move) to the right - * along the x axis. - * @param ty The number of pixels to translate(move) down along the - * y axis. - */ - public createBox(scaleX:number, scaleY:number, rotation:number = 0, tx:number = 0, ty:number = 0):void - { - this.a = scaleX; - this.d = scaleY; - this.b = rotation; - this.tx = tx; - this.ty = ty; - } - - /** - * Creates the specific style of matrix expected by the - * beginGradientFill() and lineGradientStyle() - * methods of the Graphics class. Width and height are scaled to a - * scaleX/scaleY pair and the - * tx/ty values are offset by half the width and - * height. - * - *

For example, consider a gradient with the following - * characteristics:

- * - *
    - *
  • GradientType.LINEAR
  • - *
  • Two colors, green and blue, with the ratios array set to [0, - * 255]
  • - *
  • SpreadMethod.PAD
  • - *
  • InterpolationMethod.LINEAR_RGB
  • - *
- * - *

The following illustrations show gradients in which the matrix was - * defined using the createGradientBox() method with different - * parameter settings:

- * - * @param width The width of the gradient box. - * @param height The height of the gradient box. - * @param rotation The amount to rotate, in radians. - * @param tx The distance, in pixels, to translate to the right along - * the x axis. This value is offset by half of the - * width parameter. - * @param ty The distance, in pixels, to translate down along the - * y axis. This value is offset by half of the - * height parameter. - */ - public createGradientBox(width:number, height:number, rotation:number = 0, tx:number = 0, ty:number = 0):void - { - this.a = width/1638.4; - this.d = height/1638.4; - - if (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 = this.c = 0; - } - - this.tx = tx + width/2; - this.ty = ty + height/2; - } - - /** - * Given a point in the pretransform coordinate space, returns the - * coordinates of that point after the transformation occurs. Unlike the - * standard transformation applied using the transformPoint() - * method, the deltaTransformPoint() method's transformation - * does not consider the translation parameters tx and - * ty. - * - * @param point The point for which you want to get the result of the matrix - * transformation. - * @return The point resulting from applying the matrix transformation. - */ - public deltaTransformPoint(point:away.geom.Point):away.geom.Point - { - return new away.geom.Point(point.x*this.a + point.y*this.c, point.x*this.b + point.y*this.d); - } - - /** - * Sets each matrix property to a value that causes a null transformation. An - * object transformed by applying an identity matrix will be identical to the - * original. - * - *

After calling the identity() method, the resulting matrix - * has the following properties: a=1, b=0, - * c=0, d=1, tx=0, - * ty=0.

- * - *

In matrix notation, the identity matrix looks like this:

- * - */ - public identity():void - { - this.a = 1; - this.b = 0; - this.c = 0; - this.d = 1; - this.tx = 0; - this.ty = 0; - } - - /** - * Performs the opposite transformation of the original matrix. You can apply - * an inverted matrix to an object to undo the transformation performed when - * applying the original matrix. - */ - public invert():void - { - var norm = this.a*this.d - this.b*this.c; - - if (norm == 0) { - this.a = this.b = this.c = this.d = 0; - this.tx = -this.tx; - this.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.ty = -this.b*this.tx - this.d*this.ty; - this.tx = tx1; - } - } - - - /** - * Returns a new Matrix object that is a clone of this matrix, with an exact - * copy of the contained object. - * - * @param matrix The matrix for which you want to get the result of the matrix - * transformation. - * @return A Matrix object. - */ - public multiply(matrix:Matrix):Matrix - { - var result = new Matrix(); - - result.a = this.a*matrix.a + this.b*matrix.c; - result.b = this.a*matrix.b + this.b*matrix.d; - result.c = this.c*matrix.a + this.d*matrix.c; - result.d = this.c*matrix.b + this.d*matrix.d; - - result.tx = this.tx*matrix.a + this.ty*matrix.c + matrix.tx; - result.ty = this.tx*matrix.b + this.ty*matrix.d + matrix.ty; - - return result; - } - - /** - * Applies a rotation transformation to the Matrix object. - * - *

The rotate() method alters the a, - * b, c, and d properties of the - * Matrix object. In matrix notation, this is the same as concatenating the - * current matrix with the following:

- * - * @param angle The rotation angle in radians. - */ - public rotate(angle:number):void - { - var cos = Math.cos(angle); - var sin = Math.sin(angle); - - 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.ty = this.tx*sin + this.ty*cos; - this.tx = tx1; - } - - /** - * Applies a scaling transformation to the matrix. The x axis is - * multiplied by sx, and the y axis it is multiplied by - * sy. - * - *

The scale() method alters the a and - * d properties of the Matrix object. In matrix notation, this - * is the same as concatenating the current matrix with the following - * matrix:

- * - * @param sx A multiplier used to scale the object along the x axis. - * @param sy A multiplier used to scale the object along the y axis. - */ - public scale(sx:number, sy:number):void - { - this.a *= sx; - this.b *= sy; - - this.c *= sx; - this.d *= sy; - - this.tx *= sx; - this.ty *= sy; - } - - /** - * Sets the members of Matrix to the specified values. - * - * @param a The value that affects the positioning of pixels along the - * x axis when scaling or rotating an image. - * @param b The value that affects the positioning of pixels along the - * y axis when rotating or skewing an image. - * @param c The value that affects the positioning of pixels along the - * x axis when rotating or skewing an image. - * @param d The value that affects the positioning of pixels along the - * y axis when scaling or rotating an image.. - * @param tx The distance by which to translate each point along the x - * axis. - * @param ty The distance by which to translate each point along the y - * axis. - */ - public setTo(a:number, b:number, c:number, d:number, tx:number, ty:number):void - { - this.a = a; - this.b = b; - this.c = c; - this.d = d; - this.tx = tx; - this.ty = ty; - } - - /** - * Returns a text value listing the properties of the Matrix object. - * - * @return A string containing the values of the properties of the Matrix - * object: a, b, c, - * d, tx, and ty. - */ - public toString():string - { - return "[Matrix] (a=" + this.a + ", b=" + this.b + ", c=" + this.c + ", d=" + this.d + ", tx=" + this.tx + ", ty=" + this.ty + ")"; - } - - /** - * Returns the result of applying the geometric transformation represented by - * the Matrix object to the specified point. - * - * @param point The point for which you want to get the result of the Matrix - * transformation. - * @return The point resulting from applying the Matrix transformation. - */ - public transformPoint(point:Point):away.geom.Point - { - return new away.geom.Point(point.x*this.a + point.y*this.c + this.tx, point.x*this.b + point.y*this.d + this.ty); - } - - /** - * Translates the matrix along the x and y axes, as specified - * by the dx and dy parameters. - * - * @param dx The amount of movement along the x axis to the right, in - * pixels. - * @param dy The amount of movement down along the y axis, in pixels. - */ - public translate(dx:number, dy:number):void - { - this.tx += dx; - this.ty += dy; - } - } -} diff --git a/src/away/core/geom/Matrix3D.ts b/src/away/core/geom/Matrix3D.ts deleted file mode 100644 index e5a0f054..00000000 --- a/src/away/core/geom/Matrix3D.ts +++ /dev/null @@ -1,697 +0,0 @@ -/// - -module away.geom -{ - export class Matrix3D - { - /** - * A Vector of 16 Numbers, where every four elements is a column of a 4x4 matrix. - * - *

An exception is thrown if the rawData property is set to a matrix that is not invertible. The Matrix3D - * object must be invertible. If a non-invertible matrix is needed, create a subclass of the Matrix3D object.

- */ - public rawData:number[]; - - /** - * Creates a Matrix3D object. - */ - constructor(v:number[] = null) - { - if (v != null && v.length == 16) - this.rawData = v.concat(); - else - this.rawData = [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]; - } - - /** - * Appends the matrix by multiplying another Matrix3D object by the current Matrix3D object. - */ - public append(lhs:Matrix3D) - { - var m111:number = this.rawData[0], m121:number = this.rawData[4], m131:number = this.rawData[8], m141:number = this.rawData[12], m112:number = this.rawData[1], m122:number = this.rawData[5], m132:number = this.rawData[9], m142:number = this.rawData[13], m113:number = this.rawData[2], m123:number = this.rawData[6], m133:number = this.rawData[10], m143:number = this.rawData[14], m114:number = this.rawData[3], m124:number = this.rawData[7], m134:number = this.rawData[11], m144:number = this.rawData[15], m211:number = lhs.rawData[0], m221:number = lhs.rawData[4], m231:number = lhs.rawData[8], m241:number = lhs.rawData[12], m212:number = lhs.rawData[1], m222:number = lhs.rawData[5], m232:number = lhs.rawData[9], m242:number = lhs.rawData[13], m213:number = lhs.rawData[2], m223:number = lhs.rawData[6], m233:number = lhs.rawData[10], m243:number = lhs.rawData[14], m214:number = lhs.rawData[3], m224:number = lhs.rawData[7], m234:number = lhs.rawData[11], m244:number = 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; - } - - /** - * Appends an incremental rotation to a Matrix3D object. - */ - public appendRotation(degrees:number, axis:Vector3D):void //, pivot:Vector3D = null ) - { - var m:Matrix3D = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); - - this.append(m); - } - - /** - * Appends an incremental scale change along the x, y, and z axes to a Matrix3D object. - */ - public appendScale(xScale:number, yScale:number, zScale:number) - { - this.append(new 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 ])); - } - - /** - * Appends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. - */ - public appendTranslation(x:number, y:number, z:number) - { - this.rawData[12] += x; - this.rawData[13] += y; - this.rawData[14] += z; - } - - /** - * Returns a new Matrix3D object that is an exact copy of the current Matrix3D object. - */ - public clone():Matrix3D - { - return new Matrix3D(this.rawData.slice(0)); - } - - /** - * Copies a Vector3D object into specific column of the calling Matrix3D object. - */ - public copyColumnFrom(column:number, vector3D:Vector3D) - { - switch (column) { - case 0: - this.rawData[ 0 ] = vector3D.x; - this.rawData[ 1 ] = vector3D.y; - this.rawData[ 2 ] = vector3D.z; - this.rawData[ 3 ] = vector3D.w; - break; - case 1: - this.rawData[ 4 ] = vector3D.x; - this.rawData[ 5 ] = vector3D.y; - this.rawData[ 6 ] = vector3D.z; - this.rawData[ 7 ] = vector3D.w; - break; - case 2: - this.rawData[ 8 ] = vector3D.x; - this.rawData[ 9 ] = vector3D.y; - this.rawData[ 10 ] = vector3D.z; - this.rawData[ 11 ] = vector3D.w; - break; - case 3: - this.rawData[ 12 ] = vector3D.x; - this.rawData[ 13 ] = vector3D.y; - this.rawData[ 14 ] = vector3D.z; - this.rawData[ 15 ] = vector3D.w; - break; - default: - throw new away.errors.ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); - } - } - - /** - * Copies specific column of the calling Matrix3D object into the Vector3D object. - */ - public copyColumnTo(column:number, vector3D:Vector3D) - { - switch (column) { - case 0: - vector3D.x = this.rawData[ 0 ]; - vector3D.y = this.rawData[ 1 ]; - vector3D.z = this.rawData[ 2 ]; - vector3D.w = this.rawData[ 3 ]; - break; - case 1: - vector3D.x = this.rawData[ 4 ]; - vector3D.y = this.rawData[ 5 ]; - vector3D.z = this.rawData[ 6 ]; - vector3D.w = this.rawData[ 7 ]; - break; - case 2: - vector3D.x = this.rawData[ 8 ]; - vector3D.y = this.rawData[ 9 ]; - vector3D.z = this.rawData[ 10 ]; - vector3D.w = this.rawData[ 11 ]; - break; - case 3: - vector3D.x = this.rawData[ 12 ]; - vector3D.y = this.rawData[ 13 ]; - vector3D.z = this.rawData[ 14 ]; - vector3D.w = this.rawData[ 15 ]; - break; - default: - throw new away.errors.ArgumentError("ArgumentError, Column " + column + " out of bounds [0, ..., 3]"); - } - } - - /** - * Copies all of the matrix data from the source Matrix3D object into the calling Matrix3D object. - */ - public copyFrom(sourceMatrix3D:Matrix3D) - { - var len:number = sourceMatrix3D.rawData.length; - for (var c:number = 0; c < len; c++) - this.rawData[c] = sourceMatrix3D.rawData[c]; - } - - public copyRawDataFrom(vector:number[], index:number = 0, transpose:boolean = false):void - { - if (transpose) - this.transpose(); - - var len:number = vector.length - index; - for (var c:number = 0; c < len; c++) - this.rawData[c] = vector[c + index]; - - if (transpose) - this.transpose(); - } - - public copyRawDataTo(vector:number[], index:number = 0, transpose:boolean = false) - { - if (transpose) - this.transpose(); - - var len:number = this.rawData.length - for (var c:number = 0; c < len; c++) - vector[c + index ] = this.rawData[c]; - - if (transpose) - this.transpose(); - } - - /** - * Copies a Vector3D object into specific row of the calling Matrix3D object. - */ - public copyRowFrom(row:number, vector3D:Vector3D) - { - switch (row) { - case 0: - this.rawData[ 0 ] = vector3D.x; - this.rawData[ 4 ] = vector3D.y; - this.rawData[ 8 ] = vector3D.z; - this.rawData[ 12 ] = vector3D.w; - break; - case 1: - this.rawData[ 1 ] = vector3D.x; - this.rawData[ 5 ] = vector3D.y; - this.rawData[ 9 ] = vector3D.z; - this.rawData[ 13 ] = vector3D.w; - break; - case 2: - this.rawData[ 2 ] = vector3D.x; - this.rawData[ 6 ] = vector3D.y; - this.rawData[ 10 ] = vector3D.z; - this.rawData[ 14 ] = vector3D.w; - break; - case 3: - this.rawData[ 3 ] = vector3D.x; - this.rawData[ 7 ] = vector3D.y; - this.rawData[ 11 ] = vector3D.z; - this.rawData[ 15 ] = vector3D.w; - break; - default: - throw new away.errors.ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); - } - } - - /** - * Copies specific row of the calling Matrix3D object into the Vector3D object. - */ - public copyRowTo(row:number, vector3D:Vector3D) - { - switch (row) { - case 0: - vector3D.x = this.rawData[ 0 ]; - vector3D.y = this.rawData[ 4 ]; - vector3D.z = this.rawData[ 8 ]; - vector3D.w = this.rawData[ 12 ]; - break; - case 1: - vector3D.x = this.rawData[ 1 ]; - vector3D.y = this.rawData[ 5 ]; - vector3D.z = this.rawData[ 9 ]; - vector3D.w = this.rawData[ 13 ]; - break; - case 2: - vector3D.x = this.rawData[ 2 ]; - vector3D.y = this.rawData[ 6 ]; - vector3D.z = this.rawData[ 10 ]; - vector3D.w = this.rawData[ 14 ]; - break; - case 3: - vector3D.x = this.rawData[ 3 ]; - vector3D.y = this.rawData[ 7 ]; - vector3D.z = this.rawData[ 11 ]; - vector3D.w = this.rawData[ 15 ] - break; - default: - throw new away.errors.ArgumentError("ArgumentError, Row " + row + " out of bounds [0, ..., 3]"); - } - } - - /** - * Copies this Matrix3D object into a destination Matrix3D object. - */ - public copyToMatrix3D(dest:Matrix3D) - { - dest.rawData = this.rawData.slice(0); - } - - /** - * Returns the transformation matrix's translation, rotation, and scale settings as a Vector of three Vector3D objects. - */ - public decompose(orientationStyle:string = "eulerAngles"):Vector3D[] - { - var q:away.geom.Quaternion; - - // Initial Tests - Not OK - - var vec:Vector3D[] = []; - var m = this.clone(); - var mr = m.rawData; - - var pos:Vector3D = new Vector3D(mr[12], mr[13], mr[14]); - mr[12] = 0; - mr[13] = 0; - mr[14] = 0; - - var scale:Vector3D = new 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 Vector3D(); - - switch (orientationStyle) { - case Orientation3D.AXIS_ANGLE: - - rot.w = Math.acos((mr[0] + mr[5] + mr[10] - 1)/2); - - var len:number = Math.sqrt((mr[6] - mr[9])*(mr[6] - mr[9]) + (mr[8] - mr[2])*(mr[8] - mr[2]) + (mr[1] - mr[4])*(mr[1] - mr[4])); - rot.x = (mr[6] - mr[9])/len; - rot.y = (mr[8] - mr[2])/len; - rot.z = (mr[1] - mr[4])/len; - - break; - case Orientation3D.QUATERNION: - - var tr = mr[0] + mr[5] + mr[10]; - - if (tr > 0) { - rot.w = Math.sqrt(1 + tr)/2; - - rot.x = (mr[6] - mr[9])/(4*rot.w); - rot.y = (mr[8] - mr[2])/(4*rot.w); - rot.z = (mr[1] - mr[4])/(4*rot.w); - } else if ((mr[0] > mr[5]) && (mr[0] > mr[10])) { - rot.x = Math.sqrt(1 + mr[0] - mr[5] - mr[10])/2; - - rot.w = (mr[6] - mr[9])/(4*rot.x); - rot.y = (mr[1] + mr[4])/(4*rot.x); - rot.z = (mr[8] + mr[2])/(4*rot.x); - } else if (mr[5] > mr[10]) { - rot.y = Math.sqrt(1 + mr[5] - mr[0] - mr[10])/2; - - rot.x = (mr[1] + mr[4])/(4*rot.y); - rot.w = (mr[8] - mr[2])/(4*rot.y); - rot.z = (mr[6] + mr[9])/(4*rot.y); - } else { - rot.z = Math.sqrt(1 + mr[10] - mr[0] - mr[5])/2; - - rot.x = (mr[8] + mr[2])/(4*rot.z); - rot.y = (mr[6] + mr[9])/(4*rot.z); - rot.w = (mr[1] - mr[4])/(4*rot.z); - } - - - break; - case Orientation3D.EULER_ANGLES: - - rot.y = Math.asin(-mr[2]); - - //var cos:number = Math.cos(rot.y); - - if (mr[2] != 1 && mr[2] != -1) { - 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]); - } - - break; - } - - vec.push(pos); - vec.push(rot); - vec.push(scale); - - return vec; - } - - /** - * Uses the transformation matrix without its translation elements to transform a Vector3D object from one space - * coordinate to another. - */ - public deltaTransformVector(v:Vector3D):Vector3D - { - var x:number = v.x; - var y:number = v.y; - var z:number = v.z; - - return new away.geom.Vector3D((x*this.rawData[0] + y*this.rawData[4] + z*this.rawData[8]), (x*this.rawData[1] + y*this.rawData[5] + z*this.rawData[9]), (x*this.rawData[2] + y*this.rawData[6] + z*this.rawData[10]), (x*this.rawData[3] + y*this.rawData[7] + z*this.rawData[11])); - } - - /** - * Converts the current matrix to an identity or unit matrix. - */ - public identity() - { - this.rawData = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ]; - } - - /** - * [static] Interpolates the translation, rotation, and scale transformation of one matrix toward those of the target matrix. - */ - static interpolate(thisMat:Matrix3D, toMat:Matrix3D, percent:number):Matrix3D - { - var m:Matrix3D = new Matrix3D(); - for (var i:number = 0; i < 16; ++i) - m.rawData[i] = thisMat.rawData[i] + (toMat.rawData[i] - thisMat.rawData[i])*percent; - - return m; - } - - /** - * Interpolates this matrix towards the translation, rotation, and scale transformations of the target matrix. - */ - public interpolateTo(toMat:Matrix3D, percent:number) - { - for (var i:number = 0; i < 16; ++i) - this.rawData[i] = this.rawData[i] + (toMat.rawData[i] - this.rawData[i])*percent; - } - - /** - * Inverts the current matrix. - */ - public invert():boolean - { - var d = this.determinant; - var invertable = Math.abs(d) > 0.00000000001; - - if (invertable) { - d = 1/d; - var m11:number = this.rawData[0]; - var m21:number = this.rawData[4]; - var m31:number = this.rawData[8]; - var m41:number = this.rawData[12]; - var m12:number = this.rawData[1]; - var m22:number = this.rawData[5]; - var m32:number = this.rawData[9]; - var m42:number = this.rawData[13]; - var m13:number = this.rawData[2]; - var m23:number = this.rawData[6]; - var m33:number = this.rawData[10]; - var m43:number = this.rawData[14]; - var m14:number = this.rawData[3]; - var m24:number = this.rawData[7]; - var m34:number = this.rawData[11]; - var m44:number = 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 invertable; - } - - /* TODO implement pointAt - public pointAt( pos:Vector3D, at:Vector3D = null, up:Vector3D = null ) - { - } - */ - - /** - * Prepends a matrix by multiplying the current Matrix3D object by another Matrix3D object. - */ - public prepend(rhs:Matrix3D) - { - var m111:number = rhs.rawData[0], m121:number = rhs.rawData[4], m131:number = rhs.rawData[8], m141:number = rhs.rawData[12], m112:number = rhs.rawData[1], m122:number = rhs.rawData[5], m132:number = rhs.rawData[9], m142:number = rhs.rawData[13], m113:number = rhs.rawData[2], m123:number = rhs.rawData[6], m133:number = rhs.rawData[10], m143:number = rhs.rawData[14], m114:number = rhs.rawData[3], m124:number = rhs.rawData[7], m134:number = rhs.rawData[11], m144:number = rhs.rawData[15], m211:number = this.rawData[0], m221:number = this.rawData[4], m231:number = this.rawData[8], m241:number = this.rawData[12], m212:number = this.rawData[1], m222:number = this.rawData[5], m232:number = this.rawData[9], m242:number = this.rawData[13], m213:number = this.rawData[2], m223:number = this.rawData[6], m233:number = this.rawData[10], m243:number = this.rawData[14], m214:number = this.rawData[3], m224:number = this.rawData[7], m234:number = this.rawData[11], m244:number = 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; - } - - /** - * Prepends an incremental rotation to a Matrix3D object. - */ - public prependRotation(degrees:number, axis:Vector3D) //, pivot:Vector3D = null ) - { - var m:Matrix3D = Matrix3D.getAxisRotation(axis.x, axis.y, axis.z, degrees); - - /* - if ( pivot != null ) - { - var p:Vector3D = pivot; - m.appendTranslation( p.x, p.y, p.z ); - } - */ - this.prepend(m); - } - - /** - * Prepends an incremental scale change along the x, y, and z axes to a Matrix3D object. - */ - public prependScale(xScale:number, yScale:number, zScale:number) - { - - // Initial Tests - OK - - this.prepend(new Matrix3D([ xScale, 0, 0, 0, 0, yScale, 0, 0, 0, 0, zScale, 0, 0, 0, 0, 1 ])); - } - - /** - * Prepends an incremental translation, a repositioning along the x, y, and z axes, to a Matrix3D object. - */ - public prependTranslation(x:number, y:number, z:number) - { - - // Initial Tests - OK - - var m = new Matrix3D(); - m.position = new Vector3D(x, y, z); - this.prepend(m); - } - - // TODO orientationStyle - /** - * Sets the transformation matrix's translation, rotation, and scale settings. - */ - public recompose(components:Vector3D[]):boolean - { - - // Initial Tests - OK - - if (components.length < 3) return false - - //components[2].x == 0 || components[2].y == 0 || components[2].z == 0) return false; - - this.identity(); - this.appendScale(components[2].x, components[2].y, components[2].z); - - var angle:number; - angle = -components[1].x; - this.append(new 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 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 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.position = components[0]; - this.rawData[15] = 1; - - return true; - } - - public transformVector(v:away.geom.Vector3D):away.geom.Vector3D - { - var x:number = v.x; - var y:number = v.y; - var z:number = v.z; - - return new away.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]), (x*this.rawData[3] + y*this.rawData[7] + z*this.rawData[11] + this.rawData[15])); - } - - /** - * Uses the transformation matrix to transform a Vector of Numbers from one coordinate space to another. - */ - public transformVectors(vin:number[], vout:number[]) - { - - // Initial Tests - OK - - var i:number = 0; - var x:number = 0, y:number = 0, z:number = 0; - - while (i + 3 <= vin.length) { - 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; - } - } - - /** - * Converts the current Matrix3D object to a matrix where the rows and columns are swapped. - */ - public transpose() - { - - // Initial Tests - OK - - var oRawData:number[] = this.rawData.slice(0); - - 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]; - } - - static getAxisRotation(x:number, y:number, z:number, degrees:number):Matrix3D - { - - // internal class use by rotations which have been tested - - var m:Matrix3D = new Matrix3D(); - - var rad = degrees*( Math.PI/180 ); - var c:number = Math.cos(rad); - var s:number = Math.sin(rad); - var t:number = 1 - c; - var tmp1:number, tmp2:number; - - m.rawData[0] = c + x*x*t; - m.rawData[5] = c + y*y*t; - m.rawData[10] = c + z*z*t; - - tmp1 = x*y*t; - tmp2 = z*s; - m.rawData[1] = tmp1 + tmp2; - m.rawData[4] = tmp1 - tmp2; - tmp1 = x*z*t; - tmp2 = y*s; - m.rawData[8] = tmp1 + tmp2; - m.rawData[2] = tmp1 - tmp2; - tmp1 = y*z*t; - tmp2 = x*s; - m.rawData[9] = tmp1 - tmp2; - m.rawData[6] = tmp1 + tmp2; - - return m; - } - - /** - * [read-only] A Number that determines whether a matrix is invertible. - */ - public get determinant():number - { - return ((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])); - } - - /** - * A Vector3D object that holds the position, the 3D coordinate (x,y,z) of a display object within the - * transformation's frame of reference. - */ - public get position():Vector3D - { - return new Vector3D(this.rawData[12], this.rawData[13], this.rawData[14]); - } - - public set position(value:Vector3D) - { - this.rawData[12] = value.x; - this.rawData[13] = value.y; - this.rawData[14] = value.z; - } - - public toFixed(decimalPlace:number):string - { - var magnitude:number = Math.pow(10, decimalPlace); - return "matrix3d(" + Math.round(this.rawData[0]*magnitude)/magnitude + "," + Math.round(this.rawData[1]*magnitude)/magnitude + "," + Math.round(this.rawData[2]*magnitude)/magnitude + "," + Math.round(this.rawData[3]*magnitude)/magnitude + "," + Math.round(this.rawData[4]*magnitude)/magnitude + "," + Math.round(this.rawData[5]*magnitude)/magnitude + "," + Math.round(this.rawData[6]*magnitude)/magnitude + "," + Math.round(this.rawData[7]*magnitude)/magnitude + "," + Math.round(this.rawData[8]*magnitude)/magnitude + "," + Math.round(this.rawData[9]*magnitude)/magnitude + "," + Math.round(this.rawData[10]*magnitude)/magnitude + "," + Math.round(this.rawData[11]*magnitude)/magnitude + "," + Math.round(this.rawData[12]*magnitude)/magnitude + "," + Math.round(this.rawData[13]*magnitude)/magnitude + "," + Math.round(this.rawData[14]*magnitude)/magnitude + "," + Math.round(this.rawData[15]*magnitude)/magnitude + ")"; - } - - public toString():string - { - return "matrix3d(" + Math.round(this.rawData[0]*1000)/1000 + "," + Math.round(this.rawData[1]*1000)/1000 + "," + Math.round(this.rawData[2]*1000)/1000 + "," + Math.round(this.rawData[3]*1000)/1000 + "," + Math.round(this.rawData[4]*1000)/1000 + "," + Math.round(this.rawData[5]*1000)/1000 + "," + Math.round(this.rawData[6]*1000)/1000 + "," + Math.round(this.rawData[7]*1000)/1000 + "," + Math.round(this.rawData[8]*1000)/1000 + "," + Math.round(this.rawData[9]*1000)/1000 + "," + Math.round(this.rawData[10]*1000)/1000 + "," + Math.round(this.rawData[11]*1000)/1000 + "," + Math.round(this.rawData[12]*1000)/1000 + "," + Math.round(this.rawData[13]*1000)/1000 + "," + Math.round(this.rawData[14]*1000)/1000 + "," + Math.round(this.rawData[15]*1000)/1000 + ")"; - } - } -} \ No newline at end of file diff --git a/src/away/core/geom/Matrix3DUtils.ts b/src/away/core/geom/Matrix3DUtils.ts deleted file mode 100644 index a87f6d08..00000000 --- a/src/away/core/geom/Matrix3DUtils.ts +++ /dev/null @@ -1,316 +0,0 @@ -/// - -module away.geom -{ - //import flash.geom.*; - - /** - * away.geom.Matrix3DUtils provides additional Matrix3D functions. - */ - export class Matrix3DUtils - { - /** - * A reference to a Vector to be used as a temporary raw data container, to prevent object creation. - */ - public static RAW_DATA_CONTAINER:number[] = new Array(16); - //public static RAW_DATA_CONTAINER:number[] = new Array(16); - - public static CALCULATION_MATRIX:Matrix3D = new Matrix3D(); - - /** - * Fills the 3d matrix object with values representing the transformation made by the given quaternion. - * - * @param quarternion The quarterion object to convert. - */ - public static quaternion2matrix(quarternion:Quaternion, m:Matrix3D = null):Matrix3D - { - var x:number = quarternion.x; - var y:number = quarternion.y; - var z:number = quarternion.z; - var w:number = quarternion.w; - - var xx:number = x*x; - var xy:number = x*y; - var xz:number = x*z; - var xw:number = x*w; - - var yy:number = y*y; - var yz:number = y*z; - var yw:number = y*w; - - var zz:number = z*z; - var zw:number = z*w; - - var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; - raw[0] = 1 - 2*(yy + zz); - raw[1] = 2*(xy + zw); - raw[2] = 2*(xz - yw); - raw[4] = 2*(xy - zw); - raw[5] = 1 - 2*(xx + zz); - raw[6] = 2*(yz + xw); - raw[8] = 2*(xz + yw); - raw[9] = 2*(yz - xw); - raw[10] = 1 - 2*(xx + yy); - raw[3] = raw[7] = raw[11] = raw[12] = raw[13] = raw[14] = 0; - raw[15] = 1; - - if (m) { - m.copyRawDataFrom(raw); - return m; - } else - return new Matrix3D(raw); - } - - /** - * Returns a normalised Vector3D object representing the forward vector of the given matrix. - * @param m The Matrix3D object to use to get the forward vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The forward vector - */ - public static getForward(m:Matrix3D, v:Vector3D = null):Vector3D - { - //v ||= new Vector3D(0.0, 0.0, 0.0); - if (v === null) { - - v = new Vector3D(0.0, 0.0, 0.0); - - } - - m.copyColumnTo(2, v); - v.normalize(); - - return v; - } - - /** - * Returns a normalised Vector3D object representing the up vector of the given matrix. - * @param m The Matrix3D object to use to get the up vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The up vector - */ - public static getUp(m:Matrix3D, v:Vector3D = null):Vector3D - { - //v ||= new Vector3D(0.0, 0.0, 0.0); - - if (v === null) { - - v = new Vector3D(0.0, 0.0, 0.0); - - } - - m.copyColumnTo(1, v); - v.normalize(); - - return v; - } - - /** - * Returns a normalised Vector3D object representing the right vector of the given matrix. - * @param m The Matrix3D object to use to get the right vector - * @param v [optional] A vector holder to prevent make new Vector3D instance if already exists. Default is null. - * @return The right vector - */ - public static getRight(m:Matrix3D, v:Vector3D = null):Vector3D - { - //v ||= new Vector3D(0.0, 0.0, 0.0); - if (v === null) { - - v = new Vector3D(0.0, 0.0, 0.0); - - } - - m.copyColumnTo(0, v); - v.normalize(); - - return v; - } - - /** - * Returns a boolean value representing whether there is any significant difference between the two given 3d matrices. - */ - public static compare(m1:Matrix3D, m2:Matrix3D):boolean - { - var r1:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; - var r2:number[] = m2.rawData; - m1.copyRawDataTo(r1); - - for (var i:number = 0; i < 16; ++i) { - if (r1[i] != r2[i]) - return false; - } - - return true; - } - - public static lookAt(matrix:Matrix3D, pos:Vector3D, dir:Vector3D, up:Vector3D) - { - var dirN:Vector3D; - var upN:Vector3D; - var lftN:Vector3D; - var raw:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; - - lftN = dir.crossProduct(up); - lftN.normalize(); - - upN = lftN.crossProduct(dir); - upN.normalize(); - dirN = dir.clone(); - dirN.normalize(); - - raw[0] = lftN.x; - raw[1] = upN.x; - raw[2] = -dirN.x; - raw[3] = 0.0; - - raw[4] = lftN.y; - raw[5] = upN.y; - raw[6] = -dirN.y; - raw[7] = 0.0; - - raw[8] = lftN.z; - raw[9] = upN.z; - raw[10] = -dirN.z; - raw[11] = 0.0; - - raw[12] = -lftN.dotProduct(pos); - raw[13] = -upN.dotProduct(pos); - raw[14] = dirN.dotProduct(pos); - raw[15] = 1.0; - - matrix.copyRawDataFrom(raw); - } - - public static reflection(plane:Plane3D, target:Matrix3D = null):Matrix3D - { - if (target === null) - target = new Matrix3D(); - - var a:number = plane.a, b:number = plane.b, c:number = plane.c, d:number = plane.d; - var rawData:number[] = Matrix3DUtils.RAW_DATA_CONTAINER; - var ab2:number = -2*a*b; - var ac2:number = -2*a*c; - var bc2:number = -2*b*c; - // reflection matrix - rawData[0] = 1 - 2*a*a; - rawData[4] = ab2; - rawData[8] = ac2; - rawData[12] = -2*a*d; - rawData[1] = ab2; - rawData[5] = 1 - 2*b*b; - rawData[9] = bc2; - rawData[13] = -2*b*d; - rawData[2] = ac2; - rawData[6] = bc2; - rawData[10] = 1 - 2*c*c; - rawData[14] = -2*c*d; - rawData[3] = 0; - rawData[7] = 0; - rawData[11] = 0; - rawData[15] = 1; - target.copyRawDataFrom(rawData); - - return target; - } - - - public static transformVector(matrix:Matrix3D, vector:Vector3D, result:Vector3D = null):Vector3D - { - if (!result) - result = new Vector3D(); - - var raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER; - matrix.copyRawDataTo(raw); - var a:number = raw[0]; - var e:number = raw[1]; - var i:number = raw[2]; - var m:number = raw[3]; - var b:number = raw[4]; - var f:number = raw[5]; - var j:number = raw[6]; - var n:number = raw[7]; - var c:number = raw[8]; - var g:number = raw[9]; - var k:number = raw[10]; - var o:number = raw[11]; - var d:number = raw[12]; - var h:number = raw[13]; - var l:number = raw[14]; - var p:number = raw[15]; - - var x:number = vector.x; - var y:number = vector.y; - var z:number = vector.z; - result.x = a * x + b * y + c * z + d; - result.y = e * x + f * y + g * z + h; - result.z = i * x + j * y + k * z + l; - result.w = m * x + n * y + o * z + p; - return result; - } - - public static deltaTransformVector(matrix:Matrix3D, vector:Vector3D, result:Vector3D = null):Vector3D - { - if (!result) - result = new Vector3D(); - - var raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER; - matrix.copyRawDataTo(raw); - var a:number = raw[0]; - var e:number = raw[1]; - var i:number = raw[2]; - var m:number = raw[3]; - var b:number = raw[4]; - var f:number = raw[5]; - var j:number = raw[6]; - var n:number = raw[7]; - var c:number = raw[8]; - var g:number = raw[9]; - var k:number = raw[10]; - var o:number = raw[11]; - var x:number = vector.x; - var y:number = vector.y; - var z:number = vector.z; - result.x = a * x + b * y + c * z; - result.y = e * x + f * y + g * z; - result.z = i * x + j * y + k * z; - result.w = m * x + n * y + o * z; - return result; - } - - public static getTranslation(transform:Matrix3D, result:Vector3D = null):Vector3D - { - if(!result) - result = new Vector3D(); - - transform.copyColumnTo(3, result); - return result; - } - - public static deltaTransformVectors(matrix:Matrix3D, vin:Array, vout:Array) - { - var raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER; - matrix.copyRawDataTo(raw); - var a:number = raw[0]; - var e:number = raw[1]; - var i:number = raw[2]; - var m:number = raw[3]; - var b:number = raw[4]; - var f:number = raw[5]; - var j:number = raw[6]; - var n:number = raw[7]; - var c:number = raw[8]; - var g:number = raw[9]; - var k:number = raw[10]; - var o:number = raw[11]; - var outIndex:number = 0; - var length:number = vin.length; - for(var index:number = 0; index - -module away.geom -{ - /** - * A Quaternion object which can be used to represent rotations. - */ - export class Orientation3D - { - - public static AXIS_ANGLE:string = "axisAngle"; //[static] The axis angle orientation uses a combination of an axis and an angle to determine the orientation. - public static EULER_ANGLES:string = "eulerAngles"; //[static] Euler angles, the default orientation for decompose() and recompose() methods, defines the orientation with three separate angles of rotation for each axis. - public static QUATERNION:string = "quaternion"; //[static] The quaternion orientation uses complex numbers. - - } - - -} \ No newline at end of file diff --git a/src/away/core/geom/Plane3D.ts b/src/away/core/geom/Plane3D.ts deleted file mode 100644 index cc05ba96..00000000 --- a/src/away/core/geom/Plane3D.ts +++ /dev/null @@ -1,210 +0,0 @@ -/// - -module away.geom -{ - - export class Plane3D - { - /** - * The A coefficient of this plane. (Also the x dimension of the plane normal) - */ - public a:number; - - /** - * The B coefficient of this plane. (Also the y dimension of the plane normal) - */ - public b:number; - - /** - * The C coefficient of this plane. (Also the z dimension of the plane normal) - */ - public c:number; - - /** - * The D coefficient of this plane. (Also the inverse dot product between normal and point) - */ - public d:number; - - public _iAlignment:number; - - // indicates the alignment of the plane - public static ALIGN_ANY:number = 0; - public static ALIGN_XY_AXIS:number = 1; - public static ALIGN_YZ_AXIS:number = 2; - public static ALIGN_XZ_AXIS:number = 3; - - /** - * Create a Plane3D with ABCD coefficients - */ - constructor(a:number = 0, b:number = 0, c:number = 0, d:number = 0) - { - this.a = a; - this.b = b; - this.c = c; - this.d = d; - - if (a == 0 && b == 0) { - - this._iAlignment = Plane3D.ALIGN_XY_AXIS; - - } else if (b == 0 && c == 0) { - - this._iAlignment = Plane3D.ALIGN_YZ_AXIS; - - } else if (a == 0 && c == 0) { - - this._iAlignment = Plane3D.ALIGN_XZ_AXIS; - - } else { - - this._iAlignment = Plane3D.ALIGN_ANY; - - } - - } - - /** - * Fills this Plane3D with the coefficients from 3 points in 3d space. - * @param p0 Vector3D - * @param p1 Vector3D - * @param p2 Vector3D - */ - public fromPoints(p0:away.geom.Vector3D, p1:away.geom.Vector3D, p2:away.geom.Vector3D) - { - var d1x:number = p1.x - p0.x; - var d1y:number = p1.y - p0.y; - var d1z:number = p1.z - p0.z; - - var d2x:number = p2.x - p0.x; - var d2y:number = p2.y - p0.y; - var d2z:number = p2.z - p0.z; - - this.a = d1y*d2z - d1z*d2y; - this.b = d1z*d2x - d1x*d2z; - this.c = d1x*d2y - d1y*d2x; - this.d = this.a*p0.x + this.b*p0.y + this.c*p0.z; - - // not using epsilon, since a plane is infinite and a small incorrection can grow very large - if (this.a == 0 && this.b == 0) { - - this._iAlignment = Plane3D.ALIGN_XY_AXIS; - - } else if (this.b == 0 && this.c == 0) { - - this._iAlignment = Plane3D.ALIGN_YZ_AXIS; - - } else if (this.a == 0 && this.c == 0) { - - this._iAlignment = Plane3D.ALIGN_XZ_AXIS; - - } else { - - this._iAlignment = Plane3D.ALIGN_ANY; - - } - - } - - /** - * Fills this Plane3D with the coefficients from the plane's normal and a point in 3d space. - * @param normal Vector3D - * @param point Vector3D - */ - public fromNormalAndPoint(normal:away.geom.Vector3D, point:away.geom.Vector3D) - { - this.a = normal.x; - this.b = normal.y; - this.c = normal.z; - this.d = this.a*point.x + this.b*point.y + this.c*point.z; - if (this.a == 0 && this.b == 0) { - - this._iAlignment = Plane3D.ALIGN_XY_AXIS; - - } else if (this.b == 0 && this.c == 0) { - - this._iAlignment = Plane3D.ALIGN_YZ_AXIS; - - } else if (this.a == 0 && this.c == 0) { - - this._iAlignment = Plane3D.ALIGN_XZ_AXIS; - - } else { - - this._iAlignment = Plane3D.ALIGN_ANY; - - } - - } - - /** - * Normalize this Plane3D - * @return Plane3D This Plane3D. - */ - public normalize():Plane3D - { - var len:number = 1/Math.sqrt(this.a*this.a + this.b*this.b + this.c*this.c); - this.a *= len; - this.b *= len; - this.c *= len; - this.d *= len; - return this; - } - - /** - * Returns the signed distance between this Plane3D and the point p. - * @param p Vector3D - * @returns Number - */ - public distance(p:away.geom.Vector3D):number - { - - if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) { - - return this.a*p.x - this.d; - - } else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) { - return this.b*p.y - this.d; - } - - else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) { - - return this.c*p.z - this.d; - - } else { - - return this.a*p.x + this.b*p.y + this.c*p.z - this.d; - - } - - } - - /** - * Classify a point against this Plane3D. (in front, back or intersecting) - * @param p Vector3D - * @return int Plane3.FRONT or Plane3D.BACK or Plane3D.INTERSECT - */ - public classifyPoint(p:away.geom.Vector3D, epsilon:number = 0.01):number - { - // check NaN - if (this.d != this.d) - return away.geom.PlaneClassification.FRONT; - - var len:number; - if (this._iAlignment == Plane3D.ALIGN_YZ_AXIS) - len = this.a*p.x - this.d; else if (this._iAlignment == Plane3D.ALIGN_XZ_AXIS) - len = this.b*p.y - this.d; else if (this._iAlignment == Plane3D.ALIGN_XY_AXIS) - len = this.c*p.z - this.d; else - len = this.a*p.x + this.b*p.y + this.c*p.z - this.d; - - if (len < -epsilon) - return away.geom.PlaneClassification.BACK; else if (len > epsilon) - return away.geom.PlaneClassification.FRONT; else - return away.geom.PlaneClassification.INTERSECT; - } - - public toString():string - { - return "Plane3D [a:" + this.a + ", b:" + this.b + ", c:" + this.c + ", d:" + this.d + "]"; - } - } -} diff --git a/src/away/core/geom/PlaneClassification.ts b/src/away/core/geom/PlaneClassification.ts deleted file mode 100644 index 81d6c11b..00000000 --- a/src/away/core/geom/PlaneClassification.ts +++ /dev/null @@ -1,16 +0,0 @@ -/// -module away.geom -{ - - export class PlaneClassification - { - // "back" is synonymous with "in", but used for planes (back of plane is "inside" a solid volume walled by a plane) - public static BACK:number = 0; - public static FRONT:number = 1; - - public static IN:number = 0; - public static OUT:number = 1; - public static INTERSECT:number = 2; - - } -} diff --git a/src/away/core/geom/Point.ts b/src/away/core/geom/Point.ts deleted file mode 100644 index 5a624ff5..00000000 --- a/src/away/core/geom/Point.ts +++ /dev/null @@ -1,216 +0,0 @@ -/// - -/** - * The Point object represents a location in a two-dimensional coordinate - * system, where x represents the horizontal axis and y - * represents the vertical axis. - * - *

The following code creates a point at(0,0):

- * - *

Methods and properties of the following classes use Point objects:

- * - *
    - *
  • BitmapData
  • - *
  • DisplayObject
  • - *
  • DisplayObjectContainer
  • - *
  • DisplacementMapFilter
  • - *
  • NativeWindow
  • - *
  • Matrix
  • - *
  • Rectangle
  • - *
- * - *

You can use the new Point() constructor to create a Point - * object.

- */ -module away.geom -{ - export class Point - { - /** - * The horizontal coordinate of the point. The default value is 0. - */ - public x:number; - - /** - * The vertical coordinate of the point. The default value is 0. - */ - public y:number; - - /** - * The length of the line segment from(0,0) to this point. - */ - public get length():number - { - return Math.sqrt(this.x*this.x + this.y*this.y); - } - - /** - * Creates a new point. If you pass no parameters to this method, a point is - * created at(0,0). - * - * @param x The horizontal coordinate. - * @param y The vertical coordinate. - */ - constructor(x:number = 0, y:number = 0) - { - this.x = x; - this.y = y; - } - - /** - * Adds the coordinates of another point to the coordinates of this point to - * create a new point. - * - * @param v The point to be added. - * @return The new point. - */ - public add(v:Point):Point - { - return new Point(this.x + v.x, this.y + v.y); - } - - /** - * Creates a copy of this Point object. - * - * @return The new Point object. - */ - public clone():Point - { - return new Point(this.x, this.y); - } - - public copyFrom(sourcePoint:Point) - { - - } - - /** - * Determines whether two points are equal. Two points are equal if they have - * the same x and y values. - * - * @param toCompare The point to be compared. - * @return A value of true if the object is equal to this Point - * object; false if it is not equal. - */ - public equals(toCompare:Point):boolean - { - return (this.x == toCompare.x && this.y == toCompare.y); - } - - /** - * Scales the line segment between(0,0) and the current point to a set - * length. - * - * @param thickness The scaling value. For example, if the current point is - * (0,5), and you normalize it to 1, the point returned is - * at(0,1). - */ - public normalize(thickness:number = 1) - { - if (this.length != 0) { - var invLength = thickness/this.length; - this.x *= invLength; - this.y *= invLength; - return; - } - throw "Cannot divide by zero length."; - } - - /** - * Offsets the Point object by the specified amount. The value of - * dx is added to the original value of x to create the - * new x value. The value of dy is added to the original - * value of y to create the new y value. - * - * @param dx The amount by which to offset the horizontal coordinate, - * x. - * @param dy The amount by which to offset the vertical coordinate, y. - */ - public offset(dx:number, dy:number) - { - this.x += dx; - this.y += dy; - } - - public setTo(xa:number, ya:number) - { - - } - - /** - * Subtracts the coordinates of another point from the coordinates of this - * point to create a new point. - * - * @param v The point to be subtracted. - * @return The new point. - */ - public subtract(v:Point):Point - { - return new Point(this.x - v.x, this.y - v.y); - } - - /** - * Returns a string that contains the values of the x and y - * coordinates. The string has the form "(x=x, - * y=y)", so calling the toString() method for a - * point at 23,17 would return "(x=23, y=17)". - * - * @return The string representation of the coordinates. - */ - public toString():string - { - return "[Point] (x=" + this.x + ", y=" + this.y + ")"; - } - - /** - * Returns the distance between pt1 and pt2. - * - * @param pt1 The first point. - * @param pt2 The second point. - * @return The distance between the first and second points. - */ - public static distance(pt1:Point, pt2:Point):number - { - var dx:number = pt2.x - pt1.x; - var dy:number = pt2.y - pt1.y; - - return Math.sqrt(dx*dx + dy*dy); - } - - /** - * Determines a point between two specified points. The parameter - * f determines where the new interpolated point is located - * relative to the two end points specified by parameters pt1 - * and pt2. The closer the value of the parameter f - * is to 1.0, the closer the interpolated point is to the first - * point(parameter pt1). The closer the value of the parameter - * f is to 0, the closer the interpolated point is to the second - * point(parameter pt2). - * - * @param pt1 The first point. - * @param pt2 The second point. - * @param f The level of interpolation between the two points. Indicates - * where the new point will be, along the line between - * pt1 and pt2. If f=1, - * pt1 is returned; if f=0, - * pt2 is returned. - * @return The new, interpolated point. - */ - public static interpolate(pt1:Point, pt2:Point, f:number):Point - { - return new Point(pt2.x + (pt1.x - pt2.x)*f, pt2.y + (pt1.y - pt2.y)*f); - } - - /** - * Converts a pair of polar coordinates to a Cartesian point coordinate. - * - * @param len The length coordinate of the polar pair. - * @param angle The angle, in radians, of the polar pair. - * @return The Cartesian point. - */ - public static polar(len:number, angle:number):Point - { - return new Point(len*Math.cos(angle), len*Math.sin(angle)); - } - } -} \ No newline at end of file diff --git a/src/away/core/geom/PoissonLookup.ts b/src/away/core/geom/PoissonLookup.ts deleted file mode 100644 index 4aa79a52..00000000 --- a/src/away/core/geom/PoissonLookup.ts +++ /dev/null @@ -1,58 +0,0 @@ -/// - -module away.geom -{ - export class PoissonLookup - { - public static _distributions:Array>; - - public static initDistributions():void - { - // precalculated for best control - this._distributions = new Array>(); - this._distributions[0] = new Array(0.3082841, 0.4320919); - this._distributions[1] = new Array(0.3082841, 0.4320919, -0.2274942, -0.6640266); - this._distributions[2] = new Array(0.8742689, 0.0009265686, -0.6864116, -0.5536607, -0.2325206, 0.7678371); - this._distributions[3] = new Array(0.3913446, -0.7084417, -0.7511101, -0.5935929, -0.2323436, 0.5320091, 0.8435315, 0.5035911); - this._distributions[4] = new Array(0.2122471, -0.5771395, -0.8543506, -0.1763534, 0.5189021, 0.8323698, -0.3616908, 0.5865368, 0.9523004, -0.04948437); - this._distributions[5] = new Array(0.5791035, 0.3496495, 0.2959551, -0.6006749, -0.2419119, -0.06879545, -0.7403072, 0.6110353, -0.04555973, 0.8059174, -0.5275017, -0.737129); - this._distributions[6] = new Array(0.06941478, 0.8519508, -0.7441907, 0.2426432, 0.6439992, -0.2405252, -0.1007523, -0.2327587, -0.6427067, -0.7248485, 0.8050759, 0.5492936, 0.3573822, -0.8824506); - this._distributions[7] = new Array(0.8509863, 0.4452587, -0.09507271, 0.2073005, 0.1706571, -0.6434793, 0.8029777, -0.2718274, -0.4401725, 0.8196304, 0.2715359, 0.8598521, -0.8121575, -0.006447683, -0.6486837, -0.7237598); - this._distributions[8] = new Array(0.6951686, -0.2680728, -0.04933243, 0.3710589, 0.6592212, 0.3661054, -0.01579228, -0.6909603, -0.3275101, -0.1756866, 0.3811549, 0.9218544, -0.216032, 0.9755028, -0.7065172, 0.3355389, -0.6579109, -0.6798355); - this._distributions[9] = new Array(0.6181276, -0.09790418, -0.2537868, -0.5570995, -0.1964931, 0.3459414, 0.3474613, -0.8885581, 0.5135743, 0.5753114, -0.9549091, 0.1480672, -0.8711916, -0.4293123, -0.6928071, 0.6190156, -0.13369, 0.8892705, 0.0548224, -0.1246777); - this._distributions[10] = new Array(0.4853027, -0.5080479, -0.1331675, -0.506597, 0.139575, 0.01316885, 0.803486, -0.07568797, 0.5240274, 0.4883182, -0.4334005, 0.1207938, -0.7794577, -0.3985141, 0.1576432, -0.9861221, -0.3712867, 0.6959021, 0.1517378, 0.9847429, -0.9762396, 0.1661073); - this._distributions[11] = new Array(-0.2790166, -0.01252619, 0.3389016, 0.3921154, 0.2408341, -0.313211, -0.8151779, -0.3898362, -0.6347761, 0.3486495, 0.09471484, -0.7722448, -0.1385674, 0.6364574, 0.2456331, 0.9295807, -0.3864306, -0.8247881, 0.6111673, -0.7164014, 0.8287669, 0.05466961, 0.837706, 0.5415626); - this._distributions[12] = new Array(0.056417, 0.3185693, -0.8245888, 0.1882799, 0.8575996, 0.1136829, 0.1070375, 0.875332, 0.4076743, -0.06000621, -0.4311306, 0.7239349, 0.2677574, -0.538472, -0.08486642, -0.2083647, -0.888989, -0.3906443, -0.4768958, -0.6664082, 0.09334993, -0.9861541, 0.808736, -0.455949, 0.5889823, 0.7660807); - this._distributions[13] = new Array(-0.2681346, -0.3955857, -0.1315102, -0.8852947, -0.5143692, 0.09551838, 0.4344836, -0.546945, -0.8620899, -0.3813288, 0.1650431, 0.02034803, -0.1543657, 0.3842218, -0.828457, 0.5376903, -0.6145, -0.7818927, -0.2639062, 0.8784655, 0.1912684, 0.9720125, 0.3135219, 0.5224229, 0.7850655, 0.4592297, 0.7465045, -0.1368916); - this._distributions[14] = new Array(0.4241029, 0.695281, 0.150511, -0.02304107, -0.2482675, 0.9120338, 0.8057325, 0.2622084, -0.2445909, 0.2765962, 0.8588713, -0.1772072, 0.3117845, -0.4385471, -0.3923851, -0.3298936, -0.1751254, -0.7405846, 0.6926506, -0.684163, -0.9304563, -0.3254691, -0.8533293, 0.1523024, 0.2510415, -0.917345, -0.6239773, -0.7105472, -0.6104624, 0.6041355); - this._distributions[15] = new Array(0.5844554, 0.06651045, 0.1343258, 0.6756578, 0.3799674, -0.6301104, 0.5590436, 0.7940555, 0.09574714, 0.02262517, 0.8697868, 0.393301, 0.003945862, -0.421735, 0.9043913, -0.2432393, -0.4844007, 0.7190998, -0.3201078, 0.2972371, -0.3852352, -0.6341155, -0.5413069, -0.09223081, -0.8468984, -0.5126905, 0.004156174, -0.8633173, -0.9681889, -0.03305046, -0.846509, 0.4414353); - this._distributions[16] = new Array(0.4506488, 0.657668, 0.4621297, 0.07441051, -0.2782125, 0.6201044, 0.9750003, 0.09110117, 0.1019436, 0.2986514, 0.03457398, 0.9631706, 0.542098, -0.5505635, 0.8675668, 0.4938077, -0.5414361, 0.2655292, -0.7941836, 0.6003053, -0.09847672, -0.1001604, -0.9316511, -0.08572888, 0.07286467, -0.611899, -0.5232627, -0.4082253, -0.5481608, -0.827938, -0.1551939, -0.9621193, 0.9220031, -0.3315949); - this._distributions[17] = new Array(0.197908, -0.4697656, -0.4474689, -0.3428435, 0.8529873, -0.2228634, 0.6022478, -0.5469642, 0.2545276, -0.931133, -0.1507547, -0.7855865, -0.07606658, 0.1011628, 0.3046715, 0.2785755, 0.4698432, -0.1064076, 0.6831254, 0.4152522, 0.1374381, 0.8363233, -0.2166121, 0.6682042, 0.5511393, 0.7996449, -0.4278994, 0.28836, -0.8875198, 0.2181732, -0.8772842, -0.2818254, -0.7000262, 0.5762185, -0.6062385, -0.7439126); - this._distributions[18] = new Array(0.6645703, -0.05678739, 0.5720971, 0.4533803, -0.07660709, 0.08802763, 0.5163431, -0.4426552, 0.1163455, -0.3404382, -0.4004807, -0.5046007, 0.2932099, -0.8201418, -0.5322125, 0.03834766, -0.1490209, -0.8817304, -0.8000439, -0.3509448, 0.5260983, 0.8421043, 0.1197811, 0.6963812, 0.9498612, 0.3122156, -0.9285746, 0.02120355, -0.6670724, 0.7217396, 0.9155889, -0.3510147, -0.271941, 0.4727852, 0.318879, 0.1634057, -0.2686755, 0.9253026); - this._distributions[19] = new Array(0.5064292, 0.422527, 0.8935515, -0.06610427, 0.1199719, 0.175568, 0.403388, -0.2003276, 0.1657927, 0.8154403, 0.9301245, 0.2929218, -0.1644068, 0.6201534, 0.7113559, -0.6589743, -0.3364046, -0.1799502, 0.02109996, -0.392765, -0.382213, 0.3219992, -0.9201946, 0.1207967, -0.726185, 0.4291916, -0.7443482, -0.2480059, -0.5147594, 0.7418784, 0.1935272, -0.7406143, -0.3643523, -0.5559214, -0.7147766, -0.6326278, -0.2524151, -0.9096627, 0.5161405, 0.7908453); - this._distributions[20] = new Array(0.7921003, -0.3032096, 0.5992879, -0.009052323, 0.2538549, -0.1872749, 0.7053444, 0.3677175, 0.5417761, -0.8170255, 0.9749611, 0.1210478, 0.1969143, -0.6117041, -0.1824499, -0.4634196, -0.1181338, -0.8668742, -0.3050112, -0.1352596, -0.4409327, -0.7082354, -0.03225285, 0.1171548, 0.3113096, 0.3250439, -0.8166144, -0.463995, -0.01014475, 0.4715334, -0.6868284, 0.05091889, -0.4011163, 0.2717285, -0.06756835, 0.8307694, -0.7938535, 0.4352129, -0.4663842, 0.7165329, 0.559729, 0.8093995); - this._distributions[21] = new Array(0.07832243, 0.426151, -0.3856795, 0.5799953, 0.01970797, 0.06706189, 0.4822682, 0.3014512, -0.1532982, 0.87485, -0.4959527, 0.07888043, 0.260601, -0.2304784, 0.4996209, 0.7167382, 0.585986, -0.04265174, -0.7679967, 0.5509416, -0.9041753, 0.1802134, -0.8407655, -0.4442826, -0.2058258, -0.2636995, -0.4984115, -0.5928579, 0.2926032, -0.7886473, -0.06933882, -0.621177, 0.578115, -0.4813387, 0.8981777, -0.3291056, 0.1942733, 0.9255584, 0.8084362, 0.5066984, 0.9920095, 0.03103104, -0.2403206, -0.9389018); - this._distributions[22] = new Array(-0.5691095, 0.1014316, -0.7788262, 0.384012, -0.8253665, -0.1645582, -0.1830993, 0.002997211, -0.2555013, -0.4177977, -0.6640869, -0.4794711, -0.2351242, 0.5850121, 0.02436554, 0.2825883, 0.006061143, -0.8200245, 0.1618791, -0.3063331, -0.3765897, -0.7249815, 0.6092919, -0.6769328, -0.5956934, 0.6957655, 0.5383642, 0.4522677, -0.1489165, 0.9125596, 0.4167473, 0.1335986, 0.1898309, 0.5874342, 0.2288171, 0.9624356, 0.7540846, -0.07672304, 0.8986252, 0.2788797, 0.3555991, -0.9262139, 0.8454325, -0.4027667, 0.4945236, -0.2935512); - this._distributions[23] = new Array(-0.4481403, -0.3758374, -0.8877251, 0.08739938, 0.05015831, -0.1339983, -0.4070427, -0.8534173, 0.1019274, -0.5503222, -0.445998, 0.1997541, -0.8686263, -0.2788867, -0.7695944, -0.6033704, -0.05515742, -0.885711, -0.7714347, 0.5790485, 0.3466263, -0.8799297, 0.4487582, -0.5321087, -0.2461368, 0.6053771, -0.05568117, 0.2457351, -0.4668669, 0.8523816, 0.8103387, -0.4255538, 0.4054182, -0.175663, -0.2802011, -0.08920153, 0.2665959, 0.382935, 0.555679, 0.1621837, 0.105246, 0.8420411, 0.6921161, 0.6902903, 0.880946, 0.2483067, 0.9699264, -0.1021767); - this._distributions[24] = new Array(-0.1703323, -0.3119385, 0.2916039, -0.2988263, -0.008472982, -0.9277695, -0.7730271, -0.3277904, 0.3440474, -0.6815342, -0.2910278, 0.03461745, -0.6764899, -0.657078, -0.3505501, -0.7311988, -0.03478927, 0.3258755, -0.6048835, 0.159423, 0.2035525, 0.02212214, 0.5116573, 0.2226856, 0.6664805, -0.2500189, 0.7147882, -0.6609634, 0.03030632, -0.5763278, -0.2516585, 0.6116219, -0.9434413, -0.0116792, 0.9061816, 0.2491155, 0.182867, 0.6076167, 0.286593, 0.9485695, -0.5992439, 0.6970096, -0.2082874, 0.9416641, 0.9880044, -0.1541709, -0.9122881, 0.331555, 0.7324886, 0.6725098); - this._distributions[25] = new Array(0.3869598, -0.04974834, 0.7168844, -0.0693711, -0.07166742, 0.1725325, 0.4599592, 0.3232779, 0.5872094, -0.4198674, 0.2442266, -0.625667, 0.1254557, 0.4500048, -0.2290154, -0.1803567, 0.890583, 0.3373493, 0.1256081, 0.7853789, -0.2676466, 0.5305805, -0.7063224, 0.252168, -0.3989835, 0.1189921, 0.09617215, -0.2451447, 0.6302541, 0.6085876, 0.9380925, -0.3234899, 0.5086241, -0.8573482, 0.03576187, -0.9876697, -0.0876712, -0.6365195, -0.5276513, 0.823456, -0.6935764, -0.2240411, -0.5212318, -0.5383121, -0.2116208, 0.9639363, -0.9840096, 0.02743555, -0.3991577, -0.8994547, -0.7830126, 0.614068); - this._distributions[26] = new Array(-0.8366601, 0.4464895, -0.5917366, -0.02073906, -0.9845258, 0.1635625, -0.3097973, 0.4379579, -0.5478154, 0.7173221, -0.1685888, 0.9261969, 0.01503595, 0.6046097, 0.4452421, 0.5449086, 0.0315687, 0.1944619, 0.3753404, 0.8688548, 0.4143643, 0.1396648, 0.8711032, 0.4304703, 0.7328773, 0.1461501, 0.6374492, -0.3521495, 0.145613, -0.1341466, 0.9040975, -0.135123, -0.7839059, -0.5450199, -0.516019, -0.3320859, -0.206158, -0.4431106, -0.9703014, -0.2368356, -0.2473119, -0.0864351, 0.2130725, -0.4604077, -0.003726701, -0.7122303, -0.4072131, -0.6833169, 0.1632999, -0.9776646, 0.4686888, -0.680495, -0.2293511, -0.9509777); - this._distributions[27] = new Array(0.107311, -0.1311369, -0.4194764, -0.3148777, 0.6171439, -0.2745973, 0.2796618, 0.1937153, -0.09106886, 0.4180236, 0.6044006, 0.05577846, 0.02927299, -0.6738263, -0.2580845, 0.1179939, -0.09023564, -0.3830024, 0.3570953, -0.5000587, 0.81591, -0.5518309, 0.9300217, -0.1257987, 0.4904627, -0.8381903, -0.3163182, -0.8632009, 0.1137595, -0.9875998, 0.8390043, 0.3538185, 0.2149114, 0.4993694, 0.5191584, 0.3833552, 0.5002763, 0.7061465, -0.2567276, 0.9068756, -0.5197366, 0.3467845, 0.03668867, 0.9734009, -0.5347553, 0.66747, -0.9028882, 0.1023768, -0.8967977, 0.412834, -0.5821944, 0.0426479, -0.8032165, -0.2397038, -0.5597343, -0.6358021); - this._distributions[28] = new Array(-0.6562496, -0.1781036, -0.9301494, 0.1185208, -0.3861143, -0.4153562, -0.1560799, -0.1099607, -0.5587025, 0.395218, -0.5322112, -0.699701, -0.5008639, 0.08726846, -0.970524, -0.1963461, -0.813577, -0.5185111, -0.1644458, 0.298, -0.3216791, 0.639982, 0.3315373, 0.3339162, 0.2383235, -0.00105722, 0.1137828, 0.5450742, -0.01899921, 0.8798413, 0.2849685, 0.8255596, 0.6974412, 0.2123175, 0.7588523, 0.5470437, 0.5102502, -0.1687844, 0.5853448, 0.8033476, 0.2590716, -0.5262504, 0.5607718, -0.6342825, 0.8666443, -0.1491841, 0.8341052, -0.4935003, -0.1568441, -0.6634066, 0.2512113, -0.8769391, -0.2559827, -0.9572457, -0.01928852, -0.3966542, -0.750667, 0.6409678); - this._distributions[29] = new Array(0.3454786, -0.04837726, 0.2649553, 0.2406852, 0.5599093, -0.3839145, -0.1111814, -0.05502108, 0.7586042, -0.05818377, 0.2519488, -0.4665135, -0.1264972, 0.2602723, -0.08766216, -0.3671907, 0.6428129, 0.3999204, -0.6105871, -0.1246869, -0.4589451, -0.7646643, -0.03021116, -0.7899352, -0.6036922, -0.4293956, -0.2481938, 0.6534185, 0.102798, 0.6784465, -0.6392644, 0.4821358, -0.6789002, 0.1779133, -0.9140783, -0.1989647, -0.9262617, 0.3381507, 0.4794891, -0.8093274, 0.3959447, 0.668478, 0.9602883, 0.2272305, -0.123672, 0.9210883, 0.2375148, 0.9523395, -0.52898, 0.7973378, -0.382433, 0.1228794, 0.695015, 0.6948439, 0.7530277, -0.6458191, 0.8777987, -0.3272956, 0.2318525, -0.962768); - this._distributions[30] = new Array(0.4518921, -0.1146195, 0.4720805, -0.4238748, 0.3655423, 0.1806341, 0.1589939, -0.23568, 0.7673324, -0.5149941, 0.01163658, 0.09045836, 0.7010971, 0.1245747, 0.7518286, -0.1855433, 0.4960719, 0.4601022, 0.2566979, -0.6308268, -0.0654714, -0.5126389, -0.1823319, -0.1343282, -0.1464312, 0.4883236, -0.3858738, 0.203523, 0.1484799, 0.4432284, -0.477109, -0.116241, 0.2719092, 0.7208626, 0.9104174, 0.3578536, -0.5956199, 0.7662588, -0.6996251, 0.3678654, -0.2514512, 0.9251933, 0.1275825, -0.9478135, -0.204608, -0.8611552, 0.4264838, -0.877443, 0.9854161, 0.05521112, 0.5912951, 0.7997434, 0.1140349, 0.982093, -0.9324368, -0.2094094, -0.42436, -0.6441524, -0.6722705, -0.3554261, -0.7844236, 0.08587621); - this._distributions[31] = new Array(-0.4206714, -0.5613642, -0.8733016, -0.3373051, -0.1046226, -0.2902999, -0.1318562, -0.8434365, 0.1145093, -0.5962623, -0.4965627, -0.1873259, -0.5011808, -0.8546229, -0.7165636, -0.5743566, 0.1090901, 0.2017643, 0.3404809, -0.220455, -0.1989015, 0.2372122, -0.4538706, 0.0979171, 0.4514146, -0.572846, 0.2314168, -0.8514503, -0.4247236, 0.5650803, -0.943347, 0.04514639, -0.1309718, 0.5221877, -0.7004157, 0.4561877, 0.6306441, 0.04448673, 0.4301621, 0.5766876, 0.1078042, 0.7245752, 0.3875354, 0.2794483, 0.702876, -0.2924213, 0.7360667, -0.6210318, 0.7486517, 0.6531103, 0.4898235, 0.8591025, 0.6549174, 0.3854057, -0.2596106, 0.7916998, 0.9251194, -0.05296265, -0.5620695, 0.820877, -0.01228026, 0.9937211, 0.9612103, 0.2628758); - } - - public static getDistribution(n:number /*int*/):Array - { - if (!this._distributions) - this.initDistributions(); - - if (n < 2 || n > 32) - return null; - - return this._distributions[n - 1]; - } - } -} diff --git a/src/away/core/geom/Quaternion.ts b/src/away/core/geom/Quaternion.ts deleted file mode 100644 index e936b79d..00000000 --- a/src/away/core/geom/Quaternion.ts +++ /dev/null @@ -1,385 +0,0 @@ -/// -module away.geom -{ - //import flash.geom.Matrix3D; - //import flash.geom.Orientation3D; - //import flash.geom.Vector3D; - - /** - * A Quaternion object which can be used to represent rotations. - */ - export class Quaternion - { - /** - * The x value of the quaternion. - */ - public x:number = 0; - - /** - * The y value of the quaternion. - */ - public y:number = 0; - - /** - * The z value of the quaternion. - */ - public z:number = 0; - - /** - * The w value of the quaternion. - */ - public w:number = 1; - - /** - * Creates a new Quaternion object. - * @param x The x value of the quaternion. - * @param y The y value of the quaternion. - * @param z The z value of the quaternion. - * @param w The w value of the quaternion. - */ - constructor(x:number = 0, y:number = 0, z:number = 0, w:number = 1) - { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - - /** - * Returns the magnitude of the quaternion object. - */ - public get magnitude():number - { - return Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z); - } - - /** - * Fills the quaternion object with the result from a multiplication of two quaternion objects. - * - * @param qa The first quaternion in the multiplication. - * @param qb The second quaternion in the multiplication. - */ - public multiply(qa:Quaternion, qb:Quaternion) - { - var w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z; - var w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z; - - this.w = w1*w2 - x1*x2 - y1*y2 - z1*z2; - this.x = w1*x2 + x1*w2 + y1*z2 - z1*y2; - this.y = w1*y2 - x1*z2 + y1*w2 + z1*x2; - this.z = w1*z2 + x1*y2 - y1*x2 + z1*w2; - } - - public multiplyVector(vector:away.geom.Vector3D, target:Quaternion = null):Quaternion - { - //target ||= new Quaternion(); - if (target === null) { - target = new Quaternion(); - - } - - - var x2:number = vector.x; - var y2:number = vector.y; - var z2:number = vector.z; - - target.w = -this.x*x2 - this.y*y2 - this.z*z2; - target.x = this.w*x2 + this.y*z2 - this.z*y2; - target.y = this.w*y2 - this.x*z2 + this.z*x2; - target.z = this.w*z2 + this.x*y2 - this.y*x2; - - return target; - } - - /** - * Fills the quaternion object with values representing the given rotation around a vector. - * - * @param axis The axis around which to rotate - * @param angle The angle in radians of the rotation. - */ - public fromAxisAngle(axis:away.geom.Vector3D, angle:number) - { - var sin_a:number = Math.sin(angle/2); - var cos_a:number = Math.cos(angle/2); - - this.x = axis.x*sin_a; - this.y = axis.y*sin_a; - this.z = axis.z*sin_a; - this.w = cos_a; - - this.normalize(); - } - - /** - * Spherically interpolates between two quaternions, providing an interpolation between rotations with constant angle change rate. - * @param qa The first quaternion to interpolate. - * @param qb The second quaternion to interpolate. - * @param t The interpolation weight, a value between 0 and 1. - */ - public slerp(qa:Quaternion, qb:Quaternion, t:number) - { - var w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z; - var w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z; - var dot:number = w1*w2 + x1*x2 + y1*y2 + z1*z2; - - // shortest direction - if (dot < 0) { - dot = -dot; - w2 = -w2; - x2 = -x2; - y2 = -y2; - z2 = -z2; - } - - if (dot < 0.95) { - // interpolate angle linearly - var angle:number = Math.acos(dot); - var s:number = 1/Math.sin(angle); - var s1:number = Math.sin(angle*(1 - t))*s; - var s2:number = Math.sin(angle*t)*s; - this.w = w1*s1 + w2*s2; - this.x = x1*s1 + x2*s2; - this.y = y1*s1 + y2*s2; - this.z = z1*s1 + z2*s2; - } else { - // nearly identical angle, interpolate linearly - this.w = w1 + t*(w2 - w1); - this.x = x1 + t*(x2 - x1); - this.y = y1 + t*(y2 - y1); - this.z = z1 + t*(z2 - z1); - var len:number = 1.0/Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z); - this.w *= len; - this.x *= len; - this.y *= len; - this.z *= len; - } - } - - /** - * Linearly interpolates between two quaternions. - * @param qa The first quaternion to interpolate. - * @param qb The second quaternion to interpolate. - * @param t The interpolation weight, a value between 0 and 1. - */ - public lerp(qa:Quaternion, qb:Quaternion, t:number) - { - var w1:number = qa.w, x1:number = qa.x, y1:number = qa.y, z1:number = qa.z; - var w2:number = qb.w, x2:number = qb.x, y2:number = qb.y, z2:number = qb.z; - var len:number; - - // shortest direction - if (w1*w2 + x1*x2 + y1*y2 + z1*z2 < 0) { - w2 = -w2; - x2 = -x2; - y2 = -y2; - z2 = -z2; - } - - this.w = w1 + t*(w2 - w1); - this.x = x1 + t*(x2 - x1); - this.y = y1 + t*(y2 - y1); - this.z = z1 + t*(z2 - z1); - - len = 1.0/Math.sqrt(this.w*this.w + this.x*this.x + this.y*this.y + this.z*this.z); - this.w *= len; - this.x *= len; - this.y *= len; - this.z *= len; - } - - /** - * Fills the quaternion object with values representing the given euler rotation. - * - * @param ax The angle in radians of the rotation around the ax axis. - * @param ay The angle in radians of the rotation around the ay axis. - * @param az The angle in radians of the rotation around the az axis. - */ - public fromEulerAngles(ax:number, ay:number, az:number) - { - var halfX:number = ax*.5, halfY:number = ay*.5, halfZ:number = az*.5; - var cosX:number = Math.cos(halfX), sinX:number = Math.sin(halfX); - var cosY:number = Math.cos(halfY), sinY:number = Math.sin(halfY); - var cosZ:number = Math.cos(halfZ), sinZ:number = Math.sin(halfZ); - - this.w = cosX*cosY*cosZ + sinX*sinY*sinZ; - this.x = sinX*cosY*cosZ - cosX*sinY*sinZ; - this.y = cosX*sinY*cosZ + sinX*cosY*sinZ; - this.z = cosX*cosY*sinZ - sinX*sinY*cosZ; - } - - /** - * Fills a target Vector3D object with the Euler angles that form the rotation represented by this quaternion. - * @param target An optional Vector3D object to contain the Euler angles. If not provided, a new object is created. - * @return The Vector3D containing the Euler angles. - */ - public toEulerAngles(target:away.geom.Vector3D = null):away.geom.Vector3D - { - - //target ||= new away.geom.Vector3D(); - if (target === null) { - - target = new away.geom.Vector3D(); - - } - - target.x = Math.atan2(2*(this.w*this.x + this.y*this.z), 1 - 2*(this.x*this.x + this.y*this.y)); - target.y = Math.asin(2*(this.w*this.y - this.z*this.x)); - target.z = Math.atan2(2*(this.w*this.z + this.x*this.y), 1 - 2*(this.y*this.y + this.z*this.z)); - - return target; - } - - /** - * Normalises the quaternion object. - */ - public normalize(val:number = 1) - { - var mag:number = val/Math.sqrt(this.x*this.x + this.y*this.y + this.z*this.z + this.w*this.w); - - this.x *= mag; - this.y *= mag; - this.z *= mag; - this.w *= mag; - } - - /** - * Used to trace the values of a quaternion. - * - * @return A string representation of the quaternion object. - */ - public toString():string - { - return "{x:" + this.x + " y:" + this.y + " z:" + this.z + " w:" + this.w + "}"; - } - - /** - * Converts the quaternion to a Matrix3D object representing an equivalent rotation. - * @param target An optional Matrix3D container to store the transformation in. If not provided, a new object is created. - * @return A Matrix3D object representing an equivalent rotation. - */ - public toMatrix3D(target:away.geom.Matrix3D = null):away.geom.Matrix3D - { - var rawData:number[] = away.geom.Matrix3DUtils.RAW_DATA_CONTAINER; - var xy2:number = 2.0*this.x*this.y, xz2:number = 2.0*this.x*this.z, xw2:number = 2.0*this.x*this.w; - var yz2:number = 2.0*this.y*this.z, yw2:number = 2.0*this.y*this.w, zw2:number = 2.0*this.z*this.w; - var xx:number = this.x*this.x, yy:number = this.y*this.y, zz:number = this.z*this.z, ww:number = this.w*this.w; - - rawData[0] = xx - yy - zz + ww; - rawData[4] = xy2 - zw2; - rawData[8] = xz2 + yw2; - rawData[12] = 0; - rawData[1] = xy2 + zw2; - rawData[5] = -xx + yy - zz + ww; - rawData[9] = yz2 - xw2; - rawData[13] = 0; - rawData[2] = xz2 - yw2; - rawData[6] = yz2 + xw2; - rawData[10] = -xx - yy + zz + ww; - rawData[14] = 0; - rawData[3] = 0.0; - rawData[7] = 0.0; - rawData[11] = 0; - rawData[15] = 1; - - if (!target) - return new away.geom.Matrix3D(rawData); - - target.copyRawDataFrom(rawData); - - return target; - } - - /** - * Extracts a quaternion rotation matrix out of a given Matrix3D object. - * @param matrix The Matrix3D out of which the rotation will be extracted. - */ - public fromMatrix(matrix:away.geom.Matrix3D) - { - var v:away.geom.Vector3D = matrix.decompose(away.geom.Orientation3D.QUATERNION)[1]; - this.x = v.x; - this.y = v.y; - this.z = v.z; - this.w = v.w; - } - - /** - * Converts the quaternion to a Vector.<Number> matrix representation of a rotation equivalent to this quaternion. - * @param target The Vector.<Number> to contain the raw matrix data. - * @param exclude4thRow If true, the last row will be omitted, and a 4x3 matrix will be generated instead of a 4x4. - */ - public toRawData(target:number[], exclude4thRow:boolean = false) - { - var xy2:number = 2.0*this.x*this.y, xz2:number = 2.0*this.x*this.z, xw2:number = 2.0*this.x*this.w; - var yz2:number = 2.0*this.y*this.z, yw2:number = 2.0*this.y*this.w, zw2:number = 2.0*this.z*this.w; - var xx:number = this.x*this.x, yy:number = this.y*this.y, zz:number = this.z*this.z, ww:number = this.w*this.w; - - target[0] = xx - yy - zz + ww; - target[1] = xy2 - zw2; - target[2] = xz2 + yw2; - target[4] = xy2 + zw2; - target[5] = -xx + yy - zz + ww; - target[6] = yz2 - xw2; - target[8] = xz2 - yw2; - target[9] = yz2 + xw2; - target[10] = -xx - yy + zz + ww; - target[3] = target[7] = target[11] = 0; - - if (!exclude4thRow) { - target[12] = target[13] = target[14] = 0; - target[15] = 1; - } - } - - /** - * Clones the quaternion. - * @return An exact duplicate of the current Quaternion. - */ - public clone():Quaternion - { - return new Quaternion(this.x, this.y, this.z, this.w); - } - - /** - * Rotates a point. - * @param vector The Vector3D object to be rotated. - * @param target An optional Vector3D object that will contain the rotated coordinates. If not provided, a new object will be created. - * @return A Vector3D object containing the rotated point. - */ - public rotatePoint(vector:away.geom.Vector3D, target:away.geom.Vector3D = null):away.geom.Vector3D - { - var x1:number, y1:number, z1:number, w1:number; - var x2:number = vector.x, y2:number = vector.y, z2:number = vector.z; - - //target ||= new away.geom.Vector3D(); - if (target === null) { - - target = new away.geom.Vector3D(); - - } - - // p*q' - w1 = -this.x*x2 - this.y*y2 - this.z*z2; - x1 = this.w*x2 + this.y*z2 - this.z*y2; - y1 = this.w*y2 - this.x*z2 + this.z*x2; - z1 = this.w*z2 + this.x*y2 - this.y*x2; - - target.x = -w1*this.x + x1*this.w - y1*this.z + z1*this.y; - target.y = -w1*this.y + x1*this.z + y1*this.w - z1*this.x; - target.z = -w1*this.z - x1*this.y + y1*this.x + z1*this.w; - - return target; - } - - /** - * Copies the data from a quaternion into this instance. - * @param q The quaternion to copy from. - */ - public copyFrom(q:Quaternion) - { - this.x = q.x; - this.y = q.y; - this.z = q.z; - this.w = q.w; - } - } -} diff --git a/src/away/core/geom/Rectangle.ts b/src/away/core/geom/Rectangle.ts deleted file mode 100644 index 689de0db..00000000 --- a/src/away/core/geom/Rectangle.ts +++ /dev/null @@ -1,536 +0,0 @@ -/// - -/** - * A Rectangle object is an area defined by its position, as indicated by its - * top-left corner point(x, y) and by its width and its height. - * - * - *

The x, y, width, and - * height properties of the Rectangle class are independent of - * each other; changing the value of one property has no effect on the others. - * However, the right and bottom properties are - * integrally related to those four properties. For example, if you change the - * value of the right property, the value of the - * width property changes; if you change the bottom - * property, the value of the height property changes.

- * - *

The following methods and properties use Rectangle objects:

- * - *
    - *
  • The applyFilter(), colorTransform(), - * copyChannel(), copyPixels(), draw(), - * fillRect(), generateFilterRect(), - * getColorBoundsRect(), getPixels(), - * merge(), paletteMap(), - * pixelDisolve(), setPixels(), and - * threshold() methods, and the rect property of the - * BitmapData class
  • - *
  • The getBounds() and getRect() methods, and - * the scrollRect and scale9Grid properties of the - * DisplayObject class
  • - *
  • The getCharBoundaries() method of the TextField - * class
  • - *
  • The pixelBounds property of the Transform class
  • - *
  • The bounds parameter for the startDrag() - * method of the Sprite class
  • - *
  • The printArea parameter of the addPage() - * method of the PrintJob class
  • - *
- * - *

You can use the new Rectangle() constructor to create a - * Rectangle object.

- * - *

Note: The Rectangle class does not define a rectangular Shape - * display object. To draw a rectangular Shape object onscreen, use the - * drawRect() method of the Graphics class.

- */ -module away.geom -{ - export class Rectangle - { - private _size:Point; - private _bottomRight:Point; - private _topLeft:Point; - - /** - * The height of the rectangle, in pixels. Changing the height - * value of a Rectangle object has no effect on the x, - * y, and width properties. - */ - public height:number; - - /** - * The width of the rectangle, in pixels. Changing the width - * value of a Rectangle object has no effect on the x, - * y, and height properties. - */ - public width:number; - - /** - * The x coordinate of the top-left corner of the rectangle. Changing - * the value of the x property of a Rectangle object has no - * effect on the y, width, and height - * properties. - * - *

The value of the x property is equal to the value of the - * left property.

- */ - public x:number; - - /** - * The y coordinate of the top-left corner of the rectangle. Changing - * the value of the y property of a Rectangle object has no - * effect on the x, width, and height - * properties. - * - *

The value of the y property is equal to the value of the - * top property.

- */ - public y:number; - - /** - * The sum of the y and height properties. - */ - public get bottom():number - { - return this.y + this.height; - } - - /** - * The location of the Rectangle object's bottom-right corner, determined by - * the values of the right and bottom properties. - */ - public get bottomRight():away.geom.Point - { - if (this._bottomRight == null) - this._bottomRight = new Point(); - - this._bottomRight.x = this.x + this.width; - this._bottomRight.y = this.y + this.height; - - return this._bottomRight; - } - - /** - * The x coordinate of the top-left corner of the rectangle. Changing - * the left property of a Rectangle object has no effect on the - * y and height properties. However it does affect - * the width property, whereas changing the x value - * does not affect the width property. - * - *

The value of the left property is equal to the value of - * the x property.

- */ - public get left():number - { - return this.x; - } - - /** - * The sum of the x and width properties. - */ - public get right():number - { - return this.x + this.width; - } - - /** - * The size of the Rectangle object, expressed as a Point object with the - * values of the width and height properties. - */ - public get size():Point - { - if (this._size == null) - this._size = new Point(); - - this._size.x = this.width; - this._size.y = this.height; - - return this._size; - } - - /** - * The y coordinate of the top-left corner of the rectangle. Changing - * the top property of a Rectangle object has no effect on the - * x and width properties. However it does affect - * the height property, whereas changing the y - * value does not affect the height property. - * - *

The value of the top property is equal to the value of the - * y property.

- */ - public get top():number - { - return this.y; - } - - /** - * The location of the Rectangle object's top-left corner, determined by the - * x and y coordinates of the point. - */ - public get topLeft():away.geom.Point - { - if (this._topLeft == null) - this._topLeft = new Point(); - - this._topLeft.x = this.x; - this._topLeft.y = this.y; - - return this._topLeft; - } - - /** - * Creates a new Rectangle object with the top-left corner specified by the - * x and y parameters and with the specified - * width and height parameters. If you call this - * public without parameters, a rectangle with x, - * y, width, and height properties set - * to 0 is created. - * - * @param x The x coordinate of the top-left corner of the - * rectangle. - * @param y The y coordinate of the top-left corner of the - * rectangle. - * @param width The width of the rectangle, in pixels. - * @param height The height of the rectangle, in pixels. - */ - constructor(x:number = 0, y:number = 0, width:number = 0, height:number = 0) - { - this.x = x; - this.y = y; - this.width = width; - this.height = height; - } - - /** - * Returns a new Rectangle object with the same values for the - * x, y, width, and - * height properties as the original Rectangle object. - * - * @return A new Rectangle object with the same values for the - * x, y, width, and - * height properties as the original Rectangle object. - */ - public clone():Rectangle - { - return new Rectangle(this.x, this.y, this.width, this.height); - } - - /** - * Determines whether the specified point is contained within the rectangular - * region defined by this Rectangle object. - * - * @param x The x coordinate(horizontal position) of the point. - * @param y The y coordinate(vertical position) of the point. - * @return A value of true if the Rectangle object contains the - * specified point; otherwise false. - */ - public contains(x:number, y:number):boolean - { - return (this.x <= x && this.x + this.width >= x && this.y <= y && this.y + this.height >= y); - } - - /** - * Determines whether the specified point is contained within the rectangular - * region defined by this Rectangle object. This method is similar to the - * Rectangle.contains() method, except that it takes a Point - * object as a parameter. - * - * @param point The point, as represented by its x and y - * coordinates. - * @return A value of true if the Rectangle object contains the - * specified point; otherwise false. - */ - public containsPoint(point:Point):boolean - { - return (this.x <= point.x && this.x + this.width >= point.x && this.y <= point.y && this.y + this.height >= point.y); - } - - /** - * Determines whether the Rectangle object specified by the rect - * parameter is contained within this Rectangle object. A Rectangle object is - * said to contain another if the second Rectangle object falls entirely - * within the boundaries of the first. - * - * @param rect The Rectangle object being checked. - * @return A value of true if the Rectangle object that you - * specify is contained by this Rectangle object; otherwise - * false. - */ - public containsRect(rect:Rectangle):boolean - { - return (this.x <= rect.x && this.x + this.width >= rect.x + rect.width && this.y <= rect.y && this.y + this.height >= rect.y + rect.height) - } - - /** - * Copies all of rectangle data from the source Rectangle object into the - * calling Rectangle object. - * - * @param sourceRect The Rectangle object from which to copy the data. - */ - public copyFrom(sourceRect:Rectangle) - { - - } - - /** - * Determines whether the object specified in the toCompare - * parameter is equal to this Rectangle object. This method compares the - * x, y, width, and - * height properties of an object against the same properties of - * this Rectangle object. - * - * @param toCompare The rectangle to compare to this Rectangle object. - * @return A value of true if the object has exactly the same - * values for the x, y, width, - * and height properties as this Rectangle object; - * otherwise false. - */ - public equals(toCompare:Rectangle):boolean - { - return (this.x == toCompare.x && this.y == toCompare.y && this.width == toCompare.width && this.height == toCompare.height) - } - - /** - * Increases the size of the Rectangle object by the specified amounts, in - * pixels. The center point of the Rectangle object stays the same, and its - * size increases to the left and right by the dx value, and to - * the top and the bottom by the dy value. - * - * @param dx The value to be added to the left and the right of the Rectangle - * object. The following equation is used to calculate the new - * width and position of the rectangle: - * @param dy The value to be added to the top and the bottom of the - * Rectangle. The following equation is used to calculate the new - * height and position of the rectangle: - */ - public inflate(dx:number, dy:number) - { - this.x -= dx/2; - this.y -= dy/2; - this.width += dx/2; - this.height += dy/2; - } - - /** - * Increases the size of the Rectangle object. This method is similar to the - * Rectangle.inflate() method except it takes a Point object as - * a parameter. - * - *

The following two code examples give the same result:

- * - * @param point The x property of this Point object is used to - * increase the horizontal dimension of the Rectangle object. - * The y property is used to increase the vertical - * dimension of the Rectangle object. - */ - public inflatePoint(point:Point) - { - this.x -= point.x/2; - this.y -= point.y/2; - this.width += point.x/2; - this.height += point.y/2; - } - - /** - * If the Rectangle object specified in the toIntersect - * parameter intersects with this Rectangle object, returns the area of - * intersection as a Rectangle object. If the rectangles do not intersect, - * this method returns an empty Rectangle object with its properties set to - * 0. - * - * @param toIntersect The Rectangle object to compare against to see if it - * intersects with this Rectangle object. - * @return A Rectangle object that equals the area of intersection. If the - * rectangles do not intersect, this method returns an empty - * Rectangle object; that is, a rectangle with its x, - * y, width, and height - * properties set to 0. - */ - public intersection(toIntersect:Rectangle):Rectangle - { - if (this.intersects(toIntersect)) { - var i:Rectangle = new Rectangle(); - - if (this.x > toIntersect.x) { - i.x = this.x; - i.width = toIntersect.x - this.x + toIntersect.width; - - if (i.width > this.width) - i.width = this.width; - } else { - i.x = toIntersect.x; - i.width = this.x - toIntersect.x + this.width; - - if (i.width > toIntersect.width) - i.width = toIntersect.width; - } - - if (this.y > toIntersect.y) { - i.y = this.y; - i.height = toIntersect.y - this.y + toIntersect.height; - - if (i.height > this.height) - i.height = this.height; - } else { - i.y = toIntersect.y; - i.height = this.y - toIntersect.y + this.height; - - if (i.height > toIntersect.height) - i.height = toIntersect.height; - } - - return i; - } - - return new Rectangle(); - } - - /** - * Determines whether the object specified in the toIntersect - * parameter intersects with this Rectangle object. This method checks the - * x, y, width, and - * height properties of the specified Rectangle object to see if - * it intersects with this Rectangle object. - * - * @param toIntersect The Rectangle object to compare against this Rectangle - * object. - * @return A value of true if the specified object intersects - * with this Rectangle object; otherwise false. - */ - public intersects(toIntersect:Rectangle):boolean - { - return (this.x + this.width > toIntersect.x && this.x < toIntersect.x + toIntersect.width && this.y + this.height > toIntersect.y && this.y < toIntersect.y + toIntersect.height); - } - - /** - * Determines whether or not this Rectangle object is empty. - * - * @return A value of true if the Rectangle object's width or - * height is less than or equal to 0; otherwise false. - */ - public isEmpty():boolean - { - return (this.x == 0 && this.y == 0 && this.width == 0 && this.height == 0); - } - - /** - * Adjusts the location of the Rectangle object, as determined by its - * top-left corner, by the specified amounts. - * - * @param dx Moves the x value of the Rectangle object by this amount. - * @param dy Moves the y value of the Rectangle object by this amount. - */ - public offset(dx:number, dy:number) - { - this.x += dx; - this.y += dy; - } - - /** - * Adjusts the location of the Rectangle object using a Point object as a - * parameter. This method is similar to the Rectangle.offset() - * method, except that it takes a Point object as a parameter. - * - * @param point A Point object to use to offset this Rectangle object. - */ - public offsetPoint(point:Point) - { - this.x += point.x; - this.y += point.y; - } - - /** - * Sets all of the Rectangle object's properties to 0. A Rectangle object is - * empty if its width or height is less than or equal to 0. - * - *

This method sets the values of the x, y, - * width, and height properties to 0.

- * - */ - public setEmpty() - { - this.x = 0; - this.y = 0; - this.width = 0; - this.height = 0; - } - - /** - * Sets the members of Rectangle to the specified values - * - * @param xa The x coordinate of the top-left corner of the - * rectangle. - * @param ya The y coordinate of the top-left corner of the - * rectangle. - * @param widtha The width of the rectangle, in pixels. - * @param heighta The height of the rectangle, in pixels. - */ - public setTo(xa:number, ya:number, widtha:number, heighta:number) - { - this.x = xa; - this.y = ya; - this.width = widtha; - this.height = heighta; - } - - /** - * Builds and returns a string that lists the horizontal and vertical - * positions and the width and height of the Rectangle object. - * - * @return A string listing the value of each of the following properties of - * the Rectangle object: x, y, - * width, and height. - */ - public toString():string - { - return "[Rectangle] (x=" + this.x + ", y=" + this.y + ", width=" + this.width + ", height=" + this.height + ")"; - } - - /** - * Adds two rectangles together to create a new Rectangle object, by filling - * in the horizontal and vertical space between the two rectangles. - * - *

Note: The union() method ignores rectangles with - * 0 as the height or width value, such as: var - * rect2:Rectangle = new Rectangle(300,300,50,0);

- * - * @param toUnion A Rectangle object to add to this Rectangle object. - * @return A new Rectangle object that is the union of the two rectangles. - */ - public union(toUnion:Rectangle):Rectangle - { - var u:Rectangle = new Rectangle(); - - if (this.x < toUnion.x) { - u.x = this.x; - u.width = toUnion.x - this.x + toUnion.width; - - if (u.width < this.width) - u.width = this.width; - } else { - u.x = toUnion.x; - u.width = this.x - toUnion.x + this.width; - - if (u.width < toUnion.width) - u.width = toUnion.width; - } - - if (this.y < toUnion.y) { - u.y = this.y; - u.height = toUnion.y - this.y + toUnion.height; - - if (u.height < this.height) - u.height = this.height; - } else { - u.y = toUnion.y; - u.height = this.y - toUnion.y + this.height; - - if (u.height < toUnion.height) - u.height = toUnion.height; - } - - return u; - } - } -} \ No newline at end of file diff --git a/src/away/core/geom/Transform.ts b/src/away/core/geom/Transform.ts deleted file mode 100644 index ddcadddc..00000000 --- a/src/away/core/geom/Transform.ts +++ /dev/null @@ -1,351 +0,0 @@ -/// - -/** - * The Transform class provides access to color adjustment properties and two- - * or three-dimensional transformation objects that can be applied to a - * display object. During the transformation, the color or the orientation and - * position of a display object is adjusted(offset) from the current values - * or coordinates to new values or coordinates. The Transform class also - * collects data about color and two-dimensional matrix transformations that - * are applied to a display object and all of its parent objects. You can - * access these combined transformations through the - * concatenatedColorTransform and concatenatedMatrix - * properties. - * - *

To apply color transformations: create a ColorTransform object, set the - * color adjustments using the object's methods and properties, and then - * assign the colorTransformation property of the - * transform property of the display object to the new - * ColorTransformation object.

- * - *

To apply two-dimensional transformations: create a Matrix object, set - * the matrix's two-dimensional transformation, and then assign the - * transform.matrix property of the display object to the new - * Matrix object.

- * - *

To apply three-dimensional transformations: start with a - * three-dimensional display object. A three-dimensional display object has a - * z property value other than zero. You do not need to create - * the Matrix3D object. For all three-dimensional objects, a Matrix3D object - * is created automatically when you assign a z value to a - * display object. You can access the display object's Matrix3D object through - * the display object's transform property. Using the methods of - * the Matrix3D class, you can add to or modify the existing transformation - * settings. Also, you can create a custom Matrix3D object, set the custom - * Matrix3D object's transformation elements, and then assign the new Matrix3D - * object to the display object using the transform.matrix - * property.

- * - *

To modify a perspective projection of the stage or root object: use the - * transform.matrix property of the root display object to gain - * access to the PerspectiveProjection object. Or, apply different perspective - * projection properties to a display object by setting the perspective - * projection properties of the display object's parent. The child display - * object inherits the new properties. Specifically, create a - * PerspectiveProjection object and set its properties, then assign the - * PerspectiveProjection object to the perspectiveProjection - * property of the parent display object's transform property. - * The specified projection transformation then applies to all the display - * object's three-dimensional children.

- * - *

Since both PerspectiveProjection and Matrix3D objects perform - * perspective transformations, do not assign both to a display object at the - * same time. Use the PerspectiveProjection object for focal length and - * projection center changes. For more control over the perspective - * transformation, create a perspective projection Matrix3D object.

- */ -module away.geom -{ - export class Transform - { - private _displayObject:away.base.DisplayObject; - private _concatenatedColorTransform:ColorTransform; - private _concatenatedMatrix:Matrix; - private _pixelBounds:Rectangle; - public _position:away.geom.Vector3D = new away.geom.Vector3D(); - - /** - * - */ - public get backVector():away.geom.Vector3D - { - var director:away.geom.Vector3D = away.geom.Matrix3DUtils.getForward(this._displayObject._iMatrix3D); - director.negate(); - - return director; - } - - /** - * A ColorTransform object containing values that universally adjust the - * colors in the display object. - * - * @throws TypeError The colorTransform is null when being set - */ - public colorTransform:ColorTransform; - - /** - * A ColorTransform object representing the combined color transformations - * applied to the display object and all of its parent objects, back to the - * root level. If different color transformations have been applied at - * different levels, all of those transformations are concatenated into one - * ColorTransform object for this property. - */ - public get concatenatedColorTransform():ColorTransform - { - return this._concatenatedColorTransform; //TODO - } - - /** - * A Matrix object representing the combined transformation matrixes of the - * display object and all of its parent objects, back to the root level. If - * different transformation matrixes have been applied at different levels, - * all of those matrixes are concatenated into one matrix for this property. - * Also, for resizeable SWF content running in the browser, this property - * factors in the difference between stage coordinates and window coordinates - * due to window resizing. Thus, the property converts local coordinates to - * window coordinates, which may not be the same coordinate space as that of - * the Stage. - */ - public get concatenatedMatrix():Matrix - { - return this._concatenatedMatrix; //TODO - } - - /** - * - */ - public get downVector():away.geom.Vector3D - { - var director:away.geom.Vector3D = away.geom.Matrix3DUtils.getUp(this._displayObject._iMatrix3D); - director.negate(); - - return director; - } - - /** - * - */ - public get forwardVector():away.geom.Vector3D - { - return away.geom.Matrix3DUtils.getForward(this._displayObject._iMatrix3D); - } - - /** - * - */ - public get leftVector():away.geom.Vector3D - { - var director:away.geom.Vector3D = away.geom.Matrix3DUtils.getRight(this._displayObject._iMatrix3D); - director.negate(); - - return director; - } - - /** - * A Matrix object containing values that alter the scaling, rotation, and - * translation of the display object. - * - *

If the matrix property is set to a value(not - * null), the matrix3D property is - * null. And if the matrix3D property is set to a - * value(not null), the matrix property is - * null.

- * - * @throws TypeError The matrix is null when being set - */ - public matrix:Matrix; - - /** - * Provides access to the Matrix3D object of a three-dimensional display - * object. The Matrix3D object represents a transformation matrix that - * determines the display object's position and orientation. A Matrix3D - * object can also perform perspective projection. - * - *

If the matrix property is set to a value(not - * null), the matrix3D property is - * null. And if the matrix3D property is set to a - * value(not null), the matrix property is - * null.

- */ - public get matrix3D():away.geom.Matrix3D - { - return this._displayObject._iMatrix3D; - } - - public set matrix3D(val:away.geom.Matrix3D) - { - this._displayObject._iMatrix3D = val; - } - - /** - * Provides access to the PerspectiveProjection object of a three-dimensional - * display object. The PerspectiveProjection object can be used to modify the - * perspective transformation of the stage or to assign a perspective - * transformation to all the three-dimensional children of a display object. - * - *

Based on the field of view and aspect ratio(dimensions) of the stage, - * a default PerspectiveProjection object is assigned to the root object.

- */ - public perspectiveProjection:PerspectiveProjection; - - /** - * A Rectangle object that defines the bounding rectangle of the display - * object on the stage. - */ - public get pixelBounds():Rectangle - { - return this._pixelBounds; - } - - /** - * Defines the position of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - public get position():away.geom.Vector3D - { - return this._displayObject._iMatrix3D.position - } - - public set position(value:away.geom.Vector3D) - { - this._displayObject.x = value.x; - this._displayObject.y = value.y; - this._displayObject.z = value.z; - } - - /** - * - */ - public get rightVector():away.geom.Vector3D - { - return away.geom.Matrix3DUtils.getRight(this._displayObject._iMatrix3D); - } - - /** - * Defines the rotation of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - public get rotation():away.geom.Vector3D - { - return new Vector3D(this._displayObject.rotationX, this._displayObject.rotationY, this._displayObject.rotationZ); - } - - public set rotation(value:away.geom.Vector3D) - { - this._displayObject.rotationX = value.x; - this._displayObject.rotationY = value.y; - this._displayObject.rotationZ = value.z; - } - - /** - * Defines the scale of the 3d object, relative to the local coordinates of the parent ObjectContainer3D. - */ - public get scale():away.geom.Vector3D - { - return new Vector3D(this._displayObject.scaleX, this._displayObject.scaleY, this._displayObject.scaleZ); - } - - public set scale(value:away.geom.Vector3D) - { - this._displayObject.scaleX = value.x; - this._displayObject.scaleY = value.y; - this._displayObject.scaleZ = value.z; - } - - /** - * - */ - public get upVector():away.geom.Vector3D - { - return away.geom.Matrix3DUtils.getUp(this._displayObject._iMatrix3D); - } - - constructor(displayObject:away.base.DisplayObject) - { - this._displayObject = displayObject; - } - - /** - * Returns a Matrix3D object, which can transform the space of a specified - * display object in relation to the current display object's space. You can - * use the getRelativeMatrix3D() method to move one - * three-dimensional display object relative to another three-dimensional - * display object. - * - * @param relativeTo The display object relative to which the transformation - * occurs. To get a Matrix3D object relative to the stage, - * set the parameter to the root or - * stage object. To get the world-relative - * matrix of the display object, set the parameter to a - * display object that has a perspective transformation - * applied to it. - * @return A Matrix3D object that can be used to transform the space from the - * relativeTo display object to the current display - * object space. - */ - public getRelativeMatrix3D(relativeTo:away.base.DisplayObject):Matrix3D - { - return new Matrix3D(); //TODO - } - - - /** - * Moves the 3d object forwards along it's local z axis - * - * @param distance The length of the movement - */ - public moveForward(distance:number) - { - this._displayObject.translateLocal(away.geom.Vector3D.Z_AXIS, distance); - } - - /** - * Moves the 3d object backwards along it's local z axis - * - * @param distance The length of the movement - */ - public moveBackward(distance:number) - { - this._displayObject.translateLocal(away.geom.Vector3D.Z_AXIS, -distance); - } - - /** - * Moves the 3d object backwards along it's local x axis - * - * @param distance The length of the movement - */ - - public moveLeft(distance:number) - { - this._displayObject.translateLocal(away.geom.Vector3D.X_AXIS, -distance); - } - - /** - * Moves the 3d object forwards along it's local x axis - * - * @param distance The length of the movement - */ - public moveRight(distance:number) - { - this._displayObject.translateLocal(away.geom.Vector3D.X_AXIS, distance); - } - - /** - * Moves the 3d object forwards along it's local y axis - * - * @param distance The length of the movement - */ - public moveUp(distance:number) - { - this._displayObject.translateLocal(away.geom.Vector3D.Y_AXIS, distance); - } - - /** - * Moves the 3d object backwards along it's local y axis - * - * @param distance The length of the movement - */ - public moveDown(distance:number) - { - this._displayObject.translateLocal(away.geom.Vector3D.Y_AXIS, -distance); - } - } -} diff --git a/src/away/core/geom/UVTransform.ts b/src/away/core/geom/UVTransform.ts deleted file mode 100644 index 5e1d43d1..00000000 --- a/src/away/core/geom/UVTransform.ts +++ /dev/null @@ -1,139 +0,0 @@ -/// - -module away.geom -{ - export class UVTransform - { - private _uvMatrix:away.geom.Matrix = new away.geom.Matrix(); - private _uvMatrixDirty:boolean; - - private _rotation:number = 0; - private _scaleU:number = 1; - private _scaleV:number = 1; - private _offsetU:number = 0; - private _offsetV:number = 0; - - /** - * - */ - public get offsetU():number - { - return this._offsetU; - } - - public set offsetU(value:number) - { - if (value == this._offsetU) - return; - - this._offsetU = value; - this._uvMatrixDirty = true; - } - - /** - * - */ - public get offsetV():number - { - return this._offsetV; - } - - public set offsetV(value:number) - { - if (value == this._offsetV) - return; - - this._offsetV = value; - this._uvMatrixDirty = true; - - } - - /** - * - */ - public get rotation():number - { - return this._rotation; - } - - public set rotation(value:number) - { - if (value == this._rotation) - return; - - this._rotation = value; - - this._uvMatrixDirty = true; - } - - /** - * - */ - public get scaleU():number - { - return this._scaleU; - } - - public set scaleU(value:number) - { - if (value == this._scaleU) - return; - - this._scaleU = value; - - this._uvMatrixDirty = true; - } - - /** - * - */ - public get scaleV():number - { - return this._scaleV; - } - - public set scaleV(value:number) - { - if (value == this._scaleV) - return; - - this._scaleV = value; - - this._uvMatrixDirty = true; - } - - /** - * - */ - public get matrix():away.geom.Matrix - { - if (this._uvMatrixDirty) - this.updateUVMatrix(); - - return this._uvMatrix; - } - - constructor() - { - } - - - /** - * @private - */ - private updateUVMatrix() - { - this._uvMatrix.identity(); - - if (this._rotation != 0) - this._uvMatrix.rotate(this._rotation); - - if (this._scaleU != 1 || this._scaleV != 1) - this._uvMatrix.scale(this._scaleU, this._scaleV); - - this._uvMatrix.translate(this._offsetU, this._offsetV); - - this._uvMatrixDirty = false; - } - } -} diff --git a/src/away/core/geom/Vector3D.ts b/src/away/core/geom/Vector3D.ts deleted file mode 100644 index 122f23c9..00000000 --- a/src/away/core/geom/Vector3D.ts +++ /dev/null @@ -1,487 +0,0 @@ -/// - -/** - * The Vector3D class represents a point or a location in the three-dimensional - * space using the Cartesian coordinates x, y, and z. As in a two-dimensional - * space, the x property represents the horizontal axis and the y property - * represents the vertical axis. In three-dimensional space, the z property - * represents depth. The value of the x property increases as the object moves - * to the right. The value of the y property increases as the object moves - * down. The z property increases as the object moves farther from the point - * of view. Using perspective projection and scaling, the object is seen to be - * bigger when near and smaller when farther away from the screen. As in a - * right-handed three-dimensional coordinate system, the positive z-axis points - * away from the viewer and the value of the z property increases as the object - * moves away from the viewer's eye. The origin point (0,0,0) of the global - * space is the upper-left corner of the stage. - * - *

The Vector3D class can also represent a direction, an arrow pointing from - * the origin of the coordinates, such as (0,0,0), to an endpoint; or a - * floating-point component of an RGB (Red, Green, Blue) color model.

- * - *

Quaternion notation introduces a fourth element, the w property, which - * provides additional orientation information. For example, the w property can - * define an angle of rotation of a Vector3D object. The combination of the - * angle of rotation and the coordinates x, y, and z can determine the display - * object's orientation. Here is a representation of Vector3D elements in - * matrix notation:

- */ -module away.geom -{ - - export class Vector3D - { - /** - * The x axis defined as a Vector3D object with coordinates (1,0,0). - */ - public static X_AXIS:Vector3D = new Vector3D(1, 0, 0); - - /** - * The y axis defined as a Vector3D object with coordinates (0,1,0). - */ - public static Y_AXIS:Vector3D = new Vector3D(0, 1, 0); - - /** - * The z axis defined as a Vector3D object with coordinates (0,0,1). - */ - public static Z_AXIS:Vector3D = new Vector3D(0, 0, 1); - - /** - * The first element of a Vector3D object, such as the x coordinate of - * a point in the three-dimensional space. The default value is 0. - */ - public x:number; - - /* - *The second element of a Vector3D object, such as the y coordinate of - * a point in the three-dimensional space. The default value is 0. - */ - public y:number; - - /** - * The third element of a Vector3D object, such as the y coordinate of - * a point in the three-dimensional space. The default value is 0. - */ - public z:number; - - /** - * TThe fourth element of a Vector3D object (in addition to the x, y, - * and z properties) can hold data such as the angle of rotation. The - * default value is 0. - * - *

Quaternion notation employs an angle as the fourth element in - * its calculation of three-dimensional rotation. The w property can - * be used to define the angle of rotation about the Vector3D object. - * The combination of the rotation angle and the coordinates (x,y,z) - * determines the display object's orientation.

- * - *

In addition, the w property can be used as a perspective warp - * factor for a projected three-dimensional position or as a projection - * transform value in representing a three-dimensional coordinate - * projected into the two-dimensional space. For example, you can - * create a projection matrix using the Matrix3D.rawData - * property, that, when applied to a Vector3D object, produces a - * transform value in the Vector3D object's fourth element (the w - * property). Dividing the Vector3D object's other elements by the - * transform value then produces a projected Vector3D object. You can - * use the Vector3D.project() method to divide the first - * three elements of a Vector3D object by its fourth element.

- */ - public w:number; - - /** - * The length, magnitude, of the current Vector3D object from the - * origin (0,0,0) to the object's x, y, and z coordinates. The w - * property is ignored. A unit vector has a length or magnitude of - * one. - */ - public get length():number - { - return Math.sqrt(this.lengthSquared); - } - - /** - * The square of the length of the current Vector3D object, calculated - * using the x, y, and z properties. The w property is ignored. Use the - * lengthSquared() method whenever possible instead of the - * slower Math.sqrt() method call of the - * Vector3D.length() method. - */ - public get lengthSquared():number - { - return this.x*this.x + this.y*this.y + this.z*this.z; - } - - /** - * Creates an instance of a Vector3D object. If you do not specify a - * parameter for the constructor, a Vector3D object is created with - * the elements (0,0,0,0). - * - * @param x The first element, such as the x coordinate. - * @param y The second element, such as the y coordinate. - * @param z The third element, such as the z coordinate. - * @param w An optional element for additional data such as the angle - * of rotation. - */ - constructor(x:number = 0, y:number = 0, z:number = 0, w:number = 0) - { - this.x = x; - this.y = y; - this.z = z; - this.w = w; - } - - /** - * Adds the value of the x, y, and z elements of the current Vector3D - * object to the values of the x, y, and z elements of another Vector3D - * object. The add() method does not change the current - * Vector3D object. Instead, it returns a new Vector3D object with - * the new values. - * - *

The result of adding two vectors together is a resultant vector. - * One way to visualize the result is by drawing a vector from the - * origin or tail of the first vector to the end or head of the second - * vector. The resultant vector is the distance between the origin - * point of the first vector and the end point of the second vector. - *

- */ - public add(a:Vector3D):Vector3D - { - return new Vector3D(this.x + a.x, this.y + a.y, this.z + a.z, this.w + a.w) - } - - /** - * Returns the angle in radians between two vectors. The returned angle - * is the smallest radian the first Vector3D object rotates until it - * aligns with the second Vector3D object. - * - *

The angleBetween() method is a static method. You - * can use it directly as a method of the Vector3D class.

- * - *

To convert a degree to a radian, you can use the following - * formula:

- * - *

radian = Math.PI/180 * degree

- * - * @param a The first Vector3D object. - * @param b The second Vector3D object. - * @returns The angle between two Vector3D objects. - */ - public static angleBetween(a:Vector3D, b:Vector3D):number - { - return Math.acos(a.dotProduct(b)/(a.length*b.length)); - } - - /** - * Returns a new Vector3D object that is an exact copy of the current - * Vector3D object. - * - * @returns A new Vector3D object that is a copy of the current - * Vector3D object. - */ - public clone():Vector3D - { - return new Vector3D(this.x, this.y, this.z, this.w); - } - - /** - * Copies all of vector data from the source Vector3D object into the - * calling Vector3D object. - * - * @param src The Vector3D object from which to copy the data. - */ - public copyFrom(src:Vector3D):void - { - this.x = src.x; - this.y = src.y; - this.z = src.z; - this.w = src.w; - } - - /** - * Returns a new Vector3D object that is perpendicular (at a right - * angle) to the current Vector3D and another Vector3D object. If the - * returned Vector3D object's coordinates are (0,0,0), then the two - * Vector3D objects are parallel to each other. - * - *

You can use the normalized cross product of two vertices of a - * polygon surface with the normalized vector of the camera or eye - * viewpoint to get a dot product. The value of the dot product can - * identify whether a surface of a three-dimensional object is hidden - * from the viewpoint.

- * - * @param a A second Vector3D object. - * @returns A new Vector3D object that is perpendicular to the current - * Vector3D object and the Vector3D object specified as the - * parameter. - */ - public crossProduct(a:Vector3D):Vector3D - { - return new 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); - } - - /** - * Decrements the value of the x, y, and z elements of the current - * Vector3D object by the values of the x, y, and z elements of - * specified Vector3D object. Unlike the - * Vector3D.subtract() method, the - * decrementBy() method changes the current Vector3D - * object and does not return a new Vector3D object. - * - * @param a The Vector3D object containing the values to subtract from - * the current Vector3D object. - */ - public decrementBy(a:Vector3D) - { - this.x -= a.x; - this.y -= a.y; - this.z -= a.z; - } - - /** - * Returns the distance between two Vector3D objects. The - * distance() method is a static method. You can use it - * directly as a method of the Vector3D class to get the Euclidean - * distance between two three-dimensional points. - * - * @param pt1 A Vector3D object as the first three-dimensional point. - * @param pt2 A Vector3D object as the second three-dimensional point. - * @returns The distance between two Vector3D objects. - */ - static distance(pt1:Vector3D, pt2:Vector3D):number - { - var x:number = (pt1.x - pt2.x); - var y:number = (pt1.y - pt2.y); - var z:number = (pt1.z - pt2.z); - return Math.sqrt(x*x + y*y + z*z); - } - - /** - * If the current Vector3D object and the one specified as the - * parameter are unit vertices, this method returns the cosine of the - * angle between the two vertices. Unit vertices are vertices that - * point to the same direction but their length is one. They remove the - * length of the vector as a factor in the result. You can use the - * normalize() method to convert a vector to a unit - * vector. - * - *

The dotProduct() method finds the angle between two - * vertices. It is also used in backface culling or lighting - * calculations. Backface culling is a procedure for determining which - * surfaces are hidden from the viewpoint. You can use the normalized - * vertices from the camera, or eye, viewpoint and the cross product of - * the vertices of a polygon surface to get the dot product. If the dot - * product is less than zero, then the surface is facing the camera or - * the viewer. If the two unit vertices are perpendicular to each - * other, they are orthogonal and the dot product is zero. If the two - * vertices are parallel to each other, the dot product is one.

- * - * @param a The second Vector3D object. - * @returns A scalar which is the dot product of the current Vector3D - * object and the specified Vector3D object. - * - * @see away.geom.Vector3D#crossProduct() - * @see away.geom.Vector3D#normalize() - */ - public dotProduct(a:Vector3D):number - { - return this.x*a.x + this.y*a.y + this.z*a.z; - } - - /** - * Determines whether two Vector3D objects are equal by comparing the - * x, y, and z elements of the current Vector3D object with a - * specified Vector3D object. If the values of these elements are the - * same, the two Vector3D objects are equal. If the second optional - * parameter is set to true, all four elements of the Vector3D objects, - * including the w property, are compared. - */ - - /** - * - * @param toCompare The Vector3D object to be compared with the current - * Vector3D object. - * @param allFour An optional parameter that specifies whether the w - * property of the Vector3D objects is used in the - * comparison. - * @returns A value of true if the specified Vector3D object is equal - * to the current Vector3D object; false if it is not equal. - */ - public equals(toCompare:Vector3D, allFour:boolean = false):boolean - { - return (this.x == toCompare.x && this.y == toCompare.y && this.z == toCompare.z && (!allFour || this.w == toCompare.w )); - } - - /** - * Increments the value of the x, y, and z elements of the current - * Vector3D object by the values of the x, y, and z elements of a - * specified Vector3D object. Unlike the Vector3D.add() - * method, the incrementBy() method changes the current - * Vector3D object and does not return a new Vector3D object. - * - * @param a The Vector3D object to be added to the current Vector3D - * object. - */ - public incrementBy(a:Vector3D) - { - this.x += a.x; - this.y += a.y; - this.z += a.z; - } - - /** - * Compares the elements of the current Vector3D object with the - * elements of a specified Vector3D object to determine whether they - * are nearly equal. The two Vector3D objects are nearly equal if the - * value of all the elements of the two vertices are equal, or the - * result of the comparison is within the tolerance range. The - * difference between two elements must be less than the number - * specified as the tolerance parameter. If the third optional - * parameter is set to true, all four elements of the - * Vector3D objects, including the w property, are - * compared. Otherwise, only the x, y, and z elements are included in - * the comparison. - */ - - /** - * - * @param toCompare The Vector3D object to be compared with the current - * Vector3D object. - * @param tolerance A number determining the tolerance factor. If the - * difference between the values of the Vector3D - * element specified in the toCompare parameter and - * the current Vector3D element is less than the - * tolerance number, the two values are considered - * nearly equal. - * @param allFour An optional parameter that specifies whether the w - * property of the Vector3D objects is used in the - * comparison. - * @returns A value of true if the specified Vector3D object is nearly - * equal to the current Vector3D object; false if it is not - * equal. - * - * @see away.geom.Vector3D#equals() - */ - public nearEquals(toCompare:Vector3D, tolerance:number, allFour:boolean = true):boolean - { - 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)); - } - - /** - * Sets the current Vector3D object to its inverse. The inverse object - * is also considered the opposite of the original object. The value of - * the x, y, and z properties of the current Vector3D object is changed - * to -x, -y, and -z. - */ - public negate():void - { - this.x = -this.x; - this.y = -this.y; - this.z = -this.z; - } - - /** - * Converts a Vector3D object to a unit vector by dividing the first - * three elements (x, y, z) by the length of the vector. Unit vertices - * are vertices that have a direction but their length is one. They - * simplify vector calculations by removing length as a factor. - */ - /** - * Scales the line segment between(0,0) and the current point to a set - * length. - * - * @param thickness The scaling value. For example, if the current - * Vector3D object is (0,3,4), and you normalize it to - * 1, the point returned is at(0,0.6,0.8). - */ - public normalize(thickness:number = 1) - { - if (this.length != 0) { - var invLength = thickness/this.length; - this.x *= invLength; - this.y *= invLength; - this.z *= invLength; - return; - } - } - - /** - * Divides the value of the x, y, and - * z properties of the current Vector3D object by the - * value of its w property. - * - *

If the current Vector3D object is the result of multiplying a - * Vector3D object by a projection Matrix3D object, the w property can - * hold the transform value. The project() method then can - * complete the projection by dividing the elements by the - * w property. Use the Matrix3D.rawData - * property to create a projection Matrix3D object.

- */ - public project():void - { - this.x /= this.w; - this.y /= this.w; - this.z /= this.w; - } - - /** - * Scales the current Vector3D object by a scalar, a magnitude. The - * Vector3D object's x, y, and z elements are multiplied by the scalar - * number specified in the parameter. For example, if the vector is - * scaled by ten, the result is a vector that is ten times longer. The - * scalar can also change the direction of the vector. Multiplying the - * vector by a negative number reverses its direction. - * - * @param s A multiplier (scalar) used to scale a Vector3D object. - - */ - public scaleBy(s:number):void - { - this.x *= s; - this.y *= s; - this.z *= s; - } - - /** - * Sets the members of Vector3D to the specified values - * - * @param xa The first element, such as the x coordinate. - * @param ya The second element, such as the y coordinate. - * @param za The third element, such as the z coordinate. - */ - public setTo(xa:number, ya:number, za:number):void - { - this.x = xa; - this.y = ya; - this.z = za; - } - - /** - * Subtracts the value of the x, y, and z elements of the current - * Vector3D object from the values of the x, y, and z elements of - * another Vector3D object. The subtract() method does not - * change the current Vector3D object. Instead, this method returns a - * new Vector3D object with the new values. - * - * @param a The Vector3D object to be subtracted from the current - * Vector3D object. - * @returns A new Vector3D object that is the difference between the - * current Vector3D and the specified Vector3D object. - * - * @see away.geom.Vector3D#decrementBy() - */ - public subtract(a:Vector3D):Vector3D - { - return new Vector3D(this.x - a.x, this.y - a.y, this.z - a.z); - } - - /** - * Returns a string representation of the current Vector3D object. The - * string contains the values of the x, y, and z properties. - */ - public toString():string - { - return "[Vector3D] (x:" + this.x + " ,y:" + this.y + ", z" + this.z + ", w:" + this.w + ")"; - } - } -} \ No newline at end of file diff --git a/src/away/core/library/AssetLibrary.ts b/src/away/core/library/AssetLibrary.ts deleted file mode 100644 index 6300f118..00000000 --- a/src/away/core/library/AssetLibrary.ts +++ /dev/null @@ -1,227 +0,0 @@ -/// - -module away.library -{ - import URLRequest = away.net.URLRequest; - - /** - * AssetLibrary enforces a singleton pattern and is not intended to be instanced. - * It's purpose is to allow access to the default library bundle through a set of static shortcut methods. - * If you are interested in creating multiple library bundles, please use the getBundle() method. - */ - export class AssetLibrary - { - public static _iInstances:Object = {}; - - /** - * Creates a new AssetLibrary object. - * - * @param se A singleton enforcer for the AssetLibrary ensuring it cannnot be instanced. - */ - //* - constructor(se:AssetLibrarySingletonEnforcer) - { - se = se; - } - - //*/ - /** - * Returns an AssetLibrary bundle instance. If no key is given, returns the default bundle (which is - * similar to using the AssetLibraryBundle as a singleton). To keep several separated library bundles, - * pass a string key to this method to define which bundle should be returned. This is - * referred to as using the AssetLibraryBundle as a multiton. - * - * @param key Defines which multiton instance should be returned. - * @return An instance of the asset library - */ - public static getBundle(key:string = 'default'):AssetLibraryBundle - { - return AssetLibraryBundle.getInstance(key); - } - - /** - * - */ - public static enableParser(parserClass) - { - AssetLoader.enableParser(parserClass); - } - - /** - * - */ - public static enableParsers(parserClasses:Object[]) - { - AssetLoader.enableParsers(parserClasses); - } - - /** - * Short-hand for conflictStrategy property on default asset library bundle. - * - * @see AssetLibraryBundle.conflictStrategy - */ - public static get conflictStrategy():ConflictStrategyBase - { - return AssetLibrary.getBundle().conflictStrategy; - } - - public static set conflictStrategy(val:ConflictStrategyBase) - { - AssetLibrary.getBundle().conflictStrategy = val; - } - - /** - * Short-hand for conflictPrecedence property on default asset library bundle. - * - * @see AssetLibraryBundle.conflictPrecedence - */ - public static get conflictPrecedence():string - { - return AssetLibrary.getBundle().conflictPrecedence; - } - - public static set conflictPrecedence(val:string) - { - AssetLibrary.getBundle().conflictPrecedence = val; - } - - /** - * Short-hand for createIterator() method on default asset library bundle. - * - * @see AssetLibraryBundle.createIterator() - */ - public static createIterator(assetTypeFilter:string = null, namespaceFilter:string = null, filterFunc = null):AssetLibraryIterator - { - return AssetLibrary.getBundle().createIterator(assetTypeFilter, namespaceFilter, filterFunc); - } - - /** - * Short-hand for load() method on default asset library bundle. - * - * @see AssetLibraryBundle.load() - */ - public static load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:away.parsers.ParserBase = null):AssetLoaderToken - { - return AssetLibrary.getBundle().load(req, context, ns, parser); - } - - /** - * Short-hand for loadData() method on default asset library bundle. - * - * @see AssetLibraryBundle.loadData() - */ - public static loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:away.parsers.ParserBase = null):AssetLoaderToken - { - return AssetLibrary.getBundle().loadData(data, context, ns, parser); - } - - public static stopLoad() - { - AssetLibrary.getBundle().stopAllLoadingSessions(); - } - - /** - * Short-hand for getAsset() method on default asset library bundle. - * - * @see AssetLibraryBundle.getAsset() - */ - public static getAsset(name:string, ns:string = null):IAsset - { - return AssetLibrary.getBundle().getAsset(name, ns); - } - - /** - * Short-hand for addEventListener() method on default asset library bundle. - */ - public static addEventListener(type:string, listener:Function) - { - AssetLibrary.getBundle().addEventListener(type, listener); - } - - /** - * Short-hand for removeEventListener() method on default asset library bundle. - */ - public static removeEventListener(type:string, listener:Function) - { - AssetLibrary.getBundle().removeEventListener(type, listener); - } - - /** - * Short-hand for hasEventListener() method on default asset library bundle. - - public static hasEventListener(type:string):boolean - { - return AssetLibrary.getBundle().hasEventListener(type); - } - - public static willTrigger(type:string):boolean - { - return getBundle().willTrigger(type); - } - */ - - /** - * Short-hand for addAsset() method on default asset library bundle. - * - * @see AssetLibraryBundle.addAsset() - */ - public static addAsset(asset:IAsset) - { - AssetLibrary.getBundle().addAsset(asset); - } - - /** - * Short-hand for removeAsset() method on default asset library bundle. - * - * @param asset The asset which should be removed from the library. - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAsset() - */ - public static removeAsset(asset:IAsset, dispose:boolean = true) - { - AssetLibrary.getBundle().removeAsset(asset, dispose); - } - - /** - * Short-hand for removeAssetByName() method on default asset library bundle. - * - * @param name The name of the asset to be removed. - * @param ns The namespace to which the desired asset belongs. - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAssetByName() - */ - public static removeAssetByName(name:string, ns:string = null, dispose:boolean = true):IAsset - { - return AssetLibrary.getBundle().removeAssetByName(name, ns, dispose); - } - - /** - * Short-hand for removeAllAssets() method on default asset library bundle. - * - * @param dispose Defines whether the assets should also be disposed. - * - * @see AssetLibraryBundle.removeAllAssets() - */ - public static removeAllAssets(dispose:boolean = true) - { - AssetLibrary.getBundle().removeAllAssets(dispose); - } - - /** - * Short-hand for removeNamespaceAssets() method on default asset library bundle. - * - * @see AssetLibraryBundle.removeNamespaceAssets() - */ - public static removeNamespaceAssets(ns:string = null, dispose:boolean = true) - { - AssetLibrary.getBundle().removeNamespaceAssets(ns, dispose); - } - } -} - -// singleton enforcer -class AssetLibrarySingletonEnforcer -{ -} diff --git a/src/away/core/library/AssetLibraryBundle.ts b/src/away/core/library/AssetLibraryBundle.ts deleted file mode 100644 index fbd77eef..00000000 --- a/src/away/core/library/AssetLibraryBundle.ts +++ /dev/null @@ -1,596 +0,0 @@ -/// - -module away.library -{ - import URLRequest = away.net.URLRequest; - - /** - * AssetLibraryBundle enforces a multiton pattern and is not intended to be instanced directly. - * Its purpose is to create a container for 3D data management, both before and after parsing. - * If you are interested in creating multiple library bundles, please use the getInstance() method. - */ - export class AssetLibraryBundle extends away.events.EventDispatcher - { - private _loadingSessions:Array; - private _strategy:ConflictStrategyBase; - private _strategyPreference:string; - private _assets:Array; - private _assetDictionary:Object; - private _assetDictDirty:boolean; - private _loadingSessionsGarbage:Array = new Array(); - private _gcTimeoutIID:number; - - private _onAssetRenameDelegate:Function; - private _onAssetConflictResolvedDelegate:Function; - private _onResourceCompleteDelegate:Function; - private _onTextureSizeErrorDelegate:Function; - private _onAssetCompleteDelegate:Function; - private _onLoadErrorDelegate:Function; - private _onParseErrorDelegate:Function; - - /** - * Creates a new AssetLibraryBundle object. - * - * @param me A multiton enforcer for the AssetLibraryBundle ensuring it cannnot be instanced. - */ - constructor(me:AssetLibraryBundleSingletonEnforcer) - { - super(); - - this._assets = new Array();//new Vector.; - this._assetDictionary = new Object(); - this._loadingSessions = new Array(); - - this.conflictStrategy = ConflictStrategy.IGNORE.create(); - this.conflictPrecedence = ConflictPrecedence.FAVOR_NEW; - - this._onAssetRenameDelegate = away.utils.Delegate.create(this, this.onAssetRename); - this._onAssetConflictResolvedDelegate = away.utils.Delegate.create(this, this.onAssetConflictResolved); - this._onResourceCompleteDelegate = away.utils.Delegate.create(this, this.onResourceComplete); - this._onTextureSizeErrorDelegate = away.utils.Delegate.create(this, this.onTextureSizeError); - this._onAssetCompleteDelegate = away.utils.Delegate.create(this, this.onAssetComplete); - this._onLoadErrorDelegate = away.utils.Delegate.create(this, this.onLoadError); - this._onParseErrorDelegate = away.utils.Delegate.create(this, this.onParseError); - } - - /** - * Returns an AssetLibraryBundle instance. If no key is given, returns the default bundle instance (which is - * similar to using the AssetLibraryBundle as a singleton.) To keep several separated library bundles, - * pass a string key to this method to define which bundle should be returned. This is - * referred to as using the AssetLibrary as a multiton. - * - * @param key Defines which multiton instance should be returned. - * @return An instance of the asset library - */ - public static getInstance(key:string = 'default'):AssetLibraryBundle - { - if (!key) - key = 'default'; - - if (!AssetLibrary._iInstances.hasOwnProperty(key)) - AssetLibrary._iInstances[key] = new AssetLibraryBundle(new AssetLibraryBundleSingletonEnforcer()); - - return AssetLibrary._iInstances[key]; - - } - - /** - * - */ - public enableParser(parserClass:Object) - { - AssetLoader.enableParser(parserClass); - } - - /** - * - */ - public enableParsers(parserClasses:Object[]) - { - AssetLoader.enableParsers(parserClasses); - } - - /** - * Defines which strategy should be used for resolving naming conflicts, when two library - * assets are given the same name. By default, ConflictStrategy.APPEND_NUM_SUFFIX - * is used which means that a numeric suffix is appended to one of the assets. The - * conflictPrecedence property defines which of the two conflicting assets will - * be renamed. - * - * @see naming.ConflictStrategy - * @see AssetLibrary.conflictPrecedence - */ - public get conflictStrategy():ConflictStrategyBase - { - return this._strategy; - } - - public set conflictStrategy(val:ConflictStrategyBase) - { - - if (!val) - throw new away.errors.Error('namingStrategy must not be null. To ignore naming, use AssetLibrary.IGNORE'); - - this._strategy = val.create(); - - } - - /** - * Defines which asset should have precedence when resolving a naming conflict between - * two assets of which one has just been renamed by the user or by a parser. By default - * ConflictPrecedence.FAVOR_NEW is used, meaning that the newly renamed - * asset will keep it's new name while the older asset gets renamed to not conflict. - * - * This property is ignored for conflict strategies that do not actually rename an - * asset automatically, such as ConflictStrategy.IGNORE and ConflictStrategy.THROW_ERROR. - * - * @see away.library.ConflictPrecedence - * @see away.library.ConflictStrategy - */ - public get conflictPrecedence():string - { - return this._strategyPreference; - } - - public set conflictPrecedence(val:string) - { - this._strategyPreference = val; - } - - /** - * Create an AssetLibraryIterator instance that can be used to iterate over the assets - * in this asset library instance. The iterator can filter assets on asset type and/or - * namespace. A "null" filter value means no filter of that type is used. - * - * @param assetTypeFilter Asset type to filter on (from the AssetType enum class.) Use - * null to not filter on asset type. - * @param namespaceFilter Namespace to filter on. Use null to not filter on namespace. - * @param filterFunc Callback function to use when deciding whether an asset should be - * included in the iteration or not. This needs to be a function that takes a single - * parameter of type IAsset and returns a boolean where true means it should be included. - * - * @see away.library.AssetType - */ - public createIterator(assetTypeFilter:string = null, namespaceFilter:string = null, filterFunc = null):AssetLibraryIterator - { - return new AssetLibraryIterator(this._assets, assetTypeFilter, namespaceFilter, filterFunc); - } - - /** - * Loads a file and (optionally) all of its dependencies. - * - * @param req The URLRequest object containing the URL of the file to be loaded. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - * @return A handle to the retrieved resource. - */ - public load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:away.parsers.ParserBase = null):AssetLoaderToken - { - var loader:AssetLoader = new AssetLoader(); - - if (!this._loadingSessions) - this._loadingSessions = new Array(); - - this._loadingSessions.push(loader); - - loader.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - loader.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - loader.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - // Error are handled separately (see documentation for addErrorHandler) - loader._iAddErrorHandler(this._onLoadErrorDelegate); - loader._iAddParseErrorHandler(this._onParseErrorDelegate); - - return loader.load(req, context, ns, parser); - } - - /** - * Loads a resource from existing data in memory. - * - * @param data The data object containing all resource information. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - * @return A handle to the retrieved resource. - */ - public loadData(data:any, context:AssetLoaderContext = null, ns:string = null, parser:away.parsers.ParserBase = null):AssetLoaderToken - { - var loader:AssetLoader = new AssetLoader(); - - if (!this._loadingSessions) - this._loadingSessions = new Array(); - - this._loadingSessions.push(loader); - - loader.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - loader.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - loader.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - // Error are handled separately (see documentation for addErrorHandler) - loader._iAddErrorHandler(this._onLoadErrorDelegate); - loader._iAddParseErrorHandler(this._onParseErrorDelegate); - - return loader.loadData(data, '', context, ns, parser); - } - - /** - * - */ - public getAsset(name:string, ns:string = null):IAsset - { - //var asset : IAsset; - - if (this._assetDictDirty) - this.rehashAssetDict(); - - if (ns == null) - ns = NamedAssetBase.DEFAULT_NAMESPACE; - - if (!this._assetDictionary.hasOwnProperty(ns)) - return null; - - return this._assetDictionary[ns][name]; - - } - - /** - * Adds an asset to the asset library, first making sure that it's name is unique - * using the method defined by the conflictStrategy and - * conflictPrecedence properties. - */ - public addAsset(asset:IAsset) - { - var ns:string; - var old:IAsset; - - // Bail if asset has already been added. - if (this._assets.indexOf(asset) >= 0) - return; - - old = this.getAsset(asset.name, asset.assetNamespace); - ns = asset.assetNamespace || NamedAssetBase.DEFAULT_NAMESPACE; - - if (old != null) - this._strategy.resolveConflict(asset, old, this._assetDictionary[ns], this._strategyPreference); - - //create unique-id (for now this is used in AwayBuilder only - //asset.id = IDUtil.createUID(); - - // Add it - this._assets.push(asset); - - if (!this._assetDictionary.hasOwnProperty(ns)) - this._assetDictionary[ns] = new Object(); - - this._assetDictionary[ns][asset.name] = asset; - - asset.addEventListener(away.events.AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); - asset.addEventListener(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); - } - - /** - * Removes an asset from the library, and optionally disposes that asset by calling - * it's disposeAsset() method (which for most assets is implemented as a default - * version of that type's dispose() method. - * - * @param asset The asset which should be removed from this library. - * @param dispose Defines whether the assets should also be disposed. - */ - public removeAsset(asset:IAsset, dispose:boolean = true) - { - var idx:number; - - this.removeAssetFromDict(asset); - - asset.removeEventListener(away.events.AssetEvent.ASSET_RENAME, this._onAssetRenameDelegate); - asset.removeEventListener(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED, this._onAssetConflictResolvedDelegate); - - idx = this._assets.indexOf(asset); - - if (idx >= 0) - this._assets.splice(idx, 1); - - if (dispose) - asset.dispose(); - } - - /** - * Removes an asset which is specified using name and namespace. - * - * @param name The name of the asset to be removed. - * @param ns The namespace to which the desired asset belongs. - * @param dispose Defines whether the assets should also be disposed. - * - * @see away.library.AssetLibrary.removeAsset() - */ - public removeAssetByName(name:string, ns:string = null, dispose:boolean = true):IAsset - { - - var asset:IAsset = this.getAsset(name, ns); - - if (asset) - this.removeAsset(asset, dispose); - - return asset; - } - - /** - * Removes all assets from the asset library, optionally disposing them as they - * are removed. - * - * @param dispose Defines whether the assets should also be disposed. - */ - public removeAllAssets(dispose:boolean = true) - { - if (dispose) { - var asset:IAsset; - - for (var c:number = 0; c < this._assets.length; c++) { - asset = this._assets[ c ]; - asset.dispose(); - } - /* - for each (asset in _assets) - asset.dispose(); - */ - } - - this._assets.length = 0; - this.rehashAssetDict(); - } - - /** - * Removes all assets belonging to a particular namespace (null for default) - * from the asset library, and optionall disposes them by calling their - * disposeAsset() method. - * - * @param ns The namespace from which all assets should be removed. - * @param dispose Defines whether the assets should also be disposed. - * - * @see away.library.AssetLibrary.removeAsset() - */ - public removeNamespaceAssets(ns:string = null, dispose:boolean = true) - { - var idx:number = 0; - var asset:IAsset; - var old_assets:IAsset[]; - - // Empty the assets vector after having stored a copy of it. - // The copy will be filled with all assets which weren't removed. - old_assets = this._assets.concat(); - this._assets.length = 0; - - if (ns == null) - ns = NamedAssetBase.DEFAULT_NAMESPACE; - - for (var d:number = 0; d < old_assets.length; d++) { - asset = old_assets[d]; - - // Remove from dict if in the supplied namespace. If not, - // transfer over to the new vector. - if (asset.assetNamespace == ns) { - if (dispose) - asset.dispose(); - - // Remove asset from dictionary, but don't try to auto-remove - // the namespace, which will trigger an unnecessarily expensive - // test that is not needed since we know that the namespace - // will be empty when loop finishes. - this.removeAssetFromDict(asset, false); - } else { - this._assets[idx++] = asset; - } - } - - /* - for each (asset in old_assets) { - // Remove from dict if in the supplied namespace. If not, - // transfer over to the new vector. - if (asset.assetNamespace == ns) { - if (dispose) - asset.dispose(); - - // Remove asset from dictionary, but don't try to auto-remove - // the namespace, which will trigger an unnecessarily expensive - // test that is not needed since we know that the namespace - // will be empty when loop finishes. - removeAssetFromDict(asset, false); - } else - _assets[idx++] = asset; - - } - */ - - // Remove empty namespace - if (this._assetDictionary.hasOwnProperty(ns)) - delete this._assetDictionary[ns]; - } - - private removeAssetFromDict(asset:IAsset, autoRemoveEmptyNamespace:boolean = true) - { - if (this._assetDictDirty) - this.rehashAssetDict(); - - if (this._assetDictionary.hasOwnProperty(asset.assetNamespace)) { - if (this._assetDictionary[asset.assetNamespace].hasOwnProperty(asset.name)) - delete this._assetDictionary[asset.assetNamespace][asset.name]; - - if (autoRemoveEmptyNamespace) { - - var key:string; - var empty:boolean = true; - - for (key in this._assetDictionary[asset.assetNamespace]) { - empty = false; - break; - } - - if (empty) - delete this._assetDictionary[asset.assetNamespace]; - } - } - } - - public stopAllLoadingSessions() - { - var i:number; - - if (!this._loadingSessions) - this._loadingSessions = new Array(); - - var length:number = this._loadingSessions.length; - - for (i = 0; i < length; i++) - this.killLoadingSession(this._loadingSessions[i]); - - this._loadingSessions = null; - } - - private rehashAssetDict() - { - var asset:IAsset; - - this._assetDictionary = {}; - - var l:number = this._assets.length; - - for (var c:number = 0; c < l; c++) { - asset = this._assets[c]; - - if (!this._assetDictionary.hasOwnProperty(asset.assetNamespace)) - this._assetDictionary[asset.assetNamespace] = {}; - - this._assetDictionary[asset.assetNamespace][asset.name] = asset; - - } - - this._assetDictDirty = false; - - } - - /** - * Called when a an error occurs during loading. - */ - private onLoadError(event:away.events.IOErrorEvent):boolean - { - if (this.hasEventListener(away.events.IOErrorEvent.IO_ERROR)) { - this.dispatchEvent(event); - return true; - } else { - return false; - } - } - - /** - * Called when a an error occurs during parsing. - */ - private onParseError(event:away.events.ParserEvent):boolean - { - if (this.hasEventListener(away.events.ParserEvent.PARSE_ERROR)) { - this.dispatchEvent(event); - return true; - } else { - return false; - } - } - - private onAssetComplete(event:away.events.AssetEvent) - { - // Only add asset to library the first time. - if (event.type == away.events.AssetEvent.ASSET_COMPLETE) - this.addAsset(event.asset); - - this.dispatchEvent(event); - - } - - private onTextureSizeError(event:away.events.AssetEvent) - { - this.dispatchEvent(event); - } - - /** - * Called when the resource and all of its dependencies was retrieved. - */ - private onResourceComplete(event:away.events.LoaderEvent) - { - var loader:AssetLoader = event.target; - - this.dispatchEvent(event); - - var index:number = this._loadingSessions.indexOf(loader); - this._loadingSessions.splice(index, 1); - - // Add loader to a garbage array - for a collection sweep and kill - this._loadingSessionsGarbage.push(loader); - this._gcTimeoutIID = setTimeout(() => {this.loadingSessionGC()}, 100); - } - - private loadingSessionGC():void - { - var loader:AssetLoader; - - while (this._loadingSessionsGarbage.length > 0) { - loader = this._loadingSessionsGarbage.pop(); - this.killLoadingSession(loader); - } - - clearTimeout(this._gcTimeoutIID); - this._gcTimeoutIID = null; - - } - - private killLoadingSession(loader:AssetLoader) - { - loader.removeEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, this._onResourceCompleteDelegate); - loader.removeEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - loader.removeEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - loader.stop(); - } - - /** - * Called when unespected error occurs - */ - /* - private onResourceError() : void - { - var msg:string = "Unexpected parser error"; - if(hasEventListener(LoaderEvent.DEPENDENCY_ERROR)){ - var re:LoaderEvent = new LoaderEvent(LoaderEvent.DEPENDENCY_ERROR, ""); - dispatchEvent(re); - } else{ - throw new Error(msg); - } - } - */ - - private onAssetRename(ev:away.events.AssetEvent) - { - var asset:IAsset = ev.target;// TODO: was ev.currentTarget - watch this var - var old:IAsset = this.getAsset(asset.assetNamespace, asset.name); - - if (old != null) { - this._strategy.resolveConflict(asset, old, this._assetDictionary[asset.assetNamespace], this._strategyPreference); - } else { - var dict:Object = this._assetDictionary[ev.asset.assetNamespace]; - - if (dict == null) - return; - - dict[ev.assetPrevName] = null; - dict[ev.asset.name] = ev.asset; - } - } - - private onAssetConflictResolved(ev:away.events.AssetEvent) - { - this.dispatchEvent(ev.clone()); - } - } -} - -// singleton enforcer -class AssetLibraryBundleSingletonEnforcer -{ -} diff --git a/src/away/core/library/AssetLibraryIterator.ts b/src/away/core/library/AssetLibraryIterator.ts deleted file mode 100644 index 3f4546a8..00000000 --- a/src/away/core/library/AssetLibraryIterator.ts +++ /dev/null @@ -1,113 +0,0 @@ -/// - -module away.library -{ - //import away.library.assets.IAsset; - - export class AssetLibraryIterator - { - - private _assets:IAsset[];//private _assets:Vector.; - private _filtered:IAsset[];//Vector.; - - private _idx:number; - - constructor(assets:IAsset[], assetTypeFilter:string, namespaceFilter:string, filterFunc) - { - this._assets = assets; - this.filter(assetTypeFilter, namespaceFilter, filterFunc); - } - - public get currentAsset():IAsset - { - // Return current, or null if no current - return ( this._idx < this._filtered.length )? this._filtered[ this._idx ] : null; - } - - public get numAssets():number - { - return this._filtered.length; - } - - public next():IAsset - { - var next:IAsset = null; - - if (this._idx < this._filtered.length) - next = this._filtered[this._idx]; - - this._idx++; - - return next; - } - - public reset() - { - this._idx = 0; - } - - public setIndex(index:number) - { - this._idx = index; - } - - private filter(assetTypeFilter:string, namespaceFilter:string, filterFunc) - { - if (assetTypeFilter || namespaceFilter) { - - var idx:number; - var asset:IAsset; - - - idx = 0; - this._filtered = new Array();//new Vector.; - - var l:number = this._assets.length; - - for (var c:number = 0; c < l; c++) { - - asset = this._assets[c]; - - // Skip this assets if filtering on type and this is wrong type - if (assetTypeFilter && asset.assetType != assetTypeFilter) - continue; - - // Skip this asset if filtering on namespace and this is wrong namespace - if (namespaceFilter && asset.assetNamespace != namespaceFilter) - continue; - - // Skip this asset if a filter func has been provided and it returns false - if (filterFunc != null && !filterFunc(asset)) - continue; - - this._filtered[idx++] = asset; - - } - - /* - for each (asset in _assets) { - // Skip this assets if filtering on type and this is wrong type - if (assetTypeFilter && asset.assetType != assetTypeFilter) - continue; - - // Skip this asset if filtering on namespace and this is wrong namespace - if (namespaceFilter && asset.assetNamespace != namespaceFilter) - continue; - - // Skip this asset if a filter func has been provided and it returns false - if (filterFunc != null && !filterFunc(asset)) - continue; - - _filtered[idx++] = asset; - } - */ - - } else { - - this._filtered = this._assets; - - } - - } - } -} diff --git a/src/away/core/library/AssetLoader.ts b/src/away/core/library/AssetLoader.ts deleted file mode 100644 index 4e40d62f..00000000 --- a/src/away/core/library/AssetLoader.ts +++ /dev/null @@ -1,701 +0,0 @@ -/// - -module away.library -{ - import DisplayObject = away.base.DisplayObject; - import URLLoader = away.net.URLLoader; - import URLLoaderDataFormat = away.net.URLLoaderDataFormat; - import URLRequest = away.net.URLRequest; - import CubeTextureParser = away.parsers.CubeTextureParser; - import ParserBase = away.parsers.ParserBase; - import ResourceDependency = away.parsers.ResourceDependency; - import Texture2DParser = away.parsers.Texture2DParser; - - /** - * Dispatched when any asset finishes parsing. Also see specific events for each - * individual asset type (meshes, materials et c.) - * - * @eventType away.events.AssetEvent - */ - //[Event(name="assetComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when a full resource (including dependencies) finishes loading. - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] - - - /** - * Dispatched when a single dependency (which may be the main file of a resource) - * finishes loading. - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] - - - /** - * Dispatched when an error occurs during loading. I - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="loadError", type="away3d.events.LoaderEvent")] - - - /** - * Dispatched when an error occurs during parsing. - * - * @eventType away.events.ParserEvent - */ - //[Event(name="parseError", type="away3d.events.ParserEvent")] - - /** - * Dispatched when an image asset dimensions are not a power of 2 - * - * @eventType away.events.AssetEvent - */ - //[Event(name="textureSizeError", type="away3d.events.AssetEvent")] - - /** - * AssetLoader can load any file format that away.supports (or for which a third-party parser - * has been plugged in) and it's dependencies. Events are dispatched when assets are encountered - * and for when the resource (or it's dependencies) have been loaded. - * - * The AssetLoader will not make assets available in any other way than through the dispatched - * events. To store assets and make them available at any point from any module in an application, - * use the AssetLibrary to load and manage assets. - * - * @see away.library.AssetLibrary - */ - export class AssetLoader extends away.events.EventDispatcher - { - private _context:AssetLoaderContext; - private _token:AssetLoaderToken; - private _uri:string; - private _content:DisplayObject; - private _materialMode:number; - - private _errorHandlers:Array; - private _parseErrorHandlers:Array; - - private _stack:Array; - private _baseDependency:ResourceDependency; - private _currentDependency:ResourceDependency; - private _namespace:string; - - private _onReadyForDependenciesDelegate:Function; - private _onParseCompleteDelegate:Function; - private _onParseErrorDelegate:Function; - private _onLoadCompleteDelegate:Function; - private _onLoadErrorDelegate:Function; - private _onTextureSizeErrorDelegate:Function; - private _onAssetCompleteDelegate:Function; - - // Image parser only parser that is added by default, to save file size. - private static _parsers:Array = new Array(Texture2DParser, CubeTextureParser); - - /** - * Enables a specific parser. - * When no specific parser is set for a loading/parsing opperation, - * loader3d can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parser The parser class to enable. - * - * @see away.parsers.Parsers - */ - public static enableParser(parser) - { - if (AssetLoader._parsers.indexOf(parser) < 0) - AssetLoader._parsers.push(parser); - } - - /** - * Enables a list of parsers. - * When no specific parser is set for a loading/parsing opperation, - * AssetLoader can autoselect the correct parser to use. - * A parser must have been enabled, to be considered when autoselecting the parser. - * - * @param parsers A Vector of parser classes to enable. - * @see away.parsers.Parsers - */ - public static enableParsers(parsers:Array) - { - for (var c:number = 0; c < parsers.length; c++) - AssetLoader.enableParser(parsers[ c ]); - } - - /** - * Returns the base dependency of the loader - */ - public get baseDependency():ResourceDependency - { - return this._baseDependency; - } - - /** - * Create a new ResourceLoadSession object. - */ - constructor(materialMode:number = 0) - { - super(); - - this._materialMode = materialMode; - - this._stack = new Array(); - this._errorHandlers = new Array(); - this._parseErrorHandlers = new Array(); - - this._onReadyForDependenciesDelegate = away.utils.Delegate.create(this, this.onReadyForDependencies); - this._onParseCompleteDelegate = away.utils.Delegate.create(this, this.onParseComplete); - this._onParseErrorDelegate = away.utils.Delegate.create(this, this.onParseError); - this._onLoadCompleteDelegate = away.utils.Delegate.create(this, this.onLoadComplete); - this._onLoadErrorDelegate = away.utils.Delegate.create(this, this.onLoadError); - this._onTextureSizeErrorDelegate = away.utils.Delegate.create(this, this.onTextureSizeError); - this._onAssetCompleteDelegate = away.utils.Delegate.create(this, this.onAssetComplete); - } - - /** - * Loads a file and (optionally) all of its dependencies. - * - * @param req The URLRequest object containing the URL of the file to be loaded. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - */ - public load(req:URLRequest, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken - { - if (!this._token) { - this._token = new AssetLoaderToken(this); - - this._uri = req.url = req.url.replace(/\\/g, "/"); - this._context = context; - this._namespace = ns; - - this._baseDependency = new ResourceDependency('', req, null, parser, null); - this.retrieveDependency(this._baseDependency); - - return this._token; - } - - // TODO: Throw error (already loading) - return null; - } - - /** - * Loads a resource from already loaded data. - * - * @param data The data object containing all resource information. - * @param context An optional context object providing additional parameters for loading - * @param ns An optional namespace string under which the file is to be loaded, allowing the differentiation of two resources with identical assets - * @param parser An optional parser object for translating the loaded data into a usable resource. If not provided, AssetLoader will attempt to auto-detect the file type. - */ - public loadData(data:any, id:string, context:AssetLoaderContext = null, ns:string = null, parser:ParserBase = null):AssetLoaderToken - { - if (!this._token) { - this._token = new AssetLoaderToken(this); - - this._uri = id; - this._context = context; - this._namespace = ns; - - this._baseDependency = new ResourceDependency(id, null, data, parser, null); - this.retrieveDependency(this._baseDependency); - - return this._token; - } - - // TODO: Throw error (already loading) - return null; - } - - /** - * Recursively retrieves the next to-be-loaded and parsed dependency on the stack, or pops the list off the - * stack when complete and continues on the top set. - * @param parser The parser that will translate the data into a usable resource. - */ - private retrieveNext(parser:ParserBase = null) - { - if (this._currentDependency.dependencies.length) { - - var next:ResourceDependency = this._currentDependency.dependencies.pop(); - - this._stack.push(this._currentDependency); - this.retrieveDependency(next); - - } else if (this._currentDependency.parser && this._currentDependency.parser.parsingPaused) { - - this._currentDependency.parser._iResumeParsingAfterDependencies(); - this._stack.pop(); - - } else if (this._stack.length) { - - var prev:ResourceDependency = this._currentDependency; - - this._currentDependency = this._stack.pop(); - - if (prev._iSuccess) - prev.resolve(); - - this.retrieveNext(parser); - - } else { - this.dispatchEvent(new away.events.LoaderEvent(away.events.LoaderEvent.RESOURCE_COMPLETE, this._uri, this._baseDependency.parser.content, this._baseDependency.assets)); - } - } - - /** - * Retrieves a single dependency. - * @param parser The parser that will translate the data into a usable resource. - */ - private retrieveDependency(dependency:ResourceDependency) - { - var data:any; - - if (this._context && this._context.materialMode != 0) - this._materialMode = this._context.materialMode; - - this._currentDependency = dependency; - - dependency._iLoader = new URLLoader(); - - this.addEventListeners(dependency._iLoader); - - // Get already loaded (or mapped) data if available - data = dependency.data; - - if (this._context && dependency.request && this._context._iHasDataForUrl(dependency.request.url)) - data = this._context._iGetDataForUrl(dependency.request.url); - - if (data) { - if (data.constructor === Function) - data = new data(); - - dependency._iSetData(data); - - if (dependency.retrieveAsRawData) { - // No need to parse. The parent parser is expecting this - // to be raw data so it can be passed directly. - dependency.resolve(); - - // Move on to next dependency - this.retrieveNext(); - - } else { - this.parseDependency(dependency); - } - - } else { - // Resolve URL and start loading - dependency.request.url = this.resolveDependencyUrl(dependency); - - if (dependency.retrieveAsRawData) { - // Always use binary for raw data loading - dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; - } else { - - if (!dependency.parser) - dependency._iSetParser(this.getParserFromSuffix(dependency.request.url)); - - if (dependency.parser) { - dependency._iLoader.dataFormat = dependency.parser.dataFormat; - } else { - // Always use BINARY for unknown file formats. The thorough - // file type check will determine format after load, and if - // binary, a text load will have broken the file data. - dependency._iLoader.dataFormat = URLLoaderDataFormat.BINARY; - } - } - - dependency._iLoader.load(dependency.request); - } - } - - private joinUrl(base:string, end:string):string - { - if (end.charAt(0) == '/') - end = end.substr(1); - - if (base.length == 0) - return end; - - if (base.charAt(base.length - 1) == '/') - base = base.substr(0, base.length - 1); - - return base.concat('/', end); - - } - - private resolveDependencyUrl(dependency:ResourceDependency):string - { - var scheme_re:RegExp; - var base:string; - var url:string = dependency.request.url; - - // Has the user re-mapped this URL? - if (this._context && this._context._iHasMappingForUrl(url)) - return this._context._iGetRemappedUrl(url); - - // This is the "base" dependency, i.e. the actual requested asset. - // We will not try to resolve this since the user can probably be - // thrusted to know this URL better than our automatic resolver. :) - if (url == this._uri) - return url; - - - // Absolute URL? Check if starts with slash or a URL - // scheme definition (e.g. ftp://, http://, file://) - scheme_re = new RegExp('/^[a-zA-Z]{3,4}:\/\//'); - - if (url.charAt(0) == '/') { - if (this._context && this._context.overrideAbsolutePaths) - return this.joinUrl(this._context.dependencyBaseUrl, url); else - return url; - } else if (scheme_re.test(url)) { - // If overriding full URLs, get rid of scheme (e.g. "http://") - // and replace with the dependencyBaseUrl defined by user. - if (this._context && this._context.overrideFullURLs) { - - var noscheme_url : string = url.replace( scheme_re , '' );//url['replace'](scheme_re); - return this.joinUrl(this._context.dependencyBaseUrl, noscheme_url); - } - } - - // Since not absolute, just get rid of base file name to find it's - // folder and then concatenate dynamic URL - if (this._context && this._context.dependencyBaseUrl) { - base = this._context.dependencyBaseUrl; - return this.joinUrl(base, url); - } else { - base = this._uri.substring(0, this._uri.lastIndexOf('/') + 1); - return this.joinUrl(base, url); - } - } - - private retrieveParserDependencies() - { - if (!this._currentDependency) - return; - - var parserDependancies = this._currentDependency.parser.dependencies - var i:number, len:number = parserDependancies.length; - - for (i = 0; i < len; i++) - this._currentDependency.dependencies[i] = parserDependancies[i]; - - - // Since more dependencies might be added eventually, empty this - // list so that the same dependency isn't retrieved more than once. - parserDependancies.length = 0; - - this._stack.push(this._currentDependency); - - this.retrieveNext(); - } - - private resolveParserDependencies() - { - this._currentDependency._iSuccess = true; - - // Retrieve any last dependencies remaining on this parser, or - // if none exists, just move on. - if (this._currentDependency.parser && this._currentDependency.parser.dependencies.length && (!this._context || this._context.includeDependencies))//context may be null - this.retrieveParserDependencies(); - else - this.retrieveNext(); - } - - /** - * Called when a single dependency loading failed, and pushes further dependencies onto the stack. - * @param event - */ - private onLoadError(event:away.events.IOErrorEvent) - { - var handled:boolean; - var isDependency:boolean = (this._currentDependency != this._baseDependency); - var loader:URLLoader = event.target;//TODO: keep on eye on this one - - this.removeEventListeners(loader); - - if (this.hasEventListener( away.events.IOErrorEvent.IO_ERROR )) { - this.dispatchEvent(event); - handled = true; - } else { - // TODO: Consider not doing this even when AssetLoader does have it's own LOAD_ERROR listener - var i:number, len:number = this._errorHandlers.length; - for (i = 0; i < len; i++) - if (!handled) - handled = this._errorHandlers[i](event); - } - - if (handled) { - - //if (isDependency && ! event.isDefaultPrevented()) { - if (isDependency) { // TODO: JS / AS3 Change - we don't have isDefaultPrevented - so will this work - - this._currentDependency.resolveFailure(); - this.retrieveNext(); - - } else { - // Either this was the base file (last left in the stack) or - // default behavior was prevented by the handlers, and hence - // there is nothing more to do than clean up and bail. - this.dispose(); - return; - } - } else { - - // Error event was not handled by listeners directly on AssetLoader or - // on any of the subscribed loaders (in the list of error handlers.) - throw new away.errors.Error(); - } - } - - /** - * Called when a dependency parsing failed, and dispatches a ParserEvent.PARSE_ERROR - * @param event - */ - private onParseError(event:away.events.ParserEvent) - { - var handled:boolean; - - var isDependency:boolean = (this._currentDependency != this._baseDependency); - - var loader:URLLoader = event.target; - - this.removeEventListeners(loader); - - if (this.hasEventListener(away.events.ParserEvent.PARSE_ERROR)) { - this.dispatchEvent(event); - handled = true; - } else { - // TODO: Consider not doing this even when AssetLoader does - // have it's own LOAD_ERROR listener - var i:number, len:number = this._parseErrorHandlers.length; - - for (i = 0; i < len; i++) - if (!handled) - handled = this._parseErrorHandlers[i](event); - } - - if (handled) { - this.dispose(); - return; - } else { - // Error event was not handled by listeners directly on AssetLoader or - // on any of the subscribed loaders (in the list of error handlers.) - throw new away.errors.Error(event.message); - } - } - - private onAssetComplete(event:away.events.AssetEvent) - { - // Add loaded asset to list of assets retrieved as part - // of the current dependency. This list will be inspected - // by the parent parser when dependency is resolved - if (this._currentDependency) - this._currentDependency.assets.push(event.asset); - - event.asset.resetAssetPath(event.asset.name, this._namespace); - - if (!this._currentDependency.suppresAssetEvents) - this.dispatchEvent(event); - } - - private onReadyForDependencies(event:away.events.ParserEvent) - { - var parser:ParserBase = event.target; - - if (this._context && !this._context.includeDependencies) - parser._iResumeParsingAfterDependencies(); - else - this.retrieveParserDependencies(); - } - - /** - * Called when a single dependency was parsed, and pushes further dependencies onto the stack. - * @param event - */ - private onLoadComplete(event:away.events.Event) - { - var loader:URLLoader = event.target; - - this.removeEventListeners(loader); - - // Resolve this dependency - this._currentDependency._iSetData(loader.data); - - if (this._currentDependency.retrieveAsRawData) { - // No need to parse this data, which should be returned as is - this.resolveParserDependencies(); - } else { - this.parseDependency(this._currentDependency); - } - } - - /** - * Called when parsing is complete. - */ - private onParseComplete(event:away.events.ParserEvent):void - { - var parser:ParserBase = event.target; - - this.resolveParserDependencies();//resolve in front of removing listeners to allow any remaining asset events to propagate - - parser.removeEventListener(away.events.ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); - parser.removeEventListener(away.events.ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); - parser.removeEventListener(away.events.ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); - parser.removeEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - parser.removeEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - } - - /** - * Called when an image is too large or it's dimensions are not a power of 2 - * @param event - */ - private onTextureSizeError(event:away.events.AssetEvent) - { - event.asset.name = this._currentDependency.resolveName(event.asset); - - this.dispatchEvent(event); - } - - private addEventListeners(loader:URLLoader) - { - loader.addEventListener(away.events.Event.COMPLETE, this._onLoadCompleteDelegate); - loader.addEventListener(away.events.IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); - } - - private removeEventListeners(loader:URLLoader) - { - loader.removeEventListener(away.events.Event.COMPLETE, this._onLoadCompleteDelegate); - loader.removeEventListener(away.events.IOErrorEvent.IO_ERROR, this._onLoadErrorDelegate); - } - - public stop() - { - this.dispose(); - } - - private dispose() - { - this._errorHandlers = null; - this._parseErrorHandlers = null; - this._context = null; - this._token = null; - this._stack = null; - - if (this._currentDependency && this._currentDependency._iLoader) - this.removeEventListeners(this._currentDependency._iLoader); - - this._currentDependency = null; - - } - - /** - * @private - * This method is used by other loader classes (e.g. Loader3D and AssetLibraryBundle) to - * add error event listeners to the AssetLoader instance. This system is used instead of - * the regular EventDispatcher system so that the AssetLibrary error handler can be sure - * that if hasEventListener() returns true, it's client code that's listening for the - * event. Secondly, functions added as error handler through this custom method are - * expected to return a boolean value indicating whether the event was handled (i.e. - * whether they in turn had any client code listening for the event.) If no handlers - * return true, the AssetLoader knows that the event wasn't handled and will throw an RTE. - */ - - public _iAddParseErrorHandler(handler) - { - if (this._parseErrorHandlers.indexOf(handler) < 0) - this._parseErrorHandlers.push(handler); - } - - public _iAddErrorHandler(handler) - { - if (this._errorHandlers.indexOf(handler) < 0) - this._errorHandlers.push(handler); - } - - - /** - * Guesses the parser to be used based on the file contents. - * @param data The data to be parsed. - * @param uri The url or id of the object to be parsed. - * @return An instance of the guessed parser. - */ - private getParserFromData(data:any):ParserBase - { - var len:number = AssetLoader._parsers.length; - - // go in reverse order to allow application override of default parser added in away.proper - for (var i:number = len - 1; i >= 0; i--) - if (AssetLoader._parsers[i].supportsData(data)) - return new AssetLoader._parsers[i](); - - return null; - } - - - /** - * Initiates parsing of the loaded dependency. - * - * @param The dependency to be parsed. - */ - private parseDependency(dependency:ResourceDependency):void - { - var parser:ParserBase = dependency.parser; - - // If no parser has been defined, try to find one by letting - // all plugged in parsers inspect the actual data. - if (!parser) - dependency._iSetParser(parser = this.getParserFromData(dependency.data)); - - if (parser) { - parser.addEventListener(away.events.ParserEvent.READY_FOR_DEPENDENCIES, this._onReadyForDependenciesDelegate); - parser.addEventListener(away.events.ParserEvent.PARSE_COMPLETE, this._onParseCompleteDelegate); - parser.addEventListener(away.events.ParserEvent.PARSE_ERROR, this._onParseErrorDelegate); - parser.addEventListener(away.events.AssetEvent.TEXTURE_SIZE_ERROR, this._onTextureSizeErrorDelegate); - parser.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, this._onAssetCompleteDelegate); - - if (dependency.request && dependency.request.url) - parser._iFileName = dependency.request.url; - - parser.materialMode = this._materialMode; - - parser.parseAsync(dependency.data); - - } else { - var message:string = "No parser defined. To enable all parsers for auto-detection, use Parsers.enableAllBundled()" - if(this.hasEventListener(away.events.ParserEvent.PARSE_ERROR)) - this.dispatchEvent(new away.events.ParserEvent(away.events.ParserEvent.PARSE_ERROR, message)); - else - throw new Error(message); - } - } - - /** - * Guesses the parser to be used based on the file extension. - * @return An instance of the guessed parser. - */ - private getParserFromSuffix(url:string):ParserBase - { - // Get rid of query string if any and extract extension - var base:string = (url.indexOf('?') > 0)? url.split('?')[0] : url; - var fileExtension:string = base.substr(base.lastIndexOf('.') + 1).toLowerCase(); - - var len:number = AssetLoader._parsers.length; - - // go in reverse order to allow application override of default parser added in away.proper - for (var i:number = len - 1; i >= 0; i--) { - var parserClass:any = AssetLoader._parsers[i]; - if (parserClass.supportsType(fileExtension)) - return new parserClass(); - } - - return null; - } - } -} \ No newline at end of file diff --git a/src/away/core/library/AssetLoaderContext.ts b/src/away/core/library/AssetLoaderContext.ts deleted file mode 100644 index 3f2344be..00000000 --- a/src/away/core/library/AssetLoaderContext.ts +++ /dev/null @@ -1,176 +0,0 @@ -/// - -module away.library -{ - - export class AssetLoaderContext - { - public static UNDEFINED:number = 0; - public static SINGLEPASS_MATERIALS:number = 1; - public static MULTIPASS_MATERIALS:number = 2; - - private _includeDependencies:boolean; - private _dependencyBaseUrl:string; - private _embeddedDataByUrl:Object; - private _remappedUrls:Object; - private _materialMode:number; - - private _overrideAbsPath:boolean; - private _overrideFullUrls:boolean; - - /** - * AssetLoaderContext provides configuration for the AssetLoader load() and parse() operations. - * Use it to configure how (and if) dependencies are loaded, or to map dependency URLs to - * embedded data. - * - * @see away.loading.AssetLoader - */ - constructor(includeDependencies:boolean = true, dependencyBaseUrl:string = null) - { - this._includeDependencies = includeDependencies; - this._dependencyBaseUrl = dependencyBaseUrl || ''; - this._embeddedDataByUrl = {}; - this._remappedUrls = {}; - this._materialMode = AssetLoaderContext.UNDEFINED; - } - - /** - * Defines whether dependencies (all files except the one at the URL given to the load() or - * parseData() operations) should be automatically loaded. Defaults to true. - */ - public get includeDependencies():boolean - { - return this._includeDependencies; - } - - public set includeDependencies(val:boolean) - { - this._includeDependencies = val; - } - - /** - * MaterialMode defines, if the Parser should create SinglePass or MultiPass Materials - * Options: - * 0 (Default / undefined) - All Parsers will create SinglePassMaterials, but the AWD2.1parser will create Materials as they are defined in the file - * 1 (Force SinglePass) - All Parsers create SinglePassMaterials - * 2 (Force MultiPass) - All Parsers will create MultiPassMaterials - * - */ - public get materialMode():number - { - return this._materialMode; - } - - public set materialMode(materialMode:number) - { - this._materialMode = materialMode; - } - - /** - * A base URL that will be prepended to all relative dependency URLs found in a loaded resource. - * Absolute paths will not be affected by the value of this property. - */ - public get dependencyBaseUrl():string - { - return this._dependencyBaseUrl; - } - - public set dependencyBaseUrl(val:string) - { - this._dependencyBaseUrl = val; - } - - /** - * Defines whether absolute paths (defined as paths that begin with a "/") should be overridden - * with the dependencyBaseUrl defined in this context. If this is true, and the base path is - * "base", /path/to/asset.jpg will be resolved as base/path/to/asset.jpg. - */ - public get overrideAbsolutePaths():boolean - { - return this._overrideAbsPath; - } - - public set overrideAbsolutePaths(val:boolean) - { - this._overrideAbsPath = val; - } - - /** - * Defines whether "full" URLs (defined as a URL that includes a scheme, e.g. http://) should be - * overridden with the dependencyBaseUrl defined in this context. If this is true, and the base - * path is "base", http://example.com/path/to/asset.jpg will be resolved as base/path/to/asset.jpg. - */ - public get overrideFullURLs():boolean - { - return this._overrideFullUrls; - } - - public set overrideFullURLs(val:boolean) - { - this._overrideFullUrls = val; - } - - /** - * Map a URL to another URL, so that files that are referred to by the original URL will instead - * be loaded from the new URL. Use this when your file structure does not match the one that is - * expected by the loaded file. - * - * @param originalUrl The original URL which is referenced in the loaded resource. - * @param newUrl The URL from which away.should load the resource instead. - * - * @see mapUrlToData() - */ - public mapUrl(originalUrl:string, newUrl:string) - { - this._remappedUrls[originalUrl] = newUrl; - } - - /** - * Map a URL to embedded data, so that instead of trying to load a dependency from the URL at - * which it's referenced, the dependency data will be retrieved straight from the memory instead. - * - * @param originalUrl The original URL which is referenced in the loaded resource. - * @param data The embedded data. Can be ByteArray or a class which can be used to create a bytearray. - */ - public mapUrlToData(originalUrl:string, data:any) - { - this._embeddedDataByUrl[originalUrl] = data; - } - - /** - * @private - * Defines whether embedded data has been mapped to a particular URL. - */ - public _iHasDataForUrl(url:string):boolean - { - return this._embeddedDataByUrl.hasOwnProperty(url); - } - - /** - * @private - * Returns embedded data for a particular URL. - */ - public _iGetDataForUrl(url:string):any - { - return this._embeddedDataByUrl[url]; - } - - /** - * @private - * Defines whether a replacement URL has been mapped to a particular URL. - */ - public _iHasMappingForUrl(url:string):boolean - { - return this._remappedUrls.hasOwnProperty(url); - } - - /** - * @private - * Returns new (replacement) URL for a particular original URL. - */ - public _iGetRemappedUrl(originalUrl:string):string - { - return this._remappedUrls[originalUrl]; - } - } -} diff --git a/src/away/core/library/AssetLoaderToken.ts b/src/away/core/library/AssetLoaderToken.ts deleted file mode 100644 index f6afafc3..00000000 --- a/src/away/core/library/AssetLoaderToken.ts +++ /dev/null @@ -1,237 +0,0 @@ -/// - -module away.library -{ - /** - * Dispatched when any asset finishes parsing. Also see specific events for each - * individual asset type (meshes, materials et c.) - * - * @eventType away.events.AssetEvent - */ - //[Event(name="assetComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when a full resource (including dependencies) finishes loading. - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="resourceComplete", type="away3d.events.LoaderEvent")] - - - /** - * Dispatched when a single dependency (which may be the main file of a resource) - * finishes loading. - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="dependencyComplete", type="away3d.events.LoaderEvent")] - - - /** - * Dispatched when an error occurs during loading. I - * - * @eventType away.events.LoaderEvent - */ - //[Event(name="loadError", type="away3d.events.LoaderEvent")] - - - /** - * Dispatched when an error occurs during parsing. - * - * @eventType away.events.ParserEvent - */ - //[Event(name="parseError", type="away3d.events.ParserEvent")] - - - /** - * Dispatched when a skybox asset has been costructed from a ressource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="skyboxComplete", type="away3d.events.AssetEvent")] - - /** - * Dispatched when a camera3d asset has been costructed from a ressource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="cameraComplete", type="away3d.events.AssetEvent")] - - /** - * Dispatched when a mesh asset has been costructed from a ressource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="meshComplete", type="away3d.events.AssetEvent")] - - /** - * Dispatched when a geometry asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="geometryComplete", type="away3d.events.AssetEvent")] - - /** - * Dispatched when a skeleton asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="skeletonComplete", type="away3d.events.AssetEvent")] - - /** - * Dispatched when a skeleton pose asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="skeletonPoseComplete", type="away3d.events.AssetEvent")] - - /** - * Dispatched when a container asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="containerComplete", type="away3d.events.AssetEvent")] - - /** - * Dispatched when a texture asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="textureComplete", type="away3d.events.AssetEvent")] - - /** - * Dispatched when a texture projector asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="textureProjectorComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when a material asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="materialComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when a animator asset has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="animatorComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when an animation set has been constructed from a group of animation state resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="animationSetComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when an animation state has been constructed from a group of animation node resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="animationStateComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when an animation node has been constructed from a resource. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="animationNodeComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when an animation state transition has been constructed from a group of animation node resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="stateTransitionComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when an light asset has been constructed from a resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="lightComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when an light picker asset has been constructed from a resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="lightPickerComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when an effect method asset has been constructed from a resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="effectMethodComplete", type="away3d.events.AssetEvent")] - - - /** - * Dispatched when an shadow map method asset has been constructed from a resources. - * - * @eventType away.events.AssetEvent - */ - //[Event(name="shadowMapMethodComplete", type="away3d.events.AssetEvent")] - - /** - * Instances of this class are returned as tokens by loading operations - * to provide an object on which events can be listened for in cases where - * the actual asset loader is not directly available (e.g. when using the - * AssetLibrary to perform the load.) - * - * By listening for events on this class instead of directly on the - * AssetLibrary, one can distinguish different loads from each other. - * - * The token will dispatch all events that the original AssetLoader dispatches, - * while not providing an interface to obstruct the load and is as such a - * safer return value for loader wrappers than the loader itself. - */ - export class AssetLoaderToken extends away.events.EventDispatcher - { - public _iLoader:AssetLoader; - - constructor(loader:AssetLoader) - { - super(); - - this._iLoader = loader; - } - - public addEventListener(type:string, listener:Function) - { - this._iLoader.addEventListener(type, listener); - } - - - public removeEventListener(type:string, listener:Function) - { - this._iLoader.removeEventListener(type, listener); - } - - public hasEventListener(type:string, listener:Function = null):boolean - { - return this._iLoader.hasEventListener(type, listener); - } - - /* - public willTrigger(type:string):boolean - { - return this._iLoader.willTrigger(type); - } - */ - } -} diff --git a/src/away/core/library/AssetType.ts b/src/away/core/library/AssetType.ts deleted file mode 100644 index 8cef490e..00000000 --- a/src/away/core/library/AssetType.ts +++ /dev/null @@ -1,30 +0,0 @@ -module away.library -{ - export class AssetType - { - public static ANIMATION_NODE:string = 'animationNode'; - public static ANIMATION_SET:string = 'animationSet'; - public static ANIMATION_STATE:string = 'animationState'; - public static ANIMATOR:string = 'animator'; - public static BILLBOARD:string = 'billboard'; - public static CAMERA:string = 'camera'; - public static CONTAINER:string = 'container'; - public static EFFECTS_METHOD:string = 'effectsMethod'; - public static GEOMETRY:string = 'geometry'; - public static LINE_SEGMENT:string = 'lineSegment'; - public static LIGHT:string = 'light'; - public static LIGHT_PICKER:string = 'lightPicker'; - public static MATERIAL:string = 'material'; - public static MESH:string = 'mesh'; - public static TRIANGLE_SUB_MESH:string = 'triangleSubMesh'; - public static LINE_SUB_MESH:string = 'lineSubMesh'; - public static PRIMITIVE_PREFAB:string = 'primitivePrefab'; - public static SHADOW_MAP_METHOD:string = 'shadowMapMethod'; - public static SKELETON:string = 'skeleton'; - public static SKELETON_POSE:string = 'skeletonPose'; - public static SKYBOX:string = 'skybox'; - public static STATE_TRANSITION:string = 'stateTransition'; - public static TEXTURE:string = 'texture'; - public static TEXTURE_PROJECTOR:string = 'textureProjector'; - } -} \ No newline at end of file diff --git a/src/away/core/library/ConflictPrecedence.ts b/src/away/core/library/ConflictPrecedence.ts deleted file mode 100644 index 8f29dbad..00000000 --- a/src/away/core/library/ConflictPrecedence.ts +++ /dev/null @@ -1,27 +0,0 @@ -module away.library -{ - - /** - * Enumaration class for precedence when resolving naming conflicts in the library. - * - * @see away.library.AssetLibrary.conflictPrecedence - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.naming.ConflictStrategy - */ - export class ConflictPrecedence - { - /** - * Signals that in a conflict, the previous owner of the conflicting name - * should be favored (and keep it's name) and that the newly renamed asset - * is reverted to a non-conflicting name. - */ - public static FAVOR_OLD:string = 'favorOld'; - - /** - * Signales that in a conflict, the newly renamed asset is favored (and keeps - * it's newly defined name) and that the previous owner of that name gets - * renamed to a non-conflicting name. - */ - public static FAVOR_NEW:string = 'favorNew'; - } -} diff --git a/src/away/core/library/ConflictStrategy.ts b/src/away/core/library/ConflictStrategy.ts deleted file mode 100644 index ee3e5d2e..00000000 --- a/src/away/core/library/ConflictStrategy.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// - -module away.library -{ - - /** - * Enumeration class for bundled conflict strategies. Set one of these values (or an - * instance of a self-defined sub-class of ConflictStrategyBase) to the conflictStrategy - * property on an AssetLibrary to define how that library resolves naming conflicts. - * - * The value of the AssetLibrary.conflictPrecedence property defines which - * of the conflicting assets will get to keep it's name, and which is renamed (if any.) - * - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.naming.ConflictStrategyBase - */ - export class ConflictStrategy - { - /** - * Specifies that in case of a naming conflict, one of the assets will be renamed and - * a numeric suffix appended to the base name. - */ - public static APPEND_NUM_SUFFIX:ConflictStrategyBase = new NumSuffixConflictStrategy(); - - /** - * Specifies that naming conflicts should be ignored. This is not recommended in most - * cases, unless it can be 100% guaranteed that the application does not cause naming - * conflicts in the library (i.e. when an app-level system is in place to prevent this.) - */ - public static IGNORE:ConflictStrategyBase = new IgnoreConflictStrategy(); - - /** - * Specifies that an error should be thrown if a naming conflict is discovered. Use this - * to be 100% sure that naming conflicts never occur unnoticed, and when it's undesirable - * to have the library automatically rename assets to avoid such conflicts. - */ - public static THROW_ERROR:ConflictStrategyBase = new ErrorConflictStrategy(); - - } -} diff --git a/src/away/core/library/ConflictStrategyBase.ts b/src/away/core/library/ConflictStrategyBase.ts deleted file mode 100644 index 33bbcdc1..00000000 --- a/src/away/core/library/ConflictStrategyBase.ts +++ /dev/null @@ -1,72 +0,0 @@ -/// - -module away.library -{ - import AbstractMethodError = away.errors.AbstractMethodError; - - /** - * Abstract base class for naming conflict resolution classes. Extend this to create a - * strategy class which the asset library can use to resolve asset naming conflicts, or - * use one of the bundled concrete strategy classes: - * - *
    - *
  • IgnoreConflictStrategy (ConflictStrategy.IGNORE)
  • - *
  • ErrorConflictStrategy (ConflictStrategy.THROW_ERROR)
  • - *
  • NumSuffixConflictStrategy (ConflictStrategy.APPEND_NUM_SUFFIX)
  • - *
- * - * @see away.library.AssetLibrary.conflictStrategy - * @see away.library.ConflictStrategy - * @see away.library.IgnoreConflictStrategy - * @see away.library.ErrorConflictStrategy - * @see away.library.NumSuffixConflictStrategy - */ - export class ConflictStrategyBase - { - - constructor() - { - } - - /** - * Resolve a naming conflict between two assets. Must be implemented by concrete strategy - * classes. - */ - public resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string) - { - throw new AbstractMethodError(); - } - - /** - * Create instance of this conflict strategy. Used internally by the AssetLibrary to - * make sure the same strategy instance is not used in all AssetLibrary instances, which - * would break any state caching that happens inside the strategy class. - */ - public create():ConflictStrategyBase - { - throw new AbstractMethodError(); - } - - /** - * Provided as a convenience method for all conflict strategy classes, as a way to finalize - * the conflict resolution by applying the new names and dispatching the correct events. - */ - public _pUpdateNames(ns:string, nonConflictingName:string, oldAsset:IAsset, newAsset:IAsset, assetsDictionary:Object, precedence:string) - { - var loser_prev_name:string; - var winner:IAsset; - var loser:IAsset; - - winner = (precedence === ConflictPrecedence.FAVOR_NEW)? newAsset : oldAsset; - loser = (precedence === ConflictPrecedence.FAVOR_NEW)? oldAsset : newAsset; - - loser_prev_name = loser.name; - - assetsDictionary[winner.name] = winner; - assetsDictionary[nonConflictingName] = loser; - loser.resetAssetPath(nonConflictingName, ns, false); - - loser.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.ASSET_CONFLICT_RESOLVED, loser, loser_prev_name)); - } - } -} diff --git a/src/away/core/library/ErrorConflictStrategy.ts b/src/away/core/library/ErrorConflictStrategy.ts deleted file mode 100644 index cef9a850..00000000 --- a/src/away/core/library/ErrorConflictStrategy.ts +++ /dev/null @@ -1,22 +0,0 @@ -/// - -module away.library -{ - export class ErrorConflictStrategy extends ConflictStrategyBase - { - constructor() - { - super(); - } - - public resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string) - { - throw new away.errors.Error('Asset name collision while AssetLibrary.namingStrategy set to AssetLibrary.THROW_ERROR. Asset path: ' + changedAsset.assetFullPath); - } - - public create():ConflictStrategyBase - { - return new ErrorConflictStrategy(); - } - } -} diff --git a/src/away/core/library/IAsset.ts b/src/away/core/library/IAsset.ts deleted file mode 100644 index fbc4a326..00000000 --- a/src/away/core/library/IAsset.ts +++ /dev/null @@ -1,19 +0,0 @@ -/// - -module away.library -{ - export interface IAsset extends away.events.IEventDispatcher - { - - name : string; - id : number; - assetNamespace : string; - assetType : string; - assetFullPath : Array; - - assetPathEquals(name:string, ns:string) : boolean; - resetAssetPath(name:string, ns:string, overrideOriginal ?:boolean) : void; - dispose(); - - } -} \ No newline at end of file diff --git a/src/away/core/library/IDUtil.ts b/src/away/core/library/IDUtil.ts deleted file mode 100644 index 9c484b7b..00000000 --- a/src/away/core/library/IDUtil.ts +++ /dev/null @@ -1,103 +0,0 @@ -/// - -module away.library -{ - - export class IDUtil - { - /** - * @private - * Char codes for 0123456789ABCDEF - */ - private static ALPHA_CHAR_CODES = [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70]; - - /** - * Generates a UID (unique identifier) based on ActionScript's - * pseudo-random number generator and the current time. - * - *

The UID has the form - * "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" - * where X is a hexadecimal digit (0-9, A-F).

- * - *

This UID will not be truly globally unique; but it is the best - * we can do without player support for UID generation.

- * - * @return The newly-generated UID. - * - * @langversion 3.0 - * @playerversion Flash 9 - * @playerversion AIR 1.1 - * @productversion Flex 3 - */ - public static createUID():string - { - var uid = new Array(36); - var index:number = 0; - - var i:number; - var j:number; - - for (i = 0; i < 8; i++) - uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)]; - - for (i = 0; i < 3; i++) { - uid[index++] = 45; // charCode for "-" - - for (j = 0; j < 4; j++) - uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)]; - } - - uid[index++] = 45; // charCode for "-" - - var time:number = new Date().getTime(); - // Note: time is the number of milliseconds since 1970, - // which is currently more than one trillion. - // We use the low 8 hex digits of this number in the UID. - // Just in case the system clock has been reset to - // Jan 1-4, 1970 (in which case this number could have only - // 1-7 hex digits), we pad on the left with 7 zeros - // before taking the low digits. - var timeString:string = ("0000000" + time.toString(16).toUpperCase()).substr(-8); - - for (i = 0; i < 8; i++) - uid[index++] = timeString.charCodeAt(i); - - for (i = 0; i < 4; i++) - uid[index++] = IDUtil.ALPHA_CHAR_CODES[Math.floor(Math.random()*16)]; - - return String.fromCharCode.apply(null, uid); - } - - /** - * Returns the decimal representation of a hex digit. - * @private - - private static getDigit(hex:string):number - { - switch (hex) { - case "A": - case "a": - return 10; - case "B": - case "b": - return 11; - case "C": - case "c": - return 12; - case "D": - case "d": - return 13; - case "E": - case "e": - return 14; - case "F": - case "f": - return 15; - default: - return new uint(hex); - } - } - */ - - } -} diff --git a/src/away/core/library/IgnoreConflictStrategy.ts b/src/away/core/library/IgnoreConflictStrategy.ts deleted file mode 100644 index 9f0a5c64..00000000 --- a/src/away/core/library/IgnoreConflictStrategy.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// - -module away.library -{ - export class IgnoreConflictStrategy extends ConflictStrategyBase - { - constructor() - { - super(); - } - - public resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string) - { - // Do nothing, ignore the fact that there is a conflict. - return; - } - - public create():ConflictStrategyBase - { - return new IgnoreConflictStrategy(); - } - } -} diff --git a/src/away/core/library/NamedAssetBase.ts b/src/away/core/library/NamedAssetBase.ts deleted file mode 100644 index 71d085d4..00000000 --- a/src/away/core/library/NamedAssetBase.ts +++ /dev/null @@ -1,119 +0,0 @@ -/// - -module away.library -{ - import AbstractMethodError = away.errors.AbstractMethodError; - - export class NamedAssetBase extends away.events.EventDispatcher - { - public static ID_COUNT:number = 0; - - private _originalName:string; - private _namespace:string; - private _name:string; - private _id:number; - private _full_path:Array; - - public static DEFAULT_NAMESPACE:string = 'default'; - - constructor(name:string = null) - { - super(); - - this._id = NamedAssetBase.ID_COUNT++; - - if (name == null) - name = 'null'; - - this._name = name; - this._originalName = name; - - this.updateFullPath(); - } - - /** - * - */ - public get assetType():string - { - throw new AbstractMethodError(); - } - - /** - * The original name used for this asset in the resource (e.g. file) in which - * it was found. This may not be the same as name, which may - * have changed due to of a name conflict. - */ - public get originalName():string - { - return this._originalName; - } - - /** - * A unique id for the asset, used to identify assets in an associative array - */ - public get id():number - { - return this._id; - } - - public get name():string - { - return this._name; - } - - public set name(val:string) - { - var prev:string; - - prev = this._name; - this._name = val; - - if (this._name == null) - this._name = 'null'; - - this.updateFullPath(); - - //if (hasEventListener(AssetEvent.ASSET_RENAME)) - this.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.ASSET_RENAME, this, prev)); - - } - - public dispose() - { - throw new AbstractMethodError(); - } - - public get assetNamespace():string - { - return this._namespace; - } - - public get assetFullPath():Array - { - return this._full_path; - } - - public assetPathEquals(name:string, ns:string):boolean - { - return (this._name == name && (!ns || this._namespace == ns)); - } - - public resetAssetPath(name:string, ns:string = null, overrideOriginal:boolean = true):void - { - - this._name = name? name : 'null'; - this._namespace = ns? ns : NamedAssetBase.DEFAULT_NAMESPACE; - - if (overrideOriginal) - this._originalName = this._name; - - this.updateFullPath(); - } - - private updateFullPath():void - { - this._full_path = [ this._namespace, this._name ]; - } - } -} \ No newline at end of file diff --git a/src/away/core/library/NumSuffixConflictStrategy.ts b/src/away/core/library/NumSuffixConflictStrategy.ts deleted file mode 100644 index 319496e5..00000000 --- a/src/away/core/library/NumSuffixConflictStrategy.ts +++ /dev/null @@ -1,71 +0,0 @@ -/// - - -module away.library -{ - export class NumSuffixConflictStrategy extends ConflictStrategyBase - { - private _separator:string; - private _next_suffix:Object; - - constructor(separator:string = '.') - { - super(); - - this._separator = separator; - this._next_suffix = {}; - } - - public resolveConflict(changedAsset:IAsset, oldAsset:IAsset, assetsDictionary:Object, precedence:string) - { - var orig:string; - var new_name:string; - var base:string; - var suffix:number; - - orig = changedAsset.name; - - if (orig.indexOf(this._separator) >= 0) { - // Name has an ocurrence of the separator, so get base name and suffix, - // unless suffix is non-numerical, in which case revert to zero and - // use entire name as base - base = orig.substring(0, orig.lastIndexOf(this._separator)); - suffix = parseInt(orig.substring(base.length - 1)); - - if (isNaN(suffix)) { - base = orig; - suffix = 0; - } - - } else { - base = orig; - suffix = 0; - } - - if (suffix == 0 && this._next_suffix.hasOwnProperty(base)) { - - suffix = this._next_suffix[base]; - - } - - // Find the first suffixed name that does - // not collide with other names. - do { - - suffix++; - - new_name = base.concat(this._separator, suffix.toString()); - - } while (assetsDictionary.hasOwnProperty(new_name)); - - this._next_suffix[ base ] = suffix; - this._pUpdateNames(oldAsset.assetNamespace, new_name, oldAsset, changedAsset, assetsDictionary, precedence); - - } - - public create():ConflictStrategyBase - { - return new NumSuffixConflictStrategy(this._separator); - } - } -} diff --git a/src/away/core/net/CrossDomainPolicy.ts b/src/away/core/net/CrossDomainPolicy.ts deleted file mode 100644 index d901de5c..00000000 --- a/src/away/core/net/CrossDomainPolicy.ts +++ /dev/null @@ -1,10 +0,0 @@ -/// -module away.net -{ - export class CrossDomainPolicy - { - public static ANONYMOUS:string = 'anonymous'; - - public static USE_CREDENTIALS:string = 'use-credentials'; - } -} diff --git a/src/away/core/net/URLLoader.ts b/src/away/core/net/URLLoader.ts deleted file mode 100644 index 97594819..00000000 --- a/src/away/core/net/URLLoader.ts +++ /dev/null @@ -1,410 +0,0 @@ -/// -module away.net -{ - /** - * The URLLoader is used to load a single file, as part of a resource. - * - * While URLLoader can be used directly, e.g. to create a third-party asset - * management system, it's recommended to use any of the classes Loader3D, AssetLoader - * and AssetLibrary instead in most cases. - * - * @see AssetLoader - * @see away.library.AssetLibrary - */ - export class URLLoader extends away.events.EventDispatcher - { - private _XHR:XMLHttpRequest; - private _bytesLoaded:number = 0; - private _bytesTotal:number = 0; - private _dataFormat:string = URLLoaderDataFormat.TEXT; - private _loadError:boolean = false; - - private _request:URLRequest; - private _data:any; - - private _loadStartEvent:away.events.Event; - private _loadErrorEvent:away.events.IOErrorEvent; - private _loadCompleteEvent:away.events.Event; - private _progressEvent:away.events.ProgressEvent; - - /** - * Creates a new URLLoader object. - */ - constructor() - { - super(); - } - - /** - * - */ - public get url():string - { - - return this._request? this._request.url : ''; - } - - /** - * - */ - public get data():any - { - return this._data; - } - - - /** - * - * URLLoaderDataFormat.BINARY - * URLLoaderDataFormat.TEXT - * URLLoaderDataFormat.VARIABLES - * - * @param format - */ - public set dataFormat(format:string) - { - this._dataFormat = format; - } - - public get dataFormat():string - { - return this._dataFormat; - } - - /** - * - * @returns {number} - */ - public get bytesLoaded():number - { - return this._bytesLoaded; - } - - /** - * - * @returns {number} - */ - public get bytesTotal():number - { - return this._bytesTotal; - } - - /** - * Load a resource from a file. - * - * @param request The URLRequest object containing the URL of the object to be loaded. - */ - public load(request:URLRequest):void - { - this._request = request; - - this.initXHR(); - - if (request.method === URLRequestMethod.POST) - this.postRequest(request); - else - this.getRequest(request); - } - - /** - * - */ - public close():void - { - this._XHR.abort(); - this.disposeXHR(); - } - - /** - * - */ - public dispose():void - { - if (this._XHR) - this._XHR.abort(); - - this.disposeXHR(); - - this._data = null; - this._dataFormat = null; - this._bytesLoaded = null; - this._bytesTotal = null; - } - - /** - * - * @param xhr - * @param responseType - */ - private setResponseType(xhr:XMLHttpRequest, responseType:string):void - { - switch (responseType) { - case URLLoaderDataFormat.ARRAY_BUFFER: - case URLLoaderDataFormat.BLOB: - case URLLoaderDataFormat.TEXT: - xhr.responseType = responseType; - break; - - case URLLoaderDataFormat.VARIABLES: - xhr.responseType = URLLoaderDataFormat.TEXT; - break; - - case URLLoaderDataFormat.BINARY: - xhr.responseType = ''; - break; - - default: - } - } - - /** - * - * @param request {URLRequest} - */ - private getRequest(request:URLRequest):void - { - try { - this._XHR.open(request.method, request.url, request.async); - this.setResponseType(this._XHR, this._dataFormat); - this._XHR.send(); // No data to send - } catch (e /* */) { - this.handleXmlHttpRequestException(e); - } - } - - /** - * - * @param request {URLRequest} - */ - private postRequest(request:URLRequest):void - { - this._loadError = false; - - this._XHR.open(request.method, request.url, request.async); - - if (request.data != null) { - if (request.data instanceof URLVariables) { - var urlVars:URLVariables = request.data; - - try { - this._XHR.responseType = 'text'; - this._XHR.send(urlVars.formData); - } catch (e /* */) { - this.handleXmlHttpRequestException(e); - } - } else { - this.setResponseType(this._XHR, this._dataFormat); - - if (request.data) - this._XHR.send(request.data); // TODO: Test - else - this._XHR.send(); // no data to send - } - } else { - this._XHR.send(); // No data to send - } - - } - - /** - * - * @param error {XMLHttpRequestException} - */ - private handleXmlHttpRequestException(error:any /* */):void - { - switch (error.code) { - - /****************************************************************************************************************************************************************************************************** - * - * XMLHttpRequestException { message: "NETWORK_ERR: XMLHttpRequest Exception 101", name: "NETWORK_ERR", code: 101, stack: "Error: A network error occurred in synchronous req…",NETWORK_ERR: 101… } - * code: 101 , message: "NETWORK_ERR: XMLHttpRequest Exception 101" , name: "NETWORK_ERR" - * - ******************************************************************************************************************************************************************************************************/ - - case 101: - // Note: onLoadError event throws IO_ERROR event - this case is already Covered - break; - } - } - - /** - * - */ - private initXHR() - { - if (!this._XHR) { - this._XHR = new XMLHttpRequest(); - - this._XHR.onloadstart = (event:ProgressEvent) => this.onLoadStart(event); // loadstart - When the request starts. - this._XHR.onprogress = (event:ProgressEvent) => this.onProgress(event); // progress - While loading and sending data. - this._XHR.onabort = (event:UIEvent) => this.onAbort(event); // abort - When the request has been aborted, either by invoking the abort() method or navigating away from the page. - this._XHR.onerror = (event:ErrorEvent) => this.onLoadError(event); // error - When the request has failed. - this._XHR.onload = (event:Event) => this.onLoadComplete(event); // load - When the request has successfully completed. - this._XHR.ontimeout = (event:Event) => this.onTimeOut(event); // timeout - When the author specified timeout has passed before the request could complete. - this._XHR.onloadend = (event:ProgressEvent) => this.onLoadEnd(event); // loadend - When the request has completed, regardless of whether or not it was successful. - this._XHR.onreadystatechange = (event:Event) => this.onReadyStateChange(event); // onreadystatechange - When XHR state changes - } - } - - /** - * - */ - private disposeXHR() - { - if (this._XHR !== null) { - this._XHR.onloadstart = null; - this._XHR.onprogress = null; - this._XHR.onabort = null; - this._XHR.onerror = null; - this._XHR.onload = null; - this._XHR.ontimeout = null; - this._XHR.onloadend = null; - this._XHR = null; - } - } - - /** - * - * @param source - */ - public decodeURLVariables(source:string):Object - { - var result:Object = new Object(); - - source = source.split("+").join(" "); - - var tokens, re = /[?&]?([^=]+)=([^&]*)/g; - - while (tokens = re.exec(source)) - result[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); - - return result; - } - - // XMLHttpRequest - Event Handlers - - /** - * When XHR state changes - * @param event - */ - private onReadyStateChange(event:Event) - { - if (this._XHR.readyState == 4) { - if (this._XHR.status == 404) { - this._loadError = true; - - if (!this._loadErrorEvent) - this._loadErrorEvent = new away.events.IOErrorEvent(away.events.IOErrorEvent.IO_ERROR); - - this.dispatchEvent(this._loadErrorEvent); - } - - this.dispatchEvent(new away.events.HTTPStatusEvent(away.events.HTTPStatusEvent.HTTP_STATUS, this._XHR.status)); - } - } - - /** - * When the request has completed, regardless of whether or not it was successful. - * @param event - */ - private onLoadEnd(event:ProgressEvent) - { - if (this._loadError === true) - return; - } - - /** - * When the author specified timeout has passed before the request could complete. - * @param event - */ - private onTimeOut(event:Event) - { - //TODO: Timeout not currently implemented ( also not part of AS3 API ) - } - - /** - * When the request has been aborted, either by invoking the abort() method or navigating away from the page. - * @param event - */ - private onAbort(event:UIEvent) - { - // TODO: investigate whether this needs to be an IOError - } - - /** - * While loading and sending data. - * @param event - */ - private onProgress(event:ProgressEvent) - { - if (!this._progressEvent) - this._progressEvent = new away.events.ProgressEvent(away.events.ProgressEvent.PROGRESS); - - this._progressEvent.bytesTotal = event.total; - this._progressEvent.bytesLoaded = event.loaded; - - this.dispatchEvent(this._progressEvent); - } - - /** - * When the request starts. - * @param event - */ - private onLoadStart(event:ProgressEvent) - { - if (!this._loadStartEvent) - this._loadStartEvent = new away.events.Event(away.events.Event.OPEN); - - this.dispatchEvent(this._loadStartEvent); - } - - /** - * When the request has successfully completed. - * @param event - */ - private onLoadComplete(event:Event) - { - if (this._loadError === true) - return; - - switch (this._dataFormat) { - case URLLoaderDataFormat.TEXT: - this._data = this._XHR.responseText; - break; - - case URLLoaderDataFormat.VARIABLES: - this._data = this.decodeURLVariables(this._XHR.responseText); - break; - - case URLLoaderDataFormat.BLOB: - case URLLoaderDataFormat.ARRAY_BUFFER: - case URLLoaderDataFormat.BINARY: - this._data = this._XHR.response; - break; - - default: - this._data = this._XHR.responseText; - break; - } - - if (!this._loadCompleteEvent) - this._loadCompleteEvent = new away.events.Event(away.events.Event.COMPLETE); - - this.dispatchEvent(this._loadCompleteEvent); - } - - /** - * When the request has failed. ( due to network issues ). - * @param event - */ - private onLoadError(event:Event) - { - this._loadError = true; - - if (!this._loadErrorEvent) - this._loadErrorEvent = new away.events.IOErrorEvent(away.events.IOErrorEvent.IO_ERROR); - - this.dispatchEvent(this._loadErrorEvent); - } - } -} \ No newline at end of file diff --git a/src/away/core/net/URLLoaderDataFormat.ts b/src/away/core/net/URLLoaderDataFormat.ts deleted file mode 100644 index 40dcfdaa..00000000 --- a/src/away/core/net/URLLoaderDataFormat.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// -module away.net -{ - export class URLLoaderDataFormat - { - /** - * TEXT - * @type {string} - */ - public static TEXT:string = 'text'; - - /** - * Variables / Value Pairs - * @type {string} - */ - public static VARIABLES:string = 'variables'; - - /** - * - * @type {string} - */ - public static BLOB:string = 'blob'; - - /** - * - * @type {string} - */ - public static ARRAY_BUFFER:string = 'arraybuffer'; - - /** - * - * @type {string} - */ - public static BINARY:string = 'binary'; - } -} diff --git a/src/away/core/net/URLRequest.ts b/src/away/core/net/URLRequest.ts deleted file mode 100644 index 14f4bae2..00000000 --- a/src/away/core/net/URLRequest.ts +++ /dev/null @@ -1,77 +0,0 @@ -/// -module away.net -{ - /** - * - */ - export class URLRequest - { - /* - * The MIME content type of the content in the the data property. - * @type {string} - */ - //public contentType : string = 'application/x-www-form-urlencoded'; //Note: Not used for now. - - /** - * Object containing data to be transmited with URL Request ( URL Variables / binary / string ) - * - */ - public data:any; - - /** - * - * away.net.URLRequestMethod.GET - * away.net.URLRequestMethod.POST - * - * @type {string} - */ - public method:string = URLRequestMethod.GET; - - /** - * Use asynchronous XMLHttpRequest - * @type {boolean} - */ - public async:boolean = true; - - /** - * - */ - private _url:string; - - /** - - * @param url - */ - constructor(url:string = null) - { - this._url = url; - } - - /** - * - * @returns {string} - */ - public get url():string - { - return this._url; - } - - /** - * - * @param value - */ - public set url(value:string) - { - this._url = value; - } - - /** - * dispose - */ - public dispose():void - { - this.data = null; - this._url = null; - } - } -} \ No newline at end of file diff --git a/src/away/core/net/URLRequestMethod.ts b/src/away/core/net/URLRequestMethod.ts deleted file mode 100644 index 3a49e1c2..00000000 --- a/src/away/core/net/URLRequestMethod.ts +++ /dev/null @@ -1,17 +0,0 @@ -/// -module away.net -{ - export class URLRequestMethod - { - /** - * - * @type {string} - */ - public static POST:string = 'POST'; - /** - * - * @type {string} - */ - public static GET:string = 'GET'; - } -} diff --git a/src/away/core/net/URLVariables.ts b/src/away/core/net/URLVariables.ts deleted file mode 100644 index a4a7e903..00000000 --- a/src/away/core/net/URLVariables.ts +++ /dev/null @@ -1,74 +0,0 @@ -/// - -module away.net -{ - export class URLVariables - { - private _variables:Object = new Object(); - - /** - * - * @param source - */ - constructor(source:string = null) - { - if (source !== null) - this.decode(source); - } - - /** - * - * @param source - */ - public decode(source:string):void - { - source = source.split("+").join(" "); - - var tokens, re = /[?&]?([^=]+)=([^&]*)/g; - - while (tokens = re.exec(source)) - this._variables[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); - } - - /** - * - * @returns {string} - */ - public toString():string - { - return ''; - } - - /** - * - * @returns {Object} - */ - public get variables():Object - { - return this._variables; - } - - /** - * - * @returns {Object} - */ - public get formData():FormData - { - var fd:FormData = new FormData(); - - for (var s in this._variables) - fd.append(s, this._variables[s]); - - return fd; - } - - /** - * - * @returns {Object} - */ - public set variables(obj:Object) - { - this._variables = obj; - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/CameraNode.ts b/src/away/core/partition/CameraNode.ts deleted file mode 100644 index 01923daf..00000000 --- a/src/away/core/partition/CameraNode.ts +++ /dev/null @@ -1,29 +0,0 @@ -/// - -/** - * @module away.partition - */ -module away.partition -{ - import IEntity = away.entities.IEntity; - import ICollector = away.traverse.ICollector; - - /** - * @class away.partition.CameraNode - */ - export class CameraNode extends EntityNode - { - constructor(camera:IEntity) - { - super(camera); - } - - /** - * @inheritDoc - */ - public acceptTraverser(traverser:ICollector) - { - // todo: dead end for now, if it has a debug mesh, then sure accept that - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/DirectionalLightNode.ts b/src/away/core/partition/DirectionalLightNode.ts deleted file mode 100644 index 5b34a021..00000000 --- a/src/away/core/partition/DirectionalLightNode.ts +++ /dev/null @@ -1,47 +0,0 @@ -/// - -/** - * @module away.partition - */ -module away.partition -{ - import IEntity = away.entities.IEntity; - import ICollector = away.traverse.ICollector; - - /** - * @class away.partition.DirectionalLightNode - */ - export class DirectionalLightNode extends EntityNode - { - private _directionalLight:IEntity; - - /** - * - * @param directionalLight - */ - constructor(directionalLight:IEntity) - { - super(directionalLight); - - this._directionalLight = directionalLight; - } - - /** - * @inheritDoc - */ - public acceptTraverser(traverser:ICollector) - { - if (traverser.enterNode(this)) - traverser.applyDirectionalLight(this._directionalLight); - } - - /** - * - * @returns {boolean} - */ - public isCastingShadow():boolean - { - return false; - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/EntityNode.ts b/src/away/core/partition/EntityNode.ts deleted file mode 100644 index f0085677..00000000 --- a/src/away/core/partition/EntityNode.ts +++ /dev/null @@ -1,94 +0,0 @@ -/// - -/** - * @module away.partition - */ -module away.partition -{ - import IEntity = away.entities.IEntity; - import Plane3D = away.geom.Plane3D; - import Vector3D = away.geom.Vector3D; - import ICollector = away.traverse.ICollector; - - /** - * @class away.partition.EntityNode - */ - export class EntityNode extends NodeBase - { - - private _entity:IEntity; - public _iUpdateQueueNext:EntityNode; - - constructor(entity:IEntity) - { - super(); - this._entity = entity; - this._iNumEntities = 1; - } - - public get entity():IEntity - { - return this._entity; - } - - public removeFromParent():void - { - if (this._iParent) - this._iParent.iRemoveNode(this); - - this._iParent = null; - } - - /** - * - * @returns {boolean} - */ - public isCastingShadow():boolean - { - return this.entity.castsShadows; - } - - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - */ - public isInFrustum(planes:Array, numPlanes:number):boolean - { - if (!this._entity._iIsVisible()) - return false; - - return this._entity.worldBounds.isInFrustum(planes, numPlanes); - } - - /** - * @inheritDoc - */ - public acceptTraverser(traverser:ICollector) - { - if (traverser.enterNode(this)) - traverser.applyEntity(this._entity); - } - - /** - * @inheritDoc - */ - public isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean - { - if (!this._entity._iIsVisible()) - return false; - - return this._entity.isIntersectingRay(rayPosition, rayDirection); - } - - /** - * - * @protected - */ - public _pCreateBoundsPrimitive():IEntity - { - return this._entity.bounds.boundingEntity; - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/LightProbeNode.ts b/src/away/core/partition/LightProbeNode.ts deleted file mode 100644 index 29546658..00000000 --- a/src/away/core/partition/LightProbeNode.ts +++ /dev/null @@ -1,47 +0,0 @@ -/// - -/** - * @module away.partition - */ -module away.partition -{ - import IEntity = away.entities.IEntity; - import ICollector = away.traverse.ICollector; - - /** - * @class away.partition.LightProbeNode - */ - export class LightProbeNode extends EntityNode - { - private _lightProbe:IEntity; - - /** - * - * @param lightProbe - */ - constructor(lightProbe:IEntity) - { - super(lightProbe); - - this._lightProbe = lightProbe; - } - - /** - * @inheritDoc - */ - public acceptTraverser(traverser:ICollector) - { - if (traverser.enterNode(this)) - traverser.applyLightProbe(this._lightProbe); - } - - /** - * - * @returns {boolean} - */ - public isCastingShadow():boolean - { - return false; - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/NodeBase.ts b/src/away/core/partition/NodeBase.ts deleted file mode 100644 index d0937b05..00000000 --- a/src/away/core/partition/NodeBase.ts +++ /dev/null @@ -1,245 +0,0 @@ -/// - - -/** - * @module away.partition - */ -module away.partition -{ - import IEntity = away.entities.IEntity; - import Plane3D = away.geom.Plane3D; - import Vector3D = away.geom.Vector3D; - import ICollector = away.traverse.ICollector; - - /** - * @class away.partition.NodeBase - */ - export class NodeBase - { - private _boundsChildrenVisible:boolean; - private _explicitBoundsVisible:boolean; - private _implicitBoundsVisible:boolean; - public _iParent:NodeBase; - public _pChildNodes:Array; - public _pNumChildNodes:number = 0; - public _pBoundsPrimitive:IEntity; - - public _iNumEntities:number = 0; - public _iCollectionMark:number;// = 0; - - /** - * - */ - public get boundsVisible():boolean - { - return this._explicitBoundsVisible; - } - - public set boundsVisible(value:boolean) - { - if (this._explicitBoundsVisible == value) - return; - - this._explicitBoundsVisible = value; - - this._iUpdateImplicitBoundsVisible(this._iParent? this._iParent.boundsChildrenVisible : false); - - } - - public get boundsChildrenVisible():boolean - { - return this._boundsChildrenVisible; - } - - public set boundsChildrenVisible(value:boolean) - { - if (this._boundsChildrenVisible == value) - return; - - this._boundsChildrenVisible = value; - - for (var i:number = 0; i < this._pNumChildNodes; ++i) - this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); - } - - /** - * - */ - public get parent():NodeBase - { - return this._iParent; - } - - /** - * - * @protected - */ - public get _pNumEntities():number - { - return this._iNumEntities; - } - - /** - * - */ - constructor() - { - this._pChildNodes = new Array(); - } - - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - * @internal - */ - public isInFrustum(planes:Array, numPlanes:number):boolean - { - return true; - } - - /** - * - * @param rayPosition - * @param rayDirection - * @returns {boolean} - */ - public isIntersectingRay(rayPosition:Vector3D, rayDirection:Vector3D):boolean - { - return true; - } - - /** - * - * @returns {boolean} - */ - public isCastingShadow():boolean - { - return true; - } - - /** - * - * @param entity - * @returns {away.partition.NodeBase} - */ - public findPartitionForEntity(entity:IEntity):NodeBase - { - return this; - } - - /** - * - * @param traverser - */ - public acceptTraverser(traverser:ICollector) - { - if (this._pNumEntities == 0 && !this._implicitBoundsVisible) - return; - - if (traverser.enterNode(this)) { - var i:number = 0; - - while (i < this._pNumChildNodes) - this._pChildNodes[i++].acceptTraverser(traverser); - - if (this._implicitBoundsVisible) - this._pBoundsPrimitive.partitionNode.acceptTraverser(traverser); - } - } - - /** - * - * @protected - */ - public _pCreateBoundsPrimitive():IEntity - { - return null; - } - - /** - * - * @param node - * @internal - */ - public iAddNode(node:NodeBase) - { - node._iParent = this; - this._iNumEntities += node._pNumEntities; - this._pChildNodes[ this._pNumChildNodes++ ] = node; - - node._iUpdateImplicitBoundsVisible(this.boundsChildrenVisible); - - var numEntities:number = node._pNumEntities; - node = this; - - do { - node._iNumEntities += numEntities; - } while ((node = node._iParent) != null); - } - - /** - * - * @param node - * @internal - */ - public iRemoveNode(node:NodeBase) - { - var index:number = this._pChildNodes.indexOf(node); - this._pChildNodes[index] = this._pChildNodes[--this._pNumChildNodes]; - this._pChildNodes.pop(); - - node._iUpdateImplicitBoundsVisible(false); - - var numEntities:number = node._pNumEntities; - node = this; - - do { - node._pNumEntities -= numEntities; - } while ((node = node._iParent) != null); - } - - private _iUpdateImplicitBoundsVisible(value:boolean) - { - if (this._implicitBoundsVisible == this._explicitBoundsVisible || value) - return; - - this._implicitBoundsVisible = this._explicitBoundsVisible || value; - - this._iUpdateEntityBounds(); - - for (var i:number = 0; i < this._pNumChildNodes; ++i) - this._pChildNodes[i]._iUpdateImplicitBoundsVisible(this._boundsChildrenVisible); - } - - /** - * @internal - */ - public _iIsBoundsVisible():boolean - { - return this._implicitBoundsVisible; - } - -// public _pUpdateNumEntities(value:number) -// { -// var diff:number = value - this._pNumEntities; -// var node:NodeBase = this; -// -// do { -// node._pNumEntities += diff; -// } while ((node = node._iParent) != null); -// } - - public _iUpdateEntityBounds() - { - if (this._pBoundsPrimitive) { - this._pBoundsPrimitive.dispose(); - this._pBoundsPrimitive = null; - } - - if (this._implicitBoundsVisible) - this._pBoundsPrimitive = this._pCreateBoundsPrimitive(); - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/NullNode.ts b/src/away/core/partition/NullNode.ts deleted file mode 100644 index f639b758..00000000 --- a/src/away/core/partition/NullNode.ts +++ /dev/null @@ -1,17 +0,0 @@ -/// - -/** - * @module away.partition - */ -module away.partition -{ - /** - * @class away.partition.NullNode - */ - export class NullNode - { - constructor() - { - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/Partition.ts b/src/away/core/partition/Partition.ts deleted file mode 100644 index 1ec20da1..00000000 --- a/src/away/core/partition/Partition.ts +++ /dev/null @@ -1,108 +0,0 @@ -/// - -/** - * @module away.partition - */ -module away.partition -{ - import DisplayObject = away.base.DisplayObject; - import ICollector = away.traverse.ICollector; - - /** - * @class away.partition.Partition - */ - export class Partition - { - - public _rootNode:NodeBase; - private _updatesMade:Boolean = false; - private _updateQueue:EntityNode; - - constructor(rootNode:NodeBase) - { - this._rootNode = rootNode || new NullNode(); - } - - public get rootNode():NodeBase - { - return this._rootNode; - } - - public traverse(traverser:ICollector) - { - if (this._updatesMade) - this.updateEntities(); - - this._rootNode.acceptTraverser(traverser); - } - - public iMarkForUpdate(entity:away.base.DisplayObject) - { - var node:EntityNode = entity.partitionNode; - var t:EntityNode = this._updateQueue; - - while (t) { - if (node == t) - return; - - t = t._iUpdateQueueNext; - } - - node._iUpdateQueueNext = this._updateQueue; - - this._updateQueue = node; - this._updatesMade = true; - } - - public iRemoveEntity(entity:DisplayObject) - { - var node:EntityNode = entity.partitionNode; - var t:EntityNode; - - node.removeFromParent(); - - if (node == this._updateQueue) { - this._updateQueue = node._iUpdateQueueNext; - } else { - t = this._updateQueue; - while (t && t._iUpdateQueueNext != node) - t = t._iUpdateQueueNext; - - if (t) - t._iUpdateQueueNext = node._iUpdateQueueNext; - } - - node._iUpdateQueueNext = null; - - if (!this._updateQueue) - this._updatesMade = false; - } - - private updateEntities() - { - var node:EntityNode = this._updateQueue; - var targetNode:NodeBase; - var t:EntityNode; - this._updateQueue = null; - this._updatesMade = false; - - do { - targetNode = this._rootNode.findPartitionForEntity(node.entity); - - if (node.parent != targetNode) { - if (node) - node.removeFromParent(); - - targetNode.iAddNode(node); - } - - t = node._iUpdateQueueNext; - node._iUpdateQueueNext = null; - - //required for controllers with autoUpdate set to true - node.entity._iInternalUpdate(); - - } while ((node = t) != null); - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/PointLightNode.ts b/src/away/core/partition/PointLightNode.ts deleted file mode 100644 index eb761d2d..00000000 --- a/src/away/core/partition/PointLightNode.ts +++ /dev/null @@ -1,47 +0,0 @@ -/// - -/** - * @module away.partition - */ -module away.partition -{ - import IEntity = away.entities.IEntity; - import ICollector = away.traverse.ICollector; - - /** - * @class away.partition.PointLightNode - */ - export class PointLightNode extends EntityNode - { - private _pointLight:IEntity; - - /** - * - * @param pointLight - */ - constructor(pointLight:IEntity) - { - super(pointLight); - - this._pointLight = pointLight; - } - - /** - * @inheritDoc - */ - public acceptTraverser(traverser:ICollector) - { - if (traverser.enterNode( this)) - traverser.applyPointLight(this._pointLight); - } - - /** - * - * @returns {boolean} - */ - public isCastingShadow():boolean - { - return false; - } - } -} \ No newline at end of file diff --git a/src/away/core/partition/SkyboxNode.ts b/src/away/core/partition/SkyboxNode.ts deleted file mode 100644 index 622742b7..00000000 --- a/src/away/core/partition/SkyboxNode.ts +++ /dev/null @@ -1,56 +0,0 @@ -/// - -/** - * @module away.partition - */ -module away.partition -{ - import IEntity = away.entities.IEntity; - import Plane3D = away.geom.Plane3D; - import ICollector = away.traverse.ICollector; - - /** - * SkyboxNode is a space partitioning leaf node that contains a Skybox object. - * - * @class away.partition.SkyboxNode - */ - export class SkyboxNode extends EntityNode - { - private _skyBox:IEntity; - - /** - * Creates a new SkyboxNode object. - * @param skyBox The Skybox to be contained in the node. - */ - constructor(skyBox:IEntity) - { - super(skyBox); - - this._skyBox = skyBox; - } - - /** - * @inheritDoc - */ - public acceptTraverser(traverser:ICollector) - { - if (traverser.enterNode( this)) - traverser.applySkybox(this._skyBox); - } - - /** - * - * @param planes - * @param numPlanes - * @returns {boolean} - */ - public isInFrustum(planes:Array, numPlanes:number):boolean - { - if (!this._skyBox._iIsVisible) - return false; - - //a skybox is always in view unless its visibility is set to false - return true; - } - } -} diff --git a/src/away/core/pick/IPicker.ts b/src/away/core/pick/IPicker.ts deleted file mode 100644 index c675a4d4..00000000 --- a/src/away/core/pick/IPicker.ts +++ /dev/null @@ -1,47 +0,0 @@ -/// - -/** - * @module away.pick - */ -module away.pick -{ - import Scene = away.containers.Scene; - import View = away.containers.View; - import Vector3D = away.geom.Vector3D; - - /** - * Provides an interface for picking objects that can pick 3d objects from a view or scene. - * - * @interface away.pick.IPicker - */ - export interface IPicker - { - /** - * Gets the collision object from the screen coordinates of the picking ray. - * - * @param x The x coordinate of the picking ray in screen-space. - * @param y The y coordinate of the picking ray in screen-space. - * @param view The view on which the picking object acts. - */ - getViewCollision(x:number, y:number, view:View):PickingCollisionVO; - - /** - * Gets the collision object from the scene position and direction of the picking ray. - * - * @param position The position of the picking ray in scene-space. - * @param direction The direction of the picking ray in scene-space. - * @param scene The scene on which the picking object acts. - */ - getSceneCollision(position:Vector3D, direction:Vector3D, scene:Scene):PickingCollisionVO; - - /** - * Determines whether the picker takes account of the mouseEnabled properties of entities. Defaults to true. - */ - onlyMouseEnabled:boolean; // GET / SET - - /** - * Disposes memory used by the IPicker object - */ - dispose(); - } -} diff --git a/src/away/core/pick/IPickingCollider.ts b/src/away/core/pick/IPickingCollider.ts deleted file mode 100644 index a085feb1..00000000 --- a/src/away/core/pick/IPickingCollider.ts +++ /dev/null @@ -1,49 +0,0 @@ -/// - -/** - * @module away.pick - */ -module away.pick -{ - import Vector3D = away.geom.Vector3D; - import IEntity = away.entities.IEntity; - - /** - * Provides an interface for picking colliders that can be assigned to individual entities in a scene for specific picking behaviour. - * Used with the RaycastPicker picking object. - * - * @see away.entities.Entity#pickingCollider - * @see away.pick.RaycastPicker - * - * @interface away.pick.IPickingCollider - */ - export interface IPickingCollider - { - /** - * Sets the position and direction of a picking ray in local coordinates to the entity. - * - * @param localDirection The position vector in local coordinates - * @param localPosition The direction vector in local coordinates - */ - setLocalRay(localPosition:Vector3D, localDirection:Vector3D); - - /** - * Tests a Billboard object for a collision with the picking ray. - * - * @param entity The entity instance to be tested. - * @param pickingCollisionVO The collision object used to store the collision results - * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray. - */ - testBillboardCollision(entity:IEntity, pickingCollisionVO:PickingCollisionVO, shortestCollisionDistance:number):boolean - - /** - * Tests a Mesh object for a collision with the picking ray. - * - * @param entity The entity instance to be tested. - * @param pickingCollisionVO The collision object used to store the collision results - * @param shortestCollisionDistance The current value of the shortest distance to a detected collision along the ray. - * @param findClosest - */ - testMeshCollision(entity:IEntity, pickingCollisionVO:PickingCollisionVO, shortestCollisionDistance:number, findClosest:boolean):boolean - } -} diff --git a/src/away/core/pick/PickingCollisionVO.ts b/src/away/core/pick/PickingCollisionVO.ts deleted file mode 100644 index 312a0af1..00000000 --- a/src/away/core/pick/PickingCollisionVO.ts +++ /dev/null @@ -1,100 +0,0 @@ -/// -/** - * @module away.pick - */ -module away.pick -{ - import DisplayObject = away.base.DisplayObject; - import IMaterialOwner = away.base.IMaterialOwner; - import Point = away.geom.Point; - import Vector3D = away.geom.Vector3D; - - /** - * Value object for a picking collision returned by a picking collider. Created as unique objects on display objects - * - * @see away.base.DisplayObject#pickingCollisionVO - * @see away.core.pick.IPickingCollider - * - * @class away.pick.PickingCollisionVO - */ - export class PickingCollisionVO - { - /** - * The display object to which this collision object belongs. - */ - public displayObject:DisplayObject; - - /** - * The local position of the collision on the entity's surface. - */ - public localPosition:Vector3D; - - /** - * The local normal vector at the position of the collision. - */ - public localNormal:Vector3D; - - /** - * The uv coordinate at the position of the collision. - */ - public uv:Point; - - /** - * The index of the face where the event took pl ace. - */ - public index:number; - - /** - * The index of the subGeometry where the event took place. - */ -// public subGeometryIndex:number; - - /** - * The starting position of the colliding ray in local coordinates. - */ - public localRayPosition:Vector3D; - - /** - * The direction of the colliding ray in local coordinates. - */ - public localRayDirection:Vector3D; - - /** - * The starting position of the colliding ray in scene coordinates. - */ - public rayPosition:Vector3D; - - /** - * The direction of the colliding ray in scene coordinates. - */ - public rayDirection:Vector3D; - - /** - * Determines if the ray position is contained within the entity bounds. - * - * @see away3d.entities.Entity#bounds - */ - public rayOriginIsInsideBounds:boolean; - - /** - * The distance along the ray from the starting position to the calculated intersection entry point with the entity. - */ - public rayEntryDistance:number; - - /** - * The material ownwer associated with a collision. - */ - public materialOwner:IMaterialOwner; - - /** - * Creates a new PickingCollisionVO object. - * - * @param entity The entity to which this collision object belongs. - */ - constructor(displayObject:DisplayObject) - { - this.displayObject = displayObject; - } - - } -} diff --git a/src/away/core/pick/RaycastPicker.ts b/src/away/core/pick/RaycastPicker.ts deleted file mode 100644 index 20a56da7..00000000 --- a/src/away/core/pick/RaycastPicker.ts +++ /dev/null @@ -1,209 +0,0 @@ -/// - -/** - * @module away.pick - */ -module away.pick -{ - import Scene = away.containers.Scene; - import View = away.containers.View; - import IEntity = away.entities.IEntity; - import Vector3D = away.geom.Vector3D; - import ICollector = away.traverse.ICollector; - import RaycastCollector = away.traverse.RaycastCollector; - - /** - * Picks a 3d object from a view or scene by 3D raycast calculations. - * Performs an initial coarse boundary calculation to return a subset of entities whose bounding volumes intersect with the specified ray, - * then triggers an optional picking collider on individual entity objects to further determine the precise values of the picking ray collision. - * - * @class away.pick.RaycastPicker - */ - export class RaycastPicker implements IPicker - { - private _findClosestCollision:boolean; - private _raycastCollector:RaycastCollector; - private _ignoredEntities = []; - private _onlyMouseEnabled:boolean = true; - - private _entities:Array; - private _numEntities:number = 0; - private _hasCollisions:boolean; - - /** - * @inheritDoc - */ - public get onlyMouseEnabled():boolean - { - return this._onlyMouseEnabled; - } - - public set onlyMouseEnabled(value:boolean) - { - this._onlyMouseEnabled = value; - } - - /** - * Creates a new RaycastPicker object. - * - * @param findClosestCollision Determines whether the picker searches for the closest bounds collision along the ray, - * or simply returns the first collision encountered. Defaults to false. - */ - constructor(findClosestCollision:boolean = false) - { - this._raycastCollector = new RaycastCollector(); - - this._findClosestCollision = findClosestCollision; - this._entities = new Array(); - } - - /** - * @inheritDoc - */ - public getViewCollision(x:number, y:number, view:away.containers.View):PickingCollisionVO - { - //update ray - var rayPosition:away.geom.Vector3D = view.unproject(x, y, 0); - var rayDirection:away.geom.Vector3D = view.unproject(x, y, 1).subtract(rayPosition); - - return this.getSceneCollision(rayPosition, rayDirection, view.scene); - } - - /** - * @inheritDoc - */ - public getSceneCollision(rayPosition:away.geom.Vector3D, rayDirection:away.geom.Vector3D, scene:away.containers.Scene):PickingCollisionVO - { - //clear collector - this._raycastCollector.clear(); - - //setup ray vectors - this._raycastCollector.rayPosition = rayPosition; - this._raycastCollector.rayDirection = rayDirection; - - // collect entities to test - scene.traversePartitions(this._raycastCollector); - - this._numEntities = 0; - var node:away.pool.EntityListItem = this._raycastCollector.entityHead; - var entity:IEntity; - - while (node) { - if (!this.isIgnored(entity = node.entity)) - this._entities[this._numEntities++] = entity; - - node = node.next; - } - - //early out if no collisions detected - if (!this._numEntities) - return null; - - return this.getPickingCollisionVO(this._raycastCollector); - } - -// public getEntityCollision(position:away.geom.Vector3D, direction:away.geom.Vector3D, entities:Array):PickingCollisionVO -// { -// this._numEntities = 0; -// -// var entity:IEntity; -// var l:number = entities.length; -// -// for (var c:number = 0; c < l; c++) { -// entity = entities[c]; -// -// if (entity.isIntersectingRay(position, direction)) -// this._entities[this._numEntities++] = entity; -// } -// -// return this.getPickingCollisionVO(this._raycastCollector); -// } - - public setIgnoreList(entities) - { - this._ignoredEntities = entities; - } - - private isIgnored(entity:IEntity):boolean - { - if (this._onlyMouseEnabled && !entity._iIsMouseEnabled()) - return true; - - var len:number = this._ignoredEntities.length; - for (var i:number = 0; i < len; i++) - if (this._ignoredEntities[i] == entity) - return true; - - return false; - } - - private sortOnNearT(entity1:IEntity, entity2:IEntity):number - { - return entity1._iPickingCollisionVO.rayEntryDistance > entity2._iPickingCollisionVO.rayEntryDistance? 1 : -1; - } - - private getPickingCollisionVO(collector:ICollector):PickingCollisionVO - { - // trim before sorting - this._entities.length = this._numEntities; - - // Sort entities from closest to furthest. - this._entities = this._entities.sort(this.sortOnNearT); // TODO - test sort filter in JS - - // --------------------------------------------------------------------- - // Evaluate triangle collisions when needed. - // Replaces collision data provided by bounds collider with more precise data. - // --------------------------------------------------------------------- - - var shortestCollisionDistance:number = Number.MAX_VALUE; - var bestCollisionVO:PickingCollisionVO; - var pickingCollisionVO:PickingCollisionVO; - var entity:IEntity; - var i:number; - - for (i = 0; i < this._numEntities; ++i) { - entity = this._entities[i]; - pickingCollisionVO = entity._iPickingCollisionVO; - if (entity.pickingCollider) { - // If a collision exists, update the collision data and stop all checks. - if ((bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) && entity._iTestCollision(shortestCollisionDistance, this._findClosestCollision)) { - shortestCollisionDistance = pickingCollisionVO.rayEntryDistance; - bestCollisionVO = pickingCollisionVO; - if (!this._findClosestCollision) { - this.updateLocalPosition(pickingCollisionVO); - return pickingCollisionVO; - } - } - } else if (bestCollisionVO == null || pickingCollisionVO.rayEntryDistance < bestCollisionVO.rayEntryDistance) { // A bounds collision with no triangle collider stops all checks. - // Note: a bounds collision with a ray origin inside its bounds is ONLY ever used - // to enable the detection of a corresponsding triangle collision. - // Therefore, bounds collisions with a ray origin inside its bounds can be ignored - // if it has been established that there is NO triangle collider to test - if (!pickingCollisionVO.rayOriginIsInsideBounds) { - this.updateLocalPosition(pickingCollisionVO); - return pickingCollisionVO; - } - } - } - - return bestCollisionVO; - } - - private updateLocalPosition(pickingCollisionVO:PickingCollisionVO) - { - var collisionPos:away.geom.Vector3D = ( pickingCollisionVO.localPosition == null )? new away.geom.Vector3D() : pickingCollisionVO.localPosition; - - var rayDir:away.geom.Vector3D = pickingCollisionVO.localRayDirection; - var rayPos:away.geom.Vector3D = pickingCollisionVO.localRayPosition; - var t:number = pickingCollisionVO.rayEntryDistance; - collisionPos.x = rayPos.x + t*rayDir.x; - collisionPos.y = rayPos.y + t*rayDir.y; - collisionPos.z = rayPos.z + t*rayDir.z; - } - - public dispose() - { - //TODO - } - } -} diff --git a/src/away/core/pool/CSSBillboardRenderable.ts b/src/away/core/pool/CSSBillboardRenderable.ts deleted file mode 100644 index a1b15c39..00000000 --- a/src/away/core/pool/CSSBillboardRenderable.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// - -/** - * @module away.data - */ -module away.pool -{ - /** - * @class away.pool.RenderableListItem - */ - export class CSSBillboardRenderable extends CSSRenderableBase - { - public static id:string = "billboard"; - - constructor(pool:RenderablePool, billboard:away.entities.Billboard) - { - super(pool, billboard, billboard); - - var div:HTMLDivElement = document.createElement("div"); - div.onmousedown = (event:MouseEvent) => false; - - this.htmlElement = div; - - var style:MSStyleCSSProperties = div.style; - - style.position = "absolute"; - style.transformOrigin - = style["-webkit-transform-origin"] - = style["-moz-transform-origin"] - = style["-o-transform-origin"] - = style["-ms-transform-origin"] = "0% 0%"; - - var img:HTMLDivElement = document.createElement("div"); - - div.appendChild(img); - - img.className = "material" + billboard.material.id; - } - } -} \ No newline at end of file diff --git a/src/away/core/pool/CSSLineSegmentRenderable.ts b/src/away/core/pool/CSSLineSegmentRenderable.ts deleted file mode 100644 index 22d04c4d..00000000 --- a/src/away/core/pool/CSSLineSegmentRenderable.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// - -/** - * @module away.data - */ -module away.pool -{ - /** - * @class away.pool.RenderableListItem - */ - export class CSSLineSegmentRenderable extends CSSRenderableBase - { - public static id:string = "lineSegment"; - - constructor(pool:RenderablePool, lineSegment:away.entities.LineSegment) - { - super(pool, lineSegment, lineSegment); - - var div:HTMLDivElement = document.createElement("div"); - div.onmousedown = (event:MouseEvent) => false; - - this.htmlElement = div; - - var style:MSStyleCSSProperties = div.style; - - style.position = "absolute"; - style.transformOrigin - = style["-webkit-transform-origin"] - = style["-moz-transform-origin"] - = style["-o-transform-origin"] - = style["-ms-transform-origin"] = "0% 0%"; - - var img:HTMLDivElement = document.createElement("div"); - - div.appendChild(img); - - img.className = "material" + lineSegment.material.id; - } - } -} \ No newline at end of file diff --git a/src/away/core/pool/CSSRenderableBase.ts b/src/away/core/pool/CSSRenderableBase.ts deleted file mode 100644 index 28a25069..00000000 --- a/src/away/core/pool/CSSRenderableBase.ts +++ /dev/null @@ -1,110 +0,0 @@ -/// - -/** - * @module away.data - */ -module away.pool -{ - /** - * @class away.pool.RenderableListItem - */ - export class CSSRenderableBase implements away.pool.IRenderable - { - /** - * - */ - private _pool:RenderablePool; - - /** - * - */ - public next:CSSRenderableBase; - - /** - * - */ - public materialId:number; - - /** - * - */ - public renderOrderId:number; - - /** - * - */ - public zIndex:number; - - /** - * - */ - public cascaded:boolean; - - /** - * - */ - public renderSceneTransform:away.geom.Matrix3D; - - /** - * - */ - public sourceEntity:away.entities.IEntity; - - /** - * - */ - public materialOwner:away.base.IMaterialOwner; - - /** - * - */ - public htmlElement:HTMLElement; - - /** - * - * @param sourceEntity - * @param material - * @param animator - */ - constructor(pool:RenderablePool, sourceEntity:away.entities.IEntity, materialOwner:away.base.IMaterialOwner) - { - //store a reference to the pool for later disposal - this._pool = pool; - - this.sourceEntity = sourceEntity; - this.materialOwner = materialOwner; - } - - /** - * - */ - public dispose() - { - this._pool.disposeItem(this.materialOwner); - } - - /** - * - */ - public invalidateGeometry() - { - - } - - /** - * - */ - public invalidateIndexData() - { - - } - - /** - * - */ - public invalidateVertexData(dataType:string) - { - - } - } -} \ No newline at end of file diff --git a/src/away/core/pool/CSSSkyboxRenderable.ts b/src/away/core/pool/CSSSkyboxRenderable.ts deleted file mode 100644 index 3d4b56da..00000000 --- a/src/away/core/pool/CSSSkyboxRenderable.ts +++ /dev/null @@ -1,42 +0,0 @@ -/// - -/** - * @module away.data - */ -module away.pool -{ - /** - * @class away.pool.CSSSkyboxRenderable - */ - export class CSSSkyboxRenderable extends CSSRenderableBase - { - public static id:string = "skybox"; - - constructor(pool:RenderablePool, skyBox:away.entities.Skybox) - { - super(pool, skyBox, skyBox); - - var div:HTMLDivElement = document.createElement("div"); - div.onmousedown = (event:MouseEvent) => false; - - this.htmlElement = div; - - var style:MSStyleCSSProperties = div.style; - var img:HTMLDivElement; - - //create the six images that make up the skybox - style.position = "absolute"; - style.transformOrigin - = style["-webkit-transform-origin"] - = style["-moz-transform-origin"] - = style["-o-transform-origin"] - = style["-ms-transform-origin"] = "0% 0%"; - - img = document.createElement("div"); - - div.appendChild(img); - - img.className = "material" + skyBox.material.id; - } - } -} \ No newline at end of file diff --git a/src/away/core/pool/EntityListItem.ts b/src/away/core/pool/EntityListItem.ts deleted file mode 100644 index 756bdd19..00000000 --- a/src/away/core/pool/EntityListItem.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// - -/** - * @module away.pool - */ -module away.pool -{ - /** - * @class away.pool.EntityListItem - */ - export class EntityListItem - { - /** - * - */ - public entity:away.entities.IEntity; - - /** - * - */ - public next:EntityListItem; - } -} \ No newline at end of file diff --git a/src/away/core/pool/EntityListItemPool.ts b/src/away/core/pool/EntityListItemPool.ts deleted file mode 100644 index 773a34f4..00000000 --- a/src/away/core/pool/EntityListItemPool.ts +++ /dev/null @@ -1,54 +0,0 @@ -/// - -/** - * @module away.pool - */ -module away.pool -{ - /** - * @class away.pool.EntityListItemPool - */ - export class EntityListItemPool - { - private _pool:EntityListItem[]; - private _index:number = 0; - private _poolSize:number = 0; - - /** - * - */ - constructor() - { - this._pool = []; - } - - /** - * - */ - public getItem():EntityListItem - { - var item:EntityListItem; - if (this._index == this._poolSize) { - item = new EntityListItem(); - this._pool[this._index++] = item; - ++this._poolSize; - } else { - item = this._pool[this._index++]; - } - return item; - } - - /** - * - */ - public freeAll() - { - this._index = 0; - } - - public dispose() - { - this._pool.length = 0; - } - } -} \ No newline at end of file diff --git a/src/away/core/pool/IMaterialData.ts b/src/away/core/pool/IMaterialData.ts deleted file mode 100644 index fe3e8000..00000000 --- a/src/away/core/pool/IMaterialData.ts +++ /dev/null @@ -1,31 +0,0 @@ -/// - -/** - * @module away.pool - */ -module away.pool -{ - /** - * IMaterialData is an interface for classes that are used in the rendering pipeline to render the - * contents of a texture - * - * @class away.pool.IMaterialData - */ - export interface IMaterialData - { - /** - * - */ - dispose(); - - /** - * - */ - invalidateMaterial(); - - /** - * - */ - invalidateAnimation(); - } -} diff --git a/src/away/core/pool/IMaterialPassData.ts b/src/away/core/pool/IMaterialPassData.ts deleted file mode 100644 index 68490495..00000000 --- a/src/away/core/pool/IMaterialPassData.ts +++ /dev/null @@ -1,33 +0,0 @@ -/// - -/** - * @module away.pool - */ -module away.pool -{ - import IMaterialPass = away.materials.IMaterialPass; - - /** - * IMaterialPassData is an interface for classes that are used in the rendering pipeline to render the - * contents of a material pass - * - * @class away.pool.IMaterialPassData - */ - export interface IMaterialPassData - { - /** - * - */ - materialPass:IMaterialPass; - - /** - * - */ - dispose(); - - /** - * - */ - invalidate(); - } -} diff --git a/src/away/core/pool/IRenderable.ts b/src/away/core/pool/IRenderable.ts deleted file mode 100644 index 6bfe7c4a..00000000 --- a/src/away/core/pool/IRenderable.ts +++ /dev/null @@ -1,67 +0,0 @@ -/// - -/** - * @module away.pool - */ -module away.pool -{ - /** - * IRenderable is an interface for classes that are used in the rendering pipeline to render the - * contents of a partition - * - * @class away.render.IRenderable - */ - export interface IRenderable - { - /** - * - */ - next:IRenderable; - - - /** - * - */ - materialId:number; - - /** - * - */ - materialOwner:away.base.IMaterialOwner; - - /** - * - */ - sourceEntity:away.entities.IEntity; - - /** - * - */ - renderOrderId:number; - - /** - * - */ - zIndex:number; - - /** - * - */ - dispose(); - - /** - * - */ - invalidateGeometry(); - - /** - * - */ - invalidateIndexData(); - - /** - * - */ - invalidateVertexData(dataType:string); - } -} diff --git a/src/away/core/pool/IRenderableClass.ts b/src/away/core/pool/IRenderableClass.ts deleted file mode 100644 index 148374f9..00000000 --- a/src/away/core/pool/IRenderableClass.ts +++ /dev/null @@ -1,26 +0,0 @@ -/// - -/** - * @module away.pool - */ -module away.pool -{ - /** - * IRenderableClass is an interface for the constructable class definition IRenderable that is used to - * create renderable objects in the rendering pipeline to render the contents of a partition - * - * @class away.render.IRenderableClass - */ - export interface IRenderableClass - { - /** - * - */ - id:string; - - /** - * - */ - new(pool:RenderablePool, materialOwner:away.base.IMaterialOwner):IRenderable; - } -} diff --git a/src/away/core/pool/ITextureData.ts b/src/away/core/pool/ITextureData.ts deleted file mode 100644 index 3b32127f..00000000 --- a/src/away/core/pool/ITextureData.ts +++ /dev/null @@ -1,26 +0,0 @@ -/// - -/** - * @module away.pool - */ -module away.pool -{ - /** - * ITextureData is an interface for classes that are used in the rendering pipeline to render the - * contents of a texture - * - * @class away.pool.ITextureData - */ - export interface ITextureData - { - /** - * - */ - dispose(); - - /** - * - */ - invalidate(); - } -} diff --git a/src/away/core/pool/RenderablePool.ts b/src/away/core/pool/RenderablePool.ts deleted file mode 100644 index 781a5b3f..00000000 --- a/src/away/core/pool/RenderablePool.ts +++ /dev/null @@ -1,78 +0,0 @@ -/// - -/** - * @module away.pool - */ -module away.pool -{ - /** - * @class away.pool.RenderablePool - */ - export class RenderablePool - { - private static _pools:Object = new Object(); - - private _pool:Object = new Object(); - private _renderableClass:IRenderableClass; - - /** - * //TODO - * - * @param renderableClass - */ - constructor(renderableClass:IRenderableClass) - { - this._renderableClass = renderableClass; - } - - /** - * //TODO - * - * @param materialOwner - * @returns IRenderable - */ - public getItem(materialOwner:away.base.IMaterialOwner):IRenderable - { - return (this._pool[materialOwner.id] || (this._pool[materialOwner.id] = materialOwner._iAddRenderable(new this._renderableClass(this, materialOwner)))) - } - - /** - * //TODO - * - * @param materialOwner - */ - public disposeItem(materialOwner:away.base.IMaterialOwner) - { - materialOwner._iRemoveRenderable(this._pool[materialOwner.id]); - - this._pool[materialOwner.id] = null; - } - - /** - * //TODO - * - * @param renderableClass - * @returns RenderablePool - */ - public static getPool(renderableClass:IRenderableClass):RenderablePool - { - var pool:RenderablePool = RenderablePool._pools[renderableClass.id]; - - if (pool != undefined) - return pool; - - return (RenderablePool._pools[renderableClass.id] = new RenderablePool(renderableClass)); - } - - /** - * //TODO - * - * @param renderableClass - */ - public static disposePool(renderableClass:any) - { - if (RenderablePool._pools[renderableClass.id]) - RenderablePool._pools[renderableClass.id] = undefined; - } - } -} \ No newline at end of file diff --git a/src/away/core/render/CSSDefaultRenderer.ts b/src/away/core/render/CSSDefaultRenderer.ts deleted file mode 100644 index 0f78cdcd..00000000 --- a/src/away/core/render/CSSDefaultRenderer.ts +++ /dev/null @@ -1,240 +0,0 @@ -/// - -/** - * @module away.render - */ -module away.render -{ - /** - * The DefaultRenderer class provides the default rendering method. It renders the scene graph objects using the - * materials assigned to them. - * - * @class away.render.DefaultRenderer - */ - export class CSSDefaultRenderer extends CSSRendererBase implements IRenderer - { - private _container:HTMLDivElement; - private _context:HTMLDivElement; - private _contextStyle:MSStyleCSSProperties; - private _contextMatrix:away.geom.Matrix3D = new away.geom.Matrix3D(); - - private _activeMaterial:away.materials.CSSMaterialBase; - private _skyboxProjection:away.geom.Matrix3D = new away.geom.Matrix3D(); - private _transform:away.geom.Matrix3D = new away.geom.Matrix3D(); - - /** - * Creates a new CSSDefaultRenderer object. - */ - constructor() - { - super(); - - //create container for the renderer - this._container = document.createElement("div"); - this._container.style.overflow = "hidden"; - this._container.style.position = "absolute"; - - //add container to body - document.body.appendChild(this._container); - - //create conxtext for the renderer - this._context = document.createElement("div"); - this._contextStyle = this._context.style; - this._contextStyle.position = "absolute"; - this._contextStyle.transformStyle - = this._contextStyle["-webkit-transform-style"] - = this._contextStyle["-moz-transform-style"] - = this._contextStyle["-o-transform-style"] - = this._contextStyle["-ms-transform-style"] = "preserve-3d"; - this._contextStyle.transformOrigin - = this._contextStyle["-webkit-transform-origin"] - = this._contextStyle["-moz-transform-origin"] - = this._contextStyle["-o-transform-origin"] - = this._contextStyle["-ms-transform-origin"] = "0% 0%"; - - //add context to container - this._container.appendChild(this._context); - } - - /** - * - * @param entityCollector - */ - public render(entityCollector:away.traverse.ICollector) - { - super.render(entityCollector); - - if (this._pBackBufferInvalid)// reset or update render settings - this.pUpdateBackBuffer(); - - this._iRender( entityCollector); - - this._pBackBufferInvalid = false; - } - - /** - * @inheritDoc - */ - public pDraw(entityCollector:away.traverse.EntityCollector) - { -// if (entityCollector.skyBox) { -// if (this._activeMaterial) -// this._activeMaterial.iDeactivate(this._pStageGL); -// -// this._activeMaterial = null; -// -// this._pContext.setDepthTest(false, away.gl.ContextGLCompareMode.ALWAYS); -// this.drawSkybox(entityCollector); -// -// } -// -// var which:number = target? DefaultRenderer.SCREEN_PASSES : DefaultRenderer.ALL_PASSES; - - var sheet:CSSStyleSheet = document.styleSheets[document.styleSheets.length - 1]; - - for (var i:number = 0; i < sheet.cssRules.length; i++) { - var style:MSStyleCSSProperties = ( sheet.cssRules[i]).style; - style.transform - = style["-webkit-transform"] - = style["-moz-transform"] - = style["-o-transform"] - = style["-ms-transform"] = (entityCollector.camera.projection.coordinateSystem == away.projections.CoordinateSystem.RIGHT_HANDED)? "" : "scale3d(1, -1, 1) translateY(-" + style.height + ")"; - } - - this.drawRenderables(this._renderableHead, entityCollector); - -// if (this._activeMaterial) -// this._activeMaterial.iDeactivate(this._pStageGL); - - this._activeMaterial = null; - } - - /** - * Updates the backbuffer properties. - */ - public pUpdateBackBuffer() - { - this._container.style.width = this._width + "px"; - this._container.style.height = this._height + "px"; - this._container.style.clip = "rect(0px, " + this._width + "px, " + this._height + "px, 0px)"; - - //update context matrix - this._contextMatrix.rawData[0] = this._width/2; - this._contextMatrix.rawData[5] = -this._height/2; - this._contextMatrix.rawData[10] = -1; //fix for innaccurate z-sort - this._contextMatrix.rawData[12] = this._width/2; - this._contextMatrix.rawData[13] = this._height/2; - - //update context tranform - this._contextStyle.transform - = this._contextStyle["-webkit-transform"] - = this._contextStyle["-moz-transform"] - = this._contextStyle["-o-transform"] - = this._contextStyle["-ms-transform"] = this._contextMatrix.toString(); - - this._pBackBufferInvalid = false; - } - - /** - * Draw the skybox if present. - * @param entityCollector The EntityCollector containing all potentially visible information. - */ - private drawSkybox(entityCollector:away.traverse.CSSEntityCollector) - { - //TODO - } - - /** - * Draw a list of renderables. - * @param renderables The renderables to draw. - * @param entityCollector The EntityCollector containing all potentially visible information. - */ - private drawRenderables(item:away.pool.CSSRenderableBase, entityCollector:away.traverse.EntityCollector) - { - var viewProjection:away.geom.Matrix3D = entityCollector.camera.viewProjection.clone(); - - while (item) { - this._activeMaterial = item.materialOwner.material; - - //serialise transform and apply to html element - this._transform.copyRawDataFrom(item.renderSceneTransform.rawData); - this._transform.append(viewProjection); - - var style:MSStyleCSSProperties = item.htmlElement.style; - - style.transform - = style["-webkit-transform"] - = style["-moz-transform"] - = style["-o-transform"] - = style["-ms-transform"] = this._transform.toString(); - - style.transformStyle - = style["-webkit-transform-style"] - = style["-moz-transform-style"] - = style["-o-transform-style"] - = style["-ms-transform-style"] = "preserve-3d"; - - //check if child requires adding to the view - if (!this._context.contains(item.htmlElement)) - this._context.appendChild(item.htmlElement); - - item = item.next; - } - -// var numPasses:number; -// var j:number; -// var camera:away.entities.Camera = entityCollector.camera; -// var item2:away.render.CSSRenderableBase; -// -// while (item) { -// this._activeMaterial = item.material; -// -// this._activeMaterial.iUpdateMaterial(this._pContext); -// -// numPasses = this._activeMaterial._iNumPasses; -// -// j = 0; -// -// do { -// item2 = item; -// -// var rttMask:number = this._activeMaterial.iPassRendersToTexture(j)? 1 : 2; -// -// if ((rttMask & which) != 0) { -// this._activeMaterial.iActivatePass(j, this._pStageGL, camera); -// -// do { -// this._activeMaterial.iRenderPass(j, item2, this._pStageGL, entityCollector); -// -// item2 = item2.next; -// -// } while (item2 && item2.material == this._activeMaterial); -// -// this._activeMaterial.iDeactivatePass(j, this._pStageGL); -// -// } else { -// do { -// item2 = item2.next; -// -// } while (item2 && item2.renderable.material == this._activeMaterial); -// } -// } while (++j < numPasses); -// -// item = item2; -// } - } - - public dispose() - { - super.dispose(); - - //TODO - } - - - public _iCreateEntityCollector():away.traverse.ICollector - { - return new away.traverse.CSSEntityCollector(); - } - } -} diff --git a/src/away/core/render/CSSRendererBase.ts b/src/away/core/render/CSSRendererBase.ts deleted file mode 100644 index 22ce7296..00000000 --- a/src/away/core/render/CSSRendererBase.ts +++ /dev/null @@ -1,456 +0,0 @@ -/// - -/** - * @module away.render - */ -module away.render -{ - /** - * RendererBase forms an abstract base class for classes that are used in the rendering pipeline to render the - * contents of a partition - * - * @class away.render.RendererBase - */ - export class CSSRendererBase extends away.events.EventDispatcher - { - private _billboardRenderablePool:away.pool.RenderablePool; - private _lineSegmentRenderablePool:away.pool.RenderablePool; - - public _pCamera:away.entities.Camera; - public _iEntryPoint:away.geom.Vector3D; - public _pCameraForward:away.geom.Vector3D; - - private _backgroundR:number = 0; - private _backgroundG:number = 0; - private _backgroundB:number = 0; - private _backgroundAlpha:number = 1; - private _shareContext:boolean = false; - - public _pBackBufferInvalid:boolean = true; - public _depthTextureInvalid:boolean = true; - - public _renderableHead:away.pool.CSSRenderableBase; - - public _width:number; - public _height:number; - - private _viewPort:away.geom.Rectangle = new away.geom.Rectangle(); - private _viewportDirty:boolean; - private _scissorRect:away.geom.Rectangle = new away.geom.Rectangle(); - private _scissorDirty:boolean; - - private _localPos:away.geom.Point = new away.geom.Point(); - private _globalPos:away.geom.Point = new away.geom.Point(); - - private _scissorUpdated:away.events.RendererEvent; - private _viewPortUpdated:away.events.RendererEvent; - - /** - * A viewPort rectangle equivalent of the StageGL size and position. - */ - public get viewPort():away.geom.Rectangle - { - return this._viewPort; - } - - /** - * A scissor rectangle equivalent of the view size and position. - */ - public get scissorRect():away.geom.Rectangle - { - return this._scissorRect; - } - - /** - * - */ - public get x():number - { - return this._localPos.x; - } - - public set x(value:number) - { - if (this.x == value) - return; - - this.updateGlobalPos(); - } - - /** - * - */ - public get y():number - { - return this._localPos.y; - } - - public set y(value:number) - { - if (this.y == value) - return; - - this._globalPos.y = this._localPos.y = value; - - this.updateGlobalPos(); - } - - /** - * - */ - public get width():number - { - return this._width; - } - - public set width(value:number) - { - if (this._width == value) - return; - - this._width = value; - this._scissorRect.width = value; - this._viewPort.width = value; - - this._pBackBufferInvalid = true; - this._depthTextureInvalid = true; - - this.notifyViewportUpdate(); - this.notifyScissorUpdate(); - } - - /** - * - */ - public get height():number - { - return this._height; - } - - public set height(value:number) - { - if (this._height == value) - return; - - this._height = value; - this._scissorRect.height = value; - this._viewPort.height = value; - - this._pBackBufferInvalid = true; - this._depthTextureInvalid = true; - - this.notifyViewportUpdate(); - this.notifyScissorUpdate(); - } - - /** - * - */ - public renderableSorter:away.sort.IEntitySorter; - - /** - * Creates a new RendererBase object. - */ - constructor(renderToTexture:boolean = false, forceSoftware:boolean = false, profile:string = "baseline") - { - super(); - - this._billboardRenderablePool = away.pool.RenderablePool.getPool(away.pool.CSSBillboardRenderable); - this._lineSegmentRenderablePool = away.pool.RenderablePool.getPool(away.pool.CSSLineSegmentRenderable); - - this._viewPort = new away.geom.Rectangle(); - - if (this._width == 0) - this.width = window.innerWidth; - - if (this._height == 0) - this.height = window.innerHeight; - } - - /** - * The background color's red component, used when clearing. - * - * @private - */ - public get _iBackgroundR():number - { - return this._backgroundR; - } - - public set _iBackgroundR(value:number) - { - if (this._backgroundR == value) - return; - - this._backgroundR = value; - - this._pBackBufferInvalid = true; - } - - /** - * The background color's green component, used when clearing. - * - * @private - */ - public get _iBackgroundG():number - { - return this._backgroundG; - } - - public set _iBackgroundG(value:number) - { - if (this._backgroundG == value) - return; - - this._backgroundG = value; - - this._pBackBufferInvalid = true; - } - - /** - * The background color's blue component, used when clearing. - * - * @private - */ - public get _iBackgroundB():number - { - return this._backgroundB; - } - - public set _iBackgroundB(value:number) - { - if (this._backgroundB == value) - return; - - this._backgroundB = value; - - this._pBackBufferInvalid = true; - } - - public get shareContext():boolean - { - return this._shareContext; - } - - public set shareContext(value:boolean) - { - if (this._shareContext == value) - return; - - this._shareContext = value; - - this.updateGlobalPos(); - } - - /** - * Disposes the resources used by the RendererBase. - */ - public dispose() - { - /* - if (_backgroundImageRenderer) { - _backgroundImageRenderer.dispose(); - _backgroundImageRenderer = null; - } - */ - } - - public render(entityCollector:away.traverse.ICollector) - { - this._viewportDirty = false; - this._scissorDirty = false; - } - - /** - * Renders the potentially visible geometry to the back buffer or texture. - * @param entityCollector The EntityCollector object containing the potentially visible geometry. - * @param scissorRect - */ - public _iRender(entityCollector:away.traverse.EntityCollector, target:away.textures.TextureProxyBase = null, scissorRect:away.geom.Rectangle = null, surfaceSelector:number = 0) - { - if (!entityCollector.entityHead) - return; - - this.pExecuteRender(entityCollector, scissorRect); - } - - public _iRenderCascades(entityCollector:away.traverse.ICollector, target:away.textures.TextureProxyBase, numCascades:number, scissorRects:Array, cameras:Array) - { - - } - public pCollectRenderables(entityCollector:away.traverse.ICollector) - { - //reset head values - this._renderableHead = null; - - //grab entity head - var item:away.pool.EntityListItem = entityCollector.entityHead; - - //set temp values for entry point and camera forward vector - this._pCamera = entityCollector.camera; - this._iEntryPoint = this._pCamera.scenePosition; - this._pCameraForward = this._pCamera.transform.forwardVector; - - //iterate through all entities - while (item) { - item.entity._iCollectRenderables(this); - item = item.next; - } - } - - /** - * Renders the potentially visible geometry to the back buffer or texture. Only executed if everything is set up. - * @param entityCollector The EntityCollector object containing the potentially visible geometry. - * @param scissorRect - */ - public pExecuteRender(entityCollector:away.traverse.CSSEntityCollector, scissorRect:away.geom.Rectangle = null) - { - this.pCollectRenderables(entityCollector); - - this.pDraw(entityCollector); - } - - /** - * Performs the actual drawing of dom objects to the target. - * - * @param entityCollector The EntityCollector object containing the potentially visible dom objects. - */ - public pDraw(entityCollector:away.traverse.CSSEntityCollector) - { - throw new away.errors.AbstractMethodError(); - } - - public get _iBackgroundAlpha():number - { - return this._backgroundAlpha; - } - - public set _iBackgroundAlpha(value:number) - { - if (this._backgroundAlpha == value) - return; - - this._backgroundAlpha = value; - - this._pBackBufferInvalid = true; - } - - /** - * - * @param billboard - */ - public applyBillboard(billboard:away.entities.Billboard) - { - this._applyRenderable( this._billboardRenderablePool.getItem(billboard)); - } - - /** - * - * @param lineSubMesh - */ - public applyLineSubMesh(lineSubMesh:away.base.LineSubMesh) - { - //this._applyRenderable( this._billboardRenderablePool.getItem(lineSegment)); - } - - /** - * - * @param skybox - */ - public applySkybox(skybox:away.entities.Skybox) - { - - } - - /** - * - * @param triangleSubMesh - */ - public applyTriangleSubMesh(triangleSubMesh:away.base.TriangleSubMesh) - { - - } - - /** - * - * @param renderable - * @private - */ - private _applyRenderable(renderable:away.pool.CSSRenderableBase) - { - var material:away.materials.CSSMaterialBase = renderable.materialOwner.material; - var entity:away.entities.IEntity = renderable.sourceEntity; - var position:away.geom.Vector3D = entity.scenePosition; - - if (material) { - //set ids for faster referencing - renderable.materialId = material._iMaterialId; -// renderable.renderOrderId = material._iRenderOrderId; - renderable.cascaded = false; - - // project onto camera's z-axis - position = this._iEntryPoint.subtract(position); - renderable.zIndex = entity.zOffset - position.dotProduct(this._pCameraForward); - - //store reference to scene transform - renderable.renderSceneTransform = renderable.sourceEntity.getRenderSceneTransform(this._pCamera); - - //store reference to next item in list - renderable.next = this._renderableHead; - this._renderableHead = renderable; - } - } - - - /** - * @private - */ - private notifyScissorUpdate() - { - if (this._scissorDirty) - return; - - this._scissorDirty = true; - - if (!this._scissorUpdated) - this._scissorUpdated = new away.events.RendererEvent(away.events.RendererEvent.SCISSOR_UPDATED); - - this.dispatchEvent(this._scissorUpdated); - } - - - /** - * @private - */ - private notifyViewportUpdate() - { - if (this._viewportDirty) - return; - - this._viewportDirty = true; - - if (!this._viewPortUpdated) - this._viewPortUpdated = new away.events.RendererEvent(away.events.RendererEvent.VIEWPORT_UPDATED); - - this.dispatchEvent(this._viewPortUpdated); - } - - /** - * - */ - public updateGlobalPos() - { - this._viewPort.x = this._globalPos.x; - this._viewPort.y = this._globalPos.y; - - this.notifyViewportUpdate(); - this.notifyScissorUpdate(); - } - - - public _iCreateEntityCollector():away.traverse.ICollector - { - throw new away.errors.AbstractMethodError(); - } - } -} diff --git a/src/away/core/render/IRenderer.ts b/src/away/core/render/IRenderer.ts deleted file mode 100644 index f617abbb..00000000 --- a/src/away/core/render/IRenderer.ts +++ /dev/null @@ -1,124 +0,0 @@ -/// - -/** - * @module away.render - */ -module away.render -{ - import LineSubMesh = away.base.LineSubMesh; - import TriangleSubMesh = away.base.TriangleSubMesh; - import Billboard = away.entities.Billboard; - import Camera = away.entities.Camera; - import Skybox = away.entities.Skybox; - import Rectangle = away.geom.Rectangle; - import IEntitySorter = away.sort.IEntitySorter; - import TextureProxyBase = away.textures.TextureProxyBase; - import ICollector = away.traverse.ICollector; - - /** - * IRenderer is an interface for classes that are used in the rendering pipeline to render the - * contents of a partition - * - * @class away.render.IRenderer - */ - export interface IRenderer extends away.events.IEventDispatcher - { - /** - * - */ - renderableSorter:IEntitySorter; - - /** - * - */ - shareContext:boolean; - - /** - * - */ - x:number /*uint*/; - - /** - * - */ - y:number /*uint*/; - - /** - * - */ - width:number /*uint*/; - - /** - * - */ - height:number /*uint*/; - - /** - * - */ - viewPort:Rectangle; - - /** - * - */ - scissorRect:Rectangle; - - /** - * - * @param billboard - */ - applyBillboard(billboard:Billboard); - - /** - * - * @param triangleSubMesh - */ - applyLineSubMesh(triangleSubMesh:LineSubMesh); - - /** - * - * @param triangleSubMesh - */ - applyTriangleSubMesh(triangleSubMesh:TriangleSubMesh); - - /** - * - */ - dispose(); - - /** - * - * @param entityCollector - */ - render(entityCollector:ICollector); - - /** - * @internal - */ - _iBackgroundR:number /*uint*/; - - /** - * @internal - */ - _iBackgroundG:number /*uint*/; - - /** - * @internal - */ - _iBackgroundB:number /*uint*/; - - /** - * @internal - */ - _iBackgroundAlpha:number; - - /** - * @internal - */ - _iCreateEntityCollector():ICollector; - - _iRender(entityCollector:ICollector, target?:TextureProxyBase, scissorRect?:Rectangle, surfaceSelector?:number); - - _iRenderCascades(entityCollector:ICollector, target:TextureProxyBase, numCascades:number, scissorRects:Array, cameras:Array) - } -} diff --git a/src/away/core/sort/IEntitySorter.ts b/src/away/core/sort/IEntitySorter.ts deleted file mode 100644 index ad559646..00000000 --- a/src/away/core/sort/IEntitySorter.ts +++ /dev/null @@ -1,17 +0,0 @@ -/// - -/** - * @module away.sort - */ -module away.sort -{ - /** - * @interface away.sort.IEntitySorter - */ - export interface IEntitySorter - { - sortBlendedRenderables(head:away.pool.IRenderable):away.pool.IRenderable; - - sortOpaqueRenderables(head:away.pool.IRenderable):away.pool.IRenderable; - } -} \ No newline at end of file diff --git a/src/away/core/sort/RenderableMergeSort.ts b/src/away/core/sort/RenderableMergeSort.ts deleted file mode 100644 index c7f862c6..00000000 --- a/src/away/core/sort/RenderableMergeSort.ts +++ /dev/null @@ -1,169 +0,0 @@ -/// - -/** - * @module away.sort - */ -module away.sort -{ - /** - * @class away.sort.RenderableMergeSort - */ - export class RenderableMergeSort implements IEntitySorter - { - public sortBlendedRenderables(head:away.pool.IRenderable):away.pool.IRenderable - { - var headB:away.pool.IRenderable; - var fast:away.pool.IRenderable; - var slow:away.pool.IRenderable; - - if (!head || !head.next) { - return head; - } - - // split in two sublists - slow = head; - fast = head.next; - - while (fast) { - fast = fast.next; - if (fast) { - slow = slow.next; - fast = fast.next; - } - } - - headB = slow.next; - slow.next = null; - - // recurse - head = this.sortBlendedRenderables(head); - headB = this.sortBlendedRenderables(headB); - - // merge sublists while respecting order - var result:away.pool.IRenderable; - var curr:away.pool.IRenderable; - var l:away.pool.IRenderable; - - if (!head) - return headB; - if (!headB) - return head; - - while (head && headB) { - if (head.zIndex < headB.zIndex) { - l = head; - head = head.next; - } else { - l = headB; - headB = headB.next; - } - - if (!result) - result = l; - else - curr.next = l; - - curr = l; - } - - if (head) - curr.next = head; - else if (headB) - curr.next = headB; - - return result; - } - - public sortOpaqueRenderables(head:away.pool.IRenderable):away.pool.IRenderable - { - var headB:away.pool.IRenderable; - var fast:away.pool.IRenderable, slow:away.pool.IRenderable; - - if (!head || !head.next) { - return head; - } - - // split in two sublists - slow = head; - fast = head.next; - - while (fast) { - fast = fast.next; - if (fast) { - slow = slow.next; - fast = fast.next; - } - } - - headB = slow.next; - slow.next = null; - - // recurse - head = this.sortOpaqueRenderables(head); - headB = this.sortOpaqueRenderables(headB); - - // merge sublists while respecting order - var result:away.pool.IRenderable; - var curr:away.pool.IRenderable; - var l:away.pool.IRenderable; - var cmp:number = 0; - - if (!head) - return headB; - if (!headB) - return head; - - while (head && headB && head != null && headB != null) { - - // first sort per render order id (reduces program3D switches), - // then on material id (reduces setting props), - // then on zIndex (reduces overdraw) - var aid:number = head.renderOrderId; - var bid:number = headB.renderOrderId; - - if (aid == bid) { - var ma:number = head.materialId; - var mb:number = headB.materialId; - - if (ma == mb) { - if (head.zIndex < headB.zIndex) - cmp = 1; - else - cmp = -1; - } else if (ma > mb) { - cmp = 1; - } else { - cmp = -1; - } - } else if (aid > bid) { - cmp = 1; - } else { - cmp = -1; - } - - if (cmp < 0) { - l = head; - head = head.next; - } else { - l = headB; - headB = headB.next; - } - - if (!result) { - result = l; - curr = l; - } else { - curr.next = l; - curr = l; - } - } - - if (head) - curr.next = head; - else if (headB) - curr.next = headB; - - return result; - } - } -} \ No newline at end of file diff --git a/src/away/core/text/AntiAliasType.ts b/src/away/core/text/AntiAliasType.ts deleted file mode 100644 index 1ce0d8a5..00000000 --- a/src/away/core/text/AntiAliasType.ts +++ /dev/null @@ -1,31 +0,0 @@ -/// - -/** - * The AntiAliasType class provides values for anti-aliasing in the - * away.text.TextField class. - */ -module away.text -{ - export class AntiAliasType - { - /** - * Sets anti-aliasing to advanced anti-aliasing. Advanced anti-aliasing - * allows font faces to be rendered at very high quality at small sizes. It - * is best used with applications that have a lot of small text. Advanced - * anti-aliasing is not recommended for very large fonts(larger than 48 - * points). This constant is used for the antiAliasType property - * in the TextField class. Use the syntax - * AntiAliasType.ADVANCED. - */ - public static ADVANCED:string = "advanced"; - - /** - * Sets anti-aliasing to the anti-aliasing that is used in Flash Player 7 and - * earlier. This setting is recommended for applications that do not have a - * lot of text. This constant is used for the antiAliasType - * property in the TextField class. Use the syntax - * AntiAliasType.NORMAL. - */ - public static NORMAL:string = "normal"; - } -} diff --git a/src/away/core/text/GridFitType.ts b/src/away/core/text/GridFitType.ts deleted file mode 100644 index a05b51e4..00000000 --- a/src/away/core/text/GridFitType.ts +++ /dev/null @@ -1,39 +0,0 @@ -/// - -/** - * The GridFitType class defines values for grid fitting in the TextField class. - */ -module away.text -{ - export class GridFitType - { - /** - * Doesn't set grid fitting. Horizontal and vertical lines in the glyphs are - * not forced to the pixel grid. This constant is used in setting the - * gridFitType property of the TextField class. This is often a - * good setting for animation or for large font sizes. Use the syntax - * GridFitType.NONE. - */ - public static NONE:string = "none"; - - /** - * Fits strong horizontal and vertical lines to the pixel grid. This constant - * is used in setting the gridFitType property of the TextField - * class. This setting only works for left-justified text fields and acts - * like the GridFitType.SUBPIXEL constant in static text. This - * setting generally provides the best readability for left-aligned text. Use - * the syntax GridFitType.PIXEL. - */ - public static PIXEL:string = "pixel"; - - /** - * Fits strong horizontal and vertical lines to the sub-pixel grid on LCD - * monitors. (Red, green, and blue are actual pixels on an LCD screen.) This - * is often a good setting for right-aligned or center-aligned dynamic text, - * and it is sometimes a useful tradeoff for animation vs. text quality. This - * constant is used in setting the gridFitType property of the - * TextField class. Use the syntax GridFitType.SUBPIXEL. - */ - public static SUBPIXEL:string = "subpixel"; - } -} \ No newline at end of file diff --git a/src/away/core/text/TextFieldAutoSize.ts b/src/away/core/text/TextFieldAutoSize.ts deleted file mode 100644 index aad75a79..00000000 --- a/src/away/core/text/TextFieldAutoSize.ts +++ /dev/null @@ -1,37 +0,0 @@ -/// - -/** - * The TextFieldAutoSize class is an enumeration of constant values used in - * setting the autoSize property of the TextField class. - */ -module away.text -{ - export class TextFieldAutoSize - { - /** - * Specifies that the text is to be treated as center-justified text. Any - * resizing of a single line of a text field is equally distributed to both - * the right and left sides. - */ - public static CENTER:string = "center"; - - /** - * Specifies that the text is to be treated as left-justified text, meaning - * that the left side of the text field remains fixed and any resizing of a - * single line is on the right side. - */ - public static LEFT:string = "left"; - - /** - * Specifies that no resizing is to occur. - */ - public static NONE:string = "none"; - - /** - * Specifies that the text is to be treated as right-justified text, meaning - * that the right side of the text field remains fixed and any resizing of a - * single line is on the left side. - */ - public static RIGHT:string = "right"; - } -} diff --git a/src/away/core/text/TextFieldType.ts b/src/away/core/text/TextFieldType.ts deleted file mode 100644 index 397742b1..00000000 --- a/src/away/core/text/TextFieldType.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// - -/** - * The TextFieldType class is an enumeration of constant values used in setting the - * type property of the TextField class. - * - * @see away.entities.TextField#type - */ -module away.text -{ - export class TextFieldType - { - /** - * Used to specify a dynamic TextField. - */ - public static DYNAMIC:string = "dynamic"; - - /** - * Used to specify an input TextField. - */ - public static INPUT:string = "input"; - } -} \ No newline at end of file diff --git a/src/away/core/text/TextFormat.ts b/src/away/core/text/TextFormat.ts deleted file mode 100644 index 417f8942..00000000 --- a/src/away/core/text/TextFormat.ts +++ /dev/null @@ -1,243 +0,0 @@ -/// - -/** - * The TextFormat class represents character formatting information. Use the - * TextFormat class to create specific text formatting for text fields. You - * can apply text formatting to both static and dynamic text fields. The - * properties of the TextFormat class apply to device and embedded fonts. - * However, for embedded fonts, bold and italic text actually require specific - * fonts. If you want to display bold or italic text with an embedded font, - * you need to embed the bold and italic variations of that font. - * - *

You must use the constructor new TextFormat() to create a - * TextFormat object before setting its properties. When you apply a - * TextFormat object to a text field using the - * TextField.defaultTextFormat property or the - * TextField.setTextFormat() method, only its defined properties - * are applied. Use the TextField.defaultTextFormat property to - * apply formatting BEFORE you add text to the TextField, and the - * setTextFormat() method to add formatting AFTER you add text to - * the TextField. The TextFormat properties are null - * by default because if you don't provide values for the properties, Flash - * Player uses its own default formatting. The default formatting that Flash - * Player uses for each property(if property's value is null) is - * as follows:

- * - *

The default formatting for each property is also described in each - * property description.

- */ -module away.text -{ - export class TextFormat - { - - /** - * Indicates the alignment of the paragraph. Valid values are TextFormatAlign - * constants. - * - * @default TextFormatAlign.LEFT - * @throws ArgumentError The align specified is not a member of - * flash.text.TextFormatAlign. - */ - public align:string; - - /** - * Indicates the block indentation in pixels. Block indentation is applied to - * an entire block of text; that is, to all lines of the text. In contrast, - * normal indentation(TextFormat.indent) affects only the first - * line of each paragraph. If this property is null, the - * TextFormat object does not specify block indentation(block indentation is - * 0). - */ - public blockIndent:number; - - /** - * Specifies whether the text is boldface. The default value is - * null, which means no boldface is used. If the value is - * true, then the text is boldface. - */ - public bold:boolean; - - /** - * Indicates that the text is part of a bulleted list. In a bulleted list, - * each paragraph of text is indented. To the left of the first line of each - * paragraph, a bullet symbol is displayed. The default value is - * null, which means no bulleted list is used. - */ - public bullet:boolean; - - /** - * Indicates the color of the text. A number containing three 8-bit RGB - * components; for example, 0xFF0000 is red, and 0x00FF00 is green. The - * default value is null, which means that Flash Player uses the - * color black(0x000000). - */ - public color:boolean; - - /** - * The name of the font for text in this text format, as a string. The - * default value is null, which means that Flash Player uses - * Times New Roman font for the text. - */ - public font:string; - - /** - * Indicates the indentation from the left margin to the first character in - * the paragraph. The default value is null, which indicates - * that no indentation is used. - */ - public indent:number; - - /** - * Indicates whether text in this text format is italicized. The default - * value is null, which means no italics are used. - */ - public italic:boolean; - - /** - * A Boolean value that indicates whether kerning is enabled - * (true) or disabled(false). Kerning adjusts the - * pixels between certain character pairs to improve readability, and should - * be used only when necessary, such as with headings in large fonts. Kerning - * is supported for embedded fonts only. - * - *

Certain fonts such as Verdana and monospaced fonts, such as Courier - * New, do not support kerning.

- * - *

The default value is null, which means that kerning is not - * enabled.

- */ - public kerning:boolean; - - /** - * An integer representing the amount of vertical space(called - * leading) between lines. The default value is null, - * which indicates that the amount of leading used is 0. - */ - public leading:number; - - /** - * The left margin of the paragraph, in pixels. The default value is - * null, which indicates that the left margin is 0 pixels. - */ - public leftMargin:number; - - /** - * A number representing the amount of space that is uniformly distributed - * between all characters. The value specifies the number of pixels that are - * added to the advance after each character. The default value is - * null, which means that 0 pixels of letter spacing is used. - * You can use decimal values such as 1.75. - */ - public letterSpacing:number; - - /** - * The right margin of the paragraph, in pixels. The default value is - * null, which indicates that the right margin is 0 pixels. - */ - public rightMargin:number; - - /** - * The size in pixels of text in this text format. The default value is - * null, which means that a size of 12 is used. - */ - public size:number; - - /** - * Specifies custom tab stops as an array of non-negative integers. Each tab - * stop is specified in pixels. If custom tab stops are not specified - * (null), the default tab stop is 4(average character width). - */ - public tabStops:Array = new Array(); - - /** - * Indicates the target window where the hyperlink is displayed. If the - * target window is an empty string, the text is displayed in the default - * target window _self. You can choose a custom name or one of - * the following four names: _self specifies the current frame - * in the current window, _blank specifies a new window, - * _parent specifies the parent of the current frame, and - * _top specifies the top-level frame in the current window. If - * the TextFormat.url property is an empty string or - * null, you can get or set this property, but the property will - * have no effect. - */ - public target:string; - - /** - * Indicates whether the text that uses this text format is underlined - * (true) or not(false). This underlining is - * similar to that produced by the tag, but the latter is - * not true underlining, because it does not skip descenders correctly. The - * default value is null, which indicates that underlining is - * not used. - */ - public underline:boolean; - - /** - * Indicates the target URL for the text in this text format. If the - * url property is an empty string, the text does not have a - * hyperlink. The default value is null, which indicates that - * the text does not have a hyperlink. - * - *

Note: The text with the assigned text format must be set with - * the htmlText property for the hyperlink to work.

- */ - public url:string; - - /** - * Creates a TextFormat object with the specified properties. You can then - * change the properties of the TextFormat object to change the formatting of - * text fields. - * - *

Any parameter may be set to null to indicate that it is - * not defined. All of the parameters are optional; any omitted parameters - * are treated as null.

- * - * @param font The name of a font for text as a string. - * @param size An integer that indicates the size in pixels. - * @param color The color of text using this text format. A number - * containing three 8-bit RGB components; for example, - * 0xFF0000 is red, and 0x00FF00 is green. - * @param bold A Boolean value that indicates whether the text is - * boldface. - * @param italic A Boolean value that indicates whether the text is - * italicized. - * @param underline A Boolean value that indicates whether the text is - * underlined. - * @param url The URL to which the text in this text format - * hyperlinks. If url is an empty string, the - * text does not have a hyperlink. - * @param target The target window where the hyperlink is displayed. If - * the target window is an empty string, the text is - * displayed in the default target window - * _self. If the url parameter - * is set to an empty string or to the value - * null, you can get or set this property, - * but the property will have no effect. - * @param align The alignment of the paragraph, as a TextFormatAlign - * value. - * @param leftMargin Indicates the left margin of the paragraph, in pixels. - * @param rightMargin Indicates the right margin of the paragraph, in pixels. - * @param indent An integer that indicates the indentation from the left - * margin to the first character in the paragraph. - * @param leading A number that indicates the amount of leading vertical - * space between lines. - */ - constructor(font:string = "Times New Roman", size:number = 12, color:number /*int*/ = 0x000000, bold:boolean = false, italic:boolean = false, underline:boolean = false, url:string = "", target:string = "", align:string = "left", leftMargin:number = 0, rightMargin:number = 0, indent:number = 0, leading:number = 0) - { - this.font = font; - this.size = size; - this.bold = bold; - this.italic = italic; - this.underline = underline; - this.url = url; - this.target = target; - this.align = align; - this.leftMargin = leftMargin; - this.rightMargin = rightMargin; - this.indent = indent; - this.leading = leading; - } - } -} diff --git a/src/away/core/text/TextFormatAlign.ts b/src/away/core/text/TextFormatAlign.ts deleted file mode 100644 index 535bb2ad..00000000 --- a/src/away/core/text/TextFormatAlign.ts +++ /dev/null @@ -1,34 +0,0 @@ -/// -/** - * The TextFormatAlign class provides values for text alignment in the - * TextFormat class. - */ -module away.text -{ - export class TextFormatAlign - { - /** - * Constant; centers the text in the text field. Use the syntax - * TextFormatAlign.CENTER. - */ - public CENTER:string = "center"; - - /** - * Constant; justifies text within the text field. Use the syntax - * TextFormatAlign.JUSTIFY. - */ - public JUSTIFY:string = "justify"; - - /** - * Constant; aligns text to the left within the text field. Use the syntax - * TextFormatAlign.LEFT. - */ - public LEFT:string = "left"; - - /** - * Constant; aligns text to the right within the text field. Use the syntax - * TextFormatAlign.RIGHT. - */ - public RIGHT:string = "right"; - } -} diff --git a/src/away/core/text/TextInteractionMode.ts b/src/away/core/text/TextInteractionMode.ts deleted file mode 100644 index 9bf2570e..00000000 --- a/src/away/core/text/TextInteractionMode.ts +++ /dev/null @@ -1,28 +0,0 @@ -/// - -/** - * A class that defines the Interactive mode of a text field object. - * - * @see away.entities.TextField#textInteractionMode - */ -module away.text -{ - export class TextInteractionMode - { - /** - * The text field's default interaction mode is NORMAL and it varies across - * platform. On Desktop, the normal mode implies that the text field is in - * scrollable + selection mode. On Mobile platforms like Android, normal mode - * implies that the text field can only be scrolled but the text can not be - * selected. - */ - public static NORMAL:string = "normal"; - - /** - * On mobile platforms like Android, the text field starts in normal mode - * (which implies scroll and non-selectable mode). The user can switch to - * selection mode through the in-built context menu of the text field object. - */ - public static SELECTION:string = "selection"; - } -} \ No newline at end of file diff --git a/src/away/core/text/TextLineMetrics.ts b/src/away/core/text/TextLineMetrics.ts deleted file mode 100644 index b39ff7ce..00000000 --- a/src/away/core/text/TextLineMetrics.ts +++ /dev/null @@ -1,76 +0,0 @@ -/// - -/** - * The TextLineMetrics class contains information about the text position and - * measurements of a line of text within a text field. All measurements are in - * pixels. Objects of this class are returned by the - * away.entities.TextField.getLineMetrics() method. - */ -module away.text -{ - export class TextLineMetrics - { - /** - * The ascent value of the text is the length from the baseline to the top of - * the line height in pixels. - */ - public ascent:number; - - /** - * The descent value of the text is the length from the baseline to the - * bottom depth of the line in pixels. - */ - public descent:number; - - /** - * The height value of the text of the selected lines (not necessarily the - * complete text) in pixels. The height of the text line does not include the - * gutter height. - */ - public height:number; - - /** - * The leading value is the measurement of the vertical distance between the - * lines of text. - */ - public leading:number; - - /** - * The width value is the width of the text of the selected lines (not - * necessarily the complete text) in pixels. The width of the text line is - * not the same as the width of the text field. The width of the text line is - * relative to the text field width, minus the gutter width of 4 pixels - * (2 pixels on each side). - */ - public width:number; - - /** - * The x value is the left position of the first character in pixels. This - * value includes the margin, indent (if any), and gutter widths. - */ - public x:number; - - /** - * Creates a TextLineMetrics object. The TextLineMetrics object contains - * information about the text metrics of a line of text in a text field. - * Objects of this class are returned by the - * away.entities.TextField.getLineMetrics() method. - * - * @param x The left position of the first character in pixels. - * @param width The width of the text of the selected lines (not - * necessarily the complete text) in pixels. - * @param height The height of the text of the selected lines (not - * necessarily the complete text) in pixels. - * @param ascent The length from the baseline to the top of the line - * height in pixels. - * @param descent The length from the baseline to the bottom depth of - * the line in pixels. - * @param leading The measurement of the vertical distance between the - * lines of text. - */ - constructor(x:number = NaN, width:number = NaN, height:number = NaN, ascent:number = NaN, descent:number = NaN, leading:number = NaN) - { - - } - } -} \ No newline at end of file diff --git a/src/away/core/traverse/CSSEntityCollector.ts b/src/away/core/traverse/CSSEntityCollector.ts deleted file mode 100644 index dbad6b59..00000000 --- a/src/away/core/traverse/CSSEntityCollector.ts +++ /dev/null @@ -1,18 +0,0 @@ -/// - -/** - * @module away.traverse - */ -module away.traverse -{ - /** - * @class away.traverse.CSSEntityCollector - */ - export class CSSEntityCollector extends CollectorBase implements ICollector - { - constructor() - { - super(); - } - } -} \ No newline at end of file diff --git a/src/away/core/traverse/CollectorBase.ts b/src/away/core/traverse/CollectorBase.ts deleted file mode 100644 index 0e41bf49..00000000 --- a/src/away/core/traverse/CollectorBase.ts +++ /dev/null @@ -1,168 +0,0 @@ -/// - -/** - * @module away.traverse - */ -module away.traverse -{ - import Scene = away.containers.Scene; - import Camera = away.entities.Camera; - import IEntity = away.entities.IEntity; - import Plane3D = away.geom.Plane3D; - import NodeBase = away.partition.NodeBase; - import EntityListItem = away.pool.EntityListItem; - import EntityListItemPool = away.pool.EntityListItemPool; - - /** - * @class away.traverse.CollectorBase - */ - export class CollectorBase implements ICollector - { - public scene:Scene; - - public _pEntityHead:EntityListItem; - public _pEntityListItemPool:EntityListItemPool; - public _pCamera:Camera; - private _customCullPlanes:Array; - private _cullPlanes:Array; - private _numCullPlanes:number = 0; - public _pNumEntities:number = 0; - public _pNumInteractiveEntities:number = 0; - - constructor() - { - this._pEntityListItemPool = new EntityListItemPool(); - } - - /** - * - */ - public get camera():Camera - { - return this._pCamera; - } - - public set camera(value:Camera) - { - this._pCamera = value; - this._cullPlanes = this._pCamera.frustumPlanes; - } - - /** - * - */ - public get cullPlanes():Array - { - return this._customCullPlanes; - } - - public set cullPlanes(value:Array) - { - this._customCullPlanes = value; - } - - /** - * - */ - public get entityHead():EntityListItem - { - return this._pEntityHead; - } - - /** - * - */ - public get numEntities():number - { - return this._pNumEntities; - } - - /** - * - */ - public get numInteractiveEntities():number - { - return this._pNumInteractiveEntities; - } - - /** - * - */ - public clear() - { - this._pNumEntities = this._pNumInteractiveEntities = 0; - this._cullPlanes = this._customCullPlanes? this._customCullPlanes : ( this._pCamera? this._pCamera.frustumPlanes : null ); - this._numCullPlanes = this._cullPlanes? this._cullPlanes.length : 0; - this._pEntityHead = null; - this._pEntityListItemPool.freeAll(); - } - - /** - * - * @param node - * @returns {boolean} - */ - public enterNode(node:NodeBase):boolean - { - var enter:boolean = this.scene._iCollectionMark != node._iCollectionMark && node.isInFrustum(this._cullPlanes, this._numCullPlanes); - - node._iCollectionMark = this.scene._iCollectionMark; - - return enter; - } - - /** - * - * @param entity - */ - public applyDirectionalLight(entity:IEntity) - { - //don't do anything here - } - - /** - * - * @param entity - */ - public applyEntity(entity:IEntity) - { - this._pNumEntities++; - - if (entity._iIsMouseEnabled()) - this._pNumInteractiveEntities++; - - var item:EntityListItem = this._pEntityListItemPool.getItem(); - item.entity = entity; - - item.next = this._pEntityHead; - this._pEntityHead = item; - } - - /** - * - * @param entity - */ - public applyLightProbe(entity:IEntity) - { - //don't do anything here - } - - /** - * - * @param entity - */ - public applyPointLight(entity:IEntity) - { - //don't do anything here - } - - /** - * - * @param entity - */ - public applySkybox(entity:IEntity) - { - //don't do anything here - } - } -} \ No newline at end of file diff --git a/src/away/core/traverse/EntityCollector.ts b/src/away/core/traverse/EntityCollector.ts deleted file mode 100644 index cf767108..00000000 --- a/src/away/core/traverse/EntityCollector.ts +++ /dev/null @@ -1,140 +0,0 @@ -/// - -/** - * @module away.traverse - */ -module away.traverse -{ - import LightBase = away.base.LightBase; - import DirectionalLight = away.entities.DirectionalLight; - import IEntity = away.entities.IEntity; - import LightProbe = away.entities.LightProbe; - import PointLight = away.entities.PointLight; - import Skybox = away.entities.Skybox; - - /** - * @class away.traverse.EntityCollector - */ - export class EntityCollector extends CollectorBase - { - public _pSkybox:Skybox; - public _pLights:Array; - private _directionalLights:Array; - private _pointLights:Array; - private _lightProbes:Array; - - public _pNumLights:number = 0; - - private _numDirectionalLights:number = 0; - private _numPointLights:number = 0; - private _numLightProbes:number = 0; - - /** - * - */ - public get directionalLights():Array - { - return this._directionalLights; - } - - /** - * - */ - public get lightProbes():Array - { - return this._lightProbes; - } - - /** - * - */ - public get lights():Array - { - return this._pLights; - } - - /** - * - */ - public get pointLights():Array - { - return this._pointLights; - } - - /** - * - */ - public get skyBox():Skybox - { - return this._pSkybox; - } - - constructor() - { - super(); - - this._pLights = new Array(); - this._directionalLights = new Array(); - this._pointLights = new Array(); - this._lightProbes = new Array(); - } - - /** - * - * @param entity - */ - public applyDirectionalLight(entity:IEntity) - { - this._directionalLights[ this._numDirectionalLights++ ] = entity; - } - - /** - * - * @param entity - */ - public applyLightProbe(entity:IEntity) - { - this._lightProbes[ this._numLightProbes++ ] = entity; - } - - /** - * - * @param entity - */ - public applyPointLight(entity:IEntity) - { - this._pointLights[ this._numPointLights++ ] = entity; - } - - /** - * - * @param entity - */ - public applySkybox(entity:IEntity) - { - this._pSkybox = entity; - } - - /** - * - */ - public clear() - { - super.clear(); - - this._pSkybox = null; - - if (this._pNumLights > 0) - this._pLights.length = this._pNumLights = 0; - - if (this._numDirectionalLights > 0) - this._directionalLights.length = this._numDirectionalLights = 0; - - if (this._numPointLights > 0) - this._pointLights.length = this._numPointLights = 0; - - if (this._numLightProbes > 0) - this._lightProbes.length = this._numLightProbes = 0; - } - } -} \ No newline at end of file diff --git a/src/away/core/traverse/ICollector.ts b/src/away/core/traverse/ICollector.ts deleted file mode 100644 index 05cfafdd..00000000 --- a/src/away/core/traverse/ICollector.ts +++ /dev/null @@ -1,80 +0,0 @@ -/// - -/** - * @module away.traverse - */ -module away.traverse -{ - /** - * @class away.traverse.ICollector - */ - export interface ICollector - { - /** - * - */ - camera:away.entities.Camera; - - /** - * - */ - scene:away.containers.Scene; - - /** - * - */ - numEntities:number; - - /** - * - */ - numInteractiveEntities:number; - - /** - * - */ - clear(); - - /** - * - */ - entityHead; - - /** - * - * @param node - */ - enterNode(node:away.partition.NodeBase):boolean; - - /** - * - * @param entity - */ - applyDirectionalLight(entity:away.entities.IEntity); - - /** - * - * @param entity - */ - applyEntity(entity:away.entities.IEntity); - - /** - * - * @param entity - */ - applyLightProbe(entity:away.entities.IEntity); - - /** - * - * @param entity - */ - applyPointLight(entity:away.entities.IEntity); - - - /** - * - * @param entity - */ - applySkybox(entity:away.entities.IEntity); - } -} \ No newline at end of file diff --git a/src/away/core/traverse/RaycastCollector.ts b/src/away/core/traverse/RaycastCollector.ts deleted file mode 100644 index 932ffbea..00000000 --- a/src/away/core/traverse/RaycastCollector.ts +++ /dev/null @@ -1,71 +0,0 @@ -/// - -/** - * @module away.traverse - */ -module away.traverse -{ - import Vector3D = away.geom.Vector3D; - import NodeBase = away.partition.NodeBase; - - /** - * The RaycastCollector class is a traverser for scene partitions that collects all scene graph entities that are - * considered intersecting with the defined ray. - * - * @see away.partition.Partition - * @see away.entities.IEntity - * - * @class away.traverse.RaycastCollector - */ - export class RaycastCollector extends CollectorBase - { - private _rayPosition:Vector3D = new Vector3D(); - private _rayDirection:Vector3D = new Vector3D(); - - public _iCollectionMark:number = 0; - - /** - * Provides the starting position of the ray. - */ - public get rayPosition():Vector3D - { - return this._rayPosition; - } - - public set rayPosition(value:Vector3D) - { - this._rayPosition = value; - } - - /** - * Provides the direction vector of the ray. - */ - public get rayDirection():Vector3D - { - return this._rayDirection; - } - - public set rayDirection(value:Vector3D) - { - this._rayDirection = value; - } - - /** - * Creates a new RaycastCollector object. - */ - constructor() - { - super(); - } - - /** - * Returns true if the current node is at least partly in the frustum. If so, the partition node knows to pass on the traverser to its children. - * - * @param node The Partition3DNode object to frustum-test. - */ - public enterNode(node:NodeBase):boolean - { - return node.isIntersectingRay(this._rayPosition, this._rayDirection); - } - } -} diff --git a/src/away/core/traverse/ShadowCasterCollector.ts b/src/away/core/traverse/ShadowCasterCollector.ts deleted file mode 100644 index ea06e437..00000000 --- a/src/away/core/traverse/ShadowCasterCollector.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// - -/** - * @module away.traverse - */ -module away.traverse -{ - import NodeBase = away.partition.NodeBase; - - /** - * @class away.traverse.ShadowCasterCollector - */ - export class ShadowCasterCollector extends CollectorBase - { - constructor() - { - super(); - } - - /** - * - */ - public enterNode(node:NodeBase):boolean - { - var enter:boolean = this.scene._iCollectionMark != node._iCollectionMark && node.isCastingShadow(); - - if (!enter) { - node._iCollectionMark = this.scene._iCollectionMark; - - return false; - } - - return super.enterNode(node); - } - } -} \ No newline at end of file diff --git a/src/away/core/ui/Keyboard.ts b/src/away/core/ui/Keyboard.ts deleted file mode 100644 index dff1567c..00000000 --- a/src/away/core/ui/Keyboard.ts +++ /dev/null @@ -1,1028 +0,0 @@ -/// -module away.ui -{ - export class Keyboard - { - /** - * Constant associated with the key code value for the A key (65). - */ - public static A:number /*uint*/ = 65; - - /** - * Constant associated with the key code value for the Alternate (Option) key (18). - */ - public static ALTERNATE:number /*uint*/ = 18; - - /** - * Select the audio mode - */ - public static AUDIO:number /*uint*/ = 0x01000017; - - /** - * Constant associated with the key code value for the B key (66). - */ - public static B:number /*uint*/ = 66; - - /** - * Return to previous page in application - */ - public static BACK:number /*uint*/ = 0x01000016; - - /** - * Constant associated with the key code value for the ` key (192). - */ - public static BACKQUOTE:number /*uint*/ = 192; - - /** - * Constant associated with the key code value for the \ key (220). - */ - public static BACKSLASH:number /*uint*/ = 220; - - /** - * Constant associated with the key code value for the Backspace key (8). - */ - public static BACKSPACE:number /*uint*/ = 8; - - /** - * Blue function key button - */ - public static BLUE:number /*uint*/ = 0x01000003; - - /** - * Constant associated with the key code value for the C key (67). - */ - public static C:number /*uint*/ = 67; - - /** - * Constant associated with the key code value for the Caps Lock key (20). - */ - public static CAPS_LOCK:number /*uint*/ = 20; - - /** - * Channel down - */ - public static CHANNEL_DOWN:number /*uint*/ = 0x01000005; - - /** - * Channel up - */ - public static CHANNEL_UP:number /*uint*/ = 0x01000005; - - /** - * Constant associated with the key code value for the , key (188). - */ - public static COMMA:number /*uint*/ = 188; - - /** - * Constant associated with the Mac command key (15). This constant is - * currently only used for setting menu key equivalents. - */ - public static COMMAND:number /*uint*/ = 15; - - /** - * Constant associated with the key code value for the Control key (17). - */ - public static CONTROL:number /*uint*/ = 17; - - /** - * An array containing all the defined key name constants. - */ - public static CharCodeStrings:Array; - - /** - * Constant associated with the key code value for the D key (68). - */ - public static D:number /*uint*/ = 68; - - /** - * Constant associated with the key code value for the Delete key (46). - */ - public static DELETE:number /*uint*/ = 46; - - /** - * Constant associated with the key code value for the Down Arrow key (40). - */ - public static DOWN:number /*uint*/ = 40; - - /** - * Engage DVR application mode - */ - public static DVR:number /*uint*/ = 0x01000019; - - /** - * Constant associated with the key code value for the E key (69). - */ - public static E:number /*uint*/ = 69; - - /** - * Constant associated with the key code value for the End key (35). - */ - public static END:number /*uint*/ = 35; - - /** - * Constant associated with the key code value for the Enter key (13). - */ - public static ENTER:number /*uint*/ = 13; - - /** - * Constant associated with the key code value for the = key (187). - */ - public static EQUAL:number /*uint*/ = 187; - - /** - * Constant associated with the key code value for the Escape key (27). - */ - public static ESCAPE:number /*uint*/ = 27; - - /** - * Exits current application mode - */ - public static EXIT:number /*uint*/ = 0x01000015; - - /** - * Constant associated with the key code value for the F key (70). - */ - public static F:number /*uint*/ = 70; - - /** - * Constant associated with the key code value for the F1 key (112). - */ - public static F1:number /*uint*/ = 112; - - /** - * Constant associated with the key code value for the F10 key (121). - */ - public static F10:number /*uint*/ = 121; - - /** - * Constant associated with the key code value for the F11 key (122). - */ - public static F11:number /*uint*/ = 122; - - /** - * Constant associated with the key code value for the F12 key (123). - */ - public static F12:number /*uint*/ = 123; - - /** - * Constant associated with the key code value for the F13 key (124). - */ - public static F13:number /*uint*/ = 124; - - /** - * Constant associated with the key code value for the F14 key (125). - */ - public static F14:number /*uint*/ = 125; - - /** - * Constant associated with the key code value for the F15 key (126). - */ - public static F15:number /*uint*/ = 126; - - /** - * Constant associated with the key code value for the F2 key (113). - */ - public static F2:number /*uint*/ = 113; - - /** - * Constant associated with the key code value for the F3 key (114). - */ - public static F3:number /*uint*/ = 114; - - /** - * Constant associated with the key code value for the F4 key (115). - */ - public static F4:number /*uint*/ = 115; - - /** - * Constant associated with the key code value for the F5 key (116). - */ - public static F5:number /*uint*/ = 116; - - /** - * Constant associated with the key code value for the F6 key (117). - */ - public static F6:number /*uint*/ = 117; - - /** - * Constant associated with the key code value for the F7 key (118). - */ - public static F7:number /*uint*/ = 118; - - /** - * Constant associated with the key code value for the F8 key (119). - */ - public static F8:number /*uint*/ = 119; - - /** - * Constant associated with the key code value for the F9 key (120). - */ - public static F9:number /*uint*/ = 120; - - /** - * Engage fast-forward transport mode - */ - public static FAST_FORWARD:number /*uint*/ = 0x0100000A; - - /** - * Constant associated with the key code value for the G key (71). - */ - public static G:number /*uint*/ = 71; - - /** - * Green function key button - */ - public static GREEN:number /*uint*/ = 0x01000001; - - /** - * Engage program guide - */ - public static GUIDE:number /*uint*/ = 0x01000014; - - /** - * Constant associated with the key code value for the H key (72). - */ - public static H:number /*uint*/ = 72; - - /** - * Engage help application or context-sensitive help - */ - public static HELP:number /*uint*/ = 0x0100001D; - - /** - * Constant associated with the key code value for the Home key (36). - */ - public static HOME:number /*uint*/ = 36; - - /** - * Constant associated with the key code value for the I key (73). - */ - public static I:number /*uint*/ = 73; - - /** - * Info button - */ - public static INFO:number /*uint*/ = 0x01000013; - - /** - * Cycle input - */ - public static INPUT:number /*uint*/ = 0x0100001B; - - /** - * Constant associated with the key code value for the Insert key (45). - */ - public static INSERT:number /*uint*/ = 45; - - /** - * Constant associated with the key code value for the J key (74). - */ - public static J:number /*uint*/ = 74; - - /** - * Constant associated with the key code value for the K key (75). - */ - public static K:number /*uint*/ = 75; - - /** - * The Begin key - */ - public static KEYNAME_BEGIN:string = "Begin"; - - /** - * The Break key - */ - public static KEYNAME_BREAK:string = "Break"; - - /** - * The Clear Display key - */ - public static KEYNAME_CLEARDISPLAY:string = "ClrDsp"; - - /** - * The Clear Line key - */ - public static KEYNAME_CLEARLINE:string = "ClrLn"; - - /** - * The Delete key - */ - public static KEYNAME_DELETE:string = "Delete"; - - /** - * The Delete Character key - */ - public static KEYNAME_DELETECHAR:string = "DelChr"; - - /** - * The Delete Line key - */ - public static KEYNAME_DELETELINE:string = "DelLn"; - - /** - * The down arrow - */ - public static KEYNAME_DOWNARROW:string = "Down"; - - /** - * The End key - */ - public static KEYNAME_END:string = "End"; - - /** - * The Execute key - */ - public static KEYNAME_EXECUTE:string = "Exec"; - - /** - * The F1 key - */ - public static KEYNAME_F1:string = "F1"; - - /** - * The F10 key - */ - public static KEYNAME_F10:string = "F10"; - - /** - * The F11 key - */ - public static KEYNAME_F11:string = "F11"; - - /** - * The F12 key - */ - public static KEYNAME_F12:string = "F12"; - - /** - * The F13 key - */ - public static KEYNAME_F13:string = "F13"; - - /** - * The F14 key - */ - public static KEYNAME_F14:string = "F14"; - - /** - * The F15 key - */ - public static KEYNAME_F15:string = "F15"; - - /** - * The F16 key - */ - public static KEYNAME_F16:string = "F16"; - - /** - * The F17 key - */ - public static KEYNAME_F17:string = "F17"; - - /** - * The F18 key - */ - public static KEYNAME_F18:string = "F18"; - - /** - * The F19 key - */ - public static KEYNAME_F19:string = "F19"; - - /** - * The F2 key - */ - public static KEYNAME_F2:string = "F2"; - - /** - * The F20 key - */ - public static KEYNAME_F20:string = "F20"; - - /** - * The F21 key - */ - public static KEYNAME_F21:string = "F21"; - - /** - * The F22 key - */ - public static KEYNAME_F22:string = "F22"; - - /** - * The F23 key - */ - public static KEYNAME_F23:string = "F23"; - - /** - * The F24 key - */ - public static KEYNAME_F24:string = "F24"; - - /** - * The F25 key - */ - public static KEYNAME_F25:string = "F25"; - - /** - * The F26 key - */ - public static KEYNAME_F26:string = "F26"; - - /** - * The F27 key - */ - public static KEYNAME_F27:string = "F27"; - - /** - * The F28 key - */ - public static KEYNAME_F28:string = "F28"; - - /** - * The F29 key - */ - public static KEYNAME_F29:string = "F29"; - - /** - * The F3 key - */ - public static KEYNAME_F3:string = "F3"; - - /** - * The F30 key - */ - public static KEYNAME_F30:string = "F30"; - - /** - * The F31 key - */ - public static KEYNAME_F31:string = "F31"; - - /** - * The F32 key - */ - public static KEYNAME_F32:string = "F32"; - - /** - * The F33 key - */ - public static KEYNAME_F33:string = "F33"; - - /** - * The F34 key - */ - public static KEYNAME_F34:string = "F34"; - - /** - * The F35 key - */ - public static KEYNAME_F35:string = "F35"; - - /** - * The F4 key - */ - public static KEYNAME_F4:string = "F4"; - - /** - * The F5 key - */ - public static KEYNAME_F5:string = "F5"; - - /** - * The F6 key - */ - public static KEYNAME_F6:string = "F6"; - - /** - * The F7 key - */ - public static KEYNAME_F7:string = "F7"; - - /** - * The F8 key - */ - public static KEYNAME_F8:string = "F8"; - - /** - * The F9 key - */ - public static KEYNAME_F9:string = "F9"; - - /** - * The Find key - */ - public static KEYNAME_FIND:string = "Find"; - - /** - * The Help key - */ - public static KEYNAME_HELP:string = "Help"; - - /** - * The Home key - */ - public static KEYNAME_HOME:string = "Home"; - - /** - * The Insert key - */ - public static KEYNAME_INSERT:string = "Insert"; - - /** - * The Insert Character key - */ - public static KEYNAME_INSERTCHAR:string = "InsChr"; - - /** - * The Insert Line key - */ - public static KEYNAME_INSERTLINE:string = "LnsLn"; - - /** - * The left arrow - */ - public static KEYNAME_LEFTARROW:string = "Left"; - - /** - * The Menu key - */ - public static KEYNAME_MENU:string = "Menu"; - - /** - * The Mode Switch key - */ - public static KEYNAME_MODESWITCH:string = "ModeSw"; - - /** - * The Next key - */ - public static KEYNAME_NEXT:string = "Next"; - - /** - * The Page Down key - */ - public static KEYNAME_PAGEDOWN:string = "PgDn"; - - /** - * The Page Up key - */ - public static KEYNAME_PAGEUP:string = "PgUp"; - - /** - * The Pause key - */ - public static KEYNAME_PAUSE:string = "Pause"; - - /** - * The Previous key - */ - public static KEYNAME_PREV:string = "Prev"; - - /** - * The PRINT key - */ - public static KEYNAME_PRINT:string = "Print"; - - /** - * The PRINT Screen - */ - public static KEYNAME_PRINTSCREEN:string = "PrntScrn"; - - /** - * The Redo key - */ - public static KEYNAME_REDO:string = "Redo"; - - /** - * The Reset key - */ - public static KEYNAME_RESET:string = "Reset"; - - /** - * The right arrow - */ - public static KEYNAME_RIGHTARROW:string = "Right"; - - /** - * The Scroll Lock key - */ - public static KEYNAME_SCROLLLOCK:string = "ScrlLck"; - - /** - * The Select key - */ - public static KEYNAME_SELECT:string = "Select"; - - /** - * The Stop key - */ - public static KEYNAME_STOP:string = "Stop"; - - /** - * The System Request key - */ - public static KEYNAME_SYSREQ:string = "SysReq"; - - /** - * The System key - */ - public static KEYNAME_SYSTEM:string = "Sys"; - - /** - * The Undo key - */ - public static KEYNAME_UNDO:string = "Undo"; - - /** - * The up arrow - */ - public static KEYNAME_UPARROW:string = "Up"; - - /** - * The User key - */ - public static KEYNAME_USER:string = "User"; - - /** - * Constant associated with the key code value for the L key (76). - */ - public static L:number /*uint*/ = 76; - - /** - * Watch last channel or show watched - */ - public static LAST:number /*uint*/ = 0x01000011; - - /** - * Constant associated with the key code value for the Left Arrow key (37). - */ - public static LEFT:number /*uint*/ = 37; - - /** - * Constant associated with the key code value for the [ key (219). - */ - public static LEFTBRACKET:number /*uint*/ = 219; - - /** - * Return to live [position in broadcast] - */ - public static LIVE:number /*uint*/ = 0x01000010; - - /** - * Constant associated with the key code value for the M key (77). - */ - public static M:number /*uint*/ = 77; - - /** - * Engage "Master Shell" e.g. TiVo or other vendor button - */ - public static MASTER_SHELL:number /*uint*/ = 0x0100001E; - - /** - * Engage menu - */ - public static MENU:number /*uint*/ = 0x01000012; - - /** - * Constant associated with the key code value for the - key (189). - */ - public static MINUS:number /*uint*/ = 189; - - /** - * Constant associated with the key code value for the N key (78). - */ - public static N:number /*uint*/ = 78; - - /** - * Skip to next track or chapter - */ - public static NEXT:number /*uint*/ = 0x0100000E; - - /** - * Constant associated with the key code value for the 0 key (48). - */ - public static NUMBER_0:number /*uint*/ = 48; - - /** - * Constant associated with the key code value for the 1 key (49). - */ - public static NUMBER_1:number /*uint*/ = 49; - - /** - * Constant associated with the key code value for the 2 key (50). - */ - public static NUMBER_2:number /*uint*/ = 50; - - /** - * Constant associated with the key code value for the 3 key (51). - */ - public static NUMBER_3:number /*uint*/ = 51; - - /** - * Constant associated with the key code value for the 4 key (52). - */ - public static NUMBER_4:number /*uint*/ = 52; - - /** - * Constant associated with the key code value for the 5 key (53). - */ - public static NUMBER_5:number /*uint*/ = 53; - - /** - * Constant associated with the key code value for the 6 key (54). - */ - public static NUMBER_6:number /*uint*/ = 54; - - /** - * Constant associated with the key code value for the 7 key (55). - */ - public static NUMBER_7:number /*uint*/ = 55; - - /** - * Constant associated with the key code value for the 8 key (56). - */ - public static NUMBER_8:number /*uint*/ = 56; - - /** - * Constant associated with the key code value for the 9 key (57). - */ - public static NUMBER_9:number /*uint*/ = 57; - - /** - * Constant associated with the pseudo-key code for the the number pad (21). Use to set numpad modifier on key equivalents - */ - public static NUMPAD:number /*uint*/ = 21; - - /** - * Constant associated with the key code value for the number 0 key on the number pad (96). - */ - public static NUMPAD_0:number /*uint*/ = 96; - - /** - * Constant associated with the key code value for the number 1 key on the number pad (97). - */ - public static NUMPAD_1:number /*uint*/ = 97; - - /** - * Constant associated with the key code value for the number 2 key on the number pad (98). - */ - public static NUMPAD_2:number /*uint*/ = 98; - - /** - * Constant associated with the key code value for the number 3 key on the number pad (99). - */ - public static NUMPAD_3:number /*uint*/ = 99; - - /** - * Constant associated with the key code value for the number 4 key on the number pad (100). - */ - public static NUMPAD_4:number /*uint*/ = 100; - - /** - * Constant associated with the key code value for the number 5 key on the number pad (101). - */ - public static NUMPAD_5:number /*uint*/ = 101; - - /** - * Constant associated with the key code value for the number 6 key on the number pad (102). - */ - public static NUMPAD_6:number /*uint*/ = 102; - - /** - * Constant associated with the key code value for the number 7 key on the number pad (103). - */ - public static NUMPAD_7:number /*uint*/ = 103; - - /** - * Constant associated with the key code value for the number 8 key on the number pad (104). - */ - public static NUMPAD_8:number /*uint*/ = 104; - - /** - * Constant associated with the key code value for the number 9 key on the number pad (105). - */ - public static NUMPAD_9:number /*uint*/ = 105; - - /** - * Constant associated with the key code value for the addition key on the number pad (107). - */ - public static NUMPAD_ADD:number /*uint*/ = 107; - - /** - * Constant associated with the key code value for the decimal key on the number pad (110). - */ - public static NUMPAD_DECIMAL:number /*uint*/ = 110; - - /** - * Constant associated with the key code value for the division key on the number pad (111). - */ - public static NUMPAD_DIVIDE:number /*uint*/ = 111; - - /** - * Constant associated with the key code value for the Enter key on the number pad (108). - */ - public static NUMPAD_ENTER:number /*uint*/ = 108; - - /** - * Constant associated with the key code value for the multiplication key on the number pad (106). - */ - public static NUMPAD_MULTIPLY:number /*uint*/ = 106; - - /** - * Constant associated with the key code value for the subtraction key on the number pad (109). - */ - public static NUMPAD_SUBTRACT:number /*uint*/ = 109; - - /** - * Constant associated with the key code value for the O key (79). - */ - public static O:number /*uint*/ = 79; - - /** - * Constant associated with the key code value for the P key (80). - */ - public static P:number /*uint*/ = 80; - - /** - * Constant associated with the key code value for the Page Down key (34). - */ - public static PAGE_DOWN:number /*uint*/ = 34; - - /** - * Constant associated with the key code value for the Page Up key (33). - */ - public static PAGE_UP:number /*uint*/ = 33; - - /** - * Engage pause transport mode - */ - public static PAUSE:number /*uint*/ = 0x01000008; - - /** - * Constant associated with the key code value for the . key (190). - */ - public static PERIOD:number /*uint*/ = 190; - - /** - * Engage play transport mode - */ - public static PLAY:number /*uint*/ = 0x01000007; - - /** - * Skip to previous track or chapter - */ - public static PREVIOUS:number /*uint*/ = 0x0100000F; - - /** - * Constant associated with the key code value for the Q key (81). - */ - public static Q:number /*uint*/ = 81; - - /** - * Constant associated with the key code value for the ' key (222). - */ - public static QUOTE:number /*uint*/ = 222; - - /** - * Constant associated with the key code value for the R key (82). - */ - public static R:number /*uint*/ = 82; - - /** - * Record item or engage record transport mode - */ - public static RECORD:number /*uint*/ = 0x01000006; - - /** - * Red function key button - */ - public static RED:number /*uint*/ = 0x01000000; - - /** - * Engage rewind transport mode - */ - public static REWIND:number /*uint*/ = 0x0100000B; - - /** - * Constant associated with the key code value for the Right Arrow key (39). - */ - public static RIGHT:number /*uint*/ = 39; - - /** - * Constant associated with the key code value for the ] key (221). - */ - public static RIGHTBRACKET:number /*uint*/ = 221; - - /** - * Constant associated with the key code value for the S key (83). - */ - public static S:number /*uint*/ = 83; - - /** - * Search button - */ - public static SEARCH:number /*uint*/ = 0x0100001F; - - /** - * Constant associated with the key code value for the ; key (186). - */ - public static SEMICOLON:number /*uint*/ = 186; - - /** - * Engage setup application or menu - */ - public static SETUP:number /*uint*/ = 0x0100001C; - - /** - * Constant associated with the key code value for the Shift key (16). - */ - public static SHIFT:number /*uint*/ = 16; - - /** - * Quick skip backward (usually 7-10 seconds) - */ - public static SKIP_BACKWARD:number /*uint*/ = 0x0100000D; - - /** - * Quick skip ahead (usually 30 seconds) - */ - public static SKIP_FORWARD:number /*uint*/ = 0x0100000C; - - /** - * Constant associated with the key code value for the / key (191). - */ - public static SLASH:number /*uint*/ = 191; - - /** - * Constant associated with the key code value for the Spacebar (32). - */ - public static SPACE:number /*uint*/ = 32; - - /** - * Engage stop transport mode - */ - public static STOP:number /*uint*/ = 0x01000009; - - /** - * Toggle subtitles - */ - public static SUBTITLE:number /*uint*/ = 0x01000018; - - /** - * Constant associated with the key code value for the T key (84). - */ - public static T:number /*uint*/ = 84; - - /** - * Constant associated with the key code value for the Tab key (9). - */ - public static TAB:number /*uint*/ = 9; - - /** - * Constant associated with the key code value for the U key (85). - */ - public static U:number /*uint*/ = 85; - - /** - * Constant associated with the key code value for the Up Arrow key (38). - */ - public static UP:number /*uint*/ = 38; - - /** - * Constant associated with the key code value for the V key (86). - */ - public static V:number /*uint*/ = 86; - - /** - * Engage video-on-demand - */ - public static VOD:number /*uint*/ = 0x0100001A; - - /** - * Constant associated with the key code value for the W key (87). - */ - public static W:number /*uint*/ = 87; - - /** - * Constant associated with the key code value for the X key (88). - */ - public static X:number /*uint*/ = 88; - - /** - * Constant associated with the key code value for the Y key (89). - */ - public static Y:number /*uint*/ = 89; - - /** - * Yellow function key button - */ - public static YELLOW:number /*uint*/ = 0x01000002; - - /** - * Constant associated with the key code value for the Z key (90). - */ - public static Z:number /*uint*/ = 90; - - } -} \ No newline at end of file diff --git a/src/away/entities/Billboard.ts b/src/away/entities/Billboard.ts deleted file mode 100644 index 4dbf05c7..00000000 --- a/src/away/entities/Billboard.ts +++ /dev/null @@ -1,235 +0,0 @@ -/// - -/** - * The Billboard class represents display objects that represent bitmap images. - * These can be images that you load with the flash.Assets or - * flash.display.Loader classes, or they can be images that you - * create with the Billboard() constructor. - * - *

The Billboard() constructor allows you to create a Billboard - * object that contains a reference to a BitmapData object. After you create a - * Billboard object, use the addChild() or addChildAt() - * method of the parent DisplayObjectContainer instance to place the bitmap on - * the display list.

- * - *

A Billboard object can share its BitmapData reference among several Billboard - * objects, independent of translation or rotation properties. Because you can - * create multiple Billboard objects that reference the same BitmapData object, - * multiple display objects can use the same complex BitmapData object without - * incurring the memory overhead of a BitmapData object for each display - * object instance.

- * - *

A BitmapData object can be drawn to the screen by a Billboard object in one - * of two ways: by using the default hardware renderer with a single hardware surface, - * or by using the slower software renderer when 3D acceleration is not available.

- * - *

If you would prefer to perform a batch rendering command, rather than using a - * single surface for each Billboard object, you can also draw to the screen using the - * drawTiles() or drawTriangles() methods which are - * available to flash.display.Tilesheet and flash.display.Graphics - * objects.

- * - *

Note: The Billboard class is not a subclass of the InteractiveObject - * class, so it cannot dispatch mouse events. However, you can use the - * addEventListener() method of the display object container that - * contains the Billboard object.

- */ -module away.entities -{ - import IAnimator = away.animators.IAnimator; - import MaterialEvent = away.events.MaterialEvent; - import Matrix3D = away.geom.Matrix3D; - import UVTransform = away.geom.UVTransform; - import MaterialBase = away.materials.MaterialBase; - import IRenderer = away.render.IRenderer; - - export class Billboard extends away.base.DisplayObject implements IEntity, away.base.IMaterialOwner - { - private _animator:IAnimator; - private _billboardWidth:number; - private _billboardHeight:number; - private _material:MaterialBase; - private _uvTransform:UVTransform; - - private onSizeChangedDelegate:(event:MaterialEvent) => void; - - /** - * Defines the animator of the mesh. Act on the mesh's geometry. Defaults to null - */ - public get animator():IAnimator - { - return this._animator; - } - - /** - * - */ - public get assetType():string - { - return away.library.AssetType.BILLBOARD; - } - - /** - * The BitmapData object being referenced. - */ - public bitmapData:away.base.BitmapData; //TODO - - /** - * - */ - public get billboardHeight():number - { - return this._billboardHeight; - } - - /** - * - */ - public get billboardWidth():number - { - return this._billboardWidth; - } - - /** - * - */ - public get material():MaterialBase - { - return this._material; - } - - public set material(value:MaterialBase) - { - if (value == this._material) - return; - - if (this._material) { - this._material.iRemoveOwner(this); - this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); - } - - - this._material = value; - - if (this._material) { - this._material.iAddOwner(this); - this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); - } - } - - /** - * Controls whether or not the Billboard object is snapped to the nearest pixel. - * This value is ignored in the native and HTML5 targets. - * The PixelSnapping class includes possible values: - *
    - *
  • PixelSnapping.NEVER - No pixel snapping occurs.
  • - *
  • PixelSnapping.ALWAYS - The image is always snapped to - * the nearest pixel, independent of transformation.
  • - *
  • PixelSnapping.AUTO - The image is snapped to the - * nearest pixel if it is drawn with no rotation or skew and it is drawn at a - * scale factor of 99.9% to 100.1%. If these conditions are satisfied, the - * bitmap image is drawn at 100% scale, snapped to the nearest pixel. - * When targeting Flash Player, this value allows the image to be drawn as fast - * as possible using the internal vector renderer.
  • - *
- */ - public pixelSnapping:string; //TODO - - /** - * Controls whether or not the bitmap is smoothed when scaled. If - * true, the bitmap is smoothed when scaled. If - * false, the bitmap is not smoothed when scaled. - */ - public smoothing:boolean; //TODO - - /** - * - */ - public get uvTransform():UVTransform - { - return this._uvTransform; - } - - public set uvTransform(value:UVTransform) - { - this._uvTransform = value; - } - - constructor(material:MaterialBase, pixelSnapping:string = "auto", smoothing:boolean = false) - { - super(); - - this._pIsEntity = true; - - this.onSizeChangedDelegate = (event:MaterialEvent) => this.onSizeChanged(event); - - this.material = material; - - this._billboardWidth = material.width; - this._billboardHeight = material.height; - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():away.partition.EntityNode - { - return new away.partition.EntityNode(this); - } - - /** - * @protected - */ - public pUpdateBounds() - { - this._pBounds.fromExtremes(0, 0, 0, this._billboardWidth, this._billboardHeight, 0); - - super.pUpdateBounds(); - } - - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - public _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean - { - return this._pPickingCollider.testBillboardCollision(this, this._pPickingCollisionVO, shortestCollisionDistance); - } - - /** - * @private - */ - private onSizeChanged(event:MaterialEvent) - { - this._billboardWidth = this._material.width; - this._billboardHeight = this._material.height; - - this._pBoundsInvalid = true; - - var len:number = this._pRenderables.length; - for (var i:number = 0; i < len; i++) - this._pRenderables[i].invalidateVertexData("vertices"); //TODO - } - - public _iCollectRenderables(renderer:IRenderer) - { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - this._iCollectRenderable(renderer); - } - - public _iCollectRenderable(renderer:IRenderer) - { - renderer.applyBillboard(this); - } - } -} \ No newline at end of file diff --git a/src/away/entities/Camera.ts b/src/away/entities/Camera.ts deleted file mode 100644 index d620ae6d..00000000 --- a/src/away/entities/Camera.ts +++ /dev/null @@ -1,278 +0,0 @@ -/// - -module away.entities -{ - export class Camera extends away.containers.DisplayObjectContainer implements away.entities.IEntity - { - private _viewProjection:away.geom.Matrix3D = new away.geom.Matrix3D(); - private _viewProjectionDirty:Boolean = true; - private _projection:away.projections.IProjection; - private _frustumPlanes:Array; - private _frustumPlanesDirty:Boolean = true; - private _onProjectionMatrixChangedDelegate:Function; - - constructor(projection:away.projections.IProjection = null) - { - super(); - - this._pIsEntity = true; - - this._onProjectionMatrixChangedDelegate = away.utils.Delegate.create(this, this.onProjectionMatrixChanged); - - this._projection = projection || new away.projections.PerspectiveProjection(); - this._projection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - - this._frustumPlanes = []; - - for (var i:number = 0; i < 6; ++i) - this._frustumPlanes[i] = new away.geom.Plane3D(); - - this.z = -1000; - - } - - public pCreateDefaultBoundingVolume():away.bounds.BoundingVolumeBase - { - return new away.bounds.NullBounds(); - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():away.partition.EntityNode - { - return new away.partition.CameraNode(this); - } - - //@override - public get assetType():string - { - return away.library.AssetType.CAMERA; - } - - private onProjectionMatrixChanged(event:away.events.ProjectionEvent) - { - this._viewProjectionDirty = true; - this._frustumPlanesDirty = true; - this.dispatchEvent(event); - } - - public get frustumPlanes():Array - { - if (this._frustumPlanesDirty) - this.updateFrustum(); - - return this._frustumPlanes; - } - - private updateFrustum() - { - var a:number, b:number, c:number; - //var d : Number; - var c11:number, c12:number, c13:number, c14:number; - var c21:number, c22:number, c23:number, c24:number; - var c31:number, c32:number, c33:number, c34:number; - var c41:number, c42:number, c43:number, c44:number; - var p:away.geom.Plane3D; - var raw:number[] = new Array(16); - ;//new Array(16 );away.utils.Matrix3DUtils.RAW_DATA_CONTAINER;//[]; - var invLen:number; - this.viewProjection.copyRawDataTo(raw); - - c11 = raw[0]; - c12 = raw[4]; - c13 = raw[8]; - c14 = raw[12]; - c21 = raw[1]; - c22 = raw[5]; - c23 = raw[9]; - c24 = raw[13]; - c31 = raw[2]; - c32 = raw[6]; - c33 = raw[10]; - c34 = raw[14]; - c41 = raw[3]; - c42 = raw[7]; - c43 = raw[11]; - c44 = raw[15]; - - // left plane - p = this._frustumPlanes[0]; - a = c41 + c11; - b = c42 + c12; - c = c43 + c13; - invLen = 1/Math.sqrt(a*a + b*b + c*c); - p.a = a*invLen; - p.b = b*invLen; - p.c = c*invLen; - p.d = -(c44 + c14)*invLen; - - // right plane - p = this._frustumPlanes[1]; - a = c41 - c11; - b = c42 - c12; - c = c43 - c13; - invLen = 1/Math.sqrt(a*a + b*b + c*c); - p.a = a*invLen; - p.b = b*invLen; - p.c = c*invLen; - p.d = (c14 - c44)*invLen; - - // bottom - p = this._frustumPlanes[2]; - a = c41 + c21; - b = c42 + c22; - c = c43 + c23; - invLen = 1/Math.sqrt(a*a + b*b + c*c); - p.a = a*invLen; - p.b = b*invLen; - p.c = c*invLen; - p.d = -(c44 + c24)*invLen; - - // top - p = this._frustumPlanes[3]; - a = c41 - c21; - b = c42 - c22; - c = c43 - c23; - invLen = 1/Math.sqrt(a*a + b*b + c*c); - p.a = a*invLen; - p.b = b*invLen; - p.c = c*invLen; - p.d = (c24 - c44)*invLen; - - // near - p = this._frustumPlanes[4]; - a = c31; - b = c32; - c = c33; - invLen = 1/Math.sqrt(a*a + b*b + c*c); - p.a = a*invLen; - p.b = b*invLen; - p.c = c*invLen; - p.d = -c34*invLen; - - // far - p = this._frustumPlanes[5]; - a = c41 - c31; - b = c42 - c32; - c = c43 - c33; - invLen = 1/Math.sqrt(a*a + b*b + c*c); - p.a = a*invLen; - p.b = b*invLen; - p.c = c*invLen; - p.d = (c34 - c44)*invLen; - - this._frustumPlanesDirty = false; - - } - - /** - * @protected - */ - public pInvalidateSceneTransform() - { - super.pInvalidateSceneTransform(); - - this._viewProjectionDirty = true; - this._frustumPlanesDirty = true; - } - - /** - * @protected - */ - public pUpdateBounds() - { - this._pBoundsInvalid = false; - this._pBounds.nullify(); - } - - /** - * - */ - public get projection():away.projections.IProjection - { - return this._projection; - } - - public set projection(value:away.projections.IProjection) - { - if (this._projection == value) - return; - - if (!value) - throw new Error("Projection cannot be null!"); - - this._projection.removeEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - this._projection = value; - this._projection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - this.dispatchEvent(new away.events.CameraEvent(away.events.CameraEvent.PROJECTION_CHANGED, this)); - } - - /** - * - */ - public get viewProjection():away.geom.Matrix3D - { - if (this._viewProjectionDirty) { - this._viewProjection.copyFrom(this.inverseSceneTransform); - this._viewProjection.append(this._projection.matrix); - this._viewProjectionDirty = false; - } - - return this._viewProjection; - } - - /** - * Calculates the ray in scene space from the camera to the given normalized coordinates in screen space. - * - * @param nX The normalised x coordinate in screen space, -1 corresponds to the left edge of the viewport, 1 to the right. - * @param nY The normalised y coordinate in screen space, -1 corresponds to the top edge of the viewport, 1 to the bottom. - * @param sZ The z coordinate in screen space, representing the distance into the screen. - * @return The ray from the camera to the scene space position of the given screen coordinates. - */ - public getRay(nX:number, nY:number, sZ:number):away.geom.Vector3D - { - return this.sceneTransform.deltaTransformVector(this._projection.unproject(nX, nY, sZ)); - } - - /** - * Calculates the normalised position in screen space of the given scene position. - * - * @param point3d the position vector of the scene coordinates to be projected. - * @return The normalised screen position of the given scene coordinates. - */ - public project(point3d:away.geom.Vector3D):away.geom.Vector3D - { - return this._projection.project(this.inverseSceneTransform.transformVector(point3d)); - } - - /** - * Calculates the scene position of the given normalized coordinates in screen space. - * - * @param nX The normalised x coordinate in screen space, minus the originX offset of the projection property. - * @param nY The normalised y coordinate in screen space, minus the originY offset of the projection property. - * @param sZ The z coordinate in screen space, representing the distance into the screen. - * @return The scene position of the given screen coordinates. - */ - public unproject(nX:number, nY:number, sZ:number):away.geom.Vector3D - { - return this.sceneTransform.transformVector(this._projection.unproject(nX, nY, sZ)); - } - - public _iCollectRenderables(renderer:away.render.IRenderer) - { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - this._iCollectRenderable(renderer); - } - - public _iCollectRenderable(renderer:away.render.IRenderer) - { - //nothing to do here - } - } -} \ No newline at end of file diff --git a/src/away/entities/DirectionalLight.ts b/src/away/entities/DirectionalLight.ts deleted file mode 100644 index 62a5f3ba..00000000 --- a/src/away/entities/DirectionalLight.ts +++ /dev/null @@ -1,171 +0,0 @@ -/// - -module away.entities -{ - import BoundingVolumeBase = away.bounds.BoundingVolumeBase; - import NullBounds = away.bounds.NullBounds; - import Camera = away.entities.Camera; - import IEntity = away.entities.IEntity; - import Matrix3D = away.geom.Matrix3D; - import Vector3D = away.geom.Vector3D; - import DirectionalShadowMapper = away.materials.DirectionalShadowMapper; - import DirectionalLightNode = away.partition.DirectionalLightNode; - import EntityNode = away.partition.EntityNode; - import IRenderer = away.render.IRenderer; - - export class DirectionalLight extends away.base.LightBase implements away.entities.IEntity - { - private _direction:Vector3D; - private _tmpLookAt:Vector3D; - private _sceneDirection:Vector3D; - private _projAABBPoints:Array; - - constructor(xDir:number = 0, yDir:number = -1, zDir:number = 1) - { - super(); - - this._pIsEntity = true; - - this.direction = new Vector3D(xDir, yDir, zDir); - - this._sceneDirection = new Vector3D(); - } - - public get sceneDirection():Vector3D - { - if (this._pSceneTransformDirty) - this.pUpdateSceneTransform(); - - return this._sceneDirection; - } - - public get direction():Vector3D - { - return this._direction; - } - - public set direction(value:Vector3D) - { - this._direction = value; - - if (!this._tmpLookAt) - this._tmpLookAt = new Vector3D(); - - this._tmpLookAt.x = this.x + this._direction.x; - this._tmpLookAt.y = this.y + this._direction.y; - this._tmpLookAt.z = this.z + this._direction.z; - - this.lookAt(this._tmpLookAt); - } - - /** - * - * @returns {away.bounds.NullBounds} - */ - public pCreateDefaultBoundingVolume():BoundingVolumeBase - { - //directional lights are to be considered global, hence always in view - return new NullBounds(); - } - - /** - * - */ - public pUpdateBounds() - { - } - - //@override - public pUpdateSceneTransform() - { - super.pUpdateSceneTransform(); - this.sceneTransform.copyColumnTo(2, this._sceneDirection); - this._sceneDirection.normalize(); - } - - //@override - public pCreateShadowMapper():DirectionalShadowMapper - { - return new DirectionalShadowMapper(); - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():EntityNode - { - return new DirectionalLightNode(this); - } - - //override - public iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D - { - var raw:Array = new Array(); - var bounds:BoundingVolumeBase = entity.bounds; - var m:Matrix3D = new Matrix3D(); - - m.copyFrom(entity.getRenderSceneTransform(camera)); - m.append(this.inverseSceneTransform); - - if (!this._projAABBPoints) - this._projAABBPoints = []; - - m.transformVectors(bounds.aabbPoints, this._projAABBPoints); - - var xMin:number = Infinity, xMax:number = -Infinity; - var yMin:number = Infinity, yMax:number = -Infinity; - var zMin:number = Infinity, zMax:number = -Infinity; - var d:number; - for (var i:number = 0; i < 24;) { - d = this._projAABBPoints[i++]; - - if (d < xMin) - xMin = d; - - if (d > xMax) - xMax = d; - - d = this._projAABBPoints[i++]; - - if (d < yMin) - yMin = d; - - if (d > yMax) - yMax = d; - - d = this._projAABBPoints[i++]; - - if (d < zMin) - zMin = d; - - if (d > zMax) - zMax = d; - } - - var invXRange:number = 1/(xMax - xMin); - var invYRange:number = 1/(yMax - yMin); - var invZRange:number = 1/(zMax - zMin); - raw[0] = 2*invXRange; - raw[5] = 2*invYRange; - raw[10] = invZRange; - raw[12] = -(xMax + xMin)*invXRange; - raw[13] = -(yMax + yMin)*invYRange; - raw[14] = -zMin*invZRange; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - raw[15] = 1; - - if (!target) - target = new Matrix3D(); - - target.copyRawDataFrom(raw); - target.prepend(m); - - return target; - } - - public _iCollectRenderables(renderer:IRenderer) - { - //nothing to do here - } - } -} \ No newline at end of file diff --git a/src/away/entities/IEntity.ts b/src/away/entities/IEntity.ts deleted file mode 100644 index 82e69f8a..00000000 --- a/src/away/entities/IEntity.ts +++ /dev/null @@ -1,139 +0,0 @@ -/// - -module away.entities -{ - export interface IEntity extends away.library.IAsset - { - x:number; - y:number; - z:number; - - rotationX:number; - rotationY:number; - rotationZ:number; - - scaleX:number; - scaleY:number; - scaleZ:number; - - /** - * - */ - bounds:away.bounds.BoundingVolumeBase; - - /** - * - */ - castsShadows:boolean; - - /** - * - */ - inverseSceneTransform:away.geom.Matrix3D; - - /** - * - */ - partitionNode:away.partition.EntityNode; - - /** - * - */ - pickingCollider:away.pick.IPickingCollider; - - /** - * - */ - transform:away.geom.Transform; - - /** - * - */ - scene:away.containers.Scene; - - /** - * - */ - scenePosition:away.geom.Vector3D; - - /** - * - */ - sceneTransform:away.geom.Matrix3D; - - /** - * - */ - worldBounds:away.bounds.BoundingVolumeBase; - - /** - * - */ - zOffset:number - - /** - * - */ - isIntersectingRay(rayPosition:away.geom.Vector3D, rayDirection:away.geom.Vector3D):boolean; - - /** - * - * - * @param target - * @param upAxis - */ - lookAt(target:away.geom.Vector3D, upAxis?:away.geom.Vector3D); - - /** - * @internal - */ - _iPickingCollisionVO:away.pick.PickingCollisionVO; - - /** - * @internal - */ - _iController:away.controllers.ControllerBase; - - /** - * @internal - */ - _iAssignedPartition:away.partition.Partition; - - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean; - - /** - * @internal - */ - _iIsMouseEnabled():boolean - - /** - * @internal - */ - _iIsVisible():boolean - - _iInternalUpdate() - - /** - * The transformation matrix that transforms from model to world space, adapted with any special operations needed to render. - * For example, assuring certain alignedness which is not inherent in the scene transform. By default, this would - * return the scene transform. - */ - getRenderSceneTransform(camera:away.entities.Camera):away.geom.Matrix3D; - - /** - * - * @param renderer - * @private - */ - _iCollectRenderables(renderer:away.render.IRenderer); - } -} \ No newline at end of file diff --git a/src/away/entities/LightProbe.ts b/src/away/entities/LightProbe.ts deleted file mode 100644 index 58819e7e..00000000 --- a/src/away/entities/LightProbe.ts +++ /dev/null @@ -1,82 +0,0 @@ -/// - -module away.entities -{ - import BoundingVolumeBase = away.bounds.BoundingVolumeBase; - import NullBounds = away.bounds.NullBounds; - import Camera = away.entities.Camera; - import IEntity = away.entities.IEntity; - import Matrix3D = away.geom.Matrix3D; - import Vector3D = away.geom.Vector3D; - import EntityNode = away.partition.EntityNode; - import LightProbeNode = away.partition.LightProbeNode; - import IRenderer = away.render.IRenderer; - import CubeTextureBase = away.textures.CubeTextureBase; - - export class LightProbe extends away.base.LightBase implements away.entities.IEntity - { - private _diffuseMap:CubeTextureBase; - private _specularMap:CubeTextureBase; - - constructor(diffuseMap:CubeTextureBase, specularMap:CubeTextureBase = null) - { - super(); - - this._pIsEntity = true; - - this._diffuseMap = diffuseMap; - this._specularMap = specularMap; - } - - public get diffuseMap():CubeTextureBase - { - return this._diffuseMap; - } - - public set diffuseMap(value:CubeTextureBase) - { - this._diffuseMap = value; - } - - public get specularMap():CubeTextureBase - { - return this._specularMap; - } - - public set specularMap(value:CubeTextureBase) - { - this._specularMap = value; - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():EntityNode - { - return new LightProbeNode(this); - } - - //@override - public pUpdateBounds() - { - this._pBoundsInvalid = false; - } - - //@override - public pCreateDefaultBoundingVolume():BoundingVolumeBase - { - return new NullBounds(); - } - - //@override - public iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D - { - throw new away.errors.Error("Object projection matrices are not supported for LightProbe objects!"); - } - - public _iCollectRenderables(renderer:IRenderer) - { - //nothing to do here - } - } -} \ No newline at end of file diff --git a/src/away/entities/LineSegment.ts b/src/away/entities/LineSegment.ts deleted file mode 100644 index 8712442c..00000000 --- a/src/away/entities/LineSegment.ts +++ /dev/null @@ -1,218 +0,0 @@ -module away.entities -{ - import IAnimator = away.animators.IAnimator; - import MaterialEvent = away.events.MaterialEvent; - import Matrix3D = away.geom.Matrix3D; - import UVTransform = away.geom.UVTransform; - import Vector3D = away.geom.Vector3D; - import MaterialBase = away.materials.MaterialBase; - import EntityNode = away.partition.EntityNode; - import IRenderer = away.render.IRenderer; - - /** - * A Line Segment primitive. - */ - export class LineSegment extends away.base.DisplayObject implements IEntity, away.base.IMaterialOwner - { - private _animator:IAnimator; - private _material:MaterialBase; - private _uvTransform:UVTransform; - - private onSizeChangedDelegate:(event:MaterialEvent) => void; - - public _startPosition:Vector3D; - public _endPosition:Vector3D; - public _halfThickness:number; - - - /** - * Defines the animator of the line segment. Act on the line segment's geometry. Defaults to null - */ - public get animator():IAnimator - { - return this._animator; - } - - /** - * - */ - public get assetType():string - { - return away.library.AssetType.LINE_SEGMENT; - } - - /** - * - */ - public get startPostion():Vector3D - { - return this._startPosition; - } - - public set startPosition(value:Vector3D) - { - if (this._startPosition == value) - return; - - this._startPosition = value; - - this.notifyRenderableUpdate(); - } - - /** - * - */ - public get endPosition():Vector3D - { - return this._endPosition; - } - - public set endPosition(value:Vector3D) - { - if (this._endPosition == value) - return; - - this._endPosition = value; - - this.notifyRenderableUpdate(); - } - - /** - * - */ - public get material():MaterialBase - { - return this._material; - } - - public set material(value:MaterialBase) - { - if (value == this._material) - return; - - if (this._material) { - this._material.iRemoveOwner(this); - this._material.removeEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); - } - - - this._material = value; - - if (this._material) { - this._material.iAddOwner(this); - this._material.addEventListener(MaterialEvent.SIZE_CHANGED, this.onSizeChangedDelegate); - } - } - - /** - * - */ - public get thickness():number - { - return this._halfThickness*2; - } - - public set thickness(value:number) - { - if (this._halfThickness == value) - return; - - this._halfThickness = value*0.5; - - this.notifyRenderableUpdate(); - } - - /** - * - */ - public get uvTransform():UVTransform - { - return this._uvTransform; - } - - public set uvTransform(value:UVTransform) - { - this._uvTransform = value; - } - - /** - * Create a line segment - * - * @param startPosition Start position of the line segment - * @param endPosition Ending position of the line segment - * @param thickness Thickness of the line - */ - constructor(material:MaterialBase, startPosition:Vector3D, endPosition:Vector3D, thickness:number = 1) - { - super(); - - this._pIsEntity = true; - - this.onSizeChangedDelegate = (event:MaterialEvent) => this.onSizeChanged(event); - - this.material = material; - - this._startPosition = startPosition; - this._endPosition = endPosition; - this._halfThickness = thickness*0.5; - } - - public dispose() - { - this._startPosition = null; - this._endPosition = null; - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():EntityNode - { - return new EntityNode(this); - } - - /** - * @protected - */ - public pUpdateBounds() - { - this._pBounds.fromExtremes(this._startPosition.x, this._startPosition.y, this._startPosition.z, this._endPosition.x, this._endPosition.y, this._endPosition.z); - - super.pUpdateBounds(); - } - - /** - * @private - */ - private onSizeChanged(event:MaterialEvent) - { - this.notifyRenderableUpdate(); - } - - /** - * @private - */ - private notifyRenderableUpdate() - { - var len:number = this._pRenderables.length; - for (var i:number = 0; i < len; i++) - this._pRenderables[i].invalidateVertexData("vertices"); //TODO - } - - public _iCollectRenderables(renderer:IRenderer) - { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - this._iCollectRenderable(renderer); - } - - public _iCollectRenderable(renderer:IRenderer) - { - //TODO - } - } -} diff --git a/src/away/entities/Mesh.ts b/src/away/entities/Mesh.ts deleted file mode 100644 index 5f52b39b..00000000 --- a/src/away/entities/Mesh.ts +++ /dev/null @@ -1,457 +0,0 @@ -/// - -module away.entities -{ - import IAnimator = away.animators.IAnimator; - import SubGeometryBase = away.base.SubGeometryBase; - import SubGeometry = away.base.TriangleSubGeometry; - import ISubMesh = away.base.ISubMesh; - import ISubMeshClass = away.base.ISubMeshClass; - import Geometry = away.base.Geometry; - import GeometryEvent = away.events.GeometryEvent; - import UVTransform = away.geom.UVTransform; - import MaterialBase = away.materials.MaterialBase; - import EntityNode = away.partition.EntityNode; - import IRenderer = away.render.IRenderer; - - /** - * Mesh is an instance of a Geometry, augmenting it with a presence in the scene graph, a material, and an animation - * state. It consists out of SubMeshes, which in turn correspond to SubGeometries. SubMeshes allow different parts - * of the geometry to be assigned different materials. - */ - export class Mesh extends away.containers.DisplayObjectContainer implements IEntity - { - private _uvTransform:UVTransform; - - private _subMeshes:Array; - private _geometry:Geometry; - private _material:MaterialBase; - private _animator:IAnimator; - private _castsShadows:boolean = true; - private _shareAnimationGeometry:boolean = true; - - private _onGeometryBoundsInvalidDelegate:Function; - private _onSubGeometryAddedDelegate:Function; - private _onSubGeometryRemovedDelegate:Function; - - /** - * Defines the animator of the mesh. Act on the mesh's geometry. Default value is null. - */ - public get animator():IAnimator - { - return this._animator; - } - - public set animator(value:IAnimator) - { - if (this._animator) - this._animator.removeOwner(this); - - this._animator = value; - - var len:number = this._subMeshes.length; - var subMesh:away.base.ISubMesh; - - for (var i:number = 0; i < len; ++i) { - subMesh = this._subMeshes[i]; - - // cause material to be unregistered and registered again to work with the new animation type (if possible) - if (subMesh.material) { - subMesh.material.iRemoveOwner(subMesh); - subMesh.material.iAddOwner(subMesh); - } - - //invalidate any existing renderables in case they need to pull new geometry - subMesh._iInvalidateRenderableGeometry(); - } - - if (this._animator) - this._animator.addOwner(this); - } - - /** - * - */ - public get assetType():string - { - return away.library.AssetType.MESH; - } - - /** - * Indicates whether or not the Mesh can cast shadows. Default value is true. - */ - public get castsShadows():boolean - { - return this._castsShadows; - } - - public set castsShadows(value:boolean) - { - this._castsShadows = value; - } - - /** - * The geometry used by the mesh that provides it with its shape. - */ - public get geometry():Geometry - { - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - return this._geometry; - } - - public set geometry(value:Geometry) - { - var i:number; - - if (this._geometry) { - this._geometry.removeEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); - this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); - this._geometry.removeEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); - - for (i = 0; i < this._subMeshes.length; ++i) - this._subMeshes[i].dispose(); - - this._subMeshes.length = 0; - } - - this._geometry = value; - - if (this._geometry) { - - this._geometry.addEventListener(GeometryEvent.BOUNDS_INVALID, this._onGeometryBoundsInvalidDelegate); - this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_ADDED, this._onSubGeometryAddedDelegate); - this._geometry.addEventListener(GeometryEvent.SUB_GEOMETRY_REMOVED, this._onSubGeometryRemovedDelegate); - - var subGeoms:Array = this._geometry.subGeometries; - - for (i = 0; i < subGeoms.length; ++i) - this.addSubMesh(subGeoms[i]); - } - } - - /** - * The material with which to render the Mesh. - */ - public get material():MaterialBase - { - return this._material; - } - - public set material(value:MaterialBase) - { - if (value == this._material) - return; - - var i:number; - var len:number = this._subMeshes.length; - var subMesh:ISubMesh; - - for (i = 0; i < len; i++) - if (this._material && (subMesh = this._subMeshes[i]).material == this._material) - this._material.iRemoveOwner(subMesh); - - this._material = value; - - for (i = 0; i < len; i++) - if (this._material && (subMesh = this._subMeshes[i]).material == this._material) - this._material.iAddOwner(subMesh); - } - - /** - * Indicates whether or not the mesh share the same animation geometry. - */ - public get shareAnimationGeometry():boolean - { - return this._shareAnimationGeometry; - } - - public set shareAnimationGeometry(value:boolean) - { - this._shareAnimationGeometry = value; - } - - /** - * The SubMeshes out of which the Mesh consists. Every SubMesh can be assigned a material to override the Mesh's - * material. - */ - public get subMeshes():Array - { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - return this._subMeshes; - } - - /** - * - */ - public get uvTransform():UVTransform - { - return this._uvTransform; - } - - public set uvTransform(value:away.geom.UVTransform) - { - this._uvTransform = value; - } - - /** - * Create a new Mesh object. - * - * @param geometry The geometry used by the mesh that provides it with its shape. - * @param material [optional] The material with which to render the Mesh. - */ - constructor(geometry:Geometry, material:MaterialBase = null) - { - super(); - - this._pIsEntity = true; - - this._subMeshes = new Array(); - - this._onGeometryBoundsInvalidDelegate = (event:GeometryEvent) => this.onGeometryBoundsInvalid(event); - this._onSubGeometryAddedDelegate = (event:GeometryEvent) => this.onSubGeometryAdded(event); - this._onSubGeometryRemovedDelegate = (event:GeometryEvent) => this.onSubGeometryRemoved(event); - - //this should never happen, but if people insist on trying to create their meshes before they have geometry to fill it, it becomes necessary - this.geometry = geometry || new Geometry(); - - this.material = material; - } - - /** - * - */ - public bakeTransformations() - { - this.geometry.applyTransformation(this._iMatrix3D); - this._iMatrix3D.identity(); - } - - /** - * @inheritDoc - */ - public dispose() - { - super.dispose(); - - this.material = null; - this.geometry = null; - } - - /** - * Disposes mesh including the animator and children. This is a merely a convenience method. - * @return - */ - public disposeWithAnimatorAndChildren() - { - this.disposeWithChildren(); - - if (this._animator) - this._animator.dispose(); - } - - /** - * Clones this Mesh instance along with all it's children, while re-using the same - * material, geometry and animation set. The returned result will be a copy of this mesh, - * containing copies of all of it's children. - * - * Properties that are re-used (i.e. not cloned) by the new copy include name, - * geometry, and material. Properties that are cloned or created anew for the copy - * include subMeshes, children of the mesh, and the animator. - * - * If you want to copy just the mesh, reusing it's geometry and material while not - * cloning it's children, the simplest way is to create a new mesh manually: - * - * - * var clone : Mesh = new Mesh(original.geometry, original.material); - * - */ - public clone():away.base.DisplayObject - { - var clone:Mesh = new Mesh(this._geometry, this._material); - - clone._iMatrix3D = this._iMatrix3D; - clone.pivot = this.pivot; - clone.partition = this.partition; - clone.bounds = this.bounds.clone(); - - - clone.name = this.name; - clone.castsShadows = this.castsShadows; - clone.shareAnimationGeometry = this.shareAnimationGeometry; - clone.mouseEnabled = this.mouseEnabled; - clone.mouseChildren = this.mouseChildren; - //this is of course no proper cloning - //maybe use this instead?: http://blog.another-d-mention.ro/programming/how-to-clone-duplicate-an-object-in-actionscript-3/ - clone.extra = this.extra; - - var len:number = this._subMeshes.length; - for (var i:number = 0; i < len; ++i) - clone._subMeshes[i].material = this._subMeshes[i]._iGetExplicitMaterial(); - - - len = this.numChildren; - var obj:any; - - for (i = 0; i < len; ++i) { - obj = this.getChildAt(i).clone(); - clone.addChild( obj); - } - - if (this._animator) - clone.animator = this._animator.clone(); - - return clone; - } - - /** - * //TODO - * - * @param subGeometry - * @returns {SubMeshBase} - */ - public getSubMeshFromSubGeometry(subGeometry:SubGeometry):ISubMesh - { - return this._subMeshes[this._geometry.subGeometries.indexOf(subGeometry)]; - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():away.partition.EntityNode - { - return new away.partition.EntityNode(this); - } - - /** - * //TODO - * - * @protected - */ - public pUpdateBounds() - { - this._pBounds.fromGeometry(this._geometry); - - super.pUpdateBounds(); - } - - /** - * //TODO - * - * @private - */ - private onGeometryBoundsInvalid(event:GeometryEvent) - { - this.pInvalidateBounds(); - } - - /** - * Called when a SubGeometry was added to the Geometry. - * - * @private - */ - private onSubGeometryAdded(event:GeometryEvent) - { - this.addSubMesh(event.subGeometry); - } - - /** - * Called when a SubGeometry was removed from the Geometry. - * - * @private - */ - private onSubGeometryRemoved(event:GeometryEvent) - { - var subMesh:ISubMesh; - var subGeom:SubGeometryBase = event.subGeometry; - var len:number = this._subMeshes.length; - var i:number; - - // Important! This has to be done here, and not delayed until the - // next render loop, since this may be caused by the geometry being - // rebuilt IN THE RENDER LOOP. Invalidating and waiting will delay - // it until the NEXT RENDER FRAME which is probably not desirable. - for (i = 0; i < len; ++i) { - - subMesh = this._subMeshes[i]; - - if (subMesh.subGeometry == subGeom) { - subMesh.dispose(); - - this._subMeshes.splice(i, 1); - - break; - } - } - - --len; - for (; i < len; ++i) - this._subMeshes[i]._iIndex = i; - } - - /** - * Adds a SubMeshBase wrapping a SubGeometry. - * - * @param subGeometry - */ - private addSubMesh(subGeometry:SubGeometryBase) - { - var SubMeshClass:ISubMeshClass = subGeometry.subMeshClass; - - var subMesh:ISubMesh = new SubMeshClass(subGeometry, this, null); - var len:number = this._subMeshes.length; - - subMesh._iIndex = len; - - this._subMeshes[len] = subMesh; - - this.pInvalidateBounds(); - } - - /** - * //TODO - * - * @param shortestCollisionDistance - * @param findClosest - * @returns {boolean} - * - * @internal - */ - public _iTestCollision(shortestCollisionDistance:number, findClosest:boolean):boolean - { - return this._pPickingCollider.testMeshCollision(this, this._pPickingCollisionVO, shortestCollisionDistance, findClosest); - } - - /** - * - * @param renderer - * - * @internal - */ - public _iCollectRenderables(renderer:IRenderer) - { - // Since this getter is invoked every iteration of the render loop, and - // the prefab construct could affect the sub-meshes, the prefab is - // validated here to give it a chance to rebuild. - if (this._iSourcePrefab) - this._iSourcePrefab._iValidate(); - - var len:number /*uint*/ = this._subMeshes.length; - for (var i:number /*uint*/ = 0; i < len; i++) - this._subMeshes[i]._iCollectRenderable(renderer); - } - - public _iInvalidateRenderableGeometries() - { - var len:number = this._subMeshes.length; - for (var i:number = 0; i < len; ++i) - this._subMeshes[i]._iInvalidateRenderableGeometry(); - } - } -} diff --git a/src/away/entities/PointLight.ts b/src/away/entities/PointLight.ts deleted file mode 100644 index 75413ae8..00000000 --- a/src/away/entities/PointLight.ts +++ /dev/null @@ -1,146 +0,0 @@ -/// - -module away.entities -{ - import BoundingSphere = away.bounds.BoundingSphere; - import BoundingVolumeBase = away.bounds.BoundingVolumeBase; - import Camera = away.entities.Camera; - import IEntity = away.entities.IEntity; - import Box = away.geom.Box; - import Matrix3D = away.geom.Matrix3D; - import Vector3D = away.geom.Vector3D; - import CubeMapShadowMapper = away.materials.CubeMapShadowMapper; - import EntityNode = away.partition.EntityNode; - import PointLightNode = away.partition.PointLightNode; - import IRenderer = away.render.IRenderer; - - export class PointLight extends away.base.LightBase implements away.entities.IEntity - { - public _pRadius:number = 90000; - public _pFallOff:number = 100000; - public _pFallOffFactor:number; - - constructor() - { - super(); - - this._pIsEntity = true; - - this._pFallOffFactor = 1/(this._pFallOff*this._pFallOff - this._pRadius*this._pRadius); - } - - public pCreateShadowMapper():CubeMapShadowMapper - { - return new CubeMapShadowMapper(); - } - - public get radius():number - { - return this._pRadius; - } - - public set radius(value:number) - { - this._pRadius = value; - - if (this._pRadius < 0) { - this._pRadius = 0; - } else if (this._pRadius > this._pFallOff) { - this._pFallOff = this._pRadius; - this.pInvalidateBounds(); - } - this._pFallOffFactor = 1/( this._pFallOff*this._pFallOff - this._pRadius*this._pRadius ); - } - - public iFallOffFactor():number - { - return this._pFallOffFactor; - } - - public get fallOff():number - { - return this._pFallOff; - } - - public set fallOff(value:number) - { - this._pFallOff = value; - - if (this._pFallOff < 0) - this._pFallOff = 0; - - if (this._pFallOff < this._pRadius) - this._pRadius = this._pFallOff; - - this._pFallOffFactor = 1/( this._pFallOff*this._pFallOff - this._pRadius*this._pRadius); - this.pInvalidateBounds(); - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():EntityNode - { - return new PointLightNode(this); - } - - public pUpdateBounds() - { - this._pBounds.fromSphere(new Vector3D(), this._pFallOff); - this._pBoundsInvalid = false; - } - - public pCreateDefaultBoundingVolume():BoundingVolumeBase - { - //point lights are culled based on their falloff radius - return new BoundingSphere(); - } - - public iGetObjectProjectionMatrix(entity:IEntity, camera:Camera, target:Matrix3D = null):Matrix3D - { - var raw:number[] = new Array(16); - var bounds:BoundingVolumeBase = entity.bounds; - var m:Matrix3D = new Matrix3D(); - - // todo: do not use lookAt on Light - m.copyFrom(entity.getRenderSceneTransform(camera)); - m.append(this._pParent.inverseSceneTransform); - this.lookAt(m.position); - - m.copyFrom(entity.getRenderSceneTransform(camera)); - m.append(this.inverseSceneTransform); - - var box:Box = bounds.aabb; - var v1:Vector3D = m.deltaTransformVector(new Vector3D(box.left, box.bottom, box.front)); - var v2:Vector3D = m.deltaTransformVector(new Vector3D(box.right, box.top, box.back)); - var d1:number = v1.x*v1.x + v1.y*v1.y + v1.z*v1.z; - var d2:number = v2.x*v2.x + v2.y*v2.y + v2.z*v2.z; - var d:number = Math.sqrt(d1 > d2? d1 : d2); - var zMin:number; - var zMax:number; - - var z:number = m.rawData[14]; - zMin = z - d; - zMax = z + d; - - raw[5] = raw[0] = zMin/d; - raw[10] = zMax/(zMax - zMin); - raw[11] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[12] = raw[13] = raw[15] = 0; - raw[14] = -zMin*raw[10]; - - if (!target) - target = new Matrix3D(); - - target.copyRawDataFrom(raw); - target.prepend(m); - - return target; - } - - public _iCollectRenderables(renderer:IRenderer) - { - //nothing to do here - } - } -} \ No newline at end of file diff --git a/src/away/entities/Skybox.ts b/src/away/entities/Skybox.ts deleted file mode 100755 index 04d8d246..00000000 --- a/src/away/entities/Skybox.ts +++ /dev/null @@ -1,132 +0,0 @@ -/// - -module away.entities -{ - import IMaterialOwner = away.base.IMaterialOwner; - import BoundingVolumeBase = away.bounds.BoundingVolumeBase; - import NullBounds = away.bounds.NullBounds; - import IAnimator = away.animators.IAnimator; - import UVTransform = away.geom.UVTransform; - import MaterialBase = away.materials.MaterialBase; - import SkyboxNode = away.partition.SkyboxNode; - import IRenderer = away.render.IRenderer; - - /** - * A Skybox class is used to render a sky in the scene. It's always considered static and 'at infinity', and as - * such it's always centered at the camera's position and sized to exactly fit within the camera's frustum, ensuring - * the sky box is always as large as possible without being clipped. - */ - export class Skybox extends away.base.DisplayObject implements IEntity, away.base.IMaterialOwner - { - private _uvTransform:UVTransform; - - private _material:MaterialBase; - private _animator:IAnimator; - - public get animator():IAnimator - { - return this._animator; - } - - /** - * - */ - public get uvTransform():UVTransform - { - return this._uvTransform; - } - - public set uvTransform(value:UVTransform) - { - this._uvTransform = value; - } - - /** - * Create a new Skybox object. - * - * @param material The material with which to render the Skybox. - */ - constructor(material:MaterialBase) - { - super(); - - this._pIsEntity = true; - - this.material = material; - } - - /** - * The material with which to render the Skybox. - */ - public get material():MaterialBase - { - return this._material; - } - - public set material(value:MaterialBase) - { - if (value == this._material) - return; - - if (this._material) - this._material.iRemoveOwner( this); - - this._material = value; - - if (this._material) - this._material.iAddOwner( this); - } - - public get assetType():string - { - return away.library.AssetType.SKYBOX; - } - - /** - * @protected - */ - public pInvalidateBounds() - { - // dead end - } - - /** - * @protected - */ - public pCreateEntityPartitionNode():SkyboxNode - { - return new SkyboxNode(this); - } - - /** - * @protected - */ - public pCreateDefaultBoundingVolume():BoundingVolumeBase - { - return new NullBounds(); - } - - /** - * @protected - */ - public pUpdateBounds() - { - this._pBoundsInvalid = false; - } - - public get castsShadows():boolean - { - return false; //TODO - } - - public _iCollectRenderables(renderer:IRenderer) - { - //skybox do not get collected in the standard entity list - } - - public _iCollectRenderable(renderer:IRenderer) - { - - } - } -} diff --git a/src/away/entities/TextField.ts b/src/away/entities/TextField.ts deleted file mode 100644 index d5cc126b..00000000 --- a/src/away/entities/TextField.ts +++ /dev/null @@ -1,1039 +0,0 @@ -/// - -/** - * The TextField class is used to create display objects for text display and - * input. You can use the TextField class to - * perform low-level text rendering. However, in Flex, you typically use the - * Label, Text, TextArea, and TextInput controls to process text. You can give a text field an instance name in the - * Property inspector and use the methods and properties of the TextField - * class to manipulate it with ActionScript. TextField instance names are - * displayed in the Movie Explorer and in the Insert Target Path dialog box in - * the Actions panel. - * - *

To create a text field dynamically, use the TextField() - * constructor.

- * - *

The methods of the TextField class let you set, select, and manipulate - * text in a dynamic or input text field that you create during authoring or - * at runtime.

- * - *

ActionScript provides several ways to format your text at runtime. The - * TextFormat class lets you set character and paragraph formatting for - * TextField objects. You can apply Cascading Style Sheets(CSS) styles to - * text fields by using the TextField.styleSheet property and the - * StyleSheet class. You can use CSS to style built-in HTML tags, define new - * formatting tags, or apply styles. You can assign HTML formatted text, which - * optionally uses CSS styles, directly to a text field. HTML text that you - * assign to a text field can contain embedded media(movie clips, SWF files, - * GIF files, PNG files, and JPEG files). The text wraps around the embedded - * media in the same way that a web browser wraps text around media embedded - * in an HTML document.

- * - *

Flash Player supports a subset of HTML tags that you can use to format - * text. See the list of supported HTML tags in the description of the - * htmlText property.

- * - * @event change Dispatched after a control value is - * modified, unlike the - * textInput event, which is - * dispatched before the value is modified. - * Unlike the W3C DOM Event Model version of - * the change event, which - * dispatches the event only after the - * control loses focus, the ActionScript 3.0 - * version of the change event - * is dispatched any time the control - * changes. For example, if a user types text - * into a text field, a change - * event is dispatched after every keystroke. - * @event link Dispatched when a user clicks a hyperlink - * in an HTML-enabled text field, where the - * URL begins with "event:". The remainder of - * the URL after "event:" is placed in the - * text property of the LINK event. - * - *

Note: The default behavior, - * adding the text to the text field, occurs - * only when Flash Player generates the - * event, which in this case happens when a - * user attempts to input text. You cannot - * put text into a text field by sending it - * textInput events.

- * @event scroll Dispatched by a TextField object - * after the user scrolls. - * @event textInput Flash Player dispatches the - * textInput event when a user - * enters one or more characters of text. - * Various text input methods can generate - * this event, including standard keyboards, - * input method editors(IMEs), voice or - * speech recognition systems, and even the - * act of pasting plain text with no - * formatting or style information. - * @event textInteractionModeChange Flash Player dispatches the - * textInteractionModeChange - * event when a user changes the interaction - * mode of a text field. for example on - * Android, one can toggle from NORMAL mode - * to SELECTION mode using context menu - * options - */ -module away.entities -{ - export class TextField extends away.base.DisplayObject - { - private _bottomScrollV:number; - private _caretIndex:number; - private _length:number; - private _maxScrollH:number; - private _maxScrollV:number; - private _numLines:number; - private _selectionBeginIndex:number; - private _selectionEndIndex:number; - private _text:string = ""; - private _textHeight:number; - private _textInteractionMode:away.text.TextInteractionMode; - private _textWidth:number; - - private _charBoundaries:away.geom.Rectangle; - private _charIndexAtPoint:number; - private _firstCharInParagraph:number; - private _imageReference:away.base.DisplayObject - private _lineIndexAtPoint:number; - private _lineIndexOfChar:number; - private _lineLength:number; - private _lineMetrics:away.text.TextLineMetrics; - private _lineOffset:number; - private _lineText:string; - private _paragraphLength:number; - private _textFormat:away.text.TextFormat; - - /** - * When set to true and the text field is not in focus, Flash - * Player highlights the selection in the text field in gray. When set to - * false and the text field is not in focus, Flash Player does - * not highlight the selection in the text field. - * - * @default false - */ - public alwaysShowSelection:boolean - - /** - * The type of anti-aliasing used for this text field. Use - * flash.text.AntiAliasType constants for this property. You can - * control this setting only if the font is embedded(with the - * embedFonts property set to true). The default - * setting is flash.text.AntiAliasType.NORMAL. - * - *

To set values for this property, use the following string values:

- */ - public antiAliasType:away.text.AntiAliasType; - - /** - * Controls automatic sizing and alignment of text fields. Acceptable values - * for the TextFieldAutoSize constants: - * TextFieldAutoSize.NONE(the default), - * TextFieldAutoSize.LEFT, TextFieldAutoSize.RIGHT, - * and TextFieldAutoSize.CENTER. - * - *

If autoSize is set to TextFieldAutoSize.NONE - * (the default) no resizing occurs.

- * - *

If autoSize is set to TextFieldAutoSize.LEFT, - * the text is treated as left-justified text, meaning that the left margin - * of the text field remains fixed and any resizing of a single line of the - * text field is on the right margin. If the text includes a line break(for - * example, "\n" or "\r"), the bottom is also - * resized to fit the next line of text. If wordWrap is also set - * to true, only the bottom of the text field is resized and the - * right side remains fixed.

- * - *

If autoSize is set to - * TextFieldAutoSize.RIGHT, the text is treated as - * right-justified text, meaning that the right margin of the text field - * remains fixed and any resizing of a single line of the text field is on - * the left margin. If the text includes a line break(for example, - * "\n" or "\r"), the bottom is also resized to fit the next - * line of text. If wordWrap is also set to true, - * only the bottom of the text field is resized and the left side remains - * fixed.

- * - *

If autoSize is set to - * TextFieldAutoSize.CENTER, the text is treated as - * center-justified text, meaning that any resizing of a single line of the - * text field is equally distributed to both the right and left margins. If - * the text includes a line break(for example, "\n" or - * "\r"), the bottom is also resized to fit the next line of - * text. If wordWrap is also set to true, only the - * bottom of the text field is resized and the left and right sides remain - * fixed.

- * - * @throws ArgumentError The autoSize specified is not a member - * of flash.text.TextFieldAutoSize. - */ - public autoSize:away.text.TextFieldAutoSize; - - /** - * Specifies whether the text field has a background fill. If - * true, the text field has a background fill. If - * false, the text field has no background fill. Use the - * backgroundColor property to set the background color of a - * text field. - * - * @default false - */ - public background:boolean; - - /** - * The color of the text field background. The default value is - * 0xFFFFFF(white). This property can be retrieved or set, even - * if there currently is no background, but the color is visible only if the - * text field has the background property set to - * true. - */ - public backgroundColor:number /*int*/; - - /** - * Specifies whether the text field has a border. If true, the - * text field has a border. If false, the text field has no - * border. Use the borderColor property to set the border color. - * - * @default false - */ - public border:boolean; - - /** - * The color of the text field border. The default value is - * 0x000000(black). This property can be retrieved or set, even - * if there currently is no border, but the color is visible only if the text - * field has the border property set to true. - */ - public borderColor:number /*int*/; - - /** - * An integer(1-based index) that indicates the bottommost line that is - * currently visible in the specified text field. Think of the text field as - * a window onto a block of text. The scrollV property is the - * 1-based index of the topmost visible line in the window. - * - *

All the text between the lines indicated by scrollV and - * bottomScrollV is currently visible in the text field.

- */ - public get bottomScrollV():number /*int*/ - { - return this._bottomScrollV; - } - - /** - * The index of the insertion point(caret) position. If no insertion point - * is displayed, the value is the position the insertion point would be if - * you restored focus to the field(typically where the insertion point last - * was, or 0 if the field has not had focus). - * - *

Selection span indexes are zero-based(for example, the first position - * is 0, the second position is 1, and so on).

- */ - public get caretIndex():number /*int*/ - { - return this._caretIndex; - } - - /** - * A Boolean value that specifies whether extra white space(spaces, line - * breaks, and so on) in a text field with HTML text is removed. The default - * value is false. The condenseWhite property only - * affects text set with the htmlText property, not the - * text property. If you set text with the text - * property, condenseWhite is ignored. - * - *

If condenseWhite is set to true, use standard - * HTML commands such as
and

to place line - * breaks in the text field.

- * - *

Set the condenseWhite property before setting the - * htmlText property.

- */ - public condenseWhite:boolean; - - /** - * Specifies the format applied to newly inserted text, such as text entered - * by a user or text inserted with the replaceSelectedText() - * method. - * - *

Note: When selecting characters to be replaced with - * setSelection() and replaceSelectedText(), the - * defaultTextFormat will be applied only if the text has been - * selected up to and including the last character. Here is an example:

- *
 public my_txt:TextField new TextField();
-		 * my_txt.text = "Flash Macintosh version"; public my_fmt:TextFormat = new
-		 * TextFormat(); my_fmt.color = 0xFF0000; my_txt.defaultTextFormat = my_fmt;
-		 * my_txt.setSelection(6,15); // partial text selected - defaultTextFormat
-		 * not applied my_txt.setSelection(6,23); // text selected to end -
-		 * defaultTextFormat applied my_txt.replaceSelectedText("Windows version");
-		 * 
- * - *

When you access the defaultTextFormat property, the - * returned TextFormat object has all of its properties defined. No property - * is null.

- * - *

Note: You can't set this property if a style sheet is applied to - * the text field.

- * - * @throws Error This method cannot be used on a text field with a style - * sheet. - */ - public defaultTextFormat:away.text.TextFormat; - - /** - * Specifies whether the text field is a password text field. If the value of - * this property is true, the text field is treated as a - * password text field and hides the input characters using asterisks instead - * of the actual characters. If false, the text field is not - * treated as a password text field. When password mode is enabled, the Cut - * and Copy commands and their corresponding keyboard shortcuts will not - * function. This security mechanism prevents an unscrupulous user from using - * the shortcuts to discover a password on an unattended computer. - * - * @default false - */ - public displayAsPassword:boolean; - - /** - * Specifies whether to render by using embedded font outlines. If - * false, Flash Player renders the text field by using device - * fonts. - * - *

If you set the embedFonts property to true - * for a text field, you must specify a font for that text by using the - * font property of a TextFormat object applied to the text - * field. If the specified font is not embedded in the SWF file, the text is - * not displayed.

- * - * @default false - */ - public embedFonts:boolean; - - /** - * The type of grid fitting used for this text field. This property applies - * only if the flash.text.AntiAliasType property of the text - * field is set to flash.text.AntiAliasType.ADVANCED. - * - *

The type of grid fitting used determines whether Flash Player forces - * strong horizontal and vertical lines to fit to a pixel or subpixel grid, - * or not at all.

- * - *

For the flash.text.GridFitType property, you can use the - * following string values:

- * - * @default pixel - */ - public gridFitType:away.text.GridFitType; - - /** - * Contains the HTML representation of the text field contents. - * - *

Flash Player supports the following HTML tags:

- * - *

Flash Player and AIR also support explicit character codes, such as - * &(ASCII ampersand) and €(Unicode € symbol).

- */ - public htmlText:string; - - /** - * The number of characters in a text field. A character such as tab - * (\t) counts as one character. - */ - public get length():number /*int*/ - { - return this._length; - } - - /** - * The maximum number of characters that the text field can contain, as - * entered by a user. A script can insert more text than - * maxChars allows; the maxChars property indicates - * only how much text a user can enter. If the value of this property is - * 0, a user can enter an unlimited amount of text. - * - * @default 0 - */ - public maxChars:number /*int*/; - - /** - * The maximum value of scrollH. - */ - public maxScrollH():number /*int*/ - { - return this._maxScrollH; - } - - /** - * The maximum value of scrollV. - */ - public maxScrollV():number /*int*/ - { - return this._maxScrollV; - } - - /** - * A Boolean value that indicates whether Flash Player automatically scrolls - * multiline text fields when the user clicks a text field and rolls the - * mouse wheel. By default, this value is true. This property is - * useful if you want to prevent mouse wheel scrolling of text fields, or - * implement your own text field scrolling. - */ - public mouseWheelEnabled:boolean; - - /** - * Indicates whether field is a multiline text field. If the value is - * true, the text field is multiline; if the value is - * false, the text field is a single-line text field. In a field - * of type TextFieldType.INPUT, the multiline value - * determines whether the Enter key creates a new line(a value - * of false, and the Enter key is ignored). If you - * paste text into a TextField with a multiline - * value of false, newlines are stripped out of the text. - * - * @default false - */ - public multiline:boolean; - - /** - * Defines the number of text lines in a multiline text field. If - * wordWrap property is set to true, the number of - * lines increases when text wraps. - */ - public get numLines():number /*int*/ - { - return this._numLines; - } - - /** - * Indicates the set of characters that a user can enter into the text field. - * If the value of the restrict property is null, - * you can enter any character. If the value of the restrict - * property is an empty string, you cannot enter any character. If the value - * of the restrict property is a string of characters, you can - * enter only characters in the string into the text field. The string is - * scanned from left to right. You can specify a range by using the hyphen - * (-) character. Only user interaction is restricted; a script can put any - * text into the text field. This property does - * not synchronize with the Embed font options in the Property inspector. - * - *

If the string begins with a caret(^) character, all characters are - * initially accepted and succeeding characters in the string are excluded - * from the set of accepted characters. If the string does not begin with a - * caret(^) character, no characters are initially accepted and succeeding - * characters in the string are included in the set of accepted - * characters.

- * - *

The following example allows only uppercase characters, spaces, and - * numbers to be entered into a text field:

- *
 my_txt.restrict = "A-Z 0-9"; 
- * - *

The following example includes all characters, but excludes lowercase - * letters:

- *
 my_txt.restrict = "^a-z"; 
- * - *

You can use a backslash to enter a ^ or - verbatim. The accepted - * backslash sequences are \-, \^ or \\. The backslash must be an actual - * character in the string, so when specified in ActionScript, a double - * backslash must be used. For example, the following code includes only the - * dash(-) and caret(^):

- *
 my_txt.restrict = "\\-\\^"; 
- * - *

The ^ can be used anywhere in the string to toggle between including - * characters and excluding characters. The following code includes only - * uppercase letters, but excludes the uppercase letter Q:

- *
 my_txt.restrict = "A-Z^Q"; 
- * - *

You can use the \u escape sequence to construct - * restrict strings. The following code includes only the - * characters from ASCII 32(space) to ASCII 126(tilde).

- *
 my_txt.restrict = "\u0020-\u007E"; 
- * - * @default null - */ - public restrict:string; - - /** - * The current horizontal scrolling position. If the scrollH - * property is 0, the text is not horizontally scrolled. This property value - * is an integer that represents the horizontal position in pixels. - * - *

The units of horizontal scrolling are pixels, whereas the units of - * vertical scrolling are lines. Horizontal scrolling is measured in pixels - * because most fonts you typically use are proportionally spaced; that is, - * the characters can have different widths. Flash Player performs vertical - * scrolling by line because users usually want to see a complete line of - * text rather than a partial line. Even if a line uses multiple fonts, the - * height of the line adjusts to fit the largest font in use.

- * - *

Note: The scrollH property is zero-based, not - * 1-based like the scrollV vertical scrolling property.

- */ - public scrollH:number; - - /** - * The vertical position of text in a text field. The scrollV - * property is useful for directing users to a specific paragraph in a long - * passage, or creating scrolling text fields. - * - *

The units of vertical scrolling are lines, whereas the units of - * horizontal scrolling are pixels. If the first line displayed is the first - * line in the text field, scrollV is set to 1(not 0). Horizontal scrolling - * is measured in pixels because most fonts are proportionally spaced; that - * is, the characters can have different widths. Flash performs vertical - * scrolling by line because users usually want to see a complete line of - * text rather than a partial line. Even if there are multiple fonts on a - * line, the height of the line adjusts to fit the largest font in use.

- */ - public scrollV:number; - - /** - * A Boolean value that indicates whether the text field is selectable. The - * value true indicates that the text is selectable. The - * selectable property controls whether a text field is - * selectable, not whether a text field is editable. A dynamic text field can - * be selectable even if it is not editable. If a dynamic text field is not - * selectable, the user cannot select its text. - * - *

If selectable is set to false, the text in - * the text field does not respond to selection commands from the mouse or - * keyboard, and the text cannot be copied with the Copy command. If - * selectable is set to true, the text in the text - * field can be selected with the mouse or keyboard, and the text can be - * copied with the Copy command. You can select text this way even if the - * text field is a dynamic text field instead of an input text field.

- * - * @default true - */ - public selectable:boolean; - - /** - * The zero-based character index value of the first character in the current - * selection. For example, the first character is 0, the second character is - * 1, and so on. If no text is selected, this property is the value of - * caretIndex. - */ - public get selectionBeginIndex():number /*int*/ - { - return this._selectionBeginIndex; - } - - /** - * The zero-based character index value of the last character in the current - * selection. For example, the first character is 0, the second character is - * 1, and so on. If no text is selected, this property is the value of - * caretIndex. - */ - public get selectionEndIndex():number /*int*/ - { - return this._selectionEndIndex; - } - - /** - * The sharpness of the glyph edges in this text field. This property applies - * only if the flash.text.AntiAliasType property of the text - * field is set to flash.text.AntiAliasType.ADVANCED. The range - * for sharpness is a number from -400 to 400. If you attempt to - * set sharpness to a value outside that range, Flash sets the - * property to the nearest value in the range(either -400 or 400). - * - * @default 0 - */ - public sharpness:number; - - /** - * Attaches a style sheet to the text field. For information on creating - * style sheets, see the StyleSheet class and the ActionScript 3.0 - * Developer's Guide. - * - *

You can change the style sheet associated with a text field at any - * time. If you change the style sheet in use, the text field is redrawn with - * the new style sheet. You can set the style sheet to null or - * undefined to remove the style sheet. If the style sheet in - * use is removed, the text field is redrawn without a style sheet.

- * - *

Note: If the style sheet is removed, the contents of both - * TextField.text and TextField.htmlText change to - * incorporate the formatting previously applied by the style sheet. To - * preserve the original TextField.htmlText contents without the - * formatting, save the value in a variable before removing the style - * sheet.

- */ - public styleSheet:StyleSheet; - - /** - * A string that is the current text in the text field. Lines are separated - * by the carriage return character('\r', ASCII 13). This - * property contains unformatted text in the text field, without HTML tags. - * - *

To get the text in HTML form, use the htmlText - * property.

- */ - public get text():string - { - return this._text; - } - - public set text(value:string) - { - if (this._text == value) - return; - - this._text = value; - } - - /** - * The color of the text in a text field, in hexadecimal format. The - * hexadecimal color system uses six digits to represent color values. Each - * digit has 16 possible values or characters. The characters range from 0-9 - * and then A-F. For example, black is 0x000000; white is - * 0xFFFFFF. - * - * @default 0(0x000000) - */ - public textColor:number /*int*/; - - /** - * The height of the text in pixels. - */ - public get textHeight():number - { - return this._textHeight; - } - - /** - * The interaction mode property, Default value is - * TextInteractionMode.NORMAL. On mobile platforms, the normal mode implies - * that the text can be scrolled but not selected. One can switch to the - * selectable mode through the in-built context menu on the text field. On - * Desktop, the normal mode implies that the text is in scrollable as well as - * selection mode. - */ - public get textInteractionMode():away.text.TextInteractionMode - { - return this._textInteractionMode; - } - - /** - * The width of the text in pixels. - */ - public get textWidth():number - { - return this._textWidth; - } - - /** - * The thickness of the glyph edges in this text field. This property applies - * only when away.text.AntiAliasType is set to - * away.text.AntiAliasType.ADVANCED. - * - *

The range for thickness is a number from -200 to 200. If - * you attempt to set thickness to a value outside that range, - * the property is set to the nearest value in the range(either -200 or - * 200).

- * - * @default 0 - */ - public thickness:number; - - /** - * The type of the text field. Either one of the following TextFieldType - * constants: TextFieldType.DYNAMIC, which specifies a dynamic - * text field, which a user cannot edit, or TextFieldType.INPUT, - * which specifies an input text field, which a user can edit. - * - * @default dynamic - * @throws ArgumentError The type specified is not a member of - * flash.text.TextFieldType. - */ - public type:away.text.TextFieldType; - - /** - * Specifies whether to copy and paste the text formatting along with the - * text. When set to true, Flash Player copies and pastes - * formatting(such as alignment, bold, and italics) when you copy and paste - * between text fields. Both the origin and destination text fields for the - * copy and paste procedure must have useRichTextClipboard set - * to true. The default value is false. - */ - public useRichTextClipboard:boolean; - - /** - * A Boolean value that indicates whether the text field has word wrap. If - * the value of wordWrap is true, the text field - * has word wrap; if the value is false, the text field does not - * have word wrap. The default value is false. - */ - public wordWrap:boolean; - - /** - * Creates a new TextField instance. After you create the TextField instance, - * call the addChild() or addChildAt() method of - * the parent DisplayObjectContainer object to add the TextField instance to - * the display list. - * - *

The default size for a text field is 100 x 100 pixels.

- */ - constructor() - { - super(); - } - - /** - * Appends the string specified by the newText parameter to the - * end of the text of the text field. This method is more efficient than an - * addition assignment(+=) on a text property - * (such as someTextField.text += moreText), particularly for a - * text field that contains a significant amount of content. - * - * @param newText The string to append to the existing text. - */ - public appendText(newText:string) - { - //TODO - } - - /** - * Returns a rectangle that is the bounding box of the character. - * - * @param charIndex The zero-based index value for the character(for - * example, the first position is 0, the second position is - * 1, and so on). - * @return A rectangle with x and y minimum and - * maximum values defining the bounding box of the character. - */ - public getCharBoundaries(charIndex:number):away.geom.Rectangle - { - return this._charBoundaries; - } - - /** - * Returns the zero-based index value of the character at the point specified - * by the x and y parameters. - * - * @param x The x coordinate of the character. - * @param y The y coordinate of the character. - * @return The zero-based index value of the character(for example, the - * first position is 0, the second position is 1, and so on). Returns - * -1 if the point is not over any character. - */ - public getCharIndexAtPoint(x:number, y:number):number /*int*/ - { - return this._charIndexAtPoint; - } - - /** - * Given a character index, returns the index of the first character in the - * same paragraph. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return The zero-based index value of the first character in the same - * paragraph. - * @throws RangeError The character index specified is out of range. - */ - public getFirstCharInParagraph(charIndex:number /*int*/):number /*int*/ - { - return this._firstCharInParagraph; - } - - /** - * Returns a DisplayObject reference for the given id, for an - * image or SWF file that has been added to an HTML-formatted text field by - * using an tag. The tag is in the - * following format: - * - *

 

- * - * @param id The id to match(in the id attribute - * of the tag). - * @return The display object corresponding to the image or SWF file with the - * matching id attribute in the tag - * of the text field. For media loaded from an external source, this - * object is a Loader object, and, once loaded, the media object is a - * child of that Loader object. For media embedded in the SWF file, - * it is the loaded object. If no tag with the - * matching id exists, the method returns - * null. - */ - public getImageReference(id:string):away.base.DisplayObject - { - return this._imageReference; - } - - /** - * Returns the zero-based index value of the line at the point specified by - * the x and y parameters. - * - * @param x The x coordinate of the line. - * @param y The y coordinate of the line. - * @return The zero-based index value of the line(for example, the first - * line is 0, the second line is 1, and so on). Returns -1 if the - * point is not over any line. - */ - public getLineIndexAtPoint(x:number, y:number):number /*int*/ - { - return this._lineIndexAtPoint; - } - - /** - * Returns the zero-based index value of the line containing the character - * specified by the charIndex parameter. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return The zero-based index value of the line. - * @throws RangeError The character index specified is out of range. - */ - public getLineIndexOfChar(charIndex:number /*int*/):number /*int*/ - { - return this._lineIndexOfChar; - } - - /** - * Returns the number of characters in a specific text line. - * - * @param lineIndex The line number for which you want the length. - * @return The number of characters in the line. - * @throws RangeError The line number specified is out of range. - */ - public getLineLength(lineIndex:number /*int*/):number /*int*/ - { - return this._lineLength; - } - - /** - * Returns metrics information about a given text line. - * - * @param lineIndex The line number for which you want metrics information. - * @return A TextLineMetrics object. - * @throws RangeError The line number specified is out of range. - */ - public getLineMetrics(lineIndex:number /*int*/):away.text.TextLineMetrics - { - return this._lineMetrics; - } - - /** - * Returns the character index of the first character in the line that the - * lineIndex parameter specifies. - * - * @param lineIndex The zero-based index value of the line(for example, the - * first line is 0, the second line is 1, and so on). - * @return The zero-based index value of the first character in the line. - * @throws RangeError The line number specified is out of range. - */ - public getLineOffset(lineIndex:number /*int*/):number /*int*/ - { - return this._lineOffset; - } - - /** - * Returns the text of the line specified by the lineIndex - * parameter. - * - * @param lineIndex The zero-based index value of the line(for example, the - * first line is 0, the second line is 1, and so on). - * @return The text string contained in the specified line. - * @throws RangeError The line number specified is out of range. - */ - public getLineText(lineIndex:number /*int*/):string - { - return this._lineText; - } - - /** - * Given a character index, returns the length of the paragraph containing - * the given character. The length is relative to the first character in the - * paragraph(as returned by getFirstCharInParagraph()), not to - * the character index passed in. - * - * @param charIndex The zero-based index value of the character(for example, - * the first character is 0, the second character is 1, and - * so on). - * @return Returns the number of characters in the paragraph. - * @throws RangeError The character index specified is out of range. - */ - public getParagraphLength(charIndex:number /*int*/):number /*int*/ - { - return this._paragraphLength; - } - - /** - * Returns a TextFormat object that contains formatting information for the - * range of text that the beginIndex and endIndex - * parameters specify. Only properties that are common to the entire text - * specified are set in the resulting TextFormat object. Any property that is - * mixed, meaning that it has different values at different points in - * the text, has a value of null. - * - *

If you do not specify values for these parameters, this method is - * applied to all the text in the text field.

- * - *

The following table describes three possible usages:

- * - * @return The TextFormat object that represents the formatting properties - * for the specified text. - * @throws RangeError The beginIndex or endIndex - * specified is out of range. - */ - public getTextFormat(beginIndex:number /*int*/ = -1, endIndex:number /*int*/ = -1):away.text.TextFormat - { - return this._textFormat; - } - - /** - * Replaces the current selection with the contents of the value - * parameter. The text is inserted at the position of the current selection, - * using the current default character format and default paragraph format. - * The text is not treated as HTML. - * - *

You can use the replaceSelectedText() method to insert and - * delete text without disrupting the character and paragraph formatting of - * the rest of the text.

- * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - * @param value The string to replace the currently selected text. - * @throws Error This method cannot be used on a text field with a style - * sheet. - */ - public replaceSelectedText(value:string) - { - - } - - /** - * Replaces the range of characters that the beginIndex and - * endIndex parameters specify with the contents of the - * newText parameter. As designed, the text from - * beginIndex to endIndex-1 is replaced. - * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - * @param beginIndex The zero-based index value for the start position of the - * replacement range. - * @param endIndex The zero-based index position of the first character - * after the desired text span. - * @param newText The text to use to replace the specified range of - * characters. - * @throws Error This method cannot be used on a text field with a style - * sheet. - */ - public replaceText(beginIndex:number /*int*/, endIndex:number /*int*/, newText:string) - { - - } - - /** - * Sets as selected the text designated by the index values of the first and - * last characters, which are specified with the beginIndex and - * endIndex parameters. If the two parameter values are the - * same, this method sets the insertion point, as if you set the - * caretIndex property. - * - * @param beginIndex The zero-based index value of the first character in the - * selection(for example, the first character is 0, the - * second character is 1, and so on). - * @param endIndex The zero-based index value of the last character in the - * selection. - */ - public setSelection(beginIndex:number /*int*/, endIndex:number /*int*/) - { - - } - - /** - * Applies the text formatting that the format parameter - * specifies to the specified text in a text field. The value of - * format must be a TextFormat object that specifies the desired - * text formatting changes. Only the non-null properties of - * format are applied to the text field. Any property of - * format that is set to null is not applied. By - * default, all of the properties of a newly created TextFormat object are - * set to null. - * - *

Note: This method does not work if a style sheet is applied to - * the text field.

- * - *

The setTextFormat() method changes the text formatting - * applied to a range of characters or to the entire body of text in a text - * field. To apply the properties of format to all text in the text field, do - * not specify values for beginIndex and endIndex. - * To apply the properties of the format to a range of text, specify values - * for the beginIndex and the endIndex parameters. - * You can use the length property to determine the index - * values.

- * - *

The two types of formatting information in a TextFormat object are - * character level formatting and paragraph level formatting. Each character - * in a text field can have its own character formatting settings, such as - * font name, font size, bold, and italic.

- * - *

For paragraphs, the first character of the paragraph is examined for - * the paragraph formatting settings for the entire paragraph. Examples of - * paragraph formatting settings are left margin, right margin, and - * indentation.

- * - *

Any text inserted manually by the user, or replaced by the - * replaceSelectedText() method, receives the default text field - * formatting for new text, and not the formatting specified for the text - * insertion point. To set the default formatting for new text, use - * defaultTextFormat.

- * - * @param format A TextFormat object that contains character and paragraph - * formatting information. - * @throws Error This method cannot be used on a text field with a style - * sheet. - * @throws RangeError The beginIndex or endIndex - * specified is out of range. - */ - public setTextFormat(format:away.text.TextFormat, beginIndex:number /*int*/ = -1, endIndex:number /*int*/ = -1) - { - - } - - /** - * Returns true if an embedded font is available with the specified - * fontName and fontStyle where - * Font.fontType is flash.text.FontType.EMBEDDED. - * Starting with Flash Player 10, two kinds of embedded fonts can appear in a - * SWF file. Normal embedded fonts are only used with TextField objects. CFF - * embedded fonts are only used with the flash.text.engine classes. The two - * types are distinguished by the fontType property of the - * Font class, as returned by the enumerateFonts() - * function. - * - *

TextField cannot use a font of type EMBEDDED_CFF. If - * embedFonts is set to true and the only font - * available at run time with the specified name and style is of type - * EMBEDDED_CFF, Flash Player fails to render the text, as if no - * embedded font were available with the specified name and style.

- * - *

If both EMBEDDED and EMBEDDED_CFF fonts are - * available with the same name and style, the EMBEDDED font is - * selected and text renders with the EMBEDDED font.

- * - * @param fontName The name of the embedded font to check. - * @param fontStyle Specifies the font style to check. Use - * flash.text.FontStyle - * @return true if a compatible embedded font is available, - * otherwise false. - * @throws ArgumentError The fontStyle specified is not a member - * of flash.text.FontStyle. - */ - public static isFontCompatible(fontName:string, fontStyle:string):boolean - { - return false; - } - } -} \ No newline at end of file diff --git a/src/away/errors/AbstractMethodError.ts b/src/away/errors/AbstractMethodError.ts deleted file mode 100644 index 7150ca53..00000000 --- a/src/away/errors/AbstractMethodError.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// - -module away.errors -{ - - - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - export class AbstractMethodError extends away.errors.Error - { - /** - * Create a new AbstractMethodError. - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - constructor(message:string = null, id:number = 0) - { - super(message || "An abstract method was called! Either an instance of an abstract class was created, or an abstract method was not overridden by the subclass.", id); - } - } -} diff --git a/src/away/errors/ArgumentError.ts b/src/away/errors/ArgumentError.ts deleted file mode 100644 index 37d0bea4..00000000 --- a/src/away/errors/ArgumentError.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -module away.errors -{ - - - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - export class ArgumentError extends away.errors.Error - { - /** - * Create a new ArgumentError. - * - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - constructor(message:string = null, id:number = 0) - { - super(message || "ArgumentError", id); - } - } -} diff --git a/src/away/errors/CastError.ts b/src/away/errors/CastError.ts deleted file mode 100644 index d935b2af..00000000 --- a/src/away/errors/CastError.ts +++ /dev/null @@ -1,13 +0,0 @@ -/// - -module away.errors -{ - - export class CastError extends Error - { - constructor(message:string) - { - super(message); - } - } -} diff --git a/src/away/errors/DocumentError.ts b/src/away/errors/DocumentError.ts deleted file mode 100644 index 538ceeb5..00000000 --- a/src/away/errors/DocumentError.ts +++ /dev/null @@ -1,15 +0,0 @@ -/// - -module away.errors -{ - - export class DocumentError extends Error - { - public static DOCUMENT_DOES_NOT_EXIST:string = "documentDoesNotExist"; - - constructor(message:string = "DocumentError", id:number = 0) - { - super(message, id); - } - } -} \ No newline at end of file diff --git a/src/away/errors/Error.ts b/src/away/errors/Error.ts deleted file mode 100644 index 90004382..00000000 --- a/src/away/errors/Error.ts +++ /dev/null @@ -1,79 +0,0 @@ -/// - -module away.errors -{ - - export class Error - { - - private _errorID:number = 0; //Contains the reference number associated with the specific error message. - private _messsage:string = ''; //Contains the message associated with the Error object. - private _name:string = ''; // Contains the name of the Error object. - - constructor(message:string = '', id:number = 0, _name:string = '') - { - - this._messsage = message; - this._name = name; - this._errorID = id; - - } - - /** - * - * @returns {string} - */ - public get message():string - { - - return this._messsage; - - } - - /** - * - * @param value - */ - public set message(value:string) - { - - this._messsage = value; - - } - - /** - * - * @returns {string} - */ - public get name():string - { - - return this._name; - - } - - /** - * - * @param value - */ - public set name(value:string) - { - - this._name = value; - - } - - /** - * - * @returns {number} - */ - public get errorID():number - { - - return this._errorID; - - } - - } - -} \ No newline at end of file diff --git a/src/away/errors/PartialImplementationError.ts b/src/away/errors/PartialImplementationError.ts deleted file mode 100644 index bd7d3cc7..00000000 --- a/src/away/errors/PartialImplementationError.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// - -module away.errors -{ - - - /** - * AbstractMethodError is thrown when an abstract method is called. The method in question should be overridden - * by a concrete subclass. - */ - export class PartialImplementationError extends Error - { - /** - * Create a new AbstractMethodError. - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - constructor(dependency:string = '', id:number = 0) - { - super("PartialImplementationError - this function is in development. Required Dependency: " + dependency, id); - } - } -} diff --git a/src/away/errors/RangeError.ts b/src/away/errors/RangeError.ts deleted file mode 100644 index ffd0831b..00000000 --- a/src/away/errors/RangeError.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -module away.errors -{ - - - /** - * RangeError is thrown when an index is accessed out of range of the number of - * available indices on an Array. - */ - export class RangeError extends away.errors.Error - { - /** - * Create a new RangeError. - * - * @param message An optional message to override the default error message. - * @param id The id of the error. - */ - constructor(message:string = null, id:number = 0) - { - super(message || "RangeError", id); - } - } -} diff --git a/src/away/events/AssetEvent.ts b/src/away/events/AssetEvent.ts deleted file mode 100644 index 421ae0f1..00000000 --- a/src/away/events/AssetEvent.ts +++ /dev/null @@ -1,68 +0,0 @@ -/// - -module away.events -{ - /** - * @class away.events.AssetEvent - */ - export class AssetEvent extends away.events.Event - { - /** - * - */ - public static ASSET_COMPLETE:string = "assetComplete"; - - /** - * - */ - public static ASSET_RENAME:string = 'assetRename'; - - /** - * - */ - public static ASSET_CONFLICT_RESOLVED:string = 'assetConflictResolved'; - - /** - * - */ - public static TEXTURE_SIZE_ERROR:string = 'textureSizeError'; - - private _asset:away.library.IAsset; - private _prevName:string; - - /** - * - */ - constructor(type:string, asset:away.library.IAsset = null, prevName:string = null) - { - super(type); - - this._asset = asset; - this._prevName = prevName || (this._asset? this._asset.name : null); - } - - /** - * - */ - public get asset():away.library.IAsset - { - return this._asset; - } - - /** - * - */ - public get assetPrevName():string - { - return this._prevName; - } - - /** - * - */ - public clone():Event - { - return new away.events.AssetEvent(this.type, this.asset, this.assetPrevName); - } - } -} \ No newline at end of file diff --git a/src/away/events/CameraEvent.ts b/src/away/events/CameraEvent.ts deleted file mode 100644 index 4c647414..00000000 --- a/src/away/events/CameraEvent.ts +++ /dev/null @@ -1,29 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - /** - * @class away.events.CameraEvent - */ - export class CameraEvent extends away.events.Event - { - public static PROJECTION_CHANGED:string = "projectionChanged"; - - private _camera:away.entities.Camera; - - constructor(type:string, camera:away.entities.Camera) - { - super(type); - - this._camera = camera; - } - - public get camera():away.entities.Camera - { - return this._camera; - } - } -} \ No newline at end of file diff --git a/src/away/events/DisplayObjectEvent.ts b/src/away/events/DisplayObjectEvent.ts deleted file mode 100644 index 8d98796d..00000000 --- a/src/away/events/DisplayObjectEvent.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// -/** - * @module away.events - */ -module away.events -{ - export class DisplayObjectEvent extends Event - { - public static VISIBLITY_UPDATED:string = "visiblityUpdated"; - public static SCENETRANSFORM_CHANGED:string = "scenetransformChanged"; - public static SCENE_CHANGED:string = "sceneChanged"; - public static POSITION_CHANGED:string = "positionChanged"; - public static ROTATION_CHANGED:string = "rotationChanged"; - public static SCALE_CHANGED:string = "scaleChanged"; - - public object:away.base.DisplayObject; - - constructor(type:string, object:away.base.DisplayObject) - { - super(type); - this.object = object; - } - } -} \ No newline at end of file diff --git a/src/away/events/Event.ts b/src/away/events/Event.ts deleted file mode 100644 index 260676f6..00000000 --- a/src/away/events/Event.ts +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Base event class - * @class away.events.Event - */ -module away.events -{ - export class Event - { - - public static COMPLETE:string = 'complete'; - public static OPEN:string = 'open'; - - public static ENTER_FRAME:string = 'enterFrame'; - public static EXIT_FRAME:string = 'exitFrame'; - - - public static RESIZE:string = "resize"; - public static ERROR:string = "error"; - public static CHANGE:string = "change"; - - /** - * Type of event - * @property type - * @type String - */ - public type:string = undefined; - - /** - * Reference to target object - * @property target - * @type Object - */ - public target:any = undefined; - - constructor(type:string) - { - this.type = type; - } - - /** - * Clones the current event. - * @return An exact duplicate of the current event. - */ - public clone():Event - { - return new Event(this.type); - } - - } - -} \ No newline at end of file diff --git a/src/away/events/EventDispatcher.ts b/src/away/events/EventDispatcher.ts deleted file mode 100644 index fa6f971e..00000000 --- a/src/away/events/EventDispatcher.ts +++ /dev/null @@ -1,113 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - - /** - * Base class for dispatching events - * - * @class away.events.EventDispatcher - * - */ - export class EventDispatcher - { - private listeners:Array> = new Array>(); - private target:any; - - constructor(target:any = null) - { - this.target = target || this; - } - - /** - * Add an event listener - * @method addEventListener - * @param {String} Name of event to add a listener for - * @param {Function} Callback function - */ - public addEventListener(type:string, listener:Function) - { - if (this.listeners[ type ] === undefined) - this.listeners[ type ] = new Array(); - - if (this.getEventListenerIndex(type, listener) === -1) - this.listeners[ type ].push(listener); - } - - /** - * Remove an event listener - * @method removeEventListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - public removeEventListener(type:string, listener:Function) - { - var index:number = this.getEventListenerIndex(type, listener); - - if (index !== -1) - this.listeners[ type ].splice(index, 1); - } - - /** - * Dispatch an event - * @method dispatchEvent - * @param {Event} Event to dispatch - */ - public dispatchEvent(event:Event) - { - var listenerArray:Array = this.listeners[ event.type ]; - - if (listenerArray !== undefined) { - var l:number = listenerArray.length; - - event.target = this.target; - - for (var i:number = 0; i < l; i++) - listenerArray[i](event); - } - } - - /** - * get Event Listener Index in array. Returns -1 if no listener is added - * @method getEventListenerIndex - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - private getEventListenerIndex(type:string, listener:Function):number - { - if (this.listeners[ type ] !== undefined) { - var a:Array = this.listeners[ type ]; - var l:number = a.length; - - for (var i:number = 0; i < l; i++) - if (listener == a[i]) - return i; - } - - return -1; - } - - /** - * check if an object has an event listener assigned to it - * @method hasListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - public hasEventListener(type:string, listener?:Function):boolean - { - if (listener != null) { - return ( this.getEventListenerIndex(type, listener) !== -1 ); - } else { - if (this.listeners[ type ] !== undefined) - return ( this.listeners[ type ].length > 0 ); - - return false; - } - - return false; - } - } -} \ No newline at end of file diff --git a/src/away/events/GeometryEvent.ts b/src/away/events/GeometryEvent.ts deleted file mode 100644 index dff18b07..00000000 --- a/src/away/events/GeometryEvent.ts +++ /dev/null @@ -1,55 +0,0 @@ -/// -module away.events -{ - - /** - * Dispatched to notify changes in a geometry object's state. - * - * @class away.events.GeometryEvent - * @see away3d.core.base.Geometry - */ - export class GeometryEvent extends away.events.Event - { - /** - * Dispatched when a TriangleSubGeometry was added to the dispatching Geometry. - */ - public static SUB_GEOMETRY_ADDED:string = "SubGeometryAdded"; - - /** - * Dispatched when a TriangleSubGeometry was removed from the dispatching Geometry. - */ - public static SUB_GEOMETRY_REMOVED:string = "SubGeometryRemoved"; - - public static BOUNDS_INVALID:string = "BoundsInvalid"; - - private _subGeometry:away.base.SubGeometryBase; - - /** - * Create a new GeometryEvent - * @param type The event type. - * @param subGeometry An optional TriangleSubGeometry object that is the subject of this event. - */ - constructor(type:string, subGeometry:away.base.SubGeometryBase = null) - { - super(type) //, false, false); - this._subGeometry = subGeometry; - } - - /** - * The TriangleSubGeometry object that is the subject of this event, if appropriate. - */ - public get subGeometry():away.base.SubGeometryBase - { - return this._subGeometry; - } - - /** - * Clones the event. - * @return An exact duplicate of the current object. - */ - public clone():Event - { - return new GeometryEvent(this.type, this._subGeometry); - } - } -} diff --git a/src/away/events/HTTPStatusEvent.ts b/src/away/events/HTTPStatusEvent.ts deleted file mode 100644 index 2a52fe32..00000000 --- a/src/away/events/HTTPStatusEvent.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// - -module away.events -{ - /** - * @class away.events.HTTPStatusEvent - */ - export class HTTPStatusEvent extends away.events.Event - { - - public static HTTP_STATUS:string = "HTTPStatusEvent_HTTP_STATUS"; - - public status:number; - - constructor(type:string, status:number = null) - { - super(type); - - this.status = status; - - } - } -} \ No newline at end of file diff --git a/src/away/events/IEventDispatcher.ts b/src/away/events/IEventDispatcher.ts deleted file mode 100644 index 00962024..00000000 --- a/src/away/events/IEventDispatcher.ts +++ /dev/null @@ -1,49 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - - /** - * Base interface for dispatching events - * - * @interface away.events.IEventDispatcher - * - */ - export interface IEventDispatcher - { - /** - * Add an event listener - * @method addEventListener - * @param {String} Name of event to add a listener for - * @param {Function} Callback function - */ - addEventListener(type:string, listener:Function); - - /** - * Remove an event listener - * @method removeEventListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - */ - removeEventListener(type:string, listener:Function); - - /** - * Dispatch an event - * @method dispatchEvent - * @param {Event} Event to dispatch - */ - dispatchEvent(event:Event); - - /** - * check if an object has an event listener assigned to it - * @method hasListener - * @param {String} Name of event to remove a listener for - * @param {Function} Callback function - * @param {Object} Target object listener is added to - */ - hasEventListener(type:string, listener?:Function) : boolean; - } -} \ No newline at end of file diff --git a/src/away/events/IOErrorEvent.ts b/src/away/events/IOErrorEvent.ts deleted file mode 100644 index 8fe44f33..00000000 --- a/src/away/events/IOErrorEvent.ts +++ /dev/null @@ -1,19 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - export class IOErrorEvent extends away.events.Event - { - - public static IO_ERROR:string = "ioError"; - - constructor(type:string) - { - super(type); - - } - } -} \ No newline at end of file diff --git a/src/away/events/LightEvent.ts b/src/away/events/LightEvent.ts deleted file mode 100644 index 54b81e62..00000000 --- a/src/away/events/LightEvent.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - export class LightEvent extends away.events.Event - { - - public static CASTS_SHADOW_CHANGE:string = "castsShadowChange"; - - constructor(type:string) - { - super(type); - } - - //@override - public clone():away.events.Event - { - return new away.events.LightEvent(this.type); - } - } -} \ No newline at end of file diff --git a/src/away/events/LoaderEvent.ts b/src/away/events/LoaderEvent.ts deleted file mode 100644 index 022ec6f8..00000000 --- a/src/away/events/LoaderEvent.ts +++ /dev/null @@ -1,68 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - export class LoaderEvent extends away.events.Event - { - /** - * Dispatched when a resource and all of its dependencies is retrieved. - */ - public static RESOURCE_COMPLETE:string = "resourceComplete"; - - private _url:string; - private _content:away.base.DisplayObject; - private _assets:away.library.IAsset[]; - - /** - * Create a new LoaderEvent object. - * - * @param type The event type. - * @param url The url of the loaded resource. - * @param assets The assets of the loaded resource. - */ - constructor(type:string, url:string = null, content:away.base.DisplayObject = null, assets:Array = null) - { - super(type); - - this._url = url; - this._content = content; - this._assets = assets; - } - - /** - * The content returned if the resource has been loaded inside a Loader object. - */ - public get content():away.base.DisplayObject - { - return this._content; - } - - /** - * The url of the loaded resource. - */ - public get url():string - { - return this._url; - } - - /** - * The error string on loadError. - */ - public get assets():away.library.IAsset[] - { - return this._assets; - } - - /** - * Clones the current event. - * @return An exact duplicate of the current event. - */ - public clone():away.events.Event - { - return new LoaderEvent(this.type, this._url, this._content, this._assets); - } - } -} \ No newline at end of file diff --git a/src/away/events/MaterialEvent.ts b/src/away/events/MaterialEvent.ts deleted file mode 100644 index 57bf5f7d..00000000 --- a/src/away/events/MaterialEvent.ts +++ /dev/null @@ -1,16 +0,0 @@ -/// -/** - * @module away.events - */ -module away.events -{ - export class MaterialEvent extends Event - { - public static SIZE_CHANGED:string = "sizeChanged"; - - constructor(type:string) - { - super(type); - } - } -} \ No newline at end of file diff --git a/src/away/events/MouseEvent.ts b/src/away/events/MouseEvent.ts deleted file mode 100644 index 102494ac..00000000 --- a/src/away/events/MouseEvent.ts +++ /dev/null @@ -1,245 +0,0 @@ -/// -/** - * @module away.events - */ -module away.events -{ - import DisplayObject = away.base.DisplayObject; - import IMaterialOwner = away.base.IMaterialOwner; - import Point = away.geom.Point; - import Vector3D = away.geom.Vector3D; - import MaterialBase = away.materials.MaterialBase; - - /** - * A MouseEvent is dispatched when a mouse event occurs over a mouseEnabled object in View. - * TODO: we don't have screenZ data, tho this should be easy to implement - */ - export class MouseEvent extends away.events.Event - { - // Private. - public _iAllowedToPropagate:boolean = true; - public _iParentEvent:MouseEvent; - - /** - * Defines the value of the type property of a mouseOver3d event object. - */ - public static MOUSE_OVER:string = "mouseOver3d"; - - /** - * Defines the value of the type property of a mouseOut3d event object. - */ - public static MOUSE_OUT:string = "mouseOut3d"; - - /** - * Defines the value of the type property of a mouseUp3d event object. - */ - public static MOUSE_UP:string = "mouseUp3d"; - - /** - * Defines the value of the type property of a mouseDown3d event object. - */ - public static MOUSE_DOWN:string = "mouseDown3d"; - - /** - * Defines the value of the type property of a mouseMove3d event object. - */ - public static MOUSE_MOVE:string = "mouseMove3d"; - - /** - * Defines the value of the type property of a rollOver3d event object. - */ -// public static ROLL_OVER : string = "rollOver3d"; - - /** - * Defines the value of the type property of a rollOut3d event object. - */ -// public static ROLL_OUT : string = "rollOut3d"; - - /** - * Defines the value of the type property of a click3d event object. - */ - public static CLICK:string = "click3d"; - - /** - * Defines the value of the type property of a doubleClick3d event object. - */ - public static DOUBLE_CLICK:string = "doubleClick3d"; - - /** - * Defines the value of the type property of a mouseWheel3d event object. - */ - public static MOUSE_WHEEL:string = "mouseWheel3d"; - - /** - * The horizontal coordinate at which the event occurred in view coordinates. - */ - public screenX:number; - - /** - * The vertical coordinate at which the event occurred in view coordinates. - */ - public screenY:number; - - /** - * The view object inside which the event took place. - */ - public view:away.containers.View; - - /** - * The 3d object inside which the event took place. - */ - public object:DisplayObject; - - /** - * The material owner inside which the event took place. - */ - public materialOwner:IMaterialOwner; - - /** - * The material of the 3d element inside which the event took place. - */ - public material:MaterialBase; - - /** - * The uv coordinate inside the draw primitive where the event took place. - */ - public uv:Point; - - /** - * The index of the face where the event took place. - */ - public index:number; - - /** - * The index of the subGeometry where the event took place. - */ - public subGeometryIndex:number; - - /** - * The position in object space where the event took place - */ - public localPosition:Vector3D; - - /** - * The normal in object space where the event took place - */ - public localNormal:Vector3D; - - /** - * Indicates whether the Control key is active (true) or inactive (false). - */ - public ctrlKey:boolean; - - /** - * Indicates whether the Alt key is active (true) or inactive (false). - */ - public altKey:boolean; - - /** - * Indicates whether the Shift key is active (true) or inactive (false). - */ - public shiftKey:boolean; - - /** - * Indicates how many lines should be scrolled for each unit the user rotates the mouse wheel. - */ - public delta:number; - - /** - * Create a new MouseEvent object. - * @param type The type of the MouseEvent. - */ - constructor(type:string) - { - super(type); - } - - /** - * @inheritDoc - */ - public get bubbles():boolean - { - var doesBubble:boolean = this._iAllowedToPropagate; - this._iAllowedToPropagate = true; - - // Don't bubble if propagation has been stopped. - return doesBubble; - } - - /** - * @inheritDoc - */ - public stopPropagation() - { - this._iAllowedToPropagate = false; - - if (this._iParentEvent) - this._iParentEvent.stopPropagation(); - } - - /** - * @inheritDoc - */ - public stopImmediatePropagation() - { - this._iAllowedToPropagate = false; - - if (this._iParentEvent) - this._iParentEvent.stopImmediatePropagation(); - } - - /** - * Creates a copy of the MouseEvent object and sets the value of each property to match that of the original. - */ - public clone():Event - { - var result:MouseEvent = new MouseEvent(this.type); - - /* TODO: Debug / test - look into isDefaultPrevented - if (isDefaultPrevented()) - result.preventDefault(); - */ - - result.screenX = this.screenX; - result.screenY = this.screenY; - - result.view = this.view; - result.object = this.object; - result.materialOwner = this.materialOwner; - result.material = this.material; - result.uv = this.uv; - result.localPosition = this.localPosition; - result.localNormal = this.localNormal; - result.index = this.index; - result.subGeometryIndex = this.subGeometryIndex; - result.delta = this.delta; - - result.ctrlKey = this.ctrlKey; - result.shiftKey = this.shiftKey; - - result._iParentEvent = this; - result._iAllowedToPropagate = this._iAllowedToPropagate; - - return result; - } - - /** - * The position in scene space where the event took place - */ - public get scenePosition():Vector3D - { - return this.object.sceneTransform.transformVector(this.localPosition); - } - - /** - * The normal in scene space where the event took place - */ - public get sceneNormal():Vector3D - { - var sceneNormal:Vector3D = this.object.sceneTransform.deltaTransformVector(this.localNormal); - sceneNormal.normalize(); - - return sceneNormal; - } - } -} diff --git a/src/away/events/ParserEvent.ts b/src/away/events/ParserEvent.ts deleted file mode 100644 index 54534d68..00000000 --- a/src/away/events/ParserEvent.ts +++ /dev/null @@ -1,56 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - //import flash.events.Event; - - export class ParserEvent extends away.events.Event - { - private _message:string; - - /** - * Dispatched when parsing of an asset completed. - */ - public static PARSE_COMPLETE:string = 'parseComplete'; - - /** - * Dispatched when an error occurs while parsing the data (e.g. because it's - * incorrectly formatted.) - */ - public static PARSE_ERROR:string = 'parseError'; - - - /** - * Dispatched when a parser is ready to have dependencies retrieved and resolved. - * This is an internal event that should rarely (if ever) be listened for by - * external classes. - */ - public static READY_FOR_DEPENDENCIES:string = 'readyForDependencies'; - - - constructor(type:string, message:string = '') - { - super(type); - - this._message = message; - } - - - /** - * Additional human-readable message. Usually supplied for ParserEvent.PARSE_ERROR events. - */ - public get message():string - { - return this._message; - } - - - public clone():Event - { - return new away.events.ParserEvent(this.type, this.message); - } - } -} \ No newline at end of file diff --git a/src/away/events/ProgressEvent.ts b/src/away/events/ProgressEvent.ts deleted file mode 100644 index 54888d08..00000000 --- a/src/away/events/ProgressEvent.ts +++ /dev/null @@ -1,23 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - export class ProgressEvent extends away.events.Event - { - - public static PROGRESS:string = "progress"; - - public bytesLoaded:number; - - public bytesTotal:number; - - constructor(type:string) - { - super(type); - - } - } -} \ No newline at end of file diff --git a/src/away/events/ProjectionEvent.ts b/src/away/events/ProjectionEvent.ts deleted file mode 100644 index 6ebbe792..00000000 --- a/src/away/events/ProjectionEvent.ts +++ /dev/null @@ -1,24 +0,0 @@ -/// -/** - * @module away.events - */ -module away.events -{ - export class ProjectionEvent extends away.events.Event - { - public static MATRIX_CHANGED:string = "matrixChanged"; - - private _projection:away.projections.IProjection; - - constructor(type:string, projection:away.projections.IProjection) - { - super(type); - this._projection = projection; - } - - public get projection():away.projections.IProjection - { - return this._projection; - } - } -} \ No newline at end of file diff --git a/src/away/events/RendererEvent.ts b/src/away/events/RendererEvent.ts deleted file mode 100644 index 949f50ad..00000000 --- a/src/away/events/RendererEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - //import flash.events.Event; - - export class RendererEvent extends Event - { - public static VIEWPORT_UPDATED:string = "viewportUpdated"; - public static SCISSOR_UPDATED:string = "scissorUpdated"; - - constructor(type:string)//, bubbles:boolean = false, cancelable:boolean = false) - { - super(type);//, bubbles, cancelable); - } - } -} diff --git a/src/away/events/ResizeEvent.ts b/src/away/events/ResizeEvent.ts deleted file mode 100644 index e0b5bfa6..00000000 --- a/src/away/events/ResizeEvent.ts +++ /dev/null @@ -1,32 +0,0 @@ -/// -/** - * @module away.events - */ -module away.events -{ - export class ResizeEvent extends away.events.Event - { - - public static RESIZE:string = "resize"; - - private _oldHeight:number; - private _oldWidth:number; - - constructor(type:string, oldHeight:number = NaN, oldWidth:number = NaN) - { - super(type); - this._oldHeight = oldHeight; - this._oldWidth = oldWidth; - } - - public get oldHeight():number - { - return this._oldHeight; - } - - public get oldWidth():number - { - return this._oldWidth; - } - } -} \ No newline at end of file diff --git a/src/away/events/SceneEvent.ts b/src/away/events/SceneEvent.ts deleted file mode 100644 index ba0de943..00000000 --- a/src/away/events/SceneEvent.ts +++ /dev/null @@ -1,36 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - export class SceneEvent extends away.events.Event - { - /** - * - */ - public static ADDED_TO_SCENE:string = "addedToScene"; - - /** - * - */ - public static REMOVED_FROM_SCENE:string = "removedFromScene"; - - /** - * - */ - public static PARTITION_CHANGED:string = "partitionChanged"; - - /** - * - */ - public displayObject:away.base.DisplayObject; - - constructor(type:string, displayObject:away.base.DisplayObject) - { - this.displayObject = displayObject; - super(type); - } - } -} \ No newline at end of file diff --git a/src/away/events/StageEvent.ts b/src/away/events/StageEvent.ts deleted file mode 100644 index 51423613..00000000 --- a/src/away/events/StageEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - export class StageEvent extends away.events.Event - { - public static CONTEXT_CREATED:string = "contextCreated"; - public static CONTEXT_DISPOSED:string = "contextDisposed"; - public static CONTEXT_RECREATED:string = "contextRecreated"; - public static VIEWPORT_UPDATED:string = "viewportUpdated"; - - constructor(type:string) - { - super(type); - } - } -} diff --git a/src/away/events/SubGeometryEvent.ts b/src/away/events/SubGeometryEvent.ts deleted file mode 100644 index 0f0430c3..00000000 --- a/src/away/events/SubGeometryEvent.ts +++ /dev/null @@ -1,54 +0,0 @@ -/// -module away.events -{ - - /** - * Dispatched to notify changes in a sub geometry object's state. - * - * @class away.events.SubGeometryEvent - * @see away3d.core.base.Geometry - */ - export class SubGeometryEvent extends away.events.Event - { - /** - * Dispatched when a TriangleSubGeometry's index data has been updated. - */ - public static INDICES_UPDATED:string = "indicesUpdated"; - - /** - * Dispatched when a TriangleSubGeometry's vertex data has been updated. - */ - public static VERTICES_UPDATED:string = "verticesUpdated"; - - private _dataType:string; - - /** - * Create a new GeometryEvent - * @param type The event type. - * @param dataType An optional data type of the vertex data being updated. - */ - constructor(type:string, dataType:string = "") - { - super(type); - this._dataType = dataType; - } - - /** - * The data type of the vertex data. - */ - public get dataType():string - { - return this._dataType; - } - - /** - * Clones the event. - * - * @return An exact duplicate of the current object. - */ - public clone():Event - { - return new SubGeometryEvent(this.type, this._dataType); - } - } -} diff --git a/src/away/events/TimerEvent.ts b/src/away/events/TimerEvent.ts deleted file mode 100644 index 9a8cb4e8..00000000 --- a/src/away/events/TimerEvent.ts +++ /dev/null @@ -1,20 +0,0 @@ -/// - -/** - * @module away.events - */ -module away.events -{ - export class TimerEvent extends away.events.Event - { - - public static TIMER:string = "timer"; - public static TIMER_COMPLETE:string = "timerComplete"; - - constructor(type:string) - { - super(type); - - } - } -} \ No newline at end of file diff --git a/src/away/managers/MouseManager.ts b/src/away/managers/MouseManager.ts deleted file mode 100644 index 060eea70..00000000 --- a/src/away/managers/MouseManager.ts +++ /dev/null @@ -1,300 +0,0 @@ -/// - -// Reference note: http://www.w3schools.com/jsref/dom_obj_event.asp - -module away.managers -{ - /** - * MouseManager enforces a singleton pattern and is not intended to be instanced. - * it provides a manager class for detecting mouse hits on scene objects and sending out mouse events. - */ - export class MouseManager - { - private static _instance:MouseManager; - - private _viewLookup:Array = new Array(); - - public _iActiveDiv:HTMLDivElement; - public _iUpdateDirty:boolean; - public _iCollidingObject:away.pick.PickingCollisionVO; - - private _nullVector:away.geom.Vector3D = new away.geom.Vector3D(); - private _previousCollidingObject:away.pick.PickingCollisionVO; - private _queuedEvents:away.events.MouseEvent[] = new Array(); - - private _mouseMoveEvent:MouseEvent; - - private _mouseUp:away.events.MouseEvent = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_UP); - private _mouseClick:away.events.MouseEvent = new away.events.MouseEvent(away.events.MouseEvent.CLICK); - private _mouseOut:away.events.MouseEvent = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_OUT); - private _mouseDown:away.events.MouseEvent = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_DOWN); - private _mouseMove:away.events.MouseEvent = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_MOVE); - private _mouseOver:away.events.MouseEvent = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_OVER); - private _mouseWheel:away.events.MouseEvent = new away.events.MouseEvent(away.events.MouseEvent.MOUSE_WHEEL); - private _mouseDoubleClick:away.events.MouseEvent = new away.events.MouseEvent(away.events.MouseEvent.DOUBLE_CLICK); - - private onClickDelegate:(event:MouseEvent) => void; - private onDoubleClickDelegate:(event:MouseEvent) => void; - private onMouseDownDelegate:(event:MouseEvent) => void; - private onMouseMoveDelegate:(event:MouseEvent) => void; - private onMouseUpDelegate:(event:MouseEvent) => void; - private onMouseWheelDelegate:(event:MouseEvent) => void; - private onMouseOverDelegate:(event:MouseEvent) => void; - private onMouseOutDelegate:(event:MouseEvent) => void; - - /** - * Creates a new MouseManager object. - */ - constructor() - { - this.onClickDelegate = (event:MouseEvent) => this.onClick(event); - this.onDoubleClickDelegate = (event:MouseEvent) => this.onDoubleClick(event); - this.onMouseDownDelegate = (event:MouseEvent) => this.onMouseDown(event); - this.onMouseMoveDelegate = (event:MouseEvent) => this.onMouseMove(event); - this.onMouseUpDelegate = (event:MouseEvent) => this.onMouseUp(event); - this.onMouseWheelDelegate = (event:MouseEvent) => this.onMouseWheel(event); - this.onMouseOverDelegate = (event:MouseEvent) => this.onMouseOver(event); - this.onMouseOutDelegate = (event:MouseEvent) => this.onMouseOut(event); - } - - public static getInstance():MouseManager - { - if (this._instance) - return this._instance; - - return (this._instance = new MouseManager()); - } - - public fireMouseEvents(forceMouseMove:boolean) - { - // If colliding object has changed, queue over/out events. - if (this._iCollidingObject != this._previousCollidingObject) { - if (this._previousCollidingObject) - this.queueDispatch(this._mouseOut, this._mouseMoveEvent, this._previousCollidingObject); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseOver, this._mouseMoveEvent); - } - - // Fire mouse move events here if forceMouseMove is on. - if (forceMouseMove && this._iCollidingObject) - this.queueDispatch( this._mouseMove, this._mouseMoveEvent); - - var event:away.events.MouseEvent; - var dispatcher:away.base.DisplayObject; - - // Dispatch all queued events. - var len:number = this._queuedEvents.length; - for (var i:number = 0; i < len; ++i) { - // Only dispatch from first implicitly enabled object ( one that is not a child of a mouseChildren = false hierarchy ). - event = this._queuedEvents[i]; - dispatcher = event.object; - - while (dispatcher && !dispatcher._iIsMouseEnabled()) - dispatcher = dispatcher.parent; - - if (dispatcher) - dispatcher.dispatchEvent(event); - } - - this._queuedEvents.length = 0; - - this._previousCollidingObject = this._iCollidingObject; - - this._iUpdateDirty = false; - } - -// public addViewLayer(view:away.containers.View) -// { -// var stg:Stage = view.stage; -// -// // Add instance to mouse3dmanager to fire mouse events for multiple views -// if (!view.stageGL.mouse3DManager) -// view.stageGL.mouse3DManager = this; -// -// if (!hasKey(view)) -// _view3Ds[view] = 0; -// -// _childDepth = 0; -// traverseDisplayObjects(stg); -// _viewCount = _childDepth; -// } - - public registerView(view:away.containers.View) - { - view.htmlElement.addEventListener("click", this.onClickDelegate); - view.htmlElement.addEventListener("dblclick", this.onDoubleClickDelegate); - view.htmlElement.addEventListener("mousedown", this.onMouseDownDelegate); - view.htmlElement.addEventListener("mousemove", this.onMouseMoveDelegate); - view.htmlElement.addEventListener("mouseup", this.onMouseUpDelegate); - view.htmlElement.addEventListener("mousewheel", this.onMouseWheelDelegate); - view.htmlElement.addEventListener("mouseover", this.onMouseOverDelegate); - view.htmlElement.addEventListener("mouseout", this.onMouseOutDelegate); - - this._viewLookup.push(view); - } - - public unregisterView(view:away.containers.View) - { - view.htmlElement.removeEventListener("click", this.onClickDelegate); - view.htmlElement.removeEventListener("dblclick", this.onDoubleClickDelegate); - view.htmlElement.removeEventListener("mousedown", this.onMouseDownDelegate); - view.htmlElement.removeEventListener("mousemove", this.onMouseMoveDelegate); - view.htmlElement.removeEventListener("mouseup", this.onMouseUpDelegate); - view.htmlElement.removeEventListener("mousewheel", this.onMouseWheelDelegate); - view.htmlElement.removeEventListener("mouseover", this.onMouseOverDelegate); - view.htmlElement.removeEventListener("mouseout", this.onMouseOutDelegate); - - this._viewLookup.slice(this._viewLookup.indexOf(view), 1); - } - - // --------------------------------------------------------------------- - // Private. - // --------------------------------------------------------------------- - - private queueDispatch(event:away.events.MouseEvent, sourceEvent:MouseEvent, collider:away.pick.PickingCollisionVO = null) - { - // 2D properties. - if (sourceEvent) { - event.ctrlKey = sourceEvent.ctrlKey; - event.altKey = sourceEvent.altKey; - event.shiftKey = sourceEvent.shiftKey; - event.screenX = sourceEvent.clientX; - event.screenY = sourceEvent.clientY; - } - - if (collider == null) - collider = this._iCollidingObject; - - // 3D properties. - if (collider) { - // Object. - event.object = collider.displayObject; - event.materialOwner = collider.materialOwner; - // UV. - event.uv = collider.uv; - // Position. - event.localPosition = collider.localPosition? collider.localPosition.clone() : null; - // Normal. - event.localNormal = collider.localNormal? collider.localNormal.clone() : null; - // Face index. - event.index = collider.index; - } else { - // Set all to null. - event.uv = null; - event.object = null; - event.localPosition = this._nullVector; - event.localNormal = this._nullVector; - event.index = 0; - event.subGeometryIndex = 0; - } - - // Store event to be dispatched later. - this._queuedEvents.push(event); - } - - // --------------------------------------------------------------------- - // Listeners. - // --------------------------------------------------------------------- - - private onMouseMove(event:MouseEvent) - { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseMove, this._mouseMoveEvent = event); - } - - private onMouseOut(event:MouseEvent) - { - this._iActiveDiv = null; - - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseOut, event); - } - - private onMouseOver(event:MouseEvent) - { - this._iActiveDiv = event.target; - - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch( this._mouseOver, event); - } - - private onClick(event:MouseEvent) - { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseClick, event); - } - - private onDoubleClick(event:MouseEvent) - { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseDoubleClick, event); - } - - private onMouseDown(event:MouseEvent) - { - this._iActiveDiv = event.target; - - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseDown, event); - } - - private onMouseUp(event:MouseEvent) - { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseUp , event); - } - - private onMouseWheel(event:MouseEvent) - { - this.updateColliders(event); - - if (this._iCollidingObject) - this.queueDispatch(this._mouseWheel, event); - } - - - private updateColliders(event:MouseEvent) - { - if (this._iUpdateDirty) - return; - - var view:away.containers.View; - var bounds:ClientRect; - var mouseX:number = event.clientX; - var mouseY:number = event.clientY; - var len:number = this._viewLookup.length; - for (var i:number = 0; i < len; i++) { - view = this._viewLookup[i]; - bounds = view.htmlElement.getBoundingClientRect(); - if (mouseX < bounds.left || mouseX > bounds.right || mouseY < bounds.top || mouseY > bounds.bottom) { - view._pMouseX = null; - view._pMouseY = null; - } else { - view._pMouseX = mouseX + bounds.left; - view._pMouseY = mouseY + bounds.top; - view.updateCollider(); - - if (view.layeredView && this._iCollidingObject) - break; - } - } - - this._iUpdateDirty = true; - } - } -} diff --git a/src/away/managers/StageManager.ts b/src/away/managers/StageManager.ts deleted file mode 100644 index 98f9ba23..00000000 --- a/src/away/managers/StageManager.ts +++ /dev/null @@ -1,160 +0,0 @@ -/// - -module away.managers -{ - import Stage = away.base.Stage; - import Event = away.events.Event; - import StageEvent = away.events.StageEvent; - - /** - * The StageManager class provides a multiton object that handles management for Stage objects. - * - * @see away.base.Stage - */ - export class StageManager extends away.events.EventDispatcher - { - private static STAGE_MAX_QUANTITY:number = 8; - private _stages:Array; - - private static _instance:StageManager; - private static _numStages:number = 0; - private _onContextCreatedDelegate:(event:Event) => void; - - /** - * Creates a new StageManager class. - * @param stage The Stage object that contains the Stage objects to be managed. - * @private - */ - constructor(StageManagerSingletonEnforcer:StageManagerSingletonEnforcer) - { - super(); - - if (!StageManagerSingletonEnforcer) - throw new Error("This class is a multiton and cannot be instantiated manually. Use StageManager.getInstance instead."); - - this._stages = new Array(StageManager.STAGE_MAX_QUANTITY); - - this._onContextCreatedDelegate = (event:Event) => this.onContextCreated(event); - } - - /** - * Gets a StageManager instance for the given Stage object. - * @param stage The Stage object that contains the Stage objects to be managed. - * @return The StageManager instance for the given Stage object. - */ - public static getInstance():StageManager - { - if (this._instance == null) - this._instance = new StageManager(new StageManagerSingletonEnforcer()); - - return this._instance; - } - - /** - * Requests the Stage for the given index. - * - * @param index The index of the requested Stage. - * @param forceSoftware Whether to force software mode even if hardware acceleration is available. - * @param profile The compatibility profile, an enumeration of ContextProfile - * @return The Stage for the given index. - */ - public getStageAt(index:number, forceSoftware:boolean = false, profile:string = "baseline", mode:string = "auto"):Stage - { - if (index < 0 || index >= StageManager.STAGE_MAX_QUANTITY) - throw new away.errors.ArgumentError("Index is out of bounds [0.." + StageManager.STAGE_MAX_QUANTITY + "]"); - - if (!this._stages[index]) { - StageManager._numStages++; - - var canvas:HTMLCanvasElement = document.createElement("canvas"); - canvas.id = "stage" + index; - document.body.appendChild(canvas); - var stage:Stage = this._stages[index] = new Stage(canvas, index, this, forceSoftware, profile); - stage.addEventListener(StageEvent.CONTEXT_CREATED, this._onContextCreatedDelegate); - stage.requestContext(forceSoftware, profile, mode); - } - - return stage; - } - - /** - * Removes a Stage from the manager. - * @param stage - * @private - */ - public iRemoveStage(stage:Stage) - { - StageManager._numStages--; - - stage.removeEventListener(StageEvent.CONTEXT_CREATED, this._onContextCreatedDelegate); - - this._stages[stage.stageIndex] = null; - } - - /** - * Get the next available stage. An error is thrown if there are no StageProxies available - * @param forceSoftware Whether to force software mode even if hardware acceleration is available. - * @param profile The compatibility profile, an enumeration of ContextProfile - * @return The allocated stage - */ - public getFreeStage(forceSoftware:boolean = false, profile:string = "baseline", mode:string = "auto"):Stage - { - var i:number = 0; - var len:number = this._stages.length; - - while (i < len) { - if (!this._stages[i]) - return this.getStageAt(i, forceSoftware, profile, mode); - - ++i; - } - - return null; - } - - /** - * Checks if a new stage can be created and managed by the class. - * @return true if there is one slot free for a new stage - */ - public get hasFreeStage():boolean - { - return StageManager._numStages < StageManager.STAGE_MAX_QUANTITY? true : false; - } - - /** - * Returns the amount of stage objects that can be created and managed by the class - * @return the amount of free slots - */ - public get numSlotsFree():number - { - return StageManager.STAGE_MAX_QUANTITY - StageManager._numStages; - } - - /** - * Returns the amount of Stage objects currently managed by the class. - * @return the amount of slots used - */ - public get numSlotsUsed():number - { - return StageManager._numStages; - } - - /** - * The maximum amount of Stage objects that can be managed by the class - */ - public get numSlotsTotal():number - { - return this._stages.length; - } - - private onContextCreated(e:Event):void - { - //var stage:Stage = e.target; - //document.body.appendChild(stage.canvas) - } - } -} - -class StageManagerSingletonEnforcer -{ -} \ No newline at end of file diff --git a/src/away/materials/CSSMaterialBase.ts b/src/away/materials/CSSMaterialBase.ts deleted file mode 100644 index 6573e543..00000000 --- a/src/away/materials/CSSMaterialBase.ts +++ /dev/null @@ -1,107 +0,0 @@ -/// - -module away.materials -{ - import BlendMode = away.base.BlendMode; - import IMaterialOwner = away.base.IMaterialOwner; - import MaterialEvent = away.events.MaterialEvent; - import Matrix3D = away.geom.Matrix3D; - import AssetType = away.library.AssetType; - - /** - * MaterialBase forms an abstract base class for any material. - * A material consists of several passes, each of which constitutes at least one render call. Several passes could - * be used for special effects (render lighting for many lights in several passes, render an outline in a separate - * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space - * subsurface scattering, or rendering a depth map for specialized self-shadowing). - * - * Away3D provides default materials trough SinglePassMaterialBase and MultiPassMaterialBase, which use modular - * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom - * shaders, or entire new material frameworks. - */ - export class CSSMaterialBase extends MaterialBase - { - private _sizeChanged:MaterialEvent; - - private _imageElement:HTMLImageElement; - private _imageStyle:MSStyleCSSProperties; - - - public get imageElement():HTMLImageElement - { - return this._imageElement; - } - - public get imageStyle():MSStyleCSSProperties - { - return this._imageStyle; - } - - /** - * The texture object to use for the albedo colour. - */ - public get texture():away.textures.Texture2DBase - { - return this._pTexture; - } - - public set texture(value:away.textures.Texture2DBase) - { - if (this._pTexture == value) - return; - - this._pTexture = value; - - if (value instanceof away.textures.ImageTexture) { - this._imageElement = ( value).htmlImageElement; - - var node:HTMLStyleElement = document.createElement("style"); - node.type = "text/css"; - document.getElementsByTagName("head")[0].appendChild(node); - - var sheet:CSSStyleSheet = document.styleSheets[document.styleSheets.length - 1]; - sheet.insertRule(".material" + this.id + "{ }", 0); - var style:MSStyleCSSProperties = ( sheet.cssRules[0]).style; - - style.backgroundImage = "url(" + this._imageElement.src + ")"; - style.backgroundSize = "100% 100%"; - style.position = "absolute"; - style.width = this._imageElement.width + "px"; - style.height = this._imageElement.height + "px"; - style.transformOrigin - = style["-webkit-transform-origin"] - = style["-moz-transform-origin"] - = style["-o-transform-origin"] - = style["-ms-transform-origin"] = "0% 0%"; - - this._pHeight = this._imageElement.height; - this._pWidth = this._imageElement.width; - - this.notifySizeChanged(); - } - } - - /** - * Creates a new MaterialBase object. - */ - constructor(texture:away.textures.Texture2DBase = null, smooth:boolean = true, repeat:boolean = false) - { - super(); - - this._iMaterialId = Number(this.id); - - this.texture = texture; - - this.smooth = smooth; - this.repeat = repeat; - } - - private notifySizeChanged() - { - if (!this._sizeChanged) - this._sizeChanged = new MaterialEvent(MaterialEvent.SIZE_CHANGED); - - this.dispatchEvent(this._sizeChanged); - } - } -} diff --git a/src/away/materials/LightSources.ts b/src/away/materials/LightSources.ts deleted file mode 100644 index ca853c3e..00000000 --- a/src/away/materials/LightSources.ts +++ /dev/null @@ -1,35 +0,0 @@ -module away.materials -{ - - /** - * Enumeration class for defining which lighting types affect the specific material - * lighting component (diffuse and specular). This can be useful if, for example, you - * want to use light probes for diffuse global lighting, but want specular reflections from - * traditional light sources without those affecting the diffuse light. - * - * @see away.materials.ColorMaterial.diffuseLightSources - * @see away.materials.ColorMaterial.specularLightSources - * @see away.materials.TextureMaterial.diffuseLightSources - * @see away.materials.TextureMaterial.specularLightSources - */ - export class LightSources - { - /** - * Defines normal lights are to be used as the source for the lighting - * component. - */ - public static LIGHTS:number = 0x01; - - /** - * Defines that global lighting probes are to be used as the source for the - * lighting component. - */ - public static PROBES:number = 0x02; - - /** - * Defines that both normal and global lighting probes are to be used as the - * source for the lighting component. This is equivalent to LightSources.LIGHTS | LightSources.PROBES. - */ - public static ALL:number = 0x03; - } -} \ No newline at end of file diff --git a/src/away/materials/MaterialBase.ts b/src/away/materials/MaterialBase.ts deleted file mode 100644 index c0e843f2..00000000 --- a/src/away/materials/MaterialBase.ts +++ /dev/null @@ -1,719 +0,0 @@ -/// - -module away.materials -{ - import IAnimationSet = away.animators.IAnimationSet; - import IAnimator = away.animators.IAnimator; - import BlendMode = away.base.BlendMode; - import IMaterialOwner = away.base.IMaterialOwner; - import Stage = away.base.Stage; - import Camera = away.entities.Camera; - import Event = away.events.Event; - import Matrix3D = away.geom.Matrix3D; - import AssetType = away.library.AssetType; - import IMaterialPass = away.materials.IMaterialPass; - import IRenderable = away.pool.IRenderable; - import IMaterialData = away.pool.IMaterialData; - import IMaterialPassData = away.pool.IMaterialPassData; - import Texture2DBase = away.textures.Texture2DBase; - - /** - * MaterialBase forms an abstract base class for any material. - * A material consists of several passes, each of which constitutes at least one render call. Several passes could - * be used for special effects (render lighting for many lights in several passes, render an outline in a separate - * pass) or to provide additional render-to-texture passes (rendering diffuse light to texture for texture-space - * subsurface scattering, or rendering a depth map for specialized self-shadowing). - * - * Away3D provides default materials trough SinglePassMaterialBase and TriangleMaterial, which use modular - * methods to build the shader code. MaterialBase can be extended to build specific and high-performant custom - * shaders, or entire new material frameworks. - */ - export class MaterialBase extends away.library.NamedAssetBase implements away.library.IAsset - { - private _materialPassData:Array = new Array(); - private _materialData:Array = new Array(); - - public _pAlphaThreshold:number = 0; - public _pAnimateUVs:boolean = false; - private _enableLightFallOff:boolean = true; - private _specularLightSources:number = 0x01; - private _diffuseLightSources:number = 0x03; - - /** - * An object to contain any extra data. - */ - public extra:Object; - - /** - * A value that can be used by materials that only work with a given type of renderer. The renderer can test the - * classification to choose which render path to use. For example, a deferred material could set this value so - * that the deferred renderer knows not to take the forward rendering path. - * - * @private - */ - public _iClassification:string; - - - /** - * An id for this material used to sort the renderables by shader program, which reduces Program state changes. - * - * @private - */ - public _iMaterialId:number = 0; - - public _iBaseScreenPassIndex:number = 0; - - private _bothSides:boolean = false; // update - private _animationSet:IAnimationSet; - public _pScreenPassesInvalid:boolean = true; - - /** - * A list of material owners, renderables or custom Entities. - */ - private _owners:Array; - - private _alphaPremultiplied:boolean; - - public _pBlendMode:string = BlendMode.NORMAL; - - private _numPasses:number = 0; - private _passes:Array; - - private _mipmap:boolean = false; - private _smooth:boolean = true; - private _repeat:boolean = false; - private _color:number = 0xFFFFFF; - public _pTexture:Texture2DBase; - - public _pLightPicker:LightPickerBase; - - public _pHeight:number = 1; - public _pWidth:number = 1; - public _pRequiresBlending:boolean = false; - - private _onPassChangeDelegate:(event:Event) => void; - private _onLightChangeDelegate:(event:Event) => void; - - /** - * Creates a new MaterialBase object. - */ - constructor() - { - super(); - - this._iMaterialId = Number(this.id); - - this._owners = new Array(); - this._passes = new Array(); - - this._onPassChangeDelegate = (event:Event) => this.onPassChange(event); - this._onLightChangeDelegate = (event:Event) => this.onLightsChange(event); - - this.alphaPremultiplied = false; //TODO: work out why this is different for WebGL - } - - /** - * @inheritDoc - */ - public get assetType():string - { - return AssetType.MATERIAL; - } - - /** - * - */ - public get height():number - { - return this._pHeight; - } - - /** - * - */ - public get animationSet():IAnimationSet - { - return this._animationSet; - } - - - /** - * The light picker used by the material to provide lights to the material if it supports lighting. - * - * @see LightPickerBase - * @see StaticLightPicker - */ - public get lightPicker():LightPickerBase - { - return this._pLightPicker; - } - - public set lightPicker(value:LightPickerBase) - { - if (this._pLightPicker == value) - return; - - if (this._pLightPicker) - this._pLightPicker.removeEventListener(Event.CHANGE, this._onLightChangeDelegate); - - this._pLightPicker = value; - - if (this._pLightPicker) - this._pLightPicker.addEventListener(Event.CHANGE, this._onLightChangeDelegate); - - this._pInvalidateScreenPasses(); - } - - /** - * Indicates whether or not any used textures should use mipmapping. Defaults to true. - */ - public get mipmap():boolean - { - return this._mipmap; - } - - public set mipmap(value:boolean) - { - if (this._mipmap == value) - return; - - this._mipmap = value; - - this._pInvalidatePasses(); - } - - /** - * Indicates whether or not any used textures should use smoothing. - */ - public get smooth():boolean - { - return this._smooth; - } - - public set smooth(value:boolean) - { - if (this._smooth == value) - return; - - this._smooth = value; - - this._pInvalidatePasses(); - } - - /** - * Indicates whether or not any used textures should be tiled. If set to false, texture samples are clamped to - * the texture's borders when the uv coordinates are outside the [0, 1] interval. - */ - public get repeat():boolean - { - return this._repeat; - } - - public set repeat(value:boolean) - { - if (this._repeat == value) - return; - - this._repeat = value; - - this._pInvalidatePasses(); - } - - /** - * The diffuse reflectivity color of the surface. - */ - public get color():number - { - return this._color; - } - - public set color(value:number) - { - if (this._color == value) - return; - - this._color = value; - - this._pInvalidatePasses(); - } - - /** - * The texture object to use for the albedo colour. - */ - public get texture():Texture2DBase - { - return this._pTexture; - } - - public set texture(value:Texture2DBase) - { - if (this._pTexture == value) - return; - - this._pTexture = value; - - this._pInvalidatePasses(); - } - - /** - * Specifies whether or not the UV coordinates should be animated using a transformation matrix. - */ - public get animateUVs():boolean - { - return this._pAnimateUVs; - } - - public set animateUVs(value:boolean) - { - if (this._pAnimateUVs == value) - return; - - this._pAnimateUVs = value; - - this._pInvalidatePasses(); - } - - /** - * Whether or not to use fallOff and radius properties for lights. This can be used to improve performance and - * compatibility for constrained mode. - */ - public get enableLightFallOff():boolean - { - return this._enableLightFallOff; - } - - public set enableLightFallOff(value:boolean) - { - if (this._enableLightFallOff == value) - return; - - this._enableLightFallOff = value; - - this._pInvalidatePasses(); - } - - /** - * Define which light source types to use for diffuse reflections. This allows choosing between regular lights - * and/or light probes for diffuse reflections. - * - * @see away3d.materials.LightSources - */ - public get diffuseLightSources():number - { - return this._diffuseLightSources; - } - - public set diffuseLightSources(value:number) - { - if (this._diffuseLightSources == value) - return; - - this._diffuseLightSources = value; - - this._pInvalidatePasses(); - } - - /** - * Define which light source types to use for specular reflections. This allows choosing between regular lights - * and/or light probes for specular reflections. - * - * @see away3d.materials.LightSources - */ - public get specularLightSources():number - { - return this._specularLightSources; - } - - public set specularLightSources(value:number) - { - if (this._specularLightSources == value) - return; - - this._specularLightSources = value; - - this._pInvalidatePasses(); - } - - /** - * Cleans up resources owned by the material, including passes. Textures are not owned by the material since they - * could be used by other materials and will not be disposed. - */ - public dispose() - { - var i:number; - var len:number; - - this._pClearScreenPasses(); - - len = this._materialData.length; - for (i = 0; i < len; i++) - this._materialData[i].dispose(); - - this._materialData = new Array(); - - len = this._materialPassData.length; - for (i = 0; i < len; i++) - this._materialPassData[i].dispose(); - - this._materialPassData = new Array(); - } - - /** - * Defines whether or not the material should cull triangles facing away from the camera. - */ - public get bothSides():boolean - { - return this._bothSides; - } - - public set bothSides(value:boolean) - { - if (this._bothSides = value) - return; - - this._bothSides = value; - - this._pInvalidatePasses(); - } - - /** - * The blend mode to use when drawing this renderable. The following blend modes are supported: - *
    - *
  • BlendMode.NORMAL: No blending, unless the material inherently needs it
  • - *
  • BlendMode.LAYER: Force blending. This will draw the object the same as NORMAL, but without writing depth writes.
  • - *
  • BlendMode.MULTIPLY
  • - *
  • BlendMode.ADD
  • - *
  • BlendMode.ALPHA
  • - *
- */ - public get blendMode():string - { - return this._pBlendMode; - } - - public set blendMode(value:string) - { - if (this._pBlendMode == value) - return; - - this._pBlendMode = value; - - this._pInvalidatePasses(); - } - - /** - * Indicates whether visible textures (or other pixels) used by this material have - * already been premultiplied. Toggle this if you are seeing black halos around your - * blended alpha edges. - */ - public get alphaPremultiplied():boolean - { - return this._alphaPremultiplied; - } - - public set alphaPremultiplied(value:boolean) - { - if (this._alphaPremultiplied == value) - return; - - this._alphaPremultiplied = value; - - this._pInvalidatePasses(); - } - - /** - * The minimum alpha value for which pixels should be drawn. This is used for transparency that is either - * invisible or entirely opaque, often used with textures for foliage, etc. - * Recommended values are 0 to disable alpha, or 0.5 to create smooth edges. Default value is 0 (disabled). - */ - public get alphaThreshold():number - { - return this._pAlphaThreshold; - } - - public set alphaThreshold(value:number) - { - if (value < 0) - value = 0; - else if (value > 1) - value = 1; - - if (this._pAlphaThreshold == value) - return; - - this._pAlphaThreshold = value; - - this._pInvalidatePasses(); - } - - /** - * Indicates whether or not the material requires alpha blending during rendering. - */ - public get requiresBlending():boolean - { - return this._pRequiresBlending; - } - - /** - * - */ - public get width():number - { - return this._pWidth; - } - - /** - * Sets the render state for a pass that is independent of the rendered object. This needs to be called before - * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. - * @param pass The pass data to activate. - * @param stage The Stage object which is currently used for rendering. - * @param camera The camera from which the scene is viewed. - * @private - */ - public _iActivatePass(pass:IMaterialPassData, stage:Stage, camera:Camera) // ARCANE - { - pass.materialPass._iActivate(pass, stage, camera); - } - - /** - * Clears the render state for a pass. This needs to be called before activating another pass. - * @param pass The pass to deactivate. - * @param stage The Stage used for rendering - * - * @internal - */ - public _iDeactivatePass(pass:IMaterialPassData, stage:Stage) // ARCANE - { - pass.materialPass._iDeactivate(pass, stage); - } - - /** - * Renders the current pass. Before calling renderPass, activatePass needs to be called with the same index. - * @param pass The pass used to render the renderable. - * @param renderable The IRenderable object to draw. - * @param stage The Stage object used for rendering. - * @param entityCollector The EntityCollector object that contains the visible scene data. - * @param viewProjection The view-projection matrix used to project to the screen. This is not the same as - * camera.viewProjection as it includes the scaling factors when rendering to textures. - * - * @internal - */ - public _iRenderPass(pass:IMaterialPassData, renderable:IRenderable, stage:Stage, camera:Camera, viewProjection:Matrix3D) - { - if (this._pLightPicker) - this._pLightPicker.collectLights(renderable); - - pass.materialPass._iRender(pass, renderable, stage, camera, viewProjection); - } - - // - // MATERIAL MANAGEMENT - // - /** - * Mark an IMaterialOwner as owner of this material. - * Assures we're not using the same material across renderables with different animations, since the - * Programs depend on animation. This method needs to be called when a material is assigned. - * - * @param owner The IMaterialOwner that had this material assigned - * - * @internal - */ - public iAddOwner(owner:IMaterialOwner) - { - this._owners.push(owner); - - var animationSet:IAnimationSet; - var animator:IAnimator = owner.animator; - - if (animator) - animationSet = animator.animationSet; - - if (owner.animator) { - if (this._animationSet && animationSet != this._animationSet) { - throw new Error("A Material instance cannot be shared across material owners with different animation sets"); - } else { - if (this._animationSet != animationSet) { - - this._animationSet = animationSet; - - this.invalidateAnimation(); - } - } - } - } - - /** - * Removes an IMaterialOwner as owner. - * @param owner - * - * @internal - */ - public iRemoveOwner(owner:IMaterialOwner) - { - this._owners.splice(this._owners.indexOf(owner), 1); - - if (this._owners.length == 0) { - this._animationSet = null; - - this.invalidateAnimation(); - } - } - - /** - * A list of the IMaterialOwners that use this material - * - * @private - */ - public get iOwners():Array - { - return this._owners; - } - - /** - * The amount of passes used by the material. - * - * @private - */ - public _iNumScreenPasses():number - { - return this._numPasses; - } - - /** - * A list of the screen passes used in this material - * - * @private - */ - public get _iScreenPasses():Array - { - return this._passes; - } - - /** - * Marks the shader programs for all passes as invalid, so they will be recompiled before the next use. - * - * @private - */ - public _pInvalidatePasses() - { - var len:number = this._materialPassData.length; - for (var i:number = 0; i < len; i++) - this._materialPassData[i].invalidate(); - - this.invalidateMaterial(); - } - - /** - * Flags that the screen passes have become invalid and need possible re-ordering / adding / deleting - */ - public _pInvalidateScreenPasses() - { - this._pScreenPassesInvalid = true; - } - - /** - * Removes a pass from the material. - * @param pass The pass to be removed. - */ - public _pRemoveScreenPass(pass:IMaterialPass) - { - pass.removeEventListener(Event.CHANGE, this._onPassChangeDelegate); - this._passes.splice(this._passes.indexOf(pass), 1); - - this._numPasses--; - } - - /** - * Removes all passes from the material - */ - public _pClearScreenPasses() - { - for (var i:number = 0; i < this._numPasses; ++i) - this._passes[i].removeEventListener(Event.CHANGE, this._onPassChangeDelegate); - - this._passes.length = this._numPasses = 0; - } - - /** - * Adds a pass to the material - * @param pass - */ - public _pAddScreenPass(pass:IMaterialPass) - { - this._passes[this._numPasses++] = pass; - - pass.lightPicker = this._pLightPicker; - pass.addEventListener(Event.CHANGE, this._onPassChangeDelegate); - - this.invalidateMaterial(); - } - - public _iAddMaterialData(materialData:IMaterialData):IMaterialData - { - this._materialData.push(materialData); - - return materialData; - } - - public _iRemoveMaterialData(materialData:IMaterialData):IMaterialData - { - this._materialData.splice(this._materialData.indexOf(materialData), 1); - - return materialData; - } - - /** - * Performs any processing that needs to occur before any of its passes are used. - * - * @private - */ - public _iUpdateMaterial() - { - } - - /** - * Listener for when a pass's shader code changes. It recalculates the render order id. - */ - private onPassChange(event:Event) - { - this.invalidateMaterial(); - } - - private invalidateAnimation() - { - var len:number = this._materialData.length; - for (var i:number = 0; i < len; i++) - this._materialData[i].invalidateAnimation(); - } - - private invalidateMaterial() - { - var len:number = this._materialData.length; - for (var i:number = 0; i < len; i++) - this._materialData[i].invalidateMaterial(); - } - - /** - * Called when the light picker's configuration changed. - */ - private onLightsChange(event:Event) - { - this._pInvalidateScreenPasses(); - } - - - public _iAddMaterialPassData(materialPassData:IMaterialPassData):IMaterialPassData - { - this._materialPassData.push(materialPassData); - - return materialPassData; - } - - public _iRemoveMaterialPassData(materialPassData:IMaterialPassData):IMaterialPassData - { - this._materialPassData.splice(this._materialPassData.indexOf(materialPassData), 1); - - return materialPassData; - } - } -} \ No newline at end of file diff --git a/src/away/materials/lightpickers/LightPickerBase.ts b/src/away/materials/lightpickers/LightPickerBase.ts deleted file mode 100644 index 9298d620..00000000 --- a/src/away/materials/lightpickers/LightPickerBase.ts +++ /dev/null @@ -1,201 +0,0 @@ -/// - -module away.materials -{ - import LightBase = away.base.LightBase; - import AssetType = away.library.AssetType; - import DirectionalLight = away.entities.DirectionalLight; - import PointLight = away.entities.PointLight; - import LightProbe = away.entities.LightProbe; - import IRenderable = away.pool.IRenderable; - import ICollector = away.traverse.ICollector; - - /** - * LightPickerBase provides an abstract base clase for light picker classes. These classes are responsible for - * feeding materials with relevant lights. Usually, StaticLightPicker can be used, but LightPickerBase can be - * extended to provide more application-specific dynamic selection of lights. - * - * @see StaticLightPicker - */ - export class LightPickerBase extends away.library.NamedAssetBase implements away.library.IAsset - { - public _pNumPointLights:number = 0; - public _pNumDirectionalLights:number = 0; - public _pNumCastingPointLights:number = 0; - public _pNumCastingDirectionalLights:number = 0; - public _pNumLightProbes:number = 0; - - public _pAllPickedLights:Array; - public _pPointLights:Array; - public _pCastingPointLights:Array; - public _pDirectionalLights:Array; - public _pCastingDirectionalLights:Array; - public _pLightProbes:Array; - public _pLightProbeWeights:Array; - - /** - * Creates a new LightPickerBase object. - */ - constructor() - { - super(); - } - - /** - * Disposes resources used by the light picker. - */ - public dispose() - { - } - - /** - * @inheritDoc - */ - public get assetType():string - { - return AssetType.LIGHT_PICKER; - } - - /** - * The maximum amount of directional lights that will be provided. - */ - public get numDirectionalLights():number - { - return this._pNumDirectionalLights; - } - - /** - * The maximum amount of point lights that will be provided. - */ - public get numPointLights():number - { - return this._pNumPointLights; - } - - /** - * The maximum amount of directional lights that cast shadows. - */ - public get numCastingDirectionalLights():number - { - return this._pNumCastingDirectionalLights; - } - - /** - * The amount of point lights that cast shadows. - */ - public get numCastingPointLights():number - { - return this._pNumCastingPointLights; - } - - /** - * The maximum amount of light probes that will be provided. - */ - public get numLightProbes():number - { - return this._pNumLightProbes; - } - - /** - * The collected point lights to be used for shading. - */ - public get pointLights():Array - { - return this._pPointLights; - } - - /** - * The collected directional lights to be used for shading. - */ - public get directionalLights():Array - { - return this._pDirectionalLights; - } - - /** - * The collected point lights that cast shadows to be used for shading. - */ - public get castingPointLights():Array - { - return this._pCastingPointLights; - } - - /** - * The collected directional lights that cast shadows to be used for shading. - */ - public get castingDirectionalLights():Array - { - return this._pCastingDirectionalLights; - } - - /** - * The collected light probes to be used for shading. - */ - public get lightProbes():Array - { - return this._pLightProbes; - } - - /** - * The weights for each light probe, defining their influence on the object. - */ - public get lightProbeWeights():Array - { - return this._pLightProbeWeights; - } - - /** - * A collection of all the collected lights. - */ - public get allPickedLights():Array - { - return this._pAllPickedLights; - } - - /** - * Updates set of lights for a given renderable and EntityCollector. Always call super.collectLights() after custom overridden code. - */ - public collectLights(renderable:IRenderable) - { - this.updateProbeWeights(renderable); - } - - /** - * Updates the weights for the light probes, based on the renderable's position relative to them. - * @param renderable The renderble for which to calculate the light probes' influence. - */ - private updateProbeWeights(renderable:IRenderable) - { - // todo: this will cause the same calculations to occur per TriangleSubMesh. See if this can be improved. - var objectPos:away.geom.Vector3D = renderable.sourceEntity.scenePosition; - var lightPos:away.geom.Vector3D; - - var rx:number = objectPos.x, ry:number = objectPos.y, rz:number = objectPos.z; - var dx:number, dy:number, dz:number; - var w:number, total:number = 0; - var i:number; - - // calculates weights for probes - for (i = 0; i < this._pNumLightProbes; ++i) { - - lightPos = this._pLightProbes[i].scenePosition; - dx = rx - lightPos.x; - dy = ry - lightPos.y; - dz = rz - lightPos.z; - // weight is inversely proportional to square of distance - w = dx*dx + dy*dy + dz*dz; - - // just... huge if at the same spot - w = w > .00001? 1/w : 50000000; - this._pLightProbeWeights[i] = w; - total += w; - } - - // normalize - total = 1/total; - - for (i = 0; i < this._pNumLightProbes; ++i) - this._pLightProbeWeights[i] *= total; - } - } -} diff --git a/src/away/materials/lightpickers/StaticLightPicker.ts b/src/away/materials/lightpickers/StaticLightPicker.ts deleted file mode 100644 index efa7941c..00000000 --- a/src/away/materials/lightpickers/StaticLightPicker.ts +++ /dev/null @@ -1,176 +0,0 @@ -/// - -module away.materials -{ - import LightBase = away.base.LightBase; - import DirectionalLight = away.entities.DirectionalLight; - import LightProbe = away.entities.LightProbe; - import PointLight = away.entities.PointLight; - import Event = away.events.Event; - import LightEvent = away.events.LightEvent; - - /** - * StaticLightPicker is a light picker that provides a static set of lights. The lights can be reassigned, but - * if the configuration changes (number of directional lights, point lights, etc), a material recompilation may - * occur. - */ - export class StaticLightPicker extends LightPickerBase - { - private _lights:Array; - private _onCastShadowChangeDelegate:Function; - - /** - * Creates a new StaticLightPicker object. - * @param lights The lights to be used for shading. - */ - constructor(lights) - { - super(); - - this._onCastShadowChangeDelegate = (event:LightEvent) => this.onCastShadowChange(event); - - this.lights = lights; - } - - /** - * The lights used for shading. - */ - public get lights() - { - return this._lights; - } - - public set lights(value:Array) - { - var numPointLights:number = 0; - var numDirectionalLights:number = 0; - var numCastingPointLights:number = 0; - var numCastingDirectionalLights:number = 0; - var numLightProbes:number = 0; - var light:LightBase; - - if (this._lights) - this.clearListeners(); - - this._lights = value; - this._pAllPickedLights = value; - this._pPointLights = new Array(); - this._pCastingPointLights = new Array(); - this._pDirectionalLights = new Array(); - this._pCastingDirectionalLights = new Array(); - this._pLightProbes = new Array(); - - var len:number = value.length; - - for (var i:number = 0; i < len; ++i) { - light = value[i]; - light.addEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); - - if (light instanceof PointLight) { - if (light.castsShadows) - this._pCastingPointLights[numCastingPointLights++] = light; - else - this._pPointLights[numPointLights++] = light; - - } else if (light instanceof DirectionalLight) { - if (light.castsShadows) - this._pCastingDirectionalLights[numCastingDirectionalLights++] = light; - else - this._pDirectionalLights[numDirectionalLights++] = light; - - } else if (light instanceof LightProbe) { - this._pLightProbes[numLightProbes++] = light; - } - } - - if (this._pNumDirectionalLights == numDirectionalLights && this._pNumPointLights == numPointLights && this._pNumLightProbes == numLightProbes && this._pNumCastingPointLights == numCastingPointLights && this._pNumCastingDirectionalLights == numCastingDirectionalLights) - return; - - this._pNumDirectionalLights = numDirectionalLights; - this._pNumCastingDirectionalLights = numCastingDirectionalLights; - this._pNumPointLights = numPointLights; - this._pNumCastingPointLights = numCastingPointLights; - this._pNumLightProbes = numLightProbes; - - // MUST HAVE MULTIPLE OF 4 ELEMENTS! - this._pLightProbeWeights = new Array(Math.ceil(numLightProbes/4)*4); - - // notify material lights have changed - this.dispatchEvent(new Event(Event.CHANGE)); - - } - - /** - * Remove configuration change listeners on the lights. - */ - private clearListeners() - { - var len:number = this._lights.length; - for (var i:number = 0; i < len; ++i) - this._lights[i].removeEventListener(LightEvent.CASTS_SHADOW_CHANGE, this._onCastShadowChangeDelegate); - } - - /** - * Notifies the material of a configuration change. - */ - private onCastShadowChange(event:LightEvent) - { - // TODO: Assign to special caster collections, just append it to the lights in SinglePass - // But keep seperated in multipass - - var light:LightBase = event.target; - - if (light instanceof PointLight) - this.updatePointCasting( light); - else if (light instanceof DirectionalLight) - this.updateDirectionalCasting( light); - - this.dispatchEvent(new Event(Event.CHANGE)); - } - - /** - * Called when a directional light's shadow casting configuration changes. - */ - private updateDirectionalCasting(light:DirectionalLight) - { - var dl:DirectionalLight = light; - - if (light.castsShadows) { - --this._pNumDirectionalLights; - ++this._pNumCastingDirectionalLights; - - - this._pDirectionalLights.splice(this._pDirectionalLights.indexOf(dl), 1); - this._pCastingDirectionalLights.push(light); - - } else { - ++this._pNumDirectionalLights; - --this._pNumCastingDirectionalLights; - - this._pCastingDirectionalLights.splice(this._pCastingDirectionalLights.indexOf(dl), 1); - this._pDirectionalLights.push(light); - } - } - - /** - * Called when a point light's shadow casting configuration changes. - */ - private updatePointCasting(light:PointLight) - { - var pl:PointLight = light; - - if (light.castsShadows) { - --this._pNumPointLights; - ++this._pNumCastingPointLights; - this._pPointLights.splice(this._pPointLights.indexOf(pl), 1); - this._pCastingPointLights.push(light); - } else { - ++this._pNumPointLights; - --this._pNumCastingPointLights; - - this._pCastingPointLights.splice(this._pCastingPointLights.indexOf(pl), 1); - this._pPointLights.push(light); - } - } - } -} diff --git a/src/away/materials/passes/IMaterialPass.ts b/src/away/materials/passes/IMaterialPass.ts deleted file mode 100644 index 25ea23d7..00000000 --- a/src/away/materials/passes/IMaterialPass.ts +++ /dev/null @@ -1,64 +0,0 @@ -/// - -module away.materials -{ - import IAnimationSet = away.animators.IAnimationSet; - import IAnimator = away.animators.IAnimator; - import Stage = away.base.Stage; - import BlendMode = away.base.BlendMode; - import Camera = away.entities.Camera; - import AbstractMethodError = away.errors.AbstractMethodError; - import ArgumentError = away.errors.ArgumentError; - import Event = away.events.Event; - import Rectangle = away.geom.Rectangle; - import Matrix3D = away.geom.Matrix3D; - import LightPickerBase = away.materials.LightPickerBase; - import IMaterialPassData = away.pool.IMaterialPassData; - import IRenderable = away.pool.IRenderable; - import TextureProxyBase = away.textures.TextureProxyBase; - - /** - * MaterialPassBase provides an abstract base class for material shader passes. A material pass constitutes at least - * a render call per required renderable. - */ - export interface IMaterialPass extends away.events.IEventDispatcher - { - /** - * Cleans up any resources used by the current object. - * @param deep Indicates whether other resources should be cleaned up, that could potentially be shared across different instances. - */ - dispose(); - - /** - * Renders an object to the current render target. - * - * @private - */ - _iRender(pass:IMaterialPassData, renderable:IRenderable, stage:Stage, camera:Camera, viewProjection:Matrix3D); - - /** - * Sets the render state for the pass that is independent of the rendered object. This needs to be called before - * calling renderPass. Before activating a pass, the previously used pass needs to be deactivated. - * @param stage The Stage object which is currently used for rendering. - * @param camera The camera from which the scene is viewed. - * @private - */ - _iActivate(pass:IMaterialPassData, stage:Stage, camera:Camera); - - /** - * Clears the render state for the pass. This needs to be called before activating another pass. - * @param stage The Stage used for rendering - * - * @private - */ - _iDeactivate(pass:IMaterialPassData, stage:Stage); - - /** - * The light picker used by the material to provide lights to the material if it supports lighting. - * - * @see away.materials.LightPickerBase - * @see away.materials.StaticLightPicker - */ - lightPicker:LightPickerBase; - } -} \ No newline at end of file diff --git a/src/away/materials/shadowmappers/CascadeShadowMapper.ts b/src/away/materials/shadowmappers/CascadeShadowMapper.ts deleted file mode 100644 index fc3cd35a..00000000 --- a/src/away/materials/shadowmappers/CascadeShadowMapper.ts +++ /dev/null @@ -1,274 +0,0 @@ - - -module away.materials -{ - import Scene = away.containers.Scene; - import Camera = away.entities.Camera; - import Event = away.events.Event; - import EventDispatcher = away.events.EventDispatcher; - import IEventDispatcher = away.events.IEventDispatcher; - import Matrix3D = away.geom.Matrix3D; - import Matrix3DUtils = away.geom.Matrix3DUtils; - import Rectangle = away.geom.Rectangle; - import FreeMatrixProjection = away.projections.FreeMatrixProjection; - import IProjection = away.projections.IProjection; - import IRenderer = away.render.IRenderer; - import TextureProxyBase = away.textures.TextureProxyBase; - - export class CascadeShadowMapper extends DirectionalShadowMapper implements away.events.IEventDispatcher - { - public _pScissorRects:Rectangle[]; - private _pScissorRectsInvalid:boolean = true; - private _splitRatios:number[]; - - private _numCascades:number /*int*/; - private _depthCameras:Array; - private _depthLenses:Array; - - private _texOffsetsX:Array; - private _texOffsetsY:Array; - - private _changeDispatcher:EventDispatcher; - private _nearPlaneDistances:number[]; - - constructor(numCascades:number /*uint*/ = 3) - { - super(); - - if (numCascades < 1 || numCascades > 4) - throw new Error("numCascades must be an integer between 1 and 4"); - - this._numCascades = numCascades; - this._changeDispatcher = new EventDispatcher(this); - this.init(); - } - - public getSplitRatio(index:number /*uint*/):number - { - return this._splitRatios[index]; - } - - public setSplitRatio(index:number /*uint*/, value:number) - { - if (value < 0) - value = 0; - else if (value > 1) - value = 1; - - if (index >= this._numCascades) - throw new Error("index must be smaller than the number of cascades!"); - - this._splitRatios[index] = value; - } - - public getDepthProjections(partition:number /*uint*/):Matrix3D - { - return this._depthCameras[partition].viewProjection; - } - - private init() - { - this._splitRatios = new Array(this._numCascades); - this._nearPlaneDistances = new Array(this._numCascades); - - var s:number = 1; - for (var i:number /*int*/ = this._numCascades - 1; i >= 0; --i) { - this._splitRatios[i] = s; - s *= .4; - } - - this._texOffsetsX = Array(-1, 1, -1, 1); - this._texOffsetsY = Array(1, 1, -1, -1); - this._pScissorRects = new Array(4); - this._depthLenses = new Array(); - this._depthCameras = new Array(); - - for (i = 0; i < this._numCascades; ++i) { - this._depthLenses[i] = new FreeMatrixProjection(); - this._depthCameras[i] = new Camera(this._depthLenses[i]); - } - } - - public _pSetDepthMapSize(value:number /*uint*/) - { - super._pSetDepthMapSize(value); - - this.invalidateScissorRects(); - } - - private invalidateScissorRects() - { - this._pScissorRectsInvalid = true; - } - - public get numCascades():number /*int*/ - { - return this._numCascades; - } - - public set numCascades(value:number /*int*/) - { - if (value == this._numCascades) - return; - - if (value < 1 || value > 4) - throw new Error("numCascades must be an integer between 1 and 4"); - - this._numCascades = value; - this.invalidateScissorRects(); - this.init(); - this.dispatchEvent(new Event(Event.CHANGE)); - } - - public pDrawDepthMap(target:away.textures.RenderTexture, scene:Scene, renderer:IRenderer) - { - if (this._pScissorRectsInvalid) - this.updateScissorRects(); - - this._pCasterCollector.cullPlanes = this._pCullPlanes; - this._pCasterCollector.camera = this._pOverallDepthCamera; - this._pCasterCollector.clear(); - scene.traversePartitions(this._pCasterCollector); - - renderer._iRenderCascades(this._pCasterCollector, target, this._numCascades, this._pScissorRects, this._depthCameras); - } - - private updateScissorRects() - { - var half:number = this._pDepthMapSize*.5; - - this._pScissorRects[0] = new Rectangle(0, 0, half, half); - this._pScissorRects[1] = new Rectangle(half, 0, half, half); - this._pScissorRects[2] = new Rectangle(0, half, half, half); - this._pScissorRects[3] = new Rectangle(half, half, half, half); - - this._pScissorRectsInvalid = false; - } - - public pUpdateDepthProjection(viewCamera:Camera) - { - var matrix:Matrix3D; - var projection:IProjection = viewCamera.projection; - var projectionNear:number = projection.near; - var projectionRange:number = projection.far - projectionNear; - - this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); - this._pMatrix.appendScale(.96, .96, 1); - this._pOverallDepthProjection.matrix = this._pMatrix; - this.pUpdateCullPlanes(viewCamera); - - for (var i:number /*int*/ = 0; i < this._numCascades; ++i) { - matrix = this._depthLenses[i].matrix; - - this._nearPlaneDistances[i] = projectionNear + this._splitRatios[i]*projectionRange; - this._depthCameras[i].transform = this._pOverallDepthCamera.transform; - - this.updateProjectionPartition(matrix, this._splitRatios[i], this._texOffsetsX[i], this._texOffsetsY[i]); - - this._depthLenses[i].matrix = matrix; - } - } - - private updateProjectionPartition(matrix:Matrix3D, splitRatio:number, texOffsetX:number, texOffsetY:number) - { - var raw:Array = Matrix3DUtils.RAW_DATA_CONTAINER; - var xN:number, yN:number, zN:number; - var xF:number, yF:number, zF:number; - var minX:number = Number.POSITIVE_INFINITY, minY:number = Number.POSITIVE_INFINITY, minZ:number; - var maxX:number = Number.NEGATIVE_INFINITY, maxY:number = Number.NEGATIVE_INFINITY, maxZ:number = Number.NEGATIVE_INFINITY; - var i:number /*uint*/ = 0; - - while (i < 12) { - xN = this._pLocalFrustum[i]; - yN = this._pLocalFrustum[i + 1]; - zN = this._pLocalFrustum[i + 2]; - xF = xN + (this._pLocalFrustum[i + 12] - xN)*splitRatio; - yF = yN + (this._pLocalFrustum[i + 13] - yN)*splitRatio; - zF = zN + (this._pLocalFrustum[i + 14] - zN)*splitRatio; - if (xN < minX) - minX = xN; - if (xN > maxX) - maxX = xN; - if (yN < minY) - minY = yN; - if (yN > maxY) - maxY = yN; - if (zN > maxZ) - maxZ = zN; - if (xF < minX) - minX = xF; - if (xF > maxX) - maxX = xF; - if (yF < minY) - minY = yF; - if (yF > maxY) - maxY = yF; - if (zF > maxZ) - maxZ = zF; - i += 3; - } - - minZ = 1; - - var w:number = (maxX - minX); - var h:number = (maxY - minY); - var d:number = 1/(maxZ - minZ); - - if (minX < 0) - minX -= this._pSnap; // because int() rounds up for < 0 - if (minY < 0) - minY -= this._pSnap; - minX = Math.floor(minX/this._pSnap)*this._pSnap; - minY = Math.floor(minY/this._pSnap)*this._pSnap; - - var snap2:number = 2*this._pSnap; - w = Math.floor(w/snap2 + 1)*snap2; - h = Math.floor(h/snap2 + 1)*snap2; - - maxX = minX + w; - maxY = minY + h; - - w = 1/w; - h = 1/h; - - raw[0] = 2*w; - raw[5] = 2*h; - raw[10] = d; - raw[12] = -(maxX + minX)*w; - raw[13] = -(maxY + minY)*h; - raw[14] = -minZ*d; - raw[15] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - - matrix.copyRawDataFrom(raw); - matrix.appendScale(.96, .96, 1); - matrix.appendTranslation(texOffsetX, texOffsetY, 0); - matrix.appendScale(.5, .5, 1); - } - - public addEventListener(type:string, listener:Function) - { - this._changeDispatcher.addEventListener(type, listener); - } - - public removeEventListener(type:string, listener:Function) - { - this._changeDispatcher.removeEventListener(type, listener); - } - - public dispatchEvent(event:Event) - { - return this._changeDispatcher.dispatchEvent(event); - } - - public hasEventListener(type:string):boolean - { - return this._changeDispatcher.hasEventListener(type); - } - - get _iNearPlaneDistances():Array - { - return this._nearPlaneDistances; - } - } -} \ No newline at end of file diff --git a/src/away/materials/shadowmappers/CubeMapShadowMapper.ts b/src/away/materials/shadowmappers/CubeMapShadowMapper.ts deleted file mode 100644 index 7d29547e..00000000 --- a/src/away/materials/shadowmappers/CubeMapShadowMapper.ts +++ /dev/null @@ -1,95 +0,0 @@ -/// - -module away.materials -{ - import Scene = away.containers.Scene; - import Camera = away.entities.Camera; - import PointLight = away.entities.PointLight; - import PerspectiveProjection = away.projections.PerspectiveProjection; - import RenderTexture = away.textures.RenderTexture; - import TextureProxyBase = away.textures.TextureProxyBase; - import IRenderer = away.render.IRenderer; - - - export class CubeMapShadowMapper extends ShadowMapperBase - { - private _depthCameras:Array; - private _projections:Array; - private _needsRender:Array; - - constructor() - { - super(); - - this._pDepthMapSize = 512; - this._needsRender = new Array(); - this.initCameras(); - } - - private initCameras() - { - this._depthCameras = new Array(); - this._projections = new Array(); - - // posX, negX, posY, negY, posZ, negZ - this.addCamera(0, 90, 0); - this.addCamera(0, -90, 0); - this.addCamera(-90, 0, 0); - this.addCamera(90, 0, 0); - this.addCamera(0, 0, 0); - this.addCamera(0, 180, 0); - } - - private addCamera(rotationX:number, rotationY:number, rotationZ:number) - { - var cam:Camera = new Camera(); - cam.rotationX = rotationX; - cam.rotationY = rotationY; - cam.rotationZ = rotationZ; - cam.projection.near = .01; - - var projection:PerspectiveProjection = cam.projection; - projection.fieldOfView = 90; - this._projections.push(projection); - cam.projection._iAspectRatio = 1; - this._depthCameras.push(cam); - } - - //@override - public pCreateDepthTexture():TextureProxyBase - { - throw new away.errors.PartialImplementationError(); - /* - return new RenderCubeTexture( this._depthMapSize ); - */ - } - - //@override - public pUpdateDepthProjection(viewCamera:Camera) - { - var light:PointLight = (this._pLight); - var maxDistance:number = light._pFallOff; - var pos:away.geom.Vector3D = this._pLight.scenePosition; - - // todo: faces outside frustum which are pointing away from camera need not be rendered! - for (var i:number = 0; i < 6; ++i) { - this._projections[i].far = maxDistance; - this._depthCameras[i].transform.position = pos; - this._needsRender[i] = true; - } - } - - //@override - public pDrawDepthMap(target:RenderTexture, scene:Scene, renderer:IRenderer) - { - for (var i:number = 0; i < 6; ++i) { - if (this._needsRender[i]) { - this._pCasterCollector.camera = this._depthCameras[i]; - this._pCasterCollector.clear(); - scene.traversePartitions(this._pCasterCollector); - renderer._iRender(this._pCasterCollector, target, null, i) - } - } - } - } -} \ No newline at end of file diff --git a/src/away/materials/shadowmappers/DirectionalShadowMapper.ts b/src/away/materials/shadowmappers/DirectionalShadowMapper.ts deleted file mode 100644 index 95ee6a8f..00000000 --- a/src/away/materials/shadowmappers/DirectionalShadowMapper.ts +++ /dev/null @@ -1,198 +0,0 @@ -/// - -module away.materials -{ - import Scene = away.containers.Scene; - import Camera = away.entities.Camera; - import DirectionalLight = away.entities.DirectionalLight; - import Matrix3D = away.geom.Matrix3D; - import Plane3D = away.geom.Plane3D; - import Vector3D = away.geom.Vector3D; - import FreeMatrixProjection = away.projections.FreeMatrixProjection; - import IRenderer = away.render.IRenderer; - import RenderTexture = away.textures.RenderTexture; - import TextureProxyBase = away.textures.TextureProxyBase; - - export class DirectionalShadowMapper extends ShadowMapperBase - { - public _pOverallDepthCamera:Camera; - public _pLocalFrustum:Array; - - public _pLightOffset:number = 10000; - public _pMatrix:Matrix3D; - public _pOverallDepthProjection:FreeMatrixProjection; - public _pSnap:number = 64; - - public _pCullPlanes:Array; - public _pMinZ:number; - public _pMaxZ:number; - - constructor() - { - super(); - - this._pCullPlanes = []; - this._pOverallDepthProjection = new FreeMatrixProjection(); - this._pOverallDepthCamera = new Camera(this._pOverallDepthProjection); - this._pLocalFrustum = []; - this._pMatrix = new Matrix3D(); - } - - public get snap():number - { - return this._pSnap; - } - - public set snap(value:number) - { - this._pSnap = value; - } - - public get lightOffset():number - { - return this._pLightOffset; - } - - public set lightOffset(value:number) - { - this._pLightOffset = value; - } - - //@arcane - public get iDepthProjection():Matrix3D - { - return this._pOverallDepthCamera.viewProjection; - } - - //@arcane - public get depth():number - { - return this._pMaxZ - this._pMinZ; - } - - //@override - public pDrawDepthMap(target:TextureProxyBase, scene:Scene, renderer:IRenderer) - { - this._pCasterCollector.camera = this._pOverallDepthCamera; - this._pCasterCollector.cullPlanes = this._pCullPlanes; - this._pCasterCollector.clear(); - scene.traversePartitions(this._pCasterCollector); - renderer._iRender(this._pCasterCollector, target); - } - - //@protected - public pUpdateCullPlanes(viewCamera:Camera) - { - var lightFrustumPlanes:Array = this._pOverallDepthCamera.frustumPlanes; - var viewFrustumPlanes:Array = viewCamera.frustumPlanes; - this._pCullPlanes.length = 4; - - this._pCullPlanes[0] = lightFrustumPlanes[0]; - this._pCullPlanes[1] = lightFrustumPlanes[1]; - this._pCullPlanes[2] = lightFrustumPlanes[2]; - this._pCullPlanes[3] = lightFrustumPlanes[3]; - - var light:DirectionalLight = this._pLight; - var dir:Vector3D = light.sceneDirection; - var dirX:number = dir.x; - var dirY:number = dir.y; - var dirZ:number = dir.z; - var j:number = 4; - for (var i:number = 0; i < 6; ++i) { - var plane:Plane3D = viewFrustumPlanes[i]; - if (plane.a*dirX + plane.b*dirY + plane.c*dirZ < 0) - this._pCullPlanes[j++] = plane; - } - } - - //@override - public pUpdateDepthProjection(viewCamera:Camera) - { - this.pUpdateProjectionFromFrustumCorners(viewCamera, viewCamera.projection.frustumCorners, this._pMatrix); - this._pOverallDepthProjection.matrix = this._pMatrix; - this.pUpdateCullPlanes(viewCamera); - } - - public pUpdateProjectionFromFrustumCorners(viewCamera:Camera, corners:Array, matrix:Matrix3D) - { - var raw:Array = new Array(); - var dir:Vector3D; - var x:number, y:number, z:number; - var minX:number, minY:number; - var maxX:number, maxY:number; - var i:number; - - var light:DirectionalLight = this._pLight; - dir = light.sceneDirection; - this._pOverallDepthCamera.transform.matrix3D = this._pLight.sceneTransform; - x = Math.floor((viewCamera.x - dir.x*this._pLightOffset)/this._pSnap)*this._pSnap; - y = Math.floor((viewCamera.y - dir.y*this._pLightOffset)/this._pSnap)*this._pSnap; - z = Math.floor((viewCamera.z - dir.z*this._pLightOffset)/this._pSnap)*this._pSnap; - this._pOverallDepthCamera.x = x; - this._pOverallDepthCamera.y = y; - this._pOverallDepthCamera.z = z; - - this._pMatrix.copyFrom(this._pOverallDepthCamera.inverseSceneTransform); - this._pMatrix.prepend(viewCamera.sceneTransform); - this._pMatrix.transformVectors(corners, this._pLocalFrustum); - - minX = maxX = this._pLocalFrustum[0]; - minY = maxY = this._pLocalFrustum[1]; - this._pMaxZ = this._pLocalFrustum[2]; - - i = 3; - while (i < 24) { - x = this._pLocalFrustum[i]; - y = this._pLocalFrustum[i + 1]; - z = this._pLocalFrustum[i + 2]; - if (x < minX) - minX = x; - if (x > maxX) - maxX = x; - if (y < minY) - minY = y; - if (y > maxY) - maxY = y; - if (z > this._pMaxZ) - this._pMaxZ = z; - i += 3; - } - - this._pMinZ = 1; - - var w:number = maxX - minX; - var h:number = maxY - minY; - var d:number = 1/(this._pMaxZ - this._pMinZ); - - if (minX < 0) - minX -= this._pSnap; // because int() rounds up for < 0 - - if (minY < 0) - minY -= this._pSnap; - - minX = Math.floor(minX/this._pSnap)*this._pSnap; - minY = Math.floor(minY/this._pSnap)*this._pSnap; - - var snap2:number = 2*this._pSnap; - w = Math.floor(w/snap2 + 2)*snap2; - h = Math.floor(h/snap2 + 2)*snap2; - - maxX = minX + w; - maxY = minY + h; - - w = 1/w; - h = 1/h; - - raw[0] = 2*w; - raw[5] = 2*h; - raw[10] = d; - raw[12] = -(maxX + minX)*w; - raw[13] = -(maxY + minY)*h; - raw[14] = -this._pMinZ*d; - raw[15] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - - matrix.copyRawDataFrom(raw); - } - } -} \ No newline at end of file diff --git a/src/away/materials/shadowmappers/NearDirectionalShadowMapper.ts b/src/away/materials/shadowmappers/NearDirectionalShadowMapper.ts deleted file mode 100644 index 1b752cf0..00000000 --- a/src/away/materials/shadowmappers/NearDirectionalShadowMapper.ts +++ /dev/null @@ -1,49 +0,0 @@ -/// - -module away.materials -{ - import Camera = away.entities.Camera; - - export class NearDirectionalShadowMapper extends DirectionalShadowMapper - { - private _coverageRatio:number; - - constructor(coverageRatio:number = .5) - { - super(); - - this.coverageRatio = coverageRatio; - } - - /** - * A value between 0 and 1 to indicate the ratio of the view frustum that needs to be covered by the shadow map. - */ - public get coverageRatio():number - { - return this._coverageRatio; - } - - public set coverageRatio(value:number) - { - if (value > 1) - value = 1; else if (value < 0) - value = 0; - - this._coverageRatio = value; - } - - public pUpdateDepthProjection(viewCamera:Camera) - { - var corners:Array = viewCamera.projection.frustumCorners; - - for (var i:number /*int*/ = 0; i < 12; ++i) { - var v:number = corners[i]; - this._pLocalFrustum[i] = v; - this._pLocalFrustum[i + 12] = v + (corners[i + 12] - v)*this._coverageRatio; - } - - this.pUpdateProjectionFromFrustumCorners(viewCamera, this._pLocalFrustum, this._pMatrix); - this._pOverallDepthProjection.matrix = this._pMatrix; - } - } -} diff --git a/src/away/materials/shadowmappers/ShadowMapperBase.ts b/src/away/materials/shadowmappers/ShadowMapperBase.ts deleted file mode 100644 index 12a653a0..00000000 --- a/src/away/materials/shadowmappers/ShadowMapperBase.ts +++ /dev/null @@ -1,151 +0,0 @@ -/// - -module away.materials -{ - import LightBase = away.base.LightBase; - import Stage = away.base.Stage; - import Scene = away.containers.Scene; - import Camera = away.entities.Camera; - import AbstractMethodError = away.errors.AbstractMethodError; - import IRenderer = away.render.IRenderer; - import EntityCollector = away.traverse.EntityCollector; - import ShadowCasterCollector = away.traverse.ShadowCasterCollector; - import RenderTexture = away.textures.RenderTexture; - import TextureProxyBase = away.textures.TextureProxyBase; - - export class ShadowMapperBase - { - - public _pCasterCollector:ShadowCasterCollector; - - private _depthMap:TextureProxyBase; - public _pDepthMapSize:number = 2048; - public _pLight:LightBase; - private _explicitDepthMap:boolean; - private _autoUpdateShadows:boolean = true; - public _iShadowsInvalid:boolean; - - constructor() - { - this._pCasterCollector = this.pCreateCasterCollector(); - } - - public pCreateCasterCollector() - { - return new ShadowCasterCollector(); - } - - public get autoUpdateShadows():boolean - { - return this._autoUpdateShadows; - } - - public set autoUpdateShadows(value:boolean) - { - this._autoUpdateShadows = value; - } - - public updateShadows() - { - this._iShadowsInvalid = true; - } - - public iSetDepthMap(depthMap:TextureProxyBase) - { - if (this._depthMap == depthMap) - return; - - if (this._depthMap && !this._explicitDepthMap) - this._depthMap.dispose(); - - this._depthMap = depthMap; - - if (this._depthMap) { - this._explicitDepthMap = true; - this._pDepthMapSize = this._depthMap.size; - } else { - this._explicitDepthMap = false; - } - } - - public get light():LightBase - { - return this._pLight; - } - - public set light(value:LightBase) - { - this._pLight = value; - } - - public get depthMap():TextureProxyBase - { - if (!this._depthMap) - this._depthMap = this.pCreateDepthTexture(); - - return this._depthMap; - } - - public get depthMapSize():number - { - return this._pDepthMapSize; - } - - public set depthMapSize(value:number) - { - if (value == this._pDepthMapSize) - return; - - this._pSetDepthMapSize(value); - } - - public dispose() - { - this._pCasterCollector = null; - - if (this._depthMap && !this._explicitDepthMap) - this._depthMap.dispose(); - - this._depthMap = null; - } - - public pCreateDepthTexture():TextureProxyBase - { - return new RenderTexture(this._pDepthMapSize, this._pDepthMapSize); - } - - public iRenderDepthMap(stage:Stage, entityCollector:EntityCollector, renderer:IRenderer) - { - this._iShadowsInvalid = false; - - this.pUpdateDepthProjection(entityCollector.camera); - - if (!this._depthMap) - this._depthMap = this.pCreateDepthTexture(); - - this.pDrawDepthMap(this._depthMap, entityCollector.scene, renderer); - } - - public pUpdateDepthProjection(viewCamera:Camera) - { - throw new AbstractMethodError(); - } - - public pDrawDepthMap(target:TextureProxyBase, scene:Scene, renderer:IRenderer) - { - throw new AbstractMethodError(); - } - - public _pSetDepthMapSize(value) - { - this._pDepthMapSize = value; - - if (this._explicitDepthMap) { - throw Error("Cannot set depth map size for the current renderer."); - } else if (this._depthMap) { - this._depthMap.dispose(); - this._depthMap = null; - } - } - } -} \ No newline at end of file diff --git a/src/away/parsers/CubeTextureParser.ts b/src/away/parsers/CubeTextureParser.ts deleted file mode 100644 index 13c350e8..00000000 --- a/src/away/parsers/CubeTextureParser.ts +++ /dev/null @@ -1,159 +0,0 @@ -/// - -module away.parsers -{ - import ImageCubeTexture = away.textures.ImageCubeTexture; - import ImageTexture = away.textures.ImageTexture; - - /** - * CubeTextureParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - export class CubeTextureParser extends ParserBase - { - - private static posX:string = 'posX'; - private static negX:string = 'negX'; - private static posY:string = 'posY'; - private static negY:string = 'negY'; - private static posZ:string = 'posZ'; - private static negZ:string = 'negZ'; - - private _imgDependencyDictionary:Object; - - /** - * Creates a new CubeTextureParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - constructor() - { - super(away.net.URLLoaderDataFormat.TEXT); - } - - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - - public static supportsType(extension:string):boolean - { - - extension = extension.toLowerCase(); - return extension == "cube"; - - } - - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - public static supportsData(data:any):boolean - { - try { - var obj = JSON.parse(data); - - if (obj) { - return true; - } - return false; - } catch (e) { - return false; - } - - return false; - } - - /** - * @inheritDoc - */ - public _iResolveDependency(resourceDependency:ResourceDependency):void - { - - } - - /** - * @inheritDoc - */ - public _iResolveDependencyFailure(resourceDependency:ResourceDependency):void - { - - } - - /** - * @inheritDoc - */ - public _pProceedParsing():boolean - { - if (this._imgDependencyDictionary != null) { //all images loaded - var asset:ImageCubeTexture = new ImageCubeTexture( - - this._getHTMLImageElement(CubeTextureParser.posX), this._getHTMLImageElement(CubeTextureParser.negX), this._getHTMLImageElement(CubeTextureParser.posY), this._getHTMLImageElement(CubeTextureParser.negY), this._getHTMLImageElement(CubeTextureParser.posZ), this._getHTMLImageElement(CubeTextureParser.negZ)); - - //clear dictionary - this._imgDependencyDictionary = null; - - asset.name = this._iFileName; - - this._pFinalizeAsset( asset, this._iFileName); - - return ParserBase.PARSING_DONE; - } - - try { - var json:any = JSON.parse(this.data); - var data:Array = > json.data; - var rec:any; - - if (data.length != 6) - this._pDieWithError('CubeTextureParser: Error - cube texture should have exactly 6 images'); - - if (json) { - this._imgDependencyDictionary = new Object(); - - for (var c:number = 0; c < data.length; c++) { - rec = data[c]; - this._imgDependencyDictionary[rec.id] = this._pAddDependency(rec.id, new away.net.URLRequest(rec.image.toString())); - } - - if (!this._validateCubeData()) { - - this._pDieWithError("CubeTextureParser: JSON data error - cubes require id of: \n" + CubeTextureParser.posX + ', ' + CubeTextureParser.negX + ', \n' + CubeTextureParser.posY + ', ' + CubeTextureParser.negY + ', \n' + CubeTextureParser.posZ + ', ' + CubeTextureParser.negZ); - - return ParserBase.PARSING_DONE; - - } - - this._pPauseAndRetrieveDependencies(); - - return ParserBase.MORE_TO_PARSE; - } - } catch (e) { - this._pDieWithError('CubeTexturePaser Error parsing JSON'); - } - - return ParserBase.PARSING_DONE; - - } - - private _validateCubeData():boolean - { - return ( this._imgDependencyDictionary[ CubeTextureParser.posX ] != null && this._imgDependencyDictionary[ CubeTextureParser.negX ] != null && this._imgDependencyDictionary[ CubeTextureParser.posY ] != null && this._imgDependencyDictionary[ CubeTextureParser.negY ] != null && this._imgDependencyDictionary[ CubeTextureParser.posZ ] != null && this._imgDependencyDictionary[ CubeTextureParser.negZ ] != null ); - } - - private _getHTMLImageElement(name:string):HTMLImageElement - { - var dependency:ResourceDependency = this._imgDependencyDictionary[ name ]; - - if (dependency) { - return ( dependency.assets[0]).htmlImageElement; - } - - return null; - } - - } -} \ No newline at end of file diff --git a/src/away/parsers/ParserBase.ts b/src/away/parsers/ParserBase.ts deleted file mode 100644 index d5a9447a..00000000 --- a/src/away/parsers/ParserBase.ts +++ /dev/null @@ -1,357 +0,0 @@ -/// - -module away.parsers -{ - import BitmapData = away.base.BitmapData; - import DisplayObject = away.base.DisplayObject; - import AbstractMethodError = away.errors.AbstractMethodError; - import AssetEvent = away.events.AssetEvent; - import ParserEvent = away.events.ParserEvent; - import TimerEvent = away.events.TimerEvent; - import IAsset = away.library.IAsset; - import TextureUtils = away.utils.TextureUtils; - import Timer = away.utils.Timer; - import ByteArray = away.utils.ByteArray; - - /** - * ParserBase provides an abstract base class for objects that convert blocks of data to data structures - * supported by away. - * - * If used by AssetLoader to automatically determine the parser type, two public static methods should - * be implemented, with the following signatures: - * - * public static supportsType(extension : string) : boolean - * Indicates whether or not a given file extension is supported by the parser. - * - * public static supportsData(data : *) : boolean - * Tests whether a data block can be parsed by the parser. - * - * Furthermore, for any concrete subtype, the method initHandle should be overridden to immediately - * create the object that will contain the parsed data. This allows ResourceManager to return an object - * handle regardless of whether the object was loaded or not. - * - * @see away.net.AssetLoader - */ - export class ParserBase extends away.events.EventDispatcher - { - public _iFileName:string; - private _dataFormat:string; - private _data:any; - private _frameLimit:number; - private _lastFrameTime:number; - private _pOnIntervalDelegate:Function; - public _pContent:DisplayObject; - - //---------------------------------------------------------------------------------------------------------------------------------------------------------------- - // TODO: add error checking for the following ( could cause a problem if this function is not implemented ) - //---------------------------------------------------------------------------------------------------------------------------------------------------------------- - // Needs to be implemented in all Parsers ( - //public static supportsType(extension : string) : boolean - //* Indicates whether or not a given file extension is supported by the parser. - //---------------------------------------------------------------------------------------------------------------------------------------------------------------- - - public static supportsType(extension:string):boolean - { - throw new AbstractMethodError(); - } - - /* TODO: Implement ParserUtils; - public _pGetTextData():string - { - return ParserUtils.toString(_data); - } - - public _pGetByteData():ByteArray - { - return ParserUtils.toByteArray(_data); - } - */ - private _dependencies:Array; - private _parsingPaused:boolean; - private _parsingComplete:boolean; - private _parsingFailure:boolean; - private _timer:Timer; - private _materialMode:number; - - /** - * Returned by proceedParsing to indicate no more parsing is needed. - */ - public static PARSING_DONE:boolean = true; - /* Protected */ - - /** - * Returned by proceedParsing to indicate more parsing is needed, allowing asynchronous parsing. - */ - public static MORE_TO_PARSE:boolean = false; - /* Protected */ - - - public get content():DisplayObject - { - return this._pContent; - } - - /** - * Creates a new ParserBase object - * @param format The data format of the file data to be parsed. Can be either ParserDataFormat.BINARY or ParserDataFormat.PLAIN_TEXT, and should be provided by the concrete subtype. - * - * @see away.loading.parsers.ParserDataFormat - */ - constructor(format:string) - { - super(); - - this._materialMode = 0; - this._dataFormat = format; - this._dependencies = new Array(); - - this._pOnIntervalDelegate = away.utils.Delegate.create(this, this._pOnInterval); - } - - /** - * Validates a bitmapData loaded before assigning to a default BitmapMaterial - */ - - public isBitmapDataValid(bitmapData:BitmapData):boolean - { - var isValid:boolean = TextureUtils.isBitmapDataValid(bitmapData); - - if (!isValid) { - - console.log(">> Bitmap loaded is not having power of 2 dimensions or is higher than 2048"); - } - - return isValid; - } - - public set parsingFailure(b:boolean) - { - this._parsingFailure = b; - } - - public get parsingFailure():boolean - { - return this._parsingFailure; - } - - public get parsingPaused():boolean - { - return this._parsingPaused; - } - - public get parsingComplete():boolean - { - return this._parsingComplete; - } - - public set materialMode(newMaterialMode:number) - { - this._materialMode = newMaterialMode; - } - - public get materialMode():number - { - return this._materialMode; - } - - public get data():any - { - return this._data; - } - - /** - * The data format of the file data to be parsed. Options are URLLoaderDataFormat.BINARY, URLLoaderDataFormat.ARRAY_BUFFER, URLLoaderDataFormat.BLOB, URLLoaderDataFormat.VARIABLES or URLLoaderDataFormat.TEXT. - */ - public get dataFormat():string - { - return this._dataFormat; - } - - /** - * Parse data (possibly containing bytearry, plain text or BitmapAsset) asynchronously, meaning that - * the parser will periodically stop parsing so that the AVM may proceed to the - * next frame. - * - * @param data The untyped data object in which the loaded data resides. - * @param frameLimit number of milliseconds of parsing allowed per frame. The - * actual time spent on a frame can exceed this number since time-checks can - * only be performed between logical sections of the parsing procedure. - */ - public parseAsync(data:any, frameLimit:number = 30) - { - this._data = data; - this._pStartParsing(frameLimit); - } - - /** - * A list of dependencies that need to be loaded and resolved for the object being parsed. - */ - public get dependencies():ResourceDependency[] - { - return this._dependencies; - } - - /** - * Resolve a dependency when it's loaded. For example, a dependency containing an ImageResource would be assigned - * to a Mesh instance as a BitmapMaterial, a scene graph object would be added to its intended parent. The - * dependency should be a member of the dependencies property. - * - * @param resourceDependency The dependency to be resolved. - */ - public _iResolveDependency(resourceDependency:ResourceDependency) - { - throw new AbstractMethodError(); - } - - /** - * Resolve a dependency loading failure. Used by parser to eventually provide a default map - * - * @param resourceDependency The dependency to be resolved. - */ - public _iResolveDependencyFailure(resourceDependency:ResourceDependency) - { - throw new AbstractMethodError(); - } - - /** - * Resolve a dependency name - * - * @param resourceDependency The dependency to be resolved. - */ - public _iResolveDependencyName(resourceDependency:ResourceDependency, asset:IAsset):string - { - return asset.name; - } - - public _iResumeParsingAfterDependencies() - { - this._parsingPaused = false; - - if (this._timer) - this._timer.start(); - } - - public _pFinalizeAsset(asset:IAsset, name:string = null) - { - var type_event:string; - var type_name:string; - - if (name != null) - asset.name = name; - - // If the asset has no name, give it - // a per-type default name. - if (!asset.name) - asset.name = asset.assetType; - - this.dispatchEvent(new AssetEvent(AssetEvent.ASSET_COMPLETE, asset)); - } - - /** - * Parse the next block of data. - * @return Whether or not more data needs to be parsed. Can be ParserBase.ParserBase.PARSING_DONE or - * ParserBase.ParserBase.MORE_TO_PARSE. - */ - public _pProceedParsing():boolean - { - throw new AbstractMethodError(); - } - - public _pDieWithError(message:string = 'Unknown parsing error') - { - if (this._timer) { - this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); - this._timer.stop(); - this._timer = null; - } - - this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_ERROR, message)); - } - - public _pAddDependency(id:string, req:away.net.URLRequest, retrieveAsRawData:boolean = false, data:any = null, suppressErrorEvents:boolean = false):ResourceDependency - { - var dependency:ResourceDependency = new ResourceDependency(id, req, data, null, this, retrieveAsRawData, suppressErrorEvents); - this._dependencies.push(dependency); - - return dependency; - } - - public _pPauseAndRetrieveDependencies() - { - if (this._timer) - this._timer.stop(); - - this._parsingPaused = true; - this.dispatchEvent(new ParserEvent(ParserEvent.READY_FOR_DEPENDENCIES)); - } - - /** - * Tests whether or not there is still time left for parsing within the maximum allowed time frame per session. - * @return True if there is still time left, false if the maximum allotted time was exceeded and parsing should be interrupted. - */ - public _pHasTime():boolean - { - return ((away.utils.getTimer() - this._lastFrameTime) < this._frameLimit); - } - - /** - * Called when the parsing pause interval has passed and parsing can proceed. - */ - public _pOnInterval(event:TimerEvent = null) - { - this._lastFrameTime = away.utils.getTimer(); - - if (this._pProceedParsing() && !this._parsingFailure) - this._pFinishParsing(); - } - - /** - * Initializes the parsing of data. - * @param frameLimit The maximum duration of a parsing session. - */ - public _pStartParsing(frameLimit:number) - { - this._frameLimit = frameLimit; - this._timer = new Timer(this._frameLimit, 0); - this._timer.addEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); - this._timer.start(); - } - - /** - * Finish parsing the data. - */ - public _pFinishParsing() - { - if (this._timer) { - this._timer.removeEventListener(TimerEvent.TIMER, this._pOnIntervalDelegate); - this._timer.stop(); - } - - this._timer = null; - this._parsingComplete = true; - - this.dispatchEvent(new ParserEvent(ParserEvent.PARSE_COMPLETE)); - } - - /** - * - * @returns {string} - * @private - */ - public _pGetTextData():string - { - return ParserUtils.toString(this._data); - } - - /** - * - * @returns {string} - * @private - */ - public _pGetByteData():ByteArray - { - return ParserUtils.toByteArray(this._data); - } - } -} - diff --git a/src/away/parsers/ParserDataFormat.ts b/src/away/parsers/ParserDataFormat.ts deleted file mode 100644 index 92c7bd43..00000000 --- a/src/away/parsers/ParserDataFormat.ts +++ /dev/null @@ -1,27 +0,0 @@ -/// - -module away.parsers -{ - /** - * An enumeration providing values to describe the data format of parsed data. - */ - export class ParserDataFormat - { - /** - * Describes the format of a binary file. - */ - public static BINARY:string = "binary"; - - /** - * Describes the format of a plain text file. - */ - public static PLAIN_TEXT:string = "plainText"; - - /** - * Describes the format of an image file - */ - public static IMAGE:string = "image"; - - } -} - diff --git a/src/away/parsers/ParserUtils.ts b/src/away/parsers/ParserUtils.ts deleted file mode 100755 index 183a726a..00000000 --- a/src/away/parsers/ParserUtils.ts +++ /dev/null @@ -1,140 +0,0 @@ -/// - -module away.parsers -{ - import ByteArray = away.utils.ByteArray; - - export class ParserUtils - { - - /** - * Converts an ArrayBuffer to a base64 string - * - * @param image data as a ByteArray - * - * @return HTMLImageElement - * - */ - public static arrayBufferToImage(data:ArrayBuffer):HTMLImageElement - { - var byteStr:string = ''; - var bytes:Uint8Array = new Uint8Array(data); - var len:number = bytes.byteLength; - - for (var i = 0; i < len; i++) - byteStr += String.fromCharCode(bytes[ i ]) - - var base64Image:string = window.btoa(byteStr); - var str:string = 'data:image/png;base64,' + base64Image; - var img:HTMLImageElement = new Image(); - img.src = str; - - return img; - } - - /** - * Converts an ByteArray to an Image - returns an HTMLImageElement - * - * @param image data as a ByteArray - * - * @return HTMLImageElement - * - */ - public static byteArrayToImage(data:ByteArray):HTMLImageElement - { - var byteStr:string = ''; - var bytes:Uint8Array = new Uint8Array(data.arraybytes); - var len:number = bytes.byteLength; - - for (var i = 0; i < len; i++) - byteStr += String.fromCharCode(bytes[ i ]) - - var base64Image:string = window.btoa(byteStr); - var str:string = 'data:image/png;base64,' + base64Image; - var img:HTMLImageElement = new Image(); - img.src = str; - - return img; - } - - /** - * Converts an Blob to an Image - returns an HTMLImageElement - * - * @param image data as a Blob - * - * @return HTMLImageElement - * - */ - public static blobToImage(data:Blob):HTMLImageElement - { - var URLObj:URL = window['URL'] || window['webkitURL']; - var src = URLObj.createObjectURL(data); - var img:HTMLImageElement = new Image(); - img.src = src; - - return img; - } - - /** - * Returns a object as ByteArray, if possible. - * - * @param data The object to return as ByteArray - * - * @return The ByteArray or null - * - */ - public static toByteArray(data:any):ByteArray - { - var b:ByteArray = new ByteArray(); - b.setArrayBuffer(data); - return b; - } - - /** - * Returns a object as String, if possible. - * - * @param data The object to return as String - * @param length The length of the returned String - * - * @return The String or null - * - */ - public static toString(data:any, length:number = 0):string - { - - if (typeof data === 'string') { - var s:string = data; - - if (s['substr'] != null) - return s.substr(0, s.length); - } - - if (data instanceof ByteArray) { - var ba:ByteArray = data; - ba.position = 0; - return ba.readUTFBytes(Math.min(ba.getBytesAvailable(), length)); - } - - return null; - - /* - var ba:ByteArray; - - length ||= uint.MAX_VALUE; - - if (data is String) - return String(data).substr(0, length); - - ba = toByteArray(data); - if (ba) { - ba.position = 0; - return ba.readUTFBytes(Math.min(ba.bytesAvailable, length)); - } - - return null; - - */ - - } - } -} diff --git a/src/away/parsers/ResourceDependency.ts b/src/away/parsers/ResourceDependency.ts deleted file mode 100644 index 83242f51..00000000 --- a/src/away/parsers/ResourceDependency.ts +++ /dev/null @@ -1,165 +0,0 @@ -/// - -module away.parsers -{ - import IAsset = away.library.IAsset; - import URLLoader = away.net.URLLoader; - import URLRequest = away.net.URLRequest; - - /** - * ResourceDependency represents the data required to load, parse and resolve additional files ("dependencies") - * required by a parser, used by ResourceLoadSession. - * - */ - export class ResourceDependency - { - private _id:string; - private _request:URLRequest; - private _assets:Array; - private _parser:ParserBase; - private _parentParser:ParserBase; - private _data:any; - private _retrieveAsRawData:boolean; - private _suppressAssetEvents:boolean; - private _dependencies:Array; - - public _iLoader:URLLoader; - public _iSuccess:boolean; - - - constructor(id:string, request:URLRequest, data:any, parser:ParserBase, parentParser:ParserBase, retrieveAsRawData:boolean = false, suppressAssetEvents:boolean = false) - { - this._id = id; - this._request = request; - this._data = data; - this._parser = parser; - this._parentParser = parentParser; - this._retrieveAsRawData = retrieveAsRawData; - this._suppressAssetEvents = suppressAssetEvents; - - this._assets = new Array(); - this._dependencies = new Array(); - } - - /** - * - */ - public get id():string - { - return this._id; - } - - /** - * - */ - public get request():URLRequest - { - return this._request; - } - - /** - * The data containing the dependency to be parsed, if the resource was already loaded. - */ - public get data():any - { - return this._data; - } - - /** - * - */ - public get parser():ParserBase - { - return this._parser; - } - - /** - * The parser which is dependent on this ResourceDependency object. - */ - public get parentParser():ParserBase - { - return this._parentParser; - } - - /** - * - */ - public get retrieveAsRawData():boolean - { - return this._retrieveAsRawData; - } - - /** - * - */ - public get suppresAssetEvents():boolean - { - return this._suppressAssetEvents; - } - - /** - * - */ - public get assets():Array - { - return this._assets; - } - - /** - * - */ - public get dependencies():Array - { - return this._dependencies; - } - - /** - * @private - * Method to set data after having already created the dependency object, e.g. after load. - */ - public _iSetData(data:any):void - { - this._data = data; - } - - /** - * @private - * - */ - public _iSetParser(parser:ParserBase):void - { - this._parser = parser; - } - - /** - * Resolve the dependency when it's loaded with the parent parser. For example, a dependency containing an - * ImageResource would be assigned to a Mesh instance as a BitmapMaterial, a scene graph object would be added - * to its intended parent. The dependency should be a member of the dependencies property. - */ - public resolve():void - { - if (this._parentParser) - this._parentParser._iResolveDependency(this); - } - - /** - * Resolve a dependency failure. For example, map loading failure from a 3d file - */ - public resolveFailure():void - { - if (this._parentParser) - this._parentParser._iResolveDependencyFailure(this); - } - - /** - * Resolve the dependencies name - */ - public resolveName(asset:IAsset):string - { - if (this._parentParser) - return this._parentParser._iResolveDependencyName(this, asset); - - return asset.name; - } - } -} diff --git a/src/away/parsers/Texture2DParser.ts b/src/away/parsers/Texture2DParser.ts deleted file mode 100644 index 16db1a35..00000000 --- a/src/away/parsers/Texture2DParser.ts +++ /dev/null @@ -1,159 +0,0 @@ -/// - -module away.parsers -{ - import URLLoaderDataFormat = away.net.URLLoaderDataFormat; - import ImageTexture = away.textures.ImageTexture; - import Texture2DBase = away.textures.Texture2DBase; - import ByteArray = away.utils.ByteArray; - import TextureUtils = away.utils.TextureUtils; - - /** - * Texture2DParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - export class Texture2DParser extends ParserBase - { - private _startedParsing:boolean; - private _doneParsing:boolean; - private _loadingImage:boolean; - private _htmlImageElement:HTMLImageElement; - - /** - * Creates a new Texture2DParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - constructor() - { - super(URLLoaderDataFormat.ARRAY_BUFFER); - } - - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - public static supportsType(extension:string):boolean - { - - extension = extension.toLowerCase(); - return extension == "jpg" || extension == "jpeg" || extension == "png" || extension == "gif";//|| extension == "bmp";//|| extension == "atf"; - - } - - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - public static supportsData(data:any):boolean - { - - if (data instanceof HTMLImageElement) - return true; - - if (!(data instanceof ByteArray)) - return false; - - var ba:ByteArray = data; - ba.position = 0; - - if (ba.readUnsignedShort() == 0xffd8) - return true; // JPEG, maybe check for "JFIF" as well? - - ba.position = 0; - if (ba.readShort() == 0x424D) - return true; // BMP - - ba.position = 1; - if (ba.readUTFBytes(3) == 'PNG') - return true; - - ba.position = 0; - if (ba.readUTFBytes(3) == 'GIF' && ba.readShort() == 0x3839 && ba.readByte() == 0x61) - return true; - - ba.position = 0; - if (ba.readUTFBytes(3) == 'ATF') - return true; - - return false; - - } - - /** - * @inheritDoc - */ - public _pProceedParsing():boolean - { - - var asset:Texture2DBase; - var sizeError:boolean = false; - - if (this._loadingImage) { - return ParserBase.MORE_TO_PARSE; - } else if (this._htmlImageElement) { - if (TextureUtils.isHTMLImageElementValid(this._htmlImageElement)) { - asset = new ImageTexture(this._htmlImageElement); - this._pFinalizeAsset( asset, this._iFileName); - } - } else if (this.data instanceof HTMLImageElement) {// Parse HTMLImageElement - - if (TextureUtils.isHTMLImageElementValid( this.data)) { - asset = new ImageTexture( this.data); - this._pFinalizeAsset( asset, this._iFileName); - } else { - sizeError = true; - } - - } else if (this.data instanceof ByteArray) { // Parse a ByteArray - - var ba:ByteArray = this.data; - ba.position = 0; - var htmlImageElement:HTMLImageElement = ParserUtils.byteArrayToImage(this.data); - - if (TextureUtils.isHTMLImageElementValid(htmlImageElement)) { - asset = new ImageTexture(htmlImageElement); - this._pFinalizeAsset( asset, this._iFileName); - } else { - sizeError = true; - } - - } else if (this.data instanceof ArrayBuffer) {// Parse an ArrayBuffer - - this._htmlImageElement = ParserUtils.arrayBufferToImage(this.data); - - asset = new ImageTexture(this._htmlImageElement); - this._pFinalizeAsset( asset, this._iFileName); - - } else if (this.data instanceof Blob) { // Parse a Blob - - this._htmlImageElement = ParserUtils.blobToImage(this.data); - - this._htmlImageElement.onload = (event) => this.onLoadComplete(event); - this._loadingImage = true; - - return ParserBase.MORE_TO_PARSE; - } - - if (sizeError == true) // Generate new Checkerboard texture material - { -// asset = new BitmapTexture(away.materials.DefaultMaterialManager.createCheckeredBitmapData(), false); -// this._pFinalizeAsset( asset, this._iFileName); -// this.dispatchEvent(new away.events.AssetEvent(away.events.AssetEvent.TEXTURE_SIZE_ERROR, asset)); - } - - this._pContent = new away.entities.Billboard(new away.materials.CSSMaterialBase(asset)); - - return ParserBase.PARSING_DONE; - - } - - public onLoadComplete(event) - { - this._loadingImage = false; - } - } -} \ No newline at end of file diff --git a/src/away/prefabs/PrefabBase.ts b/src/away/prefabs/PrefabBase.ts deleted file mode 100644 index 98f14390..00000000 --- a/src/away/prefabs/PrefabBase.ts +++ /dev/null @@ -1,57 +0,0 @@ -/// - -module away.prefabs -{ - import DisplayObject = away.base.DisplayObject; -// import BatchObject = away.base.BatchObject; - import AbstractMethodError = away.errors.AbstractMethodError; - - /** - * PrefabBase is an abstract base class for prefabs, which are prebuilt display objects that allow easy cloning and updating - */ - export class PrefabBase extends away.library.NamedAssetBase - { - public _pObjects:Array = new Array(); - -// public _pBatchObjects:Array = new Array(); - - /** - * Creates a new PrefabBase object. - */ - constructor() - { - super(); - } - - /** - * Returns a display object generated from this prefab - */ - public getNewObject():DisplayObject - { - var object:DisplayObject = this._pCreateObject(); - - this._pObjects.push(object); - - return object; - } - -// public getNewBatchObject():BatchObject -// { -// var object:BatchObject = this._pCreateBatchObject(); -// -// this._pBatchObjects.push(object); -// -// return object; -// } - - public _pCreateObject():DisplayObject - { - throw new AbstractMethodError(); - } - - public _iValidate() - { - // To be overridden when necessary - } - } -} diff --git a/src/away/prefabs/PrimitiveCapsulePrefab.ts b/src/away/prefabs/PrimitiveCapsulePrefab.ts deleted file mode 100644 index ebd6e695..00000000 --- a/src/away/prefabs/PrimitiveCapsulePrefab.ts +++ /dev/null @@ -1,299 +0,0 @@ -/// - -module away.prefabs -{ - import SubGeometryBase = away.base.SubGeometryBase; - import TriangleSubGeometry = away.base.TriangleSubGeometry; - import LineSubGeometry = away.base.LineSubGeometry; - - /** - * A Capsule primitive mesh. - */ - export class PrimitiveCapsulePrefab extends PrimitivePrefabBase implements away.library.IAsset - { - private _radius:number; - private _height:number; - private _segmentsW:number; - private _segmentsH:number; - private _yUp:boolean; - private _numVertices:number = 0; - - /** - * The radius of the capsule. - */ - public get radius():number - { - return this._radius; - } - - public set radius(value:number) - { - this._radius = value; - - this._pInvalidateGeometry(); - } - - /** - * The height of the capsule. - */ - public get height():number - { - return this._height; - } - - public set height(value:number) - { - this._height = value; - this._pInvalidateGeometry(); - } - - /** - * Defines the number of horizontal segments that make up the capsule. Defaults to 16. - */ - public get segmentsW():number - { - return this._segmentsW; - } - - public set segmentsW(value:number) - { - this._segmentsW = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven. - */ - public get segmentsH():number - { - return this._segmentsH; - } - - public set segmentsH(value:number) - { - this._segmentsH = (value%2 == 0)? value + 1 : value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - public get yUp():boolean - { - return this._yUp; - } - - public set yUp(value:boolean) - { - this._yUp = value; - - this._pInvalidateGeometry(); - } - - /** - * Creates a new Capsule object. - * @param radius The radius of the capsule. - * @param height The height of the capsule. - * @param segmentsW Defines the number of horizontal segments that make up the capsule. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the capsule. Defaults to 15. Must be uneven value. - * @param yUp Defines whether the capsule poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 15, yUp:boolean = true) - { - super(); - - this._radius = radius; - this._height = height; - this._segmentsW = segmentsW; - this._segmentsH = (segmentsH%2 == 0)? segmentsH + 1 : segmentsH; - this._yUp = yUp; - } - - /** - * @inheritDoc - */ - public _pBuildGeometry(target:SubGeometryBase, geometryType:string) - { - var indices:Array /*uint*/; - var positions:Array; - var normals:Array; - var tangents:Array; - - var i:number; - var j:number; - var triIndex:number = 0; - var index:number = 0; - var startIndex:number; - var comp1:number, comp2:number, t1:number, t2:number; - var numIndices:number = 0; - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - // evaluate target number of vertices, triangles and indices - this._numVertices = (this._segmentsH + 1)*(this._segmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of closure - numIndices = (this._segmentsH - 1)*this._segmentsW*6; // each level has segmentH quads, each of 2 triangles - - // need to initialize raw arrays or can be reused? - if (this._numVertices == triangleGeometry.numVertices) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array(numIndices) - positions = new Array(this._numVertices*3); - normals = new Array(this._numVertices*3); - tangents = new Array(this._numVertices*3); - - this._pInvalidateUVs(); - } - - for (j = 0; j <= this._segmentsH; ++j) { - - var horangle:number = Math.PI*j/this._segmentsH; - var z:number = -this._radius*Math.cos(horangle); - var ringradius:number = this._radius*Math.sin(horangle); - - startIndex = index; - - for (i = 0; i <= this._segmentsW; ++i) { - var verangle:number = 2*Math.PI*i/this._segmentsW; - var x:number = ringradius*Math.cos(verangle); - var offset:number = j > this._segmentsH/2? this._height/2 : -this._height/2; - var y:number = ringradius*Math.sin(verangle); - var normLen:number = 1/Math.sqrt(x*x + y*y + z*z); - var tanLen:number = Math.sqrt(y*y + x*x); - - if (this._yUp) { - t1 = 0; - t2 = tanLen > .007? x/tanLen : 0; - comp1 = -z; - comp2 = y; - - } else { - t1 = tanLen > .007? x/tanLen : 0; - t2 = 0; - comp1 = y; - comp2 = z; - } - - if (i == this._segmentsW) { - - positions[index] = positions[startIndex]; - positions[index + 1] = positions[startIndex + 1]; - positions[index + 2] = positions[startIndex + 2]; - normals[index] = (normals[startIndex] + (x*normLen))*.5; - normals[index + 1] = (normals[startIndex + 1] + ( comp1*normLen))*.5; - normals[index + 2] = (normals[startIndex + 2] + (comp2*normLen))*.5; - tangents[index] = (tangents[startIndex] + (tanLen > .007? -y/tanLen : 1))*.5; - tangents[index + 1] = (tangents[startIndex + 1] + t1)*.5; - tangents[index + 2] = (tangents[startIndex + 2] + t2)*.5; - - } else { - // vertex - positions[index] = x; - positions[index + 1] = (this._yUp)? comp1 - offset : comp1; - positions[index + 2] = (this._yUp)? comp2 : comp2 + offset; - // normal - normals[index] = x*normLen; - normals[index + 1] = comp1*normLen; - normals[index + 2] = comp2*normLen; - // tangent - tangents[index] = tanLen > .007? -y/tanLen : 1; - tangents[index + 1] = t1; - tangents[index + 2] = t2; - } - - if (i > 0 && j > 0) { - var a:number = (this._segmentsW + 1)*j + i; - var b:number = (this._segmentsW + 1)*j + i - 1; - var c:number = (this._segmentsW + 1)*(j - 1) + i - 1; - var d:number = (this._segmentsW + 1)*(j - 1) + i; - - if (j == this._segmentsH) { - positions[index] = positions[startIndex]; - positions[index + 1] = positions[startIndex + 1]; - positions[index + 2] = positions[startIndex + 2]; - - indices[triIndex++] = a; - indices[triIndex++] = c; - indices[triIndex++] = d; - - } else if (j == 1) { - indices[triIndex++] = a; - indices[triIndex++] = b; - indices[triIndex++] = c; - - } else { - indices[triIndex++] = a; - indices[triIndex++] = b; - indices[triIndex++] = c; - indices[triIndex++] = a; - indices[triIndex++] = c; - indices[triIndex++] = d; - } - } - - index += 3; - } - } - - // build real data from raw data - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - - } else if (geometryType == "lineSubGeometry") { - //TODO - } - } - - /** - * @inheritDoc - */ - public _pBuildUVs(target:SubGeometryBase, geometryType:string) - { - var i:number, j:number; - var uvs:Array; - - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - // need to initialize raw array or can be reused? - if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(this._numVertices*2); - } - - // current uv component index - var index:number = 0; - - // surface - for (j = 0; j <= this._segmentsH; ++j) { - for (i = 0; i <= this._segmentsW; ++i) { - // revolution vertex - uvs[index++] = ( i/this._segmentsW )*triangleGeometry.scaleU; - uvs[index++] = ( j/this._segmentsH )*triangleGeometry.scaleV; - } - } - - // build real data from raw data - triangleGeometry.updateUVs(uvs); - - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - } - } -} diff --git a/src/away/prefabs/PrimitiveConePrefab.ts b/src/away/prefabs/PrimitiveConePrefab.ts deleted file mode 100644 index 510ab128..00000000 --- a/src/away/prefabs/PrimitiveConePrefab.ts +++ /dev/null @@ -1,40 +0,0 @@ -/// - -module away.prefabs -{ - - /** - * A UV Cone primitive mesh. - */ - export class PrimitiveConePrefab extends PrimitiveCylinderPrefab implements away.library.IAsset - { - - /** - * The radius of the bottom end of the cone. - */ - public get radius():number - { - return this._pBottomRadius; - } - - public set radius(value:number) - { - this._pBottomRadius = value; - - this._pInvalidateGeometry(); - } - - /** - * Creates a new Cone object. - * @param radius The radius of the bottom end of the cone - * @param height The height of the cone - * @param segmentsW Defines the number of horizontal segments that make up the cone. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the cone. Defaults to 1. - * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 1, closed:boolean = true, yUp:boolean = true) - { - super(0, radius, height, segmentsW, segmentsH, false, closed, true, yUp); - } - } -} diff --git a/src/away/prefabs/PrimitiveCubePrefab.ts b/src/away/prefabs/PrimitiveCubePrefab.ts deleted file mode 100644 index fc7ba5af..00000000 --- a/src/away/prefabs/PrimitiveCubePrefab.ts +++ /dev/null @@ -1,670 +0,0 @@ -/// - -module away.prefabs -{ - import SubGeometryBase = away.base.SubGeometryBase; - import TriangleSubGeometry = away.base.TriangleSubGeometry; - import LineSubGeometry = away.base.LineSubGeometry; - - /** - * A Cube primitive prefab. - */ - export class PrimitiveCubePrefab extends PrimitivePrefabBase implements away.library.IAsset - { - private _width:number; - private _height:number; - private _depth:number; - private _tile6:boolean; - - private _segmentsW:number; - private _segmentsH:number; - private _segmentsD:number; - - /** - * Creates a new Cube object. - * @param width The size of the cube along its X-axis. - * @param height The size of the cube along its Y-axis. - * @param depth The size of the cube along its Z-axis. - * @param segmentsW The number of segments that make up the cube along the X-axis. - * @param segmentsH The number of segments that make up the cube along the Y-axis. - * @param segmentsD The number of segments that make up the cube along the Z-axis. - * @param tile6 The type of uv mapping to use. When true, a texture will be subdivided in a 2x3 grid, each used for a single face. When false, the entire image is mapped on each face. - */ - constructor(width:number = 100, height:number = 100, depth:number = 100, segmentsW:number = 1, segmentsH:number = 1, segmentsD:number = 1, tile6:boolean = true) - { - super(); - - this._width = width; - this._height = height; - this._depth = depth; - this._segmentsW = segmentsW; - this._segmentsH = segmentsH; - this._segmentsD = segmentsD; - this._tile6 = tile6; - } - - /** - * The size of the cube along its X-axis. - */ - public get width():number - { - return this._width; - } - - public set width(value:number) - { - this._width = value; - - this._pInvalidateGeometry(); - } - - /** - * The size of the cube along its Y-axis. - */ - public get height():number - { - return this._height; - } - - public set height(value:number) - { - this._height = value; - - this._pInvalidateGeometry(); - } - - /** - * The size of the cube along its Z-axis. - */ - public get depth():number - { - return this._depth; - } - - public set depth(value:number) - { - this._depth = value; - - this._pInvalidateGeometry(); - } - - /** - * The type of uv mapping to use. When false, the entire image is mapped on each face. - * When true, a texture will be subdivided in a 3x2 grid, each used for a single face. - * Reading the tiles from left to right, top to bottom they represent the faces of the - * cube in the following order: bottom, top, back, left, front, right. This creates - * several shared edges (between the top, front, left and right faces) which simplifies - * texture painting. - */ - public get tile6():boolean - { - return this._tile6; - } - - public set tile6(value:boolean) - { - this._tile6 = value; - - this._pInvalidateGeometry(); - } - - /** - * The number of segments that make up the cube along the X-axis. Defaults to 1. - */ - public get segmentsW():number - { - return this._segmentsW; - } - - public set segmentsW(value:number) - { - this._segmentsW = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * The number of segments that make up the cube along the Y-axis. Defaults to 1. - */ - public get segmentsH():number - { - return this._segmentsH; - } - - public set segmentsH(value:number) - { - this._segmentsH = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * The number of segments that make up the cube along the Z-axis. Defaults to 1. - */ - public get segmentsD():number - { - return this._segmentsD; - } - - public set segmentsD(value:number) - { - this._segmentsD = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * @inheritDoc - */ - public _pBuildGeometry(target:SubGeometryBase, geometryType:string) - { - var indices:Array /*uint*/; - var positions:Array; - var normals:Array; - var tangents:Array; - - var tl:number, tr:number, bl:number, br:number; - var i:number, j:number, inc:number = 0; - - var vidx:number, fidx:number; // indices - var hw:number, hh:number, hd:number; // halves - var dw:number, dh:number, dd:number; // deltas - - var outer_pos:number; - var numIndices:number; - var numVertices:number; - - // half cube dimensions - hw = this._width/2; - hh = this._height/2; - hd = this._depth/2; - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - numVertices = ((this._segmentsW + 1)*(this._segmentsH + 1) + (this._segmentsW + 1)*(this._segmentsD + 1) + (this._segmentsH + 1)*(this._segmentsD + 1))*2; - - numIndices = ((this._segmentsW*this._segmentsH + this._segmentsW*this._segmentsD + this._segmentsH*this._segmentsD)*12); - - if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array(numIndices); - positions = new Array(numVertices*3); - normals = new Array(numVertices*3); - tangents = new Array(numVertices*3); - - this._pInvalidateUVs(); - } - - vidx = 0; - fidx = 0; - - // Segment dimensions - dw = this._width/this._segmentsW; - dh = this._height/this._segmentsH; - dd = this._depth/this._segmentsD; - - for (i = 0; i <= this._segmentsW; i++) { - outer_pos = -hw + i*dw; - - for (j = 0; j <= this._segmentsH; j++) { - // front - positions[vidx] = outer_pos; - positions[vidx + 1] = -hh + j*dh; - positions[vidx + 2] = -hd; - normals[vidx] = 0; - normals[vidx + 1] = 0; - normals[vidx + 2] = -1; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - // back - positions[vidx] = outer_pos; - positions[vidx + 1] = -hh + j*dh; - positions[vidx + 2] = hd; - normals[vidx] = 0; - normals[vidx + 1] = 0; - normals[vidx + 2] = 1; - tangents[vidx] = -1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - if (i && j) { - tl = 2*((i - 1)*(this._segmentsH + 1) + (j - 1)); - tr = 2*(i*(this._segmentsH + 1) + (j - 1)); - bl = tl + 2; - br = tr + 2; - - indices[fidx++] = tl; - indices[fidx++] = bl; - indices[fidx++] = br; - indices[fidx++] = tl; - indices[fidx++] = br; - indices[fidx++] = tr; - indices[fidx++] = tr + 1; - indices[fidx++] = br + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tr + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tl + 1; - } - } - } - - inc += 2*(this._segmentsW + 1)*(this._segmentsH + 1); - - for (i = 0; i <= this._segmentsW; i++) { - outer_pos = -hw + i*dw; - - for (j = 0; j <= this._segmentsD; j++) { - // top - positions[vidx] = outer_pos; - positions[vidx + 1] = hh; - positions[vidx + 2] = -hd + j*dd; - normals[vidx] = 0; - normals[vidx + 1] = 1; - normals[vidx + 2] = 0; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - // bottom - positions[vidx] = outer_pos; - positions[vidx + 1] = -hh; - positions[vidx + 2] = -hd + j*dd; - normals[vidx] = 0; - normals[vidx + 1] = -1; - normals[vidx + 2] = 0; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - if (i && j) { - tl = inc + 2*((i - 1)*(this._segmentsD + 1) + (j - 1)); - tr = inc + 2*(i*(this._segmentsD + 1) + (j - 1)); - bl = tl + 2; - br = tr + 2; - - indices[fidx++] = tl; - indices[fidx++] = bl; - indices[fidx++] = br; - indices[fidx++] = tl; - indices[fidx++] = br; - indices[fidx++] = tr; - indices[fidx++] = tr + 1; - indices[fidx++] = br + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tr + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tl + 1; - } - } - } - - inc += 2*(this._segmentsW + 1)*(this._segmentsD + 1); - - for (i = 0; i <= this._segmentsD; i++) { - outer_pos = hd - i*dd; - - for (j = 0; j <= this._segmentsH; j++) { - // left - positions[vidx] = -hw; - positions[vidx+1] = -hh + j*dh; - positions[vidx+2] = outer_pos; - normals[vidx] = -1; - normals[vidx+1] = 0; - normals[vidx+2] = 0; - tangents[vidx] = 0; - tangents[vidx+1] = 0; - tangents[vidx+2] = -1; - vidx += 3; - - // right - positions[vidx] = hw; - positions[vidx+1] = -hh + j*dh; - positions[vidx+2] = outer_pos; - normals[vidx] = 1; - normals[vidx+1] = 0; - normals[vidx+2] = 0; - tangents[vidx] = 0; - tangents[vidx+1] = 0; - tangents[vidx+2] = 1; - vidx += 3; - - if (i && j) { - tl = inc + 2*((i - 1)*(this._segmentsH + 1) + (j - 1)); - tr = inc + 2*(i*(this._segmentsH + 1) + (j - 1)); - bl = tl + 2; - br = tr + 2; - - indices[fidx++] = tl; - indices[fidx++] = bl; - indices[fidx++] = br; - indices[fidx++] = tl; - indices[fidx++] = br; - indices[fidx++] = tr; - indices[fidx++] = tr + 1; - indices[fidx++] = br + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tr + 1; - indices[fidx++] = bl + 1; - indices[fidx++] = tl + 1; - } - } - } - - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - - } else if (geometryType == "lineSubGeometry") { - var lineGeometry:LineSubGeometry = target; - - var numSegments:number = this._segmentsH*4 + this._segmentsW*4 + this._segmentsD*4; - var startPositions:Array; - var endPositions:Array; - var thickness:Array; - - if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { - startPositions = lineGeometry.startPositions; - endPositions = lineGeometry.endPositions; - thickness = lineGeometry.thickness; - } else { - startPositions = new Array(numSegments*3); - endPositions = new Array(numSegments*3); - thickness = new Array(numSegments); - } - - vidx = 0; - - fidx = 0; - - //front/back face - for (i = 0; i < this._segmentsH; ++i) { - startPositions[vidx] = -hw; - startPositions[vidx + 1] = i*this._height/this._segmentsH - hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = i*this._height/this._segmentsH - hh - endPositions[vidx + 2] = -hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = -hw; - startPositions[vidx + 1] = hh - i*this._height/this._segmentsH; - startPositions[vidx + 2] = hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = hh - i*this._height/this._segmentsH; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (i = 0; i < this._segmentsW; ++i) { - startPositions[vidx] = i*this._width/this._segmentsW - hw; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = i*this._width/this._segmentsW - hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = -hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = hw - i*this._width/this._segmentsW; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = hd; - - endPositions[vidx] = hw - i*this._width/this._segmentsW; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - //left/right face - for (i = 0; i < this._segmentsH; ++i) { - startPositions[vidx] = -hw; - startPositions[vidx + 1] = i*this._height/this._segmentsH - hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = -hw; - endPositions[vidx + 1] = i*this._height/this._segmentsH - hh - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = hw; - startPositions[vidx + 1] = hh - i*this._height/this._segmentsH; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = hh - i*this._height/this._segmentsH; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (i = 0; i < this._segmentsD; ++i) { - startPositions[vidx] = hw - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = i*this._depth/this._segmentsD - hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = i*this._depth/this._segmentsD - hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = -hw; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = hd - i*this._depth/this._segmentsD; - - endPositions[vidx] = -hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = hd - i*this._depth/this._segmentsD; - - thickness[fidx++] = 1; - - vidx += 3; - } - - - //top/bottom face - for (i = 0; i < this._segmentsD; ++i) { - startPositions[vidx] = -hw; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = hd - i*this._depth/this._segmentsD; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = -hh; - endPositions[vidx + 2] = hd - i*this._depth/this._segmentsD; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = -hw; - startPositions[vidx + 1] = hh; - startPositions[vidx + 2] = i*this._depth/this._segmentsD - hd; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = i*this._depth/this._segmentsD - hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - for (i = 0; i < this._segmentsW; ++i) { - startPositions[vidx] = hw - i*this._width/this._segmentsW; - startPositions[vidx + 1] = -hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = hw - i*this._width/this._segmentsW; - endPositions[vidx + 1] = -hh; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - - startPositions[vidx] = i*this._width/this._segmentsW - hw; - startPositions[vidx + 1] = hh; - startPositions[vidx + 2] = -hd; - - endPositions[vidx] = i*this._width/this._segmentsW - hw; - endPositions[vidx + 1] = hh; - endPositions[vidx + 2] = hd; - - thickness[fidx++] = 1; - - vidx += 3; - } - - // build real data from raw data - lineGeometry.updatePositions(startPositions, endPositions); - lineGeometry.updateThickness(thickness); - } - } - - /** - * @inheritDoc - */ - public _pBuildUVs(target:SubGeometryBase, geometryType:string) - { - var i:number, j:number, index:number; - var uvs:Array; - - var u_tile_dim:number, v_tile_dim:number; - var u_tile_step:number, v_tile_step:number; - var tl0u:number, tl0v:number; - var tl1u:number, tl1v:number; - var du:number, dv:number; - var numVertices:number; - - if (geometryType == "triangleSubGeometry") { - - numVertices = ((this._segmentsW + 1)*(this._segmentsH + 1) + (this._segmentsW + 1)*(this._segmentsD + 1) + (this._segmentsH + 1)*(this._segmentsD + 1))*2; - - var triangleGeometry:TriangleSubGeometry = target; - - if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(numVertices*2); - } - - if (this._tile6) { - u_tile_dim = u_tile_step = 1/3; - v_tile_dim = v_tile_step = 1/2; - } else { - u_tile_dim = v_tile_dim = 1; - u_tile_step = v_tile_step = 0; - } - - // Create planes two and two, the same way that they were - // constructed in the buildGeometry() function. First calculate - // the top-left UV coordinate for both planes, and then loop - // over the points, calculating the UVs from these numbers. - - // When tile6 is true, the layout is as follows: - // .-----.-----.-----. (1,1) - // | Bot | T | Bak | - // |-----+-----+-----| - // | L | F | R | - // (0,0)'-----'-----'-----' - - index = 0; - - // FRONT / BACK - tl0u = 1*u_tile_step; - tl0v = 1*v_tile_step; - tl1u = 2*u_tile_step; - tl1v = 0*v_tile_step; - du = u_tile_dim/this._segmentsW; - dv = v_tile_dim/this._segmentsH; - for (i = 0; i <= this._segmentsW; i++) { - for (j = 0; j <= this._segmentsH; j++) { - uvs[index++] = ( tl0u + i*du )*triangleGeometry.scaleU; - uvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; - - uvs[index++] = ( tl1u + (u_tile_dim - i*du))*triangleGeometry.scaleU; - uvs[index++] = ( tl1v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; - } - } - - // TOP / BOTTOM - tl0u = 1*u_tile_step; - tl0v = 0*v_tile_step; - tl1u = 0*u_tile_step; - tl1v = 0*v_tile_step; - du = u_tile_dim/this._segmentsW; - dv = v_tile_dim/this._segmentsD; - for (i = 0; i <= this._segmentsW; i++) { - for (j = 0; j <= this._segmentsD; j++) { - uvs[index++] = ( tl0u + i*du)*triangleGeometry.scaleU; - uvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; - - uvs[index++] = ( tl1u + i*du)*triangleGeometry.scaleU; - uvs[index++] = ( tl1v + j*dv)*triangleGeometry.scaleV; - } - } - - // LEFT / RIGHT - tl0u = 0*u_tile_step; - tl0v = 1*v_tile_step; - tl1u = 2*u_tile_step; - tl1v = 1*v_tile_step; - du = u_tile_dim/this._segmentsD; - dv = v_tile_dim/this._segmentsH; - for (i = 0; i <= this._segmentsD; i++) { - for (j = 0; j <= this._segmentsH; j++) { - uvs[index++] = ( tl0u + i*du)*triangleGeometry.scaleU; - uvs[index++] = ( tl0v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; - - uvs[index++] = ( tl1u + (u_tile_dim - i*du))*triangleGeometry.scaleU; - uvs[index++] = ( tl1v + (v_tile_dim - j*dv))*triangleGeometry.scaleV; - } - } - - triangleGeometry.updateUVs(uvs); - - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - } - } -} diff --git a/src/away/prefabs/PrimitiveCylinderPrefab.ts b/src/away/prefabs/PrimitiveCylinderPrefab.ts deleted file mode 100644 index e580d2fd..00000000 --- a/src/away/prefabs/PrimitiveCylinderPrefab.ts +++ /dev/null @@ -1,665 +0,0 @@ -/// - -module away.prefabs -{ - import SubGeometryBase = away.base.SubGeometryBase; - import TriangleSubGeometry = away.base.TriangleSubGeometry; - import LineSubGeometry = away.base.LineSubGeometry; - - /** - * A Cylinder primitive mesh. - */ - export class PrimitiveCylinderPrefab extends PrimitivePrefabBase implements away.library.IAsset - { - public _pBottomRadius:number; - public _pSegmentsW:number; - public _pSegmentsH:number; - - private _topRadius:number; - private _height:number; - - private _topClosed:boolean; - private _bottomClosed:boolean; - private _surfaceClosed:boolean; - private _yUp:boolean; - private _numVertices:number = 0; - - /** - * The radius of the top end of the cylinder. - */ - public get topRadius():number - { - return this._topRadius; - } - - public set topRadius(value:number) - { - this._topRadius = value; - this._pInvalidateGeometry(); - } - - /** - * The radius of the bottom end of the cylinder. - */ - public get bottomRadius():number - { - return this._pBottomRadius; - } - - public set bottomRadius(value:number) - { - this._pBottomRadius = value; - this._pInvalidateGeometry(); - } - - /** - * The radius of the top end of the cylinder. - */ - public get height():number - { - return this._height; - } - - public set height(value:number) - { - this._height = value; - this._pInvalidateGeometry(); - } - - /** - * Defines the number of horizontal segments that make up the cylinder. Defaults to 16. - */ - public get segmentsW():number - { - return this._pSegmentsW; - } - - public set segmentsW(value:number) - { - this.setSegmentsW(value); - } - - public setSegmentsW(value:number) - { - this._pSegmentsW = value; - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * Defines the number of vertical segments that make up the cylinder. Defaults to 1. - */ - public get segmentsH():number - { - return this._pSegmentsH; - } - - public set segmentsH(value:number) - { - - this.setSegmentsH(value) - - } - - public setSegmentsH(value:number) - { - this._pSegmentsH = value; - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - - } - - /** - * Defines whether the top end of the cylinder is closed (true) or open. - */ - public get topClosed():boolean - { - return this._topClosed; - } - - public set topClosed(value:boolean) - { - this._topClosed = value; - this._pInvalidateGeometry(); - } - - /** - * Defines whether the bottom end of the cylinder is closed (true) or open. - */ - public get bottomClosed():boolean - { - return this._bottomClosed; - } - - public set bottomClosed(value:boolean) - { - this._bottomClosed = value; - this._pInvalidateGeometry(); - } - - /** - * Defines whether the cylinder poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - public get yUp():boolean - { - return this._yUp; - } - - public set yUp(value:boolean) - { - this._yUp = value; - this._pInvalidateGeometry(); - } - - /** - * Creates a new Cylinder object. - * @param topRadius The radius of the top end of the cylinder. - * @param bottomRadius The radius of the bottom end of the cylinder - * @param height The radius of the bottom end of the cylinder - * @param segmentsW Defines the number of horizontal segments that make up the cylinder. Defaults to 16. - * @param segmentsH Defines the number of vertical segments that make up the cylinder. Defaults to 1. - * @param topClosed Defines whether the top end of the cylinder is closed (true) or open. - * @param bottomClosed Defines whether the bottom end of the cylinder is closed (true) or open. - * @param yUp Defines whether the cone poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(topRadius:number = 50, bottomRadius:number = 50, height:number = 100, segmentsW:number = 16, segmentsH:number = 1, topClosed:boolean = true, bottomClosed:boolean = true, surfaceClosed:boolean = true, yUp:boolean = true) - { - super(); - - this._topRadius = topRadius; - this._pBottomRadius = bottomRadius; - this._height = height; - this._pSegmentsW = segmentsW; - this._pSegmentsH = segmentsH; - this._topClosed = topClosed; - this._bottomClosed = bottomClosed; - this._surfaceClosed = surfaceClosed; - this._yUp = yUp; - } - - - /** - * @inheritDoc - */ - public _pBuildGeometry(target:SubGeometryBase, geometryType:string) - { - var indices:Array /*uint*/; - var positions:Array; - var normals:Array; - var tangents:Array; - - var i:number; - var j:number; - var x:number; - var y:number; - var z:number; - var vidx:number; - var fidx:number; - - var radius:number; - var revolutionAngle:number; - - var dr:number; - var latNormElev:number; - var latNormBase:number; - var numIndices:number = 0; - - var comp1:number; - var comp2:number; - var startIndex:number = 0; - var nextVertexIndex:number = 0; - - var t1:number; - var t2:number; - - // reset utility variables - this._numVertices = 0; - - // evaluate revolution steps - var revolutionAngleDelta:number = 2*Math.PI/this._pSegmentsW; - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - // evaluate target number of vertices, triangles and indices - if (this._surfaceClosed) { - this._numVertices += (this._pSegmentsH + 1)*(this._pSegmentsW + 1); // segmentsH + 1 because of closure, segmentsW + 1 because of UV unwrapping - numIndices += this._pSegmentsH*this._pSegmentsW*6; // each level has segmentW quads, each of 2 triangles - } - if (this._topClosed) { - this._numVertices += 2*(this._pSegmentsW + 1); // segmentsW + 1 because of unwrapping - numIndices += this._pSegmentsW*3; // one triangle for each segment - } - if (this._bottomClosed) { - this._numVertices += 2*(this._pSegmentsW + 1); - numIndices += this._pSegmentsW*3; - } - - // need to initialize raw arrays or can be reused? - if (this._numVertices == triangleGeometry.numVertices) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array(numIndices) - positions = new Array(this._numVertices*3); - normals = new Array(this._numVertices*3); - tangents = new Array(this._numVertices*3); - - this._pInvalidateUVs(); - } - - vidx = 0; - fidx = 0; - - // top - if (this._topClosed && this._topRadius > 0) { - - z = -0.5*this._height; - - for (i = 0; i <= this._pSegmentsW; ++i) { - // central vertex - if (this._yUp) { - t1 = 1; - t2 = 0; - comp1 = -z; - comp2 = 0; - - } else { - t1 = 0; - t2 = -1; - comp1 = 0; - comp2 = z; - } - - positions[vidx] = 0; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - normals[vidx] = 0; - normals[vidx + 1] = t1; - normals[vidx + 2] = t2; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - // revolution vertex - revolutionAngle = i*revolutionAngleDelta; - x = this._topRadius*Math.cos(revolutionAngle); - y = this._topRadius*Math.sin(revolutionAngle); - - if (this._yUp) { - comp1 = -z; - comp2 = y; - } else { - comp1 = y; - comp2 = z; - } - - if (i == this._pSegmentsW) { - positions[vidx] = positions[startIndex + 3]; - positions[vidx + 1] = positions[startIndex + 4]; - positions[vidx + 2] = positions[startIndex + 5]; - - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - } - - normals[vidx] = 0; - normals[vidx + 1] = t1; - normals[vidx + 2] = t2; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - if (i > 0) { - // add triangle - indices[fidx++] = nextVertexIndex; - indices[fidx++] = nextVertexIndex + 1; - indices[fidx++] = nextVertexIndex + 2; - - nextVertexIndex += 2; - } - } - - nextVertexIndex += 2; - } - - // bottom - if (this._bottomClosed && this._pBottomRadius > 0) { - - z = 0.5*this._height; - - startIndex = nextVertexIndex*3; - - for (i = 0; i <= this._pSegmentsW; ++i) { - if (this._yUp) { - t1 = -1; - t2 = 0; - comp1 = -z; - comp2 = 0; - } else { - t1 = 0; - t2 = 1; - comp1 = 0; - comp2 = z; - } - - positions[vidx] = 0; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - normals[vidx] = 0; - normals[vidx + 1] = t1; - normals[vidx + 2] = t2; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - // revolution vertex - revolutionAngle = i*revolutionAngleDelta; - x = this._pBottomRadius*Math.cos(revolutionAngle); - y = this._pBottomRadius*Math.sin(revolutionAngle); - - if (this._yUp) { - comp1 = -z; - comp2 = y; - } else { - comp1 = y; - comp2 = z; - } - - if (i == this._pSegmentsW) { - positions[vidx] = positions[startIndex + 3]; - positions[vidx + 1] = positions[startIndex + 4]; - positions[vidx + 2] = positions[startIndex + 5]; - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - } - - normals[vidx] = 0; - normals[vidx + 1] = t1; - normals[vidx + 2] = t2; - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - vidx += 3; - - if (i > 0) { - // add triangle - indices[fidx++] = nextVertexIndex; - indices[fidx++] = nextVertexIndex + 2; - indices[fidx++] = nextVertexIndex + 1; - - nextVertexIndex += 2; - } - } - - nextVertexIndex += 2; - } - - // The normals on the lateral surface all have the same incline, i.e. - // the "elevation" component (Y or Z depending on yUp) is constant. - // Same principle goes for the "base" of these vectors, which will be - // calculated such that a vector [base,elev] will be a unit vector. - dr = (this._pBottomRadius - this._topRadius); - latNormElev = dr/this._height; - latNormBase = (latNormElev == 0)? 1 : this._height/dr; - - // lateral surface - if (this._surfaceClosed) { - var a:number; - var b:number; - var c:number; - var d:number; - var na0:number, na1:number, naComp1:number, naComp2:number; - - for (j = 0; j <= this._pSegmentsH; ++j) { - radius = this._topRadius - ((j/this._pSegmentsH)*(this._topRadius - this._pBottomRadius)); - z = -(this._height/2) + (j/this._pSegmentsH*this._height); - - startIndex = nextVertexIndex*3; - - for (i = 0; i <= this._pSegmentsW; ++i) { - // revolution vertex - revolutionAngle = i*revolutionAngleDelta; - x = radius*Math.cos(revolutionAngle); - y = radius*Math.sin(revolutionAngle); - na0 = latNormBase*Math.cos(revolutionAngle); - na1 = latNormBase*Math.sin(revolutionAngle); - - if (this._yUp) { - t1 = 0; - t2 = -na0; - comp1 = -z; - comp2 = y; - naComp1 = latNormElev; - naComp2 = na1; - - } else { - t1 = -na0; - t2 = 0; - comp1 = y; - comp2 = z; - naComp1 = na1; - naComp2 = latNormElev; - } - - if (i == this._pSegmentsW) { - positions[vidx] = positions[startIndex]; - positions[vidx + 1] = positions[startIndex + 1]; - positions[vidx + 2] = positions[startIndex + 2]; - normals[vidx] = na0; - normals[vidx + 1] = latNormElev; - normals[vidx + 2] = na1; - tangents[vidx] = na1; - tangents[vidx + 1] = t1; - tangents[vidx + 2] = t2; - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - normals[vidx] = na0; - normals[vidx + 1] = naComp1; - normals[vidx + 2] = naComp2; - tangents[vidx] = -na1; - tangents[vidx + 1] = t1; - tangents[vidx + 2] = t2; - } - vidx += 3; - - // close triangle - if (i > 0 && j > 0) { - a = nextVertexIndex; // current - b = nextVertexIndex - 1; // previous - c = b - this._pSegmentsW - 1; // previous of last level - d = a - this._pSegmentsW - 1; // current of last level - - indices[fidx++] = a; - indices[fidx++] = b; - indices[fidx++] = c; - - indices[fidx++] = a; - indices[fidx++] = c; - indices[fidx++] = d; - } - - nextVertexIndex++; - } - } - } - - // build real data from raw data - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - - } else if (geometryType == "lineSubGeometry") { - var lineGeometry:LineSubGeometry = target; - - var numSegments:number = (this._pSegmentsH + 1)*(this._pSegmentsW) + this._pSegmentsW; - var startPositions:Array; - var endPositions:Array; - var thickness:Array; - - if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { - startPositions = lineGeometry.startPositions; - endPositions = lineGeometry.endPositions; - thickness = lineGeometry.thickness; - } else { - startPositions = new Array(numSegments*3); - endPositions = new Array(numSegments*3); - thickness = new Array(numSegments); - } - - vidx = 0; - - fidx = 0; - - //horizonal lines - - for (j = 0; j <= this._pSegmentsH; ++j) { - radius = this._topRadius - ((j/this._pSegmentsH)*(this._topRadius - this._pBottomRadius)); - z = this._height*(j/this._pSegmentsH - 0.5); - - for (i = 0; i <= this._pSegmentsW; ++i) { - // revolution vertex - revolutionAngle = i*revolutionAngleDelta; - x = radius*Math.cos(revolutionAngle); - y = radius*Math.sin(revolutionAngle); - - if (this._yUp) { - comp1 = -z; - comp2 = y; - } else { - comp1 = y; - comp2 = z; - } - - if (i > 0) { - endPositions[vidx] = x; - endPositions[vidx + 1] = comp1; - endPositions[vidx + 2] = comp2; - - thickness[fidx++] = 1; - - vidx += 3; - - //vertical lines - startPositions[vidx] = endPositions[vidx - this._pSegmentsW*6]; - startPositions[vidx + 1] = endPositions[vidx + 1 - this._pSegmentsW*6]; - startPositions[vidx + 2] = endPositions[vidx + 2 - this._pSegmentsW*6]; - - endPositions[vidx] = x; - endPositions[vidx + 1] = comp1; - endPositions[vidx + 2] = comp2; - - thickness[fidx++] = 1; - - vidx += 3; - } - - if (i < this._pSegmentsW) { - startPositions[vidx] = x; - startPositions[vidx + 1] = comp1; - startPositions[vidx + 2] = comp2; - } - } - } - - // build real data from raw data - lineGeometry.updatePositions(startPositions, endPositions); - lineGeometry.updateThickness(thickness); - } - } - - /** - * @inheritDoc - */ - public _pBuildUVs(target:SubGeometryBase, geometryType:string) - { - var i:number; - var j:number; - var x:number; - var y:number; - var revolutionAngle:number; - var uvs:Array; - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - // need to initialize raw array or can be reused? - if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(this._numVertices*2); - } - - // evaluate revolution steps - var revolutionAngleDelta:number = 2*Math.PI/this._pSegmentsW; - - // current uv component index - var index:number = 0; - - // top - if (this._topClosed) { - for (i = 0; i <= this._pSegmentsW; ++i) { - - revolutionAngle = i*revolutionAngleDelta; - x = 0.5 + 0.5* -Math.cos(revolutionAngle); - y = 0.5 + 0.5*Math.sin(revolutionAngle); - - uvs[index++] = 0.5*triangleGeometry.scaleU; // central vertex - uvs[index++] = 0.5*triangleGeometry.scaleV; - - uvs[index++] = x*triangleGeometry.scaleU; // revolution vertex - uvs[index++] = y*triangleGeometry.scaleV; - } - } - - // bottom - if (this._bottomClosed) { - for (i = 0; i <= this._pSegmentsW; ++i) { - - revolutionAngle = i*revolutionAngleDelta; - x = 0.5 + 0.5*Math.cos(revolutionAngle); - y = 0.5 + 0.5*Math.sin(revolutionAngle); - - uvs[index++] = 0.5*triangleGeometry.scaleU; // central vertex - uvs[index++] = 0.5*triangleGeometry.scaleV; - - uvs[index++] = x*triangleGeometry.scaleU; // revolution vertex - uvs[index++] = y*triangleGeometry.scaleV; - } - } - - // lateral surface - if (this._surfaceClosed) { - for (j = 0; j <= this._pSegmentsH; ++j) { - for (i = 0; i <= this._pSegmentsW; ++i) { - // revolution vertex - uvs[index++] = ( i/this._pSegmentsW )*triangleGeometry.scaleU; - uvs[index++] = ( j/this._pSegmentsH )*triangleGeometry.scaleV; - } - } - } - - // build real data from raw data - triangleGeometry.updateUVs(uvs); - - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - } - } -} diff --git a/src/away/prefabs/PrimitivePlanePrefab.ts b/src/away/prefabs/PrimitivePlanePrefab.ts deleted file mode 100644 index 4912e050..00000000 --- a/src/away/prefabs/PrimitivePlanePrefab.ts +++ /dev/null @@ -1,385 +0,0 @@ -/// - -module away.prefabs -{ - import SubGeometryBase = away.base.SubGeometryBase; - import TriangleSubGeometry = away.base.TriangleSubGeometry; - import LineSubGeometry = away.base.LineSubGeometry; - - /** - * A Plane primitive mesh. - */ - export class PrimitivePlanePrefab extends PrimitivePrefabBase implements away.library.IAsset - { - private _segmentsW:number; - private _segmentsH:number; - private _yUp:boolean; - private _width:number; - private _height:number; - private _doubleSided:boolean; - - /** - * Creates a new Plane object. - * @param width The width of the plane. - * @param height The height of the plane. - * @param segmentsW The number of segments that make up the plane along the X-axis. - * @param segmentsH The number of segments that make up the plane along the Y or Z-axis. - * @param yUp Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). - * @param doubleSided Defines whether the plane will be visible from both sides, with correct vertex normals. - */ - constructor(width:number = 100, height:number = 100, segmentsW:number = 1, segmentsH:number = 1, yUp:boolean = true, doubleSided:boolean = false) - { - - super(); - - this._segmentsW = segmentsW; - this._segmentsH = segmentsH; - this._yUp = yUp; - this._width = width; - this._height = height; - this._doubleSided = doubleSided; - - } - - /** - * The number of segments that make up the plane along the X-axis. Defaults to 1. - */ - public get segmentsW():number - { - return this._segmentsW; - } - - public set segmentsW(value:number) - { - - this._segmentsW = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - - } - - /** - * The number of segments that make up the plane along the Y or Z-axis, depending on whether yUp is true or - * false, respectively. Defaults to 1. - */ - public get segmentsH():number - { - return this._segmentsH; - } - - public set segmentsH(value:number) - { - - this._segmentsH = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - - } - - /** - * Defines whether the normal vector of the plane should point along the Y-axis (true) or Z-axis (false). Defaults to true. - */ - public get yUp():boolean - { - return this._yUp; - } - - public set yUp(value:boolean) - { - this._yUp = value; - - this._pInvalidateGeometry(); - } - - /** - * Defines whether the plane will be visible from both sides, with correct vertex normals (as opposed to bothSides on Material). Defaults to false. - */ - public get doubleSided():boolean - { - return this._doubleSided; - } - - public set doubleSided(value:boolean) - { - this._doubleSided = value; - - this._pInvalidateGeometry(); - } - - /** - * The width of the plane. - */ - public get width():number - { - return this._width; - } - - public set width(value:number) - { - this._width = value; - - this._pInvalidateGeometry(); - } - - /** - * The height of the plane. - */ - public get height():number - { - return this._height; - } - - public set height(value:number) - { - this._height = value; - - this._pInvalidateGeometry(); - } - - /** - * @inheritDoc - */ - public _pBuildGeometry(target:SubGeometryBase, geometryType:string) - { - var indices:Array /*uint*/; - var x:number, y:number; - var numIndices:number; - var base:number; - var tw:number = this._segmentsW + 1; - var numVertices:number; - - var vidx:number, fidx:number; // indices - - var xi:number; - var yi:number; - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - var numVertices:number = (this._segmentsH + 1)*tw; - var positions:Array; - var normals:Array; - var tangents:Array; - - if (this._doubleSided) - numVertices *= 2; - - numIndices = this._segmentsH*this._segmentsW*6; - - if (this._doubleSided) - numIndices *= 2; - - if (triangleGeometry.indices != null && numIndices == triangleGeometry.indices.length) { - indices = triangleGeometry.indices; - } else { - indices = new Array(numIndices); - - this._pInvalidateUVs(); - } - - if (numVertices == triangleGeometry.numVertices) { - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - positions = new Array(numVertices*3); - normals = new Array(numVertices*3); - tangents = new Array(numVertices*3); - - this._pInvalidateUVs(); - } - - fidx = 0; - - vidx = 0; - - for (yi = 0; yi <= this._segmentsH; ++yi) { - - for (xi = 0; xi <= this._segmentsW; ++xi) { - x = (xi/this._segmentsW - .5)*this._width; - y = (yi/this._segmentsH - .5)*this._height; - - positions[vidx] = x; - if (this._yUp) { - positions[vidx + 1] = 0; - positions[vidx + 2] = y; - } else { - positions[vidx + 1] = y; - positions[vidx + 2] = 0; - } - - normals[vidx] = 0; - - if (this._yUp) { - normals[vidx + 1] = 1; - normals[vidx + 2] = 0; - } else { - normals[vidx + 1] = 0; - normals[vidx + 2] = -1; - } - - tangents[vidx] = 1; - tangents[vidx + 1] = 0; - tangents[vidx + 2] = 0; - - vidx += 3; - - // add vertex with same position, but with inverted normal & tangent - if (this._doubleSided) { - - for (var i:number = vidx; i < vidx + 3; ++i) { - positions[i] = positions[i - 3]; - normals[i] = -normals[i - 3]; - tangents[i] = -tangents[i - 3]; - } - - vidx += 3; - - } - - if (xi != this._segmentsW && yi != this._segmentsH) { - - base = xi + yi*tw; - var mult:number = this._doubleSided? 2 : 1; - - indices[fidx++] = base*mult; - indices[fidx++] = (base + tw)*mult; - indices[fidx++] = (base + tw + 1)*mult; - indices[fidx++] = base*mult; - indices[fidx++] = (base + tw + 1)*mult; - indices[fidx++] = (base + 1)*mult; - - if (this._doubleSided) { - - indices[fidx++] = (base + tw + 1)*mult + 1; - indices[fidx++] = (base + tw)*mult + 1; - indices[fidx++] = base*mult + 1; - indices[fidx++] = (base + 1)*mult + 1; - indices[fidx++] = (base + tw + 1)*mult + 1; - indices[fidx++] = base*mult + 1; - - } - } - } - } - - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - - } else if (geometryType == "lineSubGeometry") { - var lineGeometry:LineSubGeometry = target; - - var numSegments:number = (this._segmentsH + 1) + tw; - var startPositions:Array; - var endPositions:Array; - var thickness:Array; - - var hw:number = this._width/2; - var hh:number = this._height/2; - - - if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { - startPositions = lineGeometry.startPositions; - endPositions = lineGeometry.endPositions; - thickness = lineGeometry.thickness; - } else { - startPositions = new Array(numSegments*3); - endPositions = new Array(numSegments*3); - thickness = new Array(numSegments); - } - - fidx = 0; - - vidx = 0; - - for (yi = 0; yi <= this._segmentsH; ++yi) { - startPositions[vidx] = -hw; - startPositions[vidx + 1] = 0; - startPositions[vidx + 2] = yi*this._height - hh; - - endPositions[vidx] = hw; - endPositions[vidx + 1] = 0; - endPositions[vidx + 2] = yi*this._height - hh; - - thickness[fidx++] = 1; - - vidx += 3; - } - - - for (xi = 0; xi <= this._segmentsW; ++xi) { - startPositions[vidx] = xi*this._width - hw; - startPositions[vidx + 1] = 0; - startPositions[vidx + 2] = -hh; - - endPositions[vidx] = xi*this._width - hw; - endPositions[vidx + 1] = 0; - endPositions[vidx + 2] = hh; - - thickness[fidx++] = 1; - - vidx += 3; - } - - // build real data from raw data - lineGeometry.updatePositions(startPositions, endPositions); - lineGeometry.updateThickness(thickness); - } - } - - /** - * @inheritDoc - */ - public _pBuildUVs(target:SubGeometryBase, geometryType:string) - { - var uvs:Array; - var numVertices:number; - - if (geometryType == "triangleSubGeometry") { - - numVertices = ( this._segmentsH + 1 )*( this._segmentsW + 1 ); - - if (this._doubleSided) - numVertices *= 2; - - var triangleGeometry:TriangleSubGeometry = target; - - if (triangleGeometry.uvs && numVertices == triangleGeometry.numVertices) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(numVertices*2); - this._pInvalidateGeometry() - } - - var index:number = 0; - - for (var yi:number = 0; yi <= this._segmentsH; ++yi) { - - for (var xi:number = 0; xi <= this._segmentsW; ++xi) { - uvs[index] = (xi/this._segmentsW)*triangleGeometry.scaleU; - uvs[index + 1] = (1 - yi/this._segmentsH)*triangleGeometry.scaleV; - index += 2; - - if (this._doubleSided) { - uvs[index] = (xi/this._segmentsW)*triangleGeometry.scaleU; - uvs[index+1] = (1 - yi/this._segmentsH)*triangleGeometry.scaleV; - index += 2; - } - } - } - - triangleGeometry.updateUVs(uvs); - - - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - } - } -} diff --git a/src/away/prefabs/PrimitivePolygonPrefab.ts b/src/away/prefabs/PrimitivePolygonPrefab.ts deleted file mode 100644 index d962b5ee..00000000 --- a/src/away/prefabs/PrimitivePolygonPrefab.ts +++ /dev/null @@ -1,63 +0,0 @@ -/// - -module away.prefabs -{ - - /** - * A UV RegularPolygon primitive mesh. - */ - export class PrimitivePolygonPrefab extends PrimitiveCylinderPrefab implements away.library.IAsset - { - - /** - * The radius of the regular polygon. - */ - public get radius():number - { - return this._pBottomRadius; - } - - public set radius(value:number) - { - this._pBottomRadius = value; - this._pInvalidateGeometry(); - } - - /** - * The number of sides of the regular polygon. - */ - public get sides():number - { - return this._pSegmentsW; - } - - public set sides(value:number) - { - this.setSegmentsW(value); - } - - /** - * The number of subdivisions from the edge to the center of the regular polygon. - */ - public get subdivisions():number - { - return this._pSegmentsH; - } - - public set subdivisions(value:number) - { - this.setSegmentsH(value); - } - - /** - * Creates a new RegularPolygon disc object. - * @param radius The radius of the regular polygon - * @param sides Defines the number of sides of the regular polygon. - * @param yUp Defines whether the regular polygon should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius:number = 100, sides:number = 16, yUp:boolean = true) - { - super(radius, 0, 0, sides, 1, true, false, false, yUp); - } - } -} diff --git a/src/away/prefabs/PrimitivePrefabBase.ts b/src/away/prefabs/PrimitivePrefabBase.ts deleted file mode 100644 index 8e350a3a..00000000 --- a/src/away/prefabs/PrimitivePrefabBase.ts +++ /dev/null @@ -1,215 +0,0 @@ -/// - -module away.prefabs -{ -// import BatchObject = away.base.BatchObject; - import DisplayObject = away.base.DisplayObject; - import Geometry = away.base.Geometry; - import SubGeometryBase = away.base.SubGeometryBase; - import TriangleSubGeometry = away.base.TriangleSubGeometry; - import LineSubGeometry = away.base.LineSubGeometry; - import Mesh = away.entities.Mesh; - import AbstractMethodError = away.errors.AbstractMethodError; - import MaterialBase = away.materials.MaterialBase; - - /** - * PrimitivePrefabBase is an abstract base class for polytope prefabs, which are simple pre-built geometric shapes - */ - export class PrimitivePrefabBase extends PrefabBase - { - public _geomDirty:boolean = true; - public _uvDirty:boolean = true; - - private _material:MaterialBase; - private _geometry:Geometry; - private _subGeometry:SubGeometryBase; - private _geometryType:string; - private _geometryTypeDirty:boolean = true; - - - /** - * - */ - public get assetType():string - { - return away.library.AssetType.PRIMITIVE_PREFAB; - } - - /** - * - */ - public get geometryType():string - { - return this._geometryType; - } - - public set geometryType(value:string) - { - if (this._geometryType == value) - return; - - this._geometryType = value; - - this.invalidateGeometryType(); - } - - public get geometry():Geometry - { - this._iValidate(); - - return this._geometry; - } - - /** - * The material with which to render the primitive. - */ - public get material():MaterialBase - { - return this._material; - } - - public set material(value:MaterialBase) - { - if (value == this._material) - return; - - this._material = value; - - var len:number = this._pObjects.length; - for (var i:number = 0; i < len; i++) - ( this._pObjects[i]).material = this._material; - } - - /** - * Creates a new PrimitivePrefabBase object. - * - * @param material The material with which to render the object - */ - constructor(material:MaterialBase = null, geometryType:string = "triangleSubGeometry") - { - super(); - - this._geometry = new Geometry(); - this._material = material; - this._geometryType = geometryType; - } - - /** - * Builds the primitive's geometry when invalid. This method should not be called directly. The calling should - * be triggered by the invalidateGeometry method (and in turn by updateGeometry). - */ - public _pBuildGeometry(target:SubGeometryBase, geometryType:string) - { - throw new away.errors.AbstractMethodError(); - } - - /** - * Builds the primitive's uv coordinates when invalid. This method should not be called directly. The calling - * should be triggered by the invalidateUVs method (and in turn by updateUVs). - */ - public _pBuildUVs(target:SubGeometryBase, geometryType:string) - { - throw new away.errors.AbstractMethodError(); - } - - /** - * Invalidates the primitive's geometry type, causing it to be updated when requested. - */ - public invalidateGeometryType() - { - this._geometryTypeDirty = true; - this._geomDirty = true; - this._uvDirty = true; - } - - /** - * Invalidates the primitive's geometry, causing it to be updated when requested. - */ - public _pInvalidateGeometry() - { - this._geomDirty = true; - } - - /** - * Invalidates the primitive's uv coordinates, causing them to be updated when requested. - */ - public _pInvalidateUVs() - { - this._uvDirty = true; - } - - /** - * Updates the subgeometry when invalid. - */ - private updateGeometryType() - { - //remove any existing sub geometry - if (this._subGeometry) - this._geometry.removeSubGeometry(this._subGeometry); - - if (this._geometryType == "triangleSubGeometry") { - var triangleGeometry:TriangleSubGeometry = new TriangleSubGeometry(true); - triangleGeometry.autoDeriveNormals = false; - triangleGeometry.autoDeriveTangents = false; - triangleGeometry.autoDeriveUVs = false; - this._geometry.addSubGeometry(triangleGeometry); - this._subGeometry = triangleGeometry; - } else if (this._geometryType == "lineSubGeometry") { - this._geometry.addSubGeometry(this._subGeometry = new LineSubGeometry()); - } - - this._geometryTypeDirty = false; - } - - - /** - * Updates the geometry when invalid. - */ - private updateGeometry() - { - this._pBuildGeometry(this._subGeometry, this._geometryType); - - this._geomDirty = false; - } - - /** - * Updates the uv coordinates when invalid. - */ - private updateUVs() - { - this._pBuildUVs(this._subGeometry, this._geometryType); - - this._uvDirty = false; - } - - public _iValidate() - { - if (this._geometryTypeDirty) - this.updateGeometryType(); - - if (this._geomDirty) - this.updateGeometry(); - - if (this._uvDirty) - this.updateUVs(); - } - - - public _pCreateObject():DisplayObject - { - var mesh:Mesh = new Mesh(this._geometry, this._material); - mesh._iSourcePrefab = this; - - return mesh; - } - - -// public _pCreateBatchObject():BatchObject -// { -// var batch:BatchObject = new BatchObject(this._geometry, this._material); -// batch._iSourcePrefab = this; -// -// return batch; -// } - } -} diff --git a/src/away/prefabs/PrimitiveSpherePrefab.ts b/src/away/prefabs/PrimitiveSpherePrefab.ts deleted file mode 100644 index d91366fb..00000000 --- a/src/away/prefabs/PrimitiveSpherePrefab.ts +++ /dev/null @@ -1,361 +0,0 @@ -/// - -module away.prefabs -{ - import SubGeometryBase = away.base.SubGeometryBase; - import TriangleSubGeometry = away.base.TriangleSubGeometry; - import LineSubGeometry = away.base.LineSubGeometry; - - /** - * A UV Sphere primitive mesh. - */ - export class PrimitiveSpherePrefab extends PrimitivePrefabBase implements away.library.IAsset - { - private _radius:number; - private _segmentsW:number; - private _segmentsH:number; - private _yUp:boolean; - - /** - * The radius of the sphere. - */ - public get radius():number - { - return this._radius; - } - - public set radius(value:number) - { - this._radius = value; - - this._pInvalidateGeometry(); - } - - /** - * Defines the number of horizontal segments that make up the sphere. Defaults to 16. - */ - public get segmentsW():number - { - return this._segmentsW; - } - - public set segmentsW(value:number) - { - this._segmentsW = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * Defines the number of vertical segments that make up the sphere. Defaults to 12. - */ - public get segmentsH():number - { - return this._segmentsH; - } - - public set segmentsH(value:number) - { - this._segmentsH = value; - - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - public get yUp():boolean - { - return this._yUp; - } - - public set yUp(value:boolean) - { - this._yUp = value; - - this._pInvalidateGeometry(); - } - - /** - * Creates a new Sphere object. - * - * @param radius The radius of the sphere. - * @param segmentsW Defines the number of horizontal segments that make up the sphere. - * @param segmentsH Defines the number of vertical segments that make up the sphere. - * @param yUp Defines whether the sphere poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius:number = 50, segmentsW:number = 16, segmentsH:number = 12, yUp:boolean = true) - { - super(); - - this._radius = radius; - this._segmentsW = segmentsW; - this._segmentsH = segmentsH; - this._yUp = yUp; - } - - /** - * @inheritDoc - */ - public _pBuildGeometry(target:SubGeometryBase, geometryType:string) - { - var indices:Array /*uint*/; - var positions:Array; - var normals:Array; - var tangents:Array; - - var i:number; - var j:number; - var vidx:number, fidx:number; // indices - - var comp1:number; - var comp2:number; - var numVertices:number; - - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - numVertices = (this._segmentsH + 1)*(this._segmentsW + 1); - - if (numVertices == triangleGeometry.numVertices && triangleGeometry.indices != null) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array((this._segmentsH - 1)*this._segmentsW*6); - positions = new Array(numVertices*3); - normals = new Array(numVertices*3); - tangents = new Array(numVertices*3); - - this._pInvalidateUVs(); - } - - vidx = 0; - fidx = 0; - - var startIndex:number; - var t1:number; - var t2:number; - - for (j = 0; j <= this._segmentsH; ++j) { - - startIndex = vidx; - - var horangle:number = Math.PI*j/this._segmentsH; - var z:number = -this._radius*Math.cos(horangle); - var ringradius:number = this._radius*Math.sin(horangle); - - for (i = 0; i <= this._segmentsW; ++i) { - var verangle:number = 2*Math.PI*i/this._segmentsW; - var x:number = ringradius*Math.cos(verangle); - var y:number = ringradius*Math.sin(verangle); - var normLen:number = 1/Math.sqrt(x*x + y*y + z*z); - var tanLen:number = Math.sqrt(y*y + x*x); - - if (this._yUp) { - - t1 = 0; - t2 = tanLen > .007? x/tanLen : 0; - comp1 = -z; - comp2 = y; - - } else { - t1 = tanLen > .007? x/tanLen : 0; - t2 = 0; - comp1 = y; - comp2 = z; - } - - if (i == this._segmentsW) { - positions[vidx] = positions[startIndex]; - positions[vidx+1] = positions[startIndex + 1]; - positions[vidx+2] = positions[startIndex + 2]; - normals[vidx] = normals[startIndex] + (x*normLen)*.5; - normals[vidx+1] = normals[startIndex + 1] + ( comp1*normLen)*.5; - normals[vidx+2] = normals[startIndex + 2] + (comp2*normLen)*.5; - tangents[vidx] = tanLen > .007? -y/tanLen : 1; - tangents[vidx+1] = t1; - tangents[vidx+2] = t2; - - } else { - - positions[vidx] = x; - positions[vidx+1] = comp1; - positions[vidx+2] = comp2; - normals[vidx] = x*normLen; - normals[vidx+1] = comp1*normLen; - normals[vidx+2] = comp2*normLen; - tangents[vidx] = tanLen > .007? -y/tanLen : 1; - tangents[vidx+1] = t1; - tangents[vidx+2] = t2; - } - - if (i > 0 && j > 0) { - - var a:number = (this._segmentsW + 1)*j + i; - var b:number = (this._segmentsW + 1)*j + i - 1; - var c:number = (this._segmentsW + 1)*(j - 1) + i - 1; - var d:number = (this._segmentsW + 1)*(j - 1) + i; - - if (j == this._segmentsH) { - - positions[vidx] = positions[startIndex]; - positions[vidx + 1] = positions[startIndex + 1]; - positions[vidx + 2] = positions[startIndex + 2]; - - indices[fidx++] = a; - indices[fidx++] = c; - indices[fidx++] = d; - - } else if (j == 1) { - - indices[fidx++] = a; - indices[fidx++] = b; - indices[fidx++] = c; - - } else { - indices[fidx++] = a; - indices[fidx++] = b; - indices[fidx++] = c; - indices[fidx++] = a; - indices[fidx++] = c; - indices[fidx++] = d; - } - } - - vidx += 3; - } - } - - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - - } else if (geometryType == "lineSubGeometry") { - - var lineGeometry:LineSubGeometry = target; - - var numSegments:number = (this._segmentsH - 1)*this._segmentsW*2; - var startPositions:Array; - var endPositions:Array; - var thickness:Array; - - if (lineGeometry.indices != null && numSegments == lineGeometry.numSegments) { - startPositions = lineGeometry.startPositions; - endPositions = lineGeometry.endPositions; - thickness = lineGeometry.thickness; - } else { - startPositions = new Array(numSegments*3); - endPositions = new Array(numSegments*3); - thickness = new Array(numSegments); - } - - vidx = 0; - - fidx = 0; - - for (j = 0; j <= this._segmentsH; ++j) { - - var horangle:number = Math.PI*j/this._segmentsH; - var z:number = -this._radius*Math.cos(horangle); - var ringradius:number = this._radius*Math.sin(horangle); - - for (i = 0; i <= this._segmentsW; ++i) { - var verangle:number = 2*Math.PI*i/this._segmentsW; - var x:number = ringradius*Math.cos(verangle); - var y:number = ringradius*Math.sin(verangle); - - if (this._yUp) { - comp1 = -z; - comp2 = y; - - } else { - comp1 = y; - comp2 = z; - } - - if (i > 0 && j > 0) { - //horizonal lines - if (j < this._segmentsH) { - endPositions[vidx] = x; - endPositions[vidx + 1] = comp1; - endPositions[vidx + 2] = comp2; - - thickness[fidx++] = 1; - - vidx += 3; - } - - //vertical lines - startPositions[vidx] = endPositions[vidx - this._segmentsW*6]; - startPositions[vidx + 1] = endPositions[vidx + 1 - this._segmentsW*6]; - startPositions[vidx + 2] = endPositions[vidx + 2 - this._segmentsW*6]; - - endPositions[vidx] = x; - endPositions[vidx + 1] = comp1; - endPositions[vidx + 2] = comp2; - - thickness[fidx++] = 1; - - vidx += 3; - } - - if (i < this._segmentsW && j > 0 && j < this._segmentsH) { - startPositions[vidx] = x; - startPositions[vidx + 1] = comp1; - startPositions[vidx + 2] = comp2; - } - } - } - - // build real data from raw data - lineGeometry.updatePositions(startPositions, endPositions); - lineGeometry.updateThickness(thickness); - } - } - - /** - * @inheritDoc - */ - public _pBuildUVs(target:SubGeometryBase, geometryType:string) - { - var i:number, j:number; - var numVertices:number = (this._segmentsH + 1)*(this._segmentsW + 1); - var uvs:Array; - - - if (geometryType == "triangleSubGeometry") { - - numVertices = (this._segmentsH + 1)*(this._segmentsW + 1); - - var triangleGeometry:TriangleSubGeometry = target; - - if (numVertices == triangleGeometry.numVertices && triangleGeometry.uvs != null) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(numVertices*2); - } - - var index:number = 0; - for (j = 0; j <= this._segmentsH; ++j) { - for (i = 0; i <= this._segmentsW; ++i) { - uvs[index++] = ( i/this._segmentsW )*triangleGeometry.scaleU; - uvs[index++] = ( j/this._segmentsH )*triangleGeometry.scaleV; - } - } - - triangleGeometry.updateUVs(uvs); - - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - } - } -} diff --git a/src/away/prefabs/PrimitiveTorusPrefab.ts b/src/away/prefabs/PrimitiveTorusPrefab.ts deleted file mode 100644 index 02abffbd..00000000 --- a/src/away/prefabs/PrimitiveTorusPrefab.ts +++ /dev/null @@ -1,297 +0,0 @@ -/// - -module away.prefabs -{ - import SubGeometryBase = away.base.SubGeometryBase; - import TriangleSubGeometry = away.base.TriangleSubGeometry; - import LineSubGeometry = away.base.LineSubGeometry; - - /** - * A UV Cylinder primitive mesh. - */ - export class PrimitiveTorusPrefab extends PrimitivePrefabBase implements away.library.IAsset - { - private _radius:number; - private _tubeRadius:number; - private _segmentsR:number; - private _segmentsT:number; - private _yUp:boolean; - private _numVertices:number = 0; - - /** - * The radius of the torus. - */ - public get radius():number - { - return this._radius; - } - - public set radius(value:number) - { - this._radius = value; - this._pInvalidateGeometry(); - } - - /** - * The radius of the inner tube of the torus. - */ - public get tubeRadius():number - { - return this._tubeRadius; - } - - public set tubeRadius(value:number) - { - this._tubeRadius = value; - this._pInvalidateGeometry(); - } - - /** - * Defines the number of horizontal segments that make up the torus. Defaults to 16. - */ - public get segmentsR():number - { - return this._segmentsR; - } - - public set segmentsR(value:number) - { - this._segmentsR = value; - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * Defines the number of vertical segments that make up the torus. Defaults to 8. - */ - public get segmentsT():number - { - return this._segmentsT; - } - - public set segmentsT(value:number) - { - this._segmentsT = value; - this._pInvalidateGeometry(); - this._pInvalidateUVs(); - } - - /** - * Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - public get yUp():boolean - { - return this._yUp; - } - - public set yUp(value:boolean) - { - this._yUp = value; - this._pInvalidateGeometry(); - } - - /** - * Creates a new Torus object. - * @param radius The radius of the torus. - * @param tuebRadius The radius of the inner tube of the torus. - * @param segmentsR Defines the number of horizontal segments that make up the torus. - * @param segmentsT Defines the number of vertical segments that make up the torus. - * @param yUp Defines whether the torus poles should lay on the Y-axis (true) or on the Z-axis (false). - */ - constructor(radius:number = 50, tubeRadius:number = 50, segmentsR:number = 16, segmentsT:number = 8, yUp:boolean = true) - { - super(); - - this._radius = radius; - this._tubeRadius = tubeRadius; - this._segmentsR = segmentsR; - this._segmentsT = segmentsT; - this._yUp = yUp; - } - - - /** - * @inheritDoc - */ - public _pBuildGeometry(target:SubGeometryBase, geometryType:string) - { - var indices:Array /*uint*/; - var positions:Array; - var normals:Array; - var tangents:Array; - - var i:number, j:number; - var x:number, y:number, z:number, nx:number, ny:number, nz:number, revolutionAngleR:number, revolutionAngleT:number; - var vidx:number; - var fidx:number; - var numIndices:number = 0; - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - // evaluate target number of vertices, triangles and indices - this._numVertices = (this._segmentsT + 1)*(this._segmentsR + 1); // segmentsT + 1 because of closure, segmentsR + 1 because of closure - numIndices = this._segmentsT*this._segmentsR*6; // each level has segmentR quads, each of 2 triangles - - // need to initialize raw arrays or can be reused? - if (this._numVertices == triangleGeometry.numVertices) { - indices = triangleGeometry.indices; - positions = triangleGeometry.positions; - normals = triangleGeometry.vertexNormals; - tangents = triangleGeometry.vertexTangents; - } else { - indices = new Array(numIndices) - positions = new Array(this._numVertices*3); - normals = new Array(this._numVertices*3); - tangents = new Array(this._numVertices*3); - - this._pInvalidateUVs(); - } - - - vidx = 0; - fidx = 0; - - // evaluate revolution steps - var revolutionAngleDeltaR:number = 2*Math.PI/this._segmentsR; - var revolutionAngleDeltaT:number = 2*Math.PI/this._segmentsT; - - var comp1:number, comp2:number; - var t1:number, t2:number, n1:number, n2:number; - var startIndex:number = 0; - var nextVertexIndex:number = 0; - - // surface - var a:number, b:number, c:number, d:number, length:number; - - for (j = 0; j <= this._segmentsT; ++j) { - - startIndex = nextVertexIndex*3; - - for (i = 0; i <= this._segmentsR; ++i) { - - // revolution vertex - revolutionAngleR = i*revolutionAngleDeltaR; - revolutionAngleT = j*revolutionAngleDeltaT; - - length = Math.cos(revolutionAngleT); - nx = length*Math.cos(revolutionAngleR); - ny = length*Math.sin(revolutionAngleR); - nz = Math.sin(revolutionAngleT); - - x = this._radius*Math.cos(revolutionAngleR) + this._tubeRadius*nx; - y = this._radius*Math.sin(revolutionAngleR) + this._tubeRadius*ny; - z = (j == this._segmentsT)? 0 : this._tubeRadius*nz; - - if (this._yUp) { - - n1 = -nz; - n2 = ny; - t1 = 0; - t2 = (length? nx/length : x/this._radius); - comp1 = -z; - comp2 = y; - - } else { - n1 = ny; - n2 = nz; - t1 = (length? nx/length : x/this._radius); - t2 = 0; - comp1 = y; - comp2 = z; - } - - if (i == this._segmentsR) { - positions[vidx] = x; - positions[vidx + 1] = positions[startIndex + 1]; - positions[vidx + 2] = positions[startIndex + 2]; - } else { - positions[vidx] = x; - positions[vidx + 1] = comp1; - positions[vidx + 2] = comp2; - } - - normals[vidx] = nx; - normals[vidx + 1] = n1; - normals[vidx + 2] = n2; - tangents[vidx] = -(length? ny/length : y/this._radius); - tangents[vidx + 1] = t1; - tangents[vidx + 2] = t2; - - vidx += 3; - - // close triangle - if (i > 0 && j > 0) { - a = nextVertexIndex; // current - b = nextVertexIndex - 1; // previous - c = b - this._segmentsR - 1; // previous of last level - d = a - this._segmentsR - 1; // current of last level - - indices[fidx++] = a; - indices[fidx++] = b; - indices[fidx++] = c; - - indices[fidx++] = a; - indices[fidx++] = c; - indices[fidx++] = d; - } - - nextVertexIndex++; - } - } - - // build real data from raw data - triangleGeometry.updateIndices(indices); - - triangleGeometry.updatePositions(positions); - triangleGeometry.updateVertexNormals(normals); - triangleGeometry.updateVertexTangents(tangents); - - } else if (geometryType == "lineSubGeometry") { - //TODO - } - } - - /** - * @inheritDoc - */ - public _pBuildUVs(target:SubGeometryBase, geometryType:string) - { - - var i:number, j:number; - var uvs:Array; - - - if (geometryType == "triangleSubGeometry") { - - var triangleGeometry:TriangleSubGeometry = target; - - // need to initialize raw array or can be reused? - if (triangleGeometry.uvs && this._numVertices == triangleGeometry.numVertices) { - uvs = triangleGeometry.uvs; - } else { - uvs = new Array(this._numVertices*2); - } - - // current uv component index - var index:number = 0; - - // surface - for (j = 0; j <= this._segmentsT; ++j) { - for (i = 0; i <= this._segmentsR; ++i) { - // revolution vertex - uvs[index++] = ( i/this._segmentsR )*triangleGeometry.scaleU; - uvs[index++] = ( j/this._segmentsT )*triangleGeometry.scaleV; - } - } - - // build real data from raw data - triangleGeometry.updateUVs(uvs); - - } else if (geometryType == "lineSubGeometry") { - //nothing to do here - } - } - } -} diff --git a/src/away/projections/CoordinateSystem.ts b/src/away/projections/CoordinateSystem.ts deleted file mode 100644 index dd0578fc..00000000 --- a/src/away/projections/CoordinateSystem.ts +++ /dev/null @@ -1,20 +0,0 @@ -module away.projections -{ - /** - * Provides constant values for camera lens projection options use the the coordinateSystem property - * - * @see away.projections.PerspectiveLens#coordinateSystem - */ - export class CoordinateSystem - { - /** - * Default option, projects to a left-handed coordinate system - */ - public static LEFT_HANDED:string = "leftHanded"; - - /** - * Projects to a right-handed coordinate system - */ - public static RIGHT_HANDED:string = "rightHanded"; - } -} \ No newline at end of file diff --git a/src/away/projections/FreeMatrixProjection.ts b/src/away/projections/FreeMatrixProjection.ts deleted file mode 100644 index 8902b7ee..00000000 --- a/src/away/projections/FreeMatrixProjection.ts +++ /dev/null @@ -1,49 +0,0 @@ -/// - -module away.projections -{ - export class FreeMatrixProjection extends ProjectionBase - { - constructor() - { - super(); - this._pMatrix.copyFrom(new PerspectiveProjection().matrix); - } - - //@override - public set near(value:number) - { - this._pNear = value; - } - - //@override - public set far(value:number) - { - this._pFar = value; - } - - //@override - public set iAspectRatio(value:number) - { - this._pAspectRatio = value; - } - - //@override - public clone():ProjectionBase - { - var clone:FreeMatrixProjection = new FreeMatrixProjection(); - clone._pMatrix.copyFrom(this._pMatrix); - clone._pNear = this._pNear; - clone._pFar = this._pFar; - clone._pAspectRatio = this._pAspectRatio; - clone.pInvalidateMatrix(); - return clone; - } - - //@override - public pUpdateMatrix() - { - this._pMatrixInvalid = false; - } - } -} \ No newline at end of file diff --git a/src/away/projections/IProjection.ts b/src/away/projections/IProjection.ts deleted file mode 100644 index 7f69c98d..00000000 --- a/src/away/projections/IProjection.ts +++ /dev/null @@ -1,39 +0,0 @@ -/// - -/** - * @module away.base - */ -module away.projections -{ - /** - * IMaterialOwner provides an interface for objects that can use materials. - * - * @interface away.base.IMaterialOwner - */ - export interface IProjection extends away.events.IEventDispatcher - { - coordinateSystem:string; - - frustumCorners:Array - - matrix:away.geom.Matrix3D; - - near:number; - - originX:number; - - originY:number; - - far:number; - - _iAspectRatio:number; - - project(point3d:away.geom.Vector3D):away.geom.Vector3D; - - unproject(nX:number, nY:number, sZ:number):away.geom.Vector3D; - - _iUpdateScissorRect(x:number, y:number, width:number, height:number); - - _iUpdateViewport(x:number, y:number, width:number, height:number); - } -} \ No newline at end of file diff --git a/src/away/projections/ObliqueNearPlaneProjection.ts b/src/away/projections/ObliqueNearPlaneProjection.ts deleted file mode 100644 index 29ae159b..00000000 --- a/src/away/projections/ObliqueNearPlaneProjection.ts +++ /dev/null @@ -1,112 +0,0 @@ -/// - -module away.projections -{ - export class ObliqueNearPlaneProjection extends ProjectionBase - { - - private _baseProjection:IProjection; - private _plane:away.geom.Plane3D; - private _onProjectionMatrixChangedDelegate:Function; - - constructor(baseProjection:IProjection, plane:away.geom.Plane3D) - { - super(); - this.baseProjection = baseProjection; - this.plane = plane; - - this._onProjectionMatrixChangedDelegate = away.utils.Delegate.create(this, this.onProjectionMatrixChanged); - } - - //@override - public get frustumCorners():number[] - { - return this._baseProjection.frustumCorners; - } - - //@override - public get near():number - { - return this._baseProjection.near; - } - - //@override - public set near(value:number) - { - this._baseProjection.near = value; - } - - //@override - public get far():number - { - return this._baseProjection.far; - } - - //@override - public set far(value:number) - { - this._baseProjection.far = value; - } - - //@override - public get iAspectRatio():number - { - return this._baseProjection._iAspectRatio; - } - - //@override - public set iAspectRatio(value:number) - { - this._baseProjection._iAspectRatio = value; - } - - public get plane():away.geom.Plane3D - { - return this._plane; - } - - public set plane(value:away.geom.Plane3D) - { - this._plane = value; - this.pInvalidateMatrix(); - } - - public set baseProjection(value:IProjection) - { - if (this._baseProjection) { - this._baseProjection.removeEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - } - this._baseProjection = value; - - if (this._baseProjection) { - this._baseProjection.addEventListener(away.events.ProjectionEvent.MATRIX_CHANGED, this._onProjectionMatrixChangedDelegate); - } - this.pInvalidateMatrix(); - } - - private onProjectionMatrixChanged(event:away.events.ProjectionEvent) - { - this.pInvalidateMatrix(); - } - - //@override - public pUpdateMatrix() - { - this._pMatrix.copyFrom(this._baseProjection.matrix); - - var cx:number = this._plane.a; - var cy:number = this._plane.b; - var cz:number = this._plane.c; - var cw:number = -this._plane.d + .05; - var signX:number = cx >= 0? 1 : -1; - var signY:number = cy >= 0? 1 : -1; - var p:away.geom.Vector3D = new away.geom.Vector3D(signX, signY, 1, 1); - var inverse:away.geom.Matrix3D = this._pMatrix.clone(); - inverse.invert(); - var q:away.geom.Vector3D = inverse.transformVector(p); - this._pMatrix.copyRowTo(3, p); - var a:number = (q.x*p.x + q.y*p.y + q.z*p.z + q.w*p.w)/(cx*q.x + cy*q.y + cz*q.z + cw*q.w); - this._pMatrix.copyRowFrom(2, new away.geom.Vector3D(cx*a, cy*a, cz*a, cw*a)); - } - } -} \ No newline at end of file diff --git a/src/away/projections/OrthographicOffCenterProjection.ts b/src/away/projections/OrthographicOffCenterProjection.ts deleted file mode 100644 index d852eaa3..00000000 --- a/src/away/projections/OrthographicOffCenterProjection.ts +++ /dev/null @@ -1,115 +0,0 @@ -/// - -module away.projections -{ - export class OrthographicOffCenterProjection extends ProjectionBase - { - - private _minX:number; - private _maxX:number; - private _minY:number; - private _maxY:number; - - constructor(minX:number, maxX:number, minY:number, maxY:number) - { - super(); - this._minX = minX; - this._maxX = maxX; - this._minY = minY; - this._maxY = maxY; - } - - public get minX():number - { - return this._minX; - } - - public set minX(value:number) - { - this._minX = value; - this.pInvalidateMatrix(); - } - - public get maxX():number - { - return this._maxX; - } - - public set maxX(value:number) - { - this._maxX = value; - this.pInvalidateMatrix(); - } - - public get minY():number - { - return this._minY; - } - - public set minY(value:number) - { - this._minY = value; - this.pInvalidateMatrix(); - } - - public get maxY():number - { - return this._maxY; - } - - public set maxY(value:number) - { - this._maxY = value; - this.pInvalidateMatrix(); - } - - //@override - public unproject(nX:number, nY:number, sZ:number):away.geom.Vector3D - { - var v:away.geom.Vector3D = new away.geom.Vector3D(nX, -nY, sZ, 1.0); - v = this.unprojectionMatrix.transformVector(v); - //z is unaffected by transform - v.z = sZ; - - return v; - } - - //@override - public clone():ProjectionBase - { - var clone:OrthographicOffCenterProjection = new OrthographicOffCenterProjection(this._minX, this._maxX, this._minY, this._maxY); - clone._pNear = this._pNear; - clone._pFar = this._pFar; - clone._pAspectRatio = this._pAspectRatio; - return clone; - } - - //@override - public pUpdateMatrix() - { - var raw:number[] = []; - var w:number = 1/(this._maxX - this._minX); - var h:number = 1/(this._maxY - this._minY); - var d:number = 1/(this._pFar - this._pNear); - - raw[0] = 2*w; - raw[5] = 2*h; - raw[10] = d; - raw[12] = -(this._maxX + this._minX)*w; - raw[13] = -(this._maxY + this._minY)*h; - raw[14] = -this._pNear*d; - raw[15] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - this._pMatrix.copyRawDataFrom(raw); - - this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._minX; - this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._maxX; - this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._minY; - this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._maxY; - this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; - this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; - - this._pMatrixInvalid = false; - } - } -} \ No newline at end of file diff --git a/src/away/projections/OrthographicProjection.ts b/src/away/projections/OrthographicProjection.ts deleted file mode 100644 index 33ef71ee..00000000 --- a/src/away/projections/OrthographicProjection.ts +++ /dev/null @@ -1,118 +0,0 @@ -/// - -module away.projections -{ - export class OrthographicProjection extends ProjectionBase - { - - private _projectionHeight:number; - private _xMax:number; - private _yMax:number; - - constructor(projectionHeight:number = 500) - { - super(); - this._projectionHeight = projectionHeight; - } - - public get projectionHeight():number - { - return this._projectionHeight; - } - - public set projectionHeight(value:number) - { - if (value == this._projectionHeight) { - return; - } - this._projectionHeight = value; - this.pInvalidateMatrix(); - } - - //@override - public unproject(nX:number, nY:number, sZ:number):away.geom.Vector3D - { - var v:away.geom.Vector3D = new away.geom.Vector3D(nX + this.matrix.rawData[12], -nY + this.matrix.rawData[13], sZ, 1.0); - v = this.unprojectionMatrix.transformVector(v); - - //z is unaffected by transform - v.z = sZ; - - return v; - } - - //@override - public clone():ProjectionBase - { - var clone:OrthographicProjection = new OrthographicProjection(); - clone._pNear = this._pNear; - clone._pFar = this._pFar; - clone._pAspectRatio = this._pAspectRatio; - clone.projectionHeight = this._projectionHeight; - return clone; - } - - //@override - public pUpdateMatrix() - { - var raw:number[] = []; - this._yMax = this._projectionHeight*.5; - this._xMax = this._yMax*this._pAspectRatio; - - var left:number; - var right:number; - var top:number; - var bottom:number; - - if (this._pScissorRect.x == 0 && this._pScissorRect.y == 0 && this._pScissorRect.width == this._pViewPort.width && this._pScissorRect.height == this._pViewPort.height) { - // assume symmetric frustum - - left = -this._xMax; - right = this._xMax; - top = -this._yMax; - bottom = this._yMax; - - raw[0] = 2/(this._projectionHeight*this._pAspectRatio); - raw[5] = 2/this._projectionHeight; - raw[10] = 1/(this._pFar - this._pNear); - raw[14] = this._pNear/(this._pNear - this._pFar); - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = raw[12] = raw[13] = 0; - raw[15] = 1; - - } else { - - var xWidth:number = this._xMax*(this._pViewPort.width/this._pScissorRect.width); - var yHgt:number = this._yMax*(this._pViewPort.height/this._pScissorRect.height); - var center:number = this._xMax*(this._pScissorRect.x*2 - this._pViewPort.width)/this._pScissorRect.width + this._xMax; - var middle:number = -this._yMax*(this._pScissorRect.y*2 - this._pViewPort.height)/this._pScissorRect.height - this._yMax; - - left = center - xWidth; - right = center + xWidth; - top = middle - yHgt; - bottom = middle + yHgt; - - raw[0] = 2*1/(right - left); - raw[5] = -2*1/(top - bottom); - raw[10] = 1/(this._pFar - this._pNear); - - raw[12] = (right + left)/(right - left); - raw[13] = (bottom + top)/(bottom - top); - raw[14] = this._pNear/(this.near - this.far); - - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[8] = raw[9] = raw[11] = 0; - raw[15] = 1; - } - - this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pFrustumCorners[12] = this._pFrustumCorners[21] = left; - this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pFrustumCorners[15] = this._pFrustumCorners[18] = right; - this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pFrustumCorners[13] = this._pFrustumCorners[16] = top; - this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pFrustumCorners[19] = this._pFrustumCorners[22] = bottom; - this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; - this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; - - this._pMatrix.copyRawDataFrom(raw); - - this._pMatrixInvalid = false; - } - } -} \ No newline at end of file diff --git a/src/away/projections/PerspectiveProjection.ts b/src/away/projections/PerspectiveProjection.ts deleted file mode 100644 index 1d729918..00000000 --- a/src/away/projections/PerspectiveProjection.ts +++ /dev/null @@ -1,230 +0,0 @@ -/// - -module away.projections -{ - export class PerspectiveProjection extends ProjectionBase - { - private _fieldOfView:number = 60; - private _focalLength:number = 1000; - private _hFieldOfView:number = 60; - private _hFocalLength:number = 1000; - private _preserveAspectRatio:boolean = true; - private _preserveFocalLength:boolean = false; - - constructor(fieldOfView:number = 60, coordinateSystem:string = "leftHanded") - { - super(coordinateSystem); - this.fieldOfView = fieldOfView; - } - - /** - * - */ - public get preserveAspectRatio():boolean - { - return this._preserveAspectRatio; - } - - public set preserveAspectRatio(value:boolean) - { - if (this._preserveAspectRatio == value) - return; - - this._preserveAspectRatio = value; - - if (this._preserveAspectRatio) - this.pInvalidateMatrix(); - } - - /** - * - */ - public get preserveFocalLength():boolean - { - return this._preserveFocalLength; - } - - public set preserveFocalLength(value:boolean) - { - if (this._preserveFocalLength == value) - return; - - this._preserveFocalLength = value; - - this.pInvalidateMatrix(); - } - - /** - * - */ - public get fieldOfView():number - { - return this._fieldOfView; - } - - public set fieldOfView(value:number) - { - if (this._fieldOfView == value) - return; - - this._fieldOfView = value; - - this.pInvalidateMatrix(); - } - - /** - * - */ - public get focalLength():number - { - return this._focalLength; - } - - public set focalLength(value:number) - { - if (this._focalLength == value) - return; - - this._focalLength = value; - - this.pInvalidateMatrix(); - } - - /** - * - */ - public get hFieldOfView():number - { - return this._hFieldOfView; - } - - public set hFieldOfView(value:number) - { - if (this._hFieldOfView == value) - return; - - this._hFieldOfView = value; - - this._hFocalLength = 1/Math.tan(this._hFieldOfView*Math.PI/360); - - this.pInvalidateMatrix(); - } - - /** - * - */ - public get hFocalLength():number - { - return this._hFocalLength; - } - - public set hFocalLength(value:number) - { - if (this._hFocalLength == value) - return; - - this._hFocalLength = value; - - this.pInvalidateMatrix(); - } - - - //@override - public unproject(nX:number, nY:number, sZ:number):away.geom.Vector3D - { - var v:away.geom.Vector3D = new away.geom.Vector3D(nX, -nY, sZ, 1.0); - - v.x *= sZ; - v.y *= sZ; - - v = this.unprojectionMatrix.transformVector(v); - - //z is unaffected by transform - v.z = sZ; - - return v; - } - - //@override - public clone():ProjectionBase - { - var clone:PerspectiveProjection = new PerspectiveProjection(this._fieldOfView); - clone._pNear = this._pNear; - clone._pFar = this._pFar; - clone._pAspectRatio = this._pAspectRatio; - clone._pCoordinateSystem = this._pCoordinateSystem; - return clone; - } - - //@override - public pUpdateMatrix() - { - var raw:number[] = []; - - if (this._preserveFocalLength) { - if (this._preserveAspectRatio) - this._hFocalLength = this._focalLength; - - this._fieldOfView = Math.atan(0.5*this._pScissorRect.height/this._focalLength)*360/Math.PI; - this._hFieldOfView = Math.atan(0.5*this._pScissorRect.width/this._hFocalLength)*360/Math.PI; - } else { - this._focalLength = 0.5*this._pScissorRect.height/Math.tan(this._fieldOfView*Math.PI/360); - - if (this._preserveAspectRatio) - this._hFocalLength = this._focalLength; - else - this._hFocalLength = 0.5*this._pScissorRect.width/Math.tan(this._hFieldOfView*Math.PI/360); - } - - var tanMinX = -this._pOriginX/this._hFocalLength; - var tanMaxX = (1 - this._pOriginX)/this._hFocalLength; - var tanMinY = -this._pOriginY/this._focalLength; - var tanMaxY = (1 - this._pOriginY)/this._focalLength; - - var left:number; - var right:number; - var top:number; - var bottom:number; - - // assume scissored frustum - var center:number = -((tanMinX - tanMaxX)*this._pScissorRect.x + tanMinX*this._pScissorRect.width); - var middle:number = ((tanMinY - tanMaxY)*this._pScissorRect.y + tanMinY*this._pScissorRect.height); - - left = center - (tanMaxX - tanMinX)*this._pViewPort.width; - right = center; - top = middle; - bottom = middle + (tanMaxY - tanMinY)*this._pViewPort.height; - - raw[0] = 2/(right - left); - raw[5] = 2/(bottom - top); - raw[8] = (right + left)/(right - left); - raw[9] = (bottom + top)/(bottom - top); - raw[10] = (this._pFar + this._pNear)/(this._pFar - this._pNear); - raw[11] = 1; - raw[1] = raw[2] = raw[3] = raw[4] = raw[6] = raw[7] = raw[12] = raw[13] = raw[15] = 0; - raw[14] = -2*this._pFar*this._pNear/(this._pFar - this._pNear); - - if (this._pCoordinateSystem == CoordinateSystem.RIGHT_HANDED) - raw[5] = -raw[5]; - - this._pMatrix.copyRawDataFrom(raw); - - this._pFrustumCorners[0] = this._pFrustumCorners[9] = this._pNear*left; - this._pFrustumCorners[3] = this._pFrustumCorners[6] = this._pNear*right; - this._pFrustumCorners[1] = this._pFrustumCorners[4] = this._pNear*top; - this._pFrustumCorners[7] = this._pFrustumCorners[10] = this._pNear*bottom; - - this._pFrustumCorners[12] = this._pFrustumCorners[21] = this._pFar*left; - this._pFrustumCorners[15] = this._pFrustumCorners[18] = this._pFar*right; - this._pFrustumCorners[13] = this._pFrustumCorners[16] = this._pFar*top; - this._pFrustumCorners[19] = this._pFrustumCorners[22] = this._pFar*bottom; - - this._pFrustumCorners[2] = this._pFrustumCorners[5] = this._pFrustumCorners[8] = this._pFrustumCorners[11] = this._pNear; - this._pFrustumCorners[14] = this._pFrustumCorners[17] = this._pFrustumCorners[20] = this._pFrustumCorners[23] = this._pFar; - - this._pMatrixInvalid = false; - - - } - } -} \ No newline at end of file diff --git a/src/away/projections/ProjectionBase.ts b/src/away/projections/ProjectionBase.ts deleted file mode 100644 index 84743359..00000000 --- a/src/away/projections/ProjectionBase.ts +++ /dev/null @@ -1,207 +0,0 @@ -/// - -module away.projections -{ - export class ProjectionBase extends away.events.EventDispatcher implements IProjection - { - public _pMatrix:away.geom.Matrix3D = new away.geom.Matrix3D(); - public _pScissorRect:away.geom.Rectangle = new away.geom.Rectangle(); - public _pViewPort:away.geom.Rectangle = new away.geom.Rectangle(); - public _pNear:number = 20; - public _pFar:number = 3000; - public _pAspectRatio:number = 1; - - public _pMatrixInvalid:boolean = true; - public _pFrustumCorners:number[] = []; - public _pCoordinateSystem:string; - public _pOriginX:number = 0.5; - public _pOriginY:number = 0.5; - - private _unprojection:away.geom.Matrix3D; - private _unprojectionInvalid:boolean = true; - - constructor(coordinateSystem:string = "leftHanded") - { - super(); - - this.coordinateSystem = coordinateSystem; - } - - /** - * The handedness of the coordinate system projection. The default is LEFT_HANDED. - */ - public get coordinateSystem():string - { - return this._pCoordinateSystem; - } - - public set coordinateSystem(value:string) - { - if (this._pCoordinateSystem == value) - return; - - this._pCoordinateSystem = value; - - this.pInvalidateMatrix(); - } - - public get frustumCorners():number[] - { - return this._pFrustumCorners; - } - - public set frustumCorners(frustumCorners:number[]) - { - this._pFrustumCorners = frustumCorners; - } - - public get matrix():away.geom.Matrix3D - { - if (this._pMatrixInvalid) { - this.pUpdateMatrix(); - this._pMatrixInvalid = false; - } - return this._pMatrix; - } - - public set matrix(value:away.geom.Matrix3D) - { - this._pMatrix = value; - this.pInvalidateMatrix(); - } - - public get near():number - { - return this._pNear; - } - - public set near(value:number) - { - if (value == this._pNear) { - return; - } - this._pNear = value; - this.pInvalidateMatrix(); - } - - public get originX():number - { - return this._pOriginX; - } - - public set originX(value:number) - { - if (this._pOriginX == value) - return; - - this._pOriginX = value; - } - - public get originY():number - { - return this._pOriginY; - } - - public set originY(value:number) - { - if (this._pOriginY == value) - return; - - this._pOriginY = value; - } - - public get far():number - { - return this._pFar; - } - - public set far(value:number) - { - if (value == this._pFar) { - return; - } - this._pFar = value; - this.pInvalidateMatrix(); - } - - public project(point3d:away.geom.Vector3D):away.geom.Vector3D - { - var v:away.geom.Vector3D = this.matrix.transformVector(point3d); - v.x = v.x/v.w; - v.y = -v.y/v.w; - - //z is unaffected by transform - v.z = point3d.z; - - return v; - } - - public get unprojectionMatrix():away.geom.Matrix3D - { - if (this._unprojectionInvalid) { - if (!this._unprojection) - this._unprojection = new away.geom.Matrix3D(); - - this._unprojection.copyFrom(this.matrix); - this._unprojection.invert(); - this._unprojectionInvalid = false; - } - return this._unprojection; - } - - public unproject(nX:number, nY:number, sZ:number):away.geom.Vector3D - { - throw new away.errors.AbstractMethodError(); - } - - public clone():ProjectionBase - { - throw new away.errors.AbstractMethodError(); - } - - public get _iAspectRatio():number - { - return this._pAspectRatio; - } - - public set _iAspectRatio(value:number) - { - if (this._pAspectRatio == value) - return; - - this._pAspectRatio = value; - - this.pInvalidateMatrix(); - } - - public pInvalidateMatrix() - { - this._pMatrixInvalid = true; - this._unprojectionInvalid = true; - this.dispatchEvent(new away.events.ProjectionEvent(away.events.ProjectionEvent.MATRIX_CHANGED, this)); - } - - public pUpdateMatrix() - { - throw new away.errors.AbstractMethodError(); - } - - public _iUpdateScissorRect(x:number, y:number, width:number, height:number) - { - this._pScissorRect.x = x; - this._pScissorRect.y = y; - this._pScissorRect.width = width; - this._pScissorRect.height = height; - this.pInvalidateMatrix(); - } - - public _iUpdateViewport(x:number, y:number, width:number, height:number) - { - this._pViewPort.x = x; - this._pViewPort.y = y; - this._pViewPort.width = width; - this._pViewPort.height = height; - this.pInvalidateMatrix(); - } - } -} \ No newline at end of file diff --git a/src/away/textures/BitmapCubeTexture.ts b/src/away/textures/BitmapCubeTexture.ts deleted file mode 100755 index 3be19539..00000000 --- a/src/away/textures/BitmapCubeTexture.ts +++ /dev/null @@ -1,154 +0,0 @@ -/// - -module away.textures -{ - import BitmapData = away.base.BitmapData; - - export class BitmapCubeTexture extends CubeTextureBase - { - private _bitmapDatas:Array = new Array(6); - - /** - * The texture on the cube's right face. - */ - public get positiveX():BitmapData - { - return this._bitmapDatas[0]; - } - - public set positiveX(value:BitmapData) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[0] = value; - } - - /** - * The texture on the cube's left face. - */ - public get negativeX():BitmapData - { - return this._bitmapDatas[1]; - } - - public set negativeX(value:BitmapData) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[1] = value; - } - - /** - * The texture on the cube's top face. - */ - public get positiveY():BitmapData - { - return this._bitmapDatas[2]; - } - - public set positiveY(value:BitmapData) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[2] = value; - } - - /** - * The texture on the cube's bottom face. - */ - public get negativeY():BitmapData - { - return this._bitmapDatas[3]; - } - - public set negativeY(value:BitmapData) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[3] = value; - } - - /** - * The texture on the cube's far face. - */ - public get positiveZ():BitmapData - { - return this._bitmapDatas[4]; - } - - public set positiveZ(value:BitmapData) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[4] = value; - } - - /** - * The texture on the cube's near face. - */ - public get negativeZ():BitmapData - { - return this._bitmapDatas[5]; - } - - public set negativeZ(value:BitmapData) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._bitmapDatas[5] = value; - } - - constructor(posX:BitmapData, negX:BitmapData, posY:BitmapData, negY:BitmapData, posZ:BitmapData, negZ:BitmapData, generateMipmaps:boolean = false) - { - super(generateMipmaps); - - this._testSize(this._bitmapDatas[0] = posX); - this._testSize(this._bitmapDatas[1] = negX); - this._testSize(this._bitmapDatas[2] = posY); - this._testSize(this._bitmapDatas[3] = negY); - this._testSize(this._bitmapDatas[4] = posZ); - this._testSize(this._bitmapDatas[5] = negZ); - - this.invalidateContent(); - - this._pSetSize(posX.width); - } - - /** - * - * @param value - * @private - */ - private _testSize(value:BitmapData) - { - if (value.width != value.height) - throw new Error("BitmapData should have equal width and height!"); - if (!away.utils.TextureUtils.isBitmapDataValid(value)) - throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); - } - - public dispose() - { - super.dispose(); - - var len:number = this._bitmapDatas.length - for (var i:number = 0; i < len; i++) { - this._bitmapDatas[i].dispose(); - this._bitmapDatas[i] = null; - } - - this._bitmapDatas = null; - } - - public _iGetTextureData(side:number):BitmapData - { - return this._bitmapDatas[side]; - } - } -} diff --git a/src/away/textures/BitmapTexture.ts b/src/away/textures/BitmapTexture.ts deleted file mode 100644 index 4f757011..00000000 --- a/src/away/textures/BitmapTexture.ts +++ /dev/null @@ -1,55 +0,0 @@ -/// - -module away.textures -{ - import BitmapData = away.base.BitmapData; - - export class BitmapTexture extends Texture2DBase - { - public _bitmapData:BitmapData; - - /** - * - * @returns {BitmapData} - */ - public get bitmapData():BitmapData - { - return this._bitmapData; - } - - public set bitmapData(value:BitmapData) - { - if (this._bitmapData == value) - return; - - if (!away.utils.TextureUtils.isBitmapDataValid(value)) - throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); - - this._bitmapData = value; - - this.invalidateContent(); - - this._pSetSize(value.width, value.height); - } - - constructor(bitmapData:BitmapData, generateMipmaps:boolean = false) - { - super(generateMipmaps); - - this.bitmapData = bitmapData; - } - - public dispose() - { - super.dispose(); - - this._bitmapData.dispose(); - this._bitmapData = null; - } - - public _iGetTextureData():BitmapData - { - return this._bitmapData; - } - } -} diff --git a/src/away/textures/CubeTextureBase.ts b/src/away/textures/CubeTextureBase.ts deleted file mode 100644 index d5a2ebaf..00000000 --- a/src/away/textures/CubeTextureBase.ts +++ /dev/null @@ -1,78 +0,0 @@ -/// - -module away.textures -{ - import BitmapData = away.base.BitmapData; - import AbstractMethodError = away.errors.AbstractMethodError; - - export class CubeTextureBase extends TextureProxyBase - { - public _mipmapDataArray:Array> = new Array>(6); - public _mipmapDataDirtyArray:Array = new Array(6); - - constructor(generateMipmaps:boolean = false) - { - super(generateMipmaps); - } - - /** - * - * @param width - * @param height - * @private - */ - public _pSetSize(size:number) - { - if (this._pSize != size) - this.invalidateSize(); - - for (var i:number = 0; i < 6; i++) - this._mipmapDataDirtyArray[i] = true; - - this._pSize = size; - } - - /** - * @inheritDoc - */ - public dispose() - { - super.dispose(); - - for (var i:number = 0; i < 6; i++) { - var mipmapData:Array = this._mipmapDataArray[i]; - var len:number = mipmapData.length; - for (var j:number = 0; j < len; j++) - MipmapGenerator.freeMipMapHolder(mipmapData[j]); - } - } - - /** - * - */ - public invalidateContent():void - { - super.invalidateContent(); - - for (var i:number = 0; i < 6; i++) - this._mipmapDataDirtyArray[i] = true; - } - - public _iGetMipmapData(side:number):Array - { - if (this._mipmapDataDirtyArray[side]) { - this._mipmapDataDirtyArray[side] = false; - - var mipmapData:Array = this._mipmapDataArray[side] || (this._mipmapDataArray[side] = new Array()); - MipmapGenerator.generateMipMaps(this._iGetTextureData(side), mipmapData, true); - } - - return this._mipmapDataArray[side]; - } - - public _iGetTextureData(side:number):any - { - throw new AbstractMethodError(); - } - } -} \ No newline at end of file diff --git a/src/away/textures/ImageCubeTexture.ts b/src/away/textures/ImageCubeTexture.ts deleted file mode 100755 index 6597d5f8..00000000 --- a/src/away/textures/ImageCubeTexture.ts +++ /dev/null @@ -1,134 +0,0 @@ -/// - -module away.textures -{ - export class ImageCubeTexture extends CubeTextureBase - { - private _htmlImageElements:Array = new Array(6); - - /** - * The texture on the cube's right face. - */ - public get positiveX():HTMLImageElement - { - return this._htmlImageElements[0]; - } - - public set positiveX(value:HTMLImageElement) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[0] = value; - } - - /** - * The texture on the cube's left face. - */ - public get negativeX():HTMLImageElement - { - return this._htmlImageElements[1]; - } - - public set negativeX(value:HTMLImageElement) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[1] = value; - } - - /** - * The texture on the cube's top face. - */ - public get positiveY():HTMLImageElement - { - return this._htmlImageElements[2]; - } - - public set positiveY(value:HTMLImageElement) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[2] = value; - } - - /** - * The texture on the cube's bottom face. - */ - public get negativeY():HTMLImageElement - { - return this._htmlImageElements[3]; - } - - public set negativeY(value:HTMLImageElement) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[3] = value; - } - - /** - * The texture on the cube's far face. - */ - public get positiveZ():HTMLImageElement - { - return this._htmlImageElements[4]; - } - - public set positiveZ(value:HTMLImageElement) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[4] = value; - } - - /** - * The texture on the cube's near face. - */ - public get negativeZ():HTMLImageElement - { - return this._htmlImageElements[5]; - } - - public set negativeZ(value:HTMLImageElement) - { - this._testSize(value); - this.invalidateContent(); - this._pSetSize(value.width); - this._htmlImageElements[5] = value; - } - - constructor(posX:HTMLImageElement, negX:HTMLImageElement, posY:HTMLImageElement, negY:HTMLImageElement, posZ:HTMLImageElement, negZ:HTMLImageElement, generateMipmaps:boolean = false) - { - super(generateMipmaps); - - this._testSize(this._htmlImageElements[0] = posX); - this._testSize(this._htmlImageElements[1] = negX); - this._testSize(this._htmlImageElements[2] = posY); - this._testSize(this._htmlImageElements[3] = negY); - this._testSize(this._htmlImageElements[4] = posZ); - this._testSize(this._htmlImageElements[5] = negZ); - - this.invalidateContent(); - - this._pSetSize(posX.width); - } - - private _testSize(value:HTMLImageElement) - { - if (value.width != value.height) - throw new Error("BitmapData should have equal width and height!"); - if (!away.utils.TextureUtils.isHTMLImageElementValid(value)) - throw new Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); - } - - public _iGetTextureData(side:number):HTMLImageElement - { - return this._htmlImageElements[side]; - } - } -} diff --git a/src/away/textures/ImageTexture.ts b/src/away/textures/ImageTexture.ts deleted file mode 100644 index 3268f0ea..00000000 --- a/src/away/textures/ImageTexture.ts +++ /dev/null @@ -1,49 +0,0 @@ -/// - -module away.textures -{ - - export class ImageTexture extends Texture2DBase - { - private _htmlImageElement:HTMLImageElement; - - /** - * - * @param htmlImageElement - * @param generateMipmaps - */ - constructor(htmlImageElement:HTMLImageElement, generateMipmaps:boolean = false) - { - super(generateMipmaps); - - this.htmlImageElement = htmlImageElement; - } - - /** - * - */ - public get htmlImageElement():HTMLImageElement - { - return this._htmlImageElement; - } - - public set htmlImageElement(value:HTMLImageElement) - { - if (this._htmlImageElement == value) - return; - - if (!away.utils.TextureUtils.isHTMLImageElementValid(value)) - throw new away.errors.Error("Invalid bitmapData: Width and height must be power of 2 and cannot exceed 2048"); - - this._htmlImageElement = value; - - this.invalidateContent(); - this._pSetSize(value.width, value.height); - } - - public _iGetTextureData():HTMLImageElement - { - return this._htmlImageElement; - } - } -} diff --git a/src/away/textures/MipmapGenerator.ts b/src/away/textures/MipmapGenerator.ts deleted file mode 100644 index 78ef52a0..00000000 --- a/src/away/textures/MipmapGenerator.ts +++ /dev/null @@ -1,99 +0,0 @@ -/// - -module away.textures -{ - import BitmapData = away.base.BitmapData; - import Matrix = away.geom.Matrix; - import Rectangle = away.geom.Rectangle; - - /** - * MipmapGenerator is a helper class that uploads BitmapData to a Texture including mipmap levels. - */ - export class MipmapGenerator - { - private static _mipMaps = []; - private static _mipMapUses = []; - - private static _matrix:Matrix = new Matrix(); - private static _rect:Rectangle = new Rectangle(); - private static _source:BitmapData; - - /** - * Uploads a BitmapData with mip maps to a target Texture object. - * @param source The source to upload. - * @param target The target Texture to upload to. - * @param mipmap An optional mip map holder to avoids creating new instances for fe animated materials. - * @param alpha Indicate whether or not the uploaded bitmapData is transparent. - */ - public static generateMipMaps(source:HTMLImageElement, output?:Array, alpha?:boolean); - public static generateMipMaps(source:BitmapData, output?:Array, alpha?:boolean); - public static generateMipMaps(source:any, output?:Array, alpha:boolean = false) - { - var w:number = source.width; - var h:number = source.height; - var i:number = 0; - - var mipmap:BitmapData; - - MipmapGenerator._rect.width = w; - MipmapGenerator._rect.height = h; - - while (w >= 1 && h >= 1) { - - mipmap = output[i] = MipmapGenerator._getMipmapHolder(output[i], w, h); - - if (alpha) - mipmap.fillRect(MipmapGenerator._rect, 0); - - MipmapGenerator._matrix.a = MipmapGenerator._rect.width/source.width; - MipmapGenerator._matrix.d = MipmapGenerator._rect.height/source.height; - - mipmap.draw(source, MipmapGenerator._matrix); //TODO: smoothing? - - w >>= 1; - h >>= 1; - - MipmapGenerator._rect.width = w > 1? w : 1; - MipmapGenerator._rect.height = h > 1? h : 1; - - i++; - } - } - - private static _getMipmapHolder(mipMapHolder:BitmapData, newW:number, newH:number):BitmapData - { - if (mipMapHolder) { - if (mipMapHolder.width == newW && mipMapHolder.height == newH) - return mipMapHolder; - - MipmapGenerator.freeMipMapHolder(mipMapHolder); - } - - if (!MipmapGenerator._mipMaps[newW]) { - MipmapGenerator._mipMaps[newW] = []; - MipmapGenerator._mipMapUses[newW] = []; - } - - if (!MipmapGenerator._mipMaps[newW][newH]) { - mipMapHolder = MipmapGenerator._mipMaps[newW][newH] = new BitmapData(newW, newH, true); - MipmapGenerator._mipMapUses[newW][newH] = 1; - } else { - MipmapGenerator._mipMapUses[newW][newH] = MipmapGenerator._mipMapUses[newW][newH] + 1; - mipMapHolder = MipmapGenerator._mipMaps[newW][newH]; - } - - return mipMapHolder; - } - - public static freeMipMapHolder(mipMapHolder:BitmapData) - { - var holderWidth:number = mipMapHolder.width; - var holderHeight:number = mipMapHolder.height; - - if (--MipmapGenerator._mipMapUses[holderWidth][holderHeight] == 0) { - MipmapGenerator._mipMaps[holderWidth][holderHeight].dispose(); - MipmapGenerator._mipMaps[holderWidth][holderHeight] = null; - } - } - } -} diff --git a/src/away/textures/RenderTexture.ts b/src/away/textures/RenderTexture.ts deleted file mode 100644 index 5ef0f60e..00000000 --- a/src/away/textures/RenderTexture.ts +++ /dev/null @@ -1,57 +0,0 @@ -/// - -module away.textures -{ - export class RenderTexture extends Texture2DBase - { - /** - * - * @returns {number} - */ - public get width():number - { - return this._pWidth; - } - - public set width(value:number) - { - if (value == this._pWidth) - return; - - if (!away.utils.TextureUtils.isDimensionValid(value)) - throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); - - this.invalidateContent(); - - this._pSetSize(value, this._pHeight); - } - - /** - * - * @returns {number} - */ - public get height():number - { - return this._pHeight; - } - - public set height(value:number) - { - if (value == this._pHeight) - return; - - if (!away.utils.TextureUtils.isDimensionValid(value)) - throw new Error("Invalid size: Width and height must be power of 2 and cannot exceed 2048"); - - this.invalidateContent(); - this._pSetSize(this._pWidth, value); - } - - constructor(width:number, height:number) - { - super(false); - - this._pSetSize(width, height); - } - } -} diff --git a/src/away/textures/SpecularBitmapTexture.ts b/src/away/textures/SpecularBitmapTexture.ts deleted file mode 100644 index 0f7ae93d..00000000 --- a/src/away/textures/SpecularBitmapTexture.ts +++ /dev/null @@ -1,95 +0,0 @@ -/// - -module away.textures -{ - import BitmapData = away.base.BitmapData; - import BitmapDataChannel = away.base.BitmapDataChannel; - import Point = away.geom.Point; - import Rectangle = away.geom.Rectangle; - - /** - * A convenience texture that encodes a specular map in the red channel, and the gloss map in the green channel, as expected by BasicSpecularMapMethod - */ - export class SpecularBitmapTexture extends BitmapTexture - { - private _specularMap:BitmapData; - private _glossMap:BitmapData; - - constructor(specularMap:BitmapData = null, glossMap:BitmapData = null, generateMipmaps:boolean = true) - { - var bmd:BitmapData = specularMap? specularMap : glossMap; - - bmd = bmd? new BitmapData(bmd.width, bmd.height, false, 0xffffff) : new BitmapData(1, 1, false, 0xffffff); - - super(bmd, generateMipmaps); - - this.specularMap = specularMap; - this.glossMap = glossMap; - } - - public get specularMap():BitmapData - { - return this._specularMap; - } - - public set specularMap(value:BitmapData) - { - this._specularMap = value; - - this.invalidateContent(); - - this._testSize(); - } - - public get glossMap():BitmapData - { - return this._glossMap; - } - - public set glossMap(value:BitmapData) - { - this._glossMap = value; - this.invalidateContent(); - - this._testSize(); - } - - private _testSize() - { - var w:Number, h:Number; - - if (this._specularMap) { - w = this._specularMap.width; - h = this._specularMap.height; - } else if (this._glossMap) { - w = this._glossMap.width; - h = this._glossMap.height; - } else { - w = 1; - h = 1; - } - - if (w != this._bitmapData.width && h != this._bitmapData.height) { - var oldBitmap:BitmapData = this._bitmapData; - this.bitmapData = new BitmapData(this._specularMap.width, this._specularMap.height, false, 0xffffff); - oldBitmap.dispose(); - } - } - - public _iGetTextureData():away.base.BitmapData - { - var rect:Rectangle = this._specularMap.rect; - var origin:Point = new Point(); - - this._bitmapData.fillRect(rect, 0xffffff); - - if (this._glossMap) - this._bitmapData.copyChannel(this._glossMap, rect, origin, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); - - if (this._specularMap) - this._bitmapData.copyChannel(this._specularMap, rect, origin, BitmapDataChannel.RED, BitmapDataChannel.RED); - - return this._bitmapData; - } - } -} diff --git a/src/away/textures/Texture2DBase.ts b/src/away/textures/Texture2DBase.ts deleted file mode 100644 index 70f29757..00000000 --- a/src/away/textures/Texture2DBase.ts +++ /dev/null @@ -1,102 +0,0 @@ -/// - -module away.textures -{ - import BitmapData = away.base.BitmapData; - - export class Texture2DBase extends TextureProxyBase - { - private _mipmapData:Array; - private _mipmapDataDirty:boolean; - public _pWidth:number; - public _pHeight:number; - - /** - * - * @returns {number} - */ - public get width():number - { - return this._pWidth; - } - - /** - * - * @returns {number} - */ - public get height():number - { - return this._pHeight; - } - - public get size():number - { - return this._pWidth; - } - - constructor(generateMipmaps:boolean = false) - { - super(generateMipmaps); - } - - /** - * @inheritDoc - */ - public dispose() - { - super.dispose(); - - if (this._mipmapData) { - var len:number = this._mipmapData.length; - for (var i:number = 0; i < len; i++) - MipmapGenerator.freeMipMapHolder(this._mipmapData[i]); - } - } - - /** - * - */ - public invalidateContent():void - { - super.invalidateContent(); - - this._mipmapDataDirty = true; - } - - /** - * - * @param width - * @param height - * @private - */ - public _pSetSize(width:number, height:number) - { - if (this._pWidth != width || this._pHeight != height) - this.invalidateSize(); - - this._mipmapDataDirty = true; - - this._pWidth = width; - this._pHeight = height; - } - - public _iGetMipmapData():Array - { - if (this._mipmapDataDirty) { - this._mipmapDataDirty = false; - - if (!this._mipmapData) - this._mipmapData = new Array(); - - away.textures.MipmapGenerator.generateMipMaps(this._iGetTextureData(), this._mipmapData, true); - } - - return this._mipmapData; - } - - public _iGetTextureData():any - { - throw new away.errors.AbstractMethodError(); - } - } -} diff --git a/src/away/textures/TextureProxyBase.ts b/src/away/textures/TextureProxyBase.ts deleted file mode 100644 index f20ab119..00000000 --- a/src/away/textures/TextureProxyBase.ts +++ /dev/null @@ -1,117 +0,0 @@ -/// - -module away.textures -{ - /** - * - */ - export class TextureProxyBase extends away.library.NamedAssetBase implements away.library.IAsset - { - public _pSize:number; - public _pFormat:string = "bgra" - private _hasMipmaps:boolean; - private _generateMipmaps:boolean; - private _textureData:Array = new Array(); - - /** - * - */ - constructor(generateMipmaps:boolean = false) - { - super(); - - this._generateMipmaps = this._hasMipmaps = generateMipmaps; - } - - public get size():number - { - return this._pSize; - } - - public get hasMipmaps():boolean - { - return this._hasMipmaps; - } - - /** - * - * @returns {string} - */ - public get format():string - { - return this._pFormat; - } - - /** - * - * @returns {boolean} - */ - public get generateMipmaps():boolean - { - return this._generateMipmaps; - } - - public set generateMipmaps(value:boolean) - { - if (this._generateMipmaps == value) - return; - - this._generateMipmaps = this._hasMipmaps = value; - - this.invalidateContent(); - } - - /** - * - * @returns {string} - */ - public get assetType():string - { - return away.library.AssetType.TEXTURE; - } - - /** - * - */ - public invalidateContent():void - { - var len:number = this._textureData.length - for (var i:number = 0; i < len; i++) - this._textureData[i].invalidate(); - } - - /** - * - * @private - */ - public invalidateSize():void - { - while (this._textureData.length) - this._textureData[0].dispose(); - } - - /** - * @inheritDoc - */ - public dispose() - { - while (this._textureData.length) - this._textureData[0].dispose(); - } - - - public _iAddTextureData(textureData:away.pool.ITextureData):away.pool.ITextureData - { - this._textureData.push(textureData); - - return textureData; - } - - public _iRemoveTextureData(textureData:away.pool.ITextureData):away.pool.ITextureData - { - this._textureData.splice(this._textureData.indexOf(textureData), 1); - - return textureData; - } - } -} \ No newline at end of file diff --git a/src/away/utils/ByteArray.ts b/src/away/utils/ByteArray.ts deleted file mode 100644 index a08d86ae..00000000 --- a/src/away/utils/ByteArray.ts +++ /dev/null @@ -1,313 +0,0 @@ -/// - -module away.utils -{ - export class ByteArray extends ByteArrayBase - { - - public maxlength:number = 0; - public arraybytes; //ArrayBuffer - public unalignedarraybytestemp; //ArrayBuffer - - constructor() - { - super(); - this._mode = "Typed array"; - this.maxlength = 4; - this.arraybytes = new ArrayBuffer(this.maxlength); - this.unalignedarraybytestemp = new ArrayBuffer(16); - } - - public ensureWriteableSpace(n:number) - { - this.ensureSpace(n + this.position); - } - - public setArrayBuffer(aBuffer:ArrayBuffer):void - { - - this.ensureSpace(aBuffer.byteLength); - - this.length = aBuffer.byteLength; - - var inInt8AView:Int8Array = new Int8Array(aBuffer); - var localInt8View:Int8Array = new Int8Array(this.arraybytes, 0, this.length); - - localInt8View.set(inInt8AView); - - this.position = 0; - - } - - public getBytesAvailable():number - { - return ( this.length ) - ( this.position ); - } - - public ensureSpace(n:number) - { - if (n > this.maxlength) { - var newmaxlength:number = (n + 255) & (~255); - var newarraybuffer = new ArrayBuffer(newmaxlength); - var view = new Uint8Array(this.arraybytes, 0, this.length); - var newview = new Uint8Array(newarraybuffer, 0, this.length); - newview.set(view); // memcpy - this.arraybytes = newarraybuffer; - this.maxlength = newmaxlength; - } - } - - public writeByte(b:number) - { - this.ensureWriteableSpace(1); - var view = new Int8Array(this.arraybytes); - view[ this.position++ ] = (~~b); // ~~ is cast to int in js... - if (this.position > this.length) { - this.length = this.position; - } - } - - public readByte() - { - if (this.position >= this.length) { - throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; - } - var view = new Int8Array(this.arraybytes); - - return view[ this.position++ ]; - } - - public readBytes(bytes:ByteArray, offset:number = 0, length:number = 0) - { - - if (length == null) { - length = bytes.length; - } - - bytes.ensureWriteableSpace(offset + length); - - var byteView:Int8Array = new Int8Array(bytes.arraybytes); - var localByteView:Int8Array = new Int8Array(this.arraybytes); - - byteView.set(localByteView.subarray(this.position, this.position + length), offset); - - this.position += length; - - if (length + offset > bytes.length) { - bytes.length += ( length + offset ) - bytes.length; - } - - } - - public writeUnsignedByte(b:number) - { - this.ensureWriteableSpace(1); - var view = new Uint8Array(this.arraybytes); - view[this.position++] = (~~b) & 0xff; // ~~ is cast to int in js... - if (this.position > this.length) { - this.length = this.position; - } - } - - public readUnsignedByte() - { - if (this.position >= this.length) { - throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; - } - var view = new Uint8Array(this.arraybytes); - return view[this.position++]; - } - - public writeUnsignedShort(b:number) - { - this.ensureWriteableSpace(2); - if (( this.position & 1 ) == 0) { - var view = new Uint16Array(this.arraybytes); - view[ this.position >> 1 ] = (~~b) & 0xffff; // ~~ is cast to int in js... - } else { - var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); - view[0] = (~~b) & 0xffff; - var view2 = new Uint8Array(this.arraybytes, this.position, 2); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); - view2.set(view3); - } - this.position += 2; - if (this.position > this.length) { - this.length = this.position; - } - } - - public readUTFBytes(len:number):string - { - - var value:string = ""; - var max:number = this.position + len; - var data:DataView = new DataView(this.arraybytes); - - // utf8-encode - while (this.position < max) { - - var c:number = data.getUint8(this.position++); - - if (c < 0x80) { - - if (c == 0) break; - value += String.fromCharCode(c); - - } else if (c < 0xE0) { - - value += String.fromCharCode(((c & 0x3F) << 6) | (data.getUint8(this.position++) & 0x7F)); - - } else if (c < 0xF0) { - - var c2 = data.getUint8(this.position++); - value += String.fromCharCode(((c & 0x1F) << 12) | ((c2 & 0x7F) << 6) | (data.getUint8(this.position++) & 0x7F)); - - } else { - - var c2 = data.getUint8(this.position++); - var c3 = data.getUint8(this.position++); - - value += String.fromCharCode(((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 << 6) & 0x7F) | (data.getUint8(this.position++) & 0x7F)); - - } - - } - - return value; - - } - - public readInt():number - { - - var data:DataView = new DataView(this.arraybytes); - var int:number = data.getInt32(this.position, true); - - this.position += 4; - - return int; - - } - - public readShort():number - { - - var data:DataView = new DataView(this.arraybytes); - var short:number = data.getInt16(this.position, true); - - this.position += 2; - return short; - - } - - public readDouble():number - { - var data:DataView = new DataView(this.arraybytes); - var double:number = data.getFloat64(this.position, true); - - this.position += 8; - return double; - - } - - public readUnsignedShort() - { - if (this.position > this.length + 2) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - if (( this.position & 1 ) == 0) { - var view = new Uint16Array(this.arraybytes); - var pa:number = this.position >> 1; - this.position += 2; - return view[ pa ]; - } else { - var view = new Uint16Array(this.unalignedarraybytestemp, 0, 1); - var view2 = new Uint8Array(this.arraybytes, this.position, 2); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 2); - view3.set(view2); - this.position += 2; - return view[0]; - } - } - - public writeUnsignedInt(b:number) - { - this.ensureWriteableSpace(4); - if (( this.position & 3 ) == 0) { - var view = new Uint32Array(this.arraybytes); - view[ this.position >> 2 ] = (~~b) & 0xffffffff; // ~~ is cast to int in js... - } else { - var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); - view[0] = (~~b) & 0xffffffff; - var view2 = new Uint8Array(this.arraybytes, this.position, 4); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); - view2.set(view3); - } - this.position += 4; - if (this.position > this.length) { - this.length = this.position; - } - } - - public readUnsignedInt() - { - - if (this.position > this.length + 4) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - if (( this.position & 3 ) == 0) { - var view = new Uint32Array(this.arraybytes); - var pa:number = this.position >> 2; - this.position += 4; - return view[ pa ]; - } else { - var view = new Uint32Array(this.unalignedarraybytestemp, 0, 1); - var view2 = new Uint8Array(this.arraybytes, this.position, 4); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); - view3.set(view2); - this.position += 4; - return view[0]; - } - } - - public writeFloat(b:number) - { - this.ensureWriteableSpace(4); - if (( this.position & 3 ) == 0) { - var view = new Float32Array(this.arraybytes); - view[ this.position >> 2 ] = b; - } else { - var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); - view[0] = b; - var view2 = new Uint8Array(this.arraybytes, this.position, 4); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); - view2.set(view3); - } - this.position += 4; - if (this.position > this.length) { - this.length = this.position; - } - } - - public readFloat() - { - if (this.position > this.length + 4) { - throw "ByteArray out of bounds read. Positon=" + this.position + ", Length=" + this.length; - } - if ((this.position & 3) == 0) { - var view = new Float32Array(this.arraybytes); - var pa = this.position >> 2; - this.position += 4; - return view[pa]; - } else { - var view = new Float32Array(this.unalignedarraybytestemp, 0, 1); - var view2 = new Uint8Array(this.arraybytes, this.position, 4); - var view3 = new Uint8Array(this.unalignedarraybytestemp, 0, 4); - view3.set(view2); - this.position += 4; - return view[ 0 ]; - } - } - } -} \ No newline at end of file diff --git a/src/away/utils/ByteArrayBase.ts b/src/away/utils/ByteArrayBase.ts deleted file mode 100644 index 039fe78c..00000000 --- a/src/away/utils/ByteArrayBase.ts +++ /dev/null @@ -1,184 +0,0 @@ -/// - -module away.utils -{ - export class ByteArrayBase - { - public position:number = 0; - public length:number = 0; - public _mode:string = ""; - - public static Base64Key = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - constructor() - { - } - - public writeByte(b:number) - { - throw "Virtual method"; - } - - public readByte():number - { - throw "Virtual method"; - } - - public writeUnsignedByte(b:number) - { - throw "Virtual method"; - } - - public readUnsignedByte():number - { - throw "Virtual method"; - } - - public writeUnsignedShort(b:number) - { - throw "Virtual method"; - } - - public readUnsignedShort():number - { - throw "Virtual method"; - } - - public writeUnsignedInt(b:number) - { - throw "Virtual method"; - } - - public readUnsignedInt():number - { - throw "Virtual method"; - } - - public writeFloat(b:number) - { - throw "Virtual method"; - } - - public toFloatBits(x:number) - { - throw "Virtual method"; - } - - public readFloat(b:number) - { - throw "Virtual method"; - } - - public fromFloatBits(x:number) - { - throw "Virtual method"; - } - - public getBytesAvailable():number - { - throw new away.errors.AbstractMethodError('ByteArrayBase, getBytesAvailable() not implemented '); - } - - public toString():string - { - return "[ByteArray] ( " + this._mode + " ) position=" + this.position + " length=" + this.length; - } - - public compareEqual(other, count) - { - if (count == undefined || count > this.length - this.position) - count = this.length - this.position; - if (count > other.length - other.position) - count = other.length - other.position; - var co0 = count; - var r = true; - while (r && count >= 4) { - count -= 4; - if (this.readUnsignedInt() != other.readUnsignedInt()) r = false; - } - while (r && count >= 1) { - count--; - if (this.readUnsignedByte() != other.readUnsignedByte()) r = false; - } - var c0; - this.position -= (c0 - count); - other.position -= (c0 - count); - return r; - } - - public writeBase64String(s:string) - { - for (var i:number = 0; i < s.length; i++) { - var v = s.charAt(i); - } - } - - public dumpToConsole() - { - var oldpos = this.position; - this.position = 0; - var nstep:number = 8; - - function asHexString(x, digits) - { - var lut:Array = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" ]; - var sh:string = ""; - for (var d:number = 0; d < digits; d++) { - sh = lut[(x >> (d << 2)) & 0xf] + sh; - } - return sh; - } - - for (var i = 0; i < this.length; i += nstep) { - var s:string = asHexString(i, 4) + ":"; - for (var j:number = 0; j < nstep && i + j < this.length; j++) { - s += " " + asHexString(this.readUnsignedByte(), 2); - } - console.log(s); - } - this.position = oldpos; - } - - public readBase64String(count:number) - { - if (count == undefined || count > this.length - this.position) - count = this.length - this.position; - if (!(count > 0)) return ""; - - return ByteArrayBase.internalGetBase64String(count, this.readUnsignedByte, this); - } - - public static internalGetBase64String(count, getUnsignedByteFunc, self) - { // return base64 string of the next count bytes - var r = ""; - var b0, b1, b2, enc1, enc2, enc3, enc4; - var base64Key = ByteArrayBase.Base64Key; - while (count >= 3) { - b0 = getUnsignedByteFunc.apply(self); - b1 = getUnsignedByteFunc.apply(self); - b2 = getUnsignedByteFunc.apply(self); - enc1 = b0 >> 2; - enc2 = ((b0 & 3) << 4) | (b1 >> 4); - enc3 = ((b1 & 15) << 2) | (b2 >> 6); - enc4 = b2 & 63; - r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + base64Key.charAt(enc4); - count -= 3; - } - // pad - if (count == 2) { - b0 = getUnsignedByteFunc.apply(self); - b1 = getUnsignedByteFunc.apply(self); - enc1 = b0 >> 2; - enc2 = ((b0 & 3) << 4) | (b1 >> 4); - enc3 = ((b1 & 15) << 2); - r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + base64Key.charAt(enc3) + "="; - } else if (count == 1) { - b0 = getUnsignedByteFunc.apply(self); - enc1 = b0 >> 2; - enc2 = ((b0 & 3) << 4); - r += base64Key.charAt(enc1) + base64Key.charAt(enc2) + "=="; - } - return r; - } - } -} \ No newline at end of file diff --git a/src/away/utils/ByteArrayBuffer.ts b/src/away/utils/ByteArrayBuffer.ts deleted file mode 100644 index a4039757..00000000 --- a/src/away/utils/ByteArrayBuffer.ts +++ /dev/null @@ -1,170 +0,0 @@ -/// - -module away.utils -{ - export class ByteArrayBuffer extends ByteArrayBase - { - - /* - public maxlength:number = 0; - public arraybytes; //ArrayBuffer - public unalignedarraybytestemp; //ArrayBuffer - */ - - public _bytes:number[]; - - constructor() - { - super(); - this._bytes = []; - this._mode = "Array"; - } - - public writeByte(b:number) - { - var bi:number = ~~b; - this._bytes[ this.position++ ] = bi; - if (this.position > this.length) { - this.length = this.position; - } - } - - public readByte():number - { - if (this.position >= this.length) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - return this._bytes[ this.position++ ]; - } - - public writeUnsignedByte(b:number) - { - var bi:number = ~~b; - this._bytes[this.position++] = bi & 0xff; - if (this.position > this.length) { - this.length = this.position; - } - } - - public readUnsignedByte():number - { - if (this.position >= this.length) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - return this._bytes[ this.position++ ]; - } - - public writeUnsignedShort(b:number) - { - var bi:number = ~~b; - this._bytes[ this.position++ ] = bi & 0xff; - this._bytes[ this.position++ ] = (bi >> 8) & 0xff; - if (this.position > this.length) { - this.length = this.position; - } - } - - public readUnsignedShort():number - { - if (this.position + 2 > this.length) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - var r:number = this._bytes[ this.position ] | ( this._bytes[ this.position + 1 ] << 8 ); - this.position += 2; - return r; - } - - public writeUnsignedInt(b:number) - { - var bi:number = ~~b; - this._bytes[ this.position++ ] = bi & 0xff; - this._bytes[ this.position++ ] = (bi >>> 8) & 0xff; - this._bytes[ this.position++ ] = (bi >>> 16) & 0xff; - this._bytes[ this.position++ ] = (bi >>> 24) & 0xff; - if (this.position > this.length) { - this.length = this.position; - } - } - - public readUnsignedInt():number - { - if (this.position + 4 > this.length) { - throw "ByteArray out of bounds read. Position=" + this.position + ", Length=" + this.length; - } - var r:number = this._bytes[ this.position ] | ( this._bytes[this.position + 1] << 8 ) | ( this._bytes[this.position + 2] << 16 ) | ( this._bytes[this.position + 3] << 24 ); - this.position += 4; - return r >>> 0; - } - - public writeFloat(b:number) - { - // this is crazy slow and silly, but as a fallback... - - this.writeUnsignedInt(this.toFloatBits(Number(b))); - } - - public toFloatBits(x:number) - { - // don't handle inf/nan yet - // special case zero - if (x == 0) { - return 0; - } - // remove the sign, after this we only deal with positive numbers - var sign:number = 0; - if (x < 0) { - x = -x; - sign = 1; - } else { - sign = 0; - } - // a float value is now defined as: x = (1+(mantissa*2^-23))*(2^(exponent-127)) - var exponent:number = Math.log(x)/Math.log(2); // rough exponent - exponent = Math.floor(exponent); - x = x*Math.pow(2, 23 - exponent); // normalize to 24 bits - var mantissa = Math.floor(x) - 0x800000; - exponent = exponent + 127; - return( ( sign << 31 ) >>> 0) | ( exponent << 23 ) | mantissa; - } - - public readFloat(b:number) - { - return this.fromFloatBits(this.readUnsignedInt()); - } - - public fromFloatBits(x:number) - { - if (x == 0) { - return 0; - } - var exponent:number = ( x >>> 23 ) & 0xff; - var mantissa:number = ( x & 0x7fffff ) | 0x800000; - var y = Math.pow(2, ( exponent - 127 ) - 23)*mantissa; - if (x >>> 31 != 0) { - y = -y; - } - return y; - } - - /* - public ensureWriteableSpace( n:number ) - { - this.ensureSpace( n + this.position ); - } - - private ensureSpace( n:number ) - { - if ( n > this.maxlength ) { - var newmaxlength:number = (n+255)&(~255); - var newarraybuffer = new ArrayBuffer(newmaxlength); - var view = new Uint8Array(this.arraybytes, 0, this.length); - var newview = new Uint8Array(newarraybuffer, 0, this.length); - newview.set(view); // memcpy - this.arraybytes = newarraybuffer; - this.maxlength = newmaxlength; - } - } - */ - - } -} \ No newline at end of file diff --git a/src/away/utils/CSS.ts b/src/away/utils/CSS.ts deleted file mode 100644 index d407d931..00000000 --- a/src/away/utils/CSS.ts +++ /dev/null @@ -1,72 +0,0 @@ -/// -module away.utils -{ - export class CSS - { - public static setElementSize(element:HTMLElement, width:number, height:number) - { - element.style.width = width + "px"; - element.style.height = height + "px"; - element["width"] = width; - element["height"] = height; - } - - public static setElementWidth(element:HTMLElement, width:number) - { - element.style.width = width + "px"; - element["width"] = width; - } - - public static setElementHeight(element:HTMLElement, height:number) - { - element.style.height = height + "px"; - element["height"] = height; - } - - public static setElementX(element:HTMLElement, x:number) - { - element.style.position = 'absolute'; - element.style.left = x + "px"; - } - - public static setElementY(element:HTMLElement, y:number) - { - element.style.position = 'absolute'; - element.style.top = y + "px"; - } - - public static getElementVisibility(element:HTMLElement):boolean - { - return element.style.visibility == 'visible'; - } - - public static setElementVisibility(element:HTMLElement, visible:boolean) - { - if (visible) { - element.style.visibility = 'visible'; - } else { - element.style.visibility = 'hidden'; - } - } - - public static setElementAlpha(element:HTMLElement, alpha:number) - { - if (element instanceof HTMLCanvasElement) { - var context = ( element).getContext("2d"); - context.globalAlpha = alpha; - } - } - - public static setElementPosition(element:HTMLElement, x:number, y:number, absolute:boolean = false) - { - if (absolute) { - element.style.position = "absolute"; - } else { - element.style.position = "relative"; - } - - element.style.left = x + "px"; - element.style.top = y + "px"; - } - } -} \ No newline at end of file diff --git a/src/away/utils/Cast.ts b/src/away/utils/Cast.ts deleted file mode 100644 index 3ffc0fd0..00000000 --- a/src/away/utils/Cast.ts +++ /dev/null @@ -1,326 +0,0 @@ -/// - -module away.utils -{ - /** - * Helper class for casting assets to usable objects - */ - export class Cast - { - private static _colorNames:Object; - private static _hexChars:string = "0123456789abcdefABCDEF"; - - private static _notClasses:Object = new Object(); - private static _classes:Object = new Object(); - - public static string(data:any):string - { - if (typeof(data) == 'function') - data = new data; - - if (typeof(data) == 'string') - return data; - - return data; - } - - public static byteArray(data:any):ByteArray - { - if (typeof(data) == 'function') - data = new data; - - if (data instanceof ByteArray) - return data; - - return data; - } - - // public static xml(data:any):XML - // { - // if (typeof(data) == 'function') - // data = new data; - // - // if (data is XML) - // return data; - // - // return XML(data); - // } - - private static isHex(str:string):boolean - { - var length:number /*int*/ = str.length; - for (var i:number /*int*/ = 0; i < length; ++i) { - if (this._hexChars.indexOf(str.charAt(i)) == -1) - return false; - } - - return true; - } - - public static tryColor(data:any):number /*uint*/ - { - if (typeof(data) == 'number' /*uint*/) - return Math.floor( data); - - if (typeof(data) == 'string') { - if (data == "random") - return Math.floor(Math.random()*0x1000000); - - if (this._colorNames == null) { - this._colorNames = new Object(); - this._colorNames["steelblue"] = 0x4682B4; - this._colorNames["royalblue"] = 0x041690; - this._colorNames["cornflowerblue"] = 0x6495ED; - this._colorNames["lightsteelblue"] = 0xB0C4DE; - this._colorNames["mediumslateblue"] = 0x7B68EE; - this._colorNames["slateblue"] = 0x6A5ACD; - this._colorNames["darkslateblue"] = 0x483D8B; - this._colorNames["midnightblue"] = 0x191970; - this._colorNames["navy"] = 0x000080; - this._colorNames["darkblue"] = 0x00008B; - this._colorNames["mediumblue"] = 0x0000CD; - this._colorNames["blue"] = 0x0000FF; - this._colorNames["dodgerblue"] = 0x1E90FF; - this._colorNames["deepskyblue"] = 0x00BFFF; - this._colorNames["lightskyblue"] = 0x87CEFA; - this._colorNames["skyblue"] = 0x87CEEB; - this._colorNames["lightblue"] = 0xADD8E6; - this._colorNames["powderblue"] = 0xB0E0E6; - this._colorNames["azure"] = 0xF0FFFF; - this._colorNames["lightcyan"] = 0xE0FFFF; - this._colorNames["paleturquoise"] = 0xAFEEEE; - this._colorNames["mediumturquoise"] = 0x48D1CC; - this._colorNames["lightseagreen"] = 0x20B2AA; - this._colorNames["darkcyan"] = 0x008B8B; - this._colorNames["teal"] = 0x008080; - this._colorNames["cadetblue"] = 0x5F9EA0; - this._colorNames["darkturquoise"] = 0x00CED1; - this._colorNames["aqua"] = 0x00FFFF; - this._colorNames["cyan"] = 0x00FFFF; - this._colorNames["turquoise"] = 0x40E0D0; - this._colorNames["aquamarine"] = 0x7FFFD4; - this._colorNames["mediumaquamarine"] = 0x66CDAA; - this._colorNames["darkseagreen"] = 0x8FBC8F; - this._colorNames["mediumseagreen"] = 0x3CB371; - this._colorNames["seagreen"] = 0x2E8B57; - this._colorNames["darkgreen"] = 0x006400; - this._colorNames["green"] = 0x008000; - this._colorNames["forestgreen"] = 0x228B22; - this._colorNames["limegreen"] = 0x32CD32; - this._colorNames["lime"] = 0x00FF00; - this._colorNames["chartreuse"] = 0x7FFF00; - this._colorNames["lawngreen"] = 0x7CFC00; - this._colorNames["greenyellow"] = 0xADFF2F; - this._colorNames["yellowgreen"] = 0x9ACD32; - this._colorNames["palegreen"] = 0x98FB98; - this._colorNames["lightgreen"] = 0x90EE90; - this._colorNames["springgreen"] = 0x00FF7F; - this._colorNames["mediumspringgreen"] = 0x00FA9A; - this._colorNames["darkolivegreen"] = 0x556B2F; - this._colorNames["olivedrab"] = 0x6B8E23; - this._colorNames["olive"] = 0x808000; - this._colorNames["darkkhaki"] = 0xBDB76B; - this._colorNames["darkgoldenrod"] = 0xB8860B; - this._colorNames["goldenrod"] = 0xDAA520; - this._colorNames["gold"] = 0xFFD700; - this._colorNames["yellow"] = 0xFFFF00; - this._colorNames["khaki"] = 0xF0E68C; - this._colorNames["palegoldenrod"] = 0xEEE8AA; - this._colorNames["blanchedalmond"] = 0xFFEBCD; - this._colorNames["moccasin"] = 0xFFE4B5; - this._colorNames["wheat"] = 0xF5DEB3; - this._colorNames["navajowhite"] = 0xFFDEAD; - this._colorNames["burlywood"] = 0xDEB887; - this._colorNames["tan"] = 0xD2B48C; - this._colorNames["rosybrown"] = 0xBC8F8F; - this._colorNames["sienna"] = 0xA0522D; - this._colorNames["saddlebrown"] = 0x8B4513; - this._colorNames["chocolate"] = 0xD2691E; - this._colorNames["peru"] = 0xCD853F; - this._colorNames["sandybrown"] = 0xF4A460; - this._colorNames["darkred"] = 0x8B0000; - this._colorNames["maroon"] = 0x800000; - this._colorNames["brown"] = 0xA52A2A; - this._colorNames["firebrick"] = 0xB22222; - this._colorNames["indianred"] = 0xCD5C5C; - this._colorNames["lightcoral"] = 0xF08080; - this._colorNames["salmon"] = 0xFA8072; - this._colorNames["darksalmon"] = 0xE9967A; - this._colorNames["lightsalmon"] = 0xFFA07A; - this._colorNames["coral"] = 0xFF7F50; - this._colorNames["tomato"] = 0xFF6347; - this._colorNames["darkorange"] = 0xFF8C00; - this._colorNames["orange"] = 0xFFA500; - this._colorNames["orangered"] = 0xFF4500; - this._colorNames["crimson"] = 0xDC143C; - this._colorNames["red"] = 0xFF0000; - this._colorNames["deeppink"] = 0xFF1493; - this._colorNames["fuchsia"] = 0xFF00FF; - this._colorNames["magenta"] = 0xFF00FF; - this._colorNames["hotpink"] = 0xFF69B4; - this._colorNames["lightpink"] = 0xFFB6C1; - this._colorNames["pink"] = 0xFFC0CB; - this._colorNames["palevioletred"] = 0xDB7093; - this._colorNames["mediumvioletred"] = 0xC71585; - this._colorNames["purple"] = 0x800080; - this._colorNames["darkmagenta"] = 0x8B008B; - this._colorNames["mediumpurple"] = 0x9370DB; - this._colorNames["blueviolet"] = 0x8A2BE2; - this._colorNames["indigo"] = 0x4B0082; - this._colorNames["darkviolet"] = 0x9400D3; - this._colorNames["darkorchid"] = 0x9932CC; - this._colorNames["mediumorchid"] = 0xBA55D3; - this._colorNames["orchid"] = 0xDA70D6; - this._colorNames["violet"] = 0xEE82EE; - this._colorNames["plum"] = 0xDDA0DD; - this._colorNames["thistle"] = 0xD8BFD8; - this._colorNames["lavender"] = 0xE6E6FA; - this._colorNames["ghostwhite"] = 0xF8F8FF; - this._colorNames["aliceblue"] = 0xF0F8FF; - this._colorNames["mintcream"] = 0xF5FFFA; - this._colorNames["honeydew"] = 0xF0FFF0; - this._colorNames["lightgoldenrodyellow"] = 0xFAFAD2; - this._colorNames["lemonchiffon"] = 0xFFFACD; - this._colorNames["cornsilk"] = 0xFFF8DC; - this._colorNames["lightyellow"] = 0xFFFFE0; - this._colorNames["ivory"] = 0xFFFFF0; - this._colorNames["floralwhite"] = 0xFFFAF0; - this._colorNames["linen"] = 0xFAF0E6; - this._colorNames["oldlace"] = 0xFDF5E6; - this._colorNames["antiquewhite"] = 0xFAEBD7; - this._colorNames["bisque"] = 0xFFE4C4; - this._colorNames["peachpuff"] = 0xFFDAB9; - this._colorNames["papayawhip"] = 0xFFEFD5; - this._colorNames["beige"] = 0xF5F5DC; - this._colorNames["seashell"] = 0xFFF5EE; - this._colorNames["lavenderblush"] = 0xFFF0F5; - this._colorNames["mistyrose"] = 0xFFE4E1; - this._colorNames["snow"] = 0xFFFAFA; - this._colorNames["white"] = 0xFFFFFF; - this._colorNames["whitesmoke"] = 0xF5F5F5; - this._colorNames["gainsboro"] = 0xDCDCDC; - this._colorNames["lightgrey"] = 0xD3D3D3; - this._colorNames["silver"] = 0xC0C0C0; - this._colorNames["darkgrey"] = 0xA9A9A9; - this._colorNames["grey"] = 0x808080; - this._colorNames["lightslategrey"] = 0x778899; - this._colorNames["slategrey"] = 0x708090; - this._colorNames["dimgrey"] = 0x696969; - this._colorNames["darkslategrey"] = 0x2F4F4F; - this._colorNames["black"] = 0x000000; - this._colorNames["transparent"] = 0xFF000000; - } - - if (this._colorNames[data] != null) - return this._colorNames[data]; - - if ((( data).length == 6) && this.isHex(data)) - return parseInt("0x" + data); - } - - return null; - } - - public static color(data:any):number /*uint*/ - { - var result:number /*uint*/ = this.tryColor(data); - - if (result == null) - throw new away.errors.CastError("Can't cast to color: " + data); - - return result; - } - - public static tryClass(name:string):any - { - if (this._notClasses[name]) - return name; - - var result:any = this._classes[name]; - - if (result != null) - return result; - - try { - result = window[name]; - this._classes[name] = result; - return result; - } catch (e /*ReferenceError*/) { - } - - this._notClasses[name] = true; - - return name; - } - - public static bitmapData(data:any):away.base.BitmapData - { - if (data == null) - return null; - - if (typeof(data) == 'string') - data = this.tryClass(data); - - if (typeof(data) == 'function') { - try { - data = new data(); - } catch (e /*ArgumentError*/) { - data = new data(0, 0); - } - } - - if (data instanceof away.base.BitmapData) - return data; - - if (data instanceof away.textures.ImageTexture) - data = ( data).htmlImageElement; - - if (data instanceof HTMLImageElement) { - var imageElement:HTMLImageElement = data; - var bitmapData:away.base.BitmapData = new away.base.BitmapData(imageElement.width, imageElement.height, true, 0x0); - bitmapData.draw(imageElement) - return bitmapData; - } - - // if (data is DisplayObject) { - // var ds:DisplayObject = data as DisplayObject; - // var bmd:BitmapData = new BitmapData(ds.width, ds.height, true, 0x00FFFFFF); - // var mat:Matrix = ds.transform.matrix.clone(); - // mat.tx = 0; - // mat.ty = 0; - // bmd.draw(ds, mat, ds.transform.colorTransform, ds.blendMode, bmd.rect, true); - // return bmd; - // } - - throw new away.errors.CastError("Can't cast to BitmapData: " + data); - } - - public static bitmapTexture(data:any):away.textures.BitmapTexture - { - if (data == null) - return null; - - if (typeof(data) == 'string') - data = this.tryClass(data); - - if (typeof(data) == 'function') { - try { - data = new data(); - } catch (e /*ArgumentError*/) { - data = new data(0, 0); - } - } - - if (data instanceof away.textures.BitmapTexture) - return data; - - try { - var bmd:away.base.BitmapData = Cast.bitmapData(data); - return new away.textures.BitmapTexture(bmd); - } catch (e /*away.errors.CastError*/) { - } - - throw new away.errors.CastError("Can't cast to BitmapTexture: " + data); - } - } -} diff --git a/src/away/utils/ColorUtils.ts b/src/away/utils/ColorUtils.ts deleted file mode 100644 index 9eca03a1..00000000 --- a/src/away/utils/ColorUtils.ts +++ /dev/null @@ -1,43 +0,0 @@ -module away.utils -{ - export class ColorUtils - { - - public static float32ColorToARGB(float32Color:number):number[] - { - - var a:number = ( float32Color & 0xff000000 ) >>> 24 - var r:number = ( float32Color & 0xff0000 ) >>> 16; - var g:number = ( float32Color & 0xff00 ) >>> 8; - var b:number = float32Color & 0xff; - var result:number[] = [ a, r , g , b ]; - - return result; - - } - - private static componentToHex(c:number):string - { - - var hex = c.toString(16); - return hex.length == 1? "0" + hex : hex; - - } - - public static RGBToHexString(argb:number[]):string - { - - return "#" + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); - - } - - public static ARGBToHexString(argb:number[]):string - { - - return "#" + ColorUtils.componentToHex(argb[0]) + ColorUtils.componentToHex(argb[1]) + ColorUtils.componentToHex(argb[2]) + ColorUtils.componentToHex(argb[3]); - - } - - - } -} \ No newline at end of file diff --git a/src/away/utils/Debug.ts b/src/away/utils/Debug.ts deleted file mode 100644 index 77f74ce3..00000000 --- a/src/away/utils/Debug.ts +++ /dev/null @@ -1,55 +0,0 @@ -/// - -module away -{ - export class Debug - { - public static THROW_ERRORS:boolean = true; - public static ENABLE_LOG:boolean = true; - public static LOG_PI_ERRORS:boolean = true; - - private static keyword:string = null; - - public static breakpoint():void - { - away.Debug['break'](); - } - - public static throwPIROnKeyWordOnly(str:string, enable:boolean = true) - { - if (!enable) - away.Debug.keyword = null; - else - away.Debug.keyword = str; - } - - public static throwPIR(clss:string, fnc:string, msg:string) - { - Debug.logPIR('PartialImplementationError ' + clss, fnc, msg); - - if (Debug.THROW_ERRORS) { - if (away.Debug.keyword) { - - var e:string = clss + fnc + msg; - - if (e.indexOf(away.Debug.keyword) == -1) - return; - } - - throw new away.errors.PartialImplementationError(clss + '.' + fnc + ': ' + msg); - } - } - - private static logPIR(clss:string, fnc:string, msg:string = '') - { - if (Debug.LOG_PI_ERRORS) - console.log(clss + '.' + fnc + ': ' + msg); - } - - public static log(...args:any[]) - { - if (Debug.ENABLE_LOG) - console.log(args); - } - } -} diff --git a/src/away/utils/Delegate.ts b/src/away/utils/Delegate.ts deleted file mode 100644 index 68c910db..00000000 --- a/src/away/utils/Delegate.ts +++ /dev/null @@ -1,35 +0,0 @@ -/// - -module away.utils -{ - export class Delegate - { - private _func:Function; - - constructor(func:Function = null) - { - this._func = func; - } - - /** - Creates a functions wrapper for the original function so that it runs - in the provided context. - @parameter obj Context in which to run the function. - @paramater func Function to run. - */ - public static create(obj:Object, func:Function):Function - { - var f = function() - { - return func.apply(obj, arguments); - }; - - return f; - } - - public createDelegate(obj:Object):Function - { - return Delegate.create(obj, this._func); - } - } -} \ No newline at end of file diff --git a/src/away/utils/RequestAnimationFrame.ts b/src/away/utils/RequestAnimationFrame.ts deleted file mode 100644 index a4b9dda3..00000000 --- a/src/away/utils/RequestAnimationFrame.ts +++ /dev/null @@ -1,128 +0,0 @@ -/// - - -module away.utils -{ - - export class RequestAnimationFrame - { - - private _callback:Function; - private _callbackContext:Object; - private _active:boolean = false; - private _rafUpdateFunction:any; - private _prevTime:number; - private _dt:number; - private _currentTime:number; - private _argsArray:any[] = new Array(); - private _getTimer:Function; - - constructor(callback:Function, callbackContext:Object) - { - - - this._getTimer = away.utils.getTimer; - - this.setCallback(callback, callbackContext); - - this._rafUpdateFunction = () => - { - - if (this._active) { - - this._tick(); - - } - - } - - this._argsArray.push(this._dt); - - } - - // Public - - /** - * - * @param callback - * @param callbackContext - */ - public setCallback(callback:Function, callbackContext:Object) - { - - this._callback = callback; - this._callbackContext = callbackContext; - - } - - /** - * - */ - public start() - { - - this._prevTime = this._getTimer(); - this._active = true; - - if (window.requestAnimationFrame) - { - window.requestAnimationFrame(this._rafUpdateFunction); - } - else - { - if (window['mozRequestAnimationFrame']) { - window.requestAnimationFrame = window['mozRequestAnimationFrame']; - } else if (window['webkitRequestAnimationFrame']) { - window.requestAnimationFrame = window['webkitRequestAnimationFrame']; - } else if (window['oRequestAnimationFrame']) { - window.requestAnimationFrame = window['oRequestAnimationFrame']; - } - } - } - - /** - * - */ - public stop() - { - - this._active = false; - - } - - // Get / Set - - /** - * - * @returns {boolean} - */ - public get active():boolean - { - - return this._active; - - } - - // Private - - /** - * - * @private - */ - private _tick():void - { - - this._currentTime = this._getTimer(); - this._dt = this._currentTime - this._prevTime; - this._argsArray[0] = this._dt; - this._callback.apply(this._callbackContext, this._argsArray); - - window.requestAnimationFrame(this._rafUpdateFunction); - - this._prevTime = this._currentTime; - - } - - - } -} diff --git a/src/away/utils/TextureUtils.ts b/src/away/utils/TextureUtils.ts deleted file mode 100644 index 1c0e9a21..00000000 --- a/src/away/utils/TextureUtils.ts +++ /dev/null @@ -1,63 +0,0 @@ -/// -module away.utils -{ - //import flash.base.BitmapData; - - export class TextureUtils - { - private static MAX_SIZE:number = 2048; - - public static isBitmapDataValid(bitmapData:away.base.BitmapData):boolean - { - if (bitmapData == null) { - - return true; - - } - - return TextureUtils.isDimensionValid(bitmapData.width) && TextureUtils.isDimensionValid(bitmapData.height); - - } - - public static isHTMLImageElementValid(image:HTMLImageElement):boolean - { - if (image == null) { - - return true; - - } - - return TextureUtils.isDimensionValid(image.width) && TextureUtils.isDimensionValid(image.height); - - } - - public static isDimensionValid(d:number):boolean - { - - return d >= 1 && d <= TextureUtils.MAX_SIZE && TextureUtils.isPowerOfTwo(d); - - } - - public static isPowerOfTwo(value:number):boolean - { - - return value? ( ( value & -value ) == value ) : false; - - } - - public static getBestPowerOf2(value:number):number - { - - var p:number = 1; - - while (p < value) - p <<= 1; - - if (p > TextureUtils.MAX_SIZE) - p = TextureUtils.MAX_SIZE; - - return p; - - } - } -} diff --git a/src/away/utils/Timer.ts b/src/away/utils/Timer.ts deleted file mode 100644 index 2b8ac133..00000000 --- a/src/away/utils/Timer.ts +++ /dev/null @@ -1,127 +0,0 @@ -/// - -module away.utils -{ - - - //[native(cls="TimerClass", gc="exact", instance="TimerObject", methods="auto")] - //[Event(name="timerComplete", type="flash.events.TimerEvent")] - //[Event(name="timer", type="flash.events.TimerEvent")] - - export class Timer extends away.events.EventDispatcher - { - - private _delay:number; - private _repeatCount:number = 0; - private _currentCount:number = 0; - private _iid:number; - private _running:boolean = false; - - constructor(delay:number, repeatCount:number = 0) - { - - super(); - - - this._delay = delay; - this._repeatCount = repeatCount; - - if (isNaN(delay) || delay < 0) { - throw new away.errors.Error("Delay is negative or not a number"); - } - - } - - public get currentCount():number - { - - return this._currentCount; - - } - - public get delay():number - { - - return this._delay; - - } - - public set delay(value:number) - { - - this._delay = value; - - if (this._running) { - this.stop(); - this.start(); - } - - } - - public get repeatCount():number - { - - return this._repeatCount; - } - - public set repeatCount(value:number) - { - - this._repeatCount = value; - } - - public reset():void - { - - if (this._running) { - this.stop(); - } - - this._currentCount = 0; - - } - - public get running():boolean - { - - return this._running; - - } - - public start():void - { - - this._running = true; - clearInterval(this._iid); - this._iid = setInterval(() => this.tick(), this._delay); - - } - - public stop():void - { - - this._running = false; - clearInterval(this._iid); - - } - - private tick():void - { - - this._currentCount++; - - if (( this._repeatCount > 0 ) && this._currentCount >= this._repeatCount) { - - this.stop(); - this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER)); - this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER_COMPLETE)); - - } else { - - this.dispatchEvent(new away.events.TimerEvent(away.events.TimerEvent.TIMER)); - - } - - } - } -} diff --git a/src/away/utils/getTimer.ts b/src/away/utils/getTimer.ts deleted file mode 100644 index 67b0f63a..00000000 --- a/src/away/utils/getTimer.ts +++ /dev/null @@ -1,21 +0,0 @@ -/// - -module away.utils -{ - - - //[native(cls="TimerClass", gc="exact", instance="TimerObject", methods="auto")] - //[Event(name="timerComplete", type="flash.events.TimerEvent")] - //[Event(name="timer", type="flash.events.TimerEvent")] - - export function getTimer():number - { - - // number milliseconds of 1970/01/01 - // this different to AS3 implementation which gets the number of milliseconds - // since instance of Flash player was initialised - - return Date.now();//new Date().getTime(); - - } -} diff --git a/tests/AppHarness.js b/tests/AppHarness.js new file mode 100755 index 00000000..38dab5f3 --- /dev/null +++ b/tests/AppHarness.js @@ -0,0 +1,390 @@ +//--------------------------------------------------- +// Application Harness +var AppHarness = (function () { + //------------------------------------------------------------------------------ + function AppHarness() { + var _this = this; + //------------------------------------------------------------------------------ + this.tests = new Array(); + this.counter = 0; + this.sourceVisible = false; + this.loadDefault = true; + this.initFrameSet(); + this.initInterface(); + + this.previousBtn.onclick = function () { + return _this.nagigateBy(-1); + }; + this.nextBtn.onclick = function () { + return _this.nagigateBy(1); + }; + this.sourceBtn.onclick = function () { + return _this.toggleSource(); + }; + this.dropDown.onchange = function (e) { + return _this.dropDownChange(e); + }; + } + //------------------------------------------------------------------------------ + /** + * + * Load a test + * + * @param classPath - Module and Class path of test + * @param js Path to JavaScript file + * @param ts Path to Typescript file ( not yet used - reserved for future show source ) + */ + AppHarness.prototype.load = function (classPath, js, ts) { + this.loadFromURL(); + + if (this.loadDefault) { + window.history.pushState(js, js, '?test=' + js); + this.testIframe.src = 'frame.html?name=' + classPath + '&js=' + js; + this.srcIframe.src = "data:text/html;charset=utf-8," + this.createSourceViewHTML(ts); + } + }; + + /** + * + * Add a test to the AppHarness + * + * @param name Name of test + * @param classPath - Module and Class path of test + * @param js Path to JavaScript file + * @param ts Path to Typescript file ( not yet used - reserved for future show source ) + */ + AppHarness.prototype.addTest = function (name, classpath, js, ts) { + this.tests.push(new TestData(name, classpath, js, ts)); + }; + + /** + * + * Add a separator to the menu + * + * @param name + */ + AppHarness.prototype.addSeperator = function (name) { + if (typeof name === "undefined") { name = ''; } + this.tests.push(new TestData('-- ' + name, '', '', '')); + }; + + /** + * + * Start the application harness + * + */ + AppHarness.prototype.start = function (slideshowMode) { + var _this = this; + if (typeof slideshowMode === "undefined") { slideshowMode = false; } + for (var c = 0; c < this.tests.length; c++) { + var option = new Option(this.tests[c].name, String(c)); + this.dropDown.add(option); + } + + if (slideshowMode) { + setInterval(function () { + return _this.nagigateBy(1); + }, 15000); + } + }; + + //------------------------------------------------------------------------------ + AppHarness.prototype.loadFromURL = function () { + var queryParams = Utils.getQueryParams(document.location.search); + + if (queryParams.test != null) { + var l = this.tests.length; + + for (var c = 0; c < l; c++) { + if (this.tests[c].js == queryParams.test) { + console.log('======>>>> LOAD TEST'); + + this.navigateToSection(this.tests[c]); + this.loadDefault = false; + } + } + } + }; + + /** + * + */ + AppHarness.prototype.initInterface = function () { + var testSelector = document.createElement('div'); + testSelector.style.cssFloat = 'none'; + testSelector.style.position = 'absolute'; + testSelector.style.bottom = '15px'; + testSelector.style.width = '600px'; + testSelector.style.left = '50%'; + testSelector.style.marginLeft = '-300px'; + testSelector.style.textAlign = 'center'; + + this.dropDown = document.createElement('select'); + this.dropDown.name = "selectTestDropDown"; + this.dropDown.id = "selectTest"; + + this.sourceBtn = document.createElement('button'); + this.sourceBtn.innerHTML = 'Show Source'; + this.sourceBtn.id = 'previous'; + + this.previousBtn = document.createElement('button'); + this.previousBtn.innerHTML = '<<'; + this.previousBtn.id = 'previous'; + + this.nextBtn = document.createElement('button'); + this.nextBtn.innerHTML = '>>'; + this.nextBtn.id = 'next'; + + testSelector.appendChild(this.sourceBtn); + testSelector.appendChild(this.previousBtn); + testSelector.appendChild(this.dropDown); + testSelector.appendChild(this.nextBtn); + document.body.appendChild(testSelector); + }; + + /** + * + */ + AppHarness.prototype.initFrameSet = function () { + var iframeContainer = document.createElement('div'); + iframeContainer.style.width = '100%'; + iframeContainer.style.height = '100%'; + + this.testIframe = document.createElement('iframe'); + this.testIframe.id = 'testContainer'; + this.testIframe.style.backgroundColor = '#9e9e9e'; + this.testIframe.style.cssFloat = 'none'; + this.testIframe.style.position = 'absolute'; + this.testIframe.style.top = '0px'; + this.testIframe.style.left = '0px'; + this.testIframe.style.border = '0px'; + this.testIframe.style.width = '100%'; + this.testIframe.style.height = '100%'; + + //bottom: 120px; + this.srcIframe = document.createElement('iframe'); + this.srcIframe.id = 'testSourceContainer'; + this.srcIframe.style.backgroundColor = '#9e9e9e'; + this.srcIframe.style.cssFloat = 'none'; + this.srcIframe.style.position = 'absolute'; + this.srcIframe.style.right = '0px'; + this.srcIframe.style.top = '0px'; + this.srcIframe.style.bottom = '0px'; + this.srcIframe.style.border = '0px'; + this.srcIframe.style.width = '0%'; + this.srcIframe.style.height = '100%'; + + iframeContainer.appendChild(this.testIframe); + iframeContainer.appendChild(this.srcIframe); + + document.body.appendChild(iframeContainer); + }; + + /** + * + * Selectnext / previous menu item + * + * @param direction + */ + AppHarness.prototype.nagigateBy = function (direction) { + if (typeof direction === "undefined") { direction = 1; } + var l = this.tests.length; + var nextCounter = this.counter + direction; + + if (nextCounter < 0) { + nextCounter = this.tests.length - 1; + } else if (nextCounter > this.tests.length - 1) { + nextCounter = 0; + } + + var testData = this.tests[nextCounter]; + + if (testData.name.indexOf('--') != -1) { + this.counter = nextCounter; + this.nagigateBy(direction); + } else { + this.navigateToSection(testData); + this.dropDown.selectedIndex = nextCounter; + this.counter = nextCounter; + } + }; + + /** + * + * Navigate to a section + * + * @param testData + */ + AppHarness.prototype.navigateToSection = function (testData) { + window.history.pushState(testData.js, testData.js, '?test=' + testData.js); + this.srcIframe.src = "data:text/html;charset=utf-8," + this.createSourceViewHTML(testData.src); + this.testIframe.src = 'frame.html?name=' + testData.classpath + '&js=' + testData.js; + }; + + AppHarness.prototype.toggleSource = function () { + if (this.sourceVisible) { + this.testIframe.style.width = '100%'; + this.srcIframe.style.width = '0%'; + this.sourceBtn.innerHTML = 'Show Source'; + } else { + this.testIframe.style.width = '20%'; + this.srcIframe.style.width = '80%'; + this.sourceBtn.innerHTML = 'Hide Source'; + } + + this.sourceVisible = !this.sourceVisible; + }; + + AppHarness.prototype.createSourceViewHTML = function (url) { + var html = ''; + + html += ''; + html += ''; + html += ' '; + html += ' '; + html += ' '; + html += ' '; + html += ''; + html += ''; + html += ''; + html += ''; + + return html; + }; + + //------------------------------------------------------------------------------ + // Utils + /** + * + * Util function - get Element by ID + * + * @param id + * @returns {HTMLElement} + */ + AppHarness.prototype.getId = function (id) { + return document.getElementById(id); + }; + + //------------------------------------------------------------------------------ + // Events + /** + * + * Dropbox event handler + * + * @param e + */ + AppHarness.prototype.dropDownChange = function (e) { + this.dropDown.options[this.dropDown.selectedIndex].value; + this.counter = this.dropDown.selectedIndex; + var dataIndex = parseInt(this.dropDown.options[this.dropDown.selectedIndex].value); + + if (!isNaN(dataIndex)) { + this.navigateToSection(this.tests[dataIndex]); + } + }; + return AppHarness; +})(); + +//--------------------------------------------------- +// Application Frame +var AppFrame = (function () { + function AppFrame() { + this.classPath = ''; + this.jsPath = ''; + var queryParams = Utils.getQueryParams(document.location.search); + + if (queryParams.js != undefined && queryParams.name != undefined) { + this.jsPath = queryParams.js; + this.classPath = queryParams.name; + this.loadJS(this.jsPath); + } + } + /** + * + * Load a JavaScript file + * + * @param url - URL of JavaScript file + */ + AppFrame.prototype.loadJS = function (url) { + var _this = this; + var head = document.getElementsByTagName("head")[0]; + var script = document.createElement("script"); + script.type = "text/javascript"; + script.src = url; + script.onload = function () { + return _this.jsLoaded(); + }; + + head.appendChild(script); + }; + + /** + * + * Event Handler for loaded JavaScript files + * + */ + AppFrame.prototype.jsLoaded = function () { + var createPath = this.classPath.split('.'); + var obj; + + for (var c = 0; c < createPath.length; c++) { + if (obj == null) { + obj = window[createPath[c]]; // reference base module ( will be a child of the window ) + } else { + obj = obj[createPath[c]]; // reference sub module / Class + } + } + + if (obj != null) { + new obj(); // if Class has been found - start the test + } + }; + return AppFrame; +})(); + +//--------------------------------------------------- +// Common Utilities +var Utils = (function () { + function Utils() { + } + /** + * + * Utility function - Parse a Query formatted string + * + * @param qs + * @returns {{}} + */ + Utils.getQueryParams = function (qs) { + qs = qs.split("+").join(" "); + + var params = {}, tokens, re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(qs)) { + params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + } + + return params; + }; + return Utils; +})(); + +//--------------------------------------------------- +// Data +var TestData = (function () { + function TestData(name, classpath, js, src) { + this.js = js; + this.classpath = classpath; + this.src = src; + this.name = name; + } + return TestData; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkFwcEhhcm5lc3MudHMiXSwibmFtZXMiOlsiQXBwSGFybmVzcyIsIkFwcEhhcm5lc3MuY29uc3RydWN0b3IiLCJBcHBIYXJuZXNzLmxvYWQiLCJBcHBIYXJuZXNzLmFkZFRlc3QiLCJBcHBIYXJuZXNzLmFkZFNlcGVyYXRvciIsIkFwcEhhcm5lc3Muc3RhcnQiLCJBcHBIYXJuZXNzLmxvYWRGcm9tVVJMIiwiQXBwSGFybmVzcy5pbml0SW50ZXJmYWNlIiwiQXBwSGFybmVzcy5pbml0RnJhbWVTZXQiLCJBcHBIYXJuZXNzLm5hZ2lnYXRlQnkiLCJBcHBIYXJuZXNzLm5hdmlnYXRlVG9TZWN0aW9uIiwiQXBwSGFybmVzcy50b2dnbGVTb3VyY2UiLCJBcHBIYXJuZXNzLmNyZWF0ZVNvdXJjZVZpZXdIVE1MIiwiQXBwSGFybmVzcy5nZXRJZCIsIkFwcEhhcm5lc3MuZHJvcERvd25DaGFuZ2UiLCJBcHBGcmFtZSIsIkFwcEZyYW1lLmNvbnN0cnVjdG9yIiwiQXBwRnJhbWUubG9hZEpTIiwiQXBwRnJhbWUuanNMb2FkZWQiLCJVdGlscyIsIlV0aWxzLmNvbnN0cnVjdG9yIiwiVXRpbHMuZ2V0UXVlcnlQYXJhbXMiLCJUZXN0RGF0YSIsIlRlc3REYXRhLmNvbnN0cnVjdG9yIl0sIm1hcHBpbmdzIjoiQUFBQSxxREFBcUQ7QUFDckQsc0JBQXNCO0FBRXRCO0lBa0JDQSxnRkFGZ0ZBO0lBRWhGQTtRQUFBQyxpQkFZQ0E7UUEzQkRBLGdGQUFnRkE7UUFFaEZBLEtBQVFBLEtBQUtBLEdBQStCQSxJQUFJQSxLQUFLQSxDQUFXQSxDQUFDQSxDQUFDQTtRQU9sRUEsS0FBUUEsT0FBT0EsR0FBb0JBLENBQUNBLENBQUNBO1FBQ3JDQSxLQUFRQSxhQUFhQSxHQUFlQSxLQUFLQSxDQUFDQTtRQUMxQ0EsS0FBUUEsV0FBV0EsR0FBaUJBLElBQUlBLENBQUNBO1FBT3hDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQTtRQUNuQkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0Es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LENBQUNBOztRQUU1QkEsSUFBSUEsTUFBTUEsR0FBR0EsRUFBRUEsRUFBRUEsTUFBTUEsRUFDdEJBLEVBQUVBLEdBQUdBLHVCQUF1QkE7O1FBRTdCQSxPQUFPQSxNQUFNQSxHQUFHQSxFQUFFQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFFQTtZQUM1QkEsTUFBTUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxrQkFBa0JBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQ3JFQTs7UUFFREEsT0FBT0EsTUFBTUE7SUFDZEEsQ0FBQ0E7SUFDRkYsYUFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRCxxREFBcUQ7QUFDckQsT0FBTztBQUVQO0lBT0NHLGtCQUFhQSxJQUFhQSxFQUFHQSxTQUFrQkEsRUFBR0EsRUFBV0EsRUFBR0EsR0FBWUE7UUFFM0VDLElBQUlBLENBQUNBLEVBQUVBLEdBQVdBLEVBQUVBO1FBQ3BCQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFJQSxTQUFTQTtRQUMzQkEsSUFBSUEsQ0FBQ0EsR0FBR0EsR0FBVUEsR0FBR0E7UUFDckJBLElBQUlBLENBQUNBLElBQUlBLEdBQVNBLElBQUlBO0lBQ3ZCQSxDQUFDQTtJQUNGRCxnQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQSIsImZpbGUiOiJBcHBIYXJuZXNzLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFwcGxpY2F0aW9uIEhhcm5lc3NcblxuY2xhc3MgQXBwSGFybmVzc1xue1xuXG5cdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0cHJpdmF0ZSB0ZXN0cyAgICAgICAgICAgOiBBcnJheTxUZXN0RGF0YT4gPSBuZXcgQXJyYXk8VGVzdERhdGE+KCk7XG5cdHByaXZhdGUgZHJvcERvd24gICAgICAgIDogSFRNTFNlbGVjdEVsZW1lbnQ7XG5cdHByaXZhdGUgcHJldmlvdXNCdG4gICAgIDogSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cdHByaXZhdGUgbmV4dEJ0biAgICAgICAgIDogSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cdHByaXZhdGUgc291cmNlQnRuICAgICAgIDogSFRNTEJ1dHRvbkVsZW1lbnQ7XG5cdHByaXZhdGUgdGVzdElmcmFtZSAgICAgIDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cdHByaXZhdGUgc3JjSWZyYW1lICAgICAgIDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cdHByaXZhdGUgY291bnRlciAgICAgICAgIDogbnVtYmVyID0gMDtcblx0cHJpdmF0ZSBzb3VyY2VWaXNpYmxlICAgOiBib29sZWFuID0gZmFsc2U7XG5cdHByaXZhdGUgbG9hZERlZmF1bHQgICAgIDogYm9vbGVhbiA9IHRydWU7XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblxuXHRcdHRoaXMuaW5pdEZyYW1lU2V0KCk7XG5cdFx0dGhpcy5pbml0SW50ZXJmYWNlKCk7XG5cblxuXHRcdHRoaXMucHJldmlvdXNCdG4ub25jbGljayAgID0gKCkgPT4gdGhpcy5uYWdpZ2F0ZUJ5KCAtMSApO1xuXHRcdHRoaXMubmV4dEJ0bi5vbmNsaWNrICAgICAgID0gKCkgPT4gdGhpcy5uYWdpZ2F0ZUJ5KCAxICk7XG5cdFx0dGhpcy5zb3VyY2VCdG4ub25jbGljayAgICAgPSAoKSA9PiB0aGlzLnRvZ2dsZVNvdXJjZSgpO1xuXHRcdHRoaXMuZHJvcERvd24ub25jaGFuZ2UgICAgICA9ICggZSApID0+IHRoaXMuZHJvcERvd25DaGFuZ2UoIGUgKTtcblxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHQvKipcblx0ICpcblx0ICogTG9hZCBhIHRlc3Rcblx0ICpcblx0ICogQHBhcmFtIGNsYXNzUGF0aCAtIE1vZHVsZSBhbmQgQ2xhc3MgcGF0aCBvZiB0ZXN0XG5cdCAqIEBwYXJhbSBqcyBQYXRoIHRvIEphdmFTY3JpcHQgZmlsZVxuXHQgKiBAcGFyYW0gdHMgUGF0aCB0byBUeXBlc2NyaXB0IGZpbGUgKCBub3QgeWV0IHVzZWQgLSByZXNlcnZlZCBmb3IgZnV0dXJlIHNob3cgc291cmNlIClcblx0ICovXG5cdHB1YmxpYyBsb2FkKCBjbGFzc1BhdGggOiBzdHJpbmcgLCBqcyA6IHN0cmluZyAsIHRzIDogc3RyaW5nICkgOiB2b2lkXG5cdHtcblxuXHRcdHRoaXMubG9hZEZyb21VUkwoKTtcblxuXHRcdGlmICggdGhpcy5sb2FkRGVmYXVsdCApXG5cdFx0e1xuXHRcdFx0d2luZG93Lmhpc3RvcnkucHVzaFN0YXRlKGpzLCBqcywgJz90ZXN0PScgKyBqcyk7XG5cdFx0XHR0aGlzLnRlc3RJZnJhbWUuc3JjID0gJ2ZyYW1lLmh0bWw/bmFtZT0nICsgY2xhc3NQYXRoICsgJyZqcz0nICsganM7XG5cdFx0XHR0aGlzLnNyY0lmcmFtZS5zcmMgPSBcImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgsXCIgKyB0aGlzLmNyZWF0ZVNvdXJjZVZpZXdIVE1MKCB0cyApO1xuXG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEFkZCBhIHRlc3QgdG8gdGhlIEFwcEhhcm5lc3Ncblx0ICpcblx0ICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0ZXN0XG5cdCAqIEBwYXJhbSBjbGFzc1BhdGggLSBNb2R1bGUgYW5kIENsYXNzIHBhdGggb2YgdGVzdFxuXHQgKiBAcGFyYW0ganMgUGF0aCB0byBKYXZhU2NyaXB0IGZpbGVcblx0ICogQHBhcmFtIHRzIFBhdGggdG8gVHlwZXNjcmlwdCBmaWxlICggbm90IHlldCB1c2VkIC0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBzaG93IHNvdXJjZSApXG5cdCAqL1xuXHRwdWJsaWMgYWRkVGVzdCggbmFtZSA6IHN0cmluZyAsIGNsYXNzcGF0aCA6IHN0cmluZyAsIGpzIDogc3RyaW5nICwgdHMgOiBzdHJpbmcgKSA6IHZvaWRcblx0e1xuXHRcdHRoaXMudGVzdHMucHVzaCAoIG5ldyBUZXN0RGF0YSggbmFtZSAsIGNsYXNzcGF0aCAsIGpzICwgdHMgKSApO1xuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIEFkZCBhIHNlcGFyYXRvciB0byB0aGUgbWVudVxuXHQgKlxuXHQgKiBAcGFyYW0gbmFtZVxuXHQgKi9cblx0cHVibGljIGFkZFNlcGVyYXRvciggbmFtZSA6IHN0cmluZyA9ICcnICkgOiB2b2lkXG5cdHtcblx0XHR0aGlzLnRlc3RzLnB1c2ggKCBuZXcgVGVzdERhdGEoICctLSAnICsgbmFtZSAsICcnICwgJycgLCAnJykgKTtcblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBTdGFydCB0aGUgYXBwbGljYXRpb24gaGFybmVzc1xuXHQgKlxuXHQgKi9cblx0cHVibGljIHN0YXJ0KCBzbGlkZXNob3dNb2RlIDogYm9vbGVhbiA9IGZhbHNlICkgOiB2b2lkXG5cdHtcblx0XHRmb3IgKCB2YXIgYyA6IG51bWJlciA9IDAgOyBjIDwgdGhpcy50ZXN0cy5sZW5ndGggOyBjICsrICApXG5cdFx0e1xuXHRcdFx0dmFyIG9wdGlvbiA6IEhUTUxPcHRpb25FbGVtZW50ID0gPEhUTUxPcHRpb25FbGVtZW50PiBuZXcgT3B0aW9uKCB0aGlzLnRlc3RzW2NdLm5hbWUgLCBTdHJpbmcoIGMgKSApO1xuXHRcdFx0dGhpcy5kcm9wRG93bi5hZGQoIG9wdGlvbiApO1xuXHRcdH1cblxuXHRcdGlmICggc2xpZGVzaG93TW9kZSApXG5cdFx0e1xuXG5cdFx0XHRzZXRJbnRlcnZhbCggKCkgPT4gdGhpcy5uYWdpZ2F0ZUJ5KCAxICkgLCAxNTAwMCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIGxvYWRGcm9tVVJMKCkgOiB2b2lkXG5cdHtcblx0XHR2YXIgcXVlcnlQYXJhbXMgOiBhbnkgPSBVdGlscy5nZXRRdWVyeVBhcmFtcyggZG9jdW1lbnQubG9jYXRpb24uc2VhcmNoICk7XG5cblx0XHRpZiAoIHF1ZXJ5UGFyYW1zLnRlc3QgIT0gbnVsbCApXG5cdFx0e1xuXHRcdFx0dmFyIGwgOiBudW1iZXIgPSAgdGhpcy50ZXN0cy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIHZhciBjIDogbnVtYmVyID0gMCA7IGMgPCBsIDsgYyArKyApXG5cdFx0XHR7XG5cdFx0XHRcdGlmICggdGhpcy50ZXN0c1tjXS5qcyA9PSBxdWVyeVBhcmFtcy50ZXN0IClcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGNvbnNvbGUubG9nICggJz09PT09PT4+Pj4gTE9BRCBURVNUJyk7XG5cblx0XHRcdFx0XHR0aGlzLm5hdmlnYXRlVG9TZWN0aW9uKCB0aGlzLnRlc3RzW2NdICk7XG5cdFx0XHRcdFx0dGhpcy5sb2FkRGVmYXVsdCA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKlxuXHQgKi9cblx0cHJpdmF0ZSBpbml0SW50ZXJmYWNlKCkgOiB2b2lkXG5cdHtcblxuXHRcdHZhciB0ZXN0U2VsZWN0b3IgOiBIVE1MRGl2RWxlbWVudCAgID0gPEhUTUxEaXZFbGVtZW50PiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnZGl2JyApO1xuXHRcdFx0dGVzdFNlbGVjdG9yLnN0eWxlLmNzc0Zsb2F0ICAgICA9ICdub25lJztcblx0XHRcdHRlc3RTZWxlY3Rvci5zdHlsZS5wb3NpdGlvbiAgICAgPSAnYWJzb2x1dGUnO1xuXHRcdFx0dGVzdFNlbGVjdG9yLnN0eWxlLmJvdHRvbSAgICAgICA9ICcxNXB4Jztcblx0XHRcdHRlc3RTZWxlY3Rvci5zdHlsZS53aWR0aCAgICAgICAgPSAnNjAwcHgnO1xuXHRcdFx0dGVzdFNlbGVjdG9yLnN0eWxlLmxlZnQgICAgICAgICA9ICc1MCUnO1xuXHRcdFx0dGVzdFNlbGVjdG9yLnN0eWxlLm1hcmdpbkxlZnQgICA9ICctMzAwcHgnXG5cdFx0XHR0ZXN0U2VsZWN0b3Iuc3R5bGUudGV4dEFsaWduICAgID0gJ2NlbnRlcic7XG5cblxuXHRcdHRoaXMuZHJvcERvd24gICAgICAgICAgICAgICAgICAgICAgID0gPEhUTUxTZWxlY3RFbGVtZW50PiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnc2VsZWN0JyApO1xuXHRcdHRoaXMuZHJvcERvd24ubmFtZSAgICAgICAgICAgICAgICAgID0gXCJzZWxlY3RUZXN0RHJvcERvd25cIlxuXHRcdHRoaXMuZHJvcERvd24uaWQgICAgICAgICAgICAgICAgICAgID0gXCJzZWxlY3RUZXN0XCJcblxuXHRcdHRoaXMuc291cmNlQnRuICAgICAgICAgICAgICAgICAgICAgID0gPEhUTUxCdXR0b25FbGVtZW50PiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCAnYnV0dG9uJyApO1xuXHRcdHRoaXMuc291cmNlQnRuLmlubmVySFRNTCAgICAgICAgICAgID0gJ1Nob3cgU291cmNlJztcblx0XHR0aGlzLnNvdXJjZUJ0bi5pZCAgICAgICAgICAgICAgICAgICA9ICdwcmV2aW91cyc7XG5cblx0XHR0aGlzLnByZXZpb3VzQnRuICAgICAgICAgICAgICAgICAgICA9IDxIVE1MQnV0dG9uRWxlbWVudD4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2J1dHRvbicgKTtcblx0XHR0aGlzLnByZXZpb3VzQnRuLmlubmVySFRNTCAgICAgICAgICA9ICc8PCc7XG5cdFx0dGhpcy5wcmV2aW91c0J0bi5pZCAgICAgICAgICAgICAgICAgPSAncHJldmlvdXMnO1xuXG5cdFx0dGhpcy5uZXh0QnRuICAgICAgICAgICAgICAgICAgICAgICAgPSA8SFRNTEJ1dHRvbkVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdidXR0b24nICk7XG5cdFx0dGhpcy5uZXh0QnRuLmlubmVySFRNTCAgICAgICAgICAgICAgPSAnPj4nO1xuXHRcdHRoaXMubmV4dEJ0bi5pZCAgICAgICAgICAgICAgICAgICAgID0gJ25leHQnO1xuXG5cblx0XHR0ZXN0U2VsZWN0b3IuYXBwZW5kQ2hpbGQoIHRoaXMuc291cmNlQnRuICk7XG5cdFx0dGVzdFNlbGVjdG9yLmFwcGVuZENoaWxkKCB0aGlzLnByZXZpb3VzQnRuICk7XG5cdFx0dGVzdFNlbGVjdG9yLmFwcGVuZENoaWxkKCB0aGlzLmRyb3BEb3duICk7XG5cdFx0dGVzdFNlbGVjdG9yLmFwcGVuZENoaWxkKCB0aGlzLm5leHRCdG4gKTtcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCB0ZXN0U2VsZWN0b3IgKTtcblx0fVxuXHQvKipcblx0ICpcblx0ICovXG5cdHByaXZhdGUgaW5pdEZyYW1lU2V0KCkgOiB2b2lkXG5cdHtcblxuXHRcdHZhciBpZnJhbWVDb250YWluZXIgOiBIVE1MRGl2RWxlbWVudCAgICA9IDxIVE1MRGl2RWxlbWVudD4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggJ2RpdicgKTtcblx0XHRcdGlmcmFtZUNvbnRhaW5lci5zdHlsZS53aWR0aCAgICAgICAgID0gJzEwMCUnO1xuXHRcdFx0aWZyYW1lQ29udGFpbmVyLnN0eWxlLmhlaWdodCAgICAgICAgPSAnMTAwJSc7XG5cblx0XHR0aGlzLnRlc3RJZnJhbWUgICAgICAgICAgICAgICAgICAgICAgPSA8SFRNTElGcmFtZUVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdpZnJhbWUnICk7XG5cdFx0dGhpcy50ZXN0SWZyYW1lLmlkICAgICAgICAgICAgICAgICAgID0gJ3Rlc3RDb250YWluZXInO1xuXHRcdHRoaXMudGVzdElmcmFtZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAnIzllOWU5ZSc7XG5cdFx0dGhpcy50ZXN0SWZyYW1lLnN0eWxlLmNzc0Zsb2F0ICAgICAgID0gJ25vbmUnO1xuXHRcdHRoaXMudGVzdElmcmFtZS5zdHlsZS5wb3NpdGlvbiAgICAgICA9ICdhYnNvbHV0ZSc7XG5cdFx0dGhpcy50ZXN0SWZyYW1lLnN0eWxlLnRvcCAgICAgICAgICAgID0gJzBweCc7XG5cdFx0dGhpcy50ZXN0SWZyYW1lLnN0eWxlLmxlZnQgICAgICAgICAgID0gJzBweCc7XG5cdFx0dGhpcy50ZXN0SWZyYW1lLnN0eWxlLmJvcmRlciAgICAgICAgID0gJzBweCc7XG5cdFx0dGhpcy50ZXN0SWZyYW1lLnN0eWxlLndpZHRoICAgICAgICAgID0gJzEwMCUnO1xuXHRcdHRoaXMudGVzdElmcmFtZS5zdHlsZS5oZWlnaHQgICAgICAgICA9ICcxMDAlJztcblx0XHQvL2JvdHRvbTogMTIwcHg7XG5cblx0XHR0aGlzLnNyY0lmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA8SFRNTElGcmFtZUVsZW1lbnQ+IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoICdpZnJhbWUnICk7XG5cdFx0dGhpcy5zcmNJZnJhbWUuaWQgICAgICAgICAgICAgICAgICAgICAgID0gJ3Rlc3RTb3VyY2VDb250YWluZXInO1xuXHRcdHRoaXMuc3JjSWZyYW1lLnN0eWxlLmJhY2tncm91bmRDb2xvciAgICA9ICcjOWU5ZTllJztcblx0XHR0aGlzLnNyY0lmcmFtZS5zdHlsZS5jc3NGbG9hdCAgICAgICAgICAgPSAnbm9uZSc7XG5cdFx0dGhpcy5zcmNJZnJhbWUuc3R5bGUucG9zaXRpb24gICAgICAgICAgID0gJ2Fic29sdXRlJztcblx0XHR0aGlzLnNyY0lmcmFtZS5zdHlsZS5yaWdodCAgICAgICAgICAgICAgPSAnMHB4Jztcblx0XHR0aGlzLnNyY0lmcmFtZS5zdHlsZS50b3AgICAgICAgICAgICAgICAgPSAnMHB4Jztcblx0XHR0aGlzLnNyY0lmcmFtZS5zdHlsZS5ib3R0b20gICAgICAgICAgICAgPSAnMHB4Jztcblx0XHR0aGlzLnNyY0lmcmFtZS5zdHlsZS5ib3JkZXIgICAgICAgICAgICAgPSAnMHB4Jztcblx0XHR0aGlzLnNyY0lmcmFtZS5zdHlsZS53aWR0aCAgICAgICAgICAgICAgPSAnMCUnO1xuXHRcdHRoaXMuc3JjSWZyYW1lLnN0eWxlLmhlaWdodCAgICAgICAgICAgICA9ICcxMDAlJztcblxuXHRcdGlmcmFtZUNvbnRhaW5lci5hcHBlbmRDaGlsZCggdGhpcy50ZXN0SWZyYW1lICk7XG5cdFx0aWZyYW1lQ29udGFpbmVyLmFwcGVuZENoaWxkKCB0aGlzLnNyY0lmcmFtZSApO1xuXG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggaWZyYW1lQ29udGFpbmVyICk7XG5cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBTZWxlY3RuZXh0IC8gcHJldmlvdXMgbWVudSBpdGVtXG5cdCAqXG5cdCAqIEBwYXJhbSBkaXJlY3Rpb25cblx0ICovXG5cdHByaXZhdGUgbmFnaWdhdGVCeSggZGlyZWN0aW9uIDogbnVtYmVyID0gMSApIDogdm9pZFxuXHR7XG5cblx0XHR2YXIgbCA6IG51bWJlciAgPSB0aGlzLnRlc3RzLmxlbmd0aDtcblx0XHR2YXIgbmV4dENvdW50ZXIgPSB0aGlzLmNvdW50ZXIgKyBkaXJlY3Rpb247XG5cblx0XHRpZiAoIG5leHRDb3VudGVyIDwgMCApXG5cdFx0e1xuXHRcdFx0bmV4dENvdW50ZXIgPSB0aGlzLnRlc3RzLmxlbmd0aCAtIDE7XG5cdFx0fVxuXHRcdGVsc2UgaWYgKCBuZXh0Q291bnRlciA+IHRoaXMudGVzdHMubGVuZ3RoIC0gMSApXG5cdFx0e1xuXHRcdFx0bmV4dENvdW50ZXIgPSAwO1xuXHRcdH1cblxuXHRcdHZhciB0ZXN0RGF0YSA6IFRlc3REYXRhID0gdGhpcy50ZXN0c1tuZXh0Q291bnRlcl07XG5cblx0XHRpZiAoIHRlc3REYXRhLm5hbWUuaW5kZXhPZiAoJy0tJykgIT0gLTEgKSAvLyBza2lwIHNlY3Rpb24gaGVhZGVyc1xuXHRcdHtcblx0XHRcdHRoaXMuY291bnRlciA9IG5leHRDb3VudGVyO1xuXHRcdFx0dGhpcy5uYWdpZ2F0ZUJ5KCBkaXJlY3Rpb24gKTtcblx0XHR9XG5cdFx0ZWxzZVxuXHRcdHtcblx0XHRcdHRoaXMubmF2aWdhdGVUb1NlY3Rpb24oIHRlc3REYXRhICk7XG5cdFx0XHR0aGlzLmRyb3BEb3duLnNlbGVjdGVkSW5kZXggPSBuZXh0Q291bnRlcjtcblx0XHRcdHRoaXMuY291bnRlciA9IG5leHRDb3VudGVyO1xuXHRcdH1cblxuXHR9XG5cblx0LyoqXG5cdCAqXG5cdCAqIE5hdmlnYXRlIHRvIGEgc2VjdGlvblxuXHQgKlxuXHQgKiBAcGFyYW0gdGVzdERhdGFcblx0ICovXG5cdHByaXZhdGUgbmF2aWdhdGVUb1NlY3Rpb24gKCB0ZXN0RGF0YSA6IFRlc3REYXRhICkgOiB2b2lkXG5cdHtcblx0XHR3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUodGVzdERhdGEuanMsIHRlc3REYXRhLmpzLCAnP3Rlc3Q9JyArIHRlc3REYXRhLmpzKTtcblx0XHR0aGlzLnNyY0lmcmFtZS5zcmMgPSBcImRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgsXCIgKyB0aGlzLmNyZWF0ZVNvdXJjZVZpZXdIVE1MKCB0ZXN0RGF0YS5zcmMgKTtcblx0XHR0aGlzLnRlc3RJZnJhbWUuc3JjID0gJ2ZyYW1lLmh0bWw/bmFtZT0nICsgdGVzdERhdGEuY2xhc3NwYXRoICsgJyZqcz0nICsgdGVzdERhdGEuanM7XG5cdH1cblxuXHRwcml2YXRlIHRvZ2dsZVNvdXJjZSgpIDogdm9pZFxuXHR7XG5cblx0XHRpZiAoIHRoaXMuc291cmNlVmlzaWJsZSApXG5cdFx0e1xuXHRcdFx0dGhpcy50ZXN0SWZyYW1lLnN0eWxlLndpZHRoICAgICAgICAgPSAnMTAwJSc7XG5cdFx0XHR0aGlzLnNyY0lmcmFtZS5zdHlsZS53aWR0aCAgICAgICAgICA9ICcwJSc7XG5cdFx0XHR0aGlzLnNvdXJjZUJ0bi5pbm5lckhUTUwgICAgICAgICAgICA9ICdTaG93IFNvdXJjZSc7XG5cdFx0fVxuXHRcdGVsc2Vcblx0XHR7XG5cdFx0XHR0aGlzLnRlc3RJZnJhbWUuc3R5bGUud2lkdGggICAgICAgICA9ICcyMCUnO1xuXHRcdFx0dGhpcy5zcmNJZnJhbWUuc3R5bGUud2lkdGggICAgICAgICAgPSAnODAlJztcblx0XHRcdHRoaXMuc291cmNlQnRuLmlubmVySFRNTCAgICAgICAgICAgID0gJ0hpZGUgU291cmNlJztcblx0XHR9XG5cblx0XHR0aGlzLnNvdXJjZVZpc2libGUgPSAhdGhpcy5zb3VyY2VWaXNpYmxlO1xuXG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZVNvdXJjZVZpZXdIVE1MICggdXJsIDogc3RyaW5nICkgOiBzdHJpbmdcblx0e1xuXG5cdFx0dmFyIGh0bWwgOiBzdHJpbmcgPSAnJztcblxuXHRcdGh0bWwgKz0gJzwhRE9DVFlQRSBodG1sPic7XG5cdFx0aHRtbCArPSAnPGh0bWw+Jztcblx0XHRodG1sICs9ICcgICA8aGVhZD4nO1xuXHRcdGh0bWwgKz0gJyAgICAgICA8dGl0bGU+PC90aXRsZT4nO1xuXHRcdGh0bWwgKz0gJyAgICAgICA8c3R5bGU+Jztcblx0XHRodG1sICs9ICcgICAgICAgICAgIGh0bWwnO1xuXHRcdGh0bWwgKz0gJyAgICAgICAgICAgeyc7XG5cdFx0aHRtbCArPSAnICAgICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOyc7XG5cdFx0aHRtbCArPSAnICAgICAgICAgICAgICAgYm9yZGVyOiAwcHg7Jztcblx0XHRodG1sICs9ICcgICAgICAgICAgICAgICBwYWRkaW5nOiAwcHg7Jztcblx0XHRodG1sICs9ICcgICAgICAgICAgfSc7XG5cdFx0aHRtbCArPSAnICAgICAgIDwvc3R5bGU+Jztcblx0XHRodG1sICs9ICcgICA8c2NyaXB0IHNyYz1cImh0dHA6Ly9naXN0LWl0LmFwcHNwb3QuY29tL2dpdGh1Yi9hd2F5anMvYXdheWpzLWNvcmUtdHMvdHJlZS9tYXN0ZXIvdGVzdHMvJyArIHVybCArICc/Zm9vdGVyPW5vXCI+PC9zY3JpcHQ+Jztcblx0XHRodG1sICs9ICc8L2hlYWQ+Jztcblx0XHRodG1sICs9ICc8Ym9keT4nO1xuXHRcdGh0bWwgKz0gJzwvYm9keT4nO1xuXHRcdGh0bWwgKz0gJzwvaHRtbD4nO1xuXG5cdFx0cmV0dXJuIGh0bWw7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBVdGlsc1xuXG5cdC8qKlxuXHQgKlxuXHQgKiBVdGlsIGZ1bmN0aW9uIC0gZ2V0IEVsZW1lbnQgYnkgSURcblx0ICpcblx0ICogQHBhcmFtIGlkXG5cdCAqIEByZXR1cm5zIHtIVE1MRWxlbWVudH1cblx0ICovXG5cdHByaXZhdGUgZ2V0SWQoaWQgOiBzdHJpbmcgKSA6IEhUTUxFbGVtZW50XG5cdHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cdH1cblxuXHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQvLyBFdmVudHNcblxuXHQvKipcblx0ICpcblx0ICogRHJvcGJveCBldmVudCBoYW5kbGVyXG5cdCAqXG5cdCAqIEBwYXJhbSBlXG5cdCAqL1xuXHRwcml2YXRlIGRyb3BEb3duQ2hhbmdlKCBlICkgOiB2b2lkXG5cdHtcblx0XHR0aGlzLmRyb3BEb3duLm9wdGlvbnNbdGhpcy5kcm9wRG93bi5zZWxlY3RlZEluZGV4XS52YWx1ZVxuXHRcdHRoaXMuY291bnRlciA9IHRoaXMuZHJvcERvd24uc2VsZWN0ZWRJbmRleDtcblx0XHR2YXIgZGF0YUluZGV4IDogbnVtYmVyID0gcGFyc2VJbnQoIHRoaXMuZHJvcERvd24ub3B0aW9uc1t0aGlzLmRyb3BEb3duLnNlbGVjdGVkSW5kZXhdLnZhbHVlICkgO1xuXG5cdFx0aWYgKCAhIGlzTmFOKCBkYXRhSW5kZXggKSApXG5cdFx0e1xuXHRcdFx0dGhpcy5uYXZpZ2F0ZVRvU2VjdGlvbiggdGhpcy50ZXN0c1tkYXRhSW5kZXhdICk7XG5cdFx0fVxuXHR9XG5cbn1cblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEFwcGxpY2F0aW9uIEZyYW1lXG5cbmNsYXNzIEFwcEZyYW1lXG57XG5cblx0cHJpdmF0ZSBjbGFzc1BhdGggICA6IHN0cmluZyA9ICcnO1xuXHRwcml2YXRlIGpzUGF0aCAgICAgIDogc3RyaW5nID0gJyc7XG5cblx0Y29uc3RydWN0b3IoIClcblx0e1xuXG5cdFx0dmFyIHF1ZXJ5UGFyYW1zIDogYW55ID0gVXRpbHMuZ2V0UXVlcnlQYXJhbXMoIGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaCApO1xuXG5cdFx0aWYgKCBxdWVyeVBhcmFtcy5qcyAhPSB1bmRlZmluZWQgJiYgcXVlcnlQYXJhbXMubmFtZSAhPSB1bmRlZmluZWQgKVxuXHRcdHtcblxuXHRcdFx0dGhpcy5qc1BhdGggICAgID0gcXVlcnlQYXJhbXMuanM7XG5cdFx0XHR0aGlzLmNsYXNzUGF0aCAgPSBxdWVyeVBhcmFtcy5uYW1lO1xuXHRcdFx0dGhpcy5sb2FkSlMoIHRoaXMuanNQYXRoICk7XG5cblx0XHR9XG5cblx0fVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBMb2FkIGEgSmF2YVNjcmlwdCBmaWxlXG5cdCAqXG5cdCAqIEBwYXJhbSB1cmwgLSBVUkwgb2YgSmF2YVNjcmlwdCBmaWxlXG5cdCAqL1xuXHRwcml2YXRlIGxvYWRKUyh1cmwgOiBzdHJpbmcgKVxuXHR7XG5cblx0XHR2YXIgaGVhZCA6IEhUTUxFbGVtZW50ID0gPEhUTUxFbGVtZW50PiBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImhlYWRcIilbMF07XG5cdFx0dmFyIHNjcmlwdCA6IEhUTUxTY3JpcHRFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNjcmlwdFwiKTtcblx0XHRzY3JpcHQudHlwZSAgICAgPSBcInRleHQvamF2YXNjcmlwdFwiO1xuXHRcdHNjcmlwdC5zcmMgICAgICA9IHVybDtcblx0XHRzY3JpcHQub25sb2FkICAgPSAoKSA9PiB0aGlzLmpzTG9hZGVkKCk7XG5cblx0XHRoZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG5cdH1cblxuXHQvKipcblx0ICpcblx0ICogRXZlbnQgSGFuZGxlciBmb3IgbG9hZGVkIEphdmFTY3JpcHQgZmlsZXNcblx0ICpcblx0ICovXG5cdHByaXZhdGUganNMb2FkZWQoKVxuXHR7XG5cblx0XHR2YXIgY3JlYXRlUGF0aCA6IEFycmF5PHN0cmluZz4gPSB0aGlzLmNsYXNzUGF0aC5zcGxpdCgnLicpOyAvLyBTcGxpdCB0aGUgY2xhc3NwYXRoXG5cdFx0dmFyIG9iaiAgICAgICAgIDogYW55O1xuXG5cdFx0Zm9yICggdmFyIGMgOiBudW1iZXIgPSAwIDsgYyA8IGNyZWF0ZVBhdGgubGVuZ3RoIDsgYysrIClcblx0XHR7XG5cblx0XHRcdGlmICggb2JqID09IG51bGwgKVxuXHRcdFx0e1xuXHRcdFx0XHRvYmogPSB3aW5kb3dbY3JlYXRlUGF0aFtjXV07IC8vIHJlZmVyZW5jZSBiYXNlIG1vZHVsZSAoIHdpbGwgYmUgYSBjaGlsZCBvZiB0aGUgd2luZG93IClcblx0XHRcdH1cblx0XHRcdGVsc2Vcblx0XHRcdHtcblx0XHRcdFx0b2JqID0gb2JqW2NyZWF0ZVBhdGhbY11dOyAvLyByZWZlcmVuY2Ugc3ViIG1vZHVsZSAvIENsYXNzXG5cdFx0XHR9XG5cblxuXHRcdH1cblxuXHRcdGlmICggb2JqICE9IG51bGwgKVxuXHRcdHtcblx0XHRcdG5ldyBvYmooKTsgLy8gaWYgQ2xhc3MgaGFzIGJlZW4gZm91bmQgLSBzdGFydCB0aGUgdGVzdFxuXHRcdH1cblxuXHR9XG5cblxuXG59XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb21tb24gVXRpbGl0aWVzXG5cbmNsYXNzIFV0aWxzXG57XG5cdC8qKlxuXHQgKlxuXHQgKiBVdGlsaXR5IGZ1bmN0aW9uIC0gUGFyc2UgYSBRdWVyeSBmb3JtYXR0ZWQgc3RyaW5nXG5cdCAqXG5cdCAqIEBwYXJhbSBxc1xuXHQgKiBAcmV0dXJucyB7e319XG5cdCAqL1xuXHRzdGF0aWMgZ2V0UXVlcnlQYXJhbXMoIHFzICkgOiBPYmplY3Qge1xuXG5cdFx0cXMgPSBxcy5zcGxpdChcIitcIikuam9pbihcIiBcIik7XG5cblx0XHR2YXIgcGFyYW1zID0ge30sIHRva2Vucyxcblx0XHRcdHJlID0gL1s/Jl0/KFtePV0rKT0oW14mXSopL2c7XG5cblx0XHR3aGlsZSAodG9rZW5zID0gcmUuZXhlYyhxcykpIHtcblx0XHRcdHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQodG9rZW5zWzFdKV0gPSBkZWNvZGVVUklDb21wb25lbnQodG9rZW5zWzJdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcGFyYW1zO1xuXHR9XG59XG5cbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBEYXRhXG5cbmNsYXNzIFRlc3REYXRhXG57XG5cdHB1YmxpYyBqcyAgICAgICAgICAgOiBzdHJpbmc7XG5cdHB1YmxpYyBjbGFzc3BhdGggICAgOiBzdHJpbmc7XG5cdHB1YmxpYyBzcmMgICAgICAgICAgOiBzdHJpbmc7XG5cdHB1YmxpYyBuYW1lICAgICAgICAgOiBzdHJpbmc7XG5cblx0Y29uc3RydWN0b3IoIG5hbWUgOiBzdHJpbmcgLCBjbGFzc3BhdGggOiBzdHJpbmcgLCBqcyA6IHN0cmluZyAsIHNyYyA6IHN0cmluZyApXG5cdHtcblx0XHR0aGlzLmpzICAgICAgICAgPSBqcztcblx0XHR0aGlzLmNsYXNzcGF0aCAgPSBjbGFzc3BhdGg7XG5cdFx0dGhpcy5zcmMgICAgICAgID0gc3JjO1xuXHRcdHRoaXMubmFtZSAgICAgICA9IG5hbWU7XG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/AppHarness.ts b/tests/AppHarness.ts index 2a2709d8..602ebc48 100644 --- a/tests/AppHarness.ts +++ b/tests/AppHarness.ts @@ -1,469 +1,465 @@ -module away +//--------------------------------------------------- +// Application Harness + +class AppHarness { - //--------------------------------------------------- - // Application Harness - - export class AppHarness - { - - //------------------------------------------------------------------------------ - - private tests : Array = new Array(); - private dropDown : HTMLSelectElement; - private previousBtn : HTMLButtonElement; - private nextBtn : HTMLButtonElement; - private sourceBtn : HTMLButtonElement; - private testIframe : HTMLIFrameElement; - private srcIframe : HTMLIFrameElement; - private counter : number = 0; - private sourceVisible : boolean = false; - private loadDefault : boolean = true; - - //------------------------------------------------------------------------------ - - constructor() - { - - this.initFrameSet(); - this.initInterface(); - - - this.previousBtn.onclick = () => this.nagigateBy( -1 ); - this.nextBtn.onclick = () => this.nagigateBy( 1 ); - this.sourceBtn.onclick = () => this.toggleSource(); - this.dropDown.onchange = ( e ) => this.dropDownChange( e ); - - } - - //------------------------------------------------------------------------------ - - /** - * - * Load a test - * - * @param classPath - Module and Class path of test - * @param js Path to JavaScript file - * @param ts Path to Typescript file ( not yet used - reserved for future show source ) - */ - public load( classPath : string , js : string , ts : string ) : void - { - - this.loadFromURL(); - - if ( this.loadDefault ) - { - window.history.pushState(js, js, '?test=' + js); - this.testIframe.src = 'frame.html?name=' + classPath + '&js=' + js; - this.srcIframe.src = "data:text/html;charset=utf-8," + this.createSourceViewHTML( ts ); - - } - } - - /** - * - * Add a test to the AppHarness - * - * @param name Name of test - * @param classPath - Module and Class path of test - * @param js Path to JavaScript file - * @param ts Path to Typescript file ( not yet used - reserved for future show source ) - */ - public addTest( name : string , classpath : string , js : string , ts : string ) : void - { - this.tests.push ( new TestData( name , classpath , js , ts ) ); - } - - /** - * - * Add a separator to the menu - * - * @param name - */ - public addSeperator( name : string = '' ) : void - { - this.tests.push ( new TestData( '-- ' + name , '' , '' , '') ); - } - - /** - * - * Start the application harness - * - */ - public start( slideshowMode : boolean = false ) : void - { - for ( var c : number = 0 ; c < this.tests.length ; c ++ ) - { - var option : HTMLOptionElement = new Option( this.tests[c].name , String( c ) ); - this.dropDown.add( option ); - } - - if ( slideshowMode ) - { - - setInterval( () => this.nagigateBy( 1 ) , 15000); - } - } - - //------------------------------------------------------------------------------ - - private loadFromURL() : void - { - var queryParams : any = Utils.getQueryParams( document.location.search ); - - if ( queryParams.test != null ) - { - var l : number = this.tests.length; - - for ( var c : number = 0 ; c < l ; c ++ ) - { - if ( this.tests[c].js == queryParams.test ) - { - console.log ( '======>>>> LOAD TEST'); - - this.navigateToSection( this.tests[c] ); - this.loadDefault = false; - } - } - } - } - /** - * - */ - private initInterface() : void - { - - var testSelector : HTMLDivElement = document.createElement( 'div' ); - testSelector.style.cssFloat = 'none'; - testSelector.style.position = 'absolute'; - testSelector.style.bottom = '15px'; - testSelector.style.width = '600px'; - testSelector.style.left = '50%'; - testSelector.style.marginLeft = '-300px' - testSelector.style.textAlign = 'center'; - - - this.dropDown = document.createElement( 'select' ); - this.dropDown.name = "selectTestDropDown" - this.dropDown.id = "selectTest" - - this.sourceBtn = document.createElement( 'button' ); - this.sourceBtn.innerHTML = 'Show Source'; - this.sourceBtn.id = 'previous'; - - this.previousBtn = document.createElement( 'button' ); - this.previousBtn.innerHTML = '<<'; - this.previousBtn.id = 'previous'; - - this.nextBtn = document.createElement( 'button' ); - this.nextBtn.innerHTML = '>>'; - this.nextBtn.id = 'next'; - - - testSelector.appendChild( this.sourceBtn ); - testSelector.appendChild( this.previousBtn ); - testSelector.appendChild( this.dropDown ); - testSelector.appendChild( this.nextBtn ); - document.body.appendChild( testSelector ); - } - /** - * - */ - private initFrameSet() : void - { - - var iframeContainer : HTMLDivElement = document.createElement( 'div' ); - iframeContainer.style.width = '100%'; - iframeContainer.style.height = '100%'; - - this.testIframe = document.createElement( 'iframe' ); - this.testIframe.id = 'testContainer'; - this.testIframe.style.backgroundColor = '#9e9e9e'; - this.testIframe.style.cssFloat = 'none'; - this.testIframe.style.position = 'absolute'; - this.testIframe.style.top = '0px'; - this.testIframe.style.left = '0px'; - this.testIframe.style.border = '0px'; - this.testIframe.style.width = '100%'; - this.testIframe.style.height = '100%'; - //bottom: 120px; - - this.srcIframe = document.createElement( 'iframe' ); - this.srcIframe.id = 'testSourceContainer'; - this.srcIframe.style.backgroundColor = '#9e9e9e'; - this.srcIframe.style.cssFloat = 'none'; - this.srcIframe.style.position = 'absolute'; - this.srcIframe.style.right = '0px'; - this.srcIframe.style.top = '0px'; - this.srcIframe.style.bottom = '0px'; - this.srcIframe.style.border = '0px'; - this.srcIframe.style.width = '0%'; - this.srcIframe.style.height = '100%'; - - iframeContainer.appendChild( this.testIframe ); - iframeContainer.appendChild( this.srcIframe ); - - document.body.appendChild( iframeContainer ); - - } - - /** - * - * Selectnext / previous menu item - * - * @param direction - */ - private nagigateBy( direction : number = 1 ) : void - { - - var l : number = this.tests.length; - var nextCounter = this.counter + direction; - - if ( nextCounter < 0 ) - { - nextCounter = this.tests.length - 1; - } - else if ( nextCounter > this.tests.length - 1 ) - { - nextCounter = 0; - } - - var testData : TestData = this.tests[nextCounter]; - - if ( testData.name.indexOf ('--') != -1 ) // skip section headers - { - this.counter = nextCounter; - this.nagigateBy( direction ); - } - else - { - this.navigateToSection( testData ); - this.dropDown.selectedIndex = nextCounter; - this.counter = nextCounter; - } - - } - - /** - * - * Navigate to a section - * - * @param testData - */ - private navigateToSection ( testData : TestData ) : void - { - window.history.pushState(testData.js, testData.js, '?test=' + testData.js); - this.srcIframe.src = "data:text/html;charset=utf-8," + this.createSourceViewHTML( testData.src ); - this.testIframe.src = 'frame.html?name=' + testData.classpath + '&js=' + testData.js; - } - - private toggleSource() : void - { - - if ( this.sourceVisible ) - { - this.testIframe.style.width = '100%'; - this.srcIframe.style.width = '0%'; - this.sourceBtn.innerHTML = 'Show Source'; - } - else - { - this.testIframe.style.width = '20%'; - this.srcIframe.style.width = '80%'; - this.sourceBtn.innerHTML = 'Hide Source'; - } - - this.sourceVisible = !this.sourceVisible; - - } - - private createSourceViewHTML ( url : string ) : string - { - - var html : string = ''; - - html += ''; - html += ''; - html += ' '; - html += ' '; - html += ' '; - html += ' '; - html += ''; - html += ''; - html += ''; - html += ''; - - return html; - } - - //------------------------------------------------------------------------------ - // Utils - - /** - * - * Util function - get Element by ID - * - * @param id - * @returns {HTMLElement} - */ - private getId(id : string ) : HTMLElement - { - return document.getElementById( id ); - } - - //------------------------------------------------------------------------------ - // Events - - /** - * - * Dropbox event handler - * - * @param e - */ - private dropDownChange( e ) : void - { - this.dropDown.options[this.dropDown.selectedIndex].value - this.counter = this.dropDown.selectedIndex; - var dataIndex : number = parseInt( this.dropDown.options[this.dropDown.selectedIndex].value ) ; - - if ( ! isNaN( dataIndex ) ) - { - this.navigateToSection( this.tests[dataIndex] ); - } - } - - } - - //--------------------------------------------------- - // Application Frame - - export class AppFrame - { - - private classPath : string = ''; - private jsPath : string = ''; - - constructor( ) - { - - var queryParams : any = Utils.getQueryParams( document.location.search ); - - if ( queryParams.js != undefined && queryParams.name != undefined ) - { - - this.jsPath = queryParams.js; - this.classPath = queryParams.name; - this.loadJS( this.jsPath ); - - } - - } - - /** - * - * Load a JavaScript file - * - * @param url - URL of JavaScript file - */ - private loadJS(url : string ) - { - - var head : HTMLElement = document.getElementsByTagName("head")[0]; - var script : HTMLScriptElement = document.createElement("script"); - script.type = "text/javascript"; - script.src = url; - script.onload = () => this.jsLoaded(); - - head.appendChild(script); - } - - /** - * - * Event Handler for loaded JavaScript files - * - */ - private jsLoaded() - { - - var createPath : Array = this.classPath.split('.'); // Split the classpath - var obj : any; + //------------------------------------------------------------------------------ + + private tests : Array = new Array(); + private dropDown : HTMLSelectElement; + private previousBtn : HTMLButtonElement; + private nextBtn : HTMLButtonElement; + private sourceBtn : HTMLButtonElement; + private testIframe : HTMLIFrameElement; + private srcIframe : HTMLIFrameElement; + private counter : number = 0; + private sourceVisible : boolean = false; + private loadDefault : boolean = true; + + //------------------------------------------------------------------------------ + + constructor() + { + + this.initFrameSet(); + this.initInterface(); + + + this.previousBtn.onclick = () => this.nagigateBy( -1 ); + this.nextBtn.onclick = () => this.nagigateBy( 1 ); + this.sourceBtn.onclick = () => this.toggleSource(); + this.dropDown.onchange = ( e ) => this.dropDownChange( e ); + + } + + //------------------------------------------------------------------------------ + + /** + * + * Load a test + * + * @param classPath - Module and Class path of test + * @param js Path to JavaScript file + * @param ts Path to Typescript file ( not yet used - reserved for future show source ) + */ + public load( classPath : string , js : string , ts : string ) : void + { + + this.loadFromURL(); + + if ( this.loadDefault ) + { + window.history.pushState(js, js, '?test=' + js); + this.testIframe.src = 'frame.html?name=' + classPath + '&js=' + js; + this.srcIframe.src = "data:text/html;charset=utf-8," + this.createSourceViewHTML( ts ); + + } + } + + /** + * + * Add a test to the AppHarness + * + * @param name Name of test + * @param classPath - Module and Class path of test + * @param js Path to JavaScript file + * @param ts Path to Typescript file ( not yet used - reserved for future show source ) + */ + public addTest( name : string , classpath : string , js : string , ts : string ) : void + { + this.tests.push ( new TestData( name , classpath , js , ts ) ); + } + + /** + * + * Add a separator to the menu + * + * @param name + */ + public addSeperator( name : string = '' ) : void + { + this.tests.push ( new TestData( '-- ' + name , '' , '' , '') ); + } + + /** + * + * Start the application harness + * + */ + public start( slideshowMode : boolean = false ) : void + { + for ( var c : number = 0 ; c < this.tests.length ; c ++ ) + { + var option : HTMLOptionElement = new Option( this.tests[c].name , String( c ) ); + this.dropDown.add( option ); + } + + if ( slideshowMode ) + { + + setInterval( () => this.nagigateBy( 1 ) , 15000); + } + } + + //------------------------------------------------------------------------------ + + private loadFromURL() : void + { + var queryParams : any = Utils.getQueryParams( document.location.search ); + + if ( queryParams.test != null ) + { + var l : number = this.tests.length; + + for ( var c : number = 0 ; c < l ; c ++ ) + { + if ( this.tests[c].js == queryParams.test ) + { + console.log ( '======>>>> LOAD TEST'); + + this.navigateToSection( this.tests[c] ); + this.loadDefault = false; + } + } + } + } + /** + * + */ + private initInterface() : void + { + + var testSelector : HTMLDivElement = document.createElement( 'div' ); + testSelector.style.cssFloat = 'none'; + testSelector.style.position = 'absolute'; + testSelector.style.bottom = '15px'; + testSelector.style.width = '600px'; + testSelector.style.left = '50%'; + testSelector.style.marginLeft = '-300px' + testSelector.style.textAlign = 'center'; + + + this.dropDown = document.createElement( 'select' ); + this.dropDown.name = "selectTestDropDown" + this.dropDown.id = "selectTest" + + this.sourceBtn = document.createElement( 'button' ); + this.sourceBtn.innerHTML = 'Show Source'; + this.sourceBtn.id = 'previous'; + + this.previousBtn = document.createElement( 'button' ); + this.previousBtn.innerHTML = '<<'; + this.previousBtn.id = 'previous'; + + this.nextBtn = document.createElement( 'button' ); + this.nextBtn.innerHTML = '>>'; + this.nextBtn.id = 'next'; + + + testSelector.appendChild( this.sourceBtn ); + testSelector.appendChild( this.previousBtn ); + testSelector.appendChild( this.dropDown ); + testSelector.appendChild( this.nextBtn ); + document.body.appendChild( testSelector ); + } + /** + * + */ + private initFrameSet() : void + { + + var iframeContainer : HTMLDivElement = document.createElement( 'div' ); + iframeContainer.style.width = '100%'; + iframeContainer.style.height = '100%'; + + this.testIframe = document.createElement( 'iframe' ); + this.testIframe.id = 'testContainer'; + this.testIframe.style.backgroundColor = '#9e9e9e'; + this.testIframe.style.cssFloat = 'none'; + this.testIframe.style.position = 'absolute'; + this.testIframe.style.top = '0px'; + this.testIframe.style.left = '0px'; + this.testIframe.style.border = '0px'; + this.testIframe.style.width = '100%'; + this.testIframe.style.height = '100%'; + //bottom: 120px; + + this.srcIframe = document.createElement( 'iframe' ); + this.srcIframe.id = 'testSourceContainer'; + this.srcIframe.style.backgroundColor = '#9e9e9e'; + this.srcIframe.style.cssFloat = 'none'; + this.srcIframe.style.position = 'absolute'; + this.srcIframe.style.right = '0px'; + this.srcIframe.style.top = '0px'; + this.srcIframe.style.bottom = '0px'; + this.srcIframe.style.border = '0px'; + this.srcIframe.style.width = '0%'; + this.srcIframe.style.height = '100%'; + + iframeContainer.appendChild( this.testIframe ); + iframeContainer.appendChild( this.srcIframe ); + + document.body.appendChild( iframeContainer ); + + } + + /** + * + * Selectnext / previous menu item + * + * @param direction + */ + private nagigateBy( direction : number = 1 ) : void + { + + var l : number = this.tests.length; + var nextCounter = this.counter + direction; + + if ( nextCounter < 0 ) + { + nextCounter = this.tests.length - 1; + } + else if ( nextCounter > this.tests.length - 1 ) + { + nextCounter = 0; + } + + var testData : TestData = this.tests[nextCounter]; - for ( var c : number = 0 ; c < createPath.length ; c++ ) - { + if ( testData.name.indexOf ('--') != -1 ) // skip section headers + { + this.counter = nextCounter; + this.nagigateBy( direction ); + } + else + { + this.navigateToSection( testData ); + this.dropDown.selectedIndex = nextCounter; + this.counter = nextCounter; + } + + } + + /** + * + * Navigate to a section + * + * @param testData + */ + private navigateToSection ( testData : TestData ) : void + { + window.history.pushState(testData.js, testData.js, '?test=' + testData.js); + this.srcIframe.src = "data:text/html;charset=utf-8," + this.createSourceViewHTML( testData.src ); + this.testIframe.src = 'frame.html?name=' + testData.classpath + '&js=' + testData.js; + } + + private toggleSource() : void + { + + if ( this.sourceVisible ) + { + this.testIframe.style.width = '100%'; + this.srcIframe.style.width = '0%'; + this.sourceBtn.innerHTML = 'Show Source'; + } + else + { + this.testIframe.style.width = '20%'; + this.srcIframe.style.width = '80%'; + this.sourceBtn.innerHTML = 'Hide Source'; + } + + this.sourceVisible = !this.sourceVisible; + + } + + private createSourceViewHTML ( url : string ) : string + { + + var html : string = ''; + + html += ''; + html += ''; + html += ' '; + html += ' '; + html += ' '; + html += ' '; + html += ''; + html += ''; + html += ''; + html += ''; + + return html; + } + + //------------------------------------------------------------------------------ + // Utils + + /** + * + * Util function - get Element by ID + * + * @param id + * @returns {HTMLElement} + */ + private getId(id : string ) : HTMLElement + { + return document.getElementById( id ); + } + + //------------------------------------------------------------------------------ + // Events + + /** + * + * Dropbox event handler + * + * @param e + */ + private dropDownChange( e ) : void + { + this.dropDown.options[this.dropDown.selectedIndex].value + this.counter = this.dropDown.selectedIndex; + var dataIndex : number = parseInt( this.dropDown.options[this.dropDown.selectedIndex].value ) ; + + if ( ! isNaN( dataIndex ) ) + { + this.navigateToSection( this.tests[dataIndex] ); + } + } + +} + +//--------------------------------------------------- +// Application Frame - if ( obj == null ) - { - obj = window[createPath[c]]; // reference base module ( will be a child of the window ) - } - else - { - obj = obj[createPath[c]]; // reference sub module / Class - } +class AppFrame +{ + + private classPath : string = ''; + private jsPath : string = ''; + + constructor( ) + { + var queryParams : any = Utils.getQueryParams( document.location.search ); - } + if ( queryParams.js != undefined && queryParams.name != undefined ) + { - if ( obj != null ) - { - new obj(); // if Class has been found - start the test - } + this.jsPath = queryParams.js; + this.classPath = queryParams.name; + this.loadJS( this.jsPath ); - } + } + } + /** + * + * Load a JavaScript file + * + * @param url - URL of JavaScript file + */ + private loadJS(url : string ) + { - } + var head : HTMLElement = document.getElementsByTagName("head")[0]; + var script : HTMLScriptElement = document.createElement("script"); + script.type = "text/javascript"; + script.src = url; + script.onload = () => this.jsLoaded(); - //--------------------------------------------------- - // Common Utilities + head.appendChild(script); + } - export class Utils + /** + * + * Event Handler for loaded JavaScript files + * + */ + private jsLoaded() { - /** - * - * Utility function - Parse a Query formatted string - * - * @param qs - * @returns {{}} - */ - static getQueryParams( qs ) : Object { - - qs = qs.split("+").join(" "); - - var params = {}, tokens, - re = /[?&]?([^=]+)=([^&]*)/g; - - while (tokens = re.exec(qs)) { - params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + + var createPath : Array = this.classPath.split('.'); // Split the classpath + var obj : any; + + for ( var c : number = 0 ; c < createPath.length ; c++ ) + { + + if ( obj == null ) + { + obj = window[createPath[c]]; // reference base module ( will be a child of the window ) + } + else + { + obj = obj[createPath[c]]; // reference sub module / Class } - return params; + + } + + if ( obj != null ) + { + new obj(); // if Class has been found - start the test } + } - //--------------------------------------------------- - // Data - - class TestData - { - public js : string; - public classpath : string; - public src : string; - public name : string; - - constructor( name : string , classpath : string , js : string , src : string ) - { - this.js = js; - this.classpath = classpath; - this.src = src; - this.name = name; - } - } + + +} + +//--------------------------------------------------- +// Common Utilities + +class Utils +{ + /** + * + * Utility function - Parse a Query formatted string + * + * @param qs + * @returns {{}} + */ + static getQueryParams( qs ) : Object { + + qs = qs.split("+").join(" "); + + var params = {}, tokens, + re = /[?&]?([^=]+)=([^&]*)/g; + + while (tokens = re.exec(qs)) { + params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); + } + + return params; + } +} + +//--------------------------------------------------- +// Data + +class TestData +{ + public js : string; + public classpath : string; + public src : string; + public name : string; + + constructor( name : string , classpath : string , js : string , src : string ) + { + this.js = js; + this.classpath = classpath; + this.src = src; + this.name = name; + } } \ No newline at end of file diff --git a/tests/base/BitmapDataTest.js b/tests/base/BitmapDataTest.js new file mode 100755 index 00000000..6e98812a --- /dev/null +++ b/tests/base/BitmapDataTest.js @@ -0,0 +1,160 @@ +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var Matrix = require("awayjs-core/lib/core/geom/Matrix"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +var URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var AwayEvent = require("awayjs-core/lib/events/Event"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +var ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +var BitmapDataTest = (function () { + function BitmapDataTest() { + var _this = this; + var transparent = true; + var initcolour = 0xffffffff; + + //--------------------------------------- + // Load a PNG + this.urlRequest = new URLRequest('assets/256x256.png'); + this.urlLoader = new URLLoader(); + this.urlLoader.dataFormat = URLLoaderDataFormat.BLOB; + + this.urlLoader.load(this.urlRequest); + this.urlLoader.addEventListener(AwayEvent.COMPLETE, function (event) { + return _this.imgLoaded(event); + }); + this.urlLoader.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.imgLoadedError(event); + }); + + //--------------------------------------- + // BitmapData Object - 1 + this.bitmapData = new BitmapData(256, 256, transparent, initcolour); + document.body.appendChild(this.bitmapData.canvas); + + //--------------------------------------- + // BitmapData Object - 2 + this.bitmapDataB = new BitmapData(256, 256, transparent, initcolour); + this.bitmapDataB.canvas.style.position = 'absolute'; + this.bitmapDataB.canvas.style.left = '540px'; + document.body.appendChild(this.bitmapDataB.canvas); + + //--------------------------------------- + // BitmapData - setPixel test + console['time']("bitmapdata"); // start setPixel operation benchmark ( TypeScript does not support console.time - so hacking it in ) . + + this.bitmapDataB.lock(); + + for (var i = 0; i < 10000; i++) { + var x = Math.random() * this.bitmapDataB.width | 0; + var y = Math.random() * this.bitmapDataB.height | 0; + this.bitmapDataB.setPixel(x, y, Math.random() * 0xffFFFFFF); // 255 opaque + } + + this.bitmapDataB.unlock(); + console['timeEnd']("bitmapdata"); // benchmark the setPixel operation + + document.onmousedown = function (event) { + return _this.onMouseDown(event); + }; + } + BitmapDataTest.prototype.onMouseDown = function (event) { + if (this.bitmapData.width === 512) { + if (this.image.complete) { + this.bitmapDataB.lock(); // Lock bitmap - speeds up setPixelOperations + + //--------------------------------------- + // Resize BitmapData + this.bitmapData.width = 256; + this.bitmapData.height = 256; + + //--------------------------------------- + // copy loaded image to first BitmapData + var rect = new Rectangle(0, 0, this.image.width, this.image.height); + this.bitmapData.drawImage(this.image, rect, rect); + + //--------------------------------------- + // copy image into second bitmap data ( and scale it up 2X ) + rect.width = rect.width * 2; + rect.height = rect.height * 2; + + this.bitmapDataB.copyPixels(this.bitmapData, this.bitmapData.rect, rect); + + for (var d = 0; d < 1000; d++) { + var x = Math.random() * this.bitmapDataB.width | 0; + var y = Math.random() * this.bitmapDataB.height | 0; + this.bitmapDataB.setPixel(x, y, Math.random() * 0xFFFFFFFF); // 255 opaque + } + + this.bitmapDataB.unlock(); // Unlock bitmapdata + } else { + //--------------------------------------- + // image is not loaded - fill bitmapdata with red + this.bitmapData.width = 256; + this.bitmapData.height = 256; + this.bitmapData.fillRect(this.bitmapData.rect, 0xffff0000); + } + } else { + //--------------------------------------- + // resize bitmapdata; + this.bitmapData.lock(); + + this.bitmapData.width = 512; + this.bitmapData.height = 512; + this.bitmapData.fillRect(this.bitmapData.rect, 0xffff0000); // fill it RED + + for (var d = 0; d < 1000; d++) { + var x = Math.random() * this.bitmapData.width | 0; + var y = Math.random() * this.bitmapData.height | 0; + this.bitmapData.setPixel(x, y, Math.random() * 0xFFFFFFFF); + } + + this.bitmapData.unlock(); + + //--------------------------------------- + // copy bitmapdata + var targetRect = this.bitmapDataB.rect.clone(); + targetRect.width = targetRect.width / 2; + targetRect.height = targetRect.height / 2; + + this.bitmapDataB.copyPixels(this.bitmapData, this.bitmapDataB.rect, targetRect); // copy first bitmapdata object into the second one + } + + var m = new Matrix(.5, .08, .08, .5, this.image.width / 2, this.image.height / 2); + this.bitmapData.draw(this.bitmapData, m); + + this.bitmapData.setPixel32(0, 0, 0xccff0000); + this.bitmapData.setPixel32(1, 0, 0xcc00ff00); + this.bitmapData.setPixel32(2, 0, 0xcc0000ff); + + this.bitmapDataB.draw(this.bitmapData, m); + + console.log('GetPixel 0,0: ', ColorUtils.ARGBToHexString(ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(0, 0)))); + console.log('GetPixel 1,0: ', ColorUtils.ARGBToHexString(ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(1, 0)))); + console.log('GetPixel 2,0: ', ColorUtils.ARGBToHexString(ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(2, 0)))); + }; + + BitmapDataTest.prototype.imgLoadedError = function (event) { + console.log('error'); + }; + + BitmapDataTest.prototype.imgLoaded = function (event) { + var _this = this; + var loader = event.target; + this.image = ParserUtils.blobToImage(loader.data); + this.image.onload = function (event) { + return _this.onImageLoad(event); + }; + }; + + BitmapDataTest.prototype.onImageLoad = function (event) { + this.bitmapData.drawImage(this.image, new Rectangle(0, 0, this.image.width, this.image.height), new Rectangle(0, 0, this.image.width / 2, this.image.height / 2)); + + this.bitmapData.draw(this.bitmapData, new Matrix(.5, .08, .08, .5, this.image.width / 2, this.image.height / 2)); + }; + return BitmapDataTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImJhc2UvQml0bWFwRGF0YVRlc3QudHMiXSwibmFtZXMiOlsiQml0bWFwRGF0YVRlc3QiLCJCaXRtYXBEYXRhVGVzdC5jb25zdHJ1Y3RvciIsIkJpdG1hcERhdGFUZXN0Lm9uTW91c2VEb3duIiwiQml0bWFwRGF0YVRlc3QuaW1nTG9hZGVkRXJyb3IiLCJCaXRtYXBEYXRhVGVzdC5pbWdMb2FkZWQiLCJCaXRtYXBEYXRhVGVzdC5vbkltYWdlTG9hZCJdLCJtYXBwaW5ncyI6IkFBQUEsZ0VBQXVFO0FBQ3ZFLHdEQUFnRTtBQUNoRSw4REFBcUU7QUFDckUsNkRBQW9FO0FBQ3BFLGlGQUFzRjtBQUN0RiwrREFBc0U7QUFDdEUsdURBQThEO0FBQzlELGlFQUF3RTtBQUN4RSxnRUFBdUU7QUFDdkUsNERBQW1FOztBQUVuRTtJQVFDQTtRQUFBQyxpQkE0Q0NBO1FBMUNBQSxJQUFJQSxXQUFXQSxHQUFXQSxJQUFJQTtRQUM5QkEsSUFBSUEsVUFBVUEsR0FBVUEsVUFBVUE7O1FBRWxDQSx5Q0FBeUNBO1FBQ3pDQSxhQUFhQTtRQUViQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxJQUFJQSxVQUFVQSxDQUFDQSxvQkFBb0JBLENBQUNBO1FBQ3REQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSxJQUFJQSxTQUFTQSxDQUFDQSxDQUFDQTtRQUNoQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsVUFBVUEsR0FBR0EsbUJBQW1CQSxDQUFDQSxJQUFJQTs7UUFFcERBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBO1FBQ3BDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFNBQVNBLENBQUNBLFFBQVFBLEVBQUVBLFVBQUNBLEtBQWVBO21CQUFLQSxLQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUFyQkEsQ0FBcUJBLENBQUNBO1FBQy9GQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFlBQVlBLENBQUNBLFFBQVFBLEVBQUVBLFVBQUNBLEtBQWtCQTttQkFBS0EsS0FBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBMUJBLENBQTBCQSxDQUFDQTs7UUFFMUdBLHlDQUF5Q0E7UUFDekNBLHdCQUF3QkE7UUFDeEJBLElBQUlBLENBQUNBLFVBQVVBLEdBQUdBLElBQUlBLFVBQVVBLENBQUNBLEdBQUdBLEVBQUdBLEdBQUdBLEVBQUVBLFdBQVdBLEVBQUVBLFVBQVVBLENBQUNBO1FBQ3BFQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxNQUFNQSxDQUFDQTs7UUFFakRBLHlDQUF5Q0E7UUFDekNBLHdCQUF3QkE7UUFDeEJBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLElBQUlBLFVBQVVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLFdBQVdBLEVBQUVBLFVBQVVBLENBQUNBO1FBQ3BFQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxHQUFHQSxVQUFVQTtRQUNuREEsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsR0FBR0EsT0FBT0E7UUFDNUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLE1BQU1BLENBQUNBOztRQUVsREEseUNBQXlDQTtRQUN6Q0EsNkJBQTZCQTtRQUM3QkEsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsWUFBWUEsQ0FBQ0EsRUFBRUEsdUdBQXVHQTs7UUFFdElBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBOztRQUV2QkEsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsS0FBS0EsRUFBRUEsQ0FBQ0EsRUFB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N0dBLENBQUNBO0lBQ0ZMLHNCQUFDQTtBQUFEQSxDQUFDQSxJQUFBO0FBQUEiLCJmaWxlIjoiYmFzZS9CaXRtYXBEYXRhVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRtYXBEYXRhXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0JpdG1hcERhdGFcIik7XG5pbXBvcnQgTWF0cml4XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4XCIpO1xuaW1wb3J0IFJlY3RhbmdsZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9SZWN0YW5nbGVcIik7XG5pbXBvcnQgVVJMTG9hZGVyXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMTG9hZGVyXCIpO1xuaW1wb3J0IFVSTExvYWRlckRhdGFGb3JtYXRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTExvYWRlckRhdGFGb3JtYXRcIik7XG5pbXBvcnQgVVJMUmVxdWVzdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTFJlcXVlc3RcIik7XG5pbXBvcnQgQXdheUV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuaW1wb3J0IElPRXJyb3JFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9JT0Vycm9yRXZlbnRcIik7XG5pbXBvcnQgUGFyc2VyVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlclV0aWxzXCIpO1xuaW1wb3J0IENvbG9yVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi91dGlscy9Db2xvclV0aWxzXCIpO1xuXG5jbGFzcyBCaXRtYXBEYXRhVGVzdFxue1xuXHRwcml2YXRlIGJpdG1hcERhdGE6Qml0bWFwRGF0YTtcblx0cHJpdmF0ZSBiaXRtYXBEYXRhQjpCaXRtYXBEYXRhO1xuXHRwcml2YXRlIHVybExvYWRlcjpVUkxMb2FkZXI7XG5cdHByaXZhdGUgdXJsUmVxdWVzdDpVUkxSZXF1ZXN0O1xuXHRwcml2YXRlIGltYWdlOkhUTUxJbWFnZUVsZW1lbnQ7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dmFyIHRyYW5zcGFyZW50OmJvb2xlYW4gPSB0cnVlO1xuXHRcdHZhciBpbml0Y29sb3VyOm51bWJlciA9IDB4ZmZmZmZmZmY7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIExvYWQgYSBQTkdcblxuXHRcdHRoaXMudXJsUmVxdWVzdCA9IG5ldyBVUkxSZXF1ZXN0KCdhc3NldHMvMjU2eDI1Ni5wbmcnKTtcblx0XHR0aGlzLnVybExvYWRlciA9IG5ldyBVUkxMb2FkZXIoKTtcblx0XHR0aGlzLnVybExvYWRlci5kYXRhRm9ybWF0ID0gVVJMTG9hZGVyRGF0YUZvcm1hdC5CTE9CO1xuXG5cdFx0dGhpcy51cmxMb2FkZXIubG9hZCh0aGlzLnVybFJlcXVlc3QpO1xuXHRcdHRoaXMudXJsTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoQXdheUV2ZW50LkNPTVBMRVRFLCAoZXZlbnQ6QXdheUV2ZW50KSA9PiB0aGlzLmltZ0xvYWRlZChldmVudCkpO1xuXHRcdHRoaXMudXJsTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoSU9FcnJvckV2ZW50LklPX0VSUk9SLCAoZXZlbnQ6SU9FcnJvckV2ZW50KSA9PiB0aGlzLmltZ0xvYWRlZEVycm9yKGV2ZW50KSk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIEJpdG1hcERhdGEgT2JqZWN0IC0gMVxuXHRcdHRoaXMuYml0bWFwRGF0YSA9IG5ldyBCaXRtYXBEYXRhKDI1NiwgIDI1NiwgdHJhbnNwYXJlbnQsIGluaXRjb2xvdXIpO1xuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5iaXRtYXBEYXRhLmNhbnZhcyk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIEJpdG1hcERhdGEgT2JqZWN0IC0gMlxuXHRcdHRoaXMuYml0bWFwRGF0YUIgPSBuZXcgQml0bWFwRGF0YSgyNTYsIDI1NiwgdHJhbnNwYXJlbnQsIGluaXRjb2xvdXIpO1xuXHRcdHRoaXMuYml0bWFwRGF0YUIuY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcblx0XHR0aGlzLmJpdG1hcERhdGFCLmNhbnZhcy5zdHlsZS5sZWZ0ID0gJzU0MHB4Jztcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMuYml0bWFwRGF0YUIuY2FudmFzKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gQml0bWFwRGF0YSAtIHNldFBpeGVsIHRlc3Rcblx0XHRjb25zb2xlWyd0aW1lJ10oXCJiaXRtYXBkYXRhXCIpOyAvLyBzdGFydCBzZXRQaXhlbCBvcGVyYXRpb24gYmVuY2htYXJrICggVHlwZVNjcmlwdCBkb2VzIG5vdCBzdXBwb3J0IGNvbnNvbGUudGltZSAtIHNvIGhhY2tpbmcgaXQgaW4gKSAuXG5cblx0XHR0aGlzLmJpdG1hcERhdGFCLmxvY2soKTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDA7IGkrKykge1xuXHRcdFx0dmFyIHggPSBNYXRoLnJhbmRvbSgpICogdGhpcy5iaXRtYXBEYXRhQi53aWR0aCB8IDA7IC8vIHwwIHRvIHRydW5jYXRlIHRvIEludDMyXG5cdFx0XHR2YXIgeSA9IE1hdGgucmFuZG9tKCkgKiB0aGlzLmJpdG1hcERhdGFCLmhlaWdodCB8IDA7XG5cdFx0XHR0aGlzLmJpdG1hcERhdGFCLnNldFBpeGVsKHgsIHksIE1hdGgucmFuZG9tKCkgKiAweGZmRkZGRkZGICk7IC8vIDI1NSBvcGFxdWVcblx0XHR9XG5cblx0XHR0aGlzLmJpdG1hcERhdGFCLnVubG9jaygpO1xuXHRcdGNvbnNvbGVbJ3RpbWVFbmQnXShcImJpdG1hcGRhdGFcIik7IC8vIGJlbmNobWFyayB0aGUgc2V0UGl4ZWwgb3BlcmF0aW9uXG5cblx0XHRkb2N1bWVudC5vbm1vdXNlZG93biA9IChldmVudDpNb3VzZUV2ZW50KSA9PiB0aGlzLm9uTW91c2VEb3duKGV2ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgb25Nb3VzZURvd24oZXZlbnQ6TW91c2VFdmVudClcblx0e1xuXHRcdGlmICggdGhpcy5iaXRtYXBEYXRhLndpZHRoID09PSA1MTIgKSB7Ly8gVGVzdCB0byB0b2dnbGUgcmVzaXplIG9mIGJpdG1hcERhdGFcblx0XHRcdGlmICggdGhpcy5pbWFnZS5jb21wbGV0ZSApIHsvLyBJZiBpbWFnZSBpcyBsb2FkZWQgY29weSB0aGF0IHRvIHRoZSBCaXRtYXBEYXRhIG9iamVjdFxuXHRcdFx0XHR0aGlzLmJpdG1hcERhdGFCLmxvY2soKTsgLy8gTG9jayBiaXRtYXAgLSBzcGVlZHMgdXAgc2V0UGl4ZWxPcGVyYXRpb25zXG5cdFx0XHRcdFxuXHRcdFx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdFx0XHQvLyBSZXNpemUgQml0bWFwRGF0YVxuXHRcdFx0XHR0aGlzLmJpdG1hcERhdGEud2lkdGggID0gMjU2O1xuXHRcdFx0XHR0aGlzLmJpdG1hcERhdGEuaGVpZ2h0ID0gMjU2O1xuXG5cdFx0XHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0XHRcdC8vIGNvcHkgbG9hZGVkIGltYWdlIHRvIGZpcnN0IEJpdG1hcERhdGFcblxuXHRcdFx0XHR2YXIgcmVjdDpSZWN0YW5nbGUgPSBuZXcgUmVjdGFuZ2xlKDAsIDAsIHRoaXMuaW1hZ2Uud2lkdGgsIHRoaXMuaW1hZ2UuaGVpZ2h0KTtcblx0XHRcdFx0dGhpcy5iaXRtYXBEYXRhLmRyYXdJbWFnZSh0aGlzLmltYWdlLCByZWN0LCAgcmVjdCk7XG5cblx0XHRcdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRcdFx0Ly8gY29weSBpbWFnZSBpbnRvIHNlY29uZCBiaXRtYXAgZGF0YSAoIGFuZCBzY2FsZSBpdCB1cCAyWCApXG5cdFx0XHRcdHJlY3Qud2lkdGggPSByZWN0LndpZHRoICogMjtcblx0XHRcdFx0cmVjdC5oZWlnaHQgPSByZWN0LmhlaWdodCAqIDI7XG5cblx0XHRcdFx0dGhpcy5iaXRtYXBEYXRhQi5jb3B5UGl4ZWxzKHRoaXMuYml0bWFwRGF0YSwgdGhpcy5iaXRtYXBEYXRhLnJlY3QsIHJlY3QpO1xuXG5cdFx0XHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0XHRcdC8vIGRyYXcgcmFuZG9tIHBpeGVsc1xuXG5cdFx0XHRcdGZvciAodmFyIGQgPSAwOyBkIDwgMTAwMDsgZCsrKSB7XG5cdFx0XHRcdFx0dmFyIHggPSBNYXRoLnJhbmRvbSgpKnRoaXMuYml0bWFwRGF0YUIud2lkdGggfCAwOyAvLyB8MCB0byB0cnVuY2F0ZSB0byBJbnQzMlxuXHRcdFx0XHRcdHZhciB5ID0gTWF0aC5yYW5kb20oKSp0aGlzLmJpdG1hcERhdGFCLmhlaWdodCB8IDA7XG5cdFx0XHRcdFx0dGhpcy5iaXRtYXBEYXRhQi5zZXRQaXhlbCh4LCB5LCBNYXRoLnJhbmRvbSgpKjB4RkZGRkZGRkYpOyAvLyAyNTUgb3BhcXVlXG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmJpdG1hcERhdGFCLnVubG9jaygpOyAvLyBVbmxvY2sgYml0bWFwZGF0YVxuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdFx0XHQvLyBpbWFnZSBpcyBub3QgbG9hZGVkIC0gZmlsbCBiaXRtYXBkYXRhIHdpdGggcmVkXG5cdFx0XHRcdHRoaXMuYml0bWFwRGF0YS53aWR0aCAgPSAyNTY7XG5cdFx0XHRcdHRoaXMuYml0bWFwRGF0YS5oZWlnaHQgPSAyNTY7XG5cdFx0XHRcdHRoaXMuYml0bWFwRGF0YS5maWxsUmVjdCh0aGlzLmJpdG1hcERhdGEucmVjdCwgMHhmZmZmMDAwMCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0XHQvLyByZXNpemUgYml0bWFwZGF0YTtcblxuXHRcdFx0dGhpcy5iaXRtYXBEYXRhLmxvY2soKTtcblxuXHRcdFx0dGhpcy5iaXRtYXBEYXRhLndpZHRoICA9IDUxMjtcblx0XHRcdHRoaXMuYml0bWFwRGF0YS5oZWlnaHQgPSA1MTI7XG5cdFx0XHR0aGlzLmJpdG1hcERhdGEuZmlsbFJlY3QodGhpcy5iaXRtYXBEYXRhLnJlY3QsIDB4ZmZmZjAwMDApOyAvLyBmaWxsIGl0IFJFRFxuXG5cdFx0XHRmb3IgKHZhciBkID0gMDsgZCA8IDEwMDA7IGQrKykge1xuXHRcdFx0XHR2YXIgeCA9IE1hdGgucmFuZG9tKCkqdGhpcy5iaXRtYXBEYXRhLndpZHRoIHwgMDsgLy8gfDAgdG8gdHJ1bmNhdGUgdG8gSW50MzJcblx0XHRcdFx0dmFyIHkgPSBNYXRoLnJhbmRvbSgpKnRoaXMuYml0bWFwRGF0YS5oZWlnaHQgfCAwO1xuXHRcdFx0XHR0aGlzLmJpdG1hcERhdGEuc2V0UGl4ZWwoeCwgeSwgTWF0aC5yYW5kb20oKSoweEZGRkZGRkZGKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5iaXRtYXBEYXRhLnVubG9jaygpO1xuXHRcdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHRcdC8vIGNvcHkgYml0bWFwZGF0YVxuXG5cdFx0XHR2YXIgdGFyZ2V0UmVjdCA9IHRoaXMuYml0bWFwRGF0YUIucmVjdC5jbG9uZSgpO1xuXHRcdFx0XHR0YXJnZXRSZWN0LndpZHRoID0gdGFyZ2V0UmVjdC53aWR0aC8yO1xuXHRcdFx0XHR0YXJnZXRSZWN0LmhlaWdodCA9IHRhcmdldFJlY3QuaGVpZ2h0LzI7XG5cblx0XHRcdHRoaXMuYml0bWFwRGF0YUIuY29weVBpeGVscyh0aGlzLmJpdG1hcERhdGEsIHRoaXMuYml0bWFwRGF0YUIucmVjdCwgdGFyZ2V0UmVjdCk7IC8vIGNvcHkgZmlyc3QgYml0bWFwZGF0YSBvYmplY3QgaW50byB0aGUgc2Vjb25kIG9uZVxuXHRcdH1cblxuXHRcdHZhciBtIDogTWF0cml4ID0gbmV3IE1hdHJpeCguNSwgLjA4LCAuMDgsIC41LCB0aGlzLmltYWdlLndpZHRoLzIsIHRoaXMuaW1hZ2UuaGVpZ2h0LzIpO1xuXHRcdHRoaXMuYml0bWFwRGF0YS5kcmF3KHRoaXMuYml0bWFwRGF0YSwgbSk7XG5cblx0XHR0aGlzLmJpdG1hcERhdGEuc2V0UGl4ZWwzMigwLCAwLCAweGNjZmYwMDAwKSA7XG5cdFx0dGhpcy5iaXRtYXBEYXRhLnNldFBpeGVsMzIoMSwgMCwgMHhjYzAwZmYwMCkgO1xuXHRcdHRoaXMuYml0bWFwRGF0YS5zZXRQaXhlbDMyKDIsIDAsIDB4Y2MwMDAwZmYpIDtcblxuXHRcdHRoaXMuYml0bWFwRGF0YUIuZHJhdyh0aGlzLmJpdG1hcERhdGEsIG0pO1xuXG5cdFx0Y29uc29sZS5sb2coJ0dldFBpeGVsIDAsMDogJywgQ29sb3JVdGlscy5BUkdCVG9IZXhTdHJpbmcoQ29sb3JVdGlscy5mbG9hdDMyQ29sb3JUb0FSR0IodGhpcy5iaXRtYXBEYXRhLmdldFBpeGVsKDAsIDApKSkpO1xuXHRcdGNvbnNvbGUubG9nKCdHZXRQaXhlbCAxLDA6ICcsIENvbG9yVXRpbHMuQVJHQlRvSGV4U3RyaW5nKENvbG9yVXRpbHMuZmxvYXQzMkNvbG9yVG9BUkdCKHRoaXMuYml0bWFwRGF0YS5nZXRQaXhlbCgxLCAwKSkpKTtcblx0XHRjb25zb2xlLmxvZygnR2V0UGl4ZWwgMiwwOiAnLCBDb2xvclV0aWxzLkFSR0JUb0hleFN0cmluZyhDb2xvclV0aWxzLmZsb2F0MzJDb2xvclRvQVJHQih0aGlzLmJpdG1hcERhdGEuZ2V0UGl4ZWwoMiwgMCkpKSk7XG5cblxuXG5cdH1cblxuXHRwcml2YXRlIGltZ0xvYWRlZEVycm9yKGV2ZW50OklPRXJyb3JFdmVudClcblx0e1xuXHRcdGNvbnNvbGUubG9nKCdlcnJvcicpO1xuXHR9XG5cblx0cHJpdmF0ZSBpbWdMb2FkZWQoZXZlbnQ6QXdheUV2ZW50KVxuXHR7XG5cdFx0dmFyIGxvYWRlciA6VVJMTG9hZGVyID0gPFVSTExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXHRcdHRoaXMuaW1hZ2UgPSBQYXJzZXJVdGlscy5ibG9iVG9JbWFnZShsb2FkZXIuZGF0YSk7XG5cdFx0dGhpcy5pbWFnZS5vbmxvYWQgPSAoZXZlbnQ6RXZlbnQpID0+IHRoaXMub25JbWFnZUxvYWQoZXZlbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBvbkltYWdlTG9hZChldmVudDpFdmVudClcblx0e1xuXHRcdHRoaXMuYml0bWFwRGF0YS5kcmF3SW1hZ2UodGhpcy5pbWFnZSwgbmV3IFJlY3RhbmdsZSgwLCAwLCB0aGlzLmltYWdlLndpZHRoLCB0aGlzLmltYWdlLmhlaWdodCksIG5ldyBSZWN0YW5nbGUoMCwgMCwgdGhpcy5pbWFnZS53aWR0aC8yLCB0aGlzLmltYWdlLmhlaWdodC8yKSk7XG5cblx0XHR0aGlzLmJpdG1hcERhdGEuZHJhdyh0aGlzLmJpdG1hcERhdGEsIG5ldyBNYXRyaXgoLjUsIC4wOCwgLjA4LCAuNSwgdGhpcy5pbWFnZS53aWR0aC8yLCB0aGlzLmltYWdlLmhlaWdodC8yKSk7XG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/base/BitmapDataTest.ts b/tests/base/BitmapDataTest.ts index 20e2a934..c206fafb 100644 --- a/tests/base/BitmapDataTest.ts +++ b/tests/base/BitmapDataTest.ts @@ -1,200 +1,170 @@ -/// - -module tests.base +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import Matrix = require("awayjs-core/lib/core/geom/Matrix"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import AwayEvent = require("awayjs-core/lib/events/Event"); +import IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +import ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +import ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +class BitmapDataTest { - import Delegate = away.utils.Delegate; - - export class BitmapDataTest - { - - private bitmapData : away.base.BitmapData; - private bitmapDataB : away.base.BitmapData; - private urlLoader : away.net.URLLoader; - private urlRequest : away.net.URLRequest; - private image:HTMLImageElement; - - constructor() - { - - var transparent : boolean = true; - var initcolour : number = 0xffffffff; - - //--------------------------------------- - // Load a PNG - - this.urlRequest = new away.net.URLRequest( 'assets/256x256.png'); - this.urlLoader = new away.net.URLLoader(); - this.urlLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.urlLoader.load( this.urlRequest ); - this.urlLoader.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.imgLoaded) ); - this.urlLoader.addEventListener( away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.imgLoadedError) ); - - //--------------------------------------- - // BitmapData Object - 1 - this.bitmapData = new away.base.BitmapData( 256 , 256 , transparent , initcolour ); - document.body.appendChild( this.bitmapData.canvas ); - - //--------------------------------------- - // BitmapData Object - 2 - this.bitmapDataB = new away.base.BitmapData( 256 , 256 , transparent , initcolour ); - this.bitmapDataB.canvas.style.position = 'absolute'; - this.bitmapDataB.canvas.style.left = '540px'; - document.body.appendChild( this.bitmapDataB.canvas ); - - //--------------------------------------- - // BitmapData - setPixel test - console['time']("bitmapdata"); // start setPixel operation benchmark ( TypeScript does not support console.time - so hacking it in ) . - - this.bitmapDataB.lock(); - - for (var i = 0; i < 10000; i++) - { - - var x = Math.random() * this.bitmapDataB.width | 0; // |0 to truncate to Int32 - var y = Math.random() * this.bitmapDataB.height | 0; - this.bitmapDataB.setPixel(x, y, Math.random() * 0xffFFFFFF ); // 255 opaque - - } - - this.bitmapDataB.unlock(); - console['timeEnd']("bitmapdata"); // benchmark the setPixel operation - - document.onmousedown = ( e ) => this.onMouseDown( e ); - - } - - private onMouseDown( e ) - { - - if ( this.bitmapData.width === 512 ) // Test to toggle resize of bitmapData - { - - if ( this.image.complete ) // If image is loaded copy that to the BitmapData object - { - - this.bitmapDataB.lock(); // Lock bitmap - speeds up setPixelOperations - - - //--------------------------------------- - // Resize BitmapData - this.bitmapData.width = 256; - this.bitmapData.height = 256; - - //--------------------------------------- - // copy loaded image to first BitmapData - - var rect : away.geom.Rectangle = new away.geom.Rectangle( 0 , 0 , this.image.width , this.image.height ); - this.bitmapData.drawImage( this.image , rect , rect ); - - //--------------------------------------- - // copy image into second bitmap data ( and scale it up 2X ) - rect.width = rect.width * 2; - rect.height = rect.height * 2; - - this.bitmapDataB.copyPixels( this.bitmapData , this.bitmapData.rect , rect ); - - //--------------------------------------- - // draw random pixels - - for (var d = 0; d < 1000; d++) - { - - var x = Math.random() * this.bitmapDataB.width | 0; // |0 to truncate to Int32 - var y = Math.random() * this.bitmapDataB.height | 0; - this.bitmapDataB.setPixel(x, y, Math.random() * 0xFFFFFFFF ); // 255 opaque - - } - - this.bitmapDataB.unlock(); // Unlock bitmapdata - - } - else - { - - //--------------------------------------- - // image is not loaded - fill bitmapdata with red - this.bitmapData.width = 256; - this.bitmapData.height = 256; - this.bitmapData.fillRect( this.bitmapData.rect , 0xffff0000 ); - } - - } - else - { - - //--------------------------------------- - // resize bitmapdata; - - this.bitmapData.lock(); - - this.bitmapData.width = 512; - this.bitmapData.height = 512; - this.bitmapData.fillRect( this.bitmapData.rect , 0xffff0000 ); // fill it RED - - for (var d = 0; d < 1000; d++) - { - - var x = Math.random() * this.bitmapData.width | 0; // |0 to truncate to Int32 - var y = Math.random() * this.bitmapData.height | 0; - this.bitmapData.setPixel(x, y, Math.random() * 0xFFFFFFFF ); - - } - - this.bitmapData.unlock(); - //--------------------------------------- - // copy bitmapdata - - var targetRect = this.bitmapDataB.rect.clone(); - targetRect.width = targetRect.width / 2; - targetRect.height = targetRect.height / 2; - - this.bitmapDataB.copyPixels( this.bitmapData , this.bitmapDataB.rect , targetRect ); // copy first bitmapdata object into the second one - - - - } - - var m : away.geom.Matrix = new away.geom.Matrix(.5, .08 , .08 ,.5 , this.image.width / 2 , this.image.height / 2); - this.bitmapData.draw( this.bitmapData , m ); - - this.bitmapData.setPixel32(0, 0, 0xccff0000 ) ; - this.bitmapData.setPixel32(1, 0, 0xcc00ff00 ) ; - this.bitmapData.setPixel32(2, 0, 0xcc0000ff ) ; - - this.bitmapDataB.draw( this.bitmapData , m ); - - console.log( 'GetPixel 0,0: ' , away.utils.ColorUtils.ARGBToHexString( away.utils.ColorUtils.float32ColorToARGB( this.bitmapData.getPixel( 0 , 0 ) ) ) ); - console.log( 'GetPixel 1,0: ' , away.utils.ColorUtils.ARGBToHexString( away.utils.ColorUtils.float32ColorToARGB( this.bitmapData.getPixel( 1 , 0 ) ) ) ); - console.log( 'GetPixel 2,0: ' , away.utils.ColorUtils.ARGBToHexString( away.utils.ColorUtils.float32ColorToARGB( this.bitmapData.getPixel( 2 , 0 ) ) ) ); - + private bitmapData:BitmapData; + private bitmapDataB:BitmapData; + private urlLoader:URLLoader; + private urlRequest:URLRequest; + private image:HTMLImageElement; + + constructor() + { + var transparent:boolean = true; + var initcolour:number = 0xffffffff; + + //--------------------------------------- + // Load a PNG + + this.urlRequest = new URLRequest('assets/256x256.png'); + this.urlLoader = new URLLoader(); + this.urlLoader.dataFormat = URLLoaderDataFormat.BLOB; + + this.urlLoader.load(this.urlRequest); + this.urlLoader.addEventListener(AwayEvent.COMPLETE, (event:AwayEvent) => this.imgLoaded(event)); + this.urlLoader.addEventListener(IOErrorEvent.IO_ERROR, (event:IOErrorEvent) => this.imgLoadedError(event)); + + //--------------------------------------- + // BitmapData Object - 1 + this.bitmapData = new BitmapData(256, 256, transparent, initcolour); + document.body.appendChild(this.bitmapData.canvas); + + //--------------------------------------- + // BitmapData Object - 2 + this.bitmapDataB = new BitmapData(256, 256, transparent, initcolour); + this.bitmapDataB.canvas.style.position = 'absolute'; + this.bitmapDataB.canvas.style.left = '540px'; + document.body.appendChild(this.bitmapDataB.canvas); + + //--------------------------------------- + // BitmapData - setPixel test + console['time']("bitmapdata"); // start setPixel operation benchmark ( TypeScript does not support console.time - so hacking it in ) . + + this.bitmapDataB.lock(); + + for (var i = 0; i < 10000; i++) { + var x = Math.random() * this.bitmapDataB.width | 0; // |0 to truncate to Int32 + var y = Math.random() * this.bitmapDataB.height | 0; + this.bitmapDataB.setPixel(x, y, Math.random() * 0xffFFFFFF ); // 255 opaque + } + this.bitmapDataB.unlock(); + console['timeEnd']("bitmapdata"); // benchmark the setPixel operation + + document.onmousedown = (event:MouseEvent) => this.onMouseDown(event); + } + + private onMouseDown(event:MouseEvent) + { + if ( this.bitmapData.width === 512 ) {// Test to toggle resize of bitmapData + if ( this.image.complete ) {// If image is loaded copy that to the BitmapData object + this.bitmapDataB.lock(); // Lock bitmap - speeds up setPixelOperations + + //--------------------------------------- + // Resize BitmapData + this.bitmapData.width = 256; + this.bitmapData.height = 256; + + //--------------------------------------- + // copy loaded image to first BitmapData + + var rect:Rectangle = new Rectangle(0, 0, this.image.width, this.image.height); + this.bitmapData.drawImage(this.image, rect, rect); + + //--------------------------------------- + // copy image into second bitmap data ( and scale it up 2X ) + rect.width = rect.width * 2; + rect.height = rect.height * 2; + + this.bitmapDataB.copyPixels(this.bitmapData, this.bitmapData.rect, rect); + + //--------------------------------------- + // draw random pixels + + for (var d = 0; d < 1000; d++) { + var x = Math.random()*this.bitmapDataB.width | 0; // |0 to truncate to Int32 + var y = Math.random()*this.bitmapDataB.height | 0; + this.bitmapDataB.setPixel(x, y, Math.random()*0xFFFFFFFF); // 255 opaque + } + + this.bitmapDataB.unlock(); // Unlock bitmapdata + + } else { + //--------------------------------------- + // image is not loaded - fill bitmapdata with red + this.bitmapData.width = 256; + this.bitmapData.height = 256; + this.bitmapData.fillRect(this.bitmapData.rect, 0xffff0000); + } + } else { + //--------------------------------------- + // resize bitmapdata; + + this.bitmapData.lock(); + + this.bitmapData.width = 512; + this.bitmapData.height = 512; + this.bitmapData.fillRect(this.bitmapData.rect, 0xffff0000); // fill it RED + + for (var d = 0; d < 1000; d++) { + var x = Math.random()*this.bitmapData.width | 0; // |0 to truncate to Int32 + var y = Math.random()*this.bitmapData.height | 0; + this.bitmapData.setPixel(x, y, Math.random()*0xFFFFFFFF); + } + + this.bitmapData.unlock(); + //--------------------------------------- + // copy bitmapdata + + var targetRect = this.bitmapDataB.rect.clone(); + targetRect.width = targetRect.width/2; + targetRect.height = targetRect.height/2; + + this.bitmapDataB.copyPixels(this.bitmapData, this.bitmapDataB.rect, targetRect); // copy first bitmapdata object into the second one + } - } + var m : Matrix = new Matrix(.5, .08, .08, .5, this.image.width/2, this.image.height/2); + this.bitmapData.draw(this.bitmapData, m); - private imgLoadedError( e : away.events.IOErrorEvent ) - { + this.bitmapData.setPixel32(0, 0, 0xccff0000) ; + this.bitmapData.setPixel32(1, 0, 0xcc00ff00) ; + this.bitmapData.setPixel32(2, 0, 0xcc0000ff) ; - console.log( 'error'); + this.bitmapDataB.draw(this.bitmapData, m); - } + console.log('GetPixel 0,0: ', ColorUtils.ARGBToHexString(ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(0, 0)))); + console.log('GetPixel 1,0: ', ColorUtils.ARGBToHexString(ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(1, 0)))); + console.log('GetPixel 2,0: ', ColorUtils.ARGBToHexString(ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(2, 0)))); - private imgLoaded( e : away.events.Event ) - { - var loader : away.net.URLLoader = e.target; - this.image = away.parsers.ParserUtils.blobToImage(loader.data); - this.image.onload = ( event ) => this.onImageLoad( event ); - } - private onImageLoad (event) - { - this.bitmapData.drawImage( this.image , new away.geom.Rectangle( 0 , 0 , this.image.width , this.image.height ) ,new away.geom.Rectangle( 0 , 0 , this.image.width / 2, this.image.height / 2 )); + } - var m : away.geom.Matrix = new away.geom.Matrix(.5, .08 , .08 ,.5 , this.image.width / 2 , this.image.height / 2); - this.bitmapData.draw( this.bitmapData , m ); + private imgLoadedError(event:IOErrorEvent) + { + console.log('error'); + } - } + private imgLoaded(event:AwayEvent) + { + var loader :URLLoader = event.target; + this.image = ParserUtils.blobToImage(loader.data); + this.image.onload = (event:Event) => this.onImageLoad(event); + } - } + private onImageLoad(event:Event) + { + this.bitmapData.drawImage(this.image, new Rectangle(0, 0, this.image.width, this.image.height), new Rectangle(0, 0, this.image.width/2, this.image.height/2)); + this.bitmapData.draw(this.bitmapData, new Matrix(.5, .08, .08, .5, this.image.width/2, this.image.height/2)); + } } \ No newline at end of file diff --git a/tests/entities/BillboardEntityTest.js b/tests/entities/BillboardEntityTest.js new file mode 100755 index 00000000..1f6415bb --- /dev/null +++ b/tests/entities/BillboardEntityTest.js @@ -0,0 +1,126 @@ +var View = require("awayjs-core/lib/containers/View"); +var HoverController = require("awayjs-core/lib/controllers/HoverController"); +var AlignmentMode = require("awayjs-core/lib/core/base/AlignmentMode"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +var AssetLibrary = require("awayjs-core/lib/core/library/AssetLibrary"); + +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var CSSDefaultRenderer = require("awayjs-core/lib/core/render/CSSDefaultRenderer"); +var Billboard = require("awayjs-core/lib/entities/Billboard"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +var CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); + +var RequestAnimationFrame = require("awayjs-core/lib/utils/RequestAnimationFrame"); + +var BillboardEntityTest = (function () { + function BillboardEntityTest() { + var _this = this; + this._time = 0; + this._move = false; + this._billboards = new Array(); + //load an image + AssetLibrary.load(new URLRequest('assets/256x256.png')); + + //listen for a resource complete event + AssetLibrary.addEventListener(LoaderEvent.RESOURCE_COMPLETE, function (event) { + return _this.onResourceComplete(event); + }); + } + /** + * Listener for resource complete event + * + * @param event + */ + BillboardEntityTest.prototype.onResourceComplete = function (event) { + var _this = this; + //get the image texture + this._imageTexture = event.assets[0]; + + //create the view + this._view = new View(new CSSDefaultRenderer()); + + //create a bitmap material + this._bitmapMaterial = new CSSMaterialBase(this._imageTexture); + + var billboard; + var numBillboards = 500; + for (var i = 0; i < numBillboards; i++) { + billboard = new Billboard(this._bitmapMaterial); + billboard.width = 50; + billboard.height = 50; + billboard.pivot = new Vector3D(25, 25, 0); + billboard.x = Math.cos(i * 32 * Math.PI / numBillboards) * 400 * Math.sin(i * Math.PI / numBillboards); + billboard.y = Math.sin(i * 32 * Math.PI / numBillboards) * 400 * Math.sin(i * Math.PI / numBillboards); + billboard.z = Math.cos(i * Math.PI / numBillboards) * 400; + + //billboard.orientationMode = away.base.OrientationMode.CAMERA_PLANE; + billboard.alignmentMode = AlignmentMode.PIVOT_POINT; + this._billboards.push(billboard); + + //add billboard to the scene + this._view.scene.addChild(billboard); + } + + this._hoverControl = new HoverController(this._view.camera, null, 150, 10); + + document.onmousedown = function (event) { + return _this.onMouseDownHandler(event); + }; + document.onmouseup = function (event) { + return _this.onMouseUpHandler(event); + }; + document.onmousemove = function (event) { + return _this.onMouseMove(event); + }; + + window.onresize = function (event) { + return _this.onResize(event); + }; + + //trigger an initial resize for the view + this.onResize(null); + + //setup the RAF for a render listener + this._timer = new RequestAnimationFrame(this.render, this); + this._timer.start(); + }; + + BillboardEntityTest.prototype.onResize = function (event) { + this._view.x = 0; + this._view.y = 0; + this._view.width = window.innerWidth; + this._view.height = window.innerHeight; + }; + + BillboardEntityTest.prototype.render = function (dt) { + this._time += dt; + for (var i = 0; i < this._billboards.length; i++) { + this._billboards[i].rotationZ = i + this._time / 10; + this._billboards[i].rotationX = i + this._time / 10; + } + + this._view.render(); + }; + + BillboardEntityTest.prototype.onMouseUpHandler = function (event) { + this._move = false; + }; + + BillboardEntityTest.prototype.onMouseMove = function (event) { + if (this._move) { + this._hoverControl.panAngle = 0.3 * (event.clientX - this._lastMouseX) + this._lastPanAngle; + this._hoverControl.tiltAngle = 0.3 * (event.clientY - this._lastMouseY) + this._lastTiltAngle; + } + }; + + BillboardEntityTest.prototype.onMouseDownHandler = function (event) { + this._lastPanAngle = this._hoverControl.panAngle; + this._lastTiltAngle = this._hoverControl.tiltAngle; + this._lastMouseX = event.clientX; + this._lastMouseY = event.clientY; + this._move = true; + }; + return BillboardEntityTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL0JpbGxib2FyZEVudGl0eVRlc3QudHMiXSwibmFtZXMiOlsiQmlsbGJvYXJkRW50aXR5VGVzdCIsIkJpbGxib2FyZEVudGl0eVRlc3QuY29uc3RydWN0b3IiLCJCaWxsYm9hcmRFbnRpdHlUZXN0Lm9uUmVzb3VyY2VDb21wbGV0ZSIsIkJpbGxib2FyZEVudGl0eVRlc3Qub25SZXNpemUiLCJCaWxsYm9hcmRFbnRpdHlUZXN0LnJlbmRlciIsIkJpbGxib2FyZEVudGl0eVRlc3Qub25Nb3VzZVVwSGFuZGxlciIsIkJpbGxib2FyZEVudGl0eVRlc3Qub25Nb3VzZU1vdmUiLCJCaWxsYm9hcmRFbnRpdHlUZXN0Lm9uTW91c2VEb3duSGFuZGxlciJdLCJtYXBwaW5ncyI6IkFBQUEscURBQThEO0FBQzlELDRFQUFrRjtBQUNsRixzRUFBNEU7QUFDNUUsNERBQW9FO0FBQ3BFLHVFQUE4RTs7QUFFOUUsK0RBQXNFO0FBQ3RFLGtGQUF1RjtBQUN2Riw2REFBb0U7QUFDcEUsK0RBQXNFO0FBQ3RFLDBFQUFnRjs7QUFFaEYsa0ZBQXNGOztBQUV0RjtJQWlCQ0E7UUFBQUMsaUJBT0NBO1FBcEJEQSxLQUFRQSxLQUFLQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUd6QkEsS0FBUUEsS0FBS0EsR0FBV0EsS0FBS0EsQ0FBQ0E7UUFROUJBLEtBQVFBLFdBQVdBLEdBQW9CQSxJQUFJQSxLQUFLQSxDQUFZQSxDQUFDQSxDQUFDQTtRQUk3REEsZUFBZUE7UUFDZkEsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsVUFBVUEsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxDQUFDQTs7UUFFdkRBLHNDQUFzQ0E7UUFDdENBLFlBQVlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsaUJBQWlCQSxFQUFFQSxVQUFDQSxLQUFpQkE7bUJBQUtBLEtBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBOUJBLENBQThCQSxDQUFDQTtJQUNwSEEsQ0FBQ0E7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UCwyQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTtBQUFBIiwiZmlsZSI6ImVudGl0aWVzL0JpbGxib2FyZEVudGl0eVRlc3QuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVmlld1x0XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250YWluZXJzL1ZpZXdcIik7XG5pbXBvcnQgSG92ZXJDb250cm9sbGVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvbnRyb2xsZXJzL0hvdmVyQ29udHJvbGxlclwiKTtcbmltcG9ydCBBbGlnbm1lbnRNb2RlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9BbGlnbm1lbnRNb2RlXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5pbXBvcnQgQXNzZXRMaWJyYXJ5XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9saWJyYXJ5L0Fzc2V0TGlicmFyeVwiKTtcbmltcG9ydCBVUkxMb2FkZXJcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxMb2FkZXJcIik7XG5pbXBvcnQgVVJMUmVxdWVzdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTFJlcXVlc3RcIik7XG5pbXBvcnQgQ1NTRGVmYXVsdFJlbmRlcmVyXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL3JlbmRlci9DU1NEZWZhdWx0UmVuZGVyZXJcIik7XG5pbXBvcnQgQmlsbGJvYXJkXHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZW50aXRpZXMvQmlsbGJvYXJkXCIpO1xuaW1wb3J0IExvYWRlckV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0xvYWRlckV2ZW50XCIpO1xuaW1wb3J0IENTU01hdGVyaWFsQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9tYXRlcmlhbHMvQ1NTTWF0ZXJpYWxCYXNlXCIpO1xuaW1wb3J0IEltYWdlVGV4dHVyZVx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL0ltYWdlVGV4dHVyZVwiKTtcbmltcG9ydCBSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi91dGlscy9SZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIik7XG5cbmNsYXNzIEJpbGxib2FyZEVudGl0eVRlc3Rcbntcblx0cHJpdmF0ZSBfdmlldzpWaWV3O1xuXHRwcml2YXRlIF90aW1lcjpSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cdHByaXZhdGUgX3RpbWU6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfaG92ZXJDb250cm9sOkhvdmVyQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIF9tb3ZlOmJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSBfbGFzdFBhbkFuZ2xlOm51bWJlcjtcblx0cHJpdmF0ZSBfbGFzdFRpbHRBbmdsZTpudW1iZXI7XG5cdHByaXZhdGUgX2xhc3RNb3VzZVg6bnVtYmVyO1xuXHRwcml2YXRlIF9sYXN0TW91c2VZOm51bWJlcjtcblxuXHRwcml2YXRlIF9pbWFnZVRleHR1cmU6SW1hZ2VUZXh0dXJlO1xuXHRwcml2YXRlIF9iaXRtYXBNYXRlcmlhbDpDU1NNYXRlcmlhbEJhc2U7XG5cdHByaXZhdGUgX2JpbGxib2FyZHM6QXJyYXk8QmlsbGJvYXJkPiA9IG5ldyBBcnJheTxCaWxsYm9hcmQ+KCk7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0Ly9sb2FkIGFuIGltYWdlXG5cdFx0QXNzZXRMaWJyYXJ5LmxvYWQobmV3IFVSTFJlcXVlc3QoJ2Fzc2V0cy8yNTZ4MjU2LnBuZycpKTtcblxuXHRcdC8vbGlzdGVuIGZvciBhIHJlc291cmNlIGNvbXBsZXRlIGV2ZW50XG5cdFx0QXNzZXRMaWJyYXJ5LmFkZEV2ZW50TGlzdGVuZXIoTG9hZGVyRXZlbnQuUkVTT1VSQ0VfQ09NUExFVEUsIChldmVudDpMb2FkZXJFdmVudCkgPT4gdGhpcy5vblJlc291cmNlQ29tcGxldGUoZXZlbnQpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBMaXN0ZW5lciBmb3IgcmVzb3VyY2UgY29tcGxldGUgZXZlbnRcblx0ICpcblx0ICogQHBhcmFtIGV2ZW50XG5cdCAqL1xuXHRvblJlc291cmNlQ29tcGxldGUoZXZlbnQ6TG9hZGVyRXZlbnQpXG5cdHtcblx0XHQvL2dldCB0aGUgaW1hZ2UgdGV4dHVyZVxuXHRcdHRoaXMuX2ltYWdlVGV4dHVyZSA9IDxJbWFnZVRleHR1cmU+IGV2ZW50LmFzc2V0c1swXTtcblxuXHRcdC8vY3JlYXRlIHRoZSB2aWV3XG5cdFx0dGhpcy5fdmlldyA9IG5ldyBWaWV3KG5ldyBDU1NEZWZhdWx0UmVuZGVyZXIoKSk7XG5cblx0XHQvL2NyZWF0ZSBhIGJpdG1hcCBtYXRlcmlhbFxuXHRcdHRoaXMuX2JpdG1hcE1hdGVyaWFsID0gbmV3IENTU01hdGVyaWFsQmFzZSh0aGlzLl9pbWFnZVRleHR1cmUpO1xuXG5cdFx0dmFyIGJpbGxib2FyZDpCaWxsYm9hcmQ7XG5cdFx0dmFyIG51bUJpbGxib2FyZHM6bnVtYmVyID0gNTAwO1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IG51bUJpbGxib2FyZHM7IGkrKykge1xuXHRcdFx0YmlsbGJvYXJkID0gbmV3IEJpbGxib2FyZCh0aGlzLl9iaXRtYXBNYXRlcmlhbCk7XG5cdFx0XHRiaWxsYm9hcmQud2lkdGggPSA1MDtcblx0XHRcdGJpbGxib2FyZC5oZWlnaHQgPSA1MDtcblx0XHRcdGJpbGxib2FyZC5waXZvdCA9IG5ldyBWZWN0b3IzRCgyNSwgMjUsIDApO1xuXHRcdFx0YmlsbGJvYXJkLnggPSBNYXRoLmNvcyhpKjMyKk1hdGguUEkvbnVtQmlsbGJvYXJkcykqNDAwKk1hdGguc2luKGkqTWF0aC5QSS9udW1CaWxsYm9hcmRzKTtcblx0XHRcdGJpbGxib2FyZC55ID0gTWF0aC5zaW4oaSozMipNYXRoLlBJL251bUJpbGxib2FyZHMpKjQwMCpNYXRoLnNpbihpKk1hdGguUEkvbnVtQmlsbGJvYXJkcyk7XG5cdFx0XHRiaWxsYm9hcmQueiA9IE1hdGguY29zKGkqTWF0aC5QSS9udW1CaWxsYm9hcmRzKSo0MDA7XG5cdFx0XHQvL2JpbGxib2FyZC5vcmllbnRhdGlvbk1vZGUgPSBhd2F5LmJhc2UuT3JpZW50YXRpb25Nb2RlLkNBTUVSQV9QTEFORTtcblx0XHRcdGJpbGxib2FyZC5hbGlnbm1lbnRNb2RlID0gQWxpZ25tZW50TW9kZS5QSVZPVF9QT0lOVDtcblx0XHRcdHRoaXMuX2JpbGxib2FyZHMucHVzaChiaWxsYm9hcmQpO1xuXHRcdFx0Ly9hZGQgYmlsbGJvYXJkIHRvIHRoZSBzY2VuZVxuXHRcdFx0dGhpcy5fdmlldy5zY2VuZS5hZGRDaGlsZChiaWxsYm9hcmQpO1xuXHRcdH1cblxuXHRcdHRoaXMuX2hvdmVyQ29udHJvbCA9IG5ldyBIb3ZlckNvbnRyb2xsZXIodGhpcy5fdmlldy5jYW1lcmEsIG51bGwsIDE1MCwgMTApO1xuXG5cdFx0ZG9jdW1lbnQub25tb3VzZWRvd24gPSAoZXZlbnQ6TW91c2VFdmVudCkgPT4gdGhpcy5vbk1vdXNlRG93bkhhbmRsZXIoZXZlbnQpO1xuXHRcdGRvY3VtZW50Lm9ubW91c2V1cCA9IChldmVudDpNb3VzZUV2ZW50KSA9PiB0aGlzLm9uTW91c2VVcEhhbmRsZXIoZXZlbnQpO1xuXHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gKGV2ZW50Ok1vdXNlRXZlbnQpID0+IHRoaXMub25Nb3VzZU1vdmUoZXZlbnQpO1xuXG5cdFx0d2luZG93Lm9ucmVzaXplICA9IChldmVudDpVSUV2ZW50KSA9PiB0aGlzLm9uUmVzaXplKGV2ZW50KTtcblxuXHRcdC8vdHJpZ2dlciBhbiBpbml0aWFsIHJlc2l6ZSBmb3IgdGhlIHZpZXdcblx0XHR0aGlzLm9uUmVzaXplKG51bGwpO1xuXG5cdFx0Ly9zZXR1cCB0aGUgUkFGIGZvciBhIHJlbmRlciBsaXN0ZW5lclxuXHRcdHRoaXMuX3RpbWVyID0gbmV3IFJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlciwgdGhpcyk7XG5cdFx0dGhpcy5fdGltZXIuc3RhcnQoKTtcblx0fVxuXG5cdHByaXZhdGUgb25SZXNpemUoZXZlbnQ6VUlFdmVudClcblx0e1xuXHRcdHRoaXMuX3ZpZXcueCA9IDA7XG5cdFx0dGhpcy5fdmlldy55ID0gMDtcblx0XHR0aGlzLl92aWV3LndpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG5cdFx0dGhpcy5fdmlldy5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cdH1cblxuXHRwcml2YXRlIHJlbmRlcihkdDpudW1iZXIpXG5cdHtcblx0XHR0aGlzLl90aW1lICs9IGR0O1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IHRoaXMuX2JpbGxib2FyZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHRoaXMuX2JpbGxib2FyZHNbaV0ucm90YXRpb25aID0gaSArIHRoaXMuX3RpbWUvMTA7XG5cdFx0XHR0aGlzLl9iaWxsYm9hcmRzW2ldLnJvdGF0aW9uWCA9IGkgKyB0aGlzLl90aW1lLzEwO1xuXHRcdH1cblxuXHRcdHRoaXMuX3ZpZXcucmVuZGVyKCk7XG5cblx0fVxuXG5cdHByaXZhdGUgb25Nb3VzZVVwSGFuZGxlcihldmVudDpNb3VzZUV2ZW50KVxuXHR7XG5cdFx0dGhpcy5fbW92ZSA9IGZhbHNlO1xuXHR9XG5cblx0cHJpdmF0ZSBvbk1vdXNlTW92ZShldmVudDpNb3VzZUV2ZW50KVxuXHR7XG5cdFx0aWYgKHRoaXMuX21vdmUpIHtcblx0XHRcdHRoaXMuX2hvdmVyQ29udHJvbC5wYW5BbmdsZSA9IDAuMyooZXZlbnQuY2xpZW50WCAtIHRoaXMuX2xhc3RNb3VzZVgpICsgdGhpcy5fbGFzdFBhbkFuZ2xlO1xuXHRcdFx0dGhpcy5faG92ZXJDb250cm9sLnRpbHRBbmdsZSA9IDAuMyooZXZlbnQuY2xpZW50WSAtIHRoaXMuX2xhc3RNb3VzZVkpICsgdGhpcy5fbGFzdFRpbHRBbmdsZTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIG9uTW91c2VEb3duSGFuZGxlcihldmVudDpNb3VzZUV2ZW50KVxuXHR7XG5cdFx0dGhpcy5fbGFzdFBhbkFuZ2xlID0gdGhpcy5faG92ZXJDb250cm9sLnBhbkFuZ2xlO1xuXHRcdHRoaXMuX2xhc3RUaWx0QW5nbGUgPSB0aGlzLl9ob3ZlckNvbnRyb2wudGlsdEFuZ2xlO1xuXHRcdHRoaXMuX2xhc3RNb3VzZVggPSBldmVudC5jbGllbnRYO1xuXHRcdHRoaXMuX2xhc3RNb3VzZVkgPSBldmVudC5jbGllbnRZO1xuXHRcdHRoaXMuX21vdmUgPSB0cnVlO1xuXHR9XG59Il19 \ No newline at end of file diff --git a/tests/entities/BillboardEntityTest.ts b/tests/entities/BillboardEntityTest.ts index 846c236f..6231b149 100644 --- a/tests/entities/BillboardEntityTest.ts +++ b/tests/entities/BillboardEntityTest.ts @@ -1,134 +1,131 @@ -/// -// - -module tests.entities +import View = require("awayjs-core/lib/containers/View"); +import HoverController = require("awayjs-core/lib/controllers/HoverController"); +import AlignmentMode = require("awayjs-core/lib/core/base/AlignmentMode"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import AssetLibrary = require("awayjs-core/lib/core/library/AssetLibrary"); +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import CSSDefaultRenderer = require("awayjs-core/lib/core/render/CSSDefaultRenderer"); +import Billboard = require("awayjs-core/lib/entities/Billboard"); +import LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +import CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); +import ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); +import RequestAnimationFrame = require("awayjs-core/lib/utils/RequestAnimationFrame"); + +class BillboardEntityTest { - import View = away.containers.View; - import Billboard = away.entities.Billboard; - import Vector3D = away.geom.Vector3D; - import AssetLibrary = away.library.AssetLibrary; - import CSSMaterialBase = away.materials.CSSMaterialBase; - import ImageTexture = away.textures.ImageTexture; - import URLLoader = away.net.URLLoader; - import URLRequest = away.net.URLRequest; - import Delegate = away.utils.Delegate; - import RequestAnimationFrame = away.utils.RequestAnimationFrame; - - export class BillboardEntityTest + private _view:View; + private _timer:RequestAnimationFrame; + private _time:number = 0; + private _hoverControl:HoverController; + + private _move:boolean = false; + private _lastPanAngle:number; + private _lastTiltAngle:number; + private _lastMouseX:number; + private _lastMouseY:number; + + private _imageTexture:ImageTexture; + private _bitmapMaterial:CSSMaterialBase; + private _billboards:Array = new Array(); + + constructor() { - private _view:View; - private _timer:away.utils.RequestAnimationFrame; - private _time:number = 0; - private _hoverControl:away.controllers.HoverController; - - private _move:boolean = false; - private _lastPanAngle:number; - private _lastTiltAngle:number; - private _lastMouseX:number; - private _lastMouseY:number; - - private _imageTexture:ImageTexture; - private _bitmapMaterial:CSSMaterialBase; - private _billboards:Array = new Array(); - - constructor() - { - //load an image - AssetLibrary.load(new URLRequest('assets/256x256.png') ); - - //listen for a resource complete event - AssetLibrary.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE , Delegate.create(this, this.onResourceComplete)); - } + //load an image + AssetLibrary.load(new URLRequest('assets/256x256.png')); - /** - * Listener for resource complete event - * - * @param event - */ - onResourceComplete(event:away.events.LoaderEvent) - { - //get the image texture - this._imageTexture = event.assets[0]; - - //create the view - this._view = new away.containers.View(new away.render.CSSDefaultRenderer()); - - //create a bitmap material - this._bitmapMaterial = new away.materials.CSSMaterialBase(this._imageTexture); - - var billboard:Billboard; - var numBillboards:number = 500; - for (var i:number = 0; i < numBillboards; i++) { - billboard = new Billboard(this._bitmapMaterial); - billboard.width = 50; - billboard.height = 50; - billboard.pivot = new Vector3D(25, 25, 0); - billboard.x = Math.cos(i*32*Math.PI/numBillboards)*400*Math.sin(i*Math.PI/numBillboards); - billboard.y = Math.sin(i*32*Math.PI/numBillboards)*400*Math.sin(i*Math.PI/numBillboards); - billboard.z = Math.cos(i*Math.PI/numBillboards)*400; - //billboard.orientationMode = away.base.OrientationMode.CAMERA_PLANE; - billboard.alignmentMode = away.base.AlignmentMode.PIVOT_POINT; - this._billboards.push(billboard); - //add billboard to the scene - this._view.scene.addChild(billboard); - } - - this._hoverControl = new away.controllers.HoverController(this._view.camera, null, 150, 10); - - document.onmousedown = (event:MouseEvent) => this.onMouseDownHandler(event); - document.onmouseup = (event:MouseEvent) => this.onMouseUpHandler(event); - document.onmousemove = (event:MouseEvent) => this.onMouseMove(event); - - window.onresize = (event:UIEvent) => this.onResize(event); - - //trigger an initial resize for the view - this.onResize(null); - - //setup the RAF for a render listener - this._timer = new away.utils.RequestAnimationFrame(this.render, this); - this._timer.start(); - } + //listen for a resource complete event + AssetLibrary.addEventListener(LoaderEvent.RESOURCE_COMPLETE, (event:LoaderEvent) => this.onResourceComplete(event)); + } - private onResize(event:UIEvent) - { - this._view.x = 0; - this._view.y = 0; - this._view.width = window.innerWidth; - this._view.height = window.innerHeight; + /** + * Listener for resource complete event + * + * @param event + */ + onResourceComplete(event:LoaderEvent) + { + //get the image texture + this._imageTexture = event.assets[0]; + + //create the view + this._view = new View(new CSSDefaultRenderer()); + + //create a bitmap material + this._bitmapMaterial = new CSSMaterialBase(this._imageTexture); + + var billboard:Billboard; + var numBillboards:number = 500; + for (var i:number = 0; i < numBillboards; i++) { + billboard = new Billboard(this._bitmapMaterial); + billboard.width = 50; + billboard.height = 50; + billboard.pivot = new Vector3D(25, 25, 0); + billboard.x = Math.cos(i*32*Math.PI/numBillboards)*400*Math.sin(i*Math.PI/numBillboards); + billboard.y = Math.sin(i*32*Math.PI/numBillboards)*400*Math.sin(i*Math.PI/numBillboards); + billboard.z = Math.cos(i*Math.PI/numBillboards)*400; + //billboard.orientationMode = away.base.OrientationMode.CAMERA_PLANE; + billboard.alignmentMode = AlignmentMode.PIVOT_POINT; + this._billboards.push(billboard); + //add billboard to the scene + this._view.scene.addChild(billboard); } - private render(dt:number) - { - this._time += dt; - for (var i:number = 0; i < this._billboards.length; i++) { - this._billboards[i].rotationZ = i + this._time/10; - this._billboards[i].rotationX = i + this._time/10; - } + this._hoverControl = new HoverController(this._view.camera, null, 150, 10); - this._view.render(); + document.onmousedown = (event:MouseEvent) => this.onMouseDownHandler(event); + document.onmouseup = (event:MouseEvent) => this.onMouseUpHandler(event); + document.onmousemove = (event:MouseEvent) => this.onMouseMove(event); - } + window.onresize = (event:UIEvent) => this.onResize(event); - private onMouseUpHandler(event:MouseEvent) - { - this._move = false; - } + //trigger an initial resize for the view + this.onResize(null); + + //setup the RAF for a render listener + this._timer = new RequestAnimationFrame(this.render, this); + this._timer.start(); + } + + private onResize(event:UIEvent) + { + this._view.x = 0; + this._view.y = 0; + this._view.width = window.innerWidth; + this._view.height = window.innerHeight; + } - private onMouseMove(event:MouseEvent) - { - if (this._move) { - this._hoverControl.panAngle = 0.3*(event.clientX - this._lastMouseX) + this._lastPanAngle; - this._hoverControl.tiltAngle = 0.3*(event.clientY - this._lastMouseY) + this._lastTiltAngle; - } + private render(dt:number) + { + this._time += dt; + for (var i:number = 0; i < this._billboards.length; i++) { + this._billboards[i].rotationZ = i + this._time/10; + this._billboards[i].rotationX = i + this._time/10; } - private onMouseDownHandler(event:MouseEvent) - { - this._lastPanAngle = this._hoverControl.panAngle; - this._lastTiltAngle = this._hoverControl.tiltAngle; - this._lastMouseX = event.clientX; - this._lastMouseY = event.clientY; - this._move = true; + this._view.render(); + + } + + private onMouseUpHandler(event:MouseEvent) + { + this._move = false; + } + + private onMouseMove(event:MouseEvent) + { + if (this._move) { + this._hoverControl.panAngle = 0.3*(event.clientX - this._lastMouseX) + this._lastPanAngle; + this._hoverControl.tiltAngle = 0.3*(event.clientY - this._lastMouseY) + this._lastTiltAngle; } } + + private onMouseDownHandler(event:MouseEvent) + { + this._lastPanAngle = this._hoverControl.panAngle; + this._lastTiltAngle = this._hoverControl.tiltAngle; + this._lastMouseX = event.clientX; + this._lastMouseY = event.clientY; + this._move = true; + } } \ No newline at end of file diff --git a/tests/entities/LayoutTest.js b/tests/entities/LayoutTest.js new file mode 100755 index 00000000..b06bb82e --- /dev/null +++ b/tests/entities/LayoutTest.js @@ -0,0 +1,141 @@ +var View = require("awayjs-core/lib/containers/View"); +var HoverController = require("awayjs-core/lib/controllers/HoverController"); + +var AssetLibrary = require("awayjs-core/lib/core/library/AssetLibrary"); + +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var CSSDefaultRenderer = require("awayjs-core/lib/core/render/CSSDefaultRenderer"); +var Billboard = require("awayjs-core/lib/entities/Billboard"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +var AwayMouseEvent = require("awayjs-core/lib/events/MouseEvent"); +var CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); +var CoordinateSystem = require("awayjs-core/lib/projections/CoordinateSystem"); + +var RequestAnimationFrame = require("awayjs-core/lib/utils/RequestAnimationFrame"); + +var LayoutTest = (function () { + function LayoutTest() { + var _this = this; + this._move = false; + this._billboards = new Array(); + //load an image + AssetLibrary.load(new URLRequest('assets/256x256.png')); + + //listen for a resource complete event + AssetLibrary.addEventListener(LoaderEvent.RESOURCE_COMPLETE, function (event) { + return _this.onResourceComplete(event); + }); + } + /** + * Listener for resource complete event + * + * @param event + */ + LayoutTest.prototype.onResourceComplete = function (event) { + var _this = this; + //get the image texture + this._imageTexture = event.assets[0]; + + //create the view + this._view = new View(new CSSDefaultRenderer()); + + this._projection = this._view.camera.projection; + + this._projection.coordinateSystem = CoordinateSystem.RIGHT_HANDED; + this._projection.focalLength = 1000; + this._projection.preserveFocalLength = true; + this._projection.originX = 0; + this._projection.originY = 0; + + //create a bitmap material + this._bitmapMaterial = new CSSMaterialBase(this._imageTexture); + + var billboard; + var numHBillboards = 2; + var numVBillboards = 2; + for (var i = 0; i < numHBillboards; i++) { + for (var j = 0; j < numVBillboards; j++) { + billboard = new Billboard(this._bitmapMaterial); + + //billboard.width = 50; + //billboard.height = 50; + //billboard.pivot = new Vector3D(billboard.billboardWidth/2, billboard.billboardHeight/2, 0); + billboard.x = j * 300; + billboard.y = i * 300; + billboard.z = 0; + billboard.addEventListener(AwayMouseEvent.MOUSE_MOVE, this.onMouseEvent); + + //billboard.orientationMode = require("awayjs-core/lib/base.OrientationMode.CAMERA_PLANE; + //billboard.alignmentMode = require("awayjs-core/lib/base.AlignmentMode.PIVOT_POINT; + this._billboards.push(billboard); + + //add billboard to the scene + this._view.scene.addChild(billboard); + } + } + + this._hoverControl = new HoverController(this._view.camera, null, 180, 0, 1000); + + document.onmousedown = function (event) { + return _this.onMouseDownHandler(event); + }; + document.onmouseup = function (event) { + return _this.onMouseUpHandler(event); + }; + document.onmousemove = function (event) { + return _this.onMouseMove(event); + }; + + window.onresize = function (event) { + return _this.onResize(event); + }; + + //trigger an initial resize for the view + this.onResize(null); + + //setup the RAF for a render listener + this._timer = new RequestAnimationFrame(this.render, this); + this._timer.start(); + }; + + LayoutTest.prototype.onMouseEvent = function (event) { + console.log(event); + }; + + LayoutTest.prototype.onResize = function (event) { + this._view.x = 0; + this._view.y = 0; + this._view.width = window.innerWidth; + this._view.height = window.innerHeight; + }; + + LayoutTest.prototype.render = function (dt) { + for (var i = 0; i < this._billboards.length; i++) { + //this._billboards[i].rotationZ +=2; + } + + this._view.render(); + }; + + LayoutTest.prototype.onMouseUpHandler = function (event) { + this._move = false; + }; + + LayoutTest.prototype.onMouseMove = function (event) { + if (this._move) { + this._hoverControl.panAngle = 0.3 * (event.clientX - this._lastMouseX) + this._lastPanAngle; + this._hoverControl.tiltAngle = -0.3 * (event.clientY - this._lastMouseY) + this._lastTiltAngle; + } + }; + + LayoutTest.prototype.onMouseDownHandler = function (event) { + this._lastPanAngle = this._hoverControl.panAngle; + this._lastTiltAngle = this._hoverControl.tiltAngle; + this._lastMouseX = event.clientX; + this._lastMouseY = event.clientY; + this._move = true; + }; + return LayoutTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImVudGl0aWVzL0xheW91dFRlc3QudHMiXSwibmFtZXMiOlsiTGF5b3V0VGVzdCIsIkxheW91dFRlc3QuY29uc3RydWN0b3IiLCJMYXlvdXRUZXN0Lm9uUmVzb3VyY2VDb21wbGV0ZSIsIkxheW91dFRlc3Qub25Nb3VzZUV2ZW50IiwiTGF5b3V0VGVzdC5vblJlc2l6ZSIsIkxheW91dFRlc3QucmVuZGVyIiwiTGF5b3V0VGVzdC5vbk1vdXNlVXBIYW5kbGVyIiwiTGF5b3V0VGVzdC5vbk1vdXNlTW92ZSIsIkxheW91dFRlc3Qub25Nb3VzZURvd25IYW5kbGVyIl0sIm1hcHBpbmdzIjoiQUFBQSxxREFBOEQ7QUFDOUQsNEVBQWtGOztBQUVsRix1RUFBOEU7O0FBRTlFLCtEQUFzRTtBQUN0RSxrRkFBdUY7QUFDdkYsNkRBQW9FO0FBQ3BFLCtEQUFzRTtBQUN0RSxpRUFBdUU7QUFDdkUsMEVBQWdGO0FBQ2hGLDhFQUFvRjs7QUFHcEYsa0ZBQXNGOztBQUV0RjtJQWlCQ0E7UUFBQUMsaUJBT0NBO1FBakJEQSxLQUFRQSxLQUFLQSxHQUFXQSxLQUFLQSxDQUFDQTtRQVE5QkEsS0FBUUEsV0FBV0EsR0FBb0JBLElBQUlBLEtBQUtBLENBQVlBLENBQUNBLENBQUNBO1FBSTdEQSxlQUFlQTtRQUNmQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxVQUFVQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUVBOztRQUV4REEsc0NBQXNDQTtRQUN0Q0EsWUFBWUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxXQUFXQSxDQUFDQSxpQkFBaUJBLEVBQUdBLFVBQUNBLEtBQWlCQTttQkFBS0EsS0FBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUE5QkEsQ0FBOEJBLENBQUNBO0lBQ3JIQSxDQUFDQTtJQU9ERDs7OztNQURHQTs4Q0FDSEEsVUFBbUJBLEtBQWlCQTtRQUFwQ0UsaUJBdURDQTtRQXJEQUEsdUJBQXVCQTtRQUN2QkEsSUFBSUEsQ0FBQ0EsYUFBYUEs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SUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsS0FBS0E7SUFDbkJBLENBQUNBOztJQUVETixtQ0FBQUEsVUFBb0JBLEtBQWdCQTtRQUVuQ08sSUFBSUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBRUE7WUFDZkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsUUFBUUEsR0FBR0EsR0FBR0EsR0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUE7WUFDekZBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLEdBQUdBLEdBQUNBLENBQUNBLEtBQUtBLENBQUNBLE9BQU9BLEdBQUdBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBO1NBQzVGQTtJQUNGQSxDQUFDQTs7SUFFRFAsMENBQUFBLFVBQTJCQSxLQUFnQkE7UUFFMUNRLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLFFBQVFBO1FBQ2hEQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxTQUFTQTtRQUNsREEsSUFBSUEsQ0FBQ0EsV0FBV0EsR0FBR0EsS0FBS0EsQ0FBQ0EsT0FBT0E7UUFDaENBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLEtBQUtBLENBQUNBLE9BQU9BO1FBQ2hDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQTtJQUNsQkEsQ0FBQ0E7SUFDRlIsa0JBQUNBO0FBQURBLENBQUNBLElBQUE7QUFBQSIsImZpbGUiOiJlbnRpdGllcy9MYXlvdXRUZXN0LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFZpZXdcdFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29udGFpbmVycy9WaWV3XCIpO1xuaW1wb3J0IEhvdmVyQ29udHJvbGxlclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb250cm9sbGVycy9Ib3ZlckNvbnRyb2xsZXJcIik7XG5pbXBvcnQgVmVjdG9yM0RcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvZ2VvbS9WZWN0b3IzRFwiKTtcbmltcG9ydCBBc3NldExpYnJhcnlcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRMaWJyYXJ5XCIpO1xuaW1wb3J0IFVSTExvYWRlclx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTExvYWRlclwiKTtcbmltcG9ydCBVUkxSZXF1ZXN0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMUmVxdWVzdFwiKTtcbmltcG9ydCBDU1NEZWZhdWx0UmVuZGVyZXJcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvcmVuZGVyL0NTU0RlZmF1bHRSZW5kZXJlclwiKTtcbmltcG9ydCBCaWxsYm9hcmRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9lbnRpdGllcy9CaWxsYm9hcmRcIik7XG5pbXBvcnQgTG9hZGVyRXZlbnRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvTG9hZGVyRXZlbnRcIik7XG5pbXBvcnQgQXdheU1vdXNlRXZlbnRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL01vdXNlRXZlbnRcIik7XG5pbXBvcnQgQ1NTTWF0ZXJpYWxCYXNlXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL21hdGVyaWFscy9DU1NNYXRlcmlhbEJhc2VcIik7XG5pbXBvcnQgQ29vcmRpbmF0ZVN5c3RlbVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wcm9qZWN0aW9ucy9Db29yZGluYXRlU3lzdGVtXCIpO1xuaW1wb3J0IFBlcnNwZWN0aXZlUHJvamVjdGlvblx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3Byb2plY3Rpb25zL1BlcnNwZWN0aXZlUHJvamVjdGlvblwiKTtcbmltcG9ydCBJbWFnZVRleHR1cmVcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9JbWFnZVRleHR1cmVcIik7XG5pbXBvcnQgUmVxdWVzdEFuaW1hdGlvbkZyYW1lXHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvUmVxdWVzdEFuaW1hdGlvbkZyYW1lXCIpO1xuXG5jbGFzcyBMYXlvdXRUZXN0XG57XG5cdHByaXZhdGUgX3ZpZXc6Vmlldztcblx0cHJpdmF0ZSBfcHJvamVjdGlvbjpQZXJzcGVjdGl2ZVByb2plY3Rpb247XG5cdHByaXZhdGUgX3RpbWVyOlJlcXVlc3RBbmltYXRpb25GcmFtZTtcblx0cHJpdmF0ZSBfaG92ZXJDb250cm9sOkhvdmVyQ29udHJvbGxlcjtcblxuXHRwcml2YXRlIF9tb3ZlOmJvb2xlYW4gPSBmYWxzZTtcblx0cHJpdmF0ZSBfbGFzdFBhbkFuZ2xlOm51bWJlcjtcblx0cHJpdmF0ZSBfbGFzdFRpbHRBbmdsZTpudW1iZXI7XG5cdHByaXZhdGUgX2xhc3RNb3VzZVg6bnVtYmVyO1xuXHRwcml2YXRlIF9sYXN0TW91c2VZOm51bWJlcjtcblxuXHRwcml2YXRlIF9pbWFnZVRleHR1cmU6SW1hZ2VUZXh0dXJlO1xuXHRwcml2YXRlIF9iaXRtYXBNYXRlcmlhbDpDU1NNYXRlcmlhbEJhc2U7XG5cdHByaXZhdGUgX2JpbGxib2FyZHM6QXJyYXk8QmlsbGJvYXJkPiA9IG5ldyBBcnJheTxCaWxsYm9hcmQ+KCk7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0Ly9sb2FkIGFuIGltYWdlXG5cdFx0QXNzZXRMaWJyYXJ5LmxvYWQobmV3IFVSTFJlcXVlc3QoJ2Fzc2V0cy8yNTZ4MjU2LnBuZycpICk7XG5cblx0XHQvL2xpc3RlbiBmb3IgYSByZXNvdXJjZSBjb21wbGV0ZSBldmVudFxuXHRcdEFzc2V0TGlicmFyeS5hZGRFdmVudExpc3RlbmVyKExvYWRlckV2ZW50LlJFU09VUkNFX0NPTVBMRVRFICwgKGV2ZW50OkxvYWRlckV2ZW50KSA9PiB0aGlzLm9uUmVzb3VyY2VDb21wbGV0ZShldmVudCkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIExpc3RlbmVyIGZvciByZXNvdXJjZSBjb21wbGV0ZSBldmVudFxuXHQgKlxuXHQgKiBAcGFyYW0gZXZlbnRcblx0ICovXG5cdG9uUmVzb3VyY2VDb21wbGV0ZShldmVudDpMb2FkZXJFdmVudClcblx0e1xuXHRcdC8vZ2V0IHRoZSBpbWFnZSB0ZXh0dXJlXG5cdFx0dGhpcy5faW1hZ2VUZXh0dXJlID0gPEltYWdlVGV4dHVyZT4gZXZlbnQuYXNzZXRzWzBdO1xuXG5cdFx0Ly9jcmVhdGUgdGhlIHZpZXdcblx0XHR0aGlzLl92aWV3ID0gbmV3IFZpZXcobmV3IENTU0RlZmF1bHRSZW5kZXJlcigpKTtcblxuXHRcdHRoaXMuX3Byb2plY3Rpb24gPSA8UGVyc3BlY3RpdmVQcm9qZWN0aW9uPiB0aGlzLl92aWV3LmNhbWVyYS5wcm9qZWN0aW9uO1xuXG5cblx0XHR0aGlzLl9wcm9qZWN0aW9uLmNvb3JkaW5hdGVTeXN0ZW0gPSBDb29yZGluYXRlU3lzdGVtLlJJR0hUX0hBTkRFRDtcblx0XHR0aGlzLl9wcm9qZWN0aW9uLmZvY2FsTGVuZ3RoID0gMTAwMDtcblx0XHR0aGlzLl9wcm9qZWN0aW9uLnByZXNlcnZlRm9jYWxMZW5ndGggPSB0cnVlO1xuXHRcdHRoaXMuX3Byb2plY3Rpb24ub3JpZ2luWCA9IDA7XG5cdFx0dGhpcy5fcHJvamVjdGlvbi5vcmlnaW5ZID0gMDtcblxuXHRcdC8vY3JlYXRlIGEgYml0bWFwIG1hdGVyaWFsXG5cdFx0dGhpcy5fYml0bWFwTWF0ZXJpYWwgPSBuZXcgQ1NTTWF0ZXJpYWxCYXNlKHRoaXMuX2ltYWdlVGV4dHVyZSk7XG5cblx0XHR2YXIgYmlsbGJvYXJkOkJpbGxib2FyZDtcblx0XHR2YXIgbnVtSEJpbGxib2FyZHM6bnVtYmVyID0gMjtcblx0XHR2YXIgbnVtVkJpbGxib2FyZHM6bnVtYmVyID0gMjtcblx0XHRmb3IgKHZhciBpOm51bWJlciA9IDA7IGkgPCBudW1IQmlsbGJvYXJkczsgaSsrKSB7XG5cdFx0XHRmb3IgKHZhciBqOm51bWJlciA9IDA7IGogPCBudW1WQmlsbGJvYXJkczsgaisrKSB7XG5cdFx0XHRcdGJpbGxib2FyZCA9IG5ldyBCaWxsYm9hcmQodGhpcy5fYml0bWFwTWF0ZXJpYWwpO1xuXHRcdFx0XHQvL2JpbGxib2FyZC53aWR0aCA9IDUwO1xuXHRcdFx0XHQvL2JpbGxib2FyZC5oZWlnaHQgPSA1MDtcblx0XHRcdFx0Ly9iaWxsYm9hcmQucGl2b3QgPSBuZXcgVmVjdG9yM0QoYmlsbGJvYXJkLmJpbGxib2FyZFdpZHRoLzIsIGJpbGxib2FyZC5iaWxsYm9hcmRIZWlnaHQvMiwgMCk7XG5cdFx0XHRcdGJpbGxib2FyZC54ID0gaiozMDA7XG5cdFx0XHRcdGJpbGxib2FyZC55ID0gaSozMDA7XG5cdFx0XHRcdGJpbGxib2FyZC56ID0gMDtcblx0XHRcdFx0YmlsbGJvYXJkLmFkZEV2ZW50TGlzdGVuZXIoQXdheU1vdXNlRXZlbnQuTU9VU0VfTU9WRSwgdGhpcy5vbk1vdXNlRXZlbnQpXG5cdFx0XHRcdC8vYmlsbGJvYXJkLm9yaWVudGF0aW9uTW9kZSA9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvYmFzZS5PcmllbnRhdGlvbk1vZGUuQ0FNRVJBX1BMQU5FO1xuXHRcdFx0XHQvL2JpbGxib2FyZC5hbGlnbm1lbnRNb2RlID0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9iYXNlLkFsaWdubWVudE1vZGUuUElWT1RfUE9JTlQ7XG5cdFx0XHRcdHRoaXMuX2JpbGxib2FyZHMucHVzaChiaWxsYm9hcmQpO1xuXHRcdFx0XHQvL2FkZCBiaWxsYm9hcmQgdG8gdGhlIHNjZW5lXG5cdFx0XHRcdHRoaXMuX3ZpZXcuc2NlbmUuYWRkQ2hpbGQoYmlsbGJvYXJkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLl9ob3ZlckNvbnRyb2wgPSBuZXcgSG92ZXJDb250cm9sbGVyKHRoaXMuX3ZpZXcuY2FtZXJhLCBudWxsLCAxODAsIDAsIDEwMDApO1xuXG5cdFx0ZG9jdW1lbnQub25tb3VzZWRvd24gPSAoZXZlbnQ6TW91c2VFdmVudCkgPT4gdGhpcy5vbk1vdXNlRG93bkhhbmRsZXIoZXZlbnQpO1xuXHRcdGRvY3VtZW50Lm9ubW91c2V1cCA9IChldmVudDpNb3VzZUV2ZW50KSA9PiB0aGlzLm9uTW91c2VVcEhhbmRsZXIoZXZlbnQpO1xuXHRcdGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gKGV2ZW50Ok1vdXNlRXZlbnQpID0+IHRoaXMub25Nb3VzZU1vdmUoZXZlbnQpO1xuXG5cdFx0d2luZG93Lm9ucmVzaXplICA9IChldmVudDpVSUV2ZW50KSA9PiB0aGlzLm9uUmVzaXplKGV2ZW50KTtcblxuXHRcdC8vdHJpZ2dlciBhbiBpbml0aWFsIHJlc2l6ZSBmb3IgdGhlIHZpZXdcblx0XHR0aGlzLm9uUmVzaXplKG51bGwpO1xuXG5cdFx0Ly9zZXR1cCB0aGUgUkFGIGZvciBhIHJlbmRlciBsaXN0ZW5lclxuXHRcdHRoaXMuX3RpbWVyID0gbmV3IFJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnJlbmRlciwgdGhpcyk7XG5cdFx0dGhpcy5fdGltZXIuc3RhcnQoKTtcblx0fVxuXG5cdHByaXZhdGUgb25Nb3VzZUV2ZW50KGV2ZW50OkF3YXlNb3VzZUV2ZW50KVxuXHR7XG5cdFx0Y29uc29sZS5sb2coZXZlbnQpO1xuXHR9XG5cblx0cHJpdmF0ZSBvblJlc2l6ZShldmVudDpVSUV2ZW50KVxuXHR7XG5cdFx0dGhpcy5fdmlldy54ID0gMDtcblx0XHR0aGlzLl92aWV3LnkgPSAwO1xuXHRcdHRoaXMuX3ZpZXcud2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblx0XHR0aGlzLl92aWV3LmhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblx0fVxuXG5cdHByaXZhdGUgcmVuZGVyKGR0Om51bWJlcilcblx0e1xuXHRcdGZvciAodmFyIGk6bnVtYmVyID0gMDsgaSA8IHRoaXMuX2JpbGxib2FyZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdC8vdGhpcy5fYmlsbGJvYXJkc1tpXS5yb3RhdGlvblogKz0yO1xuXHRcdH1cblxuXHRcdHRoaXMuX3ZpZXcucmVuZGVyKCk7XG5cblx0fVxuXG5cdHByaXZhdGUgb25Nb3VzZVVwSGFuZGxlcihldmVudDpNb3VzZUV2ZW50KVxuXHR7XG5cdFx0dGhpcy5fbW92ZSA9IGZhbHNlO1xuXHR9XG5cblx0cHJpdmF0ZSBvbk1vdXNlTW92ZShldmVudDpNb3VzZUV2ZW50KVxuXHR7XG5cdFx0aWYgKHRoaXMuX21vdmUpIHtcblx0XHRcdHRoaXMuX2hvdmVyQ29udHJvbC5wYW5BbmdsZSA9IDAuMyooZXZlbnQuY2xpZW50WCAtIHRoaXMuX2xhc3RNb3VzZVgpICsgdGhpcy5fbGFzdFBhbkFuZ2xlO1xuXHRcdFx0dGhpcy5faG92ZXJDb250cm9sLnRpbHRBbmdsZSA9IC0wLjMqKGV2ZW50LmNsaWVudFkgLSB0aGlzLl9sYXN0TW91c2VZKSArIHRoaXMuX2xhc3RUaWx0QW5nbGU7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBvbk1vdXNlRG93bkhhbmRsZXIoZXZlbnQ6TW91c2VFdmVudClcblx0e1xuXHRcdHRoaXMuX2xhc3RQYW5BbmdsZSA9IHRoaXMuX2hvdmVyQ29udHJvbC5wYW5BbmdsZTtcblx0XHR0aGlzLl9sYXN0VGlsdEFuZ2xlID0gdGhpcy5faG92ZXJDb250cm9sLnRpbHRBbmdsZTtcblx0XHR0aGlzLl9sYXN0TW91c2VYID0gZXZlbnQuY2xpZW50WDtcblx0XHR0aGlzLl9sYXN0TW91c2VZID0gZXZlbnQuY2xpZW50WTtcblx0XHR0aGlzLl9tb3ZlID0gdHJ1ZTtcblx0fVxufSJdfQ== \ No newline at end of file diff --git a/tests/entities/LayoutTest.ts b/tests/entities/LayoutTest.ts index 97466124..174c0e32 100644 --- a/tests/entities/LayoutTest.ts +++ b/tests/entities/LayoutTest.ts @@ -1,150 +1,149 @@ -/// -// - -module tests.entities +import View = require("awayjs-core/lib/containers/View"); +import HoverController = require("awayjs-core/lib/controllers/HoverController"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); +import AssetLibrary = require("awayjs-core/lib/core/library/AssetLibrary"); +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import CSSDefaultRenderer = require("awayjs-core/lib/core/render/CSSDefaultRenderer"); +import Billboard = require("awayjs-core/lib/entities/Billboard"); +import LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +import AwayMouseEvent = require("awayjs-core/lib/events/MouseEvent"); +import CSSMaterialBase = require("awayjs-core/lib/materials/CSSMaterialBase"); +import CoordinateSystem = require("awayjs-core/lib/projections/CoordinateSystem"); +import PerspectiveProjection = require("awayjs-core/lib/projections/PerspectiveProjection"); +import ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); +import RequestAnimationFrame = require("awayjs-core/lib/utils/RequestAnimationFrame"); + +class LayoutTest { - import View = away.containers.View; - import Billboard = away.entities.Billboard; - import Vector3D = away.geom.Vector3D; - import AssetLibrary = away.library.AssetLibrary; - import CSSMaterialBase = away.materials.CSSMaterialBase; - import ImageTexture = away.textures.ImageTexture; - import URLLoader = away.net.URLLoader; - import URLRequest = away.net.URLRequest; - import Delegate = away.utils.Delegate; - import RequestAnimationFrame = away.utils.RequestAnimationFrame; - - export class LayoutTest + private _view:View; + private _projection:PerspectiveProjection; + private _timer:RequestAnimationFrame; + private _hoverControl:HoverController; + + private _move:boolean = false; + private _lastPanAngle:number; + private _lastTiltAngle:number; + private _lastMouseX:number; + private _lastMouseY:number; + + private _imageTexture:ImageTexture; + private _bitmapMaterial:CSSMaterialBase; + private _billboards:Array = new Array(); + + constructor() { - private _view:View; - private _projection:away.projections.PerspectiveProjection; - private _timer:away.utils.RequestAnimationFrame; - private _hoverControl:away.controllers.HoverController; - - private _move:boolean = false; - private _lastPanAngle:number; - private _lastTiltAngle:number; - private _lastMouseX:number; - private _lastMouseY:number; - - private _imageTexture:ImageTexture; - private _bitmapMaterial:CSSMaterialBase; - private _billboards:Array = new Array(); - - constructor() - { - //load an image - AssetLibrary.load(new URLRequest('assets/256x256.png') ); - - //listen for a resource complete event - AssetLibrary.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE , Delegate.create(this, this.onResourceComplete)); - } + //load an image + AssetLibrary.load(new URLRequest('assets/256x256.png') ); + + //listen for a resource complete event + AssetLibrary.addEventListener(LoaderEvent.RESOURCE_COMPLETE , (event:LoaderEvent) => this.onResourceComplete(event)); + } - /** - * Listener for resource complete event - * - * @param event - */ - onResourceComplete(event:away.events.LoaderEvent) - { - //get the image texture - this._imageTexture = event.assets[0]; - - //create the view - this._view = new away.containers.View(new away.render.CSSDefaultRenderer()); - - this._projection = this._view.camera.projection; - - - this._projection.coordinateSystem = away.projections.CoordinateSystem.RIGHT_HANDED; - this._projection.focalLength = 1000; - this._projection.preserveFocalLength = true; - this._projection.originX = 0; - this._projection.originY = 0; - - //create a bitmap material - this._bitmapMaterial = new away.materials.CSSMaterialBase(this._imageTexture); - - var billboard:Billboard; - var numHBillboards:number = 2; - var numVBillboards:number = 2; - for (var i:number = 0; i < numHBillboards; i++) { - for (var j:number = 0; j < numVBillboards; j++) { - billboard = new Billboard(this._bitmapMaterial); - //billboard.width = 50; - //billboard.height = 50; - //billboard.pivot = new Vector3D(billboard.billboardWidth/2, billboard.billboardHeight/2, 0); - billboard.x = j*300; - billboard.y = i*300; - billboard.z = 0; - billboard.addEventListener(away.events.MouseEvent.MOUSE_MOVE, this.onMouseEvent) - //billboard.orientationMode = away.base.OrientationMode.CAMERA_PLANE; - //billboard.alignmentMode = away.base.AlignmentMode.PIVOT_POINT; - this._billboards.push(billboard); - //add billboard to the scene - this._view.scene.addChild(billboard); - } + /** + * Listener for resource complete event + * + * @param event + */ + onResourceComplete(event:LoaderEvent) + { + //get the image texture + this._imageTexture = event.assets[0]; + + //create the view + this._view = new View(new CSSDefaultRenderer()); + + this._projection = this._view.camera.projection; + + + this._projection.coordinateSystem = CoordinateSystem.RIGHT_HANDED; + this._projection.focalLength = 1000; + this._projection.preserveFocalLength = true; + this._projection.originX = 0; + this._projection.originY = 0; + + //create a bitmap material + this._bitmapMaterial = new CSSMaterialBase(this._imageTexture); + + var billboard:Billboard; + var numHBillboards:number = 2; + var numVBillboards:number = 2; + for (var i:number = 0; i < numHBillboards; i++) { + for (var j:number = 0; j < numVBillboards; j++) { + billboard = new Billboard(this._bitmapMaterial); + //billboard.width = 50; + //billboard.height = 50; + //billboard.pivot = new Vector3D(billboard.billboardWidth/2, billboard.billboardHeight/2, 0); + billboard.x = j*300; + billboard.y = i*300; + billboard.z = 0; + billboard.addEventListener(AwayMouseEvent.MOUSE_MOVE, this.onMouseEvent) + //billboard.orientationMode = require("awayjs-core/lib/base.OrientationMode.CAMERA_PLANE; + //billboard.alignmentMode = require("awayjs-core/lib/base.AlignmentMode.PIVOT_POINT; + this._billboards.push(billboard); + //add billboard to the scene + this._view.scene.addChild(billboard); } + } - this._hoverControl = new away.controllers.HoverController(this._view.camera, null, 180, 0, 1000); + this._hoverControl = new HoverController(this._view.camera, null, 180, 0, 1000); - document.onmousedown = (event:MouseEvent) => this.onMouseDownHandler(event); - document.onmouseup = (event:MouseEvent) => this.onMouseUpHandler(event); - document.onmousemove = (event:MouseEvent) => this.onMouseMove(event); + document.onmousedown = (event:MouseEvent) => this.onMouseDownHandler(event); + document.onmouseup = (event:MouseEvent) => this.onMouseUpHandler(event); + document.onmousemove = (event:MouseEvent) => this.onMouseMove(event); - window.onresize = (event:UIEvent) => this.onResize(event); + window.onresize = (event:UIEvent) => this.onResize(event); - //trigger an initial resize for the view - this.onResize(null); + //trigger an initial resize for the view + this.onResize(null); - //setup the RAF for a render listener - this._timer = new away.utils.RequestAnimationFrame(this.render, this); - this._timer.start(); - } + //setup the RAF for a render listener + this._timer = new RequestAnimationFrame(this.render, this); + this._timer.start(); + } - private onMouseEvent(event:away.events.MouseEvent) - { - console.log(event); - } + private onMouseEvent(event:AwayMouseEvent) + { + console.log(event); + } - private onResize(event:UIEvent) - { - this._view.x = 0; - this._view.y = 0; - this._view.width = window.innerWidth; - this._view.height = window.innerHeight; - } + private onResize(event:UIEvent) + { + this._view.x = 0; + this._view.y = 0; + this._view.width = window.innerWidth; + this._view.height = window.innerHeight; + } - private render(dt:number) - { - for (var i:number = 0; i < this._billboards.length; i++) { - //this._billboards[i].rotationZ +=2; - } + private render(dt:number) + { + for (var i:number = 0; i < this._billboards.length; i++) { + //this._billboards[i].rotationZ +=2; + } - this._view.render(); + this._view.render(); - } + } - private onMouseUpHandler(event:MouseEvent) - { - this._move = false; - } + private onMouseUpHandler(event:MouseEvent) + { + this._move = false; + } - private onMouseMove(event:MouseEvent) - { - if (this._move) { - this._hoverControl.panAngle = 0.3*(event.clientX - this._lastMouseX) + this._lastPanAngle; - this._hoverControl.tiltAngle = -0.3*(event.clientY - this._lastMouseY) + this._lastTiltAngle; - } + private onMouseMove(event:MouseEvent) + { + if (this._move) { + this._hoverControl.panAngle = 0.3*(event.clientX - this._lastMouseX) + this._lastPanAngle; + this._hoverControl.tiltAngle = -0.3*(event.clientY - this._lastMouseY) + this._lastTiltAngle; } + } - private onMouseDownHandler(event:MouseEvent) - { - this._lastPanAngle = this._hoverControl.panAngle; - this._lastTiltAngle = this._hoverControl.tiltAngle; - this._lastMouseX = event.clientX; - this._lastMouseY = event.clientY; - this._move = true; - } + private onMouseDownHandler(event:MouseEvent) + { + this._lastPanAngle = this._hoverControl.panAngle; + this._lastTiltAngle = this._hoverControl.tiltAngle; + this._lastMouseX = event.clientX; + this._lastMouseY = event.clientY; + this._move = true; } } \ No newline at end of file diff --git a/tests/events/EDTest.js b/tests/events/EDTest.js new file mode 100755 index 00000000..362dcd45 --- /dev/null +++ b/tests/events/EDTest.js @@ -0,0 +1,31 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var Event = require("awayjs-core/lib/events/Event"); +var EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); + +var EDTest = (function (_super) { + __extends(EDTest, _super); + function EDTest() { + var _this = this; + _super.call(this); + + console.log('Before addEventListener: ', this.hasEventListener(Event.COMPLETE)); + this.addEventListener(Event.COMPLETE, function (event) { + return _this.onComplete(event); + }); + console.log('After addEventListener: ', this.hasEventListener(Event.COMPLETE)); + this.removeEventListener(Event.COMPLETE, function (event) { + return _this.onComplete(event); + }); + console.log('After removeEventListener: ', this.hasEventListener(Event.COMPLETE)); + } + EDTest.prototype.onComplete = function (event) { + }; + return EDTest; +})(EventDispatcher); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImV2ZW50cy9FRFRlc3QudHMiXSwibmFtZXMiOlsiRURUZXN0IiwiRURUZXN0LmNvbnN0cnVjdG9yIiwiRURUZXN0Lm9uQ29tcGxldGUiXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG1EQUEyRDtBQUMzRCx1RUFBNkU7O0FBRTdFO0lBQXFCQSx5QkFBZUE7SUFFbkNBO1FBQUFDLGlCQVNDQTtRQVBBQSxXQUFNQSxLQUFBQSxDQUFDQTs7UUFFUEEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsMkJBQTJCQSxFQUFFQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO1FBQy9FQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEtBQUtBLENBQUNBLFFBQVFBLEVBQUVBLFVBQUNBLEtBQVdBO21CQUFLQSxLQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUF0QkEsQ0FBc0JBLENBQUNBO1FBQzlFQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSwwQkFBMEJBLEVBQUVBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7UUFDOUVBLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsUUFBUUEsRUFBRUEsVUFBQ0EsS0FBV0E7bUJBQUtBLEtBQUlBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLENBQUNBO1FBQXRCQSxDQUFzQkEsQ0FBQ0E7UUFDakZBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLDZCQUE2QkEsRUFBRUEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQTtJQUNsRkEsQ0FBQ0E7SUFFREQsOEJBQUFBLFVBQWtCQSxLQUFXQTtJQUc3QkUsQ0FBQ0E7SUFDRkYsY0FBQ0E7QUFBREEsQ0FBQ0EsRUFqQm9CLGVBQWUsRUFpQm5DO0FBQUEiLCJmaWxlIjoiZXZlbnRzL0VEVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFdmVudFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuaW1wb3J0IEV2ZW50RGlzcGF0Y2hlclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvRXZlbnREaXNwYXRjaGVyXCIpO1xuXG5jbGFzcyBFRFRlc3QgZXh0ZW5kcyBFdmVudERpc3BhdGNoZXJcbntcblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0c3VwZXIoKTtcblxuXHRcdGNvbnNvbGUubG9nKCdCZWZvcmUgYWRkRXZlbnRMaXN0ZW5lcjogJywgdGhpcy5oYXNFdmVudExpc3RlbmVyKEV2ZW50LkNPTVBMRVRFKSk7XG5cdFx0dGhpcy5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTVBMRVRFLCAoZXZlbnQ6RXZlbnQpID0+IHRoaXMub25Db21wbGV0ZShldmVudCkpO1xuXHRcdGNvbnNvbGUubG9nKCdBZnRlciBhZGRFdmVudExpc3RlbmVyOiAnLCB0aGlzLmhhc0V2ZW50TGlzdGVuZXIoRXZlbnQuQ09NUExFVEUpKTtcblx0XHR0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoRXZlbnQuQ09NUExFVEUsIChldmVudDpFdmVudCkgPT4gdGhpcy5vbkNvbXBsZXRlKGV2ZW50KSk7XG5cdFx0Y29uc29sZS5sb2coJ0FmdGVyIHJlbW92ZUV2ZW50TGlzdGVuZXI6ICcsIHRoaXMuaGFzRXZlbnRMaXN0ZW5lcihFdmVudC5DT01QTEVURSkpO1xuXHR9XG5cblx0cHVibGljIG9uQ29tcGxldGUoZXZlbnQ6RXZlbnQpXG5cdHtcblxuXHR9XG59Il19 \ No newline at end of file diff --git a/tests/events/EDTest.ts b/tests/events/EDTest.ts index 02b108db..56943010 100644 --- a/tests/events/EDTest.ts +++ b/tests/events/EDTest.ts @@ -1,32 +1,21 @@ -/// +import Event = require("awayjs-core/lib/events/Event"); +import EventDispatcher = require("awayjs-core/lib/events/EventDispatcher"); -module tests.events +class EDTest extends EventDispatcher { - import Delegate = away.utils.Delegate; - - export class EDTest extends away.events.EventDispatcher - { - - constructor() - { - - super(); - - console.log( 'Before addEventListener: ' , this.hasEventListener( away.events.Event.COMPLETE ) ) ; - this.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.onComplete) ); - console.log( 'After addEventListener: ' , this.hasEventListener( away.events.Event.COMPLETE ) ) ; - this.removeEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.onComplete) ); - console.log( 'After removeEventListener: ' , this.hasEventListener( away.events.Event.COMPLETE ) ) ; - - } - - public onComplete( e ) - { - - - } - - } - - -} + constructor() + { + super(); + + console.log('Before addEventListener: ', this.hasEventListener(Event.COMPLETE)); + this.addEventListener(Event.COMPLETE, (event:Event) => this.onComplete(event)); + console.log('After addEventListener: ', this.hasEventListener(Event.COMPLETE)); + this.removeEventListener(Event.COMPLETE, (event:Event) => this.onComplete(event)); + console.log('After removeEventListener: ', this.hasEventListener(Event.COMPLETE)); + } + + public onComplete(event:Event) + { + + } +} \ No newline at end of file diff --git a/tests/frame.html b/tests/frame.html index 76651b46..4b550ef6 100755 --- a/tests/frame.html +++ b/tests/frame.html @@ -12,14 +12,14 @@ } - - + + diff --git a/tests/geom/ColorUtils.ts b/tests/geom/ColorUtils.ts deleted file mode 100644 index b12f88ae..00000000 --- a/tests/geom/ColorUtils.ts +++ /dev/null @@ -1,63 +0,0 @@ -/// - -module tests.geom { - - export class ColorUtils - { - - constructor() - { - - /* - constructor( inRedMultiplier:number = 1.0, inGreenMultiplier:number = 1.0, inBlueMultiplier:number = 1.0, inAlphaMultiplier:number = 1.0, - inRedOffset:number = 0.0, inGreenOffset:number = 0.0, inBlueOffset:number = 0.0, inAlphaOffset:number = 0.0) - */ - - var ct_RED = new away.geom.ColorTransform( 1 , 0 , 0 , 1 , - 255 , 0 , 0 , 255 ); - - console.log( "ct_RED - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_RED.color )); - - var ct_GREEN = new away.geom.ColorTransform( 0 , 1 , 0 , 1 , - 0 , 255 , 0 , 255 ); - - console.log( "ct_GREEN - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_GREEN.color )); - - var ct_BLUE = new away.geom.ColorTransform( 0 , 0 , 1 , 1 , - 0 , 0 , 255 , 255 ); - - console.log( "ct_BLUE - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_BLUE.color )); - - var ct_RED_a = new away.geom.ColorTransform(.5 , 0 , 0 , 1 , - 255 , 0 , 0 , 255 ); - - console.log( "ct_RED_a - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_RED_a.color )); - - var ct_GREEN_a = new away.geom.ColorTransform( 0 ,.5 , 0 , 1 , - 0 , 255 , 0 , 255 ); - - console.log( "ct_GREEN_a - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_GREEN_a.color )); - - var ct_BLUE_a = new away.geom.ColorTransform( 0 , 0 , .5 , 1 , - 0 , 0 , 255 , 255 ); - - console.log( "ct_BLUE_a - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_BLUE_a.color )); - - - console.log('--------------------------------------------------------------------------------'); - - ct_RED.color = 0xff0000; - console.log( "SET - ct_RED - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_RED.color )); - - ct_GREEN.color = 0x00ff00; - console.log( "SET - ct_GREEN - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_GREEN.color )); - - ct_BLUE.color = 0x0000ff; - console.log( "SET - ct_BLUE - ARGB: ", away.utils.ColorUtils.float32ColorToARGB( ct_BLUE.color )); - - - } - - - } -} diff --git a/tests/geom/ColorUtilsTest.js b/tests/geom/ColorUtilsTest.js new file mode 100755 index 00000000..c0e002e0 --- /dev/null +++ b/tests/geom/ColorUtilsTest.js @@ -0,0 +1,48 @@ +var ColorTransform = require("awayjs-core/lib/core/geom/ColorTransform"); +var ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +var ColorUtilsTest = (function () { + function ColorUtilsTest() { + /* + constructor( inRedMultiplier:number = 1.0, inGreenMultiplier:number = 1.0, inBlueMultiplier:number = 1.0, inAlphaMultiplier:number = 1.0, + inRedOffset:number = 0.0, inGreenOffset:number = 0.0, inBlueOffset:number = 0.0, inAlphaOffset:number = 0.0) + */ + var ct_RED = new ColorTransform(1, 0, 0, 1, 255, 0, 0, 255); + + console.log("ct_RED - ARGB: ", ColorUtils.float32ColorToARGB(ct_RED.color)); + + var ct_GREEN = new ColorTransform(0, 1, 0, 1, 0, 255, 0, 255); + + console.log("ct_GREEN - ARGB: ", ColorUtils.float32ColorToARGB(ct_GREEN.color)); + + var ct_BLUE = new ColorTransform(0, 0, 1, 1, 0, 0, 255, 255); + + console.log("ct_BLUE - ARGB: ", ColorUtils.float32ColorToARGB(ct_BLUE.color)); + + var ct_RED_a = new ColorTransform(.5, 0, 0, 1, 255, 0, 0, 255); + + console.log("ct_RED_a - ARGB: ", ColorUtils.float32ColorToARGB(ct_RED_a.color)); + + var ct_GREEN_a = new ColorTransform(0, .5, 0, 1, 0, 255, 0, 255); + + console.log("ct_GREEN_a - ARGB: ", ColorUtils.float32ColorToARGB(ct_GREEN_a.color)); + + var ct_BLUE_a = new ColorTransform(0, 0, .5, 1, 0, 0, 255, 255); + + console.log("ct_BLUE_a - ARGB: ", ColorUtils.float32ColorToARGB(ct_BLUE_a.color)); + + console.log('--------------------------------------------------------------------------------'); + + ct_RED.color = 0xff0000; + console.log("SET - ct_RED - ARGB: ", ColorUtils.float32ColorToARGB(ct_RED.color)); + + ct_GREEN.color = 0x00ff00; + console.log("SET - ct_GREEN - ARGB: ", ColorUtils.float32ColorToARGB(ct_GREEN.color)); + + ct_BLUE.color = 0x0000ff; + console.log("SET - ct_BLUE - ARGB: ", ColorUtils.float32ColorToARGB(ct_BLUE.color)); + } + return ColorUtilsTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdlb20vQ29sb3JVdGlsc1Rlc3QudHMiXSwibmFtZXMiOlsiQ29sb3JVdGlsc1Rlc3QiLCJDb2xvclV0aWxzVGVzdC5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQUEsd0VBQThFO0FBQzlFLDREQUFtRTs7QUFFbkU7SUFFQ0E7UUFFQ0M7OztVQUdFQTtRQUVGQSxJQUFJQSxNQUFNQSxHQUFHQSxJQUFJQSxjQUFjQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQTs7UUFFM0RBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLGlCQUFpQkEsRUFBRUEsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFFQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTs7UUFFNUVBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLGNBQWNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBOztRQUU3REEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsbUJBQW1CQSxFQUFFQSxVQUFVQSxDQUFDQSxrQkFBa0JBLENBQUVBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBOztRQUVoRkEsSUFBSUEsT0FBT0EsR0FBR0EsSUFBSUEsY0FBY0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7O1FBRTVEQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxrQkFBa0JBLEVBQUVBLFVBQVVBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7O1FBRTdFQSxJQUFJQSxRQUFRQSxHQUFHQSxJQUFJQSxjQUFjQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxHQUFHQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQTs7UUFFOURBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLG1CQUFtQkEsRUFBRUEsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTs7UUFFL0VBLElBQUlBLFVBQVVBLEdBQUdBLElBQUlBLGNBQWNBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLEdBQUdBLEVBQUVBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBOztRQUVoRUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EscUJBQXFCQSxFQUFFQSxVQUFVQSxDQUFDQSxrQkFBa0JBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBOztRQUVuRkEsSUFBSUEsU0FBU0EsR0FBR0EsSUFBSUEsY0FBY0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7O1FBRS9EQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxvQkFBb0JBLEVBQUVBLFVBQVVBLENBQUNBLGtCQUFrQkEsQ0FBRUEsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7O1FBR2xGQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxrRkFBa0ZBLENBQUNBOztRQUUvRkEsTUFBTUEsQ0FBQ0EsS0FBS0EsR0FBR0EsUUFBUUE7UUFDdkJBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLHVCQUF1QkEsRUFBRUEsVUFBVUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTs7UUFFakZBLFFBQVFBLENBQUNBLEtBQUtBLEdBQUdBLFFBQVFBO1FBQ3pCQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSx5QkFBeUJBLEVBQUVBLFVBQVVBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7O1FBRXJGQSxPQUFPQSxDQUFDQSxLQUFLQSxHQUFHQSxRQUFRQTtRQUN4QkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0Esd0JBQXdCQSxFQUFFQSxVQUFVQSxDQUFDQSxrQkFBa0JBLENBQUNBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0lBQ3BGQSxDQUFDQTtJQUNGRCxzQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTtBQUFBIiwiZmlsZSI6Imdlb20vQ29sb3JVdGlsc1Rlc3QuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29sb3JUcmFuc2Zvcm1cdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL0NvbG9yVHJhbnNmb3JtXCIpO1xuaW1wb3J0IENvbG9yVXRpbHNcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi91dGlscy9Db2xvclV0aWxzXCIpO1xuXG5jbGFzcyBDb2xvclV0aWxzVGVzdFxue1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHQvKlxuXHRcdGNvbnN0cnVjdG9yKCAgICBpblJlZE11bHRpcGxpZXI6bnVtYmVyID0gMS4wLCAgaW5HcmVlbk11bHRpcGxpZXI6bnVtYmVyID0gMS4wLCBpbkJsdWVNdWx0aXBsaWVyOm51bWJlciA9IDEuMCwgIGluQWxwaGFNdWx0aXBsaWVyOm51bWJlciA9IDEuMCxcblx0XHRcdFx0XHRcdGluUmVkT2Zmc2V0Om51bWJlciA9IDAuMCwgICAgICBpbkdyZWVuT2Zmc2V0Om51bWJlciA9IDAuMCwgICAgIGluQmx1ZU9mZnNldDpudW1iZXIgPSAwLjAsICAgICAgaW5BbHBoYU9mZnNldDpudW1iZXIgPSAwLjApXG5cdFx0Ki9cblxuXHRcdHZhciBjdF9SRUQgPSBuZXcgQ29sb3JUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMjU1LCAwLCAwLCAyNTUpO1xuXG5cdFx0Y29uc29sZS5sb2coXCJjdF9SRUQgLSBBUkdCOiBcIiwgQ29sb3JVdGlscy5mbG9hdDMyQ29sb3JUb0FSR0IoIGN0X1JFRC5jb2xvcikpO1xuXG5cdFx0dmFyIGN0X0dSRUVOID0gbmV3IENvbG9yVHJhbnNmb3JtKDAsIDEsIDAsIDEsIDAsIDI1NSwgMCwgMjU1KTtcblxuXHRcdGNvbnNvbGUubG9nKFwiY3RfR1JFRU4gLSBBUkdCOiBcIiwgQ29sb3JVdGlscy5mbG9hdDMyQ29sb3JUb0FSR0IoIGN0X0dSRUVOLmNvbG9yKSk7XG5cblx0XHR2YXIgY3RfQkxVRSA9IG5ldyBDb2xvclRyYW5zZm9ybSgwLCAwLCAxLCAxLCAwLCAwLCAyNTUsIDI1NSk7XG5cblx0XHRjb25zb2xlLmxvZyhcImN0X0JMVUUgLSBBUkdCOiBcIiwgQ29sb3JVdGlscy5mbG9hdDMyQ29sb3JUb0FSR0IoY3RfQkxVRS5jb2xvcikpO1xuXG5cdFx0dmFyIGN0X1JFRF9hID0gbmV3IENvbG9yVHJhbnNmb3JtKC41LCAwLCAwLCAxLCAyNTUsIDAsIDAsIDI1NSk7XG5cblx0XHRjb25zb2xlLmxvZyhcImN0X1JFRF9hIC0gQVJHQjogXCIsIENvbG9yVXRpbHMuZmxvYXQzMkNvbG9yVG9BUkdCKGN0X1JFRF9hLmNvbG9yKSk7XG5cblx0XHR2YXIgY3RfR1JFRU5fYSA9IG5ldyBDb2xvclRyYW5zZm9ybSgwLCAuNSwgMCwgMSwgMCwgMjU1LCAwLCAyNTUpO1xuXG5cdFx0Y29uc29sZS5sb2coXCJjdF9HUkVFTl9hIC0gQVJHQjogXCIsIENvbG9yVXRpbHMuZmxvYXQzMkNvbG9yVG9BUkdCKGN0X0dSRUVOX2EuY29sb3IpKTtcblxuXHRcdHZhciBjdF9CTFVFX2EgPSBuZXcgQ29sb3JUcmFuc2Zvcm0oMCwgMCwgLjUsIDEsIDAsIDAsIDI1NSwgMjU1KTtcblxuXHRcdGNvbnNvbGUubG9nKFwiY3RfQkxVRV9hIC0gQVJHQjogXCIsIENvbG9yVXRpbHMuZmxvYXQzMkNvbG9yVG9BUkdCKCBjdF9CTFVFX2EuY29sb3IpKTtcblxuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG5cblx0XHRjdF9SRUQuY29sb3IgPSAweGZmMDAwMDtcblx0XHRjb25zb2xlLmxvZyhcIlNFVCAtIGN0X1JFRCAtIEFSR0I6IFwiLCBDb2xvclV0aWxzLmZsb2F0MzJDb2xvclRvQVJHQihjdF9SRUQuY29sb3IpKTtcblxuXHRcdGN0X0dSRUVOLmNvbG9yID0gMHgwMGZmMDA7XG5cdFx0Y29uc29sZS5sb2coXCJTRVQgLSBjdF9HUkVFTiAtIEFSR0I6IFwiLCBDb2xvclV0aWxzLmZsb2F0MzJDb2xvclRvQVJHQihjdF9HUkVFTi5jb2xvcikpO1xuXG5cdFx0Y3RfQkxVRS5jb2xvciA9IDB4MDAwMGZmO1xuXHRcdGNvbnNvbGUubG9nKFwiU0VUIC0gY3RfQkxVRSAtIEFSR0I6IFwiLCBDb2xvclV0aWxzLmZsb2F0MzJDb2xvclRvQVJHQihjdF9CTFVFLmNvbG9yKSk7XG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/geom/ColorUtilsTest.ts b/tests/geom/ColorUtilsTest.ts new file mode 100644 index 00000000..cb8e00fe --- /dev/null +++ b/tests/geom/ColorUtilsTest.ts @@ -0,0 +1,49 @@ +import ColorTransform = require("awayjs-core/lib/core/geom/ColorTransform"); +import ColorUtils = require("awayjs-core/lib/utils/ColorUtils"); + +class ColorUtilsTest +{ + constructor() + { + /* + constructor( inRedMultiplier:number = 1.0, inGreenMultiplier:number = 1.0, inBlueMultiplier:number = 1.0, inAlphaMultiplier:number = 1.0, + inRedOffset:number = 0.0, inGreenOffset:number = 0.0, inBlueOffset:number = 0.0, inAlphaOffset:number = 0.0) + */ + + var ct_RED = new ColorTransform(1, 0, 0, 1, 255, 0, 0, 255); + + console.log("ct_RED - ARGB: ", ColorUtils.float32ColorToARGB( ct_RED.color)); + + var ct_GREEN = new ColorTransform(0, 1, 0, 1, 0, 255, 0, 255); + + console.log("ct_GREEN - ARGB: ", ColorUtils.float32ColorToARGB( ct_GREEN.color)); + + var ct_BLUE = new ColorTransform(0, 0, 1, 1, 0, 0, 255, 255); + + console.log("ct_BLUE - ARGB: ", ColorUtils.float32ColorToARGB(ct_BLUE.color)); + + var ct_RED_a = new ColorTransform(.5, 0, 0, 1, 255, 0, 0, 255); + + console.log("ct_RED_a - ARGB: ", ColorUtils.float32ColorToARGB(ct_RED_a.color)); + + var ct_GREEN_a = new ColorTransform(0, .5, 0, 1, 0, 255, 0, 255); + + console.log("ct_GREEN_a - ARGB: ", ColorUtils.float32ColorToARGB(ct_GREEN_a.color)); + + var ct_BLUE_a = new ColorTransform(0, 0, .5, 1, 0, 0, 255, 255); + + console.log("ct_BLUE_a - ARGB: ", ColorUtils.float32ColorToARGB( ct_BLUE_a.color)); + + + console.log('--------------------------------------------------------------------------------'); + + ct_RED.color = 0xff0000; + console.log("SET - ct_RED - ARGB: ", ColorUtils.float32ColorToARGB(ct_RED.color)); + + ct_GREEN.color = 0x00ff00; + console.log("SET - ct_GREEN - ARGB: ", ColorUtils.float32ColorToARGB(ct_GREEN.color)); + + ct_BLUE.color = 0x0000ff; + console.log("SET - ct_BLUE - ARGB: ", ColorUtils.float32ColorToARGB(ct_BLUE.color)); + } +} \ No newline at end of file diff --git a/tests/geom/MatrixTest.js b/tests/geom/MatrixTest.js new file mode 100755 index 00000000..64fc3f44 --- /dev/null +++ b/tests/geom/MatrixTest.js @@ -0,0 +1,13 @@ +var Matrix = require("awayjs-core/lib/core/geom/Matrix"); + +var MatrixTest = (function () { + function MatrixTest() { + this.ma = new Matrix(10, 11, 12, 13, 14, 15); + this.mb = new Matrix(0, 1, 2, 3, 4, 5); + this.ma.concat(this.mb); + console.log(this.ma); + } + return MatrixTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdlb20vTWF0cml4VGVzdC50cyJdLCJuYW1lcyI6WyJNYXRyaXhUZXN0IiwiTWF0cml4VGVzdC5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQUEsd0RBQWdFOztBQUVoRTtJQU1DQTtRQUhBQyxLQUFRQSxFQUFFQSxHQUFVQSxJQUFJQSxNQUFNQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUN2REEsS0FBUUEsRUFBRUEsR0FBVUEsSUFBSUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFJaERBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBO1FBQ3ZCQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQTtJQUNyQkEsQ0FBQ0E7SUFDRkQsa0JBQUNBO0FBQURBLENBQUNBLElBQUE7QUFBQSIsImZpbGUiOiJnZW9tL01hdHJpeFRlc3QuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTWF0cml4XHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vTWF0cml4XCIpO1xuXG5jbGFzcyBNYXRyaXhUZXN0XG57XG5cblx0cHJpdmF0ZSBtYTpNYXRyaXggPSBuZXcgTWF0cml4KDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUpO1xuXHRwcml2YXRlIG1iOk1hdHJpeCA9IG5ldyBNYXRyaXgoMCwgMSwgMiwgMywgNCwgNSk7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5tYS5jb25jYXQodGhpcy5tYik7XG5cdFx0Y29uc29sZS5sb2codGhpcy5tYSk7XG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/geom/MatrixTest.ts b/tests/geom/MatrixTest.ts index 0c153018..06752402 100644 --- a/tests/geom/MatrixTest.ts +++ b/tests/geom/MatrixTest.ts @@ -1,21 +1,14 @@ -/// +import Matrix = require("awayjs-core/lib/core/geom/Matrix"); -module tests.geom { +class MatrixTest +{ - export class MatrixTest - { + private ma:Matrix = new Matrix(10, 11, 12, 13, 14, 15); + private mb:Matrix = new Matrix(0, 1, 2, 3, 4, 5); - private ma : away.geom.Matrix = new away.geom.Matrix( 10 , 11, 12 , 13 , 14 , 15); - private mb : away.geom.Matrix = new away.geom.Matrix( 0 , 1, 2 , 3 , 4 , 5); - - constructor() - { - - this.ma.concat( this.mb ); - console.log( this.ma ); - - } - - - } + constructor() + { + this.ma.concat(this.mb); + console.log(this.ma); + } } \ No newline at end of file diff --git a/tests/geom/VextMat3DTests.js b/tests/geom/VextMat3DTests.js new file mode 100755 index 00000000..c3fc57f8 --- /dev/null +++ b/tests/geom/VextMat3DTests.js @@ -0,0 +1,898 @@ +var Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +var Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); + +var VextMat3DTests = (function () { + function VextMat3DTests() { + var m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var v = new Vector3D(); + + console.log('------------------------------------ copyColumnTo'); // DONE OK + + m.copyColumnTo(0, v); + console.log('copyColumnTo 0 ', v); + m.copyColumnTo(1, v); + console.log('copyColumnTo 1 ', v); + m.copyColumnTo(2, v); + console.log('copyColumnTo 2 ', v); + m.copyColumnTo(3, v); + console.log('copyColumnTo 3 ', v); + + console.log('------------------------------------ copyRowTo'); // DONE OK + + var r = new Vector3D(); + + m.copyRowTo(0, r); + console.log('copyRowTo 0 ', r); + m.copyRowTo(1, r); + console.log('copyRowTo 1 ', r); + m.copyRowTo(2, r); + console.log('copyRowTo 2 ', r); + m.copyRowTo(3, r); + console.log('copyRowTo 3 ', r); + + console.log('------------------------------------ copyRowFrom'); // DONE OK + + m = new Matrix3D([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + + m.copyRowFrom(0, new Vector3D(16, 15, 14, 13)); + console.log('copyRowFrom 0 ', m.rawData); + m.copyRowFrom(1, new Vector3D(12, 11, 10, 9)); + console.log('copyRowFrom 1 ', m.rawData); + m.copyRowFrom(2, new Vector3D(8, 7, 6, 5)); + console.log('copyRowFrom 2 ', m.rawData); + m.copyRowFrom(3, new Vector3D(4, 3, 2, 1)); + console.log('copyRowFrom 3 ', m.rawData); + + console.log('------------------------------------ copyColumnFrom'); // DONE OK + + m = new Matrix3D([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + + m.copyColumnFrom(0, new Vector3D(16, 15, 14, 13)); + console.log('copyColumnFrom 0 ', m.rawData); + m.copyColumnFrom(1, new Vector3D(12, 11, 10, 9)); + console.log('copyColumnFrom 1 ', m.rawData); + m.copyColumnFrom(2, new Vector3D(8, 7, 6, 5)); + console.log('copyColumnFrom 2 ', m.rawData); + m.copyColumnFrom(3, new Vector3D(4, 3, 2, 1)); + console.log('copyColumnFrom 3 ', m.rawData); + + console.log('------------------------------------ Append'); // DONE OK + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var s = new Matrix3D([ + 16, 15, 14, 13, + 12, 11, 10, 9, + 8, 7, 6, 5, + 4, 3, 2, 1]); + + m.append(s); + + console.log('Append Result', m.rawData); + console.log('Appendee', s.rawData); + + console.log('------------------------------------ Prepend'); // DONE OK + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + s = new Matrix3D([ + 16, 15, 14, 13, + 12, 11, 10, 9, + 8, 7, 6, 5, + 4, 3, 2, 1]); + + m.prepend(s); + + console.log('Prepend Result', m.rawData); + console.log('Prependee', s.rawData); + + console.log('------------------------------------ Append Translation'); // DONE OK + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + m.appendTranslation(5, 6, 7); + console.log(' Append Translation', m.rawData); + + console.log('------------------------------------ appendRotation'); // DONE OK - Pivot gives different result ( commented out for now ) + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var pivot = new Vector3D(7, 8, 9); + + var axis = new Vector3D(0, 0, 1); + m.appendRotation(45, axis); //, pivot ); + console.log('appendRotation', m.rawData); + + console.log('------------------------------------ appendScale'); // DONE OK + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + m.appendScale(6, 7, 8); + console.log('appendScale', m.rawData); + + console.log('------------------------------------ prepentScale'); // DONE OK + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + m.prependScale(6, 7, 8); + console.log('prepentScale', m.rawData); + + console.log('------------------------------------ clone'); // DONE OK + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + console.log('clone', m.clone().rawData); + + console.log('------------------------------------ copyFrom'); // DONE OK + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var cl = new Matrix3D([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + cl.copyFrom(m); + + console.log('copyFrom', cl.rawData); + + console.log('------------------------------------ copyRawDataFrom'); // DONE ok - Offet / Traspose not implemented + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + m.copyRawDataFrom([16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]); + + console.log('copyRawDataFrom', m.rawData); + + console.log('------------------------------------ copyRawDataTo'); // done OK + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var result = new Array(9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9); + + console.log('result.length: ', result.length); + + m.copyRawDataTo(result, 1, true); + console.log('rawData', m.rawData); + console.log('copyRawDataTo', result); + + console.log('------------------------------------ transpose'); // DONE ok - Offet / Traspose not implemented + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + m.transpose(); + console.log('transpose', m.rawData); + + console.log('------------------------------------ copyToMatrix3D'); // done ok + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + s = new Matrix3D([ + 16, 15, 14, 13, + 12, 11, 10, 9, + 8, 7, 6, 5, + 4, 3, 2, 1]); + + m.copyToMatrix3D(s); + console.log('copyToMatrix3D', m.rawData); + + console.log('------------------------------------ decompose'); /// NOT WORKING + + m = new Matrix3D([ + 1, 6, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1]); + + var resultDecompose = m.decompose(); + console.log('copyToMatrix3D', resultDecompose[0]); + console.log('copyToMatrix3D', resultDecompose[1]); + console.log('copyToMatrix3D', resultDecompose[2]); + + console.log('------------------------------------ determinant'); // WORKING ok - good + + m = new Matrix3D([ + 1, 2, 0, 6, + 2, 1, 0, 0, + 0, 0, 1, 3, + 6, 0, 3, 1]); + + console.log('determinant:', m.determinant); + + m = new Matrix3D([ + 1, 2, 5, 6, + 2, 1, 0, 8, + 5, 0, 1, 3, + 6, 8, 3, 1]); + + console.log('determinant:', m.determinant); + + m = new Matrix3D([ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1]); + + console.log('determinant:', m.determinant); + + console.log('------------------------------------ invert'); // WORKING ok - good + + m = new Matrix3D([ + 1, 2, 5, 6, + 2, 1, 0, 8, + 5, 0, 1, 3, + 6, 8, 3, 1]); + + var b; + + b = m.invert(); + console.log('invert:', b, m.rawData); + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + b = m.invert(); + console.log('invert:', b, m.rawData); + + console.log('------------------------------------ Prepend Rotation'); // OK Good + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + axis = new Vector3D(1, 0, 0); + m.prependRotation(45, axis); + + console.log('prependRotation:', m.rawData); + + console.log('------------------------------------ prependTranslation'); // OK Good + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + m.prependTranslation(5, 10, 15); + + console.log('prependTranslation:', m.rawData); + + console.log('------------------------------------ recompose'); // OK Good + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var rVects = new Array(); + rVects.push(new Vector3D(5, 1, 3)); + rVects.push(new Vector3D(5, 0, 1)); + rVects.push(new Vector3D(2, 1, 3)); + + m.recompose(rVects); + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + rVects = new Array(); + rVects.push(new Vector3D(1, 2, 9)); + rVects.push(new Vector3D(3, 3, 1)); + rVects.push(new Vector3D(8, 1, 8)); + + m.recompose(rVects); + + console.log('recompose:', m.rawData); + + rVects = new Array(); + rVects.push(new Vector3D(1, 2, 9)); + rVects.push(new Vector3D(3, 3, 1)); + rVects.push(new Vector3D(0, 0, 0)); + + var b = m.recompose(rVects); + + console.log('fail - recompose:', m.rawData, b); + + console.log('------------------------------------ transformVector '); // IT WORKS !!! + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var tVResult = m.transformVector(new Vector3D(1, 2, 3)); + + console.log(tVResult); + + console.log('------------------------------------ transformVector '); // IT WORKS !!! + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var vout = new Array(0, 1, 2, 3, 4, 5); + var vin = new Array(4, 5, 6); + m.transformVectors(vin, vout); + console.log('transformVector', vout, vin); + + console.log('------------------------------------ transpose'); // IT WORKS !!! + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + m.transpose(); + console.log('transpose', m.rawData); + + console.log('------------------------------------ getAxisRotation'); // internal class + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + //m.getAxisRotation(4 , 5 , 6 , 90 ); + //console.log( 'getAxisRotation' , m.rawData ); + console.log('------------------------------------ position'); // internal class + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16]); + + var posVect = new Vector3D(5, 10, 15); + + m.position = posVect; + + console.log('set position', m.rawData); + console.log('get position', m.position); + } + VextMat3DTests.prototype.testappend = function () { + var v = new Vector3D(0, 1, 1); + var v1 = new Vector3D(1, 0, 1); + var v2 = new Vector3D(7, 8, 0); + + var t = new Matrix3D([ + 0, 10, 10, 1, + 10, 5, 10, 10, + 10, 10, 5, 10, + 1, 10, 10, 0]); + + var d = new Matrix3D([ + 1, 50, 1, 8, + 2, 5, 12, 9, + 30, 16, 35, 10, + 4, 18, 40, 11]); + t.append(d); + + console.log(t.rawData); + }; + + VextMat3DTests.prototype.testprependRotation = function () { + var v = new Vector3D(0, 1, 1); + var v1 = new Vector3D(1, 0, 1); + var v2 = new Vector3D(7, 8, 0); + + var t = new Matrix3D([ + 0, 10, 10, 1, + 10, 5, 10, 10, + 10, 10, 5, 10, + 1, 10, 10, 0]); + + var d = new Matrix3D(); + t.prependRotation(90, v); + + console.log(t.rawData); + }; + + VextMat3DTests.prototype.testcopyToMatrix3D = function () { + var v = new Vector3D(0, 2, 3); + var v1 = new Vector3D(4, 0, 6); + var v2 = new Vector3D(7, 8, 0); + + var t = new Matrix3D([ + 0, 10, 10, 1, + 10, 5, 10, 10, + 10, 10, 5, 10, + 1, 10, 10, 0]); + + var d = new Matrix3D(); + + //t.copyToMatrix3D( d ) ; + console.log(d.rawData); + }; + + VextMat3DTests.prototype.testDecompose = function () { + console.log('----------------------------------------------------------------------'); + console.log('testDecompose'); + var v; + var m; + var r = new Array(16); + + for (var c = 0; c < 10; c++) { + m = new Matrix3D([ + this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), + this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), + this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), + this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100)]); + + m.copyRawDataTo(r); + + v = m.decompose(); + this.outputDecompose(m.rawData, r, v[0], v[1], v[2]); + } + + console.log('//------------------------------------------------------------ AS3'); + console.log('private function testDecompose( result : Vector. , original : Vector. , a1 : Vector3D , a2 : Vector3D , a3 : Vector3D )'); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' var result : Vector. = m.decompose();'); + console.log(" trace('0----------------------------------------');"); + console.log(" trace( r[0])"); + console.log(" trace( a1 )"); + console.log(" trace('1--------------------');"); + console.log(" trace( r[1])"); + console.log(" trace( a2 )"); + console.log(" trace('2--------------------');"); + console.log(" trace( r[2])"); + console.log(" trace( a3 )"); + console.log(" trace('--------------------');"); + console.log(" trace( 'TSResult: ' , result );"); + console.log(" trace( 'ASResult: ' , m.rawData );"); + console.log(" trace( 'original: ' , original );"); + console.log(" trace('--------------------');"); + console.log('}'); + }; + + VextMat3DTests.prototype.outputDecompose = function (result, original, a1, a2, a3) { + var s1 = 'new Vector3D( ' + a1.x + ' , ' + a1.y + ' , ' + a1.z + ' )'; + var s2 = 'new Vector3D( ' + a2.x + ' , ' + a2.y + ' , ' + a2.z + ' )'; + var s3 = 'new Vector3D( ' + a3.x + ' , ' + a3.y + ' , ' + a3.z + ' )'; + + console.log('testDecompose( new [' + result + '], new [' + original + '] , ' + s1 + ' , ' + s2 + ' , ' + s3 + ' );'); + }; + + VextMat3DTests.prototype.testPosition = function () { + console.log('----------------------------------------------------------------------'); + console.log('testPosition'); + var v = new Vector3D(1, 2, 3); + var p = new Vector3D(2, 2, 2); + var pos; + + var m; + var i; + var r = new Array(16); + + m = new Matrix3D([ + 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1]); + m.copyRawDataTo(r); + m.position = v; + pos = m.position; + this.outputPosition(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1]); + m.copyRawDataTo(r); + m.position = v; + pos = m.position; + this.outputPosition(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1]); + m.copyRawDataTo(r); + m.position = v; + pos = m.position; + this.outputPosition(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1]); + m.copyRawDataTo(r); + m.position = v; + pos = m.position; + this.outputPosition(m.rawData, r, v); + + console.log('//------------------------------------------------------------ AS3'); + console.log('private function testPosition( result : Vector. , original : Vector. , t : Vector3D )'); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' m.position = t;'); + console.log(' var p : Vector3D = m.position;'); + console.log(' trace( "TSResult: " , result );'); + console.log(' trace( "ASResult: " , m.rawData );'); + console.log(' trace( "Pos: " ,p );'); + console.log('}'); + }; + + VextMat3DTests.prototype.outputPosition = function (result, original, posResult) { + var a = 'new Vector3D( ' + posResult.x + ' , ' + posResult.y + ' , ' + posResult.z + ' )'; + console.log('testPosition( new [' + result + '], new [' + original + '] , ' + a + ');'); + }; + + VextMat3DTests.prototype.testAppendScale = function () { + console.log('----------------------------------------------------------------------'); + console.log('testAppendScale'); + var v = new Vector3D(1, 2, 3); + var p = new Vector3D(2, 2, 2); + + var m; + var i; + var r = new Array(16); + + m = new Matrix3D([ + 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1]); + m.copyRawDataTo(r); + m.appendScale(v.x, v.y, v.z); + + this.outputAppendScale(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1]); + + m.copyRawDataTo(r); + m.appendScale(v.x, v.y, v.z); + this.outputAppendScale(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1]); + + m.copyRawDataTo(r); + m.appendScale(v.x, v.y, v.z); + this.outputAppendScale(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1]); + + m.copyRawDataTo(r); + m.appendScale(v.x, v.y, v.z); + this.outputAppendScale(m.rawData, r, v); + + console.log('//------------------------------------------------------------ AS3'); + console.log('private function testAppendScale( result : Vector. , original : Vector. , t : Vector3D )'); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' m.appendScale( t.x , t.y , t.z );'); + console.log(' trace( "TSResult: " , result );'); + console.log(' trace( "ASResult: " , m.rawData );'); + console.log('}'); + }; + + VextMat3DTests.prototype.outputAppendScale = function (result, original, v) { + var a = 'new Vector3D( ' + v.x + ' , ' + v.y + ' , ' + v.z + ' )'; + console.log('testAppendScale( new [' + result + '], new [' + original + '] , ' + a + ');'); + }; + + VextMat3DTests.prototype.testAppendTranslation = function () { + console.log('----------------------------------------------------------------------'); + console.log('testAppendTranslation'); + var v = new Vector3D(1, 2, 3); + var p = new Vector3D(2, 2, 2); + + var m; + var i; + var r = new Array(16); + + m = new Matrix3D([ + 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1]); + m.copyRawDataTo(r); + m.appendTranslation(v.x, v.y, v.z); + + this.outputAppendTranslation(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1]); + + m.copyRawDataTo(r); + m.appendTranslation(v.x, v.y, v.z); + this.outputAppendTranslation(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1]); + + m.copyRawDataTo(r); + m.appendTranslation(v.x, v.y, v.z); + this.outputAppendTranslation(m.rawData, r, v); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1]); + + m.copyRawDataTo(r); + m.appendTranslation(v.x, v.y, v.z); + this.outputAppendTranslation(m.rawData, r, v); + + console.log('//------------------------------------------------------------ AS3'); + console.log('private function testAppendTranslation( result : Vector. , original : Vector. , t : Vector3D )'); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' m.appendTranslation( t.x , t.y , t.z );'); + console.log(' trace( "TSResult: " , result );'); + console.log(' trace( "ASResult: " , m.rawData );'); + console.log('}'); + }; + + VextMat3DTests.prototype.outputAppendTranslation = function (result, original, v) { + var a = 'new Vector3D( ' + v.x + ' , ' + v.y + ' , ' + v.z + ' )'; + console.log('testAppendTranslation( new [' + result + '], new [' + original + '] , ' + a + ');'); + }; + + VextMat3DTests.prototype.testAppendRotation = function () { + console.log('----------------------------------------------------------------------'); + console.log('testAppendRotation'); + + var v = new Vector3D(1, 2, 3); + var p = new Vector3D(2, 2, 2); + + var m; + var i; + var r = new Array(16); + + m = new Matrix3D([ + 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1]); + m.copyRawDataTo(r); + m.appendRotation(90, v); // , p ); + + this.outputAppendRotation(m.rawData, r, v, p); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1]); + + m.copyRawDataTo(r); + m.appendRotation(90, v); //, p ); + this.outputAppendRotation(m.rawData, r, v, p); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1]); + + m.copyRawDataTo(r); + m.appendRotation(90, v); //, p ); + this.outputAppendRotation(m.rawData, r, v, p); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1]); + + m.copyRawDataTo(r); + m.appendRotation(90, v); //, p ); + this.outputAppendRotation(m.rawData, r, v, p); + + console.log('//------------------------------------------------------------ AS3'); + console.log('private function testAppendRotation( result : Vector. , original : Vector. , axis : Vector3D , pivot : Vector3D )'); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' m.appendRotation( 90 , axis , pivot );'); + console.log(' trace( "TSResult: " , result );'); + console.log(' trace( "ASResult: " , m.rawData );'); + console.log('}'); + }; + + VextMat3DTests.prototype.testInvert = function () { + var v = new Vector3D(); + var m; + var i; + var r = new Array(16); + + m = new Matrix3D([ + 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1]); + m.copyRawDataTo(r); + i = m.invert(); + this.outputInvert(i, m.rawData, r); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1]); + + m.copyRawDataTo(r); + i = m.invert(); + this.outputInvert(i, m.rawData, r); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1]); + + m.copyRawDataTo(r); + i = m.invert(); + this.outputInvert(i, m.rawData, r); + }; + + VextMat3DTests.prototype.testCopyRowTo = function () { + var v = new Vector3D(); + var m; + var i; + var r = new Array(16); + + m = new Matrix3D([ + 1, 2, 4, 5, + 6, 7, 8, 9, + 4, 0, 1, 7, + 5, 8, 7, 1]); + + m.copyRowTo(0, v); + console.log(v); + m.copyRowTo(1, v); + console.log(v); + m.copyRowTo(2, v); + console.log(v); + m.copyRowTo(3, v); + console.log(v); + }; + + VextMat3DTests.prototype.testCopyColumnTo = function () { + var v = new Vector3D(); + var m; + var i; + var r = new Array(16); + + m = new Matrix3D([ + 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1]); + + m = new Matrix3D([ + 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 1, 12, + 13, 14, 15, 16]); + + m.copyColumnTo(0, v); + console.log(v.toString()); + m.copyColumnTo(1, v); + console.log(v.toString()); + m.copyColumnTo(2, v); + console.log(v.toString()); + m.copyColumnTo(3, v); + console.log(v.toString()); + + v.w = v.x = v.y = v.z = 0; + m.copyColumnFrom(0, v); + console.log(m.rawData); + v.w = v.x = v.y = v.z = 1; + m.copyColumnFrom(1, v); + console.log(m.rawData); + v.w = v.x = v.y = v.z = 2; + m.copyColumnFrom(2, v); + console.log(m.rawData); + v.w = v.x = v.y = v.z = 3; + m.copyColumnFrom(3, v); + console.log(m.rawData); + }; + + VextMat3DTests.prototype.outputAppendRotation = function (result, original, axis, pivot) { + var a = 'new Vector3D( ' + axis.x + ' , ' + axis.y + ' , ' + axis.z + ' )'; + var p = 'new Vector3D( ' + pivot.x + ' , ' + pivot.y + ' , ' + pivot.z + ' )'; + + console.log('testAppendRotation( new [' + result + '], new [' + original + '] , ' + a + ' , ' + p + ');'); + }; + + VextMat3DTests.prototype.outputInvert = function (success, data, original) { + console.log('testInvert(' + success + ', new [' + data + '], new [' + original + ']);'); + }; + + VextMat3DTests.prototype.output = function (data, result) { + console.log('testDeterminant( new [' + data + '], ' + result + ');'); + }; + + VextMat3DTests.prototype.getRnd = function (max, min) { + return Math.floor(Math.random() * (max - min + 1)) + min; + }; + return VextMat3DTests; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImdlb20vVmV4dE1hdDNEVGVzdHMudHMiXSwibmFtZXMiOlsiVmV4dE1hdDNEVGVzdHMiLCJWZXh0TWF0M0RUZXN0cy5jb25zdHJ1Y3RvciIsIlZleHRNYXQzRFRlc3RzLnRlc3RhcHBlbmQiLCJWZXh0TWF0M0RUZXN0cy50ZXN0cHJlcGVuZFJvdGF0aW9uIiwiVmV4dE1hdDNEVGVzdHMudGVzdGNvcHlUb01hdHJpeDNEIiwiVmV4dE1hdDNEVGVzdHMudGVzdERlY29tcG9zZSIsIlZleHRNYXQzRFRlc3RzLm91dHB1dERlY29tcG9zZSIsIlZleHRNYXQzRFRlc3RzLnRlc3RQb3NpdGlvbiIsIlZleHRNYXQzRFRlc3RzLm91dHB1dFBvc2l0aW9uIiwiVmV4dE1hdDNEVGVzdHMudGVzdEFwcGVuZFNjYWxlIiwiVmV4dE1hdDNEVGVzdHMub3V0cHV0QXBwZW5kU2NhbGUiLCJWZXh0TWF0M0RUZXN0cy50ZXN0QXBwZW5kVHJhbnNsYXRpb24iLCJWZXh0TWF0M0RUZXN0cy5vdXRwdXRBcHBlbmRUcmFuc2xhdGlvbiIsIlZleHRNYXQzRFRlc3RzLnRlc3RBcHBlbmRSb3RhdGlvbiIsIlZleHRNYXQzRFRlc3RzLnRlc3RJbnZlcnQiLCJWZXh0TWF0M0RUZXN0cy50ZXN0Q29weVJvd1RvIiwiVmV4dE1hdDNEVGVzdHMudGVzdENvcHlDb2x1bW5UbyIsIlZleHRNYXQzRFRlc3RzLm91dHB1dEFwcGVuZFJvdGF0aW9uIiwiVmV4dE1hdDNEVGVzdHMub3V0cHV0SW52ZXJ0IiwiVmV4dE1hdDNEVGVzdHMub3V0cHV0IiwiVmV4dE1hdDNEVGVzdHMuZ2V0Um5kIl0sIm1hcHBpbmdzIjoiQUFBQSw0REFBb0U7QUFDcEUsNERBQW9FOztBQUVwRTtJQUdDQTtRQUVDQyxJQUFJQSxDQUFDQSxHQUFZQSxJQUFJQSxRQUFRQSxDQUFLQTtZQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNoQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7WUFDYkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBRUEsQ0FBRUE7O1FBRWhDQSxJQUFJQSxDQUFDQSxHQUFjQSxJQUFJQSxRQUFRQSxDQUFDQSxDQUFDQTs7UUFFakNBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLG1EQUFtREEsQ0FBQ0EsRUFBQ0EsVUFBVUE7O1FBRTNFQSxDQUFDQSxDQUFDQSxZQUFZQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTtRQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxpQkFBaUJBLEVBQUdBLENBQUNBLENBQUVBO1FBQzNEQSxDQUFDQSxDQUFDQSxZQUFZQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTtRQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxpQkFBaUJBLEVBQUdBLENBQUNBLENBQUVBO1FBQzNEQSxDQUFDQSxDQUFDQSxZQUFZQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTtRQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxpQkFBaUJBLEVBQUdBLENBQUNBLENBQUVBO1FBQzNEQSxDQUFDQSxDQUFDQSxZQUFZQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTtRQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxpQkFBaUJBLEVBQUdBLENBQUNBLENBQUVBOztRQUUzREEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsZ0RBQWdEQSxDQUFDQSxFQUFDQSxVQUFVQTs7UUFFeEVBLElBQUlBLENBQUNBLEdBQWNBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBOztRQUVqQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7UUFBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsY0FBY0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7UUFDckRBLENBQUNBLENBQUNBLFNBQVNBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBO1FBQUNBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLGNBQWNBLEVBQUdBLENBQUNBLENBQUVBO1FBQ3JEQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTtRQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxjQUFjQSxFQUFHQSxDQUFDQSxDQUFFQTtRQUNyREEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7UUFBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsY0FBY0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7O1FBRXJEQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxrREFBa0RBLENBQUNBLEVBQUVBLFVBQVVBOztRQUUzRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBRUEsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7O1FBRXBEQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFFQSxDQUFDQSxFQUFHQSxJQUFJQSxRQUFRQSxDQUFFQSxFQUFFQSxFQUFHQSxFQUFFQSxFQUFHQSxFQUFFQSxFQUFHQSxFQUFFQSxDQUFDQSxDQUFFQTtRQUFFQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxnQkFBZ0JBLEVBQUdBLENBQUNBLENBQUNBLE9BQU9BLENBQUVBO1FBQ2pHQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFFQSxDQUFDQSxFQUFHQSxJQUFJQSxRQUFRQSxDQUFFQSxFQUFFQSxFQUFHQSxFQUFFQSxFQUFHQSxFQUFFQSxFQUFJQSxDQUFDQSxDQUFDQSxDQUFFQTtRQUFFQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxnQkFBZ0JBLEVBQUdBLENBQUNBLENBQUNBLE9BQU9BLENBQUVBO1FBQ2pHQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFFQSxDQUFDQSxFQUFHQSxJQUFJQSxRQUFRQSxDQUFHQSxDQUFDQSxFQUFJQSxDQUFDQSxFQUFJQSxDQUFDQSxFQUFJQSxDQUFDQSxDQUFDQSxDQUFFQTtRQUFFQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxnQkFBZ0JBLEVBQUdBLENBQUNBLENBQUNBLE9BQU9BLENBQUVBO1FBQ2pHQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFFQSxDQUFDQSxFQUFHQSxJQUFJQSxRQUFRQSxDQUFHQSxDQUFDQSxFQUFJQSxDQUFDQSxFQUFJQSxDQUFDQSxFQUFJQSxDQUFDQSxDQUFDQSxDQUFFQTtRQUFFQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxnQkFBZ0JBLEVBQUdBLENBQUNBLENBQUNBLE9BQU9BLENBQUVBOztRQUVqR0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EscURBQXFEQSxDQUFDQSxFQUFFQSxVQUFVQTs7UUFFOUVBLENBQUNBLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLENBQUVBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLENBQUNBLENBQUNBOztRQUVwREEsQ0FBQ0EsQ0FBQ0EsY0FBY0EsQ0FBRUEsQ0FBQ0EsRUFBR0EsSUFBSUEsUUFBUUEsQ0FBRUEsRUFBRUEsRUFBR0EsRUFBRUEsRUFBR0EsRUFBRUEsRUFBR0EsRUFBRUEsQ0FBQ0EsQ0FBRUE7UUFBRUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsbUJBQW1CQSxFQUFHQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTtRQUN2R0EsQ0FBQ0EsQ0FBQ0EsY0FBY0EsQ0FBRUEsQ0FBQ0EsRUFBR0EsSUFBSUEsUUFBUUEsQ0FBRUEsRUFBRUEsRUFBR0EsRUFBRUEsRUFBR0EsRUFBRUEsRUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7UUFBRUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsbUJBQW1CQSxFQUFHQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTtRQUN2R0EsQ0FBQ0EsQ0FBQ0EsY0FBY0EsQ0FBRUEsQ0FBQ0EsRUFBR0EsSUFBSUEsUUFBUUEsQ0FBR0EsQ0FBQ0EsRUFBSUEsQ0FBQ0EsRUFBSUEsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7UUFBRUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsbUJBQW1CQSxFQUFHQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTtRQUN2R0EsQ0FBQ0EsQ0FBQ0EsY0FBY0EsQ0FBRUEsQ0FBQ0EsRUFBR0EsSUFBSUEsUUFBUUEsQ0FBR0EsQ0FBQ0EsRUFBSUEsQ0FBQ0EsRUFBSUEsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7UUFBRUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsbUJBQW1CQSxFQUFHQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTs7UUFFdkdBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLDZDQUE2Q0EsQ0FBQ0EsRUFBRUEsVUFBVUE7O1FBRXRFQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFFQTtZQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNyQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7WUFDYkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBRUEsQ0FBRUE7O1FBRTNCQSxJQUFJ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QUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO1lBQ2JBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUVBLENBQUVBOztRQUVuQkEsSUFBSUEsRUFBRUEsR0FBY0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBRUEsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDcEVBLEVBQUVBLENBQUNBLFFBQVFBLENBQUVBLENBQUNBLENBQUVBOztRQUVoQkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsVUFBVUEsRUFBR0EsRUFBRUEsQ0FBQ0EsT0FBT0EsQ0FBRUE7O1FBR3RDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxzREFBc0RBLENBQUNBLEVBQUVBLDZDQUE2Q0E7O1FBRWxIQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFJQTtZQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUN4QkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7WUFDYkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBRUEsQ0FBRUE7O1FBRTFCQSxDQUFDQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFFQSxFQUFFQSxFQUFHQSxFQUFFQSxFQUFHQSxFQUFFQSxFQUFHQSxFQUFFQSxFQUFHQSxFQUFF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QUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFFQSxDQUFFQTs7UUFFdEJBLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLGNBQWNBLEVBQUdBLENBQUNBLENBQUNBLFdBQVdBLENBQUVBOztRQUU3Q0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsNkNBQTZDQSxDQUFDQSxFQUFFQSxvQkFBb0JBOztRQUVoRkEsQ0FBQ0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBRUE7WUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDeEJBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUVBLENBQUVBOztRQUV0QkEsSUFBSUEsQ0FBQ0E7O1FBRUxBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQ2RBLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLFNBQVNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUNBLE9BQU9BLENBQUVBOztRQUV4Q0EsQ0FBQ0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBSUE7WUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDeEJBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO1lBQ2JBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUVBLENBQUVBOztRQUUxQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7UUFDZEEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsU0FBU0EsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBRUE7O1FBRXhDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSx1REFBdURBLENBQUNBLEVBQUVBLFVBQVVBOztRQUVoRkEsQ0FBQ0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBSUE7WUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDeEJBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO1lBQ2JBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUVBLENBQUVBOztRQUUxQkEsSUFBSUEsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBRUE7UUFDL0JBLENBQUNBLENBQUNBLGVBQWVBLENBQUVBLEVBQUVBLEVBQUdBLElBQUlBLENBQUVBOztRQUU5QkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsa0JBQWtCQSxFQUFHQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTs7UUFHN0NBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLHlEQUF5REEsQ0FBQ0EsRUFBRUEsVUFBVUE7O1FBRWxGQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFJQTtZQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUN4QkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7WUFDYkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBRUEsQ0FBRUE7O1FBRTFCQSxDQUFDQSxDQUFDQSxrQkFBa0JBLENBQUVBLENBQUNBLEVBQUdBLEVBQUVBLEVBQUdBLEVBQUVBLENBQUVBOztRQUVuQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEscUJBQXFCQSxFQUFHQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTs7UUFHaERBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLGdEQUFnREEsQ0FBQ0EsRUFBRUEsVUFBVUE7O1FBRXpFQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFJQTtZQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUN4QkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7WUFDYkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBRUEsQ0FBRUE7O1FBRTFCQSxJQUFJQSxNQUFNQSxHQUFnQkEsSUFBSUEsS0FBS0EsQ0FBV0EsQ0FBQ0E7UUFDL0NBLE1BQU1BLENBQUNBLElBQUlBLENBQUdBLElBQUlBLFFBQVFBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBLENBQUVBO1FBQ3pDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFHQSxJQUFJQSxRQUFRQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQSxDQUFFQTtRQUN6Q0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBR0EsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUEsQ0FBRUE7O1FBRXpDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFFQSxNQUFNQSxDQUFFQTs7UUFFckJBLENBQUNBLEdBQUdBLElBQUlBLFFBQVFBLENBQUlBO1lBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ3hCQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNWQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQTtZQUNiQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFFQSxDQUFFQTs7UUFFMUJBLE1BQU1BLEdBQUdBLElBQUlBLEtBQUtBLENBQVdBLENBQUNBO1FBQzlCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFHQSxJQUFJQSxRQUFRQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQSxDQUFFQTtRQUN6Q0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBR0EsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUEsQ0FBRUE7UUFDekNBLE1BQU1BLENBQUNBLElBQUlBLENBQUdBLElBQUlBLFFBQVFBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBLENBQUVBOztRQUV6Q0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBRUEsTUFBTUEsQ0FBRUE7O1FBRXJCQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxZQUFZQSxFQUFHQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTs7UUFHdkNBLE1BQU1BLEdBQUdBLElBQUlBLEtBQUtBLENBQVdBLENBQUNBO1FBQzlCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFHQSxJQUFJQSxRQUFRQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQSxDQUFFQTtRQUN6Q0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBR0EsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUEsQ0FBRUE7UUFDekNBLE1BQU1BLENBQUNBLElBQUlBLENBQUdBLElBQUlBLFFBQVFBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBLENBQUVBOztRQUV6Q0EsSUFBSUEsQ0FBQ0EsR0FBYUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBRUEsTUFBTUEsQ0FBRUE7O1FBRXZDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxtQkFBbUJBLEVBQUdBLENBQUNBLENBQUNBLE9BQU9BLEVBQUdBLENBQUNBLENBQUVBOztRQUVsREEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsdURBQXVEQSxDQUFDQSxFQUFFQSxlQUFlQTs7UUFFckZBLENBQUNBLEdBQUdBLElBQUlBLFFBQVFBLENBQUlBO1lBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ3hCQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNWQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQTtZQUNiQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFFQSxDQUFFQTs7UUFHMUJBLElBQUlBLFFBQVFBLEdBQWNBLENBQUNBLENBQUNBLGVBQWVBLENBQUVBLElBQUlBLFFBQVFBLENBQUVBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLENBQUVBLENBQUNBOztRQUVuRUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsUUFBUUEsQ0FBRUE7O1FBR3ZCQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSx1REFBdURBLENBQUNBLEVBQUVBLGVBQWVBOztRQUVyRkEsQ0FBQ0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBSUE7WUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDL0JBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO1lBQ2JBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUVBLENBQUVBOztRQUVuQkEsSUFBSUEsSUFBSUEsR0FBaUJBLElBQUlBLEtBQUtBLENBQVNBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBO1FBQ2xFQSxJQUFJQSxHQUFHQSxHQUFrQkEsSUFBSUEsS0FBS0EsQ0FBU0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsRUFBQ0EsQ0FBQ0EsQ0FBQ0E7UUFDakRBLENBQUNBLENBQUNBLGdCQUFnQkEsQ0FBRUEsR0FBR0EsRUFBR0EsSUFBSUEsQ0FBRUE7UUFDaENBLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLGlCQUFpQkEsRUFBR0EsSUFBSUEsRUFBR0EsR0FBR0EsQ0FBRUE7O1FBRzdDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxnREFBZ0RBLENBQUNBLEVBQUVBLGVBQWVBOztRQUU5RUEsQ0FBQ0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBSUE7WUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDL0JBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO1lBQ2JBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUVBLENBQUVBOztRQUVuQkEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7UUFDYkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsV0FBV0EsRUFBR0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBRUE7O1FBR3RDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxzREFBc0RBLENBQUNBLEVBQUVBLGlCQUFpQkE7O1FBRXRGQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFJQTtZQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUMvQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7WUFDYkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBRUEsQ0FBRUE7O1FBRW5CQSxxQ0FBcUNBO1FBQ3JDQSwrQ0FBK0NBO1FBRS9DQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSwrQ0FBK0NBLENBQUNBLEVBQUVBLGlCQUFpQkE7O1FBRS9FQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFJQTtZQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUN4QkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7WUFDYkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBRUEsQ0FBRUE7O1FBRTFCQSxJQUFJQSxPQUFPQSxHQUFjQSxJQUFJQSxRQUFRQSxDQUFFQSxDQUFDQSxFQUFHQSxFQUFFQSxFQUFHQSxFQUFFQSxDQUFFQTs7UUFFcERBLENBQUNBLENBQUNBLFFBQVFBLEdBQUdBLE9BQU9BOztRQUVwQkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsY0FBY0EsRUFBR0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBRUE7UUFDekNBLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLGNBQWNBLEVBQUdBLENBQUNBLENBQUNBLFFBQVFBLENBQUVBO0lBQzNDQSxDQUFDQTtJQUVERCxzQ0FBQUE7UUFFQ0UsSUFBSUEsQ0FBQ0EsR0FBY0EsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7UUFDNUNBLElBQUlBLEVBQUVBLEdBQWNBLElBQUlBLFFBQVFBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBO1FBQzdDQSxJQUFJQSxFQUFFQSxHQUFjQSxJQUFJQSxRQUFRQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTs7UUFFN0NBLElBQUlBLENBQUNBLEdBQWFBLElBQUlBLFFBQVFBLENBQUVBO1lBQUlBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBO1lBQy9DQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQTtZQUNiQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQTtZQUNiQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFFQSxDQUFFQTs7UUFFakJBLElBQUlBLENBQUNBLEdBQWFBLElBQUlBLFFBQVFBLENBQUVBO1lBQUlBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ2pDQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQTtZQUNYQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQTtZQUNkQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFFQSxDQUFFQTtRQUMvQkEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBRUEsQ0FBQ0EsQ0FBR0E7O1FBRWRBLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLENBQUNBLENBQUNBLE9BQU9BLENBQUVBO0lBQ3pCQSxDQUFDQTs7SUFHREYsK0NBQUFBO1FBRUNHLElBQUlBLENBQUNBLEdBQWNBLElBQUlBLFFBQVFBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBO1FBQzVDQSxJQUFJQSxFQUFFQSxHQUFjQSxJQUFJQSxRQUFRQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTtRQUM3Q0EsSUFBSUEsRUFBRUEsR0FBY0EsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7O1FBRTdDQSxJQUFJQSxDQUFDQSxHQUFhQSxJQUFJQSxRQUFRQSxDQUFFQTtZQUFJQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQTtZQUMvQ0EsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7WUFDYkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUE7WUFDYkEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBRUEsQ0FBRUE7O1FBRWpCQSxJQUFJQSxDQUFDQSxHQUFhQSxJQUFJQSxRQUFRQSxDQUFFQSxDQUFDQTtRQUNqQ0EsQ0FBQ0EsQ0FBQ0EsZUFBZUEsQ0FBRUEsRUFBRUEsRUFBR0EsQ0FBQ0EsQ0FBRUE7O1FBRTNCQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTtJQUN6QkEsQ0FBQ0E7O0lBR0RILDhDQUFBQTtRQUVDSSxJQUFJQSxDQUFDQSxHQUFjQSxJQUFJQSxRQUFRQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTtRQUM1Q0EsSUFBSUEsRUFBRUEsR0FBY0EsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7UUFDN0NBLElBQUlBLEVBQUVBLEdBQWNBLElBQUlBLFFBQVFBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBOztRQUU3Q0EsSUFBSUEsQ0FBQ0EsR0FBYUEsSUFBSUEsUUFBUUEsQ0FBRUE7WUFBSUEsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0E7WUFDL0NBLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO1lBQ2JBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBO1lBQ2JBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUVBLENBQUVBOztRQUVqQkEsSUFBSUEsQ0FBQ0EsR0FBYUEsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0E7O1FBQ2pDQSx5QkFBeUJBO1FBRXpCQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTtJQUN6QkEsQ0FBQ0E7O0lBRURKLHlDQUFBQTtRQUVDSyxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSx3RUFBd0VBLENBQUNBO1FBQ3RGQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxlQUFlQSxDQUFDQTtRQUM3QkEsSUFBSUEsQ0FBQ0E7UUFDTEEsSUFBSUEsQ0FBQ0E7UUFDTEEsSUFBSUEsQ0FBQ0EsR0FBbUJBLElBQUlBLEtBQUtBLENBQVdBLEVBQUVBLENBQUVBOztRQUVoREEsS0FBTUEsSUFBSUEsQ0FBQ0EsR0FBWUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FDeENBO1lBR0NBLENBQUNBLEdBQUdBLElBQUlBLFFBQVFBLENBQUVBO2dCQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxHQUFHQSxFQUFHQSxHQUFHQSxDQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxHQUFHQSxFQUFHQSxHQUFHQSxDQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxHQUFHQSxFQUFHQSxHQUFHQSxDQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxHQUFHQSxFQUFHQSxHQUFHQSxDQUFFQTtnQkFDeEhBLElBQUlBLENBQUNBLE1BQU1BLENBQUVBLENBQUNBLEdBQUdBLEVBQUdBLEdBQUdBLENBQUVBLEVBQUVBLElBQUlBLENBQUNBLE1BQU1BLENBQUVBLENBQUNBLEdBQUdBLEVBQUdBLEdBQUdBLENBQUVBLEVBQUVBLElBQUlBLENBQUNBLE1BQU1BLENBQUVBLENBQUNBLEdBQUdBLEVBQUdBLEdBQUdBLENBQUVBLEVBQUVBLElBQUlBLENBQUNBLE1BQU1BLENBQUVBLENBQUNBLEdBQUdBLEVBQUdBLEdBQUdBLENBQUVBO2dCQUMxR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBRUEsQ0FBQ0EsR0FBR0EsRUFBR0EsR0FBR0EsQ0FBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBRUEsQ0FBQ0EsR0FBR0EsRUFBR0EsR0FBR0EsQ0FBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBRUEsQ0FBQ0EsR0FBR0EsRUFBR0EsR0FBR0EsQ0FBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBRUEsQ0FBQ0EsR0FBR0EsRUFBR0EsR0FBR0EsQ0FBRUE7Z0JBQzFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxHQUFHQSxFQUFHQSxHQUFHQSxDQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxHQUFHQSxFQUFHQSxHQUFHQSxDQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxHQUFHQSxFQUFHQSxHQUFHQSxDQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxHQUFHQSxFQUFHQSxHQUFHQSxDQUFFQSxDQUFFQSxDQUFFQTs7WUFHdEhBLENBQUNBLENBQUNBLGFBQWFBLENBQUVBLENBQUNBLENBQUVBOztZQUVwQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7WUFDakJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLENBQUNBLE9BQU9BLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBR3REQTs7UUFFREEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0Esb0VBQW9FQSxDQUFDQTtRQUNqRkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsMElBQTBJQSxDQUFFQTtRQUN6SkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FB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SUFBSUEsS0FBS0EsQ0FBV0EsRUFBRUEsQ0FBRUE7O1FBRWhEQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFFQTtZQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUN4QkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBRUEsQ0FBRUE7UUFDdEJBLENBQUNBLENBQUNBLGFBQWFBLENBQUVBLENBQUNBLENBQUVBO1FBQ3BCQSxDQUFDQSxDQUFDQSxRQUFRQSxHQUFHQSxDQUFDQTtRQUNkQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxRQUFRQTtRQUNoQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsRUFBR0EsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBR0E7O1FBRXpDQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFFQTtZQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUN4QkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7UUFDckJBLENBQUNBLENBQUNBLGFBQWFBLENBQUVBLENBQUNBLENBQUVBO1FBQ3BCQSxDQUFDQSxDQUFDQSxRQUFRQSxHQUFHQSxDQUFDQTtRQUNkQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxRQUFRQTtRQUNoQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsRUFBR0EsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBR0E7O1FBRXpDQSxDQUFDQSxHQUFJQSxJQUFJQSxRQUFRQSxDQUFFQTtZQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUN4QkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7UUFDckJBLENBQUNBLENBQUNBLGFBQWFBLENBQUVBLENBQUNBLENBQUVBO1FBQ3BCQSxDQUFDQSxDQUFDQSxRQUFRQSxHQUFHQSxDQUFDQTtRQUNkQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxRQUFRQTtRQUNoQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsRUFBR0EsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBR0E7O1FBRXpDQSxDQUFDQSxHQUFJQSxJQUFJQSxRQUFRQSxDQUFFQTtZQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUN4QkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7UUFDckJBLENBQUNBLENBQUNBLGFBQWFBLENBQUVBLENBQUNBLENBQUVBO1FBQ3BCQSxDQUFDQSxDQUFDQSxRQUFRQSxHQUFHQSxDQUFDQTtRQUNkQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxRQUFRQTtRQUNoQkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsRUFBR0EsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBR0E7O1FBRXpDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxvRUFBb0VBLENBQUNBO1FBQ2pGQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSx1R0FBdUdBLENBQUVBO1FBQ3RIQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUNoQkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0Esa0RBQWtEQSxDQUFDQTtRQUMvREEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EscUJBQXFCQSxDQUFDQTtRQUNsQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0Esb0NBQW9DQSxDQUFDQTtRQUNqREEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EscUNBQXFDQSxDQUFDQTtRQUNsREEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0Esd0NBQXdDQSxDQUFDQTtRQUNyREEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsMEJBQTBCQSxDQUFDQTtRQUN2Q0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7SUFDakJBLENBQUNBOztJQUVEUCwwQ0FBQUEsVUFBc0JBLE1BQWlCQSxFQUFHQSxRQUFtQkEsRUFBR0EsU0FBb0JBO1FBRW5GUSxJQUFJQSxDQUFDQSxHQUFZQSxnQkFBZ0JBLEdBQUdBLFNBQVNBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLEdBQUdBLFNBQVNBLENBQUNBLENBQUNBLEdBQUdBLEtBQUtBLEdBQUdBLFNBQVNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBO1FBQ2xHQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSw4QkFBOEJBLEdBQUdBLE1BQU1BLEdBQUdBLG1CQUFtQkEsR0FBR0EsUUFBUUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBRUE7SUFDNUdBLENBQUNBOztJQUdEUiwyQ0FBQUE7UUFFQ1MsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsd0VBQXdFQSxDQUFDQTtRQUN0RkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsaUJBQWlCQSxDQUFDQTtRQUMvQkEsSUFBSUEsQ0FBQ0EsR0FBY0EsSUFBSUEsUUFBUUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7UUFDNUNBLElBQUlBLENBQUNBLEdBQWNBLElBQUlBLFFBQVFBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLEVBQUdBLENBQUNBLENBQUVBOztRQUU1Q0EsSUFBSUEsQ0FBQ0E7UUFDTEEsSUFBSUEsQ0FBQ0E7UUFDTEEsSUFBSUEsQ0FBQ0EsR0FBbUJBLElBQUlBLEtBQUtBLENBQVdBLEVBQUVBLENBQUVBOztRQUVoREEsQ0FBQ0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBRUE7WUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDL0JBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUVBLENBQUVBO1FBQ2ZBLENBQUNBLENBQUNBLGFBQWFBLENBQUVBLENBQUNBLENBQUVBO1FBQ3BCQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFFQTs7UUFFL0JBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsRUFBR0EsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBR0E7O1FBRTVDQSxDQUFDQSxHQUFHQSxJQUFJQSxRQUFRQSxDQUFFQTtZQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUMvQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0Es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LENBQUNBLEVBQUlBLENBQUNBLENBQUdBOztRQUVsREEsQ0FBQ0EsR0FBR0EsSUFBSUEsUUFBUUEsQ0FBRUE7WUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDL0JBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUVBOztRQUVkQSxDQUFDQSxDQUFDQSxhQUFhQSxDQUFFQSxDQUFDQSxDQUFFQTtRQUNwQkEsQ0FBQ0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFFQTtRQUNyQ0EsSUFBSUEsQ0FBQ0EsdUJBQXVCQSxDQUFDQSxDQUFDQSxDQUFDQSxPQUFPQSxFQUFHQSxDQUFDQSxFQUFHQSxDQUFDQSxDQUFFQTs7UUFFaERBLENBQUNBLEdBQUlBLElBQUlBLFFBQVFBLENBQUVBO1lBQUdBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQy9CQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNWQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNWQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFFQTs7UUFFZEEsQ0FBQ0EsQ0FBQ0EsYUFBYUEsQ0FBRUEsQ0FBQ0EsQ0FBRUE7UUFDcEJBLENBQUNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7UUFDckNBLElBQUlB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QUNWQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFFQTs7UUFFZEEsQ0FBQ0EsQ0FBQ0EsYUFBYUEsQ0FBRUEsQ0FBQ0EsQ0FBRUE7UUFDcEJBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1FBQ2RBLElBQUlBLENBQUNBLFlBQVlBLENBQUVBLENBQUNBLEVBQUdBLENBQUNBLENBQUNBLE9BQU9BLEVBQUdBLENBQUNBLENBQUVBOztRQUV0Q0EsQ0FBQ0EsR0FBSUEsSUFBSUEsUUFBUUEsQ0FBRUE7WUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDaENBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO1lBQ1ZBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUVBOztRQUVkQSxDQUFDQSxDQUFDQSxhQUFhQSxDQUFFQSxDQUFDQSxDQUFFQTtRQUNwQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7UUFDZEEsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsRUFBR0EsQ0FBQ0EsQ0FBRUE7SUFDdkNBLENBQUNBOztJQUVEZCx5Q0FBQUE7UUFFQ2UsSUFBSUEsQ0FBQ0EsR0FBY0EsSUFBSUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7UUFDakNBLElBQUlBLENBQUNBO1FBQ0xBLElBQUlBLENBQUNBO1FBQ0xBLElBQUlBLENBQUNBLEdBQW1CQSxJQUFJQSxLQUFLQSxDQUFXQSxFQUFFQSxDQUFFQTs7UUFFaERBLENBQUNBLEdBQUlBLElBQUlBLFFBQVFBLENBQUVBO1lBQUVBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBO1lBQzNCQSxDQUFDQSxFQUFDQSxDQUFDQSxFQUFDQSxDQUFDQSxFQUFDQSxDQUFDQTtZQUNQQSxDQUFDQSxFQUFDQSxDQUFDQSxFQUFDQSxDQUFDQSxFQUFDQSxDQUFDQTtZQUNQQSxDQUFDQSxFQUFDQSxDQUFDQSxFQUFDQSxDQUFDQSxFQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFVkEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFBR0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBR0EsQ0FBQ0EsQ0FBRUE7UUFDdENBLENBQUNBLENBQUNBLFNBQVNBLENBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1FBQUdBLE9BQU9BLENBQUNBLEdBQUdBLENBQUdBLENBQUNBLENBQUVBO1FBQ3RDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUFHQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFHQSxDQUFDQSxDQUFFQTtRQUN0Q0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFBR0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBR0EsQ0FBQ0EsQ0FBRUE7SUFDdkNBLENBQUNBOztJQUVEZiw0Q0FBQUE7UUFFQ2dCLElBQUlBLENBQUNBLEdBQWNBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBO1FBQ2pDQSxJQUFJQSxDQUFDQTtRQUNMQSxJQUFJQSxDQUFDQTtRQUNMQSxJQUFJQSxDQUFDQSxHQUFtQkEsSUFBSUEsS0FBS0EsQ0FBV0EsRUFBRUEsQ0FBRUE7O1FBRWhEQSxDQUFDQSxHQUFJQSxJQUFJQSxRQUFRQSxDQUFFQTtZQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTtZQUNoQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7WUFDVkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7O1FBR2RBLENBQUNBLEdBQUlBLElBQUlBLFFBQVFBLENBQUVBO1lBQUVBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBLEVBQUNBLENBQUNBO1lBQzNCQSxDQUFDQSxFQUFDQSxDQUFDQSxFQUFDQSxDQUFDQSxFQUFDQSxDQUFDQTtZQUNQQSxDQUFDQSxFQUFDQSxFQUFFQSxFQUFDQSxDQUFDQSxFQUFDQSxFQUFFQTtZQUNUQSxFQUFFQSxFQUFDQSxFQUFFQSxFQUFDQSxFQUFFQSxFQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTs7UUFFZEEsQ0FBQ0EsQ0FBQ0EsWUFBWUEsQ0FBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFBR0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7UUFDbkRBLENBQUNBLENBQUNBLFlBQVlBLENBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO1FBQUdBLE9BQU9BLENBQUNBLEdBQUdBLENBQUdBLENBQUNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUVBO1FBQ3BEQSxDQUFDQSxDQUFDQSxZQUFZQSxDQUFFQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtRQUFHQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFHQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFFQTtRQUNwREEsQ0FBQ0EsQ0FBQ0EsWUFBWUEsQ0FBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7UUFBR0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBR0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBRUE7O1FBRXBEQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUN6QkEsQ0FBQ0EsQ0FBQ0EsY0FBY0EsQ0FBRUEsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBRUE7UUFBRUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBRUE7UUFDcERBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBO1FBQ3pCQSxDQUFDQSxDQUFDQSxjQUFjQSxDQUFFQSxDQUFDQSxFQUFJQSxDQUFDQSxDQUFFQTtRQUFFQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFHQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFFQTtRQUNyREEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7UUFDekJBLENBQUNBLENBQUNBLGNBQWNBLENBQUVBLENBQUNBLEVBQUlBLENBQUNBLENBQUVBO1FBQUVBLE9BQU9BLENBQUNBLEdBQUdBLENBQUdBLENBQUNBLENBQUNBLE9BQU9BLENBQUVBO1FBQ3JEQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtRQUN6QkEsQ0FBQ0EsQ0FBQ0EsY0FBY0EsQ0FBRUEsQ0FBQ0EsRUFBSUEsQ0FBQ0EsQ0FBRUE7UUFBRUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBR0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBRUE7SUFDdERBLENBQUNBOztJQUVEaEIsZ0RBQUFBLFVBQTRCQSxNQUFpQkEsRUFBR0EsUUFBbUJBLEVBQUdBLElBQWVBLEVBQUdBLEtBQWdCQTtRQUV2R2lCLElBQUlBLENBQUNBLEdBQVlBLGdCQUFnQkEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUE7UUFDbkZBLElBQUlBLENBQUNBLEdBQVlBLGdCQUFnQkEsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBR0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUE7O1FBRXRGQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxvQ0FBb0NBLEdBQUdBLE1BQU1BLEdBQUdBLG1CQUFtQkEsR0FBR0EsUUFBUUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsS0FBS0EsR0FBR0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBRUE7SUFDOUhBLENBQUNBOztJQUVEakIsd0NBQUFBLFVBQW9CQSxPQUFpQkEsRUFBR0EsSUFBb0JBLEVBQUdBLFFBQXdCQTtRQUV0RmtCLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLGFBQWFBLEdBQUdBLE9BQU9BLEdBQUdBLGtCQUFrQkEsR0FBR0EsSUFBSUEsR0FBR0EsbUJBQW1CQSxHQUFHQSxRQUFRQSxHQUFHQSxLQUFLQSxDQUFFQTtJQUM1R0EsQ0FBQ0E7O0lBRURsQixrQ0FBQUEsVUFBZUEsSUFBb0JBLEVBQUdBLE1BQWVBO1FBRXBEbUIsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsaUNBQWlDQSxHQUFHQSxJQUFJQSxHQUFHQSxLQUFLQSxHQUFJQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFFQTtJQUNqRkEsQ0FBQ0E7O0lBRURuQixrQ0FBQUEsVUFBZUEsR0FBWUEsRUFBR0EsR0FBWUE7UUFFekNvQixPQUFPQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQTtJQUN6REEsQ0FBQ0E7SUFDRnBCLHNCQUFDQTtBQUFEQSxDQUFDQSxJQUFBO0FBQUEiLCJmaWxlIjoiZ2VvbS9WZXh0TWF0M0RUZXN0cy5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBNYXRyaXgzRFx0XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeDNEXCIpO1xuaW1wb3J0IFZlY3RvcjNEXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vVmVjdG9yM0RcIik7XG5cbmNsYXNzIFZleHRNYXQzRFRlc3RzXG57XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dmFyIG06TWF0cml4M0QgPSBuZXcgTWF0cml4M0QoICAgIFsgMSwgMiwgMywgNCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0NSwgNiwgNywgOCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0OSwgMTAsIDExLCAxMixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0dmFyIHYgOiBWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb3B5Q29sdW1uVG8nKTsvLyBET05FIE9LXG5cblx0XHRtLmNvcHlDb2x1bW5UbyggMCAsIHYgKTtjb25zb2xlLmxvZygnY29weUNvbHVtblRvIDAgJyAsIHYgKTtcblx0XHRtLmNvcHlDb2x1bW5UbyggMSAsIHYgKTtjb25zb2xlLmxvZygnY29weUNvbHVtblRvIDEgJyAsIHYgKTtcblx0XHRtLmNvcHlDb2x1bW5UbyggMiAsIHYgKTtjb25zb2xlLmxvZygnY29weUNvbHVtblRvIDIgJyAsIHYgKTtcblx0XHRtLmNvcHlDb2x1bW5UbyggMyAsIHYgKTtjb25zb2xlLmxvZygnY29weUNvbHVtblRvIDMgJyAsIHYgKTtcblxuXHRcdGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29weVJvd1RvJyk7Ly8gRE9ORSBPS1xuXG5cdFx0dmFyIHIgOiBWZWN0b3IzRCA9IG5ldyBWZWN0b3IzRCgpO1xuXG5cdFx0bS5jb3B5Um93VG8oIDAgLCByICk7Y29uc29sZS5sb2coJ2NvcHlSb3dUbyAwICcgLCByICk7XG5cdFx0bS5jb3B5Um93VG8oIDEgLCByICk7Y29uc29sZS5sb2coJ2NvcHlSb3dUbyAxICcgLCByICk7XG5cdFx0bS5jb3B5Um93VG8oIDIgLCByICk7Y29uc29sZS5sb2coJ2NvcHlSb3dUbyAyICcgLCByICk7XG5cdFx0bS5jb3B5Um93VG8oIDMgLCByICk7Y29uc29sZS5sb2coJ2NvcHlSb3dUbyAzICcgLCByICk7XG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvcHlSb3dGcm9tJyk7IC8vIERPTkUgT0tcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoWyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSk7XG5cblx0XHRtLmNvcHlSb3dGcm9tKCAwICwgbmV3IFZlY3RvcjNEKCAxNiAsIDE1ICwgMTQgLCAxMykgKTsgY29uc29sZS5sb2coJ2NvcHlSb3dGcm9tIDAgJyAsIG0ucmF3RGF0YSApO1xuXHRcdG0uY29weVJvd0Zyb20oIDEgLCBuZXcgVmVjdG9yM0QoIDEyICwgMTEgLCAxMCAsICA5KSApOyBjb25zb2xlLmxvZygnY29weVJvd0Zyb20gMSAnICwgbS5yYXdEYXRhICk7XG5cdFx0bS5jb3B5Um93RnJvbSggMiAsIG5ldyBWZWN0b3IzRCggIDggLCAgNyAsICA2ICwgIDUpICk7IGNvbnNvbGUubG9nKCdjb3B5Um93RnJvbSAyICcgLCBtLnJhd0RhdGEgKTtcblx0XHRtLmNvcHlSb3dGcm9tKCAzICwgbmV3IFZlY3RvcjNEKCAgNCAsICAzICwgIDIgLCAgMSkgKTsgY29uc29sZS5sb2coJ2NvcHlSb3dGcm9tIDMgJyAsIG0ucmF3RGF0YSApO1xuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb3B5Q29sdW1uRnJvbScpOyAvLyBET05FIE9LXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKFsgMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0pO1xuXG5cdFx0bS5jb3B5Q29sdW1uRnJvbSggMCAsIG5ldyBWZWN0b3IzRCggMTYgLCAxNSAsIDE0ICwgMTMpICk7IGNvbnNvbGUubG9nKCdjb3B5Q29sdW1uRnJvbSAwICcgLCBtLnJhd0RhdGEgKTtcblx0XHRtLmNvcHlDb2x1bW5Gcm9tKCAxICwgbmV3IFZlY3RvcjNEKCAxMiAsIDExICwgMTAgLCAgOSkgKTsgY29uc29sZS5sb2coJ2NvcHlDb2x1bW5Gcm9tIDEgJyAsIG0ucmF3RGF0YSApO1xuXHRcdG0uY29weUNvbHVtbkZyb20oIDIgLCBuZXcgVmVjdG9yM0QoICA4ICwgIDcgLCAgNiAsICA1KSApOyBjb25zb2xlLmxvZygnY29weUNvbHVtbkZyb20gMiAnICwgbS5yYXdEYXRhICk7XG5cdFx0bS5jb3B5Q29sdW1uRnJvbSggMyAsIG5ldyBWZWN0b3IzRCggIDQgLCAgMyAsICAyICwgIDEpICk7IGNvbnNvbGUubG9nKCdjb3B5Q29sdW1uRnJvbSAzICcgLCBtLnJhd0RhdGEgKTtcblxuXHRcdGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXBwZW5kJyk7IC8vIERPTkUgT0tcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoIFsgMSwgMiwgMywgNCxcblx0XHRcdFx0XHRcdFx0XHRcdCAgNSwgNiwgNywgOCxcblx0XHRcdFx0XHRcdFx0XHRcdCAgOSwgMTAsIDExLCAxMixcblx0XHRcdFx0XHRcdFx0XHRcdCAgMTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0dmFyIHMgOiBNYXRyaXgzRCA9IG5ldyBNYXRyaXgzRCggWyAgICAxNiAsIDE1ICwgMTQgLCAxMyAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdCAgMTIgLCAxMSAsIDEwICwgIDkgLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQgICA4ICwgIDcgLCAgNiAsICA1ICxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ICAgNCAsICAzICwgIDIgLCAgMSBdICk7XG5cblx0XHRtLmFwcGVuZCggcyApO1xuXG5cdFx0Y29uc29sZS5sb2coJ0FwcGVuZCBSZXN1bHQnICwgbS5yYXdEYXRhICk7XG5cdFx0Y29uc29sZS5sb2coJ0FwcGVuZGVlJyAsICAgICAgcy5yYXdEYXRhICk7XG5cblxuXHRcdGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUHJlcGVuZCcpOyAvLyBET05FIE9LXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCBbICAgMSwgMiwgMywgNCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NSwgNiwgNywgOCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0OSwgMTAsIDExLCAxMixcblx0XHRcdFx0XHRcdFx0XHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0cyA9IG5ldyBNYXRyaXgzRCggWyAgICAxNiAsIDE1ICwgMTQgLCAxMyAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCAxMiAsIDExICwgMTAgLCAgOSAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCA4ICwgIDcgLCAgNiAsICA1ICxcblx0XHRcdFx0XHRcdFx0XHRcdFx0IDQgLCAgMyAsICAyICwgIDEgXSApO1xuXG5cdFx0bS5wcmVwZW5kKCBzICk7XG5cblx0XHRjb25zb2xlLmxvZygnUHJlcGVuZCBSZXN1bHQnICwgbS5yYXdEYXRhICk7XG5cdFx0Y29uc29sZS5sb2coJ1ByZXBlbmRlZScgLCAgICAgIHMucmF3RGF0YSApO1xuXG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFwcGVuZCBUcmFuc2xhdGlvbicpOyAvLyBET05FIE9LXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCBbIDEsIDIsIDMsIDQsXG5cdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0OSwgMTAsIDExLCAxMixcblx0XHRcdDEzLCAxNCwgMTUsIDE2IF0gKTtcblxuXHRcdG0uYXBwZW5kVHJhbnNsYXRpb24oIDUgLCA2ICwgNyApO1xuXHRcdGNvbnNvbGUubG9nKCcgQXBwZW5kIFRyYW5zbGF0aW9uJyAsIG0ucmF3RGF0YSApO1xuXG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFwcGVuZFJvdGF0aW9uJyk7IC8vIERPTkUgT0sgLSBQaXZvdCBnaXZlcyBkaWZmZXJlbnQgcmVzdWx0ICggY29tbWVudGVkIG91dCBmb3Igbm93IClcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoICAgWyAxLCAyLCAzLCA0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQxMywgMTQsIDE1LCAxNiBdICk7XG5cblxuXHRcdHZhciBwaXZvdCA6IFZlY3RvcjNEID0gbmV3IFZlY3RvcjNEICggNyAsIDggLDkgICk7XG5cblx0XHR2YXIgYXhpcyA6IFZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCAwICwgMCAsIDEgKTsgLy8gY2hlY2tlZCBmb3IgeCx5LHo7XG5cdFx0bS5hcHBlbmRSb3RhdGlvbiggNDUgLCBheGlzICk7Ly8sIHBpdm90ICk7XG5cdFx0Y29uc29sZS5sb2coICdhcHBlbmRSb3RhdGlvbicgLCBtLnJhd0RhdGEgKTtcblxuXHRcdGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYXBwZW5kU2NhbGUnKTsgLy8gRE9ORSBPS1xuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggICBbIDEsIDIsIDMsIDQsXG5cdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0OSwgMTAsIDExLCAxMixcblx0XHRcdDEzLCAxNCwgMTUsIDE2IF0gKTtcblxuXHRcdG0uYXBwZW5kU2NhbGUoIDYgLCA3ICwgOCApO1xuXHRcdGNvbnNvbGUubG9nKCAnYXBwZW5kU2NhbGUnICwgbS5yYXdEYXRhICk7XG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByZXBlbnRTY2FsZScpOyAvLyBET05FIE9LXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCAgIFsgMSwgMiwgMywgNCxcblx0XHRcdDUsIDYsIDcsIDgsXG5cdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0bS5wcmVwZW5kU2NhbGUoIDYgLCA3ICwgOCApO1xuXHRcdGNvbnNvbGUubG9nKCAncHJlcGVudFNjYWxlJyAsIG0ucmF3RGF0YSApO1xuXG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNsb25lJyk7IC8vIERPTkUgT0tcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoICAgWyAxLCAyLCAzLCA0LFxuXHRcdFx0NSwgNiwgNywgOCxcblx0XHRcdDksIDEwLCAxMSwgMTIsXG5cdFx0XHQxMywgMTQsIDE1LCAxNiBdICk7XG5cblxuXHRcdGNvbnNvbGUubG9nKCAnY2xvbmUnICwgbS5jbG9uZSgpLnJhd0RhdGEpO1xuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb3B5RnJvbScpOyAvLyBET05FIE9LXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCAgIFsgMSwgMiwgMywgNCxcblx0XHRcdDUsIDYsIDcsIDgsXG5cdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0dmFyIGNsIDogTWF0cml4M0QgPSBuZXcgTWF0cml4M0QoWyAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwXSk7XG5cdFx0Y2wuY29weUZyb20oIG0gKVxuXG5cdFx0Y29uc29sZS5sb2coICdjb3B5RnJvbScgLCBjbC5yYXdEYXRhICk7XG5cblxuXHRcdGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29weVJhd0RhdGFGcm9tJyk7IC8vIERPTkUgb2sgLSBPZmZldCAvIFRyYXNwb3NlIG5vdCBpbXBsZW1lbnRlZFxuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggICBbIDEsIDIsIDMsIDQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDUsIDYsIDcsIDgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDksIDEwLCAxMSwgMTIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDEzLCAxNCwgMTUsIDE2IF0gKTtcblxuXHRcdG0uY29weVJhd0RhdGFGcm9tKFsgMTYgLCAxNSAsIDE0ICwgMTMgLCAxMiAsIDExICwgMTAgLCAgOSAsIDggLCAgNyAsICA2ICwgIDUgLCA0ICwgIDMgLCAgMiAsICAxIF0gKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnY29weVJhd0RhdGFGcm9tJyAsIG0ucmF3RGF0YSApO1xuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb3B5UmF3RGF0YVRvJyk7IC8vIGRvbmUgT0tcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoICAgWyAxLCAyLCAzLCA0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQxMywgMTQsIDE1LCAxNiBdICk7XG5cblx0XHR2YXIgcmVzdWx0IDogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPiggOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5LDksOSw5KTtcblxuXHRcdGNvbnNvbGUubG9nKCAncmVzdWx0Lmxlbmd0aDogJyAsIHJlc3VsdC5sZW5ndGggICk7XG5cblx0XHRtLmNvcHlSYXdEYXRhVG8oIHJlc3VsdCAsIDEgLCB0cnVlICk7XG5cdFx0Y29uc29sZS5sb2coICdyYXdEYXRhJyAsIG0ucmF3RGF0YSApO1xuXHRcdGNvbnNvbGUubG9nKCAnY29weVJhd0RhdGFUbycgLHJlc3VsdCApO1xuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0cmFuc3Bvc2UnKTsgLy8gRE9ORSBvayAtIE9mZmV0IC8gVHJhc3Bvc2Ugbm90IGltcGxlbWVudGVkXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCAgIFsgMSwgMiwgMywgNCxcblx0XHRcdDUsIDYsIDcsIDgsXG5cdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0bS50cmFuc3Bvc2UoKVxuXHRcdGNvbnNvbGUubG9nKCAndHJhbnNwb3NlJyAsIG0ucmF3RGF0YSApO1xuXG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvcHlUb01hdHJpeDNEJyk7IC8vIGRvbmUgb2tcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoICAgWyAxLCAyLCAzLCA0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQxMywgMTQsIDE1LCAxNiBdICk7XG5cblx0XHRzID0gbmV3IE1hdHJpeDNEKCBbICAgIDE2ICwgMTUgLCAxNCAsIDEzICxcblx0XHRcdDEyICwgMTEgLCAxMCAsICA5ICxcblx0XHRcdDggLCAgNyAsICA2ICwgIDUgLFxuXHRcdFx0NCAsICAzICwgIDIgLCAgMSBdICk7XG5cblx0XHRtLmNvcHlUb01hdHJpeDNEKCBzIClcblx0XHRjb25zb2xlLmxvZyggJ2NvcHlUb01hdHJpeDNEJyAsIG0ucmF3RGF0YSApO1xuXG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlY29tcG9zZScpOyAvLy8gTk9UIFdPUktJTkdcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoIFsgMSwgNiwgMCwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdCAgMCwgMSwgMCwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdCAgMCwgMCwgMSwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdCAgMCwgMCwgMCwgMSBdICk7XG5cblx0XHR2YXIgcmVzdWx0RGVjb21wb3NlIDogVmVjdG9yM0RbXSA9IG0uZGVjb21wb3NlKCk7XG5cdFx0Y29uc29sZS5sb2coICdjb3B5VG9NYXRyaXgzRCcgLCByZXN1bHREZWNvbXBvc2VbMF0gKTtcblx0XHRjb25zb2xlLmxvZyggJ2NvcHlUb01hdHJpeDNEJyAsIHJlc3VsdERlY29tcG9zZVsxXSApO1xuXHRcdGNvbnNvbGUubG9nKCAnY29weVRvTWF0cml4M0QnICwgcmVzdWx0RGVjb21wb3NlWzJdICk7XG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRldGVybWluYW50Jyk7IC8vIFdPUktJTkcgb2sgLSBnb29kXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCBbICAgMSwgMiwgMCwgNixcblx0XHRcdFx0XHRcdFx0XHRcdFx0MiwgMSwgMCwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0MCwgMCwgMSwgMyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NiwgMCwgMywgMSBdICk7XG5cblx0XHRjb25zb2xlLmxvZyggJ2RldGVybWluYW50OicgLCBtLmRldGVybWluYW50ICk7XG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCBbICAgMSwgMiwgNSwgNixcblx0XHRcdFx0XHRcdFx0XHRcdFx0MiwgMSwgMCwgOCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NSwgMCwgMSwgMyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NiwgOCwgMywgMSBdICk7XG5cblx0XHRjb25zb2xlLmxvZyggJ2RldGVybWluYW50OicgLCBtLmRldGVybWluYW50ICk7XG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCBbICAgMSwgMCwgMCwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0MCwgMSwgMCwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0MCwgMCwgMSwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0MCwgMCwgMCwgMSBdICk7XG5cblx0XHRjb25zb2xlLmxvZyggJ2RldGVybWluYW50OicgLCBtLmRldGVybWluYW50ICk7XG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGludmVydCcpOyAvLyBXT1JLSU5HIG9rIC0gZ29vZFxuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggWyAgIDEsIDIsIDUsIDYsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDIsIDEsIDAsIDgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDUsIDAsIDEsIDMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDYsIDgsIDMsIDEgXSApO1xuXG5cdFx0dmFyIGIgOiBib29sZWFuO1xuXG5cdFx0YiA9IG0uaW52ZXJ0KCk7XG5cdFx0Y29uc29sZS5sb2coICdpbnZlcnQ6JyAsIGIgLCBtLnJhd0RhdGEgKTtcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoICAgWyAxLCAyLCAzLCA0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQxMywgMTQsIDE1LCAxNiBdICk7XG5cblx0XHRiID0gbS5pbnZlcnQoKTtcblx0XHRjb25zb2xlLmxvZyggJ2ludmVydDonICwgYiAsIG0ucmF3RGF0YSApO1xuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcmVwZW5kIFJvdGF0aW9uJyk7IC8vIE9LIEdvb2RcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoICAgWyAxLCAyLCAzLCA0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQxMywgMTQsIDE1LCAxNiBdICk7XG5cblx0XHRheGlzID0gbmV3IFZlY3RvcjNEKCAxICwgMCAsMCApO1xuXHRcdG0ucHJlcGVuZFJvdGF0aW9uKCA0NSAsIGF4aXMgKTtcblxuXHRcdGNvbnNvbGUubG9nKCAncHJlcGVuZFJvdGF0aW9uOicgLCBtLnJhd0RhdGEgKTtcblxuXG5cdFx0Y29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwZW5kVHJhbnNsYXRpb24nKTsgLy8gT0sgR29vZFxuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggICBbIDEsIDIsIDMsIDQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDUsIDYsIDcsIDgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDksIDEwLCAxMSwgMTIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDEzLCAxNCwgMTUsIDE2IF0gKTtcblxuXHRcdG0ucHJlcGVuZFRyYW5zbGF0aW9uKCA1ICwgMTAgLCAxNSApO1xuXG5cdFx0Y29uc29sZS5sb2coICdwcmVwZW5kVHJhbnNsYXRpb246JyAsIG0ucmF3RGF0YSApO1xuXG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlY29tcG9zZScpOyAvLyBPSyBHb29kXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCAgIFsgMSwgMiwgMywgNCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NSwgNiwgNywgOCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0OSwgMTAsIDExLCAxMixcblx0XHRcdFx0XHRcdFx0XHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0dmFyIHJWZWN0cyA6IFZlY3RvcjNEW10gPSBuZXcgQXJyYXk8VmVjdG9yM0Q+KCk7XG5cdFx0clZlY3RzLnB1c2ggKCBuZXcgVmVjdG9yM0QoIDUgLCAxICwgMyApICk7XG5cdFx0clZlY3RzLnB1c2ggKCBuZXcgVmVjdG9yM0QoIDUgLCAwICwgMSApICk7XG5cdFx0clZlY3RzLnB1c2ggKCBuZXcgVmVjdG9yM0QoIDIgLCAxICwgMyApICk7XG5cblx0XHRtLnJlY29tcG9zZSggclZlY3RzIClcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoICAgWyAxLCAyLCAzLCA0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQxMywgMTQsIDE1LCAxNiBdICk7XG5cblx0XHRyVmVjdHMgPSBuZXcgQXJyYXk8VmVjdG9yM0Q+KCk7XG5cdFx0clZlY3RzLnB1c2ggKCBuZXcgVmVjdG9yM0QoIDEgLCAyICwgOSApICk7XG5cdFx0clZlY3RzLnB1c2ggKCBuZXcgVmVjdG9yM0QoIDMgLCAzICwgMSApICk7XG5cdFx0clZlY3RzLnB1c2ggKCBuZXcgVmVjdG9yM0QoIDggLCAxICwgOCApICk7XG5cblx0XHRtLnJlY29tcG9zZSggclZlY3RzIClcblxuXHRcdGNvbnNvbGUubG9nKCAncmVjb21wb3NlOicgLCBtLnJhd0RhdGEgKTtcblxuXG5cdFx0clZlY3RzID0gbmV3IEFycmF5PFZlY3RvcjNEPigpO1xuXHRcdHJWZWN0cy5wdXNoICggbmV3IFZlY3RvcjNEKCAxICwgMiAsIDkgKSApO1xuXHRcdHJWZWN0cy5wdXNoICggbmV3IFZlY3RvcjNEKCAzICwgMyAsIDEgKSApO1xuXHRcdHJWZWN0cy5wdXNoICggbmV3IFZlY3RvcjNEKCAwICwgMCAsIDAgKSApO1xuXG5cdFx0dmFyIGIgOiBib29sZWFuID0gbS5yZWNvbXBvc2UoIHJWZWN0cyApXG5cblx0XHRjb25zb2xlLmxvZyggJ2ZhaWwgLSByZWNvbXBvc2U6JyAsIG0ucmF3RGF0YSAsIGIgKTtcblxuXHRcdGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHJhbnNmb3JtVmVjdG9yICcpOyAvLyBJVCBXT1JLUyAhISFcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoICAgWyAxLCAyLCAzLCA0LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQxMywgMTQsIDE1LCAxNiBdICk7XG5cblxuXHRcdHZhciB0VlJlc3VsdCA6IFZlY3RvcjNEID0gbS50cmFuc2Zvcm1WZWN0b3IoIG5ldyBWZWN0b3IzRCggMSwyLDMgKSk7XG5cblx0XHRjb25zb2xlLmxvZyggdFZSZXN1bHQgKVxuXG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRyYW5zZm9ybVZlY3RvciAnKTsgLy8gSVQgV09SS1MgISEhXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCAgIFsgMSwgMiwgMywgNCxcblx0XHRcdDUsIDYsIDcsIDgsXG5cdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0dmFyIHZvdXQgICAgOiBudW1iZXJbXSA9IG5ldyBBcnJheTxudW1iZXI+KDAgLCAxICwgMiAsIDMgLCA0ICwgNSApO1xuXHRcdHZhciB2aW4gICAgIDogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPig0LDUsNik7XG5cdFx0bS50cmFuc2Zvcm1WZWN0b3JzKCB2aW4gLCB2b3V0ICk7XG5cdFx0Y29uc29sZS5sb2coICd0cmFuc2Zvcm1WZWN0b3InICwgdm91dCAsIHZpbiApXG5cblxuXHRcdGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHJhbnNwb3NlJyk7IC8vIElUIFdPUktTICEhIVxuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggICBbIDEsIDIsIDMsIDQsXG5cdFx0XHQ1LCA2LCA3LCA4LFxuXHRcdFx0OSwgMTAsIDExLCAxMixcblx0XHRcdDEzLCAxNCwgMTUsIDE2IF0gKTtcblxuXHRcdG0udHJhbnNwb3NlKCk7XG5cdFx0Y29uc29sZS5sb2coICd0cmFuc3Bvc2UnICwgbS5yYXdEYXRhICk7XG5cblxuXHRcdGNvbnNvbGUubG9nKCctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2V0QXhpc1JvdGF0aW9uJyk7IC8vIGludGVybmFsIGNsYXNzXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCAgIFsgMSwgMiwgMywgNCxcblx0XHRcdDUsIDYsIDcsIDgsXG5cdFx0XHQ5LCAxMCwgMTEsIDEyLFxuXHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXG5cdFx0Ly9tLmdldEF4aXNSb3RhdGlvbig0ICwgNSAsIDYgLCA5MCApO1xuXHRcdC8vY29uc29sZS5sb2coICdnZXRBeGlzUm90YXRpb24nICwgbS5yYXdEYXRhICk7XG5cblx0XHRjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBvc2l0aW9uJyk7IC8vIGludGVybmFsIGNsYXNzXG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCAgIFsgMSwgMiwgMywgNCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NSwgNiwgNywgOCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0OSwgMTAsIDExLCAxMixcblx0XHRcdFx0XHRcdFx0XHRcdFx0MTMsIDE0LCAxNSwgMTYgXSApO1xuXHRcdFxuXHRcdHZhciBwb3NWZWN0IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDUgLCAxMCAsIDE1ICk7XG5cblx0XHRtLnBvc2l0aW9uID0gcG9zVmVjdDtcblxuXHRcdGNvbnNvbGUubG9nKCAnc2V0IHBvc2l0aW9uJyAsIG0ucmF3RGF0YSApO1xuXHRcdGNvbnNvbGUubG9nKCAnZ2V0IHBvc2l0aW9uJyAsIG0ucG9zaXRpb24gKTtcblx0fVxuXG5cdHB1YmxpYyB0ZXN0YXBwZW5kKCkgOiB2b2lkXG5cdHtcblx0XHR2YXIgdiA6IFZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCAwICwgMSAsIDEgKVxuXHRcdHZhciB2MSA6IFZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCAxICwgMCAsIDEgKVxuXHRcdHZhciB2MiA6IFZlY3RvcjNEID0gbmV3IFZlY3RvcjNEKCA3ICwgOCAsIDAgKVxuXG5cdFx0dmFyIHQgOiBNYXRyaXgzRD0gbmV3IE1hdHJpeDNEKCBbICAgMCwgMTAsIDEwLCAxLFxuXHRcdFx0MTAsIDUsIDEwLCAxMCxcblx0XHRcdDEwLCAxMCwgNSwgMTAsXG5cdFx0XHQxLCAxMCwgMTAsIDAgXSApO1xuXG5cdFx0dmFyIGQgOiBNYXRyaXgzRD0gbmV3IE1hdHJpeDNEKCBbICAgMSwgNTAsIDEsIDgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDIsIDUsIDEyLCA5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQzMCwgMTYsIDM1LCAxMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0NCwgMTgsIDQwLCAxMSBdICk7XG5cdFx0dC5hcHBlbmQoIGQgIClcblxuXHRcdGNvbnNvbGUubG9nKCB0LnJhd0RhdGEgKTtcblx0fVxuXG5cblx0cHVibGljIHRlc3RwcmVwZW5kUm90YXRpb24oKSA6IHZvaWRcblx0e1xuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDAgLCAxICwgMSApXG5cdFx0dmFyIHYxIDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDEgLCAwICwgMSApXG5cdFx0dmFyIHYyIDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDcgLCA4ICwgMCApXG5cblx0XHR2YXIgdCA6IE1hdHJpeDNEPSBuZXcgTWF0cml4M0QoIFsgICAwLCAxMCwgMTAsIDEsXG5cdFx0XHQxMCwgNSwgMTAsIDEwLFxuXHRcdFx0MTAsIDEwLCA1LCAxMCxcblx0XHRcdDEsIDEwLCAxMCwgMCBdICk7XG5cblx0XHR2YXIgZCA6IE1hdHJpeDNEPSBuZXcgTWF0cml4M0QoICk7XG5cdFx0dC5wcmVwZW5kUm90YXRpb24oIDkwICwgdiApLy8sIHYxICApXG5cblx0XHRjb25zb2xlLmxvZyggdC5yYXdEYXRhICk7XG5cdH1cblxuXG5cdHB1YmxpYyB0ZXN0Y29weVRvTWF0cml4M0QoKSA6IHZvaWRcblx0e1xuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDAgLCAyICwgMyApXG5cdFx0dmFyIHYxIDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDQgLCAwICwgNiApXG5cdFx0dmFyIHYyIDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDcgLCA4ICwgMCApXG5cblx0XHR2YXIgdCA6IE1hdHJpeDNEPSBuZXcgTWF0cml4M0QoIFsgICAwLCAxMCwgMTAsIDEsXG5cdFx0XHQxMCwgNSwgMTAsIDEwLFxuXHRcdFx0MTAsIDEwLCA1LCAxMCxcblx0XHRcdDEsIDEwLCAxMCwgMCBdICk7XG5cblx0XHR2YXIgZCA6IE1hdHJpeDNEPSBuZXcgTWF0cml4M0QoICk7XG5cdFx0Ly90LmNvcHlUb01hdHJpeDNEKCBkICkgO1xuXG5cdFx0Y29uc29sZS5sb2coIGQucmF3RGF0YSApO1xuXHR9XG5cblx0cHVibGljIHRlc3REZWNvbXBvc2UoKSA6IHZvaWRcblx0e1xuXHRcdGNvbnNvbGUubG9nKCAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuXHRcdGNvbnNvbGUubG9nKCAndGVzdERlY29tcG9zZScpO1xuXHRcdHZhciB2IDogVmVjdG9yM0RbXSA7XG5cdFx0dmFyIG06IE1hdHJpeDNEO1xuXHRcdHZhciByIDogQXJyYXk8bnVtYmVyPiA9IG5ldyBBcnJheTxudW1iZXI+ICggMTYgKSA7XG5cblx0XHRmb3IgKCB2YXIgYyA6IG51bWJlciA9IDAgOyBjIDwgMTAgOyBjICsrIClcblx0XHR7XG5cblxuXHRcdFx0bSA9IG5ldyBNYXRyaXgzRCggWyAgIHRoaXMuZ2V0Um5kKCAtMTAwICwgMTAwICksIHRoaXMuZ2V0Um5kKCAtMTAwICwgMTAwICksIHRoaXMuZ2V0Um5kKCAtMTAwICwgMTAwICksIHRoaXMuZ2V0Um5kKCAtMTAwICwgMTAwICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5nZXRSbmQoIC0xMDAgLCAxMDAgKSwgdGhpcy5nZXRSbmQoIC0xMDAgLCAxMDAgKSwgdGhpcy5nZXRSbmQoIC0xMDAgLCAxMDAgKSwgdGhpcy5nZXRSbmQoIC0xMDAgLCAxMDAgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLmdldFJuZCggLTEwMCAsIDEwMCApLCB0aGlzLmdldFJuZCggLTEwMCAsIDEwMCApLCB0aGlzLmdldFJuZCggLTEwMCAsIDEwMCApLCB0aGlzLmdldFJuZCggLTEwMCAsIDEwMCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuZ2V0Um5kKCAtMTAwICwgMTAwICksIHRoaXMuZ2V0Um5kKCAtMTAwICwgMTAwICksIHRoaXMuZ2V0Um5kKCAtMTAwICwgMTAwICksIHRoaXMuZ2V0Um5kKCAtMTAwICwgMTAwICkgXSApO1xuXG5cblx0XHRcdG0uY29weVJhd0RhdGFUbyggciApO1xuXG5cdFx0XHR2ID0gbS5kZWNvbXBvc2UoKTtcblx0XHRcdHRoaXMub3V0cHV0RGVjb21wb3NlKG0ucmF3RGF0YSAsIHIgLCB2WzBdLCB2WzFdLCB2WzJdKTtcblxuXG5cdFx0fVxuXG5cdFx0Y29uc29sZS5sb2coJy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFTMycpO1xuXHRcdGNvbnNvbGUubG9nKCAncHJpdmF0ZSBmdW5jdGlvbiB0ZXN0RGVjb21wb3NlKCByZXN1bHQgOiBWZWN0b3IuPE51bWJlcj4gLCBvcmlnaW5hbCA6IFZlY3Rvci48TnVtYmVyPiAsIGExIDogVmVjdG9yM0QgLCBhMiA6IFZlY3RvcjNEICAsIGEzIDogVmVjdG9yM0QgKScgKTtcblx0XHRjb25zb2xlLmxvZygneycpO1xuXHRcdGNvbnNvbGUubG9nKCcgICAgdmFyIG0gXHRcdDogTWF0cml4M0QgPSBuZXcgTWF0cml4M0QoIG9yaWdpbmFsICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICB2YXIgcmVzdWx0IFx0OiBWZWN0b3IuPFZlY3RvcjNEPiA9IG0uZGVjb21wb3NlKCk7Jyk7XG5cdFx0Y29uc29sZS5sb2coXCIgICB0cmFjZSgnMC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcIik7XG5cdFx0Y29uc29sZS5sb2coXCIgICB0cmFjZSggclswXSlcIik7XG5cdFx0Y29uc29sZS5sb2coXCIgICB0cmFjZSggYTEgKVwiKTtcblx0XHRjb25zb2xlLmxvZyhcIiAgIHRyYWNlKCcxLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcIik7XG5cdFx0Y29uc29sZS5sb2coXCIgICB0cmFjZSggclsxXSlcIik7XG5cdFx0Y29uc29sZS5sb2coXCIgICB0cmFjZSggYTIgKVwiKTtcblx0XHRjb25zb2xlLmxvZyhcIiAgIHRyYWNlKCcyLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcIik7XG5cdFx0Y29uc29sZS5sb2coXCIgICB0cmFjZSggclsyXSlcIik7XG5cdFx0Y29uc29sZS5sb2coXCIgICB0cmFjZSggYTMgKVwiKTtcblx0XHRjb25zb2xlLmxvZyhcIiAgIHRyYWNlKCctLS0tLS0tLS0tLS0tLS0tLS0tLScpO1wiKTtcblx0XHRjb25zb2xlLmxvZyhcIiAgIHRyYWNlKCAnVFNSZXN1bHQ6ICcgLCByZXN1bHQgKTtcIik7XG5cdFx0Y29uc29sZS5sb2coXCIgICB0cmFjZSggJ0FTUmVzdWx0OiAnICwgbS5yYXdEYXRhICk7XCIpO1xuXHRcdGNvbnNvbGUubG9nKFwiICAgdHJhY2UoICdvcmlnaW5hbDogJyAsIG9yaWdpbmFsICk7XCIpO1xuXHRcdGNvbnNvbGUubG9nKFwiICAgdHJhY2UoJy0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XCIpO1xuXHRcdGNvbnNvbGUubG9nKCd9Jyk7XG5cdH1cblxuXHRwdWJsaWMgb3V0cHV0RGVjb21wb3NlKHJlc3VsdCA6IG51bWJlcltdICwgb3JpZ2luYWwgOiBudW1iZXJbXSAsIGExIDogVmVjdG9yM0QgLCBhMiA6IFZlY3RvcjNEICwgYTMgOiBWZWN0b3IzRClcblx0e1xuXHRcdHZhciBzMSA6IHN0cmluZyA9ICduZXcgVmVjdG9yM0QoICcgKyBhMS54ICsgJyAsICcgKyBhMS55ICsgJyAsICcgKyBhMS56ICsgJyApJztcblx0XHR2YXIgczIgOiBzdHJpbmcgPSAnbmV3IFZlY3RvcjNEKCAnICsgYTIueCArICcgLCAnICsgYTIueSArICcgLCAnICsgYTIueiArICcgKSc7XG5cdFx0dmFyIHMzIDogc3RyaW5nID0gJ25ldyBWZWN0b3IzRCggJyArIGEzLnggKyAnICwgJyArIGEzLnkgKyAnICwgJyArIGEzLnogKyAnICknO1xuXHRcdFxuXHRcdGNvbnNvbGUubG9nKCAndGVzdERlY29tcG9zZSggbmV3IDxOdW1iZXI+IFsnICsgcmVzdWx0ICsgJ10sIG5ldyA8TnVtYmVyPiBbJyArIG9yaWdpbmFsICsgJ10gLCAnICsgczEgKyAnICwgJysgczIgKyAnICwgJyArIHMzICsgJyApOycgKSA7XG5cdH1cblxuXHRwdWJsaWMgdGVzdFBvc2l0aW9uKCkgOiB2b2lkXG5cdHtcblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblx0XHRjb25zb2xlLmxvZyggJ3Rlc3RQb3NpdGlvbicpO1xuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDEgLCAyICwgMyApO1xuXHRcdHZhciBwIDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDIgLCAyICwgMiApO1xuXHRcdHZhciBwb3MgOiBWZWN0b3IzRDtcblxuXHRcdHZhciBtOiBNYXRyaXgzRDtcblx0XHR2YXIgaSA6IGJvb2xlYW47XG5cdFx0dmFyIHIgOiBBcnJheTxudW1iZXI+ID0gbmV3IEFycmF5PG51bWJlcj4gKCAxNiApIDtcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoIFsgICAxLCAyLCA0LCA1LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQyLCAxLCAwLCA4LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ0LCAwLCAxLCA3LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCA4LCA3LCAxIF0gKTtcblx0XHRtLmNvcHlSYXdEYXRhVG8oIHIgKTtcblx0XHRtLnBvc2l0aW9uID0gdjtcblx0XHRwb3MgPSBtLnBvc2l0aW9uO1xuXHRcdHRoaXMub3V0cHV0UG9zaXRpb24obS5yYXdEYXRhICwgciAgLCB2ICApO1xuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggWyAgIDEsIDAsIDQsIDUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDAsIDEsIDgsIDAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDQsIDgsIDEsIDcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDUsIDAsIDcsIDFdICk7XG5cdFx0bS5jb3B5UmF3RGF0YVRvKCByICk7XG5cdFx0bS5wb3NpdGlvbiA9IHY7XG5cdFx0cG9zID0gbS5wb3NpdGlvbjtcblx0XHR0aGlzLm91dHB1dFBvc2l0aW9uKG0ucmF3RGF0YSAsIHIgICwgdiAgKTtcblxuXHRcdG0gID0gbmV3IE1hdHJpeDNEKCBbICAxLCAwLCA0LCA1LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQwLCAxLCA4LCAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ0LCA4LCAxLCAyLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCAwLCAyLCAxXSApO1xuXHRcdG0uY29weVJhd0RhdGFUbyggciApO1xuXHRcdG0ucG9zaXRpb24gPSB2O1xuXHRcdHBvcyA9IG0ucG9zaXRpb247XG5cdFx0dGhpcy5vdXRwdXRQb3NpdGlvbihtLnJhd0RhdGEgLCByICAsIHYgICk7XG5cblx0XHRtICA9IG5ldyBNYXRyaXgzRCggWyAgMSwgMCwgNCwgNSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0MCwgMSwgOCwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NCwgOCwgMSwgMSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NSwgMCwgMSwgMV0gKTtcblx0XHRtLmNvcHlSYXdEYXRhVG8oIHIgKTtcblx0XHRtLnBvc2l0aW9uID0gdjtcblx0XHRwb3MgPSBtLnBvc2l0aW9uO1xuXHRcdHRoaXMub3V0cHV0UG9zaXRpb24obS5yYXdEYXRhICwgciAgLCB2ICApO1xuXG5cdFx0Y29uc29sZS5sb2coJy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFTMycpO1xuXHRcdGNvbnNvbGUubG9nKCAncHJpdmF0ZSBmdW5jdGlvbiB0ZXN0UG9zaXRpb24oIHJlc3VsdCA6IFZlY3Rvci48TnVtYmVyPiAsIG9yaWdpbmFsIDogVmVjdG9yLjxOdW1iZXI+ICwgdCA6IFZlY3RvcjNEICknICk7XG5cdFx0Y29uc29sZS5sb2coJ3snKTtcblx0XHRjb25zb2xlLmxvZygnICAgIHZhciBtIDogTWF0cml4M0QgPSBuZXcgTWF0cml4M0QoIG9yaWdpbmFsICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICBtLnBvc2l0aW9uID0gdDsnKTtcblx0XHRjb25zb2xlLmxvZygnICAgIHZhciBwIDogVmVjdG9yM0QgPSBtLnBvc2l0aW9uOycpO1xuXHRcdGNvbnNvbGUubG9nKCcgICAgdHJhY2UoIFwiVFNSZXN1bHQ6IFwiICwgcmVzdWx0ICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICB0cmFjZSggXCJBU1Jlc3VsdDogXCIgLCBtLnJhd0RhdGEgKTsnKTtcblx0XHRjb25zb2xlLmxvZygnICAgIHRyYWNlKCBcIlBvczogXCIgLHAgKTsnKTtcblx0XHRjb25zb2xlLmxvZygnfScpO1xuXHR9XG5cdFxuXHRwdWJsaWMgb3V0cHV0UG9zaXRpb24ocmVzdWx0IDogbnVtYmVyW10gLCBvcmlnaW5hbCA6IG51bWJlcltdICwgcG9zUmVzdWx0IDogVmVjdG9yM0QgKVxuXHR7XG5cdFx0dmFyIGEgOiBzdHJpbmcgPSAnbmV3IFZlY3RvcjNEKCAnICsgcG9zUmVzdWx0LnggKyAnICwgJyArIHBvc1Jlc3VsdC55ICsgJyAsICcgKyBwb3NSZXN1bHQueiArICcgKSc7XG5cdFx0Y29uc29sZS5sb2coICd0ZXN0UG9zaXRpb24oIG5ldyA8TnVtYmVyPiBbJyArIHJlc3VsdCArICddLCBuZXcgPE51bWJlcj4gWycgKyBvcmlnaW5hbCArICddICwgJyArIGEgKyAnKTsnICkgO1xuXHR9XG5cblxuXHRwdWJsaWMgdGVzdEFwcGVuZFNjYWxlKCkgOiB2b2lkXG5cdHtcblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblx0XHRjb25zb2xlLmxvZyggJ3Rlc3RBcHBlbmRTY2FsZScpO1xuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDEgLCAyICwgMyApO1xuXHRcdHZhciBwIDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDIgLCAyICwgMiApO1xuXG5cdFx0dmFyIG06IE1hdHJpeDNEO1xuXHRcdHZhciBpIDogYm9vbGVhbjtcblx0XHR2YXIgciA6IEFycmF5PG51bWJlcj4gPSBuZXcgQXJyYXk8bnVtYmVyPiAoIDE2ICkgO1xuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggWyAgIDEsIDIsIDQsIDUsXG5cdFx0XHQyLCAxLCAwLCA4LFxuXHRcdFx0NCwgMCwgMSwgNyxcblx0XHRcdDUsIDgsIDcsIDEgXSApO1xuXHRcdG0uY29weVJhd0RhdGFUbyggciApO1xuXHRcdG0uYXBwZW5kU2NhbGUodi54ICwgdi55ICwgdi56ICkgO1xuXG5cdFx0dGhpcy5vdXRwdXRBcHBlbmRTY2FsZShtLnJhd0RhdGEgLCByICAsIHYgICk7XG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCBbICAgMSwgMCwgNCwgNSxcblx0XHRcdDAsIDEsIDgsIDAsXG5cdFx0XHQ0LCA4LCAxLCA3LFxuXHRcdFx0NSwgMCwgNywgMV0gKTtcblxuXHRcdG0uY29weVJhd0RhdGFUbyggciApXG5cdFx0bS5hcHBlbmRTY2FsZSh2LnggLCB2LnkgLCB2LnogKSA7XG5cdFx0dGhpcy5vdXRwdXRBcHBlbmRTY2FsZShtLnJhd0RhdGEgLCByICwgdiApO1xuXG5cdFx0bSAgPSBuZXcgTWF0cml4M0QoIFsgIDEsIDAsIDQsIDUsXG5cdFx0XHQwLCAxLCA4LCAwLFxuXHRcdFx0NCwgOCwgMSwgMixcblx0XHRcdDUsIDAsIDIsIDFdICk7XG5cblx0XHRtLmNvcHlSYXdEYXRhVG8oIHIgKVxuXHRcdG0uYXBwZW5kU2NhbGUodi54ICwgdi55ICwgdi56ICkgO1xuXHRcdHRoaXMub3V0cHV0QXBwZW5kU2NhbGUobS5yYXdEYXRhICwgciAsIHYgICk7XG5cblx0XHRtICA9IG5ldyBNYXRyaXgzRCggWyAgMSwgMCwgNCwgNSxcblx0XHRcdDAsIDEsIDgsIDAsXG5cdFx0XHQ0LCA4LCAxLCAxLFxuXHRcdFx0NSwgMCwgMSwgMV0gKTtcblxuXHRcdG0uY29weVJhd0RhdGFUbyggciApXG5cdFx0bS5hcHBlbmRTY2FsZSh2LnggLCB2LnkgLCB2LnogKSA7XG5cdFx0dGhpcy5vdXRwdXRBcHBlbmRTY2FsZShtLnJhd0RhdGEgLCByLCB2ICApO1xuXG5cdFx0Y29uc29sZS5sb2coJy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFTMycpO1xuXHRcdGNvbnNvbGUubG9nKCAncHJpdmF0ZSBmdW5jdGlvbiB0ZXN0QXBwZW5kU2NhbGUoIHJlc3VsdCA6IFZlY3Rvci48TnVtYmVyPiAsIG9yaWdpbmFsIDogVmVjdG9yLjxOdW1iZXI+ICwgdCA6IFZlY3RvcjNEICknICk7XG5cdFx0Y29uc29sZS5sb2coJ3snKTtcblx0XHRjb25zb2xlLmxvZygnICAgIHZhciBtIDogTWF0cml4M0QgPSBuZXcgTWF0cml4M0QoIG9yaWdpbmFsICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICBtLmFwcGVuZFNjYWxlKCB0LnggLCB0LnkgLCB0LnogKTsnKTtcblx0XHRjb25zb2xlLmxvZygnICAgIHRyYWNlKCBcIlRTUmVzdWx0OiBcIiAsIHJlc3VsdCApOycpO1xuXHRcdGNvbnNvbGUubG9nKCcgICAgdHJhY2UoIFwiQVNSZXN1bHQ6IFwiICwgbS5yYXdEYXRhICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJ30nKTtcblx0fVxuXG5cblx0cHVibGljIG91dHB1dEFwcGVuZFNjYWxlKHJlc3VsdCA6IG51bWJlcltdICwgb3JpZ2luYWwgOiBudW1iZXJbXSAsIHYgOiBWZWN0b3IzRCApXG5cdHtcblx0XHR2YXIgYSA6IHN0cmluZyA9ICduZXcgVmVjdG9yM0QoICcgKyB2LnggKyAnICwgJyArIHYueSArICcgLCAnICsgdi56ICsgJyApJztcblx0XHRjb25zb2xlLmxvZyggJ3Rlc3RBcHBlbmRTY2FsZSggbmV3IDxOdW1iZXI+IFsnICsgcmVzdWx0ICsgJ10sIG5ldyA8TnVtYmVyPiBbJyArIG9yaWdpbmFsICsgJ10gLCAnICsgYSArICcpOycgKSA7XG5cdH1cblxuXHRwdWJsaWMgdGVzdEFwcGVuZFRyYW5zbGF0aW9uKCkgOiB2b2lkXG5cdHtcblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblx0XHRjb25zb2xlLmxvZyggJ3Rlc3RBcHBlbmRUcmFuc2xhdGlvbicpO1xuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDEgLCAyICwgMyApO1xuXHRcdHZhciBwIDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDIgLCAyICwgMiApO1xuXG5cdFx0dmFyIG06IE1hdHJpeDNEO1xuXHRcdHZhciBpIDogYm9vbGVhbjtcblx0XHR2YXIgciA6IEFycmF5PG51bWJlcj4gPSBuZXcgQXJyYXk8bnVtYmVyPiAoIDE2ICkgO1xuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggWyAgIDEsIDIsIDQsIDUsXG5cdFx0XHQyLCAxLCAwLCA4LFxuXHRcdFx0NCwgMCwgMSwgNyxcblx0XHRcdDUsIDgsIDcsIDEgXSApO1xuXHRcdG0uY29weVJhd0RhdGFUbyggciApO1xuXHRcdG0uYXBwZW5kVHJhbnNsYXRpb24odi54ICwgdi55ICwgdi56ICkgO1xuXG5cdFx0dGhpcy5vdXRwdXRBcHBlbmRUcmFuc2xhdGlvbihtLnJhd0RhdGEgLCByICAsIHYgICk7XG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCBbICAgMSwgMCwgNCwgNSxcblx0XHRcdDAsIDEsIDgsIDAsXG5cdFx0XHQ0LCA4LCAxLCA3LFxuXHRcdFx0NSwgMCwgNywgMV0gKTtcblxuXHRcdG0uY29weVJhd0RhdGFUbyggciApXG5cdFx0bS5hcHBlbmRUcmFuc2xhdGlvbih2LnggLCB2LnkgLCB2LnogKSA7XG5cdFx0dGhpcy5vdXRwdXRBcHBlbmRUcmFuc2xhdGlvbihtLnJhd0RhdGEgLCByICwgdiApO1xuXG5cdFx0bSAgPSBuZXcgTWF0cml4M0QoIFsgIDEsIDAsIDQsIDUsXG5cdFx0XHQwLCAxLCA4LCAwLFxuXHRcdFx0NCwgOCwgMSwgMixcblx0XHRcdDUsIDAsIDIsIDFdICk7XG5cblx0XHRtLmNvcHlSYXdEYXRhVG8oIHIgKVxuXHRcdG0uYXBwZW5kVHJhbnNsYXRpb24odi54ICwgdi55ICwgdi56ICkgO1xuXHRcdHRoaXMub3V0cHV0QXBwZW5kVHJhbnNsYXRpb24obS5yYXdEYXRhICwgciAsIHYgICk7XG5cblx0XHRtICA9IG5ldyBNYXRyaXgzRCggWyAgMSwgMCwgNCwgNSxcblx0XHRcdDAsIDEsIDgsIDAsXG5cdFx0XHQ0LCA4LCAxLCAxLFxuXHRcdFx0NSwgMCwgMSwgMV0gKTtcblxuXHRcdG0uY29weVJhd0RhdGFUbyggciApXG5cdFx0bS5hcHBlbmRUcmFuc2xhdGlvbih2LnggLCB2LnkgLCB2LnogKSA7XG5cdFx0dGhpcy5vdXRwdXRBcHBlbmRUcmFuc2xhdGlvbihtLnJhd0RhdGEgLCByLCB2ICApO1xuXG5cdFx0Y29uc29sZS5sb2coJy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEFTMycpO1xuXHRcdGNvbnNvbGUubG9nKCAncHJpdmF0ZSBmdW5jdGlvbiB0ZXN0QXBwZW5kVHJhbnNsYXRpb24oIHJlc3VsdCA6IFZlY3Rvci48TnVtYmVyPiAsIG9yaWdpbmFsIDogVmVjdG9yLjxOdW1iZXI+ICwgdCA6IFZlY3RvcjNEICknICk7XG5cdFx0Y29uc29sZS5sb2coJ3snKTtcblx0XHRjb25zb2xlLmxvZygnICAgIHZhciBtIDogTWF0cml4M0QgPSBuZXcgTWF0cml4M0QoIG9yaWdpbmFsICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICBtLmFwcGVuZFRyYW5zbGF0aW9uKCB0LnggLCB0LnkgLCB0LnogKTsnKTtcblx0XHRjb25zb2xlLmxvZygnICAgIHRyYWNlKCBcIlRTUmVzdWx0OiBcIiAsIHJlc3VsdCApOycpO1xuXHRcdGNvbnNvbGUubG9nKCcgICAgdHJhY2UoIFwiQVNSZXN1bHQ6IFwiICwgbS5yYXdEYXRhICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJ30nKTtcblx0fVxuXG5cdHB1YmxpYyBvdXRwdXRBcHBlbmRUcmFuc2xhdGlvbihyZXN1bHQgOiBudW1iZXJbXSAsIG9yaWdpbmFsIDogbnVtYmVyW10gLCB2IDogVmVjdG9yM0QgKVxuXHR7XG5cdFx0dmFyIGEgOiBzdHJpbmcgPSAnbmV3IFZlY3RvcjNEKCAnICsgdi54ICsgJyAsICcgKyB2LnkgKyAnICwgJyArIHYueiArICcgKSc7XG5cdFx0Y29uc29sZS5sb2coICd0ZXN0QXBwZW5kVHJhbnNsYXRpb24oIG5ldyA8TnVtYmVyPiBbJyArIHJlc3VsdCArICddLCBuZXcgPE51bWJlcj4gWycgKyBvcmlnaW5hbCArICddICwgJyArIGEgKyAnKTsnICkgO1xuXHR9XG5cblx0cHVibGljIHRlc3RBcHBlbmRSb3RhdGlvbigpIDogdm9pZFxuXHR7XG5cdFx0Y29uc29sZS5sb2coICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG5cdFx0Y29uc29sZS5sb2coICd0ZXN0QXBwZW5kUm90YXRpb24nKTtcblxuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDEgLCAyICwgMyApO1xuXHRcdHZhciBwIDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoIDIgLCAyICwgMiApO1xuXG5cdFx0dmFyIG06IE1hdHJpeDNEO1xuXHRcdHZhciBpIDogYm9vbGVhbjtcblx0XHR2YXIgciA6IEFycmF5PG51bWJlcj4gPSBuZXcgQXJyYXk8bnVtYmVyPiAoIDE2ICkgO1xuXG5cdFx0bSA9IG5ldyBNYXRyaXgzRCggWyAgIDEsIDIsIDQsIDUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDIsIDEsIDAsIDgsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDQsIDAsIDEsIDcsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDUsIDgsIDcsIDEgXSApO1xuXHRcdG0uY29weVJhd0RhdGFUbyggciApO1xuXHRcdG0uYXBwZW5kUm90YXRpb24oIDkwICwgdiApOy8vICwgcCApO1xuXG5cdFx0dGhpcy5vdXRwdXRBcHBlbmRSb3RhdGlvbihtLnJhd0RhdGEgLCByICAsIHYgLCBwICk7XG5cblx0XHRtID0gbmV3IE1hdHJpeDNEKCBbICAgMSwgMCwgNCwgNSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0MCwgMSwgOCwgMCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NCwgOCwgMSwgNyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0NSwgMCwgNywgMV0gKTtcblxuXHRcdG0uY29weVJhd0RhdGFUbyggciApXG5cdFx0bS5hcHBlbmRSb3RhdGlvbiggOTAgLCB2ICk7Ly8sIHAgKTtcblx0XHR0aGlzLm91dHB1dEFwcGVuZFJvdGF0aW9uKG0ucmF3RGF0YSAsIHIgLCB2ICwgcCApO1xuXG5cdFx0bSAgPSBuZXcgTWF0cml4M0QoIFsgIDEsIDAsIDQsIDUsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDAsIDEsIDgsIDAsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDQsIDgsIDEsIDIsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDUsIDAsIDIsIDFdICk7XG5cblx0XHRtLmNvcHlSYXdEYXRhVG8oIHIgKVxuXHRcdG0uYXBwZW5kUm90YXRpb24oIDkwICwgdiApOy8vLCBwICk7XG5cdFx0dGhpcy5vdXRwdXRBcHBlbmRSb3RhdGlvbihtLnJhd0RhdGEgLCByICwgdiAsIHAgKTtcblxuXHRcdG0gID0gbmV3IE1hdHJpeDNEKCBbICAxLCAwLCA0LCA1LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQwLCAxLCA4LCAwLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ0LCA4LCAxLCAxLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ1LCAwLCAxLCAxXSApO1xuXG5cdFx0bS5jb3B5UmF3RGF0YVRvKCByIClcblx0XHRtLmFwcGVuZFJvdGF0aW9uKCA5MCAsIHYgKTsvLywgcCApO1xuXHRcdHRoaXMub3V0cHV0QXBwZW5kUm90YXRpb24obS5yYXdEYXRhICwgciwgdiAsIHAgICk7XG5cblx0XHRjb25zb2xlLmxvZygnLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVMzJyk7XG5cdFx0Y29uc29sZS5sb2coICdwcml2YXRlIGZ1bmN0aW9uIHRlc3RBcHBlbmRSb3RhdGlvbiggcmVzdWx0IDogVmVjdG9yLjxOdW1iZXI+ICwgb3JpZ2luYWwgOiBWZWN0b3IuPE51bWJlcj4gLCBheGlzIDogVmVjdG9yM0QgLCBwaXZvdCA6IFZlY3RvcjNEICknICk7XG5cdFx0Y29uc29sZS5sb2coJ3snKTtcblx0XHRjb25zb2xlLmxvZygnICAgIHZhciBtIDogTWF0cml4M0QgPSBuZXcgTWF0cml4M0QoIG9yaWdpbmFsICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICBtLmFwcGVuZFJvdGF0aW9uKCA5MCAsIGF4aXMgLCBwaXZvdCApOycpO1xuXHRcdGNvbnNvbGUubG9nKCcgICAgdHJhY2UoIFwiVFNSZXN1bHQ6IFwiICwgcmVzdWx0ICk7Jyk7XG5cdFx0Y29uc29sZS5sb2coJyAgICB0cmFjZSggXCJBU1Jlc3VsdDogXCIgLCBtLnJhd0RhdGEgKTsnKTtcblx0XHRjb25zb2xlLmxvZygnfScpO1xuXHR9XG5cblx0cHVibGljIHRlc3RJbnZlcnQoKSA6IHZvaWRcblx0e1xuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoKTtcblx0XHR2YXIgbTogTWF0cml4M0Rcblx0XHR2YXIgaSA6IGJvb2xlYW47XG5cdFx0dmFyIHIgOiBBcnJheTxudW1iZXI+ID0gbmV3IEFycmF5PG51bWJlcj4gKCAxNiApIDtcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoIFsgICAxLCAyLCA0LCA1LFxuXHRcdFx0MiwgMSwgMCwgOCxcblx0XHRcdDQsIDAsIDEsIDcsXG5cdFx0XHQ1LCA4LCA3LCAxIF0gKTtcblx0XHRtLmNvcHlSYXdEYXRhVG8oIHIgKVxuXHRcdGkgPSBtLmludmVydCgpO1xuXHRcdHRoaXMub3V0cHV0SW52ZXJ0KCBpICwgbS5yYXdEYXRhICwgciApIDtcblxuXHRcdG0gPSBuZXcgTWF0cml4M0QoIFsgICAxLCAwLCA0LCA1LFxuXHRcdFx0MCwgMSwgOCwgMCxcblx0XHRcdDQsIDgsIDEsIDcsXG5cdFx0XHQ1LCAwLCA3LCAxXSApO1xuXG5cdFx0bS5jb3B5UmF3RGF0YVRvKCByIClcblx0XHRpID0gbS5pbnZlcnQoKTtcblx0XHR0aGlzLm91dHB1dEludmVydCggaSAsIG0ucmF3RGF0YSAsIHIgKSA7XG5cblx0XHRtICA9IG5ldyBNYXRyaXgzRCggWyAgIDEsIDAsIDQsIDUsXG5cdFx0XHQwLCAxLCA4LCAwLFxuXHRcdFx0NCwgOCwgMSwgMixcblx0XHRcdDUsIDAsIDIsIDFdICk7XG5cblx0XHRtLmNvcHlSYXdEYXRhVG8oIHIgKVxuXHRcdGkgPSBtLmludmVydCgpO1xuXHRcdHRoaXMub3V0cHV0SW52ZXJ0KCBpICwgbS5yYXdEYXRhICwgciApIDtcblx0fVxuXG5cdHB1YmxpYyB0ZXN0Q29weVJvd1RvKClcblx0e1xuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoKTtcblx0XHR2YXIgbTogTWF0cml4M0Rcblx0XHR2YXIgaSA6IGJvb2xlYW47XG5cdFx0dmFyIHIgOiBBcnJheTxudW1iZXI+ID0gbmV3IEFycmF5PG51bWJlcj4gKCAxNiApIDtcblxuXHRcdG0gID0gbmV3IE1hdHJpeDNEKCBbXHQxLDIsNCw1LFxuXHRcdFx0Niw3LDgsOSxcblx0XHRcdDQsMCwxLDcsXG5cdFx0XHQ1LDgsNywxXSk7XG5cblx0XHRtLmNvcHlSb3dUbyggMCwgdikgOyBjb25zb2xlLmxvZyAoIHYgKSA7XG5cdFx0bS5jb3B5Um93VG8oIDEsIHYpIDsgY29uc29sZS5sb2cgKCB2ICkgO1xuXHRcdG0uY29weVJvd1RvKCAyLCB2KSA7IGNvbnNvbGUubG9nICggdiApIDtcblx0XHRtLmNvcHlSb3dUbyggMywgdikgOyBjb25zb2xlLmxvZyAoIHYgKSA7XG5cdH1cblx0XG5cdHB1YmxpYyB0ZXN0Q29weUNvbHVtblRvKClcblx0e1xuXHRcdHZhciB2IDogVmVjdG9yM0QgPSBuZXcgVmVjdG9yM0QoKTtcblx0XHR2YXIgbTogTWF0cml4M0Rcblx0XHR2YXIgaSA6IGJvb2xlYW47XG5cdFx0dmFyIHIgOiBBcnJheTxudW1iZXI+ID0gbmV3IEFycmF5PG51bWJlcj4gKCAxNiApIDtcblxuXHRcdG0gID0gbmV3IE1hdHJpeDNEKCBbICAgMSwgMCwgNCwgNSxcblx0XHRcdDAsIDEsIDgsIDAsXG5cdFx0XHQ0LCA4LCAxLCAxLFxuXHRcdFx0NSwgMCwgMSwgMV0gKTtcblxuXG5cdFx0bSAgPSBuZXcgTWF0cml4M0QoIFtcdDEsMiwzLDQsXG5cdFx0XHQ1LDYsNyw4LFxuXHRcdFx0OSwxMCwxLDEyLFxuXHRcdFx0MTMsMTQsMTUsMTZdKTtcblxuXHRcdG0uY29weUNvbHVtblRvKCAwLCB2KSA7IGNvbnNvbGUubG9nICh2LnRvU3RyaW5nKCkgKSA7XG5cdFx0bS5jb3B5Q29sdW1uVG8oIDEsIHYpIDsgY29uc29sZS5sb2cgKCB2LnRvU3RyaW5nKCkgKSA7XG5cdFx0bS5jb3B5Q29sdW1uVG8oIDIsIHYpIDsgY29uc29sZS5sb2cgKCB2LnRvU3RyaW5nKCkgKSA7XG5cdFx0bS5jb3B5Q29sdW1uVG8oIDMsIHYpIDsgY29uc29sZS5sb2cgKCB2LnRvU3RyaW5nKCkgKSA7XG5cblx0XHR2LncgPSB2LnggPSB2LnkgPSB2LnogPSAwO1xuXHRcdG0uY29weUNvbHVtbkZyb20oIDAgICwgdiApOyBjb25zb2xlLmxvZyAobS5yYXdEYXRhICkgO1xuXHRcdHYudyA9IHYueCA9IHYueSA9IHYueiA9IDE7XG5cdFx0bS5jb3B5Q29sdW1uRnJvbSggMSAgLCB2ICk7IGNvbnNvbGUubG9nICggbS5yYXdEYXRhICkgO1xuXHRcdHYudyA9IHYueCA9IHYueSA9IHYueiA9IDI7XG5cdFx0bS5jb3B5Q29sdW1uRnJvbSggMiAgLCB2ICk7IGNvbnNvbGUubG9nICggbS5yYXdEYXRhICkgO1xuXHRcdHYudyA9IHYueCA9IHYueSA9IHYueiA9IDM7XG5cdFx0bS5jb3B5Q29sdW1uRnJvbSggMyAgLCB2ICk7IGNvbnNvbGUubG9nICggbS5yYXdEYXRhICkgO1xuXHR9XG5cblx0cHVibGljIG91dHB1dEFwcGVuZFJvdGF0aW9uKHJlc3VsdCA6IG51bWJlcltdICwgb3JpZ2luYWwgOiBudW1iZXJbXSAsIGF4aXMgOiBWZWN0b3IzRCAsIHBpdm90IDogVmVjdG9yM0QgKVxuXHR7XG5cdFx0dmFyIGEgOiBzdHJpbmcgPSAnbmV3IFZlY3RvcjNEKCAnICsgYXhpcy54ICsgJyAsICcgKyBheGlzLnkgKyAnICwgJyArIGF4aXMueiArICcgKSc7XG5cdFx0dmFyIHAgOiBzdHJpbmcgPSAnbmV3IFZlY3RvcjNEKCAnICsgcGl2b3QueCArICcgLCAnICsgcGl2b3QueSArICcgLCAnICsgcGl2b3QueiArICcgKSc7XG5cblx0XHRjb25zb2xlLmxvZyggJ3Rlc3RBcHBlbmRSb3RhdGlvbiggbmV3IDxOdW1iZXI+IFsnICsgcmVzdWx0ICsgJ10sIG5ldyA8TnVtYmVyPiBbJyArIG9yaWdpbmFsICsgJ10gLCAnICsgYSArICcgLCAnICsgcCArICcpOycgKSA7XG5cdH1cblxuXHRwdWJsaWMgb3V0cHV0SW52ZXJ0KHN1Y2Nlc3MgOiBib29sZWFuICwgZGF0YSA6IEFycmF5PG51bWJlcj4gLCBvcmlnaW5hbCA6IEFycmF5PG51bWJlcj4gKVxuXHR7XG5cdFx0Y29uc29sZS5sb2coICd0ZXN0SW52ZXJ0KCcgKyBzdWNjZXNzICsgJywgbmV3IDxOdW1iZXI+IFsnICsgZGF0YSArICddLCBuZXcgPE51bWJlcj4gWycgKyBvcmlnaW5hbCArICddKTsnICkgO1xuXHR9XG5cblx0cHVibGljIG91dHB1dCggZGF0YSA6IEFycmF5PG51bWJlcj4gLCByZXN1bHQgOiBudW1iZXIgKVxuXHR7XG5cdFx0Y29uc29sZS5sb2coICd0ZXN0RGV0ZXJtaW5hbnQoIG5ldyA8TnVtYmVyPiBbJyArIGRhdGEgKyAnXSwgJyArICByZXN1bHQgKyAnKTsnICkgO1xuXHR9XG5cblx0cHVibGljIGdldFJuZCggbWF4IDogbnVtYmVyICwgbWluIDogbnVtYmVyICkgOiBudW1iZXIge1xuXG5cdFx0cmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtYXggLSBtaW4gKyAxKSkgKyBtaW47XG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/geom/VextMat3DTests.ts b/tests/geom/VextMat3DTests.ts index cfe353d3..08c8f3b7 100644 --- a/tests/geom/VextMat3DTests.ts +++ b/tests/geom/VextMat3DTests.ts @@ -1,1007 +1,860 @@ -/// +import Matrix3D = require("awayjs-core/lib/core/geom/Matrix3D"); +import Vector3D = require("awayjs-core/lib/core/geom/Vector3D"); -module tests.geom { +class VextMat3DTests +{ - export class VextMat3DTests - { + constructor() + { + var m:Matrix3D = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - constructor() - { + var v : Vector3D = new Vector3D(); - var m:away.geom.Matrix3D = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log('------------------------------------ copyColumnTo');// DONE OK - var v : away.geom.Vector3D = new away.geom.Vector3D(); + m.copyColumnTo( 0 , v );console.log('copyColumnTo 0 ' , v ); + m.copyColumnTo( 1 , v );console.log('copyColumnTo 1 ' , v ); + m.copyColumnTo( 2 , v );console.log('copyColumnTo 2 ' , v ); + m.copyColumnTo( 3 , v );console.log('copyColumnTo 3 ' , v ); - console.log('------------------------------------ copyColumnTo');// DONE OK + console.log('------------------------------------ copyRowTo');// DONE OK - m.copyColumnTo( 0 , v );console.log('copyColumnTo 0 ' , v ); - m.copyColumnTo( 1 , v );console.log('copyColumnTo 1 ' , v ); - m.copyColumnTo( 2 , v );console.log('copyColumnTo 2 ' , v ); - m.copyColumnTo( 3 , v );console.log('copyColumnTo 3 ' , v ); + var r : Vector3D = new Vector3D(); - console.log('------------------------------------ copyRowTo');// DONE OK + m.copyRowTo( 0 , r );console.log('copyRowTo 0 ' , r ); + m.copyRowTo( 1 , r );console.log('copyRowTo 1 ' , r ); + m.copyRowTo( 2 , r );console.log('copyRowTo 2 ' , r ); + m.copyRowTo( 3 , r );console.log('copyRowTo 3 ' , r ); - var r : away.geom.Vector3D = new away.geom.Vector3D(); + console.log('------------------------------------ copyRowFrom'); // DONE OK - m.copyRowTo( 0 , r );console.log('copyRowTo 0 ' , r ); - m.copyRowTo( 1 , r );console.log('copyRowTo 1 ' , r ); - m.copyRowTo( 2 , r );console.log('copyRowTo 2 ' , r ); - m.copyRowTo( 3 , r );console.log('copyRowTo 3 ' , r ); + m = new Matrix3D([ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); - console.log('------------------------------------ copyRowFrom'); // DONE OK + m.copyRowFrom( 0 , new Vector3D( 16 , 15 , 14 , 13) ); console.log('copyRowFrom 0 ' , m.rawData ); + m.copyRowFrom( 1 , new Vector3D( 12 , 11 , 10 , 9) ); console.log('copyRowFrom 1 ' , m.rawData ); + m.copyRowFrom( 2 , new Vector3D( 8 , 7 , 6 , 5) ); console.log('copyRowFrom 2 ' , m.rawData ); + m.copyRowFrom( 3 , new Vector3D( 4 , 3 , 2 , 1) ); console.log('copyRowFrom 3 ' , m.rawData ); - m = new away.geom.Matrix3D([ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); + console.log('------------------------------------ copyColumnFrom'); // DONE OK - m.copyRowFrom( 0 , new away.geom.Vector3D( 16 , 15 , 14 , 13) ); console.log('copyRowFrom 0 ' , m.rawData ); - m.copyRowFrom( 1 , new away.geom.Vector3D( 12 , 11 , 10 , 9) ); console.log('copyRowFrom 1 ' , m.rawData ); - m.copyRowFrom( 2 , new away.geom.Vector3D( 8 , 7 , 6 , 5) ); console.log('copyRowFrom 2 ' , m.rawData ); - m.copyRowFrom( 3 , new away.geom.Vector3D( 4 , 3 , 2 , 1) ); console.log('copyRowFrom 3 ' , m.rawData ); + m = new Matrix3D([ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); - console.log('------------------------------------ copyColumnFrom'); // DONE OK + m.copyColumnFrom( 0 , new Vector3D( 16 , 15 , 14 , 13) ); console.log('copyColumnFrom 0 ' , m.rawData ); + m.copyColumnFrom( 1 , new Vector3D( 12 , 11 , 10 , 9) ); console.log('copyColumnFrom 1 ' , m.rawData ); + m.copyColumnFrom( 2 , new Vector3D( 8 , 7 , 6 , 5) ); console.log('copyColumnFrom 2 ' , m.rawData ); + m.copyColumnFrom( 3 , new Vector3D( 4 , 3 , 2 , 1) ); console.log('copyColumnFrom 3 ' , m.rawData ); - m = new away.geom.Matrix3D([ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); + console.log('------------------------------------ Append'); // DONE OK - m.copyColumnFrom( 0 , new away.geom.Vector3D( 16 , 15 , 14 , 13) ); console.log('copyColumnFrom 0 ' , m.rawData ); - m.copyColumnFrom( 1 , new away.geom.Vector3D( 12 , 11 , 10 , 9) ); console.log('copyColumnFrom 1 ' , m.rawData ); - m.copyColumnFrom( 2 , new away.geom.Vector3D( 8 , 7 , 6 , 5) ); console.log('copyColumnFrom 2 ' , m.rawData ); - m.copyColumnFrom( 3 , new away.geom.Vector3D( 4 , 3 , 2 , 1) ); console.log('copyColumnFrom 3 ' , m.rawData ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ Append'); // DONE OK + var s : Matrix3D = new Matrix3D( [ 16 , 15 , 14 , 13 , + 12 , 11 , 10 , 9 , + 8 , 7 , 6 , 5 , + 4 , 3 , 2 , 1 ] ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + m.append( s ); - var s : away.geom.Matrix3D = new away.geom.Matrix3D( [ 16 , 15 , 14 , 13 , - 12 , 11 , 10 , 9 , - 8 , 7 , 6 , 5 , - 4 , 3 , 2 , 1 ] ); + console.log('Append Result' , m.rawData ); + console.log('Appendee' , s.rawData ); - m.append( s ); - console.log('Append Result' , m.rawData ); - console.log('Appendee' , s.rawData ); + console.log('------------------------------------ Prepend'); // DONE OK + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ Prepend'); // DONE OK + s = new Matrix3D( [ 16 , 15 , 14 , 13 , + 12 , 11 , 10 , 9 , + 8 , 7 , 6 , 5 , + 4 , 3 , 2 , 1 ] ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + m.prepend( s ); - s = new away.geom.Matrix3D( [ 16 , 15 , 14 , 13 , - 12 , 11 , 10 , 9 , - 8 , 7 , 6 , 5 , - 4 , 3 , 2 , 1 ] ); + console.log('Prepend Result' , m.rawData ); + console.log('Prependee' , s.rawData ); - m.prepend( s ); - console.log('Prepend Result' , m.rawData ); - console.log('Prependee' , s.rawData ); + console.log('------------------------------------ Append Translation'); // DONE OK + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ Append Translation'); // DONE OK + m.appendTranslation( 5 , 6 , 7 ); + console.log(' Append Translation' , m.rawData ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); - m.appendTranslation( 5 , 6 , 7 ); - console.log(' Append Translation' , m.rawData ); + console.log('------------------------------------ appendRotation'); // DONE OK - Pivot gives different result ( commented out for now ) + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ appendRotation'); // DONE OK - Pivot gives different result ( commented out for now ) - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + var pivot : Vector3D = new Vector3D ( 7 , 8 ,9 ); + var axis : Vector3D = new Vector3D( 0 , 0 , 1 ); // checked for x,y,z; + m.appendRotation( 45 , axis );//, pivot ); + console.log( 'appendRotation' , m.rawData ); - var pivot : away.geom.Vector3D = new away.geom.Vector3D ( 7 , 8 ,9 ); + console.log('------------------------------------ appendScale'); // DONE OK - var axis : away.geom.Vector3D = new away.geom.Vector3D( 0 , 0 , 1 ); // checked for x,y,z; - m.appendRotation( 45 , axis );//, pivot ); - console.log( 'appendRotation' , m.rawData ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ appendScale'); // DONE OK + m.appendScale( 6 , 7 , 8 ); + console.log( 'appendScale' , m.rawData ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log('------------------------------------ prepentScale'); // DONE OK - m.appendScale( 6 , 7 , 8 ); - console.log( 'appendScale' , m.rawData ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ prepentScale'); // DONE OK + m.prependScale( 6 , 7 , 8 ); + console.log( 'prepentScale' , m.rawData ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); - m.prependScale( 6 , 7 , 8 ); - console.log( 'prepentScale' , m.rawData ); + console.log('------------------------------------ clone'); // DONE OK + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ clone'); // DONE OK - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log( 'clone' , m.clone().rawData); + console.log('------------------------------------ copyFrom'); // DONE OK - console.log( 'clone' , m.clone().rawData); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ copyFrom'); // DONE OK + var cl : Matrix3D = new Matrix3D([ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); + cl.copyFrom( m ) - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log( 'copyFrom' , cl.rawData ); - var cl : away.geom.Matrix3D = new away.geom.Matrix3D([ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); - cl.copyFrom( m ) - console.log( 'copyFrom' , cl.rawData ); + console.log('------------------------------------ copyRawDataFrom'); // DONE ok - Offet / Traspose not implemented + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ copyRawDataFrom'); // DONE ok - Offet / Traspose not implemented + m.copyRawDataFrom([ 16 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ] ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log( 'copyRawDataFrom' , m.rawData ); - m.copyRawDataFrom([ 16 , 15 , 14 , 13 , 12 , 11 , 10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 ] ); + console.log('------------------------------------ copyRawDataTo'); // done OK - console.log( 'copyRawDataFrom' , m.rawData ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ copyRawDataTo'); // done OK + var result : number[] = new Array( 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log( 'result.length: ' , result.length ); - var result : number[] = new Array( 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9); + m.copyRawDataTo( result , 1 , true ); + console.log( 'rawData' , m.rawData ); + console.log( 'copyRawDataTo' ,result ); - console.log( 'result.length: ' , result.length ); + console.log('------------------------------------ transpose'); // DONE ok - Offet / Traspose not implemented - m.copyRawDataTo( result , 1 , true ); - console.log( 'rawData' , m.rawData ); - console.log( 'copyRawDataTo' ,result ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ transpose'); // DONE ok - Offet / Traspose not implemented + m.transpose() + console.log( 'transpose' , m.rawData ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); - m.transpose() - console.log( 'transpose' , m.rawData ); + console.log('------------------------------------ copyToMatrix3D'); // done ok + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ copyToMatrix3D'); // done ok + s = new Matrix3D( [ 16 , 15 , 14 , 13 , + 12 , 11 , 10 , 9 , + 8 , 7 , 6 , 5 , + 4 , 3 , 2 , 1 ] ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + m.copyToMatrix3D( s ) + console.log( 'copyToMatrix3D' , m.rawData ); - s = new away.geom.Matrix3D( [ 16 , 15 , 14 , 13 , - 12 , 11 , 10 , 9 , - 8 , 7 , 6 , 5 , - 4 , 3 , 2 , 1 ] ); - m.copyToMatrix3D( s ) - console.log( 'copyToMatrix3D' , m.rawData ); + console.log('------------------------------------ decompose'); /// NOT WORKING + m = new Matrix3D( [ 1, 6, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 ] ); - console.log('------------------------------------ decompose'); /// NOT WORKING + var resultDecompose : Vector3D[] = m.decompose(); + console.log( 'copyToMatrix3D' , resultDecompose[0] ); + console.log( 'copyToMatrix3D' , resultDecompose[1] ); + console.log( 'copyToMatrix3D' , resultDecompose[2] ); - m = new away.geom.Matrix3D( [ 1, 6, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 ] ); + console.log('------------------------------------ determinant'); // WORKING ok - good - var resultDecompose : away.geom.Vector3D[] = m.decompose(); - console.log( 'copyToMatrix3D' , resultDecompose[0] ); - console.log( 'copyToMatrix3D' , resultDecompose[1] ); - console.log( 'copyToMatrix3D' , resultDecompose[2] ); + m = new Matrix3D( [ 1, 2, 0, 6, + 2, 1, 0, 0, + 0, 0, 1, 3, + 6, 0, 3, 1 ] ); - console.log('------------------------------------ determinant'); // WORKING ok - good + console.log( 'determinant:' , m.determinant ); - m = new away.geom.Matrix3D( [ 1, 2, 0, 6, - 2, 1, 0, 0, - 0, 0, 1, 3, - 6, 0, 3, 1 ] ); + m = new Matrix3D( [ 1, 2, 5, 6, + 2, 1, 0, 8, + 5, 0, 1, 3, + 6, 8, 3, 1 ] ); - console.log( 'determinant:' , m.determinant ); + console.log( 'determinant:' , m.determinant ); - m = new away.geom.Matrix3D( [ 1, 2, 5, 6, - 2, 1, 0, 8, - 5, 0, 1, 3, - 6, 8, 3, 1 ] ); + m = new Matrix3D( [ 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 ] ); - console.log( 'determinant:' , m.determinant ); + console.log( 'determinant:' , m.determinant ); - m = new away.geom.Matrix3D( [ 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1 ] ); + console.log('------------------------------------ invert'); // WORKING ok - good - console.log( 'determinant:' , m.determinant ); + m = new Matrix3D( [ 1, 2, 5, 6, + 2, 1, 0, 8, + 5, 0, 1, 3, + 6, 8, 3, 1 ] ); - console.log('------------------------------------ invert'); // WORKING ok - good + var b : boolean; - m = new away.geom.Matrix3D( [ 1, 2, 5, 6, - 2, 1, 0, 8, - 5, 0, 1, 3, - 6, 8, 3, 1 ] ); + b = m.invert(); + console.log( 'invert:' , b , m.rawData ); - var b : boolean; + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - b = m.invert(); - console.log( 'invert:' , b , m.rawData ); + b = m.invert(); + console.log( 'invert:' , b , m.rawData ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log('------------------------------------ Prepend Rotation'); // OK Good - b = m.invert(); - console.log( 'invert:' , b , m.rawData ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ Prepend Rotation'); // OK Good + axis = new Vector3D( 1 , 0 ,0 ); + m.prependRotation( 45 , axis ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log( 'prependRotation:' , m.rawData ); - axis = new away.geom.Vector3D( 1 , 0 ,0 ); - m.prependRotation( 45 , axis ); - console.log( 'prependRotation:' , m.rawData ); + console.log('------------------------------------ prependTranslation'); // OK Good + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ prependTranslation'); // OK Good + m.prependTranslation( 5 , 10 , 15 ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log( 'prependTranslation:' , m.rawData ); - m.prependTranslation( 5 , 10 , 15 ); - console.log( 'prependTranslation:' , m.rawData ); + console.log('------------------------------------ recompose'); // OK Good + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ recompose'); // OK Good + var rVects : Vector3D[] = new Array(); + rVects.push ( new Vector3D( 5 , 1 , 3 ) ); + rVects.push ( new Vector3D( 5 , 0 , 1 ) ); + rVects.push ( new Vector3D( 2 , 1 , 3 ) ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + m.recompose( rVects ) - var rVects : away.geom.Vector3D[] = new Array(); - rVects.push ( new away.geom.Vector3D( 5 , 1 , 3 ) ); - rVects.push ( new away.geom.Vector3D( 5 , 0 , 1 ) ); - rVects.push ( new away.geom.Vector3D( 2 , 1 , 3 ) ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - m.recompose( rVects ) + rVects = new Array(); + rVects.push ( new Vector3D( 1 , 2 , 9 ) ); + rVects.push ( new Vector3D( 3 , 3 , 1 ) ); + rVects.push ( new Vector3D( 8 , 1 , 8 ) ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + m.recompose( rVects ) - rVects = new Array(); - rVects.push ( new away.geom.Vector3D( 1 , 2 , 9 ) ); - rVects.push ( new away.geom.Vector3D( 3 , 3 , 1 ) ); - rVects.push ( new away.geom.Vector3D( 8 , 1 , 8 ) ); + console.log( 'recompose:' , m.rawData ); - m.recompose( rVects ) - console.log( 'recompose:' , m.rawData ); + rVects = new Array(); + rVects.push ( new Vector3D( 1 , 2 , 9 ) ); + rVects.push ( new Vector3D( 3 , 3 , 1 ) ); + rVects.push ( new Vector3D( 0 , 0 , 0 ) ); + var b : boolean = m.recompose( rVects ) - rVects = new Array(); - rVects.push ( new away.geom.Vector3D( 1 , 2 , 9 ) ); - rVects.push ( new away.geom.Vector3D( 3 , 3 , 1 ) ); - rVects.push ( new away.geom.Vector3D( 0 , 0 , 0 ) ); + console.log( 'fail - recompose:' , m.rawData , b ); - var b : boolean = m.recompose( rVects ) + console.log('------------------------------------ transformVector '); // IT WORKS !!! - console.log( 'fail - recompose:' , m.rawData , b ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ transformVector '); // IT WORKS !!! - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + var tVResult : Vector3D = m.transformVector( new Vector3D( 1,2,3 )); + console.log( tVResult ) - var tVResult : away.geom.Vector3D = m.transformVector( new away.geom.Vector3D( 1,2,3 )); - console.log( tVResult ) + console.log('------------------------------------ transformVector '); // IT WORKS !!! + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ transformVector '); // IT WORKS !!! + var vout : number[] = new Array(0 , 1 , 2 , 3 , 4 , 5 ); + var vin : number[] = new Array(4,5,6); + m.transformVectors( vin , vout ); + console.log( 'transformVector' , vout , vin ) - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); - var vout : number[] = new Array(0 , 1 , 2 , 3 , 4 , 5 ); - var vin : number[] = new Array(4,5,6); - m.transformVectors( vin , vout ); - console.log( 'transformVector' , vout , vin ) + console.log('------------------------------------ transpose'); // IT WORKS !!! + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ transpose'); // IT WORKS !!! + m.transpose(); + console.log( 'transpose' , m.rawData ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); - m.transpose(); - console.log( 'transpose' , m.rawData ); + console.log('------------------------------------ getAxisRotation'); // internal class + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); - console.log('------------------------------------ getAxisRotation'); // internal class + //m.getAxisRotation(4 , 5 , 6 , 90 ); + //console.log( 'getAxisRotation' , m.rawData ); - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log('------------------------------------ position'); // internal class - //m.getAxisRotation(4 , 5 , 6 , 90 ); - //console.log( 'getAxisRotation' , m.rawData ); + m = new Matrix3D( [ 1, 2, 3, 4, + 5, 6, 7, 8, + 9, 10, 11, 12, + 13, 14, 15, 16 ] ); + + var posVect : Vector3D = new Vector3D( 5 , 10 , 15 ); - console.log('------------------------------------ position'); // internal class + m.position = posVect; - m = new away.geom.Matrix3D( [ 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16 ] ); + console.log( 'set position' , m.rawData ); + console.log( 'get position' , m.position ); + } + public testappend() : void + { + var v : Vector3D = new Vector3D( 0 , 1 , 1 ) + var v1 : Vector3D = new Vector3D( 1 , 0 , 1 ) + var v2 : Vector3D = new Vector3D( 7 , 8 , 0 ) - var posVect : away.geom.Vector3D = new away.geom.Vector3D( 5 , 10 , 15 ); + var t : Matrix3D= new Matrix3D( [ 0, 10, 10, 1, + 10, 5, 10, 10, + 10, 10, 5, 10, + 1, 10, 10, 0 ] ); - m.position = posVect; + var d : Matrix3D= new Matrix3D( [ 1, 50, 1, 8, + 2, 5, 12, 9, + 30, 16, 35, 10, + 4, 18, 40, 11 ] ); + t.append( d ) - console.log( 'set position' , m.rawData ); - console.log( 'get position' , m.position ); + console.log( t.rawData ); + } - } + public testprependRotation() : void + { + var v : Vector3D = new Vector3D( 0 , 1 , 1 ) + var v1 : Vector3D = new Vector3D( 1 , 0 , 1 ) + var v2 : Vector3D = new Vector3D( 7 , 8 , 0 ) - public testappend() : void - { + var t : Matrix3D= new Matrix3D( [ 0, 10, 10, 1, + 10, 5, 10, 10, + 10, 10, 5, 10, + 1, 10, 10, 0 ] ); - var v : away.geom.Vector3D = new away.geom.Vector3D( 0 , 1 , 1 ) - var v1 : away.geom.Vector3D = new away.geom.Vector3D( 1 , 0 , 1 ) - var v2 : away.geom.Vector3D = new away.geom.Vector3D( 7 , 8 , 0 ) - - var t : away.geom.Matrix3D= new away.geom.Matrix3D( [ 0, 10, 10, 1, - 10, 5, 10, 10, - 10, 10, 5, 10, - 1, 10, 10, 0 ] ); - - var d : away.geom.Matrix3D= new away.geom.Matrix3D( [ 1, 50, 1, 8, - 2, 5, 12, 9, - 30, 16, 35, 10, - 4, 18, 40, 11 ] ); - t.append( d ) - - console.log( t.rawData ); - - } - - - public testprependRotation() : void - { - - var v : away.geom.Vector3D = new away.geom.Vector3D( 0 , 1 , 1 ) - var v1 : away.geom.Vector3D = new away.geom.Vector3D( 1 , 0 , 1 ) - var v2 : away.geom.Vector3D = new away.geom.Vector3D( 7 , 8 , 0 ) - - var t : away.geom.Matrix3D= new away.geom.Matrix3D( [ 0, 10, 10, 1, - 10, 5, 10, 10, - 10, 10, 5, 10, - 1, 10, 10, 0 ] ); - - var d : away.geom.Matrix3D= new away.geom.Matrix3D( ); - t.prependRotation( 90 , v )//, v1 ) - - console.log( t.rawData ); - - } - - - public testcopyToMatrix3D() : void - { - - var v : away.geom.Vector3D = new away.geom.Vector3D( 0 , 2 , 3 ) - var v1 : away.geom.Vector3D = new away.geom.Vector3D( 4 , 0 , 6 ) - var v2 : away.geom.Vector3D = new away.geom.Vector3D( 7 , 8 , 0 ) - - var t : away.geom.Matrix3D= new away.geom.Matrix3D( [ 0, 10, 10, 1, - 10, 5, 10, 10, - 10, 10, 5, 10, - 1, 10, 10, 0 ] ); - - var d : away.geom.Matrix3D= new away.geom.Matrix3D( ); - //t.copyToMatrix3D( d ) ; - - console.log( d.rawData ); - - } - - public testDecompose() : void - { - - console.log( '----------------------------------------------------------------------'); - console.log( 'testDecompose'); - var v : away.geom.Vector3D[] ; - var m: away.geom.Matrix3D; - var r : Array = new Array ( 16 ) ; - - for ( var c : number = 0 ; c < 10 ; c ++ ) - { - - - m = new away.geom.Matrix3D( [ this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), - this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), - this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), - this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ) ] ); - - - m.copyRawDataTo( r ); - - v = m.decompose(); - this.outputDecompose(m.rawData , r , v[0], v[1], v[2]); - - - } - - /* - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1] ); - m.copyRawDataTo( r ); - v = m.decompose(); - this.outputDecompose(m.rawData , r , v[0], v[1], v[2]); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1] ); - m.copyRawDataTo( r ); - v = m.decompose(); - this.outputDecompose(m.rawData , r , v[0], v[1], v[2]); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1] ); - m.copyRawDataTo( r ); - v = m.decompose(); - this.outputDecompose(m.rawData , r , v[0], v[1], v[2]); - */ - console.log('//------------------------------------------------------------ AS3'); - console.log( 'private function testDecompose( result : Vector. , original : Vector. , a1 : Vector3D , a2 : Vector3D , a3 : Vector3D )' ); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' var result : Vector. = m.decompose();'); - console.log(" trace('0----------------------------------------');"); - console.log(" trace( r[0])"); - console.log(" trace( a1 )"); - console.log(" trace('1--------------------');"); - console.log(" trace( r[1])"); - console.log(" trace( a2 )"); - console.log(" trace('2--------------------');"); - console.log(" trace( r[2])"); - console.log(" trace( a3 )"); - console.log(" trace('--------------------');"); - console.log(" trace( 'TSResult: ' , result );"); - console.log(" trace( 'ASResult: ' , m.rawData );"); - console.log(" trace( 'original: ' , original );"); - console.log(" trace('--------------------');"); - console.log('}'); - - - } - - public outputDecompose(result : number[] , original : number[] , a1 : away.geom.Vector3D , a2 : away.geom.Vector3D , a3 : away.geom.Vector3D) - { - - var s1 : string = 'new Vector3D( ' + a1.x + ' , ' + a1.y + ' , ' + a1.z + ' )'; - var s2 : string = 'new Vector3D( ' + a2.x + ' , ' + a2.y + ' , ' + a2.z + ' )'; - var s3 : string = 'new Vector3D( ' + a3.x + ' , ' + a3.y + ' , ' + a3.z + ' )'; - - - console.log( 'testDecompose( new [' + result + '], new [' + original + '] , ' + s1 + ' , '+ s2 + ' , ' + s3 + ' );' ) ; - - - } - - public testPosition() : void - { - - console.log( '----------------------------------------------------------------------'); - console.log( 'testPosition'); - var v : away.geom.Vector3D = new away.geom.Vector3D( 1 , 2 , 3 ); - var p : away.geom.Vector3D = new away.geom.Vector3D( 2 , 2 , 2 ); - var pos : away.geom.Vector3D; - - var m: away.geom.Matrix3D; - var i : boolean; - var r : Array = new Array ( 16 ) ; - - m = new away.geom.Matrix3D( [ 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1 ] ); - m.copyRawDataTo( r ); - m.position = v; - pos = m.position; - this.outputPosition(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1] ); - m.copyRawDataTo( r ); - m.position = v; - pos = m.position; - this.outputPosition(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1] ); - m.copyRawDataTo( r ); - m.position = v; - pos = m.position; - this.outputPosition(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1] ); - m.copyRawDataTo( r ); - m.position = v; - pos = m.position; - this.outputPosition(m.rawData , r , v ); - - console.log('//------------------------------------------------------------ AS3'); - console.log( 'private function testPosition( result : Vector. , original : Vector. , t : Vector3D )' ); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' m.position = t;'); - console.log(' var p : Vector3D = m.position;'); - console.log(' trace( "TSResult: " , result );'); - console.log(' trace( "ASResult: " , m.rawData );'); - console.log(' trace( "Pos: " ,p );'); - console.log('}'); - - } - public outputPosition(result : number[] , original : number[] , posResult : away.geom.Vector3D ) - { - - var a : string = 'new Vector3D( ' + posResult.x + ' , ' + posResult.y + ' , ' + posResult.z + ' )'; - - console.log( 'testPosition( new [' + result + '], new [' + original + '] , ' + a + ');' ) ; - - } - - - public testAppendScale() : void - { - - console.log( '----------------------------------------------------------------------'); - console.log( 'testAppendScale'); - var v : away.geom.Vector3D = new away.geom.Vector3D( 1 , 2 , 3 ); - var p : away.geom.Vector3D = new away.geom.Vector3D( 2 , 2 , 2 ); - - var m: away.geom.Matrix3D; - var i : boolean; - var r : Array = new Array ( 16 ) ; - - m = new away.geom.Matrix3D( [ 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1 ] ); - m.copyRawDataTo( r ); - m.appendScale(v.x , v.y , v.z ) ; - - this.outputAppendScale(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1] ); - - m.copyRawDataTo( r ) - m.appendScale(v.x , v.y , v.z ) ; - this.outputAppendScale(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1] ); - - m.copyRawDataTo( r ) - m.appendScale(v.x , v.y , v.z ) ; - this.outputAppendScale(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1] ); - - m.copyRawDataTo( r ) - m.appendScale(v.x , v.y , v.z ) ; - this.outputAppendScale(m.rawData , r, v ); - - console.log('//------------------------------------------------------------ AS3'); - console.log( 'private function testAppendScale( result : Vector. , original : Vector. , t : Vector3D )' ); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' m.appendScale( t.x , t.y , t.z );'); - console.log(' trace( "TSResult: " , result );'); - console.log(' trace( "ASResult: " , m.rawData );'); - console.log('}'); - } - - - public outputAppendScale(result : number[] , original : number[] , v : away.geom.Vector3D ) - { - - var a : string = 'new Vector3D( ' + v.x + ' , ' + v.y + ' , ' + v.z + ' )'; - - console.log( 'testAppendScale( new [' + result + '], new [' + original + '] , ' + a + ');' ) ; - - } - - public testAppendTranslation() : void - { - - console.log( '----------------------------------------------------------------------'); - console.log( 'testAppendTranslation'); - var v : away.geom.Vector3D = new away.geom.Vector3D( 1 , 2 , 3 ); - var p : away.geom.Vector3D = new away.geom.Vector3D( 2 , 2 , 2 ); - - var m: away.geom.Matrix3D; - var i : boolean; - var r : Array = new Array ( 16 ) ; - - m = new away.geom.Matrix3D( [ 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1 ] ); - m.copyRawDataTo( r ); - m.appendTranslation(v.x , v.y , v.z ) ; - - this.outputAppendTranslation(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1] ); - - m.copyRawDataTo( r ) - m.appendTranslation(v.x , v.y , v.z ) ; - this.outputAppendTranslation(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1] ); - - m.copyRawDataTo( r ) - m.appendTranslation(v.x , v.y , v.z ) ; - this.outputAppendTranslation(m.rawData , r , v ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1] ); - - m.copyRawDataTo( r ) - m.appendTranslation(v.x , v.y , v.z ) ; - this.outputAppendTranslation(m.rawData , r, v ); - - console.log('//------------------------------------------------------------ AS3'); - console.log( 'private function testAppendTranslation( result : Vector. , original : Vector. , t : Vector3D )' ); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' m.appendTranslation( t.x , t.y , t.z );'); - console.log(' trace( "TSResult: " , result );'); - console.log(' trace( "ASResult: " , m.rawData );'); - console.log('}'); - } - - public outputAppendTranslation(result : number[] , original : number[] , v : away.geom.Vector3D ) - { - - //var axis : number[] = new Array( axis.x , axis.y , axis.z ); - //var pivot : number[] = new Array( pivot.x , pivot.y , pivot.z ); - - var a : string = 'new Vector3D( ' + v.x + ' , ' + v.y + ' , ' + v.z + ' )'; - - console.log( 'testAppendTranslation( new [' + result + '], new [' + original + '] , ' + a + ');' ) ; - - } - - public testAppendRotation() : void - { - - console.log( '----------------------------------------------------------------------'); - console.log( 'testAppendRotation'); - - var v : away.geom.Vector3D = new away.geom.Vector3D( 1 , 2 , 3 ); - var p : away.geom.Vector3D = new away.geom.Vector3D( 2 , 2 , 2 ); - - var m: away.geom.Matrix3D; - var i : boolean; - var r : Array = new Array ( 16 ) ; - - m = new away.geom.Matrix3D( [ 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1 ] ); - m.copyRawDataTo( r ); - m.appendRotation( 90 , v );// , p ); - - this.outputAppendRotation(m.rawData , r , v , p ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1] ); - - m.copyRawDataTo( r ) - m.appendRotation( 90 , v );//, p ); - this.outputAppendRotation(m.rawData , r , v , p ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1] ); - - m.copyRawDataTo( r ) - m.appendRotation( 90 , v );//, p ); - this.outputAppendRotation(m.rawData , r , v , p ); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1] ); - - m.copyRawDataTo( r ) - m.appendRotation( 90 , v );//, p ); - this.outputAppendRotation(m.rawData , r, v , p ); - - console.log('//------------------------------------------------------------ AS3'); - console.log( 'private function testAppendRotation( result : Vector. , original : Vector. , axis : Vector3D , pivot : Vector3D )' ); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' m.appendRotation( 90 , axis , pivot );'); - console.log(' trace( "TSResult: " , result );'); - console.log(' trace( "ASResult: " , m.rawData );'); - console.log('}'); - } - - public testInvert() : void - { - - var v : away.geom.Vector3D = new away.geom.Vector3D(); - var m: away.geom.Matrix3D - var i : boolean; - var r : Array = new Array ( 16 ) ; - - m = new away.geom.Matrix3D( [ 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1 ] ); - m.copyRawDataTo( r ) - i = m.invert(); - this.outputInvert( i , m.rawData , r ) ; - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1] ); - - m.copyRawDataTo( r ) - i = m.invert(); - this.outputInvert( i , m.rawData , r ) ; - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1] ); - - m.copyRawDataTo( r ) - i = m.invert(); - this.outputInvert( i , m.rawData , r ) ; - - - - } - - public testCopyRowTo() - { - - var v : away.geom.Vector3D = new away.geom.Vector3D(); - var m: away.geom.Matrix3D - var i : boolean; - var r : Array = new Array ( 16 ) ; - - m = new away.geom.Matrix3D( [ 1,2,4,5, - 6,7,8,9, - 4,0,1,7, - 5,8,7,1]); - - m.copyRowTo( 0, v) ; console.log ( v ) ; - m.copyRowTo( 1, v) ; console.log ( v ) ; - m.copyRowTo( 2, v) ; console.log ( v ) ; - m.copyRowTo( 3, v) ; console.log ( v ) ; - - - - /* - - m.copyRowTo( 0, v) ; console.log ( v ) ; - m.copyRowTo( 1, v) ; console.log ( v ) ; - m.copyRowTo( 2, v) ; console.log ( v ) ; - m.copyRowTo( 3, v) ; console.log ( v ) ; - - v.w = v.x = v.y = v.z = 0; - m.copyRowFrom( 0 , v ); console.log (m.rawData ) ; - v.w = v.x = v.y = v.z = 1; - m.copyRowFrom( 1 , v ); console.log ( m.rawData ) ; - v.w = v.x = v.y = v.z = 2; - m.copyRowFrom( 2 , v ); console.log ( m.rawData ) ; - v.w = v.x = v.y = v.z = 3; - m.copyRowFrom( 3 , v ); console.log ( m.rawData ) ; - - [0, 2, 4, 5, 0, 7, 8, 9, 0, 0, 1, 7, 0, 8, 7, 1] VextMat3DTests.ts:73 - 0, 2, 4, 5, 0, 7, 8, 9, 0, 0, 1, 7, 0, 8, 7, 1 // AS3 - - [0, 1, 4, 5, 0, 1, 8, 9, 0, 1, 1, 7, 0, 1, 7, 1] VextMat3DTests.ts:75 - 0, 1, 4, 5, 0, 1, 8, 9, 0, 1, 1, 7, 0, 1, 7, 1 // AS3 - - [0, 1, 2, 5, 0, 1, 2, 9, 0, 1, 2, 7, 0, 1, 2, 1] VextMat3DTests.ts:77 - 0, 1, 2, 5, 0, 1, 2, 9, 0, 1, 2, 7, 0, 1, 2, 1 // AS3 - - [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] - 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 // AS3s - - - */ - - - } - public testCopyColumnTo() - { - - var v : away.geom.Vector3D = new away.geom.Vector3D(); - var m: away.geom.Matrix3D - var i : boolean; - var r : Array = new Array ( 16 ) ; - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1] ); - - - m = new away.geom.Matrix3D( [ 1,2,3,4, - 5,6,7,8, - 9,10,1,12, - 13,14,15,16]); - - m.copyColumnTo( 0, v) ; console.log (v.toString() ) ; - m.copyColumnTo( 1, v) ; console.log ( v.toString() ) ; - m.copyColumnTo( 2, v) ; console.log ( v.toString() ) ; - m.copyColumnTo( 3, v) ; console.log ( v.toString() ) ; - - v.w = v.x = v.y = v.z = 0; - m.copyColumnFrom( 0 , v ); console.log (m.rawData ) ; - v.w = v.x = v.y = v.z = 1; - m.copyColumnFrom( 1 , v ); console.log ( m.rawData ) ; - v.w = v.x = v.y = v.z = 2; - m.copyColumnFrom( 2 , v ); console.log ( m.rawData ) ; - v.w = v.x = v.y = v.z = 3; - m.copyColumnFrom( 3 , v ); console.log ( m.rawData ) ; - - /* - - VextMat3DTests.ts:67 - [Vector3D] VextMat3DTests.ts:68 - [Vector3D] VextMat3DTests.ts:69 - [Vector3D] VextMat3DTests.ts:70 - Vector3D(1, 2, 3) - (x:1 ,y:2, z3, w:4) - - Vector3D(5, 6, 7) - (x:5 ,y:6, z7, w:8) - - Vector3D(9, 10, 1) - (x:9 ,y:10, z1, w:12) - - Vector3D(13, 14, 15) - (x:13 ,y:14, z15, w:16) - - [0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 1, 12, 13, 14, 15, 16] VextMat3DTests.ts:73 - 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 1, 12, 13, 14, 15, 16 - - [0, 0, 0, 0, 1, 1, 1, 1, 9, 10, 1, 12, 13, 14, 15, 16] VextMat3DTests.ts:75 - 0, 0, 0, 0, 1, 1, 1, 1, 9, 10, 1, 12, 13, 14, 15, 16 - - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 13, 14, 15, 16 - [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 13, 14, 15, 16] VextMat3DTests.ts:77 - - 0, 0, 0, 0 ,1, 1, 1, 1, 2, 2, 2, 2, 3, 3 , 3 ,3 - [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3] - - */ - - } - - public outputAppendRotation(result : number[] , original : number[] , axis : away.geom.Vector3D , pivot : away.geom.Vector3D ) - { - - //var axis : number[] = new Array( axis.x , axis.y , axis.z ); - //var pivot : number[] = new Array( pivot.x , pivot.y , pivot.z ); - - var a : string = 'new Vector3D( ' + axis.x + ' , ' + axis.y + ' , ' + axis.z + ' )'; - var p : string = 'new Vector3D( ' + pivot.x + ' , ' + pivot.y + ' , ' + pivot.z + ' )'; - - console.log( 'testAppendRotation( new [' + result + '], new [' + original + '] , ' + a + ' , ' + p + ');' ) ; - - } - - public outputInvert(success : boolean , data : Array , original : Array ) - { - - console.log( 'testInvert(' + success + ', new [' + data + '], new [' + original + ']);' ) ; - - } - - public output( data : Array , result : number ) - { - - console.log( 'testDeterminant( new [' + data + '], ' + result + ');' ) ; - - } - - public getRnd( max : number , min : number ) : number { - - return Math.floor(Math.random() * (max - min + 1)) + min; - } - - - } -} + var d : Matrix3D= new Matrix3D( ); + t.prependRotation( 90 , v )//, v1 ) + console.log( t.rawData ); + } + + public testcopyToMatrix3D() : void + { + var v : Vector3D = new Vector3D( 0 , 2 , 3 ) + var v1 : Vector3D = new Vector3D( 4 , 0 , 6 ) + var v2 : Vector3D = new Vector3D( 7 , 8 , 0 ) + + var t : Matrix3D= new Matrix3D( [ 0, 10, 10, 1, + 10, 5, 10, 10, + 10, 10, 5, 10, + 1, 10, 10, 0 ] ); + + var d : Matrix3D= new Matrix3D( ); + //t.copyToMatrix3D( d ) ; + + console.log( d.rawData ); + } + + public testDecompose() : void + { + console.log( '----------------------------------------------------------------------'); + console.log( 'testDecompose'); + var v : Vector3D[] ; + var m: Matrix3D; + var r : Array = new Array ( 16 ) ; + + for ( var c : number = 0 ; c < 10 ; c ++ ) + { + + + m = new Matrix3D( [ this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), + this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), + this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), + this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ), this.getRnd( -100 , 100 ) ] ); + + + m.copyRawDataTo( r ); + + v = m.decompose(); + this.outputDecompose(m.rawData , r , v[0], v[1], v[2]); + + + } + + console.log('//------------------------------------------------------------ AS3'); + console.log( 'private function testDecompose( result : Vector. , original : Vector. , a1 : Vector3D , a2 : Vector3D , a3 : Vector3D )' ); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' var result : Vector. = m.decompose();'); + console.log(" trace('0----------------------------------------');"); + console.log(" trace( r[0])"); + console.log(" trace( a1 )"); + console.log(" trace('1--------------------');"); + console.log(" trace( r[1])"); + console.log(" trace( a2 )"); + console.log(" trace('2--------------------');"); + console.log(" trace( r[2])"); + console.log(" trace( a3 )"); + console.log(" trace('--------------------');"); + console.log(" trace( 'TSResult: ' , result );"); + console.log(" trace( 'ASResult: ' , m.rawData );"); + console.log(" trace( 'original: ' , original );"); + console.log(" trace('--------------------');"); + console.log('}'); + } + + public outputDecompose(result : number[] , original : number[] , a1 : Vector3D , a2 : Vector3D , a3 : Vector3D) + { + var s1 : string = 'new Vector3D( ' + a1.x + ' , ' + a1.y + ' , ' + a1.z + ' )'; + var s2 : string = 'new Vector3D( ' + a2.x + ' , ' + a2.y + ' , ' + a2.z + ' )'; + var s3 : string = 'new Vector3D( ' + a3.x + ' , ' + a3.y + ' , ' + a3.z + ' )'; + + console.log( 'testDecompose( new [' + result + '], new [' + original + '] , ' + s1 + ' , '+ s2 + ' , ' + s3 + ' );' ) ; + } + + public testPosition() : void + { + console.log( '----------------------------------------------------------------------'); + console.log( 'testPosition'); + var v : Vector3D = new Vector3D( 1 , 2 , 3 ); + var p : Vector3D = new Vector3D( 2 , 2 , 2 ); + var pos : Vector3D; + + var m: Matrix3D; + var i : boolean; + var r : Array = new Array ( 16 ) ; + + m = new Matrix3D( [ 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1 ] ); + m.copyRawDataTo( r ); + m.position = v; + pos = m.position; + this.outputPosition(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1] ); + m.copyRawDataTo( r ); + m.position = v; + pos = m.position; + this.outputPosition(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1] ); + m.copyRawDataTo( r ); + m.position = v; + pos = m.position; + this.outputPosition(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1] ); + m.copyRawDataTo( r ); + m.position = v; + pos = m.position; + this.outputPosition(m.rawData , r , v ); + + console.log('//------------------------------------------------------------ AS3'); + console.log( 'private function testPosition( result : Vector. , original : Vector. , t : Vector3D )' ); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' m.position = t;'); + console.log(' var p : Vector3D = m.position;'); + console.log(' trace( "TSResult: " , result );'); + console.log(' trace( "ASResult: " , m.rawData );'); + console.log(' trace( "Pos: " ,p );'); + console.log('}'); + } + + public outputPosition(result : number[] , original : number[] , posResult : Vector3D ) + { + var a : string = 'new Vector3D( ' + posResult.x + ' , ' + posResult.y + ' , ' + posResult.z + ' )'; + console.log( 'testPosition( new [' + result + '], new [' + original + '] , ' + a + ');' ) ; + } + + + public testAppendScale() : void + { + console.log( '----------------------------------------------------------------------'); + console.log( 'testAppendScale'); + var v : Vector3D = new Vector3D( 1 , 2 , 3 ); + var p : Vector3D = new Vector3D( 2 , 2 , 2 ); + + var m: Matrix3D; + var i : boolean; + var r : Array = new Array ( 16 ) ; + + m = new Matrix3D( [ 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1 ] ); + m.copyRawDataTo( r ); + m.appendScale(v.x , v.y , v.z ) ; + + this.outputAppendScale(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1] ); + + m.copyRawDataTo( r ) + m.appendScale(v.x , v.y , v.z ) ; + this.outputAppendScale(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1] ); + + m.copyRawDataTo( r ) + m.appendScale(v.x , v.y , v.z ) ; + this.outputAppendScale(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1] ); + + m.copyRawDataTo( r ) + m.appendScale(v.x , v.y , v.z ) ; + this.outputAppendScale(m.rawData , r, v ); + + console.log('//------------------------------------------------------------ AS3'); + console.log( 'private function testAppendScale( result : Vector. , original : Vector. , t : Vector3D )' ); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' m.appendScale( t.x , t.y , t.z );'); + console.log(' trace( "TSResult: " , result );'); + console.log(' trace( "ASResult: " , m.rawData );'); + console.log('}'); + } + + + public outputAppendScale(result : number[] , original : number[] , v : Vector3D ) + { + var a : string = 'new Vector3D( ' + v.x + ' , ' + v.y + ' , ' + v.z + ' )'; + console.log( 'testAppendScale( new [' + result + '], new [' + original + '] , ' + a + ');' ) ; + } + + public testAppendTranslation() : void + { + console.log( '----------------------------------------------------------------------'); + console.log( 'testAppendTranslation'); + var v : Vector3D = new Vector3D( 1 , 2 , 3 ); + var p : Vector3D = new Vector3D( 2 , 2 , 2 ); + + var m: Matrix3D; + var i : boolean; + var r : Array = new Array ( 16 ) ; + + m = new Matrix3D( [ 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1 ] ); + m.copyRawDataTo( r ); + m.appendTranslation(v.x , v.y , v.z ) ; + + this.outputAppendTranslation(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1] ); + + m.copyRawDataTo( r ) + m.appendTranslation(v.x , v.y , v.z ) ; + this.outputAppendTranslation(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1] ); + + m.copyRawDataTo( r ) + m.appendTranslation(v.x , v.y , v.z ) ; + this.outputAppendTranslation(m.rawData , r , v ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1] ); + + m.copyRawDataTo( r ) + m.appendTranslation(v.x , v.y , v.z ) ; + this.outputAppendTranslation(m.rawData , r, v ); + + console.log('//------------------------------------------------------------ AS3'); + console.log( 'private function testAppendTranslation( result : Vector. , original : Vector. , t : Vector3D )' ); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' m.appendTranslation( t.x , t.y , t.z );'); + console.log(' trace( "TSResult: " , result );'); + console.log(' trace( "ASResult: " , m.rawData );'); + console.log('}'); + } + + public outputAppendTranslation(result : number[] , original : number[] , v : Vector3D ) + { + var a : string = 'new Vector3D( ' + v.x + ' , ' + v.y + ' , ' + v.z + ' )'; + console.log( 'testAppendTranslation( new [' + result + '], new [' + original + '] , ' + a + ');' ) ; + } + + public testAppendRotation() : void + { + console.log( '----------------------------------------------------------------------'); + console.log( 'testAppendRotation'); + + var v : Vector3D = new Vector3D( 1 , 2 , 3 ); + var p : Vector3D = new Vector3D( 2 , 2 , 2 ); + + var m: Matrix3D; + var i : boolean; + var r : Array = new Array ( 16 ) ; + + m = new Matrix3D( [ 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1 ] ); + m.copyRawDataTo( r ); + m.appendRotation( 90 , v );// , p ); + + this.outputAppendRotation(m.rawData , r , v , p ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1] ); + + m.copyRawDataTo( r ) + m.appendRotation( 90 , v );//, p ); + this.outputAppendRotation(m.rawData , r , v , p ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1] ); + + m.copyRawDataTo( r ) + m.appendRotation( 90 , v );//, p ); + this.outputAppendRotation(m.rawData , r , v , p ); + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1] ); + + m.copyRawDataTo( r ) + m.appendRotation( 90 , v );//, p ); + this.outputAppendRotation(m.rawData , r, v , p ); + + console.log('//------------------------------------------------------------ AS3'); + console.log( 'private function testAppendRotation( result : Vector. , original : Vector. , axis : Vector3D , pivot : Vector3D )' ); + console.log('{'); + console.log(' var m : Matrix3D = new Matrix3D( original );'); + console.log(' m.appendRotation( 90 , axis , pivot );'); + console.log(' trace( "TSResult: " , result );'); + console.log(' trace( "ASResult: " , m.rawData );'); + console.log('}'); + } + + public testInvert() : void + { + var v : Vector3D = new Vector3D(); + var m: Matrix3D + var i : boolean; + var r : Array = new Array ( 16 ) ; + + m = new Matrix3D( [ 1, 2, 4, 5, + 2, 1, 0, 8, + 4, 0, 1, 7, + 5, 8, 7, 1 ] ); + m.copyRawDataTo( r ) + i = m.invert(); + this.outputInvert( i , m.rawData , r ) ; + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 7, + 5, 0, 7, 1] ); + + m.copyRawDataTo( r ) + i = m.invert(); + this.outputInvert( i , m.rawData , r ) ; + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 2, + 5, 0, 2, 1] ); + + m.copyRawDataTo( r ) + i = m.invert(); + this.outputInvert( i , m.rawData , r ) ; + } + + public testCopyRowTo() + { + var v : Vector3D = new Vector3D(); + var m: Matrix3D + var i : boolean; + var r : Array = new Array ( 16 ) ; + + m = new Matrix3D( [ 1,2,4,5, + 6,7,8,9, + 4,0,1,7, + 5,8,7,1]); + + m.copyRowTo( 0, v) ; console.log ( v ) ; + m.copyRowTo( 1, v) ; console.log ( v ) ; + m.copyRowTo( 2, v) ; console.log ( v ) ; + m.copyRowTo( 3, v) ; console.log ( v ) ; + } + + public testCopyColumnTo() + { + var v : Vector3D = new Vector3D(); + var m: Matrix3D + var i : boolean; + var r : Array = new Array ( 16 ) ; + + m = new Matrix3D( [ 1, 0, 4, 5, + 0, 1, 8, 0, + 4, 8, 1, 1, + 5, 0, 1, 1] ); + + + m = new Matrix3D( [ 1,2,3,4, + 5,6,7,8, + 9,10,1,12, + 13,14,15,16]); + + m.copyColumnTo( 0, v) ; console.log (v.toString() ) ; + m.copyColumnTo( 1, v) ; console.log ( v.toString() ) ; + m.copyColumnTo( 2, v) ; console.log ( v.toString() ) ; + m.copyColumnTo( 3, v) ; console.log ( v.toString() ) ; + + v.w = v.x = v.y = v.z = 0; + m.copyColumnFrom( 0 , v ); console.log (m.rawData ) ; + v.w = v.x = v.y = v.z = 1; + m.copyColumnFrom( 1 , v ); console.log ( m.rawData ) ; + v.w = v.x = v.y = v.z = 2; + m.copyColumnFrom( 2 , v ); console.log ( m.rawData ) ; + v.w = v.x = v.y = v.z = 3; + m.copyColumnFrom( 3 , v ); console.log ( m.rawData ) ; + } + + public outputAppendRotation(result : number[] , original : number[] , axis : Vector3D , pivot : Vector3D ) + { + var a : string = 'new Vector3D( ' + axis.x + ' , ' + axis.y + ' , ' + axis.z + ' )'; + var p : string = 'new Vector3D( ' + pivot.x + ' , ' + pivot.y + ' , ' + pivot.z + ' )'; + + console.log( 'testAppendRotation( new [' + result + '], new [' + original + '] , ' + a + ' , ' + p + ');' ) ; + } + + public outputInvert(success : boolean , data : Array , original : Array ) + { + console.log( 'testInvert(' + success + ', new [' + data + '], new [' + original + ']);' ) ; + } + + public output( data : Array , result : number ) + { + console.log( 'testDeterminant( new [' + data + '], ' + result + ');' ) ; + } + + public getRnd( max : number , min : number ) : number { + + return Math.floor(Math.random() * (max - min + 1)) + min; + } +} \ No newline at end of file diff --git a/tests/index.html b/tests/index.html index 5d02313b..b0152c30 100755 --- a/tests/index.html +++ b/tests/index.html @@ -12,83 +12,83 @@ - + '; - html += ''; - html += ''; - html += ''; - html += ''; - - return html; - }; - - //------------------------------------------------------------------------------ - // Utils - /** - * - * Util function - get Element by ID - * - * @param id - * @returns {HTMLElement} - */ - AppHarness.prototype.getId = function (id) { - return document.getElementById(id); - }; - - //------------------------------------------------------------------------------ - // Events - /** - * - * Dropbox event handler - * - * @param e - */ - AppHarness.prototype.dropDownChange = function (e) { - this.dropDown.options[this.dropDown.selectedIndex].value; - this.counter = this.dropDown.selectedIndex; - var dataIndex = parseInt(this.dropDown.options[this.dropDown.selectedIndex].value); - - if (!isNaN(dataIndex)) { - this.navigateToSection(this.tests[dataIndex]); - } - }; - return AppHarness; - })(); - away.AppHarness = AppHarness; - - //--------------------------------------------------- - // Application Frame - var AppFrame = (function () { - function AppFrame() { - this.classPath = ''; - this.jsPath = ''; - var queryParams = Utils.getQueryParams(document.location.search); - - if (queryParams.js != undefined && queryParams.name != undefined) { - this.jsPath = queryParams.js; - this.classPath = queryParams.name; - this.loadJS(this.jsPath); - } - } - /** - * - * Load a JavaScript file - * - * @param url - URL of JavaScript file - */ - AppFrame.prototype.loadJS = function (url) { - var _this = this; - var head = document.getElementsByTagName("head")[0]; - var script = document.createElement("script"); - script.type = "text/javascript"; - script.src = url; - script.onload = function () { - return _this.jsLoaded(); - }; - - head.appendChild(script); - }; - - /** - * - * Event Handler for loaded JavaScript files - * - */ - AppFrame.prototype.jsLoaded = function () { - var createPath = this.classPath.split('.'); - var obj; - - for (var c = 0; c < createPath.length; c++) { - if (obj == null) { - obj = window[createPath[c]]; // reference base module ( will be a child of the window ) - } else { - obj = obj[createPath[c]]; // reference sub module / Class - } - } - - if (obj != null) { - new obj(); // if Class has been found - start the test - } - }; - return AppFrame; - })(); - away.AppFrame = AppFrame; - - //--------------------------------------------------- - // Common Utilities - var Utils = (function () { - function Utils() { - } - /** - * - * Utility function - Parse a Query formatted string - * - * @param qs - * @returns {{}} - */ - Utils.getQueryParams = function (qs) { - qs = qs.split("+").join(" "); - - var params = {}, tokens, re = /[?&]?([^=]+)=([^&]*)/g; - - while (tokens = re.exec(qs)) { - params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]); - } - - return params; - }; - return Utils; - })(); - away.Utils = Utils; - - //--------------------------------------------------- - // Data - var TestData = (function () { - function TestData(name, classpath, js, src) { - this.js = js; - this.classpath = classpath; - this.src = src; - this.name = name; - } - return TestData; - })(); -})(away || (away = {})); -//# sourceMappingURL=AppHarness.js.map diff --git a/tests/js/AppHarness.js.map b/tests/js/AppHarness.js.map deleted file mode 100644 index a709ab63..00000000 --- a/tests/js/AppHarness.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AppHarness.js","sourceRoot":"","sources":["../AppHarness.ts"],"names":["away","away.AppHarness","away.AppHarness.constructor","away.AppHarness.load","away.AppHarness.addTest","away.AppHarness.addSeperator","away.AppHarness.start","away.AppHarness.loadFromURL","away.AppHarness.initInterface","away.AppHarness.initFrameSet","away.AppHarness.nagigateBy","away.AppHarness.navigateToSection","away.AppHarness.toggleSource","away.AppHarness.createSourceViewHTML","away.AppHarness.getId","away.AppHarness.dropDownChange","away.AppFrame","away.AppFrame.constructor","away.AppFrame.loadJS","away.AppFrame.jsLoaded","away.Utils","away.Utils.constructor","away.Utils.getQueryParams","away.TestData","away.TestData.constructor"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/AssetLibraryTest.js b/tests/js/AssetLibraryTest.js deleted file mode 100644 index 4d80237e..00000000 --- a/tests/js/AssetLibraryTest.js +++ /dev/null @@ -1,250 +0,0 @@ -/// -var __extends = this.__extends || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var parsers; -(function (parsers) { - /** - * ImageParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - var JSONTextureParser = (function (_super) { - __extends(JSONTextureParser, _super); - //private var _loader : Loader; - /** - * Creates a new ImageParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - function JSONTextureParser() { - _super.call(this, away.parsers.ParserDataFormat.PLAIN_TEXT); - //private var _byteData : ByteArray; - this.STATE_PARSE_DATA = 0; - this.STATE_LOAD_IMAGES = 1; - this.STATE_COMPLETE = 2; - this._state = -1; - this._dependencyCount = 0; - - this._loadedTextures = new Array(); - this._state = this.STATE_PARSE_DATA; - } - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - JSONTextureParser.supportsType = function (extension) { - extension = extension.toLowerCase(); - return extension == "json"; - }; - - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - JSONTextureParser.supportsData = function (data) { - try { - var obj = JSON.parse(data); - - if (obj) { - return true; - } - - return false; - } catch (e) { - return false; - } - - return false; - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._iResolveDependency = function (resourceDependency) { - var resource = resourceDependency.assets[0]; - - this._pFinalizeAsset(resource, resourceDependency._iLoader.url); - - this._loadedTextures.push(resource); - - //console.log( 'JSONTextureParser._iResolveDependency' , resourceDependency ); - //console.log( 'JSONTextureParser._iResolveDependency resource: ' , resource ); - this._dependencyCount--; - - if (this._dependencyCount == 0) { - this._state = this.STATE_COMPLETE; - } - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._iResolveDependencyFailure = function (resourceDependency) { - //console.log( '-----------------------------------------------------------'); - //console.log( 'JSONTextureParser._iResolveDependencyFailure', 'x' , resourceDependency ); - this._dependencyCount--; - - if (this._dependencyCount == 0) { - this._state = this.STATE_COMPLETE; - //console.log( 'JSONTextureParser._iResolveDependencyFailure.complete' ); - } - /* - - - if (_dependencyCount == 0) - _parseState = DAEParserState.PARSE_MATERIALS; - */ - }; - - JSONTextureParser.prototype.parseJson = function () { - //console.log( 'JSONTextureParser.parseJson' , typeof this.data ); - if (JSONTextureParser.supportsData(this.data)) { - try { - var json = JSON.parse(this.data); - var data = json.data; - - var rec; - var rq; - - for (var c = 0; c < data.length; c++) { - rec = data[c]; - - var uri = rec.image; - var id = rec.id; - - rq = new away.net.URLRequest(uri); - - //console.log( 'JSONTextureParser.parseJson' , id , uri ); - //console.log( 'JSONTextureParser.parseJson' , id , uri ); - this._pAddDependency('JSON_ID_' + id, rq, false, null, true); - } - - this._dependencyCount = data.length; - this._state = this.STATE_LOAD_IMAGES; - - this._pPauseAndRetrieveDependencies(); //pauseAndRetrieveDependencies - } catch (e) { - this._state = this.STATE_COMPLETE; - } - } - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._pProceedParsing = function () { - console.log('JSONTextureParser._pProceedParsing', this._state); - - switch (this._state) { - case this.STATE_PARSE_DATA: - this.parseJson(); - return away.parsers.ParserBase.MORE_TO_PARSE; - - break; - - case this.STATE_LOAD_IMAGES: - break; - - case this.STATE_COMPLETE: - //console.log( 'JSONTextureParser._pProceedParsing: WE ARE DONE' ); // YAY; - return away.parsers.ParserBase.PARSING_DONE; - - break; - } - - return away.parsers.ParserBase.MORE_TO_PARSE; - /* - var asset : away.textures.Texture2DBase; - - if ( this.data instanceof HTMLImageElement ) - { - - asset = new away.textures.HTMLImageElementTexture( this.data ); - - if ( away.utils.TextureUtils.isHTMLImageElementValid( this.data ) ) - { - - - this._pFinalizeAsset( asset , this._iFileName ); - - - } - else - { - - this.dispatchEvent( new away.events.AssetEvent( away.events.AssetEvent.TEXTURE_SIZE_ERROR , asset ) ); - - } - - return away.loaders.ParserBase.PARSING_DONE; - - } - - return away.loaders.ParserBase.PARSING_DONE; - */ - }; - return JSONTextureParser; - })(away.parsers.ParserBase); - parsers.JSONTextureParser = JSONTextureParser; -})(parsers || (parsers = {})); -/// -/// -var tests; -(function (tests) { - (function (library) { - var AssetEvent = away.events.AssetEvent; - var LoaderEvent = away.events.LoaderEvent; - var ParserEvent = away.events.ParserEvent; - var AssetLibrary = away.library.AssetLibrary; - var AssetLoader = away.net.AssetLoader; - var AssetLoaderToken = away.net.AssetLoaderToken; - var URLRequest = away.net.URLRequest; - var Delegate = away.utils.Delegate; - - var AssetLibraryTest = (function () { - function AssetLibraryTest() { - this.height = 0; - AssetLibrary.enableParser(parsers.JSONTextureParser); - - this.token = AssetLibrary.load(new URLRequest('assets/JSNParserTest.json')); - this.token.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, Delegate.create(this, this.onResourceComplete)); - this.token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, Delegate.create(this, this.onAssetComplete)); - - this.token = AssetLibrary.load(new URLRequest('assets/1024x1024.png')); - this.token.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, Delegate.create(this, this.onResourceComplete)); - this.token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE, Delegate.create(this, this.onAssetComplete)); - } - AssetLibraryTest.prototype.onAssetComplete = function (e) { - console.log('------------------------------------------------------------------------------'); - console.log('away.events.AssetEvent.ASSET_COMPLETE', AssetLibrary.getAsset(e.asset.name)); - console.log('------------------------------------------------------------------------------'); - - var imageTexture = AssetLibrary.getAsset(e.asset.name); - - document.body.appendChild(imageTexture.htmlImageElement); - - imageTexture.htmlImageElement.style.position = 'absolute'; - imageTexture.htmlImageElement.style.top = this.height + 'px'; - - this.height += (imageTexture.htmlImageElement.height + 10); - }; - AssetLibraryTest.prototype.onResourceComplete = function (e) { - var loader = e.target; - - console.log('------------------------------------------------------------------------------'); - console.log('away.events.LoaderEvent.RESOURCE_COMPLETE', e); - console.log('------------------------------------------------------------------------------'); - }; - return AssetLibraryTest; - })(); - library.AssetLibraryTest = AssetLibraryTest; - })(tests.library || (tests.library = {})); - var library = tests.library; -})(tests || (tests = {})); -//# sourceMappingURL=AssetLibraryTest.js.map diff --git a/tests/js/AssetLibraryTest.js.map b/tests/js/AssetLibraryTest.js.map deleted file mode 100644 index 107b3f67..00000000 --- a/tests/js/AssetLibraryTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AssetLibraryTest.js","sourceRoot":"","sources":["../parsers/JSONTextureParser.ts","../library/AssetLibraryTest.ts"],"names":["parsers","parsers.JSONTextureParser","parsers.JSONTextureParser.constructor","parsers.JSONTextureParser.supportsType","parsers.JSONTextureParser.supportsData","parsers.JSONTextureParser._iResolveDependency","parsers.JSONTextureParser._iResolveDependencyFailure","parsers.JSONTextureParser.parseJson","parsers.JSONTextureParser._pProceedParsing","tests","tests.library","tests.library.AssetLibraryTest","tests.library.AssetLibraryTest.constructor","tests.library.AssetLibraryTest.onAssetComplete","tests.library.AssetLibraryTest.onResourceComplete"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/AssetLoaderTest.js b/tests/js/AssetLoaderTest.js deleted file mode 100644 index b8c4eb01..00000000 --- a/tests/js/AssetLoaderTest.js +++ /dev/null @@ -1,273 +0,0 @@ -/// -var __extends = this.__extends || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var parsers; -(function (parsers) { - /** - * ImageParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - var JSONTextureParser = (function (_super) { - __extends(JSONTextureParser, _super); - //private var _loader : Loader; - /** - * Creates a new ImageParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - function JSONTextureParser() { - _super.call(this, away.parsers.ParserDataFormat.PLAIN_TEXT); - //private var _byteData : ByteArray; - this.STATE_PARSE_DATA = 0; - this.STATE_LOAD_IMAGES = 1; - this.STATE_COMPLETE = 2; - this._state = -1; - this._dependencyCount = 0; - - this._loadedTextures = new Array(); - this._state = this.STATE_PARSE_DATA; - } - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - JSONTextureParser.supportsType = function (extension) { - extension = extension.toLowerCase(); - return extension == "json"; - }; - - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - JSONTextureParser.supportsData = function (data) { - try { - var obj = JSON.parse(data); - - if (obj) { - return true; - } - - return false; - } catch (e) { - return false; - } - - return false; - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._iResolveDependency = function (resourceDependency) { - var resource = resourceDependency.assets[0]; - - this._pFinalizeAsset(resource, resourceDependency._iLoader.url); - - this._loadedTextures.push(resource); - - //console.log( 'JSONTextureParser._iResolveDependency' , resourceDependency ); - //console.log( 'JSONTextureParser._iResolveDependency resource: ' , resource ); - this._dependencyCount--; - - if (this._dependencyCount == 0) { - this._state = this.STATE_COMPLETE; - } - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._iResolveDependencyFailure = function (resourceDependency) { - //console.log( '-----------------------------------------------------------'); - //console.log( 'JSONTextureParser._iResolveDependencyFailure', 'x' , resourceDependency ); - this._dependencyCount--; - - if (this._dependencyCount == 0) { - this._state = this.STATE_COMPLETE; - //console.log( 'JSONTextureParser._iResolveDependencyFailure.complete' ); - } - /* - - - if (_dependencyCount == 0) - _parseState = DAEParserState.PARSE_MATERIALS; - */ - }; - - JSONTextureParser.prototype.parseJson = function () { - //console.log( 'JSONTextureParser.parseJson' , typeof this.data ); - if (JSONTextureParser.supportsData(this.data)) { - try { - var json = JSON.parse(this.data); - var data = json.data; - - var rec; - var rq; - - for (var c = 0; c < data.length; c++) { - rec = data[c]; - - var uri = rec.image; - var id = rec.id; - - rq = new away.net.URLRequest(uri); - - //console.log( 'JSONTextureParser.parseJson' , id , uri ); - //console.log( 'JSONTextureParser.parseJson' , id , uri ); - this._pAddDependency('JSON_ID_' + id, rq, false, null, true); - } - - this._dependencyCount = data.length; - this._state = this.STATE_LOAD_IMAGES; - - this._pPauseAndRetrieveDependencies(); //pauseAndRetrieveDependencies - } catch (e) { - this._state = this.STATE_COMPLETE; - } - } - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._pProceedParsing = function () { - console.log('JSONTextureParser._pProceedParsing', this._state); - - switch (this._state) { - case this.STATE_PARSE_DATA: - this.parseJson(); - return away.parsers.ParserBase.MORE_TO_PARSE; - - break; - - case this.STATE_LOAD_IMAGES: - break; - - case this.STATE_COMPLETE: - //console.log( 'JSONTextureParser._pProceedParsing: WE ARE DONE' ); // YAY; - return away.parsers.ParserBase.PARSING_DONE; - - break; - } - - return away.parsers.ParserBase.MORE_TO_PARSE; - /* - var asset : away.textures.Texture2DBase; - - if ( this.data instanceof HTMLImageElement ) - { - - asset = new away.textures.HTMLImageElementTexture( this.data ); - - if ( away.utils.TextureUtils.isHTMLImageElementValid( this.data ) ) - { - - - this._pFinalizeAsset( asset , this._iFileName ); - - - } - else - { - - this.dispatchEvent( new away.events.AssetEvent( away.events.AssetEvent.TEXTURE_SIZE_ERROR , asset ) ); - - } - - return away.loaders.ParserBase.PARSING_DONE; - - } - - return away.loaders.ParserBase.PARSING_DONE; - */ - }; - return JSONTextureParser; - })(away.parsers.ParserBase); - parsers.JSONTextureParser = JSONTextureParser; -})(parsers || (parsers = {})); -/// -/// -var tests; -(function (tests) { - (function (net) { - var AssetEvent = away.events.AssetEvent; - var LoaderEvent = away.events.LoaderEvent; - var ParserEvent = away.events.ParserEvent; - var AssetLoader = away.net.AssetLoader; - var AssetLoaderToken = away.net.AssetLoaderToken; - var URLRequest = away.net.URLRequest; - var Delegate = away.utils.Delegate; - - var AssetLoaderTest = (function () { - function AssetLoaderTest() { - //--------------------------------------------------------------------------------------------------------------------- - // Enable Custom Parser ( JSON file format with multiple texture dependencies ) - AssetLoader.enableParser(parsers.JSONTextureParser); - - var token; - var urlRq; - - //--------------------------------------------------------------------------------------------------------------------- - // LOAD A SINGLE IMAGE - this.alImage = new AssetLoader(); - urlRq = new URLRequest('assets/1024x1024.png'); - token = this.alImage.load(urlRq); - - token.addEventListener(AssetEvent.ASSET_COMPLETE, Delegate.create(this, this.onAssetComplete)); - token.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, Delegate.create(this, this.onTextureSizeError)); - - //--------------------------------------------------------------------------------------------------------------------- - // LOAD A SINGLE IMAGE - With wrong dimensions - this.alErrorImage = new AssetLoader(); - urlRq = new URLRequest('assets/2.png'); - token = this.alErrorImage.load(urlRq); - - token.addEventListener(AssetEvent.ASSET_COMPLETE, Delegate.create(this, this.onAssetComplete)); - token.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, Delegate.create(this, this.onTextureSizeError)); - - //--------------------------------------------------------------------------------------------------------------------- - // LOAD WITH A JSON PARSER - this.alJson = new AssetLoader(); - urlRq = new URLRequest('assets/JSNParserTest.json'); - token = this.alJson.load(urlRq); - - token.addEventListener(AssetEvent.ASSET_COMPLETE, Delegate.create(this, this.onAssetComplete)); - token.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, Delegate.create(this, this.onTextureSizeError)); - token.addEventListener(ParserEvent.PARSE_COMPLETE, Delegate.create(this, this.onParseComplete)); - } - AssetLoaderTest.prototype.onParseComplete = function (e) { - console.log('--------------------------------------------------------------------------------'); - console.log('AssetLoaderTest.onParseComplete', e); - console.log('--------------------------------------------------------------------------------'); - }; - - AssetLoaderTest.prototype.onTextureSizeError = function (e) { - var assetLoader = e.target; - - console.log('--------------------------------------------------------------------------------'); - console.log('AssetLoaderTest.onTextureSizeError', assetLoader.baseDependency._iLoader.url, e); - console.log('--------------------------------------------------------------------------------'); - }; - - AssetLoaderTest.prototype.onAssetComplete = function (e) { - var assetLoader = e.target; - - console.log('--------------------------------------------------------------------------------'); - console.log('AssetLoaderTest.onAssetComplete', assetLoader.baseDependency._iLoader.url, e); - console.log('--------------------------------------------------------------------------------'); - }; - return AssetLoaderTest; - })(); - net.AssetLoaderTest = AssetLoaderTest; - })(tests.net || (tests.net = {})); - var net = tests.net; -})(tests || (tests = {})); -//# sourceMappingURL=AssetLoaderTest.js.map diff --git a/tests/js/AssetLoaderTest.js.map b/tests/js/AssetLoaderTest.js.map deleted file mode 100644 index 90fd71f0..00000000 --- a/tests/js/AssetLoaderTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"AssetLoaderTest.js","sourceRoot":"","sources":["../parsers/JSONTextureParser.ts","../net/AssetLoaderTest.ts"],"names":["parsers","parsers.JSONTextureParser","parsers.JSONTextureParser.constructor","parsers.JSONTextureParser.supportsType","parsers.JSONTextureParser.supportsData","parsers.JSONTextureParser._iResolveDependency","parsers.JSONTextureParser._iResolveDependencyFailure","parsers.JSONTextureParser.parseJson","parsers.JSONTextureParser._pProceedParsing","tests","tests.net","tests.net.AssetLoaderTest","tests.net.AssetLoaderTest.constructor","tests.net.AssetLoaderTest.onParseComplete","tests.net.AssetLoaderTest.onTextureSizeError","tests.net.AssetLoaderTest.onAssetComplete"],"mappings":"AAAA,oDAAoD;;;;;;;AAEpD,IAAO,OAAO;AAiQb,CAjQD,UAAO,OAAO;IAGbA;;;;MAIGA;IACHA;;QAoBCC,yCAPyCA;QAEzCA;;;;UAIGA;QACHA;YAGCC,WAAOA,OAAAA,IAAIA,CAACA,OAAOA,CAACA,gBAAgBA,CAACA,UAAUA,CAAEA;YArBlDA,4CAA4CA;YAEtCA,KAAQA,gBAAgBA,GAAmBA,CAACA,CAACA;YAC7CA,KAAQA,iBAAiBA,GAAkBA,CAACA,CAACA;YAC7CA,KAAQA,cAAcA,GAAqBA,CAACA,CAACA;YAE7CA,KAAQA,MAAMA,GAA6BA,CAACA,CAACA,CAACA;YAG9CA,KAAQA,gBAAgBA,GAAmBA,CAACA,CAACA;;YAczCA,IAAIA,CAACA,eAAeA,GAAGA,IAAIA,KAAKA,CAA8BA,CAACA;YAC/DA,IAAIA,CAACA,MAAMA,GAAGA,IAAIA,CAACA,gBAAgBA;QAG7CA,CAACA;QAQDD;;;;UAFGA;yCAEHA,UAA2BA,SAAkBA;YAG5CE,SAASA,GAAGA,SAASA,CAACA,WAAWA,CAACA,CAACA;YACnCA,OAAOA,SAASA,IAAIA,MAAMA;QAE3BA,CAACA;;QAODF;;;;UADGA;yCACHA,UAA2BA,IAAUA;YAG3BG,IACAA;gBAEIA,IAAIA,GAAGA,GAAGA,IAAIA,CAACA,KAAKA,CAAEA,IAAIA,CAAGA;;gBAE7BA,IAAKA,GAAGA,CACRA;oBAEIA,OAAOA,IAAIA;iBAEdA;;gBAEDA,OAAOA,KAAKA;aAGfA,CAACA,OAAQA,CAACA,CAAGA;gBAEVA,OAAOA,KAAKA;aAEfA;;YAEDA,OAAOA,KAAKA;QAEtBA,CAACA;;QAKKH;;UADGA;0DACHA,UAA2BA,kBAAkDA;YAGzEI,IAAIA,QAAQA,GAA+DA,kBAAkBA,CAACA,MAAMA,CAACA,CAACA,CAACA;;YAEvGA,IAAIA,CAACA,eAAeA,CAAwBA,QAAQA,EAAGA,kBAAkBA,CAACA,QAAQA,CAACA,GAAGA,CAAEA;;YAExFA,IAAIA,CAACA,eAAeA,CAACA,IAAIA,CAAEA,QAAQA,CAAEA;;YAErCA,8EAA8EA;YAC9EA,+EAA+EA;YAE/EA,IAAIA,CAACA,gBAAgBA,EAAEA;;YAEvBA,IAAKA,IAAIA,CAACA,gBAAgBA,IAAIA,CAACA,CAC/BA;gBAEIA,IAAIA,CAACA,MAAMA,GAAGA,IAAIA,CAACA,cAAcA;aAEpCA;QAELA,CAACA;;QAKDJ;;UADGA;iEACHA,UAAkCA,kBAAkDA;YAEhFK,8EAA8EA;YAC9EA,0FAA0FA;YAE1FA,IAAIA,CAACA,gBAAgBA,EAAEA;;YAEvBA,IAAKA,IAAIA,CAACA,gBAAgBA,IAAIA,CAACA,CAC/BA;gBAEIA,IAAIA,CAACA,MAAMA,GAAGA,IAAIA,CAACA,cAAcA;gBACjCA,yEAAyEA;aAE5EA;YACDA;;;;;cAKEA;QACNA,CAACA;;QAEDL,wCAAAA;YAGIM,kEAAkEA;YAElEA,IAAKA,iBAAiBA,CAACA,YAAYA,CAAEA,IAAIA,CAACA,IAAIA,CAAEA,CAChDA;gBAEIA,IACAA;oBAEIA,IAAIA,IAAIA,GAASA,IAAIA,CAACA,KAAKA,CAAEA,IAAIA,CAACA,IAAIA,CAAEA;oBACxCA,IAAIA,IAAIA,GAA6BA,IAAIA,CAACA,IAAIA;;oBAE9CA,IAAIA,GAAGA;oBACPA,IAAIA,EAAEA;;oBAENA,KAAMA,IAAIA,CAACA,GAAYA,CAACA,EAAGA,CAACA,GAAGA,IAAIA,CAACA,MAAMA,EAAGA,CAACA,EAAGA,CACjDA;wBAGIA,GAAGA,GAAmBA,IAAIA,CAACA,CAACA,CAACA;;wBAE7BA,IAAIA,GAAGA,GAAwBA,GAAGA,CAACA,KAAKA;wBACxCA,IAAIA,EAAEA,GAAyBA,GAAGA,CAACA,EAAEA;;wBAErCA,EAAEA,GAAoBA,IAAIA,IAAIA,CAACA,GAAGA,CAACA,UAAUA,CAAEA,GAAGA,CAAEA;;wBAEpDA,2DAA2DA;wBAC3DA,2DAA2DA;wBAE3DA,IAAIA,CAACA,eAAeA,CAAEA,UAAUA,GAAGA,EAAEA,EAAGA,EAAEA,EAAGA,KAAKA,EAAGA,IAAIA,EAAGA,IAAIA,CAAEA;qBAErEA;;oBAEDA,IAAIA,CAACA,gBAAgBA,GAAGA,IAAIA,CAACA,MAAMA;oBACnCA,IAAIA,CAACA,MAAMA,GAAGA,IAAIA,CAACA,iBAAiBA;;oBAEpCA,IAAIA,CAACA,8BAA8BA,CAACA,CAACA,EAACA,8BAA8BA;iBAEvEA,CAACA,OAAQA,CAACA,CAAGA;oBAEVA,IAAIA,CAACA,MAAMA,GAAGA,IAAIA,CAACA,cAAcA;iBAEpCA;aAGJA;QAELA,CAACA;;QAIPN;;UADGA;uDACHA;YAGUO,OAAOA,CAACA,GAAGA,CAAEA,oCAAoCA,EAAGA,IAAIA,CAACA,MAAMA,CAAEA;;YAEjEA,QAASA,IAAIA,CAACA,MAAMA,CAAEA;gBAGlBA,KAAKA,IAAIA,CAACA,gBAAgBA;oBAEtBA,IAAIA,CAACA,SAASA,CAACA,CAACA;oBAChBA,OAAOA,IAAIA,CAACA,OAAOA,CAACA,UAAUA,CAACA,aAAaA;;oBAE5CA,KAAMA;AAAAA;gBAEVA,KAAKA,IAAIA,CAACA,iBAAiBA;oBAKvBA,KAAMA;AAAAA;gBAIVA,KAAKA,IAAIA,CAACA,cAAcA;oBAEpBA,2EAA2EA;oBAC3EA,OAAOA,IAAIA,CAACA,OAAOA,CAACA,UAAUA,CAACA,YAAYA;;oBAE3CA,KAAMA;AAAAA,aAEbA;;YAEDA,OAAOA,IAAIA,CAACA,OAAOA,CAACA,UAAUA,CAACA,aAAaA;YAE5CA;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA4BEA;QACZA,CAACA;QAEFP,yBAACA;IAADA,CAACA,EAxPsCD,IAAIA,CAACA,OAAOA,CAACA,UAAUA,EAwP7DA;IAxPDA,8CAwPCA;AACFA,CAACA,6BAAA;ACnQD,oDAAoD;AACpD,uDAAuD;AAEvD,IAAO,KAAK;AA4FX,CA5FD,UAAO,KAAK;KAAZS,UAAaA,GAAGA;QAEfC,iBAAsBA,IAAIA,CAACA,MAAMA,CAACA,UAAUA;QAC5CA,kBAAuBA,IAAIA,CAACA,MAAMA,CAACA,WAAWA;QAC9CA,kBAAuBA,IAAIA,CAACA,MAAMA,CAACA,WAAWA;QAC9CA,kBAAuBA,IAAIA,CAACA,GAAGA,CAACA,WAAWA;QAC3CA,uBAA2BA,IAAIA,CAACA,GAAGA,CAACA,gBAAgBA;QACpDA,iBAAsBA,IAAIA,CAACA,GAAGA,CAACA,UAAUA;QACzCA,eAAqBA,IAAIA,CAACA,KAAKA,CAACA,QAAQA;;QAErCA;YAOIC;gBAGIC,uHAAuHA;gBACvHA,+EAA+EA;gBAC/EA,WAAWA,CAACA,YAAYA,CAAEA,OAAOA,CAACA,iBAAiBA,CAAEA;;gBAErDA,IAAIA,KAAKA;gBACTA,IAAIA,KAAKA;;gBAETA,uHAAuHA;gBACvHA,sBAAsBA;gBAEtBA,IAAIA,CAACA,OAAOA,GAAIA,IAAIA,WAAWA,CAACA,CAACA;gBACjCA,KAAKA,GAAWA,IAAIA,UAAUA,CAACA,sBAAsBA,CAACA;gBACtDA,KAAKA,GAAWA,IAAIA,CAACA,OAAOA,CAACA,IAAIA,CAAEA,KAAKA,CAAEA;;gBAE1CA,KAAKA,CAACA,gBAAgBA,CAAEA,UAAUA,CAACA,cAAcA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,eAAeA,CAACA,CAAEA;gBAChGA,KAAKA,CAACA,gBAAgBA,CAAEA,UAAUA,CAACA,kBAAkBA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,kBAAkBA,CAACA,CAAEA;;gBAEvGA,uHAAuHA;gBACvHA,8CAA8CA;gBAE9CA,IAAIA,CAACA,YAAYA,GAAMA,IAAIA,WAAWA,CAACA,CAACA;gBACxCA,KAAKA,GAAkBA,IAAIA,UAAUA,CAACA,cAAcA,CAACA;gBACrDA,KAAKA,GAAkBA,IAAIA,CAACA,YAAYA,CAACA,IAAIA,CAAEA,KAAKA,CAAEA;;gBAEtDA,KAAKA,CAACA,gBAAgBA,CAAEA,UAAUA,CAACA,cAAcA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,eAAeA,CAACA,CAAEA;gBAChGA,KAAKA,CAACA,gBAAgBA,CAAEA,UAAUA,CAACA,kBAAkBA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,kBAAkBA,CAACA,CAAEA;;gBAEvGA,uHAAuHA;gBACvHA,0BAA0BA;gBAE1BA,IAAIA,CAACA,MAAMA,GAAMA,IAAIA,WAAWA,CAACA,CAACA;gBAClCA,KAAKA,GAAYA,IAAIA,UAAUA,CAACA,2BAA2BA,CAACA;gBAC5DA,KAAKA,GAAYA,IAAIA,CAACA,MAAMA,CAACA,IAAIA,CAAEA,KAAKA,CAAEA;;gBAE1CA,KAAKA,CAACA,gBAAgBA,CAAEA,UAAUA,CAACA,cAAcA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,eAAeA,CAACA,CAAEA;gBAChGA,KAAKA,CAACA,gBAAgBA,CAAEA,UAAUA,CAACA,kBAAkBA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,kBAAkBA,CAACA,CAAEA;gBACvGA,KAAKA,CAACA,gBAAgBA,CAAEA,WAAWA,CAACA,cAAcA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,eAAeA,CAACA,CAAEA;YAErGA,CAACA;YAEDD,4CAAAA,UAAyBA,CAAeA;gBAGpCE,OAAOA,CAACA,GAAGA,CAAEA,kFAAkFA,CAACA;gBAChGA,OAAOA,CAACA,GAAGA,CAAEA,iCAAiCA,EAAGA,CAACA,CAAEA;gBACpDA,OAAOA,CAACA,GAAGA,CAAEA,kFAAkFA,CAACA;YACpGA,CAACA;;YAEDF,+CAAAA,UAA4BA,CAAcA;gBAGtCG,IAAIA,WAAWA,GAA+BA,CAACA,CAACA,MAAMA;;gBAEtDA,OAAOA,CAACA,GAAGA,CAAEA,kFAAkFA,CAACA;gBAChGA,OAAOA,CAACA,GAAGA,CAAEA,oCAAoCA,EAAGA,WAAWA,CAACA,cAAcA,CAACA,QAAQA,CAACA,GAAGA,EAAGA,CAACA,CAAEA;gBACjGA,OAAOA,CAACA,GAAGA,CAAEA,kFAAkFA,CAACA;YAEpGA,CAACA;;YAEDH,4CAAAA,UAAyBA,CAAcA;gBAGnCI,IAAIA,WAAWA,GAA+BA,CAACA,CAACA,MAAMA;;gBAEtDA,OAAOA,CAACA,GAAGA,CAAEA,kFAAkFA,CAACA;gBAChGA,OAAOA,CAACA,GAAGA,CAAEA,iCAAiCA,EAAEA,WAAWA,CAACA,cAAcA,CAACA,QAAQA,CAACA,GAAGA,EAAGA,CAACA,CAAEA;gBAC7FA,OAAOA,CAACA,GAAGA,CAAEA,kFAAkFA,CAACA;YAEpGA,CAACA;YACLJ,uBAACA;QAADA,CAACA,IAAAD;QA/EDA,sCA+ECA;IAGLA,CAACA,iCAAAD;wBAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/BillboardEntityTest.js b/tests/js/BillboardEntityTest.js deleted file mode 100644 index ba5c99f4..00000000 --- a/tests/js/BillboardEntityTest.js +++ /dev/null @@ -1,124 +0,0 @@ -/// -// -var tests; -(function (tests) { - (function (entities) { - var Billboard = away.entities.Billboard; - var Vector3D = away.geom.Vector3D; - var AssetLibrary = away.library.AssetLibrary; - - var URLRequest = away.net.URLRequest; - var Delegate = away.utils.Delegate; - - var BillboardEntityTest = (function () { - function BillboardEntityTest() { - this._time = 0; - this._move = false; - this._billboards = new Array(); - //load an image - AssetLibrary.load(new URLRequest('assets/256x256.png')); - - //listen for a resource complete event - AssetLibrary.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, Delegate.create(this, this.onResourceComplete)); - } - /** - * Listener for resource complete event - * - * @param event - */ - BillboardEntityTest.prototype.onResourceComplete = function (event) { - var _this = this; - //get the image texture - this._imageTexture = event.assets[0]; - - //create the view - this._view = new away.containers.View(new away.render.CSSDefaultRenderer()); - - //create a bitmap material - this._bitmapMaterial = new away.materials.CSSMaterialBase(this._imageTexture); - - var billboard; - var numBillboards = 500; - for (var i = 0; i < numBillboards; i++) { - billboard = new Billboard(this._bitmapMaterial); - billboard.width = 50; - billboard.height = 50; - billboard.pivot = new Vector3D(25, 25, 0); - billboard.x = Math.cos(i * 32 * Math.PI / numBillboards) * 400 * Math.sin(i * Math.PI / numBillboards); - billboard.y = Math.sin(i * 32 * Math.PI / numBillboards) * 400 * Math.sin(i * Math.PI / numBillboards); - billboard.z = Math.cos(i * Math.PI / numBillboards) * 400; - - //billboard.orientationMode = away.base.OrientationMode.CAMERA_PLANE; - billboard.alignmentMode = away.base.AlignmentMode.PIVOT_POINT; - this._billboards.push(billboard); - - //add billboard to the scene - this._view.scene.addChild(billboard); - } - - this._hoverControl = new away.controllers.HoverController(this._view.camera, null, 150, 10); - - document.onmousedown = function (event) { - return _this.onMouseDownHandler(event); - }; - document.onmouseup = function (event) { - return _this.onMouseUpHandler(event); - }; - document.onmousemove = function (event) { - return _this.onMouseMove(event); - }; - - window.onresize = function (event) { - return _this.onResize(event); - }; - - //trigger an initial resize for the view - this.onResize(null); - - //setup the RAF for a render listener - this._timer = new away.utils.RequestAnimationFrame(this.render, this); - this._timer.start(); - }; - - BillboardEntityTest.prototype.onResize = function (event) { - this._view.x = 0; - this._view.y = 0; - this._view.width = window.innerWidth; - this._view.height = window.innerHeight; - }; - - BillboardEntityTest.prototype.render = function (dt) { - this._time += dt; - for (var i = 0; i < this._billboards.length; i++) { - this._billboards[i].rotationZ = i + this._time / 10; - this._billboards[i].rotationX = i + this._time / 10; - } - - this._view.render(); - }; - - BillboardEntityTest.prototype.onMouseUpHandler = function (event) { - this._move = false; - }; - - BillboardEntityTest.prototype.onMouseMove = function (event) { - if (this._move) { - this._hoverControl.panAngle = 0.3 * (event.clientX - this._lastMouseX) + this._lastPanAngle; - this._hoverControl.tiltAngle = 0.3 * (event.clientY - this._lastMouseY) + this._lastTiltAngle; - } - }; - - BillboardEntityTest.prototype.onMouseDownHandler = function (event) { - this._lastPanAngle = this._hoverControl.panAngle; - this._lastTiltAngle = this._hoverControl.tiltAngle; - this._lastMouseX = event.clientX; - this._lastMouseY = event.clientY; - this._move = true; - }; - return BillboardEntityTest; - })(); - entities.BillboardEntityTest = BillboardEntityTest; - })(tests.entities || (tests.entities = {})); - var entities = tests.entities; -})(tests || (tests = {})); -//# sourceMappingURL=BillboardEntityTest.js.map diff --git a/tests/js/BillboardEntityTest.js.map b/tests/js/BillboardEntityTest.js.map deleted file mode 100644 index 688addcc..00000000 --- a/tests/js/BillboardEntityTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BillboardEntityTest.js","sourceRoot":"","sources":["../entities/BillboardEntityTest.ts"],"names":["tests","tests.entities","tests.entities.BillboardEntityTest","tests.entities.BillboardEntityTest.constructor","tests.entities.BillboardEntityTest.onResourceComplete","tests.entities.BillboardEntityTest.onResize","tests.entities.BillboardEntityTest.render","tests.entities.BillboardEntityTest.onMouseUpHandler","tests.entities.BillboardEntityTest.onMouseMove","tests.entities.BillboardEntityTest.onMouseDownHandler"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/BitmapDataTest.js b/tests/js/BitmapDataTest.js deleted file mode 100644 index f3781545..00000000 --- a/tests/js/BitmapDataTest.js +++ /dev/null @@ -1,154 +0,0 @@ -/// -var tests; -(function (tests) { - (function (base) { - var Delegate = away.utils.Delegate; - - var BitmapDataTest = (function () { - function BitmapDataTest() { - var _this = this; - var transparent = true; - var initcolour = 0xffffffff; - - //--------------------------------------- - // Load a PNG - this.urlRequest = new away.net.URLRequest('assets/256x256.png'); - this.urlLoader = new away.net.URLLoader(); - this.urlLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.urlLoader.load(this.urlRequest); - this.urlLoader.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.imgLoaded)); - this.urlLoader.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.imgLoadedError)); - - //--------------------------------------- - // BitmapData Object - 1 - this.bitmapData = new away.base.BitmapData(256, 256, transparent, initcolour); - document.body.appendChild(this.bitmapData.canvas); - - //--------------------------------------- - // BitmapData Object - 2 - this.bitmapDataB = new away.base.BitmapData(256, 256, transparent, initcolour); - this.bitmapDataB.canvas.style.position = 'absolute'; - this.bitmapDataB.canvas.style.left = '540px'; - document.body.appendChild(this.bitmapDataB.canvas); - - //--------------------------------------- - // BitmapData - setPixel test - console['time']("bitmapdata"); // start setPixel operation benchmark ( TypeScript does not support console.time - so hacking it in ) . - - this.bitmapDataB.lock(); - - for (var i = 0; i < 10000; i++) { - var x = Math.random() * this.bitmapDataB.width | 0; - var y = Math.random() * this.bitmapDataB.height | 0; - this.bitmapDataB.setPixel(x, y, Math.random() * 0xffFFFFFF); // 255 opaque - } - - this.bitmapDataB.unlock(); - console['timeEnd']("bitmapdata"); // benchmark the setPixel operation - - document.onmousedown = function (e) { - return _this.onMouseDown(e); - }; - } - BitmapDataTest.prototype.onMouseDown = function (e) { - if (this.bitmapData.width === 512) { - if (this.image.complete) { - this.bitmapDataB.lock(); // Lock bitmap - speeds up setPixelOperations - - //--------------------------------------- - // Resize BitmapData - this.bitmapData.width = 256; - this.bitmapData.height = 256; - - //--------------------------------------- - // copy loaded image to first BitmapData - var rect = new away.geom.Rectangle(0, 0, this.image.width, this.image.height); - this.bitmapData.drawImage(this.image, rect, rect); - - //--------------------------------------- - // copy image into second bitmap data ( and scale it up 2X ) - rect.width = rect.width * 2; - rect.height = rect.height * 2; - - this.bitmapDataB.copyPixels(this.bitmapData, this.bitmapData.rect, rect); - - for (var d = 0; d < 1000; d++) { - var x = Math.random() * this.bitmapDataB.width | 0; - var y = Math.random() * this.bitmapDataB.height | 0; - this.bitmapDataB.setPixel(x, y, Math.random() * 0xFFFFFFFF); // 255 opaque - } - - this.bitmapDataB.unlock(); // Unlock bitmapdata - } else { - //--------------------------------------- - // image is not loaded - fill bitmapdata with red - this.bitmapData.width = 256; - this.bitmapData.height = 256; - this.bitmapData.fillRect(this.bitmapData.rect, 0xffff0000); - } - } else { - //--------------------------------------- - // resize bitmapdata; - this.bitmapData.lock(); - - this.bitmapData.width = 512; - this.bitmapData.height = 512; - this.bitmapData.fillRect(this.bitmapData.rect, 0xffff0000); // fill it RED - - for (var d = 0; d < 1000; d++) { - var x = Math.random() * this.bitmapData.width | 0; - var y = Math.random() * this.bitmapData.height | 0; - this.bitmapData.setPixel(x, y, Math.random() * 0xFFFFFFFF); - } - - this.bitmapData.unlock(); - - //--------------------------------------- - // copy bitmapdata - var targetRect = this.bitmapDataB.rect.clone(); - targetRect.width = targetRect.width / 2; - targetRect.height = targetRect.height / 2; - - this.bitmapDataB.copyPixels(this.bitmapData, this.bitmapDataB.rect, targetRect); // copy first bitmapdata object into the second one - } - - var m = new away.geom.Matrix(.5, .08, .08, .5, this.image.width / 2, this.image.height / 2); - this.bitmapData.draw(this.bitmapData, m); - - this.bitmapData.setPixel32(0, 0, 0xccff0000); - this.bitmapData.setPixel32(1, 0, 0xcc00ff00); - this.bitmapData.setPixel32(2, 0, 0xcc0000ff); - - this.bitmapDataB.draw(this.bitmapData, m); - - console.log('GetPixel 0,0: ', away.utils.ColorUtils.ARGBToHexString(away.utils.ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(0, 0)))); - console.log('GetPixel 1,0: ', away.utils.ColorUtils.ARGBToHexString(away.utils.ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(1, 0)))); - console.log('GetPixel 2,0: ', away.utils.ColorUtils.ARGBToHexString(away.utils.ColorUtils.float32ColorToARGB(this.bitmapData.getPixel(2, 0)))); - }; - - BitmapDataTest.prototype.imgLoadedError = function (e) { - console.log('error'); - }; - - BitmapDataTest.prototype.imgLoaded = function (e) { - var _this = this; - var loader = e.target; - this.image = away.parsers.ParserUtils.blobToImage(loader.data); - this.image.onload = function (event) { - return _this.onImageLoad(event); - }; - }; - - BitmapDataTest.prototype.onImageLoad = function (event) { - this.bitmapData.drawImage(this.image, new away.geom.Rectangle(0, 0, this.image.width, this.image.height), new away.geom.Rectangle(0, 0, this.image.width / 2, this.image.height / 2)); - - var m = new away.geom.Matrix(.5, .08, .08, .5, this.image.width / 2, this.image.height / 2); - this.bitmapData.draw(this.bitmapData, m); - }; - return BitmapDataTest; - })(); - base.BitmapDataTest = BitmapDataTest; - })(tests.base || (tests.base = {})); - var base = tests.base; -})(tests || (tests = {})); -//# sourceMappingURL=BitmapDataTest.js.map diff --git a/tests/js/BitmapDataTest.js.map b/tests/js/BitmapDataTest.js.map deleted file mode 100644 index 182750dc..00000000 --- a/tests/js/BitmapDataTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BitmapDataTest.js","sourceRoot":"","sources":["../base/BitmapDataTest.ts"],"names":["tests","tests.base","tests.base.BitmapDataTest","tests.base.BitmapDataTest.constructor","tests.base.BitmapDataTest.onMouseDown","tests.base.BitmapDataTest.imgLoadedError","tests.base.BitmapDataTest.imgLoaded","tests.base.BitmapDataTest.onImageLoad"],"mappings":"AAAA,yDAAyD;AAEzD,IAAO,KAAK;AAqMX,CArMD,UAAO,KAAK;KAAZA,UAAaA,IAAIA;QAEhBC,eAAqBA,IAAIA,CAACA,KAAKA,CAACA,QAAQA;;QAErCA;YASIC;gBAAAC,iBAgDCA;gBA7CGA,IAAIA,WAAWA,GAAaA,IAAIA;gBAChCA,IAAIA,UAAUA,GAAaA,UAAUA;;gBAErCA,yCAAyCA;gBACzCA,aAAaA;gBAEbA,IAAIA,CAACA,UAAUA,GAAGA,IAAIA,IAAIA,CAACA,GAAGA,CAACA,UAAUA,CAAEA,oBAAoBA,CAACA;gBAChEA,IAAIA,CAACA,SAASA,GAAIA,IAAIA,IAAIA,CAACA,GAAGA,CAACA,SAASA,CAACA,CAACA;gBACnDA,IAAIA,CAACA,SAASA,CAACA,UAAUA,GAAGA,IAAIA,CAACA,GAAGA,CAACA,mBAAmBA,CAACA,IAAIA;gBACpDA,IAAIA,CAACA,SAASA,CAACA,IAAIA,CAAEA,IAAIA,CAACA,UAAUA,CAAEA;gBACtCA,IAAIA,CAACA,SAASA,CAACA,gBAAgBA,CAAEA,IAAIA,CAACA,MAAMA,CAACA,KAAKA,CAACA,QAAQA,EAAGA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,SAASA,CAACA,CAAEA;gBACrGA,IAAIA,CAACA,SAASA,CAACA,gBAAgBA,CAAEA,IAAIA,CAACA,MAAMA,CAACA,YAAYA,CAACA,QAAQA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,cAAcA,CAACA,CAAEA;;gBAEhHA,yCAAyCA;gBACzCA,wBAAwBA;gBACxBA,IAAIA,CAACA,UAAUA,GAAGA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,UAAUA,CAAEA,GAAGA,EAAIA,GAAGA,EAAGA,WAAWA,EAAGA,UAAUA,CAAEA;gBACnFA,QAAQA,CAACA,IAAIA,CAACA,WAAWA,CAAEA,IAAIA,CAACA,UAAUA,CAACA,MAAMA,CAAEA;;gBAEnDA,yCAAyCA;gBACzCA,wBAAwBA;gBACxBA,IAAIA,CAACA,WAAWA,GAAGA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,UAAUA,CAAEA,GAAGA,EAAIA,GAAGA,EAAGA,WAAWA,EAAGA,UAAUA,CAAEA;gBACpFA,IAAIA,CAACA,WAAWA,CAACA,MAAMA,CAACA,KAAKA,CAACA,QAAQA,GAAGA,UAAUA;gBACnDA,IAAIA,CAACA,WAAWA,CAACA,MAAMA,CAACA,KAAKA,CAACA,IAAIA,GAAGA,OAAOA;gBAC5CA,QAAQA,CAACA,IAAIA,CAACA,WAAWA,CAAEA,IAAIA,CAACA,WAAWA,CAACA,MAAMA,CAAEA;;gBAEpDA,yCAAyCA;gBACzCA,6BAA6BA;gBAC7BA,OAAOA,CAACA,MAAMA,CAACA,CAACA,YAAYA,CAACA,EAAEA,uGAAuGA;;gBAEtIA,IAAIA,CAACA,WAAWA,CAACA,IAAIA,CAACA,CAACA;;gBAEvBA,KAAKA,IAAIA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,KAAKA,EAAEA,CAACA,EAAEA,CAC9BA;oBAEIA,IAAIA,CAACA,GAAGA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,IAAIA,CAACA,WAAWA,CAACA,KAAKA,GAAGA,CAACA;oBAClDA,IAAIA,CAACA,GAAGA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,IAAIA,CAACA,WAAWA,CAACA,MAAMA,GAAGA,CAACA;oBACnDA,IAAIA,CAACA,WAAWA,CAACA,QAAQA,CAACA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,UAAUA,CAAEA,EAAEA,aAAaA;iBAE9EA;;gBAEDA,IAAIA,CAACA,WAAWA,CAACA,MAAMA,CAACA,CAACA;gBACzBA,OAAOA,CAACA,SAASA,CAACA,CAACA,YAAYA,CAACA,EAAEA,mCAAmCA;;gBAErEA,QAAQA,CAACA,WAAWA,GAAGA,UAAEA,CAACA;2BAAMA,KAAIA,CAACA,WAAWA,CAAEA,CAACA,CAAEA;gBAArBA,CAAqBA;YAEzDA,CAACA;YAEDD,uCAAAA,UAAqBA,CAACA;gBAGlBE,IAAKA,IAAIA,CAACA,UAAUA,CAACA,KAAKA,KAAKA,GAAGA,CAClCA;oBAEIA,IAAKA,IAAIA,CAACA,KAAKA,CAACA,QAAQA,CACxBA;wBAEIA,IAAIA,CAACA,WAAWA,CAACA,IAAIA,CAACA,CAACA,EAAEA,6CAA6CA;;wBAGtEA,yCAAyCA;wBACzCA,oBAAoBA;wBACpBA,IAAIA,CAACA,UAAUA,CAACA,KAAKA,GAAIA,GAAGA;wBAC5BA,IAAIA,CAACA,UAAUA,CAACA,MAAMA,GAAGA,GAAGA;;wBAE5BA,yCAAyCA;wBACzCA,wCAAwCA;wBAExCA,IAAIA,IAAIA,GAAyBA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,SAASA,CAAEA,CAACA,EAAGA,CAACA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,KAAKA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,MAAMA,CAAEA;wBACxGA,IAAIA,CAACA,UAAUA,CAACA,SAASA,CAAEA,IAAIA,CAACA,KAAKA,EAAGA,IAAIA,EAAIA,IAAIA,CAAEA;;wBAEtDA,yCAAyCA;wBACzCA,4DAA4DA;wBAC5DA,IAAIA,CAACA,KAAKA,GAAGA,IAAIA,CAACA,KAAKA,GAAGA,CAACA;wBAC3BA,IAAIA,CAACA,MAAMA,GAAGA,IAAIA,CAACA,MAAMA,GAAGA,CAACA;;wBAE7BA,IAAIA,CAACA,WAAWA,CAACA,UAAUA,CAAEA,IAAIA,CAACA,UAAUA,EAAGA,IAAIA,CAACA,UAAUA,CAACA,IAAIA,EAAGA,IAAIA,CAAEA;;wBAK5EA,KAAKA,IAAIA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,EAAEA,CAACA,EAAEA,CAC7BA;4BAEIA,IAAIA,CAACA,GAAGA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,IAAIA,CAACA,WAAWA,CAACA,KAAKA,GAAGA,CAACA;4BAClDA,IAAIA,CAACA,GAAGA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,IAAIA,CAACA,WAAWA,CAACA,MAAMA,GAAGA,CAACA;4BACnDA,IAAIA,CAACA,WAAWA,CAACA,QAAQA,CAACA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,UAAUA,CAAEA,EAAEA,aAAaA;yBAE9EA;;wBAEDA,IAAIA,CAACA,WAAWA,CAACA,MAAMA,CAACA,CAACA,EAAEA,oBAAoBA;qBAElDA,KAEDA;wBAEIA,yCAAyCA;wBACzCA,iDAAiDA;wBACjDA,IAAIA,CAACA,UAAUA,CAACA,KAAKA,GAAIA,GAAGA;wBAC5BA,IAAIA,CAACA,UAAUA,CAACA,MAAMA,GAAGA,GAAGA;wBAC5BA,IAAIA,CAACA,UAAUA,CAACA,QAAQA,CAAEA,IAAIA,CAACA,UAAUA,CAACA,IAAIA,EAAGA,UAAUA,CAAEA;qBAChEA;iBAEJA,KAEDA;oBAEIA,yCAAyCA;oBACzCA,qBAAqBA;oBAErBA,IAAIA,CAACA,UAAUA,CAACA,IAAIA,CAACA,CAACA;;oBAEtBA,IAAIA,CAACA,UAAUA,CAACA,KAAKA,GAAIA,GAAGA;oBAC5BA,IAAIA,CAACA,UAAUA,CAACA,MAAMA,GAAGA,GAAGA;oBAC5BA,IAAIA,CAACA,UAAUA,CAACA,QAAQA,CAAEA,IAAIA,CAACA,UAAUA,CAACA,IAAIA,EAAGA,UAAUA,CAAEA,EAAEA,cAAcA;;oBAE7EA,KAAKA,IAAIA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,IAAIA,EAAEA,CAACA,EAAEA,CAC7BA;wBAEIA,IAAIA,CAACA,GAAGA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,IAAIA,CAACA,UAAUA,CAACA,KAAKA,GAAGA,CAACA;wBACjDA,IAAIA,CAACA,GAAGA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,IAAIA,CAACA,UAAUA,CAACA,MAAMA,GAAGA,CAACA;wBAClDA,IAAIA,CAACA,UAAUA,CAACA,QAAQA,CAACA,CAACA,EAAEA,CAACA,EAAEA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,UAAUA,CAAEA;qBAE9DA;;oBAEDA,IAAIA,CAACA,UAAUA,CAACA,MAAMA,CAACA,CAACA;;oBACxBA,yCAAyCA;oBACzCA,kBAAkBA;oBAElBA,IAAIA,UAAUA,GAAYA,IAAIA,CAACA,WAAWA,CAACA,IAAIA,CAACA,KAAKA,CAACA,CAACA;oBACnDA,UAAUA,CAACA,KAAKA,GAAMA,UAAUA,CAACA,KAAKA,GAAGA,CAACA;oBAC1CA,UAAUA,CAACA,MAAMA,GAAKA,UAAUA,CAACA,MAAMA,GAAGA,CAACA;;oBAE/CA,IAAIA,CAACA,WAAWA,CAACA,UAAUA,CAAEA,IAAIA,CAACA,UAAUA,EAAGA,IAAIA,CAACA,WAAWA,CAACA,IAAIA,EAAIA,UAAUA,CAAEA,EAAEA,mDAAmDA;iBAI5IA;;gBAEDA,IAAIA,CAACA,GAAsBA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,MAAMA,CAACA,EAAEA,EAAEA,GAAGA,EAAGA,GAAGA,EAAEA,EAAEA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,KAAKA,GAAGA,CAACA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,MAAMA,GAAGA,CAACA,CAACA;gBACjHA,IAAIA,CAACA,UAAUA,CAACA,IAAIA,CAAEA,IAAIA,CAACA,UAAUA,EAAGA,CAACA,CAAEA;;gBAE3CA,IAAIA,CAACA,UAAUA,CAACA,UAAUA,CAACA,CAACA,EAAEA,CAACA,EAAEA,UAAUA,CAAEA;gBAC7CA,IAAIA,CAACA,UAAUA,CAACA,UAAUA,CAACA,CAACA,EAAEA,CAACA,EAAEA,UAAUA,CAAEA;gBAC7CA,IAAIA,CAACA,UAAUA,CAACA,UAAUA,CAACA,CAACA,EAAEA,CAACA,EAAEA,UAAUA,CAAEA;;gBAE7CA,IAAIA,CAACA,WAAWA,CAACA,IAAIA,CAAEA,IAAIA,CAACA,UAAUA,EAAGA,CAACA,CAAEA;;gBAE5CA,OAAOA,CAACA,GAAGA,CAAEA,gBAAgBA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,UAAUA,CAACA,eAAeA,CAAEA,IAAIA,CAACA,KAAKA,CAACA,UAAUA,CAACA,kBAAkBA,CAAEA,IAAIA,CAACA,UAAUA,CAACA,QAAQA,CAAEA,CAACA,EAAGA,CAACA,CAAEA,CAAEA,CAAEA,CAAEA;gBACxJA,OAAOA,CAACA,GAAGA,CAAEA,gBAAgBA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,UAAUA,CAACA,eAAeA,CAAEA,IAAIA,CAACA,KAAKA,CAACA,UAAUA,CAACA,kBAAkBA,CAAEA,IAAIA,CAACA,UAAUA,CAACA,QAAQA,CAAEA,CAACA,EAAGA,CAACA,CAAEA,CAAEA,CAAEA,CAAEA;gBACxJA,OAAOA,CAACA,GAAGA,CAAEA,gBAAgBA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,UAAUA,CAACA,eAAeA,CAAEA,IAAIA,CAACA,KAAKA,CAACA,UAAUA,CAACA,kBAAkBA,CAAEA,IAAIA,CAACA,UAAUA,CAACA,QAAQA,CAAEA,CAACA,EAAGA,CAACA,CAAEA,CAAEA,CAAEA,CAAEA;YAI5JA,CAACA;;YAEDF,0CAAAA,UAAwBA,CAA4BA;gBAGhDG,OAAOA,CAACA,GAAGA,CAAEA,OAAOA,CAACA;YAEzBA,CAACA;;YAEDH,qCAAAA,UAAmBA,CAAqBA;gBAAxCI,iBAMLA;gBAHAA,IAAIA,MAAMA,GAAsDA,CAACA,CAACA,MAAMA;gBACxEA,IAAIA,CAACA,KAAKA,GAAGA,IAAIA,CAACA,OAAOA,CAACA,WAAWA,CAACA,WAAWA,CAACA,MAAMA,CAACA,IAAIA,CAACA;gBAC9DA,IAAIA,CAACA,KAAKA,CAACA,MAAMA,GAAGA,UAAEA,KAAKA;2BAAMA,KAAIA,CAACA,WAAWA,CAAEA,KAAKA,CAAEA;gBAAzBA,CAAyBA;YAC3DA,CAACA;;YAEDJ,uCAAAA,UAAqBA,KAAKA;gBAEhBK,IAAIA,CAACA,UAAUA,CAACA,SAASA,CAAEA,IAAIA,CAACA,KAAKA,EAAGA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,SAASA,CAAEA,CAACA,EAAGA,CAACA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,KAAKA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,MAAMA,CAAEA,EAAEA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,SAASA,CAAEA,CAACA,EAAGA,CAACA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,KAAKA,GAAIA,CAACA,EAAEA,IAAIA,CAACA,KAAKA,CAACA,MAAMA,GAAGA,CAACA,CAAEA,CAACA;;gBAEjMA,IAAIA,CAACA,GAAsBA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,MAAMA,CAACA,EAAEA,EAAEA,GAAGA,EAAGA,GAAGA,EAAEA,EAAEA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,KAAKA,GAAGA,CAACA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,MAAMA,GAAGA,CAACA,CAACA;gBACjHA,IAAIA,CAACA,UAAUA,CAACA,IAAIA,CAAEA,IAAIA,CAACA,UAAUA,EAAGA,CAACA,CAAEA;YAE/CA,CAACA;YAELL,sBAACA;QAADA,CAACA,IAAAD;QA/LDA,qCA+LCA;IAELA,CAACA,mCAAAD;0BAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/BitmapEntityTest.js b/tests/js/BitmapEntityTest.js deleted file mode 100644 index 24e6f31e..00000000 --- a/tests/js/BitmapEntityTest.js +++ /dev/null @@ -1,120 +0,0 @@ -/// -// -var tests; -(function (tests) { - (function (entities) { - var View = away.containers.View; - var Billboard = away.entities.Billboard; - var AssetLibrary = away.library.AssetLibrary; - var CSSMaterialBase = away.materials.CSSMaterialBase; - var ImageTexture = away.textures.ImageTexture; - var URLLoader = away.net.URLLoader; - var URLRequest = away.net.URLRequest; - var Delegate = away.utils.Delegate; - var RequestAnimationFrame = away.utils.RequestAnimationFrame; - - var BillboardEntityTest = (function () { - function BillboardEntityTest() { - this._move = false; - //load an image - AssetLibrary.load(new URLRequest('assets/1024x1024.png')); - - //listen for a resource complete event - AssetLibrary.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, Delegate.create(this, this.onResourceComplete)); - } - /** - * Listener for resource complete event - * - * @param event - */ - BillboardEntityTest.prototype.onResourceComplete = function (event) { - var _this = this; - //get the image texture - this._imageTexture = event.assets[0]; - - //create the view - this._view = new away.containers.View(null, null, new away.render.CSSDefaultRenderer()); - - //create a bitmap material - this._bitmapMaterial = new away.materials.CSSMaterialBase(this._imageTexture); - - //create a billboard entity - this._billboard1 = new away.entities.Billboard(this._bitmapMaterial, 100, 100); - - //add billboard to the scene - this._view.scene.addChild(this._billboard1); - - this._billboard2 = new away.entities.Billboard(this._bitmapMaterial, 100, 100); - this._billboard2.x = 200; - this._view.scene.addChild(this._billboard2); - - this._billboard3 = new away.entities.Billboard(this._bitmapMaterial, 100, 100); - this._billboard3.x = 200; - this._billboard3.y = 200; - this._view.scene.addChild(this._billboard3); - - this._billboard4 = new away.entities.Billboard(this._bitmapMaterial, 100, 100); - this._billboard4.y = 200; - this._view.scene.addChild(this._billboard4); - - //this._hoverControl = new away.controllers.HoverController(this._view.camera, null, 150, 10); - document.onmousedown = function (event) { - return _this.onMouseDownHandler(event); - }; - document.onmouseup = function (event) { - return _this.onMouseUpHandler(event); - }; - document.onmousemove = function (event) { - return _this.onMouseMove(event); - }; - - window.onresize = function (event) { - return _this.onResize(event); - }; - - //trigger an initial resize for the view - this.onResize(null); - - //setup the RAF for a render listener - this._timer = new away.utils.RequestAnimationFrame(this.render, this); - this._timer.start(); - }; - - BillboardEntityTest.prototype.onResize = function (event) { - this._view.x = 0; - this._view.y = 0; - this._view.width = window.innerWidth; - this._view.height = window.innerHeight; - }; - - BillboardEntityTest.prototype.render = function (dt) { - this._billboard1.rotationY += 1; - this._billboard3.rotationY += 1; - this._view.render(); - }; - - BillboardEntityTest.prototype.onMouseUpHandler = function (event) { - this._move = false; - }; - - BillboardEntityTest.prototype.onMouseMove = function (event) { - if (this._move) { - this._hoverControl.panAngle = 0.3 * (event.clientX - this._lastMouseX) + this._lastPanAngle; - this._hoverControl.tiltAngle = 0.3 * (event.clientY - this._lastMouseY) + this._lastTiltAngle; - } - }; - - BillboardEntityTest.prototype.onMouseDownHandler = function (event) { - this._lastPanAngle = this._hoverControl.panAngle; - this._lastTiltAngle = this._hoverControl.tiltAngle; - this._lastMouseX = event.clientX; - this._lastMouseY = event.clientY; - this._move = true; - }; - return BillboardEntityTest; - })(); - entities.BillboardEntityTest = BillboardEntityTest; - })(tests.entities || (tests.entities = {})); - var entities = tests.entities; -})(tests || (tests = {})); -//# sourceMappingURL=BitmapEntityTest.js.map diff --git a/tests/js/BitmapEntityTest.js.map b/tests/js/BitmapEntityTest.js.map deleted file mode 100644 index 59934dac..00000000 --- a/tests/js/BitmapEntityTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BitmapEntityTest.js","sourceRoot":"","sources":["../entities/BillboardEntityTest.ts"],"names":["tests","tests.entities","tests.entities.BillboardEntityTest","tests.entities.BillboardEntityTest.constructor","tests.entities.BillboardEntityTest.onResourceComplete","tests.entities.BillboardEntityTest.onResize","tests.entities.BillboardEntityTest.render","tests.entities.BillboardEntityTest.onMouseUpHandler","tests.entities.BillboardEntityTest.onMouseMove","tests.entities.BillboardEntityTest.onMouseDownHandler"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/BitmapTextureTest.js b/tests/js/BitmapTextureTest.js deleted file mode 100644 index d130a821..00000000 --- a/tests/js/BitmapTextureTest.js +++ /dev/null @@ -1,47 +0,0 @@ -/// -var tests; -(function (tests) { - (function (textures) { - var Delegate = away.utils.Delegate; - - var BitmapTextureTest = (function () { - function BitmapTextureTest() { - //--------------------------------------- - // Load a PNG - var mipUrlRequest = new away.net.URLRequest('assets/1024x1024.png'); - this.mipLoader = new away.net.URLLoader(); - this.mipLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.mipLoader.load(mipUrlRequest); - this.mipLoader.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.mipImgLoaded)); - } - BitmapTextureTest.prototype.mipImgLoaded = function (e) { - var _this = this; - var loader = e.target; - var image = away.parsers.ParserUtils.blobToImage(loader.data); - image.onload = function (event) { - return _this.onImageLoad(event); - }; - }; - - BitmapTextureTest.prototype.onImageLoad = function (event) { - var image = event.target; - - var rect = new away.geom.Rectangle(0, 0, image.width, image.height); - - console.log('away.events.Event.COMPLETE', image); - - this.bitmapData = new away.base.BitmapData(image.width, image.height); - this.bitmapData.drawImage(image, rect, rect); - - this.target = new away.textures.BitmapTexture(this.bitmapData, true); //new away.textures.HTMLImageElementTexture( loader.image , false ); - - away.Debug.log('away.base.BitmapData', this.bitmapData); - away.Debug.log('away.textures.BitmapTexture', this.target); - }; - return BitmapTextureTest; - })(); - textures.BitmapTextureTest = BitmapTextureTest; - })(tests.textures || (tests.textures = {})); - var textures = tests.textures; -})(tests || (tests = {})); -//# sourceMappingURL=BitmapTextureTest.js.map diff --git a/tests/js/BitmapTextureTest.js.map b/tests/js/BitmapTextureTest.js.map deleted file mode 100644 index ad0cb423..00000000 --- a/tests/js/BitmapTextureTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BitmapTextureTest.js","sourceRoot":"","sources":["../textures/BitmapTextureTest.ts"],"names":["tests","tests.textures","tests.textures.BitmapTextureTest","tests.textures.BitmapTextureTest.constructor","tests.textures.BitmapTextureTest.mipImgLoaded","tests.textures.BitmapTextureTest.onImageLoad"],"mappings":"AAAA,oDAAoD;AAEpD,IAAO,KAAK;AAsDX,CAtDD,UAAO,KAAK;KAAZA,UAAaA,QAAQA;QAEpBC,eAAqBA,IAAIA,CAACA,KAAKA,CAACA,QAAQA;;QAGrCA;YAQIC;gBAGIC,yCAAyCA;gBACzCA,aAAaA;gBAEbA,IAAIA,aAAaA,GAAGA,IAAIA,IAAIA,CAACA,GAAGA,CAACA,UAAUA,CAAEA,sBAAsBA,CAACA;gBACpEA,IAAIA,CAACA,SAASA,GAAIA,IAAIA,IAAIA,CAACA,GAAGA,CAACA,SAASA,CAACA,CAACA;gBACnDA,IAAIA,CAACA,SAASA,CAACA,UAAUA,GAAGA,IAAIA,CAACA,GAAGA,CAACA,mBAAmBA,CAACA,IAAIA;gBACpDA,IAAIA,CAACA,SAASA,CAACA,IAAIA,CAAEA,aAAaA,CAAEA;gBACpCA,IAAIA,CAACA,SAASA,CAACA,gBAAgBA,CAAEA,IAAIA,CAACA,MAAMA,CAACA,KAAKA,CAACA,QAAQA,EAAGA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,YAAYA,CAACA,CAAEA;YAE5GA,CAACA;YAEDD,2CAAAA,UAAsBA,CAACA;gBAAvBE,iBAMLA;gBAHSA,IAAIA,MAAMA,GAAsDA,CAACA,CAACA,MAAMA;gBACjFA,IAAIA,KAAKA,GAAsBA,IAAIA,CAACA,OAAOA,CAACA,WAAWA,CAACA,WAAWA,CAACA,MAAMA,CAACA,IAAIA,CAACA;gBAChFA,KAAKA,CAACA,MAAMA,GAAGA,UAAEA,KAAKA;2BAAMA,KAAIA,CAACA,WAAWA,CAAEA,KAAKA,CAAEA;gBAAzBA,CAAyBA;YACtDA,CAACA;;YAEDF,0CAAAA,UAAqBA,KAAKA;gBAEzBG,IAAIA,KAAKA,GAAyCA,KAAKA,CAACA,MAAMA;;gBAErDA,IAAIA,IAAIA,GAAkCA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,SAASA,CAAEA,CAACA,EAAGA,CAACA,EAAGA,KAAKA,CAACA,KAAKA,EAAGA,KAAKA,CAACA,MAAMA,CAAEA;;gBAEvGA,OAAOA,CAACA,GAAGA,CAAEA,4BAA4BA,EAAGA,KAAKA,CAAEA;;gBAEnDA,IAAIA,CAACA,UAAUA,GAA2BA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,UAAUA,CAAEA,KAAKA,CAACA,KAAKA,EAAGA,KAAKA,CAACA,MAAMA,CAAEA;gBAChGA,IAAIA,CAACA,UAAUA,CAACA,SAASA,CAAEA,KAAKA,EAAGA,IAAIA,EAAIA,IAAIA,CAAEA;;gBAEjDA,IAAIA,CAACA,MAAMA,GAA+BA,IAAIA,IAAIA,CAACA,QAAQA,CAACA,aAAaA,CAAEA,IAAIA,CAACA,UAAUA,EAAGA,IAAIA,CAAEA,EAACA,oEAAoEA;;gBAExKA,IAAIA,CAACA,KAAKA,CAACA,GAAGA,CAAEA,sBAAsBA,EAAaA,IAAIA,CAACA,UAAUA,CAAEA;gBACpEA,IAAIA,CAACA,KAAKA,CAACA,GAAGA,CAAEA,6BAA6BA,EAASA,IAAIA,CAACA,MAAMA,CAAEA;YAEvEA,CAACA;YAELH,yBAACA;QAADA,CAACA,IAAAD;QAhDDA,+CAgDCA;IACLA,CAACA,2CAAAD;kCAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/ByteArrayTest.js b/tests/js/ByteArrayTest.js deleted file mode 100644 index f6cba5c3..00000000 --- a/tests/js/ByteArrayTest.js +++ /dev/null @@ -1,41 +0,0 @@ -/// -var tests; -(function (tests) { - (function (utils) { - var ByteArrayTest = (function () { - function ByteArrayTest() { - var b1 = new away.utils.ByteArray(); - b1.writeByte(0xFF); - b1.writeByte(0xEE); - b1.writeByte(0xDD); - b1.writeByte(0xCC); - b1.writeByte(0xBB); - b1.writeByte(0xAA); - - var b2 = new away.utils.ByteArray(); - b2.writeByte(0x00); - b2.writeByte(0x00); - b2.writeByte(0x00); - b2.writeByte(0x00); - b2.writeByte(0x00); - b2.writeByte(0x00); - - b2.position = 0; - b1.position = 0; - - b1.readBytes(b2, 2, 2); - - console.log('b1.position', b1.position); - console.log('b2.length', b2.length, 'b2.position', b2.position); - - while (b2.getBytesAvailable()) { - console.log(b2.readByte().toString(16)); - } - } - return ByteArrayTest; - })(); - utils.ByteArrayTest = ByteArrayTest; - })(tests.utils || (tests.utils = {})); - var utils = tests.utils; -})(tests || (tests = {})); -//# sourceMappingURL=ByteArrayTest.js.map diff --git a/tests/js/ByteArrayTest.js.map b/tests/js/ByteArrayTest.js.map deleted file mode 100644 index ebfe1a37..00000000 --- a/tests/js/ByteArrayTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ByteArrayTest.js","sourceRoot":"","sources":["../utils/ByteArrayTest.ts"],"names":["tests","tests.utils","tests.utils.ByteArrayTest","tests.utils.ByteArrayTest.constructor"],"mappings":"AAAA,oDAAoD;AAEpD,IAAO,KAAK;AA6CX,CA7CD,UAAO,KAAK;KAAZA,UAAaA,KAAKA;QAGdC;YAGIC;gBAIIC,IAAIA,EAAEA,GAAwBA,IAAIA,IAAIA,CAACA,KAAKA,CAACA,SAASA,CAACA,CAACA;gBACxDA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;;gBAEpBA,IAAIA,EAAEA,GAAwBA,IAAIA,IAAIA,CAACA,KAAKA,CAACA,SAASA,CAACA,CAACA;gBACxDA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;gBACpBA,EAAEA,CAACA,SAASA,CAAEA,IAAIA,CAAEA;;gBAEpBA,EAAEA,CAACA,QAAQA,GAAGA,CAACA;gBACfA,EAAEA,CAACA,QAAQA,GAAGA,CAACA;;gBAEfA,EAAEA,CAACA,SAASA,CAAEA,EAAEA,EAAEA,CAACA,EAAEA,CAACA,CAAEA;;gBAExBA,OAAOA,CAACA,GAAGA,CAAEA,aAAaA,EAAGA,EAAEA,CAACA,QAAQA,CAAEA;gBAC1CA,OAAOA,CAACA,GAAGA,CAAEA,WAAWA,EAAGA,EAAEA,CAACA,MAAMA,EAAGA,aAAaA,EAAGA,EAAEA,CAACA,QAAQA,CAAEA;;gBAEpEA,OAAQA,EAAEA,CAACA,iBAAiBA,CAACA,CAACA,CAC9BA;oBACIA,OAAOA,CAACA,GAAGA,CAAEA,EAAEA,CAACA,QAAQA,CAACA,CAACA,CAACA,QAAQA,CAAEA,EAAEA,CAAEA,CAAEA;iBAC9CA;YAELA,CAACA;YAGLD,qBAACA;QAADA,CAACA,IAAAD;QAvCDA,oCAuCCA;IAGLA,CAACA,qCAAAD;4BAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/ColorUtils.js b/tests/js/ColorUtils.js deleted file mode 100644 index e5f870b9..00000000 --- a/tests/js/ColorUtils.js +++ /dev/null @@ -1,52 +0,0 @@ -/// -var tests; -(function (tests) { - (function (geom) { - var ColorUtils = (function () { - function ColorUtils() { - /* - constructor( inRedMultiplier:number = 1.0, inGreenMultiplier:number = 1.0, inBlueMultiplier:number = 1.0, inAlphaMultiplier:number = 1.0, - inRedOffset:number = 0.0, inGreenOffset:number = 0.0, inBlueOffset:number = 0.0, inAlphaOffset:number = 0.0) - */ - var ct_RED = new away.geom.ColorTransform(1, 0, 0, 1, 255, 0, 0, 255); - - console.log("ct_RED - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_RED.color)); - - var ct_GREEN = new away.geom.ColorTransform(0, 1, 0, 1, 0, 255, 0, 255); - - console.log("ct_GREEN - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_GREEN.color)); - - var ct_BLUE = new away.geom.ColorTransform(0, 0, 1, 1, 0, 0, 255, 255); - - console.log("ct_BLUE - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_BLUE.color)); - - var ct_RED_a = new away.geom.ColorTransform(.5, 0, 0, 1, 255, 0, 0, 255); - - console.log("ct_RED_a - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_RED_a.color)); - - var ct_GREEN_a = new away.geom.ColorTransform(0, .5, 0, 1, 0, 255, 0, 255); - - console.log("ct_GREEN_a - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_GREEN_a.color)); - - var ct_BLUE_a = new away.geom.ColorTransform(0, 0, .5, 1, 0, 0, 255, 255); - - console.log("ct_BLUE_a - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_BLUE_a.color)); - - console.log('--------------------------------------------------------------------------------'); - - ct_RED.color = 0xff0000; - console.log("SET - ct_RED - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_RED.color)); - - ct_GREEN.color = 0x00ff00; - console.log("SET - ct_GREEN - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_GREEN.color)); - - ct_BLUE.color = 0x0000ff; - console.log("SET - ct_BLUE - ARGB: ", away.utils.ColorUtils.float32ColorToARGB(ct_BLUE.color)); - } - return ColorUtils; - })(); - geom.ColorUtils = ColorUtils; - })(tests.geom || (tests.geom = {})); - var geom = tests.geom; -})(tests || (tests = {})); -//# sourceMappingURL=ColorUtils.js.map diff --git a/tests/js/ColorUtils.js.map b/tests/js/ColorUtils.js.map deleted file mode 100644 index 49c8339e..00000000 --- a/tests/js/ColorUtils.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ColorUtils.js","sourceRoot":"","sources":["../geom/ColorUtils.ts"],"names":["tests","tests.geom","tests.geom.ColorUtils","tests.geom.ColorUtils.constructor"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/EDTest.js b/tests/js/EDTest.js deleted file mode 100644 index 87d286d5..00000000 --- a/tests/js/EDTest.js +++ /dev/null @@ -1,32 +0,0 @@ -/// -var __extends = this.__extends || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var tests; -(function (tests) { - (function (events) { - var Delegate = away.utils.Delegate; - - var EDTest = (function (_super) { - __extends(EDTest, _super); - function EDTest() { - _super.call(this); - - console.log('Before addEventListener: ', this.hasEventListener(away.events.Event.COMPLETE)); - this.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.onComplete)); - console.log('After addEventListener: ', this.hasEventListener(away.events.Event.COMPLETE)); - this.removeEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.onComplete)); - console.log('After removeEventListener: ', this.hasEventListener(away.events.Event.COMPLETE)); - } - EDTest.prototype.onComplete = function (e) { - }; - return EDTest; - })(away.events.EventDispatcher); - events.EDTest = EDTest; - })(tests.events || (tests.events = {})); - var events = tests.events; -})(tests || (tests = {})); -//# sourceMappingURL=EDTest.js.map diff --git a/tests/js/EDTest.js.map b/tests/js/EDTest.js.map deleted file mode 100644 index 94080236..00000000 --- a/tests/js/EDTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"EDTest.js","sourceRoot":"","sources":["../events/EDTest.ts"],"names":["tests","tests.events","tests.events.EDTest","tests.events.EDTest.constructor","tests.events.EDTest.onComplete"],"mappings":"AAAA,oDAAoD;;;;;;;AAEpD,IAAO,KAAK;AA6BX,CA7BD,UAAO,KAAK;KAAZA,UAAaA,MAAMA;QAElBC,eAAqBA,IAAIA,CAACA,KAAKA,CAACA,QAAQA;;QAErCA;;YAGIC;gBAGIC,WAAMA,KAAAA,CAACA;;gBAEPA,OAAOA,CAACA,GAAGA,CAAEA,2BAA2BA,EAAGA,IAAIA,CAACA,gBAAgBA,CAAEA,IAAIA,CAACA,MAAMA,CAACA,KAAKA,CAACA,QAAQA,CAAGA,CAAEA;gBACjGA,IAAIA,CAACA,gBAAgBA,CAAEA,IAAIA,CAACA,MAAMA,CAACA,KAAKA,CAACA,QAAQA,EAAGA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,UAAUA,CAACA,CAAEA;gBAC5FA,OAAOA,CAACA,GAAGA,CAAEA,0BAA0BA,EAAGA,IAAIA,CAACA,gBAAgBA,CAAEA,IAAIA,CAACA,MAAMA,CAACA,KAAKA,CAACA,QAAQA,CAAGA,CAAEA;gBAChGA,IAAIA,CAACA,mBAAmBA,CAAEA,IAAIA,CAACA,MAAMA,CAACA,KAAKA,CAACA,QAAQA,EAAGA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,UAAUA,CAACA,CAAEA;gBAC/FA,OAAOA,CAACA,GAAGA,CAAEA,6BAA6BA,EAAGA,IAAIA,CAACA,gBAAgBA,CAAEA,IAAIA,CAACA,MAAMA,CAACA,KAAKA,CAACA,QAAQA,CAAGA,CAAEA;YAEvGA,CAACA;YAEDD,8BAAAA,UAAmBA,CAACA;YAIpBE,CAACA;YAELF,cAACA;QAADA,CAACA,EAtB2BD,IAAIA,CAACA,MAAMA,CAACA,eAAeA,EAsBtDA;QAtBDA,uBAsBCA;IAGLA,CAACA,uCAAAD;8BAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/IDUtilTest.js b/tests/js/IDUtilTest.js deleted file mode 100644 index 5f654f05..00000000 --- a/tests/js/IDUtilTest.js +++ /dev/null @@ -1,15 +0,0 @@ -/// -var tests; -(function (tests) { - (function (utils) { - var IDUtilTest = (function () { - function IDUtilTest() { - console.log(away.library.IDUtil.createUID()); - } - return IDUtilTest; - })(); - utils.IDUtilTest = IDUtilTest; - })(tests.utils || (tests.utils = {})); - var utils = tests.utils; -})(tests || (tests = {})); -//# sourceMappingURL=IDUtilTest.js.map diff --git a/tests/js/IDUtilTest.js.map b/tests/js/IDUtilTest.js.map deleted file mode 100644 index 96da0788..00000000 --- a/tests/js/IDUtilTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IDUtilTest.js","sourceRoot":"","sources":["../utils/IDUtilTest.ts"],"names":["tests","tests.utils","tests.utils.IDUtilTest","tests.utils.IDUtilTest.constructor"],"mappings":"AAAA,oDAAoD;AAEpD,IAAO,KAAK;AAcX,CAdD,UAAO,KAAK;KAAZA,UAAaA,KAAKA;QAEdC;YAIIC;gBAEIC,OAAOA,CAACA,GAAGA,CAAEA,IAAIA,CAACA,OAAOA,CAACA,MAAMA,CAACA,SAASA,CAACA,CAACA,CAAEA;YAClDA,CAACA;YAGLD,kBAACA;QAADA,CAACA,IAAAD;QAVDA,8BAUCA;IAELA,CAACA,qCAAAD;4BAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/IMGLoaderTest.js b/tests/js/IMGLoaderTest.js deleted file mode 100644 index ebb40647..00000000 --- a/tests/js/IMGLoaderTest.js +++ /dev/null @@ -1,95 +0,0 @@ -/// -var tests; -(function (tests) { - (function (net) { - var Delegate = away.utils.Delegate; - - var URLLoaderTest = (function () { - function URLLoaderTest() { - //----------------------------------------------------------------------------------------------- - // load a png - //----------------------------------------------------------------------------------------------- - var pngURLrq = new away.net.URLRequest('assets/2.png'); - - this.pngLoader = new away.net.URLLoader(); - this.pngLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.pngLoader.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.pngLoaderComplete)); - this.pngLoader.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.pngLoader.load(pngURLrq); - - //----------------------------------------------------------------------------------------------- - // Load a jpg - //----------------------------------------------------------------------------------------------- - var jpgURLrq = new away.net.URLRequest('assets/1.jpg'); - - this.jpgLoader = new away.net.URLLoader(); - this.jpgLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.jpgLoader.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.jpgLoaderComplete)); - this.jpgLoader.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.jpgLoader.load(jpgURLrq); - - //----------------------------------------------------------------------------------------------- - // Load file of wrong format - //----------------------------------------------------------------------------------------------- - var notURLrq = new away.net.URLRequest('assets/data.txt'); - - this.noAnImageLoader = new away.net.URLLoader(); - this.noAnImageLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.noAnImageLoader.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.noAnImageLoaderComplete)); - this.noAnImageLoader.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.noAnImageLoader.load(notURLrq); - - //----------------------------------------------------------------------------------------------- - // Load image that does not exist - //----------------------------------------------------------------------------------------------- - var wrongURLrq = new away.net.URLRequest('assets/iDontExist.png'); - - this.wrongURLLoader = new away.net.URLLoader(); - this.wrongURLLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.wrongURLLoader.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.wrongURLLoaderComplete)); - this.wrongURLLoader.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.wrongURLLoader.load(wrongURLrq); - } - URLLoaderTest.prototype.pngLoaderComplete = function (e) { - this.logSuccessfullLoad(e); - - var imgLoader = e.target; - document.body.appendChild(away.parsers.ParserUtils.blobToImage(imgLoader.data)); - }; - - URLLoaderTest.prototype.jpgLoaderComplete = function (e) { - this.logSuccessfullLoad(e); - - var imgLoader = e.target; - document.body.appendChild(away.parsers.ParserUtils.blobToImage(imgLoader.data)); - }; - - URLLoaderTest.prototype.noAnImageLoaderComplete = function (e) { - this.logSuccessfullLoad(e); - }; - - URLLoaderTest.prototype.wrongURLLoaderComplete = function (e) { - this.logSuccessfullLoad(e); - }; - - URLLoaderTest.prototype.logSuccessfullLoad = function (e) { - var imgLoader = e.target; - console.log('IMG.Event.Complete', imgLoader.url); - }; - - URLLoaderTest.prototype.ioError = function (e) { - var imgLoader = e.target; - console.log('ioError', imgLoader.url); - }; - - URLLoaderTest.prototype.abortError = function (e) { - var imgLoader = e.target; - console.log('abortError', imgLoader.url); - }; - return URLLoaderTest; - })(); - net.URLLoaderTest = URLLoaderTest; - })(tests.net || (tests.net = {})); - var net = tests.net; -})(tests || (tests = {})); -//# sourceMappingURL=IMGLoaderTest.js.map diff --git a/tests/js/IMGLoaderTest.js.map b/tests/js/IMGLoaderTest.js.map deleted file mode 100644 index 25bb6484..00000000 --- a/tests/js/IMGLoaderTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"IMGLoaderTest.js","sourceRoot":"","sources":["../net/IMGLoaderTest.ts"],"names":["tests","tests.net","tests.net.URLLoaderTest","tests.net.URLLoaderTest.constructor","tests.net.URLLoaderTest.pngLoaderComplete","tests.net.URLLoaderTest.jpgLoaderComplete","tests.net.URLLoaderTest.noAnImageLoaderComplete","tests.net.URLLoaderTest.wrongURLLoaderComplete","tests.net.URLLoaderTest.logSuccessfullLoad","tests.net.URLLoaderTest.ioError","tests.net.URLLoaderTest.abortError"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/JSONTextureParser.js b/tests/js/JSONTextureParser.js deleted file mode 100644 index 731cef95..00000000 --- a/tests/js/JSONTextureParser.js +++ /dev/null @@ -1,196 +0,0 @@ -/// -var __extends = this.__extends || function (d, b) { - for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; - function __() { this.constructor = d; } - __.prototype = b.prototype; - d.prototype = new __(); -}; -var parsers; -(function (parsers) { - /** - * ImageParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - var JSONTextureParser = (function (_super) { - __extends(JSONTextureParser, _super); - //private var _loader : Loader; - /** - * Creates a new ImageParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - function JSONTextureParser() { - _super.call(this, away.parsers.ParserDataFormat.PLAIN_TEXT); - //private var _byteData : ByteArray; - this.STATE_PARSE_DATA = 0; - this.STATE_LOAD_IMAGES = 1; - this.STATE_COMPLETE = 2; - this._state = -1; - this._dependencyCount = 0; - - this._loadedTextures = new Array(); - this._state = this.STATE_PARSE_DATA; - } - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - JSONTextureParser.supportsType = function (extension) { - extension = extension.toLowerCase(); - return extension == "json"; - }; - - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - JSONTextureParser.supportsData = function (data) { - try { - var obj = JSON.parse(data); - - if (obj) { - return true; - } - - return false; - } catch (e) { - return false; - } - - return false; - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._iResolveDependency = function (resourceDependency) { - var resource = resourceDependency.assets[0]; - - this._pFinalizeAsset(resource, resourceDependency._iLoader.url); - - this._loadedTextures.push(resource); - - //console.log( 'JSONTextureParser._iResolveDependency' , resourceDependency ); - //console.log( 'JSONTextureParser._iResolveDependency resource: ' , resource ); - this._dependencyCount--; - - if (this._dependencyCount == 0) { - this._state = this.STATE_COMPLETE; - } - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._iResolveDependencyFailure = function (resourceDependency) { - //console.log( '-----------------------------------------------------------'); - //console.log( 'JSONTextureParser._iResolveDependencyFailure', 'x' , resourceDependency ); - this._dependencyCount--; - - if (this._dependencyCount == 0) { - this._state = this.STATE_COMPLETE; - //console.log( 'JSONTextureParser._iResolveDependencyFailure.complete' ); - } - /* - - - if (_dependencyCount == 0) - _parseState = DAEParserState.PARSE_MATERIALS; - */ - }; - - JSONTextureParser.prototype.parseJson = function () { - //console.log( 'JSONTextureParser.parseJson' , typeof this.data ); - if (JSONTextureParser.supportsData(this.data)) { - try { - var json = JSON.parse(this.data); - var data = json.data; - - var rec; - var rq; - - for (var c = 0; c < data.length; c++) { - rec = data[c]; - - var uri = rec.image; - var id = rec.id; - - rq = new away.net.URLRequest(uri); - - //console.log( 'JSONTextureParser.parseJson' , id , uri ); - //console.log( 'JSONTextureParser.parseJson' , id , uri ); - this._pAddDependency('JSON_ID_' + id, rq, false, null, true); - } - - this._dependencyCount = data.length; - this._state = this.STATE_LOAD_IMAGES; - - this._pPauseAndRetrieveDependencies(); //pauseAndRetrieveDependencies - } catch (e) { - this._state = this.STATE_COMPLETE; - } - } - }; - - /** - * @inheritDoc - */ - JSONTextureParser.prototype._pProceedParsing = function () { - console.log('JSONTextureParser._pProceedParsing', this._state); - - switch (this._state) { - case this.STATE_PARSE_DATA: - this.parseJson(); - return away.parsers.ParserBase.MORE_TO_PARSE; - - break; - - case this.STATE_LOAD_IMAGES: - break; - - case this.STATE_COMPLETE: - //console.log( 'JSONTextureParser._pProceedParsing: WE ARE DONE' ); // YAY; - return away.parsers.ParserBase.PARSING_DONE; - - break; - } - - return away.parsers.ParserBase.MORE_TO_PARSE; - /* - var asset : away.textures.Texture2DBase; - - if ( this.data instanceof HTMLImageElement ) - { - - asset = new away.textures.HTMLImageElementTexture( this.data ); - - if ( away.utils.TextureUtils.isHTMLImageElementValid( this.data ) ) - { - - - this._pFinalizeAsset( asset , this._iFileName ); - - - } - else - { - - this.dispatchEvent( new away.events.AssetEvent( away.events.AssetEvent.TEXTURE_SIZE_ERROR , asset ) ); - - } - - return away.loaders.ParserBase.PARSING_DONE; - - } - - return away.loaders.ParserBase.PARSING_DONE; - */ - }; - return JSONTextureParser; - })(away.parsers.ParserBase); - parsers.JSONTextureParser = JSONTextureParser; -})(parsers || (parsers = {})); -//# sourceMappingURL=JSONTextureParser.js.map diff --git a/tests/js/JSONTextureParser.js.map b/tests/js/JSONTextureParser.js.map deleted file mode 100644 index 409be468..00000000 --- a/tests/js/JSONTextureParser.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"JSONTextureParser.js","sourceRoot":"","sources":["../parsers/JSONTextureParser.ts"],"names":["parsers","parsers.JSONTextureParser","parsers.JSONTextureParser.constructor","parsers.JSONTextureParser.supportsType","parsers.JSONTextureParser.supportsData","parsers.JSONTextureParser._iResolveDependency","parsers.JSONTextureParser._iResolveDependencyFailure","parsers.JSONTextureParser.parseJson","parsers.JSONTextureParser._pProceedParsing"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/LayoutTest.js b/tests/js/LayoutTest.js deleted file mode 100644 index 30799852..00000000 --- a/tests/js/LayoutTest.js +++ /dev/null @@ -1,142 +0,0 @@ -/// -// -var tests; -(function (tests) { - (function (entities) { - var View = away.containers.View; - var Billboard = away.entities.Billboard; - var Vector3D = away.geom.Vector3D; - var AssetLibrary = away.library.AssetLibrary; - var CSSMaterialBase = away.materials.CSSMaterialBase; - var ImageTexture = away.textures.ImageTexture; - var URLLoader = away.net.URLLoader; - var URLRequest = away.net.URLRequest; - var Delegate = away.utils.Delegate; - var RequestAnimationFrame = away.utils.RequestAnimationFrame; - - var LayoutTest = (function () { - function LayoutTest() { - this._move = false; - this._billboards = new Array(); - //load an image - AssetLibrary.load(new URLRequest('assets/256x256.png')); - - //listen for a resource complete event - AssetLibrary.addEventListener(away.events.LoaderEvent.RESOURCE_COMPLETE, Delegate.create(this, this.onResourceComplete)); - } - /** - * Listener for resource complete event - * - * @param event - */ - LayoutTest.prototype.onResourceComplete = function (event) { - var _this = this; - //get the image texture - this._imageTexture = event.assets[0]; - - //create the view - this._view = new away.containers.View(new away.render.CSSDefaultRenderer()); - - this._projection = this._view.camera.projection; - - this._projection.coordinateSystem = away.projections.CoordinateSystem.RIGHT_HANDED; - this._projection.focalLength = 1000; - this._projection.preserveFocalLength = true; - this._projection.originX = 0; - this._projection.originY = 0; - - //create a bitmap material - this._bitmapMaterial = new away.materials.CSSMaterialBase(this._imageTexture); - - var billboard; - var numHBillboards = 2; - var numVBillboards = 2; - for (var i = 0; i < numHBillboards; i++) { - for (var j = 0; j < numVBillboards; j++) { - billboard = new Billboard(this._bitmapMaterial); - - //billboard.width = 50; - //billboard.height = 50; - //billboard.pivot = new Vector3D(billboard.billboardWidth/2, billboard.billboardHeight/2, 0); - billboard.x = j * 300; - billboard.y = i * 300; - billboard.z = 0; - billboard.addEventListener(away.events.MouseEvent.MOUSE_MOVE, this.onMouseEvent); - - //billboard.orientationMode = away.base.OrientationMode.CAMERA_PLANE; - //billboard.alignmentMode = away.base.AlignmentMode.PIVOT_POINT; - this._billboards.push(billboard); - - //add billboard to the scene - this._view.scene.addChild(billboard); - } - } - - this._hoverControl = new away.controllers.HoverController(this._view.camera, null, 180, 0, 1000); - - document.onmousedown = function (event) { - return _this.onMouseDownHandler(event); - }; - document.onmouseup = function (event) { - return _this.onMouseUpHandler(event); - }; - document.onmousemove = function (event) { - return _this.onMouseMove(event); - }; - - window.onresize = function (event) { - return _this.onResize(event); - }; - - //trigger an initial resize for the view - this.onResize(null); - - //setup the RAF for a render listener - this._timer = new away.utils.RequestAnimationFrame(this.render, this); - this._timer.start(); - }; - - LayoutTest.prototype.onMouseEvent = function (event) { - console.log(event); - }; - - LayoutTest.prototype.onResize = function (event) { - this._view.x = 0; - this._view.y = 0; - this._view.width = window.innerWidth; - this._view.height = window.innerHeight; - }; - - LayoutTest.prototype.render = function (dt) { - for (var i = 0; i < this._billboards.length; i++) { - //this._billboards[i].rotationZ +=2; - } - - this._view.render(); - }; - - LayoutTest.prototype.onMouseUpHandler = function (event) { - this._move = false; - }; - - LayoutTest.prototype.onMouseMove = function (event) { - if (this._move) { - this._hoverControl.panAngle = 0.3 * (event.clientX - this._lastMouseX) + this._lastPanAngle; - this._hoverControl.tiltAngle = -0.3 * (event.clientY - this._lastMouseY) + this._lastTiltAngle; - } - }; - - LayoutTest.prototype.onMouseDownHandler = function (event) { - this._lastPanAngle = this._hoverControl.panAngle; - this._lastTiltAngle = this._hoverControl.tiltAngle; - this._lastMouseX = event.clientX; - this._lastMouseY = event.clientY; - this._move = true; - }; - return LayoutTest; - })(); - entities.LayoutTest = LayoutTest; - })(tests.entities || (tests.entities = {})); - var entities = tests.entities; -})(tests || (tests = {})); -//# sourceMappingURL=LayoutTest.js.map diff --git a/tests/js/LayoutTest.js.map b/tests/js/LayoutTest.js.map deleted file mode 100644 index d2c23fe0..00000000 --- a/tests/js/LayoutTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"LayoutTest.js","sourceRoot":"","sources":["../entities/LayoutTest.ts"],"names":["tests","tests.entities","tests.entities.LayoutTest","tests.entities.LayoutTest.constructor","tests.entities.LayoutTest.onResourceComplete","tests.entities.LayoutTest.onMouseEvent","tests.entities.LayoutTest.onResize","tests.entities.LayoutTest.render","tests.entities.LayoutTest.onMouseUpHandler","tests.entities.LayoutTest.onMouseMove","tests.entities.LayoutTest.onMouseDownHandler"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/MatrixTest.js b/tests/js/MatrixTest.js deleted file mode 100644 index 373bb19c..00000000 --- a/tests/js/MatrixTest.js +++ /dev/null @@ -1,18 +0,0 @@ -/// -var tests; -(function (tests) { - (function (geom) { - var MatrixTest = (function () { - function MatrixTest() { - this.ma = new away.geom.Matrix(10, 11, 12, 13, 14, 15); - this.mb = new away.geom.Matrix(0, 1, 2, 3, 4, 5); - this.ma.concat(this.mb); - console.log(this.ma); - } - return MatrixTest; - })(); - geom.MatrixTest = MatrixTest; - })(tests.geom || (tests.geom = {})); - var geom = tests.geom; -})(tests || (tests = {})); -//# sourceMappingURL=MatrixTest.js.map diff --git a/tests/js/MatrixTest.js.map b/tests/js/MatrixTest.js.map deleted file mode 100644 index 3d471dd8..00000000 --- a/tests/js/MatrixTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MatrixTest.js","sourceRoot":"","sources":["../geom/MatrixTest.ts"],"names":["tests","tests.geom","tests.geom.MatrixTest","tests.geom.MatrixTest.constructor"],"mappings":"AAAA,oDAAoD;AAEpD,IAAO,KAAK;AAkBX,CAlBD,UAAO,KAAK;KAAZA,UAAaA,IAAIA;QAEbC;YAMIC;gBAHAC,KAAQA,EAAEA,GAAsBA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,MAAMA,CAAEA,EAAEA,EAAGA,EAAEA,EAAEA,EAAEA,EAAGA,EAAEA,EAAGA,EAAEA,EAAGA,EAAEA,CAACA,CAACA;gBAClFA,KAAQA,EAAEA,GAAsBA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,MAAMA,CAAEA,CAACA,EAAGA,CAACA,EAAEA,CAACA,EAAGA,CAACA,EAAGA,CAACA,EAAGA,CAACA,CAACA,CAACA;gBAKxEA,IAAIA,CAACA,EAAEA,CAACA,MAAMA,CAAEA,IAAIA,CAACA,EAAEA,CAAEA;gBACzBA,OAAOA,CAACA,GAAGA,CAAEA,IAAIA,CAACA,EAAEA,CAAEA;YAE1BA,CAACA;YAGLD,kBAACA;QAADA,CAACA,IAAAD;QAfDA,6BAeCA;IACLA,CAACA,mCAAAD;0BAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/MipMapTest.js b/tests/js/MipMapTest.js deleted file mode 100644 index b82e71ea..00000000 --- a/tests/js/MipMapTest.js +++ /dev/null @@ -1,100 +0,0 @@ -/// -var tests; -(function (tests) { - (function (utils) { - var Delegate = away.utils.Delegate; - - var MipMapTest = (function () { - function MipMapTest() { - var _this = this; - this._rect = new away.geom.Rectangle(); - this._matrix = new away.geom.Matrix(); - //--------------------------------------- - // Load a PNG - var mipUrlRequest = new away.net.URLRequest('assets/1024x1024.png'); - this.mipLoader = new away.net.URLLoader(); - this.mipLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.mipLoader.load(mipUrlRequest); - this.mipLoader.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.mipImgLoaded)); - - document.onmousedown = function (e) { - return _this.onMouseDown(e); - }; - } - MipMapTest.prototype.mipImgLoaded = function (e) { - var _this = this; - var loader = e.target; - var image = away.parsers.ParserUtils.blobToImage(loader.data); - image.onload = function (event) { - return _this.onImageLoad(event); - }; - }; - - MipMapTest.prototype.onImageLoad = function (event) { - var image = event.target; - alert('Each click will generate a level of MipMap'); - - this.sourceBitmap = new away.base.BitmapData(1024, 1024, true, 0xff0000); - this.sourceBitmap.drawImage(image, this.sourceBitmap.rect, this.sourceBitmap.rect); - this.sourceBitmap.canvas.style.position = 'absolute'; - this.sourceBitmap.canvas.style.left = '0px'; - this.sourceBitmap.canvas.style.top = '1030px'; - - //document.body.appendChild( this.sourceBitmap.canvas ); - this.mipMap = new away.base.BitmapData(1024, 1024, true, 0xff0000); - this.mipMap.canvas.style.position = 'absolute'; - this.mipMap.canvas.style.left = '0px'; - this.mipMap.canvas.style.top = '0px'; - - document.body.appendChild(this.mipMap.canvas); - - this._rect.width = this.sourceBitmap.width; - this._rect.height = this.sourceBitmap.height; - - this.w = this.sourceBitmap.width; - this.h = this.sourceBitmap.height; - }; - - MipMapTest.prototype.onMouseDown = function (e) { - this.generateMipMap(this.sourceBitmap, this.mipMap); - }; - - MipMapTest.prototype.generateMipMap = function (source, mipmap, alpha, side) { - if (typeof mipmap === "undefined") { mipmap = null; } - if (typeof alpha === "undefined") { alpha = false; } - if (typeof side === "undefined") { side = -1; } - var c = this.w; - var i; - - console['time']('MipMap' + c); - - if ((this.w >= 1) || (this.h >= 1)) { - if (alpha) { - mipmap.fillRect(this._rect, 0); - } - - this._matrix.a = this._rect.width / source.width; - this._matrix.d = this._rect.height / source.height; - - mipmap.width = this.w; - mipmap.height = this.h; - mipmap.copyPixels(source, source.rect, new away.geom.Rectangle(0, 0, this.w, this.h)); - - this.w >>= 1; - this.h >>= 1; - - this._rect.width = this.w > 1 ? this.w : 1; - this._rect.height = this.h > 1 ? this.h : 1; - } - - console.log('away.utils.TextureUtils.isBitmapDataValid: ', away.utils.TextureUtils.isBitmapDataValid(mipmap)); - - console['timeEnd']('MipMap' + c); - }; - return MipMapTest; - })(); - utils.MipMapTest = MipMapTest; - })(tests.utils || (tests.utils = {})); - var utils = tests.utils; -})(tests || (tests = {})); -//# sourceMappingURL=MipMapTest.js.map diff --git a/tests/js/MipMapTest.js.map b/tests/js/MipMapTest.js.map deleted file mode 100644 index 591f6cb9..00000000 --- a/tests/js/MipMapTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MipMapTest.js","sourceRoot":"","sources":["../utils/MipMapTest.ts"],"names":["tests","tests.utils","tests.utils.MipMapTest","tests.utils.MipMapTest.constructor","tests.utils.MipMapTest.mipImgLoaded","tests.utils.MipMapTest.onImageLoad","tests.utils.MipMapTest.onMouseDown","tests.utils.MipMapTest.generateMipMap"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/RequestAnimationFrameTest.js b/tests/js/RequestAnimationFrameTest.js deleted file mode 100644 index 8ba574e2..00000000 --- a/tests/js/RequestAnimationFrameTest.js +++ /dev/null @@ -1,34 +0,0 @@ -/// -var tests; -(function (tests) { - (function (utils) { - var RequestAnimationFrameTest = (function () { - function RequestAnimationFrameTest() { - var _this = this; - this.requestAnimationFrameTimer = new away.utils.RequestAnimationFrame(this.tick, this); - this.requestAnimationFrameTimer.start(); - - document.onmousedown = function (e) { - return _this.onMouseDown(e); - }; - } - RequestAnimationFrameTest.prototype.onMouseDown = function (e) { - console.log('mouseDown'); - - if (this.requestAnimationFrameTimer.active) { - this.requestAnimationFrameTimer.stop(); - } else { - this.requestAnimationFrameTimer.start(); - } - }; - - RequestAnimationFrameTest.prototype.tick = function (dt) { - console.log('tick'); - }; - return RequestAnimationFrameTest; - })(); - utils.RequestAnimationFrameTest = RequestAnimationFrameTest; - })(tests.utils || (tests.utils = {})); - var utils = tests.utils; -})(tests || (tests = {})); -//# sourceMappingURL=RequestAnimationFrameTest.js.map diff --git a/tests/js/RequestAnimationFrameTest.js.map b/tests/js/RequestAnimationFrameTest.js.map deleted file mode 100644 index 4783a8cd..00000000 --- a/tests/js/RequestAnimationFrameTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"RequestAnimationFrameTest.js","sourceRoot":"","sources":["../utils/RequestAnimationFrameTest.ts"],"names":["tests","tests.utils","tests.utils.RequestAnimationFrameTest","tests.utils.RequestAnimationFrameTest.constructor","tests.utils.RequestAnimationFrameTest.onMouseDown","tests.utils.RequestAnimationFrameTest.tick"],"mappings":"AAAA,oDAAoD;AAEpD,IAAO,KAAK;AAgDX,CAhDD,UAAO,KAAK;KAAZA,UAAaA,KAAKA;QAEdC;YAMIC;gBAAAC,iBAQCA;gBALGA,IAAIA,CAACA,0BAA0BA,GAAGA,IAAIA,IAAIA,CAACA,KAAKA,CAACA,qBAAqBA,CAAEA,IAAIA,CAACA,IAAIA,EAAGA,IAAIA,CAAEA;gBAC1FA,IAAIA,CAACA,0BAA0BA,CAACA,KAAKA,CAACA,CAACA;;gBAEvCA,QAAQA,CAACA,WAAWA,GAAGA,UAAEA,CAACA;2BAAMA,KAAIA,CAACA,WAAWA,CAAEA,CAACA,CAAEA;gBAArBA,CAAqBA;YAEzDA,CAACA;YAEDD,kDAAAA,UAAqBA,CAACA;gBAGlBE,OAAOA,CAACA,GAAGA,CAAEA,WAAWA,CAACA;;gBAEzBA,IAAKA,IAAIA,CAACA,0BAA0BA,CAACA,MAAMA,CAC3CA;oBAEIA,IAAIA,CAACA,0BAA0BA,CAACA,IAAIA,CAACA,CAACA;iBAEzCA,KAEDA;oBAEIA,IAAIA,CAACA,0BAA0BA,CAACA,KAAKA,CAACA,CAACA;iBAE1CA;YAELA,CAACA;;YAEDF,2CAAAA,UAAcA,EAAWA;gBAGrBG,OAAOA,CAACA,GAAGA,CAAEA,MAAMA,CAAEA;YAEzBA,CAACA;YAGLH,iCAACA;QAADA,CAACA,IAAAD;QA5CDA,4DA4CCA;IAELA,CAACA,qCAAAD;4BAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/TimerTest.js b/tests/js/TimerTest.js deleted file mode 100644 index 6eeefe76..00000000 --- a/tests/js/TimerTest.js +++ /dev/null @@ -1,38 +0,0 @@ -/// -var tests; -(function (tests) { - (function (utils) { - var Delegate = away.utils.Delegate; - - var TimerTest = (function () { - function TimerTest() { - this.oneSecondTimer = new away.utils.Timer(1000); - this.oneSecondTimer.addEventListener(away.events.TimerEvent.TIMER, Delegate.create(this, this.onSecTimerEvent)); - this.oneSecondTimer.start(); - - this.repeatTenTimes = new away.utils.Timer(100, 10); - this.repeatTenTimes.addEventListener(away.events.TimerEvent.TIMER, Delegate.create(this, this.repeatTenTimesEvent)); - this.repeatTenTimes.addEventListener(away.events.TimerEvent.TIMER_COMPLETE, Delegate.create(this, this.repeatTenTimesComplete)); - this.repeatTenTimes.start(); - } - TimerTest.prototype.repeatTenTimesEvent = function (e) { - var t = e.target; - console.log('repeatTenTimesEvent', t.currentCount); - }; - - TimerTest.prototype.repeatTenTimesComplete = function (e) { - var t = e.target; - console.log('repeatTenTimesComplete', t.currentCount); - }; - - TimerTest.prototype.onSecTimerEvent = function (e) { - console.log('onSecTimerEvent, tick'); - console.log('getTimer() : ', away.utils.getTimer()); - }; - return TimerTest; - })(); - utils.TimerTest = TimerTest; - })(tests.utils || (tests.utils = {})); - var utils = tests.utils; -})(tests || (tests = {})); -//# sourceMappingURL=TimerTest.js.map diff --git a/tests/js/TimerTest.js.map b/tests/js/TimerTest.js.map deleted file mode 100644 index b9f6d7a9..00000000 --- a/tests/js/TimerTest.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TimerTest.js","sourceRoot":"","sources":["../utils/TimerTest.ts"],"names":["tests","tests.utils","tests.utils.TimerTest","tests.utils.TimerTest.constructor","tests.utils.TimerTest.repeatTenTimesEvent","tests.utils.TimerTest.repeatTenTimesComplete","tests.utils.TimerTest.onSecTimerEvent"],"mappings":"AAAA,oDAAoD;AAEpD,IAAO,KAAK;AAoDX,CApDD,UAAO,KAAK;KAAZA,UAAaA,KAAKA;QAGjBC,eAAqBA,IAAIA,CAACA,KAAKA,CAACA,QAAQA;;QAErCA;YAMIC;gBAGIC,IAAIA,CAACA,cAAcA,GAAGA,IAAIA,IAAIA,CAACA,KAAKA,CAACA,KAAKA,CAAEA,IAAIA,CAAEA;gBAClDA,IAAIA,CAACA,cAAcA,CAACA,gBAAgBA,CAACA,IAAIA,CAACA,MAAMA,CAACA,UAAUA,CAACA,KAAKA,EAAGA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,eAAeA,CAACA,CAAEA;gBACjHA,IAAIA,CAACA,cAAcA,CAACA,KAAKA,CAACA,CAACA;;gBAE3BA,IAAIA,CAACA,cAAcA,GAAGA,IAAIA,IAAIA,CAACA,KAAKA,CAACA,KAAKA,CAAEA,GAAGA,EAAGA,EAAEA,CAAEA;gBACtDA,IAAIA,CAACA,cAAcA,CAACA,gBAAgBA,CAACA,IAAIA,CAACA,MAAMA,CAACA,UAAUA,CAACA,KAAKA,EAAGA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,mBAAmBA,CAACA,CAAEA;gBACrHA,IAAIA,CAACA,cAAcA,CAACA,gBAAgBA,CAACA,IAAIA,CAACA,MAAMA,CAACA,UAAUA,CAACA,cAAcA,EAAEA,QAAQA,CAACA,MAAMA,CAACA,IAAIA,EAAEA,IAAIA,CAACA,sBAAsBA,CAACA,CAAEA;gBAChIA,IAAIA,CAACA,cAAcA,CAACA,KAAKA,CAACA,CAACA;YAE/BA,CAACA;YAEDD,0CAAAA,UAA6BA,CAA0BA;gBAInDE,IAAIA,CAACA,GAAyCA,CAACA,CAACA,MAAMA;gBACtDA,OAAOA,CAACA,GAAGA,CAACA,qBAAqBA,EAAGA,CAACA,CAACA,YAAYA,CAAEA;YAExDA,CAACA;;YAEDF,6CAAAA,UAAgCA,CAA0BA;gBAGtDG,IAAIA,CAACA,GAAyCA,CAACA,CAACA,MAAMA;gBACtDA,OAAOA,CAACA,GAAGA,CAACA,wBAAwBA,EAAGA,CAACA,CAACA,YAAYA,CAAEA;YAE3DA,CAACA;;YAEDH,sCAAAA,UAAyBA,CAA0BA;gBAG/CI,OAAOA,CAACA,GAAGA,CAACA,uBAAuBA,CAACA;gBACpCA,OAAOA,CAACA,GAAGA,CAAEA,eAAeA,EAAGA,IAAIA,CAACA,KAAKA,CAACA,QAAQA,CAACA,CAACA,CAAEA;YAE1DA,CAACA;YAELJ,iBAACA;QAADA,CAACA,IAAAD;QA7CDA,4BA6CCA;IAELA,CAACA,qCAAAD;4BAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/js/URLLoaderTests.js b/tests/js/URLLoaderTests.js deleted file mode 100644 index 6c020a12..00000000 --- a/tests/js/URLLoaderTests.js +++ /dev/null @@ -1,180 +0,0 @@ -/// -var tests; -(function (tests) { - (function (net) { - var Delegate = away.utils.Delegate; - - var LoaderTest = (function () { - function LoaderTest() { - console.log('start'); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // POST URL Variables to PHP script - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - this.urlLoaderPostURLVars = new away.net.URLLoader(); - this.urlLoaderPostURLVars.dataFormat = away.net.URLLoaderDataFormat.VARIABLES; - - var urlStr = 'fname=karim&lname=' + Math.floor(Math.random() * 100); - var urlVars = new away.net.URLVariables(urlStr); - - var req = new away.net.URLRequest('assets/saveData.php'); - req.method = away.net.URLRequestMethod.POST; - req.data = urlVars; - - this.urlLoaderPostURLVars.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.postURLTestComplete)); - this.urlLoaderPostURLVars.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.urlLoaderPostURLVars.load(req); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // GET CSV File - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - var csrReq = new away.net.URLRequest('assets/airports.csv'); - - this.urlLoaderGetCSV = new away.net.URLLoader(); - this.urlLoaderGetCSV.dataFormat = away.net.URLLoaderDataFormat.TEXT; - this.urlLoaderGetCSV.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.getCsvComplete)); - this.urlLoaderGetCSV.addEventListener(away.events.Event.OPEN, Delegate.create(this, this.getCsvOpen)); - this.urlLoaderGetCSV.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.urlLoaderGetCSV.load(csrReq); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // ERROR test - load a non-existing object - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - var errorReq = new away.net.URLRequest('assets/generatingError'); - - this.urlLoaderErrorTest = new away.net.URLLoader(); - this.urlLoaderErrorTest.dataFormat = away.net.URLLoaderDataFormat.TEXT; - this.urlLoaderErrorTest.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.errorComplete)); - this.urlLoaderErrorTest.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.urlLoaderErrorTest.addEventListener(away.events.HTTPStatusEvent.HTTP_STATUS, Delegate.create(this, this.httpStatusChange)); - this.urlLoaderErrorTest.load(errorReq); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // GET URL Vars - get URL variables - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - var csrReq = new away.net.URLRequest('assets/getUrlVars.php'); - - this.urlLoaderGetURLVars = new away.net.URLLoader(); - this.urlLoaderGetURLVars.dataFormat = away.net.URLLoaderDataFormat.VARIABLES; - this.urlLoaderGetURLVars.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.urlLoaderGetURLVars.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.getURLVarsComplete)); - this.urlLoaderGetURLVars.load(csrReq); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // LOAD Binary file - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - var binReq = new away.net.URLRequest('assets/suzanne.awd'); - - this.urlLoaderBinary = new away.net.URLLoader(); - this.urlLoaderBinary.dataFormat = away.net.URLLoaderDataFormat.BINARY; - this.urlLoaderBinary.addEventListener(away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError)); - this.urlLoaderBinary.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.binFileLoaded)); - this.urlLoaderBinary.load(binReq); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // LOAD Blob file - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - var blobReq = new away.net.URLRequest('assets/2.png'); - - this.urlLoaderBlob = new away.net.URLLoader(); - this.urlLoaderBlob.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.urlLoaderBlob.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.blobFileLoaded)); - this.urlLoaderBlob.load(blobReq); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // ARRAY_BUFFER Test - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - var arrBReq = new away.net.URLRequest('assets/1.jpg'); - - this.urlLoaderArrb = new away.net.URLLoader(); - this.urlLoaderArrb.dataFormat = away.net.URLLoaderDataFormat.ARRAY_BUFFER; - this.urlLoaderArrb.addEventListener(away.events.Event.COMPLETE, Delegate.create(this, this.arrayBufferLoaded)); - this.urlLoaderArrb.load(arrBReq); - } - LoaderTest.prototype.arrayBufferLoaded = function (event) { - var arrayBuffer = this.urlLoaderArrb.data; - var byteArray = new Uint8Array(arrayBuffer); - - console.log('LoaderTest.arrayBufferLoaded', byteArray[1]); - - for (var i = 0; i < byteArray.byteLength; i++) { - //console.log( byteArray[i] ); - } - }; - - LoaderTest.prototype.blobFileLoaded = function (event) { - var blob = new Blob([this.urlLoaderBlob.data], { type: 'image/png' }); - var img = document.createElement('img'); - img.src = this.createObjectURL(blob); //window['URL']['createObjectURL'](blob); - img.onload = function (e) { - window['URL']['revokeObjectURL'](img.src); // Clean up after yourself. - }; - - console.log('LoaderTest.blobFileLoaded', blob); - - document.body.appendChild(img); - }; - - LoaderTest.prototype.createObjectURL = function (fileBlob) { - // For some reason TypeScript has "window.URL.createObjectURL" in it's dictionary - - // but window.URL causes an error - // cannot make my own .d.ts file either ( results in duplicate definition error ) - // This HACK gets it to work: window['URL']['createObjectURL'] - if (window['URL']) { - if (window['URL']['createObjectURL']) { - return window['URL']['createObjectURL'](fileBlob); - } - } else { - if (window['webkitURL']) { - return window['webkitURL']['createObjectURL'](fileBlob); - } - } - - return null; - }; - - LoaderTest.prototype.binFileLoaded = function (event) { - var loader = event.target; - console.log('LoaderTest.binFileLoaded', loader.data.length); - }; - - LoaderTest.prototype.getURLVarsComplete = function (event) { - var loader = event.target; - console.log('LoaderTest.getURLVarsComplete', loader.data); - }; - - LoaderTest.prototype.httpStatusChange = function (event) { - console.log('LoaderTest.httpStatusChange', event.status); - }; - - LoaderTest.prototype.ioError = function (event) { - var loader = event.target; - console.log('LoaderTest.ioError', loader.url); - }; - - LoaderTest.prototype.errorComplete = function (event) { - var loader = event.target; - console.log('LoaderTest.errorComplete'); //, loader.data ); - }; - - LoaderTest.prototype.postURLTestComplete = function (event) { - var loader = event.target; - console.log('LoaderTest.postURLTestComplete', loader.data); - }; - - LoaderTest.prototype.getCsvComplete = function (event) { - var loader = event.target; - console.log('LoaderTest.getCsvComplete'); //, loader.data ); - }; - - LoaderTest.prototype.getCsvOpen = function (event) { - var loader = event.target; - console.log('LoaderTest.getCsvOpen'); - }; - return LoaderTest; - })(); - net.LoaderTest = LoaderTest; - })(tests.net || (tests.net = {})); - var net = tests.net; -})(tests || (tests = {})); -//# sourceMappingURL=URLLoaderTests.js.map diff --git a/tests/js/URLLoaderTests.js.map b/tests/js/URLLoaderTests.js.map deleted file mode 100644 index 0f02a2da..00000000 --- a/tests/js/URLLoaderTests.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"URLLoaderTests.js","sourceRoot":"","sources":["../net/URLLoaderTests.ts"],"names":["tests","tests.net","tests.net.LoaderTest","tests.net.LoaderTest.constructor","tests.net.LoaderTest.arrayBufferLoaded","tests.net.LoaderTest.blobFileLoaded","tests.net.LoaderTest.createObjectURL","tests.net.LoaderTest.binFileLoaded","tests.net.LoaderTest.getURLVarsComplete","tests.net.LoaderTest.httpStatusChange","tests.net.LoaderTest.ioError","tests.net.LoaderTest.errorComplete","tests.net.LoaderTest.postURLTestComplete","tests.net.LoaderTest.getCsvComplete","tests.net.LoaderTest.getCsvOpen"],"mappings":"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"} \ No newline at end of file diff --git a/tests/js/VextMat3DTests.js b/tests/js/VextMat3DTests.js deleted file mode 100644 index e46a5a17..00000000 --- a/tests/js/VextMat3DTests.js +++ /dev/null @@ -1,994 +0,0 @@ -/// -var tests; -(function (tests) { - (function (geom) { - var VextMat3DTests = (function () { - function VextMat3DTests() { - var m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var v = new away.geom.Vector3D(); - - console.log('------------------------------------ copyColumnTo'); // DONE OK - - m.copyColumnTo(0, v); - console.log('copyColumnTo 0 ', v); - m.copyColumnTo(1, v); - console.log('copyColumnTo 1 ', v); - m.copyColumnTo(2, v); - console.log('copyColumnTo 2 ', v); - m.copyColumnTo(3, v); - console.log('copyColumnTo 3 ', v); - - console.log('------------------------------------ copyRowTo'); // DONE OK - - var r = new away.geom.Vector3D(); - - m.copyRowTo(0, r); - console.log('copyRowTo 0 ', r); - m.copyRowTo(1, r); - console.log('copyRowTo 1 ', r); - m.copyRowTo(2, r); - console.log('copyRowTo 2 ', r); - m.copyRowTo(3, r); - console.log('copyRowTo 3 ', r); - - console.log('------------------------------------ copyRowFrom'); // DONE OK - - m = new away.geom.Matrix3D([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - - m.copyRowFrom(0, new away.geom.Vector3D(16, 15, 14, 13)); - console.log('copyRowFrom 0 ', m.rawData); - m.copyRowFrom(1, new away.geom.Vector3D(12, 11, 10, 9)); - console.log('copyRowFrom 1 ', m.rawData); - m.copyRowFrom(2, new away.geom.Vector3D(8, 7, 6, 5)); - console.log('copyRowFrom 2 ', m.rawData); - m.copyRowFrom(3, new away.geom.Vector3D(4, 3, 2, 1)); - console.log('copyRowFrom 3 ', m.rawData); - - console.log('------------------------------------ copyColumnFrom'); // DONE OK - - m = new away.geom.Matrix3D([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - - m.copyColumnFrom(0, new away.geom.Vector3D(16, 15, 14, 13)); - console.log('copyColumnFrom 0 ', m.rawData); - m.copyColumnFrom(1, new away.geom.Vector3D(12, 11, 10, 9)); - console.log('copyColumnFrom 1 ', m.rawData); - m.copyColumnFrom(2, new away.geom.Vector3D(8, 7, 6, 5)); - console.log('copyColumnFrom 2 ', m.rawData); - m.copyColumnFrom(3, new away.geom.Vector3D(4, 3, 2, 1)); - console.log('copyColumnFrom 3 ', m.rawData); - - console.log('------------------------------------ Append'); // DONE OK - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var s = new away.geom.Matrix3D([ - 16, 15, 14, 13, - 12, 11, 10, 9, - 8, 7, 6, 5, - 4, 3, 2, 1]); - - m.append(s); - - console.log('Append Result', m.rawData); - console.log('Appendee', s.rawData); - - console.log('------------------------------------ Prepend'); // DONE OK - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - s = new away.geom.Matrix3D([ - 16, 15, 14, 13, - 12, 11, 10, 9, - 8, 7, 6, 5, - 4, 3, 2, 1]); - - m.prepend(s); - - console.log('Prepend Result', m.rawData); - console.log('Prependee', s.rawData); - - console.log('------------------------------------ Append Translation'); // DONE OK - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - m.appendTranslation(5, 6, 7); - console.log(' Append Translation', m.rawData); - - console.log('------------------------------------ appendRotation'); // DONE OK - Pivot gives different result ( commented out for now ) - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var pivot = new away.geom.Vector3D(7, 8, 9); - - var axis = new away.geom.Vector3D(0, 0, 1); - m.appendRotation(45, axis); //, pivot ); - console.log('appendRotation', m.rawData); - - console.log('------------------------------------ appendScale'); // DONE OK - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - m.appendScale(6, 7, 8); - console.log('appendScale', m.rawData); - - console.log('------------------------------------ prepentScale'); // DONE OK - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - m.prependScale(6, 7, 8); - console.log('prepentScale', m.rawData); - - console.log('------------------------------------ clone'); // DONE OK - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - console.log('clone', m.clone().rawData); - - console.log('------------------------------------ copyFrom'); // DONE OK - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var cl = new away.geom.Matrix3D([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); - cl.copyFrom(m); - - console.log('copyFrom', cl.rawData); - - console.log('------------------------------------ copyRawDataFrom'); // DONE ok - Offet / Traspose not implemented - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - m.copyRawDataFrom([16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]); - - console.log('copyRawDataFrom', m.rawData); - - console.log('------------------------------------ copyRawDataTo'); // done OK - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var result = new Array(9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9); - - console.log('result.length: ', result.length); - - m.copyRawDataTo(result, 1, true); - console.log('rawData', m.rawData); - console.log('copyRawDataTo', result); - - console.log('------------------------------------ transpose'); // DONE ok - Offet / Traspose not implemented - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - m.transpose(); - console.log('transpose', m.rawData); - - console.log('------------------------------------ copyToMatrix3D'); // done ok - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - s = new away.geom.Matrix3D([ - 16, 15, 14, 13, - 12, 11, 10, 9, - 8, 7, 6, 5, - 4, 3, 2, 1]); - - m.copyToMatrix3D(s); - console.log('copyToMatrix3D', m.rawData); - - console.log('------------------------------------ decompose'); /// NOT WORKING - - m = new away.geom.Matrix3D([ - 1, 6, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1]); - - var resultDecompose = m.decompose(); - console.log('copyToMatrix3D', resultDecompose[0]); - console.log('copyToMatrix3D', resultDecompose[1]); - console.log('copyToMatrix3D', resultDecompose[2]); - - console.log('------------------------------------ determinant'); // WORKING ok - good - - m = new away.geom.Matrix3D([ - 1, 2, 0, 6, - 2, 1, 0, 0, - 0, 0, 1, 3, - 6, 0, 3, 1]); - - console.log('determinant:', m.determinant); - - m = new away.geom.Matrix3D([ - 1, 2, 5, 6, - 2, 1, 0, 8, - 5, 0, 1, 3, - 6, 8, 3, 1]); - - console.log('determinant:', m.determinant); - - m = new away.geom.Matrix3D([ - 1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1]); - - console.log('determinant:', m.determinant); - - console.log('------------------------------------ invert'); // WORKING ok - good - - m = new away.geom.Matrix3D([ - 1, 2, 5, 6, - 2, 1, 0, 8, - 5, 0, 1, 3, - 6, 8, 3, 1]); - - var b; - - b = m.invert(); - console.log('invert:', b, m.rawData); - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - b = m.invert(); - console.log('invert:', b, m.rawData); - - console.log('------------------------------------ Prepend Rotation'); // OK Good - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - axis = new away.geom.Vector3D(1, 0, 0); - m.prependRotation(45, axis); - - console.log('prependRotation:', m.rawData); - - console.log('------------------------------------ prependTranslation'); // OK Good - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - m.prependTranslation(5, 10, 15); - - console.log('prependTranslation:', m.rawData); - - console.log('------------------------------------ recompose'); // OK Good - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var rVects = new Array(); - rVects.push(new away.geom.Vector3D(5, 1, 3)); - rVects.push(new away.geom.Vector3D(5, 0, 1)); - rVects.push(new away.geom.Vector3D(2, 1, 3)); - - m.recompose(rVects); - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - rVects = new Array(); - rVects.push(new away.geom.Vector3D(1, 2, 9)); - rVects.push(new away.geom.Vector3D(3, 3, 1)); - rVects.push(new away.geom.Vector3D(8, 1, 8)); - - m.recompose(rVects); - - console.log('recompose:', m.rawData); - - rVects = new Array(); - rVects.push(new away.geom.Vector3D(1, 2, 9)); - rVects.push(new away.geom.Vector3D(3, 3, 1)); - rVects.push(new away.geom.Vector3D(0, 0, 0)); - - var b = m.recompose(rVects); - - console.log('fail - recompose:', m.rawData, b); - - console.log('------------------------------------ transformVector '); // IT WORKS !!! - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var tVResult = m.transformVector(new away.geom.Vector3D(1, 2, 3)); - - console.log(tVResult); - - console.log('------------------------------------ transformVector '); // IT WORKS !!! - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var vout = new Array(0, 1, 2, 3, 4, 5); - var vin = new Array(4, 5, 6); - m.transformVectors(vin, vout); - console.log('transformVector', vout, vin); - - console.log('------------------------------------ transpose'); // IT WORKS !!! - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - m.transpose(); - console.log('transpose', m.rawData); - - console.log('------------------------------------ getAxisRotation'); // internal class - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - //m.getAxisRotation(4 , 5 , 6 , 90 ); - //console.log( 'getAxisRotation' , m.rawData ); - console.log('------------------------------------ position'); // internal class - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 11, 12, - 13, 14, 15, 16]); - - var posVect = new away.geom.Vector3D(5, 10, 15); - - m.position = posVect; - - console.log('set position', m.rawData); - console.log('get position', m.position); - } - VextMat3DTests.prototype.testappend = function () { - var v = new away.geom.Vector3D(0, 1, 1); - var v1 = new away.geom.Vector3D(1, 0, 1); - var v2 = new away.geom.Vector3D(7, 8, 0); - - var t = new away.geom.Matrix3D([ - 0, 10, 10, 1, - 10, 5, 10, 10, - 10, 10, 5, 10, - 1, 10, 10, 0]); - - var d = new away.geom.Matrix3D([ - 1, 50, 1, 8, - 2, 5, 12, 9, - 30, 16, 35, 10, - 4, 18, 40, 11]); - t.append(d); - - console.log(t.rawData); - }; - - VextMat3DTests.prototype.testprependRotation = function () { - var v = new away.geom.Vector3D(0, 1, 1); - var v1 = new away.geom.Vector3D(1, 0, 1); - var v2 = new away.geom.Vector3D(7, 8, 0); - - var t = new away.geom.Matrix3D([ - 0, 10, 10, 1, - 10, 5, 10, 10, - 10, 10, 5, 10, - 1, 10, 10, 0]); - - var d = new away.geom.Matrix3D(); - t.prependRotation(90, v); - - console.log(t.rawData); - }; - - VextMat3DTests.prototype.testcopyToMatrix3D = function () { - var v = new away.geom.Vector3D(0, 2, 3); - var v1 = new away.geom.Vector3D(4, 0, 6); - var v2 = new away.geom.Vector3D(7, 8, 0); - - var t = new away.geom.Matrix3D([ - 0, 10, 10, 1, - 10, 5, 10, 10, - 10, 10, 5, 10, - 1, 10, 10, 0]); - - var d = new away.geom.Matrix3D(); - - //t.copyToMatrix3D( d ) ; - console.log(d.rawData); - }; - - VextMat3DTests.prototype.testDecompose = function () { - console.log('----------------------------------------------------------------------'); - console.log('testDecompose'); - var v; - var m; - var r = new Array(16); - - for (var c = 0; c < 10; c++) { - m = new away.geom.Matrix3D([ - this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), - this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), - this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), - this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100), this.getRnd(-100, 100)]); - - m.copyRawDataTo(r); - - v = m.decompose(); - this.outputDecompose(m.rawData, r, v[0], v[1], v[2]); - } - - /* - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1] ); - m.copyRawDataTo( r ); - v = m.decompose(); - this.outputDecompose(m.rawData , r , v[0], v[1], v[2]); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1] ); - m.copyRawDataTo( r ); - v = m.decompose(); - this.outputDecompose(m.rawData , r , v[0], v[1], v[2]); - - m = new away.geom.Matrix3D( [ 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1] ); - m.copyRawDataTo( r ); - v = m.decompose(); - this.outputDecompose(m.rawData , r , v[0], v[1], v[2]); - */ - console.log('//------------------------------------------------------------ AS3'); - console.log('private function testDecompose( result : Vector. , original : Vector. , a1 : Vector3D , a2 : Vector3D , a3 : Vector3D )'); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' var result : Vector. = m.decompose();'); - console.log(" trace('0----------------------------------------');"); - console.log(" trace( r[0])"); - console.log(" trace( a1 )"); - console.log(" trace('1--------------------');"); - console.log(" trace( r[1])"); - console.log(" trace( a2 )"); - console.log(" trace('2--------------------');"); - console.log(" trace( r[2])"); - console.log(" trace( a3 )"); - console.log(" trace('--------------------');"); - console.log(" trace( 'TSResult: ' , result );"); - console.log(" trace( 'ASResult: ' , m.rawData );"); - console.log(" trace( 'original: ' , original );"); - console.log(" trace('--------------------');"); - console.log('}'); - }; - - VextMat3DTests.prototype.outputDecompose = function (result, original, a1, a2, a3) { - var s1 = 'new Vector3D( ' + a1.x + ' , ' + a1.y + ' , ' + a1.z + ' )'; - var s2 = 'new Vector3D( ' + a2.x + ' , ' + a2.y + ' , ' + a2.z + ' )'; - var s3 = 'new Vector3D( ' + a3.x + ' , ' + a3.y + ' , ' + a3.z + ' )'; - - console.log('testDecompose( new [' + result + '], new [' + original + '] , ' + s1 + ' , ' + s2 + ' , ' + s3 + ' );'); - }; - - VextMat3DTests.prototype.testPosition = function () { - console.log('----------------------------------------------------------------------'); - console.log('testPosition'); - var v = new away.geom.Vector3D(1, 2, 3); - var p = new away.geom.Vector3D(2, 2, 2); - var pos; - - var m; - var i; - var r = new Array(16); - - m = new away.geom.Matrix3D([ - 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1]); - m.copyRawDataTo(r); - m.position = v; - pos = m.position; - this.outputPosition(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1]); - m.copyRawDataTo(r); - m.position = v; - pos = m.position; - this.outputPosition(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1]); - m.copyRawDataTo(r); - m.position = v; - pos = m.position; - this.outputPosition(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1]); - m.copyRawDataTo(r); - m.position = v; - pos = m.position; - this.outputPosition(m.rawData, r, v); - - console.log('//------------------------------------------------------------ AS3'); - console.log('private function testPosition( result : Vector. , original : Vector. , t : Vector3D )'); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' m.position = t;'); - console.log(' var p : Vector3D = m.position;'); - console.log(' trace( "TSResult: " , result );'); - console.log(' trace( "ASResult: " , m.rawData );'); - console.log(' trace( "Pos: " ,p );'); - console.log('}'); - }; - VextMat3DTests.prototype.outputPosition = function (result, original, posResult) { - var a = 'new Vector3D( ' + posResult.x + ' , ' + posResult.y + ' , ' + posResult.z + ' )'; - - console.log('testPosition( new [' + result + '], new [' + original + '] , ' + a + ');'); - }; - - VextMat3DTests.prototype.testAppendScale = function () { - console.log('----------------------------------------------------------------------'); - console.log('testAppendScale'); - var v = new away.geom.Vector3D(1, 2, 3); - var p = new away.geom.Vector3D(2, 2, 2); - - var m; - var i; - var r = new Array(16); - - m = new away.geom.Matrix3D([ - 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1]); - m.copyRawDataTo(r); - m.appendScale(v.x, v.y, v.z); - - this.outputAppendScale(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1]); - - m.copyRawDataTo(r); - m.appendScale(v.x, v.y, v.z); - this.outputAppendScale(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1]); - - m.copyRawDataTo(r); - m.appendScale(v.x, v.y, v.z); - this.outputAppendScale(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1]); - - m.copyRawDataTo(r); - m.appendScale(v.x, v.y, v.z); - this.outputAppendScale(m.rawData, r, v); - - console.log('//------------------------------------------------------------ AS3'); - console.log('private function testAppendScale( result : Vector. , original : Vector. , t : Vector3D )'); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' m.appendScale( t.x , t.y , t.z );'); - console.log(' trace( "TSResult: " , result );'); - console.log(' trace( "ASResult: " , m.rawData );'); - console.log('}'); - }; - - VextMat3DTests.prototype.outputAppendScale = function (result, original, v) { - var a = 'new Vector3D( ' + v.x + ' , ' + v.y + ' , ' + v.z + ' )'; - - console.log('testAppendScale( new [' + result + '], new [' + original + '] , ' + a + ');'); - }; - - VextMat3DTests.prototype.testAppendTranslation = function () { - console.log('----------------------------------------------------------------------'); - console.log('testAppendTranslation'); - var v = new away.geom.Vector3D(1, 2, 3); - var p = new away.geom.Vector3D(2, 2, 2); - - var m; - var i; - var r = new Array(16); - - m = new away.geom.Matrix3D([ - 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1]); - m.copyRawDataTo(r); - m.appendTranslation(v.x, v.y, v.z); - - this.outputAppendTranslation(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1]); - - m.copyRawDataTo(r); - m.appendTranslation(v.x, v.y, v.z); - this.outputAppendTranslation(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1]); - - m.copyRawDataTo(r); - m.appendTranslation(v.x, v.y, v.z); - this.outputAppendTranslation(m.rawData, r, v); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1]); - - m.copyRawDataTo(r); - m.appendTranslation(v.x, v.y, v.z); - this.outputAppendTranslation(m.rawData, r, v); - - console.log('//------------------------------------------------------------ AS3'); - console.log('private function testAppendTranslation( result : Vector. , original : Vector. , t : Vector3D )'); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' m.appendTranslation( t.x , t.y , t.z );'); - console.log(' trace( "TSResult: " , result );'); - console.log(' trace( "ASResult: " , m.rawData );'); - console.log('}'); - }; - - VextMat3DTests.prototype.outputAppendTranslation = function (result, original, v) { - //var axis : number[] = new Array( axis.x , axis.y , axis.z ); - //var pivot : number[] = new Array( pivot.x , pivot.y , pivot.z ); - var a = 'new Vector3D( ' + v.x + ' , ' + v.y + ' , ' + v.z + ' )'; - - console.log('testAppendTranslation( new [' + result + '], new [' + original + '] , ' + a + ');'); - }; - - VextMat3DTests.prototype.testAppendRotation = function () { - console.log('----------------------------------------------------------------------'); - console.log('testAppendRotation'); - - var v = new away.geom.Vector3D(1, 2, 3); - var p = new away.geom.Vector3D(2, 2, 2); - - var m; - var i; - var r = new Array(16); - - m = new away.geom.Matrix3D([ - 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1]); - m.copyRawDataTo(r); - m.appendRotation(90, v); // , p ); - - this.outputAppendRotation(m.rawData, r, v, p); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1]); - - m.copyRawDataTo(r); - m.appendRotation(90, v); //, p ); - this.outputAppendRotation(m.rawData, r, v, p); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1]); - - m.copyRawDataTo(r); - m.appendRotation(90, v); //, p ); - this.outputAppendRotation(m.rawData, r, v, p); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1]); - - m.copyRawDataTo(r); - m.appendRotation(90, v); //, p ); - this.outputAppendRotation(m.rawData, r, v, p); - - console.log('//------------------------------------------------------------ AS3'); - console.log('private function testAppendRotation( result : Vector. , original : Vector. , axis : Vector3D , pivot : Vector3D )'); - console.log('{'); - console.log(' var m : Matrix3D = new Matrix3D( original );'); - console.log(' m.appendRotation( 90 , axis , pivot );'); - console.log(' trace( "TSResult: " , result );'); - console.log(' trace( "ASResult: " , m.rawData );'); - console.log('}'); - }; - - VextMat3DTests.prototype.testInvert = function () { - var v = new away.geom.Vector3D(); - var m; - var i; - var r = new Array(16); - - m = new away.geom.Matrix3D([ - 1, 2, 4, 5, - 2, 1, 0, 8, - 4, 0, 1, 7, - 5, 8, 7, 1]); - m.copyRawDataTo(r); - i = m.invert(); - this.outputInvert(i, m.rawData, r); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 7, - 5, 0, 7, 1]); - - m.copyRawDataTo(r); - i = m.invert(); - this.outputInvert(i, m.rawData, r); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 2, - 5, 0, 2, 1]); - - m.copyRawDataTo(r); - i = m.invert(); - this.outputInvert(i, m.rawData, r); - }; - - VextMat3DTests.prototype.testCopyRowTo = function () { - var v = new away.geom.Vector3D(); - var m; - var i; - var r = new Array(16); - - m = new away.geom.Matrix3D([ - 1, 2, 4, 5, - 6, 7, 8, 9, - 4, 0, 1, 7, - 5, 8, 7, 1]); - - m.copyRowTo(0, v); - console.log(v); - m.copyRowTo(1, v); - console.log(v); - m.copyRowTo(2, v); - console.log(v); - m.copyRowTo(3, v); - console.log(v); - /* - - m.copyRowTo( 0, v) ; console.log ( v ) ; - m.copyRowTo( 1, v) ; console.log ( v ) ; - m.copyRowTo( 2, v) ; console.log ( v ) ; - m.copyRowTo( 3, v) ; console.log ( v ) ; - - v.w = v.x = v.y = v.z = 0; - m.copyRowFrom( 0 , v ); console.log (m.rawData ) ; - v.w = v.x = v.y = v.z = 1; - m.copyRowFrom( 1 , v ); console.log ( m.rawData ) ; - v.w = v.x = v.y = v.z = 2; - m.copyRowFrom( 2 , v ); console.log ( m.rawData ) ; - v.w = v.x = v.y = v.z = 3; - m.copyRowFrom( 3 , v ); console.log ( m.rawData ) ; - - [0, 2, 4, 5, 0, 7, 8, 9, 0, 0, 1, 7, 0, 8, 7, 1] VextMat3DTests.ts:73 - 0, 2, 4, 5, 0, 7, 8, 9, 0, 0, 1, 7, 0, 8, 7, 1 // AS3 - - [0, 1, 4, 5, 0, 1, 8, 9, 0, 1, 1, 7, 0, 1, 7, 1] VextMat3DTests.ts:75 - 0, 1, 4, 5, 0, 1, 8, 9, 0, 1, 1, 7, 0, 1, 7, 1 // AS3 - - [0, 1, 2, 5, 0, 1, 2, 9, 0, 1, 2, 7, 0, 1, 2, 1] VextMat3DTests.ts:77 - 0, 1, 2, 5, 0, 1, 2, 9, 0, 1, 2, 7, 0, 1, 2, 1 // AS3 - - [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] - 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3 // AS3s - - - */ - }; - VextMat3DTests.prototype.testCopyColumnTo = function () { - var v = new away.geom.Vector3D(); - var m; - var i; - var r = new Array(16); - - m = new away.geom.Matrix3D([ - 1, 0, 4, 5, - 0, 1, 8, 0, - 4, 8, 1, 1, - 5, 0, 1, 1]); - - m = new away.geom.Matrix3D([ - 1, 2, 3, 4, - 5, 6, 7, 8, - 9, 10, 1, 12, - 13, 14, 15, 16]); - - m.copyColumnTo(0, v); - console.log(v.toString()); - m.copyColumnTo(1, v); - console.log(v.toString()); - m.copyColumnTo(2, v); - console.log(v.toString()); - m.copyColumnTo(3, v); - console.log(v.toString()); - - v.w = v.x = v.y = v.z = 0; - m.copyColumnFrom(0, v); - console.log(m.rawData); - v.w = v.x = v.y = v.z = 1; - m.copyColumnFrom(1, v); - console.log(m.rawData); - v.w = v.x = v.y = v.z = 2; - m.copyColumnFrom(2, v); - console.log(m.rawData); - v.w = v.x = v.y = v.z = 3; - m.copyColumnFrom(3, v); - console.log(m.rawData); - /* - - VextMat3DTests.ts:67 - [Vector3D] VextMat3DTests.ts:68 - [Vector3D] VextMat3DTests.ts:69 - [Vector3D] VextMat3DTests.ts:70 - Vector3D(1, 2, 3) - (x:1 ,y:2, z3, w:4) - - Vector3D(5, 6, 7) - (x:5 ,y:6, z7, w:8) - - Vector3D(9, 10, 1) - (x:9 ,y:10, z1, w:12) - - Vector3D(13, 14, 15) - (x:13 ,y:14, z15, w:16) - - [0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 1, 12, 13, 14, 15, 16] VextMat3DTests.ts:73 - 0, 0, 0, 0, 5, 6, 7, 8, 9, 10, 1, 12, 13, 14, 15, 16 - - [0, 0, 0, 0, 1, 1, 1, 1, 9, 10, 1, 12, 13, 14, 15, 16] VextMat3DTests.ts:75 - 0, 0, 0, 0, 1, 1, 1, 1, 9, 10, 1, 12, 13, 14, 15, 16 - - 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 13, 14, 15, 16 - [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 13, 14, 15, 16] VextMat3DTests.ts:77 - - 0, 0, 0, 0 ,1, 1, 1, 1, 2, 2, 2, 2, 3, 3 , 3 ,3 - [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3] - - */ - }; - - VextMat3DTests.prototype.outputAppendRotation = function (result, original, axis, pivot) { - //var axis : number[] = new Array( axis.x , axis.y , axis.z ); - //var pivot : number[] = new Array( pivot.x , pivot.y , pivot.z ); - var a = 'new Vector3D( ' + axis.x + ' , ' + axis.y + ' , ' + axis.z + ' )'; - var p = 'new Vector3D( ' + pivot.x + ' , ' + pivot.y + ' , ' + pivot.z + ' )'; - - console.log('testAppendRotation( new [' + result + '], new [' + original + '] , ' + a + ' , ' + p + ');'); - }; - - VextMat3DTests.prototype.outputInvert = function (success, data, original) { - console.log('testInvert(' + success + ', new [' + data + '], new [' + original + ']);'); - }; - - VextMat3DTests.prototype.output = function (data, result) { - console.log('testDeterminant( new [' + data + '], ' + result + ');'); - }; - - VextMat3DTests.prototype.getRnd = function (max, min) { - return Math.floor(Math.random() * (max - min + 1)) + min; - }; - return VextMat3DTests; - })(); - geom.VextMat3DTests = VextMat3DTests; - })(tests.geom || (tests.geom = {})); - var geom = tests.geom; -})(tests || (tests = {})); -//# sourceMappingURL=VextMat3DTests.js.map diff --git a/tests/js/VextMat3DTests.js.map b/tests/js/VextMat3DTests.js.map deleted file mode 100644 index 7a3a5f65..00000000 --- a/tests/js/VextMat3DTests.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"VextMat3DTests.js","sourceRoot":"","sources":["../geom/VextMat3DTests.ts"],"names":["tests","tests.geom","tests.geom.VextMat3DTests","tests.geom.VextMat3DTests.constructor","tests.geom.VextMat3DTests.testappend","tests.geom.VextMat3DTests.testprependRotation","tests.geom.VextMat3DTests.testcopyToMatrix3D","tests.geom.VextMat3DTests.testDecompose","tests.geom.VextMat3DTests.outputDecompose","tests.geom.VextMat3DTests.testPosition","tests.geom.VextMat3DTests.outputPosition","tests.geom.VextMat3DTests.testAppendScale","tests.geom.VextMat3DTests.outputAppendScale","tests.geom.VextMat3DTests.testAppendTranslation","tests.geom.VextMat3DTests.outputAppendTranslation","tests.geom.VextMat3DTests.testAppendRotation","tests.geom.VextMat3DTests.testInvert","tests.geom.VextMat3DTests.testCopyRowTo","tests.geom.VextMat3DTests.testCopyColumnTo","tests.geom.VextMat3DTests.outputAppendRotation","tests.geom.VextMat3DTests.outputInvert","tests.geom.VextMat3DTests.output","tests.geom.VextMat3DTests.getRnd"],"mappings":"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,aAAaA,CAAEA,CAACA,CAAEA;gBACpBA,CAACA,CAACA,iBAAiBA,CAACA,CAACA,CAACA,CAACA,EAAGA,CAACA,CAACA,CAACA,EAAGA,CAACA,CAACA,CAACA,CAAEA;;gBAErCA,IAAIA,CAACA,uBAAuBA,CAACA,CAACA,CAACA,OAAOA,EAAGA,CAACA,EAAIA,CAACA,CAAGA;;gBAElDA,CAACA,GAAGA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAAEA;oBAAIA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACtCA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,CAACA,CAAEA;;gBAEjBA,CAACA,CAACA,aAAaA,CAAEA,CAACA,CAAEA;gBACpBA,CAACA,CAACA,iBAAiBA,CAACA,CAACA,CAACA,CAACA,EAAGA,CAACA,CAACA,CAACA,EAAGA,CAACA,CAACA,CAACA,CAAEA;gBACrCA,IAAIA,CAACA,uBAAuBA,CAACA,CAACA,CAACA,OAAOA,EAAGA,CAACA,EAAGA,CAACA,CAAEA;;gBAEhDA,CAACA,GAAIA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAAEA;oBAAGA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACtCA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,CAACA,CAAEA;;gBAEjBA,CAACA,CAACA,aAAaA,CAAEA,CAACA,CAAEA;gBACpBA,CAACA,CAACA,iBAAiBA,CAACA,CAACA,CAACA,CAACA,EAAGA,CAACA,CAACA,CAACA,EAAGA,CAACA,CAACA,CAACA,CAAEA;gBACrCA,IAAIA,CAACA,uBAAuBA,CAACA,CAACA,CAACA,OAAOA,EAAGA,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AEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,CAACA,CAAEA;;gBAEjBA,CAACA,CAACA,aAAaA,CAAEA,CAACA,CAAEA;gBACpBA,CAACA,GAAGA,CAACA,CAACA,MAAMA,CAACA,CAACA;gBACdA,IAAIA,CAACA,YAAYA,CAAEA,CAACA,EAAGA,CAACA,CAACA,OAAOA,EAAGA,CAACA,CAAEA;;gBAEtCA,CAACA,GAAIA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAAEA;oBAAIA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACvCA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,CAACA,CAAEA;;gBAEjBA,CAACA,CAACA,aAAaA,CAAEA,CAACA,CAAEA;gBACpBA,CAACA,GAAGA,CAACA,CAACA,MAAMA,CAACA,CAACA;gBACdA,IAAIA,CAACA,YAAYA,CAAEA,CAACA,EAAGA,CAACA,CAACA,OAAOA,EAAGA,CAACA,CAAEA;YAI1CA,CAACA;;YAEDd,yCAAAA;gBAGIe,IAAIA,CAACA,GAAwBA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAACA,CAACA;gBACrDA,IAAIA,CAACA;gBACLA,IAAIA,CAACA;gBACLA,IAAIA,CAACA,GAAmBA,IAAIA,KAAKA,CAAWA,EAAEA,CAAEA;;gBAEhDA,CAACA,GAAIA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAAEA;oBAAEA,CAACA,EAACA,CAACA,EAACA,CAACA,EAACA,CAACA;oBAClCA,CAACA,EAACA,CAACA,EAACA,CAACA,EAACA,CAACA;oBACPA,CAACA,EAACA,CAACA,EAACA,CAACA,EAACA,CAACA;oBACPA,CAACA,EAACA,CAACA,EAACA,CAACA,EAACA,CAACA,CAACA,CAACA;;gBAEbA,CAACA,CAACA,SAASA,CAAEA,CAACA,EAAEA,CAACA,CAACA;gBAAGA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAAEA;gBACtCA,CAACA,CAACA,SAASA,CAAEA,CAACA,EAAEA,CAACA,CAACA;gBAAGA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAAEA;gBACtCA,CAACA,CAACA,SAASA,CAAEA,CAACA,EAAEA,CAACA,CAACA;gBAAGA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAAEA;gBACtCA,CAACA,CAACA,SAASA,CAAEA,CAACA,EAAEA,CAACA,CAACA;gBAAGA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAAEA;gBAItCA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA6BGA;YAGPA,CAACA;YACDf,4CAAAA;gBAGIgB,IAAIA,CAACA,GAAwBA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAACA,CAACA;gBACrDA,IAAIA,CAACA;gBACLA,IAAIA,CAACA;gBACLA,IAAIA,CAACA,GAAmBA,IAAIA,KAAKA,CAAWA,EAAEA,CAAEA;;gBAEhDA,CAACA,GAAIA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAAEA;oBAAIA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACvCA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA;oBACVA,CAACA,EAAEA,CAACA,EAAEA,CAACA,EAAEA,CAACA,CAACA,CAAEA;;gBAGjBA,CAACA,GAAIA,IAAIA,IAAIA,CAACA,IAAIA,CAACA,QAAQA,CAAEA;oBAAEA,CAACA,EAACA,CAACA,EAACA,CAACA,EAACA,CAACA;oBAClCA,CAACA,EAACA,CAACA,EAACA,CAACA,EAACA,CAACA;oBACPA,CAACA,EAACA,EAAEA,EAACA,CAACA,EAACA,EAAEA;oBACTA,EAAEA,EAACA,EAAEA,EAACA,EAAEA,EAACA,EAAEA,CAACA,CAACA;;gBAEjBA,CAACA,CAACA,YAAYA,CAAEA,CAACA,EAAEA,CAACA,CAACA;gBAAGA,OAAOA,CAACA,GAAGA,CAAEA,CAACA,CAACA,QAAQA,CAACA,CAACA,CAAEA;gBACnDA,CAACA,CAACA,YAAYA,CAAEA,CAACA,EAAEA,CAACA,CAACA;gBAAGA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAACA,QAAQA,CAACA,CAACA,CAAEA;gBACpDA,CAACA,CAACA,YAAYA,CAAEA,CAACA,EAAEA,CAACA,CAACA;gBAAGA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAACA,QAAQA,CAACA,CAACA,CAAEA;gBACpDA,CAACA,CAACA,YAAYA,CAAEA,CAACA,EAAEA,CAACA,CAACA;gBAAGA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAACA,QAAQA,CAACA,CAACA,CAAEA;;gBAEpDA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA;gBACzBA,CAACA,CAACA,cAAcA,CAAEA,CAACA,EAAIA,CAACA,CAAEA;gBAAEA,OAAOA,CAACA,GAAGA,CAAEA,CAACA,CAACA,OAAOA,CAAEA;gBACpDA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA;gBACzBA,CAACA,CAACA,cAAcA,CAAEA,CAACA,EAAIA,CAACA,CAAEA;gBAAEA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAACA,OAAOA,CAAEA;gBACrDA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA;gBACzBA,CAACA,CAACA,cAAcA,CAAEA,CAACA,EAAIA,CAACA,CAAEA;gBAAEA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAACA,OAAOA,CAAEA;gBACrDA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA,CAACA,CAACA,GAAGA,CAACA;gBACzBA,CAACA,CAACA,cAAcA,CAAEA,CAACA,EAAIA,CAACA,CAAEA;gBAAEA,OAAOA,CAACA,GAAGA,CAAGA,CAACA,CAACA,OAAOA,CAAEA;gBAErDA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA8BGA;YAEPA,CAACA;;YAEDhB,gDAAAA,UAA4BA,MAAiBA,EAAGA,QAAmBA,EAAGA,IAAyBA,EAAGA,KAA0BA;gBAGxHiB,uEAAuEA;gBACvEA,0EAA0EA;gBAE1EA,IAAIA,CAACA,GAAYA,gBAAgBA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,KAAKA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,KAAKA,GAAGA,IAAIA,CAACA,CAACA,GAAGA,IAAIA;gBACnFA,IAAIA,CAACA,GAAYA,gBAAgBA,GAAGA,KAAKA,CAACA,CAACA,GAAGA,KAAKA,GAAGA,KAAKA,CAACA,CAACA,GAAGA,KAAKA,GAAGA,KAAKA,CAACA,CAACA,GAAGA,IAAIA;;gBAEtFA,OAAOA,CAACA,GAAGA,CAAEA,oCAAoCA,GAAGA,MAAMA,GAAGA,mBAAmBA,GAAGA,QAAQA,GAAGA,MAAMA,GAAGA,CAACA,GAAGA,KAAKA,GAAGA,CAACA,GAAGA,IAAIA,CAAEA;YAEjIA,CAACA;;YAEDjB,wCAAAA,UAAoBA,OAAiBA,EAAGA,IAAoBA,EAAGA,QAAwBA;gBAGnFkB,OAAOA,CAACA,GAAGA,CAAEA,aAAaA,GAAGA,OAAOA,GAAGA,kBAAkBA,GAAGA,IAAIA,GAAGA,mBAAmBA,GAAGA,QAAQA,GAAGA,KAAKA,CAAEA;YAE/GA,CAACA;;YAEDlB,kCAAAA,UAAeA,IAAoBA,EAAGA,MAAeA;gBAGjDmB,OAAOA,CAACA,GAAGA,CAAEA,iCAAiCA,GAAGA,IAAIA,GAAGA,KAAKA,GAAIA,MAAMA,GAAGA,IAAIA,CAAEA;YAEpFA,CAACA;;YAEDnB,kCAAAA,UAAeA,GAAYA,EAAGA,GAAYA;gBAEtCoB,OAAOA,IAAIA,CAACA,KAAKA,CAACA,IAAIA,CAACA,MAAMA,CAACA,CAACA,GAAGA,CAACA,GAAGA,GAAGA,GAAGA,GAAGA,CAACA,CAACA,CAACA,GAAGA,GAAGA;YAC5DA,CAACA;YAGLpB,sBAACA;QAADA,CAACA,IAAAD;QAv+BDA,qCAu+BCA;IACLA,CAACA,mCAAAD;0BAAAA;AAADA,CAACA,yBAAA"} \ No newline at end of file diff --git a/tests/library/AssetLibraryTest.js b/tests/library/AssetLibraryTest.js new file mode 100755 index 00000000..d10fd9fc --- /dev/null +++ b/tests/library/AssetLibraryTest.js @@ -0,0 +1,197 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +var LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); + +var AssetLibrary = require("awayjs-core/lib/core/library/AssetLibrary"); + +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + +var ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +var ParserDataFormat = require("awayjs-core/lib/parsers/ParserDataFormat"); + +var AssetLibraryTest = (function () { + function AssetLibraryTest() { + var _this = this; + this.height = 0; + AssetLibrary.enableParser(JSONTextureParser); + + this.token = AssetLibrary.load(new URLRequest('assets/JSNParserTest.json')); + this.token.addEventListener(LoaderEvent.RESOURCE_COMPLETE, function (event) { + return _this.onResourceComplete(event); + }); + this.token.addEventListener(AssetEvent.ASSET_COMPLETE, function (event) { + return _this.onAssetComplete(event); + }); + + this.token = AssetLibrary.load(new URLRequest('assets/1024x1024.png')); + this.token.addEventListener(LoaderEvent.RESOURCE_COMPLETE, function (event) { + return _this.onResourceComplete(event); + }); + this.token.addEventListener(AssetEvent.ASSET_COMPLETE, function (event) { + return _this.onAssetComplete(event); + }); + } + AssetLibraryTest.prototype.onAssetComplete = function (event) { + console.log('------------------------------------------------------------------------------'); + console.log('AssetEvent.ASSET_COMPLETE', AssetLibrary.getAsset(event.asset.name)); + console.log('------------------------------------------------------------------------------'); + + var imageTexture = AssetLibrary.getAsset(event.asset.name); + + document.body.appendChild(imageTexture.htmlImageElement); + + imageTexture.htmlImageElement.style.position = 'absolute'; + imageTexture.htmlImageElement.style.top = this.height + 'px'; + + this.height += (imageTexture.htmlImageElement.height + 10); + }; + AssetLibraryTest.prototype.onResourceComplete = function (event) { + var loader = event.target; + + console.log('------------------------------------------------------------------------------'); + console.log('LoaderEvent.RESOURCE_COMPLETE', event); + console.log('------------------------------------------------------------------------------'); + }; + return AssetLibraryTest; +})(); + +/** +* ImageParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into +* a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without +* exception cases. +*/ +var JSONTextureParser = (function (_super) { + __extends(JSONTextureParser, _super); + /** + * Creates a new ImageParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + function JSONTextureParser() { + _super.call(this, ParserDataFormat.PLAIN_TEXT); + this.STATE_PARSE_DATA = 0; + this.STATE_LOAD_IMAGES = 1; + this.STATE_COMPLETE = 2; + this._state = -1; + this._dependencyCount = 0; + + this._loadedTextures = new Array(); + this._state = this.STATE_PARSE_DATA; + } + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + JSONTextureParser.supportsType = function (extension) { + extension = extension.toLowerCase(); + return extension == "json"; + }; + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + JSONTextureParser.supportsData = function (data) { + try { + var obj = JSON.parse(data); + + if (obj) + return true; + + return false; + } catch (e) { + return false; + } + + return false; + }; + + /** + * @inheritDoc + */ + JSONTextureParser.prototype._iResolveDependency = function (resourceDependency) { + var resource = resourceDependency.assets[0]; + + this._pFinalizeAsset(resource, resourceDependency._iLoader.url); + + this._loadedTextures.push(resource); + + //console.log( 'JSONTextureParser._iResolveDependency' , resourceDependency ); + //console.log( 'JSONTextureParser._iResolveDependency resource: ' , resource ); + this._dependencyCount--; + + if (this._dependencyCount == 0) + this._state = this.STATE_COMPLETE; + }; + + /** + * @inheritDoc + */ + JSONTextureParser.prototype._iResolveDependencyFailure = function (resourceDependency) { + this._dependencyCount--; + + if (this._dependencyCount == 0) + this._state = this.STATE_COMPLETE; + }; + + JSONTextureParser.prototype.parseJson = function () { + if (JSONTextureParser.supportsData(this.data)) { + try { + var json = JSON.parse(this.data); + var data = json.data; + + var rec; + var rq; + + for (var c = 0; c < data.length; c++) { + rec = data[c]; + + var uri = rec.image; + var id = rec.id; + + rq = new URLRequest(uri); + + this._pAddDependency('JSON_ID_' + id, rq, false, null, true); + } + + this._dependencyCount = data.length; + this._state = this.STATE_LOAD_IMAGES; + + this._pPauseAndRetrieveDependencies(); + } catch (e) { + this._state = this.STATE_COMPLETE; + } + } + }; + + /** + * @inheritDoc + */ + JSONTextureParser.prototype._pProceedParsing = function () { + console.log('JSONTextureParser._pProceedParsing', this._state); + + switch (this._state) { + case this.STATE_PARSE_DATA: + this.parseJson(); + return ParserBase.MORE_TO_PARSE; + break; + case this.STATE_LOAD_IMAGES: + break; + case this.STATE_COMPLETE: + return ParserBase.PARSING_DONE; + break; + } + + return ParserBase.MORE_TO_PARSE; + }; + return JSONTextureParser; +})(ParserBase); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYnJhcnkvQXNzZXRMaWJyYXJ5VGVzdC50cyJdLCJuYW1lcyI6WyJBc3NldExpYnJhcnlUZXN0IiwiQXNzZXRMaWJyYXJ5VGVzdC5jb25zdHJ1Y3RvciIsIkFzc2V0TGlicmFyeVRlc3Qub25Bc3NldENvbXBsZXRlIiwiQXNzZXRMaWJyYXJ5VGVzdC5vblJlc291cmNlQ29tcGxldGUiLCJKU09OVGV4dHVyZVBhcnNlciIsIkpTT05UZXh0dXJlUGFyc2VyLmNvbnN0cnVjdG9yIiwiSlNPTlRleHR1cmVQYXJzZXIuc3VwcG9ydHNUeXBlIiwiSlNPTlRleHR1cmVQYXJzZXIuc3VwcG9ydHNEYXRhIiwiSlNPTlRleHR1cmVQYXJzZXIuX2lSZXNvbHZlRGVwZW5kZW5jeSIsIkpTT05UZXh0dXJlUGFyc2VyLl9pUmVzb2x2ZURlcGVuZGVuY3lGYWlsdXJlIiwiSlNPTlRleHR1cmVQYXJzZXIucGFyc2VKc29uIiwiSlNPTlRleHR1cmVQYXJzZXIuX3BQcm9jZWVkUGFyc2luZyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsNkRBQW1FO0FBQ25FLCtEQUFxRTs7QUFFckUsdUVBQTZFOztBQUk3RSwrREFBcUU7O0FBR3JFLDhEQUFvRTtBQUNwRSwwRUFBK0U7O0FBRy9FO0lBTUNBO1FBQUFDLGlCQWFDQTtRQWhCREEsS0FBUUEsTUFBTUEsR0FBWUEsQ0FBQ0EsQ0FBQ0E7UUFNM0JBLFlBQVlBLENBQUNBLFlBQVlBLENBQUNBLGlCQUFpQkEsQ0FBQ0E7O1FBRTVDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxVQUFVQSxDQUFDQSwyQkFBMkJBLENBQUNBLENBQUVBO1FBQzVFQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxnQkFBZ0JBLENBQUVBLFdBQVdBLENBQUNBLGlCQUFpQkEsRUFBR0EsVUFBQ0EsS0FBaUJBO21CQUFLQSxLQUFJQSxDQUFDQSxrQkFBa0JBLENBQUNBLEtBQUtBLENBQUNBO1FBQTlCQSxDQUE4QkEsQ0FBRUE7UUFDcEhBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsY0FBY0EsRUFBR0EsVUFBQ0EsS0FBZ0JBO21CQUFLQSxLQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUEzQkEsQ0FBMkJBLENBQUVBOztRQUUzR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsVUFBVUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxDQUFFQTtRQUN2RUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsZ0JBQWdCQSxDQUFFQSxXQUFXQSxDQUFDQSxpQkFBaUJBLEVBQUdBLFVBQUNBLEtBQWlCQTttQkFBS0EsS0FBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxLQUFLQSxDQUFDQTtRQUE5QkEsQ0FBOEJBLENBQUVBO1FBQ3BIQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFVBQVVBLENBQUNBLGNBQWNBLEVBQUdBLFVBQUNBLEtBQWdCQTttQkFBS0EsS0FBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBM0JBLENBQTJCQSxDQUFFQTtJQUU1R0EsQ0FBQ0E7SUFFREQsNkNBQUFBLFVBQXVCQSxLQUFnQkE7UUFHdENFLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLGdGQUFnRkEsQ0FBQ0E7UUFDOUZBLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLDJCQUEyQkEsRUFBR0EsWUFBWUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBRUE7UUFDcEZBLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLGdGQUFnRkEsQ0FBQ0E7O1FBRTlGQSxJQUFJQSxZQUFZQSxHQUFpQ0EsWUFBWUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0E7O1FBRXhGQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFFQSxZQUFZQSxDQUFDQSxnQkFBZ0JBLENBQUVBOztRQUUxREEsWUFBWUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxHQUFHQSxVQUFVQTtRQUN6REEsWUFBWUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQTs7UUFHNURBLElBQUlBLENBQUNBLE1BQU1BLElBQUlBLENBQUVBLFlBQVlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsTUFBTUEsR0FBR0EsRUFBRUEsQ0FBRUE7SUFFN0RBLENBQUNBO0lBQ0RGLGdEQUFBQSxVQUEwQkEsS0FBaUJBO1FBRzFDRyxJQUFJQSxNQUFNQSxHQUErQkEsS0FBS0EsQ0FBQ0EsTUFBTUE7O1FBRXJEQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxnRkFBZ0ZBLENBQUNBO1FBQzlGQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSwrQkFBK0JBLEVBQUdBLEtBQUtBLENBQUdBO1FBQ3ZEQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxnRkFBZ0ZBLENBQUNBO0lBRS9GQSxDQUFDQTtJQUVGSCx3QkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTs7QUFFRDs7OztFQUlFO0FBQ0Y7SUFBZ0NJLG9DQUFVQTtJQWlCekNBOzs7O01BREdBO0lBQ0hBO1FBRUNDLFdBQU1BLE9BQUFBLGdCQUFnQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0E7UUFqQm5DQSxLQUFRQSxnQkFBZ0JBLEdBQVVBLENBQUNBLENBQUNBO1FBQ3BDQSxLQUFRQSxpQkFBaUJBLEdBQVVBLENBQUNBLENBQUNBO1FBQ3JDQSxLQUFRQSxjQUFjQSxHQUFVQSxDQUFDQSxDQUFDQTtRQUVsQ0EsS0FBUUEsTUFBTUEsR0FBVUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFHM0JBLEtBQVFBLGdCQUFnQkEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7O1FBWW5DQSxJQUFJQSxDQUFDQSxlQUFlQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFnQkEsQ0FBQ0E7UUFDakRBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkE7SUFDcENBLENBQUNBO0lBUUREOzs7O01BRkdBO3FDQUVIQSxVQUEyQkEsU0FBa0JBO1FBRTVDRSxTQUFTQSxHQUFHQSxTQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTtRQUNuQ0EsT0FBT0EsU0FBU0EsSUFBSUEsTUFBTUE7SUFDM0JBLENBQUNBOztJQU9ERjs7OztNQURHQTtxQ0FDSEEsVUFBMkJBLElBQVVBO1FBRXBDRyxJQUFJQTtZQUNIQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQTs7WUFFMUJBLElBQUlBLEdBQUdBO2dCQUNOQSxPQUFPQSxJQUFJQSxDQUFDQTs7WUFFYkEsT0FBT0EsS0FBS0E7U0FDWkEsQ0FBQ0EsT0FBUUEsQ0FBQ0EsQ0FBR0E7WUFDYkEsT0FBT0EsS0FBS0E7U0FDWkE7O1FBRURBLE9BQU9BLEtBQUtBO0lBQ2JBLENBQUNBOztJQUtESDs7TUFER0E7c0RBQ0hBLFVBQTJCQSxrQkFBcUNBO1FBRS9ESSxJQUFJQSxRQUFRQSxHQUFtQ0Esa0JBQWtCQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQTs7UUFFM0VBLElBQUlBLENBQUNBLGVBQWVBLENBQVVBLFFBQVFBLEVBQUVBLGtCQUFrQkEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7O1FBRXhFQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFFQSxRQUFRQSxDQUFFQTs7UUFFckNBLDhFQUE4RUE7UUFDOUVBLCtFQUErRUE7UUFFL0VBLElBQUlBLENBQUNBLGdCQUFnQkEsRUFBRUE7O1FBRXZCQSxJQUFLQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLElBQUlBLENBQUNBO1lBQzlCQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQTtJQUNwQ0EsQ0FBQ0E7O0lBS0RKOztNQURHQTs2REFDSEEsVUFBa0NBLGtCQUFxQ0E7UUFFdEVLLElBQUlBLENBQUNBLGdCQUFnQkEsRUFBRUE7O1FBRXZCQSxJQUFLQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLElBQUlBLENBQUNBO1lBQzlCQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQTtJQUNwQ0EsQ0FBQ0E7O0lBRURMLHdDQUFBQTtRQUVDTSxJQUFJQSxpQkFBaUJBLENBQUNBLFlBQVlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUVBO1lBQzlDQSxJQUFJQTtnQkFDSEEsSUFBSUEsSUFBSUEsR0FBT0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7Z0JBQ3BDQSxJQUFJQSxJQUFJQSxHQUEyQkEsSUFBSUEsQ0FBQ0EsSUFBSUE7O2dCQUU1Q0EsSUFBSUEsR0FBR0E7Z0JBQ1BBLElBQUlBLEVBQUVBOztnQkFFTkEsS0FBS0EsSUFBSUEsQ0FBQ0EsR0FBWUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBR0EsQ0FBRUE7b0JBQy9DQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTs7b0JBRWJBLElBQUlBLEdBQUdBLEdBQW1CQSxHQUFHQSxDQUFDQSxLQUFLQTtvQkFDbkNBLElBQUlBLEVBQUVBLEdBQW1CQSxHQUFHQSxDQUFDQSxFQUFFQTs7b0JBRS9CQSxFQUFFQSxHQUFHQSxJQUFJQSxVQUFVQSxDQUFDQSxHQUFHQSxDQUFDQTs7b0JBRXhCQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxVQUFVQSxHQUFHQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxLQUFLQSxFQUFFQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQTtpQkFDNURBOztnQkFFREEsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQTtnQkFDbkNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGlCQUFpQkE7O2dCQUVwQ0EsSUFBSUEsQ0FBQ0EsOEJBQThCQSxDQUFDQSxDQUFDQTthQUVyQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBRUE7Z0JBQ1hBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBO2FBQ2pDQTtTQUNEQTtJQUNGQSxDQUFDQTs7SUFJRE47O01BREdBO21EQUNIQTtRQUVDTyxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxvQ0FBb0NBLEVBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUVBOztRQUVqRUEsUUFBUUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7WUFDbkJBLEtBQUtBLElBQUlBLENBQUNBLGdCQUFnQkE7Z0JBQ3pCQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtnQkFDaEJBLE9BQU9BLFVBQVVBLENBQUNBLGFBQWFBO2dCQUMvQkEsS0FBTUE7QUFBQUEsWUFDUEEsS0FBS0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQTtnQkFDMUJBLEtBQU1BO0FBQUFBLFlBQ1BBLEtBQUtBLElBQUlBLENBQUNBLGNBQWNBO2dCQUN2QkEsT0FBT0EsVUFBVUEsQ0FBQ0EsWUFBWUE7Z0JBQzlCQSxLQUFNQTtBQUFBQSxTQUNQQTs7UUFFREEsT0FBT0EsVUFBVUEsQ0FBQ0EsYUFBYUE7SUFDaENBLENBQUNBO0lBQ0ZQLHlCQUFDQTtBQUFEQSxDQUFDQSxFQTdJK0IsVUFBVSxFQTZJekM7QUFBQSIsImZpbGUiOiJsaWJyYXJ5L0Fzc2V0TGlicmFyeVRlc3QuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXNzZXRFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvQXNzZXRFdmVudFwiKTtcbmltcG9ydCBMb2FkZXJFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvTG9hZGVyRXZlbnRcIik7XG5pbXBvcnQgUGFyc2VyRXZlbnRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL1BhcnNlckV2ZW50XCIpO1xuaW1wb3J0IEFzc2V0TGlicmFyeVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRMaWJyYXJ5XCIpO1xuaW1wb3J0IEFzc2V0TG9hZGVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldExvYWRlclwiKTtcbmltcG9ydCBBc3NldExvYWRlclRva2VuXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRMb2FkZXJUb2tlblwiKTtcbmltcG9ydCBJQXNzZXRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMUmVxdWVzdFwiKTtcbmltcG9ydCBJbWFnZVRleHR1cmVcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvSW1hZ2VUZXh0dXJlXCIpO1xuaW1wb3J0IFRleHR1cmUyREJhc2VcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3RleHR1cmVzL1RleHR1cmUyREJhc2VcIik7XG5pbXBvcnQgUGFyc2VyQmFzZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlckJhc2VcIik7XG5pbXBvcnQgUGFyc2VyRGF0YUZvcm1hdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcGFyc2Vycy9QYXJzZXJEYXRhRm9ybWF0XCIpO1xuaW1wb3J0IFJlc291cmNlRGVwZW5kZW5jeVx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3BhcnNlcnMvUmVzb3VyY2VEZXBlbmRlbmN5XCIpO1xuXG5jbGFzcyBBc3NldExpYnJhcnlUZXN0XG57XG5cblx0cHJpdmF0ZSBoZWlnaHQgOiBudW1iZXIgPSAwO1xuXG5cdHByaXZhdGUgdG9rZW4gOiBBc3NldExvYWRlclRva2VuO1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblxuXHRcdEFzc2V0TGlicmFyeS5lbmFibGVQYXJzZXIoSlNPTlRleHR1cmVQYXJzZXIpIDtcblxuXHRcdHRoaXMudG9rZW4gPSBBc3NldExpYnJhcnkubG9hZChuZXcgVVJMUmVxdWVzdCgnYXNzZXRzL0pTTlBhcnNlclRlc3QuanNvbicpICk7XG5cdFx0dGhpcy50b2tlbi5hZGRFdmVudExpc3RlbmVyKCBMb2FkZXJFdmVudC5SRVNPVVJDRV9DT01QTEVURSAsIChldmVudDpMb2FkZXJFdmVudCkgPT4gdGhpcy5vblJlc291cmNlQ29tcGxldGUoZXZlbnQpICk7XG5cdFx0dGhpcy50b2tlbi5hZGRFdmVudExpc3RlbmVyKEFzc2V0RXZlbnQuQVNTRVRfQ09NUExFVEUgLCAoZXZlbnQ6QXNzZXRFdmVudCkgPT4gdGhpcy5vbkFzc2V0Q29tcGxldGUoZXZlbnQpICk7XG5cblx0XHR0aGlzLnRva2VuID0gQXNzZXRMaWJyYXJ5LmxvYWQobmV3IFVSTFJlcXVlc3QoJ2Fzc2V0cy8xMDI0eDEwMjQucG5nJykgKTtcblx0XHR0aGlzLnRva2VuLmFkZEV2ZW50TGlzdGVuZXIoIExvYWRlckV2ZW50LlJFU09VUkNFX0NPTVBMRVRFICwgKGV2ZW50OkxvYWRlckV2ZW50KSA9PiB0aGlzLm9uUmVzb3VyY2VDb21wbGV0ZShldmVudCkgKTtcblx0XHR0aGlzLnRva2VuLmFkZEV2ZW50TGlzdGVuZXIoQXNzZXRFdmVudC5BU1NFVF9DT01QTEVURSAsIChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uQXNzZXRDb21wbGV0ZShldmVudCkgKTtcblxuXHR9XG5cblx0cHVibGljIG9uQXNzZXRDb21wbGV0ZShldmVudDpBc3NldEV2ZW50KVxuXHR7XG5cblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuXHRcdGNvbnNvbGUubG9nKCAnQXNzZXRFdmVudC5BU1NFVF9DT01QTEVURScgLCBBc3NldExpYnJhcnkuZ2V0QXNzZXQoZXZlbnQuYXNzZXQubmFtZSkgKTtcblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuXG5cdFx0dmFyIGltYWdlVGV4dHVyZSA6IEltYWdlVGV4dHVyZSA9IDxJbWFnZVRleHR1cmU+IEFzc2V0TGlicmFyeS5nZXRBc3NldChldmVudC5hc3NldC5uYW1lKTtcblxuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGltYWdlVGV4dHVyZS5odG1sSW1hZ2VFbGVtZW50ICk7XG5cblx0XHRpbWFnZVRleHR1cmUuaHRtbEltYWdlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cdFx0aW1hZ2VUZXh0dXJlLmh0bWxJbWFnZUVsZW1lbnQuc3R5bGUudG9wID0gdGhpcy5oZWlnaHQgKyAncHgnO1xuXG5cblx0XHR0aGlzLmhlaWdodCArPSAoIGltYWdlVGV4dHVyZS5odG1sSW1hZ2VFbGVtZW50LmhlaWdodCArIDEwICkgO1xuXG5cdH1cblx0cHVibGljIG9uUmVzb3VyY2VDb21wbGV0ZShldmVudDpMb2FkZXJFdmVudClcblx0e1xuXG5cdFx0dmFyIGxvYWRlciA6IEFzc2V0TG9hZGVyID0gPEFzc2V0TG9hZGVyPiBldmVudC50YXJnZXQ7XG5cblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuXHRcdGNvbnNvbGUubG9nKCAnTG9hZGVyRXZlbnQuUkVTT1VSQ0VfQ09NUExFVEUnICwgZXZlbnQgICk7XG5cdFx0Y29uc29sZS5sb2coICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblxuXHR9XG5cbn1cblxuLyoqXG4qIEltYWdlUGFyc2VyIHByb3ZpZGVzIGEgXCJwYXJzZXJcIiBmb3IgbmF0aXZlbHkgc3VwcG9ydGVkIGltYWdlIHR5cGVzIChqcGcsIHBuZykuIFdoaWxlIGl0IHNpbXBseSBsb2FkcyBieXRlcyBpbnRvXG4qIGEgbG9hZGVyIG9iamVjdCwgaXQgd3JhcHMgaXQgaW4gYSBCaXRtYXBEYXRhUmVzb3VyY2Ugc28gcmVzb3VyY2UgbWFuYWdlbWVudCBjYW4gaGFwcGVuIGNvbnNpc3RlbnRseSB3aXRob3V0XG4qIGV4Y2VwdGlvbiBjYXNlcy5cbiovXG5jbGFzcyBKU09OVGV4dHVyZVBhcnNlciBleHRlbmRzIFBhcnNlckJhc2Vcbntcblx0cHJpdmF0ZSBTVEFURV9QQVJTRV9EQVRBOm51bWJlciA9IDA7XG5cdHByaXZhdGUgU1RBVEVfTE9BRF9JTUFHRVM6bnVtYmVyID0gMTtcblx0cHJpdmF0ZSBTVEFURV9DT01QTEVURTpudW1iZXIgPSAyO1xuXG5cdHByaXZhdGUgX3N0YXRlOm51bWJlciA9IC0xO1xuXHRwcml2YXRlIF9zdGFydGVkUGFyc2luZzpib29sZWFuO1xuXHRwcml2YXRlIF9kb25lUGFyc2luZzpib29sZWFuO1xuXHRwcml2YXRlIF9kZXBlbmRlbmN5Q291bnQ6bnVtYmVyID0gMDtcblx0cHJpdmF0ZSBfbG9hZGVkVGV4dHVyZXM6QXJyYXk8VGV4dHVyZTJEQmFzZT47XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBuZXcgSW1hZ2VQYXJzZXIgb2JqZWN0LlxuXHQgKiBAcGFyYW0gdXJpIFRoZSB1cmwgb3IgaWQgb2YgdGhlIGRhdGEgb3IgZmlsZSB0byBiZSBwYXJzZWQuXG5cdCAqIEBwYXJhbSBleHRyYSBUaGUgaG9sZGVyIGZvciBleHRyYSBjb250ZXh0dWFsIGRhdGEgdGhhdCB0aGUgcGFyc2VyIG1pZ2h0IG5lZWQuXG5cdCAqL1xuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblx0XHRzdXBlcihQYXJzZXJEYXRhRm9ybWF0LlBMQUlOX1RFWFQpO1xuXG5cdFx0dGhpcy5fbG9hZGVkVGV4dHVyZXMgPSBuZXcgQXJyYXk8VGV4dHVyZTJEQmFzZT4oKTtcblx0XHR0aGlzLl9zdGF0ZSA9IHRoaXMuU1RBVEVfUEFSU0VfREFUQTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSBnaXZlbiBmaWxlIGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBhcnNlci5cblx0ICogQHBhcmFtIGV4dGVuc2lvbiBUaGUgZmlsZSBleHRlbnNpb24gb2YgYSBwb3RlbnRpYWwgZmlsZSB0byBiZSBwYXJzZWQuXG5cdCAqIEByZXR1cm4gV2hldGhlciBvciBub3QgdGhlIGdpdmVuIGZpbGUgdHlwZSBpcyBzdXBwb3J0ZWQuXG5cdCAqL1xuXG5cdHB1YmxpYyBzdGF0aWMgc3VwcG9ydHNUeXBlKGV4dGVuc2lvbiA6IHN0cmluZykgOiBib29sZWFuXG5cdHtcblx0XHRleHRlbnNpb24gPSBleHRlbnNpb24udG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gZXh0ZW5zaW9uID09IFwianNvblwiO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRlc3RzIHdoZXRoZXIgYSBkYXRhIGJsb2NrIGNhbiBiZSBwYXJzZWQgYnkgdGhlIHBhcnNlci5cblx0ICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgYmxvY2sgdG8gcG90ZW50aWFsbHkgYmUgcGFyc2VkLlxuXHQgKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBkYXRhIGlzIHN1cHBvcnRlZC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgc3VwcG9ydHNEYXRhKGRhdGEgOiBhbnkpIDogYm9vbGVhblxuXHR7XG5cdFx0dHJ5IHtcblx0XHRcdHZhciBvYmogPSBKU09OLnBhcnNlKGRhdGEpO1xuXG5cdFx0XHRpZiAob2JqKVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gY2F0Y2ggKCBlICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIF9pUmVzb2x2ZURlcGVuZGVuY3kocmVzb3VyY2VEZXBlbmRlbmN5OlJlc291cmNlRGVwZW5kZW5jeSlcblx0e1xuXHRcdHZhciByZXNvdXJjZSA6IFRleHR1cmUyREJhc2UgPSA8VGV4dHVyZTJEQmFzZT4gcmVzb3VyY2VEZXBlbmRlbmN5LmFzc2V0c1swXTtcblxuXHRcdHRoaXMuX3BGaW5hbGl6ZUFzc2V0KDxJQXNzZXQ+IHJlc291cmNlLCByZXNvdXJjZURlcGVuZGVuY3kuX2lMb2FkZXIudXJsKTtcblxuXHRcdHRoaXMuX2xvYWRlZFRleHR1cmVzLnB1c2goIHJlc291cmNlICk7XG5cblx0XHQvL2NvbnNvbGUubG9nKCAnSlNPTlRleHR1cmVQYXJzZXIuX2lSZXNvbHZlRGVwZW5kZW5jeScgLCByZXNvdXJjZURlcGVuZGVuY3kgKTtcblx0XHQvL2NvbnNvbGUubG9nKCAnSlNPTlRleHR1cmVQYXJzZXIuX2lSZXNvbHZlRGVwZW5kZW5jeSByZXNvdXJjZTogJyAsIHJlc291cmNlICk7XG5cblx0XHR0aGlzLl9kZXBlbmRlbmN5Q291bnQtLTtcblxuXHRcdGlmICggdGhpcy5fZGVwZW5kZW5jeUNvdW50ID09IDApXG5cdFx0XHR0aGlzLl9zdGF0ZSA9IHRoaXMuU1RBVEVfQ09NUExFVEU7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfaVJlc29sdmVEZXBlbmRlbmN5RmFpbHVyZShyZXNvdXJjZURlcGVuZGVuY3k6UmVzb3VyY2VEZXBlbmRlbmN5KVxuXHR7XG5cdFx0dGhpcy5fZGVwZW5kZW5jeUNvdW50LS07XG5cblx0XHRpZiAoIHRoaXMuX2RlcGVuZGVuY3lDb3VudCA9PSAwKVxuXHRcdFx0dGhpcy5fc3RhdGUgPSB0aGlzLlNUQVRFX0NPTVBMRVRFO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUpzb24oICkgOiB2b2lkXG5cdHtcblx0XHRpZiAoSlNPTlRleHR1cmVQYXJzZXIuc3VwcG9ydHNEYXRhKHRoaXMuZGF0YSkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciBqc29uOmFueSA9IEpTT04ucGFyc2UodGhpcy5kYXRhKTtcblx0XHRcdFx0dmFyIGRhdGE6QXJyYXk8YW55PiA9IDxBcnJheTxhbnk+PiBqc29uLmRhdGE7XG5cblx0XHRcdFx0dmFyIHJlYzphbnk7XG5cdFx0XHRcdHZhciBycTpVUkxSZXF1ZXN0O1xuXG5cdFx0XHRcdGZvciAodmFyIGMgOiBudW1iZXIgPSAwOyBjIDwgZGF0YS5sZW5ndGg7IGMgKyspIHtcblx0XHRcdFx0XHRyZWMgPSBkYXRhW2NdO1xuXG5cdFx0XHRcdFx0dmFyIHVyaTpzdHJpbmcgPSA8c3RyaW5nPiByZWMuaW1hZ2U7XG5cdFx0XHRcdFx0dmFyIGlkOnN0cmluZyA9IDxzdHJpbmc+IHJlYy5pZDtcblxuXHRcdFx0XHRcdHJxID0gbmV3IFVSTFJlcXVlc3QodXJpKTtcblxuXHRcdFx0XHRcdHRoaXMuX3BBZGREZXBlbmRlbmN5KCdKU09OX0lEXycgKyBpZCwgcnEsIGZhbHNlLCBudWxsLCB0cnVlKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuX2RlcGVuZGVuY3lDb3VudCA9IGRhdGEubGVuZ3RoO1xuXHRcdFx0XHR0aGlzLl9zdGF0ZSA9IHRoaXMuU1RBVEVfTE9BRF9JTUFHRVM7XG5cblx0XHRcdFx0dGhpcy5fcFBhdXNlQW5kUmV0cmlldmVEZXBlbmRlbmNpZXMoKTtcblxuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHR0aGlzLl9zdGF0ZSA9IHRoaXMuU1RBVEVfQ09NUExFVEU7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdC8qKlxuXHQgKiBAaW5oZXJpdERvY1xuXHQgKi9cblx0cHVibGljIF9wUHJvY2VlZFBhcnNpbmcoKSA6IGJvb2xlYW5cblx0e1xuXHRcdGNvbnNvbGUubG9nKCAnSlNPTlRleHR1cmVQYXJzZXIuX3BQcm9jZWVkUGFyc2luZycgLCB0aGlzLl9zdGF0ZSApO1xuXG5cdFx0c3dpdGNoICh0aGlzLl9zdGF0ZSkge1xuXHRcdFx0Y2FzZSB0aGlzLlNUQVRFX1BBUlNFX0RBVEE6XG5cdFx0XHRcdHRoaXMucGFyc2VKc29uKCk7XG5cdFx0XHRcdHJldHVybiBQYXJzZXJCYXNlLk1PUkVfVE9fUEFSU0U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSB0aGlzLlNUQVRFX0xPQURfSU1BR0VTOlxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgdGhpcy5TVEFURV9DT01QTEVURTpcblx0XHRcdFx0cmV0dXJuIFBhcnNlckJhc2UuUEFSU0lOR19ET05FO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRyZXR1cm4gUGFyc2VyQmFzZS5NT1JFX1RPX1BBUlNFO1xuXHR9XG59Il19 \ No newline at end of file diff --git a/tests/library/AssetLibraryTest.ts b/tests/library/AssetLibraryTest.ts index 7df0fc25..e56bf373 100644 --- a/tests/library/AssetLibraryTest.ts +++ b/tests/library/AssetLibraryTest.ts @@ -1,67 +1,213 @@ -/// -/// - -module tests.library +import AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +import LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +import ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +import AssetLibrary = require("awayjs-core/lib/core/library/AssetLibrary"); +import AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); +import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import ImageTexture = require("awayjs-core/lib/textures/ImageTexture"); +import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +import ParserDataFormat = require("awayjs-core/lib/parsers/ParserDataFormat"); +import ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); + +class AssetLibraryTest { - import AssetEvent = away.events.AssetEvent; - import LoaderEvent = away.events.LoaderEvent; - import ParserEvent = away.events.ParserEvent; - import AssetLibrary = away.library.AssetLibrary; - import AssetLoader = away.net.AssetLoader; - import AssetLoaderToken = away.net.AssetLoaderToken; - import URLRequest = away.net.URLRequest; - import Delegate = away.utils.Delegate; - - export class AssetLibraryTest //extends away.events.EventDispatcher - { - - private height : number = 0; - private token : AssetLoaderToken; - constructor() - { + private height : number = 0; - AssetLibrary.enableParser( parsers.JSONTextureParser) ; + private token : AssetLoaderToken; + constructor() + { - this.token = AssetLibrary.load(new URLRequest('assets/JSNParserTest.json') ); - this.token.addEventListener( away.events.LoaderEvent.RESOURCE_COMPLETE , Delegate.create(this, this.onResourceComplete) ); - this.token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE , Delegate.create(this, this.onAssetComplete) ); + AssetLibrary.enableParser(JSONTextureParser) ; - this.token = AssetLibrary.load(new URLRequest('assets/1024x1024.png') ); - this.token.addEventListener( away.events.LoaderEvent.RESOURCE_COMPLETE , Delegate.create(this, this.onResourceComplete) ); - this.token.addEventListener(away.events.AssetEvent.ASSET_COMPLETE , Delegate.create(this, this.onAssetComplete) ); + this.token = AssetLibrary.load(new URLRequest('assets/JSNParserTest.json') ); + this.token.addEventListener( LoaderEvent.RESOURCE_COMPLETE , (event:LoaderEvent) => this.onResourceComplete(event) ); + this.token.addEventListener(AssetEvent.ASSET_COMPLETE , (event:AssetEvent) => this.onAssetComplete(event) ); - } + this.token = AssetLibrary.load(new URLRequest('assets/1024x1024.png') ); + this.token.addEventListener( LoaderEvent.RESOURCE_COMPLETE , (event:LoaderEvent) => this.onResourceComplete(event) ); + this.token.addEventListener(AssetEvent.ASSET_COMPLETE , (event:AssetEvent) => this.onAssetComplete(event) ); - public onAssetComplete ( e : away.events.AssetEvent ) - { + } - console.log( '------------------------------------------------------------------------------'); - console.log( 'away.events.AssetEvent.ASSET_COMPLETE' , AssetLibrary.getAsset(e.asset.name) ); - console.log( '------------------------------------------------------------------------------'); + public onAssetComplete(event:AssetEvent) + { - var imageTexture : away.textures.ImageTexture = AssetLibrary.getAsset(e.asset.name); + console.log( '------------------------------------------------------------------------------'); + console.log( 'AssetEvent.ASSET_COMPLETE' , AssetLibrary.getAsset(event.asset.name) ); + console.log( '------------------------------------------------------------------------------'); - document.body.appendChild( imageTexture.htmlImageElement ); + var imageTexture : ImageTexture = AssetLibrary.getAsset(event.asset.name); - imageTexture.htmlImageElement.style.position = 'absolute'; - imageTexture.htmlImageElement.style.top = this.height + 'px'; + document.body.appendChild( imageTexture.htmlImageElement ); + imageTexture.htmlImageElement.style.position = 'absolute'; + imageTexture.htmlImageElement.style.top = this.height + 'px'; - this.height += ( imageTexture.htmlImageElement.height + 10 ) ; - } - public onResourceComplete ( e : away.events.LoaderEvent ) - { + this.height += ( imageTexture.htmlImageElement.height + 10 ) ; - var loader : AssetLoader = e.target; + } + public onResourceComplete(event:LoaderEvent) + { - console.log( '------------------------------------------------------------------------------'); - console.log( 'away.events.LoaderEvent.RESOURCE_COMPLETE' , e ); - console.log( '------------------------------------------------------------------------------'); + var loader : AssetLoader = event.target; - } + console.log( '------------------------------------------------------------------------------'); + console.log( 'LoaderEvent.RESOURCE_COMPLETE' , event ); + console.log( '------------------------------------------------------------------------------'); - } + } } + +/** +* ImageParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into +* a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without +* exception cases. +*/ +class JSONTextureParser extends ParserBase +{ + private STATE_PARSE_DATA:number = 0; + private STATE_LOAD_IMAGES:number = 1; + private STATE_COMPLETE:number = 2; + + private _state:number = -1; + private _startedParsing:boolean; + private _doneParsing:boolean; + private _dependencyCount:number = 0; + private _loadedTextures:Array; + + /** + * Creates a new ImageParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + constructor() + { + super(ParserDataFormat.PLAIN_TEXT); + + this._loadedTextures = new Array(); + this._state = this.STATE_PARSE_DATA; + } + + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + + public static supportsType(extension : string) : boolean + { + extension = extension.toLowerCase(); + return extension == "json"; + } + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + public static supportsData(data : any) : boolean + { + try { + var obj = JSON.parse(data); + + if (obj) + return true; + + return false; + } catch ( e ) { + return false; + } + + return false; + } + + /** + * @inheritDoc + */ + public _iResolveDependency(resourceDependency:ResourceDependency) + { + var resource : Texture2DBase = resourceDependency.assets[0]; + + this._pFinalizeAsset( resource, resourceDependency._iLoader.url); + + this._loadedTextures.push( resource ); + + //console.log( 'JSONTextureParser._iResolveDependency' , resourceDependency ); + //console.log( 'JSONTextureParser._iResolveDependency resource: ' , resource ); + + this._dependencyCount--; + + if ( this._dependencyCount == 0) + this._state = this.STATE_COMPLETE; + } + + /** + * @inheritDoc + */ + public _iResolveDependencyFailure(resourceDependency:ResourceDependency) + { + this._dependencyCount--; + + if ( this._dependencyCount == 0) + this._state = this.STATE_COMPLETE; + } + + private parseJson( ) : void + { + if (JSONTextureParser.supportsData(this.data)) { + try { + var json:any = JSON.parse(this.data); + var data:Array = > json.data; + + var rec:any; + var rq:URLRequest; + + for (var c : number = 0; c < data.length; c ++) { + rec = data[c]; + + var uri:string = rec.image; + var id:string = rec.id; + + rq = new URLRequest(uri); + + this._pAddDependency('JSON_ID_' + id, rq, false, null, true); + } + + this._dependencyCount = data.length; + this._state = this.STATE_LOAD_IMAGES; + + this._pPauseAndRetrieveDependencies(); + + } catch (e) { + this._state = this.STATE_COMPLETE; + } + } + } + /** + * @inheritDoc + */ + public _pProceedParsing() : boolean + { + console.log( 'JSONTextureParser._pProceedParsing' , this._state ); + + switch (this._state) { + case this.STATE_PARSE_DATA: + this.parseJson(); + return ParserBase.MORE_TO_PARSE; + break; + case this.STATE_LOAD_IMAGES: + break; + case this.STATE_COMPLETE: + return ParserBase.PARSING_DONE; + break; + } + + return ParserBase.MORE_TO_PARSE; + } +} \ No newline at end of file diff --git a/tests/net/AssetLoaderTest.js b/tests/net/AssetLoaderTest.js new file mode 100755 index 00000000..f13cf9fa --- /dev/null +++ b/tests/net/AssetLoaderTest.js @@ -0,0 +1,227 @@ +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var AssetEvent = require("awayjs-core/lib/events/AssetEvent"); + +var ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +var AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); + +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); + +var ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +var ParserDataFormat = require("awayjs-core/lib/parsers/ParserDataFormat"); + +var AssetLoaderTest = (function () { + function AssetLoaderTest() { + var _this = this; + //--------------------------------------------------------------------------------------------------------------------- + // Enable Custom Parser ( JSON file format with multiple texture dependencies ) + AssetLoader.enableParser(JSONTextureParser); + + var token; + var urlRq; + + //--------------------------------------------------------------------------------------------------------------------- + // LOAD A SINGLE IMAGE + this.alImage = new AssetLoader(); + urlRq = new URLRequest('assets/1024x1024.png'); + token = this.alImage.load(urlRq); + + token.addEventListener(AssetEvent.ASSET_COMPLETE, function (event) { + return _this.onAssetComplete(event); + }); + token.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, function (event) { + return _this.onTextureSizeError(event); + }); + + //--------------------------------------------------------------------------------------------------------------------- + // LOAD A SINGLE IMAGE - With wrong dimensions + this.alErrorImage = new AssetLoader(); + urlRq = new URLRequest('assets/2.png'); + token = this.alErrorImage.load(urlRq); + + token.addEventListener(AssetEvent.ASSET_COMPLETE, function (event) { + return _this.onAssetComplete(event); + }); + token.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, function (event) { + return _this.onTextureSizeError(event); + }); + + //--------------------------------------------------------------------------------------------------------------------- + // LOAD WITH A JSON PARSER + this.alJson = new AssetLoader(); + urlRq = new URLRequest('assets/JSNParserTest.json'); + token = this.alJson.load(urlRq); + + token.addEventListener(AssetEvent.ASSET_COMPLETE, function (event) { + return _this.onAssetComplete(event); + }); + token.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, function (event) { + return _this.onTextureSizeError(event); + }); + token.addEventListener(ParserEvent.PARSE_COMPLETE, function (event) { + return _this.onParseComplete(event); + }); + } + AssetLoaderTest.prototype.onParseComplete = function (event) { + console.log('--------------------------------------------------------------------------------'); + console.log('AssetLoaderTest.onParseComplete', event); + console.log('--------------------------------------------------------------------------------'); + }; + + AssetLoaderTest.prototype.onTextureSizeError = function (event) { + var assetLoader = event.target; + + console.log('--------------------------------------------------------------------------------'); + console.log('AssetLoaderTest.onTextureSizeError', assetLoader.baseDependency._iLoader.url, event); + console.log('--------------------------------------------------------------------------------'); + }; + + AssetLoaderTest.prototype.onAssetComplete = function (event) { + var assetLoader = event.target; + + console.log('--------------------------------------------------------------------------------'); + console.log('AssetLoaderTest.onAssetComplete', assetLoader.baseDependency._iLoader.url, event); + console.log('--------------------------------------------------------------------------------'); + }; + return AssetLoaderTest; +})(); + +/** +* ImageParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into +* a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without +* exception cases. +*/ +var JSONTextureParser = (function (_super) { + __extends(JSONTextureParser, _super); + /** + * Creates a new ImageParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + function JSONTextureParser() { + _super.call(this, ParserDataFormat.PLAIN_TEXT); + this.STATE_PARSE_DATA = 0; + this.STATE_LOAD_IMAGES = 1; + this.STATE_COMPLETE = 2; + this._state = -1; + this._dependencyCount = 0; + + this._loadedTextures = new Array(); + this._state = this.STATE_PARSE_DATA; + } + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + JSONTextureParser.supportsType = function (extension) { + extension = extension.toLowerCase(); + return extension == "json"; + }; + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + JSONTextureParser.supportsData = function (data) { + try { + var obj = JSON.parse(data); + + if (obj) + return true; + + return false; + } catch (e) { + return false; + } + + return false; + }; + + /** + * @inheritDoc + */ + JSONTextureParser.prototype._iResolveDependency = function (resourceDependency) { + var resource = resourceDependency.assets[0]; + + this._pFinalizeAsset(resource, resourceDependency._iLoader.url); + + this._loadedTextures.push(resource); + + //console.log( 'JSONTextureParser._iResolveDependency' , resourceDependency ); + //console.log( 'JSONTextureParser._iResolveDependency resource: ' , resource ); + this._dependencyCount--; + + if (this._dependencyCount == 0) + this._state = this.STATE_COMPLETE; + }; + + /** + * @inheritDoc + */ + JSONTextureParser.prototype._iResolveDependencyFailure = function (resourceDependency) { + this._dependencyCount--; + + if (this._dependencyCount == 0) + this._state = this.STATE_COMPLETE; + }; + + JSONTextureParser.prototype.parseJson = function () { + if (JSONTextureParser.supportsData(this.data)) { + try { + var json = JSON.parse(this.data); + var data = json.data; + + var rec; + var rq; + + for (var c = 0; c < data.length; c++) { + rec = data[c]; + + var uri = rec.image; + var id = rec.id; + + rq = new URLRequest(uri); + + this._pAddDependency('JSON_ID_' + id, rq, false, null, true); + } + + this._dependencyCount = data.length; + this._state = this.STATE_LOAD_IMAGES; + + this._pPauseAndRetrieveDependencies(); + } catch (e) { + this._state = this.STATE_COMPLETE; + } + } + }; + + /** + * @inheritDoc + */ + JSONTextureParser.prototype._pProceedParsing = function () { + console.log('JSONTextureParser._pProceedParsing', this._state); + + switch (this._state) { + case this.STATE_PARSE_DATA: + this.parseJson(); + return ParserBase.MORE_TO_PARSE; + break; + case this.STATE_LOAD_IMAGES: + break; + case this.STATE_COMPLETE: + return ParserBase.PARSING_DONE; + break; + } + + return ParserBase.MORE_TO_PARSE; + }; + return JSONTextureParser; +})(ParserBase); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5ldC9Bc3NldExvYWRlclRlc3QudHMiXSwibmFtZXMiOlsiQXNzZXRMb2FkZXJUZXN0IiwiQXNzZXRMb2FkZXJUZXN0LmNvbnN0cnVjdG9yIiwiQXNzZXRMb2FkZXJUZXN0Lm9uUGFyc2VDb21wbGV0ZSIsIkFzc2V0TG9hZGVyVGVzdC5vblRleHR1cmVTaXplRXJyb3IiLCJBc3NldExvYWRlclRlc3Qub25Bc3NldENvbXBsZXRlIiwiSlNPTlRleHR1cmVQYXJzZXIiLCJKU09OVGV4dHVyZVBhcnNlci5jb25zdHJ1Y3RvciIsIkpTT05UZXh0dXJlUGFyc2VyLnN1cHBvcnRzVHlwZSIsIkpTT05UZXh0dXJlUGFyc2VyLnN1cHBvcnRzRGF0YSIsIkpTT05UZXh0dXJlUGFyc2VyLl9pUmVzb2x2ZURlcGVuZGVuY3kiLCJKU09OVGV4dHVyZVBhcnNlci5faVJlc29sdmVEZXBlbmRlbmN5RmFpbHVyZSIsIkpTT05UZXh0dXJlUGFyc2VyLnBhcnNlSnNvbiIsIkpTT05UZXh0dXJlUGFyc2VyLl9wUHJvY2VlZFBhcnNpbmciXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDZEQUFtRTs7QUFFbkUsK0RBQXFFO0FBQ3JFLHFFQUEyRTs7QUFHM0UsK0RBQXFFOztBQUVyRSw4REFBb0U7QUFDcEUsMEVBQStFOztBQUcvRTtJQU1DQTtRQUFBQyxpQkF3Q0NBO1FBdENBQSx1SEFBdUhBO1FBQ3ZIQSwrRUFBK0VBO1FBQy9FQSxXQUFXQSxDQUFDQSxZQUFZQSxDQUFDQSxpQkFBaUJBLENBQUNBOztRQUUzQ0EsSUFBSUEsS0FBS0E7UUFDVEEsSUFBSUEsS0FBS0E7O1FBRVRBLHVIQUF1SEE7UUFDdkhBLHNCQUFzQkE7UUFFdEJBLElBQUlBLENBQUNBLE9BQU9BLEdBQUlBLElBQUlBLFdBQVdBLENBQUNBLENBQUNBO1FBQ2pDQSxLQUFLQSxHQUFHQSxJQUFJQSxVQUFVQSxDQUFDQSxzQkFBc0JBLENBQUNBO1FBQzlDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFD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LE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLG9DQUFvQ0EsRUFBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBRUE7O1FBRWpFQSxRQUFRQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtZQUNuQkEsS0FBS0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQTtnQkFDekJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO2dCQUNoQkEsT0FBT0EsVUFBVUEsQ0FBQ0EsYUFBYUE7Z0JBQy9CQSxLQUFNQTtBQUFBQSxZQUNQQSxLQUFLQSxJQUFJQSxDQUFDQSxpQkFBaUJBO2dCQUMxQkEsS0FBTUE7QUFBQUEsWUFDUEEsS0FBS0EsSUFBSUEsQ0FBQ0EsY0FBY0E7Z0JBQ3ZCQSxPQUFPQSxVQUFVQSxDQUFDQSxZQUFZQTtnQkFDOUJBLEtBQU1BO0FBQUFBLFNBQ1BBOztRQUVEQSxPQUFPQSxVQUFVQSxDQUFDQSxhQUFhQTtJQUNoQ0EsQ0FBQ0E7SUFDRlAseUJBQUNBO0FBQURBLENBQUNBLEVBN0krQixVQUFVLEVBNkl6QztBQUFBIiwiZmlsZSI6Im5ldC9Bc3NldExvYWRlclRlc3QuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQXNzZXRFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvQXNzZXRFdmVudFwiKTtcbmltcG9ydCBMb2FkZXJFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvTG9hZGVyRXZlbnRcIik7XG5pbXBvcnQgUGFyc2VyRXZlbnRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL1BhcnNlckV2ZW50XCIpO1xuaW1wb3J0IEFzc2V0TG9hZGVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbGlicmFyeS9Bc3NldExvYWRlclwiKTtcbmltcG9ydCBBc3NldExvYWRlclRva2VuXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvQXNzZXRMb2FkZXJUb2tlblwiKTtcbmltcG9ydCBJQXNzZXRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSUFzc2V0XCIpO1xuaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMUmVxdWVzdFwiKTtcbmltcG9ydCBUZXh0dXJlMkRCYXNlXHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi90ZXh0dXJlcy9UZXh0dXJlMkRCYXNlXCIpO1xuaW1wb3J0IFBhcnNlckJhc2VcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvcGFyc2Vycy9QYXJzZXJCYXNlXCIpO1xuaW1wb3J0IFBhcnNlckRhdGFGb3JtYXRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3BhcnNlcnMvUGFyc2VyRGF0YUZvcm1hdFwiKTtcbmltcG9ydCBSZXNvdXJjZURlcGVuZGVuY3lcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1Jlc291cmNlRGVwZW5kZW5jeVwiKTtcblxuY2xhc3MgQXNzZXRMb2FkZXJUZXN0XG57XG5cdHByaXZhdGUgYWxKc29uOkFzc2V0TG9hZGVyO1xuXHRwcml2YXRlIGFsSW1hZ2U6QXNzZXRMb2FkZXI7XG5cdHByaXZhdGUgYWxFcnJvckltYWdlOkFzc2V0TG9hZGVyO1xuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gRW5hYmxlIEN1c3RvbSBQYXJzZXIgKCBKU09OIGZpbGUgZm9ybWF0IHdpdGggbXVsdGlwbGUgdGV4dHVyZSBkZXBlbmRlbmNpZXMgKVxuXHRcdEFzc2V0TG9hZGVyLmVuYWJsZVBhcnNlcihKU09OVGV4dHVyZVBhcnNlcik7XG5cblx0XHR2YXIgdG9rZW46QXNzZXRMb2FkZXJUb2tlbjtcblx0XHR2YXIgdXJsUnE6VVJMUmVxdWVzdDtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gTE9BRCBBIFNJTkdMRSBJTUFHRVxuXG5cdFx0dGhpcy5hbEltYWdlICA9IG5ldyBBc3NldExvYWRlcigpO1xuXHRcdHVybFJxID0gbmV3IFVSTFJlcXVlc3QoJ2Fzc2V0cy8xMDI0eDEwMjQucG5nJyk7XG5cdFx0dG9rZW4gPSB0aGlzLmFsSW1hZ2UubG9hZCh1cmxScSk7XG5cblx0XHR0b2tlbi5hZGRFdmVudExpc3RlbmVyKEFzc2V0RXZlbnQuQVNTRVRfQ09NUExFVEUsIChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uQXNzZXRDb21wbGV0ZShldmVudCkpO1xuXHRcdHRva2VuLmFkZEV2ZW50TGlzdGVuZXIoQXNzZXRFdmVudC5URVhUVVJFX1NJWkVfRVJST1IsIChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uVGV4dHVyZVNpemVFcnJvcihldmVudCkpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQvLyBMT0FEIEEgU0lOR0xFIElNQUdFIC0gV2l0aCB3cm9uZyBkaW1lbnNpb25zXG5cblx0XHR0aGlzLmFsRXJyb3JJbWFnZSA9IG5ldyBBc3NldExvYWRlcigpO1xuXHRcdHVybFJxID0gbmV3IFVSTFJlcXVlc3QoJ2Fzc2V0cy8yLnBuZycpO1xuXHRcdHRva2VuID0gdGhpcy5hbEVycm9ySW1hZ2UubG9hZCh1cmxScSk7XG5cblx0XHR0b2tlbi5hZGRFdmVudExpc3RlbmVyKEFzc2V0RXZlbnQuQVNTRVRfQ09NUExFVEUsIChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uQXNzZXRDb21wbGV0ZShldmVudCkpO1xuXHRcdHRva2VuLmFkZEV2ZW50TGlzdGVuZXIoQXNzZXRFdmVudC5URVhUVVJFX1NJWkVfRVJST1IsIChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uVGV4dHVyZVNpemVFcnJvcihldmVudCkpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQvLyBMT0FEIFdJVEggQSBKU09OIFBBUlNFUlxuXG5cdFx0dGhpcy5hbEpzb24gICAgPSBuZXcgQXNzZXRMb2FkZXIoKTtcblx0XHR1cmxScSAgICAgICAgICA9IG5ldyBVUkxSZXF1ZXN0KCdhc3NldHMvSlNOUGFyc2VyVGVzdC5qc29uJyk7XG5cdFx0dG9rZW4gICAgICAgICAgPSB0aGlzLmFsSnNvbi5sb2FkKCB1cmxScSApO1xuXG5cdFx0dG9rZW4uYWRkRXZlbnRMaXN0ZW5lciggQXNzZXRFdmVudC5BU1NFVF9DT01QTEVURSwgKGV2ZW50OkFzc2V0RXZlbnQpID0+IHRoaXMub25Bc3NldENvbXBsZXRlKGV2ZW50KSk7XG5cdFx0dG9rZW4uYWRkRXZlbnRMaXN0ZW5lciggQXNzZXRFdmVudC5URVhUVVJFX1NJWkVfRVJST1IsIChldmVudDpBc3NldEV2ZW50KSA9PiB0aGlzLm9uVGV4dHVyZVNpemVFcnJvcihldmVudCkpO1xuXHRcdHRva2VuLmFkZEV2ZW50TGlzdGVuZXIoIFBhcnNlckV2ZW50LlBBUlNFX0NPTVBMRVRFLCAoZXZlbnQ6UGFyc2VyRXZlbnQpID0+IHRoaXMub25QYXJzZUNvbXBsZXRlKGV2ZW50KSk7XG5cblx0fVxuXG5cdHB1YmxpYyBvblBhcnNlQ29tcGxldGUoZXZlbnQ6UGFyc2VyRXZlbnQpOnZvaWRcblx0e1xuXHRcdGNvbnNvbGUubG9nKCAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblx0XHRjb25zb2xlLmxvZyggJ0Fzc2V0TG9hZGVyVGVzdC5vblBhcnNlQ29tcGxldGUnICwgZXZlbnQgKTtcblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG5cdH1cblxuXHRwdWJsaWMgb25UZXh0dXJlU2l6ZUVycm9yKGV2ZW50OkFzc2V0RXZlbnQpOnZvaWRcblx0e1xuXHRcdHZhciBhc3NldExvYWRlcjpBc3NldExvYWRlciA9IDxBc3NldExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Y29uc29sZS5sb2coICctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuXHRcdGNvbnNvbGUubG9nKCAnQXNzZXRMb2FkZXJUZXN0Lm9uVGV4dHVyZVNpemVFcnJvcicgLCBhc3NldExvYWRlci5iYXNlRGVwZW5kZW5jeS5faUxvYWRlci51cmwgLCBldmVudCApO1xuXHRcdGNvbnNvbGUubG9nKCAnLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0nKTtcblx0fVxuXG5cdHB1YmxpYyBvbkFzc2V0Q29tcGxldGUoZXZlbnQ6QXNzZXRFdmVudCk6dm9pZFxuXHR7XG5cdFx0dmFyIGFzc2V0TG9hZGVyOkFzc2V0TG9hZGVyID0gPEFzc2V0TG9hZGVyPiBldmVudC50YXJnZXQ7XG5cblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG5cdFx0Y29uc29sZS5sb2coICdBc3NldExvYWRlclRlc3Qub25Bc3NldENvbXBsZXRlJywgYXNzZXRMb2FkZXIuYmFzZURlcGVuZGVuY3kuX2lMb2FkZXIudXJsICwgZXZlbnQgKTtcblx0XHRjb25zb2xlLmxvZyggJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG5cdH1cbn1cblxuLyoqXG4gKiBJbWFnZVBhcnNlciBwcm92aWRlcyBhIFwicGFyc2VyXCIgZm9yIG5hdGl2ZWx5IHN1cHBvcnRlZCBpbWFnZSB0eXBlcyAoanBnLCBwbmcpLiBXaGlsZSBpdCBzaW1wbHkgbG9hZHMgYnl0ZXMgaW50b1xuICogYSBsb2FkZXIgb2JqZWN0LCBpdCB3cmFwcyBpdCBpbiBhIEJpdG1hcERhdGFSZXNvdXJjZSBzbyByZXNvdXJjZSBtYW5hZ2VtZW50IGNhbiBoYXBwZW4gY29uc2lzdGVudGx5IHdpdGhvdXRcbiAqIGV4Y2VwdGlvbiBjYXNlcy5cbiAqL1xuY2xhc3MgSlNPTlRleHR1cmVQYXJzZXIgZXh0ZW5kcyBQYXJzZXJCYXNlXG57XG5cdHByaXZhdGUgU1RBVEVfUEFSU0VfREFUQTpudW1iZXIgPSAwO1xuXHRwcml2YXRlIFNUQVRFX0xPQURfSU1BR0VTOm51bWJlciA9IDE7XG5cdHByaXZhdGUgU1RBVEVfQ09NUExFVEU6bnVtYmVyID0gMjtcblxuXHRwcml2YXRlIF9zdGF0ZTpudW1iZXIgPSAtMTtcblx0cHJpdmF0ZSBfc3RhcnRlZFBhcnNpbmc6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfZG9uZVBhcnNpbmc6Ym9vbGVhbjtcblx0cHJpdmF0ZSBfZGVwZW5kZW5jeUNvdW50Om51bWJlciA9IDA7XG5cdHByaXZhdGUgX2xvYWRlZFRleHR1cmVzOkFycmF5PFRleHR1cmUyREJhc2U+O1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgbmV3IEltYWdlUGFyc2VyIG9iamVjdC5cblx0ICogQHBhcmFtIHVyaSBUaGUgdXJsIG9yIGlkIG9mIHRoZSBkYXRhIG9yIGZpbGUgdG8gYmUgcGFyc2VkLlxuXHQgKiBAcGFyYW0gZXh0cmEgVGhlIGhvbGRlciBmb3IgZXh0cmEgY29udGV4dHVhbCBkYXRhIHRoYXQgdGhlIHBhcnNlciBtaWdodCBuZWVkLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0c3VwZXIoUGFyc2VyRGF0YUZvcm1hdC5QTEFJTl9URVhUKTtcblxuXHRcdHRoaXMuX2xvYWRlZFRleHR1cmVzID0gbmV3IEFycmF5PFRleHR1cmUyREJhc2U+KCk7XG5cdFx0dGhpcy5fc3RhdGUgPSB0aGlzLlNUQVRFX1BBUlNFX0RBVEE7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgZ2l2ZW4gZmlsZSBleHRlbnNpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSBwYXJzZXIuXG5cdCAqIEBwYXJhbSBleHRlbnNpb24gVGhlIGZpbGUgZXh0ZW5zaW9uIG9mIGEgcG90ZW50aWFsIGZpbGUgdG8gYmUgcGFyc2VkLlxuXHQgKiBAcmV0dXJuIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiBmaWxlIHR5cGUgaXMgc3VwcG9ydGVkLlxuXHQgKi9cblxuXHRwdWJsaWMgc3RhdGljIHN1cHBvcnRzVHlwZShleHRlbnNpb24gOiBzdHJpbmcpIDogYm9vbGVhblxuXHR7XG5cdFx0ZXh0ZW5zaW9uID0gZXh0ZW5zaW9uLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIGV4dGVuc2lvbiA9PSBcImpzb25cIjtcblx0fVxuXG5cdC8qKlxuXHQgKiBUZXN0cyB3aGV0aGVyIGEgZGF0YSBibG9jayBjYW4gYmUgcGFyc2VkIGJ5IHRoZSBwYXJzZXIuXG5cdCAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIGJsb2NrIHRvIHBvdGVudGlhbGx5IGJlIHBhcnNlZC5cblx0ICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCB0aGUgZ2l2ZW4gZGF0YSBpcyBzdXBwb3J0ZWQuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHN1cHBvcnRzRGF0YShkYXRhIDogYW55KSA6IGJvb2xlYW5cblx0e1xuXHRcdHRyeSB7XG5cdFx0XHR2YXIgb2JqID0gSlNPTi5wYXJzZShkYXRhKTtcblxuXHRcdFx0aWYgKG9iailcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfaVJlc29sdmVEZXBlbmRlbmN5KHJlc291cmNlRGVwZW5kZW5jeTpSZXNvdXJjZURlcGVuZGVuY3kpXG5cdHtcblx0XHR2YXIgcmVzb3VyY2UgOiBUZXh0dXJlMkRCYXNlID0gPFRleHR1cmUyREJhc2U+IHJlc291cmNlRGVwZW5kZW5jeS5hc3NldHNbMF07XG5cblx0XHR0aGlzLl9wRmluYWxpemVBc3NldCg8SUFzc2V0PiByZXNvdXJjZSwgcmVzb3VyY2VEZXBlbmRlbmN5Ll9pTG9hZGVyLnVybCk7XG5cblx0XHR0aGlzLl9sb2FkZWRUZXh0dXJlcy5wdXNoKCByZXNvdXJjZSApO1xuXG5cdFx0Ly9jb25zb2xlLmxvZyggJ0pTT05UZXh0dXJlUGFyc2VyLl9pUmVzb2x2ZURlcGVuZGVuY3knICwgcmVzb3VyY2VEZXBlbmRlbmN5ICk7XG5cdFx0Ly9jb25zb2xlLmxvZyggJ0pTT05UZXh0dXJlUGFyc2VyLl9pUmVzb2x2ZURlcGVuZGVuY3kgcmVzb3VyY2U6ICcgLCByZXNvdXJjZSApO1xuXG5cdFx0dGhpcy5fZGVwZW5kZW5jeUNvdW50LS07XG5cblx0XHRpZiAoIHRoaXMuX2RlcGVuZGVuY3lDb3VudCA9PSAwKVxuXHRcdFx0dGhpcy5fc3RhdGUgPSB0aGlzLlNUQVRFX0NPTVBMRVRFO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBpbmhlcml0RG9jXG5cdCAqL1xuXHRwdWJsaWMgX2lSZXNvbHZlRGVwZW5kZW5jeUZhaWx1cmUocmVzb3VyY2VEZXBlbmRlbmN5OlJlc291cmNlRGVwZW5kZW5jeSlcblx0e1xuXHRcdHRoaXMuX2RlcGVuZGVuY3lDb3VudC0tO1xuXG5cdFx0aWYgKCB0aGlzLl9kZXBlbmRlbmN5Q291bnQgPT0gMClcblx0XHRcdHRoaXMuX3N0YXRlID0gdGhpcy5TVEFURV9DT01QTEVURTtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VKc29uKCApIDogdm9pZFxuXHR7XG5cdFx0aWYgKEpTT05UZXh0dXJlUGFyc2VyLnN1cHBvcnRzRGF0YSh0aGlzLmRhdGEpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHR2YXIganNvbjphbnkgPSBKU09OLnBhcnNlKHRoaXMuZGF0YSk7XG5cdFx0XHRcdHZhciBkYXRhOkFycmF5PGFueT4gPSA8QXJyYXk8YW55Pj4ganNvbi5kYXRhO1xuXG5cdFx0XHRcdHZhciByZWM6YW55O1xuXHRcdFx0XHR2YXIgcnE6VVJMUmVxdWVzdDtcblxuXHRcdFx0XHRmb3IgKHZhciBjIDogbnVtYmVyID0gMDsgYyA8IGRhdGEubGVuZ3RoOyBjICsrKSB7XG5cdFx0XHRcdFx0cmVjID0gZGF0YVtjXTtcblxuXHRcdFx0XHRcdHZhciB1cmk6c3RyaW5nID0gPHN0cmluZz4gcmVjLmltYWdlO1xuXHRcdFx0XHRcdHZhciBpZDpzdHJpbmcgPSA8c3RyaW5nPiByZWMuaWQ7XG5cblx0XHRcdFx0XHRycSA9IG5ldyBVUkxSZXF1ZXN0KHVyaSk7XG5cblx0XHRcdFx0XHR0aGlzLl9wQWRkRGVwZW5kZW5jeSgnSlNPTl9JRF8nICsgaWQsIHJxLCBmYWxzZSwgbnVsbCwgdHJ1ZSk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLl9kZXBlbmRlbmN5Q291bnQgPSBkYXRhLmxlbmd0aDtcblx0XHRcdFx0dGhpcy5fc3RhdGUgPSB0aGlzLlNUQVRFX0xPQURfSU1BR0VTO1xuXG5cdFx0XHRcdHRoaXMuX3BQYXVzZUFuZFJldHJpZXZlRGVwZW5kZW5jaWVzKCk7XG5cblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0dGhpcy5fc3RhdGUgPSB0aGlzLlNUQVRFX0NPTVBMRVRFO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXHQvKipcblx0ICogQGluaGVyaXREb2Ncblx0ICovXG5cdHB1YmxpYyBfcFByb2NlZWRQYXJzaW5nKCkgOiBib29sZWFuXG5cdHtcblx0XHRjb25zb2xlLmxvZyggJ0pTT05UZXh0dXJlUGFyc2VyLl9wUHJvY2VlZFBhcnNpbmcnICwgdGhpcy5fc3RhdGUgKTtcblxuXHRcdHN3aXRjaCAodGhpcy5fc3RhdGUpIHtcblx0XHRcdGNhc2UgdGhpcy5TVEFURV9QQVJTRV9EQVRBOlxuXHRcdFx0XHR0aGlzLnBhcnNlSnNvbigpO1xuXHRcdFx0XHRyZXR1cm4gUGFyc2VyQmFzZS5NT1JFX1RPX1BBUlNFO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgdGhpcy5TVEFURV9MT0FEX0lNQUdFUzpcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIHRoaXMuU1RBVEVfQ09NUExFVEU6XG5cdFx0XHRcdHJldHVybiBQYXJzZXJCYXNlLlBBUlNJTkdfRE9ORTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFBhcnNlckJhc2UuTU9SRV9UT19QQVJTRTtcblx0fVxufSJdfQ== \ No newline at end of file diff --git a/tests/net/AssetLoaderTest.ts b/tests/net/AssetLoaderTest.ts index 33f7b1b1..d6b335a5 100644 --- a/tests/net/AssetLoaderTest.ts +++ b/tests/net/AssetLoaderTest.ts @@ -1,96 +1,233 @@ -/// -/// - -module tests.net +import AssetEvent = require("awayjs-core/lib/events/AssetEvent"); +import LoaderEvent = require("awayjs-core/lib/events/LoaderEvent"); +import ParserEvent = require("awayjs-core/lib/events/ParserEvent"); +import AssetLoader = require("awayjs-core/lib/core/library/AssetLoader"); +import AssetLoaderToken = require("awayjs-core/lib/core/library/AssetLoaderToken"); +import IAsset = require("awayjs-core/lib/core/library/IAsset"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import Texture2DBase = require("awayjs-core/lib/textures/Texture2DBase"); +import ParserBase = require("awayjs-core/lib/parsers/ParserBase"); +import ParserDataFormat = require("awayjs-core/lib/parsers/ParserDataFormat"); +import ResourceDependency = require("awayjs-core/lib/parsers/ResourceDependency"); + +class AssetLoaderTest { - import AssetEvent = away.events.AssetEvent; - import LoaderEvent = away.events.LoaderEvent; - import ParserEvent = away.events.ParserEvent; - import AssetLoader = away.net.AssetLoader; - import AssetLoaderToken = away.net.AssetLoaderToken; - import URLRequest = away.net.URLRequest; - import Delegate = away.utils.Delegate; - - export class AssetLoaderTest - { - - private alJson : AssetLoader; - private alImage : AssetLoader; - private alErrorImage : AssetLoader; - - constructor() - { - - //--------------------------------------------------------------------------------------------------------------------- - // Enable Custom Parser ( JSON file format with multiple texture dependencies ) - AssetLoader.enableParser( parsers.JSONTextureParser ); - - var token : AssetLoaderToken; - var urlRq : URLRequest; - - //--------------------------------------------------------------------------------------------------------------------- - // LOAD A SINGLE IMAGE + private alJson:AssetLoader; + private alImage:AssetLoader; + private alErrorImage:AssetLoader; - this.alImage = new AssetLoader(); - urlRq = new URLRequest('assets/1024x1024.png'); - token = this.alImage.load( urlRq ); + constructor() + { + //--------------------------------------------------------------------------------------------------------------------- + // Enable Custom Parser ( JSON file format with multiple texture dependencies ) + AssetLoader.enableParser(JSONTextureParser); - token.addEventListener( AssetEvent.ASSET_COMPLETE, Delegate.create(this, this.onAssetComplete) ); - token.addEventListener( AssetEvent.TEXTURE_SIZE_ERROR, Delegate.create(this, this.onTextureSizeError) ); + var token:AssetLoaderToken; + var urlRq:URLRequest; - //--------------------------------------------------------------------------------------------------------------------- - // LOAD A SINGLE IMAGE - With wrong dimensions + //--------------------------------------------------------------------------------------------------------------------- + // LOAD A SINGLE IMAGE - this.alErrorImage = new AssetLoader(); - urlRq = new URLRequest('assets/2.png'); - token = this.alErrorImage.load( urlRq ); + this.alImage = new AssetLoader(); + urlRq = new URLRequest('assets/1024x1024.png'); + token = this.alImage.load(urlRq); - token.addEventListener( AssetEvent.ASSET_COMPLETE, Delegate.create(this, this.onAssetComplete) ); - token.addEventListener( AssetEvent.TEXTURE_SIZE_ERROR, Delegate.create(this, this.onTextureSizeError) ); + token.addEventListener(AssetEvent.ASSET_COMPLETE, (event:AssetEvent) => this.onAssetComplete(event)); + token.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, (event:AssetEvent) => this.onTextureSizeError(event)); - //--------------------------------------------------------------------------------------------------------------------- - // LOAD WITH A JSON PARSER + //--------------------------------------------------------------------------------------------------------------------- + // LOAD A SINGLE IMAGE - With wrong dimensions - this.alJson = new AssetLoader(); - urlRq = new URLRequest('assets/JSNParserTest.json'); - token = this.alJson.load( urlRq ); + this.alErrorImage = new AssetLoader(); + urlRq = new URLRequest('assets/2.png'); + token = this.alErrorImage.load(urlRq); - token.addEventListener( AssetEvent.ASSET_COMPLETE, Delegate.create(this, this.onAssetComplete) ); - token.addEventListener( AssetEvent.TEXTURE_SIZE_ERROR, Delegate.create(this, this.onTextureSizeError) ); - token.addEventListener( ParserEvent.PARSE_COMPLETE, Delegate.create(this, this.onParseComplete) ); + token.addEventListener(AssetEvent.ASSET_COMPLETE, (event:AssetEvent) => this.onAssetComplete(event)); + token.addEventListener(AssetEvent.TEXTURE_SIZE_ERROR, (event:AssetEvent) => this.onTextureSizeError(event)); - } + //--------------------------------------------------------------------------------------------------------------------- + // LOAD WITH A JSON PARSER - public onParseComplete ( e : ParserEvent ) : void - { + this.alJson = new AssetLoader(); + urlRq = new URLRequest('assets/JSNParserTest.json'); + token = this.alJson.load( urlRq ); - console.log( '--------------------------------------------------------------------------------'); - console.log( 'AssetLoaderTest.onParseComplete' , e ); - console.log( '--------------------------------------------------------------------------------'); - } + token.addEventListener( AssetEvent.ASSET_COMPLETE, (event:AssetEvent) => this.onAssetComplete(event)); + token.addEventListener( AssetEvent.TEXTURE_SIZE_ERROR, (event:AssetEvent) => this.onTextureSizeError(event)); + token.addEventListener( ParserEvent.PARSE_COMPLETE, (event:ParserEvent) => this.onParseComplete(event)); - public onTextureSizeError ( e : AssetEvent ) : void - { + } - var assetLoader : AssetLoader = e.target; + public onParseComplete(event:ParserEvent):void + { + console.log( '--------------------------------------------------------------------------------'); + console.log( 'AssetLoaderTest.onParseComplete' , event ); + console.log( '--------------------------------------------------------------------------------'); + } - console.log( '--------------------------------------------------------------------------------'); - console.log( 'AssetLoaderTest.onTextureSizeError' , assetLoader.baseDependency._iLoader.url , e ); - console.log( '--------------------------------------------------------------------------------'); + public onTextureSizeError(event:AssetEvent):void + { + var assetLoader:AssetLoader = event.target; - } - - public onAssetComplete ( e : AssetEvent ) : void - { - - var assetLoader : AssetLoader = e.target; - - console.log( '--------------------------------------------------------------------------------'); - console.log( 'AssetLoaderTest.onAssetComplete', assetLoader.baseDependency._iLoader.url , e ); - console.log( '--------------------------------------------------------------------------------'); - - } - } + console.log( '--------------------------------------------------------------------------------'); + console.log( 'AssetLoaderTest.onTextureSizeError' , assetLoader.baseDependency._iLoader.url , event ); + console.log( '--------------------------------------------------------------------------------'); + } + public onAssetComplete(event:AssetEvent):void + { + var assetLoader:AssetLoader = event.target; + console.log( '--------------------------------------------------------------------------------'); + console.log( 'AssetLoaderTest.onAssetComplete', assetLoader.baseDependency._iLoader.url , event ); + console.log( '--------------------------------------------------------------------------------'); + } } + +/** + * ImageParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into + * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without + * exception cases. + */ +class JSONTextureParser extends ParserBase +{ + private STATE_PARSE_DATA:number = 0; + private STATE_LOAD_IMAGES:number = 1; + private STATE_COMPLETE:number = 2; + + private _state:number = -1; + private _startedParsing:boolean; + private _doneParsing:boolean; + private _dependencyCount:number = 0; + private _loadedTextures:Array; + + /** + * Creates a new ImageParser object. + * @param uri The url or id of the data or file to be parsed. + * @param extra The holder for extra contextual data that the parser might need. + */ + constructor() + { + super(ParserDataFormat.PLAIN_TEXT); + + this._loadedTextures = new Array(); + this._state = this.STATE_PARSE_DATA; + } + + /** + * Indicates whether or not a given file extension is supported by the parser. + * @param extension The file extension of a potential file to be parsed. + * @return Whether or not the given file type is supported. + */ + + public static supportsType(extension : string) : boolean + { + extension = extension.toLowerCase(); + return extension == "json"; + } + + /** + * Tests whether a data block can be parsed by the parser. + * @param data The data block to potentially be parsed. + * @return Whether or not the given data is supported. + */ + public static supportsData(data : any) : boolean + { + try { + var obj = JSON.parse(data); + + if (obj) + return true; + + return false; + } catch ( e ) { + return false; + } + + return false; + } + + /** + * @inheritDoc + */ + public _iResolveDependency(resourceDependency:ResourceDependency) + { + var resource : Texture2DBase = resourceDependency.assets[0]; + + this._pFinalizeAsset( resource, resourceDependency._iLoader.url); + + this._loadedTextures.push( resource ); + + //console.log( 'JSONTextureParser._iResolveDependency' , resourceDependency ); + //console.log( 'JSONTextureParser._iResolveDependency resource: ' , resource ); + + this._dependencyCount--; + + if ( this._dependencyCount == 0) + this._state = this.STATE_COMPLETE; + } + + /** + * @inheritDoc + */ + public _iResolveDependencyFailure(resourceDependency:ResourceDependency) + { + this._dependencyCount--; + + if ( this._dependencyCount == 0) + this._state = this.STATE_COMPLETE; + } + + private parseJson( ) : void + { + if (JSONTextureParser.supportsData(this.data)) { + try { + var json:any = JSON.parse(this.data); + var data:Array = > json.data; + + var rec:any; + var rq:URLRequest; + + for (var c : number = 0; c < data.length; c ++) { + rec = data[c]; + + var uri:string = rec.image; + var id:string = rec.id; + + rq = new URLRequest(uri); + + this._pAddDependency('JSON_ID_' + id, rq, false, null, true); + } + + this._dependencyCount = data.length; + this._state = this.STATE_LOAD_IMAGES; + + this._pPauseAndRetrieveDependencies(); + + } catch (e) { + this._state = this.STATE_COMPLETE; + } + } + } + /** + * @inheritDoc + */ + public _pProceedParsing() : boolean + { + console.log( 'JSONTextureParser._pProceedParsing' , this._state ); + + switch (this._state) { + case this.STATE_PARSE_DATA: + this.parseJson(); + return ParserBase.MORE_TO_PARSE; + break; + case this.STATE_LOAD_IMAGES: + break; + case this.STATE_COMPLETE: + return ParserBase.PARSING_DONE; + break; + } + + return ParserBase.MORE_TO_PARSE; + } +} \ No newline at end of file diff --git a/tests/net/IMGLoaderTest.js b/tests/net/IMGLoaderTest.js new file mode 100755 index 00000000..862f1557 --- /dev/null +++ b/tests/net/IMGLoaderTest.js @@ -0,0 +1,110 @@ +var URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var Event = require("awayjs-core/lib/events/Event"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); + +var IMGLoaderTest = (function () { + function IMGLoaderTest() { + var _this = this; + //----------------------------------------------------------------------------------------------- + // load a png + //----------------------------------------------------------------------------------------------- + var pngURLrq = new URLRequest('assets/2.png'); + + this.pngLoader = new URLLoader(); + this.pngLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.pngLoader.addEventListener(Event.COMPLETE, function (event) { + return _this.pngLoaderComplete(event); + }); + this.pngLoader.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.pngLoader.load(pngURLrq); + + //----------------------------------------------------------------------------------------------- + // Load a jpg + //----------------------------------------------------------------------------------------------- + var jpgURLrq = new URLRequest('assets/1.jpg'); + + this.jpgLoader = new URLLoader(); + this.jpgLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.jpgLoader.addEventListener(Event.COMPLETE, function (event) { + return _this.jpgLoaderComplete(event); + }); + this.jpgLoader.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.jpgLoader.load(jpgURLrq); + + //----------------------------------------------------------------------------------------------- + // Load file of wrong format + //----------------------------------------------------------------------------------------------- + var notURLrq = new URLRequest('assets/data.txt'); + + this.noAnImageLoader = new URLLoader(); + this.noAnImageLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.noAnImageLoader.addEventListener(Event.COMPLETE, function (event) { + return _this.noAnImageLoaderComplete(event); + }); + this.noAnImageLoader.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.noAnImageLoader.load(notURLrq); + + //----------------------------------------------------------------------------------------------- + // Load image that does not exist + //----------------------------------------------------------------------------------------------- + var wrongURLrq = new URLRequest('assets/iDontExist.png'); + + this.wrongURLLoader = new URLLoader(); + this.wrongURLLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.wrongURLLoader.addEventListener(Event.COMPLETE, function (event) { + return _this.wrongURLLoaderComplete(event); + }); + this.wrongURLLoader.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.wrongURLLoader.load(wrongURLrq); + } + IMGLoaderTest.prototype.pngLoaderComplete = function (e) { + this.logSuccessfullLoad(e); + + var imgLoader = e.target; + document.body.appendChild(ParserUtils.blobToImage(imgLoader.data)); + }; + + IMGLoaderTest.prototype.jpgLoaderComplete = function (e) { + this.logSuccessfullLoad(e); + + var imgLoader = e.target; + document.body.appendChild(ParserUtils.blobToImage(imgLoader.data)); + }; + + IMGLoaderTest.prototype.noAnImageLoaderComplete = function (e) { + this.logSuccessfullLoad(e); + }; + + IMGLoaderTest.prototype.wrongURLLoaderComplete = function (e) { + this.logSuccessfullLoad(e); + }; + + IMGLoaderTest.prototype.logSuccessfullLoad = function (event) { + var imgLoader = event.target; + console.log('IMG.Event.Complete', imgLoader.url); + }; + + IMGLoaderTest.prototype.ioError = function (event) { + var imgLoader = event.target; + console.log('ioError', imgLoader.url); + }; + + IMGLoaderTest.prototype.abortError = function (event) { + var imgLoader = event.target; + console.log('abortError', imgLoader.url); + }; + return IMGLoaderTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5ldC9JTUdMb2FkZXJUZXN0LnRzIl0sIm5hbWVzIjpbIklNR0xvYWRlclRlc3QiLCJJTUdMb2FkZXJUZXN0LmNvbnN0cnVjdG9yIiwiSU1HTG9hZGVyVGVzdC5wbmdMb2FkZXJDb21wbGV0ZSIsIklNR0xvYWRlclRlc3QuanBnTG9hZGVyQ29tcGxldGUiLCJJTUdMb2FkZXJUZXN0Lm5vQW5JbWFnZUxvYWRlckNvbXBsZXRlIiwiSU1HTG9hZGVyVGVzdC53cm9uZ1VSTExvYWRlckNvbXBsZXRlIiwiSU1HTG9hZGVyVGVzdC5sb2dTdWNjZXNzZnVsbExvYWQiLCJJTUdMb2FkZXJUZXN0LmlvRXJyb3IiLCJJTUdMb2FkZXJUZXN0LmFib3J0RXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBLDZEQUFtRTtBQUNuRSxpRkFBcUY7QUFDckYsK0RBQXFFO0FBQ3JFLG1EQUEwRDtBQUMxRCxpRUFBdUU7QUFDdkUsZ0VBQXNFOztBQUV0RTtJQVFDQTtRQUFBQyxpQkFrRENBO1FBL0NBQSxpR0FBaUdBO1FBQ2pHQSxhQUFhQTtRQUNiQSxpR0FBaUdBO1FBRWpHQSxJQUFJQSxRQUFRQSxHQUFjQSxJQUFJQSxVQUFVQSxDQUFFQSxjQUFjQSxDQUFDQTs7UUFFekRBLElBQUlBLENBQUNBLFNBQVNBLEdBQVlBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBO1FBQ3pDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxVQUFVQSxHQUFHQSxtQkFBbUJBLENBQUNBLElBQUlBO1FBQ3BEQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxnQkFBZ0JBLENBQUVBLEtBQUtBLENBQUNBLFFBQVFBLEVBQUdBLFVBQUVBLEtBQWFBO21CQUFLQSxLQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLEtBQUtBLENBQUNBO1FBQTdCQSxDQUE2QkEsQ0FBRUE7UUFDckdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLGdCQUFnQkEsQ0FBRUEsWUFBWUEsQ0FBQ0EsUUFBUUEsRUFBR0EsVUFBRUEsS0FBb0JBO21CQUFN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QUVBLFNBQVNBLEVBQUdBLFNBQVNBLENBQUNBLEdBQUdBLENBQUVBO0lBRXpDQSxDQUFDQTs7SUFFRFAscUNBQUFBLFVBQXFCQSxLQUFhQTtRQUdqQ1EsSUFBSUEsU0FBU0EsR0FBMkJBLEtBQUtBLENBQUNBLE1BQU1BO1FBQ3BEQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxZQUFZQSxFQUFHQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFFQTtJQUU1Q0EsQ0FBQ0E7SUFFRlIscUJBQUNBO0FBQURBLENBQUNBLElBQUE7QUFBQSIsImZpbGUiOiJuZXQvSU1HTG9hZGVyVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBVUkxMb2FkZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMTG9hZGVyXCIpO1xuaW1wb3J0IFVSTExvYWRlckRhdGFGb3JtYXRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxMb2FkZXJEYXRhRm9ybWF0XCIpO1xuaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMUmVxdWVzdFwiKTtcbmltcG9ydCBFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcbmltcG9ydCBJT0Vycm9yRXZlbnRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0lPRXJyb3JFdmVudFwiKTtcbmltcG9ydCBQYXJzZXJVdGlsc1x0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlclV0aWxzXCIpO1xuXG5jbGFzcyBJTUdMb2FkZXJUZXN0XG57XG5cblx0cHJpdmF0ZSBwbmdMb2FkZXIgICAgICAgOiBVUkxMb2FkZXI7XG5cdHByaXZhdGUganBnTG9hZGVyICAgICAgIDogVVJMTG9hZGVyO1xuXHRwcml2YXRlIG5vQW5JbWFnZUxvYWRlciA6IFVSTExvYWRlcjtcblx0cHJpdmF0ZSB3cm9uZ1VSTExvYWRlciAgOiBVUkxMb2FkZXI7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gbG9hZCBhIHBuZ1xuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdHZhciBwbmdVUkxycSAgICAgICAgICAgID0gbmV3IFVSTFJlcXVlc3QoICdhc3NldHMvMi5wbmcnKTtcblxuXHRcdHRoaXMucG5nTG9hZGVyICAgICAgICAgID0gbmV3IFVSTExvYWRlcigpO1xuXHRcdHRoaXMucG5nTG9hZGVyLmRhdGFGb3JtYXQgPSBVUkxMb2FkZXJEYXRhRm9ybWF0LkJMT0I7XG5cdFx0dGhpcy5wbmdMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciggRXZlbnQuQ09NUExFVEUgLCAoIGV2ZW50IDogRXZlbnQpID0+IHRoaXMucG5nTG9hZGVyQ29tcGxldGUoZXZlbnQpICk7XG5cdFx0dGhpcy5wbmdMb2FkZXIuYWRkRXZlbnRMaXN0ZW5lciggSU9FcnJvckV2ZW50LklPX0VSUk9SICwgKCBldmVudCA6IElPRXJyb3JFdmVudCApID0+IHRoaXMuaW9FcnJvcihldmVudCkgKTtcblx0XHR0aGlzLnBuZ0xvYWRlci5sb2FkKCBwbmdVUkxycSApO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIExvYWQgYSBqcGdcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR2YXIganBnVVJMcnEgICAgICAgICAgICA9IG5ldyBVUkxSZXF1ZXN0KCAnYXNzZXRzLzEuanBnJyk7XG5cblx0XHR0aGlzLmpwZ0xvYWRlciAgICAgICAgICA9IG5ldyBVUkxMb2FkZXIoKTtcblx0XHR0aGlzLmpwZ0xvYWRlci5kYXRhRm9ybWF0ID0gVVJMTG9hZGVyRGF0YUZvcm1hdC5CTE9CO1xuXHRcdHRoaXMuanBnTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoIEV2ZW50LkNPTVBMRVRFICwgKCBldmVudCA6IEV2ZW50KSA9PiB0aGlzLmpwZ0xvYWRlckNvbXBsZXRlKGV2ZW50KSApO1xuXHRcdHRoaXMuanBnTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoIElPRXJyb3JFdmVudC5JT19FUlJPUiAsICggZXZlbnQgOiBJT0Vycm9yRXZlbnQgKSA9PiB0aGlzLmlvRXJyb3IoZXZlbnQpICk7XG5cdFx0dGhpcy5qcGdMb2FkZXIubG9hZCgganBnVVJMcnEgKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQvLyBMb2FkIGZpbGUgb2Ygd3JvbmcgZm9ybWF0XG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0dmFyIG5vdFVSTHJxICAgICAgICAgICAgPSBuZXcgVVJMUmVxdWVzdCggJ2Fzc2V0cy9kYXRhLnR4dCcpO1xuXG5cdFx0dGhpcy5ub0FuSW1hZ2VMb2FkZXIgICAgPSBuZXcgVVJMTG9hZGVyKCk7XG5cdFx0dGhpcy5ub0FuSW1hZ2VMb2FkZXIuZGF0YUZvcm1hdCA9IFVSTExvYWRlckRhdGFGb3JtYXQuQkxPQjtcblx0XHR0aGlzLm5vQW5JbWFnZUxvYWRlci5hZGRFdmVudExpc3RlbmVyKCBFdmVudC5DT01QTEVURSAsICggZXZlbnQgOiBFdmVudCkgPT4gdGhpcy5ub0FuSW1hZ2VMb2FkZXJDb21wbGV0ZShldmVudCkgKTtcblx0XHR0aGlzLm5vQW5JbWFnZUxvYWRlci5hZGRFdmVudExpc3RlbmVyKCBJT0Vycm9yRXZlbnQuSU9fRVJST1IgLCAoIGV2ZW50IDogSU9FcnJvckV2ZW50ICkgPT4gdGhpcy5pb0Vycm9yKGV2ZW50KSApO1xuXHRcdHRoaXMubm9BbkltYWdlTG9hZGVyLmxvYWQoIG5vdFVSTHJxIClcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQvLyBMb2FkIGltYWdlIHRoYXQgZG9lcyBub3QgZXhpc3Rcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR2YXIgd3JvbmdVUkxycSAgICAgICAgICAgID0gbmV3IFVSTFJlcXVlc3QoICdhc3NldHMvaURvbnRFeGlzdC5wbmcnKTtcblxuXHRcdHRoaXMud3JvbmdVUkxMb2FkZXIgICAgID0gbmV3IFVSTExvYWRlcigpO1xuXHRcdHRoaXMud3JvbmdVUkxMb2FkZXIuZGF0YUZvcm1hdCA9IFVSTExvYWRlckRhdGFGb3JtYXQuQkxPQjtcblx0XHR0aGlzLndyb25nVVJMTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoIEV2ZW50LkNPTVBMRVRFICwgKCBldmVudCA6IEV2ZW50KSA9PiB0aGlzLndyb25nVVJMTG9hZGVyQ29tcGxldGUoZXZlbnQpICk7XG5cdFx0dGhpcy53cm9uZ1VSTExvYWRlci5hZGRFdmVudExpc3RlbmVyKCBJT0Vycm9yRXZlbnQuSU9fRVJST1IgLCAoIGV2ZW50IDogSU9FcnJvckV2ZW50ICkgPT4gdGhpcy5pb0Vycm9yKGV2ZW50KSApO1xuXHRcdHRoaXMud3JvbmdVUkxMb2FkZXIubG9hZCggd3JvbmdVUkxycSApO1xuXHR9XG5cblx0cHJpdmF0ZSBwbmdMb2FkZXJDb21wbGV0ZSAoIGUgOiBFdmVudCApIDogdm9pZFxuXHR7XG5cblx0XHR0aGlzLmxvZ1N1Y2Nlc3NmdWxsTG9hZCggZSApO1xuXG5cblx0XHR2YXIgaW1nTG9hZGVyIDogVVJMTG9hZGVyID0gPFVSTExvYWRlcj4gZS50YXJnZXQ7XG5cdFx0ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggUGFyc2VyVXRpbHMuYmxvYlRvSW1hZ2UoaW1nTG9hZGVyLmRhdGEpICk7XG5cblx0fVxuXG5cdHByaXZhdGUganBnTG9hZGVyQ29tcGxldGUgKCBlIDogRXZlbnQgKSA6IHZvaWRcblx0e1xuXG5cdFx0dGhpcy5sb2dTdWNjZXNzZnVsbExvYWQoIGUgKTtcblxuXHRcdHZhciBpbWdMb2FkZXIgOiBVUkxMb2FkZXIgPSA8VVJMTG9hZGVyPiBlLnRhcmdldDtcblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCBQYXJzZXJVdGlscy5ibG9iVG9JbWFnZShpbWdMb2FkZXIuZGF0YSkgKTtcblxuXHR9XG5cblx0cHJpdmF0ZSBub0FuSW1hZ2VMb2FkZXJDb21wbGV0ZSAoIGUgOiBFdmVudCApIDogdm9pZFxuXHR7XG5cblx0XHR0aGlzLmxvZ1N1Y2Nlc3NmdWxsTG9hZCggZSApO1xuXG5cdH1cblxuXHRwcml2YXRlIHdyb25nVVJMTG9hZGVyQ29tcGxldGUgKCBlIDogRXZlbnQgKSA6IHZvaWRcblx0e1xuXG5cdFx0dGhpcy5sb2dTdWNjZXNzZnVsbExvYWQoIGUgKTtcblxuXHR9XG5cblx0cHJpdmF0ZSBsb2dTdWNjZXNzZnVsbExvYWQoIGV2ZW50IDogRXZlbnQpIDogdm9pZFxuXHR7XG5cblx0XHR2YXIgaW1nTG9hZGVyIDogVVJMTG9hZGVyID0gPFVSTExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnNvbGUubG9nKCAnSU1HLkV2ZW50LkNvbXBsZXRlJyAsIGltZ0xvYWRlci51cmwgKTtcblxuXHR9XG5cblx0cHJpdmF0ZSBpb0Vycm9yICggZXZlbnQgOiBJT0Vycm9yRXZlbnQgKSA6IHZvaWRcblx0e1xuXG5cdFx0dmFyIGltZ0xvYWRlciA6IFVSTExvYWRlciA9IDxVUkxMb2FkZXI+IGV2ZW50LnRhcmdldDtcblx0XHRjb25zb2xlLmxvZyggJ2lvRXJyb3InICwgaW1nTG9hZGVyLnVybCApO1xuXG5cdH1cblxuXHRwcml2YXRlIGFib3J0RXJyb3IgKCBldmVudCA6IEV2ZW50ICkgOiB2b2lkXG5cdHtcblxuXHRcdHZhciBpbWdMb2FkZXIgOiBVUkxMb2FkZXIgPSA8VVJMTG9hZGVyPiBldmVudC50YXJnZXQ7XG5cdFx0Y29uc29sZS5sb2coICdhYm9ydEVycm9yJyAsIGltZ0xvYWRlci51cmwgKTtcblxuXHR9XG5cbn0iXX0= \ No newline at end of file diff --git a/tests/net/IMGLoaderTest.ts b/tests/net/IMGLoaderTest.ts index 05f26560..38d11fdd 100644 --- a/tests/net/IMGLoaderTest.ts +++ b/tests/net/IMGLoaderTest.ts @@ -1,128 +1,127 @@ -/// - -module tests.net +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import Event = require("awayjs-core/lib/events/Event"); +import IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +import ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); + +class IMGLoaderTest { - import Delegate = away.utils.Delegate; - - export class URLLoaderTest - { - - private pngLoader : away.net.URLLoader; - private jpgLoader : away.net.URLLoader; - private noAnImageLoader : away.net.URLLoader; - private wrongURLLoader : away.net.URLLoader; - constructor() - { + private pngLoader : URLLoader; + private jpgLoader : URLLoader; + private noAnImageLoader : URLLoader; + private wrongURLLoader : URLLoader; - //----------------------------------------------------------------------------------------------- - // load a png - //----------------------------------------------------------------------------------------------- + constructor() + { - var pngURLrq = new away.net.URLRequest( 'assets/2.png'); + //----------------------------------------------------------------------------------------------- + // load a png + //----------------------------------------------------------------------------------------------- - this.pngLoader = new away.net.URLLoader(); - this.pngLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.pngLoader.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.pngLoaderComplete) ); - this.pngLoader.addEventListener( away.events.IOErrorEvent.IO_ERROR , Delegate.create(this, this.ioError) ); - this.pngLoader.load( pngURLrq ); + var pngURLrq = new URLRequest( 'assets/2.png'); - //----------------------------------------------------------------------------------------------- - // Load a jpg - //----------------------------------------------------------------------------------------------- + this.pngLoader = new URLLoader(); + this.pngLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.pngLoader.addEventListener( Event.COMPLETE , ( event : Event) => this.pngLoaderComplete(event) ); + this.pngLoader.addEventListener( IOErrorEvent.IO_ERROR , ( event : IOErrorEvent ) => this.ioError(event) ); + this.pngLoader.load( pngURLrq ); - var jpgURLrq = new away.net.URLRequest( 'assets/1.jpg'); + //----------------------------------------------------------------------------------------------- + // Load a jpg + //----------------------------------------------------------------------------------------------- - this.jpgLoader = new away.net.URLLoader(); - this.jpgLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.jpgLoader.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.jpgLoaderComplete) ); - this.jpgLoader.addEventListener( away.events.IOErrorEvent.IO_ERROR , Delegate.create(this, this.ioError) ); - this.jpgLoader.load( jpgURLrq ); + var jpgURLrq = new URLRequest( 'assets/1.jpg'); - //----------------------------------------------------------------------------------------------- - // Load file of wrong format - //----------------------------------------------------------------------------------------------- + this.jpgLoader = new URLLoader(); + this.jpgLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.jpgLoader.addEventListener( Event.COMPLETE , ( event : Event) => this.jpgLoaderComplete(event) ); + this.jpgLoader.addEventListener( IOErrorEvent.IO_ERROR , ( event : IOErrorEvent ) => this.ioError(event) ); + this.jpgLoader.load( jpgURLrq ); - var notURLrq = new away.net.URLRequest( 'assets/data.txt'); + //----------------------------------------------------------------------------------------------- + // Load file of wrong format + //----------------------------------------------------------------------------------------------- - this.noAnImageLoader = new away.net.URLLoader(); - this.noAnImageLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.noAnImageLoader.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.noAnImageLoaderComplete) ); - this.noAnImageLoader.addEventListener( away.events.IOErrorEvent.IO_ERROR , Delegate.create(this, this.ioError) ); - this.noAnImageLoader.load( notURLrq ) + var notURLrq = new URLRequest( 'assets/data.txt'); - //----------------------------------------------------------------------------------------------- - // Load image that does not exist - //----------------------------------------------------------------------------------------------- + this.noAnImageLoader = new URLLoader(); + this.noAnImageLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.noAnImageLoader.addEventListener( Event.COMPLETE , ( event : Event) => this.noAnImageLoaderComplete(event) ); + this.noAnImageLoader.addEventListener( IOErrorEvent.IO_ERROR , ( event : IOErrorEvent ) => this.ioError(event) ); + this.noAnImageLoader.load( notURLrq ) - var wrongURLrq = new away.net.URLRequest( 'assets/iDontExist.png'); + //----------------------------------------------------------------------------------------------- + // Load image that does not exist + //----------------------------------------------------------------------------------------------- - this.wrongURLLoader = new away.net.URLLoader(); - this.wrongURLLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.wrongURLLoader.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.wrongURLLoaderComplete) ); - this.wrongURLLoader.addEventListener( away.events.IOErrorEvent.IO_ERROR , Delegate.create(this, this.ioError) ); - this.wrongURLLoader.load( wrongURLrq ); - } + var wrongURLrq = new URLRequest( 'assets/iDontExist.png'); - private pngLoaderComplete ( e : away.events.Event ) : void - { + this.wrongURLLoader = new URLLoader(); + this.wrongURLLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.wrongURLLoader.addEventListener( Event.COMPLETE , ( event : Event) => this.wrongURLLoaderComplete(event) ); + this.wrongURLLoader.addEventListener( IOErrorEvent.IO_ERROR , ( event : IOErrorEvent ) => this.ioError(event) ); + this.wrongURLLoader.load( wrongURLrq ); + } - this.logSuccessfullLoad( e ); + private pngLoaderComplete ( e : Event ) : void + { + this.logSuccessfullLoad( e ); - var imgLoader : away.net.URLLoader = e.target; - document.body.appendChild( away.parsers.ParserUtils.blobToImage(imgLoader.data) ); - } + var imgLoader : URLLoader = e.target; + document.body.appendChild( ParserUtils.blobToImage(imgLoader.data) ); - private jpgLoaderComplete ( e : away.events.Event ) : void - { + } - this.logSuccessfullLoad( e ); + private jpgLoaderComplete ( e : Event ) : void + { - var imgLoader : away.net.URLLoader = e.target; - document.body.appendChild( away.parsers.ParserUtils.blobToImage(imgLoader.data) ); + this.logSuccessfullLoad( e ); - } + var imgLoader : URLLoader = e.target; + document.body.appendChild( ParserUtils.blobToImage(imgLoader.data) ); - private noAnImageLoaderComplete ( e : away.events.Event ) : void - { + } - this.logSuccessfullLoad( e ); + private noAnImageLoaderComplete ( e : Event ) : void + { - } + this.logSuccessfullLoad( e ); - private wrongURLLoaderComplete ( e : away.events.Event ) : void - { + } - this.logSuccessfullLoad( e ); + private wrongURLLoaderComplete ( e : Event ) : void + { - } + this.logSuccessfullLoad( e ); - private logSuccessfullLoad( e : away.events.Event) : void - { + } - var imgLoader : away.net.URLLoader = e.target; - console.log( 'IMG.Event.Complete' , imgLoader.url ); + private logSuccessfullLoad( event : Event) : void + { - } + var imgLoader : URLLoader = event.target; + console.log( 'IMG.Event.Complete' , imgLoader.url ); - private ioError ( e : away.events.IOErrorEvent ) : void - { + } - var imgLoader : away.net.URLLoader = e.target; - console.log( 'ioError' , imgLoader.url ); + private ioError ( event : IOErrorEvent ) : void + { - } + var imgLoader : URLLoader = event.target; + console.log( 'ioError' , imgLoader.url ); - private abortError ( e : away.events.Event ) : void - { + } - var imgLoader : away.net.URLLoader = e.target; - console.log( 'abortError' , imgLoader.url ); + private abortError ( event : Event ) : void + { - } + var imgLoader : URLLoader = event.target; + console.log( 'abortError' , imgLoader.url ); + } - } -} +} \ No newline at end of file diff --git a/tests/net/URLLoaderTests.js b/tests/net/URLLoaderTests.js new file mode 100755 index 00000000..e74fa044 --- /dev/null +++ b/tests/net/URLLoaderTests.js @@ -0,0 +1,212 @@ +var URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var URLRequestMethod = require("awayjs-core/lib/core/net/URLRequestMethod"); +var URLVariables = require("awayjs-core/lib/core/net/URLVariables"); +var Event = require("awayjs-core/lib/events/Event"); +var IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +var HTTPStatusEvent = require("awayjs-core/lib/events/HTTPStatusEvent"); + +/** +* +*/ +var LoaderTest = (function () { + function LoaderTest() { + var _this = this; + console.log('start'); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // POST URL Variables to PHP script + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + this.urlLoaderPostURLVars = new URLLoader(); + this.urlLoaderPostURLVars.dataFormat = URLLoaderDataFormat.VARIABLES; + + var urlStr = 'fname=karim&lname=' + Math.floor(Math.random() * 100); + var urlVars = new URLVariables(urlStr); + + var req = new URLRequest('assets/saveData.php'); + req.method = URLRequestMethod.POST; + req.data = urlVars; + + this.urlLoaderPostURLVars.addEventListener(Event.COMPLETE, function (event) { + return _this.postURLTestComplete(event); + }); + this.urlLoaderPostURLVars.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.urlLoaderPostURLVars.load(req); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // GET CSV File + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + var csrReq = new URLRequest('assets/airports.csv'); + + this.urlLoaderGetCSV = new URLLoader(); + this.urlLoaderGetCSV.dataFormat = URLLoaderDataFormat.TEXT; + this.urlLoaderGetCSV.addEventListener(Event.COMPLETE, function (event) { + return _this.getCsvComplete(event); + }); + this.urlLoaderGetCSV.addEventListener(Event.OPEN, function (event) { + return _this.getCsvOpen(event); + }); + this.urlLoaderGetCSV.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.urlLoaderGetCSV.load(csrReq); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // ERROR test - load a non-existing object + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + var errorReq = new URLRequest('assets/generatingError'); + + this.urlLoaderErrorTest = new URLLoader(); + this.urlLoaderErrorTest.dataFormat = URLLoaderDataFormat.TEXT; + this.urlLoaderErrorTest.addEventListener(Event.COMPLETE, function (event) { + return _this.errorComplete(event); + }); + this.urlLoaderErrorTest.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.urlLoaderErrorTest.addEventListener(HTTPStatusEvent.HTTP_STATUS, function (event) { + return _this.httpStatusChange(event); + }); + this.urlLoaderErrorTest.load(errorReq); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // GET URL Vars - get URL variables + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + var csrReq = new URLRequest('assets/getUrlVars.php'); + + this.urlLoaderGetURLVars = new URLLoader(); + this.urlLoaderGetURLVars.dataFormat = URLLoaderDataFormat.VARIABLES; + this.urlLoaderGetURLVars.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.urlLoaderGetURLVars.addEventListener(Event.COMPLETE, function (event) { + return _this.getURLVarsComplete(event); + }); + this.urlLoaderGetURLVars.load(csrReq); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // LOAD Binary file + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + var binReq = new URLRequest('assets/suzanne.awd'); + + this.urlLoaderBinary = new URLLoader(); + this.urlLoaderBinary.dataFormat = URLLoaderDataFormat.BINARY; + this.urlLoaderBinary.addEventListener(IOErrorEvent.IO_ERROR, function (event) { + return _this.ioError(event); + }); + this.urlLoaderBinary.addEventListener(Event.COMPLETE, function (event) { + return _this.binFileLoaded(event); + }); + this.urlLoaderBinary.load(binReq); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // LOAD Blob file + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + var blobReq = new URLRequest('assets/2.png'); + + this.urlLoaderBlob = new URLLoader(); + this.urlLoaderBlob.dataFormat = URLLoaderDataFormat.BLOB; + this.urlLoaderBlob.addEventListener(Event.COMPLETE, function (event) { + return _this.blobFileLoaded(event); + }); + this.urlLoaderBlob.load(blobReq); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // ARRAY_BUFFER Test + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + var arrBReq = new URLRequest('assets/1.jpg'); + + this.urlLoaderArrb = new URLLoader(); + this.urlLoaderArrb.dataFormat = URLLoaderDataFormat.ARRAY_BUFFER; + this.urlLoaderArrb.addEventListener(Event.COMPLETE, function (event) { + return _this.arrayBufferLoaded(event); + }); + this.urlLoaderArrb.load(arrBReq); + } + LoaderTest.prototype.arrayBufferLoaded = function (event) { + var arrayBuffer = this.urlLoaderArrb.data; + var byteArray = new Uint8Array(arrayBuffer); + + console.log('LoaderTest.arrayBufferLoaded', byteArray[1]); + + for (var i = 0; i < byteArray.byteLength; i++) { + //console.log( byteArray[i] ); + } + }; + + LoaderTest.prototype.blobFileLoaded = function (event) { + var blob = new Blob([this.urlLoaderBlob.data], { type: 'image/png' }); + var img = document.createElement('img'); + img.src = this.createObjectURL(blob); //window['URL']['createObjectURL'](blob); + img.onload = function (e) { + window['URL']['revokeObjectURL'](img.src); // Clean up after yourself. + }; + + console.log('LoaderTest.blobFileLoaded', blob); + + document.body.appendChild(img); + }; + + LoaderTest.prototype.createObjectURL = function (fileBlob) { + // For some reason TypeScript has "window.URL.createObjectURL" in it's dictionary - + // but window.URL causes an error + // cannot make my own .d.ts file either ( results in duplicate definition error ) + // This HACK gets it to work: window['URL']['createObjectURL'] + if (window['URL']) { + if (window['URL']['createObjectURL']) { + return window['URL']['createObjectURL'](fileBlob); + } + } else { + if (window['webkitURL']) { + return window['webkitURL']['createObjectURL'](fileBlob); + } + } + + return null; + }; + + LoaderTest.prototype.binFileLoaded = function (event) { + var loader = event.target; + console.log('LoaderTest.binFileLoaded', loader.data.length); + }; + + LoaderTest.prototype.getURLVarsComplete = function (event) { + var loader = event.target; + console.log('LoaderTest.getURLVarsComplete', loader.data); + }; + + LoaderTest.prototype.httpStatusChange = function (event) { + console.log('LoaderTest.httpStatusChange', event.status); + }; + + LoaderTest.prototype.ioError = function (event) { + var loader = event.target; + console.log('LoaderTest.ioError', loader.url); + }; + + LoaderTest.prototype.errorComplete = function (event) { + var loader = event.target; + console.log('Loader.errorComplete'); //, loader.data ); + }; + + LoaderTest.prototype.postURLTestComplete = function (event) { + var loader = event.target; + console.log('LoaderTest.postURLTestComplete', loader.data); + }; + + LoaderTest.prototype.getCsvComplete = function (event) { + var loader = event.target; + console.log('LoaderTest.getCsvComplete'); //, loader.data ); + }; + + LoaderTest.prototype.getCsvOpen = function (event) { + var loader = event.target; + console.log('LoaderTest.getCsvOpen'); + }; + return LoaderTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5ldC9VUkxMb2FkZXJUZXN0cy50cyJdLCJuYW1lcyI6WyJMb2FkZXJUZXN0IiwiTG9hZGVyVGVzdC5jb25zdHJ1Y3RvciIsIkxvYWRlclRlc3QuYXJyYXlCdWZmZXJMb2FkZWQiLCJMb2FkZXJUZXN0LmJsb2JGaWxlTG9hZGVkIiwiTG9hZGVyVGVzdC5jcmVhdGVPYmplY3RVUkwiLCJMb2FkZXJUZXN0LmJpbkZpbGVMb2FkZWQiLCJMb2FkZXJUZXN0LmdldFVSTFZhcnNDb21wbGV0ZSIsIkxvYWRlclRlc3QuaHR0cFN0YXR1c0NoYW5nZSIsIkxvYWRlclRlc3QuaW9FcnJvciIsIkxvYWRlclRlc3QuZXJyb3JDb21wbGV0ZSIsIkxvYWRlclRlc3QucG9zdFVSTFRlc3RDb21wbGV0ZSIsIkxvYWRlclRlc3QuZ2V0Q3N2Q29tcGxldGUiLCJMb2FkZXJUZXN0LmdldENzdk9wZW4iXSwibWFwcGluZ3MiOiJBQUFBLDZEQUFtRTtBQUNuRSxpRkFBcUY7QUFDckYsK0RBQXFFO0FBQ3JFLDJFQUFnRjtBQUNoRixtRUFBeUU7QUFDekUsbURBQTBEO0FBQzFELGlFQUF1RTtBQUN2RSx1RUFBNEU7O0FBRTVFOztFQUVHO0FBQ0g7SUFXQ0E7UUFBQUMsaUJBOEZDQTtRQTNGQUEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsT0FBT0EsQ0FBQ0E7O1FBRXJCQSwySkFBMkpBO1FBQzNKQSxtQ0FBbUNBO1FBQ25DQSwySkFBMkpBO1FBRTNKQSxJQUFJQSxDQUFDQSxvQkFBb0JBLEdBQUdBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBO1FBQzNDQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLFVBQVVBLEdBQUdBLG1CQUFtQkEsQ0FBQ0EsU0FBU0E7O1FBRXBFQSxJQUFJQSxNQUFNQSxHQUFVQSxvQkFBb0JBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUVBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUVBO1FBQzVFQSxJQUFJQSxPQUFP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LEdBQUdBLENBQUVBLDJCQUEyQkEsQ0FBRUEsRUFBQ0Esa0JBQWtCQTtJQUM5REEsQ0FBQ0E7O0lBRURYLGtDQUFBQSxVQUFvQkEsS0FBS0E7UUFFeEJZLElBQUlBLE1BQU1BLEdBQXlCQSxLQUFLQSxDQUFDQSxNQUFNQTtRQUMvQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsdUJBQXVCQSxDQUFFQTtJQUN2Q0EsQ0FBQ0E7SUFDRlosa0JBQUNBO0FBQURBLENBQUNBLElBQUE7QUFBQSIsImZpbGUiOiJuZXQvVVJMTG9hZGVyVGVzdHMuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvYmJhdGVtYW4vV2Vic3Rvcm1Qcm9qZWN0cy9hd2F5anMtY29yZS8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVVJMTG9hZGVyXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTExvYWRlclwiKTtcbmltcG9ydCBVUkxMb2FkZXJEYXRhRm9ybWF0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMTG9hZGVyRGF0YUZvcm1hdFwiKTtcbmltcG9ydCBVUkxSZXF1ZXN0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTFJlcXVlc3RcIik7XG5pbXBvcnQgVVJMUmVxdWVzdE1ldGhvZFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMUmVxdWVzdE1ldGhvZFwiKTtcbmltcG9ydCBVUkxWYXJpYWJsZXNcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMVmFyaWFibGVzXCIpO1xuaW1wb3J0IEV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuaW1wb3J0IElPRXJyb3JFdmVudFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9ldmVudHMvSU9FcnJvckV2ZW50XCIpO1xuaW1wb3J0IEhUVFBTdGF0dXNFdmVudFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0hUVFBTdGF0dXNFdmVudFwiKTtcblxuLyoqXG4gKiBcbiAqL1xuY2xhc3MgTG9hZGVyVGVzdFxue1xuXG5cdHByaXZhdGUgdXJsTG9hZGVyUG9zdFVSTFZhcnM6VVJMTG9hZGVyO1xuXHRwcml2YXRlIHVybExvYWRlckdldENTVjpVUkxMb2FkZXI7XG5cdHByaXZhdGUgdXJsTG9hZGVyRXJyb3JUZXN0OlVSTExvYWRlcjtcblx0cHJpdmF0ZSB1cmxMb2FkZXJHZXRVUkxWYXJzOlVSTExvYWRlcjtcblx0cHJpdmF0ZSB1cmxMb2FkZXJCaW5hcnk6VVJMTG9hZGVyO1xuXHRwcml2YXRlIHVybExvYWRlckJsb2I6VVJMTG9hZGVyO1xuXHRwcml2YXRlIHVybExvYWRlckFycmI6VVJMTG9hZGVyO1xuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXG5cdFx0Y29uc29sZS5sb2coICdzdGFydCcpO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQvLyBQT1NUIFVSTCBWYXJpYWJsZXMgdG8gUEhQIHNjcmlwdFxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR0aGlzLnVybExvYWRlclBvc3RVUkxWYXJzID0gbmV3IFVSTExvYWRlcigpO1xuXHRcdHRoaXMudXJsTG9hZGVyUG9zdFVSTFZhcnMuZGF0YUZvcm1hdCA9IFVSTExvYWRlckRhdGFGb3JtYXQuVkFSSUFCTEVTO1xuXG5cdFx0dmFyIHVybFN0cjpzdHJpbmcgPSAnZm5hbWU9a2FyaW0mbG5hbWU9JyArIE1hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAxMDAgKTtcblx0XHR2YXIgdXJsVmFycyA9IG5ldyBVUkxWYXJpYWJsZXMoIHVybFN0ciApO1xuXG5cdFx0dmFyIHJlcSA9IG5ldyBVUkxSZXF1ZXN0KCAnYXNzZXRzL3NhdmVEYXRhLnBocCcgKTtcblx0XHRcdHJlcS5tZXRob2QgPSBVUkxSZXF1ZXN0TWV0aG9kLlBPU1Q7XG5cdFx0XHRyZXEuZGF0YSA9IHVybFZhcnM7XG5cblx0XHR0aGlzLnVybExvYWRlclBvc3RVUkxWYXJzLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnQuQ09NUExFVEUsIChldmVudDpFdmVudCkgPT4gdGhpcy5wb3N0VVJMVGVzdENvbXBsZXRlKGV2ZW50KSk7XG5cdFx0dGhpcy51cmxMb2FkZXJQb3N0VVJMVmFycy5hZGRFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiwgKGV2ZW50OklPRXJyb3JFdmVudCkgPT4gdGhpcy5pb0Vycm9yKGV2ZW50KSk7XG5cdFx0dGhpcy51cmxMb2FkZXJQb3N0VVJMVmFycy5sb2FkKCByZXEgKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gR0VUIENTViBGaWxlXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRcdHZhciBjc3JSZXEgPSBuZXcgVVJMUmVxdWVzdCggJ2Fzc2V0cy9haXJwb3J0cy5jc3YnICk7XG5cblx0XHR0aGlzLnVybExvYWRlckdldENTViA9IG5ldyBVUkxMb2FkZXIoKTtcblx0XHR0aGlzLnVybExvYWRlckdldENTVi5kYXRhRm9ybWF0ID0gVVJMTG9hZGVyRGF0YUZvcm1hdC5URVhUO1xuXHRcdHRoaXMudXJsTG9hZGVyR2V0Q1NWLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnQuQ09NUExFVEUsIChldmVudDpFdmVudCkgPT4gdGhpcy5nZXRDc3ZDb21wbGV0ZShldmVudCkpO1xuXHRcdHRoaXMudXJsTG9hZGVyR2V0Q1NWLmFkZEV2ZW50TGlzdGVuZXIoRXZlbnQuT1BFTiwgKGV2ZW50OkV2ZW50KSA9PiB0aGlzLmdldENzdk9wZW4oZXZlbnQpKTtcblx0XHR0aGlzLnVybExvYWRlckdldENTVi5hZGRFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiwgKGV2ZW50OklPRXJyb3JFdmVudCkgPT4gdGhpcy5pb0Vycm9yKGV2ZW50KSk7XG5cdFx0dGhpcy51cmxMb2FkZXJHZXRDU1YubG9hZCggY3NyUmVxICk7XG5cblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHRcdC8vIEVSUk9SIHRlc3QgLSBsb2FkIGEgbm9uLWV4aXN0aW5nIG9iamVjdFxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR2YXIgZXJyb3JSZXEgPSBuZXcgVVJMUmVxdWVzdCggJ2Fzc2V0cy9nZW5lcmF0aW5nRXJyb3InICk7XG5cblx0XHR0aGlzLnVybExvYWRlckVycm9yVGVzdCA9IG5ldyBVUkxMb2FkZXIoKTtcblx0XHR0aGlzLnVybExvYWRlckVycm9yVGVzdC5kYXRhRm9ybWF0ID0gVVJMTG9hZGVyRGF0YUZvcm1hdC5URVhUO1xuXHRcdHRoaXMudXJsTG9hZGVyRXJyb3JUZXN0LmFkZEV2ZW50TGlzdGVuZXIoRXZlbnQuQ09NUExFVEUsIChldmVudDpFdmVudCkgPT4gIHRoaXMuZXJyb3JDb21wbGV0ZShldmVudCkpO1xuXHRcdHRoaXMudXJsTG9hZGVyRXJyb3JUZXN0LmFkZEV2ZW50TGlzdGVuZXIoSU9FcnJvckV2ZW50LklPX0VSUk9SLCAoZXZlbnQ6SU9FcnJvckV2ZW50KSA9PiB0aGlzLmlvRXJyb3IoZXZlbnQpKTtcblx0XHR0aGlzLnVybExvYWRlckVycm9yVGVzdC5hZGRFdmVudExpc3RlbmVyKEhUVFBTdGF0dXNFdmVudC5IVFRQX1NUQVRVUywgKGV2ZW50OkhUVFBTdGF0dXNFdmVudCkgPT4gdGhpcy5odHRwU3RhdHVzQ2hhbmdlKGV2ZW50KSk7XG5cdFx0dGhpcy51cmxMb2FkZXJFcnJvclRlc3QubG9hZCggZXJyb3JSZXEgKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gR0VUIFVSTCBWYXJzIC0gZ2V0IFVSTCB2YXJpYWJsZXNcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0dmFyIGNzclJlcSA9IG5ldyBVUkxSZXF1ZXN0KCAnYXNzZXRzL2dldFVybFZhcnMucGhwJyApO1xuXG5cdFx0dGhpcy51cmxMb2FkZXJHZXRVUkxWYXJzID0gbmV3IFVSTExvYWRlcigpO1xuXHRcdHRoaXMudXJsTG9hZGVyR2V0VVJMVmFycy5kYXRhRm9ybWF0ID0gVVJMTG9hZGVyRGF0YUZvcm1hdC5WQVJJQUJMRVM7XG5cdFx0dGhpcy51cmxMb2FkZXJHZXRVUkxWYXJzLmFkZEV2ZW50TGlzdGVuZXIoSU9FcnJvckV2ZW50LklPX0VSUk9SLCAoZXZlbnQ6SU9FcnJvckV2ZW50KSA9PiB0aGlzLmlvRXJyb3IoZXZlbnQpKTtcblx0XHR0aGlzLnVybExvYWRlckdldFVSTFZhcnMuYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT01QTEVURSwgKGV2ZW50OkV2ZW50KSA9PiB0aGlzLmdldFVSTFZhcnNDb21wbGV0ZShldmVudCkpO1xuXHRcdHRoaXMudXJsTG9hZGVyR2V0VVJMVmFycy5sb2FkKCBjc3JSZXEgKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gTE9BRCBCaW5hcnkgZmlsZVxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR2YXIgYmluUmVxID0gbmV3IFVSTFJlcXVlc3QoICdhc3NldHMvc3V6YW5uZS5hd2QnICk7XG5cblx0XHR0aGlzLnVybExvYWRlckJpbmFyeSA9IG5ldyBVUkxMb2FkZXIoICApO1xuXHRcdHRoaXMudXJsTG9hZGVyQmluYXJ5LmRhdGFGb3JtYXQgPSBVUkxMb2FkZXJEYXRhRm9ybWF0LkJJTkFSWTtcblx0XHR0aGlzLnVybExvYWRlckJpbmFyeS5hZGRFdmVudExpc3RlbmVyKElPRXJyb3JFdmVudC5JT19FUlJPUiwgKGV2ZW50OklPRXJyb3JFdmVudCkgPT4gdGhpcy5pb0Vycm9yKGV2ZW50KSk7XG5cdFx0dGhpcy51cmxMb2FkZXJCaW5hcnkuYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT01QTEVURSwgKGV2ZW50OkV2ZW50KSA9PiB0aGlzLmJpbkZpbGVMb2FkZWQoZXZlbnQpKTtcblx0XHR0aGlzLnVybExvYWRlckJpbmFyeS5sb2FkKCBiaW5SZXEgKTtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gTE9BRCBCbG9iIGZpbGVcblx0XHQvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdFx0dmFyIGJsb2JSZXEgPSBuZXcgVVJMUmVxdWVzdCggJ2Fzc2V0cy8yLnBuZycgKTtcblxuXHRcdHRoaXMudXJsTG9hZGVyQmxvYiA9IG5ldyBVUkxMb2FkZXIoICApO1xuXHRcdHRoaXMudXJsTG9hZGVyQmxvYi5kYXRhRm9ybWF0ID0gVVJMTG9hZGVyRGF0YUZvcm1hdC5CTE9CO1xuXHRcdHRoaXMudXJsTG9hZGVyQmxvYi5hZGRFdmVudExpc3RlbmVyKEV2ZW50LkNPTVBMRVRFLCAoZXZlbnQ6RXZlbnQpID0+IHRoaXMuYmxvYkZpbGVMb2FkZWQoZXZlbnQpKTtcblx0XHR0aGlzLnVybExvYWRlckJsb2IubG9hZCggYmxvYlJlcSApO1xuXG5cdFx0Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblx0XHQvLyBBUlJBWV9CVUZGRVIgVGVzdFxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0XHR2YXIgYXJyQlJlcSA9IG5ldyBVUkxSZXF1ZXN0KCAnYXNzZXRzLzEuanBnJyApO1xuXG5cdFx0dGhpcy51cmxMb2FkZXJBcnJiID0gbmV3IFVSTExvYWRlciggICk7XG5cdFx0dGhpcy51cmxMb2FkZXJBcnJiLmRhdGFGb3JtYXQgPSBVUkxMb2FkZXJEYXRhRm9ybWF0LkFSUkFZX0JVRkZFUjtcblx0XHR0aGlzLnVybExvYWRlckFycmIuYWRkRXZlbnRMaXN0ZW5lcihFdmVudC5DT01QTEVURSwgKGV2ZW50OkV2ZW50KSA9PiB0aGlzLmFycmF5QnVmZmVyTG9hZGVkKGV2ZW50KSk7XG5cdFx0dGhpcy51cmxMb2FkZXJBcnJiLmxvYWQoIGFyckJSZXEgKTtcblx0fVxuXG5cdHByaXZhdGUgYXJyYXlCdWZmZXJMb2FkZWQoIGV2ZW50OkV2ZW50ICk6dm9pZFxuXHR7XG5cdFx0dmFyIGFycmF5QnVmZmVyID0gdGhpcy51cmxMb2FkZXJBcnJiLmRhdGE7XG5cdFx0dmFyIGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5QnVmZmVyKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnTG9hZGVyVGVzdC5hcnJheUJ1ZmZlckxvYWRlZCcgLCBieXRlQXJyYXlbMV0pO1xuXG5cdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBieXRlQXJyYXkuYnl0ZUxlbmd0aDsgaSsrKSB7XG5cdFx0XHQvL2NvbnNvbGUubG9nKCBieXRlQXJyYXlbaV0gKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGJsb2JGaWxlTG9hZGVkKCBldmVudDpFdmVudCApOnZvaWRcblx0e1xuXHRcdHZhciBibG9iPSBuZXcgQmxvYihbdGhpcy51cmxMb2FkZXJCbG9iLmRhdGFdLCB7dHlwZTogJ2ltYWdlL3BuZyd9KTtcblx0XHR2YXIgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7XG5cdFx0XHRpbWcuc3JjICA9IHRoaXMuY3JlYXRlT2JqZWN0VVJMKCBibG9iICk7Ly93aW5kb3dbJ1VSTCddWydjcmVhdGVPYmplY3RVUkwnXShibG9iKTtcblx0XHRcdGltZy5vbmxvYWQgID0gZnVuY3Rpb24oZSkge1xuXHRcdFx0XHR3aW5kb3dbJ1VSTCddWydyZXZva2VPYmplY3RVUkwnXShpbWcuc3JjKTsgLy8gQ2xlYW4gdXAgYWZ0ZXIgeW91cnNlbGYuXG5cdFx0XHR9O1xuXG5cdFx0Y29uc29sZS5sb2coICdMb2FkZXJUZXN0LmJsb2JGaWxlTG9hZGVkJyAsIGJsb2IgKTtcblxuXHRcdGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoIGltZyApO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVPYmplY3RVUkwoIGZpbGVCbG9iIClcblx0e1xuXHRcdC8vIEZvciBzb21lIHJlYXNvbiBUeXBlU2NyaXB0IGhhcyBcIndpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMXCIgaW4gaXQncyBkaWN0aW9uYXJ5IC1cblx0XHQvLyBidXQgd2luZG93LlVSTCBjYXVzZXMgYW4gZXJyb3Jcblx0XHQvLyBjYW5ub3QgbWFrZSBteSBvd24gLmQudHMgZmlsZSBlaXRoZXIgKCByZXN1bHRzIGluIGR1cGxpY2F0ZSBkZWZpbml0aW9uIGVycm9yIClcblx0XHQvLyBUaGlzIEhBQ0sgZ2V0cyBpdCB0byB3b3JrOiB3aW5kb3dbJ1VSTCddWydjcmVhdGVPYmplY3RVUkwnXVxuXHRcdGlmKCB3aW5kb3dbJ1VSTCddICl7XG5cdFx0XHRpZiAoIHdpbmRvd1snVVJMJ11bJ2NyZWF0ZU9iamVjdFVSTCddICkge1xuXHRcdFx0XHRyZXR1cm4gd2luZG93WydVUkwnXVsnY3JlYXRlT2JqZWN0VVJMJ10oIGZpbGVCbG9iICk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICggd2luZG93Wyd3ZWJraXRVUkwnXSApe1xuXHRcdFx0XHRyZXR1cm4gd2luZG93Wyd3ZWJraXRVUkwnXVsnY3JlYXRlT2JqZWN0VVJMJ10oIGZpbGVCbG9iICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRwcml2YXRlIGJpbkZpbGVMb2FkZWQoZXZlbnQ6RXZlbnQpOnZvaWRcblx0e1xuXHRcdHZhciBsb2FkZXI6VVJMTG9hZGVyID0gPFVSTExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnNvbGUubG9nKCAnTG9hZGVyVGVzdC5iaW5GaWxlTG9hZGVkJyAsIGxvYWRlci5kYXRhLmxlbmd0aCApO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRVUkxWYXJzQ29tcGxldGUoZXZlbnQ6RXZlbnQpOnZvaWRcblx0e1xuXHRcdHZhciBsb2FkZXI6VVJMTG9hZGVyID0gPFVSTExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnNvbGUubG9nKCAnTG9hZGVyVGVzdC5nZXRVUkxWYXJzQ29tcGxldGUnICwgbG9hZGVyLmRhdGEgKTtcblx0fVxuXG5cdHByaXZhdGUgaHR0cFN0YXR1c0NoYW5nZShldmVudDpIVFRQU3RhdHVzRXZlbnQpOnZvaWRcblx0e1xuXHRcdGNvbnNvbGUubG9nKCAnTG9hZGVyVGVzdC5odHRwU3RhdHVzQ2hhbmdlJyAsIGV2ZW50LnN0YXR1cyApO1xuXHR9XG5cblx0cHJpdmF0ZSBpb0Vycm9yKGV2ZW50OklPRXJyb3JFdmVudCk6dm9pZFxuXHR7XG5cdFx0dmFyIGxvYWRlcjpVUkxMb2FkZXIgPSA8VVJMTG9hZGVyPiBldmVudC50YXJnZXQ7XG5cdFx0Y29uc29sZS5sb2coICdMb2FkZXJUZXN0LmlvRXJyb3InICwgbG9hZGVyLnVybCApO1xuXHR9XG5cblx0cHJpdmF0ZSBlcnJvckNvbXBsZXRlKCBldmVudCApOnZvaWRcblx0e1xuXHRcdHZhciBsb2FkZXI6VVJMTG9hZGVyID0gPFVSTExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnNvbGUubG9nKCAnTG9hZGVyLmVycm9yQ29tcGxldGUnICk7Ly8sIGxvYWRlci5kYXRhICk7XG5cdH1cblxuXHRwcml2YXRlIHBvc3RVUkxUZXN0Q29tcGxldGUoZXZlbnQ6RXZlbnQpOnZvaWRcblx0e1xuXHRcdHZhciBsb2FkZXI6VVJMTG9hZGVyID0gPFVSTExvYWRlcj4gZXZlbnQudGFyZ2V0O1xuXHRcdGNvbnNvbGUubG9nKCAnTG9hZGVyVGVzdC5wb3N0VVJMVGVzdENvbXBsZXRlJyAsIGxvYWRlci5kYXRhICk7XG5cdH1cblxuXHRwcml2YXRlIGdldENzdkNvbXBsZXRlKGV2ZW50OkV2ZW50KTp2b2lkXG5cdHtcblx0XHR2YXIgbG9hZGVyOlVSTExvYWRlciA9IDxVUkxMb2FkZXI+IGV2ZW50LnRhcmdldDtcblx0XHRjb25zb2xlLmxvZyggJ0xvYWRlclRlc3QuZ2V0Q3N2Q29tcGxldGUnICk7Ly8sIGxvYWRlci5kYXRhICk7XG5cdH1cblxuXHRwcml2YXRlIGdldENzdk9wZW4oIGV2ZW50ICk6dm9pZFxuXHR7XG5cdFx0dmFyIGxvYWRlcjpVUkxMb2FkZXIgPSA8VVJMTG9hZGVyPiBldmVudC50YXJnZXQ7XG5cdFx0Y29uc29sZS5sb2coICdMb2FkZXJUZXN0LmdldENzdk9wZW4nICk7XG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/net/URLLoaderTests.ts b/tests/net/URLLoaderTests.ts index 0a1673b1..329d7ab2 100644 --- a/tests/net/URLLoaderTests.ts +++ b/tests/net/URLLoaderTests.ts @@ -1,242 +1,211 @@ -/// - -module tests.net +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import URLRequestMethod = require("awayjs-core/lib/core/net/URLRequestMethod"); +import URLVariables = require("awayjs-core/lib/core/net/URLVariables"); +import Event = require("awayjs-core/lib/events/Event"); +import IOErrorEvent = require("awayjs-core/lib/events/IOErrorEvent"); +import HTTPStatusEvent = require("awayjs-core/lib/events/HTTPStatusEvent"); + +/** + * + */ +class LoaderTest { - import Delegate = away.utils.Delegate; - - export class LoaderTest //extends away.events.EventDispatcher - { - - private urlLoaderPostURLVars : away.net.URLLoader; - private urlLoaderGetCSV : away.net.URLLoader; - private urlLoaderErrorTest : away.net.URLLoader; - private urlLoaderGetURLVars : away.net.URLLoader; - private urlLoaderBinary : away.net.URLLoader; - private urlLoaderBlob : away.net.URLLoader; - private urlLoaderArrb : away.net.URLLoader; - - constructor() - { - - console.log( 'start'); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // POST URL Variables to PHP script - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - - this.urlLoaderPostURLVars = new away.net.URLLoader(); - this.urlLoaderPostURLVars.dataFormat = away.net.URLLoaderDataFormat.VARIABLES; - - var urlStr : string = 'fname=karim&lname=' + Math.floor( Math.random() * 100 ); - var urlVars = new away.net.URLVariables( urlStr ); - - var req = new away.net.URLRequest( 'assets/saveData.php' ); - req.method = away.net.URLRequestMethod.POST; - req.data = urlVars; - - this.urlLoaderPostURLVars.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.postURLTestComplete) ); - this.urlLoaderPostURLVars.addEventListener( away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError) ); - this.urlLoaderPostURLVars.load( req ); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // GET CSV File - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - - var csrReq = new away.net.URLRequest( 'assets/airports.csv' ); - - this.urlLoaderGetCSV = new away.net.URLLoader(); - this.urlLoaderGetCSV.dataFormat = away.net.URLLoaderDataFormat.TEXT; - this.urlLoaderGetCSV.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.getCsvComplete ) ); - this.urlLoaderGetCSV.addEventListener( away.events.Event.OPEN, Delegate.create(this, this.getCsvOpen ) ); - this.urlLoaderGetCSV.addEventListener( away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError) ); - this.urlLoaderGetCSV.load( csrReq ); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // ERROR test - load a non-existing object - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - - var errorReq = new away.net.URLRequest( 'assets/generatingError' ); - - this.urlLoaderErrorTest = new away.net.URLLoader(); - this.urlLoaderErrorTest.dataFormat = away.net.URLLoaderDataFormat.TEXT; - this.urlLoaderErrorTest.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.errorComplete ) ); - this.urlLoaderErrorTest.addEventListener( away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError) ); - this.urlLoaderErrorTest.addEventListener( away.events.HTTPStatusEvent.HTTP_STATUS, Delegate.create(this, this.httpStatusChange) ); - this.urlLoaderErrorTest.load( errorReq ); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // GET URL Vars - get URL variables - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - - var csrReq = new away.net.URLRequest( 'assets/getUrlVars.php' ); - - this.urlLoaderGetURLVars = new away.net.URLLoader(); - this.urlLoaderGetURLVars.dataFormat = away.net.URLLoaderDataFormat.VARIABLES; - this.urlLoaderGetURLVars.addEventListener( away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError) ); - this.urlLoaderGetURLVars.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.getURLVarsComplete ) ); - this.urlLoaderGetURLVars.load( csrReq ); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // LOAD Binary file - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - - var binReq = new away.net.URLRequest( 'assets/suzanne.awd' ); - - this.urlLoaderBinary = new away.net.URLLoader( ); - this.urlLoaderBinary.dataFormat = away.net.URLLoaderDataFormat.BINARY; - this.urlLoaderBinary.addEventListener( away.events.IOErrorEvent.IO_ERROR, Delegate.create(this, this.ioError) ); - this.urlLoaderBinary.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.binFileLoaded ) ); - this.urlLoaderBinary.load( binReq ); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // LOAD Blob file - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - - var blobReq = new away.net.URLRequest( 'assets/2.png' ); - - this.urlLoaderBlob = new away.net.URLLoader( ); - this.urlLoaderBlob.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.urlLoaderBlob.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.blobFileLoaded ) ); - this.urlLoaderBlob.load( blobReq ); - - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - // ARRAY_BUFFER Test - //--------------------------------------------------------------------------------------------------------------------------------------------------------- - - var arrBReq = new away.net.URLRequest( 'assets/1.jpg' ); - - this.urlLoaderArrb = new away.net.URLLoader( ); - this.urlLoaderArrb.dataFormat = away.net.URLLoaderDataFormat.ARRAY_BUFFER; - this.urlLoaderArrb.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.arrayBufferLoaded ) ); - this.urlLoaderArrb.load( arrBReq ); - - } - - private arrayBufferLoaded( event : away.events.Event ) : void - { - - var arrayBuffer = this.urlLoaderArrb.data; - var byteArray = new Uint8Array(arrayBuffer); - - console.log( 'LoaderTest.arrayBufferLoaded' , byteArray[1]); - - for (var i = 0; i < byteArray.byteLength; i++) { - //console.log( byteArray[i] ); - } - - } - - private blobFileLoaded( event : away.events.Event ) : void - { - - var blob = new Blob([this.urlLoaderBlob.data], {type: 'image/png'}); - var img = document.createElement('img'); - img.src = this.createObjectURL( blob );//window['URL']['createObjectURL'](blob); - img.onload = function(e) { - - window['URL']['revokeObjectURL'](img.src); // Clean up after yourself. - - }; - - console.log( 'LoaderTest.blobFileLoaded' , blob ); - - document.body.appendChild( img ); - - } - - private createObjectURL( fileBlob ) - { - - // For some reason TypeScript has "window.URL.createObjectURL" in it's dictionary - - // but window.URL causes an error - // cannot make my own .d.ts file either ( results in duplicate definition error ) - // This HACK gets it to work: window['URL']['createObjectURL'] - - if( window['URL'] ){ - - if ( window['URL']['createObjectURL'] ) { - - return window['URL']['createObjectURL']( fileBlob ); - - } - - } else { - - if ( window['webkitURL'] ){ - - return window['webkitURL']['createObjectURL']( fileBlob ); - - } - - } - - return null; - - } - - private binFileLoaded( event : away.events.Event ) : void - { - - var loader : away.net.URLLoader = event.target; - console.log( 'LoaderTest.binFileLoaded' , loader.data.length ); - - } - - private getURLVarsComplete( event : away.events.Event ) : void - { - - var loader : away.net.URLLoader = event.target; - console.log( 'LoaderTest.getURLVarsComplete' , loader.data ); - - - } - - private httpStatusChange( event : away.events.HTTPStatusEvent ) : void - { - - console.log( 'LoaderTest.httpStatusChange' , event.status ); - - } - - private ioError( event ) : void - { - - var loader : away.net.URLLoader = event.target; - console.log( 'LoaderTest.ioError' , loader.url ); - - } - - private errorComplete( event ) : void - { - - var loader : away.net.URLLoader = event.target; - console.log( 'LoaderTest.errorComplete' );//, loader.data ); - - } - - private postURLTestComplete( event ) : void - { - - var loader : away.net.URLLoader = event.target; - console.log( 'LoaderTest.postURLTestComplete' , loader.data ); - } + private urlLoaderPostURLVars:URLLoader; + private urlLoaderGetCSV:URLLoader; + private urlLoaderErrorTest:URLLoader; + private urlLoaderGetURLVars:URLLoader; + private urlLoaderBinary:URLLoader; + private urlLoaderBlob:URLLoader; + private urlLoaderArrb:URLLoader; - private getCsvComplete( event ) : void - { + constructor() + { - var loader : away.net.URLLoader = event.target; - console.log( 'LoaderTest.getCsvComplete' );//, loader.data ); + console.log( 'start'); - } + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // POST URL Variables to PHP script + //--------------------------------------------------------------------------------------------------------------------------------------------------------- - private getCsvOpen( event ) : void - { + this.urlLoaderPostURLVars = new URLLoader(); + this.urlLoaderPostURLVars.dataFormat = URLLoaderDataFormat.VARIABLES; - var loader : away.net.URLLoader = event.target; - console.log( 'LoaderTest.getCsvOpen' ); + var urlStr:string = 'fname=karim&lname=' + Math.floor( Math.random() * 100 ); + var urlVars = new URLVariables( urlStr ); + + var req = new URLRequest( 'assets/saveData.php' ); + req.method = URLRequestMethod.POST; + req.data = urlVars; - } + this.urlLoaderPostURLVars.addEventListener(Event.COMPLETE, (event:Event) => this.postURLTestComplete(event)); + this.urlLoaderPostURLVars.addEventListener(IOErrorEvent.IO_ERROR, (event:IOErrorEvent) => this.ioError(event)); + this.urlLoaderPostURLVars.load( req ); - } -} + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // GET CSV File + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + + var csrReq = new URLRequest( 'assets/airports.csv' ); + + this.urlLoaderGetCSV = new URLLoader(); + this.urlLoaderGetCSV.dataFormat = URLLoaderDataFormat.TEXT; + this.urlLoaderGetCSV.addEventListener(Event.COMPLETE, (event:Event) => this.getCsvComplete(event)); + this.urlLoaderGetCSV.addEventListener(Event.OPEN, (event:Event) => this.getCsvOpen(event)); + this.urlLoaderGetCSV.addEventListener(IOErrorEvent.IO_ERROR, (event:IOErrorEvent) => this.ioError(event)); + this.urlLoaderGetCSV.load( csrReq ); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // ERROR test - load a non-existing object + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + + var errorReq = new URLRequest( 'assets/generatingError' ); + + this.urlLoaderErrorTest = new URLLoader(); + this.urlLoaderErrorTest.dataFormat = URLLoaderDataFormat.TEXT; + this.urlLoaderErrorTest.addEventListener(Event.COMPLETE, (event:Event) => this.errorComplete(event)); + this.urlLoaderErrorTest.addEventListener(IOErrorEvent.IO_ERROR, (event:IOErrorEvent) => this.ioError(event)); + this.urlLoaderErrorTest.addEventListener(HTTPStatusEvent.HTTP_STATUS, (event:HTTPStatusEvent) => this.httpStatusChange(event)); + this.urlLoaderErrorTest.load( errorReq ); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // GET URL Vars - get URL variables + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + + var csrReq = new URLRequest( 'assets/getUrlVars.php' ); + + this.urlLoaderGetURLVars = new URLLoader(); + this.urlLoaderGetURLVars.dataFormat = URLLoaderDataFormat.VARIABLES; + this.urlLoaderGetURLVars.addEventListener(IOErrorEvent.IO_ERROR, (event:IOErrorEvent) => this.ioError(event)); + this.urlLoaderGetURLVars.addEventListener(Event.COMPLETE, (event:Event) => this.getURLVarsComplete(event)); + this.urlLoaderGetURLVars.load( csrReq ); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // LOAD Binary file + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + + var binReq = new URLRequest( 'assets/suzanne.awd' ); + + this.urlLoaderBinary = new URLLoader( ); + this.urlLoaderBinary.dataFormat = URLLoaderDataFormat.BINARY; + this.urlLoaderBinary.addEventListener(IOErrorEvent.IO_ERROR, (event:IOErrorEvent) => this.ioError(event)); + this.urlLoaderBinary.addEventListener(Event.COMPLETE, (event:Event) => this.binFileLoaded(event)); + this.urlLoaderBinary.load( binReq ); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // LOAD Blob file + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + + var blobReq = new URLRequest( 'assets/2.png' ); + + this.urlLoaderBlob = new URLLoader( ); + this.urlLoaderBlob.dataFormat = URLLoaderDataFormat.BLOB; + this.urlLoaderBlob.addEventListener(Event.COMPLETE, (event:Event) => this.blobFileLoaded(event)); + this.urlLoaderBlob.load( blobReq ); + + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + // ARRAY_BUFFER Test + //--------------------------------------------------------------------------------------------------------------------------------------------------------- + + var arrBReq = new URLRequest( 'assets/1.jpg' ); + + this.urlLoaderArrb = new URLLoader( ); + this.urlLoaderArrb.dataFormat = URLLoaderDataFormat.ARRAY_BUFFER; + this.urlLoaderArrb.addEventListener(Event.COMPLETE, (event:Event) => this.arrayBufferLoaded(event)); + this.urlLoaderArrb.load( arrBReq ); + } + + private arrayBufferLoaded( event:Event ):void + { + var arrayBuffer = this.urlLoaderArrb.data; + var byteArray = new Uint8Array(arrayBuffer); + + console.log( 'LoaderTest.arrayBufferLoaded' , byteArray[1]); + + for (var i = 0; i < byteArray.byteLength; i++) { + //console.log( byteArray[i] ); + } + } + + private blobFileLoaded( event:Event ):void + { + var blob= new Blob([this.urlLoaderBlob.data], {type: 'image/png'}); + var img = document.createElement('img'); + img.src = this.createObjectURL( blob );//window['URL']['createObjectURL'](blob); + img.onload = function(e) { + window['URL']['revokeObjectURL'](img.src); // Clean up after yourself. + }; + + console.log( 'LoaderTest.blobFileLoaded' , blob ); + + document.body.appendChild( img ); + } + + private createObjectURL( fileBlob ) + { + // For some reason TypeScript has "window.URL.createObjectURL" in it's dictionary - + // but window.URL causes an error + // cannot make my own .d.ts file either ( results in duplicate definition error ) + // This HACK gets it to work: window['URL']['createObjectURL'] + if( window['URL'] ){ + if ( window['URL']['createObjectURL'] ) { + return window['URL']['createObjectURL']( fileBlob ); + } + } else { + if ( window['webkitURL'] ){ + return window['webkitURL']['createObjectURL']( fileBlob ); + } + } + + return null; + } + + private binFileLoaded(event:Event):void + { + var loader:URLLoader = event.target; + console.log( 'LoaderTest.binFileLoaded' , loader.data.length ); + } + + private getURLVarsComplete(event:Event):void + { + var loader:URLLoader = event.target; + console.log( 'LoaderTest.getURLVarsComplete' , loader.data ); + } + + private httpStatusChange(event:HTTPStatusEvent):void + { + console.log( 'LoaderTest.httpStatusChange' , event.status ); + } + + private ioError(event:IOErrorEvent):void + { + var loader:URLLoader = event.target; + console.log( 'LoaderTest.ioError' , loader.url ); + } + + private errorComplete( event ):void + { + var loader:URLLoader = event.target; + console.log( 'Loader.errorComplete' );//, loader.data ); + } + + private postURLTestComplete(event:Event):void + { + var loader:URLLoader = event.target; + console.log( 'LoaderTest.postURLTestComplete' , loader.data ); + } + + private getCsvComplete(event:Event):void + { + var loader:URLLoader = event.target; + console.log( 'LoaderTest.getCsvComplete' );//, loader.data ); + } + + private getCsvOpen( event ):void + { + var loader:URLLoader = event.target; + console.log( 'LoaderTest.getCsvOpen' ); + } +} \ No newline at end of file diff --git a/tests/parsers/JSONTextureParser.ts b/tests/parsers/JSONTextureParser.ts deleted file mode 100644 index 4917bca7..00000000 --- a/tests/parsers/JSONTextureParser.ts +++ /dev/null @@ -1,260 +0,0 @@ -/// - -module parsers -{ - - /** - * ImageParser provides a "parser" for natively supported image types (jpg, png). While it simply loads bytes into - * a loader object, it wraps it in a BitmapDataResource so resource management can happen consistently without - * exception cases. - */ - export class JSONTextureParser extends away.parsers.ParserBase - { - //private var _byteData : ByteArray; - - private STATE_PARSE_DATA : number = 0; - private STATE_LOAD_IMAGES : number = 1; - private STATE_COMPLETE : number = 2; - - private _state : number = -1; - private _startedParsing : boolean; - private _doneParsing : boolean; - private _dependencyCount : number = 0; - private _loadedTextures : away.textures.Texture2DBase[]; - //private var _loader : Loader; - - /** - * Creates a new ImageParser object. - * @param uri The url or id of the data or file to be parsed. - * @param extra The holder for extra contextual data that the parser might need. - */ - constructor() - { - - super( away.parsers.ParserDataFormat.PLAIN_TEXT ); - - this._loadedTextures = new Array(); - this._state = this.STATE_PARSE_DATA; - - - } - - /** - * Indicates whether or not a given file extension is supported by the parser. - * @param extension The file extension of a potential file to be parsed. - * @return Whether or not the given file type is supported. - */ - - public static supportsType(extension : string) : boolean - { - - extension = extension.toLowerCase(); - return extension == "json"; - - } - - /** - * Tests whether a data block can be parsed by the parser. - * @param data The data block to potentially be parsed. - * @return Whether or not the given data is supported. - */ - public static supportsData(data : any) : boolean - { - - try - { - - var obj = JSON.parse( data ); - - if ( obj ) - { - - return true; - - } - - return false; - - - } catch ( e ) { - - return false; - - } - - return false; - - } - - /** - * @inheritDoc - */ - public _iResolveDependency(resourceDependency:away.parsers.ResourceDependency):void - { - - var resource : away.textures.Texture2DBase = resourceDependency.assets[0] ;//as Texture2DBase; - - this._pFinalizeAsset( resource , resourceDependency._iLoader.url ); - - this._loadedTextures.push( resource ); - - //console.log( 'JSONTextureParser._iResolveDependency' , resourceDependency ); - //console.log( 'JSONTextureParser._iResolveDependency resource: ' , resource ); - - this._dependencyCount--; - - if ( this._dependencyCount == 0) - { - - this._state = this.STATE_COMPLETE; - - } - - } - - /** - * @inheritDoc - */ - public _iResolveDependencyFailure(resourceDependency:away.parsers.ResourceDependency):void - { - //console.log( '-----------------------------------------------------------'); - //console.log( 'JSONTextureParser._iResolveDependencyFailure', 'x' , resourceDependency ); - - this._dependencyCount--; - - if ( this._dependencyCount == 0) - { - - this._state = this.STATE_COMPLETE; - //console.log( 'JSONTextureParser._iResolveDependencyFailure.complete' ); - - } - /* - - - if (_dependencyCount == 0) - _parseState = DAEParserState.PARSE_MATERIALS; - */ - } - - private parseJson( ) : void - { - - //console.log( 'JSONTextureParser.parseJson' , typeof this.data ); - - if ( JSONTextureParser.supportsData( this.data ) ) - { - - try - { - - var json : any = JSON.parse( this.data ); - var data : Array = > json.data; - - var rec : any; - var rq : away.net.URLRequest; - - for ( var c : number = 0 ; c < data.length ; c ++ ) - { - - - rec = data[c]; - - var uri : string = rec.image; - var id : string = rec.id; - - rq = new away.net.URLRequest( uri ); - - //console.log( 'JSONTextureParser.parseJson' , id , uri ); - //console.log( 'JSONTextureParser.parseJson' , id , uri ); - - this._pAddDependency( 'JSON_ID_' + id , rq , false , null , true ); - - } - - this._dependencyCount = data.length; - this._state = this.STATE_LOAD_IMAGES; - - this._pPauseAndRetrieveDependencies();//pauseAndRetrieveDependencies - - } catch ( e ) { - - this._state = this.STATE_COMPLETE; - - } - - - } - - } - /** - * @inheritDoc - */ - public _pProceedParsing() : boolean - { - - console.log( 'JSONTextureParser._pProceedParsing' , this._state ); - - switch ( this._state ) - { - - case this.STATE_PARSE_DATA: - - this.parseJson(); - return away.parsers.ParserBase.MORE_TO_PARSE; - - break; - - case this.STATE_LOAD_IMAGES: - - // Async load image process - //return away.loaders.ParserBase.MORE_TO_PARSE; - - break; - - - - case this.STATE_COMPLETE: - - //console.log( 'JSONTextureParser._pProceedParsing: WE ARE DONE' ); // YAY; - return away.parsers.ParserBase.PARSING_DONE; - - break; - - } - - return away.parsers.ParserBase.MORE_TO_PARSE; - - /* - var asset : away.textures.Texture2DBase; - - if ( this.data instanceof HTMLImageElement ) - { - - asset = new away.textures.HTMLImageElementTexture( this.data ); - - if ( away.utils.TextureUtils.isHTMLImageElementValid( this.data ) ) - { - - - this._pFinalizeAsset( asset , this._iFileName ); - - - } - else - { - - this.dispatchEvent( new away.events.AssetEvent( away.events.AssetEvent.TEXTURE_SIZE_ERROR , asset ) ); - - } - - return away.loaders.ParserBase.PARSING_DONE; - - } - - return away.loaders.ParserBase.PARSING_DONE; - */ - } - - } -} \ No newline at end of file diff --git a/tests/textures/BitmapTextureTest.js b/tests/textures/BitmapTextureTest.js new file mode 100755 index 00000000..7e8b4f9b --- /dev/null +++ b/tests/textures/BitmapTextureTest.js @@ -0,0 +1,51 @@ +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +var URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var Event = require("awayjs-core/lib/events/Event"); +var ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +var BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); +var Debug = require("awayjs-core/lib/utils/Debug"); + +var BitmapTextureTest = (function () { + function BitmapTextureTest() { + var _this = this; + //--------------------------------------- + // Load a PNG + var mipUrlRequest = new URLRequest('assets/1024x1024.png'); + this.mipLoader = new URLLoader(); + this.mipLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.mipLoader.load(mipUrlRequest); + this.mipLoader.addEventListener(Event.COMPLETE, function (e) { + return _this.mipImgLoaded(e); + }); + } + BitmapTextureTest.prototype.mipImgLoaded = function (e) { + var _this = this; + var loader = e.target; + var image = ParserUtils.blobToImage(loader.data); + image.onload = function (event) { + return _this.onImageLoad(event); + }; + }; + + BitmapTextureTest.prototype.onImageLoad = function (event) { + var image = event.target; + + var rect = new Rectangle(0, 0, image.width, image.height); + + console.log('Event', image); + + this.bitmapData = new BitmapData(image.width, image.height); + this.bitmapData.drawImage(image, rect, rect); + + this.target = new BitmapTexture(this.bitmapData, true); //new HTMLImageElementTexture( loader.image , false ); + + Debug.log('BitmapData', this.bitmapData); + Debug.log('BitmapTexture', this.target); + }; + return BitmapTextureTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRleHR1cmVzL0JpdG1hcFRleHR1cmVUZXN0LnRzIl0sIm5hbWVzIjpbIkJpdG1hcFRleHR1cmVUZXN0IiwiQml0bWFwVGV4dHVyZVRlc3QuY29uc3RydWN0b3IiLCJCaXRtYXBUZXh0dXJlVGVzdC5taXBJbWdMb2FkZWQiLCJCaXRtYXBUZXh0dXJlVGVzdC5vbkltYWdlTG9hZCJdLCJtYXBwaW5ncyI6IkFBQUEsZ0VBQXNFO0FBQ3RFLDhEQUFvRTtBQUNwRSw2REFBbUU7QUFDbkUsaUZBQXFGO0FBQ3JGLCtEQUFxRTtBQUNyRSxtREFBMEQ7QUFDMUQsZ0VBQXNFO0FBQ3RFLHFFQUEwRTtBQUMxRSxrREFBeUQ7O0FBRXpEO0lBT0NBO1FBQUFDLGlCQVlDQTtRQVRBQSx5Q0FBeUNBO1FBQ3pDQSxhQUFhQTtRQUViQSxJQUFJQSxhQUFhQSxHQUFHQSxJQUFJQSxVQUFVQSxDQUFFQSxzQkFBc0JBLENBQUNBO1FBQzNEQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFJQSxJQUFJQSxTQUFTQSxDQUFDQSxDQUFDQTtRQUNqQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsVUFBVUEsR0FBR0EsbUJBQW1CQSxDQUFDQSxJQUFJQTtRQUNwREEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBRUEsYUFBYUEsQ0FBRUE7UUFDcENBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLGdCQUFnQkEsQ0FBRUEsS0FBS0EsQ0FBQ0EsUUFBUUEsRUFBR0EsVUFBQ0EsQ0FBQ0E7bUJBQUtBLEtBQUlBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBO1FBQXBCQSxDQUFvQkEsQ0FBRUE7SUFFaEZBLENBQUNBO0lBRURELDJDQUFBQSxVQUFzQkEsQ0FBQ0E7UUFBdkJFLGlCQU1DQTtRQUhBQSxJQUFJQSxNQUFNQSxHQUFvQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUE7UUFDdERBLElBQUlBLEtBQUtBLEdBQXNCQSxXQUFXQSxDQUFDQSxXQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtRQUNuRUEsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsVUFBRUEsS0FBS0E7bUJBQU1BLEtBQUlBLENBQUNBLFdBQVdBLENBQUVBLEtBQUtBLENBQUVBO1FBQXpCQSxDQUF5QkE7SUFDdERBLENBQUNBOztJQUVERiwwQ0FBQUEsVUFBcUJBLEtBQUtBO1FBRXpCRyxJQUFJQSxLQUFLQSxHQUF5Q0EsS0FBS0EsQ0FBQ0EsTUFBTUE7O1FBRTlEQSxJQUFJQSxJQUFJQSxHQUF3QkEsSUFBSUEsU0FBU0EsQ0FBRUEsQ0FBQ0EsRUFBR0EsQ0FBQ0EsRUFBR0EsS0FBS0EsQ0FBQ0EsS0FBS0EsRUFBR0EsS0FBS0EsQ0FBQ0EsTUFBTUEsQ0FBRUE7O1FBRW5GQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxPQUFPQSxFQUFHQSxLQUFLQSxDQUFFQTs7UUFFOUJBLElBQUlBLENBQUNBLFVBQVVBLEdBQTJCQSxJQUFJQSxVQUFVQSxDQUFFQSxLQUFLQSxDQUFDQSxLQUFLQSxFQUFHQSxLQUFLQSxDQUFDQSxNQUFNQSxDQUFFQTtRQUN0RkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsU0FBU0EsQ0FBRUEsS0FBS0EsRUFBR0EsSUFBSUEsRUFBSUEsSUFBSUEsQ0FBRUE7O1FBRWpEQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUErQkEsSUFBSUEsYUFBYUEsQ0FBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBR0EsSUFBSUEsQ0FBRUEsRUFBQ0Esc0RBQXNEQTs7UUFFNUlBLEtBQUtBLENBQUNBLEdBQUdBLENBQUVBLFlBQVlBLEVBQWFBLElBQUlBLENBQUNBLFVBQVVBLENBQUVBO1FBQ3JEQSxLQUFLQSxDQUFDQSxHQUFHQSxDQUFFQSxlQUFlQSxFQUFTQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFFQTtJQUVqREEsQ0FBQ0E7SUFDRkgseUJBQUNBO0FBQURBLENBQUNBLElBQUE7QUFBQSIsImZpbGUiOiJ0ZXh0dXJlcy9CaXRtYXBUZXh0dXJlVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCaXRtYXBEYXRhXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvYmFzZS9CaXRtYXBEYXRhXCIpO1xuaW1wb3J0IFJlY3RhbmdsZVx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2dlb20vUmVjdGFuZ2xlXCIpO1xuaW1wb3J0IFVSTExvYWRlclx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxMb2FkZXJcIik7XG5pbXBvcnQgVVJMTG9hZGVyRGF0YUZvcm1hdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2NvcmUvbmV0L1VSTExvYWRlckRhdGFGb3JtYXRcIik7XG5pbXBvcnQgVVJMUmVxdWVzdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxSZXF1ZXN0XCIpO1xuaW1wb3J0IEV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL0V2ZW50XCIpO1xuaW1wb3J0IFBhcnNlclV0aWxzXHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3BhcnNlcnMvUGFyc2VyVXRpbHNcIik7XG5pbXBvcnQgQml0bWFwVGV4dHVyZVx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdGV4dHVyZXMvQml0bWFwVGV4dHVyZVwiKTtcbmltcG9ydCBEZWJ1Z1x0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL0RlYnVnXCIpO1xuXG5jbGFzcyBCaXRtYXBUZXh0dXJlVGVzdFxue1xuXG5cdHByaXZhdGUgbWlwTG9hZGVyICAgICAgIDogVVJMTG9hZGVyO1xuXHRwcml2YXRlIGJpdG1hcERhdGEgICAgICA6IEJpdG1hcERhdGE7XG5cdHByaXZhdGUgdGFyZ2V0ICAgICAgICAgIDogQml0bWFwVGV4dHVyZTtcblxuXHRjb25zdHJ1Y3RvcigpXG5cdHtcblxuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gTG9hZCBhIFBOR1xuXG5cdFx0dmFyIG1pcFVybFJlcXVlc3QgPSBuZXcgVVJMUmVxdWVzdCggJ2Fzc2V0cy8xMDI0eDEwMjQucG5nJyk7XG5cdFx0dGhpcy5taXBMb2FkZXIgID0gbmV3IFVSTExvYWRlcigpO1xuXHRcdHRoaXMubWlwTG9hZGVyLmRhdGFGb3JtYXQgPSBVUkxMb2FkZXJEYXRhRm9ybWF0LkJMT0I7XG5cdFx0dGhpcy5taXBMb2FkZXIubG9hZCggbWlwVXJsUmVxdWVzdCApO1xuXHRcdHRoaXMubWlwTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoIEV2ZW50LkNPTVBMRVRFICwgKGUpID0+IHRoaXMubWlwSW1nTG9hZGVkKGUpICk7XG5cblx0fVxuXG5cdHByaXZhdGUgbWlwSW1nTG9hZGVkKCBlIClcblx0e1xuXG5cdFx0dmFyIGxvYWRlciAgOiBVUkxMb2FkZXIgICAgICAgID0gPFVSTExvYWRlciA+IGUudGFyZ2V0O1xuXHRcdHZhciBpbWFnZSA6IEhUTUxJbWFnZUVsZW1lbnQgPSBQYXJzZXJVdGlscy5ibG9iVG9JbWFnZShsb2FkZXIuZGF0YSk7XG5cdFx0aW1hZ2Uub25sb2FkID0gKCBldmVudCApID0+IHRoaXMub25JbWFnZUxvYWQoIGV2ZW50ICk7XG5cdH1cblxuXHRwcml2YXRlIG9uSW1hZ2VMb2FkIChldmVudClcblx0e1xuXHRcdHZhciBpbWFnZSA6IEhUTUxJbWFnZUVsZW1lbnQgPSA8SFRNTEltYWdlRWxlbWVudD4gZXZlbnQudGFyZ2V0O1xuXG5cdFx0dmFyIHJlY3QgICAgOiBSZWN0YW5nbGUgICAgICAgPSBuZXcgUmVjdGFuZ2xlKCAwICwgMCAsIGltYWdlLndpZHRoICwgaW1hZ2UuaGVpZ2h0ICk7XG5cblx0XHRjb25zb2xlLmxvZyggJ0V2ZW50JyAsIGltYWdlICk7XG5cblx0XHR0aGlzLmJpdG1hcERhdGEgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgQml0bWFwRGF0YSggaW1hZ2Uud2lkdGggLCBpbWFnZS5oZWlnaHQgKTtcblx0XHR0aGlzLmJpdG1hcERhdGEuZHJhd0ltYWdlKCBpbWFnZSAsIHJlY3QgLCAgcmVjdCApO1xuXG5cdFx0dGhpcy50YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEJpdG1hcFRleHR1cmUoIHRoaXMuYml0bWFwRGF0YSAsIHRydWUgKTsvL25ldyBIVE1MSW1hZ2VFbGVtZW50VGV4dHVyZSggbG9hZGVyLmltYWdlICwgZmFsc2UgKTtcblxuXHRcdERlYnVnLmxvZyggJ0JpdG1hcERhdGEnICAgICAgICAgICAsIHRoaXMuYml0bWFwRGF0YSApO1xuXHRcdERlYnVnLmxvZyggJ0JpdG1hcFRleHR1cmUnICAgICAgICwgdGhpcy50YXJnZXQgKTtcblxuXHR9XG59Il19 \ No newline at end of file diff --git a/tests/textures/BitmapTextureTest.ts b/tests/textures/BitmapTextureTest.ts index 5dc2d46f..19590fc3 100644 --- a/tests/textures/BitmapTextureTest.ts +++ b/tests/textures/BitmapTextureTest.ts @@ -1,57 +1,57 @@ -/// - -module tests.textures +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import Event = require("awayjs-core/lib/events/Event"); +import ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +import BitmapTexture = require("awayjs-core/lib/textures/BitmapTexture"); +import Debug = require("awayjs-core/lib/utils/Debug"); + +class BitmapTextureTest { - import Delegate = away.utils.Delegate; - - - export class BitmapTextureTest - { - - private mipLoader : away.net.URLLoader; - private bitmapData : away.base.BitmapData; - private target : away.textures.BitmapTexture; - private texture : away.gl.Texture; - constructor() - { + private mipLoader : URLLoader; + private bitmapData : BitmapData; + private target : BitmapTexture; - //--------------------------------------- - // Load a PNG + constructor() + { - var mipUrlRequest = new away.net.URLRequest( 'assets/1024x1024.png'); - this.mipLoader = new away.net.URLLoader(); - this.mipLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.mipLoader.load( mipUrlRequest ); - this.mipLoader.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.mipImgLoaded) ); + //--------------------------------------- + // Load a PNG - } + var mipUrlRequest = new URLRequest( 'assets/1024x1024.png'); + this.mipLoader = new URLLoader(); + this.mipLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.mipLoader.load( mipUrlRequest ); + this.mipLoader.addEventListener( Event.COMPLETE , (e) => this.mipImgLoaded(e) ); - private mipImgLoaded( e ) - { + } - var loader : away.net.URLLoader = e.target; - var image : HTMLImageElement = away.parsers.ParserUtils.blobToImage(loader.data); - image.onload = ( event ) => this.onImageLoad( event ); - } + private mipImgLoaded( e ) + { - private onImageLoad (event) - { - var image : HTMLImageElement = event.target; + var loader : URLLoader = e.target; + var image : HTMLImageElement = ParserUtils.blobToImage(loader.data); + image.onload = ( event ) => this.onImageLoad( event ); + } - var rect : away.geom.Rectangle = new away.geom.Rectangle( 0 , 0 , image.width , image.height ); + private onImageLoad (event) + { + var image : HTMLImageElement = event.target; - console.log( 'away.events.Event.COMPLETE' , image ); + var rect : Rectangle = new Rectangle( 0 , 0 , image.width , image.height ); - this.bitmapData = new away.base.BitmapData( image.width , image.height ); - this.bitmapData.drawImage( image , rect , rect ); + console.log( 'Event' , image ); - this.target = new away.textures.BitmapTexture( this.bitmapData , true );//new away.textures.HTMLImageElementTexture( loader.image , false ); + this.bitmapData = new BitmapData( image.width , image.height ); + this.bitmapData.drawImage( image , rect , rect ); - away.Debug.log( 'away.base.BitmapData' , this.bitmapData ); - away.Debug.log( 'away.textures.BitmapTexture' , this.target ); + this.target = new BitmapTexture( this.bitmapData , true );//new HTMLImageElementTexture( loader.image , false ); - } + Debug.log( 'BitmapData' , this.bitmapData ); + Debug.log( 'BitmapTexture' , this.target ); - } -} + } +} \ No newline at end of file diff --git a/tests/utils/ByteArrayTest.js b/tests/utils/ByteArrayTest.js new file mode 100755 index 00000000..27208a0d --- /dev/null +++ b/tests/utils/ByteArrayTest.js @@ -0,0 +1,39 @@ +var ByteArray = require("awayjs-core/lib/utils/ByteArray"); + +/** +* +*/ +var ByteArrayTest = (function () { + function ByteArrayTest() { + var b1 = new ByteArray(); + b1.writeByte(0xFF); + b1.writeByte(0xEE); + b1.writeByte(0xDD); + b1.writeByte(0xCC); + b1.writeByte(0xBB); + b1.writeByte(0xAA); + + var b2 = new ByteArray(); + b2.writeByte(0x00); + b2.writeByte(0x00); + b2.writeByte(0x00); + b2.writeByte(0x00); + b2.writeByte(0x00); + b2.writeByte(0x00); + + b2.position = 0; + b1.position = 0; + + b1.readBytes(b2, 2, 2); + + console.log('b1.position', b1.position); + console.log('b2.length', b2.length, 'b2.position', b2.position); + + while (b2.getBytesAvailable()) { + console.log(b2.readByte().toString(16)); + } + } + return ByteArrayTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0J5dGVBcnJheVRlc3QudHMiXSwibmFtZXMiOlsiQnl0ZUFycmF5VGVzdCIsIkJ5dGVBcnJheVRlc3QuY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBLDBEQUFnRTs7QUFFaEU7O0VBRUc7QUFDSDtJQUVDQTtRQUVDQyxJQUFJQSxFQUFFQSxHQUFhQSxJQUFJQSxTQUFTQSxDQUFDQSxDQUFDQTtRQUNsQ0EsRUFBRUEsQ0FBQ0EsU0FBU0EsQ0FBRUEsSUFBSUEsQ0FBRUE7UUFDcEJBLEVBQUVBLENBQUNBLFNBQVNBLENBQUVBLElBQUlBLENBQUVBO1FBQ3BCQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFFQSxJQUFJQSxDQUFFQTtRQUNwQkEsRUFBRUEsQ0FBQ0EsU0FBU0EsQ0FBRUEsSUFBSUEsQ0FBRUE7UUFDcEJBLEVBQUVBLENBQUNBLFNBQVNBLENBQUVBLElBQUlBLENBQUVBO1FBQ3BCQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFFQSxJQUFJQSxDQUFFQTs7UUFFcEJBLElBQUlBLEVBQUVBLEdBQWFBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBO1FBQ2xDQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFFQSxJQUFJQSxDQUFFQTtRQUNwQkEsRUFBRUEsQ0FBQ0EsU0FBU0EsQ0FBRUEsSUFBSUEsQ0FBRUE7UUFDcEJBLEVBQUVBLENBQUNBLFNBQVNBLENBQUVBLElBQUlBLENBQUVBO1FBQ3BCQSxFQUFFQSxDQUFDQSxTQUFTQSxDQUFFQSxJQUFJQSxDQUFFQTtRQUNwQkEsRUFBRUEsQ0FBQ0EsU0FBU0EsQ0FBRUEsSUFBSUEsQ0FBRUE7UUFDcEJBLEVBQUVBLENBQUNBLFNBQVNBLENBQUVBLElBQUlBLENBQUVBOztRQUVwQkEsRUFBRUEsQ0FBQ0EsUUFBUUEsR0FBR0EsQ0FBQ0E7UUFDZkEsRUFBRUEsQ0FBQ0EsUUFBUUEsR0FBR0EsQ0FBQ0E7O1FBRWZBLEVBQUVBLENBQUNBLFNBQVNBLENBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBLENBQUVBOztRQUV4QkEsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsYUFBYUEsRUFBR0EsRUFBRUEsQ0FBQ0EsUUFBUUEsQ0FBRUE7UUFDMUNBLE9BQU9BLENBQUNBLEdBQUdBLENBQUVBLFdBQVdBLEVBQUdBLEVBQUVBLENBQUNBLE1BQU1BLEVBQUdBLGFBQWFBLEVBQUdBLEVBQUVBLENBQUNBLFFBQVFBLENBQUVBOztRQUVwRUEsT0FBUUEsRUFBRUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQSxDQUM5QkE7WUFDQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBRUEsRUFBRUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBRUEsRUFBRUEsQ0FBRUEsQ0FBRUE7U0FDM0NBO0lBQ0ZBLENBQUNBO0lBQ0ZELHFCQUFDQTtBQUFEQSxDQUFDQSxJQUFBO0FBQUEiLCJmaWxlIjoidXRpbHMvQnl0ZUFycmF5VGVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBCeXRlQXJyYXlcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvdXRpbHMvQnl0ZUFycmF5XCIpO1xuXG4vKipcbiAqIFxuICovXG5jbGFzcyBCeXRlQXJyYXlUZXN0XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdHZhciBiMTpCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5KCk7XG5cdFx0YjEud3JpdGVCeXRlKCAweEZGICk7XG5cdFx0YjEud3JpdGVCeXRlKCAweEVFICk7XG5cdFx0YjEud3JpdGVCeXRlKCAweEREICk7XG5cdFx0YjEud3JpdGVCeXRlKCAweENDICk7XG5cdFx0YjEud3JpdGVCeXRlKCAweEJCICk7XG5cdFx0YjEud3JpdGVCeXRlKCAweEFBICk7XG5cblx0XHR2YXIgYjI6Qnl0ZUFycmF5ID0gbmV3IEJ5dGVBcnJheSgpO1xuXHRcdGIyLndyaXRlQnl0ZSggMHgwMCApO1xuXHRcdGIyLndyaXRlQnl0ZSggMHgwMCApO1xuXHRcdGIyLndyaXRlQnl0ZSggMHgwMCApO1xuXHRcdGIyLndyaXRlQnl0ZSggMHgwMCApO1xuXHRcdGIyLndyaXRlQnl0ZSggMHgwMCApO1xuXHRcdGIyLndyaXRlQnl0ZSggMHgwMCApO1xuXG5cdFx0YjIucG9zaXRpb24gPSAwO1xuXHRcdGIxLnBvc2l0aW9uID0gMDtcblxuXHRcdGIxLnJlYWRCeXRlcyggYjIsIDIsIDIgKTtcblxuXHRcdGNvbnNvbGUubG9nKCAnYjEucG9zaXRpb24nICwgYjEucG9zaXRpb24gKTtcblx0XHRjb25zb2xlLmxvZyggJ2IyLmxlbmd0aCcgLCBiMi5sZW5ndGggLCAnYjIucG9zaXRpb24nICwgYjIucG9zaXRpb24gKTtcblxuXHRcdHdoaWxlICggYjIuZ2V0Qnl0ZXNBdmFpbGFibGUoKSApXG5cdFx0e1xuXHRcdFx0Y29uc29sZS5sb2coIGIyLnJlYWRCeXRlKCkudG9TdHJpbmcoIDE2ICkgKTtcblx0XHR9XG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/utils/ByteArrayTest.ts b/tests/utils/ByteArrayTest.ts index 5ff34e61..2189c029 100644 --- a/tests/utils/ByteArrayTest.ts +++ b/tests/utils/ByteArrayTest.ts @@ -1,48 +1,39 @@ -/// - -module tests.utils{ - - - export class ByteArrayTest - { - - constructor() - { - - - var b1:away.utils.ByteArray = new away.utils.ByteArray(); - b1.writeByte( 0xFF ); - b1.writeByte( 0xEE ); - b1.writeByte( 0xDD ); - b1.writeByte( 0xCC ); - b1.writeByte( 0xBB ); - b1.writeByte( 0xAA ); - - var b2:away.utils.ByteArray = new away.utils.ByteArray(); - b2.writeByte( 0x00 ); - b2.writeByte( 0x00 ); - b2.writeByte( 0x00 ); - b2.writeByte( 0x00 ); - b2.writeByte( 0x00 ); - b2.writeByte( 0x00 ); - - b2.position = 0; - b1.position = 0; - - b1.readBytes( b2, 2, 2 ); - - console.log( 'b1.position' , b1.position ); - console.log( 'b2.length' , b2.length , 'b2.position' , b2.position ); - - while ( b2.getBytesAvailable() ) - { - console.log( b2.readByte().toString( 16 ) ); - } - - } - - - } - - +import ByteArray = require("awayjs-core/lib/utils/ByteArray"); + +/** + * + */ +class ByteArrayTest +{ + constructor() + { + var b1:ByteArray = new ByteArray(); + b1.writeByte( 0xFF ); + b1.writeByte( 0xEE ); + b1.writeByte( 0xDD ); + b1.writeByte( 0xCC ); + b1.writeByte( 0xBB ); + b1.writeByte( 0xAA ); + + var b2:ByteArray = new ByteArray(); + b2.writeByte( 0x00 ); + b2.writeByte( 0x00 ); + b2.writeByte( 0x00 ); + b2.writeByte( 0x00 ); + b2.writeByte( 0x00 ); + b2.writeByte( 0x00 ); + + b2.position = 0; + b1.position = 0; + + b1.readBytes( b2, 2, 2 ); + + console.log( 'b1.position' , b1.position ); + console.log( 'b2.length' , b2.length , 'b2.position' , b2.position ); + + while ( b2.getBytesAvailable() ) + { + console.log( b2.readByte().toString( 16 ) ); + } + } } \ No newline at end of file diff --git a/tests/utils/IDUtilTest.js b/tests/utils/IDUtilTest.js new file mode 100755 index 00000000..491d2397 --- /dev/null +++ b/tests/utils/IDUtilTest.js @@ -0,0 +1,10 @@ +var IDUtil = require("awayjs-core/lib/core/library/IDUtil"); + +var IDUtilTest = (function () { + function IDUtilTest() { + console.log(IDUtil.createUID()); + } + return IDUtilTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL0lEVXRpbFRlc3QudHMiXSwibmFtZXMiOlsiSURVdGlsVGVzdCIsIklEVXRpbFRlc3QuY29uc3RydWN0b3IiXSwibWFwcGluZ3MiOiJBQUFBLDJEQUFrRTs7QUFFbEU7SUFFQ0E7UUFFQ0MsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7SUFDaENBLENBQUNBO0lBQ0ZELGtCQUFDQTtBQUFEQSxDQUFDQSxJQUFBO0FBQUEiLCJmaWxlIjoidXRpbHMvSURVdGlsVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBJRFV0aWxcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL2xpYnJhcnkvSURVdGlsXCIpO1xuXG5jbGFzcyBJRFV0aWxUZXN0XG57XG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdGNvbnNvbGUubG9nKElEVXRpbC5jcmVhdGVVSUQoKSk7XG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/utils/IDUtilTest.ts b/tests/utils/IDUtilTest.ts index 93394cc4..7e306b4e 100644 --- a/tests/utils/IDUtilTest.ts +++ b/tests/utils/IDUtilTest.ts @@ -1,17 +1,9 @@ -/// - -module tests.utils{ - - export class IDUtilTest - { - - - constructor() - { - console.log( away.library.IDUtil.createUID() ); - } - - - } - -} +import IDUtil = require("awayjs-core/lib/core/library/IDUtil"); + +class IDUtilTest +{ + constructor() + { + console.log(IDUtil.createUID()); + } +} \ No newline at end of file diff --git a/tests/utils/MipMapTest.js b/tests/utils/MipMapTest.js new file mode 100755 index 00000000..5d042e3a --- /dev/null +++ b/tests/utils/MipMapTest.js @@ -0,0 +1,102 @@ +var BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +var Matrix = require("awayjs-core/lib/core/geom/Matrix"); +var Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +var URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +var URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +var URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +var Event = require("awayjs-core/lib/events/Event"); +var ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +var TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +var MipMapTest = (function () { + function MipMapTest() { + var _this = this; + this._rect = new Rectangle(); + this._matrix = new Matrix(); + //--------------------------------------- + // Load a PNG + var mipUrlRequest = new URLRequest('assets/1024x1024.png'); + this.mipLoader = new URLLoader(); + this.mipLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.mipLoader.load(mipUrlRequest); + this.mipLoader.addEventListener(Event.COMPLETE, function (event) { + return _this.mipImgLoaded(event); + }); + + document.onmousedown = function (e) { + return _this.onMouseDown(e); + }; + } + MipMapTest.prototype.mipImgLoaded = function (event) { + var _this = this; + var loader = event.target; + var image = ParserUtils.blobToImage(loader.data); + image.onload = function (event) { + return _this.onImageLoad(event); + }; + }; + + MipMapTest.prototype.onImageLoad = function (event) { + var image = event.target; + alert('Each click will generate a level of MipMap'); + + this.sourceBitmap = new BitmapData(1024, 1024, true, 0xff0000); + this.sourceBitmap.drawImage(image, this.sourceBitmap.rect, this.sourceBitmap.rect); + this.sourceBitmap.canvas.style.position = 'absolute'; + this.sourceBitmap.canvas.style.left = '0px'; + this.sourceBitmap.canvas.style.top = '1030px'; + + //document.body.appendChild( this.sourceBitmap.canvas ); + this.mipMap = new BitmapData(1024, 1024, true, 0xff0000); + this.mipMap.canvas.style.position = 'absolute'; + this.mipMap.canvas.style.left = '0px'; + this.mipMap.canvas.style.top = '0px'; + + document.body.appendChild(this.mipMap.canvas); + + this._rect.width = this.sourceBitmap.width; + this._rect.height = this.sourceBitmap.height; + + this.w = this.sourceBitmap.width; + this.h = this.sourceBitmap.height; + }; + + MipMapTest.prototype.onMouseDown = function (e) { + this.generateMipMap(this.sourceBitmap, this.mipMap); + }; + + MipMapTest.prototype.generateMipMap = function (source, mipmap, alpha, side) { + if (typeof mipmap === "undefined") { mipmap = null; } + if (typeof alpha === "undefined") { alpha = false; } + if (typeof side === "undefined") { side = -1; } + var c = this.w; + var i; + + console['time']('MipMap' + c); + + if ((this.w >= 1) || (this.h >= 1)) { + if (alpha) + mipmap.fillRect(this._rect, 0); + + this._matrix.a = this._rect.width / source.width; + this._matrix.d = this._rect.height / source.height; + + mipmap.width = this.w; + mipmap.height = this.h; + mipmap.copyPixels(source, source.rect, new Rectangle(0, 0, this.w, this.h)); + + this.w >>= 1; + this.h >>= 1; + + this._rect.width = this.w > 1 ? this.w : 1; + this._rect.height = this.h > 1 ? this.h : 1; + } + + console.log('TextureUtils.isBitmapDataValid: ', TextureUtils.isBitmapDataValid(mipmap)); + + console['timeEnd']('MipMap' + c); + }; + return MipMapTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL01pcE1hcFRlc3QudHMiXSwibmFtZXMiOlsiTWlwTWFwVGVzdCIsIk1pcE1hcFRlc3QuY29uc3RydWN0b3IiLCJNaXBNYXBUZXN0Lm1pcEltZ0xvYWRlZCIsIk1pcE1hcFRlc3Qub25JbWFnZUxvYWQiLCJNaXBNYXBUZXN0Lm9uTW91c2VEb3duIiwiTWlwTWFwVGVzdC5nZW5lcmF0ZU1pcE1hcCJdLCJtYXBwaW5ncyI6IkFBQUEsZ0VBQXNFO0FBQ3RFLHdEQUErRDtBQUMvRCw4REFBb0U7QUFDcEUsNkRBQW1FO0FBQ25FLGlGQUFxRjtBQUNyRiwrREFBcUU7QUFDckUsbURBQTBEO0FBQzFELGdFQUFzRTtBQUN0RSxnRUFBc0U7O0FBRXRFO0lBV0NBO1FBQUFDLGlCQVlDQTtRQWpCREEsS0FBUUEsS0FBS0EsR0FBeUJBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBO1FBQ3REQSxLQUFRQSxPQUFPQSxHQUFvQkEsSUFBSUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7UUFNL0NBLHlDQUF5Q0E7UUFDekNBLGFBQWFBO1FBRWJBLElBQUlBLGFBQWFBLEdBQUdBLElBQUlBLFVBQVVBLENBQUVBLHNCQUFzQkEsQ0FBQ0E7UUFDM0RBLElBQUlBLENBQUNBLFNBQVNBLEdBQUlBLElBQUlBLFNBQVNBLENBQUNBLENBQUNBO1FBQ2pDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxVQUFVQSxHQUFHQSxtQkFBbUJBLENBQUNBLElBQUlBO1FBQ3BEQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFFQSxhQUFhQSxDQUFFQTtRQUNwQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsZ0JBQWdCQSxDQUFFQSxLQUFLQSxDQUFDQSxRQUFRQSxFQUFHQSxVQUFDQSxLQUFXQTttQkFBS0EsS0FBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBeEJBLENBQXdCQSxDQUFFQTs7UUFFN0ZBLFFBQVFBLENBQUNBLFdBQVdBLEdBQUdBLFVB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R0FBZ0JBLElBQUlBO0FBQUFBLFFBQUVBLG9DQUFBQSxLQUFLQSxHQUFXQSxLQUFLQTtBQUFBQSxRQUFFQSxtQ0FBQUEsSUFBSUEsR0FBVUEsQ0FBQ0EsQ0FBQ0E7QUFBQUEsUUFFL0dBLElBQUlBLENBQUNBLEdBQVVBLElBQUlBLENBQUNBLENBQUNBO1FBQ3JCQSxJQUFJQSxDQUFDQTs7UUFFTEEsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsUUFBUUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7O1FBRTdCQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFFQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFFQTtZQUVwQ0EsSUFBSUEsS0FBS0E7Z0JBQ1JBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBOztZQUVoQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsR0FBR0EsTUFBTUEsQ0FBQ0EsS0FBS0E7WUFDaERBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLEdBQUdBLE1BQU1BLENBQUNBLE1BQU1BOztZQUVsREEsTUFBTUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7WUFDckJBLE1BQU1BLENBQUNBLE1BQU1BLEdBQUVBLElBQUlBLENBQUNBLENBQUNBO1lBQ3JCQSxNQUFNQSxDQUFDQSxVQUFVQSxDQUFFQSxNQUFNQSxFQUFHQSxNQUFNQSxDQUFDQSxJQUFJQSxFQUFHQSxJQUFJQSxTQUFTQSxDQUFFQSxDQUFDQSxFQUFHQSxDQUFDQSxFQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFFQSxDQUFFQTs7WUFFcEZBLElBQUlBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBO1lBQ1pBLElBQUlBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBOztZQUVaQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQTtZQUN6Q0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0E7U0FDMUNBOztRQUVEQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFFQSxrQ0FBa0NBLEVBQUdBLFlBQVlBLENBQUNBLGlCQUFpQkEsQ0FBRUEsTUFBTUEsQ0FBRUEsQ0FBQ0E7O1FBRTNGQSxPQUFPQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQTtJQUVqQ0EsQ0FBQ0E7SUFDRkwsa0JBQUNBO0FBQURBLENBQUNBLElBQUE7QUFBQSIsImZpbGUiOiJ1dGlscy9NaXBNYXBUZXN0LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2JiYXRlbWFuL1dlYnN0b3JtUHJvamVjdHMvYXdheWpzLWNvcmUvIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpdG1hcERhdGFcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9iYXNlL0JpdG1hcERhdGFcIik7XG5pbXBvcnQgTWF0cml4XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL01hdHJpeFwiKTtcbmltcG9ydCBSZWN0YW5nbGVcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9nZW9tL1JlY3RhbmdsZVwiKTtcbmltcG9ydCBVUkxMb2FkZXJcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMTG9hZGVyXCIpO1xuaW1wb3J0IFVSTExvYWRlckRhdGFGb3JtYXRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9jb3JlL25ldC9VUkxMb2FkZXJEYXRhRm9ybWF0XCIpO1xuaW1wb3J0IFVSTFJlcXVlc3RcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvY29yZS9uZXQvVVJMUmVxdWVzdFwiKTtcbmltcG9ydCBFdmVudFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL2V2ZW50cy9FdmVudFwiKTtcbmltcG9ydCBQYXJzZXJVdGlsc1x0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi9wYXJzZXJzL1BhcnNlclV0aWxzXCIpO1xuaW1wb3J0IFRleHR1cmVVdGlsc1x0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi91dGlscy9UZXh0dXJlVXRpbHNcIik7XG5cbmNsYXNzIE1pcE1hcFRlc3RcbntcblxuXHRwcml2YXRlIG1pcExvYWRlciAgICAgICA6IFVSTExvYWRlcjtcblx0cHJpdmF0ZSBzb3VyY2VCaXRtYXAgICAgOiBCaXRtYXBEYXRhO1xuXHRwcml2YXRlIG1pcE1hcCAgICAgICAgICA6IEJpdG1hcERhdGE7XG5cdHByaXZhdGUgX3JlY3QgICAgICAgICAgIDogUmVjdGFuZ2xlID0gbmV3IFJlY3RhbmdsZSgpO1xuXHRwcml2YXRlIF9tYXRyaXggICAgICAgICA6IE1hdHJpeCA9IG5ldyBNYXRyaXgoKTtcblx0cHJpdmF0ZSB3ICAgICAgICAgICAgICAgOiBudW1iZXI7XG5cdHByaXZhdGUgaCAgICAgICAgICAgICAgIDogbnVtYmVyO1xuXG5cdGNvbnN0cnVjdG9yKClcblx0e1xuXHRcdC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdFx0Ly8gTG9hZCBhIFBOR1xuXG5cdFx0dmFyIG1pcFVybFJlcXVlc3QgPSBuZXcgVVJMUmVxdWVzdCggJ2Fzc2V0cy8xMDI0eDEwMjQucG5nJyk7XG5cdFx0dGhpcy5taXBMb2FkZXIgID0gbmV3IFVSTExvYWRlcigpO1xuXHRcdHRoaXMubWlwTG9hZGVyLmRhdGFGb3JtYXQgPSBVUkxMb2FkZXJEYXRhRm9ybWF0LkJMT0I7XG5cdFx0dGhpcy5taXBMb2FkZXIubG9hZCggbWlwVXJsUmVxdWVzdCApO1xuXHRcdHRoaXMubWlwTG9hZGVyLmFkZEV2ZW50TGlzdGVuZXIoIEV2ZW50LkNPTVBMRVRFICwgKGV2ZW50OkV2ZW50KSA9PiB0aGlzLm1pcEltZ0xvYWRlZChldmVudCkgKTtcblxuXHRcdGRvY3VtZW50Lm9ubW91c2Vkb3duID0gKCBlICkgPT4gdGhpcy5vbk1vdXNlRG93biggZSApO1xuXHR9XG5cblx0cHJpdmF0ZSBtaXBJbWdMb2FkZWQoZXZlbnQ6RXZlbnQpXG5cdHtcblx0XHR2YXIgbG9hZGVyICA6IFVSTExvYWRlciAgICAgICAgPSA8VVJMTG9hZGVyID4gZXZlbnQudGFyZ2V0O1xuXHRcdHZhciBpbWFnZSA6IEhUTUxJbWFnZUVsZW1lbnQgPSBQYXJzZXJVdGlscy5ibG9iVG9JbWFnZShsb2FkZXIuZGF0YSk7XG5cdFx0aW1hZ2Uub25sb2FkID0gKCBldmVudCApID0+IHRoaXMub25JbWFnZUxvYWQoIGV2ZW50ICk7XG5cdH1cblxuXHRwcml2YXRlIG9uSW1hZ2VMb2FkIChldmVudClcblx0e1xuXHRcdHZhciBpbWFnZSA6IEhUTUxJbWFnZUVsZW1lbnQgPSA8SFRNTEltYWdlRWxlbWVudD4gZXZlbnQudGFyZ2V0O1xuXHRcdGFsZXJ0KCAnRWFjaCBjbGljayB3aWxsIGdlbmVyYXRlIGEgbGV2ZWwgb2YgTWlwTWFwJyk7XG5cblx0XHR0aGlzLnNvdXJjZUJpdG1hcCAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IEJpdG1hcERhdGEoIDEwMjQgLCAxMDI0ICwgdHJ1ZSAsIDB4ZmYwMDAwICk7XG5cdFx0dGhpcy5zb3VyY2VCaXRtYXAuZHJhd0ltYWdlKCBpbWFnZSAsIHRoaXMuc291cmNlQml0bWFwLnJlY3QgLCB0aGlzLnNvdXJjZUJpdG1hcC5yZWN0ICk7XG5cdFx0dGhpcy5zb3VyY2VCaXRtYXAuY2FudmFzLnN0eWxlLnBvc2l0aW9uICA9ICdhYnNvbHV0ZSc7XG5cdFx0dGhpcy5zb3VyY2VCaXRtYXAuY2FudmFzLnN0eWxlLmxlZnQgICAgICA9ICcwcHgnO1xuXHRcdHRoaXMuc291cmNlQml0bWFwLmNhbnZhcy5zdHlsZS50b3AgICAgICAgPSAnMTAzMHB4JztcblxuXHRcdC8vZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCggdGhpcy5zb3VyY2VCaXRtYXAuY2FudmFzICk7XG5cblx0XHR0aGlzLm1pcE1hcCA9IG5ldyBCaXRtYXBEYXRhKCAxMDI0ICwgMTAyNCAsIHRydWUgLCAweGZmMDAwMCApO1xuXHRcdHRoaXMubWlwTWFwLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiAgPSAnYWJzb2x1dGUnO1xuXHRcdHRoaXMubWlwTWFwLmNhbnZhcy5zdHlsZS5sZWZ0ICAgICAgPSAnMHB4Jztcblx0XHR0aGlzLm1pcE1hcC5jYW52YXMuc3R5bGUudG9wICAgICAgID0gJzBweCc7XG5cblx0XHRkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKCB0aGlzLm1pcE1hcC5jYW52YXMgKTtcblxuXHRcdHRoaXMuX3JlY3Qud2lkdGggICAgPSB0aGlzLnNvdXJjZUJpdG1hcC53aWR0aDtcblx0XHR0aGlzLl9yZWN0LmhlaWdodCAgID0gdGhpcy5zb3VyY2VCaXRtYXAuaGVpZ2h0O1xuXG5cdFx0dGhpcy53ID0gdGhpcy5zb3VyY2VCaXRtYXAud2lkdGg7XG5cdFx0dGhpcy5oID0gdGhpcy5zb3VyY2VCaXRtYXAuaGVpZ2h0O1xuXG5cdH1cblxuXHRwcml2YXRlIG9uTW91c2VEb3duKCBlIClcblx0e1xuXHRcdHRoaXMuZ2VuZXJhdGVNaXBNYXAoIHRoaXMuc291cmNlQml0bWFwICwgIHRoaXMubWlwTWFwICk7XG5cdH1cblx0XG5cdHB1YmxpYyBnZW5lcmF0ZU1pcE1hcCggc291cmNlIDogQml0bWFwRGF0YSAsIG1pcG1hcCA6IEJpdG1hcERhdGEgPSBudWxsLCBhbHBoYTpib29sZWFuID0gZmFsc2UsIHNpZGU6bnVtYmVyID0gLTEpXG5cdHtcblx0XHR2YXIgYzpudW1iZXIgPSB0aGlzLnc7XG5cdFx0dmFyIGk6bnVtYmVyO1xuXG5cdFx0Y29uc29sZVsndGltZSddKCdNaXBNYXAnICsgYyk7XG5cdFx0XG5cdFx0aWYgKCh0aGlzLncgPj0gMSApIHx8ICh0aGlzLmggPj0gMSkpIHtcblxuXHRcdFx0aWYgKGFscGhhKVxuXHRcdFx0XHRtaXBtYXAuZmlsbFJlY3QodGhpcy5fcmVjdCwgMCk7XG5cblx0XHRcdHRoaXMuX21hdHJpeC5hID0gdGhpcy5fcmVjdC53aWR0aCAvIHNvdXJjZS53aWR0aDtcblx0XHRcdHRoaXMuX21hdHJpeC5kID0gdGhpcy5fcmVjdC5oZWlnaHQgLyBzb3VyY2UuaGVpZ2h0O1xuXG5cdFx0XHRtaXBtYXAud2lkdGggPSB0aGlzLnc7XG5cdFx0XHRtaXBtYXAuaGVpZ2h0PSB0aGlzLmg7XG5cdFx0XHRtaXBtYXAuY29weVBpeGVscyggc291cmNlICwgc291cmNlLnJlY3QgLCBuZXcgUmVjdGFuZ2xlKCAwICwgMCAsIHRoaXMudyAsIHRoaXMuaCApICk7XG5cblx0XHRcdHRoaXMudyA+Pj0gMTtcblx0XHRcdHRoaXMuaCA+Pj0gMTtcblxuXHRcdFx0dGhpcy5fcmVjdC53aWR0aCA9IHRoaXMudyA+IDE/IHRoaXMudyA6IDE7XG5cdFx0XHR0aGlzLl9yZWN0LmhlaWdodCA9IHRoaXMuaCA+IDE/IHRoaXMuaCA6IDE7XG5cdFx0fVxuXG5cdFx0Y29uc29sZS5sb2coICdUZXh0dXJlVXRpbHMuaXNCaXRtYXBEYXRhVmFsaWQ6ICcgLCBUZXh0dXJlVXRpbHMuaXNCaXRtYXBEYXRhVmFsaWQoIG1pcG1hcCApKTtcblxuXHRcdGNvbnNvbGVbJ3RpbWVFbmQnXSgnTWlwTWFwJyArIGMpO1xuXG5cdH1cbn0iXX0= \ No newline at end of file diff --git a/tests/utils/MipMapTest.ts b/tests/utils/MipMapTest.ts index d3eb8e16..80da21ab 100644 --- a/tests/utils/MipMapTest.ts +++ b/tests/utils/MipMapTest.ts @@ -1,121 +1,107 @@ -/// - -module tests.utils +import BitmapData = require("awayjs-core/lib/core/base/BitmapData"); +import Matrix = require("awayjs-core/lib/core/geom/Matrix"); +import Rectangle = require("awayjs-core/lib/core/geom/Rectangle"); +import URLLoader = require("awayjs-core/lib/core/net/URLLoader"); +import URLLoaderDataFormat = require("awayjs-core/lib/core/net/URLLoaderDataFormat"); +import URLRequest = require("awayjs-core/lib/core/net/URLRequest"); +import Event = require("awayjs-core/lib/events/Event"); +import ParserUtils = require("awayjs-core/lib/parsers/ParserUtils"); +import TextureUtils = require("awayjs-core/lib/utils/TextureUtils"); + +class MipMapTest { - import Delegate = away.utils.Delegate; - - export class MipMapTest - { - - private mipLoader : away.net.URLLoader; - private sourceBitmap : away.base.BitmapData; - private mipMap : away.base.BitmapData; - private _rect : away.geom.Rectangle = new away.geom.Rectangle(); - private _matrix : away.geom.Matrix = new away.geom.Matrix(); - private w : number; - private h : number; - - constructor() - { - - //--------------------------------------- - // Load a PNG - var mipUrlRequest = new away.net.URLRequest( 'assets/1024x1024.png'); - this.mipLoader = new away.net.URLLoader(); - this.mipLoader.dataFormat = away.net.URLLoaderDataFormat.BLOB; - this.mipLoader.load( mipUrlRequest ); - this.mipLoader.addEventListener( away.events.Event.COMPLETE , Delegate.create(this, this.mipImgLoaded) ); - - document.onmousedown = ( e ) => this.onMouseDown( e ); - - } - - private mipImgLoaded( e ) - { - - var loader : away.net.URLLoader = e.target; - var image : HTMLImageElement = away.parsers.ParserUtils.blobToImage(loader.data); - image.onload = ( event ) => this.onImageLoad( event ); + private mipLoader : URLLoader; + private sourceBitmap : BitmapData; + private mipMap : BitmapData; + private _rect : Rectangle = new Rectangle(); + private _matrix : Matrix = new Matrix(); + private w : number; + private h : number; + + constructor() + { + //--------------------------------------- + // Load a PNG + + var mipUrlRequest = new URLRequest( 'assets/1024x1024.png'); + this.mipLoader = new URLLoader(); + this.mipLoader.dataFormat = URLLoaderDataFormat.BLOB; + this.mipLoader.load( mipUrlRequest ); + this.mipLoader.addEventListener( Event.COMPLETE , (event:Event) => this.mipImgLoaded(event) ); + + document.onmousedown = ( e ) => this.onMouseDown( e ); + } + + private mipImgLoaded(event:Event) + { + var loader : URLLoader = event.target; + var image : HTMLImageElement = ParserUtils.blobToImage(loader.data); + image.onload = ( event ) => this.onImageLoad( event ); + } + + private onImageLoad (event) + { + var image : HTMLImageElement = event.target; + alert( 'Each click will generate a level of MipMap'); + + this.sourceBitmap = new BitmapData( 1024 , 1024 , true , 0xff0000 ); + this.sourceBitmap.drawImage( image , this.sourceBitmap.rect , this.sourceBitmap.rect ); + this.sourceBitmap.canvas.style.position = 'absolute'; + this.sourceBitmap.canvas.style.left = '0px'; + this.sourceBitmap.canvas.style.top = '1030px'; + + //document.body.appendChild( this.sourceBitmap.canvas ); + + this.mipMap = new BitmapData( 1024 , 1024 , true , 0xff0000 ); + this.mipMap.canvas.style.position = 'absolute'; + this.mipMap.canvas.style.left = '0px'; + this.mipMap.canvas.style.top = '0px'; + + document.body.appendChild( this.mipMap.canvas ); + + this._rect.width = this.sourceBitmap.width; + this._rect.height = this.sourceBitmap.height; + + this.w = this.sourceBitmap.width; + this.h = this.sourceBitmap.height; + + } + + private onMouseDown( e ) + { + this.generateMipMap( this.sourceBitmap , this.mipMap ); + } + + public generateMipMap( source : BitmapData , mipmap : BitmapData = null, alpha:boolean = false, side:number = -1) + { + var c:number = this.w; + var i:number; + + console['time']('MipMap' + c); + + if ((this.w >= 1 ) || (this.h >= 1)) { + + if (alpha) + mipmap.fillRect(this._rect, 0); + + this._matrix.a = this._rect.width / source.width; + this._matrix.d = this._rect.height / source.height; + + mipmap.width = this.w; + mipmap.height= this.h; + mipmap.copyPixels( source , source.rect , new Rectangle( 0 , 0 , this.w , this.h ) ); + + this.w >>= 1; + this.h >>= 1; + + this._rect.width = this.w > 1? this.w : 1; + this._rect.height = this.h > 1? this.h : 1; } - private onImageLoad (event) - { - var image : HTMLImageElement = event.target; - alert( 'Each click will generate a level of MipMap'); - - this.sourceBitmap = new away.base.BitmapData( 1024 , 1024 , true , 0xff0000 ); - this.sourceBitmap.drawImage( image , this.sourceBitmap.rect , this.sourceBitmap.rect ); - this.sourceBitmap.canvas.style.position = 'absolute'; - this.sourceBitmap.canvas.style.left = '0px'; - this.sourceBitmap.canvas.style.top = '1030px'; - - //document.body.appendChild( this.sourceBitmap.canvas ); - - this.mipMap = new away.base.BitmapData( 1024 , 1024 , true , 0xff0000 ); - this.mipMap.canvas.style.position = 'absolute'; - this.mipMap.canvas.style.left = '0px'; - this.mipMap.canvas.style.top = '0px'; - - document.body.appendChild( this.mipMap.canvas ); - - this._rect.width = this.sourceBitmap.width; - this._rect.height = this.sourceBitmap.height; - - this.w = this.sourceBitmap.width; - this.h = this.sourceBitmap.height; - - } - - private onMouseDown( e ) - { - - this.generateMipMap( this.sourceBitmap , this.mipMap ); - - } - - - - - public generateMipMap( source : away.base.BitmapData , mipmap : away.base.BitmapData = null, alpha:boolean = false, side:number = -1) - { - - var c : number = this.w; - var i:number; - - console['time']('MipMap' + c); - - - if ( (this.w >= 1 ) || (this.h >= 1) ) - { - - if (alpha){ - - mipmap.fillRect(this._rect, 0); - - } - - this._matrix.a = this._rect.width / source.width; - this._matrix.d = this._rect.height / source.height; - - mipmap.width = this.w; - mipmap.height= this.h; - mipmap.copyPixels( source , source.rect , new away.geom.Rectangle( 0 , 0 , this.w , this.h ) ); - - this.w >>= 1; - this.h >>= 1; - - this._rect.width = this.w > 1? this.w : 1; - this._rect.height = this.h > 1? this.h : 1; - - } - - console.log( 'away.utils.TextureUtils.isBitmapDataValid: ' , away.utils.TextureUtils.isBitmapDataValid( mipmap )); - - console['timeEnd']('MipMap' + c); - - } + console.log( 'TextureUtils.isBitmapDataValid: ' , TextureUtils.isBitmapDataValid( mipmap )); - } + console['timeEnd']('MipMap' + c); + } } \ No newline at end of file diff --git a/tests/utils/RequestAnimationFrameTest.js b/tests/utils/RequestAnimationFrameTest.js new file mode 100755 index 00000000..dd15cdb9 --- /dev/null +++ b/tests/utils/RequestAnimationFrameTest.js @@ -0,0 +1,28 @@ +var RequestAnimationFrame = require("awayjs-core/lib/utils/RequestAnimationFrame"); + +var RequestAnimationFrameTest = (function () { + function RequestAnimationFrameTest() { + var _this = this; + this.requestAnimationFrameTimer = new RequestAnimationFrame(this.tick, this); + this.requestAnimationFrameTimer.start(); + + document.onmousedown = function (event) { + return _this.onMouseDown(event); + }; + } + RequestAnimationFrameTest.prototype.onMouseDown = function (event) { + console.log('mouseDown'); + + if (this.requestAnimationFrameTimer.active) + this.requestAnimationFrameTimer.stop(); + else + this.requestAnimationFrameTimer.start(); + }; + + RequestAnimationFrameTest.prototype.tick = function (dt) { + console.log('tick'); + }; + return RequestAnimationFrameTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL1JlcXVlc3RBbmltYXRpb25GcmFtZVRlc3QudHMiXSwibmFtZXMiOlsiUmVxdWVzdEFuaW1hdGlvbkZyYW1lVGVzdCIsIlJlcXVlc3RBbmltYXRpb25GcmFtZVRlc3QuY29uc3RydWN0b3IiLCJSZXF1ZXN0QW5pbWF0aW9uRnJhbWVUZXN0Lm9uTW91c2VEb3duIiwiUmVxdWVzdEFuaW1hdGlvbkZyYW1lVGVzdC50aWNrIl0sIm1hcHBpbmdzIjoiQUFBQSxrRkFBc0Y7O0FBRXRGO0lBSUNBO1FBQUFDLGlCQU1DQTtRQUpBQSxJQUFJQSxDQUFDQSwwQkFBMEJBLEdBQUdBLElBQUlBLHFCQUFxQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsRUFBRUEsSUFBSUEsQ0FBQ0E7UUFDNUVBLElBQUlBLENBQUNBLDBCQUEwQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7O1FBRXZDQSxRQUFRQSxDQUFDQSxXQUFXQSxHQUFHQSxVQUFDQSxLQUFXQTttQkFBS0EsS0FBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBdkJBLENBQXVCQTtJQUNoRUEsQ0FBQ0E7SUFFREQsa0RBQUFBLFVBQW9CQSxLQUFXQTtRQUU5QkUsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsV0FBV0EsQ0FBQ0E7O1FBRXhCQSxJQUFJQSxJQUFJQSxDQUFDQSwwQkFBMEJBLENBQUNBLE1BQU1BO1lBQ3pDQSxJQUFJQSxDQUFDQSwwQkFBMEJBLENBQUNBLElBQUlBLENBQUNBLENBQUNBOztZQUV0Q0EsSUFBSUEsQ0FBQ0EsMEJBQTBCQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtJQUMxQ0EsQ0FBQ0E7O0lBRURGLDJDQUFBQSxVQUFhQSxFQUFTQTtRQUVyQkcsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7SUFDcEJBLENBQUNBO0lBQ0ZILGlDQUFDQTtBQUFEQSxDQUFDQSxJQUFBO0FBQUEiLCJmaWxlIjoidXRpbHMvUmVxdWVzdEFuaW1hdGlvbkZyYW1lVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZXF1ZXN0QW5pbWF0aW9uRnJhbWVcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi91dGlscy9SZXF1ZXN0QW5pbWF0aW9uRnJhbWVcIik7XG5cbmNsYXNzIFJlcXVlc3RBbmltYXRpb25GcmFtZVRlc3Rcbntcblx0cHJpdmF0ZSByZXF1ZXN0QW5pbWF0aW9uRnJhbWVUaW1lcjpSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVUaW1lciA9IG5ldyBSZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy50aWNrLCB0aGlzKTtcblx0XHR0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZVRpbWVyLnN0YXJ0KClcblxuXHRcdGRvY3VtZW50Lm9ubW91c2Vkb3duID0gKGV2ZW50OkV2ZW50KSA9PiB0aGlzLm9uTW91c2VEb3duKGV2ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgb25Nb3VzZURvd24oZXZlbnQ6RXZlbnQpXG5cdHtcblx0XHRjb25zb2xlLmxvZygnbW91c2VEb3duJyk7XG5cblx0XHRpZiAodGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVUaW1lci5hY3RpdmUpXG5cdFx0XHR0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZVRpbWVyLnN0b3AoKTtcblx0XHRlbHNlXG5cdFx0XHR0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZVRpbWVyLnN0YXJ0KCk7XG5cdH1cblxuXHRwcml2YXRlIHRpY2soZHQ6bnVtYmVyKVxuXHR7XG5cdFx0Y29uc29sZS5sb2coJ3RpY2snKTtcblx0fVxufSJdfQ== \ No newline at end of file diff --git a/tests/utils/RequestAnimationFrameTest.ts b/tests/utils/RequestAnimationFrameTest.ts index 0378e393..b73314dd 100644 --- a/tests/utils/RequestAnimationFrameTest.ts +++ b/tests/utils/RequestAnimationFrameTest.ts @@ -1,51 +1,29 @@ -/// - -module tests.utils{ - - export class RequestAnimationFrameTest - { - - private requestAnimationFrameTimer : away.utils.RequestAnimationFrame; - - - constructor() - { - - this.requestAnimationFrameTimer = new away.utils.RequestAnimationFrame( this.tick , this ); - this.requestAnimationFrameTimer.start() - - document.onmousedown = ( e ) => this.onMouseDown( e ); - - } - - private onMouseDown( e ) - { - - console.log( 'mouseDown'); - - if ( this.requestAnimationFrameTimer.active ) - { - - this.requestAnimationFrameTimer.stop(); - - } - else - { - - this.requestAnimationFrameTimer.start(); - - } - - } - - private tick( dt : number ) - { - - console.log( 'tick' ); - - } - - - } - +import RequestAnimationFrame = require("awayjs-core/lib/utils/RequestAnimationFrame"); + +class RequestAnimationFrameTest +{ + private requestAnimationFrameTimer:RequestAnimationFrame; + + constructor() + { + this.requestAnimationFrameTimer = new RequestAnimationFrame(this.tick, this); + this.requestAnimationFrameTimer.start() + + document.onmousedown = (event:Event) => this.onMouseDown(event); + } + + private onMouseDown(event:Event) + { + console.log('mouseDown'); + + if (this.requestAnimationFrameTimer.active) + this.requestAnimationFrameTimer.stop(); + else + this.requestAnimationFrameTimer.start(); + } + + private tick(dt:number) + { + console.log('tick'); + } } \ No newline at end of file diff --git a/tests/utils/TimerTest.js b/tests/utils/TimerTest.js new file mode 100755 index 00000000..658d4488 --- /dev/null +++ b/tests/utils/TimerTest.js @@ -0,0 +1,43 @@ +var TimerEvent = require("awayjs-core/lib/events/TimerEvent"); +var getTimer = require("awayjs-core/lib/utils/getTimer"); +var Timer = require("awayjs-core/lib/utils/Timer"); + +/** +* +*/ +var TimerTest = (function () { + function TimerTest() { + var _this = this; + this.oneSecondTimer = new Timer(1000); + this.oneSecondTimer.addEventListener(TimerEvent.TIMER, function (event) { + return _this.onSecTimerEvent(event); + }); + this.oneSecondTimer.start(); + + this.repeatTenTimes = new Timer(100, 10); + this.repeatTenTimes.addEventListener(TimerEvent.TIMER, function (event) { + return _this.repeatTenTimesEvent(event); + }); + this.repeatTenTimes.addEventListener(TimerEvent.TIMER_COMPLETE, function (event) { + return _this.repeatTenTimesComplete(event); + }); + this.repeatTenTimes.start(); + } + TimerTest.prototype.repeatTenTimesEvent = function (event) { + var t = event.target; + console.log('repeatTenTimesEvent', t.currentCount); + }; + + TimerTest.prototype.repeatTenTimesComplete = function (event) { + var t = event.target; + console.log('repeatTenTimesComplete', t.currentCount); + }; + + TimerTest.prototype.onSecTimerEvent = function (event) { + console.log('onSecTimerEvent, tick'); + console.log('getTimer() : ', getTimer()); + }; + return TimerTest; +})(); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInV0aWxzL1RpbWVyVGVzdC50cyJdLCJuYW1lcyI6WyJUaW1lclRlc3QiLCJUaW1lclRlc3QuY29uc3RydWN0b3IiLCJUaW1lclRlc3QucmVwZWF0VGVuVGltZXNFdmVudCIsIlRpbWVyVGVzdC5yZXBlYXRUZW5UaW1lc0NvbXBsZXRlIiwiVGltZXJUZXN0Lm9uU2VjVGltZXJFdmVudCJdLCJtYXBwaW5ncyI6IkFBQUEsNkRBQW9FO0FBQ3BFLHdEQUFnRTtBQUNoRSxrREFBMEQ7O0FBRTFEOztFQUVHO0FBQ0g7SUFLQ0E7UUFBQUMsaUJBVUNBO1FBUkFBLElBQUlBLENBQUNBLGNBQWNBLEdBQUdBLElBQUlBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBO1FBQ3JDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLEVBQUVBLFVBQUNBLEtBQWdCQTttQkFBS0EsS0FBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBM0JBLENBQTJCQSxDQUFDQTtRQUN6R0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7O1FBRTNCQSxJQUFJQSxDQUFDQSxjQUFjQSxHQUFHQSxJQUFJQSxLQUFLQSxDQUFDQSxHQUFHQSxFQUFFQSxFQUFFQSxDQUFDQTtRQUN4Q0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxFQUFFQSxVQUFDQSxLQUFnQkE7bUJBQUtBLEtBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBL0JBLENBQStCQSxDQUFDQTtRQUM3R0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxVQUFVQSxDQUFDQSxjQUFjQSxFQUFFQSxVQUFDQSxLQUFnQkE7bUJBQUtBLEtBQUlBLENBQUNBLHNCQUFzQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7UUFBbENBLENBQWtDQSxDQUFDQTtRQUN6SEEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7SUFDNUJBLENBQUNBO0lBRURELDBDQUFBQSxVQUE0QkEsS0FBZ0JBO1FBRTNDRSxJQUFJQSxDQUFDQSxHQUFpQkEsS0FBS0EsQ0FBQ0EsTUFBTUE7UUFDbENBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLHFCQUFxQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsWUFBWUEsQ0FBQ0E7SUFDbkRBLENBQUNBOztJQUVERiw2Q0FBQUEsVUFBK0JBLEtBQWdCQTtRQUU5Q0csSUFBSUEsQ0FBQ0EsR0FBaUJBLEtBQUtBLENBQUNBLE1BQU1BO1FBQ2xDQSxPQUFPQSxDQUFDQSxHQUFHQSxDQUFDQSx3QkFBd0JBLEVBQUVBLENBQUNBLENBQUNBLFlBQVlBLENBQUNBO0lBQ3REQSxDQUFDQTs7SUFFREgsc0NBQUFBLFVBQXdCQSxLQUFnQkE7UUFFdkNJLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLHVCQUF1QkEsQ0FBQ0E7UUFDcENBLE9BQU9BLENBQUNBLEdBQUdBLENBQUNBLGVBQWVBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO0lBQ3pDQSxDQUFDQTtJQUNGSixpQkFBQ0E7QUFBREEsQ0FBQ0EsSUFBQTtBQUFBIiwiZmlsZSI6InV0aWxzL1RpbWVyVGVzdC5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvcm9iYmF0ZW1hbi9XZWJzdG9ybVByb2plY3RzL2F3YXlqcy1jb3JlLyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBUaW1lckV2ZW50XHRcdFx0XHQ9IHJlcXVpcmUoXCJhd2F5anMtY29yZS9saWIvZXZlbnRzL1RpbWVyRXZlbnRcIik7XG5pbXBvcnQgZ2V0VGltZXJcdFx0XHRcdFx0PSByZXF1aXJlKFwiYXdheWpzLWNvcmUvbGliL3V0aWxzL2dldFRpbWVyXCIpO1xuaW1wb3J0IFRpbWVyXHRcdFx0XHRcdD0gcmVxdWlyZShcImF3YXlqcy1jb3JlL2xpYi91dGlscy9UaW1lclwiKTtcblxuLyoqXG4gKiBcbiAqL1xuY2xhc3MgVGltZXJUZXN0XG57XG5cdHByaXZhdGUgb25lU2Vjb25kVGltZXI6VGltZXI7XG5cdHByaXZhdGUgcmVwZWF0VGVuVGltZXM6VGltZXI7XG5cblx0Y29uc3RydWN0b3IoKVxuXHR7XG5cdFx0dGhpcy5vbmVTZWNvbmRUaW1lciA9IG5ldyBUaW1lcigxMDAwKTtcblx0XHR0aGlzLm9uZVNlY29uZFRpbWVyLmFkZEV2ZW50TGlzdGVuZXIoVGltZXJFdmVudC5USU1FUiwgKGV2ZW50OlRpbWVyRXZlbnQpID0+IHRoaXMub25TZWNUaW1lckV2ZW50KGV2ZW50KSk7XG5cdFx0dGhpcy5vbmVTZWNvbmRUaW1lci5zdGFydCgpO1xuXG5cdFx0dGhpcy5yZXBlYXRUZW5UaW1lcyA9IG5ldyBUaW1lcigxMDAsIDEwKTtcblx0XHR0aGlzLnJlcGVhdFRlblRpbWVzLmFkZEV2ZW50TGlzdGVuZXIoVGltZXJFdmVudC5USU1FUiwgKGV2ZW50OlRpbWVyRXZlbnQpID0+IHRoaXMucmVwZWF0VGVuVGltZXNFdmVudChldmVudCkpO1xuXHRcdHRoaXMucmVwZWF0VGVuVGltZXMuYWRkRXZlbnRMaXN0ZW5lcihUaW1lckV2ZW50LlRJTUVSX0NPTVBMRVRFLCAoZXZlbnQ6VGltZXJFdmVudCkgPT4gdGhpcy5yZXBlYXRUZW5UaW1lc0NvbXBsZXRlKGV2ZW50KSk7XG5cdFx0dGhpcy5yZXBlYXRUZW5UaW1lcy5zdGFydCgpO1xuXHR9XG5cblx0cHJpdmF0ZSByZXBlYXRUZW5UaW1lc0V2ZW50KGV2ZW50OlRpbWVyRXZlbnQpOnZvaWRcblx0e1xuXHRcdHZhciB0OlRpbWVyID0gPFRpbWVyPiBldmVudC50YXJnZXQ7XG5cdFx0Y29uc29sZS5sb2coJ3JlcGVhdFRlblRpbWVzRXZlbnQnLCB0LmN1cnJlbnRDb3VudCk7XG5cdH1cblxuXHRwcml2YXRlIHJlcGVhdFRlblRpbWVzQ29tcGxldGUoZXZlbnQ6VGltZXJFdmVudCk6dm9pZFxuXHR7XG5cdFx0dmFyIHQ6VGltZXIgPSA8VGltZXI+IGV2ZW50LnRhcmdldDtcblx0XHRjb25zb2xlLmxvZygncmVwZWF0VGVuVGltZXNDb21wbGV0ZScsIHQuY3VycmVudENvdW50KTtcblx0fVxuXG5cdHByaXZhdGUgb25TZWNUaW1lckV2ZW50KGV2ZW50OlRpbWVyRXZlbnQpOnZvaWRcblx0e1xuXHRcdGNvbnNvbGUubG9nKCdvblNlY1RpbWVyRXZlbnQsIHRpY2snKTtcblx0XHRjb25zb2xlLmxvZygnZ2V0VGltZXIoKSA6ICcsIGdldFRpbWVyKCkpO1xuXHR9XG59Il19 \ No newline at end of file diff --git a/tests/utils/TimerTest.ts b/tests/utils/TimerTest.ts index a01d2cbb..69b22902 100644 --- a/tests/utils/TimerTest.ts +++ b/tests/utils/TimerTest.ts @@ -1,55 +1,42 @@ -/// - -module tests.utils +import TimerEvent = require("awayjs-core/lib/events/TimerEvent"); +import getTimer = require("awayjs-core/lib/utils/getTimer"); +import Timer = require("awayjs-core/lib/utils/Timer"); + +/** + * + */ +class TimerTest { - - import Delegate = away.utils.Delegate; - - export class TimerTest - { - - private oneSecondTimer : away.utils.Timer; - private repeatTenTimes : away.utils.Timer; - - constructor() - { - - this.oneSecondTimer = new away.utils.Timer( 1000 ); - this.oneSecondTimer.addEventListener(away.events.TimerEvent.TIMER , Delegate.create(this, this.onSecTimerEvent) ); - this.oneSecondTimer.start(); - - this.repeatTenTimes = new away.utils.Timer( 100 , 10 ); - this.repeatTenTimes.addEventListener(away.events.TimerEvent.TIMER , Delegate.create(this, this.repeatTenTimesEvent) ); - this.repeatTenTimes.addEventListener(away.events.TimerEvent.TIMER_COMPLETE, Delegate.create(this, this.repeatTenTimesComplete) ); - this.repeatTenTimes.start(); - - } - - private repeatTenTimesEvent( e : away.events.TimerEvent ) : void - { - - - var t : away.utils.Timer = e.target; - console.log('repeatTenTimesEvent' , t.currentCount ); - - } - - private repeatTenTimesComplete( e : away.events.TimerEvent ) : void - { - - var t : away.utils.Timer = e.target; - console.log('repeatTenTimesComplete' , t.currentCount ); - - } - - private onSecTimerEvent( e : away.events.TimerEvent ) : void - { - - console.log('onSecTimerEvent, tick'); - console.log( 'getTimer() : ' , away.utils.getTimer() ); - - } - - } - + private oneSecondTimer:Timer; + private repeatTenTimes:Timer; + + constructor() + { + this.oneSecondTimer = new Timer(1000); + this.oneSecondTimer.addEventListener(TimerEvent.TIMER, (event:TimerEvent) => this.onSecTimerEvent(event)); + this.oneSecondTimer.start(); + + this.repeatTenTimes = new Timer(100, 10); + this.repeatTenTimes.addEventListener(TimerEvent.TIMER, (event:TimerEvent) => this.repeatTenTimesEvent(event)); + this.repeatTenTimes.addEventListener(TimerEvent.TIMER_COMPLETE, (event:TimerEvent) => this.repeatTenTimesComplete(event)); + this.repeatTenTimes.start(); + } + + private repeatTenTimesEvent(event:TimerEvent):void + { + var t:Timer = event.target; + console.log('repeatTenTimesEvent', t.currentCount); + } + + private repeatTenTimesComplete(event:TimerEvent):void + { + var t:Timer = event.target; + console.log('repeatTenTimesComplete', t.currentCount); + } + + private onSecTimerEvent(event:TimerEvent):void + { + console.log('onSecTimerEvent, tick'); + console.log('getTimer() : ', getTimer()); + } } \ No newline at end of file